From 85aef66e35b678600177da15096cf813ecb54f48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabrice=20PENHO=C3=8BT?= Date: Fri, 7 Aug 2020 12:23:59 +0200 Subject: [PATCH] Initial commit for publishing on gitlab --- .gitignore | 26 + .sequelizerc | 5 + app.js | 107 + config/database.js | 29 + config/illustrations.js | 18 + config/instance-demo.js | 63 + config/instance-example.js | 65 + config/instance-prod.js | 63 + config/links.js | 11 + config/log4js.js | 20 + config/mail.js | 20 + config/main.js | 16 + config/questionnaires.js | 56 + config/tags.js | 11 + config/users.js | 36 + controllers/answer.js | 273 + controllers/choice.js | 142 + controllers/illustration.js | 237 + controllers/link.js | 144 + controllers/pause.js | 129 + controllers/payment.js | 132 + controllers/question.js | 179 + controllers/questionnaire.js | 728 + controllers/subscription.js | 391 + controllers/tag.js | 321 + controllers/user.js | 1184 ++ example.env | 27 + front/package-lock.json | 6672 +++++++++ front/package.json | 31 + front/public/.htaccess | 50 + front/public/404.html | 56 + front/public/JS/accountUser.app.js | 1463 ++ front/public/JS/connection.app.js | 1294 ++ front/public/JS/deconnection.app.js | 1113 ++ front/public/JS/deleteValidation.app.js | 1168 ++ front/public/JS/homeManager.app.js | 1278 ++ front/public/JS/homeUser.app.js | 1518 +++ front/public/JS/index.app.js | 864 ++ front/public/JS/loginLink.app.js | 1210 ++ front/public/JS/loginlink.app.js | 872 ++ front/public/JS/manageQuestionnaires.app.js | 2070 +++ front/public/JS/manageUsers.app.js | 1608 +++ front/public/JS/newLoginValidation.app.js | 1174 ++ front/public/JS/polyfill.app.js | 11169 ++++++++++++++++ front/public/JS/questionnaire.app.js | 1458 ++ front/public/JS/quiz.app.js | 1104 ++ front/public/JS/subscribe.app.js | 1328 ++ front/public/JS/subscribeValidation.app.js | 1186 ++ front/public/JS/unsubscribe.app.js | 1235 ++ front/public/JS/validation.app.js | 868 ++ front/public/a-propos.html | 138 + front/public/accueil.html | 79 + front/public/aurevoir.html | 46 + front/public/compte.html | 168 + front/public/connexion.html | 85 + front/public/contact.html | 53 + front/public/credits.html | 59 + front/public/donnees.html | 101 + front/public/gestion-quizs.html | 261 + front/public/gestion-utilisateurs.html | 206 + front/public/gestion.html | 78 + front/public/img/404-notfound.png | Bin 0 -> 189680 bytes front/public/img/android-icon-192x192.png | Bin 0 -> 50360 bytes front/public/img/apple-icon-57x57.png | Bin 0 -> 4904 bytes front/public/img/favicon-32x32.png | Bin 0 -> 1935 bytes front/public/img/favicon.ico | Bin 0 -> 1150 bytes front/public/inscription.html | 94 + front/public/login.html | 45 + front/public/newlogin.html | 45 + front/public/robots.txt | 2 + front/public/sortie.html | 46 + front/public/stop-mail.html | 45 + front/public/themes/default/404.html | 80 + .../default/CSS/grids-responsive-min.css | 7 + front/public/themes/default/CSS/layout.css | 286 + front/public/themes/default/CSS/pure-min.css | 11 + front/public/themes/default/CSS/wikilerni.css | 352 + front/public/themes/default/a-propos.html | 161 + front/public/themes/default/accueil.html | 100 + front/public/themes/default/aurevoir.html | 79 + front/public/themes/default/compte.html | 176 + front/public/themes/default/connexion.html | 108 + .../public/themes/default/gestion-quizs.html | 266 + .../themes/default/gestion-utilisateurs.html | 211 + front/public/themes/default/gestion.html | 83 + front/public/themes/default/index.html | 1 + front/public/themes/default/inscription.html | 115 + front/public/themes/default/login.html | 79 + front/public/themes/default/newlogin.html | 79 + front/public/themes/default/sortie.html | 78 + front/public/themes/default/stop-mail.html | 78 + front/public/themes/default/validation.html | 79 + .../themes/wikilerni/css/account-mobile.css | 67 + front/public/themes/wikilerni/css/account.css | 49 + .../themes/wikilerni/css/common-mobile.css | 308 + front/public/themes/wikilerni/css/common.css | 247 + .../themes/wikilerni/css/home-mobile.css | 160 + front/public/themes/wikilerni/css/home.css | 131 + .../wikilerni/css/links-page-mobile.css | 28 + .../themes/wikilerni/css/links-page.css | 27 + .../themes/wikilerni/css/list-mobile.css | 176 + front/public/themes/wikilerni/css/list.css | 152 + .../themes/wikilerni/css/login-mobile.css | 87 + front/public/themes/wikilerni/css/login.css | 71 + .../themes/wikilerni/css/menu-mobile.css | 30 + front/public/themes/wikilerni/css/menu.css | 18 + .../themes/wikilerni/css/pages-mobile.css | 89 + front/public/themes/wikilerni/css/pages.css | 62 + .../themes/wikilerni/css/quiz-mobile.css | 180 + front/public/themes/wikilerni/css/quiz.css | 209 + .../themes/wikilerni/css/signup-mobile.css | 84 + front/public/themes/wikilerni/css/signup.css | 69 + .../wikilerni/img/background-texture.png | Bin 0 -> 202055 bytes .../themes/wikilerni/img/correct-min.png | Bin 0 -> 340 bytes .../public/themes/wikilerni/img/diaspora.png | Bin 0 -> 1645 bytes .../public/themes/wikilerni/img/facebook.png | Bin 0 -> 2106 bytes .../public/themes/wikilerni/img/linkedin.png | Bin 0 -> 2181 bytes .../public/themes/wikilerni/img/pinterest.png | Bin 0 -> 922 bytes .../themes/wikilerni/img/time-required-3.png | Bin 0 -> 1442 bytes .../wikilerni/img/time-required-long.png | Bin 0 -> 1480 bytes .../wikilerni/img/time-required-medium.png | Bin 0 -> 1389 bytes .../wikilerni/img/time-required-short.png | Bin 0 -> 1037 bytes front/public/themes/wikilerni/img/twitter.png | Bin 0 -> 2346 bytes .../wikilerni/img/wikilerni-purple-2-128.png | Bin 0 -> 7404 bytes .../wikilerni/img/wikilerni-purple-2-512.png | Bin 0 -> 95120 bytes .../public/themes/wikilerni/img/wrong-min.png | Bin 0 -> 928 bytes .../webfonts/Bold/Millimetre-Bold_web.woff | Bin 0 -> 40903 bytes .../webfonts/Light/Millimetre-Light_web.woff | Bin 0 -> 34600 bytes .../Regular/Millimetre-Regular_web.eot | Bin 0 -> 88328 bytes .../Regular/Millimetre-Regular_web.otf | Bin 0 -> 81148 bytes .../Regular/Millimetre-Regular_web.ttf | Bin 0 -> 88068 bytes .../Regular/Millimetre-Regular_web.woff | Bin 0 -> 40791 bytes .../Regular/Millimetre-Regular_web.woff2 | Bin 0 -> 31984 bytes front/public/validation.html | 45 + front/src/accountUser.js | 261 + front/src/config/general.js | 18 + front/src/connection.js | 148 + front/src/deconnection.js | 44 + front/src/deleteValidation.js | 74 + front/src/homeManager.js | 147 + front/src/homeUser.js | 236 + front/src/index.js | 64 + front/src/loginLink.js | 99 + front/src/manageQuestionnaires.js | 706 + front/src/manageUsers.js | 370 + front/src/newLoginValidation.js | 75 + front/src/questionnaire.js | 244 + front/src/subscribe.js | 183 + front/src/subscribeValidation.js | 81 + front/src/tools/answers.js | 91 + front/src/tools/clientstorage.js | 20 + front/src/tools/dom.js | 34 + front/src/tools/everywhere.js | 14 + front/src/tools/forms.js | 51 + front/src/tools/url.js | 21 + front/src/tools/users.js | 170 + front/src/tools/webportage.js | 41 + front/src/unsubscribe.js | 63 + front/webpack.config.js | 51 + front/webpack.config_prod.js | 51 + lang/fr/answer.js | 26 + lang/fr/choice.js | 10 + lang/fr/general.js | 30 + lang/fr/illustration.js | 19 + lang/fr/link.js | 17 + lang/fr/pause.js | 13 + lang/fr/payment.js | 21 + lang/fr/question.js | 14 + lang/fr/questionnaire.js | 40 + lang/fr/questionnaireaccess.js | 5 + lang/fr/subscription.js | 34 + lang/fr/tag.js | 11 + lang/fr/user.js | 85 + lang/fr/userdeleted.js | 7 + middleware/auth.js | 37 + middleware/authAdmin.js | 37 + middleware/cronAuth.js | 29 + middleware/initialise.js | 18 + middleware/multer-config.js | 48 + models/Answer.js | 75 + models/Choice.js | 54 + models/Illustration.js | 84 + models/Link.js | 53 + models/Pause.js | 62 + models/Payment.js | 59 + models/Question.js | 60 + models/Questionnaire.js | 136 + models/QuestionnaireAccess.js | 22 + models/QuestionnaireClassification.js | 16 + models/Subscription.js | 78 + models/Tag.js | 65 + models/User.js | 165 + models/UserDeleted.js | 64 + models/index.js | 40 + models/wikilerni-crea.sql | 499 + package-lock.json | 3610 +++++ package.json | 44 + robots.txt | 2 + routes/choice.js | 11 + routes/cron.js | 35 + routes/illustration.js | 14 + routes/link.js | 13 + routes/pause.js | 12 + routes/payment.js | 12 + routes/question.js | 12 + routes/questionnaire.js | 30 + routes/tag.js | 14 + routes/user.js | 37 + server.js | 48 + tools/error.js | 18 + tools/file.js | 162 + tools/mail.js | 48 + tools/main.js | 81 + views/default/config/fr.js | 40 + views/default/home.pug | 46 + .../includes/listing-questionnaires.pug | 20 + views/default/layout.pug | 48 + views/default/newQuestionnaires.pug | 25 + views/default/quiz.pug | 91 + views/default/tag.pug | 29 + views/wikilerni/config/fr.js | 53 + views/wikilerni/home.pug | 30 + .../includes/listing-questionnaires.pug | 49 + views/wikilerni/layout.pug | 47 + views/wikilerni/mail.pug | 173 + views/wikilerni/newQuestionnaires.pug | 27 + views/wikilerni/quiz.pug | 105 + views/wikilerni/tag.pug | 30 + 228 files changed, 61897 insertions(+) create mode 100644 .gitignore create mode 100644 .sequelizerc create mode 100644 app.js create mode 100644 config/database.js create mode 100644 config/illustrations.js create mode 100644 config/instance-demo.js create mode 100644 config/instance-example.js create mode 100644 config/instance-prod.js create mode 100644 config/links.js create mode 100644 config/log4js.js create mode 100644 config/mail.js create mode 100644 config/main.js create mode 100644 config/questionnaires.js create mode 100644 config/tags.js create mode 100644 config/users.js create mode 100644 controllers/answer.js create mode 100644 controllers/choice.js create mode 100644 controllers/illustration.js create mode 100644 controllers/link.js create mode 100644 controllers/pause.js create mode 100644 controllers/payment.js create mode 100644 controllers/question.js create mode 100644 controllers/questionnaire.js create mode 100644 controllers/subscription.js create mode 100644 controllers/tag.js create mode 100644 controllers/user.js create mode 100644 example.env create mode 100644 front/package-lock.json create mode 100644 front/package.json create mode 100644 front/public/.htaccess create mode 100644 front/public/404.html create mode 100644 front/public/JS/accountUser.app.js create mode 100644 front/public/JS/connection.app.js create mode 100644 front/public/JS/deconnection.app.js create mode 100644 front/public/JS/deleteValidation.app.js create mode 100644 front/public/JS/homeManager.app.js create mode 100644 front/public/JS/homeUser.app.js create mode 100644 front/public/JS/index.app.js create mode 100644 front/public/JS/loginLink.app.js create mode 100644 front/public/JS/loginlink.app.js create mode 100644 front/public/JS/manageQuestionnaires.app.js create mode 100644 front/public/JS/manageUsers.app.js create mode 100644 front/public/JS/newLoginValidation.app.js create mode 100644 front/public/JS/polyfill.app.js create mode 100644 front/public/JS/questionnaire.app.js create mode 100644 front/public/JS/quiz.app.js create mode 100644 front/public/JS/subscribe.app.js create mode 100644 front/public/JS/subscribeValidation.app.js create mode 100644 front/public/JS/unsubscribe.app.js create mode 100644 front/public/JS/validation.app.js create mode 100644 front/public/a-propos.html create mode 100644 front/public/accueil.html create mode 100644 front/public/aurevoir.html create mode 100644 front/public/compte.html create mode 100644 front/public/connexion.html create mode 100644 front/public/contact.html create mode 100644 front/public/credits.html create mode 100644 front/public/donnees.html create mode 100644 front/public/gestion-quizs.html create mode 100644 front/public/gestion-utilisateurs.html create mode 100644 front/public/gestion.html create mode 100644 front/public/img/404-notfound.png create mode 100644 front/public/img/android-icon-192x192.png create mode 100644 front/public/img/apple-icon-57x57.png create mode 100644 front/public/img/favicon-32x32.png create mode 100755 front/public/img/favicon.ico create mode 100644 front/public/inscription.html create mode 100644 front/public/login.html create mode 100644 front/public/newlogin.html create mode 100644 front/public/robots.txt create mode 100644 front/public/sortie.html create mode 100644 front/public/stop-mail.html create mode 100644 front/public/themes/default/404.html create mode 100644 front/public/themes/default/CSS/grids-responsive-min.css create mode 100644 front/public/themes/default/CSS/layout.css create mode 100644 front/public/themes/default/CSS/pure-min.css create mode 100644 front/public/themes/default/CSS/wikilerni.css create mode 100644 front/public/themes/default/a-propos.html create mode 100644 front/public/themes/default/accueil.html create mode 100644 front/public/themes/default/aurevoir.html create mode 100644 front/public/themes/default/compte.html create mode 100644 front/public/themes/default/connexion.html create mode 100644 front/public/themes/default/gestion-quizs.html create mode 100644 front/public/themes/default/gestion-utilisateurs.html create mode 100644 front/public/themes/default/gestion.html create mode 100644 front/public/themes/default/index.html create mode 100644 front/public/themes/default/inscription.html create mode 100644 front/public/themes/default/login.html create mode 100644 front/public/themes/default/newlogin.html create mode 100644 front/public/themes/default/sortie.html create mode 100644 front/public/themes/default/stop-mail.html create mode 100644 front/public/themes/default/validation.html create mode 100644 front/public/themes/wikilerni/css/account-mobile.css create mode 100644 front/public/themes/wikilerni/css/account.css create mode 100644 front/public/themes/wikilerni/css/common-mobile.css create mode 100644 front/public/themes/wikilerni/css/common.css create mode 100644 front/public/themes/wikilerni/css/home-mobile.css create mode 100644 front/public/themes/wikilerni/css/home.css create mode 100644 front/public/themes/wikilerni/css/links-page-mobile.css create mode 100644 front/public/themes/wikilerni/css/links-page.css create mode 100644 front/public/themes/wikilerni/css/list-mobile.css create mode 100644 front/public/themes/wikilerni/css/list.css create mode 100644 front/public/themes/wikilerni/css/login-mobile.css create mode 100644 front/public/themes/wikilerni/css/login.css create mode 100644 front/public/themes/wikilerni/css/menu-mobile.css create mode 100644 front/public/themes/wikilerni/css/menu.css create mode 100644 front/public/themes/wikilerni/css/pages-mobile.css create mode 100644 front/public/themes/wikilerni/css/pages.css create mode 100644 front/public/themes/wikilerni/css/quiz-mobile.css create mode 100644 front/public/themes/wikilerni/css/quiz.css create mode 100644 front/public/themes/wikilerni/css/signup-mobile.css create mode 100644 front/public/themes/wikilerni/css/signup.css create mode 100644 front/public/themes/wikilerni/img/background-texture.png create mode 100644 front/public/themes/wikilerni/img/correct-min.png create mode 100755 front/public/themes/wikilerni/img/diaspora.png create mode 100755 front/public/themes/wikilerni/img/facebook.png create mode 100755 front/public/themes/wikilerni/img/linkedin.png create mode 100755 front/public/themes/wikilerni/img/pinterest.png create mode 100644 front/public/themes/wikilerni/img/time-required-3.png create mode 100644 front/public/themes/wikilerni/img/time-required-long.png create mode 100644 front/public/themes/wikilerni/img/time-required-medium.png create mode 100644 front/public/themes/wikilerni/img/time-required-short.png create mode 100755 front/public/themes/wikilerni/img/twitter.png create mode 100644 front/public/themes/wikilerni/img/wikilerni-purple-2-128.png create mode 100644 front/public/themes/wikilerni/img/wikilerni-purple-2-512.png create mode 100644 front/public/themes/wikilerni/img/wrong-min.png create mode 100644 front/public/themes/wikilerni/webfonts/Bold/Millimetre-Bold_web.woff create mode 100644 front/public/themes/wikilerni/webfonts/Light/Millimetre-Light_web.woff create mode 100644 front/public/themes/wikilerni/webfonts/Regular/Millimetre-Regular_web.eot create mode 100644 front/public/themes/wikilerni/webfonts/Regular/Millimetre-Regular_web.otf create mode 100644 front/public/themes/wikilerni/webfonts/Regular/Millimetre-Regular_web.ttf create mode 100644 front/public/themes/wikilerni/webfonts/Regular/Millimetre-Regular_web.woff create mode 100644 front/public/themes/wikilerni/webfonts/Regular/Millimetre-Regular_web.woff2 create mode 100644 front/public/validation.html create mode 100644 front/src/accountUser.js create mode 100644 front/src/config/general.js create mode 100644 front/src/connection.js create mode 100644 front/src/deconnection.js create mode 100644 front/src/deleteValidation.js create mode 100644 front/src/homeManager.js create mode 100644 front/src/homeUser.js create mode 100644 front/src/index.js create mode 100644 front/src/loginLink.js create mode 100644 front/src/manageQuestionnaires.js create mode 100644 front/src/manageUsers.js create mode 100644 front/src/newLoginValidation.js create mode 100644 front/src/questionnaire.js create mode 100644 front/src/subscribe.js create mode 100644 front/src/subscribeValidation.js create mode 100644 front/src/tools/answers.js create mode 100644 front/src/tools/clientstorage.js create mode 100644 front/src/tools/dom.js create mode 100644 front/src/tools/everywhere.js create mode 100644 front/src/tools/forms.js create mode 100644 front/src/tools/url.js create mode 100644 front/src/tools/users.js create mode 100644 front/src/tools/webportage.js create mode 100644 front/src/unsubscribe.js create mode 100644 front/webpack.config.js create mode 100644 front/webpack.config_prod.js create mode 100644 lang/fr/answer.js create mode 100644 lang/fr/choice.js create mode 100644 lang/fr/general.js create mode 100644 lang/fr/illustration.js create mode 100644 lang/fr/link.js create mode 100644 lang/fr/pause.js create mode 100644 lang/fr/payment.js create mode 100644 lang/fr/question.js create mode 100644 lang/fr/questionnaire.js create mode 100644 lang/fr/questionnaireaccess.js create mode 100644 lang/fr/subscription.js create mode 100644 lang/fr/tag.js create mode 100644 lang/fr/user.js create mode 100644 lang/fr/userdeleted.js create mode 100644 middleware/auth.js create mode 100644 middleware/authAdmin.js create mode 100644 middleware/cronAuth.js create mode 100644 middleware/initialise.js create mode 100644 middleware/multer-config.js create mode 100644 models/Answer.js create mode 100644 models/Choice.js create mode 100644 models/Illustration.js create mode 100644 models/Link.js create mode 100644 models/Pause.js create mode 100644 models/Payment.js create mode 100644 models/Question.js create mode 100644 models/Questionnaire.js create mode 100644 models/QuestionnaireAccess.js create mode 100644 models/QuestionnaireClassification.js create mode 100644 models/Subscription.js create mode 100644 models/Tag.js create mode 100644 models/User.js create mode 100644 models/UserDeleted.js create mode 100644 models/index.js create mode 100644 models/wikilerni-crea.sql create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 robots.txt create mode 100644 routes/choice.js create mode 100644 routes/cron.js create mode 100644 routes/illustration.js create mode 100644 routes/link.js create mode 100644 routes/pause.js create mode 100644 routes/payment.js create mode 100644 routes/question.js create mode 100644 routes/questionnaire.js create mode 100644 routes/tag.js create mode 100644 routes/user.js create mode 100644 server.js create mode 100644 tools/error.js create mode 100644 tools/file.js create mode 100644 tools/mail.js create mode 100644 tools/main.js create mode 100644 views/default/config/fr.js create mode 100644 views/default/home.pug create mode 100644 views/default/includes/listing-questionnaires.pug create mode 100644 views/default/layout.pug create mode 100644 views/default/newQuestionnaires.pug create mode 100644 views/default/quiz.pug create mode 100644 views/default/tag.pug create mode 100644 views/wikilerni/config/fr.js create mode 100644 views/wikilerni/home.pug create mode 100644 views/wikilerni/includes/listing-questionnaires.pug create mode 100644 views/wikilerni/layout.pug create mode 100644 views/wikilerni/mail.pug create mode 100644 views/wikilerni/newQuestionnaires.pug create mode 100644 views/wikilerni/quiz.pug create mode 100644 views/wikilerni/tag.pug diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d1460a1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,26 @@ +# BACKEND : + +datas/ +logs/ +temp/ +node_modules/ +nodemon.json +*.env +!example.env +/config/instance.* +!/config/instance-example.js + +# FRONT END : + +/front/node_modules/ +/front/webpack.config-*.js +!/front/webpack.config.js +/front/public/img/quizs/ +/front/public/JS/*/ +/front/public/quiz/ +/front/public/quizs/ +/front/public/index.html +/front/public/CGV-CGU.html +/front/public/mentions-legales.html +/front/public/robots-*.txt +/front/public/WikiLerni-pub.asc \ No newline at end of file diff --git a/.sequelizerc b/.sequelizerc new file mode 100644 index 0000000..0ce8197 --- /dev/null +++ b/.sequelizerc @@ -0,0 +1,5 @@ +const path = require('path'); + +module.exports = { + 'config': path.resolve('config', 'database.js') +}; \ No newline at end of file diff --git a/app.js b/app.js new file mode 100644 index 0000000..87c294c --- /dev/null +++ b/app.js @@ -0,0 +1,107 @@ +require("dotenv").config(); + +const express = require("express"); +const bodyParser = require("body-parser"); +const path = require("path"); +const log4js = require("log4js"); + +const timeInitialise = require("./middleware/initialise"); +const cronRoutes = require("./routes/cron"); +const userRoutes = require("./routes/user"); +const userPausesRoutes = require("./routes/pause"); +const userPaymentsRoutes = require("./routes/payment"); +const questionnairesRoutes = require("./routes/questionnaire"); +const questionsRoutes = require("./routes/question"); +const choicesRoutes = require("./routes/choice"); +const illustrationRoutes = require("./routes/illustration"); +const linkRoutes = require("./routes/link"); +const tagRoutes = require("./routes/tag"); + +const config = require("./config/main"); +const confLog4js=require("./config/log4js"); +const txt = require("./lang/"+config.adminLang+"/general"); +const tool = require("./tools/main"); + +const app = express(); + +app.use(timeInitialise); +app.use((req, res, next) => +{ + res.setHeader("Access-Control-Allow-Origin", "*"); + res.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content, Accept, Content-Type, Authorization"); + res.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE"); + next(); +}); + +//app.use(express.static(path.join(__dirname, "front/public"))); +app.use(bodyParser.json()); +app.use("/api/user", userRoutes); +app.use("/api/pause", userPausesRoutes); +app.use("/api/payment", userPaymentsRoutes); +app.use("/api/questionnaire", questionnairesRoutes); +app.use("/api/questionnaire", tagRoutes); +app.use("/api/question", questionsRoutes); +app.use("/api/question", choicesRoutes); +app.use("/api/illustration", illustrationRoutes); +app.use("/api/link", linkRoutes); +app.use("/api/cron", cronRoutes); + +// Évalue de la durée de la réponse (!= durée script, car fonctions asynchrones continuent). Mettre next() après réponse des contrôleurs... à contrôler ! +// Capture aussi les url inconnues en retournant une erreur 404. +// Je peux aussi recevoir des messages à afficher dans les logs venant des "cron". +app.use((req, res, next) => +{ + try + { + if(res.headersSent) + { + log4js.configure(confLog4js);// ici, car pas pris en compte si je le fais avant le middleware (?). + const myLogs = log4js.getLogger(config.env); + let timeEnd=Date.now(), maxTime=config.responseTimingAlertInSeconde; + if(req.url.startsWith("/api/cron")) + maxTime=config.cronTimingAlertInSeconde; + const mapMessage = + { + SCRIPT_TIMING: timeEnd-req.timeBegin, + SCRIPT_URL: req.url + }; + if(config.env === "development") + { + myLogs.info(tool.replaceAll(txt.scriptTimingInfo, mapMessage)); + if(res.alerte) + myLogs.warn(res.alerte); + } + else if((timeEnd-req.timeBegin) > maxTime*1000) + { + myLogs.warn(tool.replaceAll(txt.scriptTimingAlert, mapMessage)); + if(res.message) + myLogs.info(res.message); + } + next(); + } + else + { + const err = new Error(txt.badUrl); + err.status=404; + next(err); + } + } + catch(e) + { + next(e); + } +}); + +// Capture et traitement des erreurs +app.use((err, req, res, next) => +{ + const status = (err.status) ? err.status : 500; + if(!res.headersSent) + res.status(status).json({ errors: txt.serverError }); + log4js.configure(confLog4js);// même remarque que + haut + const myLogs = log4js.getLogger(config.env); + myLogs.error(txt.serverErrorAdmin, { message : err.message, url: req.url }); +}); +log4js.shutdown(); + +module.exports = app; \ No newline at end of file diff --git a/config/database.js b/config/database.js new file mode 100644 index 0000000..bd37ca0 --- /dev/null +++ b/config/database.js @@ -0,0 +1,29 @@ +require('dotenv').config(); + +module.exports = +{ + "development": + { + "username": process.env.DB_USER, + "password": process.env.DB_PASS, + "database": process.env.DB_NAME, + "host": process.env.DB_HOST, + "dialect": "mysql" + }, + "test": + { + "username": process.env.DB_USER, + "password": process.env.DB_PASS, + "database": process.env.DB_NAME, + "host": process.env.DB_HOST, + "dialect": "mysql" + }, + "production": + { + "username": process.env.DB_USER, + "password": process.env.DB_PASS, + "database": process.env.DB_NAME, + "host": process.env.DB_HOST, + "dialect": "mysql" + } +}; \ No newline at end of file diff --git a/config/illustrations.js b/config/illustrations.js new file mode 100644 index 0000000..4e0cdac --- /dev/null +++ b/config/illustrations.js @@ -0,0 +1,18 @@ +const instance = require("./instance"); + +module.exports = +{ + // API'routes (after "apiUrl" defined in instance.js) + illustrationsRoute: "/illustration/", + // forms : à compléter avec valeurs par défaut, etc. cf modèle + Illustration : + { + alt: { maxlength: 255 }, + title: { maxlength: 255 }, + caption: { maxlength: 255 }, + image: { required: true, accept: instance.mimeTypesForIllustration.join(",") } + }, + // files upload tempory dir + dirIllustrationsTmp : "temp", + dirIllustrations: "front/public/img/quizs" +}; \ No newline at end of file diff --git a/config/instance-demo.js b/config/instance-demo.js new file mode 100644 index 0000000..bd45146 --- /dev/null +++ b/config/instance-demo.js @@ -0,0 +1,63 @@ +const users = require("./users"); +const questionnaires = require("./questionnaires"); + +module.exports = +{ + apiUrl: "https://apitest.wikilerni.com/api", + siteUrl: "https://test.wikilerni.com", + adminName: "Fabrice", + adminEmail: "dev@wikilerni.com", + senderName: "WikiLerni (démo)", + senderEmail: "bonjour@wikilerni.com", + adminLang: "fr", + theme: "wikilerni", // le thème utilisé (dans /views) pour générer les pages HTML. Contient ses propres fichiers de configuration. + availableLangs: ["fr"],// Languages in which the site is available. The first one is the default one. + siteName: "WikiLerni (démo)", + beginCodeGodfather: "WL", // case-sensitive and can't contain "@" ! + cronTimingAlertInSeconde: 120, // for logs + responseTimingAlertInSeconde: 3, // idem + tokenSignupValidationTimeInHours: "48h", // https://github.com/zeit/ms + tokenLoginLinkTimeInHours: "1h", + tokenConnexionMinTimeInHours: "24h", + tokenConnexionMaxTimeInDays: "180 days", + tokenLoginChangingTimeInHours: "1h",// for email & password changing + tokenDeleteUserTimeInHours: "1h", + tokenUnsubscribeLinkTimeInDays: "7 days", // token send with subscription's emails + freeAccountTimingInDays: 15, + freeAccountExpirationNotificationInDays: 2, + accountExpirationFirstNotificationInDays: 15, + accountExpirationSecondNotificationInDays: 3, + inactiveAccountTimeToDeleteInDays: 180, + // Questionnaires: + nbQuestionsMin: 1, // minimum number of questions for the questionnaire to be publishable + nbQuestionsMax: 0, // if 0 = not maximum + nbChoicesMax: 10, + nbNewQuestionnaires: 10,// for RSS, etc. + hourGiveNewQuestionnaireBegin: 3, // in user local time + hourGiveNewQuestionnaireEnd: 8, // idem + numberNewQuestionnaireAtSameTime: 50, // for mass mailing + minSearchQuestionnaires: 3, + // Illustrations: + nbIllustrationsMin: 0, + nbIllustrationsMax: 1, + maxIllustrationSizeinOctet: 1000000,// pas contrôlé pour l'instant. À revoir. + mimeTypesForIllustration: [ "image/jpg", "image/jpeg", "image/png", "image/gif", "image/png" ], + // -- Upload and resize: + illustrationsWidthMaxInPx: 400, + illustrationsMiniaturesWidthMaxInPx: 200, + // Links: + nbLinksMin: 1, + nbLinksMax: 1, + // à supprimer quand tous les "require" à jour: + nbQuestionsMin: questionnaires.nbQuestionsMin, + nbQuestionsMax: questionnaires.nbQuestionsMax, + nbChoicesMax: questionnaires.nbChoicesMax, + passwordMinLength: users.password.minlength, + dirCacheUsers: users.dirCacheUsers, + dirCacheUsersAnswers: users.dirCacheUsersAnswers, + dirCacheQuestionnaires: questionnaires.dirCacheQuestionnaires, + dirCacheQuestions: questionnaires.dirCacheQuestions, + dirCacheUsersQuestionnaires: questionnaires.dirCacheUsersQuestionnaires, + dirHTMLQuestionnaire: questionnaires.dirHTMLQuestionnaire, + dirWebQuestionnaire: questionnaires.dirWebQuestionnaire +}; \ No newline at end of file diff --git a/config/instance-example.js b/config/instance-example.js new file mode 100644 index 0000000..5441785 --- /dev/null +++ b/config/instance-example.js @@ -0,0 +1,65 @@ +/// À ADAPTER ET RENOMMER : instance.js. + +const users = require("./users"); +const questionnaires = require("./questionnaires"); + +module.exports = +{ + apiUrl: "https://...", + siteUrl: "https://...", + adminName: "bob", + adminEmail: "bob@example.tld", + senderName: "bob", + senderEmail: "bob@example.tld", + adminLang: "fr", + theme: "wikilerni", // le thème utilisé (dans /views) pour générer les pages HTML. Contient ses propres fichiers de configuration. + availableLangs: ["fr"],// Languages in which the site is available. The first one is the default one. + siteName: "WikiLerni", + beginCodeGodfather: "WL", // case-sensitive and can't contain "@" ! + cronTimingAlertInSeconde: 120, // for logs + responseTimingAlertInSeconde: 3, // idem + tokenSignupValidationTimeInHours: "48h", // see : https://github.com/zeit/ms + tokenLoginLinkTimeInHours: "1h", + tokenConnexionMinTimeInHours: "24h", + tokenConnexionMaxTimeInDays: "180 days", + tokenLoginChangingTimeInHours: "1h",// for email & password changing + tokenDeleteUserTimeInHours: "1h", + tokenUnsubscribeLinkTimeInDays: "7 days", // token send with subscription's emails + freeAccountTimingInDays: 15, + freeAccountExpirationNotificationInDays: 3, + accountExpirationFirstNotificationInDays: 10, + accountExpirationSecondNotificationInDays: 3, + inactiveAccountTimeToDeleteInDays: 180, + // Questionnaires: + nbQuestionsMin: 1, // minimum number of questions for the questionnaire to be publishable + nbQuestionsMax: 0, // if 0 = not maximum + nbChoicesMax: 10, + nbNewQuestionnaires: 10, // for RSS, etc. + hourGiveNewQuestionnaireBegin: 3, // in user local time + hourGiveNewQuestionnaireEnd: 8, // idem + numberNewQuestionnaireAtSameTime: 50, // for mass mailing sending new quiz + minSearchQuestionnaires: 3, + // Illustrations: + nbIllustrationsMin: 0, + nbIllustrationsMax: 1, + maxIllustrationSizeinOctet: 1000000,// Not checked yet. To be continued. + mimeTypesForIllustration: [ "image/jpg", "image/jpeg", "image/png", "image/gif", "image/png" ], + // -- Upload and resize: + illustrationsWidthMaxInPx: 400, + illustrationsMiniaturesWidthMaxInPx: 200, + // Links: + nbLinksMin: 1, + nbLinksMax: 1, + // à supprimer quand tous les "require" à jour: + nbQuestionsMin: questionnaires.nbQuestionsMin, + nbQuestionsMax: questionnaires.nbQuestionsMax, + nbChoicesMax: questionnaires.nbChoicesMax, + passwordMinLength: users.password.minlength, + dirCacheUsers: users.dirCacheUsers, + dirCacheUsersAnswers: users.dirCacheUsersAnswers, + dirCacheQuestionnaires: questionnaires.dirCacheQuestionnaires, + dirCacheQuestions: questionnaires.dirCacheQuestions, + dirCacheUsersQuestionnaires: questionnaires.dirCacheUsersQuestionnaires, + dirHTMLQuestionnaire: questionnaires.dirHTMLQuestionnaire, + dirWebQuestionnaire: questionnaires.dirWebQuestionnaire +}; \ No newline at end of file diff --git a/config/instance-prod.js b/config/instance-prod.js new file mode 100644 index 0000000..43e4388 --- /dev/null +++ b/config/instance-prod.js @@ -0,0 +1,63 @@ +const users = require("./users"); +const questionnaires = require("./questionnaires"); + +module.exports = +{ + apiUrl: "https://api.wikilerni.com/api", + siteUrl: "https://www.wikilerni.com", + adminName: "Fab", + adminEmail: "dev@wikilerni.com", + senderName: "WikiLerni", + senderEmail: "bonjour@wikilerni.com", + adminLang: "fr", + theme: "wikilerni", // le thème utilisé (dans /views) pour générer les pages HTML. Contient ses propres fichiers de configuration. + availableLangs: ["fr"],// Languages in which the site is available. The first one is the default one. + siteName: "WikiLerni", + beginCodeGodfather: "WL", // case-sensitive and can't contain "@" ! + cronTimingAlertInSeconde: 120, // for logs + responseTimingAlertInSeconde: 3, // idem + tokenSignupValidationTimeInHours: "48h", // https://github.com/zeit/ms + tokenLoginLinkTimeInHours: "1h", + tokenConnexionMinTimeInHours: "24h", + tokenConnexionMaxTimeInDays: "180 days", + tokenLoginChangingTimeInHours: "1h",// for email & password changing + tokenDeleteUserTimeInHours: "1h", + tokenUnsubscribeLinkTimeInDays: "7 days", // token send with subscription's emails + freeAccountTimingInDays: 15, + freeAccountExpirationNotificationInDays: 3, + accountExpirationFirstNotificationInDays: 10, + accountExpirationSecondNotificationInDays: 3, + inactiveAccountTimeToDeleteInDays: 180, + // Questionnaires: + nbQuestionsMin: 1, // minimum number of questions for the questionnaire to be publishable + nbQuestionsMax: 0, // if 0 = not maximum + nbChoicesMax: 10, + nbNewQuestionnaires: 10,// for RSS, etc. + hourGiveNewQuestionnaireBegin: 3, // in user local time + hourGiveNewQuestionnaireEnd: 8, // idem + numberNewQuestionnaireAtSameTime: 50, // for mass mailing + minSearchQuestionnaires: 3, + // Illustrations: + nbIllustrationsMin: 0, + nbIllustrationsMax: 1, + maxIllustrationSizeinOctet: 1000000,// pas contrôlé pour l'instant. À revoir. + mimeTypesForIllustration: [ "image/jpg", "image/jpeg", "image/png", "image/gif", "image/png" ], + // -- Upload and resize: + illustrationsWidthMaxInPx: 400, + illustrationsMiniaturesWidthMaxInPx: 200, + // Links: + nbLinksMin: 1, + nbLinksMax: 1, + // à supprimer quand tous les "require" à jour: + nbQuestionsMin: questionnaires.nbQuestionsMin, + nbQuestionsMax: questionnaires.nbQuestionsMax, + nbChoicesMax: questionnaires.nbChoicesMax, + passwordMinLength: users.password.minlength, + dirCacheUsers: users.dirCacheUsers, + dirCacheUsersAnswers: users.dirCacheUsersAnswers, + dirCacheQuestionnaires: questionnaires.dirCacheQuestionnaires, + dirCacheQuestions: questionnaires.dirCacheQuestions, + dirCacheUsersQuestionnaires: questionnaires.dirCacheUsersQuestionnaires, + dirHTMLQuestionnaire: questionnaires.dirHTMLQuestionnaire, + dirWebQuestionnaire: questionnaires.dirWebQuestionnaire +}; \ No newline at end of file diff --git a/config/links.js b/config/links.js new file mode 100644 index 0000000..29034fa --- /dev/null +++ b/config/links.js @@ -0,0 +1,11 @@ +module.exports = +{ + // API'routes (after "apiUrl" defined in instance.js) + linksRoute: "/link/", + // forms : à compléter avec valeurs par défaut, etc. cf modèle + Link : + { + url: { maxlength: 255, required: true }, + anchor: { maxlength: 150, required: true } + } +}; \ No newline at end of file diff --git a/config/log4js.js b/config/log4js.js new file mode 100644 index 0000000..209a12e --- /dev/null +++ b/config/log4js.js @@ -0,0 +1,20 @@ +module.exports = +{ + "appenders": + { + "fileLogs": + { + "type": "dateFile", + "filename": "logs/day.log", + "alwaysIncludePattern" : true, + "numBackups": 7, + "keepFileExt": true + }, + "console": { "type": "console" } + }, + "categories": + { + "production": { "appenders": ["fileLogs"], "level": "trace" }, + "default": { "appenders": [ "console" ], "level": "trace" } + } +} \ No newline at end of file diff --git a/config/mail.js b/config/mail.js new file mode 100644 index 0000000..04b8ec1 --- /dev/null +++ b/config/mail.js @@ -0,0 +1,20 @@ +require('dotenv').config(); +const instance = require("./instance"); + +module.exports = +{ + "SMTP" : + { + "names": process.env.SMTP_NAMES.split(","), + "hosts": process.env.SMTP_HOSTS.split(","), + "ports": process.env.SMTP_PORTS.split(","), + "secures" : process.env.SMTP_SECURES.split(","), + "logins" : process.env.SMTP_LOGINS.split(","), + "passwords" : process.env.SMTP_PASSWORDS.split(",") + }, + "SENDER" : + { + "name" : instance.senderName, + "email" : instance.senderEmail + } +}; \ No newline at end of file diff --git a/config/main.js b/config/main.js new file mode 100644 index 0000000..f93a283 --- /dev/null +++ b/config/main.js @@ -0,0 +1,16 @@ +require('dotenv').config(); + +const instance = require("./instance"); + +instance.env=process.env.NODE_ENV; +instance.bcryptSaltRounds=parseInt(process.env.BCRYPT_SALT_ROUNDS,10); +instance.cronToken=process.env.CRON_TOKEN; +instance.tokenPrivateKey=process.env.TOKEN_PRIVATE_KEY; +instance.maxLoginFail=parseInt(process.env.MAX_LOGIN_FAILS,10); +instance.loginFailTimeInMinutes=parseInt(process.env.LOGIN_FAIL_TIME_IN_MINUTES,10); +instance.dirCache="datas"; +instance.dirHTML="front/public"; +instance.dirTmp="datas/tmp"; +instance.dirTmpLogin="datas/tmp/logins"; + +module.exports = instance; \ No newline at end of file diff --git a/config/questionnaires.js b/config/questionnaires.js new file mode 100644 index 0000000..baf1789 --- /dev/null +++ b/config/questionnaires.js @@ -0,0 +1,56 @@ +module.exports = +{ + // API'routes (after "apiUrl" defined in instance.js) + questionnaireRoutes: "/questionnaire", + getQuestionnaireRoutes: "/get", + previewQuestionnaireRoutes: "/preview", + publishedQuestionnaireRoutes: "/quiz/", + saveAnswersRoute: "/answer/", + getStatsQuestionnaires : "/stats/", + searchQuestionnairesRoute : "/search", + getRandomQuestionnairesRoute : "/getrandom", + searchAdminQuestionnairesRoute : "/searchadmin", + getListNextQuestionnaires: "/getlistnextquestionnaires/", + regenerateHTML: "/htmlregenerated", + // -- questions & choices : + questionsRoute: "/question/", + // -- tags : + tagsSearchRoute: "/tags/search/", + // -- answers : + getQuestionnairesWithoutAnswer: "/withoutanswer/user/", + getPreviousAnswers: "/user/answers/", + getStatsAnswers : "/user/anwswers/stats/", + getAdminStats: "/getadminstats/", + // forms : à compléter avec valeurs par défaut, etc. cf modèle + Questionnaire : + { + title: { maxlength: 255, required: true }, + slug: { maxlength: 150 }, // champ requis mais calculé à partir du titre qd vide + introduction: { required: true } + }, + searchQuestionnaires : { minlength: 3, required: true }, + Question : + { + text: { maxlength: 255, required: true }, + rank: { required: true, min:1, defaultValue:1 } + }, + Choice : + { + text: { maxlength: 255, required: true } + }, + nbQuestionsMin: 1, + nbQuestionsMax: 0, + nbChoicesMax: 10, + nbTagsMin: 0, + nbTagsMax: 0, // 0 = not max + // JSON and HTML dir + dirCacheQuestionnaires : "datas/questionnaires", + dirCacheQuestions : "datas/questionnaires/questions", + dirCacheUsersQuestionnaires : "datas/users/questionnaires", + dirCacheTags : "datas/questionnaires/tags", + dirHTMLQuestionnaire : "front/public/quiz", + dirHTMLTags : "front/public/quizs", + dirWebQuestionnaire : "quiz",//pour url page + dirWebTags : "quizs",// idem + nbRandomResults : 3// limite les résultat du moteur de recherche quand demande de résultats au hasard +}; \ No newline at end of file diff --git a/config/tags.js b/config/tags.js new file mode 100644 index 0000000..7a4b5ad --- /dev/null +++ b/config/tags.js @@ -0,0 +1,11 @@ +// fichier à supprimer une fois tous les "require" ok +const questionnaires = require("./questionnaires"); + +module.exports = +{ + dirCacheTags : questionnaires.dirCacheTags, + dirHTMLTags : questionnaires.dirHTMLTags, + dirWebTags : questionnaires.dirWebTags, + nbTagsMin: questionnaires.nbTagsMin, + nbTagsMax: questionnaires.nbTagsMax +}; \ No newline at end of file diff --git a/config/users.js b/config/users.js new file mode 100644 index 0000000..1ea6796 --- /dev/null +++ b/config/users.js @@ -0,0 +1,36 @@ +module.exports = +{ + // API'routes (after "apiUrl" defined in instance.js) + userRoutes: "/user", + subscribeRoute: "/signup", + getGodfatherRoute: "/getgodfatherid", + checkIfIsEmailfreeRoute: "/isemailfree", + checkSubscribeTokenRoute: "/validation/", + checkLoginRoute: "/checklogin/", + connectionRoute: "/login", + getLoginLinkRoute: "/getloginlink", + connectionWithLinkRoute: "/checkloginlink", + getUserInfos: "/get/", + createUserRoute: "/create", + validateUserRoute: "/validate/", + updateUserInfos: "/modify/", + searchUserRoute: "/search/", + getGodChilds: "/getgodchilds/", + checkNewLoginLinkRoute: "/confirmnewlogin/", + checkDeleteLinkRoute: "/confirmdelete/", + getPayments: "/payment/getforoneuser/", + unsubscribeRoute: "/subscription/stop/", + getAdminStats: "/getadminstats/", + // forms : à compléter avec valeurs par défaut, etc. cf modèle + name: { maxlength: 70, required: true }, + email: { maxlength: 255, required: true }, + password: { minlength: 8, maxlength:72, required: true }, // https://www.npmjs.com/package/bcrypt#security-issues-and-concerns + newPassword: { minlength: 8, maxlength:72 }, + codeGodfather: { maxlength: 255 }, + cguOk: { value: "true", required: true }, + timeDifferenceMin: -720, + timeDifferenceMax:840, + // JSON dir + dirCacheUsers : "datas/users", + dirCacheUsersAnswers : "datas/users/questionnaires/answers" +}; diff --git a/controllers/answer.js b/controllers/answer.js new file mode 100644 index 0000000..18807fe --- /dev/null +++ b/controllers/answer.js @@ -0,0 +1,273 @@ +const { QueryTypes } = require("sequelize"); + +const config = require("../config/main.js"); +const configTpl = require("../views/"+config.theme+"/config/"+config.availableLangs[0]+".js"); + +const tool = require("../tools/main"); +const toolFile = require("../tools/file"); + +const subscriptionCtrl = require("./subscription"); +const questionnaireCtrl = require("./questionnaire"); + +const txt = require("../lang/"+config.adminLang+"/answer"); +const txtGeneral = require("../lang/"+config.adminLang+"/general"); + +// Enregistrement d'une réponse à un questionnaire +exports.create = async (req, res, next) => +{ + try + { + const db = require("../models/index"); + const checkQuestionnaireAccess=await subscriptionCtrl.checkQuestionnaireAccess(req.connectedUser.User.id, req.body.QuestionnaireId); + req.body.UserId=req.connectedUser.User.id; + if(checkQuestionnaireAccess) // l'utilisateur a déjà accès à ce questionnaire + await db["Answer"].create({ ...req.body }, { fields: ["nbQuestions", "nbCorrectAnswers", "duration", "QuestionnaireId", "UserId"] }); + else + { + await Promise.all([ + db["QuestionnaireAccess"].create({ ...req.body }, { fields: ["QuestionnaireId", "UserId"] }), + db["Answer"].create({ ...req.body }, { fields: ["nbQuestions", "nbCorrectAnswers", "duration", "QuestionnaireId", "UserId"] }) + ]); + } + // j'en profite pour remettre les pendules à l'heure ! + db["User"].update({ timeDifference: req.body.timeDifference }, { where: { id : req.connectedUser.User.id }, limit:1 }); + creaUserStatsAnwsersJson(req.body.UserId); + creaUserQuestionnairesWithoutAnswerJson(req.body.UserId); + creaUserAnswersJson(req.body.UserId); + res.status(201).json({ message: txt.responseSavedMessage }); + next(); + } + catch(e) + { // à priori, l'utilisateur ne peut pas avoir envoyé de données incorrectes, donc erreur application pour admin + next(e); + } +} + +// Retourne les réponses d'un utilisateur pour un questionnaire donné +// Si fichier réponses devient trop gros, passer par sql ? +exports.getAnswersByQuestionnaire = async(req, res, next) => +{ + try + { + const answers=await getUserAnswersByQuestionnaire(req.params.userId, req.params.questionnaireId); + res.status(200).json(answers); + next(); + } + catch(e) + { + next(e); + } +} + +// Retourne les statistiques de l'utilisateur +exports.getStatsByUser = async(req, res, next) => +{ + try + { + const stats=await getUserStatsAnswers(req.params.userId); + // J'ajoute les stats générales des questionnaires pour comparaison : + stats.general=await questionnaireCtrl.getStatsQuestionnaires(); + res.status(200).json(stats); + } + catch(e) + { + next(e); + } +} + +// Retourne la liste des questionnaires auxquels un utilisateur a accès, mais n'a pas répondu +// Ils sont listés par ordre de fraîcheur, les + récents étant en début de liste +// Un questionnaire de début et un nombre de questionnaires à retourner doivent être fournis (pagination). +exports.getQuestionnairesWithouAnswerByUser = async(req, res, next) => +{ + try + { + let datas; + if(req.params.id===undefined || req.params.begin===undefined || req.params.nb===undefined) + { + const err=new Error; + err.message=txtGeneral.neededParams; + throw err; + } + else + datas=await getUserQuestionnairesWithoutAnswer(req.params.id, req.params.begin, req.params.nb); + if(datas!==false) + { + if(req.params.output!==undefined && req.params.output=="html") + { + if(datas.questionnaires.length!=0) + { + const pug = require("pug"); + const striptags = require("striptags"); + const txtIllustration= require("../lang/"+config.adminLang+"/illustration"); + const compiledFunction = pug.compileFile("./views/"+config.theme+"/includes/listing-questionnaires.pug"); + const pageDatas= + { + tool: tool, + striptags: striptags, + txtGeneral: txtGeneral, + txtIllustration: txtIllustration, + questionnaires: datas.questionnaires, + nbQuestionnairesList:configTpl.nbQuestionnairesUserHomePage + } + datas.html=await compiledFunction(pageDatas); + } + else + datas.html=""; + res.status(200).json(datas); + } + else + res.status(200).json(datas); + } + else + res.status(404).json(txtQuestionnaire.notFound); + next(); + } + catch(e) + { + next(e); + } +} + + +// FONCTIONS UTILITAIRES + +// Créer la liste des réponses d'un utilisateur +const creaUserAnswersJson = async (UserId) => +{ + const db = require("../models/index"); + const userAnswers=await db.sequelize.query("SELECT `QuestionnaireId`,`nbQuestions`,`nbCorrectAnswers`,`duration`,`createdAt` FROM `Answers` WHERE `UserId`=:id ORDER BY `QuestionnaireId` DESC, `createdAt` DESC", { replacements: { id: UserId }, type: QueryTypes.SELECT }); + if(userAnswers) + { + await toolFile.createJSON(config.dirCacheUsersAnswers, UserId, userAnswers);// à surveiller car fichier pouvant devenir gros ! mais utile pour SVG côté client + return userAnswers; + } + else + return false; +} +exports.creaUserAnswersJson = creaUserAnswersJson; + +// Retourne les réponses d'un utilisateurs à un questionnaire +const getUserAnswersByQuestionnaire = async (UserId, QuestionnaireId) => +{ + let userAnswers=await toolFile.readJSON(config.dirCacheUsersAnswers, UserId); + if(!userAnswers) + userAnswers=await creaUserAnswersJson(UserId); + if(!userAnswers) + return false; + const answers=[]; + for(let i in userAnswers) + { + if(userAnswers[i].QuestionnaireId==QuestionnaireId)// pas "===" car type de données pouvant être différents + answers.push(userAnswers[i]); + else if(answers.length!==0)// les réponses étant classées par QuestionnaireId, je peux sortir de la boucle + break; + } + return answers; +} + +// À combien de questionnaire l'utilisateur a-t'il répondu, quelle est son résultat moyen ? +const creaUserStatsAnwsersJson = async (UserId) => +{ + const db = require("../models/index"); + const getUserAnswers = await db["Answer"].findAll({ where: { UserId : UserId }, attributes: ["id"] }); + const getUserQuestionnaires = await db["Answer"].findAll({ attributes: [[db.sequelize.fn('DISTINCT', db.sequelize.col('QuestionnaireId')), 'id']], where: { UserId : UserId }}); + const getUserStats = await db.sequelize.query("SELECT ROUND(AVG(nbCorrectAnswers/nbQuestions) *100) as avgCorrectAnswers, ROUND(AVG(duration)) as avgDuration FROM Answers GROUP BY UserId HAVING UserId=:id", { replacements: { id: UserId }, type: QueryTypes.SELECT }); + if(getUserAnswers && getUserQuestionnaires) + { + const stats = + { + nbAnswers : getUserAnswers.length, + nbQuestionnaires : getUserQuestionnaires.length + } + if(getUserStats && getUserAnswers.length!=0) + { + stats.avgCorrectAnswers=getUserStats[0].avgCorrectAnswers; + stats.avgDuration=getUserStats[0].avgDuration; + } + await toolFile.createJSON(config.dirCacheUsersAnswers, "stats"+UserId, stats); + return stats; + } + else + return false; +} +exports.creaUserStatsAnwsersJson = creaUserStatsAnwsersJson; + +// Retourne les données créées par la fonction précédente +const getUserStatsAnswers = async (UserId) => +{ + let userStats=await toolFile.readJSON(config.dirCacheUsersAnswers, "stats"+UserId); + if(!userStats) + userStats=await creaUserStatsAnwsersJson(UserId); + if(!userStats) + return false; + else + return userStats; +} + +// À combien de questionnaire les utilisateurs ont-ils répondu ces dernières 24 ? depuis le début ? +const getStatsAnswers = async () => +{ + const db = require("../models/index"); + const getAnswers24H = await db.sequelize.query("SELECT `id` FROM `Answers` WHERE `createdAt` > ADDDATE(NOW(), -1)", { type: QueryTypes.SELECT }); + const getAnswersTot = await db.sequelize.query("SELECT `id` FROM `Answers`", { type: QueryTypes.SELECT }); + if(getAnswers24H && getAnswersTot) + { + const stats = + { + nbAnswers24H : getAnswers24H.length, + nbAnswersTot : getAnswersTot.length + } + return stats; + } + else + return false; +} +exports.getStatsAnswers = getStatsAnswers; + +// Créer la liste des questionnaires proposés à l'utilisateur, mais auxquels il n'a pas encore répondu +const creaUserQuestionnairesWithoutAnswerJson = async (UserId) => +{ + UserId=tool.trimIfNotNull(UserId); + if(UserId===null) + return false; + const db = require("../models/index"); + const userQuestionnaires=await db.sequelize.query("SELECT `QuestionnaireId` FROM `QuestionnaireAccesses` WHERE `UserId`=:id AND `QuestionnaireId` NOT IN (SELECT DISTINCT `QuestionnaireId` FROM Answers WHERE `UserId`=:id) ORDER BY `createdAt` DESC ", { replacements: { id: UserId }, type: QueryTypes.SELECT }); + if(userQuestionnaires) + { + const questionnairesId=[];// les ids suffisent et allègent le fichier + for(i in userQuestionnaires) + questionnairesId.push(userQuestionnaires[i].QuestionnaireId); + await toolFile.createJSON(config.dirCacheUsersQuestionnaires+"/without", UserId, { ids: questionnairesId }); + return { ids: questionnairesId }; + } + else + return false; +} +exports.creaUserQuestionnairesWithoutAnswerJson = creaUserQuestionnairesWithoutAnswerJson; + +// Retourne les données créées par la fonction précédente +const getUserQuestionnairesWithoutAnswer = async (UserId, begin=0, nb=10) => +{ + UserId=tool.trimIfNotNull(UserId); + if(UserId===null) + return false; + let userQuestionnaires=await toolFile.readJSON(config.dirCacheUsersQuestionnaires+"/without", UserId); + if(!userQuestionnaires) + userQuestionnaires=await creaUserQuestionnairesWithoutAnswerJson(UserId); + if(!userQuestionnaires) + return false; + let questionnaire, Questionnaires=[], i=begin; + const nbTot=userQuestionnaires.ids.length; + if(nb===0) + nb=nbTot;// peut être = 0 si l'utilisateur est à jour + while(i +{ + try + { + const db = require("../models/index"); + let question=await questionCtrl.searchQuestionById(req.body.QuestionId); + if(!question) + throw { message: txt.needQuestionForChoices+req.body.QuestionId }; + let choices=[], i=0, oneIsCorrect=false; + while(!tool.isEmpty(req.body["choiceText"+i])) + { + if(req.body["choiceIsCorrect"+i]=="true") + { + isCorrect=true; + oneIsCorrect=true; + } + else + isCorrect=false; + choices.push({ text:req.body["choiceText"+i], isCorrect:isCorrect, QuestionId:req.body.QuestionId }); + i++; + } + if(!oneIsCorrect) + { + questionCtrl.deleteQuestionById(req.body.QuestionId); + res.status(400).json({ errors: [txt.needOneGoodChoice] }); + } + else if(choices.length < 2) + { + questionCtrl.deleteQuestionById(req.body.QuestionId); + res.status(400).json({ errors: [txt.needMinChoicesForQuestion] }); + } + else if(config.nbChoicesMax!==0 && choices.length>config.nbChoicesMax) + { + questionCtrl.deleteQuestionById(req.body.QuestionId); + res.status(400).json({ errors: [txt.needMaxChoicesForQuestion+config.nbChoicesMax] }); + } + else + { + for(let i in choices) + await db["Choice"].create(choices[i], { fields: ["text", "isCorrect", "QuestionId"] }); + question=await questionCtrl.creaQuestionJson(req.body.QuestionId);// besoin de ces données pour la réponse + await questionnaireCtrl.creaQuestionnaireJson(req.body.QuestionnaireId,true);// pour le cache + HTML + questionnaire=await questionnaireCtrl.searchQuestionnaireById(req.body.QuestionnaireId,true);// nécessaire réaffichage après ajout + res.status(201).json({ message: txtQuestion.addOkMessage , questionnaire: questionnaire }); + } + next(); + } + catch(e) + { + const returnAPI=toolError.returnSequelize(e); + if(returnAPI.messages) + { + res.status(returnAPI.status).json({ errors : returnAPI.messages }); + next(); + } + else + next(e); + } +} + +exports.modify = async (req, res, next) => +{ + try + { + const db = require("../models/index"); + let question=await questionCtrl.searchQuestionById(req.params.id); + if(!question) + throw { message: txt.needQuestionForChoices+req.params.id }; + let choicesUpdated=[], choicesAdded=[], i=0, isCorrect, oneIsCorrect=false; + while(!tool.isEmpty(req.body["choiceText"+i])) + { + if(req.body["choiceIsCorrect"+i]=="true") + { + isCorrect=true; + oneIsCorrect=true; + } + else + isCorrect=false; + if(!tool.isEmpty(req.body["idChoice"+i])) + choicesUpdated.push({ text:req.body["choiceText"+i], isCorrect:isCorrect, id:req.body["idChoice"+i] }); + else + choicesAdded.push({ text:req.body["choiceText"+i], isCorrect:isCorrect, QuestionId:req.params.id }); + i++; + } + if(!oneIsCorrect) + res.status(400).json({ errors: [txt.needOneGoodChoice] }); + else if(i<2) + res.status(400).json({ errors: [txt.needMinChoicesForQuestion] }); + else if(config.nbChoicesMax!==0 && i>config.nbChoicesMax) + res.status(400).json({ errors: [txt.needMaxChoicesForQuestion+config.nbChoicesMax] }); + else + { + let finded=false; + for(let i in question.Choices)// = les réponses actuellement enregistrées + { + for(let j in choicesUpdated) + { + if(choicesUpdated[j].id==question.Choices[i].id) + { + finded=true; + break; + } + } + if(!finded) + await db["Choice"].destroy( { where: { id : question.Choices[i].id }, limit:1 }); // ce choix n'a pas été gardé + finded=false; + } + for(let i in choicesUpdated) + await db["Choice"].update(choicesUpdated[i], { where: { id: choicesUpdated[i].id } , fields: ["text", "isCorrect"], limit:1 }); + for(let i in choicesAdded) + await db["Choice"].create(choicesAdded[i], { fields: ["text", "isCorrect", "QuestionId"] }); + question=await questionCtrl.creaQuestionJson(req.params.id);// attendre pour pouvoir tout retourner + await questionnaireCtrl.creaQuestionnaireJson(req.body.QuestionnaireId,true);// pour le cache + HTML + questionnaire=await questionnaireCtrl.searchQuestionnaireById(req.body.QuestionnaireId, true);// nécessaire réaffichage après enregistrement + res.status(200).json({ message: txtQuestion.updateOkMessage , questionnaire: questionnaire }); + } + next(); + } + catch(e) + { + const returnAPI=toolError.returnSequelize(e); + if(returnAPI.messages) + { + res.status(returnAPI.status).json({ errors : returnAPI.messages }); + next(); + } + else + next(e); + } +} \ No newline at end of file diff --git a/controllers/illustration.js b/controllers/illustration.js new file mode 100644 index 0000000..573f75c --- /dev/null +++ b/controllers/illustration.js @@ -0,0 +1,237 @@ +const sharp = require("sharp"); + +const config = require("../config/main.js"); +const configIllustrations = require("../config/illustrations.js"); + +const tool = require("../tools/main"); +const toolError = require("../tools/error"); +const toolFile = require("../tools/file"); + +const questionnaireCtrl = require("./questionnaire"); + +const txt = require("../lang/"+config.adminLang+"/illustration"); +const txtGeneral = require("../lang/"+config.adminLang+"/general"); + +exports.create = async (req, res, next) => +{ + try + { + const db = require("../models/index"); + const illustrationDatas = await checkHasFile(req); + // Le fichier peut avoir été bloqué par multer : + if(!illustrationDatas.url) + res.status(400).json({ errors: [txt.needGoodFile] }); + else + { + const questionnaire=await questionnaireCtrl.searchQuestionnaireById(illustrationDatas.QuestionnaireId); + if(!questionnaire) + { + toolFile.deleteFile(configIllustrations.dirIllustrations, illustrationDatas.url); + throw { message: txt.needQuestionnaireForIllustration }; + } + else if(configIllustrations.nbIllustrationsMax!==0 && questionnaire.Illustrations.length >= configIllustrations.nbIllustrationsMax) + { + toolFile.deleteFile(configIllustrations.dirIllustrations, illustrationDatas.url); + res.status(400).json({ errors: [txt.needMaxIllustrationsForQuestionnaire] }); + } + else + { + const illustration=await db["Illustration"].create({ ...illustrationDatas }, { fields: ["url", "alt", "title", "caption", "QuestionnaireId"] }); + const questionnaireDatas=await questionnaireCtrl.creaQuestionnaireJson(illustrationDatas.QuestionnaireId);// me permet de retourner en réponse les infos actualisées pour les afficher + res.status(201).json({ message: txt.addedOkMessage, questionnaire: questionnaireDatas }); + } + } + next(); + } + catch(e) + { + const returnAPI=toolError.returnSequelize(e); + if(returnAPI.messages) + { + res.status(returnAPI.status).json({ errors : returnAPI.messages }); + next(); + } + else + next(e); + } +} + +exports.modify = async (req, res, next) => +{ + try + { + const db = require("../models/index"); + const illustration=await searchIllustrationById(req.params.id); + if(!illustration) + res.status(404).json({ errors: txt.notFound }); + else + { + const questionnaire=await questionnaireCtrl.searchQuestionnaireById(illustration.QuestionnaireId); + if(!questionnaire) + { + if(illustrationDatas.url) + toolFile.deleteFile(configIllustrations.dirIllustrations, illustrationDatas.url); + throw { message: txt.needQuestionnaireForIllustration }; + } + else if(req.connectedUser.User.status==="creator" && req.connectedUser.User.id!==questionnaire.Questionnaire.CreatorId) + { + if(illustrationDatas.url) + toolFile.deleteFile(configIllustrations.dirIllustrations, illustrationDatas.url); + res.status(401).json({ errors: txtGeneral.notAllowed }); + } + else + { + if(!tool.isEmpty(req.body.fileError)) + res.status(400).json({ errors: [req.body.fileError] }); + else + { + const illustrationDatas = await checkHasFile(req); + // Lors d'une mise à jour, un nouveau fichier n'a pas forcément été envoyé ou peut avoir été bloqué par multer + // Mais si c'est le cas, on supprime l'ancien fichier : + if(illustrationDatas.url) + { + toolFile.deleteFile(configIllustrations.dirIllustrations+"/min", illustration.url); + } + await db["Illustration"].update({ ...illustrationDatas }, { where: { id : req.params.id } , fields: ["url", "alt", "title", "caption"], limit:1 }); + const questionnaireDatas=await questionnaireCtrl.creaQuestionnaireJson(illustrationDatas.QuestionnaireId);// me permet de retourner en réponse les infos actualisées pour les afficher + res.status(200).json({ message: txt.updatedOkMessage, questionnaire: questionnaireDatas }); + } + } + } + next(); + } + catch(e) + { + const returnAPI=toolError.returnSequelize(e); + if(returnAPI.messages) + { + res.status(returnAPI.status).json({ errors : returnAPI.messages }); + next(); + } + else + next(e); + } +} + +exports.delete = async (req, res, next) => +{ + try + { + const db = require("../models/index"); + const illustration=await searchIllustrationById(req.params.id); + if(!illustration) + throw { message: txt.notFound+req.params.id }; + else + { + const questionnaire=await questionnaireCtrl.searchQuestionnaireById(illustration.QuestionnaireId); + if(!questionnaire) + throw { message: txt.needQuestionnaireForIllustration }; + else if(req.connectedUser.User.status==="creator" && req.connectedUser.User.id!==questionnaire.Questionnaire.CreatorId) + res.status(401).json({ errors: txtGeneral.notAllowed }); + else + { + const delIllus=await deleteIllustrationById(req.params.id); + if(delIllus) + { + const questionnaireDatas=await questionnaireCtrl.creaQuestionnaireJson(illustration.QuestionnaireId);// me permet de retourner en réponse les infos actualisées pour les afficher + res.status(200).json({ message: txt.deletedOkMessage, questionnaire: questionnaireDatas }); + } + else + res.status(400).json({ errors: [txtGeneral.serverError] }); + } + } + next(); + } + catch(e) + { + next(e); + } +} + +exports.getOneIllustrationById = async (req, res, next) => +{ + try + { + const illustration=await searchIllustrationById(req.params.id); + if(illustration) + res.status(200).json(illustration); + else + res.status(404).json(null); + } + catch(e) + { + next(e); + } +} + +// cron de nettoyage des fichiers illustrations n'existant plus dans la bd +exports.deleteOldFiles= async (req, res, next) => +{ + try + { + const db = require("../models/index"); + const illustrations=await db["Illustration"].findAll({ attributes: ["url"] }); + let saveFiles=[]; + for(let i in illustrations) + saveFiles.push(illustrations[i].url); + await toolFile.deleteFilesInDirectory(configIllustrations.dirIllustrations, saveFiles); + await toolFile.deleteFilesInDirectory(configIllustrations.dirIllustrations+"/min", saveFiles); + // + le répertoire temporaire où rien ne devrait traîner : + const fileExpiration=new Date().getTime()-1000; + await toolFile.deleteOldFilesInDirectory(configIllustrations.dirIllustrationsTmp, fileExpiration); + res.status(200).json(deleteFiles); + next(); + } + catch(e) + { + next(e); + } +} + + +// FONCTIONS UTILITAIRES + +// Gère le redimensionnement de l'image si un fichier est envoyé. +// c'est multer qui vérifie dans le middleware précédent que l'image a le bon format, puis lui donne un nom (filename) si c'est ok +const checkHasFile = async (req) => +{ + if(req.file) + { // à revoir ? : là l'image est aggrandie si + petite que demandé + await sharp(req.file.path).resize(configIllustrations.illustrationsWidthMaxInPx).toFile(configIllustrations.dirIllustrations+"/"+req.file.filename); + await sharp(req.file.path).resize(configIllustrations.illustrationsMiniaturesWidthMaxInPx).toFile(configIllustrations.dirIllustrations+"/min/"+req.file.filename); + await toolFile.deleteFile(configIllustrations.dirIllustrationsTmp, req.file.filename); + } + // La gestion du téléchargement du fichier de l'illustration fait que les données sont envoyées sous forme de chaîne de caractères (form-data), qu'il faut transformer en json + const datas=req.file ? { ...req.body, url: req.file.filename } : { ...req.body }; + return datas; +} + +const searchIllustrationById = async (id) => +{ + const db = require("../models/index"); + const illustration=await db["Illustration"].findByPk(id); + if(illustration) + return illustration; + else + return false; +} + +const deleteIllustrationById = async (id) => +{ + const db = require("../models/index"); + const illustration=await searchIllustrationById(id); + if(!illustration) + throw { message: txt.notFound+id }; + else + { + const nb=await db["Illustration"].destroy( { where: { id : id }, limit:1 }); + if(nb===1) + { + toolFile.deleteFile(configIllustrations.dirIllustrations, illustration.url); + toolFile.deleteFile(configIllustrations.dirIllustrations+"/min", illustration.url); + questionnaireCtrl.creaQuestionnaireJson(illustration.QuestionnaireId); + } + return true; + } +} +exports.deleteIllustrationById = deleteIllustrationById; \ No newline at end of file diff --git a/controllers/link.js b/controllers/link.js new file mode 100644 index 0000000..be3b872 --- /dev/null +++ b/controllers/link.js @@ -0,0 +1,144 @@ +const config = require("../config/main.js"); +const configLinks = require("../config/links.js"); + +const tool = require("../tools/main"); +const toolError = require("../tools/error"); + +const questionnaireCtrl = require("./questionnaire"); + +const txt = require("../lang/"+config.adminLang+"/link"); +const txtGeneral = require("../lang/"+config.adminLang+"/general"); + +exports.create = async (req, res, next) => +{ + try + { + const db = require("../models/index"); + const questionnaire=await questionnaireCtrl.searchQuestionnaireById(req.body.QuestionnaireId); + if(!questionnaire) + throw { message: txt.needQuestionnaire }; + else if(configLinks.nbLinksMax!==0 && questionnaire.Links.length>=configLinks.nbLinksMax) + res.status(400).json({ errors: txt.needMaxLinksForQuestionnaire }); + else + { + const link=await db["Link"].create({ ...req.body }, { fields: ["url","anchor", "QuestionnaireId"] }); + questionnaireCtrl.creaQuestionnaireJson(req.body.QuestionnaireId); + const questionnaireDatas=await questionnaireCtrl.creaQuestionnaireJson(req.body.QuestionnaireId);// me permet de retourner en réponse les infos actualisées pour les afficher + res.status(201).json({ message: txt.addedOkMessage, questionnaire: questionnaireDatas }); + } + next(); + } + catch(e) + { + const returnAPI=toolError.returnSequelize(e); + if(returnAPI.messages) + { + res.status(returnAPI.status).json({ errors : returnAPI.messages }); + next(); + } + else + next(e); + } +} + +exports.modify = async (req, res, next) => +{ + try + { + const db = require("../models/index"); + const link=await searchLinkById(req.params.id); + if(!link) + res.status(404).json({ errors: txt.notFound }); + else + { + const questionnaire=await questionnaireCtrl.searchQuestionnaireById(link.QuestionnaireId); + if(!questionnaire) + throw { message: txt.needQuestionnaire }; + else if(req.connectedUser.User.status==="creator" && req.connectedUser.User.id!==questionnaire.Questionnaire.CreatorId) + res.status(401).json({ errors: txtGeneral.notAllowed }); + else + { + await db["Link"].update({ ...req.body }, { where: { id : req.params.id } , fields: ["url","anchor"], limit:1 }); + const questionnaireDatas=await questionnaireCtrl.creaQuestionnaireJson(link.QuestionnaireId);// me permet de retourner en réponse les infos actualisées pour les afficher + res.status(200).json({ message: txt.updatedOkMessage, questionnaire: questionnaireDatas }); + } + } + next(); + } + catch(e) + { + const returnAPI=toolError.returnSequelize(e); + if(returnAPI.messages) + { + res.status(returnAPI.status).json({ errors : returnAPI.messages }); + next(); + } + else + next(e); + } +} + +exports.delete = async (req, res, next) => +{ + try + { + const db = require("../models/index"); + const link=await searchLinkById(req.params.id); + if(!link) + res.status(404).json({ errors: txt.notFound }); + else + { + const questionnaire=await questionnaireCtrl.searchQuestionnaireById(link.QuestionnaireId); + if(!questionnaire) + throw { message: txt.needQuestionnaire }; + else if(req.connectedUser.User.status==="creator" && req.connectedUser.User.id!==questionnaire.Questionnaire.CreatorId) + res.status(401).json({ errors: txtGeneral.notAllowed }); + else + { + const nb=await db["Link"].destroy( { where: { id : req.params.id }, limit:1 }); + if(nb===1) + { + const questionnaireDatas=await questionnaireCtrl.creaQuestionnaireJson(link.QuestionnaireId); + res.status(200).json({ message: txt.deletedOkMessage, questionnaire: questionnaireDatas }); + } + else // ne devrait pas être possible, car déjà testé + haut ! + throw { message: txt.needQuestionnaire }; + } + } + next(); + } + catch(e) + { + next(e); + } +} + +exports.getOneById = async (req, res, next) => +{ + try + { + const link=await searchLinkById(req.params.id); + if(link) + res.status(200).json(link); + else + res.status(404).json(null); + next(); + } + catch(e) + { + next(e); + } +} + + +// FONCTIONS UTILITAIRES + +const searchLinkById = async (id) => +{ + const db = require("../models/index"); + const link = await db["Link"].findByPk(id); + if(link) + return link; + else + return false; +} \ No newline at end of file diff --git a/controllers/pause.js b/controllers/pause.js new file mode 100644 index 0000000..0c4005d --- /dev/null +++ b/controllers/pause.js @@ -0,0 +1,129 @@ +const { QueryTypes } = require("sequelize"); + +const config = require("../config/main.js"); + +const tool = require("../tools/main"); +const toolError = require("../tools/error"); + +const userCtrl=require("./user"); + +const txt = require("../lang/"+config.adminLang+"/pause"); +const txtGeneral = require("../lang/"+config.adminLang+"/general"); + +exports.create = async (req, res, next) => +{ + try + { + const db = require("../models/index"); + const connectedUser=req.connectedUser; + req.body.SubscriptionId=connectedUser.Subscription.id; + await db["Pause"].create({ ...req.body }); + userCtrl.creaUserJson(connectedUser.User.id); + res.status(201).json({ message: txt.createdOkMessage }); + next(); + } + catch(e) + { + const returnAPI=toolError.returnSequelize(e); + if(returnAPI.messages) + { + res.status(returnAPI.status).json({ errors : returnAPI.messages }); + next(); + } + else + next(e); + } +} + +exports.modify = async (req, res, next) => +{ + try + { + const db = require("../models/index"); + const connectedUser=req.connectedUser; + if(!checkPauseIsOk(req.params.id, connectedUser)) + res.status(404).json({ errors: txtGeneral.serverError }); + else + { + await db["Pause"].update({ ...req.body }, { where: { id : req.params.id } , fields: ["name", "startingAt", "endingAt"], limit:1 }), + userCtrl.creaUserJson(connectedUser.User.id); + res.status(201).json({ message: txt.updatedOkMessage }); + } + next(); + } + catch(e) + { + const returnAPI=toolError.returnSequelize(e); + if(returnAPI.length!==0) + { + res.status(returnAPI.status).json({ errors : returnAPI.messages }); + next(); + } + else + next(e); + } +} + +exports.delete = async (req, res, next) => +{ + try + { + const db = require("../models/index"); + const connectedUser=req.connectedUser; + if(!checkPauseIsOk(req.params.id, connectedUser)) + res.status(404).json({ errors: txtGeneral.serverError }); + else + { + await db["Pause"].destroy({ where: { id : req.params.id }, limit:1 }); + userCtrl.creaUserJson(connectedUser.User.id); + res.status(200).json({ message: txt.deletedOkMessage }); + } + next(); + } + catch(e) + { + next(e); + } +} + +// Cron +exports.deleteOldPauses= async(req, res, next) => +{ + try + { + const db = require("../models/index"); + // on laisse deux jours de rab pour les décalages horaires & co + const userPauses=await db.sequelize.query("SELECT DISTINCT `Subscriptions`.`UserId` FROM `Subscriptions` INNER JOIN `Pauses` ON `Subscriptions`.`id`=`Pauses`.`SubscriptionId` WHERE ADDDATE(`endingAt`, 2) < NOW()", { type: QueryTypes.SELECT }); + if(userPauses.length!==0) + { + await db.sequelize.query("DELETE FROM `Pauses` WHERE ADDDATE(`endingAt`, 2) < NOW()"); + for(i in userPauses) + await userCtrl.creaUserJson(userPauses[i].UserId); + } + res.status(200).json(true); + next(); + } + catch(e) + { + next(e); + } +} + + +// FONCTIONS UTILITAIRES + +// Vérifie si la période de pause appartient bien à cet utilisateur +const checkPauseIsOk = (idPause, user) => +{ + if(!user.Pauses) + return false; + let PauseIsOk=false, i=0; + while (!PauseIsOk && user.Pauses[i]) + { + if(user.Pauses[i].id == idPause)// ! n'ont pas forcément le même type + PauseIsOk=true; + else + i++; + } + return PauseIsOk; +} \ No newline at end of file diff --git a/controllers/payment.js b/controllers/payment.js new file mode 100644 index 0000000..728935b --- /dev/null +++ b/controllers/payment.js @@ -0,0 +1,132 @@ +const config = require("../config/main.js"); +const configTpl = require("../views/"+config.theme+"/config/"+config.availableLangs[0]+".js"); + +const tool = require("../tools/main"); +const toolMail = require("../tools/mail"); + +const txt = require("../lang/"+config.adminLang+"/payment"); +const txtUser = require("../lang/"+config.adminLang+"/user"); +const txtGeneral = require("../lang/"+config.adminLang+"/general"); + +const userCtrl = require("./user"); + +exports.getOneUserPayments = async (req, res, next) => +{ + try + { + const connectedUser=req.connectedUser; + if(connectedUser===false || ["admin","manager"].indexOf(connectedUser.User.status) === -1) + res.status(403).json({ errors: txtGeneral.notAllowed }); + else + { + const db = require("../models/index"); + const Payments=await db["Payment"].findAll({ where: { UserId: req.params.id }, order: [["createdAt", "DESC"]] }); + res.status(200).json(Payments); + } + next(); + } + catch(e) + { + next(e); + } +} + +exports.saveUserPaymentInfos = async (req, res, next) => +{ + // exemple d'url : WP-infos.html?dom=NOM_DE_DOMAINE_DU_BOUTON&ref=ID_DU_USER&mt=MONTANT_TTC&cmd=CODE_COMMANDE_WEBPORTAGE&cl=NOM+DU+CLIENT&hKey=le_hash_en_md5 + // dom=wikilerni.com&ref=5&mt=24&cmd=de11de&cl=monsieur+dugenoux&hKey=998dccdef52bd27dc0a674941c0e9340 + try + { + require('dotenv').config(); + const db = require("../models/index"); + const md5 = require("md5"); + const montantsAbonnement=["12","24", "60", "120"]; + // !! attention req.query enlève les caractères spéciaux comme les "+" des paramètres de l'url. Il vaut donc mieux utiliser req.url pour comparer avec le hash au reste de la chaîne. + const testUrl=req.url.slice(req.url.indexOf("?")+1,req.url.lastIndexOf("&")); + console.log(testUrl); + console.log(md5(testUrl+process.env.MD5_WP)); + if(md5(testUrl+process.env.MD5_WP)!==req.query.hKey) // le hashage est effectué après le remplacement des caractères spéciaux dans l'url. + throw { message: txt.paymentUrlFail+testUrl }; + else if(req.query.ref==="" || montantsAbonnement.indexOf(req.query.mt) === -1) + throw { message: txt.paymentDatasFail+testUrl }; + else + { + const client=await userCtrl.searchUserById(req.query.ref); + if(!client) + throw { message: txt.paymentUserNotFound+testUrl }; + else + { + // Si cet utilisateur a un parrain on le remercie et lui ajoute 30 jours d'abonnement + // Cela impacte aussi la durée de l'abonnement commandé par l'utilisateur + let numberOfDays=365; + if(client.User.GodfatherId) + { + const parrain=await userCtrl.searchUserById(client.User.GodfatherId); + if(parrain) + { + parrain.Subscription.numberOfDays+=30; + numberOfDays+=30; + await db["Subscription"].update({ ...parrain.Subscription }, { where: { UserId : client.User.GodfatherId }, fields: ["numberOfDays"], limit:1 }); + userCtrl.creaUserJson(client.User.GodfatherId); + const mapMail = + { + USER_NAME: parrain.User.name + }; + const mailDatas= + { + mailSubject: txt.mailPaymentThankGodfatherSubject, + mailPreheader: txt.mailPaymentThankGodfatherSubject, + mailTitle: txt.mailPaymentThankGodfatherSubject, + mailHeaderLinkUrl: config.siteUrl+"/"+configTpl.userHomePage, + mailHeaderLinkTxt: txt.mailPaymentLinkTxt, + mailMainContent: tool.replaceAll(txt.mailPaymentThankGodfatherBodyHTML, mapMail), + linksCTA: [{ url:config.siteUrl+"/"+configTpl.userHomePage, txt:txt.mailPaymentLinkTxt }], + mailRecipientAddress: parrain.User.email + } + await toolMail.sendMail(parrain.User.smtp, parrain.User.email, txt.mailPaymentThankGodfatherSubject, tool.replaceAll(txt.mailPaymentThankGodfatherBodyTxt, mapMail), "", mailDatas); + } + else + res.alerte=txt.paymentGodfatherNotFound+client.User.GodfatherId; + } + const infosClient= + { + clientName: req.query.cl, + amount: req.query.mt, + codeCommande: req.query.cmd, + UserId: client.User.id, + numberOfDays: client.Subscription.numberOfDays+numberOfDays + }; + await db["Payment"].create({ ...infosClient }, { fields: ["clientName", "amount", "codeCommande", "UserId"] }); + await db["Subscription"].update({ ...infosClient }, { where: { UserId : infosClient.UserId }, fields: ["numberOfDays"], limit:1 }); + userCtrl.creaUserJson(infosClient.UserId); + // mail remerciement abonné + const mapMail2 = + { + SITE_NAME: config.siteName, + USER_NAME: client.User.name, + NBDAYS: numberOfDays + }; + const mailDatas2 = + { + mailSubject: txt.mailPaymentThankSubject, + mailPreheader: txt.mailPaymentThankSubject, + mailTitle: txt.mailPaymentThankSubject, + mailHeaderLinkUrl: config.siteUrl+"/"+configTpl.userHomePage, + mailHeaderLinkTxt: txt.mailPaymentLinkTxt, + mailMainContent: tool.replaceAll(txt.mailPaymentThankBodyHTML, mapMail2), + linksCTA: [{ url:config.siteUrl+"/"+configTpl.userHomePage, txt:txt.mailPaymentLinkTxt }], + mailRecipientAddress: client.User.email + } + await toolMail.sendMail(client.User.smtp, client.User.email, txt.mailPaymentThankSubject, tool.replaceAll(txt.mailPaymentThankBodyTxt, mapMail2), "", mailDatas2); + // + info admin site + await toolMail.sendMail(0, config.adminEmail, txt.mailPaymentAdminNoticeSubject, txt.mailPaymentAdminNoticeBodyTxt.replace("EMAIL", client.User.email), txt.mailPaymentAdminNoticeBodyHTML.replace("EMAIL", client.User.email)); + res.status(200).json(true); + } + } + next(); + } + catch(e) + { + next(e); + } +} \ No newline at end of file diff --git a/controllers/question.js b/controllers/question.js new file mode 100644 index 0000000..bad6bf5 --- /dev/null +++ b/controllers/question.js @@ -0,0 +1,179 @@ +const { Op, QueryTypes } = require("sequelize"); + +const config = require("../config/main.js"); + +const tool = require("../tools/main"); +const toolError = require("../tools/error"); +const toolFile = require("../tools/file"); + +const questionnaireCtrl = require("./questionnaire"); + +const txt = require("../lang/"+config.adminLang+"/question"); +const txtGeneral = require("../lang/"+config.adminLang+"/general"); + +exports.create = async (req, res, next) => +{ + try + { + const db = require("../models/index"); + const questionnaire=await questionnaireCtrl.searchQuestionnaireById(req.body.QuestionnaireId); + if(!questionnaire) + throw txt.needQuestionnaire; + else if(config.nbQuestionsMax!==0 && questionnaire.Questions.length>=config.nbQuestionsMax) + res.status(400).json({ errors: [txt.needMaxQuestions+config.nbQuestionsMax] }); + else + { + const question=await db["Question"].create({ ...req.body }, { fields: ["text", "explanation", "rank", "QuestionnaireId"] }); + questionnaireCtrl.creaQuestionnaireJson(req.body.QuestionnaireId); + req.body.QuestionId=question.id; + next();// je passe la main au contrôleur qui gère les réponses possibles saisies pour cette question + return true; + } + next(); + } + catch(e) + { + const returnAPI=toolError.returnSequelize(e); + if(returnAPI.messages) + { + res.status(returnAPI.status).json({ errors : returnAPI.messages }); + next(); + } + else + next(e); + } +} + +exports.modify = async (req, res, next) => +{ + try + { + const db = require("../models/index"); + const question=await searchQuestionById(req.params.id); + if(!question) + throw txt.notFound; + const questionnaire=questionnaireCtrl.searchQuestionnaireById(question.Question.QuestionnaireId); + if(!questionnaire) + throw txt.needQuestionnaire; + if(req.connectedUser.User.status==="creator" && req.connectedUser.User.id!==questionnaire.CreatorId) + res.status(401).json({ errors: txtGeneral.notAllowed }); + else + { + await db["Question"].update({ ...req.body }, { where: { id : req.params.id } , fields: ["text", "explanation", "rank"], limit:1 }); + next();// je passe la main au contrôleur qui gère les réponses possibles saisies pour cette question + return true; + } + } + catch(e) + { + const returnAPI=toolError.returnSequelize(e); + if(returnAPI.messages) + { + res.status(returnAPI.status).json({ errors : returnAPI.messages }); + next(); + } + else + next(e); + } +} + +exports.delete = async (req, res, next) => +{ + try + { + const question=await searchQuestionById(req.params.id); + if(!question) + throw txt.notFound; + let questionnaire=questionnaireCtrl.searchQuestionnaireById(question.Question.QuestionnaireId); + if(!questionnaire) + throw txt.needQuestionnaire; + if(req.connectedUser.User.status==="creator" && req.connectedUser.User.id!==questionnaire.CreatorId) + res.status(401).json({ errors: txtGeneral.notAllowed }); + else + { + if(await deleteQuestionById(req.params.id)) + { + questionnaire=await questionnaireCtrl.searchQuestionnaireById(req.body.QuestionnaireId,true);// nécessaire réaffichage après suppression + res.status(200).json({ message: txt.deleteOkMessage, questionnaire: questionnaire }); + } + else + res.status(400).json({ errors: txtGeneral.serverError }); + } + next();// pour middleware mesurant la durée de la réponse + } + catch(e) + { + next(e); + } +} + +// CRON supprimant les fichiers Json obsolètes +exports.deleteJsonFiles= async (req, res, next) => +{ + try + { + const db = require("../models/index"); + const questions=await db["Question"].findAll({ attributes: ["id"] }); + let saveFiles=[]; + for(let i in questions) + saveFiles.push(questions[i].id+".json"); + const deleteFiles = await toolFile.deleteFilesInDirectory(config.dirCacheQuestions, saveFiles); + res.status(200).json(deleteFiles); + next(); + } + catch(e) + { + next(e); + } +} + +// FONCTIONS UTILITAIRES + +// Création du fichier des données relatives à une question (avec les réponses proposées) +const creaQuestionJson = async (id) => +{ + const db = require("../models/index"); + const Question=await db["Question"].findByPk(id); + if(Question) + { + let datas={ Question }; + const Choices=await db["Choice"].findAll({ where: { QuestionId: Question.id }}); + if(Choices) + datas.Choices=Choices; + await toolFile.createJSON(config.dirCacheQuestions, id, datas); + return datas; + } + else + return false; +} +exports.creaQuestionJson = creaQuestionJson; + +// Retourne les données d'une question +const searchQuestionById = async (id) => +{ + const question=await toolFile.readJSON(config.dirCacheQuestions, id); + if(question) + return question; + else + return await creaQuestionJson(id); +} +exports.searchQuestionById = searchQuestionById; + +// Supprime une question et ses dépendances +const deleteQuestionById = async (id) => +{ + const db = require("../models/index"); + const question=await searchQuestionById(id); + if(!question) + throw txt.notFound; + const nb=await db["Question"].destroy( { where: { id : id }, limit:1 }); + if(nb===1) + { + toolFile.deleteJSON(config.dirCacheQuestions, id); + questionnaireCtrl.creaQuestionnaireJson(question.Question.QuestionnaireId); + return true; + } + else + throw txt.notFound; +} +exports.deleteQuestionById = deleteQuestionById; \ No newline at end of file diff --git a/controllers/questionnaire.js b/controllers/questionnaire.js new file mode 100644 index 0000000..da7176f --- /dev/null +++ b/controllers/questionnaire.js @@ -0,0 +1,728 @@ +const { Op, QueryTypes } = require("sequelize"); + +const pug = require("pug"); +const striptags = require("striptags"); + +const config = require("../config/main.js"); +const configQuestionnaires = require("../config/questionnaires.js"); +const configTags = require("../config/tags.js"); +const configLinks = require("../config/links.js"); +const configIllustrations = require("../config/illustrations.js"); +const configTpl = require("../views/"+config.theme+"/config/"+config.availableLangs[0]+".js"); + +const tool = require("../tools/main"); +const toolError = require("../tools/error"); +const toolFile = require("../tools/file"); +const toolMail = require("../tools/mail"); + +const questionCtrl = require("./question"); +const illustrationCtrl = require("./illustration"); +const tagCtrl = require("./tag"); +const userCtrl = require("./user"); + +const txtGeneral = require("../lang/"+config.adminLang+"/general"); +const txtQuestionnaire = require("../lang/"+config.adminLang+"/questionnaire"); +const txtQuestionnaireAccess = require("../lang/"+config.adminLang+"/questionnaireaccess"); +const txtIllustration = require("../lang/"+config.adminLang+"/illustration"); + +exports.create = async (req, res, next) => +{ + try + { + const db = require("../models/index"); + req.body.CreatorId=req.connectedUser.User.id; + const questionnaire=await db["Questionnaire"].create({ ...req.body }, { fields: ["title", "slug", "introduction", "keywords", "publishingAt", "language", "estimatedTime", "CreatorId"] }); + creaStatsQuestionnairesJson(); + //utile au middleware suivant (classement tags) qui s'occupe aussi de retourner une réponse si ok : + req.body.QuestionnaireId=questionnaire.id; + next(); + } + catch(e) + { + const returnAPI=toolError.returnSequelize(e); + if(returnAPI.messages) + { + res.status(returnAPI.status).json({ errors : returnAPI.messages }); + next(); + } + else + next(e); + } +} + +exports.modify = async (req, res, next) => +{ + try + { + const db = require("../models/index"); + const questionnaire=await searchQuestionnaireById(req.params.id); + if(!questionnaire) + { + const Err=new Error; + error.status=404; + error.message=txtQuestionnaire.notFound+" ("+req.params.id+")"; + throw Err; + } + else if(req.connectedUser.User.status==="creator" && req.connectedUser.User.id!==questionnaire.CreatorId) + res.status(401).json({ errors: txtGeneral.notAllowed }); + else + { + await db["Questionnaire"].update({ ...req.body }, { where: { id : req.params.id } , fields: ["title", "slug", "introduction", "keywords", "publishingAt", "language", "estimatedTime"], limit:1 }); // voir si admin aura le droit de changer le créateur ? et ajouter une gestion des redirection si slug change ? + creaStatsQuestionnairesJson();// le nombre de quizs publiés peut avoir changé + } + //utile au middleware suivant (classement tags) qui s'occupe aussi de retourner une réponse si ok : + req.body.QuestionnaireId=req.params.id; + next(); + } + catch(e) + { + const returnAPI=toolError.returnSequelize(e); + if(returnAPI.messages) + { + res.status(returnAPI.status).json({ errors : returnAPI.messages }); + next(); + } + else + next(e); + } +} + +exports.delete = async (req, res, next) => +{ + try + { + const db = require("../models/index"); + const questionnaire=await searchQuestionnaireById(req.params.id); + if(!questionnaire) + { + const Err=new Error; + error.status=404; + error.message=txtQuestionnaire.notFound+" ("+req.params.id+")"; + throw Err; + } + else if(req.connectedUser.User.status==="creator" && req.connectedUser.User.id!==questionnaire.CreatorId) + res.status(401).json({ errors: txtGeneral.notAllowed }); + else + { + // Permet de supprimer les fichiers associés en plus du sql. Inutile pour link qui n'a pas de fichier. + // À faire avant la suppression SQL du questionnaire entraînant la suppression en cascade du reste. + for(i in questionnaire.Questions) + await questionCtrl.deleteQuestionById(questionnaire.Questions[i].id); + + for(i in questionnaire.Illustrations) + await illustrationCtrl.deleteIllustrationById(questionnaire.Illustrations[i].id); + + const nb=await db["Questionnaire"].destroy( { where: { id : req.params.id }, limit:1 }); + if(nb===1) + { + await toolFile.deleteJSON(config.dirCacheQuestionnaires, req.params.id); + res.status(200).json({ message: txtGeneral.deleteOkMessage }); + // actualisation de liste des questionnaires pour les tags concernés. + // Ici au contraire, les enregistrements doivent être supprimés avant. + for(let i in questionnaire.Tags) + tagCtrl.creaQuestionnairesTagJson(questionnaire.Tags[i].TagId); + // La suppression peut éventuellement concerner un des derniers questionnaires, donc : + creaNewQuestionnairesJson(); + creaStatsQuestionnairesJson(); + // Éventuellement regénérer les caches listant les réponses/quizs des users ayant accès à ce questionnaire ? + // ++ HTML + } + else + { + const Err=new Error; + error.status=404; + error.message=txtQuestionnaire.notFound+" ("+req.params.id+")"; + throw Err; + } + } + next(); + } + catch(e) + { + next(e); + } +} + +exports.getOneQuestionnaireById = async (req, res, next) => +{ + try + { + const datas=await searchQuestionnaireById(req.params.id, true); + if(datas) + res.status(200).json(datas); + else + res.status(404).json({ errors:txtQuestionnaire.notFound }); + next(); + } + catch(e) + { + next(e); + } +} + +exports.showOneQuestionnaireById = async (req, res, next) => +{ + try + { + // Seuls certains utilisateurs peuvent avoir accès à cette page + const connectedUser=await userCtrl.checkTokenUser(req.params.token); + if(connectedUser===false) + res.status(403).json({ errors:txtGeneral.failAuthToken }); + else + { + if(["admin", "manager", "creator"].indexOf(connectedUser.User.status) === -1) + res.status(403).json({ errors:txtGeneral.notAllowed }); + else + { + const HTML=await creaQuestionnaireHTML(req.params.id, true); + if(HTML) + { + res.setHeader("Content-Type", "text/html"); + res.send(HTML); + } + else + res.status(404).json({ errors:txtQuestionnaire.notFound }); + } + } + next(); + } + catch(e) + { + next(e); + } +} + +// Recherche par mots-clés parmis tous les questionnaires publiés en filtrant parmi ceux auxquels l'abonné a déjà répondu ou pas +// Seul un certain nombre de résultats est renvoyé (pagination) +exports.searchQuestionnaires = async (req, res, next) => +{ + try + { + let search=tool.trimIfNotNull(req.body.searchQuestionnaires); + if(search === null || search === "" || search.length < config.minSearchQuestionnaires) + res.status(400).json(txtQuestionnaireAccess.searchIsNotLongEnough); + else + { + const db = require("../models/index"); + let getQuestionnaires; + if(!tool.isEmpty(req.body.onlyAnswers) && !tool.isEmpty(req.connectedUser.User.id)) + getQuestionnaires=await db.sequelize.query("SELECT DISTINCT `Questionnaires`.`id` FROM `Questionnaires` INNER JOIN `Answers` WHERE `Answers`.`QuestionnaireId`=`Questionnaires`.`id` AND `Answers`.`UserId`=:id AND (`title` LIKE :search OR `introduction` LIKE :search OR `keywords` LIKE :search) AND `isPublished` = 1", { replacements: { id:req.connectedUser.User.id, search: "%"+search+"%" }, type: QueryTypes.SELECT }); + else + getQuestionnaires=await db.sequelize.query("SELECT `id` FROM `Questionnaires` WHERE (`title` LIKE :search OR `introduction` LIKE :search OR `keywords` LIKE :search) AND `isPublished` = 1", { replacements: { search: "%"+search+"%" }, type: QueryTypes.SELECT }); + let begin=0, end, output=""; + if(!tool.isEmpty(req.body.begin)) + begin=parseInt(req.body.begin, 10); + end=begin+configTpl.nbQuestionnairesUserHomePage-1;// tableau commence à 0 ! + if(req.body.output!==undefined) + output=req.body.output; + datas=await getListingsQuestionnairesOuput(getQuestionnaires, begin, end, output); + res.status(200).json(datas); + } + next(); + } + catch(e) + { + next(e); + } +} + +// Recherche aléatoire parmi tous les questionnaires publiés +// De nouveau on peut filtrer ou non ceux auxquels l'utilisateur a répondu +// Par contre, ici pas de pagination car on maîtrise le nombre de résultats envoyés +exports.getRandomQuestionnaires = async (req, res, next) => +{ + try + { + const db = require("../models/index"); + let getQuestionnaires; + if(!tool.isEmpty(req.body.onlyAnswers) && !tool.isEmpty(req.connectedUser.User.id)) + getQuestionnaires=await db.sequelize.query("SELECT DISTINCT `Questionnaires`.`id` FROM `Questionnaires` INNER JOIN `Answers` WHERE `Answers`.`QuestionnaireId`=`Questionnaires`.`id` AND `Answers`.`UserId`=:id AND `isPublished` = 1 ORDER BY RAND() LIMIT "+configQuestionnaires.nbRandomResults, { replacements: { id:req.connectedUser.User.id }, type: QueryTypes.SELECT }); + else + getQuestionnaires=await db.sequelize.query("SELECT `id` FROM `Questionnaires` WHERE `isPublished` = 1 ORDER BY RAND() LIMIT "+configQuestionnaires.nbRandomResults, { type: QueryTypes.SELECT }); + let begin=0, end; + end=begin+configTpl.nbQuestionnairesUserHomePage-1; + datas=await getListingsQuestionnairesOuput(getQuestionnaires, begin, end, "html"); + res.status(200).json(datas); + next(); + } + catch(e) + { + next(e); + } +} + +// Recherche par mots-clés parmis tous les questionnaires, y compris ceux non publiés +exports.searchAdminQuestionnaires = async (req, res, next) => +{ + try + { + let search=tool.trimIfNotNull(req.body.searchQuestionnaires); + if(search === null || search === "" || search.length < config.minSearchQuestionnaires) + res.status(400).json(txtQuestionnaireAccess.searchIsNotLongEnough); + else + { + const db = require("../models/index"); + const getQuestionnaires=await db.sequelize.query("SELECT `id`,`title` FROM `Questionnaires` WHERE (`title` LIKE :search OR `introduction` LIKE :search OR `keywords` LIKE :search) ORDER BY `title` ASC", { replacements: { search: "%"+search+"%" }, type: QueryTypes.SELECT }); + res.status(200).json(getQuestionnaires); + } + next(); + } + catch(e) + { + next(e); + } +} + +// Retourne les statistiques concernant les questionnaires +exports.getStats = async(req, res, next) => +{ + try + { + const stats=await getStatsQuestionnaires(); + res.status(200).json(stats); + } + catch(e) + { + next(e); + } +} + +// Liste des prochains questionnaires devant être publiés. +// On vérifie à chaque fois si ils ont ce qu'il faut pour être publiables +// On en profite pour chercher la prochaine date sans questionnaire programmé +exports.getListNextQuestionnaires = async(req, res, next) => +{ + try + { + let questionnaires=await getNextQuestionnaires(); + let dateNeeded="", questionnairesDatas, dateSearch, dateQuestionnaire; + for(let i in questionnaires) + { + questionnairesDatas=await searchQuestionnaireById(questionnaires[i].id); + questionnaires[i].isPublishable=checkQuestionnaireIsPublishable(questionnairesDatas, false); // le questionnaire est-il complet ? + if(dateNeeded==="") // si il y a plus de 24H entre deux dates de publication, c'est mal ! + { + if(i==0) + dateSearch=new Date(Date.now()+3600*1000*24); + else + dateSearch=new Date(questionnaires[i-1].datePublishing).getTime()+3600*1000*24; + dateQuestionnaire=new Date(questionnaires[i].datePublishing).getTime(); + if(dateQuestionnaire > dateSearch) + dateNeeded=dateSearch; + } + } + if(questionnaires.length > 0 && dateNeeded==="") + dateNeeded=new Date(dateQuestionnaire+3600*1000*24);// le jour suivant celui du dernier questionnaire + else + dateNeeded=new Date();// rien pour ce jour + res.status(200).json({questionnaires: questionnaires, dateNeeded: dateNeeded }); + next(); + } + catch(e) + { + next(e); + } +} + +// test si des questionnaires doivent être publiés +// puis (re)génère tous les fichiers HTML des questionnaires + les pages accueil + news +// la requête est ensuite passé aux tags qui font la même chose +exports.HTMLRegenerate= async (req, res, next) => +{ + try + { + await checkQuestionnairesNeedToBePublished(); + const nb=await checkQuestionnairesPublishedHaveHTML(true); + creaNewQuestionnairesJson();// provoque mise à jour du HTLM, RSS, etc. + res.messageToNext=txtQuestionnaire.haveBeenRegenerated.replace("#NB1", nb); + next(); + } + catch(e) + { + next(e); + } +} + +// CRONS +exports.deleteJsonFiles= async (req, res, next) => +{ + // ajouter le suppression des fichiers HTML ? -> plutôt le faire manuellement lors de la suppression du questionnaire + try + { + const db = require("../models/index"); + const questionnaires=await db["Questionnaire"].findAll({ attributes: ["id"] }); + let saveFiles=[]; + for(let i in questionnaires) + saveFiles.push(questionnaires[i].id+".json"); + const deleteFiles = await toolFile.deleteFilesInDirectory(config.dirCacheQuestionnaires, saveFiles); + res.status(200).json(deleteFiles); + next(); + } + catch(e) + { + next(e); + } +} + +// test si des questionnaires doivent être publiés +// + si des questionnaires publiés n'ont pas fichier html +// si fichier html créé il faut aussi actualiser la page d'accueil & co +exports.checkQuestionnairesNeedToBePublished= async (req, res, next) => +{ + try + { + await checkQuestionnairesNeedToBePublished(); + const nb=await checkQuestionnairesPublishedHaveHTML(); + if(nb > 0) + creaNewQuestionnairesJson();// provoque mise à jour du HTLM, RSS, etc. + res.status(200).json(txtQuestionnaire.haveBeenPublished.replace(":NB", nb)); + console.log(txtQuestionnaire.haveBeenPublished.replace(":NB", nb)); + await toolMail.sendMail(0, config.adminEmail, "Publication articles", txtQuestionnaire.haveBeenPublished.replace(":NB", nb), "

"+txtQuestionnaire.haveBeenPublished.replace(":NB", nb)+"

"); + next(); + } + catch(e) + { + next(e); + } +} + + +// FONCTIONS UTILITAIRES + +const creaQuestionnaireJson = async (id) => +{ + const db = require("../models/index"); + const Questionnaire=await db["Questionnaire"].findByPk(id); + if(Questionnaire) + { + let datas={ Questionnaire }; + const Tags=await db["QuestionnaireClassification"].findAll({ where: { QuestionnaireId: Questionnaire.id }, attributes: ["TagId"] }); + if(Tags) + datas.Tags=Tags; + const Illustrations=await db["Illustration"].findAll({ where: { QuestionnaireId: Questionnaire.id } }); + if(Illustrations) + datas.Illustrations=Illustrations; + const Links=await db["Link"].findAll({ where: { QuestionnaireId: Questionnaire.id } }); + if(Links) + datas.Links=Links; + const Questions=await db["Question"].findAll({ where: { QuestionnaireId: Questionnaire.id }, order: [["rank", "ASC"], ["createdAt", "ASC"]], attributes: ["id"] }); + if(Questions) + datas.Questions=Questions; + const wasPublished=datas.Questionnaire.isPublished; + datas.Questionnaire.isPublished=checkQuestionnaireIsPublishable(datas); + // important d'écrire le fichier ici, car il est nécessaire aux autres fonctions appelées ci-dessous + await toolFile.createJSON(config.dirCacheQuestionnaires, id, datas); + if(datas.Questionnaire.isPublished!==wasPublished) + { + await db["Questionnaire"].update({ isPublished:datas.Questionnaire.isPublished }, { where: { id : id } , fields: ["isPublished"], limit:1 }); + // + liste des tags utilisés : + tagCtrl.creaUsedTagsJson(); + // si le quiz était publié jusqu'ici, il me faut supprimer son fichier HTML (revenir pour réactiver) + /*if(wasPublished) + toolFile.deleteFile(config.dirHTMLQuestionnaire, Questionnaire.slug+".html");*/ + } + // peut impacter la liste des derniers si des informations affichées ont changé + creaNewQuestionnairesJson();// peut avoir été impacté + // + les listes de quizs / tags : + for(let i in Tags) + tagCtrl.creaQuestionnairesTagJson(Tags[i].TagId) // ! Json + HTML, donc potentiellement long. + if(datas.Questionnaire.isPublished) + await creaQuestionnaireHTML(id); + return datas; + } + else + return false; +} +exports.creaQuestionnaireJson = creaQuestionnaireJson; + +const checkQuestionnaireIsPublishable = (datas, checkDate=true) => +{ + if(checkDate) + { + if(datas.Questionnaire.publishingAt===null) + return false; + else + { + const today=new Date(); + today.setHours(0,0,0,0);// !! attention au décalage horaire du fait de l'enregistrement en UTC dans mysql + const publishingAt=new Date(datas.Questionnaire.publishingAt); + if (publishingAt.getTime() > today.getTime()) + return false; + } + } + if(datas.Questions==undefined || datas.Questions.length < config.nbQuestionsMin) // le nombre de réponses mini étant contrôlé au moment de l'enregistrement de la question + return false; + if(datas.Tags==undefined || datas.Tags.length < configTags.nbTagsMin) + return false; + if(datas.Links==undefined || datas.Links.length < configLinks.nbLinksMin) + return false; + if(datas.Illustrations==undefined || datas.Illustrations.length < configIllustrations.nbIllustrationsMin) + return false; + return true; +} + +const creaQuestionnaireHTML = async (id, preview=false) => +{ + // besoin de toutes les infos concernant le questionnaire pour les transmettre à la vue + // à terme : séparer la création de la partie body pouvant être retournée pour recharger page, de la génération complète pour créer le fichier html + const questionnaire=await searchQuestionnaireById(id, true); + if(!questionnaire) + return false; + if(questionnaire.Questionnaire.isPublished===false && preview===false) + return false; + const compiledFunction = pug.compileFile("./views/"+config.theme+"/quiz.pug"); + const configTpl = require("../views/"+config.theme+"/config/"+config.availableLangs[0]+".js"); + const pageDatas= + { + config: config, + configTpl: configTpl, + tool: tool, + txtGeneral : txtGeneral, + txtQuestionnaire: txtQuestionnaire, + txtIllustration: txtIllustration, + pageLang: questionnaire.Questionnaire.language, + metaDescription: tool.shortenIfLongerThan(config.siteName+" : "+striptags(questionnaire.Questionnaire.introduction.replace("
", " ").replace("

", " ")), 200), + author: questionnaire.Questionnaire.CreatorName, + pageTitle: questionnaire.Questionnaire.title+" ("+txtQuestionnaire.questionnairesName+")", + contentTitle: questionnaire.Questionnaire.title, + questionnaire: questionnaire, + linkCanonical: config.siteUrl+"/"+config.dirHTMLQuestionnaire+"/"+questionnaire.Questionnaire.slug+".html" + } + const html=await compiledFunction(pageDatas); + if(preview===false) + { + await toolFile.createHTML(config.dirHTMLQuestionnaire, questionnaire.Questionnaire.slug, html); + return true; + } + else + return html; +} + +const searchQuestionnaireById = async (id, reassemble=false) => +{ + let questionnaire=await toolFile.readJSON(config.dirCacheQuestionnaires, id); + if(!questionnaire) + questionnaire=await creaQuestionnaireJson(id); + if(!questionnaire) + return false; + if(reassemble) + { + let question; Questions=[]; + const author=await userCtrl.searchUserById(questionnaire.Questionnaire.CreatorId); + if(author) + questionnaire.Questionnaire.CreatorName=author.User.name; + for(i in questionnaire.Questions) + { + question=await questionCtrl.searchQuestionById(questionnaire.Questions[i].id); + if(question) + Questions.push(question); + } + questionnaire.Questions=Questions; + const tags=await tagCtrl.getTagsQuestionnaire(id); + if(tags) + questionnaire.Tags=tags; + } + return questionnaire; +} +exports.searchQuestionnaireById = searchQuestionnaireById; + +// Cherche si il y a des questionnaires dont la date de publication est passée mais qui ne sont pas notés comme publiés +// Vérifie si ils sont publiables et si oui change leur statut et réactualise le cache json +const checkQuestionnairesNeedToBePublished = async () => +{ + const db = require("../models/index"); + const questionnaires= await db.sequelize.query("SELECT `id` FROM `Questionnaires` WHERE `publishingAt` < NOW() AND `isPublished` = false", { type: QueryTypes.SELECT }); + let questionnaireDatas; + for(let i in questionnaires) + { + questionnaireDatas=await searchQuestionnaireById(questionnaires[i].id, true); + if(checkQuestionnaireIsPublishable(questionnaireDatas)) + { + await db["Questionnaire"].update({ isPublished:true }, { where: { id : questionnaires[i].id } , fields: ["isPublished"], limit:1 }); + creaQuestionnaireJson(questionnaires[i].id);// provoque normalement la création du HTML + } + } +} + +// Contrôle si tous les fichiers devant être publiés ont bien leur fichier HTML, sinon le génère +// Si regenerate true, tous les fichiers sont générés, même si ils existent déjà (évolution template...) +// Retourne le nombre de fichiers ayant été régénérés +const checkQuestionnairesPublishedHaveHTML = async (regenerate=false) => +{ + const db = require("../models/index"); + const questionnaires= await db.sequelize.query("SELECT `id`,`slug` FROM `Questionnaires` WHERE `isPublished` = true", { type: QueryTypes.SELECT }); + let nb=0; + for(let i in questionnaires) + { + if(regenerate) + { + await creaQuestionnaireHTML(questionnaires[i].id); + nb++; + } + else if(await toolFile.checkIfFileExist(config.dirHTMLQuestionnaire, questionnaires[i].slug+".html")===false) + { + await creaQuestionnaireHTML(questionnaires[i].id); + console.log("je viens de publier le questionnaire :"+questionnaires[i].slug); + await toolMail.sendMail(0, config.adminEmail, "Publication d'un article", "Je viens de publier le quiz : "+config.siteUrl+"/quizs/"+questionnaires[i].slug+".html", "

Je viens de publier le quiz : "+config.siteUrl+"/quizs/"+questionnaires[i].slug+".html

"); + nb++; + } + } + return nb; +} + +// Liste des derniers questionnaires publiés (utile pour page d'accueil, flux rss, etc.) +const creaNewQuestionnairesJson = async () => +{ + const db = require("../models/index"); + const Questionnaires=await db["Questionnaire"].findAll({ where: { isPublished : true }, order: [["updatedAt", "DESC"], ["id", "DESC"]], attributes: ["id"], limit: config.nbNewQuestionnaires }); + if(Questionnaires) + { + await toolFile.createJSON(config.dirCacheQuestionnaires, "last", Questionnaires); + creaNewQuestionnairesHTML(Questionnaires); + return Questionnaires; + } + else + return false; +} +exports.creaNewQuestionnairesJson = creaNewQuestionnairesJson; + +// Se limite à compter le nombre total de questionnaires et à le stocker pour éviter de lancer une requête sql à chaque fois +const creaStatsQuestionnairesJson = async () => +{ + const db = require("../models/index"); + const Questionnaires=await db["Questionnaire"].findAll({ attributes: ["id"] }); + const QuestionnairesPublished=await db["Questionnaire"].findAll({ where: { isPublished : true }, attributes: ["id"] }); + if(Questionnaires && QuestionnairesPublished) + { + const stats = + { + nbTot : Questionnaires.length, + nbPublished : QuestionnairesPublished.length + } + await toolFile.createJSON(config.dirCacheQuestionnaires, "stats", stats); + return stats; + } + else + return false; +} +exports.creaStatsQuestionnairesJson = creaStatsQuestionnairesJson; + +// Retourne les données créées par la fonction précédente +const getStatsQuestionnaires = async () => +{ + let stats=await toolFile.readJSON(config.dirCacheQuestionnaires, "stats"); + if(!stats) + stats=await creaStatsQuestionnairesJson(); + if(!stats) + return false; + else + return stats; +} +exports.getStatsQuestionnaires = getStatsQuestionnaires; + +// Quelle est la prochaine date pour laquelle aucun questionnaire n'a été publié ? +const getDateNewQuestionnaireNeeded = async (maxDays) => +{ + const db = require("../models/index"); + let dateNeed="", checkDate, addMin=0, addMax=1; + while(dateNeed==="") + { + checkDate = await db.sequelize.query("SELECT ADDDATE(CURDATE(), :addMin) as `dateNeeded` FROM `Questionnaires` WHERE `isPublished`=1 AND `publishingAt` > ADDDATE(CURDATE(), :addMin) AND `publishingAt`< ADDDATE(CURDATE(), :addMax) ORDER BY `publishingAt` LIMIT 1", { replacements: { addMin: addMin, addMax: addMax }, type: QueryTypes.SELECT }); + if(checkDate && getSubscriptions24H.length>0) + dateNeed=checkDate.dateNeeded; + else + { + addMin++; + addMax++; + } + if(addMin>maxDays) + return false; + } + return dateNeed; +} +exports.getDateNewQuestionnaireNeeded = getDateNewQuestionnaireNeeded; + +// Les prochains questionnaires devant être publiés (permet aux gestionnaires de voir les dates vides) +const getNextQuestionnaires = async () => +{ + const db = require("../models/index"); + const questionnaires= await db.sequelize.query("SELECT `id`,`title`, `publishingAt` as `datePublishing` FROM `Questionnaires` WHERE `publishingAt` > NOW() order by `publishingAt`", { type: QueryTypes.SELECT }); + return questionnaires; +} +exports.getNextQuestionnaires = getNextQuestionnaires; + +const creaNewQuestionnairesHTML = async (Questionnaires) => +{ + // On regénère la page d'accueil avec le(s) dernier(s) questionnaire(s) mis en avant : + let compiledFunction = pug.compileFile("./views/"+config.theme+"/home.pug"); + const configTpl = require("../views/"+config.theme+"/config/"+config.availableLangs[0]+".js"); + let questionnaires=[]; + for(let i in Questionnaires) + questionnaires.push(await searchQuestionnaireById(Questionnaires[i].id)); + let pageDatas= + { + config: config, + configTpl: configTpl, + tool: tool, + striptags: striptags, + txtGeneral : txtGeneral, + txtQuestionnaire: txtQuestionnaire, + txtIllustration: txtIllustration, + pageLang: config.adminLang, + metaDescription: txtGeneral.siteMetaDescription, + pageTitle: txtGeneral.siteHTMLTitle, + contentTitle: config.siteName, + questionnaires: questionnaires, + linkCanonical: config.siteUrl + } + let html=await compiledFunction(pageDatas); + await toolFile.createHTML(config.dirHTML, "index", html); + // + la page listant les X derniers quizs + liste des tags + compiledFunction=pug.compileFile("./views/"+config.theme+"/newQuestionnaires.pug"); + pageDatas.metaDescription=configTpl.newQuestionnairesIntro; + pageDatas.pageTitle=configTpl.newQuestionnairesTitle; + pageDatas.linkCanonical=config.siteUrl+"/"+configQuestionnaires.dirWebTags; + pageDatas.tags=await tagCtrl.getUsedTags(); + html=await compiledFunction(pageDatas); + await toolFile.createHTML(configQuestionnaires.dirHTMLTags, "index", html); + return true; +} + +// À partir d'une liste d'id questionnaires fournis, retourne la liste complète ou partielle (pagination) avec les infos de chaque questionnaire +// Retour en html ou json suivant les cas +const getListingsQuestionnairesOuput = async (Questionnaires, begin=0, end=null, output="") => +{ + const datas= { nbTot: Questionnaires.length, questionnaires: [], html: "" }; + if(datas.nbTot!==0) + { + if(end===null) + end=datas.nbTot; + for (let i = begin; i <= end; i++) + { + if(Questionnaires[i]===undefined) + break; + else + datas.questionnaires.push(await searchQuestionnaireById(Questionnaires[i].id)); + } + // Utiles pour savoir où j'en suis rendu dans le front : + datas.begin=begin; + datas.end=end; + if(output==="html") + { + const compiledFunction = pug.compileFile("./views/"+config.theme+"/includes/listing-questionnaires.pug"); + const pageDatas= + { + tool: tool, + striptags: striptags, + txtGeneral: txtGeneral, + txtIllustration: txtIllustration, + questionnaires: datas.questionnaires, + nbQuestionnairesList:configTpl.nbQuestionnairesUserHomePage + } + datas.html=await compiledFunction(pageDatas); + datas.questionnaires=null;// allège un peu le contenu retourné... + } + } + return datas; +} +exports.getListingsQuestionnairesOuput = getListingsQuestionnairesOuput; \ No newline at end of file diff --git a/controllers/subscription.js b/controllers/subscription.js new file mode 100644 index 0000000..aa56b2b --- /dev/null +++ b/controllers/subscription.js @@ -0,0 +1,391 @@ +// Contrôleurs gérant l'abonnement de l'utilisateur mais aussi les questionnaires auxquels il a accès + +const { Op, QueryTypes } = require("sequelize");// pour certaines requêtes sql +const jwt = require("jsonwebtoken"); + +const config = require("../config/main"); +const configQuestionnaires = require("../config/questionnaires"); +const configTpl = require("../views/"+config.theme+"/config/"+config.availableLangs[0]+".js"); + +const tool = require("../tools/main"); +const toolFile = require("../tools/file"); +const toolMail = require("../tools/mail"); + +const txt = require("../lang/"+config.adminLang+"/subscription"); +const txtQuestionnaire= require("../lang/"+config.adminLang+"/questionnaire"); +const txtQuestionnaireAccess= require("../lang/"+config.adminLang+"/questionnaireaccess"); +const txtGeneral= require("../lang/"+config.adminLang+"/general"); + +const answerCtrl = require("./answer"); +const questionnaireCtrl = require("./questionnaire"); +const userCtrl = require("./user"); + +// Clic sur lien de désabonnement aux alertes email +exports.unsubscribeLink = async (req, res, next) => +{ + try + { + const db = require("../models/index"); + const userDatas= await userCtrl.checkTokenUser(req.params.token); + await db["User"].update({ newsletterOk: false }, { where: { id : userDatas.User.id }, limit:1 }); + await db["Subscription"].update({ noticeOk: false }, { where: { UserId : userDatas.User.id }, limit:1 }); + userCtrl.creaUserJson(userDatas.User.id); + res.status(200).json({ message: txt.unsubscriptionOk }); + next(); + } + catch(e) + { + next(e); + } +} + +// CRONS + +// + une autre notification le jour "J" ??? vérifier si l'utilisateur actif les dernières 48H et laisser les autres tranquilles ? +exports.notifyExpirationFreeAccount= async(req, res, next) => +{ + try + { + const db = require("../models/index"); + const dateExpirationMin=new Date(new Date().getTime()-(config.freeAccountTimingInDays-config.freeAccountExpirationNotificationInDays+1)*24*3600*1000); + const dateExpirationMax=new Date(new Date().getTime()-(config.freeAccountTimingInDays-config.freeAccountExpirationNotificationInDays)*24*3600*1000); + console.log("je cherche les utilisateurs freemium dont l'abonnement a été créé entre le "+dateExpirationMin+" et le "+dateExpirationMax+"."); + const users=await db["Subscription"].findAll( + { + where: + { + [Op.and]: + [ + { numberOfDays: config.freeAccountTimingInDays }, + { createdAt: { [Op.gte]: dateExpirationMin } }, + { createdAt: { [Op.lt]: dateExpirationMax } } + ] + }, + attributes: ["UserId"] + }); + const sendNotification = async (user) => + { + let userInfos=await userCtrl.searchUserById(user.UserId); + if(userInfos && userInfos.User.status=="user") + { + //const token=jwt.sign({ userId: userInfos.User.id }, config.tokenPrivateKey, { expiresIn: config.tokenLoginLinkTimeInHours }); + const mapMail = + { + SITE_NAME: config.siteName, + USER_NAME: userInfos.User.name, + LINK_URL : config.siteUrl+"/"+configTpl.updateAccountPage+"#abo" + }; + const mailDatas= + { + mailSubject: txt.mailEndFreeTimeSubject, + mailPreheader: txt.mailEndFreeTimeSubject, + mailTitle: txt.mailEndFreeTimeSubject, + mailHeaderLinkUrl: config.siteUrl+"/"+configTpl.updateAccountPage+"#abo", + mailHeaderLinkTxt: txt.mailEndFreeTimeLinkTxt, + mailMainContent: tool.replaceAll(txt.mailEndFreeTimeBodyHTML, mapMail), + linksCTA: [{ url:config.siteUrl+"/"+configTpl.updateAccountPage+"#abo", txt:txt.mailEndFreeTimeLinkTxt }], + mailRecipientAddress: userInfos.User.email + } + await toolMail.sendMail(userInfos.User.smtp, userInfos.User.email, txt.mailEndFreeTimeSubject, tool.replaceAll(txt.mailEndFreeTimeBodyTxt, mapMail), "", mailDatas); + } + } + for(let i in users) + sendNotification(users[i]); + if(res.message) + res.message+="\n"+users.length+txt.mailEndFreeTimeMessage; + else + res.message=users.length+txt.mailEndFreeTimeMessage; + res.status(200).json(true); + console.log(users.length+txt.mailEndFreeTimeMessage); + next(); + } + catch(e) + { + next(e); + } +} + +exports.notifyExpirationAccount= async(req, res, next) => +{ // utiliser la vue puis des recherches en sql natif ou ajouter un modèle : https://stackoverflow.com/questions/48407329/cant-able-to-create-views-in-mysql-using-sequelize-orm + try + { + const db = require("../models/index"); + const getUsers= async (nbDays) => + { + const dateExpirationMin=new Date(new Date().getTime()+nbDays*24*3600*1000); + const dateExpirationMax=new Date(new Date().getTime()+(nbDays+1)*24*3600*1000); + const users=await db["Subscription"].findAll( + { + where: + { + [Op.and]: + [ + { numberOfDays: { [Op.gt]: config.freeAccountTimingInDays } }, + db.sequelize.where(db.sequelize.fn('ADDDATE', db.sequelize.col('createdAt'), db.sequelize.literal('INTERVAL `numberOfDays` DAY')), { [Op.gte]: dateExpirationMin }), + db.sequelize.where(db.sequelize.fn('ADDDATE', db.sequelize.col('createdAt'), db.sequelize.literal('INTERVAL `numberOfDays` DAY')), { [Op.lt]: dateExpirationMax }) + ] + }, + attributes: ["UserId"], + }); + return users; + } + const sendNotification= async (user, mail) => // utiliser la paramètre "mail" pour adapter le texte du mail ! + { + let userInfos=await searchUserById(user.UserId); + if(userInfos && userInfos.User.status=="user") + { + //const token=jwt.sign({ userId: userInfos.User.id }, config.tokenPrivateKey, { expiresIn: config.tokenLoginLinkTimeInHours }); + const mapMail = + { + SITE_NAME: config.siteName, + USER_NAME: userInfos.User.name, + LINK_URL : config.siteUrl+"/"+configTpl.updateAccountPage+"#abo" + }; + const mailDatas= + { + mailSubject: txt.mailExpirationSubject, + mailPreheader: txt.mailExpirationSubject, + mailTitle: txt.mailExpirationSubject, + mailHeaderLinkUrl: config.siteUrl+"/"+configTpl.updateAccountPage+"#abo", + mailHeaderLinkTxt: txt.mailExpirationLinkTxt, + mailMainContent: tool.replaceAll(txt.mailExpirationBodyHTML, mapMail), + linksCTA: [{ url:config.siteUrl+"/"+configTpl.updateAccountPage+"#abo", txt:txt.mailExpirationLinkTxt }], + mailRecipientAddress: userInfos.User.email + } + await toolMail.sendMail(userInfos.User.smtp, userInfos.User.email, txt.mailExpirationSubject, tool.replaceAll(txt.mailExpirationBodyTxt, mapMail), "", mailDatas); + } + } + // première salve : + let users1=await getUsers(config.accountExpirationFirstNotificationInDays); + for(i in users1) + sendNotification(users1[i], "first"); + // deuxième relance : + let users2=await getUsers(config.accountExpirationSecondNotificationInDays); + for(i in users2) + sendNotification(users2[i], "second"); + if(res.message) + res.message+="\n"+tool.replaceAll(txt.mailExpirationMessage, { FIRST:users1.length , SECOND:users2.length }); + else + res.message=tool.replaceAll(txt.mailExpirationMessage, { FIRST:users1.length , SECOND:users2.length }); + res.status(200).json(true); + next(); + } + catch(e) + { + next(e); + } +} + +// CRON donnant accès à l'utilisateur à nouveau quiz suivant son choix +exports.addNewQuestionnaireUsers = async(req, res, next) => +{ + try + { + const db = require("../models/index"); + // Utilisateurs dont l'abonnement est toujours actif et souhaitant recevoir un nouveau quiz le jour de l'appel de cette méthode. + // Le tout en heure locale et en ignorant ceux qui ont déjà été servis ce jour. + const subscriptionsOk = await db.sequelize.query("SELECT `Subscriptions`.`id` as SubscriptionId, `UserId`, `name`, `email`, `smtp`, `language`, `noticeOk`, `receiptDays`, ADDDATE(UTC_TIMESTAMP, INTERVAL `timeDifference` MINUTE) AS localDate FROM `Subscriptions` INNER JOIN `Users` ON `Subscriptions`.`UserId`=`Users`.`id` WHERE `status`='user' AND ADDDATE(`Subscriptions`.`createdAt`, `numberOfDays`) > UTC_TIMESTAMP HAVING HOUR(localDate) > "+config.hourGiveNewQuestionnaireBegin+" AND HOUR(localDate) < "+config.hourGiveNewQuestionnaireEnd+" AND LOCATE(DAYOFWEEK(localDate),receiptDays)!=0 AND SubscriptionId NOT IN (SELECT DISTINCT `SubscriptionId` FROM `Pauses` WHERE ADDDATE(`startingAt`, INTERVAL `timeDifference` MINUTE) <= localDate AND ADDDATE(`endingAT`, INTERVAL `timeDifference` MINUTE) > localDate) AND `UserId` NOT IN (SELECT DISTINCT `UserId` FROM `QuestionnaireAccesses` WHERE DATEDIFF(NOW(),`createdAt`) < 1 AND `selfCreatedOk` = false) LIMIT "+config.numberNewQuestionnaireAtSameTime, { type: QueryTypes.SELECT }); + if(subscriptionsOk.length===0) + { + res.status(200).json({ message: txt.allSubscriptionProcessed }); + //console.log(txt.allSubscriptionProcessed); + } + else + { + await toolMail.sendMail(0, config.adminEmail, "Abonnements à traiter", subscriptionsOk.length+" abonnements à traiter.", "

"+subscriptionsOk.length+" abonnements à traiter.

"); + let newQuestionnaire, access, questionnaire, token; + for (let i in subscriptionsOk) + { + newQuestionnaire=await db.sequelize.query("SELECT `Questionnaires`.`id`, `title`, `slug`, `introduction`, `url`, `anchor`,`estimatedTime` FROM `Questionnaires` INNER JOIN `Links` ON `Links`.`QuestionnaireId`=`Questionnaires`.`id` WHERE `isPublished`=1 AND `language`='"+subscriptionsOk[i].language+"' AND `Questionnaires`.`id` NOT IN (SELECT `QuestionnaireId` FROM `QuestionnaireAccesses` WHERE `UserId`="+subscriptionsOk[i].UserId+") ORDER BY `id` LIMIT 1", { type: QueryTypes.SELECT }); + if(newQuestionnaire.length!==0) + { + access=await db["QuestionnaireAccess"].create({ QuestionnaireId: newQuestionnaire[0].id, UserId: subscriptionsOk[i].UserId, selfCreatedOk: false }); + if(access) + { + answerCtrl.creaUserQuestionnairesWithoutAnswerJson(subscriptionsOk[i].UserId); + if(subscriptionsOk[i].noticeOk) + { + token=jwt.sign({ userId: subscriptionsOk[i].UserId }, config.tokenPrivateKey, { expiresIn: config.tokenUnsubscribeLinkTimeInDays }); + const mapMail = + { + USER_NAME: subscriptionsOk[i].name, + QUESTIONNAIRE_URL: config.siteUrl+"/"+configQuestionnaires.dirWebQuestionnaire+"/"+newQuestionnaire[0].slug+".html#questionnaire", + UNSUBSCRIBE_URL: config.siteUrl+"/"+configTpl.stopMailPage+token + }; + const mailDatas= + { + mailSubject: newQuestionnaire[0].title, + mailPreheader: newQuestionnaire[0].title, + mailTitle: newQuestionnaire[0].title, + mailHeaderLinkUrl: config.siteUrl+"/"+configTpl.stopMailPage+token, + mailHeaderLinkTxt: txt.mailStopMailLinkTxt, + mailMainContent: newQuestionnaire[0].introduction+"

"+txtQuestionnaire.estimatedTime+" "+txtQuestionnaire.estimatedTimeOption[newQuestionnaire[0].estimatedTime]+".

", + linksCTA: [{ url:newQuestionnaire[0].url, txt:newQuestionnaire[0].anchor }, { url:config.siteUrl+"/"+configQuestionnaires.dirWebQuestionnaire+"/"+newQuestionnaire[0].slug+".html#questionnaire", txt:txtQuestionnaire.btnShowQuestionnaire }], + mailRecipientAddress: subscriptionsOk[i].email + } + toolMail.sendMail(subscriptionsOk[i].smtp, subscriptionsOk[i].email, newQuestionnaire[0].title, tool.replaceAll(txt.mailNewQuestionnaireBodyTxt, mapMail), "", mailDatas); + } + } + } + else + { + if(res.alerte) + res.alerte+="\n"+txt.noNewQuestionnaireForUser+subscriptionsOk[i].email; + else + res.alerte=txt.noNewQuestionnaireForUser+subscriptionsOk[i].UserId; + await toolMail.sendMail(0, config.adminEmail, "Abonné sans nouveau quiz", txt.noNewQuestionnaireForUser+subscriptionsOk[i].email, "

"+txt.noNewQuestionnaireForUser+subscriptionsOk[i].email+"

"); + } + } + res.status(200).json(subscriptionsOk); + console.log(subscriptionsOk); + } + next(); + } + catch(e) + { + next(e); + } +} + + +// FONCTIONS UTILITAIRES + +// Retourne un booléen suivant si l'utilisateur a accès ou non à un questionnaire +const checkQuestionnaireAccess = async (UserId, QuestionnaireId) => +{ + const db = require("../models/index"); + const checkQuestionnaireAccess=await db["QuestionnaireAccess"].findOne({ where: { UserId : UserId, QuestionnaireId : QuestionnaireId }, attributes: ["createdAt"] }); + if(checkQuestionnaireAccess) + return true; + else + return false; +} +exports.checkQuestionnaireAccess = checkQuestionnaireAccess; + +// Combien d'abonnements ont été enregistrés ces dernières 24 H ? depuis le début ? combien sont en premium ? +// Revoir : chercher les dates de paiement WP pour avoir stats 24 H ? +const getStatsSubscriptions = async () => +{ + const db = require("../models/index"); + const getSubscriptions24H = await db.sequelize.query("SELECT `id` FROM `Subscriptions` WHERE `createdAt` > ADDDATE(NOW(), -1)", { type: QueryTypes.SELECT }); + const getSubscriptionsTot = await db.sequelize.query("SELECT `id` FROM `Subscriptions`", { type: QueryTypes.SELECT }); + const getSubscriptionsPremium = await db.sequelize.query("SELECT `id` FROM `Subscriptions` WHERE `numberOfDays` > :nb", { replacements: { nb: config.freeAccountTimingInDays }, type: QueryTypes.SELECT }); + if(getSubscriptions24H && getSubscriptionsTot && getSubscriptionsPremium) + { + const stats = + { + nbSubscriptions24H : getSubscriptions24H.length, + nbSubscriptionsTot : getSubscriptionsTot.length, + nbSubscriptionsPremium : getSubscriptionsPremium.length + } + return stats; + } + else + return false; +} +exports.getStatsSubscriptions = getStatsSubscriptions; + +/* Abandonné pour l'instant + * +// Recherche par mots-clés parmis les questionnaires auxquels l'utilisateur a accès !! où ceux auxquels il a répondu ? est-ce que cela a un intérêt ? +// Seul un certain nombre de résultats est renvoyé (pagination) +exports.searchQuestionnaires = async (req, res, next) => +{ + try + { + let search=tool.trimIfNotNull(req.body.searchQuestionnaires); + if(search === null || search === "" || search.length < config.minSearchQuestionnaires) + res.status(400).json(txtQuestionnaireAccess.searchIsNotLongEnough); + else + { + const db = require("../models/index"); + const getQuestionnaires=await db.sequelize.query("SELECT `Questionnaires`.`id` FROM `Questionnaires` INNER JOIN `QuestionnaireAccesses` WHERE `Questionnaires`.`id`=`QuestionnaireAccesses`.`QuestionnaireId` AND `QuestionnaireAccesses`.`UserId`=:id AND `Questionnaires`.`isPublished` = 1 AND (`Questionnaires`.`title` LIKE :search OR `Questionnaires`.`introduction` LIKE :search)", { replacements: { id: req.connectedUser.User.id, search: "%"+search+"%" }, type: QueryTypes.SELECT }); + let begin=0, end, output=""; + if(!tool.isEmpty(req.body.begin)) + begin=req.body.begin; + end=begin+configTpl.maxQuestionnairesByPage-1;// commence à 0 ! + if(req.body.output!==undefined) + output=req.body.output; + datas=await questionnaireCtrl.getListingsQuestionnairesOuput(getQuestionnaires, begin, end, output); + res.status(200).json(datas); + } + next(); + } + catch(e) + { + next(e); + } +} + +// Retourne un questionnaire au hasard parmi ceux auxquels l'utilisateur a accès +exports.getOneRandomQuestionnaire = async(req, res, next) => +{ + try + { + const questionnaires=await getUserQuestionnaires(req.params.id, false); + if(!questionnaires || questionnaires.ids.length===0) + res.status(404).json({ txtCode: "notFound" }); + else + { + const randomInt=tool.getRandomInt(0, questionnaires.ids.length); + const questionnaire=await questionnaireCtrl.searchQuestionnaireById(questionnaires.ids[randomInt]); + if(questionnaire) + res.status(200).json(questionnaire); + else + throw { message : txtQuestionnaireAccess.notFound+questionnaires.ids[randomInt], status : 404 }; + } + next(); + } + catch(e) + { + next(e); + } +} + +// Retourne la liste des questionnaires auxquels un utilisateur a accès. +// Ils sont listés par ordre de fraîcheur, les + récents étant en début de liste +// Si un questionnaire de début et un nombre de questionnaires sont fournis, l'ensemble des informations du questionnaire sont retournées +// Sinon, seulement les ids. +exports.getQuestionnairesByUser = async(req, res, next) => +{ + try + { + let datas; + if(req.params.begin && req.params.nb) + datas=await getUserQuestionnaires(req.params.id, true, req.params.begin, req.params.nb); + else + datas=await getUserQuestionnaires(req.params.id, false); + if(datas) + res.status(200).json(datas); + else + res.status(404).json(txtQuestionnaire.notFound); + next(); + } + catch(e) + { + next(e); + } +} +* +// Création du fichier des identifiants des questionnaires d'un utilisateur +// Les premiers étant les derniers +const creaUserQuestionnairesJson = async (UserId) => +{ + UserId=tool.trimIfNotNull(UserId); + if(UserId===null) + return false; + const db = require("../models/index"); + const userQuestionnaires=await db.sequelize.query("SELECT `QuestionnaireId` FROM `QuestionnaireAccesses` WHERE `UserId`=:id ORDER BY `createdAt` DESC", { replacements: { id: UserId }, type: QueryTypes.SELECT }); + if(userQuestionnaires) + { + const questionnairesId=[];// les ids suffisent et allègent le fichier + for(i in userQuestionnaires) + questionnairesId.push(userQuestionnaires[i].QuestionnaireId); + await toolFile.createJSON(config.dirCacheUsersQuestionnaires, UserId, { ids: questionnairesId }); + return { ids: questionnairesId }; + } + else + return false; +} +exports.creaUserQuestionnairesJson = creaUserQuestionnairesJson; +* */ \ No newline at end of file diff --git a/controllers/tag.js b/controllers/tag.js new file mode 100644 index 0000000..416af73 --- /dev/null +++ b/controllers/tag.js @@ -0,0 +1,321 @@ +const { Op, QueryTypes } = require("sequelize");// pour certaines requêtes sql + +const pug = require("pug"); +var striptags = require("striptags"); + +const config = require("../config/main.js"); +const configTags = require("../config/tags.js"); + +const tool = require("../tools/main"); +const toolError = require("../tools/error"); +const toolFile = require("../tools/file"); + +const questionnaireCtrl = require("./questionnaire"); + +const txt = require("../lang/"+config.adminLang+"/tag"); +const txtGeneral = require("../lang/"+config.adminLang+"/general"); +const txtQuestionnaire = require("../lang/"+config.adminLang+"/questionnaire"); +const txtIllustration = require("../lang/"+config.adminLang+"/illustration"); + +// Actualise le classement d'un questionnaire suivant les tags envoyés +exports.checkTags = async (req, res, next) => +{ + try + { + if(req.body.QuestionnaireId==undefined) + throw { message: txt.neededParams }; + const tagsCurrent=await getUsedTagsQuestionnaire(req.body.QuestionnaireId); + if(tagsCurrent===false) + throw { message: txt.tagsForQuestionnaireNotFound }; + const tagsReceived=req.body.classification.split(",");// ! peut être vide si pas/plus de classement souhaité + for(i in tagsReceived) + tagsReceived[i]=tagsReceived[i].trim().toLowerCase();// ! gestion de la casse différente pour JS, pas pour Mysql + // les tags jusqu'ici associés sont-ils toujours utilisés ? + let deleteLink; + for (i in tagsCurrent) + { + if(tagsReceived.indexOf(tagsCurrent[i].name.toLowerCase())===-1) + deleteLink=await unlinkTagQuestionnaire(tagsCurrent[i].id, req.body.QuestionnaireId); + } + // parmis les tags envoyés, certains sont-ils nouveaux pour ce questionnaire ? + let findTag=false, creaLink; + for(i in tagsReceived) + { + for(j in tagsCurrent) + { + if(tagsCurrent[j].name.toLowerCase()===tagsReceived[i]) + { + findTag=true; + break; + } + } + if(!findTag && tagsReceived[i]!=="") // revoir : remettre les majuscules lors de l'enregistrement ? + { + creaLink=await linkTagQuestionnaire(tagsReceived[i], req.body.QuestionnaireId); + if(creaLink!==true) + throw creaLink;// nécessaire pour retourner les erreurs du modèle (mais uniquement "tag trop long" possible) + } + findTag=false; + } + await questionnaireCtrl.creaQuestionnaireJson(req.body.QuestionnaireId);// attendre avant de répondre pour que cela pris en compte au réaffichage + if(req.method=="PUT") + res.status(200).json({ message: txtGeneral.updateOkMessage }); + else if(req.method=="POST") + res.status(201).json({ message: txtGeneral.addOkMessage, id:req.body.QuestionnaireId }); + next(); + } + catch(e) + { + const returnAPI=toolError.returnSequelize(e); + if(returnAPI.messages) + { + res.status(returnAPI.status).json({ errors : returnAPI.messages }); + next(); + } + else + next(e); + } +} + +// Retourne la liste des tags déjà connus débutant par l'expression donnée : +exports.getTagsBeginningBy = async (req, res, next) => +{ + try + { + let tags=await getAllTags(), tagsOk=[], search=req.body.search.trim().toLowerCase(), item; + if(search.length >= 2) + { + for(i in tags) + { + + item=tags[i].name.toLowerCase();// restera le problème des accents + if(item.startsWith(search)) + tagsOk.push(tags[i]); + } + } + res.status(200).json(tagsOk); + next(); + } + catch(e) + { + next(e); + } +} + +// Fais suite à la même fonction dans questionnaire.js +// Va récupérer la liste des tags utilisés pour classer au moins un questionnaire publié +// Puis regénère les fichiers HTML pour chacun de ces tags +exports.HTMLRegenerate= async (req, res, next) => +{ + try + { + const tagsUsed=await getUsedTags(); + for(let i in tagsUsed) + await creaQuestionnairesTagJson(tagsUsed[i].id);// provoque la regénération du json + du html + res.status(200).json({ message: res.messageToNext.replace("#NB2", tagsUsed.length) }); + res.messageToNext=null; + next(); + } + catch(e) + { + next(e); + } +} + +// UTILITAIRES + +// Créer la liste de tous les tags présents dans la base de données +const creaAllTagsJson = async () => +{ + const db = require("../models/index"); + const tags=await db["Tag"].findAll(); + await toolFile.createJSON(configTags.dirCacheTags, "all", tags); + return tags; +} + +// Retourne la liste de tous les tags +const getAllTags = async () => +{ + const tags=await toolFile.readJSON(configTags.dirCacheTags, "all"); + if(tags) + return tags; + else + return await creaAllTagsJson(); +} + +// Créer la liste de tous tags utilisés pour classer au moins un quiz publié +const creaUsedTagsJson = async () => +{ + const db = require("../models/index"); + const tags = await db.sequelize.query("SELECT DISTINCT `Tags`.`id`,`Tags`.`name`,`Tags`.`slug` FROM `Tags` INNER JOIN `QuestionnaireClassifications` INNER JOIN `Questionnaires` WHERE `Tags`.`id`=`QuestionnaireClassifications`.`TagId` AND `QuestionnaireClassifications`.`QuestionnaireId`=`Questionnaires`.`id` AND `Questionnaires`.`isPublished`=true ORDER BY `name` ASC", { type: QueryTypes.SELECT , model: db["Tag"], mapToModel: true }); + await toolFile.createJSON(configTags.dirCacheTags, "used", tags); + return tags; +} +exports.creaUsedTagsJson = creaUsedTagsJson;// utile pour actualiser en cas de publication/dépublication d'un quiz + +// Retourne la liste des tags utilisés +const getUsedTags = async () => +{ + const tags=await toolFile.readJSON(configTags.dirCacheTags, "used"); + if(tags) + return tags; + else + return await creaUsedTagsJson(); +} +exports.getUsedTags = getUsedTags; + +// Retourne la liste des tags d'un questionnaire avec leurs noms, slugs, etc. +const getUsedTagsQuestionnaire = async (id) => +{ + id=tool.trimIfNotNull(id); + if(id===null) + return false; + const questionnaire=await questionnaireCtrl.searchQuestionnaireById(id); + if(!questionnaire) + throw { message: txtQuestionnaire.notFound }; + else + { + const allTags=await getAllTags(); + let tagsQuestionnaire=[]; + for(i in questionnaire.Tags) + { + for(j in allTags) + { + if(allTags[j].id===questionnaire.Tags[i].TagId) + { + tagsQuestionnaire.push(allTags[j]); + break; + } + } + } + return tagsQuestionnaire; + } +} +exports.getTagsQuestionnaire = getUsedTagsQuestionnaire; + +// Créer la liste complète des questionnaires publiés, classés par un tag +const creaQuestionnairesTagJson = async (id) => +{ + id=tool.trimIfNotNull(id); + if(id===null) + return false; + const db = require("../models/index"); + const questionnaires = await db.sequelize.query("SELECT id FROM `Questionnaires` INNER JOIN `QuestionnaireClassifications` ON `Questionnaires`.`id`=`QuestionnaireClassifications`.`QuestionnaireId` AND `Questionnaires`.`isPublished`=1 AND `QuestionnaireClassifications`.`TagId`=:id ORDER BY `Questionnaires`.`publishingAt`", { replacements: { id: id }, type: QueryTypes.SELECT , model: db["Questionnaire"], mapToModel: true }); + await toolFile.createJSON(configTags.dirCacheTags, "liste-"+id, questionnaires);// le supprimer si liste vide ? + creaUsedTagsJson(); + creaQuestionnairesTagHTML(id, questionnaires);// pas await, car potentiellement long ! + return questionnaires; +} +exports.creaQuestionnairesTagJson = creaQuestionnairesTagJson; + +const creaQuestionnairesTagHTML = async (id, Questionnaires) => +{ + id=tool.trimIfNotNull(id); + if(id===null || Questionnaires===null) + return false; + const tag=await searchTagById(id); + if(Questionnaires.length===0) + { // plus aucun quiz classé ici. Il faudrait idéalement envoyer des erreurs 404/410, etc. + // revoir aussi l'intérêt ou non de supprimer les pages suivantes, sachant qu'elles ne sont pas indexables ? ou les rendre dynamiques ? + await toolFile.deleteFile(configTags.dirHTMLTags, tag.slug+".html"); + return true; + } + const compiledFunction = pug.compileFile("./views/"+config.theme+"/tag.pug"); + const configTpl = require("../views/"+config.theme+"/config/"+config.availableLangs[0]+".js"); + const pageDatas= + { + config: config, + configTpl: configTpl, + tool: tool, + striptags: striptags, + txtGeneral : txtGeneral, + txtQuestionnaire: txtQuestionnaire, + txtIllustration: txtIllustration, + pageLang: config.adminLang, + metaDescription: config.siteName+" : "+txt.tagMetaDescription+tag.name, + pageTitle: config.siteName+" - "+tag.name, + contentTitle: config.siteName+" - "+tag.name, + tagInfos: tag, + linkCanonical: config.siteUrl+"/"+configTags.dirWebTags+"/"+tag.slug+".html" + } + const nbPages=Math.ceil(Questionnaires.length / configTpl.maxQuestionnairesByPage); + pageDatas.nbPages=nbPages; + let debut=0, fin, questionnairesPage, questionnairesInfos=[], html, url; + for (let i = 1; i <= nbPages; i++) + { + let questionnairesPage = Questionnaires.slice(debut, debut+configTpl.maxQuestionnairesByPage); + for(let j in questionnairesPage) + questionnairesInfos.push(await questionnaireCtrl.searchQuestionnaireById(questionnairesPage[j].id)); + pageDatas.questionnaires=questionnairesInfos; + pageDatas.page=i; + url=tag.slug; + if(i!==1) + { + url=url+"-"+i; + pageDatas.metaRobots="noindex,follow"; + pageDatas.linkCanonical=null; + } + html=await compiledFunction(pageDatas); + await toolFile.createHTML(configTags.dirHTMLTags, url, html); + debut+=configTpl.maxQuestionnairesByPage; + questionnairesInfos=[]; + } + return true; +} + +// Retourne un tag, si il existe +const searchTagByName = async (name) => +{ + name=tool.trimIfNotNull(name); + if(name===null) + return false; + const db = require("../models/index"); + const tag=await db["Tag"].findOne({ where: { name: name } }); // utile de faire en sql pour les problèmes de majuscules / minuscules + if(tag) + return tag; + else + return false; +} + +const searchTagById = async (id) => +{ + id=tool.trimIfNotNull(id); + if(id===null) + return false; + const db = require("../models/index"); + const tag=await db["Tag"].findByPk(id); + if(tag) + return tag; + else + return false; +} + +// Supprime l'association entre un tag et un questionnaire + actualise la liste des questionnaires pour le tag concerné +// La mise à jour du json/HTML du questionnaire est appelée par le contrôleur appelant cette fonction +const unlinkTagQuestionnaire = async (tagId, questionnaireId) => +{ + const db = require("../models/index"); + await db["QuestionnaireClassification"].destroy( { where: { TagId: tagId, QuestionnaireId : questionnaireId }, limit:1 }); + creaQuestionnairesTagJson(tagId);// peut être lent ! + return true; +} + +// Créer l'association entre un tag et un questionnaire + actualise la liste des questionnaires / tag +// La mise à jour du json/HTML du questionnaire est appelée par le contrôleur appelant cette fonction +const linkTagQuestionnaire = async (tagName, questionnaireId) => +{ + const db = require("../models/index"); + // ce tag est-il nouveau ? + let tagLinked=await searchTagByName(tagName); + if(tagLinked===false) + { + tagLinked=await db["Tag"].create({ name: tagName, slug: null }, { fields: ["name", "slug"] });// "slug : null" pour laisser le modèle le générer + creaAllTagsJson(); + } + if(tagLinked) + { + await db["QuestionnaireClassification"].create({ TagId: tagLinked.id, QuestionnaireId: questionnaireId }); + creaQuestionnairesTagJson(tagLinked.id);// peut être lent ! + } + return true; +} \ No newline at end of file diff --git a/controllers/user.js b/controllers/user.js new file mode 100644 index 0000000..0d06dc1 --- /dev/null +++ b/controllers/user.js @@ -0,0 +1,1184 @@ +const bcrypt = require("bcrypt"); +const jwt = require("jsonwebtoken"); +const slugify = require('slugify'); +const { Op, QueryTypes } = require("sequelize");// pour certaines requêtes sql + +const config = require("../config/main.js"); +const configTpl = require("../views/"+config.theme+"/config/"+config.availableLangs[0]+".js"); + +const tool = require("../tools/main"); +const toolError = require("../tools/error"); +const toolFile = require("../tools/file"); +const toolMail = require("../tools/mail"); + +const txt = require("../lang/"+config.adminLang+"/user"); +const txtGeneral = require("../lang/"+config.adminLang+"/general"); + +const answerCtrl = require("./answer"); +const subscriptionCtrl = require("./subscription"); + +// Retourne certaines configurations utiles aux formulaires où vues +exports.checkEmailIsFree = async (req, res, next) => +{ + try + { + const user=await searchUserByEmail(req.body.emailTest); + const response={ }; + if(user) + { + response.free=false; + if(user.Subscription) + response.validated=true; + else + response.validated=false; + } + else + response.free=true; + res.status(200).json(response); + next(); + } + catch(e) + { + next(e); + } +} + +exports.getGodfatherId = async (req, res, next) => +{ + try + { + const godfather=await searchIdGodfather(req.body.codeTest); + if(godfather) + res.status(200).json(godfather.id); + else + res.status(204).json({ errors: txt.godfatherNotFound }); + next(); + } + catch(e) + { + next(e); + } +} + +// retourne toutes les infos utiles côté client pour un utilisateur +// revoir : placer dans un autre contrôler dédié à communication avec le front-end +exports.getConfig = (req, res, next) => +{ + try + { + //const configLinks = require("../config/links.js"); + //const configIllustrations = require("../config/illustrations.js"); + const configUsers = + { + // les routes : + siteUrl: config.siteUrl, + apiUrl: config.apiUrl, + // -- users + userRoutes: "/user", + subscribeRoute: "/signup", + getGodfatherRoute: "/getgodfatherid", + checkIfIsEmailfreeRoute: "/isemailfree", + checkSubscribeTokenRoute: "/validation/", + checkLoginRoute: "/checklogin/", + connectionRoute: "/login", + getLoginLinkRoute: "/getloginlink", + connectionWithLinkRoute: "/checkloginlink", + getUserInfos: "/get/", + createUserRoute: "/create", + validateUserRoute: "/validate/", + updateUserInfos: "/modify/", + searchUserRoute: "/search/", + getGodChilds: "/getgodchilds/", + checkNewLoginLinkRoute: "/confirmnewlogin/", + checkDeleteLinkRoute: "/confirmdelete/", + getPayments: "/payment/getforoneuser/", + unsubscribeRoute: "/subscription/stop/", + // -- questionnaires : + questionnaireRoutes: "/questionnaire", + getQuestionnaireRoutes: "/get", + previewQuestionnaireRoutes: "/preview", + publishedQuestionnaireRoutes: "/quiz/", + saveAnswersRoute: "/answer/", + getStatsQuestionnaires : "/stats/", + searchQuestionnairesRoute : "/search", + searchAdminQuestionnairesRoute : "/searchAdmin", + getListNextQuestionnaires: "/getListNextQuestionnaires/", + // -- tags : + tagsSearchRoute: "/tags/search/", + // -- links : + linksRoute: "/link/", + // -- illustrations : + illustrationsRoute: "/illustration/", + // -- questions & choices : + questionsRoute: "/question/", + // -- answers : + getQuestionnairesWithoutAnswer: "/withoutanswer/user/", + getPreviousAnswers: "/user/answers/", + getStatsAnswers : "/user/anwswers/stats/", + getAdminStats: "/getadminstats/", + // configuration des champs de saisie + // revoir : toutes ces données devraient venir de fichiers de configuration + // -- users : + name: { maxlength: 70, required: true }, + email: { maxlength: 255, required: true }, + password: { minlength: config.passwordMinLength, required: true }, + newPassword: { minlength: config.passwordMinLength }, + codeGodfather: { maxlength: 255 }, + cguOk: { value: "true", required: true }, + timeDifferenceMin:-720, + timeDifferenceMax:840, + beginCodeGodfather: config.beginCodeGodfather, + // -- questionnaires : + Questionnaire : + { + title: { maxlength: 255, required: true }, + slug: { maxlength: 150 }, // champ requis mais calculé à partir du titre qd vide + introduction: { required: true } + }, + searchQuestionnaires : { minlength: config.minSearchQuestionnaires, required: true }, + // -- links : + Link : + { + url: { maxlength: 255, required: true }, + anchor: { maxlength: 150, required: true } + }, + nbLinksMin: 1, + nbLinksMax: 1, + // -- illustrations : + Illustration : + { + alt: { maxlength: 255 }, + title: { maxlength: 255 }, + caption: { maxlength: 255 }, + image: { required: true, accept: "'image/jpg', 'image/jpeg', 'image/png', 'image/gif', 'image/png'" } // si possibilité de sélectionner une image déjà chargée, required != true, mais oblige à revoir la suppression des fichiers image + }, + nbIllustrationsMin: 0, + nbIllustrationsMax: 1, + // -- questions & choice : + Question : + { + text: { maxlength: 255, required: true }, + rank: { required: true, min:1, defaultValue:1 } + }, + Choice : + { + text: { maxlength: 255, required: true } + }, + nbQuestionsMin: config.nbQuestionsMin, + nbQuestionsMax: config.nbQuestionsMax, + nbChoicesMax: config.nbChoicesMax, + // durée des token : + signupValidationTimeInHours: config.tokenSignupValidationTimeInHours, + loginLinkTimeInHours: config.tokenLoginLinkTimeInHours, + connexionMinTimeInHours: config.tokenConnexionMinTimeInHours, + connexionMaxTimeInHours: config.tokenConnexionMaxTimeInDays, + loginChangingTimeInHours: config.tokenLoginChangingTimeInHours, + deleteUserTimeInHours: config.tokenDeleteUserTimeInHours, + unsubscribeLinkTimeInDays: config.tokenUnsubscribeLinkTimeInDays + } + res.status(200).json(configUsers); + next(); + } + catch(e) + { + next(e); + } +} + +exports.signup = async (req, res, next) => +{ + try + { + const db = require("../models/index"); + if(req.body.cguOk !== "true") + res.status(400).json({ errors: [txt.needUGCOk] }); + else if(req.body.password.length < config.passwordMinLength) // si le champ est supprimé du formulaire d'inscription, générer un mot de passe ok ici + res.status(400).json({ errors: [txt.needLongPassWord.replace("MIN_LENGTH", config.passwordMinLength)] }); + else + { + req.body.GodfatherId=null; + if(req.body.codeGodfather!=="") + { + const godfather=await searchIdGodfather(req.body.codeGodfather); + if(godfather) + req.body.GodfatherId=godfather.id; + } + req.body.password=await bcrypt.hash(req.body.password, config.bcryptSaltRounds); + const user=await db["User"].create({ ...req.body }, { fields: ["name", "email", "password", "newsletterOk", "GodfatherId", "timeDifference"] }); + req.body.UserId=user.id; + // l'utilisateur a répondu à un quiz avant de créer son compte. On enregistre ses résultats. + if(req.body.QuestionnaireId) + { + await Promise.all([ + db["QuestionnaireAccess"].create({ ...req.body }, { fields: ["QuestionnaireId", "UserId"] }), + db["Answer"].create({ ...req.body }, { fields: ["nbQuestions", "nbCorrectAnswers", "duration", "QuestionnaireId", "UserId"] }) + ]); // pas nécessaire ici de créer le cache, car normalement il sera créé lors du premier appel + } + await sendValidationLink(user); + res.status(201).json({ message: txt.mailValidationMessage }); + next(); + } + } + catch(e) + { + const returnAPI=toolError.returnSequelize(e); + if(returnAPI.messages) + { + res.status(returnAPI.status).json({ errors : returnAPI.messages }); + next(); + } + else + next(e); + } +} + +exports.signupValidation = async (req, res, next) => +{ + try + { + const db = require("../models/index"); + const datas=await checkTokenUser(req.params.token); + if(datas) + { + if(datas.Subscription) + res.status(200).json({ errors: [txt.validationAlreadyMessage] }); + else + { + const now=new Date(); + await Promise.all([ + db["Subscription"].create({ numberOfDays: config.freeAccountTimingInDays, noticeOk: datas.User.newsletterOk, UserId: datas.User.id }), + db["User"].update({ connectedAt: now }, { where: { id : datas.User.id }, limit:1 }) + ]); + creaUserJson(datas.User.id); + const mapMail = + { + USER_NAME: datas.User.name, + NOM_SITE : config.siteName, + EMAIL : config.senderEmail, + LINK_URL : config.siteUrl+"/"+configTpl.connectionPage + }; + const mailDatas= + { + mailSubject: txt.mailWelcomeSubject, + mailPreheader: txt.mailWelcomeSubject, + mailTitle: txt.mailWelcomeSubject, + mailHeaderLinkUrl: config.siteUrl+"/"+configTpl.connectionPage, + mailHeaderLinkTxt: txt.mailWelcomeLinkTxt, + mailMainContent: tool.replaceAll(txt.mailWelcomeBodyHTML, mapMail), + linksCTA: [{ url:config.siteUrl+"/"+configTpl.connectionPage, txt:txt.mailWelcomeLinkTxt }], + mailRecipientAddress: datas.User.email + } + toolMail.sendMail(0, datas.User.email, txt.mailWelcomeSubject, tool.replaceAll(txt.mailWelcomeBodyTxt, mapMail), "", mailDatas); + if(datas.User.GodfatherId!==null) + { + const godfather=await searchUserById(datas.User.GodfatherId); + if(godfather) + { + mapMail.USER_NAME=godfather.User.name; + mapMail.EMAIL=datas.User.email; + const mailDatas2= + { + mailSubject: txt.mailThankGodfatherSubject, + mailPreheader: txt.mailThankGodfatherSubject, + mailTitle: txt.mailThankGodfatherSubject, + mailHeaderLinkUrl: config.siteUrl+"/"+configTpl.connectionPage, + mailHeaderLinkTxt: txt.mailThankGodfatherLinkTxt, + mailMainContent: tool.replaceAll(txt.mailThankGodfatherBodyHTML, mapMail), + mailRecipientAddress: godfather.User.email + } + toolMail.sendMail(godfather.User.smtp, godfather.User.email, txt.mailThankGodfatherSubject, tool.replaceAll(txt.mailThankGodfatherBodyTxt, mapMail), "", mailDatas2); + } + } + res.status(200).json( + { + userId: datas.User.id, + token: jwt.sign({ userId: datas.User.id }, config.tokenPrivateKey, { expiresIn: config.tokenConnexionMinTimeInHours }) + }); + } + } + else + res.status(401).json({ errors: txt.badLinkValidationMessage }); + next(); + } + catch(e) + { + next(e); + } +} + +exports.checkToken = async (req, res, next) => +{ + try + { + const datas=await checkTokenUser(req.params.token); + if(datas && datas.Subscription) + { + const beginSubTS=new Date(datas.Subscription.createdAt).getTime(); + const nbDaysOk=datas.Subscription.numberOfDays-Math.round((Date.now()-beginSubTS)/1000/3600/24); + res.status(200).json( + { + isValid: true, + id: datas.User.id, + name: datas.User.name, + language: datas.User.language, + timeDifference : datas.User.timeDifference, + status: datas.User.status, + nbDaysOk : nbDaysOk + }); + } + else + res.status(200).json({ isValid: false }); + next(); + } + catch(e) + { + next(e); + } +} + +exports.login = async (req, res, next) => +{ + try + { + const db = require("../models/index"); + const emailSend=tool.trimIfNotNull(req.body.email); + const user=await db["User"].findOne({ attributes: ["id", "password", "email", "name", "status"], where: { email: emailSend } }); + if(!user) + res.status(404).json({ errors: [txt.emailNotFound] }); + else + { + const subscription=await db["Subscription"].findOne({ attributes: ["id"], where: { UserId: user.id } }); + if(!subscription) + { + await sendValidationLink(user); + res.status(400).json({ errors: [txt.needValidationToLogin] }); + } + else + { + const nowTS=new Date().getTime(); + const countLogin=await toolFile.readJSON(config.dirTmpLogin, slugify(emailSend)); + if(countLogin && countLogin.nb >= config.maxLoginFail && countLogin.lastTime > (nowTS-config.loginFailTimeInMinutes*3600*1000)) + res.status(401).json({ errors: [txt.tooManyLoginFails.replace("MINUTES", config.loginFailTimeInMinutes)] }); + else + { + const valid = await bcrypt.compare(req.body.password, user.password); + if (!valid) + { + res.status(401).json({ errors: [txt.badPassword] }); + let newCountLogin={ nb:1, lastTime:nowTS }; + if(countLogin.nb && countLogin.lastTime > (nowTS-config.loginFailTimeInMinutes*3600*1000)) + newCountLogin.nb=countLogin.nb+1; + await toolFile.createJSON(config.dirTmpLogin, slugify(emailSend), newCountLogin); + } + else + { + const now=new Date(); + const timeDifference=req.body.timeDifference;// permet d'actualiser en cas de déplacements/heures d'été, etc. + db["User"].update({ connectedAt: now, timeDifference: timeDifference }, { where: { id : user.id }, limit:1 }); + creaUserJson(user.id); + let loginTime=config.tokenConnexionMinTimeInHours; + if((req.body.keepConnected==="true") && (user.status==="user")) + loginTime=config.tokenConnexionMaxTimeInDays; + // si des données concernant un quiz ont été transmises, je les enregistre ici : + req.body.UserId=user.id; + if(req.body.QuestionnaireId) + { + const access=await subscriptionCtrl.checkQuestionnaireAccess(user.id, req.body.QuestionnaireId); + if(!access) + await db["QuestionnaireAccess"].create({ ...req.body }, { fields: ["QuestionnaireId", "UserId"] }); + await db["Answer"].create({ ...req.body }, { fields: ["nbQuestions", "nbCorrectAnswers", "duration", "QuestionnaireId", "UserId"] }); + answerCtrl.creaUserAnswersJson(req.body.UserId); + answerCtrl.creaUserQuestionnairesWithoutAnswerJson(req.body.UserId); + answerCtrl.creaUserStatsAnwsersJson(req.body.UserId); + } + res.status(200).json( + { + userId: user.id, + status: user.status, + connexionTime: loginTime, + token: jwt.sign({ userId: user.id }, config.tokenPrivateKey, { expiresIn: loginTime }) + }); + } + } + } + } + next(); + } + catch(e) + { + next(e); + } +} + +exports.getLoginLink = async (req, res, next) => +{ + try + { + const emailSend=tool.trimIfNotNull(req.body.email); + const userDatas=await searchUserByEmail(emailSend); + if(!userDatas) + res.status(404).json({ errors: [txt.emailNotFound] }); + else if(userDatas.User.status!=="user") + res.status(403).json({ errors: [txtGeneral.notAllowed] }); + else + { + if(!userDatas.Subscription) + { + await sendValidationLink(userDatas.User); + res.status(401).json({ errors: [txt.needValidationToLogin] }); + } + else + { + const token=jwt.sign({ userId:userDatas.User.id, keepConnected:req.body.keepConnected }, config.tokenPrivateKey, { expiresIn: config.tokenLoginLinkTimeInHours }); + const mapMail = + { + USER_NAME: userDatas.User.name, + LINK_URL : config.siteUrl+"/"+configTpl.loginLinkPage+token + }; + const mailDatas= + { + mailSubject: txt.mailLoginLinkSubject, + mailPreheader: txt.mailLoginLinkSubject, + mailTitle: txt.mailLoginLinkSubject, + mailHeaderLinkUrl: config.siteUrl+"/"+configTpl.loginLinkPage+token, + mailHeaderLinkTxt: txt.mailLoginLinkTxt, + mailMainContent: tool.replaceAll(txt.mailLoginLinkBodyHTML, mapMail), + linksCTA: [{ url:config.siteUrl+"/"+configTpl.loginLinkPage+token, txt:txt.mailLoginLinkTxt }], + mailRecipientAddress: userDatas.User.email + } + await toolMail.sendMail(userDatas.User.smtp, userDatas.User.email, txt.mailLoginLinkSubject, tool.replaceAll(txt.mailLoginLinkBodyTxt, mapMail), "", mailDatas); + res.status(200).json({ message: txt.mailLoginLinkMessage+config.tokenLoginLinkTimeInHours+"." }); + } + } + next(); + } + catch(e) + { + next(e); + } +} + +exports.checkLoginLink = async (req, res, next) => +{ + try + { + const db = require("../models/index"); + console.log(req); + const userDatas= await checkTokenUser(req.body.t); + if(userDatas.User.status!=="user") + res.status(403).json({ errors: [txtGeneral.notAllowed] }); + else if(userDatas.Subscription) + { + const now=new Date(); + const timeDifference=req.body.timeDifference; + db["User"].update({ connectedAt: now, timeDifference: timeDifference }, { where: { id : userDatas.User.id }, limit:1 }); + creaUserJson(userDatas.User.id); + let loginTime=config.tokenConnexionMinTimeInHours; + if(userDatas.decodedToken.keepConnected===true) + loginTime=config.tokenConnexionMaxTimeInDays; + // si des données concernant un quiz ont été transmises, je les enregistre ici : + if(req.body.QuestionnaireId) + { + req.body.UserId=userDatas.User.id; + const access=await subscriptionCtrl.checkQuestionnaireAccess(userDatas.User.id, req.body.QuestionnaireId); + if(!access) + await db["QuestionnaireAccess"].create({ ...req.body }, { fields: ["QuestionnaireId", "UserId"] }); + await db["Answer"].create({ ...req.body }, { fields: ["nbQuestions", "nbCorrectAnswers", "duration", "QuestionnaireId", "UserId"] }); + answerCtrl.creaUserAnswersJson(req.body.UserId); + answerCtrl.creaUserStatsAnwsersJson(req.body.UserId); + answerCtrl.creaUserQuestionnairesWithoutAnswerJson(req.body.UserId); + } + res.status(200).json( + { + userId: userDatas.User.id, + connexionTime: loginTime, + token: jwt.sign({ userId: userDatas.User.id }, config.tokenPrivateKey, { expiresIn: loginTime }) + }); + } + else // ne devrait pas être possible... + { + await sendValidationLink(userDatas.User); + res.status(401).json({ errors: [txt.needValidationToLogin] }); + } + next(); + } + catch(e) + { + next(e); + } +} + +exports.modify = async (req, res, next) => +{ + try + { + const db = require("../models/index"); + if(req.body.newPassword && req.body.newPassword.length < config.passwordMinLength) + res.status(400).json({ errors: txt.needLongPassWord.replace("MIN_LENGTH", config.passwordMinLength) }); + else + { + if(req.connectedUser.User.status==="user") + { + await Promise.all([ + db["User"].update({ ...req.body }, { where: { id : req.connectedUser.User.id } , fields: ["name", "language", "newsletterOk", "timeDifference"], limit:1 }), + db["Subscription"].update({ ...req.body }, { where: { UserId : req.connectedUser.User.id }, fields: ["receiptDays", "noticeOk"], limit:1 }) + ]); + creaUserJson(req.connectedUser.User.id); + const messageRetour=[txt.updatedOkMessage]; + if(req.body.newPassword || (req.body.email != req.connectedUser.User.email)) + { + const newLogin={ userId: req.connectedUser.User.id }; + req.body.email=tool.trimIfNotNull(req.body.email); + if(req.body.email != req.connectedUser.User.email) + { + if (! /[A-Za-z0-9_.-]+@[A-Za-z0-9_.-]+\.[A-Za-z]{2,6}/.test(req.body.email)) + messageRetour.push(txt.updatedNeedGoodEmail); + else + { + const emailFree=await searchUserByEmail(req.body.email); + if(emailFree!==false) + messageRetour.push(txt.updatedNeedUniqueEmail.replace("NEW_EMAIL", req.body.email)); + else + newLogin.email=req.body.email; + console.log(messageRetour); + } + } + if(req.body.newPassword) + newLogin.password=await bcrypt.hash(req.body.newPassword, config.bcryptSaltRounds); + if(newLogin.email || newLogin.password) + { + const token=jwt.sign(newLogin, config.tokenPrivateKey, { expiresIn: config.tokenLoginChangingTimeInHours }); + const mapMail = + { + USER_NAME: req.body.name, + LINK_URL : config.siteUrl+"/"+configTpl.newLoginLinkPage+token + }; + const mailDatas= + { + mailSubject: txt.mailUpdateLoginSubject, + mailPreheader: txt.mailUpdateLoginSubject, + mailTitle: txt.mailUpdateLoginSubject, + mailHeaderLinkUrl: config.siteUrl+"/"+configTpl.newLoginLinkPage+token, + mailHeaderLinkTxt: txt.mailUpdateLoginLinkTxt, + mailMainContent: tool.replaceAll(txt.mailUpdateLoginBodyHTML, mapMail), + linksCTA: [{ url:config.siteUrl+"/"+configTpl.newLoginLinkPage+token, txt:txt.mailUpdateLoginLinkTxt }], + mailRecipientAddress: req.body.email + } + await toolMail.sendMail(req.connectedUser.User.smtp, req.body.email, txt.mailUpdateLoginSubject, tool.replaceAll(txt.mailUpdateLoginBodyTxt, mapMail), "", mailDatas); + messageRetour.push(txt.mailUpdateLoginLinkMessage.replace("NEW_EMAIL", req.body.email)); + } + } + res.status(200).json({ message: messageRetour }); + } + else + { + let userToUpdating=await searchUserById(req.params.id); + if(!userToUpdating || !userToUpdating.Subscription) + res.status(400).json({ errors: [txt.updatedNeedValidatedUser] }); + else + { + const messageRetour=[txtGeneral.updateOkMessage]; + if(req.body.newPassword) + req.body.password=await bcrypt.hash(req.body.newPassword, config.bcryptSaltRounds); + if(tool.isEmpty(req.body.newGodfatherId)) + req.body.GodfatherId=null; + else if(req.body.newGodfatherId && req.body.newGodfatherId!==req.params.id && await searchUserById(req.body.newGodfatherId)) + req.body.GodfatherId=req.body.newGodfatherId; + else + messageRetour.push(txt.updatedNeedGoodGodfather); + switch(req.connectedUser.User.status) + { + case "admin": + await Promise.all([ + db["User"].update({ ...req.body }, { where: { id : req.params.id }, limit:1 }), + db["Subscription"].update({ ...req.body }, { where: { UserId : req.params.id }, limit:1 }) + ]); + break; + case "manager": + await Promise.all([ + db["User"].update({ ...req.body }, { where: { id : req.params.id }, fields: ["name", "email", "password", "language", "adminComments", "smtp", "newsletterOk", "GodfatherId"], limit:1 }), + db["Subscription"].update({ ...req.body }, { where: { UserId : req.params.id }, fields: ["numberOfDays", "receiptDays", "noticeOk"], limit:1 }) + ]); + break; + case "creator": + await Promise.all([ + db["User"].update({ ...req.body }, { where: { id : req.params.id } , fields: ["name", "email", "password", "language", "adminComments"], limit:1 }), + db["Subscription"].update({ ...req.body }, { where: { UserId : req.params.id }, fields: ["numberOfDays", "receiptDays"], limit:1 }) + ]); + break; + default: + throw { message: txtGeneral.serverError }; + } + await creaUserJson(req.params.id);// besoin d'attendre car utiliser pour rafraîchir l'affichage + res.status(200).json({ message: messageRetour }); + } + } + } + next(); + } + catch(e) + { + const returnAPI=toolError.returnSequelize(e); + if(returnAPI.messages) + { + res.status(returnAPI.status).json({ errors : returnAPI.messages }); + next(); + } + else + next(e); + } +} + +exports.checkNewLoginLink = async (req, res, next) => +{ + try + { + const db = require("../models/index"); + const userDatas=await checkTokenUser(req.params.token); + if(userDatas) + { + if(userDatas.User.id!==req.connectedUser.User.id) + res.status(401).json({ errors: [txtGeneral.notAllowed] }); + else + { + await db["User"].update({ ...userDatas.decodedToken }, { where: { id : userDatas.User.id } , fields: ["email", "password"], limit:1 }); + creaUserJson(userDatas.User.id); + res.status(200).json({ message: txt.mailUpdateLoginOkMessage }); + } + } + else + res.status(404).json({ errors: [txtGeneral.notAllowed] }); + next(); + } + catch(e) + { + next(e); + } +} + +exports.create = async (req, res, next) => +{ + try + { + const db = require("../models/index"); + const connectedUser=req.connectedUser; + if(connectedUser.User.status==="user") + res.status(403).json({ errors: [txtGeneral.notAllowed] }); + else + { + if(!tool.isEmpty(req.body.GodfatherId) && ! await searchUserById(req.body.GodfatherId)) + res.status(400).json({ errors: [txt.updatedFailedGodfatherNotFound] }); + else + { + req.body.password=await bcrypt.hash(req.body.password, config.bcryptSaltRounds); + if(req.body.GodfatherId==="") + req.body.GodfatherId=null; + let user; + switch(connectedUser.User.status) + { + case "admin": + user=await db["User"].create({ ...req.body }); + req.body.UserId=user.id; + await db["Subscription"].create({ ...req.body }); + break; + case "manager": + user=await db["User"].create({ ...req.body }, { fields: ["name", "email", "password", "language", "adminComments", "smtp", "newsletterOk", "GodfatherId"] }); + req.body.UserId=user.id; + await db["Subscription"].create({ ...req.body }, { fields: ["numberOfDays", "receiptDays", "noticeOk", "UserId"] }); + break; + case "creator": + user=await db["User"].create({ ...req.body }, { fields: ["name", "email", "password", "language", "adminComments"] }); + req.body.UserId=user.id; + await db["Subscription"].create({ ...req.body }, { fields: ["numberOfDays", "receiptDays", "UserId"] }); + break; + default: + throw { message: [txtGeneral.serverError] }; + } + creaUserJson(req.body.UserId); + res.status(201).json({ message: [txt.creationOkMessage], id:req.body.UserId }); + } + } + next(); + } + catch(e) + { + const returnAPI=toolError.returnSequelize(e); + if(returnAPI.messages) + { + res.status(returnAPI.status).json({ errors : [returnAPI.messages] }); + next(); + } + else + next(e); + } +} + +exports.validate = async (req, res, next) => +{ + try + { + const db = require("../models/index"); + const connectedUser=req.connectedUser; + if(["admin", "manager"].indexOf(connectedUser.User.status) === -1) + res.status(403).json({ errors: [txtGeneral.notAllowed] }); + else + { + const userToValidating=await searchUserById(req.params.id); + if(!userToValidating) + res.status(404).json({ errors: [txt.notFound] }); + else if(userToValidating.Subscription) + res.status(400).json({ errors: [txt.validationAlreadyMessageAdmin] }); + else + { + await db["Subscription"].create({ numberOfDays: config.freeAccountTimingInDays, UserId: req.params.id }); + creaUserJson(req.params.id); + res.status(200).json({ message: [txt.validationMessageAdmin] }); + } + } + } + catch(e) + { + const returnAPI=toolError.returnSequelize(e); + if(returnAPI.messages) + { + res.status(returnAPI.status).json({ errors : returnAPI.messages }); + next(); + } + else + next(e); + } +} + +exports.delete = async (req, res, next) => +{ + try + { + const db = require("../models/index"); + const connectedUser=req.connectedUser; + if(connectedUser.User.status==="user") + { + const userDatas=await searchUserById(connectedUser.User.id); + const token=jwt.sign({ userId: connectedUser.User.id }, config.tokenPrivateKey, { expiresIn: config.tokenDeleteUserTimeInHours }); + const mapMail = + { + USER_NAME: userDatas.User.name, + LINK_URL : config.siteUrl+"/"+configTpl.deleteLinkPage+token + }; + const mailDatas= + { + mailSubject: txt.mailDeleteSubject, + mailPreheader: txt.mailDeleteSubject, + mailTitle: txt.mailDeleteSubject, + mailHeaderLinkUrl: config.siteUrl+"/"+configTpl.deleteLinkPage+token, + mailHeaderLinkTxt: txt.mailDeleteLinkTxt, + mailMainContent: tool.replaceAll(txt.mailDeleteBodyHTML, mapMail), + linksCTA: [{ url:config.siteUrl+"/"+configTpl.deleteLinkPage+token, txt:txt.mailDeleteLinkTxt }], + mailRecipientAddress: connectedUser.User.email + } + await toolMail.sendMail(connectedUser.User.smtp, connectedUser.User.email, txt.mailDeleteSubject, tool.replaceAll(txt.mailDeleteBodyTxt, mapMail), "", mailDatas); + res.status(200).json({ message: txt.mailDeleteLinkMessage }); + } + else if (["admin","manager","creator"].indexOf(connectedUser.User.status) !== -1) + { + const userDeleted=await searchUserById(req.params.id); + if(!userDeleted) + throw { message: txt.notFound }; + const nb=await db["User"].destroy({ where: { id : req.params.id }, limit:1 }); + if(nb===1) + { + await toolFile.deleteJSON(config.dirCacheUsers, req.params.id); + toolFile.deleteJSON(config.dirCacheUsersQuestionnaires+"/without", req.params.id); + toolFile.deleteJSON(config.dirCacheUsersQuestionnaires+"/answers", req.params.id); + toolFile.deleteJSON(config.dirCacheUsersQuestionnaires+"/answers", "stats"+req.params.id); + let now=new Date(), wasValided=false, wasPremium=false; + if(userDeleted.Subscription) + { + wasValided=true; + if(userDeleted.Subscription.numberOfDay > config.freeAccountTimingInDays) + wasPremium=true; + } + db["UserDeleted"].create({ createdAt: userDeleted.User.createdAt, deletedAt: now, wasValided: wasValided, wasPremium: wasPremium }); + res.status(200).json({ message: [txt.deleteOkMessage] }); + } + else + { + res.status(400).json({ errors: txtGeneral.serverError }); + throw { message: txt.deleteFailMessage+req.params.id }; + } + } + next(); + } + catch(e) + { + next(e); + } +} + +exports.checkDeleteLink = async (req, res, next) => +{ + try + { + const db = require("../models/index"); + const connectedUser=req.connectedUser; + const userDatas=await checkTokenUser(req.params.token); + if(userDatas) + { + if(connectedUser.User.id!=userDatas.User.id) + res.status(403).json({ errors: [txtGeneral.notAllowed] }); + else + { + const nb=await db["User"].destroy({ where: { id : connectedUser.User.id }, limit:1 }); + if(nb===1) + { + await toolFile.deleteJSON(config.dirCacheUsers, connectedUser.User.id); + res.status(200).json({ message: txt.mailDeleteLinkOkMessage }); + toolFile.deleteJSON(config.dirCacheUsersQuestionnaires+"/without", connectedUser.User.id); + toolFile.deleteJSON(config.dirCacheUsersQuestionnaires+"/answers", connectedUser.User.id); + toolFile.deleteJSON(config.dirCacheUsersQuestionnaires+"/answers", "stats"+connectedUser.User.id); + const now=new Date(); wasPremium=false; + if(userDatas.Subscription.numberOfDay > config.freeAccountTimingInDays) + wasPremium=true; + db["UserDeleted"].create({ createdAt: userDatas.User.createdAt, deletedAt: now, wasValided:true, wasPremium: wasPremium }); + } + else + res.status(400).json({ errors: [txt.mailDeleteLinkAlreadyMessage] }); + } + } + else + res.status(400).json({ errors: [txt.mailDeleteLinkFailMessage] }); + next(); + } + catch(e) + { + next(e); + } +} + +exports.getOneUserById = async (req, res, next) => +{ + try + { + const connectedUser=req.connectedUser; + if(connectedUser.User.status==="user") + { + if(connectedUser.User.id!=req.params.id) + res.status(403).json({ errors: txtGeneral.notAllowed }); + else + { + const datas=await searchUserById(connectedUser.User.id); + if(datas) + res.status(200).json(datas); + else + res.status(404).json({ message:txt.notFound }); + } + } + else if (["admin","manager","creator"].indexOf(connectedUser.User.status) !== -1) + {// dans le cas des "creator" il faudra peut-être limité l'accès à "ses" utilisateurs ? + const datas=await searchUserById(req.params.id); + if(datas) + res.status(200).json(datas); + else + res.status(404).json({ message:txt.notFound }); + } + next(); + } + catch(e) + { + next(e); + } +} + +exports.getOneUserGodChilds = async (req, res, next) => +{ + try + { + const db = require("../models/index"); + const connectedUser=req.connectedUser; + let godchilds; + if(["admin","manager","creator"].indexOf(connectedUser.User.status) === -1) + godchilds=await db["User"].findAll({ where: { GodfatherId: connectedUser.User.id }, attributes: ["id", "name", "email"] }); + else + godchilds=await db["User"].findAll({ where: { GodfatherId: req.params.id }, attributes: ["id", "name", "email"] }); + res.status(200).json(godchilds); + next(); + } + catch(e) + { + next(e); + } +} + +exports.searchUsers = async (req, res, next) => +{ + try + { + const connectedUser=req.connectedUser; + if(["admin", "manager", "creator"].indexOf(connectedUser.User.status) === -1) + res.status(403).json({ errors: [txtGeneral.notAllowed] }); + else + { + const db = require("../models/index"); + const Users=await db.sequelize.query("SELECT `id`,`name`,`email` FROM `Users` WHERE `name` LIKE :search OR `adminComments` LIKE :search OR `email` LIKE :search OR `id` = :id", { replacements: { search: "%"+req.body.search+"%", id: req.body.search }, type: QueryTypes.SELECT }); + res.status(200).json(Users); + } + next(); + } + catch(e) + { + next(e); + } +} + +// Retourne des statistiques concernant les utilisateurs +// Utile tableau de bord gestionnaires +exports.getStats= async (req, res, next) => +{ + try + { + let stats=await getStatsUsers(); + stats.Answers=await answerCtrl.getStatsAnswers(); + stats.Subscriptions=await subscriptionCtrl.getStatsSubscriptions(); + res.status(200).json(stats); + next(); + } + catch(e) + { + next(e); + } +} + +// CRONS +exports.deleteLoginFail = async (req, res, next) => +{ + try + { + const fileExpiration=new Date().getTime()-config.loginFailTimeInMinutes*60*1000; + const deleteFiles = await toolFile.deleteOldFilesInDirectory(config.dirTmpLogin, fileExpiration); + res.status(200).json(deleteFiles); + next(); + } + catch(e) + { + next(e); + } +} + +exports.deleteJsonFiles= async (req, res, next) => +{ + try + { + const db = require("../models/index"); + const users=await db["User"].findAll({ attributes: ["id"] }); + let saveFiles=[]; + for(let i in users) + saveFiles.push(users[i].id+".json"); + const deleteFiles = await Promise.all([ + toolFile.deleteFilesInDirectory(config.dirCacheUsers, saveFiles), + toolFile.deleteFilesInDirectory(config.dirCacheUsersQuestionnaires, saveFiles) + ]); + res.status(200).json(deleteFiles); + next(); + } + catch(e) + { + next(e); + } +} + +exports.deleteUnvalided= async (req, res, next) => +{ + try + { + const db = require("../models/index"); + const nowTS=Date.now(); + const timeExpiration=nowTS-parseInt(config.tokenSignupValidationTimeInHours,10)*3600*1000; + const userUnvalided= await db.sequelize.query("SELECT createdAt FROM `Users` WHERE UNIX_TIMESTAMP(createdAt) < "+timeExpiration+" AND `id` NOT IN (SELECT `UserId` FROM `Subscriptions`)", { type: QueryTypes.SELECT }); + if(userUnvalided.length!==0) + { + const [results, metadata] = await db.sequelize.query("DELETE FROM `Users` WHERE UNIX_TIMESTAMP(createdAt) < "+timeExpiration+" AND `id` NOT IN (SELECT `UserId` FROM `Subscriptions`)"); + const now=new Date(); + for(i in userUnvalided) + await db["UserDeleted"].create({ createdAt: userUnvalided[i].createdAt, deletedAt: now, wasValided: false }); + res.message=metadata.affectedRows+txt.cronDeleteUnvalidedUsersMessage; + } + res.status(200).json(true); + next(); + } + catch(e) + { + next(e); + } +} + +exports.deleteInactiveAccounts= async(req, res, next) => +{ + try + { + const db = require("../models/index"); + // compte inactif = abonnement expiré + non connecté depuis un certains nombres de jours + const usersInactive= await db.sequelize.query("SELECT createdAt FROM `Users` WHERE status='user' and ADDDATE(`connectedAt`, "+config.inactiveAccountTimeToDeleteInDays+") < NOW() AND `id` IN (SELECT `UserId` FROM `Subscriptions` WHERE ADDDATE(`createdAt`, `numberOfDays`)< NOW())", { type: QueryTypes.SELECT }); + if(usersInactive.length!==0) + { + const [results, metadata] = await db.sequelize.query("DELETE FROM `Users` WHERE ADDDATE(`connectedAt`, "+config.inactiveAccountTimeToDeleteInDays+") < NOW() AND `id` IN (SELECT `UserId` FROM `Subscriptions` WHERE ADDDATE(`createdAt`, `numberOfDays`)< NOW())"); + if(metadata.affectedRows!==0) + res.message=metadata.affectedRows+txt.deleteInactiveUsersMessage; + const now=new Date(); + for(i in usersInactive) + await db["UserDeleted"].create({ createdAt: usersInactive[i].createdAt, deletedAt: now, wasValided: true }); + } + res.status(200).json(true); + next(); + } + catch(e) + { + next(e); + } +} + +// FONCTIONS UTILITAIRES + +// Création du fichier des données de l'utilisateur + son abonnement et ses pauses +const creaUserJson = async (id) => +{ + id=tool.trimIfNotNull(id); + if(id===null) + return false; + const db = require("../models/index"); + const User=await db["User"].findByPk(id, { attributes: { exclude: ['password'] } }); + if(User) + { + let datas={ User }; + const Subscription=await db["Subscription"].findOne({ where: { UserId: id } }); + if(Subscription) // pas de cache pour utilisateurs non validés + { + datas.Subscription=Subscription; + const Pauses=await db["Pause"].findAll({ where: { SubscriptionId: Subscription.id } }); + if(Pauses) + datas.Pauses=Pauses; + await toolFile.createJSON(config.dirCacheUsers, id, datas); + } + return datas; + } + else + return false; +} +exports.creaUserJson = creaUserJson; + +const searchUserById = async (id) => +{ + id=tool.trimIfNotNull(id); + if(id===null) + return false; + const user=await toolFile.readJSON(config.dirCacheUsers, id); + if(user) + return user; + else + return await creaUserJson(id); +} +exports.searchUserById = searchUserById; + +const searchUserByEmail = async (email) => +{ + const db = require("../models/index"); + const emailSend=tool.trimIfNotNull(email); + const userEmail=await db["User"].findOne({ attributes: ["id"], where: { email : emailSend } }); + if(userEmail) + return await searchUserById(userEmail.id);// permet de récupérer les autres infos (Subscription, etc.) + else + return false; +} + +// Recherche le parrain dont le "code" fourni peut être l'identifiant préfixé ou bien l'adresse e-mail +const searchIdGodfather = async (code) => +{ + let godfatherInfos=""; + code=tool.trimIfNotNull(code); + if(code===null) + return false; + else if(code.indexOf("@")!==-1) // tester en premier, car une adresse peut débuter par le préfixe de l'appli... + godfatherInfos=await searchUserByEmail(code); + else if (code.startsWith(config.beginCodeGodfather)) + godfatherInfos=await searchUserById(code.substring(config.beginCodeGodfather.length)); + if(godfatherInfos.Subscription && godfatherInfos.User.status==="user") // le parrain doit avoir validé son compte et doit être un simple "user" + return godfatherInfos.User; + else + return null; +} + +// Envoi le lien permettant au nouvel utilisateur de valider son compte +const sendValidationLink = async (user) => +{ + const token=jwt.sign({ userId: user.id }, config.tokenPrivateKey, { expiresIn: config.tokenSignupValidationTimeInHours }); + const mapMail = + { + USER_NAME: user.name, + LINK_URL: config.siteUrl+"/"+configTpl.validationLinkPage+token, + }; + const mailDatas= + { + mailSubject: txt.mailValidationLinkSubject, + mailPreheader: txt.mailValidationLinkSubject, + mailTitle: txt.mailValidationLinkSubject, + mailHeaderLinkUrl: config.siteUrl+"/"+configTpl.validationLinkPage+token, + mailHeaderLinkTxt: txt.mailValidationLinkTxt, + mailMainContent: tool.replaceAll(txt.mailValidationLinkSBodyHTML, mapMail), + linksCTA: [{ url:config.siteUrl+"/"+configTpl.validationLinkPage+token, txt:txt.mailValidationLinkTxt }], + mailRecipientAddress: user.email + } + await toolMail.sendMail(0, user.email, txt.mailValidationLinkSubject, tool.replaceAll(txt.mailValidationLinkSBodyTxt, mapMail), "", mailDatas); + return true; +} + +// Permet de vérifier un token de connexion : est-il valide et est-ce qu'il correspond à un utilisateur ? +// Si oui, on peut aussi enregistrer une nouvelle connexion pour l'utilisateur (une fois / jour) +const checkTokenUser = async (token) => +{ + const db = require("../models/index"); + const decodedToken=jwt.verify(token, config.tokenPrivateKey); + const userId=decodedToken.userId; + const datas=await searchUserById(userId); + if(datas.User) + { + const now=new Date(); + const nowTS=Date.now() + const lastConnection = Date.parse(datas.User.connectedAt); + if(lastConnection+24*3600*1000 < nowTS) // une fois par jour suffit. + { + await db["User"].update({ connectedAt: now }, { where: { id : userId }, limit:1 }); + creaUserJson(userId); + } + datas.decodedToken=decodedToken; + return datas; + } + else + return false; +} +exports.checkTokenUser = checkTokenUser; + +// Stats sur les créations de compte, suppression.. durant les dernières 24H ou depuis le début +const getStatsUsers = async () => +{ + const db = require("../models/index"); + const getNewUsers24H = await db.sequelize.query("SELECT `id` FROM `Users` WHERE `createdAt` > ADDDATE(NOW(), -1)", { type: QueryTypes.SELECT }); + const getNewUsersTot = await db.sequelize.query("SELECT `id` FROM `Users`", { type: QueryTypes.SELECT }); + const getDeletedUsers24H = await db.sequelize.query("SELECT `id` FROM `UserDeleteds` WHERE `deletedAt` > ADDDATE(NOW(), -1)", { type: QueryTypes.SELECT }); + const getDeletedUsersTot = await db.sequelize.query("SELECT `id` FROM `UserDeleteds`", { type: QueryTypes.SELECT }); + const getDeletedUsersWasValided = await db.sequelize.query("SELECT `id` FROM `UserDeleteds` WHERE `wasValided`= 1", { type: QueryTypes.SELECT }); + const getDeletedUsersTotWasPremium = await db.sequelize.query("SELECT `id` FROM `UserDeleteds` WHERE `wasPremium`= 1", { type: QueryTypes.SELECT }); + if(getNewUsers24H && getNewUsersTot && getDeletedUsers24H && getDeletedUsersWasValided && getDeletedUsersTotWasPremium && getDeletedUsersTot ) + { + const stats = + { + nbNewUsers24H : getNewUsers24H.length, + nbNewUsersTot : getNewUsersTot.length, + nbDeletedUsers24H : getDeletedUsers24H.length, + nbDeletedUsersTot : getDeletedUsersTot.length, + nbDeletedUsersWasValided : getDeletedUsersWasValided.length, + nbDeletedUsersTotWasPremium : getDeletedUsersTotWasPremium.length + } + return stats; + } + else + return false; +} +exports.getStatsUsers = getStatsUsers; diff --git a/example.env b/example.env new file mode 100644 index 0000000..b3a9c38 --- /dev/null +++ b/example.env @@ -0,0 +1,27 @@ +# COMPLÉTER LES VARIABLES D'ENVIRONNEMENT CI-DESSOUS, SUPPRIMER TOUTES LES LIGNES DE COMMENTAIRES SANS LAISSER D'ESPACES. PUIS ENREGISTRER LE FICHIER : .env +# development/production ? +NODE_ENV= +# DATABASE LOGIN DETAILS : +DB_HOST= +DB_USER= +DB_PASS= +DB_NAME= +# INFORMATION FOR CONNECTING TO THE STMP SERVER(S). IF THERE ARE SEVERAL, SEPARATE THE INFORMATION WITH A COMMA WITHOUT SPACES. +SMTP_NAMES= +SMTP_HOSTS= +SMTP_PORTS= +SMTP_SECURES= +SMTP_LOGINS= +SMTP_PASSWORDS= +# AN INTEGER NUMBER USED FOR PASSWORD ENCRYPTION (see : https://www.npmjs.com/package/bcrypt) : +BCRYPT_SALT_ROUNDS= +# STRING USED BY THE CONNECTION TOKENS (see : https://www.npmjs.com/package/jsonwebtoken) : +TOKEN_PRIVATE_KEY= +# STRING USED BY THE CRONJOBS TOKENS : +CRON_TOKEN= +# NUMBER OF LOGIN ERRORS BEFORE THE USER IS BLOCKED : +MAX_LOGIN_FAILS= +# TIME DURING WHICH THE USER CAN NO LONGER LOG IN : +LOGIN_FAIL_TIME_IN_MINUTES=Time during which the user can no longer log in. +# ONLY USEFUL IF YOU USE THE WEBPORTAGE PAYMENT SOLUTION : +MD5_WP= \ No newline at end of file diff --git a/front/package-lock.json b/front/package-lock.json new file mode 100644 index 0000000..dd455c5 --- /dev/null +++ b/front/package-lock.json @@ -0,0 +1,6672 @@ +{ + "name": "wikilerni", + "version": "0.1.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/compat-data": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz", + "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "invariant": "^2.2.4", + "semver": "^5.5.0" + } + }, + "@babel/core": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.0.tgz", + "integrity": "sha512-mkLq8nwaXmDtFmRkQ8ED/eA2CnVw4zr7dCztKalZXBvdK5EeNUAesrrwUqjQEzFgomJssayzB0aqlOsP1vGLqg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.0", + "@babel/helper-module-transforms": "^7.11.0", + "@babel/helpers": "^7.10.4", + "@babel/parser": "^7.11.0", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.11.0", + "@babel/types": "^7.11.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", + "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", + "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", + "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", + "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.10.4", + "browserslist": "^4.12.0", + "invariant": "^2.2.4", + "levenary": "^1.1.1", + "semver": "^5.5.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", + "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.10.5", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", + "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-regex": "^7.10.4", + "regexpu-core": "^4.7.0" + } + }, + "@babel/helper-define-map": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", + "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/types": "^7.10.5", + "lodash": "^4.17.19" + }, + "dependencies": { + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "dev": true + } + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz", + "integrity": "sha512-4K71RyRQNPRrR85sr5QY4X3VwG4wtVoXZB9+L3r1Gp38DhELyHCtovqydRi7c1Ovb17eRGiQ/FD5s8JdU0Uy5A==", + "dev": true, + "requires": { + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", + "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", + "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-module-transforms": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", + "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/template": "^7.10.4", + "@babel/types": "^7.11.0", + "lodash": "^4.17.19" + }, + "dependencies": { + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "dev": true + } + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", + "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", + "dev": true, + "requires": { + "lodash": "^4.17.19" + }, + "dependencies": { + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "dev": true + } + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz", + "integrity": "sha512-86Lsr6NNw3qTNl+TBcF1oRZMaVzJtbWTyTko+CQL/tvNvcGYEFKbLXDPxtW0HKk3McNOk4KzY55itGWCAGK5tg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-replace-supers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-simple-access": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", + "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "dev": true, + "requires": { + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz", + "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", + "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helpers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", + "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "dev": true, + "requires": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.0.tgz", + "integrity": "sha512-qvRvi4oI8xii8NllyEc4MDJjuZiNaRzyb7Y7lup1NqJV8TZHF4O27CcP+72WPn/k1zkgJ6WJfnIbk4jTsVAZHw==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz", + "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.10.4", + "@babel/plugin-syntax-async-generators": "^7.8.0" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", + "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", + "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz", + "integrity": "sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", + "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz", + "integrity": "sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", + "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", + "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", + "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.10.4" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", + "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz", + "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz", + "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", + "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", + "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", + "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", + "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", + "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.10.4" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", + "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.5.tgz", + "integrity": "sha512-6Ycw3hjpQti0qssQcA6AMSFDHeNJ++R6dIMnpRqUjFeBBTmTDPa8zgF90OVfTvAo11mXZTlVUViY1g8ffrURLg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", + "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-define-map": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", + "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", + "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", + "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", + "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", + "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", + "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", + "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", + "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", + "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz", + "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", + "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz", + "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.10.4", + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", + "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", + "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", + "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", + "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", + "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", + "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", + "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", + "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", + "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz", + "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", + "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-regex": "^7.10.4" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", + "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", + "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz", + "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", + "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/preset-env": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.0.tgz", + "integrity": "sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.11.0", + "@babel/helper-compilation-targets": "^7.10.4", + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-proposal-async-generator-functions": "^7.10.4", + "@babel/plugin-proposal-class-properties": "^7.10.4", + "@babel/plugin-proposal-dynamic-import": "^7.10.4", + "@babel/plugin-proposal-export-namespace-from": "^7.10.4", + "@babel/plugin-proposal-json-strings": "^7.10.4", + "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", + "@babel/plugin-proposal-numeric-separator": "^7.10.4", + "@babel/plugin-proposal-object-rest-spread": "^7.11.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", + "@babel/plugin-proposal-optional-chaining": "^7.11.0", + "@babel/plugin-proposal-private-methods": "^7.10.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.10.4", + "@babel/plugin-transform-arrow-functions": "^7.10.4", + "@babel/plugin-transform-async-to-generator": "^7.10.4", + "@babel/plugin-transform-block-scoped-functions": "^7.10.4", + "@babel/plugin-transform-block-scoping": "^7.10.4", + "@babel/plugin-transform-classes": "^7.10.4", + "@babel/plugin-transform-computed-properties": "^7.10.4", + "@babel/plugin-transform-destructuring": "^7.10.4", + "@babel/plugin-transform-dotall-regex": "^7.10.4", + "@babel/plugin-transform-duplicate-keys": "^7.10.4", + "@babel/plugin-transform-exponentiation-operator": "^7.10.4", + "@babel/plugin-transform-for-of": "^7.10.4", + "@babel/plugin-transform-function-name": "^7.10.4", + "@babel/plugin-transform-literals": "^7.10.4", + "@babel/plugin-transform-member-expression-literals": "^7.10.4", + "@babel/plugin-transform-modules-amd": "^7.10.4", + "@babel/plugin-transform-modules-commonjs": "^7.10.4", + "@babel/plugin-transform-modules-systemjs": "^7.10.4", + "@babel/plugin-transform-modules-umd": "^7.10.4", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", + "@babel/plugin-transform-new-target": "^7.10.4", + "@babel/plugin-transform-object-super": "^7.10.4", + "@babel/plugin-transform-parameters": "^7.10.4", + "@babel/plugin-transform-property-literals": "^7.10.4", + "@babel/plugin-transform-regenerator": "^7.10.4", + "@babel/plugin-transform-reserved-words": "^7.10.4", + "@babel/plugin-transform-shorthand-properties": "^7.10.4", + "@babel/plugin-transform-spread": "^7.11.0", + "@babel/plugin-transform-sticky-regex": "^7.10.4", + "@babel/plugin-transform-template-literals": "^7.10.4", + "@babel/plugin-transform-typeof-symbol": "^7.10.4", + "@babel/plugin-transform-unicode-escapes": "^7.10.4", + "@babel/plugin-transform-unicode-regex": "^7.10.4", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.11.0", + "browserslist": "^4.12.0", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.1", + "semver": "^5.5.0" + } + }, + "@babel/preset-modules": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", + "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/runtime": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.0.tgz", + "integrity": "sha512-qArkXsjJq7H+T86WrIFV0Fnu/tNOkZ4cgXmjkzAu3b/58D5mFIO8JH/y77t7C9q0OdDRdh9s7Ue5GasYssxtXw==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", + "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.0", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.11.0", + "@babel/types": "^7.11.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "dev": true + } + } + }, + "@types/glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-VgNIkxK+j7Nz5P7jvUZlRvhuPSmsEfS03b0alKcq5V/STUKAa3Plemsn5mrQUO7am6OErJ4rhGEGJbACclrtRA==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/json-schema": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", + "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/node": { + "version": "14.0.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.13.tgz", + "integrity": "sha512-rouEWBImiRaSJsVA+ITTFM6ZxibuAlTuNOCyxVbwreu6k6+ujs7DfnU9o+PShFhET78pMBl3eH+AGSI5eOTkPA==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "dev": true + }, + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "optional": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "babel-loader": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", + "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", + "dev": true, + "requires": { + "find-cache-dir": "^2.1.0", + "loader-utils": "^1.4.0", + "mkdirp": "^0.5.3", + "pify": "^4.0.1", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-polyfill": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", + "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "regenerator-runtime": "^0.10.5" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", + "dev": true + } + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "dev": true, + "optional": true + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "bn.js": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", + "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "browserify-sign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz", + "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==", + "dev": true, + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.2", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.13.0.tgz", + "integrity": "sha512-MINatJ5ZNrLnQ6blGvePd/QOz9Xtu+Ne+x29iQSCHfkU5BugKVJwZKn/iiL8UbpIpa3JhviKjz+XxMo0m2caFQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001093", + "electron-to-chromium": "^1.3.488", + "escalade": "^3.0.1", + "node-releases": "^1.1.58" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001109", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001109.tgz", + "integrity": "sha512-4JIXRodHzdS3HdK8nSgIqXYLExOvG+D2/EenSvcub2Kp3QEADjo2v2oUn5g0n0D+UNwG9BtwKOyGcSq2qvQXvQ==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "chokidar": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.1.tgz", + "integrity": "sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "optional": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "optional": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", + "dev": true + }, + "core-js-compat": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", + "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", + "dev": true, + "requires": { + "browserslist": "^4.8.5", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.516", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.516.tgz", + "integrity": "sha512-WDM5AAQdOrvLqSX8g3Zd5AujBXfMxf96oeZkff0U2HF5op3tjShE+on2yay3r1UD4M9I3p0iHpAS4+yV8U8A9A==", + "dev": true + }, + "elliptic": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", + "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escalade": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.2.tgz", + "integrity": "sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", + "dev": true + }, + "events": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "dev": true + }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "dev": true, + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.11.0.tgz", + "integrity": "sha512-KZm0V+ll8PfBrKwMzdo5D13b1bur9Iq9Zd/RMmAoQQcl2PxxFml8cxXPaaPYVbV0RjNjq1CU7zIzAOqtUPudmA==", + "dev": true, + "requires": { + "debug": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + }, + "dependencies": { + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + } + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "html-entities": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", + "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==", + "dev": true + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levenary": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", + "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", + "dev": true, + "requires": { + "leven": "^3.1.0" + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "loglevel": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz", + "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "dev": true + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dev": true, + "requires": { + "mime-db": "1.44.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-forge": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", + "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", + "dev": true + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-releases": { + "version": "1.1.60", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.60.tgz", + "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "object-is": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", + "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "requires": { + "retry": "^0.12.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "pbkdf2": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true, + "optional": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "portfinder": { + "version": "1.0.26", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.26.tgz", + "integrity": "sha512-Xi7mKxJHHMI3rIUrnm/jjUgwhbYMkp/XKEcZX3aG4BrumLpq3nmoQMX+ClYnDZnZ/New7IatC1no5RX0zo1vXQ==", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.1" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + } + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "dev": true, + "optional": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "regenerate": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", + "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "regexpu-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "dependencies": { + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + } + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", + "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", + "dev": true, + "requires": { + "node-forge": "0.9.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", + "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sockjs": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", + "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.4.0", + "websocket-driver": "0.6.5" + } + }, + "sockjs-client": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", + "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", + "dev": true, + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trimleft": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", + "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" + } + }, + "string.prototype.trimright": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", + "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz", + "integrity": "sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^3.1.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "watchpack": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz", + "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==", + "dev": true, + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.0" + } + }, + "watchpack-chokidar2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", + "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", + "dev": true, + "optional": true, + "requires": { + "chokidar": "^2.1.8" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "optional": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + } + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "webpack": { + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.1.tgz", + "integrity": "sha512-4UOGAohv/VGUNQJstzEywwNxqX417FnjZgZJpJQegddzPmTvph37eBIRbRTfdySXzVtJXLJfbMN3mMYhM6GdmQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.3.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + } + }, + "webpack-cli": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", + "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.1.1", + "findup-sync": "^3.0.0", + "global-modules": "^2.0.0", + "import-local": "^2.0.0", + "interpret": "^1.4.0", + "loader-utils": "^1.4.0", + "supports-color": "^6.1.0", + "v8-compile-cache": "^2.1.1", + "yargs": "^13.3.2" + } + }, + "webpack-dev-middleware": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", + "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "dev": true + } + } + }, + "webpack-dev-server": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", + "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.7", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "0.3.20", + "sockjs-client": "1.4.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "websocket-driver": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", + "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", + "dev": true, + "requires": { + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } +} diff --git a/front/package.json b/front/package.json new file mode 100644 index 0000000..a18682d --- /dev/null +++ b/front/package.json @@ -0,0 +1,31 @@ +{ + "name": "wikilerni", + "version": "0.1.1", + "description": "Front-end of WikiLerni web application", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "build": "webpack", + "start": "webpack-dev-server" + }, + "keywords": [ + "quiz", + "wikipédia", + "questionnaire", + "e-learning" + ], + "author": "Fabrice PENHOËT", + "license": "GPL-3.0-or-later", + "devDependencies": { + "@babel/core": "^7.11.0", + "@babel/preset-env": "^7.11.0", + "babel-loader": "^8.1.0", + "babel-polyfill": "^6.26.0", + "webpack": "^4.44.1", + "webpack-cli": "^3.3.12", + "webpack-dev-server": "^3.11.0" + }, + "browserslist": [ + "> 1%" + ] +} diff --git a/front/public/.htaccess b/front/public/.htaccess new file mode 100644 index 0000000..ec8413e --- /dev/null +++ b/front/public/.htaccess @@ -0,0 +1,50 @@ +# Activation de la génération des en-têtes Expires +ExpiresActive On +# Les documents HTML, JS, JSON, CSS, XML expirent dès leur modification +ExpiresByType text/html M0 +ExpiresByType text/javascript M0 +ExpiresByType application/javascript M0 +ExpiresByType application/json M0 +ExpiresByType text/css M0 +ExpiresByType application/xml M0 + +# Compression de certains fichiers +SetOutputFilter DEFLATE + +AddOutputFilterByType DEFLATE application/javascript +AddOutputFilterByType DEFLATE application/rss+xml +AddOutputFilterByType DEFLATE application/vnd.ms-fontobject +AddOutputFilterByType DEFLATE application/x-font +AddOutputFilterByType DEFLATE application/x-font-opentype +AddOutputFilterByType DEFLATE application/x-font-otf +AddOutputFilterByType DEFLATE application/x-font-truetype +AddOutputFilterByType DEFLATE application/x-font-ttf +AddOutputFilterByType DEFLATE application/x-javascript +AddOutputFilterByType DEFLATE application/xhtml+xml +AddOutputFilterByType DEFLATE application/xml +AddOutputFilterByType DEFLATE font/opentype +AddOutputFilterByType DEFLATE font/otf +AddOutputFilterByType DEFLATE font/ttf +AddOutputFilterByType DEFLATE image/png +AddOutputFilterByType DEFLATE image/svg+xml +AddOutputFilterByType DEFLATE image/x-icon +AddOutputFilterByType DEFLATE text/css +AddOutputFilterByType DEFLATE text/html +AddOutputFilterByType DEFLATE text/javascript +AddOutputFilterByType DEFLATE text/xml + +# Bloquer ETag +Header unset ETag +FileETag none + +# Protection de la lecture des répertoires +Options -Indexes + +# protection du htaccess + +order allow,deny +deny from all + + +# erreur 404 +ErrorDocument 404 /404.html diff --git a/front/public/404.html b/front/public/404.html new file mode 100644 index 0000000..b6841dc --- /dev/null +++ b/front/public/404.html @@ -0,0 +1,56 @@ + + + + + + + + WikiLerni : page non trouvée + + + + + + + + + + + +
+ WikiLerni (logo) + +
+ +
+ Logo WikiLerni +

Cultivons notre jardin !

+
+ +
+
+

Page non trouvée !

+

La page que vous demandez n'a pas été trouvée !
Peut-être a-t'elle été supprimée ou déplacée ?

+

+

+ Illustration : page non trouvée +
Crédit illustration : CC BY-SA coursetakers.ae
+

+
+
+ + + \ No newline at end of file diff --git a/front/public/JS/accountUser.app.js b/front/public/JS/accountUser.app.js new file mode 100644 index 0000000..727b9be --- /dev/null +++ b/front/public/JS/accountUser.app.js @@ -0,0 +1,1463 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "./src/accountUser.js"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "../config/instance.js": +/*!*****************************!*\ + !*** ../config/instance.js ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var _module$exports; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var users = __webpack_require__(/*! ./users */ "../config/users.js"); + +var questionnaires = __webpack_require__(/*! ./questionnaires */ "../config/questionnaires.js"); + +module.exports = (_module$exports = { + apiUrl: "http://localhost:3000/api", + siteUrl: "http://localhost:8080", + adminName: "Fabrice", + adminEmail: "dev@wikilerni.com", + senderName: "WikiLerni", + senderEmail: "bonjour@wikilerni.com", + adminLang: "fr", + theme: "default", + // le thème utilisé (dans /views) pour générer les pages HTML. Contient ses propres fichiers de configuration. + availableLangs: ["fr"], + // Languages in which the site is available. The first one is the default one. + siteName: "WikiLerni", + beginCodeGodfather: "wikilerni", + // case-sensitive and can't contain "@" ! + cronTimingAlertInSeconde: 120, + // for logs + responseTimingAlertInSeconde: 3, + // idem + tokenSignupValidationTimeInHours: "48h", + // https://github.com/zeit/ms + tokenLoginLinkTimeInHours: "1h", + tokenConnexionMinTimeInHours: "24h", + tokenConnexionMaxTimeInDays: "180 days", + tokenLoginChangingTimeInHours: "1h", + // for email & password changing + tokenDeleteUserTimeInHours: "1h", + tokenUnsubscribeLinkTimeInDays: "7 days", + // token send with subscription's emails + freeAccountTimingInDays: 10, + freeAccountExpirationNotificationInDays: 5, + accountExpirationFirstNotificationInDays: 14, + accountExpirationSecondNotificationInDays: 5, + inactiveAccountTimeToDeleteInDays: 180, + // Questionnaires: + nbQuestionsMin: 1, + // minimum number of questions for the questionnaire to be publishable + nbQuestionsMax: 10, + // if 0 = not maximum + nbChoicesMax: 10, + nbNewQuestionnaires: 10, + // for RSS, etc. + hourGiveNewQuestionnaireBegin: 1, + // in user local time + hourGiveNewQuestionnaireEnd: 24, + // idem + numberNewQuestionnaireAtSameTime: 50, + // for mass mailing + minSearchQuestionnaires: 3, + // Illustrations: + nbIllustrationsMin: 0, + nbIllustrationsMax: 1, + maxIllustrationSizeinOctet: 1000000, + // pas contrôlé pour l'instant. À revoir. + mimeTypesForIllustration: ["image/jpg", "image/jpeg", "image/png", "image/gif", "image/png"], + // -- Upload and resize: + illustrationsWidthMaxInPx: 400, + illustrationsMiniaturesWidthMaxInPx: 200, + // Links: + nbLinksMin: 1, + nbLinksMax: 1 +}, _defineProperty(_module$exports, "nbQuestionsMin", questionnaires.nbQuestionsMin), _defineProperty(_module$exports, "nbQuestionsMax", questionnaires.nbQuestionsMax), _defineProperty(_module$exports, "nbChoicesMax", questionnaires.nbChoicesMax), _defineProperty(_module$exports, "passwordMinLength", users.password.minlength), _defineProperty(_module$exports, "dirCacheUsers", users.dirCacheUsers), _defineProperty(_module$exports, "dirCacheUsersAnswers", users.dirCacheUsersAnswers), _defineProperty(_module$exports, "dirCacheQuestionnaires", questionnaires.dirCacheQuestionnaires), _defineProperty(_module$exports, "dirCacheQuestions", questionnaires.dirCacheQuestions), _defineProperty(_module$exports, "dirCacheUsersQuestionnaires", questionnaires.dirCacheUsersQuestionnaires), _defineProperty(_module$exports, "dirHTMLQuestionnaire", questionnaires.dirHTMLQuestionnaire), _defineProperty(_module$exports, "dirWebQuestionnaire", questionnaires.dirWebQuestionnaire), _module$exports); + +/***/ }), + +/***/ "../config/questionnaires.js": +/*!***********************************!*\ + !*** ../config/questionnaires.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + // API'routes (after "apiUrl" defined in instance.js) + questionnaireRoutes: "/questionnaire", + getQuestionnaireRoutes: "/get", + previewQuestionnaireRoutes: "/preview", + publishedQuestionnaireRoutes: "/quiz/", + saveAnswersRoute: "/answer/", + getStatsQuestionnaires: "/stats/", + searchQuestionnairesRoute: "/search", + searchAdminQuestionnairesRoute: "/searchadmin", + getListNextQuestionnaires: "/getlistnextquestionnaires/", + // -- questions & choices : + questionsRoute: "/question/", + // -- tags : + tagsSearchRoute: "/tags/search/", + // -- answers : + getQuestionnairesWithoutAnswer: "/withoutanswer/user/", + getPreviousAnswers: "/user/answers/", + getStatsAnswers: "/user/anwswers/stats/", + getAdminStats: "/getadminstats/", + // forms : à compléter avec valeurs par défaut, etc. cf modèle + Questionnaire: { + title: { + maxlength: 255, + required: true + }, + slug: { + maxlength: 150 + }, + // champ requis mais calculé à partir du titre qd vide + introduction: { + required: true + } + }, + searchQuestionnaires: { + minlength: 3, + required: true + }, + Question: { + text: { + maxlength: 255, + required: true + }, + rank: { + required: true, + min: 1, + defaultValue: 1 + } + }, + Choice: { + text: { + maxlength: 255, + required: true + } + }, + nbQuestionsMin: 1, + nbQuestionsMax: 10, + nbChoicesMax: 10, + nbTagsMin: 0, + nbTagsMax: 0, + // 0 = not max + // JSON and HTML dir + dirCacheQuestionnaires: "datas/questionnaires", + dirCacheQuestions: "datas/questionnaires/questions", + dirCacheUsersQuestionnaires: "datas/users/questionnaires", + dirCacheTags: "datas/questionnaires/tags", + dirHTMLQuestionnaire: "front/public/quiz", + dirHTMLTags: "front/public/quizs", + dirWebQuestionnaire: "quiz", + //pour url page + dirWebTags: "quizs" // idem + +}; + +/***/ }), + +/***/ "../config/users.js": +/*!**************************!*\ + !*** ../config/users.js ***! + \**************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + // API'routes (after "apiUrl" defined in instance.js) + userRoutes: "/user", + subscribeRoute: "/signup", + getGodfatherRoute: "/getgodfatherid", + checkIfIsEmailfreeRoute: "/isemailfree", + checkSubscribeTokenRoute: "/validation/", + checkLoginRoute: "/checklogin/", + connectionRoute: "/login", + getLoginLinkRoute: "/getloginlink", + connectionWithLinkRoute: "/checkloginlink", + getUserInfos: "/get/", + createUserRoute: "/create", + validateUserRoute: "/validate/", + updateUserInfos: "/modify/", + searchUserRoute: "/search/", + getGodChilds: "/getgodchilds/", + checkNewLoginLinkRoute: "/confirmnewlogin/", + checkDeleteLinkRoute: "/confirmdelete/", + getPayments: "/payment/getforoneuser/", + unsubscribeRoute: "/subscription/stop/", + getAdminStats: "/getadminstats/", + // forms : à compléter avec valeurs par défaut, etc. cf modèle + name: { + maxlength: 70, + required: true + }, + email: { + maxlength: 255, + required: true + }, + password: { + minlength: 8, + maxlength: 72, + required: true + }, + // https://www.npmjs.com/package/bcrypt#security-issues-and-concerns + newPassword: { + minlength: 8, + maxlength: 72 + }, + codeGodfather: { + maxlength: 255 + }, + cguOk: { + value: "true", + required: true + }, + timeDifferenceMin: -720, + timeDifferenceMax: 840, + // JSON dir + dirCacheUsers: "datas/users", + dirCacheUsersAnswers: "datas/users/questionnaires/answers" +}; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/general$": +/*!**************************************!*\ + !*** ../lang sync ^\.\/.*\/general$ ***! + \**************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/general": "../lang/fr/general.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/general$"; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/subscription$": +/*!*******************************************!*\ + !*** ../lang sync ^\.\/.*\/subscription$ ***! + \*******************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/subscription": "../lang/fr/subscription.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/subscription$"; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/user$": +/*!***********************************!*\ + !*** ../lang sync ^\.\/.*\/user$ ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/user": "../lang/fr/user.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/user$"; + +/***/ }), + +/***/ "../lang/fr/general.js": +/*!*****************************!*\ + !*** ../lang/fr/general.js ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + siteHTMLTitle: "WikiLerni : qu'allez-vous apprendre aujourd'hui ?", + siteMetaDescription: "Chaque jour, testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.", + scriptTimingInfo: "Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", + scriptTimingAlert: "*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", + serverError: "Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.", + serverErrorAdmin: "Bug de l'application :", + neededParams: "Des paramètres nécessaires manquants sont manquants.", + badUrl: "Tentative d'accès à une page n'existant pas :", + notValidFormat: "Format non valide.", + notAllowed: "Vous n'avez pas les droits nécessaires pour cette action.", + notRequired: "Facultatif.", + updateBtnTxt: "Modifier", + addBtnTxt: "Ajouter", + deleteBtnTxt: "Supprimer", + addOkMessage: "Les données ont bien été enregistrées.", + updateOkMessage: "La mise à jour à jour a bien été enregistrée.", + deleteOkMessage: "La suppression a bien été enregistrée.", + failAuth: "Erreur d'authentification.", + failAuthHeader: "Absence de header Authorization.", + failAuthToken: "Token invalide ou utilisateur non trouvé.", + failAuthId: "Identifiant non valide : ", + failAuthCron: "Tentative de lancement d'un cron sans le bon token.", + previousPage: "Page précédente", + nextPage: "Page suivante", + btnLinkToQuestionnaire: "Aller au quiz !", + statsAdmin: "Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium." +}; + +/***/ }), + +/***/ "../lang/fr/subscription.js": +/*!**********************************!*\ + !*** ../lang/fr/subscription.js ***! + \**********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + needNumberOfDays: "Il faut un nombre de jours pour l'abonnement.", + needIntegerNumberOfDays: "Le nombre de jours de l'abonnement doit être un nombre entier.", + needMinNumberOfDays: "Le nombre de jours de l'abonnement ne peut être négatif !", + needNotTooLongDaysList: "La liste de jours sélectionnés n'a pas le bon format (trop longue).", + needValidDaysList: "La liste de jours sélectionnés n'a pas le bon format. Caractère non valide : ", + needUniqueDaysList: "La liste de jours sélectionnés n'a pas le bon format. Doublon : ", + needKnowIfNoticeOk: "Il manque l'information sur l'acceptation ou non de recevoir des notifications.", + unsubscriptionOk: "Votre demande a bien été prise en compte. Vous ne recevrez plus de messages venant du site, sauf pour vous signaler la fin de votre abonnement.
N'hésitez pas à accéder à votre compte pour de nouveau autoriser certains envois.", + unsubscriptionFail: "Si vous voyez ce message, c'est que votre lien de désabonnement ne fonctionne pas.
Vous pouvez accéder à votre compte pour désactiver les envois manuellement.", + allSubscriptionProcessed: "Tous les abonnés ont été traités pour le moment.", + mailNewQuestionnaireSubject: "Qu'allez-vous apprendre aujourd'hui ?", + mailNewQuestionnaireBodyTxt: "Bonjour USER_NAME,\n\nUn nouveau quiz vient de vous être proposé :\nQUESTIONNAIRE_URL\n\nBonne lecture !\n\nStopper les envois ?\nUNSUBSCRIBE_URL", + mailNewQuestionnaireBodyHTML: "

Bonjour USER_NAME,

MAIL_INTRODUCTION

Stopper les envois.

", + noNewQuestionnaireForUser: "Aucun nouveau questionnaire trouvé pour un abonné : ", + mailEndFreeTimeSubject: "Votre abonnement gratuit va expirer", + mailEndFreeTimeBodyTxt: "Bonjour USER_NAME,\nVotre abonnement gratuit à SITE_NAME va expirer d'ici quelques jours.\nPour continuer à utiliser le site, vous pouvez souscrire à un abonnement dès aujourd'hui :\nLINK_URL", + mailEndFreeTimeBodyHTML: "

Bonjour USER_NAME,

Votre abonnement gratuit à SITE_NAME va expirer d'ici quelques jours. Pour continuer à utiliser le site, vous pouvez souscrire à un abonnement dès aujourd'hui en cliquez ici sans tarder.

", + mailEndFreeTimeMessage: " relances envoyées.", + mailExpirationSubject: "Votre abonnement va bientôt expirer", + mailExpirationBodyTxt: "Bonjour USER_NAME,\nVotre abonnement gratuit à SITE_NAME va expirer d'ici quelques jours.\nPour continuer à utiliser le site, vous pouvez le prolonger dès aujourd'hui :\nLINK_URL", + mailExpirationBodyHTML: "

Bonjour USER_NAME,

Votre abonnement à SITE_NAME va expirer d'ici quelques jours.
Pour continuer à utiliser le site, vous pouvez le prolonger dès aujourd'hui en cliquant ici.

", + mailExpirationMessage: "FIRST premières et SECOND deuxièmes relances envoyées pour des abonnements expirant d'ici peu.", + infosNbDays: "Votre abonnement est encore valable pendant NB_DAYS jours.
Vous pouvez à tout moment prolonger votre abonnement en suivant les indications ci-dessous :", + infosExpirated: "Votre abonnement a expiré, mais il vous reste encore quelques jours avant que votre compte et vos données ne soient complètement supprimées.
Pour ce faire, suivez sans tarder les indications ci-dessous :", + infosNbDaysAdmin: "Cet abonnement est encore valable pendant NB_DAYS jours.", + infosExpiratedAdmin: "Cet abonnement a expiré.", + isNotValided: "Cet utilisateur n'a pas encore validé son compte.
Vous pouvez le faire à sa place en cochant la case indiquée et enregistrant.", + infosPaymentsAdmin: "DATE_PAYMENT : paiement de AMOUNT € au nom de CLIENT_NAME." +}; + +/***/ }), + +/***/ "../lang/fr/user.js": +/*!**************************!*\ + !*** ../lang/fr/user.js ***! + \**************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + notFound: "L'utilisateur n'a pas été trouvé.", + needName: "Merci de choisir un nom d'utilisateur.", + needNotTooLongName: "Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.", + needEmail: "Merci de saisir votre adresse e-mail.", + needUniqueEmail: "L'adresse e-mail que vous avez saisie est déjà utilisée par un autre utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.", + needNotTooLongEmail: "Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.", + needPassWord: "Merci de fournir un mot de passe.", + needLongPassWord: "Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.", + passwordCopied: "Le mot de passe généré a été copié dans le presse-papier. Vous pouvez le recopier où vous le souhaiter.", + needStatus: "Il manque le statut.", + needLanguage: "Il manque le code langue.", + needValidLastConnectionDate: "La date de dernière connexion n'est pas valide.", + needSMTP: "Il manque le serveur SMTP.", + needSMTPNotFound: "Il manque le serveur SMTP.", + needKnowNewsletterOk: "Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.", + needTimeDifference: "Il faut connaître le nombre de minutes du décalage horaire.", + needMinTimeDifference: "Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.", + needMaxTimeDifference: "Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.", + needUGCOk: "Vous devez accepter les CGU pour pouvoir créer votre compte. ", + godfatherNotFound: "Aucun utilisateur valide trouvé pour ce code parrain.", + godfatherFound: "Votre parrain a bien été trouvé !", + mailValidationMessage: "Votre inscription est bien enregistrée.\nPour la finaliser, merci de cliquer dans les 24H sur le lien de confirmation qui vient de vous être envoyé par e-mail.", + mailValidationLinkSubject: "Merci de valider votre compte", + mailValidationLinkSBodyTxt: "Bonjour USER_NAME,\n\nPour valider votre compte, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL", + mailValidationLinkSBodyHTML: "

Bonjour USER_NAME,

Pour valider votre compte, merci de cliquer sur le lien suivant dans les 24h.

Valider.

", + validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue !
Vous pouvez sans tarder vous connecter ci-dessous pour accéder à votre compte.", + validationMessageAdmin: "Le compte a bien été validé.", + validationAlreadyMessage: "Il semble que vous ayez déjà validé votre compte.", + validationAlreadyMessageAdmin: "Ce compte a déjà été validé.", + mailWelcomeSubject: "Bienvenue !", + mailWelcomeBodyTxt: "Bonjour USER_NAME,\nVotre venez de valider votre inscription à NOM_SITE.\nMerci et à bientôt !", + mailWelcomeBodyHTML: "

Bonjour USER_NAME,

Votre venez de valider votre inscription à NOM_SITE.

Merci et à bientôt !

", + mailThankGodfatherSubject: "Merci !", + mailThankGodfatherBodyTxt: "Bonjour USER_NAME,\nGrâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nMerci et à bientôt !", + mailThankGodfatherBodyHTML: "

Bonjour USER_NAME,

Grâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.

Merci et à bientôt !

", + badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.", + emailNotFound: "Aucun utilisateur trouvé pour cette adresse e-mail.", + alreadyConnected: "Vous êtes déjà connecté(e) au site !", + needBeConnected: "Vous devez être connecté(e) pour accéder à cette page.", + connectionOk: "Connexion réussie.", + needChooseLoginWay: "Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.", + needValidationToLogin: "Vous devez d'abord valider votre compte avant de vous connecter. Pour ce faire, un lien vient de vous être envoyé par e-mail.", + tooManyLoginFails: "Trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.", + badPassword: "Le mot de passe n'est pas le bon.", + mailLoginLinkSubject: "Votre lien de connexion.", + mailLoginLinkBodyTxt: "Bonjour USER_NAME,\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : LINK_URL", + mailLoginLinkBodyHTML: "

Bonjour USER_NAME,

Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :

Valider.

", + mailLoginLinkMessage: "Un lien de connexion vient de vous être envoyé sur votre adresse e-mail. Ne tardez pas à l'utiliser, car il n'est valable que durant ", + updatedOkMessage: "Vos informations ont bien été mises à jour.", + updatedNeedGoodEmail: "Mais la nouvelle adresse e-mail n'a pu être enregistrée car elle n'a pas une format correct.", + updatedNeedUniqueEmail: "Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.", + mailUpdateLoginSubject: "Merci de valider vos nouveaux identifiants.", + mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL", + mailUpdateLoginBodyHTML: "

Bonjour USER_NAME,

Pour valider vos nouveaux identifiants de connexion, cliquez ici sans tarder.

", + mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (email et/ou mot de passe) et vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement. En attendant, merci de continuer à utiliser vos anciens identifiants.", + updatedNeedValidatedUser: "L'utilisateur que vous souhaité modifier n'existe pas/plus ou n'a pas encore validé son compte.", + updatedNeedGoodGodfather: "Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.", + mailUpdateLoginOkMessage: "La mise à jour de vos identifiants a bien été enregistrée.", + updatedFailedGodfatherNotFound: "L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.", + creationOkMessage: "Le nouvel utilisateur a bien été enregistré.", + mailDeleteSubject: "Confirmer la suppression de votre compte.", + mailDeleteBodyTxt: "Bonjour USER_NAME,\nPour valider la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL", + mailDeleteBodyHTML: "

Bonjour USER_NAME,

Pour valider la suppression de votre compte, cliquez ici sans tarder.

", + mailDeleteLinkMessage: "Votre demande de suppression a bien été enregistrée. Merci de cliquer sans tarder sur le lien qui vient de vous être envoyé par e-mail pour confirmer.", + deleteOkMessage: "L'utilisateur a bien été supprimé.", + deleteFailMessage: "Tentative de suppression d'un utilisateur inexistant : ", + mailDeleteLinkOkMessage: "Votre compte a bien été supprimé. Merci d'avoir utilisé nos services.", + mailDeleteLinkAlreadyMessage: "Il semble que vous ayez déjà validé la suppression de votre compte.", + mailDeleteLinkFailMessage: "Votre lien de suppression n'est pas valide ou alors il n'est plus valable.", + cronDeleteUnvalidedUsersMessage: " comptes utilisateurs non validés ont été supprimés.", + deleteInactiveUsersMessage: " comptes utilisateurs inactifs ont été supprimés.", + welcomeMessage: "Bienvenue #NAME !", + byebyeMessage: "Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
À bientôt !", + infosUserForAdmin: "Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
Date de sa dernière connexion : DATE_CONNECTION.", + infosAdminGodfather: "Cet utilisateur a été parrainé par ", + infosAdminNbGodChilds: "Ses #NB filleuils : " +}; + +/***/ }), + +/***/ "../tools/main.js": +/*!************************!*\ + !*** ../tools/main.js ***! + \************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +// Quelques fonctions utiles pour les chaînes +var Tool = /*#__PURE__*/function () { + function Tool() { + _classCallCheck(this, Tool); + } + + _createClass(Tool, null, [{ + key: "isEmpty", + value: function isEmpty(myVar) { + if (myVar === undefined || myVar === null) return true;else { + myVar += ""; // si autre chose qu'une chaîne envoyé... + + myVar = myVar.trim(); + if (myVar === "") return true;else return false; + } + } + }, { + key: "trimIfNotNull", + value: function trimIfNotNull(myString) { + if (Tool.isEmpty(myString)) myString = null;else { + myString += ""; // si autre chose qu'une chaîne envoyé... + + myString = myString.trim(); + } + return myString; + } + }, { + key: "shortenIfLongerThan", + value: function shortenIfLongerThan(myString, max) { + myString += ""; // au cas où cela ne serait pas une chaîne... + + if (myString.length > max) myString = myString.substring(0, max - 3) + "..."; + return myString; + } // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings + + }, { + key: "replaceAll", + value: function replaceAll(myString, mapObj) { + var replaceElts = new RegExp(Object.keys(mapObj).join("|"), "gi"); + return myString.replace(replaceElts, function (matched) { + return mapObj[matched]; + }); + } // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random + + }, { + key: "getRandomInt", + value: function getRandomInt(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min)) + min; + } // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country + + }, { + key: "dateFormat", + value: function dateFormat(dateString) { + var lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "fr"; + if (Tool.isEmpty(dateString)) return ""; + var myDate = new Date(dateString); + var myDay = myDate.getDate() + ""; + if (myDay.length === 1) myDay = "0" + myDay; + var myMounth = myDate.getMonth() + 1 + ""; + if (myMounth.length === 1) myMounth = "0" + myMounth; + var myYear = myDate.getFullYear(); + if (lang === "fr") return myDay + "/" + myMounth + "/" + myYear;else if (lang === "form") // 2014-02-09 + return myYear + "-" + myMounth + "-" + myDay;else return myMounth + "/" + myDay + "/" + myYear; + } + }]); + + return Tool; +}(); + +module.exports = Tool; + +/***/ }), + +/***/ "../views sync recursive ^\\.\\/.*\\.js$": +/*!**********************************!*\ + !*** ../views sync ^\.\/.*\.js$ ***! + \**********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./default/config/fr.js": "../views/default/config/fr.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../views sync recursive ^\\.\\/.*\\.js$"; + +/***/ }), + +/***/ "../views/default/config/fr.js": +/*!*************************************!*\ + !*** ../views/default/config/fr.js ***! + \*************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + headLinks: [{ + anchor: "Accueil", + attributes: { + href: "/" + } + }, { + anchor: "Mon compte", + attributes: { + href: "/connexion.hmt", + id: "accountHeadLink" + } + }, { + anchor: "À propos", + attributes: { + href: "/a-propos.html" + } + }, { + anchor: "Contact", + attributes: { + href: "/contact.html" + } + }], + footLinks: [{ + anchor: "Crédits", + attributes: { + href: "/credits.html" + } + }, { + anchor: "Mentions légales", + attributes: { + href: "/mentions-legales.html", + rel: "nofollow" + } + }, { + anchor: "Données personnelles", + attributes: { + href: "/donnees.html" + } + }, { + anchor: "C.G.U.", + attributes: { + href: "/cgu.html", + rel: "nofollow" + } + }, { + anchor: "C.G.V.", + attributes: { + href: "/cgv.html", + rel: "nofollow" + } + }], + maxQuestionnairesByPage: 10, + userHomePage: "accueil.html", + adminHomePage: "admin.html", + managerHomePage: "gestion.html", + subscribePage: "inscription.html", + connectionPage: "connexion.html", + accountPage: "compte.html", + questionnairesManagementPage: "gestion-quizs.html", + usersManagementPage: "gestion-utilisateurs.html", + nbQuestionnairesUserHomePage: 10, + illustrationDir: "/img/quizs/", + siteSlogan: "Cultivons notre jardin !", + homeTitle1: "De nature curieuse ?", + homeP1: "Avec WikiLerni vous apprenez chaque jour de nouvelles choses.
Des articles de Wikipédia sont sélectionnés pour vous et sont suivis d'un quiz vous permettant de tester ce que vous en avez retenu.
De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre \"jardin\".", + homeTitle2: "La culture en liberté", + homeP2: "Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.

(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.", + newQuestionnairesTitle: "Les derniers quizs publiés sur WikiLerni", + newQuestionnairesIntro: "Liste des derniers quizs publiés sur WikiLerni.", + explanationTitle: "Vous découvrez WikiLerni ?", + explanationTxt: "Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.

Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.

Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)

Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.

Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.", + noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript." +}; + +/***/ }), + +/***/ "./src/accountUser.js": +/*!****************************!*\ + !*** ./src/accountUser.js ***! + \****************************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ "../config/instance.js"); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js"); +/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js"); +/* harmony import */ var _tools_forms_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/forms.js */ "./src/tools/forms.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tools/users.js */ "./src/tools/users.js"); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + +// -- GESTION DES FORMULAIRES PERMETTANT AUX UTILISATEURS DE METTRE À JOUR LEURS INFORMATIONS + LEUR ABONNEMENT +/// Vérifier que l'utilisateur est bien connecté, a le bon statut et le rediriger vers le formulaire d'inscription si ce n'est pas le cas. +/// Si c'est ok, on récupère les infos de son compte et son abonnement et les affiche dans le formulaire. +/// Une information est affichée concernant la possibilité de parrainage et les listes les filleuils existants. +/// Un menu permet à l'utilisateur d'accéder à la modification de ses infos, etc. +/// Des boutons de paiement sont aussi affichés suivant le choix de l'utilisateur pour lui permettre de prolonger son abonnement. +/// Un message venant d'une autre page peut aussi être à afficher lors du premier chargement. +/// Ajout test email en doublon avant envoi ? +// Fichier de configuration côté client : + +var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0]; + +var configFrontEnd = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); // Fonctions utiles au script : !! revoir quand le rest sera fini pour vérifier si tout est utile + + + + + + + + // Dictionnaires : + +var txt = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + lang + "/general"); + +var txtUsers = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/user$")("./" + lang + "/user"); + +var txtSubscriptions = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/subscription$")("./" + lang + "/subscription"); // Principaux éléments du DOM manipulés : + + +var divMain = document.getElementById("main-content"); +var divMessage = document.getElementById("message"); +var divResponse = document.getElementById("response"); +var divGodchilds = document.getElementById("godchilds"); +var divSubscribeIntro = document.getElementById("subscribeIntro"); +var formAccount = document.getElementById("accountUpdate"); +var newPassword = document.getElementById("newPassword"); +var showGFEmail = document.getElementById("godfatherEmail"); +var showGFCode = document.getElementById("godfatherCode"); +Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["helloDev"])(); + +var initialise = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + var config, isConnected, user, getInfos, divCGV, div180, div365, divWP180, divWP365, divWPNone, xhrGetGodchilds; + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _context.prev = 0; + _context.next = 3; + return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_6__["getConfig"])(); + + case 3: + config = _context.sent; + + if (config) { + _context.next = 8; + break; + } + + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]); + _context.next = 12; + break; + + case 8: + _context.next = 10; + return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_6__["checkSession"])(["user"], "/" + configFrontEnd.connectionPage, { + message: txtUsers.needBeConnected, + color: "error" + }, window.location); + + case 10: + isConnected = _context.sent; + + if (isConnected) { + divMain.style.display = "block"; + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message"))) { + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "p", Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message", true).message, "", [Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message", true).color], "", false); + Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["removeLocaly"])("message"); + } + + user = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("user", true); + Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["updateAccountLink"])(user.status, configFrontEnd); // Initialise le formulaire permettant de mettre à jour les infos : + + Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(config, formAccount); // Certains navigateurs ont tendance à remplir tout seul les champs password + + newPassword.value = ""; // Fonction affichant les infos connues au premier affichage puis après envoi mise à jour + + getInfos = function getInfos() { + var xhrGetInfos = new XMLHttpRequest(); + xhrGetInfos.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.userRoutes + config.getUserInfos + user.id); + + xhrGetInfos.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var response = JSON.parse(this.responseText); + + if (this.status === 200 && response.User != undefined && response.Subscription != undefined) { + for (var data in response.User) { + if (formAccount.elements[data] !== undefined) { + if (response.User[data] !== true && response.User[data] !== false) // booléen = case à cocher ! + formAccount.elements[data].value = response.User[data];else if (response.User[data] == true) // si false, on ne fait rien + formAccount.elements["" + data].checked = "checked"; + } + } // infos de l'abonnement + + + if (response.Subscription.noticeOk == true) formAccount.elements["noticeOk"].checked = "checked"; // jours de réception + + for (var i in response.Subscription.receiptDays) { + formAccount.elements["d" + response.Subscription.receiptDays[i]].checked = "checked"; + } + + showGFEmail.innerHTML = response.User.email; + showGFCode.innerHTML = config.beginCodeGodfather + response.User.id; + } + + var beginSubTS = new Date(response.Subscription.createdAt).getTime(); + var nbDaysOk = response.Subscription.numberOfDays - Math.round((Date.now() - beginSubTS) / 1000 / 3600 / 24); + if (nbDaysOk > 0) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divSubscribeIntro, "p", txtSubscriptions.infosNbDays.replace("NB_DAYS", nbDaysOk), "", ["information"]);else { + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divSubscribeIntro, "p", txtSubscriptions.infosExpirated.replace("NB_DAYS", nbDaysOk), "", ["error"]); + window.location.assign("#subscribe"); + } + } + }; + + xhrGetInfos.setRequestHeader("Authorization", "Bearer " + user.token); + xhrGetInfos.send(); + }; // Remonte les infos déjà enregistrées : + + + getInfos(); // Traitement de l'envoi d'une mise à jour des infos + + formAccount.addEventListener("submit", function (e) { + e.preventDefault(); + divResponse.innerHTML = ""; + var datas = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["getDatasFromInputs"])(formAccount); // recomposition des jours valables pour l'abonnement : + + datas.receiptDays = ""; + + for (var i = 1; i <= 7; i++) { + if (datas["d" + i] !== undefined) datas.receiptDays += "" + i; + } + + if (datas.noticeOk === undefined) datas.noticeOk = "false"; + if (datas.newsletterOk === undefined) datas.newsletterOk = "false"; + datas.timeDifference = Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_6__["getTimeDifference"])(config); + var xhrUserUpdate = new XMLHttpRequest(); + if (datas.deleteOk !== undefined) xhrUserUpdate.open("DELETE", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.userRoutes + "/" + user.id);else xhrUserUpdate.open("PUT", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.userRoutes + config.updateUserInfos + user.id); + + xhrUserUpdate.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var response = JSON.parse(this.responseText); + + if (this.status === 200 && response.message != undefined) { + if (Array.isArray(response.message)) response.message = response.message.join("
");else response.message = response.message; + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", response.message, "", ["success"]); + } else if (response.errors) { + if (Array.isArray(response.errors)) response.errors = response.errors.join("
");else response.errors = txt.serverError; + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", response.errors, "", ["error"]); + } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]); // dans tous les cas, je mets à jour le contenu du formulaire : + + + getInfos(); + } + }; + + xhrUserUpdate.setRequestHeader("Content-Type", "application/json"); + xhrUserUpdate.setRequestHeader("Authorization", "Bearer " + user.token); + + if (datas) { + datas.output = "html"; + xhrUserUpdate.send(JSON.stringify(datas)); + } + }); // on passe à la caisse ? + + divCGV = document.getElementById("CGVOk"); + div180 = document.getElementById("180Ok"); + div365 = document.getElementById("365Ok"); + divWP180 = document.getElementById("WPBtn180"); + divWP365 = document.getElementById("WPBtn365"); + divWPNone = document.getElementById("WPNone"); + divCGV.addEventListener("change", function (e) { + // on commence par tout (re)cacher : + divWP180.style.display = "none"; + divWP365.style.display = "none"; + divWPNone.style.display = "none"; + + if (divCGV.checked === true) { + if (div180.checked === true) divWP180.style.display = "block";else if (div365.checked === true) divWP365.style.display = "block";else { + divWPNone.style.display = "block"; + divCGV.checked = false; + } + } + }); // Liste des filleuils, si il y en a - revoir afficher un code parrainage en plus de l'email + + xhrGetGodchilds = new XMLHttpRequest(); + xhrGetGodchilds.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.userRoutes + config.getGodChilds); + + xhrGetGodchilds.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var response = JSON.parse(this.responseText), + txtGodchilds = ""; + + if (this.status === 200) { + var nbGodchilds = response.length; + if (nbGodchilds === 0) txtGodchilds = "Pas encore d'utilisateur associés à votre compte."; // revoir : utiliser le dictionnaire User + else { + txtGodchilds = nbGodchilds + " utilisateur(s) inscrit(s) grâce à vous : "; + + for (var i in response) { + txtGodchilds += response[i].name + " (" + response[i].email + ") "; + } + } + } + + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divGodchilds, "p", txtGodchilds, "", ["information"]); + } + }; + + xhrGetGodchilds.setRequestHeader("Authorization", "Bearer " + user.token); + xhrGetGodchilds.send(); + } + + case 12: + _context.next = 17; + break; + + case 14: + _context.prev = 14; + _context.t0 = _context["catch"](0); + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "p", txt.serverError, "", ["error"]); + + case 17: + case "end": + return _context.stop(); + } + } + }, _callee, null, [[0, 14]]); + })); + + return function initialise() { + return _ref.apply(this, arguments); + }; +}(); + +initialise(); + +/***/ }), + +/***/ "./src/tools/clientstorage.js": +/*!************************************!*\ + !*** ./src/tools/clientstorage.js ***! + \************************************/ +/*! exports provided: saveLocaly, getLocaly, removeLocaly */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveLocaly", function() { return saveLocaly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaly", function() { return getLocaly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeLocaly", function() { return removeLocaly; }); +// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.) +// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie +var saveLocaly = function saveLocaly(name, data) { + localStorage.setItem(name, JSON.stringify(data)); +}; +var getLocaly = function getLocaly(name) { + var json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name); +}; +var removeLocaly = function removeLocaly(name) { + localStorage.removeItem(name); +}; + +/***/ }), + +/***/ "./src/tools/dom.js": +/*!**************************!*\ + !*** ./src/tools/dom.js ***! + \**************************/ +/*! exports provided: addElement */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addElement", function() { return addElement; }); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__); +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + + // Fonction associant les attributs fournis à un champ de formulaire + +var addElement = function addElement(eltParent, eltType) { + var eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; + var eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; + var eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : []; + var eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; + var replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true; + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltType) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltParent)) return false;else { + var newElement = document.createElement(eltType); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ? + newElement.id = eltId; + + if (Array.isArray(eltClass) && eltClass.length != 0) { + for (var i in eltClass) { + newElement.classList.add(eltClass[i]); + } + } + + if (_typeof(eltAttributes) === "object") // !! tous les objets ne sont pas ok + { + for (var attributName in eltAttributes) { + newElement.setAttribute(attributName, eltAttributes[attributName]); + } + } + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltContent)) newElement.innerHTML = eltContent.replace(/\n/g, "
"); // innerHTML permet d'ajouter du texte ayant lui-même des balises, etc. + + if (replace) eltParent.innerHTML = ""; + eltParent.appendChild(newElement); + } +}; + +/***/ }), + +/***/ "./src/tools/everywhere.js": +/*!*********************************!*\ + !*** ./src/tools/everywhere.js ***! + \*********************************/ +/*! exports provided: helloDev, updateAccountLink */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "helloDev", function() { return helloDev; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateAccountLink", function() { return updateAccountLink; }); +// Ce script fournit des fonctions utilisées sur toutes les pages du site +var helloDev = function helloDev() { + console.log("**** Hello ami développeur :-)\n Le code de WikiLerni est libre et est lisible sur gitlab : \n Bonne lecture :-) \n Pour les suggestions d'amélioration ou questions : dev@wililerni.com ****"); + return true; +}; +var updateAccountLink = function updateAccountLink(status, configTemplate) { + var link = document.getElementById("accountHeadLink"); + var homePage = status + "HomePage"; + link.href = "/" + configTemplate[homePage]; +}; + +/***/ }), + +/***/ "./src/tools/forms.js": +/*!****************************!*\ + !*** ./src/tools/forms.js ***! + \****************************/ +/*! exports provided: setAttributesToInputs, getDatasFromInputs, empyForm, empyAndHideForm */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setAttributesToInputs", function() { return setAttributesToInputs; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDatasFromInputs", function() { return getDatasFromInputs; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empyForm", function() { return empyForm; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empyAndHideForm", function() { return empyAndHideForm; }); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__); +function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + + // Fonction associant les attributs fournis à un champ de formulaire + +var setAttributesToInputs = function setAttributesToInputs(inputsConf, myForm) { + for (var i in myForm.elements) { + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(myForm.elements[i].id)) { + var idInput = myForm.elements[i].id; + + if (inputsConf[idInput] !== undefined) { + var inputHTML = document.getElementById(idInput); + + for (var attribute in inputsConf[idInput]) { + inputHTML.setAttribute(attribute, inputsConf[idInput][attribute]); + } + } + } + } + + return true; +}; // Récupère toutes les valeurs de champs en omettant les checkbox non cochées, etc. + +var getDatasFromInputs = function getDatasFromInputs(myForm) { + var datas = {}; + var formData = new FormData(myForm); + + var _iterator = _createForOfIteratorHelper(formData.entries()), + _step; + + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var entrie = _step.value; + datas[entrie[0]] = entrie[1]; + } + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); + } + + return datas; +}; // Vide tous les champs d'un formulaire, y compris hidden, checkbox, etc. +// Revoir pour les select + +var empyForm = function empyForm(myForm) { + var formData = new FormData(myForm); + + var _iterator2 = _createForOfIteratorHelper(formData.entries()), + _step2; + + try { + for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { + var entrie = _step2.value; + if (myForm.elements[entrie[0]].type == "checkbox" || myForm.elements[entrie[0]].type == "radio") myForm.elements[entrie[0]].checked = false;else myForm.elements[entrie[0]].value = ""; + } + } catch (err) { + _iterator2.e(err); + } finally { + _iterator2.f(); + } + + return true; +}; // Vide et cache le formulaire + +var empyAndHideForm = function empyAndHideForm(myForm) { + empyForm(myForm); + myForm.style.display = "none"; +}; + +/***/ }), + +/***/ "./src/tools/users.js": +/*!****************************!*\ + !*** ./src/tools/users.js ***! + \****************************/ +/*! exports provided: getConfig, getTimeDifference, getPassword, setSession, checkAnswerDatas, checkSession */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getConfig", function() { return getConfig; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTimeDifference", function() { return getTimeDifference; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getPassword", function() { return getPassword; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setSession", function() { return setSession; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkAnswerDatas", function() { return checkAnswerDatas; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkSession", function() { return checkSession; }); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/instance.js */ "../config/instance.js"); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../config/users.js */ "../config/users.js"); +/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_3__); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + + +var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0]; + +var configTemplate = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); + + + + // Récupère les données de configuration des utilisateurs +// À terme, un fichier statique importable comme module devrait éviter une requête ajax + +var getConfig = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + return _context.abrupt("return", new Promise(function (resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + "/user/getconfig"); + + xhr.onload = function () { + return resolve(JSON.parse(xhr.responseText)); + }; + + xhr.onerror = function () { + return reject(xhr.statusText); + }; + + xhr.send(); + })); + + case 1: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + + return function getConfig() { + return _ref.apply(this, arguments); + }; +}(); +var getTimeDifference = function getTimeDifference() { + var timeLocal = new Date().getTimezoneOffset(); + if (timeLocal > _config_users_js__WEBPACK_IMPORTED_MODULE_1__["timeDifferenceMax"] || timeLocal < _config_users_js__WEBPACK_IMPORTED_MODULE_1__["timeDifferenceMin"]) return 0;else return timeLocal; +}; // On enlève volontairement les 0/O pour éviter les confusions ! +// Et mieux vaut aussi débuter et finir par une lettre simple. + +var getPassword = function getPassword(nbCarMin, nbCarMax) { + var nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin)); + var letters = "ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz"; + var others = "123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ"; + var password = letters[Math.floor(Math.random() * letters.length)]; + + for (var i = 1; i < nbCar - 1; i++) { + if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)]; + } + + password += letters[Math.floor(Math.random() * letters.length)]; + return password; +}; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite +// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides. + +var setSession = function setSession(userId, token, durationTS) { + var storageUser = { + id: userId, + token: token, + duration: durationTS + }; + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("user", storageUser); +}; // Vérifie qu'il y a des données locales concernant le résultat d'un quiz +// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas + +var checkAnswerDatas = function checkAnswerDatas(datas) { + var lastAnswer = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("lastAnswer"); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(lastAnswer)) { + var answer = JSON.parse(lastAnswer); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.duration) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbCorrectAnswers) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.QuestionnaireId) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbQuestions)) { + datas.duration = answer.duration; + datas.nbCorrectAnswers = answer.nbCorrectAnswers; + datas.QuestionnaireId = answer.QuestionnaireId; + datas.nbQuestions = answer.nbQuestions; + } + } + + return datas; +}; // Cette fonction teste la connexion de l'utilisateur d'une page +// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté + +var checkSession = /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() { + var status, + urlRedirection, + message, + urlWanted, + _args2 = arguments; + return regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + status = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : []; + urlRedirection = _args2.length > 1 ? _args2[1] : undefined; + message = _args2.length > 2 ? _args2[2] : undefined; + urlWanted = _args2.length > 3 ? _args2[3] : undefined; + return _context2.abrupt("return", new Promise(function (resolve, reject) { + var userDatas = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("user"); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(userDatas)) { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else { + var user = JSON.parse(userDatas); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.id) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.token) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.duration) || user.duration < Date.now()) { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else { + var xhr = new XMLHttpRequest(); + xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["userRoutes"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["checkLoginRoute"] + user.token); + + xhr.onload = function () { + var response = JSON.parse(xhr.responseText); + + if (xhr.status === 200 && response.isValid && response.id != undefined) { + if (response.id === user.id) { + user.name = response.name; + user.language = response.language; + user.timeDifference = response.timeDifference; + user.status = response.status; // le token et de toute façon vérifier à chaque requête à l'API + + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("user", user); // si il s'agit d'un "user" et que son abonnement a expiré, je le redirige vers la caisse :-) + + if (response.status === "user" && response.nbDaysOk <= 0) { + var urlAccount = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["siteUrl"] + "/" + configTemplate[lang].accountPage; + if (window.location.href.indexOf(urlAccount) === -1) window.location.assign("/" + configTemplate[lang].accountPage); // passée directement ici, l'ancre #subscribe ne fonctionne pas !? + + resolve(true); + } else { + if (status.length !== 0 && status.indexOf(response.status) === -1) { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else resolve(true); + } + } else { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + } else { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + }; + + xhr.onerror = function () { + return reject(xhr.statusText); + }; + + xhr.send(); + } + } + })); + + case 5: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + + return function checkSession() { + return _ref2.apply(this, arguments); + }; +}(); // Cette fonction sert à la précédente en cas de connexion non valide + +var redirectUser = function redirectUser(urlRedirection, message, urlWanted) { + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(message)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("message", message); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlWanted)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("url", urlWanted); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlRedirection)) window.location.assign(urlRedirection); +}; + +/***/ }) + +/******/ }); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9nZW5lcmFsJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3N1YnNjcmlwdGlvbiQiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC91c2VyJCIsIndlYnBhY2s6Ly8vLi4vbGFuZy9mci9nZW5lcmFsLmpzIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL3N1YnNjcmlwdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi4vbGFuZy9mci91c2VyLmpzIiwid2VicGFjazovLy8uLi90b29scy9tYWluLmpzIiwid2VicGFjazovLy8uLi92aWV3cyBzeW5jIF5cXC5cXC8uKlxcLmpzJCIsIndlYnBhY2s6Ly8vLi4vdmlld3MvZGVmYXVsdC9jb25maWcvZnIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FjY291bnRVc2VyLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy9jbGllbnRzdG9yYWdlLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy9kb20uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2V2ZXJ5d2hlcmUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2Zvcm1zLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy91c2Vycy5qcyJdLCJuYW1lcyI6WyJ1c2VycyIsInJlcXVpcmUiLCJxdWVzdGlvbm5haXJlcyIsIm1vZHVsZSIsImV4cG9ydHMiLCJhcGlVcmwiLCJzaXRlVXJsIiwiYWRtaW5OYW1lIiwiYWRtaW5FbWFpbCIsInNlbmRlck5hbWUiLCJzZW5kZXJFbWFpbCIsImFkbWluTGFuZyIsInRoZW1lIiwiYXZhaWxhYmxlTGFuZ3MiLCJzaXRlTmFtZSIsImJlZ2luQ29kZUdvZGZhdGhlciIsImNyb25UaW1pbmdBbGVydEluU2Vjb25kZSIsInJlc3BvbnNlVGltaW5nQWxlcnRJblNlY29uZGUiLCJ0b2tlblNpZ251cFZhbGlkYXRpb25UaW1lSW5Ib3VycyIsInRva2VuTG9naW5MaW5rVGltZUluSG91cnMiLCJ0b2tlbkNvbm5leGlvbk1pblRpbWVJbkhvdXJzIiwidG9rZW5Db25uZXhpb25NYXhUaW1lSW5EYXlzIiwidG9rZW5Mb2dpbkNoYW5naW5nVGltZUluSG91cnMiLCJ0b2tlbkRlbGV0ZVVzZXJUaW1lSW5Ib3VycyIsInRva2VuVW5zdWJzY3JpYmVMaW5rVGltZUluRGF5cyIsImZyZWVBY2NvdW50VGltaW5nSW5EYXlzIiwiZnJlZUFjY291bnRFeHBpcmF0aW9uTm90aWZpY2F0aW9uSW5EYXlzIiwiYWNjb3VudEV4cGlyYXRpb25GaXJzdE5vdGlmaWNhdGlvbkluRGF5cyIsImFjY291bnRFeHBpcmF0aW9uU2Vjb25kTm90aWZpY2F0aW9uSW5EYXlzIiwiaW5hY3RpdmVBY2NvdW50VGltZVRvRGVsZXRlSW5EYXlzIiwibmJRdWVzdGlvbnNNaW4iLCJuYlF1ZXN0aW9uc01heCIsIm5iQ2hvaWNlc01heCIsIm5iTmV3UXVlc3Rpb25uYWlyZXMiLCJob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVCZWdpbiIsImhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUVuZCIsIm51bWJlck5ld1F1ZXN0aW9ubmFpcmVBdFNhbWVUaW1lIiwibWluU2VhcmNoUXVlc3Rpb25uYWlyZXMiLCJuYklsbHVzdHJhdGlvbnNNaW4iLCJuYklsbHVzdHJhdGlvbnNNYXgiLCJtYXhJbGx1c3RyYXRpb25TaXplaW5PY3RldCIsIm1pbWVUeXBlc0ZvcklsbHVzdHJhdGlvbiIsImlsbHVzdHJhdGlvbnNXaWR0aE1heEluUHgiLCJpbGx1c3RyYXRpb25zTWluaWF0dXJlc1dpZHRoTWF4SW5QeCIsIm5iTGlua3NNaW4iLCJuYkxpbmtzTWF4IiwicGFzc3dvcmQiLCJtaW5sZW5ndGgiLCJkaXJDYWNoZVVzZXJzIiwiZGlyQ2FjaGVVc2Vyc0Fuc3dlcnMiLCJkaXJDYWNoZVF1ZXN0aW9ubmFpcmVzIiwiZGlyQ2FjaGVRdWVzdGlvbnMiLCJkaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXMiLCJkaXJIVE1MUXVlc3Rpb25uYWlyZSIsImRpcldlYlF1ZXN0aW9ubmFpcmUiLCJxdWVzdGlvbm5haXJlUm91dGVzIiwiZ2V0UXVlc3Rpb25uYWlyZVJvdXRlcyIsInByZXZpZXdRdWVzdGlvbm5haXJlUm91dGVzIiwicHVibGlzaGVkUXVlc3Rpb25uYWlyZVJvdXRlcyIsInNhdmVBbnN3ZXJzUm91dGUiLCJnZXRTdGF0c1F1ZXN0aW9ubmFpcmVzIiwic2VhcmNoUXVlc3Rpb25uYWlyZXNSb3V0ZSIsInNlYXJjaEFkbWluUXVlc3Rpb25uYWlyZXNSb3V0ZSIsImdldExpc3ROZXh0UXVlc3Rpb25uYWlyZXMiLCJxdWVzdGlvbnNSb3V0ZSIsInRhZ3NTZWFyY2hSb3V0ZSIsImdldFF1ZXN0aW9ubmFpcmVzV2l0aG91dEFuc3dlciIsImdldFByZXZpb3VzQW5zd2VycyIsImdldFN0YXRzQW5zd2VycyIsImdldEFkbWluU3RhdHMiLCJRdWVzdGlvbm5haXJlIiwidGl0bGUiLCJtYXhsZW5ndGgiLCJyZXF1aXJlZCIsInNsdWciLCJpbnRyb2R1Y3Rpb24iLCJzZWFyY2hRdWVzdGlvbm5haXJlcyIsIlF1ZXN0aW9uIiwidGV4dCIsInJhbmsiLCJtaW4iLCJkZWZhdWx0VmFsdWUiLCJDaG9pY2UiLCJuYlRhZ3NNaW4iLCJuYlRhZ3NNYXgiLCJkaXJDYWNoZVRhZ3MiLCJkaXJIVE1MVGFncyIsImRpcldlYlRhZ3MiLCJ1c2VyUm91dGVzIiwic3Vic2NyaWJlUm91dGUiLCJnZXRHb2RmYXRoZXJSb3V0ZSIsImNoZWNrSWZJc0VtYWlsZnJlZVJvdXRlIiwiY2hlY2tTdWJzY3JpYmVUb2tlblJvdXRlIiwiY2hlY2tMb2dpblJvdXRlIiwiY29ubmVjdGlvblJvdXRlIiwiZ2V0TG9naW5MaW5rUm91dGUiLCJjb25uZWN0aW9uV2l0aExpbmtSb3V0ZSIsImdldFVzZXJJbmZvcyIsImNyZWF0ZVVzZXJSb3V0ZSIsInZhbGlkYXRlVXNlclJvdXRlIiwidXBkYXRlVXNlckluZm9zIiwic2VhcmNoVXNlclJvdXRlIiwiZ2V0R29kQ2hpbGRzIiwiY2hlY2tOZXdMb2dpbkxpbmtSb3V0ZSIsImNoZWNrRGVsZXRlTGlua1JvdXRlIiwiZ2V0UGF5bWVudHMiLCJ1bnN1YnNjcmliZVJvdXRlIiwibmFtZSIsImVtYWlsIiwibmV3UGFzc3dvcmQiLCJjb2RlR29kZmF0aGVyIiwiY2d1T2siLCJ2YWx1ZSIsInRpbWVEaWZmZXJlbmNlTWluIiwidGltZURpZmZlcmVuY2VNYXgiLCJzaXRlSFRNTFRpdGxlIiwic2l0ZU1ldGFEZXNjcmlwdGlvbiIsInNjcmlwdFRpbWluZ0luZm8iLCJzY3JpcHRUaW1pbmdBbGVydCIsInNlcnZlckVycm9yIiwic2VydmVyRXJyb3JBZG1pbiIsIm5lZWRlZFBhcmFtcyIsImJhZFVybCIsIm5vdFZhbGlkRm9ybWF0Iiwibm90QWxsb3dlZCIsIm5vdFJlcXVpcmVkIiwidXBkYXRlQnRuVHh0IiwiYWRkQnRuVHh0IiwiZGVsZXRlQnRuVHh0IiwiYWRkT2tNZXNzYWdlIiwidXBkYXRlT2tNZXNzYWdlIiwiZGVsZXRlT2tNZXNzYWdlIiwiZmFpbEF1dGgiLCJmYWlsQXV0aEhlYWRlciIsImZhaWxBdXRoVG9rZW4iLCJmYWlsQXV0aElkIiwiZmFpbEF1dGhDcm9uIiwicHJldmlvdXNQYWdlIiwibmV4dFBhZ2UiLCJidG5MaW5rVG9RdWVzdGlvbm5haXJlIiwic3RhdHNBZG1pbiIsIm5lZWROdW1iZXJPZkRheXMiLCJuZWVkSW50ZWdlck51bWJlck9mRGF5cyIsIm5lZWRNaW5OdW1iZXJPZkRheXMiLCJuZWVkTm90VG9vTG9uZ0RheXNMaXN0IiwibmVlZFZhbGlkRGF5c0xpc3QiLCJuZWVkVW5pcXVlRGF5c0xpc3QiLCJuZWVkS25vd0lmTm90aWNlT2siLCJ1bnN1YnNjcmlwdGlvbk9rIiwidW5zdWJzY3JpcHRpb25GYWlsIiwiYWxsU3Vic2NyaXB0aW9uUHJvY2Vzc2VkIiwibWFpbE5ld1F1ZXN0aW9ubmFpcmVTdWJqZWN0IiwibWFpbE5ld1F1ZXN0aW9ubmFpcmVCb2R5VHh0IiwibWFpbE5ld1F1ZXN0aW9ubmFpcmVCb2R5SFRNTCIsIm5vTmV3UXVlc3Rpb25uYWlyZUZvclVzZXIiLCJtYWlsRW5kRnJlZVRpbWVTdWJqZWN0IiwibWFpbEVuZEZyZWVUaW1lQm9keVR4dCIsIm1haWxFbmRGcmVlVGltZUJvZHlIVE1MIiwibWFpbEVuZEZyZWVUaW1lTWVzc2FnZSIsIm1haWxFeHBpcmF0aW9uU3ViamVjdCIsIm1haWxFeHBpcmF0aW9uQm9keVR4dCIsIm1haWxFeHBpcmF0aW9uQm9keUhUTUwiLCJtYWlsRXhwaXJhdGlvbk1lc3NhZ2UiLCJpbmZvc05iRGF5cyIsImluZm9zRXhwaXJhdGVkIiwiaW5mb3NOYkRheXNBZG1pbiIsImluZm9zRXhwaXJhdGVkQWRtaW4iLCJpc05vdFZhbGlkZWQiLCJpbmZvc1BheW1lbnRzQWRtaW4iLCJub3RGb3VuZCIsIm5lZWROYW1lIiwibmVlZE5vdFRvb0xvbmdOYW1lIiwibmVlZEVtYWlsIiwibmVlZFVuaXF1ZUVtYWlsIiwibmVlZE5vdFRvb0xvbmdFbWFpbCIsIm5lZWRQYXNzV29yZCIsIm5lZWRMb25nUGFzc1dvcmQiLCJwYXNzd29yZENvcGllZCIsIm5lZWRTdGF0dXMiLCJuZWVkTGFuZ3VhZ2UiLCJuZWVkVmFsaWRMYXN0Q29ubmVjdGlvbkRhdGUiLCJuZWVkU01UUCIsIm5lZWRTTVRQTm90Rm91bmQiLCJuZWVkS25vd05ld3NsZXR0ZXJPayIsIm5lZWRUaW1lRGlmZmVyZW5jZSIsIm5lZWRNaW5UaW1lRGlmZmVyZW5jZSIsIm5lZWRNYXhUaW1lRGlmZmVyZW5jZSIsIm5lZWRVR0NPayIsImdvZGZhdGhlck5vdEZvdW5kIiwiZ29kZmF0aGVyRm91bmQiLCJtYWlsVmFsaWRhdGlvbk1lc3NhZ2UiLCJtYWlsVmFsaWRhdGlvbkxpbmtTdWJqZWN0IiwibWFpbFZhbGlkYXRpb25MaW5rU0JvZHlUeHQiLCJtYWlsVmFsaWRhdGlvbkxpbmtTQm9keUhUTUwiLCJ2YWxpZGF0aW9uTWVzc2FnZSIsInZhbGlkYXRpb25NZXNzYWdlQWRtaW4iLCJ2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2UiLCJ2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2VBZG1pbiIsIm1haWxXZWxjb21lU3ViamVjdCIsIm1haWxXZWxjb21lQm9keVR4dCIsIm1haWxXZWxjb21lQm9keUhUTUwiLCJtYWlsVGhhbmtHb2RmYXRoZXJTdWJqZWN0IiwibWFpbFRoYW5rR29kZmF0aGVyQm9keVR4dCIsIm1haWxUaGFua0dvZGZhdGhlckJvZHlIVE1MIiwiYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlIiwiZW1haWxOb3RGb3VuZCIsImFscmVhZHlDb25uZWN0ZWQiLCJuZWVkQmVDb25uZWN0ZWQiLCJjb25uZWN0aW9uT2siLCJuZWVkQ2hvb3NlTG9naW5XYXkiLCJuZWVkVmFsaWRhdGlvblRvTG9naW4iLCJ0b29NYW55TG9naW5GYWlscyIsImJhZFBhc3N3b3JkIiwibWFpbExvZ2luTGlua1N1YmplY3QiLCJtYWlsTG9naW5MaW5rQm9keVR4dCIsIm1haWxMb2dpbkxpbmtCb2R5SFRNTCIsIm1haWxMb2dpbkxpbmtNZXNzYWdlIiwidXBkYXRlZE9rTWVzc2FnZSIsInVwZGF0ZWROZWVkR29vZEVtYWlsIiwidXBkYXRlZE5lZWRVbmlxdWVFbWFpbCIsIm1haWxVcGRhdGVMb2dpblN1YmplY3QiLCJtYWlsVXBkYXRlTG9naW5Cb2R5VHh0IiwibWFpbFVwZGF0ZUxvZ2luQm9keUhUTUwiLCJtYWlsVXBkYXRlTG9naW5MaW5rTWVzc2FnZSIsInVwZGF0ZWROZWVkVmFsaWRhdGVkVXNlciIsInVwZGF0ZWROZWVkR29vZEdvZGZhdGhlciIsIm1haWxVcGRhdGVMb2dpbk9rTWVzc2FnZSIsInVwZGF0ZWRGYWlsZWRHb2RmYXRoZXJOb3RGb3VuZCIsImNyZWF0aW9uT2tNZXNzYWdlIiwibWFpbERlbGV0ZVN1YmplY3QiLCJtYWlsRGVsZXRlQm9keVR4dCIsIm1haWxEZWxldGVCb2R5SFRNTCIsIm1haWxEZWxldGVMaW5rTWVzc2FnZSIsImRlbGV0ZUZhaWxNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtPa01lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua0FscmVhZHlNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtGYWlsTWVzc2FnZSIsImNyb25EZWxldGVVbnZhbGlkZWRVc2Vyc01lc3NhZ2UiLCJkZWxldGVJbmFjdGl2ZVVzZXJzTWVzc2FnZSIsIndlbGNvbWVNZXNzYWdlIiwiYnllYnllTWVzc2FnZSIsImluZm9zVXNlckZvckFkbWluIiwiaW5mb3NBZG1pbkdvZGZhdGhlciIsImluZm9zQWRtaW5OYkdvZENoaWxkcyIsIlRvb2wiLCJteVZhciIsInVuZGVmaW5lZCIsInRyaW0iLCJteVN0cmluZyIsImlzRW1wdHkiLCJtYXgiLCJsZW5ndGgiLCJzdWJzdHJpbmciLCJtYXBPYmoiLCJyZXBsYWNlRWx0cyIsIlJlZ0V4cCIsIk9iamVjdCIsImtleXMiLCJqb2luIiwicmVwbGFjZSIsIm1hdGNoZWQiLCJNYXRoIiwiY2VpbCIsImZsb29yIiwicmFuZG9tIiwiZGF0ZVN0cmluZyIsImxhbmciLCJteURhdGUiLCJEYXRlIiwibXlEYXkiLCJnZXREYXRlIiwibXlNb3VudGgiLCJnZXRNb250aCIsIm15WWVhciIsImdldEZ1bGxZZWFyIiwiaGVhZExpbmtzIiwiYW5jaG9yIiwiYXR0cmlidXRlcyIsImhyZWYiLCJpZCIsImZvb3RMaW5rcyIsInJlbCIsIm1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlIiwidXNlckhvbWVQYWdlIiwiYWRtaW5Ib21lUGFnZSIsIm1hbmFnZXJIb21lUGFnZSIsInN1YnNjcmliZVBhZ2UiLCJjb25uZWN0aW9uUGFnZSIsImFjY291bnRQYWdlIiwicXVlc3Rpb25uYWlyZXNNYW5hZ2VtZW50UGFnZSIsInVzZXJzTWFuYWdlbWVudFBhZ2UiLCJuYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlIiwiaWxsdXN0cmF0aW9uRGlyIiwic2l0ZVNsb2dhbiIsImhvbWVUaXRsZTEiLCJob21lUDEiLCJob21lVGl0bGUyIiwiaG9tZVAyIiwibmV3UXVlc3Rpb25uYWlyZXNUaXRsZSIsIm5ld1F1ZXN0aW9ubmFpcmVzSW50cm8iLCJleHBsYW5hdGlvblRpdGxlIiwiZXhwbGFuYXRpb25UeHQiLCJub0pTTm90aWZpY2F0aW9uIiwiY29uZmlnRnJvbnRFbmQiLCJ0eHQiLCJ0eHRVc2VycyIsInR4dFN1YnNjcmlwdGlvbnMiLCJkaXZNYWluIiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImRpdk1lc3NhZ2UiLCJkaXZSZXNwb25zZSIsImRpdkdvZGNoaWxkcyIsImRpdlN1YnNjcmliZUludHJvIiwiZm9ybUFjY291bnQiLCJzaG93R0ZFbWFpbCIsInNob3dHRkNvZGUiLCJoZWxsb0RldiIsImluaXRpYWxpc2UiLCJnZXRDb25maWciLCJjb25maWciLCJhZGRFbGVtZW50IiwiY2hlY2tTZXNzaW9uIiwibWVzc2FnZSIsImNvbG9yIiwid2luZG93IiwibG9jYXRpb24iLCJpc0Nvbm5lY3RlZCIsInN0eWxlIiwiZGlzcGxheSIsImdldExvY2FseSIsInJlbW92ZUxvY2FseSIsInVzZXIiLCJ1cGRhdGVBY2NvdW50TGluayIsInN0YXR1cyIsInNldEF0dHJpYnV0ZXNUb0lucHV0cyIsImdldEluZm9zIiwieGhyR2V0SW5mb3MiLCJYTUxIdHRwUmVxdWVzdCIsIm9wZW4iLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJyZWFkeVN0YXRlIiwiRE9ORSIsInJlc3BvbnNlIiwiSlNPTiIsInBhcnNlIiwicmVzcG9uc2VUZXh0IiwiVXNlciIsIlN1YnNjcmlwdGlvbiIsImRhdGEiLCJlbGVtZW50cyIsImNoZWNrZWQiLCJub3RpY2VPayIsImkiLCJyZWNlaXB0RGF5cyIsImlubmVySFRNTCIsImJlZ2luU3ViVFMiLCJjcmVhdGVkQXQiLCJnZXRUaW1lIiwibmJEYXlzT2siLCJudW1iZXJPZkRheXMiLCJyb3VuZCIsIm5vdyIsImFzc2lnbiIsInNldFJlcXVlc3RIZWFkZXIiLCJ0b2tlbiIsInNlbmQiLCJhZGRFdmVudExpc3RlbmVyIiwiZSIsInByZXZlbnREZWZhdWx0IiwiZGF0YXMiLCJnZXREYXRhc0Zyb21JbnB1dHMiLCJuZXdzbGV0dGVyT2siLCJ0aW1lRGlmZmVyZW5jZSIsImdldFRpbWVEaWZmZXJlbmNlIiwieGhyVXNlclVwZGF0ZSIsImRlbGV0ZU9rIiwiQXJyYXkiLCJpc0FycmF5IiwiZXJyb3JzIiwib3V0cHV0Iiwic3RyaW5naWZ5IiwiZGl2Q0dWIiwiZGl2MTgwIiwiZGl2MzY1IiwiZGl2V1AxODAiLCJkaXZXUDM2NSIsImRpdldQTm9uZSIsInhockdldEdvZGNoaWxkcyIsInR4dEdvZGNoaWxkcyIsIm5iR29kY2hpbGRzIiwic2F2ZUxvY2FseSIsImxvY2FsU3RvcmFnZSIsInNldEl0ZW0iLCJqc29uIiwiZ2V0SXRlbSIsInJlbW92ZUl0ZW0iLCJlbHRQYXJlbnQiLCJlbHRUeXBlIiwiZWx0Q29udGVudCIsImVsdElkIiwiZWx0Q2xhc3MiLCJlbHRBdHRyaWJ1dGVzIiwibmV3RWxlbWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc0xpc3QiLCJhZGQiLCJhdHRyaWJ1dE5hbWUiLCJzZXRBdHRyaWJ1dGUiLCJhcHBlbmRDaGlsZCIsImNvbnNvbGUiLCJsb2ciLCJjb25maWdUZW1wbGF0ZSIsImxpbmsiLCJob21lUGFnZSIsImlucHV0c0NvbmYiLCJteUZvcm0iLCJpZElucHV0IiwiaW5wdXRIVE1MIiwiYXR0cmlidXRlIiwiZm9ybURhdGEiLCJGb3JtRGF0YSIsImVudHJpZXMiLCJlbnRyaWUiLCJlbXB5Rm9ybSIsInR5cGUiLCJlbXB5QW5kSGlkZUZvcm0iLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInhociIsIm9ubG9hZCIsIm9uZXJyb3IiLCJzdGF0dXNUZXh0IiwidGltZUxvY2FsIiwiZ2V0VGltZXpvbmVPZmZzZXQiLCJnZXRQYXNzd29yZCIsIm5iQ2FyTWluIiwibmJDYXJNYXgiLCJuYkNhciIsImxldHRlcnMiLCJvdGhlcnMiLCJzZXRTZXNzaW9uIiwidXNlcklkIiwiZHVyYXRpb25UUyIsInN0b3JhZ2VVc2VyIiwiZHVyYXRpb24iLCJjaGVja0Fuc3dlckRhdGFzIiwibGFzdEFuc3dlciIsImFuc3dlciIsIm5iQ29ycmVjdEFuc3dlcnMiLCJRdWVzdGlvbm5haXJlSWQiLCJuYlF1ZXN0aW9ucyIsInVybFJlZGlyZWN0aW9uIiwidXJsV2FudGVkIiwidXNlckRhdGFzIiwicmVkaXJlY3RVc2VyIiwiaXNWYWxpZCIsImxhbmd1YWdlIiwidXJsQWNjb3VudCIsImluZGV4T2YiXSwibWFwcGluZ3MiOiI7UUFBQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7O1FBR0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDBDQUEwQyxnQ0FBZ0M7UUFDMUU7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSx3REFBd0Qsa0JBQWtCO1FBQzFFO1FBQ0EsaURBQWlELGNBQWM7UUFDL0Q7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLHlDQUF5QyxpQ0FBaUM7UUFDMUUsZ0hBQWdILG1CQUFtQixFQUFFO1FBQ3JJO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMkJBQTJCLDBCQUEwQixFQUFFO1FBQ3ZELGlDQUFpQyxlQUFlO1FBQ2hEO1FBQ0E7UUFDQTs7UUFFQTtRQUNBLHNEQUFzRCwrREFBK0Q7O1FBRXJIO1FBQ0E7OztRQUdBO1FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsRkEsSUFBTUEsS0FBSyxHQUFHQyxtQkFBTyxDQUFDLG1DQUFELENBQXJCOztBQUNBLElBQU1DLGNBQWMsR0FBR0QsbUJBQU8sQ0FBQyxxREFBRCxDQUE5Qjs7QUFFQUUsTUFBTSxDQUFDQyxPQUFQO0FB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MEYsY0FBdkI7QUFDUCxDQVJELEMiLCJmaWxlIjoiLi9KUy9hY2NvdW50VXNlci5hcHAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gXCIuL3NyYy9hY2NvdW50VXNlci5qc1wiKTtcbiIsImNvbnN0IHVzZXJzID0gcmVxdWlyZShcIi4vdXNlcnNcIik7XG5jb25zdCBxdWVzdGlvbm5haXJlcyA9IHJlcXVpcmUoXCIuL3F1ZXN0aW9ubmFpcmVzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgYXBpVXJsOiBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9hcGlcIixcbiAgICBzaXRlVXJsOiBcImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MFwiLFxuICAgIGFkbWluTmFtZTogXCJGYWJyaWNlXCIsXG4gICAgYWRtaW5FbWFpbDogXCJkZXZAd2lraWxlcm5pLmNvbVwiLFxuICAgIHNlbmRlck5hbWU6IFwiV2lraUxlcm5pXCIsXG4gICAgc2VuZGVyRW1haWw6IFwiYm9uam91ckB3aWtpbGVybmkuY29tXCIsXG4gICAgYWRtaW5MYW5nOiBcImZyXCIsXG4gICAgdGhlbWU6IFwiZGVmYXVsdFwiLCAvLyBsZSB0aMOobWUgdXRpbGlzw6kgKGRhbnMgL3ZpZXdzKSBwb3VyIGfDqW7DqXJlciBsZXMgcGFnZXMgSFRNTC4gQ29udGllbnQgc2VzIHByb3ByZXMgZmljaGllcnMgZGUgY29uZmlndXJhdGlvbi5cbiAgICBhdmFpbGFibGVMYW5nczogW1wiZnJcIl0sLy8gTGFuZ3VhZ2VzIGluIHdoaWNoIHRoZSBzaXRlIGlzIGF2YWlsYWJsZS4gVGhlIGZpcnN0IG9uZSBpcyB0aGUgZGVmYXVsdCBvbmUuXG4gICAgc2l0ZU5hbWU6IFwiV2lraUxlcm5pXCIsXG4gICAgYmVnaW5Db2RlR29kZmF0aGVyOiBcIndpa2lsZXJuaVwiLCAvLyBjYXNlLXNlbnNpdGl2ZSBhbmQgY2FuJ3QgY29udGFpbiBcIkBcIiAhXG4gICAgY3JvblRpbWluZ0FsZXJ0SW5TZWNvbmRlOiAxMjAsIC8vIGZvciBsb2dzXG4gICAgcmVzcG9uc2VUaW1pbmdBbGVydEluU2Vjb25kZTogMywgLy8gaWRlbVxuICAgIHRva2VuU2lnbnVwVmFsaWRhdGlvblRpbWVJbkhvdXJzOiBcIjQ4aFwiLCAvLyBodHRwczovL2dpdGh1Yi5jb20vemVpdC9tc1xuICAgIHRva2VuTG9naW5MaW5rVGltZUluSG91cnM6IFwiMWhcIixcbiAgICB0b2tlbkNvbm5leGlvbk1pblRpbWVJbkhvdXJzOiBcIjI0aFwiLFxuICAgIHRva2VuQ29ubmV4aW9uTWF4VGltZUluRGF5czogXCIxODAgZGF5c1wiLFxuICAgIHRva2VuTG9naW5DaGFuZ2luZ1RpbWVJbkhvdXJzOiBcIjFoXCIsLy8gZm9yIGVtYWlsICYgcGFzc3dvcmQgY2hhbmdpbmdcbiAgICB0b2tlbkRlbGV0ZVVzZXJUaW1lSW5Ib3VyczogXCIxaFwiLFxuICAgIHRva2VuVW5zdWJzY3JpYmVMaW5rVGltZUluRGF5czogXCI3IGRheXNcIiwgLy8gdG9rZW4gc2VuZCB3aXRoIHN1YnNjcmlwdGlvbidzIGVtYWlsc1xuICAgIGZyZWVBY2NvdW50VGltaW5nSW5EYXlzOiAxMCxcbiAgICBmcmVlQWNjb3VudEV4cGlyYXRpb25Ob3RpZmljYXRpb25JbkRheXM6IDUsXG4gICAgYWNjb3VudEV4cGlyYXRpb25GaXJzdE5vdGlmaWNhdGlvbkluRGF5czogMTQsICAgIFxuICAgIGFjY291bnRFeHBpcmF0aW9uU2Vjb25kTm90aWZpY2F0aW9uSW5EYXlzOiA1LFxuICAgIGluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5czogMTgwLFxuICAgIC8vIFF1ZXN0aW9ubmFpcmVzOlxuICAgIG5iUXVlc3Rpb25zTWluOiAxLCAvLyBtaW5pbXVtIG51bWJlciBvZiBxdWVzdGlvbnMgZm9yIHRoZSBxdWVzdGlvbm5haXJlIHRvIGJlIHB1Ymxpc2hhYmxlXG4gICAgbmJRdWVzdGlvbnNNYXg6IDEwLCAvLyBpZiAwID0gbm90IG1heGltdW1cbiAgICBuYkNob2ljZXNNYXg6IDEwLFxuICAgIG5iTmV3UXVlc3Rpb25uYWlyZXM6IDEwLC8vIGZvciBSU1MsIGV0Yy5cbiAgICBob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVCZWdpbjoxLCAvLyBpbiB1c2VyIGxvY2FsIHRpbWVcbiAgICBob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQ6MjQsIC8vIGlkZW1cbiAgICBudW1iZXJOZXdRdWVzdGlvbm5haXJlQXRTYW1lVGltZTogNTAsIC8vIGZvciBtYXNzIG1haWxpbmdcbiAgICBtaW5TZWFyY2hRdWVzdGlvbm5haXJlczogMyxcbiAgICAvLyBJbGx1c3RyYXRpb25zOlxuICAgIG5iSWxsdXN0cmF0aW9uc01pbjogMCxcbiAgICBuYklsbHVzdHJhdGlvbnNNYXg6IDEsXG4gICAgbWF4SWxsdXN0cmF0aW9uU2l6ZWluT2N0ZXQ6IDEwMDAwMDAsLy8gcGFzIGNvbnRyw7Rsw6kgcG91ciBsJ2luc3RhbnQuIMOAIHJldm9pci5cbiAgICBtaW1lVHlwZXNGb3JJbGx1c3RyYXRpb246IFsgXCJpbWFnZS9qcGdcIiwgXCJpbWFnZS9qcGVnXCIsIFwiaW1hZ2UvcG5nXCIsIFwiaW1hZ2UvZ2lmXCIsIFwiaW1hZ2UvcG5nXCIgXSxcbiAgICAvLyAtLSBVcGxvYWQgYW5kIHJlc2l6ZTpcbiAgICBpbGx1c3RyYXRpb25zV2lkdGhNYXhJblB4OiA0MDAsXG4gICAgaWxsdXN0cmF0aW9uc01pbmlhdHVyZXNXaWR0aE1heEluUHg6IDIwMCxcbiAgICAvLyBMaW5rczpcbiAgICBuYkxpbmtzTWluOiAxLFxuICAgIG5iTGlua3NNYXg6IDEsXG4gICAgLy8gw6Agc3VwcHJpbWVyIHF1YW5kIHRvdXMgbGVzIFwicmVxdWlyZVwiIMOgIGpvdXI6XG4gICAgbmJRdWVzdGlvbnNNaW46IHF1ZXN0aW9ubmFpcmVzLm5iUXVlc3Rpb25zTWluLFxuICAgIG5iUXVlc3Rpb25zTWF4OiBxdWVzdGlvbm5haXJlcy5uYlF1ZXN0aW9uc01heCxcbiAgICBuYkNob2ljZXNNYXg6IHF1ZXN0aW9ubmFpcmVzLm5iQ2hvaWNlc01heCxcbiAgICBwYXNzd29yZE1pbkxlbmd0aDogdXNlcnMucGFzc3dvcmQubWlubGVuZ3RoLFxuICAgIGRpckNhY2hlVXNlcnM6IHVzZXJzLmRpckNhY2hlVXNlcnMsXG4gICAgZGlyQ2FjaGVVc2Vyc0Fuc3dlcnM6IHVzZXJzLmRpckNhY2hlVXNlcnNBbnN3ZXJzLFxuICAgIGRpckNhY2hlUXVlc3Rpb25uYWlyZXM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlUXVlc3Rpb25uYWlyZXMsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbnM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlUXVlc3Rpb25zLFxuICAgIGRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzLFxuICAgIGRpckhUTUxRdWVzdGlvbm5haXJlOiBxdWVzdGlvbm5haXJlcy5kaXJIVE1MUXVlc3Rpb25uYWlyZSxcbiAgICBkaXJXZWJRdWVzdGlvbm5haXJlOiBxdWVzdGlvbm5haXJlcy5kaXJXZWJRdWVzdGlvbm5haXJlXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbnsgICAgXG4gICAgLy8gQVBJJ3JvdXRlcyAoYWZ0ZXIgXCJhcGlVcmxcIiBkZWZpbmVkIGluIGluc3RhbmNlLmpzKVxuICAgIHF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3F1ZXN0aW9ubmFpcmVcIixcbiAgICBnZXRRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9nZXRcIixcbiAgICBwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcHJldmlld1wiLFxuICAgIHB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3F1aXovXCIsXG4gICAgc2F2ZUFuc3dlcnNSb3V0ZTogXCIvYW5zd2VyL1wiLFxuICAgIGdldFN0YXRzUXVlc3Rpb25uYWlyZXMgOiBcIi9zdGF0cy9cIixcbiAgICBzZWFyY2hRdWVzdGlvbm5haXJlc1JvdXRlIDogXCIvc2VhcmNoXCIsXG4gICAgc2VhcmNoQWRtaW5RdWVzdGlvbm5haXJlc1JvdXRlIDogXCIvc2VhcmNoYWRtaW5cIixcbiAgICBnZXRMaXN0TmV4dFF1ZXN0aW9ubmFpcmVzOiBcIi9nZXRsaXN0bmV4dHF1ZXN0aW9ubmFpcmVzL1wiLFxuICAgIC8vIC0tIHF1ZXN0aW9ucyAmIGNob2ljZXMgOlxuICAgIHF1ZXN0aW9uc1JvdXRlOiBcIi9xdWVzdGlvbi9cIixcbiAgICAvLyAtLSB0YWdzIDpcbiAgICB0YWdzU2VhcmNoUm91dGU6IFwiL3RhZ3Mvc2VhcmNoL1wiLFxuICAgIC8vIC0tIGFuc3dlcnMgOlxuICAgIGdldFF1ZXN0aW9ubmFpcmVzV2l0aG91dEFuc3dlcjogXCIvd2l0aG91dGFuc3dlci91c2VyL1wiLFxuICAgIGdldFByZXZpb3VzQW5zd2VyczogXCIvdXNlci9hbnN3ZXJzL1wiLFxuICAgIGdldFN0YXRzQW5zd2VycyA6IFwiL3VzZXIvYW53c3dlcnMvc3RhdHMvXCIsXG4gICAgZ2V0QWRtaW5TdGF0czogXCIvZ2V0YWRtaW5zdGF0cy9cIixcbiAgICAvLyBmb3JtcyA6IMOgIGNvbXBsw6l0ZXIgYXZlYyB2YWxldXJzIHBhciBkw6lmYXV0LCBldGMuIGNmIG1vZMOobGVcbiAgICBRdWVzdGlvbm5haXJlIDpcbiAgICB7XG4gICAgICAgIHRpdGxlOiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICBzbHVnOiB7IG1heGxlbmd0aDogMTUwIH0sIC8vIGNoYW1wIHJlcXVpcyBtYWlzIGNhbGN1bMOpIMOgIHBhcnRpciBkdSB0aXRyZSBxZCB2aWRlXG4gICAgICAgIGludHJvZHVjdGlvbjogeyByZXF1aXJlZDogdHJ1ZSB9XG4gICAgfSxcbiAgICBzZWFyY2hRdWVzdGlvbm5haXJlcyA6IHsgbWlubGVuZ3RoOiAzLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIFF1ZXN0aW9uIDpcbiAgICB7XG4gICAgICAgIHRleHQ6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgIHJhbms6IHsgcmVxdWlyZWQ6IHRydWUsIG1pbjoxLCBkZWZhdWx0VmFsdWU6MSB9XG4gICAgfSwgICAgICAgICAgXG4gICAgQ2hvaWNlIDpcbiAgICB7XG4gICAgICAgIHRleHQ6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH1cbiAgICB9LCAgICAgICAgICBcbiAgICBuYlF1ZXN0aW9uc01pbjogMSxcbiAgICBuYlF1ZXN0aW9uc01heDogMTAsXG4gICAgbmJDaG9pY2VzTWF4OiAxMCxcbiAgICBuYlRhZ3NNaW46IDAsXG4gICAgbmJUYWdzTWF4OiAwLCAvLyAwID0gbm90IG1heCAgICBcbiAgICAvLyBKU09OIGFuZCBIVE1MIGRpclxuICAgIGRpckNhY2hlUXVlc3Rpb25uYWlyZXMgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzXCIsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbnMgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzL3F1ZXN0aW9uc1wiLFxuICAgIGRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlcyA6IFwiZGF0YXMvdXNlcnMvcXVlc3Rpb25uYWlyZXNcIixcbiAgICBkaXJDYWNoZVRhZ3MgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzL3RhZ3NcIiwgIFxuICAgIGRpckhUTUxRdWVzdGlvbm5haXJlIDogXCJmcm9udC9wdWJsaWMvcXVpelwiLFxuICAgIGRpckhUTUxUYWdzIDogXCJmcm9udC9wdWJsaWMvcXVpenNcIixcbiAgICBkaXJXZWJRdWVzdGlvbm5haXJlIDogXCJxdWl6XCIsLy9wb3VyIHVybCBwYWdlXG4gICAgZGlyV2ViVGFncyA6IFwicXVpenNcIi8vIGlkZW1cbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIC8vIEFQSSdyb3V0ZXMgKGFmdGVyIFwiYXBpVXJsXCIgZGVmaW5lZCBpbiBpbnN0YW5jZS5qcylcbiAgICB1c2VyUm91dGVzOiBcIi91c2VyXCIsXG4gICAgc3Vic2NyaWJlUm91dGU6IFwiL3NpZ251cFwiLFxuICAgIGdldEdvZGZhdGhlclJvdXRlOiBcIi9nZXRnb2RmYXRoZXJpZFwiLFxuICAgIGNoZWNrSWZJc0VtYWlsZnJlZVJvdXRlOiBcIi9pc2VtYWlsZnJlZVwiLFxuICAgIGNoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZTogXCIvdmFsaWRhdGlvbi9cIixcbiAgICBjaGVja0xvZ2luUm91dGU6IFwiL2NoZWNrbG9naW4vXCIsXG4gICAgY29ubmVjdGlvblJvdXRlOiBcIi9sb2dpblwiLFxuICAgIGdldExvZ2luTGlua1JvdXRlOiBcIi9nZXRsb2dpbmxpbmtcIixcbiAgICBjb25uZWN0aW9uV2l0aExpbmtSb3V0ZTogXCIvY2hlY2tsb2dpbmxpbmtcIixcbiAgICBnZXRVc2VySW5mb3M6IFwiL2dldC9cIixcbiAgICBjcmVhdGVVc2VyUm91dGU6IFwiL2NyZWF0ZVwiLFxuICAgIHZhbGlkYXRlVXNlclJvdXRlOiBcIi92YWxpZGF0ZS9cIixcbiAgICB1cGRhdGVVc2VySW5mb3M6IFwiL21vZGlmeS9cIixcbiAgICBzZWFyY2hVc2VyUm91dGU6IFwiL3NlYXJjaC9cIixcbiAgICBnZXRHb2RDaGlsZHM6IFwiL2dldGdvZGNoaWxkcy9cIixcbiAgICBjaGVja05ld0xvZ2luTGlua1JvdXRlOiBcIi9jb25maXJtbmV3bG9naW4vXCIsXG4gICAgY2hlY2tEZWxldGVMaW5rUm91dGU6IFwiL2NvbmZpcm1kZWxldGUvXCIsXG4gICAgZ2V0UGF5bWVudHM6IFwiL3BheW1lbnQvZ2V0Zm9yb25ldXNlci9cIixcbiAgICB1bnN1YnNjcmliZVJvdXRlOiBcIi9zdWJzY3JpcHRpb24vc3RvcC9cIixcbiAgICBnZXRBZG1pblN0YXRzOiBcIi9nZXRhZG1pbnN0YXRzL1wiLFxuICAgIC8vIGZvcm1zIDogw6AgY29tcGzDqXRlciBhdmVjIHZhbGV1cnMgcGFyIGTDqWZhdXQsIGV0Yy4gY2YgbW9kw6hsZVxuICAgIG5hbWU6IHsgbWF4bGVuZ3RoOiA3MCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBlbWFpbDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBwYXNzd29yZDogeyBtaW5sZW5ndGg6IDgsIG1heGxlbmd0aDo3MiwgcmVxdWlyZWQ6IHRydWUgfSwgLy8gaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvYmNyeXB0I3NlY3VyaXR5LWlzc3Vlcy1hbmQtY29uY2VybnNcbiAgICBuZXdQYXNzd29yZDogeyBtaW5sZW5ndGg6IDgsIG1heGxlbmd0aDo3MiB9LFxuICAgIGNvZGVHb2RmYXRoZXI6IHsgbWF4bGVuZ3RoOiAyNTUgfSxcbiAgICBjZ3VPazogeyB2YWx1ZTogXCJ0cnVlXCIsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgdGltZURpZmZlcmVuY2VNaW46IC03MjAsXG4gICAgdGltZURpZmZlcmVuY2VNYXg6ODQwLFxuICAgIC8vIEpTT04gZGlyXG4gICAgZGlyQ2FjaGVVc2VycyA6IFwiZGF0YXMvdXNlcnNcIixcbiAgICBkaXJDYWNoZVVzZXJzQW5zd2VycyA6IFwiZGF0YXMvdXNlcnMvcXVlc3Rpb25uYWlyZXMvYW5zd2Vyc1wiXG59O1xuIiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL2dlbmVyYWxcIjogXCIuLi9sYW5nL2ZyL2dlbmVyYWwuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9nZW5lcmFsJFwiOyIsInZhciBtYXAgPSB7XG5cdFwiLi9mci9zdWJzY3JpcHRpb25cIjogXCIuLi9sYW5nL2ZyL3N1YnNjcmlwdGlvbi5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi9sYW5nIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcL3N1YnNjcmlwdGlvbiRcIjsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZnIvdXNlclwiOiBcIi4uL2xhbmcvZnIvdXNlci5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi9sYW5nIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcL3VzZXIkXCI7IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIHNpdGVIVE1MVGl0bGUgOiBcIldpa2lMZXJuaSA6IHF1J2FsbGV6LXZvdXMgYXBwcmVuZHJlIGF1am91cmQnaHVpID9cIixcbiAgICBzaXRlTWV0YURlc2NyaXB0aW9uIDogXCJDaGFxdWUgam91ciwgdGVzdGV6IHZvcyBjb25uYWlzc2FuY2VzIGV0IGFwcHJlbmV6IGRlIG5vdXZlbGxlcyBjaG9zZXMgYXZlYyBXaWtpTGVybmkuXCIsXG4gICAgc2NyaXB0VGltaW5nSW5mbyA6IFwiRHVyw6llIGRlIGxhIHLDqXBvbnNlIDogU0NSSVBUX1RJTUlORyBtaWxsaXNlY29uZGVzLCByb3V0ZSA6IFNDUklQVF9VUkxcIixcbiAgICBzY3JpcHRUaW1pbmdBbGVydCA6IFwiKioqIFNjcmlwdCBsZW50IDogU0NSSVBUX1RJTUlORyBtaWxsaXNlY29uZGVzLCByb3V0ZSA6IFNDUklQVF9VUkxcIixcbiAgICBzZXJ2ZXJFcnJvciA6IFwiRMOpc29sw6kuIFVuZSBlcnJldXIgaW1wcsOpdnVlIGVzdCBzdXJ2ZW51ZS4gU2kgY2VsYSBwZXJzaXN0ZSwgbidow6lzaXRleiDDoCBwcsOpdmVuaXIgbCdhZG1pbmlzdHJhdGV1ciBkdSBzaXRlLlwiLFxuICAgIHNlcnZlckVycm9yQWRtaW4gOiBcIkJ1ZyBkZSBsJ2FwcGxpY2F0aW9uIDpcIixcbiAgICBuZWVkZWRQYXJhbXMgOiBcIkRlcyBwYXJhbcOodHJlcyBuw6ljZXNzYWlyZXMgbWFucXVhbnRzIHNvbnQgbWFucXVhbnRzLlwiLFxuICAgIGJhZFVybCA6IFwiVGVudGF0aXZlIGQnYWNjw6hzIMOgIHVuZSBwYWdlIG4nZXhpc3RhbnQgcGFzIDpcIixcbiAgICBub3RWYWxpZEZvcm1hdCA6IFwiRm9ybWF0IG5vbiB2YWxpZGUuXCIsXG4gICAgbm90QWxsb3dlZCA6IFwiVm91cyBuJ2F2ZXogcGFzIGxlcyBkcm9pdHMgbsOpY2Vzc2FpcmVzIHBvdXIgY2V0dGUgYWN0aW9uLlwiLFxuICAgIG5vdFJlcXVpcmVkIDogXCJGYWN1bHRhdGlmLlwiLFxuICAgIHVwZGF0ZUJ0blR4dDogXCJNb2RpZmllclwiLFxuICAgIGFkZEJ0blR4dDogXCJBam91dGVyXCIsXG4gICAgZGVsZXRlQnRuVHh0OiBcIlN1cHByaW1lclwiLFxuICAgIGFkZE9rTWVzc2FnZSA6IFwiTGVzIGRvbm7DqWVzIG9udCBiaWVuIMOpdMOpIGVucmVnaXN0csOpZXMuXCIsXG4gICAgdXBkYXRlT2tNZXNzYWdlIDogXCJMYSBtaXNlIMOgIGpvdXIgw6Agam91ciBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIGRlbGV0ZU9rTWVzc2FnZSA6IFwiTGEgc3VwcHJlc3Npb24gYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS5cIixcbiAgICBmYWlsQXV0aCA6IFwiRXJyZXVyIGQnYXV0aGVudGlmaWNhdGlvbi5cIixcbiAgICBmYWlsQXV0aEhlYWRlciA6IFwiQWJzZW5jZSBkZSBoZWFkZXIgQXV0aG9yaXphdGlvbi5cIixcbiAgICBmYWlsQXV0aFRva2VuIDogXCJUb2tlbiBpbnZhbGlkZSBvdSB1dGlsaXNhdGV1ciBub24gdHJvdXbDqS5cIixcbiAgICBmYWlsQXV0aElkIDogXCJJZGVudGlmaWFudCBub24gdmFsaWRlIDogXCIsXG4gICAgZmFpbEF1dGhDcm9uIDogXCJUZW50YXRpdmUgZGUgbGFuY2VtZW50IGQndW4gY3JvbiBzYW5zIGxlIGJvbiB0b2tlbi5cIixcbiAgICBwcmV2aW91c1BhZ2UgOiBcIlBhZ2UgcHLDqWPDqWRlbnRlXCIsXG4gICAgbmV4dFBhZ2UgOiBcIlBhZ2Ugc3VpdmFudGVcIixcbiAgICBidG5MaW5rVG9RdWVzdGlvbm5haXJlIDogXCJBbGxlciBhdSBxdWl6ICFcIixcbiAgICBzdGF0c0FkbWluIDogXCJEdXJhbnQgbGVzIGRlcm5pw6hyZXMgMjRoIDogTkJfVVNFUlNfMjRIIGNvbXB0ZXMgb250IMOpdMOpIGNyw6nDqXMsIE5CX1NVQlNDUklQVElPTlNfMjRIIHZhbGlkw6lzIGV0IE5CX1VTRVJTX0RFTEVURURfMjRIIHN1cHByaW3DqXMuIE5CX0FOU1dFUlNfMjRIIHLDqXBvbnNlcyBhdXggcXVpenMgb250IMOpdMOpIGVucmVnaXN0csOpZXMuPGJyPkVuIHRvdXQsIGlsIHkgYSA6IE5CX1VTRVJTX1RPVCBjb21wdGVzLCBkb250IE5CX1NVQlNDUklQVElPTlNfVE9UIHZhbGlkw6lzIGV0IE5CX1NVQlNDUklQVElPTlNfUFJFTUlVTSBjb21wdGVzIHByw6ltaXVtLiBOQl9BTlNXRVJTX1RPVCByw6lwb25zZXMgYXV4IHF1aXpzIG9udCDDqXTDqSBlbnJlZ2lzdHLDqWVzLjxicj5QYXJtaSBsZXMgTkJfVVNFUlNfREVMRVRFRF9UT1QgY29tcHRlcyBzdXBwcmltw6lzLCBOQl9VU0VSU19ERUxFVEVEX1ZBTElERUQgYXZhaWVudCB2YWxpZMOpIGxldXIgY29tcHRlIGV0IE5CX1VTRVJTX0RFTEVURURfUFJFTUlVTSBhdmFpZW50IHNvdXNjcml0IHVuIGNvbXB0ZSBwcsOpbWl1bS5cIlxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgbmVlZE51bWJlck9mRGF5cyA6IFwiSWwgZmF1dCB1biBub21icmUgZGUgam91cnMgcG91ciBsJ2Fib25uZW1lbnQuXCIsXG4gICAgbmVlZEludGVnZXJOdW1iZXJPZkRheXMgOiBcIkxlIG5vbWJyZSBkZSBqb3VycyBkZSBsJ2Fib25uZW1lbnQgZG9pdCDDqnRyZSB1biBub21icmUgZW50aWVyLlwiLFxuICAgIG5lZWRNaW5OdW1iZXJPZkRheXMgOiBcIkxlIG5vbWJyZSBkZSBqb3VycyBkZSBsJ2Fib25uZW1lbnQgbmUgcGV1dCDDqnRyZSBuw6lnYXRpZiAhXCIsXG4gICAgbmVlZE5vdFRvb0xvbmdEYXlzTGlzdCA6IFwiTGEgbGlzdGUgZGUgam91cnMgc8OpbGVjdGlvbm7DqXMgbidhIHBhcyBsZSBib24gZm9ybWF0ICh0cm9wIGxvbmd1ZSkuXCIsXG4gICAgbmVlZFZhbGlkRGF5c0xpc3QgOiBcIkxhIGxpc3RlIGRlIGpvdXJzIHPDqWxlY3Rpb25uw6lzIG4nYSBwYXMgbGUgYm9uIGZvcm1hdC4gQ2FyYWN0w6hyZSBub24gdmFsaWRlIDogXCIsXG4gICAgbmVlZFVuaXF1ZURheXNMaXN0IDogXCJMYSBsaXN0ZSBkZSBqb3VycyBzw6lsZWN0aW9ubsOpcyBuJ2EgcGFzIGxlIGJvbiBmb3JtYXQuIERvdWJsb24gOiBcIixcbiAgICBuZWVkS25vd0lmTm90aWNlT2sgOiBcIklsIG1hbnF1ZSBsJ2luZm9ybWF0aW9uIHN1ciBsJ2FjY2VwdGF0aW9uIG91IG5vbiBkZSByZWNldm9pciBkZXMgbm90aWZpY2F0aW9ucy5cIixcbiAgICB1bnN1YnNjcmlwdGlvbk9rIDogXCJWb3RyZSBkZW1hbmRlIGEgYmllbiDDqXTDqSBwcmlzZSBlbiBjb21wdGUuIFZvdXMgbmUgcmVjZXZyZXogcGx1cyBkZSBtZXNzYWdlcyB2ZW5hbnQgZHUgc2l0ZSwgc2F1ZiBwb3VyIHZvdXMgc2lnbmFsZXIgbGEgZmluIGRlIHZvdHJlIGFib25uZW1lbnQuPGJyPk4naMOpc2l0ZXogcGFzIDxhIGhyZWY9Jy8jVVJMJz7DoCBhY2PDqWRlciDDoCB2b3RyZSBjb21wdGU8L2E+IHBvdXIgZGUgbm91dmVhdSBhdXRvcmlzZXIgY2VydGFpbnMgZW52b2lzLlwiLFxuICAgIHVuc3Vic2NyaXB0aW9uRmFpbCA6IFwiU2kgdm91cyB2b3lleiBjZSBtZXNzYWdlLCBjJ2VzdCBxdWUgdm90cmUgbGllbiBkZSBkw6lzYWJvbm5lbWVudCBuZSBmb25jdGlvbm5lIHBhcy48YnI+Vm91cyBwb3V2ZXogPGEgaHJlZj0nLyNVUkwnPmFjY8OpZGVyIMOgIHZvdHJlIGNvbXB0ZTwvYT4gcG91ciBkw6lzYWN0aXZlciBsZXMgZW52b2lzIG1hbnVlbGxlbWVudC5cIixcbiAgICBhbGxTdWJzY3JpcHRpb25Qcm9jZXNzZWQgOiBcIlRvdXMgbGVzIGFib25uw6lzIG9udCDDqXTDqSB0cmFpdMOpcyBwb3VyIGxlIG1vbWVudC5cIixcbiAgICBtYWlsTmV3UXVlc3Rpb25uYWlyZVN1YmplY3QgOiBcIlF1J2FsbGV6LXZvdXMgYXBwcmVuZHJlIGF1am91cmQnaHVpID9cIixcbiAgICBtYWlsTmV3UXVlc3Rpb25uYWlyZUJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblVuIG5vdXZlYXUgcXVpeiB2aWVudCBkZSB2b3VzIMOqdHJlIHByb3Bvc8OpIDpcXG5RVUVTVElPTk5BSVJFX1VSTFxcblxcbkJvbm5lIGxlY3R1cmUgIVxcblxcblN0b3BwZXIgbGVzIGVudm9pcyA/XFxuVU5TVUJTQ1JJQkVfVVJMXCIsXG4gICAgbWFpbE5ld1F1ZXN0aW9ubmFpcmVCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+TUFJTF9JTlRST0RVQ1RJT048dWw+PGxpPjxhIGhyZWY9XFxcIkxJTktfVVJMXFxcIiB0aXRsZT1cXFwiTElOS19USVRMRVxcXCI+TGlyZSBsJ2FydGljbGUuPC9hPjwvbGk+PGxpPjxhIGhyZWY9XFxcIlFVRVNUSU9OTkFJUkVfVVJMXFxcIj5BbGxleiBhdSBxdWl6LjwvYT48L2xpPjwvdWw+PHA+PGEgaHJlZj1cXFwiVU5TVUJTQ1JJQkVfVVJMXFxcIj5TdG9wcGVyIGxlcyBlbnZvaXMuPC9hPjwvcD5cIixcbiAgICBub05ld1F1ZXN0aW9ubmFpcmVGb3JVc2VyIDogXCJBdWN1biBub3V2ZWF1IHF1ZXN0aW9ubmFpcmUgdHJvdXbDqSBwb3VyIHVuIGFib25uw6kgOiBcIixcbiAgICBtYWlsRW5kRnJlZVRpbWVTdWJqZWN0OiBcIlZvdHJlIGFib25uZW1lbnQgZ3JhdHVpdCB2YSBleHBpcmVyXCIsXG4gICAgbWFpbEVuZEZyZWVUaW1lQm9keVR4dDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5Wb3RyZSBhYm9ubmVtZW50IGdyYXR1aXQgw6AgU0lURV9OQU1FIHZhIGV4cGlyZXIgZCdpY2kgcXVlbHF1ZXMgam91cnMuXFxuUG91ciBjb250aW51ZXIgw6AgdXRpbGlzZXIgbGUgc2l0ZSwgdm91cyBwb3V2ZXogc291c2NyaXJlIMOgIHVuIGFib25uZW1lbnQgZMOocyBhdWpvdXJkJ2h1aSA6XFxuTElOS19VUkxcIixcbiAgICBtYWlsRW5kRnJlZVRpbWVCb2R5SFRNTDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Wb3RyZSBhYm9ubmVtZW50IGdyYXR1aXQgw6AgU0lURV9OQU1FIHZhIGV4cGlyZXIgZCdpY2kgcXVlbHF1ZXMgam91cnMuIFBvdXIgY29udGludWVyIMOgIHV0aWxpc2VyIGxlIHNpdGUsIHZvdXMgcG91dmV6IHNvdXNjcmlyZSDDoCB1biBhYm9ubmVtZW50IGTDqHMgYXVqb3VyZCdodWkgZW4gPGEgaHJlZj1cXFwiTElOS19VUkxcXFwiPmNsaXF1ZXogaWNpPC9hPiBzYW5zIHRhcmRlci48L3A+XCIsXG4gICAgbWFpbEVuZEZyZWVUaW1lTWVzc2FnZTogXCIgcmVsYW5jZXMgZW52b3nDqWVzLlwiLFxuICAgIG1haWxFeHBpcmF0aW9uU3ViamVjdDogXCJWb3RyZSBhYm9ubmVtZW50IHZhIGJpZW50w7R0IGV4cGlyZXJcIixcbiAgICBtYWlsRXhwaXJhdGlvbkJvZHlUeHQ6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuVm90cmUgYWJvbm5lbWVudCBncmF0dWl0IMOgIFNJVEVfTkFNRSB2YSBleHBpcmVyIGQnaWNpIHF1ZWxxdWVzIGpvdXJzLlxcblBvdXIgY29udGludWVyIMOgIHV0aWxpc2VyIGxlIHNpdGUsIHZvdXMgcG91dmV6IGxlIHByb2xvbmdlciBkw6hzIGF1am91cmQnaHVpIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxFeHBpcmF0aW9uQm9keUhUTUw6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+Vm90cmUgYWJvbm5lbWVudCDDoCBTSVRFX05BTUUgdmEgZXhwaXJlciBkJ2ljaSBxdWVscXVlcyBqb3Vycy48YnI+UG91ciBjb250aW51ZXIgw6AgdXRpbGlzZXIgbGUgc2l0ZSwgdm91cyBwb3V2ZXogbGUgcHJvbG9uZ2VyIGTDqHMgYXVqb3VyZCdodWkgZW4gPGEgaHJlZj1cXFwiTElOS19VUkxcXFwiPmNsaXF1YW50IGljaTwvYT4uPC9wPlwiLFxuICAgIG1haWxFeHBpcmF0aW9uTWVzc2FnZTogXCJGSVJTVCBwcmVtacOocmVzIGV0IFNFQ09ORCBkZXV4acOobWVzIHJlbGFuY2VzIGVudm95w6llcyBwb3VyIGRlcyBhYm9ubmVtZW50cyBleHBpcmFudCBkJ2ljaSBwZXUuXCIsXG4gICAgaW5mb3NOYkRheXM6IFwiVm90cmUgYWJvbm5lbWVudCBlc3QgZW5jb3JlIHZhbGFibGUgPGI+cGVuZGFudCBOQl9EQVlTIGpvdXJzPC9iPi48YnI+Vm91cyBwb3V2ZXogw6AgdG91dCBtb21lbnQgcHJvbG9uZ2VyIHZvdHJlIGFib25uZW1lbnQgZW4gc3VpdmFudCBsZXMgaW5kaWNhdGlvbnMgY2ktZGVzc291cyA6XCIsXG4gICAgaW5mb3NFeHBpcmF0ZWQ6IFwiVm90cmUgYWJvbm5lbWVudCBhIGV4cGlyw6ksIG1haXMgaWwgdm91cyByZXN0ZSBlbmNvcmUgcXVlbHF1ZXMgam91cnMgYXZhbnQgcXVlIHZvdHJlIGNvbXB0ZSBldCB2b3MgZG9ubsOpZXMgbmUgc29pZW50IGNvbXBsw6h0ZW1lbnQgc3VwcHJpbcOpZXMuPGJyPlBvdXIgY2UgZmFpcmUsIHN1aXZleiBzYW5zIHRhcmRlciBsZXMgaW5kaWNhdGlvbnMgY2ktZGVzc291cyA6XCIsXG4gICAgaW5mb3NOYkRheXNBZG1pbjogXCJDZXQgYWJvbm5lbWVudCBlc3QgZW5jb3JlIHZhbGFibGUgPGI+cGVuZGFudCBOQl9EQVlTIGpvdXJzPC9iPi5cIixcbiAgICBpbmZvc0V4cGlyYXRlZEFkbWluOiBcIkNldCBhYm9ubmVtZW50IGEgZXhwaXLDqS5cIiwgIFxuICAgIGlzTm90VmFsaWRlZCA6IFwiQ2V0IHV0aWxpc2F0ZXVyIG4nYSBwYXMgZW5jb3JlIHZhbGlkw6kgc29uIGNvbXB0ZS48YnI+Vm91cyBwb3V2ZXogbGUgZmFpcmUgw6Agc2EgcGxhY2UgPGEgaHJlZj0nI3ZhbGlkYXRpb25Payc+ZW4gY29jaGFudCBsYSBjYXNlIGluZGlxdcOpZTwvYT4gZXQgZW5yZWdpc3RyYW50LlwiLFxuICAgIGluZm9zUGF5bWVudHNBZG1pbiA6IFwiREFURV9QQVlNRU5UIDogcGFpZW1lbnQgZGUgQU1PVU5UIOKCrCBhdSBub20gZGUgQ0xJRU5UX05BTUUuXCIsXG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIG5vdEZvdW5kOiBcIkwndXRpbGlzYXRldXIgbidhIHBhcyDDqXTDqSB0cm91dsOpLlwiLFxuICAgIG5lZWROYW1lOiBcIk1lcmNpIGRlIGNob2lzaXIgdW4gbm9tIGQndXRpbGlzYXRldXIuXCIsXG4gICAgbmVlZE5vdFRvb0xvbmdOYW1lOiBcIk1lcmNpIGRlIGNob2lzaXIgdW4gbm9tIGQndXRpbGlzYXRldXIgbmUgY29tcHRhbnQgcGFzIHBsdXMgZGUgNzAgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZEVtYWlsOiBcIk1lcmNpIGRlIHNhaXNpciB2b3RyZSBhZHJlc3NlIGUtbWFpbC5cIixcbiAgICBuZWVkVW5pcXVlRW1haWw6IFwiTCdhZHJlc3NlIGUtbWFpbCBxdWUgdm91cyBhdmV6IHNhaXNpZSBlc3QgZMOpasOgIHV0aWxpc8OpZSBwYXIgdW4gYXV0cmUgdXRpbGlzYXRldXIuIFNpIHZvdXMgYXZleiBkw6lqw6AgdW4gY29tcHRlLCA8YSBocmVmPScvI1VSTCc+Y2xpcXVlei1pY2kgcG91ciB2b3VzIGNvbm5lY3RlcjwvYT4uXCIsXG4gICAgbmVlZE5vdFRvb0xvbmdFbWFpbDogXCJNZXJjaSBkZSBzYWlzaXIgdW5lIGFkcmVzc2UgZS1tYWlsIG5lIGNvbXB0YW50IHBhcyBwbHVzIGRlIDI1NSBjYXJhY3TDqHJlcy5cIixcbiAgICBuZWVkUGFzc1dvcmQgOiBcIk1lcmNpIGRlIGZvdXJuaXIgdW4gbW90IGRlIHBhc3NlLlwiLFxuICAgIG5lZWRMb25nUGFzc1dvcmQgOiBcIk1lcmNpIGRlIGZvdXJuaXIgdW4gbW90IGRlIHBhc3NlIGQnYXUgbW9pbnMgTUlOX0xFTkdUSCBjYXJhY3TDqHJlcy5cIixcbiAgICBwYXNzd29yZENvcGllZDogXCJMZSBtb3QgZGUgcGFzc2UgZ8OpbsOpcsOpIGEgw6l0w6kgY29wacOpIGRhbnMgbGUgcHJlc3NlLXBhcGllci4gVm91cyBwb3V2ZXogbGUgcmVjb3BpZXIgb8O5IHZvdXMgbGUgc291aGFpdGVyLlwiLFxuICAgIG5lZWRTdGF0dXMgOiBcIklsIG1hbnF1ZSBsZSBzdGF0dXQuXCIsXG4gICAgbmVlZExhbmd1YWdlIDogXCJJbCBtYW5xdWUgbGUgY29kZSBsYW5ndWUuXCIsXG4gICAgbmVlZFZhbGlkTGFzdENvbm5lY3Rpb25EYXRlIDogXCJMYSBkYXRlIGRlIGRlcm5pw6hyZSBjb25uZXhpb24gbidlc3QgcGFzIHZhbGlkZS5cIixcbiAgICBuZWVkU01UUCA6IFwiSWwgbWFucXVlIGxlIHNlcnZldXIgU01UUC5cIixcbiAgICBuZWVkU01UUE5vdEZvdW5kIDogXCJJbCBtYW5xdWUgbGUgc2VydmV1ciBTTVRQLlwiLFxuICAgIG5lZWRLbm93TmV3c2xldHRlck9rIDogXCJJbCBmYXV0IHNhdm9pciBzaSBsJ3V0aWxpc2F0ZXVyIGFjY2VwdGUgb3UgcmVmdXNlIGRlIHJlY2V2b2lyIGxhIG5ld3NsZXR0ZXIuXCIsXG4gICAgbmVlZFRpbWVEaWZmZXJlbmNlIDogXCJJbCBmYXV0IGNvbm5hw650cmUgbGUgbm9tYnJlIGRlIG1pbnV0ZXMgZHUgZMOpY2FsYWdlIGhvcmFpcmUuXCIsXG4gICAgbmVlZE1pblRpbWVEaWZmZXJlbmNlIDogXCJJbCBmYXV0IGZvdXJuaXIgdW4gbm9tYnJlIGRlIG1pbnV0ZXMgw6AgZW5sZXZlciDDoCBsJ2hldXJlIEdNVCBuZSBkw6lwYXNzYW50IHBhcyA3MjAuXCIsXG4gICAgbmVlZE1heFRpbWVEaWZmZXJlbmNlIDogXCJJbCBmYXV0IGZvdXJuaXIgdW4gbm9tYnJlIGRlIG1pbnV0ZXMgw6AgYWpvdXRlciDDoCBsJ2hldXJlIEdNVCBuZSBkw6lwYXNzYW50IHBhcyA4NDAuXCIsXG4gICAgbmVlZFVHQ09rIDogXCJWb3VzIGRldmV6IGFjY2VwdGVyIGxlcyBDR1UgcG91ciBwb3V2b2lyIGNyw6llciB2b3RyZSBjb21wdGUuIFwiLFxuICAgIGdvZGZhdGhlck5vdEZvdW5kOiBcIkF1Y3VuIHV0aWxpc2F0ZXVyIHZhbGlkZSB0cm91dsOpIHBvdXIgY2UgY29kZSBwYXJyYWluLlwiLFxuICAgIGdvZGZhdGhlckZvdW5kOiBcIlZvdHJlIHBhcnJhaW4gYSBiaWVuIMOpdMOpIHRyb3V2w6kgIVwiLFxuICAgIG1haWxWYWxpZGF0aW9uTWVzc2FnZTogXCJWb3RyZSBpbnNjcmlwdGlvbiBlc3QgYmllbiBlbnJlZ2lzdHLDqWUuXFxuUG91ciBsYSBmaW5hbGlzZXIsIG1lcmNpIGRlIGNsaXF1ZXIgZGFucyBsZXMgMjRIIHN1ciBsZSBsaWVuIGRlIGNvbmZpcm1hdGlvbiBxdWkgdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHBhciBlLW1haWwuXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU3ViamVjdCA6IFwiTWVyY2kgZGUgdmFsaWRlciB2b3RyZSBjb21wdGVcIixcbiAgICBtYWlsVmFsaWRhdGlvbkxpbmtTQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuXFxuUG91ciB2YWxpZGVyIHZvdHJlIGNvbXB0ZSwgbWVyY2kgZGUgY2xpcXVlciBzdXIgbGUgbGllbiBzdWl2YW50IGRhbnMgbGVzIDI0aCA6XFxuTElOS19VUkxcIixcbiAgICBtYWlsVmFsaWRhdGlvbkxpbmtTQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlBvdXIgdmFsaWRlciB2b3RyZSBjb21wdGUsIG1lcmNpIGRlIGNsaXF1ZXIgc3VyIGxlIGxpZW4gc3VpdmFudCBkYW5zIGxlcyAyNGguPC9wPjxwPjxhIGhyZWY9XFxcIkxJTktfVVJMXFxcIj5WYWxpZGVyLjwvYT48L3A+XCIsXG4gICAgdmFsaWRhdGlvbk1lc3NhZ2U6IFwiVm90cmUgY29tcHRlIHZpZW50IGJpZW4gZCfDqnRyZSB2YWxpZMOpLiBNZXJjaSBldCBiaWVudmVudWUgITxicj5Wb3VzIHBvdXZleiBzYW5zIHRhcmRlciB2b3VzIGNvbm5lY3RlciBjaS1kZXNzb3VzIHBvdXIgYWNjw6lkZXIgw6Agdm90cmUgY29tcHRlLlwiLFxuICAgIHZhbGlkYXRpb25NZXNzYWdlQWRtaW46IFwiTGUgY29tcHRlIGEgYmllbiDDqXTDqSB2YWxpZMOpLlwiLFxuICAgIHZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZTogXCJJbCBzZW1ibGUgcXVlIHZvdXMgYXlleiBkw6lqw6AgdmFsaWTDqSB2b3RyZSBjb21wdGUuXCIsXG4gICAgdmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlQWRtaW46IFwiQ2UgY29tcHRlIGEgZMOpasOgIMOpdMOpIHZhbGlkw6kuXCIsXG4gICAgbWFpbFdlbGNvbWVTdWJqZWN0IDogXCJCaWVudmVudWUgIVwiLFxuICAgIG1haWxXZWxjb21lQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuVm90cmUgdmVuZXogZGUgdmFsaWRlciB2b3RyZSBpbnNjcmlwdGlvbiDDoCBOT01fU0lURS5cXG5NZXJjaSBldCDDoCBiaWVudMO0dCAhXCIsXG4gICAgbWFpbFdlbGNvbWVCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+Vm90cmUgdmVuZXogZGUgdmFsaWRlciB2b3RyZSBpbnNjcmlwdGlvbiDDoCBOT01fU0lURS48L3A+PHA+TWVyY2kgZXQgw6AgYmllbnTDtHQgITwvcD5cIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJTdWJqZWN0IDogXCJNZXJjaSAhXCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuR3LDomNlIMOgIHZvdXMgdW4gbm91dmVsIHV0aWxpc2F0ZXVyIChFTUFJTCkgdmllbnQgZGUgcydpbnNjcmlyZSBzdXIgTk9NX1NJVEUuXFxuTWVyY2kgZXQgw6AgYmllbnTDtHQgIVwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlckJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5HcsOiY2Ugw6Agdm91cyB1biBub3V2ZWwgdXRpbGlzYXRldXIgKEVNQUlMKSB2aWVudCBkZSBzJ2luc2NyaXJlIHN1ciBOT01fU0lURS48L3A+PHA+TWVyY2kgZXQgw6AgYmllbnTDtHQgITwvcD5cIixcbiAgICBiYWRMaW5rVmFsaWRhdGlvbk1lc3NhZ2U6IFwiVm90cmUgbGllbiBkZSBjb25maXJtYXRpb24gbmUgc2VtYmxlIHBhcyB2YWxpZGUgb3UgYmllbiBpbCBhIGV4cGlyw6kuIFZvdXMgcG91dmV6IGVuIHJlY2V2b2lyIHVuIG5vdXZlYXUgPGEgaHJlZj0nI1VSTCc+ZW4gY2xpcXVhbnQgaWNpPC9hPi5cIixcbiAgICBlbWFpbE5vdEZvdW5kOiBcIkF1Y3VuIHV0aWxpc2F0ZXVyIHRyb3V2w6kgcG91ciBjZXR0ZSBhZHJlc3NlIGUtbWFpbC5cIixcbiAgICBhbHJlYWR5Q29ubmVjdGVkOiBcIlZvdXMgw6p0ZXMgZMOpasOgIGNvbm5lY3TDqShlKSBhdSBzaXRlICFcIixcbiAgICBuZWVkQmVDb25uZWN0ZWQ6IFwiVm91cyBkZXZleiDDqnRyZSBjb25uZWN0w6koZSkgcG91ciBhY2PDqWRlciDDoCBjZXR0ZSBwYWdlLlwiLFxuICAgIGNvbm5lY3Rpb25PazogXCJDb25uZXhpb24gcsOpdXNzaWUuXCIsXG4gICAgbmVlZENob29zZUxvZ2luV2F5OiBcIlZvdXMgZGV2ZXogc29pdCBzYWlzaXIgdm90cmUgbW90IGRlIHBhc3NlLCBzb2l0IGNvY2hlciBsYSBjYXNlIHZvdXMgcGVybWV0dGFudCBkZSByZWNldm9pciB1biBsaWVuIGRlIGNvbm5leGlvbiBwYXIgZS1tYWlsLlwiLFxuICAgIG5lZWRWYWxpZGF0aW9uVG9Mb2dpbiA6IFwiVm91cyBkZXZleiBkJ2Fib3JkIHZhbGlkZXIgdm90cmUgY29tcHRlIGF2YW50IGRlIHZvdXMgY29ubmVjdGVyLiBQb3VyIGNlIGZhaXJlLCB1biBsaWVuIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBwYXIgZS1tYWlsLlwiLFxuICAgIHRvb01hbnlMb2dpbkZhaWxzIDogXCJUcm9wIGRlIHRlbnRhdGl2ZXMgZGUgY29ubmV4aW9uIGluZnJ1Y3R1ZXVzZXMgcG91ciBjZXR0ZSBhZHJlc3NlIGUtbWFpbC4gVm91cyBkZXZleiBhdHRlbmRyZSBNSU5VVEVTIG1pbnV0ZXMgcG91ciBlc3NheWVyIGRlIG5vdXZlYXUuXCIsXG4gICAgYmFkUGFzc3dvcmQ6IFwiTGUgbW90IGRlIHBhc3NlIG4nZXN0IHBhcyBsZSBib24uXCIsXG4gICAgbWFpbExvZ2luTGlua1N1YmplY3QgOiBcIlZvdHJlIGxpZW4gZGUgY29ubmV4aW9uLlwiLFxuICAgIG1haWxMb2dpbkxpbmtCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5Qb3VyIHZvdXMgY29ubmVjdGVyIMOgIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDogTElOS19VUkxcIixcbiAgICBtYWlsTG9naW5MaW5rQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlBvdXIgdm91cyBjb25uZWN0ZXIgw6Agdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOjwvcD48cD48YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+VmFsaWRlci48L2E+PC9wPlwiLFxuICAgIG1haWxMb2dpbkxpbmtNZXNzYWdlIDogXCJVbiBsaWVuIGRlIGNvbm5leGlvbiB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgc3VyIHZvdHJlIGFkcmVzc2UgZS1tYWlsLiBOZSB0YXJkZXogcGFzIMOgIGwndXRpbGlzZXIsIGNhciBpbCBuJ2VzdCB2YWxhYmxlIHF1ZSBkdXJhbnQgXCIsXG4gICAgdXBkYXRlZE9rTWVzc2FnZTogXCJWb3MgaW5mb3JtYXRpb25zIG9udCBiaWVuIMOpdMOpIG1pc2VzIMOgIGpvdXIuXCIsXG4gICAgdXBkYXRlZE5lZWRHb29kRW1haWwgOiBcIk1haXMgbGEgbm91dmVsbGUgYWRyZXNzZSBlLW1haWwgbidhIHB1IMOqdHJlIGVucmVnaXN0csOpZSBjYXIgZWxsZSBuJ2EgcGFzIHVuZSBmb3JtYXQgY29ycmVjdC5cIixcbiAgICB1cGRhdGVkTmVlZFVuaXF1ZUVtYWlsIDogXCJNYWlzIGxhIG5vdXZlbGxlIGFkcmVzc2UgZS1tYWlsIHNhaXNpZSAoTkVXX0VNQUlMKSBuJ2EgcHUgw6p0cmUgZW5yZWdpc3Ryw6llLCBjYXIgZWxsZSBlc3QgZMOpasOgIHV0aWxpc8OpZSBwb3VyIHVuIGF1dHJlIGNvbXB0ZS5cIixcbiAgICBtYWlsVXBkYXRlTG9naW5TdWJqZWN0IDogXCJNZXJjaSBkZSB2YWxpZGVyIHZvcyBub3V2ZWF1eCBpZGVudGlmaWFudHMuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuUG91ciB2YWxpZGVyIHZvcyBub3V2ZWF1eCBpZGVudGlmaWFudHMgZGUgY29ubmV4aW9uLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlBvdXIgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiwgPGEgaHJlZj1cXFwiTElOS19VUkxcXFwiPmNsaXF1ZXogaWNpPC9hPiBzYW5zIHRhcmRlci48L3A+XCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luTGlua01lc3NhZ2U6IFwiQ2VwZW5kYW50LCB2b3VzIGF2ZXogbW9kaWZpw6kgYXUgbW9pbnMgdW4gZGUgdm9zIGlkZW50aWZpYW50cyBkZSBjb25uZXhpb24gKGVtYWlsIGV0L291IG1vdCBkZSBwYXNzZSkgZXQgPGI+dm91cyBkZXZleiBjbGlxdWVyIHN1ciBsZSBsaWVuIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlcyBlbnZvecOpIHN1ciB2b3RyZSBhZHJlc3NlIChORVdfRU1BSUwpIHBvdXIgdmFsaWRlciBjZSBjaGFuZ2VtZW50PC9iPi4gRW4gYXR0ZW5kYW50LCBtZXJjaSBkZSBjb250aW51ZXIgw6AgdXRpbGlzZXIgdm9zIGFuY2llbnMgaWRlbnRpZmlhbnRzLlwiLFxuICAgIHVwZGF0ZWROZWVkVmFsaWRhdGVkVXNlcjogXCJMJ3V0aWxpc2F0ZXVyIHF1ZSB2b3VzIHNvdWhhaXTDqSBtb2RpZmllciBuJ2V4aXN0ZSBwYXMvcGx1cyBvdSBuJ2EgcGFzIGVuY29yZSB2YWxpZMOpIHNvbiBjb21wdGUuXCIsXG4gICAgdXBkYXRlZE5lZWRHb29kR29kZmF0aGVyIDogXCJNYWlzIGxlIG5vdXZlYXUgY29kZSBwYXJyYWluIG4nYSBwdSDDqnRyZSByZXRlbnUsIGNhciBpbCBuZSBjb3JyZXNwb25kIMOgIGF1Y3VuIGNvbXB0ZSB1dGlsaXNhdGV1ciBvdSDDoCBsJ3V0aWxpc2F0ZXVyIGx1aS1tw6ptZS5cIixcbiAgICBtYWlsVXBkYXRlTG9naW5Pa01lc3NhZ2U6IFwiTGEgbWlzZSDDoCBqb3VyIGRlIHZvcyBpZGVudGlmaWFudHMgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS5cIixcbiAgICB1cGRhdGVkRmFpbGVkR29kZmF0aGVyTm90Rm91bmQgOiBcIkwnaWRlbnRpZmlhbnQgZm91cm5pIHBvdXIgbGUgcGFycmFpbiBuZSBjb3JyZXNwb25kIMOgIGF1Y3VuIHV0aWxpc2F0ZXVyLlwiLFxuICAgIGNyZWF0aW9uT2tNZXNzYWdlOiBcIkxlIG5vdXZlbCB1dGlsaXNhdGV1ciBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6kuXCIsXG4gICAgbWFpbERlbGV0ZVN1YmplY3QgOiBcIkNvbmZpcm1lciBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUuXCIsXG4gICAgbWFpbERlbGV0ZUJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblBvdXIgdmFsaWRlciBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6XFxuTElOS19VUkxcIixcbiAgICBtYWlsRGVsZXRlQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlBvdXIgdmFsaWRlciBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUsIDxhIGhyZWY9XFxcIkxJTktfVVJMXFxcIj5jbGlxdWV6IGljaTwvYT4gc2FucyB0YXJkZXIuPC9wPlwiLFxuICAgIG1haWxEZWxldGVMaW5rTWVzc2FnZTogXCJWb3RyZSBkZW1hbmRlIGRlIHN1cHByZXNzaW9uIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuIE1lcmNpIGRlIGNsaXF1ZXIgc2FucyB0YXJkZXIgc3VyIGxlIGxpZW4gcXVpIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBwYXIgZS1tYWlsIHBvdXIgY29uZmlybWVyLlwiLFxuICAgIGRlbGV0ZU9rTWVzc2FnZTogXCJMJ3V0aWxpc2F0ZXVyIGEgYmllbiDDqXTDqSBzdXBwcmltw6kuXCIsXG4gICAgZGVsZXRlRmFpbE1lc3NhZ2U6IFwiVGVudGF0aXZlIGRlIHN1cHByZXNzaW9uIGQndW4gdXRpbGlzYXRldXIgaW5leGlzdGFudCA6IFwiLFxuICAgIG1haWxEZWxldGVMaW5rT2tNZXNzYWdlOiBcIlZvdHJlIGNvbXB0ZSBhIGJpZW4gw6l0w6kgc3VwcHJpbcOpLiBNZXJjaSBkJ2F2b2lyIHV0aWxpc8OpIG5vcyBzZXJ2aWNlcy5cIixcbiAgICBtYWlsRGVsZXRlTGlua0FscmVhZHlNZXNzYWdlOiBcIklsIHNlbWJsZSBxdWUgdm91cyBheWV6IGTDqWrDoCB2YWxpZMOpIGxhIHN1cHByZXNzaW9uIGRlIHZvdHJlIGNvbXB0ZS5cIixcbiAgICBtYWlsRGVsZXRlTGlua0ZhaWxNZXNzYWdlOiBcIlZvdHJlIGxpZW4gZGUgc3VwcHJlc3Npb24gbidlc3QgcGFzIHZhbGlkZSBvdSBhbG9ycyBpbCBuJ2VzdCBwbHVzIHZhbGFibGUuXCIsXG4gICAgY3JvbkRlbGV0ZVVudmFsaWRlZFVzZXJzTWVzc2FnZTogXCIgY29tcHRlcyB1dGlsaXNhdGV1cnMgbm9uIHZhbGlkw6lzIG9udCDDqXTDqSBzdXBwcmltw6lzLlwiLFxuICAgIGRlbGV0ZUluYWN0aXZlVXNlcnNNZXNzYWdlOiBcIiBjb21wdGVzIHV0aWxpc2F0ZXVycyBpbmFjdGlmcyBvbnQgw6l0w6kgc3VwcHJpbcOpcy5cIixcbiAgICB3ZWxjb21lTWVzc2FnZTogXCJCaWVudmVudWUgI05BTUUgIVwiLFxuICAgIGJ5ZWJ5ZU1lc3NhZ2U6IFwiU2kgdm91cyB2b3lleiBjZSBtZXNzYWdlLCBjJ2VzdCBxdWUgdm90cmUgZMOpY29ubmV4aW9uIHMnZXN0IGJpZW4gZMOpcm91bMOpZS48YnI+w4AgYmllbnTDtHQgIVwiLFxuICAgIGluZm9zVXNlckZvckFkbWluOiBcIkNldCB1dGlsaXNhdGV1ciAoaWQ6IElEX1VTRVIpIGEgPGI+Y3LDqcOpIHNvbiBjb21wdGUgbGUgREFURV9DUkVBPC9iPiwgbGEgZGVybmnDqHJlIG1pc2Ugw6Agam91ciBkYXRhbnQgZHUgREFURV9VUERBVEUuPGJyPjxiPkRhdGUgZGUgc2EgZGVybmnDqHJlIGNvbm5leGlvbiA6IERBVEVfQ09OTkVDVElPTi48L2I+XCIsXG4gICAgaW5mb3NBZG1pbkdvZGZhdGhlcjogXCJDZXQgdXRpbGlzYXRldXIgYSDDqXTDqSBwYXJyYWluw6kgcGFyIFwiLFxuICAgIGluZm9zQWRtaW5OYkdvZENoaWxkczogXCJTZXMgI05CIGZpbGxldWlscyA6IFwiXG59OyIsIi8vIFF1ZWxxdWVzIGZvbmN0aW9ucyB1dGlsZXMgcG91ciBsZXMgY2hhw65uZXNcblxuY2xhc3MgVG9vbFxue1xuICAgIHN0YXRpYyBpc0VtcHR5KG15VmFyKVxuICAgIHtcbiAgICAgICAgaWYobXlWYXI9PT11bmRlZmluZWQgfHwgbXlWYXI9PT1udWxsKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgbXlWYXIrPVwiXCI7Ly8gc2kgYXV0cmUgY2hvc2UgcXUndW5lIGNoYcOubmUgZW52b3nDqS4uLlxuICAgICAgICAgICAgbXlWYXI9bXlWYXIudHJpbSgpO1xuICAgICAgICAgICAgaWYobXlWYXI9PT1cIlwiKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBzdGF0aWMgdHJpbUlmTm90TnVsbChteVN0cmluZylcbiAgICB7XG4gICAgICAgIGlmKFRvb2wuaXNFbXB0eShteVN0cmluZykpXG4gICAgICAgICAgICBteVN0cmluZz1udWxsO1xuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIG15U3RyaW5nKz1cIlwiOy8vIHNpIGF1dHJlIGNob3NlIHF1J3VuZSBjaGHDrm5lIGVudm95w6kuLi5cbiAgICAgICAgICAgIG15U3RyaW5nPW15U3RyaW5nLnRyaW0oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbXlTdHJpbmc7XG4gICAgfVxuXG5cbiAgICBzdGF0aWMgc2hvcnRlbklmTG9uZ2VyVGhhbihteVN0cmluZywgbWF4KVxuICAgIHtcbiAgICAgICAgbXlTdHJpbmcrPVwiXCI7Ly8gYXUgY2FzIG/DuSBjZWxhIG5lIHNlcmFpdCBwYXMgdW5lIGNoYcOubmUuLi5cbiAgICAgICBpZihteVN0cmluZy5sZW5ndGggPiBtYXgpXG4gICAgICAgICAgICBteVN0cmluZz1teVN0cmluZy5zdWJzdHJpbmcoMCwgKG1heC0zKSkrXCIuLi5cIjtcbiAgICAgICAgcmV0dXJuIG15U3RyaW5nO1xuICAgIH1cblxuICAgIC8vIHNvdXJjZSA6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE1NjA0MTQwL3JlcGxhY2UtbXVsdGlwbGUtc3RyaW5ncy13aXRoLW11bHRpcGxlLW90aGVyLXN0cmluZ3NcbiAgICBzdGF0aWMgcmVwbGFjZUFsbChteVN0cmluZywgbWFwT2JqKVxuICAgIHtcbiAgICAgICAgY29uc3QgcmVwbGFjZUVsdHMgPSBuZXcgUmVnRXhwKE9iamVjdC5rZXlzKG1hcE9iaikuam9pbihcInxcIiksXCJnaVwiKTtcbiAgICAgICAgcmV0dXJuIG15U3RyaW5nLnJlcGxhY2UocmVwbGFjZUVsdHMsIChtYXRjaGVkKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gbWFwT2JqW21hdGNoZWRdO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBzb3VyY2UgOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9mci9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9PYmpldHNfZ2xvYmF1eC9NYXRoL3JhbmRvbVxuICAgIHN0YXRpYyBnZXRSYW5kb21JbnQobWluLCBtYXgpXG4gICAge1xuICAgICAgICBtaW4gPSBNYXRoLmNlaWwobWluKTtcbiAgICAgICAgbWF4ID0gTWF0aC5mbG9vcihtYXgpO1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbikpICsgbWluO1xuICAgIH1cblxuICAgIC8vIMOgIGNvbXBsw6l0ZXIgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9EYXRlX2Zvcm1hdF9ieV9jb3VudHJ5XG4gICAgc3RhdGljIGRhdGVGb3JtYXQoZGF0ZVN0cmluZywgbGFuZz1cImZyXCIpXG4gICAge1xuICAgICAgICBpZihUb29sLmlzRW1wdHkoZGF0ZVN0cmluZykpXG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgbGV0IG15RGF0ZT1uZXcgRGF0ZShkYXRlU3RyaW5nKTtcbiAgICAgICAgbGV0IG15RGF5PW15RGF0ZS5nZXREYXRlKCkrXCJcIjtcbiAgICAgICAgaWYobXlEYXkubGVuZ3RoPT09MSlcbiAgICAgICAgICAgIG15RGF5PVwiMFwiK215RGF5O1xuICAgICAgICBsZXQgbXlNb3VudGg9KG15RGF0ZS5nZXRNb250aCgpKzEpK1wiXCI7XG4gICAgICAgIGlmKG15TW91bnRoLmxlbmd0aD09PTEpXG4gICAgICAgICAgICBteU1vdW50aD1cIjBcIitteU1vdW50aDtcbiAgICAgICAgbGV0IG15WWVhcj1teURhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgaWYobGFuZz09PVwiZnJcIilcbiAgICAgICAgICAgIHJldHVybiBteURheStcIi9cIitteU1vdW50aCtcIi9cIitteVllYXI7XG4gICAgICAgIGVsc2UgaWYgKGxhbmc9PT1cImZvcm1cIikvLyAyMDE0LTAyLTA5XG4gICAgICAgICAgICByZXR1cm4gbXlZZWFyK1wiLVwiK215TW91bnRoK1wiLVwiK215RGF5O1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gbXlNb3VudGgrXCIvXCIrbXlEYXkrXCIvXCIrbXlZZWFyO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBUb29sOyIsInZhciBtYXAgPSB7XG5cdFwiLi9kZWZhdWx0L2NvbmZpZy9mci5qc1wiOiBcIi4uL3ZpZXdzL2RlZmF1bHQvY29uZmlnL2ZyLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL3ZpZXdzIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcLmpzJFwiOyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBoZWFkTGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJBY2N1ZWlsXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9cIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIk1vbiBjb21wdGVcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nvbm5leGlvbi5obXRcIiwgaWQ6IFwiYWNjb3VudEhlYWRMaW5rXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCLDgCBwcm9wb3NcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2EtcHJvcG9zLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkNvbnRhY3RcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2NvbnRhY3QuaHRtbFwiIH0gfSxcbiAgICBdLFxuICAgIGZvb3RMaW5rczpcbiAgICBbXG4gICAgICAgIHsgYW5jaG9yOiBcIkNyw6lkaXRzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jcmVkaXRzLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIk1lbnRpb25zIGzDqWdhbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9tZW50aW9ucy1sZWdhbGVzLmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJEb25uw6llcyBwZXJzb25uZWxsZXNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Rvbm5lZXMuaHRtbFwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQy5HLlUuXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jZ3UuaHRtbFwiLCByZWw6IFwibm9mb2xsb3dcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkMuRy5WLlwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY2d2Lmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgIF0sXG4gICAgbWF4UXVlc3Rpb25uYWlyZXNCeVBhZ2U6IDEwLFxuICAgIHVzZXJIb21lUGFnZSA6IFwiYWNjdWVpbC5odG1sXCIsXG4gICAgYWRtaW5Ib21lUGFnZSA6IFwiYWRtaW4uaHRtbFwiLFxuICAgIG1hbmFnZXJIb21lUGFnZSA6IFwiZ2VzdGlvbi5odG1sXCIsXG4gICAgc3Vic2NyaWJlUGFnZSA6IFwiaW5zY3JpcHRpb24uaHRtbFwiLFxuICAgIGNvbm5lY3Rpb25QYWdlIDogXCJjb25uZXhpb24uaHRtbFwiLFxuICAgIGFjY291bnRQYWdlOiBcImNvbXB0ZS5odG1sXCIsXG4gICAgcXVlc3Rpb25uYWlyZXNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXF1aXpzLmh0bWxcIixcbiAgICB1c2Vyc01hbmFnZW1lbnRQYWdlOiBcImdlc3Rpb24tdXRpbGlzYXRldXJzLmh0bWxcIixcbiAgICBuYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlIDogMTAsXG4gICAgaWxsdXN0cmF0aW9uRGlyIDogXCIvaW1nL3F1aXpzL1wiLFxuICAgIHNpdGVTbG9nYW46IFwiQ3VsdGl2b25zIG5vdHJlIGphcmRpbiAhXCIsXG4gICAgaG9tZVRpdGxlMTogXCJEZSBuYXR1cmUgY3VyaWV1c2UgP1wiLFxuICAgIGhvbWVQMTogXCJBdmVjIFdpa2lMZXJuaSB2b3VzIGFwcHJlbmV6IGNoYXF1ZSBqb3VyIGRlIG5vdXZlbGxlcyBjaG9zZXMuPGJyPkRlcyBhcnRpY2xlcyBkZSBXaWtpcMOpZGlhIHNvbnQgc8OpbGVjdGlvbm7DqXMgcG91ciB2b3VzIGV0IHNvbnQgc3VpdmlzIGQndW4gcXVpeiB2b3VzIHBlcm1ldHRhbnQgZGUgdGVzdGVyIGNlIHF1ZSB2b3VzIGVuIGF2ZXogcmV0ZW51Ljxicj5EZSBqb3VyIGVuIGpvdXIgZGUgbm91dmVsbGVzIGdyYWluZXMgZGUgc2F2b2lyIHNvbnQgYWluc2kgc2Vtw6llcyBkYW5zIHZvdHJlIFxcXCJqYXJkaW5cXFwiLlwiLFxuICAgIGhvbWVUaXRsZTI6IFwiTGEgY3VsdHVyZSBlbiBsaWJlcnTDqVwiLFxuICAgIGhvbWVQMjogXCJUb3V0IGNvbW1lIHN1ciBXaWtpcMOpZGlhICgqKSwgbGUgbG9naWNpZWwgZXQgbGUgY29udGVudSBwYXJ0YWfDqSBzdXIgV2lraUxlcm5pIHNvbnQgbGlicmVzLjxicj5Wb3VzIHBvdXZleiBsZXMgdXRpbGlzZXIsIGxlcyBtb2RpZmllciBldCBsZXMgZGlmZnVzZXIgc2Vsb24gdm90cmUgc291aGFpdC48YnI+U3VyIFdpa2lMZXJuaSwgcGFzIGRlIHB1YmxpY2l0w6ksIG5pIGRlIGNvbW1lcmNpYWxpc2F0aW9uIGRlIHZvcyBkb25uw6llcyBwZXJzb25uZWxsZXMuPGJyPlZvdXMgcG91dmV6IHZlbmlyIHkgXFxcImN1bHRpdmVyIHZvdHJlIGphcmRpblxcXCIgZW4gdG91dGUgdHJhbnF1aWxsaXTDqS48YnI+PGJyPjxzbWFsbD48ZW0+KCopIEJpZW4gcXVlIHBhcnRhZ2VhbnQgc2VzIHZhbGV1cnMsIFdpa2lMZXJuaSBlc3QgdW4gcHJvamV0IGluZMOpcGVuZGFudCBkZSBsYSBmb25kYXRpb24gV2lraXDDqWRpYS48L2VtPjwvc21hbGw+XCIsXG4gICAgbmV3UXVlc3Rpb25uYWlyZXNUaXRsZTogXCJMZXMgZGVybmllcnMgcXVpenMgcHVibGnDqXMgc3VyIFdpa2lMZXJuaVwiLFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzSW50cm86IFwiTGlzdGUgZGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzIHN1ciBXaWtpTGVybmkuXCIsXG4gICAgZXhwbGFuYXRpb25UaXRsZTogXCJWb3VzIGTDqWNvdXZyZXogV2lraUxlcm5pID9cIixcbiAgICBleHBsYW5hdGlvblR4dDogXCJMZSBwcmluY2lwZSBlc3Qgc2ltcGxlIDogdm91cyBjb21tZW5jZXogcGFyIGxpcmUgbCdhcnRpY2xlIFdpa2lww6lkaWEgZG9udCBsZSBsaWVuIHZvdXMgZXN0IHByb3Bvc8OpLjxicj5QdWlzIHZvdXMgYWZmaWNoZXIgbGUgcXVpeiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudSBkZSB2b3RyZSBsZWN0dXJlLiBWb3VzIG9idGVuZXogYWxvcnMgdm90cmUgcsOpc3VsdGF0IGltbcOpZGlhdGVtZW50Ljxicj48YnI+VG91dGVzIGxlcyByw6lwb25zZXMgc2UgdHJvdXZlbnQgZGFucyBsJ2FydGljbGUgcHJvcG9zw6kgw6AgbGEgbGVjdHVyZS4gPGI+Vm91cyDDqnRlcyBpY2kgcG91ciBhcHByZW5kcmUgZGUgbm91dmVsbGVzIGNob3NlczwvYj4sIG1haXMgbGlicmUgw6Agdm91cyBkJ2Vzc2F5ZXIgZCd5IHLDqXBvbmRyZSBpbW3DqWRpYXRlbWVudC48YnI+PGJyPlF1YW5kIGxlIHN1amV0IHMneSBwcsOqdGUsIG5lIHZvdXMgw6l0b25uZXogcGFzIHNpIGNlcnRhaW5lcyBkZXMgcsOpcG9uc2VzIHByb3Bvc8OpZXMgcGV1dmVudCDDqnRyZSB1biBwZXUgZMOpY2Fsw6llcywgYWJzdXJkZXMuLi4gT24gcGV1dCBhcHByZW5kcmUgYXZlYyBsZSBzb3VyaXJlLCBub24gPyA6LSk8YnI+PGJyPlVuZSBmb2lzIHZvdHJlIHLDqXN1bHRhdCBvYnRlbnUsIGlsIHZvdXMgc2VyYSBwcm9wb3PDqSBkZSBjcsOpZXIgdW4gY29tcHRlIHBvdXIgbGUgc2F1dmVnYXJkZXIuPGJyPkNlIGNvbXB0ZSB2b3VzIHBlcm1ldHRyYSBkZSB0ZXN0ZXIgZGUgbm91dmVhdSBjZSBxdWl6IHBvdXIgdsOpcmlmaWVyIGNlIHF1ZSB2b3VzIGVuIGF2ZXogcmV0ZW51IHBsdXNpZXVycyBqb3Vycywgc2VtYWluZXMsIG1vaXMuLi4gRXQgZGUgcmVjZXZvaXIgcsOpZ3VsacOocmVtZW50IGRlIG5vdXZlbGxlcyBzdWdnZXN0aW9ucyBkZSBsZWN0dXJlcy48YnI+PGJyPk1haXMgPGI+bGEgY3LDqWF0aW9uIGRlIGNlIGNvbXB0ZSBlc3QgZmFjdWx0YXRpdmU8L2I+IGV0IDxhIGhyZWY9Jy9xdWl6cy8nIHRpdGxlPSdMZXMgZGVybmllcnMgcXVpenMgcHVibGnDqXMnPnZvdXMgcG91dmV6IHBhcmNvdXJpciBXaWtpTGVybmkgbGlicmVtZW50PC9hPi5cIixcbiAgICBub0pTTm90aWZpY2F0aW9uOiBcIkTDqXNvbMOpLCBtYWlzIHBvdXIgbCdpbnN0YW50LCBsJ3V0aWxpc2F0aW9uIGRlIFdpa2lMZXJuaSBuw6ljZXNzaXRlIGwnYWN0aXZhdGlvbiBkdSBKYXZhU2NyaXB0LlwiLFxufTsiLCIvLyAtLSBHRVNUSU9OIERFUyBGT1JNVUxBSVJFUyBQRVJNRVRUQU5UIEFVWCBVVElMSVNBVEVVUlMgREUgTUVUVFJFIMOAIEpPVVIgTEVVUlMgSU5GT1JNQVRJT05TICsgTEVVUiBBQk9OTkVNRU5UXG5cbi8vLyBWw6lyaWZpZXIgcXVlIGwndXRpbGlzYXRldXIgZXN0IGJpZW4gY29ubmVjdMOpLCBhIGxlIGJvbiBzdGF0dXQgZXQgbGUgcmVkaXJpZ2VyIHZlcnMgbGUgZm9ybXVsYWlyZSBkJ2luc2NyaXB0aW9uIHNpIGNlIG4nZXN0IHBhcyBsZSBjYXMuXG4vLy8gU2kgYydlc3Qgb2ssIG9uIHLDqWN1cMOocmUgbGVzIGluZm9zIGRlIHNvbiBjb21wdGUgZXQgc29uIGFib25uZW1lbnQgZXQgbGVzIGFmZmljaGUgZGFucyBsZSBmb3JtdWxhaXJlLlxuLy8vIFVuZSBpbmZvcm1hdGlvbiBlc3QgYWZmaWNow6llIGNvbmNlcm5hbnQgbGEgcG9zc2liaWxpdMOpIGRlIHBhcnJhaW5hZ2UgZXQgbGVzIGxpc3RlcyBsZXMgZmlsbGV1aWxzIGV4aXN0YW50cy5cbi8vLyBVbiBtZW51IHBlcm1ldCDDoCBsJ3V0aWxpc2F0ZXVyIGQnYWNjw6lkZXIgw6AgbGEgbW9kaWZpY2F0aW9uIGRlIHNlcyBpbmZvcywgZXRjLlxuLy8vIERlcyBib3V0b25zIGRlIHBhaWVtZW50IHNvbnQgYXVzc2kgYWZmaWNow6lzIHN1aXZhbnQgbGUgY2hvaXggZGUgbCd1dGlsaXNhdGV1ciBwb3VyIGx1aSBwZXJtZXR0cmUgZGUgcHJvbG9uZ2VyIHNvbiBhYm9ubmVtZW50LlxuLy8vIFVuIG1lc3NhZ2UgdmVuYW50IGQndW5lIGF1dHJlIHBhZ2UgcGV1dCBhdXNzaSDDqnRyZSDDoCBhZmZpY2hlciBsb3JzIGR1IHByZW1pZXIgY2hhcmdlbWVudC5cblxuLy8vIEFqb3V0IHRlc3QgZW1haWwgZW4gZG91YmxvbiBhdmFudCBlbnZvaSA/XG5cbi8vIEZpY2hpZXIgZGUgY29uZmlndXJhdGlvbiBjw7R0w6kgY2xpZW50IDpcbmltcG9ydCB7IGFwaVVybCwgYXZhaWxhYmxlTGFuZ3MsIHRoZW1lIH0gZnJvbSBcIi4uLy4uL2NvbmZpZy9pbnN0YW5jZS5qc1wiO1xuY29uc3QgbGFuZz1hdmFpbGFibGVMYW5nc1swXTtcbmNvbnN0IGNvbmZpZ0Zyb250RW5kID0gcmVxdWlyZShcIi4uLy4uL3ZpZXdzL1wiK3RoZW1lK1wiL2NvbmZpZy9cIitsYW5nK1wiLmpzXCIpO1xuXG4vLyBGb25jdGlvbnMgdXRpbGVzIGF1IHNjcmlwdCA6ICEhIHJldm9pciBxdWFuZCBsZSByZXN0IHNlcmEgZmluaSBwb3VyIHbDqXJpZmllciBzaSB0b3V0IGVzdCB1dGlsZVxuaW1wb3J0IHsgZ2V0TG9jYWx5LCByZW1vdmVMb2NhbHksIHNhdmVMb2NhbHkgfSBmcm9tIFwiLi90b29scy9jbGllbnRzdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyBhZGRFbGVtZW50IH0gZnJvbSBcIi4vdG9vbHMvZG9tLmpzXCI7XG5pbXBvcnQgeyBoZWxsb0RldiwgdXBkYXRlQWNjb3VudExpbmsgfSBmcm9tIFwiLi90b29scy9ldmVyeXdoZXJlLmpzXCI7XG5pbXBvcnQgeyBnZXREYXRhc0Zyb21JbnB1dHMsIHNldEF0dHJpYnV0ZXNUb0lucHV0cyB9IGZyb20gXCIuL3Rvb2xzL2Zvcm1zLmpzXCI7XG5pbXBvcnQgeyBpc0VtcHR5LCByZXBsYWNlQWxsIH0gZnJvbSBcIi4uLy4uL3Rvb2xzL21haW5cIjtcbmltcG9ydCB7IGNoZWNrU2Vzc2lvbiwgZ2V0Q29uZmlnLCBnZXRUaW1lRGlmZmVyZW5jZSB9IGZyb20gXCIuL3Rvb2xzL3VzZXJzLmpzXCI7XG5cbi8vIERpY3Rpb25uYWlyZXMgOlxuY29uc3QgdHh0ID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi9nZW5lcmFsXCIpO1xuY29uc3QgdHh0VXNlcnMgPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL3VzZXJcIik7XG5jb25zdCB0eHRTdWJzY3JpcHRpb25zID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi9zdWJzY3JpcHRpb25cIik7XG5cbi8vIFByaW5jaXBhdXggw6lsw6ltZW50cyBkdSBET00gbWFuaXB1bMOpcyA6XG5jb25zdCBkaXZNYWluID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtYWluLWNvbnRlbnRcIik7XG5jb25zdCBkaXZNZXNzYWdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtZXNzYWdlXCIpO1xuY29uc3QgZGl2UmVzcG9uc2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJlc3BvbnNlXCIpO1xuY29uc3QgZGl2R29kY2hpbGRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJnb2RjaGlsZHNcIik7XG5jb25zdCBkaXZTdWJzY3JpYmVJbnRybyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic3Vic2NyaWJlSW50cm9cIik7XG5jb25zdCBmb3JtQWNjb3VudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYWNjb3VudFVwZGF0ZVwiKTtcbmNvbnN0IG5ld1Bhc3N3b3JkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJuZXdQYXNzd29yZFwiKTtcbmNvbnN0IHNob3dHRkVtYWlsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJnb2RmYXRoZXJFbWFpbFwiKTtcbmNvbnN0IHNob3dHRkNvZGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImdvZGZhdGhlckNvZGVcIik7XG5cbmhlbGxvRGV2KCk7XG5cbmNvbnN0IGluaXRpYWxpc2UgPSBhc3luYyAoKSA9Plxue1xuICAgIHRyeVxuICAgIHsgICAgICAgIFxuICAgICAgICBjb25zdCBjb25maWcgPSBhd2FpdCBnZXRDb25maWcoKTtcbiAgICAgICAgaWYoIWNvbmZpZylcbiAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHQuc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyBTaSBsJ3V0aWxpc2F0ZXVyIG4nZXN0IHBhcyBjb25uZWN0w6kgYXZlYyBsZSBib24gc3RhdHV0LCBwYXMgbGEgcGVpbmUgZCdhbGxlciArIGxvaW4gOlxuICAgICAgICAgICAgY29uc3QgaXNDb25uZWN0ZWQ9YXdhaXQgY2hlY2tTZXNzaW9uKFtcInVzZXJcIl0sIFwiL1wiK2NvbmZpZ0Zyb250RW5kLmNvbm5lY3Rpb25QYWdlLCB7IG1lc3NhZ2U6IHR4dFVzZXJzLm5lZWRCZUNvbm5lY3RlZCwgY29sb3I6XCJlcnJvclwiIH0sIHdpbmRvdy5sb2NhdGlvbik7XG4gICAgICAgICAgICBpZihpc0Nvbm5lY3RlZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkaXZNYWluLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgICAgICAgICAgICAgIGlmKCFpc0VtcHR5KGdldExvY2FseShcIm1lc3NhZ2VcIikpKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZNZXNzYWdlLCBcInBcIiwgZ2V0TG9jYWx5KFwibWVzc2FnZVwiLCB0cnVlKS5tZXNzYWdlLCBcIlwiLCBbZ2V0TG9jYWx5KFwibWVzc2FnZVwiLCB0cnVlKS5jb2xvcl0sIFwiXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwibWVzc2FnZVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgdXNlcj1nZXRMb2NhbHkoXCJ1c2VyXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgIHVwZGF0ZUFjY291bnRMaW5rKHVzZXIuc3RhdHVzLCBjb25maWdGcm9udEVuZCk7XG4gICAgICAgICAgICAgICAgLy8gSW5pdGlhbGlzZSBsZSBmb3JtdWxhaXJlIHBlcm1ldHRhbnQgZGUgbWV0dHJlIMOgIGpvdXIgbGVzIGluZm9zIDpcbiAgICAgICAgICAgICAgICBzZXRBdHRyaWJ1dGVzVG9JbnB1dHMoY29uZmlnLCBmb3JtQWNjb3VudCk7XG4gICAgICAgICAgICAgICAgLy8gQ2VydGFpbnMgbmF2aWdhdGV1cnMgb250IHRlbmRhbmNlIMOgIHJlbXBsaXIgdG91dCBzZXVsIGxlcyBjaGFtcHMgcGFzc3dvcmRcbiAgICAgICAgICAgICAgICBuZXdQYXNzd29yZC52YWx1ZT1cIlwiO1xuXG4gICAgICAgICAgICAgICAgLy8gRm9uY3Rpb24gYWZmaWNoYW50IGxlcyBpbmZvcyBjb25udWVzIGF1IHByZW1pZXIgYWZmaWNoYWdlIHB1aXMgYXByw6hzIGVudm9pIG1pc2Ugw6Agam91clxuICAgICAgICAgICAgICAgIGNvbnN0IGdldEluZm9zID0gKCkgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhockdldEluZm9zID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgICAgIHhockdldEluZm9zLm9wZW4oXCJHRVRcIiwgYXBpVXJsK2NvbmZpZy51c2VyUm91dGVzK2NvbmZpZy5nZXRVc2VySW5mb3MrdXNlci5pZCk7XG4gICAgICAgICAgICAgICAgICAgIHhockdldEluZm9zLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCAmJiByZXNwb25zZS5Vc2VyICE9IHVuZGVmaW5lZCAmJiByZXNwb25zZS5TdWJzY3JpcHRpb24gIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBkYXRhIGluIHJlc3BvbnNlLlVzZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZvcm1BY2NvdW50LmVsZW1lbnRzW2RhdGFdIT09dW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLlVzZXJbZGF0YV0hPT10cnVlICYmIHJlc3BvbnNlLlVzZXJbZGF0YV0hPT1mYWxzZSkvLyBib29sw6llbiA9IGNhc2Ugw6AgY29jaGVyICFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUFjY291bnQuZWxlbWVudHNbZGF0YV0udmFsdWU9cmVzcG9uc2UuVXNlcltkYXRhXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZS5Vc2VyW2RhdGFdPT10cnVlKSAvLyBzaSBmYWxzZSwgb24gbmUgZmFpdCByaWVuICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQWNjb3VudC5lbGVtZW50c1tcIlwiK2RhdGFdLmNoZWNrZWQ9XCJjaGVja2VkXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5mb3MgZGUgbCdhYm9ubmVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLlN1YnNjcmlwdGlvbi5ub3RpY2VPaz09dHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1BY2NvdW50LmVsZW1lbnRzW1wibm90aWNlT2tcIl0uY2hlY2tlZD1cImNoZWNrZWRcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gam91cnMgZGUgcsOpY2VwdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gcmVzcG9uc2UuU3Vic2NyaXB0aW9uLnJlY2VpcHREYXlzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUFjY291bnQuZWxlbWVudHNbXCJkXCIrcmVzcG9uc2UuU3Vic2NyaXB0aW9uLnJlY2VpcHREYXlzW2ldXS5jaGVja2VkPVwiY2hlY2tlZFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93R0ZFbWFpbC5pbm5lckhUTUw9cmVzcG9uc2UuVXNlci5lbWFpbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0dGQ29kZS5pbm5lckhUTUw9Y29uZmlnLmJlZ2luQ29kZUdvZGZhdGhlcityZXNwb25zZS5Vc2VyLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiZWdpblN1YlRTPW5ldyBEYXRlKHJlc3BvbnNlLlN1YnNjcmlwdGlvbi5jcmVhdGVkQXQpLmdldFRpbWUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYkRheXNPaz1yZXNwb25zZS5TdWJzY3JpcHRpb24ubnVtYmVyT2ZEYXlzLU1hdGgucm91bmQoKERhdGUubm93KCktYmVnaW5TdWJUUykvMTAwMC8zNjAwLzI0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihuYkRheXNPaz4wKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlN1YnNjcmliZUludHJvLCBcInBcIiwgdHh0U3Vic2NyaXB0aW9ucy5pbmZvc05iRGF5cy5yZXBsYWNlKFwiTkJfREFZU1wiLCBuYkRheXNPayksIFwiXCIsIFtcImluZm9ybWF0aW9uXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlN1YnNjcmliZUludHJvLCBcInBcIiwgdHh0U3Vic2NyaXB0aW9ucy5pbmZvc0V4cGlyYXRlZC5yZXBsYWNlKFwiTkJfREFZU1wiLCBuYkRheXNPayksIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIiNzdWJzY3JpYmVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHhockdldEluZm9zLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK3VzZXIudG9rZW4pOyBcbiAgICAgICAgICAgICAgICAgICAgeGhyR2V0SW5mb3Muc2VuZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBSZW1vbnRlIGxlcyBpbmZvcyBkw6lqw6AgZW5yZWdpc3Ryw6llcyA6XG4gICAgICAgICAgICAgICAgZ2V0SW5mb3MoKTtcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gVHJhaXRlbWVudCBkZSBsJ2Vudm9pIGQndW5lIG1pc2Ugw6Agam91ciBkZXMgaW5mb3NcbiAgICAgICAgICAgICAgICBmb3JtQWNjb3VudC5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIGRpdlJlc3BvbnNlLmlubmVySFRNTD1cIlwiO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YXM9Z2V0RGF0YXNGcm9tSW5wdXRzKGZvcm1BY2NvdW50KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVjb21wb3NpdGlvbiBkZXMgam91cnMgdmFsYWJsZXMgcG91ciBsJ2Fib25uZW1lbnQgOlxuICAgICAgICAgICAgICAgICAgICBkYXRhcy5yZWNlaXB0RGF5cz1cIlwiO1xuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGk9MTsgaTw9NzsgaSsrKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhc1tcImRcIitpXSE9PXVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhcy5yZWNlaXB0RGF5cys9XCJcIitpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmKGRhdGFzLm5vdGljZU9rPT09dW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXMubm90aWNlT2s9XCJmYWxzZVwiO1xuICAgICAgICAgICAgICAgICAgICBpZihkYXRhcy5uZXdzbGV0dGVyT2s9PT11bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhcy5uZXdzbGV0dGVyT2s9XCJmYWxzZVwiO1xuICAgICAgICAgICAgICAgICAgICBkYXRhcy50aW1lRGlmZmVyZW5jZT1nZXRUaW1lRGlmZmVyZW5jZShjb25maWcpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4aHJVc2VyVXBkYXRlID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmKGRhdGFzLmRlbGV0ZU9rIT09dW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgeGhyVXNlclVwZGF0ZS5vcGVuKFwiREVMRVRFXCIsIGFwaVVybCtjb25maWcudXNlclJvdXRlcytcIi9cIit1c2VyLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgeGhyVXNlclVwZGF0ZS5vcGVuKFwiUFVUXCIsIGFwaVVybCtjb25maWcudXNlclJvdXRlcytjb25maWcudXBkYXRlVXNlckluZm9zK3VzZXIuaWQpO1xuICAgICAgICAgICAgICAgICAgICB4aHJVc2VyVXBkYXRlLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCAmJiByZXNwb25zZS5tZXNzYWdlIT11bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihBcnJheS5pc0FycmF5KHJlc3BvbnNlLm1lc3NhZ2UpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UubWVzc2FnZSA9IHJlc3BvbnNlLm1lc3NhZ2Uuam9pbihcIjxicj5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLm1lc3NhZ2UgPSByZXNwb25zZS5tZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgcmVzcG9uc2UubWVzc2FnZSwgXCJcIiwgW1wic3VjY2Vzc1wiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3BvbnNlLmVycm9ycylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkocmVzcG9uc2UuZXJyb3JzKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVycm9ycyA9IHJlc3BvbnNlLmVycm9ycy5qb2luKFwiPGJyPlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3JzID0gdHh0LnNlcnZlckVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgcmVzcG9uc2UuZXJyb3JzLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRhbnMgdG91cyBsZXMgY2FzLCBqZSBtZXRzIMOgIGpvdXIgbGUgY29udGVudSBkdSBmb3JtdWxhaXJlIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbmZvcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHhoclVzZXJVcGRhdGUuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG4gICAgICAgICAgICAgICAgICAgIHhoclVzZXJVcGRhdGUuc2V0UmVxdWVzdEhlYWRlcihcIkF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIrdXNlci50b2tlbik7XG4gICAgICAgICAgICAgICAgICAgIGlmKGRhdGFzKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhcy5vdXRwdXQ9XCJodG1sXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB4aHJVc2VyVXBkYXRlLnNlbmQoSlNPTi5zdHJpbmdpZnkoZGF0YXMpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgLy8gb24gcGFzc2Ugw6AgbGEgY2Fpc3NlID9cbiAgICAgICAgICAgICAgICBjb25zdCBkaXZDR1Y9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJDR1ZPa1wiKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXYxODA9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCIxODBPa1wiKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXYzNjU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCIzNjVPa1wiKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXZXUDE4MD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIldQQnRuMTgwXCIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpdldQMzY1PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiV1BCdG4zNjVcIik7XG4gICAgICAgICAgICAgICAgY29uc3QgZGl2V1BOb25lPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiV1BOb25lXCIpO1xuICAgICAgICAgICAgICAgIGRpdkNHVi5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvLyBvbiBjb21tZW5jZSBwYXIgdG91dCAocmUpY2FjaGVyIDpcbiAgICAgICAgICAgICAgICAgICAgZGl2V1AxODAuc3R5bGUuZGlzcGxheT1cIm5vbmVcIjtcbiAgICAgICAgICAgICAgICAgICAgZGl2V1AzNjUuc3R5bGUuZGlzcGxheT1cIm5vbmVcIjtcbiAgICAgICAgICAgICAgICAgICAgZGl2V1BOb25lLnN0eWxlLmRpc3BsYXk9XCJub25lXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmKGRpdkNHVi5jaGVja2VkPT09dHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGl2MTgwLmNoZWNrZWQ9PT10cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdldQMTgwLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihkaXYzNjUuY2hlY2tlZD09PXRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2V1AzNjUuc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2V1BOb25lLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdkNHVi5jaGVja2VkPWZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAvLyBMaXN0ZSBkZXMgZmlsbGV1aWxzLCBzaSBpbCB5IGVuIGEgLSByZXZvaXIgYWZmaWNoZXIgdW4gY29kZSBwYXJyYWluYWdlIGVuIHBsdXMgZGUgbCdlbWFpbFxuICAgICAgICAgICAgICAgIGNvbnN0IHhockdldEdvZGNoaWxkcyA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgIHhockdldEdvZGNoaWxkcy5vcGVuKFwiR0VUXCIsIGFwaVVybCtjb25maWcudXNlclJvdXRlcytjb25maWcuZ2V0R29kQ2hpbGRzKTtcbiAgICAgICAgICAgICAgICB4aHJHZXRHb2RjaGlsZHMub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCksIHR4dEdvZGNoaWxkcz1cIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDApXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmJHb2RjaGlsZHM9cmVzcG9uc2UubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG5iR29kY2hpbGRzPT09MClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHh0R29kY2hpbGRzPVwiUGFzIGVuY29yZSBkJ3V0aWxpc2F0ZXVyIGFzc29jacOpcyDDoCB2b3RyZSBjb21wdGUuXCI7Ly8gcmV2b2lyIDogdXRpbGlzZXIgbGUgZGljdGlvbm5haXJlIFVzZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eHRHb2RjaGlsZHM9bmJHb2RjaGlsZHMrXCIgdXRpbGlzYXRldXIocykgaW5zY3JpdChzKSBncsOiY2Ugw6Agdm91cyA6IFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gcmVzcG9uc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eHRHb2RjaGlsZHMrPXJlc3BvbnNlW2ldLm5hbWUrXCIgKFwiK3Jlc3BvbnNlW2ldLmVtYWlsK1wiKSBcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdkdvZGNoaWxkcywgXCJwXCIsIHR4dEdvZGNoaWxkcywgXCJcIiwgW1wiaW5mb3JtYXRpb25cIl0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHhockdldEdvZGNoaWxkcy5zZXRSZXF1ZXN0SGVhZGVyKFwiQXV0aG9yaXphdGlvblwiLCBcIkJlYXJlciBcIit1c2VyLnRva2VuKTsgXG4gICAgICAgICAgICAgICAgeGhyR2V0R29kY2hpbGRzLnNlbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoKGUpXG4gICAge1xuICAgICAgICBhZGRFbGVtZW50KGRpdk1lc3NhZ2UsIFwicFwiLCB0eHQuc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICB9XG59XG5pbml0aWFsaXNlKCk7IiwiLy8gRk9OQ1RJT05TIFVUSUxFUyBBVSBTVE9DS0FHRSBMT0NBTCAoU0VTU0lPTiwgQ09PS0lFUywgSU5ERVhEQiwgRVRDLilcbi8vIFJldmVuaXIgcG91ciBnw6lyZXIgbGUgY2FzIG/DuSBsb2NhbC5zdG9yYWdlIG4nZXN0IHBhcyBjb25udSBwb3VyIHV0aWxpc2VyIGNvb2tpZVxuICAgIFxuZXhwb3J0IGNvbnN0IHNhdmVMb2NhbHkgPSAobmFtZSwgZGF0YSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShuYW1lLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2NhbHkgPSAobmFtZSwganNvbj1mYWxzZSkgPT5cbntcbiAgICBpZihqc29uKVxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKSk7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSk7XG59XG5cbmV4cG9ydCBjb25zdCByZW1vdmVMb2NhbHkgPSAobmFtZSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShuYW1lKTtcbn0iLCJpbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gRm9uY3Rpb24gYXNzb2NpYW50IGxlcyBhdHRyaWJ1dHMgZm91cm5pcyDDoCB1biBjaGFtcCBkZSBmb3JtdWxhaXJlXG5leHBvcnQgY29uc3QgYWRkRWxlbWVudCA9IChlbHRQYXJlbnQsIGVsdFR5cGUsIGVsdENvbnRlbnQ9XCJcIiwgZWx0SWQ9XCJcIiwgZWx0Q2xhc3M9W10sIGVsdEF0dHJpYnV0ZXM9e30sIHJlcGxhY2U9dHJ1ZSkgPT5cbntcbiAgICBpZihpc0VtcHR5KGVsdFR5cGUpIHx8IGlzRW1wdHkoZWx0UGFyZW50KSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGVsc2VcbiAgICB7XG4gICAgICAgIGNvbnN0IG5ld0VsZW1lbnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlbHRUeXBlKTtcbiAgICAgICAgXG4gICAgICAgIGlmKCFpc0VtcHR5KGVsdElkKSkvLyB0ZXN0ZXIgc2kgbCdpZCBuJ2VzdCBwYXMgZMOpasOgIHV0aWxpc8OpIGRhbnMgbGUgRE9NID9cbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaWQ9ZWx0SWQ7XG5cbiAgICAgICAgaWYoQXJyYXkuaXNBcnJheShlbHRDbGFzcykgJiYgZWx0Q2xhc3MubGVuZ3RoIT0wKVxuICAgICAgICB7XG4gICAgICAgICAgICBmb3IobGV0IGkgaW4gZWx0Q2xhc3MpXG4gICAgICAgICAgICAgICAgbmV3RWxlbWVudC5jbGFzc0xpc3QuYWRkKGVsdENsYXNzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHR5cGVvZiBlbHRBdHRyaWJ1dGVzID09PSBcIm9iamVjdFwiKSAvLyAhISB0b3VzIGxlcyBvYmpldHMgbmUgc29udCBwYXMgb2tcbiAgICAgICAge1xuICAgICAgICAgICAgZm9yKGxldCBhdHRyaWJ1dE5hbWUgaW4gZWx0QXR0cmlidXRlcylcbiAgICAgICAgICAgICAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dE5hbWUsIGVsdEF0dHJpYnV0ZXNbYXR0cmlidXROYW1lXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZighaXNFbXB0eShlbHRDb250ZW50KSlcbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaW5uZXJIVE1MPWVsdENvbnRlbnQucmVwbGFjZSgvXFxuL2csXCI8YnI+XCIpOy8vIGlubmVySFRNTCBwZXJtZXQgZCdham91dGVyIGR1IHRleHRlIGF5YW50IGx1aS1tw6ptZSBkZXMgYmFsaXNlcywgZXRjLlxuICAgICAgICAgICAgXG4gICAgICAgIGlmKHJlcGxhY2UpXG4gICAgICAgICAgICBlbHRQYXJlbnQuaW5uZXJIVE1MPVwiXCI7XG4gICAgICAgIGVsdFBhcmVudC5hcHBlbmRDaGlsZChuZXdFbGVtZW50KTtcbiAgICB9ICAgIFxufSIsIi8vIENlIHNjcmlwdCBmb3Vybml0IGRlcyBmb25jdGlvbnMgdXRpbGlzw6llcyBzdXIgdG91dGVzIGxlcyBwYWdlcyBkdSBzaXRlXG5cbmV4cG9ydCBjb25zdCBoZWxsb0RldiA9ICgpID0+XG57XG4gICAgY29uc29sZS5sb2coXCIqKioqIEhlbGxvIGFtaSBkw6l2ZWxvcHBldXIgOi0pXFxuIExlIGNvZGUgZGUgV2lraUxlcm5pIGVzdCBsaWJyZSBldCBlc3QgbGlzaWJsZSBzdXIgZ2l0bGFiIDogXFxuIEJvbm5lIGxlY3R1cmUgOi0pIFxcbiBQb3VyIGxlcyBzdWdnZXN0aW9ucyBkJ2Ftw6lsaW9yYXRpb24gb3UgcXVlc3Rpb25zIDogZGV2QHdpbGlsZXJuaS5jb20gKioqKlwiKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUFjY291bnRMaW5rID0gKHN0YXR1cywgY29uZmlnVGVtcGxhdGUpID0+XG57XG4gICAgY29uc3QgbGluaz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFjY291bnRIZWFkTGlua1wiKTtcbiAgICBjb25zdCBob21lUGFnZT1zdGF0dXMrXCJIb21lUGFnZVwiO1xuICAgIGxpbmsuaHJlZj1cIi9cIitjb25maWdUZW1wbGF0ZVtob21lUGFnZV07XG59IiwiaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIEZvbmN0aW9uIGFzc29jaWFudCBsZXMgYXR0cmlidXRzIGZvdXJuaXMgw6AgdW4gY2hhbXAgZGUgZm9ybXVsYWlyZVxuZXhwb3J0IGNvbnN0IHNldEF0dHJpYnV0ZXNUb0lucHV0cyA9IChpbnB1dHNDb25mLCBteUZvcm0pID0+XG57XG4gICAgZm9yKGxldCBpIGluIG15Rm9ybS5lbGVtZW50cylcbiAgICB7XG4gICAgICAgIGlmKCFpc0VtcHR5KG15Rm9ybS5lbGVtZW50c1tpXS5pZCkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldCBpZElucHV0PW15Rm9ybS5lbGVtZW50c1tpXS5pZDtcbiAgICAgICAgICAgIGlmKGlucHV0c0NvbmZbaWRJbnB1dF0hPT11bmRlZmluZWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGV0IGlucHV0SFRNTD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZElucHV0KTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBhdHRyaWJ1dGUgaW4gaW5wdXRzQ29uZltpZElucHV0XSlcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRIVE1MLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIGlucHV0c0NvbmZbaWRJbnB1dF1bYXR0cmlidXRlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbi8vIFLDqWN1cMOocmUgdG91dGVzIGxlcyB2YWxldXJzIGRlIGNoYW1wcyBlbiBvbWV0dGFudCBsZXMgY2hlY2tib3ggbm9uIGNvY2jDqWVzLCBldGMuXG5leHBvcnQgY29uc3QgZ2V0RGF0YXNGcm9tSW5wdXRzID0gKG15Rm9ybSkgPT5cbntcbiAgICBjb25zdCBkYXRhcz17fTtcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShteUZvcm0pO1xuICAgIGZvcihsZXQgZW50cmllIG9mIGZvcm1EYXRhLmVudHJpZXMoKSlcbiAgICAgICBkYXRhc1tlbnRyaWVbMF1dPWVudHJpZVsxXTtcbiAgICByZXR1cm4gZGF0YXM7XG59XG5cbi8vIFZpZGUgdG91cyBsZXMgY2hhbXBzIGQndW4gZm9ybXVsYWlyZSwgeSBjb21wcmlzIGhpZGRlbiwgY2hlY2tib3gsIGV0Yy5cbi8vIFJldm9pciBwb3VyIGxlcyBzZWxlY3RcbmV4cG9ydCBjb25zdCBlbXB5Rm9ybSA9IChteUZvcm0pID0+XG57XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEobXlGb3JtKTtcbiAgICBmb3IobGV0IGVudHJpZSBvZiBmb3JtRGF0YS5lbnRyaWVzKCkpXG4gICAge1xuICAgICAgICBpZihteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS50eXBlPT1cImNoZWNrYm94XCIgfHwgbXlGb3JtLmVsZW1lbnRzW2VudHJpZVswXV0udHlwZT09XCJyYWRpb1wiKVxuICAgICAgICAgICAgbXlGb3JtLmVsZW1lbnRzW2VudHJpZVswXV0uY2hlY2tlZD1mYWxzZTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbXlGb3JtLmVsZW1lbnRzW2VudHJpZVswXV0udmFsdWU9XCJcIjtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG4vLyBWaWRlIGV0IGNhY2hlIGxlIGZvcm11bGFpcmVcbmV4cG9ydCBjb25zdCBlbXB5QW5kSGlkZUZvcm0gPSAobXlGb3JtKSA9Plxue1xuICAgIGVtcHlGb3JtKG15Rm9ybSk7XG4gICAgbXlGb3JtLnN0eWxlLmRpc3BsYXk9XCJub25lXCI7XG59IiwiaW1wb3J0IHsgYXBpVXJsLCBhdmFpbGFibGVMYW5ncywgc2l0ZVVybCwgdGhlbWUgfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCI7XG5jb25zdCBsYW5nPWF2YWlsYWJsZUxhbmdzWzBdO1xuXG5jb25zdCBjb25maWdUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi8uLi8uLi92aWV3cy9cIit0aGVtZStcIi9jb25maWcvXCIrbGFuZytcIi5qc1wiKTtcbmltcG9ydCB7ICBjaGVja0xvZ2luUm91dGUsIHRpbWVEaWZmZXJlbmNlTWF4LCB0aW1lRGlmZmVyZW5jZU1pbiwgdXNlclJvdXRlcyB9IGZyb20gXCIuLi8uLi8uLi9jb25maWcvdXNlcnMuanNcIjtcblxuaW1wb3J0IHsgZ2V0TG9jYWx5LCByZW1vdmVMb2NhbHksIHNhdmVMb2NhbHkgfSBmcm9tIFwiLi9jbGllbnRzdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gUsOpY3Vww6hyZSBsZXMgZG9ubsOpZXMgZGUgY29uZmlndXJhdGlvbiBkZXMgdXRpbGlzYXRldXJzXG4vLyDDgCB0ZXJtZSwgdW4gZmljaGllciBzdGF0aXF1ZSBpbXBvcnRhYmxlIGNvbW1lIG1vZHVsZSBkZXZyYWl0IMOpdml0ZXIgdW5lIHJlcXXDqnRlIGFqYXhcbmV4cG9ydCBjb25zdCBnZXRDb25maWcgPSAgYXN5bmMgKCkgPT5cbntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBhcGlVcmwrXCIvdXNlci9nZXRjb25maWdcIik7XG4gICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCkpO1xuICAgICAgICB4aHIub25lcnJvciA9ICgpID0+IHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICAgIHhoci5zZW5kKCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRUaW1lRGlmZmVyZW5jZSA9ICgpID0+XG57XG4gICAgY29uc3QgdGltZUxvY2FsPW5ldyBEYXRlKCkuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICBpZih0aW1lTG9jYWwgPiB0aW1lRGlmZmVyZW5jZU1heCB8fCB0aW1lTG9jYWwgPCB0aW1lRGlmZmVyZW5jZU1pbilcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgZWxzZSByZXR1cm4gdGltZUxvY2FsO1xufVxuXG4vLyBPbiBlbmzDqHZlIHZvbG9udGFpcmVtZW50IGxlcyAwL08gcG91ciDDqXZpdGVyIGxlcyBjb25mdXNpb25zICFcbi8vIEV0IG1pZXV4IHZhdXQgYXVzc2kgZMOpYnV0ZXIgZXQgZmluaXIgcGFyIHVuZSBsZXR0cmUgc2ltcGxlLlxuZXhwb3J0IGNvbnN0IGdldFBhc3N3b3JkID0gKG5iQ2FyTWluLCBuYkNhck1heCkgPT5cbntcbiAgICBjb25zdCBuYkNhcj1uYkNhck1pbitNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqKG5iQ2FyTWF4LW5iQ2FyTWluKSk7XG4gICAgY29uc3QgbGV0dGVycz1cIkFCQ0RFRkdISUpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbnBxcnN0dXZ3eHl6XCI7XG4gICAgY29uc3Qgb3RoZXJzPVwiMTIzNDU2Nzg5IT8uKi1fJUAmw4nDgMOIw5nigqwkw4LDisObw45cIjtcbiAgICBsZXQgcGFzc3dvcmQ9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICBmb3IobGV0IGk9MTtpPChuYkNhci0xKTtpKyspXG4gICAge1xuICAgICAgICBpZigoaSAlIDIpID09PTEpXG4gICAgICAgICAgICBwYXNzd29yZCs9b3RoZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpvdGhlcnMubGVuZ3RoKV07XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHBhc3N3b3JkKz1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldOyAgIFxuICAgIH1cbiAgICBwYXNzd29yZCs9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICByZXR1cm4gcGFzc3dvcmQ7XG59XG5cbi8vIEondXRpbGlzZSBsZSBzdG9ja2FnZSBsb2NhbCBkdSBuYXZpZ2F0ZXVyIHBvdXIgZW5yZWdpc3RyZXIgbGVzIGRvbm7DqWVzIHBlcm1ldHRhbnQgZGUgcmVjb25uYcOudHJlIGwndXRpbGlzYXRldXIgcGFyIGxhIHN1aXRlXG4vLyBTZXVsIGxlIHNlcnZldXIgcG91cnJhIHbDqXJpZmllciBxdWUgbGVzIGlkZW50aWZpYW50cyBzb250ICh0b3Vqb3VycykgdmFsaWRlcy5cbmV4cG9ydCBjb25zdCBzZXRTZXNzaW9uID0gKHVzZXJJZCwgdG9rZW4sIGR1cmF0aW9uVFMpID0+XG57XG4gICAgY29uc3Qgc3RvcmFnZVVzZXI9XG4gICAge1xuICAgICAgICBpZDogdXNlcklkLFxuICAgICAgICB0b2tlbjogdG9rZW4sXG4gICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvblRTXG4gICAgfVxuICAgIHNhdmVMb2NhbHkoXCJ1c2VyXCIsIHN0b3JhZ2VVc2VyKTtcbn1cblxuLy8gVsOpcmlmaWUgcXUnaWwgeSBhIGRlcyBkb25uw6llcyBsb2NhbGVzIGNvbmNlcm5hbnQgbGUgcsOpc3VsdGF0IGQndW4gcXVpelxuLy8gRXQgbGVzIGFqb3V0ZSBhdXggZG9ubsOpZXMgZW52b3nDqWVzIHBhciBsZXMgZm9ybXVsYWlyZXMgZCdpbnNjcmlwdGlvbi9jb25uZXhpb24gc2kgYydlc3QgbGUgY2FzXG5leHBvcnQgY29uc3QgY2hlY2tBbnN3ZXJEYXRhcyA9IChkYXRhcykgPT5cbntcbiAgICBjb25zdCBsYXN0QW5zd2VyPWdldExvY2FseShcImxhc3RBbnN3ZXJcIik7XG4gICAgaWYoIWlzRW1wdHkobGFzdEFuc3dlcikpXG4gICAge1xuICAgICAgICBjb25zdCBhbnN3ZXI9SlNPTi5wYXJzZShsYXN0QW5zd2VyKTtcbiAgICAgICAgaWYoIWlzRW1wdHkoYW5zd2VyLmR1cmF0aW9uKSAmJiAhaXNFbXB0eShhbnN3ZXIubmJDb3JyZWN0QW5zd2VycykgJiYgIWlzRW1wdHkoYW5zd2VyLlF1ZXN0aW9ubmFpcmVJZCkgJiYgIWlzRW1wdHkoYW5zd2VyLm5iUXVlc3Rpb25zKSlcbiAgICAgICAge1xuICAgICAgICAgICAgZGF0YXMuZHVyYXRpb249YW5zd2VyLmR1cmF0aW9uO1xuICAgICAgICAgICAgZGF0YXMubmJDb3JyZWN0QW5zd2Vycz1hbnN3ZXIubmJDb3JyZWN0QW5zd2VycztcbiAgICAgICAgICAgIGRhdGFzLlF1ZXN0aW9ubmFpcmVJZD1hbnN3ZXIuUXVlc3Rpb25uYWlyZUlkO1xuICAgICAgICAgICAgZGF0YXMubmJRdWVzdGlvbnM9YW5zd2VyLm5iUXVlc3Rpb25zO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhcztcbn1cblxuLy8gQ2V0dGUgZm9uY3Rpb24gdGVzdGUgbGEgY29ubmV4aW9uIGRlIGwndXRpbGlzYXRldXIgZCd1bmUgcGFnZVxuLy8gT24gcGV1dCBmb3VybmlzIHVuZSBsaXN0ZSBkZSBzdGF0dXRzIGFjY2VwdMOpcyAoc2kgdmlkZSA9IHRvdXMpLCBhaW5zaSBxdSd1bmUgdXJsIGRlIHJlZGlyZWN0aW9uIHNpIG5vbiBjb25uZWN0w6ksIHVuIG1lc3NhZ2UgZCdlcnJldXIgw6AgYWZmaWNoZXIgc3VyIGxhIHBhZ2UgZGUgZGVzdGluYXRpb24gZXQgbCd1cmwgc3VyIGxhcXVlbGxlIHJldmVuaXIgdW5lIGZvaXMgY29ubmVjdMOpXG5leHBvcnQgY29uc3QgY2hlY2tTZXNzaW9uID0gYXN5bmMgKHN0YXR1cz1bXSwgdXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCkgPT5cbntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IHVzZXJEYXRhcz1nZXRMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICBpZihpc0VtcHR5KHVzZXJEYXRhcykpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgdXNlcj1KU09OLnBhcnNlKHVzZXJEYXRhcyk7XG4gICAgICAgICAgICBpZihpc0VtcHR5KHVzZXIuaWQpIHx8wqBpc0VtcHR5KHVzZXIudG9rZW4pIHx8IGlzRW1wdHkodXNlci5kdXJhdGlvbikgfHwgdXNlci5kdXJhdGlvbiA8IERhdGUubm93KCkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgYXBpVXJsK3VzZXJSb3V0ZXMrY2hlY2tMb2dpblJvdXRlK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDAgJiYgcmVzcG9uc2UuaXNWYWxpZCAmJiByZXNwb25zZS5pZCAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLmlkPT09dXNlci5pZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLm5hbWU9cmVzcG9uc2UubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLmxhbmd1YWdlPXJlc3BvbnNlLmxhbmd1YWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIudGltZURpZmZlcmVuY2U9cmVzcG9uc2UudGltZURpZmZlcmVuY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5zdGF0dXM9cmVzcG9uc2Uuc3RhdHVzOy8vIGxlIHRva2VuIGV0IGRlIHRvdXRlIGZhw6dvbiB2w6lyaWZpZXIgw6AgY2hhcXVlIHJlcXXDqnRlIMOgIGwnQVBJXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUxvY2FseShcInVzZXJcIiwgdXNlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2kgaWwgcydhZ2l0IGQndW4gXCJ1c2VyXCIgZXQgcXVlIHNvbiBhYm9ubmVtZW50IGEgZXhwaXLDqSwgamUgbGUgcmVkaXJpZ2UgdmVycyBsYSBjYWlzc2UgOi0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2Uuc3RhdHVzPT09XCJ1c2VyXCIgJiYgcmVzcG9uc2UubmJEYXlzT2sgPD0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybEFjY291bnQ9c2l0ZVVybCtcIi9cIitjb25maWdUZW1wbGF0ZVtsYW5nXS5hY2NvdW50UGFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZih1cmxBY2NvdW50KT09PS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIi9cIitjb25maWdUZW1wbGF0ZVtsYW5nXS5hY2NvdW50UGFnZSk7Ly8gcGFzc8OpZSBkaXJlY3RlbWVudCBpY2ksIGwnYW5jcmUgI3N1YnNjcmliZSBuZSBmb25jdGlvbm5lIHBhcyAhP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzdGF0dXMubGVuZ3RoIT09MCAmJiBzdGF0dXMuaW5kZXhPZihyZXNwb25zZS5zdGF0dXMpPT09LTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHhoci5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICAgICAgICAgICAgICB4aHIuc2VuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4vLyBDZXR0ZSBmb25jdGlvbiBzZXJ0IMOgIGxhIHByw6ljw6lkZW50ZSBlbiBjYXMgZGUgY29ubmV4aW9uIG5vbiB2YWxpZGVcbmNvbnN0IHJlZGlyZWN0VXNlciA9ICh1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKSA9Plxue1xuICAgIGlmKCFpc0VtcHR5KG1lc3NhZ2UpKVxuICAgICAgICBzYXZlTG9jYWx5KFwibWVzc2FnZVwiLCBtZXNzYWdlKTtcbiAgICBpZighaXNFbXB0eSh1cmxXYW50ZWQpKVxuICAgICAgICBzYXZlTG9jYWx5KFwidXJsXCIsIHVybFdhbnRlZCk7XG4gICAgaWYoIWlzRW1wdHkodXJsUmVkaXJlY3Rpb24pKVxuICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKHVybFJlZGlyZWN0aW9uKTtcbn0iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/front/public/JS/connection.app.js b/front/public/JS/connection.app.js new file mode 100644 index 0000000..eb54c21 --- /dev/null +++ b/front/public/JS/connection.app.js @@ -0,0 +1,1294 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "./src/connection.js"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "../config/instance.js": +/*!*****************************!*\ + !*** ../config/instance.js ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var _module$exports; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var users = __webpack_require__(/*! ./users */ "../config/users.js"); + +var questionnaires = __webpack_require__(/*! ./questionnaires */ "../config/questionnaires.js"); + +module.exports = (_module$exports = { + apiUrl: "http://localhost:3000/api", + siteUrl: "http://localhost:8080", + adminName: "Fabrice", + adminEmail: "dev@wikilerni.com", + senderName: "WikiLerni", + senderEmail: "bonjour@wikilerni.com", + adminLang: "fr", + theme: "default", + // le thème utilisé (dans /views) pour générer les pages HTML. Contient ses propres fichiers de configuration. + availableLangs: ["fr"], + // Languages in which the site is available. The first one is the default one. + siteName: "WikiLerni", + beginCodeGodfather: "wikilerni", + // case-sensitive and can't contain "@" ! + cronTimingAlertInSeconde: 120, + // for logs + responseTimingAlertInSeconde: 3, + // idem + tokenSignupValidationTimeInHours: "48h", + // https://github.com/zeit/ms + tokenLoginLinkTimeInHours: "1h", + tokenConnexionMinTimeInHours: "24h", + tokenConnexionMaxTimeInDays: "180 days", + tokenLoginChangingTimeInHours: "1h", + // for email & password changing + tokenDeleteUserTimeInHours: "1h", + tokenUnsubscribeLinkTimeInDays: "7 days", + // token send with subscription's emails + freeAccountTimingInDays: 10, + freeAccountExpirationNotificationInDays: 5, + accountExpirationFirstNotificationInDays: 14, + accountExpirationSecondNotificationInDays: 5, + inactiveAccountTimeToDeleteInDays: 180, + // Questionnaires: + nbQuestionsMin: 1, + // minimum number of questions for the questionnaire to be publishable + nbQuestionsMax: 10, + // if 0 = not maximum + nbChoicesMax: 10, + nbNewQuestionnaires: 10, + // for RSS, etc. + hourGiveNewQuestionnaireBegin: 1, + // in user local time + hourGiveNewQuestionnaireEnd: 24, + // idem + numberNewQuestionnaireAtSameTime: 50, + // for mass mailing + minSearchQuestionnaires: 3, + // Illustrations: + nbIllustrationsMin: 0, + nbIllustrationsMax: 1, + maxIllustrationSizeinOctet: 1000000, + // pas contrôlé pour l'instant. À revoir. + mimeTypesForIllustration: ["image/jpg", "image/jpeg", "image/png", "image/gif", "image/png"], + // -- Upload and resize: + illustrationsWidthMaxInPx: 400, + illustrationsMiniaturesWidthMaxInPx: 200, + // Links: + nbLinksMin: 1, + nbLinksMax: 1 +}, _defineProperty(_module$exports, "nbQuestionsMin", questionnaires.nbQuestionsMin), _defineProperty(_module$exports, "nbQuestionsMax", questionnaires.nbQuestionsMax), _defineProperty(_module$exports, "nbChoicesMax", questionnaires.nbChoicesMax), _defineProperty(_module$exports, "passwordMinLength", users.password.minlength), _defineProperty(_module$exports, "dirCacheUsers", users.dirCacheUsers), _defineProperty(_module$exports, "dirCacheUsersAnswers", users.dirCacheUsersAnswers), _defineProperty(_module$exports, "dirCacheQuestionnaires", questionnaires.dirCacheQuestionnaires), _defineProperty(_module$exports, "dirCacheQuestions", questionnaires.dirCacheQuestions), _defineProperty(_module$exports, "dirCacheUsersQuestionnaires", questionnaires.dirCacheUsersQuestionnaires), _defineProperty(_module$exports, "dirHTMLQuestionnaire", questionnaires.dirHTMLQuestionnaire), _defineProperty(_module$exports, "dirWebQuestionnaire", questionnaires.dirWebQuestionnaire), _module$exports); + +/***/ }), + +/***/ "../config/questionnaires.js": +/*!***********************************!*\ + !*** ../config/questionnaires.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + // API'routes (after "apiUrl" defined in instance.js) + questionnaireRoutes: "/questionnaire", + getQuestionnaireRoutes: "/get", + previewQuestionnaireRoutes: "/preview", + publishedQuestionnaireRoutes: "/quiz/", + saveAnswersRoute: "/answer/", + getStatsQuestionnaires: "/stats/", + searchQuestionnairesRoute: "/search", + searchAdminQuestionnairesRoute: "/searchadmin", + getListNextQuestionnaires: "/getlistnextquestionnaires/", + // -- questions & choices : + questionsRoute: "/question/", + // -- tags : + tagsSearchRoute: "/tags/search/", + // -- answers : + getQuestionnairesWithoutAnswer: "/withoutanswer/user/", + getPreviousAnswers: "/user/answers/", + getStatsAnswers: "/user/anwswers/stats/", + getAdminStats: "/getadminstats/", + // forms : à compléter avec valeurs par défaut, etc. cf modèle + Questionnaire: { + title: { + maxlength: 255, + required: true + }, + slug: { + maxlength: 150 + }, + // champ requis mais calculé à partir du titre qd vide + introduction: { + required: true + } + }, + searchQuestionnaires: { + minlength: 3, + required: true + }, + Question: { + text: { + maxlength: 255, + required: true + }, + rank: { + required: true, + min: 1, + defaultValue: 1 + } + }, + Choice: { + text: { + maxlength: 255, + required: true + } + }, + nbQuestionsMin: 1, + nbQuestionsMax: 10, + nbChoicesMax: 10, + nbTagsMin: 0, + nbTagsMax: 0, + // 0 = not max + // JSON and HTML dir + dirCacheQuestionnaires: "datas/questionnaires", + dirCacheQuestions: "datas/questionnaires/questions", + dirCacheUsersQuestionnaires: "datas/users/questionnaires", + dirCacheTags: "datas/questionnaires/tags", + dirHTMLQuestionnaire: "front/public/quiz", + dirHTMLTags: "front/public/quizs", + dirWebQuestionnaire: "quiz", + //pour url page + dirWebTags: "quizs" // idem + +}; + +/***/ }), + +/***/ "../config/users.js": +/*!**************************!*\ + !*** ../config/users.js ***! + \**************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + // API'routes (after "apiUrl" defined in instance.js) + userRoutes: "/user", + subscribeRoute: "/signup", + getGodfatherRoute: "/getgodfatherid", + checkIfIsEmailfreeRoute: "/isemailfree", + checkSubscribeTokenRoute: "/validation/", + checkLoginRoute: "/checklogin/", + connectionRoute: "/login", + getLoginLinkRoute: "/getloginlink", + connectionWithLinkRoute: "/checkloginlink", + getUserInfos: "/get/", + createUserRoute: "/create", + validateUserRoute: "/validate/", + updateUserInfos: "/modify/", + searchUserRoute: "/search/", + getGodChilds: "/getgodchilds/", + checkNewLoginLinkRoute: "/confirmnewlogin/", + checkDeleteLinkRoute: "/confirmdelete/", + getPayments: "/payment/getforoneuser/", + unsubscribeRoute: "/subscription/stop/", + getAdminStats: "/getadminstats/", + // forms : à compléter avec valeurs par défaut, etc. cf modèle + name: { + maxlength: 70, + required: true + }, + email: { + maxlength: 255, + required: true + }, + password: { + minlength: 8, + maxlength: 72, + required: true + }, + // https://www.npmjs.com/package/bcrypt#security-issues-and-concerns + newPassword: { + minlength: 8, + maxlength: 72 + }, + codeGodfather: { + maxlength: 255 + }, + cguOk: { + value: "true", + required: true + }, + timeDifferenceMin: -720, + timeDifferenceMax: 840, + // JSON dir + dirCacheUsers: "datas/users", + dirCacheUsersAnswers: "datas/users/questionnaires/answers" +}; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/general$": +/*!**************************************!*\ + !*** ../lang sync ^\.\/.*\/general$ ***! + \**************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/general": "../lang/fr/general.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/general$"; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/user$": +/*!***********************************!*\ + !*** ../lang sync ^\.\/.*\/user$ ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/user": "../lang/fr/user.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/user$"; + +/***/ }), + +/***/ "../lang/fr/general.js": +/*!*****************************!*\ + !*** ../lang/fr/general.js ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + siteHTMLTitle: "WikiLerni : qu'allez-vous apprendre aujourd'hui ?", + siteMetaDescription: "Chaque jour, testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.", + scriptTimingInfo: "Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", + scriptTimingAlert: "*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", + serverError: "Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.", + serverErrorAdmin: "Bug de l'application :", + neededParams: "Des paramètres nécessaires manquants sont manquants.", + badUrl: "Tentative d'accès à une page n'existant pas :", + notValidFormat: "Format non valide.", + notAllowed: "Vous n'avez pas les droits nécessaires pour cette action.", + notRequired: "Facultatif.", + updateBtnTxt: "Modifier", + addBtnTxt: "Ajouter", + deleteBtnTxt: "Supprimer", + addOkMessage: "Les données ont bien été enregistrées.", + updateOkMessage: "La mise à jour à jour a bien été enregistrée.", + deleteOkMessage: "La suppression a bien été enregistrée.", + failAuth: "Erreur d'authentification.", + failAuthHeader: "Absence de header Authorization.", + failAuthToken: "Token invalide ou utilisateur non trouvé.", + failAuthId: "Identifiant non valide : ", + failAuthCron: "Tentative de lancement d'un cron sans le bon token.", + previousPage: "Page précédente", + nextPage: "Page suivante", + btnLinkToQuestionnaire: "Aller au quiz !", + statsAdmin: "Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium." +}; + +/***/ }), + +/***/ "../lang/fr/user.js": +/*!**************************!*\ + !*** ../lang/fr/user.js ***! + \**************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + notFound: "L'utilisateur n'a pas été trouvé.", + needName: "Merci de choisir un nom d'utilisateur.", + needNotTooLongName: "Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.", + needEmail: "Merci de saisir votre adresse e-mail.", + needUniqueEmail: "L'adresse e-mail que vous avez saisie est déjà utilisée par un autre utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.", + needNotTooLongEmail: "Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.", + needPassWord: "Merci de fournir un mot de passe.", + needLongPassWord: "Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.", + passwordCopied: "Le mot de passe généré a été copié dans le presse-papier. Vous pouvez le recopier où vous le souhaiter.", + needStatus: "Il manque le statut.", + needLanguage: "Il manque le code langue.", + needValidLastConnectionDate: "La date de dernière connexion n'est pas valide.", + needSMTP: "Il manque le serveur SMTP.", + needSMTPNotFound: "Il manque le serveur SMTP.", + needKnowNewsletterOk: "Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.", + needTimeDifference: "Il faut connaître le nombre de minutes du décalage horaire.", + needMinTimeDifference: "Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.", + needMaxTimeDifference: "Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.", + needUGCOk: "Vous devez accepter les CGU pour pouvoir créer votre compte. ", + godfatherNotFound: "Aucun utilisateur valide trouvé pour ce code parrain.", + godfatherFound: "Votre parrain a bien été trouvé !", + mailValidationMessage: "Votre inscription est bien enregistrée.\nPour la finaliser, merci de cliquer dans les 24H sur le lien de confirmation qui vient de vous être envoyé par e-mail.", + mailValidationLinkSubject: "Merci de valider votre compte", + mailValidationLinkSBodyTxt: "Bonjour USER_NAME,\n\nPour valider votre compte, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL", + mailValidationLinkSBodyHTML: "

Bonjour USER_NAME,

Pour valider votre compte, merci de cliquer sur le lien suivant dans les 24h.

Valider.

", + validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue !
Vous pouvez sans tarder vous connecter ci-dessous pour accéder à votre compte.", + validationMessageAdmin: "Le compte a bien été validé.", + validationAlreadyMessage: "Il semble que vous ayez déjà validé votre compte.", + validationAlreadyMessageAdmin: "Ce compte a déjà été validé.", + mailWelcomeSubject: "Bienvenue !", + mailWelcomeBodyTxt: "Bonjour USER_NAME,\nVotre venez de valider votre inscription à NOM_SITE.\nMerci et à bientôt !", + mailWelcomeBodyHTML: "

Bonjour USER_NAME,

Votre venez de valider votre inscription à NOM_SITE.

Merci et à bientôt !

", + mailThankGodfatherSubject: "Merci !", + mailThankGodfatherBodyTxt: "Bonjour USER_NAME,\nGrâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nMerci et à bientôt !", + mailThankGodfatherBodyHTML: "

Bonjour USER_NAME,

Grâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.

Merci et à bientôt !

", + badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.", + emailNotFound: "Aucun utilisateur trouvé pour cette adresse e-mail.", + alreadyConnected: "Vous êtes déjà connecté(e) au site !", + needBeConnected: "Vous devez être connecté(e) pour accéder à cette page.", + connectionOk: "Connexion réussie.", + needChooseLoginWay: "Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.", + needValidationToLogin: "Vous devez d'abord valider votre compte avant de vous connecter. Pour ce faire, un lien vient de vous être envoyé par e-mail.", + tooManyLoginFails: "Trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.", + badPassword: "Le mot de passe n'est pas le bon.", + mailLoginLinkSubject: "Votre lien de connexion.", + mailLoginLinkBodyTxt: "Bonjour USER_NAME,\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : LINK_URL", + mailLoginLinkBodyHTML: "

Bonjour USER_NAME,

Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :

Valider.

", + mailLoginLinkMessage: "Un lien de connexion vient de vous être envoyé sur votre adresse e-mail. Ne tardez pas à l'utiliser, car il n'est valable que durant ", + updatedOkMessage: "Vos informations ont bien été mises à jour.", + updatedNeedGoodEmail: "Mais la nouvelle adresse e-mail n'a pu être enregistrée car elle n'a pas une format correct.", + updatedNeedUniqueEmail: "Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.", + mailUpdateLoginSubject: "Merci de valider vos nouveaux identifiants.", + mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL", + mailUpdateLoginBodyHTML: "

Bonjour USER_NAME,

Pour valider vos nouveaux identifiants de connexion, cliquez ici sans tarder.

", + mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (email et/ou mot de passe) et vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement. En attendant, merci de continuer à utiliser vos anciens identifiants.", + updatedNeedValidatedUser: "L'utilisateur que vous souhaité modifier n'existe pas/plus ou n'a pas encore validé son compte.", + updatedNeedGoodGodfather: "Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.", + mailUpdateLoginOkMessage: "La mise à jour de vos identifiants a bien été enregistrée.", + updatedFailedGodfatherNotFound: "L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.", + creationOkMessage: "Le nouvel utilisateur a bien été enregistré.", + mailDeleteSubject: "Confirmer la suppression de votre compte.", + mailDeleteBodyTxt: "Bonjour USER_NAME,\nPour valider la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL", + mailDeleteBodyHTML: "

Bonjour USER_NAME,

Pour valider la suppression de votre compte, cliquez ici sans tarder.

", + mailDeleteLinkMessage: "Votre demande de suppression a bien été enregistrée. Merci de cliquer sans tarder sur le lien qui vient de vous être envoyé par e-mail pour confirmer.", + deleteOkMessage: "L'utilisateur a bien été supprimé.", + deleteFailMessage: "Tentative de suppression d'un utilisateur inexistant : ", + mailDeleteLinkOkMessage: "Votre compte a bien été supprimé. Merci d'avoir utilisé nos services.", + mailDeleteLinkAlreadyMessage: "Il semble que vous ayez déjà validé la suppression de votre compte.", + mailDeleteLinkFailMessage: "Votre lien de suppression n'est pas valide ou alors il n'est plus valable.", + cronDeleteUnvalidedUsersMessage: " comptes utilisateurs non validés ont été supprimés.", + deleteInactiveUsersMessage: " comptes utilisateurs inactifs ont été supprimés.", + welcomeMessage: "Bienvenue #NAME !", + byebyeMessage: "Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
À bientôt !", + infosUserForAdmin: "Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
Date de sa dernière connexion : DATE_CONNECTION.", + infosAdminGodfather: "Cet utilisateur a été parrainé par ", + infosAdminNbGodChilds: "Ses #NB filleuils : " +}; + +/***/ }), + +/***/ "../tools/main.js": +/*!************************!*\ + !*** ../tools/main.js ***! + \************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +// Quelques fonctions utiles pour les chaînes +var Tool = /*#__PURE__*/function () { + function Tool() { + _classCallCheck(this, Tool); + } + + _createClass(Tool, null, [{ + key: "isEmpty", + value: function isEmpty(myVar) { + if (myVar === undefined || myVar === null) return true;else { + myVar += ""; // si autre chose qu'une chaîne envoyé... + + myVar = myVar.trim(); + if (myVar === "") return true;else return false; + } + } + }, { + key: "trimIfNotNull", + value: function trimIfNotNull(myString) { + if (Tool.isEmpty(myString)) myString = null;else { + myString += ""; // si autre chose qu'une chaîne envoyé... + + myString = myString.trim(); + } + return myString; + } + }, { + key: "shortenIfLongerThan", + value: function shortenIfLongerThan(myString, max) { + myString += ""; // au cas où cela ne serait pas une chaîne... + + if (myString.length > max) myString = myString.substring(0, max - 3) + "..."; + return myString; + } // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings + + }, { + key: "replaceAll", + value: function replaceAll(myString, mapObj) { + var replaceElts = new RegExp(Object.keys(mapObj).join("|"), "gi"); + return myString.replace(replaceElts, function (matched) { + return mapObj[matched]; + }); + } // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random + + }, { + key: "getRandomInt", + value: function getRandomInt(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min)) + min; + } // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country + + }, { + key: "dateFormat", + value: function dateFormat(dateString) { + var lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "fr"; + if (Tool.isEmpty(dateString)) return ""; + var myDate = new Date(dateString); + var myDay = myDate.getDate() + ""; + if (myDay.length === 1) myDay = "0" + myDay; + var myMounth = myDate.getMonth() + 1 + ""; + if (myMounth.length === 1) myMounth = "0" + myMounth; + var myYear = myDate.getFullYear(); + if (lang === "fr") return myDay + "/" + myMounth + "/" + myYear;else if (lang === "form") // 2014-02-09 + return myYear + "-" + myMounth + "-" + myDay;else return myMounth + "/" + myDay + "/" + myYear; + } + }]); + + return Tool; +}(); + +module.exports = Tool; + +/***/ }), + +/***/ "../views sync recursive ^\\.\\/.*\\.js$": +/*!**********************************!*\ + !*** ../views sync ^\.\/.*\.js$ ***! + \**********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./default/config/fr.js": "../views/default/config/fr.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../views sync recursive ^\\.\\/.*\\.js$"; + +/***/ }), + +/***/ "../views/default/config/fr.js": +/*!*************************************!*\ + !*** ../views/default/config/fr.js ***! + \*************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + headLinks: [{ + anchor: "Accueil", + attributes: { + href: "/" + } + }, { + anchor: "Mon compte", + attributes: { + href: "/connexion.hmt", + id: "accountHeadLink" + } + }, { + anchor: "À propos", + attributes: { + href: "/a-propos.html" + } + }, { + anchor: "Contact", + attributes: { + href: "/contact.html" + } + }], + footLinks: [{ + anchor: "Crédits", + attributes: { + href: "/credits.html" + } + }, { + anchor: "Mentions légales", + attributes: { + href: "/mentions-legales.html", + rel: "nofollow" + } + }, { + anchor: "Données personnelles", + attributes: { + href: "/donnees.html" + } + }, { + anchor: "C.G.U.", + attributes: { + href: "/cgu.html", + rel: "nofollow" + } + }, { + anchor: "C.G.V.", + attributes: { + href: "/cgv.html", + rel: "nofollow" + } + }], + maxQuestionnairesByPage: 10, + userHomePage: "accueil.html", + adminHomePage: "admin.html", + managerHomePage: "gestion.html", + subscribePage: "inscription.html", + connectionPage: "connexion.html", + accountPage: "compte.html", + questionnairesManagementPage: "gestion-quizs.html", + usersManagementPage: "gestion-utilisateurs.html", + nbQuestionnairesUserHomePage: 10, + illustrationDir: "/img/quizs/", + siteSlogan: "Cultivons notre jardin !", + homeTitle1: "De nature curieuse ?", + homeP1: "Avec WikiLerni vous apprenez chaque jour de nouvelles choses.
Des articles de Wikipédia sont sélectionnés pour vous et sont suivis d'un quiz vous permettant de tester ce que vous en avez retenu.
De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre \"jardin\".", + homeTitle2: "La culture en liberté", + homeP2: "Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.

(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.", + newQuestionnairesTitle: "Les derniers quizs publiés sur WikiLerni", + newQuestionnairesIntro: "Liste des derniers quizs publiés sur WikiLerni.", + explanationTitle: "Vous découvrez WikiLerni ?", + explanationTxt: "Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.

Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.

Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)

Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.

Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.", + noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript." +}; + +/***/ }), + +/***/ "./src/connection.js": +/*!***************************!*\ + !*** ./src/connection.js ***! + \***************************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ "../config/instance.js"); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../config/users.js */ "../config/users.js"); +/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js"); +/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js"); +/* harmony import */ var _tools_forms_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./tools/forms.js */ "./src/tools/forms.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./tools/users.js */ "./src/tools/users.js"); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + +// -- GESTION DU FORMULAIRE PERMETTANT DE SE CONNECTER +/// L'utilisateur peut avoir répondu à un quiz avant d'arriver sur la page de connexion +/// Dans ce cas il faut enregistrer son résultat en même temps, une fois la connexion validée +/// Le connexion peut se faire directement ici via la saisie d'un mot de passe +/// Ou via l'envoi d'un token par e-mail +// Fichier de configuration tirés du backend : + +var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0]; + + +var configTemplate = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); // Importation des fonctions utile au script : + + + + + + + + // Dictionnaires : + +var txt = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + lang + "/general"); + +var txtUsers = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/user$")("./" + lang + "/user"); // Principaux éléments du DOM manipulés : + + +var myForm = document.getElementById("connection"); +var divMessage = document.getElementById("message"); +var divResponse = document.getElementById("response"); +Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_4__["helloDev"])(); // Test de connexion de l'utilisateur + affichage formulaire d'inscription. + +var initialise = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + var isConnected, user, homePage; + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _context.prev = 0; + _context.next = 3; + return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_7__["checkSession"])(); + + case 3: + isConnected = _context.sent; + + if (isConnected) { + Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("message", { + message: txtUsers.alreadyConnected, + color: "information" + }); // pour l'afficher sur la page suivante + + user = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("user", true); + homePage = user.status + "HomePage"; + window.location.assign("/" + configTemplate[homePage]); + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", txtUsers.alreadyConnected, "", ["information"]); // au cas où blocage redirection + } else { + myForm.style.display = "block"; + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_6__["isEmpty"])(Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("message"))) { + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divMessage, "p", Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("message", true).message, "", [Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("message", true).color]); + ; + Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("message"); + } + } + + _context.next = 10; + break; + + case 7: + _context.prev = 7; + _context.t0 = _context["catch"](0); + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]); + + case 10: + case "end": + return _context.stop(); + } + } + }, _callee, null, [[0, 7]]); + })); + + return function initialise() { + return _ref.apply(this, arguments); + }; +}(); + +initialise(); // Traitement de l'envoi des données de connexion : + +myForm.addEventListener("submit", function (e) { + try { + e.preventDefault(); + divResponse.innerHTML = ""; // efface d'éventuels messages déj à affichés + + var datas = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_5__["getDatasFromInputs"])(myForm); + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_6__["isEmpty"])(datas.password) && Object(_tools_main__WEBPACK_IMPORTED_MODULE_6__["isEmpty"])(datas.getLoginLink)) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", txtUsers.needChooseLoginWay, "", ["error"]);else { + var xhr = new XMLHttpRequest(); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_6__["isEmpty"])(datas.getLoginLink)) xhr.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["userRoutes"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["getLoginLinkRoute"]);else xhr.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["userRoutes"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["connectionRoute"]); + + xhr.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var response = JSON.parse(this.responseText); + + if (this.status === 200) { + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_6__["isEmpty"])(response.message)) { + // cas d'une demande de lien de connexion + myForm.style.display = "none"; + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", response.message, "", ["success"]); + } else if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_6__["isEmpty"])(response.userId) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_6__["isEmpty"])(response.connexionTime) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_6__["isEmpty"])(response.token)) { + // cas d'une connexion directe, on créé une session de connexion et redirige l'utilisateur + var connexionMaxTime = Date.now(); + if (response.connexionTime.endsWith("days")) connexionMaxTime += parseInt(response.connexionTime, 10) * 24 * 3600 * 1000;else connexionMaxTime += parseInt(response.connexionTime, 10) * 3600 * 1000; + Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_7__["setSession"])(response.userId, response.token, connexionMaxTime); + Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("lastAnswer"); // ! important pour ne pas enregister plusieurs fois le résultat + + myForm.style.display = "none"; + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", txtUsers.connectionOk, "", ["success"]); // au cas où blocage redirection + // l'utilisateur peut avoir tenté d'accéder à une autre page que sa page d'acceuil : + + var url = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("url", true); + console.log(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__["siteUrl"]); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_6__["isEmpty"])(url) && url.href.indexOf(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__["siteUrl"]) !== -1) { + url = url.href; + Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("url"); + } else url = configTemplate[response.status + "HomePage"]; + + console.log(url); + window.location.assign(url); + } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]); + } else if (response.errors) { + if (Array.isArray(response.errors)) response.errors = response.errors.join("
");else response.errors = txt.serverError; + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", response.errors, "", ["error"]); + } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]); + } + }; + + xhr.setRequestHeader("Content-Type", "application/json"); + + if (datas) { + datas.timeDifference = Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_7__["getTimeDifference"])(); // si l'utilisateur a précédement répondu à un quiz, j'ajoute les infos de son résultat : + + datas = Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_7__["checkAnswerDatas"])(datas); + xhr.send(JSON.stringify(datas)); + } + } + } catch (e) { + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]); + } +}); + +/***/ }), + +/***/ "./src/tools/clientstorage.js": +/*!************************************!*\ + !*** ./src/tools/clientstorage.js ***! + \************************************/ +/*! exports provided: saveLocaly, getLocaly, removeLocaly */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveLocaly", function() { return saveLocaly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaly", function() { return getLocaly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeLocaly", function() { return removeLocaly; }); +// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.) +// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie +var saveLocaly = function saveLocaly(name, data) { + localStorage.setItem(name, JSON.stringify(data)); +}; +var getLocaly = function getLocaly(name) { + var json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name); +}; +var removeLocaly = function removeLocaly(name) { + localStorage.removeItem(name); +}; + +/***/ }), + +/***/ "./src/tools/dom.js": +/*!**************************!*\ + !*** ./src/tools/dom.js ***! + \**************************/ +/*! exports provided: addElement */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addElement", function() { return addElement; }); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__); +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + + // Fonction associant les attributs fournis à un champ de formulaire + +var addElement = function addElement(eltParent, eltType) { + var eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; + var eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; + var eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : []; + var eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; + var replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true; + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltType) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltParent)) return false;else { + var newElement = document.createElement(eltType); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ? + newElement.id = eltId; + + if (Array.isArray(eltClass) && eltClass.length != 0) { + for (var i in eltClass) { + newElement.classList.add(eltClass[i]); + } + } + + if (_typeof(eltAttributes) === "object") // !! tous les objets ne sont pas ok + { + for (var attributName in eltAttributes) { + newElement.setAttribute(attributName, eltAttributes[attributName]); + } + } + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltContent)) newElement.innerHTML = eltContent.replace(/\n/g, "
"); // innerHTML permet d'ajouter du texte ayant lui-même des balises, etc. + + if (replace) eltParent.innerHTML = ""; + eltParent.appendChild(newElement); + } +}; + +/***/ }), + +/***/ "./src/tools/everywhere.js": +/*!*********************************!*\ + !*** ./src/tools/everywhere.js ***! + \*********************************/ +/*! exports provided: helloDev, updateAccountLink */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "helloDev", function() { return helloDev; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateAccountLink", function() { return updateAccountLink; }); +// Ce script fournit des fonctions utilisées sur toutes les pages du site +var helloDev = function helloDev() { + console.log("**** Hello ami développeur :-)\n Le code de WikiLerni est libre et est lisible sur gitlab : \n Bonne lecture :-) \n Pour les suggestions d'amélioration ou questions : dev@wililerni.com ****"); + return true; +}; +var updateAccountLink = function updateAccountLink(status, configTemplate) { + var link = document.getElementById("accountHeadLink"); + var homePage = status + "HomePage"; + link.href = "/" + configTemplate[homePage]; +}; + +/***/ }), + +/***/ "./src/tools/forms.js": +/*!****************************!*\ + !*** ./src/tools/forms.js ***! + \****************************/ +/*! exports provided: setAttributesToInputs, getDatasFromInputs, empyForm, empyAndHideForm */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setAttributesToInputs", function() { return setAttributesToInputs; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDatasFromInputs", function() { return getDatasFromInputs; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empyForm", function() { return empyForm; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empyAndHideForm", function() { return empyAndHideForm; }); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__); +function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + + // Fonction associant les attributs fournis à un champ de formulaire + +var setAttributesToInputs = function setAttributesToInputs(inputsConf, myForm) { + for (var i in myForm.elements) { + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(myForm.elements[i].id)) { + var idInput = myForm.elements[i].id; + + if (inputsConf[idInput] !== undefined) { + var inputHTML = document.getElementById(idInput); + + for (var attribute in inputsConf[idInput]) { + inputHTML.setAttribute(attribute, inputsConf[idInput][attribute]); + } + } + } + } + + return true; +}; // Récupère toutes les valeurs de champs en omettant les checkbox non cochées, etc. + +var getDatasFromInputs = function getDatasFromInputs(myForm) { + var datas = {}; + var formData = new FormData(myForm); + + var _iterator = _createForOfIteratorHelper(formData.entries()), + _step; + + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var entrie = _step.value; + datas[entrie[0]] = entrie[1]; + } + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); + } + + return datas; +}; // Vide tous les champs d'un formulaire, y compris hidden, checkbox, etc. +// Revoir pour les select + +var empyForm = function empyForm(myForm) { + var formData = new FormData(myForm); + + var _iterator2 = _createForOfIteratorHelper(formData.entries()), + _step2; + + try { + for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { + var entrie = _step2.value; + if (myForm.elements[entrie[0]].type == "checkbox" || myForm.elements[entrie[0]].type == "radio") myForm.elements[entrie[0]].checked = false;else myForm.elements[entrie[0]].value = ""; + } + } catch (err) { + _iterator2.e(err); + } finally { + _iterator2.f(); + } + + return true; +}; // Vide et cache le formulaire + +var empyAndHideForm = function empyAndHideForm(myForm) { + empyForm(myForm); + myForm.style.display = "none"; +}; + +/***/ }), + +/***/ "./src/tools/users.js": +/*!****************************!*\ + !*** ./src/tools/users.js ***! + \****************************/ +/*! exports provided: getConfig, getTimeDifference, getPassword, setSession, checkAnswerDatas, checkSession */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getConfig", function() { return getConfig; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTimeDifference", function() { return getTimeDifference; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getPassword", function() { return getPassword; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setSession", function() { return setSession; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkAnswerDatas", function() { return checkAnswerDatas; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkSession", function() { return checkSession; }); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/instance.js */ "../config/instance.js"); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../config/users.js */ "../config/users.js"); +/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_3__); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + + +var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0]; + +var configTemplate = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); + + + + // Récupère les données de configuration des utilisateurs +// À terme, un fichier statique importable comme module devrait éviter une requête ajax + +var getConfig = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + return _context.abrupt("return", new Promise(function (resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + "/user/getconfig"); + + xhr.onload = function () { + return resolve(JSON.parse(xhr.responseText)); + }; + + xhr.onerror = function () { + return reject(xhr.statusText); + }; + + xhr.send(); + })); + + case 1: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + + return function getConfig() { + return _ref.apply(this, arguments); + }; +}(); +var getTimeDifference = function getTimeDifference() { + var timeLocal = new Date().getTimezoneOffset(); + if (timeLocal > _config_users_js__WEBPACK_IMPORTED_MODULE_1__["timeDifferenceMax"] || timeLocal < _config_users_js__WEBPACK_IMPORTED_MODULE_1__["timeDifferenceMin"]) return 0;else return timeLocal; +}; // On enlève volontairement les 0/O pour éviter les confusions ! +// Et mieux vaut aussi débuter et finir par une lettre simple. + +var getPassword = function getPassword(nbCarMin, nbCarMax) { + var nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin)); + var letters = "ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz"; + var others = "123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ"; + var password = letters[Math.floor(Math.random() * letters.length)]; + + for (var i = 1; i < nbCar - 1; i++) { + if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)]; + } + + password += letters[Math.floor(Math.random() * letters.length)]; + return password; +}; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite +// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides. + +var setSession = function setSession(userId, token, durationTS) { + var storageUser = { + id: userId, + token: token, + duration: durationTS + }; + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("user", storageUser); +}; // Vérifie qu'il y a des données locales concernant le résultat d'un quiz +// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas + +var checkAnswerDatas = function checkAnswerDatas(datas) { + var lastAnswer = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("lastAnswer"); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(lastAnswer)) { + var answer = JSON.parse(lastAnswer); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.duration) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbCorrectAnswers) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.QuestionnaireId) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbQuestions)) { + datas.duration = answer.duration; + datas.nbCorrectAnswers = answer.nbCorrectAnswers; + datas.QuestionnaireId = answer.QuestionnaireId; + datas.nbQuestions = answer.nbQuestions; + } + } + + return datas; +}; // Cette fonction teste la connexion de l'utilisateur d'une page +// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté + +var checkSession = /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() { + var status, + urlRedirection, + message, + urlWanted, + _args2 = arguments; + return regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + status = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : []; + urlRedirection = _args2.length > 1 ? _args2[1] : undefined; + message = _args2.length > 2 ? _args2[2] : undefined; + urlWanted = _args2.length > 3 ? _args2[3] : undefined; + return _context2.abrupt("return", new Promise(function (resolve, reject) { + var userDatas = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("user"); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(userDatas)) { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else { + var user = JSON.parse(userDatas); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.id) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.token) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.duration) || user.duration < Date.now()) { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else { + var xhr = new XMLHttpRequest(); + xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["userRoutes"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["checkLoginRoute"] + user.token); + + xhr.onload = function () { + var response = JSON.parse(xhr.responseText); + + if (xhr.status === 200 && response.isValid && response.id != undefined) { + if (response.id === user.id) { + user.name = response.name; + user.language = response.language; + user.timeDifference = response.timeDifference; + user.status = response.status; // le token et de toute façon vérifier à chaque requête à l'API + + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("user", user); // si il s'agit d'un "user" et que son abonnement a expiré, je le redirige vers la caisse :-) + + if (response.status === "user" && response.nbDaysOk <= 0) { + var urlAccount = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["siteUrl"] + "/" + configTemplate[lang].accountPage; + if (window.location.href.indexOf(urlAccount) === -1) window.location.assign("/" + configTemplate[lang].accountPage); // passée directement ici, l'ancre #subscribe ne fonctionne pas !? + + resolve(true); + } else { + if (status.length !== 0 && status.indexOf(response.status) === -1) { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else resolve(true); + } + } else { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + } else { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + }; + + xhr.onerror = function () { + return reject(xhr.statusText); + }; + + xhr.send(); + } + } + })); + + case 5: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + + return function checkSession() { + return _ref2.apply(this, arguments); + }; +}(); // Cette fonction sert à la précédente en cas de connexion non valide + +var redirectUser = function redirectUser(urlRedirection, message, urlWanted) { + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(message)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("message", message); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlWanted)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("url", urlWanted); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlRedirection)) window.location.assign(urlRedirection); +}; + +/***/ }) + +/******/ }); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9nZW5lcmFsJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3VzZXIkIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL2dlbmVyYWwuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcvZnIvdXNlci5qcyIsIndlYnBhY2s6Ly8vLi4vdG9vbHMvbWFpbi5qcyIsIndlYnBhY2s6Ly8vLi4vdmlld3Mgc3luYyBeXFwuXFwvLipcXC5qcyQiLCJ3ZWJwYWNrOi8vLy4uL3ZpZXdzL2RlZmF1bHQvY29uZmlnL2ZyLmpzIiwid2VicGFjazovLy8uL3NyYy9jb25uZWN0aW9uLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy9jbGllbnRzdG9yYWdlLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy9kb20uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2V2ZXJ5d2hlcmUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2Zvcm1zLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy91c2Vycy5qcyJdLCJuYW1lcyI6WyJ1c2VycyIsInJlcXVpcmUiLCJxdWVzdGlvbm5haXJlcyIsIm1vZHVsZSIsImV4cG9ydHMiLCJhcGlVcmwiLCJzaXRlVXJsIiwiYWRtaW5OYW1lIiwiYWRtaW5FbWFpbCIsInNlbmRlck5hbWUiLCJzZW5kZXJFbWFpbCIsImFkbWluTGFuZyIsInRoZW1lIiwiYXZhaWxhYmxlTGFuZ3MiLCJzaXRlTmFtZSIsImJlZ2luQ29kZUdvZGZhdGhlciIsImNyb25UaW1pbmdBbGVydEluU2Vjb25kZSIsInJlc3BvbnNlVGltaW5nQWxlcnRJblNlY29uZGUiLCJ0b2tlblNpZ251cFZhbGlkYXRpb25UaW1lSW5Ib3VycyIsInRva2VuTG9naW5MaW5rVGltZUluSG91cnMiLCJ0b2tlbkNvbm5leGlvbk1pblRpbWVJbkhvdXJzIiwidG9rZW5Db25uZXhpb25NYXhUaW1lSW5EYXlzIiwidG9rZW5Mb2dpbkNoYW5naW5nVGltZUluSG91cnMiLCJ0b2tlbkRlbGV0ZVVzZXJUaW1lSW5Ib3VycyIsInRva2VuVW5zdWJzY3JpYmVMaW5rVGltZUluRGF5cyIsImZyZWVBY2NvdW50VGltaW5nSW5EYXlzIiwiZnJlZUFjY291bnRFeHBpcmF0aW9uTm90aWZpY2F0aW9uSW5EYXlzIiwiYWNjb3VudEV4cGlyYXRpb25GaXJzdE5vdGlmaWNhdGlvbkluRGF5cyIsImFjY291bnRFeHBpcmF0aW9uU2Vjb25kTm90aWZpY2F0aW9uSW5EYXlzIiwiaW5hY3RpdmVBY2NvdW50VGltZVRvRGVsZXRlSW5EYXlzIiwibmJRdWVzdGlvbnNNaW4iLCJuYlF1ZXN0aW9uc01heCIsIm5iQ2hvaWNlc01heCIsIm5iTmV3UXVlc3Rpb25uYWlyZXMiLCJob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVCZWdpbiIsImhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUVuZCIsIm51bWJlck5ld1F1ZXN0aW9ubmFpcmVBdFNhbWVUaW1lIiwibWluU2VhcmNoUXVlc3Rpb25uYWlyZXMiLCJuYklsbHVzdHJhdGlvbnNNaW4iLCJuYklsbHVzdHJhdGlvbnNNYXgiLCJtYXhJbGx1c3RyYXRpb25TaXplaW5PY3RldCIsIm1pbWVUeXBlc0ZvcklsbHVzdHJhdGlvbiIsImlsbHVzdHJhdGlvbnNXaWR0aE1heEluUHgiLCJpbGx1c3RyYXRpb25zTWluaWF0dXJlc1dpZHRoTWF4SW5QeCIsIm5iTGlua3NNaW4iLCJuYkxpbmtzTWF4IiwicGFzc3dvcmQiLCJtaW5sZW5ndGgiLCJkaXJDYWNoZVVzZXJzIiwiZGlyQ2FjaGVVc2Vyc0Fuc3dlcnMiLCJkaXJDYWNoZVF1ZXN0aW9ubmFpcmVzIiwiZGlyQ2FjaGVRdWVzdGlvbnMiLCJkaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXMiLCJkaXJIVE1MUXVlc3Rpb25uYWlyZSIsImRpcldlYlF1ZXN0aW9ubmFpcmUiLCJxdWVzdGlvbm5haXJlUm91dGVzIiwiZ2V0UXVlc3Rpb25uYWlyZVJvdXRlcyIsInByZXZpZXdRdWVzdGlvbm5haXJlUm91dGVzIiwicHVibGlzaGVkUXVlc3Rpb25uYWlyZVJvdXRlcyIsInNhdmVBbnN3ZXJzUm91dGUiLCJnZXRTdGF0c1F1ZXN0aW9ubmFpcmVzIiwic2VhcmNoUXVlc3Rpb25uYWlyZXNSb3V0ZSIsInNlYXJjaEFkbWluUXVlc3Rpb25uYWlyZXNSb3V0ZSIsImdldExpc3ROZXh0UXVlc3Rpb25uYWlyZXMiLCJxdWVzdGlvbnNSb3V0ZSIsInRhZ3NTZWFyY2hSb3V0ZSIsImdldFF1ZXN0aW9ubmFpcmVzV2l0aG91dEFuc3dlciIsImdldFByZXZpb3VzQW5zd2VycyIsImdldFN0YXRzQW5zd2VycyIsImdldEFkbWluU3RhdHMiLCJRdWVzdGlvbm5haXJlIiwidGl0bGUiLCJtYXhsZW5ndGgiLCJyZXF1aXJlZCIsInNsdWciLCJpbnRyb2R1Y3Rpb24iLCJzZWFyY2hRdWVzdGlvbm5haXJlcyIsIlF1ZXN0aW9uIiwidGV4dCIsInJhbmsiLCJtaW4iLCJkZWZhdWx0VmFsdWUiLCJDaG9pY2UiLCJuYlRhZ3NNaW4iLCJuYlRhZ3NNYXgiLCJkaXJDYWNoZVRhZ3MiLCJkaXJIVE1MVGFncyIsImRpcldlYlRhZ3MiLCJ1c2VyUm91dGVzIiwic3Vic2NyaWJlUm91dGUiLCJnZXRHb2RmYXRoZXJSb3V0ZSIsImNoZWNrSWZJc0VtYWlsZnJlZVJvdXRlIiwiY2hlY2tTdWJzY3JpYmVUb2tlblJvdXRlIiwiY2hlY2tMb2dpblJvdXRlIiwiY29ubmVjdGlvblJvdXRlIiwiZ2V0TG9naW5MaW5rUm91dGUiLCJjb25uZWN0aW9uV2l0aExpbmtSb3V0ZSIsImdldFVzZXJJbmZvcyIsImNyZWF0ZVVzZXJSb3V0ZSIsInZhbGlkYXRlVXNlclJvdXRlIiwidXBkYXRlVXNlckluZm9zIiwic2VhcmNoVXNlclJvdXRlIiwiZ2V0R29kQ2hpbGRzIiwiY2hlY2tOZXdMb2dpbkxpbmtSb3V0ZSIsImNoZWNrRGVsZXRlTGlua1JvdXRlIiwiZ2V0UGF5bWVudHMiLCJ1bnN1YnNjcmliZVJvdXRlIiwibmFtZSIsImVtYWlsIiwibmV3UGFzc3dvcmQiLCJjb2RlR29kZmF0aGVyIiwiY2d1T2siLCJ2YWx1ZSIsInRpbWVEaWZmZXJlbmNlTWluIiwidGltZURpZmZlcmVuY2VNYXgiLCJzaXRlSFRNTFRpdGxlIiwic2l0ZU1ldGFEZXNjcmlwdGlvbiIsInNjcmlwdFRpbWluZ0luZm8iLCJzY3JpcHRUaW1pbmdBbGVydCIsInNlcnZlckVycm9yIiwic2VydmVyRXJyb3JBZG1pbiIsIm5lZWRlZFBhcmFtcyIsImJhZFVybCIsIm5vdFZhbGlkRm9ybWF0Iiwibm90QWxsb3dlZCIsIm5vdFJlcXVpcmVkIiwidXBkYXRlQnRuVHh0IiwiYWRkQnRuVHh0IiwiZGVsZXRlQnRuVHh0IiwiYWRkT2tNZXNzYWdlIiwidXBkYXRlT2tNZXNzYWdlIiwiZGVsZXRlT2tNZXNzYWdlIiwiZmFpbEF1dGgiLCJmYWlsQXV0aEhlYWRlciIsImZhaWxBdXRoVG9rZW4iLCJmYWlsQXV0aElkIiwiZmFpbEF1dGhDcm9uIiwicHJldmlvdXNQYWdlIiwibmV4dFBhZ2UiLCJidG5MaW5rVG9RdWVzdGlvbm5haXJlIiwic3RhdHNBZG1pbiIsIm5vdEZvdW5kIiwibmVlZE5hbWUiLCJuZWVkTm90VG9vTG9uZ05hbWUiLCJuZWVkRW1haWwiLCJuZWVkVW5pcXVlRW1haWwiLCJuZWVkTm90VG9vTG9uZ0VtYWlsIiwibmVlZFBhc3NXb3JkIiwibmVlZExvbmdQYXNzV29yZCIsInBhc3N3b3JkQ29waWVkIiwibmVlZFN0YXR1cyIsIm5lZWRMYW5ndWFnZSIsIm5lZWRWYWxpZExhc3RDb25uZWN0aW9uRGF0ZSIsIm5lZWRTTVRQIiwibmVlZFNNVFBOb3RGb3VuZCIsIm5lZWRLbm93TmV3c2xldHRlck9rIiwibmVlZFRpbWVEaWZmZXJlbmNlIiwibmVlZE1pblRpbWVEaWZmZXJlbmNlIiwibmVlZE1heFRpbWVEaWZmZXJlbmNlIiwibmVlZFVHQ09rIiwiZ29kZmF0aGVyTm90Rm91bmQiLCJnb2RmYXRoZXJGb3VuZCIsIm1haWxWYWxpZGF0aW9uTWVzc2FnZSIsIm1haWxWYWxpZGF0aW9uTGlua1N1YmplY3QiLCJtYWlsVmFsaWRhdGlvbkxpbmtTQm9keVR4dCIsIm1haWxWYWxpZGF0aW9uTGlua1NCb2R5SFRNTCIsInZhbGlkYXRpb25NZXNzYWdlIiwidmFsaWRhdGlvbk1lc3NhZ2VBZG1pbiIsInZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZSIsInZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZUFkbWluIiwibWFpbFdlbGNvbWVTdWJqZWN0IiwibWFpbFdlbGNvbWVCb2R5VHh0IiwibWFpbFdlbGNvbWVCb2R5SFRNTCIsIm1haWxUaGFua0dvZGZhdGhlclN1YmplY3QiLCJtYWlsVGhhbmtHb2RmYXRoZXJCb2R5VHh0IiwibWFpbFRoYW5rR29kZmF0aGVyQm9keUhUTUwiLCJiYWRMaW5rVmFsaWRhdGlvbk1lc3NhZ2UiLCJlbWFpbE5vdEZvdW5kIiwiYWxyZWFkeUNvbm5lY3RlZCIsIm5lZWRCZUNvbm5lY3RlZCIsImNvbm5lY3Rpb25PayIsIm5lZWRDaG9vc2VMb2dpbldheSIsIm5lZWRWYWxpZGF0aW9uVG9Mb2dpbiIsInRvb01hbnlMb2dpbkZhaWxzIiwiYmFkUGFzc3dvcmQiLCJtYWlsTG9naW5MaW5rU3ViamVjdCIsIm1haWxMb2dpbkxpbmtCb2R5VHh0IiwibWFpbExvZ2luTGlua0JvZHlIVE1MIiwibWFpbExvZ2luTGlua01lc3NhZ2UiLCJ1cGRhdGVkT2tNZXNzYWdlIiwidXBkYXRlZE5lZWRHb29kRW1haWwiLCJ1cGRhdGVkTmVlZFVuaXF1ZUVtYWlsIiwibWFpbFVwZGF0ZUxvZ2luU3ViamVjdCIsIm1haWxVcGRhdGVMb2dpbkJvZHlUeHQiLCJtYWlsVXBkYXRlTG9naW5Cb2R5SFRNTCIsIm1haWxVcGRhdGVMb2dpbkxpbmtNZXNzYWdlIiwidXBkYXRlZE5lZWRWYWxpZGF0ZWRVc2VyIiwidXBkYXRlZE5lZWRHb29kR29kZmF0aGVyIiwibWFpbFVwZGF0ZUxvZ2luT2tNZXNzYWdlIiwidXBkYXRlZEZhaWxlZEdvZGZhdGhlck5vdEZvdW5kIiwiY3JlYXRpb25Pa01lc3NhZ2UiLCJtYWlsRGVsZXRlU3ViamVjdCIsIm1haWxEZWxldGVCb2R5VHh0IiwibWFpbERlbGV0ZUJvZHlIVE1MIiwibWFpbERlbGV0ZUxpbmtNZXNzYWdlIiwiZGVsZXRlRmFpbE1lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua09rTWVzc2FnZSIsIm1haWxEZWxldGVMaW5rQWxyZWFkeU1lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua0ZhaWxNZXNzYWdlIiwiY3JvbkRlbGV0ZVVudmFsaWRlZFVzZXJzTWVzc2FnZSIsImRlbGV0ZUluYWN0aXZlVXNlcnNNZXNzYWdlIiwid2VsY29tZU1lc3NhZ2UiLCJieWVieWVNZXNzYWdlIiwiaW5mb3NVc2VyRm9yQWRtaW4iLCJpbmZvc0FkbWluR29kZmF0aGVyIiwiaW5mb3NBZG1pbk5iR29kQ2hpbGRzIiwiVG9vbCIsIm15VmFyIiwidW5kZWZpbmVkIiwidHJpbSIsIm15U3RyaW5nIiwiaXNFbXB0eSIsIm1heCIsImxlbmd0aCIsInN1YnN0cmluZyIsIm1hcE9iaiIsInJlcGxhY2VFbHRzIiwiUmVnRXhwIiwiT2JqZWN0Iiwia2V5cyIsImpvaW4iLCJyZXBsYWNlIiwibWF0Y2hlZCIsIk1hdGgiLCJjZWlsIiwiZmxvb3IiLCJyYW5kb20iLCJkYXRlU3RyaW5nIiwibGFuZyIsIm15RGF0ZSIsIkRhdGUiLCJteURheSIsImdldERhdGUiLCJteU1vdW50aCIsImdldE1vbnRoIiwibXlZZWFyIiwiZ2V0RnVsbFllYXIiLCJoZWFkTGlua3MiLCJhbmNob3IiLCJhdHRyaWJ1dGVzIiwiaHJlZiIsImlkIiwiZm9vdExpbmtzIiwicmVsIiwibWF4UXVlc3Rpb25uYWlyZXNCeVBhZ2UiLCJ1c2VySG9tZVBhZ2UiLCJhZG1pbkhvbWVQYWdlIiwibWFuYWdlckhvbWVQYWdlIiwic3Vic2NyaWJlUGFnZSIsImNvbm5lY3Rpb25QYWdlIiwiYWNjb3VudFBhZ2UiLCJxdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlIiwidXNlcnNNYW5hZ2VtZW50UGFnZSIsIm5iUXVlc3Rpb25uYWlyZXNVc2VySG9tZVBhZ2UiLCJpbGx1c3RyYXRpb25EaXIiLCJzaXRlU2xvZ2FuIiwiaG9tZVRpdGxlMSIsImhvbWVQMSIsImhvbWVUaXRsZTIiLCJob21lUDIiLCJuZXdRdWVzdGlvbm5haXJlc1RpdGxlIiwibmV3UXVlc3Rpb25uYWlyZXNJbnRybyIsImV4cGxhbmF0aW9uVGl0bGUiLCJleHBsYW5hdGlvblR4dCIsIm5vSlNOb3RpZmljYXRpb24iLCJjb25maWdUZW1wbGF0ZSIsInR4dCIsInR4dFVzZXJzIiwibXlGb3JtIiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImRpdk1lc3NhZ2UiLCJkaXZSZXNwb25zZSIsImhlbGxvRGV2IiwiaW5pdGlhbGlzZSIsImNoZWNrU2Vzc2lvbiIsImlzQ29ubmVjdGVkIiwic2F2ZUxvY2FseSIsIm1lc3NhZ2UiLCJjb2xvciIsInVzZXIiLCJnZXRMb2NhbHkiLCJob21lUGFnZSIsInN0YXR1cyIsIndpbmRvdyIsImxvY2F0aW9uIiwiYXNzaWduIiwiYWRkRWxlbWVudCIsInN0eWxlIiwiZGlzcGxheSIsInJlbW92ZUxvY2FseSIsImFkZEV2ZW50TGlzdGVuZXIiLCJlIiwicHJldmVudERlZmF1bHQiLCJpbm5lckhUTUwiLCJkYXRhcyIsImdldERhdGFzRnJvbUlucHV0cyIsImdldExvZ2luTGluayIsInhociIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsIm9ucmVhZHlzdGF0ZWNoYW5nZSIsInJlYWR5U3RhdGUiLCJET05FIiwicmVzcG9uc2UiLCJKU09OIiwicGFyc2UiLCJyZXNwb25zZVRleHQiLCJ1c2VySWQiLCJjb25uZXhpb25UaW1lIiwidG9rZW4iLCJjb25uZXhpb25NYXhUaW1lIiwibm93IiwiZW5kc1dpdGgiLCJwYXJzZUludCIsInNldFNlc3Npb24iLCJ1cmwiLCJjb25zb2xlIiwibG9nIiwiaW5kZXhPZiIsImVycm9ycyIsIkFycmF5IiwiaXNBcnJheSIsInNldFJlcXVlc3RIZWFkZXIiLCJ0aW1lRGlmZmVyZW5jZSIsImdldFRpbWVEaWZmZXJlbmNlIiwiY2hlY2tBbnN3ZXJEYXRhcyIsInNlbmQiLCJzdHJpbmdpZnkiLCJkYXRhIiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsImpzb24iLCJnZXRJdGVtIiwicmVtb3ZlSXRlbSIsImVsdFBhcmVudCIsImVsdFR5cGUiLCJlbHRDb250ZW50IiwiZWx0SWQiLCJlbHRDbGFzcyIsImVsdEF0dHJpYnV0ZXMiLCJuZXdFbGVtZW50IiwiY3JlYXRlRWxlbWVudCIsImkiLCJjbGFzc0xpc3QiLCJhZGQiLCJhdHRyaWJ1dE5hbWUiLCJzZXRBdHRyaWJ1dGUiLCJhcHBlbmRDaGlsZCIsInVwZGF0ZUFjY291bnRMaW5rIiwibGluayIsInNldEF0dHJpYnV0ZXNUb0lucHV0cyIsImlucHV0c0NvbmYiLCJlbGVtZW50cyIsImlkSW5wdXQiLCJpbnB1dEhUTUwiLCJhdHRyaWJ1dGUiLCJmb3JtRGF0YSIsIkZvcm1EYXRhIiwiZW50cmllcyIsImVudHJpZSIsImVtcHlGb3JtIiwidHlwZSIsImNoZWNrZWQiLCJlbXB5QW5kSGlkZUZvcm0iLCJnZXRDb25maWciLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIm9ubG9hZCIsIm9uZXJyb3IiLCJzdGF0dXNUZXh0IiwidGltZUxvY2FsIiwiZ2V0VGltZXpvbmVPZmZzZXQiLCJnZXRQYXNzd29yZCIsIm5iQ2FyTWluIiwibmJDYXJNYXgiLCJuYkNhciIsImxldHRlcnMiLCJvdGhlcnMiLCJkdXJhdGlvblRTIiwic3RvcmFnZVVzZXIiLCJkdXJhdGlvbiIsImxhc3RBbnN3ZXIiLCJhbnN3ZXIiLCJuYkNvcnJlY3RBbnN3ZXJzIiwiUXVlc3Rpb25uYWlyZUlkIiwibmJRdWVzdGlvbnMiLCJ1cmxSZWRpcmVjdGlvbiIsInVybFdhbnRlZCIsInVzZXJEYXRhcyIsInJlZGlyZWN0VXNlciIsImlzVmFsaWQiLCJsYW5ndWFnZSIsIm5iRGF5c09rIiwidXJsQWNjb3VudCJdLCJtYXBwaW5ncyI6IjtRQUFBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBOzs7UUFHQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMENBQTBDLGdDQUFnQztRQUMxRTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLHdEQUF3RCxrQkFBa0I7UUFDMUU7UUFDQSxpREFBaUQsY0FBYztRQUMvRDs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EseUNBQXlDLGlDQUFpQztRQUMxRSxnSEFBZ0gsbUJBQW1CLEVBQUU7UUFDckk7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwyQkFBMkIsMEJBQTBCLEVBQUU7UUFDdkQsaUNBQWlDLGVBQWU7UUFDaEQ7UUFDQTtRQUNBOztRQUVBO1FBQ0Esc0RBQXNELCtEQUErRDs7UUFFckg7UUFDQTs7O1FBR0E7UUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ2xGQSxJQUFNQSxLQUFLLEdBQUdDLG1CQUFPLENBQUMsbUNBQUQsQ0FBckI7O0FBQ0EsSUFBTUMsY0FBYyxHQUFHRCxtQkFBTyxDQUFDLHFEQUFELENBQTlCOztBQUVBRSxNQUFNLENBQUNDLE9BQVA7QUFFSUMsUUFBTSxFQUFFLDJCQUZaO0FBR0lDLFNBQU8sRUFBRSx1QkFIYjtBQUlJQyxXQUFTLEVBQUUsU0FKZjtBQUtJQyxZQUFVLEVBQUUsbUJBTGhCO0FBTUlDLFlBQVUsRUFBRSxXQU5oQjtBQU9JQyxhQUFXLEVBQUUsdUJBUGpCO0FBUUlDLFdBQVMsRUFBRSxJQVJmO0FBU0lDLE9BQUssRUFBRSxTQVRYO0FBU3NCO0FB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LEtBQUQsQ0FBUDtBQUNIO0FBQ0oscUJBbENELE1Bb0NBO0FBQ0k3RSw0RkFBWSxDQUFDLE1BQUQsQ0FBWjtBQUNBcUcsa0NBQVksQ0FBQ0gsY0FBRCxFQUFpQjlHLE9BQWpCLEVBQTBCK0csU0FBMUIsQ0FBWjtBQUNBdEIsNkJBQU8sQ0FBQyxLQUFELENBQVA7QUFDSDtBQUNKLG1CQTVDRDs7QUE2Q0FyRSxxQkFBRyxDQUFDd0UsT0FBSixHQUFjO0FBQUEsMkJBQU1GLE1BQU0sQ0FBQ3RFLEdBQUcsQ0FBQ3lFLFVBQUwsQ0FBWjtBQUFBLG1CQUFkOztBQUNBekUscUJBQUcsQ0FBQzZCLElBQUo7QUFDSDtBQUNKO0FBQ0osYUF0RU0sQ0FGaUI7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsR0FBSDs7QUFBQSxrQkFBWnBELFlBQVk7QUFBQTtBQUFBO0FBQUEsR0FBbEIsQyxDQTBFUDs7QUFDQSxJQUFNb0gsWUFBWSxHQUFHLFNBQWZBLFlBQWUsQ0FBQ0gsY0FBRCxFQUFpQjlHLE9BQWpCLEVBQTBCK0csU0FBMUIsRUFDckI7QUFDSSxNQUFHLENBQUNsTCwyREFBTyxDQUFDbUUsT0FBRCxDQUFYLEVBQ0lELG9FQUFVLENBQUMsU0FBRCxFQUFZQyxPQUFaLENBQVY7QUFDSixNQUFHLENBQUNuRSwyREFBTyxDQUFDa0wsU0FBRCxDQUFYLEVBQ0loSCxvRUFBVSxDQUFDLEtBQUQsRUFBUWdILFNBQVIsQ0FBVjtBQUNKLE1BQUcsQ0FBQ2xMLDJEQUFPLENBQUNpTCxjQUFELENBQVgsRUFDSXhHLE1BQU0sQ0FBQ0MsUUFBUCxDQUFnQkMsTUFBaEIsQ0FBdUJzRyxjQUF2QjtBQUNQLENBUkQsQyIsImZpbGUiOiIuL0pTL2Nvbm5lY3Rpb24uYXBwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvY29ubmVjdGlvbi5qc1wiKTtcbiIsImNvbnN0IHVzZXJzID0gcmVxdWlyZShcIi4vdXNlcnNcIik7XG5jb25zdCBxdWVzdGlvbm5haXJlcyA9IHJlcXVpcmUoXCIuL3F1ZXN0aW9ubmFpcmVzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgYXBpVXJsOiBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9hcGlcIixcbiAgICBzaXRlVXJsOiBcImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MFwiLFxuICAgIGFkbWluTmFtZTogXCJGYWJyaWNlXCIsXG4gICAgYWRtaW5FbWFpbDogXCJkZXZAd2lraWxlcm5pLmNvbVwiLFxuICAgIHNlbmRlck5hbWU6IFwiV2lraUxlcm5pXCIsXG4gICAgc2VuZGVyRW1haWw6IFwiYm9uam91ckB3aWtpbGVybmkuY29tXCIsXG4gICAgYWRtaW5MYW5nOiBcImZyXCIsXG4gICAgdGhlbWU6IFwiZGVmYXVsdFwiLCAvLyBsZSB0aMOobWUgdXRpbGlzw6kgKGRhbnMgL3ZpZXdzKSBwb3VyIGfDqW7DqXJlciBsZXMgcGFnZXMgSFRNTC4gQ29udGllbnQgc2VzIHByb3ByZXMgZmljaGllcnMgZGUgY29uZmlndXJhdGlvbi5cbiAgICBhdmFpbGFibGVMYW5nczogW1wiZnJcIl0sLy8gTGFuZ3VhZ2VzIGluIHdoaWNoIHRoZSBzaXRlIGlzIGF2YWlsYWJsZS4gVGhlIGZpcnN0IG9uZSBpcyB0aGUgZGVmYXVsdCBvbmUuXG4gICAgc2l0ZU5hbWU6IFwiV2lraUxlcm5pXCIsXG4gICAgYmVnaW5Db2RlR29kZmF0aGVyOiBcIndpa2lsZXJuaVwiLCAvLyBjYXNlLXNlbnNpdGl2ZSBhbmQgY2FuJ3QgY29udGFpbiBcIkBcIiAhXG4gICAgY3JvblRpbWluZ0FsZXJ0SW5TZWNvbmRlOiAxMjAsIC8vIGZvciBsb2dzXG4gICAgcmVzcG9uc2VUaW1pbmdBbGVydEluU2Vjb25kZTogMywgLy8gaWRlbVxuICAgIHRva2VuU2lnbnVwVmFsaWRhdGlvblRpbWVJbkhvdXJzOiBcIjQ4aFwiLCAvLyBodHRwczovL2dpdGh1Yi5jb20vemVpdC9tc1xuICAgIHRva2VuTG9naW5MaW5rVGltZUluSG91cnM6IFwiMWhcIixcbiAgICB0b2tlbkNvbm5leGlvbk1pblRpbWVJbkhvdXJzOiBcIjI0aFwiLFxuICAgIHRva2VuQ29ubmV4aW9uTWF4VGltZUluRGF5czogXCIxODAgZGF5c1wiLFxuICAgIHRva2VuTG9naW5DaGFuZ2luZ1RpbWVJbkhvdXJzOiBcIjFoXCIsLy8gZm9yIGVtYWlsICYgcGFzc3dvcmQgY2hhbmdpbmdcbiAgICB0b2tlbkRlbGV0ZVVzZXJUaW1lSW5Ib3VyczogXCIxaFwiLFxuICAgIHRva2VuVW5zdWJzY3JpYmVMaW5rVGltZUluRGF5czogXCI3IGRheXNcIiwgLy8gdG9rZW4gc2VuZCB3aXRoIHN1YnNjcmlwdGlvbidzIGVtYWlsc1xuICAgIGZyZWVBY2NvdW50VGltaW5nSW5EYXlzOiAxMCxcbiAgICBmcmVlQWNjb3VudEV4cGlyYXRpb25Ob3RpZmljYXRpb25JbkRheXM6IDUsXG4gICAgYWNjb3VudEV4cGlyYXRpb25GaXJzdE5vdGlmaWNhdGlvbkluRGF5czogMTQsICAgIFxuICAgIGFjY291bnRFeHBpcmF0aW9uU2Vjb25kTm90aWZpY2F0aW9uSW5EYXlzOiA1LFxuICAgIGluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5czogMTgwLFxuICAgIC8vIFF1ZXN0aW9ubmFpcmVzOlxuICAgIG5iUXVlc3Rpb25zTWluOiAxLCAvLyBtaW5pbXVtIG51bWJlciBvZiBxdWVzdGlvbnMgZm9yIHRoZSBxdWVzdGlvbm5haXJlIHRvIGJlIHB1Ymxpc2hhYmxlXG4gICAgbmJRdWVzdGlvbnNNYXg6IDEwLCAvLyBpZiAwID0gbm90IG1heGltdW1cbiAgICBuYkNob2ljZXNNYXg6IDEwLFxuICAgIG5iTmV3UXVlc3Rpb25uYWlyZXM6IDEwLC8vIGZvciBSU1MsIGV0Yy5cbiAgICBob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVCZWdpbjoxLCAvLyBpbiB1c2VyIGxvY2FsIHRpbWVcbiAgICBob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQ6MjQsIC8vIGlkZW1cbiAgICBudW1iZXJOZXdRdWVzdGlvbm5haXJlQXRTYW1lVGltZTogNTAsIC8vIGZvciBtYXNzIG1haWxpbmdcbiAgICBtaW5TZWFyY2hRdWVzdGlvbm5haXJlczogMyxcbiAgICAvLyBJbGx1c3RyYXRpb25zOlxuICAgIG5iSWxsdXN0cmF0aW9uc01pbjogMCxcbiAgICBuYklsbHVzdHJhdGlvbnNNYXg6IDEsXG4gICAgbWF4SWxsdXN0cmF0aW9uU2l6ZWluT2N0ZXQ6IDEwMDAwMDAsLy8gcGFzIGNvbnRyw7Rsw6kgcG91ciBsJ2luc3RhbnQuIMOAIHJldm9pci5cbiAgICBtaW1lVHlwZXNGb3JJbGx1c3RyYXRpb246IFsgXCJpbWFnZS9qcGdcIiwgXCJpbWFnZS9qcGVnXCIsIFwiaW1hZ2UvcG5nXCIsIFwiaW1hZ2UvZ2lmXCIsIFwiaW1hZ2UvcG5nXCIgXSxcbiAgICAvLyAtLSBVcGxvYWQgYW5kIHJlc2l6ZTpcbiAgICBpbGx1c3RyYXRpb25zV2lkdGhNYXhJblB4OiA0MDAsXG4gICAgaWxsdXN0cmF0aW9uc01pbmlhdHVyZXNXaWR0aE1heEluUHg6IDIwMCxcbiAgICAvLyBMaW5rczpcbiAgICBuYkxpbmtzTWluOiAxLFxuICAgIG5iTGlua3NNYXg6IDEsXG4gICAgLy8gw6Agc3VwcHJpbWVyIHF1YW5kIHRvdXMgbGVzIFwicmVxdWlyZVwiIMOgIGpvdXI6XG4gICAgbmJRdWVzdGlvbnNNaW46IHF1ZXN0aW9ubmFpcmVzLm5iUXVlc3Rpb25zTWluLFxuICAgIG5iUXVlc3Rpb25zTWF4OiBxdWVzdGlvbm5haXJlcy5uYlF1ZXN0aW9uc01heCxcbiAgICBuYkNob2ljZXNNYXg6IHF1ZXN0aW9ubmFpcmVzLm5iQ2hvaWNlc01heCxcbiAgICBwYXNzd29yZE1pbkxlbmd0aDogdXNlcnMucGFzc3dvcmQubWlubGVuZ3RoLFxuICAgIGRpckNhY2hlVXNlcnM6IHVzZXJzLmRpckNhY2hlVXNlcnMsXG4gICAgZGlyQ2FjaGVVc2Vyc0Fuc3dlcnM6IHVzZXJzLmRpckNhY2hlVXNlcnNBbnN3ZXJzLFxuICAgIGRpckNhY2hlUXVlc3Rpb25uYWlyZXM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlUXVlc3Rpb25uYWlyZXMsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbnM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlUXVlc3Rpb25zLFxuICAgIGRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzLFxuICAgIGRpckhUTUxRdWVzdGlvbm5haXJlOiBxdWVzdGlvbm5haXJlcy5kaXJIVE1MUXVlc3Rpb25uYWlyZSxcbiAgICBkaXJXZWJRdWVzdGlvbm5haXJlOiBxdWVzdGlvbm5haXJlcy5kaXJXZWJRdWVzdGlvbm5haXJlXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbnsgICAgXG4gICAgLy8gQVBJJ3JvdXRlcyAoYWZ0ZXIgXCJhcGlVcmxcIiBkZWZpbmVkIGluIGluc3RhbmNlLmpzKVxuICAgIHF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3F1ZXN0aW9ubmFpcmVcIixcbiAgICBnZXRRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9nZXRcIixcbiAgICBwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcHJldmlld1wiLFxuICAgIHB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3F1aXovXCIsXG4gICAgc2F2ZUFuc3dlcnNSb3V0ZTogXCIvYW5zd2VyL1wiLFxuICAgIGdldFN0YXRzUXVlc3Rpb25uYWlyZXMgOiBcIi9zdGF0cy9cIixcbiAgICBzZWFyY2hRdWVzdGlvbm5haXJlc1JvdXRlIDogXCIvc2VhcmNoXCIsXG4gICAgc2VhcmNoQWRtaW5RdWVzdGlvbm5haXJlc1JvdXRlIDogXCIvc2VhcmNoYWRtaW5cIixcbiAgICBnZXRMaXN0TmV4dFF1ZXN0aW9ubmFpcmVzOiBcIi9nZXRsaXN0bmV4dHF1ZXN0aW9ubmFpcmVzL1wiLFxuICAgIC8vIC0tIHF1ZXN0aW9ucyAmIGNob2ljZXMgOlxuICAgIHF1ZXN0aW9uc1JvdXRlOiBcIi9xdWVzdGlvbi9cIixcbiAgICAvLyAtLSB0YWdzIDpcbiAgICB0YWdzU2VhcmNoUm91dGU6IFwiL3RhZ3Mvc2VhcmNoL1wiLFxuICAgIC8vIC0tIGFuc3dlcnMgOlxuICAgIGdldFF1ZXN0aW9ubmFpcmVzV2l0aG91dEFuc3dlcjogXCIvd2l0aG91dGFuc3dlci91c2VyL1wiLFxuICAgIGdldFByZXZpb3VzQW5zd2VyczogXCIvdXNlci9hbnN3ZXJzL1wiLFxuICAgIGdldFN0YXRzQW5zd2VycyA6IFwiL3VzZXIvYW53c3dlcnMvc3RhdHMvXCIsXG4gICAgZ2V0QWRtaW5TdGF0czogXCIvZ2V0YWRtaW5zdGF0cy9cIixcbiAgICAvLyBmb3JtcyA6IMOgIGNvbXBsw6l0ZXIgYXZlYyB2YWxldXJzIHBhciBkw6lmYXV0LCBldGMuIGNmIG1vZMOobGVcbiAgICBRdWVzdGlvbm5haXJlIDpcbiAgICB7XG4gICAgICAgIHRpdGxlOiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICBzbHVnOiB7IG1heGxlbmd0aDogMTUwIH0sIC8vIGNoYW1wIHJlcXVpcyBtYWlzIGNhbGN1bMOpIMOgIHBhcnRpciBkdSB0aXRyZSBxZCB2aWRlXG4gICAgICAgIGludHJvZHVjdGlvbjogeyByZXF1aXJlZDogdHJ1ZSB9XG4gICAgfSxcbiAgICBzZWFyY2hRdWVzdGlvbm5haXJlcyA6IHsgbWlubGVuZ3RoOiAzLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIFF1ZXN0aW9uIDpcbiAgICB7XG4gICAgICAgIHRleHQ6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgIHJhbms6IHsgcmVxdWlyZWQ6IHRydWUsIG1pbjoxLCBkZWZhdWx0VmFsdWU6MSB9XG4gICAgfSwgICAgICAgICAgXG4gICAgQ2hvaWNlIDpcbiAgICB7XG4gICAgICAgIHRleHQ6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH1cbiAgICB9LCAgICAgICAgICBcbiAgICBuYlF1ZXN0aW9uc01pbjogMSxcbiAgICBuYlF1ZXN0aW9uc01heDogMTAsXG4gICAgbmJDaG9pY2VzTWF4OiAxMCxcbiAgICBuYlRhZ3NNaW46IDAsXG4gICAgbmJUYWdzTWF4OiAwLCAvLyAwID0gbm90IG1heCAgICBcbiAgICAvLyBKU09OIGFuZCBIVE1MIGRpclxuICAgIGRpckNhY2hlUXVlc3Rpb25uYWlyZXMgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzXCIsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbnMgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzL3F1ZXN0aW9uc1wiLFxuICAgIGRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlcyA6IFwiZGF0YXMvdXNlcnMvcXVlc3Rpb25uYWlyZXNcIixcbiAgICBkaXJDYWNoZVRhZ3MgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzL3RhZ3NcIiwgIFxuICAgIGRpckhUTUxRdWVzdGlvbm5haXJlIDogXCJmcm9udC9wdWJsaWMvcXVpelwiLFxuICAgIGRpckhUTUxUYWdzIDogXCJmcm9udC9wdWJsaWMvcXVpenNcIixcbiAgICBkaXJXZWJRdWVzdGlvbm5haXJlIDogXCJxdWl6XCIsLy9wb3VyIHVybCBwYWdlXG4gICAgZGlyV2ViVGFncyA6IFwicXVpenNcIi8vIGlkZW1cbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIC8vIEFQSSdyb3V0ZXMgKGFmdGVyIFwiYXBpVXJsXCIgZGVmaW5lZCBpbiBpbnN0YW5jZS5qcylcbiAgICB1c2VyUm91dGVzOiBcIi91c2VyXCIsXG4gICAgc3Vic2NyaWJlUm91dGU6IFwiL3NpZ251cFwiLFxuICAgIGdldEdvZGZhdGhlclJvdXRlOiBcIi9nZXRnb2RmYXRoZXJpZFwiLFxuICAgIGNoZWNrSWZJc0VtYWlsZnJlZVJvdXRlOiBcIi9pc2VtYWlsZnJlZVwiLFxuICAgIGNoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZTogXCIvdmFsaWRhdGlvbi9cIixcbiAgICBjaGVja0xvZ2luUm91dGU6IFwiL2NoZWNrbG9naW4vXCIsXG4gICAgY29ubmVjdGlvblJvdXRlOiBcIi9sb2dpblwiLFxuICAgIGdldExvZ2luTGlua1JvdXRlOiBcIi9nZXRsb2dpbmxpbmtcIixcbiAgICBjb25uZWN0aW9uV2l0aExpbmtSb3V0ZTogXCIvY2hlY2tsb2dpbmxpbmtcIixcbiAgICBnZXRVc2VySW5mb3M6IFwiL2dldC9cIixcbiAgICBjcmVhdGVVc2VyUm91dGU6IFwiL2NyZWF0ZVwiLFxuICAgIHZhbGlkYXRlVXNlclJvdXRlOiBcIi92YWxpZGF0ZS9cIixcbiAgICB1cGRhdGVVc2VySW5mb3M6IFwiL21vZGlmeS9cIixcbiAgICBzZWFyY2hVc2VyUm91dGU6IFwiL3NlYXJjaC9cIixcbiAgICBnZXRHb2RDaGlsZHM6IFwiL2dldGdvZGNoaWxkcy9cIixcbiAgICBjaGVja05ld0xvZ2luTGlua1JvdXRlOiBcIi9jb25maXJtbmV3bG9naW4vXCIsXG4gICAgY2hlY2tEZWxldGVMaW5rUm91dGU6IFwiL2NvbmZpcm1kZWxldGUvXCIsXG4gICAgZ2V0UGF5bWVudHM6IFwiL3BheW1lbnQvZ2V0Zm9yb25ldXNlci9cIixcbiAgICB1bnN1YnNjcmliZVJvdXRlOiBcIi9zdWJzY3JpcHRpb24vc3RvcC9cIixcbiAgICBnZXRBZG1pblN0YXRzOiBcIi9nZXRhZG1pbnN0YXRzL1wiLFxuICAgIC8vIGZvcm1zIDogw6AgY29tcGzDqXRlciBhdmVjIHZhbGV1cnMgcGFyIGTDqWZhdXQsIGV0Yy4gY2YgbW9kw6hsZVxuICAgIG5hbWU6IHsgbWF4bGVuZ3RoOiA3MCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBlbWFpbDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBwYXNzd29yZDogeyBtaW5sZW5ndGg6IDgsIG1heGxlbmd0aDo3MiwgcmVxdWlyZWQ6IHRydWUgfSwgLy8gaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvYmNyeXB0I3NlY3VyaXR5LWlzc3Vlcy1hbmQtY29uY2VybnNcbiAgICBuZXdQYXNzd29yZDogeyBtaW5sZW5ndGg6IDgsIG1heGxlbmd0aDo3MiB9LFxuICAgIGNvZGVHb2RmYXRoZXI6IHsgbWF4bGVuZ3RoOiAyNTUgfSxcbiAgICBjZ3VPazogeyB2YWx1ZTogXCJ0cnVlXCIsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgdGltZURpZmZlcmVuY2VNaW46IC03MjAsXG4gICAgdGltZURpZmZlcmVuY2VNYXg6ODQwLFxuICAgIC8vIEpTT04gZGlyXG4gICAgZGlyQ2FjaGVVc2VycyA6IFwiZGF0YXMvdXNlcnNcIixcbiAgICBkaXJDYWNoZVVzZXJzQW5zd2VycyA6IFwiZGF0YXMvdXNlcnMvcXVlc3Rpb25uYWlyZXMvYW5zd2Vyc1wiXG59O1xuIiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL2dlbmVyYWxcIjogXCIuLi9sYW5nL2ZyL2dlbmVyYWwuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9nZW5lcmFsJFwiOyIsInZhciBtYXAgPSB7XG5cdFwiLi9mci91c2VyXCI6IFwiLi4vbGFuZy9mci91c2VyLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvdXNlciRcIjsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgc2l0ZUhUTUxUaXRsZSA6IFwiV2lraUxlcm5pIDogcXUnYWxsZXotdm91cyBhcHByZW5kcmUgYXVqb3VyZCdodWkgP1wiLFxuICAgIHNpdGVNZXRhRGVzY3JpcHRpb24gOiBcIkNoYXF1ZSBqb3VyLCB0ZXN0ZXogdm9zIGNvbm5haXNzYW5jZXMgZXQgYXBwcmVuZXogZGUgbm91dmVsbGVzIGNob3NlcyBhdmVjIFdpa2lMZXJuaS5cIixcbiAgICBzY3JpcHRUaW1pbmdJbmZvIDogXCJEdXLDqWUgZGUgbGEgcsOpcG9uc2UgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNjcmlwdFRpbWluZ0FsZXJ0IDogXCIqKiogU2NyaXB0IGxlbnQgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNlcnZlckVycm9yIDogXCJEw6lzb2zDqS4gVW5lIGVycmV1ciBpbXByw6l2dWUgZXN0IHN1cnZlbnVlLiBTaSBjZWxhIHBlcnNpc3RlLCBuJ2jDqXNpdGV6IMOgIHByw6l2ZW5pciBsJ2FkbWluaXN0cmF0ZXVyIGR1IHNpdGUuXCIsXG4gICAgc2VydmVyRXJyb3JBZG1pbiA6IFwiQnVnIGRlIGwnYXBwbGljYXRpb24gOlwiLFxuICAgIG5lZWRlZFBhcmFtcyA6IFwiRGVzIHBhcmFtw6h0cmVzIG7DqWNlc3NhaXJlcyBtYW5xdWFudHMgc29udCBtYW5xdWFudHMuXCIsXG4gICAgYmFkVXJsIDogXCJUZW50YXRpdmUgZCdhY2PDqHMgw6AgdW5lIHBhZ2UgbidleGlzdGFudCBwYXMgOlwiLFxuICAgIG5vdFZhbGlkRm9ybWF0IDogXCJGb3JtYXQgbm9uIHZhbGlkZS5cIixcbiAgICBub3RBbGxvd2VkIDogXCJWb3VzIG4nYXZleiBwYXMgbGVzIGRyb2l0cyBuw6ljZXNzYWlyZXMgcG91ciBjZXR0ZSBhY3Rpb24uXCIsXG4gICAgbm90UmVxdWlyZWQgOiBcIkZhY3VsdGF0aWYuXCIsXG4gICAgdXBkYXRlQnRuVHh0OiBcIk1vZGlmaWVyXCIsXG4gICAgYWRkQnRuVHh0OiBcIkFqb3V0ZXJcIixcbiAgICBkZWxldGVCdG5UeHQ6IFwiU3VwcHJpbWVyXCIsXG4gICAgYWRkT2tNZXNzYWdlIDogXCJMZXMgZG9ubsOpZXMgb250IGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llcy5cIixcbiAgICB1cGRhdGVPa01lc3NhZ2UgOiBcIkxhIG1pc2Ugw6Agam91ciDDoCBqb3VyIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgZGVsZXRlT2tNZXNzYWdlIDogXCJMYSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIGZhaWxBdXRoIDogXCJFcnJldXIgZCdhdXRoZW50aWZpY2F0aW9uLlwiLFxuICAgIGZhaWxBdXRoSGVhZGVyIDogXCJBYnNlbmNlIGRlIGhlYWRlciBBdXRob3JpemF0aW9uLlwiLFxuICAgIGZhaWxBdXRoVG9rZW4gOiBcIlRva2VuIGludmFsaWRlIG91IHV0aWxpc2F0ZXVyIG5vbiB0cm91dsOpLlwiLFxuICAgIGZhaWxBdXRoSWQgOiBcIklkZW50aWZpYW50IG5vbiB2YWxpZGUgOiBcIixcbiAgICBmYWlsQXV0aENyb24gOiBcIlRlbnRhdGl2ZSBkZSBsYW5jZW1lbnQgZCd1biBjcm9uIHNhbnMgbGUgYm9uIHRva2VuLlwiLFxuICAgIHByZXZpb3VzUGFnZSA6IFwiUGFnZSBwcsOpY8OpZGVudGVcIixcbiAgICBuZXh0UGFnZSA6IFwiUGFnZSBzdWl2YW50ZVwiLFxuICAgIGJ0bkxpbmtUb1F1ZXN0aW9ubmFpcmUgOiBcIkFsbGVyIGF1IHF1aXogIVwiLFxuICAgIHN0YXRzQWRtaW4gOiBcIkR1cmFudCBsZXMgZGVybmnDqHJlcyAyNGggOiBOQl9VU0VSU18yNEggY29tcHRlcyBvbnQgw6l0w6kgY3LDqcOpcywgTkJfU1VCU0NSSVBUSU9OU18yNEggdmFsaWTDqXMgZXQgTkJfVVNFUlNfREVMRVRFRF8yNEggc3VwcHJpbcOpcy4gTkJfQU5TV0VSU18yNEggcsOpcG9uc2VzIGF1eCBxdWl6cyBvbnQgw6l0w6kgZW5yZWdpc3Ryw6llcy48YnI+RW4gdG91dCwgaWwgeSBhIDogTkJfVVNFUlNfVE9UIGNvbXB0ZXMsIGRvbnQgTkJfU1VCU0NSSVBUSU9OU19UT1QgdmFsaWTDqXMgZXQgTkJfU1VCU0NSSVBUSU9OU19QUkVNSVVNIGNvbXB0ZXMgcHLDqW1pdW0uIE5CX0FOU1dFUlNfVE9UIHLDqXBvbnNlcyBhdXggcXVpenMgb250IMOpdMOpIGVucmVnaXN0csOpZXMuPGJyPlBhcm1pIGxlcyBOQl9VU0VSU19ERUxFVEVEX1RPVCBjb21wdGVzIHN1cHByaW3DqXMsIE5CX1VTRVJTX0RFTEVURURfVkFMSURFRCBhdmFpZW50IHZhbGlkw6kgbGV1ciBjb21wdGUgZXQgTkJfVVNFUlNfREVMRVRFRF9QUkVNSVVNIGF2YWllbnQgc291c2NyaXQgdW4gY29tcHRlIHByw6ltaXVtLlwiXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBub3RGb3VuZDogXCJMJ3V0aWxpc2F0ZXVyIG4nYSBwYXMgw6l0w6kgdHJvdXbDqS5cIixcbiAgICBuZWVkTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyLlwiLFxuICAgIG5lZWROb3RUb29Mb25nTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyIG5lIGNvbXB0YW50IHBhcyBwbHVzIGRlIDcwIGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRFbWFpbDogXCJNZXJjaSBkZSBzYWlzaXIgdm90cmUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgbmVlZFVuaXF1ZUVtYWlsOiBcIkwnYWRyZXNzZSBlLW1haWwgcXVlIHZvdXMgYXZleiBzYWlzaWUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcGFyIHVuIGF1dHJlIHV0aWxpc2F0ZXVyLiBTaSB2b3VzIGF2ZXogZMOpasOgIHVuIGNvbXB0ZSwgPGEgaHJlZj0nLyNVUkwnPmNsaXF1ZXotaWNpIHBvdXIgdm91cyBjb25uZWN0ZXI8L2E+LlwiLFxuICAgIG5lZWROb3RUb29Mb25nRW1haWw6IFwiTWVyY2kgZGUgc2Fpc2lyIHVuZSBhZHJlc3NlIGUtbWFpbCBuZSBjb21wdGFudCBwYXMgcGx1cyBkZSAyNTUgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZFBhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZS5cIixcbiAgICBuZWVkTG9uZ1Bhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZSBkJ2F1IG1vaW5zIE1JTl9MRU5HVEggY2FyYWN0w6hyZXMuXCIsXG4gICAgcGFzc3dvcmRDb3BpZWQ6IFwiTGUgbW90IGRlIHBhc3NlIGfDqW7DqXLDqSBhIMOpdMOpIGNvcGnDqSBkYW5zIGxlIHByZXNzZS1wYXBpZXIuIFZvdXMgcG91dmV6IGxlIHJlY29waWVyIG/DuSB2b3VzIGxlIHNvdWhhaXRlci5cIixcbiAgICBuZWVkU3RhdHVzIDogXCJJbCBtYW5xdWUgbGUgc3RhdHV0LlwiLFxuICAgIG5lZWRMYW5ndWFnZSA6IFwiSWwgbWFucXVlIGxlIGNvZGUgbGFuZ3VlLlwiLFxuICAgIG5lZWRWYWxpZExhc3RDb25uZWN0aW9uRGF0ZSA6IFwiTGEgZGF0ZSBkZSBkZXJuacOocmUgY29ubmV4aW9uIG4nZXN0IHBhcyB2YWxpZGUuXCIsXG4gICAgbmVlZFNNVFAgOiBcIklsIG1hbnF1ZSBsZSBzZXJ2ZXVyIFNNVFAuXCIsXG4gICAgbmVlZFNNVFBOb3RGb3VuZCA6IFwiSWwgbWFucXVlIGxlIHNlcnZldXIgU01UUC5cIixcbiAgICBuZWVkS25vd05ld3NsZXR0ZXJPayA6IFwiSWwgZmF1dCBzYXZvaXIgc2kgbCd1dGlsaXNhdGV1ciBhY2NlcHRlIG91IHJlZnVzZSBkZSByZWNldm9pciBsYSBuZXdzbGV0dGVyLlwiLFxuICAgIG5lZWRUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBjb25uYcOudHJlIGxlIG5vbWJyZSBkZSBtaW51dGVzIGR1IGTDqWNhbGFnZSBob3JhaXJlLlwiLFxuICAgIG5lZWRNaW5UaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGVubGV2ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgNzIwLlwiLFxuICAgIG5lZWRNYXhUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGFqb3V0ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgODQwLlwiLFxuICAgIG5lZWRVR0NPayA6IFwiVm91cyBkZXZleiBhY2NlcHRlciBsZXMgQ0dVIHBvdXIgcG91dm9pciBjcsOpZXIgdm90cmUgY29tcHRlLiBcIixcbiAgICBnb2RmYXRoZXJOb3RGb3VuZDogXCJBdWN1biB1dGlsaXNhdGV1ciB2YWxpZGUgdHJvdXbDqSBwb3VyIGNlIGNvZGUgcGFycmFpbi5cIixcbiAgICBnb2RmYXRoZXJGb3VuZDogXCJWb3RyZSBwYXJyYWluIGEgYmllbiDDqXTDqSB0cm91dsOpICFcIixcbiAgICBtYWlsVmFsaWRhdGlvbk1lc3NhZ2U6IFwiVm90cmUgaW5zY3JpcHRpb24gZXN0IGJpZW4gZW5yZWdpc3Ryw6llLlxcblBvdXIgbGEgZmluYWxpc2VyLCBtZXJjaSBkZSBjbGlxdWVyIGRhbnMgbGVzIDI0SCBzdXIgbGUgbGllbiBkZSBjb25maXJtYXRpb24gcXVpIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBwYXIgZS1tYWlsLlwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1N1YmplY3QgOiBcIk1lcmNpIGRlIHZhbGlkZXIgdm90cmUgY29tcHRlXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblBvdXIgdmFsaWRlciB2b3RyZSBjb21wdGUsIG1lcmNpIGRlIGNsaXF1ZXIgc3VyIGxlIGxpZW4gc3VpdmFudCBkYW5zIGxlcyAyNGggOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm90cmUgY29tcHRlLCBtZXJjaSBkZSBjbGlxdWVyIHN1ciBsZSBsaWVuIHN1aXZhbnQgZGFucyBsZXMgMjRoLjwvcD48cD48YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+VmFsaWRlci48L2E+PC9wPlwiLFxuICAgIHZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGNvbXB0ZSB2aWVudCBiaWVuIGQnw6p0cmUgdmFsaWTDqS4gTWVyY2kgZXQgYmllbnZlbnVlICE8YnI+Vm91cyBwb3V2ZXogc2FucyB0YXJkZXIgdm91cyBjb25uZWN0ZXIgY2ktZGVzc291cyBwb3VyIGFjY8OpZGVyIMOgIHZvdHJlIGNvbXB0ZS5cIixcbiAgICB2YWxpZGF0aW9uTWVzc2FnZUFkbWluOiBcIkxlIGNvbXB0ZSBhIGJpZW4gw6l0w6kgdmFsaWTDqS5cIixcbiAgICB2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2U6IFwiSWwgc2VtYmxlIHF1ZSB2b3VzIGF5ZXogZMOpasOgIHZhbGlkw6kgdm90cmUgY29tcHRlLlwiLFxuICAgIHZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZUFkbWluOiBcIkNlIGNvbXB0ZSBhIGTDqWrDoCDDqXTDqSB2YWxpZMOpLlwiLFxuICAgIG1haWxXZWxjb21lU3ViamVjdCA6IFwiQmllbnZlbnVlICFcIixcbiAgICBtYWlsV2VsY29tZUJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblZvdHJlIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuXFxuTWVyY2kgZXQgw6AgYmllbnTDtHQgIVwiLFxuICAgIG1haWxXZWxjb21lQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlZvdHJlIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuPC9wPjxwPk1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyU3ViamVjdCA6IFwiTWVyY2kgIVwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlckJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcbkdyw6JjZSDDoCB2b3VzIHVuIG5vdXZlbCB1dGlsaXNhdGV1ciAoRU1BSUwpIHZpZW50IGRlIHMnaW5zY3JpcmUgc3VyIE5PTV9TSVRFLlxcbk1lcmNpIGV0IMOgIGJpZW50w7R0ICFcIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+R3LDomNlIMOgIHZvdXMgdW4gbm91dmVsIHV0aWxpc2F0ZXVyIChFTUFJTCkgdmllbnQgZGUgcydpbnNjcmlyZSBzdXIgTk9NX1NJVEUuPC9wPjxwPk1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGxpZW4gZGUgY29uZmlybWF0aW9uIG5lIHNlbWJsZSBwYXMgdmFsaWRlIG91IGJpZW4gaWwgYSBleHBpcsOpLiBWb3VzIHBvdXZleiBlbiByZWNldm9pciB1biBub3V2ZWF1IDxhIGhyZWY9JyNVUkwnPmVuIGNsaXF1YW50IGljaTwvYT4uXCIsXG4gICAgZW1haWxOb3RGb3VuZDogXCJBdWN1biB1dGlsaXNhdGV1ciB0cm91dsOpIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgYWxyZWFkeUNvbm5lY3RlZDogXCJWb3VzIMOqdGVzIGTDqWrDoCBjb25uZWN0w6koZSkgYXUgc2l0ZSAhXCIsXG4gICAgbmVlZEJlQ29ubmVjdGVkOiBcIlZvdXMgZGV2ZXogw6p0cmUgY29ubmVjdMOpKGUpIHBvdXIgYWNjw6lkZXIgw6AgY2V0dGUgcGFnZS5cIixcbiAgICBjb25uZWN0aW9uT2s6IFwiQ29ubmV4aW9uIHLDqXVzc2llLlwiLFxuICAgIG5lZWRDaG9vc2VMb2dpbldheTogXCJWb3VzIGRldmV6IHNvaXQgc2Fpc2lyIHZvdHJlIG1vdCBkZSBwYXNzZSwgc29pdCBjb2NoZXIgbGEgY2FzZSB2b3VzIHBlcm1ldHRhbnQgZGUgcmVjZXZvaXIgdW4gbGllbiBkZSBjb25uZXhpb24gcGFyIGUtbWFpbC5cIixcbiAgICBuZWVkVmFsaWRhdGlvblRvTG9naW4gOiBcIlZvdXMgZGV2ZXogZCdhYm9yZCB2YWxpZGVyIHZvdHJlIGNvbXB0ZSBhdmFudCBkZSB2b3VzIGNvbm5lY3Rlci4gUG91ciBjZSBmYWlyZSwgdW4gbGllbiB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbC5cIixcbiAgICB0b29NYW55TG9naW5GYWlscyA6IFwiVHJvcCBkZSB0ZW50YXRpdmVzIGRlIGNvbm5leGlvbiBpbmZydWN0dWV1c2VzIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuIFZvdXMgZGV2ZXogYXR0ZW5kcmUgTUlOVVRFUyBtaW51dGVzIHBvdXIgZXNzYXllciBkZSBub3V2ZWF1LlwiLFxuICAgIGJhZFBhc3N3b3JkOiBcIkxlIG1vdCBkZSBwYXNzZSBuJ2VzdCBwYXMgbGUgYm9uLlwiLFxuICAgIG1haWxMb2dpbkxpbmtTdWJqZWN0IDogXCJWb3RyZSBsaWVuIGRlIGNvbm5leGlvbi5cIixcbiAgICBtYWlsTG9naW5MaW5rQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuUG91ciB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6IExJTktfVVJMXCIsXG4gICAgbWFpbExvZ2luTGlua0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZvdXMgY29ubmVjdGVyIMOgIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDo8L3A+PHA+PGEgaHJlZj1cXFwiTElOS19VUkxcXFwiPlZhbGlkZXIuPC9hPjwvcD5cIixcbiAgICBtYWlsTG9naW5MaW5rTWVzc2FnZSA6IFwiVW4gbGllbiBkZSBjb25uZXhpb24gdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHN1ciB2b3RyZSBhZHJlc3NlIGUtbWFpbC4gTmUgdGFyZGV6IHBhcyDDoCBsJ3V0aWxpc2VyLCBjYXIgaWwgbidlc3QgdmFsYWJsZSBxdWUgZHVyYW50IFwiLFxuICAgIHVwZGF0ZWRPa01lc3NhZ2U6IFwiVm9zIGluZm9ybWF0aW9ucyBvbnQgYmllbiDDqXTDqSBtaXNlcyDDoCBqb3VyLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEVtYWlsIDogXCJNYWlzIGxhIG5vdXZlbGxlIGFkcmVzc2UgZS1tYWlsIG4nYSBwdSDDqnRyZSBlbnJlZ2lzdHLDqWUgY2FyIGVsbGUgbidhIHBhcyB1bmUgZm9ybWF0IGNvcnJlY3QuXCIsXG4gICAgdXBkYXRlZE5lZWRVbmlxdWVFbWFpbCA6IFwiTWFpcyBsYSBub3V2ZWxsZSBhZHJlc3NlIGUtbWFpbCBzYWlzaWUgKE5FV19FTUFJTCkgbidhIHB1IMOqdHJlIGVucmVnaXN0csOpZSwgY2FyIGVsbGUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcG91ciB1biBhdXRyZSBjb21wdGUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luU3ViamVjdCA6IFwiTWVyY2kgZGUgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblBvdXIgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cyBkZSBjb25uZXhpb24sIDxhIGhyZWY9XFxcIkxJTktfVVJMXFxcIj5jbGlxdWV6IGljaTwvYT4gc2FucyB0YXJkZXIuPC9wPlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkxpbmtNZXNzYWdlOiBcIkNlcGVuZGFudCwgdm91cyBhdmV6IG1vZGlmacOpIGF1IG1vaW5zIHVuIGRlIHZvcyBpZGVudGlmaWFudHMgZGUgY29ubmV4aW9uIChlbWFpbCBldC9vdSBtb3QgZGUgcGFzc2UpIGV0IDxiPnZvdXMgZGV2ZXogY2xpcXVlciBzdXIgbGUgbGllbiBxdWkgdmllbnQgZGUgdm91cyDDqnRyZXMgZW52b3nDqSBzdXIgdm90cmUgYWRyZXNzZSAoTkVXX0VNQUlMKSBwb3VyIHZhbGlkZXIgY2UgY2hhbmdlbWVudDwvYj4uIEVuIGF0dGVuZGFudCwgbWVyY2kgZGUgY29udGludWVyIMOgIHV0aWxpc2VyIHZvcyBhbmNpZW5zIGlkZW50aWZpYW50cy5cIixcbiAgICB1cGRhdGVkTmVlZFZhbGlkYXRlZFVzZXI6IFwiTCd1dGlsaXNhdGV1ciBxdWUgdm91cyBzb3VoYWl0w6kgbW9kaWZpZXIgbidleGlzdGUgcGFzL3BsdXMgb3UgbidhIHBhcyBlbmNvcmUgdmFsaWTDqSBzb24gY29tcHRlLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEdvZGZhdGhlciA6IFwiTWFpcyBsZSBub3V2ZWF1IGNvZGUgcGFycmFpbiBuJ2EgcHUgw6p0cmUgcmV0ZW51LCBjYXIgaWwgbmUgY29ycmVzcG9uZCDDoCBhdWN1biBjb21wdGUgdXRpbGlzYXRldXIgb3Ugw6AgbCd1dGlsaXNhdGV1ciBsdWktbcOqbWUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luT2tNZXNzYWdlOiBcIkxhIG1pc2Ugw6Agam91ciBkZSB2b3MgaWRlbnRpZmlhbnRzIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgdXBkYXRlZEZhaWxlZEdvZGZhdGhlck5vdEZvdW5kIDogXCJMJ2lkZW50aWZpYW50IGZvdXJuaSBwb3VyIGxlIHBhcnJhaW4gbmUgY29ycmVzcG9uZCDDoCBhdWN1biB1dGlsaXNhdGV1ci5cIixcbiAgICBjcmVhdGlvbk9rTWVzc2FnZTogXCJMZSBub3V2ZWwgdXRpbGlzYXRldXIgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpLlwiLFxuICAgIG1haWxEZWxldGVTdWJqZWN0IDogXCJDb25maXJtZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLlwiLFxuICAgIG1haWxEZWxldGVCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5Qb3VyIHZhbGlkZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbERlbGV0ZUJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCA8YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+Y2xpcXVleiBpY2k8L2E+IHNhbnMgdGFyZGVyLjwvcD5cIixcbiAgICBtYWlsRGVsZXRlTGlua01lc3NhZ2U6IFwiVm90cmUgZGVtYW5kZSBkZSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLiBNZXJjaSBkZSBjbGlxdWVyIHNhbnMgdGFyZGVyIHN1ciBsZSBsaWVuIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbCBwb3VyIGNvbmZpcm1lci5cIixcbiAgICBkZWxldGVPa01lc3NhZ2U6IFwiTCd1dGlsaXNhdGV1ciBhIGJpZW4gw6l0w6kgc3VwcHJpbcOpLlwiLFxuICAgIGRlbGV0ZUZhaWxNZXNzYWdlOiBcIlRlbnRhdGl2ZSBkZSBzdXBwcmVzc2lvbiBkJ3VuIHV0aWxpc2F0ZXVyIGluZXhpc3RhbnQgOiBcIixcbiAgICBtYWlsRGVsZXRlTGlua09rTWVzc2FnZTogXCJWb3RyZSBjb21wdGUgYSBiaWVuIMOpdMOpIHN1cHByaW3DqS4gTWVyY2kgZCdhdm9pciB1dGlsaXPDqSBub3Mgc2VydmljZXMuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtBbHJlYWR5TWVzc2FnZTogXCJJbCBzZW1ibGUgcXVlIHZvdXMgYXlleiBkw6lqw6AgdmFsaWTDqSBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtGYWlsTWVzc2FnZTogXCJWb3RyZSBsaWVuIGRlIHN1cHByZXNzaW9uIG4nZXN0IHBhcyB2YWxpZGUgb3UgYWxvcnMgaWwgbidlc3QgcGx1cyB2YWxhYmxlLlwiLFxuICAgIGNyb25EZWxldGVVbnZhbGlkZWRVc2Vyc01lc3NhZ2U6IFwiIGNvbXB0ZXMgdXRpbGlzYXRldXJzIG5vbiB2YWxpZMOpcyBvbnQgw6l0w6kgc3VwcHJpbcOpcy5cIixcbiAgICBkZWxldGVJbmFjdGl2ZVVzZXJzTWVzc2FnZTogXCIgY29tcHRlcyB1dGlsaXNhdGV1cnMgaW5hY3RpZnMgb250IMOpdMOpIHN1cHByaW3DqXMuXCIsXG4gICAgd2VsY29tZU1lc3NhZ2U6IFwiQmllbnZlbnVlICNOQU1FICFcIixcbiAgICBieWVieWVNZXNzYWdlOiBcIlNpIHZvdXMgdm95ZXogY2UgbWVzc2FnZSwgYydlc3QgcXVlIHZvdHJlIGTDqWNvbm5leGlvbiBzJ2VzdCBiaWVuIGTDqXJvdWzDqWUuPGJyPsOAIGJpZW50w7R0ICFcIixcbiAgICBpbmZvc1VzZXJGb3JBZG1pbjogXCJDZXQgdXRpbGlzYXRldXIgKGlkOiBJRF9VU0VSKSBhIDxiPmNyw6nDqSBzb24gY29tcHRlIGxlIERBVEVfQ1JFQTwvYj4sIGxhIGRlcm5pw6hyZSBtaXNlIMOgIGpvdXIgZGF0YW50IGR1IERBVEVfVVBEQVRFLjxicj48Yj5EYXRlIGRlIHNhIGRlcm5pw6hyZSBjb25uZXhpb24gOiBEQVRFX0NPTk5FQ1RJT04uPC9iPlwiLFxuICAgIGluZm9zQWRtaW5Hb2RmYXRoZXI6IFwiQ2V0IHV0aWxpc2F0ZXVyIGEgw6l0w6kgcGFycmFpbsOpIHBhciBcIixcbiAgICBpbmZvc0FkbWluTmJHb2RDaGlsZHM6IFwiU2VzICNOQiBmaWxsZXVpbHMgOiBcIlxufTsiLCIvLyBRdWVscXVlcyBmb25jdGlvbnMgdXRpbGVzIHBvdXIgbGVzIGNoYcOubmVzXG5cbmNsYXNzIFRvb2xcbntcbiAgICBzdGF0aWMgaXNFbXB0eShteVZhcilcbiAgICB7XG4gICAgICAgIGlmKG15VmFyPT09dW5kZWZpbmVkIHx8IG15VmFyPT09bnVsbClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIG15VmFyKz1cIlwiOy8vIHNpIGF1dHJlIGNob3NlIHF1J3VuZSBjaGHDrm5lIGVudm95w6kuLi5cbiAgICAgICAgICAgIG15VmFyPW15VmFyLnRyaW0oKTtcbiAgICAgICAgICAgIGlmKG15VmFyPT09XCJcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgc3RhdGljIHRyaW1JZk5vdE51bGwobXlTdHJpbmcpXG4gICAge1xuICAgICAgICBpZihUb29sLmlzRW1wdHkobXlTdHJpbmcpKVxuICAgICAgICAgICAgbXlTdHJpbmc9bnVsbDtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVN0cmluZys9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVN0cmluZz1teVN0cmluZy50cmltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG15U3RyaW5nO1xuICAgIH1cblxuXG4gICAgc3RhdGljIHNob3J0ZW5JZkxvbmdlclRoYW4obXlTdHJpbmcsIG1heClcbiAgICB7XG4gICAgICAgIG15U3RyaW5nKz1cIlwiOy8vIGF1IGNhcyBvw7kgY2VsYSBuZSBzZXJhaXQgcGFzIHVuZSBjaGHDrm5lLi4uXG4gICAgICAgaWYobXlTdHJpbmcubGVuZ3RoID4gbWF4KVxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcuc3Vic3RyaW5nKDAsIChtYXgtMykpK1wiLi4uXCI7XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cbiAgICAvLyBzb3VyY2UgOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNTYwNDE0MC9yZXBsYWNlLW11bHRpcGxlLXN0cmluZ3Mtd2l0aC1tdWx0aXBsZS1vdGhlci1zdHJpbmdzXG4gICAgc3RhdGljIHJlcGxhY2VBbGwobXlTdHJpbmcsIG1hcE9iailcbiAgICB7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VFbHRzID0gbmV3IFJlZ0V4cChPYmplY3Qua2V5cyhtYXBPYmopLmpvaW4oXCJ8XCIpLFwiZ2lcIik7XG4gICAgICAgIHJldHVybiBteVN0cmluZy5yZXBsYWNlKHJlcGxhY2VFbHRzLCAobWF0Y2hlZCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG1hcE9ialttYXRjaGVkXTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZnIvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT2JqZXRzX2dsb2JhdXgvTWF0aC9yYW5kb21cbiAgICBzdGF0aWMgZ2V0UmFuZG9tSW50KG1pbiwgbWF4KVxuICAgIHtcbiAgICAgICAgbWluID0gTWF0aC5jZWlsKG1pbik7XG4gICAgICAgIG1heCA9IE1hdGguZmxvb3IobWF4KTtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pKSArIG1pbjtcbiAgICB9XG5cbiAgICAvLyDDoCBjb21wbMOpdGVyIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGF0ZV9mb3JtYXRfYnlfY291bnRyeVxuICAgIHN0YXRpYyBkYXRlRm9ybWF0KGRhdGVTdHJpbmcsIGxhbmc9XCJmclwiKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KGRhdGVTdHJpbmcpKVxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIGxldCBteURhdGU9bmV3IERhdGUoZGF0ZVN0cmluZyk7XG4gICAgICAgIGxldCBteURheT1teURhdGUuZ2V0RGF0ZSgpK1wiXCI7XG4gICAgICAgIGlmKG15RGF5Lmxlbmd0aD09PTEpXG4gICAgICAgICAgICBteURheT1cIjBcIitteURheTtcbiAgICAgICAgbGV0IG15TW91bnRoPShteURhdGUuZ2V0TW9udGgoKSsxKStcIlwiO1xuICAgICAgICBpZihteU1vdW50aC5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlNb3VudGg9XCIwXCIrbXlNb3VudGg7XG4gICAgICAgIGxldCBteVllYXI9bXlEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGlmKGxhbmc9PT1cImZyXCIpXG4gICAgICAgICAgICByZXR1cm4gbXlEYXkrXCIvXCIrbXlNb3VudGgrXCIvXCIrbXlZZWFyO1xuICAgICAgICBlbHNlIGlmIChsYW5nPT09XCJmb3JtXCIpLy8gMjAxNC0wMi0wOVxuICAgICAgICAgICAgcmV0dXJuIG15WWVhcitcIi1cIitteU1vdW50aCtcIi1cIitteURheTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG15TW91bnRoK1wiL1wiK215RGF5K1wiL1wiK215WWVhcjtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVG9vbDsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZGVmYXVsdC9jb25maWcvZnIuanNcIjogXCIuLi92aWV3cy9kZWZhdWx0L2NvbmZpZy9mci5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi92aWV3cyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC5qcyRcIjsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgaGVhZExpbmtzOlxuICAgIFtcbiAgICAgICAgeyBhbmNob3I6IFwiQWNjdWVpbFwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNb24gY29tcHRlXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb25uZXhpb24uaG10XCIsIGlkOiBcImFjY291bnRIZWFkTGlua1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiw4AgcHJvcG9zXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9hLXByb3Bvcy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDb250YWN0XCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb250YWN0Lmh0bWxcIiB9IH0sXG4gICAgXSxcbiAgICBmb290TGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJDcsOpZGl0c1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY3JlZGl0cy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNZW50aW9ucyBsw6lnYWxlc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvbWVudGlvbnMtbGVnYWxlcy5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiRG9ubsOpZXMgcGVyc29ubmVsbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9kb25uZWVzLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkMuRy5VLlwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY2d1Lmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDLkcuVi5cIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nndi5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICBdLFxuICAgIG1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlOiAxMCxcbiAgICB1c2VySG9tZVBhZ2UgOiBcImFjY3VlaWwuaHRtbFwiLFxuICAgIGFkbWluSG9tZVBhZ2UgOiBcImFkbWluLmh0bWxcIixcbiAgICBtYW5hZ2VySG9tZVBhZ2UgOiBcImdlc3Rpb24uaHRtbFwiLFxuICAgIHN1YnNjcmliZVBhZ2UgOiBcImluc2NyaXB0aW9uLmh0bWxcIixcbiAgICBjb25uZWN0aW9uUGFnZSA6IFwiY29ubmV4aW9uLmh0bWxcIixcbiAgICBhY2NvdW50UGFnZTogXCJjb21wdGUuaHRtbFwiLFxuICAgIHF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi1xdWl6cy5odG1sXCIsXG4gICAgdXNlcnNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXV0aWxpc2F0ZXVycy5odG1sXCIsXG4gICAgbmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSA6IDEwLFxuICAgIGlsbHVzdHJhdGlvbkRpciA6IFwiL2ltZy9xdWl6cy9cIixcbiAgICBzaXRlU2xvZ2FuOiBcIkN1bHRpdm9ucyBub3RyZSBqYXJkaW4gIVwiLFxuICAgIGhvbWVUaXRsZTE6IFwiRGUgbmF0dXJlIGN1cmlldXNlID9cIixcbiAgICBob21lUDE6IFwiQXZlYyBXaWtpTGVybmkgdm91cyBhcHByZW5leiBjaGFxdWUgam91ciBkZSBub3V2ZWxsZXMgY2hvc2VzLjxicj5EZXMgYXJ0aWNsZXMgZGUgV2lraXDDqWRpYSBzb250IHPDqWxlY3Rpb25uw6lzIHBvdXIgdm91cyBldCBzb250IHN1aXZpcyBkJ3VuIHF1aXogdm91cyBwZXJtZXR0YW50IGRlIHRlc3RlciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudS48YnI+RGUgam91ciBlbiBqb3VyIGRlIG5vdXZlbGxlcyBncmFpbmVzIGRlIHNhdm9pciBzb250IGFpbnNpIHNlbcOpZXMgZGFucyB2b3RyZSBcXFwiamFyZGluXFxcIi5cIixcbiAgICBob21lVGl0bGUyOiBcIkxhIGN1bHR1cmUgZW4gbGliZXJ0w6lcIixcbiAgICBob21lUDI6IFwiVG91dCBjb21tZSBzdXIgV2lraXDDqWRpYSAoKiksIGxlIGxvZ2ljaWVsIGV0IGxlIGNvbnRlbnUgcGFydGFnw6kgc3VyIFdpa2lMZXJuaSBzb250IGxpYnJlcy48YnI+Vm91cyBwb3V2ZXogbGVzIHV0aWxpc2VyLCBsZXMgbW9kaWZpZXIgZXQgbGVzIGRpZmZ1c2VyIHNlbG9uIHZvdHJlIHNvdWhhaXQuPGJyPlN1ciBXaWtpTGVybmksIHBhcyBkZSBwdWJsaWNpdMOpLCBuaSBkZSBjb21tZXJjaWFsaXNhdGlvbiBkZSB2b3MgZG9ubsOpZXMgcGVyc29ubmVsbGVzLjxicj5Wb3VzIHBvdXZleiB2ZW5pciB5IFxcXCJjdWx0aXZlciB2b3RyZSBqYXJkaW5cXFwiIGVuIHRvdXRlIHRyYW5xdWlsbGl0w6kuPGJyPjxicj48c21hbGw+PGVtPigqKSBCaWVuIHF1ZSBwYXJ0YWdlYW50IHNlcyB2YWxldXJzLCBXaWtpTGVybmkgZXN0IHVuIHByb2pldCBpbmTDqXBlbmRhbnQgZGUgbGEgZm9uZGF0aW9uIFdpa2lww6lkaWEuPC9lbT48L3NtYWxsPlwiLFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzVGl0bGU6IFwiTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzIHN1ciBXaWtpTGVybmlcIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc0ludHJvOiBcIkxpc3RlIGRlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyBzdXIgV2lraUxlcm5pLlwiLFxuICAgIGV4cGxhbmF0aW9uVGl0bGU6IFwiVm91cyBkw6ljb3V2cmV6IFdpa2lMZXJuaSA/XCIsXG4gICAgZXhwbGFuYXRpb25UeHQ6IFwiTGUgcHJpbmNpcGUgZXN0IHNpbXBsZSA6IHZvdXMgY29tbWVuY2V6IHBhciBsaXJlIGwnYXJ0aWNsZSBXaWtpcMOpZGlhIGRvbnQgbGUgbGllbiB2b3VzIGVzdCBwcm9wb3PDqS48YnI+UHVpcyB2b3VzIGFmZmljaGVyIGxlIHF1aXogcG91ciB2w6lyaWZpZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUgZGUgdm90cmUgbGVjdHVyZS4gVm91cyBvYnRlbmV6IGFsb3JzIHZvdHJlIHLDqXN1bHRhdCBpbW3DqWRpYXRlbWVudC48YnI+PGJyPlRvdXRlcyBsZXMgcsOpcG9uc2VzIHNlIHRyb3V2ZW50IGRhbnMgbCdhcnRpY2xlIHByb3Bvc8OpIMOgIGxhIGxlY3R1cmUuIDxiPlZvdXMgw6p0ZXMgaWNpIHBvdXIgYXBwcmVuZHJlIGRlIG5vdXZlbGxlcyBjaG9zZXM8L2I+LCBtYWlzIGxpYnJlIMOgIHZvdXMgZCdlc3NheWVyIGQneSByw6lwb25kcmUgaW1tw6lkaWF0ZW1lbnQuPGJyPjxicj5RdWFuZCBsZSBzdWpldCBzJ3kgcHLDqnRlLCBuZSB2b3VzIMOpdG9ubmV6IHBhcyBzaSBjZXJ0YWluZXMgZGVzIHLDqXBvbnNlcyBwcm9wb3PDqWVzIHBldXZlbnQgw6p0cmUgdW4gcGV1IGTDqWNhbMOpZXMsIGFic3VyZGVzLi4uIE9uIHBldXQgYXBwcmVuZHJlIGF2ZWMgbGUgc291cmlyZSwgbm9uID8gOi0pPGJyPjxicj5VbmUgZm9pcyB2b3RyZSByw6lzdWx0YXQgb2J0ZW51LCBpbCB2b3VzIHNlcmEgcHJvcG9zw6kgZGUgY3LDqWVyIHVuIGNvbXB0ZSBwb3VyIGxlIHNhdXZlZ2FyZGVyLjxicj5DZSBjb21wdGUgdm91cyBwZXJtZXR0cmEgZGUgdGVzdGVyIGRlIG5vdXZlYXUgY2UgcXVpeiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudSBwbHVzaWV1cnMgam91cnMsIHNlbWFpbmVzLCBtb2lzLi4uIEV0IGRlIHJlY2V2b2lyIHLDqWd1bGnDqHJlbWVudCBkZSBub3V2ZWxsZXMgc3VnZ2VzdGlvbnMgZGUgbGVjdHVyZXMuPGJyPjxicj5NYWlzIDxiPmxhIGNyw6lhdGlvbiBkZSBjZSBjb21wdGUgZXN0IGZhY3VsdGF0aXZlPC9iPiBldCA8YSBocmVmPScvcXVpenMvJyB0aXRsZT0nTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzJz52b3VzIHBvdXZleiBwYXJjb3VyaXIgV2lraUxlcm5pIGxpYnJlbWVudDwvYT4uXCIsXG4gICAgbm9KU05vdGlmaWNhdGlvbjogXCJEw6lzb2zDqSwgbWFpcyBwb3VyIGwnaW5zdGFudCwgbCd1dGlsaXNhdGlvbiBkZSBXaWtpTGVybmkgbsOpY2Vzc2l0ZSBsJ2FjdGl2YXRpb24gZHUgSmF2YVNjcmlwdC5cIixcbn07IiwiLy8gLS0gR0VTVElPTiBEVSBGT1JNVUxBSVJFIFBFUk1FVFRBTlQgREUgU0UgQ09OTkVDVEVSXG5cbi8vLyBMJ3V0aWxpc2F0ZXVyIHBldXQgYXZvaXIgcsOpcG9uZHUgw6AgdW4gcXVpeiBhdmFudCBkJ2Fycml2ZXIgc3VyIGxhIHBhZ2UgZGUgY29ubmV4aW9uXG4vLy8gRGFucyBjZSBjYXMgaWwgZmF1dCBlbnJlZ2lzdHJlciBzb24gcsOpc3VsdGF0IGVuIG3Dqm1lIHRlbXBzLCB1bmUgZm9pcyBsYSBjb25uZXhpb24gdmFsaWTDqWVcblxuLy8vIExlIGNvbm5leGlvbiBwZXV0IHNlIGZhaXJlIGRpcmVjdGVtZW50IGljaSB2aWEgbGEgc2Fpc2llIGQndW4gbW90IGRlIHBhc3NlXG4vLy8gT3UgdmlhIGwnZW52b2kgZCd1biB0b2tlbiBwYXIgZS1tYWlsXG5cbi8vIEZpY2hpZXIgZGUgY29uZmlndXJhdGlvbiB0aXLDqXMgZHUgYmFja2VuZCA6XG5pbXBvcnQgeyBhcGlVcmwsIGF2YWlsYWJsZUxhbmdzLCBzaXRlVXJsLCB0aGVtZSB9IGZyb20gXCIuLi8uLi9jb25maWcvaW5zdGFuY2UuanNcIjtcbmNvbnN0IGxhbmc9YXZhaWxhYmxlTGFuZ3NbMF07XG5cbmltcG9ydCB7IGNvbm5lY3Rpb25Sb3V0ZSwgZ2V0TG9naW5MaW5rUm91dGUsIHVzZXJSb3V0ZXMgfSBmcm9tIFwiLi4vLi4vY29uZmlnL3VzZXJzLmpzXCI7XG5jb25zdCBjb25maWdUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi8uLi92aWV3cy9cIit0aGVtZStcIi9jb25maWcvXCIrbGFuZytcIi5qc1wiKTtcblxuLy8gSW1wb3J0YXRpb24gZGVzIGZvbmN0aW9ucyB1dGlsZSBhdSBzY3JpcHQgOlxuaW1wb3J0IHsgZ2V0TG9jYWx5LCByZW1vdmVMb2NhbHksIHNhdmVMb2NhbHkgfSBmcm9tIFwiLi90b29scy9jbGllbnRzdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyBhZGRFbGVtZW50IH0gZnJvbSBcIi4vdG9vbHMvZG9tLmpzXCI7XG5pbXBvcnQgeyBoZWxsb0RldiB9IGZyb20gXCIuL3Rvb2xzL2V2ZXJ5d2hlcmUuanNcIjtcbmltcG9ydCB7IGdldERhdGFzRnJvbUlucHV0cyB9IGZyb20gXCIuL3Rvb2xzL2Zvcm1zLmpzXCI7XG5pbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uL3Rvb2xzL21haW5cIjtcbmltcG9ydCB7IGNoZWNrQW5zd2VyRGF0YXMsIGNoZWNrU2Vzc2lvbiwgZ2V0Q29uZmlnLCBnZXRUaW1lRGlmZmVyZW5jZSwgc2V0U2Vzc2lvbiB9IGZyb20gXCIuL3Rvb2xzL3VzZXJzLmpzXCI7XG5cbi8vIERpY3Rpb25uYWlyZXMgOlxuY29uc3QgdHh0ID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi9nZW5lcmFsXCIpO1xuY29uc3QgdHh0VXNlcnMgPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL3VzZXJcIik7XG5cbi8vIFByaW5jaXBhdXggw6lsw6ltZW50cyBkdSBET00gbWFuaXB1bMOpcyA6XG5jb25zdCBteUZvcm0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImNvbm5lY3Rpb25cIik7XG5jb25zdCBkaXZNZXNzYWdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtZXNzYWdlXCIpO1xuY29uc3QgZGl2UmVzcG9uc2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJlc3BvbnNlXCIpO1xuXG5oZWxsb0RldigpO1xuXG4vLyBUZXN0IGRlIGNvbm5leGlvbiBkZSBsJ3V0aWxpc2F0ZXVyICsgYWZmaWNoYWdlIGZvcm11bGFpcmUgZCdpbnNjcmlwdGlvbi5cbmNvbnN0IGluaXRpYWxpc2UgPSBhc3luYyAoKSA9Plxue1xuICAgIHRyeVxuICAgIHtcbiAgICAgICAgY29uc3QgaXNDb25uZWN0ZWQ9YXdhaXQgY2hlY2tTZXNzaW9uKCk7XG4gICAgICAgIGlmKGlzQ29ubmVjdGVkKVxuICAgICAgICB7XG4gICAgICAgICAgICBzYXZlTG9jYWx5KFwibWVzc2FnZVwiLCB7IG1lc3NhZ2U6IHR4dFVzZXJzLmFscmVhZHlDb25uZWN0ZWQsIGNvbG9yOlwiaW5mb3JtYXRpb25cIiB9KTsvLyBwb3VyIGwnYWZmaWNoZXIgc3VyIGxhIHBhZ2Ugc3VpdmFudGVcbiAgICAgICAgICAgIGNvbnN0IHVzZXI9Z2V0TG9jYWx5KFwidXNlclwiLCB0cnVlKTtcbiAgICAgICAgICAgIGNvbnN0IGhvbWVQYWdlPXVzZXIuc3RhdHVzK1wiSG9tZVBhZ2VcIjtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIvXCIrY29uZmlnVGVtcGxhdGVbaG9tZVBhZ2VdKTtcbiAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHRVc2Vycy5hbHJlYWR5Q29ubmVjdGVkLCBcIlwiLCBbXCJpbmZvcm1hdGlvblwiXSk7Ly8gYXUgY2FzIG/DucKgYmxvY2FnZSByZWRpcmVjdGlvblxuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgbXlGb3JtLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgICAgICAgICAgaWYoIWlzRW1wdHkoZ2V0TG9jYWx5KFwibWVzc2FnZVwiKSkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZNZXNzYWdlLCBcInBcIiwgZ2V0TG9jYWx5KFwibWVzc2FnZVwiLCB0cnVlKS5tZXNzYWdlLCBcIlwiLCBbZ2V0TG9jYWx5KFwibWVzc2FnZVwiLCB0cnVlKS5jb2xvcl0pOztcbiAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJtZXNzYWdlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9ICAgICBcbiAgICB9XG4gICAgY2F0Y2goZSlcbiAgICB7XG4gICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHQuc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICB9XG59XG5pbml0aWFsaXNlKCk7XG5cbi8vIFRyYWl0ZW1lbnQgZGUgbCdlbnZvaSBkZXMgZG9ubsOpZXMgZGUgY29ubmV4aW9uIDpcbm15Rm9ybS5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIGZ1bmN0aW9uKGUpXG57XG4gICAgdHJ5XG4gICAge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGRpdlJlc3BvbnNlLmlubmVySFRNTD1cIlwiOy8vIGVmZmFjZSBkJ8OpdmVudHVlbHMgbWVzc2FnZXMgZMOpaiDDoCBhZmZpY2jDqXNcbiAgICAgICAgbGV0IGRhdGFzPWdldERhdGFzRnJvbUlucHV0cyhteUZvcm0pO1xuICAgICAgICBpZihpc0VtcHR5KGRhdGFzLnBhc3N3b3JkKSAmJiBpc0VtcHR5KGRhdGFzLmdldExvZ2luTGluaykpXG4gICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgdHh0VXNlcnMubmVlZENob29zZUxvZ2luV2F5LCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICBpZighaXNFbXB0eShkYXRhcy5nZXRMb2dpbkxpbmspKVxuICAgICAgICAgICAgICAgIHhoci5vcGVuKFwiUE9TVFwiLCBhcGlVcmwrdXNlclJvdXRlcytnZXRMb2dpbkxpbmtSb3V0ZSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgeGhyLm9wZW4oXCJQT1NUXCIsIGFwaVVybCt1c2VyUm91dGVzK2Nvbm5lY3Rpb25Sb3V0ZSk7XG4gICAgICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDApXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFpc0VtcHR5KHJlc3BvbnNlLm1lc3NhZ2UpKSBcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgLy8gY2FzIGQndW5lIGRlbWFuZGUgZGUgbGllbiBkZSBjb25uZXhpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteUZvcm0uc3R5bGUuZGlzcGxheT1cIm5vbmVcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgcmVzcG9uc2UubWVzc2FnZSwgXCJcIiwgW1wic3VjY2Vzc1wiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCFpc0VtcHR5KHJlc3BvbnNlLnVzZXJJZCkgJiYgIWlzRW1wdHkocmVzcG9uc2UuY29ubmV4aW9uVGltZSkgJiYgIWlzRW1wdHkocmVzcG9uc2UudG9rZW4pKVxuICAgICAgICAgICAgICAgICAgICAgICAgeyAgIC8vIGNhcyBkJ3VuZSBjb25uZXhpb24gZGlyZWN0ZSwgb24gY3LDqcOpIHVuZSBzZXNzaW9uIGRlIGNvbm5leGlvbiBldCByZWRpcmlnZSBsJ3V0aWxpc2F0ZXVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbm5leGlvbk1heFRpbWU9RGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5jb25uZXhpb25UaW1lLmVuZHNXaXRoKFwiZGF5c1wiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmV4aW9uTWF4VGltZSs9cGFyc2VJbnQocmVzcG9uc2UuY29ubmV4aW9uVGltZSwxMCkqMjQqMzYwMCoxMDAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmV4aW9uTWF4VGltZSs9cGFyc2VJbnQocmVzcG9uc2UuY29ubmV4aW9uVGltZSwxMCkqMzYwMCoxMDAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNlc3Npb24ocmVzcG9uc2UudXNlcklkLCByZXNwb25zZS50b2tlbiwgY29ubmV4aW9uTWF4VGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwibGFzdEFuc3dlclwiKTsvLyAhIGltcG9ydGFudCBwb3VyIG5lIHBhcyBlbnJlZ2lzdGVyIHBsdXNpZXVycyBmb2lzIGxlIHLDqXN1bHRhdCAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15Rm9ybS5zdHlsZS5kaXNwbGF5PVwibm9uZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHRVc2Vycy5jb25uZWN0aW9uT2ssIFwiXCIsIFtcInN1Y2Nlc3NcIl0pOy8vIGF1IGNhcyBvw7kgYmxvY2FnZSByZWRpcmVjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGwndXRpbGlzYXRldXIgcGV1dCBhdm9pciB0ZW50w6kgZCdhY2PDqWRlciDDoCB1bmUgYXV0cmUgcGFnZSBxdWUgc2EgcGFnZSBkJ2FjY2V1aWwgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmw9Z2V0TG9jYWx5KFwidXJsXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHNpdGVVcmwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFpc0VtcHR5KHVybCkgJiYgdXJsLmhyZWYuaW5kZXhPZihzaXRlVXJsKSE9PS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsPXVybC5ocmVmO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1cmxcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsPWNvbmZpZ1RlbXBsYXRlW3Jlc3BvbnNlLnN0YXR1cytcIkhvbWVQYWdlXCJdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2codXJsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKHVybCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3BvbnNlLmVycm9ycylcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShyZXNwb25zZS5lcnJvcnMpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVycm9ycyA9IHJlc3BvbnNlLmVycm9ycy5qb2luKFwiPGJyPlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvcnMgPSB0eHQuc2VydmVyRXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgcmVzcG9uc2UuZXJyb3JzLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgICAgICAgICAgIGlmKGRhdGFzKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRhdGFzLnRpbWVEaWZmZXJlbmNlPWdldFRpbWVEaWZmZXJlbmNlKCk7XG4gICAgICAgICAgICAgICAgLy8gc2kgbCd1dGlsaXNhdGV1ciBhIHByw6ljw6lkZW1lbnQgcsOpcG9uZHUgw6AgdW4gcXVpeiwgaidham91dGUgbGVzIGluZm9zIGRlIHNvbiByw6lzdWx0YXQgOlxuICAgICAgICAgICAgICAgIGRhdGFzPWNoZWNrQW5zd2VyRGF0YXMoZGF0YXMpO1xuICAgICAgICAgICAgICAgIHhoci5zZW5kKEpTT04uc3RyaW5naWZ5KGRhdGFzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2goZSlcbiAgICB7XG4gICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHQuc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICB9XG59KTsiLCIvLyBGT05DVElPTlMgVVRJTEVTIEFVIFNUT0NLQUdFIExPQ0FMIChTRVNTSU9OLCBDT09LSUVTLCBJTkRFWERCLCBFVEMuKVxuLy8gUmV2ZW5pciBwb3VyIGfDqXJlciBsZSBjYXMgb8O5IGxvY2FsLnN0b3JhZ2Ugbidlc3QgcGFzIGNvbm51IHBvdXIgdXRpbGlzZXIgY29va2llXG4gICAgXG5leHBvcnQgY29uc3Qgc2F2ZUxvY2FseSA9IChuYW1lLCBkYXRhKSA9Plxue1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKG5hbWUsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldExvY2FseSA9IChuYW1lLCBqc29uPWZhbHNlKSA9Plxue1xuICAgIGlmKGpzb24pXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKG5hbWUpKTtcbiAgICBlbHNlXG4gICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJlbW92ZUxvY2FseSA9IChuYW1lKSA9Plxue1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKG5hbWUpO1xufSIsImltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG4vLyBGb25jdGlvbiBhc3NvY2lhbnQgbGVzIGF0dHJpYnV0cyBmb3VybmlzIMOgIHVuIGNoYW1wIGRlIGZvcm11bGFpcmVcbmV4cG9ydCBjb25zdCBhZGRFbGVtZW50ID0gKGVsdFBhcmVudCwgZWx0VHlwZSwgZWx0Q29udGVudD1cIlwiLCBlbHRJZD1cIlwiLCBlbHRDbGFzcz1bXSwgZWx0QXR0cmlidXRlcz17fSwgcmVwbGFjZT10cnVlKSA9Plxue1xuICAgIGlmKGlzRW1wdHkoZWx0VHlwZSkgfHwgaXNFbXB0eShlbHRQYXJlbnQpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZWxzZVxuICAgIHtcbiAgICAgICAgY29uc3QgbmV3RWxlbWVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGVsdFR5cGUpO1xuICAgICAgICBcbiAgICAgICAgaWYoIWlzRW1wdHkoZWx0SWQpKS8vIHRlc3RlciBzaSBsJ2lkIG4nZXN0IHBhcyBkw6lqw6AgdXRpbGlzw6kgZGFucyBsZSBET00gP1xuICAgICAgICAgICAgbmV3RWxlbWVudC5pZD1lbHRJZDtcblxuICAgICAgICBpZihBcnJheS5pc0FycmF5KGVsdENsYXNzKSAmJiBlbHRDbGFzcy5sZW5ndGghPTApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGZvcihsZXQgaSBpbiBlbHRDbGFzcylcbiAgICAgICAgICAgICAgICBuZXdFbGVtZW50LmNsYXNzTGlzdC5hZGQoZWx0Q2xhc3NbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYodHlwZW9mIGVsdEF0dHJpYnV0ZXMgPT09IFwib2JqZWN0XCIpIC8vICEhIHRvdXMgbGVzIG9iamV0cyBuZSBzb250IHBhcyBva1xuICAgICAgICB7XG4gICAgICAgICAgICBmb3IobGV0IGF0dHJpYnV0TmFtZSBpbiBlbHRBdHRyaWJ1dGVzKVxuICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0TmFtZSwgZWx0QXR0cmlidXRlc1thdHRyaWJ1dE5hbWVdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFpc0VtcHR5KGVsdENvbnRlbnQpKVxuICAgICAgICAgICAgbmV3RWxlbWVudC5pbm5lckhUTUw9ZWx0Q29udGVudC5yZXBsYWNlKC9cXG4vZyxcIjxicj5cIik7Ly8gaW5uZXJIVE1MIHBlcm1ldCBkJ2Fqb3V0ZXIgZHUgdGV4dGUgYXlhbnQgbHVpLW3Dqm1lIGRlcyBiYWxpc2VzLCBldGMuXG4gICAgICAgICAgICBcbiAgICAgICAgaWYocmVwbGFjZSlcbiAgICAgICAgICAgIGVsdFBhcmVudC5pbm5lckhUTUw9XCJcIjtcbiAgICAgICAgZWx0UGFyZW50LmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpO1xuICAgIH0gICAgXG59IiwiLy8gQ2Ugc2NyaXB0IGZvdXJuaXQgZGVzIGZvbmN0aW9ucyB1dGlsaXPDqWVzIHN1ciB0b3V0ZXMgbGVzIHBhZ2VzIGR1IHNpdGVcblxuZXhwb3J0IGNvbnN0IGhlbGxvRGV2ID0gKCkgPT5cbntcbiAgICBjb25zb2xlLmxvZyhcIioqKiogSGVsbG8gYW1pIGTDqXZlbG9wcGV1ciA6LSlcXG4gTGUgY29kZSBkZSBXaWtpTGVybmkgZXN0IGxpYnJlIGV0IGVzdCBsaXNpYmxlIHN1ciBnaXRsYWIgOiBcXG4gQm9ubmUgbGVjdHVyZSA6LSkgXFxuIFBvdXIgbGVzIHN1Z2dlc3Rpb25zIGQnYW3DqWxpb3JhdGlvbiBvdSBxdWVzdGlvbnMgOiBkZXZAd2lsaWxlcm5pLmNvbSAqKioqXCIpO1xuICAgIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgY29uc3QgdXBkYXRlQWNjb3VudExpbmsgPSAoc3RhdHVzLCBjb25maWdUZW1wbGF0ZSkgPT5cbntcbiAgICBjb25zdCBsaW5rPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYWNjb3VudEhlYWRMaW5rXCIpO1xuICAgIGNvbnN0IGhvbWVQYWdlPXN0YXR1cytcIkhvbWVQYWdlXCI7XG4gICAgbGluay5ocmVmPVwiL1wiK2NvbmZpZ1RlbXBsYXRlW2hvbWVQYWdlXTtcbn0iLCJpbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gRm9uY3Rpb24gYXNzb2NpYW50IGxlcyBhdHRyaWJ1dHMgZm91cm5pcyDDoCB1biBjaGFtcCBkZSBmb3JtdWxhaXJlXG5leHBvcnQgY29uc3Qgc2V0QXR0cmlidXRlc1RvSW5wdXRzID0gKGlucHV0c0NvbmYsIG15Rm9ybSkgPT5cbntcbiAgICBmb3IobGV0IGkgaW4gbXlGb3JtLmVsZW1lbnRzKVxuICAgIHtcbiAgICAgICAgaWYoIWlzRW1wdHkobXlGb3JtLmVsZW1lbnRzW2ldLmlkKSlcbiAgICAgICAge1xuICAgICAgICAgICAgbGV0IGlkSW5wdXQ9bXlGb3JtLmVsZW1lbnRzW2ldLmlkO1xuICAgICAgICAgICAgaWYoaW5wdXRzQ29uZltpZElucHV0XSE9PXVuZGVmaW5lZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5wdXRIVE1MPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkSW5wdXQpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGF0dHJpYnV0ZSBpbiBpbnB1dHNDb25mW2lkSW5wdXRdKVxuICAgICAgICAgICAgICAgICAgICBpbnB1dEhUTUwuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgaW5wdXRzQ29uZltpZElucHV0XVthdHRyaWJ1dGVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gUsOpY3Vww6hyZSB0b3V0ZXMgbGVzIHZhbGV1cnMgZGUgY2hhbXBzIGVuIG9tZXR0YW50IGxlcyBjaGVja2JveCBub24gY29jaMOpZXMsIGV0Yy5cbmV4cG9ydCBjb25zdCBnZXREYXRhc0Zyb21JbnB1dHMgPSAobXlGb3JtKSA9Plxue1xuICAgIGNvbnN0IGRhdGFzPXt9O1xuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKG15Rm9ybSk7XG4gICAgZm9yKGxldCBlbnRyaWUgb2YgZm9ybURhdGEuZW50cmllcygpKVxuICAgICAgIGRhdGFzW2VudHJpZVswXV09ZW50cmllWzFdO1xuICAgIHJldHVybiBkYXRhcztcbn1cblxuLy8gVmlkZSB0b3VzIGxlcyBjaGFtcHMgZCd1biBmb3JtdWxhaXJlLCB5IGNvbXByaXMgaGlkZGVuLCBjaGVja2JveCwgZXRjLlxuLy8gUmV2b2lyIHBvdXIgbGVzIHNlbGVjdFxuZXhwb3J0IGNvbnN0IGVtcHlGb3JtID0gKG15Rm9ybSkgPT5cbntcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShteUZvcm0pO1xuICAgIGZvcihsZXQgZW50cmllIG9mIGZvcm1EYXRhLmVudHJpZXMoKSlcbiAgICB7XG4gICAgICAgIGlmKG15Rm9ybS5lbGVtZW50c1tlbnRyaWVbMF1dLnR5cGU9PVwiY2hlY2tib3hcIiB8fCBteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS50eXBlPT1cInJhZGlvXCIpXG4gICAgICAgICAgICBteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS5jaGVja2VkPWZhbHNlO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS52YWx1ZT1cIlwiO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8vIFZpZGUgZXQgY2FjaGUgbGUgZm9ybXVsYWlyZVxuZXhwb3J0IGNvbnN0IGVtcHlBbmRIaWRlRm9ybSA9IChteUZvcm0pID0+XG57XG4gICAgZW1weUZvcm0obXlGb3JtKTtcbiAgICBteUZvcm0uc3R5bGUuZGlzcGxheT1cIm5vbmVcIjtcbn0iLCJpbXBvcnQgeyBhcGlVcmwsIGF2YWlsYWJsZUxhbmdzLCBzaXRlVXJsLCB0aGVtZSB9IGZyb20gXCIuLi8uLi8uLi9jb25maWcvaW5zdGFuY2UuanNcIjtcbmNvbnN0IGxhbmc9YXZhaWxhYmxlTGFuZ3NbMF07XG5cbmNvbnN0IGNvbmZpZ1RlbXBsYXRlID0gcmVxdWlyZShcIi4uLy4uLy4uL3ZpZXdzL1wiK3RoZW1lK1wiL2NvbmZpZy9cIitsYW5nK1wiLmpzXCIpO1xuaW1wb3J0IHsgIGNoZWNrTG9naW5Sb3V0ZSwgdGltZURpZmZlcmVuY2VNYXgsIHRpbWVEaWZmZXJlbmNlTWluLCB1c2VyUm91dGVzIH0gZnJvbSBcIi4uLy4uLy4uL2NvbmZpZy91c2Vycy5qc1wiO1xuXG5pbXBvcnQgeyBnZXRMb2NhbHksIHJlbW92ZUxvY2FseSwgc2F2ZUxvY2FseSB9IGZyb20gXCIuL2NsaWVudHN0b3JhZ2UuanNcIjtcbmltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG4vLyBSw6ljdXDDqHJlIGxlcyBkb25uw6llcyBkZSBjb25maWd1cmF0aW9uIGRlcyB1dGlsaXNhdGV1cnNcbi8vIMOAIHRlcm1lLCB1biBmaWNoaWVyIHN0YXRpcXVlIGltcG9ydGFibGUgY29tbWUgbW9kdWxlIGRldnJhaXQgw6l2aXRlciB1bmUgcmVxdcOqdGUgYWpheFxuZXhwb3J0IGNvbnN0IGdldENvbmZpZyA9ICBhc3luYyAoKSA9Plxue1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuICAgIHtcbiAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHhoci5vcGVuKFwiR0VUXCIsIGFwaVVybCtcIi91c2VyL2dldGNvbmZpZ1wiKTtcbiAgICAgICAgeGhyLm9ubG9hZCA9ICgpID0+IHJlc29sdmUoSlNPTi5wYXJzZSh4aHIucmVzcG9uc2VUZXh0KSk7XG4gICAgICAgIHhoci5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICAgICAgeGhyLnNlbmQoKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldFRpbWVEaWZmZXJlbmNlID0gKCkgPT5cbntcbiAgICBjb25zdCB0aW1lTG9jYWw9bmV3IERhdGUoKS5nZXRUaW1lem9uZU9mZnNldCgpO1xuICAgIGlmKHRpbWVMb2NhbCA+IHRpbWVEaWZmZXJlbmNlTWF4IHx8IHRpbWVMb2NhbCA8IHRpbWVEaWZmZXJlbmNlTWluKVxuICAgICAgICByZXR1cm4gMDtcbiAgICBlbHNlIHJldHVybiB0aW1lTG9jYWw7XG59XG5cbi8vIE9uIGVubMOodmUgdm9sb250YWlyZW1lbnQgbGVzIDAvTyBwb3VyIMOpdml0ZXIgbGVzIGNvbmZ1c2lvbnMgIVxuLy8gRXQgbWlldXggdmF1dCBhdXNzaSBkw6lidXRlciBldCBmaW5pciBwYXIgdW5lIGxldHRyZSBzaW1wbGUuXG5leHBvcnQgY29uc3QgZ2V0UGFzc3dvcmQgPSAobmJDYXJNaW4sIG5iQ2FyTWF4KSA9Plxue1xuICAgIGNvbnN0IG5iQ2FyPW5iQ2FyTWluK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoobmJDYXJNYXgtbmJDYXJNaW4pKTtcbiAgICBjb25zdCBsZXR0ZXJzPVwiQUJDREVGR0hJSktMTU5QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ucHFyc3R1dnd4eXpcIjtcbiAgICBjb25zdCBvdGhlcnM9XCIxMjM0NTY3ODkhPy4qLV8lQCbDicOAw4jDmeKCrCTDgsOKw5vDjlwiO1xuICAgIGxldCBwYXNzd29yZD1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldO1xuICAgIGZvcihsZXQgaT0xO2k8KG5iQ2FyLTEpO2krKylcbiAgICB7XG4gICAgICAgIGlmKChpICUgMikgPT09MSlcbiAgICAgICAgICAgIHBhc3N3b3JkKz1vdGhlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKm90aGVycy5sZW5ndGgpXTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcGFzc3dvcmQrPWxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxldHRlcnMubGVuZ3RoKV07ICAgXG4gICAgfVxuICAgIHBhc3N3b3JkKz1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldO1xuICAgIHJldHVybiBwYXNzd29yZDtcbn1cblxuLy8gSid1dGlsaXNlIGxlIHN0b2NrYWdlIGxvY2FsIGR1IG5hdmlnYXRldXIgcG91ciBlbnJlZ2lzdHJlciBsZXMgZG9ubsOpZXMgcGVybWV0dGFudCBkZSByZWNvbm5hw650cmUgbCd1dGlsaXNhdGV1ciBwYXIgbGEgc3VpdGVcbi8vIFNldWwgbGUgc2VydmV1ciBwb3VycmEgdsOpcmlmaWVyIHF1ZSBsZXMgaWRlbnRpZmlhbnRzIHNvbnQgKHRvdWpvdXJzKSB2YWxpZGVzLlxuZXhwb3J0IGNvbnN0IHNldFNlc3Npb24gPSAodXNlcklkLCB0b2tlbiwgZHVyYXRpb25UUykgPT5cbntcbiAgICBjb25zdCBzdG9yYWdlVXNlcj1cbiAgICB7XG4gICAgICAgIGlkOiB1c2VySWQsXG4gICAgICAgIHRva2VuOiB0b2tlbixcbiAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uVFNcbiAgICB9XG4gICAgc2F2ZUxvY2FseShcInVzZXJcIiwgc3RvcmFnZVVzZXIpO1xufVxuXG4vLyBWw6lyaWZpZSBxdSdpbCB5IGEgZGVzIGRvbm7DqWVzIGxvY2FsZXMgY29uY2VybmFudCBsZSByw6lzdWx0YXQgZCd1biBxdWl6XG4vLyBFdCBsZXMgYWpvdXRlIGF1eCBkb25uw6llcyBlbnZvecOpZXMgcGFyIGxlcyBmb3JtdWxhaXJlcyBkJ2luc2NyaXB0aW9uL2Nvbm5leGlvbiBzaSBjJ2VzdCBsZSBjYXNcbmV4cG9ydCBjb25zdCBjaGVja0Fuc3dlckRhdGFzID0gKGRhdGFzKSA9Plxue1xuICAgIGNvbnN0IGxhc3RBbnN3ZXI9Z2V0TG9jYWx5KFwibGFzdEFuc3dlclwiKTtcbiAgICBpZighaXNFbXB0eShsYXN0QW5zd2VyKSlcbiAgICB7XG4gICAgICAgIGNvbnN0IGFuc3dlcj1KU09OLnBhcnNlKGxhc3RBbnN3ZXIpO1xuICAgICAgICBpZighaXNFbXB0eShhbnN3ZXIuZHVyYXRpb24pICYmICFpc0VtcHR5KGFuc3dlci5uYkNvcnJlY3RBbnN3ZXJzKSAmJiAhaXNFbXB0eShhbnN3ZXIuUXVlc3Rpb25uYWlyZUlkKSAmJiAhaXNFbXB0eShhbnN3ZXIubmJRdWVzdGlvbnMpKVxuICAgICAgICB7XG4gICAgICAgICAgICBkYXRhcy5kdXJhdGlvbj1hbnN3ZXIuZHVyYXRpb247XG4gICAgICAgICAgICBkYXRhcy5uYkNvcnJlY3RBbnN3ZXJzPWFuc3dlci5uYkNvcnJlY3RBbnN3ZXJzO1xuICAgICAgICAgICAgZGF0YXMuUXVlc3Rpb25uYWlyZUlkPWFuc3dlci5RdWVzdGlvbm5haXJlSWQ7XG4gICAgICAgICAgICBkYXRhcy5uYlF1ZXN0aW9ucz1hbnN3ZXIubmJRdWVzdGlvbnM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGFzO1xufVxuXG4vLyBDZXR0ZSBmb25jdGlvbiB0ZXN0ZSBsYSBjb25uZXhpb24gZGUgbCd1dGlsaXNhdGV1ciBkJ3VuZSBwYWdlXG4vLyBPbiBwZXV0IGZvdXJuaXMgdW5lIGxpc3RlIGRlIHN0YXR1dHMgYWNjZXB0w6lzIChzaSB2aWRlID0gdG91cyksIGFpbnNpIHF1J3VuZSB1cmwgZGUgcmVkaXJlY3Rpb24gc2kgbm9uIGNvbm5lY3TDqSwgdW4gbWVzc2FnZSBkJ2VycmV1ciDDoCBhZmZpY2hlciBzdXIgbGEgcGFnZSBkZSBkZXN0aW5hdGlvbiBldCBsJ3VybCBzdXIgbGFxdWVsbGUgcmV2ZW5pciB1bmUgZm9pcyBjb25uZWN0w6lcbmV4cG9ydCBjb25zdCBjaGVja1Nlc3Npb24gPSBhc3luYyAoc3RhdHVzPVtdLCB1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKSA9Plxue1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuICAgIHtcbiAgICAgICAgY29uc3QgdXNlckRhdGFzPWdldExvY2FseShcInVzZXJcIik7XG4gICAgICAgIGlmKGlzRW1wdHkodXNlckRhdGFzKSlcbiAgICAgICAge1xuICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCB1c2VyPUpTT04ucGFyc2UodXNlckRhdGFzKTtcbiAgICAgICAgICAgIGlmKGlzRW1wdHkodXNlci5pZCkgfHzCoGlzRW1wdHkodXNlci50b2tlbikgfHwgaXNFbXB0eSh1c2VyLmR1cmF0aW9uKSB8fCB1c2VyLmR1cmF0aW9uIDwgRGF0ZS5ub3coKSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBhcGlVcmwrdXNlclJvdXRlcytjaGVja0xvZ2luUm91dGUrdXNlci50b2tlbik7XG4gICAgICAgICAgICAgICAgeGhyLm9ubG9hZCA9ICgpID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDIwMCAmJiByZXNwb25zZS5pc1ZhbGlkICYmIHJlc3BvbnNlLmlkICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2UuaWQ9PT11c2VyLmlkKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIubmFtZT1yZXNwb25zZS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIubGFuZ3VhZ2U9cmVzcG9uc2UubGFuZ3VhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci50aW1lRGlmZmVyZW5jZT1yZXNwb25zZS50aW1lRGlmZmVyZW5jZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnN0YXR1cz1yZXNwb25zZS5zdGF0dXM7Ly8gbGUgdG9rZW4gZXQgZGUgdG91dGUgZmHDp29uIHbDqXJpZmllciDDoCBjaGFxdWUgcmVxdcOqdGUgw6AgbCdBUElcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlTG9jYWx5KFwidXNlclwiLCB1c2VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaSBpbCBzJ2FnaXQgZCd1biBcInVzZXJcIiBldCBxdWUgc29uIGFib25uZW1lbnQgYSBleHBpcsOpLCBqZSBsZSByZWRpcmlnZSB2ZXJzIGxhIGNhaXNzZSA6LSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5zdGF0dXM9PT1cInVzZXJcIiAmJiByZXNwb25zZS5uYkRheXNPayA8PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsQWNjb3VudD1zaXRlVXJsK1wiL1wiK2NvbmZpZ1RlbXBsYXRlW2xhbmddLmFjY291bnRQYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKHVybEFjY291bnQpPT09LTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKFwiL1wiK2NvbmZpZ1RlbXBsYXRlW2xhbmddLmFjY291bnRQYWdlKTsvLyBwYXNzw6llIGRpcmVjdGVtZW50IGljaSwgbCdhbmNyZSAjc3Vic2NyaWJlIG5lIGZvbmN0aW9ubmUgcGFzICE/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHN0YXR1cy5sZW5ndGghPT0wICYmIHN0YXR1cy5pbmRleE9mKHJlc3BvbnNlLnN0YXR1cyk9PT0tMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgeGhyLm9uZXJyb3IgPSAoKSA9PiByZWplY3QoeGhyLnN0YXR1c1RleHQpO1xuICAgICAgICAgICAgICAgIHhoci5zZW5kKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8vIENldHRlIGZvbmN0aW9uIHNlcnQgw6AgbGEgcHLDqWPDqWRlbnRlIGVuIGNhcyBkZSBjb25uZXhpb24gbm9uIHZhbGlkZVxuY29uc3QgcmVkaXJlY3RVc2VyID0gKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpID0+XG57XG4gICAgaWYoIWlzRW1wdHkobWVzc2FnZSkpXG4gICAgICAgIHNhdmVMb2NhbHkoXCJtZXNzYWdlXCIsIG1lc3NhZ2UpO1xuICAgIGlmKCFpc0VtcHR5KHVybFdhbnRlZCkpXG4gICAgICAgIHNhdmVMb2NhbHkoXCJ1cmxcIiwgdXJsV2FudGVkKTtcbiAgICBpZighaXNFbXB0eSh1cmxSZWRpcmVjdGlvbikpXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24odXJsUmVkaXJlY3Rpb24pO1xufSJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/front/public/JS/deconnection.app.js b/front/public/JS/deconnection.app.js new file mode 100644 index 0000000..f70fdb6 --- /dev/null +++ b/front/public/JS/deconnection.app.js @@ -0,0 +1,1113 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "./src/deconnection.js"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "../config/instance.js": +/*!*****************************!*\ + !*** ../config/instance.js ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var _module$exports; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var users = __webpack_require__(/*! ./users */ "../config/users.js"); + +var questionnaires = __webpack_require__(/*! ./questionnaires */ "../config/questionnaires.js"); + +module.exports = (_module$exports = { + apiUrl: "http://localhost:3000/api", + siteUrl: "http://localhost:8080", + adminName: "Fabrice", + adminEmail: "dev@wikilerni.com", + senderName: "WikiLerni", + senderEmail: "bonjour@wikilerni.com", + adminLang: "fr", + theme: "default", + // le thème utilisé (dans /views) pour générer les pages HTML. Contient ses propres fichiers de configuration. + availableLangs: ["fr"], + // Languages in which the site is available. The first one is the default one. + siteName: "WikiLerni", + beginCodeGodfather: "wikilerni", + // case-sensitive and can't contain "@" ! + cronTimingAlertInSeconde: 120, + // for logs + responseTimingAlertInSeconde: 3, + // idem + tokenSignupValidationTimeInHours: "48h", + // https://github.com/zeit/ms + tokenLoginLinkTimeInHours: "1h", + tokenConnexionMinTimeInHours: "24h", + tokenConnexionMaxTimeInDays: "180 days", + tokenLoginChangingTimeInHours: "1h", + // for email & password changing + tokenDeleteUserTimeInHours: "1h", + tokenUnsubscribeLinkTimeInDays: "7 days", + // token send with subscription's emails + freeAccountTimingInDays: 10, + freeAccountExpirationNotificationInDays: 5, + accountExpirationFirstNotificationInDays: 14, + accountExpirationSecondNotificationInDays: 5, + inactiveAccountTimeToDeleteInDays: 180, + // Questionnaires: + nbQuestionsMin: 1, + // minimum number of questions for the questionnaire to be publishable + nbQuestionsMax: 10, + // if 0 = not maximum + nbChoicesMax: 10, + nbNewQuestionnaires: 10, + // for RSS, etc. + hourGiveNewQuestionnaireBegin: 1, + // in user local time + hourGiveNewQuestionnaireEnd: 24, + // idem + numberNewQuestionnaireAtSameTime: 50, + // for mass mailing + minSearchQuestionnaires: 3, + // Illustrations: + nbIllustrationsMin: 0, + nbIllustrationsMax: 1, + maxIllustrationSizeinOctet: 1000000, + // pas contrôlé pour l'instant. À revoir. + mimeTypesForIllustration: ["image/jpg", "image/jpeg", "image/png", "image/gif", "image/png"], + // -- Upload and resize: + illustrationsWidthMaxInPx: 400, + illustrationsMiniaturesWidthMaxInPx: 200, + // Links: + nbLinksMin: 1, + nbLinksMax: 1 +}, _defineProperty(_module$exports, "nbQuestionsMin", questionnaires.nbQuestionsMin), _defineProperty(_module$exports, "nbQuestionsMax", questionnaires.nbQuestionsMax), _defineProperty(_module$exports, "nbChoicesMax", questionnaires.nbChoicesMax), _defineProperty(_module$exports, "passwordMinLength", users.password.minlength), _defineProperty(_module$exports, "dirCacheUsers", users.dirCacheUsers), _defineProperty(_module$exports, "dirCacheUsersAnswers", users.dirCacheUsersAnswers), _defineProperty(_module$exports, "dirCacheQuestionnaires", questionnaires.dirCacheQuestionnaires), _defineProperty(_module$exports, "dirCacheQuestions", questionnaires.dirCacheQuestions), _defineProperty(_module$exports, "dirCacheUsersQuestionnaires", questionnaires.dirCacheUsersQuestionnaires), _defineProperty(_module$exports, "dirHTMLQuestionnaire", questionnaires.dirHTMLQuestionnaire), _defineProperty(_module$exports, "dirWebQuestionnaire", questionnaires.dirWebQuestionnaire), _module$exports); + +/***/ }), + +/***/ "../config/questionnaires.js": +/*!***********************************!*\ + !*** ../config/questionnaires.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + // API'routes (after "apiUrl" defined in instance.js) + questionnaireRoutes: "/questionnaire", + getQuestionnaireRoutes: "/get", + previewQuestionnaireRoutes: "/preview", + publishedQuestionnaireRoutes: "/quiz/", + saveAnswersRoute: "/answer/", + getStatsQuestionnaires: "/stats/", + searchQuestionnairesRoute: "/search", + searchAdminQuestionnairesRoute: "/searchadmin", + getListNextQuestionnaires: "/getlistnextquestionnaires/", + // -- questions & choices : + questionsRoute: "/question/", + // -- tags : + tagsSearchRoute: "/tags/search/", + // -- answers : + getQuestionnairesWithoutAnswer: "/withoutanswer/user/", + getPreviousAnswers: "/user/answers/", + getStatsAnswers: "/user/anwswers/stats/", + getAdminStats: "/getadminstats/", + // forms : à compléter avec valeurs par défaut, etc. cf modèle + Questionnaire: { + title: { + maxlength: 255, + required: true + }, + slug: { + maxlength: 150 + }, + // champ requis mais calculé à partir du titre qd vide + introduction: { + required: true + } + }, + searchQuestionnaires: { + minlength: 3, + required: true + }, + Question: { + text: { + maxlength: 255, + required: true + }, + rank: { + required: true, + min: 1, + defaultValue: 1 + } + }, + Choice: { + text: { + maxlength: 255, + required: true + } + }, + nbQuestionsMin: 1, + nbQuestionsMax: 10, + nbChoicesMax: 10, + nbTagsMin: 0, + nbTagsMax: 0, + // 0 = not max + // JSON and HTML dir + dirCacheQuestionnaires: "datas/questionnaires", + dirCacheQuestions: "datas/questionnaires/questions", + dirCacheUsersQuestionnaires: "datas/users/questionnaires", + dirCacheTags: "datas/questionnaires/tags", + dirHTMLQuestionnaire: "front/public/quiz", + dirHTMLTags: "front/public/quizs", + dirWebQuestionnaire: "quiz", + //pour url page + dirWebTags: "quizs" // idem + +}; + +/***/ }), + +/***/ "../config/users.js": +/*!**************************!*\ + !*** ../config/users.js ***! + \**************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + // API'routes (after "apiUrl" defined in instance.js) + userRoutes: "/user", + subscribeRoute: "/signup", + getGodfatherRoute: "/getgodfatherid", + checkIfIsEmailfreeRoute: "/isemailfree", + checkSubscribeTokenRoute: "/validation/", + checkLoginRoute: "/checklogin/", + connectionRoute: "/login", + getLoginLinkRoute: "/getloginlink", + connectionWithLinkRoute: "/checkloginlink", + getUserInfos: "/get/", + createUserRoute: "/create", + validateUserRoute: "/validate/", + updateUserInfos: "/modify/", + searchUserRoute: "/search/", + getGodChilds: "/getgodchilds/", + checkNewLoginLinkRoute: "/confirmnewlogin/", + checkDeleteLinkRoute: "/confirmdelete/", + getPayments: "/payment/getforoneuser/", + unsubscribeRoute: "/subscription/stop/", + getAdminStats: "/getadminstats/", + // forms : à compléter avec valeurs par défaut, etc. cf modèle + name: { + maxlength: 70, + required: true + }, + email: { + maxlength: 255, + required: true + }, + password: { + minlength: 8, + maxlength: 72, + required: true + }, + // https://www.npmjs.com/package/bcrypt#security-issues-and-concerns + newPassword: { + minlength: 8, + maxlength: 72 + }, + codeGodfather: { + maxlength: 255 + }, + cguOk: { + value: "true", + required: true + }, + timeDifferenceMin: -720, + timeDifferenceMax: 840, + // JSON dir + dirCacheUsers: "datas/users", + dirCacheUsersAnswers: "datas/users/questionnaires/answers" +}; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/general$": +/*!**************************************!*\ + !*** ../lang sync ^\.\/.*\/general$ ***! + \**************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/general": "../lang/fr/general.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/general$"; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/user$": +/*!***********************************!*\ + !*** ../lang sync ^\.\/.*\/user$ ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/user": "../lang/fr/user.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/user$"; + +/***/ }), + +/***/ "../lang/fr/general.js": +/*!*****************************!*\ + !*** ../lang/fr/general.js ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + siteHTMLTitle: "WikiLerni : qu'allez-vous apprendre aujourd'hui ?", + siteMetaDescription: "Chaque jour, testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.", + scriptTimingInfo: "Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", + scriptTimingAlert: "*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", + serverError: "Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.", + serverErrorAdmin: "Bug de l'application :", + neededParams: "Des paramètres nécessaires manquants sont manquants.", + badUrl: "Tentative d'accès à une page n'existant pas :", + notValidFormat: "Format non valide.", + notAllowed: "Vous n'avez pas les droits nécessaires pour cette action.", + notRequired: "Facultatif.", + updateBtnTxt: "Modifier", + addBtnTxt: "Ajouter", + deleteBtnTxt: "Supprimer", + addOkMessage: "Les données ont bien été enregistrées.", + updateOkMessage: "La mise à jour à jour a bien été enregistrée.", + deleteOkMessage: "La suppression a bien été enregistrée.", + failAuth: "Erreur d'authentification.", + failAuthHeader: "Absence de header Authorization.", + failAuthToken: "Token invalide ou utilisateur non trouvé.", + failAuthId: "Identifiant non valide : ", + failAuthCron: "Tentative de lancement d'un cron sans le bon token.", + previousPage: "Page précédente", + nextPage: "Page suivante", + btnLinkToQuestionnaire: "Aller au quiz !", + statsAdmin: "Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium." +}; + +/***/ }), + +/***/ "../lang/fr/user.js": +/*!**************************!*\ + !*** ../lang/fr/user.js ***! + \**************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + notFound: "L'utilisateur n'a pas été trouvé.", + needName: "Merci de choisir un nom d'utilisateur.", + needNotTooLongName: "Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.", + needEmail: "Merci de saisir votre adresse e-mail.", + needUniqueEmail: "L'adresse e-mail que vous avez saisie est déjà utilisée par un autre utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.", + needNotTooLongEmail: "Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.", + needPassWord: "Merci de fournir un mot de passe.", + needLongPassWord: "Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.", + passwordCopied: "Le mot de passe généré a été copié dans le presse-papier. Vous pouvez le recopier où vous le souhaiter.", + needStatus: "Il manque le statut.", + needLanguage: "Il manque le code langue.", + needValidLastConnectionDate: "La date de dernière connexion n'est pas valide.", + needSMTP: "Il manque le serveur SMTP.", + needSMTPNotFound: "Il manque le serveur SMTP.", + needKnowNewsletterOk: "Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.", + needTimeDifference: "Il faut connaître le nombre de minutes du décalage horaire.", + needMinTimeDifference: "Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.", + needMaxTimeDifference: "Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.", + needUGCOk: "Vous devez accepter les CGU pour pouvoir créer votre compte. ", + godfatherNotFound: "Aucun utilisateur valide trouvé pour ce code parrain.", + godfatherFound: "Votre parrain a bien été trouvé !", + mailValidationMessage: "Votre inscription est bien enregistrée.\nPour la finaliser, merci de cliquer dans les 24H sur le lien de confirmation qui vient de vous être envoyé par e-mail.", + mailValidationLinkSubject: "Merci de valider votre compte", + mailValidationLinkSBodyTxt: "Bonjour USER_NAME,\n\nPour valider votre compte, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL", + mailValidationLinkSBodyHTML: "

Bonjour USER_NAME,

Pour valider votre compte, merci de cliquer sur le lien suivant dans les 24h.

Valider.

", + validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue !
Vous pouvez sans tarder vous connecter ci-dessous pour accéder à votre compte.", + validationMessageAdmin: "Le compte a bien été validé.", + validationAlreadyMessage: "Il semble que vous ayez déjà validé votre compte.", + validationAlreadyMessageAdmin: "Ce compte a déjà été validé.", + mailWelcomeSubject: "Bienvenue !", + mailWelcomeBodyTxt: "Bonjour USER_NAME,\nVotre venez de valider votre inscription à NOM_SITE.\nMerci et à bientôt !", + mailWelcomeBodyHTML: "

Bonjour USER_NAME,

Votre venez de valider votre inscription à NOM_SITE.

Merci et à bientôt !

", + mailThankGodfatherSubject: "Merci !", + mailThankGodfatherBodyTxt: "Bonjour USER_NAME,\nGrâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nMerci et à bientôt !", + mailThankGodfatherBodyHTML: "

Bonjour USER_NAME,

Grâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.

Merci et à bientôt !

", + badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.", + emailNotFound: "Aucun utilisateur trouvé pour cette adresse e-mail.", + alreadyConnected: "Vous êtes déjà connecté(e) au site !", + needBeConnected: "Vous devez être connecté(e) pour accéder à cette page.", + connectionOk: "Connexion réussie.", + needChooseLoginWay: "Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.", + needValidationToLogin: "Vous devez d'abord valider votre compte avant de vous connecter. Pour ce faire, un lien vient de vous être envoyé par e-mail.", + tooManyLoginFails: "Trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.", + badPassword: "Le mot de passe n'est pas le bon.", + mailLoginLinkSubject: "Votre lien de connexion.", + mailLoginLinkBodyTxt: "Bonjour USER_NAME,\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : LINK_URL", + mailLoginLinkBodyHTML: "

Bonjour USER_NAME,

Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :

Valider.

", + mailLoginLinkMessage: "Un lien de connexion vient de vous être envoyé sur votre adresse e-mail. Ne tardez pas à l'utiliser, car il n'est valable que durant ", + updatedOkMessage: "Vos informations ont bien été mises à jour.", + updatedNeedGoodEmail: "Mais la nouvelle adresse e-mail n'a pu être enregistrée car elle n'a pas une format correct.", + updatedNeedUniqueEmail: "Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.", + mailUpdateLoginSubject: "Merci de valider vos nouveaux identifiants.", + mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL", + mailUpdateLoginBodyHTML: "

Bonjour USER_NAME,

Pour valider vos nouveaux identifiants de connexion, cliquez ici sans tarder.

", + mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (email et/ou mot de passe) et vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement. En attendant, merci de continuer à utiliser vos anciens identifiants.", + updatedNeedValidatedUser: "L'utilisateur que vous souhaité modifier n'existe pas/plus ou n'a pas encore validé son compte.", + updatedNeedGoodGodfather: "Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.", + mailUpdateLoginOkMessage: "La mise à jour de vos identifiants a bien été enregistrée.", + updatedFailedGodfatherNotFound: "L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.", + creationOkMessage: "Le nouvel utilisateur a bien été enregistré.", + mailDeleteSubject: "Confirmer la suppression de votre compte.", + mailDeleteBodyTxt: "Bonjour USER_NAME,\nPour valider la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL", + mailDeleteBodyHTML: "

Bonjour USER_NAME,

Pour valider la suppression de votre compte, cliquez ici sans tarder.

", + mailDeleteLinkMessage: "Votre demande de suppression a bien été enregistrée. Merci de cliquer sans tarder sur le lien qui vient de vous être envoyé par e-mail pour confirmer.", + deleteOkMessage: "L'utilisateur a bien été supprimé.", + deleteFailMessage: "Tentative de suppression d'un utilisateur inexistant : ", + mailDeleteLinkOkMessage: "Votre compte a bien été supprimé. Merci d'avoir utilisé nos services.", + mailDeleteLinkAlreadyMessage: "Il semble que vous ayez déjà validé la suppression de votre compte.", + mailDeleteLinkFailMessage: "Votre lien de suppression n'est pas valide ou alors il n'est plus valable.", + cronDeleteUnvalidedUsersMessage: " comptes utilisateurs non validés ont été supprimés.", + deleteInactiveUsersMessage: " comptes utilisateurs inactifs ont été supprimés.", + welcomeMessage: "Bienvenue #NAME !", + byebyeMessage: "Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
À bientôt !", + infosUserForAdmin: "Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
Date de sa dernière connexion : DATE_CONNECTION.", + infosAdminGodfather: "Cet utilisateur a été parrainé par ", + infosAdminNbGodChilds: "Ses #NB filleuils : " +}; + +/***/ }), + +/***/ "../tools/main.js": +/*!************************!*\ + !*** ../tools/main.js ***! + \************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +// Quelques fonctions utiles pour les chaînes +var Tool = /*#__PURE__*/function () { + function Tool() { + _classCallCheck(this, Tool); + } + + _createClass(Tool, null, [{ + key: "isEmpty", + value: function isEmpty(myVar) { + if (myVar === undefined || myVar === null) return true;else { + myVar += ""; // si autre chose qu'une chaîne envoyé... + + myVar = myVar.trim(); + if (myVar === "") return true;else return false; + } + } + }, { + key: "trimIfNotNull", + value: function trimIfNotNull(myString) { + if (Tool.isEmpty(myString)) myString = null;else { + myString += ""; // si autre chose qu'une chaîne envoyé... + + myString = myString.trim(); + } + return myString; + } + }, { + key: "shortenIfLongerThan", + value: function shortenIfLongerThan(myString, max) { + myString += ""; // au cas où cela ne serait pas une chaîne... + + if (myString.length > max) myString = myString.substring(0, max - 3) + "..."; + return myString; + } // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings + + }, { + key: "replaceAll", + value: function replaceAll(myString, mapObj) { + var replaceElts = new RegExp(Object.keys(mapObj).join("|"), "gi"); + return myString.replace(replaceElts, function (matched) { + return mapObj[matched]; + }); + } // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random + + }, { + key: "getRandomInt", + value: function getRandomInt(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min)) + min; + } // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country + + }, { + key: "dateFormat", + value: function dateFormat(dateString) { + var lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "fr"; + if (Tool.isEmpty(dateString)) return ""; + var myDate = new Date(dateString); + var myDay = myDate.getDate() + ""; + if (myDay.length === 1) myDay = "0" + myDay; + var myMounth = myDate.getMonth() + 1 + ""; + if (myMounth.length === 1) myMounth = "0" + myMounth; + var myYear = myDate.getFullYear(); + if (lang === "fr") return myDay + "/" + myMounth + "/" + myYear;else if (lang === "form") // 2014-02-09 + return myYear + "-" + myMounth + "-" + myDay;else return myMounth + "/" + myDay + "/" + myYear; + } + }]); + + return Tool; +}(); + +module.exports = Tool; + +/***/ }), + +/***/ "../views sync recursive ^\\.\\/.*\\.js$": +/*!**********************************!*\ + !*** ../views sync ^\.\/.*\.js$ ***! + \**********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./default/config/fr.js": "../views/default/config/fr.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../views sync recursive ^\\.\\/.*\\.js$"; + +/***/ }), + +/***/ "../views/default/config/fr.js": +/*!*************************************!*\ + !*** ../views/default/config/fr.js ***! + \*************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + headLinks: [{ + anchor: "Accueil", + attributes: { + href: "/" + } + }, { + anchor: "Mon compte", + attributes: { + href: "/connexion.hmt", + id: "accountHeadLink" + } + }, { + anchor: "À propos", + attributes: { + href: "/a-propos.html" + } + }, { + anchor: "Contact", + attributes: { + href: "/contact.html" + } + }], + footLinks: [{ + anchor: "Crédits", + attributes: { + href: "/credits.html" + } + }, { + anchor: "Mentions légales", + attributes: { + href: "/mentions-legales.html", + rel: "nofollow" + } + }, { + anchor: "Données personnelles", + attributes: { + href: "/donnees.html" + } + }, { + anchor: "C.G.U.", + attributes: { + href: "/cgu.html", + rel: "nofollow" + } + }, { + anchor: "C.G.V.", + attributes: { + href: "/cgv.html", + rel: "nofollow" + } + }], + maxQuestionnairesByPage: 10, + userHomePage: "accueil.html", + adminHomePage: "admin.html", + managerHomePage: "gestion.html", + subscribePage: "inscription.html", + connectionPage: "connexion.html", + accountPage: "compte.html", + questionnairesManagementPage: "gestion-quizs.html", + usersManagementPage: "gestion-utilisateurs.html", + nbQuestionnairesUserHomePage: 10, + illustrationDir: "/img/quizs/", + siteSlogan: "Cultivons notre jardin !", + homeTitle1: "De nature curieuse ?", + homeP1: "Avec WikiLerni vous apprenez chaque jour de nouvelles choses.
Des articles de Wikipédia sont sélectionnés pour vous et sont suivis d'un quiz vous permettant de tester ce que vous en avez retenu.
De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre \"jardin\".", + homeTitle2: "La culture en liberté", + homeP2: "Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.

(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.", + newQuestionnairesTitle: "Les derniers quizs publiés sur WikiLerni", + newQuestionnairesIntro: "Liste des derniers quizs publiés sur WikiLerni.", + explanationTitle: "Vous découvrez WikiLerni ?", + explanationTxt: "Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.

Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.

Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)

Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.

Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.", + noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript." +}; + +/***/ }), + +/***/ "./src/deconnection.js": +/*!*****************************!*\ + !*** ./src/deconnection.js ***! + \*****************************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ "../config/instance.js"); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js"); +/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js"); +/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/users.js */ "./src/tools/users.js"); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + +// -- GESTION DE LA PAGE DE DÉCONNEXION +/// On se contente ici de supprimer la session stockée côté client +// Fichier de configuration côté client : + +var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0]; + +var configFrontEnd = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); // Importation des fonctions utile au script : + + + + + + // Dictionnaires : + +var txt = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + lang + "/general"); + +var txtUsers = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/user$")("./" + lang + "/user"); + +Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["helloDev"])(); +var divResponse = document.getElementById("response"); +var config; + +var initialise = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _context.prev = 0; + _context.next = 3; + return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_4__["getConfig"])(); + + case 3: + config = _context.sent; + if (!config) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]);else { + Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["removeLocaly"])("user"); + Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["removeLocaly"])("url"); + Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["removeLocaly"])("message"); + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txtUsers.byebyeMessage, "", ["success"]); + } + _context.next = 10; + break; + + case 7: + _context.prev = 7; + _context.t0 = _context["catch"](0); + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]); + + case 10: + case "end": + return _context.stop(); + } + } + }, _callee, null, [[0, 7]]); + })); + + return function initialise() { + return _ref.apply(this, arguments); + }; +}(); + +initialise(); + +/***/ }), + +/***/ "./src/tools/clientstorage.js": +/*!************************************!*\ + !*** ./src/tools/clientstorage.js ***! + \************************************/ +/*! exports provided: saveLocaly, getLocaly, removeLocaly */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveLocaly", function() { return saveLocaly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaly", function() { return getLocaly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeLocaly", function() { return removeLocaly; }); +// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.) +// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie +var saveLocaly = function saveLocaly(name, data) { + localStorage.setItem(name, JSON.stringify(data)); +}; +var getLocaly = function getLocaly(name) { + var json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name); +}; +var removeLocaly = function removeLocaly(name) { + localStorage.removeItem(name); +}; + +/***/ }), + +/***/ "./src/tools/dom.js": +/*!**************************!*\ + !*** ./src/tools/dom.js ***! + \**************************/ +/*! exports provided: addElement */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addElement", function() { return addElement; }); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__); +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + + // Fonction associant les attributs fournis à un champ de formulaire + +var addElement = function addElement(eltParent, eltType) { + var eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; + var eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; + var eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : []; + var eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; + var replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true; + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltType) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltParent)) return false;else { + var newElement = document.createElement(eltType); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ? + newElement.id = eltId; + + if (Array.isArray(eltClass) && eltClass.length != 0) { + for (var i in eltClass) { + newElement.classList.add(eltClass[i]); + } + } + + if (_typeof(eltAttributes) === "object") // !! tous les objets ne sont pas ok + { + for (var attributName in eltAttributes) { + newElement.setAttribute(attributName, eltAttributes[attributName]); + } + } + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltContent)) newElement.innerHTML = eltContent.replace(/\n/g, "
"); // innerHTML permet d'ajouter du texte ayant lui-même des balises, etc. + + if (replace) eltParent.innerHTML = ""; + eltParent.appendChild(newElement); + } +}; + +/***/ }), + +/***/ "./src/tools/everywhere.js": +/*!*********************************!*\ + !*** ./src/tools/everywhere.js ***! + \*********************************/ +/*! exports provided: helloDev, updateAccountLink */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "helloDev", function() { return helloDev; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateAccountLink", function() { return updateAccountLink; }); +// Ce script fournit des fonctions utilisées sur toutes les pages du site +var helloDev = function helloDev() { + console.log("**** Hello ami développeur :-)\n Le code de WikiLerni est libre et est lisible sur gitlab : \n Bonne lecture :-) \n Pour les suggestions d'amélioration ou questions : dev@wililerni.com ****"); + return true; +}; +var updateAccountLink = function updateAccountLink(status, configTemplate) { + var link = document.getElementById("accountHeadLink"); + var homePage = status + "HomePage"; + link.href = "/" + configTemplate[homePage]; +}; + +/***/ }), + +/***/ "./src/tools/users.js": +/*!****************************!*\ + !*** ./src/tools/users.js ***! + \****************************/ +/*! exports provided: getConfig, getTimeDifference, getPassword, setSession, checkAnswerDatas, checkSession */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getConfig", function() { return getConfig; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTimeDifference", function() { return getTimeDifference; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getPassword", function() { return getPassword; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setSession", function() { return setSession; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkAnswerDatas", function() { return checkAnswerDatas; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkSession", function() { return checkSession; }); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/instance.js */ "../config/instance.js"); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../config/users.js */ "../config/users.js"); +/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_3__); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + + +var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0]; + +var configTemplate = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); + + + + // Récupère les données de configuration des utilisateurs +// À terme, un fichier statique importable comme module devrait éviter une requête ajax + +var getConfig = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + return _context.abrupt("return", new Promise(function (resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + "/user/getconfig"); + + xhr.onload = function () { + return resolve(JSON.parse(xhr.responseText)); + }; + + xhr.onerror = function () { + return reject(xhr.statusText); + }; + + xhr.send(); + })); + + case 1: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + + return function getConfig() { + return _ref.apply(this, arguments); + }; +}(); +var getTimeDifference = function getTimeDifference() { + var timeLocal = new Date().getTimezoneOffset(); + if (timeLocal > _config_users_js__WEBPACK_IMPORTED_MODULE_1__["timeDifferenceMax"] || timeLocal < _config_users_js__WEBPACK_IMPORTED_MODULE_1__["timeDifferenceMin"]) return 0;else return timeLocal; +}; // On enlève volontairement les 0/O pour éviter les confusions ! +// Et mieux vaut aussi débuter et finir par une lettre simple. + +var getPassword = function getPassword(nbCarMin, nbCarMax) { + var nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin)); + var letters = "ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz"; + var others = "123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ"; + var password = letters[Math.floor(Math.random() * letters.length)]; + + for (var i = 1; i < nbCar - 1; i++) { + if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)]; + } + + password += letters[Math.floor(Math.random() * letters.length)]; + return password; +}; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite +// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides. + +var setSession = function setSession(userId, token, durationTS) { + var storageUser = { + id: userId, + token: token, + duration: durationTS + }; + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("user", storageUser); +}; // Vérifie qu'il y a des données locales concernant le résultat d'un quiz +// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas + +var checkAnswerDatas = function checkAnswerDatas(datas) { + var lastAnswer = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("lastAnswer"); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(lastAnswer)) { + var answer = JSON.parse(lastAnswer); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.duration) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbCorrectAnswers) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.QuestionnaireId) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbQuestions)) { + datas.duration = answer.duration; + datas.nbCorrectAnswers = answer.nbCorrectAnswers; + datas.QuestionnaireId = answer.QuestionnaireId; + datas.nbQuestions = answer.nbQuestions; + } + } + + return datas; +}; // Cette fonction teste la connexion de l'utilisateur d'une page +// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté + +var checkSession = /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() { + var status, + urlRedirection, + message, + urlWanted, + _args2 = arguments; + return regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + status = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : []; + urlRedirection = _args2.length > 1 ? _args2[1] : undefined; + message = _args2.length > 2 ? _args2[2] : undefined; + urlWanted = _args2.length > 3 ? _args2[3] : undefined; + return _context2.abrupt("return", new Promise(function (resolve, reject) { + var userDatas = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("user"); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(userDatas)) { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else { + var user = JSON.parse(userDatas); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.id) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.token) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.duration) || user.duration < Date.now()) { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else { + var xhr = new XMLHttpRequest(); + xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["userRoutes"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["checkLoginRoute"] + user.token); + + xhr.onload = function () { + var response = JSON.parse(xhr.responseText); + + if (xhr.status === 200 && response.isValid && response.id != undefined) { + if (response.id === user.id) { + user.name = response.name; + user.language = response.language; + user.timeDifference = response.timeDifference; + user.status = response.status; // le token et de toute façon vérifier à chaque requête à l'API + + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("user", user); // si il s'agit d'un "user" et que son abonnement a expiré, je le redirige vers la caisse :-) + + if (response.status === "user" && response.nbDaysOk <= 0) { + var urlAccount = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["siteUrl"] + "/" + configTemplate[lang].accountPage; + if (window.location.href.indexOf(urlAccount) === -1) window.location.assign("/" + configTemplate[lang].accountPage); // passée directement ici, l'ancre #subscribe ne fonctionne pas !? + + resolve(true); + } else { + if (status.length !== 0 && status.indexOf(response.status) === -1) { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else resolve(true); + } + } else { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + } else { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + }; + + xhr.onerror = function () { + return reject(xhr.statusText); + }; + + xhr.send(); + } + } + })); + + case 5: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + + return function checkSession() { + return _ref2.apply(this, arguments); + }; +}(); // Cette fonction sert à la précédente en cas de connexion non valide + +var redirectUser = function redirectUser(urlRedirection, message, urlWanted) { + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(message)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("message", message); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlWanted)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("url", urlWanted); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlRedirection)) window.location.assign(urlRedirection); +}; + +/***/ }) + +/******/ }); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9nZW5lcmFsJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3VzZXIkIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL2dlbmVyYWwuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcvZnIvdXNlci5qcyIsIndlYnBhY2s6Ly8vLi4vdG9vbHMvbWFpbi5qcyIsIndlYnBhY2s6Ly8vLi4vdmlld3Mgc3luYyBeXFwuXFwvLipcXC5qcyQiLCJ3ZWJwYWNrOi8vLy4uL3ZpZXdzL2RlZmF1bHQvY29uZmlnL2ZyLmpzIiwid2VicGFjazovLy8uL3NyYy9kZWNvbm5lY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2RvbS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvZXZlcnl3aGVyZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvdXNlcnMuanMiXSwibmFtZXMiOlsidXNlcnMiLCJyZXF1aXJlIiwicXVlc3Rpb25uYWlyZXMiLCJtb2R1bGUiLCJleHBvcnRzIiwiYXBpVXJsIiwic2l0ZVVybCIsImFkbWluTmFtZSIsImFkbWluRW1haWwiLCJzZW5kZXJOYW1lIiwic2VuZGVyRW1haWwiLCJhZG1pbkxhbmciLCJ0aGVtZSIsImF2YWlsYWJsZUxhbmdzIiwic2l0ZU5hbWUiLCJiZWdpbkNvZGVHb2RmYXRoZXIiLCJjcm9uVGltaW5nQWxlcnRJblNlY29uZGUiLCJyZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlIiwidG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnMiLCJ0b2tlbkxvZ2luTGlua1RpbWVJbkhvdXJzIiwidG9rZW5Db25uZXhpb25NaW5UaW1lSW5Ib3VycyIsInRva2VuQ29ubmV4aW9uTWF4VGltZUluRGF5cyIsInRva2VuTG9naW5DaGFuZ2luZ1RpbWVJbkhvdXJzIiwidG9rZW5EZWxldGVVc2VyVGltZUluSG91cnMiLCJ0b2tlblVuc3Vic2NyaWJlTGlua1RpbWVJbkRheXMiLCJmcmVlQWNjb3VudFRpbWluZ0luRGF5cyIsImZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5cyIsImFjY291bnRFeHBpcmF0aW9uRmlyc3ROb3RpZmljYXRpb25JbkRheXMiLCJhY2NvdW50RXhwaXJhdGlvblNlY29uZE5vdGlmaWNhdGlvbkluRGF5cyIsImluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5cyIsIm5iUXVlc3Rpb25zTWluIiwibmJRdWVzdGlvbnNNYXgiLCJuYkNob2ljZXNNYXgiLCJuYk5ld1F1ZXN0aW9ubmFpcmVzIiwiaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlQmVnaW4iLCJob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQiLCJudW1iZXJOZXdRdWVzdGlvbm5haXJlQXRTYW1lVGltZSIsIm1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzIiwibmJJbGx1c3RyYXRpb25zTWluIiwibmJJbGx1c3RyYXRpb25zTWF4IiwibWF4SWxsdXN0cmF0aW9uU2l6ZWluT2N0ZXQiLCJtaW1lVHlwZXNGb3JJbGx1c3RyYXRpb24iLCJpbGx1c3RyYXRpb25zV2lkdGhNYXhJblB4IiwiaWxsdXN0cmF0aW9uc01pbmlhdHVyZXNXaWR0aE1heEluUHgiLCJuYkxpbmtzTWluIiwibmJMaW5rc01heCIsInBhc3N3b3JkIiwibWlubGVuZ3RoIiwiZGlyQ2FjaGVVc2VycyIsImRpckNhY2hlVXNlcnNBbnN3ZXJzIiwiZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyIsImRpckNhY2hlUXVlc3Rpb25zIiwiZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzIiwiZGlySFRNTFF1ZXN0aW9ubmFpcmUiLCJkaXJXZWJRdWVzdGlvbm5haXJlIiwicXVlc3Rpb25uYWlyZVJvdXRlcyIsImdldFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlcyIsInB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJzYXZlQW5zd2Vyc1JvdXRlIiwiZ2V0U3RhdHNRdWVzdGlvbm5haXJlcyIsInNlYXJjaFF1ZXN0aW9ubmFpcmVzUm91dGUiLCJzZWFyY2hBZG1pblF1ZXN0aW9ubmFpcmVzUm91dGUiLCJnZXRMaXN0TmV4dFF1ZXN0aW9ubmFpcmVzIiwicXVlc3Rpb25zUm91dGUiLCJ0YWdzU2VhcmNoUm91dGUiLCJnZXRRdWVzdGlvbm5haXJlc1dpdGhvdXRBbnN3ZXIiLCJnZXRQcmV2aW91c0Fuc3dlcnMiLCJnZXRTdGF0c0Fuc3dlcnMiLCJnZXRBZG1pblN0YXRzIiwiUXVlc3Rpb25uYWlyZSIsInRpdGxlIiwibWF4bGVuZ3RoIiwicmVxdWlyZWQiLCJzbHVnIiwiaW50cm9kdWN0aW9uIiwic2VhcmNoUXVlc3Rpb25uYWlyZXMiLCJRdWVzdGlvbiIsInRleHQiLCJyYW5rIiwibWluIiwiZGVmYXVsdFZhbHVlIiwiQ2hvaWNlIiwibmJUYWdzTWluIiwibmJUYWdzTWF4IiwiZGlyQ2FjaGVUYWdzIiwiZGlySFRNTFRhZ3MiLCJkaXJXZWJUYWdzIiwidXNlclJvdXRlcyIsInN1YnNjcmliZVJvdXRlIiwiZ2V0R29kZmF0aGVyUm91dGUiLCJjaGVja0lmSXNFbWFpbGZyZWVSb3V0ZSIsImNoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZSIsImNoZWNrTG9naW5Sb3V0ZSIsImNvbm5lY3Rpb25Sb3V0ZSIsImdldExvZ2luTGlua1JvdXRlIiwiY29ubmVjdGlvbldpdGhMaW5rUm91dGUiLCJnZXRVc2VySW5mb3MiLCJjcmVhdGVVc2VyUm91dGUiLCJ2YWxpZGF0ZVVzZXJSb3V0ZSIsInVwZGF0ZVVzZXJJbmZvcyIsInNlYXJjaFVzZXJSb3V0ZSIsImdldEdvZENoaWxkcyIsImNoZWNrTmV3TG9naW5MaW5rUm91dGUiLCJjaGVja0RlbGV0ZUxpbmtSb3V0ZSIsImdldFBheW1lbnRzIiwidW5zdWJzY3JpYmVSb3V0ZSIsIm5hbWUiLCJlbWFpbCIsIm5ld1Bhc3N3b3JkIiwiY29kZUdvZGZhdGhlciIsImNndU9rIiwidmFsdWUiLCJ0aW1lRGlmZmVyZW5jZU1pbiIsInRpbWVEaWZmZXJlbmNlTWF4Iiwic2l0ZUhUTUxUaXRsZSIsInNpdGVNZXRhRGVzY3JpcHRpb24iLCJzY3JpcHRUaW1pbmdJbmZvIiwic2NyaXB0VGltaW5nQWxlcnQiLCJzZXJ2ZXJFcnJvciIsInNlcnZlckVycm9yQWRtaW4iLCJuZWVkZWRQYXJhbXMiLCJiYWRVcmwiLCJub3RWYWxpZEZvcm1hdCIsIm5vdEFsbG93ZWQiLCJub3RSZXF1aXJlZCIsInVwZGF0ZUJ0blR4dCIsImFkZEJ0blR4dCIsImRlbGV0ZUJ0blR4dCIsImFkZE9rTWVzc2FnZSIsInVwZGF0ZU9rTWVzc2FnZSIsImRlbGV0ZU9rTWVzc2FnZSIsImZhaWxBdXRoIiwiZmFpbEF1dGhIZWFkZXIiLCJmYWlsQXV0aFRva2VuIiwiZmFpbEF1dGhJZCIsImZhaWxBdXRoQ3JvbiIsInByZXZpb3VzUGFnZSIsIm5leHRQYWdlIiwiYnRuTGlua1RvUXVlc3Rpb25uYWlyZSIsInN0YXRzQWRtaW4iLCJub3RGb3VuZCIsIm5lZWROYW1lIiwibmVlZE5vdFRvb0xvbmdOYW1lIiwibmVlZEVtYWlsIiwibmVlZFVuaXF1ZUVtYWlsIiwibmVlZE5vdFRvb0xvbmdFbWFpbCIsIm5lZWRQYXNzV29yZCIsIm5lZWRMb25nUGFzc1dvcmQiLCJwYXNzd29yZENvcGllZCIsIm5lZWRTdGF0dXMiLCJuZWVkTGFuZ3VhZ2UiLCJuZWVkVmFsaWRMYXN0Q29ubmVjdGlvbkRhdGUiLCJuZWVkU01UUCIsIm5lZWRTTVRQTm90Rm91bmQiLCJuZWVkS25vd05ld3NsZXR0ZXJPayIsIm5lZWRUaW1lRGlmZmVyZW5jZSIsIm5lZWRNaW5UaW1lRGlmZmVyZW5jZSIsIm5lZWRNYXhUaW1lRGlmZmVyZW5jZSIsIm5lZWRVR0NPayIsImdvZGZhdGhlck5vdEZvdW5kIiwiZ29kZmF0aGVyRm91bmQiLCJtYWlsVmFsaWRhdGlvbk1lc3NhZ2UiLCJtYWlsVmFsaWRhdGlvbkxpbmtTdWJqZWN0IiwibWFpbFZhbGlkYXRpb25MaW5rU0JvZHlUeHQiLCJtYWlsVmFsaWRhdGlvbkxpbmtTQm9keUhUTUwiLCJ2YWxpZGF0aW9uTWVzc2FnZSIsInZhbGlkYXRpb25NZXNzYWdlQWRtaW4iLCJ2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2UiLCJ2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2VBZG1pbiIsIm1haWxXZWxjb21lU3ViamVjdCIsIm1haWxXZWxjb21lQm9keVR4dCIsIm1haWxXZWxjb21lQm9keUhUTUwiLCJtYWlsVGhhbmtHb2RmYXRoZXJTdWJqZWN0IiwibWFpbFRoYW5rR29kZmF0aGVyQm9keVR4dCIsIm1haWxUaGFua0dvZGZhdGhlckJvZHlIVE1MIiwiYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlIiwiZW1haWxOb3RGb3VuZCIsImFscmVhZHlDb25uZWN0ZWQiLCJuZWVkQmVDb25uZWN0ZWQiLCJjb25uZWN0aW9uT2siLCJuZWVkQ2hvb3NlTG9naW5XYXkiLCJuZWVkVmFsaWRhdGlvblRvTG9naW4iLCJ0b29NYW55TG9naW5GYWlscyIsImJhZFBhc3N3b3JkIiwibWFpbExvZ2luTGlua1N1YmplY3QiLCJtYWlsTG9naW5MaW5rQm9keVR4dCIsIm1haWxMb2dpbkxpbmtCb2R5SFRNTCIsIm1haWxMb2dpbkxpbmtNZXNzYWdlIiwidXBkYXRlZE9rTWVzc2FnZSIsInVwZGF0ZWROZWVkR29vZEVtYWlsIiwidXBkYXRlZE5lZWRVbmlxdWVFbWFpbCIsIm1haWxVcGRhdGVMb2dpblN1YmplY3QiLCJtYWlsVXBkYXRlTG9naW5Cb2R5VHh0IiwibWFpbFVwZGF0ZUxvZ2luQm9keUhUTUwiLCJtYWlsVXBkYXRlTG9naW5MaW5rTWVzc2FnZSIsInVwZGF0ZWROZWVkVmFsaWRhdGVkVXNlciIsInVwZGF0ZWROZWVkR29vZEdvZGZhdGhlciIsIm1haWxVcGRhdGVMb2dpbk9rTWVzc2FnZSIsInVwZGF0ZWRGYWlsZWRHb2RmYXRoZXJOb3RGb3VuZCIsImNyZWF0aW9uT2tNZXNzYWdlIiwibWFpbERlbGV0ZVN1YmplY3QiLCJtYWlsRGVsZXRlQm9keVR4dCIsIm1haWxEZWxldGVCb2R5SFRNTCIsIm1haWxEZWxldGVMaW5rTWVzc2FnZSIsImRlbGV0ZUZhaWxNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtPa01lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua0FscmVhZHlNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtGYWlsTWVzc2FnZSIsImNyb25EZWxldGVVbnZhbGlkZWRVc2Vyc01lc3NhZ2UiLCJkZWxldGVJbmFjdGl2ZVVzZXJzTWVzc2FnZSIsIndlbGNvbWVNZXNzYWdlIiwiYnllYnllTWVzc2FnZSIsImluZm9zVXNlckZvckFkbWluIiwiaW5mb3NBZG1pbkdvZGZhdGhlciIsImluZm9zQWRtaW5OYkdvZENoaWxkcyIsIlRvb2wiLCJteVZhciIsInVuZGVmaW5lZCIsInRyaW0iLCJteVN0cmluZyIsImlzRW1wdHkiLCJtYXgiLCJsZW5ndGgiLCJzdWJzdHJpbmciLCJtYXBPYmoiLCJyZXBsYWNlRWx0cyIsIlJlZ0V4cCIsIk9iamVjdCIsImtleXMiLCJqb2luIiwicmVwbGFjZSIsIm1hdGNoZWQiLCJNYXRoIiwiY2VpbCIsImZsb29yIiwicmFuZG9tIiwiZGF0ZVN0cmluZyIsImxhbmciLCJteURhdGUiLCJEYXRlIiwibXlEYXkiLCJnZXREYXRlIiwibXlNb3VudGgiLCJnZXRNb250aCIsIm15WWVhciIsImdldEZ1bGxZZWFyIiwiaGVhZExpbmtzIiwiYW5jaG9yIiwiYXR0cmlidXRlcyIsImhyZWYiLCJpZCIsImZvb3RMaW5rcyIsInJlbCIsIm1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlIiwidXNlckhvbWVQYWdlIiwiYWRtaW5Ib21lUGFnZSIsIm1hbmFnZXJIb21lUGFnZSIsInN1YnNjcmliZVBhZ2UiLCJjb25uZWN0aW9uUGFnZSIsImFjY291bnRQYWdlIiwicXVlc3Rpb25uYWlyZXNNYW5hZ2VtZW50UGFnZSIsInVzZXJzTWFuYWdlbWVudFBhZ2UiLCJuYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlIiwiaWxsdXN0cmF0aW9uRGlyIiwic2l0ZVNsb2dhbiIsImhvbWVUaXRsZTEiLCJob21lUDEiLCJob21lVGl0bGUyIiwiaG9tZVAyIiwibmV3UXVlc3Rpb25uYWlyZXNUaXRsZSIsIm5ld1F1ZXN0aW9ubmFpcmVzSW50cm8iLCJleHBsYW5hdGlvblRpdGxlIiwiZXhwbGFuYXRpb25UeHQiLCJub0pTTm90aWZpY2F0aW9uIiwiY29uZmlnRnJvbnRFbmQiLCJ0eHQiLCJ0eHRVc2VycyIsImhlbGxvRGV2IiwiZGl2UmVzcG9uc2UiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwiY29uZmlnIiwiaW5pdGlhbGlzZSIsImdldENvbmZpZyIsImFkZEVsZW1lbnQiLCJyZW1vdmVMb2NhbHkiLCJzYXZlTG9jYWx5IiwiZGF0YSIsImxvY2FsU3RvcmFnZSIsInNldEl0ZW0iLCJKU09OIiwic3RyaW5naWZ5IiwiZ2V0TG9jYWx5IiwianNvbiIsInBhcnNlIiwiZ2V0SXRlbSIsInJlbW92ZUl0ZW0iLCJlbHRQYXJlbnQiLCJlbHRUeXBlIiwiZWx0Q29udGVudCIsImVsdElkIiwiZWx0Q2xhc3MiLCJlbHRBdHRyaWJ1dGVzIiwibmV3RWxlbWVudCIsImNyZWF0ZUVsZW1lbnQiLCJBcnJheSIsImlzQXJyYXkiLCJpIiwiY2xhc3NMaXN0IiwiYWRkIiwiYXR0cmlidXROYW1lIiwic2V0QXR0cmlidXRlIiwiaW5uZXJIVE1MIiwiYXBwZW5kQ2hpbGQiLCJjb25zb2xlIiwibG9nIiwidXBkYXRlQWNjb3VudExpbmsiLCJzdGF0dXMiLCJjb25maWdUZW1wbGF0ZSIsImxpbmsiLCJob21lUGFnZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwieGhyIiwiWE1MSHR0cFJlcXVlc3QiLCJvcGVuIiwib25sb2FkIiwicmVzcG9uc2VUZXh0Iiwib25lcnJvciIsInN0YXR1c1RleHQiLCJzZW5kIiwiZ2V0VGltZURpZmZlcmVuY2UiLCJ0aW1lTG9jYWwiLCJnZXRUaW1lem9uZU9mZnNldCIsImdldFBhc3N3b3JkIiwibmJDYXJNaW4iLCJuYkNhck1heCIsIm5iQ2FyIiwibGV0dGVycyIsIm90aGVycyIsInNldFNlc3Npb24iLCJ1c2VySWQiLCJ0b2tlbiIsImR1cmF0aW9uVFMiLCJzdG9yYWdlVXNlciIsImR1cmF0aW9uIiwiY2hlY2tBbnN3ZXJEYXRhcyIsImRhdGFzIiwibGFzdEFuc3dlciIsImFuc3dlciIsIm5iQ29ycmVjdEFuc3dlcnMiLCJRdWVzdGlvbm5haXJlSWQiLCJuYlF1ZXN0aW9ucyIsImNoZWNrU2Vzc2lvbiIsInVybFJlZGlyZWN0aW9uIiwibWVzc2FnZSIsInVybFdhbnRlZCIsInVzZXJEYXRhcyIsInJlZGlyZWN0VXNlciIsInVzZXIiLCJub3ciLCJyZXNwb25zZSIsImlzVmFsaWQiLCJsYW5ndWFnZSIsInRpbWVEaWZmZXJlbmNlIiwibmJEYXlzT2siLCJ1cmxBY2NvdW50Iiwid2luZG93IiwibG9jYXRpb24iLCJpbmRleE9mIiwiYXNzaWduIl0sIm1hcHBpbmdzIjoiO1FBQUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7OztRQUdBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwwQ0FBMEMsZ0NBQWdDO1FBQzFFO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0Esd0RBQXdELGtCQUFrQjtRQUMxRTtRQUNBLGlEQUFpRCxjQUFjO1FBQy9EOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSx5Q0FBeUMsaUNBQWlDO1FBQzFFLGdIQUFnSCxtQkFB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QyxTQUFELEVBQVlzRSxPQUFaLENBQVY7QUFDSixNQUFHLENBQUN4SSwyREFBTyxDQUFDeUksU0FBRCxDQUFYLEVBQ0l2RSxvRUFBVSxDQUFDLEtBQUQsRUFBUXVFLFNBQVIsQ0FBVjtBQUNKLE1BQUcsQ0FBQ3pJLDJEQUFPLENBQUN1SSxjQUFELENBQVgsRUFDSWEsTUFBTSxDQUFDQyxRQUFQLENBQWdCRSxNQUFoQixDQUF1QmhCLGNBQXZCO0FBQ1AsQ0FSRCxDIiwiZmlsZSI6Ii4vSlMvZGVjb25uZWN0aW9uLmFwcC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL2RlY29ubmVjdGlvbi5qc1wiKTtcbiIsImNvbnN0IHVzZXJzID0gcmVxdWlyZShcIi4vdXNlcnNcIik7XG5jb25zdCBxdWVzdGlvbm5haXJlcyA9IHJlcXVpcmUoXCIuL3F1ZXN0aW9ubmFpcmVzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgYXBpVXJsOiBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9hcGlcIixcbiAgICBzaXRlVXJsOiBcImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MFwiLFxuICAgIGFkbWluTmFtZTogXCJGYWJyaWNlXCIsXG4gICAgYWRtaW5FbWFpbDogXCJkZXZAd2lraWxlcm5pLmNvbVwiLFxuICAgIHNlbmRlck5hbWU6IFwiV2lraUxlcm5pXCIsXG4gICAgc2VuZGVyRW1haWw6IFwiYm9uam91ckB3aWtpbGVybmkuY29tXCIsXG4gICAgYWRtaW5MYW5nOiBcImZyXCIsXG4gICAgdGhlbWU6IFwiZGVmYXVsdFwiLCAvLyBsZSB0aMOobWUgdXRpbGlzw6kgKGRhbnMgL3ZpZXdzKSBwb3VyIGfDqW7DqXJlciBsZXMgcGFnZXMgSFRNTC4gQ29udGllbnQgc2VzIHByb3ByZXMgZmljaGllcnMgZGUgY29uZmlndXJhdGlvbi5cbiAgICBhdmFpbGFibGVMYW5nczogW1wiZnJcIl0sLy8gTGFuZ3VhZ2VzIGluIHdoaWNoIHRoZSBzaXRlIGlzIGF2YWlsYWJsZS4gVGhlIGZpcnN0IG9uZSBpcyB0aGUgZGVmYXVsdCBvbmUuXG4gICAgc2l0ZU5hbWU6IFwiV2lraUxlcm5pXCIsXG4gICAgYmVnaW5Db2RlR29kZmF0aGVyOiBcIndpa2lsZXJuaVwiLCAvLyBjYXNlLXNlbnNpdGl2ZSBhbmQgY2FuJ3QgY29udGFpbiBcIkBcIiAhXG4gICAgY3JvblRpbWluZ0FsZXJ0SW5TZWNvbmRlOiAxMjAsIC8vIGZvciBsb2dzXG4gICAgcmVzcG9uc2VUaW1pbmdBbGVydEluU2Vjb25kZTogMywgLy8gaWRlbVxuICAgIHRva2VuU2lnbnVwVmFsaWRhdGlvblRpbWVJbkhvdXJzOiBcIjQ4aFwiLCAvLyBodHRwczovL2dpdGh1Yi5jb20vemVpdC9tc1xuICAgIHRva2VuTG9naW5MaW5rVGltZUluSG91cnM6IFwiMWhcIixcbiAgICB0b2tlbkNvbm5leGlvbk1pblRpbWVJbkhvdXJzOiBcIjI0aFwiLFxuICAgIHRva2VuQ29ubmV4aW9uTWF4VGltZUluRGF5czogXCIxODAgZGF5c1wiLFxuICAgIHRva2VuTG9naW5DaGFuZ2luZ1RpbWVJbkhvdXJzOiBcIjFoXCIsLy8gZm9yIGVtYWlsICYgcGFzc3dvcmQgY2hhbmdpbmdcbiAgICB0b2tlbkRlbGV0ZVVzZXJUaW1lSW5Ib3VyczogXCIxaFwiLFxuICAgIHRva2VuVW5zdWJzY3JpYmVMaW5rVGltZUluRGF5czogXCI3IGRheXNcIiwgLy8gdG9rZW4gc2VuZCB3aXRoIHN1YnNjcmlwdGlvbidzIGVtYWlsc1xuICAgIGZyZWVBY2NvdW50VGltaW5nSW5EYXlzOiAxMCxcbiAgICBmcmVlQWNjb3VudEV4cGlyYXRpb25Ob3RpZmljYXRpb25JbkRheXM6IDUsXG4gICAgYWNjb3VudEV4cGlyYXRpb25GaXJzdE5vdGlmaWNhdGlvbkluRGF5czogMTQsICAgIFxuICAgIGFjY291bnRFeHBpcmF0aW9uU2Vjb25kTm90aWZpY2F0aW9uSW5EYXlzOiA1LFxuICAgIGluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5czogMTgwLFxuICAgIC8vIFF1ZXN0aW9ubmFpcmVzOlxuICAgIG5iUXVlc3Rpb25zTWluOiAxLCAvLyBtaW5pbXVtIG51bWJlciBvZiBxdWVzdGlvbnMgZm9yIHRoZSBxdWVzdGlvbm5haXJlIHRvIGJlIHB1Ymxpc2hhYmxlXG4gICAgbmJRdWVzdGlvbnNNYXg6IDEwLCAvLyBpZiAwID0gbm90IG1heGltdW1cbiAgICBuYkNob2ljZXNNYXg6IDEwLFxuICAgIG5iTmV3UXVlc3Rpb25uYWlyZXM6IDEwLC8vIGZvciBSU1MsIGV0Yy5cbiAgICBob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVCZWdpbjoxLCAvLyBpbiB1c2VyIGxvY2FsIHRpbWVcbiAgICBob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQ6MjQsIC8vIGlkZW1cbiAgICBudW1iZXJOZXdRdWVzdGlvbm5haXJlQXRTYW1lVGltZTogNTAsIC8vIGZvciBtYXNzIG1haWxpbmdcbiAgICBtaW5TZWFyY2hRdWVzdGlvbm5haXJlczogMyxcbiAgICAvLyBJbGx1c3RyYXRpb25zOlxuICAgIG5iSWxsdXN0cmF0aW9uc01pbjogMCxcbiAgICBuYklsbHVzdHJhdGlvbnNNYXg6IDEsXG4gICAgbWF4SWxsdXN0cmF0aW9uU2l6ZWluT2N0ZXQ6IDEwMDAwMDAsLy8gcGFzIGNvbnRyw7Rsw6kgcG91ciBsJ2luc3RhbnQuIMOAIHJldm9pci5cbiAgICBtaW1lVHlwZXNGb3JJbGx1c3RyYXRpb246IFsgXCJpbWFnZS9qcGdcIiwgXCJpbWFnZS9qcGVnXCIsIFwiaW1hZ2UvcG5nXCIsIFwiaW1hZ2UvZ2lmXCIsIFwiaW1hZ2UvcG5nXCIgXSxcbiAgICAvLyAtLSBVcGxvYWQgYW5kIHJlc2l6ZTpcbiAgICBpbGx1c3RyYXRpb25zV2lkdGhNYXhJblB4OiA0MDAsXG4gICAgaWxsdXN0cmF0aW9uc01pbmlhdHVyZXNXaWR0aE1heEluUHg6IDIwMCxcbiAgICAvLyBMaW5rczpcbiAgICBuYkxpbmtzTWluOiAxLFxuICAgIG5iTGlua3NNYXg6IDEsXG4gICAgLy8gw6Agc3VwcHJpbWVyIHF1YW5kIHRvdXMgbGVzIFwicmVxdWlyZVwiIMOgIGpvdXI6XG4gICAgbmJRdWVzdGlvbnNNaW46IHF1ZXN0aW9ubmFpcmVzLm5iUXVlc3Rpb25zTWluLFxuICAgIG5iUXVlc3Rpb25zTWF4OiBxdWVzdGlvbm5haXJlcy5uYlF1ZXN0aW9uc01heCxcbiAgICBuYkNob2ljZXNNYXg6IHF1ZXN0aW9ubmFpcmVzLm5iQ2hvaWNlc01heCxcbiAgICBwYXNzd29yZE1pbkxlbmd0aDogdXNlcnMucGFzc3dvcmQubWlubGVuZ3RoLFxuICAgIGRpckNhY2hlVXNlcnM6IHVzZXJzLmRpckNhY2hlVXNlcnMsXG4gICAgZGlyQ2FjaGVVc2Vyc0Fuc3dlcnM6IHVzZXJzLmRpckNhY2hlVXNlcnNBbnN3ZXJzLFxuICAgIGRpckNhY2hlUXVlc3Rpb25uYWlyZXM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlUXVlc3Rpb25uYWlyZXMsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbnM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlUXVlc3Rpb25zLFxuICAgIGRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzLFxuICAgIGRpckhUTUxRdWVzdGlvbm5haXJlOiBxdWVzdGlvbm5haXJlcy5kaXJIVE1MUXVlc3Rpb25uYWlyZSxcbiAgICBkaXJXZWJRdWVzdGlvbm5haXJlOiBxdWVzdGlvbm5haXJlcy5kaXJXZWJRdWVzdGlvbm5haXJlXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbnsgICAgXG4gICAgLy8gQVBJJ3JvdXRlcyAoYWZ0ZXIgXCJhcGlVcmxcIiBkZWZpbmVkIGluIGluc3RhbmNlLmpzKVxuICAgIHF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3F1ZXN0aW9ubmFpcmVcIixcbiAgICBnZXRRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9nZXRcIixcbiAgICBwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcHJldmlld1wiLFxuICAgIHB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3F1aXovXCIsXG4gICAgc2F2ZUFuc3dlcnNSb3V0ZTogXCIvYW5zd2VyL1wiLFxuICAgIGdldFN0YXRzUXVlc3Rpb25uYWlyZXMgOiBcIi9zdGF0cy9cIixcbiAgICBzZWFyY2hRdWVzdGlvbm5haXJlc1JvdXRlIDogXCIvc2VhcmNoXCIsXG4gICAgc2VhcmNoQWRtaW5RdWVzdGlvbm5haXJlc1JvdXRlIDogXCIvc2VhcmNoYWRtaW5cIixcbiAgICBnZXRMaXN0TmV4dFF1ZXN0aW9ubmFpcmVzOiBcIi9nZXRsaXN0bmV4dHF1ZXN0aW9ubmFpcmVzL1wiLFxuICAgIC8vIC0tIHF1ZXN0aW9ucyAmIGNob2ljZXMgOlxuICAgIHF1ZXN0aW9uc1JvdXRlOiBcIi9xdWVzdGlvbi9cIixcbiAgICAvLyAtLSB0YWdzIDpcbiAgICB0YWdzU2VhcmNoUm91dGU6IFwiL3RhZ3Mvc2VhcmNoL1wiLFxuICAgIC8vIC0tIGFuc3dlcnMgOlxuICAgIGdldFF1ZXN0aW9ubmFpcmVzV2l0aG91dEFuc3dlcjogXCIvd2l0aG91dGFuc3dlci91c2VyL1wiLFxuICAgIGdldFByZXZpb3VzQW5zd2VyczogXCIvdXNlci9hbnN3ZXJzL1wiLFxuICAgIGdldFN0YXRzQW5zd2VycyA6IFwiL3VzZXIvYW53c3dlcnMvc3RhdHMvXCIsXG4gICAgZ2V0QWRtaW5TdGF0czogXCIvZ2V0YWRtaW5zdGF0cy9cIixcbiAgICAvLyBmb3JtcyA6IMOgIGNvbXBsw6l0ZXIgYXZlYyB2YWxldXJzIHBhciBkw6lmYXV0LCBldGMuIGNmIG1vZMOobGVcbiAgICBRdWVzdGlvbm5haXJlIDpcbiAgICB7XG4gICAgICAgIHRpdGxlOiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICBzbHVnOiB7IG1heGxlbmd0aDogMTUwIH0sIC8vIGNoYW1wIHJlcXVpcyBtYWlzIGNhbGN1bMOpIMOgIHBhcnRpciBkdSB0aXRyZSBxZCB2aWRlXG4gICAgICAgIGludHJvZHVjdGlvbjogeyByZXF1aXJlZDogdHJ1ZSB9XG4gICAgfSxcbiAgICBzZWFyY2hRdWVzdGlvbm5haXJlcyA6IHsgbWlubGVuZ3RoOiAzLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIFF1ZXN0aW9uIDpcbiAgICB7XG4gICAgICAgIHRleHQ6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgIHJhbms6IHsgcmVxdWlyZWQ6IHRydWUsIG1pbjoxLCBkZWZhdWx0VmFsdWU6MSB9XG4gICAgfSwgICAgICAgICAgXG4gICAgQ2hvaWNlIDpcbiAgICB7XG4gICAgICAgIHRleHQ6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH1cbiAgICB9LCAgICAgICAgICBcbiAgICBuYlF1ZXN0aW9uc01pbjogMSxcbiAgICBuYlF1ZXN0aW9uc01heDogMTAsXG4gICAgbmJDaG9pY2VzTWF4OiAxMCxcbiAgICBuYlRhZ3NNaW46IDAsXG4gICAgbmJUYWdzTWF4OiAwLCAvLyAwID0gbm90IG1heCAgICBcbiAgICAvLyBKU09OIGFuZCBIVE1MIGRpclxuICAgIGRpckNhY2hlUXVlc3Rpb25uYWlyZXMgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzXCIsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbnMgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzL3F1ZXN0aW9uc1wiLFxuICAgIGRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlcyA6IFwiZGF0YXMvdXNlcnMvcXVlc3Rpb25uYWlyZXNcIixcbiAgICBkaXJDYWNoZVRhZ3MgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzL3RhZ3NcIiwgIFxuICAgIGRpckhUTUxRdWVzdGlvbm5haXJlIDogXCJmcm9udC9wdWJsaWMvcXVpelwiLFxuICAgIGRpckhUTUxUYWdzIDogXCJmcm9udC9wdWJsaWMvcXVpenNcIixcbiAgICBkaXJXZWJRdWVzdGlvbm5haXJlIDogXCJxdWl6XCIsLy9wb3VyIHVybCBwYWdlXG4gICAgZGlyV2ViVGFncyA6IFwicXVpenNcIi8vIGlkZW1cbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIC8vIEFQSSdyb3V0ZXMgKGFmdGVyIFwiYXBpVXJsXCIgZGVmaW5lZCBpbiBpbnN0YW5jZS5qcylcbiAgICB1c2VyUm91dGVzOiBcIi91c2VyXCIsXG4gICAgc3Vic2NyaWJlUm91dGU6IFwiL3NpZ251cFwiLFxuICAgIGdldEdvZGZhdGhlclJvdXRlOiBcIi9nZXRnb2RmYXRoZXJpZFwiLFxuICAgIGNoZWNrSWZJc0VtYWlsZnJlZVJvdXRlOiBcIi9pc2VtYWlsZnJlZVwiLFxuICAgIGNoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZTogXCIvdmFsaWRhdGlvbi9cIixcbiAgICBjaGVja0xvZ2luUm91dGU6IFwiL2NoZWNrbG9naW4vXCIsXG4gICAgY29ubmVjdGlvblJvdXRlOiBcIi9sb2dpblwiLFxuICAgIGdldExvZ2luTGlua1JvdXRlOiBcIi9nZXRsb2dpbmxpbmtcIixcbiAgICBjb25uZWN0aW9uV2l0aExpbmtSb3V0ZTogXCIvY2hlY2tsb2dpbmxpbmtcIixcbiAgICBnZXRVc2VySW5mb3M6IFwiL2dldC9cIixcbiAgICBjcmVhdGVVc2VyUm91dGU6IFwiL2NyZWF0ZVwiLFxuICAgIHZhbGlkYXRlVXNlclJvdXRlOiBcIi92YWxpZGF0ZS9cIixcbiAgICB1cGRhdGVVc2VySW5mb3M6IFwiL21vZGlmeS9cIixcbiAgICBzZWFyY2hVc2VyUm91dGU6IFwiL3NlYXJjaC9cIixcbiAgICBnZXRHb2RDaGlsZHM6IFwiL2dldGdvZGNoaWxkcy9cIixcbiAgICBjaGVja05ld0xvZ2luTGlua1JvdXRlOiBcIi9jb25maXJtbmV3bG9naW4vXCIsXG4gICAgY2hlY2tEZWxldGVMaW5rUm91dGU6IFwiL2NvbmZpcm1kZWxldGUvXCIsXG4gICAgZ2V0UGF5bWVudHM6IFwiL3BheW1lbnQvZ2V0Zm9yb25ldXNlci9cIixcbiAgICB1bnN1YnNjcmliZVJvdXRlOiBcIi9zdWJzY3JpcHRpb24vc3RvcC9cIixcbiAgICBnZXRBZG1pblN0YXRzOiBcIi9nZXRhZG1pbnN0YXRzL1wiLFxuICAgIC8vIGZvcm1zIDogw6AgY29tcGzDqXRlciBhdmVjIHZhbGV1cnMgcGFyIGTDqWZhdXQsIGV0Yy4gY2YgbW9kw6hsZVxuICAgIG5hbWU6IHsgbWF4bGVuZ3RoOiA3MCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBlbWFpbDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBwYXNzd29yZDogeyBtaW5sZW5ndGg6IDgsIG1heGxlbmd0aDo3MiwgcmVxdWlyZWQ6IHRydWUgfSwgLy8gaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvYmNyeXB0I3NlY3VyaXR5LWlzc3Vlcy1hbmQtY29uY2VybnNcbiAgICBuZXdQYXNzd29yZDogeyBtaW5sZW5ndGg6IDgsIG1heGxlbmd0aDo3MiB9LFxuICAgIGNvZGVHb2RmYXRoZXI6IHsgbWF4bGVuZ3RoOiAyNTUgfSxcbiAgICBjZ3VPazogeyB2YWx1ZTogXCJ0cnVlXCIsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgdGltZURpZmZlcmVuY2VNaW46IC03MjAsXG4gICAgdGltZURpZmZlcmVuY2VNYXg6ODQwLFxuICAgIC8vIEpTT04gZGlyXG4gICAgZGlyQ2FjaGVVc2VycyA6IFwiZGF0YXMvdXNlcnNcIixcbiAgICBkaXJDYWNoZVVzZXJzQW5zd2VycyA6IFwiZGF0YXMvdXNlcnMvcXVlc3Rpb25uYWlyZXMvYW5zd2Vyc1wiXG59O1xuIiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL2dlbmVyYWxcIjogXCIuLi9sYW5nL2ZyL2dlbmVyYWwuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9nZW5lcmFsJFwiOyIsInZhciBtYXAgPSB7XG5cdFwiLi9mci91c2VyXCI6IFwiLi4vbGFuZy9mci91c2VyLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvdXNlciRcIjsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgc2l0ZUhUTUxUaXRsZSA6IFwiV2lraUxlcm5pIDogcXUnYWxsZXotdm91cyBhcHByZW5kcmUgYXVqb3VyZCdodWkgP1wiLFxuICAgIHNpdGVNZXRhRGVzY3JpcHRpb24gOiBcIkNoYXF1ZSBqb3VyLCB0ZXN0ZXogdm9zIGNvbm5haXNzYW5jZXMgZXQgYXBwcmVuZXogZGUgbm91dmVsbGVzIGNob3NlcyBhdmVjIFdpa2lMZXJuaS5cIixcbiAgICBzY3JpcHRUaW1pbmdJbmZvIDogXCJEdXLDqWUgZGUgbGEgcsOpcG9uc2UgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNjcmlwdFRpbWluZ0FsZXJ0IDogXCIqKiogU2NyaXB0IGxlbnQgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNlcnZlckVycm9yIDogXCJEw6lzb2zDqS4gVW5lIGVycmV1ciBpbXByw6l2dWUgZXN0IHN1cnZlbnVlLiBTaSBjZWxhIHBlcnNpc3RlLCBuJ2jDqXNpdGV6IMOgIHByw6l2ZW5pciBsJ2FkbWluaXN0cmF0ZXVyIGR1IHNpdGUuXCIsXG4gICAgc2VydmVyRXJyb3JBZG1pbiA6IFwiQnVnIGRlIGwnYXBwbGljYXRpb24gOlwiLFxuICAgIG5lZWRlZFBhcmFtcyA6IFwiRGVzIHBhcmFtw6h0cmVzIG7DqWNlc3NhaXJlcyBtYW5xdWFudHMgc29udCBtYW5xdWFudHMuXCIsXG4gICAgYmFkVXJsIDogXCJUZW50YXRpdmUgZCdhY2PDqHMgw6AgdW5lIHBhZ2UgbidleGlzdGFudCBwYXMgOlwiLFxuICAgIG5vdFZhbGlkRm9ybWF0IDogXCJGb3JtYXQgbm9uIHZhbGlkZS5cIixcbiAgICBub3RBbGxvd2VkIDogXCJWb3VzIG4nYXZleiBwYXMgbGVzIGRyb2l0cyBuw6ljZXNzYWlyZXMgcG91ciBjZXR0ZSBhY3Rpb24uXCIsXG4gICAgbm90UmVxdWlyZWQgOiBcIkZhY3VsdGF0aWYuXCIsXG4gICAgdXBkYXRlQnRuVHh0OiBcIk1vZGlmaWVyXCIsXG4gICAgYWRkQnRuVHh0OiBcIkFqb3V0ZXJcIixcbiAgICBkZWxldGVCdG5UeHQ6IFwiU3VwcHJpbWVyXCIsXG4gICAgYWRkT2tNZXNzYWdlIDogXCJMZXMgZG9ubsOpZXMgb250IGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llcy5cIixcbiAgICB1cGRhdGVPa01lc3NhZ2UgOiBcIkxhIG1pc2Ugw6Agam91ciDDoCBqb3VyIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgZGVsZXRlT2tNZXNzYWdlIDogXCJMYSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIGZhaWxBdXRoIDogXCJFcnJldXIgZCdhdXRoZW50aWZpY2F0aW9uLlwiLFxuICAgIGZhaWxBdXRoSGVhZGVyIDogXCJBYnNlbmNlIGRlIGhlYWRlciBBdXRob3JpemF0aW9uLlwiLFxuICAgIGZhaWxBdXRoVG9rZW4gOiBcIlRva2VuIGludmFsaWRlIG91IHV0aWxpc2F0ZXVyIG5vbiB0cm91dsOpLlwiLFxuICAgIGZhaWxBdXRoSWQgOiBcIklkZW50aWZpYW50IG5vbiB2YWxpZGUgOiBcIixcbiAgICBmYWlsQXV0aENyb24gOiBcIlRlbnRhdGl2ZSBkZSBsYW5jZW1lbnQgZCd1biBjcm9uIHNhbnMgbGUgYm9uIHRva2VuLlwiLFxuICAgIHByZXZpb3VzUGFnZSA6IFwiUGFnZSBwcsOpY8OpZGVudGVcIixcbiAgICBuZXh0UGFnZSA6IFwiUGFnZSBzdWl2YW50ZVwiLFxuICAgIGJ0bkxpbmtUb1F1ZXN0aW9ubmFpcmUgOiBcIkFsbGVyIGF1IHF1aXogIVwiLFxuICAgIHN0YXRzQWRtaW4gOiBcIkR1cmFudCBsZXMgZGVybmnDqHJlcyAyNGggOiBOQl9VU0VSU18yNEggY29tcHRlcyBvbnQgw6l0w6kgY3LDqcOpcywgTkJfU1VCU0NSSVBUSU9OU18yNEggdmFsaWTDqXMgZXQgTkJfVVNFUlNfREVMRVRFRF8yNEggc3VwcHJpbcOpcy4gTkJfQU5TV0VSU18yNEggcsOpcG9uc2VzIGF1eCBxdWl6cyBvbnQgw6l0w6kgZW5yZWdpc3Ryw6llcy48YnI+RW4gdG91dCwgaWwgeSBhIDogTkJfVVNFUlNfVE9UIGNvbXB0ZXMsIGRvbnQgTkJfU1VCU0NSSVBUSU9OU19UT1QgdmFsaWTDqXMgZXQgTkJfU1VCU0NSSVBUSU9OU19QUkVNSVVNIGNvbXB0ZXMgcHLDqW1pdW0uIE5CX0FOU1dFUlNfVE9UIHLDqXBvbnNlcyBhdXggcXVpenMgb250IMOpdMOpIGVucmVnaXN0csOpZXMuPGJyPlBhcm1pIGxlcyBOQl9VU0VSU19ERUxFVEVEX1RPVCBjb21wdGVzIHN1cHByaW3DqXMsIE5CX1VTRVJTX0RFTEVURURfVkFMSURFRCBhdmFpZW50IHZhbGlkw6kgbGV1ciBjb21wdGUgZXQgTkJfVVNFUlNfREVMRVRFRF9QUkVNSVVNIGF2YWllbnQgc291c2NyaXQgdW4gY29tcHRlIHByw6ltaXVtLlwiXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBub3RGb3VuZDogXCJMJ3V0aWxpc2F0ZXVyIG4nYSBwYXMgw6l0w6kgdHJvdXbDqS5cIixcbiAgICBuZWVkTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyLlwiLFxuICAgIG5lZWROb3RUb29Mb25nTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyIG5lIGNvbXB0YW50IHBhcyBwbHVzIGRlIDcwIGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRFbWFpbDogXCJNZXJjaSBkZSBzYWlzaXIgdm90cmUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgbmVlZFVuaXF1ZUVtYWlsOiBcIkwnYWRyZXNzZSBlLW1haWwgcXVlIHZvdXMgYXZleiBzYWlzaWUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcGFyIHVuIGF1dHJlIHV0aWxpc2F0ZXVyLiBTaSB2b3VzIGF2ZXogZMOpasOgIHVuIGNvbXB0ZSwgPGEgaHJlZj0nLyNVUkwnPmNsaXF1ZXotaWNpIHBvdXIgdm91cyBjb25uZWN0ZXI8L2E+LlwiLFxuICAgIG5lZWROb3RUb29Mb25nRW1haWw6IFwiTWVyY2kgZGUgc2Fpc2lyIHVuZSBhZHJlc3NlIGUtbWFpbCBuZSBjb21wdGFudCBwYXMgcGx1cyBkZSAyNTUgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZFBhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZS5cIixcbiAgICBuZWVkTG9uZ1Bhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZSBkJ2F1IG1vaW5zIE1JTl9MRU5HVEggY2FyYWN0w6hyZXMuXCIsXG4gICAgcGFzc3dvcmRDb3BpZWQ6IFwiTGUgbW90IGRlIHBhc3NlIGfDqW7DqXLDqSBhIMOpdMOpIGNvcGnDqSBkYW5zIGxlIHByZXNzZS1wYXBpZXIuIFZvdXMgcG91dmV6IGxlIHJlY29waWVyIG/DuSB2b3VzIGxlIHNvdWhhaXRlci5cIixcbiAgICBuZWVkU3RhdHVzIDogXCJJbCBtYW5xdWUgbGUgc3RhdHV0LlwiLFxuICAgIG5lZWRMYW5ndWFnZSA6IFwiSWwgbWFucXVlIGxlIGNvZGUgbGFuZ3VlLlwiLFxuICAgIG5lZWRWYWxpZExhc3RDb25uZWN0aW9uRGF0ZSA6IFwiTGEgZGF0ZSBkZSBkZXJuacOocmUgY29ubmV4aW9uIG4nZXN0IHBhcyB2YWxpZGUuXCIsXG4gICAgbmVlZFNNVFAgOiBcIklsIG1hbnF1ZSBsZSBzZXJ2ZXVyIFNNVFAuXCIsXG4gICAgbmVlZFNNVFBOb3RGb3VuZCA6IFwiSWwgbWFucXVlIGxlIHNlcnZldXIgU01UUC5cIixcbiAgICBuZWVkS25vd05ld3NsZXR0ZXJPayA6IFwiSWwgZmF1dCBzYXZvaXIgc2kgbCd1dGlsaXNhdGV1ciBhY2NlcHRlIG91IHJlZnVzZSBkZSByZWNldm9pciBsYSBuZXdzbGV0dGVyLlwiLFxuICAgIG5lZWRUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBjb25uYcOudHJlIGxlIG5vbWJyZSBkZSBtaW51dGVzIGR1IGTDqWNhbGFnZSBob3JhaXJlLlwiLFxuICAgIG5lZWRNaW5UaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGVubGV2ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgNzIwLlwiLFxuICAgIG5lZWRNYXhUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGFqb3V0ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgODQwLlwiLFxuICAgIG5lZWRVR0NPayA6IFwiVm91cyBkZXZleiBhY2NlcHRlciBsZXMgQ0dVIHBvdXIgcG91dm9pciBjcsOpZXIgdm90cmUgY29tcHRlLiBcIixcbiAgICBnb2RmYXRoZXJOb3RGb3VuZDogXCJBdWN1biB1dGlsaXNhdGV1ciB2YWxpZGUgdHJvdXbDqSBwb3VyIGNlIGNvZGUgcGFycmFpbi5cIixcbiAgICBnb2RmYXRoZXJGb3VuZDogXCJWb3RyZSBwYXJyYWluIGEgYmllbiDDqXTDqSB0cm91dsOpICFcIixcbiAgICBtYWlsVmFsaWRhdGlvbk1lc3NhZ2U6IFwiVm90cmUgaW5zY3JpcHRpb24gZXN0IGJpZW4gZW5yZWdpc3Ryw6llLlxcblBvdXIgbGEgZmluYWxpc2VyLCBtZXJjaSBkZSBjbGlxdWVyIGRhbnMgbGVzIDI0SCBzdXIgbGUgbGllbiBkZSBjb25maXJtYXRpb24gcXVpIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBwYXIgZS1tYWlsLlwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1N1YmplY3QgOiBcIk1lcmNpIGRlIHZhbGlkZXIgdm90cmUgY29tcHRlXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblBvdXIgdmFsaWRlciB2b3RyZSBjb21wdGUsIG1lcmNpIGRlIGNsaXF1ZXIgc3VyIGxlIGxpZW4gc3VpdmFudCBkYW5zIGxlcyAyNGggOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm90cmUgY29tcHRlLCBtZXJjaSBkZSBjbGlxdWVyIHN1ciBsZSBsaWVuIHN1aXZhbnQgZGFucyBsZXMgMjRoLjwvcD48cD48YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+VmFsaWRlci48L2E+PC9wPlwiLFxuICAgIHZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGNvbXB0ZSB2aWVudCBiaWVuIGQnw6p0cmUgdmFsaWTDqS4gTWVyY2kgZXQgYmllbnZlbnVlICE8YnI+Vm91cyBwb3V2ZXogc2FucyB0YXJkZXIgdm91cyBjb25uZWN0ZXIgY2ktZGVzc291cyBwb3VyIGFjY8OpZGVyIMOgIHZvdHJlIGNvbXB0ZS5cIixcbiAgICB2YWxpZGF0aW9uTWVzc2FnZUFkbWluOiBcIkxlIGNvbXB0ZSBhIGJpZW4gw6l0w6kgdmFsaWTDqS5cIixcbiAgICB2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2U6IFwiSWwgc2VtYmxlIHF1ZSB2b3VzIGF5ZXogZMOpasOgIHZhbGlkw6kgdm90cmUgY29tcHRlLlwiLFxuICAgIHZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZUFkbWluOiBcIkNlIGNvbXB0ZSBhIGTDqWrDoCDDqXTDqSB2YWxpZMOpLlwiLFxuICAgIG1haWxXZWxjb21lU3ViamVjdCA6IFwiQmllbnZlbnVlICFcIixcbiAgICBtYWlsV2VsY29tZUJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblZvdHJlIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuXFxuTWVyY2kgZXQgw6AgYmllbnTDtHQgIVwiLFxuICAgIG1haWxXZWxjb21lQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlZvdHJlIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuPC9wPjxwPk1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyU3ViamVjdCA6IFwiTWVyY2kgIVwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlckJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcbkdyw6JjZSDDoCB2b3VzIHVuIG5vdXZlbCB1dGlsaXNhdGV1ciAoRU1BSUwpIHZpZW50IGRlIHMnaW5zY3JpcmUgc3VyIE5PTV9TSVRFLlxcbk1lcmNpIGV0IMOgIGJpZW50w7R0ICFcIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+R3LDomNlIMOgIHZvdXMgdW4gbm91dmVsIHV0aWxpc2F0ZXVyIChFTUFJTCkgdmllbnQgZGUgcydpbnNjcmlyZSBzdXIgTk9NX1NJVEUuPC9wPjxwPk1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGxpZW4gZGUgY29uZmlybWF0aW9uIG5lIHNlbWJsZSBwYXMgdmFsaWRlIG91IGJpZW4gaWwgYSBleHBpcsOpLiBWb3VzIHBvdXZleiBlbiByZWNldm9pciB1biBub3V2ZWF1IDxhIGhyZWY9JyNVUkwnPmVuIGNsaXF1YW50IGljaTwvYT4uXCIsXG4gICAgZW1haWxOb3RGb3VuZDogXCJBdWN1biB1dGlsaXNhdGV1ciB0cm91dsOpIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgYWxyZWFkeUNvbm5lY3RlZDogXCJWb3VzIMOqdGVzIGTDqWrDoCBjb25uZWN0w6koZSkgYXUgc2l0ZSAhXCIsXG4gICAgbmVlZEJlQ29ubmVjdGVkOiBcIlZvdXMgZGV2ZXogw6p0cmUgY29ubmVjdMOpKGUpIHBvdXIgYWNjw6lkZXIgw6AgY2V0dGUgcGFnZS5cIixcbiAgICBjb25uZWN0aW9uT2s6IFwiQ29ubmV4aW9uIHLDqXVzc2llLlwiLFxuICAgIG5lZWRDaG9vc2VMb2dpbldheTogXCJWb3VzIGRldmV6IHNvaXQgc2Fpc2lyIHZvdHJlIG1vdCBkZSBwYXNzZSwgc29pdCBjb2NoZXIgbGEgY2FzZSB2b3VzIHBlcm1ldHRhbnQgZGUgcmVjZXZvaXIgdW4gbGllbiBkZSBjb25uZXhpb24gcGFyIGUtbWFpbC5cIixcbiAgICBuZWVkVmFsaWRhdGlvblRvTG9naW4gOiBcIlZvdXMgZGV2ZXogZCdhYm9yZCB2YWxpZGVyIHZvdHJlIGNvbXB0ZSBhdmFudCBkZSB2b3VzIGNvbm5lY3Rlci4gUG91ciBjZSBmYWlyZSwgdW4gbGllbiB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbC5cIixcbiAgICB0b29NYW55TG9naW5GYWlscyA6IFwiVHJvcCBkZSB0ZW50YXRpdmVzIGRlIGNvbm5leGlvbiBpbmZydWN0dWV1c2VzIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuIFZvdXMgZGV2ZXogYXR0ZW5kcmUgTUlOVVRFUyBtaW51dGVzIHBvdXIgZXNzYXllciBkZSBub3V2ZWF1LlwiLFxuICAgIGJhZFBhc3N3b3JkOiBcIkxlIG1vdCBkZSBwYXNzZSBuJ2VzdCBwYXMgbGUgYm9uLlwiLFxuICAgIG1haWxMb2dpbkxpbmtTdWJqZWN0IDogXCJWb3RyZSBsaWVuIGRlIGNvbm5leGlvbi5cIixcbiAgICBtYWlsTG9naW5MaW5rQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuUG91ciB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6IExJTktfVVJMXCIsXG4gICAgbWFpbExvZ2luTGlua0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZvdXMgY29ubmVjdGVyIMOgIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDo8L3A+PHA+PGEgaHJlZj1cXFwiTElOS19VUkxcXFwiPlZhbGlkZXIuPC9hPjwvcD5cIixcbiAgICBtYWlsTG9naW5MaW5rTWVzc2FnZSA6IFwiVW4gbGllbiBkZSBjb25uZXhpb24gdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHN1ciB2b3RyZSBhZHJlc3NlIGUtbWFpbC4gTmUgdGFyZGV6IHBhcyDDoCBsJ3V0aWxpc2VyLCBjYXIgaWwgbidlc3QgdmFsYWJsZSBxdWUgZHVyYW50IFwiLFxuICAgIHVwZGF0ZWRPa01lc3NhZ2U6IFwiVm9zIGluZm9ybWF0aW9ucyBvbnQgYmllbiDDqXTDqSBtaXNlcyDDoCBqb3VyLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEVtYWlsIDogXCJNYWlzIGxhIG5vdXZlbGxlIGFkcmVzc2UgZS1tYWlsIG4nYSBwdSDDqnRyZSBlbnJlZ2lzdHLDqWUgY2FyIGVsbGUgbidhIHBhcyB1bmUgZm9ybWF0IGNvcnJlY3QuXCIsXG4gICAgdXBkYXRlZE5lZWRVbmlxdWVFbWFpbCA6IFwiTWFpcyBsYSBub3V2ZWxsZSBhZHJlc3NlIGUtbWFpbCBzYWlzaWUgKE5FV19FTUFJTCkgbidhIHB1IMOqdHJlIGVucmVnaXN0csOpZSwgY2FyIGVsbGUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcG91ciB1biBhdXRyZSBjb21wdGUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luU3ViamVjdCA6IFwiTWVyY2kgZGUgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblBvdXIgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cyBkZSBjb25uZXhpb24sIDxhIGhyZWY9XFxcIkxJTktfVVJMXFxcIj5jbGlxdWV6IGljaTwvYT4gc2FucyB0YXJkZXIuPC9wPlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkxpbmtNZXNzYWdlOiBcIkNlcGVuZGFudCwgdm91cyBhdmV6IG1vZGlmacOpIGF1IG1vaW5zIHVuIGRlIHZvcyBpZGVudGlmaWFudHMgZGUgY29ubmV4aW9uIChlbWFpbCBldC9vdSBtb3QgZGUgcGFzc2UpIGV0IDxiPnZvdXMgZGV2ZXogY2xpcXVlciBzdXIgbGUgbGllbiBxdWkgdmllbnQgZGUgdm91cyDDqnRyZXMgZW52b3nDqSBzdXIgdm90cmUgYWRyZXNzZSAoTkVXX0VNQUlMKSBwb3VyIHZhbGlkZXIgY2UgY2hhbmdlbWVudDwvYj4uIEVuIGF0dGVuZGFudCwgbWVyY2kgZGUgY29udGludWVyIMOgIHV0aWxpc2VyIHZvcyBhbmNpZW5zIGlkZW50aWZpYW50cy5cIixcbiAgICB1cGRhdGVkTmVlZFZhbGlkYXRlZFVzZXI6IFwiTCd1dGlsaXNhdGV1ciBxdWUgdm91cyBzb3VoYWl0w6kgbW9kaWZpZXIgbidleGlzdGUgcGFzL3BsdXMgb3UgbidhIHBhcyBlbmNvcmUgdmFsaWTDqSBzb24gY29tcHRlLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEdvZGZhdGhlciA6IFwiTWFpcyBsZSBub3V2ZWF1IGNvZGUgcGFycmFpbiBuJ2EgcHUgw6p0cmUgcmV0ZW51LCBjYXIgaWwgbmUgY29ycmVzcG9uZCDDoCBhdWN1biBjb21wdGUgdXRpbGlzYXRldXIgb3Ugw6AgbCd1dGlsaXNhdGV1ciBsdWktbcOqbWUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luT2tNZXNzYWdlOiBcIkxhIG1pc2Ugw6Agam91ciBkZSB2b3MgaWRlbnRpZmlhbnRzIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgdXBkYXRlZEZhaWxlZEdvZGZhdGhlck5vdEZvdW5kIDogXCJMJ2lkZW50aWZpYW50IGZvdXJuaSBwb3VyIGxlIHBhcnJhaW4gbmUgY29ycmVzcG9uZCDDoCBhdWN1biB1dGlsaXNhdGV1ci5cIixcbiAgICBjcmVhdGlvbk9rTWVzc2FnZTogXCJMZSBub3V2ZWwgdXRpbGlzYXRldXIgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpLlwiLFxuICAgIG1haWxEZWxldGVTdWJqZWN0IDogXCJDb25maXJtZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLlwiLFxuICAgIG1haWxEZWxldGVCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5Qb3VyIHZhbGlkZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbERlbGV0ZUJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCA8YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+Y2xpcXVleiBpY2k8L2E+IHNhbnMgdGFyZGVyLjwvcD5cIixcbiAgICBtYWlsRGVsZXRlTGlua01lc3NhZ2U6IFwiVm90cmUgZGVtYW5kZSBkZSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLiBNZXJjaSBkZSBjbGlxdWVyIHNhbnMgdGFyZGVyIHN1ciBsZSBsaWVuIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbCBwb3VyIGNvbmZpcm1lci5cIixcbiAgICBkZWxldGVPa01lc3NhZ2U6IFwiTCd1dGlsaXNhdGV1ciBhIGJpZW4gw6l0w6kgc3VwcHJpbcOpLlwiLFxuICAgIGRlbGV0ZUZhaWxNZXNzYWdlOiBcIlRlbnRhdGl2ZSBkZSBzdXBwcmVzc2lvbiBkJ3VuIHV0aWxpc2F0ZXVyIGluZXhpc3RhbnQgOiBcIixcbiAgICBtYWlsRGVsZXRlTGlua09rTWVzc2FnZTogXCJWb3RyZSBjb21wdGUgYSBiaWVuIMOpdMOpIHN1cHByaW3DqS4gTWVyY2kgZCdhdm9pciB1dGlsaXPDqSBub3Mgc2VydmljZXMuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtBbHJlYWR5TWVzc2FnZTogXCJJbCBzZW1ibGUgcXVlIHZvdXMgYXlleiBkw6lqw6AgdmFsaWTDqSBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtGYWlsTWVzc2FnZTogXCJWb3RyZSBsaWVuIGRlIHN1cHByZXNzaW9uIG4nZXN0IHBhcyB2YWxpZGUgb3UgYWxvcnMgaWwgbidlc3QgcGx1cyB2YWxhYmxlLlwiLFxuICAgIGNyb25EZWxldGVVbnZhbGlkZWRVc2Vyc01lc3NhZ2U6IFwiIGNvbXB0ZXMgdXRpbGlzYXRldXJzIG5vbiB2YWxpZMOpcyBvbnQgw6l0w6kgc3VwcHJpbcOpcy5cIixcbiAgICBkZWxldGVJbmFjdGl2ZVVzZXJzTWVzc2FnZTogXCIgY29tcHRlcyB1dGlsaXNhdGV1cnMgaW5hY3RpZnMgb250IMOpdMOpIHN1cHByaW3DqXMuXCIsXG4gICAgd2VsY29tZU1lc3NhZ2U6IFwiQmllbnZlbnVlICNOQU1FICFcIixcbiAgICBieWVieWVNZXNzYWdlOiBcIlNpIHZvdXMgdm95ZXogY2UgbWVzc2FnZSwgYydlc3QgcXVlIHZvdHJlIGTDqWNvbm5leGlvbiBzJ2VzdCBiaWVuIGTDqXJvdWzDqWUuPGJyPsOAIGJpZW50w7R0ICFcIixcbiAgICBpbmZvc1VzZXJGb3JBZG1pbjogXCJDZXQgdXRpbGlzYXRldXIgKGlkOiBJRF9VU0VSKSBhIDxiPmNyw6nDqSBzb24gY29tcHRlIGxlIERBVEVfQ1JFQTwvYj4sIGxhIGRlcm5pw6hyZSBtaXNlIMOgIGpvdXIgZGF0YW50IGR1IERBVEVfVVBEQVRFLjxicj48Yj5EYXRlIGRlIHNhIGRlcm5pw6hyZSBjb25uZXhpb24gOiBEQVRFX0NPTk5FQ1RJT04uPC9iPlwiLFxuICAgIGluZm9zQWRtaW5Hb2RmYXRoZXI6IFwiQ2V0IHV0aWxpc2F0ZXVyIGEgw6l0w6kgcGFycmFpbsOpIHBhciBcIixcbiAgICBpbmZvc0FkbWluTmJHb2RDaGlsZHM6IFwiU2VzICNOQiBmaWxsZXVpbHMgOiBcIlxufTsiLCIvLyBRdWVscXVlcyBmb25jdGlvbnMgdXRpbGVzIHBvdXIgbGVzIGNoYcOubmVzXG5cbmNsYXNzIFRvb2xcbntcbiAgICBzdGF0aWMgaXNFbXB0eShteVZhcilcbiAgICB7XG4gICAgICAgIGlmKG15VmFyPT09dW5kZWZpbmVkIHx8IG15VmFyPT09bnVsbClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIG15VmFyKz1cIlwiOy8vIHNpIGF1dHJlIGNob3NlIHF1J3VuZSBjaGHDrm5lIGVudm95w6kuLi5cbiAgICAgICAgICAgIG15VmFyPW15VmFyLnRyaW0oKTtcbiAgICAgICAgICAgIGlmKG15VmFyPT09XCJcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgc3RhdGljIHRyaW1JZk5vdE51bGwobXlTdHJpbmcpXG4gICAge1xuICAgICAgICBpZihUb29sLmlzRW1wdHkobXlTdHJpbmcpKVxuICAgICAgICAgICAgbXlTdHJpbmc9bnVsbDtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVN0cmluZys9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVN0cmluZz1teVN0cmluZy50cmltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG15U3RyaW5nO1xuICAgIH1cblxuXG4gICAgc3RhdGljIHNob3J0ZW5JZkxvbmdlclRoYW4obXlTdHJpbmcsIG1heClcbiAgICB7XG4gICAgICAgIG15U3RyaW5nKz1cIlwiOy8vIGF1IGNhcyBvw7kgY2VsYSBuZSBzZXJhaXQgcGFzIHVuZSBjaGHDrm5lLi4uXG4gICAgICAgaWYobXlTdHJpbmcubGVuZ3RoID4gbWF4KVxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcuc3Vic3RyaW5nKDAsIChtYXgtMykpK1wiLi4uXCI7XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cbiAgICAvLyBzb3VyY2UgOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNTYwNDE0MC9yZXBsYWNlLW11bHRpcGxlLXN0cmluZ3Mtd2l0aC1tdWx0aXBsZS1vdGhlci1zdHJpbmdzXG4gICAgc3RhdGljIHJlcGxhY2VBbGwobXlTdHJpbmcsIG1hcE9iailcbiAgICB7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VFbHRzID0gbmV3IFJlZ0V4cChPYmplY3Qua2V5cyhtYXBPYmopLmpvaW4oXCJ8XCIpLFwiZ2lcIik7XG4gICAgICAgIHJldHVybiBteVN0cmluZy5yZXBsYWNlKHJlcGxhY2VFbHRzLCAobWF0Y2hlZCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG1hcE9ialttYXRjaGVkXTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZnIvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT2JqZXRzX2dsb2JhdXgvTWF0aC9yYW5kb21cbiAgICBzdGF0aWMgZ2V0UmFuZG9tSW50KG1pbiwgbWF4KVxuICAgIHtcbiAgICAgICAgbWluID0gTWF0aC5jZWlsKG1pbik7XG4gICAgICAgIG1heCA9IE1hdGguZmxvb3IobWF4KTtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pKSArIG1pbjtcbiAgICB9XG5cbiAgICAvLyDDoCBjb21wbMOpdGVyIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGF0ZV9mb3JtYXRfYnlfY291bnRyeVxuICAgIHN0YXRpYyBkYXRlRm9ybWF0KGRhdGVTdHJpbmcsIGxhbmc9XCJmclwiKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KGRhdGVTdHJpbmcpKVxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIGxldCBteURhdGU9bmV3IERhdGUoZGF0ZVN0cmluZyk7XG4gICAgICAgIGxldCBteURheT1teURhdGUuZ2V0RGF0ZSgpK1wiXCI7XG4gICAgICAgIGlmKG15RGF5Lmxlbmd0aD09PTEpXG4gICAgICAgICAgICBteURheT1cIjBcIitteURheTtcbiAgICAgICAgbGV0IG15TW91bnRoPShteURhdGUuZ2V0TW9udGgoKSsxKStcIlwiO1xuICAgICAgICBpZihteU1vdW50aC5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlNb3VudGg9XCIwXCIrbXlNb3VudGg7XG4gICAgICAgIGxldCBteVllYXI9bXlEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGlmKGxhbmc9PT1cImZyXCIpXG4gICAgICAgICAgICByZXR1cm4gbXlEYXkrXCIvXCIrbXlNb3VudGgrXCIvXCIrbXlZZWFyO1xuICAgICAgICBlbHNlIGlmIChsYW5nPT09XCJmb3JtXCIpLy8gMjAxNC0wMi0wOVxuICAgICAgICAgICAgcmV0dXJuIG15WWVhcitcIi1cIitteU1vdW50aCtcIi1cIitteURheTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG15TW91bnRoK1wiL1wiK215RGF5K1wiL1wiK215WWVhcjtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVG9vbDsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZGVmYXVsdC9jb25maWcvZnIuanNcIjogXCIuLi92aWV3cy9kZWZhdWx0L2NvbmZpZy9mci5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi92aWV3cyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC5qcyRcIjsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgaGVhZExpbmtzOlxuICAgIFtcbiAgICAgICAgeyBhbmNob3I6IFwiQWNjdWVpbFwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNb24gY29tcHRlXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb25uZXhpb24uaG10XCIsIGlkOiBcImFjY291bnRIZWFkTGlua1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiw4AgcHJvcG9zXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9hLXByb3Bvcy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDb250YWN0XCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb250YWN0Lmh0bWxcIiB9IH0sXG4gICAgXSxcbiAgICBmb290TGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJDcsOpZGl0c1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY3JlZGl0cy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNZW50aW9ucyBsw6lnYWxlc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvbWVudGlvbnMtbGVnYWxlcy5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiRG9ubsOpZXMgcGVyc29ubmVsbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9kb25uZWVzLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkMuRy5VLlwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY2d1Lmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDLkcuVi5cIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nndi5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICBdLFxuICAgIG1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlOiAxMCxcbiAgICB1c2VySG9tZVBhZ2UgOiBcImFjY3VlaWwuaHRtbFwiLFxuICAgIGFkbWluSG9tZVBhZ2UgOiBcImFkbWluLmh0bWxcIixcbiAgICBtYW5hZ2VySG9tZVBhZ2UgOiBcImdlc3Rpb24uaHRtbFwiLFxuICAgIHN1YnNjcmliZVBhZ2UgOiBcImluc2NyaXB0aW9uLmh0bWxcIixcbiAgICBjb25uZWN0aW9uUGFnZSA6IFwiY29ubmV4aW9uLmh0bWxcIixcbiAgICBhY2NvdW50UGFnZTogXCJjb21wdGUuaHRtbFwiLFxuICAgIHF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi1xdWl6cy5odG1sXCIsXG4gICAgdXNlcnNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXV0aWxpc2F0ZXVycy5odG1sXCIsXG4gICAgbmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSA6IDEwLFxuICAgIGlsbHVzdHJhdGlvbkRpciA6IFwiL2ltZy9xdWl6cy9cIixcbiAgICBzaXRlU2xvZ2FuOiBcIkN1bHRpdm9ucyBub3RyZSBqYXJkaW4gIVwiLFxuICAgIGhvbWVUaXRsZTE6IFwiRGUgbmF0dXJlIGN1cmlldXNlID9cIixcbiAgICBob21lUDE6IFwiQXZlYyBXaWtpTGVybmkgdm91cyBhcHByZW5leiBjaGFxdWUgam91ciBkZSBub3V2ZWxsZXMgY2hvc2VzLjxicj5EZXMgYXJ0aWNsZXMgZGUgV2lraXDDqWRpYSBzb250IHPDqWxlY3Rpb25uw6lzIHBvdXIgdm91cyBldCBzb250IHN1aXZpcyBkJ3VuIHF1aXogdm91cyBwZXJtZXR0YW50IGRlIHRlc3RlciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudS48YnI+RGUgam91ciBlbiBqb3VyIGRlIG5vdXZlbGxlcyBncmFpbmVzIGRlIHNhdm9pciBzb250IGFpbnNpIHNlbcOpZXMgZGFucyB2b3RyZSBcXFwiamFyZGluXFxcIi5cIixcbiAgICBob21lVGl0bGUyOiBcIkxhIGN1bHR1cmUgZW4gbGliZXJ0w6lcIixcbiAgICBob21lUDI6IFwiVG91dCBjb21tZSBzdXIgV2lraXDDqWRpYSAoKiksIGxlIGxvZ2ljaWVsIGV0IGxlIGNvbnRlbnUgcGFydGFnw6kgc3VyIFdpa2lMZXJuaSBzb250IGxpYnJlcy48YnI+Vm91cyBwb3V2ZXogbGVzIHV0aWxpc2VyLCBsZXMgbW9kaWZpZXIgZXQgbGVzIGRpZmZ1c2VyIHNlbG9uIHZvdHJlIHNvdWhhaXQuPGJyPlN1ciBXaWtpTGVybmksIHBhcyBkZSBwdWJsaWNpdMOpLCBuaSBkZSBjb21tZXJjaWFsaXNhdGlvbiBkZSB2b3MgZG9ubsOpZXMgcGVyc29ubmVsbGVzLjxicj5Wb3VzIHBvdXZleiB2ZW5pciB5IFxcXCJjdWx0aXZlciB2b3RyZSBqYXJkaW5cXFwiIGVuIHRvdXRlIHRyYW5xdWlsbGl0w6kuPGJyPjxicj48c21hbGw+PGVtPigqKSBCaWVuIHF1ZSBwYXJ0YWdlYW50IHNlcyB2YWxldXJzLCBXaWtpTGVybmkgZXN0IHVuIHByb2pldCBpbmTDqXBlbmRhbnQgZGUgbGEgZm9uZGF0aW9uIFdpa2lww6lkaWEuPC9lbT48L3NtYWxsPlwiLFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzVGl0bGU6IFwiTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzIHN1ciBXaWtpTGVybmlcIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc0ludHJvOiBcIkxpc3RlIGRlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyBzdXIgV2lraUxlcm5pLlwiLFxuICAgIGV4cGxhbmF0aW9uVGl0bGU6IFwiVm91cyBkw6ljb3V2cmV6IFdpa2lMZXJuaSA/XCIsXG4gICAgZXhwbGFuYXRpb25UeHQ6IFwiTGUgcHJpbmNpcGUgZXN0IHNpbXBsZSA6IHZvdXMgY29tbWVuY2V6IHBhciBsaXJlIGwnYXJ0aWNsZSBXaWtpcMOpZGlhIGRvbnQgbGUgbGllbiB2b3VzIGVzdCBwcm9wb3PDqS48YnI+UHVpcyB2b3VzIGFmZmljaGVyIGxlIHF1aXogcG91ciB2w6lyaWZpZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUgZGUgdm90cmUgbGVjdHVyZS4gVm91cyBvYnRlbmV6IGFsb3JzIHZvdHJlIHLDqXN1bHRhdCBpbW3DqWRpYXRlbWVudC48YnI+PGJyPlRvdXRlcyBsZXMgcsOpcG9uc2VzIHNlIHRyb3V2ZW50IGRhbnMgbCdhcnRpY2xlIHByb3Bvc8OpIMOgIGxhIGxlY3R1cmUuIDxiPlZvdXMgw6p0ZXMgaWNpIHBvdXIgYXBwcmVuZHJlIGRlIG5vdXZlbGxlcyBjaG9zZXM8L2I+LCBtYWlzIGxpYnJlIMOgIHZvdXMgZCdlc3NheWVyIGQneSByw6lwb25kcmUgaW1tw6lkaWF0ZW1lbnQuPGJyPjxicj5RdWFuZCBsZSBzdWpldCBzJ3kgcHLDqnRlLCBuZSB2b3VzIMOpdG9ubmV6IHBhcyBzaSBjZXJ0YWluZXMgZGVzIHLDqXBvbnNlcyBwcm9wb3PDqWVzIHBldXZlbnQgw6p0cmUgdW4gcGV1IGTDqWNhbMOpZXMsIGFic3VyZGVzLi4uIE9uIHBldXQgYXBwcmVuZHJlIGF2ZWMgbGUgc291cmlyZSwgbm9uID8gOi0pPGJyPjxicj5VbmUgZm9pcyB2b3RyZSByw6lzdWx0YXQgb2J0ZW51LCBpbCB2b3VzIHNlcmEgcHJvcG9zw6kgZGUgY3LDqWVyIHVuIGNvbXB0ZSBwb3VyIGxlIHNhdXZlZ2FyZGVyLjxicj5DZSBjb21wdGUgdm91cyBwZXJtZXR0cmEgZGUgdGVzdGVyIGRlIG5vdXZlYXUgY2UgcXVpeiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudSBwbHVzaWV1cnMgam91cnMsIHNlbWFpbmVzLCBtb2lzLi4uIEV0IGRlIHJlY2V2b2lyIHLDqWd1bGnDqHJlbWVudCBkZSBub3V2ZWxsZXMgc3VnZ2VzdGlvbnMgZGUgbGVjdHVyZXMuPGJyPjxicj5NYWlzIDxiPmxhIGNyw6lhdGlvbiBkZSBjZSBjb21wdGUgZXN0IGZhY3VsdGF0aXZlPC9iPiBldCA8YSBocmVmPScvcXVpenMvJyB0aXRsZT0nTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzJz52b3VzIHBvdXZleiBwYXJjb3VyaXIgV2lraUxlcm5pIGxpYnJlbWVudDwvYT4uXCIsXG4gICAgbm9KU05vdGlmaWNhdGlvbjogXCJEw6lzb2zDqSwgbWFpcyBwb3VyIGwnaW5zdGFudCwgbCd1dGlsaXNhdGlvbiBkZSBXaWtpTGVybmkgbsOpY2Vzc2l0ZSBsJ2FjdGl2YXRpb24gZHUgSmF2YVNjcmlwdC5cIixcbn07IiwiLy8gLS0gR0VTVElPTiBERSBMQSBQQUdFIERFIETDiUNPTk5FWElPTlxuXG4vLy8gT24gc2UgY29udGVudGUgaWNpIGRlIHN1cHByaW1lciBsYSBzZXNzaW9uIHN0b2Nrw6llIGPDtHTDqSBjbGllbnRcblxuLy8gRmljaGllciBkZSBjb25maWd1cmF0aW9uIGPDtHTDqSBjbGllbnQgOlxuaW1wb3J0IHsgYXBpVXJsLCBhdmFpbGFibGVMYW5ncywgdGhlbWUgfSBmcm9tIFwiLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCI7XG5jb25zdCBsYW5nPWF2YWlsYWJsZUxhbmdzWzBdO1xuY29uc3QgY29uZmlnRnJvbnRFbmQgPSByZXF1aXJlKFwiLi4vLi4vdmlld3MvXCIrdGhlbWUrXCIvY29uZmlnL1wiK2xhbmcrXCIuanNcIik7XG5cbi8vIEltcG9ydGF0aW9uIGRlcyBmb25jdGlvbnMgdXRpbGUgYXUgc2NyaXB0IDpcbmltcG9ydCB7IHJlbW92ZUxvY2FseSB9IGZyb20gXCIuL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanNcIjtcbmltcG9ydCB7IGFkZEVsZW1lbnQgfSBmcm9tIFwiLi90b29scy9kb20uanNcIjtcbmltcG9ydCB7IGhlbGxvRGV2IH0gZnJvbSBcIi4vdG9vbHMvZXZlcnl3aGVyZS5qc1wiO1xuaW1wb3J0IHsgZ2V0Q29uZmlnIH0gZnJvbSBcIi4vdG9vbHMvdXNlcnMuanNcIjtcblxuLy8gRGljdGlvbm5haXJlcyA6XG5jb25zdCB0eHQgPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL2dlbmVyYWxcIik7XG5jb25zdCB0eHRVc2VycyA9IHJlcXVpcmUoXCIuLi8uLi9sYW5nL1wiK2xhbmcrXCIvdXNlclwiKTtcblxuaGVsbG9EZXYoKTtcblxuY29uc3QgZGl2UmVzcG9uc2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJlc3BvbnNlXCIpO1xubGV0IGNvbmZpZztcbmNvbnN0IGluaXRpYWxpc2UgPSBhc3luYyAoKSA9Plxue1xuICAgIHRyeVxuICAgIHtcbiAgICAgICAgY29uZmlnID0gYXdhaXQgZ2V0Q29uZmlnKCk7XG4gICAgICAgIGlmKCFjb25maWcpXG4gICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgdHh0LnNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVybFwiKTtcbiAgICAgICAgICAgIHJlbW92ZUxvY2FseShcIm1lc3NhZ2VcIik7XG4gICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgdHh0VXNlcnMuYnllYnllTWVzc2FnZSwgXCJcIiwgW1wic3VjY2Vzc1wiXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2goZSlcbiAgICB7XG4gICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHQuc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICB9XG59XG5pbml0aWFsaXNlKCk7IiwiLy8gRk9OQ1RJT05TIFVUSUxFUyBBVSBTVE9DS0FHRSBMT0NBTCAoU0VTU0lPTiwgQ09PS0lFUywgSU5ERVhEQiwgRVRDLilcbi8vIFJldmVuaXIgcG91ciBnw6lyZXIgbGUgY2FzIG/DuSBsb2NhbC5zdG9yYWdlIG4nZXN0IHBhcyBjb25udSBwb3VyIHV0aWxpc2VyIGNvb2tpZVxuICAgIFxuZXhwb3J0IGNvbnN0IHNhdmVMb2NhbHkgPSAobmFtZSwgZGF0YSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShuYW1lLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2NhbHkgPSAobmFtZSwganNvbj1mYWxzZSkgPT5cbntcbiAgICBpZihqc29uKVxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKSk7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSk7XG59XG5cbmV4cG9ydCBjb25zdCByZW1vdmVMb2NhbHkgPSAobmFtZSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShuYW1lKTtcbn0iLCJpbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gRm9uY3Rpb24gYXNzb2NpYW50IGxlcyBhdHRyaWJ1dHMgZm91cm5pcyDDoCB1biBjaGFtcCBkZSBmb3JtdWxhaXJlXG5leHBvcnQgY29uc3QgYWRkRWxlbWVudCA9IChlbHRQYXJlbnQsIGVsdFR5cGUsIGVsdENvbnRlbnQ9XCJcIiwgZWx0SWQ9XCJcIiwgZWx0Q2xhc3M9W10sIGVsdEF0dHJpYnV0ZXM9e30sIHJlcGxhY2U9dHJ1ZSkgPT5cbntcbiAgICBpZihpc0VtcHR5KGVsdFR5cGUpIHx8IGlzRW1wdHkoZWx0UGFyZW50KSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGVsc2VcbiAgICB7XG4gICAgICAgIGNvbnN0IG5ld0VsZW1lbnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlbHRUeXBlKTtcbiAgICAgICAgXG4gICAgICAgIGlmKCFpc0VtcHR5KGVsdElkKSkvLyB0ZXN0ZXIgc2kgbCdpZCBuJ2VzdCBwYXMgZMOpasOgIHV0aWxpc8OpIGRhbnMgbGUgRE9NID9cbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaWQ9ZWx0SWQ7XG5cbiAgICAgICAgaWYoQXJyYXkuaXNBcnJheShlbHRDbGFzcykgJiYgZWx0Q2xhc3MubGVuZ3RoIT0wKVxuICAgICAgICB7XG4gICAgICAgICAgICBmb3IobGV0IGkgaW4gZWx0Q2xhc3MpXG4gICAgICAgICAgICAgICAgbmV3RWxlbWVudC5jbGFzc0xpc3QuYWRkKGVsdENsYXNzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHR5cGVvZiBlbHRBdHRyaWJ1dGVzID09PSBcIm9iamVjdFwiKSAvLyAhISB0b3VzIGxlcyBvYmpldHMgbmUgc29udCBwYXMgb2tcbiAgICAgICAge1xuICAgICAgICAgICAgZm9yKGxldCBhdHRyaWJ1dE5hbWUgaW4gZWx0QXR0cmlidXRlcylcbiAgICAgICAgICAgICAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dE5hbWUsIGVsdEF0dHJpYnV0ZXNbYXR0cmlidXROYW1lXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZighaXNFbXB0eShlbHRDb250ZW50KSlcbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaW5uZXJIVE1MPWVsdENvbnRlbnQucmVwbGFjZSgvXFxuL2csXCI8YnI+XCIpOy8vIGlubmVySFRNTCBwZXJtZXQgZCdham91dGVyIGR1IHRleHRlIGF5YW50IGx1aS1tw6ptZSBkZXMgYmFsaXNlcywgZXRjLlxuICAgICAgICAgICAgXG4gICAgICAgIGlmKHJlcGxhY2UpXG4gICAgICAgICAgICBlbHRQYXJlbnQuaW5uZXJIVE1MPVwiXCI7XG4gICAgICAgIGVsdFBhcmVudC5hcHBlbmRDaGlsZChuZXdFbGVtZW50KTtcbiAgICB9ICAgIFxufSIsIi8vIENlIHNjcmlwdCBmb3Vybml0IGRlcyBmb25jdGlvbnMgdXRpbGlzw6llcyBzdXIgdG91dGVzIGxlcyBwYWdlcyBkdSBzaXRlXG5cbmV4cG9ydCBjb25zdCBoZWxsb0RldiA9ICgpID0+XG57XG4gICAgY29uc29sZS5sb2coXCIqKioqIEhlbGxvIGFtaSBkw6l2ZWxvcHBldXIgOi0pXFxuIExlIGNvZGUgZGUgV2lraUxlcm5pIGVzdCBsaWJyZSBldCBlc3QgbGlzaWJsZSBzdXIgZ2l0bGFiIDogXFxuIEJvbm5lIGxlY3R1cmUgOi0pIFxcbiBQb3VyIGxlcyBzdWdnZXN0aW9ucyBkJ2Ftw6lsaW9yYXRpb24gb3UgcXVlc3Rpb25zIDogZGV2QHdpbGlsZXJuaS5jb20gKioqKlwiKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUFjY291bnRMaW5rID0gKHN0YXR1cywgY29uZmlnVGVtcGxhdGUpID0+XG57XG4gICAgY29uc3QgbGluaz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFjY291bnRIZWFkTGlua1wiKTtcbiAgICBjb25zdCBob21lUGFnZT1zdGF0dXMrXCJIb21lUGFnZVwiO1xuICAgIGxpbmsuaHJlZj1cIi9cIitjb25maWdUZW1wbGF0ZVtob21lUGFnZV07XG59IiwiaW1wb3J0IHsgYXBpVXJsLCBhdmFpbGFibGVMYW5ncywgc2l0ZVVybCwgdGhlbWUgfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCI7XG5jb25zdCBsYW5nPWF2YWlsYWJsZUxhbmdzWzBdO1xuXG5jb25zdCBjb25maWdUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi8uLi8uLi92aWV3cy9cIit0aGVtZStcIi9jb25maWcvXCIrbGFuZytcIi5qc1wiKTtcbmltcG9ydCB7ICBjaGVja0xvZ2luUm91dGUsIHRpbWVEaWZmZXJlbmNlTWF4LCB0aW1lRGlmZmVyZW5jZU1pbiwgdXNlclJvdXRlcyB9IGZyb20gXCIuLi8uLi8uLi9jb25maWcvdXNlcnMuanNcIjtcblxuaW1wb3J0IHsgZ2V0TG9jYWx5LCByZW1vdmVMb2NhbHksIHNhdmVMb2NhbHkgfSBmcm9tIFwiLi9jbGllbnRzdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gUsOpY3Vww6hyZSBsZXMgZG9ubsOpZXMgZGUgY29uZmlndXJhdGlvbiBkZXMgdXRpbGlzYXRldXJzXG4vLyDDgCB0ZXJtZSwgdW4gZmljaGllciBzdGF0aXF1ZSBpbXBvcnRhYmxlIGNvbW1lIG1vZHVsZSBkZXZyYWl0IMOpdml0ZXIgdW5lIHJlcXXDqnRlIGFqYXhcbmV4cG9ydCBjb25zdCBnZXRDb25maWcgPSAgYXN5bmMgKCkgPT5cbntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBhcGlVcmwrXCIvdXNlci9nZXRjb25maWdcIik7XG4gICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCkpO1xuICAgICAgICB4aHIub25lcnJvciA9ICgpID0+IHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICAgIHhoci5zZW5kKCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRUaW1lRGlmZmVyZW5jZSA9ICgpID0+XG57XG4gICAgY29uc3QgdGltZUxvY2FsPW5ldyBEYXRlKCkuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICBpZih0aW1lTG9jYWwgPiB0aW1lRGlmZmVyZW5jZU1heCB8fCB0aW1lTG9jYWwgPCB0aW1lRGlmZmVyZW5jZU1pbilcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgZWxzZSByZXR1cm4gdGltZUxvY2FsO1xufVxuXG4vLyBPbiBlbmzDqHZlIHZvbG9udGFpcmVtZW50IGxlcyAwL08gcG91ciDDqXZpdGVyIGxlcyBjb25mdXNpb25zICFcbi8vIEV0IG1pZXV4IHZhdXQgYXVzc2kgZMOpYnV0ZXIgZXQgZmluaXIgcGFyIHVuZSBsZXR0cmUgc2ltcGxlLlxuZXhwb3J0IGNvbnN0IGdldFBhc3N3b3JkID0gKG5iQ2FyTWluLCBuYkNhck1heCkgPT5cbntcbiAgICBjb25zdCBuYkNhcj1uYkNhck1pbitNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqKG5iQ2FyTWF4LW5iQ2FyTWluKSk7XG4gICAgY29uc3QgbGV0dGVycz1cIkFCQ0RFRkdISUpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbnBxcnN0dXZ3eHl6XCI7XG4gICAgY29uc3Qgb3RoZXJzPVwiMTIzNDU2Nzg5IT8uKi1fJUAmw4nDgMOIw5nigqwkw4LDisObw45cIjtcbiAgICBsZXQgcGFzc3dvcmQ9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICBmb3IobGV0IGk9MTtpPChuYkNhci0xKTtpKyspXG4gICAge1xuICAgICAgICBpZigoaSAlIDIpID09PTEpXG4gICAgICAgICAgICBwYXNzd29yZCs9b3RoZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpvdGhlcnMubGVuZ3RoKV07XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHBhc3N3b3JkKz1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldOyAgIFxuICAgIH1cbiAgICBwYXNzd29yZCs9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICByZXR1cm4gcGFzc3dvcmQ7XG59XG5cbi8vIEondXRpbGlzZSBsZSBzdG9ja2FnZSBsb2NhbCBkdSBuYXZpZ2F0ZXVyIHBvdXIgZW5yZWdpc3RyZXIgbGVzIGRvbm7DqWVzIHBlcm1ldHRhbnQgZGUgcmVjb25uYcOudHJlIGwndXRpbGlzYXRldXIgcGFyIGxhIHN1aXRlXG4vLyBTZXVsIGxlIHNlcnZldXIgcG91cnJhIHbDqXJpZmllciBxdWUgbGVzIGlkZW50aWZpYW50cyBzb250ICh0b3Vqb3VycykgdmFsaWRlcy5cbmV4cG9ydCBjb25zdCBzZXRTZXNzaW9uID0gKHVzZXJJZCwgdG9rZW4sIGR1cmF0aW9uVFMpID0+XG57XG4gICAgY29uc3Qgc3RvcmFnZVVzZXI9XG4gICAge1xuICAgICAgICBpZDogdXNlcklkLFxuICAgICAgICB0b2tlbjogdG9rZW4sXG4gICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvblRTXG4gICAgfVxuICAgIHNhdmVMb2NhbHkoXCJ1c2VyXCIsIHN0b3JhZ2VVc2VyKTtcbn1cblxuLy8gVsOpcmlmaWUgcXUnaWwgeSBhIGRlcyBkb25uw6llcyBsb2NhbGVzIGNvbmNlcm5hbnQgbGUgcsOpc3VsdGF0IGQndW4gcXVpelxuLy8gRXQgbGVzIGFqb3V0ZSBhdXggZG9ubsOpZXMgZW52b3nDqWVzIHBhciBsZXMgZm9ybXVsYWlyZXMgZCdpbnNjcmlwdGlvbi9jb25uZXhpb24gc2kgYydlc3QgbGUgY2FzXG5leHBvcnQgY29uc3QgY2hlY2tBbnN3ZXJEYXRhcyA9IChkYXRhcykgPT5cbntcbiAgICBjb25zdCBsYXN0QW5zd2VyPWdldExvY2FseShcImxhc3RBbnN3ZXJcIik7XG4gICAgaWYoIWlzRW1wdHkobGFzdEFuc3dlcikpXG4gICAge1xuICAgICAgICBjb25zdCBhbnN3ZXI9SlNPTi5wYXJzZShsYXN0QW5zd2VyKTtcbiAgICAgICAgaWYoIWlzRW1wdHkoYW5zd2VyLmR1cmF0aW9uKSAmJiAhaXNFbXB0eShhbnN3ZXIubmJDb3JyZWN0QW5zd2VycykgJiYgIWlzRW1wdHkoYW5zd2VyLlF1ZXN0aW9ubmFpcmVJZCkgJiYgIWlzRW1wdHkoYW5zd2VyLm5iUXVlc3Rpb25zKSlcbiAgICAgICAge1xuICAgICAgICAgICAgZGF0YXMuZHVyYXRpb249YW5zd2VyLmR1cmF0aW9uO1xuICAgICAgICAgICAgZGF0YXMubmJDb3JyZWN0QW5zd2Vycz1hbnN3ZXIubmJDb3JyZWN0QW5zd2VycztcbiAgICAgICAgICAgIGRhdGFzLlF1ZXN0aW9ubmFpcmVJZD1hbnN3ZXIuUXVlc3Rpb25uYWlyZUlkO1xuICAgICAgICAgICAgZGF0YXMubmJRdWVzdGlvbnM9YW5zd2VyLm5iUXVlc3Rpb25zO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhcztcbn1cblxuLy8gQ2V0dGUgZm9uY3Rpb24gdGVzdGUgbGEgY29ubmV4aW9uIGRlIGwndXRpbGlzYXRldXIgZCd1bmUgcGFnZVxuLy8gT24gcGV1dCBmb3VybmlzIHVuZSBsaXN0ZSBkZSBzdGF0dXRzIGFjY2VwdMOpcyAoc2kgdmlkZSA9IHRvdXMpLCBhaW5zaSBxdSd1bmUgdXJsIGRlIHJlZGlyZWN0aW9uIHNpIG5vbiBjb25uZWN0w6ksIHVuIG1lc3NhZ2UgZCdlcnJldXIgw6AgYWZmaWNoZXIgc3VyIGxhIHBhZ2UgZGUgZGVzdGluYXRpb24gZXQgbCd1cmwgc3VyIGxhcXVlbGxlIHJldmVuaXIgdW5lIGZvaXMgY29ubmVjdMOpXG5leHBvcnQgY29uc3QgY2hlY2tTZXNzaW9uID0gYXN5bmMgKHN0YXR1cz1bXSwgdXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCkgPT5cbntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IHVzZXJEYXRhcz1nZXRMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICBpZihpc0VtcHR5KHVzZXJEYXRhcykpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgdXNlcj1KU09OLnBhcnNlKHVzZXJEYXRhcyk7XG4gICAgICAgICAgICBpZihpc0VtcHR5KHVzZXIuaWQpIHx8wqBpc0VtcHR5KHVzZXIudG9rZW4pIHx8IGlzRW1wdHkodXNlci5kdXJhdGlvbikgfHwgdXNlci5kdXJhdGlvbiA8IERhdGUubm93KCkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgYXBpVXJsK3VzZXJSb3V0ZXMrY2hlY2tMb2dpblJvdXRlK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDAgJiYgcmVzcG9uc2UuaXNWYWxpZCAmJiByZXNwb25zZS5pZCAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLmlkPT09dXNlci5pZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLm5hbWU9cmVzcG9uc2UubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLmxhbmd1YWdlPXJlc3BvbnNlLmxhbmd1YWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIudGltZURpZmZlcmVuY2U9cmVzcG9uc2UudGltZURpZmZlcmVuY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5zdGF0dXM9cmVzcG9uc2Uuc3RhdHVzOy8vIGxlIHRva2VuIGV0IGRlIHRvdXRlIGZhw6dvbiB2w6lyaWZpZXIgw6AgY2hhcXVlIHJlcXXDqnRlIMOgIGwnQVBJXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUxvY2FseShcInVzZXJcIiwgdXNlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2kgaWwgcydhZ2l0IGQndW4gXCJ1c2VyXCIgZXQgcXVlIHNvbiBhYm9ubmVtZW50IGEgZXhwaXLDqSwgamUgbGUgcmVkaXJpZ2UgdmVycyBsYSBjYWlzc2UgOi0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2Uuc3RhdHVzPT09XCJ1c2VyXCIgJiYgcmVzcG9uc2UubmJEYXlzT2sgPD0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybEFjY291bnQ9c2l0ZVVybCtcIi9cIitjb25maWdUZW1wbGF0ZVtsYW5nXS5hY2NvdW50UGFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZih1cmxBY2NvdW50KT09PS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIi9cIitjb25maWdUZW1wbGF0ZVtsYW5nXS5hY2NvdW50UGFnZSk7Ly8gcGFzc8OpZSBkaXJlY3RlbWVudCBpY2ksIGwnYW5jcmUgI3N1YnNjcmliZSBuZSBmb25jdGlvbm5lIHBhcyAhP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzdGF0dXMubGVuZ3RoIT09MCAmJiBzdGF0dXMuaW5kZXhPZihyZXNwb25zZS5zdGF0dXMpPT09LTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHhoci5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICAgICAgICAgICAgICB4aHIuc2VuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4vLyBDZXR0ZSBmb25jdGlvbiBzZXJ0IMOgIGxhIHByw6ljw6lkZW50ZSBlbiBjYXMgZGUgY29ubmV4aW9uIG5vbiB2YWxpZGVcbmNvbnN0IHJlZGlyZWN0VXNlciA9ICh1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKSA9Plxue1xuICAgIGlmKCFpc0VtcHR5KG1lc3NhZ2UpKVxuICAgICAgICBzYXZlTG9jYWx5KFwibWVzc2FnZVwiLCBtZXNzYWdlKTtcbiAgICBpZighaXNFbXB0eSh1cmxXYW50ZWQpKVxuICAgICAgICBzYXZlTG9jYWx5KFwidXJsXCIsIHVybFdhbnRlZCk7XG4gICAgaWYoIWlzRW1wdHkodXJsUmVkaXJlY3Rpb24pKVxuICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKHVybFJlZGlyZWN0aW9uKTtcbn0iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/front/public/JS/deleteValidation.app.js b/front/public/JS/deleteValidation.app.js new file mode 100644 index 0000000..7b1d026 --- /dev/null +++ b/front/public/JS/deleteValidation.app.js @@ -0,0 +1,1168 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "./src/deleteValidation.js"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "../config/instance.js": +/*!*****************************!*\ + !*** ../config/instance.js ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var _module$exports; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var users = __webpack_require__(/*! ./users */ "../config/users.js"); + +var questionnaires = __webpack_require__(/*! ./questionnaires */ "../config/questionnaires.js"); + +module.exports = (_module$exports = { + apiUrl: "http://localhost:3000/api", + siteUrl: "http://localhost:8080", + adminName: "Fabrice", + adminEmail: "dev@wikilerni.com", + senderName: "WikiLerni", + senderEmail: "bonjour@wikilerni.com", + adminLang: "fr", + theme: "default", + // le thème utilisé (dans /views) pour générer les pages HTML. Contient ses propres fichiers de configuration. + availableLangs: ["fr"], + // Languages in which the site is available. The first one is the default one. + siteName: "WikiLerni", + beginCodeGodfather: "wikilerni", + // case-sensitive and can't contain "@" ! + cronTimingAlertInSeconde: 120, + // for logs + responseTimingAlertInSeconde: 3, + // idem + tokenSignupValidationTimeInHours: "48h", + // https://github.com/zeit/ms + tokenLoginLinkTimeInHours: "1h", + tokenConnexionMinTimeInHours: "24h", + tokenConnexionMaxTimeInDays: "180 days", + tokenLoginChangingTimeInHours: "1h", + // for email & password changing + tokenDeleteUserTimeInHours: "1h", + tokenUnsubscribeLinkTimeInDays: "7 days", + // token send with subscription's emails + freeAccountTimingInDays: 10, + freeAccountExpirationNotificationInDays: 5, + accountExpirationFirstNotificationInDays: 14, + accountExpirationSecondNotificationInDays: 5, + inactiveAccountTimeToDeleteInDays: 180, + // Questionnaires: + nbQuestionsMin: 1, + // minimum number of questions for the questionnaire to be publishable + nbQuestionsMax: 10, + // if 0 = not maximum + nbChoicesMax: 10, + nbNewQuestionnaires: 10, + // for RSS, etc. + hourGiveNewQuestionnaireBegin: 1, + // in user local time + hourGiveNewQuestionnaireEnd: 24, + // idem + numberNewQuestionnaireAtSameTime: 50, + // for mass mailing + minSearchQuestionnaires: 3, + // Illustrations: + nbIllustrationsMin: 0, + nbIllustrationsMax: 1, + maxIllustrationSizeinOctet: 1000000, + // pas contrôlé pour l'instant. À revoir. + mimeTypesForIllustration: ["image/jpg", "image/jpeg", "image/png", "image/gif", "image/png"], + // -- Upload and resize: + illustrationsWidthMaxInPx: 400, + illustrationsMiniaturesWidthMaxInPx: 200, + // Links: + nbLinksMin: 1, + nbLinksMax: 1 +}, _defineProperty(_module$exports, "nbQuestionsMin", questionnaires.nbQuestionsMin), _defineProperty(_module$exports, "nbQuestionsMax", questionnaires.nbQuestionsMax), _defineProperty(_module$exports, "nbChoicesMax", questionnaires.nbChoicesMax), _defineProperty(_module$exports, "passwordMinLength", users.password.minlength), _defineProperty(_module$exports, "dirCacheUsers", users.dirCacheUsers), _defineProperty(_module$exports, "dirCacheUsersAnswers", users.dirCacheUsersAnswers), _defineProperty(_module$exports, "dirCacheQuestionnaires", questionnaires.dirCacheQuestionnaires), _defineProperty(_module$exports, "dirCacheQuestions", questionnaires.dirCacheQuestions), _defineProperty(_module$exports, "dirCacheUsersQuestionnaires", questionnaires.dirCacheUsersQuestionnaires), _defineProperty(_module$exports, "dirHTMLQuestionnaire", questionnaires.dirHTMLQuestionnaire), _defineProperty(_module$exports, "dirWebQuestionnaire", questionnaires.dirWebQuestionnaire), _module$exports); + +/***/ }), + +/***/ "../config/questionnaires.js": +/*!***********************************!*\ + !*** ../config/questionnaires.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + // API'routes (after "apiUrl" defined in instance.js) + questionnaireRoutes: "/questionnaire", + getQuestionnaireRoutes: "/get", + previewQuestionnaireRoutes: "/preview", + publishedQuestionnaireRoutes: "/quiz/", + saveAnswersRoute: "/answer/", + getStatsQuestionnaires: "/stats/", + searchQuestionnairesRoute: "/search", + searchAdminQuestionnairesRoute: "/searchadmin", + getListNextQuestionnaires: "/getlistnextquestionnaires/", + // -- questions & choices : + questionsRoute: "/question/", + // -- tags : + tagsSearchRoute: "/tags/search/", + // -- answers : + getQuestionnairesWithoutAnswer: "/withoutanswer/user/", + getPreviousAnswers: "/user/answers/", + getStatsAnswers: "/user/anwswers/stats/", + getAdminStats: "/getadminstats/", + // forms : à compléter avec valeurs par défaut, etc. cf modèle + Questionnaire: { + title: { + maxlength: 255, + required: true + }, + slug: { + maxlength: 150 + }, + // champ requis mais calculé à partir du titre qd vide + introduction: { + required: true + } + }, + searchQuestionnaires: { + minlength: 3, + required: true + }, + Question: { + text: { + maxlength: 255, + required: true + }, + rank: { + required: true, + min: 1, + defaultValue: 1 + } + }, + Choice: { + text: { + maxlength: 255, + required: true + } + }, + nbQuestionsMin: 1, + nbQuestionsMax: 10, + nbChoicesMax: 10, + nbTagsMin: 0, + nbTagsMax: 0, + // 0 = not max + // JSON and HTML dir + dirCacheQuestionnaires: "datas/questionnaires", + dirCacheQuestions: "datas/questionnaires/questions", + dirCacheUsersQuestionnaires: "datas/users/questionnaires", + dirCacheTags: "datas/questionnaires/tags", + dirHTMLQuestionnaire: "front/public/quiz", + dirHTMLTags: "front/public/quizs", + dirWebQuestionnaire: "quiz", + //pour url page + dirWebTags: "quizs" // idem + +}; + +/***/ }), + +/***/ "../config/users.js": +/*!**************************!*\ + !*** ../config/users.js ***! + \**************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + // API'routes (after "apiUrl" defined in instance.js) + userRoutes: "/user", + subscribeRoute: "/signup", + getGodfatherRoute: "/getgodfatherid", + checkIfIsEmailfreeRoute: "/isemailfree", + checkSubscribeTokenRoute: "/validation/", + checkLoginRoute: "/checklogin/", + connectionRoute: "/login", + getLoginLinkRoute: "/getloginlink", + connectionWithLinkRoute: "/checkloginlink", + getUserInfos: "/get/", + createUserRoute: "/create", + validateUserRoute: "/validate/", + updateUserInfos: "/modify/", + searchUserRoute: "/search/", + getGodChilds: "/getgodchilds/", + checkNewLoginLinkRoute: "/confirmnewlogin/", + checkDeleteLinkRoute: "/confirmdelete/", + getPayments: "/payment/getforoneuser/", + unsubscribeRoute: "/subscription/stop/", + getAdminStats: "/getadminstats/", + // forms : à compléter avec valeurs par défaut, etc. cf modèle + name: { + maxlength: 70, + required: true + }, + email: { + maxlength: 255, + required: true + }, + password: { + minlength: 8, + maxlength: 72, + required: true + }, + // https://www.npmjs.com/package/bcrypt#security-issues-and-concerns + newPassword: { + minlength: 8, + maxlength: 72 + }, + codeGodfather: { + maxlength: 255 + }, + cguOk: { + value: "true", + required: true + }, + timeDifferenceMin: -720, + timeDifferenceMax: 840, + // JSON dir + dirCacheUsers: "datas/users", + dirCacheUsersAnswers: "datas/users/questionnaires/answers" +}; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/general$": +/*!**************************************!*\ + !*** ../lang sync ^\.\/.*\/general$ ***! + \**************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/general": "../lang/fr/general.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/general$"; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/user$": +/*!***********************************!*\ + !*** ../lang sync ^\.\/.*\/user$ ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/user": "../lang/fr/user.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/user$"; + +/***/ }), + +/***/ "../lang/fr/general.js": +/*!*****************************!*\ + !*** ../lang/fr/general.js ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + siteHTMLTitle: "WikiLerni : qu'allez-vous apprendre aujourd'hui ?", + siteMetaDescription: "Chaque jour, testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.", + scriptTimingInfo: "Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", + scriptTimingAlert: "*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", + serverError: "Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.", + serverErrorAdmin: "Bug de l'application :", + neededParams: "Des paramètres nécessaires manquants sont manquants.", + badUrl: "Tentative d'accès à une page n'existant pas :", + notValidFormat: "Format non valide.", + notAllowed: "Vous n'avez pas les droits nécessaires pour cette action.", + notRequired: "Facultatif.", + updateBtnTxt: "Modifier", + addBtnTxt: "Ajouter", + deleteBtnTxt: "Supprimer", + addOkMessage: "Les données ont bien été enregistrées.", + updateOkMessage: "La mise à jour à jour a bien été enregistrée.", + deleteOkMessage: "La suppression a bien été enregistrée.", + failAuth: "Erreur d'authentification.", + failAuthHeader: "Absence de header Authorization.", + failAuthToken: "Token invalide ou utilisateur non trouvé.", + failAuthId: "Identifiant non valide : ", + failAuthCron: "Tentative de lancement d'un cron sans le bon token.", + previousPage: "Page précédente", + nextPage: "Page suivante", + btnLinkToQuestionnaire: "Aller au quiz !", + statsAdmin: "Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium." +}; + +/***/ }), + +/***/ "../lang/fr/user.js": +/*!**************************!*\ + !*** ../lang/fr/user.js ***! + \**************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + notFound: "L'utilisateur n'a pas été trouvé.", + needName: "Merci de choisir un nom d'utilisateur.", + needNotTooLongName: "Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.", + needEmail: "Merci de saisir votre adresse e-mail.", + needUniqueEmail: "L'adresse e-mail que vous avez saisie est déjà utilisée par un autre utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.", + needNotTooLongEmail: "Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.", + needPassWord: "Merci de fournir un mot de passe.", + needLongPassWord: "Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.", + passwordCopied: "Le mot de passe généré a été copié dans le presse-papier. Vous pouvez le recopier où vous le souhaiter.", + needStatus: "Il manque le statut.", + needLanguage: "Il manque le code langue.", + needValidLastConnectionDate: "La date de dernière connexion n'est pas valide.", + needSMTP: "Il manque le serveur SMTP.", + needSMTPNotFound: "Il manque le serveur SMTP.", + needKnowNewsletterOk: "Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.", + needTimeDifference: "Il faut connaître le nombre de minutes du décalage horaire.", + needMinTimeDifference: "Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.", + needMaxTimeDifference: "Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.", + needUGCOk: "Vous devez accepter les CGU pour pouvoir créer votre compte. ", + godfatherNotFound: "Aucun utilisateur valide trouvé pour ce code parrain.", + godfatherFound: "Votre parrain a bien été trouvé !", + mailValidationMessage: "Votre inscription est bien enregistrée.\nPour la finaliser, merci de cliquer dans les 24H sur le lien de confirmation qui vient de vous être envoyé par e-mail.", + mailValidationLinkSubject: "Merci de valider votre compte", + mailValidationLinkSBodyTxt: "Bonjour USER_NAME,\n\nPour valider votre compte, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL", + mailValidationLinkSBodyHTML: "

Bonjour USER_NAME,

Pour valider votre compte, merci de cliquer sur le lien suivant dans les 24h.

Valider.

", + validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue !
Vous pouvez sans tarder vous connecter ci-dessous pour accéder à votre compte.", + validationMessageAdmin: "Le compte a bien été validé.", + validationAlreadyMessage: "Il semble que vous ayez déjà validé votre compte.", + validationAlreadyMessageAdmin: "Ce compte a déjà été validé.", + mailWelcomeSubject: "Bienvenue !", + mailWelcomeBodyTxt: "Bonjour USER_NAME,\nVotre venez de valider votre inscription à NOM_SITE.\nMerci et à bientôt !", + mailWelcomeBodyHTML: "

Bonjour USER_NAME,

Votre venez de valider votre inscription à NOM_SITE.

Merci et à bientôt !

", + mailThankGodfatherSubject: "Merci !", + mailThankGodfatherBodyTxt: "Bonjour USER_NAME,\nGrâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nMerci et à bientôt !", + mailThankGodfatherBodyHTML: "

Bonjour USER_NAME,

Grâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.

Merci et à bientôt !

", + badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.", + emailNotFound: "Aucun utilisateur trouvé pour cette adresse e-mail.", + alreadyConnected: "Vous êtes déjà connecté(e) au site !", + needBeConnected: "Vous devez être connecté(e) pour accéder à cette page.", + connectionOk: "Connexion réussie.", + needChooseLoginWay: "Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.", + needValidationToLogin: "Vous devez d'abord valider votre compte avant de vous connecter. Pour ce faire, un lien vient de vous être envoyé par e-mail.", + tooManyLoginFails: "Trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.", + badPassword: "Le mot de passe n'est pas le bon.", + mailLoginLinkSubject: "Votre lien de connexion.", + mailLoginLinkBodyTxt: "Bonjour USER_NAME,\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : LINK_URL", + mailLoginLinkBodyHTML: "

Bonjour USER_NAME,

Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :

Valider.

", + mailLoginLinkMessage: "Un lien de connexion vient de vous être envoyé sur votre adresse e-mail. Ne tardez pas à l'utiliser, car il n'est valable que durant ", + updatedOkMessage: "Vos informations ont bien été mises à jour.", + updatedNeedGoodEmail: "Mais la nouvelle adresse e-mail n'a pu être enregistrée car elle n'a pas une format correct.", + updatedNeedUniqueEmail: "Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.", + mailUpdateLoginSubject: "Merci de valider vos nouveaux identifiants.", + mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL", + mailUpdateLoginBodyHTML: "

Bonjour USER_NAME,

Pour valider vos nouveaux identifiants de connexion, cliquez ici sans tarder.

", + mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (email et/ou mot de passe) et vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement. En attendant, merci de continuer à utiliser vos anciens identifiants.", + updatedNeedValidatedUser: "L'utilisateur que vous souhaité modifier n'existe pas/plus ou n'a pas encore validé son compte.", + updatedNeedGoodGodfather: "Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.", + mailUpdateLoginOkMessage: "La mise à jour de vos identifiants a bien été enregistrée.", + updatedFailedGodfatherNotFound: "L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.", + creationOkMessage: "Le nouvel utilisateur a bien été enregistré.", + mailDeleteSubject: "Confirmer la suppression de votre compte.", + mailDeleteBodyTxt: "Bonjour USER_NAME,\nPour valider la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL", + mailDeleteBodyHTML: "

Bonjour USER_NAME,

Pour valider la suppression de votre compte, cliquez ici sans tarder.

", + mailDeleteLinkMessage: "Votre demande de suppression a bien été enregistrée. Merci de cliquer sans tarder sur le lien qui vient de vous être envoyé par e-mail pour confirmer.", + deleteOkMessage: "L'utilisateur a bien été supprimé.", + deleteFailMessage: "Tentative de suppression d'un utilisateur inexistant : ", + mailDeleteLinkOkMessage: "Votre compte a bien été supprimé. Merci d'avoir utilisé nos services.", + mailDeleteLinkAlreadyMessage: "Il semble que vous ayez déjà validé la suppression de votre compte.", + mailDeleteLinkFailMessage: "Votre lien de suppression n'est pas valide ou alors il n'est plus valable.", + cronDeleteUnvalidedUsersMessage: " comptes utilisateurs non validés ont été supprimés.", + deleteInactiveUsersMessage: " comptes utilisateurs inactifs ont été supprimés.", + welcomeMessage: "Bienvenue #NAME !", + byebyeMessage: "Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
À bientôt !", + infosUserForAdmin: "Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
Date de sa dernière connexion : DATE_CONNECTION.", + infosAdminGodfather: "Cet utilisateur a été parrainé par ", + infosAdminNbGodChilds: "Ses #NB filleuils : " +}; + +/***/ }), + +/***/ "../tools/main.js": +/*!************************!*\ + !*** ../tools/main.js ***! + \************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +// Quelques fonctions utiles pour les chaînes +var Tool = /*#__PURE__*/function () { + function Tool() { + _classCallCheck(this, Tool); + } + + _createClass(Tool, null, [{ + key: "isEmpty", + value: function isEmpty(myVar) { + if (myVar === undefined || myVar === null) return true;else { + myVar += ""; // si autre chose qu'une chaîne envoyé... + + myVar = myVar.trim(); + if (myVar === "") return true;else return false; + } + } + }, { + key: "trimIfNotNull", + value: function trimIfNotNull(myString) { + if (Tool.isEmpty(myString)) myString = null;else { + myString += ""; // si autre chose qu'une chaîne envoyé... + + myString = myString.trim(); + } + return myString; + } + }, { + key: "shortenIfLongerThan", + value: function shortenIfLongerThan(myString, max) { + myString += ""; // au cas où cela ne serait pas une chaîne... + + if (myString.length > max) myString = myString.substring(0, max - 3) + "..."; + return myString; + } // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings + + }, { + key: "replaceAll", + value: function replaceAll(myString, mapObj) { + var replaceElts = new RegExp(Object.keys(mapObj).join("|"), "gi"); + return myString.replace(replaceElts, function (matched) { + return mapObj[matched]; + }); + } // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random + + }, { + key: "getRandomInt", + value: function getRandomInt(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min)) + min; + } // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country + + }, { + key: "dateFormat", + value: function dateFormat(dateString) { + var lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "fr"; + if (Tool.isEmpty(dateString)) return ""; + var myDate = new Date(dateString); + var myDay = myDate.getDate() + ""; + if (myDay.length === 1) myDay = "0" + myDay; + var myMounth = myDate.getMonth() + 1 + ""; + if (myMounth.length === 1) myMounth = "0" + myMounth; + var myYear = myDate.getFullYear(); + if (lang === "fr") return myDay + "/" + myMounth + "/" + myYear;else if (lang === "form") // 2014-02-09 + return myYear + "-" + myMounth + "-" + myDay;else return myMounth + "/" + myDay + "/" + myYear; + } + }]); + + return Tool; +}(); + +module.exports = Tool; + +/***/ }), + +/***/ "../views sync recursive ^\\.\\/.*\\.js$": +/*!**********************************!*\ + !*** ../views sync ^\.\/.*\.js$ ***! + \**********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./default/config/fr.js": "../views/default/config/fr.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../views sync recursive ^\\.\\/.*\\.js$"; + +/***/ }), + +/***/ "../views/default/config/fr.js": +/*!*************************************!*\ + !*** ../views/default/config/fr.js ***! + \*************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + headLinks: [{ + anchor: "Accueil", + attributes: { + href: "/" + } + }, { + anchor: "Mon compte", + attributes: { + href: "/connexion.hmt", + id: "accountHeadLink" + } + }, { + anchor: "À propos", + attributes: { + href: "/a-propos.html" + } + }, { + anchor: "Contact", + attributes: { + href: "/contact.html" + } + }], + footLinks: [{ + anchor: "Crédits", + attributes: { + href: "/credits.html" + } + }, { + anchor: "Mentions légales", + attributes: { + href: "/mentions-legales.html", + rel: "nofollow" + } + }, { + anchor: "Données personnelles", + attributes: { + href: "/donnees.html" + } + }, { + anchor: "C.G.U.", + attributes: { + href: "/cgu.html", + rel: "nofollow" + } + }, { + anchor: "C.G.V.", + attributes: { + href: "/cgv.html", + rel: "nofollow" + } + }], + maxQuestionnairesByPage: 10, + userHomePage: "accueil.html", + adminHomePage: "admin.html", + managerHomePage: "gestion.html", + subscribePage: "inscription.html", + connectionPage: "connexion.html", + accountPage: "compte.html", + questionnairesManagementPage: "gestion-quizs.html", + usersManagementPage: "gestion-utilisateurs.html", + nbQuestionnairesUserHomePage: 10, + illustrationDir: "/img/quizs/", + siteSlogan: "Cultivons notre jardin !", + homeTitle1: "De nature curieuse ?", + homeP1: "Avec WikiLerni vous apprenez chaque jour de nouvelles choses.
Des articles de Wikipédia sont sélectionnés pour vous et sont suivis d'un quiz vous permettant de tester ce que vous en avez retenu.
De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre \"jardin\".", + homeTitle2: "La culture en liberté", + homeP2: "Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.

(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.", + newQuestionnairesTitle: "Les derniers quizs publiés sur WikiLerni", + newQuestionnairesIntro: "Liste des derniers quizs publiés sur WikiLerni.", + explanationTitle: "Vous découvrez WikiLerni ?", + explanationTxt: "Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.

Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.

Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)

Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.

Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.", + noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript." +}; + +/***/ }), + +/***/ "./src/deleteValidation.js": +/*!*********************************!*\ + !*** ./src/deleteValidation.js ***! + \*********************************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ "../config/instance.js"); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js"); +/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js"); +/* harmony import */ var _tools_url_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/url.js */ "./src/tools/url.js"); +/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./tools/users.js */ "./src/tools/users.js"); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + +// -- GESTION DE LA PAGE PERMETTANT DE VALIDER UN CHANGEMENT D'EMAIL OU DE MOT DE PASSE +/// Un token est transmis en paramètre de l'Url. Il a une validité limité dans le temps. +/// Si le token est ok, on valide la suppression, supprime la session de l'utilisateur et affiche un message de confirmation +// Fichier de configuration côté client : + +var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0]; + +var configFrontEnd = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); // Importation des fonctions utile au script : + + + + + + + // Dictionnaires : + +var txt = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + lang + "/general"); + +var txtUsers = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/user$")("./" + lang + "/user"); + +var divResponse = document.getElementById("response"); +Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["helloDev"])(); +var config; + +var initialise = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + var datas, xhr; + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _context.prev = 0; + _context.next = 3; + return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_5__["getConfig"])(); + + case 3: + config = _context.sent; + if (!config) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]);else { + datas = Object(_tools_url_js__WEBPACK_IMPORTED_MODULE_4__["getUrlParams"])(); + + if (datas && datas.t !== undefined) { + xhr = new XMLHttpRequest(); + xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.userRoutes + config.checkDeleteLinkRoute + datas.t); + + xhr.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var response = JSON.parse(this.responseText); + + if (this.status === 200 && response.message != undefined) { + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", response.message, "", ["success"]); + Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["removeLocaly"])("user"); + } else if (this.status === 400 && response.errors != undefined) { + if (Array.isArray(response.errors)) response.errors = response.errors.join("
");else response.errors = txt.serverError; + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", response.errors, "", ["error"]); + } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txtUsers.badLinkValidationMessage.replace("#URL", configFrontEnd.accountPage), "", ["error"]); + } + }; + + xhr.setRequestHeader("Authorization", "Bearer " + datas.t); + xhr.send(); + } + } + _context.next = 11; + break; + + case 7: + _context.prev = 7; + _context.t0 = _context["catch"](0); + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]); + console.error(_context.t0); + + case 11: + case "end": + return _context.stop(); + } + } + }, _callee, null, [[0, 7]]); + })); + + return function initialise() { + return _ref.apply(this, arguments); + }; +}(); + +initialise(); + +/***/ }), + +/***/ "./src/tools/clientstorage.js": +/*!************************************!*\ + !*** ./src/tools/clientstorage.js ***! + \************************************/ +/*! exports provided: saveLocaly, getLocaly, removeLocaly */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveLocaly", function() { return saveLocaly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaly", function() { return getLocaly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeLocaly", function() { return removeLocaly; }); +// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.) +// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie +var saveLocaly = function saveLocaly(name, data) { + localStorage.setItem(name, JSON.stringify(data)); +}; +var getLocaly = function getLocaly(name) { + var json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name); +}; +var removeLocaly = function removeLocaly(name) { + localStorage.removeItem(name); +}; + +/***/ }), + +/***/ "./src/tools/dom.js": +/*!**************************!*\ + !*** ./src/tools/dom.js ***! + \**************************/ +/*! exports provided: addElement */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addElement", function() { return addElement; }); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__); +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + + // Fonction associant les attributs fournis à un champ de formulaire + +var addElement = function addElement(eltParent, eltType) { + var eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; + var eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; + var eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : []; + var eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; + var replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true; + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltType) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltParent)) return false;else { + var newElement = document.createElement(eltType); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ? + newElement.id = eltId; + + if (Array.isArray(eltClass) && eltClass.length != 0) { + for (var i in eltClass) { + newElement.classList.add(eltClass[i]); + } + } + + if (_typeof(eltAttributes) === "object") // !! tous les objets ne sont pas ok + { + for (var attributName in eltAttributes) { + newElement.setAttribute(attributName, eltAttributes[attributName]); + } + } + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltContent)) newElement.innerHTML = eltContent.replace(/\n/g, "
"); // innerHTML permet d'ajouter du texte ayant lui-même des balises, etc. + + if (replace) eltParent.innerHTML = ""; + eltParent.appendChild(newElement); + } +}; + +/***/ }), + +/***/ "./src/tools/everywhere.js": +/*!*********************************!*\ + !*** ./src/tools/everywhere.js ***! + \*********************************/ +/*! exports provided: helloDev, updateAccountLink */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "helloDev", function() { return helloDev; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateAccountLink", function() { return updateAccountLink; }); +// Ce script fournit des fonctions utilisées sur toutes les pages du site +var helloDev = function helloDev() { + console.log("**** Hello ami développeur :-)\n Le code de WikiLerni est libre et est lisible sur gitlab : \n Bonne lecture :-) \n Pour les suggestions d'amélioration ou questions : dev@wililerni.com ****"); + return true; +}; +var updateAccountLink = function updateAccountLink(status, configTemplate) { + var link = document.getElementById("accountHeadLink"); + var homePage = status + "HomePage"; + link.href = "/" + configTemplate[homePage]; +}; + +/***/ }), + +/***/ "./src/tools/url.js": +/*!**************************!*\ + !*** ./src/tools/url.js ***! + \**************************/ +/*! exports provided: getUrlParams */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getUrlParams", function() { return getUrlParams; }); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__); + // Fonction récupérant les paramètres passés par l'url + +var getUrlParams = function getUrlParams() { + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(location.search)) return false; + var parameters = location.search.substring(1).split("&"); + if (!Array.isArray(parameters) || parameters.length === 0) return false; + var param, + datas = {}; + + for (var i in parameters) { + param = parameters[i].split("="); + if (param.length === 2) datas[param[0]] = decodeURI(param[1]); + } + + return datas; +}; + +/***/ }), + +/***/ "./src/tools/users.js": +/*!****************************!*\ + !*** ./src/tools/users.js ***! + \****************************/ +/*! exports provided: getConfig, getTimeDifference, getPassword, setSession, checkAnswerDatas, checkSession */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getConfig", function() { return getConfig; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTimeDifference", function() { return getTimeDifference; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getPassword", function() { return getPassword; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setSession", function() { return setSession; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkAnswerDatas", function() { return checkAnswerDatas; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkSession", function() { return checkSession; }); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/instance.js */ "../config/instance.js"); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../config/users.js */ "../config/users.js"); +/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_3__); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + + +var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0]; + +var configTemplate = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); + + + + // Récupère les données de configuration des utilisateurs +// À terme, un fichier statique importable comme module devrait éviter une requête ajax + +var getConfig = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + return _context.abrupt("return", new Promise(function (resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + "/user/getconfig"); + + xhr.onload = function () { + return resolve(JSON.parse(xhr.responseText)); + }; + + xhr.onerror = function () { + return reject(xhr.statusText); + }; + + xhr.send(); + })); + + case 1: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + + return function getConfig() { + return _ref.apply(this, arguments); + }; +}(); +var getTimeDifference = function getTimeDifference() { + var timeLocal = new Date().getTimezoneOffset(); + if (timeLocal > _config_users_js__WEBPACK_IMPORTED_MODULE_1__["timeDifferenceMax"] || timeLocal < _config_users_js__WEBPACK_IMPORTED_MODULE_1__["timeDifferenceMin"]) return 0;else return timeLocal; +}; // On enlève volontairement les 0/O pour éviter les confusions ! +// Et mieux vaut aussi débuter et finir par une lettre simple. + +var getPassword = function getPassword(nbCarMin, nbCarMax) { + var nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin)); + var letters = "ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz"; + var others = "123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ"; + var password = letters[Math.floor(Math.random() * letters.length)]; + + for (var i = 1; i < nbCar - 1; i++) { + if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)]; + } + + password += letters[Math.floor(Math.random() * letters.length)]; + return password; +}; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite +// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides. + +var setSession = function setSession(userId, token, durationTS) { + var storageUser = { + id: userId, + token: token, + duration: durationTS + }; + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("user", storageUser); +}; // Vérifie qu'il y a des données locales concernant le résultat d'un quiz +// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas + +var checkAnswerDatas = function checkAnswerDatas(datas) { + var lastAnswer = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("lastAnswer"); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(lastAnswer)) { + var answer = JSON.parse(lastAnswer); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.duration) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbCorrectAnswers) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.QuestionnaireId) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbQuestions)) { + datas.duration = answer.duration; + datas.nbCorrectAnswers = answer.nbCorrectAnswers; + datas.QuestionnaireId = answer.QuestionnaireId; + datas.nbQuestions = answer.nbQuestions; + } + } + + return datas; +}; // Cette fonction teste la connexion de l'utilisateur d'une page +// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté + +var checkSession = /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() { + var status, + urlRedirection, + message, + urlWanted, + _args2 = arguments; + return regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + status = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : []; + urlRedirection = _args2.length > 1 ? _args2[1] : undefined; + message = _args2.length > 2 ? _args2[2] : undefined; + urlWanted = _args2.length > 3 ? _args2[3] : undefined; + return _context2.abrupt("return", new Promise(function (resolve, reject) { + var userDatas = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("user"); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(userDatas)) { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else { + var user = JSON.parse(userDatas); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.id) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.token) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.duration) || user.duration < Date.now()) { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else { + var xhr = new XMLHttpRequest(); + xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["userRoutes"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["checkLoginRoute"] + user.token); + + xhr.onload = function () { + var response = JSON.parse(xhr.responseText); + + if (xhr.status === 200 && response.isValid && response.id != undefined) { + if (response.id === user.id) { + user.name = response.name; + user.language = response.language; + user.timeDifference = response.timeDifference; + user.status = response.status; // le token et de toute façon vérifier à chaque requête à l'API + + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("user", user); // si il s'agit d'un "user" et que son abonnement a expiré, je le redirige vers la caisse :-) + + if (response.status === "user" && response.nbDaysOk <= 0) { + var urlAccount = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["siteUrl"] + "/" + configTemplate[lang].accountPage; + if (window.location.href.indexOf(urlAccount) === -1) window.location.assign("/" + configTemplate[lang].accountPage); // passée directement ici, l'ancre #subscribe ne fonctionne pas !? + + resolve(true); + } else { + if (status.length !== 0 && status.indexOf(response.status) === -1) { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else resolve(true); + } + } else { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + } else { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + }; + + xhr.onerror = function () { + return reject(xhr.statusText); + }; + + xhr.send(); + } + } + })); + + case 5: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + + return function checkSession() { + return _ref2.apply(this, arguments); + }; +}(); // Cette fonction sert à la précédente en cas de connexion non valide + +var redirectUser = function redirectUser(urlRedirection, message, urlWanted) { + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(message)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("message", message); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlWanted)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("url", urlWanted); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlRedirection)) window.location.assign(urlRedirection); +}; + +/***/ }) + +/******/ }); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9nZW5lcmFsJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3VzZXIkIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL2dlbmVyYWwuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcvZnIvdXNlci5qcyIsIndlYnBhY2s6Ly8vLi4vdG9vbHMvbWFpbi5qcyIsIndlYnBhY2s6Ly8vLi4vdmlld3Mgc3luYyBeXFwuXFwvLipcXC5qcyQiLCJ3ZWJwYWNrOi8vLy4uL3ZpZXdzL2RlZmF1bHQvY29uZmlnL2ZyLmpzIiwid2VicGFjazovLy8uL3NyYy9kZWxldGVWYWxpZGF0aW9uLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy9jbGllbnRzdG9yYWdlLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy9kb20uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2V2ZXJ5d2hlcmUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL3VybC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvdXNlcnMuanMiXSwibmFtZXMiOlsidXNlcnMiLCJyZXF1aXJlIiwicXVlc3Rpb25uYWlyZXMiLCJtb2R1bGUiLCJleHBvcnRzIiwiYXBpVXJsIiwic2l0ZVVybCIsImFkbWluTmFtZSIsImFkbWluRW1haWwiLCJzZW5kZXJOYW1lIiwic2VuZGVyRW1haWwiLCJhZG1pbkxhbmciLCJ0aGVtZSIsImF2YWlsYWJsZUxhbmdzIiwic2l0ZU5hbWUiLCJiZWdpbkNvZGVHb2RmYXRoZXIiLCJjcm9uVGltaW5nQWxlcnRJblNlY29uZGUiLCJyZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlIiwidG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnMiLCJ0b2tlbkxvZ2luTGlua1RpbWVJbkhvdXJzIiwidG9rZW5Db25uZXhpb25NaW5UaW1lSW5Ib3VycyIsInRva2VuQ29ubmV4aW9uTWF4VGltZUluRGF5cyIsInRva2VuTG9naW5DaGFuZ2luZ1RpbWVJbkhvdXJzIiwidG9rZW5EZWxldGVVc2VyVGltZUluSG91cnMiLCJ0b2tlblVuc3Vic2NyaWJlTGlua1RpbWVJbkRheXMiLCJmcmVlQWNjb3VudFRpbWluZ0luRGF5cyIsImZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5cyIsImFjY291bnRFeHBpcmF0aW9uRmlyc3ROb3RpZmljYXRpb25JbkRheXMiLCJhY2NvdW50RXhwaXJhdGlvblNlY29uZE5vdGlmaWNhdGlvbkluRGF5cyIsImluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5cyIsIm5iUXVlc3Rpb25zTWluIiwibmJRdWVzdGlvbnNNYXgiLCJuYkNob2ljZXNNYXgiLCJuYk5ld1F1ZXN0aW9ubmFpcmVzIiwiaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlQmVnaW4iLCJob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQiLCJudW1iZXJOZXdRdWVzdGlvbm5haXJlQXRTYW1lVGltZSIsIm1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzIiwibmJJbGx1c3RyYXRpb25zTWluIiwibmJJbGx1c3RyYXRpb25zTWF4IiwibWF4SWxsdXN0cmF0aW9uU2l6ZWluT2N0ZXQiLCJtaW1lVHlwZXNGb3JJbGx1c3RyYXRpb24iLCJpbGx1c3RyYXRpb25zV2lkdGhNYXhJblB4IiwiaWxsdXN0cmF0aW9uc01pbmlhdHVyZXNXaWR0aE1heEluUHgiLCJuYkxpbmtzTWluIiwibmJMaW5rc01heCIsInBhc3N3b3JkIiwibWlubGVuZ3RoIiwiZGlyQ2FjaGVVc2VycyIsImRpckNhY2hlVXNlcnNBbnN3ZXJzIiwiZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyIsImRpckNhY2hlUXVlc3Rpb25zIiwiZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzIiwiZGlySFRNTFF1ZXN0aW9ubmFpcmUiLCJkaXJXZWJRdWVzdGlvbm5haXJlIiwicXVlc3Rpb25uYWlyZVJvdXRlcyIsImdldFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlcyIsInB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJzYXZlQW5zd2Vyc1JvdXRlIiwiZ2V0U3RhdHNRdWVzdGlvbm5haXJlcyIsInNlYXJjaFF1ZXN0aW9ubmFpcmVzUm91dGUiLCJzZWFyY2hBZG1pblF1ZXN0aW9ubmFpcmVzUm91dGUiLCJnZXRMaXN0TmV4dFF1ZXN0aW9ubmFpcmVzIiwicXVlc3Rpb25zUm91dGUiLCJ0YWdzU2VhcmNoUm91dGUiLCJnZXRRdWVzdGlvbm5haXJlc1dpdGhvdXRBbnN3ZXIiLCJnZXRQcmV2aW91c0Fuc3dlcnMiLCJnZXRTdGF0c0Fuc3dlcnMiLCJnZXRBZG1pblN0YXRzIiwiUXVlc3Rpb25uYWlyZSIsInRpdGxlIiwibWF4bGVuZ3RoIiwicmVxdWlyZWQiLCJzbHVnIiwiaW50cm9kdWN0aW9uIiwic2VhcmNoUXVlc3Rpb25uYWlyZXMiLCJRdWVzdGlvbiIsInRleHQiLCJyYW5rIiwibWluIiwiZGVmYXVsdFZhbHVlIiwiQ2hvaWNlIiwibmJUYWdzTWluIiwibmJUYWdzTWF4IiwiZGlyQ2FjaGVUYWdzIiwiZGlySFRNTFRhZ3MiLCJkaXJXZWJUYWdzIiwidXNlclJvdXRlcyIsInN1YnNjcmliZVJvdXRlIiwiZ2V0R29kZmF0aGVyUm91dGUiLCJjaGVja0lmSXNFbWFpbGZyZWVSb3V0ZSIsImNoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZSIsImNoZWNrTG9naW5Sb3V0ZSIsImNvbm5lY3Rpb25Sb3V0ZSIsImdldExvZ2luTGlua1JvdXRlIiwiY29ubmVjdGlvbldpdGhMaW5rUm91dGUiLCJnZXRVc2VySW5mb3MiLCJjcmVhdGVVc2VyUm91dGUiLCJ2YWxpZGF0ZVVzZXJSb3V0ZSIsInVwZGF0ZVVzZXJJbmZvcyIsInNlYXJjaFVzZXJSb3V0ZSIsImdldEdvZENoaWxkcyIsImNoZWNrTmV3TG9naW5MaW5rUm91dGUiLCJjaGVja0RlbGV0ZUxpbmtSb3V0ZSIsImdldFBheW1lbnRzIiwidW5zdWJzY3JpYmVSb3V0ZSIsIm5hbWUiLCJlbWFpbCIsIm5ld1Bhc3N3b3JkIiwiY29kZUdvZGZhdGhlciIsImNndU9rIiwidmFsdWUiLCJ0aW1lRGlmZmVyZW5jZU1pbiIsInRpbWVEaWZmZXJlbmNlTWF4Iiwic2l0ZUhUTUxUaXRsZSIsInNpdGVNZXRhRGVzY3JpcHRpb24iLCJzY3JpcHRUaW1pbmdJbmZvIiwic2NyaXB0VGltaW5nQWxlcnQiLCJzZXJ2ZXJFcnJvciIsInNlcnZlckVycm9yQWRtaW4iLCJuZWVkZWRQYXJhbXMiLCJiYWRVcmwiLCJub3RWYWxpZEZvcm1hdCIsIm5vdEFsbG93ZWQiLCJub3RSZXF1aXJlZCIsInVwZGF0ZUJ0blR4dCIsImFkZEJ0blR4dCIsImRlbGV0ZUJ0blR4dCIsImFkZE9rTWVzc2FnZSIsInVwZGF0ZU9rTWVzc2FnZSIsImRlbGV0ZU9rTWVzc2FnZSIsImZhaWxBdXRoIiwiZmFpbEF1dGhIZWFkZXIiLCJmYWlsQXV0aFRva2VuIiwiZmFpbEF1dGhJZCIsImZhaWxBdXRoQ3JvbiIsInByZXZpb3VzUGFnZSIsIm5leHRQYWdlIiwiYnRuTGlua1RvUXVlc3Rpb25uYWlyZSIsInN0YXRzQWRtaW4iLCJub3RGb3VuZCIsIm5lZWROYW1lIiwibmVlZE5vdFRvb0xvbmdOYW1lIiwibmVlZEVtYWlsIiwibmVlZFVuaXF1ZUVtYWlsIiwibmVlZE5vdFRvb0xvbmdFbWFpbCIsIm5lZWRQYXNzV29yZCIsIm5lZWRMb25nUGFzc1dvcmQiLCJwYXNzd29yZENvcGllZCIsIm5lZWRTdGF0dXMiLCJuZWVkTGFuZ3VhZ2UiLCJuZWVkVmFsaWRMYXN0Q29ubmVjdGlvbkRhdGUiLCJuZWVkU01UUCIsIm5lZWRTTVRQTm90Rm91bmQiLCJuZWVkS25vd05ld3NsZXR0ZXJPayIsIm5lZWRUaW1lRGlmZmVyZW5jZSIsIm5lZWRNaW5UaW1lRGlmZmVyZW5jZSIsIm5lZWRNYXhUaW1lRGlmZmVyZW5jZSIsIm5lZWRVR0NPayIsImdvZGZhdGhlck5vdEZvdW5kIiwiZ29kZmF0aGVyRm91bmQiLCJtYWlsVmFsaWRhdGlvbk1lc3NhZ2UiLCJtYWlsVmFsaWRhdGlvbkxpbmtTdWJqZWN0IiwibWFpbFZhbGlkYXRpb25MaW5rU0JvZHlUeHQiLCJtYWlsVmFsaWRhdGlvbkxpbmtTQm9keUhUTUwiLCJ2YWxpZGF0aW9uTWVzc2FnZSIsInZhbGlkYXRpb25NZXNzYWdlQWRtaW4iLCJ2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2UiLCJ2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2VBZG1pbiIsIm1haWxXZWxjb21lU3ViamVjdCIsIm1haWxXZWxjb21lQm9keVR4dCIsIm1haWxXZWxjb21lQm9keUhUTUwiLCJtYWlsVGhhbmtHb2RmYXRoZXJTdWJqZWN0IiwibWFpbFRoYW5rR29kZmF0aGVyQm9keVR4dCIsIm1haWxUaGFua0dvZGZhdGhlckJvZHlIVE1MIiwiYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlIiwiZW1haWxOb3RGb3VuZCIsImFscmVhZHlDb25uZWN0ZWQiLCJuZWVkQmVDb25uZWN0ZWQiLCJjb25uZWN0aW9uT2siLCJuZWVkQ2hvb3NlTG9naW5XYXkiLCJuZWVkVmFsaWRhdGlvblRvTG9naW4iLCJ0b29NYW55TG9naW5GYWlscyIsImJhZFBhc3N3b3JkIiwibWFpbExvZ2luTGlua1N1YmplY3QiLCJtYWlsTG9naW5MaW5rQm9keVR4dCIsIm1haWxMb2dpbkxpbmtCb2R5SFRNTCIsIm1haWxMb2dpbkxpbmtNZXNzYWdlIiwidXBkYXRlZE9rTWVzc2FnZSIsInVwZGF0ZWROZWVkR29vZEVtYWlsIiwidXBkYXRlZE5lZWRVbmlxdWVFbWFpbCIsIm1haWxVcGRhdGVMb2dpblN1YmplY3QiLCJtYWlsVXBkYXRlTG9naW5Cb2R5VHh0IiwibWFpbFVwZGF0ZUxvZ2luQm9keUhUTUwiLCJtYWlsVXBkYXRlTG9naW5MaW5rTWVzc2FnZSIsInVwZGF0ZWROZWVkVmFsaWRhdGVkVXNlciIsInVwZGF0ZWROZWVkR29vZEdvZGZhdGhlciIsIm1haWxVcGRhdGVMb2dpbk9rTWVzc2FnZSIsInVwZGF0ZWRGYWlsZWRHb2RmYXRoZXJOb3RGb3VuZCIsImNyZWF0aW9uT2tNZXNzYWdlIiwibWFpbERlbGV0ZVN1YmplY3QiLCJtYWlsRGVsZXRlQm9keVR4dCIsIm1haWxEZWxldGVCb2R5SFRNTCIsIm1haWxEZWxldGVMaW5rTWVzc2FnZSIsImRlbGV0ZUZhaWxNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtPa01lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua0FscmVhZHlNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtGYWlsTWVzc2FnZSIsImNyb25EZWxldGVVbnZhbGlkZWRVc2Vyc01lc3NhZ2UiLCJkZWxldGVJbmFjdGl2ZVVzZXJzTWVzc2FnZSIsIndlbGNvbWVNZXNzYWdlIiwiYnllYnllTWVzc2FnZSIsImluZm9zVXNlckZvckFkbWluIiwiaW5mb3NBZG1pbkdvZGZhdGhlciIsImluZm9zQWRtaW5OYkdvZENoaWxkcyIsIlRvb2wiLCJteVZhciIsInVuZGVmaW5lZCIsInRyaW0iLCJteVN0cmluZyIsImlzRW1wdHkiLCJtYXgiLCJsZW5ndGgiLCJzdWJzdHJpbmciLCJtYXBPYmoiLCJyZXBsYWNlRWx0cyIsIlJlZ0V4cCIsIk9iamVjdCIsImtleXMiLCJqb2luIiwicmVwbGFjZSIsIm1hdGNoZWQiLCJNYXRoIiwiY2VpbCIsImZsb29yIiwicmFuZG9tIiwiZGF0ZVN0cmluZyIsImxhbmciLCJteURhdGUiLCJEYXRlIiwibXlEYXkiLCJnZXREYXRlIiwibXlNb3VudGgiLCJnZXRNb250aCIsIm15WWVhciIsImdldEZ1bGxZZWFyIiwiaGVhZExpbmtzIiwiYW5jaG9yIiwiYXR0cmlidXRlcyIsImhyZWYiLCJpZCIsImZvb3RMaW5rcyIsInJlbCIsIm1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlIiwidXNlckhvbWVQYWdlIiwiYWRtaW5Ib21lUGFnZSIsIm1hbmFnZXJIb21lUGFnZSIsInN1YnNjcmliZVBhZ2UiLCJjb25uZWN0aW9uUGFnZSIsImFjY291bnRQYWdlIiwicXVlc3Rpb25uYWlyZXNNYW5hZ2VtZW50UGFnZSIsInVzZXJzTWFuYWdlbWVudFBhZ2UiLCJuYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlIiwiaWxsdXN0cmF0aW9uRGlyIiwic2l0ZVNsb2dhbiIsImhvbWVUaXRsZTEiLCJob21lUDEiLCJob21lVGl0bGUyIiwiaG9tZVAyIiwibmV3UXVlc3Rpb25uYWlyZXNUaXRsZSIsIm5ld1F1ZXN0aW9ubmFpcmVzSW50cm8iLCJleHBsYW5hdGlvblRpdGxlIiwiZXhwbGFuYXRpb25UeHQiLCJub0pTTm90aWZpY2F0aW9uIiwiY29uZmlnRnJvbnRFbmQiLCJ0eHQiLCJ0eHRVc2VycyIsImRpdlJlc3BvbnNlIiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImhlbGxvRGV2IiwiY29uZmlnIiwiaW5pdGlhbGlzZSIsImdldENvbmZpZyIsImFkZEVsZW1lbnQiLCJkYXRhcyIsImdldFVybFBhcmFtcyIsInQiLCJ4aHIiLCJYTUxIdHRwUmVxdWVzdCIsIm9wZW4iLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJyZWFkeVN0YXRlIiwiRE9ORSIsInJlc3BvbnNlIiwiSlNPTiIsInBhcnNlIiwicmVzcG9uc2VUZXh0Iiwic3RhdHVzIiwibWVzc2FnZSIsInJlbW92ZUxvY2FseSIsImVycm9ycyIsIkFycmF5IiwiaXNBcnJheSIsInNldFJlcXVlc3RIZWFkZXIiLCJzZW5kIiwiY29uc29sZSIsImVycm9yIiwic2F2ZUxvY2FseSIsImRhdGEiLCJsb2NhbFN0b3JhZ2UiLCJzZXRJdGVtIiwic3RyaW5naWZ5IiwiZ2V0TG9jYWx5IiwianNvbiIsImdldEl0ZW0iLCJyZW1vdmVJdGVtIiwiZWx0UGFyZW50IiwiZWx0VHlwZSIsImVsdENvbnRlbnQiLCJlbHRJZCIsImVsdENsYXNzIiwiZWx0QXR0cmlidXRlcyIsIm5ld0VsZW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiaSIsImNsYXNzTGlzdCIsImFkZCIsImF0dHJpYnV0TmFtZSIsInNldEF0dHJpYnV0ZSIsImlubmVySFRNTCIsImFwcGVuZENoaWxkIiwibG9nIiwidXBkYXRlQWNjb3VudExpbmsiLCJjb25maWdUZW1wbGF0ZSIsImxpbmsiLCJob21lUGFnZSIsImxvY2F0aW9uIiwic2VhcmNoIiwicGFyYW1ldGVycyIsInNwbGl0IiwicGFyYW0iLCJkZWNvZGVVUkkiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIm9ubG9hZCIsIm9uZXJyb3IiLCJzdGF0dXNUZXh0IiwiZ2V0VGltZURpZmZlcmVuY2UiLCJ0aW1lTG9jYWwiLCJnZXRUaW1lem9uZU9mZnNldCIsImdldFBhc3N3b3JkIiwibmJDYXJNaW4iLCJuYkNhck1heCIsIm5iQ2FyIiwibGV0dGVycyIsIm90aGVycyIsInNldFNlc3Npb24iLCJ1c2VySWQiLCJ0b2tlbiIsImR1cmF0aW9uVFMiLCJzdG9yYWdlVXNlciIsImR1cmF0aW9uIiwiY2hlY2tBbnN3ZXJEYXRhcyIsImxhc3RBbnN3ZXIiLCJhbnN3ZXIiLCJuYkNvcnJlY3RBbnN3ZXJzIiwiUXVlc3Rpb25uYWlyZUlkIiwibmJRdWVzdGlvbnMiLCJjaGVja1Nlc3Npb24iLCJ1cmxSZWRpcmVjdGlvbiIsInVybFdhbnRlZCIsInVzZXJEYXRhcyIsInJlZGlyZWN0VXNlciIsInVzZXIiLCJub3ciLCJpc1ZhbGlkIiwibGFuZ3VhZ2UiLCJ0aW1lRGlmZmVyZW5jZSIsIm5iRGF5c09rIiwidXJsQWNjb3VudCIsIndpbmRvdyIsImluZGV4T2YiLCJhc3NpZ24iXSwibWFwcGluZ3MiOiI7UUFBQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7O1FBR0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNB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QUFBQTtBQUFBLEdBQUg7O0FBQUEsa0JBQVppRSxZQUFZO0FBQUE7QUFBQTtBQUFBLEdBQWxCLEMsQ0EwRVA7O0FBQ0EsSUFBTUksWUFBWSxHQUFHLFNBQWZBLFlBQWUsQ0FBQ0gsY0FBRCxFQUFpQnhFLE9BQWpCLEVBQTBCeUUsU0FBMUIsRUFDckI7QUFDSSxNQUFHLENBQUN4SiwyREFBTyxDQUFDK0UsT0FBRCxDQUFYLEVBQ0lTLG9FQUFVLENBQUMsU0FBRCxFQUFZVCxPQUFaLENBQVY7QUFDSixNQUFHLENBQUMvRSwyREFBTyxDQUFDd0osU0FBRCxDQUFYLEVBQ0loRSxvRUFBVSxDQUFDLEtBQUQsRUFBUWdFLFNBQVIsQ0FBVjtBQUNKLE1BQUcsQ0FBQ3hKLDJEQUFPLENBQUN1SixjQUFELENBQVgsRUFDSVcsTUFBTSxDQUFDN0MsUUFBUCxDQUFnQitDLE1BQWhCLENBQXVCYixjQUF2QjtBQUNQLENBUkQsQyIsImZpbGUiOiIuL0pTL2RlbGV0ZVZhbGlkYXRpb24uYXBwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvZGVsZXRlVmFsaWRhdGlvbi5qc1wiKTtcbiIsImNvbnN0IHVzZXJzID0gcmVxdWlyZShcIi4vdXNlcnNcIik7XG5jb25zdCBxdWVzdGlvbm5haXJlcyA9IHJlcXVpcmUoXCIuL3F1ZXN0aW9ubmFpcmVzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgYXBpVXJsOiBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9hcGlcIixcbiAgICBzaXRlVXJsOiBcImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MFwiLFxuICAgIGFkbWluTmFtZTogXCJGYWJyaWNlXCIsXG4gICAgYWRtaW5FbWFpbDogXCJkZXZAd2lraWxlcm5pLmNvbVwiLFxuICAgIHNlbmRlck5hbWU6IFwiV2lraUxlcm5pXCIsXG4gICAgc2VuZGVyRW1haWw6IFwiYm9uam91ckB3aWtpbGVybmkuY29tXCIsXG4gICAgYWRtaW5MYW5nOiBcImZyXCIsXG4gICAgdGhlbWU6IFwiZGVmYXVsdFwiLCAvLyBsZSB0aMOobWUgdXRpbGlzw6kgKGRhbnMgL3ZpZXdzKSBwb3VyIGfDqW7DqXJlciBsZXMgcGFnZXMgSFRNTC4gQ29udGllbnQgc2VzIHByb3ByZXMgZmljaGllcnMgZGUgY29uZmlndXJhdGlvbi5cbiAgICBhdmFpbGFibGVMYW5nczogW1wiZnJcIl0sLy8gTGFuZ3VhZ2VzIGluIHdoaWNoIHRoZSBzaXRlIGlzIGF2YWlsYWJsZS4gVGhlIGZpcnN0IG9uZSBpcyB0aGUgZGVmYXVsdCBvbmUuXG4gICAgc2l0ZU5hbWU6IFwiV2lraUxlcm5pXCIsXG4gICAgYmVnaW5Db2RlR29kZmF0aGVyOiBcIndpa2lsZXJuaVwiLCAvLyBjYXNlLXNlbnNpdGl2ZSBhbmQgY2FuJ3QgY29udGFpbiBcIkBcIiAhXG4gICAgY3JvblRpbWluZ0FsZXJ0SW5TZWNvbmRlOiAxMjAsIC8vIGZvciBsb2dzXG4gICAgcmVzcG9uc2VUaW1pbmdBbGVydEluU2Vjb25kZTogMywgLy8gaWRlbVxuICAgIHRva2VuU2lnbnVwVmFsaWRhdGlvblRpbWVJbkhvdXJzOiBcIjQ4aFwiLCAvLyBodHRwczovL2dpdGh1Yi5jb20vemVpdC9tc1xuICAgIHRva2VuTG9naW5MaW5rVGltZUluSG91cnM6IFwiMWhcIixcbiAgICB0b2tlbkNvbm5leGlvbk1pblRpbWVJbkhvdXJzOiBcIjI0aFwiLFxuICAgIHRva2VuQ29ubmV4aW9uTWF4VGltZUluRGF5czogXCIxODAgZGF5c1wiLFxuICAgIHRva2VuTG9naW5DaGFuZ2luZ1RpbWVJbkhvdXJzOiBcIjFoXCIsLy8gZm9yIGVtYWlsICYgcGFzc3dvcmQgY2hhbmdpbmdcbiAgICB0b2tlbkRlbGV0ZVVzZXJUaW1lSW5Ib3VyczogXCIxaFwiLFxuICAgIHRva2VuVW5zdWJzY3JpYmVMaW5rVGltZUluRGF5czogXCI3IGRheXNcIiwgLy8gdG9rZW4gc2VuZCB3aXRoIHN1YnNjcmlwdGlvbidzIGVtYWlsc1xuICAgIGZyZWVBY2NvdW50VGltaW5nSW5EYXlzOiAxMCxcbiAgICBmcmVlQWNjb3VudEV4cGlyYXRpb25Ob3RpZmljYXRpb25JbkRheXM6IDUsXG4gICAgYWNjb3VudEV4cGlyYXRpb25GaXJzdE5vdGlmaWNhdGlvbkluRGF5czogMTQsICAgIFxuICAgIGFjY291bnRFeHBpcmF0aW9uU2Vjb25kTm90aWZpY2F0aW9uSW5EYXlzOiA1LFxuICAgIGluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5czogMTgwLFxuICAgIC8vIFF1ZXN0aW9ubmFpcmVzOlxuICAgIG5iUXVlc3Rpb25zTWluOiAxLCAvLyBtaW5pbXVtIG51bWJlciBvZiBxdWVzdGlvbnMgZm9yIHRoZSBxdWVzdGlvbm5haXJlIHRvIGJlIHB1Ymxpc2hhYmxlXG4gICAgbmJRdWVzdGlvbnNNYXg6IDEwLCAvLyBpZiAwID0gbm90IG1heGltdW1cbiAgICBuYkNob2ljZXNNYXg6IDEwLFxuICAgIG5iTmV3UXVlc3Rpb25uYWlyZXM6IDEwLC8vIGZvciBSU1MsIGV0Yy5cbiAgICBob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVCZWdpbjoxLCAvLyBpbiB1c2VyIGxvY2FsIHRpbWVcbiAgICBob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQ6MjQsIC8vIGlkZW1cbiAgICBudW1iZXJOZXdRdWVzdGlvbm5haXJlQXRTYW1lVGltZTogNTAsIC8vIGZvciBtYXNzIG1haWxpbmdcbiAgICBtaW5TZWFyY2hRdWVzdGlvbm5haXJlczogMyxcbiAgICAvLyBJbGx1c3RyYXRpb25zOlxuICAgIG5iSWxsdXN0cmF0aW9uc01pbjogMCxcbiAgICBuYklsbHVzdHJhdGlvbnNNYXg6IDEsXG4gICAgbWF4SWxsdXN0cmF0aW9uU2l6ZWluT2N0ZXQ6IDEwMDAwMDAsLy8gcGFzIGNvbnRyw7Rsw6kgcG91ciBsJ2luc3RhbnQuIMOAIHJldm9pci5cbiAgICBtaW1lVHlwZXNGb3JJbGx1c3RyYXRpb246IFsgXCJpbWFnZS9qcGdcIiwgXCJpbWFnZS9qcGVnXCIsIFwiaW1hZ2UvcG5nXCIsIFwiaW1hZ2UvZ2lmXCIsIFwiaW1hZ2UvcG5nXCIgXSxcbiAgICAvLyAtLSBVcGxvYWQgYW5kIHJlc2l6ZTpcbiAgICBpbGx1c3RyYXRpb25zV2lkdGhNYXhJblB4OiA0MDAsXG4gICAgaWxsdXN0cmF0aW9uc01pbmlhdHVyZXNXaWR0aE1heEluUHg6IDIwMCxcbiAgICAvLyBMaW5rczpcbiAgICBuYkxpbmtzTWluOiAxLFxuICAgIG5iTGlua3NNYXg6IDEsXG4gICAgLy8gw6Agc3VwcHJpbWVyIHF1YW5kIHRvdXMgbGVzIFwicmVxdWlyZVwiIMOgIGpvdXI6XG4gICAgbmJRdWVzdGlvbnNNaW46IHF1ZXN0aW9ubmFpcmVzLm5iUXVlc3Rpb25zTWluLFxuICAgIG5iUXVlc3Rpb25zTWF4OiBxdWVzdGlvbm5haXJlcy5uYlF1ZXN0aW9uc01heCxcbiAgICBuYkNob2ljZXNNYXg6IHF1ZXN0aW9ubmFpcmVzLm5iQ2hvaWNlc01heCxcbiAgICBwYXNzd29yZE1pbkxlbmd0aDogdXNlcnMucGFzc3dvcmQubWlubGVuZ3RoLFxuICAgIGRpckNhY2hlVXNlcnM6IHVzZXJzLmRpckNhY2hlVXNlcnMsXG4gICAgZGlyQ2FjaGVVc2Vyc0Fuc3dlcnM6IHVzZXJzLmRpckNhY2hlVXNlcnNBbnN3ZXJzLFxuICAgIGRpckNhY2hlUXVlc3Rpb25uYWlyZXM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlUXVlc3Rpb25uYWlyZXMsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbnM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlUXVlc3Rpb25zLFxuICAgIGRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzLFxuICAgIGRpckhUTUxRdWVzdGlvbm5haXJlOiBxdWVzdGlvbm5haXJlcy5kaXJIVE1MUXVlc3Rpb25uYWlyZSxcbiAgICBkaXJXZWJRdWVzdGlvbm5haXJlOiBxdWVzdGlvbm5haXJlcy5kaXJXZWJRdWVzdGlvbm5haXJlXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbnsgICAgXG4gICAgLy8gQVBJJ3JvdXRlcyAoYWZ0ZXIgXCJhcGlVcmxcIiBkZWZpbmVkIGluIGluc3RhbmNlLmpzKVxuICAgIHF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3F1ZXN0aW9ubmFpcmVcIixcbiAgICBnZXRRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9nZXRcIixcbiAgICBwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcHJldmlld1wiLFxuICAgIHB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3F1aXovXCIsXG4gICAgc2F2ZUFuc3dlcnNSb3V0ZTogXCIvYW5zd2VyL1wiLFxuICAgIGdldFN0YXRzUXVlc3Rpb25uYWlyZXMgOiBcIi9zdGF0cy9cIixcbiAgICBzZWFyY2hRdWVzdGlvbm5haXJlc1JvdXRlIDogXCIvc2VhcmNoXCIsXG4gICAgc2VhcmNoQWRtaW5RdWVzdGlvbm5haXJlc1JvdXRlIDogXCIvc2VhcmNoYWRtaW5cIixcbiAgICBnZXRMaXN0TmV4dFF1ZXN0aW9ubmFpcmVzOiBcIi9nZXRsaXN0bmV4dHF1ZXN0aW9ubmFpcmVzL1wiLFxuICAgIC8vIC0tIHF1ZXN0aW9ucyAmIGNob2ljZXMgOlxuICAgIHF1ZXN0aW9uc1JvdXRlOiBcIi9xdWVzdGlvbi9cIixcbiAgICAvLyAtLSB0YWdzIDpcbiAgICB0YWdzU2VhcmNoUm91dGU6IFwiL3RhZ3Mvc2VhcmNoL1wiLFxuICAgIC8vIC0tIGFuc3dlcnMgOlxuICAgIGdldFF1ZXN0aW9ubmFpcmVzV2l0aG91dEFuc3dlcjogXCIvd2l0aG91dGFuc3dlci91c2VyL1wiLFxuICAgIGdldFByZXZpb3VzQW5zd2VyczogXCIvdXNlci9hbnN3ZXJzL1wiLFxuICAgIGdldFN0YXRzQW5zd2VycyA6IFwiL3VzZXIvYW53c3dlcnMvc3RhdHMvXCIsXG4gICAgZ2V0QWRtaW5TdGF0czogXCIvZ2V0YWRtaW5zdGF0cy9cIixcbiAgICAvLyBmb3JtcyA6IMOgIGNvbXBsw6l0ZXIgYXZlYyB2YWxldXJzIHBhciBkw6lmYXV0LCBldGMuIGNmIG1vZMOobGVcbiAgICBRdWVzdGlvbm5haXJlIDpcbiAgICB7XG4gICAgICAgIHRpdGxlOiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICBzbHVnOiB7IG1heGxlbmd0aDogMTUwIH0sIC8vIGNoYW1wIHJlcXVpcyBtYWlzIGNhbGN1bMOpIMOgIHBhcnRpciBkdSB0aXRyZSBxZCB2aWRlXG4gICAgICAgIGludHJvZHVjdGlvbjogeyByZXF1aXJlZDogdHJ1ZSB9XG4gICAgfSxcbiAgICBzZWFyY2hRdWVzdGlvbm5haXJlcyA6IHsgbWlubGVuZ3RoOiAzLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIFF1ZXN0aW9uIDpcbiAgICB7XG4gICAgICAgIHRleHQ6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgIHJhbms6IHsgcmVxdWlyZWQ6IHRydWUsIG1pbjoxLCBkZWZhdWx0VmFsdWU6MSB9XG4gICAgfSwgICAgICAgICAgXG4gICAgQ2hvaWNlIDpcbiAgICB7XG4gICAgICAgIHRleHQ6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH1cbiAgICB9LCAgICAgICAgICBcbiAgICBuYlF1ZXN0aW9uc01pbjogMSxcbiAgICBuYlF1ZXN0aW9uc01heDogMTAsXG4gICAgbmJDaG9pY2VzTWF4OiAxMCxcbiAgICBuYlRhZ3NNaW46IDAsXG4gICAgbmJUYWdzTWF4OiAwLCAvLyAwID0gbm90IG1heCAgICBcbiAgICAvLyBKU09OIGFuZCBIVE1MIGRpclxuICAgIGRpckNhY2hlUXVlc3Rpb25uYWlyZXMgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzXCIsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbnMgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzL3F1ZXN0aW9uc1wiLFxuICAgIGRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlcyA6IFwiZGF0YXMvdXNlcnMvcXVlc3Rpb25uYWlyZXNcIixcbiAgICBkaXJDYWNoZVRhZ3MgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzL3RhZ3NcIiwgIFxuICAgIGRpckhUTUxRdWVzdGlvbm5haXJlIDogXCJmcm9udC9wdWJsaWMvcXVpelwiLFxuICAgIGRpckhUTUxUYWdzIDogXCJmcm9udC9wdWJsaWMvcXVpenNcIixcbiAgICBkaXJXZWJRdWVzdGlvbm5haXJlIDogXCJxdWl6XCIsLy9wb3VyIHVybCBwYWdlXG4gICAgZGlyV2ViVGFncyA6IFwicXVpenNcIi8vIGlkZW1cbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIC8vIEFQSSdyb3V0ZXMgKGFmdGVyIFwiYXBpVXJsXCIgZGVmaW5lZCBpbiBpbnN0YW5jZS5qcylcbiAgICB1c2VyUm91dGVzOiBcIi91c2VyXCIsXG4gICAgc3Vic2NyaWJlUm91dGU6IFwiL3NpZ251cFwiLFxuICAgIGdldEdvZGZhdGhlclJvdXRlOiBcIi9nZXRnb2RmYXRoZXJpZFwiLFxuICAgIGNoZWNrSWZJc0VtYWlsZnJlZVJvdXRlOiBcIi9pc2VtYWlsZnJlZVwiLFxuICAgIGNoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZTogXCIvdmFsaWRhdGlvbi9cIixcbiAgICBjaGVja0xvZ2luUm91dGU6IFwiL2NoZWNrbG9naW4vXCIsXG4gICAgY29ubmVjdGlvblJvdXRlOiBcIi9sb2dpblwiLFxuICAgIGdldExvZ2luTGlua1JvdXRlOiBcIi9nZXRsb2dpbmxpbmtcIixcbiAgICBjb25uZWN0aW9uV2l0aExpbmtSb3V0ZTogXCIvY2hlY2tsb2dpbmxpbmtcIixcbiAgICBnZXRVc2VySW5mb3M6IFwiL2dldC9cIixcbiAgICBjcmVhdGVVc2VyUm91dGU6IFwiL2NyZWF0ZVwiLFxuICAgIHZhbGlkYXRlVXNlclJvdXRlOiBcIi92YWxpZGF0ZS9cIixcbiAgICB1cGRhdGVVc2VySW5mb3M6IFwiL21vZGlmeS9cIixcbiAgICBzZWFyY2hVc2VyUm91dGU6IFwiL3NlYXJjaC9cIixcbiAgICBnZXRHb2RDaGlsZHM6IFwiL2dldGdvZGNoaWxkcy9cIixcbiAgICBjaGVja05ld0xvZ2luTGlua1JvdXRlOiBcIi9jb25maXJtbmV3bG9naW4vXCIsXG4gICAgY2hlY2tEZWxldGVMaW5rUm91dGU6IFwiL2NvbmZpcm1kZWxldGUvXCIsXG4gICAgZ2V0UGF5bWVudHM6IFwiL3BheW1lbnQvZ2V0Zm9yb25ldXNlci9cIixcbiAgICB1bnN1YnNjcmliZVJvdXRlOiBcIi9zdWJzY3JpcHRpb24vc3RvcC9cIixcbiAgICBnZXRBZG1pblN0YXRzOiBcIi9nZXRhZG1pbnN0YXRzL1wiLFxuICAgIC8vIGZvcm1zIDogw6AgY29tcGzDqXRlciBhdmVjIHZhbGV1cnMgcGFyIGTDqWZhdXQsIGV0Yy4gY2YgbW9kw6hsZVxuICAgIG5hbWU6IHsgbWF4bGVuZ3RoOiA3MCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBlbWFpbDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBwYXNzd29yZDogeyBtaW5sZW5ndGg6IDgsIG1heGxlbmd0aDo3MiwgcmVxdWlyZWQ6IHRydWUgfSwgLy8gaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvYmNyeXB0I3NlY3VyaXR5LWlzc3Vlcy1hbmQtY29uY2VybnNcbiAgICBuZXdQYXNzd29yZDogeyBtaW5sZW5ndGg6IDgsIG1heGxlbmd0aDo3MiB9LFxuICAgIGNvZGVHb2RmYXRoZXI6IHsgbWF4bGVuZ3RoOiAyNTUgfSxcbiAgICBjZ3VPazogeyB2YWx1ZTogXCJ0cnVlXCIsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgdGltZURpZmZlcmVuY2VNaW46IC03MjAsXG4gICAgdGltZURpZmZlcmVuY2VNYXg6ODQwLFxuICAgIC8vIEpTT04gZGlyXG4gICAgZGlyQ2FjaGVVc2VycyA6IFwiZGF0YXMvdXNlcnNcIixcbiAgICBkaXJDYWNoZVVzZXJzQW5zd2VycyA6IFwiZGF0YXMvdXNlcnMvcXVlc3Rpb25uYWlyZXMvYW5zd2Vyc1wiXG59O1xuIiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL2dlbmVyYWxcIjogXCIuLi9sYW5nL2ZyL2dlbmVyYWwuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9nZW5lcmFsJFwiOyIsInZhciBtYXAgPSB7XG5cdFwiLi9mci91c2VyXCI6IFwiLi4vbGFuZy9mci91c2VyLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvdXNlciRcIjsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgc2l0ZUhUTUxUaXRsZSA6IFwiV2lraUxlcm5pIDogcXUnYWxsZXotdm91cyBhcHByZW5kcmUgYXVqb3VyZCdodWkgP1wiLFxuICAgIHNpdGVNZXRhRGVzY3JpcHRpb24gOiBcIkNoYXF1ZSBqb3VyLCB0ZXN0ZXogdm9zIGNvbm5haXNzYW5jZXMgZXQgYXBwcmVuZXogZGUgbm91dmVsbGVzIGNob3NlcyBhdmVjIFdpa2lMZXJuaS5cIixcbiAgICBzY3JpcHRUaW1pbmdJbmZvIDogXCJEdXLDqWUgZGUgbGEgcsOpcG9uc2UgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNjcmlwdFRpbWluZ0FsZXJ0IDogXCIqKiogU2NyaXB0IGxlbnQgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNlcnZlckVycm9yIDogXCJEw6lzb2zDqS4gVW5lIGVycmV1ciBpbXByw6l2dWUgZXN0IHN1cnZlbnVlLiBTaSBjZWxhIHBlcnNpc3RlLCBuJ2jDqXNpdGV6IMOgIHByw6l2ZW5pciBsJ2FkbWluaXN0cmF0ZXVyIGR1IHNpdGUuXCIsXG4gICAgc2VydmVyRXJyb3JBZG1pbiA6IFwiQnVnIGRlIGwnYXBwbGljYXRpb24gOlwiLFxuICAgIG5lZWRlZFBhcmFtcyA6IFwiRGVzIHBhcmFtw6h0cmVzIG7DqWNlc3NhaXJlcyBtYW5xdWFudHMgc29udCBtYW5xdWFudHMuXCIsXG4gICAgYmFkVXJsIDogXCJUZW50YXRpdmUgZCdhY2PDqHMgw6AgdW5lIHBhZ2UgbidleGlzdGFudCBwYXMgOlwiLFxuICAgIG5vdFZhbGlkRm9ybWF0IDogXCJGb3JtYXQgbm9uIHZhbGlkZS5cIixcbiAgICBub3RBbGxvd2VkIDogXCJWb3VzIG4nYXZleiBwYXMgbGVzIGRyb2l0cyBuw6ljZXNzYWlyZXMgcG91ciBjZXR0ZSBhY3Rpb24uXCIsXG4gICAgbm90UmVxdWlyZWQgOiBcIkZhY3VsdGF0aWYuXCIsXG4gICAgdXBkYXRlQnRuVHh0OiBcIk1vZGlmaWVyXCIsXG4gICAgYWRkQnRuVHh0OiBcIkFqb3V0ZXJcIixcbiAgICBkZWxldGVCdG5UeHQ6IFwiU3VwcHJpbWVyXCIsXG4gICAgYWRkT2tNZXNzYWdlIDogXCJMZXMgZG9ubsOpZXMgb250IGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llcy5cIixcbiAgICB1cGRhdGVPa01lc3NhZ2UgOiBcIkxhIG1pc2Ugw6Agam91ciDDoCBqb3VyIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgZGVsZXRlT2tNZXNzYWdlIDogXCJMYSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIGZhaWxBdXRoIDogXCJFcnJldXIgZCdhdXRoZW50aWZpY2F0aW9uLlwiLFxuICAgIGZhaWxBdXRoSGVhZGVyIDogXCJBYnNlbmNlIGRlIGhlYWRlciBBdXRob3JpemF0aW9uLlwiLFxuICAgIGZhaWxBdXRoVG9rZW4gOiBcIlRva2VuIGludmFsaWRlIG91IHV0aWxpc2F0ZXVyIG5vbiB0cm91dsOpLlwiLFxuICAgIGZhaWxBdXRoSWQgOiBcIklkZW50aWZpYW50IG5vbiB2YWxpZGUgOiBcIixcbiAgICBmYWlsQXV0aENyb24gOiBcIlRlbnRhdGl2ZSBkZSBsYW5jZW1lbnQgZCd1biBjcm9uIHNhbnMgbGUgYm9uIHRva2VuLlwiLFxuICAgIHByZXZpb3VzUGFnZSA6IFwiUGFnZSBwcsOpY8OpZGVudGVcIixcbiAgICBuZXh0UGFnZSA6IFwiUGFnZSBzdWl2YW50ZVwiLFxuICAgIGJ0bkxpbmtUb1F1ZXN0aW9ubmFpcmUgOiBcIkFsbGVyIGF1IHF1aXogIVwiLFxuICAgIHN0YXRzQWRtaW4gOiBcIkR1cmFudCBsZXMgZGVybmnDqHJlcyAyNGggOiBOQl9VU0VSU18yNEggY29tcHRlcyBvbnQgw6l0w6kgY3LDqcOpcywgTkJfU1VCU0NSSVBUSU9OU18yNEggdmFsaWTDqXMgZXQgTkJfVVNFUlNfREVMRVRFRF8yNEggc3VwcHJpbcOpcy4gTkJfQU5TV0VSU18yNEggcsOpcG9uc2VzIGF1eCBxdWl6cyBvbnQgw6l0w6kgZW5yZWdpc3Ryw6llcy48YnI+RW4gdG91dCwgaWwgeSBhIDogTkJfVVNFUlNfVE9UIGNvbXB0ZXMsIGRvbnQgTkJfU1VCU0NSSVBUSU9OU19UT1QgdmFsaWTDqXMgZXQgTkJfU1VCU0NSSVBUSU9OU19QUkVNSVVNIGNvbXB0ZXMgcHLDqW1pdW0uIE5CX0FOU1dFUlNfVE9UIHLDqXBvbnNlcyBhdXggcXVpenMgb250IMOpdMOpIGVucmVnaXN0csOpZXMuPGJyPlBhcm1pIGxlcyBOQl9VU0VSU19ERUxFVEVEX1RPVCBjb21wdGVzIHN1cHByaW3DqXMsIE5CX1VTRVJTX0RFTEVURURfVkFMSURFRCBhdmFpZW50IHZhbGlkw6kgbGV1ciBjb21wdGUgZXQgTkJfVVNFUlNfREVMRVRFRF9QUkVNSVVNIGF2YWllbnQgc291c2NyaXQgdW4gY29tcHRlIHByw6ltaXVtLlwiXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBub3RGb3VuZDogXCJMJ3V0aWxpc2F0ZXVyIG4nYSBwYXMgw6l0w6kgdHJvdXbDqS5cIixcbiAgICBuZWVkTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyLlwiLFxuICAgIG5lZWROb3RUb29Mb25nTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyIG5lIGNvbXB0YW50IHBhcyBwbHVzIGRlIDcwIGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRFbWFpbDogXCJNZXJjaSBkZSBzYWlzaXIgdm90cmUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgbmVlZFVuaXF1ZUVtYWlsOiBcIkwnYWRyZXNzZSBlLW1haWwgcXVlIHZvdXMgYXZleiBzYWlzaWUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcGFyIHVuIGF1dHJlIHV0aWxpc2F0ZXVyLiBTaSB2b3VzIGF2ZXogZMOpasOgIHVuIGNvbXB0ZSwgPGEgaHJlZj0nLyNVUkwnPmNsaXF1ZXotaWNpIHBvdXIgdm91cyBjb25uZWN0ZXI8L2E+LlwiLFxuICAgIG5lZWROb3RUb29Mb25nRW1haWw6IFwiTWVyY2kgZGUgc2Fpc2lyIHVuZSBhZHJlc3NlIGUtbWFpbCBuZSBjb21wdGFudCBwYXMgcGx1cyBkZSAyNTUgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZFBhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZS5cIixcbiAgICBuZWVkTG9uZ1Bhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZSBkJ2F1IG1vaW5zIE1JTl9MRU5HVEggY2FyYWN0w6hyZXMuXCIsXG4gICAgcGFzc3dvcmRDb3BpZWQ6IFwiTGUgbW90IGRlIHBhc3NlIGfDqW7DqXLDqSBhIMOpdMOpIGNvcGnDqSBkYW5zIGxlIHByZXNzZS1wYXBpZXIuIFZvdXMgcG91dmV6IGxlIHJlY29waWVyIG/DuSB2b3VzIGxlIHNvdWhhaXRlci5cIixcbiAgICBuZWVkU3RhdHVzIDogXCJJbCBtYW5xdWUgbGUgc3RhdHV0LlwiLFxuICAgIG5lZWRMYW5ndWFnZSA6IFwiSWwgbWFucXVlIGxlIGNvZGUgbGFuZ3VlLlwiLFxuICAgIG5lZWRWYWxpZExhc3RDb25uZWN0aW9uRGF0ZSA6IFwiTGEgZGF0ZSBkZSBkZXJuacOocmUgY29ubmV4aW9uIG4nZXN0IHBhcyB2YWxpZGUuXCIsXG4gICAgbmVlZFNNVFAgOiBcIklsIG1hbnF1ZSBsZSBzZXJ2ZXVyIFNNVFAuXCIsXG4gICAgbmVlZFNNVFBOb3RGb3VuZCA6IFwiSWwgbWFucXVlIGxlIHNlcnZldXIgU01UUC5cIixcbiAgICBuZWVkS25vd05ld3NsZXR0ZXJPayA6IFwiSWwgZmF1dCBzYXZvaXIgc2kgbCd1dGlsaXNhdGV1ciBhY2NlcHRlIG91IHJlZnVzZSBkZSByZWNldm9pciBsYSBuZXdzbGV0dGVyLlwiLFxuICAgIG5lZWRUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBjb25uYcOudHJlIGxlIG5vbWJyZSBkZSBtaW51dGVzIGR1IGTDqWNhbGFnZSBob3JhaXJlLlwiLFxuICAgIG5lZWRNaW5UaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGVubGV2ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgNzIwLlwiLFxuICAgIG5lZWRNYXhUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGFqb3V0ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgODQwLlwiLFxuICAgIG5lZWRVR0NPayA6IFwiVm91cyBkZXZleiBhY2NlcHRlciBsZXMgQ0dVIHBvdXIgcG91dm9pciBjcsOpZXIgdm90cmUgY29tcHRlLiBcIixcbiAgICBnb2RmYXRoZXJOb3RGb3VuZDogXCJBdWN1biB1dGlsaXNhdGV1ciB2YWxpZGUgdHJvdXbDqSBwb3VyIGNlIGNvZGUgcGFycmFpbi5cIixcbiAgICBnb2RmYXRoZXJGb3VuZDogXCJWb3RyZSBwYXJyYWluIGEgYmllbiDDqXTDqSB0cm91dsOpICFcIixcbiAgICBtYWlsVmFsaWRhdGlvbk1lc3NhZ2U6IFwiVm90cmUgaW5zY3JpcHRpb24gZXN0IGJpZW4gZW5yZWdpc3Ryw6llLlxcblBvdXIgbGEgZmluYWxpc2VyLCBtZXJjaSBkZSBjbGlxdWVyIGRhbnMgbGVzIDI0SCBzdXIgbGUgbGllbiBkZSBjb25maXJtYXRpb24gcXVpIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBwYXIgZS1tYWlsLlwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1N1YmplY3QgOiBcIk1lcmNpIGRlIHZhbGlkZXIgdm90cmUgY29tcHRlXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblBvdXIgdmFsaWRlciB2b3RyZSBjb21wdGUsIG1lcmNpIGRlIGNsaXF1ZXIgc3VyIGxlIGxpZW4gc3VpdmFudCBkYW5zIGxlcyAyNGggOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm90cmUgY29tcHRlLCBtZXJjaSBkZSBjbGlxdWVyIHN1ciBsZSBsaWVuIHN1aXZhbnQgZGFucyBsZXMgMjRoLjwvcD48cD48YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+VmFsaWRlci48L2E+PC9wPlwiLFxuICAgIHZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGNvbXB0ZSB2aWVudCBiaWVuIGQnw6p0cmUgdmFsaWTDqS4gTWVyY2kgZXQgYmllbnZlbnVlICE8YnI+Vm91cyBwb3V2ZXogc2FucyB0YXJkZXIgdm91cyBjb25uZWN0ZXIgY2ktZGVzc291cyBwb3VyIGFjY8OpZGVyIMOgIHZvdHJlIGNvbXB0ZS5cIixcbiAgICB2YWxpZGF0aW9uTWVzc2FnZUFkbWluOiBcIkxlIGNvbXB0ZSBhIGJpZW4gw6l0w6kgdmFsaWTDqS5cIixcbiAgICB2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2U6IFwiSWwgc2VtYmxlIHF1ZSB2b3VzIGF5ZXogZMOpasOgIHZhbGlkw6kgdm90cmUgY29tcHRlLlwiLFxuICAgIHZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZUFkbWluOiBcIkNlIGNvbXB0ZSBhIGTDqWrDoCDDqXTDqSB2YWxpZMOpLlwiLFxuICAgIG1haWxXZWxjb21lU3ViamVjdCA6IFwiQmllbnZlbnVlICFcIixcbiAgICBtYWlsV2VsY29tZUJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblZvdHJlIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuXFxuTWVyY2kgZXQgw6AgYmllbnTDtHQgIVwiLFxuICAgIG1haWxXZWxjb21lQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlZvdHJlIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuPC9wPjxwPk1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyU3ViamVjdCA6IFwiTWVyY2kgIVwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlckJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcbkdyw6JjZSDDoCB2b3VzIHVuIG5vdXZlbCB1dGlsaXNhdGV1ciAoRU1BSUwpIHZpZW50IGRlIHMnaW5zY3JpcmUgc3VyIE5PTV9TSVRFLlxcbk1lcmNpIGV0IMOgIGJpZW50w7R0ICFcIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+R3LDomNlIMOgIHZvdXMgdW4gbm91dmVsIHV0aWxpc2F0ZXVyIChFTUFJTCkgdmllbnQgZGUgcydpbnNjcmlyZSBzdXIgTk9NX1NJVEUuPC9wPjxwPk1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGxpZW4gZGUgY29uZmlybWF0aW9uIG5lIHNlbWJsZSBwYXMgdmFsaWRlIG91IGJpZW4gaWwgYSBleHBpcsOpLiBWb3VzIHBvdXZleiBlbiByZWNldm9pciB1biBub3V2ZWF1IDxhIGhyZWY9JyNVUkwnPmVuIGNsaXF1YW50IGljaTwvYT4uXCIsXG4gICAgZW1haWxOb3RGb3VuZDogXCJBdWN1biB1dGlsaXNhdGV1ciB0cm91dsOpIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgYWxyZWFkeUNvbm5lY3RlZDogXCJWb3VzIMOqdGVzIGTDqWrDoCBjb25uZWN0w6koZSkgYXUgc2l0ZSAhXCIsXG4gICAgbmVlZEJlQ29ubmVjdGVkOiBcIlZvdXMgZGV2ZXogw6p0cmUgY29ubmVjdMOpKGUpIHBvdXIgYWNjw6lkZXIgw6AgY2V0dGUgcGFnZS5cIixcbiAgICBjb25uZWN0aW9uT2s6IFwiQ29ubmV4aW9uIHLDqXVzc2llLlwiLFxuICAgIG5lZWRDaG9vc2VMb2dpbldheTogXCJWb3VzIGRldmV6IHNvaXQgc2Fpc2lyIHZvdHJlIG1vdCBkZSBwYXNzZSwgc29pdCBjb2NoZXIgbGEgY2FzZSB2b3VzIHBlcm1ldHRhbnQgZGUgcmVjZXZvaXIgdW4gbGllbiBkZSBjb25uZXhpb24gcGFyIGUtbWFpbC5cIixcbiAgICBuZWVkVmFsaWRhdGlvblRvTG9naW4gOiBcIlZvdXMgZGV2ZXogZCdhYm9yZCB2YWxpZGVyIHZvdHJlIGNvbXB0ZSBhdmFudCBkZSB2b3VzIGNvbm5lY3Rlci4gUG91ciBjZSBmYWlyZSwgdW4gbGllbiB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbC5cIixcbiAgICB0b29NYW55TG9naW5GYWlscyA6IFwiVHJvcCBkZSB0ZW50YXRpdmVzIGRlIGNvbm5leGlvbiBpbmZydWN0dWV1c2VzIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuIFZvdXMgZGV2ZXogYXR0ZW5kcmUgTUlOVVRFUyBtaW51dGVzIHBvdXIgZXNzYXllciBkZSBub3V2ZWF1LlwiLFxuICAgIGJhZFBhc3N3b3JkOiBcIkxlIG1vdCBkZSBwYXNzZSBuJ2VzdCBwYXMgbGUgYm9uLlwiLFxuICAgIG1haWxMb2dpbkxpbmtTdWJqZWN0IDogXCJWb3RyZSBsaWVuIGRlIGNvbm5leGlvbi5cIixcbiAgICBtYWlsTG9naW5MaW5rQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuUG91ciB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6IExJTktfVVJMXCIsXG4gICAgbWFpbExvZ2luTGlua0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZvdXMgY29ubmVjdGVyIMOgIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDo8L3A+PHA+PGEgaHJlZj1cXFwiTElOS19VUkxcXFwiPlZhbGlkZXIuPC9hPjwvcD5cIixcbiAgICBtYWlsTG9naW5MaW5rTWVzc2FnZSA6IFwiVW4gbGllbiBkZSBjb25uZXhpb24gdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHN1ciB2b3RyZSBhZHJlc3NlIGUtbWFpbC4gTmUgdGFyZGV6IHBhcyDDoCBsJ3V0aWxpc2VyLCBjYXIgaWwgbidlc3QgdmFsYWJsZSBxdWUgZHVyYW50IFwiLFxuICAgIHVwZGF0ZWRPa01lc3NhZ2U6IFwiVm9zIGluZm9ybWF0aW9ucyBvbnQgYmllbiDDqXTDqSBtaXNlcyDDoCBqb3VyLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEVtYWlsIDogXCJNYWlzIGxhIG5vdXZlbGxlIGFkcmVzc2UgZS1tYWlsIG4nYSBwdSDDqnRyZSBlbnJlZ2lzdHLDqWUgY2FyIGVsbGUgbidhIHBhcyB1bmUgZm9ybWF0IGNvcnJlY3QuXCIsXG4gICAgdXBkYXRlZE5lZWRVbmlxdWVFbWFpbCA6IFwiTWFpcyBsYSBub3V2ZWxsZSBhZHJlc3NlIGUtbWFpbCBzYWlzaWUgKE5FV19FTUFJTCkgbidhIHB1IMOqdHJlIGVucmVnaXN0csOpZSwgY2FyIGVsbGUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcG91ciB1biBhdXRyZSBjb21wdGUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luU3ViamVjdCA6IFwiTWVyY2kgZGUgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblBvdXIgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cyBkZSBjb25uZXhpb24sIDxhIGhyZWY9XFxcIkxJTktfVVJMXFxcIj5jbGlxdWV6IGljaTwvYT4gc2FucyB0YXJkZXIuPC9wPlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkxpbmtNZXNzYWdlOiBcIkNlcGVuZGFudCwgdm91cyBhdmV6IG1vZGlmacOpIGF1IG1vaW5zIHVuIGRlIHZvcyBpZGVudGlmaWFudHMgZGUgY29ubmV4aW9uIChlbWFpbCBldC9vdSBtb3QgZGUgcGFzc2UpIGV0IDxiPnZvdXMgZGV2ZXogY2xpcXVlciBzdXIgbGUgbGllbiBxdWkgdmllbnQgZGUgdm91cyDDqnRyZXMgZW52b3nDqSBzdXIgdm90cmUgYWRyZXNzZSAoTkVXX0VNQUlMKSBwb3VyIHZhbGlkZXIgY2UgY2hhbmdlbWVudDwvYj4uIEVuIGF0dGVuZGFudCwgbWVyY2kgZGUgY29udGludWVyIMOgIHV0aWxpc2VyIHZvcyBhbmNpZW5zIGlkZW50aWZpYW50cy5cIixcbiAgICB1cGRhdGVkTmVlZFZhbGlkYXRlZFVzZXI6IFwiTCd1dGlsaXNhdGV1ciBxdWUgdm91cyBzb3VoYWl0w6kgbW9kaWZpZXIgbidleGlzdGUgcGFzL3BsdXMgb3UgbidhIHBhcyBlbmNvcmUgdmFsaWTDqSBzb24gY29tcHRlLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEdvZGZhdGhlciA6IFwiTWFpcyBsZSBub3V2ZWF1IGNvZGUgcGFycmFpbiBuJ2EgcHUgw6p0cmUgcmV0ZW51LCBjYXIgaWwgbmUgY29ycmVzcG9uZCDDoCBhdWN1biBjb21wdGUgdXRpbGlzYXRldXIgb3Ugw6AgbCd1dGlsaXNhdGV1ciBsdWktbcOqbWUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luT2tNZXNzYWdlOiBcIkxhIG1pc2Ugw6Agam91ciBkZSB2b3MgaWRlbnRpZmlhbnRzIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgdXBkYXRlZEZhaWxlZEdvZGZhdGhlck5vdEZvdW5kIDogXCJMJ2lkZW50aWZpYW50IGZvdXJuaSBwb3VyIGxlIHBhcnJhaW4gbmUgY29ycmVzcG9uZCDDoCBhdWN1biB1dGlsaXNhdGV1ci5cIixcbiAgICBjcmVhdGlvbk9rTWVzc2FnZTogXCJMZSBub3V2ZWwgdXRpbGlzYXRldXIgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpLlwiLFxuICAgIG1haWxEZWxldGVTdWJqZWN0IDogXCJDb25maXJtZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLlwiLFxuICAgIG1haWxEZWxldGVCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5Qb3VyIHZhbGlkZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbERlbGV0ZUJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCA8YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+Y2xpcXVleiBpY2k8L2E+IHNhbnMgdGFyZGVyLjwvcD5cIixcbiAgICBtYWlsRGVsZXRlTGlua01lc3NhZ2U6IFwiVm90cmUgZGVtYW5kZSBkZSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLiBNZXJjaSBkZSBjbGlxdWVyIHNhbnMgdGFyZGVyIHN1ciBsZSBsaWVuIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbCBwb3VyIGNvbmZpcm1lci5cIixcbiAgICBkZWxldGVPa01lc3NhZ2U6IFwiTCd1dGlsaXNhdGV1ciBhIGJpZW4gw6l0w6kgc3VwcHJpbcOpLlwiLFxuICAgIGRlbGV0ZUZhaWxNZXNzYWdlOiBcIlRlbnRhdGl2ZSBkZSBzdXBwcmVzc2lvbiBkJ3VuIHV0aWxpc2F0ZXVyIGluZXhpc3RhbnQgOiBcIixcbiAgICBtYWlsRGVsZXRlTGlua09rTWVzc2FnZTogXCJWb3RyZSBjb21wdGUgYSBiaWVuIMOpdMOpIHN1cHByaW3DqS4gTWVyY2kgZCdhdm9pciB1dGlsaXPDqSBub3Mgc2VydmljZXMuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtBbHJlYWR5TWVzc2FnZTogXCJJbCBzZW1ibGUgcXVlIHZvdXMgYXlleiBkw6lqw6AgdmFsaWTDqSBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtGYWlsTWVzc2FnZTogXCJWb3RyZSBsaWVuIGRlIHN1cHByZXNzaW9uIG4nZXN0IHBhcyB2YWxpZGUgb3UgYWxvcnMgaWwgbidlc3QgcGx1cyB2YWxhYmxlLlwiLFxuICAgIGNyb25EZWxldGVVbnZhbGlkZWRVc2Vyc01lc3NhZ2U6IFwiIGNvbXB0ZXMgdXRpbGlzYXRldXJzIG5vbiB2YWxpZMOpcyBvbnQgw6l0w6kgc3VwcHJpbcOpcy5cIixcbiAgICBkZWxldGVJbmFjdGl2ZVVzZXJzTWVzc2FnZTogXCIgY29tcHRlcyB1dGlsaXNhdGV1cnMgaW5hY3RpZnMgb250IMOpdMOpIHN1cHByaW3DqXMuXCIsXG4gICAgd2VsY29tZU1lc3NhZ2U6IFwiQmllbnZlbnVlICNOQU1FICFcIixcbiAgICBieWVieWVNZXNzYWdlOiBcIlNpIHZvdXMgdm95ZXogY2UgbWVzc2FnZSwgYydlc3QgcXVlIHZvdHJlIGTDqWNvbm5leGlvbiBzJ2VzdCBiaWVuIGTDqXJvdWzDqWUuPGJyPsOAIGJpZW50w7R0ICFcIixcbiAgICBpbmZvc1VzZXJGb3JBZG1pbjogXCJDZXQgdXRpbGlzYXRldXIgKGlkOiBJRF9VU0VSKSBhIDxiPmNyw6nDqSBzb24gY29tcHRlIGxlIERBVEVfQ1JFQTwvYj4sIGxhIGRlcm5pw6hyZSBtaXNlIMOgIGpvdXIgZGF0YW50IGR1IERBVEVfVVBEQVRFLjxicj48Yj5EYXRlIGRlIHNhIGRlcm5pw6hyZSBjb25uZXhpb24gOiBEQVRFX0NPTk5FQ1RJT04uPC9iPlwiLFxuICAgIGluZm9zQWRtaW5Hb2RmYXRoZXI6IFwiQ2V0IHV0aWxpc2F0ZXVyIGEgw6l0w6kgcGFycmFpbsOpIHBhciBcIixcbiAgICBpbmZvc0FkbWluTmJHb2RDaGlsZHM6IFwiU2VzICNOQiBmaWxsZXVpbHMgOiBcIlxufTsiLCIvLyBRdWVscXVlcyBmb25jdGlvbnMgdXRpbGVzIHBvdXIgbGVzIGNoYcOubmVzXG5cbmNsYXNzIFRvb2xcbntcbiAgICBzdGF0aWMgaXNFbXB0eShteVZhcilcbiAgICB7XG4gICAgICAgIGlmKG15VmFyPT09dW5kZWZpbmVkIHx8IG15VmFyPT09bnVsbClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIG15VmFyKz1cIlwiOy8vIHNpIGF1dHJlIGNob3NlIHF1J3VuZSBjaGHDrm5lIGVudm95w6kuLi5cbiAgICAgICAgICAgIG15VmFyPW15VmFyLnRyaW0oKTtcbiAgICAgICAgICAgIGlmKG15VmFyPT09XCJcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgc3RhdGljIHRyaW1JZk5vdE51bGwobXlTdHJpbmcpXG4gICAge1xuICAgICAgICBpZihUb29sLmlzRW1wdHkobXlTdHJpbmcpKVxuICAgICAgICAgICAgbXlTdHJpbmc9bnVsbDtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVN0cmluZys9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVN0cmluZz1teVN0cmluZy50cmltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG15U3RyaW5nO1xuICAgIH1cblxuXG4gICAgc3RhdGljIHNob3J0ZW5JZkxvbmdlclRoYW4obXlTdHJpbmcsIG1heClcbiAgICB7XG4gICAgICAgIG15U3RyaW5nKz1cIlwiOy8vIGF1IGNhcyBvw7kgY2VsYSBuZSBzZXJhaXQgcGFzIHVuZSBjaGHDrm5lLi4uXG4gICAgICAgaWYobXlTdHJpbmcubGVuZ3RoID4gbWF4KVxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcuc3Vic3RyaW5nKDAsIChtYXgtMykpK1wiLi4uXCI7XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cbiAgICAvLyBzb3VyY2UgOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNTYwNDE0MC9yZXBsYWNlLW11bHRpcGxlLXN0cmluZ3Mtd2l0aC1tdWx0aXBsZS1vdGhlci1zdHJpbmdzXG4gICAgc3RhdGljIHJlcGxhY2VBbGwobXlTdHJpbmcsIG1hcE9iailcbiAgICB7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VFbHRzID0gbmV3IFJlZ0V4cChPYmplY3Qua2V5cyhtYXBPYmopLmpvaW4oXCJ8XCIpLFwiZ2lcIik7XG4gICAgICAgIHJldHVybiBteVN0cmluZy5yZXBsYWNlKHJlcGxhY2VFbHRzLCAobWF0Y2hlZCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG1hcE9ialttYXRjaGVkXTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZnIvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT2JqZXRzX2dsb2JhdXgvTWF0aC9yYW5kb21cbiAgICBzdGF0aWMgZ2V0UmFuZG9tSW50KG1pbiwgbWF4KVxuICAgIHtcbiAgICAgICAgbWluID0gTWF0aC5jZWlsKG1pbik7XG4gICAgICAgIG1heCA9IE1hdGguZmxvb3IobWF4KTtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pKSArIG1pbjtcbiAgICB9XG5cbiAgICAvLyDDoCBjb21wbMOpdGVyIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGF0ZV9mb3JtYXRfYnlfY291bnRyeVxuICAgIHN0YXRpYyBkYXRlRm9ybWF0KGRhdGVTdHJpbmcsIGxhbmc9XCJmclwiKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KGRhdGVTdHJpbmcpKVxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIGxldCBteURhdGU9bmV3IERhdGUoZGF0ZVN0cmluZyk7XG4gICAgICAgIGxldCBteURheT1teURhdGUuZ2V0RGF0ZSgpK1wiXCI7XG4gICAgICAgIGlmKG15RGF5Lmxlbmd0aD09PTEpXG4gICAgICAgICAgICBteURheT1cIjBcIitteURheTtcbiAgICAgICAgbGV0IG15TW91bnRoPShteURhdGUuZ2V0TW9udGgoKSsxKStcIlwiO1xuICAgICAgICBpZihteU1vdW50aC5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlNb3VudGg9XCIwXCIrbXlNb3VudGg7XG4gICAgICAgIGxldCBteVllYXI9bXlEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGlmKGxhbmc9PT1cImZyXCIpXG4gICAgICAgICAgICByZXR1cm4gbXlEYXkrXCIvXCIrbXlNb3VudGgrXCIvXCIrbXlZZWFyO1xuICAgICAgICBlbHNlIGlmIChsYW5nPT09XCJmb3JtXCIpLy8gMjAxNC0wMi0wOVxuICAgICAgICAgICAgcmV0dXJuIG15WWVhcitcIi1cIitteU1vdW50aCtcIi1cIitteURheTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG15TW91bnRoK1wiL1wiK215RGF5K1wiL1wiK215WWVhcjtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVG9vbDsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZGVmYXVsdC9jb25maWcvZnIuanNcIjogXCIuLi92aWV3cy9kZWZhdWx0L2NvbmZpZy9mci5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi92aWV3cyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC5qcyRcIjsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgaGVhZExpbmtzOlxuICAgIFtcbiAgICAgICAgeyBhbmNob3I6IFwiQWNjdWVpbFwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNb24gY29tcHRlXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb25uZXhpb24uaG10XCIsIGlkOiBcImFjY291bnRIZWFkTGlua1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiw4AgcHJvcG9zXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9hLXByb3Bvcy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDb250YWN0XCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb250YWN0Lmh0bWxcIiB9IH0sXG4gICAgXSxcbiAgICBmb290TGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJDcsOpZGl0c1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY3JlZGl0cy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNZW50aW9ucyBsw6lnYWxlc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvbWVudGlvbnMtbGVnYWxlcy5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiRG9ubsOpZXMgcGVyc29ubmVsbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9kb25uZWVzLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkMuRy5VLlwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY2d1Lmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDLkcuVi5cIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nndi5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICBdLFxuICAgIG1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlOiAxMCxcbiAgICB1c2VySG9tZVBhZ2UgOiBcImFjY3VlaWwuaHRtbFwiLFxuICAgIGFkbWluSG9tZVBhZ2UgOiBcImFkbWluLmh0bWxcIixcbiAgICBtYW5hZ2VySG9tZVBhZ2UgOiBcImdlc3Rpb24uaHRtbFwiLFxuICAgIHN1YnNjcmliZVBhZ2UgOiBcImluc2NyaXB0aW9uLmh0bWxcIixcbiAgICBjb25uZWN0aW9uUGFnZSA6IFwiY29ubmV4aW9uLmh0bWxcIixcbiAgICBhY2NvdW50UGFnZTogXCJjb21wdGUuaHRtbFwiLFxuICAgIHF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi1xdWl6cy5odG1sXCIsXG4gICAgdXNlcnNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXV0aWxpc2F0ZXVycy5odG1sXCIsXG4gICAgbmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSA6IDEwLFxuICAgIGlsbHVzdHJhdGlvbkRpciA6IFwiL2ltZy9xdWl6cy9cIixcbiAgICBzaXRlU2xvZ2FuOiBcIkN1bHRpdm9ucyBub3RyZSBqYXJkaW4gIVwiLFxuICAgIGhvbWVUaXRsZTE6IFwiRGUgbmF0dXJlIGN1cmlldXNlID9cIixcbiAgICBob21lUDE6IFwiQXZlYyBXaWtpTGVybmkgdm91cyBhcHByZW5leiBjaGFxdWUgam91ciBkZSBub3V2ZWxsZXMgY2hvc2VzLjxicj5EZXMgYXJ0aWNsZXMgZGUgV2lraXDDqWRpYSBzb250IHPDqWxlY3Rpb25uw6lzIHBvdXIgdm91cyBldCBzb250IHN1aXZpcyBkJ3VuIHF1aXogdm91cyBwZXJtZXR0YW50IGRlIHRlc3RlciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudS48YnI+RGUgam91ciBlbiBqb3VyIGRlIG5vdXZlbGxlcyBncmFpbmVzIGRlIHNhdm9pciBzb250IGFpbnNpIHNlbcOpZXMgZGFucyB2b3RyZSBcXFwiamFyZGluXFxcIi5cIixcbiAgICBob21lVGl0bGUyOiBcIkxhIGN1bHR1cmUgZW4gbGliZXJ0w6lcIixcbiAgICBob21lUDI6IFwiVG91dCBjb21tZSBzdXIgV2lraXDDqWRpYSAoKiksIGxlIGxvZ2ljaWVsIGV0IGxlIGNvbnRlbnUgcGFydGFnw6kgc3VyIFdpa2lMZXJuaSBzb250IGxpYnJlcy48YnI+Vm91cyBwb3V2ZXogbGVzIHV0aWxpc2VyLCBsZXMgbW9kaWZpZXIgZXQgbGVzIGRpZmZ1c2VyIHNlbG9uIHZvdHJlIHNvdWhhaXQuPGJyPlN1ciBXaWtpTGVybmksIHBhcyBkZSBwdWJsaWNpdMOpLCBuaSBkZSBjb21tZXJjaWFsaXNhdGlvbiBkZSB2b3MgZG9ubsOpZXMgcGVyc29ubmVsbGVzLjxicj5Wb3VzIHBvdXZleiB2ZW5pciB5IFxcXCJjdWx0aXZlciB2b3RyZSBqYXJkaW5cXFwiIGVuIHRvdXRlIHRyYW5xdWlsbGl0w6kuPGJyPjxicj48c21hbGw+PGVtPigqKSBCaWVuIHF1ZSBwYXJ0YWdlYW50IHNlcyB2YWxldXJzLCBXaWtpTGVybmkgZXN0IHVuIHByb2pldCBpbmTDqXBlbmRhbnQgZGUgbGEgZm9uZGF0aW9uIFdpa2lww6lkaWEuPC9lbT48L3NtYWxsPlwiLFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzVGl0bGU6IFwiTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzIHN1ciBXaWtpTGVybmlcIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc0ludHJvOiBcIkxpc3RlIGRlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyBzdXIgV2lraUxlcm5pLlwiLFxuICAgIGV4cGxhbmF0aW9uVGl0bGU6IFwiVm91cyBkw6ljb3V2cmV6IFdpa2lMZXJuaSA/XCIsXG4gICAgZXhwbGFuYXRpb25UeHQ6IFwiTGUgcHJpbmNpcGUgZXN0IHNpbXBsZSA6IHZvdXMgY29tbWVuY2V6IHBhciBsaXJlIGwnYXJ0aWNsZSBXaWtpcMOpZGlhIGRvbnQgbGUgbGllbiB2b3VzIGVzdCBwcm9wb3PDqS48YnI+UHVpcyB2b3VzIGFmZmljaGVyIGxlIHF1aXogcG91ciB2w6lyaWZpZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUgZGUgdm90cmUgbGVjdHVyZS4gVm91cyBvYnRlbmV6IGFsb3JzIHZvdHJlIHLDqXN1bHRhdCBpbW3DqWRpYXRlbWVudC48YnI+PGJyPlRvdXRlcyBsZXMgcsOpcG9uc2VzIHNlIHRyb3V2ZW50IGRhbnMgbCdhcnRpY2xlIHByb3Bvc8OpIMOgIGxhIGxlY3R1cmUuIDxiPlZvdXMgw6p0ZXMgaWNpIHBvdXIgYXBwcmVuZHJlIGRlIG5vdXZlbGxlcyBjaG9zZXM8L2I+LCBtYWlzIGxpYnJlIMOgIHZvdXMgZCdlc3NheWVyIGQneSByw6lwb25kcmUgaW1tw6lkaWF0ZW1lbnQuPGJyPjxicj5RdWFuZCBsZSBzdWpldCBzJ3kgcHLDqnRlLCBuZSB2b3VzIMOpdG9ubmV6IHBhcyBzaSBjZXJ0YWluZXMgZGVzIHLDqXBvbnNlcyBwcm9wb3PDqWVzIHBldXZlbnQgw6p0cmUgdW4gcGV1IGTDqWNhbMOpZXMsIGFic3VyZGVzLi4uIE9uIHBldXQgYXBwcmVuZHJlIGF2ZWMgbGUgc291cmlyZSwgbm9uID8gOi0pPGJyPjxicj5VbmUgZm9pcyB2b3RyZSByw6lzdWx0YXQgb2J0ZW51LCBpbCB2b3VzIHNlcmEgcHJvcG9zw6kgZGUgY3LDqWVyIHVuIGNvbXB0ZSBwb3VyIGxlIHNhdXZlZ2FyZGVyLjxicj5DZSBjb21wdGUgdm91cyBwZXJtZXR0cmEgZGUgdGVzdGVyIGRlIG5vdXZlYXUgY2UgcXVpeiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudSBwbHVzaWV1cnMgam91cnMsIHNlbWFpbmVzLCBtb2lzLi4uIEV0IGRlIHJlY2V2b2lyIHLDqWd1bGnDqHJlbWVudCBkZSBub3V2ZWxsZXMgc3VnZ2VzdGlvbnMgZGUgbGVjdHVyZXMuPGJyPjxicj5NYWlzIDxiPmxhIGNyw6lhdGlvbiBkZSBjZSBjb21wdGUgZXN0IGZhY3VsdGF0aXZlPC9iPiBldCA8YSBocmVmPScvcXVpenMvJyB0aXRsZT0nTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzJz52b3VzIHBvdXZleiBwYXJjb3VyaXIgV2lraUxlcm5pIGxpYnJlbWVudDwvYT4uXCIsXG4gICAgbm9KU05vdGlmaWNhdGlvbjogXCJEw6lzb2zDqSwgbWFpcyBwb3VyIGwnaW5zdGFudCwgbCd1dGlsaXNhdGlvbiBkZSBXaWtpTGVybmkgbsOpY2Vzc2l0ZSBsJ2FjdGl2YXRpb24gZHUgSmF2YVNjcmlwdC5cIixcbn07IiwiLy8gLS0gR0VTVElPTiBERSBMQSBQQUdFIFBFUk1FVFRBTlQgREUgVkFMSURFUiBVTiBDSEFOR0VNRU5UIEQnRU1BSUwgT1UgREUgTU9UIERFIFBBU1NFXG5cbi8vLyBVbiB0b2tlbiBlc3QgdHJhbnNtaXMgZW4gcGFyYW3DqHRyZSBkZSBsJ1VybC4gSWwgYSB1bmUgdmFsaWRpdMOpIGxpbWl0w6kgZGFucyBsZSB0ZW1wcy5cbi8vLyBTaSBsZSB0b2tlbiBlc3Qgb2ssIG9uIHZhbGlkZSBsYSBzdXBwcmVzc2lvbiwgc3VwcHJpbWUgbGEgc2Vzc2lvbiBkZSBsJ3V0aWxpc2F0ZXVyIGV0IGFmZmljaGUgdW4gbWVzc2FnZSBkZSBjb25maXJtYXRpb25cblxuLy8gRmljaGllciBkZSBjb25maWd1cmF0aW9uIGPDtHTDqSBjbGllbnQgOlxuaW1wb3J0IHsgYXBpVXJsLCBhdmFpbGFibGVMYW5ncywgdGhlbWUgfSBmcm9tIFwiLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCI7XG5jb25zdCBsYW5nPWF2YWlsYWJsZUxhbmdzWzBdO1xuY29uc3QgY29uZmlnRnJvbnRFbmQgPSByZXF1aXJlKFwiLi4vLi4vdmlld3MvXCIrdGhlbWUrXCIvY29uZmlnL1wiK2xhbmcrXCIuanNcIik7XG5cbi8vIEltcG9ydGF0aW9uIGRlcyBmb25jdGlvbnMgdXRpbGUgYXUgc2NyaXB0IDpcbmltcG9ydCB7IGdldExvY2FseSwgcmVtb3ZlTG9jYWx5LCBzYXZlTG9jYWx5IH0gZnJvbSBcIi4vdG9vbHMvY2xpZW50c3RvcmFnZS5qc1wiO1xuaW1wb3J0IHsgYWRkRWxlbWVudCB9IGZyb20gXCIuL3Rvb2xzL2RvbS5qc1wiO1xuaW1wb3J0IHsgaGVsbG9EZXYgfSBmcm9tIFwiLi90b29scy9ldmVyeXdoZXJlLmpzXCI7XG5pbXBvcnQgeyBnZXRVcmxQYXJhbXMgfSBmcm9tIFwiLi90b29scy91cmwuanNcIjtcbmltcG9ydCB7IGNoZWNrU2Vzc2lvbiwgZ2V0Q29uZmlnLCBzZXRTZXNzaW9uIH0gZnJvbSBcIi4vdG9vbHMvdXNlcnMuanNcIjtcblxuLy8gRGljdGlvbm5haXJlcyA6XG5jb25zdCB0eHQgPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL2dlbmVyYWxcIik7XG5jb25zdCB0eHRVc2VycyA9IHJlcXVpcmUoXCIuLi8uLi9sYW5nL1wiK2xhbmcrXCIvdXNlclwiKTtcblxuY29uc3QgZGl2UmVzcG9uc2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJlc3BvbnNlXCIpO1xuXG5oZWxsb0RldigpO1xuXG5sZXQgY29uZmlnO1xuY29uc3QgaW5pdGlhbGlzZSA9IGFzeW5jICgpID0+XG57XG4gICAgdHJ5XG4gICAge1xuICAgICAgICBjb25maWcgPSBhd2FpdCBnZXRDb25maWcoKTtcbiAgICAgICAgaWYoIWNvbmZpZylcbiAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHQuc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgZWxzZVxuICAgICAgICB7ICAgICAgXG4gICAgICAgICAgICBjb25zdCBkYXRhcz1nZXRVcmxQYXJhbXMoKTtcbiAgICAgICAgICAgIGlmKGRhdGFzICYmIGRhdGFzLnQhPT11bmRlZmluZWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgYXBpVXJsK2NvbmZpZy51c2VyUm91dGVzK2NvbmZpZy5jaGVja0RlbGV0ZUxpbmtSb3V0ZStkYXRhcy50KTtcbiAgICAgICAgICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCAmJiByZXNwb25zZS5tZXNzYWdlICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgcmVzcG9uc2UubWVzc2FnZSwgXCJcIiwgW1wic3VjY2Vzc1wiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuc3RhdHVzID09PSA0MDAgJiYgcmVzcG9uc2UuZXJyb3JzICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShyZXNwb25zZS5lcnJvcnMpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvcnMgPSByZXNwb25zZS5lcnJvcnMuam9pbihcIjxicj5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvcnMgPSB0eHQuc2VydmVyRXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHJlc3BvbnNlLmVycm9ycywgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHRVc2Vycy5iYWRMaW5rVmFsaWRhdGlvbk1lc3NhZ2UucmVwbGFjZShcIiNVUkxcIiwgY29uZmlnRnJvbnRFbmQuYWNjb3VudFBhZ2UpLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK2RhdGFzLnQpOyBcbiAgICAgICAgICAgICAgICB4aHIuc2VuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoKGUpXG4gICAge1xuICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgdHh0LnNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgfVxufVxuaW5pdGlhbGlzZSgpOyIsIi8vIEZPTkNUSU9OUyBVVElMRVMgQVUgU1RPQ0tBR0UgTE9DQUwgKFNFU1NJT04sIENPT0tJRVMsIElOREVYREIsIEVUQy4pXG4vLyBSZXZlbmlyIHBvdXIgZ8OpcmVyIGxlIGNhcyBvw7kgbG9jYWwuc3RvcmFnZSBuJ2VzdCBwYXMgY29ubnUgcG91ciB1dGlsaXNlciBjb29raWVcbiAgICBcbmV4cG9ydCBjb25zdCBzYXZlTG9jYWx5ID0gKG5hbWUsIGRhdGEpID0+XG57XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obmFtZSwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0TG9jYWx5ID0gKG5hbWUsIGpzb249ZmFsc2UpID0+XG57XG4gICAgaWYoanNvbilcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSkpO1xuICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKG5hbWUpO1xufVxuXG5leHBvcnQgY29uc3QgcmVtb3ZlTG9jYWx5ID0gKG5hbWUpID0+XG57XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0obmFtZSk7XG59IiwiaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIEZvbmN0aW9uIGFzc29jaWFudCBsZXMgYXR0cmlidXRzIGZvdXJuaXMgw6AgdW4gY2hhbXAgZGUgZm9ybXVsYWlyZVxuZXhwb3J0IGNvbnN0IGFkZEVsZW1lbnQgPSAoZWx0UGFyZW50LCBlbHRUeXBlLCBlbHRDb250ZW50PVwiXCIsIGVsdElkPVwiXCIsIGVsdENsYXNzPVtdLCBlbHRBdHRyaWJ1dGVzPXt9LCByZXBsYWNlPXRydWUpID0+XG57XG4gICAgaWYoaXNFbXB0eShlbHRUeXBlKSB8fCBpc0VtcHR5KGVsdFBhcmVudCkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBlbHNlXG4gICAge1xuICAgICAgICBjb25zdCBuZXdFbGVtZW50PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZWx0VHlwZSk7XG4gICAgICAgIFxuICAgICAgICBpZighaXNFbXB0eShlbHRJZCkpLy8gdGVzdGVyIHNpIGwnaWQgbidlc3QgcGFzIGTDqWrDoCB1dGlsaXPDqSBkYW5zIGxlIERPTSA/XG4gICAgICAgICAgICBuZXdFbGVtZW50LmlkPWVsdElkO1xuXG4gICAgICAgIGlmKEFycmF5LmlzQXJyYXkoZWx0Q2xhc3MpICYmIGVsdENsYXNzLmxlbmd0aCE9MClcbiAgICAgICAge1xuICAgICAgICAgICAgZm9yKGxldCBpIGluIGVsdENsYXNzKVxuICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuY2xhc3NMaXN0LmFkZChlbHRDbGFzc1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZih0eXBlb2YgZWx0QXR0cmlidXRlcyA9PT0gXCJvYmplY3RcIikgLy8gISEgdG91cyBsZXMgb2JqZXRzIG5lIHNvbnQgcGFzIG9rXG4gICAgICAgIHtcbiAgICAgICAgICAgIGZvcihsZXQgYXR0cmlidXROYW1lIGluIGVsdEF0dHJpYnV0ZXMpXG4gICAgICAgICAgICAgICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmlidXROYW1lLCBlbHRBdHRyaWJ1dGVzW2F0dHJpYnV0TmFtZV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoIWlzRW1wdHkoZWx0Q29udGVudCkpXG4gICAgICAgICAgICBuZXdFbGVtZW50LmlubmVySFRNTD1lbHRDb250ZW50LnJlcGxhY2UoL1xcbi9nLFwiPGJyPlwiKTsvLyBpbm5lckhUTUwgcGVybWV0IGQnYWpvdXRlciBkdSB0ZXh0ZSBheWFudCBsdWktbcOqbWUgZGVzIGJhbGlzZXMsIGV0Yy5cbiAgICAgICAgICAgIFxuICAgICAgICBpZihyZXBsYWNlKVxuICAgICAgICAgICAgZWx0UGFyZW50LmlubmVySFRNTD1cIlwiO1xuICAgICAgICBlbHRQYXJlbnQuYXBwZW5kQ2hpbGQobmV3RWxlbWVudCk7XG4gICAgfSAgICBcbn0iLCIvLyBDZSBzY3JpcHQgZm91cm5pdCBkZXMgZm9uY3Rpb25zIHV0aWxpc8OpZXMgc3VyIHRvdXRlcyBsZXMgcGFnZXMgZHUgc2l0ZVxuXG5leHBvcnQgY29uc3QgaGVsbG9EZXYgPSAoKSA9Plxue1xuICAgIGNvbnNvbGUubG9nKFwiKioqKiBIZWxsbyBhbWkgZMOpdmVsb3BwZXVyIDotKVxcbiBMZSBjb2RlIGRlIFdpa2lMZXJuaSBlc3QgbGlicmUgZXQgZXN0IGxpc2libGUgc3VyIGdpdGxhYiA6IFxcbiBCb25uZSBsZWN0dXJlIDotKSBcXG4gUG91ciBsZXMgc3VnZ2VzdGlvbnMgZCdhbcOpbGlvcmF0aW9uIG91IHF1ZXN0aW9ucyA6IGRldkB3aWxpbGVybmkuY29tICoqKipcIik7XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVBY2NvdW50TGluayA9IChzdGF0dXMsIGNvbmZpZ1RlbXBsYXRlKSA9Plxue1xuICAgIGNvbnN0IGxpbms9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJhY2NvdW50SGVhZExpbmtcIik7XG4gICAgY29uc3QgaG9tZVBhZ2U9c3RhdHVzK1wiSG9tZVBhZ2VcIjtcbiAgICBsaW5rLmhyZWY9XCIvXCIrY29uZmlnVGVtcGxhdGVbaG9tZVBhZ2VdO1xufSIsImltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG4vLyBGb25jdGlvbiByw6ljdXDDqXJhbnQgbGVzIHBhcmFtw6h0cmVzIHBhc3PDqXMgcGFyIGwndXJsXG5leHBvcnQgY29uc3QgZ2V0VXJsUGFyYW1zID0gKCkgPT5cbntcbiAgICBpZihpc0VtcHR5KGxvY2F0aW9uLnNlYXJjaCkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBsb2NhdGlvbi5zZWFyY2guc3Vic3RyaW5nKDEpLnNwbGl0KFwiJlwiKTtcbiAgICBpZighQXJyYXkuaXNBcnJheShwYXJhbWV0ZXJzKSB8fCBwYXJhbWV0ZXJzLmxlbmd0aD09PTApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgXG4gICAgbGV0IHBhcmFtLCBkYXRhcz17fTtcbiAgICBmb3IobGV0IGkgaW4gcGFyYW1ldGVycylcbiAgICB7XG4gICAgICAgIHBhcmFtID0gcGFyYW1ldGVyc1tpXS5zcGxpdChcIj1cIik7XG4gICAgICAgIGlmKHBhcmFtLmxlbmd0aD09PTIpXG4gICAgICAgICAgICBkYXRhc1twYXJhbVswXV09ZGVjb2RlVVJJKHBhcmFtWzFdKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGFzO1xufSIsImltcG9ydCB7IGFwaVVybCwgYXZhaWxhYmxlTGFuZ3MsIHNpdGVVcmwsIHRoZW1lIH0gZnJvbSBcIi4uLy4uLy4uL2NvbmZpZy9pbnN0YW5jZS5qc1wiO1xuY29uc3QgbGFuZz1hdmFpbGFibGVMYW5nc1swXTtcblxuY29uc3QgY29uZmlnVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vLi4vLi4vdmlld3MvXCIrdGhlbWUrXCIvY29uZmlnL1wiK2xhbmcrXCIuanNcIik7XG5pbXBvcnQgeyAgY2hlY2tMb2dpblJvdXRlLCB0aW1lRGlmZmVyZW5jZU1heCwgdGltZURpZmZlcmVuY2VNaW4sIHVzZXJSb3V0ZXMgfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnL3VzZXJzLmpzXCI7XG5cbmltcG9ydCB7IGdldExvY2FseSwgcmVtb3ZlTG9jYWx5LCBzYXZlTG9jYWx5IH0gZnJvbSBcIi4vY2xpZW50c3RvcmFnZS5qc1wiO1xuaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIFLDqWN1cMOocmUgbGVzIGRvbm7DqWVzIGRlIGNvbmZpZ3VyYXRpb24gZGVzIHV0aWxpc2F0ZXVyc1xuLy8gw4AgdGVybWUsIHVuIGZpY2hpZXIgc3RhdGlxdWUgaW1wb3J0YWJsZSBjb21tZSBtb2R1bGUgZGV2cmFpdCDDqXZpdGVyIHVuZSByZXF1w6p0ZSBhamF4XG5leHBvcnQgY29uc3QgZ2V0Q29uZmlnID0gIGFzeW5jICgpID0+XG57XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+XG4gICAge1xuICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgYXBpVXJsK1wiL3VzZXIvZ2V0Y29uZmlnXCIpO1xuICAgICAgICB4aHIub25sb2FkID0gKCkgPT4gcmVzb2x2ZShKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpKTtcbiAgICAgICAgeGhyLm9uZXJyb3IgPSAoKSA9PiByZWplY3QoeGhyLnN0YXR1c1RleHQpO1xuICAgICAgICB4aHIuc2VuZCgpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0VGltZURpZmZlcmVuY2UgPSAoKSA9Plxue1xuICAgIGNvbnN0IHRpbWVMb2NhbD1uZXcgRGF0ZSgpLmdldFRpbWV6b25lT2Zmc2V0KCk7XG4gICAgaWYodGltZUxvY2FsID4gdGltZURpZmZlcmVuY2VNYXggfHwgdGltZUxvY2FsIDwgdGltZURpZmZlcmVuY2VNaW4pXG4gICAgICAgIHJldHVybiAwO1xuICAgIGVsc2UgcmV0dXJuIHRpbWVMb2NhbDtcbn1cblxuLy8gT24gZW5sw6h2ZSB2b2xvbnRhaXJlbWVudCBsZXMgMC9PIHBvdXIgw6l2aXRlciBsZXMgY29uZnVzaW9ucyAhXG4vLyBFdCBtaWV1eCB2YXV0IGF1c3NpIGTDqWJ1dGVyIGV0IGZpbmlyIHBhciB1bmUgbGV0dHJlIHNpbXBsZS5cbmV4cG9ydCBjb25zdCBnZXRQYXNzd29yZCA9IChuYkNhck1pbiwgbmJDYXJNYXgpID0+XG57XG4gICAgY29uc3QgbmJDYXI9bmJDYXJNaW4rTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKihuYkNhck1heC1uYkNhck1pbikpO1xuICAgIGNvbnN0IGxldHRlcnM9XCJBQkNERUZHSElKS0xNTlBRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5wcXJzdHV2d3h5elwiO1xuICAgIGNvbnN0IG90aGVycz1cIjEyMzQ1Njc4OSE/LiotXyVAJsOJw4DDiMOZ4oKsJMOCw4rDm8OOXCI7XG4gICAgbGV0IHBhc3N3b3JkPWxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxldHRlcnMubGVuZ3RoKV07XG4gICAgZm9yKGxldCBpPTE7aTwobmJDYXItMSk7aSsrKVxuICAgIHtcbiAgICAgICAgaWYoKGkgJSAyKSA9PT0xKVxuICAgICAgICAgICAgcGFzc3dvcmQrPW90aGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqb3RoZXJzLmxlbmd0aCldO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBwYXNzd29yZCs9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTsgICBcbiAgICB9XG4gICAgcGFzc3dvcmQrPWxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxldHRlcnMubGVuZ3RoKV07XG4gICAgcmV0dXJuIHBhc3N3b3JkO1xufVxuXG4vLyBKJ3V0aWxpc2UgbGUgc3RvY2thZ2UgbG9jYWwgZHUgbmF2aWdhdGV1ciBwb3VyIGVucmVnaXN0cmVyIGxlcyBkb25uw6llcyBwZXJtZXR0YW50IGRlIHJlY29ubmHDrnRyZSBsJ3V0aWxpc2F0ZXVyIHBhciBsYSBzdWl0ZVxuLy8gU2V1bCBsZSBzZXJ2ZXVyIHBvdXJyYSB2w6lyaWZpZXIgcXVlIGxlcyBpZGVudGlmaWFudHMgc29udCAodG91am91cnMpIHZhbGlkZXMuXG5leHBvcnQgY29uc3Qgc2V0U2Vzc2lvbiA9ICh1c2VySWQsIHRva2VuLCBkdXJhdGlvblRTKSA9Plxue1xuICAgIGNvbnN0IHN0b3JhZ2VVc2VyPVxuICAgIHtcbiAgICAgICAgaWQ6IHVzZXJJZCxcbiAgICAgICAgdG9rZW46IHRva2VuLFxuICAgICAgICBkdXJhdGlvbjogZHVyYXRpb25UU1xuICAgIH1cbiAgICBzYXZlTG9jYWx5KFwidXNlclwiLCBzdG9yYWdlVXNlcik7XG59XG5cbi8vIFbDqXJpZmllIHF1J2lsIHkgYSBkZXMgZG9ubsOpZXMgbG9jYWxlcyBjb25jZXJuYW50IGxlIHLDqXN1bHRhdCBkJ3VuIHF1aXpcbi8vIEV0IGxlcyBham91dGUgYXV4IGRvbm7DqWVzIGVudm95w6llcyBwYXIgbGVzIGZvcm11bGFpcmVzIGQnaW5zY3JpcHRpb24vY29ubmV4aW9uIHNpIGMnZXN0IGxlIGNhc1xuZXhwb3J0IGNvbnN0IGNoZWNrQW5zd2VyRGF0YXMgPSAoZGF0YXMpID0+XG57XG4gICAgY29uc3QgbGFzdEFuc3dlcj1nZXRMb2NhbHkoXCJsYXN0QW5zd2VyXCIpO1xuICAgIGlmKCFpc0VtcHR5KGxhc3RBbnN3ZXIpKVxuICAgIHtcbiAgICAgICAgY29uc3QgYW5zd2VyPUpTT04ucGFyc2UobGFzdEFuc3dlcik7XG4gICAgICAgIGlmKCFpc0VtcHR5KGFuc3dlci5kdXJhdGlvbikgJiYgIWlzRW1wdHkoYW5zd2VyLm5iQ29ycmVjdEFuc3dlcnMpICYmICFpc0VtcHR5KGFuc3dlci5RdWVzdGlvbm5haXJlSWQpICYmICFpc0VtcHR5KGFuc3dlci5uYlF1ZXN0aW9ucykpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRhdGFzLmR1cmF0aW9uPWFuc3dlci5kdXJhdGlvbjtcbiAgICAgICAgICAgIGRhdGFzLm5iQ29ycmVjdEFuc3dlcnM9YW5zd2VyLm5iQ29ycmVjdEFuc3dlcnM7XG4gICAgICAgICAgICBkYXRhcy5RdWVzdGlvbm5haXJlSWQ9YW5zd2VyLlF1ZXN0aW9ubmFpcmVJZDtcbiAgICAgICAgICAgIGRhdGFzLm5iUXVlc3Rpb25zPWFuc3dlci5uYlF1ZXN0aW9ucztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YXM7XG59XG5cbi8vIENldHRlIGZvbmN0aW9uIHRlc3RlIGxhIGNvbm5leGlvbiBkZSBsJ3V0aWxpc2F0ZXVyIGQndW5lIHBhZ2Vcbi8vIE9uIHBldXQgZm91cm5pcyB1bmUgbGlzdGUgZGUgc3RhdHV0cyBhY2NlcHTDqXMgKHNpIHZpZGUgPSB0b3VzKSwgYWluc2kgcXUndW5lIHVybCBkZSByZWRpcmVjdGlvbiBzaSBub24gY29ubmVjdMOpLCB1biBtZXNzYWdlIGQnZXJyZXVyIMOgIGFmZmljaGVyIHN1ciBsYSBwYWdlIGRlIGRlc3RpbmF0aW9uIGV0IGwndXJsIHN1ciBsYXF1ZWxsZSByZXZlbmlyIHVuZSBmb2lzIGNvbm5lY3TDqVxuZXhwb3J0IGNvbnN0IGNoZWNrU2Vzc2lvbiA9IGFzeW5jIChzdGF0dXM9W10sIHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpID0+XG57XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+XG4gICAge1xuICAgICAgICBjb25zdCB1c2VyRGF0YXM9Z2V0TG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgaWYoaXNFbXB0eSh1c2VyRGF0YXMpKVxuICAgICAgICB7XG4gICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHVzZXI9SlNPTi5wYXJzZSh1c2VyRGF0YXMpO1xuICAgICAgICAgICAgaWYoaXNFbXB0eSh1c2VyLmlkKSB8fMKgaXNFbXB0eSh1c2VyLnRva2VuKSB8fCBpc0VtcHR5KHVzZXIuZHVyYXRpb24pIHx8IHVzZXIuZHVyYXRpb24gPCBEYXRlLm5vdygpKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgIHhoci5vcGVuKFwiR0VUXCIsIGFwaVVybCt1c2VyUm91dGVzK2NoZWNrTG9naW5Sb3V0ZSt1c2VyLnRva2VuKTtcbiAgICAgICAgICAgICAgICB4aHIub25sb2FkID0gKCkgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwICYmIHJlc3BvbnNlLmlzVmFsaWQgJiYgcmVzcG9uc2UuaWQgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5pZD09PXVzZXIuaWQpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5uYW1lPXJlc3BvbnNlLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5sYW5ndWFnZT1yZXNwb25zZS5sYW5ndWFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnRpbWVEaWZmZXJlbmNlPXJlc3BvbnNlLnRpbWVEaWZmZXJlbmNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIuc3RhdHVzPXJlc3BvbnNlLnN0YXR1czsvLyBsZSB0b2tlbiBldCBkZSB0b3V0ZSBmYcOnb24gdsOpcmlmaWVyIMOgIGNoYXF1ZSByZXF1w6p0ZSDDoCBsJ0FQSVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVMb2NhbHkoXCJ1c2VyXCIsIHVzZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpIGlsIHMnYWdpdCBkJ3VuIFwidXNlclwiIGV0IHF1ZSBzb24gYWJvbm5lbWVudCBhIGV4cGlyw6ksIGplIGxlIHJlZGlyaWdlIHZlcnMgbGEgY2Fpc3NlIDotKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLnN0YXR1cz09PVwidXNlclwiICYmIHJlc3BvbnNlLm5iRGF5c09rIDw9IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cmxBY2NvdW50PXNpdGVVcmwrXCIvXCIrY29uZmlnVGVtcGxhdGVbbGFuZ10uYWNjb3VudFBhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YodXJsQWNjb3VudCk9PT0tMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIvXCIrY29uZmlnVGVtcGxhdGVbbGFuZ10uYWNjb3VudFBhZ2UpOy8vIHBhc3PDqWUgZGlyZWN0ZW1lbnQgaWNpLCBsJ2FuY3JlICNzdWJzY3JpYmUgbmUgZm9uY3Rpb25uZSBwYXMgIT9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RhdHVzLmxlbmd0aCE9PTAgJiYgc3RhdHVzLmluZGV4T2YocmVzcG9uc2Uuc3RhdHVzKT09PS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB4aHIub25lcnJvciA9ICgpID0+IHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICAgICAgICAgICAgeGhyLnNlbmQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuLy8gQ2V0dGUgZm9uY3Rpb24gc2VydCDDoCBsYSBwcsOpY8OpZGVudGUgZW4gY2FzIGRlIGNvbm5leGlvbiBub24gdmFsaWRlXG5jb25zdCByZWRpcmVjdFVzZXIgPSAodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCkgPT5cbntcbiAgICBpZighaXNFbXB0eShtZXNzYWdlKSlcbiAgICAgICAgc2F2ZUxvY2FseShcIm1lc3NhZ2VcIiwgbWVzc2FnZSk7XG4gICAgaWYoIWlzRW1wdHkodXJsV2FudGVkKSlcbiAgICAgICAgc2F2ZUxvY2FseShcInVybFwiLCB1cmxXYW50ZWQpO1xuICAgIGlmKCFpc0VtcHR5KHVybFJlZGlyZWN0aW9uKSlcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbih1cmxSZWRpcmVjdGlvbik7XG59Il0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/front/public/JS/homeManager.app.js b/front/public/JS/homeManager.app.js new file mode 100644 index 0000000..66cca7d --- /dev/null +++ b/front/public/JS/homeManager.app.js @@ -0,0 +1,1278 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "./src/homeManager.js"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "../config/instance.js": +/*!*****************************!*\ + !*** ../config/instance.js ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var _module$exports; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var users = __webpack_require__(/*! ./users */ "../config/users.js"); + +var questionnaires = __webpack_require__(/*! ./questionnaires */ "../config/questionnaires.js"); + +module.exports = (_module$exports = { + apiUrl: "http://localhost:3000/api", + siteUrl: "http://localhost:8080", + adminName: "Fabrice", + adminEmail: "dev@wikilerni.com", + senderName: "WikiLerni", + senderEmail: "bonjour@wikilerni.com", + adminLang: "fr", + theme: "default", + // le thème utilisé (dans /views) pour générer les pages HTML. Contient ses propres fichiers de configuration. + availableLangs: ["fr"], + // Languages in which the site is available. The first one is the default one. + siteName: "WikiLerni", + beginCodeGodfather: "wikilerni", + // case-sensitive and can't contain "@" ! + cronTimingAlertInSeconde: 120, + // for logs + responseTimingAlertInSeconde: 3, + // idem + tokenSignupValidationTimeInHours: "48h", + // https://github.com/zeit/ms + tokenLoginLinkTimeInHours: "1h", + tokenConnexionMinTimeInHours: "24h", + tokenConnexionMaxTimeInDays: "180 days", + tokenLoginChangingTimeInHours: "1h", + // for email & password changing + tokenDeleteUserTimeInHours: "1h", + tokenUnsubscribeLinkTimeInDays: "7 days", + // token send with subscription's emails + freeAccountTimingInDays: 10, + freeAccountExpirationNotificationInDays: 5, + accountExpirationFirstNotificationInDays: 14, + accountExpirationSecondNotificationInDays: 5, + inactiveAccountTimeToDeleteInDays: 180, + // Questionnaires: + nbQuestionsMin: 1, + // minimum number of questions for the questionnaire to be publishable + nbQuestionsMax: 10, + // if 0 = not maximum + nbChoicesMax: 10, + nbNewQuestionnaires: 10, + // for RSS, etc. + hourGiveNewQuestionnaireBegin: 1, + // in user local time + hourGiveNewQuestionnaireEnd: 24, + // idem + numberNewQuestionnaireAtSameTime: 50, + // for mass mailing + minSearchQuestionnaires: 3, + // Illustrations: + nbIllustrationsMin: 0, + nbIllustrationsMax: 1, + maxIllustrationSizeinOctet: 1000000, + // pas contrôlé pour l'instant. À revoir. + mimeTypesForIllustration: ["image/jpg", "image/jpeg", "image/png", "image/gif", "image/png"], + // -- Upload and resize: + illustrationsWidthMaxInPx: 400, + illustrationsMiniaturesWidthMaxInPx: 200, + // Links: + nbLinksMin: 1, + nbLinksMax: 1 +}, _defineProperty(_module$exports, "nbQuestionsMin", questionnaires.nbQuestionsMin), _defineProperty(_module$exports, "nbQuestionsMax", questionnaires.nbQuestionsMax), _defineProperty(_module$exports, "nbChoicesMax", questionnaires.nbChoicesMax), _defineProperty(_module$exports, "passwordMinLength", users.password.minlength), _defineProperty(_module$exports, "dirCacheUsers", users.dirCacheUsers), _defineProperty(_module$exports, "dirCacheUsersAnswers", users.dirCacheUsersAnswers), _defineProperty(_module$exports, "dirCacheQuestionnaires", questionnaires.dirCacheQuestionnaires), _defineProperty(_module$exports, "dirCacheQuestions", questionnaires.dirCacheQuestions), _defineProperty(_module$exports, "dirCacheUsersQuestionnaires", questionnaires.dirCacheUsersQuestionnaires), _defineProperty(_module$exports, "dirHTMLQuestionnaire", questionnaires.dirHTMLQuestionnaire), _defineProperty(_module$exports, "dirWebQuestionnaire", questionnaires.dirWebQuestionnaire), _module$exports); + +/***/ }), + +/***/ "../config/questionnaires.js": +/*!***********************************!*\ + !*** ../config/questionnaires.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + // API'routes (after "apiUrl" defined in instance.js) + questionnaireRoutes: "/questionnaire", + getQuestionnaireRoutes: "/get", + previewQuestionnaireRoutes: "/preview", + publishedQuestionnaireRoutes: "/quiz/", + saveAnswersRoute: "/answer/", + getStatsQuestionnaires: "/stats/", + searchQuestionnairesRoute: "/search", + searchAdminQuestionnairesRoute: "/searchadmin", + getListNextQuestionnaires: "/getlistnextquestionnaires/", + // -- questions & choices : + questionsRoute: "/question/", + // -- tags : + tagsSearchRoute: "/tags/search/", + // -- answers : + getQuestionnairesWithoutAnswer: "/withoutanswer/user/", + getPreviousAnswers: "/user/answers/", + getStatsAnswers: "/user/anwswers/stats/", + getAdminStats: "/getadminstats/", + // forms : à compléter avec valeurs par défaut, etc. cf modèle + Questionnaire: { + title: { + maxlength: 255, + required: true + }, + slug: { + maxlength: 150 + }, + // champ requis mais calculé à partir du titre qd vide + introduction: { + required: true + } + }, + searchQuestionnaires: { + minlength: 3, + required: true + }, + Question: { + text: { + maxlength: 255, + required: true + }, + rank: { + required: true, + min: 1, + defaultValue: 1 + } + }, + Choice: { + text: { + maxlength: 255, + required: true + } + }, + nbQuestionsMin: 1, + nbQuestionsMax: 10, + nbChoicesMax: 10, + nbTagsMin: 0, + nbTagsMax: 0, + // 0 = not max + // JSON and HTML dir + dirCacheQuestionnaires: "datas/questionnaires", + dirCacheQuestions: "datas/questionnaires/questions", + dirCacheUsersQuestionnaires: "datas/users/questionnaires", + dirCacheTags: "datas/questionnaires/tags", + dirHTMLQuestionnaire: "front/public/quiz", + dirHTMLTags: "front/public/quizs", + dirWebQuestionnaire: "quiz", + //pour url page + dirWebTags: "quizs" // idem + +}; + +/***/ }), + +/***/ "../config/users.js": +/*!**************************!*\ + !*** ../config/users.js ***! + \**************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + // API'routes (after "apiUrl" defined in instance.js) + userRoutes: "/user", + subscribeRoute: "/signup", + getGodfatherRoute: "/getgodfatherid", + checkIfIsEmailfreeRoute: "/isemailfree", + checkSubscribeTokenRoute: "/validation/", + checkLoginRoute: "/checklogin/", + connectionRoute: "/login", + getLoginLinkRoute: "/getloginlink", + connectionWithLinkRoute: "/checkloginlink", + getUserInfos: "/get/", + createUserRoute: "/create", + validateUserRoute: "/validate/", + updateUserInfos: "/modify/", + searchUserRoute: "/search/", + getGodChilds: "/getgodchilds/", + checkNewLoginLinkRoute: "/confirmnewlogin/", + checkDeleteLinkRoute: "/confirmdelete/", + getPayments: "/payment/getforoneuser/", + unsubscribeRoute: "/subscription/stop/", + getAdminStats: "/getadminstats/", + // forms : à compléter avec valeurs par défaut, etc. cf modèle + name: { + maxlength: 70, + required: true + }, + email: { + maxlength: 255, + required: true + }, + password: { + minlength: 8, + maxlength: 72, + required: true + }, + // https://www.npmjs.com/package/bcrypt#security-issues-and-concerns + newPassword: { + minlength: 8, + maxlength: 72 + }, + codeGodfather: { + maxlength: 255 + }, + cguOk: { + value: "true", + required: true + }, + timeDifferenceMin: -720, + timeDifferenceMax: 840, + // JSON dir + dirCacheUsers: "datas/users", + dirCacheUsersAnswers: "datas/users/questionnaires/answers" +}; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/general$": +/*!**************************************!*\ + !*** ../lang sync ^\.\/.*\/general$ ***! + \**************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/general": "../lang/fr/general.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/general$"; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/questionnaire$": +/*!********************************************!*\ + !*** ../lang sync ^\.\/.*\/questionnaire$ ***! + \********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/questionnaire": "../lang/fr/questionnaire.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/questionnaire$"; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/user$": +/*!***********************************!*\ + !*** ../lang sync ^\.\/.*\/user$ ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/user": "../lang/fr/user.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/user$"; + +/***/ }), + +/***/ "../lang/fr/general.js": +/*!*****************************!*\ + !*** ../lang/fr/general.js ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + siteHTMLTitle: "WikiLerni : qu'allez-vous apprendre aujourd'hui ?", + siteMetaDescription: "Chaque jour, testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.", + scriptTimingInfo: "Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", + scriptTimingAlert: "*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", + serverError: "Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.", + serverErrorAdmin: "Bug de l'application :", + neededParams: "Des paramètres nécessaires manquants sont manquants.", + badUrl: "Tentative d'accès à une page n'existant pas :", + notValidFormat: "Format non valide.", + notAllowed: "Vous n'avez pas les droits nécessaires pour cette action.", + notRequired: "Facultatif.", + updateBtnTxt: "Modifier", + addBtnTxt: "Ajouter", + deleteBtnTxt: "Supprimer", + addOkMessage: "Les données ont bien été enregistrées.", + updateOkMessage: "La mise à jour à jour a bien été enregistrée.", + deleteOkMessage: "La suppression a bien été enregistrée.", + failAuth: "Erreur d'authentification.", + failAuthHeader: "Absence de header Authorization.", + failAuthToken: "Token invalide ou utilisateur non trouvé.", + failAuthId: "Identifiant non valide : ", + failAuthCron: "Tentative de lancement d'un cron sans le bon token.", + previousPage: "Page précédente", + nextPage: "Page suivante", + btnLinkToQuestionnaire: "Aller au quiz !", + statsAdmin: "Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium." +}; + +/***/ }), + +/***/ "../lang/fr/questionnaire.js": +/*!***********************************!*\ + !*** ../lang/fr/questionnaire.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + needTitle: "Merci de fournir un titre à votre quiz.", + needNotTooLongTitle: "Le titre du quiz ne doit pas compter plus de 255 caractères.", + needUrl: "Merci de fournir l'url à votre quiz.", + needUniqueUrl: "L'url du quiz doit être unique.", + needIntroduction: "Merci de fournir un texte d'introduction à votre quiz.", + needCorrectPublishingDate: "La date de publication fournie n'a pas un format valide.", + needKnowIfIsPublished: "Il faut savoir si ce quiz est publié.", + needLanguage: "Vous devez sélectionner la langue de ce quiz.", + needEstimatedTime: "Merci de sélectionner une estimation de la durée de ce quiz.", + notFound: "Aucun quiz n'a pas été trouvé.", + searchResultTitle: "Résultat pour votre recherche", + searchNoResult: "Aucun résultat n'a été trouvé pour votre recherche", + searchWithResult: "#NB quizs correspondent à votre recherche :", + publishedBy: "Publié par", + publishedAt: ", le", + lastUpdated: "Dernière mise à jour, le ", + estimatedTime: "Durée de lecture estimée : ", + btnSendResponse: "Envoyez vos réponses", + btnProposeSubscribe: "Ok, je crée mon compte !", + btnProposeConnection: "J'ai déjà un compte, je me connecte.", + btnShowQuestionnaire: "Afficher le quiz !", + nextQuestionnairesList: "Les #NB prochains quizs devant être publiés", + needBeCompleted: "Quiz incomplet", + nextDateWithoutQuestionnaire: "Prochaine date sans quiz programmé : ", + haveBeenPublished: ":NB nouveaux questionnaires ont été publiés." +}; + +/***/ }), + +/***/ "../lang/fr/user.js": +/*!**************************!*\ + !*** ../lang/fr/user.js ***! + \**************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + notFound: "L'utilisateur n'a pas été trouvé.", + needName: "Merci de choisir un nom d'utilisateur.", + needNotTooLongName: "Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.", + needEmail: "Merci de saisir votre adresse e-mail.", + needUniqueEmail: "L'adresse e-mail que vous avez saisie est déjà utilisée par un autre utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.", + needNotTooLongEmail: "Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.", + needPassWord: "Merci de fournir un mot de passe.", + needLongPassWord: "Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.", + passwordCopied: "Le mot de passe généré a été copié dans le presse-papier. Vous pouvez le recopier où vous le souhaiter.", + needStatus: "Il manque le statut.", + needLanguage: "Il manque le code langue.", + needValidLastConnectionDate: "La date de dernière connexion n'est pas valide.", + needSMTP: "Il manque le serveur SMTP.", + needSMTPNotFound: "Il manque le serveur SMTP.", + needKnowNewsletterOk: "Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.", + needTimeDifference: "Il faut connaître le nombre de minutes du décalage horaire.", + needMinTimeDifference: "Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.", + needMaxTimeDifference: "Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.", + needUGCOk: "Vous devez accepter les CGU pour pouvoir créer votre compte. ", + godfatherNotFound: "Aucun utilisateur valide trouvé pour ce code parrain.", + godfatherFound: "Votre parrain a bien été trouvé !", + mailValidationMessage: "Votre inscription est bien enregistrée.\nPour la finaliser, merci de cliquer dans les 24H sur le lien de confirmation qui vient de vous être envoyé par e-mail.", + mailValidationLinkSubject: "Merci de valider votre compte", + mailValidationLinkSBodyTxt: "Bonjour USER_NAME,\n\nPour valider votre compte, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL", + mailValidationLinkSBodyHTML: "

Bonjour USER_NAME,

Pour valider votre compte, merci de cliquer sur le lien suivant dans les 24h.

Valider.

", + validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue !
Vous pouvez sans tarder vous connecter ci-dessous pour accéder à votre compte.", + validationMessageAdmin: "Le compte a bien été validé.", + validationAlreadyMessage: "Il semble que vous ayez déjà validé votre compte.", + validationAlreadyMessageAdmin: "Ce compte a déjà été validé.", + mailWelcomeSubject: "Bienvenue !", + mailWelcomeBodyTxt: "Bonjour USER_NAME,\nVotre venez de valider votre inscription à NOM_SITE.\nMerci et à bientôt !", + mailWelcomeBodyHTML: "

Bonjour USER_NAME,

Votre venez de valider votre inscription à NOM_SITE.

Merci et à bientôt !

", + mailThankGodfatherSubject: "Merci !", + mailThankGodfatherBodyTxt: "Bonjour USER_NAME,\nGrâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nMerci et à bientôt !", + mailThankGodfatherBodyHTML: "

Bonjour USER_NAME,

Grâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.

Merci et à bientôt !

", + badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.", + emailNotFound: "Aucun utilisateur trouvé pour cette adresse e-mail.", + alreadyConnected: "Vous êtes déjà connecté(e) au site !", + needBeConnected: "Vous devez être connecté(e) pour accéder à cette page.", + connectionOk: "Connexion réussie.", + needChooseLoginWay: "Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.", + needValidationToLogin: "Vous devez d'abord valider votre compte avant de vous connecter. Pour ce faire, un lien vient de vous être envoyé par e-mail.", + tooManyLoginFails: "Trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.", + badPassword: "Le mot de passe n'est pas le bon.", + mailLoginLinkSubject: "Votre lien de connexion.", + mailLoginLinkBodyTxt: "Bonjour USER_NAME,\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : LINK_URL", + mailLoginLinkBodyHTML: "

Bonjour USER_NAME,

Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :

Valider.

", + mailLoginLinkMessage: "Un lien de connexion vient de vous être envoyé sur votre adresse e-mail. Ne tardez pas à l'utiliser, car il n'est valable que durant ", + updatedOkMessage: "Vos informations ont bien été mises à jour.", + updatedNeedGoodEmail: "Mais la nouvelle adresse e-mail n'a pu être enregistrée car elle n'a pas une format correct.", + updatedNeedUniqueEmail: "Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.", + mailUpdateLoginSubject: "Merci de valider vos nouveaux identifiants.", + mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL", + mailUpdateLoginBodyHTML: "

Bonjour USER_NAME,

Pour valider vos nouveaux identifiants de connexion, cliquez ici sans tarder.

", + mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (email et/ou mot de passe) et vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement. En attendant, merci de continuer à utiliser vos anciens identifiants.", + updatedNeedValidatedUser: "L'utilisateur que vous souhaité modifier n'existe pas/plus ou n'a pas encore validé son compte.", + updatedNeedGoodGodfather: "Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.", + mailUpdateLoginOkMessage: "La mise à jour de vos identifiants a bien été enregistrée.", + updatedFailedGodfatherNotFound: "L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.", + creationOkMessage: "Le nouvel utilisateur a bien été enregistré.", + mailDeleteSubject: "Confirmer la suppression de votre compte.", + mailDeleteBodyTxt: "Bonjour USER_NAME,\nPour valider la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL", + mailDeleteBodyHTML: "

Bonjour USER_NAME,

Pour valider la suppression de votre compte, cliquez ici sans tarder.

", + mailDeleteLinkMessage: "Votre demande de suppression a bien été enregistrée. Merci de cliquer sans tarder sur le lien qui vient de vous être envoyé par e-mail pour confirmer.", + deleteOkMessage: "L'utilisateur a bien été supprimé.", + deleteFailMessage: "Tentative de suppression d'un utilisateur inexistant : ", + mailDeleteLinkOkMessage: "Votre compte a bien été supprimé. Merci d'avoir utilisé nos services.", + mailDeleteLinkAlreadyMessage: "Il semble que vous ayez déjà validé la suppression de votre compte.", + mailDeleteLinkFailMessage: "Votre lien de suppression n'est pas valide ou alors il n'est plus valable.", + cronDeleteUnvalidedUsersMessage: " comptes utilisateurs non validés ont été supprimés.", + deleteInactiveUsersMessage: " comptes utilisateurs inactifs ont été supprimés.", + welcomeMessage: "Bienvenue #NAME !", + byebyeMessage: "Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
À bientôt !", + infosUserForAdmin: "Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
Date de sa dernière connexion : DATE_CONNECTION.", + infosAdminGodfather: "Cet utilisateur a été parrainé par ", + infosAdminNbGodChilds: "Ses #NB filleuils : " +}; + +/***/ }), + +/***/ "../tools/main.js": +/*!************************!*\ + !*** ../tools/main.js ***! + \************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +// Quelques fonctions utiles pour les chaînes +var Tool = /*#__PURE__*/function () { + function Tool() { + _classCallCheck(this, Tool); + } + + _createClass(Tool, null, [{ + key: "isEmpty", + value: function isEmpty(myVar) { + if (myVar === undefined || myVar === null) return true;else { + myVar += ""; // si autre chose qu'une chaîne envoyé... + + myVar = myVar.trim(); + if (myVar === "") return true;else return false; + } + } + }, { + key: "trimIfNotNull", + value: function trimIfNotNull(myString) { + if (Tool.isEmpty(myString)) myString = null;else { + myString += ""; // si autre chose qu'une chaîne envoyé... + + myString = myString.trim(); + } + return myString; + } + }, { + key: "shortenIfLongerThan", + value: function shortenIfLongerThan(myString, max) { + myString += ""; // au cas où cela ne serait pas une chaîne... + + if (myString.length > max) myString = myString.substring(0, max - 3) + "..."; + return myString; + } // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings + + }, { + key: "replaceAll", + value: function replaceAll(myString, mapObj) { + var replaceElts = new RegExp(Object.keys(mapObj).join("|"), "gi"); + return myString.replace(replaceElts, function (matched) { + return mapObj[matched]; + }); + } // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random + + }, { + key: "getRandomInt", + value: function getRandomInt(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min)) + min; + } // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country + + }, { + key: "dateFormat", + value: function dateFormat(dateString) { + var lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "fr"; + if (Tool.isEmpty(dateString)) return ""; + var myDate = new Date(dateString); + var myDay = myDate.getDate() + ""; + if (myDay.length === 1) myDay = "0" + myDay; + var myMounth = myDate.getMonth() + 1 + ""; + if (myMounth.length === 1) myMounth = "0" + myMounth; + var myYear = myDate.getFullYear(); + if (lang === "fr") return myDay + "/" + myMounth + "/" + myYear;else if (lang === "form") // 2014-02-09 + return myYear + "-" + myMounth + "-" + myDay;else return myMounth + "/" + myDay + "/" + myYear; + } + }]); + + return Tool; +}(); + +module.exports = Tool; + +/***/ }), + +/***/ "../views sync recursive ^\\.\\/.*\\.js$": +/*!**********************************!*\ + !*** ../views sync ^\.\/.*\.js$ ***! + \**********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./default/config/fr.js": "../views/default/config/fr.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../views sync recursive ^\\.\\/.*\\.js$"; + +/***/ }), + +/***/ "../views/default/config/fr.js": +/*!*************************************!*\ + !*** ../views/default/config/fr.js ***! + \*************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + headLinks: [{ + anchor: "Accueil", + attributes: { + href: "/" + } + }, { + anchor: "Mon compte", + attributes: { + href: "/connexion.hmt", + id: "accountHeadLink" + } + }, { + anchor: "À propos", + attributes: { + href: "/a-propos.html" + } + }, { + anchor: "Contact", + attributes: { + href: "/contact.html" + } + }], + footLinks: [{ + anchor: "Crédits", + attributes: { + href: "/credits.html" + } + }, { + anchor: "Mentions légales", + attributes: { + href: "/mentions-legales.html", + rel: "nofollow" + } + }, { + anchor: "Données personnelles", + attributes: { + href: "/donnees.html" + } + }, { + anchor: "C.G.U.", + attributes: { + href: "/cgu.html", + rel: "nofollow" + } + }, { + anchor: "C.G.V.", + attributes: { + href: "/cgv.html", + rel: "nofollow" + } + }], + maxQuestionnairesByPage: 10, + userHomePage: "accueil.html", + adminHomePage: "admin.html", + managerHomePage: "gestion.html", + subscribePage: "inscription.html", + connectionPage: "connexion.html", + accountPage: "compte.html", + questionnairesManagementPage: "gestion-quizs.html", + usersManagementPage: "gestion-utilisateurs.html", + nbQuestionnairesUserHomePage: 10, + illustrationDir: "/img/quizs/", + siteSlogan: "Cultivons notre jardin !", + homeTitle1: "De nature curieuse ?", + homeP1: "Avec WikiLerni vous apprenez chaque jour de nouvelles choses.
Des articles de Wikipédia sont sélectionnés pour vous et sont suivis d'un quiz vous permettant de tester ce que vous en avez retenu.
De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre \"jardin\".", + homeTitle2: "La culture en liberté", + homeP2: "Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.

(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.", + newQuestionnairesTitle: "Les derniers quizs publiés sur WikiLerni", + newQuestionnairesIntro: "Liste des derniers quizs publiés sur WikiLerni.", + explanationTitle: "Vous découvrez WikiLerni ?", + explanationTxt: "Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.

Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.

Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)

Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.

Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.", + noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript." +}; + +/***/ }), + +/***/ "./src/homeManager.js": +/*!****************************!*\ + !*** ./src/homeManager.js ***! + \****************************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ "../config/instance.js"); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js"); +/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./tools/users.js */ "./src/tools/users.js"); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + +// -- PAGE D'ACCUEIL POUR LES GESTIONNAIRES +/// Vérifie que l'utilisateur est bien connecté, a le bon statut et le redirige vers le formulaire d'inscription si ce n'est pas le cas. +/// Si c'est ok, on récupère les stats générales et des dernières 24H et les affiche +/// On liste ensuite les prochains quizs devant être publiés en faisant ressortir ceux devant être complétés + la prochaine date sans quiz +/// Un menu permet à l'utilisateur d'accéder aux formulaires permettant de gérer les quizs et les comptes utilisateurs et abonnements +/// Un message venant d'une autre page peut aussi être à afficher lors du premier chargement. +// Fichier de configuration côté client : + +var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0]; + +var configFrontEnd = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); // Fonctions utiles au script : + + + + + + + // Dictionnaires : + +var txt = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + lang + "/general"); + +var txtUsers = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/user$")("./" + lang + "/user"); + +var txtQuestionnaire = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/questionnaire$")("./" + lang + "/questionnaire"); // Principaux éléments du DOM manipulés : + + +var divMain = document.getElementById("main-content"); +var divMessage = document.getElementById("message"); +var divQuestionnaires = document.getElementById("questionnaires"); +Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["helloDev"])(); + +var initialise = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + var config, isConnected, user, xhrStats, xhrNextQuestionnaires; + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _context.prev = 0; + _context.next = 3; + return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_5__["getConfig"])(); + + case 3: + config = _context.sent; + + if (config) { + _context.next = 8; + break; + } + + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]); + _context.next = 12; + break; + + case 8: + _context.next = 10; + return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_5__["checkSession"])(["manager", "admin"], "/" + configFrontEnd.connectionPage, { + message: txt.notAllowed, + color: "error" + }); + + case 10: + isConnected = _context.sent; + + if (isConnected) { + user = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("user", true); + Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["updateAccountLink"])(user.status, configFrontEnd); + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "h4", txtUsers.welcomeMessage.replace("#NAME", user.name)); + divMain.style.display = "block"; + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_4__["isEmpty"])(Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message"))) { + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "p", Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message", true).message, "", [Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message", true).color], "", false); + Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["removeLocaly"])("message"); + } // Les stats : + + + xhrStats = new XMLHttpRequest(); + xhrStats.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.userRoutes + config.getAdminStats); + + xhrStats.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var response = JSON.parse(this.responseText); + + if (this.status === 200) { + var mapText = { + NB_USERS_24H: response.nbNewUsers24H, + NB_SUBSCRIPTIONS_24H: response.Subscriptions.nbSubscriptions24H, + NB_USERS_DELETED_24H: response.nbDeletedUsers24H, + NB_ANSWERS_24H: response.Answers.nbAnswers24H, + NB_USERS_TOT: response.nbNewUsersTot, + NB_SUBSCRIPTIONS_TOT: response.Subscriptions.nbSubscriptionsTot, + NB_SUBSCRIPTIONS_PREMIUM: response.Subscriptions.nbSubscriptionsPremium, + NB_ANSWERS_TOT: response.Answers.nbAnswersTot, + NB_USERS_DELETED_TOT: response.nbDeletedUsersTot, + NB_USERS_DELETED_VALIDED: response.nbDeletedUsersWasValided, + NB_USERS_DELETED_PREMIUM: response.nbDeletedUsersTotWasPremium + }; + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "p", Object(_tools_main__WEBPACK_IMPORTED_MODULE_4__["replaceAll"])(txt.statsAdmin, mapText), "", "", "", false); + } + } + }; + + xhrStats.setRequestHeader("Authorization", "Bearer " + user.token); + xhrStats.send(); // Les questionnaires bientôt publiés : + + xhrNextQuestionnaires = new XMLHttpRequest(); + xhrNextQuestionnaires.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.questionnaireRoutes + config.getListNextQuestionnaires); + + xhrNextQuestionnaires.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var response = JSON.parse(this.responseText); + + if (this.status === 200 && Array.isArray(response.questionnaires)) { + var listHTML = ""; + + for (var i in response.questionnaires) { + listHTML += "
  • " + Object(_tools_main__WEBPACK_IMPORTED_MODULE_4__["dateFormat"])(response.questionnaires[i].datePublishing, "fr") + ": " + response.questionnaires[i].title + ""; + if (response.questionnaires[i].isPublishable === false) listHTML += " (" + txtQuestionnaire.needBeCompleted + ")
  • "; + listHTML += ""; + } + + if (response.questionnaires.length !== 0) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divQuestionnaires, "h3", txtQuestionnaire.nextQuestionnairesList.replace("#NB", response.questionnaires.length)); + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divQuestionnaires, "h4", txtQuestionnaire.nextDateWithoutQuestionnaire + Object(_tools_main__WEBPACK_IMPORTED_MODULE_4__["dateFormat"])(response.dateNeeded, "fr"), "", ["information"], "", false); + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divQuestionnaires, "ul", listHTML, "", "", "", false); + } + } + }; + + xhrNextQuestionnaires.setRequestHeader("Authorization", "Bearer " + user.token); + xhrNextQuestionnaires.send(); + } + + case 12: + _context.next = 17; + break; + + case 14: + _context.prev = 14; + _context.t0 = _context["catch"](0); + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "p", txt.serverError, "", ["error"]); + + case 17: + case "end": + return _context.stop(); + } + } + }, _callee, null, [[0, 14]]); + })); + + return function initialise() { + return _ref.apply(this, arguments); + }; +}(); + +initialise(); + +/***/ }), + +/***/ "./src/tools/clientstorage.js": +/*!************************************!*\ + !*** ./src/tools/clientstorage.js ***! + \************************************/ +/*! exports provided: saveLocaly, getLocaly, removeLocaly */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveLocaly", function() { return saveLocaly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaly", function() { return getLocaly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeLocaly", function() { return removeLocaly; }); +// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.) +// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie +var saveLocaly = function saveLocaly(name, data) { + localStorage.setItem(name, JSON.stringify(data)); +}; +var getLocaly = function getLocaly(name) { + var json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name); +}; +var removeLocaly = function removeLocaly(name) { + localStorage.removeItem(name); +}; + +/***/ }), + +/***/ "./src/tools/dom.js": +/*!**************************!*\ + !*** ./src/tools/dom.js ***! + \**************************/ +/*! exports provided: addElement */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addElement", function() { return addElement; }); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__); +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + + // Fonction associant les attributs fournis à un champ de formulaire + +var addElement = function addElement(eltParent, eltType) { + var eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; + var eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; + var eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : []; + var eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; + var replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true; + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltType) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltParent)) return false;else { + var newElement = document.createElement(eltType); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ? + newElement.id = eltId; + + if (Array.isArray(eltClass) && eltClass.length != 0) { + for (var i in eltClass) { + newElement.classList.add(eltClass[i]); + } + } + + if (_typeof(eltAttributes) === "object") // !! tous les objets ne sont pas ok + { + for (var attributName in eltAttributes) { + newElement.setAttribute(attributName, eltAttributes[attributName]); + } + } + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltContent)) newElement.innerHTML = eltContent.replace(/\n/g, "
    "); // innerHTML permet d'ajouter du texte ayant lui-même des balises, etc. + + if (replace) eltParent.innerHTML = ""; + eltParent.appendChild(newElement); + } +}; + +/***/ }), + +/***/ "./src/tools/everywhere.js": +/*!*********************************!*\ + !*** ./src/tools/everywhere.js ***! + \*********************************/ +/*! exports provided: helloDev, updateAccountLink */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "helloDev", function() { return helloDev; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateAccountLink", function() { return updateAccountLink; }); +// Ce script fournit des fonctions utilisées sur toutes les pages du site +var helloDev = function helloDev() { + console.log("**** Hello ami développeur :-)\n Le code de WikiLerni est libre et est lisible sur gitlab : \n Bonne lecture :-) \n Pour les suggestions d'amélioration ou questions : dev@wililerni.com ****"); + return true; +}; +var updateAccountLink = function updateAccountLink(status, configTemplate) { + var link = document.getElementById("accountHeadLink"); + var homePage = status + "HomePage"; + link.href = "/" + configTemplate[homePage]; +}; + +/***/ }), + +/***/ "./src/tools/users.js": +/*!****************************!*\ + !*** ./src/tools/users.js ***! + \****************************/ +/*! exports provided: getConfig, getTimeDifference, getPassword, setSession, checkAnswerDatas, checkSession */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getConfig", function() { return getConfig; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTimeDifference", function() { return getTimeDifference; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getPassword", function() { return getPassword; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setSession", function() { return setSession; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkAnswerDatas", function() { return checkAnswerDatas; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkSession", function() { return checkSession; }); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/instance.js */ "../config/instance.js"); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../config/users.js */ "../config/users.js"); +/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_3__); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + + +var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0]; + +var configTemplate = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); + + + + // Récupère les données de configuration des utilisateurs +// À terme, un fichier statique importable comme module devrait éviter une requête ajax + +var getConfig = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + return _context.abrupt("return", new Promise(function (resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + "/user/getconfig"); + + xhr.onload = function () { + return resolve(JSON.parse(xhr.responseText)); + }; + + xhr.onerror = function () { + return reject(xhr.statusText); + }; + + xhr.send(); + })); + + case 1: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + + return function getConfig() { + return _ref.apply(this, arguments); + }; +}(); +var getTimeDifference = function getTimeDifference() { + var timeLocal = new Date().getTimezoneOffset(); + if (timeLocal > _config_users_js__WEBPACK_IMPORTED_MODULE_1__["timeDifferenceMax"] || timeLocal < _config_users_js__WEBPACK_IMPORTED_MODULE_1__["timeDifferenceMin"]) return 0;else return timeLocal; +}; // On enlève volontairement les 0/O pour éviter les confusions ! +// Et mieux vaut aussi débuter et finir par une lettre simple. + +var getPassword = function getPassword(nbCarMin, nbCarMax) { + var nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin)); + var letters = "ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz"; + var others = "123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ"; + var password = letters[Math.floor(Math.random() * letters.length)]; + + for (var i = 1; i < nbCar - 1; i++) { + if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)]; + } + + password += letters[Math.floor(Math.random() * letters.length)]; + return password; +}; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite +// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides. + +var setSession = function setSession(userId, token, durationTS) { + var storageUser = { + id: userId, + token: token, + duration: durationTS + }; + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("user", storageUser); +}; // Vérifie qu'il y a des données locales concernant le résultat d'un quiz +// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas + +var checkAnswerDatas = function checkAnswerDatas(datas) { + var lastAnswer = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("lastAnswer"); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(lastAnswer)) { + var answer = JSON.parse(lastAnswer); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.duration) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbCorrectAnswers) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.QuestionnaireId) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbQuestions)) { + datas.duration = answer.duration; + datas.nbCorrectAnswers = answer.nbCorrectAnswers; + datas.QuestionnaireId = answer.QuestionnaireId; + datas.nbQuestions = answer.nbQuestions; + } + } + + return datas; +}; // Cette fonction teste la connexion de l'utilisateur d'une page +// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté + +var checkSession = /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() { + var status, + urlRedirection, + message, + urlWanted, + _args2 = arguments; + return regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + status = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : []; + urlRedirection = _args2.length > 1 ? _args2[1] : undefined; + message = _args2.length > 2 ? _args2[2] : undefined; + urlWanted = _args2.length > 3 ? _args2[3] : undefined; + return _context2.abrupt("return", new Promise(function (resolve, reject) { + var userDatas = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("user"); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(userDatas)) { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else { + var user = JSON.parse(userDatas); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.id) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.token) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.duration) || user.duration < Date.now()) { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else { + var xhr = new XMLHttpRequest(); + xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["userRoutes"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["checkLoginRoute"] + user.token); + + xhr.onload = function () { + var response = JSON.parse(xhr.responseText); + + if (xhr.status === 200 && response.isValid && response.id != undefined) { + if (response.id === user.id) { + user.name = response.name; + user.language = response.language; + user.timeDifference = response.timeDifference; + user.status = response.status; // le token et de toute façon vérifier à chaque requête à l'API + + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("user", user); // si il s'agit d'un "user" et que son abonnement a expiré, je le redirige vers la caisse :-) + + if (response.status === "user" && response.nbDaysOk <= 0) { + var urlAccount = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["siteUrl"] + "/" + configTemplate[lang].accountPage; + if (window.location.href.indexOf(urlAccount) === -1) window.location.assign("/" + configTemplate[lang].accountPage); // passée directement ici, l'ancre #subscribe ne fonctionne pas !? + + resolve(true); + } else { + if (status.length !== 0 && status.indexOf(response.status) === -1) { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else resolve(true); + } + } else { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + } else { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + }; + + xhr.onerror = function () { + return reject(xhr.statusText); + }; + + xhr.send(); + } + } + })); + + case 5: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + + return function checkSession() { + return _ref2.apply(this, arguments); + }; +}(); // Cette fonction sert à la précédente en cas de connexion non valide + +var redirectUser = function redirectUser(urlRedirection, message, urlWanted) { + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(message)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("message", message); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlWanted)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("url", urlWanted); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlRedirection)) window.location.assign(urlRedirection); +}; + +/***/ }) + +/******/ }); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9nZW5lcmFsJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3F1ZXN0aW9ubmFpcmUkIiwid2VicGFjazovLy8uLi9sYW5nIHN5bmMgXlxcLlxcLy4qXFwvdXNlciQiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcvZnIvZ2VuZXJhbC5qcyIsIndlYnBhY2s6Ly8vLi4vbGFuZy9mci9xdWVzdGlvbm5haXJlLmpzIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL3VzZXIuanMiLCJ3ZWJwYWNrOi8vLy4uL3Rvb2xzL21haW4uanMiLCJ3ZWJwYWNrOi8vLy4uL3ZpZXdzIHN5bmMgXlxcLlxcLy4qXFwuanMkIiwid2VicGFjazovLy8uLi92aWV3cy9kZWZhdWx0L2NvbmZpZy9mci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvaG9tZU1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2RvbS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvZXZlcnl3aGVyZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvdXNlcnMuanMiXSwibmFtZXMiOlsidXNlcnMiLCJyZXF1aXJlIiwicXVlc3Rpb25uYWlyZXMiLCJtb2R1bGUiLCJleHBvcnRzIiwiYXBpVXJsIiwic2l0ZVVybCIsImFkbWluTmFtZSIsImFkbWluRW1haWwiLCJzZW5kZXJOYW1lIiwic2VuZGVyRW1haWwiLCJhZG1pbkxhbmciLCJ0aGVtZSIsImF2YWlsYWJsZUxhbmdzIiwic2l0ZU5hbWUiLCJiZWdpbkNvZGVHb2RmYXRoZXIiLCJjcm9uVGltaW5nQWxlcnRJblNlY29uZGUiLCJyZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlIiwidG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnMiLCJ0b2tlbkxvZ2luTGlua1RpbWVJbkhvdXJzIiwidG9rZW5Db25uZXhpb25NaW5UaW1lSW5Ib3VycyIsInRva2VuQ29ubmV4aW9uTWF4VGltZUluRGF5cyIsInRva2VuTG9naW5DaGFuZ2luZ1RpbWVJbkhvdXJzIiwidG9rZW5EZWxldGVVc2VyVGltZUluSG91cnMiLCJ0b2tlblVuc3Vic2NyaWJlTGlua1RpbWVJbkRheXMiLCJmcmVlQWNjb3VudFRpbWluZ0luRGF5cyIsImZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5cyIsImFjY291bnRFeHBpcmF0aW9uRmlyc3ROb3RpZmljYXRpb25JbkRheXMiLCJhY2NvdW50RXhwaXJhdGlvblNlY29uZE5vdGlmaWNhdGlvbkluRGF5cyIsImluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5cyIsIm5iUXVlc3Rpb25zTWluIiwibmJRdWVzdGlvbnNNYXgiLCJuYkNob2ljZXNNYXgiLCJuYk5ld1F1ZXN0aW9ubmFpcmVzIiwiaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlQmVnaW4iLCJob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQiLCJudW1iZXJOZXdRdWVzdGlvbm5haXJlQXRTYW1lVGltZSIsIm1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzIiwibmJJbGx1c3RyYXRpb25zTWluIiwibmJJbGx1c3RyYXRpb25zTWF4IiwibWF4SWxsdXN0cmF0aW9uU2l6ZWluT2N0ZXQiLCJtaW1lVHlwZXNGb3JJbGx1c3RyYXRpb24iLCJpbGx1c3RyYXRpb25zV2lkdGhNYXhJblB4IiwiaWxsdXN0cmF0aW9uc01pbmlhdHVyZXNXaWR0aE1heEluUHgiLCJuYkxpbmtzTWluIiwibmJMaW5rc01heCIsInBhc3N3b3JkIiwibWlubGVuZ3RoIiwiZGlyQ2FjaGVVc2VycyIsImRpckNhY2hlVXNlcnNBbnN3ZXJzIiwiZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyIsImRpckNhY2hlUXVlc3Rpb25zIiwiZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzIiwiZGlySFRNTFF1ZXN0aW9ubmFpcmUiLCJkaXJXZWJRdWVzdGlvbm5haXJlIiwicXVlc3Rpb25uYWlyZVJvdXRlcyIsImdldFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlcyIsInB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJzYXZlQW5zd2Vyc1JvdXRlIiwiZ2V0U3RhdHNRdWVzdGlvbm5haXJlcyIsInNlYXJjaFF1ZXN0aW9ubmFpcmVzUm91dGUiLCJzZWFyY2hBZG1pblF1ZXN0aW9ubmFpcmVzUm91dGUiLCJnZXRMaXN0TmV4dFF1ZXN0aW9ubmFpcmVzIiwicXVlc3Rpb25zUm91dGUiLCJ0YWdzU2VhcmNoUm91dGUiLCJnZXRRdWVzdGlvbm5haXJlc1dpdGhvdXRBbnN3ZXIiLCJnZXRQcmV2aW91c0Fuc3dlcnMiLCJnZXRTdGF0c0Fuc3dlcnMiLCJnZXRBZG1pblN0YXRzIiwiUXVlc3Rpb25uYWlyZSIsInRpdGxlIiwibWF4bGVuZ3RoIiwicmVxdWlyZWQiLCJzbHVnIiwiaW50cm9kdWN0aW9uIiwic2VhcmNoUXVlc3Rpb25uYWlyZXMiLCJRdWVzdGlvbiIsInRleHQiLCJyYW5rIiwibWluIiwiZGVmYXVsdFZhbHVlIiwiQ2hvaWNlIiwibmJUYWdzTWluIiwibmJUYWdzTWF4IiwiZGlyQ2FjaGVUYWdzIiwiZGlySFRNTFRhZ3MiLCJkaXJXZWJUYWdzIiwidXNlclJvdXRlcyIsInN1YnNjcmliZVJvdXRlIiwiZ2V0R29kZmF0aGVyUm91dGUiLCJjaGVja0lmSXNFbWFpbGZyZWVSb3V0ZSIsImNoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZSIsImNoZWNrTG9naW5Sb3V0ZSIsImNvbm5lY3Rpb25Sb3V0ZSIsImdldExvZ2luTGlua1JvdXRlIiwiY29ubmVjdGlvbldpdGhMaW5rUm91dGUiLCJnZXRVc2VySW5mb3MiLCJjcmVhdGVVc2VyUm91dGUiLCJ2YWxpZGF0ZVVzZXJSb3V0ZSIsInVwZGF0ZVVzZXJJbmZvcyIsInNlYXJjaFVzZXJSb3V0ZSIsImdldEdvZENoaWxkcyIsImNoZWNrTmV3TG9naW5MaW5rUm91dGUiLCJjaGVja0RlbGV0ZUxpbmtSb3V0ZSIsImdldFBheW1lbnRzIiwidW5zdWJzY3JpYmVSb3V0ZSIsIm5hbWUiLCJlbWFpbCIsIm5ld1Bhc3N3b3JkIiwiY29kZUdvZGZhdGhlciIsImNndU9rIiwidmFsdWUiLCJ0aW1lRGlmZmVyZW5jZU1pbiIsInRpbWVEaWZmZXJlbmNlTWF4Iiwic2l0ZUhUTUxUaXRsZSIsInNpdGVNZXRhRGVzY3JpcHRpb24iLCJzY3JpcHRUaW1pbmdJbmZvIiwic2NyaXB0VGltaW5nQWxlcnQiLCJzZXJ2ZXJFcnJvciIsInNlcnZlckVycm9yQWRtaW4iLCJuZWVkZWRQYXJhbXMiLCJiYWRVcmwiLCJub3RWYWxpZEZvcm1hdCIsIm5vdEFsbG93ZWQiLCJub3RSZXF1aXJlZCIsInVwZGF0ZUJ0blR4dCIsImFkZEJ0blR4dCIsImRlbGV0ZUJ0blR4dCIsImFkZE9rTWVzc2FnZSIsInVwZGF0ZU9rTWVzc2FnZSIsImRlbGV0ZU9rTWVzc2FnZSIsImZhaWxBdXRoIiwiZmFpbEF1dGhIZWFkZXIiLCJmYWlsQXV0aFRva2VuIiwiZmFpbEF1dGhJZCIsImZhaWxBdXRoQ3JvbiIsInByZXZpb3VzUGFnZSIsIm5leHRQYWdlIiwiYnRuTGlua1RvUXVlc3Rpb25uYWlyZSIsInN0YXRzQWRtaW4iLCJuZWVkVGl0bGUiLCJuZWVkTm90VG9vTG9uZ1RpdGxlIiwibmVlZFVybCIsIm5lZWRVbmlxdWVVcmwiLCJuZWVkSW50cm9kdWN0aW9uIiwibmVlZENvcnJlY3RQdWJsaXNoaW5nRGF0ZSIsIm5lZWRLbm93SWZJc1B1Ymxpc2hlZCIsIm5lZWRMYW5ndWFnZSIsIm5lZWRFc3RpbWF0ZWRUaW1lIiwibm90Rm91bmQiLCJzZWFyY2hSZXN1bHRUaXRsZSIsInNlYXJjaE5vUmVzdWx0Iiwic2VhcmNoV2l0aFJlc3VsdCIsInB1Ymxpc2hlZEJ5IiwicHVibGlzaGVkQXQiLCJsYXN0VXBkYXRlZCIsImVzdGltYXRlZFRpbWUiLCJidG5TZW5kUmVzcG9uc2UiLCJidG5Qcm9wb3NlU3Vic2NyaWJlIiwiYnRuUHJvcG9zZUNvbm5lY3Rpb24iLCJidG5TaG93UXVlc3Rpb25uYWlyZSIsIm5leHRRdWVzdGlvbm5haXJlc0xpc3QiLCJuZWVkQmVDb21wbGV0ZWQiLCJuZXh0RGF0ZVdpdGhvdXRRdWVzdGlvbm5haXJlIiwiaGF2ZUJlZW5QdWJsaXNoZWQiLCJuZWVkTmFtZSIsIm5lZWROb3RUb29Mb25nTmFtZSIsIm5lZWRFbWFpbCIsIm5lZWRVbmlxdWVFbWFpbCIsIm5lZWROb3RUb29Mb25nRW1haWwiLCJuZWVkUGFzc1dvcmQiLCJuZWVkTG9uZ1Bhc3NXb3JkIiwicGFzc3dvcmRDb3BpZWQiLCJuZWVkU3RhdHVzIiwibmVlZFZhbGlkTGFzdENvbm5lY3Rpb25EYXRlIiwibmVlZFNNVFAiLCJuZWVkU01UUE5vdEZvdW5kIiwibmVlZEtub3dOZXdzbGV0dGVyT2siLCJuZWVkVGltZURpZmZlcmVuY2UiLCJuZWVkTWluVGltZURpZmZlcmVuY2UiLCJuZWVkTWF4VGltZURpZmZlcmVuY2UiLCJuZWVkVUdDT2siLCJnb2RmYXRoZXJOb3RGb3VuZCIsImdvZGZhdGhlckZvdW5kIiwibWFpbFZhbGlkYXRpb25NZXNzYWdlIiwibWFpbFZhbGlkYXRpb25MaW5rU3ViamVjdCIsIm1haWxWYWxpZGF0aW9uTGlua1NCb2R5VHh0IiwibWFpbFZhbGlkYXRpb25MaW5rU0JvZHlIVE1MIiwidmFsaWRhdGlvbk1lc3NhZ2UiLCJ2YWxpZGF0aW9uTWVzc2FnZUFkbWluIiwidmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlIiwidmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlQWRtaW4iLCJtYWlsV2VsY29tZVN1YmplY3QiLCJtYWlsV2VsY29tZUJvZHlUeHQiLCJtYWlsV2VsY29tZUJvZHlIVE1MIiwibWFpbFRoYW5rR29kZmF0aGVyU3ViamVjdCIsIm1haWxUaGFua0dvZGZhdGhlckJvZHlUeHQiLCJtYWlsVGhhbmtHb2RmYXRoZXJCb2R5SFRNTCIsImJhZExpbmtWYWxpZGF0aW9uTWVzc2FnZSIsImVtYWlsTm90Rm91bmQiLCJhbHJlYWR5Q29ubmVjdGVkIiwibmVlZEJlQ29ubmVjdGVkIiwiY29ubmVjdGlvbk9rIiwibmVlZENob29zZUxvZ2luV2F5IiwibmVlZFZhbGlkYXRpb25Ub0xvZ2luIiwidG9vTWFueUxvZ2luRmFpbHMiLCJiYWRQYXNzd29yZCIsIm1haWxMb2dpbkxpbmtTdWJqZWN0IiwibWFpbExvZ2luTGlua0JvZHlUeHQiLCJtYWlsTG9naW5MaW5rQm9keUhUTUwiLCJtYWlsTG9naW5MaW5rTWVzc2FnZSIsInVwZGF0ZWRPa01lc3NhZ2UiLCJ1cGRhdGVkTmVlZEdvb2RFbWFpbCIsInVwZGF0ZWROZWVkVW5pcXVlRW1haWwiLCJtYWlsVXBkYXRlTG9naW5TdWJqZWN0IiwibWFpbFVwZGF0ZUxvZ2luQm9keVR4dCIsIm1haWxVcGRhdGVMb2dpbkJvZHlIVE1MIiwibWFpbFVwZGF0ZUxvZ2luTGlua01lc3NhZ2UiLCJ1cGRhdGVkTmVlZFZhbGlkYXRlZFVzZXIiLCJ1cGRhdGVkTmVlZEdvb2RHb2RmYXRoZXIiLCJtYWlsVXBkYXRlTG9naW5Pa01lc3NhZ2UiLCJ1cGRhdGVkRmFpbGVkR29kZmF0aGVyTm90Rm91bmQiLCJjcmVhdGlvbk9rTWVzc2FnZSIsIm1haWxEZWxldGVTdWJqZWN0IiwibWFpbERlbGV0ZUJvZHlUeHQiLCJtYWlsRGVsZXRlQm9keUhUTUwiLCJtYWlsRGVsZXRlTGlua01lc3NhZ2UiLCJkZWxldGVGYWlsTWVzc2FnZSIsIm1haWxEZWxldGVMaW5rT2tNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtBbHJlYWR5TWVzc2FnZSIsIm1haWxEZWxldGVMaW5rRmFpbE1lc3NhZ2UiLCJjcm9uRGVsZXRlVW52YWxpZGVkVXNlcnNNZXNzYWdlIiwiZGVsZXRlSW5hY3RpdmVVc2Vyc01lc3NhZ2UiLCJ3ZWxjb21lTWVzc2FnZSIsImJ5ZWJ5ZU1lc3NhZ2UiLCJpbmZvc1VzZXJGb3JBZG1pbiIsImluZm9zQWRtaW5Hb2RmYXRoZXIiLCJpbmZvc0FkbWluTmJHb2RDaGlsZHMiLCJUb29sIiwibXlWYXIiLCJ1bmRlZmluZWQiLCJ0cmltIiwibXlTdHJpbmciLCJpc0VtcHR5IiwibWF4IiwibGVuZ3RoIiwic3Vic3RyaW5nIiwibWFwT2JqIiwicmVwbGFjZUVsdHMiLCJSZWdFeHAiLCJPYmplY3QiLCJrZXlzIiwiam9pbiIsInJlcGxhY2UiLCJtYXRjaGVkIiwiTWF0aCIsImNlaWwiLCJmbG9vciIsInJhbmRvbSIsImRhdGVTdHJpbmciLCJsYW5nIiwibXlEYXRlIiwiRGF0ZSIsIm15RGF5IiwiZ2V0RGF0ZSIsIm15TW91bnRoIiwiZ2V0TW9udGgiLCJteVllYXIiLCJnZXRGdWxsWWVhciIsImhlYWRMaW5rcyIsImFuY2hvciIsImF0dHJpYnV0ZXMiLCJocmVmIiwiaWQiLCJmb290TGlua3MiLCJyZWwiLCJtYXhRdWVzdGlvbm5haXJlc0J5UGFnZSIsInVzZXJIb21lUGFnZSIsImFkbWluSG9tZVBhZ2UiLCJtYW5hZ2VySG9tZVBhZ2UiLCJzdWJzY3JpYmVQYWdlIiwiY29ubmVjdGlvblBhZ2UiLCJhY2NvdW50UGFnZSIsInF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2UiLCJ1c2Vyc01hbmFnZW1lbnRQYWdlIiwibmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSIsImlsbHVzdHJhdGlvbkRpciIsInNpdGVTbG9nYW4iLCJob21lVGl0bGUxIiwiaG9tZVAxIiwiaG9tZVRpdGxlMiIsImhvbWVQMiIsIm5ld1F1ZXN0aW9ubmFpcmVzVGl0bGUiLCJuZXdRdWVzdGlvbm5haXJlc0ludHJvIiwiZXhwbGFuYXRpb25UaXRsZSIsImV4cGxhbmF0aW9uVHh0Iiwibm9KU05vdGlmaWNhdGlvbiIsImNvbmZpZ0Zyb250RW5kIiwidHh0IiwidHh0VXNlcnMiLCJ0eHRRdWVzdGlvbm5haXJlIiwiZGl2TWFpbiIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJkaXZNZXNzYWdlIiwiZGl2UXVlc3Rpb25uYWlyZXMiLCJoZWxsb0RldiIsImluaXRpYWxpc2UiLCJnZXRDb25maWciLCJjb25maWciLCJhZGRFbGVtZW50IiwiZGl2UmVzcG9uc2UiLCJjaGVja1Nlc3Npb24iLCJtZXNzYWdlIiwiY29sb3IiLCJpc0Nvbm5lY3RlZCIsInVzZXIiLCJnZXRMb2NhbHkiLCJ1cGRhdGVBY2NvdW50TGluayIsInN0YXR1cyIsInN0eWxlIiwiZGlzcGxheSIsInJlbW92ZUxvY2FseSIsInhoclN0YXRzIiwiWE1MSHR0cFJlcXVlc3QiLCJvcGVuIiwib25yZWFkeXN0YXRlY2hhbmdlIiwicmVhZHlTdGF0ZSIsIkRPTkUiLCJyZXNwb25zZSIsIkpTT04iLCJwYXJzZSIsInJlc3BvbnNlVGV4dCIsIm1hcFRleHQiLCJOQl9VU0VSU18yNEgiLCJuYk5ld1VzZXJzMjRIIiwiTkJfU1VCU0NSSVBUSU9OU18yNEgiLCJTdWJzY3JpcHRpb25zIiwibmJTdWJzY3JpcHRpb25zMjRIIiwiTkJfVVNFUlNfREVMRVRFRF8yNEgiLCJuYkRlbGV0ZWRVc2VyczI0SCIsIk5CX0FOU1dFUlNfMjRIIiwiQW5zd2VycyIsIm5iQW5zd2VyczI0SCIsIk5CX1VTRVJTX1RPVCIsIm5iTmV3VXNlcnNUb3QiLCJOQl9TVUJTQ1JJUFRJT05TX1RPVCIsIm5iU3Vic2NyaXB0aW9uc1RvdCIsIk5CX1NVQlNDUklQVElPTlNfUFJFTUlVTSIsIm5iU3Vic2NyaXB0aW9uc1ByZW1pdW0iLCJOQl9BTlNXRVJTX1RPVCIsIm5iQW5zd2Vyc1RvdCIsIk5CX1VTRVJTX0RFTEVURURfVE9UIiwibmJEZWxldGVkVXNlcnNUb3QiLCJOQl9VU0VSU19ERUxFVEVEX1ZBTElERUQiLCJuYkRlbGV0ZWRVc2Vyc1dhc1ZhbGlkZWQiLCJOQl9VU0VSU19ERUxFVEVEX1BSRU1JVU0iLCJuYkRlbGV0ZWRVc2Vyc1RvdFdhc1ByZW1pdW0iLCJyZXBsYWNlQWxsIiwic2V0UmVxdWVzdEhlYWRlciIsInRva2VuIiwic2VuZCIsInhock5leHRRdWVzdGlvbm5haXJlcyIsIkFycmF5IiwiaXNBcnJheSIsImxpc3RIVE1MIiwiaSIsImRhdGVGb3JtYXQiLCJkYXRlUHVibGlzaGluZyIsImlzUHVibGlzaGFibGUiLCJkYXRlTmVlZGVkIiwic2F2ZUxvY2FseSIsImRhdGEiLCJsb2NhbFN0b3JhZ2UiLCJzZXRJdGVtIiwic3RyaW5naWZ5IiwianNvbiIsImdldEl0ZW0iLCJyZW1vdmVJdGVtIiwiZWx0UGFyZW50IiwiZWx0VHlwZSIsImVsdENvbnRlbnQiLCJlbHRJZCIsImVsdENsYXNzIiwiZWx0QXR0cmlidXRlcyIsIm5ld0VsZW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NMaXN0IiwiYWRkIiwiYXR0cmlidXROYW1lIiwic2V0QXR0cmlidXRlIiwiaW5uZXJIVE1MIiwiYXBwZW5kQ2hpbGQiLCJjb25zb2xlIiwibG9nIiwiY29uZmlnVGVtcGxhdGUiLCJsaW5rIiwiaG9tZVBhZ2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInhociIsIm9ubG9hZCIsIm9uZXJyb3IiLCJzdGF0dXNUZXh0IiwiZ2V0VGltZURpZmZlcmVuY2UiLCJ0aW1lTG9jYWwiLCJnZXRUaW1lem9uZU9mZnNldCIsImdldFBhc3N3b3JkIiwibmJDYXJNaW4iLCJuYkNhck1heCIsIm5iQ2FyIiwibGV0dGVycyIsIm90aGVycyIsInNldFNlc3Npb24iLCJ1c2VySWQiLCJkdXJhdGlvblRTIiwic3RvcmFnZVVzZXIiLCJkdXJhdGlvbiIsImNoZWNrQW5zd2VyRGF0YXMiLCJkYXRhcyIsImxhc3RBbnN3ZXIiLCJhbnN3ZXIiLCJuYkNvcnJlY3RBbnN3ZXJzIiwiUXVlc3Rpb25uYWlyZUlkIiwibmJRdWVzdGlvbnMiLCJ1cmxSZWRpcmVjdGlvbiIsInVybFdhbnRlZCIsInVzZXJEYXRhcyIsInJlZGlyZWN0VXNlciIsIm5vdyIsImlzVmFsaWQiLCJsYW5ndWFnZSIsInRpbWVEaWZmZXJlbmNlIiwibmJEYXlzT2siLCJ1cmxBY2NvdW50Iiwid2luZG93IiwibG9jYXRpb24iLCJpbmRleE9mIiwiYXNzaWduIl0sIm1hcHBpbmdzIjoiO1FBQUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7OztRQUdBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwwQ0FBMEMsZ0NBQWdDO1FBQzFFO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0Esd0RBQXdELGtCQUFrQjtRQUMxRTtRQUNBLGlEQUFpRCxjQUFjO1FBQy9EOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSx5Q0FBeUMsaUNBQWlDO1FBQzFFLGdIQUFnSCxtQkFBbUIsRUFBRTtRQUNySTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDJCQUEyQiwwQkFBMEIsRUFBRTtRQUN2RCxpQ0FBaUMsZUFBZTtRQUNoRDtRQUNBO1FBQ0E7O1FBRUE7UUFDQSxzREFBc0QsK0RBQStEOztRQUVySDtRQUNBOzs7UUFHQTtRQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDbEZBLElBQU1BLEtBQUssR0FBR0MsbUJBQU8sQ0FBQyxtQ0FBRCxDQUFyQjs7QUFDQSxJQUFNQyxjQUFjLEdBQUdELG1CQUFPLENBQUMscURBQUQsQ0FBOUI7O0FBRUFFLE1BQU0sQ0FBQ0MsT0FBUDtBQUVJQyxRQUFNLEVBQUUsMkJBRlo7QUFHSUMsU0FBTyxFQUFFLHVCQUhiO0FBSUlDLFdBQVMsRUFBRSxTQUpmO0FBS0lDLFlBQVUsRUFBRSxtQkFMaEI7QUFNSUMsWUFBVSxFQUFFLFdBTmhCO0FBT0lDLGFBQVcsRUFBRSx1QkFQakI7QUFRSUMsV0FBUyxFQUFFLElBUmY7QUFTSUMsT0FBSyxFQUFFLFNBVFg7QUFTc0I7QUFDbEJDLGdCQUFjLEVBQUUsQ0FBQyxJQUFELENBVnBCO0FBVTJCO0FBQ3ZCQyxVQUFRLEVBQUUsV0FYZDtBQVlJQyxvQkFBa0IsRUFBRSxXQVp4QjtBQVlxQztBQUNqQ0MsMEJBQXdCLEVBQUUsR0FiOUI7QUFhbUM7QUFDL0JDLDhCQUE0QixFQUFFLENBZGxDO0FBY3FDO0FBQ2pDQyxrQ0FBZ0MsRUFBRSxLQWZ0QztBQWU2QztBQUN6Q0MsMkJBQXlCLEVBQUUsSUFoQi9CO0FBaUJJQyw4QkFBNEIsRUFBRSxLQWpCbEM7QUFrQklDLDZCQUEyQixFQUFFLFVBbEJqQztBQW1CSUMsK0JBQTZCLEVBQUUsSUFuQm5DO0FBbUJ3QztBQUNwQ0MsNEJBQTBCLEVBQUUsSUFwQmhDO0FBcUJJQyxnQ0FBOEIsRUFBRSxRQXJCcEM7QUFxQjhDO0FBQzFDQyx5QkFBdUIsRUFBRSxFQXRCN0I7QUF1QklDLHlDQUF1QyxFQUFFLENBdkI3QztBQXdCSUMsMENBQXdDLEVBQUUsRUF4QjlDO0FBeUJJQywyQ0FBeUMsRUFBRSxDQXpCL0M7QUEwQklDLG1DQUFpQyxFQUFFLEdBMUJ2QztBQTJCSTtBQUNBQyxnQkFBYyxFQUFFLENBNUJwQjtBQTRCdUI7QUFDbkJDLGdCQUFjLEVBQUUsRUE3QnBCO0FBNkJ3QjtBQUNwQkMsY0FBWSxFQUFFLEVBOUJsQjtBQStCSUMscUJBQW1CLEVBQUUsRUEvQnpCO0FBK0I0QjtBQUN4QkMsK0JBQTZCLEVBQUMsQ0FoQ2xDO0FBZ0NxQztBQUNqQ0MsNkJBQTJCLEVBQUMsRUFqQ2hDO0FBaUNvQztBQUNoQ0Msa0NBQWdDLEVBQUUsRUFsQ3RDO0FBa0MwQztBQUN0Q0MseUJBQXVCLEVBQUUsQ0FuQzdCO0FBb0NJO0FBQ0FDLG9CQUFrQixFQUFFLENBckN4QjtBQXNDSUMsb0JBQWtCLEVBQUUsQ0F0Q3hCO0FBdUNJQyw0QkFBMEIsRUFBRSxPQXZDaEM7QUF1Q3dDO0FBQ3BDQywwQkFBd0IsRUFBRSxDQUFFLFdBQUYsRUFBZSxZQUFmLEVBQTZCLFdBQTdCLEVBQTBDLFdBQTFDLEVBQXVELFdBQXZELENBeEM5QjtBQXlDSTtBQUNBQywyQkFBeUIsRUFBRSxHQTFDL0I7QUEyQ0lDLHFDQUFtQyxFQUFFLEdBM0N6QztBQTRDSTtBQUNBQyxZQUFVLEVBQUUsQ0E3Q2hCO0FBOENJQyxZQUFVLEVBQUU7QUE5Q2hCLHNEQWdEb0IzQyxjQUFjLENBQUM0QixjQWhEbkMsc0RBaURvQjVCLGNBQWMsQ0FBQzZCLGNBakRuQyxvREFrRGtCN0IsY0FBYyxDQUFDOEIsWUFsRGpDLHlEQW1EdUJoQyxLQUFLLENBQUM4QyxRQUFOLENBQWVDLFNBbkR0QyxxREFvRG1CL0MsS0FBSyxDQUFDZ0QsYUFwRHpCLDREQXFEMEJoRCxLQUFLLENBQUNpRCxvQkFyRGhDLDhEQXNENEIvQyxjQUFjLENBQUNnRCxzQkF0RDNDLHlEQXVEdUJoRCxjQUFjLENBQUNpRCxpQkF2RHRDLG1FQXdEaUNqRCxjQUFjLENBQUNrRCwyQkF4RGhELDREQXlEMEJsRCxjQUFjLENBQUNtRCxvQkF6RHpDLDJEQTBEeUJuRCxjQUFjLENBQUNvRCxtQkExRHhDLG9COzs7Ozs7Ozs7OztBQ0hBbkQsTUFBTSxDQUFDQyxPQUFQLEdBQ0E7QUFDSTtBQUNBbUQscUJBQW1CLEVBQUUsZ0JBRnpCO0FBR0lDLHdCQUFzQixFQUFFLE1BSDVCO0FBSUlDLDRCQUEwQixFQUFFLFVBSmhDO0FBS0lDLDhCQUE0QixFQUFFLFFBTGxDO0FBTUlDLGtCQUFnQixFQUFFLFVBTnRCO0FBT0lDLHdCQUFzQixFQUFHLFNBUDdCO0FBUUlDLDJCQUF5QixFQUFHLFNBUmhDO0FBU0lDLGdDQUE4QixFQUFHLGNBVHJDO0FBVUlDLDJCQUF5QixFQUFFLDZCQVYvQjtBQVdJO0FBQ0FDLGdCQUFjLEVBQUUsWUFacEI7QUFhSTtBQUNBQyxpQkFBZSxFQUFFLGVBZHJCO0FBZUk7QUFDQUMsZ0NBQThCLEVBQUUsc0JBaEJwQztBQWlCSUMsb0JBQWtCLEVBQUUsZ0JBakJ4QjtBQWtCSUMsaUJBQWUsRUFBRyx1QkFsQnRCO0FBbUJJQyxlQUFhLEVBQUUsaUJBbkJuQjtBQW9CSTtBQUNBQyxlQUFhLEVBQ2I7QUFDSUMsU0FBSyxFQUFFO0FBQUVDLGVBQVMsRUFBRSxHQUFiO0FBQWtCQyxjQUFRLEVBQUU7QUFBNUIsS0FEWDtBQUVJQyxRQUFJLEVBQUU7QUFBRUYsZUFBUyxFQUFFO0FBQWIsS0FGVjtBQUU4QjtBQUMxQkcsZ0JBQVksRUFBRTtBQUFFRixjQUFRLEVBQUU7QUFBWjtBQUhsQixHQXRCSjtBQTJCSUcsc0JBQW9CLEVBQUc7QUFBRTdCLGFBQVMsRUFBRSxDQUFiO0FBQWdCMEIsWUFBUSxFQUFFO0FBQTFCLEdBM0IzQjtBQTRCSUksVUFBUSxFQUNSO0FBQ0lDLFFBQUksRUFBRTtBQUFFTixlQUFTLEVBQUUsR0FBYjtBQUFrQkMsY0FBUSxFQUFFO0FBQTVCLEtBRFY7QUFFSU0sUUFBSSxFQUFFO0FBQUVOLGNBQVEsRUFBRSxJQUFaO0FBQWtCTyxTQUFHLEVBQUMsQ0FBdEI7QUFBeUJDLGtCQUFZLEVBQUM7QUFBdEM7QUFGVixHQTdCSjtBQWlDSUMsUUFBTSxFQUNOO0FBQ0lKLFFBQUksRUFBRTtBQUFFTixlQUFTLEVBQUUsR0FBYjtBQUFrQkMsY0FBUSxFQUFFO0FBQTVCO0FBRFYsR0FsQ0o7QUFxQ0kzQyxnQkFBYyxFQUFFLENBckNwQjtBQXNDSUMsZ0JBQWMsRUFBRSxFQXRDcEI7QUF1Q0lDLGNBQVksRUFBRSxFQXZDbEI7QUF3Q0ltRCxXQUFTLEVBQUUsQ0F4Q2Y7QUF5Q0lDLFdBQVMsRUFBRSxDQXpDZjtBQXlDa0I7QUFDZDtBQUNBbEMsd0JBQXNCLEVBQUcsc0JBM0M3QjtBQTRDSUMsbUJBQWlCLEVBQUcsZ0NBNUN4QjtBQTZDSUMsNkJBQTJCLEVBQUcsNEJBN0NsQztBQThDSWlDLGNBQVksRUFBRywyQkE5Q25CO0FBK0NJaEMsc0JBQW9CLEVBQUcsbUJBL0MzQjtBQWdESWlDLGFBQVcsRUFBRyxvQkFoRGxCO0FBaURJaEMscUJBQW1CLEVBQUcsTUFqRDFCO0FBaURpQztBQUM3QmlDLFlBQVUsRUFBRyxPQWxEakIsQ0FrRHdCOztBQWxEeEIsQ0FEQSxDOzs7Ozs7Ozs7OztBQ0FBcEYsTUFBTSxDQUFDQyxPQUFQLEdBQ0E7QUFDSTtBQUNBb0YsWUFBVSxFQUFFLE9BRmhCO0FBR0lDLGdCQUFjLEVBQUUsU0FIcEI7QUFJSUMsbUJBQWlCLEVBQUUsaUJBSnZCO0FBS0lDLHlCQUF1QixFQUFFLGNBTDdCO0FBTUlDLDBCQUF3QixFQUFFLGNBTjlCO0FBT0lDLGlCQUFlLEVBQUUsY0FQckI7QUFRSUMsaUJBQWUsRUFBRSxRQVJyQjtBQVNJQyxtQkFBaUIsRUFBRSxlQVR2QjtBQVVJQyx5QkFBdUIsRUFBRSxpQkFWN0I7QUFXSUMsY0FBWSxFQUFFLE9BWGxCO0FBWUlDLGlCQUFlLEVBQUUsU0FackI7QUFhSUMsbUJBQWlCLEVBQUUsWUFidkI7QUFjSUMsaUJBQWUsRUFBRSxVQWRyQjtBQWVJQyxpQkFBZSxFQUFFLFVBZnJCO0FBZ0JJQyxjQUFZLEVBQUUsZ0JBaEJsQjtBQWlCSUMsd0JBQXNCLEVBQUUsbUJBakI1QjtBQWtCSUMsc0JBQW9CLEVBQUUsaUJBbEIxQjtBQW1CSUMsYUFBVyxFQUFFLHlCQW5CakI7QUFvQklDLGtCQUFnQixFQUFFLHFCQXBCdEI7QUFxQklyQyxlQUFhLEVBQUUsaUJBckJuQjtBQXNCSTtBQUNBc0MsTUFBSSxFQUFFO0FBQUVuQyxhQUFTLEVBQUUsRUFBYjtBQUFpQkMsWUFBUSxFQUFFO0FBQTNCLEdBdkJWO0FBd0JJbUMsT0FBSyxFQUFFO0FBQUVwQyxhQUFTLEVBQUUsR0FBYjtBQUFrQkMsWUFBUSxFQUFFO0FBQTVCLEdBeEJYO0FBeUJJM0IsVUFBUSxFQUFFO0FBQUVDLGFBQVMsRUFBRSxDQUFiO0FBQWdCeUIsYUFBUyxFQUFDLEVBQTFCO0FBQThCQyxZQUFRLEVBQUU7QUFBeEMsR0F6QmQ7QUF5QjhEO0FBQzFEb0MsYUFBVyxFQUFFO0FBQUU5RCxhQUFTLEVBQUUsQ0FBYjtBQUFnQnlCLGFBQVMsRUFBQztBQUExQixHQTFCakI7QUEyQklzQyxlQUFhLEVBQUU7QUFBRXRDLGFBQVMsRUFBRTtBQUFiLEdBM0JuQjtBQTRCSXVDLE9BQUssRUFBRTtBQUFFQyxTQUFLLEVBQUUsTUFBVDtBQUFpQnZDLFlBQVEsRUFBRTtBQUEzQixHQTVCWDtBQTZCSXdDLG1CQUFpQixFQUFFLENBQUMsR0E3QnhCO0FBOEJJQyxtQkFBaUIsRUFBQyxHQTlCdEI7QUErQkk7QUFDQWxFLGVBQWEsRUFBRyxhQWhDcEI7QUFpQ0lDLHNCQUFvQixFQUFHO0FBakMzQixDQURBLEM7Ozs7Ozs7Ozs7O0FDQUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0U7Ozs7Ozs7Ozs7O0FDdEJBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdFOzs7Ozs7Ozs7OztBQ3RCQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrRDs7Ozs7Ozs7Ozs7QUN0QkE5QyxNQUFNLENBQUNDLE9BQVAsR0FDQTtBQUNJK0csZUFBYSxFQUFHLG1EQURwQjtBQUVJQyxxQkFBbUIsRUFBRyx1RkFGMUI7QUFHSUMsa0JBQWdCLEVBQUcsdUVBSHZCO0FBSUlDLG1CQUFpQixFQUFHLG1FQUp4QjtBQUtJQyxhQUFXLEVBQUcsNEdBTGxCO0FBTUlDLGtCQUFnQixFQUFHLHdCQU52QjtBQU9JQyxjQUFZLEVBQUcsc0RBUG5CO0FBUUlDLFFBQU0sRUFBRywrQ0FSYjtBQVNJQyxnQkFBYyxFQUFHLG9CQVRyQjtBQVVJQyxZQUFVLEVBQUcsMkRBVmpCO0FBV0lDLGFBQVcsRUFBRyxhQVhsQjtBQVlJQyxjQUFZLEVBQUUsVUFabEI7QUFhSUMsV0FBUyxFQUFFLFNBYmY7QUFjSUMsY0FBWSxFQUFFLFdBZGxCO0FBZUlDLGNBQVksRUFBRyx3Q0FmbkI7QUFnQklDLGlCQUFlLEVBQUcsK0NBaEJ0QjtBQWlCSUMsaUJBQWUsRUFBRyx3Q0FqQnRCO0FBa0JJQyxVQUFRLEVBQUcsNEJBbEJmO0FBbUJJQyxnQkFBYyxFQUFHLGtDQW5CckI7QUFvQklDLGVBQWEsRUFBRywyQ0FwQnBCO0FBcUJJQyxZQUFVLEVBQUcsMkJBckJqQjtBQXNCSUMsY0FBWSxFQUFHLHFEQXRCbkI7QUF1QklDLGNBQVksRUFBRyxpQkF2Qm5CO0FBd0JJQyxVQUFRLEVBQUcsZUF4QmY7QUF5QklDLHdCQUFzQixFQUFHLGlCQXpCN0I7QUEwQklDLFlBQVUsRUFBRztBQTFCakIsQ0FEQSxDOzs7Ozs7Ozs7OztBQ0FBekksTUFBTSxDQUFDQyxPQUFQLEdBQ0E7QUFDSXlJLFdBQVMsRUFBRSx5Q0FEZjtBQUVJQyxxQkFBbUIsRUFBRSw4REFGekI7QUFHSUMsU0FBTyxFQUFFLHNDQUhiO0FBSUlDLGVBQWEsRUFBRSxpQ0FKbkI7QUFLSUMsa0JBQWdCLEVBQUUsd0RBTHRCO0FBTUlDLDJCQUF5QixFQUFFLDBEQU4vQjtBQU9JQyx1QkFBcUIsRUFBRSx1Q0FQM0I7QUFRSUMsY0FBWSxFQUFFLCtDQVJsQjtBQVNJQyxtQkFBaUIsRUFBRSw4REFUdkI7QUFVSUMsVUFBUSxFQUFHLGdDQVZmO0FBV0lDLG1CQUFpQixFQUFHLCtCQVh4QjtBQVlJQyxnQkFBYyxFQUFHLG9EQVpyQjtBQWFJQyxrQkFBZ0IsRUFBRyw2Q0FidkI7QUFjSUMsYUFBVyxFQUFFLFlBZGpCO0FBZUlDLGFBQVcsRUFBRSxNQWZqQjtBQWdCSUMsYUFBVyxFQUFFLDJCQWhCakI7QUFpQklDLGVBQWEsRUFBRSw2QkFqQm5CO0FBa0JJQyxpQkFBZSxFQUFFLHNCQWxCckI7QUFtQklDLHFCQUFtQixFQUFFLDBCQW5CekI7QUFvQklDLHNCQUFvQixFQUFFLHNDQXBCMUI7QUFxQklDLHNCQUFvQixFQUFFLG9CQXJCMUI7QUFzQklDLHdCQUFzQixFQUFFLDZDQXRCNUI7QUF1QklDLGlCQUFlLEVBQUUsZ0JBdkJyQjtBQXdCSUMsOEJBQTRCLEVBQUUsdUNBeEJsQztBQXlCSUMsbUJBQWlCLEVBQUc7QUF6QnhCLENBREEsQzs7Ozs7Ozs7Ozs7QUNBQWxLLE1BQU0sQ0FBQ0MsT0FBUCxHQUNBO0FBQ0lrSixVQUFRLEVBQUUsbUNBRGQ7QUFFSWdCLFVBQVEsRUFBRSx3Q0FGZDtBQUdJQyxvQkFBa0IsRUFBRSw4RUFIeEI7QUFJSUMsV0FBUyxFQUFFLHVDQUpmO0FBS0lDLGlCQUFlLEVBQUUscUtBTHJCO0FBTUlDLHFCQUFtQixFQUFFLDRFQU56QjtBQU9JQyxjQUFZLEVBQUcsbUNBUG5CO0FBUUlDLGtCQUFnQixFQUFHLG9FQVJ2QjtBQVNJQyxnQkFBYyxFQUFFLHlHQVRwQjtBQVVJQyxZQUFVLEVBQUcsc0JBVmpCO0FBV0kxQixjQUFZLEVBQUcsMkJBWG5CO0FBWUkyQiw2QkFBMkIsRUFBRyxpREFabEM7QUFhSUMsVUFBUSxFQUFHLDRCQWJmO0FBY0lDLGtCQUFnQixFQUFHLDRCQWR2QjtBQWVJQyxzQkFBb0IsRUFBRyw4RUFmM0I7QUFnQklDLG9CQUFrQixFQUFHLDZEQWhCekI7QUFpQklDLHVCQUFxQixFQUFHLG9GQWpCNUI7QUFrQklDLHVCQUFxQixFQUFHLG9GQWxCNUI7QUFtQklDLFdBQVMsRUFBRywrREFuQmhCO0FBb0JJQyxtQkFBaUIsRUFBRSx1REFwQnZCO0FBcUJJQyxnQkFBYyxFQUFFLG1DQXJCcEI7QUFzQklDLHVCQUFxQixFQUFFLGlLQXRCM0I7QUF1QklDLDJCQUF5QixFQUFHLCtCQXZCaEM7QUF3QklDLDRCQUEwQixFQUFHLGdIQXhCakM7QUF5QklDLDZCQUEyQixFQUFHLHlKQXpCbEM7QUEwQklDLG1CQUFpQixFQUFFLCtJQTFCdkI7QUEyQklDLHdCQUFzQixFQUFFLDhCQTNCNUI7QUE0QklDLDBCQUF3QixFQUFFLG1EQTVCOUI7QUE2QklDLCtCQUE2QixFQUFFLDhCQTdCbkM7QUE4QklDLG9CQUFrQixFQUFHLGFBOUJ6QjtBQStCSUMsb0JBQWtCLEVBQUcsZ0dBL0J6QjtBQWdDSUMscUJBQW1CLEVBQUcsbUhBaEMxQjtBQWlDSUMsMkJBQXlCLEVBQUcsU0FqQ2hDO0FBa0NJQywyQkFBeUIsRUFBRyx3SEFsQ2hDO0FBbUNJQyw0QkFBMEIsRUFBRywySUFuQ2pDO0FBb0NJQywwQkFBd0IsRUFBRSw2SUFwQzlCO0FBcUNJQyxlQUFhLEVBQUUscURBckNuQjtBQXNDSUMsa0JBQWdCLEVBQUUsc0NBdEN0QjtBQXVDSUMsaUJBQWUsRUFBRSx3REF2Q3JCO0FBd0NJQyxjQUFZLEVBQUUsb0JBeENsQjtBQXlDSUMsb0JBQWtCLEVBQUUsNkhBekN4QjtBQTBDSUMsdUJBQXFCLEVBQUcsK0hBMUM1QjtBQTJDSUMsbUJBQWlCLEVBQUcsdUlBM0N4QjtBQTRDSUMsYUFBVyxFQUFFLG1DQTVDakI7QUE2Q0lDLHNCQUFvQixFQUFHLDBCQTdDM0I7QUE4Q0lDLHNCQUFvQixFQUFHLDRHQTlDM0I7QUErQ0lDLHVCQUFxQixFQUFHLHlKQS9DNUI7QUFnRElDLHNCQUFvQixFQUFHLHVJQWhEM0I7QUFpRElDLGtCQUFnQixFQUFFLDZDQWpEdEI7QUFrRElDLHNCQUFvQixFQUFHLDhGQWxEM0I7QUFtRElDLHdCQUFzQixFQUFHLDhIQW5EN0I7QUFvRElDLHdCQUFzQixFQUFHLDZDQXBEN0I7QUFxRElDLHdCQUFzQixFQUFHLDhIQXJEN0I7QUFzRElDLHlCQUF1QixFQUFHLDBJQXREOUI7QUF1RElDLDRCQUEwQixFQUFFLDhTQXZEaEM7QUF3RElDLDBCQUF3QixFQUFFLGlHQXhEOUI7QUF5RElDLDBCQUF3QixFQUFHLCtIQXpEL0I7QUEwRElDLDBCQUF3QixFQUFFLDREQTFEOUI7QUEyRElDLGdDQUE4QixFQUFHLHlFQTNEckM7QUE0RElDLG1CQUFpQixFQUFFLDhDQTVEdkI7QUE2RElDLG1CQUFpQixFQUFHLDJDQTdEeEI7QUE4RElDLG1CQUFpQixFQUFHLHNIQTlEeEI7QUErRElDLG9CQUFrQixFQUFHLGtJQS9EekI7QUFnRUlDLHVCQUFxQixFQUFFLHdKQWhFM0I7QUFpRUloRyxpQkFBZSxFQUFFLG9DQWpFckI7QUFrRUlpRyxtQkFBaUIsRUFBRSx5REFsRXZCO0FBbUVJQyx5QkFBdUIsRUFBRSx1RUFuRTdCO0FBb0VJQyw4QkFBNEIsRUFBRSxxRUFwRWxDO0FBcUVJQywyQkFBeUIsRUFBRSw0RUFyRS9CO0FBc0VJQyxpQ0FBK0IsRUFBRSxzREF0RXJDO0FBdUVJQyw0QkFBMEIsRUFBRSxtREF2RWhDO0FBd0VJQyxnQkFBYyxFQUFFLG1CQXhFcEI7QUF5RUlDLGVBQWEsRUFBRSwyRkF6RW5CO0FBMEVJQyxtQkFBaUIsRUFBRSxnTEExRXZCO0FBMkVJQyxxQkFBbUIsRUFBRSxxQ0EzRXpCO0FBNEVJQyx1QkFBcUIsRUFBRTtBQTVFM0IsQ0FEQSxDOzs7Ozs7Ozs7Ozs7Ozs7OztBQ0FBO0lBRU1DLEk7Ozs7Ozs7NEJBRWFDLEssRUFDZjtBQUNJLFVBQUdBLEtBQUssS0FBR0MsU0FBUixJQUFxQkQsS0FBSyxLQUFHLElBQWhDLEVBQ0ksT0FBTyxJQUFQLENBREosS0FHQTtBQUNJQSxhQUFLLElBQUUsRUFBUCxDQURKLENBQ2M7O0FBQ1ZBLGFBQUssR0FBQ0EsS0FBSyxDQUFDRSxJQUFOLEVBQU47QUFDQSxZQUFHRixLQUFLLEtBQUcsRUFBWCxFQUNJLE9BQU8sSUFBUCxDQURKLEtBR0ksT0FBTyxLQUFQO0FBQ1A7QUFDSjs7O2tDQUVvQkcsUSxFQUNyQjtBQUNJLFVBQUdKLElBQUksQ0FBQ0ssT0FBTCxDQUFhRCxRQUFiLENBQUgsRUFDSUEsUUFBUSxHQUFDLElBQVQsQ0FESixLQUdBO0FBQ0lBLGdCQUFRLElBQUUsRUFBVixDQURKLENBQ2lCOztBQUNiQSxnQkFBUSxHQUFDQSxRQUFRLENBQUNELElBQVQsRUFBVDtBQUNIO0FBQ0QsYUFBT0MsUUFBUDtBQUNIOzs7d0NBRzBCQSxRLEVBQVVFLEcsRUFDckM7QUFDSUYsY0FBUSxJQUFFLEVBQVYsQ0FESixDQUNpQjs7QUFDZCxVQUFHQSxRQUFRLENBQUNHLE1BQVQsR0FBa0JELEdBQXJCLEVBQ0tGLFFBQVEsR0FBQ0EsUUFBUSxDQUFDSSxTQUFULENBQW1CLENBQW5CLEVBQXVCRixHQUFHLEdBQUMsQ0FBM0IsSUFBK0IsS0FBeEM7QUFDSixhQUFPRixRQUFQO0FBQ0gsSyxDQUVEOzs7OytCQUNrQkEsUSxFQUFVSyxNLEVBQzVCO0FBQ0ksVUFBTUMsV0FBVyxHQUFHLElBQUlDLE1BQUosQ0FBV0MsTUFBTSxDQUFDQyxJQUFQLENBQVlKLE1BQVosRUFBb0JLLElBQXBCLENBQXlCLEdBQXpCLENBQVgsRUFBeUMsSUFBekMsQ0FBcEI7QUFDQSxhQUFPVixRQUFRLENBQUNXLE9BQVQsQ0FBaUJMLFdBQWpCLEVBQThCLFVBQUNNLE9BQUQsRUFDckM7QUFDSSxlQUFPUCxNQUFNLENBQUNPLE9BQUQsQ0FBYjtBQUNILE9BSE0sQ0FBUDtBQUlILEssQ0FFRDs7OztpQ0FDb0IvSyxHLEVBQUtxSyxHLEVBQ3pCO0FBQ0lySyxTQUFHLEdBQUdnTCxJQUFJLENBQUNDLElBQUwsQ0FBVWpMLEdBQVYsQ0FBTjtBQUNBcUssU0FBRyxHQUFHVyxJQUFJLENBQUNFLEtBQUwsQ0FBV2IsR0FBWCxDQUFOO0FBQ0EsYUFBT1csSUFBSSxDQUFDRSxLQUFMLENBQVdGLElBQUksQ0FBQ0csTUFBTCxNQUFpQmQsR0FBRyxHQUFHckssR0FBdkIsQ0FBWCxJQUEwQ0EsR0FBakQ7QUFDSCxLLENBRUQ7Ozs7K0JBQ2tCb0wsVSxFQUNsQjtBQUFBLFVBRDhCQyxJQUM5Qix1RUFEbUMsSUFDbkM7QUFDSSxVQUFHdEIsSUFBSSxDQUFDSyxPQUFMLENBQWFnQixVQUFiLENBQUgsRUFDSSxPQUFPLEVBQVA7QUFDSixVQUFJRSxNQUFNLEdBQUMsSUFBSUMsSUFBSixDQUFTSCxVQUFULENBQVg7QUFDQSxVQUFJSSxLQUFLLEdBQUNGLE1BQU0sQ0FBQ0csT0FBUCxLQUFpQixFQUEzQjtBQUNBLFVBQUdELEtBQUssQ0FBQ2xCLE1BQU4sS0FBZSxDQUFsQixFQUNJa0IsS0FBSyxHQUFDLE1BQUlBLEtBQVY7QUFDSixVQUFJRSxRQUFRLEdBQUVKLE1BQU0sQ0FBQ0ssUUFBUCxLQUFrQixDQUFuQixHQUFzQixFQUFuQztBQUNBLFVBQUdELFFBQVEsQ0FBQ3BCLE1BQVQsS0FBa0IsQ0FBckIsRUFDSW9CLFFBQVEsR0FBQyxNQUFJQSxRQUFiO0FBQ0osVUFBSUUsTUFBTSxHQUFDTixNQUFNLENBQUNPLFdBQVAsRUFBWDtBQUNBLFVBQUdSLElBQUksS0FBRyxJQUFWLEVBQ0ksT0FBT0csS0FBSyxHQUFDLEdBQU4sR0FBVUUsUUFBVixHQUFtQixHQUFuQixHQUF1QkUsTUFBOUIsQ0FESixLQUVLLElBQUlQLElBQUksS0FBRyxNQUFYLEVBQWtCO0FBQ25CLGVBQU9PLE1BQU0sR0FBQyxHQUFQLEdBQVdGLFFBQVgsR0FBb0IsR0FBcEIsR0FBd0JGLEtBQS9CLENBREMsS0FHRCxPQUFPRSxRQUFRLEdBQUMsR0FBVCxHQUFhRixLQUFiLEdBQW1CLEdBQW5CLEdBQXVCSSxNQUE5QjtBQUNQOzs7Ozs7QUFHTHpRLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQjJPLElBQWpCLEM7Ozs7Ozs7Ozs7O0FDaEZBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhEOzs7Ozs7Ozs7OztBQ3RCQTVPLE1BQU0sQ0FBQ0MsT0FBUCxHQUNBO0FBQ0kwUSxXQUFTLEVBQ1QsQ0FDSTtBQUFFQyxVQUFNLEVBQUUsU0FBVjtBQUFxQkMsY0FBVSxFQUFFO0FBQUVDLFVBQUksRUFBQztBQUFQO0FBQWpDLEdBREosRUFFSTtBQUFFRixVQUFNLEVBQUUsWUFBVjtBQUF3QkMsY0FBVSxFQUFFO0FBQUVDLFVBQUksRUFBQyxnQkFBUDtBQUF5QkMsUUFBRSxFQUFFO0FBQTdCO0FBQXBDLEdBRkosRUFHSTtBQUFFSCxVQUFNLEVBQUUsVUFBVjtBQUFzQkMsY0FBVSxFQUFFO0FBQUVDLFVBQUksRUFBQztBQUFQO0FBQWxDLEdBSEosRUFJSTtBQUFFRixVQUFNLEVBQUUsU0FBVjtBQUFxQkMsY0FBVSxFQUFFO0FBQUVDLFVBQUksRUFBQztBQUFQO0FBQWpDLEdBSkosQ0FGSjtBQVFJRSxXQUFTLEVBQ1QsQ0FDSTtBQUFFSixVQUFNLEVBQUUsU0FBVjtBQUFxQkMsY0FBVSxFQUFFO0FBQUVDLFVBQUksRUFBQztBQUFQO0FBQWpDLEdBREosRUFFSTtBQUFFRixVQUFNLEVBQUUsa0JBQVY7QUFBOEJDLGNBQVUsRUFBRTtBQUFFQyxVQUFJLEVBQUMsd0JBQVA7QUFBaUNHLFNBQUcsRUFBRTtBQUF0QztBQUExQyxHQUZKLEVBR0k7QUFBRUwsVUFBTSxFQUFFLHNCQUFWO0FBQWtDQyxjQUFVLEVBQUU7QUFBRUMsVUFBSSxFQUFDO0FBQVA7QUFBOUMsR0FISixFQUlJO0FBQUVGLFVBQU0sRUFBRSxRQUFWO0FBQW9CQyxjQUFVLEVBQUU7QUFBRUMsVUFBSSxFQUFDLFdBQVA7QUFBb0JHLFNBQUcsRUFBRTtBQUF6QjtBQUFoQyxHQUpKLEVBS0k7QUFBRUwsVUFBTSxFQUFFLFFBQVY7QUFBb0JDLGNBQVUsRUFBRTtBQUFFQyxVQUFJLEVBQUMsV0FBUDtBQUFvQkcsU0FBRyxFQUFFO0FBQXpCO0FBQWhDLEdBTEosQ0FUSjtBQWdCSUMseUJBQXVCLEVBQUUsRUFoQjdCO0FBaUJJQyxjQUFZLEVBQUcsY0FqQm5CO0FBa0JJQyxlQUFhLEVBQUcsWUFsQnBCO0FBbUJJQyxpQkFBZSxFQUFHLGNBbkJ0QjtBQW9CSUMsZUFBYSxFQUFHLGtCQXBCcEI7QUFxQklDLGdCQUFjLEVBQUcsZ0JBckJyQjtBQXNCSUMsYUFBVyxFQUFFLGFBdEJqQjtBQXVCSUMsOEJBQTRCLEVBQUUsb0JBdkJsQztBQXdCSUMscUJBQW1CLEVBQUUsMkJBeEJ6QjtBQXlCSUMsOEJBQTRCLEVBQUcsRUF6Qm5DO0FBMEJJQyxpQkFBZSxFQUFHLGFBMUJ0QjtBQTJCSUMsWUFBVSxFQUFFLDBCQTNCaEI7QUE0QklDLFlBQVUsRUFBRSxzQkE1QmhCO0FBNkJJQyxRQUFNLEVBQUUsa1NBN0JaO0FBOEJJQyxZQUFVLEVBQUUsdUJBOUJoQjtBQStCSUMsUUFBTSxFQUFFLCtjQS9CWjtBQWdDSUMsd0JBQXNCLEVBQUUsMENBaEM1QjtBQWlDSUMsd0JBQXNCLEVBQUUsaURBakM1QjtBQWtDSUMsa0JBQWdCLEVBQUUsNEJBbEN0QjtBQW1DSUMsZ0JBQWMsRUFBRSwyaUNBbkNwQjtBQW9DSUMsa0JBQWdCLEVBQUU7QUFwQ3RCLENBREEsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0FBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQSxJQUFNcEMsSUFBSSxHQUFDeFAsa0VBQWMsQ0FBQyxDQUFELENBQXpCOztBQUNBLElBQU02UixjQUFjLEdBQUd6UywrREFBUSxJQUFjLEdBQUNXLHlEQUFmLEdBQXFCLFVBQXJCLEdBQWdDeVAsSUFBaEMsR0FBcUMsS0FBdEMsQ0FBOUIsQyxDQUVBOzs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtDQUdBOztBQUNBLElBQU1zQyxHQUFHLEdBQUcxUyxtRUFBUSxJQUFhLEdBQUNvUSxJQUFkLEdBQW1CLFVBQXBCLENBQW5COztBQUNBLElBQU11QyxRQUFRLEdBQUczUyxnRUFBUSxJQUFhLEdBQUNvUSxJQUFkLEdBQW1CLE9BQXBCLENBQXhCOztBQUNBLElBQU13QyxnQkFBZ0IsR0FBRzVTLHlFQUFRLElBQWEsR0FBQ29RLElBQWQsR0FBbUIsZ0JBQXBCLENBQWhDLEMsQ0FFQTs7O0FBQ0EsSUFBTXlDLE9BQU8sR0FBR0MsUUFBUSxDQUFDQyxjQUFULENBQXdCLGNBQXhCLENBQWhCO0FBQ0EsSUFBTUMsVUFBVSxHQUFHRixRQUFRLENBQUNDLGNBQVQsQ0FBd0IsU0FBeEIsQ0FBbkI7QUFDQSxJQUFNRSxpQkFBaUIsR0FBR0gsUUFBUSxDQUFDQyxjQUFULENBQXdCLGdCQUF4QixDQUExQjtBQUVBRyxxRUFBUTs7QUFFUixJQUFNQyxVQUFVO0FBQUEscUVBQUc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1CQUlVQyxpRUFBUyxFQUpuQjs7QUFBQTtBQUlMQyxrQkFKSzs7QUFBQSxnQkFLUEEsTUFMTztBQUFBO0FBQUE7QUFBQTs7QUFNUEMsNEVBQVUsQ0FBQ0MsV0FBRCxFQUFjLEdBQWQsRUFBbUJiLEdBQUcsQ0FBQ3BMLFdBQXZCLEVBQW9DLEVBQXBDLEVBQXdDLENBQUMsT0FBRCxDQUF4QyxDQUFWO0FBTk87QUFBQTs7QUFBQTtBQUFBO0FBQUEsbUJBU2lCa00sb0VBQVksQ0FBQyxDQUFDLFNBQUQsRUFBWSxPQUFaLENBQUQsRUFBdUIsTUFBSWYsY0FBYyxDQUFDaEIsY0FBMUMsRUFBMEQ7QUFBRWdDLHFCQUFPLEVBQUVmLEdBQUcsQ0FBQy9LLFVBQWY7QUFBMkIrTCxtQkFBSyxFQUFDO0FBQWpDLGFBQTFELENBVDdCOztBQUFBO0FBU0RDLHVCQVRDOztBQVVQLGdCQUFHQSxXQUFILEVBQ0E7QUFDVUMsa0JBRFYsR0FDZUMseUVBQVMsQ0FBQyxNQUFELEVBQVMsSUFBVCxDQUR4QjtBQUVJQyw0RkFBaUIsQ0FBQ0YsSUFBSSxDQUFDRyxNQUFOLEVBQWN0QixjQUFkLENBQWpCO0FBQ0FhLDhFQUFVLENBQUNOLFVBQUQsRUFBYSxJQUFiLEVBQW1CTCxRQUFRLENBQUNsRSxjQUFULENBQXdCb0IsT0FBeEIsQ0FBZ0MsT0FBaEMsRUFBeUMrRCxJQUFJLENBQUNsTixJQUE5QyxDQUFuQixDQUFWO0FBQ0FtTSxxQkFBTyxDQUFDbUIsS0FBUixDQUFjQyxPQUFkLEdBQXNCLE9BQXRCOztBQUNBLGtCQUFHLENBQUM5RSwyREFBTyxDQUFDMEUseUVBQVMsQ0FBQyxTQUFELENBQVYsQ0FBWCxFQUNBO0FBQ0lQLGdGQUFVLENBQUNOLFVBQUQsRUFBYSxHQUFiLEVBQWtCYSx5RUFBUyxDQUFDLFNBQUQsRUFBWSxJQUFaLENBQVQsQ0FBMkJKLE9BQTdDLEVBQXNELEVBQXRELEVBQTBELENBQUNJLHlFQUFTLENBQUMsU0FBRCxFQUFZLElBQVosQ0FBVCxDQUEyQkgsS0FBNUIsQ0FBMUQsRUFBOEYsRUFBOUYsRUFBa0csS0FBbEcsQ0FBVjtBQUNBUSw0RkFBWSxDQUFDLFNBQUQsQ0FBWjtBQUNILGVBVEwsQ0FVSTs7O0FBQ01DLHNCQVhWLEdBV3FCLElBQUlDLGNBQUosRUFYckI7QUFZSUQsc0JBQVEsQ0FBQ0UsSUFBVCxDQUFjLEtBQWQsRUFBcUJqVSwwREFBTSxHQUFDaVQsTUFBTSxDQUFDOU4sVUFBZCxHQUF5QjhOLE1BQU0sQ0FBQ2pQLGFBQXJEOztBQUNBK1Asc0JBQVEsQ0FBQ0csa0JBQVQsR0FBOEIsWUFDOUI7QUFDSSxvQkFBSSxLQUFLQyxVQUFMLElBQW1CSCxjQUFjLENBQUNJLElBQXRDLEVBQ0E7QUFDSSxzQkFBSUMsUUFBUSxHQUFDQyxJQUFJLENBQUNDLEtBQUwsQ0FBVyxLQUFLQyxZQUFoQixDQUFiOztBQUNBLHNCQUFJLEtBQUtiLE1BQUwsS0FBZ0IsR0FBcEIsRUFDQTtBQUNJLHdCQUFNYyxPQUFPLEdBQ2I7QUFDSUMsa0NBQVksRUFBR0wsUUFBUSxDQUFDTSxhQUQ1QjtBQUVJQywwQ0FBb0IsRUFBR1AsUUFBUSxDQUFDUSxhQUFULENBQXVCQyxrQkFGbEQ7QUFHSUMsMENBQW9CLEVBQUdWLFFBQVEsQ0FBQ1csaUJBSHBDO0FBSUlDLG9DQUFjLEVBQUdaLFFBQVEsQ0FBQ2EsT0FBVCxDQUFpQkMsWUFKdEM7QUFLSUMsa0NBQVksRUFBR2YsUUFBUSxDQUFDZ0IsYUFMNUI7QUFNSUMsMENBQW9CLEVBQUdqQixRQUFRLENBQUNRLGFBQVQsQ0FBdUJVLGtCQU5sRDtBQU9JQyw4Q0FBd0IsRUFBR25CLFFBQVEsQ0FBQ1EsYUFBVCxDQUF1Qlksc0JBUHREO0FBUUlDLG9DQUFjLEVBQUdyQixRQUFRLENBQUNhLE9BQVQsQ0FBaUJTLFlBUnRDO0FBU0lDLDBDQUFvQixFQUFHdkIsUUFBUSxDQUFDd0IsaUJBVHBDO0FBVUlDLDhDQUF3QixFQUFHekIsUUFBUSxDQUFDMEIsd0JBVnhDO0FBV0lDLDhDQUF3QixFQUFHM0IsUUFBUSxDQUFDNEI7QUFYeEMscUJBREE7QUFjQS9DLG9GQUFVLENBQUNOLFVBQUQsRUFBYSxHQUFiLEVBQWtCc0QsOERBQVUsQ0FBQzVELEdBQUcsQ0FBQy9KLFVBQUwsRUFBaUJrTSxPQUFqQixDQUE1QixFQUF1RCxFQUF2RCxFQUEyRCxFQUEzRCxFQUErRCxFQUEvRCxFQUFtRSxLQUFuRSxDQUFWO0FBQ0g7QUFDSjtBQUNKLGVBeEJEOztBQXlCQVYsc0JBQVEsQ0FBQ29DLGdCQUFULENBQTBCLGVBQTFCLEVBQTJDLFlBQVUzQyxJQUFJLENBQUM0QyxLQUExRDtBQUNBckMsc0JBQVEsQ0FBQ3NDLElBQVQsR0F2Q0osQ0F5Q0k7O0FBQ01DLG1DQTFDVixHQTBDa0MsSUFBSXRDLGNBQUosRUExQ2xDO0FBMkNJc0MsbUNBQXFCLENBQUNyQyxJQUF0QixDQUEyQixLQUEzQixFQUFrQ2pVLDBEQUFNLEdBQUNpVCxNQUFNLENBQUMvUCxtQkFBZCxHQUFrQytQLE1BQU0sQ0FBQ3ZQLHlCQUEzRTs7QUFDQTRTLG1DQUFxQixDQUFDcEMsa0JBQXRCLEdBQTJDLFlBQzNDO0FBQ0ksb0JBQUksS0FBS0MsVUFBTCxJQUFtQkgsY0FBYyxDQUFDSSxJQUF0QyxFQUNBO0FBQ0ksc0JBQUlDLFFBQVEsR0FBQ0MsSUFBSSxDQUFDQyxLQUFMLENBQVcsS0FBS0MsWUFBaEIsQ0FBYjs7QUFDQSxzQkFBSSxLQUFLYixNQUFMLEtBQWdCLEdBQWhCLElBQXVCNEMsS0FBSyxDQUFDQyxPQUFOLENBQWNuQyxRQUFRLENBQUN4VSxjQUF2QixDQUEzQixFQUNBO0FBQ0ksd0JBQUk0VyxRQUFRLEdBQUMsRUFBYjs7QUFDQSx5QkFBSSxJQUFJQyxDQUFSLElBQWFyQyxRQUFRLENBQUN4VSxjQUF0QixFQUNBO0FBQ0k0Vyw4QkFBUSxJQUFFLFNBQU9FLDhEQUFVLENBQUN0QyxRQUFRLENBQUN4VSxjQUFULENBQXdCNlcsQ0FBeEIsRUFBMkJFLGNBQTVCLEVBQTRDLElBQTVDLENBQWpCLEdBQW1FLGFBQW5FLEdBQWlGdkUsY0FBYyxDQUFDZCw0QkFBaEcsR0FBNkgsTUFBN0gsR0FBb0k4QyxRQUFRLENBQUN4VSxjQUFULENBQXdCNlcsQ0FBeEIsRUFBMkI3RixFQUEvSixHQUFrSyxJQUFsSyxHQUF1S3dELFFBQVEsQ0FBQ3hVLGNBQVQsQ0FBd0I2VyxDQUF4QixFQUEyQnhTLEtBQWxNLEdBQXdNLE1BQWxOO0FBQ0EsMEJBQUdtUSxRQUFRLENBQUN4VSxjQUFULENBQXdCNlcsQ0FBeEIsRUFBMkJHLGFBQTNCLEtBQTJDLEtBQTlDLEVBQ0lKLFFBQVEsSUFBRSwyQkFBeUJqRSxnQkFBZ0IsQ0FBQzFJLGVBQTFDLEdBQTBELFFBQXBFO0FBQ0oyTSw4QkFBUSxJQUFFLE9BQVY7QUFDSDs7QUFDRCx3QkFBR3BDLFFBQVEsQ0FBQ3hVLGNBQVQsQ0FBd0JvUCxNQUF4QixLQUFpQyxDQUFwQyxFQUNRaUUsZ0VBQVUsQ0FBQ0wsaUJBQUQsRUFBb0IsSUFBcEIsRUFBMEJMLGdCQUFnQixDQUFDM0ksc0JBQWpCLENBQXdDNEYsT0FBeEMsQ0FBZ0QsS0FBaEQsRUFBdUQ0RSxRQUFRLENBQUN4VSxjQUFULENBQXdCb1AsTUFBL0UsQ0FBMUIsQ0FBVjtBQUNSaUUsb0ZBQVUsQ0FBQ0wsaUJBQUQsRUFBb0IsSUFBcEIsRUFBMEJMLGdCQUFnQixDQUFDekksNEJBQWpCLEdBQThDNE0sOERBQVUsQ0FBQ3RDLFFBQVEsQ0FBQ3lDLFVBQVYsRUFBc0IsSUFBdEIsQ0FBbEYsRUFBK0csRUFBL0csRUFBbUgsQ0FBQyxhQUFELENBQW5ILEVBQW9JLEVBQXBJLEVBQXdJLEtBQXhJLENBQVY7QUFDQTVELG9GQUFVLENBQUNMLGlCQUFELEVBQW9CLElBQXBCLEVBQTBCNEQsUUFBMUIsRUFBb0MsRUFBcEMsRUFBd0MsRUFBeEMsRUFBNEMsRUFBNUMsRUFBZ0QsS0FBaEQsQ0FBVjtBQUNIO0FBQ0o7QUFDSixlQXJCRDs7QUFzQkFILG1DQUFxQixDQUFDSCxnQkFBdEIsQ0FBdUMsZUFBdkMsRUFBd0QsWUFBVTNDLElBQUksQ0FBQzRDLEtBQXZFO0FBQ0FFLG1DQUFxQixDQUFDRCxJQUF0QjtBQUNIOztBQS9FTTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBb0ZYbkQsNEVBQVUsQ0FBQ04sVUFBRCxFQUFhLEdBQWIsRUFBa0JOLEdBQUcsQ0FBQ3BMLFdBQXRCLEVBQW1DLEVBQW5DLEVBQXVDLENBQUMsT0FBRCxDQUF2QyxDQUFWOztBQXBGVztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxHQUFIOztBQUFBLGtCQUFWNkwsVUFBVTtBQUFBO0FBQUE7QUFBQSxHQUFoQjs7QUF1RkFBLFVBQVUsRzs7Ozs7Ozs7Ozs7O0FDdkhWO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVPLElBQU1nRSxVQUFVLEdBQUcsU0FBYkEsVUFBYSxDQUFDelEsSUFBRCxFQUFPMFEsSUFBUCxFQUMxQjtBQUNJQyxjQUFZLENBQUNDLE9BQWIsQ0FBcUI1USxJQUFyQixFQUEyQmdPLElBQUksQ0FBQzZDLFNBQUwsQ0FBZUgsSUFBZixDQUEzQjtBQUNILENBSE07QUFLQSxJQUFNdkQsU0FBUyxHQUFHLFNBQVpBLFNBQVksQ0FBQ25OLElBQUQsRUFDekI7QUFBQSxNQURnQzhRLElBQ2hDLHVFQURxQyxLQUNyQztBQUNJLE1BQUdBLElBQUgsRUFDSSxPQUFPOUMsSUFBSSxDQUFDQyxLQUFMLENBQVcwQyxZQUFZLENBQUNJLE9BQWIsQ0FBcUIvUSxJQUFyQixDQUFYLENBQVAsQ0FESixLQUdJLE9BQU8yUSxZQUFZLENBQUNJLE9BQWIsQ0FBcUIvUSxJQUFyQixDQUFQO0FBQ1AsQ0FOTTtBQVFBLElBQU13TixZQUFZLEdBQUcsU0FBZkEsWUFBZSxDQUFDeE4sSUFBRCxFQUM1QjtBQUNJMlEsY0FBWSxDQUFDSyxVQUFiLENBQXdCaFIsSUFBeEI7QUFDSCxDQUhNLEM7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQ2RQOztBQUNPLElBQU00TSxVQUFVLEdBQUcsU0FBYkEsVUFBYSxDQUFDcUUsU0FBRCxFQUFZQyxPQUFaLEVBQzFCO0FBQUEsTUFEK0NDLFVBQy9DLHVFQUQwRCxFQUMxRDtBQUFBLE1BRDhEQyxLQUM5RCx1RUFEb0UsRUFDcEU7QUFBQSxNQUR3RUMsUUFDeEUsdUVBRGlGLEVBQ2pGO0FBQUEsTUFEcUZDLGFBQ3JGLHVFQURtRyxFQUNuRztBQUFBLE1BRHVHbkksT0FDdkcsdUVBRCtHLElBQy9HO0FBQ0ksTUFBR1YsMkRBQU8sQ0FBQ3lJLE9BQUQsQ0FBUCxJQUFvQnpJLDJEQUFPLENBQUN3SSxTQUFELENBQTlCLEVBQ0ksT0FBTyxLQUFQLENBREosS0FHQTtBQUNJLFFBQU1NLFVBQVUsR0FBQ25GLFFBQVEsQ0FBQ29GLGFBQVQsQ0FBdUJOLE9BQXZCLENBQWpCO0FBRUEsUUFBRyxDQUFDekksMkRBQU8sQ0FBQzJJLEtBQUQsQ0FBWCxFQUFtQjtBQUNmRyxnQkFBVSxDQUFDaEgsRUFBWCxHQUFjNkcsS0FBZDs7QUFFSixRQUFHbkIsS0FBSyxDQUFDQyxPQUFOLENBQWNtQixRQUFkLEtBQTJCQSxRQUFRLENBQUMxSSxNQUFULElBQWlCLENBQS9DLEVBQ0E7QUFDSSxXQUFJLElBQUl5SCxDQUFSLElBQWFpQixRQUFiO0FBQ0lFLGtCQUFVLENBQUNFLFNBQVgsQ0FBcUJDLEdBQXJCLENBQXlCTCxRQUFRLENBQUNqQixDQUFELENBQWpDO0FBREo7QUFFSDs7QUFFRCxRQUFHLFFBQU9rQixhQUFQLE1BQXlCLFFBQTVCLEVBQXNDO0FBQ3RDO0FBQ0ksYUFBSSxJQUFJSyxZQUFSLElBQXdCTCxhQUF4QjtBQUNJQyxvQkFBVSxDQUFDSyxZQUFYLENBQXdCRCxZQUF4QixFQUFzQ0wsYUFBYSxDQUFDSyxZQUFELENBQW5EO0FBREo7QUFFSDs7QUFFRCxRQUFHLENBQUNsSiwyREFBTyxDQUFDMEksVUFBRCxDQUFYLEVBQ0lJLFVBQVUsQ0FBQ00sU0FBWCxHQUFxQlYsVUFBVSxDQUFDaEksT0FBWCxDQUFtQixLQUFuQixFQUF5QixNQUF6QixDQUFyQixDQW5CUixDQW1COEQ7O0FBRTFELFFBQUdBLE9BQUgsRUFDSThILFNBQVMsQ0FBQ1ksU0FBVixHQUFvQixFQUFwQjtBQUNKWixhQUFTLENBQUNhLFdBQVYsQ0FBc0JQLFVBQXRCO0FBQ0g7QUFDSixDQTlCTSxDOzs7Ozs7Ozs7Ozs7QUNIUDtBQUFBO0FBQUE7QUFBQTtBQUVPLElBQU0vRSxRQUFRLEdBQUcsU0FBWEEsUUFBVyxHQUN4QjtBQUNJdUYsU0FBTyxDQUFDQyxHQUFSLENBQVksK0xBQVo7QUFDQSxTQUFPLElBQVA7QUFDSCxDQUpNO0FBTUEsSUFBTTVFLGlCQUFpQixHQUFHLFNBQXBCQSxpQkFBb0IsQ0FBQ0MsTUFBRCxFQUFTNEUsY0FBVCxFQUNqQztBQUNJLE1BQU1DLElBQUksR0FBQzlGLFFBQVEsQ0FBQ0MsY0FBVCxDQUF3QixpQkFBeEIsQ0FBWDtBQUNBLE1BQU04RixRQUFRLEdBQUM5RSxNQUFNLEdBQUMsVUFBdEI7QUFDQTZFLE1BQUksQ0FBQzVILElBQUwsR0FBVSxNQUFJMkgsY0FBYyxDQUFDRSxRQUFELENBQTVCO0FBQ0gsQ0FMTSxDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNSUDtBQUNBLElBQU16SSxJQUFJLEdBQUN4UCxrRUFBYyxDQUFDLENBQUQsQ0FBekI7O0FBRUEsSUFBTStYLGNBQWMsR0FBRzNZLCtEQUFRLElBQWlCLEdBQUNXLHlEQUFsQixHQUF3QixVQUF4QixHQUFtQ3lQLElBQW5DLEdBQXdDLEtBQXpDLENBQTlCOztBQUNBO0FBRUE7Q0FHQTtBQUNBOztBQUNPLElBQU1nRCxTQUFTO0FBQUEscUVBQUk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLDZDQUVmLElBQUkwRixPQUFKLENBQVksVUFBQ0MsT0FBRCxFQUFVQyxNQUFWLEVBQ25CO0FBQ0ksa0JBQU1DLEdBQUcsR0FBRyxJQUFJN0UsY0FBSixFQUFaO0FBQ0E2RSxpQkFBRyxDQUFDNUUsSUFBSixDQUFTLEtBQVQsRUFBZ0JqVSwwREFBTSxHQUFDLGlCQUF2Qjs7QUFDQTZZLGlCQUFHLENBQUNDLE1BQUosR0FBYTtBQUFBLHVCQUFNSCxPQUFPLENBQUNyRSxJQUFJLENBQUNDLEtBQUwsQ0FBV3NFLEdBQUcsQ0FBQ3JFLFlBQWYsQ0FBRCxDQUFiO0FBQUEsZUFBYjs7QUFDQXFFLGlCQUFHLENBQUNFLE9BQUosR0FBYztBQUFBLHVCQUFNSCxNQUFNLENBQUNDLEdBQUcsQ0FBQ0csVUFBTCxDQUFaO0FBQUEsZUFBZDs7QUFDQUgsaUJBQUcsQ0FBQ3hDLElBQUo7QUFDSCxhQVBNLENBRmU7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsR0FBSjs7QUFBQSxrQkFBVHJELFNBQVM7QUFBQTtBQUFBO0FBQUEsR0FBZjtBQVlBLElBQU1pRyxpQkFBaUIsR0FBRyxTQUFwQkEsaUJBQW9CLEdBQ2pDO0FBQ0ksTUFBTUMsU0FBUyxHQUFDLElBQUloSixJQUFKLEdBQVdpSixpQkFBWCxFQUFoQjtBQUNBLE1BQUdELFNBQVMsR0FBR3JTLGtFQUFaLElBQWlDcVMsU0FBUyxHQUFHdFMsa0VBQWhELEVBQ0ksT0FBTyxDQUFQLENBREosS0FFSyxPQUFPc1MsU0FBUDtBQUNSLENBTk0sQyxDQVFQO0FBQ0E7O0FBQ08sSUFBTUUsV0FBVyxHQUFHLFNBQWRBLFdBQWMsQ0FBQ0MsUUFBRCxFQUFXQyxRQUFYLEVBQzNCO0FBQ0ksTUFBTUMsS0FBSyxHQUFDRixRQUFRLEdBQUMxSixJQUFJLENBQUNFLEtBQUwsQ0FBV0YsSUFBSSxDQUFDRyxNQUFMLE1BQWV3SixRQUFRLEdBQUNELFFBQXhCLENBQVgsQ0FBckI7QUFDQSxNQUFNRyxPQUFPLEdBQUMsb0RBQWQ7QUFDQSxNQUFNQyxNQUFNLEdBQUMsOEJBQWI7QUFDQSxNQUFJaFgsUUFBUSxHQUFDK1csT0FBTyxDQUFDN0osSUFBSSxDQUFDRSxLQUFMLENBQVdGLElBQUksQ0FBQ0csTUFBTCxLQUFjMEosT0FBTyxDQUFDdkssTUFBakMsQ0FBRCxDQUFwQjs7QUFDQSxPQUFJLElBQUl5SCxDQUFDLEdBQUMsQ0FBVixFQUFZQSxDQUFDLEdBQUU2QyxLQUFLLEdBQUMsQ0FBckIsRUFBd0I3QyxDQUFDLEVBQXpCLEVBQ0E7QUFDSSxRQUFJQSxDQUFDLEdBQUcsQ0FBTCxLQUFXLENBQWQsRUFDSWpVLFFBQVEsSUFBRWdYLE1BQU0sQ0FBQzlKLElBQUksQ0FBQ0UsS0FBTCxDQUFXRixJQUFJLENBQUNHLE1BQUwsS0FBYzJKLE1BQU0sQ0FBQ3hLLE1BQWhDLENBQUQsQ0FBaEIsQ0FESixLQUdJeE0sUUFBUSxJQUFFK1csT0FBTyxDQUFDN0osSUFBSSxDQUFDRSxLQUFMLENBQVdGLElBQUksQ0FBQ0csTUFBTCxLQUFjMEosT0FBTyxDQUFDdkssTUFBakMsQ0FBRCxDQUFqQjtBQUNQOztBQUNEeE0sVUFBUSxJQUFFK1csT0FBTyxDQUFDN0osSUFBSSxDQUFDRSxLQUFMLENBQVdGLElBQUksQ0FBQ0csTUFBTCxLQUFjMEosT0FBTyxDQUFDdkssTUFBakMsQ0FBRCxDQUFqQjtBQUNBLFNBQU94TSxRQUFQO0FBQ0gsQ0FmTSxDLENBaUJQO0FBQ0E7O0FBQ08sSUFBTWlYLFVBQVUsR0FBRyxTQUFiQSxVQUFhLENBQUNDLE1BQUQsRUFBU3ZELEtBQVQsRUFBZ0J3RCxVQUFoQixFQUMxQjtBQUNJLE1BQU1DLFdBQVcsR0FDakI7QUFDSWhKLE1BQUUsRUFBRThJLE1BRFI7QUFFSXZELFNBQUssRUFBRUEsS0FGWDtBQUdJMEQsWUFBUSxFQUFFRjtBQUhkLEdBREE7QUFNQTdDLHNFQUFVLENBQUMsTUFBRCxFQUFTOEMsV0FBVCxDQUFWO0FBQ0gsQ0FUTSxDLENBV1A7QUFDQTs7QUFDTyxJQUFNRSxnQkFBZ0IsR0FBRyxTQUFuQkEsZ0JBQW1CLENBQUNDLEtBQUQsRUFDaEM7QUFDSSxNQUFNQyxVQUFVLEdBQUN4RyxtRUFBUyxDQUFDLFlBQUQsQ0FBMUI7O0FBQ0EsTUFBRyxDQUFDMUUsMkRBQU8sQ0FBQ2tMLFVBQUQsQ0FBWCxFQUNBO0FBQ0ksUUFBTUMsTUFBTSxHQUFDNUYsSUFBSSxDQUFDQyxLQUFMLENBQVcwRixVQUFYLENBQWI7O0FBQ0EsUUFBRyxDQUFDbEwsMkRBQU8sQ0FBQ21MLE1BQU0sQ0FBQ0osUUFBUixDQUFSLElBQTZCLENBQUMvSywyREFBTyxDQUFDbUwsTUFBTSxDQUFDQyxnQkFBUixDQUFyQyxJQUFrRSxDQUFDcEwsMkRBQU8sQ0FBQ21MLE1BQU0sQ0FBQ0UsZUFBUixDQUExRSxJQUFzRyxDQUFDckwsMkRBQU8sQ0FBQ21MLE1BQU0sQ0FBQ0csV0FBUixDQUFqSCxFQUNBO0FBQ0lMLFdBQUssQ0FBQ0YsUUFBTixHQUFlSSxNQUFNLENBQUNKLFFBQXRCO0FBQ0FFLFdBQUssQ0FBQ0csZ0JBQU4sR0FBdUJELE1BQU0sQ0FBQ0MsZ0JBQTlCO0FBQ0FILFdBQUssQ0FBQ0ksZUFBTixHQUFzQkYsTUFBTSxDQUFDRSxlQUE3QjtBQUNBSixXQUFLLENBQUNLLFdBQU4sR0FBa0JILE1BQU0sQ0FBQ0csV0FBekI7QUFDSDtBQUNKOztBQUNELFNBQU9MLEtBQVA7QUFDSCxDQWZNLEMsQ0FpQlA7QUFDQTs7QUFDTyxJQUFNNUcsWUFBWTtBQUFBLHNFQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQU9PLGtCQUFQLDhEQUFjLEVBQWQ7QUFBa0IyRywwQkFBbEI7QUFBa0NqSCxtQkFBbEM7QUFBMkNrSCxxQkFBM0M7QUFBQSw4Q0FFakIsSUFBSTdCLE9BQUosQ0FBWSxVQUFDQyxPQUFELEVBQVVDLE1BQVYsRUFDbkI7QUFDSSxrQkFBTTRCLFNBQVMsR0FBQy9HLG1FQUFTLENBQUMsTUFBRCxDQUF6Qjs7QUFDQSxrQkFBRzFFLDJEQUFPLENBQUN5TCxTQUFELENBQVYsRUFDQTtBQUNJQyw0QkFBWSxDQUFDSCxjQUFELEVBQWlCakgsT0FBakIsRUFBMEJrSCxTQUExQixDQUFaO0FBQ0E1Qix1QkFBTyxDQUFDLEtBQUQsQ0FBUDtBQUNILGVBSkQsTUFNQTtBQUNJLG9CQUFNbkYsSUFBSSxHQUFDYyxJQUFJLENBQUNDLEtBQUwsQ0FBV2lHLFNBQVgsQ0FBWDs7QUFDQSxvQkFBR3pMLDJEQUFPLENBQUN5RSxJQUFJLENBQUMzQyxFQUFOLENBQVAsSUFBb0I5QiwyREFBTyxDQUFDeUUsSUFBSSxDQUFDNEMsS0FBTixDQUEzQixJQUEyQ3JILDJEQUFPLENBQUN5RSxJQUFJLENBQUNzRyxRQUFOLENBQWxELElBQXFFdEcsSUFBSSxDQUFDc0csUUFBTCxHQUFnQjVKLElBQUksQ0FBQ3dLLEdBQUwsRUFBeEYsRUFDQTtBQUNJNUcsd0ZBQVksQ0FBQyxNQUFELENBQVo7QUFDQTJHLDhCQUFZLENBQUNILGNBQUQsRUFBaUJqSCxPQUFqQixFQUEwQmtILFNBQTFCLENBQVo7QUFDQTVCLHlCQUFPLENBQUMsS0FBRCxDQUFQO0FBQ0gsaUJBTEQsTUFPQTtBQUNJLHNCQUFNRSxHQUFHLEdBQUcsSUFBSTdFLGNBQUosRUFBWjtBQUNBNkUscUJBQUcsQ0FBQzVFLElBQUosQ0FBUyxLQUFULEVBQWdCalUsMERBQU0sR0FBQ21GLDJEQUFQLEdBQWtCSyxnRUFBbEIsR0FBa0NnTyxJQUFJLENBQUM0QyxLQUF2RDs7QUFDQXlDLHFCQUFHLENBQUNDLE1BQUosR0FBYSxZQUNiO0FBQ0ksd0JBQUl6RSxRQUFRLEdBQUNDLElBQUksQ0FBQ0MsS0FBTCxDQUFXc0UsR0FBRyxDQUFDckUsWUFBZixDQUFiOztBQUNBLHdCQUFJcUUsR0FBRyxDQUFDbEYsTUFBSixLQUFlLEdBQWYsSUFBc0JVLFFBQVEsQ0FBQ3NHLE9BQS9CLElBQTBDdEcsUUFBUSxDQUFDeEQsRUFBVCxJQUFlakMsU0FBN0QsRUFDQTtBQUNJLDBCQUFHeUYsUUFBUSxDQUFDeEQsRUFBVCxLQUFjMkMsSUFBSSxDQUFDM0MsRUFBdEIsRUFDQTtBQUNJMkMsNEJBQUksQ0FBQ2xOLElBQUwsR0FBVStOLFFBQVEsQ0FBQy9OLElBQW5CO0FBQ0FrTiw0QkFBSSxDQUFDb0gsUUFBTCxHQUFjdkcsUUFBUSxDQUFDdUcsUUFBdkI7QUFDQXBILDRCQUFJLENBQUNxSCxjQUFMLEdBQW9CeEcsUUFBUSxDQUFDd0csY0FBN0I7QUFDQXJILDRCQUFJLENBQUNHLE1BQUwsR0FBWVUsUUFBUSxDQUFDVixNQUFyQixDQUpKLENBSWdDOztBQUM1Qm9ELDRGQUFVLENBQUMsTUFBRCxFQUFTdkQsSUFBVCxDQUFWLENBTEosQ0FNSTs7QUFDQSw0QkFBR2EsUUFBUSxDQUFDVixNQUFULEtBQWtCLE1BQWxCLElBQTRCVSxRQUFRLENBQUN5RyxRQUFULElBQXFCLENBQXBELEVBQ0E7QUFDSSw4QkFBTUMsVUFBVSxHQUFDOWEsMkRBQU8sR0FBQyxHQUFSLEdBQVlzWSxjQUFjLENBQUN2SSxJQUFELENBQWQsQ0FBcUJzQixXQUFsRDtBQUNBLDhCQUFHMEosTUFBTSxDQUFDQyxRQUFQLENBQWdCckssSUFBaEIsQ0FBcUJzSyxPQUFyQixDQUE2QkgsVUFBN0IsTUFBMkMsQ0FBQyxDQUEvQyxFQUNJQyxNQUFNLENBQUNDLFFBQVAsQ0FBZ0JFLE1BQWhCLENBQXVCLE1BQUk1QyxjQUFjLENBQUN2SSxJQUFELENBQWQsQ0FBcUJzQixXQUFoRCxFQUhSLENBR3FFOztBQUNqRXFILGlDQUFPLENBQUMsSUFBRCxDQUFQO0FBQ0gseUJBTkQsTUFRQTtBQUNJLDhCQUFHaEYsTUFBTSxDQUFDMUUsTUFBUCxLQUFnQixDQUFoQixJQUFxQjBFLE1BQU0sQ0FBQ3VILE9BQVAsQ0FBZTdHLFFBQVEsQ0FBQ1YsTUFBeEIsTUFBa0MsQ0FBQyxDQUEzRCxFQUNBO0FBQ0k4Ryx3Q0FBWSxDQUFDSCxjQUFELEVBQWlCakgsT0FBakIsRUFBMEJrSCxTQUExQixDQUFaO0FBQ0E1QixtQ0FBTyxDQUFDLEtBQUQsQ0FBUDtBQUNILDJCQUpELE1BTUlBLE9BQU8sQ0FBQyxJQUFELENBQVA7QUFDUDtBQUNKLHVCQXpCRCxNQTJCQTtBQUNJN0UsOEZBQVksQ0FBQyxNQUFELENBQVo7QUFDQTJHLG9DQUFZLENBQUNILGNBQUQsRUFBaUJqSCxPQUFqQixFQUEwQmtILFNBQTFCLENBQVo7QUFDQTVCLCtCQUFPLENBQUMsS0FBRCxDQUFQO0FBQ0g7QUFDSixxQkFsQ0QsTUFvQ0E7QUFDSTdFLDRGQUFZLENBQUMsTUFBRCxDQUFaO0FBQ0EyRyxrQ0FBWSxDQUFDSCxjQUFELEVBQWlCakgsT0FBakIsRUFBMEJrSCxTQUExQixDQUFaO0FBQ0E1Qiw2QkFBTyxDQUFDLEtBQUQsQ0FBUDtBQUNIO0FBQ0osbUJBNUNEOztBQTZDQUUscUJBQUcsQ0FBQ0UsT0FBSixHQUFjO0FBQUEsMkJBQU1ILE1BQU0sQ0FBQ0MsR0FBRyxDQUFDRyxVQUFMLENBQVo7QUFBQSxtQkFBZDs7QUFDQUgscUJBQUcsQ0FBQ3hDLElBQUo7QUFDSDtBQUNKO0FBQ0osYUF0RU0sQ0FGaUI7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsR0FBSDs7QUFBQSxrQkFBWmpELFlBQVk7QUFBQTtBQUFBO0FBQUEsR0FBbEIsQyxDQTBFUDs7QUFDQSxJQUFNcUgsWUFBWSxHQUFHLFNBQWZBLFlBQWUsQ0FBQ0gsY0FBRCxFQUFpQmpILE9BQWpCLEVBQTBCa0gsU0FBMUIsRUFDckI7QUFDSSxNQUFHLENBQUN4TCwyREFBTyxDQUFDc0UsT0FBRCxDQUFYLEVBQ0kwRCxvRUFBVSxDQUFDLFNBQUQsRUFBWTFELE9BQVosQ0FBVjtBQUNKLE1BQUcsQ0FBQ3RFLDJEQUFPLENBQUN3TCxTQUFELENBQVgsRUFDSXhELG9FQUFVLENBQUMsS0FBRCxFQUFRd0QsU0FBUixDQUFWO0FBQ0osTUFBRyxDQUFDeEwsMkRBQU8sQ0FBQ3VMLGNBQUQsQ0FBWCxFQUNJVSxNQUFNLENBQUNDLFFBQVAsQ0FBZ0JFLE1BQWhCLENBQXVCYixjQUF2QjtBQUNQLENBUkQsQyIsImZpbGUiOiIuL0pTL2hvbWVNYW5hZ2VyLmFwcC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL2hvbWVNYW5hZ2VyLmpzXCIpO1xuIiwiY29uc3QgdXNlcnMgPSByZXF1aXJlKFwiLi91c2Vyc1wiKTtcbmNvbnN0IHF1ZXN0aW9ubmFpcmVzID0gcmVxdWlyZShcIi4vcXVlc3Rpb25uYWlyZXNcIik7XG5cbm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBhcGlVcmw6IFwiaHR0cDovL2xvY2FsaG9zdDozMDAwL2FwaVwiLFxuICAgIHNpdGVVcmw6IFwiaHR0cDovL2xvY2FsaG9zdDo4MDgwXCIsXG4gICAgYWRtaW5OYW1lOiBcIkZhYnJpY2VcIixcbiAgICBhZG1pbkVtYWlsOiBcImRldkB3aWtpbGVybmkuY29tXCIsXG4gICAgc2VuZGVyTmFtZTogXCJXaWtpTGVybmlcIixcbiAgICBzZW5kZXJFbWFpbDogXCJib25qb3VyQHdpa2lsZXJuaS5jb21cIixcbiAgICBhZG1pbkxhbmc6IFwiZnJcIixcbiAgICB0aGVtZTogXCJkZWZhdWx0XCIsIC8vIGxlIHRow6htZSB1dGlsaXPDqSAoZGFucyAvdmlld3MpIHBvdXIgZ8OpbsOpcmVyIGxlcyBwYWdlcyBIVE1MLiBDb250aWVudCBzZXMgcHJvcHJlcyBmaWNoaWVycyBkZSBjb25maWd1cmF0aW9uLlxuICAgIGF2YWlsYWJsZUxhbmdzOiBbXCJmclwiXSwvLyBMYW5ndWFnZXMgaW4gd2hpY2ggdGhlIHNpdGUgaXMgYXZhaWxhYmxlLiBUaGUgZmlyc3Qgb25lIGlzIHRoZSBkZWZhdWx0IG9uZS5cbiAgICBzaXRlTmFtZTogXCJXaWtpTGVybmlcIixcbiAgICBiZWdpbkNvZGVHb2RmYXRoZXI6IFwid2lraWxlcm5pXCIsIC8vIGNhc2Utc2Vuc2l0aXZlIGFuZCBjYW4ndCBjb250YWluIFwiQFwiICFcbiAgICBjcm9uVGltaW5nQWxlcnRJblNlY29uZGU6IDEyMCwgLy8gZm9yIGxvZ3NcbiAgICByZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlOiAzLCAvLyBpZGVtXG4gICAgdG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnM6IFwiNDhoXCIsIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96ZWl0L21zXG4gICAgdG9rZW5Mb2dpbkxpbmtUaW1lSW5Ib3VyczogXCIxaFwiLFxuICAgIHRva2VuQ29ubmV4aW9uTWluVGltZUluSG91cnM6IFwiMjRoXCIsXG4gICAgdG9rZW5Db25uZXhpb25NYXhUaW1lSW5EYXlzOiBcIjE4MCBkYXlzXCIsXG4gICAgdG9rZW5Mb2dpbkNoYW5naW5nVGltZUluSG91cnM6IFwiMWhcIiwvLyBmb3IgZW1haWwgJiBwYXNzd29yZCBjaGFuZ2luZ1xuICAgIHRva2VuRGVsZXRlVXNlclRpbWVJbkhvdXJzOiBcIjFoXCIsXG4gICAgdG9rZW5VbnN1YnNjcmliZUxpbmtUaW1lSW5EYXlzOiBcIjcgZGF5c1wiLCAvLyB0b2tlbiBzZW5kIHdpdGggc3Vic2NyaXB0aW9uJ3MgZW1haWxzXG4gICAgZnJlZUFjY291bnRUaW1pbmdJbkRheXM6IDEwLFxuICAgIGZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5czogNSxcbiAgICBhY2NvdW50RXhwaXJhdGlvbkZpcnN0Tm90aWZpY2F0aW9uSW5EYXlzOiAxNCwgICAgXG4gICAgYWNjb3VudEV4cGlyYXRpb25TZWNvbmROb3RpZmljYXRpb25JbkRheXM6IDUsXG4gICAgaW5hY3RpdmVBY2NvdW50VGltZVRvRGVsZXRlSW5EYXlzOiAxODAsXG4gICAgLy8gUXVlc3Rpb25uYWlyZXM6XG4gICAgbmJRdWVzdGlvbnNNaW46IDEsIC8vIG1pbmltdW0gbnVtYmVyIG9mIHF1ZXN0aW9ucyBmb3IgdGhlIHF1ZXN0aW9ubmFpcmUgdG8gYmUgcHVibGlzaGFibGVcbiAgICBuYlF1ZXN0aW9uc01heDogMTAsIC8vIGlmIDAgPSBub3QgbWF4aW11bVxuICAgIG5iQ2hvaWNlc01heDogMTAsXG4gICAgbmJOZXdRdWVzdGlvbm5haXJlczogMTAsLy8gZm9yIFJTUywgZXRjLlxuICAgIGhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUJlZ2luOjEsIC8vIGluIHVzZXIgbG9jYWwgdGltZVxuICAgIGhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUVuZDoyNCwgLy8gaWRlbVxuICAgIG51bWJlck5ld1F1ZXN0aW9ubmFpcmVBdFNhbWVUaW1lOiA1MCwgLy8gZm9yIG1hc3MgbWFpbGluZ1xuICAgIG1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzOiAzLFxuICAgIC8vIElsbHVzdHJhdGlvbnM6XG4gICAgbmJJbGx1c3RyYXRpb25zTWluOiAwLFxuICAgIG5iSWxsdXN0cmF0aW9uc01heDogMSxcbiAgICBtYXhJbGx1c3RyYXRpb25TaXplaW5PY3RldDogMTAwMDAwMCwvLyBwYXMgY29udHLDtGzDqSBwb3VyIGwnaW5zdGFudC4gw4AgcmV2b2lyLlxuICAgIG1pbWVUeXBlc0ZvcklsbHVzdHJhdGlvbjogWyBcImltYWdlL2pwZ1wiLCBcImltYWdlL2pwZWdcIiwgXCJpbWFnZS9wbmdcIiwgXCJpbWFnZS9naWZcIiwgXCJpbWFnZS9wbmdcIiBdLFxuICAgIC8vIC0tIFVwbG9hZCBhbmQgcmVzaXplOlxuICAgIGlsbHVzdHJhdGlvbnNXaWR0aE1heEluUHg6IDQwMCxcbiAgICBpbGx1c3RyYXRpb25zTWluaWF0dXJlc1dpZHRoTWF4SW5QeDogMjAwLFxuICAgIC8vIExpbmtzOlxuICAgIG5iTGlua3NNaW46IDEsXG4gICAgbmJMaW5rc01heDogMSxcbiAgICAvLyDDoCBzdXBwcmltZXIgcXVhbmQgdG91cyBsZXMgXCJyZXF1aXJlXCIgw6Agam91cjpcbiAgICBuYlF1ZXN0aW9uc01pbjogcXVlc3Rpb25uYWlyZXMubmJRdWVzdGlvbnNNaW4sXG4gICAgbmJRdWVzdGlvbnNNYXg6IHF1ZXN0aW9ubmFpcmVzLm5iUXVlc3Rpb25zTWF4LFxuICAgIG5iQ2hvaWNlc01heDogcXVlc3Rpb25uYWlyZXMubmJDaG9pY2VzTWF4LFxuICAgIHBhc3N3b3JkTWluTGVuZ3RoOiB1c2Vycy5wYXNzd29yZC5taW5sZW5ndGgsXG4gICAgZGlyQ2FjaGVVc2VyczogdXNlcnMuZGlyQ2FjaGVVc2VycyxcbiAgICBkaXJDYWNoZVVzZXJzQW5zd2VyczogdXNlcnMuZGlyQ2FjaGVVc2Vyc0Fuc3dlcnMsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbm5haXJlczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyxcbiAgICBkaXJDYWNoZVF1ZXN0aW9uczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVRdWVzdGlvbnMsXG4gICAgZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzOiBxdWVzdGlvbm5haXJlcy5kaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXMsXG4gICAgZGlySFRNTFF1ZXN0aW9ubmFpcmU6IHF1ZXN0aW9ubmFpcmVzLmRpckhUTUxRdWVzdGlvbm5haXJlLFxuICAgIGRpcldlYlF1ZXN0aW9ubmFpcmU6IHF1ZXN0aW9ubmFpcmVzLmRpcldlYlF1ZXN0aW9ubmFpcmVcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxueyAgICBcbiAgICAvLyBBUEkncm91dGVzIChhZnRlciBcImFwaVVybFwiIGRlZmluZWQgaW4gaW5zdGFuY2UuanMpXG4gICAgcXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcXVlc3Rpb25uYWlyZVwiLFxuICAgIGdldFF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL2dldFwiLFxuICAgIHByZXZpZXdRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9wcmV2aWV3XCIsXG4gICAgcHVibGlzaGVkUXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcXVpei9cIixcbiAgICBzYXZlQW5zd2Vyc1JvdXRlOiBcIi9hbnN3ZXIvXCIsXG4gICAgZ2V0U3RhdHNRdWVzdGlvbm5haXJlcyA6IFwiL3N0YXRzL1wiLFxuICAgIHNlYXJjaFF1ZXN0aW9ubmFpcmVzUm91dGUgOiBcIi9zZWFyY2hcIixcbiAgICBzZWFyY2hBZG1pblF1ZXN0aW9ubmFpcmVzUm91dGUgOiBcIi9zZWFyY2hhZG1pblwiLFxuICAgIGdldExpc3ROZXh0UXVlc3Rpb25uYWlyZXM6IFwiL2dldGxpc3RuZXh0cXVlc3Rpb25uYWlyZXMvXCIsXG4gICAgLy8gLS0gcXVlc3Rpb25zICYgY2hvaWNlcyA6XG4gICAgcXVlc3Rpb25zUm91dGU6IFwiL3F1ZXN0aW9uL1wiLFxuICAgIC8vIC0tIHRhZ3MgOlxuICAgIHRhZ3NTZWFyY2hSb3V0ZTogXCIvdGFncy9zZWFyY2gvXCIsXG4gICAgLy8gLS0gYW5zd2VycyA6XG4gICAgZ2V0UXVlc3Rpb25uYWlyZXNXaXRob3V0QW5zd2VyOiBcIi93aXRob3V0YW5zd2VyL3VzZXIvXCIsXG4gICAgZ2V0UHJldmlvdXNBbnN3ZXJzOiBcIi91c2VyL2Fuc3dlcnMvXCIsXG4gICAgZ2V0U3RhdHNBbnN3ZXJzIDogXCIvdXNlci9hbndzd2Vycy9zdGF0cy9cIixcbiAgICBnZXRBZG1pblN0YXRzOiBcIi9nZXRhZG1pbnN0YXRzL1wiLFxuICAgIC8vIGZvcm1zIDogw6AgY29tcGzDqXRlciBhdmVjIHZhbGV1cnMgcGFyIGTDqWZhdXQsIGV0Yy4gY2YgbW9kw6hsZVxuICAgIFF1ZXN0aW9ubmFpcmUgOlxuICAgIHtcbiAgICAgICAgdGl0bGU6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgIHNsdWc6IHsgbWF4bGVuZ3RoOiAxNTAgfSwgLy8gY2hhbXAgcmVxdWlzIG1haXMgY2FsY3Vsw6kgw6AgcGFydGlyIGR1IHRpdHJlIHFkIHZpZGVcbiAgICAgICAgaW50cm9kdWN0aW9uOiB7IHJlcXVpcmVkOiB0cnVlIH1cbiAgICB9LFxuICAgIHNlYXJjaFF1ZXN0aW9ubmFpcmVzIDogeyBtaW5sZW5ndGg6IDMsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgUXVlc3Rpb24gOlxuICAgIHtcbiAgICAgICAgdGV4dDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgcmFuazogeyByZXF1aXJlZDogdHJ1ZSwgbWluOjEsIGRlZmF1bHRWYWx1ZToxIH1cbiAgICB9LCAgICAgICAgICBcbiAgICBDaG9pY2UgOlxuICAgIHtcbiAgICAgICAgdGV4dDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfVxuICAgIH0sICAgICAgICAgIFxuICAgIG5iUXVlc3Rpb25zTWluOiAxLFxuICAgIG5iUXVlc3Rpb25zTWF4OiAxMCxcbiAgICBuYkNob2ljZXNNYXg6IDEwLFxuICAgIG5iVGFnc01pbjogMCxcbiAgICBuYlRhZ3NNYXg6IDAsIC8vIDAgPSBub3QgbWF4ICAgIFxuICAgIC8vIEpTT04gYW5kIEhUTUwgZGlyXG4gICAgZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXNcIixcbiAgICBkaXJDYWNoZVF1ZXN0aW9ucyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXMvcXVlc3Rpb25zXCIsXG4gICAgZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzIDogXCJkYXRhcy91c2Vycy9xdWVzdGlvbm5haXJlc1wiLFxuICAgIGRpckNhY2hlVGFncyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXMvdGFnc1wiLCAgXG4gICAgZGlySFRNTFF1ZXN0aW9ubmFpcmUgOiBcImZyb250L3B1YmxpYy9xdWl6XCIsXG4gICAgZGlySFRNTFRhZ3MgOiBcImZyb250L3B1YmxpYy9xdWl6c1wiLFxuICAgIGRpcldlYlF1ZXN0aW9ubmFpcmUgOiBcInF1aXpcIiwvL3BvdXIgdXJsIHBhZ2VcbiAgICBkaXJXZWJUYWdzIDogXCJxdWl6c1wiLy8gaWRlbVxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgLy8gQVBJJ3JvdXRlcyAoYWZ0ZXIgXCJhcGlVcmxcIiBkZWZpbmVkIGluIGluc3RhbmNlLmpzKVxuICAgIHVzZXJSb3V0ZXM6IFwiL3VzZXJcIixcbiAgICBzdWJzY3JpYmVSb3V0ZTogXCIvc2lnbnVwXCIsXG4gICAgZ2V0R29kZmF0aGVyUm91dGU6IFwiL2dldGdvZGZhdGhlcmlkXCIsXG4gICAgY2hlY2tJZklzRW1haWxmcmVlUm91dGU6IFwiL2lzZW1haWxmcmVlXCIsXG4gICAgY2hlY2tTdWJzY3JpYmVUb2tlblJvdXRlOiBcIi92YWxpZGF0aW9uL1wiLFxuICAgIGNoZWNrTG9naW5Sb3V0ZTogXCIvY2hlY2tsb2dpbi9cIixcbiAgICBjb25uZWN0aW9uUm91dGU6IFwiL2xvZ2luXCIsXG4gICAgZ2V0TG9naW5MaW5rUm91dGU6IFwiL2dldGxvZ2lubGlua1wiLFxuICAgIGNvbm5lY3Rpb25XaXRoTGlua1JvdXRlOiBcIi9jaGVja2xvZ2lubGlua1wiLFxuICAgIGdldFVzZXJJbmZvczogXCIvZ2V0L1wiLFxuICAgIGNyZWF0ZVVzZXJSb3V0ZTogXCIvY3JlYXRlXCIsXG4gICAgdmFsaWRhdGVVc2VyUm91dGU6IFwiL3ZhbGlkYXRlL1wiLFxuICAgIHVwZGF0ZVVzZXJJbmZvczogXCIvbW9kaWZ5L1wiLFxuICAgIHNlYXJjaFVzZXJSb3V0ZTogXCIvc2VhcmNoL1wiLFxuICAgIGdldEdvZENoaWxkczogXCIvZ2V0Z29kY2hpbGRzL1wiLFxuICAgIGNoZWNrTmV3TG9naW5MaW5rUm91dGU6IFwiL2NvbmZpcm1uZXdsb2dpbi9cIixcbiAgICBjaGVja0RlbGV0ZUxpbmtSb3V0ZTogXCIvY29uZmlybWRlbGV0ZS9cIixcbiAgICBnZXRQYXltZW50czogXCIvcGF5bWVudC9nZXRmb3JvbmV1c2VyL1wiLFxuICAgIHVuc3Vic2NyaWJlUm91dGU6IFwiL3N1YnNjcmlwdGlvbi9zdG9wL1wiLFxuICAgIGdldEFkbWluU3RhdHM6IFwiL2dldGFkbWluc3RhdHMvXCIsXG4gICAgLy8gZm9ybXMgOiDDoCBjb21wbMOpdGVyIGF2ZWMgdmFsZXVycyBwYXIgZMOpZmF1dCwgZXRjLiBjZiBtb2TDqGxlXG4gICAgbmFtZTogeyBtYXhsZW5ndGg6IDcwLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGVtYWlsOiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHBhc3N3b3JkOiB7IG1pbmxlbmd0aDogOCwgbWF4bGVuZ3RoOjcyLCByZXF1aXJlZDogdHJ1ZSB9LCAvLyBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9iY3J5cHQjc2VjdXJpdHktaXNzdWVzLWFuZC1jb25jZXJuc1xuICAgIG5ld1Bhc3N3b3JkOiB7IG1pbmxlbmd0aDogOCwgbWF4bGVuZ3RoOjcyIH0sXG4gICAgY29kZUdvZGZhdGhlcjogeyBtYXhsZW5ndGg6IDI1NSB9LFxuICAgIGNndU9rOiB7IHZhbHVlOiBcInRydWVcIiwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICB0aW1lRGlmZmVyZW5jZU1pbjogLTcyMCxcbiAgICB0aW1lRGlmZmVyZW5jZU1heDo4NDAsXG4gICAgLy8gSlNPTiBkaXJcbiAgICBkaXJDYWNoZVVzZXJzIDogXCJkYXRhcy91c2Vyc1wiLFxuICAgIGRpckNhY2hlVXNlcnNBbnN3ZXJzIDogXCJkYXRhcy91c2Vycy9xdWVzdGlvbm5haXJlcy9hbnN3ZXJzXCJcbn07XG4iLCJ2YXIgbWFwID0ge1xuXHRcIi4vZnIvZ2VuZXJhbFwiOiBcIi4uL2xhbmcvZnIvZ2VuZXJhbC5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi9sYW5nIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcL2dlbmVyYWwkXCI7IiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL3F1ZXN0aW9ubmFpcmVcIjogXCIuLi9sYW5nL2ZyL3F1ZXN0aW9ubmFpcmUuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9xdWVzdGlvbm5haXJlJFwiOyIsInZhciBtYXAgPSB7XG5cdFwiLi9mci91c2VyXCI6IFwiLi4vbGFuZy9mci91c2VyLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvdXNlciRcIjsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgc2l0ZUhUTUxUaXRsZSA6IFwiV2lraUxlcm5pIDogcXUnYWxsZXotdm91cyBhcHByZW5kcmUgYXVqb3VyZCdodWkgP1wiLFxuICAgIHNpdGVNZXRhRGVzY3JpcHRpb24gOiBcIkNoYXF1ZSBqb3VyLCB0ZXN0ZXogdm9zIGNvbm5haXNzYW5jZXMgZXQgYXBwcmVuZXogZGUgbm91dmVsbGVzIGNob3NlcyBhdmVjIFdpa2lMZXJuaS5cIixcbiAgICBzY3JpcHRUaW1pbmdJbmZvIDogXCJEdXLDqWUgZGUgbGEgcsOpcG9uc2UgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNjcmlwdFRpbWluZ0FsZXJ0IDogXCIqKiogU2NyaXB0IGxlbnQgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNlcnZlckVycm9yIDogXCJEw6lzb2zDqS4gVW5lIGVycmV1ciBpbXByw6l2dWUgZXN0IHN1cnZlbnVlLiBTaSBjZWxhIHBlcnNpc3RlLCBuJ2jDqXNpdGV6IMOgIHByw6l2ZW5pciBsJ2FkbWluaXN0cmF0ZXVyIGR1IHNpdGUuXCIsXG4gICAgc2VydmVyRXJyb3JBZG1pbiA6IFwiQnVnIGRlIGwnYXBwbGljYXRpb24gOlwiLFxuICAgIG5lZWRlZFBhcmFtcyA6IFwiRGVzIHBhcmFtw6h0cmVzIG7DqWNlc3NhaXJlcyBtYW5xdWFudHMgc29udCBtYW5xdWFudHMuXCIsXG4gICAgYmFkVXJsIDogXCJUZW50YXRpdmUgZCdhY2PDqHMgw6AgdW5lIHBhZ2UgbidleGlzdGFudCBwYXMgOlwiLFxuICAgIG5vdFZhbGlkRm9ybWF0IDogXCJGb3JtYXQgbm9uIHZhbGlkZS5cIixcbiAgICBub3RBbGxvd2VkIDogXCJWb3VzIG4nYXZleiBwYXMgbGVzIGRyb2l0cyBuw6ljZXNzYWlyZXMgcG91ciBjZXR0ZSBhY3Rpb24uXCIsXG4gICAgbm90UmVxdWlyZWQgOiBcIkZhY3VsdGF0aWYuXCIsXG4gICAgdXBkYXRlQnRuVHh0OiBcIk1vZGlmaWVyXCIsXG4gICAgYWRkQnRuVHh0OiBcIkFqb3V0ZXJcIixcbiAgICBkZWxldGVCdG5UeHQ6IFwiU3VwcHJpbWVyXCIsXG4gICAgYWRkT2tNZXNzYWdlIDogXCJMZXMgZG9ubsOpZXMgb250IGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llcy5cIixcbiAgICB1cGRhdGVPa01lc3NhZ2UgOiBcIkxhIG1pc2Ugw6Agam91ciDDoCBqb3VyIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgZGVsZXRlT2tNZXNzYWdlIDogXCJMYSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIGZhaWxBdXRoIDogXCJFcnJldXIgZCdhdXRoZW50aWZpY2F0aW9uLlwiLFxuICAgIGZhaWxBdXRoSGVhZGVyIDogXCJBYnNlbmNlIGRlIGhlYWRlciBBdXRob3JpemF0aW9uLlwiLFxuICAgIGZhaWxBdXRoVG9rZW4gOiBcIlRva2VuIGludmFsaWRlIG91IHV0aWxpc2F0ZXVyIG5vbiB0cm91dsOpLlwiLFxuICAgIGZhaWxBdXRoSWQgOiBcIklkZW50aWZpYW50IG5vbiB2YWxpZGUgOiBcIixcbiAgICBmYWlsQXV0aENyb24gOiBcIlRlbnRhdGl2ZSBkZSBsYW5jZW1lbnQgZCd1biBjcm9uIHNhbnMgbGUgYm9uIHRva2VuLlwiLFxuICAgIHByZXZpb3VzUGFnZSA6IFwiUGFnZSBwcsOpY8OpZGVudGVcIixcbiAgICBuZXh0UGFnZSA6IFwiUGFnZSBzdWl2YW50ZVwiLFxuICAgIGJ0bkxpbmtUb1F1ZXN0aW9ubmFpcmUgOiBcIkFsbGVyIGF1IHF1aXogIVwiLFxuICAgIHN0YXRzQWRtaW4gOiBcIkR1cmFudCBsZXMgZGVybmnDqHJlcyAyNGggOiBOQl9VU0VSU18yNEggY29tcHRlcyBvbnQgw6l0w6kgY3LDqcOpcywgTkJfU1VCU0NSSVBUSU9OU18yNEggdmFsaWTDqXMgZXQgTkJfVVNFUlNfREVMRVRFRF8yNEggc3VwcHJpbcOpcy4gTkJfQU5TV0VSU18yNEggcsOpcG9uc2VzIGF1eCBxdWl6cyBvbnQgw6l0w6kgZW5yZWdpc3Ryw6llcy48YnI+RW4gdG91dCwgaWwgeSBhIDogTkJfVVNFUlNfVE9UIGNvbXB0ZXMsIGRvbnQgTkJfU1VCU0NSSVBUSU9OU19UT1QgdmFsaWTDqXMgZXQgTkJfU1VCU0NSSVBUSU9OU19QUkVNSVVNIGNvbXB0ZXMgcHLDqW1pdW0uIE5CX0FOU1dFUlNfVE9UIHLDqXBvbnNlcyBhdXggcXVpenMgb250IMOpdMOpIGVucmVnaXN0csOpZXMuPGJyPlBhcm1pIGxlcyBOQl9VU0VSU19ERUxFVEVEX1RPVCBjb21wdGVzIHN1cHByaW3DqXMsIE5CX1VTRVJTX0RFTEVURURfVkFMSURFRCBhdmFpZW50IHZhbGlkw6kgbGV1ciBjb21wdGUgZXQgTkJfVVNFUlNfREVMRVRFRF9QUkVNSVVNIGF2YWllbnQgc291c2NyaXQgdW4gY29tcHRlIHByw6ltaXVtLlwiXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBuZWVkVGl0bGU6IFwiTWVyY2kgZGUgZm91cm5pciB1biB0aXRyZSDDoCB2b3RyZSBxdWl6LlwiLFxuICAgIG5lZWROb3RUb29Mb25nVGl0bGU6IFwiTGUgdGl0cmUgZHUgcXVpeiBuZSBkb2l0IHBhcyBjb21wdGVyIHBsdXMgZGUgMjU1IGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRVcmw6IFwiTWVyY2kgZGUgZm91cm5pciBsJ3VybCDDoCB2b3RyZSBxdWl6LlwiLFxuICAgIG5lZWRVbmlxdWVVcmw6IFwiTCd1cmwgZHUgcXVpeiBkb2l0IMOqdHJlIHVuaXF1ZS5cIixcbiAgICBuZWVkSW50cm9kdWN0aW9uOiBcIk1lcmNpIGRlIGZvdXJuaXIgdW4gdGV4dGUgZCdpbnRyb2R1Y3Rpb24gw6Agdm90cmUgcXVpei5cIixcbiAgICBuZWVkQ29ycmVjdFB1Ymxpc2hpbmdEYXRlOiBcIkxhIGRhdGUgZGUgcHVibGljYXRpb24gZm91cm5pZSBuJ2EgcGFzIHVuIGZvcm1hdCB2YWxpZGUuXCIsXG4gICAgbmVlZEtub3dJZklzUHVibGlzaGVkOiBcIklsIGZhdXQgc2F2b2lyIHNpIGNlIHF1aXogZXN0IHB1Ymxpw6kuXCIsXG4gICAgbmVlZExhbmd1YWdlOiBcIlZvdXMgZGV2ZXogc8OpbGVjdGlvbm5lciBsYSBsYW5ndWUgZGUgY2UgcXVpei5cIixcbiAgICBuZWVkRXN0aW1hdGVkVGltZTogXCJNZXJjaSBkZSBzw6lsZWN0aW9ubmVyIHVuZSBlc3RpbWF0aW9uIGRlIGxhIGR1csOpZSBkZSBjZSBxdWl6LlwiLFxuICAgIG5vdEZvdW5kIDogXCJBdWN1biBxdWl6IG4nYSBwYXMgw6l0w6kgdHJvdXbDqS5cIixcbiAgICBzZWFyY2hSZXN1bHRUaXRsZSA6IFwiUsOpc3VsdGF0IHBvdXIgdm90cmUgcmVjaGVyY2hlXCIsXG4gICAgc2VhcmNoTm9SZXN1bHQgOiBcIkF1Y3VuIHLDqXN1bHRhdCBuJ2Egw6l0w6kgdHJvdXbDqSBwb3VyIHZvdHJlIHJlY2hlcmNoZVwiLFxuICAgIHNlYXJjaFdpdGhSZXN1bHQgOiBcIiNOQiBxdWl6cyBjb3JyZXNwb25kZW50IMOgIHZvdHJlIHJlY2hlcmNoZSA6XCIsXG4gICAgcHVibGlzaGVkQnk6IFwiUHVibGnDqSBwYXJcIixcbiAgICBwdWJsaXNoZWRBdDogXCIsIGxlXCIsXG4gICAgbGFzdFVwZGF0ZWQ6IFwiRGVybmnDqHJlIG1pc2Ugw6Agam91ciwgbGUgXCIsXG4gICAgZXN0aW1hdGVkVGltZTogXCJEdXLDqWUgZGUgbGVjdHVyZSBlc3RpbcOpZSA6IFwiLFxuICAgIGJ0blNlbmRSZXNwb25zZTogXCJFbnZveWV6IHZvcyByw6lwb25zZXNcIixcbiAgICBidG5Qcm9wb3NlU3Vic2NyaWJlOiBcIk9rLCBqZSBjcsOpZSBtb24gY29tcHRlICFcIixcbiAgICBidG5Qcm9wb3NlQ29ubmVjdGlvbjogXCJKJ2FpIGTDqWrDoCB1biBjb21wdGUsIGplIG1lIGNvbm5lY3RlLlwiLFxuICAgIGJ0blNob3dRdWVzdGlvbm5haXJlOiBcIkFmZmljaGVyIGxlIHF1aXogIVwiLFxuICAgIG5leHRRdWVzdGlvbm5haXJlc0xpc3Q6IFwiTGVzICNOQiBwcm9jaGFpbnMgcXVpenMgZGV2YW50IMOqdHJlIHB1Ymxpw6lzXCIsXG4gICAgbmVlZEJlQ29tcGxldGVkOiBcIlF1aXogaW5jb21wbGV0XCIsXG4gICAgbmV4dERhdGVXaXRob3V0UXVlc3Rpb25uYWlyZTogXCJQcm9jaGFpbmUgZGF0ZSBzYW5zIHF1aXogcHJvZ3JhbW3DqSA6IFwiLFxuICAgIGhhdmVCZWVuUHVibGlzaGVkIDogXCI6TkIgbm91dmVhdXggcXVlc3Rpb25uYWlyZXMgb250IMOpdMOpIHB1Ymxpw6lzLlwiXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBub3RGb3VuZDogXCJMJ3V0aWxpc2F0ZXVyIG4nYSBwYXMgw6l0w6kgdHJvdXbDqS5cIixcbiAgICBuZWVkTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyLlwiLFxuICAgIG5lZWROb3RUb29Mb25nTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyIG5lIGNvbXB0YW50IHBhcyBwbHVzIGRlIDcwIGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRFbWFpbDogXCJNZXJjaSBkZSBzYWlzaXIgdm90cmUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgbmVlZFVuaXF1ZUVtYWlsOiBcIkwnYWRyZXNzZSBlLW1haWwgcXVlIHZvdXMgYXZleiBzYWlzaWUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcGFyIHVuIGF1dHJlIHV0aWxpc2F0ZXVyLiBTaSB2b3VzIGF2ZXogZMOpasOgIHVuIGNvbXB0ZSwgPGEgaHJlZj0nLyNVUkwnPmNsaXF1ZXotaWNpIHBvdXIgdm91cyBjb25uZWN0ZXI8L2E+LlwiLFxuICAgIG5lZWROb3RUb29Mb25nRW1haWw6IFwiTWVyY2kgZGUgc2Fpc2lyIHVuZSBhZHJlc3NlIGUtbWFpbCBuZSBjb21wdGFudCBwYXMgcGx1cyBkZSAyNTUgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZFBhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZS5cIixcbiAgICBuZWVkTG9uZ1Bhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZSBkJ2F1IG1vaW5zIE1JTl9MRU5HVEggY2FyYWN0w6hyZXMuXCIsXG4gICAgcGFzc3dvcmRDb3BpZWQ6IFwiTGUgbW90IGRlIHBhc3NlIGfDqW7DqXLDqSBhIMOpdMOpIGNvcGnDqSBkYW5zIGxlIHByZXNzZS1wYXBpZXIuIFZvdXMgcG91dmV6IGxlIHJlY29waWVyIG/DuSB2b3VzIGxlIHNvdWhhaXRlci5cIixcbiAgICBuZWVkU3RhdHVzIDogXCJJbCBtYW5xdWUgbGUgc3RhdHV0LlwiLFxuICAgIG5lZWRMYW5ndWFnZSA6IFwiSWwgbWFucXVlIGxlIGNvZGUgbGFuZ3VlLlwiLFxuICAgIG5lZWRWYWxpZExhc3RDb25uZWN0aW9uRGF0ZSA6IFwiTGEgZGF0ZSBkZSBkZXJuacOocmUgY29ubmV4aW9uIG4nZXN0IHBhcyB2YWxpZGUuXCIsXG4gICAgbmVlZFNNVFAgOiBcIklsIG1hbnF1ZSBsZSBzZXJ2ZXVyIFNNVFAuXCIsXG4gICAgbmVlZFNNVFBOb3RGb3VuZCA6IFwiSWwgbWFucXVlIGxlIHNlcnZldXIgU01UUC5cIixcbiAgICBuZWVkS25vd05ld3NsZXR0ZXJPayA6IFwiSWwgZmF1dCBzYXZvaXIgc2kgbCd1dGlsaXNhdGV1ciBhY2NlcHRlIG91IHJlZnVzZSBkZSByZWNldm9pciBsYSBuZXdzbGV0dGVyLlwiLFxuICAgIG5lZWRUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBjb25uYcOudHJlIGxlIG5vbWJyZSBkZSBtaW51dGVzIGR1IGTDqWNhbGFnZSBob3JhaXJlLlwiLFxuICAgIG5lZWRNaW5UaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGVubGV2ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgNzIwLlwiLFxuICAgIG5lZWRNYXhUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGFqb3V0ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgODQwLlwiLFxuICAgIG5lZWRVR0NPayA6IFwiVm91cyBkZXZleiBhY2NlcHRlciBsZXMgQ0dVIHBvdXIgcG91dm9pciBjcsOpZXIgdm90cmUgY29tcHRlLiBcIixcbiAgICBnb2RmYXRoZXJOb3RGb3VuZDogXCJBdWN1biB1dGlsaXNhdGV1ciB2YWxpZGUgdHJvdXbDqSBwb3VyIGNlIGNvZGUgcGFycmFpbi5cIixcbiAgICBnb2RmYXRoZXJGb3VuZDogXCJWb3RyZSBwYXJyYWluIGEgYmllbiDDqXTDqSB0cm91dsOpICFcIixcbiAgICBtYWlsVmFsaWRhdGlvbk1lc3NhZ2U6IFwiVm90cmUgaW5zY3JpcHRpb24gZXN0IGJpZW4gZW5yZWdpc3Ryw6llLlxcblBvdXIgbGEgZmluYWxpc2VyLCBtZXJjaSBkZSBjbGlxdWVyIGRhbnMgbGVzIDI0SCBzdXIgbGUgbGllbiBkZSBjb25maXJtYXRpb24gcXVpIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBwYXIgZS1tYWlsLlwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1N1YmplY3QgOiBcIk1lcmNpIGRlIHZhbGlkZXIgdm90cmUgY29tcHRlXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblBvdXIgdmFsaWRlciB2b3RyZSBjb21wdGUsIG1lcmNpIGRlIGNsaXF1ZXIgc3VyIGxlIGxpZW4gc3VpdmFudCBkYW5zIGxlcyAyNGggOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm90cmUgY29tcHRlLCBtZXJjaSBkZSBjbGlxdWVyIHN1ciBsZSBsaWVuIHN1aXZhbnQgZGFucyBsZXMgMjRoLjwvcD48cD48YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+VmFsaWRlci48L2E+PC9wPlwiLFxuICAgIHZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGNvbXB0ZSB2aWVudCBiaWVuIGQnw6p0cmUgdmFsaWTDqS4gTWVyY2kgZXQgYmllbnZlbnVlICE8YnI+Vm91cyBwb3V2ZXogc2FucyB0YXJkZXIgdm91cyBjb25uZWN0ZXIgY2ktZGVzc291cyBwb3VyIGFjY8OpZGVyIMOgIHZvdHJlIGNvbXB0ZS5cIixcbiAgICB2YWxpZGF0aW9uTWVzc2FnZUFkbWluOiBcIkxlIGNvbXB0ZSBhIGJpZW4gw6l0w6kgdmFsaWTDqS5cIixcbiAgICB2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2U6IFwiSWwgc2VtYmxlIHF1ZSB2b3VzIGF5ZXogZMOpasOgIHZhbGlkw6kgdm90cmUgY29tcHRlLlwiLFxuICAgIHZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZUFkbWluOiBcIkNlIGNvbXB0ZSBhIGTDqWrDoCDDqXTDqSB2YWxpZMOpLlwiLFxuICAgIG1haWxXZWxjb21lU3ViamVjdCA6IFwiQmllbnZlbnVlICFcIixcbiAgICBtYWlsV2VsY29tZUJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblZvdHJlIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuXFxuTWVyY2kgZXQgw6AgYmllbnTDtHQgIVwiLFxuICAgIG1haWxXZWxjb21lQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlZvdHJlIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuPC9wPjxwPk1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyU3ViamVjdCA6IFwiTWVyY2kgIVwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlckJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcbkdyw6JjZSDDoCB2b3VzIHVuIG5vdXZlbCB1dGlsaXNhdGV1ciAoRU1BSUwpIHZpZW50IGRlIHMnaW5zY3JpcmUgc3VyIE5PTV9TSVRFLlxcbk1lcmNpIGV0IMOgIGJpZW50w7R0ICFcIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+R3LDomNlIMOgIHZvdXMgdW4gbm91dmVsIHV0aWxpc2F0ZXVyIChFTUFJTCkgdmllbnQgZGUgcydpbnNjcmlyZSBzdXIgTk9NX1NJVEUuPC9wPjxwPk1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGxpZW4gZGUgY29uZmlybWF0aW9uIG5lIHNlbWJsZSBwYXMgdmFsaWRlIG91IGJpZW4gaWwgYSBleHBpcsOpLiBWb3VzIHBvdXZleiBlbiByZWNldm9pciB1biBub3V2ZWF1IDxhIGhyZWY9JyNVUkwnPmVuIGNsaXF1YW50IGljaTwvYT4uXCIsXG4gICAgZW1haWxOb3RGb3VuZDogXCJBdWN1biB1dGlsaXNhdGV1ciB0cm91dsOpIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgYWxyZWFkeUNvbm5lY3RlZDogXCJWb3VzIMOqdGVzIGTDqWrDoCBjb25uZWN0w6koZSkgYXUgc2l0ZSAhXCIsXG4gICAgbmVlZEJlQ29ubmVjdGVkOiBcIlZvdXMgZGV2ZXogw6p0cmUgY29ubmVjdMOpKGUpIHBvdXIgYWNjw6lkZXIgw6AgY2V0dGUgcGFnZS5cIixcbiAgICBjb25uZWN0aW9uT2s6IFwiQ29ubmV4aW9uIHLDqXVzc2llLlwiLFxuICAgIG5lZWRDaG9vc2VMb2dpbldheTogXCJWb3VzIGRldmV6IHNvaXQgc2Fpc2lyIHZvdHJlIG1vdCBkZSBwYXNzZSwgc29pdCBjb2NoZXIgbGEgY2FzZSB2b3VzIHBlcm1ldHRhbnQgZGUgcmVjZXZvaXIgdW4gbGllbiBkZSBjb25uZXhpb24gcGFyIGUtbWFpbC5cIixcbiAgICBuZWVkVmFsaWRhdGlvblRvTG9naW4gOiBcIlZvdXMgZGV2ZXogZCdhYm9yZCB2YWxpZGVyIHZvdHJlIGNvbXB0ZSBhdmFudCBkZSB2b3VzIGNvbm5lY3Rlci4gUG91ciBjZSBmYWlyZSwgdW4gbGllbiB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbC5cIixcbiAgICB0b29NYW55TG9naW5GYWlscyA6IFwiVHJvcCBkZSB0ZW50YXRpdmVzIGRlIGNvbm5leGlvbiBpbmZydWN0dWV1c2VzIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuIFZvdXMgZGV2ZXogYXR0ZW5kcmUgTUlOVVRFUyBtaW51dGVzIHBvdXIgZXNzYXllciBkZSBub3V2ZWF1LlwiLFxuICAgIGJhZFBhc3N3b3JkOiBcIkxlIG1vdCBkZSBwYXNzZSBuJ2VzdCBwYXMgbGUgYm9uLlwiLFxuICAgIG1haWxMb2dpbkxpbmtTdWJqZWN0IDogXCJWb3RyZSBsaWVuIGRlIGNvbm5leGlvbi5cIixcbiAgICBtYWlsTG9naW5MaW5rQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuUG91ciB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6IExJTktfVVJMXCIsXG4gICAgbWFpbExvZ2luTGlua0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZvdXMgY29ubmVjdGVyIMOgIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDo8L3A+PHA+PGEgaHJlZj1cXFwiTElOS19VUkxcXFwiPlZhbGlkZXIuPC9hPjwvcD5cIixcbiAgICBtYWlsTG9naW5MaW5rTWVzc2FnZSA6IFwiVW4gbGllbiBkZSBjb25uZXhpb24gdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHN1ciB2b3RyZSBhZHJlc3NlIGUtbWFpbC4gTmUgdGFyZGV6IHBhcyDDoCBsJ3V0aWxpc2VyLCBjYXIgaWwgbidlc3QgdmFsYWJsZSBxdWUgZHVyYW50IFwiLFxuICAgIHVwZGF0ZWRPa01lc3NhZ2U6IFwiVm9zIGluZm9ybWF0aW9ucyBvbnQgYmllbiDDqXTDqSBtaXNlcyDDoCBqb3VyLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEVtYWlsIDogXCJNYWlzIGxhIG5vdXZlbGxlIGFkcmVzc2UgZS1tYWlsIG4nYSBwdSDDqnRyZSBlbnJlZ2lzdHLDqWUgY2FyIGVsbGUgbidhIHBhcyB1bmUgZm9ybWF0IGNvcnJlY3QuXCIsXG4gICAgdXBkYXRlZE5lZWRVbmlxdWVFbWFpbCA6IFwiTWFpcyBsYSBub3V2ZWxsZSBhZHJlc3NlIGUtbWFpbCBzYWlzaWUgKE5FV19FTUFJTCkgbidhIHB1IMOqdHJlIGVucmVnaXN0csOpZSwgY2FyIGVsbGUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcG91ciB1biBhdXRyZSBjb21wdGUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luU3ViamVjdCA6IFwiTWVyY2kgZGUgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblBvdXIgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cyBkZSBjb25uZXhpb24sIDxhIGhyZWY9XFxcIkxJTktfVVJMXFxcIj5jbGlxdWV6IGljaTwvYT4gc2FucyB0YXJkZXIuPC9wPlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkxpbmtNZXNzYWdlOiBcIkNlcGVuZGFudCwgdm91cyBhdmV6IG1vZGlmacOpIGF1IG1vaW5zIHVuIGRlIHZvcyBpZGVudGlmaWFudHMgZGUgY29ubmV4aW9uIChlbWFpbCBldC9vdSBtb3QgZGUgcGFzc2UpIGV0IDxiPnZvdXMgZGV2ZXogY2xpcXVlciBzdXIgbGUgbGllbiBxdWkgdmllbnQgZGUgdm91cyDDqnRyZXMgZW52b3nDqSBzdXIgdm90cmUgYWRyZXNzZSAoTkVXX0VNQUlMKSBwb3VyIHZhbGlkZXIgY2UgY2hhbmdlbWVudDwvYj4uIEVuIGF0dGVuZGFudCwgbWVyY2kgZGUgY29udGludWVyIMOgIHV0aWxpc2VyIHZvcyBhbmNpZW5zIGlkZW50aWZpYW50cy5cIixcbiAgICB1cGRhdGVkTmVlZFZhbGlkYXRlZFVzZXI6IFwiTCd1dGlsaXNhdGV1ciBxdWUgdm91cyBzb3VoYWl0w6kgbW9kaWZpZXIgbidleGlzdGUgcGFzL3BsdXMgb3UgbidhIHBhcyBlbmNvcmUgdmFsaWTDqSBzb24gY29tcHRlLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEdvZGZhdGhlciA6IFwiTWFpcyBsZSBub3V2ZWF1IGNvZGUgcGFycmFpbiBuJ2EgcHUgw6p0cmUgcmV0ZW51LCBjYXIgaWwgbmUgY29ycmVzcG9uZCDDoCBhdWN1biBjb21wdGUgdXRpbGlzYXRldXIgb3Ugw6AgbCd1dGlsaXNhdGV1ciBsdWktbcOqbWUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luT2tNZXNzYWdlOiBcIkxhIG1pc2Ugw6Agam91ciBkZSB2b3MgaWRlbnRpZmlhbnRzIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgdXBkYXRlZEZhaWxlZEdvZGZhdGhlck5vdEZvdW5kIDogXCJMJ2lkZW50aWZpYW50IGZvdXJuaSBwb3VyIGxlIHBhcnJhaW4gbmUgY29ycmVzcG9uZCDDoCBhdWN1biB1dGlsaXNhdGV1ci5cIixcbiAgICBjcmVhdGlvbk9rTWVzc2FnZTogXCJMZSBub3V2ZWwgdXRpbGlzYXRldXIgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpLlwiLFxuICAgIG1haWxEZWxldGVTdWJqZWN0IDogXCJDb25maXJtZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLlwiLFxuICAgIG1haWxEZWxldGVCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5Qb3VyIHZhbGlkZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbERlbGV0ZUJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCA8YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+Y2xpcXVleiBpY2k8L2E+IHNhbnMgdGFyZGVyLjwvcD5cIixcbiAgICBtYWlsRGVsZXRlTGlua01lc3NhZ2U6IFwiVm90cmUgZGVtYW5kZSBkZSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLiBNZXJjaSBkZSBjbGlxdWVyIHNhbnMgdGFyZGVyIHN1ciBsZSBsaWVuIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbCBwb3VyIGNvbmZpcm1lci5cIixcbiAgICBkZWxldGVPa01lc3NhZ2U6IFwiTCd1dGlsaXNhdGV1ciBhIGJpZW4gw6l0w6kgc3VwcHJpbcOpLlwiLFxuICAgIGRlbGV0ZUZhaWxNZXNzYWdlOiBcIlRlbnRhdGl2ZSBkZSBzdXBwcmVzc2lvbiBkJ3VuIHV0aWxpc2F0ZXVyIGluZXhpc3RhbnQgOiBcIixcbiAgICBtYWlsRGVsZXRlTGlua09rTWVzc2FnZTogXCJWb3RyZSBjb21wdGUgYSBiaWVuIMOpdMOpIHN1cHByaW3DqS4gTWVyY2kgZCdhdm9pciB1dGlsaXPDqSBub3Mgc2VydmljZXMuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtBbHJlYWR5TWVzc2FnZTogXCJJbCBzZW1ibGUgcXVlIHZvdXMgYXlleiBkw6lqw6AgdmFsaWTDqSBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtGYWlsTWVzc2FnZTogXCJWb3RyZSBsaWVuIGRlIHN1cHByZXNzaW9uIG4nZXN0IHBhcyB2YWxpZGUgb3UgYWxvcnMgaWwgbidlc3QgcGx1cyB2YWxhYmxlLlwiLFxuICAgIGNyb25EZWxldGVVbnZhbGlkZWRVc2Vyc01lc3NhZ2U6IFwiIGNvbXB0ZXMgdXRpbGlzYXRldXJzIG5vbiB2YWxpZMOpcyBvbnQgw6l0w6kgc3VwcHJpbcOpcy5cIixcbiAgICBkZWxldGVJbmFjdGl2ZVVzZXJzTWVzc2FnZTogXCIgY29tcHRlcyB1dGlsaXNhdGV1cnMgaW5hY3RpZnMgb250IMOpdMOpIHN1cHByaW3DqXMuXCIsXG4gICAgd2VsY29tZU1lc3NhZ2U6IFwiQmllbnZlbnVlICNOQU1FICFcIixcbiAgICBieWVieWVNZXNzYWdlOiBcIlNpIHZvdXMgdm95ZXogY2UgbWVzc2FnZSwgYydlc3QgcXVlIHZvdHJlIGTDqWNvbm5leGlvbiBzJ2VzdCBiaWVuIGTDqXJvdWzDqWUuPGJyPsOAIGJpZW50w7R0ICFcIixcbiAgICBpbmZvc1VzZXJGb3JBZG1pbjogXCJDZXQgdXRpbGlzYXRldXIgKGlkOiBJRF9VU0VSKSBhIDxiPmNyw6nDqSBzb24gY29tcHRlIGxlIERBVEVfQ1JFQTwvYj4sIGxhIGRlcm5pw6hyZSBtaXNlIMOgIGpvdXIgZGF0YW50IGR1IERBVEVfVVBEQVRFLjxicj48Yj5EYXRlIGRlIHNhIGRlcm5pw6hyZSBjb25uZXhpb24gOiBEQVRFX0NPTk5FQ1RJT04uPC9iPlwiLFxuICAgIGluZm9zQWRtaW5Hb2RmYXRoZXI6IFwiQ2V0IHV0aWxpc2F0ZXVyIGEgw6l0w6kgcGFycmFpbsOpIHBhciBcIixcbiAgICBpbmZvc0FkbWluTmJHb2RDaGlsZHM6IFwiU2VzICNOQiBmaWxsZXVpbHMgOiBcIlxufTsiLCIvLyBRdWVscXVlcyBmb25jdGlvbnMgdXRpbGVzIHBvdXIgbGVzIGNoYcOubmVzXG5cbmNsYXNzIFRvb2xcbntcbiAgICBzdGF0aWMgaXNFbXB0eShteVZhcilcbiAgICB7XG4gICAgICAgIGlmKG15VmFyPT09dW5kZWZpbmVkIHx8IG15VmFyPT09bnVsbClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIG15VmFyKz1cIlwiOy8vIHNpIGF1dHJlIGNob3NlIHF1J3VuZSBjaGHDrm5lIGVudm95w6kuLi5cbiAgICAgICAgICAgIG15VmFyPW15VmFyLnRyaW0oKTtcbiAgICAgICAgICAgIGlmKG15VmFyPT09XCJcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgc3RhdGljIHRyaW1JZk5vdE51bGwobXlTdHJpbmcpXG4gICAge1xuICAgICAgICBpZihUb29sLmlzRW1wdHkobXlTdHJpbmcpKVxuICAgICAgICAgICAgbXlTdHJpbmc9bnVsbDtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVN0cmluZys9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVN0cmluZz1teVN0cmluZy50cmltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG15U3RyaW5nO1xuICAgIH1cblxuXG4gICAgc3RhdGljIHNob3J0ZW5JZkxvbmdlclRoYW4obXlTdHJpbmcsIG1heClcbiAgICB7XG4gICAgICAgIG15U3RyaW5nKz1cIlwiOy8vIGF1IGNhcyBvw7kgY2VsYSBuZSBzZXJhaXQgcGFzIHVuZSBjaGHDrm5lLi4uXG4gICAgICAgaWYobXlTdHJpbmcubGVuZ3RoID4gbWF4KVxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcuc3Vic3RyaW5nKDAsIChtYXgtMykpK1wiLi4uXCI7XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cbiAgICAvLyBzb3VyY2UgOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNTYwNDE0MC9yZXBsYWNlLW11bHRpcGxlLXN0cmluZ3Mtd2l0aC1tdWx0aXBsZS1vdGhlci1zdHJpbmdzXG4gICAgc3RhdGljIHJlcGxhY2VBbGwobXlTdHJpbmcsIG1hcE9iailcbiAgICB7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VFbHRzID0gbmV3IFJlZ0V4cChPYmplY3Qua2V5cyhtYXBPYmopLmpvaW4oXCJ8XCIpLFwiZ2lcIik7XG4gICAgICAgIHJldHVybiBteVN0cmluZy5yZXBsYWNlKHJlcGxhY2VFbHRzLCAobWF0Y2hlZCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG1hcE9ialttYXRjaGVkXTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZnIvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT2JqZXRzX2dsb2JhdXgvTWF0aC9yYW5kb21cbiAgICBzdGF0aWMgZ2V0UmFuZG9tSW50KG1pbiwgbWF4KVxuICAgIHtcbiAgICAgICAgbWluID0gTWF0aC5jZWlsKG1pbik7XG4gICAgICAgIG1heCA9IE1hdGguZmxvb3IobWF4KTtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pKSArIG1pbjtcbiAgICB9XG5cbiAgICAvLyDDoCBjb21wbMOpdGVyIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGF0ZV9mb3JtYXRfYnlfY291bnRyeVxuICAgIHN0YXRpYyBkYXRlRm9ybWF0KGRhdGVTdHJpbmcsIGxhbmc9XCJmclwiKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KGRhdGVTdHJpbmcpKVxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIGxldCBteURhdGU9bmV3IERhdGUoZGF0ZVN0cmluZyk7XG4gICAgICAgIGxldCBteURheT1teURhdGUuZ2V0RGF0ZSgpK1wiXCI7XG4gICAgICAgIGlmKG15RGF5Lmxlbmd0aD09PTEpXG4gICAgICAgICAgICBteURheT1cIjBcIitteURheTtcbiAgICAgICAgbGV0IG15TW91bnRoPShteURhdGUuZ2V0TW9udGgoKSsxKStcIlwiO1xuICAgICAgICBpZihteU1vdW50aC5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlNb3VudGg9XCIwXCIrbXlNb3VudGg7XG4gICAgICAgIGxldCBteVllYXI9bXlEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGlmKGxhbmc9PT1cImZyXCIpXG4gICAgICAgICAgICByZXR1cm4gbXlEYXkrXCIvXCIrbXlNb3VudGgrXCIvXCIrbXlZZWFyO1xuICAgICAgICBlbHNlIGlmIChsYW5nPT09XCJmb3JtXCIpLy8gMjAxNC0wMi0wOVxuICAgICAgICAgICAgcmV0dXJuIG15WWVhcitcIi1cIitteU1vdW50aCtcIi1cIitteURheTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG15TW91bnRoK1wiL1wiK215RGF5K1wiL1wiK215WWVhcjtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVG9vbDsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZGVmYXVsdC9jb25maWcvZnIuanNcIjogXCIuLi92aWV3cy9kZWZhdWx0L2NvbmZpZy9mci5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi92aWV3cyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC5qcyRcIjsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgaGVhZExpbmtzOlxuICAgIFtcbiAgICAgICAgeyBhbmNob3I6IFwiQWNjdWVpbFwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNb24gY29tcHRlXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb25uZXhpb24uaG10XCIsIGlkOiBcImFjY291bnRIZWFkTGlua1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiw4AgcHJvcG9zXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9hLXByb3Bvcy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDb250YWN0XCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb250YWN0Lmh0bWxcIiB9IH0sXG4gICAgXSxcbiAgICBmb290TGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJDcsOpZGl0c1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY3JlZGl0cy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNZW50aW9ucyBsw6lnYWxlc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvbWVudGlvbnMtbGVnYWxlcy5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiRG9ubsOpZXMgcGVyc29ubmVsbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9kb25uZWVzLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkMuRy5VLlwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY2d1Lmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDLkcuVi5cIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nndi5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICBdLFxuICAgIG1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlOiAxMCxcbiAgICB1c2VySG9tZVBhZ2UgOiBcImFjY3VlaWwuaHRtbFwiLFxuICAgIGFkbWluSG9tZVBhZ2UgOiBcImFkbWluLmh0bWxcIixcbiAgICBtYW5hZ2VySG9tZVBhZ2UgOiBcImdlc3Rpb24uaHRtbFwiLFxuICAgIHN1YnNjcmliZVBhZ2UgOiBcImluc2NyaXB0aW9uLmh0bWxcIixcbiAgICBjb25uZWN0aW9uUGFnZSA6IFwiY29ubmV4aW9uLmh0bWxcIixcbiAgICBhY2NvdW50UGFnZTogXCJjb21wdGUuaHRtbFwiLFxuICAgIHF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi1xdWl6cy5odG1sXCIsXG4gICAgdXNlcnNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXV0aWxpc2F0ZXVycy5odG1sXCIsXG4gICAgbmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSA6IDEwLFxuICAgIGlsbHVzdHJhdGlvbkRpciA6IFwiL2ltZy9xdWl6cy9cIixcbiAgICBzaXRlU2xvZ2FuOiBcIkN1bHRpdm9ucyBub3RyZSBqYXJkaW4gIVwiLFxuICAgIGhvbWVUaXRsZTE6IFwiRGUgbmF0dXJlIGN1cmlldXNlID9cIixcbiAgICBob21lUDE6IFwiQXZlYyBXaWtpTGVybmkgdm91cyBhcHByZW5leiBjaGFxdWUgam91ciBkZSBub3V2ZWxsZXMgY2hvc2VzLjxicj5EZXMgYXJ0aWNsZXMgZGUgV2lraXDDqWRpYSBzb250IHPDqWxlY3Rpb25uw6lzIHBvdXIgdm91cyBldCBzb250IHN1aXZpcyBkJ3VuIHF1aXogdm91cyBwZXJtZXR0YW50IGRlIHRlc3RlciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudS48YnI+RGUgam91ciBlbiBqb3VyIGRlIG5vdXZlbGxlcyBncmFpbmVzIGRlIHNhdm9pciBzb250IGFpbnNpIHNlbcOpZXMgZGFucyB2b3RyZSBcXFwiamFyZGluXFxcIi5cIixcbiAgICBob21lVGl0bGUyOiBcIkxhIGN1bHR1cmUgZW4gbGliZXJ0w6lcIixcbiAgICBob21lUDI6IFwiVG91dCBjb21tZSBzdXIgV2lraXDDqWRpYSAoKiksIGxlIGxvZ2ljaWVsIGV0IGxlIGNvbnRlbnUgcGFydGFnw6kgc3VyIFdpa2lMZXJuaSBzb250IGxpYnJlcy48YnI+Vm91cyBwb3V2ZXogbGVzIHV0aWxpc2VyLCBsZXMgbW9kaWZpZXIgZXQgbGVzIGRpZmZ1c2VyIHNlbG9uIHZvdHJlIHNvdWhhaXQuPGJyPlN1ciBXaWtpTGVybmksIHBhcyBkZSBwdWJsaWNpdMOpLCBuaSBkZSBjb21tZXJjaWFsaXNhdGlvbiBkZSB2b3MgZG9ubsOpZXMgcGVyc29ubmVsbGVzLjxicj5Wb3VzIHBvdXZleiB2ZW5pciB5IFxcXCJjdWx0aXZlciB2b3RyZSBqYXJkaW5cXFwiIGVuIHRvdXRlIHRyYW5xdWlsbGl0w6kuPGJyPjxicj48c21hbGw+PGVtPigqKSBCaWVuIHF1ZSBwYXJ0YWdlYW50IHNlcyB2YWxldXJzLCBXaWtpTGVybmkgZXN0IHVuIHByb2pldCBpbmTDqXBlbmRhbnQgZGUgbGEgZm9uZGF0aW9uIFdpa2lww6lkaWEuPC9lbT48L3NtYWxsPlwiLFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzVGl0bGU6IFwiTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzIHN1ciBXaWtpTGVybmlcIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc0ludHJvOiBcIkxpc3RlIGRlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyBzdXIgV2lraUxlcm5pLlwiLFxuICAgIGV4cGxhbmF0aW9uVGl0bGU6IFwiVm91cyBkw6ljb3V2cmV6IFdpa2lMZXJuaSA/XCIsXG4gICAgZXhwbGFuYXRpb25UeHQ6IFwiTGUgcHJpbmNpcGUgZXN0IHNpbXBsZSA6IHZvdXMgY29tbWVuY2V6IHBhciBsaXJlIGwnYXJ0aWNsZSBXaWtpcMOpZGlhIGRvbnQgbGUgbGllbiB2b3VzIGVzdCBwcm9wb3PDqS48YnI+UHVpcyB2b3VzIGFmZmljaGVyIGxlIHF1aXogcG91ciB2w6lyaWZpZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUgZGUgdm90cmUgbGVjdHVyZS4gVm91cyBvYnRlbmV6IGFsb3JzIHZvdHJlIHLDqXN1bHRhdCBpbW3DqWRpYXRlbWVudC48YnI+PGJyPlRvdXRlcyBsZXMgcsOpcG9uc2VzIHNlIHRyb3V2ZW50IGRhbnMgbCdhcnRpY2xlIHByb3Bvc8OpIMOgIGxhIGxlY3R1cmUuIDxiPlZvdXMgw6p0ZXMgaWNpIHBvdXIgYXBwcmVuZHJlIGRlIG5vdXZlbGxlcyBjaG9zZXM8L2I+LCBtYWlzIGxpYnJlIMOgIHZvdXMgZCdlc3NheWVyIGQneSByw6lwb25kcmUgaW1tw6lkaWF0ZW1lbnQuPGJyPjxicj5RdWFuZCBsZSBzdWpldCBzJ3kgcHLDqnRlLCBuZSB2b3VzIMOpdG9ubmV6IHBhcyBzaSBjZXJ0YWluZXMgZGVzIHLDqXBvbnNlcyBwcm9wb3PDqWVzIHBldXZlbnQgw6p0cmUgdW4gcGV1IGTDqWNhbMOpZXMsIGFic3VyZGVzLi4uIE9uIHBldXQgYXBwcmVuZHJlIGF2ZWMgbGUgc291cmlyZSwgbm9uID8gOi0pPGJyPjxicj5VbmUgZm9pcyB2b3RyZSByw6lzdWx0YXQgb2J0ZW51LCBpbCB2b3VzIHNlcmEgcHJvcG9zw6kgZGUgY3LDqWVyIHVuIGNvbXB0ZSBwb3VyIGxlIHNhdXZlZ2FyZGVyLjxicj5DZSBjb21wdGUgdm91cyBwZXJtZXR0cmEgZGUgdGVzdGVyIGRlIG5vdXZlYXUgY2UgcXVpeiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudSBwbHVzaWV1cnMgam91cnMsIHNlbWFpbmVzLCBtb2lzLi4uIEV0IGRlIHJlY2V2b2lyIHLDqWd1bGnDqHJlbWVudCBkZSBub3V2ZWxsZXMgc3VnZ2VzdGlvbnMgZGUgbGVjdHVyZXMuPGJyPjxicj5NYWlzIDxiPmxhIGNyw6lhdGlvbiBkZSBjZSBjb21wdGUgZXN0IGZhY3VsdGF0aXZlPC9iPiBldCA8YSBocmVmPScvcXVpenMvJyB0aXRsZT0nTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzJz52b3VzIHBvdXZleiBwYXJjb3VyaXIgV2lraUxlcm5pIGxpYnJlbWVudDwvYT4uXCIsXG4gICAgbm9KU05vdGlmaWNhdGlvbjogXCJEw6lzb2zDqSwgbWFpcyBwb3VyIGwnaW5zdGFudCwgbCd1dGlsaXNhdGlvbiBkZSBXaWtpTGVybmkgbsOpY2Vzc2l0ZSBsJ2FjdGl2YXRpb24gZHUgSmF2YVNjcmlwdC5cIixcbn07IiwiLy8gLS0gUEFHRSBEJ0FDQ1VFSUwgUE9VUiBMRVMgR0VTVElPTk5BSVJFU1xuXG4vLy8gVsOpcmlmaWUgcXVlIGwndXRpbGlzYXRldXIgZXN0IGJpZW4gY29ubmVjdMOpLCBhIGxlIGJvbiBzdGF0dXQgZXQgbGUgcmVkaXJpZ2UgdmVycyBsZSBmb3JtdWxhaXJlIGQnaW5zY3JpcHRpb24gc2kgY2Ugbidlc3QgcGFzIGxlIGNhcy5cbi8vLyBTaSBjJ2VzdCBvaywgb24gcsOpY3Vww6hyZSBsZXMgc3RhdHMgZ8OpbsOpcmFsZXMgZXQgZGVzIGRlcm5pw6hyZXMgMjRIIGV0IGxlcyBhZmZpY2hlXG4vLy8gT24gbGlzdGUgZW5zdWl0ZSBsZXMgcHJvY2hhaW5zIHF1aXpzIGRldmFudCDDqnRyZSBwdWJsacOpcyBlbiBmYWlzYW50IHJlc3NvcnRpciBjZXV4IGRldmFudCDDqnRyZSBjb21wbMOpdMOpcyArIGxhIHByb2NoYWluZSBkYXRlIHNhbnMgcXVpelxuLy8vIFVuIG1lbnUgcGVybWV0IMOgIGwndXRpbGlzYXRldXIgZCdhY2PDqWRlciBhdXggZm9ybXVsYWlyZXMgcGVybWV0dGFudCBkZSBnw6lyZXIgbGVzIHF1aXpzIGV0IGxlcyBjb21wdGVzIHV0aWxpc2F0ZXVycyBldCBhYm9ubmVtZW50c1xuLy8vIFVuIG1lc3NhZ2UgdmVuYW50IGQndW5lIGF1dHJlIHBhZ2UgcGV1dCBhdXNzaSDDqnRyZSDDoCBhZmZpY2hlciBsb3JzIGR1IHByZW1pZXIgY2hhcmdlbWVudC5cblxuLy8gRmljaGllciBkZSBjb25maWd1cmF0aW9uIGPDtHTDqSBjbGllbnQgOlxuaW1wb3J0IHsgYXBpVXJsLCBhdmFpbGFibGVMYW5ncywgdGhlbWUgfSBmcm9tIFwiLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCI7XG5jb25zdCBsYW5nPWF2YWlsYWJsZUxhbmdzWzBdO1xuY29uc3QgY29uZmlnRnJvbnRFbmQgPSByZXF1aXJlKFwiLi4vLi4vdmlld3MvXCIrdGhlbWUrXCIvY29uZmlnL1wiK2xhbmcrXCIuanNcIik7XG5cbi8vIEZvbmN0aW9ucyB1dGlsZXMgYXUgc2NyaXB0IDpcbmltcG9ydCB7IGdldExvY2FseSwgcmVtb3ZlTG9jYWx5IH0gZnJvbSBcIi4vdG9vbHMvY2xpZW50c3RvcmFnZS5qc1wiO1xuaW1wb3J0IHsgYWRkRWxlbWVudCB9IGZyb20gXCIuL3Rvb2xzL2RvbS5qc1wiO1xuaW1wb3J0IHsgaGVsbG9EZXYsIHVwZGF0ZUFjY291bnRMaW5rIH0gZnJvbSBcIi4vdG9vbHMvZXZlcnl3aGVyZS5qc1wiO1xuaW1wb3J0IHsgZGF0ZUZvcm1hdCwgaXNFbXB0eSwgcmVwbGFjZUFsbCB9IGZyb20gXCIuLi8uLi90b29scy9tYWluXCI7XG5pbXBvcnQgeyBjaGVja1Nlc3Npb24sIGdldENvbmZpZyB9IGZyb20gXCIuL3Rvb2xzL3VzZXJzLmpzXCI7XG5cbi8vIERpY3Rpb25uYWlyZXMgOlxuY29uc3QgdHh0ID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi9nZW5lcmFsXCIpO1xuY29uc3QgdHh0VXNlcnMgPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL3VzZXJcIik7XG5jb25zdCB0eHRRdWVzdGlvbm5haXJlID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi9xdWVzdGlvbm5haXJlXCIpO1xuXG4vLyBQcmluY2lwYXV4IMOpbMOpbWVudHMgZHUgRE9NIG1hbmlwdWzDqXMgOlxuY29uc3QgZGl2TWFpbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWFpbi1jb250ZW50XCIpO1xuY29uc3QgZGl2TWVzc2FnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWVzc2FnZVwiKTtcbmNvbnN0IGRpdlF1ZXN0aW9ubmFpcmVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJxdWVzdGlvbm5haXJlc1wiKTtcblxuaGVsbG9EZXYoKTtcblxuY29uc3QgaW5pdGlhbGlzZSA9IGFzeW5jICgpID0+XG57XG4gICAgdHJ5XG4gICAgeyAgICAgICAgXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IGdldENvbmZpZygpO1xuICAgICAgICBpZighY29uZmlnKVxuICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IGlzQ29ubmVjdGVkPWF3YWl0IGNoZWNrU2Vzc2lvbihbXCJtYW5hZ2VyXCIsIFwiYWRtaW5cIl0sIFwiL1wiK2NvbmZpZ0Zyb250RW5kLmNvbm5lY3Rpb25QYWdlLCB7IG1lc3NhZ2U6IHR4dC5ub3RBbGxvd2VkLCBjb2xvcjpcImVycm9yXCIgfSk7XG4gICAgICAgICAgICBpZihpc0Nvbm5lY3RlZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1c2VyPWdldExvY2FseShcInVzZXJcIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdXBkYXRlQWNjb3VudExpbmsodXNlci5zdGF0dXMsIGNvbmZpZ0Zyb250RW5kKTtcbiAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdk1lc3NhZ2UsIFwiaDRcIiwgdHh0VXNlcnMud2VsY29tZU1lc3NhZ2UucmVwbGFjZShcIiNOQU1FXCIsIHVzZXIubmFtZSkpO1xuICAgICAgICAgICAgICAgIGRpdk1haW4uc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgICAgICAgICAgaWYoIWlzRW1wdHkoZ2V0TG9jYWx5KFwibWVzc2FnZVwiKSkpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdk1lc3NhZ2UsIFwicFwiLCBnZXRMb2NhbHkoXCJtZXNzYWdlXCIsIHRydWUpLm1lc3NhZ2UsIFwiXCIsIFtnZXRMb2NhbHkoXCJtZXNzYWdlXCIsIHRydWUpLmNvbG9yXSwgXCJcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJtZXNzYWdlXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBMZXMgc3RhdHMgOiAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IHhoclN0YXRzID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgeGhyU3RhdHMub3BlbihcIkdFVFwiLCBhcGlVcmwrY29uZmlnLnVzZXJSb3V0ZXMrY29uZmlnLmdldEFkbWluU3RhdHMpO1xuICAgICAgICAgICAgICAgIHhoclN0YXRzLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UodGhpcy5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDApXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwVGV4dCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQl9VU0VSU18yNEggOiByZXNwb25zZS5uYk5ld1VzZXJzMjRILFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQl9TVUJTQ1JJUFRJT05TXzI0SCA6IHJlc3BvbnNlLlN1YnNjcmlwdGlvbnMubmJTdWJzY3JpcHRpb25zMjRILFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQl9VU0VSU19ERUxFVEVEXzI0SCA6IHJlc3BvbnNlLm5iRGVsZXRlZFVzZXJzMjRILFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQl9BTlNXRVJTXzI0SCA6IHJlc3BvbnNlLkFuc3dlcnMubmJBbnN3ZXJzMjRILFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQl9VU0VSU19UT1QgOiByZXNwb25zZS5uYk5ld1VzZXJzVG90LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQl9TVUJTQ1JJUFRJT05TX1RPVCA6IHJlc3BvbnNlLlN1YnNjcmlwdGlvbnMubmJTdWJzY3JpcHRpb25zVG90LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQl9TVUJTQ1JJUFRJT05TX1BSRU1JVU0gOiByZXNwb25zZS5TdWJzY3JpcHRpb25zLm5iU3Vic2NyaXB0aW9uc1ByZW1pdW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5CX0FOU1dFUlNfVE9UIDogcmVzcG9uc2UuQW5zd2Vycy5uYkFuc3dlcnNUb3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5CX1VTRVJTX0RFTEVURURfVE9UIDogcmVzcG9uc2UubmJEZWxldGVkVXNlcnNUb3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5CX1VTRVJTX0RFTEVURURfVkFMSURFRCA6IHJlc3BvbnNlLm5iRGVsZXRlZFVzZXJzV2FzVmFsaWRlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkJfVVNFUlNfREVMRVRFRF9QUkVNSVVNIDogcmVzcG9uc2UubmJEZWxldGVkVXNlcnNUb3RXYXNQcmVtaXVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdk1lc3NhZ2UsIFwicFwiLCByZXBsYWNlQWxsKHR4dC5zdGF0c0FkbWluLCBtYXBUZXh0KSwgXCJcIiwgXCJcIiwgXCJcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHhoclN0YXRzLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK3VzZXIudG9rZW4pOyBcbiAgICAgICAgICAgICAgICB4aHJTdGF0cy5zZW5kKCk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gTGVzIHF1ZXN0aW9ubmFpcmVzIGJpZW50w7R0IHB1Ymxpw6lzIDogICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCB4aHJOZXh0UXVlc3Rpb25uYWlyZXMgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICB4aHJOZXh0UXVlc3Rpb25uYWlyZXMub3BlbihcIkdFVFwiLCBhcGlVcmwrY29uZmlnLnF1ZXN0aW9ubmFpcmVSb3V0ZXMrY29uZmlnLmdldExpc3ROZXh0UXVlc3Rpb25uYWlyZXMpO1xuICAgICAgICAgICAgICAgIHhock5leHRRdWVzdGlvbm5haXJlcy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gMjAwICYmIEFycmF5LmlzQXJyYXkocmVzcG9uc2UucXVlc3Rpb25uYWlyZXMpKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaXN0SFRNTD1cIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiByZXNwb25zZS5xdWVzdGlvbm5haXJlcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RIVE1MKz1cIjxsaT5cIitkYXRlRm9ybWF0KHJlc3BvbnNlLnF1ZXN0aW9ubmFpcmVzW2ldLmRhdGVQdWJsaXNoaW5nLCBcImZyXCIpK1wiOiA8YSBocmVmPSdcIitjb25maWdGcm9udEVuZC5xdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlK1wiP2lkPVwiK3Jlc3BvbnNlLnF1ZXN0aW9ubmFpcmVzW2ldLmlkK1wiJz5cIityZXNwb25zZS5xdWVzdGlvbm5haXJlc1tpXS50aXRsZStcIjwvYT5cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2UucXVlc3Rpb25uYWlyZXNbaV0uaXNQdWJsaXNoYWJsZT09PWZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdEhUTUwrPVwiIDxzcGFuIGNsYXNzPSdlcnJvcic+KFwiK3R4dFF1ZXN0aW9ubmFpcmUubmVlZEJlQ29tcGxldGVkK1wiKTwvbGk+XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RIVE1MKz1cIjwvbGk+XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLnF1ZXN0aW9ubmFpcmVzLmxlbmd0aCE9PTApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlF1ZXN0aW9ubmFpcmVzLCBcImgzXCIsIHR4dFF1ZXN0aW9ubmFpcmUubmV4dFF1ZXN0aW9ubmFpcmVzTGlzdC5yZXBsYWNlKFwiI05CXCIsIHJlc3BvbnNlLnF1ZXN0aW9ubmFpcmVzLmxlbmd0aCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UXVlc3Rpb25uYWlyZXMsIFwiaDRcIiwgdHh0UXVlc3Rpb25uYWlyZS5uZXh0RGF0ZVdpdGhvdXRRdWVzdGlvbm5haXJlK2RhdGVGb3JtYXQocmVzcG9uc2UuZGF0ZU5lZWRlZCwgXCJmclwiKSwgXCJcIiwgW1wiaW5mb3JtYXRpb25cIl0sIFwiXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlF1ZXN0aW9ubmFpcmVzLCBcInVsXCIsIGxpc3RIVE1MLCBcIlwiLCBcIlwiLCBcIlwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgeGhyTmV4dFF1ZXN0aW9ubmFpcmVzLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK3VzZXIudG9rZW4pOyBcbiAgICAgICAgICAgICAgICB4aHJOZXh0UXVlc3Rpb25uYWlyZXMuc2VuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoKGUpXG4gICAge1xuICAgICAgICBhZGRFbGVtZW50KGRpdk1lc3NhZ2UsIFwicFwiLCB0eHQuc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICB9XG59XG5pbml0aWFsaXNlKCk7IiwiLy8gRk9OQ1RJT05TIFVUSUxFUyBBVSBTVE9DS0FHRSBMT0NBTCAoU0VTU0lPTiwgQ09PS0lFUywgSU5ERVhEQiwgRVRDLilcbi8vIFJldmVuaXIgcG91ciBnw6lyZXIgbGUgY2FzIG/DuSBsb2NhbC5zdG9yYWdlIG4nZXN0IHBhcyBjb25udSBwb3VyIHV0aWxpc2VyIGNvb2tpZVxuICAgIFxuZXhwb3J0IGNvbnN0IHNhdmVMb2NhbHkgPSAobmFtZSwgZGF0YSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShuYW1lLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2NhbHkgPSAobmFtZSwganNvbj1mYWxzZSkgPT5cbntcbiAgICBpZihqc29uKVxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKSk7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSk7XG59XG5cbmV4cG9ydCBjb25zdCByZW1vdmVMb2NhbHkgPSAobmFtZSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShuYW1lKTtcbn0iLCJpbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gRm9uY3Rpb24gYXNzb2NpYW50IGxlcyBhdHRyaWJ1dHMgZm91cm5pcyDDoCB1biBjaGFtcCBkZSBmb3JtdWxhaXJlXG5leHBvcnQgY29uc3QgYWRkRWxlbWVudCA9IChlbHRQYXJlbnQsIGVsdFR5cGUsIGVsdENvbnRlbnQ9XCJcIiwgZWx0SWQ9XCJcIiwgZWx0Q2xhc3M9W10sIGVsdEF0dHJpYnV0ZXM9e30sIHJlcGxhY2U9dHJ1ZSkgPT5cbntcbiAgICBpZihpc0VtcHR5KGVsdFR5cGUpIHx8IGlzRW1wdHkoZWx0UGFyZW50KSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGVsc2VcbiAgICB7XG4gICAgICAgIGNvbnN0IG5ld0VsZW1lbnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlbHRUeXBlKTtcbiAgICAgICAgXG4gICAgICAgIGlmKCFpc0VtcHR5KGVsdElkKSkvLyB0ZXN0ZXIgc2kgbCdpZCBuJ2VzdCBwYXMgZMOpasOgIHV0aWxpc8OpIGRhbnMgbGUgRE9NID9cbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaWQ9ZWx0SWQ7XG5cbiAgICAgICAgaWYoQXJyYXkuaXNBcnJheShlbHRDbGFzcykgJiYgZWx0Q2xhc3MubGVuZ3RoIT0wKVxuICAgICAgICB7XG4gICAgICAgICAgICBmb3IobGV0IGkgaW4gZWx0Q2xhc3MpXG4gICAgICAgICAgICAgICAgbmV3RWxlbWVudC5jbGFzc0xpc3QuYWRkKGVsdENsYXNzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHR5cGVvZiBlbHRBdHRyaWJ1dGVzID09PSBcIm9iamVjdFwiKSAvLyAhISB0b3VzIGxlcyBvYmpldHMgbmUgc29udCBwYXMgb2tcbiAgICAgICAge1xuICAgICAgICAgICAgZm9yKGxldCBhdHRyaWJ1dE5hbWUgaW4gZWx0QXR0cmlidXRlcylcbiAgICAgICAgICAgICAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dE5hbWUsIGVsdEF0dHJpYnV0ZXNbYXR0cmlidXROYW1lXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZighaXNFbXB0eShlbHRDb250ZW50KSlcbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaW5uZXJIVE1MPWVsdENvbnRlbnQucmVwbGFjZSgvXFxuL2csXCI8YnI+XCIpOy8vIGlubmVySFRNTCBwZXJtZXQgZCdham91dGVyIGR1IHRleHRlIGF5YW50IGx1aS1tw6ptZSBkZXMgYmFsaXNlcywgZXRjLlxuICAgICAgICAgICAgXG4gICAgICAgIGlmKHJlcGxhY2UpXG4gICAgICAgICAgICBlbHRQYXJlbnQuaW5uZXJIVE1MPVwiXCI7XG4gICAgICAgIGVsdFBhcmVudC5hcHBlbmRDaGlsZChuZXdFbGVtZW50KTtcbiAgICB9ICAgIFxufSIsIi8vIENlIHNjcmlwdCBmb3Vybml0IGRlcyBmb25jdGlvbnMgdXRpbGlzw6llcyBzdXIgdG91dGVzIGxlcyBwYWdlcyBkdSBzaXRlXG5cbmV4cG9ydCBjb25zdCBoZWxsb0RldiA9ICgpID0+XG57XG4gICAgY29uc29sZS5sb2coXCIqKioqIEhlbGxvIGFtaSBkw6l2ZWxvcHBldXIgOi0pXFxuIExlIGNvZGUgZGUgV2lraUxlcm5pIGVzdCBsaWJyZSBldCBlc3QgbGlzaWJsZSBzdXIgZ2l0bGFiIDogXFxuIEJvbm5lIGxlY3R1cmUgOi0pIFxcbiBQb3VyIGxlcyBzdWdnZXN0aW9ucyBkJ2Ftw6lsaW9yYXRpb24gb3UgcXVlc3Rpb25zIDogZGV2QHdpbGlsZXJuaS5jb20gKioqKlwiKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUFjY291bnRMaW5rID0gKHN0YXR1cywgY29uZmlnVGVtcGxhdGUpID0+XG57XG4gICAgY29uc3QgbGluaz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFjY291bnRIZWFkTGlua1wiKTtcbiAgICBjb25zdCBob21lUGFnZT1zdGF0dXMrXCJIb21lUGFnZVwiO1xuICAgIGxpbmsuaHJlZj1cIi9cIitjb25maWdUZW1wbGF0ZVtob21lUGFnZV07XG59IiwiaW1wb3J0IHsgYXBpVXJsLCBhdmFpbGFibGVMYW5ncywgc2l0ZVVybCwgdGhlbWUgfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCI7XG5jb25zdCBsYW5nPWF2YWlsYWJsZUxhbmdzWzBdO1xuXG5jb25zdCBjb25maWdUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi8uLi8uLi92aWV3cy9cIit0aGVtZStcIi9jb25maWcvXCIrbGFuZytcIi5qc1wiKTtcbmltcG9ydCB7ICBjaGVja0xvZ2luUm91dGUsIHRpbWVEaWZmZXJlbmNlTWF4LCB0aW1lRGlmZmVyZW5jZU1pbiwgdXNlclJvdXRlcyB9IGZyb20gXCIuLi8uLi8uLi9jb25maWcvdXNlcnMuanNcIjtcblxuaW1wb3J0IHsgZ2V0TG9jYWx5LCByZW1vdmVMb2NhbHksIHNhdmVMb2NhbHkgfSBmcm9tIFwiLi9jbGllbnRzdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gUsOpY3Vww6hyZSBsZXMgZG9ubsOpZXMgZGUgY29uZmlndXJhdGlvbiBkZXMgdXRpbGlzYXRldXJzXG4vLyDDgCB0ZXJtZSwgdW4gZmljaGllciBzdGF0aXF1ZSBpbXBvcnRhYmxlIGNvbW1lIG1vZHVsZSBkZXZyYWl0IMOpdml0ZXIgdW5lIHJlcXXDqnRlIGFqYXhcbmV4cG9ydCBjb25zdCBnZXRDb25maWcgPSAgYXN5bmMgKCkgPT5cbntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBhcGlVcmwrXCIvdXNlci9nZXRjb25maWdcIik7XG4gICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCkpO1xuICAgICAgICB4aHIub25lcnJvciA9ICgpID0+IHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICAgIHhoci5zZW5kKCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRUaW1lRGlmZmVyZW5jZSA9ICgpID0+XG57XG4gICAgY29uc3QgdGltZUxvY2FsPW5ldyBEYXRlKCkuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICBpZih0aW1lTG9jYWwgPiB0aW1lRGlmZmVyZW5jZU1heCB8fCB0aW1lTG9jYWwgPCB0aW1lRGlmZmVyZW5jZU1pbilcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgZWxzZSByZXR1cm4gdGltZUxvY2FsO1xufVxuXG4vLyBPbiBlbmzDqHZlIHZvbG9udGFpcmVtZW50IGxlcyAwL08gcG91ciDDqXZpdGVyIGxlcyBjb25mdXNpb25zICFcbi8vIEV0IG1pZXV4IHZhdXQgYXVzc2kgZMOpYnV0ZXIgZXQgZmluaXIgcGFyIHVuZSBsZXR0cmUgc2ltcGxlLlxuZXhwb3J0IGNvbnN0IGdldFBhc3N3b3JkID0gKG5iQ2FyTWluLCBuYkNhck1heCkgPT5cbntcbiAgICBjb25zdCBuYkNhcj1uYkNhck1pbitNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqKG5iQ2FyTWF4LW5iQ2FyTWluKSk7XG4gICAgY29uc3QgbGV0dGVycz1cIkFCQ0RFRkdISUpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbnBxcnN0dXZ3eHl6XCI7XG4gICAgY29uc3Qgb3RoZXJzPVwiMTIzNDU2Nzg5IT8uKi1fJUAmw4nDgMOIw5nigqwkw4LDisObw45cIjtcbiAgICBsZXQgcGFzc3dvcmQ9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICBmb3IobGV0IGk9MTtpPChuYkNhci0xKTtpKyspXG4gICAge1xuICAgICAgICBpZigoaSAlIDIpID09PTEpXG4gICAgICAgICAgICBwYXNzd29yZCs9b3RoZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpvdGhlcnMubGVuZ3RoKV07XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHBhc3N3b3JkKz1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldOyAgIFxuICAgIH1cbiAgICBwYXNzd29yZCs9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICByZXR1cm4gcGFzc3dvcmQ7XG59XG5cbi8vIEondXRpbGlzZSBsZSBzdG9ja2FnZSBsb2NhbCBkdSBuYXZpZ2F0ZXVyIHBvdXIgZW5yZWdpc3RyZXIgbGVzIGRvbm7DqWVzIHBlcm1ldHRhbnQgZGUgcmVjb25uYcOudHJlIGwndXRpbGlzYXRldXIgcGFyIGxhIHN1aXRlXG4vLyBTZXVsIGxlIHNlcnZldXIgcG91cnJhIHbDqXJpZmllciBxdWUgbGVzIGlkZW50aWZpYW50cyBzb250ICh0b3Vqb3VycykgdmFsaWRlcy5cbmV4cG9ydCBjb25zdCBzZXRTZXNzaW9uID0gKHVzZXJJZCwgdG9rZW4sIGR1cmF0aW9uVFMpID0+XG57XG4gICAgY29uc3Qgc3RvcmFnZVVzZXI9XG4gICAge1xuICAgICAgICBpZDogdXNlcklkLFxuICAgICAgICB0b2tlbjogdG9rZW4sXG4gICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvblRTXG4gICAgfVxuICAgIHNhdmVMb2NhbHkoXCJ1c2VyXCIsIHN0b3JhZ2VVc2VyKTtcbn1cblxuLy8gVsOpcmlmaWUgcXUnaWwgeSBhIGRlcyBkb25uw6llcyBsb2NhbGVzIGNvbmNlcm5hbnQgbGUgcsOpc3VsdGF0IGQndW4gcXVpelxuLy8gRXQgbGVzIGFqb3V0ZSBhdXggZG9ubsOpZXMgZW52b3nDqWVzIHBhciBsZXMgZm9ybXVsYWlyZXMgZCdpbnNjcmlwdGlvbi9jb25uZXhpb24gc2kgYydlc3QgbGUgY2FzXG5leHBvcnQgY29uc3QgY2hlY2tBbnN3ZXJEYXRhcyA9IChkYXRhcykgPT5cbntcbiAgICBjb25zdCBsYXN0QW5zd2VyPWdldExvY2FseShcImxhc3RBbnN3ZXJcIik7XG4gICAgaWYoIWlzRW1wdHkobGFzdEFuc3dlcikpXG4gICAge1xuICAgICAgICBjb25zdCBhbnN3ZXI9SlNPTi5wYXJzZShsYXN0QW5zd2VyKTtcbiAgICAgICAgaWYoIWlzRW1wdHkoYW5zd2VyLmR1cmF0aW9uKSAmJiAhaXNFbXB0eShhbnN3ZXIubmJDb3JyZWN0QW5zd2VycykgJiYgIWlzRW1wdHkoYW5zd2VyLlF1ZXN0aW9ubmFpcmVJZCkgJiYgIWlzRW1wdHkoYW5zd2VyLm5iUXVlc3Rpb25zKSlcbiAgICAgICAge1xuICAgICAgICAgICAgZGF0YXMuZHVyYXRpb249YW5zd2VyLmR1cmF0aW9uO1xuICAgICAgICAgICAgZGF0YXMubmJDb3JyZWN0QW5zd2Vycz1hbnN3ZXIubmJDb3JyZWN0QW5zd2VycztcbiAgICAgICAgICAgIGRhdGFzLlF1ZXN0aW9ubmFpcmVJZD1hbnN3ZXIuUXVlc3Rpb25uYWlyZUlkO1xuICAgICAgICAgICAgZGF0YXMubmJRdWVzdGlvbnM9YW5zd2VyLm5iUXVlc3Rpb25zO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhcztcbn1cblxuLy8gQ2V0dGUgZm9uY3Rpb24gdGVzdGUgbGEgY29ubmV4aW9uIGRlIGwndXRpbGlzYXRldXIgZCd1bmUgcGFnZVxuLy8gT24gcGV1dCBmb3VybmlzIHVuZSBsaXN0ZSBkZSBzdGF0dXRzIGFjY2VwdMOpcyAoc2kgdmlkZSA9IHRvdXMpLCBhaW5zaSBxdSd1bmUgdXJsIGRlIHJlZGlyZWN0aW9uIHNpIG5vbiBjb25uZWN0w6ksIHVuIG1lc3NhZ2UgZCdlcnJldXIgw6AgYWZmaWNoZXIgc3VyIGxhIHBhZ2UgZGUgZGVzdGluYXRpb24gZXQgbCd1cmwgc3VyIGxhcXVlbGxlIHJldmVuaXIgdW5lIGZvaXMgY29ubmVjdMOpXG5leHBvcnQgY29uc3QgY2hlY2tTZXNzaW9uID0gYXN5bmMgKHN0YXR1cz1bXSwgdXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCkgPT5cbntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IHVzZXJEYXRhcz1nZXRMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICBpZihpc0VtcHR5KHVzZXJEYXRhcykpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgdXNlcj1KU09OLnBhcnNlKHVzZXJEYXRhcyk7XG4gICAgICAgICAgICBpZihpc0VtcHR5KHVzZXIuaWQpIHx8wqBpc0VtcHR5KHVzZXIudG9rZW4pIHx8IGlzRW1wdHkodXNlci5kdXJhdGlvbikgfHwgdXNlci5kdXJhdGlvbiA8IERhdGUubm93KCkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgYXBpVXJsK3VzZXJSb3V0ZXMrY2hlY2tMb2dpblJvdXRlK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDAgJiYgcmVzcG9uc2UuaXNWYWxpZCAmJiByZXNwb25zZS5pZCAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLmlkPT09dXNlci5pZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLm5hbWU9cmVzcG9uc2UubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLmxhbmd1YWdlPXJlc3BvbnNlLmxhbmd1YWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIudGltZURpZmZlcmVuY2U9cmVzcG9uc2UudGltZURpZmZlcmVuY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5zdGF0dXM9cmVzcG9uc2Uuc3RhdHVzOy8vIGxlIHRva2VuIGV0IGRlIHRvdXRlIGZhw6dvbiB2w6lyaWZpZXIgw6AgY2hhcXVlIHJlcXXDqnRlIMOgIGwnQVBJXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUxvY2FseShcInVzZXJcIiwgdXNlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2kgaWwgcydhZ2l0IGQndW4gXCJ1c2VyXCIgZXQgcXVlIHNvbiBhYm9ubmVtZW50IGEgZXhwaXLDqSwgamUgbGUgcmVkaXJpZ2UgdmVycyBsYSBjYWlzc2UgOi0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2Uuc3RhdHVzPT09XCJ1c2VyXCIgJiYgcmVzcG9uc2UubmJEYXlzT2sgPD0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybEFjY291bnQ9c2l0ZVVybCtcIi9cIitjb25maWdUZW1wbGF0ZVtsYW5nXS5hY2NvdW50UGFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZih1cmxBY2NvdW50KT09PS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIi9cIitjb25maWdUZW1wbGF0ZVtsYW5nXS5hY2NvdW50UGFnZSk7Ly8gcGFzc8OpZSBkaXJlY3RlbWVudCBpY2ksIGwnYW5jcmUgI3N1YnNjcmliZSBuZSBmb25jdGlvbm5lIHBhcyAhP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzdGF0dXMubGVuZ3RoIT09MCAmJiBzdGF0dXMuaW5kZXhPZihyZXNwb25zZS5zdGF0dXMpPT09LTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHhoci5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICAgICAgICAgICAgICB4aHIuc2VuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4vLyBDZXR0ZSBmb25jdGlvbiBzZXJ0IMOgIGxhIHByw6ljw6lkZW50ZSBlbiBjYXMgZGUgY29ubmV4aW9uIG5vbiB2YWxpZGVcbmNvbnN0IHJlZGlyZWN0VXNlciA9ICh1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKSA9Plxue1xuICAgIGlmKCFpc0VtcHR5KG1lc3NhZ2UpKVxuICAgICAgICBzYXZlTG9jYWx5KFwibWVzc2FnZVwiLCBtZXNzYWdlKTtcbiAgICBpZighaXNFbXB0eSh1cmxXYW50ZWQpKVxuICAgICAgICBzYXZlTG9jYWx5KFwidXJsXCIsIHVybFdhbnRlZCk7XG4gICAgaWYoIWlzRW1wdHkodXJsUmVkaXJlY3Rpb24pKVxuICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKHVybFJlZGlyZWN0aW9uKTtcbn0iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/front/public/JS/homeUser.app.js b/front/public/JS/homeUser.app.js new file mode 100644 index 0000000..5d63566 --- /dev/null +++ b/front/public/JS/homeUser.app.js @@ -0,0 +1,1518 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "./src/homeUser.js"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "../config/instance.js": +/*!*****************************!*\ + !*** ../config/instance.js ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var _module$exports; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var users = __webpack_require__(/*! ./users */ "../config/users.js"); + +var questionnaires = __webpack_require__(/*! ./questionnaires */ "../config/questionnaires.js"); + +module.exports = (_module$exports = { + apiUrl: "http://localhost:3000/api", + siteUrl: "http://localhost:8080", + adminName: "Fabrice", + adminEmail: "dev@wikilerni.com", + senderName: "WikiLerni", + senderEmail: "bonjour@wikilerni.com", + adminLang: "fr", + theme: "default", + // le thème utilisé (dans /views) pour générer les pages HTML. Contient ses propres fichiers de configuration. + availableLangs: ["fr"], + // Languages in which the site is available. The first one is the default one. + siteName: "WikiLerni", + beginCodeGodfather: "wikilerni", + // case-sensitive and can't contain "@" ! + cronTimingAlertInSeconde: 120, + // for logs + responseTimingAlertInSeconde: 3, + // idem + tokenSignupValidationTimeInHours: "48h", + // https://github.com/zeit/ms + tokenLoginLinkTimeInHours: "1h", + tokenConnexionMinTimeInHours: "24h", + tokenConnexionMaxTimeInDays: "180 days", + tokenLoginChangingTimeInHours: "1h", + // for email & password changing + tokenDeleteUserTimeInHours: "1h", + tokenUnsubscribeLinkTimeInDays: "7 days", + // token send with subscription's emails + freeAccountTimingInDays: 10, + freeAccountExpirationNotificationInDays: 5, + accountExpirationFirstNotificationInDays: 14, + accountExpirationSecondNotificationInDays: 5, + inactiveAccountTimeToDeleteInDays: 180, + // Questionnaires: + nbQuestionsMin: 1, + // minimum number of questions for the questionnaire to be publishable + nbQuestionsMax: 10, + // if 0 = not maximum + nbChoicesMax: 10, + nbNewQuestionnaires: 10, + // for RSS, etc. + hourGiveNewQuestionnaireBegin: 1, + // in user local time + hourGiveNewQuestionnaireEnd: 24, + // idem + numberNewQuestionnaireAtSameTime: 50, + // for mass mailing + minSearchQuestionnaires: 3, + // Illustrations: + nbIllustrationsMin: 0, + nbIllustrationsMax: 1, + maxIllustrationSizeinOctet: 1000000, + // pas contrôlé pour l'instant. À revoir. + mimeTypesForIllustration: ["image/jpg", "image/jpeg", "image/png", "image/gif", "image/png"], + // -- Upload and resize: + illustrationsWidthMaxInPx: 400, + illustrationsMiniaturesWidthMaxInPx: 200, + // Links: + nbLinksMin: 1, + nbLinksMax: 1 +}, _defineProperty(_module$exports, "nbQuestionsMin", questionnaires.nbQuestionsMin), _defineProperty(_module$exports, "nbQuestionsMax", questionnaires.nbQuestionsMax), _defineProperty(_module$exports, "nbChoicesMax", questionnaires.nbChoicesMax), _defineProperty(_module$exports, "passwordMinLength", users.password.minlength), _defineProperty(_module$exports, "dirCacheUsers", users.dirCacheUsers), _defineProperty(_module$exports, "dirCacheUsersAnswers", users.dirCacheUsersAnswers), _defineProperty(_module$exports, "dirCacheQuestionnaires", questionnaires.dirCacheQuestionnaires), _defineProperty(_module$exports, "dirCacheQuestions", questionnaires.dirCacheQuestions), _defineProperty(_module$exports, "dirCacheUsersQuestionnaires", questionnaires.dirCacheUsersQuestionnaires), _defineProperty(_module$exports, "dirHTMLQuestionnaire", questionnaires.dirHTMLQuestionnaire), _defineProperty(_module$exports, "dirWebQuestionnaire", questionnaires.dirWebQuestionnaire), _module$exports); + +/***/ }), + +/***/ "../config/questionnaires.js": +/*!***********************************!*\ + !*** ../config/questionnaires.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + // API'routes (after "apiUrl" defined in instance.js) + questionnaireRoutes: "/questionnaire", + getQuestionnaireRoutes: "/get", + previewQuestionnaireRoutes: "/preview", + publishedQuestionnaireRoutes: "/quiz/", + saveAnswersRoute: "/answer/", + getStatsQuestionnaires: "/stats/", + searchQuestionnairesRoute: "/search", + searchAdminQuestionnairesRoute: "/searchadmin", + getListNextQuestionnaires: "/getlistnextquestionnaires/", + // -- questions & choices : + questionsRoute: "/question/", + // -- tags : + tagsSearchRoute: "/tags/search/", + // -- answers : + getQuestionnairesWithoutAnswer: "/withoutanswer/user/", + getPreviousAnswers: "/user/answers/", + getStatsAnswers: "/user/anwswers/stats/", + getAdminStats: "/getadminstats/", + // forms : à compléter avec valeurs par défaut, etc. cf modèle + Questionnaire: { + title: { + maxlength: 255, + required: true + }, + slug: { + maxlength: 150 + }, + // champ requis mais calculé à partir du titre qd vide + introduction: { + required: true + } + }, + searchQuestionnaires: { + minlength: 3, + required: true + }, + Question: { + text: { + maxlength: 255, + required: true + }, + rank: { + required: true, + min: 1, + defaultValue: 1 + } + }, + Choice: { + text: { + maxlength: 255, + required: true + } + }, + nbQuestionsMin: 1, + nbQuestionsMax: 10, + nbChoicesMax: 10, + nbTagsMin: 0, + nbTagsMax: 0, + // 0 = not max + // JSON and HTML dir + dirCacheQuestionnaires: "datas/questionnaires", + dirCacheQuestions: "datas/questionnaires/questions", + dirCacheUsersQuestionnaires: "datas/users/questionnaires", + dirCacheTags: "datas/questionnaires/tags", + dirHTMLQuestionnaire: "front/public/quiz", + dirHTMLTags: "front/public/quizs", + dirWebQuestionnaire: "quiz", + //pour url page + dirWebTags: "quizs" // idem + +}; + +/***/ }), + +/***/ "../config/users.js": +/*!**************************!*\ + !*** ../config/users.js ***! + \**************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + // API'routes (after "apiUrl" defined in instance.js) + userRoutes: "/user", + subscribeRoute: "/signup", + getGodfatherRoute: "/getgodfatherid", + checkIfIsEmailfreeRoute: "/isemailfree", + checkSubscribeTokenRoute: "/validation/", + checkLoginRoute: "/checklogin/", + connectionRoute: "/login", + getLoginLinkRoute: "/getloginlink", + connectionWithLinkRoute: "/checkloginlink", + getUserInfos: "/get/", + createUserRoute: "/create", + validateUserRoute: "/validate/", + updateUserInfos: "/modify/", + searchUserRoute: "/search/", + getGodChilds: "/getgodchilds/", + checkNewLoginLinkRoute: "/confirmnewlogin/", + checkDeleteLinkRoute: "/confirmdelete/", + getPayments: "/payment/getforoneuser/", + unsubscribeRoute: "/subscription/stop/", + getAdminStats: "/getadminstats/", + // forms : à compléter avec valeurs par défaut, etc. cf modèle + name: { + maxlength: 70, + required: true + }, + email: { + maxlength: 255, + required: true + }, + password: { + minlength: 8, + maxlength: 72, + required: true + }, + // https://www.npmjs.com/package/bcrypt#security-issues-and-concerns + newPassword: { + minlength: 8, + maxlength: 72 + }, + codeGodfather: { + maxlength: 255 + }, + cguOk: { + value: "true", + required: true + }, + timeDifferenceMin: -720, + timeDifferenceMax: 840, + // JSON dir + dirCacheUsers: "datas/users", + dirCacheUsersAnswers: "datas/users/questionnaires/answers" +}; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/answer$": +/*!*************************************!*\ + !*** ../lang sync ^\.\/.*\/answer$ ***! + \*************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/answer": "../lang/fr/answer.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/answer$"; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/general$": +/*!**************************************!*\ + !*** ../lang sync ^\.\/.*\/general$ ***! + \**************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/general": "../lang/fr/general.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/general$"; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/questionnaire$": +/*!********************************************!*\ + !*** ../lang sync ^\.\/.*\/questionnaire$ ***! + \********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/questionnaire": "../lang/fr/questionnaire.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/questionnaire$"; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/user$": +/*!***********************************!*\ + !*** ../lang sync ^\.\/.*\/user$ ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/user": "../lang/fr/user.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/user$"; + +/***/ }), + +/***/ "../lang/fr/answer.js": +/*!****************************!*\ + !*** ../lang/fr/answer.js ***! + \****************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + needNumberUserResponses: "Le nombre de questions auxquelles l'utilisateur a répondu doit être fourni.", + needIntegerNumberUserResponses: "Le nombre de questions auxquelles l'utilisateur a répondu doit être un nombre entier.", + needMinNumberUserResponses: "Le nombre de questions auxquelles l'utilisateur a répondu ne peut être inférieur à 1.", + needMaxNumberUserResponses: "Le nombre de questions auxquelles l'utilisateur a répondu ne peut être aussi élevé.", + needNumberCorrectResponses: "Le nombre de réponses correctes doit être fourni.", + needIntegerNumberCorrectResponses: "Le nombre de réponses correctes doit être un nombre entier.", + needMinNumberCorrectResponses: "Le nombre de réponses correctes ne peut être négatif.", + needMaxNumberCorrectResponses: "Le nombre de réponses correctes ne peut être supérieur au nombre de questions.", + needIntegerNumberSecondesResponse: "La durée de la réponse doit être un nombre entier de secondes.", + needMinNumberSecondesResponse: "La durée de la réponse ne peut être négative.", + checkResponsesOuputFail: "Vous avez répondu en DURATION secondes et avez NBCORRECTANSWERS bonne(s) réponse(s) sur NBQUESTIONS. C'est certain, vous ferez mieux la prochaine fois !", + checkResponsesOuputMedium: "Vous avez répondu en DURATION secondes et avez NBCORRECTANSWERS bonne(s) réponse(s) sur NBQUESTIONS. C'est pas mal du tout !", + checkResponsesOuputSuccess: "Vous avez répondu en DURATION secondes et avez NBCORRECTANSWERS bonne(s) réponse(s) sur NBQUESTIONS. Bravo ! Rien ne vous échappe !", + wantToSaveResponses: "Si vous le souhaitez, vous pouvez sauvegarder votre résultat en créant votre compte.\nCela vous permettra de tester de nouveau ce quiz dans l'avenir pour voir si vous avez mémoriser les bonnes réponses. Vous pourrez ainsi aussi recevoir régulièrement de nouveaux quizs.", + responseSavedMessage: "Votre résultat a été enregistré. Accèder à tous vos quizs.", + responseSavedError: "Cependant une erreur a été rencontrée durant l'enregistrement de votre résultat. Accèder à tous vos quizs.", + noQuestionnaireWithoudAnswer: "Bravo ! Vous avez répondu à tous les quizs qui vous on été proposés !
    Il y en a des nouveaux publiés régulièrement et qui vous seront proposés.
    En attendant vous pouvez peut-être essayer de répondre de nouveau à certain quiz pour voir si vous vous souvenez des bonnes réponses ?", + nbQuestionnaireWithoudAnswer: "Il y a #NB quizs qui vous ont été proposés et auxquels vous n'avez pas répondu. Voici les derniers :!", + statsUser: "Vous avez enregistré NBANSWERS réponses à NBQUESTIONNAIRES questionnaires différents sur les NBTOTQUESTIONNAIRES proposés par le site.
    En moyenne, vous avez mis AVGDURATION secondes à répondre et avez correctement répondu à AVGCORRECTANSWERS % des questions.", + previousAnswersTitle: "Bonjour #NOM, voici vos précédents résultats à ce quiz", + previousAnswersStats: "En moyenne, vous avez répondu à ce quiz en AVGDURATION secondes, en ayant AVGCORRECTANSWERS % de bonnes réponses.", + previousAnswersLine: "Le DATEANSWER, vous avez répondu correctement à NBCORRECTANSWERS questions en AVGDURATION secondes.", + noPreviousAnswer: "Bonjour #NOM, c'est la première fois que vous répondez à ce quiz. Bonne lecture !" +}; + +/***/ }), + +/***/ "../lang/fr/general.js": +/*!*****************************!*\ + !*** ../lang/fr/general.js ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + siteHTMLTitle: "WikiLerni : qu'allez-vous apprendre aujourd'hui ?", + siteMetaDescription: "Chaque jour, testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.", + scriptTimingInfo: "Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", + scriptTimingAlert: "*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", + serverError: "Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.", + serverErrorAdmin: "Bug de l'application :", + neededParams: "Des paramètres nécessaires manquants sont manquants.", + badUrl: "Tentative d'accès à une page n'existant pas :", + notValidFormat: "Format non valide.", + notAllowed: "Vous n'avez pas les droits nécessaires pour cette action.", + notRequired: "Facultatif.", + updateBtnTxt: "Modifier", + addBtnTxt: "Ajouter", + deleteBtnTxt: "Supprimer", + addOkMessage: "Les données ont bien été enregistrées.", + updateOkMessage: "La mise à jour à jour a bien été enregistrée.", + deleteOkMessage: "La suppression a bien été enregistrée.", + failAuth: "Erreur d'authentification.", + failAuthHeader: "Absence de header Authorization.", + failAuthToken: "Token invalide ou utilisateur non trouvé.", + failAuthId: "Identifiant non valide : ", + failAuthCron: "Tentative de lancement d'un cron sans le bon token.", + previousPage: "Page précédente", + nextPage: "Page suivante", + btnLinkToQuestionnaire: "Aller au quiz !", + statsAdmin: "Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
    En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
    Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium." +}; + +/***/ }), + +/***/ "../lang/fr/questionnaire.js": +/*!***********************************!*\ + !*** ../lang/fr/questionnaire.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + needTitle: "Merci de fournir un titre à votre quiz.", + needNotTooLongTitle: "Le titre du quiz ne doit pas compter plus de 255 caractères.", + needUrl: "Merci de fournir l'url à votre quiz.", + needUniqueUrl: "L'url du quiz doit être unique.", + needIntroduction: "Merci de fournir un texte d'introduction à votre quiz.", + needCorrectPublishingDate: "La date de publication fournie n'a pas un format valide.", + needKnowIfIsPublished: "Il faut savoir si ce quiz est publié.", + needLanguage: "Vous devez sélectionner la langue de ce quiz.", + needEstimatedTime: "Merci de sélectionner une estimation de la durée de ce quiz.", + notFound: "Aucun quiz n'a pas été trouvé.", + searchResultTitle: "Résultat pour votre recherche", + searchNoResult: "Aucun résultat n'a été trouvé pour votre recherche", + searchWithResult: "#NB quizs correspondent à votre recherche :", + publishedBy: "Publié par", + publishedAt: ", le", + lastUpdated: "Dernière mise à jour, le ", + estimatedTime: "Durée de lecture estimée : ", + btnSendResponse: "Envoyez vos réponses", + btnProposeSubscribe: "Ok, je crée mon compte !", + btnProposeConnection: "J'ai déjà un compte, je me connecte.", + btnShowQuestionnaire: "Afficher le quiz !", + nextQuestionnairesList: "Les #NB prochains quizs devant être publiés", + needBeCompleted: "Quiz incomplet", + nextDateWithoutQuestionnaire: "Prochaine date sans quiz programmé : ", + haveBeenPublished: ":NB nouveaux questionnaires ont été publiés." +}; + +/***/ }), + +/***/ "../lang/fr/user.js": +/*!**************************!*\ + !*** ../lang/fr/user.js ***! + \**************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + notFound: "L'utilisateur n'a pas été trouvé.", + needName: "Merci de choisir un nom d'utilisateur.", + needNotTooLongName: "Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.", + needEmail: "Merci de saisir votre adresse e-mail.", + needUniqueEmail: "L'adresse e-mail que vous avez saisie est déjà utilisée par un autre utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.", + needNotTooLongEmail: "Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.", + needPassWord: "Merci de fournir un mot de passe.", + needLongPassWord: "Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.", + passwordCopied: "Le mot de passe généré a été copié dans le presse-papier. Vous pouvez le recopier où vous le souhaiter.", + needStatus: "Il manque le statut.", + needLanguage: "Il manque le code langue.", + needValidLastConnectionDate: "La date de dernière connexion n'est pas valide.", + needSMTP: "Il manque le serveur SMTP.", + needSMTPNotFound: "Il manque le serveur SMTP.", + needKnowNewsletterOk: "Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.", + needTimeDifference: "Il faut connaître le nombre de minutes du décalage horaire.", + needMinTimeDifference: "Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.", + needMaxTimeDifference: "Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.", + needUGCOk: "Vous devez accepter les CGU pour pouvoir créer votre compte. ", + godfatherNotFound: "Aucun utilisateur valide trouvé pour ce code parrain.", + godfatherFound: "Votre parrain a bien été trouvé !", + mailValidationMessage: "Votre inscription est bien enregistrée.\nPour la finaliser, merci de cliquer dans les 24H sur le lien de confirmation qui vient de vous être envoyé par e-mail.", + mailValidationLinkSubject: "Merci de valider votre compte", + mailValidationLinkSBodyTxt: "Bonjour USER_NAME,\n\nPour valider votre compte, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL", + mailValidationLinkSBodyHTML: "

    Bonjour USER_NAME,

    Pour valider votre compte, merci de cliquer sur le lien suivant dans les 24h.

    Valider.

    ", + validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue !
    Vous pouvez sans tarder vous connecter ci-dessous pour accéder à votre compte.", + validationMessageAdmin: "Le compte a bien été validé.", + validationAlreadyMessage: "Il semble que vous ayez déjà validé votre compte.", + validationAlreadyMessageAdmin: "Ce compte a déjà été validé.", + mailWelcomeSubject: "Bienvenue !", + mailWelcomeBodyTxt: "Bonjour USER_NAME,\nVotre venez de valider votre inscription à NOM_SITE.\nMerci et à bientôt !", + mailWelcomeBodyHTML: "

    Bonjour USER_NAME,

    Votre venez de valider votre inscription à NOM_SITE.

    Merci et à bientôt !

    ", + mailThankGodfatherSubject: "Merci !", + mailThankGodfatherBodyTxt: "Bonjour USER_NAME,\nGrâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nMerci et à bientôt !", + mailThankGodfatherBodyHTML: "

    Bonjour USER_NAME,

    Grâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.

    Merci et à bientôt !

    ", + badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.", + emailNotFound: "Aucun utilisateur trouvé pour cette adresse e-mail.", + alreadyConnected: "Vous êtes déjà connecté(e) au site !", + needBeConnected: "Vous devez être connecté(e) pour accéder à cette page.", + connectionOk: "Connexion réussie.", + needChooseLoginWay: "Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.", + needValidationToLogin: "Vous devez d'abord valider votre compte avant de vous connecter. Pour ce faire, un lien vient de vous être envoyé par e-mail.", + tooManyLoginFails: "Trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.", + badPassword: "Le mot de passe n'est pas le bon.", + mailLoginLinkSubject: "Votre lien de connexion.", + mailLoginLinkBodyTxt: "Bonjour USER_NAME,\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : LINK_URL", + mailLoginLinkBodyHTML: "

    Bonjour USER_NAME,

    Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :

    Valider.

    ", + mailLoginLinkMessage: "Un lien de connexion vient de vous être envoyé sur votre adresse e-mail. Ne tardez pas à l'utiliser, car il n'est valable que durant ", + updatedOkMessage: "Vos informations ont bien été mises à jour.", + updatedNeedGoodEmail: "Mais la nouvelle adresse e-mail n'a pu être enregistrée car elle n'a pas une format correct.", + updatedNeedUniqueEmail: "Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.", + mailUpdateLoginSubject: "Merci de valider vos nouveaux identifiants.", + mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL", + mailUpdateLoginBodyHTML: "

    Bonjour USER_NAME,

    Pour valider vos nouveaux identifiants de connexion, cliquez ici sans tarder.

    ", + mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (email et/ou mot de passe) et vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement. En attendant, merci de continuer à utiliser vos anciens identifiants.", + updatedNeedValidatedUser: "L'utilisateur que vous souhaité modifier n'existe pas/plus ou n'a pas encore validé son compte.", + updatedNeedGoodGodfather: "Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.", + mailUpdateLoginOkMessage: "La mise à jour de vos identifiants a bien été enregistrée.", + updatedFailedGodfatherNotFound: "L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.", + creationOkMessage: "Le nouvel utilisateur a bien été enregistré.", + mailDeleteSubject: "Confirmer la suppression de votre compte.", + mailDeleteBodyTxt: "Bonjour USER_NAME,\nPour valider la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL", + mailDeleteBodyHTML: "

    Bonjour USER_NAME,

    Pour valider la suppression de votre compte, cliquez ici sans tarder.

    ", + mailDeleteLinkMessage: "Votre demande de suppression a bien été enregistrée. Merci de cliquer sans tarder sur le lien qui vient de vous être envoyé par e-mail pour confirmer.", + deleteOkMessage: "L'utilisateur a bien été supprimé.", + deleteFailMessage: "Tentative de suppression d'un utilisateur inexistant : ", + mailDeleteLinkOkMessage: "Votre compte a bien été supprimé. Merci d'avoir utilisé nos services.", + mailDeleteLinkAlreadyMessage: "Il semble que vous ayez déjà validé la suppression de votre compte.", + mailDeleteLinkFailMessage: "Votre lien de suppression n'est pas valide ou alors il n'est plus valable.", + cronDeleteUnvalidedUsersMessage: " comptes utilisateurs non validés ont été supprimés.", + deleteInactiveUsersMessage: " comptes utilisateurs inactifs ont été supprimés.", + welcomeMessage: "Bienvenue #NAME !", + byebyeMessage: "Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
    À bientôt !", + infosUserForAdmin: "Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
    Date de sa dernière connexion : DATE_CONNECTION.", + infosAdminGodfather: "Cet utilisateur a été parrainé par ", + infosAdminNbGodChilds: "Ses #NB filleuils : " +}; + +/***/ }), + +/***/ "../tools/main.js": +/*!************************!*\ + !*** ../tools/main.js ***! + \************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +// Quelques fonctions utiles pour les chaînes +var Tool = /*#__PURE__*/function () { + function Tool() { + _classCallCheck(this, Tool); + } + + _createClass(Tool, null, [{ + key: "isEmpty", + value: function isEmpty(myVar) { + if (myVar === undefined || myVar === null) return true;else { + myVar += ""; // si autre chose qu'une chaîne envoyé... + + myVar = myVar.trim(); + if (myVar === "") return true;else return false; + } + } + }, { + key: "trimIfNotNull", + value: function trimIfNotNull(myString) { + if (Tool.isEmpty(myString)) myString = null;else { + myString += ""; // si autre chose qu'une chaîne envoyé... + + myString = myString.trim(); + } + return myString; + } + }, { + key: "shortenIfLongerThan", + value: function shortenIfLongerThan(myString, max) { + myString += ""; // au cas où cela ne serait pas une chaîne... + + if (myString.length > max) myString = myString.substring(0, max - 3) + "..."; + return myString; + } // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings + + }, { + key: "replaceAll", + value: function replaceAll(myString, mapObj) { + var replaceElts = new RegExp(Object.keys(mapObj).join("|"), "gi"); + return myString.replace(replaceElts, function (matched) { + return mapObj[matched]; + }); + } // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random + + }, { + key: "getRandomInt", + value: function getRandomInt(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min)) + min; + } // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country + + }, { + key: "dateFormat", + value: function dateFormat(dateString) { + var lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "fr"; + if (Tool.isEmpty(dateString)) return ""; + var myDate = new Date(dateString); + var myDay = myDate.getDate() + ""; + if (myDay.length === 1) myDay = "0" + myDay; + var myMounth = myDate.getMonth() + 1 + ""; + if (myMounth.length === 1) myMounth = "0" + myMounth; + var myYear = myDate.getFullYear(); + if (lang === "fr") return myDay + "/" + myMounth + "/" + myYear;else if (lang === "form") // 2014-02-09 + return myYear + "-" + myMounth + "-" + myDay;else return myMounth + "/" + myDay + "/" + myYear; + } + }]); + + return Tool; +}(); + +module.exports = Tool; + +/***/ }), + +/***/ "../views sync recursive ^\\.\\/.*\\.js$": +/*!**********************************!*\ + !*** ../views sync ^\.\/.*\.js$ ***! + \**********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./default/config/fr.js": "../views/default/config/fr.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../views sync recursive ^\\.\\/.*\\.js$"; + +/***/ }), + +/***/ "../views/default/config/fr.js": +/*!*************************************!*\ + !*** ../views/default/config/fr.js ***! + \*************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + headLinks: [{ + anchor: "Accueil", + attributes: { + href: "/" + } + }, { + anchor: "Mon compte", + attributes: { + href: "/connexion.hmt", + id: "accountHeadLink" + } + }, { + anchor: "À propos", + attributes: { + href: "/a-propos.html" + } + }, { + anchor: "Contact", + attributes: { + href: "/contact.html" + } + }], + footLinks: [{ + anchor: "Crédits", + attributes: { + href: "/credits.html" + } + }, { + anchor: "Mentions légales", + attributes: { + href: "/mentions-legales.html", + rel: "nofollow" + } + }, { + anchor: "Données personnelles", + attributes: { + href: "/donnees.html" + } + }, { + anchor: "C.G.U.", + attributes: { + href: "/cgu.html", + rel: "nofollow" + } + }, { + anchor: "C.G.V.", + attributes: { + href: "/cgv.html", + rel: "nofollow" + } + }], + maxQuestionnairesByPage: 10, + userHomePage: "accueil.html", + adminHomePage: "admin.html", + managerHomePage: "gestion.html", + subscribePage: "inscription.html", + connectionPage: "connexion.html", + accountPage: "compte.html", + questionnairesManagementPage: "gestion-quizs.html", + usersManagementPage: "gestion-utilisateurs.html", + nbQuestionnairesUserHomePage: 10, + illustrationDir: "/img/quizs/", + siteSlogan: "Cultivons notre jardin !", + homeTitle1: "De nature curieuse ?", + homeP1: "Avec WikiLerni vous apprenez chaque jour de nouvelles choses.
    Des articles de Wikipédia sont sélectionnés pour vous et sont suivis d'un quiz vous permettant de tester ce que vous en avez retenu.
    De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre \"jardin\".", + homeTitle2: "La culture en liberté", + homeP2: "Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
    Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
    Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
    Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.

    (*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.", + newQuestionnairesTitle: "Les derniers quizs publiés sur WikiLerni", + newQuestionnairesIntro: "Liste des derniers quizs publiés sur WikiLerni.", + explanationTitle: "Vous découvrez WikiLerni ?", + explanationTxt: "Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
    Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.

    Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.

    Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)

    Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
    Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.

    Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.", + noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript." +}; + +/***/ }), + +/***/ "./src/homeUser.js": +/*!*************************!*\ + !*** ./src/homeUser.js ***! + \*************************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ "../config/instance.js"); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js"); +/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js"); +/* harmony import */ var _tools_forms_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/forms.js */ "./src/tools/forms.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tools/users.js */ "./src/tools/users.js"); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + +// -- PAGE D'ACCUEIL DE L'UTILISATEUR +/// Vérifier que l'utilisateur est bien connecté, a le bon statut et le rediriger vers le formulaire d'inscription si ce n'est pas le cas. +/// Si c'est ok, on récupère ses infos et stats + les derniers quizs auxquels il a accès, mais n'a pas répondu. +/// Un moteur de recherche permet d'obtenir d'autres quizs parmi ceux publiés. +/// Pour l'affichage des listings de quiz, l'API retourne directement du html. +/// Un menu permet à l'utilisateur d'accéder à la modification de ses infos, de son abonnement, etc. +/// Un message venant d'une autre page peut aussi être à afficher lors du premier chargement. +/// Ajouter affichage anciens quizs à retentés si pas de quizs en attente ? +/// Un quiz au hasard ? +// Fichier de configuration côté client : + +var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0]; + +var configFrontEnd = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); // Fonctions utiles au script : + + + + + + + + // Dictionnaires : + +var txt = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + lang + "/general"); + +var txtUsers = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/user$")("./" + lang + "/user"); + +var txtAnwers = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/answer$")("./" + lang + "/answer"); + +var txtQuestionnaire = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/questionnaire$")("./" + lang + "/questionnaire"); // Principaux éléments du DOM manipulés : + + +var divMain = document.getElementById("main-content"); +var divMessage = document.getElementById("message"); +var quizTitle = document.getElementById("quizsTitle"); +var quizIntro = document.getElementById("quizsIntro"); +var quizListing = document.getElementById("quizsList"); +var quizPagination = document.getElementById("quizsPagination"); +var formSearch = document.getElementById("search"); +var inputBegin = document.getElementById("begin"); +Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["helloDev"])(); + +var initialise = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + var config, isConnected, user, xhrStats, xhrLastQuizs, sendSearch; + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _context.prev = 0; + _context.next = 3; + return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_6__["getConfig"])(); + + case 3: + config = _context.sent; + + if (config) { + _context.next = 8; + break; + } + + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]); + _context.next = 12; + break; + + case 8: + _context.next = 10; + return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_6__["checkSession"])(["user"], "/" + configFrontEnd.connectionPage, { + message: txtUsers.needBeConnected, + color: "error" + }, window.location); + + case 10: + isConnected = _context.sent; + + if (isConnected) { + user = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("user", true); + Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["updateAccountLink"])(user.status, configFrontEnd); + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "h4", txtUsers.welcomeMessage.replace("#NAME", user.name)); + divMain.style.display = "block"; + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message"))) { + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "p", Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message", true).message, "", [Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message", true).color], "", false); + Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["removeLocaly"])("message"); + } // Initialisation du formulaire de recherche : + + + Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(config, formSearch); // Les stats : + + xhrStats = new XMLHttpRequest(); + xhrStats.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.questionnaireRoutes + config.getStatsAnswers + user.id); + + xhrStats.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var response = JSON.parse(this.responseText); + + if (this.status === 200 && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(response.nbAnswers) && response.nbAnswers !== 0) // pas de stats si aucune réponse ! + { + var mapText = { + NBANSWERS: response.nbAnswers, + NBQUESTIONNAIRES: response.nbQuestionnaires, + NBTOTQUESTIONNAIRES: response.general.nbPublished, + AVGDURATION: response.avgDuration, + AVGCORRECTANSWERS: response.avgCorrectAnswers + }; + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "p", Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["replaceAll"])(txtAnwers.statsUser, mapText), "", "", "", false); + } + } + }; + + xhrStats.setRequestHeader("Authorization", "Bearer " + user.token); + xhrStats.send(); // Par défaut, on affiche des derniers quizs proposés sans réponse : + + xhrLastQuizs = new XMLHttpRequest(); + xhrLastQuizs.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.questionnaireRoutes + config.getQuestionnairesWithoutAnswer + "" + user.id + "/" + 0 + "/" + configFrontEnd.nbQuestionnairesUserHomePage + "/html"); + + xhrLastQuizs.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var response = JSON.parse(this.responseText); + + if (this.status === 200) { + if (response.nbTot === 0) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(quizIntro, "p", txtAnwers.noQuestionnaireWithoudAnswer, "", ["success"]);else if (response.html) { + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(quizIntro, "p", txtAnwers.nbQuestionnaireWithoudAnswer.replace("#NB", response.questionnaires.length), "", ["information"]); + quizListing.innerHTML = response.html; + } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(quizs, "p", txt.serverError, "", ["error"]); + } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(quizs, "p", txt.serverError, "", ["error"]); + } + }; + + xhrLastQuizs.setRequestHeader("Authorization", "Bearer " + user.token); + xhrLastQuizs.send(); // Traitement du lancement d'une recherche + // La recherche peut être lancée via la bouton submit ou un lien de pagination + + sendSearch = function sendSearch() { + quizTitle.innerHTML = txtQuestionnaire.searchResultTitle; + quizListing.innerHTML = ""; + var datas = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["getDatasFromInputs"])(formSearch); + var xhrSearch = new XMLHttpRequest(); + xhrSearch.open("POST", config.apiUrl + config.questionnaireRoutes + config.searchQuestionnairesRoute); + + xhrSearch.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var response = JSON.parse(this.responseText); + + if (this.status === 200 && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(response.nbTot)) { + if (response.nbTot === 0) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(quizIntro, "p", txtQuestionnaire.notFound, "", ["information"]);else if (response.html) { + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(quizIntro, "p", txtQuestionnaire.searchWithResult.replace("#NB", response.nbTot), "", ["success"]); + quizListing.innerHTML = response.html; // Pagination nécessaire ? + + quizPagination.innerHTML = ""; // on commence par vider... + + if (response.begin != 0) // peut retourner "0" et non 0 ! + { + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(quizPagination, "a", txt.previousPage, "previousRes", "", { + href: "#search" + }); + var previousPage = document.getElementById("previousRes"); // le retour à la page précédente peut se faire en cliquant sur le bouton ou via l'historique du navigateur + + var goBackRes = function goBackRes() { + var newBegin = response.begin - configFrontEnd.nbQuestionnairesUserHomePage; + if (newBegin < 0) // ne devrait pas être possible.. + newBegin = 0; + document.getElementById("begin").value = newBegin; + sendSearch(); + window.location.assign("#search"); + }; + + previousPage.addEventListener("click", function (e) { + e.preventDefault(); + goBackRes(); + }); + + window.onpopstate = function (e) { + e.preventDefault(); + goBackRes(); + }; + } + + if (response.end < response.nbTot - 1) // -1, car tableau commence à 0 ! + { + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(quizPagination, "a", txt.nextPage, "nextRes", "", { + href: "#search" + }, false); + var nextPage = document.getElementById("nextRes"); + nextPage.addEventListener("click", function (e) { + e.preventDefault(); + document.getElementById("begin").value = response.end + 1; + sendSearch(); + window.location.assign("#search"); + }); + } + } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(quizs, "p", txt.serverError, "", ["error"]); + } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(quizs, "p", txt.serverError, "", ["error"]); + } + }; + + xhrSearch.setRequestHeader("Content-Type", "application/json"); + xhrSearch.setRequestHeader("Authorization", "Bearer " + user.token); + + if (datas) { + datas.output = "html"; + xhrSearch.send(JSON.stringify(datas)); + } + }; + + formSearch.addEventListener("submit", function (e) { + e.preventDefault(); + document.getElementById("begin").value = 0; + sendSearch(); + }); + } + + case 12: + _context.next = 18; + break; + + case 14: + _context.prev = 14; + _context.t0 = _context["catch"](0); + console.error(_context.t0); + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "p", txt.serverError, "", ["error"]); + + case 18: + case "end": + return _context.stop(); + } + } + }, _callee, null, [[0, 14]]); + })); + + return function initialise() { + return _ref.apply(this, arguments); + }; +}(); + +initialise(); + +/***/ }), + +/***/ "./src/tools/clientstorage.js": +/*!************************************!*\ + !*** ./src/tools/clientstorage.js ***! + \************************************/ +/*! exports provided: saveLocaly, getLocaly, removeLocaly */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveLocaly", function() { return saveLocaly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaly", function() { return getLocaly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeLocaly", function() { return removeLocaly; }); +// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.) +// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie +var saveLocaly = function saveLocaly(name, data) { + localStorage.setItem(name, JSON.stringify(data)); +}; +var getLocaly = function getLocaly(name) { + var json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name); +}; +var removeLocaly = function removeLocaly(name) { + localStorage.removeItem(name); +}; + +/***/ }), + +/***/ "./src/tools/dom.js": +/*!**************************!*\ + !*** ./src/tools/dom.js ***! + \**************************/ +/*! exports provided: addElement */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addElement", function() { return addElement; }); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__); +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + + // Fonction associant les attributs fournis à un champ de formulaire + +var addElement = function addElement(eltParent, eltType) { + var eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; + var eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; + var eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : []; + var eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; + var replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true; + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltType) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltParent)) return false;else { + var newElement = document.createElement(eltType); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ? + newElement.id = eltId; + + if (Array.isArray(eltClass) && eltClass.length != 0) { + for (var i in eltClass) { + newElement.classList.add(eltClass[i]); + } + } + + if (_typeof(eltAttributes) === "object") // !! tous les objets ne sont pas ok + { + for (var attributName in eltAttributes) { + newElement.setAttribute(attributName, eltAttributes[attributName]); + } + } + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltContent)) newElement.innerHTML = eltContent.replace(/\n/g, "
    "); // innerHTML permet d'ajouter du texte ayant lui-même des balises, etc. + + if (replace) eltParent.innerHTML = ""; + eltParent.appendChild(newElement); + } +}; + +/***/ }), + +/***/ "./src/tools/everywhere.js": +/*!*********************************!*\ + !*** ./src/tools/everywhere.js ***! + \*********************************/ +/*! exports provided: helloDev, updateAccountLink */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "helloDev", function() { return helloDev; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateAccountLink", function() { return updateAccountLink; }); +// Ce script fournit des fonctions utilisées sur toutes les pages du site +var helloDev = function helloDev() { + console.log("**** Hello ami développeur :-)\n Le code de WikiLerni est libre et est lisible sur gitlab : \n Bonne lecture :-) \n Pour les suggestions d'amélioration ou questions : dev@wililerni.com ****"); + return true; +}; +var updateAccountLink = function updateAccountLink(status, configTemplate) { + var link = document.getElementById("accountHeadLink"); + var homePage = status + "HomePage"; + link.href = "/" + configTemplate[homePage]; +}; + +/***/ }), + +/***/ "./src/tools/forms.js": +/*!****************************!*\ + !*** ./src/tools/forms.js ***! + \****************************/ +/*! exports provided: setAttributesToInputs, getDatasFromInputs, empyForm, empyAndHideForm */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setAttributesToInputs", function() { return setAttributesToInputs; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDatasFromInputs", function() { return getDatasFromInputs; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empyForm", function() { return empyForm; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empyAndHideForm", function() { return empyAndHideForm; }); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__); +function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + + // Fonction associant les attributs fournis à un champ de formulaire + +var setAttributesToInputs = function setAttributesToInputs(inputsConf, myForm) { + for (var i in myForm.elements) { + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(myForm.elements[i].id)) { + var idInput = myForm.elements[i].id; + + if (inputsConf[idInput] !== undefined) { + var inputHTML = document.getElementById(idInput); + + for (var attribute in inputsConf[idInput]) { + inputHTML.setAttribute(attribute, inputsConf[idInput][attribute]); + } + } + } + } + + return true; +}; // Récupère toutes les valeurs de champs en omettant les checkbox non cochées, etc. + +var getDatasFromInputs = function getDatasFromInputs(myForm) { + var datas = {}; + var formData = new FormData(myForm); + + var _iterator = _createForOfIteratorHelper(formData.entries()), + _step; + + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var entrie = _step.value; + datas[entrie[0]] = entrie[1]; + } + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); + } + + return datas; +}; // Vide tous les champs d'un formulaire, y compris hidden, checkbox, etc. +// Revoir pour les select + +var empyForm = function empyForm(myForm) { + var formData = new FormData(myForm); + + var _iterator2 = _createForOfIteratorHelper(formData.entries()), + _step2; + + try { + for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { + var entrie = _step2.value; + if (myForm.elements[entrie[0]].type == "checkbox" || myForm.elements[entrie[0]].type == "radio") myForm.elements[entrie[0]].checked = false;else myForm.elements[entrie[0]].value = ""; + } + } catch (err) { + _iterator2.e(err); + } finally { + _iterator2.f(); + } + + return true; +}; // Vide et cache le formulaire + +var empyAndHideForm = function empyAndHideForm(myForm) { + empyForm(myForm); + myForm.style.display = "none"; +}; + +/***/ }), + +/***/ "./src/tools/users.js": +/*!****************************!*\ + !*** ./src/tools/users.js ***! + \****************************/ +/*! exports provided: getConfig, getTimeDifference, getPassword, setSession, checkAnswerDatas, checkSession */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getConfig", function() { return getConfig; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTimeDifference", function() { return getTimeDifference; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getPassword", function() { return getPassword; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setSession", function() { return setSession; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkAnswerDatas", function() { return checkAnswerDatas; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkSession", function() { return checkSession; }); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/instance.js */ "../config/instance.js"); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../config/users.js */ "../config/users.js"); +/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_3__); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + + +var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0]; + +var configTemplate = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); + + + + // Récupère les données de configuration des utilisateurs +// À terme, un fichier statique importable comme module devrait éviter une requête ajax + +var getConfig = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + return _context.abrupt("return", new Promise(function (resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + "/user/getconfig"); + + xhr.onload = function () { + return resolve(JSON.parse(xhr.responseText)); + }; + + xhr.onerror = function () { + return reject(xhr.statusText); + }; + + xhr.send(); + })); + + case 1: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + + return function getConfig() { + return _ref.apply(this, arguments); + }; +}(); +var getTimeDifference = function getTimeDifference() { + var timeLocal = new Date().getTimezoneOffset(); + if (timeLocal > _config_users_js__WEBPACK_IMPORTED_MODULE_1__["timeDifferenceMax"] || timeLocal < _config_users_js__WEBPACK_IMPORTED_MODULE_1__["timeDifferenceMin"]) return 0;else return timeLocal; +}; // On enlève volontairement les 0/O pour éviter les confusions ! +// Et mieux vaut aussi débuter et finir par une lettre simple. + +var getPassword = function getPassword(nbCarMin, nbCarMax) { + var nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin)); + var letters = "ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz"; + var others = "123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ"; + var password = letters[Math.floor(Math.random() * letters.length)]; + + for (var i = 1; i < nbCar - 1; i++) { + if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)]; + } + + password += letters[Math.floor(Math.random() * letters.length)]; + return password; +}; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite +// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides. + +var setSession = function setSession(userId, token, durationTS) { + var storageUser = { + id: userId, + token: token, + duration: durationTS + }; + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("user", storageUser); +}; // Vérifie qu'il y a des données locales concernant le résultat d'un quiz +// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas + +var checkAnswerDatas = function checkAnswerDatas(datas) { + var lastAnswer = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("lastAnswer"); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(lastAnswer)) { + var answer = JSON.parse(lastAnswer); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.duration) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbCorrectAnswers) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.QuestionnaireId) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbQuestions)) { + datas.duration = answer.duration; + datas.nbCorrectAnswers = answer.nbCorrectAnswers; + datas.QuestionnaireId = answer.QuestionnaireId; + datas.nbQuestions = answer.nbQuestions; + } + } + + return datas; +}; // Cette fonction teste la connexion de l'utilisateur d'une page +// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté + +var checkSession = /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() { + var status, + urlRedirection, + message, + urlWanted, + _args2 = arguments; + return regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + status = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : []; + urlRedirection = _args2.length > 1 ? _args2[1] : undefined; + message = _args2.length > 2 ? _args2[2] : undefined; + urlWanted = _args2.length > 3 ? _args2[3] : undefined; + return _context2.abrupt("return", new Promise(function (resolve, reject) { + var userDatas = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("user"); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(userDatas)) { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else { + var user = JSON.parse(userDatas); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.id) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.token) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.duration) || user.duration < Date.now()) { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else { + var xhr = new XMLHttpRequest(); + xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["userRoutes"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["checkLoginRoute"] + user.token); + + xhr.onload = function () { + var response = JSON.parse(xhr.responseText); + + if (xhr.status === 200 && response.isValid && response.id != undefined) { + if (response.id === user.id) { + user.name = response.name; + user.language = response.language; + user.timeDifference = response.timeDifference; + user.status = response.status; // le token et de toute façon vérifier à chaque requête à l'API + + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("user", user); // si il s'agit d'un "user" et que son abonnement a expiré, je le redirige vers la caisse :-) + + if (response.status === "user" && response.nbDaysOk <= 0) { + var urlAccount = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["siteUrl"] + "/" + configTemplate[lang].accountPage; + if (window.location.href.indexOf(urlAccount) === -1) window.location.assign("/" + configTemplate[lang].accountPage); // passée directement ici, l'ancre #subscribe ne fonctionne pas !? + + resolve(true); + } else { + if (status.length !== 0 && status.indexOf(response.status) === -1) { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else resolve(true); + } + } else { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + } else { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + }; + + xhr.onerror = function () { + return reject(xhr.statusText); + }; + + xhr.send(); + } + } + })); + + case 5: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + + return function checkSession() { + return _ref2.apply(this, arguments); + }; +}(); // Cette fonction sert à la précédente en cas de connexion non valide + +var redirectUser = function redirectUser(urlRedirection, message, urlWanted) { + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(message)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("message", message); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlWanted)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("url", urlWanted); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlRedirection)) window.location.assign(urlRedirection); +}; + +/***/ }) + +/******/ }); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9hbnN3ZXIkIiwid2VicGFjazovLy8uLi9sYW5nIHN5bmMgXlxcLlxcLy4qXFwvZ2VuZXJhbCQiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9xdWVzdGlvbm5haXJlJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3VzZXIkIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL2Fuc3dlci5qcyIsIndlYnBhY2s6Ly8vLi4vbGFuZy9mci9nZW5lcmFsLmpzIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL3F1ZXN0aW9ubmFpcmUuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcvZnIvdXNlci5qcyIsIndlYnBhY2s6Ly8vLi4vdG9vbHMvbWFpbi5qcyIsIndlYnBhY2s6Ly8vLi4vdmlld3Mgc3luYyBeXFwuXFwvLipcXC5qcyQiLCJ3ZWJwYWNrOi8vLy4uL3ZpZXdzL2RlZmF1bHQvY29uZmlnL2ZyLmpzIiwid2VicGFjazovLy8uL3NyYy9ob21lVXNlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvY2xpZW50c3RvcmFnZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvZG9tLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy9ldmVyeXdoZXJlLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy9mb3Jtcy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvdXNlcnMuanMiXSwibmFtZXMiOlsidXNlcnMiLCJyZXF1aXJlIiwicXVlc3Rpb25uYWlyZXMiLCJtb2R1bGUiLCJleHBvcnRzIiwiYXBpVXJsIiwic2l0ZVVybCIsImFkbWluTmFtZSIsImFkbWluRW1haWwiLCJzZW5kZXJOYW1lIiwic2VuZGVyRW1haWwiLCJhZG1pbkxhbmciLCJ0aGVtZSIsImF2YWlsYWJsZUxhbmdzIiwic2l0ZU5hbWUiLCJiZWdpbkNvZGVHb2RmYXRoZXIiLCJjcm9uVGltaW5nQWxlcnRJblNlY29uZGUiLCJyZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlIiwidG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnMiLCJ0b2tlbkxvZ2luTGlua1RpbWVJbkhvdXJzIiwidG9rZW5Db25uZXhpb25NaW5UaW1lSW5Ib3VycyIsInRva2VuQ29ubmV4aW9uTWF4VGltZUluRGF5cyIsInRva2VuTG9naW5DaGFuZ2luZ1RpbWVJbkhvdXJzIiwidG9rZW5EZWxldGVVc2VyVGltZUluSG91cnMiLCJ0b2tlblVuc3Vic2NyaWJlTGlua1RpbWVJbkRheXMiLCJmcmVlQWNjb3VudFRpbWluZ0luRGF5cyIsImZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5cyIsImFjY291bnRFeHBpcmF0aW9uRmlyc3ROb3RpZmljYXRpb25JbkRheXMiLCJhY2NvdW50RXhwaXJhdGlvblNlY29uZE5vdGlmaWNhdGlvbkluRGF5cyIsImluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5cyIsIm5iUXVlc3Rpb25zTWluIiwibmJRdWVzdGlvbnNNYXgiLCJuYkNob2ljZXNNYXgiLCJuYk5ld1F1ZXN0aW9ubmFpcmVzIiwiaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlQmVnaW4iLCJob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQiLCJudW1iZXJOZXdRdWVzdGlvbm5haXJlQXRTYW1lVGltZSIsIm1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzIiwibmJJbGx1c3RyYXRpb25zTWluIiwibmJJbGx1c3RyYXRpb25zTWF4IiwibWF4SWxsdXN0cmF0aW9uU2l6ZWluT2N0ZXQiLCJtaW1lVHlwZXNGb3JJbGx1c3RyYXRpb24iLCJpbGx1c3RyYXRpb25zV2lkdGhNYXhJblB4IiwiaWxsdXN0cmF0aW9uc01pbmlhdHVyZXNXaWR0aE1heEluUHgiLCJuYkxpbmtzTWluIiwibmJMaW5rc01heCIsInBhc3N3b3JkIiwibWlubGVuZ3RoIiwiZGlyQ2FjaGVVc2VycyIsImRpckNhY2hlVXNlcnNBbnN3ZXJzIiwiZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyIsImRpckNhY2hlUXVlc3Rpb25zIiwiZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzIiwiZGlySFRNTFF1ZXN0aW9ubmFpcmUiLCJkaXJXZWJRdWVzdGlvbm5haXJlIiwicXVlc3Rpb25uYWlyZVJvdXRlcyIsImdldFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlcyIsInB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJzYXZlQW5zd2Vyc1JvdXRlIiwiZ2V0U3RhdHNRdWVzdGlvbm5haXJlcyIsInNlYXJjaFF1ZXN0aW9ubmFpcmVzUm91dGUiLCJzZWFyY2hBZG1pblF1ZXN0aW9ubmFpcmVzUm91dGUiLCJnZXRMaXN0TmV4dFF1ZXN0aW9ubmFpcmVzIiwicXVlc3Rpb25zUm91dGUiLCJ0YWdzU2VhcmNoUm91dGUiLCJnZXRRdWVzdGlvbm5haXJlc1dpdGhvdXRBbnN3ZXIiLCJnZXRQcmV2aW91c0Fuc3dlcnMiLCJnZXRTdGF0c0Fuc3dlcnMiLCJnZXRBZG1pblN0YXRzIiwiUXVlc3Rpb25uYWlyZSIsInRpdGxlIiwibWF4bGVuZ3RoIiwicmVxdWlyZWQiLCJzbHVnIiwiaW50cm9kdWN0aW9uIiwic2VhcmNoUXVlc3Rpb25uYWlyZXMiLCJRdWVzdGlvbiIsInRleHQiLCJyYW5rIiwibWluIiwiZGVmYXVsdFZhbHVlIiwiQ2hvaWNlIiwibmJUYWdzTWluIiwibmJUYWdzTWF4IiwiZGlyQ2FjaGVUYWdzIiwiZGlySFRNTFRhZ3MiLCJkaXJXZWJUYWdzIiwidXNlclJvdXRlcyIsInN1YnNjcmliZVJvdXRlIiwiZ2V0R29kZmF0aGVyUm91dGUiLCJjaGVja0lmSXNFbWFpbGZyZWVSb3V0ZSIsImNoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZSIsImNoZWNrTG9naW5Sb3V0ZSIsImNvbm5lY3Rpb25Sb3V0ZSIsImdldExvZ2luTGlua1JvdXRlIiwiY29ubmVjdGlvbldpdGhMaW5rUm91dGUiLCJnZXRVc2VySW5mb3MiLCJjcmVhdGVVc2VyUm91dGUiLCJ2YWxpZGF0ZVVzZXJSb3V0ZSIsInVwZGF0ZVVzZXJJbmZvcyIsInNlYXJjaFVzZXJSb3V0ZSIsImdldEdvZENoaWxkcyIsImNoZWNrTmV3TG9naW5MaW5rUm91dGUiLCJjaGVja0RlbGV0ZUxpbmtSb3V0ZSIsImdldFBheW1lbnRzIiwidW5zdWJzY3JpYmVSb3V0ZSIsIm5hbWUiLCJlbWFpbCIsIm5ld1Bhc3N3b3JkIiwiY29kZUdvZGZhdGhlciIsImNndU9rIiwidmFsdWUiLCJ0aW1lRGlmZmVyZW5jZU1pbiIsInRpbWVEaWZmZXJlbmNlTWF4IiwibmVlZE51bWJlclVzZXJSZXNwb25zZXMiLCJuZWVkSW50ZWdlck51bWJlclVzZXJSZXNwb25zZXMiLCJuZWVkTWluTnVtYmVyVXNlclJlc3BvbnNlcyIsIm5lZWRNYXhOdW1iZXJVc2VyUmVzcG9uc2VzIiwibmVlZE51bWJlckNvcnJlY3RSZXNwb25zZXMiLCJuZWVkSW50ZWdlck51bWJlckNvcnJlY3RSZXNwb25zZXMiLCJuZWVkTWluTnVtYmVyQ29ycmVjdFJlc3BvbnNlcyIsIm5lZWRNYXhOdW1iZXJDb3JyZWN0UmVzcG9uc2VzIiwibmVlZEludGVnZXJOdW1iZXJTZWNvbmRlc1Jlc3BvbnNlIiwibmVlZE1pbk51bWJlclNlY29uZGVzUmVzcG9uc2UiLCJjaGVja1Jlc3BvbnNlc091cHV0RmFpbCIsImNoZWNrUmVzcG9uc2VzT3VwdXRNZWRpdW0iLCJjaGVja1Jlc3BvbnNlc091cHV0U3VjY2VzcyIsIndhbnRUb1NhdmVSZXNwb25zZXMiLCJyZXNwb25zZVNhdmVkTWVzc2FnZSIsInJlc3BvbnNlU2F2ZWRFcnJvciIsIm5vUXVlc3Rpb25uYWlyZVdpdGhvdWRBbnN3ZXIiLCJuYlF1ZXN0aW9ubmFpcmVXaXRob3VkQW5zd2VyIiwic3RhdHNVc2VyIiwicHJldmlvdXNBbnN3ZXJzVGl0bGUiLCJwcmV2aW91c0Fuc3dlcnNTdGF0cyIsInByZXZpb3VzQW5zd2Vyc0xpbmUiLCJub1ByZXZpb3VzQW5zd2VyIiwic2l0ZUhUTUxUaXRsZSIsInNpdGVNZXRhRGVzY3JpcHRpb24iLCJzY3JpcHRUaW1pbmdJbmZvIiwic2NyaXB0VGltaW5nQWxlcnQiLCJzZXJ2ZXJFcnJvciIsInNlcnZlckVycm9yQWRtaW4iLCJuZWVkZWRQYXJhbXMiLCJiYWRVcmwiLCJub3RWYWxpZEZvcm1hdCIsIm5vdEFsbG93ZWQiLCJub3RSZXF1aXJlZCIsInVwZGF0ZUJ0blR4dCIsImFkZEJ0blR4dCIsImRlbGV0ZUJ0blR4dCIsImFkZE9rTWVzc2FnZSIsInVwZGF0ZU9rTWVzc2FnZSIsImRlbGV0ZU9rTWVzc2FnZSIsImZhaWxBdXRoIiwiZmFpbEF1dGhIZWFkZXIiLCJmYWlsQXV0aFRva2VuIiwiZmFpbEF1dGhJZCIsImZhaWxBdXRoQ3JvbiIsInByZXZpb3VzUGFnZSIsIm5leHRQYWdlIiwiYnRuTGlua1RvUXVlc3Rpb25uYWlyZSIsInN0YXRzQWRtaW4iLCJuZWVkVGl0bGUiLCJuZWVkTm90VG9vTG9uZ1RpdGxlIiwibmVlZFVybCIsIm5lZWRVbmlxdWVVcmwiLCJuZWVkSW50cm9kdWN0aW9uIiwibmVlZENvcnJlY3RQdWJsaXNoaW5nRGF0ZSIsIm5lZWRLbm93SWZJc1B1Ymxpc2hlZCIsIm5lZWRMYW5ndWFnZSIsIm5lZWRFc3RpbWF0ZWRUaW1lIiwibm90Rm91bmQiLCJzZWFyY2hSZXN1bHRUaXRsZSIsInNlYXJjaE5vUmVzdWx0Iiwic2VhcmNoV2l0aFJlc3VsdCIsInB1Ymxpc2hlZEJ5IiwicHVibGlzaGVkQXQiLCJsYXN0VXBkYXRlZCIsImVzdGltYXRlZFRpbWUiLCJidG5TZW5kUmVzcG9uc2UiLCJidG5Qcm9wb3NlU3Vic2NyaWJlIiwiYnRuUHJvcG9zZUNvbm5lY3Rpb24iLCJidG5TaG93UXVlc3Rpb25uYWlyZSIsIm5leHRRdWVzdGlvbm5haXJlc0xpc3QiLCJuZWVkQmVDb21wbGV0ZWQiLCJuZXh0RGF0ZVdpdGhvdXRRdWVzdGlvbm5haXJlIiwiaGF2ZUJlZW5QdWJsaXNoZWQiLCJuZWVkTmFtZSIsIm5lZWROb3RUb29Mb25nTmFtZSIsIm5lZWRFbWFpbCIsIm5lZWRVbmlxdWVFbWFpbCIsIm5lZWROb3RUb29Mb25nRW1haWwiLCJuZWVkUGFzc1dvcmQiLCJuZWVkTG9uZ1Bhc3NXb3JkIiwicGFzc3dvcmRDb3BpZWQiLCJuZWVkU3RhdHVzIiwibmVlZFZhbGlkTGFzdENvbm5lY3Rpb25EYXRlIiwibmVlZFNNVFAiLCJuZWVkU01UUE5vdEZvdW5kIiwibmVlZEtub3dOZXdzbGV0dGVyT2siLCJuZWVkVGltZURpZmZlcmVuY2UiLCJuZWVkTWluVGltZURpZmZlcmVuY2UiLCJuZWVkTWF4VGltZURpZmZlcmVuY2UiLCJuZWVkVUdDT2siLCJnb2RmYXRoZXJOb3RGb3VuZCIsImdvZGZhdGhlckZvdW5kIiwibWFpbFZhbGlkYXRpb25NZXNzYWdlIiwibWFpbFZhbGlkYXRpb25MaW5rU3ViamVjdCIsIm1haWxWYWxpZGF0aW9uTGlua1NCb2R5VHh0IiwibWFpbFZhbGlkYXRpb25MaW5rU0JvZHlIVE1MIiwidmFsaWRhdGlvbk1lc3NhZ2UiLCJ2YWxpZGF0aW9uTWVzc2FnZUFkbWluIiwidmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlIiwidmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlQWRtaW4iLCJtYWlsV2VsY29tZVN1YmplY3QiLCJtYWlsV2VsY29tZUJvZHlUeHQiLCJtYWlsV2VsY29tZUJvZHlIVE1MIiwibWFpbFRoYW5rR29kZmF0aGVyU3ViamVjdCIsIm1haWxUaGFua0dvZGZhdGhlckJvZHlUeHQiLCJtYWlsVGhhbmtHb2RmYXRoZXJCb2R5SFRNTCIsImJhZExpbmtWYWxpZGF0aW9uTWVzc2FnZSIsImVtYWlsTm90Rm91bmQiLCJhbHJlYWR5Q29ubmVjdGVkIiwibmVlZEJlQ29ubmVjdGVkIiwiY29ubmVjdGlvbk9rIiwibmVlZENob29zZUxvZ2luV2F5IiwibmVlZFZhbGlkYXRpb25Ub0xvZ2luIiwidG9vTWFueUxvZ2luRmFpbHMiLCJiYWRQYXNzd29yZCIsIm1haWxMb2dpbkxpbmtTdWJqZWN0IiwibWFpbExvZ2luTGlua0JvZHlUeHQiLCJtYWlsTG9naW5MaW5rQm9keUhUTUwiLCJtYWlsTG9naW5MaW5rTWVzc2FnZSIsInVwZGF0ZWRPa01lc3NhZ2UiLCJ1cGRhdGVkTmVlZEdvb2RFbWFpbCIsInVwZGF0ZWROZWVkVW5pcXVlRW1haWwiLCJtYWlsVXBkYXRlTG9naW5TdWJqZWN0IiwibWFpbFVwZGF0ZUxvZ2luQm9keVR4dCIsIm1haWxVcGRhdGVMb2dpbkJvZHlIVE1MIiwibWFpbFVwZGF0ZUxvZ2luTGlua01lc3NhZ2UiLCJ1cGRhdGVkTmVlZFZhbGlkYXRlZFVzZXIiLCJ1cGRhdGVkTmVlZEdvb2RHb2RmYXRoZXIiLCJtYWlsVXBkYXRlTG9naW5Pa01lc3NhZ2UiLCJ1cGRhdGVkRmFpbGVkR29kZmF0aGVyTm90Rm91bmQiLCJjcmVhdGlvbk9rTWVzc2FnZSIsIm1haWxEZWxldGVTdWJqZWN0IiwibWFpbERlbGV0ZUJvZHlUeHQiLCJtYWlsRGVsZXRlQm9keUhUTUwiLCJtYWlsRGVsZXRlTGlua01lc3NhZ2UiLCJkZWxldGVGYWlsTWVzc2FnZSIsIm1haWxEZWxldGVMaW5rT2tNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtBbHJlYWR5TWVzc2FnZSIsIm1haWxEZWxldGVMaW5rRmFpbE1lc3NhZ2UiLCJjcm9uRGVsZXRlVW52YWxpZGVkVXNlcnNNZXNzYWdlIiwiZGVsZXRlSW5hY3RpdmVVc2Vyc01lc3NhZ2UiLCJ3ZWxjb21lTWVzc2FnZSIsImJ5ZWJ5ZU1lc3NhZ2UiLCJpbmZvc1VzZXJGb3JBZG1pbiIsImluZm9zQWRtaW5Hb2RmYXRoZXIiLCJpbmZvc0FkbWluTmJHb2RDaGlsZHMiLCJUb29sIiwibXlWYXIiLCJ1bmRlZmluZWQiLCJ0cmltIiwibXlTdHJpbmciLCJpc0VtcHR5IiwibWF4IiwibGVuZ3RoIiwic3Vic3RyaW5nIiwibWFwT2JqIiwicmVwbGFjZUVsdHMiLCJSZWdFeHAiLCJPYmplY3QiLCJrZXlzIiwiam9pbiIsInJlcGxhY2UiLCJtYXRjaGVkIiwiTWF0aCIsImNlaWwiLCJmbG9vciIsInJhbmRvbSIsImRhdGVTdHJpbmciLCJsYW5nIiwibXlEYXRlIiwiRGF0ZSIsIm15RGF5IiwiZ2V0RGF0ZSIsIm15TW91bnRoIiwiZ2V0TW9udGgiLCJteVllYXIiLCJnZXRGdWxsWWVhciIsImhlYWRMaW5rcyIsImFuY2hvciIsImF0dHJpYnV0ZXMiLCJocmVmIiwiaWQiLCJmb290TGlua3MiLCJyZWwiLCJtYXhRdWVzdGlvbm5haXJlc0J5UGFnZSIsInVzZXJIb21lUGFnZSIsImFkbWluSG9tZVBhZ2UiLCJtYW5hZ2VySG9tZVBhZ2UiLCJzdWJzY3JpYmVQYWdlIiwiY29ubmVjdGlvblBhZ2UiLCJhY2NvdW50UGFnZSIsInF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2UiLCJ1c2Vyc01hbmFnZW1lbnRQYWdlIiwibmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSIsImlsbHVzdHJhdGlvbkRpciIsInNpdGVTbG9nYW4iLCJob21lVGl0bGUxIiwiaG9tZVAxIiwiaG9tZVRpdGxlMiIsImhvbWVQMiIsIm5ld1F1ZXN0aW9ubmFpcmVzVGl0bGUiLCJuZXdRdWVzdGlvbm5haXJlc0ludHJvIiwiZXhwbGFuYXRpb25UaXRsZSIsImV4cGxhbmF0aW9uVHh0Iiwibm9KU05vdGlmaWNhdGlvbiIsImNvbmZpZ0Zyb250RW5kIiwidHh0IiwidHh0VXNlcnMiLCJ0eHRBbndlcnMiLCJ0eHRRdWVzdGlvbm5haXJlIiwiZGl2TWFpbiIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJkaXZNZXNzYWdlIiwicXVpelRpdGxlIiwicXVpekludHJvIiwicXVpekxpc3RpbmciLCJxdWl6UGFnaW5hdGlvbiIsImZvcm1TZWFyY2giLCJpbnB1dEJlZ2luIiwiaGVsbG9EZXYiLCJpbml0aWFsaXNlIiwiZ2V0Q29uZmlnIiwiY29uZmlnIiwiYWRkRWxlbWVudCIsImRpdlJlc3BvbnNlIiwiY2hlY2tTZXNzaW9uIiwibWVzc2FnZSIsImNvbG9yIiwid2luZG93IiwibG9jYXRpb24iLCJpc0Nvbm5lY3RlZCIsInVzZXIiLCJnZXRMb2NhbHkiLCJ1cGRhdGVBY2NvdW50TGluayIsInN0YXR1cyIsInN0eWxlIiwiZGlzcGxheSIsInJlbW92ZUxvY2FseSIsInNldEF0dHJpYnV0ZXNUb0lucHV0cyIsInhoclN0YXRzIiwiWE1MSHR0cFJlcXVlc3QiLCJvcGVuIiwib25yZWFkeXN0YXRlY2hhbmdlIiwicmVhZHlTdGF0ZSIsIkRPTkUiLCJyZXNwb25zZSIsIkpTT04iLCJwYXJzZSIsInJlc3BvbnNlVGV4dCIsIm5iQW5zd2VycyIsIm1hcFRleHQiLCJOQkFOU1dFUlMiLCJOQlFVRVNUSU9OTkFJUkVTIiwibmJRdWVzdGlvbm5haXJlcyIsIk5CVE9UUVVFU1RJT05OQUlSRVMiLCJnZW5lcmFsIiwibmJQdWJsaXNoZWQiLCJBVkdEVVJBVElPTiIsImF2Z0R1cmF0aW9uIiwiQVZHQ09SUkVDVEFOU1dFUlMiLCJhdmdDb3JyZWN0QW5zd2VycyIsInJlcGxhY2VBbGwiLCJzZXRSZXF1ZXN0SGVhZGVyIiwidG9rZW4iLCJzZW5kIiwieGhyTGFzdFF1aXpzIiwibmJUb3QiLCJodG1sIiwiaW5uZXJIVE1MIiwicXVpenMiLCJzZW5kU2VhcmNoIiwiZGF0YXMiLCJnZXREYXRhc0Zyb21JbnB1dHMiLCJ4aHJTZWFyY2giLCJiZWdpbiIsImdvQmFja1JlcyIsIm5ld0JlZ2luIiwiYXNzaWduIiwiYWRkRXZlbnRMaXN0ZW5lciIsImUiLCJwcmV2ZW50RGVmYXVsdCIsIm9ucG9wc3RhdGUiLCJlbmQiLCJvdXRwdXQiLCJzdHJpbmdpZnkiLCJjb25zb2xlIiwiZXJyb3IiLCJzYXZlTG9jYWx5IiwiZGF0YSIsImxvY2FsU3RvcmFnZSIsInNldEl0ZW0iLCJqc29uIiwiZ2V0SXRlbSIsInJlbW92ZUl0ZW0iLCJlbHRQYXJlbnQiLCJlbHRUeXBlIiwiZWx0Q29udGVudCIsImVsdElkIiwiZWx0Q2xhc3MiLCJlbHRBdHRyaWJ1dGVzIiwibmV3RWxlbWVudCIsImNyZWF0ZUVsZW1lbnQiLCJBcnJheSIsImlzQXJyYXkiLCJpIiwiY2xhc3NMaXN0IiwiYWRkIiwiYXR0cmlidXROYW1lIiwic2V0QXR0cmlidXRlIiwiYXBwZW5kQ2hpbGQiLCJsb2ciLCJjb25maWdUZW1wbGF0ZSIsImxpbmsiLCJob21lUGFnZSIsImlucHV0c0NvbmYiLCJteUZvcm0iLCJlbGVtZW50cyIsImlkSW5wdXQiLCJpbnB1dEhUTUwiLCJhdHRyaWJ1dGUiLCJmb3JtRGF0YSIsIkZvcm1EYXRhIiwiZW50cmllcyIsImVudHJpZSIsImVtcHlGb3JtIiwidHlwZSIsImNoZWNrZWQiLCJlbXB5QW5kSGlkZUZvcm0iLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInhociIsIm9ubG9hZCIsIm9uZXJyb3IiLCJzdGF0dXNUZXh0IiwiZ2V0VGltZURpZmZlcmVuY2UiLCJ0aW1lTG9jYWwiLCJnZXRUaW1lem9uZU9mZnNldCIsImdldFBhc3N3b3JkIiwibmJDYXJNaW4iLCJuYkNhck1heCIsIm5iQ2FyIiwibGV0dGVycyIsIm90aGVycyIsInNldFNlc3Npb24iLCJ1c2VySWQiLCJkdXJhdGlvblRTIiwic3RvcmFnZVVzZXIiLCJkdXJhdGlvbiIsImNoZWNrQW5zd2VyRGF0YXMiLCJsYXN0QW5zd2VyIiwiYW5zd2VyIiwibmJDb3JyZWN0QW5zd2VycyIsIlF1ZXN0aW9ubmFpcmVJZCIsIm5iUXVlc3Rpb25zIiwidXJsUmVkaXJlY3Rpb24iLCJ1cmxXYW50ZWQiLCJ1c2VyRGF0YXMiLCJyZWRpcmVjdFVzZXIiLCJub3ciLCJpc1ZhbGlkIiwibGFuZ3VhZ2UiLCJ0aW1lRGlmZmVyZW5jZSIsIm5iRGF5c09rIiwidXJsQWNjb3VudCIsImluZGV4T2YiXSwibWFwcGluZ3MiOiI7UUFBQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7O1FBR0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDBDQUEwQyxnQ0FBZ0M7UUFDMUU7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSx3REFBd0Qsa0JBQWtCO1FBQzFFO1FBQ0EsaURBQWlELGNBQWM7UUFDL0Q7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLHlDQUF5QyxpQ0FBaUM7UUFDMUUsZ0hBQWdILG1CQUFtQixFQUFFO1FBQ3JJO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMkJBQTJCLDBCQUEwQixFQUFFO1FBQ3ZELGlDQUFpQyxlQUFlO1FBQ2hEO1FBQ0E7UUFDQTs7UUFFQTtRQUNBLHNEQUFzRCwrREFBK0Q7O1FBRXJIO1FBQ0E7OztRQUdBO1FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsRkEsSUFBTUEsS0FBSyxHQUFHQyxtQkFBTyxDQUFDLG1DQUFELENBQXJCOztBQUNBLElBQU1DLGNBQWMsR0FBR0QsbUJBQU8sQ0FBQyxxREFBRCxDQUE5Qjs7QUFFQUUsTUFBTSxDQUFDQyxPQUFQO0FBRUlDLFFBQU0sRUFBRSwyQkFGWjtBQUdJQyxTQUFPLEVBQUUsdUJBSGI7QUFJSUMsV0FBUyxFQUFFLFNBSmY7QUFLSUMsWUFBVSxFQUFFLG1CQUxoQjtBQU1JQyxZQUFVLEVBQUUsV0FOaEI7QUFPSUMsYUFBVyxFQUFFLHVCQVBqQjtBQVFJQyxXQUFTLEVBQUUsSUFSZjtBQVNJQyxPQUFLLEVBQUUsU0FUWDtBQVNzQjtBQUNsQkMsZ0JBQWMsRUFBRSxDQUFDLElBQUQsQ0FWcEI7QUFVMkI7QUFDdkJDLFVBQVEsRUFBRSxXQVhkO0FBWUlDLG9CQUFrQixFQUFFLFdBWnhCO0FBWXFDO0FBQ2pDQywwQkFBd0IsRUFBRSxHQWI5QjtBQWFtQztBQUMvQkMsOEJBQTRCLEVBQUUsQ0FkbEM7QUFjcUM7QUFDakNDLGtDQUFnQyxFQUFFLEtBZnRDO0FBZTZDO0FBQ3pDQywyQkFBeUIsRUFBRSxJQWhCL0I7QUFpQklDLDhCQUE0QixFQUFFLEtBakJsQztBQWtCSUMsNkJBQTJCLEVBQUUsVUFsQmpDO0FBbUJJQywrQkFBNkIsRUFBRSxJQW5CbkM7QUFtQndDO0FBQ3BDQyw0QkFBMEIsRUFBRSxJQXBCaEM7QUFxQklDLGdDQUE4QixFQUFFLFFBckJwQztBQXFCOEM7QUFDMUNDLHlCQUF1QixFQUFFLEVBdEI3QjtBQXVCSUMseUNBQXVDLEVBQUUsQ0F2QjdDO0FBd0JJQywwQ0FBd0MsRUFBRSxFQXhCOUM7QUF5QklDLDJDQUF5QyxFQUFFLENBekIvQztBQTBCSUMsbUNBQWlDLEVBQUUsR0ExQnZDO0FBMkJJO0FBQ0FDLGdCQUFjLEVBQUUsQ0E1QnBCO0FBNEJ1QjtBQUNuQkMsZ0JBQWMsRUFBRSxFQTdCcEI7QUE2QndCO0FBQ3BCQyxjQUFZLEVBQUUsRUE5QmxCO0FBK0JJQyxxQkFBbUIsRUFBRSxFQS9CekI7QUErQjRCO0FBQ3hCQywrQkFBNkIsRUFBQyxDQWhDbEM7QUFnQ3FDO0FBQ2pDQyw2QkFBMkIsRUFBQyxFQWpDaEM7QUFpQ29DO0FBQ2hDQyxrQ0FBZ0MsRUFBRSxFQWxDdEM7QUFrQzBDO0FBQ3RDQyx5QkFBdUIsRUFBRSxDQW5DN0I7QUFvQ0k7QUFDQUMsb0JBQWtCLEVBQUUsQ0FyQ3hCO0FBc0NJQyxvQkFBa0IsRUFBRSxDQXRDeEI7QUF1Q0lDLDRCQUEwQixFQUFFLE9BdkNoQztBQXVDd0M7QUFDcENDLDBCQUF3QixFQUFFLENBQUUsV0FBRixFQUFlLFlBQWYsRUFBNkIsV0FBN0IsRUFBMEMsV0FBMUMsRUFBdUQsV0FBdkQsQ0F4QzlCO0FBeUNJO0FBQ0FDLDJCQUF5QixFQUFFLEdBMUMvQjtBQTJDSUMscUNBQW1DLEVBQUUsR0EzQ3pDO0FBNENJO0FBQ0FDLFlBQVUsRUFBRSxDQTdDaEI7QUE4Q0lDLFlBQVUsRUFBRTtBQTlDaEIsc0RBZ0RvQjNDLGNBQWMsQ0FBQzRCLGNBaERuQyxzREFpRG9CNUIsY0FBYyxDQUFDNkIsY0FqRG5DLG9EQWtEa0I3QixjQUFjLENBQUM4QixZQWxEakMseURBbUR1QmhDLEtBQUssQ0FBQzhDLFFBQU4sQ0FBZUMsU0FuRHRDLHFEQW9EbUIvQyxLQUFLLENBQUNnRCxhQXBEekIsNERBcUQwQmhELEtBQUssQ0FBQ2lELG9CQXJEaEMsOERBc0Q0Qi9DLGNBQWMsQ0FBQ2dELHNCQXREM0MseURBdUR1QmhELGNBQWMsQ0FBQ2lELGlCQXZEdEMsbUVBd0RpQ2pELGNBQWMsQ0FBQ2tELDJCQXhEaEQsNERBeUQwQmxELGNBQWMsQ0FBQ21ELG9CQXpEekMsMkRBMER5Qm5ELGNBQWMsQ0FBQ29ELG1CQTFEeEMsb0I7Ozs7Ozs7Ozs7O0FDSEFuRCxNQUFNLENBQUNDLE9BQVAsR0FDQTtBQUNJO0FBQ0FtRCxxQkFBbUIsRUFBRSxnQkFGekI7QUFHSUMsd0JBQXNCLEVBQUUsTUFINUI7QUFJSUMsNEJBQTBCLEVBQUUsVUFKaEM7QUFLSUMsOEJBQTRCLEVBQUUsUUFMbEM7QUFNSUMsa0JBQWdCLEVBQUUsVUFOdEI7QUFPSUMsd0JBQXNCLEVBQUcsU0FQN0I7QUFRSUMsMkJBQXlCLEVBQUcsU0FSaEM7QUFTSUMsZ0NBQThCLEVBQUcsY0FUckM7QUFVSUMsMkJBQXlCLEVBQUUsNkJBVi9CO0FBV0k7QUFDQUMsZ0JBQWMsRUFBRSxZQVpwQjtBQWFJO0FBQ0FDLGlCQUFlLEVBQUUsZUFkckI7QUFlSTtBQUNBQyxnQ0FBOEIsRUFBRSxzQkFoQnBDO0FBaUJJQyxvQkFBa0IsRUFBRSxnQkFqQnhCO0FBa0JJQyxpQkFBZSxFQUFHLHVCQWxCdEI7QUFtQklDLGVBQWEsRUFBRSxpQkFuQm5CO0FBb0JJO0FBQ0FDLGVBQWEsRUFDYjtBQUNJQyxTQUFLLEVBQUU7QUFBRUMsZUFBUyxFQUFFLEdBQWI7QUFBa0JDLGNBQVEsRUFBRTtBQUE1QixLQURYO0FBRUlDLFFBQUksRUFBRTtBQUFFRixlQUFTLEVBQUU7QUFBYixLQUZWO0FBRThCO0FBQzFCRyxnQkFBWSxFQUFFO0FBQUVGLGNBQVEsRUFBRTtBQUFaO0FBSGxCLEdBdEJKO0FBMkJJRyxzQkFBb0IsRUFBRztBQUFFN0IsYUFBUyxFQUFFLENBQWI7QUFBZ0IwQixZQUFRLEVBQUU7QUFBMUIsR0EzQjNCO0FBNEJJSSxVQUFRLEVBQ1I7QUFDSUMsUUFBSSxFQUFFO0FBQUVOLGVBQVMsRUFBRSxHQUFiO0FBQWtCQyxjQUFRLEVBQUU7QUFBNUIsS0FEVjtBQUVJTSxRQUFJLEVBQUU7QUFBRU4sY0FBUSxFQUFFLElBQVo7QUFBa0JPLFNBQUcsRUFBQyxDQUF0QjtBQUF5QkMsa0JBQVksRUFBQztBQUF0QztBQUZWLEdBN0JKO0FBaUNJQyxRQUFNLEVBQ047QUFDSUosUUFBSSxFQUFFO0FBQUVOLGVBQVMsRUFBRSxHQUFiO0FBQWtCQyxjQUFRLEVBQUU7QUFBNUI7QUFEVixHQWxDSjtBQXFDSTNDLGdCQUFjLEVBQUUsQ0FyQ3BCO0FBc0NJQyxnQkFBYyxFQUFFLEVBdENwQjtBQXVDSUMsY0FBWSxFQUFFLEVBdkNsQjtBQXdDSW1ELFdBQVMsRUFBRSxDQXhDZjtBQXlDSUMsV0FBUyxFQUFFLENBekNmO0FBeUNrQjtBQUNkO0FBQ0FsQyx3QkFBc0IsRUFBRyxzQkEzQzdCO0FBNENJQyxtQkFBaUIsRUFBRyxnQ0E1Q3hCO0FBNkNJQyw2QkFBMkIsRUFBRyw0QkE3Q2xDO0FBOENJaUMsY0FBWSxFQUFHLDJCQTlDbkI7QUErQ0loQyxzQkFBb0IsRUFBRyxtQkEvQzNCO0FBZ0RJaUMsYUFBVyxFQUFHLG9CQWhEbEI7QUFpREloQyxxQkFBbUIsRUFBRyxNQWpEMUI7QUFpRGlDO0FBQzdCaUMsWUFBVSxFQUFHLE9BbERqQixDQWtEd0I7O0FBbER4QixDQURBLEM7Ozs7Ozs7Ozs7O0FDQUFwRixNQUFNLENBQUNDLE9BQVAsR0FDQTtBQUNJO0FBQ0FvRixZQUFVLEVBQUUsT0FGaEI7QUFHSUMsZ0JBQWMsRUFBRSxTQUhwQjtBQUlJQyxtQkFBaUIsRUFBRSxpQkFKdkI7QUFLSUMseUJBQXVCLEVBQUUsY0FMN0I7QUFNSUMsMEJBQXdCLEVBQUUsY0FOOUI7QUFPSUMsaUJBQWUsRUFBRSxjQVByQjtBQVFJQyxpQkFBZSxFQUFFLFFBUnJCO0FBU0lDLG1CQUFpQixFQUFFLGVBVHZCO0FBVUlDLHlCQUF1QixFQUFFLGlCQVY3QjtBQVdJQyxjQUFZLEVBQUUsT0FYbEI7QUFZSUMsaUJBQWUsRUFBRSxTQVpyQjtBQWFJQyxtQkFBaUIsRUFBRSxZQWJ2QjtBQWNJQyxpQkFBZSxFQUFFLFVBZHJCO0FBZUlDLGlCQUFlLEVBQUUsVUFmckI7QUFnQklDLGNBQVksRUFBRSxnQkFoQmxCO0FBaUJJQyx3QkFBc0IsRUFBRSxtQkFqQjVCO0FBa0JJQyxzQkFBb0IsRUFBRSxpQkFsQjFCO0FBbUJJQyxhQUFXLEVBQUUseUJBbkJqQjtBQW9CSUMsa0JBQWdCLEVBQUUscUJBcEJ0QjtBQXFCSXJDLGVBQWEsRUFBRSxpQkFyQm5CO0FBc0JJO0FBQ0FzQyxNQUFJLEVBQUU7QUFBRW5DLGFBQVMsRUFBRSxFQUFiO0FBQWlCQyxZQUFRLEVBQUU7QUFBM0IsR0F2QlY7QUF3QkltQyxPQUFLLEVBQUU7QUFBRXBDLGFBQVMsRUFBRSxHQUFiO0FBQWtCQyxZQUFRLEVBQUU7QUFBNUIsR0F4Qlg7QUF5QkkzQixVQUFRLEVBQUU7QUFBRUMsYUFBUyxFQUFFLENBQWI7QUFBZ0J5QixhQUFTLEVBQUMsRUFBMUI7QUFBOEJDLFlBQVEsRUFBRTtBQUF4QyxHQXpCZDtBQXlCOEQ7QUFDMURvQyxhQUFXLEVBQUU7QUFBRTlELGFBQVMsRUFBRSxDQUFiO0FBQWdCeUIsYUFBUyxFQUFDO0FBQTFCLEdBMUJqQjtBQTJCSXNDLGVBQWEsRUFBRTtBQUFFdEMsYUFBUyxFQUFFO0FBQWIsR0EzQm5CO0FBNEJJdUMsT0FBSyxFQUFFO0FBQUVDLFNBQUssRUFBRSxNQUFUO0FBQWlCdkMsWUFBUSxFQUFFO0FBQTNCLEdBNUJYO0FBNkJJd0MsbUJBQWlCLEVBQUUsQ0FBQyxHQTdCeEI7QUE4QklDLG1CQUFpQixFQUFDLEdBOUJ0QjtBQStCSTtBQUNBbEUsZUFBYSxFQUFHLGFBaENwQjtBQWlDSUMsc0JBQW9CLEVBQUc7QUFqQzNCLENBREEsQzs7Ozs7Ozs7Ozs7QUNBQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpRTs7Ozs7Ozs7Ozs7QUN0QkE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0U7Ozs7Ozs7Ozs7O0FDdEJBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdFOzs7Ozs7Ozs7OztBQ3RCQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrRDs7Ozs7Ozs7Ozs7QUN0QkE5QyxNQUFNLENBQUNDLE9BQVAsR0FDQTtBQUNJK0cseUJBQXVCLEVBQUcsNkVBRDlCO0FBRUlDLGdDQUE4QixFQUFHLHVGQUZyQztBQUdJQyw0QkFBMEIsRUFBRyx1RkFIakM7QUFJSUMsNEJBQTBCLEVBQUcscUZBSmpDO0FBS0lDLDRCQUEwQixFQUFHLG1EQUxqQztBQU1JQyxtQ0FBaUMsRUFBRyw2REFOeEM7QUFPSUMsK0JBQTZCLEVBQUcsdURBUHBDO0FBUUlDLCtCQUE2QixFQUFHLGdGQVJwQztBQVNJQyxtQ0FBaUMsRUFBRyxnRUFUeEM7QUFVSUMsK0JBQTZCLEVBQUcsK0NBVnBDO0FBV0lDLHlCQUF1QixFQUFHLDBKQVg5QjtBQVlJQywyQkFBeUIsRUFBRyw4SEFaaEM7QUFhSUMsNEJBQTBCLEVBQUcscUlBYmpDO0FBY0lDLHFCQUFtQixFQUFFLCtRQWR6QjtBQWVJQyxzQkFBb0IsRUFBRyxnRkFmM0I7QUFnQklDLG9CQUFrQixFQUFHLGdJQWhCekI7QUFpQklDLDhCQUE0QixFQUFFLDhSQWpCbEM7QUFrQklDLDhCQUE0QixFQUFFLHVHQWxCbEM7QUFtQklDLFdBQVMsRUFBRSxxUkFuQmY7QUFvQklDLHNCQUFvQixFQUFFLHdEQXBCMUI7QUFxQklDLHNCQUFvQixFQUFFLDBIQXJCMUI7QUFzQklDLHFCQUFtQixFQUFFLHFHQXRCekI7QUF1QklDLGtCQUFnQixFQUFFO0FBdkJ0QixDQURBLEM7Ozs7Ozs7Ozs7O0FDQUF0SSxNQUFNLENBQUNDLE9BQVAsR0FDQTtBQUNJc0ksZUFBYSxFQUFHLG1EQURwQjtBQUVJQyxxQkFBbUIsRUFBRyx1RkFGMUI7QUFHSUMsa0JBQWdCLEVBQUcsdUVBSHZCO0FBSUlDLG1CQUFpQixFQUFHLG1FQUp4QjtBQUtJQyxhQUFXLEVBQUcsNEdBTGxCO0FBTUlDLGtCQUFnQixFQUFHLHdCQU52QjtBQU9JQyxjQUFZLEVBQUcsc0RBUG5CO0FBUUlDLFFBQU0sRUFBRywrQ0FSYjtBQVNJQyxnQkFBYyxFQUFHLG9CQVRyQjtBQVVJQyxZQUFVLEVBQUcsMkRBVmpCO0FBV0lDLGFBQVcsRUFBRyxhQVhsQjtBQVlJQyxjQUFZLEVBQUUsVUFabEI7QUFhSUMsV0FBUyxFQUFFLFNBYmY7QUFjSUMsY0FBWSxFQUFFLFdBZGxCO0FBZUlDLGNBQVksRUFBRyx3Q0FmbkI7QUFnQklDLGlCQUFlLEVBQUcsK0NBaEJ0QjtBQWlCSUMsaUJBQWUsRUFBRyx3Q0FqQnRCO0FBa0JJQyxVQUFRLEVBQUcsNEJBbEJmO0FBbUJJQyxnQkFBYyxFQUFHLGtDQW5CckI7QUFvQklDLGVBQWEsRUFBRywyQ0FwQnBCO0FBcUJJQyxZQUFVLEVBQUcsMkJBckJqQjtBQXNCSUMsY0FBWSxFQUFHLHFEQXRCbkI7QUF1QklDLGNBQVksRUFBRyxpQkF2Qm5CO0FBd0JJQyxVQUFRLEVBQUcsZUF4QmY7QUF5QklDLHdCQUFzQixFQUFHLGlCQXpCN0I7QUEwQklDLFlBQVUsRUFBRztBQTFCakIsQ0FEQSxDOzs7Ozs7Ozs7OztBQ0FBaEssTUFBTSxDQUFDQyxPQUFQLEdBQ0E7QUFDSWdLLFdBQVMsRUFBRSx5Q0FEZjtBQUVJQyxxQkFBbUIsRUFBRSw4REFGekI7QUFHSUMsU0FBTyxFQUFFLHNDQUhiO0FBSUlDLGVBQWEsRUFBRSxpQ0FKbkI7QUFLSUMsa0JBQWdCLEVBQUUsd0RBTHRCO0FBTUlDLDJCQUF5QixFQUFFLDBEQU4vQjtBQU9JQyx1QkFBcUIsRUFBRSx1Q0FQM0I7QUFRSUMsY0FBWSxFQUFFLCtDQVJsQjtBQVNJQyxtQkFBaUIsRUFBRSw4REFUdkI7QUFVSUMsVUFBUSxFQUFHLGdDQVZmO0FBV0lDLG1CQUFpQixFQUFHLCtCQVh4QjtBQVlJQyxnQkFBYyxFQUFHLG9EQVpyQjtBQWFJQyxrQkFBZ0IsRUFBRyw2Q0FidkI7QUFjSUMsYUFBVyxFQUFFLFlBZGpCO0FBZUlDLGFBQVcsRUFBRSxNQWZqQjtBQWdCSUMsYUFBVyxFQUFFLDJCQWhCakI7QUFpQklDLGVBQWEsRUFBRSw2QkFqQm5CO0FBa0JJQyxpQkFBZSxFQUFFLHNCQWxCckI7QUFtQklDLHFCQUFtQixFQUFFLDBCQW5CekI7QUFvQklDLHNCQUFvQixFQUFFLHNDQXBCMUI7QUFxQklDLHNCQUFvQixFQUFFLG9CQXJCMUI7QUFzQklDLHdCQUFzQixFQUFFLDZDQXRCNUI7QUF1QklDLGlCQUFlLEVBQUUsZ0JBdkJyQjtBQXdCSUMsOEJBQTRCLEVBQUUsdUNBeEJsQztBQXlCSUMsbUJBQWlCLEVBQUc7QUF6QnhCLENBREEsQzs7Ozs7Ozs7Ozs7QUNBQXpMLE1BQU0sQ0FBQ0MsT0FBUCxHQUNBO0FBQ0l5SyxVQUFRLEVBQUUsbUNBRGQ7QUFFSWdCLFVBQVEsRUFBRSx3Q0FGZDtBQUdJQyxvQkFBa0IsRUFBRSw4RUFIeEI7QUFJSUMsV0FBUyxFQUFFLHVDQUpmO0FBS0lDLGlCQUFlLEVBQUUscUtBTHJCO0FBTUlDLHFCQUFtQixFQUFFLDRFQU56QjtBQU9JQyxjQUFZLEVBQUcsbUNBUG5CO0FBUUlDLGtCQUFnQixFQUFHLG9FQVJ2QjtBQVNJQyxnQkFBYyxFQUFFLHlHQVRwQjtBQVVJQyxZQUFVLEVBQUcsc0JBVmpCO0FBV0kxQixjQUFZLEVBQUcsMkJBWG5CO0FBWUkyQiw2QkFBMkIsRUFBRyxpREFabEM7QUFhSUMsVUFBUSxFQUFHLDRCQWJmO0FBY0lDLGtCQUFnQixFQUFHLDRCQWR2QjtBQWVJQyxzQkFBb0IsRUFBRyw4RUFmM0I7QUFnQklDLG9CQUFrQixFQUFHLDZEQWhCekI7QUFpQklDLHVCQUFxQixFQUFHLG9GQWpCNUI7QUFrQklDLHVCQUFxQixFQUFHLG9GQWxCNUI7QUFtQklDLFdBQVMsRUFBRywrREFuQmhCO0FBb0JJQyxtQkFBaUIsRUFBRSx1REFwQnZCO0FBcUJJQyxnQkFBYyxFQUFFLG1DQXJCcEI7QUFzQklDLHVCQUFxQixFQUFFLGlLQXRCM0I7QUF1QklDLDJCQUF5QixFQUFHLCtCQXZCaEM7QUF3QklDLDRCQUEwQixFQUFHLGdIQXhCakM7QUF5QklDLDZCQUEyQixFQUFHLHlKQXpCbEM7QUEwQklDLG1CQUFpQixFQUFFLCtJQTFCdkI7QUEyQklDLHdCQUFzQixFQUFFLDhCQTNCNUI7QUE0QklDLDBCQUF3QixFQUFFLG1EQTVCOUI7QUE2QklDLCtCQUE2QixFQUFFLDhCQTdCbkM7QUE4QklDLG9CQUFrQixFQUFHLGFBOUJ6QjtBQStCSUMsb0JBQWtCLEVBQUcsZ0dBL0J6QjtBQWdDSUMscUJBQW1CLEVBQUcsbUhBaEMxQjtBQWlDSUMsMkJBQXlCLEVBQUcsU0FqQ2hDO0FBa0NJQywyQkFBeUIsRUFBRyx3SEFsQ2hDO0FBbUNJQyw0QkFBMEIsRUFBRywySUFuQ2pDO0FBb0NJQywwQkFBd0IsRUFBRSw2SUFwQzlCO0FBcUNJQyxlQUFhLEVBQUUscURBckNuQjtBQXNDSUMsa0JBQWdCLEVBQUUsc0NBdEN0QjtBQXVDSUMsaUJBQWUsRUFBRSx3REF2Q3JCO0FBd0NJQyxjQUFZLEVBQUUsb0JBeENsQjtBQXlDSUMsb0JBQWtCLEVBQUUsNkhBekN4QjtBQTBDSUMsdUJBQXFCLEVBQUcsK0hBMUM1QjtBQTJDSUMsbUJBQWlCLEVBQUcsdUlBM0N4QjtBQTRDSUMsYUFBVyxFQUFFLG1DQTVDakI7QUE2Q0lDLHNCQUFvQixFQUFHLDBCQTdDM0I7QUE4Q0lDLHNCQUFvQixFQUFHLDRHQTlDM0I7QUErQ0lDLHVCQUFxQixFQUFHLHlKQS9DNUI7QUFnRElDLHNCQUFvQixFQUFHLHVJQWhEM0I7QUFpRElDLGtCQUFnQixFQUFFLDZDQWpEdEI7QUFrRElDLHNCQUFvQixFQUFHLDhGQWxEM0I7QUFtRElDLHdCQUFzQixFQUFHLDhIQW5EN0I7QUFvRElDLHdCQUFzQixFQUFHLDZDQXBEN0I7QUFxRElDLHdCQUFzQixFQUFHLDhIQXJEN0I7QUFzRElDLHlCQUF1QixFQUFHLDBJQXREOUI7QUF1RElDLDRCQUEwQixFQUFFLDhTQXZEaEM7QUF3RElDLDBCQUF3QixFQUFFLGlHQXhEOUI7QUF5RElDLDBCQUF3QixFQUFHLCtIQXpEL0I7QUEwRElDLDBCQUF3QixFQUFFLDREQTFEOUI7QUEyRElDLGdDQUE4QixFQUFHLHlFQTNEckM7QUE0RElDLG1CQUFpQixFQUFFLDhDQTVEdkI7QUE2RElDLG1CQUFpQixFQUFHLDJDQTdEeEI7QUE4RElDLG1CQUFpQixFQUFHLHNIQTlEeEI7QUErRElDLG9CQUFrQixFQUFHLGtJQS9EekI7QUFnRUlDLHVCQUFxQixFQUFFLHdKQWhFM0I7QUFpRUloRyxpQkFBZSxFQUFFLG9DQWpFckI7QUFrRUlpRyxtQkFBaUIsRUFBRSx5REFsRXZCO0FBbUVJQyx5QkFBdUIsRUFBRSx1RUFuRTdCO0FBb0VJQyw4QkFBNEIsRUFBRSxxRUFwRWxDO0FBcUVJQywyQkFBeUIsRUFBRSw0RUFyRS9CO0FBc0VJQyxpQ0FBK0IsRUFBRSxzREF0RXJDO0FBdUVJQyw0QkFBMEIsRUFBRSxtREF2RWhDO0FBd0VJQyxnQkFBYyxFQUFFLG1CQXhFcEI7QUF5RUlDLGVBQWEsRUFBRSwyRkF6RW5CO0FBMEVJQyxtQkFBaUIsRUFBRSxnTEExRXZCO0FBMkVJQyxxQkFBbUIsRUFBRSxxQ0EzRXpCO0FBNEVJQyx1QkFBcUIsRUFBRTtBQTVFM0IsQ0FEQSxDOzs7Ozs7Ozs7Ozs7Ozs7OztBQ0FBO0lBRU1DLEk7Ozs7Ozs7NEJBRWFDLEssRUFDZjtBQUNJLFVBQUdBLEtBQUssS0FBR0MsU0FBUixJQUFxQkQsS0FBSyxLQUFHLElBQWhDLEVBQ0ksT0FBTyxJQUFQLENBREosS0FHQTtBQUNJQSxhQUFLLElBQUUsRUFBUCxDQURKLENBQ2M7O0FBQ1ZBLGFBQUssR0FBQ0EsS0FBSyxDQUFDRSxJQUFOLEVBQU47QUFDQSxZQUFHRixLQUFLLEtBQUcsRUFBWCxFQUNJLE9BQU8sSUFBUCxDQURKLEtBR0ksT0FBTyxLQUFQO0FBQ1A7QUFDSjs7O2tDQUVvQkcsUSxFQUNyQjtBQUNJLFVBQUdKLElBQUksQ0FBQ0ssT0FBTCxDQUFhRCxRQUFiLENBQUgsRUFDSUEsUUFBUSxHQUFDLElBQVQsQ0FESixLQUdBO0FBQ0lBLGdCQUFRLElBQUUsRUFBVixDQURKLENBQ2lCOztBQUNiQSxnQkFBUSxHQUFDQSxRQUFRLENBQUNELElBQVQsRUFBVDtBQUNIO0FBQ0QsYUFBT0MsUUFBUDtBQUNIOzs7d0NBRzBCQSxRLEVBQVVFLEcsRUFDckM7QUFDSUYsY0FBUSxJQUFFLEVBQVYsQ0FESixDQUNpQjs7QUFDZCxVQUFHQSxRQUFRLENBQUNHLE1BQVQsR0FBa0JELEdBQXJCLEVBQ0tGLFFBQVEsR0FBQ0EsUUFBUSxDQUFDSSxTQUFULENBQW1CLENBQW5CLEVBQXVCRixHQUFHLEdBQUMsQ0FBM0IsSUFBK0IsS0FBeEM7QUFDSixhQUFPRixRQUFQO0FBQ0gsSyxDQUVEOzs7OytCQUNrQkEsUSxFQUFVSyxNLEVBQzVCO0FBQ0ksVUFBTUMsV0FBVyxHQUFHLElBQUlDLE1BQUosQ0FBV0MsTUFBTSxDQUFDQyxJQUFQLENBQVlKLE1BQVosRUFBb0JLLElBQXBCLENBQXlCLEdBQXpCLENBQVgsRUFBeUMsSUFBekMsQ0FBcEI7QUFDQSxhQUFPVixRQUFRLENBQUNXLE9BQVQsQ0FBaUJMLFdBQWpCLEVBQThCLFVBQUNNLE9BQUQsRUFDckM7QUFDSSxlQUFPUCxNQUFNLENBQUNPLE9BQUQsQ0FBYjtBQUNILE9BSE0sQ0FBUDtBQUlILEssQ0FFRDs7OztpQ0FDb0J0TSxHLEVBQUs0TCxHLEVBQ3pCO0FBQ0k1TCxTQUFHLEdBQUd1TSxJQUFJLENBQUNDLElBQUwsQ0FBVXhNLEdBQVYsQ0FBTjtBQUNBNEwsU0FBRyxHQUFHVyxJQUFJLENBQUNFLEtBQUwsQ0FBV2IsR0FBWCxDQUFOO0FBQ0EsYUFBT1csSUFBSSxDQUFDRSxLQUFMLENBQVdGLElBQUksQ0FBQ0csTUFBTCxNQUFpQmQsR0FBRyxHQUFHNUwsR0FBdkIsQ0FBWCxJQUEwQ0EsR0FBakQ7QUFDSCxLLENBRUQ7Ozs7K0JBQ2tCMk0sVSxFQUNsQjtBQUFBLFVBRDhCQyxJQUM5Qix1RUFEbUMsSUFDbkM7QUFDSSxVQUFHdEIsSUFBSSxDQUFDSyxPQUFMLENBQWFnQixVQUFiLENBQUgsRUFDSSxPQUFPLEVBQVA7QUFDSixVQUFJRSxNQUFNLEdBQUMsSUFBSUMsSUFBSixDQUFTSCxVQUFULENBQVg7QUFDQSxVQUFJSSxLQUFLLEdBQUNGLE1BQU0sQ0FBQ0csT0FBUCxLQUFpQixFQUEzQjtBQUNBLFVBQUdELEtBQUssQ0FBQ2xCLE1BQU4sS0FBZSxDQUFsQixFQUNJa0IsS0FBSyxHQUFDLE1BQUlBLEtBQVY7QUFDSixVQUFJRSxRQUFRLEdBQUVKLE1BQU0sQ0FBQ0ssUUFBUCxLQUFrQixDQUFuQixHQUFzQixFQUFuQztBQUNBLFVBQUdELFFBQVEsQ0FBQ3BCLE1BQVQsS0FBa0IsQ0FBckIsRUFDSW9CLFFBQVEsR0FBQyxNQUFJQSxRQUFiO0FBQ0osVUFBSUUsTUFBTSxHQUFDTixNQUFNLENBQUNPLFdBQVAsRUFBWDtBQUNBLFVBQUdSLElBQUksS0FBRyxJQUFWLEVBQ0ksT0FBT0csS0FBSyxHQUFDLEdBQU4sR0FBVUUsUUFBVixHQUFtQixHQUFuQixHQUF1QkUsTUFBOUIsQ0FESixLQUVLLElBQUlQLElBQUksS0FBRyxNQUFYLEVBQWtCO0FBQ25CLGVBQU9PLE1BQU0sR0FBQyxHQUFQLEdBQVdGLFFBQVgsR0FBb0IsR0FBcEIsR0FBd0JGLEtBQS9CLENBREMsS0FHRCxPQUFPRSxRQUFRLEdBQUMsR0FBVCxHQUFhRixLQUFiLEdBQW1CLEdBQW5CLEdBQXVCSSxNQUE5QjtBQUNQOzs7Ozs7QUFHTGhTLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQmtRLElBQWpCLEM7Ozs7Ozs7Ozs7O0FDaEZBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhEOzs7Ozs7Ozs7OztBQ3RCQW5RLE1BQU0sQ0FBQ0MsT0FBUCxHQUNBO0FBQ0lpUyxXQUFTLEVBQ1QsQ0FDSTtBQUFFQyxVQUFNLEVBQUUsU0FBVjtBQUFxQkMsY0FBVSxFQUFFO0FBQUVDLFVBQUksRUFBQztBQUFQO0FBQWpDLEdBREosRUFFSTtBQUFFRixVQUFNLEVBQUUsWUFBVjtBQUF3QkMsY0FBVSxFQUFFO0FBQUVDLFVBQUksRUFBQyxnQkFBUDtBQUF5QkMsUUFBRSxFQUFFO0FBQTdCO0FBQXBDLEdBRkosRUFHSTtBQUFFSCxVQUFNLEVBQUUsVUFBVjtBQUFzQkMsY0FBVSxFQUFFO0FBQUVDLFVBQUksRUFBQztBQUFQO0FBQWxDLEdBSEosRUFJSTtBQUFFRixVQUFNLEVBQUUsU0FBVjtBQUFxQkMsY0FBVSxFQUFFO0FBQUVDLFVBQUksRUFBQztBQUFQO0FBQWpDLEdBSkosQ0FGSjtBQVFJRSxXQUFTLEVBQ1QsQ0FDSTtBQUFFSixVQUFNLEVBQUUsU0FBVjtBQUFxQkMsY0FBVSxFQUFFO0FBQUVDLFVBQUksRUFBQztBQUFQO0FBQWpDLEdBREosRUFFSTtBQUFFRixVQUFNLEVBQUUsa0JBQVY7QUFBOEJDLGNBQVUsRUFBRTtBQUFFQyxVQUFJLEVBQUMsd0JBQVA7QUFBaUNHLFNBQUcsRUFBRTtBQUF0QztBQUExQyxHQUZKLEVBR0k7QUFBRUwsVUFBTSxFQUFFLHNCQUFWO0FBQWtDQyxjQUFVLEVBQUU7QUFBRUMsVUFBSSxFQUFDO0FBQVA7QUFBOUMsR0FISixFQUlJO0FBQUVGLFVBQU0sRUFBRSxRQUFWO0FBQW9CQyxjQUFVLEVBQUU7QUFBRUMsVUFBSSxFQUFDLFdBQVA7QUFBb0JHLFNBQUcsRUFBRTtBQUF6QjtBQUFoQyxHQUpKLEVBS0k7QUFBRUwsVUFBTSxFQUFFLFFBQVY7QUFBb0JDLGNBQVUsRUFBRTtBQUFFQyxVQUFJLEVBQUMsV0FBUDtBQUFvQkcsU0FBRyxFQUFFO0FBQXpCO0FBQWhDLEdBTEosQ0FUSjtBQWdCSUMseUJBQXVCLEVBQUUsRUFoQjdCO0FBaUJJQyxjQUFZLEVBQUcsY0FqQm5CO0FBa0JJQyxlQUFhLEVBQUcsWUFsQnBCO0FBbUJJQyxpQkFBZSxFQUFHLGNBbkJ0QjtBQW9CSUMsZUFBYSxFQUFHLGtCQXBCcEI7QUFxQklDLGdCQUFjLEVBQUcsZ0JBckJyQjtBQXNCSUMsYUFBVyxFQUFFLGFBdEJqQjtBQXVCSUMsOEJBQTRCLEVBQUUsb0JBdkJsQztBQXdCSUMscUJBQW1CLEVBQUUsMkJBeEJ6QjtBQXlCSUMsOEJBQTRCLEVBQUcsRUF6Qm5DO0FBMEJJQyxpQkFBZSxFQUFHLGFBMUJ0QjtBQTJCSUMsWUFBVSxFQUFFLDBCQTNCaEI7QUE0QklDLFlBQVUsRUFBRSxzQkE1QmhCO0FBNkJJQyxRQUFNLEVBQUUsa1NBN0JaO0FBOEJJQyxZQUFVLEVBQUUsdUJBOUJoQjtBQStCSUMsUUFBTSxFQUFFLCtjQS9CWjtBQWdDSUMsd0JBQXNCLEVBQUUsMENBaEM1QjtBQWlDSUMsd0JBQXNCLEVBQUUsaURBakM1QjtBQWtDSUMsa0JBQWdCLEVBQUUsNEJBbEN0QjtBQW1DSUMsZ0JBQWMsRUFBRSwyaUNBbkNwQjtBQW9DSUMsa0JBQWdCLEVBQUU7QUFwQ3RCLENBREEsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0EsSUFBTXBDLElBQUksR0FBQy9RLGtFQUFjLENBQUMsQ0FBRCxDQUF6Qjs7QUFDQSxJQUFNb1QsY0FBYyxHQUFHaFUsK0RBQVEsSUFBYyxHQUFDVyx5REFBZixHQUFxQixVQUFyQixHQUFnQ2dSLElBQWhDLEdBQXFDLEtBQXRDLENBQTlCLEMsQ0FFQTs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtDQUdBOztBQUNBLElBQU1zQyxHQUFHLEdBQUdqVSxtRUFBUSxJQUFhLEdBQUMyUixJQUFkLEdBQW1CLFVBQXBCLENBQW5COztBQUNBLElBQU11QyxRQUFRLEdBQUdsVSxnRUFBUSxJQUFhLEdBQUMyUixJQUFkLEdBQW1CLE9BQXBCLENBQXhCOztBQUNBLElBQU13QyxTQUFTLEdBQUduVSxrRUFBUSxJQUFhLEdBQUMyUixJQUFkLEdBQW1CLFNBQXBCLENBQXpCOztBQUNBLElBQU15QyxnQkFBZ0IsR0FBR3BVLHlFQUFRLElBQWEsR0FBQzJSLElBQWQsR0FBbUIsZ0JBQXBCLENBQWhDLEMsQ0FFQTs7O0FBQ0EsSUFBTTBDLE9BQU8sR0FBRUMsUUFBUSxDQUFDQyxjQUFULENBQXdCLGNBQXhCLENBQWY7QUFDQSxJQUFNQyxVQUFVLEdBQUdGLFFBQVEsQ0FBQ0MsY0FBVCxDQUF3QixTQUF4QixDQUFuQjtBQUNBLElBQU1FLFNBQVMsR0FBR0gsUUFBUSxDQUFDQyxjQUFULENBQXdCLFlBQXhCLENBQWxCO0FBQ0EsSUFBTUcsU0FBUyxHQUFHSixRQUFRLENBQUNDLGNBQVQsQ0FBd0IsWUFBeEIsQ0FBbEI7QUFDQSxJQUFNSSxXQUFXLEdBQUdMLFFBQVEsQ0FBQ0MsY0FBVCxDQUF3QixXQUF4QixDQUFwQjtBQUNBLElBQU1LLGNBQWMsR0FBR04sUUFBUSxDQUFDQyxjQUFULENBQXdCLGlCQUF4QixDQUF2QjtBQUNBLElBQU1NLFVBQVUsR0FBR1AsUUFBUSxDQUFDQyxjQUFULENBQXdCLFFBQXhCLENBQW5CO0FBQ0EsSUFBTU8sVUFBVSxHQUFHUixRQUFRLENBQUNDLGNBQVQsQ0FBd0IsT0FBeEIsQ0FBbkI7QUFFQVEscUVBQVE7O0FBRVIsSUFBTUMsVUFBVTtBQUFBLHFFQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQkFJVUMsaUVBQVMsRUFKbkI7O0FBQUE7QUFJTEMsa0JBSks7O0FBQUEsZ0JBS1BBLE1BTE87QUFBQTtBQUFBO0FBQUE7O0FBTVBDLDRFQUFVLENBQUNDLFdBQUQsRUFBYyxHQUFkLEVBQW1CbkIsR0FBRyxDQUFDcEwsV0FBdkIsRUFBb0MsRUFBcEMsRUFBd0MsQ0FBQyxPQUFELENBQXhDLENBQVY7QUFOTztBQUFBOztBQUFBO0FBQUE7QUFBQSxtQkFVaUJ3TSxvRUFBWSxDQUFDLENBQUMsTUFBRCxDQUFELEVBQVcsTUFBSXJCLGNBQWMsQ0FBQ2hCLGNBQTlCLEVBQThDO0FBQUVzQyxxQkFBTyxFQUFFcEIsUUFBUSxDQUFDbEcsZUFBcEI7QUFBcUN1SCxtQkFBSyxFQUFDO0FBQTNDLGFBQTlDLEVBQW9HQyxNQUFNLENBQUNDLFFBQTNHLENBVjdCOztBQUFBO0FBVURDLHVCQVZDOztBQVdQLGdCQUFHQSxXQUFILEVBQ0E7QUFDVUMsa0JBRFYsR0FDZUMseUVBQVMsQ0FBQyxNQUFELEVBQVMsSUFBVCxDQUR4QjtBQUVJQyw0RkFBaUIsQ0FBQ0YsSUFBSSxDQUFDRyxNQUFOLEVBQWM5QixjQUFkLENBQWpCO0FBQ0FtQiw4RUFBVSxDQUFDWCxVQUFELEVBQWEsSUFBYixFQUFtQk4sUUFBUSxDQUFDbEUsY0FBVCxDQUF3Qm9CLE9BQXhCLENBQWdDLE9BQWhDLEVBQXlDdUUsSUFBSSxDQUFDalAsSUFBOUMsQ0FBbkIsQ0FBVjtBQUNBMk4scUJBQU8sQ0FBQzBCLEtBQVIsQ0FBY0MsT0FBZCxHQUFzQixPQUF0Qjs7QUFDQSxrQkFBRyxDQUFDdEYsMkRBQU8sQ0FBQ2tGLHlFQUFTLENBQUMsU0FBRCxDQUFWLENBQVgsRUFDQTtBQUNJVCxnRkFBVSxDQUFDWCxVQUFELEVBQWEsR0FBYixFQUFrQm9CLHlFQUFTLENBQUMsU0FBRCxFQUFZLElBQVosQ0FBVCxDQUEyQk4sT0FBN0MsRUFBc0QsRUFBdEQsRUFBMEQsQ0FBQ00seUVBQVMsQ0FBQyxTQUFELEVBQVksSUFBWixDQUFULENBQTJCTCxLQUE1QixDQUExRCxFQUE4RixFQUE5RixFQUFrRyxLQUFsRyxDQUFWO0FBQ0FVLDRGQUFZLENBQUMsU0FBRCxDQUFaO0FBQ0gsZUFUTCxDQVVJOzs7QUFDQUMsMkZBQXFCLENBQUNoQixNQUFELEVBQVNMLFVBQVQsQ0FBckIsQ0FYSixDQVlJOztBQUNNc0Isc0JBYlYsR0FhcUIsSUFBSUMsY0FBSixFQWJyQjtBQWNJRCxzQkFBUSxDQUFDRSxJQUFULENBQWMsS0FBZCxFQUFxQmpXLDBEQUFNLEdBQUM4VSxNQUFNLENBQUM1UixtQkFBZCxHQUFrQzRSLE1BQU0sQ0FBQy9RLGVBQXpDLEdBQXlEd1IsSUFBSSxDQUFDbkQsRUFBbkY7O0FBQ0EyRCxzQkFBUSxDQUFDRyxrQkFBVCxHQUE4QixZQUM5QjtBQUNJLG9CQUFJLEtBQUtDLFVBQUwsSUFBbUJILGNBQWMsQ0FBQ0ksSUFBdEMsRUFDQTtBQUNJLHNCQUFJQyxRQUFRLEdBQUNDLElBQUksQ0FBQ0MsS0FBTCxDQUFXLEtBQUtDLFlBQWhCLENBQWI7O0FBQ0Esc0JBQUksS0FBS2QsTUFBTCxLQUFnQixHQUFoQixJQUF1QixDQUFDcEYsMkRBQU8sQ0FBQytGLFFBQVEsQ0FBQ0ksU0FBVixDQUEvQixJQUF1REosUUFBUSxDQUFDSSxTQUFULEtBQXFCLENBQWhGLEVBQWtGO0FBQ2xGO0FBQ0ksMEJBQU1DLE9BQU8sR0FDYjtBQUNHQyxpQ0FBUyxFQUFHTixRQUFRLENBQUNJLFNBRHhCO0FBRUdHLHdDQUFnQixFQUFHUCxRQUFRLENBQUNRLGdCQUYvQjtBQUdHQywyQ0FBbUIsRUFBR1QsUUFBUSxDQUFDVSxPQUFULENBQWlCQyxXQUgxQztBQUlHQyxtQ0FBVyxFQUFHWixRQUFRLENBQUNhLFdBSjFCO0FBS0dDLHlDQUFpQixFQUFHZCxRQUFRLENBQUNlO0FBTGhDLHVCQURBO0FBUUFyQyxzRkFBVSxDQUFDWCxVQUFELEVBQWEsR0FBYixFQUFrQmlELDhEQUFVLENBQUN0RCxTQUFTLENBQUMvTCxTQUFYLEVBQXNCME8sT0FBdEIsQ0FBNUIsRUFBNEQsRUFBNUQsRUFBZ0UsRUFBaEUsRUFBb0UsRUFBcEUsRUFBd0UsS0FBeEUsQ0FBVjtBQUNIO0FBQ0o7QUFDSixlQWxCRDs7QUFtQkFYLHNCQUFRLENBQUN1QixnQkFBVCxDQUEwQixlQUExQixFQUEyQyxZQUFVL0IsSUFBSSxDQUFDZ0MsS0FBMUQ7QUFDQXhCLHNCQUFRLENBQUN5QixJQUFULEdBbkNKLENBcUNJOztBQUNNQywwQkF0Q1YsR0FzQ3lCLElBQUl6QixjQUFKLEVBdEN6QjtBQXVDSXlCLDBCQUFZLENBQUN4QixJQUFiLENBQWtCLEtBQWxCLEVBQXlCalcsMERBQU0sR0FBQzhVLE1BQU0sQ0FBQzVSLG1CQUFkLEdBQWtDNFIsTUFBTSxDQUFDalIsOEJBQXpDLEdBQXdFLEVBQXhFLEdBQTJFMFIsSUFBSSxDQUFDbkQsRUFBaEYsR0FBbUYsR0FBbkYsR0FBdUYsQ0FBdkYsR0FBeUYsR0FBekYsR0FBNkZ3QixjQUFjLENBQUNaLDRCQUE1RyxHQUF5SSxPQUFsSzs7QUFDQXlFLDBCQUFZLENBQUN2QixrQkFBYixHQUFrQyxZQUNsQztBQUNJLG9CQUFJLEtBQUtDLFVBQUwsSUFBbUJILGNBQWMsQ0FBQ0ksSUFBdEMsRUFDQTtBQUNJLHNCQUFJQyxRQUFRLEdBQUNDLElBQUksQ0FBQ0MsS0FBTCxDQUFXLEtBQUtDLFlBQWhCLENBQWI7O0FBQ0Esc0JBQUksS0FBS2QsTUFBTCxLQUFnQixHQUFwQixFQUNBO0FBQ0ksd0JBQUdXLFFBQVEsQ0FBQ3FCLEtBQVQsS0FBaUIsQ0FBcEIsRUFDSTNDLGdFQUFVLENBQUNULFNBQUQsRUFBWSxHQUFaLEVBQWlCUCxTQUFTLENBQUNqTSw0QkFBM0IsRUFBeUQsRUFBekQsRUFBNkQsQ0FBQyxTQUFELENBQTdELENBQVYsQ0FESixLQUVLLElBQUd1TyxRQUFRLENBQUNzQixJQUFaLEVBQ0w7QUFDSTVDLHNGQUFVLENBQUNULFNBQUQsRUFBWSxHQUFaLEVBQWlCUCxTQUFTLENBQUNoTSw0QkFBVixDQUF1Q2lKLE9BQXZDLENBQStDLEtBQS9DLEVBQXNEcUYsUUFBUSxDQUFDeFcsY0FBVCxDQUF3QjJRLE1BQTlFLENBQWpCLEVBQXdHLEVBQXhHLEVBQTRHLENBQUMsYUFBRCxDQUE1RyxDQUFWO0FBQ0ErRCxpQ0FBVyxDQUFDcUQsU0FBWixHQUFzQnZCLFFBQVEsQ0FBQ3NCLElBQS9CO0FBQ0gscUJBSkksTUFNRDVDLGdFQUFVLENBQUM4QyxLQUFELEVBQVEsR0FBUixFQUFhaEUsR0FBRyxDQUFDcEwsV0FBakIsRUFBOEIsRUFBOUIsRUFBa0MsQ0FBQyxPQUFELENBQWxDLENBQVY7QUFDUCxtQkFYRCxNQWFJc00sZ0VBQVUsQ0FBQzhDLEtBQUQsRUFBUSxHQUFSLEVBQWFoRSxHQUFHLENBQUNwTCxXQUFqQixFQUE4QixFQUE5QixFQUFrQyxDQUFDLE9BQUQsQ0FBbEMsQ0FBVjtBQUNQO0FBQ0osZUFwQkQ7O0FBcUJBZ1AsMEJBQVksQ0FBQ0gsZ0JBQWIsQ0FBOEIsZUFBOUIsRUFBK0MsWUFBVS9CLElBQUksQ0FBQ2dDLEtBQTlEO0FBQ0FFLDBCQUFZLENBQUNELElBQWIsR0E5REosQ0FnRUk7QUFDQTs7QUFDTU0sd0JBbEVWLEdBa0V1QixTQUFiQSxVQUFhLEdBQ25CO0FBQ0l6RCx5QkFBUyxDQUFDdUQsU0FBVixHQUFvQjVELGdCQUFnQixDQUFDdkosaUJBQXJDO0FBQ0E4SiwyQkFBVyxDQUFDcUQsU0FBWixHQUFzQixFQUF0QjtBQUNBLG9CQUFJRyxLQUFLLEdBQUNDLDBFQUFrQixDQUFDdkQsVUFBRCxDQUE1QjtBQUNBLG9CQUFNd0QsU0FBUyxHQUFHLElBQUlqQyxjQUFKLEVBQWxCO0FBQ0FpQyx5QkFBUyxDQUFDaEMsSUFBVixDQUFlLE1BQWYsRUFBdUJuQixNQUFNLENBQUM5VSxNQUFQLEdBQWM4VSxNQUFNLENBQUM1UixtQkFBckIsR0FBeUM0UixNQUFNLENBQUN0Uix5QkFBdkU7O0FBQ0F5VSx5QkFBUyxDQUFDL0Isa0JBQVYsR0FBK0IsWUFDL0I7QUFDSSxzQkFBSSxLQUFLQyxVQUFMLElBQW1CSCxjQUFjLENBQUNJLElBQXRDLEVBQ0E7QUFDSSx3QkFBSUMsUUFBUSxHQUFDQyxJQUFJLENBQUNDLEtBQUwsQ0FBVyxLQUFLQyxZQUFoQixDQUFiOztBQUNBLHdCQUFJLEtBQUtkLE1BQUwsS0FBZ0IsR0FBaEIsSUFBdUIsQ0FBQ3BGLDJEQUFPLENBQUMrRixRQUFRLENBQUNxQixLQUFWLENBQW5DLEVBQ0E7QUFDSSwwQkFBR3JCLFFBQVEsQ0FBQ3FCLEtBQVQsS0FBaUIsQ0FBcEIsRUFDSTNDLGdFQUFVLENBQUNULFNBQUQsRUFBWSxHQUFaLEVBQWlCTixnQkFBZ0IsQ0FBQ3hKLFFBQWxDLEVBQTRDLEVBQTVDLEVBQWdELENBQUMsYUFBRCxDQUFoRCxDQUFWLENBREosS0FFSyxJQUFHNkwsUUFBUSxDQUFDc0IsSUFBWixFQUNMO0FBQ0k1Qyx3RkFBVSxDQUFDVCxTQUFELEVBQVksR0FBWixFQUFpQk4sZ0JBQWdCLENBQUNySixnQkFBakIsQ0FBa0NxRyxPQUFsQyxDQUEwQyxLQUExQyxFQUFpRHFGLFFBQVEsQ0FBQ3FCLEtBQTFELENBQWpCLEVBQW9GLEVBQXBGLEVBQXdGLENBQUMsU0FBRCxDQUF4RixDQUFWO0FBQ0FuRCxtQ0FBVyxDQUFDcUQsU0FBWixHQUFzQnZCLFFBQVEsQ0FBQ3NCLElBQS9CLENBRkosQ0FHSTs7QUFDQW5ELHNDQUFjLENBQUNvRCxTQUFmLEdBQXlCLEVBQXpCLENBSkosQ0FJZ0M7O0FBQzVCLDRCQUFHdkIsUUFBUSxDQUFDNkIsS0FBVCxJQUFrQixDQUFyQixFQUF1QjtBQUN2QjtBQUNJbkQsNEZBQVUsQ0FBQ1AsY0FBRCxFQUFpQixHQUFqQixFQUFzQlgsR0FBRyxDQUFDbEssWUFBMUIsRUFBeUMsYUFBekMsRUFBd0QsRUFBeEQsRUFBNEQ7QUFBRXdJLGtDQUFJLEVBQUU7QUFBUiw2QkFBNUQsQ0FBVjtBQUNBLGdDQUFNeEksWUFBWSxHQUFDdUssUUFBUSxDQUFDQyxjQUFULENBQXdCLGFBQXhCLENBQW5CLENBRkosQ0FHSTs7QUFDQSxnQ0FBTWdFLFNBQVMsR0FBRyxTQUFaQSxTQUFZLEdBQ2xCO0FBQ0ksa0NBQUlDLFFBQVEsR0FBQy9CLFFBQVEsQ0FBQzZCLEtBQVQsR0FBZXRFLGNBQWMsQ0FBQ1osNEJBQTNDO0FBQ0Esa0NBQUdvRixRQUFRLEdBQUMsQ0FBWixFQUFlO0FBQ1hBLHdDQUFRLEdBQUMsQ0FBVDtBQUNKbEUsc0NBQVEsQ0FBQ0MsY0FBVCxDQUF3QixPQUF4QixFQUFpQ3hOLEtBQWpDLEdBQXVDeVIsUUFBdkM7QUFDQU4sd0NBQVU7QUFDVjFDLG9DQUFNLENBQUNDLFFBQVAsQ0FBZ0JnRCxNQUFoQixDQUF1QixTQUF2QjtBQUNILDZCQVJEOztBQVNBMU8sd0NBQVksQ0FBQzJPLGdCQUFiLENBQThCLE9BQTlCLEVBQXVDLFVBQVNDLENBQVQsRUFDdkM7QUFDSUEsK0JBQUMsQ0FBQ0MsY0FBRjtBQUNBTCx1Q0FBUztBQUNaLDZCQUpEOztBQUtBL0Msa0NBQU0sQ0FBQ3FELFVBQVAsR0FBb0IsVUFBU0YsQ0FBVCxFQUNwQjtBQUNJQSwrQkFBQyxDQUFDQyxjQUFGO0FBQ0FMLHVDQUFTO0FBQ1osNkJBSkQ7QUFLSDs7QUFDRCw0QkFBRzlCLFFBQVEsQ0FBQ3FDLEdBQVQsR0FBZ0JyQyxRQUFRLENBQUNxQixLQUFULEdBQWUsQ0FBbEMsRUFBcUM7QUFDckM7QUFDSTNDLDRGQUFVLENBQUNQLGNBQUQsRUFBaUIsR0FBakIsRUFBc0JYLEdBQUcsQ0FBQ2pLLFFBQTFCLEVBQW9DLFNBQXBDLEVBQStDLEVBQS9DLEVBQW1EO0FBQUV1SSxrQ0FBSSxFQUFFO0FBQVIsNkJBQW5ELEVBQXdFLEtBQXhFLENBQVY7QUFDQSxnQ0FBTXZJLFFBQVEsR0FBQ3NLLFFBQVEsQ0FBQ0MsY0FBVCxDQUF3QixTQUF4QixDQUFmO0FBQ0F2SyxvQ0FBUSxDQUFDME8sZ0JBQVQsQ0FBMEIsT0FBMUIsRUFBbUMsVUFBU0MsQ0FBVCxFQUNuQztBQUNJQSwrQkFBQyxDQUFDQyxjQUFGO0FBQ0F0RSxzQ0FBUSxDQUFDQyxjQUFULENBQXdCLE9BQXhCLEVBQWlDeE4sS0FBakMsR0FBdUMwUCxRQUFRLENBQUNxQyxHQUFULEdBQWEsQ0FBcEQ7QUFDQVosd0NBQVU7QUFDVjFDLG9DQUFNLENBQUNDLFFBQVAsQ0FBZ0JnRCxNQUFoQixDQUF1QixTQUF2QjtBQUNILDZCQU5EO0FBT0g7QUFDSix1QkEzQ0ksTUE2Q0R0RCxnRUFBVSxDQUFDOEMsS0FBRCxFQUFRLEdBQVIsRUFBYWhFLEdBQUcsQ0FBQ3BMLFdBQWpCLEVBQThCLEVBQTlCLEVBQWtDLENBQUMsT0FBRCxDQUFsQyxDQUFWO0FBQ1AscUJBbERELE1Bb0RJc00sZ0VBQVUsQ0FBQzhDLEtBQUQsRUFBUSxHQUFSLEVBQWFoRSxHQUFHLENBQUNwTCxXQUFqQixFQUE4QixFQUE5QixFQUFrQyxDQUFDLE9BQUQsQ0FBbEMsQ0FBVjtBQUNQO0FBQ0osaUJBM0REOztBQTREQXdQLHlCQUFTLENBQUNYLGdCQUFWLENBQTJCLGNBQTNCLEVBQTJDLGtCQUEzQztBQUNBVyx5QkFBUyxDQUFDWCxnQkFBVixDQUEyQixlQUEzQixFQUE0QyxZQUFVL0IsSUFBSSxDQUFDZ0MsS0FBM0Q7O0FBQ0Esb0JBQUdRLEtBQUgsRUFDQTtBQUNJQSx1QkFBSyxDQUFDWSxNQUFOLEdBQWEsTUFBYjtBQUNBViwyQkFBUyxDQUFDVCxJQUFWLENBQWVsQixJQUFJLENBQUNzQyxTQUFMLENBQWViLEtBQWYsQ0FBZjtBQUNIO0FBQ0osZUE1SUw7O0FBNklJdEQsd0JBQVUsQ0FBQzZELGdCQUFYLENBQTRCLFFBQTVCLEVBQXNDLFVBQVNDLENBQVQsRUFDdEM7QUFDSUEsaUJBQUMsQ0FBQ0MsY0FBRjtBQUNBdEUsd0JBQVEsQ0FBQ0MsY0FBVCxDQUF3QixPQUF4QixFQUFpQ3hOLEtBQWpDLEdBQXVDLENBQXZDO0FBQ0FtUiwwQkFBVTtBQUNiLGVBTEQ7QUFNSDs7QUEvSk07QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQW9LWGUsbUJBQU8sQ0FBQ0MsS0FBUjtBQUNBL0QsNEVBQVUsQ0FBQ1gsVUFBRCxFQUFhLEdBQWIsRUFBa0JQLEdBQUcsQ0FBQ3BMLFdBQXRCLEVBQW1DLEVBQW5DLEVBQXVDLENBQUMsT0FBRCxDQUF2QyxDQUFWOztBQXJLVztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxHQUFIOztBQUFBLGtCQUFWbU0sVUFBVTtBQUFBO0FBQUE7QUFBQSxHQUFoQjs7QUF3S0FBLFVBQVUsRzs7Ozs7Ozs7Ozs7O0FDbk5WO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVPLElBQU1tRSxVQUFVLEdBQUcsU0FBYkEsVUFBYSxDQUFDelMsSUFBRCxFQUFPMFMsSUFBUCxFQUMxQjtBQUNJQyxjQUFZLENBQUNDLE9BQWIsQ0FBcUI1UyxJQUFyQixFQUEyQmdRLElBQUksQ0FBQ3NDLFNBQUwsQ0FBZUksSUFBZixDQUEzQjtBQUNILENBSE07QUFLQSxJQUFNeEQsU0FBUyxHQUFHLFNBQVpBLFNBQVksQ0FBQ2xQLElBQUQsRUFDekI7QUFBQSxNQURnQzZTLElBQ2hDLHVFQURxQyxLQUNyQztBQUNJLE1BQUdBLElBQUgsRUFDSSxPQUFPN0MsSUFBSSxDQUFDQyxLQUFMLENBQVcwQyxZQUFZLENBQUNHLE9BQWIsQ0FBcUI5UyxJQUFyQixDQUFYLENBQVAsQ0FESixLQUdJLE9BQU8yUyxZQUFZLENBQUNHLE9BQWIsQ0FBcUI5UyxJQUFyQixDQUFQO0FBQ1AsQ0FOTTtBQVFBLElBQU11UCxZQUFZLEdBQUcsU0FBZkEsWUFBZSxDQUFDdlAsSUFBRCxFQUM1QjtBQUNJMlMsY0FBWSxDQUFDSSxVQUFiLENBQXdCL1MsSUFBeEI7QUFDSCxDQUhNLEM7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQ2RQOztBQUNPLElBQU15TyxVQUFVLEdBQUcsU0FBYkEsVUFBYSxDQUFDdUUsU0FBRCxFQUFZQyxPQUFaLEVBQzFCO0FBQUEsTUFEK0NDLFVBQy9DLHVFQUQwRCxFQUMxRDtBQUFBLE1BRDhEQyxLQUM5RCx1RUFEb0UsRUFDcEU7QUFBQSxNQUR3RUMsUUFDeEUsdUVBRGlGLEVBQ2pGO0FBQUEsTUFEcUZDLGFBQ3JGLHVFQURtRyxFQUNuRztBQUFBLE1BRHVHM0ksT0FDdkcsdUVBRCtHLElBQy9HO0FBQ0ksTUFBR1YsMkRBQU8sQ0FBQ2lKLE9BQUQsQ0FBUCxJQUFvQmpKLDJEQUFPLENBQUNnSixTQUFELENBQTlCLEVBQ0ksT0FBTyxLQUFQLENBREosS0FHQTtBQUNJLFFBQU1NLFVBQVUsR0FBQzFGLFFBQVEsQ0FBQzJGLGFBQVQsQ0FBdUJOLE9BQXZCLENBQWpCO0FBRUEsUUFBRyxDQUFDakosMkRBQU8sQ0FBQ21KLEtBQUQsQ0FBWCxFQUFtQjtBQUNmRyxnQkFBVSxDQUFDeEgsRUFBWCxHQUFjcUgsS0FBZDs7QUFFSixRQUFHSyxLQUFLLENBQUNDLE9BQU4sQ0FBY0wsUUFBZCxLQUEyQkEsUUFBUSxDQUFDbEosTUFBVCxJQUFpQixDQUEvQyxFQUNBO0FBQ0ksV0FBSSxJQUFJd0osQ0FBUixJQUFhTixRQUFiO0FBQ0lFLGtCQUFVLENBQUNLLFNBQVgsQ0FBcUJDLEdBQXJCLENBQXlCUixRQUFRLENBQUNNLENBQUQsQ0FBakM7QUFESjtBQUVIOztBQUVELFFBQUcsUUFBT0wsYUFBUCxNQUF5QixRQUE1QixFQUFzQztBQUN0QztBQUNJLGFBQUksSUFBSVEsWUFBUixJQUF3QlIsYUFBeEI7QUFDSUMsb0JBQVUsQ0FBQ1EsWUFBWCxDQUF3QkQsWUFBeEIsRUFBc0NSLGFBQWEsQ0FBQ1EsWUFBRCxDQUFuRDtBQURKO0FBRUg7O0FBRUQsUUFBRyxDQUFDN0osMkRBQU8sQ0FBQ2tKLFVBQUQsQ0FBWCxFQUNJSSxVQUFVLENBQUNoQyxTQUFYLEdBQXFCNEIsVUFBVSxDQUFDeEksT0FBWCxDQUFtQixLQUFuQixFQUF5QixNQUF6QixDQUFyQixDQW5CUixDQW1COEQ7O0FBRTFELFFBQUdBLE9BQUgsRUFDSXNJLFNBQVMsQ0FBQzFCLFNBQVYsR0FBb0IsRUFBcEI7QUFDSjBCLGFBQVMsQ0FBQ2UsV0FBVixDQUFzQlQsVUFBdEI7QUFDSDtBQUNKLENBOUJNLEM7Ozs7Ozs7Ozs7OztBQ0hQO0FBQUE7QUFBQTtBQUFBO0FBRU8sSUFBTWpGLFFBQVEsR0FBRyxTQUFYQSxRQUFXLEdBQ3hCO0FBQ0lrRSxTQUFPLENBQUN5QixHQUFSLENBQVksK0xBQVo7QUFDQSxTQUFPLElBQVA7QUFDSCxDQUpNO0FBTUEsSUFBTTdFLGlCQUFpQixHQUFHLFNBQXBCQSxpQkFBb0IsQ0FBQ0MsTUFBRCxFQUFTNkUsY0FBVCxFQUNqQztBQUNJLE1BQU1DLElBQUksR0FBQ3RHLFFBQVEsQ0FBQ0MsY0FBVCxDQUF3QixpQkFBeEIsQ0FBWDtBQUNBLE1BQU1zRyxRQUFRLEdBQUMvRSxNQUFNLEdBQUMsVUFBdEI7QUFDQThFLE1BQUksQ0FBQ3JJLElBQUwsR0FBVSxNQUFJb0ksY0FBYyxDQUFDRSxRQUFELENBQTVCO0FBQ0gsQ0FMTSxDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NDTlA7O0FBQ08sSUFBTTNFLHFCQUFxQixHQUFHLFNBQXhCQSxxQkFBd0IsQ0FBQzRFLFVBQUQsRUFBYUMsTUFBYixFQUNyQztBQUNJLE9BQUksSUFBSVgsQ0FBUixJQUFhVyxNQUFNLENBQUNDLFFBQXBCLEVBQ0E7QUFDSSxRQUFHLENBQUN0SywyREFBTyxDQUFDcUssTUFBTSxDQUFDQyxRQUFQLENBQWdCWixDQUFoQixFQUFtQjVILEVBQXBCLENBQVgsRUFDQTtBQUNJLFVBQUl5SSxPQUFPLEdBQUNGLE1BQU0sQ0FBQ0MsUUFBUCxDQUFnQlosQ0FBaEIsRUFBbUI1SCxFQUEvQjs7QUFDQSxVQUFHc0ksVUFBVSxDQUFDRyxPQUFELENBQVYsS0FBc0IxSyxTQUF6QixFQUNBO0FBQ0ksWUFBSTJLLFNBQVMsR0FBQzVHLFFBQVEsQ0FBQ0MsY0FBVCxDQUF3QjBHLE9BQXhCLENBQWQ7O0FBQ0EsYUFBSyxJQUFJRSxTQUFULElBQXNCTCxVQUFVLENBQUNHLE9BQUQsQ0FBaEM7QUFDSUMsbUJBQVMsQ0FBQ1YsWUFBVixDQUF1QlcsU0FBdkIsRUFBa0NMLFVBQVUsQ0FBQ0csT0FBRCxDQUFWLENBQW9CRSxTQUFwQixDQUFsQztBQURKO0FBRUg7QUFDSjtBQUNKOztBQUNELFNBQU8sSUFBUDtBQUNILENBaEJNLEMsQ0FrQlA7O0FBQ08sSUFBTS9DLGtCQUFrQixHQUFHLFNBQXJCQSxrQkFBcUIsQ0FBQzJDLE1BQUQsRUFDbEM7QUFDSSxNQUFNNUMsS0FBSyxHQUFDLEVBQVo7QUFDQSxNQUFNaUQsUUFBUSxHQUFHLElBQUlDLFFBQUosQ0FBYU4sTUFBYixDQUFqQjs7QUFGSiw2Q0FHc0JLLFFBQVEsQ0FBQ0UsT0FBVCxFQUh0QjtBQUFBOztBQUFBO0FBR0k7QUFBQSxVQUFRQyxNQUFSO0FBQ0dwRCxXQUFLLENBQUNvRCxNQUFNLENBQUMsQ0FBRCxDQUFQLENBQUwsR0FBaUJBLE1BQU0sQ0FBQyxDQUFELENBQXZCO0FBREg7QUFISjtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUtJLFNBQU9wRCxLQUFQO0FBQ0gsQ0FQTSxDLENBU1A7QUFDQTs7QUFDTyxJQUFNcUQsUUFBUSxHQUFHLFNBQVhBLFFBQVcsQ0FBQ1QsTUFBRCxFQUN4QjtBQUNJLE1BQU1LLFFBQVEsR0FBRyxJQUFJQyxRQUFKLENBQWFOLE1BQWIsQ0FBakI7O0FBREosOENBRXNCSyxRQUFRLENBQUNFLE9BQVQsRUFGdEI7QUFBQTs7QUFBQTtBQUVJLDJEQUNBO0FBQUEsVUFEUUMsTUFDUjtBQUNJLFVBQUdSLE1BQU0sQ0FBQ0MsUUFBUCxDQUFnQk8sTUFBTSxDQUFDLENBQUQsQ0FBdEIsRUFBMkJFLElBQTNCLElBQWlDLFVBQWpDLElBQStDVixNQUFNLENBQUNDLFFBQVAsQ0FBZ0JPLE1BQU0sQ0FBQyxDQUFELENBQXRCLEVBQTJCRSxJQUEzQixJQUFpQyxPQUFuRixFQUNJVixNQUFNLENBQUNDLFFBQVAsQ0FBZ0JPLE1BQU0sQ0FBQyxDQUFELENBQXRCLEVBQTJCRyxPQUEzQixHQUFtQyxLQUFuQyxDQURKLEtBR0lYLE1BQU0sQ0FBQ0MsUUFBUCxDQUFnQk8sTUFBTSxDQUFDLENBQUQsQ0FBdEIsRUFBMkJ4VSxLQUEzQixHQUFpQyxFQUFqQztBQUNQO0FBUkw7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFTSSxTQUFPLElBQVA7QUFDSCxDQVhNLEMsQ0FZUDs7QUFDTyxJQUFNNFUsZUFBZSxHQUFHLFNBQWxCQSxlQUFrQixDQUFDWixNQUFELEVBQy9CO0FBQ0lTLFVBQVEsQ0FBQ1QsTUFBRCxDQUFSO0FBQ0FBLFFBQU0sQ0FBQ2hGLEtBQVAsQ0FBYUMsT0FBYixHQUFxQixNQUFyQjtBQUNILENBSk0sQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDOUNQO0FBQ0EsSUFBTXJFLElBQUksR0FBQy9RLGtFQUFjLENBQUMsQ0FBRCxDQUF6Qjs7QUFFQSxJQUFNK1osY0FBYyxHQUFHM2EsK0RBQVEsSUFBaUIsR0FBQ1cseURBQWxCLEdBQXdCLFVBQXhCLEdBQW1DZ1IsSUFBbkMsR0FBd0MsS0FBekMsQ0FBOUI7O0FBQ0E7QUFFQTtDQUdBO0FBQ0E7O0FBQ08sSUFBTXNELFNBQVM7QUFBQSxxRUFBSTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsNkNBRWYsSUFBSTJHLE9BQUosQ0FBWSxVQUFDQyxPQUFELEVBQVVDLE1BQVYsRUFDbkI7QUFDSSxrQkFBTUMsR0FBRyxHQUFHLElBQUkzRixjQUFKLEVBQVo7QUFDQTJGLGlCQUFHLENBQUMxRixJQUFKLENBQVMsS0FBVCxFQUFnQmpXLDBEQUFNLEdBQUMsaUJBQXZCOztBQUNBMmIsaUJBQUcsQ0FBQ0MsTUFBSixHQUFhO0FBQUEsdUJBQU1ILE9BQU8sQ0FBQ25GLElBQUksQ0FBQ0MsS0FBTCxDQUFXb0YsR0FBRyxDQUFDbkYsWUFBZixDQUFELENBQWI7QUFBQSxlQUFiOztBQUNBbUYsaUJBQUcsQ0FBQ0UsT0FBSixHQUFjO0FBQUEsdUJBQU1ILE1BQU0sQ0FBQ0MsR0FBRyxDQUFDRyxVQUFMLENBQVo7QUFBQSxlQUFkOztBQUNBSCxpQkFBRyxDQUFDbkUsSUFBSjtBQUNILGFBUE0sQ0FGZTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxHQUFKOztBQUFBLGtCQUFUM0MsU0FBUztBQUFBO0FBQUE7QUFBQSxHQUFmO0FBWUEsSUFBTWtILGlCQUFpQixHQUFHLFNBQXBCQSxpQkFBb0IsR0FDakM7QUFDSSxNQUFNQyxTQUFTLEdBQUMsSUFBSXZLLElBQUosR0FBV3dLLGlCQUFYLEVBQWhCO0FBQ0EsTUFBR0QsU0FBUyxHQUFHblYsa0VBQVosSUFBaUNtVixTQUFTLEdBQUdwVixrRUFBaEQsRUFDSSxPQUFPLENBQVAsQ0FESixLQUVLLE9BQU9vVixTQUFQO0FBQ1IsQ0FOTSxDLENBUVA7QUFDQTs7QUFDTyxJQUFNRSxXQUFXLEdBQUcsU0FBZEEsV0FBYyxDQUFDQyxRQUFELEVBQVdDLFFBQVgsRUFDM0I7QUFDSSxNQUFNQyxLQUFLLEdBQUNGLFFBQVEsR0FBQ2pMLElBQUksQ0FBQ0UsS0FBTCxDQUFXRixJQUFJLENBQUNHLE1BQUwsTUFBZStLLFFBQVEsR0FBQ0QsUUFBeEIsQ0FBWCxDQUFyQjtBQUNBLE1BQU1HLE9BQU8sR0FBQyxvREFBZDtBQUNBLE1BQU1DLE1BQU0sR0FBQyw4QkFBYjtBQUNBLE1BQUk5WixRQUFRLEdBQUM2WixPQUFPLENBQUNwTCxJQUFJLENBQUNFLEtBQUwsQ0FBV0YsSUFBSSxDQUFDRyxNQUFMLEtBQWNpTCxPQUFPLENBQUM5TCxNQUFqQyxDQUFELENBQXBCOztBQUNBLE9BQUksSUFBSXdKLENBQUMsR0FBQyxDQUFWLEVBQVlBLENBQUMsR0FBRXFDLEtBQUssR0FBQyxDQUFyQixFQUF3QnJDLENBQUMsRUFBekIsRUFDQTtBQUNJLFFBQUlBLENBQUMsR0FBRyxDQUFMLEtBQVcsQ0FBZCxFQUNJdlgsUUFBUSxJQUFFOFosTUFBTSxDQUFDckwsSUFBSSxDQUFDRSxLQUFMLENBQVdGLElBQUksQ0FBQ0csTUFBTCxLQUFja0wsTUFBTSxDQUFDL0wsTUFBaEMsQ0FBRCxDQUFoQixDQURKLEtBR0kvTixRQUFRLElBQUU2WixPQUFPLENBQUNwTCxJQUFJLENBQUNFLEtBQUwsQ0FBV0YsSUFBSSxDQUFDRyxNQUFMLEtBQWNpTCxPQUFPLENBQUM5TCxNQUFqQyxDQUFELENBQWpCO0FBQ1A7O0FBQ0QvTixVQUFRLElBQUU2WixPQUFPLENBQUNwTCxJQUFJLENBQUNFLEtBQUwsQ0FBV0YsSUFBSSxDQUFDRyxNQUFMLEtBQWNpTCxPQUFPLENBQUM5TCxNQUFqQyxDQUFELENBQWpCO0FBQ0EsU0FBTy9OLFFBQVA7QUFDSCxDQWZNLEMsQ0FpQlA7QUFDQTs7QUFDTyxJQUFNK1osVUFBVSxHQUFHLFNBQWJBLFVBQWEsQ0FBQ0MsTUFBRCxFQUFTbEYsS0FBVCxFQUFnQm1GLFVBQWhCLEVBQzFCO0FBQ0ksTUFBTUMsV0FBVyxHQUNqQjtBQUNJdkssTUFBRSxFQUFFcUssTUFEUjtBQUVJbEYsU0FBSyxFQUFFQSxLQUZYO0FBR0lxRixZQUFRLEVBQUVGO0FBSGQsR0FEQTtBQU1BM0Qsc0VBQVUsQ0FBQyxNQUFELEVBQVM0RCxXQUFULENBQVY7QUFDSCxDQVRNLEMsQ0FXUDtBQUNBOztBQUNPLElBQU1FLGdCQUFnQixHQUFHLFNBQW5CQSxnQkFBbUIsQ0FBQzlFLEtBQUQsRUFDaEM7QUFDSSxNQUFNK0UsVUFBVSxHQUFDdEgsbUVBQVMsQ0FBQyxZQUFELENBQTFCOztBQUNBLE1BQUcsQ0FBQ2xGLDJEQUFPLENBQUN3TSxVQUFELENBQVgsRUFDQTtBQUNJLFFBQU1DLE1BQU0sR0FBQ3pHLElBQUksQ0FBQ0MsS0FBTCxDQUFXdUcsVUFBWCxDQUFiOztBQUNBLFFBQUcsQ0FBQ3hNLDJEQUFPLENBQUN5TSxNQUFNLENBQUNILFFBQVIsQ0FBUixJQUE2QixDQUFDdE0sMkRBQU8sQ0FBQ3lNLE1BQU0sQ0FBQ0MsZ0JBQVIsQ0FBckMsSUFBa0UsQ0FBQzFNLDJEQUFPLENBQUN5TSxNQUFNLENBQUNFLGVBQVIsQ0FBMUUsSUFBc0csQ0FBQzNNLDJEQUFPLENBQUN5TSxNQUFNLENBQUNHLFdBQVIsQ0FBakgsRUFDQTtBQUNJbkYsV0FBSyxDQUFDNkUsUUFBTixHQUFlRyxNQUFNLENBQUNILFFBQXRCO0FBQ0E3RSxXQUFLLENBQUNpRixnQkFBTixHQUF1QkQsTUFBTSxDQUFDQyxnQkFBOUI7QUFDQWpGLFdBQUssQ0FBQ2tGLGVBQU4sR0FBc0JGLE1BQU0sQ0FBQ0UsZUFBN0I7QUFDQWxGLFdBQUssQ0FBQ21GLFdBQU4sR0FBa0JILE1BQU0sQ0FBQ0csV0FBekI7QUFDSDtBQUNKOztBQUNELFNBQU9uRixLQUFQO0FBQ0gsQ0FmTSxDLENBaUJQO0FBQ0E7O0FBQ08sSUFBTTlDLFlBQVk7QUFBQSxzRUFBRztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFPUyxrQkFBUCw4REFBYyxFQUFkO0FBQWtCeUgsMEJBQWxCO0FBQWtDakksbUJBQWxDO0FBQTJDa0kscUJBQTNDO0FBQUEsOENBRWpCLElBQUk1QixPQUFKLENBQVksVUFBQ0MsT0FBRCxFQUFVQyxNQUFWLEVBQ25CO0FBQ0ksa0JBQU0yQixTQUFTLEdBQUM3SCxtRUFBUyxDQUFDLE1BQUQsQ0FBekI7O0FBQ0Esa0JBQUdsRiwyREFBTyxDQUFDK00sU0FBRCxDQUFWLEVBQ0E7QUFDSUMsNEJBQVksQ0FBQ0gsY0FBRCxFQUFpQmpJLE9BQWpCLEVBQTBCa0ksU0FBMUIsQ0FBWjtBQUNBM0IsdUJBQU8sQ0FBQyxLQUFELENBQVA7QUFDSCxlQUpELE1BTUE7QUFDSSxvQkFBTWxHLElBQUksR0FBQ2UsSUFBSSxDQUFDQyxLQUFMLENBQVc4RyxTQUFYLENBQVg7O0FBQ0Esb0JBQUcvTSwyREFBTyxDQUFDaUYsSUFBSSxDQUFDbkQsRUFBTixDQUFQLElBQW9COUIsMkRBQU8sQ0FBQ2lGLElBQUksQ0FBQ2dDLEtBQU4sQ0FBM0IsSUFBMkNqSCwyREFBTyxDQUFDaUYsSUFBSSxDQUFDcUgsUUFBTixDQUFsRCxJQUFxRXJILElBQUksQ0FBQ3FILFFBQUwsR0FBZ0JuTCxJQUFJLENBQUM4TCxHQUFMLEVBQXhGLEVBQ0E7QUFDSTFILHdGQUFZLENBQUMsTUFBRCxDQUFaO0FBQ0F5SCw4QkFBWSxDQUFDSCxjQUFELEVBQWlCakksT0FBakIsRUFBMEJrSSxTQUExQixDQUFaO0FBQ0EzQix5QkFBTyxDQUFDLEtBQUQsQ0FBUDtBQUNILGlCQUxELE1BT0E7QUFDSSxzQkFBTUUsR0FBRyxHQUFHLElBQUkzRixjQUFKLEVBQVo7QUFDQTJGLHFCQUFHLENBQUMxRixJQUFKLENBQVMsS0FBVCxFQUFnQmpXLDBEQUFNLEdBQUNtRiwyREFBUCxHQUFrQkssZ0VBQWxCLEdBQWtDK1AsSUFBSSxDQUFDZ0MsS0FBdkQ7O0FBQ0FvRSxxQkFBRyxDQUFDQyxNQUFKLEdBQWEsWUFDYjtBQUNJLHdCQUFJdkYsUUFBUSxHQUFDQyxJQUFJLENBQUNDLEtBQUwsQ0FBV29GLEdBQUcsQ0FBQ25GLFlBQWYsQ0FBYjs7QUFDQSx3QkFBSW1GLEdBQUcsQ0FBQ2pHLE1BQUosS0FBZSxHQUFmLElBQXNCVyxRQUFRLENBQUNtSCxPQUEvQixJQUEwQ25ILFFBQVEsQ0FBQ2pFLEVBQVQsSUFBZWpDLFNBQTdELEVBQ0E7QUFDSSwwQkFBR2tHLFFBQVEsQ0FBQ2pFLEVBQVQsS0FBY21ELElBQUksQ0FBQ25ELEVBQXRCLEVBQ0E7QUFDSW1ELDRCQUFJLENBQUNqUCxJQUFMLEdBQVUrUCxRQUFRLENBQUMvUCxJQUFuQjtBQUNBaVAsNEJBQUksQ0FBQ2tJLFFBQUwsR0FBY3BILFFBQVEsQ0FBQ29ILFFBQXZCO0FBQ0FsSSw0QkFBSSxDQUFDbUksY0FBTCxHQUFvQnJILFFBQVEsQ0FBQ3FILGNBQTdCO0FBQ0FuSSw0QkFBSSxDQUFDRyxNQUFMLEdBQVlXLFFBQVEsQ0FBQ1gsTUFBckIsQ0FKSixDQUlnQzs7QUFDNUJxRCw0RkFBVSxDQUFDLE1BQUQsRUFBU3hELElBQVQsQ0FBVixDQUxKLENBTUk7O0FBQ0EsNEJBQUdjLFFBQVEsQ0FBQ1gsTUFBVCxLQUFrQixNQUFsQixJQUE0QlcsUUFBUSxDQUFDc0gsUUFBVCxJQUFxQixDQUFwRCxFQUNBO0FBQ0ksOEJBQU1DLFVBQVUsR0FBQzNkLDJEQUFPLEdBQUMsR0FBUixHQUFZc2EsY0FBYyxDQUFDaEosSUFBRCxDQUFkLENBQXFCc0IsV0FBbEQ7QUFDQSw4QkFBR3VDLE1BQU0sQ0FBQ0MsUUFBUCxDQUFnQmxELElBQWhCLENBQXFCMEwsT0FBckIsQ0FBNkJELFVBQTdCLE1BQTJDLENBQUMsQ0FBL0MsRUFDSXhJLE1BQU0sQ0FBQ0MsUUFBUCxDQUFnQmdELE1BQWhCLENBQXVCLE1BQUlrQyxjQUFjLENBQUNoSixJQUFELENBQWQsQ0FBcUJzQixXQUFoRCxFQUhSLENBR3FFOztBQUNqRTRJLGlDQUFPLENBQUMsSUFBRCxDQUFQO0FBQ0gseUJBTkQsTUFRQTtBQUNJLDhCQUFHL0YsTUFBTSxDQUFDbEYsTUFBUCxLQUFnQixDQUFoQixJQUFxQmtGLE1BQU0sQ0FBQ21JLE9BQVAsQ0FBZXhILFFBQVEsQ0FBQ1gsTUFBeEIsTUFBa0MsQ0FBQyxDQUEzRCxFQUNBO0FBQ0k0SCx3Q0FBWSxDQUFDSCxjQUFELEVBQWlCakksT0FBakIsRUFBMEJrSSxTQUExQixDQUFaO0FBQ0EzQixtQ0FBTyxDQUFDLEtBQUQsQ0FBUDtBQUNILDJCQUpELE1BTUlBLE9BQU8sQ0FBQyxJQUFELENBQVA7QUFDUDtBQUNKLHVCQXpCRCxNQTJCQTtBQUNJNUYsOEZBQVksQ0FBQyxNQUFELENBQVo7QUFDQXlILG9DQUFZLENBQUNILGNBQUQsRUFBaUJqSSxPQUFqQixFQUEwQmtJLFNBQTFCLENBQVo7QUFDQTNCLCtCQUFPLENBQUMsS0FBRCxDQUFQO0FBQ0g7QUFDSixxQkFsQ0QsTUFvQ0E7QUFDSTVGLDRGQUFZLENBQUMsTUFBRCxDQUFaO0FBQ0F5SCxrQ0FBWSxDQUFDSCxjQUFELEVBQWlCakksT0FBakIsRUFBMEJrSSxTQUExQixDQUFaO0FBQ0EzQiw2QkFBTyxDQUFDLEtBQUQsQ0FBUDtBQUNIO0FBQ0osbUJBNUNEOztBQTZDQUUscUJBQUcsQ0FBQ0UsT0FBSixHQUFjO0FBQUEsMkJBQU1ILE1BQU0sQ0FBQ0MsR0FBRyxDQUFDRyxVQUFMLENBQVo7QUFBQSxtQkFBZDs7QUFDQUgscUJBQUcsQ0FBQ25FLElBQUo7QUFDSDtBQUNKO0FBQ0osYUF0RU0sQ0FGaUI7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsR0FBSDs7QUFBQSxrQkFBWnZDLFlBQVk7QUFBQTtBQUFBO0FBQUEsR0FBbEIsQyxDQTBFUDs7QUFDQSxJQUFNcUksWUFBWSxHQUFHLFNBQWZBLFlBQWUsQ0FBQ0gsY0FBRCxFQUFpQmpJLE9BQWpCLEVBQTBCa0ksU0FBMUIsRUFDckI7QUFDSSxNQUFHLENBQUM5TSwyREFBTyxDQUFDNEUsT0FBRCxDQUFYLEVBQ0k2RCxvRUFBVSxDQUFDLFNBQUQsRUFBWTdELE9BQVosQ0FBVjtBQUNKLE1BQUcsQ0FBQzVFLDJEQUFPLENBQUM4TSxTQUFELENBQVgsRUFDSXJFLG9FQUFVLENBQUMsS0FBRCxFQUFRcUUsU0FBUixDQUFWO0FBQ0osTUFBRyxDQUFDOU0sMkRBQU8sQ0FBQzZNLGNBQUQsQ0FBWCxFQUNJL0gsTUFBTSxDQUFDQyxRQUFQLENBQWdCZ0QsTUFBaEIsQ0FBdUI4RSxjQUF2QjtBQUNQLENBUkQsQyIsImZpbGUiOiIuL0pTL2hvbWVVc2VyLmFwcC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL2hvbWVVc2VyLmpzXCIpO1xuIiwiY29uc3QgdXNlcnMgPSByZXF1aXJlKFwiLi91c2Vyc1wiKTtcbmNvbnN0IHF1ZXN0aW9ubmFpcmVzID0gcmVxdWlyZShcIi4vcXVlc3Rpb25uYWlyZXNcIik7XG5cbm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBhcGlVcmw6IFwiaHR0cDovL2xvY2FsaG9zdDozMDAwL2FwaVwiLFxuICAgIHNpdGVVcmw6IFwiaHR0cDovL2xvY2FsaG9zdDo4MDgwXCIsXG4gICAgYWRtaW5OYW1lOiBcIkZhYnJpY2VcIixcbiAgICBhZG1pbkVtYWlsOiBcImRldkB3aWtpbGVybmkuY29tXCIsXG4gICAgc2VuZGVyTmFtZTogXCJXaWtpTGVybmlcIixcbiAgICBzZW5kZXJFbWFpbDogXCJib25qb3VyQHdpa2lsZXJuaS5jb21cIixcbiAgICBhZG1pbkxhbmc6IFwiZnJcIixcbiAgICB0aGVtZTogXCJkZWZhdWx0XCIsIC8vIGxlIHRow6htZSB1dGlsaXPDqSAoZGFucyAvdmlld3MpIHBvdXIgZ8OpbsOpcmVyIGxlcyBwYWdlcyBIVE1MLiBDb250aWVudCBzZXMgcHJvcHJlcyBmaWNoaWVycyBkZSBjb25maWd1cmF0aW9uLlxuICAgIGF2YWlsYWJsZUxhbmdzOiBbXCJmclwiXSwvLyBMYW5ndWFnZXMgaW4gd2hpY2ggdGhlIHNpdGUgaXMgYXZhaWxhYmxlLiBUaGUgZmlyc3Qgb25lIGlzIHRoZSBkZWZhdWx0IG9uZS5cbiAgICBzaXRlTmFtZTogXCJXaWtpTGVybmlcIixcbiAgICBiZWdpbkNvZGVHb2RmYXRoZXI6IFwid2lraWxlcm5pXCIsIC8vIGNhc2Utc2Vuc2l0aXZlIGFuZCBjYW4ndCBjb250YWluIFwiQFwiICFcbiAgICBjcm9uVGltaW5nQWxlcnRJblNlY29uZGU6IDEyMCwgLy8gZm9yIGxvZ3NcbiAgICByZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlOiAzLCAvLyBpZGVtXG4gICAgdG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnM6IFwiNDhoXCIsIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96ZWl0L21zXG4gICAgdG9rZW5Mb2dpbkxpbmtUaW1lSW5Ib3VyczogXCIxaFwiLFxuICAgIHRva2VuQ29ubmV4aW9uTWluVGltZUluSG91cnM6IFwiMjRoXCIsXG4gICAgdG9rZW5Db25uZXhpb25NYXhUaW1lSW5EYXlzOiBcIjE4MCBkYXlzXCIsXG4gICAgdG9rZW5Mb2dpbkNoYW5naW5nVGltZUluSG91cnM6IFwiMWhcIiwvLyBmb3IgZW1haWwgJiBwYXNzd29yZCBjaGFuZ2luZ1xuICAgIHRva2VuRGVsZXRlVXNlclRpbWVJbkhvdXJzOiBcIjFoXCIsXG4gICAgdG9rZW5VbnN1YnNjcmliZUxpbmtUaW1lSW5EYXlzOiBcIjcgZGF5c1wiLCAvLyB0b2tlbiBzZW5kIHdpdGggc3Vic2NyaXB0aW9uJ3MgZW1haWxzXG4gICAgZnJlZUFjY291bnRUaW1pbmdJbkRheXM6IDEwLFxuICAgIGZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5czogNSxcbiAgICBhY2NvdW50RXhwaXJhdGlvbkZpcnN0Tm90aWZpY2F0aW9uSW5EYXlzOiAxNCwgICAgXG4gICAgYWNjb3VudEV4cGlyYXRpb25TZWNvbmROb3RpZmljYXRpb25JbkRheXM6IDUsXG4gICAgaW5hY3RpdmVBY2NvdW50VGltZVRvRGVsZXRlSW5EYXlzOiAxODAsXG4gICAgLy8gUXVlc3Rpb25uYWlyZXM6XG4gICAgbmJRdWVzdGlvbnNNaW46IDEsIC8vIG1pbmltdW0gbnVtYmVyIG9mIHF1ZXN0aW9ucyBmb3IgdGhlIHF1ZXN0aW9ubmFpcmUgdG8gYmUgcHVibGlzaGFibGVcbiAgICBuYlF1ZXN0aW9uc01heDogMTAsIC8vIGlmIDAgPSBub3QgbWF4aW11bVxuICAgIG5iQ2hvaWNlc01heDogMTAsXG4gICAgbmJOZXdRdWVzdGlvbm5haXJlczogMTAsLy8gZm9yIFJTUywgZXRjLlxuICAgIGhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUJlZ2luOjEsIC8vIGluIHVzZXIgbG9jYWwgdGltZVxuICAgIGhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUVuZDoyNCwgLy8gaWRlbVxuICAgIG51bWJlck5ld1F1ZXN0aW9ubmFpcmVBdFNhbWVUaW1lOiA1MCwgLy8gZm9yIG1hc3MgbWFpbGluZ1xuICAgIG1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzOiAzLFxuICAgIC8vIElsbHVzdHJhdGlvbnM6XG4gICAgbmJJbGx1c3RyYXRpb25zTWluOiAwLFxuICAgIG5iSWxsdXN0cmF0aW9uc01heDogMSxcbiAgICBtYXhJbGx1c3RyYXRpb25TaXplaW5PY3RldDogMTAwMDAwMCwvLyBwYXMgY29udHLDtGzDqSBwb3VyIGwnaW5zdGFudC4gw4AgcmV2b2lyLlxuICAgIG1pbWVUeXBlc0ZvcklsbHVzdHJhdGlvbjogWyBcImltYWdlL2pwZ1wiLCBcImltYWdlL2pwZWdcIiwgXCJpbWFnZS9wbmdcIiwgXCJpbWFnZS9naWZcIiwgXCJpbWFnZS9wbmdcIiBdLFxuICAgIC8vIC0tIFVwbG9hZCBhbmQgcmVzaXplOlxuICAgIGlsbHVzdHJhdGlvbnNXaWR0aE1heEluUHg6IDQwMCxcbiAgICBpbGx1c3RyYXRpb25zTWluaWF0dXJlc1dpZHRoTWF4SW5QeDogMjAwLFxuICAgIC8vIExpbmtzOlxuICAgIG5iTGlua3NNaW46IDEsXG4gICAgbmJMaW5rc01heDogMSxcbiAgICAvLyDDoCBzdXBwcmltZXIgcXVhbmQgdG91cyBsZXMgXCJyZXF1aXJlXCIgw6Agam91cjpcbiAgICBuYlF1ZXN0aW9uc01pbjogcXVlc3Rpb25uYWlyZXMubmJRdWVzdGlvbnNNaW4sXG4gICAgbmJRdWVzdGlvbnNNYXg6IHF1ZXN0aW9ubmFpcmVzLm5iUXVlc3Rpb25zTWF4LFxuICAgIG5iQ2hvaWNlc01heDogcXVlc3Rpb25uYWlyZXMubmJDaG9pY2VzTWF4LFxuICAgIHBhc3N3b3JkTWluTGVuZ3RoOiB1c2Vycy5wYXNzd29yZC5taW5sZW5ndGgsXG4gICAgZGlyQ2FjaGVVc2VyczogdXNlcnMuZGlyQ2FjaGVVc2VycyxcbiAgICBkaXJDYWNoZVVzZXJzQW5zd2VyczogdXNlcnMuZGlyQ2FjaGVVc2Vyc0Fuc3dlcnMsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbm5haXJlczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyxcbiAgICBkaXJDYWNoZVF1ZXN0aW9uczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVRdWVzdGlvbnMsXG4gICAgZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzOiBxdWVzdGlvbm5haXJlcy5kaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXMsXG4gICAgZGlySFRNTFF1ZXN0aW9ubmFpcmU6IHF1ZXN0aW9ubmFpcmVzLmRpckhUTUxRdWVzdGlvbm5haXJlLFxuICAgIGRpcldlYlF1ZXN0aW9ubmFpcmU6IHF1ZXN0aW9ubmFpcmVzLmRpcldlYlF1ZXN0aW9ubmFpcmVcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxueyAgICBcbiAgICAvLyBBUEkncm91dGVzIChhZnRlciBcImFwaVVybFwiIGRlZmluZWQgaW4gaW5zdGFuY2UuanMpXG4gICAgcXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcXVlc3Rpb25uYWlyZVwiLFxuICAgIGdldFF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL2dldFwiLFxuICAgIHByZXZpZXdRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9wcmV2aWV3XCIsXG4gICAgcHVibGlzaGVkUXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcXVpei9cIixcbiAgICBzYXZlQW5zd2Vyc1JvdXRlOiBcIi9hbnN3ZXIvXCIsXG4gICAgZ2V0U3RhdHNRdWVzdGlvbm5haXJlcyA6IFwiL3N0YXRzL1wiLFxuICAgIHNlYXJjaFF1ZXN0aW9ubmFpcmVzUm91dGUgOiBcIi9zZWFyY2hcIixcbiAgICBzZWFyY2hBZG1pblF1ZXN0aW9ubmFpcmVzUm91dGUgOiBcIi9zZWFyY2hhZG1pblwiLFxuICAgIGdldExpc3ROZXh0UXVlc3Rpb25uYWlyZXM6IFwiL2dldGxpc3RuZXh0cXVlc3Rpb25uYWlyZXMvXCIsXG4gICAgLy8gLS0gcXVlc3Rpb25zICYgY2hvaWNlcyA6XG4gICAgcXVlc3Rpb25zUm91dGU6IFwiL3F1ZXN0aW9uL1wiLFxuICAgIC8vIC0tIHRhZ3MgOlxuICAgIHRhZ3NTZWFyY2hSb3V0ZTogXCIvdGFncy9zZWFyY2gvXCIsXG4gICAgLy8gLS0gYW5zd2VycyA6XG4gICAgZ2V0UXVlc3Rpb25uYWlyZXNXaXRob3V0QW5zd2VyOiBcIi93aXRob3V0YW5zd2VyL3VzZXIvXCIsXG4gICAgZ2V0UHJldmlvdXNBbnN3ZXJzOiBcIi91c2VyL2Fuc3dlcnMvXCIsXG4gICAgZ2V0U3RhdHNBbnN3ZXJzIDogXCIvdXNlci9hbndzd2Vycy9zdGF0cy9cIixcbiAgICBnZXRBZG1pblN0YXRzOiBcIi9nZXRhZG1pbnN0YXRzL1wiLFxuICAgIC8vIGZvcm1zIDogw6AgY29tcGzDqXRlciBhdmVjIHZhbGV1cnMgcGFyIGTDqWZhdXQsIGV0Yy4gY2YgbW9kw6hsZVxuICAgIFF1ZXN0aW9ubmFpcmUgOlxuICAgIHtcbiAgICAgICAgdGl0bGU6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgIHNsdWc6IHsgbWF4bGVuZ3RoOiAxNTAgfSwgLy8gY2hhbXAgcmVxdWlzIG1haXMgY2FsY3Vsw6kgw6AgcGFydGlyIGR1IHRpdHJlIHFkIHZpZGVcbiAgICAgICAgaW50cm9kdWN0aW9uOiB7IHJlcXVpcmVkOiB0cnVlIH1cbiAgICB9LFxuICAgIHNlYXJjaFF1ZXN0aW9ubmFpcmVzIDogeyBtaW5sZW5ndGg6IDMsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgUXVlc3Rpb24gOlxuICAgIHtcbiAgICAgICAgdGV4dDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgcmFuazogeyByZXF1aXJlZDogdHJ1ZSwgbWluOjEsIGRlZmF1bHRWYWx1ZToxIH1cbiAgICB9LCAgICAgICAgICBcbiAgICBDaG9pY2UgOlxuICAgIHtcbiAgICAgICAgdGV4dDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfVxuICAgIH0sICAgICAgICAgIFxuICAgIG5iUXVlc3Rpb25zTWluOiAxLFxuICAgIG5iUXVlc3Rpb25zTWF4OiAxMCxcbiAgICBuYkNob2ljZXNNYXg6IDEwLFxuICAgIG5iVGFnc01pbjogMCxcbiAgICBuYlRhZ3NNYXg6IDAsIC8vIDAgPSBub3QgbWF4ICAgIFxuICAgIC8vIEpTT04gYW5kIEhUTUwgZGlyXG4gICAgZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXNcIixcbiAgICBkaXJDYWNoZVF1ZXN0aW9ucyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXMvcXVlc3Rpb25zXCIsXG4gICAgZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzIDogXCJkYXRhcy91c2Vycy9xdWVzdGlvbm5haXJlc1wiLFxuICAgIGRpckNhY2hlVGFncyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXMvdGFnc1wiLCAgXG4gICAgZGlySFRNTFF1ZXN0aW9ubmFpcmUgOiBcImZyb250L3B1YmxpYy9xdWl6XCIsXG4gICAgZGlySFRNTFRhZ3MgOiBcImZyb250L3B1YmxpYy9xdWl6c1wiLFxuICAgIGRpcldlYlF1ZXN0aW9ubmFpcmUgOiBcInF1aXpcIiwvL3BvdXIgdXJsIHBhZ2VcbiAgICBkaXJXZWJUYWdzIDogXCJxdWl6c1wiLy8gaWRlbVxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgLy8gQVBJJ3JvdXRlcyAoYWZ0ZXIgXCJhcGlVcmxcIiBkZWZpbmVkIGluIGluc3RhbmNlLmpzKVxuICAgIHVzZXJSb3V0ZXM6IFwiL3VzZXJcIixcbiAgICBzdWJzY3JpYmVSb3V0ZTogXCIvc2lnbnVwXCIsXG4gICAgZ2V0R29kZmF0aGVyUm91dGU6IFwiL2dldGdvZGZhdGhlcmlkXCIsXG4gICAgY2hlY2tJZklzRW1haWxmcmVlUm91dGU6IFwiL2lzZW1haWxmcmVlXCIsXG4gICAgY2hlY2tTdWJzY3JpYmVUb2tlblJvdXRlOiBcIi92YWxpZGF0aW9uL1wiLFxuICAgIGNoZWNrTG9naW5Sb3V0ZTogXCIvY2hlY2tsb2dpbi9cIixcbiAgICBjb25uZWN0aW9uUm91dGU6IFwiL2xvZ2luXCIsXG4gICAgZ2V0TG9naW5MaW5rUm91dGU6IFwiL2dldGxvZ2lubGlua1wiLFxuICAgIGNvbm5lY3Rpb25XaXRoTGlua1JvdXRlOiBcIi9jaGVja2xvZ2lubGlua1wiLFxuICAgIGdldFVzZXJJbmZvczogXCIvZ2V0L1wiLFxuICAgIGNyZWF0ZVVzZXJSb3V0ZTogXCIvY3JlYXRlXCIsXG4gICAgdmFsaWRhdGVVc2VyUm91dGU6IFwiL3ZhbGlkYXRlL1wiLFxuICAgIHVwZGF0ZVVzZXJJbmZvczogXCIvbW9kaWZ5L1wiLFxuICAgIHNlYXJjaFVzZXJSb3V0ZTogXCIvc2VhcmNoL1wiLFxuICAgIGdldEdvZENoaWxkczogXCIvZ2V0Z29kY2hpbGRzL1wiLFxuICAgIGNoZWNrTmV3TG9naW5MaW5rUm91dGU6IFwiL2NvbmZpcm1uZXdsb2dpbi9cIixcbiAgICBjaGVja0RlbGV0ZUxpbmtSb3V0ZTogXCIvY29uZmlybWRlbGV0ZS9cIixcbiAgICBnZXRQYXltZW50czogXCIvcGF5bWVudC9nZXRmb3JvbmV1c2VyL1wiLFxuICAgIHVuc3Vic2NyaWJlUm91dGU6IFwiL3N1YnNjcmlwdGlvbi9zdG9wL1wiLFxuICAgIGdldEFkbWluU3RhdHM6IFwiL2dldGFkbWluc3RhdHMvXCIsXG4gICAgLy8gZm9ybXMgOiDDoCBjb21wbMOpdGVyIGF2ZWMgdmFsZXVycyBwYXIgZMOpZmF1dCwgZXRjLiBjZiBtb2TDqGxlXG4gICAgbmFtZTogeyBtYXhsZW5ndGg6IDcwLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGVtYWlsOiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHBhc3N3b3JkOiB7IG1pbmxlbmd0aDogOCwgbWF4bGVuZ3RoOjcyLCByZXF1aXJlZDogdHJ1ZSB9LCAvLyBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9iY3J5cHQjc2VjdXJpdHktaXNzdWVzLWFuZC1jb25jZXJuc1xuICAgIG5ld1Bhc3N3b3JkOiB7IG1pbmxlbmd0aDogOCwgbWF4bGVuZ3RoOjcyIH0sXG4gICAgY29kZUdvZGZhdGhlcjogeyBtYXhsZW5ndGg6IDI1NSB9LFxuICAgIGNndU9rOiB7IHZhbHVlOiBcInRydWVcIiwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICB0aW1lRGlmZmVyZW5jZU1pbjogLTcyMCxcbiAgICB0aW1lRGlmZmVyZW5jZU1heDo4NDAsXG4gICAgLy8gSlNPTiBkaXJcbiAgICBkaXJDYWNoZVVzZXJzIDogXCJkYXRhcy91c2Vyc1wiLFxuICAgIGRpckNhY2hlVXNlcnNBbnN3ZXJzIDogXCJkYXRhcy91c2Vycy9xdWVzdGlvbm5haXJlcy9hbnN3ZXJzXCJcbn07XG4iLCJ2YXIgbWFwID0ge1xuXHRcIi4vZnIvYW5zd2VyXCI6IFwiLi4vbGFuZy9mci9hbnN3ZXIuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9hbnN3ZXIkXCI7IiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL2dlbmVyYWxcIjogXCIuLi9sYW5nL2ZyL2dlbmVyYWwuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9nZW5lcmFsJFwiOyIsInZhciBtYXAgPSB7XG5cdFwiLi9mci9xdWVzdGlvbm5haXJlXCI6IFwiLi4vbGFuZy9mci9xdWVzdGlvbm5haXJlLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvcXVlc3Rpb25uYWlyZSRcIjsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZnIvdXNlclwiOiBcIi4uL2xhbmcvZnIvdXNlci5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi9sYW5nIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcL3VzZXIkXCI7IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIG5lZWROdW1iZXJVc2VyUmVzcG9uc2VzIDogXCJMZSBub21icmUgZGUgcXVlc3Rpb25zIGF1eHF1ZWxsZXMgbCd1dGlsaXNhdGV1ciBhIHLDqXBvbmR1IGRvaXQgw6p0cmUgZm91cm5pLlwiLFxuICAgIG5lZWRJbnRlZ2VyTnVtYmVyVXNlclJlc3BvbnNlcyA6IFwiTGUgbm9tYnJlIGRlIHF1ZXN0aW9ucyBhdXhxdWVsbGVzIGwndXRpbGlzYXRldXIgYSByw6lwb25kdSBkb2l0IMOqdHJlIHVuIG5vbWJyZSBlbnRpZXIuXCIsXG4gICAgbmVlZE1pbk51bWJlclVzZXJSZXNwb25zZXMgOiBcIkxlIG5vbWJyZSBkZSBxdWVzdGlvbnMgYXV4cXVlbGxlcyBsJ3V0aWxpc2F0ZXVyIGEgcsOpcG9uZHUgbmUgcGV1dCDDqnRyZSBpbmbDqXJpZXVyIMOgIDEuXCIsXG4gICAgbmVlZE1heE51bWJlclVzZXJSZXNwb25zZXMgOiBcIkxlIG5vbWJyZSBkZSBxdWVzdGlvbnMgYXV4cXVlbGxlcyBsJ3V0aWxpc2F0ZXVyIGEgcsOpcG9uZHUgbmUgcGV1dCDDqnRyZSBhdXNzaSDDqWxldsOpLlwiLFxuICAgIG5lZWROdW1iZXJDb3JyZWN0UmVzcG9uc2VzIDogXCJMZSBub21icmUgZGUgcsOpcG9uc2VzIGNvcnJlY3RlcyBkb2l0IMOqdHJlIGZvdXJuaS5cIixcbiAgICBuZWVkSW50ZWdlck51bWJlckNvcnJlY3RSZXNwb25zZXMgOiBcIkxlIG5vbWJyZSBkZSByw6lwb25zZXMgY29ycmVjdGVzIGRvaXQgw6p0cmUgdW4gbm9tYnJlIGVudGllci5cIixcbiAgICBuZWVkTWluTnVtYmVyQ29ycmVjdFJlc3BvbnNlcyA6IFwiTGUgbm9tYnJlIGRlIHLDqXBvbnNlcyBjb3JyZWN0ZXMgbmUgcGV1dCDDqnRyZSBuw6lnYXRpZi5cIixcbiAgICBuZWVkTWF4TnVtYmVyQ29ycmVjdFJlc3BvbnNlcyA6IFwiTGUgbm9tYnJlIGRlIHLDqXBvbnNlcyBjb3JyZWN0ZXMgbmUgcGV1dCDDqnRyZSBzdXDDqXJpZXVyIGF1IG5vbWJyZSBkZSBxdWVzdGlvbnMuXCIsXG4gICAgbmVlZEludGVnZXJOdW1iZXJTZWNvbmRlc1Jlc3BvbnNlIDogXCJMYSBkdXLDqWUgZGUgbGEgcsOpcG9uc2UgZG9pdCDDqnRyZSB1biBub21icmUgZW50aWVyIGRlIHNlY29uZGVzLlwiLFxuICAgIG5lZWRNaW5OdW1iZXJTZWNvbmRlc1Jlc3BvbnNlIDogXCJMYSBkdXLDqWUgZGUgbGEgcsOpcG9uc2UgbmUgcGV1dCDDqnRyZSBuw6lnYXRpdmUuXCIsXG4gICAgY2hlY2tSZXNwb25zZXNPdXB1dEZhaWwgOiBcIlZvdXMgYXZleiByw6lwb25kdSBlbiBEVVJBVElPTiBzZWNvbmRlcyBldCBhdmV6IE5CQ09SUkVDVEFOU1dFUlMgYm9ubmUocykgcsOpcG9uc2Uocykgc3VyIE5CUVVFU1RJT05TLiBDJ2VzdCBjZXJ0YWluLCB2b3VzIGZlcmV6IG1pZXV4IGxhIHByb2NoYWluZSBmb2lzICFcIixcbiAgICBjaGVja1Jlc3BvbnNlc091cHV0TWVkaXVtIDogXCJWb3VzIGF2ZXogcsOpcG9uZHUgZW4gRFVSQVRJT04gc2Vjb25kZXMgZXQgYXZleiBOQkNPUlJFQ1RBTlNXRVJTIGJvbm5lKHMpIHLDqXBvbnNlKHMpIHN1ciBOQlFVRVNUSU9OUy4gQydlc3QgcGFzIG1hbCBkdSB0b3V0ICFcIixcbiAgICBjaGVja1Jlc3BvbnNlc091cHV0U3VjY2VzcyA6IFwiVm91cyBhdmV6IHLDqXBvbmR1IGVuIERVUkFUSU9OIHNlY29uZGVzIGV0IGF2ZXogTkJDT1JSRUNUQU5TV0VSUyBib25uZShzKSByw6lwb25zZShzKSBzdXIgTkJRVUVTVElPTlMuIEJyYXZvICEgUmllbiBuZSB2b3VzIMOpY2hhcHBlICFcIixcbiAgICB3YW50VG9TYXZlUmVzcG9uc2VzOiBcIlNpIHZvdXMgbGUgc291aGFpdGV6LCB2b3VzIHBvdXZleiBzYXV2ZWdhcmRlciB2b3RyZSByw6lzdWx0YXQgZW4gY3LDqWFudCB2b3RyZSBjb21wdGUuXFxuQ2VsYSB2b3VzIHBlcm1ldHRyYSBkZSB0ZXN0ZXIgZGUgbm91dmVhdSBjZSBxdWl6IGRhbnMgbCdhdmVuaXIgcG91ciB2b2lyIHNpIHZvdXMgYXZleiBtw6ltb3Jpc2VyIGxlcyBib25uZXMgcsOpcG9uc2VzLiBWb3VzIHBvdXJyZXogYWluc2kgYXVzc2kgcmVjZXZvaXIgcsOpZ3VsacOocmVtZW50IGRlIG5vdXZlYXV4IHF1aXpzLlwiLFxuICAgIHJlc3BvbnNlU2F2ZWRNZXNzYWdlIDogXCJWb3RyZSByw6lzdWx0YXQgYSDDqXTDqSBlbnJlZ2lzdHLDqS4gPGEgaHJlZj0nLyNVUkwnPkFjY8OoZGVyIMOgIHRvdXMgdm9zIHF1aXpzPC9hPi5cIixcbiAgICByZXNwb25zZVNhdmVkRXJyb3IgOiBcIkNlcGVuZGFudCB1bmUgZXJyZXVyIGEgw6l0w6kgcmVuY29udHLDqWUgZHVyYW50IGwnZW5yZWdpc3RyZW1lbnQgZGUgdm90cmUgcsOpc3VsdGF0LiA8YSBocmVmPScvI1VSTCc+QWNjw6hkZXIgw6AgdG91cyB2b3MgcXVpenM8L2E+LlwiLFxuICAgIG5vUXVlc3Rpb25uYWlyZVdpdGhvdWRBbnN3ZXI6IFwiQnJhdm8gISBWb3VzIGF2ZXogcsOpcG9uZHUgw6AgdG91cyBsZXMgcXVpenMgcXVpIHZvdXMgb24gw6l0w6kgcHJvcG9zw6lzICE8YnI+SWwgeSBlbiBhIGRlcyBub3V2ZWF1eCBwdWJsacOpcyByw6lndWxpw6hyZW1lbnQgZXQgcXVpIHZvdXMgc2Vyb250IHByb3Bvc8Opcy48YnI+RW4gYXR0ZW5kYW50IHZvdXMgcG91dmV6IHBldXQtw6p0cmUgZXNzYXllciBkZSByw6lwb25kcmUgZGUgbm91dmVhdSDDoCBjZXJ0YWluIHF1aXogcG91ciB2b2lyIHNpIHZvdXMgdm91cyBzb3V2ZW5leiBkZXMgYm9ubmVzIHLDqXBvbnNlcyA/XCIsXG4gICAgbmJRdWVzdGlvbm5haXJlV2l0aG91ZEFuc3dlcjogXCJJbCB5IGEgI05CIHF1aXpzIHF1aSB2b3VzIG9udCDDqXTDqSBwcm9wb3PDqXMgZXQgYXV4cXVlbHMgdm91cyBuJ2F2ZXogcGFzIHLDqXBvbmR1LiBWb2ljaSBsZXMgZGVybmllcnMgOiFcIixcbiAgICBzdGF0c1VzZXI6IFwiVm91cyBhdmV6IGVucmVnaXN0csOpIE5CQU5TV0VSUyByw6lwb25zZXMgw6AgPGI+TkJRVUVTVElPTk5BSVJFUyBxdWVzdGlvbm5haXJlcyBkaWZmw6lyZW50czwvYj4gc3VyIGxlcyBOQlRPVFFVRVNUSU9OTkFJUkVTIHByb3Bvc8OpcyBwYXIgbGUgc2l0ZS48YnI+RW4gbW95ZW5uZSwgdm91cyBhdmV6IG1pcyBBVkdEVVJBVElPTiBzZWNvbmRlcyDDoCByw6lwb25kcmUgZXQgYXZleiA8Yj5jb3JyZWN0ZW1lbnQgcsOpcG9uZHUgw6AgQVZHQ09SUkVDVEFOU1dFUlMgJSBkZXMgcXVlc3Rpb25zPC9iPi5cIixcbiAgICBwcmV2aW91c0Fuc3dlcnNUaXRsZTogXCJCb25qb3VyICNOT00sIHZvaWNpIHZvcyBwcsOpY8OpZGVudHMgcsOpc3VsdGF0cyDDoCBjZSBxdWl6XCIsXG4gICAgcHJldmlvdXNBbnN3ZXJzU3RhdHM6IFwiRW4gbW95ZW5uZSwgdm91cyBhdmV6IHLDqXBvbmR1IMOgIGNlIHF1aXogZW4gQVZHRFVSQVRJT04gc2Vjb25kZXMsIGVuIGF5YW50IDxiPkFWR0NPUlJFQ1RBTlNXRVJTICUgZGUgYm9ubmVzIHLDqXBvbnNlczwvYj4uXCIsXG4gICAgcHJldmlvdXNBbnN3ZXJzTGluZTogXCJMZSBEQVRFQU5TV0VSLCB2b3VzIGF2ZXogcsOpcG9uZHUgY29ycmVjdGVtZW50IMOgIE5CQ09SUkVDVEFOU1dFUlMgcXVlc3Rpb25zIGVuIEFWR0RVUkFUSU9OIHNlY29uZGVzLlwiLFxuICAgIG5vUHJldmlvdXNBbnN3ZXI6IFwiQm9uam91ciAjTk9NLCBjJ2VzdCBsYSBwcmVtacOocmUgZm9pcyBxdWUgdm91cyByw6lwb25kZXogw6AgY2UgcXVpei4gQm9ubmUgbGVjdHVyZSAhXCJcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgc2l0ZUhUTUxUaXRsZSA6IFwiV2lraUxlcm5pIDogcXUnYWxsZXotdm91cyBhcHByZW5kcmUgYXVqb3VyZCdodWkgP1wiLFxuICAgIHNpdGVNZXRhRGVzY3JpcHRpb24gOiBcIkNoYXF1ZSBqb3VyLCB0ZXN0ZXogdm9zIGNvbm5haXNzYW5jZXMgZXQgYXBwcmVuZXogZGUgbm91dmVsbGVzIGNob3NlcyBhdmVjIFdpa2lMZXJuaS5cIixcbiAgICBzY3JpcHRUaW1pbmdJbmZvIDogXCJEdXLDqWUgZGUgbGEgcsOpcG9uc2UgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNjcmlwdFRpbWluZ0FsZXJ0IDogXCIqKiogU2NyaXB0IGxlbnQgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNlcnZlckVycm9yIDogXCJEw6lzb2zDqS4gVW5lIGVycmV1ciBpbXByw6l2dWUgZXN0IHN1cnZlbnVlLiBTaSBjZWxhIHBlcnNpc3RlLCBuJ2jDqXNpdGV6IMOgIHByw6l2ZW5pciBsJ2FkbWluaXN0cmF0ZXVyIGR1IHNpdGUuXCIsXG4gICAgc2VydmVyRXJyb3JBZG1pbiA6IFwiQnVnIGRlIGwnYXBwbGljYXRpb24gOlwiLFxuICAgIG5lZWRlZFBhcmFtcyA6IFwiRGVzIHBhcmFtw6h0cmVzIG7DqWNlc3NhaXJlcyBtYW5xdWFudHMgc29udCBtYW5xdWFudHMuXCIsXG4gICAgYmFkVXJsIDogXCJUZW50YXRpdmUgZCdhY2PDqHMgw6AgdW5lIHBhZ2UgbidleGlzdGFudCBwYXMgOlwiLFxuICAgIG5vdFZhbGlkRm9ybWF0IDogXCJGb3JtYXQgbm9uIHZhbGlkZS5cIixcbiAgICBub3RBbGxvd2VkIDogXCJWb3VzIG4nYXZleiBwYXMgbGVzIGRyb2l0cyBuw6ljZXNzYWlyZXMgcG91ciBjZXR0ZSBhY3Rpb24uXCIsXG4gICAgbm90UmVxdWlyZWQgOiBcIkZhY3VsdGF0aWYuXCIsXG4gICAgdXBkYXRlQnRuVHh0OiBcIk1vZGlmaWVyXCIsXG4gICAgYWRkQnRuVHh0OiBcIkFqb3V0ZXJcIixcbiAgICBkZWxldGVCdG5UeHQ6IFwiU3VwcHJpbWVyXCIsXG4gICAgYWRkT2tNZXNzYWdlIDogXCJMZXMgZG9ubsOpZXMgb250IGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llcy5cIixcbiAgICB1cGRhdGVPa01lc3NhZ2UgOiBcIkxhIG1pc2Ugw6Agam91ciDDoCBqb3VyIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgZGVsZXRlT2tNZXNzYWdlIDogXCJMYSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIGZhaWxBdXRoIDogXCJFcnJldXIgZCdhdXRoZW50aWZpY2F0aW9uLlwiLFxuICAgIGZhaWxBdXRoSGVhZGVyIDogXCJBYnNlbmNlIGRlIGhlYWRlciBBdXRob3JpemF0aW9uLlwiLFxuICAgIGZhaWxBdXRoVG9rZW4gOiBcIlRva2VuIGludmFsaWRlIG91IHV0aWxpc2F0ZXVyIG5vbiB0cm91dsOpLlwiLFxuICAgIGZhaWxBdXRoSWQgOiBcIklkZW50aWZpYW50IG5vbiB2YWxpZGUgOiBcIixcbiAgICBmYWlsQXV0aENyb24gOiBcIlRlbnRhdGl2ZSBkZSBsYW5jZW1lbnQgZCd1biBjcm9uIHNhbnMgbGUgYm9uIHRva2VuLlwiLFxuICAgIHByZXZpb3VzUGFnZSA6IFwiUGFnZSBwcsOpY8OpZGVudGVcIixcbiAgICBuZXh0UGFnZSA6IFwiUGFnZSBzdWl2YW50ZVwiLFxuICAgIGJ0bkxpbmtUb1F1ZXN0aW9ubmFpcmUgOiBcIkFsbGVyIGF1IHF1aXogIVwiLFxuICAgIHN0YXRzQWRtaW4gOiBcIkR1cmFudCBsZXMgZGVybmnDqHJlcyAyNGggOiBOQl9VU0VSU18yNEggY29tcHRlcyBvbnQgw6l0w6kgY3LDqcOpcywgTkJfU1VCU0NSSVBUSU9OU18yNEggdmFsaWTDqXMgZXQgTkJfVVNFUlNfREVMRVRFRF8yNEggc3VwcHJpbcOpcy4gTkJfQU5TV0VSU18yNEggcsOpcG9uc2VzIGF1eCBxdWl6cyBvbnQgw6l0w6kgZW5yZWdpc3Ryw6llcy48YnI+RW4gdG91dCwgaWwgeSBhIDogTkJfVVNFUlNfVE9UIGNvbXB0ZXMsIGRvbnQgTkJfU1VCU0NSSVBUSU9OU19UT1QgdmFsaWTDqXMgZXQgTkJfU1VCU0NSSVBUSU9OU19QUkVNSVVNIGNvbXB0ZXMgcHLDqW1pdW0uIE5CX0FOU1dFUlNfVE9UIHLDqXBvbnNlcyBhdXggcXVpenMgb250IMOpdMOpIGVucmVnaXN0csOpZXMuPGJyPlBhcm1pIGxlcyBOQl9VU0VSU19ERUxFVEVEX1RPVCBjb21wdGVzIHN1cHByaW3DqXMsIE5CX1VTRVJTX0RFTEVURURfVkFMSURFRCBhdmFpZW50IHZhbGlkw6kgbGV1ciBjb21wdGUgZXQgTkJfVVNFUlNfREVMRVRFRF9QUkVNSVVNIGF2YWllbnQgc291c2NyaXQgdW4gY29tcHRlIHByw6ltaXVtLlwiXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBuZWVkVGl0bGU6IFwiTWVyY2kgZGUgZm91cm5pciB1biB0aXRyZSDDoCB2b3RyZSBxdWl6LlwiLFxuICAgIG5lZWROb3RUb29Mb25nVGl0bGU6IFwiTGUgdGl0cmUgZHUgcXVpeiBuZSBkb2l0IHBhcyBjb21wdGVyIHBsdXMgZGUgMjU1IGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRVcmw6IFwiTWVyY2kgZGUgZm91cm5pciBsJ3VybCDDoCB2b3RyZSBxdWl6LlwiLFxuICAgIG5lZWRVbmlxdWVVcmw6IFwiTCd1cmwgZHUgcXVpeiBkb2l0IMOqdHJlIHVuaXF1ZS5cIixcbiAgICBuZWVkSW50cm9kdWN0aW9uOiBcIk1lcmNpIGRlIGZvdXJuaXIgdW4gdGV4dGUgZCdpbnRyb2R1Y3Rpb24gw6Agdm90cmUgcXVpei5cIixcbiAgICBuZWVkQ29ycmVjdFB1Ymxpc2hpbmdEYXRlOiBcIkxhIGRhdGUgZGUgcHVibGljYXRpb24gZm91cm5pZSBuJ2EgcGFzIHVuIGZvcm1hdCB2YWxpZGUuXCIsXG4gICAgbmVlZEtub3dJZklzUHVibGlzaGVkOiBcIklsIGZhdXQgc2F2b2lyIHNpIGNlIHF1aXogZXN0IHB1Ymxpw6kuXCIsXG4gICAgbmVlZExhbmd1YWdlOiBcIlZvdXMgZGV2ZXogc8OpbGVjdGlvbm5lciBsYSBsYW5ndWUgZGUgY2UgcXVpei5cIixcbiAgICBuZWVkRXN0aW1hdGVkVGltZTogXCJNZXJjaSBkZSBzw6lsZWN0aW9ubmVyIHVuZSBlc3RpbWF0aW9uIGRlIGxhIGR1csOpZSBkZSBjZSBxdWl6LlwiLFxuICAgIG5vdEZvdW5kIDogXCJBdWN1biBxdWl6IG4nYSBwYXMgw6l0w6kgdHJvdXbDqS5cIixcbiAgICBzZWFyY2hSZXN1bHRUaXRsZSA6IFwiUsOpc3VsdGF0IHBvdXIgdm90cmUgcmVjaGVyY2hlXCIsXG4gICAgc2VhcmNoTm9SZXN1bHQgOiBcIkF1Y3VuIHLDqXN1bHRhdCBuJ2Egw6l0w6kgdHJvdXbDqSBwb3VyIHZvdHJlIHJlY2hlcmNoZVwiLFxuICAgIHNlYXJjaFdpdGhSZXN1bHQgOiBcIiNOQiBxdWl6cyBjb3JyZXNwb25kZW50IMOgIHZvdHJlIHJlY2hlcmNoZSA6XCIsXG4gICAgcHVibGlzaGVkQnk6IFwiUHVibGnDqSBwYXJcIixcbiAgICBwdWJsaXNoZWRBdDogXCIsIGxlXCIsXG4gICAgbGFzdFVwZGF0ZWQ6IFwiRGVybmnDqHJlIG1pc2Ugw6Agam91ciwgbGUgXCIsXG4gICAgZXN0aW1hdGVkVGltZTogXCJEdXLDqWUgZGUgbGVjdHVyZSBlc3RpbcOpZSA6IFwiLFxuICAgIGJ0blNlbmRSZXNwb25zZTogXCJFbnZveWV6IHZvcyByw6lwb25zZXNcIixcbiAgICBidG5Qcm9wb3NlU3Vic2NyaWJlOiBcIk9rLCBqZSBjcsOpZSBtb24gY29tcHRlICFcIixcbiAgICBidG5Qcm9wb3NlQ29ubmVjdGlvbjogXCJKJ2FpIGTDqWrDoCB1biBjb21wdGUsIGplIG1lIGNvbm5lY3RlLlwiLFxuICAgIGJ0blNob3dRdWVzdGlvbm5haXJlOiBcIkFmZmljaGVyIGxlIHF1aXogIVwiLFxuICAgIG5leHRRdWVzdGlvbm5haXJlc0xpc3Q6IFwiTGVzICNOQiBwcm9jaGFpbnMgcXVpenMgZGV2YW50IMOqdHJlIHB1Ymxpw6lzXCIsXG4gICAgbmVlZEJlQ29tcGxldGVkOiBcIlF1aXogaW5jb21wbGV0XCIsXG4gICAgbmV4dERhdGVXaXRob3V0UXVlc3Rpb25uYWlyZTogXCJQcm9jaGFpbmUgZGF0ZSBzYW5zIHF1aXogcHJvZ3JhbW3DqSA6IFwiLFxuICAgIGhhdmVCZWVuUHVibGlzaGVkIDogXCI6TkIgbm91dmVhdXggcXVlc3Rpb25uYWlyZXMgb250IMOpdMOpIHB1Ymxpw6lzLlwiXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBub3RGb3VuZDogXCJMJ3V0aWxpc2F0ZXVyIG4nYSBwYXMgw6l0w6kgdHJvdXbDqS5cIixcbiAgICBuZWVkTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyLlwiLFxuICAgIG5lZWROb3RUb29Mb25nTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyIG5lIGNvbXB0YW50IHBhcyBwbHVzIGRlIDcwIGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRFbWFpbDogXCJNZXJjaSBkZSBzYWlzaXIgdm90cmUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgbmVlZFVuaXF1ZUVtYWlsOiBcIkwnYWRyZXNzZSBlLW1haWwgcXVlIHZvdXMgYXZleiBzYWlzaWUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcGFyIHVuIGF1dHJlIHV0aWxpc2F0ZXVyLiBTaSB2b3VzIGF2ZXogZMOpasOgIHVuIGNvbXB0ZSwgPGEgaHJlZj0nLyNVUkwnPmNsaXF1ZXotaWNpIHBvdXIgdm91cyBjb25uZWN0ZXI8L2E+LlwiLFxuICAgIG5lZWROb3RUb29Mb25nRW1haWw6IFwiTWVyY2kgZGUgc2Fpc2lyIHVuZSBhZHJlc3NlIGUtbWFpbCBuZSBjb21wdGFudCBwYXMgcGx1cyBkZSAyNTUgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZFBhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZS5cIixcbiAgICBuZWVkTG9uZ1Bhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZSBkJ2F1IG1vaW5zIE1JTl9MRU5HVEggY2FyYWN0w6hyZXMuXCIsXG4gICAgcGFzc3dvcmRDb3BpZWQ6IFwiTGUgbW90IGRlIHBhc3NlIGfDqW7DqXLDqSBhIMOpdMOpIGNvcGnDqSBkYW5zIGxlIHByZXNzZS1wYXBpZXIuIFZvdXMgcG91dmV6IGxlIHJlY29waWVyIG/DuSB2b3VzIGxlIHNvdWhhaXRlci5cIixcbiAgICBuZWVkU3RhdHVzIDogXCJJbCBtYW5xdWUgbGUgc3RhdHV0LlwiLFxuICAgIG5lZWRMYW5ndWFnZSA6IFwiSWwgbWFucXVlIGxlIGNvZGUgbGFuZ3VlLlwiLFxuICAgIG5lZWRWYWxpZExhc3RDb25uZWN0aW9uRGF0ZSA6IFwiTGEgZGF0ZSBkZSBkZXJuacOocmUgY29ubmV4aW9uIG4nZXN0IHBhcyB2YWxpZGUuXCIsXG4gICAgbmVlZFNNVFAgOiBcIklsIG1hbnF1ZSBsZSBzZXJ2ZXVyIFNNVFAuXCIsXG4gICAgbmVlZFNNVFBOb3RGb3VuZCA6IFwiSWwgbWFucXVlIGxlIHNlcnZldXIgU01UUC5cIixcbiAgICBuZWVkS25vd05ld3NsZXR0ZXJPayA6IFwiSWwgZmF1dCBzYXZvaXIgc2kgbCd1dGlsaXNhdGV1ciBhY2NlcHRlIG91IHJlZnVzZSBkZSByZWNldm9pciBsYSBuZXdzbGV0dGVyLlwiLFxuICAgIG5lZWRUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBjb25uYcOudHJlIGxlIG5vbWJyZSBkZSBtaW51dGVzIGR1IGTDqWNhbGFnZSBob3JhaXJlLlwiLFxuICAgIG5lZWRNaW5UaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGVubGV2ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgNzIwLlwiLFxuICAgIG5lZWRNYXhUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGFqb3V0ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgODQwLlwiLFxuICAgIG5lZWRVR0NPayA6IFwiVm91cyBkZXZleiBhY2NlcHRlciBsZXMgQ0dVIHBvdXIgcG91dm9pciBjcsOpZXIgdm90cmUgY29tcHRlLiBcIixcbiAgICBnb2RmYXRoZXJOb3RGb3VuZDogXCJBdWN1biB1dGlsaXNhdGV1ciB2YWxpZGUgdHJvdXbDqSBwb3VyIGNlIGNvZGUgcGFycmFpbi5cIixcbiAgICBnb2RmYXRoZXJGb3VuZDogXCJWb3RyZSBwYXJyYWluIGEgYmllbiDDqXTDqSB0cm91dsOpICFcIixcbiAgICBtYWlsVmFsaWRhdGlvbk1lc3NhZ2U6IFwiVm90cmUgaW5zY3JpcHRpb24gZXN0IGJpZW4gZW5yZWdpc3Ryw6llLlxcblBvdXIgbGEgZmluYWxpc2VyLCBtZXJjaSBkZSBjbGlxdWVyIGRhbnMgbGVzIDI0SCBzdXIgbGUgbGllbiBkZSBjb25maXJtYXRpb24gcXVpIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBwYXIgZS1tYWlsLlwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1N1YmplY3QgOiBcIk1lcmNpIGRlIHZhbGlkZXIgdm90cmUgY29tcHRlXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblBvdXIgdmFsaWRlciB2b3RyZSBjb21wdGUsIG1lcmNpIGRlIGNsaXF1ZXIgc3VyIGxlIGxpZW4gc3VpdmFudCBkYW5zIGxlcyAyNGggOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm90cmUgY29tcHRlLCBtZXJjaSBkZSBjbGlxdWVyIHN1ciBsZSBsaWVuIHN1aXZhbnQgZGFucyBsZXMgMjRoLjwvcD48cD48YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+VmFsaWRlci48L2E+PC9wPlwiLFxuICAgIHZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGNvbXB0ZSB2aWVudCBiaWVuIGQnw6p0cmUgdmFsaWTDqS4gTWVyY2kgZXQgYmllbnZlbnVlICE8YnI+Vm91cyBwb3V2ZXogc2FucyB0YXJkZXIgdm91cyBjb25uZWN0ZXIgY2ktZGVzc291cyBwb3VyIGFjY8OpZGVyIMOgIHZvdHJlIGNvbXB0ZS5cIixcbiAgICB2YWxpZGF0aW9uTWVzc2FnZUFkbWluOiBcIkxlIGNvbXB0ZSBhIGJpZW4gw6l0w6kgdmFsaWTDqS5cIixcbiAgICB2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2U6IFwiSWwgc2VtYmxlIHF1ZSB2b3VzIGF5ZXogZMOpasOgIHZhbGlkw6kgdm90cmUgY29tcHRlLlwiLFxuICAgIHZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZUFkbWluOiBcIkNlIGNvbXB0ZSBhIGTDqWrDoCDDqXTDqSB2YWxpZMOpLlwiLFxuICAgIG1haWxXZWxjb21lU3ViamVjdCA6IFwiQmllbnZlbnVlICFcIixcbiAgICBtYWlsV2VsY29tZUJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblZvdHJlIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuXFxuTWVyY2kgZXQgw6AgYmllbnTDtHQgIVwiLFxuICAgIG1haWxXZWxjb21lQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlZvdHJlIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuPC9wPjxwPk1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyU3ViamVjdCA6IFwiTWVyY2kgIVwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlckJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcbkdyw6JjZSDDoCB2b3VzIHVuIG5vdXZlbCB1dGlsaXNhdGV1ciAoRU1BSUwpIHZpZW50IGRlIHMnaW5zY3JpcmUgc3VyIE5PTV9TSVRFLlxcbk1lcmNpIGV0IMOgIGJpZW50w7R0ICFcIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+R3LDomNlIMOgIHZvdXMgdW4gbm91dmVsIHV0aWxpc2F0ZXVyIChFTUFJTCkgdmllbnQgZGUgcydpbnNjcmlyZSBzdXIgTk9NX1NJVEUuPC9wPjxwPk1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGxpZW4gZGUgY29uZmlybWF0aW9uIG5lIHNlbWJsZSBwYXMgdmFsaWRlIG91IGJpZW4gaWwgYSBleHBpcsOpLiBWb3VzIHBvdXZleiBlbiByZWNldm9pciB1biBub3V2ZWF1IDxhIGhyZWY9JyNVUkwnPmVuIGNsaXF1YW50IGljaTwvYT4uXCIsXG4gICAgZW1haWxOb3RGb3VuZDogXCJBdWN1biB1dGlsaXNhdGV1ciB0cm91dsOpIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgYWxyZWFkeUNvbm5lY3RlZDogXCJWb3VzIMOqdGVzIGTDqWrDoCBjb25uZWN0w6koZSkgYXUgc2l0ZSAhXCIsXG4gICAgbmVlZEJlQ29ubmVjdGVkOiBcIlZvdXMgZGV2ZXogw6p0cmUgY29ubmVjdMOpKGUpIHBvdXIgYWNjw6lkZXIgw6AgY2V0dGUgcGFnZS5cIixcbiAgICBjb25uZWN0aW9uT2s6IFwiQ29ubmV4aW9uIHLDqXVzc2llLlwiLFxuICAgIG5lZWRDaG9vc2VMb2dpbldheTogXCJWb3VzIGRldmV6IHNvaXQgc2Fpc2lyIHZvdHJlIG1vdCBkZSBwYXNzZSwgc29pdCBjb2NoZXIgbGEgY2FzZSB2b3VzIHBlcm1ldHRhbnQgZGUgcmVjZXZvaXIgdW4gbGllbiBkZSBjb25uZXhpb24gcGFyIGUtbWFpbC5cIixcbiAgICBuZWVkVmFsaWRhdGlvblRvTG9naW4gOiBcIlZvdXMgZGV2ZXogZCdhYm9yZCB2YWxpZGVyIHZvdHJlIGNvbXB0ZSBhdmFudCBkZSB2b3VzIGNvbm5lY3Rlci4gUG91ciBjZSBmYWlyZSwgdW4gbGllbiB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbC5cIixcbiAgICB0b29NYW55TG9naW5GYWlscyA6IFwiVHJvcCBkZSB0ZW50YXRpdmVzIGRlIGNvbm5leGlvbiBpbmZydWN0dWV1c2VzIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuIFZvdXMgZGV2ZXogYXR0ZW5kcmUgTUlOVVRFUyBtaW51dGVzIHBvdXIgZXNzYXllciBkZSBub3V2ZWF1LlwiLFxuICAgIGJhZFBhc3N3b3JkOiBcIkxlIG1vdCBkZSBwYXNzZSBuJ2VzdCBwYXMgbGUgYm9uLlwiLFxuICAgIG1haWxMb2dpbkxpbmtTdWJqZWN0IDogXCJWb3RyZSBsaWVuIGRlIGNvbm5leGlvbi5cIixcbiAgICBtYWlsTG9naW5MaW5rQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuUG91ciB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6IExJTktfVVJMXCIsXG4gICAgbWFpbExvZ2luTGlua0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZvdXMgY29ubmVjdGVyIMOgIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDo8L3A+PHA+PGEgaHJlZj1cXFwiTElOS19VUkxcXFwiPlZhbGlkZXIuPC9hPjwvcD5cIixcbiAgICBtYWlsTG9naW5MaW5rTWVzc2FnZSA6IFwiVW4gbGllbiBkZSBjb25uZXhpb24gdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHN1ciB2b3RyZSBhZHJlc3NlIGUtbWFpbC4gTmUgdGFyZGV6IHBhcyDDoCBsJ3V0aWxpc2VyLCBjYXIgaWwgbidlc3QgdmFsYWJsZSBxdWUgZHVyYW50IFwiLFxuICAgIHVwZGF0ZWRPa01lc3NhZ2U6IFwiVm9zIGluZm9ybWF0aW9ucyBvbnQgYmllbiDDqXTDqSBtaXNlcyDDoCBqb3VyLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEVtYWlsIDogXCJNYWlzIGxhIG5vdXZlbGxlIGFkcmVzc2UgZS1tYWlsIG4nYSBwdSDDqnRyZSBlbnJlZ2lzdHLDqWUgY2FyIGVsbGUgbidhIHBhcyB1bmUgZm9ybWF0IGNvcnJlY3QuXCIsXG4gICAgdXBkYXRlZE5lZWRVbmlxdWVFbWFpbCA6IFwiTWFpcyBsYSBub3V2ZWxsZSBhZHJlc3NlIGUtbWFpbCBzYWlzaWUgKE5FV19FTUFJTCkgbidhIHB1IMOqdHJlIGVucmVnaXN0csOpZSwgY2FyIGVsbGUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcG91ciB1biBhdXRyZSBjb21wdGUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luU3ViamVjdCA6IFwiTWVyY2kgZGUgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblBvdXIgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cyBkZSBjb25uZXhpb24sIDxhIGhyZWY9XFxcIkxJTktfVVJMXFxcIj5jbGlxdWV6IGljaTwvYT4gc2FucyB0YXJkZXIuPC9wPlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkxpbmtNZXNzYWdlOiBcIkNlcGVuZGFudCwgdm91cyBhdmV6IG1vZGlmacOpIGF1IG1vaW5zIHVuIGRlIHZvcyBpZGVudGlmaWFudHMgZGUgY29ubmV4aW9uIChlbWFpbCBldC9vdSBtb3QgZGUgcGFzc2UpIGV0IDxiPnZvdXMgZGV2ZXogY2xpcXVlciBzdXIgbGUgbGllbiBxdWkgdmllbnQgZGUgdm91cyDDqnRyZXMgZW52b3nDqSBzdXIgdm90cmUgYWRyZXNzZSAoTkVXX0VNQUlMKSBwb3VyIHZhbGlkZXIgY2UgY2hhbmdlbWVudDwvYj4uIEVuIGF0dGVuZGFudCwgbWVyY2kgZGUgY29udGludWVyIMOgIHV0aWxpc2VyIHZvcyBhbmNpZW5zIGlkZW50aWZpYW50cy5cIixcbiAgICB1cGRhdGVkTmVlZFZhbGlkYXRlZFVzZXI6IFwiTCd1dGlsaXNhdGV1ciBxdWUgdm91cyBzb3VoYWl0w6kgbW9kaWZpZXIgbidleGlzdGUgcGFzL3BsdXMgb3UgbidhIHBhcyBlbmNvcmUgdmFsaWTDqSBzb24gY29tcHRlLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEdvZGZhdGhlciA6IFwiTWFpcyBsZSBub3V2ZWF1IGNvZGUgcGFycmFpbiBuJ2EgcHUgw6p0cmUgcmV0ZW51LCBjYXIgaWwgbmUgY29ycmVzcG9uZCDDoCBhdWN1biBjb21wdGUgdXRpbGlzYXRldXIgb3Ugw6AgbCd1dGlsaXNhdGV1ciBsdWktbcOqbWUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luT2tNZXNzYWdlOiBcIkxhIG1pc2Ugw6Agam91ciBkZSB2b3MgaWRlbnRpZmlhbnRzIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgdXBkYXRlZEZhaWxlZEdvZGZhdGhlck5vdEZvdW5kIDogXCJMJ2lkZW50aWZpYW50IGZvdXJuaSBwb3VyIGxlIHBhcnJhaW4gbmUgY29ycmVzcG9uZCDDoCBhdWN1biB1dGlsaXNhdGV1ci5cIixcbiAgICBjcmVhdGlvbk9rTWVzc2FnZTogXCJMZSBub3V2ZWwgdXRpbGlzYXRldXIgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpLlwiLFxuICAgIG1haWxEZWxldGVTdWJqZWN0IDogXCJDb25maXJtZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLlwiLFxuICAgIG1haWxEZWxldGVCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5Qb3VyIHZhbGlkZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbERlbGV0ZUJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCA8YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+Y2xpcXVleiBpY2k8L2E+IHNhbnMgdGFyZGVyLjwvcD5cIixcbiAgICBtYWlsRGVsZXRlTGlua01lc3NhZ2U6IFwiVm90cmUgZGVtYW5kZSBkZSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLiBNZXJjaSBkZSBjbGlxdWVyIHNhbnMgdGFyZGVyIHN1ciBsZSBsaWVuIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbCBwb3VyIGNvbmZpcm1lci5cIixcbiAgICBkZWxldGVPa01lc3NhZ2U6IFwiTCd1dGlsaXNhdGV1ciBhIGJpZW4gw6l0w6kgc3VwcHJpbcOpLlwiLFxuICAgIGRlbGV0ZUZhaWxNZXNzYWdlOiBcIlRlbnRhdGl2ZSBkZSBzdXBwcmVzc2lvbiBkJ3VuIHV0aWxpc2F0ZXVyIGluZXhpc3RhbnQgOiBcIixcbiAgICBtYWlsRGVsZXRlTGlua09rTWVzc2FnZTogXCJWb3RyZSBjb21wdGUgYSBiaWVuIMOpdMOpIHN1cHByaW3DqS4gTWVyY2kgZCdhdm9pciB1dGlsaXPDqSBub3Mgc2VydmljZXMuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtBbHJlYWR5TWVzc2FnZTogXCJJbCBzZW1ibGUgcXVlIHZvdXMgYXlleiBkw6lqw6AgdmFsaWTDqSBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtGYWlsTWVzc2FnZTogXCJWb3RyZSBsaWVuIGRlIHN1cHByZXNzaW9uIG4nZXN0IHBhcyB2YWxpZGUgb3UgYWxvcnMgaWwgbidlc3QgcGx1cyB2YWxhYmxlLlwiLFxuICAgIGNyb25EZWxldGVVbnZhbGlkZWRVc2Vyc01lc3NhZ2U6IFwiIGNvbXB0ZXMgdXRpbGlzYXRldXJzIG5vbiB2YWxpZMOpcyBvbnQgw6l0w6kgc3VwcHJpbcOpcy5cIixcbiAgICBkZWxldGVJbmFjdGl2ZVVzZXJzTWVzc2FnZTogXCIgY29tcHRlcyB1dGlsaXNhdGV1cnMgaW5hY3RpZnMgb250IMOpdMOpIHN1cHByaW3DqXMuXCIsXG4gICAgd2VsY29tZU1lc3NhZ2U6IFwiQmllbnZlbnVlICNOQU1FICFcIixcbiAgICBieWVieWVNZXNzYWdlOiBcIlNpIHZvdXMgdm95ZXogY2UgbWVzc2FnZSwgYydlc3QgcXVlIHZvdHJlIGTDqWNvbm5leGlvbiBzJ2VzdCBiaWVuIGTDqXJvdWzDqWUuPGJyPsOAIGJpZW50w7R0ICFcIixcbiAgICBpbmZvc1VzZXJGb3JBZG1pbjogXCJDZXQgdXRpbGlzYXRldXIgKGlkOiBJRF9VU0VSKSBhIDxiPmNyw6nDqSBzb24gY29tcHRlIGxlIERBVEVfQ1JFQTwvYj4sIGxhIGRlcm5pw6hyZSBtaXNlIMOgIGpvdXIgZGF0YW50IGR1IERBVEVfVVBEQVRFLjxicj48Yj5EYXRlIGRlIHNhIGRlcm5pw6hyZSBjb25uZXhpb24gOiBEQVRFX0NPTk5FQ1RJT04uPC9iPlwiLFxuICAgIGluZm9zQWRtaW5Hb2RmYXRoZXI6IFwiQ2V0IHV0aWxpc2F0ZXVyIGEgw6l0w6kgcGFycmFpbsOpIHBhciBcIixcbiAgICBpbmZvc0FkbWluTmJHb2RDaGlsZHM6IFwiU2VzICNOQiBmaWxsZXVpbHMgOiBcIlxufTsiLCIvLyBRdWVscXVlcyBmb25jdGlvbnMgdXRpbGVzIHBvdXIgbGVzIGNoYcOubmVzXG5cbmNsYXNzIFRvb2xcbntcbiAgICBzdGF0aWMgaXNFbXB0eShteVZhcilcbiAgICB7XG4gICAgICAgIGlmKG15VmFyPT09dW5kZWZpbmVkIHx8IG15VmFyPT09bnVsbClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIG15VmFyKz1cIlwiOy8vIHNpIGF1dHJlIGNob3NlIHF1J3VuZSBjaGHDrm5lIGVudm95w6kuLi5cbiAgICAgICAgICAgIG15VmFyPW15VmFyLnRyaW0oKTtcbiAgICAgICAgICAgIGlmKG15VmFyPT09XCJcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgc3RhdGljIHRyaW1JZk5vdE51bGwobXlTdHJpbmcpXG4gICAge1xuICAgICAgICBpZihUb29sLmlzRW1wdHkobXlTdHJpbmcpKVxuICAgICAgICAgICAgbXlTdHJpbmc9bnVsbDtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVN0cmluZys9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVN0cmluZz1teVN0cmluZy50cmltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG15U3RyaW5nO1xuICAgIH1cblxuXG4gICAgc3RhdGljIHNob3J0ZW5JZkxvbmdlclRoYW4obXlTdHJpbmcsIG1heClcbiAgICB7XG4gICAgICAgIG15U3RyaW5nKz1cIlwiOy8vIGF1IGNhcyBvw7kgY2VsYSBuZSBzZXJhaXQgcGFzIHVuZSBjaGHDrm5lLi4uXG4gICAgICAgaWYobXlTdHJpbmcubGVuZ3RoID4gbWF4KVxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcuc3Vic3RyaW5nKDAsIChtYXgtMykpK1wiLi4uXCI7XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cbiAgICAvLyBzb3VyY2UgOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNTYwNDE0MC9yZXBsYWNlLW11bHRpcGxlLXN0cmluZ3Mtd2l0aC1tdWx0aXBsZS1vdGhlci1zdHJpbmdzXG4gICAgc3RhdGljIHJlcGxhY2VBbGwobXlTdHJpbmcsIG1hcE9iailcbiAgICB7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VFbHRzID0gbmV3IFJlZ0V4cChPYmplY3Qua2V5cyhtYXBPYmopLmpvaW4oXCJ8XCIpLFwiZ2lcIik7XG4gICAgICAgIHJldHVybiBteVN0cmluZy5yZXBsYWNlKHJlcGxhY2VFbHRzLCAobWF0Y2hlZCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG1hcE9ialttYXRjaGVkXTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZnIvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT2JqZXRzX2dsb2JhdXgvTWF0aC9yYW5kb21cbiAgICBzdGF0aWMgZ2V0UmFuZG9tSW50KG1pbiwgbWF4KVxuICAgIHtcbiAgICAgICAgbWluID0gTWF0aC5jZWlsKG1pbik7XG4gICAgICAgIG1heCA9IE1hdGguZmxvb3IobWF4KTtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pKSArIG1pbjtcbiAgICB9XG5cbiAgICAvLyDDoCBjb21wbMOpdGVyIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGF0ZV9mb3JtYXRfYnlfY291bnRyeVxuICAgIHN0YXRpYyBkYXRlRm9ybWF0KGRhdGVTdHJpbmcsIGxhbmc9XCJmclwiKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KGRhdGVTdHJpbmcpKVxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIGxldCBteURhdGU9bmV3IERhdGUoZGF0ZVN0cmluZyk7XG4gICAgICAgIGxldCBteURheT1teURhdGUuZ2V0RGF0ZSgpK1wiXCI7XG4gICAgICAgIGlmKG15RGF5Lmxlbmd0aD09PTEpXG4gICAgICAgICAgICBteURheT1cIjBcIitteURheTtcbiAgICAgICAgbGV0IG15TW91bnRoPShteURhdGUuZ2V0TW9udGgoKSsxKStcIlwiO1xuICAgICAgICBpZihteU1vdW50aC5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlNb3VudGg9XCIwXCIrbXlNb3VudGg7XG4gICAgICAgIGxldCBteVllYXI9bXlEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGlmKGxhbmc9PT1cImZyXCIpXG4gICAgICAgICAgICByZXR1cm4gbXlEYXkrXCIvXCIrbXlNb3VudGgrXCIvXCIrbXlZZWFyO1xuICAgICAgICBlbHNlIGlmIChsYW5nPT09XCJmb3JtXCIpLy8gMjAxNC0wMi0wOVxuICAgICAgICAgICAgcmV0dXJuIG15WWVhcitcIi1cIitteU1vdW50aCtcIi1cIitteURheTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG15TW91bnRoK1wiL1wiK215RGF5K1wiL1wiK215WWVhcjtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVG9vbDsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZGVmYXVsdC9jb25maWcvZnIuanNcIjogXCIuLi92aWV3cy9kZWZhdWx0L2NvbmZpZy9mci5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi92aWV3cyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC5qcyRcIjsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgaGVhZExpbmtzOlxuICAgIFtcbiAgICAgICAgeyBhbmNob3I6IFwiQWNjdWVpbFwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNb24gY29tcHRlXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb25uZXhpb24uaG10XCIsIGlkOiBcImFjY291bnRIZWFkTGlua1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiw4AgcHJvcG9zXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9hLXByb3Bvcy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDb250YWN0XCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb250YWN0Lmh0bWxcIiB9IH0sXG4gICAgXSxcbiAgICBmb290TGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJDcsOpZGl0c1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY3JlZGl0cy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNZW50aW9ucyBsw6lnYWxlc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvbWVudGlvbnMtbGVnYWxlcy5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiRG9ubsOpZXMgcGVyc29ubmVsbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9kb25uZWVzLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkMuRy5VLlwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY2d1Lmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDLkcuVi5cIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nndi5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICBdLFxuICAgIG1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlOiAxMCxcbiAgICB1c2VySG9tZVBhZ2UgOiBcImFjY3VlaWwuaHRtbFwiLFxuICAgIGFkbWluSG9tZVBhZ2UgOiBcImFkbWluLmh0bWxcIixcbiAgICBtYW5hZ2VySG9tZVBhZ2UgOiBcImdlc3Rpb24uaHRtbFwiLFxuICAgIHN1YnNjcmliZVBhZ2UgOiBcImluc2NyaXB0aW9uLmh0bWxcIixcbiAgICBjb25uZWN0aW9uUGFnZSA6IFwiY29ubmV4aW9uLmh0bWxcIixcbiAgICBhY2NvdW50UGFnZTogXCJjb21wdGUuaHRtbFwiLFxuICAgIHF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi1xdWl6cy5odG1sXCIsXG4gICAgdXNlcnNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXV0aWxpc2F0ZXVycy5odG1sXCIsXG4gICAgbmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSA6IDEwLFxuICAgIGlsbHVzdHJhdGlvbkRpciA6IFwiL2ltZy9xdWl6cy9cIixcbiAgICBzaXRlU2xvZ2FuOiBcIkN1bHRpdm9ucyBub3RyZSBqYXJkaW4gIVwiLFxuICAgIGhvbWVUaXRsZTE6IFwiRGUgbmF0dXJlIGN1cmlldXNlID9cIixcbiAgICBob21lUDE6IFwiQXZlYyBXaWtpTGVybmkgdm91cyBhcHByZW5leiBjaGFxdWUgam91ciBkZSBub3V2ZWxsZXMgY2hvc2VzLjxicj5EZXMgYXJ0aWNsZXMgZGUgV2lraXDDqWRpYSBzb250IHPDqWxlY3Rpb25uw6lzIHBvdXIgdm91cyBldCBzb250IHN1aXZpcyBkJ3VuIHF1aXogdm91cyBwZXJtZXR0YW50IGRlIHRlc3RlciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudS48YnI+RGUgam91ciBlbiBqb3VyIGRlIG5vdXZlbGxlcyBncmFpbmVzIGRlIHNhdm9pciBzb250IGFpbnNpIHNlbcOpZXMgZGFucyB2b3RyZSBcXFwiamFyZGluXFxcIi5cIixcbiAgICBob21lVGl0bGUyOiBcIkxhIGN1bHR1cmUgZW4gbGliZXJ0w6lcIixcbiAgICBob21lUDI6IFwiVG91dCBjb21tZSBzdXIgV2lraXDDqWRpYSAoKiksIGxlIGxvZ2ljaWVsIGV0IGxlIGNvbnRlbnUgcGFydGFnw6kgc3VyIFdpa2lMZXJuaSBzb250IGxpYnJlcy48YnI+Vm91cyBwb3V2ZXogbGVzIHV0aWxpc2VyLCBsZXMgbW9kaWZpZXIgZXQgbGVzIGRpZmZ1c2VyIHNlbG9uIHZvdHJlIHNvdWhhaXQuPGJyPlN1ciBXaWtpTGVybmksIHBhcyBkZSBwdWJsaWNpdMOpLCBuaSBkZSBjb21tZXJjaWFsaXNhdGlvbiBkZSB2b3MgZG9ubsOpZXMgcGVyc29ubmVsbGVzLjxicj5Wb3VzIHBvdXZleiB2ZW5pciB5IFxcXCJjdWx0aXZlciB2b3RyZSBqYXJkaW5cXFwiIGVuIHRvdXRlIHRyYW5xdWlsbGl0w6kuPGJyPjxicj48c21hbGw+PGVtPigqKSBCaWVuIHF1ZSBwYXJ0YWdlYW50IHNlcyB2YWxldXJzLCBXaWtpTGVybmkgZXN0IHVuIHByb2pldCBpbmTDqXBlbmRhbnQgZGUgbGEgZm9uZGF0aW9uIFdpa2lww6lkaWEuPC9lbT48L3NtYWxsPlwiLFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzVGl0bGU6IFwiTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzIHN1ciBXaWtpTGVybmlcIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc0ludHJvOiBcIkxpc3RlIGRlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyBzdXIgV2lraUxlcm5pLlwiLFxuICAgIGV4cGxhbmF0aW9uVGl0bGU6IFwiVm91cyBkw6ljb3V2cmV6IFdpa2lMZXJuaSA/XCIsXG4gICAgZXhwbGFuYXRpb25UeHQ6IFwiTGUgcHJpbmNpcGUgZXN0IHNpbXBsZSA6IHZvdXMgY29tbWVuY2V6IHBhciBsaXJlIGwnYXJ0aWNsZSBXaWtpcMOpZGlhIGRvbnQgbGUgbGllbiB2b3VzIGVzdCBwcm9wb3PDqS48YnI+UHVpcyB2b3VzIGFmZmljaGVyIGxlIHF1aXogcG91ciB2w6lyaWZpZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUgZGUgdm90cmUgbGVjdHVyZS4gVm91cyBvYnRlbmV6IGFsb3JzIHZvdHJlIHLDqXN1bHRhdCBpbW3DqWRpYXRlbWVudC48YnI+PGJyPlRvdXRlcyBsZXMgcsOpcG9uc2VzIHNlIHRyb3V2ZW50IGRhbnMgbCdhcnRpY2xlIHByb3Bvc8OpIMOgIGxhIGxlY3R1cmUuIDxiPlZvdXMgw6p0ZXMgaWNpIHBvdXIgYXBwcmVuZHJlIGRlIG5vdXZlbGxlcyBjaG9zZXM8L2I+LCBtYWlzIGxpYnJlIMOgIHZvdXMgZCdlc3NheWVyIGQneSByw6lwb25kcmUgaW1tw6lkaWF0ZW1lbnQuPGJyPjxicj5RdWFuZCBsZSBzdWpldCBzJ3kgcHLDqnRlLCBuZSB2b3VzIMOpdG9ubmV6IHBhcyBzaSBjZXJ0YWluZXMgZGVzIHLDqXBvbnNlcyBwcm9wb3PDqWVzIHBldXZlbnQgw6p0cmUgdW4gcGV1IGTDqWNhbMOpZXMsIGFic3VyZGVzLi4uIE9uIHBldXQgYXBwcmVuZHJlIGF2ZWMgbGUgc291cmlyZSwgbm9uID8gOi0pPGJyPjxicj5VbmUgZm9pcyB2b3RyZSByw6lzdWx0YXQgb2J0ZW51LCBpbCB2b3VzIHNlcmEgcHJvcG9zw6kgZGUgY3LDqWVyIHVuIGNvbXB0ZSBwb3VyIGxlIHNhdXZlZ2FyZGVyLjxicj5DZSBjb21wdGUgdm91cyBwZXJtZXR0cmEgZGUgdGVzdGVyIGRlIG5vdXZlYXUgY2UgcXVpeiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudSBwbHVzaWV1cnMgam91cnMsIHNlbWFpbmVzLCBtb2lzLi4uIEV0IGRlIHJlY2V2b2lyIHLDqWd1bGnDqHJlbWVudCBkZSBub3V2ZWxsZXMgc3VnZ2VzdGlvbnMgZGUgbGVjdHVyZXMuPGJyPjxicj5NYWlzIDxiPmxhIGNyw6lhdGlvbiBkZSBjZSBjb21wdGUgZXN0IGZhY3VsdGF0aXZlPC9iPiBldCA8YSBocmVmPScvcXVpenMvJyB0aXRsZT0nTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzJz52b3VzIHBvdXZleiBwYXJjb3VyaXIgV2lraUxlcm5pIGxpYnJlbWVudDwvYT4uXCIsXG4gICAgbm9KU05vdGlmaWNhdGlvbjogXCJEw6lzb2zDqSwgbWFpcyBwb3VyIGwnaW5zdGFudCwgbCd1dGlsaXNhdGlvbiBkZSBXaWtpTGVybmkgbsOpY2Vzc2l0ZSBsJ2FjdGl2YXRpb24gZHUgSmF2YVNjcmlwdC5cIixcbn07IiwiLy8gLS0gUEFHRSBEJ0FDQ1VFSUwgREUgTCdVVElMSVNBVEVVUlxuXG4vLy8gVsOpcmlmaWVyIHF1ZSBsJ3V0aWxpc2F0ZXVyIGVzdCBiaWVuIGNvbm5lY3TDqSwgYSBsZSBib24gc3RhdHV0IGV0IGxlIHJlZGlyaWdlciB2ZXJzIGxlIGZvcm11bGFpcmUgZCdpbnNjcmlwdGlvbiBzaSBjZSBuJ2VzdCBwYXMgbGUgY2FzLlxuLy8vIFNpIGMnZXN0IG9rLCBvbiByw6ljdXDDqHJlIHNlcyBpbmZvcyBldCBzdGF0cyArIGxlcyBkZXJuaWVycyBxdWl6cyBhdXhxdWVscyBpbCBhIGFjY8OocywgbWFpcyBuJ2EgcGFzIHLDqXBvbmR1LlxuLy8vIFVuIG1vdGV1ciBkZSByZWNoZXJjaGUgcGVybWV0IGQnb2J0ZW5pciBkJ2F1dHJlcyBxdWl6cyBwYXJtaSBjZXV4IHB1Ymxpw6lzLlxuLy8vIFBvdXIgbCdhZmZpY2hhZ2UgZGVzIGxpc3RpbmdzIGRlIHF1aXosIGwnQVBJIHJldG91cm5lIGRpcmVjdGVtZW50IGR1IGh0bWwuXG4vLy8gVW4gbWVudSBwZXJtZXQgw6AgbCd1dGlsaXNhdGV1ciBkJ2FjY8OpZGVyIMOgIGxhIG1vZGlmaWNhdGlvbiBkZSBzZXMgaW5mb3MsIGRlIHNvbiBhYm9ubmVtZW50LCBldGMuXG4vLy8gVW4gbWVzc2FnZSB2ZW5hbnQgZCd1bmUgYXV0cmUgcGFnZSBwZXV0IGF1c3NpIMOqdHJlIMOgIGFmZmljaGVyIGxvcnMgZHUgcHJlbWllciBjaGFyZ2VtZW50LlxuXG4vLy8gQWpvdXRlciBhZmZpY2hhZ2UgYW5jaWVucyBxdWl6cyDDoCByZXRlbnTDqXMgc2kgcGFzIGRlIHF1aXpzIGVuIGF0dGVudGUgP1xuLy8vIFVuIHF1aXogYXUgaGFzYXJkID9cblxuLy8gRmljaGllciBkZSBjb25maWd1cmF0aW9uIGPDtHTDqSBjbGllbnQgOlxuaW1wb3J0IHsgYXBpVXJsLCBhdmFpbGFibGVMYW5ncywgdGhlbWUgfSBmcm9tIFwiLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCI7XG5jb25zdCBsYW5nPWF2YWlsYWJsZUxhbmdzWzBdO1xuY29uc3QgY29uZmlnRnJvbnRFbmQgPSByZXF1aXJlKFwiLi4vLi4vdmlld3MvXCIrdGhlbWUrXCIvY29uZmlnL1wiK2xhbmcrXCIuanNcIik7XG5cbi8vIEZvbmN0aW9ucyB1dGlsZXMgYXUgc2NyaXB0IDpcbmltcG9ydCB7IGdldExvY2FseSwgcmVtb3ZlTG9jYWx5LCBzYXZlTG9jYWx5IH0gZnJvbSBcIi4vdG9vbHMvY2xpZW50c3RvcmFnZS5qc1wiO1xuaW1wb3J0IHsgYWRkRWxlbWVudCB9IGZyb20gXCIuL3Rvb2xzL2RvbS5qc1wiO1xuaW1wb3J0IHsgaGVsbG9EZXYsIHVwZGF0ZUFjY291bnRMaW5rIH0gZnJvbSBcIi4vdG9vbHMvZXZlcnl3aGVyZS5qc1wiO1xuaW1wb3J0IHsgZ2V0RGF0YXNGcm9tSW5wdXRzLCBzZXRBdHRyaWJ1dGVzVG9JbnB1dHMgfSBmcm9tIFwiLi90b29scy9mb3Jtcy5qc1wiO1xuaW1wb3J0IHsgaXNFbXB0eSwgcmVwbGFjZUFsbCB9IGZyb20gXCIuLi8uLi90b29scy9tYWluXCI7XG5pbXBvcnQgeyBjaGVja1Nlc3Npb24sIGdldENvbmZpZyB9IGZyb20gXCIuL3Rvb2xzL3VzZXJzLmpzXCI7XG5cbi8vIERpY3Rpb25uYWlyZXMgOlxuY29uc3QgdHh0ID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi9nZW5lcmFsXCIpO1xuY29uc3QgdHh0VXNlcnMgPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL3VzZXJcIik7XG5jb25zdCB0eHRBbndlcnMgPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL2Fuc3dlclwiKTtcbmNvbnN0IHR4dFF1ZXN0aW9ubmFpcmUgPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL3F1ZXN0aW9ubmFpcmVcIik7XG5cbi8vIFByaW5jaXBhdXggw6lsw6ltZW50cyBkdSBET00gbWFuaXB1bMOpcyA6XG5jb25zdCBkaXZNYWluPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1haW4tY29udGVudFwiKTtcbmNvbnN0IGRpdk1lc3NhZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1lc3NhZ2VcIik7XG5jb25zdCBxdWl6VGl0bGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInF1aXpzVGl0bGVcIik7XG5jb25zdCBxdWl6SW50cm8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInF1aXpzSW50cm9cIik7XG5jb25zdCBxdWl6TGlzdGluZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicXVpenNMaXN0XCIpO1xuY29uc3QgcXVpelBhZ2luYXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInF1aXpzUGFnaW5hdGlvblwiKTtcbmNvbnN0IGZvcm1TZWFyY2ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInNlYXJjaFwiKTtcbmNvbnN0IGlucHV0QmVnaW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImJlZ2luXCIpO1xuXG5oZWxsb0RldigpO1xuXG5jb25zdCBpbml0aWFsaXNlID0gYXN5bmMgKCkgPT5cbntcbiAgICB0cnlcbiAgICB7ICAgICAgICBcbiAgICAgICAgY29uc3QgY29uZmlnID0gYXdhaXQgZ2V0Q29uZmlnKCk7XG4gICAgICAgIGlmKCFjb25maWcpXG4gICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgdHh0LnNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gU2kgbCd1dGlsaXNhdGV1ciBuJ2VzdCBwYXMgY29ubmVjdMOpLCBwYXMgbGEgcGVpbmUgZCdhbGxlciArIGxvaW4gOlxuICAgICAgICAgICAgY29uc3QgaXNDb25uZWN0ZWQ9YXdhaXQgY2hlY2tTZXNzaW9uKFtcInVzZXJcIl0sIFwiL1wiK2NvbmZpZ0Zyb250RW5kLmNvbm5lY3Rpb25QYWdlLCB7IG1lc3NhZ2U6IHR4dFVzZXJzLm5lZWRCZUNvbm5lY3RlZCwgY29sb3I6XCJlcnJvclwiIH0sIHdpbmRvdy5sb2NhdGlvbik7XG4gICAgICAgICAgICBpZihpc0Nvbm5lY3RlZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1c2VyPWdldExvY2FseShcInVzZXJcIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdXBkYXRlQWNjb3VudExpbmsodXNlci5zdGF0dXMsIGNvbmZpZ0Zyb250RW5kKTtcbiAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdk1lc3NhZ2UsIFwiaDRcIiwgdHh0VXNlcnMud2VsY29tZU1lc3NhZ2UucmVwbGFjZShcIiNOQU1FXCIsIHVzZXIubmFtZSkpO1xuICAgICAgICAgICAgICAgIGRpdk1haW4uc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgICAgICAgICAgaWYoIWlzRW1wdHkoZ2V0TG9jYWx5KFwibWVzc2FnZVwiKSkpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdk1lc3NhZ2UsIFwicFwiLCBnZXRMb2NhbHkoXCJtZXNzYWdlXCIsIHRydWUpLm1lc3NhZ2UsIFwiXCIsIFtnZXRMb2NhbHkoXCJtZXNzYWdlXCIsIHRydWUpLmNvbG9yXSwgXCJcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJtZXNzYWdlXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJbml0aWFsaXNhdGlvbiBkdSBmb3JtdWxhaXJlIGRlIHJlY2hlcmNoZSA6XG4gICAgICAgICAgICAgICAgc2V0QXR0cmlidXRlc1RvSW5wdXRzKGNvbmZpZywgZm9ybVNlYXJjaCk7ICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBMZXMgc3RhdHMgOiAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IHhoclN0YXRzID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgeGhyU3RhdHMub3BlbihcIkdFVFwiLCBhcGlVcmwrY29uZmlnLnF1ZXN0aW9ubmFpcmVSb3V0ZXMrY29uZmlnLmdldFN0YXRzQW5zd2Vycyt1c2VyLmlkKTtcbiAgICAgICAgICAgICAgICB4aHJTdGF0cy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gMjAwICYmICFpc0VtcHR5KHJlc3BvbnNlLm5iQW5zd2VycykgJiYgcmVzcG9uc2UubmJBbnN3ZXJzIT09MCkvLyBwYXMgZGUgc3RhdHMgc2kgYXVjdW5lIHLDqXBvbnNlICFcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXBUZXh0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkJBTlNXRVJTIDogcmVzcG9uc2UubmJBbnN3ZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5CUVVFU1RJT05OQUlSRVMgOiByZXNwb25zZS5uYlF1ZXN0aW9ubmFpcmVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5CVE9UUVVFU1RJT05OQUlSRVMgOiByZXNwb25zZS5nZW5lcmFsLm5iUHVibGlzaGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWR0RVUkFUSU9OIDogcmVzcG9uc2UuYXZnRHVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZHQ09SUkVDVEFOU1dFUlMgOiByZXNwb25zZS5hdmdDb3JyZWN0QW5zd2Vyc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZNZXNzYWdlLCBcInBcIiwgcmVwbGFjZUFsbCh0eHRBbndlcnMuc3RhdHNVc2VyLCBtYXBUZXh0KSwgXCJcIiwgXCJcIiwgXCJcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHhoclN0YXRzLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK3VzZXIudG9rZW4pOyBcbiAgICAgICAgICAgICAgICB4aHJTdGF0cy5zZW5kKCk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gUGFyIGTDqWZhdXQsIG9uIGFmZmljaGUgZGVzIGRlcm5pZXJzIHF1aXpzIHByb3Bvc8OpcyBzYW5zIHLDqXBvbnNlIDpcbiAgICAgICAgICAgICAgICBjb25zdCB4aHJMYXN0UXVpenMgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICB4aHJMYXN0UXVpenMub3BlbihcIkdFVFwiLCBhcGlVcmwrY29uZmlnLnF1ZXN0aW9ubmFpcmVSb3V0ZXMrY29uZmlnLmdldFF1ZXN0aW9ubmFpcmVzV2l0aG91dEFuc3dlcitcIlwiK3VzZXIuaWQrXCIvXCIrMCtcIi9cIitjb25maWdGcm9udEVuZC5uYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlK1wiL2h0bWxcIik7XG4gICAgICAgICAgICAgICAgeGhyTGFzdFF1aXpzLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UodGhpcy5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDApXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2UubmJUb3Q9PT0wKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KHF1aXpJbnRybywgXCJwXCIsIHR4dEFud2Vycy5ub1F1ZXN0aW9ubmFpcmVXaXRob3VkQW5zd2VyLCBcIlwiLCBbXCJzdWNjZXNzXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKHJlc3BvbnNlLmh0bWwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KHF1aXpJbnRybywgXCJwXCIsIHR4dEFud2Vycy5uYlF1ZXN0aW9ubmFpcmVXaXRob3VkQW5zd2VyLnJlcGxhY2UoXCIjTkJcIiwgcmVzcG9uc2UucXVlc3Rpb25uYWlyZXMubGVuZ3RoKSwgXCJcIiwgW1wiaW5mb3JtYXRpb25cIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWl6TGlzdGluZy5pbm5lckhUTUw9cmVzcG9uc2UuaHRtbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KHF1aXpzLCBcInBcIiwgdHh0LnNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChxdWl6cywgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHhockxhc3RRdWl6cy5zZXRSZXF1ZXN0SGVhZGVyKFwiQXV0aG9yaXphdGlvblwiLCBcIkJlYXJlciBcIit1c2VyLnRva2VuKTtcbiAgICAgICAgICAgICAgICB4aHJMYXN0UXVpenMuc2VuZCgpO1xuXG4gICAgICAgICAgICAgICAgLy8gVHJhaXRlbWVudCBkdSBsYW5jZW1lbnQgZCd1bmUgcmVjaGVyY2hlXG4gICAgICAgICAgICAgICAgLy8gTGEgcmVjaGVyY2hlIHBldXQgw6p0cmUgbGFuY8OpZSB2aWEgbGEgYm91dG9uIHN1Ym1pdCBvdSB1biBsaWVuIGRlIHBhZ2luYXRpb25cbiAgICAgICAgICAgICAgICBjb25zdCBzZW5kU2VhcmNoID0gKCkgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHF1aXpUaXRsZS5pbm5lckhUTUw9dHh0UXVlc3Rpb25uYWlyZS5zZWFyY2hSZXN1bHRUaXRsZTtcbiAgICAgICAgICAgICAgICAgICAgcXVpekxpc3RpbmcuaW5uZXJIVE1MPVwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhcz1nZXREYXRhc0Zyb21JbnB1dHMoZm9ybVNlYXJjaCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhoclNlYXJjaCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgICAgICB4aHJTZWFyY2gub3BlbihcIlBPU1RcIiwgY29uZmlnLmFwaVVybCtjb25maWcucXVlc3Rpb25uYWlyZVJvdXRlcytjb25maWcuc2VhcmNoUXVlc3Rpb25uYWlyZXNSb3V0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHhoclNlYXJjaC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDAgJiYgIWlzRW1wdHkocmVzcG9uc2UubmJUb3QpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2UubmJUb3Q9PT0wKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChxdWl6SW50cm8sIFwicFwiLCB0eHRRdWVzdGlvbm5haXJlLm5vdEZvdW5kLCBcIlwiLCBbXCJpbmZvcm1hdGlvblwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYocmVzcG9uc2UuaHRtbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChxdWl6SW50cm8sIFwicFwiLCB0eHRRdWVzdGlvbm5haXJlLnNlYXJjaFdpdGhSZXN1bHQucmVwbGFjZShcIiNOQlwiLCByZXNwb25zZS5uYlRvdCkgLCBcIlwiLCBbXCJzdWNjZXNzXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1aXpMaXN0aW5nLmlubmVySFRNTD1yZXNwb25zZS5odG1sO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGFnaW5hdGlvbiBuw6ljZXNzYWlyZSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWl6UGFnaW5hdGlvbi5pbm5lckhUTUw9XCJcIjsvLyBvbiBjb21tZW5jZSBwYXIgdmlkZXIuLi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLmJlZ2luICE9IDApLy8gcGV1dCByZXRvdXJuZXIgXCIwXCIgZXQgbm9uIDAgIVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQocXVpelBhZ2luYXRpb24sIFwiYVwiLCB0eHQucHJldmlvdXNQYWdlICwgXCJwcmV2aW91c1Jlc1wiLCBcIlwiLCB7IGhyZWY6IFwiI3NlYXJjaFwiIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzUGFnZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInByZXZpb3VzUmVzXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlIHJldG91ciDDoCBsYSBwYWdlIHByw6ljw6lkZW50ZSBwZXV0IHNlIGZhaXJlIGVuIGNsaXF1YW50IHN1ciBsZSBib3V0b24gb3UgdmlhIGwnaGlzdG9yaXF1ZSBkdSBuYXZpZ2F0ZXVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ29CYWNrUmVzID0gKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdCZWdpbj1yZXNwb25zZS5iZWdpbi1jb25maWdGcm9udEVuZC5uYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihuZXdCZWdpbjwwKSAvLyBuZSBkZXZyYWl0IHBhcyDDqnRyZSBwb3NzaWJsZS4uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdCZWdpbj0wO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImJlZ2luXCIpLnZhbHVlPW5ld0JlZ2luO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kU2VhcmNoKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIjc2VhcmNoXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1BhZ2UuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvQmFja1JlcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vbnBvcHN0YXRlID0gZnVuY3Rpb24oZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29CYWNrUmVzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLmVuZCA8IChyZXNwb25zZS5uYlRvdC0xKSkvLyAtMSwgY2FyIHRhYmxlYXUgY29tbWVuY2Ugw6AgMCAhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChxdWl6UGFnaW5hdGlvbiwgXCJhXCIsIHR4dC5uZXh0UGFnZSwgXCJuZXh0UmVzXCIsIFwiXCIsIHsgaHJlZjogXCIjc2VhcmNoXCIgfSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRQYWdlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibmV4dFJlc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0UGFnZS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJiZWdpblwiKS52YWx1ZT1yZXNwb25zZS5lbmQrMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZFNlYXJjaCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKFwiI3NlYXJjaFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KHF1aXpzLCBcInBcIiwgdHh0LnNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChxdWl6cywgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHhoclNlYXJjaC5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyU2VhcmNoLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICBpZihkYXRhcylcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXMub3V0cHV0PVwiaHRtbFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgeGhyU2VhcmNoLnNlbmQoSlNPTi5zdHJpbmdpZnkoZGF0YXMpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3JtU2VhcmNoLmFkZEV2ZW50TGlzdGVuZXIoXCJzdWJtaXRcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJiZWdpblwiKS52YWx1ZT0wO1xuICAgICAgICAgICAgICAgICAgICBzZW5kU2VhcmNoKCk7XG4gICAgICAgICAgICAgICAgfSk7ICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoKGUpXG4gICAge1xuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICBhZGRFbGVtZW50KGRpdk1lc3NhZ2UsIFwicFwiLCB0eHQuc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICB9XG59XG5pbml0aWFsaXNlKCk7IiwiLy8gRk9OQ1RJT05TIFVUSUxFUyBBVSBTVE9DS0FHRSBMT0NBTCAoU0VTU0lPTiwgQ09PS0lFUywgSU5ERVhEQiwgRVRDLilcbi8vIFJldmVuaXIgcG91ciBnw6lyZXIgbGUgY2FzIG/DuSBsb2NhbC5zdG9yYWdlIG4nZXN0IHBhcyBjb25udSBwb3VyIHV0aWxpc2VyIGNvb2tpZVxuICAgIFxuZXhwb3J0IGNvbnN0IHNhdmVMb2NhbHkgPSAobmFtZSwgZGF0YSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShuYW1lLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2NhbHkgPSAobmFtZSwganNvbj1mYWxzZSkgPT5cbntcbiAgICBpZihqc29uKVxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKSk7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSk7XG59XG5cbmV4cG9ydCBjb25zdCByZW1vdmVMb2NhbHkgPSAobmFtZSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShuYW1lKTtcbn0iLCJpbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gRm9uY3Rpb24gYXNzb2NpYW50IGxlcyBhdHRyaWJ1dHMgZm91cm5pcyDDoCB1biBjaGFtcCBkZSBmb3JtdWxhaXJlXG5leHBvcnQgY29uc3QgYWRkRWxlbWVudCA9IChlbHRQYXJlbnQsIGVsdFR5cGUsIGVsdENvbnRlbnQ9XCJcIiwgZWx0SWQ9XCJcIiwgZWx0Q2xhc3M9W10sIGVsdEF0dHJpYnV0ZXM9e30sIHJlcGxhY2U9dHJ1ZSkgPT5cbntcbiAgICBpZihpc0VtcHR5KGVsdFR5cGUpIHx8IGlzRW1wdHkoZWx0UGFyZW50KSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGVsc2VcbiAgICB7XG4gICAgICAgIGNvbnN0IG5ld0VsZW1lbnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlbHRUeXBlKTtcbiAgICAgICAgXG4gICAgICAgIGlmKCFpc0VtcHR5KGVsdElkKSkvLyB0ZXN0ZXIgc2kgbCdpZCBuJ2VzdCBwYXMgZMOpasOgIHV0aWxpc8OpIGRhbnMgbGUgRE9NID9cbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaWQ9ZWx0SWQ7XG5cbiAgICAgICAgaWYoQXJyYXkuaXNBcnJheShlbHRDbGFzcykgJiYgZWx0Q2xhc3MubGVuZ3RoIT0wKVxuICAgICAgICB7XG4gICAgICAgICAgICBmb3IobGV0IGkgaW4gZWx0Q2xhc3MpXG4gICAgICAgICAgICAgICAgbmV3RWxlbWVudC5jbGFzc0xpc3QuYWRkKGVsdENsYXNzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHR5cGVvZiBlbHRBdHRyaWJ1dGVzID09PSBcIm9iamVjdFwiKSAvLyAhISB0b3VzIGxlcyBvYmpldHMgbmUgc29udCBwYXMgb2tcbiAgICAgICAge1xuICAgICAgICAgICAgZm9yKGxldCBhdHRyaWJ1dE5hbWUgaW4gZWx0QXR0cmlidXRlcylcbiAgICAgICAgICAgICAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dE5hbWUsIGVsdEF0dHJpYnV0ZXNbYXR0cmlidXROYW1lXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZighaXNFbXB0eShlbHRDb250ZW50KSlcbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaW5uZXJIVE1MPWVsdENvbnRlbnQucmVwbGFjZSgvXFxuL2csXCI8YnI+XCIpOy8vIGlubmVySFRNTCBwZXJtZXQgZCdham91dGVyIGR1IHRleHRlIGF5YW50IGx1aS1tw6ptZSBkZXMgYmFsaXNlcywgZXRjLlxuICAgICAgICAgICAgXG4gICAgICAgIGlmKHJlcGxhY2UpXG4gICAgICAgICAgICBlbHRQYXJlbnQuaW5uZXJIVE1MPVwiXCI7XG4gICAgICAgIGVsdFBhcmVudC5hcHBlbmRDaGlsZChuZXdFbGVtZW50KTtcbiAgICB9ICAgIFxufSIsIi8vIENlIHNjcmlwdCBmb3Vybml0IGRlcyBmb25jdGlvbnMgdXRpbGlzw6llcyBzdXIgdG91dGVzIGxlcyBwYWdlcyBkdSBzaXRlXG5cbmV4cG9ydCBjb25zdCBoZWxsb0RldiA9ICgpID0+XG57XG4gICAgY29uc29sZS5sb2coXCIqKioqIEhlbGxvIGFtaSBkw6l2ZWxvcHBldXIgOi0pXFxuIExlIGNvZGUgZGUgV2lraUxlcm5pIGVzdCBsaWJyZSBldCBlc3QgbGlzaWJsZSBzdXIgZ2l0bGFiIDogXFxuIEJvbm5lIGxlY3R1cmUgOi0pIFxcbiBQb3VyIGxlcyBzdWdnZXN0aW9ucyBkJ2Ftw6lsaW9yYXRpb24gb3UgcXVlc3Rpb25zIDogZGV2QHdpbGlsZXJuaS5jb20gKioqKlwiKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUFjY291bnRMaW5rID0gKHN0YXR1cywgY29uZmlnVGVtcGxhdGUpID0+XG57XG4gICAgY29uc3QgbGluaz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFjY291bnRIZWFkTGlua1wiKTtcbiAgICBjb25zdCBob21lUGFnZT1zdGF0dXMrXCJIb21lUGFnZVwiO1xuICAgIGxpbmsuaHJlZj1cIi9cIitjb25maWdUZW1wbGF0ZVtob21lUGFnZV07XG59IiwiaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIEZvbmN0aW9uIGFzc29jaWFudCBsZXMgYXR0cmlidXRzIGZvdXJuaXMgw6AgdW4gY2hhbXAgZGUgZm9ybXVsYWlyZVxuZXhwb3J0IGNvbnN0IHNldEF0dHJpYnV0ZXNUb0lucHV0cyA9IChpbnB1dHNDb25mLCBteUZvcm0pID0+XG57XG4gICAgZm9yKGxldCBpIGluIG15Rm9ybS5lbGVtZW50cylcbiAgICB7XG4gICAgICAgIGlmKCFpc0VtcHR5KG15Rm9ybS5lbGVtZW50c1tpXS5pZCkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldCBpZElucHV0PW15Rm9ybS5lbGVtZW50c1tpXS5pZDtcbiAgICAgICAgICAgIGlmKGlucHV0c0NvbmZbaWRJbnB1dF0hPT11bmRlZmluZWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGV0IGlucHV0SFRNTD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZElucHV0KTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBhdHRyaWJ1dGUgaW4gaW5wdXRzQ29uZltpZElucHV0XSlcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRIVE1MLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIGlucHV0c0NvbmZbaWRJbnB1dF1bYXR0cmlidXRlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbi8vIFLDqWN1cMOocmUgdG91dGVzIGxlcyB2YWxldXJzIGRlIGNoYW1wcyBlbiBvbWV0dGFudCBsZXMgY2hlY2tib3ggbm9uIGNvY2jDqWVzLCBldGMuXG5leHBvcnQgY29uc3QgZ2V0RGF0YXNGcm9tSW5wdXRzID0gKG15Rm9ybSkgPT5cbntcbiAgICBjb25zdCBkYXRhcz17fTtcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShteUZvcm0pO1xuICAgIGZvcihsZXQgZW50cmllIG9mIGZvcm1EYXRhLmVudHJpZXMoKSlcbiAgICAgICBkYXRhc1tlbnRyaWVbMF1dPWVudHJpZVsxXTtcbiAgICByZXR1cm4gZGF0YXM7XG59XG5cbi8vIFZpZGUgdG91cyBsZXMgY2hhbXBzIGQndW4gZm9ybXVsYWlyZSwgeSBjb21wcmlzIGhpZGRlbiwgY2hlY2tib3gsIGV0Yy5cbi8vIFJldm9pciBwb3VyIGxlcyBzZWxlY3RcbmV4cG9ydCBjb25zdCBlbXB5Rm9ybSA9IChteUZvcm0pID0+XG57XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEobXlGb3JtKTtcbiAgICBmb3IobGV0IGVudHJpZSBvZiBmb3JtRGF0YS5lbnRyaWVzKCkpXG4gICAge1xuICAgICAgICBpZihteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS50eXBlPT1cImNoZWNrYm94XCIgfHwgbXlGb3JtLmVsZW1lbnRzW2VudHJpZVswXV0udHlwZT09XCJyYWRpb1wiKVxuICAgICAgICAgICAgbXlGb3JtLmVsZW1lbnRzW2VudHJpZVswXV0uY2hlY2tlZD1mYWxzZTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbXlGb3JtLmVsZW1lbnRzW2VudHJpZVswXV0udmFsdWU9XCJcIjtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG4vLyBWaWRlIGV0IGNhY2hlIGxlIGZvcm11bGFpcmVcbmV4cG9ydCBjb25zdCBlbXB5QW5kSGlkZUZvcm0gPSAobXlGb3JtKSA9Plxue1xuICAgIGVtcHlGb3JtKG15Rm9ybSk7XG4gICAgbXlGb3JtLnN0eWxlLmRpc3BsYXk9XCJub25lXCI7XG59IiwiaW1wb3J0IHsgYXBpVXJsLCBhdmFpbGFibGVMYW5ncywgc2l0ZVVybCwgdGhlbWUgfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCI7XG5jb25zdCBsYW5nPWF2YWlsYWJsZUxhbmdzWzBdO1xuXG5jb25zdCBjb25maWdUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi8uLi8uLi92aWV3cy9cIit0aGVtZStcIi9jb25maWcvXCIrbGFuZytcIi5qc1wiKTtcbmltcG9ydCB7ICBjaGVja0xvZ2luUm91dGUsIHRpbWVEaWZmZXJlbmNlTWF4LCB0aW1lRGlmZmVyZW5jZU1pbiwgdXNlclJvdXRlcyB9IGZyb20gXCIuLi8uLi8uLi9jb25maWcvdXNlcnMuanNcIjtcblxuaW1wb3J0IHsgZ2V0TG9jYWx5LCByZW1vdmVMb2NhbHksIHNhdmVMb2NhbHkgfSBmcm9tIFwiLi9jbGllbnRzdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gUsOpY3Vww6hyZSBsZXMgZG9ubsOpZXMgZGUgY29uZmlndXJhdGlvbiBkZXMgdXRpbGlzYXRldXJzXG4vLyDDgCB0ZXJtZSwgdW4gZmljaGllciBzdGF0aXF1ZSBpbXBvcnRhYmxlIGNvbW1lIG1vZHVsZSBkZXZyYWl0IMOpdml0ZXIgdW5lIHJlcXXDqnRlIGFqYXhcbmV4cG9ydCBjb25zdCBnZXRDb25maWcgPSAgYXN5bmMgKCkgPT5cbntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBhcGlVcmwrXCIvdXNlci9nZXRjb25maWdcIik7XG4gICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCkpO1xuICAgICAgICB4aHIub25lcnJvciA9ICgpID0+IHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICAgIHhoci5zZW5kKCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRUaW1lRGlmZmVyZW5jZSA9ICgpID0+XG57XG4gICAgY29uc3QgdGltZUxvY2FsPW5ldyBEYXRlKCkuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICBpZih0aW1lTG9jYWwgPiB0aW1lRGlmZmVyZW5jZU1heCB8fCB0aW1lTG9jYWwgPCB0aW1lRGlmZmVyZW5jZU1pbilcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgZWxzZSByZXR1cm4gdGltZUxvY2FsO1xufVxuXG4vLyBPbiBlbmzDqHZlIHZvbG9udGFpcmVtZW50IGxlcyAwL08gcG91ciDDqXZpdGVyIGxlcyBjb25mdXNpb25zICFcbi8vIEV0IG1pZXV4IHZhdXQgYXVzc2kgZMOpYnV0ZXIgZXQgZmluaXIgcGFyIHVuZSBsZXR0cmUgc2ltcGxlLlxuZXhwb3J0IGNvbnN0IGdldFBhc3N3b3JkID0gKG5iQ2FyTWluLCBuYkNhck1heCkgPT5cbntcbiAgICBjb25zdCBuYkNhcj1uYkNhck1pbitNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqKG5iQ2FyTWF4LW5iQ2FyTWluKSk7XG4gICAgY29uc3QgbGV0dGVycz1cIkFCQ0RFRkdISUpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbnBxcnN0dXZ3eHl6XCI7XG4gICAgY29uc3Qgb3RoZXJzPVwiMTIzNDU2Nzg5IT8uKi1fJUAmw4nDgMOIw5nigqwkw4LDisObw45cIjtcbiAgICBsZXQgcGFzc3dvcmQ9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICBmb3IobGV0IGk9MTtpPChuYkNhci0xKTtpKyspXG4gICAge1xuICAgICAgICBpZigoaSAlIDIpID09PTEpXG4gICAgICAgICAgICBwYXNzd29yZCs9b3RoZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpvdGhlcnMubGVuZ3RoKV07XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHBhc3N3b3JkKz1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldOyAgIFxuICAgIH1cbiAgICBwYXNzd29yZCs9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICByZXR1cm4gcGFzc3dvcmQ7XG59XG5cbi8vIEondXRpbGlzZSBsZSBzdG9ja2FnZSBsb2NhbCBkdSBuYXZpZ2F0ZXVyIHBvdXIgZW5yZWdpc3RyZXIgbGVzIGRvbm7DqWVzIHBlcm1ldHRhbnQgZGUgcmVjb25uYcOudHJlIGwndXRpbGlzYXRldXIgcGFyIGxhIHN1aXRlXG4vLyBTZXVsIGxlIHNlcnZldXIgcG91cnJhIHbDqXJpZmllciBxdWUgbGVzIGlkZW50aWZpYW50cyBzb250ICh0b3Vqb3VycykgdmFsaWRlcy5cbmV4cG9ydCBjb25zdCBzZXRTZXNzaW9uID0gKHVzZXJJZCwgdG9rZW4sIGR1cmF0aW9uVFMpID0+XG57XG4gICAgY29uc3Qgc3RvcmFnZVVzZXI9XG4gICAge1xuICAgICAgICBpZDogdXNlcklkLFxuICAgICAgICB0b2tlbjogdG9rZW4sXG4gICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvblRTXG4gICAgfVxuICAgIHNhdmVMb2NhbHkoXCJ1c2VyXCIsIHN0b3JhZ2VVc2VyKTtcbn1cblxuLy8gVsOpcmlmaWUgcXUnaWwgeSBhIGRlcyBkb25uw6llcyBsb2NhbGVzIGNvbmNlcm5hbnQgbGUgcsOpc3VsdGF0IGQndW4gcXVpelxuLy8gRXQgbGVzIGFqb3V0ZSBhdXggZG9ubsOpZXMgZW52b3nDqWVzIHBhciBsZXMgZm9ybXVsYWlyZXMgZCdpbnNjcmlwdGlvbi9jb25uZXhpb24gc2kgYydlc3QgbGUgY2FzXG5leHBvcnQgY29uc3QgY2hlY2tBbnN3ZXJEYXRhcyA9IChkYXRhcykgPT5cbntcbiAgICBjb25zdCBsYXN0QW5zd2VyPWdldExvY2FseShcImxhc3RBbnN3ZXJcIik7XG4gICAgaWYoIWlzRW1wdHkobGFzdEFuc3dlcikpXG4gICAge1xuICAgICAgICBjb25zdCBhbnN3ZXI9SlNPTi5wYXJzZShsYXN0QW5zd2VyKTtcbiAgICAgICAgaWYoIWlzRW1wdHkoYW5zd2VyLmR1cmF0aW9uKSAmJiAhaXNFbXB0eShhbnN3ZXIubmJDb3JyZWN0QW5zd2VycykgJiYgIWlzRW1wdHkoYW5zd2VyLlF1ZXN0aW9ubmFpcmVJZCkgJiYgIWlzRW1wdHkoYW5zd2VyLm5iUXVlc3Rpb25zKSlcbiAgICAgICAge1xuICAgICAgICAgICAgZGF0YXMuZHVyYXRpb249YW5zd2VyLmR1cmF0aW9uO1xuICAgICAgICAgICAgZGF0YXMubmJDb3JyZWN0QW5zd2Vycz1hbnN3ZXIubmJDb3JyZWN0QW5zd2VycztcbiAgICAgICAgICAgIGRhdGFzLlF1ZXN0aW9ubmFpcmVJZD1hbnN3ZXIuUXVlc3Rpb25uYWlyZUlkO1xuICAgICAgICAgICAgZGF0YXMubmJRdWVzdGlvbnM9YW5zd2VyLm5iUXVlc3Rpb25zO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhcztcbn1cblxuLy8gQ2V0dGUgZm9uY3Rpb24gdGVzdGUgbGEgY29ubmV4aW9uIGRlIGwndXRpbGlzYXRldXIgZCd1bmUgcGFnZVxuLy8gT24gcGV1dCBmb3VybmlzIHVuZSBsaXN0ZSBkZSBzdGF0dXRzIGFjY2VwdMOpcyAoc2kgdmlkZSA9IHRvdXMpLCBhaW5zaSBxdSd1bmUgdXJsIGRlIHJlZGlyZWN0aW9uIHNpIG5vbiBjb25uZWN0w6ksIHVuIG1lc3NhZ2UgZCdlcnJldXIgw6AgYWZmaWNoZXIgc3VyIGxhIHBhZ2UgZGUgZGVzdGluYXRpb24gZXQgbCd1cmwgc3VyIGxhcXVlbGxlIHJldmVuaXIgdW5lIGZvaXMgY29ubmVjdMOpXG5leHBvcnQgY29uc3QgY2hlY2tTZXNzaW9uID0gYXN5bmMgKHN0YXR1cz1bXSwgdXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCkgPT5cbntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IHVzZXJEYXRhcz1nZXRMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICBpZihpc0VtcHR5KHVzZXJEYXRhcykpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgdXNlcj1KU09OLnBhcnNlKHVzZXJEYXRhcyk7XG4gICAgICAgICAgICBpZihpc0VtcHR5KHVzZXIuaWQpIHx8wqBpc0VtcHR5KHVzZXIudG9rZW4pIHx8IGlzRW1wdHkodXNlci5kdXJhdGlvbikgfHwgdXNlci5kdXJhdGlvbiA8IERhdGUubm93KCkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgYXBpVXJsK3VzZXJSb3V0ZXMrY2hlY2tMb2dpblJvdXRlK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDAgJiYgcmVzcG9uc2UuaXNWYWxpZCAmJiByZXNwb25zZS5pZCAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLmlkPT09dXNlci5pZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLm5hbWU9cmVzcG9uc2UubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLmxhbmd1YWdlPXJlc3BvbnNlLmxhbmd1YWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIudGltZURpZmZlcmVuY2U9cmVzcG9uc2UudGltZURpZmZlcmVuY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5zdGF0dXM9cmVzcG9uc2Uuc3RhdHVzOy8vIGxlIHRva2VuIGV0IGRlIHRvdXRlIGZhw6dvbiB2w6lyaWZpZXIgw6AgY2hhcXVlIHJlcXXDqnRlIMOgIGwnQVBJXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUxvY2FseShcInVzZXJcIiwgdXNlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2kgaWwgcydhZ2l0IGQndW4gXCJ1c2VyXCIgZXQgcXVlIHNvbiBhYm9ubmVtZW50IGEgZXhwaXLDqSwgamUgbGUgcmVkaXJpZ2UgdmVycyBsYSBjYWlzc2UgOi0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2Uuc3RhdHVzPT09XCJ1c2VyXCIgJiYgcmVzcG9uc2UubmJEYXlzT2sgPD0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybEFjY291bnQ9c2l0ZVVybCtcIi9cIitjb25maWdUZW1wbGF0ZVtsYW5nXS5hY2NvdW50UGFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZih1cmxBY2NvdW50KT09PS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIi9cIitjb25maWdUZW1wbGF0ZVtsYW5nXS5hY2NvdW50UGFnZSk7Ly8gcGFzc8OpZSBkaXJlY3RlbWVudCBpY2ksIGwnYW5jcmUgI3N1YnNjcmliZSBuZSBmb25jdGlvbm5lIHBhcyAhP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzdGF0dXMubGVuZ3RoIT09MCAmJiBzdGF0dXMuaW5kZXhPZihyZXNwb25zZS5zdGF0dXMpPT09LTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHhoci5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICAgICAgICAgICAgICB4aHIuc2VuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4vLyBDZXR0ZSBmb25jdGlvbiBzZXJ0IMOgIGxhIHByw6ljw6lkZW50ZSBlbiBjYXMgZGUgY29ubmV4aW9uIG5vbiB2YWxpZGVcbmNvbnN0IHJlZGlyZWN0VXNlciA9ICh1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKSA9Plxue1xuICAgIGlmKCFpc0VtcHR5KG1lc3NhZ2UpKVxuICAgICAgICBzYXZlTG9jYWx5KFwibWVzc2FnZVwiLCBtZXNzYWdlKTtcbiAgICBpZighaXNFbXB0eSh1cmxXYW50ZWQpKVxuICAgICAgICBzYXZlTG9jYWx5KFwidXJsXCIsIHVybFdhbnRlZCk7XG4gICAgaWYoIWlzRW1wdHkodXJsUmVkaXJlY3Rpb24pKVxuICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKHVybFJlZGlyZWN0aW9uKTtcbn0iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/front/public/JS/index.app.js b/front/public/JS/index.app.js new file mode 100644 index 0000000..a12ee9a --- /dev/null +++ b/front/public/JS/index.app.js @@ -0,0 +1,864 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "./src/index.js"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "../config/instance.js": +/*!*****************************!*\ + !*** ../config/instance.js ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var _module$exports; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var users = __webpack_require__(/*! ./users */ "../config/users.js"); + +var questionnaires = __webpack_require__(/*! ./questionnaires */ "../config/questionnaires.js"); + +module.exports = (_module$exports = { + apiUrl: "http://localhost:3000/api", + siteUrl: "http://localhost:8080", + adminName: "Fabrice", + adminEmail: "dev@wikilerni.com", + senderName: "WikiLerni", + senderEmail: "bonjour@wikilerni.com", + adminLang: "fr", + theme: "default", + // le thème utilisé (dans /views) pour générer les pages HTML. Contient ses propres fichiers de configuration. + availableLangs: ["fr"], + // Languages in which the site is available. The first one is the default one. + siteName: "WikiLerni", + beginCodeGodfather: "wikilerni", + // case-sensitive and can't contain "@" ! + cronTimingAlertInSeconde: 120, + // for logs + responseTimingAlertInSeconde: 3, + // idem + tokenSignupValidationTimeInHours: "48h", + // https://github.com/zeit/ms + tokenLoginLinkTimeInHours: "1h", + tokenConnexionMinTimeInHours: "24h", + tokenConnexionMaxTimeInDays: "180 days", + tokenLoginChangingTimeInHours: "1h", + // for email & password changing + tokenDeleteUserTimeInHours: "1h", + tokenUnsubscribeLinkTimeInDays: "7 days", + // token send with subscription's emails + freeAccountTimingInDays: 10, + freeAccountExpirationNotificationInDays: 5, + accountExpirationFirstNotificationInDays: 14, + accountExpirationSecondNotificationInDays: 5, + inactiveAccountTimeToDeleteInDays: 180, + // Questionnaires: + nbQuestionsMin: 1, + // minimum number of questions for the questionnaire to be publishable + nbQuestionsMax: 10, + // if 0 = not maximum + nbChoicesMax: 10, + nbNewQuestionnaires: 10, + // for RSS, etc. + hourGiveNewQuestionnaireBegin: 1, + // in user local time + hourGiveNewQuestionnaireEnd: 24, + // idem + numberNewQuestionnaireAtSameTime: 50, + // for mass mailing + minSearchQuestionnaires: 3, + // Illustrations: + nbIllustrationsMin: 0, + nbIllustrationsMax: 1, + maxIllustrationSizeinOctet: 1000000, + // pas contrôlé pour l'instant. À revoir. + mimeTypesForIllustration: ["image/jpg", "image/jpeg", "image/png", "image/gif", "image/png"], + // -- Upload and resize: + illustrationsWidthMaxInPx: 400, + illustrationsMiniaturesWidthMaxInPx: 200, + // Links: + nbLinksMin: 1, + nbLinksMax: 1 +}, _defineProperty(_module$exports, "nbQuestionsMin", questionnaires.nbQuestionsMin), _defineProperty(_module$exports, "nbQuestionsMax", questionnaires.nbQuestionsMax), _defineProperty(_module$exports, "nbChoicesMax", questionnaires.nbChoicesMax), _defineProperty(_module$exports, "passwordMinLength", users.password.minlength), _defineProperty(_module$exports, "dirCacheUsers", users.dirCacheUsers), _defineProperty(_module$exports, "dirCacheUsersAnswers", users.dirCacheUsersAnswers), _defineProperty(_module$exports, "dirCacheQuestionnaires", questionnaires.dirCacheQuestionnaires), _defineProperty(_module$exports, "dirCacheQuestions", questionnaires.dirCacheQuestions), _defineProperty(_module$exports, "dirCacheUsersQuestionnaires", questionnaires.dirCacheUsersQuestionnaires), _defineProperty(_module$exports, "dirHTMLQuestionnaire", questionnaires.dirHTMLQuestionnaire), _defineProperty(_module$exports, "dirWebQuestionnaire", questionnaires.dirWebQuestionnaire), _module$exports); + +/***/ }), + +/***/ "../config/questionnaires.js": +/*!***********************************!*\ + !*** ../config/questionnaires.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + // API'routes (after "apiUrl" defined in instance.js) + questionnaireRoutes: "/questionnaire", + getQuestionnaireRoutes: "/get", + previewQuestionnaireRoutes: "/preview", + publishedQuestionnaireRoutes: "/quiz/", + saveAnswersRoute: "/answer/", + getStatsQuestionnaires: "/stats/", + searchQuestionnairesRoute: "/search", + searchAdminQuestionnairesRoute: "/searchadmin", + getListNextQuestionnaires: "/getlistnextquestionnaires/", + // -- questions & choices : + questionsRoute: "/question/", + // -- tags : + tagsSearchRoute: "/tags/search/", + // -- answers : + getQuestionnairesWithoutAnswer: "/withoutanswer/user/", + getPreviousAnswers: "/user/answers/", + getStatsAnswers: "/user/anwswers/stats/", + getAdminStats: "/getadminstats/", + // forms : à compléter avec valeurs par défaut, etc. cf modèle + Questionnaire: { + title: { + maxlength: 255, + required: true + }, + slug: { + maxlength: 150 + }, + // champ requis mais calculé à partir du titre qd vide + introduction: { + required: true + } + }, + searchQuestionnaires: { + minlength: 3, + required: true + }, + Question: { + text: { + maxlength: 255, + required: true + }, + rank: { + required: true, + min: 1, + defaultValue: 1 + } + }, + Choice: { + text: { + maxlength: 255, + required: true + } + }, + nbQuestionsMin: 1, + nbQuestionsMax: 10, + nbChoicesMax: 10, + nbTagsMin: 0, + nbTagsMax: 0, + // 0 = not max + // JSON and HTML dir + dirCacheQuestionnaires: "datas/questionnaires", + dirCacheQuestions: "datas/questionnaires/questions", + dirCacheUsersQuestionnaires: "datas/users/questionnaires", + dirCacheTags: "datas/questionnaires/tags", + dirHTMLQuestionnaire: "front/public/quiz", + dirHTMLTags: "front/public/quizs", + dirWebQuestionnaire: "quiz", + //pour url page + dirWebTags: "quizs" // idem + +}; + +/***/ }), + +/***/ "../config/users.js": +/*!**************************!*\ + !*** ../config/users.js ***! + \**************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + // API'routes (after "apiUrl" defined in instance.js) + userRoutes: "/user", + subscribeRoute: "/signup", + getGodfatherRoute: "/getgodfatherid", + checkIfIsEmailfreeRoute: "/isemailfree", + checkSubscribeTokenRoute: "/validation/", + checkLoginRoute: "/checklogin/", + connectionRoute: "/login", + getLoginLinkRoute: "/getloginlink", + connectionWithLinkRoute: "/checkloginlink", + getUserInfos: "/get/", + createUserRoute: "/create", + validateUserRoute: "/validate/", + updateUserInfos: "/modify/", + searchUserRoute: "/search/", + getGodChilds: "/getgodchilds/", + checkNewLoginLinkRoute: "/confirmnewlogin/", + checkDeleteLinkRoute: "/confirmdelete/", + getPayments: "/payment/getforoneuser/", + unsubscribeRoute: "/subscription/stop/", + getAdminStats: "/getadminstats/", + // forms : à compléter avec valeurs par défaut, etc. cf modèle + name: { + maxlength: 70, + required: true + }, + email: { + maxlength: 255, + required: true + }, + password: { + minlength: 8, + maxlength: 72, + required: true + }, + // https://www.npmjs.com/package/bcrypt#security-issues-and-concerns + newPassword: { + minlength: 8, + maxlength: 72 + }, + codeGodfather: { + maxlength: 255 + }, + cguOk: { + value: "true", + required: true + }, + timeDifferenceMin: -720, + timeDifferenceMax: 840, + // JSON dir + dirCacheUsers: "datas/users", + dirCacheUsersAnswers: "datas/users/questionnaires/answers" +}; + +/***/ }), + +/***/ "../tools/main.js": +/*!************************!*\ + !*** ../tools/main.js ***! + \************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +// Quelques fonctions utiles pour les chaînes +var Tool = /*#__PURE__*/function () { + function Tool() { + _classCallCheck(this, Tool); + } + + _createClass(Tool, null, [{ + key: "isEmpty", + value: function isEmpty(myVar) { + if (myVar === undefined || myVar === null) return true;else { + myVar += ""; // si autre chose qu'une chaîne envoyé... + + myVar = myVar.trim(); + if (myVar === "") return true;else return false; + } + } + }, { + key: "trimIfNotNull", + value: function trimIfNotNull(myString) { + if (Tool.isEmpty(myString)) myString = null;else { + myString += ""; // si autre chose qu'une chaîne envoyé... + + myString = myString.trim(); + } + return myString; + } + }, { + key: "shortenIfLongerThan", + value: function shortenIfLongerThan(myString, max) { + myString += ""; // au cas où cela ne serait pas une chaîne... + + if (myString.length > max) myString = myString.substring(0, max - 3) + "..."; + return myString; + } // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings + + }, { + key: "replaceAll", + value: function replaceAll(myString, mapObj) { + var replaceElts = new RegExp(Object.keys(mapObj).join("|"), "gi"); + return myString.replace(replaceElts, function (matched) { + return mapObj[matched]; + }); + } // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random + + }, { + key: "getRandomInt", + value: function getRandomInt(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min)) + min; + } // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country + + }, { + key: "dateFormat", + value: function dateFormat(dateString) { + var lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "fr"; + if (Tool.isEmpty(dateString)) return ""; + var myDate = new Date(dateString); + var myDay = myDate.getDate() + ""; + if (myDay.length === 1) myDay = "0" + myDay; + var myMounth = myDate.getMonth() + 1 + ""; + if (myMounth.length === 1) myMounth = "0" + myMounth; + var myYear = myDate.getFullYear(); + if (lang === "fr") return myDay + "/" + myMounth + "/" + myYear;else if (lang === "form") // 2014-02-09 + return myYear + "-" + myMounth + "-" + myDay;else return myMounth + "/" + myDay + "/" + myYear; + } + }]); + + return Tool; +}(); + +module.exports = Tool; + +/***/ }), + +/***/ "../views sync recursive ^\\.\\/.*\\.js$": +/*!**********************************!*\ + !*** ../views sync ^\.\/.*\.js$ ***! + \**********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./default/config/fr.js": "../views/default/config/fr.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../views sync recursive ^\\.\\/.*\\.js$"; + +/***/ }), + +/***/ "../views/default/config/fr.js": +/*!*************************************!*\ + !*** ../views/default/config/fr.js ***! + \*************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + headLinks: [{ + anchor: "Accueil", + attributes: { + href: "/" + } + }, { + anchor: "Mon compte", + attributes: { + href: "/connexion.hmt", + id: "accountHeadLink" + } + }, { + anchor: "À propos", + attributes: { + href: "/a-propos.html" + } + }, { + anchor: "Contact", + attributes: { + href: "/contact.html" + } + }], + footLinks: [{ + anchor: "Crédits", + attributes: { + href: "/credits.html" + } + }, { + anchor: "Mentions légales", + attributes: { + href: "/mentions-legales.html", + rel: "nofollow" + } + }, { + anchor: "Données personnelles", + attributes: { + href: "/donnees.html" + } + }, { + anchor: "C.G.U.", + attributes: { + href: "/cgu.html", + rel: "nofollow" + } + }, { + anchor: "C.G.V.", + attributes: { + href: "/cgv.html", + rel: "nofollow" + } + }], + maxQuestionnairesByPage: 10, + userHomePage: "accueil.html", + adminHomePage: "admin.html", + managerHomePage: "gestion.html", + subscribePage: "inscription.html", + connectionPage: "connexion.html", + accountPage: "compte.html", + questionnairesManagementPage: "gestion-quizs.html", + usersManagementPage: "gestion-utilisateurs.html", + nbQuestionnairesUserHomePage: 10, + illustrationDir: "/img/quizs/", + siteSlogan: "Cultivons notre jardin !", + homeTitle1: "De nature curieuse ?", + homeP1: "Avec WikiLerni vous apprenez chaque jour de nouvelles choses.
    Des articles de Wikipédia sont sélectionnés pour vous et sont suivis d'un quiz vous permettant de tester ce que vous en avez retenu.
    De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre \"jardin\".", + homeTitle2: "La culture en liberté", + homeP2: "Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
    Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
    Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
    Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.

    (*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.", + newQuestionnairesTitle: "Les derniers quizs publiés sur WikiLerni", + newQuestionnairesIntro: "Liste des derniers quizs publiés sur WikiLerni.", + explanationTitle: "Vous découvrez WikiLerni ?", + explanationTxt: "Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
    Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.

    Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.

    Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)

    Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
    Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.

    Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.", + noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript." +}; + +/***/ }), + +/***/ "./src/index.js": +/*!**********************!*\ + !*** ./src/index.js ***! + \**********************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ "../config/instance.js"); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js"); +/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/users.js */ "./src/tools/users.js"); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + +// -- SCRIPT DE BASE APPELÉ DANS LES PAGES TYPE ACCUEIL DU SITE +// Fichier de configuration tirés du backend : + +var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0]; + +var configTemplate = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); + + + + +Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_2__["helloDev"])(); // Test de connexion de l'utilisateur pour adapter le lien du menu... + +var initialise = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + var isConnected, user; + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _context.prev = 0; + _context.next = 3; + return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_3__["checkSession"])(); + + case 3: + isConnected = _context.sent; + + if (isConnected) { + // on change le lien du compte en haut + user = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("user", true); + Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_2__["updateAccountLink"])(user.status, configTemplate); + } else {// ici on pourra éventuellement charger matomo, etc. + } + + _context.next = 10; + break; + + case 7: + _context.prev = 7; + _context.t0 = _context["catch"](0); + console.error(_context.t0); + + case 10: + case "end": + return _context.stop(); + } + } + }, _callee, null, [[0, 7]]); + })); + + return function initialise() { + return _ref.apply(this, arguments); + }; +}(); + +initialise(); + +/***/ }), + +/***/ "./src/tools/clientstorage.js": +/*!************************************!*\ + !*** ./src/tools/clientstorage.js ***! + \************************************/ +/*! exports provided: saveLocaly, getLocaly, removeLocaly */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveLocaly", function() { return saveLocaly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaly", function() { return getLocaly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeLocaly", function() { return removeLocaly; }); +// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.) +// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie +var saveLocaly = function saveLocaly(name, data) { + localStorage.setItem(name, JSON.stringify(data)); +}; +var getLocaly = function getLocaly(name) { + var json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name); +}; +var removeLocaly = function removeLocaly(name) { + localStorage.removeItem(name); +}; + +/***/ }), + +/***/ "./src/tools/everywhere.js": +/*!*********************************!*\ + !*** ./src/tools/everywhere.js ***! + \*********************************/ +/*! exports provided: helloDev, updateAccountLink */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "helloDev", function() { return helloDev; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateAccountLink", function() { return updateAccountLink; }); +// Ce script fournit des fonctions utilisées sur toutes les pages du site +var helloDev = function helloDev() { + console.log("**** Hello ami développeur :-)\n Le code de WikiLerni est libre et est lisible sur gitlab : \n Bonne lecture :-) \n Pour les suggestions d'amélioration ou questions : dev@wililerni.com ****"); + return true; +}; +var updateAccountLink = function updateAccountLink(status, configTemplate) { + var link = document.getElementById("accountHeadLink"); + var homePage = status + "HomePage"; + link.href = "/" + configTemplate[homePage]; +}; + +/***/ }), + +/***/ "./src/tools/users.js": +/*!****************************!*\ + !*** ./src/tools/users.js ***! + \****************************/ +/*! exports provided: getConfig, getTimeDifference, getPassword, setSession, checkAnswerDatas, checkSession */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getConfig", function() { return getConfig; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTimeDifference", function() { return getTimeDifference; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getPassword", function() { return getPassword; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setSession", function() { return setSession; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkAnswerDatas", function() { return checkAnswerDatas; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkSession", function() { return checkSession; }); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/instance.js */ "../config/instance.js"); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../config/users.js */ "../config/users.js"); +/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_3__); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + + +var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0]; + +var configTemplate = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); + + + + // Récupère les données de configuration des utilisateurs +// À terme, un fichier statique importable comme module devrait éviter une requête ajax + +var getConfig = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + return _context.abrupt("return", new Promise(function (resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + "/user/getconfig"); + + xhr.onload = function () { + return resolve(JSON.parse(xhr.responseText)); + }; + + xhr.onerror = function () { + return reject(xhr.statusText); + }; + + xhr.send(); + })); + + case 1: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + + return function getConfig() { + return _ref.apply(this, arguments); + }; +}(); +var getTimeDifference = function getTimeDifference() { + var timeLocal = new Date().getTimezoneOffset(); + if (timeLocal > _config_users_js__WEBPACK_IMPORTED_MODULE_1__["timeDifferenceMax"] || timeLocal < _config_users_js__WEBPACK_IMPORTED_MODULE_1__["timeDifferenceMin"]) return 0;else return timeLocal; +}; // On enlève volontairement les 0/O pour éviter les confusions ! +// Et mieux vaut aussi débuter et finir par une lettre simple. + +var getPassword = function getPassword(nbCarMin, nbCarMax) { + var nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin)); + var letters = "ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz"; + var others = "123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ"; + var password = letters[Math.floor(Math.random() * letters.length)]; + + for (var i = 1; i < nbCar - 1; i++) { + if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)]; + } + + password += letters[Math.floor(Math.random() * letters.length)]; + return password; +}; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite +// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides. + +var setSession = function setSession(userId, token, durationTS) { + var storageUser = { + id: userId, + token: token, + duration: durationTS + }; + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("user", storageUser); +}; // Vérifie qu'il y a des données locales concernant le résultat d'un quiz +// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas + +var checkAnswerDatas = function checkAnswerDatas(datas) { + var lastAnswer = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("lastAnswer"); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(lastAnswer)) { + var answer = JSON.parse(lastAnswer); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.duration) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbCorrectAnswers) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.QuestionnaireId) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbQuestions)) { + datas.duration = answer.duration; + datas.nbCorrectAnswers = answer.nbCorrectAnswers; + datas.QuestionnaireId = answer.QuestionnaireId; + datas.nbQuestions = answer.nbQuestions; + } + } + + return datas; +}; // Cette fonction teste la connexion de l'utilisateur d'une page +// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté + +var checkSession = /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() { + var status, + urlRedirection, + message, + urlWanted, + _args2 = arguments; + return regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + status = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : []; + urlRedirection = _args2.length > 1 ? _args2[1] : undefined; + message = _args2.length > 2 ? _args2[2] : undefined; + urlWanted = _args2.length > 3 ? _args2[3] : undefined; + return _context2.abrupt("return", new Promise(function (resolve, reject) { + var userDatas = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("user"); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(userDatas)) { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else { + var user = JSON.parse(userDatas); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.id) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.token) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.duration) || user.duration < Date.now()) { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else { + var xhr = new XMLHttpRequest(); + xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["userRoutes"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["checkLoginRoute"] + user.token); + + xhr.onload = function () { + var response = JSON.parse(xhr.responseText); + + if (xhr.status === 200 && response.isValid && response.id != undefined) { + if (response.id === user.id) { + user.name = response.name; + user.language = response.language; + user.timeDifference = response.timeDifference; + user.status = response.status; // le token et de toute façon vérifier à chaque requête à l'API + + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("user", user); // si il s'agit d'un "user" et que son abonnement a expiré, je le redirige vers la caisse :-) + + if (response.status === "user" && response.nbDaysOk <= 0) { + var urlAccount = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["siteUrl"] + "/" + configTemplate[lang].accountPage; + if (window.location.href.indexOf(urlAccount) === -1) window.location.assign("/" + configTemplate[lang].accountPage); // passée directement ici, l'ancre #subscribe ne fonctionne pas !? + + resolve(true); + } else { + if (status.length !== 0 && status.indexOf(response.status) === -1) { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else resolve(true); + } + } else { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + } else { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + }; + + xhr.onerror = function () { + return reject(xhr.statusText); + }; + + xhr.send(); + } + } + })); + + case 5: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + + return function checkSession() { + return _ref2.apply(this, arguments); + }; +}(); // Cette fonction sert à la précédente en cas de connexion non valide + +var redirectUser = function redirectUser(urlRedirection, message, urlWanted) { + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(message)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("message", message); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlWanted)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("url", urlWanted); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlRedirection)) window.location.assign(urlRedirection); +}; + +/***/ }) + +/******/ }); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL3Rvb2xzL21haW4uanMiLCJ3ZWJwYWNrOi8vLy4uL3ZpZXdzIHN5bmMgXlxcLlxcLy4qXFwuanMkIiwid2VicGFjazovLy8uLi92aWV3cy9kZWZhdWx0L2NvbmZpZy9mci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2V2ZXJ5d2hlcmUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL3VzZXJzLmpzIl0sIm5hbWVzIjpbInVzZXJzIiwicmVxdWlyZSIsInF1ZXN0aW9ubmFpcmVzIiwibW9kdWxlIiwiZXhwb3J0cyIsImFwaVVybCIsInNpdGVVcmwiLCJhZG1pbk5hbWUiLCJhZG1pbkVtYWlsIiwic2VuZGVyTmFtZSIsInNlbmRlckVtYWlsIiwiYWRtaW5MYW5nIiwidGhlbWUiLCJhdmFpbGFibGVMYW5ncyIsInNpdGVOYW1lIiwiYmVnaW5Db2RlR29kZmF0aGVyIiwiY3JvblRpbWluZ0FsZXJ0SW5TZWNvbmRlIiwicmVzcG9uc2VUaW1pbmdBbGVydEluU2Vjb25kZSIsInRva2VuU2lnbnVwVmFsaWRhdGlvblRpbWVJbkhvdXJzIiwidG9rZW5Mb2dpbkxpbmtUaW1lSW5Ib3VycyIsInRva2VuQ29ubmV4aW9uTWluVGltZUluSG91cnMiLCJ0b2tlbkNvbm5leGlvbk1heFRpbWVJbkRheXMiLCJ0b2tlbkxvZ2luQ2hhbmdpbmdUaW1lSW5Ib3VycyIsInRva2VuRGVsZXRlVXNlclRpbWVJbkhvdXJzIiwidG9rZW5VbnN1YnNjcmliZUxpbmtUaW1lSW5EYXlzIiwiZnJlZUFjY291bnRUaW1pbmdJbkRheXMiLCJmcmVlQWNjb3VudEV4cGlyYXRpb25Ob3RpZmljYXRpb25JbkRheXMiLCJhY2NvdW50RXhwaXJhdGlvbkZpcnN0Tm90aWZpY2F0aW9uSW5EYXlzIiwiYWNjb3VudEV4cGlyYXRpb25TZWNvbmROb3RpZmljYXRpb25JbkRheXMiLCJpbmFjdGl2ZUFjY291bnRUaW1lVG9EZWxldGVJbkRheXMiLCJuYlF1ZXN0aW9uc01pbiIsIm5iUXVlc3Rpb25zTWF4IiwibmJDaG9pY2VzTWF4IiwibmJOZXdRdWVzdGlvbm5haXJlcyIsImhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUJlZ2luIiwiaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlRW5kIiwibnVtYmVyTmV3UXVlc3Rpb25uYWlyZUF0U2FtZVRpbWUiLCJtaW5TZWFyY2hRdWVzdGlvbm5haXJlcyIsIm5iSWxsdXN0cmF0aW9uc01pbiIsIm5iSWxsdXN0cmF0aW9uc01heCIsIm1heElsbHVzdHJhdGlvblNpemVpbk9jdGV0IiwibWltZVR5cGVzRm9ySWxsdXN0cmF0aW9uIiwiaWxsdXN0cmF0aW9uc1dpZHRoTWF4SW5QeCIsImlsbHVzdHJhdGlvbnNNaW5pYXR1cmVzV2lkdGhNYXhJblB4IiwibmJMaW5rc01pbiIsIm5iTGlua3NNYXgiLCJwYXNzd29yZCIsIm1pbmxlbmd0aCIsImRpckNhY2hlVXNlcnMiLCJkaXJDYWNoZVVzZXJzQW5zd2VycyIsImRpckNhY2hlUXVlc3Rpb25uYWlyZXMiLCJkaXJDYWNoZVF1ZXN0aW9ucyIsImRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlcyIsImRpckhUTUxRdWVzdGlvbm5haXJlIiwiZGlyV2ViUXVlc3Rpb25uYWlyZSIsInF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJnZXRRdWVzdGlvbm5haXJlUm91dGVzIiwicHJldmlld1F1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJwdWJsaXNoZWRRdWVzdGlvbm5haXJlUm91dGVzIiwic2F2ZUFuc3dlcnNSb3V0ZSIsImdldFN0YXRzUXVlc3Rpb25uYWlyZXMiLCJzZWFyY2hRdWVzdGlvbm5haXJlc1JvdXRlIiwic2VhcmNoQWRtaW5RdWVzdGlvbm5haXJlc1JvdXRlIiwiZ2V0TGlzdE5leHRRdWVzdGlvbm5haXJlcyIsInF1ZXN0aW9uc1JvdXRlIiwidGFnc1NlYXJjaFJvdXRlIiwiZ2V0UXVlc3Rpb25uYWlyZXNXaXRob3V0QW5zd2VyIiwiZ2V0UHJldmlvdXNBbnN3ZXJzIiwiZ2V0U3RhdHNBbnN3ZXJzIiwiZ2V0QWRtaW5TdGF0cyIsIlF1ZXN0aW9ubmFpcmUiLCJ0aXRsZSIsIm1heGxlbmd0aCIsInJlcXVpcmVkIiwic2x1ZyIsImludHJvZHVjdGlvbiIsInNlYXJjaFF1ZXN0aW9ubmFpcmVzIiwiUXVlc3Rpb24iLCJ0ZXh0IiwicmFuayIsIm1pbiIsImRlZmF1bHRWYWx1ZSIsIkNob2ljZSIsIm5iVGFnc01pbiIsIm5iVGFnc01heCIsImRpckNhY2hlVGFncyIsImRpckhUTUxUYWdzIiwiZGlyV2ViVGFncyIsInVzZXJSb3V0ZXMiLCJzdWJzY3JpYmVSb3V0ZSIsImdldEdvZGZhdGhlclJvdXRlIiwiY2hlY2tJZklzRW1haWxmcmVlUm91dGUiLCJjaGVja1N1YnNjcmliZVRva2VuUm91dGUiLCJjaGVja0xvZ2luUm91dGUiLCJjb25uZWN0aW9uUm91dGUiLCJnZXRMb2dpbkxpbmtSb3V0ZSIsImNvbm5lY3Rpb25XaXRoTGlua1JvdXRlIiwiZ2V0VXNlckluZm9zIiwiY3JlYXRlVXNlclJvdXRlIiwidmFsaWRhdGVVc2VyUm91dGUiLCJ1cGRhdGVVc2VySW5mb3MiLCJzZWFyY2hVc2VyUm91dGUiLCJnZXRHb2RDaGlsZHMiLCJjaGVja05ld0xvZ2luTGlua1JvdXRlIiwiY2hlY2tEZWxldGVMaW5rUm91dGUiLCJnZXRQYXltZW50cyIsInVuc3Vic2NyaWJlUm91dGUiLCJuYW1lIiwiZW1haWwiLCJuZXdQYXNzd29yZCIsImNvZGVHb2RmYXRoZXIiLCJjZ3VPayIsInZhbHVlIiwidGltZURpZmZlcmVuY2VNaW4iLCJ0aW1lRGlmZmVyZW5jZU1heCIsIlRvb2wiLCJteVZhciIsInVuZGVmaW5lZCIsInRyaW0iLCJteVN0cmluZyIsImlzRW1wdHkiLCJtYXgiLCJsZW5ndGgiLCJzdWJzdHJpbmciLCJtYXBPYmoiLCJyZXBsYWNlRWx0cyIsIlJlZ0V4cCIsIk9iamVjdCIsImtleXMiLCJqb2luIiwicmVwbGFjZSIsIm1hdGNoZWQiLCJNYXRoIiwiY2VpbCIsImZsb29yIiwicmFuZG9tIiwiZGF0ZVN0cmluZyIsImxhbmciLCJteURhdGUiLCJEYXRlIiwibXlEYXkiLCJnZXREYXRlIiwibXlNb3VudGgiLCJnZXRNb250aCIsIm15WWVhciIsImdldEZ1bGxZZWFyIiwiaGVhZExpbmtzIiwiYW5jaG9yIiwiYXR0cmlidXRlcyIsImhyZWYiLCJpZCIsImZvb3RMaW5rcyIsInJlbCIsIm1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlIiwidXNlckhvbWVQYWdlIiwiYWRtaW5Ib21lUGFnZSIsIm1hbmFnZXJIb21lUGFnZSIsInN1YnNjcmliZVBhZ2UiLCJjb25uZWN0aW9uUGFnZSIsImFjY291bnRQYWdlIiwicXVlc3Rpb25uYWlyZXNNYW5hZ2VtZW50UGFnZSIsInVzZXJzTWFuYWdlbWVudFBhZ2UiLCJuYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlIiwiaWxsdXN0cmF0aW9uRGlyIiwic2l0ZVNsb2dhbiIsImhvbWVUaXRsZTEiLCJob21lUDEiLCJob21lVGl0bGUyIiwiaG9tZVAyIiwibmV3UXVlc3Rpb25uYWlyZXNUaXRsZSIsIm5ld1F1ZXN0aW9ubmFpcmVzSW50cm8iLCJleHBsYW5hdGlvblRpdGxlIiwiZXhwbGFuYXRpb25UeHQiLCJub0pTTm90aWZpY2F0aW9uIiwiY29uZmlnVGVtcGxhdGUiLCJoZWxsb0RldiIsImluaXRpYWxpc2UiLCJjaGVja1Nlc3Npb24iLCJpc0Nvbm5lY3RlZCIsInVzZXIiLCJnZXRMb2NhbHkiLCJ1cGRhdGVBY2NvdW50TGluayIsInN0YXR1cyIsImNvbnNvbGUiLCJlcnJvciIsInNhdmVMb2NhbHkiLCJkYXRhIiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsIkpTT04iLCJzdHJpbmdpZnkiLCJqc29uIiwicGFyc2UiLCJnZXRJdGVtIiwicmVtb3ZlTG9jYWx5IiwicmVtb3ZlSXRlbSIsImxvZyIsImxpbmsiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwiaG9tZVBhZ2UiLCJnZXRDb25maWciLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInhociIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsIm9ubG9hZCIsInJlc3BvbnNlVGV4dCIsIm9uZXJyb3IiLCJzdGF0dXNUZXh0Iiwic2VuZCIsImdldFRpbWVEaWZmZXJlbmNlIiwidGltZUxvY2FsIiwiZ2V0VGltZXpvbmVPZmZzZXQiLCJnZXRQYXNzd29yZCIsIm5iQ2FyTWluIiwibmJDYXJNYXgiLCJuYkNhciIsImxldHRlcnMiLCJvdGhlcnMiLCJpIiwic2V0U2Vzc2lvbiIsInVzZXJJZCIsInRva2VuIiwiZHVyYXRpb25UUyIsInN0b3JhZ2VVc2VyIiwiZHVyYXRpb24iLCJjaGVja0Fuc3dlckRhdGFzIiwiZGF0YXMiLCJsYXN0QW5zd2VyIiwiYW5zd2VyIiwibmJDb3JyZWN0QW5zd2VycyIsIlF1ZXN0aW9ubmFpcmVJZCIsIm5iUXVlc3Rpb25zIiwidXJsUmVkaXJlY3Rpb24iLCJtZXNzYWdlIiwidXJsV2FudGVkIiwidXNlckRhdGFzIiwicmVkaXJlY3RVc2VyIiwibm93IiwicmVzcG9uc2UiLCJpc1ZhbGlkIiwibGFuZ3VhZ2UiLCJ0aW1lRGlmZmVyZW5jZSIsIm5iRGF5c09rIiwidXJsQWNjb3VudCIsIndpbmRvdyIsImxvY2F0aW9uIiwiaW5kZXhPZiIsImFzc2lnbiJdLCJtYXBwaW5ncyI6IjtRQUFBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBOzs7UUFHQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFD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SjtBQUNIO0FBQ0o7QUFDSixhQXRFTSxDQUZpQjs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxHQUFIOztBQUFBLGtCQUFabkMsWUFBWTtBQUFBO0FBQUE7QUFBQSxHQUFsQixDLENBMEVQOztBQUNBLElBQU0rRCxZQUFZLEdBQUcsU0FBZkEsWUFBZSxDQUFDSixjQUFELEVBQWlCQyxPQUFqQixFQUEwQkMsU0FBMUIsRUFDckI7QUFDSSxNQUFHLENBQUN0SCwyREFBTyxDQUFDcUgsT0FBRCxDQUFYLEVBQ0lwRCxvRUFBVSxDQUFDLFNBQUQsRUFBWW9ELE9BQVosQ0FBVjtBQUNKLE1BQUcsQ0FBQ3JILDJEQUFPLENBQUNzSCxTQUFELENBQVgsRUFDSXJELG9FQUFVLENBQUMsS0FBRCxFQUFRcUQsU0FBUixDQUFWO0FBQ0osTUFBRyxDQUFDdEgsMkRBQU8sQ0FBQ29ILGNBQUQsQ0FBWCxFQUNJWSxNQUFNLENBQUNDLFFBQVAsQ0FBZ0JFLE1BQWhCLENBQXVCZixjQUF2QjtBQUNQLENBUkQsQyIsImZpbGUiOiIuL0pTL2luZGV4LmFwcC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL2luZGV4LmpzXCIpO1xuIiwiY29uc3QgdXNlcnMgPSByZXF1aXJlKFwiLi91c2Vyc1wiKTtcbmNvbnN0IHF1ZXN0aW9ubmFpcmVzID0gcmVxdWlyZShcIi4vcXVlc3Rpb25uYWlyZXNcIik7XG5cbm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBhcGlVcmw6IFwiaHR0cDovL2xvY2FsaG9zdDozMDAwL2FwaVwiLFxuICAgIHNpdGVVcmw6IFwiaHR0cDovL2xvY2FsaG9zdDo4MDgwXCIsXG4gICAgYWRtaW5OYW1lOiBcIkZhYnJpY2VcIixcbiAgICBhZG1pbkVtYWlsOiBcImRldkB3aWtpbGVybmkuY29tXCIsXG4gICAgc2VuZGVyTmFtZTogXCJXaWtpTGVybmlcIixcbiAgICBzZW5kZXJFbWFpbDogXCJib25qb3VyQHdpa2lsZXJuaS5jb21cIixcbiAgICBhZG1pbkxhbmc6IFwiZnJcIixcbiAgICB0aGVtZTogXCJkZWZhdWx0XCIsIC8vIGxlIHRow6htZSB1dGlsaXPDqSAoZGFucyAvdmlld3MpIHBvdXIgZ8OpbsOpcmVyIGxlcyBwYWdlcyBIVE1MLiBDb250aWVudCBzZXMgcHJvcHJlcyBmaWNoaWVycyBkZSBjb25maWd1cmF0aW9uLlxuICAgIGF2YWlsYWJsZUxhbmdzOiBbXCJmclwiXSwvLyBMYW5ndWFnZXMgaW4gd2hpY2ggdGhlIHNpdGUgaXMgYXZhaWxhYmxlLiBUaGUgZmlyc3Qgb25lIGlzIHRoZSBkZWZhdWx0IG9uZS5cbiAgICBzaXRlTmFtZTogXCJXaWtpTGVybmlcIixcbiAgICBiZWdpbkNvZGVHb2RmYXRoZXI6IFwid2lraWxlcm5pXCIsIC8vIGNhc2Utc2Vuc2l0aXZlIGFuZCBjYW4ndCBjb250YWluIFwiQFwiICFcbiAgICBjcm9uVGltaW5nQWxlcnRJblNlY29uZGU6IDEyMCwgLy8gZm9yIGxvZ3NcbiAgICByZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlOiAzLCAvLyBpZGVtXG4gICAgdG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnM6IFwiNDhoXCIsIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96ZWl0L21zXG4gICAgdG9rZW5Mb2dpbkxpbmtUaW1lSW5Ib3VyczogXCIxaFwiLFxuICAgIHRva2VuQ29ubmV4aW9uTWluVGltZUluSG91cnM6IFwiMjRoXCIsXG4gICAgdG9rZW5Db25uZXhpb25NYXhUaW1lSW5EYXlzOiBcIjE4MCBkYXlzXCIsXG4gICAgdG9rZW5Mb2dpbkNoYW5naW5nVGltZUluSG91cnM6IFwiMWhcIiwvLyBmb3IgZW1haWwgJiBwYXNzd29yZCBjaGFuZ2luZ1xuICAgIHRva2VuRGVsZXRlVXNlclRpbWVJbkhvdXJzOiBcIjFoXCIsXG4gICAgdG9rZW5VbnN1YnNjcmliZUxpbmtUaW1lSW5EYXlzOiBcIjcgZGF5c1wiLCAvLyB0b2tlbiBzZW5kIHdpdGggc3Vic2NyaXB0aW9uJ3MgZW1haWxzXG4gICAgZnJlZUFjY291bnRUaW1pbmdJbkRheXM6IDEwLFxuICAgIGZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5czogNSxcbiAgICBhY2NvdW50RXhwaXJhdGlvbkZpcnN0Tm90aWZpY2F0aW9uSW5EYXlzOiAxNCwgICAgXG4gICAgYWNjb3VudEV4cGlyYXRpb25TZWNvbmROb3RpZmljYXRpb25JbkRheXM6IDUsXG4gICAgaW5hY3RpdmVBY2NvdW50VGltZVRvRGVsZXRlSW5EYXlzOiAxODAsXG4gICAgLy8gUXVlc3Rpb25uYWlyZXM6XG4gICAgbmJRdWVzdGlvbnNNaW46IDEsIC8vIG1pbmltdW0gbnVtYmVyIG9mIHF1ZXN0aW9ucyBmb3IgdGhlIHF1ZXN0aW9ubmFpcmUgdG8gYmUgcHVibGlzaGFibGVcbiAgICBuYlF1ZXN0aW9uc01heDogMTAsIC8vIGlmIDAgPSBub3QgbWF4aW11bVxuICAgIG5iQ2hvaWNlc01heDogMTAsXG4gICAgbmJOZXdRdWVzdGlvbm5haXJlczogMTAsLy8gZm9yIFJTUywgZXRjLlxuICAgIGhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUJlZ2luOjEsIC8vIGluIHVzZXIgbG9jYWwgdGltZVxuICAgIGhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUVuZDoyNCwgLy8gaWRlbVxuICAgIG51bWJlck5ld1F1ZXN0aW9ubmFpcmVBdFNhbWVUaW1lOiA1MCwgLy8gZm9yIG1hc3MgbWFpbGluZ1xuICAgIG1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzOiAzLFxuICAgIC8vIElsbHVzdHJhdGlvbnM6XG4gICAgbmJJbGx1c3RyYXRpb25zTWluOiAwLFxuICAgIG5iSWxsdXN0cmF0aW9uc01heDogMSxcbiAgICBtYXhJbGx1c3RyYXRpb25TaXplaW5PY3RldDogMTAwMDAwMCwvLyBwYXMgY29udHLDtGzDqSBwb3VyIGwnaW5zdGFudC4gw4AgcmV2b2lyLlxuICAgIG1pbWVUeXBlc0ZvcklsbHVzdHJhdGlvbjogWyBcImltYWdlL2pwZ1wiLCBcImltYWdlL2pwZWdcIiwgXCJpbWFnZS9wbmdcIiwgXCJpbWFnZS9naWZcIiwgXCJpbWFnZS9wbmdcIiBdLFxuICAgIC8vIC0tIFVwbG9hZCBhbmQgcmVzaXplOlxuICAgIGlsbHVzdHJhdGlvbnNXaWR0aE1heEluUHg6IDQwMCxcbiAgICBpbGx1c3RyYXRpb25zTWluaWF0dXJlc1dpZHRoTWF4SW5QeDogMjAwLFxuICAgIC8vIExpbmtzOlxuICAgIG5iTGlua3NNaW46IDEsXG4gICAgbmJMaW5rc01heDogMSxcbiAgICAvLyDDoCBzdXBwcmltZXIgcXVhbmQgdG91cyBsZXMgXCJyZXF1aXJlXCIgw6Agam91cjpcbiAgICBuYlF1ZXN0aW9uc01pbjogcXVlc3Rpb25uYWlyZXMubmJRdWVzdGlvbnNNaW4sXG4gICAgbmJRdWVzdGlvbnNNYXg6IHF1ZXN0aW9ubmFpcmVzLm5iUXVlc3Rpb25zTWF4LFxuICAgIG5iQ2hvaWNlc01heDogcXVlc3Rpb25uYWlyZXMubmJDaG9pY2VzTWF4LFxuICAgIHBhc3N3b3JkTWluTGVuZ3RoOiB1c2Vycy5wYXNzd29yZC5taW5sZW5ndGgsXG4gICAgZGlyQ2FjaGVVc2VyczogdXNlcnMuZGlyQ2FjaGVVc2VycyxcbiAgICBkaXJDYWNoZVVzZXJzQW5zd2VyczogdXNlcnMuZGlyQ2FjaGVVc2Vyc0Fuc3dlcnMsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbm5haXJlczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyxcbiAgICBkaXJDYWNoZVF1ZXN0aW9uczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVRdWVzdGlvbnMsXG4gICAgZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzOiBxdWVzdGlvbm5haXJlcy5kaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXMsXG4gICAgZGlySFRNTFF1ZXN0aW9ubmFpcmU6IHF1ZXN0aW9ubmFpcmVzLmRpckhUTUxRdWVzdGlvbm5haXJlLFxuICAgIGRpcldlYlF1ZXN0aW9ubmFpcmU6IHF1ZXN0aW9ubmFpcmVzLmRpcldlYlF1ZXN0aW9ubmFpcmVcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxueyAgICBcbiAgICAvLyBBUEkncm91dGVzIChhZnRlciBcImFwaVVybFwiIGRlZmluZWQgaW4gaW5zdGFuY2UuanMpXG4gICAgcXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcXVlc3Rpb25uYWlyZVwiLFxuICAgIGdldFF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL2dldFwiLFxuICAgIHByZXZpZXdRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9wcmV2aWV3XCIsXG4gICAgcHVibGlzaGVkUXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcXVpei9cIixcbiAgICBzYXZlQW5zd2Vyc1JvdXRlOiBcIi9hbnN3ZXIvXCIsXG4gICAgZ2V0U3RhdHNRdWVzdGlvbm5haXJlcyA6IFwiL3N0YXRzL1wiLFxuICAgIHNlYXJjaFF1ZXN0aW9ubmFpcmVzUm91dGUgOiBcIi9zZWFyY2hcIixcbiAgICBzZWFyY2hBZG1pblF1ZXN0aW9ubmFpcmVzUm91dGUgOiBcIi9zZWFyY2hhZG1pblwiLFxuICAgIGdldExpc3ROZXh0UXVlc3Rpb25uYWlyZXM6IFwiL2dldGxpc3RuZXh0cXVlc3Rpb25uYWlyZXMvXCIsXG4gICAgLy8gLS0gcXVlc3Rpb25zICYgY2hvaWNlcyA6XG4gICAgcXVlc3Rpb25zUm91dGU6IFwiL3F1ZXN0aW9uL1wiLFxuICAgIC8vIC0tIHRhZ3MgOlxuICAgIHRhZ3NTZWFyY2hSb3V0ZTogXCIvdGFncy9zZWFyY2gvXCIsXG4gICAgLy8gLS0gYW5zd2VycyA6XG4gICAgZ2V0UXVlc3Rpb25uYWlyZXNXaXRob3V0QW5zd2VyOiBcIi93aXRob3V0YW5zd2VyL3VzZXIvXCIsXG4gICAgZ2V0UHJldmlvdXNBbnN3ZXJzOiBcIi91c2VyL2Fuc3dlcnMvXCIsXG4gICAgZ2V0U3RhdHNBbnN3ZXJzIDogXCIvdXNlci9hbndzd2Vycy9zdGF0cy9cIixcbiAgICBnZXRBZG1pblN0YXRzOiBcIi9nZXRhZG1pbnN0YXRzL1wiLFxuICAgIC8vIGZvcm1zIDogw6AgY29tcGzDqXRlciBhdmVjIHZhbGV1cnMgcGFyIGTDqWZhdXQsIGV0Yy4gY2YgbW9kw6hsZVxuICAgIFF1ZXN0aW9ubmFpcmUgOlxuICAgIHtcbiAgICAgICAgdGl0bGU6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgIHNsdWc6IHsgbWF4bGVuZ3RoOiAxNTAgfSwgLy8gY2hhbXAgcmVxdWlzIG1haXMgY2FsY3Vsw6kgw6AgcGFydGlyIGR1IHRpdHJlIHFkIHZpZGVcbiAgICAgICAgaW50cm9kdWN0aW9uOiB7IHJlcXVpcmVkOiB0cnVlIH1cbiAgICB9LFxuICAgIHNlYXJjaFF1ZXN0aW9ubmFpcmVzIDogeyBtaW5sZW5ndGg6IDMsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgUXVlc3Rpb24gOlxuICAgIHtcbiAgICAgICAgdGV4dDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgcmFuazogeyByZXF1aXJlZDogdHJ1ZSwgbWluOjEsIGRlZmF1bHRWYWx1ZToxIH1cbiAgICB9LCAgICAgICAgICBcbiAgICBDaG9pY2UgOlxuICAgIHtcbiAgICAgICAgdGV4dDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfVxuICAgIH0sICAgICAgICAgIFxuICAgIG5iUXVlc3Rpb25zTWluOiAxLFxuICAgIG5iUXVlc3Rpb25zTWF4OiAxMCxcbiAgICBuYkNob2ljZXNNYXg6IDEwLFxuICAgIG5iVGFnc01pbjogMCxcbiAgICBuYlRhZ3NNYXg6IDAsIC8vIDAgPSBub3QgbWF4ICAgIFxuICAgIC8vIEpTT04gYW5kIEhUTUwgZGlyXG4gICAgZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXNcIixcbiAgICBkaXJDYWNoZVF1ZXN0aW9ucyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXMvcXVlc3Rpb25zXCIsXG4gICAgZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzIDogXCJkYXRhcy91c2Vycy9xdWVzdGlvbm5haXJlc1wiLFxuICAgIGRpckNhY2hlVGFncyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXMvdGFnc1wiLCAgXG4gICAgZGlySFRNTFF1ZXN0aW9ubmFpcmUgOiBcImZyb250L3B1YmxpYy9xdWl6XCIsXG4gICAgZGlySFRNTFRhZ3MgOiBcImZyb250L3B1YmxpYy9xdWl6c1wiLFxuICAgIGRpcldlYlF1ZXN0aW9ubmFpcmUgOiBcInF1aXpcIiwvL3BvdXIgdXJsIHBhZ2VcbiAgICBkaXJXZWJUYWdzIDogXCJxdWl6c1wiLy8gaWRlbVxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgLy8gQVBJJ3JvdXRlcyAoYWZ0ZXIgXCJhcGlVcmxcIiBkZWZpbmVkIGluIGluc3RhbmNlLmpzKVxuICAgIHVzZXJSb3V0ZXM6IFwiL3VzZXJcIixcbiAgICBzdWJzY3JpYmVSb3V0ZTogXCIvc2lnbnVwXCIsXG4gICAgZ2V0R29kZmF0aGVyUm91dGU6IFwiL2dldGdvZGZhdGhlcmlkXCIsXG4gICAgY2hlY2tJZklzRW1haWxmcmVlUm91dGU6IFwiL2lzZW1haWxmcmVlXCIsXG4gICAgY2hlY2tTdWJzY3JpYmVUb2tlblJvdXRlOiBcIi92YWxpZGF0aW9uL1wiLFxuICAgIGNoZWNrTG9naW5Sb3V0ZTogXCIvY2hlY2tsb2dpbi9cIixcbiAgICBjb25uZWN0aW9uUm91dGU6IFwiL2xvZ2luXCIsXG4gICAgZ2V0TG9naW5MaW5rUm91dGU6IFwiL2dldGxvZ2lubGlua1wiLFxuICAgIGNvbm5lY3Rpb25XaXRoTGlua1JvdXRlOiBcIi9jaGVja2xvZ2lubGlua1wiLFxuICAgIGdldFVzZXJJbmZvczogXCIvZ2V0L1wiLFxuICAgIGNyZWF0ZVVzZXJSb3V0ZTogXCIvY3JlYXRlXCIsXG4gICAgdmFsaWRhdGVVc2VyUm91dGU6IFwiL3ZhbGlkYXRlL1wiLFxuICAgIHVwZGF0ZVVzZXJJbmZvczogXCIvbW9kaWZ5L1wiLFxuICAgIHNlYXJjaFVzZXJSb3V0ZTogXCIvc2VhcmNoL1wiLFxuICAgIGdldEdvZENoaWxkczogXCIvZ2V0Z29kY2hpbGRzL1wiLFxuICAgIGNoZWNrTmV3TG9naW5MaW5rUm91dGU6IFwiL2NvbmZpcm1uZXdsb2dpbi9cIixcbiAgICBjaGVja0RlbGV0ZUxpbmtSb3V0ZTogXCIvY29uZmlybWRlbGV0ZS9cIixcbiAgICBnZXRQYXltZW50czogXCIvcGF5bWVudC9nZXRmb3JvbmV1c2VyL1wiLFxuICAgIHVuc3Vic2NyaWJlUm91dGU6IFwiL3N1YnNjcmlwdGlvbi9zdG9wL1wiLFxuICAgIGdldEFkbWluU3RhdHM6IFwiL2dldGFkbWluc3RhdHMvXCIsXG4gICAgLy8gZm9ybXMgOiDDoCBjb21wbMOpdGVyIGF2ZWMgdmFsZXVycyBwYXIgZMOpZmF1dCwgZXRjLiBjZiBtb2TDqGxlXG4gICAgbmFtZTogeyBtYXhsZW5ndGg6IDcwLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGVtYWlsOiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHBhc3N3b3JkOiB7IG1pbmxlbmd0aDogOCwgbWF4bGVuZ3RoOjcyLCByZXF1aXJlZDogdHJ1ZSB9LCAvLyBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9iY3J5cHQjc2VjdXJpdHktaXNzdWVzLWFuZC1jb25jZXJuc1xuICAgIG5ld1Bhc3N3b3JkOiB7IG1pbmxlbmd0aDogOCwgbWF4bGVuZ3RoOjcyIH0sXG4gICAgY29kZUdvZGZhdGhlcjogeyBtYXhsZW5ndGg6IDI1NSB9LFxuICAgIGNndU9rOiB7IHZhbHVlOiBcInRydWVcIiwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICB0aW1lRGlmZmVyZW5jZU1pbjogLTcyMCxcbiAgICB0aW1lRGlmZmVyZW5jZU1heDo4NDAsXG4gICAgLy8gSlNPTiBkaXJcbiAgICBkaXJDYWNoZVVzZXJzIDogXCJkYXRhcy91c2Vyc1wiLFxuICAgIGRpckNhY2hlVXNlcnNBbnN3ZXJzIDogXCJkYXRhcy91c2Vycy9xdWVzdGlvbm5haXJlcy9hbnN3ZXJzXCJcbn07XG4iLCIvLyBRdWVscXVlcyBmb25jdGlvbnMgdXRpbGVzIHBvdXIgbGVzIGNoYcOubmVzXG5cbmNsYXNzIFRvb2xcbntcbiAgICBzdGF0aWMgaXNFbXB0eShteVZhcilcbiAgICB7XG4gICAgICAgIGlmKG15VmFyPT09dW5kZWZpbmVkIHx8IG15VmFyPT09bnVsbClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIG15VmFyKz1cIlwiOy8vIHNpIGF1dHJlIGNob3NlIHF1J3VuZSBjaGHDrm5lIGVudm95w6kuLi5cbiAgICAgICAgICAgIG15VmFyPW15VmFyLnRyaW0oKTtcbiAgICAgICAgICAgIGlmKG15VmFyPT09XCJcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgc3RhdGljIHRyaW1JZk5vdE51bGwobXlTdHJpbmcpXG4gICAge1xuICAgICAgICBpZihUb29sLmlzRW1wdHkobXlTdHJpbmcpKVxuICAgICAgICAgICAgbXlTdHJpbmc9bnVsbDtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVN0cmluZys9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVN0cmluZz1teVN0cmluZy50cmltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG15U3RyaW5nO1xuICAgIH1cblxuXG4gICAgc3RhdGljIHNob3J0ZW5JZkxvbmdlclRoYW4obXlTdHJpbmcsIG1heClcbiAgICB7XG4gICAgICAgIG15U3RyaW5nKz1cIlwiOy8vIGF1IGNhcyBvw7kgY2VsYSBuZSBzZXJhaXQgcGFzIHVuZSBjaGHDrm5lLi4uXG4gICAgICAgaWYobXlTdHJpbmcubGVuZ3RoID4gbWF4KVxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcuc3Vic3RyaW5nKDAsIChtYXgtMykpK1wiLi4uXCI7XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cbiAgICAvLyBzb3VyY2UgOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNTYwNDE0MC9yZXBsYWNlLW11bHRpcGxlLXN0cmluZ3Mtd2l0aC1tdWx0aXBsZS1vdGhlci1zdHJpbmdzXG4gICAgc3RhdGljIHJlcGxhY2VBbGwobXlTdHJpbmcsIG1hcE9iailcbiAgICB7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VFbHRzID0gbmV3IFJlZ0V4cChPYmplY3Qua2V5cyhtYXBPYmopLmpvaW4oXCJ8XCIpLFwiZ2lcIik7XG4gICAgICAgIHJldHVybiBteVN0cmluZy5yZXBsYWNlKHJlcGxhY2VFbHRzLCAobWF0Y2hlZCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG1hcE9ialttYXRjaGVkXTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZnIvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT2JqZXRzX2dsb2JhdXgvTWF0aC9yYW5kb21cbiAgICBzdGF0aWMgZ2V0UmFuZG9tSW50KG1pbiwgbWF4KVxuICAgIHtcbiAgICAgICAgbWluID0gTWF0aC5jZWlsKG1pbik7XG4gICAgICAgIG1heCA9IE1hdGguZmxvb3IobWF4KTtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pKSArIG1pbjtcbiAgICB9XG5cbiAgICAvLyDDoCBjb21wbMOpdGVyIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGF0ZV9mb3JtYXRfYnlfY291bnRyeVxuICAgIHN0YXRpYyBkYXRlRm9ybWF0KGRhdGVTdHJpbmcsIGxhbmc9XCJmclwiKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KGRhdGVTdHJpbmcpKVxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIGxldCBteURhdGU9bmV3IERhdGUoZGF0ZVN0cmluZyk7XG4gICAgICAgIGxldCBteURheT1teURhdGUuZ2V0RGF0ZSgpK1wiXCI7XG4gICAgICAgIGlmKG15RGF5Lmxlbmd0aD09PTEpXG4gICAgICAgICAgICBteURheT1cIjBcIitteURheTtcbiAgICAgICAgbGV0IG15TW91bnRoPShteURhdGUuZ2V0TW9udGgoKSsxKStcIlwiO1xuICAgICAgICBpZihteU1vdW50aC5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlNb3VudGg9XCIwXCIrbXlNb3VudGg7XG4gICAgICAgIGxldCBteVllYXI9bXlEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGlmKGxhbmc9PT1cImZyXCIpXG4gICAgICAgICAgICByZXR1cm4gbXlEYXkrXCIvXCIrbXlNb3VudGgrXCIvXCIrbXlZZWFyO1xuICAgICAgICBlbHNlIGlmIChsYW5nPT09XCJmb3JtXCIpLy8gMjAxNC0wMi0wOVxuICAgICAgICAgICAgcmV0dXJuIG15WWVhcitcIi1cIitteU1vdW50aCtcIi1cIitteURheTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG15TW91bnRoK1wiL1wiK215RGF5K1wiL1wiK215WWVhcjtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVG9vbDsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZGVmYXVsdC9jb25maWcvZnIuanNcIjogXCIuLi92aWV3cy9kZWZhdWx0L2NvbmZpZy9mci5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi92aWV3cyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC5qcyRcIjsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgaGVhZExpbmtzOlxuICAgIFtcbiAgICAgICAgeyBhbmNob3I6IFwiQWNjdWVpbFwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNb24gY29tcHRlXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb25uZXhpb24uaG10XCIsIGlkOiBcImFjY291bnRIZWFkTGlua1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiw4AgcHJvcG9zXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9hLXByb3Bvcy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDb250YWN0XCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb250YWN0Lmh0bWxcIiB9IH0sXG4gICAgXSxcbiAgICBmb290TGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJDcsOpZGl0c1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY3JlZGl0cy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNZW50aW9ucyBsw6lnYWxlc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvbWVudGlvbnMtbGVnYWxlcy5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiRG9ubsOpZXMgcGVyc29ubmVsbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9kb25uZWVzLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkMuRy5VLlwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY2d1Lmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDLkcuVi5cIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nndi5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICBdLFxuICAgIG1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlOiAxMCxcbiAgICB1c2VySG9tZVBhZ2UgOiBcImFjY3VlaWwuaHRtbFwiLFxuICAgIGFkbWluSG9tZVBhZ2UgOiBcImFkbWluLmh0bWxcIixcbiAgICBtYW5hZ2VySG9tZVBhZ2UgOiBcImdlc3Rpb24uaHRtbFwiLFxuICAgIHN1YnNjcmliZVBhZ2UgOiBcImluc2NyaXB0aW9uLmh0bWxcIixcbiAgICBjb25uZWN0aW9uUGFnZSA6IFwiY29ubmV4aW9uLmh0bWxcIixcbiAgICBhY2NvdW50UGFnZTogXCJjb21wdGUuaHRtbFwiLFxuICAgIHF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi1xdWl6cy5odG1sXCIsXG4gICAgdXNlcnNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXV0aWxpc2F0ZXVycy5odG1sXCIsXG4gICAgbmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSA6IDEwLFxuICAgIGlsbHVzdHJhdGlvbkRpciA6IFwiL2ltZy9xdWl6cy9cIixcbiAgICBzaXRlU2xvZ2FuOiBcIkN1bHRpdm9ucyBub3RyZSBqYXJkaW4gIVwiLFxuICAgIGhvbWVUaXRsZTE6IFwiRGUgbmF0dXJlIGN1cmlldXNlID9cIixcbiAgICBob21lUDE6IFwiQXZlYyBXaWtpTGVybmkgdm91cyBhcHByZW5leiBjaGFxdWUgam91ciBkZSBub3V2ZWxsZXMgY2hvc2VzLjxicj5EZXMgYXJ0aWNsZXMgZGUgV2lraXDDqWRpYSBzb250IHPDqWxlY3Rpb25uw6lzIHBvdXIgdm91cyBldCBzb250IHN1aXZpcyBkJ3VuIHF1aXogdm91cyBwZXJtZXR0YW50IGRlIHRlc3RlciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudS48YnI+RGUgam91ciBlbiBqb3VyIGRlIG5vdXZlbGxlcyBncmFpbmVzIGRlIHNhdm9pciBzb250IGFpbnNpIHNlbcOpZXMgZGFucyB2b3RyZSBcXFwiamFyZGluXFxcIi5cIixcbiAgICBob21lVGl0bGUyOiBcIkxhIGN1bHR1cmUgZW4gbGliZXJ0w6lcIixcbiAgICBob21lUDI6IFwiVG91dCBjb21tZSBzdXIgV2lraXDDqWRpYSAoKiksIGxlIGxvZ2ljaWVsIGV0IGxlIGNvbnRlbnUgcGFydGFnw6kgc3VyIFdpa2lMZXJuaSBzb250IGxpYnJlcy48YnI+Vm91cyBwb3V2ZXogbGVzIHV0aWxpc2VyLCBsZXMgbW9kaWZpZXIgZXQgbGVzIGRpZmZ1c2VyIHNlbG9uIHZvdHJlIHNvdWhhaXQuPGJyPlN1ciBXaWtpTGVybmksIHBhcyBkZSBwdWJsaWNpdMOpLCBuaSBkZSBjb21tZXJjaWFsaXNhdGlvbiBkZSB2b3MgZG9ubsOpZXMgcGVyc29ubmVsbGVzLjxicj5Wb3VzIHBvdXZleiB2ZW5pciB5IFxcXCJjdWx0aXZlciB2b3RyZSBqYXJkaW5cXFwiIGVuIHRvdXRlIHRyYW5xdWlsbGl0w6kuPGJyPjxicj48c21hbGw+PGVtPigqKSBCaWVuIHF1ZSBwYXJ0YWdlYW50IHNlcyB2YWxldXJzLCBXaWtpTGVybmkgZXN0IHVuIHByb2pldCBpbmTDqXBlbmRhbnQgZGUgbGEgZm9uZGF0aW9uIFdpa2lww6lkaWEuPC9lbT48L3NtYWxsPlwiLFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzVGl0bGU6IFwiTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzIHN1ciBXaWtpTGVybmlcIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc0ludHJvOiBcIkxpc3RlIGRlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyBzdXIgV2lraUxlcm5pLlwiLFxuICAgIGV4cGxhbmF0aW9uVGl0bGU6IFwiVm91cyBkw6ljb3V2cmV6IFdpa2lMZXJuaSA/XCIsXG4gICAgZXhwbGFuYXRpb25UeHQ6IFwiTGUgcHJpbmNpcGUgZXN0IHNpbXBsZSA6IHZvdXMgY29tbWVuY2V6IHBhciBsaXJlIGwnYXJ0aWNsZSBXaWtpcMOpZGlhIGRvbnQgbGUgbGllbiB2b3VzIGVzdCBwcm9wb3PDqS48YnI+UHVpcyB2b3VzIGFmZmljaGVyIGxlIHF1aXogcG91ciB2w6lyaWZpZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUgZGUgdm90cmUgbGVjdHVyZS4gVm91cyBvYnRlbmV6IGFsb3JzIHZvdHJlIHLDqXN1bHRhdCBpbW3DqWRpYXRlbWVudC48YnI+PGJyPlRvdXRlcyBsZXMgcsOpcG9uc2VzIHNlIHRyb3V2ZW50IGRhbnMgbCdhcnRpY2xlIHByb3Bvc8OpIMOgIGxhIGxlY3R1cmUuIDxiPlZvdXMgw6p0ZXMgaWNpIHBvdXIgYXBwcmVuZHJlIGRlIG5vdXZlbGxlcyBjaG9zZXM8L2I+LCBtYWlzIGxpYnJlIMOgIHZvdXMgZCdlc3NheWVyIGQneSByw6lwb25kcmUgaW1tw6lkaWF0ZW1lbnQuPGJyPjxicj5RdWFuZCBsZSBzdWpldCBzJ3kgcHLDqnRlLCBuZSB2b3VzIMOpdG9ubmV6IHBhcyBzaSBjZXJ0YWluZXMgZGVzIHLDqXBvbnNlcyBwcm9wb3PDqWVzIHBldXZlbnQgw6p0cmUgdW4gcGV1IGTDqWNhbMOpZXMsIGFic3VyZGVzLi4uIE9uIHBldXQgYXBwcmVuZHJlIGF2ZWMgbGUgc291cmlyZSwgbm9uID8gOi0pPGJyPjxicj5VbmUgZm9pcyB2b3RyZSByw6lzdWx0YXQgb2J0ZW51LCBpbCB2b3VzIHNlcmEgcHJvcG9zw6kgZGUgY3LDqWVyIHVuIGNvbXB0ZSBwb3VyIGxlIHNhdXZlZ2FyZGVyLjxicj5DZSBjb21wdGUgdm91cyBwZXJtZXR0cmEgZGUgdGVzdGVyIGRlIG5vdXZlYXUgY2UgcXVpeiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudSBwbHVzaWV1cnMgam91cnMsIHNlbWFpbmVzLCBtb2lzLi4uIEV0IGRlIHJlY2V2b2lyIHLDqWd1bGnDqHJlbWVudCBkZSBub3V2ZWxsZXMgc3VnZ2VzdGlvbnMgZGUgbGVjdHVyZXMuPGJyPjxicj5NYWlzIDxiPmxhIGNyw6lhdGlvbiBkZSBjZSBjb21wdGUgZXN0IGZhY3VsdGF0aXZlPC9iPiBldCA8YSBocmVmPScvcXVpenMvJyB0aXRsZT0nTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzJz52b3VzIHBvdXZleiBwYXJjb3VyaXIgV2lraUxlcm5pIGxpYnJlbWVudDwvYT4uXCIsXG4gICAgbm9KU05vdGlmaWNhdGlvbjogXCJEw6lzb2zDqSwgbWFpcyBwb3VyIGwnaW5zdGFudCwgbCd1dGlsaXNhdGlvbiBkZSBXaWtpTGVybmkgbsOpY2Vzc2l0ZSBsJ2FjdGl2YXRpb24gZHUgSmF2YVNjcmlwdC5cIixcbn07IiwiLy8gLS0gU0NSSVBUIERFIEJBU0UgQVBQRUzDiSBEQU5TIExFUyBQQUdFUyBUWVBFIEFDQ1VFSUwgRFUgU0lURVxuXG4vLyBGaWNoaWVyIGRlIGNvbmZpZ3VyYXRpb24gdGlyw6lzIGR1IGJhY2tlbmQgOlxuaW1wb3J0IHsgYXZhaWxhYmxlTGFuZ3MsIHRoZW1lIH0gZnJvbSBcIi4uLy4uL2NvbmZpZy9pbnN0YW5jZS5qc1wiO1xuY29uc3QgbGFuZz1hdmFpbGFibGVMYW5nc1swXTtcblxuY29uc3QgY29uZmlnVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vLi4vdmlld3MvXCIrdGhlbWUrXCIvY29uZmlnL1wiK2xhbmcrXCIuanNcIik7XG5cbmltcG9ydCB7IGdldExvY2FseSB9IGZyb20gXCIuL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanNcIjtcbmltcG9ydCB7IGhlbGxvRGV2LCB1cGRhdGVBY2NvdW50TGluayB9IGZyb20gXCIuL3Rvb2xzL2V2ZXJ5d2hlcmUuanNcIjtcbmltcG9ydCB7IGNoZWNrU2Vzc2lvbiB9IGZyb20gXCIuL3Rvb2xzL3VzZXJzLmpzXCI7XG5cbmhlbGxvRGV2KCk7XG5cbi8vIFRlc3QgZGUgY29ubmV4aW9uIGRlIGwndXRpbGlzYXRldXIgcG91ciBhZGFwdGVyIGxlIGxpZW4gZHUgbWVudS4uLlxuY29uc3QgaW5pdGlhbGlzZSA9IGFzeW5jICgpID0+XG57XG4gICAgdHJ5XG4gICAge1xuICAgICAgICBjb25zdCBpc0Nvbm5lY3RlZD1hd2FpdCBjaGVja1Nlc3Npb24oKTtcbiAgICAgICAgaWYoaXNDb25uZWN0ZWQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIG9uIGNoYW5nZSBsZSBsaWVuIGR1IGNvbXB0ZSBlbiBoYXV0XG4gICAgICAgICAgICBjb25zdCB1c2VyPWdldExvY2FseShcInVzZXJcIiwgdHJ1ZSk7XG4gICAgICAgICAgICB1cGRhdGVBY2NvdW50TGluayh1c2VyLnN0YXR1cywgY29uZmlnVGVtcGxhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gaWNpIG9uIHBvdXJyYSDDqXZlbnR1ZWxsZW1lbnQgY2hhcmdlciBtYXRvbW8sIGV0Yy5cbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaChlKVxuICAgIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICB9XG59XG5pbml0aWFsaXNlKCk7IiwiLy8gRk9OQ1RJT05TIFVUSUxFUyBBVSBTVE9DS0FHRSBMT0NBTCAoU0VTU0lPTiwgQ09PS0lFUywgSU5ERVhEQiwgRVRDLilcbi8vIFJldmVuaXIgcG91ciBnw6lyZXIgbGUgY2FzIG/DuSBsb2NhbC5zdG9yYWdlIG4nZXN0IHBhcyBjb25udSBwb3VyIHV0aWxpc2VyIGNvb2tpZVxuICAgIFxuZXhwb3J0IGNvbnN0IHNhdmVMb2NhbHkgPSAobmFtZSwgZGF0YSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShuYW1lLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2NhbHkgPSAobmFtZSwganNvbj1mYWxzZSkgPT5cbntcbiAgICBpZihqc29uKVxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKSk7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSk7XG59XG5cbmV4cG9ydCBjb25zdCByZW1vdmVMb2NhbHkgPSAobmFtZSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShuYW1lKTtcbn0iLCIvLyBDZSBzY3JpcHQgZm91cm5pdCBkZXMgZm9uY3Rpb25zIHV0aWxpc8OpZXMgc3VyIHRvdXRlcyBsZXMgcGFnZXMgZHUgc2l0ZVxuXG5leHBvcnQgY29uc3QgaGVsbG9EZXYgPSAoKSA9Plxue1xuICAgIGNvbnNvbGUubG9nKFwiKioqKiBIZWxsbyBhbWkgZMOpdmVsb3BwZXVyIDotKVxcbiBMZSBjb2RlIGRlIFdpa2lMZXJuaSBlc3QgbGlicmUgZXQgZXN0IGxpc2libGUgc3VyIGdpdGxhYiA6IFxcbiBCb25uZSBsZWN0dXJlIDotKSBcXG4gUG91ciBsZXMgc3VnZ2VzdGlvbnMgZCdhbcOpbGlvcmF0aW9uIG91IHF1ZXN0aW9ucyA6IGRldkB3aWxpbGVybmkuY29tICoqKipcIik7XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVBY2NvdW50TGluayA9IChzdGF0dXMsIGNvbmZpZ1RlbXBsYXRlKSA9Plxue1xuICAgIGNvbnN0IGxpbms9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJhY2NvdW50SGVhZExpbmtcIik7XG4gICAgY29uc3QgaG9tZVBhZ2U9c3RhdHVzK1wiSG9tZVBhZ2VcIjtcbiAgICBsaW5rLmhyZWY9XCIvXCIrY29uZmlnVGVtcGxhdGVbaG9tZVBhZ2VdO1xufSIsImltcG9ydCB7IGFwaVVybCwgYXZhaWxhYmxlTGFuZ3MsIHNpdGVVcmwsIHRoZW1lIH0gZnJvbSBcIi4uLy4uLy4uL2NvbmZpZy9pbnN0YW5jZS5qc1wiO1xuY29uc3QgbGFuZz1hdmFpbGFibGVMYW5nc1swXTtcblxuY29uc3QgY29uZmlnVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vLi4vLi4vdmlld3MvXCIrdGhlbWUrXCIvY29uZmlnL1wiK2xhbmcrXCIuanNcIik7XG5pbXBvcnQgeyAgY2hlY2tMb2dpblJvdXRlLCB0aW1lRGlmZmVyZW5jZU1heCwgdGltZURpZmZlcmVuY2VNaW4sIHVzZXJSb3V0ZXMgfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnL3VzZXJzLmpzXCI7XG5cbmltcG9ydCB7IGdldExvY2FseSwgcmVtb3ZlTG9jYWx5LCBzYXZlTG9jYWx5IH0gZnJvbSBcIi4vY2xpZW50c3RvcmFnZS5qc1wiO1xuaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIFLDqWN1cMOocmUgbGVzIGRvbm7DqWVzIGRlIGNvbmZpZ3VyYXRpb24gZGVzIHV0aWxpc2F0ZXVyc1xuLy8gw4AgdGVybWUsIHVuIGZpY2hpZXIgc3RhdGlxdWUgaW1wb3J0YWJsZSBjb21tZSBtb2R1bGUgZGV2cmFpdCDDqXZpdGVyIHVuZSByZXF1w6p0ZSBhamF4XG5leHBvcnQgY29uc3QgZ2V0Q29uZmlnID0gIGFzeW5jICgpID0+XG57XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+XG4gICAge1xuICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgYXBpVXJsK1wiL3VzZXIvZ2V0Y29uZmlnXCIpO1xuICAgICAgICB4aHIub25sb2FkID0gKCkgPT4gcmVzb2x2ZShKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpKTtcbiAgICAgICAgeGhyLm9uZXJyb3IgPSAoKSA9PiByZWplY3QoeGhyLnN0YXR1c1RleHQpO1xuICAgICAgICB4aHIuc2VuZCgpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0VGltZURpZmZlcmVuY2UgPSAoKSA9Plxue1xuICAgIGNvbnN0IHRpbWVMb2NhbD1uZXcgRGF0ZSgpLmdldFRpbWV6b25lT2Zmc2V0KCk7XG4gICAgaWYodGltZUxvY2FsID4gdGltZURpZmZlcmVuY2VNYXggfHwgdGltZUxvY2FsIDwgdGltZURpZmZlcmVuY2VNaW4pXG4gICAgICAgIHJldHVybiAwO1xuICAgIGVsc2UgcmV0dXJuIHRpbWVMb2NhbDtcbn1cblxuLy8gT24gZW5sw6h2ZSB2b2xvbnRhaXJlbWVudCBsZXMgMC9PIHBvdXIgw6l2aXRlciBsZXMgY29uZnVzaW9ucyAhXG4vLyBFdCBtaWV1eCB2YXV0IGF1c3NpIGTDqWJ1dGVyIGV0IGZpbmlyIHBhciB1bmUgbGV0dHJlIHNpbXBsZS5cbmV4cG9ydCBjb25zdCBnZXRQYXNzd29yZCA9IChuYkNhck1pbiwgbmJDYXJNYXgpID0+XG57XG4gICAgY29uc3QgbmJDYXI9bmJDYXJNaW4rTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKihuYkNhck1heC1uYkNhck1pbikpO1xuICAgIGNvbnN0IGxldHRlcnM9XCJBQkNERUZHSElKS0xNTlBRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5wcXJzdHV2d3h5elwiO1xuICAgIGNvbnN0IG90aGVycz1cIjEyMzQ1Njc4OSE/LiotXyVAJsOJw4DDiMOZ4oKsJMOCw4rDm8OOXCI7XG4gICAgbGV0IHBhc3N3b3JkPWxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxldHRlcnMubGVuZ3RoKV07XG4gICAgZm9yKGxldCBpPTE7aTwobmJDYXItMSk7aSsrKVxuICAgIHtcbiAgICAgICAgaWYoKGkgJSAyKSA9PT0xKVxuICAgICAgICAgICAgcGFzc3dvcmQrPW90aGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqb3RoZXJzLmxlbmd0aCldO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBwYXNzd29yZCs9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTsgICBcbiAgICB9XG4gICAgcGFzc3dvcmQrPWxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxldHRlcnMubGVuZ3RoKV07XG4gICAgcmV0dXJuIHBhc3N3b3JkO1xufVxuXG4vLyBKJ3V0aWxpc2UgbGUgc3RvY2thZ2UgbG9jYWwgZHUgbmF2aWdhdGV1ciBwb3VyIGVucmVnaXN0cmVyIGxlcyBkb25uw6llcyBwZXJtZXR0YW50IGRlIHJlY29ubmHDrnRyZSBsJ3V0aWxpc2F0ZXVyIHBhciBsYSBzdWl0ZVxuLy8gU2V1bCBsZSBzZXJ2ZXVyIHBvdXJyYSB2w6lyaWZpZXIgcXVlIGxlcyBpZGVudGlmaWFudHMgc29udCAodG91am91cnMpIHZhbGlkZXMuXG5leHBvcnQgY29uc3Qgc2V0U2Vzc2lvbiA9ICh1c2VySWQsIHRva2VuLCBkdXJhdGlvblRTKSA9Plxue1xuICAgIGNvbnN0IHN0b3JhZ2VVc2VyPVxuICAgIHtcbiAgICAgICAgaWQ6IHVzZXJJZCxcbiAgICAgICAgdG9rZW46IHRva2VuLFxuICAgICAgICBkdXJhdGlvbjogZHVyYXRpb25UU1xuICAgIH1cbiAgICBzYXZlTG9jYWx5KFwidXNlclwiLCBzdG9yYWdlVXNlcik7XG59XG5cbi8vIFbDqXJpZmllIHF1J2lsIHkgYSBkZXMgZG9ubsOpZXMgbG9jYWxlcyBjb25jZXJuYW50IGxlIHLDqXN1bHRhdCBkJ3VuIHF1aXpcbi8vIEV0IGxlcyBham91dGUgYXV4IGRvbm7DqWVzIGVudm95w6llcyBwYXIgbGVzIGZvcm11bGFpcmVzIGQnaW5zY3JpcHRpb24vY29ubmV4aW9uIHNpIGMnZXN0IGxlIGNhc1xuZXhwb3J0IGNvbnN0IGNoZWNrQW5zd2VyRGF0YXMgPSAoZGF0YXMpID0+XG57XG4gICAgY29uc3QgbGFzdEFuc3dlcj1nZXRMb2NhbHkoXCJsYXN0QW5zd2VyXCIpO1xuICAgIGlmKCFpc0VtcHR5KGxhc3RBbnN3ZXIpKVxuICAgIHtcbiAgICAgICAgY29uc3QgYW5zd2VyPUpTT04ucGFyc2UobGFzdEFuc3dlcik7XG4gICAgICAgIGlmKCFpc0VtcHR5KGFuc3dlci5kdXJhdGlvbikgJiYgIWlzRW1wdHkoYW5zd2VyLm5iQ29ycmVjdEFuc3dlcnMpICYmICFpc0VtcHR5KGFuc3dlci5RdWVzdGlvbm5haXJlSWQpICYmICFpc0VtcHR5KGFuc3dlci5uYlF1ZXN0aW9ucykpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRhdGFzLmR1cmF0aW9uPWFuc3dlci5kdXJhdGlvbjtcbiAgICAgICAgICAgIGRhdGFzLm5iQ29ycmVjdEFuc3dlcnM9YW5zd2VyLm5iQ29ycmVjdEFuc3dlcnM7XG4gICAgICAgICAgICBkYXRhcy5RdWVzdGlvbm5haXJlSWQ9YW5zd2VyLlF1ZXN0aW9ubmFpcmVJZDtcbiAgICAgICAgICAgIGRhdGFzLm5iUXVlc3Rpb25zPWFuc3dlci5uYlF1ZXN0aW9ucztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YXM7XG59XG5cbi8vIENldHRlIGZvbmN0aW9uIHRlc3RlIGxhIGNvbm5leGlvbiBkZSBsJ3V0aWxpc2F0ZXVyIGQndW5lIHBhZ2Vcbi8vIE9uIHBldXQgZm91cm5pcyB1bmUgbGlzdGUgZGUgc3RhdHV0cyBhY2NlcHTDqXMgKHNpIHZpZGUgPSB0b3VzKSwgYWluc2kgcXUndW5lIHVybCBkZSByZWRpcmVjdGlvbiBzaSBub24gY29ubmVjdMOpLCB1biBtZXNzYWdlIGQnZXJyZXVyIMOgIGFmZmljaGVyIHN1ciBsYSBwYWdlIGRlIGRlc3RpbmF0aW9uIGV0IGwndXJsIHN1ciBsYXF1ZWxsZSByZXZlbmlyIHVuZSBmb2lzIGNvbm5lY3TDqVxuZXhwb3J0IGNvbnN0IGNoZWNrU2Vzc2lvbiA9IGFzeW5jIChzdGF0dXM9W10sIHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpID0+XG57XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+XG4gICAge1xuICAgICAgICBjb25zdCB1c2VyRGF0YXM9Z2V0TG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgaWYoaXNFbXB0eSh1c2VyRGF0YXMpKVxuICAgICAgICB7XG4gICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHVzZXI9SlNPTi5wYXJzZSh1c2VyRGF0YXMpO1xuICAgICAgICAgICAgaWYoaXNFbXB0eSh1c2VyLmlkKSB8fMKgaXNFbXB0eSh1c2VyLnRva2VuKSB8fCBpc0VtcHR5KHVzZXIuZHVyYXRpb24pIHx8IHVzZXIuZHVyYXRpb24gPCBEYXRlLm5vdygpKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgIHhoci5vcGVuKFwiR0VUXCIsIGFwaVVybCt1c2VyUm91dGVzK2NoZWNrTG9naW5Sb3V0ZSt1c2VyLnRva2VuKTtcbiAgICAgICAgICAgICAgICB4aHIub25sb2FkID0gKCkgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwICYmIHJlc3BvbnNlLmlzVmFsaWQgJiYgcmVzcG9uc2UuaWQgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5pZD09PXVzZXIuaWQpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5uYW1lPXJlc3BvbnNlLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5sYW5ndWFnZT1yZXNwb25zZS5sYW5ndWFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnRpbWVEaWZmZXJlbmNlPXJlc3BvbnNlLnRpbWVEaWZmZXJlbmNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIuc3RhdHVzPXJlc3BvbnNlLnN0YXR1czsvLyBsZSB0b2tlbiBldCBkZSB0b3V0ZSBmYcOnb24gdsOpcmlmaWVyIMOgIGNoYXF1ZSByZXF1w6p0ZSDDoCBsJ0FQSVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVMb2NhbHkoXCJ1c2VyXCIsIHVzZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpIGlsIHMnYWdpdCBkJ3VuIFwidXNlclwiIGV0IHF1ZSBzb24gYWJvbm5lbWVudCBhIGV4cGlyw6ksIGplIGxlIHJlZGlyaWdlIHZlcnMgbGEgY2Fpc3NlIDotKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLnN0YXR1cz09PVwidXNlclwiICYmIHJlc3BvbnNlLm5iRGF5c09rIDw9IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cmxBY2NvdW50PXNpdGVVcmwrXCIvXCIrY29uZmlnVGVtcGxhdGVbbGFuZ10uYWNjb3VudFBhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YodXJsQWNjb3VudCk9PT0tMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIvXCIrY29uZmlnVGVtcGxhdGVbbGFuZ10uYWNjb3VudFBhZ2UpOy8vIHBhc3PDqWUgZGlyZWN0ZW1lbnQgaWNpLCBsJ2FuY3JlICNzdWJzY3JpYmUgbmUgZm9uY3Rpb25uZSBwYXMgIT9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RhdHVzLmxlbmd0aCE9PTAgJiYgc3RhdHVzLmluZGV4T2YocmVzcG9uc2Uuc3RhdHVzKT09PS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB4aHIub25lcnJvciA9ICgpID0+IHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICAgICAgICAgICAgeGhyLnNlbmQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuLy8gQ2V0dGUgZm9uY3Rpb24gc2VydCDDoCBsYSBwcsOpY8OpZGVudGUgZW4gY2FzIGRlIGNvbm5leGlvbiBub24gdmFsaWRlXG5jb25zdCByZWRpcmVjdFVzZXIgPSAodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCkgPT5cbntcbiAgICBpZighaXNFbXB0eShtZXNzYWdlKSlcbiAgICAgICAgc2F2ZUxvY2FseShcIm1lc3NhZ2VcIiwgbWVzc2FnZSk7XG4gICAgaWYoIWlzRW1wdHkodXJsV2FudGVkKSlcbiAgICAgICAgc2F2ZUxvY2FseShcInVybFwiLCB1cmxXYW50ZWQpO1xuICAgIGlmKCFpc0VtcHR5KHVybFJlZGlyZWN0aW9uKSlcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbih1cmxSZWRpcmVjdGlvbik7XG59Il0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/front/public/JS/loginLink.app.js b/front/public/JS/loginLink.app.js new file mode 100644 index 0000000..4dff161 --- /dev/null +++ b/front/public/JS/loginLink.app.js @@ -0,0 +1,1210 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "./src/loginLink.js"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "../config/instance.js": +/*!*****************************!*\ + !*** ../config/instance.js ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var _module$exports; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var users = __webpack_require__(/*! ./users */ "../config/users.js"); + +var questionnaires = __webpack_require__(/*! ./questionnaires */ "../config/questionnaires.js"); + +module.exports = (_module$exports = { + apiUrl: "http://localhost:3000/api", + siteUrl: "http://localhost:8080", + adminName: "Fabrice", + adminEmail: "dev@wikilerni.com", + senderName: "WikiLerni", + senderEmail: "bonjour@wikilerni.com", + adminLang: "fr", + theme: "default", + // le thème utilisé (dans /views) pour générer les pages HTML. Contient ses propres fichiers de configuration. + availableLangs: ["fr"], + // Languages in which the site is available. The first one is the default one. + siteName: "WikiLerni", + beginCodeGodfather: "wikilerni", + // case-sensitive and can't contain "@" ! + cronTimingAlertInSeconde: 120, + // for logs + responseTimingAlertInSeconde: 3, + // idem + tokenSignupValidationTimeInHours: "48h", + // https://github.com/zeit/ms + tokenLoginLinkTimeInHours: "1h", + tokenConnexionMinTimeInHours: "24h", + tokenConnexionMaxTimeInDays: "180 days", + tokenLoginChangingTimeInHours: "1h", + // for email & password changing + tokenDeleteUserTimeInHours: "1h", + tokenUnsubscribeLinkTimeInDays: "7 days", + // token send with subscription's emails + freeAccountTimingInDays: 10, + freeAccountExpirationNotificationInDays: 5, + accountExpirationFirstNotificationInDays: 14, + accountExpirationSecondNotificationInDays: 5, + inactiveAccountTimeToDeleteInDays: 180, + // Questionnaires: + nbQuestionsMin: 1, + // minimum number of questions for the questionnaire to be publishable + nbQuestionsMax: 10, + // if 0 = not maximum + nbChoicesMax: 10, + nbNewQuestionnaires: 10, + // for RSS, etc. + hourGiveNewQuestionnaireBegin: 1, + // in user local time + hourGiveNewQuestionnaireEnd: 24, + // idem + numberNewQuestionnaireAtSameTime: 50, + // for mass mailing + minSearchQuestionnaires: 3, + // Illustrations: + nbIllustrationsMin: 0, + nbIllustrationsMax: 1, + maxIllustrationSizeinOctet: 1000000, + // pas contrôlé pour l'instant. À revoir. + mimeTypesForIllustration: ["image/jpg", "image/jpeg", "image/png", "image/gif", "image/png"], + // -- Upload and resize: + illustrationsWidthMaxInPx: 400, + illustrationsMiniaturesWidthMaxInPx: 200, + // Links: + nbLinksMin: 1, + nbLinksMax: 1 +}, _defineProperty(_module$exports, "nbQuestionsMin", questionnaires.nbQuestionsMin), _defineProperty(_module$exports, "nbQuestionsMax", questionnaires.nbQuestionsMax), _defineProperty(_module$exports, "nbChoicesMax", questionnaires.nbChoicesMax), _defineProperty(_module$exports, "passwordMinLength", users.password.minlength), _defineProperty(_module$exports, "dirCacheUsers", users.dirCacheUsers), _defineProperty(_module$exports, "dirCacheUsersAnswers", users.dirCacheUsersAnswers), _defineProperty(_module$exports, "dirCacheQuestionnaires", questionnaires.dirCacheQuestionnaires), _defineProperty(_module$exports, "dirCacheQuestions", questionnaires.dirCacheQuestions), _defineProperty(_module$exports, "dirCacheUsersQuestionnaires", questionnaires.dirCacheUsersQuestionnaires), _defineProperty(_module$exports, "dirHTMLQuestionnaire", questionnaires.dirHTMLQuestionnaire), _defineProperty(_module$exports, "dirWebQuestionnaire", questionnaires.dirWebQuestionnaire), _module$exports); + +/***/ }), + +/***/ "../config/questionnaires.js": +/*!***********************************!*\ + !*** ../config/questionnaires.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + // API'routes (after "apiUrl" defined in instance.js) + questionnaireRoutes: "/questionnaire", + getQuestionnaireRoutes: "/get", + previewQuestionnaireRoutes: "/preview", + publishedQuestionnaireRoutes: "/quiz/", + saveAnswersRoute: "/answer/", + getStatsQuestionnaires: "/stats/", + searchQuestionnairesRoute: "/search", + searchAdminQuestionnairesRoute: "/searchadmin", + getListNextQuestionnaires: "/getlistnextquestionnaires/", + // -- questions & choices : + questionsRoute: "/question/", + // -- tags : + tagsSearchRoute: "/tags/search/", + // -- answers : + getQuestionnairesWithoutAnswer: "/withoutanswer/user/", + getPreviousAnswers: "/user/answers/", + getStatsAnswers: "/user/anwswers/stats/", + getAdminStats: "/getadminstats/", + // forms : à compléter avec valeurs par défaut, etc. cf modèle + Questionnaire: { + title: { + maxlength: 255, + required: true + }, + slug: { + maxlength: 150 + }, + // champ requis mais calculé à partir du titre qd vide + introduction: { + required: true + } + }, + searchQuestionnaires: { + minlength: 3, + required: true + }, + Question: { + text: { + maxlength: 255, + required: true + }, + rank: { + required: true, + min: 1, + defaultValue: 1 + } + }, + Choice: { + text: { + maxlength: 255, + required: true + } + }, + nbQuestionsMin: 1, + nbQuestionsMax: 10, + nbChoicesMax: 10, + nbTagsMin: 0, + nbTagsMax: 0, + // 0 = not max + // JSON and HTML dir + dirCacheQuestionnaires: "datas/questionnaires", + dirCacheQuestions: "datas/questionnaires/questions", + dirCacheUsersQuestionnaires: "datas/users/questionnaires", + dirCacheTags: "datas/questionnaires/tags", + dirHTMLQuestionnaire: "front/public/quiz", + dirHTMLTags: "front/public/quizs", + dirWebQuestionnaire: "quiz", + //pour url page + dirWebTags: "quizs" // idem + +}; + +/***/ }), + +/***/ "../config/users.js": +/*!**************************!*\ + !*** ../config/users.js ***! + \**************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + // API'routes (after "apiUrl" defined in instance.js) + userRoutes: "/user", + subscribeRoute: "/signup", + getGodfatherRoute: "/getgodfatherid", + checkIfIsEmailfreeRoute: "/isemailfree", + checkSubscribeTokenRoute: "/validation/", + checkLoginRoute: "/checklogin/", + connectionRoute: "/login", + getLoginLinkRoute: "/getloginlink", + connectionWithLinkRoute: "/checkloginlink", + getUserInfos: "/get/", + createUserRoute: "/create", + validateUserRoute: "/validate/", + updateUserInfos: "/modify/", + searchUserRoute: "/search/", + getGodChilds: "/getgodchilds/", + checkNewLoginLinkRoute: "/confirmnewlogin/", + checkDeleteLinkRoute: "/confirmdelete/", + getPayments: "/payment/getforoneuser/", + unsubscribeRoute: "/subscription/stop/", + getAdminStats: "/getadminstats/", + // forms : à compléter avec valeurs par défaut, etc. cf modèle + name: { + maxlength: 70, + required: true + }, + email: { + maxlength: 255, + required: true + }, + password: { + minlength: 8, + maxlength: 72, + required: true + }, + // https://www.npmjs.com/package/bcrypt#security-issues-and-concerns + newPassword: { + minlength: 8, + maxlength: 72 + }, + codeGodfather: { + maxlength: 255 + }, + cguOk: { + value: "true", + required: true + }, + timeDifferenceMin: -720, + timeDifferenceMax: 840, + // JSON dir + dirCacheUsers: "datas/users", + dirCacheUsersAnswers: "datas/users/questionnaires/answers" +}; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/general$": +/*!**************************************!*\ + !*** ../lang sync ^\.\/.*\/general$ ***! + \**************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/general": "../lang/fr/general.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/general$"; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/user$": +/*!***********************************!*\ + !*** ../lang sync ^\.\/.*\/user$ ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/user": "../lang/fr/user.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/user$"; + +/***/ }), + +/***/ "../lang/fr/general.js": +/*!*****************************!*\ + !*** ../lang/fr/general.js ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + siteHTMLTitle: "WikiLerni : qu'allez-vous apprendre aujourd'hui ?", + siteMetaDescription: "Chaque jour, testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.", + scriptTimingInfo: "Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", + scriptTimingAlert: "*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", + serverError: "Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.", + serverErrorAdmin: "Bug de l'application :", + neededParams: "Des paramètres nécessaires manquants sont manquants.", + badUrl: "Tentative d'accès à une page n'existant pas :", + notValidFormat: "Format non valide.", + notAllowed: "Vous n'avez pas les droits nécessaires pour cette action.", + notRequired: "Facultatif.", + updateBtnTxt: "Modifier", + addBtnTxt: "Ajouter", + deleteBtnTxt: "Supprimer", + addOkMessage: "Les données ont bien été enregistrées.", + updateOkMessage: "La mise à jour à jour a bien été enregistrée.", + deleteOkMessage: "La suppression a bien été enregistrée.", + failAuth: "Erreur d'authentification.", + failAuthHeader: "Absence de header Authorization.", + failAuthToken: "Token invalide ou utilisateur non trouvé.", + failAuthId: "Identifiant non valide : ", + failAuthCron: "Tentative de lancement d'un cron sans le bon token.", + previousPage: "Page précédente", + nextPage: "Page suivante", + btnLinkToQuestionnaire: "Aller au quiz !", + statsAdmin: "Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
    En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
    Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium." +}; + +/***/ }), + +/***/ "../lang/fr/user.js": +/*!**************************!*\ + !*** ../lang/fr/user.js ***! + \**************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + notFound: "L'utilisateur n'a pas été trouvé.", + needName: "Merci de choisir un nom d'utilisateur.", + needNotTooLongName: "Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.", + needEmail: "Merci de saisir votre adresse e-mail.", + needUniqueEmail: "L'adresse e-mail que vous avez saisie est déjà utilisée par un autre utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.", + needNotTooLongEmail: "Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.", + needPassWord: "Merci de fournir un mot de passe.", + needLongPassWord: "Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.", + passwordCopied: "Le mot de passe généré a été copié dans le presse-papier. Vous pouvez le recopier où vous le souhaiter.", + needStatus: "Il manque le statut.", + needLanguage: "Il manque le code langue.", + needValidLastConnectionDate: "La date de dernière connexion n'est pas valide.", + needSMTP: "Il manque le serveur SMTP.", + needSMTPNotFound: "Il manque le serveur SMTP.", + needKnowNewsletterOk: "Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.", + needTimeDifference: "Il faut connaître le nombre de minutes du décalage horaire.", + needMinTimeDifference: "Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.", + needMaxTimeDifference: "Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.", + needUGCOk: "Vous devez accepter les CGU pour pouvoir créer votre compte. ", + godfatherNotFound: "Aucun utilisateur valide trouvé pour ce code parrain.", + godfatherFound: "Votre parrain a bien été trouvé !", + mailValidationMessage: "Votre inscription est bien enregistrée.\nPour la finaliser, merci de cliquer dans les 24H sur le lien de confirmation qui vient de vous être envoyé par e-mail.", + mailValidationLinkSubject: "Merci de valider votre compte", + mailValidationLinkSBodyTxt: "Bonjour USER_NAME,\n\nPour valider votre compte, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL", + mailValidationLinkSBodyHTML: "

    Bonjour USER_NAME,

    Pour valider votre compte, merci de cliquer sur le lien suivant dans les 24h.

    Valider.

    ", + validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue !
    Vous pouvez sans tarder vous connecter ci-dessous pour accéder à votre compte.", + validationMessageAdmin: "Le compte a bien été validé.", + validationAlreadyMessage: "Il semble que vous ayez déjà validé votre compte.", + validationAlreadyMessageAdmin: "Ce compte a déjà été validé.", + mailWelcomeSubject: "Bienvenue !", + mailWelcomeBodyTxt: "Bonjour USER_NAME,\nVotre venez de valider votre inscription à NOM_SITE.\nMerci et à bientôt !", + mailWelcomeBodyHTML: "

    Bonjour USER_NAME,

    Votre venez de valider votre inscription à NOM_SITE.

    Merci et à bientôt !

    ", + mailThankGodfatherSubject: "Merci !", + mailThankGodfatherBodyTxt: "Bonjour USER_NAME,\nGrâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nMerci et à bientôt !", + mailThankGodfatherBodyHTML: "

    Bonjour USER_NAME,

    Grâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.

    Merci et à bientôt !

    ", + badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.", + emailNotFound: "Aucun utilisateur trouvé pour cette adresse e-mail.", + alreadyConnected: "Vous êtes déjà connecté(e) au site !", + needBeConnected: "Vous devez être connecté(e) pour accéder à cette page.", + connectionOk: "Connexion réussie.", + needChooseLoginWay: "Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.", + needValidationToLogin: "Vous devez d'abord valider votre compte avant de vous connecter. Pour ce faire, un lien vient de vous être envoyé par e-mail.", + tooManyLoginFails: "Trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.", + badPassword: "Le mot de passe n'est pas le bon.", + mailLoginLinkSubject: "Votre lien de connexion.", + mailLoginLinkBodyTxt: "Bonjour USER_NAME,\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : LINK_URL", + mailLoginLinkBodyHTML: "

    Bonjour USER_NAME,

    Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :

    Valider.

    ", + mailLoginLinkMessage: "Un lien de connexion vient de vous être envoyé sur votre adresse e-mail. Ne tardez pas à l'utiliser, car il n'est valable que durant ", + updatedOkMessage: "Vos informations ont bien été mises à jour.", + updatedNeedGoodEmail: "Mais la nouvelle adresse e-mail n'a pu être enregistrée car elle n'a pas une format correct.", + updatedNeedUniqueEmail: "Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.", + mailUpdateLoginSubject: "Merci de valider vos nouveaux identifiants.", + mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL", + mailUpdateLoginBodyHTML: "

    Bonjour USER_NAME,

    Pour valider vos nouveaux identifiants de connexion, cliquez ici sans tarder.

    ", + mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (email et/ou mot de passe) et vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement. En attendant, merci de continuer à utiliser vos anciens identifiants.", + updatedNeedValidatedUser: "L'utilisateur que vous souhaité modifier n'existe pas/plus ou n'a pas encore validé son compte.", + updatedNeedGoodGodfather: "Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.", + mailUpdateLoginOkMessage: "La mise à jour de vos identifiants a bien été enregistrée.", + updatedFailedGodfatherNotFound: "L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.", + creationOkMessage: "Le nouvel utilisateur a bien été enregistré.", + mailDeleteSubject: "Confirmer la suppression de votre compte.", + mailDeleteBodyTxt: "Bonjour USER_NAME,\nPour valider la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL", + mailDeleteBodyHTML: "

    Bonjour USER_NAME,

    Pour valider la suppression de votre compte, cliquez ici sans tarder.

    ", + mailDeleteLinkMessage: "Votre demande de suppression a bien été enregistrée. Merci de cliquer sans tarder sur le lien qui vient de vous être envoyé par e-mail pour confirmer.", + deleteOkMessage: "L'utilisateur a bien été supprimé.", + deleteFailMessage: "Tentative de suppression d'un utilisateur inexistant : ", + mailDeleteLinkOkMessage: "Votre compte a bien été supprimé. Merci d'avoir utilisé nos services.", + mailDeleteLinkAlreadyMessage: "Il semble que vous ayez déjà validé la suppression de votre compte.", + mailDeleteLinkFailMessage: "Votre lien de suppression n'est pas valide ou alors il n'est plus valable.", + cronDeleteUnvalidedUsersMessage: " comptes utilisateurs non validés ont été supprimés.", + deleteInactiveUsersMessage: " comptes utilisateurs inactifs ont été supprimés.", + welcomeMessage: "Bienvenue #NAME !", + byebyeMessage: "Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
    À bientôt !", + infosUserForAdmin: "Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
    Date de sa dernière connexion : DATE_CONNECTION.", + infosAdminGodfather: "Cet utilisateur a été parrainé par ", + infosAdminNbGodChilds: "Ses #NB filleuils : " +}; + +/***/ }), + +/***/ "../tools/main.js": +/*!************************!*\ + !*** ../tools/main.js ***! + \************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +// Quelques fonctions utiles pour les chaînes +var Tool = /*#__PURE__*/function () { + function Tool() { + _classCallCheck(this, Tool); + } + + _createClass(Tool, null, [{ + key: "isEmpty", + value: function isEmpty(myVar) { + if (myVar === undefined || myVar === null) return true;else { + myVar += ""; // si autre chose qu'une chaîne envoyé... + + myVar = myVar.trim(); + if (myVar === "") return true;else return false; + } + } + }, { + key: "trimIfNotNull", + value: function trimIfNotNull(myString) { + if (Tool.isEmpty(myString)) myString = null;else { + myString += ""; // si autre chose qu'une chaîne envoyé... + + myString = myString.trim(); + } + return myString; + } + }, { + key: "shortenIfLongerThan", + value: function shortenIfLongerThan(myString, max) { + myString += ""; // au cas où cela ne serait pas une chaîne... + + if (myString.length > max) myString = myString.substring(0, max - 3) + "..."; + return myString; + } // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings + + }, { + key: "replaceAll", + value: function replaceAll(myString, mapObj) { + var replaceElts = new RegExp(Object.keys(mapObj).join("|"), "gi"); + return myString.replace(replaceElts, function (matched) { + return mapObj[matched]; + }); + } // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random + + }, { + key: "getRandomInt", + value: function getRandomInt(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min)) + min; + } // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country + + }, { + key: "dateFormat", + value: function dateFormat(dateString) { + var lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "fr"; + if (Tool.isEmpty(dateString)) return ""; + var myDate = new Date(dateString); + var myDay = myDate.getDate() + ""; + if (myDay.length === 1) myDay = "0" + myDay; + var myMounth = myDate.getMonth() + 1 + ""; + if (myMounth.length === 1) myMounth = "0" + myMounth; + var myYear = myDate.getFullYear(); + if (lang === "fr") return myDay + "/" + myMounth + "/" + myYear;else if (lang === "form") // 2014-02-09 + return myYear + "-" + myMounth + "-" + myDay;else return myMounth + "/" + myDay + "/" + myYear; + } + }]); + + return Tool; +}(); + +module.exports = Tool; + +/***/ }), + +/***/ "../views sync recursive ^\\.\\/.*\\.js$": +/*!**********************************!*\ + !*** ../views sync ^\.\/.*\.js$ ***! + \**********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./default/config/fr.js": "../views/default/config/fr.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../views sync recursive ^\\.\\/.*\\.js$"; + +/***/ }), + +/***/ "../views/default/config/fr.js": +/*!*************************************!*\ + !*** ../views/default/config/fr.js ***! + \*************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + headLinks: [{ + anchor: "Accueil", + attributes: { + href: "/" + } + }, { + anchor: "Mon compte", + attributes: { + href: "/connexion.hmt", + id: "accountHeadLink" + } + }, { + anchor: "À propos", + attributes: { + href: "/a-propos.html" + } + }, { + anchor: "Contact", + attributes: { + href: "/contact.html" + } + }], + footLinks: [{ + anchor: "Crédits", + attributes: { + href: "/credits.html" + } + }, { + anchor: "Mentions légales", + attributes: { + href: "/mentions-legales.html", + rel: "nofollow" + } + }, { + anchor: "Données personnelles", + attributes: { + href: "/donnees.html" + } + }, { + anchor: "C.G.U.", + attributes: { + href: "/cgu.html", + rel: "nofollow" + } + }, { + anchor: "C.G.V.", + attributes: { + href: "/cgv.html", + rel: "nofollow" + } + }], + maxQuestionnairesByPage: 10, + userHomePage: "accueil.html", + adminHomePage: "admin.html", + managerHomePage: "gestion.html", + subscribePage: "inscription.html", + connectionPage: "connexion.html", + accountPage: "compte.html", + questionnairesManagementPage: "gestion-quizs.html", + usersManagementPage: "gestion-utilisateurs.html", + nbQuestionnairesUserHomePage: 10, + illustrationDir: "/img/quizs/", + siteSlogan: "Cultivons notre jardin !", + homeTitle1: "De nature curieuse ?", + homeP1: "Avec WikiLerni vous apprenez chaque jour de nouvelles choses.
    Des articles de Wikipédia sont sélectionnés pour vous et sont suivis d'un quiz vous permettant de tester ce que vous en avez retenu.
    De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre \"jardin\".", + homeTitle2: "La culture en liberté", + homeP2: "Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
    Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
    Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
    Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.

    (*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.", + newQuestionnairesTitle: "Les derniers quizs publiés sur WikiLerni", + newQuestionnairesIntro: "Liste des derniers quizs publiés sur WikiLerni.", + explanationTitle: "Vous découvrez WikiLerni ?", + explanationTxt: "Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
    Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.

    Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.

    Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)

    Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
    Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.

    Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.", + noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript." +}; + +/***/ }), + +/***/ "./src/loginLink.js": +/*!**************************!*\ + !*** ./src/loginLink.js ***! + \**************************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ "../config/instance.js"); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js"); +/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var _tools_url_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./tools/url.js */ "./src/tools/url.js"); +/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tools/users.js */ "./src/tools/users.js"); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + +// -- PAGE PERMETTANT DE TESTER UN LIEN DE CONNEXION REÇU PAR E-MAIL +/// Un token est transmis en paramètre de l'Url. Il a une validité limité dans le temps. +/// Dans ce cas, on peut rediriger l'utilisateur vers la page de connexion pour obtenir un nouveau lien de validation +/// Si le token est ok, on crée une session suivant la durée retournée par l'API et redirige l'utilisateur vers sa page d'accueil +/// Un résultat de quiz peut aussi avoir été enregistré côté client et est alors à transmettre à l'API. +/// Si l'utilisateur a déjà une session active valide, c'est qu'il a déjà cliqué sur le lien. On le redirige également vers sa page d'accueil. +// Fichier de configuration côté client : + +var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0]; + +var configFrontEnd = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); // Importation des fonctions utile au script : + + + + + + + + // Dictionnaires : + +var txt = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + lang + "/general"); + +var txtUsers = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/user$")("./" + lang + "/user"); + +var divResponse = document.getElementById("response"); +Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["helloDev"])(); +var config; + +var initialise = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + var isConnected, user, homePage, datas, xhr; + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _context.prev = 0; + _context.next = 3; + return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_6__["getConfig"])(); + + case 3: + config = _context.sent; + + if (config) { + _context.next = 8; + break; + } + + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]); + _context.next = 12; + break; + + case 8: + _context.next = 10; + return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_6__["checkSession"])(); + + case 10: + isConnected = _context.sent; + + if (isConnected) { + Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["saveLocaly"])("message", { + message: txtUsers.alreadyConnected, + color: "information" + }); // pour l'afficher sur la page suivante + + user = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("user", true); + homePage = user.status + "HomePage"; + window.location.assign("/" + configFrontEnd[homePage]); + } else { + datas = Object(_tools_url_js__WEBPACK_IMPORTED_MODULE_5__["getUrlParams"])(); + + if (datas && datas.t !== undefined) { + xhr = new XMLHttpRequest(); + xhr.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.userRoutes + config.connectionWithLinkRoute); + + xhr.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var response = JSON.parse(this.responseText); + + if (this.status === 200 && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_4__["isEmpty"])(response.userId) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_4__["isEmpty"])(response.connexionTime) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_4__["isEmpty"])(response.token)) { + var connexionMaxTime = Date.now(); + if (response.connexionTime.endsWith("days")) connexionMaxTime += parseInt(response.connexionTime, 10) * 24 * 3600 * 1000;else connexionMaxTime += parseInt(response.connexionTime, 10) * 3600 * 1000; + Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_6__["setSession"])(response.userId, response.token, connexionMaxTime); + Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["removeLocaly"])("lastAnswer"); // ! important pour ne pas enregister plusieurs fois le résultat + + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txtUsers.validationMessage, "", ["success"]); // au cas où blocage redirection + + window.location.assign("/" + configFrontEnd.userHomePage); // connexion par lien ne concerne que les simples "user" + } else if ((this.status === 401 || this.status === 403) && response.errors != undefined) { + if (Array.isArray(response.errors)) response.errors = response.errors.join("
    ");else response.errors = txt.serverError; + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", response.errors, "", ["error"]); + } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txtUsers.badLinkValidationMessage.replace("#URL", configFrontEnd.connectionPage), "", ["error"]); + } + }; + + datas.timeDifference = Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_6__["getTimeDifference"])(config); // si l'utilisateur a précédement répondu à un quiz, j'ajoute les infos de son résultat : + + datas = Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_6__["checkAnswerDatas"])(datas); + xhr.setRequestHeader("Content-Type", "application/json"); + xhr.send(JSON.stringify(datas)); + } + } + + case 12: + _context.next = 17; + break; + + case 14: + _context.prev = 14; + _context.t0 = _context["catch"](0); + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]); + + case 17: + case "end": + return _context.stop(); + } + } + }, _callee, null, [[0, 14]]); + })); + + return function initialise() { + return _ref.apply(this, arguments); + }; +}(); + +initialise(); + +/***/ }), + +/***/ "./src/tools/clientstorage.js": +/*!************************************!*\ + !*** ./src/tools/clientstorage.js ***! + \************************************/ +/*! exports provided: saveLocaly, getLocaly, removeLocaly */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveLocaly", function() { return saveLocaly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaly", function() { return getLocaly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeLocaly", function() { return removeLocaly; }); +// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.) +// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie +var saveLocaly = function saveLocaly(name, data) { + localStorage.setItem(name, JSON.stringify(data)); +}; +var getLocaly = function getLocaly(name) { + var json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name); +}; +var removeLocaly = function removeLocaly(name) { + localStorage.removeItem(name); +}; + +/***/ }), + +/***/ "./src/tools/dom.js": +/*!**************************!*\ + !*** ./src/tools/dom.js ***! + \**************************/ +/*! exports provided: addElement */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addElement", function() { return addElement; }); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__); +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + + // Fonction associant les attributs fournis à un champ de formulaire + +var addElement = function addElement(eltParent, eltType) { + var eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; + var eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; + var eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : []; + var eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; + var replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true; + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltType) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltParent)) return false;else { + var newElement = document.createElement(eltType); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ? + newElement.id = eltId; + + if (Array.isArray(eltClass) && eltClass.length != 0) { + for (var i in eltClass) { + newElement.classList.add(eltClass[i]); + } + } + + if (_typeof(eltAttributes) === "object") // !! tous les objets ne sont pas ok + { + for (var attributName in eltAttributes) { + newElement.setAttribute(attributName, eltAttributes[attributName]); + } + } + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltContent)) newElement.innerHTML = eltContent.replace(/\n/g, "
    "); // innerHTML permet d'ajouter du texte ayant lui-même des balises, etc. + + if (replace) eltParent.innerHTML = ""; + eltParent.appendChild(newElement); + } +}; + +/***/ }), + +/***/ "./src/tools/everywhere.js": +/*!*********************************!*\ + !*** ./src/tools/everywhere.js ***! + \*********************************/ +/*! exports provided: helloDev, updateAccountLink */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "helloDev", function() { return helloDev; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateAccountLink", function() { return updateAccountLink; }); +// Ce script fournit des fonctions utilisées sur toutes les pages du site +var helloDev = function helloDev() { + console.log("**** Hello ami développeur :-)\n Le code de WikiLerni est libre et est lisible sur gitlab : \n Bonne lecture :-) \n Pour les suggestions d'amélioration ou questions : dev@wililerni.com ****"); + return true; +}; +var updateAccountLink = function updateAccountLink(status, configTemplate) { + var link = document.getElementById("accountHeadLink"); + var homePage = status + "HomePage"; + link.href = "/" + configTemplate[homePage]; +}; + +/***/ }), + +/***/ "./src/tools/url.js": +/*!**************************!*\ + !*** ./src/tools/url.js ***! + \**************************/ +/*! exports provided: getUrlParams */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getUrlParams", function() { return getUrlParams; }); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__); + // Fonction récupérant les paramètres passés par l'url + +var getUrlParams = function getUrlParams() { + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(location.search)) return false; + var parameters = location.search.substring(1).split("&"); + if (!Array.isArray(parameters) || parameters.length === 0) return false; + var param, + datas = {}; + + for (var i in parameters) { + param = parameters[i].split("="); + if (param.length === 2) datas[param[0]] = decodeURI(param[1]); + } + + return datas; +}; + +/***/ }), + +/***/ "./src/tools/users.js": +/*!****************************!*\ + !*** ./src/tools/users.js ***! + \****************************/ +/*! exports provided: getConfig, getTimeDifference, getPassword, setSession, checkAnswerDatas, checkSession */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getConfig", function() { return getConfig; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTimeDifference", function() { return getTimeDifference; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getPassword", function() { return getPassword; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setSession", function() { return setSession; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkAnswerDatas", function() { return checkAnswerDatas; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkSession", function() { return checkSession; }); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/instance.js */ "../config/instance.js"); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../config/users.js */ "../config/users.js"); +/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_3__); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + + +var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0]; + +var configTemplate = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); + + + + // Récupère les données de configuration des utilisateurs +// À terme, un fichier statique importable comme module devrait éviter une requête ajax + +var getConfig = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + return _context.abrupt("return", new Promise(function (resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + "/user/getconfig"); + + xhr.onload = function () { + return resolve(JSON.parse(xhr.responseText)); + }; + + xhr.onerror = function () { + return reject(xhr.statusText); + }; + + xhr.send(); + })); + + case 1: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + + return function getConfig() { + return _ref.apply(this, arguments); + }; +}(); +var getTimeDifference = function getTimeDifference() { + var timeLocal = new Date().getTimezoneOffset(); + if (timeLocal > _config_users_js__WEBPACK_IMPORTED_MODULE_1__["timeDifferenceMax"] || timeLocal < _config_users_js__WEBPACK_IMPORTED_MODULE_1__["timeDifferenceMin"]) return 0;else return timeLocal; +}; // On enlève volontairement les 0/O pour éviter les confusions ! +// Et mieux vaut aussi débuter et finir par une lettre simple. + +var getPassword = function getPassword(nbCarMin, nbCarMax) { + var nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin)); + var letters = "ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz"; + var others = "123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ"; + var password = letters[Math.floor(Math.random() * letters.length)]; + + for (var i = 1; i < nbCar - 1; i++) { + if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)]; + } + + password += letters[Math.floor(Math.random() * letters.length)]; + return password; +}; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite +// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides. + +var setSession = function setSession(userId, token, durationTS) { + var storageUser = { + id: userId, + token: token, + duration: durationTS + }; + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("user", storageUser); +}; // Vérifie qu'il y a des données locales concernant le résultat d'un quiz +// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas + +var checkAnswerDatas = function checkAnswerDatas(datas) { + var lastAnswer = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("lastAnswer"); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(lastAnswer)) { + var answer = JSON.parse(lastAnswer); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.duration) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbCorrectAnswers) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.QuestionnaireId) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbQuestions)) { + datas.duration = answer.duration; + datas.nbCorrectAnswers = answer.nbCorrectAnswers; + datas.QuestionnaireId = answer.QuestionnaireId; + datas.nbQuestions = answer.nbQuestions; + } + } + + return datas; +}; // Cette fonction teste la connexion de l'utilisateur d'une page +// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté + +var checkSession = /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() { + var status, + urlRedirection, + message, + urlWanted, + _args2 = arguments; + return regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + status = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : []; + urlRedirection = _args2.length > 1 ? _args2[1] : undefined; + message = _args2.length > 2 ? _args2[2] : undefined; + urlWanted = _args2.length > 3 ? _args2[3] : undefined; + return _context2.abrupt("return", new Promise(function (resolve, reject) { + var userDatas = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("user"); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(userDatas)) { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else { + var user = JSON.parse(userDatas); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.id) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.token) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.duration) || user.duration < Date.now()) { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else { + var xhr = new XMLHttpRequest(); + xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["userRoutes"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["checkLoginRoute"] + user.token); + + xhr.onload = function () { + var response = JSON.parse(xhr.responseText); + + if (xhr.status === 200 && response.isValid && response.id != undefined) { + if (response.id === user.id) { + user.name = response.name; + user.language = response.language; + user.timeDifference = response.timeDifference; + user.status = response.status; // le token et de toute façon vérifier à chaque requête à l'API + + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("user", user); // si il s'agit d'un "user" et que son abonnement a expiré, je le redirige vers la caisse :-) + + if (response.status === "user" && response.nbDaysOk <= 0) { + var urlAccount = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["siteUrl"] + "/" + configTemplate[lang].accountPage; + if (window.location.href.indexOf(urlAccount) === -1) window.location.assign("/" + configTemplate[lang].accountPage); // passée directement ici, l'ancre #subscribe ne fonctionne pas !? + + resolve(true); + } else { + if (status.length !== 0 && status.indexOf(response.status) === -1) { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else resolve(true); + } + } else { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + } else { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + }; + + xhr.onerror = function () { + return reject(xhr.statusText); + }; + + xhr.send(); + } + } + })); + + case 5: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + + return function checkSession() { + return _ref2.apply(this, arguments); + }; +}(); // Cette fonction sert à la précédente en cas de connexion non valide + +var redirectUser = function redirectUser(urlRedirection, message, urlWanted) { + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(message)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("message", message); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlWanted)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("url", urlWanted); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlRedirection)) window.location.assign(urlRedirection); +}; + +/***/ }) + +/******/ }); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9nZW5lcmFsJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3VzZXIkIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL2dlbmVyYWwuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcvZnIvdXNlci5qcyIsIndlYnBhY2s6Ly8vLi4vdG9vbHMvbWFpbi5qcyIsIndlYnBhY2s6Ly8vLi4vdmlld3Mgc3luYyBeXFwuXFwvLipcXC5qcyQiLCJ3ZWJwYWNrOi8vLy4uL3ZpZXdzL2RlZmF1bHQvY29uZmlnL2ZyLmpzIiwid2VicGFjazovLy8uL3NyYy9sb2dpbkxpbmsuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2RvbS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvZXZlcnl3aGVyZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvdXJsLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy91c2Vycy5qcyJdLCJuYW1lcyI6WyJ1c2VycyIsInJlcXVpcmUiLCJxdWVzdGlvbm5haXJlcyIsIm1vZHVsZSIsImV4cG9ydHMiLCJhcGlVcmwiLCJzaXRlVXJsIiwiYWRtaW5OYW1lIiwiYWRtaW5FbWFpbCIsInNlbmRlck5hbWUiLCJzZW5kZXJFbWFpbCIsImFkbWluTGFuZyIsInRoZW1lIiwiYXZhaWxhYmxlTGFuZ3MiLCJzaXRlTmFtZSIsImJlZ2luQ29kZUdvZGZhdGhlciIsImNyb25UaW1pbmdBbGVydEluU2Vjb25kZSIsInJlc3BvbnNlVGltaW5nQWxlcnRJblNlY29uZGUiLCJ0b2tlblNpZ251cFZhbGlkYXRpb25UaW1lSW5Ib3VycyIsInRva2VuTG9naW5MaW5rVGltZUluSG91cnMiLCJ0b2tlbkNvbm5leGlvbk1pblRpbWVJbkhvdXJzIiwidG9rZW5Db25uZXhpb25NYXhUaW1lSW5EYXlzIiwidG9rZW5Mb2dpbkNoYW5naW5nVGltZUluSG91cnMiLCJ0b2tlbkRlbGV0ZVVzZXJUaW1lSW5Ib3VycyIsInRva2VuVW5zdWJzY3JpYmVMaW5rVGltZUluRGF5cyIsImZyZWVBY2NvdW50VGltaW5nSW5EYXlzIiwiZnJlZUFjY291bnRFeHBpcmF0aW9uTm90aWZpY2F0aW9uSW5EYXlzIiwiYWNjb3VudEV4cGlyYXRpb25GaXJzdE5vdGlmaWNhdGlvbkluRGF5cyIsImFjY291bnRFeHBpcmF0aW9uU2Vjb25kTm90aWZpY2F0aW9uSW5EYXlzIiwiaW5hY3RpdmVBY2NvdW50VGltZVRvRGVsZXRlSW5EYXlzIiwibmJRdWVzdGlvbnNNaW4iLCJuYlF1ZXN0aW9uc01heCIsIm5iQ2hvaWNlc01heCIsIm5iTmV3UXVlc3Rpb25uYWlyZXMiLCJob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVCZWdpbiIsImhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUVuZCIsIm51bWJlck5ld1F1ZXN0aW9ubmFpcmVBdFNhbWVUaW1lIiwibWluU2VhcmNoUXVlc3Rpb25uYWlyZXMiLCJuYklsbHVzdHJhdGlvbnNNaW4iLCJuYklsbHVzdHJhdGlvbnNNYXgiLCJtYXhJbGx1c3RyYXRpb25TaXplaW5PY3RldCIsIm1pbWVUeXBlc0ZvcklsbHVzdHJhdGlvbiIsImlsbHVzdHJhdGlvbnNXaWR0aE1heEluUHgiLCJpbGx1c3RyYXRpb25zTWluaWF0dXJlc1dpZHRoTWF4SW5QeCIsIm5iTGlua3NNaW4iLCJuYkxpbmtzTWF4IiwicGFzc3dvcmQiLCJtaW5sZW5ndGgiLCJkaXJDYWNoZVVzZXJzIiwiZGlyQ2FjaGVVc2Vyc0Fuc3dlcnMiLCJkaXJDYWNoZVF1ZXN0aW9ubmFpcmVzIiwiZGlyQ2FjaGVRdWVzdGlvbnMiLCJkaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXMiLCJkaXJIVE1MUXVlc3Rpb25uYWlyZSIsImRpcldlYlF1ZXN0aW9ubmFpcmUiLCJxdWVzdGlvbm5haXJlUm91dGVzIiwiZ2V0UXVlc3Rpb25uYWlyZVJvdXRlcyIsInByZXZpZXdRdWVzdGlvbm5haXJlUm91dGVzIiwicHVibGlzaGVkUXVlc3Rpb25uYWlyZVJvdXRlcyIsInNhdmVBbnN3ZXJzUm91dGUiLCJnZXRTdGF0c1F1ZXN0aW9ubmFpcmVzIiwic2VhcmNoUXVlc3Rpb25uYWlyZXNSb3V0ZSIsInNlYXJjaEFkbWluUXVlc3Rpb25uYWlyZXNSb3V0ZSIsImdldExpc3ROZXh0UXVlc3Rpb25uYWlyZXMiLCJxdWVzdGlvbnNSb3V0ZSIsInRhZ3NTZWFyY2hSb3V0ZSIsImdldFF1ZXN0aW9ubmFpcmVzV2l0aG91dEFuc3dlciIsImdldFByZXZpb3VzQW5zd2VycyIsImdldFN0YXRzQW5zd2VycyIsImdldEFkbWluU3RhdHMiLCJRdWVzdGlvbm5haXJlIiwidGl0bGUiLCJtYXhsZW5ndGgiLCJyZXF1aXJlZCIsInNsdWciLCJpbnRyb2R1Y3Rpb24iLCJzZWFyY2hRdWVzdGlvbm5haXJlcyIsIlF1ZXN0aW9uIiwidGV4dCIsInJhbmsiLCJtaW4iLCJkZWZhdWx0VmFsdWUiLCJDaG9pY2UiLCJuYlRhZ3NNaW4iLCJuYlRhZ3NNYXgiLCJkaXJDYWNoZVRhZ3MiLCJkaXJIVE1MVGFncyIsImRpcldlYlRhZ3MiLCJ1c2VyUm91dGVzIiwic3Vic2NyaWJlUm91dGUiLCJnZXRHb2RmYXRoZXJSb3V0ZSIsImNoZWNrSWZJc0VtYWlsZnJlZVJvdXRlIiwiY2hlY2tTdWJzY3JpYmVUb2tlblJvdXRlIiwiY2hlY2tMb2dpblJvdXRlIiwiY29ubmVjdGlvblJvdXRlIiwiZ2V0TG9naW5MaW5rUm91dGUiLCJjb25uZWN0aW9uV2l0aExpbmtSb3V0ZSIsImdldFVzZXJJbmZvcyIsImNyZWF0ZVVzZXJSb3V0ZSIsInZhbGlkYXRlVXNlclJvdXRlIiwidXBkYXRlVXNlckluZm9zIiwic2VhcmNoVXNlclJvdXRlIiwiZ2V0R29kQ2hpbGRzIiwiY2hlY2tOZXdMb2dpbkxpbmtSb3V0ZSIsImNoZWNrRGVsZXRlTGlua1JvdXRlIiwiZ2V0UGF5bWVudHMiLCJ1bnN1YnNjcmliZVJvdXRlIiwibmFtZSIsImVtYWlsIiwibmV3UGFzc3dvcmQiLCJjb2RlR29kZmF0aGVyIiwiY2d1T2siLCJ2YWx1ZSIsInRpbWVEaWZmZXJlbmNlTWluIiwidGltZURpZmZlcmVuY2VNYXgiLCJzaXRlSFRNTFRpdGxlIiwic2l0ZU1ldGFEZXNjcmlwdGlvbiIsInNjcmlwdFRpbWluZ0luZm8iLCJzY3JpcHRUaW1pbmdBbGVydCIsInNlcnZlckVycm9yIiwic2VydmVyRXJyb3JBZG1pbiIsIm5lZWRlZFBhcmFtcyIsImJhZFVybCIsIm5vdFZhbGlkRm9ybWF0Iiwibm90QWxsb3dlZCIsIm5vdFJlcXVpcmVkIiwidXBkYXRlQnRuVHh0IiwiYWRkQnRuVHh0IiwiZGVsZXRlQnRuVHh0IiwiYWRkT2tNZXNzYWdlIiwidXBkYXRlT2tNZXNzYWdlIiwiZGVsZXRlT2tNZXNzYWdlIiwiZmFpbEF1dGgiLCJmYWlsQXV0aEhlYWRlciIsImZhaWxBdXRoVG9rZW4iLCJmYWlsQXV0aElkIiwiZmFpbEF1dGhDcm9uIiwicHJldmlvdXNQYWdlIiwibmV4dFBhZ2UiLCJidG5MaW5rVG9RdWVzdGlvbm5haXJlIiwic3RhdHNBZG1pbiIsIm5vdEZvdW5kIiwibmVlZE5hbWUiLCJuZWVkTm90VG9vTG9uZ05hbWUiLCJuZWVkRW1haWwiLCJuZWVkVW5pcXVlRW1haWwiLCJuZWVkTm90VG9vTG9uZ0VtYWlsIiwibmVlZFBhc3NXb3JkIiwibmVlZExvbmdQYXNzV29yZCIsInBhc3N3b3JkQ29waWVkIiwibmVlZFN0YXR1cyIsIm5lZWRMYW5ndWFnZSIsIm5lZWRWYWxpZExhc3RDb25uZWN0aW9uRGF0ZSIsIm5lZWRTTVRQIiwibmVlZFNNVFBOb3RGb3VuZCIsIm5lZWRLbm93TmV3c2xldHRlck9rIiwibmVlZFRpbWVEaWZmZXJlbmNlIiwibmVlZE1pblRpbWVEaWZmZXJlbmNlIiwibmVlZE1heFRpbWVEaWZmZXJlbmNlIiwibmVlZFVHQ09rIiwiZ29kZmF0aGVyTm90Rm91bmQiLCJnb2RmYXRoZXJGb3VuZCIsIm1haWxWYWxpZGF0aW9uTWVzc2FnZSIsIm1haWxWYWxpZGF0aW9uTGlua1N1YmplY3QiLCJtYWlsVmFsaWRhdGlvbkxpbmtTQm9keVR4dCIsIm1haWxWYWxpZGF0aW9uTGlua1NCb2R5SFRNTCIsInZhbGlkYXRpb25NZXNzYWdlIiwidmFsaWRhdGlvbk1lc3NhZ2VBZG1pbiIsInZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZSIsInZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZUFkbWluIiwibWFpbFdlbGNvbWVTdWJqZWN0IiwibWFpbFdlbGNvbWVCb2R5VHh0IiwibWFpbFdlbGNvbWVCb2R5SFRNTCIsIm1haWxUaGFua0dvZGZhdGhlclN1YmplY3QiLCJtYWlsVGhhbmtHb2RmYXRoZXJCb2R5VHh0IiwibWFpbFRoYW5rR29kZmF0aGVyQm9keUhUTUwiLCJiYWRMaW5rVmFsaWRhdGlvbk1lc3NhZ2UiLCJlbWFpbE5vdEZvdW5kIiwiYWxyZWFkeUNvbm5lY3RlZCIsIm5lZWRCZUNvbm5lY3RlZCIsImNvbm5lY3Rpb25PayIsIm5lZWRDaG9vc2VMb2dpbldheSIsIm5lZWRWYWxpZGF0aW9uVG9Mb2dpbiIsInRvb01hbnlMb2dpbkZhaWxzIiwiYmFkUGFzc3dvcmQiLCJtYWlsTG9naW5MaW5rU3ViamVjdCIsIm1haWxMb2dpbkxpbmtCb2R5VHh0IiwibWFpbExvZ2luTGlua0JvZHlIVE1MIiwibWFpbExvZ2luTGlua01lc3NhZ2UiLCJ1cGRhdGVkT2tNZXNzYWdlIiwidXBkYXRlZE5lZWRHb29kRW1haWwiLCJ1cGRhdGVkTmVlZFVuaXF1ZUVtYWlsIiwibWFpbFVwZGF0ZUxvZ2luU3ViamVjdCIsIm1haWxVcGRhdGVMb2dpbkJvZHlUeHQiLCJtYWlsVXBkYXRlTG9naW5Cb2R5SFRNTCIsIm1haWxVcGRhdGVMb2dpbkxpbmtNZXNzYWdlIiwidXBkYXRlZE5lZWRWYWxpZGF0ZWRVc2VyIiwidXBkYXRlZE5lZWRHb29kR29kZmF0aGVyIiwibWFpbFVwZGF0ZUxvZ2luT2tNZXNzYWdlIiwidXBkYXRlZEZhaWxlZEdvZGZhdGhlck5vdEZvdW5kIiwiY3JlYXRpb25Pa01lc3NhZ2UiLCJtYWlsRGVsZXRlU3ViamVjdCIsIm1haWxEZWxldGVCb2R5VHh0IiwibWFpbERlbGV0ZUJvZHlIVE1MIiwibWFpbERlbGV0ZUxpbmtNZXNzYWdlIiwiZGVsZXRlRmFpbE1lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua09rTWVzc2FnZSIsIm1haWxEZWxldGVMaW5rQWxyZWFkeU1lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua0ZhaWxNZXNzYWdlIiwiY3JvbkRlbGV0ZVVudmFsaWRlZFVzZXJzTWVzc2FnZSIsImRlbGV0ZUluYWN0aXZlVXNlcnNNZXNzYWdlIiwid2VsY29tZU1lc3NhZ2UiLCJieWVieWVNZXNzYWdlIiwiaW5mb3NVc2VyRm9yQWRtaW4iLCJpbmZvc0FkbWluR29kZmF0aGVyIiwiaW5mb3NBZG1pbk5iR29kQ2hpbGRzIiwiVG9vbCIsIm15VmFyIiwidW5kZWZpbmVkIiwidHJpbSIsIm15U3RyaW5nIiwiaXNFbXB0eSIsIm1heCIsImxlbmd0aCIsInN1YnN0cmluZyIsIm1hcE9iaiIsInJlcGxhY2VFbHRzIiwiUmVnRXhwIiwiT2JqZWN0Iiwia2V5cyIsImpvaW4iLCJyZXBsYWNlIiwibWF0Y2hlZCIsIk1hdGgiLCJjZWlsIiwiZmxvb3IiLCJyYW5kb20iLCJkYXRlU3RyaW5nIiwibGFuZyIsIm15RGF0ZSIsIkRhdGUiLCJteURheSIsImdldERhdGUiLCJteU1vdW50aCIsImdldE1vbnRoIiwibXlZZWFyIiwiZ2V0RnVsbFllYXIiLCJoZWFkTGlua3MiLCJhbmNob3IiLCJhdHRyaWJ1dGVzIiwiaHJlZiIsImlkIiwiZm9vdExpbmtzIiwicmVsIiwibWF4UXVlc3Rpb25uYWlyZXNCeVBhZ2UiLCJ1c2VySG9tZVBhZ2UiLCJhZG1pbkhvbWVQYWdlIiwibWFuYWdlckhvbWVQYWdlIiwic3Vic2NyaWJlUGFnZSIsImNvbm5lY3Rpb25QYWdlIiwiYWNjb3VudFBhZ2UiLCJxdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlIiwidXNlcnNNYW5hZ2VtZW50UGFnZSIsIm5iUXVlc3Rpb25uYWlyZXNVc2VySG9tZVBhZ2UiLCJpbGx1c3RyYXRpb25EaXIiLCJzaXRlU2xvZ2FuIiwiaG9tZVRpdGxlMSIsImhvbWVQMSIsImhvbWVUaXRsZTIiLCJob21lUDIiLCJuZXdRdWVzdGlvbm5haXJlc1RpdGxlIiwibmV3UXVlc3Rpb25uYWlyZXNJbnRybyIsImV4cGxhbmF0aW9uVGl0bGUiLCJleHBsYW5hdGlvblR4dCIsIm5vSlNOb3RpZmljYXRpb24iLCJjb25maWdGcm9udEVuZCIsInR4dCIsInR4dFVzZXJzIiwiZGl2UmVzcG9uc2UiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwiaGVsbG9EZXYiLCJjb25maWciLCJpbml0aWFsaXNlIiwiZ2V0Q29uZmlnIiwiYWRkRWxlbWVudCIsImNoZWNrU2Vzc2lvbiIsImlzQ29ubmVjdGVkIiwic2F2ZUxvY2FseSIsIm1lc3NhZ2UiLCJjb2xvciIsInVzZXIiLCJnZXRMb2NhbHkiLCJob21lUGFnZSIsInN0YXR1cyIsIndpbmRvdyIsImxvY2F0aW9uIiwiYXNzaWduIiwiZGF0YXMiLCJnZXRVcmxQYXJhbXMiLCJ0IiwieGhyIiwiWE1MSHR0cFJlcXVlc3QiLCJvcGVuIiwib25yZWFkeXN0YXRlY2hhbmdlIiwicmVhZHlTdGF0ZSIsIkRPTkUiLCJyZXNwb25zZSIsIkpTT04iLCJwYXJzZSIsInJlc3BvbnNlVGV4dCIsInVzZXJJZCIsImNvbm5leGlvblRpbWUiLCJ0b2tlbiIsImNvbm5leGlvbk1heFRpbWUiLCJub3ciLCJlbmRzV2l0aCIsInBhcnNlSW50Iiwic2V0U2Vzc2lvbiIsInJlbW92ZUxvY2FseSIsImVycm9ycyIsIkFycmF5IiwiaXNBcnJheSIsInRpbWVEaWZmZXJlbmNlIiwiZ2V0VGltZURpZmZlcmVuY2UiLCJjaGVja0Fuc3dlckRhdGFzIiwic2V0UmVxdWVzdEhlYWRlciIsInNlbmQiLCJzdHJpbmdpZnkiLCJkYXRhIiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsImpzb24iLCJnZXRJdGVtIiwicmVtb3ZlSXRlbSIsImVsdFBhcmVudCIsImVsdFR5cGUiLCJlbHRDb250ZW50IiwiZWx0SWQiLCJlbHRDbGFzcyIsImVsdEF0dHJpYnV0ZXMiLCJuZXdFbGVtZW50IiwiY3JlYXRlRWxlbWVudCIsImkiLCJjbGFzc0xpc3QiLCJhZGQiLCJhdHRyaWJ1dE5hbWUiLCJzZXRBdHRyaWJ1dGUiLCJpbm5lckhUTUwiLCJhcHBlbmRDaGlsZCIsImNvbnNvbGUiLCJsb2ciLCJ1cGRhdGVBY2NvdW50TGluayIsImNvbmZpZ1RlbXBsYXRlIiwibGluayIsInNlYXJjaCIsInBhcmFtZXRlcnMiLCJzcGxpdCIsInBhcmFtIiwiZGVjb2RlVVJJIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJvbmxvYWQiLCJvbmVycm9yIiwic3RhdHVzVGV4dCIsInRpbWVMb2NhbCIsImdldFRpbWV6b25lT2Zmc2V0IiwiZ2V0UGFzc3dvcmQiLCJuYkNhck1pbiIsIm5iQ2FyTWF4IiwibmJDYXIiLCJsZXR0ZXJzIiwib3RoZXJzIiwiZHVyYXRpb25UUyIsInN0b3JhZ2VVc2VyIiwiZHVyYXRpb24iLCJsYXN0QW5zd2VyIiwiYW5zd2VyIiwibmJDb3JyZWN0QW5zd2VycyIsIlF1ZXN0aW9ubmFpcmVJZCIsIm5iUXVlc3Rpb25zIiwidXJsUmVkaXJlY3Rpb24iLCJ1cmxXYW50ZWQiLCJ1c2VyRGF0YXMiLCJyZWRpcmVjdFVzZXIiLCJpc1ZhbGlkIiwibGFuZ3VhZ2UiLCJuYkRheXNPayIsInVybEFjY291bnQiLCJpbmRleE9mIl0sIm1hcHBpbmdzIjoiO1FBQUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7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QUNJMUMsNEZBQVksQ0FBQyxNQUFELENBQVo7QUFDQWtFLGtDQUFZLENBQUNILGNBQUQsRUFBaUI3RixPQUFqQixFQUEwQjhGLFNBQTFCLENBQVo7QUFDQXRCLDZCQUFPLENBQUMsS0FBRCxDQUFQO0FBQ0g7QUFDSixtQkE1Q0Q7O0FBNkNBNUQscUJBQUcsQ0FBQytELE9BQUosR0FBYztBQUFBLDJCQUFNRixNQUFNLENBQUM3RCxHQUFHLENBQUNnRSxVQUFMLENBQVo7QUFBQSxtQkFBZDs7QUFDQWhFLHFCQUFHLENBQUMwQixJQUFKO0FBQ0g7QUFDSjtBQUNKLGFBdEVNLENBRmlCOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEdBQUg7O0FBQUEsa0JBQVp6QyxZQUFZO0FBQUE7QUFBQTtBQUFBLEdBQWxCLEMsQ0EwRVA7O0FBQ0EsSUFBTW1HLFlBQVksR0FBRyxTQUFmQSxZQUFlLENBQUNILGNBQUQsRUFBaUI3RixPQUFqQixFQUEwQjhGLFNBQTFCLEVBQ3JCO0FBQ0ksTUFBRyxDQUFDbEssMkRBQU8sQ0FBQ29FLE9BQUQsQ0FBWCxFQUNJRCxvRUFBVSxDQUFDLFNBQUQsRUFBWUMsT0FBWixDQUFWO0FBQ0osTUFBRyxDQUFDcEUsMkRBQU8sQ0FBQ2tLLFNBQUQsQ0FBWCxFQUNJL0Ysb0VBQVUsQ0FBQyxLQUFELEVBQVErRixTQUFSLENBQVY7QUFDSixNQUFHLENBQUNsSywyREFBTyxDQUFDaUssY0FBRCxDQUFYLEVBQ0l2RixNQUFNLENBQUNDLFFBQVAsQ0FBZ0JDLE1BQWhCLENBQXVCcUYsY0FBdkI7QUFDUCxDQVJELEMiLCJmaWxlIjoiLi9KUy9sb2dpbkxpbmsuYXBwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvbG9naW5MaW5rLmpzXCIpO1xuIiwiY29uc3QgdXNlcnMgPSByZXF1aXJlKFwiLi91c2Vyc1wiKTtcbmNvbnN0IHF1ZXN0aW9ubmFpcmVzID0gcmVxdWlyZShcIi4vcXVlc3Rpb25uYWlyZXNcIik7XG5cbm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBhcGlVcmw6IFwiaHR0cDovL2xvY2FsaG9zdDozMDAwL2FwaVwiLFxuICAgIHNpdGVVcmw6IFwiaHR0cDovL2xvY2FsaG9zdDo4MDgwXCIsXG4gICAgYWRtaW5OYW1lOiBcIkZhYnJpY2VcIixcbiAgICBhZG1pbkVtYWlsOiBcImRldkB3aWtpbGVybmkuY29tXCIsXG4gICAgc2VuZGVyTmFtZTogXCJXaWtpTGVybmlcIixcbiAgICBzZW5kZXJFbWFpbDogXCJib25qb3VyQHdpa2lsZXJuaS5jb21cIixcbiAgICBhZG1pbkxhbmc6IFwiZnJcIixcbiAgICB0aGVtZTogXCJkZWZhdWx0XCIsIC8vIGxlIHRow6htZSB1dGlsaXPDqSAoZGFucyAvdmlld3MpIHBvdXIgZ8OpbsOpcmVyIGxlcyBwYWdlcyBIVE1MLiBDb250aWVudCBzZXMgcHJvcHJlcyBmaWNoaWVycyBkZSBjb25maWd1cmF0aW9uLlxuICAgIGF2YWlsYWJsZUxhbmdzOiBbXCJmclwiXSwvLyBMYW5ndWFnZXMgaW4gd2hpY2ggdGhlIHNpdGUgaXMgYXZhaWxhYmxlLiBUaGUgZmlyc3Qgb25lIGlzIHRoZSBkZWZhdWx0IG9uZS5cbiAgICBzaXRlTmFtZTogXCJXaWtpTGVybmlcIixcbiAgICBiZWdpbkNvZGVHb2RmYXRoZXI6IFwid2lraWxlcm5pXCIsIC8vIGNhc2Utc2Vuc2l0aXZlIGFuZCBjYW4ndCBjb250YWluIFwiQFwiICFcbiAgICBjcm9uVGltaW5nQWxlcnRJblNlY29uZGU6IDEyMCwgLy8gZm9yIGxvZ3NcbiAgICByZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlOiAzLCAvLyBpZGVtXG4gICAgdG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnM6IFwiNDhoXCIsIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96ZWl0L21zXG4gICAgdG9rZW5Mb2dpbkxpbmtUaW1lSW5Ib3VyczogXCIxaFwiLFxuICAgIHRva2VuQ29ubmV4aW9uTWluVGltZUluSG91cnM6IFwiMjRoXCIsXG4gICAgdG9rZW5Db25uZXhpb25NYXhUaW1lSW5EYXlzOiBcIjE4MCBkYXlzXCIsXG4gICAgdG9rZW5Mb2dpbkNoYW5naW5nVGltZUluSG91cnM6IFwiMWhcIiwvLyBmb3IgZW1haWwgJiBwYXNzd29yZCBjaGFuZ2luZ1xuICAgIHRva2VuRGVsZXRlVXNlclRpbWVJbkhvdXJzOiBcIjFoXCIsXG4gICAgdG9rZW5VbnN1YnNjcmliZUxpbmtUaW1lSW5EYXlzOiBcIjcgZGF5c1wiLCAvLyB0b2tlbiBzZW5kIHdpdGggc3Vic2NyaXB0aW9uJ3MgZW1haWxzXG4gICAgZnJlZUFjY291bnRUaW1pbmdJbkRheXM6IDEwLFxuICAgIGZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5czogNSxcbiAgICBhY2NvdW50RXhwaXJhdGlvbkZpcnN0Tm90aWZpY2F0aW9uSW5EYXlzOiAxNCwgICAgXG4gICAgYWNjb3VudEV4cGlyYXRpb25TZWNvbmROb3RpZmljYXRpb25JbkRheXM6IDUsXG4gICAgaW5hY3RpdmVBY2NvdW50VGltZVRvRGVsZXRlSW5EYXlzOiAxODAsXG4gICAgLy8gUXVlc3Rpb25uYWlyZXM6XG4gICAgbmJRdWVzdGlvbnNNaW46IDEsIC8vIG1pbmltdW0gbnVtYmVyIG9mIHF1ZXN0aW9ucyBmb3IgdGhlIHF1ZXN0aW9ubmFpcmUgdG8gYmUgcHVibGlzaGFibGVcbiAgICBuYlF1ZXN0aW9uc01heDogMTAsIC8vIGlmIDAgPSBub3QgbWF4aW11bVxuICAgIG5iQ2hvaWNlc01heDogMTAsXG4gICAgbmJOZXdRdWVzdGlvbm5haXJlczogMTAsLy8gZm9yIFJTUywgZXRjLlxuICAgIGhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUJlZ2luOjEsIC8vIGluIHVzZXIgbG9jYWwgdGltZVxuICAgIGhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUVuZDoyNCwgLy8gaWRlbVxuICAgIG51bWJlck5ld1F1ZXN0aW9ubmFpcmVBdFNhbWVUaW1lOiA1MCwgLy8gZm9yIG1hc3MgbWFpbGluZ1xuICAgIG1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzOiAzLFxuICAgIC8vIElsbHVzdHJhdGlvbnM6XG4gICAgbmJJbGx1c3RyYXRpb25zTWluOiAwLFxuICAgIG5iSWxsdXN0cmF0aW9uc01heDogMSxcbiAgICBtYXhJbGx1c3RyYXRpb25TaXplaW5PY3RldDogMTAwMDAwMCwvLyBwYXMgY29udHLDtGzDqSBwb3VyIGwnaW5zdGFudC4gw4AgcmV2b2lyLlxuICAgIG1pbWVUeXBlc0ZvcklsbHVzdHJhdGlvbjogWyBcImltYWdlL2pwZ1wiLCBcImltYWdlL2pwZWdcIiwgXCJpbWFnZS9wbmdcIiwgXCJpbWFnZS9naWZcIiwgXCJpbWFnZS9wbmdcIiBdLFxuICAgIC8vIC0tIFVwbG9hZCBhbmQgcmVzaXplOlxuICAgIGlsbHVzdHJhdGlvbnNXaWR0aE1heEluUHg6IDQwMCxcbiAgICBpbGx1c3RyYXRpb25zTWluaWF0dXJlc1dpZHRoTWF4SW5QeDogMjAwLFxuICAgIC8vIExpbmtzOlxuICAgIG5iTGlua3NNaW46IDEsXG4gICAgbmJMaW5rc01heDogMSxcbiAgICAvLyDDoCBzdXBwcmltZXIgcXVhbmQgdG91cyBsZXMgXCJyZXF1aXJlXCIgw6Agam91cjpcbiAgICBuYlF1ZXN0aW9uc01pbjogcXVlc3Rpb25uYWlyZXMubmJRdWVzdGlvbnNNaW4sXG4gICAgbmJRdWVzdGlvbnNNYXg6IHF1ZXN0aW9ubmFpcmVzLm5iUXVlc3Rpb25zTWF4LFxuICAgIG5iQ2hvaWNlc01heDogcXVlc3Rpb25uYWlyZXMubmJDaG9pY2VzTWF4LFxuICAgIHBhc3N3b3JkTWluTGVuZ3RoOiB1c2Vycy5wYXNzd29yZC5taW5sZW5ndGgsXG4gICAgZGlyQ2FjaGVVc2VyczogdXNlcnMuZGlyQ2FjaGVVc2VycyxcbiAgICBkaXJDYWNoZVVzZXJzQW5zd2VyczogdXNlcnMuZGlyQ2FjaGVVc2Vyc0Fuc3dlcnMsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbm5haXJlczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyxcbiAgICBkaXJDYWNoZVF1ZXN0aW9uczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVRdWVzdGlvbnMsXG4gICAgZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzOiBxdWVzdGlvbm5haXJlcy5kaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXMsXG4gICAgZGlySFRNTFF1ZXN0aW9ubmFpcmU6IHF1ZXN0aW9ubmFpcmVzLmRpckhUTUxRdWVzdGlvbm5haXJlLFxuICAgIGRpcldlYlF1ZXN0aW9ubmFpcmU6IHF1ZXN0aW9ubmFpcmVzLmRpcldlYlF1ZXN0aW9ubmFpcmVcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxueyAgICBcbiAgICAvLyBBUEkncm91dGVzIChhZnRlciBcImFwaVVybFwiIGRlZmluZWQgaW4gaW5zdGFuY2UuanMpXG4gICAgcXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcXVlc3Rpb25uYWlyZVwiLFxuICAgIGdldFF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL2dldFwiLFxuICAgIHByZXZpZXdRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9wcmV2aWV3XCIsXG4gICAgcHVibGlzaGVkUXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcXVpei9cIixcbiAgICBzYXZlQW5zd2Vyc1JvdXRlOiBcIi9hbnN3ZXIvXCIsXG4gICAgZ2V0U3RhdHNRdWVzdGlvbm5haXJlcyA6IFwiL3N0YXRzL1wiLFxuICAgIHNlYXJjaFF1ZXN0aW9ubmFpcmVzUm91dGUgOiBcIi9zZWFyY2hcIixcbiAgICBzZWFyY2hBZG1pblF1ZXN0aW9ubmFpcmVzUm91dGUgOiBcIi9zZWFyY2hhZG1pblwiLFxuICAgIGdldExpc3ROZXh0UXVlc3Rpb25uYWlyZXM6IFwiL2dldGxpc3RuZXh0cXVlc3Rpb25uYWlyZXMvXCIsXG4gICAgLy8gLS0gcXVlc3Rpb25zICYgY2hvaWNlcyA6XG4gICAgcXVlc3Rpb25zUm91dGU6IFwiL3F1ZXN0aW9uL1wiLFxuICAgIC8vIC0tIHRhZ3MgOlxuICAgIHRhZ3NTZWFyY2hSb3V0ZTogXCIvdGFncy9zZWFyY2gvXCIsXG4gICAgLy8gLS0gYW5zd2VycyA6XG4gICAgZ2V0UXVlc3Rpb25uYWlyZXNXaXRob3V0QW5zd2VyOiBcIi93aXRob3V0YW5zd2VyL3VzZXIvXCIsXG4gICAgZ2V0UHJldmlvdXNBbnN3ZXJzOiBcIi91c2VyL2Fuc3dlcnMvXCIsXG4gICAgZ2V0U3RhdHNBbnN3ZXJzIDogXCIvdXNlci9hbndzd2Vycy9zdGF0cy9cIixcbiAgICBnZXRBZG1pblN0YXRzOiBcIi9nZXRhZG1pbnN0YXRzL1wiLFxuICAgIC8vIGZvcm1zIDogw6AgY29tcGzDqXRlciBhdmVjIHZhbGV1cnMgcGFyIGTDqWZhdXQsIGV0Yy4gY2YgbW9kw6hsZVxuICAgIFF1ZXN0aW9ubmFpcmUgOlxuICAgIHtcbiAgICAgICAgdGl0bGU6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgIHNsdWc6IHsgbWF4bGVuZ3RoOiAxNTAgfSwgLy8gY2hhbXAgcmVxdWlzIG1haXMgY2FsY3Vsw6kgw6AgcGFydGlyIGR1IHRpdHJlIHFkIHZpZGVcbiAgICAgICAgaW50cm9kdWN0aW9uOiB7IHJlcXVpcmVkOiB0cnVlIH1cbiAgICB9LFxuICAgIHNlYXJjaFF1ZXN0aW9ubmFpcmVzIDogeyBtaW5sZW5ndGg6IDMsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgUXVlc3Rpb24gOlxuICAgIHtcbiAgICAgICAgdGV4dDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgcmFuazogeyByZXF1aXJlZDogdHJ1ZSwgbWluOjEsIGRlZmF1bHRWYWx1ZToxIH1cbiAgICB9LCAgICAgICAgICBcbiAgICBDaG9pY2UgOlxuICAgIHtcbiAgICAgICAgdGV4dDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfVxuICAgIH0sICAgICAgICAgIFxuICAgIG5iUXVlc3Rpb25zTWluOiAxLFxuICAgIG5iUXVlc3Rpb25zTWF4OiAxMCxcbiAgICBuYkNob2ljZXNNYXg6IDEwLFxuICAgIG5iVGFnc01pbjogMCxcbiAgICBuYlRhZ3NNYXg6IDAsIC8vIDAgPSBub3QgbWF4ICAgIFxuICAgIC8vIEpTT04gYW5kIEhUTUwgZGlyXG4gICAgZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXNcIixcbiAgICBkaXJDYWNoZVF1ZXN0aW9ucyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXMvcXVlc3Rpb25zXCIsXG4gICAgZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzIDogXCJkYXRhcy91c2Vycy9xdWVzdGlvbm5haXJlc1wiLFxuICAgIGRpckNhY2hlVGFncyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXMvdGFnc1wiLCAgXG4gICAgZGlySFRNTFF1ZXN0aW9ubmFpcmUgOiBcImZyb250L3B1YmxpYy9xdWl6XCIsXG4gICAgZGlySFRNTFRhZ3MgOiBcImZyb250L3B1YmxpYy9xdWl6c1wiLFxuICAgIGRpcldlYlF1ZXN0aW9ubmFpcmUgOiBcInF1aXpcIiwvL3BvdXIgdXJsIHBhZ2VcbiAgICBkaXJXZWJUYWdzIDogXCJxdWl6c1wiLy8gaWRlbVxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgLy8gQVBJJ3JvdXRlcyAoYWZ0ZXIgXCJhcGlVcmxcIiBkZWZpbmVkIGluIGluc3RhbmNlLmpzKVxuICAgIHVzZXJSb3V0ZXM6IFwiL3VzZXJcIixcbiAgICBzdWJzY3JpYmVSb3V0ZTogXCIvc2lnbnVwXCIsXG4gICAgZ2V0R29kZmF0aGVyUm91dGU6IFwiL2dldGdvZGZhdGhlcmlkXCIsXG4gICAgY2hlY2tJZklzRW1haWxmcmVlUm91dGU6IFwiL2lzZW1haWxmcmVlXCIsXG4gICAgY2hlY2tTdWJzY3JpYmVUb2tlblJvdXRlOiBcIi92YWxpZGF0aW9uL1wiLFxuICAgIGNoZWNrTG9naW5Sb3V0ZTogXCIvY2hlY2tsb2dpbi9cIixcbiAgICBjb25uZWN0aW9uUm91dGU6IFwiL2xvZ2luXCIsXG4gICAgZ2V0TG9naW5MaW5rUm91dGU6IFwiL2dldGxvZ2lubGlua1wiLFxuICAgIGNvbm5lY3Rpb25XaXRoTGlua1JvdXRlOiBcIi9jaGVja2xvZ2lubGlua1wiLFxuICAgIGdldFVzZXJJbmZvczogXCIvZ2V0L1wiLFxuICAgIGNyZWF0ZVVzZXJSb3V0ZTogXCIvY3JlYXRlXCIsXG4gICAgdmFsaWRhdGVVc2VyUm91dGU6IFwiL3ZhbGlkYXRlL1wiLFxuICAgIHVwZGF0ZVVzZXJJbmZvczogXCIvbW9kaWZ5L1wiLFxuICAgIHNlYXJjaFVzZXJSb3V0ZTogXCIvc2VhcmNoL1wiLFxuICAgIGdldEdvZENoaWxkczogXCIvZ2V0Z29kY2hpbGRzL1wiLFxuICAgIGNoZWNrTmV3TG9naW5MaW5rUm91dGU6IFwiL2NvbmZpcm1uZXdsb2dpbi9cIixcbiAgICBjaGVja0RlbGV0ZUxpbmtSb3V0ZTogXCIvY29uZmlybWRlbGV0ZS9cIixcbiAgICBnZXRQYXltZW50czogXCIvcGF5bWVudC9nZXRmb3JvbmV1c2VyL1wiLFxuICAgIHVuc3Vic2NyaWJlUm91dGU6IFwiL3N1YnNjcmlwdGlvbi9zdG9wL1wiLFxuICAgIGdldEFkbWluU3RhdHM6IFwiL2dldGFkbWluc3RhdHMvXCIsXG4gICAgLy8gZm9ybXMgOiDDoCBjb21wbMOpdGVyIGF2ZWMgdmFsZXVycyBwYXIgZMOpZmF1dCwgZXRjLiBjZiBtb2TDqGxlXG4gICAgbmFtZTogeyBtYXhsZW5ndGg6IDcwLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGVtYWlsOiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHBhc3N3b3JkOiB7IG1pbmxlbmd0aDogOCwgbWF4bGVuZ3RoOjcyLCByZXF1aXJlZDogdHJ1ZSB9LCAvLyBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9iY3J5cHQjc2VjdXJpdHktaXNzdWVzLWFuZC1jb25jZXJuc1xuICAgIG5ld1Bhc3N3b3JkOiB7IG1pbmxlbmd0aDogOCwgbWF4bGVuZ3RoOjcyIH0sXG4gICAgY29kZUdvZGZhdGhlcjogeyBtYXhsZW5ndGg6IDI1NSB9LFxuICAgIGNndU9rOiB7IHZhbHVlOiBcInRydWVcIiwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICB0aW1lRGlmZmVyZW5jZU1pbjogLTcyMCxcbiAgICB0aW1lRGlmZmVyZW5jZU1heDo4NDAsXG4gICAgLy8gSlNPTiBkaXJcbiAgICBkaXJDYWNoZVVzZXJzIDogXCJkYXRhcy91c2Vyc1wiLFxuICAgIGRpckNhY2hlVXNlcnNBbnN3ZXJzIDogXCJkYXRhcy91c2Vycy9xdWVzdGlvbm5haXJlcy9hbnN3ZXJzXCJcbn07XG4iLCJ2YXIgbWFwID0ge1xuXHRcIi4vZnIvZ2VuZXJhbFwiOiBcIi4uL2xhbmcvZnIvZ2VuZXJhbC5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi9sYW5nIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcL2dlbmVyYWwkXCI7IiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL3VzZXJcIjogXCIuLi9sYW5nL2ZyL3VzZXIuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC91c2VyJFwiOyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBzaXRlSFRNTFRpdGxlIDogXCJXaWtpTGVybmkgOiBxdSdhbGxlei12b3VzIGFwcHJlbmRyZSBhdWpvdXJkJ2h1aSA/XCIsXG4gICAgc2l0ZU1ldGFEZXNjcmlwdGlvbiA6IFwiQ2hhcXVlIGpvdXIsIHRlc3RleiB2b3MgY29ubmFpc3NhbmNlcyBldCBhcHByZW5leiBkZSBub3V2ZWxsZXMgY2hvc2VzIGF2ZWMgV2lraUxlcm5pLlwiLFxuICAgIHNjcmlwdFRpbWluZ0luZm8gOiBcIkR1csOpZSBkZSBsYSByw6lwb25zZSA6IFNDUklQVF9USU1JTkcgbWlsbGlzZWNvbmRlcywgcm91dGUgOiBTQ1JJUFRfVVJMXCIsXG4gICAgc2NyaXB0VGltaW5nQWxlcnQgOiBcIioqKiBTY3JpcHQgbGVudCA6IFNDUklQVF9USU1JTkcgbWlsbGlzZWNvbmRlcywgcm91dGUgOiBTQ1JJUFRfVVJMXCIsXG4gICAgc2VydmVyRXJyb3IgOiBcIkTDqXNvbMOpLiBVbmUgZXJyZXVyIGltcHLDqXZ1ZSBlc3Qgc3VydmVudWUuIFNpIGNlbGEgcGVyc2lzdGUsIG4naMOpc2l0ZXogw6AgcHLDqXZlbmlyIGwnYWRtaW5pc3RyYXRldXIgZHUgc2l0ZS5cIixcbiAgICBzZXJ2ZXJFcnJvckFkbWluIDogXCJCdWcgZGUgbCdhcHBsaWNhdGlvbiA6XCIsXG4gICAgbmVlZGVkUGFyYW1zIDogXCJEZXMgcGFyYW3DqHRyZXMgbsOpY2Vzc2FpcmVzIG1hbnF1YW50cyBzb250IG1hbnF1YW50cy5cIixcbiAgICBiYWRVcmwgOiBcIlRlbnRhdGl2ZSBkJ2FjY8OocyDDoCB1bmUgcGFnZSBuJ2V4aXN0YW50IHBhcyA6XCIsXG4gICAgbm90VmFsaWRGb3JtYXQgOiBcIkZvcm1hdCBub24gdmFsaWRlLlwiLFxuICAgIG5vdEFsbG93ZWQgOiBcIlZvdXMgbidhdmV6IHBhcyBsZXMgZHJvaXRzIG7DqWNlc3NhaXJlcyBwb3VyIGNldHRlIGFjdGlvbi5cIixcbiAgICBub3RSZXF1aXJlZCA6IFwiRmFjdWx0YXRpZi5cIixcbiAgICB1cGRhdGVCdG5UeHQ6IFwiTW9kaWZpZXJcIixcbiAgICBhZGRCdG5UeHQ6IFwiQWpvdXRlclwiLFxuICAgIGRlbGV0ZUJ0blR4dDogXCJTdXBwcmltZXJcIixcbiAgICBhZGRPa01lc3NhZ2UgOiBcIkxlcyBkb25uw6llcyBvbnQgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWVzLlwiLFxuICAgIHVwZGF0ZU9rTWVzc2FnZSA6IFwiTGEgbWlzZSDDoCBqb3VyIMOgIGpvdXIgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS5cIixcbiAgICBkZWxldGVPa01lc3NhZ2UgOiBcIkxhIHN1cHByZXNzaW9uIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgZmFpbEF1dGggOiBcIkVycmV1ciBkJ2F1dGhlbnRpZmljYXRpb24uXCIsXG4gICAgZmFpbEF1dGhIZWFkZXIgOiBcIkFic2VuY2UgZGUgaGVhZGVyIEF1dGhvcml6YXRpb24uXCIsXG4gICAgZmFpbEF1dGhUb2tlbiA6IFwiVG9rZW4gaW52YWxpZGUgb3UgdXRpbGlzYXRldXIgbm9uIHRyb3V2w6kuXCIsXG4gICAgZmFpbEF1dGhJZCA6IFwiSWRlbnRpZmlhbnQgbm9uIHZhbGlkZSA6IFwiLFxuICAgIGZhaWxBdXRoQ3JvbiA6IFwiVGVudGF0aXZlIGRlIGxhbmNlbWVudCBkJ3VuIGNyb24gc2FucyBsZSBib24gdG9rZW4uXCIsXG4gICAgcHJldmlvdXNQYWdlIDogXCJQYWdlIHByw6ljw6lkZW50ZVwiLFxuICAgIG5leHRQYWdlIDogXCJQYWdlIHN1aXZhbnRlXCIsXG4gICAgYnRuTGlua1RvUXVlc3Rpb25uYWlyZSA6IFwiQWxsZXIgYXUgcXVpeiAhXCIsXG4gICAgc3RhdHNBZG1pbiA6IFwiRHVyYW50IGxlcyBkZXJuacOocmVzIDI0aCA6IE5CX1VTRVJTXzI0SCBjb21wdGVzIG9udCDDqXTDqSBjcsOpw6lzLCBOQl9TVUJTQ1JJUFRJT05TXzI0SCB2YWxpZMOpcyBldCBOQl9VU0VSU19ERUxFVEVEXzI0SCBzdXBwcmltw6lzLiBOQl9BTlNXRVJTXzI0SCByw6lwb25zZXMgYXV4IHF1aXpzIG9udCDDqXTDqSBlbnJlZ2lzdHLDqWVzLjxicj5FbiB0b3V0LCBpbCB5IGEgOiBOQl9VU0VSU19UT1QgY29tcHRlcywgZG9udCBOQl9TVUJTQ1JJUFRJT05TX1RPVCB2YWxpZMOpcyBldCBOQl9TVUJTQ1JJUFRJT05TX1BSRU1JVU0gY29tcHRlcyBwcsOpbWl1bS4gTkJfQU5TV0VSU19UT1QgcsOpcG9uc2VzIGF1eCBxdWl6cyBvbnQgw6l0w6kgZW5yZWdpc3Ryw6llcy48YnI+UGFybWkgbGVzIE5CX1VTRVJTX0RFTEVURURfVE9UIGNvbXB0ZXMgc3VwcHJpbcOpcywgTkJfVVNFUlNfREVMRVRFRF9WQUxJREVEIGF2YWllbnQgdmFsaWTDqSBsZXVyIGNvbXB0ZSBldCBOQl9VU0VSU19ERUxFVEVEX1BSRU1JVU0gYXZhaWVudCBzb3VzY3JpdCB1biBjb21wdGUgcHLDqW1pdW0uXCJcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIG5vdEZvdW5kOiBcIkwndXRpbGlzYXRldXIgbidhIHBhcyDDqXTDqSB0cm91dsOpLlwiLFxuICAgIG5lZWROYW1lOiBcIk1lcmNpIGRlIGNob2lzaXIgdW4gbm9tIGQndXRpbGlzYXRldXIuXCIsXG4gICAgbmVlZE5vdFRvb0xvbmdOYW1lOiBcIk1lcmNpIGRlIGNob2lzaXIgdW4gbm9tIGQndXRpbGlzYXRldXIgbmUgY29tcHRhbnQgcGFzIHBsdXMgZGUgNzAgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZEVtYWlsOiBcIk1lcmNpIGRlIHNhaXNpciB2b3RyZSBhZHJlc3NlIGUtbWFpbC5cIixcbiAgICBuZWVkVW5pcXVlRW1haWw6IFwiTCdhZHJlc3NlIGUtbWFpbCBxdWUgdm91cyBhdmV6IHNhaXNpZSBlc3QgZMOpasOgIHV0aWxpc8OpZSBwYXIgdW4gYXV0cmUgdXRpbGlzYXRldXIuIFNpIHZvdXMgYXZleiBkw6lqw6AgdW4gY29tcHRlLCA8YSBocmVmPScvI1VSTCc+Y2xpcXVlei1pY2kgcG91ciB2b3VzIGNvbm5lY3RlcjwvYT4uXCIsXG4gICAgbmVlZE5vdFRvb0xvbmdFbWFpbDogXCJNZXJjaSBkZSBzYWlzaXIgdW5lIGFkcmVzc2UgZS1tYWlsIG5lIGNvbXB0YW50IHBhcyBwbHVzIGRlIDI1NSBjYXJhY3TDqHJlcy5cIixcbiAgICBuZWVkUGFzc1dvcmQgOiBcIk1lcmNpIGRlIGZvdXJuaXIgdW4gbW90IGRlIHBhc3NlLlwiLFxuICAgIG5lZWRMb25nUGFzc1dvcmQgOiBcIk1lcmNpIGRlIGZvdXJuaXIgdW4gbW90IGRlIHBhc3NlIGQnYXUgbW9pbnMgTUlOX0xFTkdUSCBjYXJhY3TDqHJlcy5cIixcbiAgICBwYXNzd29yZENvcGllZDogXCJMZSBtb3QgZGUgcGFzc2UgZ8OpbsOpcsOpIGEgw6l0w6kgY29wacOpIGRhbnMgbGUgcHJlc3NlLXBhcGllci4gVm91cyBwb3V2ZXogbGUgcmVjb3BpZXIgb8O5IHZvdXMgbGUgc291aGFpdGVyLlwiLFxuICAgIG5lZWRTdGF0dXMgOiBcIklsIG1hbnF1ZSBsZSBzdGF0dXQuXCIsXG4gICAgbmVlZExhbmd1YWdlIDogXCJJbCBtYW5xdWUgbGUgY29kZSBsYW5ndWUuXCIsXG4gICAgbmVlZFZhbGlkTGFzdENvbm5lY3Rpb25EYXRlIDogXCJMYSBkYXRlIGRlIGRlcm5pw6hyZSBjb25uZXhpb24gbidlc3QgcGFzIHZhbGlkZS5cIixcbiAgICBuZWVkU01UUCA6IFwiSWwgbWFucXVlIGxlIHNlcnZldXIgU01UUC5cIixcbiAgICBuZWVkU01UUE5vdEZvdW5kIDogXCJJbCBtYW5xdWUgbGUgc2VydmV1ciBTTVRQLlwiLFxuICAgIG5lZWRLbm93TmV3c2xldHRlck9rIDogXCJJbCBmYXV0IHNhdm9pciBzaSBsJ3V0aWxpc2F0ZXVyIGFjY2VwdGUgb3UgcmVmdXNlIGRlIHJlY2V2b2lyIGxhIG5ld3NsZXR0ZXIuXCIsXG4gICAgbmVlZFRpbWVEaWZmZXJlbmNlIDogXCJJbCBmYXV0IGNvbm5hw650cmUgbGUgbm9tYnJlIGRlIG1pbnV0ZXMgZHUgZMOpY2FsYWdlIGhvcmFpcmUuXCIsXG4gICAgbmVlZE1pblRpbWVEaWZmZXJlbmNlIDogXCJJbCBmYXV0IGZvdXJuaXIgdW4gbm9tYnJlIGRlIG1pbnV0ZXMgw6AgZW5sZXZlciDDoCBsJ2hldXJlIEdNVCBuZSBkw6lwYXNzYW50IHBhcyA3MjAuXCIsXG4gICAgbmVlZE1heFRpbWVEaWZmZXJlbmNlIDogXCJJbCBmYXV0IGZvdXJuaXIgdW4gbm9tYnJlIGRlIG1pbnV0ZXMgw6AgYWpvdXRlciDDoCBsJ2hldXJlIEdNVCBuZSBkw6lwYXNzYW50IHBhcyA4NDAuXCIsXG4gICAgbmVlZFVHQ09rIDogXCJWb3VzIGRldmV6IGFjY2VwdGVyIGxlcyBDR1UgcG91ciBwb3V2b2lyIGNyw6llciB2b3RyZSBjb21wdGUuIFwiLFxuICAgIGdvZGZhdGhlck5vdEZvdW5kOiBcIkF1Y3VuIHV0aWxpc2F0ZXVyIHZhbGlkZSB0cm91dsOpIHBvdXIgY2UgY29kZSBwYXJyYWluLlwiLFxuICAgIGdvZGZhdGhlckZvdW5kOiBcIlZvdHJlIHBhcnJhaW4gYSBiaWVuIMOpdMOpIHRyb3V2w6kgIVwiLFxuICAgIG1haWxWYWxpZGF0aW9uTWVzc2FnZTogXCJWb3RyZSBpbnNjcmlwdGlvbiBlc3QgYmllbiBlbnJlZ2lzdHLDqWUuXFxuUG91ciBsYSBmaW5hbGlzZXIsIG1lcmNpIGRlIGNsaXF1ZXIgZGFucyBsZXMgMjRIIHN1ciBsZSBsaWVuIGRlIGNvbmZpcm1hdGlvbiBxdWkgdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHBhciBlLW1haWwuXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU3ViamVjdCA6IFwiTWVyY2kgZGUgdmFsaWRlciB2b3RyZSBjb21wdGVcIixcbiAgICBtYWlsVmFsaWRhdGlvbkxpbmtTQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuXFxuUG91ciB2YWxpZGVyIHZvdHJlIGNvbXB0ZSwgbWVyY2kgZGUgY2xpcXVlciBzdXIgbGUgbGllbiBzdWl2YW50IGRhbnMgbGVzIDI0aCA6XFxuTElOS19VUkxcIixcbiAgICBtYWlsVmFsaWRhdGlvbkxpbmtTQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlBvdXIgdmFsaWRlciB2b3RyZSBjb21wdGUsIG1lcmNpIGRlIGNsaXF1ZXIgc3VyIGxlIGxpZW4gc3VpdmFudCBkYW5zIGxlcyAyNGguPC9wPjxwPjxhIGhyZWY9XFxcIkxJTktfVVJMXFxcIj5WYWxpZGVyLjwvYT48L3A+XCIsXG4gICAgdmFsaWRhdGlvbk1lc3NhZ2U6IFwiVm90cmUgY29tcHRlIHZpZW50IGJpZW4gZCfDqnRyZSB2YWxpZMOpLiBNZXJjaSBldCBiaWVudmVudWUgITxicj5Wb3VzIHBvdXZleiBzYW5zIHRhcmRlciB2b3VzIGNvbm5lY3RlciBjaS1kZXNzb3VzIHBvdXIgYWNjw6lkZXIgw6Agdm90cmUgY29tcHRlLlwiLFxuICAgIHZhbGlkYXRpb25NZXNzYWdlQWRtaW46IFwiTGUgY29tcHRlIGEgYmllbiDDqXTDqSB2YWxpZMOpLlwiLFxuICAgIHZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZTogXCJJbCBzZW1ibGUgcXVlIHZvdXMgYXlleiBkw6lqw6AgdmFsaWTDqSB2b3RyZSBjb21wdGUuXCIsXG4gICAgdmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlQWRtaW46IFwiQ2UgY29tcHRlIGEgZMOpasOgIMOpdMOpIHZhbGlkw6kuXCIsXG4gICAgbWFpbFdlbGNvbWVTdWJqZWN0IDogXCJCaWVudmVudWUgIVwiLFxuICAgIG1haWxXZWxjb21lQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuVm90cmUgdmVuZXogZGUgdmFsaWRlciB2b3RyZSBpbnNjcmlwdGlvbiDDoCBOT01fU0lURS5cXG5NZXJjaSBldCDDoCBiaWVudMO0dCAhXCIsXG4gICAgbWFpbFdlbGNvbWVCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+Vm90cmUgdmVuZXogZGUgdmFsaWRlciB2b3RyZSBpbnNjcmlwdGlvbiDDoCBOT01fU0lURS48L3A+PHA+TWVyY2kgZXQgw6AgYmllbnTDtHQgITwvcD5cIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJTdWJqZWN0IDogXCJNZXJjaSAhXCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuR3LDomNlIMOgIHZvdXMgdW4gbm91dmVsIHV0aWxpc2F0ZXVyIChFTUFJTCkgdmllbnQgZGUgcydpbnNjcmlyZSBzdXIgTk9NX1NJVEUuXFxuTWVyY2kgZXQgw6AgYmllbnTDtHQgIVwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlckJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5HcsOiY2Ugw6Agdm91cyB1biBub3V2ZWwgdXRpbGlzYXRldXIgKEVNQUlMKSB2aWVudCBkZSBzJ2luc2NyaXJlIHN1ciBOT01fU0lURS48L3A+PHA+TWVyY2kgZXQgw6AgYmllbnTDtHQgITwvcD5cIixcbiAgICBiYWRMaW5rVmFsaWRhdGlvbk1lc3NhZ2U6IFwiVm90cmUgbGllbiBkZSBjb25maXJtYXRpb24gbmUgc2VtYmxlIHBhcyB2YWxpZGUgb3UgYmllbiBpbCBhIGV4cGlyw6kuIFZvdXMgcG91dmV6IGVuIHJlY2V2b2lyIHVuIG5vdXZlYXUgPGEgaHJlZj0nI1VSTCc+ZW4gY2xpcXVhbnQgaWNpPC9hPi5cIixcbiAgICBlbWFpbE5vdEZvdW5kOiBcIkF1Y3VuIHV0aWxpc2F0ZXVyIHRyb3V2w6kgcG91ciBjZXR0ZSBhZHJlc3NlIGUtbWFpbC5cIixcbiAgICBhbHJlYWR5Q29ubmVjdGVkOiBcIlZvdXMgw6p0ZXMgZMOpasOgIGNvbm5lY3TDqShlKSBhdSBzaXRlICFcIixcbiAgICBuZWVkQmVDb25uZWN0ZWQ6IFwiVm91cyBkZXZleiDDqnRyZSBjb25uZWN0w6koZSkgcG91ciBhY2PDqWRlciDDoCBjZXR0ZSBwYWdlLlwiLFxuICAgIGNvbm5lY3Rpb25PazogXCJDb25uZXhpb24gcsOpdXNzaWUuXCIsXG4gICAgbmVlZENob29zZUxvZ2luV2F5OiBcIlZvdXMgZGV2ZXogc29pdCBzYWlzaXIgdm90cmUgbW90IGRlIHBhc3NlLCBzb2l0IGNvY2hlciBsYSBjYXNlIHZvdXMgcGVybWV0dGFudCBkZSByZWNldm9pciB1biBsaWVuIGRlIGNvbm5leGlvbiBwYXIgZS1tYWlsLlwiLFxuICAgIG5lZWRWYWxpZGF0aW9uVG9Mb2dpbiA6IFwiVm91cyBkZXZleiBkJ2Fib3JkIHZhbGlkZXIgdm90cmUgY29tcHRlIGF2YW50IGRlIHZvdXMgY29ubmVjdGVyLiBQb3VyIGNlIGZhaXJlLCB1biBsaWVuIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBwYXIgZS1tYWlsLlwiLFxuICAgIHRvb01hbnlMb2dpbkZhaWxzIDogXCJUcm9wIGRlIHRlbnRhdGl2ZXMgZGUgY29ubmV4aW9uIGluZnJ1Y3R1ZXVzZXMgcG91ciBjZXR0ZSBhZHJlc3NlIGUtbWFpbC4gVm91cyBkZXZleiBhdHRlbmRyZSBNSU5VVEVTIG1pbnV0ZXMgcG91ciBlc3NheWVyIGRlIG5vdXZlYXUuXCIsXG4gICAgYmFkUGFzc3dvcmQ6IFwiTGUgbW90IGRlIHBhc3NlIG4nZXN0IHBhcyBsZSBib24uXCIsXG4gICAgbWFpbExvZ2luTGlua1N1YmplY3QgOiBcIlZvdHJlIGxpZW4gZGUgY29ubmV4aW9uLlwiLFxuICAgIG1haWxMb2dpbkxpbmtCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5Qb3VyIHZvdXMgY29ubmVjdGVyIMOgIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDogTElOS19VUkxcIixcbiAgICBtYWlsTG9naW5MaW5rQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlBvdXIgdm91cyBjb25uZWN0ZXIgw6Agdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOjwvcD48cD48YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+VmFsaWRlci48L2E+PC9wPlwiLFxuICAgIG1haWxMb2dpbkxpbmtNZXNzYWdlIDogXCJVbiBsaWVuIGRlIGNvbm5leGlvbiB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgc3VyIHZvdHJlIGFkcmVzc2UgZS1tYWlsLiBOZSB0YXJkZXogcGFzIMOgIGwndXRpbGlzZXIsIGNhciBpbCBuJ2VzdCB2YWxhYmxlIHF1ZSBkdXJhbnQgXCIsXG4gICAgdXBkYXRlZE9rTWVzc2FnZTogXCJWb3MgaW5mb3JtYXRpb25zIG9udCBiaWVuIMOpdMOpIG1pc2VzIMOgIGpvdXIuXCIsXG4gICAgdXBkYXRlZE5lZWRHb29kRW1haWwgOiBcIk1haXMgbGEgbm91dmVsbGUgYWRyZXNzZSBlLW1haWwgbidhIHB1IMOqdHJlIGVucmVnaXN0csOpZSBjYXIgZWxsZSBuJ2EgcGFzIHVuZSBmb3JtYXQgY29ycmVjdC5cIixcbiAgICB1cGRhdGVkTmVlZFVuaXF1ZUVtYWlsIDogXCJNYWlzIGxhIG5vdXZlbGxlIGFkcmVzc2UgZS1tYWlsIHNhaXNpZSAoTkVXX0VNQUlMKSBuJ2EgcHUgw6p0cmUgZW5yZWdpc3Ryw6llLCBjYXIgZWxsZSBlc3QgZMOpasOgIHV0aWxpc8OpZSBwb3VyIHVuIGF1dHJlIGNvbXB0ZS5cIixcbiAgICBtYWlsVXBkYXRlTG9naW5TdWJqZWN0IDogXCJNZXJjaSBkZSB2YWxpZGVyIHZvcyBub3V2ZWF1eCBpZGVudGlmaWFudHMuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuUG91ciB2YWxpZGVyIHZvcyBub3V2ZWF1eCBpZGVudGlmaWFudHMgZGUgY29ubmV4aW9uLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlBvdXIgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiwgPGEgaHJlZj1cXFwiTElOS19VUkxcXFwiPmNsaXF1ZXogaWNpPC9hPiBzYW5zIHRhcmRlci48L3A+XCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luTGlua01lc3NhZ2U6IFwiQ2VwZW5kYW50LCB2b3VzIGF2ZXogbW9kaWZpw6kgYXUgbW9pbnMgdW4gZGUgdm9zIGlkZW50aWZpYW50cyBkZSBjb25uZXhpb24gKGVtYWlsIGV0L291IG1vdCBkZSBwYXNzZSkgZXQgPGI+dm91cyBkZXZleiBjbGlxdWVyIHN1ciBsZSBsaWVuIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlcyBlbnZvecOpIHN1ciB2b3RyZSBhZHJlc3NlIChORVdfRU1BSUwpIHBvdXIgdmFsaWRlciBjZSBjaGFuZ2VtZW50PC9iPi4gRW4gYXR0ZW5kYW50LCBtZXJjaSBkZSBjb250aW51ZXIgw6AgdXRpbGlzZXIgdm9zIGFuY2llbnMgaWRlbnRpZmlhbnRzLlwiLFxuICAgIHVwZGF0ZWROZWVkVmFsaWRhdGVkVXNlcjogXCJMJ3V0aWxpc2F0ZXVyIHF1ZSB2b3VzIHNvdWhhaXTDqSBtb2RpZmllciBuJ2V4aXN0ZSBwYXMvcGx1cyBvdSBuJ2EgcGFzIGVuY29yZSB2YWxpZMOpIHNvbiBjb21wdGUuXCIsXG4gICAgdXBkYXRlZE5lZWRHb29kR29kZmF0aGVyIDogXCJNYWlzIGxlIG5vdXZlYXUgY29kZSBwYXJyYWluIG4nYSBwdSDDqnRyZSByZXRlbnUsIGNhciBpbCBuZSBjb3JyZXNwb25kIMOgIGF1Y3VuIGNvbXB0ZSB1dGlsaXNhdGV1ciBvdSDDoCBsJ3V0aWxpc2F0ZXVyIGx1aS1tw6ptZS5cIixcbiAgICBtYWlsVXBkYXRlTG9naW5Pa01lc3NhZ2U6IFwiTGEgbWlzZSDDoCBqb3VyIGRlIHZvcyBpZGVudGlmaWFudHMgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS5cIixcbiAgICB1cGRhdGVkRmFpbGVkR29kZmF0aGVyTm90Rm91bmQgOiBcIkwnaWRlbnRpZmlhbnQgZm91cm5pIHBvdXIgbGUgcGFycmFpbiBuZSBjb3JyZXNwb25kIMOgIGF1Y3VuIHV0aWxpc2F0ZXVyLlwiLFxuICAgIGNyZWF0aW9uT2tNZXNzYWdlOiBcIkxlIG5vdXZlbCB1dGlsaXNhdGV1ciBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6kuXCIsXG4gICAgbWFpbERlbGV0ZVN1YmplY3QgOiBcIkNvbmZpcm1lciBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUuXCIsXG4gICAgbWFpbERlbGV0ZUJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblBvdXIgdmFsaWRlciBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6XFxuTElOS19VUkxcIixcbiAgICBtYWlsRGVsZXRlQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlBvdXIgdmFsaWRlciBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUsIDxhIGhyZWY9XFxcIkxJTktfVVJMXFxcIj5jbGlxdWV6IGljaTwvYT4gc2FucyB0YXJkZXIuPC9wPlwiLFxuICAgIG1haWxEZWxldGVMaW5rTWVzc2FnZTogXCJWb3RyZSBkZW1hbmRlIGRlIHN1cHByZXNzaW9uIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuIE1lcmNpIGRlIGNsaXF1ZXIgc2FucyB0YXJkZXIgc3VyIGxlIGxpZW4gcXVpIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBwYXIgZS1tYWlsIHBvdXIgY29uZmlybWVyLlwiLFxuICAgIGRlbGV0ZU9rTWVzc2FnZTogXCJMJ3V0aWxpc2F0ZXVyIGEgYmllbiDDqXTDqSBzdXBwcmltw6kuXCIsXG4gICAgZGVsZXRlRmFpbE1lc3NhZ2U6IFwiVGVudGF0aXZlIGRlIHN1cHByZXNzaW9uIGQndW4gdXRpbGlzYXRldXIgaW5leGlzdGFudCA6IFwiLFxuICAgIG1haWxEZWxldGVMaW5rT2tNZXNzYWdlOiBcIlZvdHJlIGNvbXB0ZSBhIGJpZW4gw6l0w6kgc3VwcHJpbcOpLiBNZXJjaSBkJ2F2b2lyIHV0aWxpc8OpIG5vcyBzZXJ2aWNlcy5cIixcbiAgICBtYWlsRGVsZXRlTGlua0FscmVhZHlNZXNzYWdlOiBcIklsIHNlbWJsZSBxdWUgdm91cyBheWV6IGTDqWrDoCB2YWxpZMOpIGxhIHN1cHByZXNzaW9uIGRlIHZvdHJlIGNvbXB0ZS5cIixcbiAgICBtYWlsRGVsZXRlTGlua0ZhaWxNZXNzYWdlOiBcIlZvdHJlIGxpZW4gZGUgc3VwcHJlc3Npb24gbidlc3QgcGFzIHZhbGlkZSBvdSBhbG9ycyBpbCBuJ2VzdCBwbHVzIHZhbGFibGUuXCIsXG4gICAgY3JvbkRlbGV0ZVVudmFsaWRlZFVzZXJzTWVzc2FnZTogXCIgY29tcHRlcyB1dGlsaXNhdGV1cnMgbm9uIHZhbGlkw6lzIG9udCDDqXTDqSBzdXBwcmltw6lzLlwiLFxuICAgIGRlbGV0ZUluYWN0aXZlVXNlcnNNZXNzYWdlOiBcIiBjb21wdGVzIHV0aWxpc2F0ZXVycyBpbmFjdGlmcyBvbnQgw6l0w6kgc3VwcHJpbcOpcy5cIixcbiAgICB3ZWxjb21lTWVzc2FnZTogXCJCaWVudmVudWUgI05BTUUgIVwiLFxuICAgIGJ5ZWJ5ZU1lc3NhZ2U6IFwiU2kgdm91cyB2b3lleiBjZSBtZXNzYWdlLCBjJ2VzdCBxdWUgdm90cmUgZMOpY29ubmV4aW9uIHMnZXN0IGJpZW4gZMOpcm91bMOpZS48YnI+w4AgYmllbnTDtHQgIVwiLFxuICAgIGluZm9zVXNlckZvckFkbWluOiBcIkNldCB1dGlsaXNhdGV1ciAoaWQ6IElEX1VTRVIpIGEgPGI+Y3LDqcOpIHNvbiBjb21wdGUgbGUgREFURV9DUkVBPC9iPiwgbGEgZGVybmnDqHJlIG1pc2Ugw6Agam91ciBkYXRhbnQgZHUgREFURV9VUERBVEUuPGJyPjxiPkRhdGUgZGUgc2EgZGVybmnDqHJlIGNvbm5leGlvbiA6IERBVEVfQ09OTkVDVElPTi48L2I+XCIsXG4gICAgaW5mb3NBZG1pbkdvZGZhdGhlcjogXCJDZXQgdXRpbGlzYXRldXIgYSDDqXTDqSBwYXJyYWluw6kgcGFyIFwiLFxuICAgIGluZm9zQWRtaW5OYkdvZENoaWxkczogXCJTZXMgI05CIGZpbGxldWlscyA6IFwiXG59OyIsIi8vIFF1ZWxxdWVzIGZvbmN0aW9ucyB1dGlsZXMgcG91ciBsZXMgY2hhw65uZXNcblxuY2xhc3MgVG9vbFxue1xuICAgIHN0YXRpYyBpc0VtcHR5KG15VmFyKVxuICAgIHtcbiAgICAgICAgaWYobXlWYXI9PT11bmRlZmluZWQgfHwgbXlWYXI9PT1udWxsKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgbXlWYXIrPVwiXCI7Ly8gc2kgYXV0cmUgY2hvc2UgcXUndW5lIGNoYcOubmUgZW52b3nDqS4uLlxuICAgICAgICAgICAgbXlWYXI9bXlWYXIudHJpbSgpO1xuICAgICAgICAgICAgaWYobXlWYXI9PT1cIlwiKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBzdGF0aWMgdHJpbUlmTm90TnVsbChteVN0cmluZylcbiAgICB7XG4gICAgICAgIGlmKFRvb2wuaXNFbXB0eShteVN0cmluZykpXG4gICAgICAgICAgICBteVN0cmluZz1udWxsO1xuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIG15U3RyaW5nKz1cIlwiOy8vIHNpIGF1dHJlIGNob3NlIHF1J3VuZSBjaGHDrm5lIGVudm95w6kuLi5cbiAgICAgICAgICAgIG15U3RyaW5nPW15U3RyaW5nLnRyaW0oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbXlTdHJpbmc7XG4gICAgfVxuXG5cbiAgICBzdGF0aWMgc2hvcnRlbklmTG9uZ2VyVGhhbihteVN0cmluZywgbWF4KVxuICAgIHtcbiAgICAgICAgbXlTdHJpbmcrPVwiXCI7Ly8gYXUgY2FzIG/DuSBjZWxhIG5lIHNlcmFpdCBwYXMgdW5lIGNoYcOubmUuLi5cbiAgICAgICBpZihteVN0cmluZy5sZW5ndGggPiBtYXgpXG4gICAgICAgICAgICBteVN0cmluZz1teVN0cmluZy5zdWJzdHJpbmcoMCwgKG1heC0zKSkrXCIuLi5cIjtcbiAgICAgICAgcmV0dXJuIG15U3RyaW5nO1xuICAgIH1cblxuICAgIC8vIHNvdXJjZSA6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE1NjA0MTQwL3JlcGxhY2UtbXVsdGlwbGUtc3RyaW5ncy13aXRoLW11bHRpcGxlLW90aGVyLXN0cmluZ3NcbiAgICBzdGF0aWMgcmVwbGFjZUFsbChteVN0cmluZywgbWFwT2JqKVxuICAgIHtcbiAgICAgICAgY29uc3QgcmVwbGFjZUVsdHMgPSBuZXcgUmVnRXhwKE9iamVjdC5rZXlzKG1hcE9iaikuam9pbihcInxcIiksXCJnaVwiKTtcbiAgICAgICAgcmV0dXJuIG15U3RyaW5nLnJlcGxhY2UocmVwbGFjZUVsdHMsIChtYXRjaGVkKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gbWFwT2JqW21hdGNoZWRdO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBzb3VyY2UgOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9mci9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9PYmpldHNfZ2xvYmF1eC9NYXRoL3JhbmRvbVxuICAgIHN0YXRpYyBnZXRSYW5kb21JbnQobWluLCBtYXgpXG4gICAge1xuICAgICAgICBtaW4gPSBNYXRoLmNlaWwobWluKTtcbiAgICAgICAgbWF4ID0gTWF0aC5mbG9vcihtYXgpO1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbikpICsgbWluO1xuICAgIH1cblxuICAgIC8vIMOgIGNvbXBsw6l0ZXIgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9EYXRlX2Zvcm1hdF9ieV9jb3VudHJ5XG4gICAgc3RhdGljIGRhdGVGb3JtYXQoZGF0ZVN0cmluZywgbGFuZz1cImZyXCIpXG4gICAge1xuICAgICAgICBpZihUb29sLmlzRW1wdHkoZGF0ZVN0cmluZykpXG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgbGV0IG15RGF0ZT1uZXcgRGF0ZShkYXRlU3RyaW5nKTtcbiAgICAgICAgbGV0IG15RGF5PW15RGF0ZS5nZXREYXRlKCkrXCJcIjtcbiAgICAgICAgaWYobXlEYXkubGVuZ3RoPT09MSlcbiAgICAgICAgICAgIG15RGF5PVwiMFwiK215RGF5O1xuICAgICAgICBsZXQgbXlNb3VudGg9KG15RGF0ZS5nZXRNb250aCgpKzEpK1wiXCI7XG4gICAgICAgIGlmKG15TW91bnRoLmxlbmd0aD09PTEpXG4gICAgICAgICAgICBteU1vdW50aD1cIjBcIitteU1vdW50aDtcbiAgICAgICAgbGV0IG15WWVhcj1teURhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgaWYobGFuZz09PVwiZnJcIilcbiAgICAgICAgICAgIHJldHVybiBteURheStcIi9cIitteU1vdW50aCtcIi9cIitteVllYXI7XG4gICAgICAgIGVsc2UgaWYgKGxhbmc9PT1cImZvcm1cIikvLyAyMDE0LTAyLTA5XG4gICAgICAgICAgICByZXR1cm4gbXlZZWFyK1wiLVwiK215TW91bnRoK1wiLVwiK215RGF5O1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gbXlNb3VudGgrXCIvXCIrbXlEYXkrXCIvXCIrbXlZZWFyO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBUb29sOyIsInZhciBtYXAgPSB7XG5cdFwiLi9kZWZhdWx0L2NvbmZpZy9mci5qc1wiOiBcIi4uL3ZpZXdzL2RlZmF1bHQvY29uZmlnL2ZyLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL3ZpZXdzIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcLmpzJFwiOyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBoZWFkTGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJBY2N1ZWlsXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9cIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIk1vbiBjb21wdGVcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nvbm5leGlvbi5obXRcIiwgaWQ6IFwiYWNjb3VudEhlYWRMaW5rXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCLDgCBwcm9wb3NcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2EtcHJvcG9zLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkNvbnRhY3RcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2NvbnRhY3QuaHRtbFwiIH0gfSxcbiAgICBdLFxuICAgIGZvb3RMaW5rczpcbiAgICBbXG4gICAgICAgIHsgYW5jaG9yOiBcIkNyw6lkaXRzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jcmVkaXRzLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIk1lbnRpb25zIGzDqWdhbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9tZW50aW9ucy1sZWdhbGVzLmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJEb25uw6llcyBwZXJzb25uZWxsZXNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Rvbm5lZXMuaHRtbFwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQy5HLlUuXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jZ3UuaHRtbFwiLCByZWw6IFwibm9mb2xsb3dcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkMuRy5WLlwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY2d2Lmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgIF0sXG4gICAgbWF4UXVlc3Rpb25uYWlyZXNCeVBhZ2U6IDEwLFxuICAgIHVzZXJIb21lUGFnZSA6IFwiYWNjdWVpbC5odG1sXCIsXG4gICAgYWRtaW5Ib21lUGFnZSA6IFwiYWRtaW4uaHRtbFwiLFxuICAgIG1hbmFnZXJIb21lUGFnZSA6IFwiZ2VzdGlvbi5odG1sXCIsXG4gICAgc3Vic2NyaWJlUGFnZSA6IFwiaW5zY3JpcHRpb24uaHRtbFwiLFxuICAgIGNvbm5lY3Rpb25QYWdlIDogXCJjb25uZXhpb24uaHRtbFwiLFxuICAgIGFjY291bnRQYWdlOiBcImNvbXB0ZS5odG1sXCIsXG4gICAgcXVlc3Rpb25uYWlyZXNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXF1aXpzLmh0bWxcIixcbiAgICB1c2Vyc01hbmFnZW1lbnRQYWdlOiBcImdlc3Rpb24tdXRpbGlzYXRldXJzLmh0bWxcIixcbiAgICBuYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlIDogMTAsXG4gICAgaWxsdXN0cmF0aW9uRGlyIDogXCIvaW1nL3F1aXpzL1wiLFxuICAgIHNpdGVTbG9nYW46IFwiQ3VsdGl2b25zIG5vdHJlIGphcmRpbiAhXCIsXG4gICAgaG9tZVRpdGxlMTogXCJEZSBuYXR1cmUgY3VyaWV1c2UgP1wiLFxuICAgIGhvbWVQMTogXCJBdmVjIFdpa2lMZXJuaSB2b3VzIGFwcHJlbmV6IGNoYXF1ZSBqb3VyIGRlIG5vdXZlbGxlcyBjaG9zZXMuPGJyPkRlcyBhcnRpY2xlcyBkZSBXaWtpcMOpZGlhIHNvbnQgc8OpbGVjdGlvbm7DqXMgcG91ciB2b3VzIGV0IHNvbnQgc3VpdmlzIGQndW4gcXVpeiB2b3VzIHBlcm1ldHRhbnQgZGUgdGVzdGVyIGNlIHF1ZSB2b3VzIGVuIGF2ZXogcmV0ZW51Ljxicj5EZSBqb3VyIGVuIGpvdXIgZGUgbm91dmVsbGVzIGdyYWluZXMgZGUgc2F2b2lyIHNvbnQgYWluc2kgc2Vtw6llcyBkYW5zIHZvdHJlIFxcXCJqYXJkaW5cXFwiLlwiLFxuICAgIGhvbWVUaXRsZTI6IFwiTGEgY3VsdHVyZSBlbiBsaWJlcnTDqVwiLFxuICAgIGhvbWVQMjogXCJUb3V0IGNvbW1lIHN1ciBXaWtpcMOpZGlhICgqKSwgbGUgbG9naWNpZWwgZXQgbGUgY29udGVudSBwYXJ0YWfDqSBzdXIgV2lraUxlcm5pIHNvbnQgbGlicmVzLjxicj5Wb3VzIHBvdXZleiBsZXMgdXRpbGlzZXIsIGxlcyBtb2RpZmllciBldCBsZXMgZGlmZnVzZXIgc2Vsb24gdm90cmUgc291aGFpdC48YnI+U3VyIFdpa2lMZXJuaSwgcGFzIGRlIHB1YmxpY2l0w6ksIG5pIGRlIGNvbW1lcmNpYWxpc2F0aW9uIGRlIHZvcyBkb25uw6llcyBwZXJzb25uZWxsZXMuPGJyPlZvdXMgcG91dmV6IHZlbmlyIHkgXFxcImN1bHRpdmVyIHZvdHJlIGphcmRpblxcXCIgZW4gdG91dGUgdHJhbnF1aWxsaXTDqS48YnI+PGJyPjxzbWFsbD48ZW0+KCopIEJpZW4gcXVlIHBhcnRhZ2VhbnQgc2VzIHZhbGV1cnMsIFdpa2lMZXJuaSBlc3QgdW4gcHJvamV0IGluZMOpcGVuZGFudCBkZSBsYSBmb25kYXRpb24gV2lraXDDqWRpYS48L2VtPjwvc21hbGw+XCIsXG4gICAgbmV3UXVlc3Rpb25uYWlyZXNUaXRsZTogXCJMZXMgZGVybmllcnMgcXVpenMgcHVibGnDqXMgc3VyIFdpa2lMZXJuaVwiLFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzSW50cm86IFwiTGlzdGUgZGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzIHN1ciBXaWtpTGVybmkuXCIsXG4gICAgZXhwbGFuYXRpb25UaXRsZTogXCJWb3VzIGTDqWNvdXZyZXogV2lraUxlcm5pID9cIixcbiAgICBleHBsYW5hdGlvblR4dDogXCJMZSBwcmluY2lwZSBlc3Qgc2ltcGxlIDogdm91cyBjb21tZW5jZXogcGFyIGxpcmUgbCdhcnRpY2xlIFdpa2lww6lkaWEgZG9udCBsZSBsaWVuIHZvdXMgZXN0IHByb3Bvc8OpLjxicj5QdWlzIHZvdXMgYWZmaWNoZXIgbGUgcXVpeiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudSBkZSB2b3RyZSBsZWN0dXJlLiBWb3VzIG9idGVuZXogYWxvcnMgdm90cmUgcsOpc3VsdGF0IGltbcOpZGlhdGVtZW50Ljxicj48YnI+VG91dGVzIGxlcyByw6lwb25zZXMgc2UgdHJvdXZlbnQgZGFucyBsJ2FydGljbGUgcHJvcG9zw6kgw6AgbGEgbGVjdHVyZS4gPGI+Vm91cyDDqnRlcyBpY2kgcG91ciBhcHByZW5kcmUgZGUgbm91dmVsbGVzIGNob3NlczwvYj4sIG1haXMgbGlicmUgw6Agdm91cyBkJ2Vzc2F5ZXIgZCd5IHLDqXBvbmRyZSBpbW3DqWRpYXRlbWVudC48YnI+PGJyPlF1YW5kIGxlIHN1amV0IHMneSBwcsOqdGUsIG5lIHZvdXMgw6l0b25uZXogcGFzIHNpIGNlcnRhaW5lcyBkZXMgcsOpcG9uc2VzIHByb3Bvc8OpZXMgcGV1dmVudCDDqnRyZSB1biBwZXUgZMOpY2Fsw6llcywgYWJzdXJkZXMuLi4gT24gcGV1dCBhcHByZW5kcmUgYXZlYyBsZSBzb3VyaXJlLCBub24gPyA6LSk8YnI+PGJyPlVuZSBmb2lzIHZvdHJlIHLDqXN1bHRhdCBvYnRlbnUsIGlsIHZvdXMgc2VyYSBwcm9wb3PDqSBkZSBjcsOpZXIgdW4gY29tcHRlIHBvdXIgbGUgc2F1dmVnYXJkZXIuPGJyPkNlIGNvbXB0ZSB2b3VzIHBlcm1ldHRyYSBkZSB0ZXN0ZXIgZGUgbm91dmVhdSBjZSBxdWl6IHBvdXIgdsOpcmlmaWVyIGNlIHF1ZSB2b3VzIGVuIGF2ZXogcmV0ZW51IHBsdXNpZXVycyBqb3Vycywgc2VtYWluZXMsIG1vaXMuLi4gRXQgZGUgcmVjZXZvaXIgcsOpZ3VsacOocmVtZW50IGRlIG5vdXZlbGxlcyBzdWdnZXN0aW9ucyBkZSBsZWN0dXJlcy48YnI+PGJyPk1haXMgPGI+bGEgY3LDqWF0aW9uIGRlIGNlIGNvbXB0ZSBlc3QgZmFjdWx0YXRpdmU8L2I+IGV0IDxhIGhyZWY9Jy9xdWl6cy8nIHRpdGxlPSdMZXMgZGVybmllcnMgcXVpenMgcHVibGnDqXMnPnZvdXMgcG91dmV6IHBhcmNvdXJpciBXaWtpTGVybmkgbGlicmVtZW50PC9hPi5cIixcbiAgICBub0pTTm90aWZpY2F0aW9uOiBcIkTDqXNvbMOpLCBtYWlzIHBvdXIgbCdpbnN0YW50LCBsJ3V0aWxpc2F0aW9uIGRlIFdpa2lMZXJuaSBuw6ljZXNzaXRlIGwnYWN0aXZhdGlvbiBkdSBKYXZhU2NyaXB0LlwiLFxufTsiLCIvLyAtLSBQQUdFIFBFUk1FVFRBTlQgREUgVEVTVEVSIFVOIExJRU4gREUgQ09OTkVYSU9OIFJFw4dVIFBBUiBFLU1BSUxcblxuLy8vIFVuIHRva2VuIGVzdCB0cmFuc21pcyBlbiBwYXJhbcOodHJlIGRlIGwnVXJsLiBJbCBhIHVuZSB2YWxpZGl0w6kgbGltaXTDqSBkYW5zIGxlIHRlbXBzLlxuLy8vIERhbnMgY2UgY2FzLCBvbiBwZXV0IHJlZGlyaWdlciBsJ3V0aWxpc2F0ZXVyIHZlcnMgbGEgcGFnZSBkZSBjb25uZXhpb24gcG91ciBvYnRlbmlyIHVuIG5vdXZlYXUgbGllbiBkZSB2YWxpZGF0aW9uXG4vLy8gU2kgbGUgdG9rZW4gZXN0IG9rLCBvbiBjcsOpZSB1bmUgc2Vzc2lvbiBzdWl2YW50IGxhIGR1csOpZSByZXRvdXJuw6llIHBhciBsJ0FQSSBldCByZWRpcmlnZSBsJ3V0aWxpc2F0ZXVyIHZlcnMgc2EgcGFnZSBkJ2FjY3VlaWxcbi8vLyBVbiByw6lzdWx0YXQgZGUgcXVpeiBwZXV0IGF1c3NpIGF2b2lyIMOpdMOpIGVucmVnaXN0csOpIGPDtHTDqSBjbGllbnQgZXQgZXN0IGFsb3JzIMOgIHRyYW5zbWV0dHJlIMOgIGwnQVBJLlxuLy8vIFNpIGwndXRpbGlzYXRldXIgYSBkw6lqw6AgdW5lIHNlc3Npb24gYWN0aXZlIHZhbGlkZSwgYydlc3QgcXUnaWwgYSBkw6lqw6AgY2xpcXXDqSBzdXIgbGUgbGllbi4gT24gbGUgcmVkaXJpZ2Ugw6lnYWxlbWVudCB2ZXJzIHNhIHBhZ2UgZCdhY2N1ZWlsLlxuXG4vLyBGaWNoaWVyIGRlIGNvbmZpZ3VyYXRpb24gY8O0dMOpIGNsaWVudCA6XG5pbXBvcnQgeyBhcGlVcmwsIGF2YWlsYWJsZUxhbmdzLCB0aGVtZSB9IGZyb20gXCIuLi8uLi9jb25maWcvaW5zdGFuY2UuanNcIjtcbmNvbnN0IGxhbmc9YXZhaWxhYmxlTGFuZ3NbMF07XG5jb25zdCBjb25maWdGcm9udEVuZCA9IHJlcXVpcmUoXCIuLi8uLi92aWV3cy9cIit0aGVtZStcIi9jb25maWcvXCIrbGFuZytcIi5qc1wiKTtcblxuLy8gSW1wb3J0YXRpb24gZGVzIGZvbmN0aW9ucyB1dGlsZSBhdSBzY3JpcHQgOlxuaW1wb3J0IHsgZ2V0TG9jYWx5LCByZW1vdmVMb2NhbHksIHNhdmVMb2NhbHkgfSBmcm9tIFwiLi90b29scy9jbGllbnRzdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyBhZGRFbGVtZW50IH0gZnJvbSBcIi4vdG9vbHMvZG9tLmpzXCI7XG5pbXBvcnQgeyBoZWxsb0RldiB9IGZyb20gXCIuL3Rvb2xzL2V2ZXJ5d2hlcmUuanNcIjtcbmltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vdG9vbHMvbWFpblwiO1xuaW1wb3J0IHsgZ2V0VXJsUGFyYW1zIH0gZnJvbSBcIi4vdG9vbHMvdXJsLmpzXCI7XG5pbXBvcnQgeyBjaGVja0Fuc3dlckRhdGFzLCBjaGVja1Nlc3Npb24sIGdldENvbmZpZywgZ2V0VGltZURpZmZlcmVuY2UsIHNldFNlc3Npb24gfSBmcm9tIFwiLi90b29scy91c2Vycy5qc1wiO1xuXG4vLyBEaWN0aW9ubmFpcmVzIDpcbmNvbnN0IHR4dCA9IHJlcXVpcmUoXCIuLi8uLi9sYW5nL1wiK2xhbmcrXCIvZ2VuZXJhbFwiKTtcbmNvbnN0IHR4dFVzZXJzID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi91c2VyXCIpO1xuXG5jb25zdCBkaXZSZXNwb25zZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicmVzcG9uc2VcIik7XG5cbmhlbGxvRGV2KCk7XG5cbmxldCBjb25maWc7XG5jb25zdCBpbml0aWFsaXNlID0gYXN5bmMgKCkgPT5cbntcbiAgICB0cnlcbiAgICB7XG4gICAgICAgIGNvbmZpZyA9IGF3YWl0IGdldENvbmZpZygpO1xuICAgICAgICBpZighY29uZmlnKVxuICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIHNpIGwndXRpbGlzYXRldXIgZXN0IGTDqWrDoCBjb25uZWN0w6ksIHBhcyBsYSBwZWluZSBkJ2FsbGVyICsgbG9pbiA6XG4gICAgICAgICAgICBjb25zdCBpc0Nvbm5lY3RlZD1hd2FpdCBjaGVja1Nlc3Npb24oKTtcbiAgICAgICAgICAgIGlmKGlzQ29ubmVjdGVkKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNhdmVMb2NhbHkoXCJtZXNzYWdlXCIsIHsgbWVzc2FnZTogdHh0VXNlcnMuYWxyZWFkeUNvbm5lY3RlZCwgY29sb3I6XCJpbmZvcm1hdGlvblwiIH0pOy8vIHBvdXIgbCdhZmZpY2hlciBzdXIgbGEgcGFnZSBzdWl2YW50ZVxuICAgICAgICAgICAgICAgIGNvbnN0IHVzZXI9Z2V0TG9jYWx5KFwidXNlclwiLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBob21lUGFnZT11c2VyLnN0YXR1cytcIkhvbWVQYWdlXCI7XG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIi9cIitjb25maWdGcm9udEVuZFtob21lUGFnZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxldCBkYXRhcz1nZXRVcmxQYXJhbXMoKTtcbiAgICAgICAgICAgICAgICBpZihkYXRhcyAmJiBkYXRhcy50IT09dW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgICAgIHhoci5vcGVuKFwiUE9TVFwiLCBhcGlVcmwrY29uZmlnLnVzZXJSb3V0ZXMrY29uZmlnLmNvbm5lY3Rpb25XaXRoTGlua1JvdXRlKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCAmJiAhaXNFbXB0eShyZXNwb25zZS51c2VySWQpICYmICFpc0VtcHR5KHJlc3BvbnNlLmNvbm5leGlvblRpbWUpICYmICFpc0VtcHR5KHJlc3BvbnNlLnRva2VuKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb25uZXhpb25NYXhUaW1lPURhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLmNvbm5leGlvblRpbWUuZW5kc1dpdGgoXCJkYXlzXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmV4aW9uTWF4VGltZSs9cGFyc2VJbnQocmVzcG9uc2UuY29ubmV4aW9uVGltZSwxMCkqMjQqMzYwMCoxMDAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZXhpb25NYXhUaW1lKz1wYXJzZUludChyZXNwb25zZS5jb25uZXhpb25UaW1lLDEwKSozNjAwKjEwMDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNlc3Npb24ocmVzcG9uc2UudXNlcklkLCByZXNwb25zZS50b2tlbiwgY29ubmV4aW9uTWF4VGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcImxhc3RBbnN3ZXJcIik7Ly8gISBpbXBvcnRhbnQgcG91ciBuZSBwYXMgZW5yZWdpc3RlciBwbHVzaWV1cnMgZm9pcyBsZSByw6lzdWx0YXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHRVc2Vycy52YWxpZGF0aW9uTWVzc2FnZSwgXCJcIiwgW1wic3VjY2Vzc1wiXSk7Ly8gYXUgY2FzIG/DuSBibG9jYWdlIHJlZGlyZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIvXCIrY29uZmlnRnJvbnRFbmQudXNlckhvbWVQYWdlKTsvLyBjb25uZXhpb24gcGFyIGxpZW4gbmUgY29uY2VybmUgcXVlIGxlcyBzaW1wbGVzIFwidXNlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCh0aGlzLnN0YXR1cyA9PT0gNDAxIHx8IHRoaXMuc3RhdHVzID09PSA0MDMpICYmIHJlc3BvbnNlLmVycm9ycyAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShyZXNwb25zZS5lcnJvcnMpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3JzID0gcmVzcG9uc2UuZXJyb3JzLmpvaW4oXCI8YnI+XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvcnMgPSB0eHQuc2VydmVyRXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCByZXNwb25zZS5lcnJvcnMsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgdHh0VXNlcnMuYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlLnJlcGxhY2UoXCIjVVJMXCIsIGNvbmZpZ0Zyb250RW5kLmNvbm5lY3Rpb25QYWdlKSwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRhdGFzLnRpbWVEaWZmZXJlbmNlPWdldFRpbWVEaWZmZXJlbmNlKGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNpIGwndXRpbGlzYXRldXIgYSBwcsOpY8OpZGVtZW50IHLDqXBvbmR1IMOgIHVuIHF1aXosIGonYWpvdXRlIGxlcyBpbmZvcyBkZSBzb24gcsOpc3VsdGF0IDpcbiAgICAgICAgICAgICAgICAgICAgZGF0YXM9Y2hlY2tBbnN3ZXJEYXRhcyhkYXRhcyk7XG4gICAgICAgICAgICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyLnNlbmQoSlNPTi5zdHJpbmdpZnkoZGF0YXMpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2goZSlcbiAgICB7XG4gICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHQuc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICB9XG59XG5pbml0aWFsaXNlKCk7IiwiLy8gRk9OQ1RJT05TIFVUSUxFUyBBVSBTVE9DS0FHRSBMT0NBTCAoU0VTU0lPTiwgQ09PS0lFUywgSU5ERVhEQiwgRVRDLilcbi8vIFJldmVuaXIgcG91ciBnw6lyZXIgbGUgY2FzIG/DuSBsb2NhbC5zdG9yYWdlIG4nZXN0IHBhcyBjb25udSBwb3VyIHV0aWxpc2VyIGNvb2tpZVxuICAgIFxuZXhwb3J0IGNvbnN0IHNhdmVMb2NhbHkgPSAobmFtZSwgZGF0YSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShuYW1lLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2NhbHkgPSAobmFtZSwganNvbj1mYWxzZSkgPT5cbntcbiAgICBpZihqc29uKVxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKSk7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSk7XG59XG5cbmV4cG9ydCBjb25zdCByZW1vdmVMb2NhbHkgPSAobmFtZSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShuYW1lKTtcbn0iLCJpbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gRm9uY3Rpb24gYXNzb2NpYW50IGxlcyBhdHRyaWJ1dHMgZm91cm5pcyDDoCB1biBjaGFtcCBkZSBmb3JtdWxhaXJlXG5leHBvcnQgY29uc3QgYWRkRWxlbWVudCA9IChlbHRQYXJlbnQsIGVsdFR5cGUsIGVsdENvbnRlbnQ9XCJcIiwgZWx0SWQ9XCJcIiwgZWx0Q2xhc3M9W10sIGVsdEF0dHJpYnV0ZXM9e30sIHJlcGxhY2U9dHJ1ZSkgPT5cbntcbiAgICBpZihpc0VtcHR5KGVsdFR5cGUpIHx8IGlzRW1wdHkoZWx0UGFyZW50KSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGVsc2VcbiAgICB7XG4gICAgICAgIGNvbnN0IG5ld0VsZW1lbnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlbHRUeXBlKTtcbiAgICAgICAgXG4gICAgICAgIGlmKCFpc0VtcHR5KGVsdElkKSkvLyB0ZXN0ZXIgc2kgbCdpZCBuJ2VzdCBwYXMgZMOpasOgIHV0aWxpc8OpIGRhbnMgbGUgRE9NID9cbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaWQ9ZWx0SWQ7XG5cbiAgICAgICAgaWYoQXJyYXkuaXNBcnJheShlbHRDbGFzcykgJiYgZWx0Q2xhc3MubGVuZ3RoIT0wKVxuICAgICAgICB7XG4gICAgICAgICAgICBmb3IobGV0IGkgaW4gZWx0Q2xhc3MpXG4gICAgICAgICAgICAgICAgbmV3RWxlbWVudC5jbGFzc0xpc3QuYWRkKGVsdENsYXNzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHR5cGVvZiBlbHRBdHRyaWJ1dGVzID09PSBcIm9iamVjdFwiKSAvLyAhISB0b3VzIGxlcyBvYmpldHMgbmUgc29udCBwYXMgb2tcbiAgICAgICAge1xuICAgICAgICAgICAgZm9yKGxldCBhdHRyaWJ1dE5hbWUgaW4gZWx0QXR0cmlidXRlcylcbiAgICAgICAgICAgICAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dE5hbWUsIGVsdEF0dHJpYnV0ZXNbYXR0cmlidXROYW1lXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZighaXNFbXB0eShlbHRDb250ZW50KSlcbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaW5uZXJIVE1MPWVsdENvbnRlbnQucmVwbGFjZSgvXFxuL2csXCI8YnI+XCIpOy8vIGlubmVySFRNTCBwZXJtZXQgZCdham91dGVyIGR1IHRleHRlIGF5YW50IGx1aS1tw6ptZSBkZXMgYmFsaXNlcywgZXRjLlxuICAgICAgICAgICAgXG4gICAgICAgIGlmKHJlcGxhY2UpXG4gICAgICAgICAgICBlbHRQYXJlbnQuaW5uZXJIVE1MPVwiXCI7XG4gICAgICAgIGVsdFBhcmVudC5hcHBlbmRDaGlsZChuZXdFbGVtZW50KTtcbiAgICB9ICAgIFxufSIsIi8vIENlIHNjcmlwdCBmb3Vybml0IGRlcyBmb25jdGlvbnMgdXRpbGlzw6llcyBzdXIgdG91dGVzIGxlcyBwYWdlcyBkdSBzaXRlXG5cbmV4cG9ydCBjb25zdCBoZWxsb0RldiA9ICgpID0+XG57XG4gICAgY29uc29sZS5sb2coXCIqKioqIEhlbGxvIGFtaSBkw6l2ZWxvcHBldXIgOi0pXFxuIExlIGNvZGUgZGUgV2lraUxlcm5pIGVzdCBsaWJyZSBldCBlc3QgbGlzaWJsZSBzdXIgZ2l0bGFiIDogXFxuIEJvbm5lIGxlY3R1cmUgOi0pIFxcbiBQb3VyIGxlcyBzdWdnZXN0aW9ucyBkJ2Ftw6lsaW9yYXRpb24gb3UgcXVlc3Rpb25zIDogZGV2QHdpbGlsZXJuaS5jb20gKioqKlwiKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUFjY291bnRMaW5rID0gKHN0YXR1cywgY29uZmlnVGVtcGxhdGUpID0+XG57XG4gICAgY29uc3QgbGluaz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFjY291bnRIZWFkTGlua1wiKTtcbiAgICBjb25zdCBob21lUGFnZT1zdGF0dXMrXCJIb21lUGFnZVwiO1xuICAgIGxpbmsuaHJlZj1cIi9cIitjb25maWdUZW1wbGF0ZVtob21lUGFnZV07XG59IiwiaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIEZvbmN0aW9uIHLDqWN1cMOpcmFudCBsZXMgcGFyYW3DqHRyZXMgcGFzc8OpcyBwYXIgbCd1cmxcbmV4cG9ydCBjb25zdCBnZXRVcmxQYXJhbXMgPSAoKSA9Plxue1xuICAgIGlmKGlzRW1wdHkobG9jYXRpb24uc2VhcmNoKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgcGFyYW1ldGVycyA9IGxvY2F0aW9uLnNlYXJjaC5zdWJzdHJpbmcoMSkuc3BsaXQoXCImXCIpO1xuICAgIGlmKCFBcnJheS5pc0FycmF5KHBhcmFtZXRlcnMpIHx8IHBhcmFtZXRlcnMubGVuZ3RoPT09MClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICBsZXQgcGFyYW0sIGRhdGFzPXt9O1xuICAgIGZvcihsZXQgaSBpbiBwYXJhbWV0ZXJzKVxuICAgIHtcbiAgICAgICAgcGFyYW0gPSBwYXJhbWV0ZXJzW2ldLnNwbGl0KFwiPVwiKTtcbiAgICAgICAgaWYocGFyYW0ubGVuZ3RoPT09MilcbiAgICAgICAgICAgIGRhdGFzW3BhcmFtWzBdXT1kZWNvZGVVUkkocGFyYW1bMV0pO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YXM7XG59IiwiaW1wb3J0IHsgYXBpVXJsLCBhdmFpbGFibGVMYW5ncywgc2l0ZVVybCwgdGhlbWUgfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCI7XG5jb25zdCBsYW5nPWF2YWlsYWJsZUxhbmdzWzBdO1xuXG5jb25zdCBjb25maWdUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi8uLi8uLi92aWV3cy9cIit0aGVtZStcIi9jb25maWcvXCIrbGFuZytcIi5qc1wiKTtcbmltcG9ydCB7ICBjaGVja0xvZ2luUm91dGUsIHRpbWVEaWZmZXJlbmNlTWF4LCB0aW1lRGlmZmVyZW5jZU1pbiwgdXNlclJvdXRlcyB9IGZyb20gXCIuLi8uLi8uLi9jb25maWcvdXNlcnMuanNcIjtcblxuaW1wb3J0IHsgZ2V0TG9jYWx5LCByZW1vdmVMb2NhbHksIHNhdmVMb2NhbHkgfSBmcm9tIFwiLi9jbGllbnRzdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gUsOpY3Vww6hyZSBsZXMgZG9ubsOpZXMgZGUgY29uZmlndXJhdGlvbiBkZXMgdXRpbGlzYXRldXJzXG4vLyDDgCB0ZXJtZSwgdW4gZmljaGllciBzdGF0aXF1ZSBpbXBvcnRhYmxlIGNvbW1lIG1vZHVsZSBkZXZyYWl0IMOpdml0ZXIgdW5lIHJlcXXDqnRlIGFqYXhcbmV4cG9ydCBjb25zdCBnZXRDb25maWcgPSAgYXN5bmMgKCkgPT5cbntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBhcGlVcmwrXCIvdXNlci9nZXRjb25maWdcIik7XG4gICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCkpO1xuICAgICAgICB4aHIub25lcnJvciA9ICgpID0+IHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICAgIHhoci5zZW5kKCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRUaW1lRGlmZmVyZW5jZSA9ICgpID0+XG57XG4gICAgY29uc3QgdGltZUxvY2FsPW5ldyBEYXRlKCkuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICBpZih0aW1lTG9jYWwgPiB0aW1lRGlmZmVyZW5jZU1heCB8fCB0aW1lTG9jYWwgPCB0aW1lRGlmZmVyZW5jZU1pbilcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgZWxzZSByZXR1cm4gdGltZUxvY2FsO1xufVxuXG4vLyBPbiBlbmzDqHZlIHZvbG9udGFpcmVtZW50IGxlcyAwL08gcG91ciDDqXZpdGVyIGxlcyBjb25mdXNpb25zICFcbi8vIEV0IG1pZXV4IHZhdXQgYXVzc2kgZMOpYnV0ZXIgZXQgZmluaXIgcGFyIHVuZSBsZXR0cmUgc2ltcGxlLlxuZXhwb3J0IGNvbnN0IGdldFBhc3N3b3JkID0gKG5iQ2FyTWluLCBuYkNhck1heCkgPT5cbntcbiAgICBjb25zdCBuYkNhcj1uYkNhck1pbitNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqKG5iQ2FyTWF4LW5iQ2FyTWluKSk7XG4gICAgY29uc3QgbGV0dGVycz1cIkFCQ0RFRkdISUpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbnBxcnN0dXZ3eHl6XCI7XG4gICAgY29uc3Qgb3RoZXJzPVwiMTIzNDU2Nzg5IT8uKi1fJUAmw4nDgMOIw5nigqwkw4LDisObw45cIjtcbiAgICBsZXQgcGFzc3dvcmQ9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICBmb3IobGV0IGk9MTtpPChuYkNhci0xKTtpKyspXG4gICAge1xuICAgICAgICBpZigoaSAlIDIpID09PTEpXG4gICAgICAgICAgICBwYXNzd29yZCs9b3RoZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpvdGhlcnMubGVuZ3RoKV07XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHBhc3N3b3JkKz1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldOyAgIFxuICAgIH1cbiAgICBwYXNzd29yZCs9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICByZXR1cm4gcGFzc3dvcmQ7XG59XG5cbi8vIEondXRpbGlzZSBsZSBzdG9ja2FnZSBsb2NhbCBkdSBuYXZpZ2F0ZXVyIHBvdXIgZW5yZWdpc3RyZXIgbGVzIGRvbm7DqWVzIHBlcm1ldHRhbnQgZGUgcmVjb25uYcOudHJlIGwndXRpbGlzYXRldXIgcGFyIGxhIHN1aXRlXG4vLyBTZXVsIGxlIHNlcnZldXIgcG91cnJhIHbDqXJpZmllciBxdWUgbGVzIGlkZW50aWZpYW50cyBzb250ICh0b3Vqb3VycykgdmFsaWRlcy5cbmV4cG9ydCBjb25zdCBzZXRTZXNzaW9uID0gKHVzZXJJZCwgdG9rZW4sIGR1cmF0aW9uVFMpID0+XG57XG4gICAgY29uc3Qgc3RvcmFnZVVzZXI9XG4gICAge1xuICAgICAgICBpZDogdXNlcklkLFxuICAgICAgICB0b2tlbjogdG9rZW4sXG4gICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvblRTXG4gICAgfVxuICAgIHNhdmVMb2NhbHkoXCJ1c2VyXCIsIHN0b3JhZ2VVc2VyKTtcbn1cblxuLy8gVsOpcmlmaWUgcXUnaWwgeSBhIGRlcyBkb25uw6llcyBsb2NhbGVzIGNvbmNlcm5hbnQgbGUgcsOpc3VsdGF0IGQndW4gcXVpelxuLy8gRXQgbGVzIGFqb3V0ZSBhdXggZG9ubsOpZXMgZW52b3nDqWVzIHBhciBsZXMgZm9ybXVsYWlyZXMgZCdpbnNjcmlwdGlvbi9jb25uZXhpb24gc2kgYydlc3QgbGUgY2FzXG5leHBvcnQgY29uc3QgY2hlY2tBbnN3ZXJEYXRhcyA9IChkYXRhcykgPT5cbntcbiAgICBjb25zdCBsYXN0QW5zd2VyPWdldExvY2FseShcImxhc3RBbnN3ZXJcIik7XG4gICAgaWYoIWlzRW1wdHkobGFzdEFuc3dlcikpXG4gICAge1xuICAgICAgICBjb25zdCBhbnN3ZXI9SlNPTi5wYXJzZShsYXN0QW5zd2VyKTtcbiAgICAgICAgaWYoIWlzRW1wdHkoYW5zd2VyLmR1cmF0aW9uKSAmJiAhaXNFbXB0eShhbnN3ZXIubmJDb3JyZWN0QW5zd2VycykgJiYgIWlzRW1wdHkoYW5zd2VyLlF1ZXN0aW9ubmFpcmVJZCkgJiYgIWlzRW1wdHkoYW5zd2VyLm5iUXVlc3Rpb25zKSlcbiAgICAgICAge1xuICAgICAgICAgICAgZGF0YXMuZHVyYXRpb249YW5zd2VyLmR1cmF0aW9uO1xuICAgICAgICAgICAgZGF0YXMubmJDb3JyZWN0QW5zd2Vycz1hbnN3ZXIubmJDb3JyZWN0QW5zd2VycztcbiAgICAgICAgICAgIGRhdGFzLlF1ZXN0aW9ubmFpcmVJZD1hbnN3ZXIuUXVlc3Rpb25uYWlyZUlkO1xuICAgICAgICAgICAgZGF0YXMubmJRdWVzdGlvbnM9YW5zd2VyLm5iUXVlc3Rpb25zO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhcztcbn1cblxuLy8gQ2V0dGUgZm9uY3Rpb24gdGVzdGUgbGEgY29ubmV4aW9uIGRlIGwndXRpbGlzYXRldXIgZCd1bmUgcGFnZVxuLy8gT24gcGV1dCBmb3VybmlzIHVuZSBsaXN0ZSBkZSBzdGF0dXRzIGFjY2VwdMOpcyAoc2kgdmlkZSA9IHRvdXMpLCBhaW5zaSBxdSd1bmUgdXJsIGRlIHJlZGlyZWN0aW9uIHNpIG5vbiBjb25uZWN0w6ksIHVuIG1lc3NhZ2UgZCdlcnJldXIgw6AgYWZmaWNoZXIgc3VyIGxhIHBhZ2UgZGUgZGVzdGluYXRpb24gZXQgbCd1cmwgc3VyIGxhcXVlbGxlIHJldmVuaXIgdW5lIGZvaXMgY29ubmVjdMOpXG5leHBvcnQgY29uc3QgY2hlY2tTZXNzaW9uID0gYXN5bmMgKHN0YXR1cz1bXSwgdXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCkgPT5cbntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IHVzZXJEYXRhcz1nZXRMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICBpZihpc0VtcHR5KHVzZXJEYXRhcykpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgdXNlcj1KU09OLnBhcnNlKHVzZXJEYXRhcyk7XG4gICAgICAgICAgICBpZihpc0VtcHR5KHVzZXIuaWQpIHx8wqBpc0VtcHR5KHVzZXIudG9rZW4pIHx8IGlzRW1wdHkodXNlci5kdXJhdGlvbikgfHwgdXNlci5kdXJhdGlvbiA8IERhdGUubm93KCkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgYXBpVXJsK3VzZXJSb3V0ZXMrY2hlY2tMb2dpblJvdXRlK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDAgJiYgcmVzcG9uc2UuaXNWYWxpZCAmJiByZXNwb25zZS5pZCAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLmlkPT09dXNlci5pZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLm5hbWU9cmVzcG9uc2UubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLmxhbmd1YWdlPXJlc3BvbnNlLmxhbmd1YWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIudGltZURpZmZlcmVuY2U9cmVzcG9uc2UudGltZURpZmZlcmVuY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5zdGF0dXM9cmVzcG9uc2Uuc3RhdHVzOy8vIGxlIHRva2VuIGV0IGRlIHRvdXRlIGZhw6dvbiB2w6lyaWZpZXIgw6AgY2hhcXVlIHJlcXXDqnRlIMOgIGwnQVBJXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUxvY2FseShcInVzZXJcIiwgdXNlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2kgaWwgcydhZ2l0IGQndW4gXCJ1c2VyXCIgZXQgcXVlIHNvbiBhYm9ubmVtZW50IGEgZXhwaXLDqSwgamUgbGUgcmVkaXJpZ2UgdmVycyBsYSBjYWlzc2UgOi0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2Uuc3RhdHVzPT09XCJ1c2VyXCIgJiYgcmVzcG9uc2UubmJEYXlzT2sgPD0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybEFjY291bnQ9c2l0ZVVybCtcIi9cIitjb25maWdUZW1wbGF0ZVtsYW5nXS5hY2NvdW50UGFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZih1cmxBY2NvdW50KT09PS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIi9cIitjb25maWdUZW1wbGF0ZVtsYW5nXS5hY2NvdW50UGFnZSk7Ly8gcGFzc8OpZSBkaXJlY3RlbWVudCBpY2ksIGwnYW5jcmUgI3N1YnNjcmliZSBuZSBmb25jdGlvbm5lIHBhcyAhP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzdGF0dXMubGVuZ3RoIT09MCAmJiBzdGF0dXMuaW5kZXhPZihyZXNwb25zZS5zdGF0dXMpPT09LTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHhoci5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICAgICAgICAgICAgICB4aHIuc2VuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4vLyBDZXR0ZSBmb25jdGlvbiBzZXJ0IMOgIGxhIHByw6ljw6lkZW50ZSBlbiBjYXMgZGUgY29ubmV4aW9uIG5vbiB2YWxpZGVcbmNvbnN0IHJlZGlyZWN0VXNlciA9ICh1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKSA9Plxue1xuICAgIGlmKCFpc0VtcHR5KG1lc3NhZ2UpKVxuICAgICAgICBzYXZlTG9jYWx5KFwibWVzc2FnZVwiLCBtZXNzYWdlKTtcbiAgICBpZighaXNFbXB0eSh1cmxXYW50ZWQpKVxuICAgICAgICBzYXZlTG9jYWx5KFwidXJsXCIsIHVybFdhbnRlZCk7XG4gICAgaWYoIWlzRW1wdHkodXJsUmVkaXJlY3Rpb24pKVxuICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKHVybFJlZGlyZWN0aW9uKTtcbn0iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/front/public/JS/loginlink.app.js b/front/public/JS/loginlink.app.js new file mode 100644 index 0000000..071c378 --- /dev/null +++ b/front/public/JS/loginlink.app.js @@ -0,0 +1,872 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "./src/loginlink.js"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "../lang sync recursive ^\\.\\/.*\\/general$": +/*!**************************************!*\ + !*** ../lang sync ^\.\/.*\/general$ ***! + \**************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/general": "../lang/fr/general.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/general$"; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/user$": +/*!***********************************!*\ + !*** ../lang sync ^\.\/.*\/user$ ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/user": "../lang/fr/user.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/user$"; + +/***/ }), + +/***/ "../lang/fr/general.js": +/*!*****************************!*\ + !*** ../lang/fr/general.js ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + siteHTMLTitle: "WikiLerni : qu'allez-vous apprendre aujourd'hui ?", + siteMetaDescription: "Chaque jour, testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.", + scriptTimingInfo: "Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", + scriptTimingAlert: "*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", + serverError: "Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.", + serverErrorAdmin: "Bug de l'application :", + neededParams: "Des paramètres nécessaires manquants sont manquants.", + badUrl: "Tentative d'accès à une page n'existant pas :", + notValidFormat: "Format non valide.", + notAllowed: "Vous n'avez pas les droits nécessaires pour cette action.", + notRequired: "Facultatif.", + updateBtnTxt: "Modifier", + addBtnTxt: "Ajouter", + deleteBtnTxt: "Supprimer", + addOkMessage: "Les données ont bien été enregistrées.", + updateOkMessage: "La mise à jour à jour a bien été enregistrée.", + deleteOkMessage: "La suppression a bien été enregistrée.", + failAuth: "Erreur d'authentification.", + failAuthHeader: "Absence de header Authorization.", + failAuthToken: "Token invalide ou utilisateur non trouvé.", + failAuthId: "Identifiant non valide : ", + failAuthCron: "Tentative de lancement d'un cron sans le bon token.", + previousPage: "Page précédente", + nextPage: "Page suivante", + btnLinkToQuestionnaire: "Aller au quiz !", + statsAdmin: "Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
    En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
    Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium." +}; + +/***/ }), + +/***/ "../lang/fr/user.js": +/*!**************************!*\ + !*** ../lang/fr/user.js ***! + \**************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + notFound: "L'utilisateur n'a pas été trouvé.", + needName: "Merci de choisir un nom d'utilisateur.", + needNotTooLongName: "Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.", + needEmail: "Merci de saisir votre adresse e-mail.", + needUniqueEmail: "L'adresse e-mail que vous avez saisie est déjà utilisée par un autre utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.", + needNotTooLongEmail: "Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.", + needPassWord: "Merci de fournir un mot de passe.", + needLongPassWord: "Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.", + passwordCopied: "Le mot de passe généré a été copié dans le presse-papier. Vous pouvez le recopier où vous le souhaiter.", + needStatus: "Il manque le statut.", + needLanguage: "Il manque le code langue.", + needValidLastConnectionDate: "La date de dernière connexion n'est pas valide.", + needSMTP: "Il manque le serveur SMTP.", + needSMTPNotFound: "Il manque le serveur SMTP.", + needKnowNewsletterOk: "Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.", + needTimeDifference: "Il faut connaître le nombre de minutes du décalage horaire.", + needMinTimeDifference: "Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.", + needMaxTimeDifference: "Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.", + needUGCOk: "Vous devez accepter les CGU pour pouvoir créer votre compte. ", + godfatherNotFound: "Aucun utilisateur valide trouvé pour ce code parrain.", + godfatherFound: "Votre parrain a bien été trouvé !", + mailValidationMessage: "Votre inscription est bien enregistrée.\nPour la finaliser, merci de cliquer dans les 24H sur le lien de confirmation qui vient de vous être envoyé par e-mail.", + mailValidationLinkSubject: "Merci de valider votre compte", + mailValidationLinkSBodyTxt: "Bonjour USER_NAME,\n\nPour valider votre compte, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL", + mailValidationLinkSBodyHTML: "

    Bonjour USER_NAME,

    Pour valider votre compte, merci de cliquer sur le lien suivant dans les 24h.

    Valider.

    ", + validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue !", + validationMessageAdmin: "Le compte a bien été validé.", + validationAlreadyMessage: "Il semble que vous ayez déjà validé votre compte.", + validationAlreadyMessageAdmin: "Ce compte a déjà été validé.", + mailWelcomeSubject: "Bienvenue !", + mailWelcomeBodyTxt: "Bonjour USER_NAME,\nVotre venez de valider votre inscription à NOM_SITE.\nMerci et à bientôt !", + mailWelcomeBodyHTML: "

    Bonjour USER_NAME,

    Votre venez de valider votre inscription à NOM_SITE.

    Merci et à bientôt !

    ", + mailThankGodfatherSubject: "Merci !", + mailThankGodfatherBodyTxt: "Bonjour USER_NAME,\nGrâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nMerci et à bientôt !", + mailThankGodfatherBodyHTML: "

    Bonjour USER_NAME,

    Grâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.

    Merci et à bientôt !

    ", + badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.", + emailNotFound: "Aucun utilisateur trouvé pour cette adresse e-mail.", + alreadyConnected: "Vous êtes déjà connecté(e) au site !", + needBeConnected: "Vous devez être connecté(e) pour accéder à cette page.", + connectionOk: "Connexion réussie.", + needChooseLoginWay: "Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.", + needValidationToLogin: "Vous devez d'abord valider votre compte avant de vous connecter. Pour ce faire, un lien vient de vous être envoyé par e-mail.", + tooManyLoginFails: "Trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.", + badPassword: "Le mot de passe n'est pas le bon.", + mailLoginLinkSubject: "Votre lien de connexion.", + mailLoginLinkBodyTxt: "Bonjour USER_NAME,\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : LINK_URL", + mailLoginLinkBodyHTML: "

    Bonjour USER_NAME,

    Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :

    Valider.

    ", + mailLoginLinkMessage: "Un lien de connexion vient de vous être envoyé sur votre adresse e-mail. Ne tardez pas à l'utiliser, car il n'est valable que durant ", + updatedOkMessage: "Vos informations ont bien été mises à jour.", + updatedNeedGoodEmail: "Mais la nouvelle adresse e-mail n'a pu être enregistrée car elle n'a pas une format correct.", + updatedNeedUniqueEmail: "Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.", + mailUpdateLoginSubject: "Merci de valider vos nouveaux identifiants.", + mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL", + mailUpdateLoginBodyHTML: "

    Bonjour USER_NAME,

    Pour valider vos nouveaux identifiants de connexion, cliquez ici sans tarder.

    ", + mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (email et/ou mot de passe) et vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement. En attendant, merci de continuer à utiliser vos anciens identifiants.", + updatedNeedValidatedUser: "L'utilisateur que vous souhaité modifier n'existe pas/plus ou n'a pas encore validé son compte.", + updatedNeedGoodGodfather: "Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.", + mailUpdateLoginOkMessage: "La mise à jour de vos identifiants a bien été enregistrée.", + updatedFailedGodfatherNotFound: "L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.", + creationOkMessage: "Le nouvel utilisateur a bien été enregistré.", + mailDeleteSubject: "Confirmer la suppression de votre compte.", + mailDeleteBodyTxt: "Bonjour USER_NAME,\nPour valider la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL", + mailDeleteBodyHTML: "

    Bonjour USER_NAME,

    Pour valider la suppression de votre compte, cliquez ici sans tarder.

    ", + mailDeleteLinkMessage: "Votre demande de suppression a bien été enregistrée. Merci de cliquer sans tarder sur le lien qui vient de vous être envoyé par e-mail pour confirmer.", + deleteOkMessage: "L'utilisateur a bien été supprimé.", + deleteFailMessage: "Tentative de suppression d'un utilisateur inexistant : ", + mailDeleteLinkOkMessage: "Votre compte a bien été supprimé. Merci d'avoir utilisé nos services.", + mailDeleteLinkAlreadyMessage: "Il semble que vous ayez déjà validé la suppression de votre compte.", + mailDeleteLinkFailMessage: "Votre lien de suppression n'est pas valide ou alors il n'est plus valable.", + cronDeleteUnvalidedUsersMessage: " comptes utilisateurs non validés ont été supprimés.", + deleteInactiveUsersMessage: " comptes utilisateurs inactifs ont été supprimés.", + welcomeMessage: "Bienvenue #NAME !", + byebyeMessage: "Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
    À bientôt !", + infosUserForAdmin: "Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
    Date de sa dernière connexion : DATE_CONNECTION.", + infosAdminGodfather: "Cet utilisateur a été parrainé par ", + infosAdminNbGodChilds: "Ses #NB filleuils : " +}; + +/***/ }), + +/***/ "../tools/main.js": +/*!************************!*\ + !*** ../tools/main.js ***! + \************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +// Quelques fonctions utiles pour les chaînes +var Tool = /*#__PURE__*/function () { + function Tool() { + _classCallCheck(this, Tool); + } + + _createClass(Tool, null, [{ + key: "isEmpty", + value: function isEmpty(myVar) { + if (myVar === undefined || myVar === null) return true;else { + myVar += ""; // si autre chose qu'une chaîne envoyé... + + myVar = myVar.trim(); + if (myVar === "") return true;else return false; + } + } + }, { + key: "trimIfNotNull", + value: function trimIfNotNull(myString) { + if (Tool.isEmpty(myString)) myString = null;else { + myString += ""; // si autre chose qu'une chaîne envoyé... + + myString = myString.trim(); + } + return myString; + } + }, { + key: "shortenIfLongerThan", + value: function shortenIfLongerThan(myString, max) { + myString += ""; // au cas où cela ne serait pas une chaîne... + + if (myString.length > max) myString = myString.substring(0, max - 3) + "..."; + return myString; + } // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings + + }, { + key: "replaceAll", + value: function replaceAll(myString, mapObj) { + var replaceElts = new RegExp(Object.keys(mapObj).join("|"), "gi"); + return myString.replace(replaceElts, function (matched) { + return mapObj[matched]; + }); + } // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random + + }, { + key: "getRandomInt", + value: function getRandomInt(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min)) + min; + } // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country + + }, { + key: "dateFormat", + value: function dateFormat(dateString) { + var lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "fr"; + if (Tool.isEmpty(dateString)) return ""; + var myDate = new Date(dateString); + var myDay = myDate.getDate() + ""; + if (myDay.length === 1) myDay = "0" + myDay; + var myMounth = myDate.getMonth() + 1 + ""; + if (myMounth.length === 1) myMounth = "0" + myMounth; + var myYear = myDate.getFullYear(); + if (lang === "fr") return myDay + "/" + myMounth + "/" + myYear;else if (lang === "form") // 2014-02-09 + return myYear + "-" + myMounth + "-" + myDay;else return myMounth + "/" + myDay + "/" + myYear; + } + }]); + + return Tool; +}(); + +module.exports = Tool; + +/***/ }), + +/***/ "./src/config/general.js": +/*!*******************************!*\ + !*** ./src/config/general.js ***! + \*******************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + apiUrl: "http://localhost:3000/api", + usersGetConfigUrl: "/user/getconfig", + lang: "fr", + userHomePage: "accueil.html", + adminHomePage: "admin.html", + managerHomePage: "gestion.html", + subscribePage: "inscription.html", + connectionPage: "connexion.html", + accountPage: "compte.html", + questionnairesManagementPage: "gestion-quizs.html", + usersManagementPage: "gestion-utilisateurs.html", + nbQuestionnairesUserHomePage: 10, + illustrationDir: "/img/quizs/" +}; // à terme fusionner avec les déclarations backend concernant le front, tout étant saisi dans l'admin + +/***/ }), + +/***/ "./src/loginlink.js": +/*!**************************!*\ + !*** ./src/loginlink.js ***! + \**************************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js"); +/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _tools_url_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/url.js */ "./src/tools/url.js"); +/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./tools/users.js */ "./src/tools/users.js"); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + +// -- GESTION DE LA PAGE PERMETTANT DE TESTER UN LIEN DE CONNEXION REÇU PAR E-MAIL +/// Un token est transmis en paramètre de l'Url. Il a une validité limité dans le temps. +/// Dans ce cas, on peut rediriger l'utilisateur vers la page de connexion pour obtenir un nouveau lien de validation +/// Si le token est ok, on crée une session suivant la durée retournée par l'API et redirige l'utilisateur vers sa page d'accueil +/// Un résultat de quiz peut aussi avoir été enregistré côté client et est alors à transmettre à l'API +/// Si l'utilisateur a déjà une session active valide, c'est qu'il a déjà cliqué sur le lien. On le redirige également vers sa page d'accueil. +// Fichier de configuration côté client : +var configFrontEnd = __webpack_require__(/*! ./config/general */ "./src/config/general.js"); // Importation des fonctions utile au script : + + + + + + + + // Dictionnaires : + +var txt = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + configFrontEnd.lang + "/general"); + +var txtUsers = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/user$")("./" + configFrontEnd.lang + "/user"); + +var divResponse = document.getElementById("response"); +Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_2__["helloDev"])(); +var config; + +var initialise = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + var isConnected, user, homePage, datas, xhr; + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _context.prev = 0; + _context.next = 3; + return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_5__["getConfig"])(); + + case 3: + config = _context.sent; + + if (config) { + _context.next = 8; + break; + } + + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_1__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]); + _context.next = 12; + break; + + case 8: + _context.next = 10; + return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_5__["checkSession"])(config); + + case 10: + isConnected = _context.sent; + + if (isConnected) { + Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["saveLocaly"])("message", { + message: txtUsers.alreadyConnected, + color: "information" + }); // pour l'afficher sur la page suivante + + user = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["getLocaly"])("user", true); + homePage = user.status + "HomePage"; + window.location.assign("/" + configFrontEnd[homePage]); + } else { + datas = Object(_tools_url_js__WEBPACK_IMPORTED_MODULE_4__["getUrlParams"])(); + + if (datas && datas.t !== undefined) { + xhr = new XMLHttpRequest(); + xhr.open("POST", configFrontEnd.apiUrl + config.userRoutes + config.connectionWithLinkRoute); + + xhr.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var response = JSON.parse(this.responseText); + + if (this.status === 200 && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(response.userId) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(response.connexionTime) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(response.token)) { + var connexionMaxTime = Date.now(); + if (response.connexionTime.endsWith("days")) connexionMaxTime += parseInt(response.connexionTime, 10) * 24 * 3600 * 1000;else connexionMaxTime += parseInt(response.connexionTime, 10) * 3600 * 1000; + Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_5__["setSession"])(response.userId, response.token, connexionMaxTime); + Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["removeLocaly"])("lastAnswer"); // ! important pour ne pas enregister plusieurs fois le résultat + + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_1__["addElement"])(divResponse, "p", txtUsers.validationMessage, "", ["success"]); // au cas où blocage redirection + + window.location.assign("/" + configFrontEnd.userHomePage); // connexion par lien ne concerne que les simples "user" + } else if ((this.status === 401 || this.status === 403) && response.errors != undefined) { + if (Array.isArray(response.errors)) response.errors = response.errors.join("
    ");else response.errors = txt.serverError; + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_1__["addElement"])(divResponse, "p", response.errors, "", ["error"]); + } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_1__["addElement"])(divResponse, "p", txtUsers.badLinkValidationMessage.replace("#URL", configFrontEnd.connectionPage), "", ["error"]); + } + }; + + datas.timeDifference = Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_5__["getTimeDifference"])(config); // si l'utilisateur a précédement répondu à un quiz, j'ajoute les infos de son résultat : + + datas = Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_5__["checkAnswerDatas"])(datas); + xhr.setRequestHeader("Content-Type", "application/json"); + xhr.send(JSON.stringify(datas)); + } + } + + case 12: + _context.next = 17; + break; + + case 14: + _context.prev = 14; + _context.t0 = _context["catch"](0); + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_1__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]); + + case 17: + case "end": + return _context.stop(); + } + } + }, _callee, null, [[0, 14]]); + })); + + return function initialise() { + return _ref.apply(this, arguments); + }; +}(); + +initialise(); + +/***/ }), + +/***/ "./src/tools/clientstorage.js": +/*!************************************!*\ + !*** ./src/tools/clientstorage.js ***! + \************************************/ +/*! exports provided: saveLocaly, getLocaly, removeLocaly */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveLocaly", function() { return saveLocaly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaly", function() { return getLocaly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeLocaly", function() { return removeLocaly; }); +// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.) +// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie +var saveLocaly = function saveLocaly(name, data) { + localStorage.setItem(name, JSON.stringify(data)); +}; +var getLocaly = function getLocaly(name) { + var json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name); +}; +var removeLocaly = function removeLocaly(name) { + localStorage.removeItem(name); +}; + +/***/ }), + +/***/ "./src/tools/dom.js": +/*!**************************!*\ + !*** ./src/tools/dom.js ***! + \**************************/ +/*! exports provided: addElement */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addElement", function() { return addElement; }); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__); +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + + // Fonction associant les attributs fournis à un champ de formulaire + +var addElement = function addElement(eltParent, eltType) { + var eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; + var eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; + var eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : []; + var eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; + var replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true; + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltType) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltParent)) return false;else { + var newElement = document.createElement(eltType); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ? + newElement.id = eltId; + + if (Array.isArray(eltClass) && eltClass.length != 0) { + for (var i in eltClass) { + newElement.classList.add(eltClass[i]); + } + } + + if (_typeof(eltAttributes) === "object") // !! tous les objets ne sont pas ok + { + for (var attributName in eltAttributes) { + newElement.setAttribute(attributName, eltAttributes[attributName]); + } + } + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltContent)) newElement.innerHTML = eltContent.replace(/\n/g, "
    "); // innerHTML permet d'ajouter du texte ayant lui-même des balises, etc. + + if (replace) eltParent.innerHTML = ""; + eltParent.appendChild(newElement); + } +}; + +/***/ }), + +/***/ "./src/tools/everywhere.js": +/*!*********************************!*\ + !*** ./src/tools/everywhere.js ***! + \*********************************/ +/*! exports provided: helloDev */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "helloDev", function() { return helloDev; }); +// Ce script fournit des fonctions utilisées sur toutes les pages du site +var helloDev = function helloDev() { + console.log("**** Hello ami développeur :-)\n Le code de WikiLerni est libre et est lisible sur gitlab : \n Bonne lecture :-) \n Pour les suggestions d'amélioration ou questions : dev@wililerni.com ****"); + return true; +}; + +/***/ }), + +/***/ "./src/tools/url.js": +/*!**************************!*\ + !*** ./src/tools/url.js ***! + \**************************/ +/*! exports provided: getUrlParams */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getUrlParams", function() { return getUrlParams; }); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__); + // Fonction récupérant les paramètres passés par l'url + +var getUrlParams = function getUrlParams() { + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(location.search)) return false; + var parameters = location.search.substring(1).split("&"); + if (!Array.isArray(parameters) || parameters.length === 0) return false; + var param, + datas = {}; + + for (var i in parameters) { + param = parameters[i].split("="); + if (param.length === 2) datas[param[0]] = decodeURI(param[1]); + } + + return datas; +}; + +/***/ }), + +/***/ "./src/tools/users.js": +/*!****************************!*\ + !*** ./src/tools/users.js ***! + \****************************/ +/*! exports provided: getConfig, getTimeDifference, getPassword, setSession, checkAnswerDatas, checkSession */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getConfig", function() { return getConfig; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTimeDifference", function() { return getTimeDifference; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getPassword", function() { return getPassword; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setSession", function() { return setSession; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkAnswerDatas", function() { return checkAnswerDatas; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkSession", function() { return checkSession; }); +/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_1__); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + +var configFrontEnd = __webpack_require__(/*! ../config/general */ "./src/config/general.js"); + + + // Récupère les données de configuration des utilisateurs +// À terme, un fichier statique importable comme module devrait éviter une requête ajax + +var getConfig = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + return _context.abrupt("return", new Promise(function (resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", configFrontEnd.apiUrl + configFrontEnd.usersGetConfigUrl); + + xhr.onload = function () { + return resolve(JSON.parse(xhr.responseText)); + }; + + xhr.onerror = function () { + return reject(xhr.statusText); + }; + + xhr.send(); + })); + + case 1: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + + return function getConfig() { + return _ref.apply(this, arguments); + }; +}(); +var getTimeDifference = function getTimeDifference(config) { + var timeLocal = new Date().getTimezoneOffset(); + if (timeLocal > config.timeDifferenceMax || timeLocal < config.timeDifferenceMin) return 0;else return timeLocal; +}; // On enlève volontairement les 0/O pour éviter les confusions ! +// Et mieux vaut aussi débuter et finir par une lettre simple. + +var getPassword = function getPassword(nbCarMin, nbCarMax) { + var nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin)); + var letters = "ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz"; + var others = "123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ"; + var password = letters[Math.floor(Math.random() * letters.length)]; + + for (var i = 1; i < nbCar - 1; i++) { + if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)]; + } + + password += letters[Math.floor(Math.random() * letters.length)]; + return password; +}; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite +// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides. + +var setSession = function setSession(userId, token, durationTS) { + var storageUser = { + id: userId, + token: token, + duration: durationTS + }; + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["saveLocaly"])("user", storageUser); +}; // Vérifie qu'il y a des données locales concernant le résultat d'un quiz +// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas + +var checkAnswerDatas = function checkAnswerDatas(datas) { + var lastAnswer = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["getLocaly"])("lastAnswer"); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(lastAnswer)) { + var answer = JSON.parse(lastAnswer); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.duration) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.nbCorrectAnswers) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.QuestionnaireId) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.nbQuestions)) { + datas.duration = answer.duration; + datas.nbCorrectAnswers = answer.nbCorrectAnswers; + datas.QuestionnaireId = answer.QuestionnaireId; + datas.nbQuestions = answer.nbQuestions; + } + } + + return datas; +}; // Cette fonction teste la connexion de l'utilisateur d'une page +// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté + +var checkSession = /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(config) { + var status, + urlRedirection, + message, + urlWanted, + _args2 = arguments; + return regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + status = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : []; + urlRedirection = _args2.length > 2 ? _args2[2] : undefined; + message = _args2.length > 3 ? _args2[3] : undefined; + urlWanted = _args2.length > 4 ? _args2[4] : undefined; + return _context2.abrupt("return", new Promise(function (resolve, reject) { + var userDatas = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["getLocaly"])("user"); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(userDatas)) { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else { + var user = JSON.parse(userDatas); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(user.id) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(user.token) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(user.duration) || user.duration < Date.now()) { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else { + var xhr = new XMLHttpRequest(); + xhr.open("GET", configFrontEnd.apiUrl + config.userRoutes + config.checkLoginRoute + user.token); + + xhr.onload = function () { + var response = JSON.parse(xhr.responseText); + + if (xhr.status === 200 && response.isValid && response.id != undefined) { + if (response.id === user.id) { + user.name = response.name; + user.language = response.language; + user.timeDifference = response.timeDifference; + user.status = response.status; // le token et de toute façon vérifier à chaque requête à l'API + + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["saveLocaly"])("user", user); // si il s'agit d'un "user" et que son abonnement a expiré, je le redirige vers la caisse :-) + + if (response.status === "user" && response.nbDaysOk <= 0) { + var urlAccount = config.siteUrl + "/" + configFrontEnd.accountPage; + if (window.location.href.indexOf(urlAccount) === -1) window.location.assign("/" + configFrontEnd.accountPage); // passée directement ici, l'ancre #subscribe ne fonctionne pas !? + + resolve(true); + } else { + if (status.length !== 0 && status.indexOf(response.status) === -1) { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else resolve(true); + } + } else { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + } else { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + }; + + xhr.onerror = function () { + return reject(xhr.statusText); + }; + + xhr.send(); + } + } + })); + + case 5: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + + return function checkSession(_x) { + return _ref2.apply(this, arguments); + }; +}(); // Cette fonction sert à la précédente en cas de connexion non valide + +var redirectUser = function redirectUser(urlRedirection, message, urlWanted) { + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(message)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["saveLocaly"])("message", message); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(urlWanted)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["saveLocaly"])("url", urlWanted); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(urlRedirection)) window.location.assign(urlRedirection); +}; + +/***/ }) + +/******/ }); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9nZW5lcmFsJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3VzZXIkIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL2dlbmVyYWwuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcvZnIvdXNlci5qcyIsIndlYnBhY2s6Ly8vLi4vdG9vbHMvbWFpbi5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY29uZmlnL2dlbmVyYWwuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvZ2lubGluay5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvY2xpZW50c3RvcmFnZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvZG9tLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy9ldmVyeXdoZXJlLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy91cmwuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL3VzZXJzLmpzIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJzaXRlSFRNTFRpdGxlIiwic2l0ZU1ldGFEZXNjcmlwdGlvbiIsInNjcmlwdFRpbWluZ0luZm8iLCJzY3JpcHRUaW1pbmdBbGVydCIsInNlcnZlckVycm9yIiwic2VydmVyRXJyb3JBZG1pbiIsIm5lZWRlZFBhcmFtcyIsImJhZFVybCIsIm5vdFZhbGlkRm9ybWF0Iiwibm90QWxsb3dlZCIsIm5vdFJlcXVpcmVkIiwidXBkYXRlQnRuVHh0IiwiYWRkQnRuVHh0IiwiZGVsZXRlQnRuVHh0IiwiYWRkT2tNZXNzYWdlIiwidXBkYXRlT2tNZXNzYWdlIiwiZGVsZXRlT2tNZXNzYWdlIiwiZmFpbEF1dGgiLCJmYWlsQXV0aEhlYWRlciIsImZhaWxBdXRoVG9rZW4iLCJmYWlsQXV0aElkIiwiZmFpbEF1dGhDcm9uIiwicHJldmlvdXNQYWdlIiwibmV4dFBhZ2UiLCJidG5MaW5rVG9RdWVzdGlvbm5haXJlIiwic3RhdHNBZG1pbiIsIm5vdEZvdW5kIiwibmVlZE5hbWUiLCJuZWVkTm90VG9vTG9uZ05hbWUiLCJuZWVkRW1haWwiLCJuZWVkVW5pcXVlRW1haWwiLCJuZWVkTm90VG9vTG9uZ0VtYWlsIiwibmVlZFBhc3NXb3JkIiwibmVlZExvbmdQYXNzV29yZCIsInBhc3N3b3JkQ29waWVkIiwibmVlZFN0YXR1cyIsIm5lZWRMYW5ndWFnZSIsIm5lZWRWYWxpZExhc3RDb25uZWN0aW9uRGF0ZSIsIm5lZWRTTVRQIiwibmVlZFNNVFBOb3RGb3VuZCIsIm5lZWRLbm93TmV3c2xldHRlck9rIiwibmVlZFRpbWVEaWZmZXJlbmNlIiwibmVlZE1pblRpbWVEaWZmZXJlbmNlIiwibmVlZE1heFRpbWVEaWZmZXJlbmNlIiwibmVlZFVHQ09rIiwiZ29kZmF0aGVyTm90Rm91bmQiLCJnb2RmYXRoZXJGb3VuZCIsIm1haWxWYWxpZGF0aW9uTWVzc2FnZSIsIm1haWxWYWxpZGF0aW9uTGlua1N1YmplY3QiLCJtYWlsVmFsaWRhdGlvbkxpbmtTQm9keVR4dCIsIm1haWxWYWxpZGF0aW9uTGlua1NCb2R5SFRNTCIsInZhbGlkYXRpb25NZXNzYWdlIiwidmFsaWRhdGlvbk1lc3NhZ2VBZG1pbiIsInZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZSIsInZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZUFkbWluIiwibWFpbFdlbGNvbWVTdWJqZWN0IiwibWFpbFdlbGNvbWVCb2R5VHh0IiwibWFpbFdlbGNvbWVCb2R5SFRNTCIsIm1haWxUaGFua0dvZGZhdGhlclN1YmplY3QiLCJtYWlsVGhhbmtHb2RmYXRoZXJCb2R5VHh0IiwibWFpbFRoYW5rR29kZmF0aGVyQm9keUhUTUwiLCJiYWRMaW5rVmFsaWRhdGlvbk1lc3NhZ2UiLCJlbWFpbE5vdEZvdW5kIiwiYWxyZWFkeUNvbm5lY3RlZCIsIm5lZWRCZUNvbm5lY3RlZCIsImNvbm5lY3Rpb25PayIsIm5lZWRDaG9vc2VMb2dpbldheSIsIm5lZWRWYWxpZGF0aW9uVG9Mb2dpbiIsInRvb01hbnlMb2dpbkZhaWxzIiwiYmFkUGFzc3dvcmQiLCJtYWlsTG9naW5MaW5rU3ViamVjdCIsIm1haWxMb2dpbkxpbmtCb2R5VHh0IiwibWFpbExvZ2luTGlua0JvZHlIVE1MIiwibWFpbExvZ2luTGlua01lc3NhZ2UiLCJ1cGRhdGVkT2tNZXNzYWdlIiwidXBkYXRlZE5lZWRHb29kRW1haWwiLCJ1cGRhdGVkTmVlZFVuaXF1ZUVtYWlsIiwibWFpbFVwZGF0ZUxvZ2luU3ViamVjdCIsIm1haWxVcGRhdGVMb2dpbkJvZHlUeHQiLCJtYWlsVXBkYXRlTG9naW5Cb2R5SFRNTCIsIm1haWxVcGRhdGVMb2dpbkxpbmtNZXNzYWdlIiwidXBkYXRlZE5lZWRWYWxpZGF0ZWRVc2VyIiwidXBkYXRlZE5lZWRHb29kR29kZmF0aGVyIiwibWFpbFVwZGF0ZUxvZ2luT2tNZXNzYWdlIiwidXBkYXRlZEZhaWxlZEdvZGZhdGhlck5vdEZvdW5kIiwiY3JlYXRpb25Pa01lc3NhZ2UiLCJtYWlsRGVsZXRlU3ViamVjdCIsIm1haWxEZWxldGVCb2R5VHh0IiwibWFpbERlbGV0ZUJvZHlIVE1MIiwibWFpbERlbGV0ZUxpbmtNZXNzYWdlIiwiZGVsZXRlRmFpbE1lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua09rTWVzc2FnZSIsIm1haWxEZWxldGVMaW5rQWxyZWFkeU1lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua0ZhaWxNZXNzYWdlIiwiY3JvbkRlbGV0ZVVudmFsaWRlZFVzZXJzTWVzc2FnZSIsImRlbGV0ZUluYWN0aXZlVXNlcnNNZXNzYWdlIiwid2VsY29tZU1lc3NhZ2UiLCJieWVieWVNZXNzYWdlIiwiaW5mb3NVc2VyRm9yQWRtaW4iLCJpbmZvc0FkbWluR29kZmF0aGVyIiwiaW5mb3NBZG1pbk5iR29kQ2hpbGRzIiwiVG9vbCIsIm15VmFyIiwidW5kZWZpbmVkIiwidHJpbSIsIm15U3RyaW5nIiwiaXNFbXB0eSIsIm1heCIsImxlbmd0aCIsInN1YnN0cmluZyIsIm1hcE9iaiIsInJlcGxhY2VFbHRzIiwiUmVnRXhwIiwiT2JqZWN0Iiwia2V5cyIsImpvaW4iLCJyZXBsYWNlIiwibWF0Y2hlZCIsIm1pbiIsIk1hdGgiLCJjZWlsIiwiZmxvb3IiLCJyYW5kb20iLCJkYXRlU3RyaW5nIiwibGFuZyIsIm15RGF0ZSIsIkRhdGUiLCJteURheSIsImdldERhdGUiLCJteU1vdW50aCIsImdldE1vbnRoIiwibXlZZWFyIiwiZ2V0RnVsbFllYXIiLCJhcGlVcmwiLCJ1c2Vyc0dldENvbmZpZ1VybCIsInVzZXJIb21lUGFnZSIsImFkbWluSG9tZVBhZ2UiLCJtYW5hZ2VySG9tZVBhZ2UiLCJzdWJzY3JpYmVQYWdlIiwiY29ubmVjdGlvblBhZ2UiLCJhY2NvdW50UGFnZSIsInF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2UiLCJ1c2Vyc01hbmFnZW1lbnRQYWdlIiwibmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSIsImlsbHVzdHJhdGlvbkRpciIsImNvbmZpZ0Zyb250RW5kIiwicmVxdWlyZSIsInR4dCIsInR4dFVzZXJzIiwiZGl2UmVzcG9uc2UiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwiaGVsbG9EZXYiLCJjb25maWciLCJpbml0aWFsaXNlIiwiZ2V0Q29uZmlnIiwiYWRkRWxlbWVudCIsImNoZWNrU2Vzc2lvbiIsImlzQ29ubmVjdGVkIiwic2F2ZUxvY2FseSIsIm1lc3NhZ2UiLCJjb2xvciIsInVzZXIiLCJnZXRMb2NhbHkiLCJob21lUGFnZSIsInN0YXR1cyIsIndpbmRvdyIsImxvY2F0aW9uIiwiYXNzaWduIiwiZGF0YXMiLCJnZXRVcmxQYXJhbXMiLCJ0IiwieGhyIiwiWE1MSHR0cFJlcXVlc3QiLCJvcGVuIiwidXNlclJvdXRlcyIsImNvbm5lY3Rpb25XaXRoTGlua1JvdXRlIiwib25yZWFkeXN0YXRlY2hhbmdlIiwicmVhZHlTdGF0ZSIsIkRPTkUiLCJyZXNwb25zZSIsIkpTT04iLCJwYXJzZSIsInJlc3BvbnNlVGV4dCIsInVzZXJJZCIsImNvbm5leGlvblRpbWUiLCJ0b2tlbiIsImNvbm5leGlvbk1heFRpbWUiLCJub3ciLCJlbmRzV2l0aCIsInBhcnNlSW50Iiwic2V0U2Vzc2lvbiIsInJlbW92ZUxvY2FseSIsImVycm9ycyIsIkFycmF5IiwiaXNBcnJheSIsInRpbWVEaWZmZXJlbmNlIiwiZ2V0VGltZURpZmZlcmVuY2UiLCJjaGVja0Fuc3dlckRhdGFzIiwic2V0UmVxdWVzdEhlYWRlciIsInNlbmQiLCJzdHJpbmdpZnkiLCJuYW1lIiwiZGF0YSIsImxvY2FsU3RvcmFnZSIsInNldEl0ZW0iLCJqc29uIiwiZ2V0SXRlbSIsInJlbW92ZUl0ZW0iLCJlbHRQYXJlbnQiLCJlbHRUeXBlIiwiZWx0Q29udGVudCIsImVsdElkIiwiZWx0Q2xhc3MiLCJlbHRBdHRyaWJ1dGVzIiwibmV3RWxlbWVudCIsImNyZWF0ZUVsZW1lbnQiLCJpZCIsImkiLCJjbGFzc0xpc3QiLCJhZGQiLCJhdHRyaWJ1dE5hbWUiLCJzZXRBdHRyaWJ1dGUiLCJpbm5lckhUTUwiLCJhcHBlbmRDaGlsZCIsImNvbnNvbGUiLCJsb2ciLCJzZWFyY2giLCJwYXJhbWV0ZXJzIiwic3BsaXQiLCJwYXJhbSIsImRlY29kZVVSSSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0Iiwib25sb2FkIiwib25lcnJvciIsInN0YXR1c1RleHQiLCJ0aW1lTG9jYWwiLCJnZXRUaW1lem9uZU9mZnNldCIsInRpbWVEaWZmZXJlbmNlTWF4IiwidGltZURpZmZlcmVuY2VNaW4iLCJnZXRQYXNzd29yZCIsIm5iQ2FyTWluIiwibmJDYXJNYXgiLCJuYkNhciIsImxldHRlcnMiLCJvdGhlcnMiLCJwYXNzd29yZCIsImR1cmF0aW9uVFMiLCJzdG9yYWdlVXNlciIsImR1cmF0aW9uIiwibGFzdEFuc3dlciIsImFuc3dlciIsIm5iQ29ycmVjdEFuc3dlcnMiLCJRdWVzdGlvbm5haXJlSWQiLCJuYlF1ZXN0aW9ucyIsInVybFJlZGlyZWN0aW9uIiwidXJsV2FudGVkIiwidXNlckRhdGFzIiwicmVkaXJlY3RVc2VyIiwiY2hlY2tMb2dpblJvdXRlIiwiaXNWYWxpZCIsImxhbmd1YWdlIiwibmJEYXlzT2siLCJ1cmxBY2NvdW50Iiwic2l0ZVVybCIsImhyZWYiLCJpbmRleE9mIl0sIm1hcHBpbmdzIjoiO1FBQUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7OztRQUdBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwwQ0FBMEMsZ0NBQWdDO1FBQzFFO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0Esd0RBQXdELGtCQUFrQjtRQUMxRTtRQUNBLGlEQUFpRCxjQUFjO1FBQy9EOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSx5Q0FBeUMsaUNBQWlDO1FBQzFFLGdIQUFnSCxtQkFBbUIsRUFBRTtRQUNySTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDJCQUEyQiwwQkFBMEIsRUFBRTtRQUN2RCxpQ0FBaUMsZUFBZTtRQUNoRDtRQUNBO1FBQ0E7O1FBRUE7UUFDQSxzREFBc0QsK0RBQStEOztRQUVySDtRQUNBOzs7UUFHQTtRQUNBOzs7Ozs7Ozs7Ozs7QUNsRkE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0U7Ozs7Ozs7Ozs7O0FDdEJBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEOzs7Ozs7Ozs7OztBQ3RCQUEsTUFBTSxDQUFDQyxPQUFQLEdBQ0E7QUFDSUMsZUFBYSxFQUFHLG1EQURwQjtBQUVJQyxxQkFBbUIsRUFBRyx1RkFGMUI7QUFHSUMsa0JB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NEZBQVksQ0FBQyxNQUFELENBQVo7QUFDQW9FLGtDQUFZLENBQUNILGNBQUQsRUFBaUJqRyxPQUFqQixFQUEwQmtHLFNBQTFCLENBQVo7QUFDQXpCLDZCQUFPLENBQUMsS0FBRCxDQUFQO0FBQ0g7QUFDSixtQkE1Q0Q7O0FBNkNBN0QscUJBQUcsQ0FBQ2dFLE9BQUosR0FBYztBQUFBLDJCQUFNRixNQUFNLENBQUM5RCxHQUFHLENBQUNpRSxVQUFMLENBQVo7QUFBQSxtQkFBZDs7QUFDQWpFLHFCQUFHLENBQUM0QixJQUFKO0FBQ0g7QUFDSjtBQUNKLGFBdEVNLENBRmlCOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEdBQUg7O0FBQUEsa0JBQVozQyxZQUFZO0FBQUE7QUFBQTtBQUFBLEdBQWxCLEMsQ0EwRVA7O0FBQ0EsSUFBTXVHLFlBQVksR0FBRyxTQUFmQSxZQUFlLENBQUNILGNBQUQsRUFBaUJqRyxPQUFqQixFQUEwQmtHLFNBQTFCLEVBQ3JCO0FBQ0ksTUFBRyxDQUFDeEosMkRBQU8sQ0FBQ3NELE9BQUQsQ0FBWCxFQUNJRCxvRUFBVSxDQUFDLFNBQUQsRUFBWUMsT0FBWixDQUFWO0FBQ0osTUFBRyxDQUFDdEQsMkRBQU8sQ0FBQ3dKLFNBQUQsQ0FBWCxFQUNJbkcsb0VBQVUsQ0FBQyxLQUFELEVBQVFtRyxTQUFSLENBQVY7QUFDSixNQUFHLENBQUN4SiwyREFBTyxDQUFDdUosY0FBRCxDQUFYLEVBQ0kzRixNQUFNLENBQUNDLFFBQVAsQ0FBZ0JDLE1BQWhCLENBQXVCeUYsY0FBdkI7QUFDUCxDQVJELEMiLCJmaWxlIjoiLi9KUy9sb2dpbmxpbmsuYXBwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvbG9naW5saW5rLmpzXCIpO1xuIiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL2dlbmVyYWxcIjogXCIuLi9sYW5nL2ZyL2dlbmVyYWwuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9nZW5lcmFsJFwiOyIsInZhciBtYXAgPSB7XG5cdFwiLi9mci91c2VyXCI6IFwiLi4vbGFuZy9mci91c2VyLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvdXNlciRcIjsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgc2l0ZUhUTUxUaXRsZSA6IFwiV2lraUxlcm5pIDogcXUnYWxsZXotdm91cyBhcHByZW5kcmUgYXVqb3VyZCdodWkgP1wiLFxuICAgIHNpdGVNZXRhRGVzY3JpcHRpb24gOiBcIkNoYXF1ZSBqb3VyLCB0ZXN0ZXogdm9zIGNvbm5haXNzYW5jZXMgZXQgYXBwcmVuZXogZGUgbm91dmVsbGVzIGNob3NlcyBhdmVjIFdpa2lMZXJuaS5cIixcbiAgICBzY3JpcHRUaW1pbmdJbmZvIDogXCJEdXLDqWUgZGUgbGEgcsOpcG9uc2UgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNjcmlwdFRpbWluZ0FsZXJ0IDogXCIqKiogU2NyaXB0IGxlbnQgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNlcnZlckVycm9yIDogXCJEw6lzb2zDqS4gVW5lIGVycmV1ciBpbXByw6l2dWUgZXN0IHN1cnZlbnVlLiBTaSBjZWxhIHBlcnNpc3RlLCBuJ2jDqXNpdGV6IMOgIHByw6l2ZW5pciBsJ2FkbWluaXN0cmF0ZXVyIGR1IHNpdGUuXCIsXG4gICAgc2VydmVyRXJyb3JBZG1pbiA6IFwiQnVnIGRlIGwnYXBwbGljYXRpb24gOlwiLFxuICAgIG5lZWRlZFBhcmFtcyA6IFwiRGVzIHBhcmFtw6h0cmVzIG7DqWNlc3NhaXJlcyBtYW5xdWFudHMgc29udCBtYW5xdWFudHMuXCIsXG4gICAgYmFkVXJsIDogXCJUZW50YXRpdmUgZCdhY2PDqHMgw6AgdW5lIHBhZ2UgbidleGlzdGFudCBwYXMgOlwiLFxuICAgIG5vdFZhbGlkRm9ybWF0IDogXCJGb3JtYXQgbm9uIHZhbGlkZS5cIixcbiAgICBub3RBbGxvd2VkIDogXCJWb3VzIG4nYXZleiBwYXMgbGVzIGRyb2l0cyBuw6ljZXNzYWlyZXMgcG91ciBjZXR0ZSBhY3Rpb24uXCIsXG4gICAgbm90UmVxdWlyZWQgOiBcIkZhY3VsdGF0aWYuXCIsXG4gICAgdXBkYXRlQnRuVHh0OiBcIk1vZGlmaWVyXCIsXG4gICAgYWRkQnRuVHh0OiBcIkFqb3V0ZXJcIixcbiAgICBkZWxldGVCdG5UeHQ6IFwiU3VwcHJpbWVyXCIsXG4gICAgYWRkT2tNZXNzYWdlIDogXCJMZXMgZG9ubsOpZXMgb250IGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llcy5cIixcbiAgICB1cGRhdGVPa01lc3NhZ2UgOiBcIkxhIG1pc2Ugw6Agam91ciDDoCBqb3VyIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgZGVsZXRlT2tNZXNzYWdlIDogXCJMYSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIGZhaWxBdXRoIDogXCJFcnJldXIgZCdhdXRoZW50aWZpY2F0aW9uLlwiLFxuICAgIGZhaWxBdXRoSGVhZGVyIDogXCJBYnNlbmNlIGRlIGhlYWRlciBBdXRob3JpemF0aW9uLlwiLFxuICAgIGZhaWxBdXRoVG9rZW4gOiBcIlRva2VuIGludmFsaWRlIG91IHV0aWxpc2F0ZXVyIG5vbiB0cm91dsOpLlwiLFxuICAgIGZhaWxBdXRoSWQgOiBcIklkZW50aWZpYW50IG5vbiB2YWxpZGUgOiBcIixcbiAgICBmYWlsQXV0aENyb24gOiBcIlRlbnRhdGl2ZSBkZSBsYW5jZW1lbnQgZCd1biBjcm9uIHNhbnMgbGUgYm9uIHRva2VuLlwiLFxuICAgIHByZXZpb3VzUGFnZSA6IFwiUGFnZSBwcsOpY8OpZGVudGVcIixcbiAgICBuZXh0UGFnZSA6IFwiUGFnZSBzdWl2YW50ZVwiLFxuICAgIGJ0bkxpbmtUb1F1ZXN0aW9ubmFpcmUgOiBcIkFsbGVyIGF1IHF1aXogIVwiLFxuICAgIHN0YXRzQWRtaW4gOiBcIkR1cmFudCBsZXMgZGVybmnDqHJlcyAyNGggOiBOQl9VU0VSU18yNEggY29tcHRlcyBvbnQgw6l0w6kgY3LDqcOpcywgTkJfU1VCU0NSSVBUSU9OU18yNEggdmFsaWTDqXMgZXQgTkJfVVNFUlNfREVMRVRFRF8yNEggc3VwcHJpbcOpcy4gTkJfQU5TV0VSU18yNEggcsOpcG9uc2VzIGF1eCBxdWl6cyBvbnQgw6l0w6kgZW5yZWdpc3Ryw6llcy48YnI+RW4gdG91dCwgaWwgeSBhIDogTkJfVVNFUlNfVE9UIGNvbXB0ZXMsIGRvbnQgTkJfU1VCU0NSSVBUSU9OU19UT1QgdmFsaWTDqXMgZXQgTkJfU1VCU0NSSVBUSU9OU19QUkVNSVVNIGNvbXB0ZXMgcHLDqW1pdW0uIE5CX0FOU1dFUlNfVE9UIHLDqXBvbnNlcyBhdXggcXVpenMgb250IMOpdMOpIGVucmVnaXN0csOpZXMuPGJyPlBhcm1pIGxlcyBOQl9VU0VSU19ERUxFVEVEX1RPVCBjb21wdGVzIHN1cHByaW3DqXMsIE5CX1VTRVJTX0RFTEVURURfVkFMSURFRCBhdmFpZW50IHZhbGlkw6kgbGV1ciBjb21wdGUgZXQgTkJfVVNFUlNfREVMRVRFRF9QUkVNSVVNIGF2YWllbnQgc291c2NyaXQgdW4gY29tcHRlIHByw6ltaXVtLlwiXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBub3RGb3VuZDogXCJMJ3V0aWxpc2F0ZXVyIG4nYSBwYXMgw6l0w6kgdHJvdXbDqS5cIixcbiAgICBuZWVkTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyLlwiLFxuICAgIG5lZWROb3RUb29Mb25nTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyIG5lIGNvbXB0YW50IHBhcyBwbHVzIGRlIDcwIGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRFbWFpbDogXCJNZXJjaSBkZSBzYWlzaXIgdm90cmUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgbmVlZFVuaXF1ZUVtYWlsOiBcIkwnYWRyZXNzZSBlLW1haWwgcXVlIHZvdXMgYXZleiBzYWlzaWUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcGFyIHVuIGF1dHJlIHV0aWxpc2F0ZXVyLiBTaSB2b3VzIGF2ZXogZMOpasOgIHVuIGNvbXB0ZSwgPGEgaHJlZj0nLyNVUkwnPmNsaXF1ZXotaWNpIHBvdXIgdm91cyBjb25uZWN0ZXI8L2E+LlwiLFxuICAgIG5lZWROb3RUb29Mb25nRW1haWw6IFwiTWVyY2kgZGUgc2Fpc2lyIHVuZSBhZHJlc3NlIGUtbWFpbCBuZSBjb21wdGFudCBwYXMgcGx1cyBkZSAyNTUgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZFBhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZS5cIixcbiAgICBuZWVkTG9uZ1Bhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZSBkJ2F1IG1vaW5zIE1JTl9MRU5HVEggY2FyYWN0w6hyZXMuXCIsXG4gICAgcGFzc3dvcmRDb3BpZWQ6IFwiTGUgbW90IGRlIHBhc3NlIGfDqW7DqXLDqSBhIMOpdMOpIGNvcGnDqSBkYW5zIGxlIHByZXNzZS1wYXBpZXIuIFZvdXMgcG91dmV6IGxlIHJlY29waWVyIG/DuSB2b3VzIGxlIHNvdWhhaXRlci5cIixcbiAgICBuZWVkU3RhdHVzIDogXCJJbCBtYW5xdWUgbGUgc3RhdHV0LlwiLFxuICAgIG5lZWRMYW5ndWFnZSA6IFwiSWwgbWFucXVlIGxlIGNvZGUgbGFuZ3VlLlwiLFxuICAgIG5lZWRWYWxpZExhc3RDb25uZWN0aW9uRGF0ZSA6IFwiTGEgZGF0ZSBkZSBkZXJuacOocmUgY29ubmV4aW9uIG4nZXN0IHBhcyB2YWxpZGUuXCIsXG4gICAgbmVlZFNNVFAgOiBcIklsIG1hbnF1ZSBsZSBzZXJ2ZXVyIFNNVFAuXCIsXG4gICAgbmVlZFNNVFBOb3RGb3VuZCA6IFwiSWwgbWFucXVlIGxlIHNlcnZldXIgU01UUC5cIixcbiAgICBuZWVkS25vd05ld3NsZXR0ZXJPayA6IFwiSWwgZmF1dCBzYXZvaXIgc2kgbCd1dGlsaXNhdGV1ciBhY2NlcHRlIG91IHJlZnVzZSBkZSByZWNldm9pciBsYSBuZXdzbGV0dGVyLlwiLFxuICAgIG5lZWRUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBjb25uYcOudHJlIGxlIG5vbWJyZSBkZSBtaW51dGVzIGR1IGTDqWNhbGFnZSBob3JhaXJlLlwiLFxuICAgIG5lZWRNaW5UaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGVubGV2ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgNzIwLlwiLFxuICAgIG5lZWRNYXhUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGFqb3V0ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgODQwLlwiLFxuICAgIG5lZWRVR0NPayA6IFwiVm91cyBkZXZleiBhY2NlcHRlciBsZXMgQ0dVIHBvdXIgcG91dm9pciBjcsOpZXIgdm90cmUgY29tcHRlLiBcIixcbiAgICBnb2RmYXRoZXJOb3RGb3VuZDogXCJBdWN1biB1dGlsaXNhdGV1ciB2YWxpZGUgdHJvdXbDqSBwb3VyIGNlIGNvZGUgcGFycmFpbi5cIixcbiAgICBnb2RmYXRoZXJGb3VuZDogXCJWb3RyZSBwYXJyYWluIGEgYmllbiDDqXTDqSB0cm91dsOpICFcIixcbiAgICBtYWlsVmFsaWRhdGlvbk1lc3NhZ2U6IFwiVm90cmUgaW5zY3JpcHRpb24gZXN0IGJpZW4gZW5yZWdpc3Ryw6llLlxcblBvdXIgbGEgZmluYWxpc2VyLCBtZXJjaSBkZSBjbGlxdWVyIGRhbnMgbGVzIDI0SCBzdXIgbGUgbGllbiBkZSBjb25maXJtYXRpb24gcXVpIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBwYXIgZS1tYWlsLlwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1N1YmplY3QgOiBcIk1lcmNpIGRlIHZhbGlkZXIgdm90cmUgY29tcHRlXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblBvdXIgdmFsaWRlciB2b3RyZSBjb21wdGUsIG1lcmNpIGRlIGNsaXF1ZXIgc3VyIGxlIGxpZW4gc3VpdmFudCBkYW5zIGxlcyAyNGggOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm90cmUgY29tcHRlLCBtZXJjaSBkZSBjbGlxdWVyIHN1ciBsZSBsaWVuIHN1aXZhbnQgZGFucyBsZXMgMjRoLjwvcD48cD48YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+VmFsaWRlci48L2E+PC9wPlwiLFxuICAgIHZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGNvbXB0ZSB2aWVudCBiaWVuIGQnw6p0cmUgdmFsaWTDqS4gTWVyY2kgZXQgYmllbnZlbnVlICFcIixcbiAgICB2YWxpZGF0aW9uTWVzc2FnZUFkbWluOiBcIkxlIGNvbXB0ZSBhIGJpZW4gw6l0w6kgdmFsaWTDqS5cIixcbiAgICB2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2U6IFwiSWwgc2VtYmxlIHF1ZSB2b3VzIGF5ZXogZMOpasOgIHZhbGlkw6kgdm90cmUgY29tcHRlLlwiLFxuICAgIHZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZUFkbWluOiBcIkNlIGNvbXB0ZSBhIGTDqWrDoCDDqXTDqSB2YWxpZMOpLlwiLFxuICAgIG1haWxXZWxjb21lU3ViamVjdCA6IFwiQmllbnZlbnVlICFcIixcbiAgICBtYWlsV2VsY29tZUJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblZvdHJlIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuXFxuTWVyY2kgZXQgw6AgYmllbnTDtHQgIVwiLFxuICAgIG1haWxXZWxjb21lQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlZvdHJlIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuPC9wPjxwPk1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyU3ViamVjdCA6IFwiTWVyY2kgIVwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlckJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcbkdyw6JjZSDDoCB2b3VzIHVuIG5vdXZlbCB1dGlsaXNhdGV1ciAoRU1BSUwpIHZpZW50IGRlIHMnaW5zY3JpcmUgc3VyIE5PTV9TSVRFLlxcbk1lcmNpIGV0IMOgIGJpZW50w7R0ICFcIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+R3LDomNlIMOgIHZvdXMgdW4gbm91dmVsIHV0aWxpc2F0ZXVyIChFTUFJTCkgdmllbnQgZGUgcydpbnNjcmlyZSBzdXIgTk9NX1NJVEUuPC9wPjxwPk1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGxpZW4gZGUgY29uZmlybWF0aW9uIG5lIHNlbWJsZSBwYXMgdmFsaWRlIG91IGJpZW4gaWwgYSBleHBpcsOpLiBWb3VzIHBvdXZleiBlbiByZWNldm9pciB1biBub3V2ZWF1IDxhIGhyZWY9JyNVUkwnPmVuIGNsaXF1YW50IGljaTwvYT4uXCIsXG4gICAgZW1haWxOb3RGb3VuZDogXCJBdWN1biB1dGlsaXNhdGV1ciB0cm91dsOpIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgYWxyZWFkeUNvbm5lY3RlZDogXCJWb3VzIMOqdGVzIGTDqWrDoCBjb25uZWN0w6koZSkgYXUgc2l0ZSAhXCIsXG4gICAgbmVlZEJlQ29ubmVjdGVkOiBcIlZvdXMgZGV2ZXogw6p0cmUgY29ubmVjdMOpKGUpIHBvdXIgYWNjw6lkZXIgw6AgY2V0dGUgcGFnZS5cIixcbiAgICBjb25uZWN0aW9uT2s6IFwiQ29ubmV4aW9uIHLDqXVzc2llLlwiLFxuICAgIG5lZWRDaG9vc2VMb2dpbldheTogXCJWb3VzIGRldmV6IHNvaXQgc2Fpc2lyIHZvdHJlIG1vdCBkZSBwYXNzZSwgc29pdCBjb2NoZXIgbGEgY2FzZSB2b3VzIHBlcm1ldHRhbnQgZGUgcmVjZXZvaXIgdW4gbGllbiBkZSBjb25uZXhpb24gcGFyIGUtbWFpbC5cIixcbiAgICBuZWVkVmFsaWRhdGlvblRvTG9naW4gOiBcIlZvdXMgZGV2ZXogZCdhYm9yZCB2YWxpZGVyIHZvdHJlIGNvbXB0ZSBhdmFudCBkZSB2b3VzIGNvbm5lY3Rlci4gUG91ciBjZSBmYWlyZSwgdW4gbGllbiB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbC5cIixcbiAgICB0b29NYW55TG9naW5GYWlscyA6IFwiVHJvcCBkZSB0ZW50YXRpdmVzIGRlIGNvbm5leGlvbiBpbmZydWN0dWV1c2VzIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuIFZvdXMgZGV2ZXogYXR0ZW5kcmUgTUlOVVRFUyBtaW51dGVzIHBvdXIgZXNzYXllciBkZSBub3V2ZWF1LlwiLFxuICAgIGJhZFBhc3N3b3JkOiBcIkxlIG1vdCBkZSBwYXNzZSBuJ2VzdCBwYXMgbGUgYm9uLlwiLFxuICAgIG1haWxMb2dpbkxpbmtTdWJqZWN0IDogXCJWb3RyZSBsaWVuIGRlIGNvbm5leGlvbi5cIixcbiAgICBtYWlsTG9naW5MaW5rQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuUG91ciB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6IExJTktfVVJMXCIsXG4gICAgbWFpbExvZ2luTGlua0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZvdXMgY29ubmVjdGVyIMOgIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDo8L3A+PHA+PGEgaHJlZj1cXFwiTElOS19VUkxcXFwiPlZhbGlkZXIuPC9hPjwvcD5cIixcbiAgICBtYWlsTG9naW5MaW5rTWVzc2FnZSA6IFwiVW4gbGllbiBkZSBjb25uZXhpb24gdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHN1ciB2b3RyZSBhZHJlc3NlIGUtbWFpbC4gTmUgdGFyZGV6IHBhcyDDoCBsJ3V0aWxpc2VyLCBjYXIgaWwgbidlc3QgdmFsYWJsZSBxdWUgZHVyYW50IFwiLFxuICAgIHVwZGF0ZWRPa01lc3NhZ2U6IFwiVm9zIGluZm9ybWF0aW9ucyBvbnQgYmllbiDDqXTDqSBtaXNlcyDDoCBqb3VyLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEVtYWlsIDogXCJNYWlzIGxhIG5vdXZlbGxlIGFkcmVzc2UgZS1tYWlsIG4nYSBwdSDDqnRyZSBlbnJlZ2lzdHLDqWUgY2FyIGVsbGUgbidhIHBhcyB1bmUgZm9ybWF0IGNvcnJlY3QuXCIsXG4gICAgdXBkYXRlZE5lZWRVbmlxdWVFbWFpbCA6IFwiTWFpcyBsYSBub3V2ZWxsZSBhZHJlc3NlIGUtbWFpbCBzYWlzaWUgKE5FV19FTUFJTCkgbidhIHB1IMOqdHJlIGVucmVnaXN0csOpZSwgY2FyIGVsbGUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcG91ciB1biBhdXRyZSBjb21wdGUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luU3ViamVjdCA6IFwiTWVyY2kgZGUgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblBvdXIgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cyBkZSBjb25uZXhpb24sIDxhIGhyZWY9XFxcIkxJTktfVVJMXFxcIj5jbGlxdWV6IGljaTwvYT4gc2FucyB0YXJkZXIuPC9wPlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkxpbmtNZXNzYWdlOiBcIkNlcGVuZGFudCwgdm91cyBhdmV6IG1vZGlmacOpIGF1IG1vaW5zIHVuIGRlIHZvcyBpZGVudGlmaWFudHMgZGUgY29ubmV4aW9uIChlbWFpbCBldC9vdSBtb3QgZGUgcGFzc2UpIGV0IDxiPnZvdXMgZGV2ZXogY2xpcXVlciBzdXIgbGUgbGllbiBxdWkgdmllbnQgZGUgdm91cyDDqnRyZXMgZW52b3nDqSBzdXIgdm90cmUgYWRyZXNzZSAoTkVXX0VNQUlMKSBwb3VyIHZhbGlkZXIgY2UgY2hhbmdlbWVudDwvYj4uIEVuIGF0dGVuZGFudCwgbWVyY2kgZGUgY29udGludWVyIMOgIHV0aWxpc2VyIHZvcyBhbmNpZW5zIGlkZW50aWZpYW50cy5cIixcbiAgICB1cGRhdGVkTmVlZFZhbGlkYXRlZFVzZXI6IFwiTCd1dGlsaXNhdGV1ciBxdWUgdm91cyBzb3VoYWl0w6kgbW9kaWZpZXIgbidleGlzdGUgcGFzL3BsdXMgb3UgbidhIHBhcyBlbmNvcmUgdmFsaWTDqSBzb24gY29tcHRlLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEdvZGZhdGhlciA6IFwiTWFpcyBsZSBub3V2ZWF1IGNvZGUgcGFycmFpbiBuJ2EgcHUgw6p0cmUgcmV0ZW51LCBjYXIgaWwgbmUgY29ycmVzcG9uZCDDoCBhdWN1biBjb21wdGUgdXRpbGlzYXRldXIgb3Ugw6AgbCd1dGlsaXNhdGV1ciBsdWktbcOqbWUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luT2tNZXNzYWdlOiBcIkxhIG1pc2Ugw6Agam91ciBkZSB2b3MgaWRlbnRpZmlhbnRzIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgdXBkYXRlZEZhaWxlZEdvZGZhdGhlck5vdEZvdW5kIDogXCJMJ2lkZW50aWZpYW50IGZvdXJuaSBwb3VyIGxlIHBhcnJhaW4gbmUgY29ycmVzcG9uZCDDoCBhdWN1biB1dGlsaXNhdGV1ci5cIixcbiAgICBjcmVhdGlvbk9rTWVzc2FnZTogXCJMZSBub3V2ZWwgdXRpbGlzYXRldXIgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpLlwiLFxuICAgIG1haWxEZWxldGVTdWJqZWN0IDogXCJDb25maXJtZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLlwiLFxuICAgIG1haWxEZWxldGVCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5Qb3VyIHZhbGlkZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbERlbGV0ZUJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCA8YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+Y2xpcXVleiBpY2k8L2E+IHNhbnMgdGFyZGVyLjwvcD5cIixcbiAgICBtYWlsRGVsZXRlTGlua01lc3NhZ2U6IFwiVm90cmUgZGVtYW5kZSBkZSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLiBNZXJjaSBkZSBjbGlxdWVyIHNhbnMgdGFyZGVyIHN1ciBsZSBsaWVuIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbCBwb3VyIGNvbmZpcm1lci5cIixcbiAgICBkZWxldGVPa01lc3NhZ2U6IFwiTCd1dGlsaXNhdGV1ciBhIGJpZW4gw6l0w6kgc3VwcHJpbcOpLlwiLFxuICAgIGRlbGV0ZUZhaWxNZXNzYWdlOiBcIlRlbnRhdGl2ZSBkZSBzdXBwcmVzc2lvbiBkJ3VuIHV0aWxpc2F0ZXVyIGluZXhpc3RhbnQgOiBcIixcbiAgICBtYWlsRGVsZXRlTGlua09rTWVzc2FnZTogXCJWb3RyZSBjb21wdGUgYSBiaWVuIMOpdMOpIHN1cHByaW3DqS4gTWVyY2kgZCdhdm9pciB1dGlsaXPDqSBub3Mgc2VydmljZXMuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtBbHJlYWR5TWVzc2FnZTogXCJJbCBzZW1ibGUgcXVlIHZvdXMgYXlleiBkw6lqw6AgdmFsaWTDqSBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtGYWlsTWVzc2FnZTogXCJWb3RyZSBsaWVuIGRlIHN1cHByZXNzaW9uIG4nZXN0IHBhcyB2YWxpZGUgb3UgYWxvcnMgaWwgbidlc3QgcGx1cyB2YWxhYmxlLlwiLFxuICAgIGNyb25EZWxldGVVbnZhbGlkZWRVc2Vyc01lc3NhZ2U6IFwiIGNvbXB0ZXMgdXRpbGlzYXRldXJzIG5vbiB2YWxpZMOpcyBvbnQgw6l0w6kgc3VwcHJpbcOpcy5cIixcbiAgICBkZWxldGVJbmFjdGl2ZVVzZXJzTWVzc2FnZTogXCIgY29tcHRlcyB1dGlsaXNhdGV1cnMgaW5hY3RpZnMgb250IMOpdMOpIHN1cHByaW3DqXMuXCIsXG4gICAgd2VsY29tZU1lc3NhZ2U6IFwiQmllbnZlbnVlICNOQU1FICFcIixcbiAgICBieWVieWVNZXNzYWdlOiBcIlNpIHZvdXMgdm95ZXogY2UgbWVzc2FnZSwgYydlc3QgcXVlIHZvdHJlIGTDqWNvbm5leGlvbiBzJ2VzdCBiaWVuIGTDqXJvdWzDqWUuPGJyPsOAIGJpZW50w7R0ICFcIixcbiAgICBpbmZvc1VzZXJGb3JBZG1pbjogXCJDZXQgdXRpbGlzYXRldXIgKGlkOiBJRF9VU0VSKSBhIDxiPmNyw6nDqSBzb24gY29tcHRlIGxlIERBVEVfQ1JFQTwvYj4sIGxhIGRlcm5pw6hyZSBtaXNlIMOgIGpvdXIgZGF0YW50IGR1IERBVEVfVVBEQVRFLjxicj48Yj5EYXRlIGRlIHNhIGRlcm5pw6hyZSBjb25uZXhpb24gOiBEQVRFX0NPTk5FQ1RJT04uPC9iPlwiLFxuICAgIGluZm9zQWRtaW5Hb2RmYXRoZXI6IFwiQ2V0IHV0aWxpc2F0ZXVyIGEgw6l0w6kgcGFycmFpbsOpIHBhciBcIixcbiAgICBpbmZvc0FkbWluTmJHb2RDaGlsZHM6IFwiU2VzICNOQiBmaWxsZXVpbHMgOiBcIlxufTsiLCIvLyBRdWVscXVlcyBmb25jdGlvbnMgdXRpbGVzIHBvdXIgbGVzIGNoYcOubmVzXG5cbmNsYXNzIFRvb2xcbntcbiAgICBzdGF0aWMgaXNFbXB0eShteVZhcilcbiAgICB7XG4gICAgICAgIGlmKG15VmFyPT09dW5kZWZpbmVkIHx8IG15VmFyPT09bnVsbClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIG15VmFyKz1cIlwiOy8vIHNpIGF1dHJlIGNob3NlIHF1J3VuZSBjaGHDrm5lIGVudm95w6kuLi5cbiAgICAgICAgICAgIG15VmFyPW15VmFyLnRyaW0oKTtcbiAgICAgICAgICAgIGlmKG15VmFyPT09XCJcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgc3RhdGljIHRyaW1JZk5vdE51bGwobXlTdHJpbmcpXG4gICAge1xuICAgICAgICBpZihUb29sLmlzRW1wdHkobXlTdHJpbmcpKVxuICAgICAgICAgICAgbXlTdHJpbmc9bnVsbDtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVN0cmluZys9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVN0cmluZz1teVN0cmluZy50cmltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG15U3RyaW5nO1xuICAgIH1cblxuXG4gICAgc3RhdGljIHNob3J0ZW5JZkxvbmdlclRoYW4obXlTdHJpbmcsIG1heClcbiAgICB7XG4gICAgICAgIG15U3RyaW5nKz1cIlwiOy8vIGF1IGNhcyBvw7kgY2VsYSBuZSBzZXJhaXQgcGFzIHVuZSBjaGHDrm5lLi4uXG4gICAgICAgaWYobXlTdHJpbmcubGVuZ3RoID4gbWF4KVxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcuc3Vic3RyaW5nKDAsIChtYXgtMykpK1wiLi4uXCI7XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cbiAgICAvLyBzb3VyY2UgOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNTYwNDE0MC9yZXBsYWNlLW11bHRpcGxlLXN0cmluZ3Mtd2l0aC1tdWx0aXBsZS1vdGhlci1zdHJpbmdzXG4gICAgc3RhdGljIHJlcGxhY2VBbGwobXlTdHJpbmcsIG1hcE9iailcbiAgICB7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VFbHRzID0gbmV3IFJlZ0V4cChPYmplY3Qua2V5cyhtYXBPYmopLmpvaW4oXCJ8XCIpLFwiZ2lcIik7XG4gICAgICAgIHJldHVybiBteVN0cmluZy5yZXBsYWNlKHJlcGxhY2VFbHRzLCAobWF0Y2hlZCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG1hcE9ialttYXRjaGVkXTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZnIvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT2JqZXRzX2dsb2JhdXgvTWF0aC9yYW5kb21cbiAgICBzdGF0aWMgZ2V0UmFuZG9tSW50KG1pbiwgbWF4KVxuICAgIHtcbiAgICAgICAgbWluID0gTWF0aC5jZWlsKG1pbik7XG4gICAgICAgIG1heCA9IE1hdGguZmxvb3IobWF4KTtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pKSArIG1pbjtcbiAgICB9XG5cbiAgICAvLyDDoCBjb21wbMOpdGVyIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGF0ZV9mb3JtYXRfYnlfY291bnRyeVxuICAgIHN0YXRpYyBkYXRlRm9ybWF0KGRhdGVTdHJpbmcsIGxhbmc9XCJmclwiKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KGRhdGVTdHJpbmcpKVxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIGxldCBteURhdGU9bmV3IERhdGUoZGF0ZVN0cmluZyk7XG4gICAgICAgIGxldCBteURheT1teURhdGUuZ2V0RGF0ZSgpK1wiXCI7XG4gICAgICAgIGlmKG15RGF5Lmxlbmd0aD09PTEpXG4gICAgICAgICAgICBteURheT1cIjBcIitteURheTtcbiAgICAgICAgbGV0IG15TW91bnRoPShteURhdGUuZ2V0TW9udGgoKSsxKStcIlwiO1xuICAgICAgICBpZihteU1vdW50aC5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlNb3VudGg9XCIwXCIrbXlNb3VudGg7XG4gICAgICAgIGxldCBteVllYXI9bXlEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGlmKGxhbmc9PT1cImZyXCIpXG4gICAgICAgICAgICByZXR1cm4gbXlEYXkrXCIvXCIrbXlNb3VudGgrXCIvXCIrbXlZZWFyO1xuICAgICAgICBlbHNlIGlmIChsYW5nPT09XCJmb3JtXCIpLy8gMjAxNC0wMi0wOVxuICAgICAgICAgICAgcmV0dXJuIG15WWVhcitcIi1cIitteU1vdW50aCtcIi1cIitteURheTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG15TW91bnRoK1wiL1wiK215RGF5K1wiL1wiK215WWVhcjtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVG9vbDsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgYXBpVXJsIDogXCJodHRwOi8vbG9jYWxob3N0OjMwMDAvYXBpXCIsXG4gICAgdXNlcnNHZXRDb25maWdVcmwgOiBcIi91c2VyL2dldGNvbmZpZ1wiLFxuICAgIGxhbmcgOiBcImZyXCIsXG4gICAgdXNlckhvbWVQYWdlIDogXCJhY2N1ZWlsLmh0bWxcIixcbiAgICBhZG1pbkhvbWVQYWdlIDogXCJhZG1pbi5odG1sXCIsXG4gICAgbWFuYWdlckhvbWVQYWdlIDogXCJnZXN0aW9uLmh0bWxcIixcbiAgICBzdWJzY3JpYmVQYWdlIDogXCJpbnNjcmlwdGlvbi5odG1sXCIsXG4gICAgY29ubmVjdGlvblBhZ2UgOiBcImNvbm5leGlvbi5odG1sXCIsXG4gICAgYWNjb3VudFBhZ2U6IFwiY29tcHRlLmh0bWxcIixcbiAgICBxdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlOiBcImdlc3Rpb24tcXVpenMuaHRtbFwiLFxuICAgIHVzZXJzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi11dGlsaXNhdGV1cnMuaHRtbFwiLFxuICAgIG5iUXVlc3Rpb25uYWlyZXNVc2VySG9tZVBhZ2UgOiAxMCxcbiAgICBpbGx1c3RyYXRpb25EaXIgOiBcIi9pbWcvcXVpenMvXCJcbn07XG4vLyDDoCB0ZXJtZSBmdXNpb25uZXIgYXZlYyBsZXMgZMOpY2xhcmF0aW9ucyBiYWNrZW5kIGNvbmNlcm5hbnQgbGUgZnJvbnQsIHRvdXQgw6l0YW50IHNhaXNpIGRhbnMgbCdhZG1pbiIsIi8vIC0tIEdFU1RJT04gREUgTEEgUEFHRSBQRVJNRVRUQU5UIERFIFRFU1RFUiBVTiBMSUVOIERFIENPTk5FWElPTiBSRcOHVSBQQVIgRS1NQUlMXG5cbi8vLyBVbiB0b2tlbiBlc3QgdHJhbnNtaXMgZW4gcGFyYW3DqHRyZSBkZSBsJ1VybC4gSWwgYSB1bmUgdmFsaWRpdMOpIGxpbWl0w6kgZGFucyBsZSB0ZW1wcy5cbi8vLyBEYW5zIGNlIGNhcywgb24gcGV1dCByZWRpcmlnZXIgbCd1dGlsaXNhdGV1ciB2ZXJzIGxhIHBhZ2UgZGUgY29ubmV4aW9uIHBvdXIgb2J0ZW5pciB1biBub3V2ZWF1IGxpZW4gZGUgdmFsaWRhdGlvblxuLy8vIFNpIGxlIHRva2VuIGVzdCBvaywgb24gY3LDqWUgdW5lIHNlc3Npb24gc3VpdmFudCBsYSBkdXLDqWUgcmV0b3VybsOpZSBwYXIgbCdBUEkgZXQgcmVkaXJpZ2UgbCd1dGlsaXNhdGV1ciB2ZXJzIHNhIHBhZ2UgZCdhY2N1ZWlsXG4vLy8gVW4gcsOpc3VsdGF0IGRlIHF1aXogcGV1dCBhdXNzaSBhdm9pciDDqXTDqSBlbnJlZ2lzdHLDqSBjw7R0w6kgY2xpZW50IGV0IGVzdCBhbG9ycyDDoCB0cmFuc21ldHRyZSDDoCBsJ0FQSVxuLy8vIFNpIGwndXRpbGlzYXRldXIgYSBkw6lqw6AgdW5lIHNlc3Npb24gYWN0aXZlIHZhbGlkZSwgYydlc3QgcXUnaWwgYSBkw6lqw6AgY2xpcXXDqSBzdXIgbGUgbGllbi4gT24gbGUgcmVkaXJpZ2Ugw6lnYWxlbWVudCB2ZXJzIHNhIHBhZ2UgZCdhY2N1ZWlsLlxuXG4vLyBGaWNoaWVyIGRlIGNvbmZpZ3VyYXRpb24gY8O0dMOpIGNsaWVudCA6XG5jb25zdCBjb25maWdGcm9udEVuZCA9IHJlcXVpcmUoXCIuL2NvbmZpZy9nZW5lcmFsXCIpO1xuXG4vLyBJbXBvcnRhdGlvbiBkZXMgZm9uY3Rpb25zIHV0aWxlIGF1IHNjcmlwdCA6XG5pbXBvcnQgeyBnZXRMb2NhbHksIHJlbW92ZUxvY2FseSwgc2F2ZUxvY2FseSB9IGZyb20gXCIuL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanNcIjtcbmltcG9ydCB7IGFkZEVsZW1lbnQgfSBmcm9tIFwiLi90b29scy9kb20uanNcIjtcbmltcG9ydCB7IGhlbGxvRGV2IH0gZnJvbSBcIi4vdG9vbHMvZXZlcnl3aGVyZS5qc1wiO1xuaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi90b29scy9tYWluXCI7XG5pbXBvcnQgeyBnZXRVcmxQYXJhbXMgfSBmcm9tIFwiLi90b29scy91cmwuanNcIjtcbmltcG9ydCB7IGNoZWNrQW5zd2VyRGF0YXMsIGNoZWNrU2Vzc2lvbiwgZ2V0Q29uZmlnLCBnZXRUaW1lRGlmZmVyZW5jZSwgc2V0U2Vzc2lvbiB9IGZyb20gXCIuL3Rvb2xzL3VzZXJzLmpzXCI7XG5cbi8vIERpY3Rpb25uYWlyZXMgOlxuY29uc3QgdHh0ID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrY29uZmlnRnJvbnRFbmQubGFuZytcIi9nZW5lcmFsXCIpO1xuY29uc3QgdHh0VXNlcnMgPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitjb25maWdGcm9udEVuZC5sYW5nK1wiL3VzZXJcIik7XG5cbmNvbnN0IGRpdlJlc3BvbnNlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJyZXNwb25zZVwiKTtcblxuaGVsbG9EZXYoKTtcblxubGV0IGNvbmZpZztcbmNvbnN0IGluaXRpYWxpc2UgPSBhc3luYyAoKSA9Plxue1xuICAgIHRyeVxuICAgIHtcbiAgICAgICAgY29uZmlnID0gYXdhaXQgZ2V0Q29uZmlnKCk7XG4gICAgICAgIGlmKCFjb25maWcpXG4gICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgdHh0LnNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gc2kgbCd1dGlsaXNhdGV1ciBlc3QgZMOpasOgIGNvbm5lY3TDqSwgcGFzIGxhIHBlaW5lIGQnYWxsZXIgKyBsb2luIDpcbiAgICAgICAgICAgIGNvbnN0IGlzQ29ubmVjdGVkPWF3YWl0IGNoZWNrU2Vzc2lvbihjb25maWcpO1xuICAgICAgICAgICAgaWYoaXNDb25uZWN0ZWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2F2ZUxvY2FseShcIm1lc3NhZ2VcIiwgeyBtZXNzYWdlOiB0eHRVc2Vycy5hbHJlYWR5Q29ubmVjdGVkLCBjb2xvcjpcImluZm9ybWF0aW9uXCIgfSk7Ly8gcG91ciBsJ2FmZmljaGVyIHN1ciBsYSBwYWdlIHN1aXZhbnRlXG4gICAgICAgICAgICAgICAgY29uc3QgdXNlcj1nZXRMb2NhbHkoXCJ1c2VyXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvbWVQYWdlPXVzZXIuc3RhdHVzK1wiSG9tZVBhZ2VcIjtcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKFwiL1wiK2NvbmZpZ0Zyb250RW5kW2hvbWVQYWdlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGV0IGRhdGFzPWdldFVybFBhcmFtcygpO1xuICAgICAgICAgICAgICAgIGlmKGRhdGFzICYmIGRhdGFzLnQhPT11bmRlZmluZWQpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyLm9wZW4oXCJQT1NUXCIsIGNvbmZpZ0Zyb250RW5kLmFwaVVybCtjb25maWcudXNlclJvdXRlcytjb25maWcuY29ubmVjdGlvbldpdGhMaW5rUm91dGUpO1xuICAgICAgICAgICAgICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UodGhpcy5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gMjAwICYmICFpc0VtcHR5KHJlc3BvbnNlLnVzZXJJZCkgJiYgIWlzRW1wdHkocmVzcG9uc2UuY29ubmV4aW9uVGltZSkgJiYgIWlzRW1wdHkocmVzcG9uc2UudG9rZW4pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbm5leGlvbk1heFRpbWU9RGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2UuY29ubmV4aW9uVGltZS5lbmRzV2l0aChcImRheXNcIikpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZXhpb25NYXhUaW1lKz1wYXJzZUludChyZXNwb25zZS5jb25uZXhpb25UaW1lLDEwKSoyNCozNjAwKjEwMDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5leGlvbk1heFRpbWUrPXBhcnNlSW50KHJlc3BvbnNlLmNvbm5leGlvblRpbWUsMTApKjM2MDAqMTAwMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2Vzc2lvbihyZXNwb25zZS51c2VySWQsIHJlc3BvbnNlLnRva2VuLCBjb25uZXhpb25NYXhUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwibGFzdEFuc3dlclwiKTsvLyAhIGltcG9ydGFudCBwb3VyIG5lIHBhcyBlbnJlZ2lzdGVyIHBsdXNpZXVycyBmb2lzIGxlIHLDqXN1bHRhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHR4dFVzZXJzLnZhbGlkYXRpb25NZXNzYWdlLCBcIlwiLCBbXCJzdWNjZXNzXCJdKTsvLyBhdSBjYXMgb8O5IGJsb2NhZ2UgcmVkaXJlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIi9cIitjb25maWdGcm9udEVuZC51c2VySG9tZVBhZ2UpOy8vIGNvbm5leGlvbiBwYXIgbGllbiBuZSBjb25jZXJuZSBxdWUgbGVzIHNpbXBsZXMgXCJ1c2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKHRoaXMuc3RhdHVzID09PSA0MDEgfHwgdGhpcy5zdGF0dXMgPT09IDQwMykgJiYgcmVzcG9uc2UuZXJyb3JzICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihBcnJheS5pc0FycmF5KHJlc3BvbnNlLmVycm9ycykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvcnMgPSByZXNwb25zZS5lcnJvcnMuam9pbihcIjxicj5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVycm9ycyA9IHR4dC5zZXJ2ZXJFcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHJlc3BvbnNlLmVycm9ycywgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHRVc2Vycy5iYWRMaW5rVmFsaWRhdGlvbk1lc3NhZ2UucmVwbGFjZShcIiNVUkxcIiwgY29uZmlnRnJvbnRFbmQuY29ubmVjdGlvblBhZ2UpLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGF0YXMudGltZURpZmZlcmVuY2U9Z2V0VGltZURpZmZlcmVuY2UoY29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2kgbCd1dGlsaXNhdGV1ciBhIHByw6ljw6lkZW1lbnQgcsOpcG9uZHUgw6AgdW4gcXVpeiwgaidham91dGUgbGVzIGluZm9zIGRlIHNvbiByw6lzdWx0YXQgOlxuICAgICAgICAgICAgICAgICAgICBkYXRhcz1jaGVja0Fuc3dlckRhdGFzKGRhdGFzKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuICAgICAgICAgICAgICAgICAgICB4aHIuc2VuZChKU09OLnN0cmluZ2lmeShkYXRhcykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaChlKVxuICAgIHtcbiAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgIH1cbn1cbmluaXRpYWxpc2UoKTsiLCIvLyBGT05DVElPTlMgVVRJTEVTIEFVIFNUT0NLQUdFIExPQ0FMIChTRVNTSU9OLCBDT09LSUVTLCBJTkRFWERCLCBFVEMuKVxuLy8gUmV2ZW5pciBwb3VyIGfDqXJlciBsZSBjYXMgb8O5IGxvY2FsLnN0b3JhZ2Ugbidlc3QgcGFzIGNvbm51IHBvdXIgdXRpbGlzZXIgY29va2llXG4gICAgXG5leHBvcnQgY29uc3Qgc2F2ZUxvY2FseSA9IChuYW1lLCBkYXRhKSA9Plxue1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKG5hbWUsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldExvY2FseSA9IChuYW1lLCBqc29uPWZhbHNlKSA9Plxue1xuICAgIGlmKGpzb24pXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKG5hbWUpKTtcbiAgICBlbHNlXG4gICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJlbW92ZUxvY2FseSA9IChuYW1lKSA9Plxue1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKG5hbWUpO1xufSIsImltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG4vLyBGb25jdGlvbiBhc3NvY2lhbnQgbGVzIGF0dHJpYnV0cyBmb3VybmlzIMOgIHVuIGNoYW1wIGRlIGZvcm11bGFpcmVcbmV4cG9ydCBjb25zdCBhZGRFbGVtZW50ID0gKGVsdFBhcmVudCwgZWx0VHlwZSwgZWx0Q29udGVudD1cIlwiLCBlbHRJZD1cIlwiLCBlbHRDbGFzcz1bXSwgZWx0QXR0cmlidXRlcz17fSwgcmVwbGFjZT10cnVlKSA9Plxue1xuICAgIGlmKGlzRW1wdHkoZWx0VHlwZSkgfHwgaXNFbXB0eShlbHRQYXJlbnQpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZWxzZVxuICAgIHtcbiAgICAgICAgY29uc3QgbmV3RWxlbWVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGVsdFR5cGUpO1xuICAgICAgICBcbiAgICAgICAgaWYoIWlzRW1wdHkoZWx0SWQpKS8vIHRlc3RlciBzaSBsJ2lkIG4nZXN0IHBhcyBkw6lqw6AgdXRpbGlzw6kgZGFucyBsZSBET00gP1xuICAgICAgICAgICAgbmV3RWxlbWVudC5pZD1lbHRJZDtcblxuICAgICAgICBpZihBcnJheS5pc0FycmF5KGVsdENsYXNzKSAmJiBlbHRDbGFzcy5sZW5ndGghPTApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGZvcihsZXQgaSBpbiBlbHRDbGFzcylcbiAgICAgICAgICAgICAgICBuZXdFbGVtZW50LmNsYXNzTGlzdC5hZGQoZWx0Q2xhc3NbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYodHlwZW9mIGVsdEF0dHJpYnV0ZXMgPT09IFwib2JqZWN0XCIpIC8vICEhIHRvdXMgbGVzIG9iamV0cyBuZSBzb250IHBhcyBva1xuICAgICAgICB7XG4gICAgICAgICAgICBmb3IobGV0IGF0dHJpYnV0TmFtZSBpbiBlbHRBdHRyaWJ1dGVzKVxuICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0TmFtZSwgZWx0QXR0cmlidXRlc1thdHRyaWJ1dE5hbWVdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFpc0VtcHR5KGVsdENvbnRlbnQpKVxuICAgICAgICAgICAgbmV3RWxlbWVudC5pbm5lckhUTUw9ZWx0Q29udGVudC5yZXBsYWNlKC9cXG4vZyxcIjxicj5cIik7Ly8gaW5uZXJIVE1MIHBlcm1ldCBkJ2Fqb3V0ZXIgZHUgdGV4dGUgYXlhbnQgbHVpLW3Dqm1lIGRlcyBiYWxpc2VzLCBldGMuXG4gICAgICAgICAgICBcbiAgICAgICAgaWYocmVwbGFjZSlcbiAgICAgICAgICAgIGVsdFBhcmVudC5pbm5lckhUTUw9XCJcIjtcbiAgICAgICAgZWx0UGFyZW50LmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpO1xuICAgIH0gICAgXG59IiwiLy8gQ2Ugc2NyaXB0IGZvdXJuaXQgZGVzIGZvbmN0aW9ucyB1dGlsaXPDqWVzIHN1ciB0b3V0ZXMgbGVzIHBhZ2VzIGR1IHNpdGVcblxuZXhwb3J0IGNvbnN0IGhlbGxvRGV2ID0gKCkgPT5cbntcbiAgICBjb25zb2xlLmxvZyhcIioqKiogSGVsbG8gYW1pIGTDqXZlbG9wcGV1ciA6LSlcXG4gTGUgY29kZSBkZSBXaWtpTGVybmkgZXN0IGxpYnJlIGV0IGVzdCBsaXNpYmxlIHN1ciBnaXRsYWIgOiBcXG4gQm9ubmUgbGVjdHVyZSA6LSkgXFxuIFBvdXIgbGVzIHN1Z2dlc3Rpb25zIGQnYW3DqWxpb3JhdGlvbiBvdSBxdWVzdGlvbnMgOiBkZXZAd2lsaWxlcm5pLmNvbSAqKioqXCIpO1xuICAgIHJldHVybiB0cnVlO1xufSIsImltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG4vLyBGb25jdGlvbiByw6ljdXDDqXJhbnQgbGVzIHBhcmFtw6h0cmVzIHBhc3PDqXMgcGFyIGwndXJsXG5leHBvcnQgY29uc3QgZ2V0VXJsUGFyYW1zID0gKCkgPT5cbntcbiAgICBpZihpc0VtcHR5KGxvY2F0aW9uLnNlYXJjaCkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBsb2NhdGlvbi5zZWFyY2guc3Vic3RyaW5nKDEpLnNwbGl0KFwiJlwiKTtcbiAgICBpZighQXJyYXkuaXNBcnJheShwYXJhbWV0ZXJzKSB8fCBwYXJhbWV0ZXJzLmxlbmd0aD09PTApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgXG4gICAgbGV0IHBhcmFtLCBkYXRhcz17fTtcbiAgICBmb3IobGV0IGkgaW4gcGFyYW1ldGVycylcbiAgICB7XG4gICAgICAgIHBhcmFtID0gcGFyYW1ldGVyc1tpXS5zcGxpdChcIj1cIik7XG4gICAgICAgIGlmKHBhcmFtLmxlbmd0aD09PTIpXG4gICAgICAgICAgICBkYXRhc1twYXJhbVswXV09ZGVjb2RlVVJJKHBhcmFtWzFdKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGFzO1xufSIsImNvbnN0IGNvbmZpZ0Zyb250RW5kID0gcmVxdWlyZShcIi4uL2NvbmZpZy9nZW5lcmFsXCIpO1xuXG5pbXBvcnQgeyBnZXRMb2NhbHksIHJlbW92ZUxvY2FseSwgc2F2ZUxvY2FseSB9IGZyb20gXCIuL2NsaWVudHN0b3JhZ2UuanNcIjtcbmltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG4vLyBSw6ljdXDDqHJlIGxlcyBkb25uw6llcyBkZSBjb25maWd1cmF0aW9uIGRlcyB1dGlsaXNhdGV1cnNcbi8vIMOAIHRlcm1lLCB1biBmaWNoaWVyIHN0YXRpcXVlIGltcG9ydGFibGUgY29tbWUgbW9kdWxlIGRldnJhaXQgw6l2aXRlciB1bmUgcmVxdcOqdGUgYWpheFxuZXhwb3J0IGNvbnN0IGdldENvbmZpZyA9ICBhc3luYyAoKSA9Plxue1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuICAgIHtcbiAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHhoci5vcGVuKFwiR0VUXCIsIGNvbmZpZ0Zyb250RW5kLmFwaVVybCtjb25maWdGcm9udEVuZC51c2Vyc0dldENvbmZpZ1VybCk7XG4gICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCkpO1xuICAgICAgICB4aHIub25lcnJvciA9ICgpID0+IHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICAgIHhoci5zZW5kKCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRUaW1lRGlmZmVyZW5jZSA9IChjb25maWcpID0+XG57XG4gICAgY29uc3QgdGltZUxvY2FsPW5ldyBEYXRlKCkuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICBpZih0aW1lTG9jYWwgPiBjb25maWcudGltZURpZmZlcmVuY2VNYXggfHwgdGltZUxvY2FsIDwgY29uZmlnLnRpbWVEaWZmZXJlbmNlTWluKVxuICAgICAgICByZXR1cm4gMDtcbiAgICBlbHNlIHJldHVybiB0aW1lTG9jYWw7XG59XG5cbi8vIE9uIGVubMOodmUgdm9sb250YWlyZW1lbnQgbGVzIDAvTyBwb3VyIMOpdml0ZXIgbGVzIGNvbmZ1c2lvbnMgIVxuLy8gRXQgbWlldXggdmF1dCBhdXNzaSBkw6lidXRlciBldCBmaW5pciBwYXIgdW5lIGxldHRyZSBzaW1wbGUuXG5leHBvcnQgY29uc3QgZ2V0UGFzc3dvcmQgPSAobmJDYXJNaW4sIG5iQ2FyTWF4KSA9Plxue1xuICAgIGNvbnN0IG5iQ2FyPW5iQ2FyTWluK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoobmJDYXJNYXgtbmJDYXJNaW4pKTtcbiAgICBjb25zdCBsZXR0ZXJzPVwiQUJDREVGR0hJSktMTU5QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ucHFyc3R1dnd4eXpcIjtcbiAgICBjb25zdCBvdGhlcnM9XCIxMjM0NTY3ODkhPy4qLV8lQCbDicOAw4jDmeKCrCTDgsOKw5vDjlwiO1xuICAgIGxldCBwYXNzd29yZD1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldO1xuICAgIGZvcihsZXQgaT0xO2k8KG5iQ2FyLTEpO2krKylcbiAgICB7XG4gICAgICAgIGlmKChpICUgMikgPT09MSlcbiAgICAgICAgICAgIHBhc3N3b3JkKz1vdGhlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKm90aGVycy5sZW5ndGgpXTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcGFzc3dvcmQrPWxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxldHRlcnMubGVuZ3RoKV07ICAgXG4gICAgfVxuICAgIHBhc3N3b3JkKz1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldO1xuICAgIHJldHVybiBwYXNzd29yZDtcbn1cblxuLy8gSid1dGlsaXNlIGxlIHN0b2NrYWdlIGxvY2FsIGR1IG5hdmlnYXRldXIgcG91ciBlbnJlZ2lzdHJlciBsZXMgZG9ubsOpZXMgcGVybWV0dGFudCBkZSByZWNvbm5hw650cmUgbCd1dGlsaXNhdGV1ciBwYXIgbGEgc3VpdGVcbi8vIFNldWwgbGUgc2VydmV1ciBwb3VycmEgdsOpcmlmaWVyIHF1ZSBsZXMgaWRlbnRpZmlhbnRzIHNvbnQgKHRvdWpvdXJzKSB2YWxpZGVzLlxuZXhwb3J0IGNvbnN0IHNldFNlc3Npb24gPSAodXNlcklkLCB0b2tlbiwgZHVyYXRpb25UUykgPT5cbntcbiAgICBjb25zdCBzdG9yYWdlVXNlcj1cbiAgICB7XG4gICAgICAgIGlkOiB1c2VySWQsXG4gICAgICAgIHRva2VuOiB0b2tlbixcbiAgICAgICAgZHVyYXRpb24gOiBkdXJhdGlvblRTXG4gICAgfVxuICAgIHNhdmVMb2NhbHkoXCJ1c2VyXCIsIHN0b3JhZ2VVc2VyKTtcbn1cblxuLy8gVsOpcmlmaWUgcXUnaWwgeSBhIGRlcyBkb25uw6llcyBsb2NhbGVzIGNvbmNlcm5hbnQgbGUgcsOpc3VsdGF0IGQndW4gcXVpelxuLy8gRXQgbGVzIGFqb3V0ZSBhdXggZG9ubsOpZXMgZW52b3nDqWVzIHBhciBsZXMgZm9ybXVsYWlyZXMgZCdpbnNjcmlwdGlvbi9jb25uZXhpb24gc2kgYydlc3QgbGUgY2FzXG5leHBvcnQgY29uc3QgY2hlY2tBbnN3ZXJEYXRhcyA9IChkYXRhcykgPT5cbntcbiAgICBjb25zdCBsYXN0QW5zd2VyPWdldExvY2FseShcImxhc3RBbnN3ZXJcIik7XG4gICAgaWYoIWlzRW1wdHkobGFzdEFuc3dlcikpXG4gICAge1xuICAgICAgICBjb25zdCBhbnN3ZXI9SlNPTi5wYXJzZShsYXN0QW5zd2VyKTtcbiAgICAgICAgaWYoIWlzRW1wdHkoYW5zd2VyLmR1cmF0aW9uKSAmJiAhaXNFbXB0eShhbnN3ZXIubmJDb3JyZWN0QW5zd2VycykgJiYgIWlzRW1wdHkoYW5zd2VyLlF1ZXN0aW9ubmFpcmVJZCkgJiYgIWlzRW1wdHkoYW5zd2VyLm5iUXVlc3Rpb25zKSlcbiAgICAgICAge1xuICAgICAgICAgICAgZGF0YXMuZHVyYXRpb249YW5zd2VyLmR1cmF0aW9uO1xuICAgICAgICAgICAgZGF0YXMubmJDb3JyZWN0QW5zd2Vycz1hbnN3ZXIubmJDb3JyZWN0QW5zd2VycztcbiAgICAgICAgICAgIGRhdGFzLlF1ZXN0aW9ubmFpcmVJZD1hbnN3ZXIuUXVlc3Rpb25uYWlyZUlkO1xuICAgICAgICAgICAgZGF0YXMubmJRdWVzdGlvbnM9YW5zd2VyLm5iUXVlc3Rpb25zO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhcztcbn1cblxuLy8gQ2V0dGUgZm9uY3Rpb24gdGVzdGUgbGEgY29ubmV4aW9uIGRlIGwndXRpbGlzYXRldXIgZCd1bmUgcGFnZVxuLy8gT24gcGV1dCBmb3VybmlzIHVuZSBsaXN0ZSBkZSBzdGF0dXRzIGFjY2VwdMOpcyAoc2kgdmlkZSA9IHRvdXMpLCBhaW5zaSBxdSd1bmUgdXJsIGRlIHJlZGlyZWN0aW9uIHNpIG5vbiBjb25uZWN0w6ksIHVuIG1lc3NhZ2UgZCdlcnJldXIgw6AgYWZmaWNoZXIgc3VyIGxhIHBhZ2UgZGUgZGVzdGluYXRpb24gZXQgbCd1cmwgc3VyIGxhcXVlbGxlIHJldmVuaXIgdW5lIGZvaXMgY29ubmVjdMOpXG5leHBvcnQgY29uc3QgY2hlY2tTZXNzaW9uID0gYXN5bmMgKGNvbmZpZywgc3RhdHVzPVtdLCB1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKSA9Plxue1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuICAgIHtcbiAgICAgICAgY29uc3QgdXNlckRhdGFzPWdldExvY2FseShcInVzZXJcIik7XG4gICAgICAgIGlmKGlzRW1wdHkodXNlckRhdGFzKSlcbiAgICAgICAge1xuICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCB1c2VyPUpTT04ucGFyc2UodXNlckRhdGFzKTtcbiAgICAgICAgICAgIGlmKGlzRW1wdHkodXNlci5pZCkgfHzCoGlzRW1wdHkodXNlci50b2tlbikgfHwgaXNFbXB0eSh1c2VyLmR1cmF0aW9uKSB8fCB1c2VyLmR1cmF0aW9uIDwgRGF0ZS5ub3coKSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBjb25maWdGcm9udEVuZC5hcGlVcmwrY29uZmlnLnVzZXJSb3V0ZXMrY29uZmlnLmNoZWNrTG9naW5Sb3V0ZSt1c2VyLnRva2VuKTtcbiAgICAgICAgICAgICAgICB4aHIub25sb2FkID0gKCkgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwICYmIHJlc3BvbnNlLmlzVmFsaWQgJiYgcmVzcG9uc2UuaWQgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5pZD09PXVzZXIuaWQpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5uYW1lPXJlc3BvbnNlLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5sYW5ndWFnZT1yZXNwb25zZS5sYW5ndWFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnRpbWVEaWZmZXJlbmNlPXJlc3BvbnNlLnRpbWVEaWZmZXJlbmNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIuc3RhdHVzPXJlc3BvbnNlLnN0YXR1czsvLyBsZSB0b2tlbiBldCBkZSB0b3V0ZSBmYcOnb24gdsOpcmlmaWVyIMOgIGNoYXF1ZSByZXF1w6p0ZSDDoCBsJ0FQSVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVMb2NhbHkoXCJ1c2VyXCIsIHVzZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpIGlsIHMnYWdpdCBkJ3VuIFwidXNlclwiIGV0IHF1ZSBzb24gYWJvbm5lbWVudCBhIGV4cGlyw6ksIGplIGxlIHJlZGlyaWdlIHZlcnMgbGEgY2Fpc3NlIDotKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLnN0YXR1cz09PVwidXNlclwiICYmIHJlc3BvbnNlLm5iRGF5c09rIDw9IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cmxBY2NvdW50PWNvbmZpZy5zaXRlVXJsK1wiL1wiK2NvbmZpZ0Zyb250RW5kLmFjY291bnRQYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKHVybEFjY291bnQpPT09LTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKFwiL1wiK2NvbmZpZ0Zyb250RW5kLmFjY291bnRQYWdlKTsvLyBwYXNzw6llIGRpcmVjdGVtZW50IGljaSwgbCdhbmNyZSAjc3Vic2NyaWJlIG5lIGZvbmN0aW9ubmUgcGFzICE/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHN0YXR1cy5sZW5ndGghPT0wICYmIHN0YXR1cy5pbmRleE9mKHJlc3BvbnNlLnN0YXR1cyk9PT0tMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgeGhyLm9uZXJyb3IgPSAoKSA9PiByZWplY3QoeGhyLnN0YXR1c1RleHQpO1xuICAgICAgICAgICAgICAgIHhoci5zZW5kKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8vIENldHRlIGZvbmN0aW9uIHNlcnQgw6AgbGEgcHLDqWPDqWRlbnRlIGVuIGNhcyBkZSBjb25uZXhpb24gbm9uIHZhbGlkZVxuY29uc3QgcmVkaXJlY3RVc2VyID0gKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpID0+XG57XG4gICAgaWYoIWlzRW1wdHkobWVzc2FnZSkpXG4gICAgICAgIHNhdmVMb2NhbHkoXCJtZXNzYWdlXCIsIG1lc3NhZ2UpO1xuICAgIGlmKCFpc0VtcHR5KHVybFdhbnRlZCkpXG4gICAgICAgIHNhdmVMb2NhbHkoXCJ1cmxcIiwgdXJsV2FudGVkKTtcbiAgICBpZighaXNFbXB0eSh1cmxSZWRpcmVjdGlvbikpXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24odXJsUmVkaXJlY3Rpb24pO1xufSJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/front/public/JS/manageQuestionnaires.app.js b/front/public/JS/manageQuestionnaires.app.js new file mode 100644 index 0000000..e448352 --- /dev/null +++ b/front/public/JS/manageQuestionnaires.app.js @@ -0,0 +1,2070 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "./src/manageQuestionnaires.js"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "../config/instance.js": +/*!*****************************!*\ + !*** ../config/instance.js ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var _module$exports; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var users = __webpack_require__(/*! ./users */ "../config/users.js"); + +var questionnaires = __webpack_require__(/*! ./questionnaires */ "../config/questionnaires.js"); + +module.exports = (_module$exports = { + apiUrl: "http://localhost:3000/api", + siteUrl: "http://localhost:8080", + adminName: "Fabrice", + adminEmail: "dev@wikilerni.com", + senderName: "WikiLerni", + senderEmail: "bonjour@wikilerni.com", + adminLang: "fr", + theme: "default", + // le thème utilisé (dans /views) pour générer les pages HTML. Contient ses propres fichiers de configuration. + availableLangs: ["fr"], + // Languages in which the site is available. The first one is the default one. + siteName: "WikiLerni", + beginCodeGodfather: "wikilerni", + // case-sensitive and can't contain "@" ! + cronTimingAlertInSeconde: 120, + // for logs + responseTimingAlertInSeconde: 3, + // idem + tokenSignupValidationTimeInHours: "48h", + // https://github.com/zeit/ms + tokenLoginLinkTimeInHours: "1h", + tokenConnexionMinTimeInHours: "24h", + tokenConnexionMaxTimeInDays: "180 days", + tokenLoginChangingTimeInHours: "1h", + // for email & password changing + tokenDeleteUserTimeInHours: "1h", + tokenUnsubscribeLinkTimeInDays: "7 days", + // token send with subscription's emails + freeAccountTimingInDays: 10, + freeAccountExpirationNotificationInDays: 5, + accountExpirationFirstNotificationInDays: 14, + accountExpirationSecondNotificationInDays: 5, + inactiveAccountTimeToDeleteInDays: 180, + // Questionnaires: + nbQuestionsMin: 1, + // minimum number of questions for the questionnaire to be publishable + nbQuestionsMax: 10, + // if 0 = not maximum + nbChoicesMax: 10, + nbNewQuestionnaires: 10, + // for RSS, etc. + hourGiveNewQuestionnaireBegin: 1, + // in user local time + hourGiveNewQuestionnaireEnd: 24, + // idem + numberNewQuestionnaireAtSameTime: 50, + // for mass mailing + minSearchQuestionnaires: 3, + // Illustrations: + nbIllustrationsMin: 0, + nbIllustrationsMax: 1, + maxIllustrationSizeinOctet: 1000000, + // pas contrôlé pour l'instant. À revoir. + mimeTypesForIllustration: ["image/jpg", "image/jpeg", "image/png", "image/gif", "image/png"], + // -- Upload and resize: + illustrationsWidthMaxInPx: 400, + illustrationsMiniaturesWidthMaxInPx: 200, + // Links: + nbLinksMin: 1, + nbLinksMax: 1 +}, _defineProperty(_module$exports, "nbQuestionsMin", questionnaires.nbQuestionsMin), _defineProperty(_module$exports, "nbQuestionsMax", questionnaires.nbQuestionsMax), _defineProperty(_module$exports, "nbChoicesMax", questionnaires.nbChoicesMax), _defineProperty(_module$exports, "passwordMinLength", users.password.minlength), _defineProperty(_module$exports, "dirCacheUsers", users.dirCacheUsers), _defineProperty(_module$exports, "dirCacheUsersAnswers", users.dirCacheUsersAnswers), _defineProperty(_module$exports, "dirCacheQuestionnaires", questionnaires.dirCacheQuestionnaires), _defineProperty(_module$exports, "dirCacheQuestions", questionnaires.dirCacheQuestions), _defineProperty(_module$exports, "dirCacheUsersQuestionnaires", questionnaires.dirCacheUsersQuestionnaires), _defineProperty(_module$exports, "dirHTMLQuestionnaire", questionnaires.dirHTMLQuestionnaire), _defineProperty(_module$exports, "dirWebQuestionnaire", questionnaires.dirWebQuestionnaire), _module$exports); + +/***/ }), + +/***/ "../config/questionnaires.js": +/*!***********************************!*\ + !*** ../config/questionnaires.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + // API'routes (after "apiUrl" defined in instance.js) + questionnaireRoutes: "/questionnaire", + getQuestionnaireRoutes: "/get", + previewQuestionnaireRoutes: "/preview", + publishedQuestionnaireRoutes: "/quiz/", + saveAnswersRoute: "/answer/", + getStatsQuestionnaires: "/stats/", + searchQuestionnairesRoute: "/search", + searchAdminQuestionnairesRoute: "/searchadmin", + getListNextQuestionnaires: "/getlistnextquestionnaires/", + // -- questions & choices : + questionsRoute: "/question/", + // -- tags : + tagsSearchRoute: "/tags/search/", + // -- answers : + getQuestionnairesWithoutAnswer: "/withoutanswer/user/", + getPreviousAnswers: "/user/answers/", + getStatsAnswers: "/user/anwswers/stats/", + getAdminStats: "/getadminstats/", + // forms : à compléter avec valeurs par défaut, etc. cf modèle + Questionnaire: { + title: { + maxlength: 255, + required: true + }, + slug: { + maxlength: 150 + }, + // champ requis mais calculé à partir du titre qd vide + introduction: { + required: true + } + }, + searchQuestionnaires: { + minlength: 3, + required: true + }, + Question: { + text: { + maxlength: 255, + required: true + }, + rank: { + required: true, + min: 1, + defaultValue: 1 + } + }, + Choice: { + text: { + maxlength: 255, + required: true + } + }, + nbQuestionsMin: 1, + nbQuestionsMax: 10, + nbChoicesMax: 10, + nbTagsMin: 0, + nbTagsMax: 0, + // 0 = not max + // JSON and HTML dir + dirCacheQuestionnaires: "datas/questionnaires", + dirCacheQuestions: "datas/questionnaires/questions", + dirCacheUsersQuestionnaires: "datas/users/questionnaires", + dirCacheTags: "datas/questionnaires/tags", + dirHTMLQuestionnaire: "front/public/quiz", + dirHTMLTags: "front/public/quizs", + dirWebQuestionnaire: "quiz", + //pour url page + dirWebTags: "quizs" // idem + +}; + +/***/ }), + +/***/ "../config/users.js": +/*!**************************!*\ + !*** ../config/users.js ***! + \**************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + // API'routes (after "apiUrl" defined in instance.js) + userRoutes: "/user", + subscribeRoute: "/signup", + getGodfatherRoute: "/getgodfatherid", + checkIfIsEmailfreeRoute: "/isemailfree", + checkSubscribeTokenRoute: "/validation/", + checkLoginRoute: "/checklogin/", + connectionRoute: "/login", + getLoginLinkRoute: "/getloginlink", + connectionWithLinkRoute: "/checkloginlink", + getUserInfos: "/get/", + createUserRoute: "/create", + validateUserRoute: "/validate/", + updateUserInfos: "/modify/", + searchUserRoute: "/search/", + getGodChilds: "/getgodchilds/", + checkNewLoginLinkRoute: "/confirmnewlogin/", + checkDeleteLinkRoute: "/confirmdelete/", + getPayments: "/payment/getforoneuser/", + unsubscribeRoute: "/subscription/stop/", + getAdminStats: "/getadminstats/", + // forms : à compléter avec valeurs par défaut, etc. cf modèle + name: { + maxlength: 70, + required: true + }, + email: { + maxlength: 255, + required: true + }, + password: { + minlength: 8, + maxlength: 72, + required: true + }, + // https://www.npmjs.com/package/bcrypt#security-issues-and-concerns + newPassword: { + minlength: 8, + maxlength: 72 + }, + codeGodfather: { + maxlength: 255 + }, + cguOk: { + value: "true", + required: true + }, + timeDifferenceMin: -720, + timeDifferenceMax: 840, + // JSON dir + dirCacheUsers: "datas/users", + dirCacheUsersAnswers: "datas/users/questionnaires/answers" +}; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/general$": +/*!**************************************!*\ + !*** ../lang sync ^\.\/.*\/general$ ***! + \**************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/general": "../lang/fr/general.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/general$"; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/illustration$": +/*!*******************************************!*\ + !*** ../lang sync ^\.\/.*\/illustration$ ***! + \*******************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/illustration": "../lang/fr/illustration.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/illustration$"; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/link$": +/*!***********************************!*\ + !*** ../lang sync ^\.\/.*\/link$ ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/link": "../lang/fr/link.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/link$"; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/question$": +/*!***************************************!*\ + !*** ../lang sync ^\.\/.*\/question$ ***! + \***************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/question": "../lang/fr/question.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/question$"; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/questionnaire$": +/*!********************************************!*\ + !*** ../lang sync ^\.\/.*\/questionnaire$ ***! + \********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/questionnaire": "../lang/fr/questionnaire.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/questionnaire$"; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/user$": +/*!***********************************!*\ + !*** ../lang sync ^\.\/.*\/user$ ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/user": "../lang/fr/user.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/user$"; + +/***/ }), + +/***/ "../lang/fr/general.js": +/*!*****************************!*\ + !*** ../lang/fr/general.js ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + siteHTMLTitle: "WikiLerni : qu'allez-vous apprendre aujourd'hui ?", + siteMetaDescription: "Chaque jour, testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.", + scriptTimingInfo: "Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", + scriptTimingAlert: "*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", + serverError: "Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.", + serverErrorAdmin: "Bug de l'application :", + neededParams: "Des paramètres nécessaires manquants sont manquants.", + badUrl: "Tentative d'accès à une page n'existant pas :", + notValidFormat: "Format non valide.", + notAllowed: "Vous n'avez pas les droits nécessaires pour cette action.", + notRequired: "Facultatif.", + updateBtnTxt: "Modifier", + addBtnTxt: "Ajouter", + deleteBtnTxt: "Supprimer", + addOkMessage: "Les données ont bien été enregistrées.", + updateOkMessage: "La mise à jour à jour a bien été enregistrée.", + deleteOkMessage: "La suppression a bien été enregistrée.", + failAuth: "Erreur d'authentification.", + failAuthHeader: "Absence de header Authorization.", + failAuthToken: "Token invalide ou utilisateur non trouvé.", + failAuthId: "Identifiant non valide : ", + failAuthCron: "Tentative de lancement d'un cron sans le bon token.", + previousPage: "Page précédente", + nextPage: "Page suivante", + btnLinkToQuestionnaire: "Aller au quiz !", + statsAdmin: "Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
    En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
    Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium." +}; + +/***/ }), + +/***/ "../lang/fr/illustration.js": +/*!**********************************!*\ + !*** ../lang/fr/illustration.js ***! + \**********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + needUrl: "Merci de fournir une url pour l'image.", + needUniqueUrl: "L'url est déjà utilisée par une autre image.", + needGoodLongUrl: "L'url de l'image doit contenir entre 5 et 255 caractères.", + needGoodLongAlt: "Le texte de la propriété 'alt' ne doit pas compter plus de 255 caractères.", + needGoodLongTitle: "Le texte de la propriété 'title' ne doit pas compter plus de 255 caractères.", + needGoodLongCaption: "Le texte de la légende de l'image ne doit pas compter plus de 255 caractères.", + needGoodFile: "Votre fichier n'a pas été accepté.", + needQuestionnaireForIllustration: "Tentative d'ajout/mise à jour/suppreession d'une illustration pour un questionnaire n'ayant pas été trouvé.", + needMaxIllustrationsForQuestionnaire: "Vous avez déjà atteint le nombre maximal d'illustrations pour ce questionnaire.", + notFound: "L'enregistrement de l'illustration n'a pas été trouvé : ", + addedOkMessage: "L'illustration a bien été enregistrée.", + updatedOkMessage: "L'illustration a bien été modifiée.", + deletedOkMessage: "L'illustration a bien été supprimée.", + defaultAlt: "Illustration du quiz", + introTitle: "Illustrations du quiz", + introNoIllustration: "Aucune illustration pour l'instant." +}; + +/***/ }), + +/***/ "../lang/fr/link.js": +/*!**************************!*\ + !*** ../lang/fr/link.js ***! + \**************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + needUrl: "Merci de saisir l'url du lien.", + needValidUrl: "Merci de saisir un url ayant un format valide.", + needNotTooLongUrl: "Merci de saisir un url ne comptant pas plus de 255 caractères.", + needAnchor: "Merci de fournir une ancre pour ce lien.", + needGoodLongAnchor: "Merci de fournir une ancre pour ce lien comptant entre 5 et 150 caractères.", + needQuestionnaire: "Le questionnaire du lien n'a pas été trouvé.", + needMaxLinksForQuestionnaire: "Vous avez déjà atteint le nombre maximal de liens pour ce questionnaire.", + updatedOkMessage: "Le lien a bien été modifié.", + addedOkMessage: "Le lien a bien été ajouté.", + deletedOkMessage: "Le lien a bien été supprimé.", + notFound: "L'enregistrement du lien n'a pas été trouvé.", + introTitle: "Lectures proposées", + introNoLink: "Aucun lien pour l'instant.", + defaultValue: "Lire l'article sur Wikipédia." +}; + +/***/ }), + +/***/ "../lang/fr/question.js": +/*!******************************!*\ + !*** ../lang/fr/question.js ***! + \******************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + needText: "Merci de saisir le texte de la question !", + needNotTooLongText: "La question ne doit pas compter plus de 255 caractères.", + needQuestionnaire: "Le questionnaire concerné n'a pas été trouvé.", + needMaxQuestions: "Vous avez déjà atteint le nombre maximal de questions pour ce questionnaire : ", + notFound: "L'enregistrement de la question n'a pas été trouvé.", + addOkMessage: "La question a bien été ajoutée.", + updateOkMessage: "La question a bien été modifiée.", + deleteOkMessage: "La question a bien été supprimée.", + introTitle: "Les questions enregistrées", + introNoQuestion: "Aucune question n'a été saisie pour l'instant", + needNumberForRank: "Vous devez fournir un nombre supérieur ou égal à 1 pour le rang de cette question." +}; + +/***/ }), + +/***/ "../lang/fr/questionnaire.js": +/*!***********************************!*\ + !*** ../lang/fr/questionnaire.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + needTitle: "Merci de fournir un titre à votre quiz.", + needNotTooLongTitle: "Le titre du quiz ne doit pas compter plus de 255 caractères.", + needUrl: "Merci de fournir l'url à votre quiz.", + needUniqueUrl: "L'url du quiz doit être unique.", + needIntroduction: "Merci de fournir un texte d'introduction à votre quiz.", + needCorrectPublishingDate: "La date de publication fournie n'a pas un format valide.", + needKnowIfIsPublished: "Il faut savoir si ce quiz est publié.", + needLanguage: "Vous devez sélectionner la langue de ce quiz.", + needEstimatedTime: "Merci de sélectionner une estimation de la durée de ce quiz.", + notFound: "Aucun quiz n'a pas été trouvé.", + searchResultTitle: "Résultat pour votre recherche", + searchNoResult: "Aucun résultat n'a été trouvé pour votre recherche", + searchWithResult: "#NB quizs correspondent à votre recherche :", + publishedBy: "Publié par", + publishedAt: ", le", + lastUpdated: "Dernière mise à jour, le ", + estimatedTime: "Durée de lecture estimée : ", + btnSendResponse: "Envoyez vos réponses", + btnProposeSubscribe: "Ok, je crée mon compte !", + btnProposeConnection: "J'ai déjà un compte, je me connecte.", + btnShowQuestionnaire: "Afficher le quiz !", + nextQuestionnairesList: "Les #NB prochains quizs devant être publiés", + needBeCompleted: "Quiz incomplet", + nextDateWithoutQuestionnaire: "Prochaine date sans quiz programmé : ", + haveBeenPublished: ":NB nouveaux questionnaires ont été publiés." +}; + +/***/ }), + +/***/ "../lang/fr/user.js": +/*!**************************!*\ + !*** ../lang/fr/user.js ***! + \**************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + notFound: "L'utilisateur n'a pas été trouvé.", + needName: "Merci de choisir un nom d'utilisateur.", + needNotTooLongName: "Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.", + needEmail: "Merci de saisir votre adresse e-mail.", + needUniqueEmail: "L'adresse e-mail que vous avez saisie est déjà utilisée par un autre utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.", + needNotTooLongEmail: "Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.", + needPassWord: "Merci de fournir un mot de passe.", + needLongPassWord: "Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.", + passwordCopied: "Le mot de passe généré a été copié dans le presse-papier. Vous pouvez le recopier où vous le souhaiter.", + needStatus: "Il manque le statut.", + needLanguage: "Il manque le code langue.", + needValidLastConnectionDate: "La date de dernière connexion n'est pas valide.", + needSMTP: "Il manque le serveur SMTP.", + needSMTPNotFound: "Il manque le serveur SMTP.", + needKnowNewsletterOk: "Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.", + needTimeDifference: "Il faut connaître le nombre de minutes du décalage horaire.", + needMinTimeDifference: "Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.", + needMaxTimeDifference: "Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.", + needUGCOk: "Vous devez accepter les CGU pour pouvoir créer votre compte. ", + godfatherNotFound: "Aucun utilisateur valide trouvé pour ce code parrain.", + godfatherFound: "Votre parrain a bien été trouvé !", + mailValidationMessage: "Votre inscription est bien enregistrée.\nPour la finaliser, merci de cliquer dans les 24H sur le lien de confirmation qui vient de vous être envoyé par e-mail.", + mailValidationLinkSubject: "Merci de valider votre compte", + mailValidationLinkSBodyTxt: "Bonjour USER_NAME,\n\nPour valider votre compte, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL", + mailValidationLinkSBodyHTML: "

    Bonjour USER_NAME,

    Pour valider votre compte, merci de cliquer sur le lien suivant dans les 24h.

    Valider.

    ", + validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue !
    Vous pouvez sans tarder vous connecter ci-dessous pour accéder à votre compte.", + validationMessageAdmin: "Le compte a bien été validé.", + validationAlreadyMessage: "Il semble que vous ayez déjà validé votre compte.", + validationAlreadyMessageAdmin: "Ce compte a déjà été validé.", + mailWelcomeSubject: "Bienvenue !", + mailWelcomeBodyTxt: "Bonjour USER_NAME,\nVotre venez de valider votre inscription à NOM_SITE.\nMerci et à bientôt !", + mailWelcomeBodyHTML: "

    Bonjour USER_NAME,

    Votre venez de valider votre inscription à NOM_SITE.

    Merci et à bientôt !

    ", + mailThankGodfatherSubject: "Merci !", + mailThankGodfatherBodyTxt: "Bonjour USER_NAME,\nGrâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nMerci et à bientôt !", + mailThankGodfatherBodyHTML: "

    Bonjour USER_NAME,

    Grâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.

    Merci et à bientôt !

    ", + badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.", + emailNotFound: "Aucun utilisateur trouvé pour cette adresse e-mail.", + alreadyConnected: "Vous êtes déjà connecté(e) au site !", + needBeConnected: "Vous devez être connecté(e) pour accéder à cette page.", + connectionOk: "Connexion réussie.", + needChooseLoginWay: "Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.", + needValidationToLogin: "Vous devez d'abord valider votre compte avant de vous connecter. Pour ce faire, un lien vient de vous être envoyé par e-mail.", + tooManyLoginFails: "Trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.", + badPassword: "Le mot de passe n'est pas le bon.", + mailLoginLinkSubject: "Votre lien de connexion.", + mailLoginLinkBodyTxt: "Bonjour USER_NAME,\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : LINK_URL", + mailLoginLinkBodyHTML: "

    Bonjour USER_NAME,

    Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :

    Valider.

    ", + mailLoginLinkMessage: "Un lien de connexion vient de vous être envoyé sur votre adresse e-mail. Ne tardez pas à l'utiliser, car il n'est valable que durant ", + updatedOkMessage: "Vos informations ont bien été mises à jour.", + updatedNeedGoodEmail: "Mais la nouvelle adresse e-mail n'a pu être enregistrée car elle n'a pas une format correct.", + updatedNeedUniqueEmail: "Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.", + mailUpdateLoginSubject: "Merci de valider vos nouveaux identifiants.", + mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL", + mailUpdateLoginBodyHTML: "

    Bonjour USER_NAME,

    Pour valider vos nouveaux identifiants de connexion, cliquez ici sans tarder.

    ", + mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (email et/ou mot de passe) et vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement. En attendant, merci de continuer à utiliser vos anciens identifiants.", + updatedNeedValidatedUser: "L'utilisateur que vous souhaité modifier n'existe pas/plus ou n'a pas encore validé son compte.", + updatedNeedGoodGodfather: "Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.", + mailUpdateLoginOkMessage: "La mise à jour de vos identifiants a bien été enregistrée.", + updatedFailedGodfatherNotFound: "L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.", + creationOkMessage: "Le nouvel utilisateur a bien été enregistré.", + mailDeleteSubject: "Confirmer la suppression de votre compte.", + mailDeleteBodyTxt: "Bonjour USER_NAME,\nPour valider la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL", + mailDeleteBodyHTML: "

    Bonjour USER_NAME,

    Pour valider la suppression de votre compte, cliquez ici sans tarder.

    ", + mailDeleteLinkMessage: "Votre demande de suppression a bien été enregistrée. Merci de cliquer sans tarder sur le lien qui vient de vous être envoyé par e-mail pour confirmer.", + deleteOkMessage: "L'utilisateur a bien été supprimé.", + deleteFailMessage: "Tentative de suppression d'un utilisateur inexistant : ", + mailDeleteLinkOkMessage: "Votre compte a bien été supprimé. Merci d'avoir utilisé nos services.", + mailDeleteLinkAlreadyMessage: "Il semble que vous ayez déjà validé la suppression de votre compte.", + mailDeleteLinkFailMessage: "Votre lien de suppression n'est pas valide ou alors il n'est plus valable.", + cronDeleteUnvalidedUsersMessage: " comptes utilisateurs non validés ont été supprimés.", + deleteInactiveUsersMessage: " comptes utilisateurs inactifs ont été supprimés.", + welcomeMessage: "Bienvenue #NAME !", + byebyeMessage: "Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
    À bientôt !", + infosUserForAdmin: "Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
    Date de sa dernière connexion : DATE_CONNECTION.", + infosAdminGodfather: "Cet utilisateur a été parrainé par ", + infosAdminNbGodChilds: "Ses #NB filleuils : " +}; + +/***/ }), + +/***/ "../tools/main.js": +/*!************************!*\ + !*** ../tools/main.js ***! + \************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +// Quelques fonctions utiles pour les chaînes +var Tool = /*#__PURE__*/function () { + function Tool() { + _classCallCheck(this, Tool); + } + + _createClass(Tool, null, [{ + key: "isEmpty", + value: function isEmpty(myVar) { + if (myVar === undefined || myVar === null) return true;else { + myVar += ""; // si autre chose qu'une chaîne envoyé... + + myVar = myVar.trim(); + if (myVar === "") return true;else return false; + } + } + }, { + key: "trimIfNotNull", + value: function trimIfNotNull(myString) { + if (Tool.isEmpty(myString)) myString = null;else { + myString += ""; // si autre chose qu'une chaîne envoyé... + + myString = myString.trim(); + } + return myString; + } + }, { + key: "shortenIfLongerThan", + value: function shortenIfLongerThan(myString, max) { + myString += ""; // au cas où cela ne serait pas une chaîne... + + if (myString.length > max) myString = myString.substring(0, max - 3) + "..."; + return myString; + } // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings + + }, { + key: "replaceAll", + value: function replaceAll(myString, mapObj) { + var replaceElts = new RegExp(Object.keys(mapObj).join("|"), "gi"); + return myString.replace(replaceElts, function (matched) { + return mapObj[matched]; + }); + } // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random + + }, { + key: "getRandomInt", + value: function getRandomInt(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min)) + min; + } // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country + + }, { + key: "dateFormat", + value: function dateFormat(dateString) { + var lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "fr"; + if (Tool.isEmpty(dateString)) return ""; + var myDate = new Date(dateString); + var myDay = myDate.getDate() + ""; + if (myDay.length === 1) myDay = "0" + myDay; + var myMounth = myDate.getMonth() + 1 + ""; + if (myMounth.length === 1) myMounth = "0" + myMounth; + var myYear = myDate.getFullYear(); + if (lang === "fr") return myDay + "/" + myMounth + "/" + myYear;else if (lang === "form") // 2014-02-09 + return myYear + "-" + myMounth + "-" + myDay;else return myMounth + "/" + myDay + "/" + myYear; + } + }]); + + return Tool; +}(); + +module.exports = Tool; + +/***/ }), + +/***/ "../views sync recursive ^\\.\\/.*\\.js$": +/*!**********************************!*\ + !*** ../views sync ^\.\/.*\.js$ ***! + \**********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./default/config/fr.js": "../views/default/config/fr.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../views sync recursive ^\\.\\/.*\\.js$"; + +/***/ }), + +/***/ "../views/default/config/fr.js": +/*!*************************************!*\ + !*** ../views/default/config/fr.js ***! + \*************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + headLinks: [{ + anchor: "Accueil", + attributes: { + href: "/" + } + }, { + anchor: "Mon compte", + attributes: { + href: "/connexion.hmt", + id: "accountHeadLink" + } + }, { + anchor: "À propos", + attributes: { + href: "/a-propos.html" + } + }, { + anchor: "Contact", + attributes: { + href: "/contact.html" + } + }], + footLinks: [{ + anchor: "Crédits", + attributes: { + href: "/credits.html" + } + }, { + anchor: "Mentions légales", + attributes: { + href: "/mentions-legales.html", + rel: "nofollow" + } + }, { + anchor: "Données personnelles", + attributes: { + href: "/donnees.html" + } + }, { + anchor: "C.G.U.", + attributes: { + href: "/cgu.html", + rel: "nofollow" + } + }, { + anchor: "C.G.V.", + attributes: { + href: "/cgv.html", + rel: "nofollow" + } + }], + maxQuestionnairesByPage: 10, + userHomePage: "accueil.html", + adminHomePage: "admin.html", + managerHomePage: "gestion.html", + subscribePage: "inscription.html", + connectionPage: "connexion.html", + accountPage: "compte.html", + questionnairesManagementPage: "gestion-quizs.html", + usersManagementPage: "gestion-utilisateurs.html", + nbQuestionnairesUserHomePage: 10, + illustrationDir: "/img/quizs/", + siteSlogan: "Cultivons notre jardin !", + homeTitle1: "De nature curieuse ?", + homeP1: "Avec WikiLerni vous apprenez chaque jour de nouvelles choses.
    Des articles de Wikipédia sont sélectionnés pour vous et sont suivis d'un quiz vous permettant de tester ce que vous en avez retenu.
    De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre \"jardin\".", + homeTitle2: "La culture en liberté", + homeP2: "Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
    Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
    Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
    Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.

    (*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.", + newQuestionnairesTitle: "Les derniers quizs publiés sur WikiLerni", + newQuestionnairesIntro: "Liste des derniers quizs publiés sur WikiLerni.", + explanationTitle: "Vous découvrez WikiLerni ?", + explanationTxt: "Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
    Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.

    Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.

    Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)

    Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
    Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.

    Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.", + noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript." +}; + +/***/ }), + +/***/ "./src/manageQuestionnaires.js": +/*!*************************************!*\ + !*** ./src/manageQuestionnaires.js ***! + \*************************************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ "../config/instance.js"); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js"); +/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js"); +/* harmony import */ var _tools_forms_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/forms.js */ "./src/tools/forms.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var _tools_url_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tools/url.js */ "./src/tools/url.js"); +/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./tools/users.js */ "./src/tools/users.js"); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + +// -- GESTION DU FORMULAIRE PERMETTANT DE SAISIR / ÉDITER LES QUIZS ET LEURS DÉPENDANCES (LIENS, IMAGES, TAGS, ETC.) +/// Vérifie que l'utilisateur est bien connecté, a le bon statut et le redirige vers le formulaire d'inscription si ce n'est pas le cas. +/// Si c'est ok, propose un moteur de recherche permettant de chercher un quiz +/// Si un id est passé par l'url on affiche les informations du quiz dans un formulaire permettant de l'éditer/supprimer avec une liste des éléments liés (liens, illustrations, questions...) pouvant eux-mêmes être édités/supprimés. +/// Si le nombre max configuré pour chacun de ses éléments n'est pas atteint, il est aussi proposé d'ajouter un nouvel élément. +/// Sinon pas d'id passé par l'url, on affiche un formulaire vide permettant d'en saisir un nouveau avec ses tags. +// Fichier de configuration côté client : + +var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0]; + +var configFrontEnd = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); // Fonctions utiles au script : !! revoir quand le reste sera fini pour vérifier si tout est utile + + + + + + + + + // Dictionnaires : + +var txt = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + lang + "/general"); + +var txtUsers = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/user$")("./" + lang + "/user"); + +var txtQuestionnaire = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/questionnaire$")("./" + lang + "/questionnaire"); + +var txtQuestion = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/question$")("./" + lang + "/question"); + +var txtLink = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/link$")("./" + lang + "/link"); + +var txtIllustration = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/illustration$")("./" + lang + "/illustration"); + +Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["helloDev"])(); // Principaux éléments du DOM manipulés : + +var divMain = document.getElementById("main-content"); +var divMessage = document.getElementById("message"); +var divResponse = document.getElementById("response"); +var formQuestionnaire = document.getElementById("questionnaires"); +var inputClassification = document.getElementById("classification"); +var helpClassification = document.getElementById("helpClassification"); +var helpPublishingAt = document.getElementById("helpPublishingAt"); +var deleteCheckBox = document.getElementById("deleteOkLabel"); +var btnNewQuestionnaire = document.getElementById("wantNewQuestionnaire"); +var btnPreviewQuestionnaire = document.getElementById("previewQuestionnaire"); +var divQuestionnaires = document.getElementById("questionnairesList"); +var formSearch = document.getElementById("search"); +var divSearchResult = document.getElementById("searchResult"); +var formLink = document.getElementById("links"); +var formIllustration = document.getElementById("illustrations"); +var formQuestion = document.getElementById("questions"); +var divLinks = document.getElementById("linksList"); +var divIllustrations = document.getElementById("illustrationsList"); +var divQuestions = document.getElementById("questionsList"); + +var initialise = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + var config, isConnected, user, hideAllForms, showLinkInfos, showIllustrationInfos, showQuestionInfos, showFormLinkInfos, showFormIllustrationInfos, showFormQuestionInfos, showFormQuestionnaireInfos, urlDatas, showNextQuestionnaires, sendLinkForm, sendIllustrationForm, sendQuestionForm; + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _context.prev = 0; + _context.next = 3; + return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_7__["getConfig"])(); + + case 3: + config = _context.sent; + + if (config) { + _context.next = 8; + break; + } + + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "p", txt.serverError, "", ["error"]); + _context.next = 12; + break; + + case 8: + _context.next = 10; + return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_7__["checkSession"])(["manager", "admin"], "/" + configFrontEnd.connectionPage, { + message: txtUsers.needBeConnected, + color: "error" + }, window.location); + + case 10: + isConnected = _context.sent; + + if (isConnected) { + divMain.style.display = "block"; + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message"))) { + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "p", Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message", true).message, "", [Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message", true).color], "", false); + Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["removeLocaly"])("message"); + } + + user = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("user", true); + Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["updateAccountLink"])(user.status, configFrontEnd); // Initialisation du formulaire de recherche : + + Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(config, formSearch); // Initialise le formulaire permettant de mettre à jour les infos de base du questionnaire : + + Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(config.Questionnaire, formQuestionnaire); // Case de suppression cachée par défaut, car inutile pour formulaire de création + + deleteCheckBox.style.display = "none"; // Fonction vidant et cachant tous les formulaires annexes + + hideAllForms = function hideAllForms() { + Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["empyAndHideForm"])(formLink); + if (txtLink.defaultValue != 0) document.getElementById("anchor").value = txtLink.defaultValue; + Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["empyAndHideForm"])(formIllustration); + Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["empyAndHideForm"])(formQuestion); + }; + + hideAllForms(); // Affiche les infos connues concernant les liens + + showLinkInfos = function showLinkInfos(Links) { + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divLinks, "h4", txtLink.introTitle); // remplace l'existant dans divLinks + + var listLinks = ""; + + for (var i in Links) { + listLinks += "
  • " + Links[i].anchor + " | " + txt.updateBtnTxt + " | " + txt.deleteBtnTxt + "
  • "; + } + + if (listLinks === "") listLinks = "
  • " + txtLink.introNoLink + "
  • "; + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divLinks, "ul", listLinks, "", ["information"], "", false); // à intégrer dans le DOM pour pouvoir ajouter des addEventListener ensuite + + var _loop = function _loop(_i) { + document.getElementById("#updateLink" + Links[_i].id).addEventListener("click", function (e) { + e.preventDefault(); + showFormLinkInfos(Links[_i]); + window.location.assign("#links"); + }); + document.getElementById("#deleteLink" + Links[_i].id).addEventListener("click", function (e) { + e.preventDefault(); + showFormLinkInfos(Links[_i]); + formLink.elements["deleteOk"].value = true; + sendLinkForm(); + }); + }; + + for (var _i in Links) { + _loop(_i); + } + + if (config.nbLinksMax > Links.length || config.nbLinksMax === 0) { + if (Links.length < config.nbLinksMin) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divLinks, "a", txt.addBtnTxt, "#newLink", ["error"], { + href: "#newLink" + }, false);else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divLinks, "a", txt.addBtnTxt, "#newLink", ["information"], { + href: "#newLink" + }, false); + document.getElementById("#newLink").addEventListener("click", function (e) { + e.preventDefault(); + hideAllForms(); + formLink.style.display = "block"; + formLink.elements["QuestionnaireId"].value = formQuestionnaire.elements["id"].value; + window.location.assign("#links"); + Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(config.Link, formLink); + }); + } + }; // Affiche les infos connues concernant les illustrations + + + showIllustrationInfos = function showIllustrationInfos(Illustrations) { + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divIllustrations, "h4", txtIllustration.introTitle); // remplace l'existant dans divIllustrations + + var listIllustrations = ""; + + for (var i in Illustrations) { + listIllustrations += "
  • " + txtIllustration.defaultAlt + " | " + txt.updateBtnTxt + " | " + txt.deleteBtnTxt + "
  • "; + } + + if (listIllustrations === "") listIllustrations = "
  • " + txtIllustration.introNoIllustration + "
  • "; + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divIllustrations, "ul", listIllustrations, "", ["information"], "", false); // à intégrer dans le DOM pour pouvoir ajouter des addEventListener ensuite + + var _loop2 = function _loop2(_i2) { + document.getElementById("#updateIllustration" + Illustrations[_i2].id).addEventListener("click", function (e) { + e.preventDefault(); + showFormIllustrationInfos(Illustrations[_i2]); + window.location.assign("#illustrations"); + }); + document.getElementById("#deleteIllustration" + Illustrations[_i2].id).addEventListener("click", function (e) { + e.preventDefault(); + showFormIllustrationInfos(Illustrations[_i2]); + formIllustration.elements["deleteOk"].value = true; + sendIllustrationForm(); + }); + }; + + for (var _i2 in Illustrations) { + _loop2(_i2); + } + + if (config.nbIllustrationsMax > Illustrations.length || config.nbIllustrationsMax === 0) { + if (Illustrations.length < config.nbIllustrationsMin) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divIllustrations, "a", txt.addBtnTxt, "#newIllustration", ["error"], { + href: "#newIllustration" + }, false);else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divIllustrations, "a", txt.addBtnTxt, "#newIllustration", ["information"], { + href: "#newIllustration" + }, false); + document.getElementById("#newIllustration").addEventListener("click", function (e) { + e.preventDefault(); + hideAllForms(); + formIllustration.style.display = "block"; + formIllustration.elements["QuestionnaireId"].value = formQuestionnaire.elements["id"].value; + window.location.assign("#illustrations"); + Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(config.Illustration, formIllustration); + }); + } + }; // Affiche les infos connues concernant les questions + + + showQuestionInfos = function showQuestionInfos(Questions) { + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divQuestions, "h4", txtQuestion.introTitle); // remplace l'existant dans divQuestions + + var listQuestions = ""; + + for (var i in Questions) { + listQuestions += "
  • " + Questions[i].Question.text + " | " + txt.updateBtnTxt + " | " + txt.deleteBtnTxt + "
  • "; + } + + if (listQuestions === "") listQuestions = "
  • " + txtQuestion.introNoQuestion + "
  • "; + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divQuestions, "ul", listQuestions, "", ["information"], "", false); // à intégrer dans le DOM pour pouvoir ajouter des addEventListener ensuite + + var _loop3 = function _loop3(_i3) { + document.getElementById("#updateQuestion" + Questions[_i3].Question.id).addEventListener("click", function (e) { + e.preventDefault(); + showFormQuestionInfos(Questions[_i3]); + window.location.assign("#links"); + }); + document.getElementById("#deleteQuestion" + Questions[_i3].Question.id).addEventListener("click", function (e) { + e.preventDefault(); + showFormQuestionInfos(Questions[_i3]); + formQuestion.elements["deleteOk"].value = true; + sendQuestionForm(); + }); + }; + + for (var _i3 in Questions) { + _loop3(_i3); + } + + if (config.nbQuestionsMax > Questions.length || config.nbQuestionsMax === 0) { + if (Questions.length < config.nbQuestionsMin) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divQuestions, "a", txt.addBtnTxt, "#newQuestion", ["error"], { + href: "#newQuestion" + }, false);else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divQuestions, "a", txt.addBtnTxt, "#newQuestion", ["information"], { + href: "#newQuestion" + }, false); + document.getElementById("#newQuestion").addEventListener("click", function (e) { + e.preventDefault(); + hideAllForms(); + formQuestion.style.display = "block"; + formQuestion.elements["QuestionnaireId"].value = formQuestionnaire.elements["id"].value; + formQuestion.elements["rank"].value = config.Question.rank.defaultValue; + window.location.assign("#questions"); + Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(config.Question, formQuestion); + }); + } + }; // Fonction affichant les infos d'un lien dans le formulaire adhoc + + + showFormLinkInfos = function showFormLinkInfos(Link) { + // on commence par cacher et vider tous les formulaires annexes + hideAllForms(); // puis on affiche celui dont l'id est passé avec ses données connues + + formLink.style.display = "block"; + + for (var data in Link) { + if (formLink.elements[data] !== undefined) formLink.elements[data].value = Link[data]; + } // + les contraintes de champ : + + + Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(config.Link, formLink); + }; // Fonction affichant les infos d'une illustration dans le formulaire adhoc + + + showFormIllustrationInfos = function showFormIllustrationInfos(Illustration) { + // on commence par cacher et vider tous les formulaires annexes + hideAllForms(); // puis on affiche celui dont l'id est passé avec ses données connues + + formIllustration.style.display = "block"; + + for (var data in Illustration) { + if (formIllustration.elements[data] !== undefined) formIllustration.elements[data].value = Illustration[data]; + } // + les contraintes de champ : + + + Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(config.Illustration, formIllustration); // sauf le champ file qui n'est plus requis quand un fichier existe déjà ! + + formIllustration.elements["image"].removeAttribute("required"); + }; // Fonction affichant les infos d'une question + ses réponses possibles dans le formulaire adhoc + + + showFormQuestionInfos = function showFormQuestionInfos(Question) { + // on commence par cacher et vider tous les formulaires annexes + hideAllForms(); // puis on affiche celui dont l'id est passé avec ses données connues + + formQuestion.style.display = "block"; + + for (var data in Question.Question) { + if (formQuestion.elements[data] !== undefined) formQuestion.elements[data].value = Question.Question[data]; + } + + for (var _data in Question.Choices) { + if (formQuestion.elements["choiceText" + _data] !== undefined) { + formQuestion.elements["choiceText" + _data].value = Question.Choices[_data].text; + if (Question.Choices[_data].isCorrect == true) formQuestion.elements["choiceIsCorrect" + _data].checked = true; + formQuestion.elements["idChoice" + _data].value = Question.Choices[_data].id; + } + } // + les contraintes de champ : + + + Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(config.Question, formQuestion); + }; // Fonction affichant les infos connues concernant un questionnaire et ses dépendances + + + showFormQuestionnaireInfos = function showFormQuestionnaireInfos(id) { + var xhrGetInfos = new XMLHttpRequest(); + xhrGetInfos.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.questionnaireRoutes + config.getQuestionnaireRoutes + "/" + id); + + xhrGetInfos.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var response = JSON.parse(this.responseText); + + if (this.status === 200 && response.Questionnaire != undefined) { + formQuestionnaire.reset(); // pour ne pas garder données déjà affichées si vide dans ce qui est retourné + + for (var data in response.Questionnaire) { + if (formQuestionnaire.elements[data] !== undefined) { + if (data === "publishingAt" && response.Questionnaire[data] !== null) formQuestionnaire.elements[data].value = Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["dateFormat"])(response.Questionnaire[data], "form"); // !! revoir car format pouvant poser soucis si navigateur ne gère pas les champs de type "date" + else formQuestionnaire.elements[data].value = response.Questionnaire[data]; + } + } + + deleteCheckBox.style.display = "block"; + } + + if (response.Tags != undefined) { + var classification = ""; + + for (var i in response.Tags) { + if (i == 0) classification += response.Tags[i].name;else classification += "," + response.Tags[i].name; + } + + formQuestionnaire.elements["classification"].value = classification; + } + + divLinks.style.display = "block"; + divQuestions.style.display = "block"; + divIllustrations.style.display = "block"; + if (response.Links != undefined) showLinkInfos(response.Links); + if (response.Questions != undefined) showQuestionInfos(response.Questions); + if (response.Illustrations != undefined) showIllustrationInfos(response.Illustrations); + helpPublishingAt.style.display = "none"; // info utile pour "placer" un nouveau quiz + // à revoir : remplacer lien pour un bouton + reset complet du formulaire, y compris champs hidden : + + btnNewQuestionnaire.style.display = "block"; + btnNewQuestionnaire.setAttribute("href", configFrontEnd.questionnairesManagementPage); + btnPreviewQuestionnaire.style.display = "block"; + if (response.Questionnaire["isPublished"] === false) btnPreviewQuestionnaire.setAttribute("href", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.questionnaireRoutes + config.previewQuestionnaireRoutes + "/" + id + "/" + user.token);else btnPreviewQuestionnaire.setAttribute("href", config.siteUrl + config.publishedQuestionnaireRoutes + response.Questionnaire["slug"] + ".html"); + } + }; + + xhrGetInfos.send(); + }; // Si un id est passé par l'url, on essaye d'afficher le questionnaire : + + + urlDatas = Object(_tools_url_js__WEBPACK_IMPORTED_MODULE_6__["getUrlParams"])(); + if (urlDatas && urlDatas.id !== undefined) showFormQuestionnaireInfos(urlDatas.id); // Traitement du lancement d'une recherche + + formSearch.addEventListener("submit", function (e) { + e.preventDefault(); + var datas = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["getDatasFromInputs"])(formSearch); + var xhrSearch = new XMLHttpRequest(); + xhrSearch.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.questionnaireRoutes + config.searchAdminQuestionnairesRoute); + + xhrSearch.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var response = JSON.parse(this.responseText); + + if (this.status === 200 && Array.isArray(response)) { + if (response.length === 0) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divSearchResult, "p", txtQuestionnaire.notFound, "", ["information"]);else { + var selectHTML = ""; + + for (var i in response) { + selectHTML += ""; + } + + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divSearchResult, "select", selectHTML, "selectSearch"); + var searchSelect = document.getElementById("selectSearch"); + searchSelect.addEventListener("change", function () { + if (searchSelect.value !== "") showFormQuestionnaireInfos(searchSelect.value); + }); + } + } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divSearchResult, "p", txt.serverError, "", ["error"]); + } + }; + + xhrSearch.setRequestHeader("Content-Type", "application/json"); + xhrSearch.setRequestHeader("Authorization", "Bearer " + user.token); + if (datas) xhrSearch.send(JSON.stringify(datas)); + }); // Les questionnaires bientôt publiés. Dans une fonction car devant être rechargé. + + showNextQuestionnaires = function showNextQuestionnaires() { + var xhrNextQuestionnaires = new XMLHttpRequest(); + xhrNextQuestionnaires.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.questionnaireRoutes + config.getListNextQuestionnaires); + + xhrNextQuestionnaires.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var response = JSON.parse(this.responseText); + + if (this.status === 200 && Array.isArray(response.questionnaires)) { + var listHTML = ""; + + for (var i in response.questionnaires) { + listHTML += "
  • " + Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["dateFormat"])(response.questionnaires[i].datePublishing, "fr") + ": " + response.questionnaires[i].title + ""; + if (response.questionnaires[i].isPublishable === false) listHTML += " (" + txtQuestionnaire.needBeCompleted + ")
  • "; + listHTML += ""; + } + + if (response.questionnaires.length !== 0) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divQuestionnaires, "h3", txtQuestionnaire.nextQuestionnairesList.replace("#NB", response.questionnaires.length)); + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(helpPublishingAt, "em", txtQuestionnaire.nextDateWithoutQuestionnaire + Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["dateFormat"])(new Date(response.dateNeeded), "fr")); + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divQuestionnaires, "ul", listHTML, "", "", "", false); + + for (var _i4 in response.questionnaires) { + document.getElementById("questionnaire_" + response.questionnaires[_i4].id).addEventListener("click", function (e) { + e.preventDefault(); + showFormQuestionnaireInfos(e.target.id.split("_")[1]); + window.location.assign("#questionnaires"); + }); + } + } + } + }; + + xhrNextQuestionnaires.setRequestHeader("Authorization", "Bearer " + user.token); + xhrNextQuestionnaires.send(); + }; + + showNextQuestionnaires(); // Aide saisie classement du quiz + + inputClassification.addEventListener("input", function (e) { + divResponse.innerHTML = ""; + var tags = inputClassification.value.split(","); + tags.reverse(); + var lastTag = tags[0].trim(); + + if (lastTag.length >= 2) { + // à revoir : importer la liste des tags lors de l'initialisation pour éviter les appels multiples + // mais dans ce cas actualiser cette liste après chaque mise à jour. + var xhrSearchTags = new XMLHttpRequest(); + xhrSearchTags.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.questionnaireRoutes + config.tagsSearchRoute); + + xhrSearchTags.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var response = JSON.parse(this.responseText); + + if (this.status === 200 && Array.isArray(response)) { + helpClassification.innerHTML = ""; + + for (var i in response) { + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(helpClassification, "a", response[i].name, "#tag" + response[i].id, ["information"], { + href: "#tag" + response[i].id + }, false); + document.getElementById("#tag" + response[i].id).addEventListener("click", function (e) { + e.preventDefault(); + tags[0] = e.target.innerHTML; + tags.reverse(); + inputClassification.value = tags.join(","); + }); + } + } + } + }; + + xhrSearchTags.setRequestHeader("Content-Type", "application/json"); + xhrSearchTags.setRequestHeader("Authorization", "Bearer " + user.token); + xhrSearchTags.send(JSON.stringify({ + search: lastTag + })); + } + }); // Traitement de l'envoi du formulaire des infos de base du quiz + + formQuestionnaire.addEventListener("submit", function (e) { + e.preventDefault(); + divResponse.innerHTML = ""; + var datas = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["getDatasFromInputs"])(formQuestionnaire); + var xhrQuestionnaireDatas = new XMLHttpRequest(); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.id) && datas.deleteOk !== undefined) xhrQuestionnaireDatas.open("DELETE", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.questionnaireRoutes + "/" + datas.id);else if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.id)) xhrQuestionnaireDatas.open("PUT", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.questionnaireRoutes + "/" + datas.id);else xhrQuestionnaireDatas.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.questionnaireRoutes + "/"); + + xhrQuestionnaireDatas.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var response = JSON.parse(this.responseText); + + if (this.status === 201 && response.id != undefined) { + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.addOkMessage, "", ["success"]); + datas.id = response.id; + showNextQuestionnaires(); // peut avoir évolué suivant ce qui s'est passé + } else if (this.status === 200 && response.message != undefined) { + if (Array.isArray(response.message)) response.message = response.message.join("
    ");else response.message = response.message; + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", response.message, "", ["success"]); + showNextQuestionnaires(); // peut avoir évolué suivant ce qui s'est passé + } else if (response.errors) { + if (Array.isArray(response.errors)) response.errors = response.errors.join("
    ");else response.errors = txt.serverError; + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", response.errors, "", ["error"]); + } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]); + + if (datas.deleteOk === undefined) showFormQuestionnaireInfos(datas.id);else formQuestionnaire.reset(); + } + }; + + xhrQuestionnaireDatas.setRequestHeader("Content-Type", "application/json"); + xhrQuestionnaireDatas.setRequestHeader("Authorization", "Bearer " + user.token); + if (datas) xhrQuestionnaireDatas.send(JSON.stringify(datas)); + }); // L'envoi des données d'un lien peut être généré par le bouton formulaire ou par le lien supprimer + + sendLinkForm = function sendLinkForm() { + var divResponseLink = document.getElementById("responseLink"); + divResponseLink.innerHTML = ""; + var datas = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["getDatasFromInputs"])(formLink); + var xhrLinkDatas = new XMLHttpRequest(); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.id) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.deleteOk)) xhrLinkDatas.open("DELETE", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.linksRoute + datas.id);else if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.id)) xhrLinkDatas.open("PUT", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.linksRoute + datas.id);else xhrLinkDatas.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.linksRoute); + + xhrLinkDatas.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var response = JSON.parse(this.responseText); + + if ((this.status === 200 || this.status === 201) && response.message != undefined && response.questionnaire != undefined) { + if (Array.isArray(response.message)) response.message = response.message.join("
    ");else response.message = response.message; + showLinkInfos(response.questionnaire.Links); // le serveur me retourne une version actualisée de la liste des liens + + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divLinks, "p", response.message, "", ["success"], "", false); + hideAllForms(); + window.location.assign("#linksList"); + showNextQuestionnaires(); // peut avoir évolué suivant ce qui s'est passé + } else if (response.errors) { + if (Array.isArray(response.errors)) response.errors = response.errors.join("
    ");else response.errors = txt.serverError; + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponseLink, "p", response.errors, "", ["error"]); + } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponseLink, "p", txt.serverError, "", ["error"]); + } + }; + + xhrLinkDatas.setRequestHeader("Content-Type", "application/json"); + xhrLinkDatas.setRequestHeader("Authorization", "Bearer " + user.token); + xhrLinkDatas.send(JSON.stringify(datas)); + }; + + formLink.addEventListener("submit", function (e) { + e.preventDefault(); + sendLinkForm(); + }); // L'envoi des données d'un lien peut être généré par le bouton formulaire ou par le lien supprimer + + sendIllustrationForm = function sendIllustrationForm() { + var divResponseIllustration = document.getElementById("responseIllustration"); + divResponseIllustration.innerHTML = ""; + var datas = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["getDatasFromInputs"])(formIllustration); + var datasWithFiles = new FormData(formIllustration); // il me manque les informations du fichier avec ma fonction getDatasFromInputs + + var xhrIllustrationDatas = new XMLHttpRequest(); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.id) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.deleteOk)) xhrIllustrationDatas.open("DELETE", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.illustrationsRoute + datas.id);else if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.id)) xhrIllustrationDatas.open("PUT", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.illustrationsRoute + datas.id);else xhrIllustrationDatas.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.illustrationsRoute); + + xhrIllustrationDatas.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var response = JSON.parse(this.responseText); + + if ((this.status === 200 || this.status === 201) && response.message != undefined && response.questionnaire != undefined) { + if (Array.isArray(response.message)) response.message = response.message.join("
    ");else response.message = response.message; + showIllustrationInfos(response.questionnaire.Illustrations); // le serveur me retourne une version actualisée de la liste des liens + + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divIllustrations, "p", response.message, "", ["success"], "", false); + hideAllForms(); + window.location.assign("#illustrationsList"); + showNextQuestionnaires(); // peut avoir évolué suivant ce qui s'est passé + } else if (response.errors) { + if (Array.isArray(response.errors)) response.errors = response.errors.join("
    ");else response.errors = txt.serverError; + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponseIllustration, "p", response.errors, "", ["error"]); + } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponseIllustration, "p", txt.serverError, "", ["error"]); + } + }; + + xhrIllustrationDatas.setRequestHeader("Authorization", "Bearer " + user.token); + xhrIllustrationDatas.send(datasWithFiles); + }; + + formIllustration.addEventListener("submit", function (e) { + e.preventDefault(); + sendIllustrationForm(); + }); // L'envoi des données d'une question et de ses réponse qui peut être généré par le bouton submit ou par le lien supprimer + + sendQuestionForm = function sendQuestionForm() { + var divResponseQuestion = document.getElementById("responseQuestion"); + divResponseQuestion.innerHTML = ""; + var datas = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["getDatasFromInputs"])(formQuestion); + var xhrQuestionDatas = new XMLHttpRequest(); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.id) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.deleteOk)) xhrQuestionDatas.open("DELETE", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.questionsRoute + datas.id);else if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.id)) xhrQuestionDatas.open("PUT", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.questionsRoute + datas.id);else xhrQuestionDatas.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.questionsRoute); + + xhrQuestionDatas.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var response = JSON.parse(this.responseText); + + if ((this.status === 200 || this.status === 201) && response.message != undefined && response.questionnaire != undefined) { + if (Array.isArray(response.message)) response.message = response.message.join("
    ");else response.message = response.message; + showQuestionInfos(response.questionnaire.Questions); // le serveur me retourne une version actualisée de la liste des questions + + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divQuestions, "p", response.message, "", ["success"], "", false); + hideAllForms(); + window.location.assign("#questionsList"); + showNextQuestionnaires(); // peut avoir évolué suivant ce qui s'est passé + } else if (response.errors) { + if (Array.isArray(response.errors)) response.errors = response.errors.join("
    ");else response.errors = txt.serverError; + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponseQuestion, "p", response.errors, "", ["error"]); + } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponseQuestion, "p", txt.serverError, "", ["error"]); + } + }; + + xhrQuestionDatas.setRequestHeader("Content-Type", "application/json"); + xhrQuestionDatas.setRequestHeader("Authorization", "Bearer " + user.token); + xhrQuestionDatas.send(JSON.stringify(datas)); + }; + + formQuestion.addEventListener("submit", function (e) { + e.preventDefault(); + sendQuestionForm(); + }); + } + + case 12: + _context.next = 18; + break; + + case 14: + _context.prev = 14; + _context.t0 = _context["catch"](0); + console.error(_context.t0); + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "p", txt.serverError, "", ["error"]); + + case 18: + case "end": + return _context.stop(); + } + } + }, _callee, null, [[0, 14]]); + })); + + return function initialise() { + return _ref.apply(this, arguments); + }; +}(); + +initialise(); + +/***/ }), + +/***/ "./src/tools/clientstorage.js": +/*!************************************!*\ + !*** ./src/tools/clientstorage.js ***! + \************************************/ +/*! exports provided: saveLocaly, getLocaly, removeLocaly */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveLocaly", function() { return saveLocaly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaly", function() { return getLocaly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeLocaly", function() { return removeLocaly; }); +// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.) +// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie +var saveLocaly = function saveLocaly(name, data) { + localStorage.setItem(name, JSON.stringify(data)); +}; +var getLocaly = function getLocaly(name) { + var json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name); +}; +var removeLocaly = function removeLocaly(name) { + localStorage.removeItem(name); +}; + +/***/ }), + +/***/ "./src/tools/dom.js": +/*!**************************!*\ + !*** ./src/tools/dom.js ***! + \**************************/ +/*! exports provided: addElement */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addElement", function() { return addElement; }); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__); +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + + // Fonction associant les attributs fournis à un champ de formulaire + +var addElement = function addElement(eltParent, eltType) { + var eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; + var eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; + var eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : []; + var eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; + var replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true; + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltType) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltParent)) return false;else { + var newElement = document.createElement(eltType); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ? + newElement.id = eltId; + + if (Array.isArray(eltClass) && eltClass.length != 0) { + for (var i in eltClass) { + newElement.classList.add(eltClass[i]); + } + } + + if (_typeof(eltAttributes) === "object") // !! tous les objets ne sont pas ok + { + for (var attributName in eltAttributes) { + newElement.setAttribute(attributName, eltAttributes[attributName]); + } + } + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltContent)) newElement.innerHTML = eltContent.replace(/\n/g, "
    "); // innerHTML permet d'ajouter du texte ayant lui-même des balises, etc. + + if (replace) eltParent.innerHTML = ""; + eltParent.appendChild(newElement); + } +}; + +/***/ }), + +/***/ "./src/tools/everywhere.js": +/*!*********************************!*\ + !*** ./src/tools/everywhere.js ***! + \*********************************/ +/*! exports provided: helloDev, updateAccountLink */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "helloDev", function() { return helloDev; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateAccountLink", function() { return updateAccountLink; }); +// Ce script fournit des fonctions utilisées sur toutes les pages du site +var helloDev = function helloDev() { + console.log("**** Hello ami développeur :-)\n Le code de WikiLerni est libre et est lisible sur gitlab : \n Bonne lecture :-) \n Pour les suggestions d'amélioration ou questions : dev@wililerni.com ****"); + return true; +}; +var updateAccountLink = function updateAccountLink(status, configTemplate) { + var link = document.getElementById("accountHeadLink"); + var homePage = status + "HomePage"; + link.href = "/" + configTemplate[homePage]; +}; + +/***/ }), + +/***/ "./src/tools/forms.js": +/*!****************************!*\ + !*** ./src/tools/forms.js ***! + \****************************/ +/*! exports provided: setAttributesToInputs, getDatasFromInputs, empyForm, empyAndHideForm */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setAttributesToInputs", function() { return setAttributesToInputs; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDatasFromInputs", function() { return getDatasFromInputs; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empyForm", function() { return empyForm; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empyAndHideForm", function() { return empyAndHideForm; }); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__); +function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + + // Fonction associant les attributs fournis à un champ de formulaire + +var setAttributesToInputs = function setAttributesToInputs(inputsConf, myForm) { + for (var i in myForm.elements) { + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(myForm.elements[i].id)) { + var idInput = myForm.elements[i].id; + + if (inputsConf[idInput] !== undefined) { + var inputHTML = document.getElementById(idInput); + + for (var attribute in inputsConf[idInput]) { + inputHTML.setAttribute(attribute, inputsConf[idInput][attribute]); + } + } + } + } + + return true; +}; // Récupère toutes les valeurs de champs en omettant les checkbox non cochées, etc. + +var getDatasFromInputs = function getDatasFromInputs(myForm) { + var datas = {}; + var formData = new FormData(myForm); + + var _iterator = _createForOfIteratorHelper(formData.entries()), + _step; + + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var entrie = _step.value; + datas[entrie[0]] = entrie[1]; + } + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); + } + + return datas; +}; // Vide tous les champs d'un formulaire, y compris hidden, checkbox, etc. +// Revoir pour les select + +var empyForm = function empyForm(myForm) { + var formData = new FormData(myForm); + + var _iterator2 = _createForOfIteratorHelper(formData.entries()), + _step2; + + try { + for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { + var entrie = _step2.value; + if (myForm.elements[entrie[0]].type == "checkbox" || myForm.elements[entrie[0]].type == "radio") myForm.elements[entrie[0]].checked = false;else myForm.elements[entrie[0]].value = ""; + } + } catch (err) { + _iterator2.e(err); + } finally { + _iterator2.f(); + } + + return true; +}; // Vide et cache le formulaire + +var empyAndHideForm = function empyAndHideForm(myForm) { + empyForm(myForm); + myForm.style.display = "none"; +}; + +/***/ }), + +/***/ "./src/tools/url.js": +/*!**************************!*\ + !*** ./src/tools/url.js ***! + \**************************/ +/*! exports provided: getUrlParams */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getUrlParams", function() { return getUrlParams; }); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__); + // Fonction récupérant les paramètres passés par l'url + +var getUrlParams = function getUrlParams() { + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(location.search)) return false; + var parameters = location.search.substring(1).split("&"); + if (!Array.isArray(parameters) || parameters.length === 0) return false; + var param, + datas = {}; + + for (var i in parameters) { + param = parameters[i].split("="); + if (param.length === 2) datas[param[0]] = decodeURI(param[1]); + } + + return datas; +}; + +/***/ }), + +/***/ "./src/tools/users.js": +/*!****************************!*\ + !*** ./src/tools/users.js ***! + \****************************/ +/*! exports provided: getConfig, getTimeDifference, getPassword, setSession, checkAnswerDatas, checkSession */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getConfig", function() { return getConfig; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTimeDifference", function() { return getTimeDifference; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getPassword", function() { return getPassword; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setSession", function() { return setSession; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkAnswerDatas", function() { return checkAnswerDatas; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkSession", function() { return checkSession; }); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/instance.js */ "../config/instance.js"); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../config/users.js */ "../config/users.js"); +/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_3__); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + + +var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0]; + +var configTemplate = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); + + + + // Récupère les données de configuration des utilisateurs +// À terme, un fichier statique importable comme module devrait éviter une requête ajax + +var getConfig = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + return _context.abrupt("return", new Promise(function (resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + "/user/getconfig"); + + xhr.onload = function () { + return resolve(JSON.parse(xhr.responseText)); + }; + + xhr.onerror = function () { + return reject(xhr.statusText); + }; + + xhr.send(); + })); + + case 1: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + + return function getConfig() { + return _ref.apply(this, arguments); + }; +}(); +var getTimeDifference = function getTimeDifference() { + var timeLocal = new Date().getTimezoneOffset(); + if (timeLocal > _config_users_js__WEBPACK_IMPORTED_MODULE_1__["timeDifferenceMax"] || timeLocal < _config_users_js__WEBPACK_IMPORTED_MODULE_1__["timeDifferenceMin"]) return 0;else return timeLocal; +}; // On enlève volontairement les 0/O pour éviter les confusions ! +// Et mieux vaut aussi débuter et finir par une lettre simple. + +var getPassword = function getPassword(nbCarMin, nbCarMax) { + var nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin)); + var letters = "ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz"; + var others = "123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ"; + var password = letters[Math.floor(Math.random() * letters.length)]; + + for (var i = 1; i < nbCar - 1; i++) { + if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)]; + } + + password += letters[Math.floor(Math.random() * letters.length)]; + return password; +}; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite +// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides. + +var setSession = function setSession(userId, token, durationTS) { + var storageUser = { + id: userId, + token: token, + duration: durationTS + }; + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("user", storageUser); +}; // Vérifie qu'il y a des données locales concernant le résultat d'un quiz +// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas + +var checkAnswerDatas = function checkAnswerDatas(datas) { + var lastAnswer = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("lastAnswer"); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(lastAnswer)) { + var answer = JSON.parse(lastAnswer); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.duration) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbCorrectAnswers) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.QuestionnaireId) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbQuestions)) { + datas.duration = answer.duration; + datas.nbCorrectAnswers = answer.nbCorrectAnswers; + datas.QuestionnaireId = answer.QuestionnaireId; + datas.nbQuestions = answer.nbQuestions; + } + } + + return datas; +}; // Cette fonction teste la connexion de l'utilisateur d'une page +// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté + +var checkSession = /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() { + var status, + urlRedirection, + message, + urlWanted, + _args2 = arguments; + return regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + status = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : []; + urlRedirection = _args2.length > 1 ? _args2[1] : undefined; + message = _args2.length > 2 ? _args2[2] : undefined; + urlWanted = _args2.length > 3 ? _args2[3] : undefined; + return _context2.abrupt("return", new Promise(function (resolve, reject) { + var userDatas = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("user"); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(userDatas)) { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else { + var user = JSON.parse(userDatas); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.id) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.token) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.duration) || user.duration < Date.now()) { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else { + var xhr = new XMLHttpRequest(); + xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["userRoutes"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["checkLoginRoute"] + user.token); + + xhr.onload = function () { + var response = JSON.parse(xhr.responseText); + + if (xhr.status === 200 && response.isValid && response.id != undefined) { + if (response.id === user.id) { + user.name = response.name; + user.language = response.language; + user.timeDifference = response.timeDifference; + user.status = response.status; // le token et de toute façon vérifier à chaque requête à l'API + + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("user", user); // si il s'agit d'un "user" et que son abonnement a expiré, je le redirige vers la caisse :-) + + if (response.status === "user" && response.nbDaysOk <= 0) { + var urlAccount = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["siteUrl"] + "/" + configTemplate[lang].accountPage; + if (window.location.href.indexOf(urlAccount) === -1) window.location.assign("/" + configTemplate[lang].accountPage); // passée directement ici, l'ancre #subscribe ne fonctionne pas !? + + resolve(true); + } else { + if (status.length !== 0 && status.indexOf(response.status) === -1) { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else resolve(true); + } + } else { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + } else { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + }; + + xhr.onerror = function () { + return reject(xhr.statusText); + }; + + xhr.send(); + } + } + })); + + case 5: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + + return function checkSession() { + return _ref2.apply(this, arguments); + }; +}(); // Cette fonction sert à la précédente en cas de connexion non valide + +var redirectUser = function redirectUser(urlRedirection, message, urlWanted) { + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(message)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("message", message); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlWanted)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("url", urlWanted); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlRedirection)) window.location.assign(urlRedirection); +}; + +/***/ }) + +/******/ }); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9nZW5lcmFsJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL2lsbHVzdHJhdGlvbiQiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9saW5rJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3F1ZXN0aW9uJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3F1ZXN0aW9ubmFpcmUkIiwid2VicGFjazovLy8uLi9sYW5nIHN5bmMgXlxcLlxcLy4qXFwvdXNlciQiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcvZnIvZ2VuZXJhbC5qcyIsIndlYnBhY2s6Ly8vLi4vbGFuZy9mci9pbGx1c3RyYXRpb24uanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcvZnIvbGluay5qcyIsIndlYnBhY2s6Ly8vLi4vbGFuZy9mci9xdWVzdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi4vbGFuZy9mci9xdWVzdGlvbm5haXJlLmpzIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL3VzZXIuanMiLCJ3ZWJwYWNrOi8vLy4uL3Rvb2xzL21haW4uanMiLCJ3ZWJwYWNrOi8vLy4uL3ZpZXdzIHN5bmMgXlxcLlxcLy4qXFwuanMkIiwid2VicGFjazovLy8uLi92aWV3cy9kZWZhdWx0L2NvbmZpZy9mci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvbWFuYWdlUXVlc3Rpb25uYWlyZXMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2RvbS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvZXZlcnl3aGVyZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvZm9ybXMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL3VybC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvdXNlcnMuanMiXSwibmFtZXMiOlsidXNlcnMiLCJyZXF1aXJlIiwicXVlc3Rpb25uYWlyZXMiLCJtb2R1bGUiLCJleHBvcnRzIiwiYXBpVXJsIiwic2l0ZVVybCIsImFkbWluTmFtZSIsImFkbWluRW1haWwiLCJzZW5kZXJOYW1lIiwic2VuZGVyRW1haWwiLCJhZG1pbkxhbmciLCJ0aGVtZSIsImF2YWlsYWJsZUxhbmdzIiwic2l0ZU5hbWUiLCJiZWdpbkNvZGVHb2RmYXRoZXIiLCJjcm9uVGltaW5nQWxlcnRJblNlY29uZGUiLCJyZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlIiwidG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnMiLCJ0b2tlbkxvZ2luTGlua1RpbWVJbkhvdXJzIiwidG9rZW5Db25uZXhpb25NaW5UaW1lSW5Ib3VycyIsInRva2VuQ29ubmV4aW9uTWF4VGltZUluRGF5cyIsInRva2VuTG9naW5DaGFuZ2luZ1RpbWVJbkhvdXJzIiwidG9rZW5EZWxldGVVc2VyVGltZUluSG91cnMiLCJ0b2tlblVuc3Vic2NyaWJlTGlua1RpbWVJbkRheXMiLCJmcmVlQWNjb3VudFRpbWluZ0luRGF5cyIsImZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5cyIsImFjY291bnRFeHBpcmF0aW9uRmlyc3ROb3RpZmljYXRpb25JbkRheXMiLCJhY2NvdW50RXhwaXJhdGlvblNlY29uZE5vdGlmaWNhdGlvbkluRGF5cyIsImluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5cyIsIm5iUXVlc3Rpb25zTWluIiwibmJRdWVzdGlvbnNNYXgiLCJuYkNob2ljZXNNYXgiLCJuYk5ld1F1ZXN0aW9ubmFpcmVzIiwiaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlQmVnaW4iLCJob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQiLCJudW1iZXJOZXdRdWVzdGlvbm5haXJlQXRTYW1lVGltZSIsIm1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzIiwibmJJbGx1c3RyYXRpb25zTWluIiwibmJJbGx1c3RyYXRpb25zTWF4IiwibWF4SWxsdXN0cmF0aW9uU2l6ZWluT2N0ZXQiLCJtaW1lVHlwZXNGb3JJbGx1c3RyYXRpb24iLCJpbGx1c3RyYXRpb25zV2lkdGhNYXhJblB4IiwiaWxsdXN0cmF0aW9uc01pbmlhdHVyZXNXaWR0aE1heEluUHgiLCJuYkxpbmtzTWluIiwibmJMaW5rc01heCIsInBhc3N3b3JkIiwibWlubGVuZ3RoIiwiZGlyQ2FjaGVVc2VycyIsImRpckNhY2hlVXNlcnNBbnN3ZXJzIiwiZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyIsImRpckNhY2hlUXVlc3Rpb25zIiwiZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzIiwiZGlySFRNTFF1ZXN0aW9ubmFpcmUiLCJkaXJXZWJRdWVzdGlvbm5haXJlIiwicXVlc3Rpb25uYWlyZVJvdXRlcyIsImdldFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlcyIsInB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJzYXZlQW5zd2Vyc1JvdXRlIiwiZ2V0U3RhdHNRdWVzdGlvbm5haXJlcyIsInNlYXJjaFF1ZXN0aW9ubmFpcmVzUm91dGUiLCJzZWFyY2hBZG1pblF1ZXN0aW9ubmFpcmVzUm91dGUiLCJnZXRMaXN0TmV4dFF1ZXN0aW9ubmFpcmVzIiwicXVlc3Rpb25zUm91dGUiLCJ0YWdzU2VhcmNoUm91dGUiLCJnZXRRdWVzdGlvbm5haXJlc1dpdGhvdXRBbnN3ZXIiLCJnZXRQcmV2aW91c0Fuc3dlcnMiLCJnZXRTdGF0c0Fuc3dlcnMiLCJnZXRBZG1pblN0YXRzIiwiUXVlc3Rpb25uYWlyZSIsInRpdGxlIiwibWF4bGVuZ3RoIiwicmVxdWlyZWQiLCJzbHVnIiwiaW50cm9kdWN0aW9uIiwic2VhcmNoUXVlc3Rpb25uYWlyZXMiLCJRdWVzdGlvbiIsInRleHQiLCJyYW5rIiwibWluIiwiZGVmYXVsdFZhbHVlIiwiQ2hvaWNlIiwibmJUYWdzTWluIiwibmJUYWdzTWF4IiwiZGlyQ2FjaGVUYWdzIiwiZGlySFRNTFRhZ3MiLCJkaXJXZWJUYWdzIiwidXNlclJvdXRlcyIsInN1YnNjcmliZVJvdXRlIiwiZ2V0R29kZmF0aGVyUm91dGUiLCJjaGVja0lmSXNFbWFpbGZyZWVSb3V0ZSIsImNoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZSIsImNoZWNrTG9naW5Sb3V0ZSIsImNvbm5lY3Rpb25Sb3V0ZSIsImdldExvZ2luTGlua1JvdXRlIiwiY29ubmVjdGlvbldpdGhMaW5rUm91dGUiLCJnZXRVc2VySW5mb3MiLCJjcmVhdGVVc2VyUm91dGUiLCJ2YWxpZGF0ZVVzZXJSb3V0ZSIsInVwZGF0ZVVzZXJJbmZvcyIsInNlYXJjaFVzZXJSb3V0ZSIsImdldEdvZENoaWxkcyIsImNoZWNrTmV3TG9naW5MaW5rUm91dGUiLCJjaGVja0RlbGV0ZUxpbmtSb3V0ZSIsImdldFBheW1lbnRzIiwidW5zdWJzY3JpYmVSb3V0ZSIsIm5hbWUiLCJlbWFpbCIsIm5ld1Bhc3N3b3JkIiwiY29kZUdvZGZhdGhlciIsImNndU9rIiwidmFsdWUiLCJ0aW1lRGlmZmVyZW5jZU1pbiIsInRpbWVEaWZmZXJlbmNlTWF4Iiwic2l0ZUhUTUxUaXRsZSIsInNpdGVNZXRhRGVzY3JpcHRpb24iLCJzY3JpcHRUaW1pbmdJbmZvIiwic2NyaXB0VGltaW5nQWxlcnQiLCJzZXJ2ZXJFcnJvciIsInNlcnZlckVycm9yQWRtaW4iLCJuZWVkZWRQYXJhbXMiLCJiYWRVcmwiLCJub3RWYWxpZEZvcm1hdCIsIm5vdEFsbG93ZWQiLCJub3RSZXF1aXJlZCIsInVwZGF0ZUJ0blR4dCIsImFkZEJ0blR4dCIsImRlbGV0ZUJ0blR4dCIsImFkZE9rTWVzc2FnZSIsInVwZGF0ZU9rTWVzc2FnZSIsImRlbGV0ZU9rTWVzc2FnZSIsImZhaWxBdXRoIiwiZmFpbEF1dGhIZWFkZXIiLCJmYWlsQXV0aFRva2VuIiwiZmFpbEF1dGhJZCIsImZhaWxBdXRoQ3JvbiIsInByZXZpb3VzUGFnZSIsIm5leHRQYWdlIiwiYnRuTGlua1RvUXVlc3Rpb25uYWlyZSIsInN0YXRzQWRtaW4iLCJuZWVkVXJsIiwibmVlZFVuaXF1ZVVybCIsIm5lZWRHb29kTG9uZ1VybCIsIm5lZWRHb29kTG9uZ0FsdCIsIm5lZWRHb29kTG9uZ1RpdGxlIiwibmVlZEdvb2RMb25nQ2FwdGlvbiIsIm5lZWRHb29kRmlsZSIsIm5lZWRRdWVzdGlvbm5haXJlRm9ySWxsdXN0cmF0aW9uIiwibmVlZE1heElsbHVzdHJhdGlvbnNGb3JRdWVzdGlvbm5haXJlIiwibm90Rm91bmQiLCJhZGRlZE9rTWVzc2FnZSIsInVwZGF0ZWRPa01lc3NhZ2UiLCJkZWxldGVkT2tNZXNzYWdlIiwiZGVmYXVsdEFsdCIsImludHJvVGl0bGUiLCJpbnRyb05vSWxsdXN0cmF0aW9uIiwibmVlZFZhbGlkVXJsIiwibmVlZE5vdFRvb0xvbmdVcmwiLCJuZWVkQW5jaG9yIiwibmVlZEdvb2RMb25nQW5jaG9yIiwibmVlZFF1ZXN0aW9ubmFpcmUiLCJuZWVkTWF4TGlua3NGb3JRdWVzdGlvbm5haXJlIiwiaW50cm9Ob0xpbmsiLCJuZWVkVGV4dCIsIm5lZWROb3RUb29Mb25nVGV4dCIsIm5lZWRNYXhRdWVzdGlvbnMiLCJpbnRyb05vUXVlc3Rpb24iLCJuZWVkTnVtYmVyRm9yUmFuayIsIm5lZWRUaXRsZSIsIm5lZWROb3RUb29Mb25nVGl0bGUiLCJuZWVkSW50cm9kdWN0aW9uIiwibmVlZENvcnJlY3RQdWJsaXNoaW5nRGF0ZSIsIm5lZWRLbm93SWZJc1B1Ymxpc2hlZCIsIm5lZWRMYW5ndWFnZSIsIm5lZWRFc3RpbWF0ZWRUaW1lIiwic2VhcmNoUmVzdWx0VGl0bGUiLCJzZWFyY2hOb1Jlc3VsdCIsInNlYXJjaFdpdGhSZXN1bHQiLCJwdWJsaXNoZWRCeSIsInB1Ymxpc2hlZEF0IiwibGFzdFVwZGF0ZWQiLCJlc3RpbWF0ZWRUaW1lIiwiYnRuU2VuZFJlc3BvbnNlIiwiYnRuUHJvcG9zZVN1YnNjcmliZSIsImJ0blByb3Bvc2VDb25uZWN0aW9uIiwiYnRuU2hvd1F1ZXN0aW9ubmFpcmUiLCJuZXh0UXVlc3Rpb25uYWlyZXNMaXN0IiwibmVlZEJlQ29tcGxldGVkIiwibmV4dERhdGVXaXRob3V0UXVlc3Rpb25uYWlyZSIsImhhdmVCZWVuUHVibGlzaGVkIiwibmVlZE5hbWUiLCJuZWVkTm90VG9vTG9uZ05hbWUiLCJuZWVkRW1haWwiLCJuZWVkVW5pcXVlRW1haWwiLCJuZWVkTm90VG9vTG9uZ0VtYWlsIiwibmVlZFBhc3NXb3JkIiwibmVlZExvbmdQYXNzV29yZCIsInBhc3N3b3JkQ29waWVkIiwibmVlZFN0YXR1cyIsIm5lZWRWYWxpZExhc3RDb25uZWN0aW9uRGF0ZSIsIm5lZWRTTVRQIiwibmVlZFNNVFBOb3RGb3VuZCIsIm5lZWRLbm93TmV3c2xldHRlck9rIiwibmVlZFRpbWVEaWZmZXJlbmNlIiwibmVlZE1pblRpbWVEaWZmZXJlbmNlIiwibmVlZE1heFRpbWVEaWZmZXJlbmNlIiwibmVlZFVHQ09rIiwiZ29kZmF0aGVyTm90Rm91bmQiLCJnb2RmYXRoZXJGb3VuZCIsIm1haWxWYWxpZGF0aW9uTWVzc2FnZSIsIm1haWxWYWxpZGF0aW9uTGlua1N1YmplY3QiLCJtYWlsVmFsaWRhdGlvbkxpbmtTQm9keVR4dCIsIm1haWxWYWxpZGF0aW9uTGlua1NCb2R5SFRNTCIsInZhbGlkYXRpb25NZXNzYWdlIiwidmFsaWRhdGlvbk1lc3NhZ2VBZG1pbiIsInZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZSIsInZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZUFkbWluIiwibWFpbFdlbGNvbWVTdWJqZWN0IiwibWFpbFdlbGNvbWVCb2R5VHh0IiwibWFpbFdlbGNvbWVCb2R5SFRNTCIsIm1haWxUaGFua0dvZGZhdGhlclN1YmplY3QiLCJtYWlsVGhhbmtHb2RmYXRoZXJCb2R5VHh0IiwibWFpbFRoYW5rR29kZmF0aGVyQm9keUhUTUwiLCJiYWRMaW5rVmFsaWRhdGlvbk1lc3NhZ2UiLCJlbWFpbE5vdEZvdW5kIiwiYWxyZWFkeUNvbm5lY3RlZCIsIm5lZWRCZUNvbm5lY3RlZCIsImNvbm5lY3Rpb25PayIsIm5lZWRDaG9vc2VMb2dpbldheSIsIm5lZWRWYWxpZGF0aW9uVG9Mb2dpbiIsInRvb01hbnlMb2dpbkZhaWxzIiwiYmFkUGFzc3dvcmQiLCJtYWlsTG9naW5MaW5rU3ViamVjdCIsIm1haWxMb2dpbkxpbmtCb2R5VHh0IiwibWFpbExvZ2luTGlua0JvZHlIVE1MIiwibWFpbExvZ2luTGlua01lc3NhZ2UiLCJ1cGRhdGVkTmVlZEdvb2RFbWFpbCIsInVwZGF0ZWROZWVkVW5pcXVlRW1haWwiLCJtYWlsVXBkYXRlTG9naW5TdWJqZWN0IiwibWFpbFVwZGF0ZUxvZ2luQm9keVR4dCIsIm1haWxVcGRhdGVMb2dpbkJvZHlIVE1MIiwibWFpbFVwZGF0ZUxvZ2luTGlua01lc3NhZ2UiLCJ1cGRhdGVkTmVlZFZhbGlkYXRlZFVzZXIiLCJ1cGRhdGVkTmVlZEdvb2RHb2RmYXRoZXIiLCJtYWlsVXBkYXRlTG9naW5Pa01lc3NhZ2UiLCJ1cGRhdGVkRmFpbGVkR29kZmF0aGVyTm90Rm91bmQiLCJjcmVhdGlvbk9rTWVzc2FnZSIsIm1haWxEZWxldGVTdWJqZWN0IiwibWFpbERlbGV0ZUJvZHlUeHQiLCJtYWlsRGVsZXRlQm9keUhUTUwiLCJtYWlsRGVsZXRlTGlua01lc3NhZ2UiLCJkZWxldGVGYWlsTWVzc2FnZSIsIm1haWxEZWxldGVMaW5rT2tNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtBbHJlYWR5TWVzc2FnZSIsIm1haWxEZWxldGVMaW5rRmFpbE1lc3NhZ2UiLCJjcm9uRGVsZXRlVW52YWxpZGVkVXNlcnNNZXNzYWdlIiwiZGVsZXRlSW5hY3RpdmVVc2Vyc01lc3NhZ2UiLCJ3ZWxjb21lTWVzc2FnZSIsImJ5ZWJ5ZU1lc3NhZ2UiLCJpbmZvc1VzZXJGb3JBZG1pbiIsImluZm9zQWRtaW5Hb2RmYXRoZXIiLCJpbmZvc0FkbWluTmJHb2RDaGlsZHMiLCJUb29sIiwibXlWYXIiLCJ1bmRlZmluZWQiLCJ0cmltIiwibXlTdHJpbmciLCJpc0VtcHR5IiwibWF4IiwibGVuZ3RoIiwic3Vic3RyaW5nIiwibWFwT2JqIiwicmVwbGFjZUVsdHMiLCJSZWdFeHAiLCJPYmplY3QiLCJrZXlzIiwiam9pbiIsInJlcGxhY2UiLCJtYXRjaGVkIiwiTWF0aCIsImNlaWwiLCJmbG9vciIsInJhbmRvbSIsImRhdGVTdHJpbmciLCJsYW5nIiwibXlEYXRlIiwiRGF0ZSIsIm15RGF5IiwiZ2V0RGF0ZSIsIm15TW91bnRoIiwiZ2V0TW9udGgiLCJteVllYXIiLCJnZXRGdWxsWWVhciIsImhlYWRMaW5rcyIsImFuY2hvciIsImF0dHJpYnV0ZXMiLCJocmVmIiwiaWQiLCJmb290TGlua3MiLCJyZWwiLCJtYXhRdWVzdGlvbm5haXJlc0J5UGFnZSIsInVzZXJIb21lUGFnZSIsImFkbWluSG9tZVBhZ2UiLCJtYW5hZ2VySG9tZVBhZ2UiLCJzdWJzY3JpYmVQYWdlIiwiY29ubmVjdGlvblBhZ2UiLCJhY2NvdW50UGFnZSIsInF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2UiLCJ1c2Vyc01hbmFnZW1lbnRQYWdlIiwibmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSIsImlsbHVzdHJhdGlvbkRpciIsInNpdGVTbG9nYW4iLCJob21lVGl0bGUxIiwiaG9tZVAxIiwiaG9tZVRpdGxlMiIsImhvbWVQMiIsIm5ld1F1ZXN0aW9ubmFpcmVzVGl0bGUiLCJuZXdRdWVzdGlvbm5haXJlc0ludHJvIiwiZXhwbGFuYXRpb25UaXRsZSIsImV4cGxhbmF0aW9uVHh0Iiwibm9KU05vdGlmaWNhdGlvbiIsImNvbmZpZ0Zyb250RW5kIiwidHh0IiwidHh0VXNlcnMiLCJ0eHRRdWVzdGlvbm5haXJlIiwidHh0UXVlc3Rpb24iLCJ0eHRMaW5rIiwidHh0SWxsdXN0cmF0aW9uIiwiaGVsbG9EZXYiLCJkaXZNYWluIiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImRpdk1lc3NhZ2UiLCJkaXZSZXNwb25zZSIsImZvcm1RdWVzdGlvbm5haXJlIiwiaW5wdXRDbGFzc2lmaWNhdGlvbiIsImhlbHBDbGFzc2lmaWNhdGlvbiIsImhlbHBQdWJsaXNoaW5nQXQiLCJkZWxldGVDaGVja0JveCIsImJ0bk5ld1F1ZXN0aW9ubmFpcmUiLCJidG5QcmV2aWV3UXVlc3Rpb25uYWlyZSIsImRpdlF1ZXN0aW9ubmFpcmVzIiwiZm9ybVNlYXJjaCIsImRpdlNlYXJjaFJlc3VsdCIsImZvcm1MaW5rIiwiZm9ybUlsbHVzdHJhdGlvbiIsImZvcm1RdWVzdGlvbiIsImRpdkxpbmtzIiwiZGl2SWxsdXN0cmF0aW9ucyIsImRpdlF1ZXN0aW9ucyIsImluaXRpYWxpc2UiLCJnZXRDb25maWciLCJjb25maWciLCJhZGRFbGVtZW50IiwiY2hlY2tTZXNzaW9uIiwibWVzc2FnZSIsImNvbG9yIiwid2luZG93IiwibG9jYXRpb24iLCJpc0Nvbm5lY3RlZCIsInN0eWxlIiwiZGlzcGxheSIsImdldExvY2FseSIsInJlbW92ZUxvY2FseSIsInVzZXIiLCJ1cGRhdGVBY2NvdW50TGluayIsInN0YXR1cyIsInNldEF0dHJpYnV0ZXNUb0lucHV0cyIsImhpZGVBbGxGb3JtcyIsImVtcHlBbmRIaWRlRm9ybSIsInNob3dMaW5rSW5mb3MiLCJMaW5rcyIsImxpc3RMaW5rcyIsImkiLCJ1cmwiLCJhZGRFdmVudExpc3RlbmVyIiwiZSIsInByZXZlbnREZWZhdWx0Iiwic2hvd0Zvcm1MaW5rSW5mb3MiLCJhc3NpZ24iLCJlbGVtZW50cyIsInNlbmRMaW5rRm9ybSIsIkxpbmsiLCJzaG93SWxsdXN0cmF0aW9uSW5mb3MiLCJJbGx1c3RyYXRpb25zIiwibGlzdElsbHVzdHJhdGlvbnMiLCJzaG93Rm9ybUlsbHVzdHJhdGlvbkluZm9zIiwic2VuZElsbHVzdHJhdGlvbkZvcm0iLCJJbGx1c3RyYXRpb24iLCJzaG93UXVlc3Rpb25JbmZvcyIsIlF1ZXN0aW9ucyIsImxpc3RRdWVzdGlvbnMiLCJzaG93Rm9ybVF1ZXN0aW9uSW5mb3MiLCJzZW5kUXVlc3Rpb25Gb3JtIiwiZGF0YSIsInJlbW92ZUF0dHJpYnV0ZSIsIkNob2ljZXMiLCJpc0NvcnJlY3QiLCJjaGVja2VkIiwic2hvd0Zvcm1RdWVzdGlvbm5haXJlSW5mb3MiLCJ4aHJHZXRJbmZvcyIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsIm9ucmVhZHlzdGF0ZWNoYW5nZSIsInJlYWR5U3RhdGUiLCJET05FIiwicmVzcG9uc2UiLCJKU09OIiwicGFyc2UiLCJyZXNwb25zZVRleHQiLCJyZXNldCIsImRhdGVGb3JtYXQiLCJUYWdzIiwiY2xhc3NpZmljYXRpb24iLCJzZXRBdHRyaWJ1dGUiLCJ0b2tlbiIsInNlbmQiLCJ1cmxEYXRhcyIsImdldFVybFBhcmFtcyIsImRhdGFzIiwiZ2V0RGF0YXNGcm9tSW5wdXRzIiwieGhyU2VhcmNoIiwiQXJyYXkiLCJpc0FycmF5Iiwic2VsZWN0SFRNTCIsInNlYXJjaFNlbGVjdCIsInNldFJlcXVlc3RIZWFkZXIiLCJzdHJpbmdpZnkiLCJzaG93TmV4dFF1ZXN0aW9ubmFpcmVzIiwieGhyTmV4dFF1ZXN0aW9ubmFpcmVzIiwibGlzdEhUTUwiLCJkYXRlUHVibGlzaGluZyIsImlzUHVibGlzaGFibGUiLCJkYXRlTmVlZGVkIiwidGFyZ2V0Iiwic3BsaXQiLCJpbm5lckhUTUwiLCJ0YWdzIiwicmV2ZXJzZSIsImxhc3RUYWciLCJ4aHJTZWFyY2hUYWdzIiwic2VhcmNoIiwieGhyUXVlc3Rpb25uYWlyZURhdGFzIiwiZGVsZXRlT2siLCJlcnJvcnMiLCJkaXZSZXNwb25zZUxpbmsiLCJ4aHJMaW5rRGF0YXMiLCJsaW5rc1JvdXRlIiwicXVlc3Rpb25uYWlyZSIsImRpdlJlc3BvbnNlSWxsdXN0cmF0aW9uIiwiZGF0YXNXaXRoRmlsZXMiLCJGb3JtRGF0YSIsInhocklsbHVzdHJhdGlvbkRhdGFzIiwiaWxsdXN0cmF0aW9uc1JvdXRlIiwiZGl2UmVzcG9uc2VRdWVzdGlvbiIsInhoclF1ZXN0aW9uRGF0YXMiLCJjb25zb2xlIiwiZXJyb3IiLCJzYXZlTG9jYWx5IiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsImpzb24iLCJnZXRJdGVtIiwicmVtb3ZlSXRlbSIsImVsdFBhcmVudCIsImVsdFR5cGUiLCJlbHRDb250ZW50IiwiZWx0SWQiLCJlbHRDbGFzcyIsImVsdEF0dHJpYnV0ZXMiLCJuZXdFbGVtZW50IiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTGlzdCIsImFkZCIsImF0dHJpYnV0TmFtZSIsImFwcGVuZENoaWxkIiwibG9nIiwiY29uZmlnVGVtcGxhdGUiLCJsaW5rIiwiaG9tZVBhZ2UiLCJpbnB1dHNDb25mIiwibXlGb3JtIiwiaWRJbnB1dCIsImlucHV0SFRNTCIsImF0dHJpYnV0ZSIsImZvcm1EYXRhIiwiZW50cmllcyIsImVudHJpZSIsImVtcHlGb3JtIiwidHlwZSIsInBhcmFtZXRlcnMiLCJwYXJhbSIsImRlY29kZVVSSSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwieGhyIiwib25sb2FkIiwib25lcnJvciIsInN0YXR1c1RleHQiLCJnZXRUaW1lRGlmZmVyZW5jZSIsInRpbWVMb2NhbCIsImdldFRpbWV6b25lT2Zmc2V0IiwiZ2V0UGFzc3dvcmQiLCJuYkNhck1pbiIsIm5iQ2FyTWF4IiwibmJDYXIiLCJsZXR0ZXJzIiwib3RoZXJzIiwic2V0U2Vzc2lvbiIsInVzZXJJZCIsImR1cmF0aW9uVFMiLCJzdG9yYWdlVXNlciIsImR1cmF0aW9uIiwiY2hlY2tBbnN3ZXJEYXRhcyIsImxhc3RBbnN3ZXIiLCJhbnN3ZXIiLCJuYkNvcnJlY3RBbnN3ZXJzIiwiUXVlc3Rpb25uYWlyZUlkIiwibmJRdWVzdGlvbnMiLCJ1cmxSZWRpcmVjdGlvbiIsInVybFdhbnRlZCIsInVzZXJEYXRhcyIsInJlZGlyZWN0VXNlciIsIm5vdyIsImlzVmFsaWQiLCJsYW5ndWFnZSIsInRpbWVEaWZmZXJlbmNlIiwibmJEYXlzT2siLCJ1cmxBY2NvdW50IiwiaW5kZXhPZiJdLCJtYXBwaW5ncyI6IjtRQUFBO1FBQ0E7O1FBRUE7UUFDQTs7UUFF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Q0FBZ0JxQixNQUFoQixDQUF1QjZJLGNBQXZCO0FBQ1AsQ0FSRCxDIiwiZmlsZSI6Ii4vSlMvbWFuYWdlUXVlc3Rpb25uYWlyZXMuYXBwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvbWFuYWdlUXVlc3Rpb25uYWlyZXMuanNcIik7XG4iLCJjb25zdCB1c2VycyA9IHJlcXVpcmUoXCIuL3VzZXJzXCIpO1xuY29uc3QgcXVlc3Rpb25uYWlyZXMgPSByZXF1aXJlKFwiLi9xdWVzdGlvbm5haXJlc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIGFwaVVybDogXCJodHRwOi8vbG9jYWxob3N0OjMwMDAvYXBpXCIsXG4gICAgc2l0ZVVybDogXCJodHRwOi8vbG9jYWxob3N0OjgwODBcIixcbiAgICBhZG1pbk5hbWU6IFwiRmFicmljZVwiLFxuICAgIGFkbWluRW1haWw6IFwiZGV2QHdpa2lsZXJuaS5jb21cIixcbiAgICBzZW5kZXJOYW1lOiBcIldpa2lMZXJuaVwiLFxuICAgIHNlbmRlckVtYWlsOiBcImJvbmpvdXJAd2lraWxlcm5pLmNvbVwiLFxuICAgIGFkbWluTGFuZzogXCJmclwiLFxuICAgIHRoZW1lOiBcImRlZmF1bHRcIiwgLy8gbGUgdGjDqG1lIHV0aWxpc8OpIChkYW5zIC92aWV3cykgcG91ciBnw6luw6lyZXIgbGVzIHBhZ2VzIEhUTUwuIENvbnRpZW50IHNlcyBwcm9wcmVzIGZpY2hpZXJzIGRlIGNvbmZpZ3VyYXRpb24uXG4gICAgYXZhaWxhYmxlTGFuZ3M6IFtcImZyXCJdLC8vIExhbmd1YWdlcyBpbiB3aGljaCB0aGUgc2l0ZSBpcyBhdmFpbGFibGUuIFRoZSBmaXJzdCBvbmUgaXMgdGhlIGRlZmF1bHQgb25lLlxuICAgIHNpdGVOYW1lOiBcIldpa2lMZXJuaVwiLFxuICAgIGJlZ2luQ29kZUdvZGZhdGhlcjogXCJ3aWtpbGVybmlcIiwgLy8gY2FzZS1zZW5zaXRpdmUgYW5kIGNhbid0IGNvbnRhaW4gXCJAXCIgIVxuICAgIGNyb25UaW1pbmdBbGVydEluU2Vjb25kZTogMTIwLCAvLyBmb3IgbG9nc1xuICAgIHJlc3BvbnNlVGltaW5nQWxlcnRJblNlY29uZGU6IDMsIC8vIGlkZW1cbiAgICB0b2tlblNpZ251cFZhbGlkYXRpb25UaW1lSW5Ib3VyczogXCI0OGhcIiwgLy8gaHR0cHM6Ly9naXRodWIuY29tL3plaXQvbXNcbiAgICB0b2tlbkxvZ2luTGlua1RpbWVJbkhvdXJzOiBcIjFoXCIsXG4gICAgdG9rZW5Db25uZXhpb25NaW5UaW1lSW5Ib3VyczogXCIyNGhcIixcbiAgICB0b2tlbkNvbm5leGlvbk1heFRpbWVJbkRheXM6IFwiMTgwIGRheXNcIixcbiAgICB0b2tlbkxvZ2luQ2hhbmdpbmdUaW1lSW5Ib3VyczogXCIxaFwiLC8vIGZvciBlbWFpbCAmIHBhc3N3b3JkIGNoYW5naW5nXG4gICAgdG9rZW5EZWxldGVVc2VyVGltZUluSG91cnM6IFwiMWhcIixcbiAgICB0b2tlblVuc3Vic2NyaWJlTGlua1RpbWVJbkRheXM6IFwiNyBkYXlzXCIsIC8vIHRva2VuIHNlbmQgd2l0aCBzdWJzY3JpcHRpb24ncyBlbWFpbHNcbiAgICBmcmVlQWNjb3VudFRpbWluZ0luRGF5czogMTAsXG4gICAgZnJlZUFjY291bnRFeHBpcmF0aW9uTm90aWZpY2F0aW9uSW5EYXlzOiA1LFxuICAgIGFjY291bnRFeHBpcmF0aW9uRmlyc3ROb3RpZmljYXRpb25JbkRheXM6IDE0LCAgICBcbiAgICBhY2NvdW50RXhwaXJhdGlvblNlY29uZE5vdGlmaWNhdGlvbkluRGF5czogNSxcbiAgICBpbmFjdGl2ZUFjY291bnRUaW1lVG9EZWxldGVJbkRheXM6IDE4MCxcbiAgICAvLyBRdWVzdGlvbm5haXJlczpcbiAgICBuYlF1ZXN0aW9uc01pbjogMSwgLy8gbWluaW11bSBudW1iZXIgb2YgcXVlc3Rpb25zIGZvciB0aGUgcXVlc3Rpb25uYWlyZSB0byBiZSBwdWJsaXNoYWJsZVxuICAgIG5iUXVlc3Rpb25zTWF4OiAxMCwgLy8gaWYgMCA9IG5vdCBtYXhpbXVtXG4gICAgbmJDaG9pY2VzTWF4OiAxMCxcbiAgICBuYk5ld1F1ZXN0aW9ubmFpcmVzOiAxMCwvLyBmb3IgUlNTLCBldGMuXG4gICAgaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlQmVnaW46MSwgLy8gaW4gdXNlciBsb2NhbCB0aW1lXG4gICAgaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlRW5kOjI0LCAvLyBpZGVtXG4gICAgbnVtYmVyTmV3UXVlc3Rpb25uYWlyZUF0U2FtZVRpbWU6IDUwLCAvLyBmb3IgbWFzcyBtYWlsaW5nXG4gICAgbWluU2VhcmNoUXVlc3Rpb25uYWlyZXM6IDMsXG4gICAgLy8gSWxsdXN0cmF0aW9uczpcbiAgICBuYklsbHVzdHJhdGlvbnNNaW46IDAsXG4gICAgbmJJbGx1c3RyYXRpb25zTWF4OiAxLFxuICAgIG1heElsbHVzdHJhdGlvblNpemVpbk9jdGV0OiAxMDAwMDAwLC8vIHBhcyBjb250csO0bMOpIHBvdXIgbCdpbnN0YW50LiDDgCByZXZvaXIuXG4gICAgbWltZVR5cGVzRm9ySWxsdXN0cmF0aW9uOiBbIFwiaW1hZ2UvanBnXCIsIFwiaW1hZ2UvanBlZ1wiLCBcImltYWdlL3BuZ1wiLCBcImltYWdlL2dpZlwiLCBcImltYWdlL3BuZ1wiIF0sXG4gICAgLy8gLS0gVXBsb2FkIGFuZCByZXNpemU6XG4gICAgaWxsdXN0cmF0aW9uc1dpZHRoTWF4SW5QeDogNDAwLFxuICAgIGlsbHVzdHJhdGlvbnNNaW5pYXR1cmVzV2lkdGhNYXhJblB4OiAyMDAsXG4gICAgLy8gTGlua3M6XG4gICAgbmJMaW5rc01pbjogMSxcbiAgICBuYkxpbmtzTWF4OiAxLFxuICAgIC8vIMOgIHN1cHByaW1lciBxdWFuZCB0b3VzIGxlcyBcInJlcXVpcmVcIiDDoCBqb3VyOlxuICAgIG5iUXVlc3Rpb25zTWluOiBxdWVzdGlvbm5haXJlcy5uYlF1ZXN0aW9uc01pbixcbiAgICBuYlF1ZXN0aW9uc01heDogcXVlc3Rpb25uYWlyZXMubmJRdWVzdGlvbnNNYXgsXG4gICAgbmJDaG9pY2VzTWF4OiBxdWVzdGlvbm5haXJlcy5uYkNob2ljZXNNYXgsXG4gICAgcGFzc3dvcmRNaW5MZW5ndGg6IHVzZXJzLnBhc3N3b3JkLm1pbmxlbmd0aCxcbiAgICBkaXJDYWNoZVVzZXJzOiB1c2Vycy5kaXJDYWNoZVVzZXJzLFxuICAgIGRpckNhY2hlVXNlcnNBbnN3ZXJzOiB1c2Vycy5kaXJDYWNoZVVzZXJzQW5zd2VycyxcbiAgICBkaXJDYWNoZVF1ZXN0aW9ubmFpcmVzOiBxdWVzdGlvbm5haXJlcy5kaXJDYWNoZVF1ZXN0aW9ubmFpcmVzLFxuICAgIGRpckNhY2hlUXVlc3Rpb25zOiBxdWVzdGlvbm5haXJlcy5kaXJDYWNoZVF1ZXN0aW9ucyxcbiAgICBkaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlcyxcbiAgICBkaXJIVE1MUXVlc3Rpb25uYWlyZTogcXVlc3Rpb25uYWlyZXMuZGlySFRNTFF1ZXN0aW9ubmFpcmUsXG4gICAgZGlyV2ViUXVlc3Rpb25uYWlyZTogcXVlc3Rpb25uYWlyZXMuZGlyV2ViUXVlc3Rpb25uYWlyZVxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57ICAgIFxuICAgIC8vIEFQSSdyb3V0ZXMgKGFmdGVyIFwiYXBpVXJsXCIgZGVmaW5lZCBpbiBpbnN0YW5jZS5qcylcbiAgICBxdWVzdGlvbm5haXJlUm91dGVzOiBcIi9xdWVzdGlvbm5haXJlXCIsXG4gICAgZ2V0UXVlc3Rpb25uYWlyZVJvdXRlczogXCIvZ2V0XCIsXG4gICAgcHJldmlld1F1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3ByZXZpZXdcIixcbiAgICBwdWJsaXNoZWRRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9xdWl6L1wiLFxuICAgIHNhdmVBbnN3ZXJzUm91dGU6IFwiL2Fuc3dlci9cIixcbiAgICBnZXRTdGF0c1F1ZXN0aW9ubmFpcmVzIDogXCIvc3RhdHMvXCIsXG4gICAgc2VhcmNoUXVlc3Rpb25uYWlyZXNSb3V0ZSA6IFwiL3NlYXJjaFwiLFxuICAgIHNlYXJjaEFkbWluUXVlc3Rpb25uYWlyZXNSb3V0ZSA6IFwiL3NlYXJjaGFkbWluXCIsXG4gICAgZ2V0TGlzdE5leHRRdWVzdGlvbm5haXJlczogXCIvZ2V0bGlzdG5leHRxdWVzdGlvbm5haXJlcy9cIixcbiAgICAvLyAtLSBxdWVzdGlvbnMgJiBjaG9pY2VzIDpcbiAgICBxdWVzdGlvbnNSb3V0ZTogXCIvcXVlc3Rpb24vXCIsXG4gICAgLy8gLS0gdGFncyA6XG4gICAgdGFnc1NlYXJjaFJvdXRlOiBcIi90YWdzL3NlYXJjaC9cIixcbiAgICAvLyAtLSBhbnN3ZXJzIDpcbiAgICBnZXRRdWVzdGlvbm5haXJlc1dpdGhvdXRBbnN3ZXI6IFwiL3dpdGhvdXRhbnN3ZXIvdXNlci9cIixcbiAgICBnZXRQcmV2aW91c0Fuc3dlcnM6IFwiL3VzZXIvYW5zd2Vycy9cIixcbiAgICBnZXRTdGF0c0Fuc3dlcnMgOiBcIi91c2VyL2Fud3N3ZXJzL3N0YXRzL1wiLFxuICAgIGdldEFkbWluU3RhdHM6IFwiL2dldGFkbWluc3RhdHMvXCIsXG4gICAgLy8gZm9ybXMgOiDDoCBjb21wbMOpdGVyIGF2ZWMgdmFsZXVycyBwYXIgZMOpZmF1dCwgZXRjLiBjZiBtb2TDqGxlXG4gICAgUXVlc3Rpb25uYWlyZSA6XG4gICAge1xuICAgICAgICB0aXRsZTogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgc2x1ZzogeyBtYXhsZW5ndGg6IDE1MCB9LCAvLyBjaGFtcCByZXF1aXMgbWFpcyBjYWxjdWzDqSDDoCBwYXJ0aXIgZHUgdGl0cmUgcWQgdmlkZVxuICAgICAgICBpbnRyb2R1Y3Rpb246IHsgcmVxdWlyZWQ6IHRydWUgfVxuICAgIH0sXG4gICAgc2VhcmNoUXVlc3Rpb25uYWlyZXMgOiB7IG1pbmxlbmd0aDogMywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBRdWVzdGlvbiA6XG4gICAge1xuICAgICAgICB0ZXh0OiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICByYW5rOiB7IHJlcXVpcmVkOiB0cnVlLCBtaW46MSwgZGVmYXVsdFZhbHVlOjEgfVxuICAgIH0sICAgICAgICAgIFxuICAgIENob2ljZSA6XG4gICAge1xuICAgICAgICB0ZXh0OiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9XG4gICAgfSwgICAgICAgICAgXG4gICAgbmJRdWVzdGlvbnNNaW46IDEsXG4gICAgbmJRdWVzdGlvbnNNYXg6IDEwLFxuICAgIG5iQ2hvaWNlc01heDogMTAsXG4gICAgbmJUYWdzTWluOiAwLFxuICAgIG5iVGFnc01heDogMCwgLy8gMCA9IG5vdCBtYXggICAgXG4gICAgLy8gSlNPTiBhbmQgSFRNTCBkaXJcbiAgICBkaXJDYWNoZVF1ZXN0aW9ubmFpcmVzIDogXCJkYXRhcy9xdWVzdGlvbm5haXJlc1wiLFxuICAgIGRpckNhY2hlUXVlc3Rpb25zIDogXCJkYXRhcy9xdWVzdGlvbm5haXJlcy9xdWVzdGlvbnNcIixcbiAgICBkaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXMgOiBcImRhdGFzL3VzZXJzL3F1ZXN0aW9ubmFpcmVzXCIsXG4gICAgZGlyQ2FjaGVUYWdzIDogXCJkYXRhcy9xdWVzdGlvbm5haXJlcy90YWdzXCIsICBcbiAgICBkaXJIVE1MUXVlc3Rpb25uYWlyZSA6IFwiZnJvbnQvcHVibGljL3F1aXpcIixcbiAgICBkaXJIVE1MVGFncyA6IFwiZnJvbnQvcHVibGljL3F1aXpzXCIsXG4gICAgZGlyV2ViUXVlc3Rpb25uYWlyZSA6IFwicXVpelwiLC8vcG91ciB1cmwgcGFnZVxuICAgIGRpcldlYlRhZ3MgOiBcInF1aXpzXCIvLyBpZGVtXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICAvLyBBUEkncm91dGVzIChhZnRlciBcImFwaVVybFwiIGRlZmluZWQgaW4gaW5zdGFuY2UuanMpXG4gICAgdXNlclJvdXRlczogXCIvdXNlclwiLFxuICAgIHN1YnNjcmliZVJvdXRlOiBcIi9zaWdudXBcIixcbiAgICBnZXRHb2RmYXRoZXJSb3V0ZTogXCIvZ2V0Z29kZmF0aGVyaWRcIixcbiAgICBjaGVja0lmSXNFbWFpbGZyZWVSb3V0ZTogXCIvaXNlbWFpbGZyZWVcIixcbiAgICBjaGVja1N1YnNjcmliZVRva2VuUm91dGU6IFwiL3ZhbGlkYXRpb24vXCIsXG4gICAgY2hlY2tMb2dpblJvdXRlOiBcIi9jaGVja2xvZ2luL1wiLFxuICAgIGNvbm5lY3Rpb25Sb3V0ZTogXCIvbG9naW5cIixcbiAgICBnZXRMb2dpbkxpbmtSb3V0ZTogXCIvZ2V0bG9naW5saW5rXCIsXG4gICAgY29ubmVjdGlvbldpdGhMaW5rUm91dGU6IFwiL2NoZWNrbG9naW5saW5rXCIsXG4gICAgZ2V0VXNlckluZm9zOiBcIi9nZXQvXCIsXG4gICAgY3JlYXRlVXNlclJvdXRlOiBcIi9jcmVhdGVcIixcbiAgICB2YWxpZGF0ZVVzZXJSb3V0ZTogXCIvdmFsaWRhdGUvXCIsXG4gICAgdXBkYXRlVXNlckluZm9zOiBcIi9tb2RpZnkvXCIsXG4gICAgc2VhcmNoVXNlclJvdXRlOiBcIi9zZWFyY2gvXCIsXG4gICAgZ2V0R29kQ2hpbGRzOiBcIi9nZXRnb2RjaGlsZHMvXCIsXG4gICAgY2hlY2tOZXdMb2dpbkxpbmtSb3V0ZTogXCIvY29uZmlybW5ld2xvZ2luL1wiLFxuICAgIGNoZWNrRGVsZXRlTGlua1JvdXRlOiBcIi9jb25maXJtZGVsZXRlL1wiLFxuICAgIGdldFBheW1lbnRzOiBcIi9wYXltZW50L2dldGZvcm9uZXVzZXIvXCIsXG4gICAgdW5zdWJzY3JpYmVSb3V0ZTogXCIvc3Vic2NyaXB0aW9uL3N0b3AvXCIsXG4gICAgZ2V0QWRtaW5TdGF0czogXCIvZ2V0YWRtaW5zdGF0cy9cIixcbiAgICAvLyBmb3JtcyA6IMOgIGNvbXBsw6l0ZXIgYXZlYyB2YWxldXJzIHBhciBkw6lmYXV0LCBldGMuIGNmIG1vZMOobGVcbiAgICBuYW1lOiB7IG1heGxlbmd0aDogNzAsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZW1haWw6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgcGFzc3dvcmQ6IHsgbWlubGVuZ3RoOiA4LCBtYXhsZW5ndGg6NzIsIHJlcXVpcmVkOiB0cnVlIH0sIC8vIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2JjcnlwdCNzZWN1cml0eS1pc3N1ZXMtYW5kLWNvbmNlcm5zXG4gICAgbmV3UGFzc3dvcmQ6IHsgbWlubGVuZ3RoOiA4LCBtYXhsZW5ndGg6NzIgfSxcbiAgICBjb2RlR29kZmF0aGVyOiB7IG1heGxlbmd0aDogMjU1IH0sXG4gICAgY2d1T2s6IHsgdmFsdWU6IFwidHJ1ZVwiLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHRpbWVEaWZmZXJlbmNlTWluOiAtNzIwLFxuICAgIHRpbWVEaWZmZXJlbmNlTWF4Ojg0MCxcbiAgICAvLyBKU09OIGRpclxuICAgIGRpckNhY2hlVXNlcnMgOiBcImRhdGFzL3VzZXJzXCIsXG4gICAgZGlyQ2FjaGVVc2Vyc0Fuc3dlcnMgOiBcImRhdGFzL3VzZXJzL3F1ZXN0aW9ubmFpcmVzL2Fuc3dlcnNcIlxufTtcbiIsInZhciBtYXAgPSB7XG5cdFwiLi9mci9nZW5lcmFsXCI6IFwiLi4vbGFuZy9mci9nZW5lcmFsLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvZ2VuZXJhbCRcIjsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZnIvaWxsdXN0cmF0aW9uXCI6IFwiLi4vbGFuZy9mci9pbGx1c3RyYXRpb24uanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9pbGx1c3RyYXRpb24kXCI7IiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL2xpbmtcIjogXCIuLi9sYW5nL2ZyL2xpbmsuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9saW5rJFwiOyIsInZhciBtYXAgPSB7XG5cdFwiLi9mci9xdWVzdGlvblwiOiBcIi4uL2xhbmcvZnIvcXVlc3Rpb24uanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9xdWVzdGlvbiRcIjsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZnIvcXVlc3Rpb25uYWlyZVwiOiBcIi4uL2xhbmcvZnIvcXVlc3Rpb25uYWlyZS5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi9sYW5nIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcL3F1ZXN0aW9ubmFpcmUkXCI7IiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL3VzZXJcIjogXCIuLi9sYW5nL2ZyL3VzZXIuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC91c2VyJFwiOyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBzaXRlSFRNTFRpdGxlIDogXCJXaWtpTGVybmkgOiBxdSdhbGxlei12b3VzIGFwcHJlbmRyZSBhdWpvdXJkJ2h1aSA/XCIsXG4gICAgc2l0ZU1ldGFEZXNjcmlwdGlvbiA6IFwiQ2hhcXVlIGpvdXIsIHRlc3RleiB2b3MgY29ubmFpc3NhbmNlcyBldCBhcHByZW5leiBkZSBub3V2ZWxsZXMgY2hvc2VzIGF2ZWMgV2lraUxlcm5pLlwiLFxuICAgIHNjcmlwdFRpbWluZ0luZm8gOiBcIkR1csOpZSBkZSBsYSByw6lwb25zZSA6IFNDUklQVF9USU1JTkcgbWlsbGlzZWNvbmRlcywgcm91dGUgOiBTQ1JJUFRfVVJMXCIsXG4gICAgc2NyaXB0VGltaW5nQWxlcnQgOiBcIioqKiBTY3JpcHQgbGVudCA6IFNDUklQVF9USU1JTkcgbWlsbGlzZWNvbmRlcywgcm91dGUgOiBTQ1JJUFRfVVJMXCIsXG4gICAgc2VydmVyRXJyb3IgOiBcIkTDqXNvbMOpLiBVbmUgZXJyZXVyIGltcHLDqXZ1ZSBlc3Qgc3VydmVudWUuIFNpIGNlbGEgcGVyc2lzdGUsIG4naMOpc2l0ZXogw6AgcHLDqXZlbmlyIGwnYWRtaW5pc3RyYXRldXIgZHUgc2l0ZS5cIixcbiAgICBzZXJ2ZXJFcnJvckFkbWluIDogXCJCdWcgZGUgbCdhcHBsaWNhdGlvbiA6XCIsXG4gICAgbmVlZGVkUGFyYW1zIDogXCJEZXMgcGFyYW3DqHRyZXMgbsOpY2Vzc2FpcmVzIG1hbnF1YW50cyBzb250IG1hbnF1YW50cy5cIixcbiAgICBiYWRVcmwgOiBcIlRlbnRhdGl2ZSBkJ2FjY8OocyDDoCB1bmUgcGFnZSBuJ2V4aXN0YW50IHBhcyA6XCIsXG4gICAgbm90VmFsaWRGb3JtYXQgOiBcIkZvcm1hdCBub24gdmFsaWRlLlwiLFxuICAgIG5vdEFsbG93ZWQgOiBcIlZvdXMgbidhdmV6IHBhcyBsZXMgZHJvaXRzIG7DqWNlc3NhaXJlcyBwb3VyIGNldHRlIGFjdGlvbi5cIixcbiAgICBub3RSZXF1aXJlZCA6IFwiRmFjdWx0YXRpZi5cIixcbiAgICB1cGRhdGVCdG5UeHQ6IFwiTW9kaWZpZXJcIixcbiAgICBhZGRCdG5UeHQ6IFwiQWpvdXRlclwiLFxuICAgIGRlbGV0ZUJ0blR4dDogXCJTdXBwcmltZXJcIixcbiAgICBhZGRPa01lc3NhZ2UgOiBcIkxlcyBkb25uw6llcyBvbnQgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWVzLlwiLFxuICAgIHVwZGF0ZU9rTWVzc2FnZSA6IFwiTGEgbWlzZSDDoCBqb3VyIMOgIGpvdXIgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS5cIixcbiAgICBkZWxldGVPa01lc3NhZ2UgOiBcIkxhIHN1cHByZXNzaW9uIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgZmFpbEF1dGggOiBcIkVycmV1ciBkJ2F1dGhlbnRpZmljYXRpb24uXCIsXG4gICAgZmFpbEF1dGhIZWFkZXIgOiBcIkFic2VuY2UgZGUgaGVhZGVyIEF1dGhvcml6YXRpb24uXCIsXG4gICAgZmFpbEF1dGhUb2tlbiA6IFwiVG9rZW4gaW52YWxpZGUgb3UgdXRpbGlzYXRldXIgbm9uIHRyb3V2w6kuXCIsXG4gICAgZmFpbEF1dGhJZCA6IFwiSWRlbnRpZmlhbnQgbm9uIHZhbGlkZSA6IFwiLFxuICAgIGZhaWxBdXRoQ3JvbiA6IFwiVGVudGF0aXZlIGRlIGxhbmNlbWVudCBkJ3VuIGNyb24gc2FucyBsZSBib24gdG9rZW4uXCIsXG4gICAgcHJldmlvdXNQYWdlIDogXCJQYWdlIHByw6ljw6lkZW50ZVwiLFxuICAgIG5leHRQYWdlIDogXCJQYWdlIHN1aXZhbnRlXCIsXG4gICAgYnRuTGlua1RvUXVlc3Rpb25uYWlyZSA6IFwiQWxsZXIgYXUgcXVpeiAhXCIsXG4gICAgc3RhdHNBZG1pbiA6IFwiRHVyYW50IGxlcyBkZXJuacOocmVzIDI0aCA6IE5CX1VTRVJTXzI0SCBjb21wdGVzIG9udCDDqXTDqSBjcsOpw6lzLCBOQl9TVUJTQ1JJUFRJT05TXzI0SCB2YWxpZMOpcyBldCBOQl9VU0VSU19ERUxFVEVEXzI0SCBzdXBwcmltw6lzLiBOQl9BTlNXRVJTXzI0SCByw6lwb25zZXMgYXV4IHF1aXpzIG9udCDDqXTDqSBlbnJlZ2lzdHLDqWVzLjxicj5FbiB0b3V0LCBpbCB5IGEgOiBOQl9VU0VSU19UT1QgY29tcHRlcywgZG9udCBOQl9TVUJTQ1JJUFRJT05TX1RPVCB2YWxpZMOpcyBldCBOQl9TVUJTQ1JJUFRJT05TX1BSRU1JVU0gY29tcHRlcyBwcsOpbWl1bS4gTkJfQU5TV0VSU19UT1QgcsOpcG9uc2VzIGF1eCBxdWl6cyBvbnQgw6l0w6kgZW5yZWdpc3Ryw6llcy48YnI+UGFybWkgbGVzIE5CX1VTRVJTX0RFTEVURURfVE9UIGNvbXB0ZXMgc3VwcHJpbcOpcywgTkJfVVNFUlNfREVMRVRFRF9WQUxJREVEIGF2YWllbnQgdmFsaWTDqSBsZXVyIGNvbXB0ZSBldCBOQl9VU0VSU19ERUxFVEVEX1BSRU1JVU0gYXZhaWVudCBzb3VzY3JpdCB1biBjb21wdGUgcHLDqW1pdW0uXCJcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIG5lZWRVcmwgOiBcIk1lcmNpIGRlIGZvdXJuaXIgdW5lIHVybCBwb3VyIGwnaW1hZ2UuXCIsXG4gICAgbmVlZFVuaXF1ZVVybCA6IFwiTCd1cmwgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcGFyIHVuZSBhdXRyZSBpbWFnZS5cIixcbiAgICBuZWVkR29vZExvbmdVcmwgOiBcIkwndXJsIGRlIGwnaW1hZ2UgZG9pdCBjb250ZW5pciBlbnRyZSA1IGV0IDI1NSBjYXJhY3TDqHJlcy5cIixcbiAgICBuZWVkR29vZExvbmdBbHQgOiBcIkxlIHRleHRlIGRlIGxhIHByb3ByacOpdMOpICdhbHQnIG5lIGRvaXQgcGFzIGNvbXB0ZXIgcGx1cyBkZSAyNTUgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZEdvb2RMb25nVGl0bGUgOiBcIkxlIHRleHRlIGRlIGxhIHByb3ByacOpdMOpICd0aXRsZScgbmUgZG9pdCBwYXMgY29tcHRlciBwbHVzIGRlIDI1NSBjYXJhY3TDqHJlcy5cIixcbiAgICBuZWVkR29vZExvbmdDYXB0aW9uIDogXCJMZSB0ZXh0ZSBkZSBsYSBsw6lnZW5kZSBkZSBsJ2ltYWdlIG5lIGRvaXQgcGFzIGNvbXB0ZXIgcGx1cyBkZSAyNTUgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZEdvb2RGaWxlIDogXCJWb3RyZSBmaWNoaWVyIG4nYSBwYXMgw6l0w6kgYWNjZXB0w6kuXCIsXG4gICAgbmVlZFF1ZXN0aW9ubmFpcmVGb3JJbGx1c3RyYXRpb24gOiBcIlRlbnRhdGl2ZSBkJ2Fqb3V0L21pc2Ugw6Agam91ci9zdXBwcmVlc3Npb24gZCd1bmUgaWxsdXN0cmF0aW9uIHBvdXIgdW4gcXVlc3Rpb25uYWlyZSBuJ2F5YW50IHBhcyDDqXTDqSB0cm91dsOpLlwiLFxuICAgIG5lZWRNYXhJbGx1c3RyYXRpb25zRm9yUXVlc3Rpb25uYWlyZSA6IFwiVm91cyBhdmV6IGTDqWrDoCBhdHRlaW50IGxlIG5vbWJyZSBtYXhpbWFsIGQnaWxsdXN0cmF0aW9ucyBwb3VyIGNlIHF1ZXN0aW9ubmFpcmUuXCIsXG4gICAgbm90Rm91bmQ6IFwiTCdlbnJlZ2lzdHJlbWVudCBkZSBsJ2lsbHVzdHJhdGlvbiBuJ2EgcGFzIMOpdMOpIHRyb3V2w6kgOiBcIixcbiAgICBhZGRlZE9rTWVzc2FnZTogXCJMJ2lsbHVzdHJhdGlvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIHVwZGF0ZWRPa01lc3NhZ2U6IFwiTCdpbGx1c3RyYXRpb24gYSBiaWVuIMOpdMOpIG1vZGlmacOpZS5cIixcbiAgICBkZWxldGVkT2tNZXNzYWdlOiBcIkwnaWxsdXN0cmF0aW9uIGEgYmllbiDDqXTDqSBzdXBwcmltw6llLlwiLFxuICAgIGRlZmF1bHRBbHQgOiBcIklsbHVzdHJhdGlvbiBkdSBxdWl6XCIsXG4gICAgaW50cm9UaXRsZSA6IFwiSWxsdXN0cmF0aW9ucyBkdSBxdWl6XCIsXG4gICAgaW50cm9Ob0lsbHVzdHJhdGlvbiA6IFwiQXVjdW5lIGlsbHVzdHJhdGlvbiBwb3VyIGwnaW5zdGFudC5cIlxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgbmVlZFVybCA6IFwiTWVyY2kgZGUgIHNhaXNpciBsJ3VybCBkdSBsaWVuLlwiLFxuICAgIG5lZWRWYWxpZFVybCA6IFwiTWVyY2kgZGUgIHNhaXNpciB1biB1cmwgYXlhbnQgdW4gZm9ybWF0IHZhbGlkZS5cIixcbiAgICBuZWVkTm90VG9vTG9uZ1VybCA6IFwiTWVyY2kgZGUgIHNhaXNpciB1biB1cmwgbmUgY29tcHRhbnQgcGFzIHBsdXMgZGUgMjU1IGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRBbmNob3IgOiBcIk1lcmNpIGRlIGZvdXJuaXIgdW5lIGFuY3JlIHBvdXIgY2UgbGllbi5cIixcbiAgICBuZWVkR29vZExvbmdBbmNob3IgOiBcIk1lcmNpIGRlIGZvdXJuaXIgdW5lIGFuY3JlIHBvdXIgY2UgbGllbiBjb21wdGFudCBlbnRyZSA1IGV0IDE1MCBjYXJhY3TDqHJlcy5cIixcbiAgICBuZWVkUXVlc3Rpb25uYWlyZSA6IFwiTGUgcXVlc3Rpb25uYWlyZSBkdSBsaWVuIG4nYSBwYXMgw6l0w6kgdHJvdXbDqS5cIixcbiAgICBuZWVkTWF4TGlua3NGb3JRdWVzdGlvbm5haXJlIDogXCJWb3VzIGF2ZXogZMOpasOgIGF0dGVpbnQgbGUgbm9tYnJlIG1heGltYWwgZGUgbGllbnMgcG91ciBjZSBxdWVzdGlvbm5haXJlLlwiLFxuICAgIHVwZGF0ZWRPa01lc3NhZ2U6IFwiTGUgbGllbiBhIGJpZW4gw6l0w6kgbW9kaWZpw6kuXCIsXG4gICAgYWRkZWRPa01lc3NhZ2U6IFwiTGUgbGllbiBhIGJpZW4gw6l0w6kgYWpvdXTDqS5cIixcbiAgICBkZWxldGVkT2tNZXNzYWdlOiBcIkxlIGxpZW4gYSBiaWVuIMOpdMOpIHN1cHByaW3DqS5cIixcbiAgICBub3RGb3VuZCA6IFwiTCdlbnJlZ2lzdHJlbWVudCBkdSBsaWVuIG4nYSBwYXMgw6l0w6kgdHJvdXbDqS5cIixcbiAgICBpbnRyb1RpdGxlIDogXCJMZWN0dXJlcyBwcm9wb3PDqWVzXCIsXG4gICAgaW50cm9Ob0xpbmsgOiBcIkF1Y3VuIGxpZW4gcG91ciBsJ2luc3RhbnQuXCIsXG4gICAgZGVmYXVsdFZhbHVlOiBcIkxpcmUgbCdhcnRpY2xlIHN1ciBXaWtpcMOpZGlhLlwiXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBuZWVkVGV4dDogXCJNZXJjaSBkZSBzYWlzaXIgbGUgdGV4dGUgZGUgbGEgcXVlc3Rpb24gIVwiLFxuICAgIG5lZWROb3RUb29Mb25nVGV4dDogXCJMYSBxdWVzdGlvbiBuZSBkb2l0IHBhcyBjb21wdGVyIHBsdXMgZGUgMjU1IGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRRdWVzdGlvbm5haXJlOiBcIkxlIHF1ZXN0aW9ubmFpcmUgY29uY2VybsOpIG4nYSBwYXMgw6l0w6kgdHJvdXbDqS5cIixcbiAgICBuZWVkTWF4UXVlc3Rpb25zOiBcIlZvdXMgYXZleiBkw6lqw6AgYXR0ZWludCBsZSBub21icmUgbWF4aW1hbCBkZSBxdWVzdGlvbnMgcG91ciBjZSBxdWVzdGlvbm5haXJlIDogXCIsXG4gICAgbm90Rm91bmQ6IFwiTCdlbnJlZ2lzdHJlbWVudCBkZSBsYSBxdWVzdGlvbiBuJ2EgcGFzIMOpdMOpIHRyb3V2w6kuXCIsXG4gICAgYWRkT2tNZXNzYWdlOiBcIkxhIHF1ZXN0aW9uIGEgYmllbiDDqXTDqSBham91dMOpZS5cIixcbiAgICB1cGRhdGVPa01lc3NhZ2U6IFwiTGEgcXVlc3Rpb24gYSBiaWVuIMOpdMOpIG1vZGlmacOpZS5cIixcbiAgICBkZWxldGVPa01lc3NhZ2U6IFwiTGEgcXVlc3Rpb24gYSBiaWVuIMOpdMOpIHN1cHByaW3DqWUuXCIsXG4gICAgaW50cm9UaXRsZTogXCJMZXMgcXVlc3Rpb25zIGVucmVnaXN0csOpZXNcIixcbiAgICBpbnRyb05vUXVlc3Rpb246IFwiQXVjdW5lIHF1ZXN0aW9uIG4nYSDDqXTDqSBzYWlzaWUgcG91ciBsJ2luc3RhbnRcIixcbiAgICBuZWVkTnVtYmVyRm9yUmFuayA6IFwiVm91cyBkZXZleiBmb3VybmlyIHVuIG5vbWJyZSBzdXDDqXJpZXVyIG91IMOpZ2FsIMOgIDEgcG91ciBsZSByYW5nIGRlIGNldHRlIHF1ZXN0aW9uLlwiXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBuZWVkVGl0bGU6IFwiTWVyY2kgZGUgZm91cm5pciB1biB0aXRyZSDDoCB2b3RyZSBxdWl6LlwiLFxuICAgIG5lZWROb3RUb29Mb25nVGl0bGU6IFwiTGUgdGl0cmUgZHUgcXVpeiBuZSBkb2l0IHBhcyBjb21wdGVyIHBsdXMgZGUgMjU1IGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRVcmw6IFwiTWVyY2kgZGUgZm91cm5pciBsJ3VybCDDoCB2b3RyZSBxdWl6LlwiLFxuICAgIG5lZWRVbmlxdWVVcmw6IFwiTCd1cmwgZHUgcXVpeiBkb2l0IMOqdHJlIHVuaXF1ZS5cIixcbiAgICBuZWVkSW50cm9kdWN0aW9uOiBcIk1lcmNpIGRlIGZvdXJuaXIgdW4gdGV4dGUgZCdpbnRyb2R1Y3Rpb24gw6Agdm90cmUgcXVpei5cIixcbiAgICBuZWVkQ29ycmVjdFB1Ymxpc2hpbmdEYXRlOiBcIkxhIGRhdGUgZGUgcHVibGljYXRpb24gZm91cm5pZSBuJ2EgcGFzIHVuIGZvcm1hdCB2YWxpZGUuXCIsXG4gICAgbmVlZEtub3dJZklzUHVibGlzaGVkOiBcIklsIGZhdXQgc2F2b2lyIHNpIGNlIHF1aXogZXN0IHB1Ymxpw6kuXCIsXG4gICAgbmVlZExhbmd1YWdlOiBcIlZvdXMgZGV2ZXogc8OpbGVjdGlvbm5lciBsYSBsYW5ndWUgZGUgY2UgcXVpei5cIixcbiAgICBuZWVkRXN0aW1hdGVkVGltZTogXCJNZXJjaSBkZSBzw6lsZWN0aW9ubmVyIHVuZSBlc3RpbWF0aW9uIGRlIGxhIGR1csOpZSBkZSBjZSBxdWl6LlwiLFxuICAgIG5vdEZvdW5kIDogXCJBdWN1biBxdWl6IG4nYSBwYXMgw6l0w6kgdHJvdXbDqS5cIixcbiAgICBzZWFyY2hSZXN1bHRUaXRsZSA6IFwiUsOpc3VsdGF0IHBvdXIgdm90cmUgcmVjaGVyY2hlXCIsXG4gICAgc2VhcmNoTm9SZXN1bHQgOiBcIkF1Y3VuIHLDqXN1bHRhdCBuJ2Egw6l0w6kgdHJvdXbDqSBwb3VyIHZvdHJlIHJlY2hlcmNoZVwiLFxuICAgIHNlYXJjaFdpdGhSZXN1bHQgOiBcIiNOQiBxdWl6cyBjb3JyZXNwb25kZW50IMOgIHZvdHJlIHJlY2hlcmNoZSA6XCIsXG4gICAgcHVibGlzaGVkQnk6IFwiUHVibGnDqSBwYXJcIixcbiAgICBwdWJsaXNoZWRBdDogXCIsIGxlXCIsXG4gICAgbGFzdFVwZGF0ZWQ6IFwiRGVybmnDqHJlIG1pc2Ugw6Agam91ciwgbGUgXCIsXG4gICAgZXN0aW1hdGVkVGltZTogXCJEdXLDqWUgZGUgbGVjdHVyZSBlc3RpbcOpZSA6IFwiLFxuICAgIGJ0blNlbmRSZXNwb25zZTogXCJFbnZveWV6IHZvcyByw6lwb25zZXNcIixcbiAgICBidG5Qcm9wb3NlU3Vic2NyaWJlOiBcIk9rLCBqZSBjcsOpZSBtb24gY29tcHRlICFcIixcbiAgICBidG5Qcm9wb3NlQ29ubmVjdGlvbjogXCJKJ2FpIGTDqWrDoCB1biBjb21wdGUsIGplIG1lIGNvbm5lY3RlLlwiLFxuICAgIGJ0blNob3dRdWVzdGlvbm5haXJlOiBcIkFmZmljaGVyIGxlIHF1aXogIVwiLFxuICAgIG5leHRRdWVzdGlvbm5haXJlc0xpc3Q6IFwiTGVzICNOQiBwcm9jaGFpbnMgcXVpenMgZGV2YW50IMOqdHJlIHB1Ymxpw6lzXCIsXG4gICAgbmVlZEJlQ29tcGxldGVkOiBcIlF1aXogaW5jb21wbGV0XCIsXG4gICAgbmV4dERhdGVXaXRob3V0UXVlc3Rpb25uYWlyZTogXCJQcm9jaGFpbmUgZGF0ZSBzYW5zIHF1aXogcHJvZ3JhbW3DqSA6IFwiLFxuICAgIGhhdmVCZWVuUHVibGlzaGVkIDogXCI6TkIgbm91dmVhdXggcXVlc3Rpb25uYWlyZXMgb250IMOpdMOpIHB1Ymxpw6lzLlwiXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBub3RGb3VuZDogXCJMJ3V0aWxpc2F0ZXVyIG4nYSBwYXMgw6l0w6kgdHJvdXbDqS5cIixcbiAgICBuZWVkTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyLlwiLFxuICAgIG5lZWROb3RUb29Mb25nTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyIG5lIGNvbXB0YW50IHBhcyBwbHVzIGRlIDcwIGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRFbWFpbDogXCJNZXJjaSBkZSBzYWlzaXIgdm90cmUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgbmVlZFVuaXF1ZUVtYWlsOiBcIkwnYWRyZXNzZSBlLW1haWwgcXVlIHZvdXMgYXZleiBzYWlzaWUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcGFyIHVuIGF1dHJlIHV0aWxpc2F0ZXVyLiBTaSB2b3VzIGF2ZXogZMOpasOgIHVuIGNvbXB0ZSwgPGEgaHJlZj0nLyNVUkwnPmNsaXF1ZXotaWNpIHBvdXIgdm91cyBjb25uZWN0ZXI8L2E+LlwiLFxuICAgIG5lZWROb3RUb29Mb25nRW1haWw6IFwiTWVyY2kgZGUgc2Fpc2lyIHVuZSBhZHJlc3NlIGUtbWFpbCBuZSBjb21wdGFudCBwYXMgcGx1cyBkZSAyNTUgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZFBhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZS5cIixcbiAgICBuZWVkTG9uZ1Bhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZSBkJ2F1IG1vaW5zIE1JTl9MRU5HVEggY2FyYWN0w6hyZXMuXCIsXG4gICAgcGFzc3dvcmRDb3BpZWQ6IFwiTGUgbW90IGRlIHBhc3NlIGfDqW7DqXLDqSBhIMOpdMOpIGNvcGnDqSBkYW5zIGxlIHByZXNzZS1wYXBpZXIuIFZvdXMgcG91dmV6IGxlIHJlY29waWVyIG/DuSB2b3VzIGxlIHNvdWhhaXRlci5cIixcbiAgICBuZWVkU3RhdHVzIDogXCJJbCBtYW5xdWUgbGUgc3RhdHV0LlwiLFxuICAgIG5lZWRMYW5ndWFnZSA6IFwiSWwgbWFucXVlIGxlIGNvZGUgbGFuZ3VlLlwiLFxuICAgIG5lZWRWYWxpZExhc3RDb25uZWN0aW9uRGF0ZSA6IFwiTGEgZGF0ZSBkZSBkZXJuacOocmUgY29ubmV4aW9uIG4nZXN0IHBhcyB2YWxpZGUuXCIsXG4gICAgbmVlZFNNVFAgOiBcIklsIG1hbnF1ZSBsZSBzZXJ2ZXVyIFNNVFAuXCIsXG4gICAgbmVlZFNNVFBOb3RGb3VuZCA6IFwiSWwgbWFucXVlIGxlIHNlcnZldXIgU01UUC5cIixcbiAgICBuZWVkS25vd05ld3NsZXR0ZXJPayA6IFwiSWwgZmF1dCBzYXZvaXIgc2kgbCd1dGlsaXNhdGV1ciBhY2NlcHRlIG91IHJlZnVzZSBkZSByZWNldm9pciBsYSBuZXdzbGV0dGVyLlwiLFxuICAgIG5lZWRUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBjb25uYcOudHJlIGxlIG5vbWJyZSBkZSBtaW51dGVzIGR1IGTDqWNhbGFnZSBob3JhaXJlLlwiLFxuICAgIG5lZWRNaW5UaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGVubGV2ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgNzIwLlwiLFxuICAgIG5lZWRNYXhUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGFqb3V0ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgODQwLlwiLFxuICAgIG5lZWRVR0NPayA6IFwiVm91cyBkZXZleiBhY2NlcHRlciBsZXMgQ0dVIHBvdXIgcG91dm9pciBjcsOpZXIgdm90cmUgY29tcHRlLiBcIixcbiAgICBnb2RmYXRoZXJOb3RGb3VuZDogXCJBdWN1biB1dGlsaXNhdGV1ciB2YWxpZGUgdHJvdXbDqSBwb3VyIGNlIGNvZGUgcGFycmFpbi5cIixcbiAgICBnb2RmYXRoZXJGb3VuZDogXCJWb3RyZSBwYXJyYWluIGEgYmllbiDDqXTDqSB0cm91dsOpICFcIixcbiAgICBtYWlsVmFsaWRhdGlvbk1lc3NhZ2U6IFwiVm90cmUgaW5zY3JpcHRpb24gZXN0IGJpZW4gZW5yZWdpc3Ryw6llLlxcblBvdXIgbGEgZmluYWxpc2VyLCBtZXJjaSBkZSBjbGlxdWVyIGRhbnMgbGVzIDI0SCBzdXIgbGUgbGllbiBkZSBjb25maXJtYXRpb24gcXVpIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBwYXIgZS1tYWlsLlwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1N1YmplY3QgOiBcIk1lcmNpIGRlIHZhbGlkZXIgdm90cmUgY29tcHRlXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblBvdXIgdmFsaWRlciB2b3RyZSBjb21wdGUsIG1lcmNpIGRlIGNsaXF1ZXIgc3VyIGxlIGxpZW4gc3VpdmFudCBkYW5zIGxlcyAyNGggOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm90cmUgY29tcHRlLCBtZXJjaSBkZSBjbGlxdWVyIHN1ciBsZSBsaWVuIHN1aXZhbnQgZGFucyBsZXMgMjRoLjwvcD48cD48YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+VmFsaWRlci48L2E+PC9wPlwiLFxuICAgIHZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGNvbXB0ZSB2aWVudCBiaWVuIGQnw6p0cmUgdmFsaWTDqS4gTWVyY2kgZXQgYmllbnZlbnVlICE8YnI+Vm91cyBwb3V2ZXogc2FucyB0YXJkZXIgdm91cyBjb25uZWN0ZXIgY2ktZGVzc291cyBwb3VyIGFjY8OpZGVyIMOgIHZvdHJlIGNvbXB0ZS5cIixcbiAgICB2YWxpZGF0aW9uTWVzc2FnZUFkbWluOiBcIkxlIGNvbXB0ZSBhIGJpZW4gw6l0w6kgdmFsaWTDqS5cIixcbiAgICB2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2U6IFwiSWwgc2VtYmxlIHF1ZSB2b3VzIGF5ZXogZMOpasOgIHZhbGlkw6kgdm90cmUgY29tcHRlLlwiLFxuICAgIHZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZUFkbWluOiBcIkNlIGNvbXB0ZSBhIGTDqWrDoCDDqXTDqSB2YWxpZMOpLlwiLFxuICAgIG1haWxXZWxjb21lU3ViamVjdCA6IFwiQmllbnZlbnVlICFcIixcbiAgICBtYWlsV2VsY29tZUJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblZvdHJlIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuXFxuTWVyY2kgZXQgw6AgYmllbnTDtHQgIVwiLFxuICAgIG1haWxXZWxjb21lQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlZvdHJlIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuPC9wPjxwPk1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyU3ViamVjdCA6IFwiTWVyY2kgIVwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlckJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcbkdyw6JjZSDDoCB2b3VzIHVuIG5vdXZlbCB1dGlsaXNhdGV1ciAoRU1BSUwpIHZpZW50IGRlIHMnaW5zY3JpcmUgc3VyIE5PTV9TSVRFLlxcbk1lcmNpIGV0IMOgIGJpZW50w7R0ICFcIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+R3LDomNlIMOgIHZvdXMgdW4gbm91dmVsIHV0aWxpc2F0ZXVyIChFTUFJTCkgdmllbnQgZGUgcydpbnNjcmlyZSBzdXIgTk9NX1NJVEUuPC9wPjxwPk1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGxpZW4gZGUgY29uZmlybWF0aW9uIG5lIHNlbWJsZSBwYXMgdmFsaWRlIG91IGJpZW4gaWwgYSBleHBpcsOpLiBWb3VzIHBvdXZleiBlbiByZWNldm9pciB1biBub3V2ZWF1IDxhIGhyZWY9JyNVUkwnPmVuIGNsaXF1YW50IGljaTwvYT4uXCIsXG4gICAgZW1haWxOb3RGb3VuZDogXCJBdWN1biB1dGlsaXNhdGV1ciB0cm91dsOpIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgYWxyZWFkeUNvbm5lY3RlZDogXCJWb3VzIMOqdGVzIGTDqWrDoCBjb25uZWN0w6koZSkgYXUgc2l0ZSAhXCIsXG4gICAgbmVlZEJlQ29ubmVjdGVkOiBcIlZvdXMgZGV2ZXogw6p0cmUgY29ubmVjdMOpKGUpIHBvdXIgYWNjw6lkZXIgw6AgY2V0dGUgcGFnZS5cIixcbiAgICBjb25uZWN0aW9uT2s6IFwiQ29ubmV4aW9uIHLDqXVzc2llLlwiLFxuICAgIG5lZWRDaG9vc2VMb2dpbldheTogXCJWb3VzIGRldmV6IHNvaXQgc2Fpc2lyIHZvdHJlIG1vdCBkZSBwYXNzZSwgc29pdCBjb2NoZXIgbGEgY2FzZSB2b3VzIHBlcm1ldHRhbnQgZGUgcmVjZXZvaXIgdW4gbGllbiBkZSBjb25uZXhpb24gcGFyIGUtbWFpbC5cIixcbiAgICBuZWVkVmFsaWRhdGlvblRvTG9naW4gOiBcIlZvdXMgZGV2ZXogZCdhYm9yZCB2YWxpZGVyIHZvdHJlIGNvbXB0ZSBhdmFudCBkZSB2b3VzIGNvbm5lY3Rlci4gUG91ciBjZSBmYWlyZSwgdW4gbGllbiB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbC5cIixcbiAgICB0b29NYW55TG9naW5GYWlscyA6IFwiVHJvcCBkZSB0ZW50YXRpdmVzIGRlIGNvbm5leGlvbiBpbmZydWN0dWV1c2VzIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuIFZvdXMgZGV2ZXogYXR0ZW5kcmUgTUlOVVRFUyBtaW51dGVzIHBvdXIgZXNzYXllciBkZSBub3V2ZWF1LlwiLFxuICAgIGJhZFBhc3N3b3JkOiBcIkxlIG1vdCBkZSBwYXNzZSBuJ2VzdCBwYXMgbGUgYm9uLlwiLFxuICAgIG1haWxMb2dpbkxpbmtTdWJqZWN0IDogXCJWb3RyZSBsaWVuIGRlIGNvbm5leGlvbi5cIixcbiAgICBtYWlsTG9naW5MaW5rQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuUG91ciB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6IExJTktfVVJMXCIsXG4gICAgbWFpbExvZ2luTGlua0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZvdXMgY29ubmVjdGVyIMOgIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDo8L3A+PHA+PGEgaHJlZj1cXFwiTElOS19VUkxcXFwiPlZhbGlkZXIuPC9hPjwvcD5cIixcbiAgICBtYWlsTG9naW5MaW5rTWVzc2FnZSA6IFwiVW4gbGllbiBkZSBjb25uZXhpb24gdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHN1ciB2b3RyZSBhZHJlc3NlIGUtbWFpbC4gTmUgdGFyZGV6IHBhcyDDoCBsJ3V0aWxpc2VyLCBjYXIgaWwgbidlc3QgdmFsYWJsZSBxdWUgZHVyYW50IFwiLFxuICAgIHVwZGF0ZWRPa01lc3NhZ2U6IFwiVm9zIGluZm9ybWF0aW9ucyBvbnQgYmllbiDDqXTDqSBtaXNlcyDDoCBqb3VyLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEVtYWlsIDogXCJNYWlzIGxhIG5vdXZlbGxlIGFkcmVzc2UgZS1tYWlsIG4nYSBwdSDDqnRyZSBlbnJlZ2lzdHLDqWUgY2FyIGVsbGUgbidhIHBhcyB1bmUgZm9ybWF0IGNvcnJlY3QuXCIsXG4gICAgdXBkYXRlZE5lZWRVbmlxdWVFbWFpbCA6IFwiTWFpcyBsYSBub3V2ZWxsZSBhZHJlc3NlIGUtbWFpbCBzYWlzaWUgKE5FV19FTUFJTCkgbidhIHB1IMOqdHJlIGVucmVnaXN0csOpZSwgY2FyIGVsbGUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcG91ciB1biBhdXRyZSBjb21wdGUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luU3ViamVjdCA6IFwiTWVyY2kgZGUgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblBvdXIgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cyBkZSBjb25uZXhpb24sIDxhIGhyZWY9XFxcIkxJTktfVVJMXFxcIj5jbGlxdWV6IGljaTwvYT4gc2FucyB0YXJkZXIuPC9wPlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkxpbmtNZXNzYWdlOiBcIkNlcGVuZGFudCwgdm91cyBhdmV6IG1vZGlmacOpIGF1IG1vaW5zIHVuIGRlIHZvcyBpZGVudGlmaWFudHMgZGUgY29ubmV4aW9uIChlbWFpbCBldC9vdSBtb3QgZGUgcGFzc2UpIGV0IDxiPnZvdXMgZGV2ZXogY2xpcXVlciBzdXIgbGUgbGllbiBxdWkgdmllbnQgZGUgdm91cyDDqnRyZXMgZW52b3nDqSBzdXIgdm90cmUgYWRyZXNzZSAoTkVXX0VNQUlMKSBwb3VyIHZhbGlkZXIgY2UgY2hhbmdlbWVudDwvYj4uIEVuIGF0dGVuZGFudCwgbWVyY2kgZGUgY29udGludWVyIMOgIHV0aWxpc2VyIHZvcyBhbmNpZW5zIGlkZW50aWZpYW50cy5cIixcbiAgICB1cGRhdGVkTmVlZFZhbGlkYXRlZFVzZXI6IFwiTCd1dGlsaXNhdGV1ciBxdWUgdm91cyBzb3VoYWl0w6kgbW9kaWZpZXIgbidleGlzdGUgcGFzL3BsdXMgb3UgbidhIHBhcyBlbmNvcmUgdmFsaWTDqSBzb24gY29tcHRlLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEdvZGZhdGhlciA6IFwiTWFpcyBsZSBub3V2ZWF1IGNvZGUgcGFycmFpbiBuJ2EgcHUgw6p0cmUgcmV0ZW51LCBjYXIgaWwgbmUgY29ycmVzcG9uZCDDoCBhdWN1biBjb21wdGUgdXRpbGlzYXRldXIgb3Ugw6AgbCd1dGlsaXNhdGV1ciBsdWktbcOqbWUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luT2tNZXNzYWdlOiBcIkxhIG1pc2Ugw6Agam91ciBkZSB2b3MgaWRlbnRpZmlhbnRzIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgdXBkYXRlZEZhaWxlZEdvZGZhdGhlck5vdEZvdW5kIDogXCJMJ2lkZW50aWZpYW50IGZvdXJuaSBwb3VyIGxlIHBhcnJhaW4gbmUgY29ycmVzcG9uZCDDoCBhdWN1biB1dGlsaXNhdGV1ci5cIixcbiAgICBjcmVhdGlvbk9rTWVzc2FnZTogXCJMZSBub3V2ZWwgdXRpbGlzYXRldXIgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpLlwiLFxuICAgIG1haWxEZWxldGVTdWJqZWN0IDogXCJDb25maXJtZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLlwiLFxuICAgIG1haWxEZWxldGVCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5Qb3VyIHZhbGlkZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbERlbGV0ZUJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCA8YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+Y2xpcXVleiBpY2k8L2E+IHNhbnMgdGFyZGVyLjwvcD5cIixcbiAgICBtYWlsRGVsZXRlTGlua01lc3NhZ2U6IFwiVm90cmUgZGVtYW5kZSBkZSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLiBNZXJjaSBkZSBjbGlxdWVyIHNhbnMgdGFyZGVyIHN1ciBsZSBsaWVuIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbCBwb3VyIGNvbmZpcm1lci5cIixcbiAgICBkZWxldGVPa01lc3NhZ2U6IFwiTCd1dGlsaXNhdGV1ciBhIGJpZW4gw6l0w6kgc3VwcHJpbcOpLlwiLFxuICAgIGRlbGV0ZUZhaWxNZXNzYWdlOiBcIlRlbnRhdGl2ZSBkZSBzdXBwcmVzc2lvbiBkJ3VuIHV0aWxpc2F0ZXVyIGluZXhpc3RhbnQgOiBcIixcbiAgICBtYWlsRGVsZXRlTGlua09rTWVzc2FnZTogXCJWb3RyZSBjb21wdGUgYSBiaWVuIMOpdMOpIHN1cHByaW3DqS4gTWVyY2kgZCdhdm9pciB1dGlsaXPDqSBub3Mgc2VydmljZXMuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtBbHJlYWR5TWVzc2FnZTogXCJJbCBzZW1ibGUgcXVlIHZvdXMgYXlleiBkw6lqw6AgdmFsaWTDqSBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtGYWlsTWVzc2FnZTogXCJWb3RyZSBsaWVuIGRlIHN1cHByZXNzaW9uIG4nZXN0IHBhcyB2YWxpZGUgb3UgYWxvcnMgaWwgbidlc3QgcGx1cyB2YWxhYmxlLlwiLFxuICAgIGNyb25EZWxldGVVbnZhbGlkZWRVc2Vyc01lc3NhZ2U6IFwiIGNvbXB0ZXMgdXRpbGlzYXRldXJzIG5vbiB2YWxpZMOpcyBvbnQgw6l0w6kgc3VwcHJpbcOpcy5cIixcbiAgICBkZWxldGVJbmFjdGl2ZVVzZXJzTWVzc2FnZTogXCIgY29tcHRlcyB1dGlsaXNhdGV1cnMgaW5hY3RpZnMgb250IMOpdMOpIHN1cHByaW3DqXMuXCIsXG4gICAgd2VsY29tZU1lc3NhZ2U6IFwiQmllbnZlbnVlICNOQU1FICFcIixcbiAgICBieWVieWVNZXNzYWdlOiBcIlNpIHZvdXMgdm95ZXogY2UgbWVzc2FnZSwgYydlc3QgcXVlIHZvdHJlIGTDqWNvbm5leGlvbiBzJ2VzdCBiaWVuIGTDqXJvdWzDqWUuPGJyPsOAIGJpZW50w7R0ICFcIixcbiAgICBpbmZvc1VzZXJGb3JBZG1pbjogXCJDZXQgdXRpbGlzYXRldXIgKGlkOiBJRF9VU0VSKSBhIDxiPmNyw6nDqSBzb24gY29tcHRlIGxlIERBVEVfQ1JFQTwvYj4sIGxhIGRlcm5pw6hyZSBtaXNlIMOgIGpvdXIgZGF0YW50IGR1IERBVEVfVVBEQVRFLjxicj48Yj5EYXRlIGRlIHNhIGRlcm5pw6hyZSBjb25uZXhpb24gOiBEQVRFX0NPTk5FQ1RJT04uPC9iPlwiLFxuICAgIGluZm9zQWRtaW5Hb2RmYXRoZXI6IFwiQ2V0IHV0aWxpc2F0ZXVyIGEgw6l0w6kgcGFycmFpbsOpIHBhciBcIixcbiAgICBpbmZvc0FkbWluTmJHb2RDaGlsZHM6IFwiU2VzICNOQiBmaWxsZXVpbHMgOiBcIlxufTsiLCIvLyBRdWVscXVlcyBmb25jdGlvbnMgdXRpbGVzIHBvdXIgbGVzIGNoYcOubmVzXG5cbmNsYXNzIFRvb2xcbntcbiAgICBzdGF0aWMgaXNFbXB0eShteVZhcilcbiAgICB7XG4gICAgICAgIGlmKG15VmFyPT09dW5kZWZpbmVkIHx8IG15VmFyPT09bnVsbClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIG15VmFyKz1cIlwiOy8vIHNpIGF1dHJlIGNob3NlIHF1J3VuZSBjaGHDrm5lIGVudm95w6kuLi5cbiAgICAgICAgICAgIG15VmFyPW15VmFyLnRyaW0oKTtcbiAgICAgICAgICAgIGlmKG15VmFyPT09XCJcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgc3RhdGljIHRyaW1JZk5vdE51bGwobXlTdHJpbmcpXG4gICAge1xuICAgICAgICBpZihUb29sLmlzRW1wdHkobXlTdHJpbmcpKVxuICAgICAgICAgICAgbXlTdHJpbmc9bnVsbDtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVN0cmluZys9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVN0cmluZz1teVN0cmluZy50cmltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG15U3RyaW5nO1xuICAgIH1cblxuXG4gICAgc3RhdGljIHNob3J0ZW5JZkxvbmdlclRoYW4obXlTdHJpbmcsIG1heClcbiAgICB7XG4gICAgICAgIG15U3RyaW5nKz1cIlwiOy8vIGF1IGNhcyBvw7kgY2VsYSBuZSBzZXJhaXQgcGFzIHVuZSBjaGHDrm5lLi4uXG4gICAgICAgaWYobXlTdHJpbmcubGVuZ3RoID4gbWF4KVxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcuc3Vic3RyaW5nKDAsIChtYXgtMykpK1wiLi4uXCI7XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cbiAgICAvLyBzb3VyY2UgOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNTYwNDE0MC9yZXBsYWNlLW11bHRpcGxlLXN0cmluZ3Mtd2l0aC1tdWx0aXBsZS1vdGhlci1zdHJpbmdzXG4gICAgc3RhdGljIHJlcGxhY2VBbGwobXlTdHJpbmcsIG1hcE9iailcbiAgICB7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VFbHRzID0gbmV3IFJlZ0V4cChPYmplY3Qua2V5cyhtYXBPYmopLmpvaW4oXCJ8XCIpLFwiZ2lcIik7XG4gICAgICAgIHJldHVybiBteVN0cmluZy5yZXBsYWNlKHJlcGxhY2VFbHRzLCAobWF0Y2hlZCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG1hcE9ialttYXRjaGVkXTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZnIvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT2JqZXRzX2dsb2JhdXgvTWF0aC9yYW5kb21cbiAgICBzdGF0aWMgZ2V0UmFuZG9tSW50KG1pbiwgbWF4KVxuICAgIHtcbiAgICAgICAgbWluID0gTWF0aC5jZWlsKG1pbik7XG4gICAgICAgIG1heCA9IE1hdGguZmxvb3IobWF4KTtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pKSArIG1pbjtcbiAgICB9XG5cbiAgICAvLyDDoCBjb21wbMOpdGVyIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGF0ZV9mb3JtYXRfYnlfY291bnRyeVxuICAgIHN0YXRpYyBkYXRlRm9ybWF0KGRhdGVTdHJpbmcsIGxhbmc9XCJmclwiKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KGRhdGVTdHJpbmcpKVxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIGxldCBteURhdGU9bmV3IERhdGUoZGF0ZVN0cmluZyk7XG4gICAgICAgIGxldCBteURheT1teURhdGUuZ2V0RGF0ZSgpK1wiXCI7XG4gICAgICAgIGlmKG15RGF5Lmxlbmd0aD09PTEpXG4gICAgICAgICAgICBteURheT1cIjBcIitteURheTtcbiAgICAgICAgbGV0IG15TW91bnRoPShteURhdGUuZ2V0TW9udGgoKSsxKStcIlwiO1xuICAgICAgICBpZihteU1vdW50aC5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlNb3VudGg9XCIwXCIrbXlNb3VudGg7XG4gICAgICAgIGxldCBteVllYXI9bXlEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGlmKGxhbmc9PT1cImZyXCIpXG4gICAgICAgICAgICByZXR1cm4gbXlEYXkrXCIvXCIrbXlNb3VudGgrXCIvXCIrbXlZZWFyO1xuICAgICAgICBlbHNlIGlmIChsYW5nPT09XCJmb3JtXCIpLy8gMjAxNC0wMi0wOVxuICAgICAgICAgICAgcmV0dXJuIG15WWVhcitcIi1cIitteU1vdW50aCtcIi1cIitteURheTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG15TW91bnRoK1wiL1wiK215RGF5K1wiL1wiK215WWVhcjtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVG9vbDsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZGVmYXVsdC9jb25maWcvZnIuanNcIjogXCIuLi92aWV3cy9kZWZhdWx0L2NvbmZpZy9mci5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi92aWV3cyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC5qcyRcIjsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgaGVhZExpbmtzOlxuICAgIFtcbiAgICAgICAgeyBhbmNob3I6IFwiQWNjdWVpbFwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNb24gY29tcHRlXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb25uZXhpb24uaG10XCIsIGlkOiBcImFjY291bnRIZWFkTGlua1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiw4AgcHJvcG9zXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9hLXByb3Bvcy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDb250YWN0XCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb250YWN0Lmh0bWxcIiB9IH0sXG4gICAgXSxcbiAgICBmb290TGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJDcsOpZGl0c1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY3JlZGl0cy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNZW50aW9ucyBsw6lnYWxlc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvbWVudGlvbnMtbGVnYWxlcy5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiRG9ubsOpZXMgcGVyc29ubmVsbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9kb25uZWVzLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkMuRy5VLlwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY2d1Lmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDLkcuVi5cIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nndi5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICBdLFxuICAgIG1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlOiAxMCxcbiAgICB1c2VySG9tZVBhZ2UgOiBcImFjY3VlaWwuaHRtbFwiLFxuICAgIGFkbWluSG9tZVBhZ2UgOiBcImFkbWluLmh0bWxcIixcbiAgICBtYW5hZ2VySG9tZVBhZ2UgOiBcImdlc3Rpb24uaHRtbFwiLFxuICAgIHN1YnNjcmliZVBhZ2UgOiBcImluc2NyaXB0aW9uLmh0bWxcIixcbiAgICBjb25uZWN0aW9uUGFnZSA6IFwiY29ubmV4aW9uLmh0bWxcIixcbiAgICBhY2NvdW50UGFnZTogXCJjb21wdGUuaHRtbFwiLFxuICAgIHF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi1xdWl6cy5odG1sXCIsXG4gICAgdXNlcnNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXV0aWxpc2F0ZXVycy5odG1sXCIsXG4gICAgbmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSA6IDEwLFxuICAgIGlsbHVzdHJhdGlvbkRpciA6IFwiL2ltZy9xdWl6cy9cIixcbiAgICBzaXRlU2xvZ2FuOiBcIkN1bHRpdm9ucyBub3RyZSBqYXJkaW4gIVwiLFxuICAgIGhvbWVUaXRsZTE6IFwiRGUgbmF0dXJlIGN1cmlldXNlID9cIixcbiAgICBob21lUDE6IFwiQXZlYyBXaWtpTGVybmkgdm91cyBhcHByZW5leiBjaGFxdWUgam91ciBkZSBub3V2ZWxsZXMgY2hvc2VzLjxicj5EZXMgYXJ0aWNsZXMgZGUgV2lraXDDqWRpYSBzb250IHPDqWxlY3Rpb25uw6lzIHBvdXIgdm91cyBldCBzb250IHN1aXZpcyBkJ3VuIHF1aXogdm91cyBwZXJtZXR0YW50IGRlIHRlc3RlciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudS48YnI+RGUgam91ciBlbiBqb3VyIGRlIG5vdXZlbGxlcyBncmFpbmVzIGRlIHNhdm9pciBzb250IGFpbnNpIHNlbcOpZXMgZGFucyB2b3RyZSBcXFwiamFyZGluXFxcIi5cIixcbiAgICBob21lVGl0bGUyOiBcIkxhIGN1bHR1cmUgZW4gbGliZXJ0w6lcIixcbiAgICBob21lUDI6IFwiVG91dCBjb21tZSBzdXIgV2lraXDDqWRpYSAoKiksIGxlIGxvZ2ljaWVsIGV0IGxlIGNvbnRlbnUgcGFydGFnw6kgc3VyIFdpa2lMZXJuaSBzb250IGxpYnJlcy48YnI+Vm91cyBwb3V2ZXogbGVzIHV0aWxpc2VyLCBsZXMgbW9kaWZpZXIgZXQgbGVzIGRpZmZ1c2VyIHNlbG9uIHZvdHJlIHNvdWhhaXQuPGJyPlN1ciBXaWtpTGVybmksIHBhcyBkZSBwdWJsaWNpdMOpLCBuaSBkZSBjb21tZXJjaWFsaXNhdGlvbiBkZSB2b3MgZG9ubsOpZXMgcGVyc29ubmVsbGVzLjxicj5Wb3VzIHBvdXZleiB2ZW5pciB5IFxcXCJjdWx0aXZlciB2b3RyZSBqYXJkaW5cXFwiIGVuIHRvdXRlIHRyYW5xdWlsbGl0w6kuPGJyPjxicj48c21hbGw+PGVtPigqKSBCaWVuIHF1ZSBwYXJ0YWdlYW50IHNlcyB2YWxldXJzLCBXaWtpTGVybmkgZXN0IHVuIHByb2pldCBpbmTDqXBlbmRhbnQgZGUgbGEgZm9uZGF0aW9uIFdpa2lww6lkaWEuPC9lbT48L3NtYWxsPlwiLFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzVGl0bGU6IFwiTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzIHN1ciBXaWtpTGVybmlcIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc0ludHJvOiBcIkxpc3RlIGRlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyBzdXIgV2lraUxlcm5pLlwiLFxuICAgIGV4cGxhbmF0aW9uVGl0bGU6IFwiVm91cyBkw6ljb3V2cmV6IFdpa2lMZXJuaSA/XCIsXG4gICAgZXhwbGFuYXRpb25UeHQ6IFwiTGUgcHJpbmNpcGUgZXN0IHNpbXBsZSA6IHZvdXMgY29tbWVuY2V6IHBhciBsaXJlIGwnYXJ0aWNsZSBXaWtpcMOpZGlhIGRvbnQgbGUgbGllbiB2b3VzIGVzdCBwcm9wb3PDqS48YnI+UHVpcyB2b3VzIGFmZmljaGVyIGxlIHF1aXogcG91ciB2w6lyaWZpZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUgZGUgdm90cmUgbGVjdHVyZS4gVm91cyBvYnRlbmV6IGFsb3JzIHZvdHJlIHLDqXN1bHRhdCBpbW3DqWRpYXRlbWVudC48YnI+PGJyPlRvdXRlcyBsZXMgcsOpcG9uc2VzIHNlIHRyb3V2ZW50IGRhbnMgbCdhcnRpY2xlIHByb3Bvc8OpIMOgIGxhIGxlY3R1cmUuIDxiPlZvdXMgw6p0ZXMgaWNpIHBvdXIgYXBwcmVuZHJlIGRlIG5vdXZlbGxlcyBjaG9zZXM8L2I+LCBtYWlzIGxpYnJlIMOgIHZvdXMgZCdlc3NheWVyIGQneSByw6lwb25kcmUgaW1tw6lkaWF0ZW1lbnQuPGJyPjxicj5RdWFuZCBsZSBzdWpldCBzJ3kgcHLDqnRlLCBuZSB2b3VzIMOpdG9ubmV6IHBhcyBzaSBjZXJ0YWluZXMgZGVzIHLDqXBvbnNlcyBwcm9wb3PDqWVzIHBldXZlbnQgw6p0cmUgdW4gcGV1IGTDqWNhbMOpZXMsIGFic3VyZGVzLi4uIE9uIHBldXQgYXBwcmVuZHJlIGF2ZWMgbGUgc291cmlyZSwgbm9uID8gOi0pPGJyPjxicj5VbmUgZm9pcyB2b3RyZSByw6lzdWx0YXQgb2J0ZW51LCBpbCB2b3VzIHNlcmEgcHJvcG9zw6kgZGUgY3LDqWVyIHVuIGNvbXB0ZSBwb3VyIGxlIHNhdXZlZ2FyZGVyLjxicj5DZSBjb21wdGUgdm91cyBwZXJtZXR0cmEgZGUgdGVzdGVyIGRlIG5vdXZlYXUgY2UgcXVpeiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudSBwbHVzaWV1cnMgam91cnMsIHNlbWFpbmVzLCBtb2lzLi4uIEV0IGRlIHJlY2V2b2lyIHLDqWd1bGnDqHJlbWVudCBkZSBub3V2ZWxsZXMgc3VnZ2VzdGlvbnMgZGUgbGVjdHVyZXMuPGJyPjxicj5NYWlzIDxiPmxhIGNyw6lhdGlvbiBkZSBjZSBjb21wdGUgZXN0IGZhY3VsdGF0aXZlPC9iPiBldCA8YSBocmVmPScvcXVpenMvJyB0aXRsZT0nTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzJz52b3VzIHBvdXZleiBwYXJjb3VyaXIgV2lraUxlcm5pIGxpYnJlbWVudDwvYT4uXCIsXG4gICAgbm9KU05vdGlmaWNhdGlvbjogXCJEw6lzb2zDqSwgbWFpcyBwb3VyIGwnaW5zdGFudCwgbCd1dGlsaXNhdGlvbiBkZSBXaWtpTGVybmkgbsOpY2Vzc2l0ZSBsJ2FjdGl2YXRpb24gZHUgSmF2YVNjcmlwdC5cIixcbn07IiwiLy8gLS0gR0VTVElPTiBEVSBGT1JNVUxBSVJFIFBFUk1FVFRBTlQgREUgU0FJU0lSIC8gw4lESVRFUiBMRVMgUVVJWlMgRVQgTEVVUlMgRMOJUEVOREFOQ0VTIChMSUVOUywgSU1BR0VTLCBUQUdTLCBFVEMuKVxuXG4vLy8gVsOpcmlmaWUgcXVlIGwndXRpbGlzYXRldXIgZXN0IGJpZW4gY29ubmVjdMOpLCBhIGxlIGJvbiBzdGF0dXQgZXQgbGUgcmVkaXJpZ2UgdmVycyBsZSBmb3JtdWxhaXJlIGQnaW5zY3JpcHRpb24gc2kgY2Ugbidlc3QgcGFzIGxlIGNhcy5cbi8vLyBTaSBjJ2VzdCBvaywgcHJvcG9zZSB1biBtb3RldXIgZGUgcmVjaGVyY2hlIHBlcm1ldHRhbnQgZGUgY2hlcmNoZXIgdW4gcXVpelxuLy8vIFNpIHVuIGlkIGVzdCBwYXNzw6kgcGFyIGwndXJsIG9uIGFmZmljaGUgbGVzIGluZm9ybWF0aW9ucyBkdSBxdWl6IGRhbnMgdW4gZm9ybXVsYWlyZSBwZXJtZXR0YW50IGRlIGwnw6lkaXRlci9zdXBwcmltZXIgYXZlYyB1bmUgbGlzdGUgZGVzIMOpbMOpbWVudHMgbGnDqXMgKGxpZW5zLCBpbGx1c3RyYXRpb25zLCBxdWVzdGlvbnMuLi4pIHBvdXZhbnQgZXV4LW3Dqm1lcyDDqnRyZSDDqWRpdMOpcy9zdXBwcmltw6lzLlxuLy8vIFNpIGxlIG5vbWJyZSBtYXggY29uZmlndXLDqSBwb3VyIGNoYWN1biBkZSBzZXMgw6lsw6ltZW50cyBuJ2VzdCBwYXMgYXR0ZWludCwgaWwgZXN0IGF1c3NpIHByb3Bvc8OpIGQnYWpvdXRlciB1biBub3V2ZWwgw6lsw6ltZW50LlxuLy8vIFNpbm9uIHBhcyBkJ2lkIHBhc3PDqSBwYXIgbCd1cmwsIG9uIGFmZmljaGUgdW4gZm9ybXVsYWlyZSB2aWRlIHBlcm1ldHRhbnQgZCdlbiBzYWlzaXIgdW4gbm91dmVhdSBhdmVjIHNlcyB0YWdzLlxuXG4vLyBGaWNoaWVyIGRlIGNvbmZpZ3VyYXRpb24gY8O0dMOpIGNsaWVudCA6XG5pbXBvcnQgeyBhcGlVcmwsIGF2YWlsYWJsZUxhbmdzLCB0aGVtZSB9IGZyb20gXCIuLi8uLi9jb25maWcvaW5zdGFuY2UuanNcIjtcbmNvbnN0IGxhbmc9YXZhaWxhYmxlTGFuZ3NbMF07XG5jb25zdCBjb25maWdGcm9udEVuZCA9IHJlcXVpcmUoXCIuLi8uLi92aWV3cy9cIit0aGVtZStcIi9jb25maWcvXCIrbGFuZytcIi5qc1wiKTtcblxuLy8gRm9uY3Rpb25zIHV0aWxlcyBhdSBzY3JpcHQgOiAhISByZXZvaXIgcXVhbmQgbGUgcmVzdGUgc2VyYSBmaW5pIHBvdXIgdsOpcmlmaWVyIHNpIHRvdXQgZXN0IHV0aWxlXG5pbXBvcnQgeyBnZXRMb2NhbHksIHJlbW92ZUxvY2FseSwgc2F2ZUxvY2FseSB9IGZyb20gXCIuL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanNcIjtcbmltcG9ydCB7IGFkZEVsZW1lbnQgfSBmcm9tIFwiLi90b29scy9kb20uanNcIjtcbmltcG9ydCB7IGhlbGxvRGV2LCB1cGRhdGVBY2NvdW50TGluayB9IGZyb20gXCIuL3Rvb2xzL2V2ZXJ5d2hlcmUuanNcIjtcbmltcG9ydCB7IGVtcHlBbmRIaWRlRm9ybSwgZW1weUZvcm0sIGdldERhdGFzRnJvbUlucHV0cywgc2V0QXR0cmlidXRlc1RvSW5wdXRzIH0gZnJvbSBcIi4vdG9vbHMvZm9ybXMuanNcIjtcbmltcG9ydCB7IGRhdGVGb3JtYXQsIGlzRW1wdHksIHJlcGxhY2VBbGwgfSBmcm9tIFwiLi4vLi4vdG9vbHMvbWFpblwiO1xuaW1wb3J0IHsgZ2V0VXJsUGFyYW1zIH0gZnJvbSBcIi4vdG9vbHMvdXJsLmpzXCI7XG5pbXBvcnQgeyBjaGVja1Nlc3Npb24sIGdldENvbmZpZyB9IGZyb20gXCIuL3Rvb2xzL3VzZXJzLmpzXCI7XG5cbi8vIERpY3Rpb25uYWlyZXMgOlxuY29uc3QgdHh0ID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi9nZW5lcmFsXCIpO1xuY29uc3QgdHh0VXNlcnMgPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL3VzZXJcIik7XG5jb25zdCB0eHRRdWVzdGlvbm5haXJlID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi9xdWVzdGlvbm5haXJlXCIpO1xuY29uc3QgdHh0UXVlc3Rpb24gPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL3F1ZXN0aW9uXCIpO1xuY29uc3QgdHh0TGluayA9IHJlcXVpcmUoXCIuLi8uLi9sYW5nL1wiK2xhbmcrXCIvbGlua1wiKTtcbmNvbnN0IHR4dElsbHVzdHJhdGlvbiA9IHJlcXVpcmUoXCIuLi8uLi9sYW5nL1wiK2xhbmcrXCIvaWxsdXN0cmF0aW9uXCIpO1xuXG5oZWxsb0RldigpO1xuXG4vLyBQcmluY2lwYXV4IMOpbMOpbWVudHMgZHUgRE9NIG1hbmlwdWzDqXMgOlxuY29uc3QgZGl2TWFpbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWFpbi1jb250ZW50XCIpO1xuY29uc3QgZGl2TWVzc2FnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWVzc2FnZVwiKTtcbmNvbnN0IGRpdlJlc3BvbnNlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJyZXNwb25zZVwiKTtcbmNvbnN0IGZvcm1RdWVzdGlvbm5haXJlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJxdWVzdGlvbm5haXJlc1wiKTtcbmNvbnN0IGlucHV0Q2xhc3NpZmljYXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImNsYXNzaWZpY2F0aW9uXCIpO1xuY29uc3QgaGVscENsYXNzaWZpY2F0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJoZWxwQ2xhc3NpZmljYXRpb25cIik7XG5jb25zdCBoZWxwUHVibGlzaGluZ0F0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJoZWxwUHVibGlzaGluZ0F0XCIpO1xuY29uc3QgZGVsZXRlQ2hlY2tCb3ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImRlbGV0ZU9rTGFiZWxcIik7XG5jb25zdCBidG5OZXdRdWVzdGlvbm5haXJlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ3YW50TmV3UXVlc3Rpb25uYWlyZVwiKTtcbmNvbnN0IGJ0blByZXZpZXdRdWVzdGlvbm5haXJlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJwcmV2aWV3UXVlc3Rpb25uYWlyZVwiKTtcblxuY29uc3QgZGl2UXVlc3Rpb25uYWlyZXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInF1ZXN0aW9ubmFpcmVzTGlzdFwiKTtcblxuY29uc3QgZm9ybVNlYXJjaCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic2VhcmNoXCIpO1xuY29uc3QgZGl2U2VhcmNoUmVzdWx0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzZWFyY2hSZXN1bHRcIik7XG5cbmNvbnN0IGZvcm1MaW5rID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJsaW5rc1wiKTtcbmNvbnN0IGZvcm1JbGx1c3RyYXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImlsbHVzdHJhdGlvbnNcIik7XG5jb25zdCBmb3JtUXVlc3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInF1ZXN0aW9uc1wiKTtcbmNvbnN0IGRpdkxpbmtzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJsaW5rc0xpc3RcIik7XG5jb25zdCBkaXZJbGx1c3RyYXRpb25zID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJpbGx1c3RyYXRpb25zTGlzdFwiKTtcbmNvbnN0IGRpdlF1ZXN0aW9ucyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicXVlc3Rpb25zTGlzdFwiKTtcblxuY29uc3QgaW5pdGlhbGlzZSA9IGFzeW5jICgpID0+XG57XG4gICAgdHJ5XG4gICAgeyAgICAgICAgXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IGdldENvbmZpZygpO1xuICAgICAgICBpZighY29uZmlnKVxuICAgICAgICAgICAgYWRkRWxlbWVudChkaXZNZXNzYWdlLCBcInBcIiwgdHh0LnNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgaXNDb25uZWN0ZWQ9YXdhaXQgY2hlY2tTZXNzaW9uKFtcIm1hbmFnZXJcIiwgXCJhZG1pblwiXSwgXCIvXCIrY29uZmlnRnJvbnRFbmQuY29ubmVjdGlvblBhZ2UsIHsgbWVzc2FnZTogdHh0VXNlcnMubmVlZEJlQ29ubmVjdGVkLCBjb2xvcjpcImVycm9yXCIgfSwgd2luZG93LmxvY2F0aW9uKTtcbiAgICAgICAgICAgIGlmKGlzQ29ubmVjdGVkKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRpdk1haW4uc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgICAgICAgICAgaWYoIWlzRW1wdHkoZ2V0TG9jYWx5KFwibWVzc2FnZVwiKSkpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdk1lc3NhZ2UsIFwicFwiLCBnZXRMb2NhbHkoXCJtZXNzYWdlXCIsIHRydWUpLm1lc3NhZ2UsIFwiXCIsIFtnZXRMb2NhbHkoXCJtZXNzYWdlXCIsIHRydWUpLmNvbG9yXSwgXCJcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJtZXNzYWdlXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB1c2VyPWdldExvY2FseShcInVzZXJcIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdXBkYXRlQWNjb3VudExpbmsodXNlci5zdGF0dXMsIGNvbmZpZ0Zyb250RW5kKTtcblxuICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpc2F0aW9uIGR1IGZvcm11bGFpcmUgZGUgcmVjaGVyY2hlIDpcbiAgICAgICAgICAgICAgICBzZXRBdHRyaWJ1dGVzVG9JbnB1dHMoY29uZmlnLCBmb3JtU2VhcmNoKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBJbml0aWFsaXNlIGxlIGZvcm11bGFpcmUgcGVybWV0dGFudCBkZSBtZXR0cmUgw6Agam91ciBsZXMgaW5mb3MgZGUgYmFzZSBkdSBxdWVzdGlvbm5haXJlIDpcbiAgICAgICAgICAgICAgICBzZXRBdHRyaWJ1dGVzVG9JbnB1dHMoY29uZmlnLlF1ZXN0aW9ubmFpcmUsIGZvcm1RdWVzdGlvbm5haXJlKTtcbiAgICAgICAgICAgICAgICAvLyBDYXNlIGRlIHN1cHByZXNzaW9uIGNhY2jDqWUgcGFyIGTDqWZhdXQsIGNhciBpbnV0aWxlIHBvdXIgZm9ybXVsYWlyZSBkZSBjcsOpYXRpb25cbiAgICAgICAgICAgICAgICBkZWxldGVDaGVja0JveC5zdHlsZS5kaXNwbGF5PVwibm9uZVwiO1xuXG4gICAgICAgICAgICAgICAgLy8gRm9uY3Rpb24gdmlkYW50IGV0IGNhY2hhbnQgdG91cyBsZXMgZm9ybXVsYWlyZXMgYW5uZXhlc1xuICAgICAgICAgICAgICAgIGNvbnN0IGhpZGVBbGxGb3JtcyA9ICgpID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBlbXB5QW5kSGlkZUZvcm0oZm9ybUxpbmspO1xuICAgICAgICAgICAgICAgICAgICBpZih0eHRMaW5rLmRlZmF1bHRWYWx1ZSE9MClcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYW5jaG9yXCIpLnZhbHVlPXR4dExpbmsuZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBlbXB5QW5kSGlkZUZvcm0oZm9ybUlsbHVzdHJhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGVtcHlBbmRIaWRlRm9ybShmb3JtUXVlc3Rpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoaWRlQWxsRm9ybXMoKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBBZmZpY2hlIGxlcyBpbmZvcyBjb25udWVzIGNvbmNlcm5hbnQgbGVzIGxpZW5zXG4gICAgICAgICAgICAgICAgY29uc3Qgc2hvd0xpbmtJbmZvcyA9IChMaW5rcykgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2TGlua3MsIFwiaDRcIiwgdHh0TGluay5pbnRyb1RpdGxlKTsvLyByZW1wbGFjZSBsJ2V4aXN0YW50IGRhbnMgZGl2TGlua3NcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxpc3RMaW5rcz1cIlwiO1xuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gTGlua3MpXG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0TGlua3MrPVwiPGxpPjxhIGhyZWY9J1wiK0xpbmtzW2ldLnVybCtcIicgdGFyZ2V0PSdfYmxhbmsnPlwiK0xpbmtzW2ldLmFuY2hvcitcIjwvYT4gfCA8YSBocmVmPScjdXBkYXRlTGlua1wiK0xpbmtzW2ldLmlkK1wiJyBpZD0nI3VwZGF0ZUxpbmtcIitMaW5rc1tpXS5pZCtcIicgPlwiK3R4dC51cGRhdGVCdG5UeHQrXCI8L2E+IHwgPGEgaHJlZj0nI2RlbGV0ZUxpbmtcIitMaW5rc1tpXS5pZCtcIicgaWQ9JyNkZWxldGVMaW5rXCIrTGlua3NbaV0uaWQrXCInID5cIit0eHQuZGVsZXRlQnRuVHh0K1wiPC9hPjwvbGk+XCI7XG4gICAgICAgICAgICAgICAgICAgIGlmKGxpc3RMaW5rcz09PVwiXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0TGlua3M9XCI8bGk+XCIrdHh0TGluay5pbnRyb05vTGluaytcIjwvbGk+XCI7XG4gICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2TGlua3MsIFwidWxcIiwgbGlzdExpbmtzLCBcIlwiLCBbXCJpbmZvcm1hdGlvblwiXSwgXCJcIiwgZmFsc2UpOy8vIMOgIGludMOpZ3JlciBkYW5zIGxlIERPTSBwb3VyIHBvdXZvaXIgYWpvdXRlciBkZXMgYWRkRXZlbnRMaXN0ZW5lciBlbnN1aXRlXG4gICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiBMaW5rcylcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCIjdXBkYXRlTGlua1wiK0xpbmtzW2ldLmlkKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0Zvcm1MaW5rSW5mb3MoTGlua3NbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIjbGlua3NcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiI2RlbGV0ZUxpbmtcIitMaW5rc1tpXS5pZCkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dGb3JtTGlua0luZm9zKExpbmtzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtTGluay5lbGVtZW50c1tcImRlbGV0ZU9rXCJdLnZhbHVlPXRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZExpbmtGb3JtKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZihjb25maWcubmJMaW5rc01heCA+IExpbmtzLmxlbmd0aCB8fCBjb25maWcubmJMaW5rc01heD09PTApXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKExpbmtzLmxlbmd0aCA8IGNvbmZpZy5uYkxpbmtzTWluKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2TGlua3MsIFwiYVwiLCB0eHQuYWRkQnRuVHh0LCBcIiNuZXdMaW5rXCIsIFtcImVycm9yXCJdLCB7IGhyZWY6XCIjbmV3TGlua1wiIH0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdkxpbmtzLCBcImFcIiwgdHh0LmFkZEJ0blR4dCwgXCIjbmV3TGlua1wiLCBbXCJpbmZvcm1hdGlvblwiXSwgeyBocmVmOlwiI25ld0xpbmtcIiB9LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIiNuZXdMaW5rXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbihlKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRlQWxsRm9ybXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtTGluay5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtTGluay5lbGVtZW50c1tcIlF1ZXN0aW9ubmFpcmVJZFwiXS52YWx1ZT1mb3JtUXVlc3Rpb25uYWlyZS5lbGVtZW50c1tcImlkXCJdLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIjbGlua3NcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXR0cmlidXRlc1RvSW5wdXRzKGNvbmZpZy5MaW5rLCBmb3JtTGluayk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBBZmZpY2hlIGxlcyBpbmZvcyBjb25udWVzIGNvbmNlcm5hbnQgbGVzIGlsbHVzdHJhdGlvbnNcbiAgICAgICAgICAgICAgICBjb25zdCBzaG93SWxsdXN0cmF0aW9uSW5mb3MgPSAoSWxsdXN0cmF0aW9ucykgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2SWxsdXN0cmF0aW9ucywgXCJoNFwiLCB0eHRJbGx1c3RyYXRpb24uaW50cm9UaXRsZSk7Ly8gcmVtcGxhY2UgbCdleGlzdGFudCBkYW5zIGRpdklsbHVzdHJhdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxpc3RJbGx1c3RyYXRpb25zPVwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiBJbGx1c3RyYXRpb25zKVxuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdElsbHVzdHJhdGlvbnMrPVwiPGxpPjxhIGhyZWY9J1wiK2NvbmZpZ0Zyb250RW5kLmlsbHVzdHJhdGlvbkRpcitJbGx1c3RyYXRpb25zW2ldLnVybCtcIicgdGFyZ2V0PSdfYmxhbmsnPjxpbWcgc3JjPSdcIitjb25maWdGcm9udEVuZC5pbGx1c3RyYXRpb25EaXIrSWxsdXN0cmF0aW9uc1tpXS51cmwrXCInIGFsdD0nXCIrdHh0SWxsdXN0cmF0aW9uLmRlZmF1bHRBbHQrXCInIHN0eWxlPSdtYXgtaGVpZ2h0OjE1MHB4Jz48L2E+IHwgPGEgaHJlZj0nI3VwZGF0ZUlsbHVzdHJhdGlvblwiK0lsbHVzdHJhdGlvbnNbaV0uaWQrXCInIGlkPScjdXBkYXRlSWxsdXN0cmF0aW9uXCIrSWxsdXN0cmF0aW9uc1tpXS5pZCtcIicgPlwiK3R4dC51cGRhdGVCdG5UeHQrXCI8L2E+IHwgPGEgaHJlZj0nI2RlbGV0ZUlsbHVzdHJhdGlvblwiK0lsbHVzdHJhdGlvbnNbaV0uaWQrXCInIGlkPScjZGVsZXRlSWxsdXN0cmF0aW9uXCIrSWxsdXN0cmF0aW9uc1tpXS5pZCtcIicgPlwiK3R4dC5kZWxldGVCdG5UeHQrXCI8L2E+PC9saT5cIjtcbiAgICAgICAgICAgICAgICAgICAgaWYobGlzdElsbHVzdHJhdGlvbnM9PT1cIlwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdElsbHVzdHJhdGlvbnM9XCI8bGk+XCIrdHh0SWxsdXN0cmF0aW9uLmludHJvTm9JbGx1c3RyYXRpb24rXCI8L2xpPlwiO1xuICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdklsbHVzdHJhdGlvbnMsIFwidWxcIiwgbGlzdElsbHVzdHJhdGlvbnMsIFwiXCIsIFtcImluZm9ybWF0aW9uXCJdLCBcIlwiLCBmYWxzZSk7Ly8gw6AgaW50w6lncmVyIGRhbnMgbGUgRE9NIHBvdXIgcG91dm9pciBham91dGVyIGRlcyBhZGRFdmVudExpc3RlbmVyIGVuc3VpdGVcbiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpIGluIElsbHVzdHJhdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiI3VwZGF0ZUlsbHVzdHJhdGlvblwiK0lsbHVzdHJhdGlvbnNbaV0uaWQpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbihlKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93Rm9ybUlsbHVzdHJhdGlvbkluZm9zKElsbHVzdHJhdGlvbnNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIjaWxsdXN0cmF0aW9uc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCIjZGVsZXRlSWxsdXN0cmF0aW9uXCIrSWxsdXN0cmF0aW9uc1tpXS5pZCkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dGb3JtSWxsdXN0cmF0aW9uSW5mb3MoSWxsdXN0cmF0aW9uc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUlsbHVzdHJhdGlvbi5lbGVtZW50c1tcImRlbGV0ZU9rXCJdLnZhbHVlPXRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZElsbHVzdHJhdGlvbkZvcm0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmKGNvbmZpZy5uYklsbHVzdHJhdGlvbnNNYXggPiBJbGx1c3RyYXRpb25zLmxlbmd0aCB8fCBjb25maWcubmJJbGx1c3RyYXRpb25zTWF4PT09MClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICBpZihJbGx1c3RyYXRpb25zLmxlbmd0aCA8IGNvbmZpZy5uYklsbHVzdHJhdGlvbnNNaW4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZJbGx1c3RyYXRpb25zLCBcImFcIiwgdHh0LmFkZEJ0blR4dCwgXCIjbmV3SWxsdXN0cmF0aW9uXCIsIFtcImVycm9yXCJdLCB7IGhyZWY6XCIjbmV3SWxsdXN0cmF0aW9uXCIgfSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2SWxsdXN0cmF0aW9ucywgXCJhXCIsIHR4dC5hZGRCdG5UeHQsIFwiI25ld0lsbHVzdHJhdGlvblwiLCBbXCJpbmZvcm1hdGlvblwiXSwgeyBocmVmOlwiI25ld0lsbHVzdHJhdGlvblwiIH0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiI25ld0lsbHVzdHJhdGlvblwiKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZUFsbEZvcm1zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUlsbHVzdHJhdGlvbi5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtSWxsdXN0cmF0aW9uLmVsZW1lbnRzW1wiUXVlc3Rpb25uYWlyZUlkXCJdLnZhbHVlPWZvcm1RdWVzdGlvbm5haXJlLmVsZW1lbnRzW1wiaWRcIl0udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIiNpbGx1c3RyYXRpb25zXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEF0dHJpYnV0ZXNUb0lucHV0cyhjb25maWcuSWxsdXN0cmF0aW9uLCBmb3JtSWxsdXN0cmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEFmZmljaGUgbGVzIGluZm9zIGNvbm51ZXMgY29uY2VybmFudCBsZXMgcXVlc3Rpb25zXG4gICAgICAgICAgICAgICAgY29uc3Qgc2hvd1F1ZXN0aW9uSW5mb3MgPSAoUXVlc3Rpb25zKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZRdWVzdGlvbnMsIFwiaDRcIiwgdHh0UXVlc3Rpb24uaW50cm9UaXRsZSk7Ly8gcmVtcGxhY2UgbCdleGlzdGFudCBkYW5zIGRpdlF1ZXN0aW9uc1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGlzdFF1ZXN0aW9ucz1cIlwiO1xuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gUXVlc3Rpb25zKVxuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFF1ZXN0aW9ucys9XCI8bGk+XCIrUXVlc3Rpb25zW2ldLlF1ZXN0aW9uLnRleHQrXCIgfCA8YSBocmVmPScjdXBkYXRlUXVlc3Rpb25cIitRdWVzdGlvbnNbaV0uUXVlc3Rpb24uaWQrXCInIGlkPScjdXBkYXRlUXVlc3Rpb25cIitRdWVzdGlvbnNbaV0uUXVlc3Rpb24uaWQrXCInID5cIit0eHQudXBkYXRlQnRuVHh0K1wiPC9hPiB8IDxhIGhyZWY9JyNkZWxldGVRdWVzdGlvblwiK1F1ZXN0aW9uc1tpXS5RdWVzdGlvbi5pZCtcIicgaWQ9JyNkZWxldGVRdWVzdGlvblwiK1F1ZXN0aW9uc1tpXS5RdWVzdGlvbi5pZCtcIicgPlwiK3R4dC5kZWxldGVCdG5UeHQrXCI8L2E+PC9saT5cIjtcbiAgICAgICAgICAgICAgICAgICAgaWYobGlzdFF1ZXN0aW9ucz09PVwiXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0UXVlc3Rpb25zPVwiPGxpPlwiK3R4dFF1ZXN0aW9uLmludHJvTm9RdWVzdGlvbitcIjwvbGk+XCI7XG4gICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UXVlc3Rpb25zLCBcInVsXCIsIGxpc3RRdWVzdGlvbnMsIFwiXCIsIFtcImluZm9ybWF0aW9uXCJdLCBcIlwiLCBmYWxzZSk7Ly8gw6AgaW50w6lncmVyIGRhbnMgbGUgRE9NIHBvdXIgcG91dm9pciBham91dGVyIGRlcyBhZGRFdmVudExpc3RlbmVyIGVuc3VpdGVcbiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpIGluIFF1ZXN0aW9ucylcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCIjdXBkYXRlUXVlc3Rpb25cIitRdWVzdGlvbnNbaV0uUXVlc3Rpb24uaWQpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbihlKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93Rm9ybVF1ZXN0aW9uSW5mb3MoUXVlc3Rpb25zW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKFwiI2xpbmtzXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIiNkZWxldGVRdWVzdGlvblwiK1F1ZXN0aW9uc1tpXS5RdWVzdGlvbi5pZCkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dGb3JtUXVlc3Rpb25JbmZvcyhRdWVzdGlvbnNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1RdWVzdGlvbi5lbGVtZW50c1tcImRlbGV0ZU9rXCJdLnZhbHVlPXRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZFF1ZXN0aW9uRm9ybSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYoY29uZmlnLm5iUXVlc3Rpb25zTWF4ID4gUXVlc3Rpb25zLmxlbmd0aCB8fCBjb25maWcubmJRdWVzdGlvbnNNYXg9PT0wKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgIGlmKFF1ZXN0aW9ucy5sZW5ndGggPCBjb25maWcubmJRdWVzdGlvbnNNaW4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZRdWVzdGlvbnMsIFwiYVwiLCB0eHQuYWRkQnRuVHh0LCBcIiNuZXdRdWVzdGlvblwiLCBbXCJlcnJvclwiXSwgeyBocmVmOlwiI25ld1F1ZXN0aW9uXCIgfSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UXVlc3Rpb25zLCBcImFcIiwgdHh0LmFkZEJ0blR4dCwgXCIjbmV3UXVlc3Rpb25cIiwgW1wiaW5mb3JtYXRpb25cIl0sIHsgaHJlZjpcIiNuZXdRdWVzdGlvblwiIH0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiI25ld1F1ZXN0aW9uXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbihlKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRlQWxsRm9ybXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtUXVlc3Rpb24uc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVF1ZXN0aW9uLmVsZW1lbnRzW1wiUXVlc3Rpb25uYWlyZUlkXCJdLnZhbHVlPWZvcm1RdWVzdGlvbm5haXJlLmVsZW1lbnRzW1wiaWRcIl0udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVF1ZXN0aW9uLmVsZW1lbnRzW1wicmFua1wiXS52YWx1ZT1jb25maWcuUXVlc3Rpb24ucmFuay5kZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIiNxdWVzdGlvbnNcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXR0cmlidXRlc1RvSW5wdXRzKGNvbmZpZy5RdWVzdGlvbiwgZm9ybVF1ZXN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gRm9uY3Rpb24gYWZmaWNoYW50IGxlcyBpbmZvcyBkJ3VuIGxpZW4gZGFucyBsZSBmb3JtdWxhaXJlIGFkaG9jXG4gICAgICAgICAgICAgICAgY29uc3Qgc2hvd0Zvcm1MaW5rSW5mb3MgPSAoTGluaykgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG9uIGNvbW1lbmNlIHBhciBjYWNoZXIgZXQgdmlkZXIgdG91cyBsZXMgZm9ybXVsYWlyZXMgYW5uZXhlc1xuICAgICAgICAgICAgICAgICAgICBoaWRlQWxsRm9ybXMoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gcHVpcyBvbiBhZmZpY2hlIGNlbHVpIGRvbnQgbCdpZCBlc3QgcGFzc8OpIGF2ZWMgc2VzIGRvbm7DqWVzIGNvbm51ZXNcbiAgICAgICAgICAgICAgICAgICAgZm9ybUxpbmsuc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgICAgICAgICAgICAgIGZvcihsZXQgZGF0YSBpbiBMaW5rKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihmb3JtTGluay5lbGVtZW50c1tkYXRhXSE9PXVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtTGluay5lbGVtZW50c1tkYXRhXS52YWx1ZT1MaW5rW2RhdGFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vICsgbGVzIGNvbnRyYWludGVzIGRlIGNoYW1wIDpcbiAgICAgICAgICAgICAgICAgICAgc2V0QXR0cmlidXRlc1RvSW5wdXRzKGNvbmZpZy5MaW5rLCBmb3JtTGluayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEZvbmN0aW9uIGFmZmljaGFudCBsZXMgaW5mb3MgZCd1bmUgaWxsdXN0cmF0aW9uIGRhbnMgbGUgZm9ybXVsYWlyZSBhZGhvY1xuICAgICAgICAgICAgICAgIGNvbnN0IHNob3dGb3JtSWxsdXN0cmF0aW9uSW5mb3MgPSAoSWxsdXN0cmF0aW9uKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gb24gY29tbWVuY2UgcGFyIGNhY2hlciBldCB2aWRlciB0b3VzIGxlcyBmb3JtdWxhaXJlcyBhbm5leGVzXG4gICAgICAgICAgICAgICAgICAgIGhpZGVBbGxGb3JtcygpO1xuICAgICAgICAgICAgICAgICAgICAvLyBwdWlzIG9uIGFmZmljaGUgY2VsdWkgZG9udCBsJ2lkIGVzdCBwYXNzw6kgYXZlYyBzZXMgZG9ubsOpZXMgY29ubnVlc1xuICAgICAgICAgICAgICAgICAgICBmb3JtSWxsdXN0cmF0aW9uLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGRhdGEgaW4gSWxsdXN0cmF0aW9uKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihmb3JtSWxsdXN0cmF0aW9uLmVsZW1lbnRzW2RhdGFdIT09dW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1JbGx1c3RyYXRpb24uZWxlbWVudHNbZGF0YV0udmFsdWU9SWxsdXN0cmF0aW9uW2RhdGFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vICsgbGVzIGNvbnRyYWludGVzIGRlIGNoYW1wIDpcbiAgICAgICAgICAgICAgICAgICAgc2V0QXR0cmlidXRlc1RvSW5wdXRzKGNvbmZpZy5JbGx1c3RyYXRpb24sIGZvcm1JbGx1c3RyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICAvLyBzYXVmIGxlIGNoYW1wIGZpbGUgcXVpIG4nZXN0IHBsdXMgcmVxdWlzIHF1YW5kIHVuIGZpY2hpZXIgZXhpc3RlIGTDqWrDoCAhXG4gICAgICAgICAgICAgICAgICAgIGZvcm1JbGx1c3RyYXRpb24uZWxlbWVudHNbXCJpbWFnZVwiXS5yZW1vdmVBdHRyaWJ1dGUoXCJyZXF1aXJlZFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gRm9uY3Rpb24gYWZmaWNoYW50IGxlcyBpbmZvcyBkJ3VuZSBxdWVzdGlvbiArIHNlcyByw6lwb25zZXMgcG9zc2libGVzIGRhbnMgbGUgZm9ybXVsYWlyZSBhZGhvY1xuICAgICAgICAgICAgICAgIGNvbnN0IHNob3dGb3JtUXVlc3Rpb25JbmZvcyA9IChRdWVzdGlvbikgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG9uIGNvbW1lbmNlIHBhciBjYWNoZXIgZXQgdmlkZXIgdG91cyBsZXMgZm9ybXVsYWlyZXMgYW5uZXhlc1xuICAgICAgICAgICAgICAgICAgICBoaWRlQWxsRm9ybXMoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gcHVpcyBvbiBhZmZpY2hlIGNlbHVpIGRvbnQgbCdpZCBlc3QgcGFzc8OpIGF2ZWMgc2VzIGRvbm7DqWVzIGNvbm51ZXNcbiAgICAgICAgICAgICAgICAgICAgZm9ybVF1ZXN0aW9uLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGRhdGEgaW4gUXVlc3Rpb24uUXVlc3Rpb24pXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZvcm1RdWVzdGlvbi5lbGVtZW50c1tkYXRhXSE9PXVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtUXVlc3Rpb24uZWxlbWVudHNbZGF0YV0udmFsdWU9UXVlc3Rpb24uUXVlc3Rpb25bZGF0YV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBkYXRhIGluIFF1ZXN0aW9uLkNob2ljZXMpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZvcm1RdWVzdGlvbi5lbGVtZW50c1tcImNob2ljZVRleHRcIitkYXRhXSE9PXVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtUXVlc3Rpb24uZWxlbWVudHNbXCJjaG9pY2VUZXh0XCIrZGF0YV0udmFsdWU9UXVlc3Rpb24uQ2hvaWNlc1tkYXRhXS50ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKFF1ZXN0aW9uLkNob2ljZXNbZGF0YV0uaXNDb3JyZWN0PT10cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtUXVlc3Rpb24uZWxlbWVudHNbXCJjaG9pY2VJc0NvcnJlY3RcIitkYXRhXS5jaGVja2VkPXRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVF1ZXN0aW9uLmVsZW1lbnRzW1wiaWRDaG9pY2VcIitkYXRhXS52YWx1ZT1RdWVzdGlvbi5DaG9pY2VzW2RhdGFdLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyArIGxlcyBjb250cmFpbnRlcyBkZSBjaGFtcCA6XG4gICAgICAgICAgICAgICAgICAgIHNldEF0dHJpYnV0ZXNUb0lucHV0cyhjb25maWcuUXVlc3Rpb24sIGZvcm1RdWVzdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gRm9uY3Rpb24gYWZmaWNoYW50IGxlcyBpbmZvcyBjb25udWVzIGNvbmNlcm5hbnQgdW4gcXVlc3Rpb25uYWlyZSBldCBzZXMgZMOpcGVuZGFuY2VzXG4gICAgICAgICAgICAgICAgY29uc3Qgc2hvd0Zvcm1RdWVzdGlvbm5haXJlSW5mb3MgPSAoaWQpID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4aHJHZXRJbmZvcyA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgICAgICB4aHJHZXRJbmZvcy5vcGVuKFwiR0VUXCIsIGFwaVVybCtjb25maWcucXVlc3Rpb25uYWlyZVJvdXRlcytjb25maWcuZ2V0UXVlc3Rpb25uYWlyZVJvdXRlcytcIi9cIitpZCk7XG4gICAgICAgICAgICAgICAgICAgIHhockdldEluZm9zLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCAmJiByZXNwb25zZS5RdWVzdGlvbm5haXJlICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1RdWVzdGlvbm5haXJlLnJlc2V0KCk7Ly8gcG91ciBuZSBwYXMgZ2FyZGVyIGRvbm7DqWVzIGTDqWrDoCBhZmZpY2jDqWVzIHNpIHZpZGUgZGFucyBjZSBxdWkgZXN0IHJldG91cm7DqVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGRhdGEgaW4gcmVzcG9uc2UuUXVlc3Rpb25uYWlyZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZm9ybVF1ZXN0aW9ubmFpcmUuZWxlbWVudHNbZGF0YV0hPT11bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGF0YT09PVwicHVibGlzaGluZ0F0XCIgJiYgcmVzcG9uc2UuUXVlc3Rpb25uYWlyZVtkYXRhXSE9PW51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1RdWVzdGlvbm5haXJlLmVsZW1lbnRzW2RhdGFdLnZhbHVlPWRhdGVGb3JtYXQocmVzcG9uc2UuUXVlc3Rpb25uYWlyZVtkYXRhXSwgXCJmb3JtXCIpOy8vICEhIHJldm9pciBjYXIgZm9ybWF0IHBvdXZhbnQgcG9zZXIgc291Y2lzIHNpIG5hdmlnYXRldXIgbmUgZ8OocmUgcGFzIGxlcyBjaGFtcHMgZGUgdHlwZSBcImRhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtUXVlc3Rpb25uYWlyZS5lbGVtZW50c1tkYXRhXS52YWx1ZT1yZXNwb25zZS5RdWVzdGlvbm5haXJlW2RhdGFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlQ2hlY2tCb3guc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLlRhZ3MgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNsYXNzaWZpY2F0aW9uPVwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiByZXNwb25zZS5UYWdzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpPT0wKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uKz1yZXNwb25zZS5UYWdzW2ldLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NpZmljYXRpb24rPVwiLFwiK3Jlc3BvbnNlLlRhZ3NbaV0ubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtUXVlc3Rpb25uYWlyZS5lbGVtZW50c1tcImNsYXNzaWZpY2F0aW9uXCJdLnZhbHVlPWNsYXNzaWZpY2F0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZMaW5rcy5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZRdWVzdGlvbnMuc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2SWxsdXN0cmF0aW9ucy5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5MaW5rcyAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dMaW5rSW5mb3MocmVzcG9uc2UuTGlua3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLlF1ZXN0aW9ucyAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dRdWVzdGlvbkluZm9zKHJlc3BvbnNlLlF1ZXN0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2UuSWxsdXN0cmF0aW9ucyAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dJbGx1c3RyYXRpb25JbmZvcyhyZXNwb25zZS5JbGx1c3RyYXRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwUHVibGlzaGluZ0F0LnN0eWxlLmRpc3BsYXk9XCJub25lXCI7Ly8gaW5mbyB1dGlsZSBwb3VyIFwicGxhY2VyXCIgdW4gbm91dmVhdSBxdWl6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gw6AgcmV2b2lyIDogcmVtcGxhY2VyIGxpZW4gcG91ciB1biBib3V0b24gKyByZXNldCBjb21wbGV0IGR1IGZvcm11bGFpcmUsIHkgY29tcHJpcyBjaGFtcHMgaGlkZGVuIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidG5OZXdRdWVzdGlvbm5haXJlLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0bk5ld1F1ZXN0aW9ubmFpcmUuc2V0QXR0cmlidXRlKFwiaHJlZlwiLCBjb25maWdGcm9udEVuZC5xdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidG5QcmV2aWV3UXVlc3Rpb25uYWlyZS5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5RdWVzdGlvbm5haXJlW1wiaXNQdWJsaXNoZWRcIl09PT1mYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRuUHJldmlld1F1ZXN0aW9ubmFpcmUuc2V0QXR0cmlidXRlKFwiaHJlZlwiLCBhcGlVcmwrY29uZmlnLnF1ZXN0aW9ubmFpcmVSb3V0ZXMrY29uZmlnLnByZXZpZXdRdWVzdGlvbm5haXJlUm91dGVzK1wiL1wiK2lkK1wiL1wiK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRuUHJldmlld1F1ZXN0aW9ubmFpcmUuc2V0QXR0cmlidXRlKFwiaHJlZlwiLCBjb25maWcuc2l0ZVVybCtjb25maWcucHVibGlzaGVkUXVlc3Rpb25uYWlyZVJvdXRlcytyZXNwb25zZS5RdWVzdGlvbm5haXJlW1wic2x1Z1wiXStcIi5odG1sXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHhockdldEluZm9zLnNlbmQoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTaSB1biBpZCBlc3QgcGFzc8OpIHBhciBsJ3VybCwgb24gZXNzYXllIGQnYWZmaWNoZXIgbGUgcXVlc3Rpb25uYWlyZSA6XG4gICAgICAgICAgICAgICAgbGV0IHVybERhdGFzPWdldFVybFBhcmFtcygpO1xuICAgICAgICAgICAgICAgIGlmKHVybERhdGFzICYmIHVybERhdGFzLmlkIT09dW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICBzaG93Rm9ybVF1ZXN0aW9ubmFpcmVJbmZvcyh1cmxEYXRhcy5pZCk7XG5cbiAgICAgICAgICAgICAgICAvLyBUcmFpdGVtZW50IGR1IGxhbmNlbWVudCBkJ3VuZSByZWNoZXJjaGVcbiAgICAgICAgICAgICAgICBmb3JtU2VhcmNoLmFkZEV2ZW50TGlzdGVuZXIoXCJzdWJtaXRcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFzPWdldERhdGFzRnJvbUlucHV0cyhmb3JtU2VhcmNoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeGhyU2VhcmNoID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgICAgIHhoclNlYXJjaC5vcGVuKFwiUE9TVFwiLCBhcGlVcmwrY29uZmlnLnF1ZXN0aW9ubmFpcmVSb3V0ZXMrY29uZmlnLnNlYXJjaEFkbWluUXVlc3Rpb25uYWlyZXNSb3V0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHhoclNlYXJjaC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDAgJiYgQXJyYXkuaXNBcnJheShyZXNwb25zZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5sZW5ndGg9PT0wKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZTZWFyY2hSZXN1bHQsIFwicFwiLCB0eHRRdWVzdGlvbm5haXJlLm5vdEZvdW5kLCBcIlwiLCBbXCJpbmZvcm1hdGlvblwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdEhUTUw9XCI8b3B0aW9uIHZhbHVlPScnPjwvb3B0aW9uPlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpIGluIHJlc3BvbnNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdEhUTUwrPVwiPG9wdGlvbiB2YWx1ZT0nXCIrcmVzcG9uc2VbaV0uaWQrXCInPlwiK3Jlc3BvbnNlW2ldLnRpdGxlK1wiPC9vcHRpb24+XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlNlYXJjaFJlc3VsdCwgXCJzZWxlY3RcIiwgc2VsZWN0SFRNTCwgXCJzZWxlY3RTZWFyY2hcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWFyY2hTZWxlY3Q9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzZWxlY3RTZWFyY2hcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hTZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBmdW5jdGlvbigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2VhcmNoU2VsZWN0LnZhbHVlIT09XCJcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0Zvcm1RdWVzdGlvbm5haXJlSW5mb3Moc2VhcmNoU2VsZWN0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZTZWFyY2hSZXN1bHQsIFwicFwiLCB0eHQuc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB4aHJTZWFyY2guc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG4gICAgICAgICAgICAgICAgICAgIHhoclNlYXJjaC5zZXRSZXF1ZXN0SGVhZGVyKFwiQXV0aG9yaXphdGlvblwiLCBcIkJlYXJlciBcIit1c2VyLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgaWYoZGF0YXMpXG4gICAgICAgICAgICAgICAgICAgICAgICB4aHJTZWFyY2guc2VuZChKU09OLnN0cmluZ2lmeShkYXRhcykpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIExlcyBxdWVzdGlvbm5haXJlcyBiaWVudMO0dCBwdWJsacOpcy4gRGFucyB1bmUgZm9uY3Rpb24gY2FyIGRldmFudCDDqnRyZSByZWNoYXJnw6kuXG4gICAgICAgICAgICAgICAgY29uc3Qgc2hvd05leHRRdWVzdGlvbm5haXJlcyA9ICgpID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4aHJOZXh0UXVlc3Rpb25uYWlyZXMgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyTmV4dFF1ZXN0aW9ubmFpcmVzLm9wZW4oXCJHRVRcIiwgYXBpVXJsK2NvbmZpZy5xdWVzdGlvbm5haXJlUm91dGVzK2NvbmZpZy5nZXRMaXN0TmV4dFF1ZXN0aW9ubmFpcmVzKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyTmV4dFF1ZXN0aW9ubmFpcmVzLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCAmJiBBcnJheS5pc0FycmF5KHJlc3BvbnNlLnF1ZXN0aW9ubmFpcmVzKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaXN0SFRNTD1cIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gcmVzcG9uc2UucXVlc3Rpb25uYWlyZXMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RIVE1MKz1cIjxsaT5cIitkYXRlRm9ybWF0KHJlc3BvbnNlLnF1ZXN0aW9ubmFpcmVzW2ldLmRhdGVQdWJsaXNoaW5nLCBcImZyXCIpK1wiOiA8YSBocmVmPSdcIitjb25maWdGcm9udEVuZC5xdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlK1wiP2lkPVwiK3Jlc3BvbnNlLnF1ZXN0aW9ubmFpcmVzW2ldLmlkK1wiJyBpZD0ncXVlc3Rpb25uYWlyZV9cIityZXNwb25zZS5xdWVzdGlvbm5haXJlc1tpXS5pZCtcIic+XCIrcmVzcG9uc2UucXVlc3Rpb25uYWlyZXNbaV0udGl0bGUrXCI8L2E+XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5xdWVzdGlvbm5haXJlc1tpXS5pc1B1Ymxpc2hhYmxlPT09ZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdEhUTUwrPVwiIDxzcGFuIGNsYXNzPSdlcnJvcic+KFwiK3R4dFF1ZXN0aW9ubmFpcmUubmVlZEJlQ29tcGxldGVkK1wiKTwvbGk+XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0SFRNTCs9XCI8L2xpPlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLnF1ZXN0aW9ubmFpcmVzLmxlbmd0aCE9PTApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlF1ZXN0aW9ubmFpcmVzLCBcImgzXCIsIHR4dFF1ZXN0aW9ubmFpcmUubmV4dFF1ZXN0aW9ubmFpcmVzTGlzdC5yZXBsYWNlKFwiI05CXCIsIHJlc3BvbnNlLnF1ZXN0aW9ubmFpcmVzLmxlbmd0aCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGhlbHBQdWJsaXNoaW5nQXQsIFwiZW1cIiwgdHh0UXVlc3Rpb25uYWlyZS5uZXh0RGF0ZVdpdGhvdXRRdWVzdGlvbm5haXJlK2RhdGVGb3JtYXQobmV3IERhdGUocmVzcG9uc2UuZGF0ZU5lZWRlZCksIFwiZnJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlF1ZXN0aW9ubmFpcmVzLCBcInVsXCIsIGxpc3RIVE1MLCBcIlwiLCBcIlwiLCBcIlwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiByZXNwb25zZS5xdWVzdGlvbm5haXJlcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJxdWVzdGlvbm5haXJlX1wiK3Jlc3BvbnNlLnF1ZXN0aW9ubmFpcmVzW2ldLmlkKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0Zvcm1RdWVzdGlvbm5haXJlSW5mb3MoZS50YXJnZXQuaWQuc3BsaXQoXCJfXCIpWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKFwiI3F1ZXN0aW9ubmFpcmVzXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgeGhyTmV4dFF1ZXN0aW9ubmFpcmVzLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK3VzZXIudG9rZW4pOyBcbiAgICAgICAgICAgICAgICAgICAgeGhyTmV4dFF1ZXN0aW9ubmFpcmVzLnNlbmQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2hvd05leHRRdWVzdGlvbm5haXJlcygpO1xuIFxuICAgICAgICAgICAgICAgIC8vIEFpZGUgc2Fpc2llIGNsYXNzZW1lbnQgZHUgcXVpelxuICAgICAgICAgICAgICAgIGlucHV0Q2xhc3NpZmljYXRpb24uYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBkaXZSZXNwb25zZS5pbm5lckhUTUw9XCJcIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFncz1pbnB1dENsYXNzaWZpY2F0aW9uLnZhbHVlLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGFncy5yZXZlcnNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RUYWc9dGFnc1swXS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmKGxhc3RUYWcubGVuZ3RoID49IDIpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIMOgIHJldm9pciA6IGltcG9ydGVyIGxhIGxpc3RlIGRlcyB0YWdzIGxvcnMgZGUgbCdpbml0aWFsaXNhdGlvbiBwb3VyIMOpdml0ZXIgbGVzIGFwcGVscyBtdWx0aXBsZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1haXMgZGFucyBjZSBjYXMgYWN0dWFsaXNlciBjZXR0ZSBsaXN0ZSBhcHLDqHMgY2hhcXVlIG1pc2Ugw6Agam91ci5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhoclNlYXJjaFRhZ3MgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHhoclNlYXJjaFRhZ3Mub3BlbihcIlBPU1RcIiwgYXBpVXJsK2NvbmZpZy5xdWVzdGlvbm5haXJlUm91dGVzK2NvbmZpZy50YWdzU2VhcmNoUm91dGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgeGhyU2VhcmNoVGFncy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UodGhpcy5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCAmJiBBcnJheS5pc0FycmF5KHJlc3BvbnNlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscENsYXNzaWZpY2F0aW9uLmlubmVySFRNTD1cIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpIGluIHJlc3BvbnNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoaGVscENsYXNzaWZpY2F0aW9uLCBcImFcIiwgcmVzcG9uc2VbaV0ubmFtZSwgXCIjdGFnXCIrcmVzcG9uc2VbaV0uaWQsIFtcImluZm9ybWF0aW9uXCJdLCB7IGhyZWY6XCIjdGFnXCIrcmVzcG9uc2VbaV0uaWQgfSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiI3RhZ1wiK3Jlc3BvbnNlW2ldLmlkKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnc1swXT1lLnRhcmdldC5pbm5lckhUTUw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ3MucmV2ZXJzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dENsYXNzaWZpY2F0aW9uLnZhbHVlPXRhZ3Muam9pbihcIixcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB4aHJTZWFyY2hUYWdzLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgeGhyU2VhcmNoVGFncy5zZXRSZXF1ZXN0SGVhZGVyKFwiQXV0aG9yaXphdGlvblwiLCBcIkJlYXJlciBcIit1c2VyLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHhoclNlYXJjaFRhZ3Muc2VuZChKU09OLnN0cmluZ2lmeSh7c2VhcmNoOiBsYXN0VGFnfSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAvLyBUcmFpdGVtZW50IGRlIGwnZW52b2kgZHUgZm9ybXVsYWlyZSBkZXMgaW5mb3MgZGUgYmFzZSBkdSBxdWl6XG4gICAgICAgICAgICAgICAgZm9ybVF1ZXN0aW9ubmFpcmUuYWRkRXZlbnRMaXN0ZW5lcihcInN1Ym1pdFwiLCBmdW5jdGlvbihlKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBkaXZSZXNwb25zZS5pbm5lckhUTUw9XCJcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFzPWdldERhdGFzRnJvbUlucHV0cyhmb3JtUXVlc3Rpb25uYWlyZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhoclF1ZXN0aW9ubmFpcmVEYXRhcyA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZighaXNFbXB0eShkYXRhcy5pZCkgJiYgKGRhdGFzLmRlbGV0ZU9rIT09dW5kZWZpbmVkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHhoclF1ZXN0aW9ubmFpcmVEYXRhcy5vcGVuKFwiREVMRVRFXCIsIGFwaVVybCtjb25maWcucXVlc3Rpb25uYWlyZVJvdXRlcytcIi9cIitkYXRhcy5pZCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIWlzRW1wdHkoZGF0YXMuaWQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgeGhyUXVlc3Rpb25uYWlyZURhdGFzLm9wZW4oXCJQVVRcIiwgYXBpVXJsK2NvbmZpZy5xdWVzdGlvbm5haXJlUm91dGVzK1wiL1wiK2RhdGFzLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgeGhyUXVlc3Rpb25uYWlyZURhdGFzLm9wZW4oXCJQT1NUXCIsIGFwaVVybCtjb25maWcucXVlc3Rpb25uYWlyZVJvdXRlcytcIi9cIik7XG4gICAgICAgICAgICAgICAgICAgIHhoclF1ZXN0aW9ubmFpcmVEYXRhcy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDEgJiYgcmVzcG9uc2UuaWQhPXVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHQuYWRkT2tNZXNzYWdlLCBcIlwiLCBbXCJzdWNjZXNzXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXMuaWQ9cmVzcG9uc2UuaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dOZXh0UXVlc3Rpb25uYWlyZXMoKTsvLyBwZXV0IGF2b2lyIMOpdm9sdcOpIHN1aXZhbnQgY2UgcXVpIHMnZXN0IHBhc3PDqVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLnN0YXR1cyA9PT0gMjAwICYmIHJlc3BvbnNlLm1lc3NhZ2UhPXVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkocmVzcG9uc2UubWVzc2FnZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5tZXNzYWdlID0gcmVzcG9uc2UubWVzc2FnZS5qb2luKFwiPGJyPlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UubWVzc2FnZSA9IHJlc3BvbnNlLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCByZXNwb25zZS5tZXNzYWdlLCBcIlwiLCBbXCJzdWNjZXNzXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd05leHRRdWVzdGlvbm5haXJlcygpOy8vIHBldXQgYXZvaXIgw6l2b2x1w6kgc3VpdmFudCBjZSBxdWkgcydlc3QgcGFzc8OpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3BvbnNlLmVycm9ycylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkocmVzcG9uc2UuZXJyb3JzKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVycm9ycyA9IHJlc3BvbnNlLmVycm9ycy5qb2luKFwiPGJyPlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3JzID0gdHh0LnNlcnZlckVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgcmVzcG9uc2UuZXJyb3JzLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGFzLmRlbGV0ZU9rPT09dW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93Rm9ybVF1ZXN0aW9ubmFpcmVJbmZvcyhkYXRhcy5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtUXVlc3Rpb25uYWlyZS5yZXNldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHhoclF1ZXN0aW9ubmFpcmVEYXRhcy5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyUXVlc3Rpb25uYWlyZURhdGFzLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICBpZihkYXRhcylcbiAgICAgICAgICAgICAgICAgICAgICAgIHhoclF1ZXN0aW9ubmFpcmVEYXRhcy5zZW5kKEpTT04uc3RyaW5naWZ5KGRhdGFzKSk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAvLyBMJ2Vudm9pIGRlcyBkb25uw6llcyBkJ3VuIGxpZW4gcGV1dCDDqnRyZSBnw6luw6lyw6kgcGFyIGxlIGJvdXRvbiBmb3JtdWxhaXJlIG91IHBhciBsZSBsaWVuIHN1cHByaW1lclxuICAgICAgICAgICAgICAgIGNvbnN0IHNlbmRMaW5rRm9ybSA9ICgpID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXZSZXNwb25zZUxpbms9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJyZXNwb25zZUxpbmtcIik7XG4gICAgICAgICAgICAgICAgICAgIGRpdlJlc3BvbnNlTGluay5pbm5lckhUTUw9XCJcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFzPWdldERhdGFzRnJvbUlucHV0cyhmb3JtTGluayk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhockxpbmtEYXRhcyA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZighaXNFbXB0eShkYXRhcy5pZCkgJiYgKCFpc0VtcHR5KGRhdGFzLmRlbGV0ZU9rKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB4aHJMaW5rRGF0YXMub3BlbihcIkRFTEVURVwiLCBhcGlVcmwrY29uZmlnLmxpbmtzUm91dGUrZGF0YXMuaWQpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCFpc0VtcHR5KGRhdGFzLmlkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHhockxpbmtEYXRhcy5vcGVuKFwiUFVUXCIsIGFwaVVybCtjb25maWcubGlua3NSb3V0ZStkYXRhcy5pZCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHhockxpbmtEYXRhcy5vcGVuKFwiUE9TVFwiLCBhcGlVcmwrY29uZmlnLmxpbmtzUm91dGUpO1xuICAgICAgICAgICAgICAgICAgICB4aHJMaW5rRGF0YXMub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UodGhpcy5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy5zdGF0dXMgPT09IDIwMCB8fCB0aGlzLnN0YXR1cyA9PT0gMjAxKSAmJiByZXNwb25zZS5tZXNzYWdlIT11bmRlZmluZWQgJiYgcmVzcG9uc2UucXVlc3Rpb25uYWlyZSE9dW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShyZXNwb25zZS5tZXNzYWdlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLm1lc3NhZ2UgPSByZXNwb25zZS5tZXNzYWdlLmpvaW4oXCI8YnI+XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5tZXNzYWdlID0gcmVzcG9uc2UubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0xpbmtJbmZvcyhyZXNwb25zZS5xdWVzdGlvbm5haXJlLkxpbmtzKTsvLyBsZSBzZXJ2ZXVyIG1lIHJldG91cm5lIHVuZSB2ZXJzaW9uIGFjdHVhbGlzw6llIGRlIGxhIGxpc3RlIGRlcyBsaWVuc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdkxpbmtzLCBcInBcIiwgcmVzcG9uc2UubWVzc2FnZSwgXCJcIiwgW1wic3VjY2Vzc1wiXSwgXCJcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRlQWxsRm9ybXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIiNsaW5rc0xpc3RcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dOZXh0UXVlc3Rpb25uYWlyZXMoKTsvLyBwZXV0IGF2b2lyIMOpdm9sdcOpIHN1aXZhbnQgY2UgcXVpIHMnZXN0IHBhc3PDqVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZS5lcnJvcnMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihBcnJheS5pc0FycmF5KHJlc3BvbnNlLmVycm9ycykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvcnMgPSByZXNwb25zZS5lcnJvcnMuam9pbihcIjxicj5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVycm9ycyA9IHR4dC5zZXJ2ZXJFcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZUxpbmssIFwicFwiLCByZXNwb25zZS5lcnJvcnMsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlTGluaywgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHhockxpbmtEYXRhcy5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyTGlua0RhdGFzLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB4aHJMaW5rRGF0YXMuc2VuZChKU09OLnN0cmluZ2lmeShkYXRhcykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3JtTGluay5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHNlbmRMaW5rRm9ybSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgLy8gTCdlbnZvaSBkZXMgZG9ubsOpZXMgZCd1biBsaWVuIHBldXQgw6p0cmUgZ8OpbsOpcsOpIHBhciBsZSBib3V0b24gZm9ybXVsYWlyZSBvdSBwYXIgbGUgbGllbiBzdXBwcmltZXJcbiAgICAgICAgICAgICAgICBjb25zdCBzZW5kSWxsdXN0cmF0aW9uRm9ybSA9ICgpID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXZSZXNwb25zZUlsbHVzdHJhdGlvbj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJlc3BvbnNlSWxsdXN0cmF0aW9uXCIpO1xuICAgICAgICAgICAgICAgICAgICBkaXZSZXNwb25zZUlsbHVzdHJhdGlvbi5pbm5lckhUTUw9XCJcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFzPWdldERhdGFzRnJvbUlucHV0cyhmb3JtSWxsdXN0cmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFzV2l0aEZpbGVzPW5ldyBGb3JtRGF0YShmb3JtSWxsdXN0cmF0aW9uKTsgLy8gaWwgbWUgbWFucXVlIGxlcyBpbmZvcm1hdGlvbnMgZHUgZmljaGllciBhdmVjIG1hIGZvbmN0aW9uIGdldERhdGFzRnJvbUlucHV0c1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4aHJJbGx1c3RyYXRpb25EYXRhcyA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZighaXNFbXB0eShkYXRhcy5pZCkgJiYgKCFpc0VtcHR5KGRhdGFzLmRlbGV0ZU9rKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB4aHJJbGx1c3RyYXRpb25EYXRhcy5vcGVuKFwiREVMRVRFXCIsIGFwaVVybCtjb25maWcuaWxsdXN0cmF0aW9uc1JvdXRlK2RhdGFzLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZighaXNFbXB0eShkYXRhcy5pZCkpXG4gICAgICAgICAgICAgICAgICAgICAgICB4aHJJbGx1c3RyYXRpb25EYXRhcy5vcGVuKFwiUFVUXCIsIGFwaVVybCtjb25maWcuaWxsdXN0cmF0aW9uc1JvdXRlK2RhdGFzLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgeGhySWxsdXN0cmF0aW9uRGF0YXMub3BlbihcIlBPU1RcIiwgYXBpVXJsK2NvbmZpZy5pbGx1c3RyYXRpb25zUm91dGUpO1xuICAgICAgICAgICAgICAgICAgICB4aHJJbGx1c3RyYXRpb25EYXRhcy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzLnN0YXR1cyA9PT0gMjAwIHx8IHRoaXMuc3RhdHVzID09PSAyMDEpICYmIHJlc3BvbnNlLm1lc3NhZ2UhPXVuZGVmaW5lZCAmJiByZXNwb25zZS5xdWVzdGlvbm5haXJlIT11bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihBcnJheS5pc0FycmF5KHJlc3BvbnNlLm1lc3NhZ2UpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UubWVzc2FnZSA9IHJlc3BvbnNlLm1lc3NhZ2Uuam9pbihcIjxicj5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLm1lc3NhZ2UgPSByZXNwb25zZS5tZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93SWxsdXN0cmF0aW9uSW5mb3MocmVzcG9uc2UucXVlc3Rpb25uYWlyZS5JbGx1c3RyYXRpb25zKTsvLyBsZSBzZXJ2ZXVyIG1lIHJldG91cm5lIHVuZSB2ZXJzaW9uIGFjdHVhbGlzw6llIGRlIGxhIGxpc3RlIGRlcyBsaWVuc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdklsbHVzdHJhdGlvbnMsIFwicFwiLCByZXNwb25zZS5tZXNzYWdlLCBcIlwiLCBbXCJzdWNjZXNzXCJdLCBcIlwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGVBbGxGb3JtcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKFwiI2lsbHVzdHJhdGlvbnNMaXN0XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93TmV4dFF1ZXN0aW9ubmFpcmVzKCk7Ly8gcGV1dCBhdm9pciDDqXZvbHXDqSBzdWl2YW50IGNlIHF1aSBzJ2VzdCBwYXNzw6lcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzcG9uc2UuZXJyb3JzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShyZXNwb25zZS5lcnJvcnMpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3JzID0gcmVzcG9uc2UuZXJyb3JzLmpvaW4oXCI8YnI+XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvcnMgPSB0eHQuc2VydmVyRXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2VJbGx1c3RyYXRpb24sIFwicFwiLCByZXNwb25zZS5lcnJvcnMsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlSWxsdXN0cmF0aW9uLCBcInBcIiwgdHh0LnNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgeGhySWxsdXN0cmF0aW9uRGF0YXMuc2V0UmVxdWVzdEhlYWRlcihcIkF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIrdXNlci50b2tlbik7XG4gICAgICAgICAgICAgICAgICAgIHhocklsbHVzdHJhdGlvbkRhdGFzLnNlbmQoZGF0YXNXaXRoRmlsZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3JtSWxsdXN0cmF0aW9uLmFkZEV2ZW50TGlzdGVuZXIoXCJzdWJtaXRcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgc2VuZElsbHVzdHJhdGlvbkZvcm0oKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgIC8vIEwnZW52b2kgZGVzIGRvbm7DqWVzIGQndW5lIHF1ZXN0aW9uIGV0IGRlIHNlcyByw6lwb25zZSBxdWkgcGV1dCDDqnRyZSBnw6luw6lyw6kgcGFyIGxlIGJvdXRvbiBzdWJtaXQgb3UgcGFyIGxlIGxpZW4gc3VwcHJpbWVyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VuZFF1ZXN0aW9uRm9ybSA9ICgpID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXZSZXNwb25zZVF1ZXN0aW9uPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicmVzcG9uc2VRdWVzdGlvblwiKTtcbiAgICAgICAgICAgICAgICAgICAgZGl2UmVzcG9uc2VRdWVzdGlvbi5pbm5lckhUTUw9XCJcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFzPWdldERhdGFzRnJvbUlucHV0cyhmb3JtUXVlc3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4aHJRdWVzdGlvbkRhdGFzID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmKCFpc0VtcHR5KGRhdGFzLmlkKSAmJiAoIWlzRW1wdHkoZGF0YXMuZGVsZXRlT2spKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHhoclF1ZXN0aW9uRGF0YXMub3BlbihcIkRFTEVURVwiLCBhcGlVcmwrY29uZmlnLnF1ZXN0aW9uc1JvdXRlK2RhdGFzLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZighaXNFbXB0eShkYXRhcy5pZCkpXG4gICAgICAgICAgICAgICAgICAgICAgICB4aHJRdWVzdGlvbkRhdGFzLm9wZW4oXCJQVVRcIiwgYXBpVXJsK2NvbmZpZy5xdWVzdGlvbnNSb3V0ZStkYXRhcy5pZCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHhoclF1ZXN0aW9uRGF0YXMub3BlbihcIlBPU1RcIiwgYXBpVXJsK2NvbmZpZy5xdWVzdGlvbnNSb3V0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHhoclF1ZXN0aW9uRGF0YXMub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UodGhpcy5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy5zdGF0dXMgPT09IDIwMCB8fCB0aGlzLnN0YXR1cyA9PT0gMjAxKSAmJiByZXNwb25zZS5tZXNzYWdlIT11bmRlZmluZWQgJiYgcmVzcG9uc2UucXVlc3Rpb25uYWlyZSE9dW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShyZXNwb25zZS5tZXNzYWdlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLm1lc3NhZ2UgPSByZXNwb25zZS5tZXNzYWdlLmpvaW4oXCI8YnI+XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5tZXNzYWdlID0gcmVzcG9uc2UubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1F1ZXN0aW9uSW5mb3MocmVzcG9uc2UucXVlc3Rpb25uYWlyZS5RdWVzdGlvbnMpOy8vIGxlIHNlcnZldXIgbWUgcmV0b3VybmUgdW5lIHZlcnNpb24gYWN0dWFsaXPDqWUgZGUgbGEgbGlzdGUgZGVzIHF1ZXN0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlF1ZXN0aW9ucywgXCJwXCIsIHJlc3BvbnNlLm1lc3NhZ2UsIFwiXCIsIFtcInN1Y2Nlc3NcIl0sIFwiXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZUFsbEZvcm1zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIjcXVlc3Rpb25zTGlzdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd05leHRRdWVzdGlvbm5haXJlcygpOy8vIHBldXQgYXZvaXIgw6l2b2x1w6kgc3VpdmFudCBjZSBxdWkgcydlc3QgcGFzc8OpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3BvbnNlLmVycm9ycylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkocmVzcG9uc2UuZXJyb3JzKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVycm9ycyA9IHJlc3BvbnNlLmVycm9ycy5qb2luKFwiPGJyPlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3JzID0gdHh0LnNlcnZlckVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlUXVlc3Rpb24sIFwicFwiLCByZXNwb25zZS5lcnJvcnMsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlUXVlc3Rpb24sIFwicFwiLCB0eHQuc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB4aHJRdWVzdGlvbkRhdGFzLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuICAgICAgICAgICAgICAgICAgICB4aHJRdWVzdGlvbkRhdGFzLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB4aHJRdWVzdGlvbkRhdGFzLnNlbmQoSlNPTi5zdHJpbmdpZnkoZGF0YXMpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9ybVF1ZXN0aW9uLmFkZEV2ZW50TGlzdGVuZXIoXCJzdWJtaXRcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgc2VuZFF1ZXN0aW9uRm9ybSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2goZSlcbiAgICB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIGFkZEVsZW1lbnQoZGl2TWVzc2FnZSwgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgIH1cbn1cbmluaXRpYWxpc2UoKTsiLCIvLyBGT05DVElPTlMgVVRJTEVTIEFVIFNUT0NLQUdFIExPQ0FMIChTRVNTSU9OLCBDT09LSUVTLCBJTkRFWERCLCBFVEMuKVxuLy8gUmV2ZW5pciBwb3VyIGfDqXJlciBsZSBjYXMgb8O5IGxvY2FsLnN0b3JhZ2Ugbidlc3QgcGFzIGNvbm51IHBvdXIgdXRpbGlzZXIgY29va2llXG4gICAgXG5leHBvcnQgY29uc3Qgc2F2ZUxvY2FseSA9IChuYW1lLCBkYXRhKSA9Plxue1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKG5hbWUsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldExvY2FseSA9IChuYW1lLCBqc29uPWZhbHNlKSA9Plxue1xuICAgIGlmKGpzb24pXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKG5hbWUpKTtcbiAgICBlbHNlXG4gICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJlbW92ZUxvY2FseSA9IChuYW1lKSA9Plxue1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKG5hbWUpO1xufSIsImltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG4vLyBGb25jdGlvbiBhc3NvY2lhbnQgbGVzIGF0dHJpYnV0cyBmb3VybmlzIMOgIHVuIGNoYW1wIGRlIGZvcm11bGFpcmVcbmV4cG9ydCBjb25zdCBhZGRFbGVtZW50ID0gKGVsdFBhcmVudCwgZWx0VHlwZSwgZWx0Q29udGVudD1cIlwiLCBlbHRJZD1cIlwiLCBlbHRDbGFzcz1bXSwgZWx0QXR0cmlidXRlcz17fSwgcmVwbGFjZT10cnVlKSA9Plxue1xuICAgIGlmKGlzRW1wdHkoZWx0VHlwZSkgfHwgaXNFbXB0eShlbHRQYXJlbnQpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZWxzZVxuICAgIHtcbiAgICAgICAgY29uc3QgbmV3RWxlbWVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGVsdFR5cGUpO1xuICAgICAgICBcbiAgICAgICAgaWYoIWlzRW1wdHkoZWx0SWQpKS8vIHRlc3RlciBzaSBsJ2lkIG4nZXN0IHBhcyBkw6lqw6AgdXRpbGlzw6kgZGFucyBsZSBET00gP1xuICAgICAgICAgICAgbmV3RWxlbWVudC5pZD1lbHRJZDtcblxuICAgICAgICBpZihBcnJheS5pc0FycmF5KGVsdENsYXNzKSAmJiBlbHRDbGFzcy5sZW5ndGghPTApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGZvcihsZXQgaSBpbiBlbHRDbGFzcylcbiAgICAgICAgICAgICAgICBuZXdFbGVtZW50LmNsYXNzTGlzdC5hZGQoZWx0Q2xhc3NbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYodHlwZW9mIGVsdEF0dHJpYnV0ZXMgPT09IFwib2JqZWN0XCIpIC8vICEhIHRvdXMgbGVzIG9iamV0cyBuZSBzb250IHBhcyBva1xuICAgICAgICB7XG4gICAgICAgICAgICBmb3IobGV0IGF0dHJpYnV0TmFtZSBpbiBlbHRBdHRyaWJ1dGVzKVxuICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0TmFtZSwgZWx0QXR0cmlidXRlc1thdHRyaWJ1dE5hbWVdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFpc0VtcHR5KGVsdENvbnRlbnQpKVxuICAgICAgICAgICAgbmV3RWxlbWVudC5pbm5lckhUTUw9ZWx0Q29udGVudC5yZXBsYWNlKC9cXG4vZyxcIjxicj5cIik7Ly8gaW5uZXJIVE1MIHBlcm1ldCBkJ2Fqb3V0ZXIgZHUgdGV4dGUgYXlhbnQgbHVpLW3Dqm1lIGRlcyBiYWxpc2VzLCBldGMuXG4gICAgICAgICAgICBcbiAgICAgICAgaWYocmVwbGFjZSlcbiAgICAgICAgICAgIGVsdFBhcmVudC5pbm5lckhUTUw9XCJcIjtcbiAgICAgICAgZWx0UGFyZW50LmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpO1xuICAgIH0gICAgXG59IiwiLy8gQ2Ugc2NyaXB0IGZvdXJuaXQgZGVzIGZvbmN0aW9ucyB1dGlsaXPDqWVzIHN1ciB0b3V0ZXMgbGVzIHBhZ2VzIGR1IHNpdGVcblxuZXhwb3J0IGNvbnN0IGhlbGxvRGV2ID0gKCkgPT5cbntcbiAgICBjb25zb2xlLmxvZyhcIioqKiogSGVsbG8gYW1pIGTDqXZlbG9wcGV1ciA6LSlcXG4gTGUgY29kZSBkZSBXaWtpTGVybmkgZXN0IGxpYnJlIGV0IGVzdCBsaXNpYmxlIHN1ciBnaXRsYWIgOiBcXG4gQm9ubmUgbGVjdHVyZSA6LSkgXFxuIFBvdXIgbGVzIHN1Z2dlc3Rpb25zIGQnYW3DqWxpb3JhdGlvbiBvdSBxdWVzdGlvbnMgOiBkZXZAd2lsaWxlcm5pLmNvbSAqKioqXCIpO1xuICAgIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgY29uc3QgdXBkYXRlQWNjb3VudExpbmsgPSAoc3RhdHVzLCBjb25maWdUZW1wbGF0ZSkgPT5cbntcbiAgICBjb25zdCBsaW5rPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYWNjb3VudEhlYWRMaW5rXCIpO1xuICAgIGNvbnN0IGhvbWVQYWdlPXN0YXR1cytcIkhvbWVQYWdlXCI7XG4gICAgbGluay5ocmVmPVwiL1wiK2NvbmZpZ1RlbXBsYXRlW2hvbWVQYWdlXTtcbn0iLCJpbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gRm9uY3Rpb24gYXNzb2NpYW50IGxlcyBhdHRyaWJ1dHMgZm91cm5pcyDDoCB1biBjaGFtcCBkZSBmb3JtdWxhaXJlXG5leHBvcnQgY29uc3Qgc2V0QXR0cmlidXRlc1RvSW5wdXRzID0gKGlucHV0c0NvbmYsIG15Rm9ybSkgPT5cbntcbiAgICBmb3IobGV0IGkgaW4gbXlGb3JtLmVsZW1lbnRzKVxuICAgIHtcbiAgICAgICAgaWYoIWlzRW1wdHkobXlGb3JtLmVsZW1lbnRzW2ldLmlkKSlcbiAgICAgICAge1xuICAgICAgICAgICAgbGV0IGlkSW5wdXQ9bXlGb3JtLmVsZW1lbnRzW2ldLmlkO1xuICAgICAgICAgICAgaWYoaW5wdXRzQ29uZltpZElucHV0XSE9PXVuZGVmaW5lZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5wdXRIVE1MPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkSW5wdXQpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGF0dHJpYnV0ZSBpbiBpbnB1dHNDb25mW2lkSW5wdXRdKVxuICAgICAgICAgICAgICAgICAgICBpbnB1dEhUTUwuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgaW5wdXRzQ29uZltpZElucHV0XVthdHRyaWJ1dGVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gUsOpY3Vww6hyZSB0b3V0ZXMgbGVzIHZhbGV1cnMgZGUgY2hhbXBzIGVuIG9tZXR0YW50IGxlcyBjaGVja2JveCBub24gY29jaMOpZXMsIGV0Yy5cbmV4cG9ydCBjb25zdCBnZXREYXRhc0Zyb21JbnB1dHMgPSAobXlGb3JtKSA9Plxue1xuICAgIGNvbnN0IGRhdGFzPXt9O1xuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKG15Rm9ybSk7XG4gICAgZm9yKGxldCBlbnRyaWUgb2YgZm9ybURhdGEuZW50cmllcygpKVxuICAgICAgIGRhdGFzW2VudHJpZVswXV09ZW50cmllWzFdO1xuICAgIHJldHVybiBkYXRhcztcbn1cblxuLy8gVmlkZSB0b3VzIGxlcyBjaGFtcHMgZCd1biBmb3JtdWxhaXJlLCB5IGNvbXByaXMgaGlkZGVuLCBjaGVja2JveCwgZXRjLlxuLy8gUmV2b2lyIHBvdXIgbGVzIHNlbGVjdFxuZXhwb3J0IGNvbnN0IGVtcHlGb3JtID0gKG15Rm9ybSkgPT5cbntcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShteUZvcm0pO1xuICAgIGZvcihsZXQgZW50cmllIG9mIGZvcm1EYXRhLmVudHJpZXMoKSlcbiAgICB7XG4gICAgICAgIGlmKG15Rm9ybS5lbGVtZW50c1tlbnRyaWVbMF1dLnR5cGU9PVwiY2hlY2tib3hcIiB8fCBteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS50eXBlPT1cInJhZGlvXCIpXG4gICAgICAgICAgICBteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS5jaGVja2VkPWZhbHNlO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS52YWx1ZT1cIlwiO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8vIFZpZGUgZXQgY2FjaGUgbGUgZm9ybXVsYWlyZVxuZXhwb3J0IGNvbnN0IGVtcHlBbmRIaWRlRm9ybSA9IChteUZvcm0pID0+XG57XG4gICAgZW1weUZvcm0obXlGb3JtKTtcbiAgICBteUZvcm0uc3R5bGUuZGlzcGxheT1cIm5vbmVcIjtcbn0iLCJpbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gRm9uY3Rpb24gcsOpY3Vww6lyYW50IGxlcyBwYXJhbcOodHJlcyBwYXNzw6lzIHBhciBsJ3VybFxuZXhwb3J0IGNvbnN0IGdldFVybFBhcmFtcyA9ICgpID0+XG57XG4gICAgaWYoaXNFbXB0eShsb2NhdGlvbi5zZWFyY2gpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gbG9jYXRpb24uc2VhcmNoLnN1YnN0cmluZygxKS5zcGxpdChcIiZcIik7XG4gICAgaWYoIUFycmF5LmlzQXJyYXkocGFyYW1ldGVycykgfHwgcGFyYW1ldGVycy5sZW5ndGg9PT0wKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIFxuICAgIGxldCBwYXJhbSwgZGF0YXM9e307XG4gICAgZm9yKGxldCBpIGluIHBhcmFtZXRlcnMpXG4gICAge1xuICAgICAgICBwYXJhbSA9IHBhcmFtZXRlcnNbaV0uc3BsaXQoXCI9XCIpO1xuICAgICAgICBpZihwYXJhbS5sZW5ndGg9PT0yKVxuICAgICAgICAgICAgZGF0YXNbcGFyYW1bMF1dPWRlY29kZVVSSShwYXJhbVsxXSk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhcztcbn0iLCJpbXBvcnQgeyBhcGlVcmwsIGF2YWlsYWJsZUxhbmdzLCBzaXRlVXJsLCB0aGVtZSB9IGZyb20gXCIuLi8uLi8uLi9jb25maWcvaW5zdGFuY2UuanNcIjtcbmNvbnN0IGxhbmc9YXZhaWxhYmxlTGFuZ3NbMF07XG5cbmNvbnN0IGNvbmZpZ1RlbXBsYXRlID0gcmVxdWlyZShcIi4uLy4uLy4uL3ZpZXdzL1wiK3RoZW1lK1wiL2NvbmZpZy9cIitsYW5nK1wiLmpzXCIpO1xuaW1wb3J0IHsgIGNoZWNrTG9naW5Sb3V0ZSwgdGltZURpZmZlcmVuY2VNYXgsIHRpbWVEaWZmZXJlbmNlTWluLCB1c2VyUm91dGVzIH0gZnJvbSBcIi4uLy4uLy4uL2NvbmZpZy91c2Vycy5qc1wiO1xuXG5pbXBvcnQgeyBnZXRMb2NhbHksIHJlbW92ZUxvY2FseSwgc2F2ZUxvY2FseSB9IGZyb20gXCIuL2NsaWVudHN0b3JhZ2UuanNcIjtcbmltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG4vLyBSw6ljdXDDqHJlIGxlcyBkb25uw6llcyBkZSBjb25maWd1cmF0aW9uIGRlcyB1dGlsaXNhdGV1cnNcbi8vIMOAIHRlcm1lLCB1biBmaWNoaWVyIHN0YXRpcXVlIGltcG9ydGFibGUgY29tbWUgbW9kdWxlIGRldnJhaXQgw6l2aXRlciB1bmUgcmVxdcOqdGUgYWpheFxuZXhwb3J0IGNvbnN0IGdldENvbmZpZyA9ICBhc3luYyAoKSA9Plxue1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuICAgIHtcbiAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHhoci5vcGVuKFwiR0VUXCIsIGFwaVVybCtcIi91c2VyL2dldGNvbmZpZ1wiKTtcbiAgICAgICAgeGhyLm9ubG9hZCA9ICgpID0+IHJlc29sdmUoSlNPTi5wYXJzZSh4aHIucmVzcG9uc2VUZXh0KSk7XG4gICAgICAgIHhoci5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICAgICAgeGhyLnNlbmQoKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldFRpbWVEaWZmZXJlbmNlID0gKCkgPT5cbntcbiAgICBjb25zdCB0aW1lTG9jYWw9bmV3IERhdGUoKS5nZXRUaW1lem9uZU9mZnNldCgpO1xuICAgIGlmKHRpbWVMb2NhbCA+IHRpbWVEaWZmZXJlbmNlTWF4IHx8IHRpbWVMb2NhbCA8IHRpbWVEaWZmZXJlbmNlTWluKVxuICAgICAgICByZXR1cm4gMDtcbiAgICBlbHNlIHJldHVybiB0aW1lTG9jYWw7XG59XG5cbi8vIE9uIGVubMOodmUgdm9sb250YWlyZW1lbnQgbGVzIDAvTyBwb3VyIMOpdml0ZXIgbGVzIGNvbmZ1c2lvbnMgIVxuLy8gRXQgbWlldXggdmF1dCBhdXNzaSBkw6lidXRlciBldCBmaW5pciBwYXIgdW5lIGxldHRyZSBzaW1wbGUuXG5leHBvcnQgY29uc3QgZ2V0UGFzc3dvcmQgPSAobmJDYXJNaW4sIG5iQ2FyTWF4KSA9Plxue1xuICAgIGNvbnN0IG5iQ2FyPW5iQ2FyTWluK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoobmJDYXJNYXgtbmJDYXJNaW4pKTtcbiAgICBjb25zdCBsZXR0ZXJzPVwiQUJDREVGR0hJSktMTU5QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ucHFyc3R1dnd4eXpcIjtcbiAgICBjb25zdCBvdGhlcnM9XCIxMjM0NTY3ODkhPy4qLV8lQCbDicOAw4jDmeKCrCTDgsOKw5vDjlwiO1xuICAgIGxldCBwYXNzd29yZD1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldO1xuICAgIGZvcihsZXQgaT0xO2k8KG5iQ2FyLTEpO2krKylcbiAgICB7XG4gICAgICAgIGlmKChpICUgMikgPT09MSlcbiAgICAgICAgICAgIHBhc3N3b3JkKz1vdGhlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKm90aGVycy5sZW5ndGgpXTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcGFzc3dvcmQrPWxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxldHRlcnMubGVuZ3RoKV07ICAgXG4gICAgfVxuICAgIHBhc3N3b3JkKz1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldO1xuICAgIHJldHVybiBwYXNzd29yZDtcbn1cblxuLy8gSid1dGlsaXNlIGxlIHN0b2NrYWdlIGxvY2FsIGR1IG5hdmlnYXRldXIgcG91ciBlbnJlZ2lzdHJlciBsZXMgZG9ubsOpZXMgcGVybWV0dGFudCBkZSByZWNvbm5hw650cmUgbCd1dGlsaXNhdGV1ciBwYXIgbGEgc3VpdGVcbi8vIFNldWwgbGUgc2VydmV1ciBwb3VycmEgdsOpcmlmaWVyIHF1ZSBsZXMgaWRlbnRpZmlhbnRzIHNvbnQgKHRvdWpvdXJzKSB2YWxpZGVzLlxuZXhwb3J0IGNvbnN0IHNldFNlc3Npb24gPSAodXNlcklkLCB0b2tlbiwgZHVyYXRpb25UUykgPT5cbntcbiAgICBjb25zdCBzdG9yYWdlVXNlcj1cbiAgICB7XG4gICAgICAgIGlkOiB1c2VySWQsXG4gICAgICAgIHRva2VuOiB0b2tlbixcbiAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uVFNcbiAgICB9XG4gICAgc2F2ZUxvY2FseShcInVzZXJcIiwgc3RvcmFnZVVzZXIpO1xufVxuXG4vLyBWw6lyaWZpZSBxdSdpbCB5IGEgZGVzIGRvbm7DqWVzIGxvY2FsZXMgY29uY2VybmFudCBsZSByw6lzdWx0YXQgZCd1biBxdWl6XG4vLyBFdCBsZXMgYWpvdXRlIGF1eCBkb25uw6llcyBlbnZvecOpZXMgcGFyIGxlcyBmb3JtdWxhaXJlcyBkJ2luc2NyaXB0aW9uL2Nvbm5leGlvbiBzaSBjJ2VzdCBsZSBjYXNcbmV4cG9ydCBjb25zdCBjaGVja0Fuc3dlckRhdGFzID0gKGRhdGFzKSA9Plxue1xuICAgIGNvbnN0IGxhc3RBbnN3ZXI9Z2V0TG9jYWx5KFwibGFzdEFuc3dlclwiKTtcbiAgICBpZighaXNFbXB0eShsYXN0QW5zd2VyKSlcbiAgICB7XG4gICAgICAgIGNvbnN0IGFuc3dlcj1KU09OLnBhcnNlKGxhc3RBbnN3ZXIpO1xuICAgICAgICBpZighaXNFbXB0eShhbnN3ZXIuZHVyYXRpb24pICYmICFpc0VtcHR5KGFuc3dlci5uYkNvcnJlY3RBbnN3ZXJzKSAmJiAhaXNFbXB0eShhbnN3ZXIuUXVlc3Rpb25uYWlyZUlkKSAmJiAhaXNFbXB0eShhbnN3ZXIubmJRdWVzdGlvbnMpKVxuICAgICAgICB7XG4gICAgICAgICAgICBkYXRhcy5kdXJhdGlvbj1hbnN3ZXIuZHVyYXRpb247XG4gICAgICAgICAgICBkYXRhcy5uYkNvcnJlY3RBbnN3ZXJzPWFuc3dlci5uYkNvcnJlY3RBbnN3ZXJzO1xuICAgICAgICAgICAgZGF0YXMuUXVlc3Rpb25uYWlyZUlkPWFuc3dlci5RdWVzdGlvbm5haXJlSWQ7XG4gICAgICAgICAgICBkYXRhcy5uYlF1ZXN0aW9ucz1hbnN3ZXIubmJRdWVzdGlvbnM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGFzO1xufVxuXG4vLyBDZXR0ZSBmb25jdGlvbiB0ZXN0ZSBsYSBjb25uZXhpb24gZGUgbCd1dGlsaXNhdGV1ciBkJ3VuZSBwYWdlXG4vLyBPbiBwZXV0IGZvdXJuaXMgdW5lIGxpc3RlIGRlIHN0YXR1dHMgYWNjZXB0w6lzIChzaSB2aWRlID0gdG91cyksIGFpbnNpIHF1J3VuZSB1cmwgZGUgcmVkaXJlY3Rpb24gc2kgbm9uIGNvbm5lY3TDqSwgdW4gbWVzc2FnZSBkJ2VycmV1ciDDoCBhZmZpY2hlciBzdXIgbGEgcGFnZSBkZSBkZXN0aW5hdGlvbiBldCBsJ3VybCBzdXIgbGFxdWVsbGUgcmV2ZW5pciB1bmUgZm9pcyBjb25uZWN0w6lcbmV4cG9ydCBjb25zdCBjaGVja1Nlc3Npb24gPSBhc3luYyAoc3RhdHVzPVtdLCB1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKSA9Plxue1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuICAgIHtcbiAgICAgICAgY29uc3QgdXNlckRhdGFzPWdldExvY2FseShcInVzZXJcIik7XG4gICAgICAgIGlmKGlzRW1wdHkodXNlckRhdGFzKSlcbiAgICAgICAge1xuICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCB1c2VyPUpTT04ucGFyc2UodXNlckRhdGFzKTtcbiAgICAgICAgICAgIGlmKGlzRW1wdHkodXNlci5pZCkgfHzCoGlzRW1wdHkodXNlci50b2tlbikgfHwgaXNFbXB0eSh1c2VyLmR1cmF0aW9uKSB8fCB1c2VyLmR1cmF0aW9uIDwgRGF0ZS5ub3coKSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBhcGlVcmwrdXNlclJvdXRlcytjaGVja0xvZ2luUm91dGUrdXNlci50b2tlbik7XG4gICAgICAgICAgICAgICAgeGhyLm9ubG9hZCA9ICgpID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDIwMCAmJiByZXNwb25zZS5pc1ZhbGlkICYmIHJlc3BvbnNlLmlkICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2UuaWQ9PT11c2VyLmlkKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIubmFtZT1yZXNwb25zZS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIubGFuZ3VhZ2U9cmVzcG9uc2UubGFuZ3VhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci50aW1lRGlmZmVyZW5jZT1yZXNwb25zZS50aW1lRGlmZmVyZW5jZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnN0YXR1cz1yZXNwb25zZS5zdGF0dXM7Ly8gbGUgdG9rZW4gZXQgZGUgdG91dGUgZmHDp29uIHbDqXJpZmllciDDoCBjaGFxdWUgcmVxdcOqdGUgw6AgbCdBUElcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlTG9jYWx5KFwidXNlclwiLCB1c2VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaSBpbCBzJ2FnaXQgZCd1biBcInVzZXJcIiBldCBxdWUgc29uIGFib25uZW1lbnQgYSBleHBpcsOpLCBqZSBsZSByZWRpcmlnZSB2ZXJzIGxhIGNhaXNzZSA6LSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5zdGF0dXM9PT1cInVzZXJcIiAmJiByZXNwb25zZS5uYkRheXNPayA8PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsQWNjb3VudD1zaXRlVXJsK1wiL1wiK2NvbmZpZ1RlbXBsYXRlW2xhbmddLmFjY291bnRQYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKHVybEFjY291bnQpPT09LTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKFwiL1wiK2NvbmZpZ1RlbXBsYXRlW2xhbmddLmFjY291bnRQYWdlKTsvLyBwYXNzw6llIGRpcmVjdGVtZW50IGljaSwgbCdhbmNyZSAjc3Vic2NyaWJlIG5lIGZvbmN0aW9ubmUgcGFzICE/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHN0YXR1cy5sZW5ndGghPT0wICYmIHN0YXR1cy5pbmRleE9mKHJlc3BvbnNlLnN0YXR1cyk9PT0tMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgeGhyLm9uZXJyb3IgPSAoKSA9PiByZWplY3QoeGhyLnN0YXR1c1RleHQpO1xuICAgICAgICAgICAgICAgIHhoci5zZW5kKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8vIENldHRlIGZvbmN0aW9uIHNlcnQgw6AgbGEgcHLDqWPDqWRlbnRlIGVuIGNhcyBkZSBjb25uZXhpb24gbm9uIHZhbGlkZVxuY29uc3QgcmVkaXJlY3RVc2VyID0gKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpID0+XG57XG4gICAgaWYoIWlzRW1wdHkobWVzc2FnZSkpXG4gICAgICAgIHNhdmVMb2NhbHkoXCJtZXNzYWdlXCIsIG1lc3NhZ2UpO1xuICAgIGlmKCFpc0VtcHR5KHVybFdhbnRlZCkpXG4gICAgICAgIHNhdmVMb2NhbHkoXCJ1cmxcIiwgdXJsV2FudGVkKTtcbiAgICBpZighaXNFbXB0eSh1cmxSZWRpcmVjdGlvbikpXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24odXJsUmVkaXJlY3Rpb24pO1xufSJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/front/public/JS/manageUsers.app.js b/front/public/JS/manageUsers.app.js new file mode 100644 index 0000000..b69165a --- /dev/null +++ b/front/public/JS/manageUsers.app.js @@ -0,0 +1,1608 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "./src/manageUsers.js"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "../config/instance.js": +/*!*****************************!*\ + !*** ../config/instance.js ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var _module$exports; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var users = __webpack_require__(/*! ./users */ "../config/users.js"); + +var questionnaires = __webpack_require__(/*! ./questionnaires */ "../config/questionnaires.js"); + +module.exports = (_module$exports = { + apiUrl: "http://localhost:3000/api", + siteUrl: "http://localhost:8080", + adminName: "Fabrice", + adminEmail: "dev@wikilerni.com", + senderName: "WikiLerni", + senderEmail: "bonjour@wikilerni.com", + adminLang: "fr", + theme: "default", + // le thème utilisé (dans /views) pour générer les pages HTML. Contient ses propres fichiers de configuration. + availableLangs: ["fr"], + // Languages in which the site is available. The first one is the default one. + siteName: "WikiLerni", + beginCodeGodfather: "wikilerni", + // case-sensitive and can't contain "@" ! + cronTimingAlertInSeconde: 120, + // for logs + responseTimingAlertInSeconde: 3, + // idem + tokenSignupValidationTimeInHours: "48h", + // https://github.com/zeit/ms + tokenLoginLinkTimeInHours: "1h", + tokenConnexionMinTimeInHours: "24h", + tokenConnexionMaxTimeInDays: "180 days", + tokenLoginChangingTimeInHours: "1h", + // for email & password changing + tokenDeleteUserTimeInHours: "1h", + tokenUnsubscribeLinkTimeInDays: "7 days", + // token send with subscription's emails + freeAccountTimingInDays: 10, + freeAccountExpirationNotificationInDays: 5, + accountExpirationFirstNotificationInDays: 14, + accountExpirationSecondNotificationInDays: 5, + inactiveAccountTimeToDeleteInDays: 180, + // Questionnaires: + nbQuestionsMin: 1, + // minimum number of questions for the questionnaire to be publishable + nbQuestionsMax: 10, + // if 0 = not maximum + nbChoicesMax: 10, + nbNewQuestionnaires: 10, + // for RSS, etc. + hourGiveNewQuestionnaireBegin: 1, + // in user local time + hourGiveNewQuestionnaireEnd: 24, + // idem + numberNewQuestionnaireAtSameTime: 50, + // for mass mailing + minSearchQuestionnaires: 3, + // Illustrations: + nbIllustrationsMin: 0, + nbIllustrationsMax: 1, + maxIllustrationSizeinOctet: 1000000, + // pas contrôlé pour l'instant. À revoir. + mimeTypesForIllustration: ["image/jpg", "image/jpeg", "image/png", "image/gif", "image/png"], + // -- Upload and resize: + illustrationsWidthMaxInPx: 400, + illustrationsMiniaturesWidthMaxInPx: 200, + // Links: + nbLinksMin: 1, + nbLinksMax: 1 +}, _defineProperty(_module$exports, "nbQuestionsMin", questionnaires.nbQuestionsMin), _defineProperty(_module$exports, "nbQuestionsMax", questionnaires.nbQuestionsMax), _defineProperty(_module$exports, "nbChoicesMax", questionnaires.nbChoicesMax), _defineProperty(_module$exports, "passwordMinLength", users.password.minlength), _defineProperty(_module$exports, "dirCacheUsers", users.dirCacheUsers), _defineProperty(_module$exports, "dirCacheUsersAnswers", users.dirCacheUsersAnswers), _defineProperty(_module$exports, "dirCacheQuestionnaires", questionnaires.dirCacheQuestionnaires), _defineProperty(_module$exports, "dirCacheQuestions", questionnaires.dirCacheQuestions), _defineProperty(_module$exports, "dirCacheUsersQuestionnaires", questionnaires.dirCacheUsersQuestionnaires), _defineProperty(_module$exports, "dirHTMLQuestionnaire", questionnaires.dirHTMLQuestionnaire), _defineProperty(_module$exports, "dirWebQuestionnaire", questionnaires.dirWebQuestionnaire), _module$exports); + +/***/ }), + +/***/ "../config/questionnaires.js": +/*!***********************************!*\ + !*** ../config/questionnaires.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + // API'routes (after "apiUrl" defined in instance.js) + questionnaireRoutes: "/questionnaire", + getQuestionnaireRoutes: "/get", + previewQuestionnaireRoutes: "/preview", + publishedQuestionnaireRoutes: "/quiz/", + saveAnswersRoute: "/answer/", + getStatsQuestionnaires: "/stats/", + searchQuestionnairesRoute: "/search", + searchAdminQuestionnairesRoute: "/searchadmin", + getListNextQuestionnaires: "/getlistnextquestionnaires/", + // -- questions & choices : + questionsRoute: "/question/", + // -- tags : + tagsSearchRoute: "/tags/search/", + // -- answers : + getQuestionnairesWithoutAnswer: "/withoutanswer/user/", + getPreviousAnswers: "/user/answers/", + getStatsAnswers: "/user/anwswers/stats/", + getAdminStats: "/getadminstats/", + // forms : à compléter avec valeurs par défaut, etc. cf modèle + Questionnaire: { + title: { + maxlength: 255, + required: true + }, + slug: { + maxlength: 150 + }, + // champ requis mais calculé à partir du titre qd vide + introduction: { + required: true + } + }, + searchQuestionnaires: { + minlength: 3, + required: true + }, + Question: { + text: { + maxlength: 255, + required: true + }, + rank: { + required: true, + min: 1, + defaultValue: 1 + } + }, + Choice: { + text: { + maxlength: 255, + required: true + } + }, + nbQuestionsMin: 1, + nbQuestionsMax: 10, + nbChoicesMax: 10, + nbTagsMin: 0, + nbTagsMax: 0, + // 0 = not max + // JSON and HTML dir + dirCacheQuestionnaires: "datas/questionnaires", + dirCacheQuestions: "datas/questionnaires/questions", + dirCacheUsersQuestionnaires: "datas/users/questionnaires", + dirCacheTags: "datas/questionnaires/tags", + dirHTMLQuestionnaire: "front/public/quiz", + dirHTMLTags: "front/public/quizs", + dirWebQuestionnaire: "quiz", + //pour url page + dirWebTags: "quizs" // idem + +}; + +/***/ }), + +/***/ "../config/users.js": +/*!**************************!*\ + !*** ../config/users.js ***! + \**************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + // API'routes (after "apiUrl" defined in instance.js) + userRoutes: "/user", + subscribeRoute: "/signup", + getGodfatherRoute: "/getgodfatherid", + checkIfIsEmailfreeRoute: "/isemailfree", + checkSubscribeTokenRoute: "/validation/", + checkLoginRoute: "/checklogin/", + connectionRoute: "/login", + getLoginLinkRoute: "/getloginlink", + connectionWithLinkRoute: "/checkloginlink", + getUserInfos: "/get/", + createUserRoute: "/create", + validateUserRoute: "/validate/", + updateUserInfos: "/modify/", + searchUserRoute: "/search/", + getGodChilds: "/getgodchilds/", + checkNewLoginLinkRoute: "/confirmnewlogin/", + checkDeleteLinkRoute: "/confirmdelete/", + getPayments: "/payment/getforoneuser/", + unsubscribeRoute: "/subscription/stop/", + getAdminStats: "/getadminstats/", + // forms : à compléter avec valeurs par défaut, etc. cf modèle + name: { + maxlength: 70, + required: true + }, + email: { + maxlength: 255, + required: true + }, + password: { + minlength: 8, + maxlength: 72, + required: true + }, + // https://www.npmjs.com/package/bcrypt#security-issues-and-concerns + newPassword: { + minlength: 8, + maxlength: 72 + }, + codeGodfather: { + maxlength: 255 + }, + cguOk: { + value: "true", + required: true + }, + timeDifferenceMin: -720, + timeDifferenceMax: 840, + // JSON dir + dirCacheUsers: "datas/users", + dirCacheUsersAnswers: "datas/users/questionnaires/answers" +}; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/general$": +/*!**************************************!*\ + !*** ../lang sync ^\.\/.*\/general$ ***! + \**************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/general": "../lang/fr/general.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/general$"; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/subscription$": +/*!*******************************************!*\ + !*** ../lang sync ^\.\/.*\/subscription$ ***! + \*******************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/subscription": "../lang/fr/subscription.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/subscription$"; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/user$": +/*!***********************************!*\ + !*** ../lang sync ^\.\/.*\/user$ ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/user": "../lang/fr/user.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/user$"; + +/***/ }), + +/***/ "../lang/fr/general.js": +/*!*****************************!*\ + !*** ../lang/fr/general.js ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + siteHTMLTitle: "WikiLerni : qu'allez-vous apprendre aujourd'hui ?", + siteMetaDescription: "Chaque jour, testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.", + scriptTimingInfo: "Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", + scriptTimingAlert: "*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", + serverError: "Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.", + serverErrorAdmin: "Bug de l'application :", + neededParams: "Des paramètres nécessaires manquants sont manquants.", + badUrl: "Tentative d'accès à une page n'existant pas :", + notValidFormat: "Format non valide.", + notAllowed: "Vous n'avez pas les droits nécessaires pour cette action.", + notRequired: "Facultatif.", + updateBtnTxt: "Modifier", + addBtnTxt: "Ajouter", + deleteBtnTxt: "Supprimer", + addOkMessage: "Les données ont bien été enregistrées.", + updateOkMessage: "La mise à jour à jour a bien été enregistrée.", + deleteOkMessage: "La suppression a bien été enregistrée.", + failAuth: "Erreur d'authentification.", + failAuthHeader: "Absence de header Authorization.", + failAuthToken: "Token invalide ou utilisateur non trouvé.", + failAuthId: "Identifiant non valide : ", + failAuthCron: "Tentative de lancement d'un cron sans le bon token.", + previousPage: "Page précédente", + nextPage: "Page suivante", + btnLinkToQuestionnaire: "Aller au quiz !", + statsAdmin: "Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
    En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
    Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium." +}; + +/***/ }), + +/***/ "../lang/fr/subscription.js": +/*!**********************************!*\ + !*** ../lang/fr/subscription.js ***! + \**********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + needNumberOfDays: "Il faut un nombre de jours pour l'abonnement.", + needIntegerNumberOfDays: "Le nombre de jours de l'abonnement doit être un nombre entier.", + needMinNumberOfDays: "Le nombre de jours de l'abonnement ne peut être négatif !", + needNotTooLongDaysList: "La liste de jours sélectionnés n'a pas le bon format (trop longue).", + needValidDaysList: "La liste de jours sélectionnés n'a pas le bon format. Caractère non valide : ", + needUniqueDaysList: "La liste de jours sélectionnés n'a pas le bon format. Doublon : ", + needKnowIfNoticeOk: "Il manque l'information sur l'acceptation ou non de recevoir des notifications.", + unsubscriptionOk: "Votre demande a bien été prise en compte. Vous ne recevrez plus de messages venant du site, sauf pour vous signaler la fin de votre abonnement.
    N'hésitez pas à accéder à votre compte pour de nouveau autoriser certains envois.", + unsubscriptionFail: "Si vous voyez ce message, c'est que votre lien de désabonnement ne fonctionne pas.
    Vous pouvez accéder à votre compte pour désactiver les envois manuellement.", + allSubscriptionProcessed: "Tous les abonnés ont été traités pour le moment.", + mailNewQuestionnaireSubject: "Qu'allez-vous apprendre aujourd'hui ?", + mailNewQuestionnaireBodyTxt: "Bonjour USER_NAME,\n\nUn nouveau quiz vient de vous être proposé :\nQUESTIONNAIRE_URL\n\nBonne lecture !\n\nStopper les envois ?\nUNSUBSCRIBE_URL", + mailNewQuestionnaireBodyHTML: "

    Bonjour USER_NAME,

    MAIL_INTRODUCTION

    Stopper les envois.

    ", + noNewQuestionnaireForUser: "Aucun nouveau questionnaire trouvé pour un abonné : ", + mailEndFreeTimeSubject: "Votre abonnement gratuit va expirer", + mailEndFreeTimeBodyTxt: "Bonjour USER_NAME,\nVotre abonnement gratuit à SITE_NAME va expirer d'ici quelques jours.\nPour continuer à utiliser le site, vous pouvez souscrire à un abonnement dès aujourd'hui :\nLINK_URL", + mailEndFreeTimeBodyHTML: "

    Bonjour USER_NAME,

    Votre abonnement gratuit à SITE_NAME va expirer d'ici quelques jours. Pour continuer à utiliser le site, vous pouvez souscrire à un abonnement dès aujourd'hui en cliquez ici sans tarder.

    ", + mailEndFreeTimeMessage: " relances envoyées.", + mailExpirationSubject: "Votre abonnement va bientôt expirer", + mailExpirationBodyTxt: "Bonjour USER_NAME,\nVotre abonnement gratuit à SITE_NAME va expirer d'ici quelques jours.\nPour continuer à utiliser le site, vous pouvez le prolonger dès aujourd'hui :\nLINK_URL", + mailExpirationBodyHTML: "

    Bonjour USER_NAME,

    Votre abonnement à SITE_NAME va expirer d'ici quelques jours.
    Pour continuer à utiliser le site, vous pouvez le prolonger dès aujourd'hui en cliquant ici.

    ", + mailExpirationMessage: "FIRST premières et SECOND deuxièmes relances envoyées pour des abonnements expirant d'ici peu.", + infosNbDays: "Votre abonnement est encore valable pendant NB_DAYS jours.
    Vous pouvez à tout moment prolonger votre abonnement en suivant les indications ci-dessous :", + infosExpirated: "Votre abonnement a expiré, mais il vous reste encore quelques jours avant que votre compte et vos données ne soient complètement supprimées.
    Pour ce faire, suivez sans tarder les indications ci-dessous :", + infosNbDaysAdmin: "Cet abonnement est encore valable pendant NB_DAYS jours.", + infosExpiratedAdmin: "Cet abonnement a expiré.", + isNotValided: "Cet utilisateur n'a pas encore validé son compte.
    Vous pouvez le faire à sa place en cochant la case indiquée et enregistrant.", + infosPaymentsAdmin: "DATE_PAYMENT : paiement de AMOUNT € au nom de CLIENT_NAME." +}; + +/***/ }), + +/***/ "../lang/fr/user.js": +/*!**************************!*\ + !*** ../lang/fr/user.js ***! + \**************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + notFound: "L'utilisateur n'a pas été trouvé.", + needName: "Merci de choisir un nom d'utilisateur.", + needNotTooLongName: "Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.", + needEmail: "Merci de saisir votre adresse e-mail.", + needUniqueEmail: "L'adresse e-mail que vous avez saisie est déjà utilisée par un autre utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.", + needNotTooLongEmail: "Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.", + needPassWord: "Merci de fournir un mot de passe.", + needLongPassWord: "Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.", + passwordCopied: "Le mot de passe généré a été copié dans le presse-papier. Vous pouvez le recopier où vous le souhaiter.", + needStatus: "Il manque le statut.", + needLanguage: "Il manque le code langue.", + needValidLastConnectionDate: "La date de dernière connexion n'est pas valide.", + needSMTP: "Il manque le serveur SMTP.", + needSMTPNotFound: "Il manque le serveur SMTP.", + needKnowNewsletterOk: "Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.", + needTimeDifference: "Il faut connaître le nombre de minutes du décalage horaire.", + needMinTimeDifference: "Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.", + needMaxTimeDifference: "Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.", + needUGCOk: "Vous devez accepter les CGU pour pouvoir créer votre compte. ", + godfatherNotFound: "Aucun utilisateur valide trouvé pour ce code parrain.", + godfatherFound: "Votre parrain a bien été trouvé !", + mailValidationMessage: "Votre inscription est bien enregistrée.\nPour la finaliser, merci de cliquer dans les 24H sur le lien de confirmation qui vient de vous être envoyé par e-mail.", + mailValidationLinkSubject: "Merci de valider votre compte", + mailValidationLinkSBodyTxt: "Bonjour USER_NAME,\n\nPour valider votre compte, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL", + mailValidationLinkSBodyHTML: "

    Bonjour USER_NAME,

    Pour valider votre compte, merci de cliquer sur le lien suivant dans les 24h.

    Valider.

    ", + validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue !
    Vous pouvez sans tarder vous connecter ci-dessous pour accéder à votre compte.", + validationMessageAdmin: "Le compte a bien été validé.", + validationAlreadyMessage: "Il semble que vous ayez déjà validé votre compte.", + validationAlreadyMessageAdmin: "Ce compte a déjà été validé.", + mailWelcomeSubject: "Bienvenue !", + mailWelcomeBodyTxt: "Bonjour USER_NAME,\nVotre venez de valider votre inscription à NOM_SITE.\nMerci et à bientôt !", + mailWelcomeBodyHTML: "

    Bonjour USER_NAME,

    Votre venez de valider votre inscription à NOM_SITE.

    Merci et à bientôt !

    ", + mailThankGodfatherSubject: "Merci !", + mailThankGodfatherBodyTxt: "Bonjour USER_NAME,\nGrâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nMerci et à bientôt !", + mailThankGodfatherBodyHTML: "

    Bonjour USER_NAME,

    Grâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.

    Merci et à bientôt !

    ", + badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.", + emailNotFound: "Aucun utilisateur trouvé pour cette adresse e-mail.", + alreadyConnected: "Vous êtes déjà connecté(e) au site !", + needBeConnected: "Vous devez être connecté(e) pour accéder à cette page.", + connectionOk: "Connexion réussie.", + needChooseLoginWay: "Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.", + needValidationToLogin: "Vous devez d'abord valider votre compte avant de vous connecter. Pour ce faire, un lien vient de vous être envoyé par e-mail.", + tooManyLoginFails: "Trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.", + badPassword: "Le mot de passe n'est pas le bon.", + mailLoginLinkSubject: "Votre lien de connexion.", + mailLoginLinkBodyTxt: "Bonjour USER_NAME,\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : LINK_URL", + mailLoginLinkBodyHTML: "

    Bonjour USER_NAME,

    Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :

    Valider.

    ", + mailLoginLinkMessage: "Un lien de connexion vient de vous être envoyé sur votre adresse e-mail. Ne tardez pas à l'utiliser, car il n'est valable que durant ", + updatedOkMessage: "Vos informations ont bien été mises à jour.", + updatedNeedGoodEmail: "Mais la nouvelle adresse e-mail n'a pu être enregistrée car elle n'a pas une format correct.", + updatedNeedUniqueEmail: "Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.", + mailUpdateLoginSubject: "Merci de valider vos nouveaux identifiants.", + mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL", + mailUpdateLoginBodyHTML: "

    Bonjour USER_NAME,

    Pour valider vos nouveaux identifiants de connexion, cliquez ici sans tarder.

    ", + mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (email et/ou mot de passe) et vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement. En attendant, merci de continuer à utiliser vos anciens identifiants.", + updatedNeedValidatedUser: "L'utilisateur que vous souhaité modifier n'existe pas/plus ou n'a pas encore validé son compte.", + updatedNeedGoodGodfather: "Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.", + mailUpdateLoginOkMessage: "La mise à jour de vos identifiants a bien été enregistrée.", + updatedFailedGodfatherNotFound: "L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.", + creationOkMessage: "Le nouvel utilisateur a bien été enregistré.", + mailDeleteSubject: "Confirmer la suppression de votre compte.", + mailDeleteBodyTxt: "Bonjour USER_NAME,\nPour valider la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL", + mailDeleteBodyHTML: "

    Bonjour USER_NAME,

    Pour valider la suppression de votre compte, cliquez ici sans tarder.

    ", + mailDeleteLinkMessage: "Votre demande de suppression a bien été enregistrée. Merci de cliquer sans tarder sur le lien qui vient de vous être envoyé par e-mail pour confirmer.", + deleteOkMessage: "L'utilisateur a bien été supprimé.", + deleteFailMessage: "Tentative de suppression d'un utilisateur inexistant : ", + mailDeleteLinkOkMessage: "Votre compte a bien été supprimé. Merci d'avoir utilisé nos services.", + mailDeleteLinkAlreadyMessage: "Il semble que vous ayez déjà validé la suppression de votre compte.", + mailDeleteLinkFailMessage: "Votre lien de suppression n'est pas valide ou alors il n'est plus valable.", + cronDeleteUnvalidedUsersMessage: " comptes utilisateurs non validés ont été supprimés.", + deleteInactiveUsersMessage: " comptes utilisateurs inactifs ont été supprimés.", + welcomeMessage: "Bienvenue #NAME !", + byebyeMessage: "Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
    À bientôt !", + infosUserForAdmin: "Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
    Date de sa dernière connexion : DATE_CONNECTION.", + infosAdminGodfather: "Cet utilisateur a été parrainé par ", + infosAdminNbGodChilds: "Ses #NB filleuils : " +}; + +/***/ }), + +/***/ "../tools/main.js": +/*!************************!*\ + !*** ../tools/main.js ***! + \************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +// Quelques fonctions utiles pour les chaînes +var Tool = /*#__PURE__*/function () { + function Tool() { + _classCallCheck(this, Tool); + } + + _createClass(Tool, null, [{ + key: "isEmpty", + value: function isEmpty(myVar) { + if (myVar === undefined || myVar === null) return true;else { + myVar += ""; // si autre chose qu'une chaîne envoyé... + + myVar = myVar.trim(); + if (myVar === "") return true;else return false; + } + } + }, { + key: "trimIfNotNull", + value: function trimIfNotNull(myString) { + if (Tool.isEmpty(myString)) myString = null;else { + myString += ""; // si autre chose qu'une chaîne envoyé... + + myString = myString.trim(); + } + return myString; + } + }, { + key: "shortenIfLongerThan", + value: function shortenIfLongerThan(myString, max) { + myString += ""; // au cas où cela ne serait pas une chaîne... + + if (myString.length > max) myString = myString.substring(0, max - 3) + "..."; + return myString; + } // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings + + }, { + key: "replaceAll", + value: function replaceAll(myString, mapObj) { + var replaceElts = new RegExp(Object.keys(mapObj).join("|"), "gi"); + return myString.replace(replaceElts, function (matched) { + return mapObj[matched]; + }); + } // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random + + }, { + key: "getRandomInt", + value: function getRandomInt(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min)) + min; + } // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country + + }, { + key: "dateFormat", + value: function dateFormat(dateString) { + var lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "fr"; + if (Tool.isEmpty(dateString)) return ""; + var myDate = new Date(dateString); + var myDay = myDate.getDate() + ""; + if (myDay.length === 1) myDay = "0" + myDay; + var myMounth = myDate.getMonth() + 1 + ""; + if (myMounth.length === 1) myMounth = "0" + myMounth; + var myYear = myDate.getFullYear(); + if (lang === "fr") return myDay + "/" + myMounth + "/" + myYear;else if (lang === "form") // 2014-02-09 + return myYear + "-" + myMounth + "-" + myDay;else return myMounth + "/" + myDay + "/" + myYear; + } + }]); + + return Tool; +}(); + +module.exports = Tool; + +/***/ }), + +/***/ "../views sync recursive ^\\.\\/.*\\.js$": +/*!**********************************!*\ + !*** ../views sync ^\.\/.*\.js$ ***! + \**********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./default/config/fr.js": "../views/default/config/fr.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../views sync recursive ^\\.\\/.*\\.js$"; + +/***/ }), + +/***/ "../views/default/config/fr.js": +/*!*************************************!*\ + !*** ../views/default/config/fr.js ***! + \*************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + headLinks: [{ + anchor: "Accueil", + attributes: { + href: "/" + } + }, { + anchor: "Mon compte", + attributes: { + href: "/connexion.hmt", + id: "accountHeadLink" + } + }, { + anchor: "À propos", + attributes: { + href: "/a-propos.html" + } + }, { + anchor: "Contact", + attributes: { + href: "/contact.html" + } + }], + footLinks: [{ + anchor: "Crédits", + attributes: { + href: "/credits.html" + } + }, { + anchor: "Mentions légales", + attributes: { + href: "/mentions-legales.html", + rel: "nofollow" + } + }, { + anchor: "Données personnelles", + attributes: { + href: "/donnees.html" + } + }, { + anchor: "C.G.U.", + attributes: { + href: "/cgu.html", + rel: "nofollow" + } + }, { + anchor: "C.G.V.", + attributes: { + href: "/cgv.html", + rel: "nofollow" + } + }], + maxQuestionnairesByPage: 10, + userHomePage: "accueil.html", + adminHomePage: "admin.html", + managerHomePage: "gestion.html", + subscribePage: "inscription.html", + connectionPage: "connexion.html", + accountPage: "compte.html", + questionnairesManagementPage: "gestion-quizs.html", + usersManagementPage: "gestion-utilisateurs.html", + nbQuestionnairesUserHomePage: 10, + illustrationDir: "/img/quizs/", + siteSlogan: "Cultivons notre jardin !", + homeTitle1: "De nature curieuse ?", + homeP1: "Avec WikiLerni vous apprenez chaque jour de nouvelles choses.
    Des articles de Wikipédia sont sélectionnés pour vous et sont suivis d'un quiz vous permettant de tester ce que vous en avez retenu.
    De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre \"jardin\".", + homeTitle2: "La culture en liberté", + homeP2: "Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
    Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
    Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
    Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.

    (*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.", + newQuestionnairesTitle: "Les derniers quizs publiés sur WikiLerni", + newQuestionnairesIntro: "Liste des derniers quizs publiés sur WikiLerni.", + explanationTitle: "Vous découvrez WikiLerni ?", + explanationTxt: "Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
    Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.

    Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.

    Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)

    Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
    Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.

    Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.", + noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript." +}; + +/***/ }), + +/***/ "./src/manageUsers.js": +/*!****************************!*\ + !*** ./src/manageUsers.js ***! + \****************************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ "../config/instance.js"); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js"); +/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js"); +/* harmony import */ var _tools_forms_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/forms.js */ "./src/tools/forms.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var _tools_url_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tools/url.js */ "./src/tools/url.js"); +/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./tools/users.js */ "./src/tools/users.js"); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + +// -- GESTION DU FORMULAIRE PERMETTANT DE SAISIR / ÉDITER LES INFOS DES UTILISATEURS ET DE LEUR ABONNEMENT +/// Vérifie que l'utilisateur est bien connecté, a le bon statut et le redirige vers le formulaire d'inscription si ce n'est pas le cas. +/// Si c'est ok, propose un moteur de recherche permettant de chercher un utilisateur +/// Si un id est passé par l'url on affiche les informations de l'utilisateur dans un formulaire permettant de l'éditer/supprimer. +/// Si pas d'id passé par l'url, on affiche un formulaire vide permettant d'en saisir un nouvel utilisateur +/// À ajouter : +/// - importation liste de comptes utilisateur à créer +/// - attribution d'un parrain à un utilisateur (via un moteur de recherche). Prévu par le contrôleur. +// Fichier de configuration côté client : + +var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0]; + +var configFrontEnd = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); // Fonctions utiles au script : !! revoir quand le reste sera fini pour vérifier si tout est utile + + + + + + + + + // Dictionnaires : + +var txt = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + lang + "/general"); + +var txtUsers = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/user$")("./" + lang + "/user"); + +var txtSubscriptions = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/subscription$")("./" + lang + "/subscription"); + +Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["helloDev"])(); // Principaux éléments du DOM manipulés : + +var divMain = document.getElementById("main-content"); +var divMessage = document.getElementById("message"); +var divResponse = document.getElementById("response"); +var divSubscribeIntro = document.getElementById("subscribeIntro"); +var divPaymentsInfos = document.getElementById("infosPayments"); +var divGodchildsInfos = document.getElementById("infosGodchilds"); +var formUser = document.getElementById("users"); +var deleteCheckBox = document.getElementById("deleteOkLabel"); +var validationCheckBox = document.getElementById("validationOkLabel"); +var btnNewUser = document.getElementById("wantNewUser"); +var newPassword = document.getElementById("newPassword"); +var timeDifference = document.getElementById("timeDifference"); +var formSearch = document.getElementById("search"); +var divSearchResult = document.getElementById("searchResult"); + +var initialise = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + var config, isConnected, user, emptyUserForm, showFormUserInfos, urlDatas; + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _context.prev = 0; + _context.next = 3; + return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_7__["getConfig"])(); + + case 3: + config = _context.sent; + + if (config) { + _context.next = 8; + break; + } + + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "p", txt.serverError, "", ["error"]); + _context.next = 12; + break; + + case 8: + _context.next = 10; + return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_7__["checkSession"])(["manager", "admin"], "/" + configFrontEnd.connectionPage, { + message: txtUsers.needBeConnected, + color: "error" + }, window.location); + + case 10: + isConnected = _context.sent; + + if (isConnected) { + user = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("user", true); + Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["updateAccountLink"])(user.status, configFrontEnd); + divMain.style.display = "block"; + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message"))) { + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "p", Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message", true).message, "", [Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message", true).color], "", false); + Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["removeLocaly"])("message"); + } // Initialisation du formulaire de recherche : + + + Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(config, formSearch); // Fonction utile pour vider le formulaire, y compris les champs hidden, etc. + // Cache aussi certains champs en mode création + + emptyUserForm = function emptyUserForm() { + Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["empyForm"])(formUser); // Case de suppression cachée par défaut, car inutile pour formulaire de création + + deleteCheckBox.style.display = "none"; // Case de validation cachée par défaut, car utile que dans certains cas + + validationCheckBox.style.display = "none"; + divSubscribeIntro.innerHTML = ""; + divPaymentsInfos.innerHTML = ""; + divGodchildsInfos.innerHTML = ""; // Certains navigateurs ont tendance à remplir tout seul les champs password + + newPassword.value = ""; // En mode création, pas de champ pour changer le mot de passe + + newPassword.parentNode.style.display = "none"; // Inutile en mode création + + timeDifference.parentNode.style.display = "none"; + }; + + emptyUserForm(); // Initialise les contraintes du formulaire : + + Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(config, formUser); // Fonction affichant les infos connues concernant un utilisateur et son abonnement + + showFormUserInfos = function showFormUserInfos(id) { + // on commence par tout vider, des fois que... : + emptyUserForm(); + var xhrGetInfos = new XMLHttpRequest(); + xhrGetInfos.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.userRoutes + config.getUserInfos + id); + + xhrGetInfos.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var response = JSON.parse(this.responseText); + + if (this.status === 200 && response.User != undefined) { + newPassword.parentNode.style.display = "block"; + timeDifference.parentNode.style.display = "block"; + var mapText = { + ID_USER: response.User.id, + DATE_CREA: Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["dateFormat"])(response.User.createdAt), + DATE_UPDATE: Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["dateFormat"])(response.User.updatedAt), + DATE_CONNECTION: Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["dateFormat"])(response.User.connectedAt) + }; + var subscribeIntro = Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["replaceAll"])(txtUsers.infosUserForAdmin, mapText); + + for (var data in response.User) { + if (formUser.elements[data] !== undefined) { + if (response.User[data] !== true && response.User[data] !== false) // booléen = case à cocher ! + formUser.elements[data].value = response.User[data];else if (response.User[data] == true) // si false, on ne fait rien + formUser.elements["" + data].checked = "checked"; + } + } + + if (response.Subscription != undefined) { + // nombre de jours de l'abonnement + formUser.elements["numberOfDays"].value = response.Subscription["numberOfDays"]; // infos de l'abonnement + + if (response.Subscription.noticeOk == true) formUser.elements["noticeOk"].checked = "checked"; // jours de réception + + for (var i in response.Subscription.receiptDays) { + formUser.elements["d" + response.Subscription.receiptDays[i]].checked = "checked"; + } + + var beginSubTS = new Date(response.Subscription.createdAt).getTime(); + var nbDaysOk = response.Subscription.numberOfDays - Math.round((Date.now() - beginSubTS) / 1000 / 3600 / 24); + if (nbDaysOk > 0) subscribeIntro += "
    " + txtSubscriptions.infosNbDaysAdmin.replace("NB_DAYS", nbDaysOk);else subscribeIntro += "
    " + txtSubscriptions.infosExpiratedAdmin; + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divSubscribeIntro, "p", subscribeIntro, "", ["information"], "", false); + } else { + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divSubscribeIntro, "p", txtSubscriptions.isNotValided, "", ["error"]); + validationCheckBox.style.display = "block"; + } + + deleteCheckBox.style.display = "block"; // Infos de paiements via API WP + + var xhrGetPaymentsInfos = new XMLHttpRequest(); + xhrGetPaymentsInfos.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.getPayments + response.User.id); + + xhrGetPaymentsInfos.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var responsePay = JSON.parse(this.responseText); + + if (this.status === 200) { + if (responsePay.length !== 0) { + var txtPayments = ""; + + for (var _i in responsePay) { + var _mapText = { + DATE_PAYMENT: Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["dateFormat"])(responsePay[_i].createdAt, "fr"), + AMOUNT: responsePay[_i].amount, + CLIENT_NAME: responsePay[_i].clientName + }; + txtPayments += "
  • " + Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["replaceAll"])(txtSubscriptions.infosPaymentsAdmin, _mapText) + "
  • "; + } + + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divPaymentsInfos, "ul", txtPayments, "", ["information"], "", false); + divPaymentsInfos.style.display = "block"; + } + } + } + }; + + xhrGetPaymentsInfos.setRequestHeader("Authorization", "Bearer " + user.token); + xhrGetPaymentsInfos.send(); // Un parrain ou deux par deux ? + + var txtGodchilds = ""; + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(response.User.GodfatherId)) { + var xhrGetGodFatherInfos = new XMLHttpRequest(); + xhrGetGodFatherInfos.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.userRoutes + config.getUserInfos + response.User.GodfatherId); + + xhrGetGodFatherInfos.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var responseGF = JSON.parse(this.responseText); + if (this.status === 200 && responseGF.User != undefined) txtGodchilds += txtUsers.infosAdminGodfather + "" + responseGF.User.name + "" + ".
    "; + } + }; + + xhrGetGodFatherInfos.setRequestHeader("Authorization", "Bearer " + user.token); + xhrGetGodFatherInfos.send(); + } // Des filleuls ? + + + var xhrGetGodchilds = new XMLHttpRequest(); + xhrGetGodchilds.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.userRoutes + config.getGodChilds + id); + + xhrGetGodchilds.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var responseGS = JSON.parse(this.responseText); + + if (this.status === 200) { + if (responseGS.length !== 0) { + txtGodchilds += txtUsers.infosAdminNbGodChilds.replace("#NB", responseGS.length); + + for (var _i2 in responseGS) { + txtGodchilds += "" + responseGS[_i2].name + ""; + } + } + } + } + }; + + xhrGetGodchilds.setRequestHeader("Authorization", "Bearer " + user.token); + xhrGetGodchilds.send(); + + if (txtGodchilds !== "") { + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divGodchildsInfos, "p", txtGodchilds + ".", "", ["information"], "", false); + divGodchildsInfos.style.display = "block"; + } + } + } + }; + + xhrGetInfos.setRequestHeader("Authorization", "Bearer " + user.token); + xhrGetInfos.send(); + }; // Si un id est passé par l'url, on essaye d'afficher l'utilisateur : + + + urlDatas = Object(_tools_url_js__WEBPACK_IMPORTED_MODULE_6__["getUrlParams"])(); + if (urlDatas && urlDatas.id !== undefined) showFormUserInfos(urlDatas.id); // Besoin d'un coup de Kärcher ? + + btnNewUser.addEventListener("click", function (e) { + emptyUserForm(); + }); // Envoi du formulaire des infos de l'utilisateur + + formUser.addEventListener("submit", function (e) { + e.preventDefault(); + divResponse.innerHTML = ""; + var datas = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["getDatasFromInputs"])(formUser); // recomposition des jours valables pour l'abonnement : + + datas.receiptDays = ""; + + for (var i = 1; i <= 7; i++) { + if (datas["d" + i] !== undefined) datas.receiptDays += "" + i; + } + + if (datas.noticeOk === undefined) datas.noticeOk = "false"; + if (datas.newsletterOk === undefined) datas.newsletterOk = "false"; + var xhrUserDatas = new XMLHttpRequest(); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.id) && datas.deleteOk !== undefined) xhrUserDatas.open("DELETE", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.userRoutes + "/" + datas.id);else if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.id) && datas.validationOk !== undefined) xhrUserDatas.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.userRoutes + config.validateUserRoute + datas.id);else if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.id)) xhrUserDatas.open("PUT", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.userRoutes + config.updateUserInfos + datas.id);else { + datas.password = Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_7__["getPassword"])(config.password.minlength, config.password.minlength + 2); // mot de passe temporaire + + xhrUserDatas.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.userRoutes + config.createUserRoute); + } + + xhrUserDatas.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var response = JSON.parse(this.responseText); + + if (this.status === 201 && response.id != undefined) { + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.addOkMessage, "", ["success"]); + datas.id = response.id; + } else if (this.status === 200 && response.message != undefined) { + if (Array.isArray(response.message)) response.message = response.message.join("
    ");else response.message = response.message; + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", response.message, "", ["success"]); + } else if (response.errors) { + if (Array.isArray(response.errors)) response.errors = response.errors.join("
    ");else response.errors = txt.serverError; + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", response.errors, "", ["error"]); + } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(response.errors)) { + if (datas.deleteOk === undefined) showFormUserInfos(datas.id); // peut avoir évolué suivant ce qui s'est passé + else emptyUserForm(); + } + } + }; + + xhrUserDatas.setRequestHeader("Content-Type", "application/json"); + xhrUserDatas.setRequestHeader("Authorization", "Bearer " + user.token); + if (datas) xhrUserDatas.send(JSON.stringify(datas)); + }); // Traitement du lancement d'une recherche + + formSearch.addEventListener("submit", function (e) { + e.preventDefault(); + var datas = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["getDatasFromInputs"])(formSearch); + var xhrSearch = new XMLHttpRequest(); + xhrSearch.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.userRoutes + config.searchUserRoute); + + xhrSearch.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var response = JSON.parse(this.responseText); + + if (this.status === 200 && Array.isArray(response)) { + if (response.length === 0) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divSearchResult, "p", txtUsers.notFound, "", ["information"]);else { + var selectHTML = ""; + + for (var i in response) { + selectHTML += ""; + } + + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divSearchResult, "select", selectHTML, "selectSearch"); + var searchSelect = document.getElementById("selectSearch"); + searchSelect.addEventListener("change", function () { + if (searchSelect.value !== "") showFormUserInfos(searchSelect.value); + }); + } + } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divSearchResult, "p", txt.serverError, "", ["error"]); + } + }; + + xhrSearch.setRequestHeader("Content-Type", "application/json"); + xhrSearch.setRequestHeader("Authorization", "Bearer " + user.token); + if (datas) xhrSearch.send(JSON.stringify(datas)); + }); + } + + case 12: + _context.next = 18; + break; + + case 14: + _context.prev = 14; + _context.t0 = _context["catch"](0); + console.error(_context.t0); + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "p", txt.serverError, "", ["error"]); + + case 18: + case "end": + return _context.stop(); + } + } + }, _callee, null, [[0, 14]]); + })); + + return function initialise() { + return _ref.apply(this, arguments); + }; +}(); + +initialise(); + +/***/ }), + +/***/ "./src/tools/clientstorage.js": +/*!************************************!*\ + !*** ./src/tools/clientstorage.js ***! + \************************************/ +/*! exports provided: saveLocaly, getLocaly, removeLocaly */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveLocaly", function() { return saveLocaly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaly", function() { return getLocaly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeLocaly", function() { return removeLocaly; }); +// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.) +// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie +var saveLocaly = function saveLocaly(name, data) { + localStorage.setItem(name, JSON.stringify(data)); +}; +var getLocaly = function getLocaly(name) { + var json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name); +}; +var removeLocaly = function removeLocaly(name) { + localStorage.removeItem(name); +}; + +/***/ }), + +/***/ "./src/tools/dom.js": +/*!**************************!*\ + !*** ./src/tools/dom.js ***! + \**************************/ +/*! exports provided: addElement */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addElement", function() { return addElement; }); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__); +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + + // Fonction associant les attributs fournis à un champ de formulaire + +var addElement = function addElement(eltParent, eltType) { + var eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; + var eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; + var eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : []; + var eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; + var replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true; + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltType) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltParent)) return false;else { + var newElement = document.createElement(eltType); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ? + newElement.id = eltId; + + if (Array.isArray(eltClass) && eltClass.length != 0) { + for (var i in eltClass) { + newElement.classList.add(eltClass[i]); + } + } + + if (_typeof(eltAttributes) === "object") // !! tous les objets ne sont pas ok + { + for (var attributName in eltAttributes) { + newElement.setAttribute(attributName, eltAttributes[attributName]); + } + } + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltContent)) newElement.innerHTML = eltContent.replace(/\n/g, "
    "); // innerHTML permet d'ajouter du texte ayant lui-même des balises, etc. + + if (replace) eltParent.innerHTML = ""; + eltParent.appendChild(newElement); + } +}; + +/***/ }), + +/***/ "./src/tools/everywhere.js": +/*!*********************************!*\ + !*** ./src/tools/everywhere.js ***! + \*********************************/ +/*! exports provided: helloDev, updateAccountLink */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "helloDev", function() { return helloDev; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateAccountLink", function() { return updateAccountLink; }); +// Ce script fournit des fonctions utilisées sur toutes les pages du site +var helloDev = function helloDev() { + console.log("**** Hello ami développeur :-)\n Le code de WikiLerni est libre et est lisible sur gitlab : \n Bonne lecture :-) \n Pour les suggestions d'amélioration ou questions : dev@wililerni.com ****"); + return true; +}; +var updateAccountLink = function updateAccountLink(status, configTemplate) { + var link = document.getElementById("accountHeadLink"); + var homePage = status + "HomePage"; + link.href = "/" + configTemplate[homePage]; +}; + +/***/ }), + +/***/ "./src/tools/forms.js": +/*!****************************!*\ + !*** ./src/tools/forms.js ***! + \****************************/ +/*! exports provided: setAttributesToInputs, getDatasFromInputs, empyForm, empyAndHideForm */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setAttributesToInputs", function() { return setAttributesToInputs; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDatasFromInputs", function() { return getDatasFromInputs; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empyForm", function() { return empyForm; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empyAndHideForm", function() { return empyAndHideForm; }); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__); +function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + + // Fonction associant les attributs fournis à un champ de formulaire + +var setAttributesToInputs = function setAttributesToInputs(inputsConf, myForm) { + for (var i in myForm.elements) { + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(myForm.elements[i].id)) { + var idInput = myForm.elements[i].id; + + if (inputsConf[idInput] !== undefined) { + var inputHTML = document.getElementById(idInput); + + for (var attribute in inputsConf[idInput]) { + inputHTML.setAttribute(attribute, inputsConf[idInput][attribute]); + } + } + } + } + + return true; +}; // Récupère toutes les valeurs de champs en omettant les checkbox non cochées, etc. + +var getDatasFromInputs = function getDatasFromInputs(myForm) { + var datas = {}; + var formData = new FormData(myForm); + + var _iterator = _createForOfIteratorHelper(formData.entries()), + _step; + + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var entrie = _step.value; + datas[entrie[0]] = entrie[1]; + } + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); + } + + return datas; +}; // Vide tous les champs d'un formulaire, y compris hidden, checkbox, etc. +// Revoir pour les select + +var empyForm = function empyForm(myForm) { + var formData = new FormData(myForm); + + var _iterator2 = _createForOfIteratorHelper(formData.entries()), + _step2; + + try { + for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { + var entrie = _step2.value; + if (myForm.elements[entrie[0]].type == "checkbox" || myForm.elements[entrie[0]].type == "radio") myForm.elements[entrie[0]].checked = false;else myForm.elements[entrie[0]].value = ""; + } + } catch (err) { + _iterator2.e(err); + } finally { + _iterator2.f(); + } + + return true; +}; // Vide et cache le formulaire + +var empyAndHideForm = function empyAndHideForm(myForm) { + empyForm(myForm); + myForm.style.display = "none"; +}; + +/***/ }), + +/***/ "./src/tools/url.js": +/*!**************************!*\ + !*** ./src/tools/url.js ***! + \**************************/ +/*! exports provided: getUrlParams */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getUrlParams", function() { return getUrlParams; }); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__); + // Fonction récupérant les paramètres passés par l'url + +var getUrlParams = function getUrlParams() { + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(location.search)) return false; + var parameters = location.search.substring(1).split("&"); + if (!Array.isArray(parameters) || parameters.length === 0) return false; + var param, + datas = {}; + + for (var i in parameters) { + param = parameters[i].split("="); + if (param.length === 2) datas[param[0]] = decodeURI(param[1]); + } + + return datas; +}; + +/***/ }), + +/***/ "./src/tools/users.js": +/*!****************************!*\ + !*** ./src/tools/users.js ***! + \****************************/ +/*! exports provided: getConfig, getTimeDifference, getPassword, setSession, checkAnswerDatas, checkSession */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getConfig", function() { return getConfig; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTimeDifference", function() { return getTimeDifference; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getPassword", function() { return getPassword; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setSession", function() { return setSession; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkAnswerDatas", function() { return checkAnswerDatas; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkSession", function() { return checkSession; }); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/instance.js */ "../config/instance.js"); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../config/users.js */ "../config/users.js"); +/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_3__); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + + +var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0]; + +var configTemplate = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); + + + + // Récupère les données de configuration des utilisateurs +// À terme, un fichier statique importable comme module devrait éviter une requête ajax + +var getConfig = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + return _context.abrupt("return", new Promise(function (resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + "/user/getconfig"); + + xhr.onload = function () { + return resolve(JSON.parse(xhr.responseText)); + }; + + xhr.onerror = function () { + return reject(xhr.statusText); + }; + + xhr.send(); + })); + + case 1: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + + return function getConfig() { + return _ref.apply(this, arguments); + }; +}(); +var getTimeDifference = function getTimeDifference() { + var timeLocal = new Date().getTimezoneOffset(); + if (timeLocal > _config_users_js__WEBPACK_IMPORTED_MODULE_1__["timeDifferenceMax"] || timeLocal < _config_users_js__WEBPACK_IMPORTED_MODULE_1__["timeDifferenceMin"]) return 0;else return timeLocal; +}; // On enlève volontairement les 0/O pour éviter les confusions ! +// Et mieux vaut aussi débuter et finir par une lettre simple. + +var getPassword = function getPassword(nbCarMin, nbCarMax) { + var nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin)); + var letters = "ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz"; + var others = "123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ"; + var password = letters[Math.floor(Math.random() * letters.length)]; + + for (var i = 1; i < nbCar - 1; i++) { + if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)]; + } + + password += letters[Math.floor(Math.random() * letters.length)]; + return password; +}; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite +// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides. + +var setSession = function setSession(userId, token, durationTS) { + var storageUser = { + id: userId, + token: token, + duration: durationTS + }; + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("user", storageUser); +}; // Vérifie qu'il y a des données locales concernant le résultat d'un quiz +// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas + +var checkAnswerDatas = function checkAnswerDatas(datas) { + var lastAnswer = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("lastAnswer"); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(lastAnswer)) { + var answer = JSON.parse(lastAnswer); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.duration) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbCorrectAnswers) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.QuestionnaireId) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbQuestions)) { + datas.duration = answer.duration; + datas.nbCorrectAnswers = answer.nbCorrectAnswers; + datas.QuestionnaireId = answer.QuestionnaireId; + datas.nbQuestions = answer.nbQuestions; + } + } + + return datas; +}; // Cette fonction teste la connexion de l'utilisateur d'une page +// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté + +var checkSession = /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() { + var status, + urlRedirection, + message, + urlWanted, + _args2 = arguments; + return regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + status = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : []; + urlRedirection = _args2.length > 1 ? _args2[1] : undefined; + message = _args2.length > 2 ? _args2[2] : undefined; + urlWanted = _args2.length > 3 ? _args2[3] : undefined; + return _context2.abrupt("return", new Promise(function (resolve, reject) { + var userDatas = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("user"); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(userDatas)) { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else { + var user = JSON.parse(userDatas); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.id) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.token) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.duration) || user.duration < Date.now()) { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else { + var xhr = new XMLHttpRequest(); + xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["userRoutes"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["checkLoginRoute"] + user.token); + + xhr.onload = function () { + var response = JSON.parse(xhr.responseText); + + if (xhr.status === 200 && response.isValid && response.id != undefined) { + if (response.id === user.id) { + user.name = response.name; + user.language = response.language; + user.timeDifference = response.timeDifference; + user.status = response.status; // le token et de toute façon vérifier à chaque requête à l'API + + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("user", user); // si il s'agit d'un "user" et que son abonnement a expiré, je le redirige vers la caisse :-) + + if (response.status === "user" && response.nbDaysOk <= 0) { + var urlAccount = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["siteUrl"] + "/" + configTemplate[lang].accountPage; + if (window.location.href.indexOf(urlAccount) === -1) window.location.assign("/" + configTemplate[lang].accountPage); // passée directement ici, l'ancre #subscribe ne fonctionne pas !? + + resolve(true); + } else { + if (status.length !== 0 && status.indexOf(response.status) === -1) { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else resolve(true); + } + } else { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + } else { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + }; + + xhr.onerror = function () { + return reject(xhr.statusText); + }; + + xhr.send(); + } + } + })); + + case 5: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + + return function checkSession() { + return _ref2.apply(this, arguments); + }; +}(); // Cette fonction sert à la précédente en cas de connexion non valide + +var redirectUser = function redirectUser(urlRedirection, message, urlWanted) { + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(message)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("message", message); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlWanted)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("url", urlWanted); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlRedirection)) window.location.assign(urlRedirection); +}; + +/***/ }) + +/******/ }); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9nZW5lcmFsJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3N1YnNjcmlwdGlvbiQiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC91c2VyJCIsIndlYnBhY2s6Ly8vLi4vbGFuZy9mci9nZW5lcmFsLmpzIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL3N1YnNjcmlwdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi4vbGFuZy9mci91c2VyLmpzIiwid2VicGFjazovLy8uLi90b29scy9tYWluLmpzIiwid2VicGFjazovLy8uLi92aWV3cyBzeW5jIF5cXC5cXC8uKlxcLmpzJCIsIndlYnBhY2s6Ly8vLi4vdmlld3MvZGVmYXVsdC9jb25maWcvZnIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL21hbmFnZVVzZXJzLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy9jbGllbnRzdG9yYWdlLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy9kb20uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2V2ZXJ5d2hlcmUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2Zvcm1zLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy91cmwuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL3VzZXJzLmpzIl0sIm5hbWVzIjpbInVzZXJzIiwicmVxdWlyZSIsInF1ZXN0aW9ubmFpcmVzIiwibW9kdWxlIiwiZXhwb3J0cyIsImFwaVVybCIsInNpdGVVcmwiLCJhZG1pbk5hbWUiLCJhZG1pbkVtYWlsIiwic2VuZGVyTmFtZSIsInNlbmRlckVtYWlsIiwiYWRtaW5MYW5nIiwidGhlbWUiLCJhdmFpbGFibGVMYW5ncyIsInNpdGVOYW1lIiwiYmVnaW5Db2RlR29kZmF0aGVyIiwiY3JvblRpbWluZ0FsZXJ0SW5TZWNvbmRlIiwicmVzcG9uc2VUaW1pbmdBbGVydEluU2Vjb25kZSIsInRva2VuU2lnbnVwVmFsaWRhdGlvblRpbWVJbkhvdXJzIiwidG9rZW5Mb2dpbkxpbmtUaW1lSW5Ib3VycyIsInRva2VuQ29ubmV4aW9uTWluVGltZUluSG91cnMiLCJ0b2tlbkNvbm5leGlvbk1heFRpbWVJbkRheXMiLCJ0b2tlbkxvZ2luQ2hhbmdpbmdUaW1lSW5Ib3VycyIsInRva2VuRGVsZXRlVXNlclRpbWVJbkhvdXJzIiwidG9rZW5VbnN1YnNjcmliZUxpbmtUaW1lSW5EYXlzIiwiZnJlZUFjY291bnRUaW1pbmdJbkRheXMiLCJmcmVlQWNjb3VudEV4cGlyYXRpb25Ob3RpZmljYXRpb25JbkRheXMiLCJhY2NvdW50RXhwaXJhdGlvbkZpcnN0Tm90aWZpY2F0aW9uSW5EYXlzIiwiYWNjb3VudEV4cGlyYXRpb25TZWNvbmROb3RpZmljYXRpb25JbkRheXMiLCJpbmFjdGl2ZUFjY291bnRUaW1lVG9EZWxldGVJbkRheXMiLCJuYlF1ZXN0aW9uc01pbiIsIm5iUXVlc3Rpb25zTWF4IiwibmJDaG9pY2VzTWF4IiwibmJOZXdRdWVzdGlvbm5haXJlcyIsImhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUJlZ2luIiwiaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlRW5kIiwibnVtYmVyTmV3UXVlc3Rpb25uYWlyZUF0U2FtZVRpbWUiLCJtaW5TZWFyY2hRdWVzdGlvbm5haXJlcyIsIm5iSWxsdXN0cmF0aW9uc01pbiIsIm5iSWxsdXN0cmF0aW9uc01heCIsIm1heElsbHVzdHJhdGlvblNpemVpbk9jdGV0IiwibWltZVR5cGVzRm9ySWxsdXN0cmF0aW9uIiwiaWxsdXN0cmF0aW9uc1dpZHRoTWF4SW5QeCIsImlsbHVzdHJhdGlvbnNNaW5pYXR1cmVzV2lkdGhNYXhJblB4IiwibmJMaW5rc01pbiIsIm5iTGlua3NNYXgiLCJwYXNzd29yZCIsIm1pbmxlbmd0aCIsImRpckNhY2hlVXNlcnMiLCJkaXJDYWNoZVVzZXJzQW5zd2VycyIsImRpckNhY2hlUXVlc3Rpb25uYWlyZXMiLCJkaXJDYWNoZVF1ZXN0aW9ucyIsImRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlcyIsImRpckhUTUxRdWVzdGlvbm5haXJlIiwiZGlyV2ViUXVlc3Rpb25uYWlyZSIsInF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJnZXRRdWVzdGlvbm5haXJlUm91dGVzIiwicHJldmlld1F1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJwdWJsaXNoZWRRdWVzdGlvbm5haXJlUm91dGVzIiwic2F2ZUFuc3dlcnNSb3V0ZSIsImdldFN0YXRzUXVlc3Rpb25uYWlyZXMiLCJzZWFyY2hRdWVzdGlvbm5haXJlc1JvdXRlIiwic2VhcmNoQWRtaW5RdWVzdGlvbm5haXJlc1JvdXRlIiwiZ2V0TGlzdE5leHRRdWVzdGlvbm5haXJlcyIsInF1ZXN0aW9uc1JvdXRlIiwidGFnc1NlYXJjaFJvdXRlIiwiZ2V0UXVlc3Rpb25uYWlyZXNXaXRob3V0QW5zd2VyIiwiZ2V0UHJldmlvdXNBbnN3ZXJzIiwiZ2V0U3RhdHNBbnN3ZXJzIiwiZ2V0QWRtaW5TdGF0cyIsIlF1ZXN0aW9ubmFpcmUiLCJ0aXRsZSIsIm1heGxlbmd0aCIsInJlcXVpcmVkIiwic2x1ZyIsImludHJvZHVjdGlvbiIsInNlYXJjaFF1ZXN0aW9ubmFpcmVzIiwiUXVlc3Rpb24iLCJ0ZXh0IiwicmFuayIsIm1pbiIsImRlZmF1bHRWYWx1ZSIsIkNob2ljZSIsIm5iVGFnc01pbiIsIm5iVGFnc01heCIsImRpckNhY2hlVGFncyIsImRpckhUTUxUYWdzIiwiZGlyV2ViVGFncyIsInVzZXJSb3V0ZXMiLCJzdWJzY3JpYmVSb3V0ZSIsImdldEdvZGZhdGhlclJvdXRlIiwiY2hlY2tJZklzRW1haWxmcmVlUm91dGUiLCJjaGVja1N1YnNjcmliZVRva2VuUm91dGUiLCJjaGVja0xvZ2luUm91dGUiLCJjb25uZWN0aW9uUm91dGUiLCJnZXRMb2dpbkxpbmtSb3V0ZSIsImNvbm5lY3Rpb25XaXRoTGlua1JvdXRlIiwiZ2V0VXNlckluZm9zIiwiY3JlYXRlVXNlclJvdXRlIiwidmFsaWRhdGVVc2VyUm91dGUiLCJ1cGRhdGVVc2VySW5mb3MiLCJzZWFyY2hVc2VyUm91dGUiLCJnZXRHb2RDaGlsZHMiLCJjaGVja05ld0xvZ2luTGlua1JvdXRlIiwiY2hlY2tEZWxldGVMaW5rUm91dGUiLCJnZXRQYXltZW50cyIsInVuc3Vic2NyaWJlUm91dGUiLCJuYW1lIiwiZW1haWwiLCJuZXdQYXNzd29yZCIsImNvZGVHb2RmYXRoZXIiLCJjZ3VPayIsInZhbHVlIiwidGltZURpZmZlcmVuY2VNaW4iLCJ0aW1lRGlmZmVyZW5jZU1heCIsInNpdGVIVE1MVGl0bGUiLCJzaXRlTWV0YURlc2NyaXB0aW9uIiwic2NyaXB0VGltaW5nSW5mbyIsInNjcmlwdFRpbWluZ0FsZXJ0Iiwic2VydmVyRXJyb3IiLCJzZXJ2ZXJFcnJvckFkbWluIiwibmVlZGVkUGFyYW1zIiwiYmFkVXJsIiwibm90VmFsaWRGb3JtYXQiLCJub3RBbGxvd2VkIiwibm90UmVxdWlyZWQiLCJ1cGRhdGVCdG5UeHQiLCJhZGRCdG5UeHQiLCJkZWxldGVCdG5UeHQiLCJhZGRPa01lc3NhZ2UiLCJ1cGRhdGVPa01lc3NhZ2UiLCJkZWxldGVPa01lc3NhZ2UiLCJmYWlsQXV0aCIsImZhaWxBdXRoSGVhZGVyIiwiZmFpbEF1dGhUb2tlbiIsImZhaWxBdXRoSWQiLCJmYWlsQXV0aENyb24iLCJwcmV2aW91c1BhZ2UiLCJuZXh0UGFnZSIsImJ0bkxpbmtUb1F1ZXN0aW9ubmFpcmUiLCJzdGF0c0FkbWluIiwibmVlZE51bWJlck9mRGF5cyIsIm5lZWRJbnRlZ2VyTnVtYmVyT2ZEYXlzIiwibmVlZE1pbk51bWJlck9mRGF5cyIsIm5lZWROb3RUb29Mb25nRGF5c0xpc3QiLCJuZWVkVmFsaWREYXlzTGlzdCIsIm5lZWRVbmlxdWVEYXlzTGlzdCIsIm5lZWRLbm93SWZOb3RpY2VPayIsInVuc3Vic2NyaXB0aW9uT2siLCJ1bnN1YnNjcmlwdGlvbkZhaWwiLCJhbGxTdWJzY3JpcHRpb25Qcm9jZXNzZWQiLCJtYWlsTmV3UXVlc3Rpb25uYWlyZVN1YmplY3QiLCJtYWlsTmV3UXVlc3Rpb25uYWlyZUJvZHlUeHQiLCJtYWlsTmV3UXVlc3Rpb25uYWlyZUJvZHlIVE1MIiwibm9OZXdRdWVzdGlvbm5haXJlRm9yVXNlciIsIm1haWxFbmRGcmVlVGltZVN1YmplY3QiLCJtYWlsRW5kRnJlZVRpbWVCb2R5VHh0IiwibWFpbEVuZEZyZWVUaW1lQm9keUhUTUwiLCJtYWlsRW5kRnJlZVRpbWVNZXNzYWdlIiwibWFpbEV4cGlyYXRpb25TdWJqZWN0IiwibWFpbEV4cGlyYXRpb25Cb2R5VHh0IiwibWFpbEV4cGlyYXRpb25Cb2R5SFRNTCIsIm1haWxFeHBpcmF0aW9uTWVzc2FnZSIsImluZm9zTmJEYXlzIiwiaW5mb3NFeHBpcmF0ZWQiLCJpbmZvc05iRGF5c0FkbWluIiwiaW5mb3NFeHBpcmF0ZWRBZG1pbiIsImlzTm90VmFsaWRlZCIsImluZm9zUGF5bWVudHNBZG1pbiIsIm5vdEZvdW5kIiwibmVlZE5hbWUiLCJuZWVkTm90VG9vTG9uZ05hbWUiLCJuZWVkRW1haWwiLCJuZWVkVW5pcXVlRW1haWwiLCJuZWVkTm90VG9vTG9uZ0VtYWlsIiwibmVlZFBhc3NXb3JkIiwibmVlZExvbmdQYXNzV29yZCIsInBhc3N3b3JkQ29waWVkIiwibmVlZFN0YXR1cyIsIm5lZWRMYW5ndWFnZSIsIm5lZWRWYWxpZExhc3RDb25uZWN0aW9uRGF0ZSIsIm5lZWRTTVRQIiwibmVlZFNNVFBOb3RGb3VuZCIsIm5lZWRLbm93TmV3c2xldHRlck9rIiwibmVlZFRpbWVEaWZmZXJlbmNlIiwibmVlZE1pblRpbWVEaWZmZXJlbmNlIiwibmVlZE1heFRpbWVEaWZmZXJlbmNlIiwibmVlZFVHQ09rIiwiZ29kZmF0aGVyTm90Rm91bmQiLCJnb2RmYXRoZXJGb3VuZCIsIm1haWxWYWxpZGF0aW9uTWVzc2FnZSIsIm1haWxWYWxpZGF0aW9uTGlua1N1YmplY3QiLCJtYWlsVmFsaWRhdGlvbkxpbmtTQm9keVR4dCIsIm1haWxWYWxpZGF0aW9uTGlua1NCb2R5SFRNTCIsInZhbGlkYXRpb25NZXNzYWdlIiwidmFsaWRhdGlvbk1lc3NhZ2VBZG1pbiIsInZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZSIsInZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZUFkbWluIiwibWFpbFdlbGNvbWVTdWJqZWN0IiwibWFpbFdlbGNvbWVCb2R5VHh0IiwibWFpbFdlbGNvbWVCb2R5SFRNTCIsIm1haWxUaGFua0dvZGZhdGhlclN1YmplY3QiLCJtYWlsVGhhbmtHb2RmYXRoZXJCb2R5VHh0IiwibWFpbFRoYW5rR29kZmF0aGVyQm9keUhUTUwiLCJiYWRMaW5rVmFsaWRhdGlvbk1lc3NhZ2UiLCJlbWFpbE5vdEZvdW5kIiwiYWxyZWFkeUNvbm5lY3RlZCIsIm5lZWRCZUNvbm5lY3RlZCIsImNvbm5lY3Rpb25PayIsIm5lZWRDaG9vc2VMb2dpbldheSIsIm5lZWRWYWxpZGF0aW9uVG9Mb2dpbiIsInRvb01hbnlMb2dpbkZhaWxzIiwiYmFkUGFzc3dvcmQiLCJtYWlsTG9naW5MaW5rU3ViamVjdCIsIm1haWxMb2dpbkxpbmtCb2R5VHh0IiwibWFpbExvZ2luTGlua0JvZHlIVE1MIiwibWFpbExvZ2luTGlua01lc3NhZ2UiLCJ1cGRhdGVkT2tNZXNzYWdlIiwidXBkYXRlZE5lZWRHb29kRW1haWwiLCJ1cGRhdGVkTmVlZFVuaXF1ZUVtYWlsIiwibWFpbFVwZGF0ZUxvZ2luU3ViamVjdCIsIm1haWxVcGRhdGVMb2dpbkJvZHlUeHQiLCJtYWlsVXBkYXRlTG9naW5Cb2R5SFRNTCIsIm1haWxVcGRhdGVMb2dpbkxpbmtNZXNzYWdlIiwidXBkYXRlZE5lZWRWYWxpZGF0ZWRVc2VyIiwidXBkYXRlZE5lZWRHb29kR29kZmF0aGVyIiwibWFpbFVwZGF0ZUxvZ2luT2tNZXNzYWdlIiwidXBkYXRlZEZhaWxlZEdvZGZhdGhlck5vdEZvdW5kIiwiY3JlYXRpb25Pa01lc3NhZ2UiLCJtYWlsRGVsZXRlU3ViamVjdCIsIm1haWxEZWxldGVCb2R5VHh0IiwibWFpbERlbGV0ZUJvZHlIVE1MIiwibWFpbERlbGV0ZUxpbmtNZXNzYWdlIiwiZGVsZXRlRmFpbE1lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua09rTWVzc2FnZSIsIm1haWxEZWxldGVMaW5rQWxyZWFkeU1lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua0ZhaWxNZXNzYWdlIiwiY3JvbkRlbGV0ZVVudmFsaWRlZFVzZXJzTWVzc2FnZSIsImRlbGV0ZUluYWN0aXZlVXNlcnNNZXNzYWdlIiwid2VsY29tZU1lc3NhZ2UiLCJieWVieWVNZXNzYWdlIiwiaW5mb3NVc2VyRm9yQWRtaW4iLCJpbmZvc0FkbWluR29kZmF0aGVyIiwiaW5mb3NBZG1pbk5iR29kQ2hpbGRzIiwiVG9vbCIsIm15VmFyIiwidW5kZWZpbmVkIiwidHJpbSIsIm15U3RyaW5nIiwiaXNFbXB0eSIsIm1heCIsImxlbmd0aCIsInN1YnN0cmluZyIsIm1hcE9iaiIsInJlcGxhY2VFbHRzIiwiUmVnRXhwIiwiT2JqZWN0Iiwia2V5cyIsImpvaW4iLCJyZXBsYWNlIiwibWF0Y2hlZCIsIk1hdGgiLCJjZWlsIiwiZmxvb3IiLCJyYW5kb20iLCJkYXRlU3RyaW5nIiwibGFuZyIsIm15RGF0ZSIsIkRhdGUiLCJteURheSIsImdldERhdGUiLCJteU1vdW50aCIsImdldE1vbnRoIiwibXlZZWFyIiwiZ2V0RnVsbFllYXIiLCJoZWFkTGlua3MiLCJhbmNob3IiLCJhdHRyaWJ1dGVzIiwiaHJlZiIsImlkIiwiZm9vdExpbmtzIiwicmVsIiwibWF4UXVlc3Rpb25uYWlyZXNCeVBhZ2UiLCJ1c2VySG9tZVBhZ2UiLCJhZG1pbkhvbWVQYWdlIiwibWFuYWdlckhvbWVQYWdlIiwic3Vic2NyaWJlUGFnZSIsImNvbm5lY3Rpb25QYWdlIiwiYWNjb3VudFBhZ2UiLCJxdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlIiwidXNlcnNNYW5hZ2VtZW50UGFnZSIsIm5iUXVlc3Rpb25uYWlyZXNVc2VySG9tZVBhZ2UiLCJpbGx1c3RyYXRpb25EaXIiLCJzaXRlU2xvZ2FuIiwiaG9tZVRpdGxlMSIsImhvbWVQMSIsImhvbWVUaXRsZTIiLCJob21lUDIiLCJuZXdRdWVzdGlvbm5haXJlc1RpdGxlIiwibmV3UXVlc3Rpb25uYWlyZXNJbnRybyIsImV4cGxhbmF0aW9uVGl0bGUiLCJleHBsYW5hdGlvblR4dCIsIm5vSlNOb3RpZmljYXRpb24iLCJjb25maWdGcm9udEVuZCIsInR4dCIsInR4dFVzZXJzIiwidHh0U3Vic2NyaXB0aW9ucyIsImhlbGxvRGV2IiwiZGl2TWFpbiIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJkaXZNZXNzYWdlIiwiZGl2UmVzcG9uc2UiLCJkaXZTdWJzY3JpYmVJbnRybyIsImRpdlBheW1lbnRzSW5mb3MiLCJkaXZHb2RjaGlsZHNJbmZvcyIsImZvcm1Vc2VyIiwiZGVsZXRlQ2hlY2tCb3giLCJ2YWxpZGF0aW9uQ2hlY2tCb3giLCJidG5OZXdVc2VyIiwidGltZURpZmZlcmVuY2UiLCJmb3JtU2VhcmNoIiwiZGl2U2VhcmNoUmVzdWx0IiwiaW5pdGlhbGlzZSIsImdldENvbmZpZyIsImNvbmZpZyIsImFkZEVsZW1lbnQiLCJjaGVja1Nlc3Npb24iLCJtZXNzYWdlIiwiY29sb3IiLCJ3aW5kb3ciLCJsb2NhdGlvbiIsImlzQ29ubmVjdGVkIiwidXNlciIsImdldExvY2FseSIsInVwZGF0ZUFjY291bnRMaW5rIiwic3RhdHVzIiwic3R5bGUiLCJkaXNwbGF5IiwicmVtb3ZlTG9jYWx5Iiwic2V0QXR0cmlidXRlc1RvSW5wdXRzIiwiZW1wdHlVc2VyRm9ybSIsImVtcHlGb3JtIiwiaW5uZXJIVE1MIiwicGFyZW50Tm9kZSIsInNob3dGb3JtVXNlckluZm9zIiwieGhyR2V0SW5mb3MiLCJYTUxIdHRwUmVxdWVzdCIsIm9wZW4iLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJyZWFkeVN0YXRlIiwiRE9ORSIsInJlc3BvbnNlIiwiSlNPTiIsInBhcnNlIiwicmVzcG9uc2VUZXh0IiwiVXNlciIsIm1hcFRleHQiLCJJRF9VU0VSIiwiREFURV9DUkVBIiwiZGF0ZUZvcm1hdCIsImNyZWF0ZWRBdCIsIkRBVEVfVVBEQVRFIiwidXBkYXRlZEF0IiwiREFURV9DT05ORUNUSU9OIiwiY29ubmVjdGVkQXQiLCJzdWJzY3JpYmVJbnRybyIsInJlcGxhY2VBbGwiLCJkYXRhIiwiZWxlbWVudHMiLCJjaGVja2VkIiwiU3Vic2NyaXB0aW9uIiwibm90aWNlT2siLCJpIiwicmVjZWlwdERheXMiLCJiZWdpblN1YlRTIiwiZ2V0VGltZSIsIm5iRGF5c09rIiwibnVtYmVyT2ZEYXlzIiwicm91bmQiLCJub3ciLCJ4aHJHZXRQYXltZW50c0luZm9zIiwicmVzcG9uc2VQYXkiLCJ0eHRQYXltZW50cyIsIkRBVEVfUEFZTUVOVCIsIkFNT1VOVCIsImFtb3VudCIsIkNMSUVOVF9OQU1FIiwiY2xpZW50TmFtZSIsInNldFJlcXVlc3RIZWFkZXIiLCJ0b2tlbiIsInNlbmQiLCJ0eHRHb2RjaGlsZHMiLCJHb2RmYXRoZXJJZCIsInhockdldEdvZEZhdGhlckluZm9zIiwicmVzcG9uc2VHRiIsInhockdldEdvZGNoaWxkcyIsInJlc3BvbnNlR1MiLCJ1cmxEYXRhcyIsImdldFVybFBhcmFtcyIsImFkZEV2ZW50TGlzdGVuZXIiLCJlIiwicHJldmVudERlZmF1bHQiLCJkYXRhcyIsImdldERhdGFzRnJvbUlucHV0cyIsIm5ld3NsZXR0ZXJPayIsInhoclVzZXJEYXRhcyIsImRlbGV0ZU9rIiwidmFsaWRhdGlvbk9rIiwiZ2V0UGFzc3dvcmQiLCJBcnJheSIsImlzQXJyYXkiLCJlcnJvcnMiLCJzdHJpbmdpZnkiLCJ4aHJTZWFyY2giLCJzZWxlY3RIVE1MIiwic2VhcmNoU2VsZWN0IiwiY29uc29sZSIsImVycm9yIiwic2F2ZUxvY2FseSIsImxvY2FsU3RvcmFnZSIsInNldEl0ZW0iLCJqc29uIiwiZ2V0SXRlbSIsInJlbW92ZUl0ZW0iLCJlbHRQYXJlbnQiLCJlbHRUeXBlIiwiZWx0Q29udGVudCIsImVsdElkIiwiZWx0Q2xhc3MiLCJlbHRBdHRyaWJ1dGVzIiwibmV3RWxlbWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc0xpc3QiLCJhZGQiLCJhdHRyaWJ1dE5hbWUiLCJzZXRBdHRyaWJ1dGUiLCJhcHBlbmRDaGlsZCIsImxvZyIsImNvbmZpZ1RlbXBsYXRlIiwibGluayIsImhvbWVQYWdlIiwiaW5wdXRzQ29uZiIsIm15Rm9ybSIsImlkSW5wdXQiLCJpbnB1dEhUTUwiLCJhdHRyaWJ1dGUiLCJmb3JtRGF0YSIsIkZvcm1EYXRhIiwiZW50cmllcyIsImVudHJpZSIsInR5cGUiLCJlbXB5QW5kSGlkZUZvcm0iLCJzZWFyY2giLCJwYXJhbWV0ZXJzIiwic3BsaXQiLCJwYXJhbSIsImRlY29kZVVSSSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwieGhyIiwib25sb2FkIiwib25lcnJvciIsInN0YXR1c1RleHQiLCJnZXRUaW1lRGlmZmVyZW5jZSIsInRpbWVMb2NhbCIsImdldFRpbWV6b25lT2Zmc2V0IiwibmJDYXJNaW4iLCJuYkNhck1heCIsIm5iQ2FyIiwibGV0dGVycyIsIm90aGVycyIsInNldFNlc3Npb24iLCJ1c2VySWQiLCJkdXJhdGlvblRTIiwic3RvcmFnZVVzZXIiLCJkdXJhdGlvbiIsImNoZWNrQW5zd2VyRGF0YXMiLCJsYXN0QW5zd2VyIiwiYW5zd2VyIiwibmJDb3JyZWN0QW5zd2VycyIsIlF1ZXN0aW9ubmFpcmVJZCIsIm5iUXVlc3Rpb25zIiwidXJsUmVkaXJlY3Rpb24iLCJ1cmxXYW50ZWQiLCJ1c2VyRGF0YXMiLCJyZWRpcmVjdFVzZXIiLCJpc1ZhbGlkIiwibGFuZ3VhZ2UiLCJ1cmxBY2NvdW50IiwiaW5kZXhPZiIsImFzc2lnbiJdLCJtYXBwaW5ncyI6IjtRQUFBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFD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QUFVLENBQUMsS0FBRCxFQUFRa0UsU0FBUixDQUFWO0FBQ0osTUFBRyxDQUFDNU8sMkRBQU8sQ0FBQzJPLGNBQUQsQ0FBWCxFQUNJMUosTUFBTSxDQUFDQyxRQUFQLENBQWdCaUssTUFBaEIsQ0FBdUJSLGNBQXZCO0FBQ1AsQ0FSRCxDIiwiZmlsZSI6Ii4vSlMvbWFuYWdlVXNlcnMuYXBwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvbWFuYWdlVXNlcnMuanNcIik7XG4iLCJjb25zdCB1c2VycyA9IHJlcXVpcmUoXCIuL3VzZXJzXCIpO1xuY29uc3QgcXVlc3Rpb25uYWlyZXMgPSByZXF1aXJlKFwiLi9xdWVzdGlvbm5haXJlc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIGFwaVVybDogXCJodHRwOi8vbG9jYWxob3N0OjMwMDAvYXBpXCIsXG4gICAgc2l0ZVVybDogXCJodHRwOi8vbG9jYWxob3N0OjgwODBcIixcbiAgICBhZG1pbk5hbWU6IFwiRmFicmljZVwiLFxuICAgIGFkbWluRW1haWw6IFwiZGV2QHdpa2lsZXJuaS5jb21cIixcbiAgICBzZW5kZXJOYW1lOiBcIldpa2lMZXJuaVwiLFxuICAgIHNlbmRlckVtYWlsOiBcImJvbmpvdXJAd2lraWxlcm5pLmNvbVwiLFxuICAgIGFkbWluTGFuZzogXCJmclwiLFxuICAgIHRoZW1lOiBcImRlZmF1bHRcIiwgLy8gbGUgdGjDqG1lIHV0aWxpc8OpIChkYW5zIC92aWV3cykgcG91ciBnw6luw6lyZXIgbGVzIHBhZ2VzIEhUTUwuIENvbnRpZW50IHNlcyBwcm9wcmVzIGZpY2hpZXJzIGRlIGNvbmZpZ3VyYXRpb24uXG4gICAgYXZhaWxhYmxlTGFuZ3M6IFtcImZyXCJdLC8vIExhbmd1YWdlcyBpbiB3aGljaCB0aGUgc2l0ZSBpcyBhdmFpbGFibGUuIFRoZSBmaXJzdCBvbmUgaXMgdGhlIGRlZmF1bHQgb25lLlxuICAgIHNpdGVOYW1lOiBcIldpa2lMZXJuaVwiLFxuICAgIGJlZ2luQ29kZUdvZGZhdGhlcjogXCJ3aWtpbGVybmlcIiwgLy8gY2FzZS1zZW5zaXRpdmUgYW5kIGNhbid0IGNvbnRhaW4gXCJAXCIgIVxuICAgIGNyb25UaW1pbmdBbGVydEluU2Vjb25kZTogMTIwLCAvLyBmb3IgbG9nc1xuICAgIHJlc3BvbnNlVGltaW5nQWxlcnRJblNlY29uZGU6IDMsIC8vIGlkZW1cbiAgICB0b2tlblNpZ251cFZhbGlkYXRpb25UaW1lSW5Ib3VyczogXCI0OGhcIiwgLy8gaHR0cHM6Ly9naXRodWIuY29tL3plaXQvbXNcbiAgICB0b2tlbkxvZ2luTGlua1RpbWVJbkhvdXJzOiBcIjFoXCIsXG4gICAgdG9rZW5Db25uZXhpb25NaW5UaW1lSW5Ib3VyczogXCIyNGhcIixcbiAgICB0b2tlbkNvbm5leGlvbk1heFRpbWVJbkRheXM6IFwiMTgwIGRheXNcIixcbiAgICB0b2tlbkxvZ2luQ2hhbmdpbmdUaW1lSW5Ib3VyczogXCIxaFwiLC8vIGZvciBlbWFpbCAmIHBhc3N3b3JkIGNoYW5naW5nXG4gICAgdG9rZW5EZWxldGVVc2VyVGltZUluSG91cnM6IFwiMWhcIixcbiAgICB0b2tlblVuc3Vic2NyaWJlTGlua1RpbWVJbkRheXM6IFwiNyBkYXlzXCIsIC8vIHRva2VuIHNlbmQgd2l0aCBzdWJzY3JpcHRpb24ncyBlbWFpbHNcbiAgICBmcmVlQWNjb3VudFRpbWluZ0luRGF5czogMTAsXG4gICAgZnJlZUFjY291bnRFeHBpcmF0aW9uTm90aWZpY2F0aW9uSW5EYXlzOiA1LFxuICAgIGFjY291bnRFeHBpcmF0aW9uRmlyc3ROb3RpZmljYXRpb25JbkRheXM6IDE0LCAgICBcbiAgICBhY2NvdW50RXhwaXJhdGlvblNlY29uZE5vdGlmaWNhdGlvbkluRGF5czogNSxcbiAgICBpbmFjdGl2ZUFjY291bnRUaW1lVG9EZWxldGVJbkRheXM6IDE4MCxcbiAgICAvLyBRdWVzdGlvbm5haXJlczpcbiAgICBuYlF1ZXN0aW9uc01pbjogMSwgLy8gbWluaW11bSBudW1iZXIgb2YgcXVlc3Rpb25zIGZvciB0aGUgcXVlc3Rpb25uYWlyZSB0byBiZSBwdWJsaXNoYWJsZVxuICAgIG5iUXVlc3Rpb25zTWF4OiAxMCwgLy8gaWYgMCA9IG5vdCBtYXhpbXVtXG4gICAgbmJDaG9pY2VzTWF4OiAxMCxcbiAgICBuYk5ld1F1ZXN0aW9ubmFpcmVzOiAxMCwvLyBmb3IgUlNTLCBldGMuXG4gICAgaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlQmVnaW46MSwgLy8gaW4gdXNlciBsb2NhbCB0aW1lXG4gICAgaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlRW5kOjI0LCAvLyBpZGVtXG4gICAgbnVtYmVyTmV3UXVlc3Rpb25uYWlyZUF0U2FtZVRpbWU6IDUwLCAvLyBmb3IgbWFzcyBtYWlsaW5nXG4gICAgbWluU2VhcmNoUXVlc3Rpb25uYWlyZXM6IDMsXG4gICAgLy8gSWxsdXN0cmF0aW9uczpcbiAgICBuYklsbHVzdHJhdGlvbnNNaW46IDAsXG4gICAgbmJJbGx1c3RyYXRpb25zTWF4OiAxLFxuICAgIG1heElsbHVzdHJhdGlvblNpemVpbk9jdGV0OiAxMDAwMDAwLC8vIHBhcyBjb250csO0bMOpIHBvdXIgbCdpbnN0YW50LiDDgCByZXZvaXIuXG4gICAgbWltZVR5cGVzRm9ySWxsdXN0cmF0aW9uOiBbIFwiaW1hZ2UvanBnXCIsIFwiaW1hZ2UvanBlZ1wiLCBcImltYWdlL3BuZ1wiLCBcImltYWdlL2dpZlwiLCBcImltYWdlL3BuZ1wiIF0sXG4gICAgLy8gLS0gVXBsb2FkIGFuZCByZXNpemU6XG4gICAgaWxsdXN0cmF0aW9uc1dpZHRoTWF4SW5QeDogNDAwLFxuICAgIGlsbHVzdHJhdGlvbnNNaW5pYXR1cmVzV2lkdGhNYXhJblB4OiAyMDAsXG4gICAgLy8gTGlua3M6XG4gICAgbmJMaW5rc01pbjogMSxcbiAgICBuYkxpbmtzTWF4OiAxLFxuICAgIC8vIMOgIHN1cHByaW1lciBxdWFuZCB0b3VzIGxlcyBcInJlcXVpcmVcIiDDoCBqb3VyOlxuICAgIG5iUXVlc3Rpb25zTWluOiBxdWVzdGlvbm5haXJlcy5uYlF1ZXN0aW9uc01pbixcbiAgICBuYlF1ZXN0aW9uc01heDogcXVlc3Rpb25uYWlyZXMubmJRdWVzdGlvbnNNYXgsXG4gICAgbmJDaG9pY2VzTWF4OiBxdWVzdGlvbm5haXJlcy5uYkNob2ljZXNNYXgsXG4gICAgcGFzc3dvcmRNaW5MZW5ndGg6IHVzZXJzLnBhc3N3b3JkLm1pbmxlbmd0aCxcbiAgICBkaXJDYWNoZVVzZXJzOiB1c2Vycy5kaXJDYWNoZVVzZXJzLFxuICAgIGRpckNhY2hlVXNlcnNBbnN3ZXJzOiB1c2Vycy5kaXJDYWNoZVVzZXJzQW5zd2VycyxcbiAgICBkaXJDYWNoZVF1ZXN0aW9ubmFpcmVzOiBxdWVzdGlvbm5haXJlcy5kaXJDYWNoZVF1ZXN0aW9ubmFpcmVzLFxuICAgIGRpckNhY2hlUXVlc3Rpb25zOiBxdWVzdGlvbm5haXJlcy5kaXJDYWNoZVF1ZXN0aW9ucyxcbiAgICBkaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlcyxcbiAgICBkaXJIVE1MUXVlc3Rpb25uYWlyZTogcXVlc3Rpb25uYWlyZXMuZGlySFRNTFF1ZXN0aW9ubmFpcmUsXG4gICAgZGlyV2ViUXVlc3Rpb25uYWlyZTogcXVlc3Rpb25uYWlyZXMuZGlyV2ViUXVlc3Rpb25uYWlyZVxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57ICAgIFxuICAgIC8vIEFQSSdyb3V0ZXMgKGFmdGVyIFwiYXBpVXJsXCIgZGVmaW5lZCBpbiBpbnN0YW5jZS5qcylcbiAgICBxdWVzdGlvbm5haXJlUm91dGVzOiBcIi9xdWVzdGlvbm5haXJlXCIsXG4gICAgZ2V0UXVlc3Rpb25uYWlyZVJvdXRlczogXCIvZ2V0XCIsXG4gICAgcHJldmlld1F1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3ByZXZpZXdcIixcbiAgICBwdWJsaXNoZWRRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9xdWl6L1wiLFxuICAgIHNhdmVBbnN3ZXJzUm91dGU6IFwiL2Fuc3dlci9cIixcbiAgICBnZXRTdGF0c1F1ZXN0aW9ubmFpcmVzIDogXCIvc3RhdHMvXCIsXG4gICAgc2VhcmNoUXVlc3Rpb25uYWlyZXNSb3V0ZSA6IFwiL3NlYXJjaFwiLFxuICAgIHNlYXJjaEFkbWluUXVlc3Rpb25uYWlyZXNSb3V0ZSA6IFwiL3NlYXJjaGFkbWluXCIsXG4gICAgZ2V0TGlzdE5leHRRdWVzdGlvbm5haXJlczogXCIvZ2V0bGlzdG5leHRxdWVzdGlvbm5haXJlcy9cIixcbiAgICAvLyAtLSBxdWVzdGlvbnMgJiBjaG9pY2VzIDpcbiAgICBxdWVzdGlvbnNSb3V0ZTogXCIvcXVlc3Rpb24vXCIsXG4gICAgLy8gLS0gdGFncyA6XG4gICAgdGFnc1NlYXJjaFJvdXRlOiBcIi90YWdzL3NlYXJjaC9cIixcbiAgICAvLyAtLSBhbnN3ZXJzIDpcbiAgICBnZXRRdWVzdGlvbm5haXJlc1dpdGhvdXRBbnN3ZXI6IFwiL3dpdGhvdXRhbnN3ZXIvdXNlci9cIixcbiAgICBnZXRQcmV2aW91c0Fuc3dlcnM6IFwiL3VzZXIvYW5zd2Vycy9cIixcbiAgICBnZXRTdGF0c0Fuc3dlcnMgOiBcIi91c2VyL2Fud3N3ZXJzL3N0YXRzL1wiLFxuICAgIGdldEFkbWluU3RhdHM6IFwiL2dldGFkbWluc3RhdHMvXCIsXG4gICAgLy8gZm9ybXMgOiDDoCBjb21wbMOpdGVyIGF2ZWMgdmFsZXVycyBwYXIgZMOpZmF1dCwgZXRjLiBjZiBtb2TDqGxlXG4gICAgUXVlc3Rpb25uYWlyZSA6XG4gICAge1xuICAgICAgICB0aXRsZTogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgc2x1ZzogeyBtYXhsZW5ndGg6IDE1MCB9LCAvLyBjaGFtcCByZXF1aXMgbWFpcyBjYWxjdWzDqSDDoCBwYXJ0aXIgZHUgdGl0cmUgcWQgdmlkZVxuICAgICAgICBpbnRyb2R1Y3Rpb246IHsgcmVxdWlyZWQ6IHRydWUgfVxuICAgIH0sXG4gICAgc2VhcmNoUXVlc3Rpb25uYWlyZXMgOiB7IG1pbmxlbmd0aDogMywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBRdWVzdGlvbiA6XG4gICAge1xuICAgICAgICB0ZXh0OiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICByYW5rOiB7IHJlcXVpcmVkOiB0cnVlLCBtaW46MSwgZGVmYXVsdFZhbHVlOjEgfVxuICAgIH0sICAgICAgICAgIFxuICAgIENob2ljZSA6XG4gICAge1xuICAgICAgICB0ZXh0OiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9XG4gICAgfSwgICAgICAgICAgXG4gICAgbmJRdWVzdGlvbnNNaW46IDEsXG4gICAgbmJRdWVzdGlvbnNNYXg6IDEwLFxuICAgIG5iQ2hvaWNlc01heDogMTAsXG4gICAgbmJUYWdzTWluOiAwLFxuICAgIG5iVGFnc01heDogMCwgLy8gMCA9IG5vdCBtYXggICAgXG4gICAgLy8gSlNPTiBhbmQgSFRNTCBkaXJcbiAgICBkaXJDYWNoZVF1ZXN0aW9ubmFpcmVzIDogXCJkYXRhcy9xdWVzdGlvbm5haXJlc1wiLFxuICAgIGRpckNhY2hlUXVlc3Rpb25zIDogXCJkYXRhcy9xdWVzdGlvbm5haXJlcy9xdWVzdGlvbnNcIixcbiAgICBkaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXMgOiBcImRhdGFzL3VzZXJzL3F1ZXN0aW9ubmFpcmVzXCIsXG4gICAgZGlyQ2FjaGVUYWdzIDogXCJkYXRhcy9xdWVzdGlvbm5haXJlcy90YWdzXCIsICBcbiAgICBkaXJIVE1MUXVlc3Rpb25uYWlyZSA6IFwiZnJvbnQvcHVibGljL3F1aXpcIixcbiAgICBkaXJIVE1MVGFncyA6IFwiZnJvbnQvcHVibGljL3F1aXpzXCIsXG4gICAgZGlyV2ViUXVlc3Rpb25uYWlyZSA6IFwicXVpelwiLC8vcG91ciB1cmwgcGFnZVxuICAgIGRpcldlYlRhZ3MgOiBcInF1aXpzXCIvLyBpZGVtXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICAvLyBBUEkncm91dGVzIChhZnRlciBcImFwaVVybFwiIGRlZmluZWQgaW4gaW5zdGFuY2UuanMpXG4gICAgdXNlclJvdXRlczogXCIvdXNlclwiLFxuICAgIHN1YnNjcmliZVJvdXRlOiBcIi9zaWdudXBcIixcbiAgICBnZXRHb2RmYXRoZXJSb3V0ZTogXCIvZ2V0Z29kZmF0aGVyaWRcIixcbiAgICBjaGVja0lmSXNFbWFpbGZyZWVSb3V0ZTogXCIvaXNlbWFpbGZyZWVcIixcbiAgICBjaGVja1N1YnNjcmliZVRva2VuUm91dGU6IFwiL3ZhbGlkYXRpb24vXCIsXG4gICAgY2hlY2tMb2dpblJvdXRlOiBcIi9jaGVja2xvZ2luL1wiLFxuICAgIGNvbm5lY3Rpb25Sb3V0ZTogXCIvbG9naW5cIixcbiAgICBnZXRMb2dpbkxpbmtSb3V0ZTogXCIvZ2V0bG9naW5saW5rXCIsXG4gICAgY29ubmVjdGlvbldpdGhMaW5rUm91dGU6IFwiL2NoZWNrbG9naW5saW5rXCIsXG4gICAgZ2V0VXNlckluZm9zOiBcIi9nZXQvXCIsXG4gICAgY3JlYXRlVXNlclJvdXRlOiBcIi9jcmVhdGVcIixcbiAgICB2YWxpZGF0ZVVzZXJSb3V0ZTogXCIvdmFsaWRhdGUvXCIsXG4gICAgdXBkYXRlVXNlckluZm9zOiBcIi9tb2RpZnkvXCIsXG4gICAgc2VhcmNoVXNlclJvdXRlOiBcIi9zZWFyY2gvXCIsXG4gICAgZ2V0R29kQ2hpbGRzOiBcIi9nZXRnb2RjaGlsZHMvXCIsXG4gICAgY2hlY2tOZXdMb2dpbkxpbmtSb3V0ZTogXCIvY29uZmlybW5ld2xvZ2luL1wiLFxuICAgIGNoZWNrRGVsZXRlTGlua1JvdXRlOiBcIi9jb25maXJtZGVsZXRlL1wiLFxuICAgIGdldFBheW1lbnRzOiBcIi9wYXltZW50L2dldGZvcm9uZXVzZXIvXCIsXG4gICAgdW5zdWJzY3JpYmVSb3V0ZTogXCIvc3Vic2NyaXB0aW9uL3N0b3AvXCIsXG4gICAgZ2V0QWRtaW5TdGF0czogXCIvZ2V0YWRtaW5zdGF0cy9cIixcbiAgICAvLyBmb3JtcyA6IMOgIGNvbXBsw6l0ZXIgYXZlYyB2YWxldXJzIHBhciBkw6lmYXV0LCBldGMuIGNmIG1vZMOobGVcbiAgICBuYW1lOiB7IG1heGxlbmd0aDogNzAsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZW1haWw6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgcGFzc3dvcmQ6IHsgbWlubGVuZ3RoOiA4LCBtYXhsZW5ndGg6NzIsIHJlcXVpcmVkOiB0cnVlIH0sIC8vIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2JjcnlwdCNzZWN1cml0eS1pc3N1ZXMtYW5kLWNvbmNlcm5zXG4gICAgbmV3UGFzc3dvcmQ6IHsgbWlubGVuZ3RoOiA4LCBtYXhsZW5ndGg6NzIgfSxcbiAgICBjb2RlR29kZmF0aGVyOiB7IG1heGxlbmd0aDogMjU1IH0sXG4gICAgY2d1T2s6IHsgdmFsdWU6IFwidHJ1ZVwiLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHRpbWVEaWZmZXJlbmNlTWluOiAtNzIwLFxuICAgIHRpbWVEaWZmZXJlbmNlTWF4Ojg0MCxcbiAgICAvLyBKU09OIGRpclxuICAgIGRpckNhY2hlVXNlcnMgOiBcImRhdGFzL3VzZXJzXCIsXG4gICAgZGlyQ2FjaGVVc2Vyc0Fuc3dlcnMgOiBcImRhdGFzL3VzZXJzL3F1ZXN0aW9ubmFpcmVzL2Fuc3dlcnNcIlxufTtcbiIsInZhciBtYXAgPSB7XG5cdFwiLi9mci9nZW5lcmFsXCI6IFwiLi4vbGFuZy9mci9nZW5lcmFsLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvZ2VuZXJhbCRcIjsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZnIvc3Vic2NyaXB0aW9uXCI6IFwiLi4vbGFuZy9mci9zdWJzY3JpcHRpb24uanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9zdWJzY3JpcHRpb24kXCI7IiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL3VzZXJcIjogXCIuLi9sYW5nL2ZyL3VzZXIuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC91c2VyJFwiOyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBzaXRlSFRNTFRpdGxlIDogXCJXaWtpTGVybmkgOiBxdSdhbGxlei12b3VzIGFwcHJlbmRyZSBhdWpvdXJkJ2h1aSA/XCIsXG4gICAgc2l0ZU1ldGFEZXNjcmlwdGlvbiA6IFwiQ2hhcXVlIGpvdXIsIHRlc3RleiB2b3MgY29ubmFpc3NhbmNlcyBldCBhcHByZW5leiBkZSBub3V2ZWxsZXMgY2hvc2VzIGF2ZWMgV2lraUxlcm5pLlwiLFxuICAgIHNjcmlwdFRpbWluZ0luZm8gOiBcIkR1csOpZSBkZSBsYSByw6lwb25zZSA6IFNDUklQVF9USU1JTkcgbWlsbGlzZWNvbmRlcywgcm91dGUgOiBTQ1JJUFRfVVJMXCIsXG4gICAgc2NyaXB0VGltaW5nQWxlcnQgOiBcIioqKiBTY3JpcHQgbGVudCA6IFNDUklQVF9USU1JTkcgbWlsbGlzZWNvbmRlcywgcm91dGUgOiBTQ1JJUFRfVVJMXCIsXG4gICAgc2VydmVyRXJyb3IgOiBcIkTDqXNvbMOpLiBVbmUgZXJyZXVyIGltcHLDqXZ1ZSBlc3Qgc3VydmVudWUuIFNpIGNlbGEgcGVyc2lzdGUsIG4naMOpc2l0ZXogw6AgcHLDqXZlbmlyIGwnYWRtaW5pc3RyYXRldXIgZHUgc2l0ZS5cIixcbiAgICBzZXJ2ZXJFcnJvckFkbWluIDogXCJCdWcgZGUgbCdhcHBsaWNhdGlvbiA6XCIsXG4gICAgbmVlZGVkUGFyYW1zIDogXCJEZXMgcGFyYW3DqHRyZXMgbsOpY2Vzc2FpcmVzIG1hbnF1YW50cyBzb250IG1hbnF1YW50cy5cIixcbiAgICBiYWRVcmwgOiBcIlRlbnRhdGl2ZSBkJ2FjY8OocyDDoCB1bmUgcGFnZSBuJ2V4aXN0YW50IHBhcyA6XCIsXG4gICAgbm90VmFsaWRGb3JtYXQgOiBcIkZvcm1hdCBub24gdmFsaWRlLlwiLFxuICAgIG5vdEFsbG93ZWQgOiBcIlZvdXMgbidhdmV6IHBhcyBsZXMgZHJvaXRzIG7DqWNlc3NhaXJlcyBwb3VyIGNldHRlIGFjdGlvbi5cIixcbiAgICBub3RSZXF1aXJlZCA6IFwiRmFjdWx0YXRpZi5cIixcbiAgICB1cGRhdGVCdG5UeHQ6IFwiTW9kaWZpZXJcIixcbiAgICBhZGRCdG5UeHQ6IFwiQWpvdXRlclwiLFxuICAgIGRlbGV0ZUJ0blR4dDogXCJTdXBwcmltZXJcIixcbiAgICBhZGRPa01lc3NhZ2UgOiBcIkxlcyBkb25uw6llcyBvbnQgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWVzLlwiLFxuICAgIHVwZGF0ZU9rTWVzc2FnZSA6IFwiTGEgbWlzZSDDoCBqb3VyIMOgIGpvdXIgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS5cIixcbiAgICBkZWxldGVPa01lc3NhZ2UgOiBcIkxhIHN1cHByZXNzaW9uIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgZmFpbEF1dGggOiBcIkVycmV1ciBkJ2F1dGhlbnRpZmljYXRpb24uXCIsXG4gICAgZmFpbEF1dGhIZWFkZXIgOiBcIkFic2VuY2UgZGUgaGVhZGVyIEF1dGhvcml6YXRpb24uXCIsXG4gICAgZmFpbEF1dGhUb2tlbiA6IFwiVG9rZW4gaW52YWxpZGUgb3UgdXRpbGlzYXRldXIgbm9uIHRyb3V2w6kuXCIsXG4gICAgZmFpbEF1dGhJZCA6IFwiSWRlbnRpZmlhbnQgbm9uIHZhbGlkZSA6IFwiLFxuICAgIGZhaWxBdXRoQ3JvbiA6IFwiVGVudGF0aXZlIGRlIGxhbmNlbWVudCBkJ3VuIGNyb24gc2FucyBsZSBib24gdG9rZW4uXCIsXG4gICAgcHJldmlvdXNQYWdlIDogXCJQYWdlIHByw6ljw6lkZW50ZVwiLFxuICAgIG5leHRQYWdlIDogXCJQYWdlIHN1aXZhbnRlXCIsXG4gICAgYnRuTGlua1RvUXVlc3Rpb25uYWlyZSA6IFwiQWxsZXIgYXUgcXVpeiAhXCIsXG4gICAgc3RhdHNBZG1pbiA6IFwiRHVyYW50IGxlcyBkZXJuacOocmVzIDI0aCA6IE5CX1VTRVJTXzI0SCBjb21wdGVzIG9udCDDqXTDqSBjcsOpw6lzLCBOQl9TVUJTQ1JJUFRJT05TXzI0SCB2YWxpZMOpcyBldCBOQl9VU0VSU19ERUxFVEVEXzI0SCBzdXBwcmltw6lzLiBOQl9BTlNXRVJTXzI0SCByw6lwb25zZXMgYXV4IHF1aXpzIG9udCDDqXTDqSBlbnJlZ2lzdHLDqWVzLjxicj5FbiB0b3V0LCBpbCB5IGEgOiBOQl9VU0VSU19UT1QgY29tcHRlcywgZG9udCBOQl9TVUJTQ1JJUFRJT05TX1RPVCB2YWxpZMOpcyBldCBOQl9TVUJTQ1JJUFRJT05TX1BSRU1JVU0gY29tcHRlcyBwcsOpbWl1bS4gTkJfQU5TV0VSU19UT1QgcsOpcG9uc2VzIGF1eCBxdWl6cyBvbnQgw6l0w6kgZW5yZWdpc3Ryw6llcy48YnI+UGFybWkgbGVzIE5CX1VTRVJTX0RFTEVURURfVE9UIGNvbXB0ZXMgc3VwcHJpbcOpcywgTkJfVVNFUlNfREVMRVRFRF9WQUxJREVEIGF2YWllbnQgdmFsaWTDqSBsZXVyIGNvbXB0ZSBldCBOQl9VU0VSU19ERUxFVEVEX1BSRU1JVU0gYXZhaWVudCBzb3VzY3JpdCB1biBjb21wdGUgcHLDqW1pdW0uXCJcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIG5lZWROdW1iZXJPZkRheXMgOiBcIklsIGZhdXQgdW4gbm9tYnJlIGRlIGpvdXJzIHBvdXIgbCdhYm9ubmVtZW50LlwiLFxuICAgIG5lZWRJbnRlZ2VyTnVtYmVyT2ZEYXlzIDogXCJMZSBub21icmUgZGUgam91cnMgZGUgbCdhYm9ubmVtZW50IGRvaXQgw6p0cmUgdW4gbm9tYnJlIGVudGllci5cIixcbiAgICBuZWVkTWluTnVtYmVyT2ZEYXlzIDogXCJMZSBub21icmUgZGUgam91cnMgZGUgbCdhYm9ubmVtZW50IG5lIHBldXQgw6p0cmUgbsOpZ2F0aWYgIVwiLFxuICAgIG5lZWROb3RUb29Mb25nRGF5c0xpc3QgOiBcIkxhIGxpc3RlIGRlIGpvdXJzIHPDqWxlY3Rpb25uw6lzIG4nYSBwYXMgbGUgYm9uIGZvcm1hdCAodHJvcCBsb25ndWUpLlwiLFxuICAgIG5lZWRWYWxpZERheXNMaXN0IDogXCJMYSBsaXN0ZSBkZSBqb3VycyBzw6lsZWN0aW9ubsOpcyBuJ2EgcGFzIGxlIGJvbiBmb3JtYXQuIENhcmFjdMOocmUgbm9uIHZhbGlkZSA6IFwiLFxuICAgIG5lZWRVbmlxdWVEYXlzTGlzdCA6IFwiTGEgbGlzdGUgZGUgam91cnMgc8OpbGVjdGlvbm7DqXMgbidhIHBhcyBsZSBib24gZm9ybWF0LiBEb3VibG9uIDogXCIsXG4gICAgbmVlZEtub3dJZk5vdGljZU9rIDogXCJJbCBtYW5xdWUgbCdpbmZvcm1hdGlvbiBzdXIgbCdhY2NlcHRhdGlvbiBvdSBub24gZGUgcmVjZXZvaXIgZGVzIG5vdGlmaWNhdGlvbnMuXCIsXG4gICAgdW5zdWJzY3JpcHRpb25PayA6IFwiVm90cmUgZGVtYW5kZSBhIGJpZW4gw6l0w6kgcHJpc2UgZW4gY29tcHRlLiBWb3VzIG5lIHJlY2V2cmV6IHBsdXMgZGUgbWVzc2FnZXMgdmVuYW50IGR1IHNpdGUsIHNhdWYgcG91ciB2b3VzIHNpZ25hbGVyIGxhIGZpbiBkZSB2b3RyZSBhYm9ubmVtZW50Ljxicj5OJ2jDqXNpdGV6IHBhcyA8YSBocmVmPScvI1VSTCc+w6AgYWNjw6lkZXIgw6Agdm90cmUgY29tcHRlPC9hPiBwb3VyIGRlIG5vdXZlYXUgYXV0b3Jpc2VyIGNlcnRhaW5zIGVudm9pcy5cIixcbiAgICB1bnN1YnNjcmlwdGlvbkZhaWwgOiBcIlNpIHZvdXMgdm95ZXogY2UgbWVzc2FnZSwgYydlc3QgcXVlIHZvdHJlIGxpZW4gZGUgZMOpc2Fib25uZW1lbnQgbmUgZm9uY3Rpb25uZSBwYXMuPGJyPlZvdXMgcG91dmV6IDxhIGhyZWY9Jy8jVVJMJz5hY2PDqWRlciDDoCB2b3RyZSBjb21wdGU8L2E+IHBvdXIgZMOpc2FjdGl2ZXIgbGVzIGVudm9pcyBtYW51ZWxsZW1lbnQuXCIsXG4gICAgYWxsU3Vic2NyaXB0aW9uUHJvY2Vzc2VkIDogXCJUb3VzIGxlcyBhYm9ubsOpcyBvbnQgw6l0w6kgdHJhaXTDqXMgcG91ciBsZSBtb21lbnQuXCIsXG4gICAgbWFpbE5ld1F1ZXN0aW9ubmFpcmVTdWJqZWN0IDogXCJRdSdhbGxlei12b3VzIGFwcHJlbmRyZSBhdWpvdXJkJ2h1aSA/XCIsXG4gICAgbWFpbE5ld1F1ZXN0aW9ubmFpcmVCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5cXG5VbiBub3V2ZWF1IHF1aXogdmllbnQgZGUgdm91cyDDqnRyZSBwcm9wb3PDqSA6XFxuUVVFU1RJT05OQUlSRV9VUkxcXG5cXG5Cb25uZSBsZWN0dXJlICFcXG5cXG5TdG9wcGVyIGxlcyBlbnZvaXMgP1xcblVOU1VCU0NSSUJFX1VSTFwiLFxuICAgIG1haWxOZXdRdWVzdGlvbm5haXJlQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPk1BSUxfSU5UUk9EVUNUSU9OPHVsPjxsaT48YSBocmVmPVxcXCJMSU5LX1VSTFxcXCIgdGl0bGU9XFxcIkxJTktfVElUTEVcXFwiPkxpcmUgbCdhcnRpY2xlLjwvYT48L2xpPjxsaT48YSBocmVmPVxcXCJRVUVTVElPTk5BSVJFX1VSTFxcXCI+QWxsZXogYXUgcXVpei48L2E+PC9saT48L3VsPjxwPjxhIGhyZWY9XFxcIlVOU1VCU0NSSUJFX1VSTFxcXCI+U3RvcHBlciBsZXMgZW52b2lzLjwvYT48L3A+XCIsXG4gICAgbm9OZXdRdWVzdGlvbm5haXJlRm9yVXNlciA6IFwiQXVjdW4gbm91dmVhdSBxdWVzdGlvbm5haXJlIHRyb3V2w6kgcG91ciB1biBhYm9ubsOpIDogXCIsXG4gICAgbWFpbEVuZEZyZWVUaW1lU3ViamVjdDogXCJWb3RyZSBhYm9ubmVtZW50IGdyYXR1aXQgdmEgZXhwaXJlclwiLFxuICAgIG1haWxFbmRGcmVlVGltZUJvZHlUeHQ6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuVm90cmUgYWJvbm5lbWVudCBncmF0dWl0IMOgIFNJVEVfTkFNRSB2YSBleHBpcmVyIGQnaWNpIHF1ZWxxdWVzIGpvdXJzLlxcblBvdXIgY29udGludWVyIMOgIHV0aWxpc2VyIGxlIHNpdGUsIHZvdXMgcG91dmV6IHNvdXNjcmlyZSDDoCB1biBhYm9ubmVtZW50IGTDqHMgYXVqb3VyZCdodWkgOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbEVuZEZyZWVUaW1lQm9keUhUTUw6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+Vm90cmUgYWJvbm5lbWVudCBncmF0dWl0IMOgIFNJVEVfTkFNRSB2YSBleHBpcmVyIGQnaWNpIHF1ZWxxdWVzIGpvdXJzLiBQb3VyIGNvbnRpbnVlciDDoCB1dGlsaXNlciBsZSBzaXRlLCB2b3VzIHBvdXZleiBzb3VzY3JpcmUgw6AgdW4gYWJvbm5lbWVudCBkw6hzIGF1am91cmQnaHVpIGVuIDxhIGhyZWY9XFxcIkxJTktfVVJMXFxcIj5jbGlxdWV6IGljaTwvYT4gc2FucyB0YXJkZXIuPC9wPlwiLFxuICAgIG1haWxFbmRGcmVlVGltZU1lc3NhZ2U6IFwiIHJlbGFuY2VzIGVudm95w6llcy5cIixcbiAgICBtYWlsRXhwaXJhdGlvblN1YmplY3Q6IFwiVm90cmUgYWJvbm5lbWVudCB2YSBiaWVudMO0dCBleHBpcmVyXCIsXG4gICAgbWFpbEV4cGlyYXRpb25Cb2R5VHh0OiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblZvdHJlIGFib25uZW1lbnQgZ3JhdHVpdCDDoCBTSVRFX05BTUUgdmEgZXhwaXJlciBkJ2ljaSBxdWVscXVlcyBqb3Vycy5cXG5Qb3VyIGNvbnRpbnVlciDDoCB1dGlsaXNlciBsZSBzaXRlLCB2b3VzIHBvdXZleiBsZSBwcm9sb25nZXIgZMOocyBhdWpvdXJkJ2h1aSA6XFxuTElOS19VUkxcIixcbiAgICBtYWlsRXhwaXJhdGlvbkJvZHlIVE1MOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlZvdHJlIGFib25uZW1lbnQgw6AgU0lURV9OQU1FIHZhIGV4cGlyZXIgZCdpY2kgcXVlbHF1ZXMgam91cnMuPGJyPlBvdXIgY29udGludWVyIMOgIHV0aWxpc2VyIGxlIHNpdGUsIHZvdXMgcG91dmV6IGxlIHByb2xvbmdlciBkw6hzIGF1am91cmQnaHVpIGVuIDxhIGhyZWY9XFxcIkxJTktfVVJMXFxcIj5jbGlxdWFudCBpY2k8L2E+LjwvcD5cIixcbiAgICBtYWlsRXhwaXJhdGlvbk1lc3NhZ2U6IFwiRklSU1QgcHJlbWnDqHJlcyBldCBTRUNPTkQgZGV1eGnDqG1lcyByZWxhbmNlcyBlbnZvecOpZXMgcG91ciBkZXMgYWJvbm5lbWVudHMgZXhwaXJhbnQgZCdpY2kgcGV1LlwiLFxuICAgIGluZm9zTmJEYXlzOiBcIlZvdHJlIGFib25uZW1lbnQgZXN0IGVuY29yZSB2YWxhYmxlIDxiPnBlbmRhbnQgTkJfREFZUyBqb3VyczwvYj4uPGJyPlZvdXMgcG91dmV6IMOgIHRvdXQgbW9tZW50IHByb2xvbmdlciB2b3RyZSBhYm9ubmVtZW50IGVuIHN1aXZhbnQgbGVzIGluZGljYXRpb25zIGNpLWRlc3NvdXMgOlwiLFxuICAgIGluZm9zRXhwaXJhdGVkOiBcIlZvdHJlIGFib25uZW1lbnQgYSBleHBpcsOpLCBtYWlzIGlsIHZvdXMgcmVzdGUgZW5jb3JlIHF1ZWxxdWVzIGpvdXJzIGF2YW50IHF1ZSB2b3RyZSBjb21wdGUgZXQgdm9zIGRvbm7DqWVzIG5lIHNvaWVudCBjb21wbMOodGVtZW50IHN1cHByaW3DqWVzLjxicj5Qb3VyIGNlIGZhaXJlLCBzdWl2ZXogc2FucyB0YXJkZXIgbGVzIGluZGljYXRpb25zIGNpLWRlc3NvdXMgOlwiLFxuICAgIGluZm9zTmJEYXlzQWRtaW46IFwiQ2V0IGFib25uZW1lbnQgZXN0IGVuY29yZSB2YWxhYmxlIDxiPnBlbmRhbnQgTkJfREFZUyBqb3VyczwvYj4uXCIsXG4gICAgaW5mb3NFeHBpcmF0ZWRBZG1pbjogXCJDZXQgYWJvbm5lbWVudCBhIGV4cGlyw6kuXCIsICBcbiAgICBpc05vdFZhbGlkZWQgOiBcIkNldCB1dGlsaXNhdGV1ciBuJ2EgcGFzIGVuY29yZSB2YWxpZMOpIHNvbiBjb21wdGUuPGJyPlZvdXMgcG91dmV6IGxlIGZhaXJlIMOgIHNhIHBsYWNlIDxhIGhyZWY9JyN2YWxpZGF0aW9uT2snPmVuIGNvY2hhbnQgbGEgY2FzZSBpbmRpcXXDqWU8L2E+IGV0IGVucmVnaXN0cmFudC5cIixcbiAgICBpbmZvc1BheW1lbnRzQWRtaW4gOiBcIkRBVEVfUEFZTUVOVCA6IHBhaWVtZW50IGRlIEFNT1VOVCDigqwgYXUgbm9tIGRlIENMSUVOVF9OQU1FLlwiLFxufTtcbiIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBub3RGb3VuZDogXCJMJ3V0aWxpc2F0ZXVyIG4nYSBwYXMgw6l0w6kgdHJvdXbDqS5cIixcbiAgICBuZWVkTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyLlwiLFxuICAgIG5lZWROb3RUb29Mb25nTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyIG5lIGNvbXB0YW50IHBhcyBwbHVzIGRlIDcwIGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRFbWFpbDogXCJNZXJjaSBkZSBzYWlzaXIgdm90cmUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgbmVlZFVuaXF1ZUVtYWlsOiBcIkwnYWRyZXNzZSBlLW1haWwgcXVlIHZvdXMgYXZleiBzYWlzaWUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcGFyIHVuIGF1dHJlIHV0aWxpc2F0ZXVyLiBTaSB2b3VzIGF2ZXogZMOpasOgIHVuIGNvbXB0ZSwgPGEgaHJlZj0nLyNVUkwnPmNsaXF1ZXotaWNpIHBvdXIgdm91cyBjb25uZWN0ZXI8L2E+LlwiLFxuICAgIG5lZWROb3RUb29Mb25nRW1haWw6IFwiTWVyY2kgZGUgc2Fpc2lyIHVuZSBhZHJlc3NlIGUtbWFpbCBuZSBjb21wdGFudCBwYXMgcGx1cyBkZSAyNTUgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZFBhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZS5cIixcbiAgICBuZWVkTG9uZ1Bhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZSBkJ2F1IG1vaW5zIE1JTl9MRU5HVEggY2FyYWN0w6hyZXMuXCIsXG4gICAgcGFzc3dvcmRDb3BpZWQ6IFwiTGUgbW90IGRlIHBhc3NlIGfDqW7DqXLDqSBhIMOpdMOpIGNvcGnDqSBkYW5zIGxlIHByZXNzZS1wYXBpZXIuIFZvdXMgcG91dmV6IGxlIHJlY29waWVyIG/DuSB2b3VzIGxlIHNvdWhhaXRlci5cIixcbiAgICBuZWVkU3RhdHVzIDogXCJJbCBtYW5xdWUgbGUgc3RhdHV0LlwiLFxuICAgIG5lZWRMYW5ndWFnZSA6IFwiSWwgbWFucXVlIGxlIGNvZGUgbGFuZ3VlLlwiLFxuICAgIG5lZWRWYWxpZExhc3RDb25uZWN0aW9uRGF0ZSA6IFwiTGEgZGF0ZSBkZSBkZXJuacOocmUgY29ubmV4aW9uIG4nZXN0IHBhcyB2YWxpZGUuXCIsXG4gICAgbmVlZFNNVFAgOiBcIklsIG1hbnF1ZSBsZSBzZXJ2ZXVyIFNNVFAuXCIsXG4gICAgbmVlZFNNVFBOb3RGb3VuZCA6IFwiSWwgbWFucXVlIGxlIHNlcnZldXIgU01UUC5cIixcbiAgICBuZWVkS25vd05ld3NsZXR0ZXJPayA6IFwiSWwgZmF1dCBzYXZvaXIgc2kgbCd1dGlsaXNhdGV1ciBhY2NlcHRlIG91IHJlZnVzZSBkZSByZWNldm9pciBsYSBuZXdzbGV0dGVyLlwiLFxuICAgIG5lZWRUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBjb25uYcOudHJlIGxlIG5vbWJyZSBkZSBtaW51dGVzIGR1IGTDqWNhbGFnZSBob3JhaXJlLlwiLFxuICAgIG5lZWRNaW5UaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGVubGV2ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgNzIwLlwiLFxuICAgIG5lZWRNYXhUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGFqb3V0ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgODQwLlwiLFxuICAgIG5lZWRVR0NPayA6IFwiVm91cyBkZXZleiBhY2NlcHRlciBsZXMgQ0dVIHBvdXIgcG91dm9pciBjcsOpZXIgdm90cmUgY29tcHRlLiBcIixcbiAgICBnb2RmYXRoZXJOb3RGb3VuZDogXCJBdWN1biB1dGlsaXNhdGV1ciB2YWxpZGUgdHJvdXbDqSBwb3VyIGNlIGNvZGUgcGFycmFpbi5cIixcbiAgICBnb2RmYXRoZXJGb3VuZDogXCJWb3RyZSBwYXJyYWluIGEgYmllbiDDqXTDqSB0cm91dsOpICFcIixcbiAgICBtYWlsVmFsaWRhdGlvbk1lc3NhZ2U6IFwiVm90cmUgaW5zY3JpcHRpb24gZXN0IGJpZW4gZW5yZWdpc3Ryw6llLlxcblBvdXIgbGEgZmluYWxpc2VyLCBtZXJjaSBkZSBjbGlxdWVyIGRhbnMgbGVzIDI0SCBzdXIgbGUgbGllbiBkZSBjb25maXJtYXRpb24gcXVpIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBwYXIgZS1tYWlsLlwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1N1YmplY3QgOiBcIk1lcmNpIGRlIHZhbGlkZXIgdm90cmUgY29tcHRlXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblBvdXIgdmFsaWRlciB2b3RyZSBjb21wdGUsIG1lcmNpIGRlIGNsaXF1ZXIgc3VyIGxlIGxpZW4gc3VpdmFudCBkYW5zIGxlcyAyNGggOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm90cmUgY29tcHRlLCBtZXJjaSBkZSBjbGlxdWVyIHN1ciBsZSBsaWVuIHN1aXZhbnQgZGFucyBsZXMgMjRoLjwvcD48cD48YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+VmFsaWRlci48L2E+PC9wPlwiLFxuICAgIHZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGNvbXB0ZSB2aWVudCBiaWVuIGQnw6p0cmUgdmFsaWTDqS4gTWVyY2kgZXQgYmllbnZlbnVlICE8YnI+Vm91cyBwb3V2ZXogc2FucyB0YXJkZXIgdm91cyBjb25uZWN0ZXIgY2ktZGVzc291cyBwb3VyIGFjY8OpZGVyIMOgIHZvdHJlIGNvbXB0ZS5cIixcbiAgICB2YWxpZGF0aW9uTWVzc2FnZUFkbWluOiBcIkxlIGNvbXB0ZSBhIGJpZW4gw6l0w6kgdmFsaWTDqS5cIixcbiAgICB2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2U6IFwiSWwgc2VtYmxlIHF1ZSB2b3VzIGF5ZXogZMOpasOgIHZhbGlkw6kgdm90cmUgY29tcHRlLlwiLFxuICAgIHZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZUFkbWluOiBcIkNlIGNvbXB0ZSBhIGTDqWrDoCDDqXTDqSB2YWxpZMOpLlwiLFxuICAgIG1haWxXZWxjb21lU3ViamVjdCA6IFwiQmllbnZlbnVlICFcIixcbiAgICBtYWlsV2VsY29tZUJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblZvdHJlIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuXFxuTWVyY2kgZXQgw6AgYmllbnTDtHQgIVwiLFxuICAgIG1haWxXZWxjb21lQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlZvdHJlIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuPC9wPjxwPk1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyU3ViamVjdCA6IFwiTWVyY2kgIVwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlckJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcbkdyw6JjZSDDoCB2b3VzIHVuIG5vdXZlbCB1dGlsaXNhdGV1ciAoRU1BSUwpIHZpZW50IGRlIHMnaW5zY3JpcmUgc3VyIE5PTV9TSVRFLlxcbk1lcmNpIGV0IMOgIGJpZW50w7R0ICFcIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+R3LDomNlIMOgIHZvdXMgdW4gbm91dmVsIHV0aWxpc2F0ZXVyIChFTUFJTCkgdmllbnQgZGUgcydpbnNjcmlyZSBzdXIgTk9NX1NJVEUuPC9wPjxwPk1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGxpZW4gZGUgY29uZmlybWF0aW9uIG5lIHNlbWJsZSBwYXMgdmFsaWRlIG91IGJpZW4gaWwgYSBleHBpcsOpLiBWb3VzIHBvdXZleiBlbiByZWNldm9pciB1biBub3V2ZWF1IDxhIGhyZWY9JyNVUkwnPmVuIGNsaXF1YW50IGljaTwvYT4uXCIsXG4gICAgZW1haWxOb3RGb3VuZDogXCJBdWN1biB1dGlsaXNhdGV1ciB0cm91dsOpIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgYWxyZWFkeUNvbm5lY3RlZDogXCJWb3VzIMOqdGVzIGTDqWrDoCBjb25uZWN0w6koZSkgYXUgc2l0ZSAhXCIsXG4gICAgbmVlZEJlQ29ubmVjdGVkOiBcIlZvdXMgZGV2ZXogw6p0cmUgY29ubmVjdMOpKGUpIHBvdXIgYWNjw6lkZXIgw6AgY2V0dGUgcGFnZS5cIixcbiAgICBjb25uZWN0aW9uT2s6IFwiQ29ubmV4aW9uIHLDqXVzc2llLlwiLFxuICAgIG5lZWRDaG9vc2VMb2dpbldheTogXCJWb3VzIGRldmV6IHNvaXQgc2Fpc2lyIHZvdHJlIG1vdCBkZSBwYXNzZSwgc29pdCBjb2NoZXIgbGEgY2FzZSB2b3VzIHBlcm1ldHRhbnQgZGUgcmVjZXZvaXIgdW4gbGllbiBkZSBjb25uZXhpb24gcGFyIGUtbWFpbC5cIixcbiAgICBuZWVkVmFsaWRhdGlvblRvTG9naW4gOiBcIlZvdXMgZGV2ZXogZCdhYm9yZCB2YWxpZGVyIHZvdHJlIGNvbXB0ZSBhdmFudCBkZSB2b3VzIGNvbm5lY3Rlci4gUG91ciBjZSBmYWlyZSwgdW4gbGllbiB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbC5cIixcbiAgICB0b29NYW55TG9naW5GYWlscyA6IFwiVHJvcCBkZSB0ZW50YXRpdmVzIGRlIGNvbm5leGlvbiBpbmZydWN0dWV1c2VzIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuIFZvdXMgZGV2ZXogYXR0ZW5kcmUgTUlOVVRFUyBtaW51dGVzIHBvdXIgZXNzYXllciBkZSBub3V2ZWF1LlwiLFxuICAgIGJhZFBhc3N3b3JkOiBcIkxlIG1vdCBkZSBwYXNzZSBuJ2VzdCBwYXMgbGUgYm9uLlwiLFxuICAgIG1haWxMb2dpbkxpbmtTdWJqZWN0IDogXCJWb3RyZSBsaWVuIGRlIGNvbm5leGlvbi5cIixcbiAgICBtYWlsTG9naW5MaW5rQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuUG91ciB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6IExJTktfVVJMXCIsXG4gICAgbWFpbExvZ2luTGlua0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZvdXMgY29ubmVjdGVyIMOgIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDo8L3A+PHA+PGEgaHJlZj1cXFwiTElOS19VUkxcXFwiPlZhbGlkZXIuPC9hPjwvcD5cIixcbiAgICBtYWlsTG9naW5MaW5rTWVzc2FnZSA6IFwiVW4gbGllbiBkZSBjb25uZXhpb24gdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHN1ciB2b3RyZSBhZHJlc3NlIGUtbWFpbC4gTmUgdGFyZGV6IHBhcyDDoCBsJ3V0aWxpc2VyLCBjYXIgaWwgbidlc3QgdmFsYWJsZSBxdWUgZHVyYW50IFwiLFxuICAgIHVwZGF0ZWRPa01lc3NhZ2U6IFwiVm9zIGluZm9ybWF0aW9ucyBvbnQgYmllbiDDqXTDqSBtaXNlcyDDoCBqb3VyLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEVtYWlsIDogXCJNYWlzIGxhIG5vdXZlbGxlIGFkcmVzc2UgZS1tYWlsIG4nYSBwdSDDqnRyZSBlbnJlZ2lzdHLDqWUgY2FyIGVsbGUgbidhIHBhcyB1bmUgZm9ybWF0IGNvcnJlY3QuXCIsXG4gICAgdXBkYXRlZE5lZWRVbmlxdWVFbWFpbCA6IFwiTWFpcyBsYSBub3V2ZWxsZSBhZHJlc3NlIGUtbWFpbCBzYWlzaWUgKE5FV19FTUFJTCkgbidhIHB1IMOqdHJlIGVucmVnaXN0csOpZSwgY2FyIGVsbGUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcG91ciB1biBhdXRyZSBjb21wdGUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luU3ViamVjdCA6IFwiTWVyY2kgZGUgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblBvdXIgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cyBkZSBjb25uZXhpb24sIDxhIGhyZWY9XFxcIkxJTktfVVJMXFxcIj5jbGlxdWV6IGljaTwvYT4gc2FucyB0YXJkZXIuPC9wPlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkxpbmtNZXNzYWdlOiBcIkNlcGVuZGFudCwgdm91cyBhdmV6IG1vZGlmacOpIGF1IG1vaW5zIHVuIGRlIHZvcyBpZGVudGlmaWFudHMgZGUgY29ubmV4aW9uIChlbWFpbCBldC9vdSBtb3QgZGUgcGFzc2UpIGV0IDxiPnZvdXMgZGV2ZXogY2xpcXVlciBzdXIgbGUgbGllbiBxdWkgdmllbnQgZGUgdm91cyDDqnRyZXMgZW52b3nDqSBzdXIgdm90cmUgYWRyZXNzZSAoTkVXX0VNQUlMKSBwb3VyIHZhbGlkZXIgY2UgY2hhbmdlbWVudDwvYj4uIEVuIGF0dGVuZGFudCwgbWVyY2kgZGUgY29udGludWVyIMOgIHV0aWxpc2VyIHZvcyBhbmNpZW5zIGlkZW50aWZpYW50cy5cIixcbiAgICB1cGRhdGVkTmVlZFZhbGlkYXRlZFVzZXI6IFwiTCd1dGlsaXNhdGV1ciBxdWUgdm91cyBzb3VoYWl0w6kgbW9kaWZpZXIgbidleGlzdGUgcGFzL3BsdXMgb3UgbidhIHBhcyBlbmNvcmUgdmFsaWTDqSBzb24gY29tcHRlLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEdvZGZhdGhlciA6IFwiTWFpcyBsZSBub3V2ZWF1IGNvZGUgcGFycmFpbiBuJ2EgcHUgw6p0cmUgcmV0ZW51LCBjYXIgaWwgbmUgY29ycmVzcG9uZCDDoCBhdWN1biBjb21wdGUgdXRpbGlzYXRldXIgb3Ugw6AgbCd1dGlsaXNhdGV1ciBsdWktbcOqbWUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luT2tNZXNzYWdlOiBcIkxhIG1pc2Ugw6Agam91ciBkZSB2b3MgaWRlbnRpZmlhbnRzIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgdXBkYXRlZEZhaWxlZEdvZGZhdGhlck5vdEZvdW5kIDogXCJMJ2lkZW50aWZpYW50IGZvdXJuaSBwb3VyIGxlIHBhcnJhaW4gbmUgY29ycmVzcG9uZCDDoCBhdWN1biB1dGlsaXNhdGV1ci5cIixcbiAgICBjcmVhdGlvbk9rTWVzc2FnZTogXCJMZSBub3V2ZWwgdXRpbGlzYXRldXIgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpLlwiLFxuICAgIG1haWxEZWxldGVTdWJqZWN0IDogXCJDb25maXJtZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLlwiLFxuICAgIG1haWxEZWxldGVCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5Qb3VyIHZhbGlkZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbERlbGV0ZUJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCA8YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+Y2xpcXVleiBpY2k8L2E+IHNhbnMgdGFyZGVyLjwvcD5cIixcbiAgICBtYWlsRGVsZXRlTGlua01lc3NhZ2U6IFwiVm90cmUgZGVtYW5kZSBkZSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLiBNZXJjaSBkZSBjbGlxdWVyIHNhbnMgdGFyZGVyIHN1ciBsZSBsaWVuIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbCBwb3VyIGNvbmZpcm1lci5cIixcbiAgICBkZWxldGVPa01lc3NhZ2U6IFwiTCd1dGlsaXNhdGV1ciBhIGJpZW4gw6l0w6kgc3VwcHJpbcOpLlwiLFxuICAgIGRlbGV0ZUZhaWxNZXNzYWdlOiBcIlRlbnRhdGl2ZSBkZSBzdXBwcmVzc2lvbiBkJ3VuIHV0aWxpc2F0ZXVyIGluZXhpc3RhbnQgOiBcIixcbiAgICBtYWlsRGVsZXRlTGlua09rTWVzc2FnZTogXCJWb3RyZSBjb21wdGUgYSBiaWVuIMOpdMOpIHN1cHByaW3DqS4gTWVyY2kgZCdhdm9pciB1dGlsaXPDqSBub3Mgc2VydmljZXMuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtBbHJlYWR5TWVzc2FnZTogXCJJbCBzZW1ibGUgcXVlIHZvdXMgYXlleiBkw6lqw6AgdmFsaWTDqSBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtGYWlsTWVzc2FnZTogXCJWb3RyZSBsaWVuIGRlIHN1cHByZXNzaW9uIG4nZXN0IHBhcyB2YWxpZGUgb3UgYWxvcnMgaWwgbidlc3QgcGx1cyB2YWxhYmxlLlwiLFxuICAgIGNyb25EZWxldGVVbnZhbGlkZWRVc2Vyc01lc3NhZ2U6IFwiIGNvbXB0ZXMgdXRpbGlzYXRldXJzIG5vbiB2YWxpZMOpcyBvbnQgw6l0w6kgc3VwcHJpbcOpcy5cIixcbiAgICBkZWxldGVJbmFjdGl2ZVVzZXJzTWVzc2FnZTogXCIgY29tcHRlcyB1dGlsaXNhdGV1cnMgaW5hY3RpZnMgb250IMOpdMOpIHN1cHByaW3DqXMuXCIsXG4gICAgd2VsY29tZU1lc3NhZ2U6IFwiQmllbnZlbnVlICNOQU1FICFcIixcbiAgICBieWVieWVNZXNzYWdlOiBcIlNpIHZvdXMgdm95ZXogY2UgbWVzc2FnZSwgYydlc3QgcXVlIHZvdHJlIGTDqWNvbm5leGlvbiBzJ2VzdCBiaWVuIGTDqXJvdWzDqWUuPGJyPsOAIGJpZW50w7R0ICFcIixcbiAgICBpbmZvc1VzZXJGb3JBZG1pbjogXCJDZXQgdXRpbGlzYXRldXIgKGlkOiBJRF9VU0VSKSBhIDxiPmNyw6nDqSBzb24gY29tcHRlIGxlIERBVEVfQ1JFQTwvYj4sIGxhIGRlcm5pw6hyZSBtaXNlIMOgIGpvdXIgZGF0YW50IGR1IERBVEVfVVBEQVRFLjxicj48Yj5EYXRlIGRlIHNhIGRlcm5pw6hyZSBjb25uZXhpb24gOiBEQVRFX0NPTk5FQ1RJT04uPC9iPlwiLFxuICAgIGluZm9zQWRtaW5Hb2RmYXRoZXI6IFwiQ2V0IHV0aWxpc2F0ZXVyIGEgw6l0w6kgcGFycmFpbsOpIHBhciBcIixcbiAgICBpbmZvc0FkbWluTmJHb2RDaGlsZHM6IFwiU2VzICNOQiBmaWxsZXVpbHMgOiBcIlxufTsiLCIvLyBRdWVscXVlcyBmb25jdGlvbnMgdXRpbGVzIHBvdXIgbGVzIGNoYcOubmVzXG5cbmNsYXNzIFRvb2xcbntcbiAgICBzdGF0aWMgaXNFbXB0eShteVZhcilcbiAgICB7XG4gICAgICAgIGlmKG15VmFyPT09dW5kZWZpbmVkIHx8IG15VmFyPT09bnVsbClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIG15VmFyKz1cIlwiOy8vIHNpIGF1dHJlIGNob3NlIHF1J3VuZSBjaGHDrm5lIGVudm95w6kuLi5cbiAgICAgICAgICAgIG15VmFyPW15VmFyLnRyaW0oKTtcbiAgICAgICAgICAgIGlmKG15VmFyPT09XCJcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgc3RhdGljIHRyaW1JZk5vdE51bGwobXlTdHJpbmcpXG4gICAge1xuICAgICAgICBpZihUb29sLmlzRW1wdHkobXlTdHJpbmcpKVxuICAgICAgICAgICAgbXlTdHJpbmc9bnVsbDtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVN0cmluZys9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVN0cmluZz1teVN0cmluZy50cmltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG15U3RyaW5nO1xuICAgIH1cblxuXG4gICAgc3RhdGljIHNob3J0ZW5JZkxvbmdlclRoYW4obXlTdHJpbmcsIG1heClcbiAgICB7XG4gICAgICAgIG15U3RyaW5nKz1cIlwiOy8vIGF1IGNhcyBvw7kgY2VsYSBuZSBzZXJhaXQgcGFzIHVuZSBjaGHDrm5lLi4uXG4gICAgICAgaWYobXlTdHJpbmcubGVuZ3RoID4gbWF4KVxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcuc3Vic3RyaW5nKDAsIChtYXgtMykpK1wiLi4uXCI7XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cbiAgICAvLyBzb3VyY2UgOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNTYwNDE0MC9yZXBsYWNlLW11bHRpcGxlLXN0cmluZ3Mtd2l0aC1tdWx0aXBsZS1vdGhlci1zdHJpbmdzXG4gICAgc3RhdGljIHJlcGxhY2VBbGwobXlTdHJpbmcsIG1hcE9iailcbiAgICB7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VFbHRzID0gbmV3IFJlZ0V4cChPYmplY3Qua2V5cyhtYXBPYmopLmpvaW4oXCJ8XCIpLFwiZ2lcIik7XG4gICAgICAgIHJldHVybiBteVN0cmluZy5yZXBsYWNlKHJlcGxhY2VFbHRzLCAobWF0Y2hlZCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG1hcE9ialttYXRjaGVkXTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZnIvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT2JqZXRzX2dsb2JhdXgvTWF0aC9yYW5kb21cbiAgICBzdGF0aWMgZ2V0UmFuZG9tSW50KG1pbiwgbWF4KVxuICAgIHtcbiAgICAgICAgbWluID0gTWF0aC5jZWlsKG1pbik7XG4gICAgICAgIG1heCA9IE1hdGguZmxvb3IobWF4KTtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pKSArIG1pbjtcbiAgICB9XG5cbiAgICAvLyDDoCBjb21wbMOpdGVyIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGF0ZV9mb3JtYXRfYnlfY291bnRyeVxuICAgIHN0YXRpYyBkYXRlRm9ybWF0KGRhdGVTdHJpbmcsIGxhbmc9XCJmclwiKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KGRhdGVTdHJpbmcpKVxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIGxldCBteURhdGU9bmV3IERhdGUoZGF0ZVN0cmluZyk7XG4gICAgICAgIGxldCBteURheT1teURhdGUuZ2V0RGF0ZSgpK1wiXCI7XG4gICAgICAgIGlmKG15RGF5Lmxlbmd0aD09PTEpXG4gICAgICAgICAgICBteURheT1cIjBcIitteURheTtcbiAgICAgICAgbGV0IG15TW91bnRoPShteURhdGUuZ2V0TW9udGgoKSsxKStcIlwiO1xuICAgICAgICBpZihteU1vdW50aC5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlNb3VudGg9XCIwXCIrbXlNb3VudGg7XG4gICAgICAgIGxldCBteVllYXI9bXlEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGlmKGxhbmc9PT1cImZyXCIpXG4gICAgICAgICAgICByZXR1cm4gbXlEYXkrXCIvXCIrbXlNb3VudGgrXCIvXCIrbXlZZWFyO1xuICAgICAgICBlbHNlIGlmIChsYW5nPT09XCJmb3JtXCIpLy8gMjAxNC0wMi0wOVxuICAgICAgICAgICAgcmV0dXJuIG15WWVhcitcIi1cIitteU1vdW50aCtcIi1cIitteURheTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG15TW91bnRoK1wiL1wiK215RGF5K1wiL1wiK215WWVhcjtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVG9vbDsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZGVmYXVsdC9jb25maWcvZnIuanNcIjogXCIuLi92aWV3cy9kZWZhdWx0L2NvbmZpZy9mci5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi92aWV3cyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC5qcyRcIjsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgaGVhZExpbmtzOlxuICAgIFtcbiAgICAgICAgeyBhbmNob3I6IFwiQWNjdWVpbFwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNb24gY29tcHRlXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb25uZXhpb24uaG10XCIsIGlkOiBcImFjY291bnRIZWFkTGlua1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiw4AgcHJvcG9zXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9hLXByb3Bvcy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDb250YWN0XCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb250YWN0Lmh0bWxcIiB9IH0sXG4gICAgXSxcbiAgICBmb290TGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJDcsOpZGl0c1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY3JlZGl0cy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNZW50aW9ucyBsw6lnYWxlc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvbWVudGlvbnMtbGVnYWxlcy5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiRG9ubsOpZXMgcGVyc29ubmVsbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9kb25uZWVzLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkMuRy5VLlwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY2d1Lmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDLkcuVi5cIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nndi5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICBdLFxuICAgIG1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlOiAxMCxcbiAgICB1c2VySG9tZVBhZ2UgOiBcImFjY3VlaWwuaHRtbFwiLFxuICAgIGFkbWluSG9tZVBhZ2UgOiBcImFkbWluLmh0bWxcIixcbiAgICBtYW5hZ2VySG9tZVBhZ2UgOiBcImdlc3Rpb24uaHRtbFwiLFxuICAgIHN1YnNjcmliZVBhZ2UgOiBcImluc2NyaXB0aW9uLmh0bWxcIixcbiAgICBjb25uZWN0aW9uUGFnZSA6IFwiY29ubmV4aW9uLmh0bWxcIixcbiAgICBhY2NvdW50UGFnZTogXCJjb21wdGUuaHRtbFwiLFxuICAgIHF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi1xdWl6cy5odG1sXCIsXG4gICAgdXNlcnNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXV0aWxpc2F0ZXVycy5odG1sXCIsXG4gICAgbmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSA6IDEwLFxuICAgIGlsbHVzdHJhdGlvbkRpciA6IFwiL2ltZy9xdWl6cy9cIixcbiAgICBzaXRlU2xvZ2FuOiBcIkN1bHRpdm9ucyBub3RyZSBqYXJkaW4gIVwiLFxuICAgIGhvbWVUaXRsZTE6IFwiRGUgbmF0dXJlIGN1cmlldXNlID9cIixcbiAgICBob21lUDE6IFwiQXZlYyBXaWtpTGVybmkgdm91cyBhcHByZW5leiBjaGFxdWUgam91ciBkZSBub3V2ZWxsZXMgY2hvc2VzLjxicj5EZXMgYXJ0aWNsZXMgZGUgV2lraXDDqWRpYSBzb250IHPDqWxlY3Rpb25uw6lzIHBvdXIgdm91cyBldCBzb250IHN1aXZpcyBkJ3VuIHF1aXogdm91cyBwZXJtZXR0YW50IGRlIHRlc3RlciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudS48YnI+RGUgam91ciBlbiBqb3VyIGRlIG5vdXZlbGxlcyBncmFpbmVzIGRlIHNhdm9pciBzb250IGFpbnNpIHNlbcOpZXMgZGFucyB2b3RyZSBcXFwiamFyZGluXFxcIi5cIixcbiAgICBob21lVGl0bGUyOiBcIkxhIGN1bHR1cmUgZW4gbGliZXJ0w6lcIixcbiAgICBob21lUDI6IFwiVG91dCBjb21tZSBzdXIgV2lraXDDqWRpYSAoKiksIGxlIGxvZ2ljaWVsIGV0IGxlIGNvbnRlbnUgcGFydGFnw6kgc3VyIFdpa2lMZXJuaSBzb250IGxpYnJlcy48YnI+Vm91cyBwb3V2ZXogbGVzIHV0aWxpc2VyLCBsZXMgbW9kaWZpZXIgZXQgbGVzIGRpZmZ1c2VyIHNlbG9uIHZvdHJlIHNvdWhhaXQuPGJyPlN1ciBXaWtpTGVybmksIHBhcyBkZSBwdWJsaWNpdMOpLCBuaSBkZSBjb21tZXJjaWFsaXNhdGlvbiBkZSB2b3MgZG9ubsOpZXMgcGVyc29ubmVsbGVzLjxicj5Wb3VzIHBvdXZleiB2ZW5pciB5IFxcXCJjdWx0aXZlciB2b3RyZSBqYXJkaW5cXFwiIGVuIHRvdXRlIHRyYW5xdWlsbGl0w6kuPGJyPjxicj48c21hbGw+PGVtPigqKSBCaWVuIHF1ZSBwYXJ0YWdlYW50IHNlcyB2YWxldXJzLCBXaWtpTGVybmkgZXN0IHVuIHByb2pldCBpbmTDqXBlbmRhbnQgZGUgbGEgZm9uZGF0aW9uIFdpa2lww6lkaWEuPC9lbT48L3NtYWxsPlwiLFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzVGl0bGU6IFwiTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzIHN1ciBXaWtpTGVybmlcIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc0ludHJvOiBcIkxpc3RlIGRlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyBzdXIgV2lraUxlcm5pLlwiLFxuICAgIGV4cGxhbmF0aW9uVGl0bGU6IFwiVm91cyBkw6ljb3V2cmV6IFdpa2lMZXJuaSA/XCIsXG4gICAgZXhwbGFuYXRpb25UeHQ6IFwiTGUgcHJpbmNpcGUgZXN0IHNpbXBsZSA6IHZvdXMgY29tbWVuY2V6IHBhciBsaXJlIGwnYXJ0aWNsZSBXaWtpcMOpZGlhIGRvbnQgbGUgbGllbiB2b3VzIGVzdCBwcm9wb3PDqS48YnI+UHVpcyB2b3VzIGFmZmljaGVyIGxlIHF1aXogcG91ciB2w6lyaWZpZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUgZGUgdm90cmUgbGVjdHVyZS4gVm91cyBvYnRlbmV6IGFsb3JzIHZvdHJlIHLDqXN1bHRhdCBpbW3DqWRpYXRlbWVudC48YnI+PGJyPlRvdXRlcyBsZXMgcsOpcG9uc2VzIHNlIHRyb3V2ZW50IGRhbnMgbCdhcnRpY2xlIHByb3Bvc8OpIMOgIGxhIGxlY3R1cmUuIDxiPlZvdXMgw6p0ZXMgaWNpIHBvdXIgYXBwcmVuZHJlIGRlIG5vdXZlbGxlcyBjaG9zZXM8L2I+LCBtYWlzIGxpYnJlIMOgIHZvdXMgZCdlc3NheWVyIGQneSByw6lwb25kcmUgaW1tw6lkaWF0ZW1lbnQuPGJyPjxicj5RdWFuZCBsZSBzdWpldCBzJ3kgcHLDqnRlLCBuZSB2b3VzIMOpdG9ubmV6IHBhcyBzaSBjZXJ0YWluZXMgZGVzIHLDqXBvbnNlcyBwcm9wb3PDqWVzIHBldXZlbnQgw6p0cmUgdW4gcGV1IGTDqWNhbMOpZXMsIGFic3VyZGVzLi4uIE9uIHBldXQgYXBwcmVuZHJlIGF2ZWMgbGUgc291cmlyZSwgbm9uID8gOi0pPGJyPjxicj5VbmUgZm9pcyB2b3RyZSByw6lzdWx0YXQgb2J0ZW51LCBpbCB2b3VzIHNlcmEgcHJvcG9zw6kgZGUgY3LDqWVyIHVuIGNvbXB0ZSBwb3VyIGxlIHNhdXZlZ2FyZGVyLjxicj5DZSBjb21wdGUgdm91cyBwZXJtZXR0cmEgZGUgdGVzdGVyIGRlIG5vdXZlYXUgY2UgcXVpeiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudSBwbHVzaWV1cnMgam91cnMsIHNlbWFpbmVzLCBtb2lzLi4uIEV0IGRlIHJlY2V2b2lyIHLDqWd1bGnDqHJlbWVudCBkZSBub3V2ZWxsZXMgc3VnZ2VzdGlvbnMgZGUgbGVjdHVyZXMuPGJyPjxicj5NYWlzIDxiPmxhIGNyw6lhdGlvbiBkZSBjZSBjb21wdGUgZXN0IGZhY3VsdGF0aXZlPC9iPiBldCA8YSBocmVmPScvcXVpenMvJyB0aXRsZT0nTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzJz52b3VzIHBvdXZleiBwYXJjb3VyaXIgV2lraUxlcm5pIGxpYnJlbWVudDwvYT4uXCIsXG4gICAgbm9KU05vdGlmaWNhdGlvbjogXCJEw6lzb2zDqSwgbWFpcyBwb3VyIGwnaW5zdGFudCwgbCd1dGlsaXNhdGlvbiBkZSBXaWtpTGVybmkgbsOpY2Vzc2l0ZSBsJ2FjdGl2YXRpb24gZHUgSmF2YVNjcmlwdC5cIixcbn07IiwiLy8gLS0gR0VTVElPTiBEVSBGT1JNVUxBSVJFIFBFUk1FVFRBTlQgREUgU0FJU0lSIC8gw4lESVRFUiBMRVMgSU5GT1MgREVTIFVUSUxJU0FURVVSUyBFVCBERSBMRVVSIEFCT05ORU1FTlRcblxuLy8vIFbDqXJpZmllIHF1ZSBsJ3V0aWxpc2F0ZXVyIGVzdCBiaWVuIGNvbm5lY3TDqSwgYSBsZSBib24gc3RhdHV0IGV0IGxlIHJlZGlyaWdlIHZlcnMgbGUgZm9ybXVsYWlyZSBkJ2luc2NyaXB0aW9uIHNpIGNlIG4nZXN0IHBhcyBsZSBjYXMuXG4vLy8gU2kgYydlc3Qgb2ssIHByb3Bvc2UgdW4gbW90ZXVyIGRlIHJlY2hlcmNoZSBwZXJtZXR0YW50IGRlIGNoZXJjaGVyIHVuIHV0aWxpc2F0ZXVyXG4vLy8gU2kgdW4gaWQgZXN0IHBhc3PDqSBwYXIgbCd1cmwgb24gYWZmaWNoZSBsZXMgaW5mb3JtYXRpb25zIGRlIGwndXRpbGlzYXRldXIgZGFucyB1biBmb3JtdWxhaXJlIHBlcm1ldHRhbnQgZGUgbCfDqWRpdGVyL3N1cHByaW1lci5cbi8vLyBTaSBwYXMgZCdpZCBwYXNzw6kgcGFyIGwndXJsLCBvbiBhZmZpY2hlIHVuIGZvcm11bGFpcmUgdmlkZSBwZXJtZXR0YW50IGQnZW4gc2Fpc2lyIHVuIG5vdXZlbCB1dGlsaXNhdGV1clxuXG4vLy8gw4AgYWpvdXRlciA6IFxuLy8vIC0gaW1wb3J0YXRpb24gbGlzdGUgZGUgY29tcHRlcyB1dGlsaXNhdGV1ciDDoCBjcsOpZXJcbi8vLyAtIGF0dHJpYnV0aW9uIGQndW4gcGFycmFpbiDDoCB1biB1dGlsaXNhdGV1ciAodmlhIHVuIG1vdGV1ciBkZSByZWNoZXJjaGUpLiBQcsOpdnUgcGFyIGxlIGNvbnRyw7RsZXVyLlxuXG4vLyBGaWNoaWVyIGRlIGNvbmZpZ3VyYXRpb24gY8O0dMOpIGNsaWVudCA6XG5pbXBvcnQgeyBhcGlVcmwsIGF2YWlsYWJsZUxhbmdzLCB0aGVtZSB9IGZyb20gXCIuLi8uLi9jb25maWcvaW5zdGFuY2UuanNcIjtcbmNvbnN0IGxhbmc9YXZhaWxhYmxlTGFuZ3NbMF07XG5jb25zdCBjb25maWdGcm9udEVuZCA9IHJlcXVpcmUoXCIuLi8uLi92aWV3cy9cIit0aGVtZStcIi9jb25maWcvXCIrbGFuZytcIi5qc1wiKTtcblxuLy8gRm9uY3Rpb25zIHV0aWxlcyBhdSBzY3JpcHQgOiAhISByZXZvaXIgcXVhbmQgbGUgcmVzdGUgc2VyYSBmaW5pIHBvdXIgdsOpcmlmaWVyIHNpIHRvdXQgZXN0IHV0aWxlXG5pbXBvcnQgeyBnZXRMb2NhbHksIHJlbW92ZUxvY2FseSwgc2F2ZUxvY2FseSB9IGZyb20gXCIuL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanNcIjtcbmltcG9ydCB7IGFkZEVsZW1lbnQgfSBmcm9tIFwiLi90b29scy9kb20uanNcIjtcbmltcG9ydCB7IGhlbGxvRGV2LCB1cGRhdGVBY2NvdW50TGluayB9IGZyb20gXCIuL3Rvb2xzL2V2ZXJ5d2hlcmUuanNcIjtcbmltcG9ydCB7IGVtcHlGb3JtLCBnZXREYXRhc0Zyb21JbnB1dHMsIHNldEF0dHJpYnV0ZXNUb0lucHV0cyB9IGZyb20gXCIuL3Rvb2xzL2Zvcm1zLmpzXCI7XG5pbXBvcnQgeyBkYXRlRm9ybWF0LCBpc0VtcHR5LCByZXBsYWNlQWxsIH0gZnJvbSBcIi4uLy4uL3Rvb2xzL21haW5cIjtcbmltcG9ydCB7IGdldFVybFBhcmFtcyB9IGZyb20gXCIuL3Rvb2xzL3VybC5qc1wiO1xuaW1wb3J0IHsgY2hlY2tTZXNzaW9uLCBnZXRDb25maWcsIGdldFBhc3N3b3JkIH0gZnJvbSBcIi4vdG9vbHMvdXNlcnMuanNcIjtcblxuLy8gRGljdGlvbm5haXJlcyA6XG5jb25zdCB0eHQgPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL2dlbmVyYWxcIik7XG5jb25zdCB0eHRVc2VycyA9IHJlcXVpcmUoXCIuLi8uLi9sYW5nL1wiK2xhbmcrXCIvdXNlclwiKTtcbmNvbnN0IHR4dFN1YnNjcmlwdGlvbnMgPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL3N1YnNjcmlwdGlvblwiKTtcblxuaGVsbG9EZXYoKTtcblxuLy8gUHJpbmNpcGF1eCDDqWzDqW1lbnRzIGR1IERPTSBtYW5pcHVsw6lzIDpcbmNvbnN0IGRpdk1haW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1haW4tY29udGVudFwiKTtcbmNvbnN0IGRpdk1lc3NhZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1lc3NhZ2VcIik7XG5jb25zdCBkaXZSZXNwb25zZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicmVzcG9uc2VcIik7XG5jb25zdCBkaXZTdWJzY3JpYmVJbnRybyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic3Vic2NyaWJlSW50cm9cIik7XG5jb25zdCBkaXZQYXltZW50c0luZm9zID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJpbmZvc1BheW1lbnRzXCIpO1xuY29uc3QgZGl2R29kY2hpbGRzSW5mb3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImluZm9zR29kY2hpbGRzXCIpO1xuXG5jb25zdCBmb3JtVXNlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwidXNlcnNcIik7XG5jb25zdCBkZWxldGVDaGVja0JveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZGVsZXRlT2tMYWJlbFwiKTtcbmNvbnN0IHZhbGlkYXRpb25DaGVja0JveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwidmFsaWRhdGlvbk9rTGFiZWxcIik7XG5jb25zdCBidG5OZXdVc2VyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ3YW50TmV3VXNlclwiKTtcbmNvbnN0IG5ld1Bhc3N3b3JkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJuZXdQYXNzd29yZFwiKTtcbmNvbnN0IHRpbWVEaWZmZXJlbmNlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ0aW1lRGlmZmVyZW5jZVwiKTtcbmNvbnN0IGZvcm1TZWFyY2ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInNlYXJjaFwiKTtcbmNvbnN0IGRpdlNlYXJjaFJlc3VsdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic2VhcmNoUmVzdWx0XCIpO1xuXG5jb25zdCBpbml0aWFsaXNlID0gYXN5bmMgKCkgPT5cbntcbiAgICB0cnlcbiAgICB7ICAgICAgICBcbiAgICAgICAgY29uc3QgY29uZmlnID0gYXdhaXQgZ2V0Q29uZmlnKCk7XG4gICAgICAgIGlmKCFjb25maWcpXG4gICAgICAgICAgICBhZGRFbGVtZW50KGRpdk1lc3NhZ2UsIFwicFwiLCB0eHQuc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBpc0Nvbm5lY3RlZD1hd2FpdCBjaGVja1Nlc3Npb24oW1wibWFuYWdlclwiLCBcImFkbWluXCJdLCBcIi9cIitjb25maWdGcm9udEVuZC5jb25uZWN0aW9uUGFnZSwgeyBtZXNzYWdlOiB0eHRVc2Vycy5uZWVkQmVDb25uZWN0ZWQsIGNvbG9yOlwiZXJyb3JcIiB9LCB3aW5kb3cubG9jYXRpb24pO1xuICAgICAgICAgICAgaWYoaXNDb25uZWN0ZWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgdXNlcj1nZXRMb2NhbHkoXCJ1c2VyXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgIHVwZGF0ZUFjY291bnRMaW5rKHVzZXIuc3RhdHVzLCBjb25maWdGcm9udEVuZCk7XG4gICAgICAgICAgICAgICAgZGl2TWFpbi5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIjtcbiAgICAgICAgICAgICAgICBpZighaXNFbXB0eShnZXRMb2NhbHkoXCJtZXNzYWdlXCIpKSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2TWVzc2FnZSwgXCJwXCIsIGdldExvY2FseShcIm1lc3NhZ2VcIiwgdHJ1ZSkubWVzc2FnZSwgXCJcIiwgW2dldExvY2FseShcIm1lc3NhZ2VcIiwgdHJ1ZSkuY29sb3JdLCBcIlwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcIm1lc3NhZ2VcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAvLyBJbml0aWFsaXNhdGlvbiBkdSBmb3JtdWxhaXJlIGRlIHJlY2hlcmNoZSA6XG4gICAgICAgICAgICAgICAgc2V0QXR0cmlidXRlc1RvSW5wdXRzKGNvbmZpZywgZm9ybVNlYXJjaCk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gRm9uY3Rpb24gdXRpbGUgcG91ciB2aWRlciBsZSBmb3JtdWxhaXJlLCB5IGNvbXByaXMgbGVzIGNoYW1wcyBoaWRkZW4sIGV0Yy5cbiAgICAgICAgICAgICAgICAvLyBDYWNoZSBhdXNzaSBjZXJ0YWlucyBjaGFtcHMgZW4gbW9kZSBjcsOpYXRpb25cbiAgICAgICAgICAgICAgICBjb25zdCBlbXB0eVVzZXJGb3JtID0gKCkgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGVtcHlGb3JtKGZvcm1Vc2VyKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2FzZSBkZSBzdXBwcmVzc2lvbiBjYWNow6llIHBhciBkw6lmYXV0LCBjYXIgaW51dGlsZSBwb3VyIGZvcm11bGFpcmUgZGUgY3LDqWF0aW9uXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZUNoZWNrQm94LnN0eWxlLmRpc3BsYXk9XCJub25lXCI7XG4gICAgICAgICAgICAgICAgICAgIC8vIENhc2UgZGUgdmFsaWRhdGlvbiBjYWNow6llIHBhciBkw6lmYXV0LCBjYXIgdXRpbGUgcXVlIGRhbnMgY2VydGFpbnMgY2FzXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25DaGVja0JveC5zdHlsZS5kaXNwbGF5PVwibm9uZVwiO1xuICAgICAgICAgICAgICAgICAgICBkaXZTdWJzY3JpYmVJbnRyby5pbm5lckhUTUw9XCJcIjtcbiAgICAgICAgICAgICAgICAgICAgZGl2UGF5bWVudHNJbmZvcy5pbm5lckhUTUw9XCJcIjtcbiAgICAgICAgICAgICAgICAgICAgZGl2R29kY2hpbGRzSW5mb3MuaW5uZXJIVE1MPVwiXCI7XG4gICAgICAgICAgICAgICAgICAgIC8vIENlcnRhaW5zIG5hdmlnYXRldXJzIG9udCB0ZW5kYW5jZSDDoCByZW1wbGlyIHRvdXQgc2V1bCBsZXMgY2hhbXBzIHBhc3N3b3JkXG4gICAgICAgICAgICAgICAgICAgIG5ld1Bhc3N3b3JkLnZhbHVlPVwiXCI7XG4gICAgICAgICAgICAgICAgICAgIC8vIEVuIG1vZGUgY3LDqWF0aW9uLCBwYXMgZGUgY2hhbXAgcG91ciBjaGFuZ2VyIGxlIG1vdCBkZSBwYXNzZVxuICAgICAgICAgICAgICAgICAgICBuZXdQYXNzd29yZC5wYXJlbnROb2RlLnN0eWxlLmRpc3BsYXk9XCJub25lXCI7XG4gICAgICAgICAgICAgICAgICAgIC8vIEludXRpbGUgZW4gbW9kZSBjcsOpYXRpb25cbiAgICAgICAgICAgICAgICAgICAgdGltZURpZmZlcmVuY2UucGFyZW50Tm9kZS5zdHlsZS5kaXNwbGF5PVwibm9uZVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbXB0eVVzZXJGb3JtKCk7XG4gICAgICAgICAgICAgICAgLy8gSW5pdGlhbGlzZSBsZXMgY29udHJhaW50ZXMgZHUgZm9ybXVsYWlyZSA6XG4gICAgICAgICAgICAgICAgc2V0QXR0cmlidXRlc1RvSW5wdXRzKGNvbmZpZywgZm9ybVVzZXIpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEZvbmN0aW9uIGFmZmljaGFudCBsZXMgaW5mb3MgY29ubnVlcyBjb25jZXJuYW50IHVuIHV0aWxpc2F0ZXVyIGV0IHNvbiBhYm9ubmVtZW50XG4gICAgICAgICAgICAgICAgY29uc3Qgc2hvd0Zvcm1Vc2VySW5mb3MgPSAoaWQpID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvLyBvbiBjb21tZW5jZSBwYXIgdG91dCB2aWRlciwgZGVzIGZvaXMgcXVlLi4uIDpcbiAgICAgICAgICAgICAgICAgICAgZW1wdHlVc2VyRm9ybSgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4aHJHZXRJbmZvcyA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgICAgICB4aHJHZXRJbmZvcy5vcGVuKFwiR0VUXCIsIGFwaVVybCtjb25maWcudXNlclJvdXRlcytjb25maWcuZ2V0VXNlckluZm9zK2lkKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyR2V0SW5mb3Mub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UodGhpcy5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gMjAwICYmIHJlc3BvbnNlLlVzZXIgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFzc3dvcmQucGFyZW50Tm9kZS5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZURpZmZlcmVuY2UucGFyZW50Tm9kZS5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwVGV4dCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEX1VTRVIgOiByZXNwb25zZS5Vc2VyLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFURV9DUkVBIDogZGF0ZUZvcm1hdChyZXNwb25zZS5Vc2VyLmNyZWF0ZWRBdCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFX1VQREFURSA6IGRhdGVGb3JtYXQocmVzcG9uc2UuVXNlci51cGRhdGVkQXQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFURV9DT05ORUNUSU9OIDogZGF0ZUZvcm1hdChyZXNwb25zZS5Vc2VyLmNvbm5lY3RlZEF0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3Vic2NyaWJlSW50cm89cmVwbGFjZUFsbCh0eHRVc2Vycy5pbmZvc1VzZXJGb3JBZG1pbiwgbWFwVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihsZXQgZGF0YSBpbiByZXNwb25zZS5Vc2VyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihmb3JtVXNlci5lbGVtZW50c1tkYXRhXSE9PXVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5Vc2VyW2RhdGFdIT09dHJ1ZSAmJiByZXNwb25zZS5Vc2VyW2RhdGFdIT09ZmFsc2UpLy8gYm9vbMOpZW4gPSBjYXNlIMOgIGNvY2hlciAhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Vc2VyLmVsZW1lbnRzW2RhdGFdLnZhbHVlPXJlc3BvbnNlLlVzZXJbZGF0YV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzcG9uc2UuVXNlcltkYXRhXT09dHJ1ZSkgLy8gc2kgZmFsc2UsIG9uIG5lIGZhaXQgcmllblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtVXNlci5lbGVtZW50c1tcIlwiK2RhdGFdLmNoZWNrZWQ9XCJjaGVja2VkXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2UuU3Vic2NyaXB0aW9uICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9tYnJlIGRlIGpvdXJzIGRlIGwnYWJvbm5lbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVVzZXIuZWxlbWVudHNbXCJudW1iZXJPZkRheXNcIl0udmFsdWU9cmVzcG9uc2UuU3Vic2NyaXB0aW9uW1wibnVtYmVyT2ZEYXlzXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5mb3MgZGUgbCdhYm9ubmVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5TdWJzY3JpcHRpb24ubm90aWNlT2s9PXRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVVzZXIuZWxlbWVudHNbXCJub3RpY2VPa1wiXS5jaGVja2VkPVwiY2hlY2tlZFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gam91cnMgZGUgcsOpY2VwdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpIGluIHJlc3BvbnNlLlN1YnNjcmlwdGlvbi5yZWNlaXB0RGF5cylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtVXNlci5lbGVtZW50c1tcImRcIityZXNwb25zZS5TdWJzY3JpcHRpb24ucmVjZWlwdERheXNbaV1dLmNoZWNrZWQ9XCJjaGVja2VkXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiZWdpblN1YlRTPW5ldyBEYXRlKHJlc3BvbnNlLlN1YnNjcmlwdGlvbi5jcmVhdGVkQXQpLmdldFRpbWUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5iRGF5c09rPXJlc3BvbnNlLlN1YnNjcmlwdGlvbi5udW1iZXJPZkRheXMtTWF0aC5yb3VuZCgoRGF0ZS5ub3coKS1iZWdpblN1YlRTKS8xMDAwLzM2MDAvMjQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobmJEYXlzT2s+MClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVJbnRybys9XCI8YnI+XCIrdHh0U3Vic2NyaXB0aW9ucy5pbmZvc05iRGF5c0FkbWluLnJlcGxhY2UoXCJOQl9EQVlTXCIsIG5iRGF5c09rKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVJbnRybys9XCI8YnI+XCIrdHh0U3Vic2NyaXB0aW9ucy5pbmZvc0V4cGlyYXRlZEFkbWluO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZTdWJzY3JpYmVJbnRybywgXCJwXCIsIHN1YnNjcmliZUludHJvLCBcIlwiLCBbXCJpbmZvcm1hdGlvblwiXSwgXCJcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZTdWJzY3JpYmVJbnRybywgXCJwXCIsIHR4dFN1YnNjcmlwdGlvbnMuaXNOb3RWYWxpZGVkLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQ2hlY2tCb3guc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlQ2hlY2tCb3guc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluZm9zIGRlIHBhaWVtZW50cyB2aWEgQVBJIFdQXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhockdldFBheW1lbnRzSW5mb3MgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyR2V0UGF5bWVudHNJbmZvcy5vcGVuKFwiR0VUXCIsIGFwaVVybCtjb25maWcuZ2V0UGF5bWVudHMrcmVzcG9uc2UuVXNlci5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhockdldFBheW1lbnRzSW5mb3Mub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlUGF5PUpTT04ucGFyc2UodGhpcy5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gMjAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2VQYXkubGVuZ3RoIT09MClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHR4dFBheW1lbnRzPVwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gcmVzcG9uc2VQYXkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwVGV4dCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFX1BBWU1FTlQgOiBkYXRlRm9ybWF0KHJlc3BvbnNlUGF5W2ldLmNyZWF0ZWRBdCwgXCJmclwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1PVU5UIDogcmVzcG9uc2VQYXlbaV0uYW1vdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTElFTlRfTkFNRSA6IHJlc3BvbnNlUGF5W2ldLmNsaWVudE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4dFBheW1lbnRzKz1cIjxsaT5cIityZXBsYWNlQWxsKHR4dFN1YnNjcmlwdGlvbnMuaW5mb3NQYXltZW50c0FkbWluLCBtYXBUZXh0KStcIjwvbGk+XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlBheW1lbnRzSW5mb3MsIFwidWxcIiwgdHh0UGF5bWVudHMsIFwiXCIsIFtcImluZm9ybWF0aW9uXCJdLCBcIlwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZQYXltZW50c0luZm9zLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyR2V0UGF5bWVudHNJbmZvcy5zZXRSZXF1ZXN0SGVhZGVyKFwiQXV0aG9yaXphdGlvblwiLCBcIkJlYXJlciBcIit1c2VyLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyR2V0UGF5bWVudHNJbmZvcy5zZW5kKCk7ICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVuIHBhcnJhaW4gb3UgZGV1eCBwYXIgZGV1eCA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0eHRHb2RjaGlsZHM9XCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWlzRW1wdHkocmVzcG9uc2UuVXNlci5Hb2RmYXRoZXJJZCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhockdldEdvZEZhdGhlckluZm9zID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aHJHZXRHb2RGYXRoZXJJbmZvcy5vcGVuKFwiR0VUXCIsIGFwaVVybCtjb25maWcudXNlclJvdXRlcytjb25maWcuZ2V0VXNlckluZm9zK3Jlc3BvbnNlLlVzZXIuR29kZmF0aGVySWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyR2V0R29kRmF0aGVySW5mb3Mub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZUdGPUpTT04ucGFyc2UodGhpcy5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCAmJiByZXNwb25zZUdGLlVzZXIgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHh0R29kY2hpbGRzKz10eHRVc2Vycy5pbmZvc0FkbWluR29kZmF0aGVyK1wiPGEgaHJlZj0nL1wiK2NvbmZpZ0Zyb250RW5kLnVzZXJzTWFuYWdlbWVudFBhZ2UrXCI/aWQ9XCIrcmVzcG9uc2VHRi5Vc2VyLmlkK1wiJyB0YXJnZXQ9J19ibGFuayc+XCIrcmVzcG9uc2VHRi5Vc2VyLm5hbWUrXCI8L2E+XCIrXCIuPGJyPlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhockdldEdvZEZhdGhlckluZm9zLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK3VzZXIudG9rZW4pOyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhockdldEdvZEZhdGhlckluZm9zLnNlbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZXMgZmlsbGV1bHMgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4aHJHZXRHb2RjaGlsZHMgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyR2V0R29kY2hpbGRzLm9wZW4oXCJHRVRcIiwgYXBpVXJsK2NvbmZpZy51c2VyUm91dGVzK2NvbmZpZy5nZXRHb2RDaGlsZHMraWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aHJHZXRHb2RjaGlsZHMub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlR1M9SlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZUdTLmxlbmd0aCE9PTApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4dEdvZGNoaWxkcys9dHh0VXNlcnMuaW5mb3NBZG1pbk5iR29kQ2hpbGRzLnJlcGxhY2UoXCIjTkJcIiwgcmVzcG9uc2VHUy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpIGluIHJlc3BvbnNlR1MpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHh0R29kY2hpbGRzKz1cIjxhIGhyZWY9Jy9cIitjb25maWdGcm9udEVuZC51c2Vyc01hbmFnZW1lbnRQYWdlK1wiP2lkPVwiK3Jlc3BvbnNlR1NbaV0uaWQrXCInIHRhcmdldD0nX2JsYW5rJz5cIityZXNwb25zZUdTW2ldLm5hbWUrXCI8L2E+XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyR2V0R29kY2hpbGRzLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK3VzZXIudG9rZW4pOyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyR2V0R29kY2hpbGRzLnNlbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHh0R29kY2hpbGRzIT09XCJcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZHb2RjaGlsZHNJbmZvcywgXCJwXCIsIHR4dEdvZGNoaWxkcytcIi5cIiwgXCJcIiwgW1wiaW5mb3JtYXRpb25cIl0sIFwiXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdkdvZGNoaWxkc0luZm9zLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHhockdldEluZm9zLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB4aHJHZXRJbmZvcy5zZW5kKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU2kgdW4gaWQgZXN0IHBhc3PDqSBwYXIgbCd1cmwsIG9uIGVzc2F5ZSBkJ2FmZmljaGVyIGwndXRpbGlzYXRldXIgOlxuICAgICAgICAgICAgICAgIGxldCB1cmxEYXRhcz1nZXRVcmxQYXJhbXMoKTtcbiAgICAgICAgICAgICAgICBpZih1cmxEYXRhcyAmJiB1cmxEYXRhcy5pZCE9PXVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgc2hvd0Zvcm1Vc2VySW5mb3ModXJsRGF0YXMuaWQpO1xuXG4gICAgICAgICAgICAgICAgLy8gQmVzb2luIGQndW4gY291cCBkZSBLw6RyY2hlciA/IFxuICAgICAgICAgICAgICAgIGJ0bk5ld1VzZXIuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBlbXB0eVVzZXJGb3JtKCk7XG4gICAgICAgICAgICAgICAgfSk7ICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gRW52b2kgZHUgZm9ybXVsYWlyZSBkZXMgaW5mb3MgZGUgbCd1dGlsaXNhdGV1clxuICAgICAgICAgICAgICAgIGZvcm1Vc2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJzdWJtaXRcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgZGl2UmVzcG9uc2UuaW5uZXJIVE1MPVwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhcz1nZXREYXRhc0Zyb21JbnB1dHMoZm9ybVVzZXIpO1xuICAgICAgICAgICAgICAgICAgICAvLyByZWNvbXBvc2l0aW9uIGRlcyBqb3VycyB2YWxhYmxlcyBwb3VyIGwnYWJvbm5lbWVudCA6XG4gICAgICAgICAgICAgICAgICAgIGRhdGFzLnJlY2VpcHREYXlzPVwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaT0xOyBpPD03OyBpKyspXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGFzW1wiZFwiK2ldIT09dW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFzLnJlY2VpcHREYXlzKz1cIlwiK2k7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYoZGF0YXMubm90aWNlT2s9PT11bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhcy5ub3RpY2VPaz1cImZhbHNlXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmKGRhdGFzLm5ld3NsZXR0ZXJPaz09PXVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFzLm5ld3NsZXR0ZXJPaz1cImZhbHNlXCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhoclVzZXJEYXRhcyA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZighaXNFbXB0eShkYXRhcy5pZCkgJiYgKGRhdGFzLmRlbGV0ZU9rIT09dW5kZWZpbmVkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHhoclVzZXJEYXRhcy5vcGVuKFwiREVMRVRFXCIsIGFwaVVybCtjb25maWcudXNlclJvdXRlcytcIi9cIitkYXRhcy5pZCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIWlzRW1wdHkoZGF0YXMuaWQpICYmIChkYXRhcy52YWxpZGF0aW9uT2shPT11bmRlZmluZWQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgeGhyVXNlckRhdGFzLm9wZW4oXCJQT1NUXCIsIGFwaVVybCtjb25maWcudXNlclJvdXRlcytjb25maWcudmFsaWRhdGVVc2VyUm91dGUrZGF0YXMuaWQpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCFpc0VtcHR5KGRhdGFzLmlkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHhoclVzZXJEYXRhcy5vcGVuKFwiUFVUXCIsIGFwaVVybCtjb25maWcudXNlclJvdXRlcytjb25maWcudXBkYXRlVXNlckluZm9zK2RhdGFzLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhcy5wYXNzd29yZD1nZXRQYXNzd29yZChjb25maWcucGFzc3dvcmQubWlubGVuZ3RoLCBjb25maWcucGFzc3dvcmQubWlubGVuZ3RoKzIpOy8vIG1vdCBkZSBwYXNzZSB0ZW1wb3JhaXJlXG4gICAgICAgICAgICAgICAgICAgICAgICB4aHJVc2VyRGF0YXMub3BlbihcIlBPU1RcIiwgYXBpVXJsK2NvbmZpZy51c2VyUm91dGVzK2NvbmZpZy5jcmVhdGVVc2VyUm91dGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHhoclVzZXJEYXRhcy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDEgJiYgcmVzcG9uc2UuaWQhPXVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHQuYWRkT2tNZXNzYWdlLCBcIlwiLCBbXCJzdWNjZXNzXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXMuaWQ9cmVzcG9uc2UuaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuc3RhdHVzID09PSAyMDAgJiYgcmVzcG9uc2UubWVzc2FnZSE9dW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShyZXNwb25zZS5tZXNzYWdlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLm1lc3NhZ2UgPSByZXNwb25zZS5tZXNzYWdlLmpvaW4oXCI8YnI+XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5tZXNzYWdlID0gcmVzcG9uc2UubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHJlc3BvbnNlLm1lc3NhZ2UsIFwiXCIsIFtcInN1Y2Nlc3NcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZS5lcnJvcnMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihBcnJheS5pc0FycmF5KHJlc3BvbnNlLmVycm9ycykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvcnMgPSByZXNwb25zZS5lcnJvcnMuam9pbihcIjxicj5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVycm9ycyA9IHR4dC5zZXJ2ZXJFcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHJlc3BvbnNlLmVycm9ycywgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHQuc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpc0VtcHR5KHJlc3BvbnNlLmVycm9ycykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhcy5kZWxldGVPaz09PXVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dGb3JtVXNlckluZm9zKGRhdGFzLmlkKTsvLyBwZXV0IGF2b2lyIMOpdm9sdcOpIHN1aXZhbnQgY2UgcXVpIHMnZXN0IHBhc3PDqVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eVVzZXJGb3JtKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHhoclVzZXJEYXRhcy5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyVXNlckRhdGFzLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICBpZihkYXRhcylcbiAgICAgICAgICAgICAgICAgICAgICAgIHhoclVzZXJEYXRhcy5zZW5kKEpTT04uc3RyaW5naWZ5KGRhdGFzKSk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAvLyBUcmFpdGVtZW50IGR1IGxhbmNlbWVudCBkJ3VuZSByZWNoZXJjaGVcbiAgICAgICAgICAgICAgICBmb3JtU2VhcmNoLmFkZEV2ZW50TGlzdGVuZXIoXCJzdWJtaXRcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFzPWdldERhdGFzRnJvbUlucHV0cyhmb3JtU2VhcmNoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeGhyU2VhcmNoID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgICAgIHhoclNlYXJjaC5vcGVuKFwiUE9TVFwiLCBhcGlVcmwrY29uZmlnLnVzZXJSb3V0ZXMrY29uZmlnLnNlYXJjaFVzZXJSb3V0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHhoclNlYXJjaC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDAgJiYgQXJyYXkuaXNBcnJheShyZXNwb25zZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5sZW5ndGg9PT0wKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZTZWFyY2hSZXN1bHQsIFwicFwiLCB0eHRVc2Vycy5ub3RGb3VuZCwgXCJcIiwgW1wiaW5mb3JtYXRpb25cIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3RIVE1MPVwiPG9wdGlvbiB2YWx1ZT0nJz48L29wdGlvbj5cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiByZXNwb25zZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RIVE1MKz1cIjxvcHRpb24gdmFsdWU9J1wiK3Jlc3BvbnNlW2ldLmlkK1wiJz5cIityZXNwb25zZVtpXS5uYW1lK1wiIChcIityZXNwb25zZVtpXS5lbWFpbCtcIik8L29wdGlvbj5cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2U2VhcmNoUmVzdWx0LCBcInNlbGVjdFwiLCBzZWxlY3RIVE1MLCBcInNlbGVjdFNlYXJjaFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlYXJjaFNlbGVjdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInNlbGVjdFNlYXJjaFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFNlbGVjdC5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGZ1bmN0aW9uKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzZWFyY2hTZWxlY3QudmFsdWUhPT1cIlwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93Rm9ybVVzZXJJbmZvcyhzZWFyY2hTZWxlY3QudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlNlYXJjaFJlc3VsdCwgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHhoclNlYXJjaC5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyU2VhcmNoLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICBpZihkYXRhcylcbiAgICAgICAgICAgICAgICAgICAgICAgIHhoclNlYXJjaC5zZW5kKEpTT04uc3RyaW5naWZ5KGRhdGFzKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2goZSlcbiAgICB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIGFkZEVsZW1lbnQoZGl2TWVzc2FnZSwgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgIH1cbn1cbmluaXRpYWxpc2UoKTsiLCIvLyBGT05DVElPTlMgVVRJTEVTIEFVIFNUT0NLQUdFIExPQ0FMIChTRVNTSU9OLCBDT09LSUVTLCBJTkRFWERCLCBFVEMuKVxuLy8gUmV2ZW5pciBwb3VyIGfDqXJlciBsZSBjYXMgb8O5IGxvY2FsLnN0b3JhZ2Ugbidlc3QgcGFzIGNvbm51IHBvdXIgdXRpbGlzZXIgY29va2llXG4gICAgXG5leHBvcnQgY29uc3Qgc2F2ZUxvY2FseSA9IChuYW1lLCBkYXRhKSA9Plxue1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKG5hbWUsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldExvY2FseSA9IChuYW1lLCBqc29uPWZhbHNlKSA9Plxue1xuICAgIGlmKGpzb24pXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKG5hbWUpKTtcbiAgICBlbHNlXG4gICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJlbW92ZUxvY2FseSA9IChuYW1lKSA9Plxue1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKG5hbWUpO1xufSIsImltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG4vLyBGb25jdGlvbiBhc3NvY2lhbnQgbGVzIGF0dHJpYnV0cyBmb3VybmlzIMOgIHVuIGNoYW1wIGRlIGZvcm11bGFpcmVcbmV4cG9ydCBjb25zdCBhZGRFbGVtZW50ID0gKGVsdFBhcmVudCwgZWx0VHlwZSwgZWx0Q29udGVudD1cIlwiLCBlbHRJZD1cIlwiLCBlbHRDbGFzcz1bXSwgZWx0QXR0cmlidXRlcz17fSwgcmVwbGFjZT10cnVlKSA9Plxue1xuICAgIGlmKGlzRW1wdHkoZWx0VHlwZSkgfHwgaXNFbXB0eShlbHRQYXJlbnQpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZWxzZVxuICAgIHtcbiAgICAgICAgY29uc3QgbmV3RWxlbWVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGVsdFR5cGUpO1xuICAgICAgICBcbiAgICAgICAgaWYoIWlzRW1wdHkoZWx0SWQpKS8vIHRlc3RlciBzaSBsJ2lkIG4nZXN0IHBhcyBkw6lqw6AgdXRpbGlzw6kgZGFucyBsZSBET00gP1xuICAgICAgICAgICAgbmV3RWxlbWVudC5pZD1lbHRJZDtcblxuICAgICAgICBpZihBcnJheS5pc0FycmF5KGVsdENsYXNzKSAmJiBlbHRDbGFzcy5sZW5ndGghPTApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGZvcihsZXQgaSBpbiBlbHRDbGFzcylcbiAgICAgICAgICAgICAgICBuZXdFbGVtZW50LmNsYXNzTGlzdC5hZGQoZWx0Q2xhc3NbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYodHlwZW9mIGVsdEF0dHJpYnV0ZXMgPT09IFwib2JqZWN0XCIpIC8vICEhIHRvdXMgbGVzIG9iamV0cyBuZSBzb250IHBhcyBva1xuICAgICAgICB7XG4gICAgICAgICAgICBmb3IobGV0IGF0dHJpYnV0TmFtZSBpbiBlbHRBdHRyaWJ1dGVzKVxuICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0TmFtZSwgZWx0QXR0cmlidXRlc1thdHRyaWJ1dE5hbWVdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFpc0VtcHR5KGVsdENvbnRlbnQpKVxuICAgICAgICAgICAgbmV3RWxlbWVudC5pbm5lckhUTUw9ZWx0Q29udGVudC5yZXBsYWNlKC9cXG4vZyxcIjxicj5cIik7Ly8gaW5uZXJIVE1MIHBlcm1ldCBkJ2Fqb3V0ZXIgZHUgdGV4dGUgYXlhbnQgbHVpLW3Dqm1lIGRlcyBiYWxpc2VzLCBldGMuXG4gICAgICAgICAgICBcbiAgICAgICAgaWYocmVwbGFjZSlcbiAgICAgICAgICAgIGVsdFBhcmVudC5pbm5lckhUTUw9XCJcIjtcbiAgICAgICAgZWx0UGFyZW50LmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpO1xuICAgIH0gICAgXG59IiwiLy8gQ2Ugc2NyaXB0IGZvdXJuaXQgZGVzIGZvbmN0aW9ucyB1dGlsaXPDqWVzIHN1ciB0b3V0ZXMgbGVzIHBhZ2VzIGR1IHNpdGVcblxuZXhwb3J0IGNvbnN0IGhlbGxvRGV2ID0gKCkgPT5cbntcbiAgICBjb25zb2xlLmxvZyhcIioqKiogSGVsbG8gYW1pIGTDqXZlbG9wcGV1ciA6LSlcXG4gTGUgY29kZSBkZSBXaWtpTGVybmkgZXN0IGxpYnJlIGV0IGVzdCBsaXNpYmxlIHN1ciBnaXRsYWIgOiBcXG4gQm9ubmUgbGVjdHVyZSA6LSkgXFxuIFBvdXIgbGVzIHN1Z2dlc3Rpb25zIGQnYW3DqWxpb3JhdGlvbiBvdSBxdWVzdGlvbnMgOiBkZXZAd2lsaWxlcm5pLmNvbSAqKioqXCIpO1xuICAgIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgY29uc3QgdXBkYXRlQWNjb3VudExpbmsgPSAoc3RhdHVzLCBjb25maWdUZW1wbGF0ZSkgPT5cbntcbiAgICBjb25zdCBsaW5rPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYWNjb3VudEhlYWRMaW5rXCIpO1xuICAgIGNvbnN0IGhvbWVQYWdlPXN0YXR1cytcIkhvbWVQYWdlXCI7XG4gICAgbGluay5ocmVmPVwiL1wiK2NvbmZpZ1RlbXBsYXRlW2hvbWVQYWdlXTtcbn0iLCJpbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gRm9uY3Rpb24gYXNzb2NpYW50IGxlcyBhdHRyaWJ1dHMgZm91cm5pcyDDoCB1biBjaGFtcCBkZSBmb3JtdWxhaXJlXG5leHBvcnQgY29uc3Qgc2V0QXR0cmlidXRlc1RvSW5wdXRzID0gKGlucHV0c0NvbmYsIG15Rm9ybSkgPT5cbntcbiAgICBmb3IobGV0IGkgaW4gbXlGb3JtLmVsZW1lbnRzKVxuICAgIHtcbiAgICAgICAgaWYoIWlzRW1wdHkobXlGb3JtLmVsZW1lbnRzW2ldLmlkKSlcbiAgICAgICAge1xuICAgICAgICAgICAgbGV0IGlkSW5wdXQ9bXlGb3JtLmVsZW1lbnRzW2ldLmlkO1xuICAgICAgICAgICAgaWYoaW5wdXRzQ29uZltpZElucHV0XSE9PXVuZGVmaW5lZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5wdXRIVE1MPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkSW5wdXQpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGF0dHJpYnV0ZSBpbiBpbnB1dHNDb25mW2lkSW5wdXRdKVxuICAgICAgICAgICAgICAgICAgICBpbnB1dEhUTUwuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgaW5wdXRzQ29uZltpZElucHV0XVthdHRyaWJ1dGVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gUsOpY3Vww6hyZSB0b3V0ZXMgbGVzIHZhbGV1cnMgZGUgY2hhbXBzIGVuIG9tZXR0YW50IGxlcyBjaGVja2JveCBub24gY29jaMOpZXMsIGV0Yy5cbmV4cG9ydCBjb25zdCBnZXREYXRhc0Zyb21JbnB1dHMgPSAobXlGb3JtKSA9Plxue1xuICAgIGNvbnN0IGRhdGFzPXt9O1xuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKG15Rm9ybSk7XG4gICAgZm9yKGxldCBlbnRyaWUgb2YgZm9ybURhdGEuZW50cmllcygpKVxuICAgICAgIGRhdGFzW2VudHJpZVswXV09ZW50cmllWzFdO1xuICAgIHJldHVybiBkYXRhcztcbn1cblxuLy8gVmlkZSB0b3VzIGxlcyBjaGFtcHMgZCd1biBmb3JtdWxhaXJlLCB5IGNvbXByaXMgaGlkZGVuLCBjaGVja2JveCwgZXRjLlxuLy8gUmV2b2lyIHBvdXIgbGVzIHNlbGVjdFxuZXhwb3J0IGNvbnN0IGVtcHlGb3JtID0gKG15Rm9ybSkgPT5cbntcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShteUZvcm0pO1xuICAgIGZvcihsZXQgZW50cmllIG9mIGZvcm1EYXRhLmVudHJpZXMoKSlcbiAgICB7XG4gICAgICAgIGlmKG15Rm9ybS5lbGVtZW50c1tlbnRyaWVbMF1dLnR5cGU9PVwiY2hlY2tib3hcIiB8fCBteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS50eXBlPT1cInJhZGlvXCIpXG4gICAgICAgICAgICBteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS5jaGVja2VkPWZhbHNlO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS52YWx1ZT1cIlwiO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8vIFZpZGUgZXQgY2FjaGUgbGUgZm9ybXVsYWlyZVxuZXhwb3J0IGNvbnN0IGVtcHlBbmRIaWRlRm9ybSA9IChteUZvcm0pID0+XG57XG4gICAgZW1weUZvcm0obXlGb3JtKTtcbiAgICBteUZvcm0uc3R5bGUuZGlzcGxheT1cIm5vbmVcIjtcbn0iLCJpbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gRm9uY3Rpb24gcsOpY3Vww6lyYW50IGxlcyBwYXJhbcOodHJlcyBwYXNzw6lzIHBhciBsJ3VybFxuZXhwb3J0IGNvbnN0IGdldFVybFBhcmFtcyA9ICgpID0+XG57XG4gICAgaWYoaXNFbXB0eShsb2NhdGlvbi5zZWFyY2gpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gbG9jYXRpb24uc2VhcmNoLnN1YnN0cmluZygxKS5zcGxpdChcIiZcIik7XG4gICAgaWYoIUFycmF5LmlzQXJyYXkocGFyYW1ldGVycykgfHwgcGFyYW1ldGVycy5sZW5ndGg9PT0wKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIFxuICAgIGxldCBwYXJhbSwgZGF0YXM9e307XG4gICAgZm9yKGxldCBpIGluIHBhcmFtZXRlcnMpXG4gICAge1xuICAgICAgICBwYXJhbSA9IHBhcmFtZXRlcnNbaV0uc3BsaXQoXCI9XCIpO1xuICAgICAgICBpZihwYXJhbS5sZW5ndGg9PT0yKVxuICAgICAgICAgICAgZGF0YXNbcGFyYW1bMF1dPWRlY29kZVVSSShwYXJhbVsxXSk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhcztcbn0iLCJpbXBvcnQgeyBhcGlVcmwsIGF2YWlsYWJsZUxhbmdzLCBzaXRlVXJsLCB0aGVtZSB9IGZyb20gXCIuLi8uLi8uLi9jb25maWcvaW5zdGFuY2UuanNcIjtcbmNvbnN0IGxhbmc9YXZhaWxhYmxlTGFuZ3NbMF07XG5cbmNvbnN0IGNvbmZpZ1RlbXBsYXRlID0gcmVxdWlyZShcIi4uLy4uLy4uL3ZpZXdzL1wiK3RoZW1lK1wiL2NvbmZpZy9cIitsYW5nK1wiLmpzXCIpO1xuaW1wb3J0IHsgIGNoZWNrTG9naW5Sb3V0ZSwgdGltZURpZmZlcmVuY2VNYXgsIHRpbWVEaWZmZXJlbmNlTWluLCB1c2VyUm91dGVzIH0gZnJvbSBcIi4uLy4uLy4uL2NvbmZpZy91c2Vycy5qc1wiO1xuXG5pbXBvcnQgeyBnZXRMb2NhbHksIHJlbW92ZUxvY2FseSwgc2F2ZUxvY2FseSB9IGZyb20gXCIuL2NsaWVudHN0b3JhZ2UuanNcIjtcbmltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG4vLyBSw6ljdXDDqHJlIGxlcyBkb25uw6llcyBkZSBjb25maWd1cmF0aW9uIGRlcyB1dGlsaXNhdGV1cnNcbi8vIMOAIHRlcm1lLCB1biBmaWNoaWVyIHN0YXRpcXVlIGltcG9ydGFibGUgY29tbWUgbW9kdWxlIGRldnJhaXQgw6l2aXRlciB1bmUgcmVxdcOqdGUgYWpheFxuZXhwb3J0IGNvbnN0IGdldENvbmZpZyA9ICBhc3luYyAoKSA9Plxue1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuICAgIHtcbiAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHhoci5vcGVuKFwiR0VUXCIsIGFwaVVybCtcIi91c2VyL2dldGNvbmZpZ1wiKTtcbiAgICAgICAgeGhyLm9ubG9hZCA9ICgpID0+IHJlc29sdmUoSlNPTi5wYXJzZSh4aHIucmVzcG9uc2VUZXh0KSk7XG4gICAgICAgIHhoci5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICAgICAgeGhyLnNlbmQoKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldFRpbWVEaWZmZXJlbmNlID0gKCkgPT5cbntcbiAgICBjb25zdCB0aW1lTG9jYWw9bmV3IERhdGUoKS5nZXRUaW1lem9uZU9mZnNldCgpO1xuICAgIGlmKHRpbWVMb2NhbCA+IHRpbWVEaWZmZXJlbmNlTWF4IHx8IHRpbWVMb2NhbCA8IHRpbWVEaWZmZXJlbmNlTWluKVxuICAgICAgICByZXR1cm4gMDtcbiAgICBlbHNlIHJldHVybiB0aW1lTG9jYWw7XG59XG5cbi8vIE9uIGVubMOodmUgdm9sb250YWlyZW1lbnQgbGVzIDAvTyBwb3VyIMOpdml0ZXIgbGVzIGNvbmZ1c2lvbnMgIVxuLy8gRXQgbWlldXggdmF1dCBhdXNzaSBkw6lidXRlciBldCBmaW5pciBwYXIgdW5lIGxldHRyZSBzaW1wbGUuXG5leHBvcnQgY29uc3QgZ2V0UGFzc3dvcmQgPSAobmJDYXJNaW4sIG5iQ2FyTWF4KSA9Plxue1xuICAgIGNvbnN0IG5iQ2FyPW5iQ2FyTWluK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoobmJDYXJNYXgtbmJDYXJNaW4pKTtcbiAgICBjb25zdCBsZXR0ZXJzPVwiQUJDREVGR0hJSktMTU5QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ucHFyc3R1dnd4eXpcIjtcbiAgICBjb25zdCBvdGhlcnM9XCIxMjM0NTY3ODkhPy4qLV8lQCbDicOAw4jDmeKCrCTDgsOKw5vDjlwiO1xuICAgIGxldCBwYXNzd29yZD1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldO1xuICAgIGZvcihsZXQgaT0xO2k8KG5iQ2FyLTEpO2krKylcbiAgICB7XG4gICAgICAgIGlmKChpICUgMikgPT09MSlcbiAgICAgICAgICAgIHBhc3N3b3JkKz1vdGhlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKm90aGVycy5sZW5ndGgpXTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcGFzc3dvcmQrPWxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxldHRlcnMubGVuZ3RoKV07ICAgXG4gICAgfVxuICAgIHBhc3N3b3JkKz1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldO1xuICAgIHJldHVybiBwYXNzd29yZDtcbn1cblxuLy8gSid1dGlsaXNlIGxlIHN0b2NrYWdlIGxvY2FsIGR1IG5hdmlnYXRldXIgcG91ciBlbnJlZ2lzdHJlciBsZXMgZG9ubsOpZXMgcGVybWV0dGFudCBkZSByZWNvbm5hw650cmUgbCd1dGlsaXNhdGV1ciBwYXIgbGEgc3VpdGVcbi8vIFNldWwgbGUgc2VydmV1ciBwb3VycmEgdsOpcmlmaWVyIHF1ZSBsZXMgaWRlbnRpZmlhbnRzIHNvbnQgKHRvdWpvdXJzKSB2YWxpZGVzLlxuZXhwb3J0IGNvbnN0IHNldFNlc3Npb24gPSAodXNlcklkLCB0b2tlbiwgZHVyYXRpb25UUykgPT5cbntcbiAgICBjb25zdCBzdG9yYWdlVXNlcj1cbiAgICB7XG4gICAgICAgIGlkOiB1c2VySWQsXG4gICAgICAgIHRva2VuOiB0b2tlbixcbiAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uVFNcbiAgICB9XG4gICAgc2F2ZUxvY2FseShcInVzZXJcIiwgc3RvcmFnZVVzZXIpO1xufVxuXG4vLyBWw6lyaWZpZSBxdSdpbCB5IGEgZGVzIGRvbm7DqWVzIGxvY2FsZXMgY29uY2VybmFudCBsZSByw6lzdWx0YXQgZCd1biBxdWl6XG4vLyBFdCBsZXMgYWpvdXRlIGF1eCBkb25uw6llcyBlbnZvecOpZXMgcGFyIGxlcyBmb3JtdWxhaXJlcyBkJ2luc2NyaXB0aW9uL2Nvbm5leGlvbiBzaSBjJ2VzdCBsZSBjYXNcbmV4cG9ydCBjb25zdCBjaGVja0Fuc3dlckRhdGFzID0gKGRhdGFzKSA9Plxue1xuICAgIGNvbnN0IGxhc3RBbnN3ZXI9Z2V0TG9jYWx5KFwibGFzdEFuc3dlclwiKTtcbiAgICBpZighaXNFbXB0eShsYXN0QW5zd2VyKSlcbiAgICB7XG4gICAgICAgIGNvbnN0IGFuc3dlcj1KU09OLnBhcnNlKGxhc3RBbnN3ZXIpO1xuICAgICAgICBpZighaXNFbXB0eShhbnN3ZXIuZHVyYXRpb24pICYmICFpc0VtcHR5KGFuc3dlci5uYkNvcnJlY3RBbnN3ZXJzKSAmJiAhaXNFbXB0eShhbnN3ZXIuUXVlc3Rpb25uYWlyZUlkKSAmJiAhaXNFbXB0eShhbnN3ZXIubmJRdWVzdGlvbnMpKVxuICAgICAgICB7XG4gICAgICAgICAgICBkYXRhcy5kdXJhdGlvbj1hbnN3ZXIuZHVyYXRpb247XG4gICAgICAgICAgICBkYXRhcy5uYkNvcnJlY3RBbnN3ZXJzPWFuc3dlci5uYkNvcnJlY3RBbnN3ZXJzO1xuICAgICAgICAgICAgZGF0YXMuUXVlc3Rpb25uYWlyZUlkPWFuc3dlci5RdWVzdGlvbm5haXJlSWQ7XG4gICAgICAgICAgICBkYXRhcy5uYlF1ZXN0aW9ucz1hbnN3ZXIubmJRdWVzdGlvbnM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGFzO1xufVxuXG4vLyBDZXR0ZSBmb25jdGlvbiB0ZXN0ZSBsYSBjb25uZXhpb24gZGUgbCd1dGlsaXNhdGV1ciBkJ3VuZSBwYWdlXG4vLyBPbiBwZXV0IGZvdXJuaXMgdW5lIGxpc3RlIGRlIHN0YXR1dHMgYWNjZXB0w6lzIChzaSB2aWRlID0gdG91cyksIGFpbnNpIHF1J3VuZSB1cmwgZGUgcmVkaXJlY3Rpb24gc2kgbm9uIGNvbm5lY3TDqSwgdW4gbWVzc2FnZSBkJ2VycmV1ciDDoCBhZmZpY2hlciBzdXIgbGEgcGFnZSBkZSBkZXN0aW5hdGlvbiBldCBsJ3VybCBzdXIgbGFxdWVsbGUgcmV2ZW5pciB1bmUgZm9pcyBjb25uZWN0w6lcbmV4cG9ydCBjb25zdCBjaGVja1Nlc3Npb24gPSBhc3luYyAoc3RhdHVzPVtdLCB1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKSA9Plxue1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuICAgIHtcbiAgICAgICAgY29uc3QgdXNlckRhdGFzPWdldExvY2FseShcInVzZXJcIik7XG4gICAgICAgIGlmKGlzRW1wdHkodXNlckRhdGFzKSlcbiAgICAgICAge1xuICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCB1c2VyPUpTT04ucGFyc2UodXNlckRhdGFzKTtcbiAgICAgICAgICAgIGlmKGlzRW1wdHkodXNlci5pZCkgfHzCoGlzRW1wdHkodXNlci50b2tlbikgfHwgaXNFbXB0eSh1c2VyLmR1cmF0aW9uKSB8fCB1c2VyLmR1cmF0aW9uIDwgRGF0ZS5ub3coKSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBhcGlVcmwrdXNlclJvdXRlcytjaGVja0xvZ2luUm91dGUrdXNlci50b2tlbik7XG4gICAgICAgICAgICAgICAgeGhyLm9ubG9hZCA9ICgpID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDIwMCAmJiByZXNwb25zZS5pc1ZhbGlkICYmIHJlc3BvbnNlLmlkICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2UuaWQ9PT11c2VyLmlkKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIubmFtZT1yZXNwb25zZS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIubGFuZ3VhZ2U9cmVzcG9uc2UubGFuZ3VhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci50aW1lRGlmZmVyZW5jZT1yZXNwb25zZS50aW1lRGlmZmVyZW5jZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnN0YXR1cz1yZXNwb25zZS5zdGF0dXM7Ly8gbGUgdG9rZW4gZXQgZGUgdG91dGUgZmHDp29uIHbDqXJpZmllciDDoCBjaGFxdWUgcmVxdcOqdGUgw6AgbCdBUElcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlTG9jYWx5KFwidXNlclwiLCB1c2VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaSBpbCBzJ2FnaXQgZCd1biBcInVzZXJcIiBldCBxdWUgc29uIGFib25uZW1lbnQgYSBleHBpcsOpLCBqZSBsZSByZWRpcmlnZSB2ZXJzIGxhIGNhaXNzZSA6LSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5zdGF0dXM9PT1cInVzZXJcIiAmJiByZXNwb25zZS5uYkRheXNPayA8PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsQWNjb3VudD1zaXRlVXJsK1wiL1wiK2NvbmZpZ1RlbXBsYXRlW2xhbmddLmFjY291bnRQYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKHVybEFjY291bnQpPT09LTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKFwiL1wiK2NvbmZpZ1RlbXBsYXRlW2xhbmddLmFjY291bnRQYWdlKTsvLyBwYXNzw6llIGRpcmVjdGVtZW50IGljaSwgbCdhbmNyZSAjc3Vic2NyaWJlIG5lIGZvbmN0aW9ubmUgcGFzICE/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHN0YXR1cy5sZW5ndGghPT0wICYmIHN0YXR1cy5pbmRleE9mKHJlc3BvbnNlLnN0YXR1cyk9PT0tMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgeGhyLm9uZXJyb3IgPSAoKSA9PiByZWplY3QoeGhyLnN0YXR1c1RleHQpO1xuICAgICAgICAgICAgICAgIHhoci5zZW5kKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8vIENldHRlIGZvbmN0aW9uIHNlcnQgw6AgbGEgcHLDqWPDqWRlbnRlIGVuIGNhcyBkZSBjb25uZXhpb24gbm9uIHZhbGlkZVxuY29uc3QgcmVkaXJlY3RVc2VyID0gKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpID0+XG57XG4gICAgaWYoIWlzRW1wdHkobWVzc2FnZSkpXG4gICAgICAgIHNhdmVMb2NhbHkoXCJtZXNzYWdlXCIsIG1lc3NhZ2UpO1xuICAgIGlmKCFpc0VtcHR5KHVybFdhbnRlZCkpXG4gICAgICAgIHNhdmVMb2NhbHkoXCJ1cmxcIiwgdXJsV2FudGVkKTtcbiAgICBpZighaXNFbXB0eSh1cmxSZWRpcmVjdGlvbikpXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24odXJsUmVkaXJlY3Rpb24pO1xufSJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/front/public/JS/newLoginValidation.app.js b/front/public/JS/newLoginValidation.app.js new file mode 100644 index 0000000..537c6b2 --- /dev/null +++ b/front/public/JS/newLoginValidation.app.js @@ -0,0 +1,1174 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "./src/newLoginValidation.js"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "../config/instance.js": +/*!*****************************!*\ + !*** ../config/instance.js ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var _module$exports; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var users = __webpack_require__(/*! ./users */ "../config/users.js"); + +var questionnaires = __webpack_require__(/*! ./questionnaires */ "../config/questionnaires.js"); + +module.exports = (_module$exports = { + apiUrl: "http://localhost:3000/api", + siteUrl: "http://localhost:8080", + adminName: "Fabrice", + adminEmail: "dev@wikilerni.com", + senderName: "WikiLerni", + senderEmail: "bonjour@wikilerni.com", + adminLang: "fr", + theme: "default", + // le thème utilisé (dans /views) pour générer les pages HTML. Contient ses propres fichiers de configuration. + availableLangs: ["fr"], + // Languages in which the site is available. The first one is the default one. + siteName: "WikiLerni", + beginCodeGodfather: "wikilerni", + // case-sensitive and can't contain "@" ! + cronTimingAlertInSeconde: 120, + // for logs + responseTimingAlertInSeconde: 3, + // idem + tokenSignupValidationTimeInHours: "48h", + // https://github.com/zeit/ms + tokenLoginLinkTimeInHours: "1h", + tokenConnexionMinTimeInHours: "24h", + tokenConnexionMaxTimeInDays: "180 days", + tokenLoginChangingTimeInHours: "1h", + // for email & password changing + tokenDeleteUserTimeInHours: "1h", + tokenUnsubscribeLinkTimeInDays: "7 days", + // token send with subscription's emails + freeAccountTimingInDays: 10, + freeAccountExpirationNotificationInDays: 5, + accountExpirationFirstNotificationInDays: 14, + accountExpirationSecondNotificationInDays: 5, + inactiveAccountTimeToDeleteInDays: 180, + // Questionnaires: + nbQuestionsMin: 1, + // minimum number of questions for the questionnaire to be publishable + nbQuestionsMax: 10, + // if 0 = not maximum + nbChoicesMax: 10, + nbNewQuestionnaires: 10, + // for RSS, etc. + hourGiveNewQuestionnaireBegin: 1, + // in user local time + hourGiveNewQuestionnaireEnd: 24, + // idem + numberNewQuestionnaireAtSameTime: 50, + // for mass mailing + minSearchQuestionnaires: 3, + // Illustrations: + nbIllustrationsMin: 0, + nbIllustrationsMax: 1, + maxIllustrationSizeinOctet: 1000000, + // pas contrôlé pour l'instant. À revoir. + mimeTypesForIllustration: ["image/jpg", "image/jpeg", "image/png", "image/gif", "image/png"], + // -- Upload and resize: + illustrationsWidthMaxInPx: 400, + illustrationsMiniaturesWidthMaxInPx: 200, + // Links: + nbLinksMin: 1, + nbLinksMax: 1 +}, _defineProperty(_module$exports, "nbQuestionsMin", questionnaires.nbQuestionsMin), _defineProperty(_module$exports, "nbQuestionsMax", questionnaires.nbQuestionsMax), _defineProperty(_module$exports, "nbChoicesMax", questionnaires.nbChoicesMax), _defineProperty(_module$exports, "passwordMinLength", users.password.minlength), _defineProperty(_module$exports, "dirCacheUsers", users.dirCacheUsers), _defineProperty(_module$exports, "dirCacheUsersAnswers", users.dirCacheUsersAnswers), _defineProperty(_module$exports, "dirCacheQuestionnaires", questionnaires.dirCacheQuestionnaires), _defineProperty(_module$exports, "dirCacheQuestions", questionnaires.dirCacheQuestions), _defineProperty(_module$exports, "dirCacheUsersQuestionnaires", questionnaires.dirCacheUsersQuestionnaires), _defineProperty(_module$exports, "dirHTMLQuestionnaire", questionnaires.dirHTMLQuestionnaire), _defineProperty(_module$exports, "dirWebQuestionnaire", questionnaires.dirWebQuestionnaire), _module$exports); + +/***/ }), + +/***/ "../config/questionnaires.js": +/*!***********************************!*\ + !*** ../config/questionnaires.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + // API'routes (after "apiUrl" defined in instance.js) + questionnaireRoutes: "/questionnaire", + getQuestionnaireRoutes: "/get", + previewQuestionnaireRoutes: "/preview", + publishedQuestionnaireRoutes: "/quiz/", + saveAnswersRoute: "/answer/", + getStatsQuestionnaires: "/stats/", + searchQuestionnairesRoute: "/search", + searchAdminQuestionnairesRoute: "/searchadmin", + getListNextQuestionnaires: "/getlistnextquestionnaires/", + // -- questions & choices : + questionsRoute: "/question/", + // -- tags : + tagsSearchRoute: "/tags/search/", + // -- answers : + getQuestionnairesWithoutAnswer: "/withoutanswer/user/", + getPreviousAnswers: "/user/answers/", + getStatsAnswers: "/user/anwswers/stats/", + getAdminStats: "/getadminstats/", + // forms : à compléter avec valeurs par défaut, etc. cf modèle + Questionnaire: { + title: { + maxlength: 255, + required: true + }, + slug: { + maxlength: 150 + }, + // champ requis mais calculé à partir du titre qd vide + introduction: { + required: true + } + }, + searchQuestionnaires: { + minlength: 3, + required: true + }, + Question: { + text: { + maxlength: 255, + required: true + }, + rank: { + required: true, + min: 1, + defaultValue: 1 + } + }, + Choice: { + text: { + maxlength: 255, + required: true + } + }, + nbQuestionsMin: 1, + nbQuestionsMax: 10, + nbChoicesMax: 10, + nbTagsMin: 0, + nbTagsMax: 0, + // 0 = not max + // JSON and HTML dir + dirCacheQuestionnaires: "datas/questionnaires", + dirCacheQuestions: "datas/questionnaires/questions", + dirCacheUsersQuestionnaires: "datas/users/questionnaires", + dirCacheTags: "datas/questionnaires/tags", + dirHTMLQuestionnaire: "front/public/quiz", + dirHTMLTags: "front/public/quizs", + dirWebQuestionnaire: "quiz", + //pour url page + dirWebTags: "quizs" // idem + +}; + +/***/ }), + +/***/ "../config/users.js": +/*!**************************!*\ + !*** ../config/users.js ***! + \**************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + // API'routes (after "apiUrl" defined in instance.js) + userRoutes: "/user", + subscribeRoute: "/signup", + getGodfatherRoute: "/getgodfatherid", + checkIfIsEmailfreeRoute: "/isemailfree", + checkSubscribeTokenRoute: "/validation/", + checkLoginRoute: "/checklogin/", + connectionRoute: "/login", + getLoginLinkRoute: "/getloginlink", + connectionWithLinkRoute: "/checkloginlink", + getUserInfos: "/get/", + createUserRoute: "/create", + validateUserRoute: "/validate/", + updateUserInfos: "/modify/", + searchUserRoute: "/search/", + getGodChilds: "/getgodchilds/", + checkNewLoginLinkRoute: "/confirmnewlogin/", + checkDeleteLinkRoute: "/confirmdelete/", + getPayments: "/payment/getforoneuser/", + unsubscribeRoute: "/subscription/stop/", + getAdminStats: "/getadminstats/", + // forms : à compléter avec valeurs par défaut, etc. cf modèle + name: { + maxlength: 70, + required: true + }, + email: { + maxlength: 255, + required: true + }, + password: { + minlength: 8, + maxlength: 72, + required: true + }, + // https://www.npmjs.com/package/bcrypt#security-issues-and-concerns + newPassword: { + minlength: 8, + maxlength: 72 + }, + codeGodfather: { + maxlength: 255 + }, + cguOk: { + value: "true", + required: true + }, + timeDifferenceMin: -720, + timeDifferenceMax: 840, + // JSON dir + dirCacheUsers: "datas/users", + dirCacheUsersAnswers: "datas/users/questionnaires/answers" +}; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/general$": +/*!**************************************!*\ + !*** ../lang sync ^\.\/.*\/general$ ***! + \**************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/general": "../lang/fr/general.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/general$"; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/user$": +/*!***********************************!*\ + !*** ../lang sync ^\.\/.*\/user$ ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/user": "../lang/fr/user.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/user$"; + +/***/ }), + +/***/ "../lang/fr/general.js": +/*!*****************************!*\ + !*** ../lang/fr/general.js ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + siteHTMLTitle: "WikiLerni : qu'allez-vous apprendre aujourd'hui ?", + siteMetaDescription: "Chaque jour, testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.", + scriptTimingInfo: "Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", + scriptTimingAlert: "*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", + serverError: "Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.", + serverErrorAdmin: "Bug de l'application :", + neededParams: "Des paramètres nécessaires manquants sont manquants.", + badUrl: "Tentative d'accès à une page n'existant pas :", + notValidFormat: "Format non valide.", + notAllowed: "Vous n'avez pas les droits nécessaires pour cette action.", + notRequired: "Facultatif.", + updateBtnTxt: "Modifier", + addBtnTxt: "Ajouter", + deleteBtnTxt: "Supprimer", + addOkMessage: "Les données ont bien été enregistrées.", + updateOkMessage: "La mise à jour à jour a bien été enregistrée.", + deleteOkMessage: "La suppression a bien été enregistrée.", + failAuth: "Erreur d'authentification.", + failAuthHeader: "Absence de header Authorization.", + failAuthToken: "Token invalide ou utilisateur non trouvé.", + failAuthId: "Identifiant non valide : ", + failAuthCron: "Tentative de lancement d'un cron sans le bon token.", + previousPage: "Page précédente", + nextPage: "Page suivante", + btnLinkToQuestionnaire: "Aller au quiz !", + statsAdmin: "Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
    En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
    Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium." +}; + +/***/ }), + +/***/ "../lang/fr/user.js": +/*!**************************!*\ + !*** ../lang/fr/user.js ***! + \**************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + notFound: "L'utilisateur n'a pas été trouvé.", + needName: "Merci de choisir un nom d'utilisateur.", + needNotTooLongName: "Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.", + needEmail: "Merci de saisir votre adresse e-mail.", + needUniqueEmail: "L'adresse e-mail que vous avez saisie est déjà utilisée par un autre utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.", + needNotTooLongEmail: "Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.", + needPassWord: "Merci de fournir un mot de passe.", + needLongPassWord: "Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.", + passwordCopied: "Le mot de passe généré a été copié dans le presse-papier. Vous pouvez le recopier où vous le souhaiter.", + needStatus: "Il manque le statut.", + needLanguage: "Il manque le code langue.", + needValidLastConnectionDate: "La date de dernière connexion n'est pas valide.", + needSMTP: "Il manque le serveur SMTP.", + needSMTPNotFound: "Il manque le serveur SMTP.", + needKnowNewsletterOk: "Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.", + needTimeDifference: "Il faut connaître le nombre de minutes du décalage horaire.", + needMinTimeDifference: "Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.", + needMaxTimeDifference: "Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.", + needUGCOk: "Vous devez accepter les CGU pour pouvoir créer votre compte. ", + godfatherNotFound: "Aucun utilisateur valide trouvé pour ce code parrain.", + godfatherFound: "Votre parrain a bien été trouvé !", + mailValidationMessage: "Votre inscription est bien enregistrée.\nPour la finaliser, merci de cliquer dans les 24H sur le lien de confirmation qui vient de vous être envoyé par e-mail.", + mailValidationLinkSubject: "Merci de valider votre compte", + mailValidationLinkSBodyTxt: "Bonjour USER_NAME,\n\nPour valider votre compte, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL", + mailValidationLinkSBodyHTML: "

    Bonjour USER_NAME,

    Pour valider votre compte, merci de cliquer sur le lien suivant dans les 24h.

    Valider.

    ", + validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue !
    Vous pouvez sans tarder vous connecter ci-dessous pour accéder à votre compte.", + validationMessageAdmin: "Le compte a bien été validé.", + validationAlreadyMessage: "Il semble que vous ayez déjà validé votre compte.", + validationAlreadyMessageAdmin: "Ce compte a déjà été validé.", + mailWelcomeSubject: "Bienvenue !", + mailWelcomeBodyTxt: "Bonjour USER_NAME,\nVotre venez de valider votre inscription à NOM_SITE.\nMerci et à bientôt !", + mailWelcomeBodyHTML: "

    Bonjour USER_NAME,

    Votre venez de valider votre inscription à NOM_SITE.

    Merci et à bientôt !

    ", + mailThankGodfatherSubject: "Merci !", + mailThankGodfatherBodyTxt: "Bonjour USER_NAME,\nGrâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nMerci et à bientôt !", + mailThankGodfatherBodyHTML: "

    Bonjour USER_NAME,

    Grâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.

    Merci et à bientôt !

    ", + badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.", + emailNotFound: "Aucun utilisateur trouvé pour cette adresse e-mail.", + alreadyConnected: "Vous êtes déjà connecté(e) au site !", + needBeConnected: "Vous devez être connecté(e) pour accéder à cette page.", + connectionOk: "Connexion réussie.", + needChooseLoginWay: "Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.", + needValidationToLogin: "Vous devez d'abord valider votre compte avant de vous connecter. Pour ce faire, un lien vient de vous être envoyé par e-mail.", + tooManyLoginFails: "Trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.", + badPassword: "Le mot de passe n'est pas le bon.", + mailLoginLinkSubject: "Votre lien de connexion.", + mailLoginLinkBodyTxt: "Bonjour USER_NAME,\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : LINK_URL", + mailLoginLinkBodyHTML: "

    Bonjour USER_NAME,

    Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :

    Valider.

    ", + mailLoginLinkMessage: "Un lien de connexion vient de vous être envoyé sur votre adresse e-mail. Ne tardez pas à l'utiliser, car il n'est valable que durant ", + updatedOkMessage: "Vos informations ont bien été mises à jour.", + updatedNeedGoodEmail: "Mais la nouvelle adresse e-mail n'a pu être enregistrée car elle n'a pas une format correct.", + updatedNeedUniqueEmail: "Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.", + mailUpdateLoginSubject: "Merci de valider vos nouveaux identifiants.", + mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL", + mailUpdateLoginBodyHTML: "

    Bonjour USER_NAME,

    Pour valider vos nouveaux identifiants de connexion, cliquez ici sans tarder.

    ", + mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (email et/ou mot de passe) et vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement. En attendant, merci de continuer à utiliser vos anciens identifiants.", + updatedNeedValidatedUser: "L'utilisateur que vous souhaité modifier n'existe pas/plus ou n'a pas encore validé son compte.", + updatedNeedGoodGodfather: "Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.", + mailUpdateLoginOkMessage: "La mise à jour de vos identifiants a bien été enregistrée.", + updatedFailedGodfatherNotFound: "L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.", + creationOkMessage: "Le nouvel utilisateur a bien été enregistré.", + mailDeleteSubject: "Confirmer la suppression de votre compte.", + mailDeleteBodyTxt: "Bonjour USER_NAME,\nPour valider la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL", + mailDeleteBodyHTML: "

    Bonjour USER_NAME,

    Pour valider la suppression de votre compte, cliquez ici sans tarder.

    ", + mailDeleteLinkMessage: "Votre demande de suppression a bien été enregistrée. Merci de cliquer sans tarder sur le lien qui vient de vous être envoyé par e-mail pour confirmer.", + deleteOkMessage: "L'utilisateur a bien été supprimé.", + deleteFailMessage: "Tentative de suppression d'un utilisateur inexistant : ", + mailDeleteLinkOkMessage: "Votre compte a bien été supprimé. Merci d'avoir utilisé nos services.", + mailDeleteLinkAlreadyMessage: "Il semble que vous ayez déjà validé la suppression de votre compte.", + mailDeleteLinkFailMessage: "Votre lien de suppression n'est pas valide ou alors il n'est plus valable.", + cronDeleteUnvalidedUsersMessage: " comptes utilisateurs non validés ont été supprimés.", + deleteInactiveUsersMessage: " comptes utilisateurs inactifs ont été supprimés.", + welcomeMessage: "Bienvenue #NAME !", + byebyeMessage: "Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
    À bientôt !", + infosUserForAdmin: "Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
    Date de sa dernière connexion : DATE_CONNECTION.", + infosAdminGodfather: "Cet utilisateur a été parrainé par ", + infosAdminNbGodChilds: "Ses #NB filleuils : " +}; + +/***/ }), + +/***/ "../tools/main.js": +/*!************************!*\ + !*** ../tools/main.js ***! + \************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +// Quelques fonctions utiles pour les chaînes +var Tool = /*#__PURE__*/function () { + function Tool() { + _classCallCheck(this, Tool); + } + + _createClass(Tool, null, [{ + key: "isEmpty", + value: function isEmpty(myVar) { + if (myVar === undefined || myVar === null) return true;else { + myVar += ""; // si autre chose qu'une chaîne envoyé... + + myVar = myVar.trim(); + if (myVar === "") return true;else return false; + } + } + }, { + key: "trimIfNotNull", + value: function trimIfNotNull(myString) { + if (Tool.isEmpty(myString)) myString = null;else { + myString += ""; // si autre chose qu'une chaîne envoyé... + + myString = myString.trim(); + } + return myString; + } + }, { + key: "shortenIfLongerThan", + value: function shortenIfLongerThan(myString, max) { + myString += ""; // au cas où cela ne serait pas une chaîne... + + if (myString.length > max) myString = myString.substring(0, max - 3) + "..."; + return myString; + } // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings + + }, { + key: "replaceAll", + value: function replaceAll(myString, mapObj) { + var replaceElts = new RegExp(Object.keys(mapObj).join("|"), "gi"); + return myString.replace(replaceElts, function (matched) { + return mapObj[matched]; + }); + } // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random + + }, { + key: "getRandomInt", + value: function getRandomInt(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min)) + min; + } // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country + + }, { + key: "dateFormat", + value: function dateFormat(dateString) { + var lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "fr"; + if (Tool.isEmpty(dateString)) return ""; + var myDate = new Date(dateString); + var myDay = myDate.getDate() + ""; + if (myDay.length === 1) myDay = "0" + myDay; + var myMounth = myDate.getMonth() + 1 + ""; + if (myMounth.length === 1) myMounth = "0" + myMounth; + var myYear = myDate.getFullYear(); + if (lang === "fr") return myDay + "/" + myMounth + "/" + myYear;else if (lang === "form") // 2014-02-09 + return myYear + "-" + myMounth + "-" + myDay;else return myMounth + "/" + myDay + "/" + myYear; + } + }]); + + return Tool; +}(); + +module.exports = Tool; + +/***/ }), + +/***/ "../views sync recursive ^\\.\\/.*\\.js$": +/*!**********************************!*\ + !*** ../views sync ^\.\/.*\.js$ ***! + \**********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./default/config/fr.js": "../views/default/config/fr.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../views sync recursive ^\\.\\/.*\\.js$"; + +/***/ }), + +/***/ "../views/default/config/fr.js": +/*!*************************************!*\ + !*** ../views/default/config/fr.js ***! + \*************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + headLinks: [{ + anchor: "Accueil", + attributes: { + href: "/" + } + }, { + anchor: "Mon compte", + attributes: { + href: "/connexion.hmt", + id: "accountHeadLink" + } + }, { + anchor: "À propos", + attributes: { + href: "/a-propos.html" + } + }, { + anchor: "Contact", + attributes: { + href: "/contact.html" + } + }], + footLinks: [{ + anchor: "Crédits", + attributes: { + href: "/credits.html" + } + }, { + anchor: "Mentions légales", + attributes: { + href: "/mentions-legales.html", + rel: "nofollow" + } + }, { + anchor: "Données personnelles", + attributes: { + href: "/donnees.html" + } + }, { + anchor: "C.G.U.", + attributes: { + href: "/cgu.html", + rel: "nofollow" + } + }, { + anchor: "C.G.V.", + attributes: { + href: "/cgv.html", + rel: "nofollow" + } + }], + maxQuestionnairesByPage: 10, + userHomePage: "accueil.html", + adminHomePage: "admin.html", + managerHomePage: "gestion.html", + subscribePage: "inscription.html", + connectionPage: "connexion.html", + accountPage: "compte.html", + questionnairesManagementPage: "gestion-quizs.html", + usersManagementPage: "gestion-utilisateurs.html", + nbQuestionnairesUserHomePage: 10, + illustrationDir: "/img/quizs/", + siteSlogan: "Cultivons notre jardin !", + homeTitle1: "De nature curieuse ?", + homeP1: "Avec WikiLerni vous apprenez chaque jour de nouvelles choses.
    Des articles de Wikipédia sont sélectionnés pour vous et sont suivis d'un quiz vous permettant de tester ce que vous en avez retenu.
    De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre \"jardin\".", + homeTitle2: "La culture en liberté", + homeP2: "Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
    Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
    Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
    Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.

    (*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.", + newQuestionnairesTitle: "Les derniers quizs publiés sur WikiLerni", + newQuestionnairesIntro: "Liste des derniers quizs publiés sur WikiLerni.", + explanationTitle: "Vous découvrez WikiLerni ?", + explanationTxt: "Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
    Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.

    Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.

    Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)

    Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
    Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.

    Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.", + noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript." +}; + +/***/ }), + +/***/ "./src/newLoginValidation.js": +/*!***********************************!*\ + !*** ./src/newLoginValidation.js ***! + \***********************************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ "../config/instance.js"); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js"); +/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js"); +/* harmony import */ var _tools_url_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/url.js */ "./src/tools/url.js"); +/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./tools/users.js */ "./src/tools/users.js"); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + +// -- PAGE PERMETTANT DE VALIDER UN CHANGEMENT D'EMAIL OU DE MOT DE PASSE +/// Un token est transmis en paramètre de l'Url. Il a une validité limité dans le temps. +/// Si le token est ok, on valide la mise à jour et redirige l'utilisateur vers sa page d'accueil +// Fichier de configuration côté client : + +var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0]; + +var configFrontEnd = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); // Importation des fonctions utile au script : + + + + + + + // Dictionnaires : + +var txt = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + lang + "/general"); + +var txtUsers = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/user$")("./" + lang + "/user"); + +var divResponse = document.getElementById("response"); +Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["helloDev"])(); +var config; + +var initialise = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + var datas, xhr; + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _context.prev = 0; + _context.next = 3; + return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_5__["getConfig"])(); + + case 3: + config = _context.sent; + if (!config) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]);else { + datas = Object(_tools_url_js__WEBPACK_IMPORTED_MODULE_4__["getUrlParams"])(); + + if (datas && datas.t !== undefined) { + xhr = new XMLHttpRequest(); + xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.userRoutes + config.checkNewLoginLinkRoute + datas.t); + + xhr.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var response = JSON.parse(this.responseText); + + if (this.status === 200 && response.message != undefined) { + Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["saveLocaly"])("message", { + message: response.message, + color: "success" + }); // pour l'afficher sur la page suivante + + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", response.message, "", ["success"]); // au cas où blocage redirection + + window.location.assign("/" + configFrontEnd.userHomePage); // que user possible ici + } else if (this.status === 404 && response.errors != undefined) { + if (Array.isArray(response.errors)) response.errors = response.errors.join("
    ");else response.errors = txt.serverError; + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", response.errors, "", ["error"]); + } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txtUsers.badLinkValidationMessage.replace("#URL", configFrontEnd.accountPage), "", ["error"]); + } + }; + + xhr.setRequestHeader("Authorization", "Bearer " + datas.t); + xhr.send(); + } + } + _context.next = 11; + break; + + case 7: + _context.prev = 7; + _context.t0 = _context["catch"](0); + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]); + console.error(_context.t0); + + case 11: + case "end": + return _context.stop(); + } + } + }, _callee, null, [[0, 7]]); + })); + + return function initialise() { + return _ref.apply(this, arguments); + }; +}(); + +initialise(); + +/***/ }), + +/***/ "./src/tools/clientstorage.js": +/*!************************************!*\ + !*** ./src/tools/clientstorage.js ***! + \************************************/ +/*! exports provided: saveLocaly, getLocaly, removeLocaly */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveLocaly", function() { return saveLocaly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaly", function() { return getLocaly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeLocaly", function() { return removeLocaly; }); +// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.) +// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie +var saveLocaly = function saveLocaly(name, data) { + localStorage.setItem(name, JSON.stringify(data)); +}; +var getLocaly = function getLocaly(name) { + var json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name); +}; +var removeLocaly = function removeLocaly(name) { + localStorage.removeItem(name); +}; + +/***/ }), + +/***/ "./src/tools/dom.js": +/*!**************************!*\ + !*** ./src/tools/dom.js ***! + \**************************/ +/*! exports provided: addElement */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addElement", function() { return addElement; }); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__); +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + + // Fonction associant les attributs fournis à un champ de formulaire + +var addElement = function addElement(eltParent, eltType) { + var eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; + var eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; + var eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : []; + var eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; + var replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true; + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltType) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltParent)) return false;else { + var newElement = document.createElement(eltType); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ? + newElement.id = eltId; + + if (Array.isArray(eltClass) && eltClass.length != 0) { + for (var i in eltClass) { + newElement.classList.add(eltClass[i]); + } + } + + if (_typeof(eltAttributes) === "object") // !! tous les objets ne sont pas ok + { + for (var attributName in eltAttributes) { + newElement.setAttribute(attributName, eltAttributes[attributName]); + } + } + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltContent)) newElement.innerHTML = eltContent.replace(/\n/g, "
    "); // innerHTML permet d'ajouter du texte ayant lui-même des balises, etc. + + if (replace) eltParent.innerHTML = ""; + eltParent.appendChild(newElement); + } +}; + +/***/ }), + +/***/ "./src/tools/everywhere.js": +/*!*********************************!*\ + !*** ./src/tools/everywhere.js ***! + \*********************************/ +/*! exports provided: helloDev, updateAccountLink */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "helloDev", function() { return helloDev; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateAccountLink", function() { return updateAccountLink; }); +// Ce script fournit des fonctions utilisées sur toutes les pages du site +var helloDev = function helloDev() { + console.log("**** Hello ami développeur :-)\n Le code de WikiLerni est libre et est lisible sur gitlab : \n Bonne lecture :-) \n Pour les suggestions d'amélioration ou questions : dev@wililerni.com ****"); + return true; +}; +var updateAccountLink = function updateAccountLink(status, configTemplate) { + var link = document.getElementById("accountHeadLink"); + var homePage = status + "HomePage"; + link.href = "/" + configTemplate[homePage]; +}; + +/***/ }), + +/***/ "./src/tools/url.js": +/*!**************************!*\ + !*** ./src/tools/url.js ***! + \**************************/ +/*! exports provided: getUrlParams */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getUrlParams", function() { return getUrlParams; }); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__); + // Fonction récupérant les paramètres passés par l'url + +var getUrlParams = function getUrlParams() { + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(location.search)) return false; + var parameters = location.search.substring(1).split("&"); + if (!Array.isArray(parameters) || parameters.length === 0) return false; + var param, + datas = {}; + + for (var i in parameters) { + param = parameters[i].split("="); + if (param.length === 2) datas[param[0]] = decodeURI(param[1]); + } + + return datas; +}; + +/***/ }), + +/***/ "./src/tools/users.js": +/*!****************************!*\ + !*** ./src/tools/users.js ***! + \****************************/ +/*! exports provided: getConfig, getTimeDifference, getPassword, setSession, checkAnswerDatas, checkSession */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getConfig", function() { return getConfig; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTimeDifference", function() { return getTimeDifference; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getPassword", function() { return getPassword; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setSession", function() { return setSession; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkAnswerDatas", function() { return checkAnswerDatas; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkSession", function() { return checkSession; }); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/instance.js */ "../config/instance.js"); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../config/users.js */ "../config/users.js"); +/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_3__); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + + +var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0]; + +var configTemplate = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); + + + + // Récupère les données de configuration des utilisateurs +// À terme, un fichier statique importable comme module devrait éviter une requête ajax + +var getConfig = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + return _context.abrupt("return", new Promise(function (resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + "/user/getconfig"); + + xhr.onload = function () { + return resolve(JSON.parse(xhr.responseText)); + }; + + xhr.onerror = function () { + return reject(xhr.statusText); + }; + + xhr.send(); + })); + + case 1: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + + return function getConfig() { + return _ref.apply(this, arguments); + }; +}(); +var getTimeDifference = function getTimeDifference() { + var timeLocal = new Date().getTimezoneOffset(); + if (timeLocal > _config_users_js__WEBPACK_IMPORTED_MODULE_1__["timeDifferenceMax"] || timeLocal < _config_users_js__WEBPACK_IMPORTED_MODULE_1__["timeDifferenceMin"]) return 0;else return timeLocal; +}; // On enlève volontairement les 0/O pour éviter les confusions ! +// Et mieux vaut aussi débuter et finir par une lettre simple. + +var getPassword = function getPassword(nbCarMin, nbCarMax) { + var nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin)); + var letters = "ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz"; + var others = "123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ"; + var password = letters[Math.floor(Math.random() * letters.length)]; + + for (var i = 1; i < nbCar - 1; i++) { + if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)]; + } + + password += letters[Math.floor(Math.random() * letters.length)]; + return password; +}; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite +// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides. + +var setSession = function setSession(userId, token, durationTS) { + var storageUser = { + id: userId, + token: token, + duration: durationTS + }; + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("user", storageUser); +}; // Vérifie qu'il y a des données locales concernant le résultat d'un quiz +// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas + +var checkAnswerDatas = function checkAnswerDatas(datas) { + var lastAnswer = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("lastAnswer"); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(lastAnswer)) { + var answer = JSON.parse(lastAnswer); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.duration) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbCorrectAnswers) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.QuestionnaireId) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbQuestions)) { + datas.duration = answer.duration; + datas.nbCorrectAnswers = answer.nbCorrectAnswers; + datas.QuestionnaireId = answer.QuestionnaireId; + datas.nbQuestions = answer.nbQuestions; + } + } + + return datas; +}; // Cette fonction teste la connexion de l'utilisateur d'une page +// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté + +var checkSession = /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() { + var status, + urlRedirection, + message, + urlWanted, + _args2 = arguments; + return regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + status = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : []; + urlRedirection = _args2.length > 1 ? _args2[1] : undefined; + message = _args2.length > 2 ? _args2[2] : undefined; + urlWanted = _args2.length > 3 ? _args2[3] : undefined; + return _context2.abrupt("return", new Promise(function (resolve, reject) { + var userDatas = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("user"); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(userDatas)) { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else { + var user = JSON.parse(userDatas); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.id) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.token) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.duration) || user.duration < Date.now()) { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else { + var xhr = new XMLHttpRequest(); + xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["userRoutes"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["checkLoginRoute"] + user.token); + + xhr.onload = function () { + var response = JSON.parse(xhr.responseText); + + if (xhr.status === 200 && response.isValid && response.id != undefined) { + if (response.id === user.id) { + user.name = response.name; + user.language = response.language; + user.timeDifference = response.timeDifference; + user.status = response.status; // le token et de toute façon vérifier à chaque requête à l'API + + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("user", user); // si il s'agit d'un "user" et que son abonnement a expiré, je le redirige vers la caisse :-) + + if (response.status === "user" && response.nbDaysOk <= 0) { + var urlAccount = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["siteUrl"] + "/" + configTemplate[lang].accountPage; + if (window.location.href.indexOf(urlAccount) === -1) window.location.assign("/" + configTemplate[lang].accountPage); // passée directement ici, l'ancre #subscribe ne fonctionne pas !? + + resolve(true); + } else { + if (status.length !== 0 && status.indexOf(response.status) === -1) { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else resolve(true); + } + } else { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + } else { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + }; + + xhr.onerror = function () { + return reject(xhr.statusText); + }; + + xhr.send(); + } + } + })); + + case 5: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + + return function checkSession() { + return _ref2.apply(this, arguments); + }; +}(); // Cette fonction sert à la précédente en cas de connexion non valide + +var redirectUser = function redirectUser(urlRedirection, message, urlWanted) { + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(message)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("message", message); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlWanted)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("url", urlWanted); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlRedirection)) window.location.assign(urlRedirection); +}; + +/***/ }) + +/******/ }); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9nZW5lcmFsJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3VzZXIkIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL2dlbmVyYWwuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcvZnIvdXNlci5qcyIsIndlYnBhY2s6Ly8vLi4vdG9vbHMvbWFpbi5qcyIsIndlYnBhY2s6Ly8vLi4vdmlld3Mgc3luYyBeXFwuXFwvLipcXC5qcyQiLCJ3ZWJwYWNrOi8vLy4uL3ZpZXdzL2RlZmF1bHQvY29uZmlnL2ZyLmpzIiwid2VicGFjazovLy8uL3NyYy9uZXdMb2dpblZhbGlkYXRpb24uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2RvbS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvZXZlcnl3aGVyZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvdXJsLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy91c2Vycy5qcyJdLCJuYW1lcyI6WyJ1c2VycyIsInJlcXVpcmUiLCJxdWVzdGlvbm5haXJlcyIsIm1vZHVsZSIsImV4cG9ydHMiLCJhcGlVcmwiLCJzaXRlVXJsIiwiYWRtaW5OYW1lIiwiYWRtaW5FbWFpbCIsInNlbmRlck5hbWUiLCJzZW5kZXJFbWFpbCIsImFkbWluTGFuZyIsInRoZW1lIiwiYXZhaWxhYmxlTGFuZ3MiLCJzaXRlTmFtZSIsImJlZ2luQ29kZUdvZGZhdGhlciIsImNyb25UaW1pbmdBbGVydEluU2Vjb25kZSIsInJlc3BvbnNlVGltaW5nQWxlcnRJblNlY29uZGUiLCJ0b2tlblNpZ251cFZhbGlkYXRpb25UaW1lSW5Ib3VycyIsInRva2VuTG9naW5MaW5rVGltZUluSG91cnMiLCJ0b2tlbkNvbm5leGlvbk1pblRpbWVJbkhvdXJzIiwidG9rZW5Db25uZXhpb25NYXhUaW1lSW5EYXlzIiwidG9rZW5Mb2dpbkNoYW5naW5nVGltZUluSG91cnMiLCJ0b2tlbkRlbGV0ZVVzZXJUaW1lSW5Ib3VycyIsInRva2VuVW5zdWJzY3JpYmVMaW5rVGltZUluRGF5cyIsImZyZWVBY2NvdW50VGltaW5nSW5EYXlzIiwiZnJlZUFjY291bnRFeHBpcmF0aW9uTm90aWZpY2F0aW9uSW5EYXlzIiwiYWNjb3VudEV4cGlyYXRpb25GaXJzdE5vdGlmaWNhdGlvbkluRGF5cyIsImFjY291bnRFeHBpcmF0aW9uU2Vjb25kTm90aWZpY2F0aW9uSW5EYXlzIiwiaW5hY3RpdmVBY2NvdW50VGltZVRvRGVsZXRlSW5EYXlzIiwibmJRdWVzdGlvbnNNaW4iLCJuYlF1ZXN0aW9uc01heCIsIm5iQ2hvaWNlc01heCIsIm5iTmV3UXVlc3Rpb25uYWlyZXMiLCJob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVCZWdpbiIsImhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUVuZCIsIm51bWJlck5ld1F1ZXN0aW9ubmFpcmVBdFNhbWVUaW1lIiwibWluU2VhcmNoUXVlc3Rpb25uYWlyZXMiLCJuYklsbHVzdHJhdGlvbnNNaW4iLCJuYklsbHVzdHJhdGlvbnNNYXgiLCJtYXhJbGx1c3RyYXRpb25TaXplaW5PY3RldCIsIm1pbWVUeXBlc0ZvcklsbHVzdHJhdGlvbiIsImlsbHVzdHJhdGlvbnNXaWR0aE1heEluUHgiLCJpbGx1c3RyYXRpb25zTWluaWF0dXJlc1dpZHRoTWF4SW5QeCIsIm5iTGlua3NNaW4iLCJuYkxpbmtzTWF4IiwicGFzc3dvcmQiLCJtaW5sZW5ndGgiLCJkaXJDYWNoZVVzZXJzIiwiZGlyQ2FjaGVVc2Vyc0Fuc3dlcnMiLCJkaXJDYWNoZVF1ZXN0aW9ubmFpcmVzIiwiZGlyQ2FjaGVRdWVzdGlvbnMiLCJkaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXMiLCJkaXJIVE1MUXVlc3Rpb25uYWlyZSIsImRpcldlYlF1ZXN0aW9ubmFpcmUiLCJxdWVzdGlvbm5haXJlUm91dGVzIiwiZ2V0UXVlc3Rpb25uYWlyZVJvdXRlcyIsInByZXZpZXdRdWVzdGlvbm5haXJlUm91dGVzIiwicHVibGlzaGVkUXVlc3Rpb25uYWlyZVJvdXRlcyIsInNhdmVBbnN3ZXJzUm91dGUiLCJnZXRTdGF0c1F1ZXN0aW9ubmFpcmVzIiwic2VhcmNoUXVlc3Rpb25uYWlyZXNSb3V0ZSIsInNlYXJjaEFkbWluUXVlc3Rpb25uYWlyZXNSb3V0ZSIsImdldExpc3ROZXh0UXVlc3Rpb25uYWlyZXMiLCJxdWVzdGlvbnNSb3V0ZSIsInRhZ3NTZWFyY2hSb3V0ZSIsImdldFF1ZXN0aW9ubmFpcmVzV2l0aG91dEFuc3dlciIsImdldFByZXZpb3VzQW5zd2VycyIsImdldFN0YXRzQW5zd2VycyIsImdldEFkbWluU3RhdHMiLCJRdWVzdGlvbm5haXJlIiwidGl0bGUiLCJtYXhsZW5ndGgiLCJyZXF1aXJlZCIsInNsdWciLCJpbnRyb2R1Y3Rpb24iLCJzZWFyY2hRdWVzdGlvbm5haXJlcyIsIlF1ZXN0aW9uIiwidGV4dCIsInJhbmsiLCJtaW4iLCJkZWZhdWx0VmFsdWUiLCJDaG9pY2UiLCJuYlRhZ3NNaW4iLCJuYlRhZ3NNYXgiLCJkaXJDYWNoZVRhZ3MiLCJkaXJIVE1MVGFncyIsImRpcldlYlRhZ3MiLCJ1c2VyUm91dGVzIiwic3Vic2NyaWJlUm91dGUiLCJnZXRHb2RmYXRoZXJSb3V0ZSIsImNoZWNrSWZJc0VtYWlsZnJlZVJvdXRlIiwiY2hlY2tTdWJzY3JpYmVUb2tlblJvdXRlIiwiY2hlY2tMb2dpblJvdXRlIiwiY29ubmVjdGlvblJvdXRlIiwiZ2V0TG9naW5MaW5rUm91dGUiLCJjb25uZWN0aW9uV2l0aExpbmtSb3V0ZSIsImdldFVzZXJJbmZvcyIsImNyZWF0ZVVzZXJSb3V0ZSIsInZhbGlkYXRlVXNlclJvdXRlIiwidXBkYXRlVXNlckluZm9zIiwic2VhcmNoVXNlclJvdXRlIiwiZ2V0R29kQ2hpbGRzIiwiY2hlY2tOZXdMb2dpbkxpbmtSb3V0ZSIsImNoZWNrRGVsZXRlTGlua1JvdXRlIiwiZ2V0UGF5bWVudHMiLCJ1bnN1YnNjcmliZVJvdXRlIiwibmFtZSIsImVtYWlsIiwibmV3UGFzc3dvcmQiLCJjb2RlR29kZmF0aGVyIiwiY2d1T2siLCJ2YWx1ZSIsInRpbWVEaWZmZXJlbmNlTWluIiwidGltZURpZmZlcmVuY2VNYXgiLCJzaXRlSFRNTFRpdGxlIiwic2l0ZU1ldGFEZXNjcmlwdGlvbiIsInNjcmlwdFRpbWluZ0luZm8iLCJzY3JpcHRUaW1pbmdBbGVydCIsInNlcnZlckVycm9yIiwic2VydmVyRXJyb3JBZG1pbiIsIm5lZWRlZFBhcmFtcyIsImJhZFVybCIsIm5vdFZhbGlkRm9ybWF0Iiwibm90QWxsb3dlZCIsIm5vdFJlcXVpcmVkIiwidXBkYXRlQnRuVHh0IiwiYWRkQnRuVHh0IiwiZGVsZXRlQnRuVHh0IiwiYWRkT2tNZXNzYWdlIiwidXBkYXRlT2tNZXNzYWdlIiwiZGVsZXRlT2tNZXNzYWdlIiwiZmFpbEF1dGgiLCJmYWlsQXV0aEhlYWRlciIsImZhaWxBdXRoVG9rZW4iLCJmYWlsQXV0aElkIiwiZmFpbEF1dGhDcm9uIiwicHJldmlvdXNQYWdlIiwibmV4dFBhZ2UiLCJidG5MaW5rVG9RdWVzdGlvbm5haXJlIiwic3RhdHNBZG1pbiIsIm5vdEZvdW5kIiwibmVlZE5hbWUiLCJuZWVkTm90VG9vTG9uZ05hbWUiLCJuZWVkRW1haWwiLCJuZWVkVW5pcXVlRW1haWwiLCJuZWVkTm90VG9vTG9uZ0VtYWlsIiwibmVlZFBhc3NXb3JkIiwibmVlZExvbmdQYXNzV29yZCIsInBhc3N3b3JkQ29waWVkIiwibmVlZFN0YXR1cyIsIm5lZWRMYW5ndWFnZSIsIm5lZWRWYWxpZExhc3RDb25uZWN0aW9uRGF0ZSIsIm5lZWRTTVRQIiwibmVlZFNNVFBOb3RGb3VuZCIsIm5lZWRLbm93TmV3c2xldHRlck9rIiwibmVlZFRpbWVEaWZmZXJlbmNlIiwibmVlZE1pblRpbWVEaWZmZXJlbmNlIiwibmVlZE1heFRpbWVEaWZmZXJlbmNlIiwibmVlZFVHQ09rIiwiZ29kZmF0aGVyTm90Rm91bmQiLCJnb2RmYXRoZXJGb3VuZCIsIm1haWxWYWxpZGF0aW9uTWVzc2FnZSIsIm1haWxWYWxpZGF0aW9uTGlua1N1YmplY3QiLCJtYWlsVmFsaWRhdGlvbkxpbmtTQm9keVR4dCIsIm1haWxWYWxpZGF0aW9uTGlua1NCb2R5SFRNTCIsInZhbGlkYXRpb25NZXNzYWdlIiwidmFsaWRhdGlvbk1lc3NhZ2VBZG1pbiIsInZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZSIsInZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZUFkbWluIiwibWFpbFdlbGNvbWVTdWJqZWN0IiwibWFpbFdlbGNvbWVCb2R5VHh0IiwibWFpbFdlbGNvbWVCb2R5SFRNTCIsIm1haWxUaGFua0dvZGZhdGhlclN1YmplY3QiLCJtYWlsVGhhbmtHb2RmYXRoZXJCb2R5VHh0IiwibWFpbFRoYW5rR29kZmF0aGVyQm9keUhUTUwiLCJiYWRMaW5rVmFsaWRhdGlvbk1lc3NhZ2UiLCJlbWFpbE5vdEZvdW5kIiwiYWxyZWFkeUNvbm5lY3RlZCIsIm5lZWRCZUNvbm5lY3RlZCIsImNvbm5lY3Rpb25PayIsIm5lZWRDaG9vc2VMb2dpbldheSIsIm5lZWRWYWxpZGF0aW9uVG9Mb2dpbiIsInRvb01hbnlMb2dpbkZhaWxzIiwiYmFkUGFzc3dvcmQiLCJtYWlsTG9naW5MaW5rU3ViamVjdCIsIm1haWxMb2dpbkxpbmtCb2R5VHh0IiwibWFpbExvZ2luTGlua0JvZHlIVE1MIiwibWFpbExvZ2luTGlua01lc3NhZ2UiLCJ1cGRhdGVkT2tNZXNzYWdlIiwidXBkYXRlZE5lZWRHb29kRW1haWwiLCJ1cGRhdGVkTmVlZFVuaXF1ZUVtYWlsIiwibWFpbFVwZGF0ZUxvZ2luU3ViamVjdCIsIm1haWxVcGRhdGVMb2dpbkJvZHlUeHQiLCJtYWlsVXBkYXRlTG9naW5Cb2R5SFRNTCIsIm1haWxVcGRhdGVMb2dpbkxpbmtNZXNzYWdlIiwidXBkYXRlZE5lZWRWYWxpZGF0ZWRVc2VyIiwidXBkYXRlZE5lZWRHb29kR29kZmF0aGVyIiwibWFpbFVwZGF0ZUxvZ2luT2tNZXNzYWdlIiwidXBkYXRlZEZhaWxlZEdvZGZhdGhlck5vdEZvdW5kIiwiY3JlYXRpb25Pa01lc3NhZ2UiLCJtYWlsRGVsZXRlU3ViamVjdCIsIm1haWxEZWxldGVCb2R5VHh0IiwibWFpbERlbGV0ZUJvZHlIVE1MIiwibWFpbERlbGV0ZUxpbmtNZXNzYWdlIiwiZGVsZXRlRmFpbE1lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua09rTWVzc2FnZSIsIm1haWxEZWxldGVMaW5rQWxyZWFkeU1lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua0ZhaWxNZXNzYWdlIiwiY3JvbkRlbGV0ZVVudmFsaWRlZFVzZXJzTWVzc2FnZSIsImRlbGV0ZUluYWN0aXZlVXNlcnNNZXNzYWdlIiwid2VsY29tZU1lc3NhZ2UiLCJieWVieWVNZXNzYWdlIiwiaW5mb3NVc2VyRm9yQWRtaW4iLCJpbmZvc0FkbWluR29kZmF0aGVyIiwiaW5mb3NBZG1pbk5iR29kQ2hpbGRzIiwiVG9vbCIsIm15VmFyIiwidW5kZWZpbmVkIiwidHJpbSIsIm15U3RyaW5nIiwiaXNFbXB0eSIsIm1heCIsImxlbmd0aCIsInN1YnN0cmluZyIsIm1hcE9iaiIsInJlcGxhY2VFbHRzIiwiUmVnRXhwIiwiT2JqZWN0Iiwia2V5cyIsImpvaW4iLCJyZXBsYWNlIiwibWF0Y2hlZCIsIk1hdGgiLCJjZWlsIiwiZmxvb3IiLCJyYW5kb20iLCJkYXRlU3RyaW5nIiwibGFuZyIsIm15RGF0ZSIsIkRhdGUiLCJteURheSIsImdldERhdGUiLCJteU1vdW50aCIsImdldE1vbnRoIiwibXlZZWFyIiwiZ2V0RnVsbFllYXIiLCJoZWFkTGlua3MiLCJhbmNob3IiLCJhdHRyaWJ1dGVzIiwiaHJlZiIsImlkIiwiZm9vdExpbmtzIiwicmVsIiwibWF4UXVlc3Rpb25uYWlyZXNCeVBhZ2UiLCJ1c2VySG9tZVBhZ2UiLCJhZG1pbkhvbWVQYWdlIiwibWFuYWdlckhvbWVQYWdlIiwic3Vic2NyaWJlUGFnZSIsImNvbm5lY3Rpb25QYWdlIiwiYWNjb3VudFBhZ2UiLCJxdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlIiwidXNlcnNNYW5hZ2VtZW50UGFnZSIsIm5iUXVlc3Rpb25uYWlyZXNVc2VySG9tZVBhZ2UiLCJpbGx1c3RyYXRpb25EaXIiLCJzaXRlU2xvZ2FuIiwiaG9tZVRpdGxlMSIsImhvbWVQMSIsImhvbWVUaXRsZTIiLCJob21lUDIiLCJuZXdRdWVzdGlvbm5haXJlc1RpdGxlIiwibmV3UXVlc3Rpb25uYWlyZXNJbnRybyIsImV4cGxhbmF0aW9uVGl0bGUiLCJleHBsYW5hdGlvblR4dCIsIm5vSlNOb3RpZmljYXRpb24iLCJjb25maWdGcm9udEVuZCIsInR4dCIsInR4dFVzZXJzIiwiZGl2UmVzcG9uc2UiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwiaGVsbG9EZXYiLCJjb25maWciLCJpbml0aWFsaXNlIiwiZ2V0Q29uZmlnIiwiYWRkRWxlbWVudCIsImRhdGFzIiwiZ2V0VXJsUGFyYW1zIiwidCIsInhociIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsIm9ucmVhZHlzdGF0ZWNoYW5nZSIsInJlYWR5U3RhdGUiLCJET05FIiwicmVzcG9uc2UiLCJKU09OIiwicGFyc2UiLCJyZXNwb25zZVRleHQiLCJzdGF0dXMiLCJtZXNzYWdlIiwic2F2ZUxvY2FseSIsImNvbG9yIiwid2luZG93IiwibG9jYXRpb24iLCJhc3NpZ24iLCJlcnJvcnMiLCJBcnJheSIsImlzQXJyYXkiLCJzZXRSZXF1ZXN0SGVhZGVyIiwic2VuZCIsImNvbnNvbGUiLCJlcnJvciIsImRhdGEiLCJsb2NhbFN0b3JhZ2UiLCJzZXRJdGVtIiwic3RyaW5naWZ5IiwiZ2V0TG9jYWx5IiwianNvbiIsImdldEl0ZW0iLCJyZW1vdmVMb2NhbHkiLCJyZW1vdmVJdGVtIiwiZWx0UGFyZW50IiwiZWx0VHlwZSIsImVsdENvbnRlbnQiLCJlbHRJZCIsImVsdENsYXNzIiwiZWx0QXR0cmlidXRlcyIsIm5ld0VsZW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiaSIsImNsYXNzTGlzdCIsImFkZCIsImF0dHJpYnV0TmFtZSIsInNldEF0dHJpYnV0ZSIsImlubmVySFRNTCIsImFwcGVuZENoaWxkIiwibG9nIiwidXBkYXRlQWNjb3VudExpbmsiLCJjb25maWdUZW1wbGF0ZSIsImxpbmsiLCJob21lUGFnZSIsInNlYXJjaCIsInBhcmFtZXRlcnMiLCJzcGxpdCIsInBhcmFtIiwiZGVjb2RlVVJJIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJvbmxvYWQiLCJvbmVycm9yIiwic3RhdHVzVGV4dCIsImdldFRpbWVEaWZmZXJlbmNlIiwidGltZUxvY2FsIiwiZ2V0VGltZXpvbmVPZmZzZXQiLCJnZXRQYXNzd29yZCIsIm5iQ2FyTWluIiwibmJDYXJNYXgiLCJuYkNhciIsImxldHRlcnMiLCJvdGhlcnMiLCJzZXRTZXNzaW9uIiwidXNlcklkIiwidG9rZW4iLCJkdXJhdGlvblRTIiwic3RvcmFnZVVzZXIiLCJkdXJhdGlvbiIsImNoZWNrQW5zd2VyRGF0YXMiLCJsYXN0QW5zd2VyIiwiYW5zd2VyIiwibmJDb3JyZWN0QW5zd2VycyIsIlF1ZXN0aW9ubmFpcmVJZCIsIm5iUXVlc3Rpb25zIiwiY2hlY2tTZXNzaW9uIiwidXJsUmVkaXJlY3Rpb24iLCJ1cmxXYW50ZWQiLCJ1c2VyRGF0YXMiLCJyZWRpcmVjdFVzZXIiLCJ1c2VyIiwibm93IiwiaXNWYWxpZCIsImxhbmd1YWdlIiwidGltZURpZmZlcmVuY2UiLCJuYkRheXNPayIsInVybEFjY291bnQiLCJpbmRleE9mIl0sIm1hcHBpbmdzIjoiO1FBQUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7OztRQUdBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNB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QUFQO0FBQ0g7QUFDSixtQkE1Q0Q7O0FBNkNBM0QscUJBQUcsQ0FBQzhELE9BQUosR0FBYztBQUFBLDJCQUFNRixNQUFNLENBQUM1RCxHQUFHLENBQUMrRCxVQUFMLENBQVo7QUFBQSxtQkFBZDs7QUFDQS9ELHFCQUFHLENBQUNxQixJQUFKO0FBQ0g7QUFDSjtBQUNKLGFBdEVNLENBRmlCOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEdBQUg7O0FBQUEsa0JBQVpnRSxZQUFZO0FBQUE7QUFBQTtBQUFBLEdBQWxCLEMsQ0EwRVA7O0FBQ0EsSUFBTUksWUFBWSxHQUFHLFNBQWZBLFlBQWUsQ0FBQ0gsY0FBRCxFQUFpQjNFLE9BQWpCLEVBQTBCNEUsU0FBMUIsRUFDckI7QUFDSSxNQUFHLENBQUMzSiwyREFBTyxDQUFDK0UsT0FBRCxDQUFYLEVBQ0lDLG9FQUFVLENBQUMsU0FBRCxFQUFZRCxPQUFaLENBQVY7QUFDSixNQUFHLENBQUMvRSwyREFBTyxDQUFDMkosU0FBRCxDQUFYLEVBQ0kzRSxvRUFBVSxDQUFDLEtBQUQsRUFBUTJFLFNBQVIsQ0FBVjtBQUNKLE1BQUcsQ0FBQzNKLDJEQUFPLENBQUMwSixjQUFELENBQVgsRUFDSXhFLE1BQU0sQ0FBQ0MsUUFBUCxDQUFnQkMsTUFBaEIsQ0FBdUJzRSxjQUF2QjtBQUNQLENBUkQsQyIsImZpbGUiOiIuL0pTL25ld0xvZ2luVmFsaWRhdGlvbi5hcHAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gXCIuL3NyYy9uZXdMb2dpblZhbGlkYXRpb24uanNcIik7XG4iLCJjb25zdCB1c2VycyA9IHJlcXVpcmUoXCIuL3VzZXJzXCIpO1xuY29uc3QgcXVlc3Rpb25uYWlyZXMgPSByZXF1aXJlKFwiLi9xdWVzdGlvbm5haXJlc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIGFwaVVybDogXCJodHRwOi8vbG9jYWxob3N0OjMwMDAvYXBpXCIsXG4gICAgc2l0ZVVybDogXCJodHRwOi8vbG9jYWxob3N0OjgwODBcIixcbiAgICBhZG1pbk5hbWU6IFwiRmFicmljZVwiLFxuICAgIGFkbWluRW1haWw6IFwiZGV2QHdpa2lsZXJuaS5jb21cIixcbiAgICBzZW5kZXJOYW1lOiBcIldpa2lMZXJuaVwiLFxuICAgIHNlbmRlckVtYWlsOiBcImJvbmpvdXJAd2lraWxlcm5pLmNvbVwiLFxuICAgIGFkbWluTGFuZzogXCJmclwiLFxuICAgIHRoZW1lOiBcImRlZmF1bHRcIiwgLy8gbGUgdGjDqG1lIHV0aWxpc8OpIChkYW5zIC92aWV3cykgcG91ciBnw6luw6lyZXIgbGVzIHBhZ2VzIEhUTUwuIENvbnRpZW50IHNlcyBwcm9wcmVzIGZpY2hpZXJzIGRlIGNvbmZpZ3VyYXRpb24uXG4gICAgYXZhaWxhYmxlTGFuZ3M6IFtcImZyXCJdLC8vIExhbmd1YWdlcyBpbiB3aGljaCB0aGUgc2l0ZSBpcyBhdmFpbGFibGUuIFRoZSBmaXJzdCBvbmUgaXMgdGhlIGRlZmF1bHQgb25lLlxuICAgIHNpdGVOYW1lOiBcIldpa2lMZXJuaVwiLFxuICAgIGJlZ2luQ29kZUdvZGZhdGhlcjogXCJ3aWtpbGVybmlcIiwgLy8gY2FzZS1zZW5zaXRpdmUgYW5kIGNhbid0IGNvbnRhaW4gXCJAXCIgIVxuICAgIGNyb25UaW1pbmdBbGVydEluU2Vjb25kZTogMTIwLCAvLyBmb3IgbG9nc1xuICAgIHJlc3BvbnNlVGltaW5nQWxlcnRJblNlY29uZGU6IDMsIC8vIGlkZW1cbiAgICB0b2tlblNpZ251cFZhbGlkYXRpb25UaW1lSW5Ib3VyczogXCI0OGhcIiwgLy8gaHR0cHM6Ly9naXRodWIuY29tL3plaXQvbXNcbiAgICB0b2tlbkxvZ2luTGlua1RpbWVJbkhvdXJzOiBcIjFoXCIsXG4gICAgdG9rZW5Db25uZXhpb25NaW5UaW1lSW5Ib3VyczogXCIyNGhcIixcbiAgICB0b2tlbkNvbm5leGlvbk1heFRpbWVJbkRheXM6IFwiMTgwIGRheXNcIixcbiAgICB0b2tlbkxvZ2luQ2hhbmdpbmdUaW1lSW5Ib3VyczogXCIxaFwiLC8vIGZvciBlbWFpbCAmIHBhc3N3b3JkIGNoYW5naW5nXG4gICAgdG9rZW5EZWxldGVVc2VyVGltZUluSG91cnM6IFwiMWhcIixcbiAgICB0b2tlblVuc3Vic2NyaWJlTGlua1RpbWVJbkRheXM6IFwiNyBkYXlzXCIsIC8vIHRva2VuIHNlbmQgd2l0aCBzdWJzY3JpcHRpb24ncyBlbWFpbHNcbiAgICBmcmVlQWNjb3VudFRpbWluZ0luRGF5czogMTAsXG4gICAgZnJlZUFjY291bnRFeHBpcmF0aW9uTm90aWZpY2F0aW9uSW5EYXlzOiA1LFxuICAgIGFjY291bnRFeHBpcmF0aW9uRmlyc3ROb3RpZmljYXRpb25JbkRheXM6IDE0LCAgICBcbiAgICBhY2NvdW50RXhwaXJhdGlvblNlY29uZE5vdGlmaWNhdGlvbkluRGF5czogNSxcbiAgICBpbmFjdGl2ZUFjY291bnRUaW1lVG9EZWxldGVJbkRheXM6IDE4MCxcbiAgICAvLyBRdWVzdGlvbm5haXJlczpcbiAgICBuYlF1ZXN0aW9uc01pbjogMSwgLy8gbWluaW11bSBudW1iZXIgb2YgcXVlc3Rpb25zIGZvciB0aGUgcXVlc3Rpb25uYWlyZSB0byBiZSBwdWJsaXNoYWJsZVxuICAgIG5iUXVlc3Rpb25zTWF4OiAxMCwgLy8gaWYgMCA9IG5vdCBtYXhpbXVtXG4gICAgbmJDaG9pY2VzTWF4OiAxMCxcbiAgICBuYk5ld1F1ZXN0aW9ubmFpcmVzOiAxMCwvLyBmb3IgUlNTLCBldGMuXG4gICAgaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlQmVnaW46MSwgLy8gaW4gdXNlciBsb2NhbCB0aW1lXG4gICAgaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlRW5kOjI0LCAvLyBpZGVtXG4gICAgbnVtYmVyTmV3UXVlc3Rpb25uYWlyZUF0U2FtZVRpbWU6IDUwLCAvLyBmb3IgbWFzcyBtYWlsaW5nXG4gICAgbWluU2VhcmNoUXVlc3Rpb25uYWlyZXM6IDMsXG4gICAgLy8gSWxsdXN0cmF0aW9uczpcbiAgICBuYklsbHVzdHJhdGlvbnNNaW46IDAsXG4gICAgbmJJbGx1c3RyYXRpb25zTWF4OiAxLFxuICAgIG1heElsbHVzdHJhdGlvblNpemVpbk9jdGV0OiAxMDAwMDAwLC8vIHBhcyBjb250csO0bMOpIHBvdXIgbCdpbnN0YW50LiDDgCByZXZvaXIuXG4gICAgbWltZVR5cGVzRm9ySWxsdXN0cmF0aW9uOiBbIFwiaW1hZ2UvanBnXCIsIFwiaW1hZ2UvanBlZ1wiLCBcImltYWdlL3BuZ1wiLCBcImltYWdlL2dpZlwiLCBcImltYWdlL3BuZ1wiIF0sXG4gICAgLy8gLS0gVXBsb2FkIGFuZCByZXNpemU6XG4gICAgaWxsdXN0cmF0aW9uc1dpZHRoTWF4SW5QeDogNDAwLFxuICAgIGlsbHVzdHJhdGlvbnNNaW5pYXR1cmVzV2lkdGhNYXhJblB4OiAyMDAsXG4gICAgLy8gTGlua3M6XG4gICAgbmJMaW5rc01pbjogMSxcbiAgICBuYkxpbmtzTWF4OiAxLFxuICAgIC8vIMOgIHN1cHByaW1lciBxdWFuZCB0b3VzIGxlcyBcInJlcXVpcmVcIiDDoCBqb3VyOlxuICAgIG5iUXVlc3Rpb25zTWluOiBxdWVzdGlvbm5haXJlcy5uYlF1ZXN0aW9uc01pbixcbiAgICBuYlF1ZXN0aW9uc01heDogcXVlc3Rpb25uYWlyZXMubmJRdWVzdGlvbnNNYXgsXG4gICAgbmJDaG9pY2VzTWF4OiBxdWVzdGlvbm5haXJlcy5uYkNob2ljZXNNYXgsXG4gICAgcGFzc3dvcmRNaW5MZW5ndGg6IHVzZXJzLnBhc3N3b3JkLm1pbmxlbmd0aCxcbiAgICBkaXJDYWNoZVVzZXJzOiB1c2Vycy5kaXJDYWNoZVVzZXJzLFxuICAgIGRpckNhY2hlVXNlcnNBbnN3ZXJzOiB1c2Vycy5kaXJDYWNoZVVzZXJzQW5zd2VycyxcbiAgICBkaXJDYWNoZVF1ZXN0aW9ubmFpcmVzOiBxdWVzdGlvbm5haXJlcy5kaXJDYWNoZVF1ZXN0aW9ubmFpcmVzLFxuICAgIGRpckNhY2hlUXVlc3Rpb25zOiBxdWVzdGlvbm5haXJlcy5kaXJDYWNoZVF1ZXN0aW9ucyxcbiAgICBkaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlcyxcbiAgICBkaXJIVE1MUXVlc3Rpb25uYWlyZTogcXVlc3Rpb25uYWlyZXMuZGlySFRNTFF1ZXN0aW9ubmFpcmUsXG4gICAgZGlyV2ViUXVlc3Rpb25uYWlyZTogcXVlc3Rpb25uYWlyZXMuZGlyV2ViUXVlc3Rpb25uYWlyZVxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57ICAgIFxuICAgIC8vIEFQSSdyb3V0ZXMgKGFmdGVyIFwiYXBpVXJsXCIgZGVmaW5lZCBpbiBpbnN0YW5jZS5qcylcbiAgICBxdWVzdGlvbm5haXJlUm91dGVzOiBcIi9xdWVzdGlvbm5haXJlXCIsXG4gICAgZ2V0UXVlc3Rpb25uYWlyZVJvdXRlczogXCIvZ2V0XCIsXG4gICAgcHJldmlld1F1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3ByZXZpZXdcIixcbiAgICBwdWJsaXNoZWRRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9xdWl6L1wiLFxuICAgIHNhdmVBbnN3ZXJzUm91dGU6IFwiL2Fuc3dlci9cIixcbiAgICBnZXRTdGF0c1F1ZXN0aW9ubmFpcmVzIDogXCIvc3RhdHMvXCIsXG4gICAgc2VhcmNoUXVlc3Rpb25uYWlyZXNSb3V0ZSA6IFwiL3NlYXJjaFwiLFxuICAgIHNlYXJjaEFkbWluUXVlc3Rpb25uYWlyZXNSb3V0ZSA6IFwiL3NlYXJjaGFkbWluXCIsXG4gICAgZ2V0TGlzdE5leHRRdWVzdGlvbm5haXJlczogXCIvZ2V0bGlzdG5leHRxdWVzdGlvbm5haXJlcy9cIixcbiAgICAvLyAtLSBxdWVzdGlvbnMgJiBjaG9pY2VzIDpcbiAgICBxdWVzdGlvbnNSb3V0ZTogXCIvcXVlc3Rpb24vXCIsXG4gICAgLy8gLS0gdGFncyA6XG4gICAgdGFnc1NlYXJjaFJvdXRlOiBcIi90YWdzL3NlYXJjaC9cIixcbiAgICAvLyAtLSBhbnN3ZXJzIDpcbiAgICBnZXRRdWVzdGlvbm5haXJlc1dpdGhvdXRBbnN3ZXI6IFwiL3dpdGhvdXRhbnN3ZXIvdXNlci9cIixcbiAgICBnZXRQcmV2aW91c0Fuc3dlcnM6IFwiL3VzZXIvYW5zd2Vycy9cIixcbiAgICBnZXRTdGF0c0Fuc3dlcnMgOiBcIi91c2VyL2Fud3N3ZXJzL3N0YXRzL1wiLFxuICAgIGdldEFkbWluU3RhdHM6IFwiL2dldGFkbWluc3RhdHMvXCIsXG4gICAgLy8gZm9ybXMgOiDDoCBjb21wbMOpdGVyIGF2ZWMgdmFsZXVycyBwYXIgZMOpZmF1dCwgZXRjLiBjZiBtb2TDqGxlXG4gICAgUXVlc3Rpb25uYWlyZSA6XG4gICAge1xuICAgICAgICB0aXRsZTogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgc2x1ZzogeyBtYXhsZW5ndGg6IDE1MCB9LCAvLyBjaGFtcCByZXF1aXMgbWFpcyBjYWxjdWzDqSDDoCBwYXJ0aXIgZHUgdGl0cmUgcWQgdmlkZVxuICAgICAgICBpbnRyb2R1Y3Rpb246IHsgcmVxdWlyZWQ6IHRydWUgfVxuICAgIH0sXG4gICAgc2VhcmNoUXVlc3Rpb25uYWlyZXMgOiB7IG1pbmxlbmd0aDogMywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBRdWVzdGlvbiA6XG4gICAge1xuICAgICAgICB0ZXh0OiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICByYW5rOiB7IHJlcXVpcmVkOiB0cnVlLCBtaW46MSwgZGVmYXVsdFZhbHVlOjEgfVxuICAgIH0sICAgICAgICAgIFxuICAgIENob2ljZSA6XG4gICAge1xuICAgICAgICB0ZXh0OiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9XG4gICAgfSwgICAgICAgICAgXG4gICAgbmJRdWVzdGlvbnNNaW46IDEsXG4gICAgbmJRdWVzdGlvbnNNYXg6IDEwLFxuICAgIG5iQ2hvaWNlc01heDogMTAsXG4gICAgbmJUYWdzTWluOiAwLFxuICAgIG5iVGFnc01heDogMCwgLy8gMCA9IG5vdCBtYXggICAgXG4gICAgLy8gSlNPTiBhbmQgSFRNTCBkaXJcbiAgICBkaXJDYWNoZVF1ZXN0aW9ubmFpcmVzIDogXCJkYXRhcy9xdWVzdGlvbm5haXJlc1wiLFxuICAgIGRpckNhY2hlUXVlc3Rpb25zIDogXCJkYXRhcy9xdWVzdGlvbm5haXJlcy9xdWVzdGlvbnNcIixcbiAgICBkaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXMgOiBcImRhdGFzL3VzZXJzL3F1ZXN0aW9ubmFpcmVzXCIsXG4gICAgZGlyQ2FjaGVUYWdzIDogXCJkYXRhcy9xdWVzdGlvbm5haXJlcy90YWdzXCIsICBcbiAgICBkaXJIVE1MUXVlc3Rpb25uYWlyZSA6IFwiZnJvbnQvcHVibGljL3F1aXpcIixcbiAgICBkaXJIVE1MVGFncyA6IFwiZnJvbnQvcHVibGljL3F1aXpzXCIsXG4gICAgZGlyV2ViUXVlc3Rpb25uYWlyZSA6IFwicXVpelwiLC8vcG91ciB1cmwgcGFnZVxuICAgIGRpcldlYlRhZ3MgOiBcInF1aXpzXCIvLyBpZGVtXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICAvLyBBUEkncm91dGVzIChhZnRlciBcImFwaVVybFwiIGRlZmluZWQgaW4gaW5zdGFuY2UuanMpXG4gICAgdXNlclJvdXRlczogXCIvdXNlclwiLFxuICAgIHN1YnNjcmliZVJvdXRlOiBcIi9zaWdudXBcIixcbiAgICBnZXRHb2RmYXRoZXJSb3V0ZTogXCIvZ2V0Z29kZmF0aGVyaWRcIixcbiAgICBjaGVja0lmSXNFbWFpbGZyZWVSb3V0ZTogXCIvaXNlbWFpbGZyZWVcIixcbiAgICBjaGVja1N1YnNjcmliZVRva2VuUm91dGU6IFwiL3ZhbGlkYXRpb24vXCIsXG4gICAgY2hlY2tMb2dpblJvdXRlOiBcIi9jaGVja2xvZ2luL1wiLFxuICAgIGNvbm5lY3Rpb25Sb3V0ZTogXCIvbG9naW5cIixcbiAgICBnZXRMb2dpbkxpbmtSb3V0ZTogXCIvZ2V0bG9naW5saW5rXCIsXG4gICAgY29ubmVjdGlvbldpdGhMaW5rUm91dGU6IFwiL2NoZWNrbG9naW5saW5rXCIsXG4gICAgZ2V0VXNlckluZm9zOiBcIi9nZXQvXCIsXG4gICAgY3JlYXRlVXNlclJvdXRlOiBcIi9jcmVhdGVcIixcbiAgICB2YWxpZGF0ZVVzZXJSb3V0ZTogXCIvdmFsaWRhdGUvXCIsXG4gICAgdXBkYXRlVXNlckluZm9zOiBcIi9tb2RpZnkvXCIsXG4gICAgc2VhcmNoVXNlclJvdXRlOiBcIi9zZWFyY2gvXCIsXG4gICAgZ2V0R29kQ2hpbGRzOiBcIi9nZXRnb2RjaGlsZHMvXCIsXG4gICAgY2hlY2tOZXdMb2dpbkxpbmtSb3V0ZTogXCIvY29uZmlybW5ld2xvZ2luL1wiLFxuICAgIGNoZWNrRGVsZXRlTGlua1JvdXRlOiBcIi9jb25maXJtZGVsZXRlL1wiLFxuICAgIGdldFBheW1lbnRzOiBcIi9wYXltZW50L2dldGZvcm9uZXVzZXIvXCIsXG4gICAgdW5zdWJzY3JpYmVSb3V0ZTogXCIvc3Vic2NyaXB0aW9uL3N0b3AvXCIsXG4gICAgZ2V0QWRtaW5TdGF0czogXCIvZ2V0YWRtaW5zdGF0cy9cIixcbiAgICAvLyBmb3JtcyA6IMOgIGNvbXBsw6l0ZXIgYXZlYyB2YWxldXJzIHBhciBkw6lmYXV0LCBldGMuIGNmIG1vZMOobGVcbiAgICBuYW1lOiB7IG1heGxlbmd0aDogNzAsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZW1haWw6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgcGFzc3dvcmQ6IHsgbWlubGVuZ3RoOiA4LCBtYXhsZW5ndGg6NzIsIHJlcXVpcmVkOiB0cnVlIH0sIC8vIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2JjcnlwdCNzZWN1cml0eS1pc3N1ZXMtYW5kLWNvbmNlcm5zXG4gICAgbmV3UGFzc3dvcmQ6IHsgbWlubGVuZ3RoOiA4LCBtYXhsZW5ndGg6NzIgfSxcbiAgICBjb2RlR29kZmF0aGVyOiB7IG1heGxlbmd0aDogMjU1IH0sXG4gICAgY2d1T2s6IHsgdmFsdWU6IFwidHJ1ZVwiLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHRpbWVEaWZmZXJlbmNlTWluOiAtNzIwLFxuICAgIHRpbWVEaWZmZXJlbmNlTWF4Ojg0MCxcbiAgICAvLyBKU09OIGRpclxuICAgIGRpckNhY2hlVXNlcnMgOiBcImRhdGFzL3VzZXJzXCIsXG4gICAgZGlyQ2FjaGVVc2Vyc0Fuc3dlcnMgOiBcImRhdGFzL3VzZXJzL3F1ZXN0aW9ubmFpcmVzL2Fuc3dlcnNcIlxufTtcbiIsInZhciBtYXAgPSB7XG5cdFwiLi9mci9nZW5lcmFsXCI6IFwiLi4vbGFuZy9mci9nZW5lcmFsLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvZ2VuZXJhbCRcIjsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZnIvdXNlclwiOiBcIi4uL2xhbmcvZnIvdXNlci5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi9sYW5nIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcL3VzZXIkXCI7IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIHNpdGVIVE1MVGl0bGUgOiBcIldpa2lMZXJuaSA6IHF1J2FsbGV6LXZvdXMgYXBwcmVuZHJlIGF1am91cmQnaHVpID9cIixcbiAgICBzaXRlTWV0YURlc2NyaXB0aW9uIDogXCJDaGFxdWUgam91ciwgdGVzdGV6IHZvcyBjb25uYWlzc2FuY2VzIGV0IGFwcHJlbmV6IGRlIG5vdXZlbGxlcyBjaG9zZXMgYXZlYyBXaWtpTGVybmkuXCIsXG4gICAgc2NyaXB0VGltaW5nSW5mbyA6IFwiRHVyw6llIGRlIGxhIHLDqXBvbnNlIDogU0NSSVBUX1RJTUlORyBtaWxsaXNlY29uZGVzLCByb3V0ZSA6IFNDUklQVF9VUkxcIixcbiAgICBzY3JpcHRUaW1pbmdBbGVydCA6IFwiKioqIFNjcmlwdCBsZW50IDogU0NSSVBUX1RJTUlORyBtaWxsaXNlY29uZGVzLCByb3V0ZSA6IFNDUklQVF9VUkxcIixcbiAgICBzZXJ2ZXJFcnJvciA6IFwiRMOpc29sw6kuIFVuZSBlcnJldXIgaW1wcsOpdnVlIGVzdCBzdXJ2ZW51ZS4gU2kgY2VsYSBwZXJzaXN0ZSwgbidow6lzaXRleiDDoCBwcsOpdmVuaXIgbCdhZG1pbmlzdHJhdGV1ciBkdSBzaXRlLlwiLFxuICAgIHNlcnZlckVycm9yQWRtaW4gOiBcIkJ1ZyBkZSBsJ2FwcGxpY2F0aW9uIDpcIixcbiAgICBuZWVkZWRQYXJhbXMgOiBcIkRlcyBwYXJhbcOodHJlcyBuw6ljZXNzYWlyZXMgbWFucXVhbnRzIHNvbnQgbWFucXVhbnRzLlwiLFxuICAgIGJhZFVybCA6IFwiVGVudGF0aXZlIGQnYWNjw6hzIMOgIHVuZSBwYWdlIG4nZXhpc3RhbnQgcGFzIDpcIixcbiAgICBub3RWYWxpZEZvcm1hdCA6IFwiRm9ybWF0IG5vbiB2YWxpZGUuXCIsXG4gICAgbm90QWxsb3dlZCA6IFwiVm91cyBuJ2F2ZXogcGFzIGxlcyBkcm9pdHMgbsOpY2Vzc2FpcmVzIHBvdXIgY2V0dGUgYWN0aW9uLlwiLFxuICAgIG5vdFJlcXVpcmVkIDogXCJGYWN1bHRhdGlmLlwiLFxuICAgIHVwZGF0ZUJ0blR4dDogXCJNb2RpZmllclwiLFxuICAgIGFkZEJ0blR4dDogXCJBam91dGVyXCIsXG4gICAgZGVsZXRlQnRuVHh0OiBcIlN1cHByaW1lclwiLFxuICAgIGFkZE9rTWVzc2FnZSA6IFwiTGVzIGRvbm7DqWVzIG9udCBiaWVuIMOpdMOpIGVucmVnaXN0csOpZXMuXCIsXG4gICAgdXBkYXRlT2tNZXNzYWdlIDogXCJMYSBtaXNlIMOgIGpvdXIgw6Agam91ciBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIGRlbGV0ZU9rTWVzc2FnZSA6IFwiTGEgc3VwcHJlc3Npb24gYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS5cIixcbiAgICBmYWlsQXV0aCA6IFwiRXJyZXVyIGQnYXV0aGVudGlmaWNhdGlvbi5cIixcbiAgICBmYWlsQXV0aEhlYWRlciA6IFwiQWJzZW5jZSBkZSBoZWFkZXIgQXV0aG9yaXphdGlvbi5cIixcbiAgICBmYWlsQXV0aFRva2VuIDogXCJUb2tlbiBpbnZhbGlkZSBvdSB1dGlsaXNhdGV1ciBub24gdHJvdXbDqS5cIixcbiAgICBmYWlsQXV0aElkIDogXCJJZGVudGlmaWFudCBub24gdmFsaWRlIDogXCIsXG4gICAgZmFpbEF1dGhDcm9uIDogXCJUZW50YXRpdmUgZGUgbGFuY2VtZW50IGQndW4gY3JvbiBzYW5zIGxlIGJvbiB0b2tlbi5cIixcbiAgICBwcmV2aW91c1BhZ2UgOiBcIlBhZ2UgcHLDqWPDqWRlbnRlXCIsXG4gICAgbmV4dFBhZ2UgOiBcIlBhZ2Ugc3VpdmFudGVcIixcbiAgICBidG5MaW5rVG9RdWVzdGlvbm5haXJlIDogXCJBbGxlciBhdSBxdWl6ICFcIixcbiAgICBzdGF0c0FkbWluIDogXCJEdXJhbnQgbGVzIGRlcm5pw6hyZXMgMjRoIDogTkJfVVNFUlNfMjRIIGNvbXB0ZXMgb250IMOpdMOpIGNyw6nDqXMsIE5CX1NVQlNDUklQVElPTlNfMjRIIHZhbGlkw6lzIGV0IE5CX1VTRVJTX0RFTEVURURfMjRIIHN1cHByaW3DqXMuIE5CX0FOU1dFUlNfMjRIIHLDqXBvbnNlcyBhdXggcXVpenMgb250IMOpdMOpIGVucmVnaXN0csOpZXMuPGJyPkVuIHRvdXQsIGlsIHkgYSA6IE5CX1VTRVJTX1RPVCBjb21wdGVzLCBkb250IE5CX1NVQlNDUklQVElPTlNfVE9UIHZhbGlkw6lzIGV0IE5CX1NVQlNDUklQVElPTlNfUFJFTUlVTSBjb21wdGVzIHByw6ltaXVtLiBOQl9BTlNXRVJTX1RPVCByw6lwb25zZXMgYXV4IHF1aXpzIG9udCDDqXTDqSBlbnJlZ2lzdHLDqWVzLjxicj5QYXJtaSBsZXMgTkJfVVNFUlNfREVMRVRFRF9UT1QgY29tcHRlcyBzdXBwcmltw6lzLCBOQl9VU0VSU19ERUxFVEVEX1ZBTElERUQgYXZhaWVudCB2YWxpZMOpIGxldXIgY29tcHRlIGV0IE5CX1VTRVJTX0RFTEVURURfUFJFTUlVTSBhdmFpZW50IHNvdXNjcml0IHVuIGNvbXB0ZSBwcsOpbWl1bS5cIlxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgbm90Rm91bmQ6IFwiTCd1dGlsaXNhdGV1ciBuJ2EgcGFzIMOpdMOpIHRyb3V2w6kuXCIsXG4gICAgbmVlZE5hbWU6IFwiTWVyY2kgZGUgY2hvaXNpciB1biBub20gZCd1dGlsaXNhdGV1ci5cIixcbiAgICBuZWVkTm90VG9vTG9uZ05hbWU6IFwiTWVyY2kgZGUgY2hvaXNpciB1biBub20gZCd1dGlsaXNhdGV1ciBuZSBjb21wdGFudCBwYXMgcGx1cyBkZSA3MCBjYXJhY3TDqHJlcy5cIixcbiAgICBuZWVkRW1haWw6IFwiTWVyY2kgZGUgc2Fpc2lyIHZvdHJlIGFkcmVzc2UgZS1tYWlsLlwiLFxuICAgIG5lZWRVbmlxdWVFbWFpbDogXCJMJ2FkcmVzc2UgZS1tYWlsIHF1ZSB2b3VzIGF2ZXogc2Fpc2llIGVzdCBkw6lqw6AgdXRpbGlzw6llIHBhciB1biBhdXRyZSB1dGlsaXNhdGV1ci4gU2kgdm91cyBhdmV6IGTDqWrDoCB1biBjb21wdGUsIDxhIGhyZWY9Jy8jVVJMJz5jbGlxdWV6LWljaSBwb3VyIHZvdXMgY29ubmVjdGVyPC9hPi5cIixcbiAgICBuZWVkTm90VG9vTG9uZ0VtYWlsOiBcIk1lcmNpIGRlIHNhaXNpciB1bmUgYWRyZXNzZSBlLW1haWwgbmUgY29tcHRhbnQgcGFzIHBsdXMgZGUgMjU1IGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRQYXNzV29yZCA6IFwiTWVyY2kgZGUgZm91cm5pciB1biBtb3QgZGUgcGFzc2UuXCIsXG4gICAgbmVlZExvbmdQYXNzV29yZCA6IFwiTWVyY2kgZGUgZm91cm5pciB1biBtb3QgZGUgcGFzc2UgZCdhdSBtb2lucyBNSU5fTEVOR1RIIGNhcmFjdMOocmVzLlwiLFxuICAgIHBhc3N3b3JkQ29waWVkOiBcIkxlIG1vdCBkZSBwYXNzZSBnw6luw6lyw6kgYSDDqXTDqSBjb3Bpw6kgZGFucyBsZSBwcmVzc2UtcGFwaWVyLiBWb3VzIHBvdXZleiBsZSByZWNvcGllciBvw7kgdm91cyBsZSBzb3VoYWl0ZXIuXCIsXG4gICAgbmVlZFN0YXR1cyA6IFwiSWwgbWFucXVlIGxlIHN0YXR1dC5cIixcbiAgICBuZWVkTGFuZ3VhZ2UgOiBcIklsIG1hbnF1ZSBsZSBjb2RlIGxhbmd1ZS5cIixcbiAgICBuZWVkVmFsaWRMYXN0Q29ubmVjdGlvbkRhdGUgOiBcIkxhIGRhdGUgZGUgZGVybmnDqHJlIGNvbm5leGlvbiBuJ2VzdCBwYXMgdmFsaWRlLlwiLFxuICAgIG5lZWRTTVRQIDogXCJJbCBtYW5xdWUgbGUgc2VydmV1ciBTTVRQLlwiLFxuICAgIG5lZWRTTVRQTm90Rm91bmQgOiBcIklsIG1hbnF1ZSBsZSBzZXJ2ZXVyIFNNVFAuXCIsXG4gICAgbmVlZEtub3dOZXdzbGV0dGVyT2sgOiBcIklsIGZhdXQgc2F2b2lyIHNpIGwndXRpbGlzYXRldXIgYWNjZXB0ZSBvdSByZWZ1c2UgZGUgcmVjZXZvaXIgbGEgbmV3c2xldHRlci5cIixcbiAgICBuZWVkVGltZURpZmZlcmVuY2UgOiBcIklsIGZhdXQgY29ubmHDrnRyZSBsZSBub21icmUgZGUgbWludXRlcyBkdSBkw6ljYWxhZ2UgaG9yYWlyZS5cIixcbiAgICBuZWVkTWluVGltZURpZmZlcmVuY2UgOiBcIklsIGZhdXQgZm91cm5pciB1biBub21icmUgZGUgbWludXRlcyDDoCBlbmxldmVyIMOgIGwnaGV1cmUgR01UIG5lIGTDqXBhc3NhbnQgcGFzIDcyMC5cIixcbiAgICBuZWVkTWF4VGltZURpZmZlcmVuY2UgOiBcIklsIGZhdXQgZm91cm5pciB1biBub21icmUgZGUgbWludXRlcyDDoCBham91dGVyIMOgIGwnaGV1cmUgR01UIG5lIGTDqXBhc3NhbnQgcGFzIDg0MC5cIixcbiAgICBuZWVkVUdDT2sgOiBcIlZvdXMgZGV2ZXogYWNjZXB0ZXIgbGVzIENHVSBwb3VyIHBvdXZvaXIgY3LDqWVyIHZvdHJlIGNvbXB0ZS4gXCIsXG4gICAgZ29kZmF0aGVyTm90Rm91bmQ6IFwiQXVjdW4gdXRpbGlzYXRldXIgdmFsaWRlIHRyb3V2w6kgcG91ciBjZSBjb2RlIHBhcnJhaW4uXCIsXG4gICAgZ29kZmF0aGVyRm91bmQ6IFwiVm90cmUgcGFycmFpbiBhIGJpZW4gw6l0w6kgdHJvdXbDqSAhXCIsXG4gICAgbWFpbFZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGluc2NyaXB0aW9uIGVzdCBiaWVuIGVucmVnaXN0csOpZS5cXG5Qb3VyIGxhIGZpbmFsaXNlciwgbWVyY2kgZGUgY2xpcXVlciBkYW5zIGxlcyAyNEggc3VyIGxlIGxpZW4gZGUgY29uZmlybWF0aW9uIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbC5cIixcbiAgICBtYWlsVmFsaWRhdGlvbkxpbmtTdWJqZWN0IDogXCJNZXJjaSBkZSB2YWxpZGVyIHZvdHJlIGNvbXB0ZVwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1NCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5cXG5Qb3VyIHZhbGlkZXIgdm90cmUgY29tcHRlLCBtZXJjaSBkZSBjbGlxdWVyIHN1ciBsZSBsaWVuIHN1aXZhbnQgZGFucyBsZXMgMjRoIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1NCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+UG91ciB2YWxpZGVyIHZvdHJlIGNvbXB0ZSwgbWVyY2kgZGUgY2xpcXVlciBzdXIgbGUgbGllbiBzdWl2YW50IGRhbnMgbGVzIDI0aC48L3A+PHA+PGEgaHJlZj1cXFwiTElOS19VUkxcXFwiPlZhbGlkZXIuPC9hPjwvcD5cIixcbiAgICB2YWxpZGF0aW9uTWVzc2FnZTogXCJWb3RyZSBjb21wdGUgdmllbnQgYmllbiBkJ8OqdHJlIHZhbGlkw6kuIE1lcmNpIGV0IGJpZW52ZW51ZSAhPGJyPlZvdXMgcG91dmV6IHNhbnMgdGFyZGVyIHZvdXMgY29ubmVjdGVyIGNpLWRlc3NvdXMgcG91ciBhY2PDqWRlciDDoCB2b3RyZSBjb21wdGUuXCIsXG4gICAgdmFsaWRhdGlvbk1lc3NhZ2VBZG1pbjogXCJMZSBjb21wdGUgYSBiaWVuIMOpdMOpIHZhbGlkw6kuXCIsXG4gICAgdmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlOiBcIklsIHNlbWJsZSBxdWUgdm91cyBheWV6IGTDqWrDoCB2YWxpZMOpIHZvdHJlIGNvbXB0ZS5cIixcbiAgICB2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2VBZG1pbjogXCJDZSBjb21wdGUgYSBkw6lqw6Agw6l0w6kgdmFsaWTDqS5cIixcbiAgICBtYWlsV2VsY29tZVN1YmplY3QgOiBcIkJpZW52ZW51ZSAhXCIsXG4gICAgbWFpbFdlbGNvbWVCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5Wb3RyZSB2ZW5leiBkZSB2YWxpZGVyIHZvdHJlIGluc2NyaXB0aW9uIMOgIE5PTV9TSVRFLlxcbk1lcmNpIGV0IMOgIGJpZW50w7R0ICFcIixcbiAgICBtYWlsV2VsY29tZUJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Wb3RyZSB2ZW5leiBkZSB2YWxpZGVyIHZvdHJlIGluc2NyaXB0aW9uIMOgIE5PTV9TSVRFLjwvcD48cD5NZXJjaSBldCDDoCBiaWVudMO0dCAhPC9wPlwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlclN1YmplY3QgOiBcIk1lcmNpICFcIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5HcsOiY2Ugw6Agdm91cyB1biBub3V2ZWwgdXRpbGlzYXRldXIgKEVNQUlMKSB2aWVudCBkZSBzJ2luc2NyaXJlIHN1ciBOT01fU0lURS5cXG5NZXJjaSBldCDDoCBiaWVudMO0dCAhXCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPkdyw6JjZSDDoCB2b3VzIHVuIG5vdXZlbCB1dGlsaXNhdGV1ciAoRU1BSUwpIHZpZW50IGRlIHMnaW5zY3JpcmUgc3VyIE5PTV9TSVRFLjwvcD48cD5NZXJjaSBldCDDoCBiaWVudMO0dCAhPC9wPlwiLFxuICAgIGJhZExpbmtWYWxpZGF0aW9uTWVzc2FnZTogXCJWb3RyZSBsaWVuIGRlIGNvbmZpcm1hdGlvbiBuZSBzZW1ibGUgcGFzIHZhbGlkZSBvdSBiaWVuIGlsIGEgZXhwaXLDqS4gVm91cyBwb3V2ZXogZW4gcmVjZXZvaXIgdW4gbm91dmVhdSA8YSBocmVmPScjVVJMJz5lbiBjbGlxdWFudCBpY2k8L2E+LlwiLFxuICAgIGVtYWlsTm90Rm91bmQ6IFwiQXVjdW4gdXRpbGlzYXRldXIgdHJvdXbDqSBwb3VyIGNldHRlIGFkcmVzc2UgZS1tYWlsLlwiLFxuICAgIGFscmVhZHlDb25uZWN0ZWQ6IFwiVm91cyDDqnRlcyBkw6lqw6AgY29ubmVjdMOpKGUpIGF1IHNpdGUgIVwiLFxuICAgIG5lZWRCZUNvbm5lY3RlZDogXCJWb3VzIGRldmV6IMOqdHJlIGNvbm5lY3TDqShlKSBwb3VyIGFjY8OpZGVyIMOgIGNldHRlIHBhZ2UuXCIsXG4gICAgY29ubmVjdGlvbk9rOiBcIkNvbm5leGlvbiByw6l1c3NpZS5cIixcbiAgICBuZWVkQ2hvb3NlTG9naW5XYXk6IFwiVm91cyBkZXZleiBzb2l0IHNhaXNpciB2b3RyZSBtb3QgZGUgcGFzc2UsIHNvaXQgY29jaGVyIGxhIGNhc2Ugdm91cyBwZXJtZXR0YW50IGRlIHJlY2V2b2lyIHVuIGxpZW4gZGUgY29ubmV4aW9uIHBhciBlLW1haWwuXCIsXG4gICAgbmVlZFZhbGlkYXRpb25Ub0xvZ2luIDogXCJWb3VzIGRldmV6IGQnYWJvcmQgdmFsaWRlciB2b3RyZSBjb21wdGUgYXZhbnQgZGUgdm91cyBjb25uZWN0ZXIuIFBvdXIgY2UgZmFpcmUsIHVuIGxpZW4gdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHBhciBlLW1haWwuXCIsXG4gICAgdG9vTWFueUxvZ2luRmFpbHMgOiBcIlRyb3AgZGUgdGVudGF0aXZlcyBkZSBjb25uZXhpb24gaW5mcnVjdHVldXNlcyBwb3VyIGNldHRlIGFkcmVzc2UgZS1tYWlsLiBWb3VzIGRldmV6IGF0dGVuZHJlIE1JTlVURVMgbWludXRlcyBwb3VyIGVzc2F5ZXIgZGUgbm91dmVhdS5cIixcbiAgICBiYWRQYXNzd29yZDogXCJMZSBtb3QgZGUgcGFzc2Ugbidlc3QgcGFzIGxlIGJvbi5cIixcbiAgICBtYWlsTG9naW5MaW5rU3ViamVjdCA6IFwiVm90cmUgbGllbiBkZSBjb25uZXhpb24uXCIsXG4gICAgbWFpbExvZ2luTGlua0JvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblBvdXIgdm91cyBjb25uZWN0ZXIgw6Agdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOiBMSU5LX1VSTFwiLFxuICAgIG1haWxMb2dpbkxpbmtCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+UG91ciB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6PC9wPjxwPjxhIGhyZWY9XFxcIkxJTktfVVJMXFxcIj5WYWxpZGVyLjwvYT48L3A+XCIsXG4gICAgbWFpbExvZ2luTGlua01lc3NhZ2UgOiBcIlVuIGxpZW4gZGUgY29ubmV4aW9uIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBzdXIgdm90cmUgYWRyZXNzZSBlLW1haWwuIE5lIHRhcmRleiBwYXMgw6AgbCd1dGlsaXNlciwgY2FyIGlsIG4nZXN0IHZhbGFibGUgcXVlIGR1cmFudCBcIixcbiAgICB1cGRhdGVkT2tNZXNzYWdlOiBcIlZvcyBpbmZvcm1hdGlvbnMgb250IGJpZW4gw6l0w6kgbWlzZXMgw6Agam91ci5cIixcbiAgICB1cGRhdGVkTmVlZEdvb2RFbWFpbCA6IFwiTWFpcyBsYSBub3V2ZWxsZSBhZHJlc3NlIGUtbWFpbCBuJ2EgcHUgw6p0cmUgZW5yZWdpc3Ryw6llIGNhciBlbGxlIG4nYSBwYXMgdW5lIGZvcm1hdCBjb3JyZWN0LlwiLFxuICAgIHVwZGF0ZWROZWVkVW5pcXVlRW1haWwgOiBcIk1haXMgbGEgbm91dmVsbGUgYWRyZXNzZSBlLW1haWwgc2Fpc2llIChORVdfRU1BSUwpIG4nYSBwdSDDqnRyZSBlbnJlZ2lzdHLDqWUsIGNhciBlbGxlIGVzdCBkw6lqw6AgdXRpbGlzw6llIHBvdXIgdW4gYXV0cmUgY29tcHRlLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpblN1YmplY3QgOiBcIk1lcmNpIGRlIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cy5cIixcbiAgICBtYWlsVXBkYXRlTG9naW5Cb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5Qb3VyIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cyBkZSBjb25uZXhpb24sIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6XFxuTElOS19VUkxcIixcbiAgICBtYWlsVXBkYXRlTG9naW5Cb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+UG91ciB2YWxpZGVyIHZvcyBub3V2ZWF1eCBpZGVudGlmaWFudHMgZGUgY29ubmV4aW9uLCA8YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+Y2xpcXVleiBpY2k8L2E+IHNhbnMgdGFyZGVyLjwvcD5cIixcbiAgICBtYWlsVXBkYXRlTG9naW5MaW5rTWVzc2FnZTogXCJDZXBlbmRhbnQsIHZvdXMgYXZleiBtb2RpZmnDqSBhdSBtb2lucyB1biBkZSB2b3MgaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiAoZW1haWwgZXQvb3UgbW90IGRlIHBhc3NlKSBldCA8Yj52b3VzIGRldmV6IGNsaXF1ZXIgc3VyIGxlIGxpZW4gcXVpIHZpZW50IGRlIHZvdXMgw6p0cmVzIGVudm95w6kgc3VyIHZvdHJlIGFkcmVzc2UgKE5FV19FTUFJTCkgcG91ciB2YWxpZGVyIGNlIGNoYW5nZW1lbnQ8L2I+LiBFbiBhdHRlbmRhbnQsIG1lcmNpIGRlIGNvbnRpbnVlciDDoCB1dGlsaXNlciB2b3MgYW5jaWVucyBpZGVudGlmaWFudHMuXCIsXG4gICAgdXBkYXRlZE5lZWRWYWxpZGF0ZWRVc2VyOiBcIkwndXRpbGlzYXRldXIgcXVlIHZvdXMgc291aGFpdMOpIG1vZGlmaWVyIG4nZXhpc3RlIHBhcy9wbHVzIG91IG4nYSBwYXMgZW5jb3JlIHZhbGlkw6kgc29uIGNvbXB0ZS5cIixcbiAgICB1cGRhdGVkTmVlZEdvb2RHb2RmYXRoZXIgOiBcIk1haXMgbGUgbm91dmVhdSBjb2RlIHBhcnJhaW4gbidhIHB1IMOqdHJlIHJldGVudSwgY2FyIGlsIG5lIGNvcnJlc3BvbmQgw6AgYXVjdW4gY29tcHRlIHV0aWxpc2F0ZXVyIG91IMOgIGwndXRpbGlzYXRldXIgbHVpLW3Dqm1lLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbk9rTWVzc2FnZTogXCJMYSBtaXNlIMOgIGpvdXIgZGUgdm9zIGlkZW50aWZpYW50cyBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIHVwZGF0ZWRGYWlsZWRHb2RmYXRoZXJOb3RGb3VuZCA6IFwiTCdpZGVudGlmaWFudCBmb3VybmkgcG91ciBsZSBwYXJyYWluIG5lIGNvcnJlc3BvbmQgw6AgYXVjdW4gdXRpbGlzYXRldXIuXCIsXG4gICAgY3JlYXRpb25Pa01lc3NhZ2U6IFwiTGUgbm91dmVsIHV0aWxpc2F0ZXVyIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqS5cIixcbiAgICBtYWlsRGVsZXRlU3ViamVjdCA6IFwiQ29uZmlybWVyIGxhIHN1cHByZXNzaW9uIGRlIHZvdHJlIGNvbXB0ZS5cIixcbiAgICBtYWlsRGVsZXRlQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuUG91ciB2YWxpZGVyIGxhIHN1cHByZXNzaW9uIGRlIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxEZWxldGVCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+UG91ciB2YWxpZGVyIGxhIHN1cHByZXNzaW9uIGRlIHZvdHJlIGNvbXB0ZSwgPGEgaHJlZj1cXFwiTElOS19VUkxcXFwiPmNsaXF1ZXogaWNpPC9hPiBzYW5zIHRhcmRlci48L3A+XCIsXG4gICAgbWFpbERlbGV0ZUxpbmtNZXNzYWdlOiBcIlZvdHJlIGRlbWFuZGUgZGUgc3VwcHJlc3Npb24gYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS4gTWVyY2kgZGUgY2xpcXVlciBzYW5zIHRhcmRlciBzdXIgbGUgbGllbiBxdWkgdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHBhciBlLW1haWwgcG91ciBjb25maXJtZXIuXCIsXG4gICAgZGVsZXRlT2tNZXNzYWdlOiBcIkwndXRpbGlzYXRldXIgYSBiaWVuIMOpdMOpIHN1cHByaW3DqS5cIixcbiAgICBkZWxldGVGYWlsTWVzc2FnZTogXCJUZW50YXRpdmUgZGUgc3VwcHJlc3Npb24gZCd1biB1dGlsaXNhdGV1ciBpbmV4aXN0YW50IDogXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtPa01lc3NhZ2U6IFwiVm90cmUgY29tcHRlIGEgYmllbiDDqXTDqSBzdXBwcmltw6kuIE1lcmNpIGQnYXZvaXIgdXRpbGlzw6kgbm9zIHNlcnZpY2VzLlwiLFxuICAgIG1haWxEZWxldGVMaW5rQWxyZWFkeU1lc3NhZ2U6IFwiSWwgc2VtYmxlIHF1ZSB2b3VzIGF5ZXogZMOpasOgIHZhbGlkw6kgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLlwiLFxuICAgIG1haWxEZWxldGVMaW5rRmFpbE1lc3NhZ2U6IFwiVm90cmUgbGllbiBkZSBzdXBwcmVzc2lvbiBuJ2VzdCBwYXMgdmFsaWRlIG91IGFsb3JzIGlsIG4nZXN0IHBsdXMgdmFsYWJsZS5cIixcbiAgICBjcm9uRGVsZXRlVW52YWxpZGVkVXNlcnNNZXNzYWdlOiBcIiBjb21wdGVzIHV0aWxpc2F0ZXVycyBub24gdmFsaWTDqXMgb250IMOpdMOpIHN1cHByaW3DqXMuXCIsXG4gICAgZGVsZXRlSW5hY3RpdmVVc2Vyc01lc3NhZ2U6IFwiIGNvbXB0ZXMgdXRpbGlzYXRldXJzIGluYWN0aWZzIG9udCDDqXTDqSBzdXBwcmltw6lzLlwiLFxuICAgIHdlbGNvbWVNZXNzYWdlOiBcIkJpZW52ZW51ZSAjTkFNRSAhXCIsXG4gICAgYnllYnllTWVzc2FnZTogXCJTaSB2b3VzIHZveWV6IGNlIG1lc3NhZ2UsIGMnZXN0IHF1ZSB2b3RyZSBkw6ljb25uZXhpb24gcydlc3QgYmllbiBkw6lyb3Vsw6llLjxicj7DgCBiaWVudMO0dCAhXCIsXG4gICAgaW5mb3NVc2VyRm9yQWRtaW46IFwiQ2V0IHV0aWxpc2F0ZXVyIChpZDogSURfVVNFUikgYSA8Yj5jcsOpw6kgc29uIGNvbXB0ZSBsZSBEQVRFX0NSRUE8L2I+LCBsYSBkZXJuacOocmUgbWlzZSDDoCBqb3VyIGRhdGFudCBkdSBEQVRFX1VQREFURS48YnI+PGI+RGF0ZSBkZSBzYSBkZXJuacOocmUgY29ubmV4aW9uIDogREFURV9DT05ORUNUSU9OLjwvYj5cIixcbiAgICBpbmZvc0FkbWluR29kZmF0aGVyOiBcIkNldCB1dGlsaXNhdGV1ciBhIMOpdMOpIHBhcnJhaW7DqSBwYXIgXCIsXG4gICAgaW5mb3NBZG1pbk5iR29kQ2hpbGRzOiBcIlNlcyAjTkIgZmlsbGV1aWxzIDogXCJcbn07IiwiLy8gUXVlbHF1ZXMgZm9uY3Rpb25zIHV0aWxlcyBwb3VyIGxlcyBjaGHDrm5lc1xuXG5jbGFzcyBUb29sXG57XG4gICAgc3RhdGljIGlzRW1wdHkobXlWYXIpXG4gICAge1xuICAgICAgICBpZihteVZhcj09PXVuZGVmaW5lZCB8fCBteVZhcj09PW51bGwpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVZhcis9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVZhcj1teVZhci50cmltKCk7XG4gICAgICAgICAgICBpZihteVZhcj09PVwiXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIHN0YXRpYyB0cmltSWZOb3ROdWxsKG15U3RyaW5nKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KG15U3RyaW5nKSlcbiAgICAgICAgICAgIG15U3RyaW5nPW51bGw7XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgbXlTdHJpbmcrPVwiXCI7Ly8gc2kgYXV0cmUgY2hvc2UgcXUndW5lIGNoYcOubmUgZW52b3nDqS4uLlxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcudHJpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cblxuICAgIHN0YXRpYyBzaG9ydGVuSWZMb25nZXJUaGFuKG15U3RyaW5nLCBtYXgpXG4gICAge1xuICAgICAgICBteVN0cmluZys9XCJcIjsvLyBhdSBjYXMgb8O5IGNlbGEgbmUgc2VyYWl0IHBhcyB1bmUgY2hhw65uZS4uLlxuICAgICAgIGlmKG15U3RyaW5nLmxlbmd0aCA+IG1heClcbiAgICAgICAgICAgIG15U3RyaW5nPW15U3RyaW5nLnN1YnN0cmluZygwLCAobWF4LTMpKStcIi4uLlwiO1xuICAgICAgICByZXR1cm4gbXlTdHJpbmc7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTU2MDQxNDAvcmVwbGFjZS1tdWx0aXBsZS1zdHJpbmdzLXdpdGgtbXVsdGlwbGUtb3RoZXItc3RyaW5nc1xuICAgIHN0YXRpYyByZXBsYWNlQWxsKG15U3RyaW5nLCBtYXBPYmopXG4gICAge1xuICAgICAgICBjb25zdCByZXBsYWNlRWx0cyA9IG5ldyBSZWdFeHAoT2JqZWN0LmtleXMobWFwT2JqKS5qb2luKFwifFwiKSxcImdpXCIpO1xuICAgICAgICByZXR1cm4gbXlTdHJpbmcucmVwbGFjZShyZXBsYWNlRWx0cywgKG1hdGNoZWQpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBtYXBPYmpbbWF0Y2hlZF07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHNvdXJjZSA6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2ZyL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL09iamV0c19nbG9iYXV4L01hdGgvcmFuZG9tXG4gICAgc3RhdGljIGdldFJhbmRvbUludChtaW4sIG1heClcbiAgICB7XG4gICAgICAgIG1pbiA9IE1hdGguY2VpbChtaW4pO1xuICAgICAgICBtYXggPSBNYXRoLmZsb29yKG1heCk7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluKSkgKyBtaW47XG4gICAgfVxuXG4gICAgLy8gw6AgY29tcGzDqXRlciA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0RhdGVfZm9ybWF0X2J5X2NvdW50cnlcbiAgICBzdGF0aWMgZGF0ZUZvcm1hdChkYXRlU3RyaW5nLCBsYW5nPVwiZnJcIilcbiAgICB7XG4gICAgICAgIGlmKFRvb2wuaXNFbXB0eShkYXRlU3RyaW5nKSlcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICBsZXQgbXlEYXRlPW5ldyBEYXRlKGRhdGVTdHJpbmcpO1xuICAgICAgICBsZXQgbXlEYXk9bXlEYXRlLmdldERhdGUoKStcIlwiO1xuICAgICAgICBpZihteURheS5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlEYXk9XCIwXCIrbXlEYXk7XG4gICAgICAgIGxldCBteU1vdW50aD0obXlEYXRlLmdldE1vbnRoKCkrMSkrXCJcIjtcbiAgICAgICAgaWYobXlNb3VudGgubGVuZ3RoPT09MSlcbiAgICAgICAgICAgIG15TW91bnRoPVwiMFwiK215TW91bnRoO1xuICAgICAgICBsZXQgbXlZZWFyPW15RGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICBpZihsYW5nPT09XCJmclwiKVxuICAgICAgICAgICAgcmV0dXJuIG15RGF5K1wiL1wiK215TW91bnRoK1wiL1wiK215WWVhcjtcbiAgICAgICAgZWxzZSBpZiAobGFuZz09PVwiZm9ybVwiKS8vIDIwMTQtMDItMDlcbiAgICAgICAgICAgIHJldHVybiBteVllYXIrXCItXCIrbXlNb3VudGgrXCItXCIrbXlEYXk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBteU1vdW50aCtcIi9cIitteURheStcIi9cIitteVllYXI7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFRvb2w7IiwidmFyIG1hcCA9IHtcblx0XCIuL2RlZmF1bHQvY29uZmlnL2ZyLmpzXCI6IFwiLi4vdmlld3MvZGVmYXVsdC9jb25maWcvZnIuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vdmlld3Mgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwuanMkXCI7IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIGhlYWRMaW5rczpcbiAgICBbXG4gICAgICAgIHsgYW5jaG9yOiBcIkFjY3VlaWxcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiTW9uIGNvbXB0ZVwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY29ubmV4aW9uLmhtdFwiLCBpZDogXCJhY2NvdW50SGVhZExpbmtcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIsOAIHByb3Bvc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvYS1wcm9wb3MuaHRtbFwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQ29udGFjdFwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY29udGFjdC5odG1sXCIgfSB9LFxuICAgIF0sXG4gICAgZm9vdExpbmtzOlxuICAgIFtcbiAgICAgICAgeyBhbmNob3I6IFwiQ3LDqWRpdHNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2NyZWRpdHMuaHRtbFwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiTWVudGlvbnMgbMOpZ2FsZXNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL21lbnRpb25zLWxlZ2FsZXMuaHRtbFwiLCByZWw6IFwibm9mb2xsb3dcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkRvbm7DqWVzIHBlcnNvbm5lbGxlc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvZG9ubmVlcy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDLkcuVS5cIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2NndS5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQy5HLlYuXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jZ3YuaHRtbFwiLCByZWw6IFwibm9mb2xsb3dcIiB9IH0sXG4gICAgXSxcbiAgICBtYXhRdWVzdGlvbm5haXJlc0J5UGFnZTogMTAsXG4gICAgdXNlckhvbWVQYWdlIDogXCJhY2N1ZWlsLmh0bWxcIixcbiAgICBhZG1pbkhvbWVQYWdlIDogXCJhZG1pbi5odG1sXCIsXG4gICAgbWFuYWdlckhvbWVQYWdlIDogXCJnZXN0aW9uLmh0bWxcIixcbiAgICBzdWJzY3JpYmVQYWdlIDogXCJpbnNjcmlwdGlvbi5odG1sXCIsXG4gICAgY29ubmVjdGlvblBhZ2UgOiBcImNvbm5leGlvbi5odG1sXCIsXG4gICAgYWNjb3VudFBhZ2U6IFwiY29tcHRlLmh0bWxcIixcbiAgICBxdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlOiBcImdlc3Rpb24tcXVpenMuaHRtbFwiLFxuICAgIHVzZXJzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi11dGlsaXNhdGV1cnMuaHRtbFwiLFxuICAgIG5iUXVlc3Rpb25uYWlyZXNVc2VySG9tZVBhZ2UgOiAxMCxcbiAgICBpbGx1c3RyYXRpb25EaXIgOiBcIi9pbWcvcXVpenMvXCIsXG4gICAgc2l0ZVNsb2dhbjogXCJDdWx0aXZvbnMgbm90cmUgamFyZGluICFcIixcbiAgICBob21lVGl0bGUxOiBcIkRlIG5hdHVyZSBjdXJpZXVzZSA/XCIsXG4gICAgaG9tZVAxOiBcIkF2ZWMgV2lraUxlcm5pIHZvdXMgYXBwcmVuZXogY2hhcXVlIGpvdXIgZGUgbm91dmVsbGVzIGNob3Nlcy48YnI+RGVzIGFydGljbGVzIGRlIFdpa2lww6lkaWEgc29udCBzw6lsZWN0aW9ubsOpcyBwb3VyIHZvdXMgZXQgc29udCBzdWl2aXMgZCd1biBxdWl6IHZvdXMgcGVybWV0dGFudCBkZSB0ZXN0ZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUuPGJyPkRlIGpvdXIgZW4gam91ciBkZSBub3V2ZWxsZXMgZ3JhaW5lcyBkZSBzYXZvaXIgc29udCBhaW5zaSBzZW3DqWVzIGRhbnMgdm90cmUgXFxcImphcmRpblxcXCIuXCIsXG4gICAgaG9tZVRpdGxlMjogXCJMYSBjdWx0dXJlIGVuIGxpYmVydMOpXCIsXG4gICAgaG9tZVAyOiBcIlRvdXQgY29tbWUgc3VyIFdpa2lww6lkaWEgKCopLCBsZSBsb2dpY2llbCBldCBsZSBjb250ZW51IHBhcnRhZ8OpIHN1ciBXaWtpTGVybmkgc29udCBsaWJyZXMuPGJyPlZvdXMgcG91dmV6IGxlcyB1dGlsaXNlciwgbGVzIG1vZGlmaWVyIGV0IGxlcyBkaWZmdXNlciBzZWxvbiB2b3RyZSBzb3VoYWl0Ljxicj5TdXIgV2lraUxlcm5pLCBwYXMgZGUgcHVibGljaXTDqSwgbmkgZGUgY29tbWVyY2lhbGlzYXRpb24gZGUgdm9zIGRvbm7DqWVzIHBlcnNvbm5lbGxlcy48YnI+Vm91cyBwb3V2ZXogdmVuaXIgeSBcXFwiY3VsdGl2ZXIgdm90cmUgamFyZGluXFxcIiBlbiB0b3V0ZSB0cmFucXVpbGxpdMOpLjxicj48YnI+PHNtYWxsPjxlbT4oKikgQmllbiBxdWUgcGFydGFnZWFudCBzZXMgdmFsZXVycywgV2lraUxlcm5pIGVzdCB1biBwcm9qZXQgaW5kw6lwZW5kYW50IGRlIGxhIGZvbmRhdGlvbiBXaWtpcMOpZGlhLjwvZW0+PC9zbWFsbD5cIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc1RpdGxlOiBcIkxlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyBzdXIgV2lraUxlcm5pXCIsXG4gICAgbmV3UXVlc3Rpb25uYWlyZXNJbnRybzogXCJMaXN0ZSBkZXMgZGVybmllcnMgcXVpenMgcHVibGnDqXMgc3VyIFdpa2lMZXJuaS5cIixcbiAgICBleHBsYW5hdGlvblRpdGxlOiBcIlZvdXMgZMOpY291dnJleiBXaWtpTGVybmkgP1wiLFxuICAgIGV4cGxhbmF0aW9uVHh0OiBcIkxlIHByaW5jaXBlIGVzdCBzaW1wbGUgOiB2b3VzIGNvbW1lbmNleiBwYXIgbGlyZSBsJ2FydGljbGUgV2lraXDDqWRpYSBkb250IGxlIGxpZW4gdm91cyBlc3QgcHJvcG9zw6kuPGJyPlB1aXMgdm91cyBhZmZpY2hlciBsZSBxdWl6IHBvdXIgdsOpcmlmaWVyIGNlIHF1ZSB2b3VzIGVuIGF2ZXogcmV0ZW51IGRlIHZvdHJlIGxlY3R1cmUuIFZvdXMgb2J0ZW5leiBhbG9ycyB2b3RyZSByw6lzdWx0YXQgaW1tw6lkaWF0ZW1lbnQuPGJyPjxicj5Ub3V0ZXMgbGVzIHLDqXBvbnNlcyBzZSB0cm91dmVudCBkYW5zIGwnYXJ0aWNsZSBwcm9wb3PDqSDDoCBsYSBsZWN0dXJlLiA8Yj5Wb3VzIMOqdGVzIGljaSBwb3VyIGFwcHJlbmRyZSBkZSBub3V2ZWxsZXMgY2hvc2VzPC9iPiwgbWFpcyBsaWJyZSDDoCB2b3VzIGQnZXNzYXllciBkJ3kgcsOpcG9uZHJlIGltbcOpZGlhdGVtZW50Ljxicj48YnI+UXVhbmQgbGUgc3VqZXQgcyd5IHByw6p0ZSwgbmUgdm91cyDDqXRvbm5leiBwYXMgc2kgY2VydGFpbmVzIGRlcyByw6lwb25zZXMgcHJvcG9zw6llcyBwZXV2ZW50IMOqdHJlIHVuIHBldSBkw6ljYWzDqWVzLCBhYnN1cmRlcy4uLiBPbiBwZXV0IGFwcHJlbmRyZSBhdmVjIGxlIHNvdXJpcmUsIG5vbiA/IDotKTxicj48YnI+VW5lIGZvaXMgdm90cmUgcsOpc3VsdGF0IG9idGVudSwgaWwgdm91cyBzZXJhIHByb3Bvc8OpIGRlIGNyw6llciB1biBjb21wdGUgcG91ciBsZSBzYXV2ZWdhcmRlci48YnI+Q2UgY29tcHRlIHZvdXMgcGVybWV0dHJhIGRlIHRlc3RlciBkZSBub3V2ZWF1IGNlIHF1aXogcG91ciB2w6lyaWZpZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUgcGx1c2lldXJzIGpvdXJzLCBzZW1haW5lcywgbW9pcy4uLiBFdCBkZSByZWNldm9pciByw6lndWxpw6hyZW1lbnQgZGUgbm91dmVsbGVzIHN1Z2dlc3Rpb25zIGRlIGxlY3R1cmVzLjxicj48YnI+TWFpcyA8Yj5sYSBjcsOpYXRpb24gZGUgY2UgY29tcHRlIGVzdCBmYWN1bHRhdGl2ZTwvYj4gZXQgPGEgaHJlZj0nL3F1aXpzLycgdGl0bGU9J0xlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyc+dm91cyBwb3V2ZXogcGFyY291cmlyIFdpa2lMZXJuaSBsaWJyZW1lbnQ8L2E+LlwiLFxuICAgIG5vSlNOb3RpZmljYXRpb246IFwiRMOpc29sw6ksIG1haXMgcG91ciBsJ2luc3RhbnQsIGwndXRpbGlzYXRpb24gZGUgV2lraUxlcm5pIG7DqWNlc3NpdGUgbCdhY3RpdmF0aW9uIGR1IEphdmFTY3JpcHQuXCIsXG59OyIsIi8vIC0tIFBBR0UgUEVSTUVUVEFOVCBERSBWQUxJREVSIFVOIENIQU5HRU1FTlQgRCdFTUFJTCBPVSBERSBNT1QgREUgUEFTU0VcblxuLy8vIFVuIHRva2VuIGVzdCB0cmFuc21pcyBlbiBwYXJhbcOodHJlIGRlIGwnVXJsLiBJbCBhIHVuZSB2YWxpZGl0w6kgbGltaXTDqSBkYW5zIGxlIHRlbXBzLlxuLy8vIFNpIGxlIHRva2VuIGVzdCBvaywgb24gdmFsaWRlIGxhIG1pc2Ugw6Agam91ciBldCByZWRpcmlnZSBsJ3V0aWxpc2F0ZXVyIHZlcnMgc2EgcGFnZSBkJ2FjY3VlaWxcblxuLy8gRmljaGllciBkZSBjb25maWd1cmF0aW9uIGPDtHTDqSBjbGllbnQgOlxuaW1wb3J0IHsgYXBpVXJsLCBhdmFpbGFibGVMYW5ncywgdGhlbWUgfSBmcm9tIFwiLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCI7XG5jb25zdCBsYW5nPWF2YWlsYWJsZUxhbmdzWzBdO1xuY29uc3QgY29uZmlnRnJvbnRFbmQgPSByZXF1aXJlKFwiLi4vLi4vdmlld3MvXCIrdGhlbWUrXCIvY29uZmlnL1wiK2xhbmcrXCIuanNcIik7XG5cbi8vIEltcG9ydGF0aW9uIGRlcyBmb25jdGlvbnMgdXRpbGUgYXUgc2NyaXB0IDpcbmltcG9ydCB7IGdldExvY2FseSwgc2F2ZUxvY2FseSB9IGZyb20gXCIuL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanNcIjtcbmltcG9ydCB7IGFkZEVsZW1lbnQgfSBmcm9tIFwiLi90b29scy9kb20uanNcIjtcbmltcG9ydCB7IGhlbGxvRGV2LCB1cGRhdGVBY2NvdW50TGluayB9IGZyb20gXCIuL3Rvb2xzL2V2ZXJ5d2hlcmUuanNcIjtcbmltcG9ydCB7IGdldFVybFBhcmFtcyB9IGZyb20gXCIuL3Rvb2xzL3VybC5qc1wiO1xuaW1wb3J0IHsgY2hlY2tTZXNzaW9uLCBnZXRDb25maWcsIHNldFNlc3Npb24gfSBmcm9tIFwiLi90b29scy91c2Vycy5qc1wiO1xuXG4vLyBEaWN0aW9ubmFpcmVzIDpcbmNvbnN0IHR4dCA9IHJlcXVpcmUoXCIuLi8uLi9sYW5nL1wiK2xhbmcrXCIvZ2VuZXJhbFwiKTtcbmNvbnN0IHR4dFVzZXJzID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi91c2VyXCIpO1xuXG5jb25zdCBkaXZSZXNwb25zZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicmVzcG9uc2VcIik7XG5cbmhlbGxvRGV2KCk7XG5cbmxldCBjb25maWc7XG5jb25zdCBpbml0aWFsaXNlID0gYXN5bmMgKCkgPT5cbntcbiAgICB0cnlcbiAgICB7XG4gICAgICAgIGNvbmZpZyA9IGF3YWl0IGdldENvbmZpZygpO1xuICAgICAgICBpZighY29uZmlnKVxuICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFzPWdldFVybFBhcmFtcygpO1xuICAgICAgICAgICAgaWYoZGF0YXMgJiYgZGF0YXMudCE9PXVuZGVmaW5lZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBhcGlVcmwrY29uZmlnLnVzZXJSb3V0ZXMrY29uZmlnLmNoZWNrTmV3TG9naW5MaW5rUm91dGUrZGF0YXMudCk7XG4gICAgICAgICAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UodGhpcy5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDAgJiYgcmVzcG9uc2UubWVzc2FnZSAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUxvY2FseShcIm1lc3NhZ2VcIiwgeyBtZXNzYWdlOiByZXNwb25zZS5tZXNzYWdlLCBjb2xvcjpcInN1Y2Nlc3NcIiB9KTsvLyBwb3VyIGwnYWZmaWNoZXIgc3VyIGxhIHBhZ2Ugc3VpdmFudGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgcmVzcG9uc2UubWVzc2FnZSwgXCJcIiwgW1wic3VjY2Vzc1wiXSk7Ly8gYXUgY2FzIG/DucKgYmxvY2FnZSByZWRpcmVjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIvXCIrY29uZmlnRnJvbnRFbmQudXNlckhvbWVQYWdlKTsvLyBxdWUgdXNlciBwb3NzaWJsZSBpY2lcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuc3RhdHVzID09PSA0MDQgJiYgcmVzcG9uc2UuZXJyb3JzICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShyZXNwb25zZS5lcnJvcnMpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvcnMgPSByZXNwb25zZS5lcnJvcnMuam9pbihcIjxicj5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvcnMgPSB0eHQuc2VydmVyRXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHJlc3BvbnNlLmVycm9ycywgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHRVc2Vycy5iYWRMaW5rVmFsaWRhdGlvbk1lc3NhZ2UucmVwbGFjZShcIiNVUkxcIiwgY29uZmlnRnJvbnRFbmQuYWNjb3VudFBhZ2UpLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK2RhdGFzLnQpO1xuICAgICAgICAgICAgICAgIHhoci5zZW5kKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2goZSlcbiAgICB7XG4gICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHQuc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICB9XG59XG5pbml0aWFsaXNlKCk7IiwiLy8gRk9OQ1RJT05TIFVUSUxFUyBBVSBTVE9DS0FHRSBMT0NBTCAoU0VTU0lPTiwgQ09PS0lFUywgSU5ERVhEQiwgRVRDLilcbi8vIFJldmVuaXIgcG91ciBnw6lyZXIgbGUgY2FzIG/DuSBsb2NhbC5zdG9yYWdlIG4nZXN0IHBhcyBjb25udSBwb3VyIHV0aWxpc2VyIGNvb2tpZVxuICAgIFxuZXhwb3J0IGNvbnN0IHNhdmVMb2NhbHkgPSAobmFtZSwgZGF0YSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShuYW1lLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2NhbHkgPSAobmFtZSwganNvbj1mYWxzZSkgPT5cbntcbiAgICBpZihqc29uKVxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKSk7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSk7XG59XG5cbmV4cG9ydCBjb25zdCByZW1vdmVMb2NhbHkgPSAobmFtZSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShuYW1lKTtcbn0iLCJpbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gRm9uY3Rpb24gYXNzb2NpYW50IGxlcyBhdHRyaWJ1dHMgZm91cm5pcyDDoCB1biBjaGFtcCBkZSBmb3JtdWxhaXJlXG5leHBvcnQgY29uc3QgYWRkRWxlbWVudCA9IChlbHRQYXJlbnQsIGVsdFR5cGUsIGVsdENvbnRlbnQ9XCJcIiwgZWx0SWQ9XCJcIiwgZWx0Q2xhc3M9W10sIGVsdEF0dHJpYnV0ZXM9e30sIHJlcGxhY2U9dHJ1ZSkgPT5cbntcbiAgICBpZihpc0VtcHR5KGVsdFR5cGUpIHx8IGlzRW1wdHkoZWx0UGFyZW50KSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGVsc2VcbiAgICB7XG4gICAgICAgIGNvbnN0IG5ld0VsZW1lbnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlbHRUeXBlKTtcbiAgICAgICAgXG4gICAgICAgIGlmKCFpc0VtcHR5KGVsdElkKSkvLyB0ZXN0ZXIgc2kgbCdpZCBuJ2VzdCBwYXMgZMOpasOgIHV0aWxpc8OpIGRhbnMgbGUgRE9NID9cbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaWQ9ZWx0SWQ7XG5cbiAgICAgICAgaWYoQXJyYXkuaXNBcnJheShlbHRDbGFzcykgJiYgZWx0Q2xhc3MubGVuZ3RoIT0wKVxuICAgICAgICB7XG4gICAgICAgICAgICBmb3IobGV0IGkgaW4gZWx0Q2xhc3MpXG4gICAgICAgICAgICAgICAgbmV3RWxlbWVudC5jbGFzc0xpc3QuYWRkKGVsdENsYXNzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHR5cGVvZiBlbHRBdHRyaWJ1dGVzID09PSBcIm9iamVjdFwiKSAvLyAhISB0b3VzIGxlcyBvYmpldHMgbmUgc29udCBwYXMgb2tcbiAgICAgICAge1xuICAgICAgICAgICAgZm9yKGxldCBhdHRyaWJ1dE5hbWUgaW4gZWx0QXR0cmlidXRlcylcbiAgICAgICAgICAgICAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dE5hbWUsIGVsdEF0dHJpYnV0ZXNbYXR0cmlidXROYW1lXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZighaXNFbXB0eShlbHRDb250ZW50KSlcbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaW5uZXJIVE1MPWVsdENvbnRlbnQucmVwbGFjZSgvXFxuL2csXCI8YnI+XCIpOy8vIGlubmVySFRNTCBwZXJtZXQgZCdham91dGVyIGR1IHRleHRlIGF5YW50IGx1aS1tw6ptZSBkZXMgYmFsaXNlcywgZXRjLlxuICAgICAgICAgICAgXG4gICAgICAgIGlmKHJlcGxhY2UpXG4gICAgICAgICAgICBlbHRQYXJlbnQuaW5uZXJIVE1MPVwiXCI7XG4gICAgICAgIGVsdFBhcmVudC5hcHBlbmRDaGlsZChuZXdFbGVtZW50KTtcbiAgICB9ICAgIFxufSIsIi8vIENlIHNjcmlwdCBmb3Vybml0IGRlcyBmb25jdGlvbnMgdXRpbGlzw6llcyBzdXIgdG91dGVzIGxlcyBwYWdlcyBkdSBzaXRlXG5cbmV4cG9ydCBjb25zdCBoZWxsb0RldiA9ICgpID0+XG57XG4gICAgY29uc29sZS5sb2coXCIqKioqIEhlbGxvIGFtaSBkw6l2ZWxvcHBldXIgOi0pXFxuIExlIGNvZGUgZGUgV2lraUxlcm5pIGVzdCBsaWJyZSBldCBlc3QgbGlzaWJsZSBzdXIgZ2l0bGFiIDogXFxuIEJvbm5lIGxlY3R1cmUgOi0pIFxcbiBQb3VyIGxlcyBzdWdnZXN0aW9ucyBkJ2Ftw6lsaW9yYXRpb24gb3UgcXVlc3Rpb25zIDogZGV2QHdpbGlsZXJuaS5jb20gKioqKlwiKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUFjY291bnRMaW5rID0gKHN0YXR1cywgY29uZmlnVGVtcGxhdGUpID0+XG57XG4gICAgY29uc3QgbGluaz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFjY291bnRIZWFkTGlua1wiKTtcbiAgICBjb25zdCBob21lUGFnZT1zdGF0dXMrXCJIb21lUGFnZVwiO1xuICAgIGxpbmsuaHJlZj1cIi9cIitjb25maWdUZW1wbGF0ZVtob21lUGFnZV07XG59IiwiaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIEZvbmN0aW9uIHLDqWN1cMOpcmFudCBsZXMgcGFyYW3DqHRyZXMgcGFzc8OpcyBwYXIgbCd1cmxcbmV4cG9ydCBjb25zdCBnZXRVcmxQYXJhbXMgPSAoKSA9Plxue1xuICAgIGlmKGlzRW1wdHkobG9jYXRpb24uc2VhcmNoKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgcGFyYW1ldGVycyA9IGxvY2F0aW9uLnNlYXJjaC5zdWJzdHJpbmcoMSkuc3BsaXQoXCImXCIpO1xuICAgIGlmKCFBcnJheS5pc0FycmF5KHBhcmFtZXRlcnMpIHx8IHBhcmFtZXRlcnMubGVuZ3RoPT09MClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICBsZXQgcGFyYW0sIGRhdGFzPXt9O1xuICAgIGZvcihsZXQgaSBpbiBwYXJhbWV0ZXJzKVxuICAgIHtcbiAgICAgICAgcGFyYW0gPSBwYXJhbWV0ZXJzW2ldLnNwbGl0KFwiPVwiKTtcbiAgICAgICAgaWYocGFyYW0ubGVuZ3RoPT09MilcbiAgICAgICAgICAgIGRhdGFzW3BhcmFtWzBdXT1kZWNvZGVVUkkocGFyYW1bMV0pO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YXM7XG59IiwiaW1wb3J0IHsgYXBpVXJsLCBhdmFpbGFibGVMYW5ncywgc2l0ZVVybCwgdGhlbWUgfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCI7XG5jb25zdCBsYW5nPWF2YWlsYWJsZUxhbmdzWzBdO1xuXG5jb25zdCBjb25maWdUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi8uLi8uLi92aWV3cy9cIit0aGVtZStcIi9jb25maWcvXCIrbGFuZytcIi5qc1wiKTtcbmltcG9ydCB7ICBjaGVja0xvZ2luUm91dGUsIHRpbWVEaWZmZXJlbmNlTWF4LCB0aW1lRGlmZmVyZW5jZU1pbiwgdXNlclJvdXRlcyB9IGZyb20gXCIuLi8uLi8uLi9jb25maWcvdXNlcnMuanNcIjtcblxuaW1wb3J0IHsgZ2V0TG9jYWx5LCByZW1vdmVMb2NhbHksIHNhdmVMb2NhbHkgfSBmcm9tIFwiLi9jbGllbnRzdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gUsOpY3Vww6hyZSBsZXMgZG9ubsOpZXMgZGUgY29uZmlndXJhdGlvbiBkZXMgdXRpbGlzYXRldXJzXG4vLyDDgCB0ZXJtZSwgdW4gZmljaGllciBzdGF0aXF1ZSBpbXBvcnRhYmxlIGNvbW1lIG1vZHVsZSBkZXZyYWl0IMOpdml0ZXIgdW5lIHJlcXXDqnRlIGFqYXhcbmV4cG9ydCBjb25zdCBnZXRDb25maWcgPSAgYXN5bmMgKCkgPT5cbntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBhcGlVcmwrXCIvdXNlci9nZXRjb25maWdcIik7XG4gICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCkpO1xuICAgICAgICB4aHIub25lcnJvciA9ICgpID0+IHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICAgIHhoci5zZW5kKCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRUaW1lRGlmZmVyZW5jZSA9ICgpID0+XG57XG4gICAgY29uc3QgdGltZUxvY2FsPW5ldyBEYXRlKCkuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICBpZih0aW1lTG9jYWwgPiB0aW1lRGlmZmVyZW5jZU1heCB8fCB0aW1lTG9jYWwgPCB0aW1lRGlmZmVyZW5jZU1pbilcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgZWxzZSByZXR1cm4gdGltZUxvY2FsO1xufVxuXG4vLyBPbiBlbmzDqHZlIHZvbG9udGFpcmVtZW50IGxlcyAwL08gcG91ciDDqXZpdGVyIGxlcyBjb25mdXNpb25zICFcbi8vIEV0IG1pZXV4IHZhdXQgYXVzc2kgZMOpYnV0ZXIgZXQgZmluaXIgcGFyIHVuZSBsZXR0cmUgc2ltcGxlLlxuZXhwb3J0IGNvbnN0IGdldFBhc3N3b3JkID0gKG5iQ2FyTWluLCBuYkNhck1heCkgPT5cbntcbiAgICBjb25zdCBuYkNhcj1uYkNhck1pbitNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqKG5iQ2FyTWF4LW5iQ2FyTWluKSk7XG4gICAgY29uc3QgbGV0dGVycz1cIkFCQ0RFRkdISUpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbnBxcnN0dXZ3eHl6XCI7XG4gICAgY29uc3Qgb3RoZXJzPVwiMTIzNDU2Nzg5IT8uKi1fJUAmw4nDgMOIw5nigqwkw4LDisObw45cIjtcbiAgICBsZXQgcGFzc3dvcmQ9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICBmb3IobGV0IGk9MTtpPChuYkNhci0xKTtpKyspXG4gICAge1xuICAgICAgICBpZigoaSAlIDIpID09PTEpXG4gICAgICAgICAgICBwYXNzd29yZCs9b3RoZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpvdGhlcnMubGVuZ3RoKV07XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHBhc3N3b3JkKz1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldOyAgIFxuICAgIH1cbiAgICBwYXNzd29yZCs9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICByZXR1cm4gcGFzc3dvcmQ7XG59XG5cbi8vIEondXRpbGlzZSBsZSBzdG9ja2FnZSBsb2NhbCBkdSBuYXZpZ2F0ZXVyIHBvdXIgZW5yZWdpc3RyZXIgbGVzIGRvbm7DqWVzIHBlcm1ldHRhbnQgZGUgcmVjb25uYcOudHJlIGwndXRpbGlzYXRldXIgcGFyIGxhIHN1aXRlXG4vLyBTZXVsIGxlIHNlcnZldXIgcG91cnJhIHbDqXJpZmllciBxdWUgbGVzIGlkZW50aWZpYW50cyBzb250ICh0b3Vqb3VycykgdmFsaWRlcy5cbmV4cG9ydCBjb25zdCBzZXRTZXNzaW9uID0gKHVzZXJJZCwgdG9rZW4sIGR1cmF0aW9uVFMpID0+XG57XG4gICAgY29uc3Qgc3RvcmFnZVVzZXI9XG4gICAge1xuICAgICAgICBpZDogdXNlcklkLFxuICAgICAgICB0b2tlbjogdG9rZW4sXG4gICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvblRTXG4gICAgfVxuICAgIHNhdmVMb2NhbHkoXCJ1c2VyXCIsIHN0b3JhZ2VVc2VyKTtcbn1cblxuLy8gVsOpcmlmaWUgcXUnaWwgeSBhIGRlcyBkb25uw6llcyBsb2NhbGVzIGNvbmNlcm5hbnQgbGUgcsOpc3VsdGF0IGQndW4gcXVpelxuLy8gRXQgbGVzIGFqb3V0ZSBhdXggZG9ubsOpZXMgZW52b3nDqWVzIHBhciBsZXMgZm9ybXVsYWlyZXMgZCdpbnNjcmlwdGlvbi9jb25uZXhpb24gc2kgYydlc3QgbGUgY2FzXG5leHBvcnQgY29uc3QgY2hlY2tBbnN3ZXJEYXRhcyA9IChkYXRhcykgPT5cbntcbiAgICBjb25zdCBsYXN0QW5zd2VyPWdldExvY2FseShcImxhc3RBbnN3ZXJcIik7XG4gICAgaWYoIWlzRW1wdHkobGFzdEFuc3dlcikpXG4gICAge1xuICAgICAgICBjb25zdCBhbnN3ZXI9SlNPTi5wYXJzZShsYXN0QW5zd2VyKTtcbiAgICAgICAgaWYoIWlzRW1wdHkoYW5zd2VyLmR1cmF0aW9uKSAmJiAhaXNFbXB0eShhbnN3ZXIubmJDb3JyZWN0QW5zd2VycykgJiYgIWlzRW1wdHkoYW5zd2VyLlF1ZXN0aW9ubmFpcmVJZCkgJiYgIWlzRW1wdHkoYW5zd2VyLm5iUXVlc3Rpb25zKSlcbiAgICAgICAge1xuICAgICAgICAgICAgZGF0YXMuZHVyYXRpb249YW5zd2VyLmR1cmF0aW9uO1xuICAgICAgICAgICAgZGF0YXMubmJDb3JyZWN0QW5zd2Vycz1hbnN3ZXIubmJDb3JyZWN0QW5zd2VycztcbiAgICAgICAgICAgIGRhdGFzLlF1ZXN0aW9ubmFpcmVJZD1hbnN3ZXIuUXVlc3Rpb25uYWlyZUlkO1xuICAgICAgICAgICAgZGF0YXMubmJRdWVzdGlvbnM9YW5zd2VyLm5iUXVlc3Rpb25zO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhcztcbn1cblxuLy8gQ2V0dGUgZm9uY3Rpb24gdGVzdGUgbGEgY29ubmV4aW9uIGRlIGwndXRpbGlzYXRldXIgZCd1bmUgcGFnZVxuLy8gT24gcGV1dCBmb3VybmlzIHVuZSBsaXN0ZSBkZSBzdGF0dXRzIGFjY2VwdMOpcyAoc2kgdmlkZSA9IHRvdXMpLCBhaW5zaSBxdSd1bmUgdXJsIGRlIHJlZGlyZWN0aW9uIHNpIG5vbiBjb25uZWN0w6ksIHVuIG1lc3NhZ2UgZCdlcnJldXIgw6AgYWZmaWNoZXIgc3VyIGxhIHBhZ2UgZGUgZGVzdGluYXRpb24gZXQgbCd1cmwgc3VyIGxhcXVlbGxlIHJldmVuaXIgdW5lIGZvaXMgY29ubmVjdMOpXG5leHBvcnQgY29uc3QgY2hlY2tTZXNzaW9uID0gYXN5bmMgKHN0YXR1cz1bXSwgdXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCkgPT5cbntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IHVzZXJEYXRhcz1nZXRMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICBpZihpc0VtcHR5KHVzZXJEYXRhcykpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgdXNlcj1KU09OLnBhcnNlKHVzZXJEYXRhcyk7XG4gICAgICAgICAgICBpZihpc0VtcHR5KHVzZXIuaWQpIHx8wqBpc0VtcHR5KHVzZXIudG9rZW4pIHx8IGlzRW1wdHkodXNlci5kdXJhdGlvbikgfHwgdXNlci5kdXJhdGlvbiA8IERhdGUubm93KCkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgYXBpVXJsK3VzZXJSb3V0ZXMrY2hlY2tMb2dpblJvdXRlK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDAgJiYgcmVzcG9uc2UuaXNWYWxpZCAmJiByZXNwb25zZS5pZCAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLmlkPT09dXNlci5pZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLm5hbWU9cmVzcG9uc2UubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLmxhbmd1YWdlPXJlc3BvbnNlLmxhbmd1YWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIudGltZURpZmZlcmVuY2U9cmVzcG9uc2UudGltZURpZmZlcmVuY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5zdGF0dXM9cmVzcG9uc2Uuc3RhdHVzOy8vIGxlIHRva2VuIGV0IGRlIHRvdXRlIGZhw6dvbiB2w6lyaWZpZXIgw6AgY2hhcXVlIHJlcXXDqnRlIMOgIGwnQVBJXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUxvY2FseShcInVzZXJcIiwgdXNlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2kgaWwgcydhZ2l0IGQndW4gXCJ1c2VyXCIgZXQgcXVlIHNvbiBhYm9ubmVtZW50IGEgZXhwaXLDqSwgamUgbGUgcmVkaXJpZ2UgdmVycyBsYSBjYWlzc2UgOi0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2Uuc3RhdHVzPT09XCJ1c2VyXCIgJiYgcmVzcG9uc2UubmJEYXlzT2sgPD0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybEFjY291bnQ9c2l0ZVVybCtcIi9cIitjb25maWdUZW1wbGF0ZVtsYW5nXS5hY2NvdW50UGFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZih1cmxBY2NvdW50KT09PS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIi9cIitjb25maWdUZW1wbGF0ZVtsYW5nXS5hY2NvdW50UGFnZSk7Ly8gcGFzc8OpZSBkaXJlY3RlbWVudCBpY2ksIGwnYW5jcmUgI3N1YnNjcmliZSBuZSBmb25jdGlvbm5lIHBhcyAhP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzdGF0dXMubGVuZ3RoIT09MCAmJiBzdGF0dXMuaW5kZXhPZihyZXNwb25zZS5zdGF0dXMpPT09LTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHhoci5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICAgICAgICAgICAgICB4aHIuc2VuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4vLyBDZXR0ZSBmb25jdGlvbiBzZXJ0IMOgIGxhIHByw6ljw6lkZW50ZSBlbiBjYXMgZGUgY29ubmV4aW9uIG5vbiB2YWxpZGVcbmNvbnN0IHJlZGlyZWN0VXNlciA9ICh1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKSA9Plxue1xuICAgIGlmKCFpc0VtcHR5KG1lc3NhZ2UpKVxuICAgICAgICBzYXZlTG9jYWx5KFwibWVzc2FnZVwiLCBtZXNzYWdlKTtcbiAgICBpZighaXNFbXB0eSh1cmxXYW50ZWQpKVxuICAgICAgICBzYXZlTG9jYWx5KFwidXJsXCIsIHVybFdhbnRlZCk7XG4gICAgaWYoIWlzRW1wdHkodXJsUmVkaXJlY3Rpb24pKVxuICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKHVybFJlZGlyZWN0aW9uKTtcbn0iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/front/public/JS/polyfill.app.js b/front/public/JS/polyfill.app.js new file mode 100644 index 0000000..ecc7dc4 --- /dev/null +++ b/front/public/JS/polyfill.app.js @@ -0,0 +1,11169 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "./node_modules/babel-polyfill/lib/index.js"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "./node_modules/babel-polyfill/lib/index.js": +/*!**************************************************!*\ + !*** ./node_modules/babel-polyfill/lib/index.js ***! + \**************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(global) { + +__webpack_require__(/*! core-js/shim */ "./node_modules/core-js/shim.js"); + +__webpack_require__(/*! regenerator-runtime/runtime */ "./node_modules/babel-polyfill/node_modules/regenerator-runtime/runtime.js"); + +__webpack_require__(/*! core-js/fn/regexp/escape */ "./node_modules/core-js/fn/regexp/escape.js"); + +if (global._babelPolyfill) { + throw new Error("only one instance of babel-polyfill is allowed"); +} +global._babelPolyfill = true; + +var DEFINE_PROPERTY = "defineProperty"; +function define(O, key, value) { + O[key] || Object[DEFINE_PROPERTY](O, key, { + writable: true, + configurable: true, + value: value + }); +} + +define(String.prototype, "padLeft", "".padStart); +define(String.prototype, "padRight", "".padEnd); + +"pop,reverse,shift,keys,values,entries,indexOf,every,some,forEach,map,filter,find,findIndex,includes,join,slice,concat,push,splice,unshift,sort,lastIndexOf,reduce,reduceRight,copyWithin,fill".split(",").forEach(function (key) { + [][key] && define(Array, key, Function.call.bind([][key])); +}); +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) + +/***/ }), + +/***/ "./node_modules/babel-polyfill/node_modules/regenerator-runtime/runtime.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/babel-polyfill/node_modules/regenerator-runtime/runtime.js ***! + \*********************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +/* WEBPACK VAR INJECTION */(function(global) {/** + * Copyright (c) 2014, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * https://raw.github.com/facebook/regenerator/master/LICENSE file. An + * additional grant of patent rights can be found in the PATENTS file in + * the same directory. + */ + +!(function(global) { + "use strict"; + + var Op = Object.prototype; + var hasOwn = Op.hasOwnProperty; + var undefined; // More compressible than void 0. + var $Symbol = typeof Symbol === "function" ? Symbol : {}; + var iteratorSymbol = $Symbol.iterator || "@@iterator"; + var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator"; + var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; + + var inModule = typeof module === "object"; + var runtime = global.regeneratorRuntime; + if (runtime) { + if (inModule) { + // If regeneratorRuntime is defined globally and we're in a module, + // make the exports object identical to regeneratorRuntime. + module.exports = runtime; + } + // Don't bother evaluating the rest of this file if the runtime was + // already defined globally. + return; + } + + // Define the runtime globally (as expected by generated code) as either + // module.exports (if we're in a module) or a new, empty object. + runtime = global.regeneratorRuntime = inModule ? module.exports : {}; + + function wrap(innerFn, outerFn, self, tryLocsList) { + // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator. + var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator; + var generator = Object.create(protoGenerator.prototype); + var context = new Context(tryLocsList || []); + + // The ._invoke method unifies the implementations of the .next, + // .throw, and .return methods. + generator._invoke = makeInvokeMethod(innerFn, self, context); + + return generator; + } + runtime.wrap = wrap; + + // Try/catch helper to minimize deoptimizations. Returns a completion + // record like context.tryEntries[i].completion. This interface could + // have been (and was previously) designed to take a closure to be + // invoked without arguments, but in all the cases we care about we + // already have an existing method we want to call, so there's no need + // to create a new function object. We can even get away with assuming + // the method takes exactly one argument, since that happens to be true + // in every case, so we don't have to touch the arguments object. The + // only additional allocation required is the completion record, which + // has a stable shape and so hopefully should be cheap to allocate. + function tryCatch(fn, obj, arg) { + try { + return { type: "normal", arg: fn.call(obj, arg) }; + } catch (err) { + return { type: "throw", arg: err }; + } + } + + var GenStateSuspendedStart = "suspendedStart"; + var GenStateSuspendedYield = "suspendedYield"; + var GenStateExecuting = "executing"; + var GenStateCompleted = "completed"; + + // Returning this object from the innerFn has the same effect as + // breaking out of the dispatch switch statement. + var ContinueSentinel = {}; + + // Dummy constructor functions that we use as the .constructor and + // .constructor.prototype properties for functions that return Generator + // objects. For full spec compliance, you may wish to configure your + // minifier not to mangle the names of these two functions. + function Generator() {} + function GeneratorFunction() {} + function GeneratorFunctionPrototype() {} + + // This is a polyfill for %IteratorPrototype% for environments that + // don't natively support it. + var IteratorPrototype = {}; + IteratorPrototype[iteratorSymbol] = function () { + return this; + }; + + var getProto = Object.getPrototypeOf; + var NativeIteratorPrototype = getProto && getProto(getProto(values([]))); + if (NativeIteratorPrototype && + NativeIteratorPrototype !== Op && + hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) { + // This environment has a native %IteratorPrototype%; use it instead + // of the polyfill. + IteratorPrototype = NativeIteratorPrototype; + } + + var Gp = GeneratorFunctionPrototype.prototype = + Generator.prototype = Object.create(IteratorPrototype); + GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype; + GeneratorFunctionPrototype.constructor = GeneratorFunction; + GeneratorFunctionPrototype[toStringTagSymbol] = + GeneratorFunction.displayName = "GeneratorFunction"; + + // Helper for defining the .next, .throw, and .return methods of the + // Iterator interface in terms of a single ._invoke method. + function defineIteratorMethods(prototype) { + ["next", "throw", "return"].forEach(function(method) { + prototype[method] = function(arg) { + return this._invoke(method, arg); + }; + }); + } + + runtime.isGeneratorFunction = function(genFun) { + var ctor = typeof genFun === "function" && genFun.constructor; + return ctor + ? ctor === GeneratorFunction || + // For the native GeneratorFunction constructor, the best we can + // do is to check its .name property. + (ctor.displayName || ctor.name) === "GeneratorFunction" + : false; + }; + + runtime.mark = function(genFun) { + if (Object.setPrototypeOf) { + Object.setPrototypeOf(genFun, GeneratorFunctionPrototype); + } else { + genFun.__proto__ = GeneratorFunctionPrototype; + if (!(toStringTagSymbol in genFun)) { + genFun[toStringTagSymbol] = "GeneratorFunction"; + } + } + genFun.prototype = Object.create(Gp); + return genFun; + }; + + // Within the body of any async function, `await x` is transformed to + // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test + // `hasOwn.call(value, "__await")` to determine if the yielded value is + // meant to be awaited. + runtime.awrap = function(arg) { + return { __await: arg }; + }; + + function AsyncIterator(generator) { + function invoke(method, arg, resolve, reject) { + var record = tryCatch(generator[method], generator, arg); + if (record.type === "throw") { + reject(record.arg); + } else { + var result = record.arg; + var value = result.value; + if (value && + typeof value === "object" && + hasOwn.call(value, "__await")) { + return Promise.resolve(value.__await).then(function(value) { + invoke("next", value, resolve, reject); + }, function(err) { + invoke("throw", err, resolve, reject); + }); + } + + return Promise.resolve(value).then(function(unwrapped) { + // When a yielded Promise is resolved, its final value becomes + // the .value of the Promise<{value,done}> result for the + // current iteration. If the Promise is rejected, however, the + // result for this iteration will be rejected with the same + // reason. Note that rejections of yielded Promises are not + // thrown back into the generator function, as is the case + // when an awaited Promise is rejected. This difference in + // behavior between yield and await is important, because it + // allows the consumer to decide what to do with the yielded + // rejection (swallow it and continue, manually .throw it back + // into the generator, abandon iteration, whatever). With + // await, by contrast, there is no opportunity to examine the + // rejection reason outside the generator function, so the + // only option is to throw it from the await expression, and + // let the generator function handle the exception. + result.value = unwrapped; + resolve(result); + }, reject); + } + } + + if (typeof global.process === "object" && global.process.domain) { + invoke = global.process.domain.bind(invoke); + } + + var previousPromise; + + function enqueue(method, arg) { + function callInvokeWithMethodAndArg() { + return new Promise(function(resolve, reject) { + invoke(method, arg, resolve, reject); + }); + } + + return previousPromise = + // If enqueue has been called before, then we want to wait until + // all previous Promises have been resolved before calling invoke, + // so that results are always delivered in the correct order. If + // enqueue has not been called before, then it is important to + // call invoke immediately, without waiting on a callback to fire, + // so that the async generator function has the opportunity to do + // any necessary setup in a predictable way. This predictability + // is why the Promise constructor synchronously invokes its + // executor callback, and why async functions synchronously + // execute code before the first await. Since we implement simple + // async functions in terms of async generators, it is especially + // important to get this right, even though it requires care. + previousPromise ? previousPromise.then( + callInvokeWithMethodAndArg, + // Avoid propagating failures to Promises returned by later + // invocations of the iterator. + callInvokeWithMethodAndArg + ) : callInvokeWithMethodAndArg(); + } + + // Define the unified helper method that is used to implement .next, + // .throw, and .return (see defineIteratorMethods). + this._invoke = enqueue; + } + + defineIteratorMethods(AsyncIterator.prototype); + AsyncIterator.prototype[asyncIteratorSymbol] = function () { + return this; + }; + runtime.AsyncIterator = AsyncIterator; + + // Note that simple async functions are implemented on top of + // AsyncIterator objects; they just return a Promise for the value of + // the final result produced by the iterator. + runtime.async = function(innerFn, outerFn, self, tryLocsList) { + var iter = new AsyncIterator( + wrap(innerFn, outerFn, self, tryLocsList) + ); + + return runtime.isGeneratorFunction(outerFn) + ? iter // If outerFn is a generator, return the full iterator. + : iter.next().then(function(result) { + return result.done ? result.value : iter.next(); + }); + }; + + function makeInvokeMethod(innerFn, self, context) { + var state = GenStateSuspendedStart; + + return function invoke(method, arg) { + if (state === GenStateExecuting) { + throw new Error("Generator is already running"); + } + + if (state === GenStateCompleted) { + if (method === "throw") { + throw arg; + } + + // Be forgiving, per 25.3.3.3.3 of the spec: + // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume + return doneResult(); + } + + context.method = method; + context.arg = arg; + + while (true) { + var delegate = context.delegate; + if (delegate) { + var delegateResult = maybeInvokeDelegate(delegate, context); + if (delegateResult) { + if (delegateResult === ContinueSentinel) continue; + return delegateResult; + } + } + + if (context.method === "next") { + // Setting context._sent for legacy support of Babel's + // function.sent implementation. + context.sent = context._sent = context.arg; + + } else if (context.method === "throw") { + if (state === GenStateSuspendedStart) { + state = GenStateCompleted; + throw context.arg; + } + + context.dispatchException(context.arg); + + } else if (context.method === "return") { + context.abrupt("return", context.arg); + } + + state = GenStateExecuting; + + var record = tryCatch(innerFn, self, context); + if (record.type === "normal") { + // If an exception is thrown from innerFn, we leave state === + // GenStateExecuting and loop back for another invocation. + state = context.done + ? GenStateCompleted + : GenStateSuspendedYield; + + if (record.arg === ContinueSentinel) { + continue; + } + + return { + value: record.arg, + done: context.done + }; + + } else if (record.type === "throw") { + state = GenStateCompleted; + // Dispatch the exception by looping back around to the + // context.dispatchException(context.arg) call above. + context.method = "throw"; + context.arg = record.arg; + } + } + }; + } + + // Call delegate.iterator[context.method](context.arg) and handle the + // result, either by returning a { value, done } result from the + // delegate iterator, or by modifying context.method and context.arg, + // setting context.delegate to null, and returning the ContinueSentinel. + function maybeInvokeDelegate(delegate, context) { + var method = delegate.iterator[context.method]; + if (method === undefined) { + // A .throw or .return when the delegate iterator has no .throw + // method always terminates the yield* loop. + context.delegate = null; + + if (context.method === "throw") { + if (delegate.iterator.return) { + // If the delegate iterator has a return method, give it a + // chance to clean up. + context.method = "return"; + context.arg = undefined; + maybeInvokeDelegate(delegate, context); + + if (context.method === "throw") { + // If maybeInvokeDelegate(context) changed context.method from + // "return" to "throw", let that override the TypeError below. + return ContinueSentinel; + } + } + + context.method = "throw"; + context.arg = new TypeError( + "The iterator does not provide a 'throw' method"); + } + + return ContinueSentinel; + } + + var record = tryCatch(method, delegate.iterator, context.arg); + + if (record.type === "throw") { + context.method = "throw"; + context.arg = record.arg; + context.delegate = null; + return ContinueSentinel; + } + + var info = record.arg; + + if (! info) { + context.method = "throw"; + context.arg = new TypeError("iterator result is not an object"); + context.delegate = null; + return ContinueSentinel; + } + + if (info.done) { + // Assign the result of the finished delegate to the temporary + // variable specified by delegate.resultName (see delegateYield). + context[delegate.resultName] = info.value; + + // Resume execution at the desired location (see delegateYield). + context.next = delegate.nextLoc; + + // If context.method was "throw" but the delegate handled the + // exception, let the outer generator proceed normally. If + // context.method was "next", forget context.arg since it has been + // "consumed" by the delegate iterator. If context.method was + // "return", allow the original .return call to continue in the + // outer generator. + if (context.method !== "return") { + context.method = "next"; + context.arg = undefined; + } + + } else { + // Re-yield the result returned by the delegate method. + return info; + } + + // The delegate iterator is finished, so forget it and continue with + // the outer generator. + context.delegate = null; + return ContinueSentinel; + } + + // Define Generator.prototype.{next,throw,return} in terms of the + // unified ._invoke helper method. + defineIteratorMethods(Gp); + + Gp[toStringTagSymbol] = "Generator"; + + // A Generator should always return itself as the iterator object when the + // @@iterator function is called on it. Some browsers' implementations of the + // iterator prototype chain incorrectly implement this, causing the Generator + // object to not be returned from this call. This ensures that doesn't happen. + // See https://github.com/facebook/regenerator/issues/274 for more details. + Gp[iteratorSymbol] = function() { + return this; + }; + + Gp.toString = function() { + return "[object Generator]"; + }; + + function pushTryEntry(locs) { + var entry = { tryLoc: locs[0] }; + + if (1 in locs) { + entry.catchLoc = locs[1]; + } + + if (2 in locs) { + entry.finallyLoc = locs[2]; + entry.afterLoc = locs[3]; + } + + this.tryEntries.push(entry); + } + + function resetTryEntry(entry) { + var record = entry.completion || {}; + record.type = "normal"; + delete record.arg; + entry.completion = record; + } + + function Context(tryLocsList) { + // The root entry object (effectively a try statement without a catch + // or a finally block) gives us a place to store values thrown from + // locations where there is no enclosing try statement. + this.tryEntries = [{ tryLoc: "root" }]; + tryLocsList.forEach(pushTryEntry, this); + this.reset(true); + } + + runtime.keys = function(object) { + var keys = []; + for (var key in object) { + keys.push(key); + } + keys.reverse(); + + // Rather than returning an object with a next method, we keep + // things simple and return the next function itself. + return function next() { + while (keys.length) { + var key = keys.pop(); + if (key in object) { + next.value = key; + next.done = false; + return next; + } + } + + // To avoid creating an additional object, we just hang the .value + // and .done properties off the next function object itself. This + // also ensures that the minifier will not anonymize the function. + next.done = true; + return next; + }; + }; + + function values(iterable) { + if (iterable) { + var iteratorMethod = iterable[iteratorSymbol]; + if (iteratorMethod) { + return iteratorMethod.call(iterable); + } + + if (typeof iterable.next === "function") { + return iterable; + } + + if (!isNaN(iterable.length)) { + var i = -1, next = function next() { + while (++i < iterable.length) { + if (hasOwn.call(iterable, i)) { + next.value = iterable[i]; + next.done = false; + return next; + } + } + + next.value = undefined; + next.done = true; + + return next; + }; + + return next.next = next; + } + } + + // Return an iterator with no values. + return { next: doneResult }; + } + runtime.values = values; + + function doneResult() { + return { value: undefined, done: true }; + } + + Context.prototype = { + constructor: Context, + + reset: function(skipTempReset) { + this.prev = 0; + this.next = 0; + // Resetting context._sent for legacy support of Babel's + // function.sent implementation. + this.sent = this._sent = undefined; + this.done = false; + this.delegate = null; + + this.method = "next"; + this.arg = undefined; + + this.tryEntries.forEach(resetTryEntry); + + if (!skipTempReset) { + for (var name in this) { + // Not sure about the optimal order of these conditions: + if (name.charAt(0) === "t" && + hasOwn.call(this, name) && + !isNaN(+name.slice(1))) { + this[name] = undefined; + } + } + } + }, + + stop: function() { + this.done = true; + + var rootEntry = this.tryEntries[0]; + var rootRecord = rootEntry.completion; + if (rootRecord.type === "throw") { + throw rootRecord.arg; + } + + return this.rval; + }, + + dispatchException: function(exception) { + if (this.done) { + throw exception; + } + + var context = this; + function handle(loc, caught) { + record.type = "throw"; + record.arg = exception; + context.next = loc; + + if (caught) { + // If the dispatched exception was caught by a catch block, + // then let that catch block handle the exception normally. + context.method = "next"; + context.arg = undefined; + } + + return !! caught; + } + + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + var record = entry.completion; + + if (entry.tryLoc === "root") { + // Exception thrown outside of any try block that could handle + // it, so set the completion value of the entire function to + // throw the exception. + return handle("end"); + } + + if (entry.tryLoc <= this.prev) { + var hasCatch = hasOwn.call(entry, "catchLoc"); + var hasFinally = hasOwn.call(entry, "finallyLoc"); + + if (hasCatch && hasFinally) { + if (this.prev < entry.catchLoc) { + return handle(entry.catchLoc, true); + } else if (this.prev < entry.finallyLoc) { + return handle(entry.finallyLoc); + } + + } else if (hasCatch) { + if (this.prev < entry.catchLoc) { + return handle(entry.catchLoc, true); + } + + } else if (hasFinally) { + if (this.prev < entry.finallyLoc) { + return handle(entry.finallyLoc); + } + + } else { + throw new Error("try statement without catch or finally"); + } + } + } + }, + + abrupt: function(type, arg) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + if (entry.tryLoc <= this.prev && + hasOwn.call(entry, "finallyLoc") && + this.prev < entry.finallyLoc) { + var finallyEntry = entry; + break; + } + } + + if (finallyEntry && + (type === "break" || + type === "continue") && + finallyEntry.tryLoc <= arg && + arg <= finallyEntry.finallyLoc) { + // Ignore the finally entry if control is not jumping to a + // location outside the try/catch block. + finallyEntry = null; + } + + var record = finallyEntry ? finallyEntry.completion : {}; + record.type = type; + record.arg = arg; + + if (finallyEntry) { + this.method = "next"; + this.next = finallyEntry.finallyLoc; + return ContinueSentinel; + } + + return this.complete(record); + }, + + complete: function(record, afterLoc) { + if (record.type === "throw") { + throw record.arg; + } + + if (record.type === "break" || + record.type === "continue") { + this.next = record.arg; + } else if (record.type === "return") { + this.rval = this.arg = record.arg; + this.method = "return"; + this.next = "end"; + } else if (record.type === "normal" && afterLoc) { + this.next = afterLoc; + } + + return ContinueSentinel; + }, + + finish: function(finallyLoc) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + if (entry.finallyLoc === finallyLoc) { + this.complete(entry.completion, entry.afterLoc); + resetTryEntry(entry); + return ContinueSentinel; + } + } + }, + + "catch": function(tryLoc) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + if (entry.tryLoc === tryLoc) { + var record = entry.completion; + if (record.type === "throw") { + var thrown = record.arg; + resetTryEntry(entry); + } + return thrown; + } + } + + // The context.catch method must only be called with a location + // argument that corresponds to a known catch block. + throw new Error("illegal catch attempt"); + }, + + delegateYield: function(iterable, resultName, nextLoc) { + this.delegate = { + iterator: values(iterable), + resultName: resultName, + nextLoc: nextLoc + }; + + if (this.method === "next") { + // Deliberately forget the last sent value so that we don't + // accidentally pass it on to the delegate. + this.arg = undefined; + } + + return ContinueSentinel; + } + }; +})( + // Among the various tricks for obtaining a reference to the global + // object, this seems to be the most reliable technique that does not + // use indirect eval (which violates Content Security Policy). + typeof global === "object" ? global : + typeof window === "object" ? window : + typeof self === "object" ? self : this +); + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) + +/***/ }), + +/***/ "./node_modules/core-js/fn/regexp/escape.js": +/*!**************************************************!*\ + !*** ./node_modules/core-js/fn/regexp/escape.js ***! + \**************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../../modules/core.regexp.escape */ "./node_modules/core-js/modules/core.regexp.escape.js"); +module.exports = __webpack_require__(/*! ../../modules/_core */ "./node_modules/core-js/modules/_core.js").RegExp.escape; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_a-function.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_a-function.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (it) { + if (typeof it != 'function') throw TypeError(it + ' is not a function!'); + return it; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_a-number-value.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/_a-number-value.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var cof = __webpack_require__(/*! ./_cof */ "./node_modules/core-js/modules/_cof.js"); +module.exports = function (it, msg) { + if (typeof it != 'number' && cof(it) != 'Number') throw TypeError(msg); + return +it; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_add-to-unscopables.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/modules/_add-to-unscopables.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 22.1.3.31 Array.prototype[@@unscopables] +var UNSCOPABLES = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('unscopables'); +var ArrayProto = Array.prototype; +if (ArrayProto[UNSCOPABLES] == undefined) __webpack_require__(/*! ./_hide */ "./node_modules/core-js/modules/_hide.js")(ArrayProto, UNSCOPABLES, {}); +module.exports = function (key) { + ArrayProto[UNSCOPABLES][key] = true; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_advance-string-index.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/modules/_advance-string-index.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var at = __webpack_require__(/*! ./_string-at */ "./node_modules/core-js/modules/_string-at.js")(true); + + // `AdvanceStringIndex` abstract operation +// https://tc39.github.io/ecma262/#sec-advancestringindex +module.exports = function (S, index, unicode) { + return index + (unicode ? at(S, index).length : 1); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_an-instance.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_an-instance.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (it, Constructor, name, forbiddenField) { + if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) { + throw TypeError(name + ': incorrect invocation!'); + } return it; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_an-object.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_an-object.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +module.exports = function (it) { + if (!isObject(it)) throw TypeError(it + ' is not an object!'); + return it; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_array-copy-within.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/_array-copy-within.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length) + +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ "./node_modules/core-js/modules/_to-absolute-index.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); + +module.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) { + var O = toObject(this); + var len = toLength(O.length); + var to = toAbsoluteIndex(target, len); + var from = toAbsoluteIndex(start, len); + var end = arguments.length > 2 ? arguments[2] : undefined; + var count = Math.min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to); + var inc = 1; + if (from < to && to < from + count) { + inc = -1; + from += count - 1; + to += count - 1; + } + while (count-- > 0) { + if (from in O) O[to] = O[from]; + else delete O[to]; + to += inc; + from += inc; + } return O; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_array-fill.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_array-fill.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length) + +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ "./node_modules/core-js/modules/_to-absolute-index.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +module.exports = function fill(value /* , start = 0, end = @length */) { + var O = toObject(this); + var length = toLength(O.length); + var aLen = arguments.length; + var index = toAbsoluteIndex(aLen > 1 ? arguments[1] : undefined, length); + var end = aLen > 2 ? arguments[2] : undefined; + var endPos = end === undefined ? length : toAbsoluteIndex(end, length); + while (endPos > index) O[index++] = value; + return O; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_array-from-iterable.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/_array-from-iterable.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var forOf = __webpack_require__(/*! ./_for-of */ "./node_modules/core-js/modules/_for-of.js"); + +module.exports = function (iter, ITERATOR) { + var result = []; + forOf(iter, false, result.push, result, ITERATOR); + return result; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_array-includes.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/_array-includes.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// false -> Array#indexOf +// true -> Array#includes +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/core-js/modules/_to-iobject.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ "./node_modules/core-js/modules/_to-absolute-index.js"); +module.exports = function (IS_INCLUDES) { + return function ($this, el, fromIndex) { + var O = toIObject($this); + var length = toLength(O.length); + var index = toAbsoluteIndex(fromIndex, length); + var value; + // Array#includes uses SameValueZero equality algorithm + // eslint-disable-next-line no-self-compare + if (IS_INCLUDES && el != el) while (length > index) { + value = O[index++]; + // eslint-disable-next-line no-self-compare + if (value != value) return true; + // Array#indexOf ignores holes, Array#includes - not + } else for (;length > index; index++) if (IS_INCLUDES || index in O) { + if (O[index] === el) return IS_INCLUDES || index || 0; + } return !IS_INCLUDES && -1; + }; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_array-methods.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/_array-methods.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 0 -> Array#forEach +// 1 -> Array#map +// 2 -> Array#filter +// 3 -> Array#some +// 4 -> Array#every +// 5 -> Array#find +// 6 -> Array#findIndex +var ctx = __webpack_require__(/*! ./_ctx */ "./node_modules/core-js/modules/_ctx.js"); +var IObject = __webpack_require__(/*! ./_iobject */ "./node_modules/core-js/modules/_iobject.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var asc = __webpack_require__(/*! ./_array-species-create */ "./node_modules/core-js/modules/_array-species-create.js"); +module.exports = function (TYPE, $create) { + var IS_MAP = TYPE == 1; + var IS_FILTER = TYPE == 2; + var IS_SOME = TYPE == 3; + var IS_EVERY = TYPE == 4; + var IS_FIND_INDEX = TYPE == 6; + var NO_HOLES = TYPE == 5 || IS_FIND_INDEX; + var create = $create || asc; + return function ($this, callbackfn, that) { + var O = toObject($this); + var self = IObject(O); + var f = ctx(callbackfn, that, 3); + var length = toLength(self.length); + var index = 0; + var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined; + var val, res; + for (;length > index; index++) if (NO_HOLES || index in self) { + val = self[index]; + res = f(val, index, O); + if (TYPE) { + if (IS_MAP) result[index] = res; // map + else if (res) switch (TYPE) { + case 3: return true; // some + case 5: return val; // find + case 6: return index; // findIndex + case 2: result.push(val); // filter + } else if (IS_EVERY) return false; // every + } + } + return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result; + }; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_array-reduce.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/_array-reduce.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var aFunction = __webpack_require__(/*! ./_a-function */ "./node_modules/core-js/modules/_a-function.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var IObject = __webpack_require__(/*! ./_iobject */ "./node_modules/core-js/modules/_iobject.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); + +module.exports = function (that, callbackfn, aLen, memo, isRight) { + aFunction(callbackfn); + var O = toObject(that); + var self = IObject(O); + var length = toLength(O.length); + var index = isRight ? length - 1 : 0; + var i = isRight ? -1 : 1; + if (aLen < 2) for (;;) { + if (index in self) { + memo = self[index]; + index += i; + break; + } + index += i; + if (isRight ? index < 0 : length <= index) { + throw TypeError('Reduce of empty array with no initial value'); + } + } + for (;isRight ? index >= 0 : length > index; index += i) if (index in self) { + memo = callbackfn(memo, self[index], index, O); + } + return memo; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_array-species-constructor.js": +/*!********************************************************************!*\ + !*** ./node_modules/core-js/modules/_array-species-constructor.js ***! + \********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var isArray = __webpack_require__(/*! ./_is-array */ "./node_modules/core-js/modules/_is-array.js"); +var SPECIES = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('species'); + +module.exports = function (original) { + var C; + if (isArray(original)) { + C = original.constructor; + // cross-realm fallback + if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined; + if (isObject(C)) { + C = C[SPECIES]; + if (C === null) C = undefined; + } + } return C === undefined ? Array : C; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_array-species-create.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/modules/_array-species-create.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 9.4.2.3 ArraySpeciesCreate(originalArray, length) +var speciesConstructor = __webpack_require__(/*! ./_array-species-constructor */ "./node_modules/core-js/modules/_array-species-constructor.js"); + +module.exports = function (original, length) { + return new (speciesConstructor(original))(length); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_bind.js": +/*!***********************************************!*\ + !*** ./node_modules/core-js/modules/_bind.js ***! + \***********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var aFunction = __webpack_require__(/*! ./_a-function */ "./node_modules/core-js/modules/_a-function.js"); +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var invoke = __webpack_require__(/*! ./_invoke */ "./node_modules/core-js/modules/_invoke.js"); +var arraySlice = [].slice; +var factories = {}; + +var construct = function (F, len, args) { + if (!(len in factories)) { + for (var n = [], i = 0; i < len; i++) n[i] = 'a[' + i + ']'; + // eslint-disable-next-line no-new-func + factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')'); + } return factories[len](F, args); +}; + +module.exports = Function.bind || function bind(that /* , ...args */) { + var fn = aFunction(this); + var partArgs = arraySlice.call(arguments, 1); + var bound = function (/* args... */) { + var args = partArgs.concat(arraySlice.call(arguments)); + return this instanceof bound ? construct(fn, args.length, args) : invoke(fn, args, that); + }; + if (isObject(fn.prototype)) bound.prototype = fn.prototype; + return bound; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_classof.js": +/*!**************************************************!*\ + !*** ./node_modules/core-js/modules/_classof.js ***! + \**************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// getting tag from 19.1.3.6 Object.prototype.toString() +var cof = __webpack_require__(/*! ./_cof */ "./node_modules/core-js/modules/_cof.js"); +var TAG = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('toStringTag'); +// ES3 wrong here +var ARG = cof(function () { return arguments; }()) == 'Arguments'; + +// fallback for IE11 Script Access Denied error +var tryGet = function (it, key) { + try { + return it[key]; + } catch (e) { /* empty */ } +}; + +module.exports = function (it) { + var O, T, B; + return it === undefined ? 'Undefined' : it === null ? 'Null' + // @@toStringTag case + : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T + // builtinTag case + : ARG ? cof(O) + // ES3 arguments fallback + : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_cof.js": +/*!**********************************************!*\ + !*** ./node_modules/core-js/modules/_cof.js ***! + \**********************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +var toString = {}.toString; + +module.exports = function (it) { + return toString.call(it).slice(8, -1); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_collection-strong.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/_collection-strong.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var dP = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js").f; +var create = __webpack_require__(/*! ./_object-create */ "./node_modules/core-js/modules/_object-create.js"); +var redefineAll = __webpack_require__(/*! ./_redefine-all */ "./node_modules/core-js/modules/_redefine-all.js"); +var ctx = __webpack_require__(/*! ./_ctx */ "./node_modules/core-js/modules/_ctx.js"); +var anInstance = __webpack_require__(/*! ./_an-instance */ "./node_modules/core-js/modules/_an-instance.js"); +var forOf = __webpack_require__(/*! ./_for-of */ "./node_modules/core-js/modules/_for-of.js"); +var $iterDefine = __webpack_require__(/*! ./_iter-define */ "./node_modules/core-js/modules/_iter-define.js"); +var step = __webpack_require__(/*! ./_iter-step */ "./node_modules/core-js/modules/_iter-step.js"); +var setSpecies = __webpack_require__(/*! ./_set-species */ "./node_modules/core-js/modules/_set-species.js"); +var DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js"); +var fastKey = __webpack_require__(/*! ./_meta */ "./node_modules/core-js/modules/_meta.js").fastKey; +var validate = __webpack_require__(/*! ./_validate-collection */ "./node_modules/core-js/modules/_validate-collection.js"); +var SIZE = DESCRIPTORS ? '_s' : 'size'; + +var getEntry = function (that, key) { + // fast case + var index = fastKey(key); + var entry; + if (index !== 'F') return that._i[index]; + // frozen object case + for (entry = that._f; entry; entry = entry.n) { + if (entry.k == key) return entry; + } +}; + +module.exports = { + getConstructor: function (wrapper, NAME, IS_MAP, ADDER) { + var C = wrapper(function (that, iterable) { + anInstance(that, C, NAME, '_i'); + that._t = NAME; // collection type + that._i = create(null); // index + that._f = undefined; // first entry + that._l = undefined; // last entry + that[SIZE] = 0; // size + if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that); + }); + redefineAll(C.prototype, { + // 23.1.3.1 Map.prototype.clear() + // 23.2.3.2 Set.prototype.clear() + clear: function clear() { + for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) { + entry.r = true; + if (entry.p) entry.p = entry.p.n = undefined; + delete data[entry.i]; + } + that._f = that._l = undefined; + that[SIZE] = 0; + }, + // 23.1.3.3 Map.prototype.delete(key) + // 23.2.3.4 Set.prototype.delete(value) + 'delete': function (key) { + var that = validate(this, NAME); + var entry = getEntry(that, key); + if (entry) { + var next = entry.n; + var prev = entry.p; + delete that._i[entry.i]; + entry.r = true; + if (prev) prev.n = next; + if (next) next.p = prev; + if (that._f == entry) that._f = next; + if (that._l == entry) that._l = prev; + that[SIZE]--; + } return !!entry; + }, + // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined) + // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined) + forEach: function forEach(callbackfn /* , that = undefined */) { + validate(this, NAME); + var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3); + var entry; + while (entry = entry ? entry.n : this._f) { + f(entry.v, entry.k, this); + // revert to the last existing entry + while (entry && entry.r) entry = entry.p; + } + }, + // 23.1.3.7 Map.prototype.has(key) + // 23.2.3.7 Set.prototype.has(value) + has: function has(key) { + return !!getEntry(validate(this, NAME), key); + } + }); + if (DESCRIPTORS) dP(C.prototype, 'size', { + get: function () { + return validate(this, NAME)[SIZE]; + } + }); + return C; + }, + def: function (that, key, value) { + var entry = getEntry(that, key); + var prev, index; + // change existing entry + if (entry) { + entry.v = value; + // create new entry + } else { + that._l = entry = { + i: index = fastKey(key, true), // <- index + k: key, // <- key + v: value, // <- value + p: prev = that._l, // <- previous entry + n: undefined, // <- next entry + r: false // <- removed + }; + if (!that._f) that._f = entry; + if (prev) prev.n = entry; + that[SIZE]++; + // add to index + if (index !== 'F') that._i[index] = entry; + } return that; + }, + getEntry: getEntry, + setStrong: function (C, NAME, IS_MAP) { + // add .keys, .values, .entries, [@@iterator] + // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11 + $iterDefine(C, NAME, function (iterated, kind) { + this._t = validate(iterated, NAME); // target + this._k = kind; // kind + this._l = undefined; // previous + }, function () { + var that = this; + var kind = that._k; + var entry = that._l; + // revert to the last existing entry + while (entry && entry.r) entry = entry.p; + // get next entry + if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) { + // or finish the iteration + that._t = undefined; + return step(1); + } + // return step by kind + if (kind == 'keys') return step(0, entry.k); + if (kind == 'values') return step(0, entry.v); + return step(0, [entry.k, entry.v]); + }, IS_MAP ? 'entries' : 'values', !IS_MAP, true); + + // add [@@species], 23.1.2.2, 23.2.2.2 + setSpecies(NAME); + } +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_collection-to-json.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/modules/_collection-to-json.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// https://github.com/DavidBruant/Map-Set.prototype.toJSON +var classof = __webpack_require__(/*! ./_classof */ "./node_modules/core-js/modules/_classof.js"); +var from = __webpack_require__(/*! ./_array-from-iterable */ "./node_modules/core-js/modules/_array-from-iterable.js"); +module.exports = function (NAME) { + return function toJSON() { + if (classof(this) != NAME) throw TypeError(NAME + "#toJSON isn't generic"); + return from(this); + }; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_collection-weak.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/_collection-weak.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var redefineAll = __webpack_require__(/*! ./_redefine-all */ "./node_modules/core-js/modules/_redefine-all.js"); +var getWeak = __webpack_require__(/*! ./_meta */ "./node_modules/core-js/modules/_meta.js").getWeak; +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var anInstance = __webpack_require__(/*! ./_an-instance */ "./node_modules/core-js/modules/_an-instance.js"); +var forOf = __webpack_require__(/*! ./_for-of */ "./node_modules/core-js/modules/_for-of.js"); +var createArrayMethod = __webpack_require__(/*! ./_array-methods */ "./node_modules/core-js/modules/_array-methods.js"); +var $has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); +var validate = __webpack_require__(/*! ./_validate-collection */ "./node_modules/core-js/modules/_validate-collection.js"); +var arrayFind = createArrayMethod(5); +var arrayFindIndex = createArrayMethod(6); +var id = 0; + +// fallback for uncaught frozen keys +var uncaughtFrozenStore = function (that) { + return that._l || (that._l = new UncaughtFrozenStore()); +}; +var UncaughtFrozenStore = function () { + this.a = []; +}; +var findUncaughtFrozen = function (store, key) { + return arrayFind(store.a, function (it) { + return it[0] === key; + }); +}; +UncaughtFrozenStore.prototype = { + get: function (key) { + var entry = findUncaughtFrozen(this, key); + if (entry) return entry[1]; + }, + has: function (key) { + return !!findUncaughtFrozen(this, key); + }, + set: function (key, value) { + var entry = findUncaughtFrozen(this, key); + if (entry) entry[1] = value; + else this.a.push([key, value]); + }, + 'delete': function (key) { + var index = arrayFindIndex(this.a, function (it) { + return it[0] === key; + }); + if (~index) this.a.splice(index, 1); + return !!~index; + } +}; + +module.exports = { + getConstructor: function (wrapper, NAME, IS_MAP, ADDER) { + var C = wrapper(function (that, iterable) { + anInstance(that, C, NAME, '_i'); + that._t = NAME; // collection type + that._i = id++; // collection id + that._l = undefined; // leak store for uncaught frozen objects + if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that); + }); + redefineAll(C.prototype, { + // 23.3.3.2 WeakMap.prototype.delete(key) + // 23.4.3.3 WeakSet.prototype.delete(value) + 'delete': function (key) { + if (!isObject(key)) return false; + var data = getWeak(key); + if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key); + return data && $has(data, this._i) && delete data[this._i]; + }, + // 23.3.3.4 WeakMap.prototype.has(key) + // 23.4.3.4 WeakSet.prototype.has(value) + has: function has(key) { + if (!isObject(key)) return false; + var data = getWeak(key); + if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key); + return data && $has(data, this._i); + } + }); + return C; + }, + def: function (that, key, value) { + var data = getWeak(anObject(key), true); + if (data === true) uncaughtFrozenStore(that).set(key, value); + else data[that._i] = value; + return that; + }, + ufstore: uncaughtFrozenStore +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_collection.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_collection.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var redefine = __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js"); +var redefineAll = __webpack_require__(/*! ./_redefine-all */ "./node_modules/core-js/modules/_redefine-all.js"); +var meta = __webpack_require__(/*! ./_meta */ "./node_modules/core-js/modules/_meta.js"); +var forOf = __webpack_require__(/*! ./_for-of */ "./node_modules/core-js/modules/_for-of.js"); +var anInstance = __webpack_require__(/*! ./_an-instance */ "./node_modules/core-js/modules/_an-instance.js"); +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +var $iterDetect = __webpack_require__(/*! ./_iter-detect */ "./node_modules/core-js/modules/_iter-detect.js"); +var setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ "./node_modules/core-js/modules/_set-to-string-tag.js"); +var inheritIfRequired = __webpack_require__(/*! ./_inherit-if-required */ "./node_modules/core-js/modules/_inherit-if-required.js"); + +module.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) { + var Base = global[NAME]; + var C = Base; + var ADDER = IS_MAP ? 'set' : 'add'; + var proto = C && C.prototype; + var O = {}; + var fixMethod = function (KEY) { + var fn = proto[KEY]; + redefine(proto, KEY, + KEY == 'delete' ? function (a) { + return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a); + } : KEY == 'has' ? function has(a) { + return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a); + } : KEY == 'get' ? function get(a) { + return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a); + } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; } + : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; } + ); + }; + if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () { + new C().entries().next(); + }))) { + // create collection constructor + C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER); + redefineAll(C.prototype, methods); + meta.NEED = true; + } else { + var instance = new C(); + // early implementations not supports chaining + var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance; + // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false + var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); }); + // most early implementations doesn't supports iterables, most modern - not close it correctly + var ACCEPT_ITERABLES = $iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new + // for early implementations -0 and +0 not the same + var BUGGY_ZERO = !IS_WEAK && fails(function () { + // V8 ~ Chromium 42- fails only with 5+ elements + var $instance = new C(); + var index = 5; + while (index--) $instance[ADDER](index, index); + return !$instance.has(-0); + }); + if (!ACCEPT_ITERABLES) { + C = wrapper(function (target, iterable) { + anInstance(target, C, NAME); + var that = inheritIfRequired(new Base(), target, C); + if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that); + return that; + }); + C.prototype = proto; + proto.constructor = C; + } + if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) { + fixMethod('delete'); + fixMethod('has'); + IS_MAP && fixMethod('get'); + } + if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER); + // weak collections should not contains .clear method + if (IS_WEAK && proto.clear) delete proto.clear; + } + + setToStringTag(C, NAME); + + O[NAME] = C; + $export($export.G + $export.W + $export.F * (C != Base), O); + + if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP); + + return C; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_core.js": +/*!***********************************************!*\ + !*** ./node_modules/core-js/modules/_core.js ***! + \***********************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +var core = module.exports = { version: '2.6.11' }; +if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_create-property.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/_create-property.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $defineProperty = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js"); +var createDesc = __webpack_require__(/*! ./_property-desc */ "./node_modules/core-js/modules/_property-desc.js"); + +module.exports = function (object, index, value) { + if (index in object) $defineProperty.f(object, index, createDesc(0, value)); + else object[index] = value; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_ctx.js": +/*!**********************************************!*\ + !*** ./node_modules/core-js/modules/_ctx.js ***! + \**********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// optional / simple context binding +var aFunction = __webpack_require__(/*! ./_a-function */ "./node_modules/core-js/modules/_a-function.js"); +module.exports = function (fn, that, length) { + aFunction(fn); + if (that === undefined) return fn; + switch (length) { + case 1: return function (a) { + return fn.call(that, a); + }; + case 2: return function (a, b) { + return fn.call(that, a, b); + }; + case 3: return function (a, b, c) { + return fn.call(that, a, b, c); + }; + } + return function (/* ...args */) { + return fn.apply(that, arguments); + }; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_date-to-iso-string.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/modules/_date-to-iso-string.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString() +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +var getTime = Date.prototype.getTime; +var $toISOString = Date.prototype.toISOString; + +var lz = function (num) { + return num > 9 ? num : '0' + num; +}; + +// PhantomJS / old WebKit has a broken implementations +module.exports = (fails(function () { + return $toISOString.call(new Date(-5e13 - 1)) != '0385-07-25T07:06:39.999Z'; +}) || !fails(function () { + $toISOString.call(new Date(NaN)); +})) ? function toISOString() { + if (!isFinite(getTime.call(this))) throw RangeError('Invalid time value'); + var d = this; + var y = d.getUTCFullYear(); + var m = d.getUTCMilliseconds(); + var s = y < 0 ? '-' : y > 9999 ? '+' : ''; + return s + ('00000' + Math.abs(y)).slice(s ? -6 : -4) + + '-' + lz(d.getUTCMonth() + 1) + '-' + lz(d.getUTCDate()) + + 'T' + lz(d.getUTCHours()) + ':' + lz(d.getUTCMinutes()) + + ':' + lz(d.getUTCSeconds()) + '.' + (m > 99 ? m : '0' + lz(m)) + 'Z'; +} : $toISOString; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_date-to-primitive.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/_date-to-primitive.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "./node_modules/core-js/modules/_to-primitive.js"); +var NUMBER = 'number'; + +module.exports = function (hint) { + if (hint !== 'string' && hint !== NUMBER && hint !== 'default') throw TypeError('Incorrect hint'); + return toPrimitive(anObject(this), hint != NUMBER); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_defined.js": +/*!**************************************************!*\ + !*** ./node_modules/core-js/modules/_defined.js ***! + \**************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// 7.2.1 RequireObjectCoercible(argument) +module.exports = function (it) { + if (it == undefined) throw TypeError("Can't call method on " + it); + return it; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_descriptors.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_descriptors.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// Thank's IE8 for his funny defineProperty +module.exports = !__webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_dom-create.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_dom-create.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var document = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js").document; +// typeof document.createElement is 'object' in old IE +var is = isObject(document) && isObject(document.createElement); +module.exports = function (it) { + return is ? document.createElement(it) : {}; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_enum-bug-keys.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/_enum-bug-keys.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// IE 8- don't enum bug keys +module.exports = ( + 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf' +).split(','); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_enum-keys.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_enum-keys.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// all enumerable object keys, includes symbols +var getKeys = __webpack_require__(/*! ./_object-keys */ "./node_modules/core-js/modules/_object-keys.js"); +var gOPS = __webpack_require__(/*! ./_object-gops */ "./node_modules/core-js/modules/_object-gops.js"); +var pIE = __webpack_require__(/*! ./_object-pie */ "./node_modules/core-js/modules/_object-pie.js"); +module.exports = function (it) { + var result = getKeys(it); + var getSymbols = gOPS.f; + if (getSymbols) { + var symbols = getSymbols(it); + var isEnum = pIE.f; + var i = 0; + var key; + while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key); + } return result; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_export.js": +/*!*************************************************!*\ + !*** ./node_modules/core-js/modules/_export.js ***! + \*************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var core = __webpack_require__(/*! ./_core */ "./node_modules/core-js/modules/_core.js"); +var hide = __webpack_require__(/*! ./_hide */ "./node_modules/core-js/modules/_hide.js"); +var redefine = __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js"); +var ctx = __webpack_require__(/*! ./_ctx */ "./node_modules/core-js/modules/_ctx.js"); +var PROTOTYPE = 'prototype'; + +var $export = function (type, name, source) { + var IS_FORCED = type & $export.F; + var IS_GLOBAL = type & $export.G; + var IS_STATIC = type & $export.S; + var IS_PROTO = type & $export.P; + var IS_BIND = type & $export.B; + var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE]; + var exports = IS_GLOBAL ? core : core[name] || (core[name] = {}); + var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {}); + var key, own, out, exp; + if (IS_GLOBAL) source = name; + for (key in source) { + // contains in native + own = !IS_FORCED && target && target[key] !== undefined; + // export native or passed + out = (own ? target : source)[key]; + // bind timers to global for call from export context + exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out; + // extend global + if (target) redefine(target, key, out, type & $export.U); + // export + if (exports[key] != out) hide(exports, key, exp); + if (IS_PROTO && expProto[key] != out) expProto[key] = out; + } +}; +global.core = core; +// type bitmap +$export.F = 1; // forced +$export.G = 2; // global +$export.S = 4; // static +$export.P = 8; // proto +$export.B = 16; // bind +$export.W = 32; // wrap +$export.U = 64; // safe +$export.R = 128; // real proto method for `library` +module.exports = $export; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_fails-is-regexp.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/_fails-is-regexp.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var MATCH = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('match'); +module.exports = function (KEY) { + var re = /./; + try { + '/./'[KEY](re); + } catch (e) { + try { + re[MATCH] = false; + return !'/./'[KEY](re); + } catch (f) { /* empty */ } + } return true; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_fails.js": +/*!************************************************!*\ + !*** ./node_modules/core-js/modules/_fails.js ***! + \************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (exec) { + try { + return !!exec(); + } catch (e) { + return true; + } +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_fix-re-wks.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_fix-re-wks.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +__webpack_require__(/*! ./es6.regexp.exec */ "./node_modules/core-js/modules/es6.regexp.exec.js"); +var redefine = __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js"); +var hide = __webpack_require__(/*! ./_hide */ "./node_modules/core-js/modules/_hide.js"); +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +var defined = __webpack_require__(/*! ./_defined */ "./node_modules/core-js/modules/_defined.js"); +var wks = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js"); +var regexpExec = __webpack_require__(/*! ./_regexp-exec */ "./node_modules/core-js/modules/_regexp-exec.js"); + +var SPECIES = wks('species'); + +var REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () { + // #replace needs built-in support for named groups. + // #match works fine because it just return the exec results, even if it has + // a "grops" property. + var re = /./; + re.exec = function () { + var result = []; + result.groups = { a: '7' }; + return result; + }; + return ''.replace(re, '$') !== '7'; +}); + +var SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = (function () { + // Chrome 51 has a buggy "split" implementation when RegExp#exec !== nativeExec + var re = /(?:)/; + var originalExec = re.exec; + re.exec = function () { return originalExec.apply(this, arguments); }; + var result = 'ab'.split(re); + return result.length === 2 && result[0] === 'a' && result[1] === 'b'; +})(); + +module.exports = function (KEY, length, exec) { + var SYMBOL = wks(KEY); + + var DELEGATES_TO_SYMBOL = !fails(function () { + // String methods call symbol-named RegEp methods + var O = {}; + O[SYMBOL] = function () { return 7; }; + return ''[KEY](O) != 7; + }); + + var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL ? !fails(function () { + // Symbol-named RegExp methods call .exec + var execCalled = false; + var re = /a/; + re.exec = function () { execCalled = true; return null; }; + if (KEY === 'split') { + // RegExp[@@split] doesn't call the regex's exec method, but first creates + // a new one. We need to return the patched regex when creating the new one. + re.constructor = {}; + re.constructor[SPECIES] = function () { return re; }; + } + re[SYMBOL](''); + return !execCalled; + }) : undefined; + + if ( + !DELEGATES_TO_SYMBOL || + !DELEGATES_TO_EXEC || + (KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS) || + (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC) + ) { + var nativeRegExpMethod = /./[SYMBOL]; + var fns = exec( + defined, + SYMBOL, + ''[KEY], + function maybeCallNative(nativeMethod, regexp, str, arg2, forceStringMethod) { + if (regexp.exec === regexpExec) { + if (DELEGATES_TO_SYMBOL && !forceStringMethod) { + // The native String method already delegates to @@method (this + // polyfilled function), leasing to infinite recursion. + // We avoid it by directly calling the native @@method method. + return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) }; + } + return { done: true, value: nativeMethod.call(str, regexp, arg2) }; + } + return { done: false }; + } + ); + var strfn = fns[0]; + var rxfn = fns[1]; + + redefine(String.prototype, KEY, strfn); + hide(RegExp.prototype, SYMBOL, length == 2 + // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue) + // 21.2.5.11 RegExp.prototype[@@split](string, limit) + ? function (string, arg) { return rxfn.call(string, this, arg); } + // 21.2.5.6 RegExp.prototype[@@match](string) + // 21.2.5.9 RegExp.prototype[@@search](string) + : function (string) { return rxfn.call(string, this); } + ); + } +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_flags.js": +/*!************************************************!*\ + !*** ./node_modules/core-js/modules/_flags.js ***! + \************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// 21.2.5.3 get RegExp.prototype.flags +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +module.exports = function () { + var that = anObject(this); + var result = ''; + if (that.global) result += 'g'; + if (that.ignoreCase) result += 'i'; + if (that.multiline) result += 'm'; + if (that.unicode) result += 'u'; + if (that.sticky) result += 'y'; + return result; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_flatten-into-array.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/modules/_flatten-into-array.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// https://tc39.github.io/proposal-flatMap/#sec-FlattenIntoArray +var isArray = __webpack_require__(/*! ./_is-array */ "./node_modules/core-js/modules/_is-array.js"); +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var ctx = __webpack_require__(/*! ./_ctx */ "./node_modules/core-js/modules/_ctx.js"); +var IS_CONCAT_SPREADABLE = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('isConcatSpreadable'); + +function flattenIntoArray(target, original, source, sourceLen, start, depth, mapper, thisArg) { + var targetIndex = start; + var sourceIndex = 0; + var mapFn = mapper ? ctx(mapper, thisArg, 3) : false; + var element, spreadable; + + while (sourceIndex < sourceLen) { + if (sourceIndex in source) { + element = mapFn ? mapFn(source[sourceIndex], sourceIndex, original) : source[sourceIndex]; + + spreadable = false; + if (isObject(element)) { + spreadable = element[IS_CONCAT_SPREADABLE]; + spreadable = spreadable !== undefined ? !!spreadable : isArray(element); + } + + if (spreadable && depth > 0) { + targetIndex = flattenIntoArray(target, original, element, toLength(element.length), targetIndex, depth - 1) - 1; + } else { + if (targetIndex >= 0x1fffffffffffff) throw TypeError(); + target[targetIndex] = element; + } + + targetIndex++; + } + sourceIndex++; + } + return targetIndex; +} + +module.exports = flattenIntoArray; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_for-of.js": +/*!*************************************************!*\ + !*** ./node_modules/core-js/modules/_for-of.js ***! + \*************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var ctx = __webpack_require__(/*! ./_ctx */ "./node_modules/core-js/modules/_ctx.js"); +var call = __webpack_require__(/*! ./_iter-call */ "./node_modules/core-js/modules/_iter-call.js"); +var isArrayIter = __webpack_require__(/*! ./_is-array-iter */ "./node_modules/core-js/modules/_is-array-iter.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var getIterFn = __webpack_require__(/*! ./core.get-iterator-method */ "./node_modules/core-js/modules/core.get-iterator-method.js"); +var BREAK = {}; +var RETURN = {}; +var exports = module.exports = function (iterable, entries, fn, that, ITERATOR) { + var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable); + var f = ctx(fn, that, entries ? 2 : 1); + var index = 0; + var length, step, iterator, result; + if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!'); + // fast case for arrays with default iterator + if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) { + result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]); + if (result === BREAK || result === RETURN) return result; + } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) { + result = call(iterator, f, step.value, entries); + if (result === BREAK || result === RETURN) return result; + } +}; +exports.BREAK = BREAK; +exports.RETURN = RETURN; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_function-to-string.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/modules/_function-to-string.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(/*! ./_shared */ "./node_modules/core-js/modules/_shared.js")('native-function-to-string', Function.toString); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_global.js": +/*!*************************************************!*\ + !*** ./node_modules/core-js/modules/_global.js ***! + \*************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 +var global = module.exports = typeof window != 'undefined' && window.Math == Math + ? window : typeof self != 'undefined' && self.Math == Math ? self + // eslint-disable-next-line no-new-func + : Function('return this')(); +if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_has.js": +/*!**********************************************!*\ + !*** ./node_modules/core-js/modules/_has.js ***! + \**********************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +var hasOwnProperty = {}.hasOwnProperty; +module.exports = function (it, key) { + return hasOwnProperty.call(it, key); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_hide.js": +/*!***********************************************!*\ + !*** ./node_modules/core-js/modules/_hide.js ***! + \***********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var dP = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js"); +var createDesc = __webpack_require__(/*! ./_property-desc */ "./node_modules/core-js/modules/_property-desc.js"); +module.exports = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js") ? function (object, key, value) { + return dP.f(object, key, createDesc(1, value)); +} : function (object, key, value) { + object[key] = value; + return object; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_html.js": +/*!***********************************************!*\ + !*** ./node_modules/core-js/modules/_html.js ***! + \***********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var document = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js").document; +module.exports = document && document.documentElement; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_ie8-dom-define.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/_ie8-dom-define.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = !__webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js") && !__webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + return Object.defineProperty(__webpack_require__(/*! ./_dom-create */ "./node_modules/core-js/modules/_dom-create.js")('div'), 'a', { get: function () { return 7; } }).a != 7; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_inherit-if-required.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/_inherit-if-required.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var setPrototypeOf = __webpack_require__(/*! ./_set-proto */ "./node_modules/core-js/modules/_set-proto.js").set; +module.exports = function (that, target, C) { + var S = target.constructor; + var P; + if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) { + setPrototypeOf(that, P); + } return that; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_invoke.js": +/*!*************************************************!*\ + !*** ./node_modules/core-js/modules/_invoke.js ***! + \*************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// fast apply, http://jsperf.lnkit.com/fast-apply/5 +module.exports = function (fn, args, that) { + var un = that === undefined; + switch (args.length) { + case 0: return un ? fn() + : fn.call(that); + case 1: return un ? fn(args[0]) + : fn.call(that, args[0]); + case 2: return un ? fn(args[0], args[1]) + : fn.call(that, args[0], args[1]); + case 3: return un ? fn(args[0], args[1], args[2]) + : fn.call(that, args[0], args[1], args[2]); + case 4: return un ? fn(args[0], args[1], args[2], args[3]) + : fn.call(that, args[0], args[1], args[2], args[3]); + } return fn.apply(that, args); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_iobject.js": +/*!**************************************************!*\ + !*** ./node_modules/core-js/modules/_iobject.js ***! + \**************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// fallback for non-array-like ES3 and non-enumerable old V8 strings +var cof = __webpack_require__(/*! ./_cof */ "./node_modules/core-js/modules/_cof.js"); +// eslint-disable-next-line no-prototype-builtins +module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) { + return cof(it) == 'String' ? it.split('') : Object(it); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_is-array-iter.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/_is-array-iter.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// check on default Array iterator +var Iterators = __webpack_require__(/*! ./_iterators */ "./node_modules/core-js/modules/_iterators.js"); +var ITERATOR = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('iterator'); +var ArrayProto = Array.prototype; + +module.exports = function (it) { + return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_is-array.js": +/*!***************************************************!*\ + !*** ./node_modules/core-js/modules/_is-array.js ***! + \***************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 7.2.2 IsArray(argument) +var cof = __webpack_require__(/*! ./_cof */ "./node_modules/core-js/modules/_cof.js"); +module.exports = Array.isArray || function isArray(arg) { + return cof(arg) == 'Array'; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_is-integer.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_is-integer.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.1.2.3 Number.isInteger(number) +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var floor = Math.floor; +module.exports = function isInteger(it) { + return !isObject(it) && isFinite(it) && floor(it) === it; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_is-object.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_is-object.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (it) { + return typeof it === 'object' ? it !== null : typeof it === 'function'; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_is-regexp.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_is-regexp.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 7.2.8 IsRegExp(argument) +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var cof = __webpack_require__(/*! ./_cof */ "./node_modules/core-js/modules/_cof.js"); +var MATCH = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('match'); +module.exports = function (it) { + var isRegExp; + return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp'); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_iter-call.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_iter-call.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// call something on iterator step with safe closing on error +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +module.exports = function (iterator, fn, value, entries) { + try { + return entries ? fn(anObject(value)[0], value[1]) : fn(value); + // 7.4.6 IteratorClose(iterator, completion) + } catch (e) { + var ret = iterator['return']; + if (ret !== undefined) anObject(ret.call(iterator)); + throw e; + } +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_iter-create.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_iter-create.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var create = __webpack_require__(/*! ./_object-create */ "./node_modules/core-js/modules/_object-create.js"); +var descriptor = __webpack_require__(/*! ./_property-desc */ "./node_modules/core-js/modules/_property-desc.js"); +var setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ "./node_modules/core-js/modules/_set-to-string-tag.js"); +var IteratorPrototype = {}; + +// 25.1.2.1.1 %IteratorPrototype%[@@iterator]() +__webpack_require__(/*! ./_hide */ "./node_modules/core-js/modules/_hide.js")(IteratorPrototype, __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('iterator'), function () { return this; }); + +module.exports = function (Constructor, NAME, next) { + Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) }); + setToStringTag(Constructor, NAME + ' Iterator'); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_iter-define.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_iter-define.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var LIBRARY = __webpack_require__(/*! ./_library */ "./node_modules/core-js/modules/_library.js"); +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var redefine = __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js"); +var hide = __webpack_require__(/*! ./_hide */ "./node_modules/core-js/modules/_hide.js"); +var Iterators = __webpack_require__(/*! ./_iterators */ "./node_modules/core-js/modules/_iterators.js"); +var $iterCreate = __webpack_require__(/*! ./_iter-create */ "./node_modules/core-js/modules/_iter-create.js"); +var setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ "./node_modules/core-js/modules/_set-to-string-tag.js"); +var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "./node_modules/core-js/modules/_object-gpo.js"); +var ITERATOR = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('iterator'); +var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next` +var FF_ITERATOR = '@@iterator'; +var KEYS = 'keys'; +var VALUES = 'values'; + +var returnThis = function () { return this; }; + +module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) { + $iterCreate(Constructor, NAME, next); + var getMethod = function (kind) { + if (!BUGGY && kind in proto) return proto[kind]; + switch (kind) { + case KEYS: return function keys() { return new Constructor(this, kind); }; + case VALUES: return function values() { return new Constructor(this, kind); }; + } return function entries() { return new Constructor(this, kind); }; + }; + var TAG = NAME + ' Iterator'; + var DEF_VALUES = DEFAULT == VALUES; + var VALUES_BUG = false; + var proto = Base.prototype; + var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT]; + var $default = $native || getMethod(DEFAULT); + var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined; + var $anyNative = NAME == 'Array' ? proto.entries || $native : $native; + var methods, key, IteratorPrototype; + // Fix native + if ($anyNative) { + IteratorPrototype = getPrototypeOf($anyNative.call(new Base())); + if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) { + // Set @@toStringTag to native iterators + setToStringTag(IteratorPrototype, TAG, true); + // fix for some old engines + if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis); + } + } + // fix Array#{values, @@iterator}.name in V8 / FF + if (DEF_VALUES && $native && $native.name !== VALUES) { + VALUES_BUG = true; + $default = function values() { return $native.call(this); }; + } + // Define iterator + if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) { + hide(proto, ITERATOR, $default); + } + // Plug for library + Iterators[NAME] = $default; + Iterators[TAG] = returnThis; + if (DEFAULT) { + methods = { + values: DEF_VALUES ? $default : getMethod(VALUES), + keys: IS_SET ? $default : getMethod(KEYS), + entries: $entries + }; + if (FORCED) for (key in methods) { + if (!(key in proto)) redefine(proto, key, methods[key]); + } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods); + } + return methods; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_iter-detect.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_iter-detect.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var ITERATOR = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('iterator'); +var SAFE_CLOSING = false; + +try { + var riter = [7][ITERATOR](); + riter['return'] = function () { SAFE_CLOSING = true; }; + // eslint-disable-next-line no-throw-literal + Array.from(riter, function () { throw 2; }); +} catch (e) { /* empty */ } + +module.exports = function (exec, skipClosing) { + if (!skipClosing && !SAFE_CLOSING) return false; + var safe = false; + try { + var arr = [7]; + var iter = arr[ITERATOR](); + iter.next = function () { return { done: safe = true }; }; + arr[ITERATOR] = function () { return iter; }; + exec(arr); + } catch (e) { /* empty */ } + return safe; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_iter-step.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_iter-step.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (done, value) { + return { value: value, done: !!done }; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_iterators.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_iterators.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = {}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_library.js": +/*!**************************************************!*\ + !*** ./node_modules/core-js/modules/_library.js ***! + \**************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = false; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_math-expm1.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_math-expm1.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// 20.2.2.14 Math.expm1(x) +var $expm1 = Math.expm1; +module.exports = (!$expm1 + // Old FF bug + || $expm1(10) > 22025.465794806719 || $expm1(10) < 22025.4657948067165168 + // Tor Browser bug + || $expm1(-2e-17) != -2e-17 +) ? function expm1(x) { + return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1; +} : $expm1; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_math-fround.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_math-fround.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.16 Math.fround(x) +var sign = __webpack_require__(/*! ./_math-sign */ "./node_modules/core-js/modules/_math-sign.js"); +var pow = Math.pow; +var EPSILON = pow(2, -52); +var EPSILON32 = pow(2, -23); +var MAX32 = pow(2, 127) * (2 - EPSILON32); +var MIN32 = pow(2, -126); + +var roundTiesToEven = function (n) { + return n + 1 / EPSILON - 1 / EPSILON; +}; + +module.exports = Math.fround || function fround(x) { + var $abs = Math.abs(x); + var $sign = sign(x); + var a, result; + if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32; + a = (1 + EPSILON32 / EPSILON) * $abs; + result = a - (a - $abs); + // eslint-disable-next-line no-self-compare + if (result > MAX32 || result != result) return $sign * Infinity; + return $sign * result; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_math-log1p.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_math-log1p.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// 20.2.2.20 Math.log1p(x) +module.exports = Math.log1p || function log1p(x) { + return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_math-scale.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_math-scale.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// https://rwaldron.github.io/proposal-math-extensions/ +module.exports = Math.scale || function scale(x, inLow, inHigh, outLow, outHigh) { + if ( + arguments.length === 0 + // eslint-disable-next-line no-self-compare + || x != x + // eslint-disable-next-line no-self-compare + || inLow != inLow + // eslint-disable-next-line no-self-compare + || inHigh != inHigh + // eslint-disable-next-line no-self-compare + || outLow != outLow + // eslint-disable-next-line no-self-compare + || outHigh != outHigh + ) return NaN; + if (x === Infinity || x === -Infinity) return x; + return (x - inLow) * (outHigh - outLow) / (inHigh - inLow) + outLow; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_math-sign.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_math-sign.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// 20.2.2.28 Math.sign(x) +module.exports = Math.sign || function sign(x) { + // eslint-disable-next-line no-self-compare + return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_meta.js": +/*!***********************************************!*\ + !*** ./node_modules/core-js/modules/_meta.js ***! + \***********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var META = __webpack_require__(/*! ./_uid */ "./node_modules/core-js/modules/_uid.js")('meta'); +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); +var setDesc = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js").f; +var id = 0; +var isExtensible = Object.isExtensible || function () { + return true; +}; +var FREEZE = !__webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + return isExtensible(Object.preventExtensions({})); +}); +var setMeta = function (it) { + setDesc(it, META, { value: { + i: 'O' + ++id, // object ID + w: {} // weak collections IDs + } }); +}; +var fastKey = function (it, create) { + // return primitive with prefix + if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it; + if (!has(it, META)) { + // can't set metadata to uncaught frozen object + if (!isExtensible(it)) return 'F'; + // not necessary to add metadata + if (!create) return 'E'; + // add missing metadata + setMeta(it); + // return object ID + } return it[META].i; +}; +var getWeak = function (it, create) { + if (!has(it, META)) { + // can't set metadata to uncaught frozen object + if (!isExtensible(it)) return true; + // not necessary to add metadata + if (!create) return false; + // add missing metadata + setMeta(it); + // return hash weak collections IDs + } return it[META].w; +}; +// add metadata on freeze-family methods calling +var onFreeze = function (it) { + if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it); + return it; +}; +var meta = module.exports = { + KEY: META, + NEED: false, + fastKey: fastKey, + getWeak: getWeak, + onFreeze: onFreeze +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_metadata.js": +/*!***************************************************!*\ + !*** ./node_modules/core-js/modules/_metadata.js ***! + \***************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var Map = __webpack_require__(/*! ./es6.map */ "./node_modules/core-js/modules/es6.map.js"); +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var shared = __webpack_require__(/*! ./_shared */ "./node_modules/core-js/modules/_shared.js")('metadata'); +var store = shared.store || (shared.store = new (__webpack_require__(/*! ./es6.weak-map */ "./node_modules/core-js/modules/es6.weak-map.js"))()); + +var getOrCreateMetadataMap = function (target, targetKey, create) { + var targetMetadata = store.get(target); + if (!targetMetadata) { + if (!create) return undefined; + store.set(target, targetMetadata = new Map()); + } + var keyMetadata = targetMetadata.get(targetKey); + if (!keyMetadata) { + if (!create) return undefined; + targetMetadata.set(targetKey, keyMetadata = new Map()); + } return keyMetadata; +}; +var ordinaryHasOwnMetadata = function (MetadataKey, O, P) { + var metadataMap = getOrCreateMetadataMap(O, P, false); + return metadataMap === undefined ? false : metadataMap.has(MetadataKey); +}; +var ordinaryGetOwnMetadata = function (MetadataKey, O, P) { + var metadataMap = getOrCreateMetadataMap(O, P, false); + return metadataMap === undefined ? undefined : metadataMap.get(MetadataKey); +}; +var ordinaryDefineOwnMetadata = function (MetadataKey, MetadataValue, O, P) { + getOrCreateMetadataMap(O, P, true).set(MetadataKey, MetadataValue); +}; +var ordinaryOwnMetadataKeys = function (target, targetKey) { + var metadataMap = getOrCreateMetadataMap(target, targetKey, false); + var keys = []; + if (metadataMap) metadataMap.forEach(function (_, key) { keys.push(key); }); + return keys; +}; +var toMetaKey = function (it) { + return it === undefined || typeof it == 'symbol' ? it : String(it); +}; +var exp = function (O) { + $export($export.S, 'Reflect', O); +}; + +module.exports = { + store: store, + map: getOrCreateMetadataMap, + has: ordinaryHasOwnMetadata, + get: ordinaryGetOwnMetadata, + set: ordinaryDefineOwnMetadata, + keys: ordinaryOwnMetadataKeys, + key: toMetaKey, + exp: exp +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_microtask.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_microtask.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var macrotask = __webpack_require__(/*! ./_task */ "./node_modules/core-js/modules/_task.js").set; +var Observer = global.MutationObserver || global.WebKitMutationObserver; +var process = global.process; +var Promise = global.Promise; +var isNode = __webpack_require__(/*! ./_cof */ "./node_modules/core-js/modules/_cof.js")(process) == 'process'; + +module.exports = function () { + var head, last, notify; + + var flush = function () { + var parent, fn; + if (isNode && (parent = process.domain)) parent.exit(); + while (head) { + fn = head.fn; + head = head.next; + try { + fn(); + } catch (e) { + if (head) notify(); + else last = undefined; + throw e; + } + } last = undefined; + if (parent) parent.enter(); + }; + + // Node.js + if (isNode) { + notify = function () { + process.nextTick(flush); + }; + // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339 + } else if (Observer && !(global.navigator && global.navigator.standalone)) { + var toggle = true; + var node = document.createTextNode(''); + new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new + notify = function () { + node.data = toggle = !toggle; + }; + // environments with maybe non-completely correct, but existent Promise + } else if (Promise && Promise.resolve) { + // Promise.resolve without an argument throws an error in LG WebOS 2 + var promise = Promise.resolve(undefined); + notify = function () { + promise.then(flush); + }; + // for other environments - macrotask based on: + // - setImmediate + // - MessageChannel + // - window.postMessag + // - onreadystatechange + // - setTimeout + } else { + notify = function () { + // strange IE + webpack dev server bug - use .call(global) + macrotask.call(global, flush); + }; + } + + return function (fn) { + var task = { fn: fn, next: undefined }; + if (last) last.next = task; + if (!head) { + head = task; + notify(); + } last = task; + }; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_new-promise-capability.js": +/*!*****************************************************************!*\ + !*** ./node_modules/core-js/modules/_new-promise-capability.js ***! + \*****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// 25.4.1.5 NewPromiseCapability(C) +var aFunction = __webpack_require__(/*! ./_a-function */ "./node_modules/core-js/modules/_a-function.js"); + +function PromiseCapability(C) { + var resolve, reject; + this.promise = new C(function ($$resolve, $$reject) { + if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor'); + resolve = $$resolve; + reject = $$reject; + }); + this.resolve = aFunction(resolve); + this.reject = aFunction(reject); +} + +module.exports.f = function (C) { + return new PromiseCapability(C); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-assign.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/_object-assign.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// 19.1.2.1 Object.assign(target, source, ...) +var DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js"); +var getKeys = __webpack_require__(/*! ./_object-keys */ "./node_modules/core-js/modules/_object-keys.js"); +var gOPS = __webpack_require__(/*! ./_object-gops */ "./node_modules/core-js/modules/_object-gops.js"); +var pIE = __webpack_require__(/*! ./_object-pie */ "./node_modules/core-js/modules/_object-pie.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var IObject = __webpack_require__(/*! ./_iobject */ "./node_modules/core-js/modules/_iobject.js"); +var $assign = Object.assign; + +// should work with symbols and should have deterministic property order (V8 bug) +module.exports = !$assign || __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + var A = {}; + var B = {}; + // eslint-disable-next-line no-undef + var S = Symbol(); + var K = 'abcdefghijklmnopqrst'; + A[S] = 7; + K.split('').forEach(function (k) { B[k] = k; }); + return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K; +}) ? function assign(target, source) { // eslint-disable-line no-unused-vars + var T = toObject(target); + var aLen = arguments.length; + var index = 1; + var getSymbols = gOPS.f; + var isEnum = pIE.f; + while (aLen > index) { + var S = IObject(arguments[index++]); + var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S); + var length = keys.length; + var j = 0; + var key; + while (length > j) { + key = keys[j++]; + if (!DESCRIPTORS || isEnum.call(S, key)) T[key] = S[key]; + } + } return T; +} : $assign; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-create.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/_object-create.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var dPs = __webpack_require__(/*! ./_object-dps */ "./node_modules/core-js/modules/_object-dps.js"); +var enumBugKeys = __webpack_require__(/*! ./_enum-bug-keys */ "./node_modules/core-js/modules/_enum-bug-keys.js"); +var IE_PROTO = __webpack_require__(/*! ./_shared-key */ "./node_modules/core-js/modules/_shared-key.js")('IE_PROTO'); +var Empty = function () { /* empty */ }; +var PROTOTYPE = 'prototype'; + +// Create object with fake `null` prototype: use iframe Object with cleared prototype +var createDict = function () { + // Thrash, waste and sodomy: IE GC bug + var iframe = __webpack_require__(/*! ./_dom-create */ "./node_modules/core-js/modules/_dom-create.js")('iframe'); + var i = enumBugKeys.length; + var lt = '<'; + var gt = '>'; + var iframeDocument; + iframe.style.display = 'none'; + __webpack_require__(/*! ./_html */ "./node_modules/core-js/modules/_html.js").appendChild(iframe); + iframe.src = 'javascript:'; // eslint-disable-line no-script-url + // createDict = iframe.contentWindow.Object; + // html.removeChild(iframe); + iframeDocument = iframe.contentWindow.document; + iframeDocument.open(); + iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt); + iframeDocument.close(); + createDict = iframeDocument.F; + while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]]; + return createDict(); +}; + +module.exports = Object.create || function create(O, Properties) { + var result; + if (O !== null) { + Empty[PROTOTYPE] = anObject(O); + result = new Empty(); + Empty[PROTOTYPE] = null; + // add "__proto__" for Object.getPrototypeOf polyfill + result[IE_PROTO] = O; + } else result = createDict(); + return Properties === undefined ? result : dPs(result, Properties); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-dp.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_object-dp.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var IE8_DOM_DEFINE = __webpack_require__(/*! ./_ie8-dom-define */ "./node_modules/core-js/modules/_ie8-dom-define.js"); +var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "./node_modules/core-js/modules/_to-primitive.js"); +var dP = Object.defineProperty; + +exports.f = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js") ? Object.defineProperty : function defineProperty(O, P, Attributes) { + anObject(O); + P = toPrimitive(P, true); + anObject(Attributes); + if (IE8_DOM_DEFINE) try { + return dP(O, P, Attributes); + } catch (e) { /* empty */ } + if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!'); + if ('value' in Attributes) O[P] = Attributes.value; + return O; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-dps.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_object-dps.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var dP = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var getKeys = __webpack_require__(/*! ./_object-keys */ "./node_modules/core-js/modules/_object-keys.js"); + +module.exports = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js") ? Object.defineProperties : function defineProperties(O, Properties) { + anObject(O); + var keys = getKeys(Properties); + var length = keys.length; + var i = 0; + var P; + while (length > i) dP.f(O, P = keys[i++], Properties[P]); + return O; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-forced-pam.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/_object-forced-pam.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// Forced replacement prototype accessors methods +module.exports = __webpack_require__(/*! ./_library */ "./node_modules/core-js/modules/_library.js") || !__webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + var K = Math.random(); + // In FF throws only define methods + // eslint-disable-next-line no-undef, no-useless-call + __defineSetter__.call(null, K, function () { /* empty */ }); + delete __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js")[K]; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-gopd.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_object-gopd.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var pIE = __webpack_require__(/*! ./_object-pie */ "./node_modules/core-js/modules/_object-pie.js"); +var createDesc = __webpack_require__(/*! ./_property-desc */ "./node_modules/core-js/modules/_property-desc.js"); +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/core-js/modules/_to-iobject.js"); +var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "./node_modules/core-js/modules/_to-primitive.js"); +var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); +var IE8_DOM_DEFINE = __webpack_require__(/*! ./_ie8-dom-define */ "./node_modules/core-js/modules/_ie8-dom-define.js"); +var gOPD = Object.getOwnPropertyDescriptor; + +exports.f = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js") ? gOPD : function getOwnPropertyDescriptor(O, P) { + O = toIObject(O); + P = toPrimitive(P, true); + if (IE8_DOM_DEFINE) try { + return gOPD(O, P); + } catch (e) { /* empty */ } + if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-gopn-ext.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/_object-gopn-ext.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/core-js/modules/_to-iobject.js"); +var gOPN = __webpack_require__(/*! ./_object-gopn */ "./node_modules/core-js/modules/_object-gopn.js").f; +var toString = {}.toString; + +var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames + ? Object.getOwnPropertyNames(window) : []; + +var getWindowNames = function (it) { + try { + return gOPN(it); + } catch (e) { + return windowNames.slice(); + } +}; + +module.exports.f = function getOwnPropertyNames(it) { + return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it)); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-gopn.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_object-gopn.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O) +var $keys = __webpack_require__(/*! ./_object-keys-internal */ "./node_modules/core-js/modules/_object-keys-internal.js"); +var hiddenKeys = __webpack_require__(/*! ./_enum-bug-keys */ "./node_modules/core-js/modules/_enum-bug-keys.js").concat('length', 'prototype'); + +exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { + return $keys(O, hiddenKeys); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-gops.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_object-gops.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +exports.f = Object.getOwnPropertySymbols; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-gpo.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_object-gpo.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O) +var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var IE_PROTO = __webpack_require__(/*! ./_shared-key */ "./node_modules/core-js/modules/_shared-key.js")('IE_PROTO'); +var ObjectProto = Object.prototype; + +module.exports = Object.getPrototypeOf || function (O) { + O = toObject(O); + if (has(O, IE_PROTO)) return O[IE_PROTO]; + if (typeof O.constructor == 'function' && O instanceof O.constructor) { + return O.constructor.prototype; + } return O instanceof Object ? ObjectProto : null; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-keys-internal.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/modules/_object-keys-internal.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/core-js/modules/_to-iobject.js"); +var arrayIndexOf = __webpack_require__(/*! ./_array-includes */ "./node_modules/core-js/modules/_array-includes.js")(false); +var IE_PROTO = __webpack_require__(/*! ./_shared-key */ "./node_modules/core-js/modules/_shared-key.js")('IE_PROTO'); + +module.exports = function (object, names) { + var O = toIObject(object); + var i = 0; + var result = []; + var key; + for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key); + // Don't enum bug & hidden keys + while (names.length > i) if (has(O, key = names[i++])) { + ~arrayIndexOf(result, key) || result.push(key); + } + return result; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-keys.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_object-keys.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.14 / 15.2.3.14 Object.keys(O) +var $keys = __webpack_require__(/*! ./_object-keys-internal */ "./node_modules/core-js/modules/_object-keys-internal.js"); +var enumBugKeys = __webpack_require__(/*! ./_enum-bug-keys */ "./node_modules/core-js/modules/_enum-bug-keys.js"); + +module.exports = Object.keys || function keys(O) { + return $keys(O, enumBugKeys); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-pie.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_object-pie.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +exports.f = {}.propertyIsEnumerable; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-sap.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_object-sap.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// most Object methods by ES6 should accept primitives +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var core = __webpack_require__(/*! ./_core */ "./node_modules/core-js/modules/_core.js"); +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +module.exports = function (KEY, exec) { + var fn = (core.Object || {})[KEY] || Object[KEY]; + var exp = {}; + exp[KEY] = exec(fn); + $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-to-array.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/_object-to-array.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js"); +var getKeys = __webpack_require__(/*! ./_object-keys */ "./node_modules/core-js/modules/_object-keys.js"); +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/core-js/modules/_to-iobject.js"); +var isEnum = __webpack_require__(/*! ./_object-pie */ "./node_modules/core-js/modules/_object-pie.js").f; +module.exports = function (isEntries) { + return function (it) { + var O = toIObject(it); + var keys = getKeys(O); + var length = keys.length; + var i = 0; + var result = []; + var key; + while (length > i) { + key = keys[i++]; + if (!DESCRIPTORS || isEnum.call(O, key)) { + result.push(isEntries ? [key, O[key]] : O[key]); + } + } + return result; + }; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_own-keys.js": +/*!***************************************************!*\ + !*** ./node_modules/core-js/modules/_own-keys.js ***! + \***************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// all object keys, includes non-enumerable and symbols +var gOPN = __webpack_require__(/*! ./_object-gopn */ "./node_modules/core-js/modules/_object-gopn.js"); +var gOPS = __webpack_require__(/*! ./_object-gops */ "./node_modules/core-js/modules/_object-gops.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var Reflect = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js").Reflect; +module.exports = Reflect && Reflect.ownKeys || function ownKeys(it) { + var keys = gOPN.f(anObject(it)); + var getSymbols = gOPS.f; + return getSymbols ? keys.concat(getSymbols(it)) : keys; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_parse-float.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_parse-float.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $parseFloat = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js").parseFloat; +var $trim = __webpack_require__(/*! ./_string-trim */ "./node_modules/core-js/modules/_string-trim.js").trim; + +module.exports = 1 / $parseFloat(__webpack_require__(/*! ./_string-ws */ "./node_modules/core-js/modules/_string-ws.js") + '-0') !== -Infinity ? function parseFloat(str) { + var string = $trim(String(str), 3); + var result = $parseFloat(string); + return result === 0 && string.charAt(0) == '-' ? -0 : result; +} : $parseFloat; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_parse-int.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_parse-int.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $parseInt = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js").parseInt; +var $trim = __webpack_require__(/*! ./_string-trim */ "./node_modules/core-js/modules/_string-trim.js").trim; +var ws = __webpack_require__(/*! ./_string-ws */ "./node_modules/core-js/modules/_string-ws.js"); +var hex = /^[-+]?0[xX]/; + +module.exports = $parseInt(ws + '08') !== 8 || $parseInt(ws + '0x16') !== 22 ? function parseInt(str, radix) { + var string = $trim(String(str), 3); + return $parseInt(string, (radix >>> 0) || (hex.test(string) ? 16 : 10)); +} : $parseInt; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_perform.js": +/*!**************************************************!*\ + !*** ./node_modules/core-js/modules/_perform.js ***! + \**************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (exec) { + try { + return { e: false, v: exec() }; + } catch (e) { + return { e: true, v: e }; + } +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_promise-resolve.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/_promise-resolve.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var newPromiseCapability = __webpack_require__(/*! ./_new-promise-capability */ "./node_modules/core-js/modules/_new-promise-capability.js"); + +module.exports = function (C, x) { + anObject(C); + if (isObject(x) && x.constructor === C) return x; + var promiseCapability = newPromiseCapability.f(C); + var resolve = promiseCapability.resolve; + resolve(x); + return promiseCapability.promise; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_property-desc.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/_property-desc.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (bitmap, value) { + return { + enumerable: !(bitmap & 1), + configurable: !(bitmap & 2), + writable: !(bitmap & 4), + value: value + }; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_redefine-all.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/_redefine-all.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var redefine = __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js"); +module.exports = function (target, src, safe) { + for (var key in src) redefine(target, key, src[key], safe); + return target; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_redefine.js": +/*!***************************************************!*\ + !*** ./node_modules/core-js/modules/_redefine.js ***! + \***************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var hide = __webpack_require__(/*! ./_hide */ "./node_modules/core-js/modules/_hide.js"); +var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); +var SRC = __webpack_require__(/*! ./_uid */ "./node_modules/core-js/modules/_uid.js")('src'); +var $toString = __webpack_require__(/*! ./_function-to-string */ "./node_modules/core-js/modules/_function-to-string.js"); +var TO_STRING = 'toString'; +var TPL = ('' + $toString).split(TO_STRING); + +__webpack_require__(/*! ./_core */ "./node_modules/core-js/modules/_core.js").inspectSource = function (it) { + return $toString.call(it); +}; + +(module.exports = function (O, key, val, safe) { + var isFunction = typeof val == 'function'; + if (isFunction) has(val, 'name') || hide(val, 'name', key); + if (O[key] === val) return; + if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key))); + if (O === global) { + O[key] = val; + } else if (!safe) { + delete O[key]; + hide(O, key, val); + } else if (O[key]) { + O[key] = val; + } else { + hide(O, key, val); + } +// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative +})(Function.prototype, TO_STRING, function toString() { + return typeof this == 'function' && this[SRC] || $toString.call(this); +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_regexp-exec-abstract.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/modules/_regexp-exec-abstract.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var classof = __webpack_require__(/*! ./_classof */ "./node_modules/core-js/modules/_classof.js"); +var builtinExec = RegExp.prototype.exec; + + // `RegExpExec` abstract operation +// https://tc39.github.io/ecma262/#sec-regexpexec +module.exports = function (R, S) { + var exec = R.exec; + if (typeof exec === 'function') { + var result = exec.call(R, S); + if (typeof result !== 'object') { + throw new TypeError('RegExp exec method returned something other than an Object or null'); + } + return result; + } + if (classof(R) !== 'RegExp') { + throw new TypeError('RegExp#exec called on incompatible receiver'); + } + return builtinExec.call(R, S); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_regexp-exec.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_regexp-exec.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var regexpFlags = __webpack_require__(/*! ./_flags */ "./node_modules/core-js/modules/_flags.js"); + +var nativeExec = RegExp.prototype.exec; +// This always refers to the native implementation, because the +// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js, +// which loads this file before patching the method. +var nativeReplace = String.prototype.replace; + +var patchedExec = nativeExec; + +var LAST_INDEX = 'lastIndex'; + +var UPDATES_LAST_INDEX_WRONG = (function () { + var re1 = /a/, + re2 = /b*/g; + nativeExec.call(re1, 'a'); + nativeExec.call(re2, 'a'); + return re1[LAST_INDEX] !== 0 || re2[LAST_INDEX] !== 0; +})(); + +// nonparticipating capturing group, copied from es5-shim's String#split patch. +var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined; + +var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED; + +if (PATCH) { + patchedExec = function exec(str) { + var re = this; + var lastIndex, reCopy, match, i; + + if (NPCG_INCLUDED) { + reCopy = new RegExp('^' + re.source + '$(?!\\s)', regexpFlags.call(re)); + } + if (UPDATES_LAST_INDEX_WRONG) lastIndex = re[LAST_INDEX]; + + match = nativeExec.call(re, str); + + if (UPDATES_LAST_INDEX_WRONG && match) { + re[LAST_INDEX] = re.global ? match.index + match[0].length : lastIndex; + } + if (NPCG_INCLUDED && match && match.length > 1) { + // Fix browsers whose `exec` methods don't consistently return `undefined` + // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/ + // eslint-disable-next-line no-loop-func + nativeReplace.call(match[0], reCopy, function () { + for (i = 1; i < arguments.length - 2; i++) { + if (arguments[i] === undefined) match[i] = undefined; + } + }); + } + + return match; + }; +} + +module.exports = patchedExec; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_replacer.js": +/*!***************************************************!*\ + !*** ./node_modules/core-js/modules/_replacer.js ***! + \***************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (regExp, replace) { + var replacer = replace === Object(replace) ? function (part) { + return replace[part]; + } : replace; + return function (it) { + return String(it).replace(regExp, replacer); + }; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_same-value.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_same-value.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// 7.2.9 SameValue(x, y) +module.exports = Object.is || function is(x, y) { + // eslint-disable-next-line no-self-compare + return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_set-collection-from.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/_set-collection-from.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// https://tc39.github.io/proposal-setmap-offrom/ +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var aFunction = __webpack_require__(/*! ./_a-function */ "./node_modules/core-js/modules/_a-function.js"); +var ctx = __webpack_require__(/*! ./_ctx */ "./node_modules/core-js/modules/_ctx.js"); +var forOf = __webpack_require__(/*! ./_for-of */ "./node_modules/core-js/modules/_for-of.js"); + +module.exports = function (COLLECTION) { + $export($export.S, COLLECTION, { from: function from(source /* , mapFn, thisArg */) { + var mapFn = arguments[1]; + var mapping, A, n, cb; + aFunction(this); + mapping = mapFn !== undefined; + if (mapping) aFunction(mapFn); + if (source == undefined) return new this(); + A = []; + if (mapping) { + n = 0; + cb = ctx(mapFn, arguments[2], 2); + forOf(source, false, function (nextItem) { + A.push(cb(nextItem, n++)); + }); + } else { + forOf(source, false, A.push, A); + } + return new this(A); + } }); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_set-collection-of.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/_set-collection-of.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// https://tc39.github.io/proposal-setmap-offrom/ +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +module.exports = function (COLLECTION) { + $export($export.S, COLLECTION, { of: function of() { + var length = arguments.length; + var A = new Array(length); + while (length--) A[length] = arguments[length]; + return new this(A); + } }); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_set-proto.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_set-proto.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// Works with __proto__ only. Old v8 can't work with null proto objects. +/* eslint-disable no-proto */ +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var check = function (O, proto) { + anObject(O); + if (!isObject(proto) && proto !== null) throw TypeError(proto + ": can't set as prototype!"); +}; +module.exports = { + set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line + function (test, buggy, set) { + try { + set = __webpack_require__(/*! ./_ctx */ "./node_modules/core-js/modules/_ctx.js")(Function.call, __webpack_require__(/*! ./_object-gopd */ "./node_modules/core-js/modules/_object-gopd.js").f(Object.prototype, '__proto__').set, 2); + set(test, []); + buggy = !(test instanceof Array); + } catch (e) { buggy = true; } + return function setPrototypeOf(O, proto) { + check(O, proto); + if (buggy) O.__proto__ = proto; + else set(O, proto); + return O; + }; + }({}, false) : undefined), + check: check +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_set-species.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_set-species.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var dP = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js"); +var DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js"); +var SPECIES = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('species'); + +module.exports = function (KEY) { + var C = global[KEY]; + if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, { + configurable: true, + get: function () { return this; } + }); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_set-to-string-tag.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/_set-to-string-tag.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var def = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js").f; +var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); +var TAG = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('toStringTag'); + +module.exports = function (it, tag, stat) { + if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag }); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_shared-key.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_shared-key.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var shared = __webpack_require__(/*! ./_shared */ "./node_modules/core-js/modules/_shared.js")('keys'); +var uid = __webpack_require__(/*! ./_uid */ "./node_modules/core-js/modules/_uid.js"); +module.exports = function (key) { + return shared[key] || (shared[key] = uid(key)); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_shared.js": +/*!*************************************************!*\ + !*** ./node_modules/core-js/modules/_shared.js ***! + \*************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var core = __webpack_require__(/*! ./_core */ "./node_modules/core-js/modules/_core.js"); +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var SHARED = '__core-js_shared__'; +var store = global[SHARED] || (global[SHARED] = {}); + +(module.exports = function (key, value) { + return store[key] || (store[key] = value !== undefined ? value : {}); +})('versions', []).push({ + version: core.version, + mode: __webpack_require__(/*! ./_library */ "./node_modules/core-js/modules/_library.js") ? 'pure' : 'global', + copyright: '© 2019 Denis Pushkarev (zloirock.ru)' +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_species-constructor.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/_species-constructor.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 7.3.20 SpeciesConstructor(O, defaultConstructor) +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var aFunction = __webpack_require__(/*! ./_a-function */ "./node_modules/core-js/modules/_a-function.js"); +var SPECIES = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('species'); +module.exports = function (O, D) { + var C = anObject(O).constructor; + var S; + return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_strict-method.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/_strict-method.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); + +module.exports = function (method, arg) { + return !!method && fails(function () { + // eslint-disable-next-line no-useless-call + arg ? method.call(null, function () { /* empty */ }, 1) : method.call(null); + }); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_string-at.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_string-at.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var toInteger = __webpack_require__(/*! ./_to-integer */ "./node_modules/core-js/modules/_to-integer.js"); +var defined = __webpack_require__(/*! ./_defined */ "./node_modules/core-js/modules/_defined.js"); +// true -> String#at +// false -> String#codePointAt +module.exports = function (TO_STRING) { + return function (that, pos) { + var s = String(defined(that)); + var i = toInteger(pos); + var l = s.length; + var a, b; + if (i < 0 || i >= l) return TO_STRING ? '' : undefined; + a = s.charCodeAt(i); + return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff + ? TO_STRING ? s.charAt(i) : a + : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000; + }; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_string-context.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/_string-context.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// helper for String#{startsWith, endsWith, includes} +var isRegExp = __webpack_require__(/*! ./_is-regexp */ "./node_modules/core-js/modules/_is-regexp.js"); +var defined = __webpack_require__(/*! ./_defined */ "./node_modules/core-js/modules/_defined.js"); + +module.exports = function (that, searchString, NAME) { + if (isRegExp(searchString)) throw TypeError('String#' + NAME + " doesn't accept regex!"); + return String(defined(that)); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_string-html.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_string-html.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +var defined = __webpack_require__(/*! ./_defined */ "./node_modules/core-js/modules/_defined.js"); +var quot = /"/g; +// B.2.3.2.1 CreateHTML(string, tag, attribute, value) +var createHTML = function (string, tag, attribute, value) { + var S = String(defined(string)); + var p1 = '<' + tag; + if (attribute !== '') p1 += ' ' + attribute + '="' + String(value).replace(quot, '"') + '"'; + return p1 + '>' + S + ''; +}; +module.exports = function (NAME, exec) { + var O = {}; + O[NAME] = exec(createHTML); + $export($export.P + $export.F * fails(function () { + var test = ''[NAME]('"'); + return test !== test.toLowerCase() || test.split('"').length > 3; + }), 'String', O); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_string-pad.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_string-pad.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// https://github.com/tc39/proposal-string-pad-start-end +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var repeat = __webpack_require__(/*! ./_string-repeat */ "./node_modules/core-js/modules/_string-repeat.js"); +var defined = __webpack_require__(/*! ./_defined */ "./node_modules/core-js/modules/_defined.js"); + +module.exports = function (that, maxLength, fillString, left) { + var S = String(defined(that)); + var stringLength = S.length; + var fillStr = fillString === undefined ? ' ' : String(fillString); + var intMaxLength = toLength(maxLength); + if (intMaxLength <= stringLength || fillStr == '') return S; + var fillLen = intMaxLength - stringLength; + var stringFiller = repeat.call(fillStr, Math.ceil(fillLen / fillStr.length)); + if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen); + return left ? stringFiller + S : S + stringFiller; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_string-repeat.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/_string-repeat.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var toInteger = __webpack_require__(/*! ./_to-integer */ "./node_modules/core-js/modules/_to-integer.js"); +var defined = __webpack_require__(/*! ./_defined */ "./node_modules/core-js/modules/_defined.js"); + +module.exports = function repeat(count) { + var str = String(defined(this)); + var res = ''; + var n = toInteger(count); + if (n < 0 || n == Infinity) throw RangeError("Count can't be negative"); + for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) res += str; + return res; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_string-trim.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_string-trim.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var defined = __webpack_require__(/*! ./_defined */ "./node_modules/core-js/modules/_defined.js"); +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +var spaces = __webpack_require__(/*! ./_string-ws */ "./node_modules/core-js/modules/_string-ws.js"); +var space = '[' + spaces + ']'; +var non = '\u200b\u0085'; +var ltrim = RegExp('^' + space + space + '*'); +var rtrim = RegExp(space + space + '*$'); + +var exporter = function (KEY, exec, ALIAS) { + var exp = {}; + var FORCE = fails(function () { + return !!spaces[KEY]() || non[KEY]() != non; + }); + var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY]; + if (ALIAS) exp[ALIAS] = fn; + $export($export.P + $export.F * FORCE, 'String', exp); +}; + +// 1 -> String#trimLeft +// 2 -> String#trimRight +// 3 -> String#trim +var trim = exporter.trim = function (string, TYPE) { + string = String(defined(string)); + if (TYPE & 1) string = string.replace(ltrim, ''); + if (TYPE & 2) string = string.replace(rtrim, ''); + return string; +}; + +module.exports = exporter; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_string-ws.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_string-ws.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003' + + '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF'; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_task.js": +/*!***********************************************!*\ + !*** ./node_modules/core-js/modules/_task.js ***! + \***********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var ctx = __webpack_require__(/*! ./_ctx */ "./node_modules/core-js/modules/_ctx.js"); +var invoke = __webpack_require__(/*! ./_invoke */ "./node_modules/core-js/modules/_invoke.js"); +var html = __webpack_require__(/*! ./_html */ "./node_modules/core-js/modules/_html.js"); +var cel = __webpack_require__(/*! ./_dom-create */ "./node_modules/core-js/modules/_dom-create.js"); +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var process = global.process; +var setTask = global.setImmediate; +var clearTask = global.clearImmediate; +var MessageChannel = global.MessageChannel; +var Dispatch = global.Dispatch; +var counter = 0; +var queue = {}; +var ONREADYSTATECHANGE = 'onreadystatechange'; +var defer, channel, port; +var run = function () { + var id = +this; + // eslint-disable-next-line no-prototype-builtins + if (queue.hasOwnProperty(id)) { + var fn = queue[id]; + delete queue[id]; + fn(); + } +}; +var listener = function (event) { + run.call(event.data); +}; +// Node.js 0.9+ & IE10+ has setImmediate, otherwise: +if (!setTask || !clearTask) { + setTask = function setImmediate(fn) { + var args = []; + var i = 1; + while (arguments.length > i) args.push(arguments[i++]); + queue[++counter] = function () { + // eslint-disable-next-line no-new-func + invoke(typeof fn == 'function' ? fn : Function(fn), args); + }; + defer(counter); + return counter; + }; + clearTask = function clearImmediate(id) { + delete queue[id]; + }; + // Node.js 0.8- + if (__webpack_require__(/*! ./_cof */ "./node_modules/core-js/modules/_cof.js")(process) == 'process') { + defer = function (id) { + process.nextTick(ctx(run, id, 1)); + }; + // Sphere (JS game engine) Dispatch API + } else if (Dispatch && Dispatch.now) { + defer = function (id) { + Dispatch.now(ctx(run, id, 1)); + }; + // Browsers with MessageChannel, includes WebWorkers + } else if (MessageChannel) { + channel = new MessageChannel(); + port = channel.port2; + channel.port1.onmessage = listener; + defer = ctx(port.postMessage, port, 1); + // Browsers with postMessage, skip WebWorkers + // IE8 has postMessage, but it's sync & typeof its postMessage is 'object' + } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) { + defer = function (id) { + global.postMessage(id + '', '*'); + }; + global.addEventListener('message', listener, false); + // IE8- + } else if (ONREADYSTATECHANGE in cel('script')) { + defer = function (id) { + html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () { + html.removeChild(this); + run.call(id); + }; + }; + // Rest old browsers + } else { + defer = function (id) { + setTimeout(ctx(run, id, 1), 0); + }; + } +} +module.exports = { + set: setTask, + clear: clearTask +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_to-absolute-index.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/_to-absolute-index.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var toInteger = __webpack_require__(/*! ./_to-integer */ "./node_modules/core-js/modules/_to-integer.js"); +var max = Math.max; +var min = Math.min; +module.exports = function (index, length) { + index = toInteger(index); + return index < 0 ? max(index + length, 0) : min(index, length); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_to-index.js": +/*!***************************************************!*\ + !*** ./node_modules/core-js/modules/_to-index.js ***! + \***************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// https://tc39.github.io/ecma262/#sec-toindex +var toInteger = __webpack_require__(/*! ./_to-integer */ "./node_modules/core-js/modules/_to-integer.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +module.exports = function (it) { + if (it === undefined) return 0; + var number = toInteger(it); + var length = toLength(number); + if (number !== length) throw RangeError('Wrong length!'); + return length; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_to-integer.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_to-integer.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// 7.1.4 ToInteger +var ceil = Math.ceil; +var floor = Math.floor; +module.exports = function (it) { + return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_to-iobject.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_to-iobject.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// to indexed object, toObject with fallback for non-array-like ES3 strings +var IObject = __webpack_require__(/*! ./_iobject */ "./node_modules/core-js/modules/_iobject.js"); +var defined = __webpack_require__(/*! ./_defined */ "./node_modules/core-js/modules/_defined.js"); +module.exports = function (it) { + return IObject(defined(it)); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_to-length.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_to-length.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 7.1.15 ToLength +var toInteger = __webpack_require__(/*! ./_to-integer */ "./node_modules/core-js/modules/_to-integer.js"); +var min = Math.min; +module.exports = function (it) { + return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991 +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_to-object.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_to-object.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 7.1.13 ToObject(argument) +var defined = __webpack_require__(/*! ./_defined */ "./node_modules/core-js/modules/_defined.js"); +module.exports = function (it) { + return Object(defined(it)); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_to-primitive.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/_to-primitive.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 7.1.1 ToPrimitive(input [, PreferredType]) +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +// instead of the ES6 spec version, we didn't implement @@toPrimitive case +// and the second argument - flag - preferred type is a string +module.exports = function (it, S) { + if (!isObject(it)) return it; + var fn, val; + if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val; + if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val; + if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val; + throw TypeError("Can't convert object to primitive value"); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_typed-array.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_typed-array.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +if (__webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js")) { + var LIBRARY = __webpack_require__(/*! ./_library */ "./node_modules/core-js/modules/_library.js"); + var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); + var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); + var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + var $typed = __webpack_require__(/*! ./_typed */ "./node_modules/core-js/modules/_typed.js"); + var $buffer = __webpack_require__(/*! ./_typed-buffer */ "./node_modules/core-js/modules/_typed-buffer.js"); + var ctx = __webpack_require__(/*! ./_ctx */ "./node_modules/core-js/modules/_ctx.js"); + var anInstance = __webpack_require__(/*! ./_an-instance */ "./node_modules/core-js/modules/_an-instance.js"); + var propertyDesc = __webpack_require__(/*! ./_property-desc */ "./node_modules/core-js/modules/_property-desc.js"); + var hide = __webpack_require__(/*! ./_hide */ "./node_modules/core-js/modules/_hide.js"); + var redefineAll = __webpack_require__(/*! ./_redefine-all */ "./node_modules/core-js/modules/_redefine-all.js"); + var toInteger = __webpack_require__(/*! ./_to-integer */ "./node_modules/core-js/modules/_to-integer.js"); + var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); + var toIndex = __webpack_require__(/*! ./_to-index */ "./node_modules/core-js/modules/_to-index.js"); + var toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ "./node_modules/core-js/modules/_to-absolute-index.js"); + var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "./node_modules/core-js/modules/_to-primitive.js"); + var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); + var classof = __webpack_require__(/*! ./_classof */ "./node_modules/core-js/modules/_classof.js"); + var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); + var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); + var isArrayIter = __webpack_require__(/*! ./_is-array-iter */ "./node_modules/core-js/modules/_is-array-iter.js"); + var create = __webpack_require__(/*! ./_object-create */ "./node_modules/core-js/modules/_object-create.js"); + var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "./node_modules/core-js/modules/_object-gpo.js"); + var gOPN = __webpack_require__(/*! ./_object-gopn */ "./node_modules/core-js/modules/_object-gopn.js").f; + var getIterFn = __webpack_require__(/*! ./core.get-iterator-method */ "./node_modules/core-js/modules/core.get-iterator-method.js"); + var uid = __webpack_require__(/*! ./_uid */ "./node_modules/core-js/modules/_uid.js"); + var wks = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js"); + var createArrayMethod = __webpack_require__(/*! ./_array-methods */ "./node_modules/core-js/modules/_array-methods.js"); + var createArrayIncludes = __webpack_require__(/*! ./_array-includes */ "./node_modules/core-js/modules/_array-includes.js"); + var speciesConstructor = __webpack_require__(/*! ./_species-constructor */ "./node_modules/core-js/modules/_species-constructor.js"); + var ArrayIterators = __webpack_require__(/*! ./es6.array.iterator */ "./node_modules/core-js/modules/es6.array.iterator.js"); + var Iterators = __webpack_require__(/*! ./_iterators */ "./node_modules/core-js/modules/_iterators.js"); + var $iterDetect = __webpack_require__(/*! ./_iter-detect */ "./node_modules/core-js/modules/_iter-detect.js"); + var setSpecies = __webpack_require__(/*! ./_set-species */ "./node_modules/core-js/modules/_set-species.js"); + var arrayFill = __webpack_require__(/*! ./_array-fill */ "./node_modules/core-js/modules/_array-fill.js"); + var arrayCopyWithin = __webpack_require__(/*! ./_array-copy-within */ "./node_modules/core-js/modules/_array-copy-within.js"); + var $DP = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js"); + var $GOPD = __webpack_require__(/*! ./_object-gopd */ "./node_modules/core-js/modules/_object-gopd.js"); + var dP = $DP.f; + var gOPD = $GOPD.f; + var RangeError = global.RangeError; + var TypeError = global.TypeError; + var Uint8Array = global.Uint8Array; + var ARRAY_BUFFER = 'ArrayBuffer'; + var SHARED_BUFFER = 'Shared' + ARRAY_BUFFER; + var BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT'; + var PROTOTYPE = 'prototype'; + var ArrayProto = Array[PROTOTYPE]; + var $ArrayBuffer = $buffer.ArrayBuffer; + var $DataView = $buffer.DataView; + var arrayForEach = createArrayMethod(0); + var arrayFilter = createArrayMethod(2); + var arraySome = createArrayMethod(3); + var arrayEvery = createArrayMethod(4); + var arrayFind = createArrayMethod(5); + var arrayFindIndex = createArrayMethod(6); + var arrayIncludes = createArrayIncludes(true); + var arrayIndexOf = createArrayIncludes(false); + var arrayValues = ArrayIterators.values; + var arrayKeys = ArrayIterators.keys; + var arrayEntries = ArrayIterators.entries; + var arrayLastIndexOf = ArrayProto.lastIndexOf; + var arrayReduce = ArrayProto.reduce; + var arrayReduceRight = ArrayProto.reduceRight; + var arrayJoin = ArrayProto.join; + var arraySort = ArrayProto.sort; + var arraySlice = ArrayProto.slice; + var arrayToString = ArrayProto.toString; + var arrayToLocaleString = ArrayProto.toLocaleString; + var ITERATOR = wks('iterator'); + var TAG = wks('toStringTag'); + var TYPED_CONSTRUCTOR = uid('typed_constructor'); + var DEF_CONSTRUCTOR = uid('def_constructor'); + var ALL_CONSTRUCTORS = $typed.CONSTR; + var TYPED_ARRAY = $typed.TYPED; + var VIEW = $typed.VIEW; + var WRONG_LENGTH = 'Wrong length!'; + + var $map = createArrayMethod(1, function (O, length) { + return allocate(speciesConstructor(O, O[DEF_CONSTRUCTOR]), length); + }); + + var LITTLE_ENDIAN = fails(function () { + // eslint-disable-next-line no-undef + return new Uint8Array(new Uint16Array([1]).buffer)[0] === 1; + }); + + var FORCED_SET = !!Uint8Array && !!Uint8Array[PROTOTYPE].set && fails(function () { + new Uint8Array(1).set({}); + }); + + var toOffset = function (it, BYTES) { + var offset = toInteger(it); + if (offset < 0 || offset % BYTES) throw RangeError('Wrong offset!'); + return offset; + }; + + var validate = function (it) { + if (isObject(it) && TYPED_ARRAY in it) return it; + throw TypeError(it + ' is not a typed array!'); + }; + + var allocate = function (C, length) { + if (!(isObject(C) && TYPED_CONSTRUCTOR in C)) { + throw TypeError('It is not a typed array constructor!'); + } return new C(length); + }; + + var speciesFromList = function (O, list) { + return fromList(speciesConstructor(O, O[DEF_CONSTRUCTOR]), list); + }; + + var fromList = function (C, list) { + var index = 0; + var length = list.length; + var result = allocate(C, length); + while (length > index) result[index] = list[index++]; + return result; + }; + + var addGetter = function (it, key, internal) { + dP(it, key, { get: function () { return this._d[internal]; } }); + }; + + var $from = function from(source /* , mapfn, thisArg */) { + var O = toObject(source); + var aLen = arguments.length; + var mapfn = aLen > 1 ? arguments[1] : undefined; + var mapping = mapfn !== undefined; + var iterFn = getIterFn(O); + var i, length, values, result, step, iterator; + if (iterFn != undefined && !isArrayIter(iterFn)) { + for (iterator = iterFn.call(O), values = [], i = 0; !(step = iterator.next()).done; i++) { + values.push(step.value); + } O = values; + } + if (mapping && aLen > 2) mapfn = ctx(mapfn, arguments[2], 2); + for (i = 0, length = toLength(O.length), result = allocate(this, length); length > i; i++) { + result[i] = mapping ? mapfn(O[i], i) : O[i]; + } + return result; + }; + + var $of = function of(/* ...items */) { + var index = 0; + var length = arguments.length; + var result = allocate(this, length); + while (length > index) result[index] = arguments[index++]; + return result; + }; + + // iOS Safari 6.x fails here + var TO_LOCALE_BUG = !!Uint8Array && fails(function () { arrayToLocaleString.call(new Uint8Array(1)); }); + + var $toLocaleString = function toLocaleString() { + return arrayToLocaleString.apply(TO_LOCALE_BUG ? arraySlice.call(validate(this)) : validate(this), arguments); + }; + + var proto = { + copyWithin: function copyWithin(target, start /* , end */) { + return arrayCopyWithin.call(validate(this), target, start, arguments.length > 2 ? arguments[2] : undefined); + }, + every: function every(callbackfn /* , thisArg */) { + return arrayEvery(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined); + }, + fill: function fill(value /* , start, end */) { // eslint-disable-line no-unused-vars + return arrayFill.apply(validate(this), arguments); + }, + filter: function filter(callbackfn /* , thisArg */) { + return speciesFromList(this, arrayFilter(validate(this), callbackfn, + arguments.length > 1 ? arguments[1] : undefined)); + }, + find: function find(predicate /* , thisArg */) { + return arrayFind(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined); + }, + findIndex: function findIndex(predicate /* , thisArg */) { + return arrayFindIndex(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined); + }, + forEach: function forEach(callbackfn /* , thisArg */) { + arrayForEach(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined); + }, + indexOf: function indexOf(searchElement /* , fromIndex */) { + return arrayIndexOf(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined); + }, + includes: function includes(searchElement /* , fromIndex */) { + return arrayIncludes(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined); + }, + join: function join(separator) { // eslint-disable-line no-unused-vars + return arrayJoin.apply(validate(this), arguments); + }, + lastIndexOf: function lastIndexOf(searchElement /* , fromIndex */) { // eslint-disable-line no-unused-vars + return arrayLastIndexOf.apply(validate(this), arguments); + }, + map: function map(mapfn /* , thisArg */) { + return $map(validate(this), mapfn, arguments.length > 1 ? arguments[1] : undefined); + }, + reduce: function reduce(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars + return arrayReduce.apply(validate(this), arguments); + }, + reduceRight: function reduceRight(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars + return arrayReduceRight.apply(validate(this), arguments); + }, + reverse: function reverse() { + var that = this; + var length = validate(that).length; + var middle = Math.floor(length / 2); + var index = 0; + var value; + while (index < middle) { + value = that[index]; + that[index++] = that[--length]; + that[length] = value; + } return that; + }, + some: function some(callbackfn /* , thisArg */) { + return arraySome(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined); + }, + sort: function sort(comparefn) { + return arraySort.call(validate(this), comparefn); + }, + subarray: function subarray(begin, end) { + var O = validate(this); + var length = O.length; + var $begin = toAbsoluteIndex(begin, length); + return new (speciesConstructor(O, O[DEF_CONSTRUCTOR]))( + O.buffer, + O.byteOffset + $begin * O.BYTES_PER_ELEMENT, + toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - $begin) + ); + } + }; + + var $slice = function slice(start, end) { + return speciesFromList(this, arraySlice.call(validate(this), start, end)); + }; + + var $set = function set(arrayLike /* , offset */) { + validate(this); + var offset = toOffset(arguments[1], 1); + var length = this.length; + var src = toObject(arrayLike); + var len = toLength(src.length); + var index = 0; + if (len + offset > length) throw RangeError(WRONG_LENGTH); + while (index < len) this[offset + index] = src[index++]; + }; + + var $iterators = { + entries: function entries() { + return arrayEntries.call(validate(this)); + }, + keys: function keys() { + return arrayKeys.call(validate(this)); + }, + values: function values() { + return arrayValues.call(validate(this)); + } + }; + + var isTAIndex = function (target, key) { + return isObject(target) + && target[TYPED_ARRAY] + && typeof key != 'symbol' + && key in target + && String(+key) == String(key); + }; + var $getDesc = function getOwnPropertyDescriptor(target, key) { + return isTAIndex(target, key = toPrimitive(key, true)) + ? propertyDesc(2, target[key]) + : gOPD(target, key); + }; + var $setDesc = function defineProperty(target, key, desc) { + if (isTAIndex(target, key = toPrimitive(key, true)) + && isObject(desc) + && has(desc, 'value') + && !has(desc, 'get') + && !has(desc, 'set') + // TODO: add validation descriptor w/o calling accessors + && !desc.configurable + && (!has(desc, 'writable') || desc.writable) + && (!has(desc, 'enumerable') || desc.enumerable) + ) { + target[key] = desc.value; + return target; + } return dP(target, key, desc); + }; + + if (!ALL_CONSTRUCTORS) { + $GOPD.f = $getDesc; + $DP.f = $setDesc; + } + + $export($export.S + $export.F * !ALL_CONSTRUCTORS, 'Object', { + getOwnPropertyDescriptor: $getDesc, + defineProperty: $setDesc + }); + + if (fails(function () { arrayToString.call({}); })) { + arrayToString = arrayToLocaleString = function toString() { + return arrayJoin.call(this); + }; + } + + var $TypedArrayPrototype$ = redefineAll({}, proto); + redefineAll($TypedArrayPrototype$, $iterators); + hide($TypedArrayPrototype$, ITERATOR, $iterators.values); + redefineAll($TypedArrayPrototype$, { + slice: $slice, + set: $set, + constructor: function () { /* noop */ }, + toString: arrayToString, + toLocaleString: $toLocaleString + }); + addGetter($TypedArrayPrototype$, 'buffer', 'b'); + addGetter($TypedArrayPrototype$, 'byteOffset', 'o'); + addGetter($TypedArrayPrototype$, 'byteLength', 'l'); + addGetter($TypedArrayPrototype$, 'length', 'e'); + dP($TypedArrayPrototype$, TAG, { + get: function () { return this[TYPED_ARRAY]; } + }); + + // eslint-disable-next-line max-statements + module.exports = function (KEY, BYTES, wrapper, CLAMPED) { + CLAMPED = !!CLAMPED; + var NAME = KEY + (CLAMPED ? 'Clamped' : '') + 'Array'; + var GETTER = 'get' + KEY; + var SETTER = 'set' + KEY; + var TypedArray = global[NAME]; + var Base = TypedArray || {}; + var TAC = TypedArray && getPrototypeOf(TypedArray); + var FORCED = !TypedArray || !$typed.ABV; + var O = {}; + var TypedArrayPrototype = TypedArray && TypedArray[PROTOTYPE]; + var getter = function (that, index) { + var data = that._d; + return data.v[GETTER](index * BYTES + data.o, LITTLE_ENDIAN); + }; + var setter = function (that, index, value) { + var data = that._d; + if (CLAMPED) value = (value = Math.round(value)) < 0 ? 0 : value > 0xff ? 0xff : value & 0xff; + data.v[SETTER](index * BYTES + data.o, value, LITTLE_ENDIAN); + }; + var addElement = function (that, index) { + dP(that, index, { + get: function () { + return getter(this, index); + }, + set: function (value) { + return setter(this, index, value); + }, + enumerable: true + }); + }; + if (FORCED) { + TypedArray = wrapper(function (that, data, $offset, $length) { + anInstance(that, TypedArray, NAME, '_d'); + var index = 0; + var offset = 0; + var buffer, byteLength, length, klass; + if (!isObject(data)) { + length = toIndex(data); + byteLength = length * BYTES; + buffer = new $ArrayBuffer(byteLength); + } else if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) { + buffer = data; + offset = toOffset($offset, BYTES); + var $len = data.byteLength; + if ($length === undefined) { + if ($len % BYTES) throw RangeError(WRONG_LENGTH); + byteLength = $len - offset; + if (byteLength < 0) throw RangeError(WRONG_LENGTH); + } else { + byteLength = toLength($length) * BYTES; + if (byteLength + offset > $len) throw RangeError(WRONG_LENGTH); + } + length = byteLength / BYTES; + } else if (TYPED_ARRAY in data) { + return fromList(TypedArray, data); + } else { + return $from.call(TypedArray, data); + } + hide(that, '_d', { + b: buffer, + o: offset, + l: byteLength, + e: length, + v: new $DataView(buffer) + }); + while (index < length) addElement(that, index++); + }); + TypedArrayPrototype = TypedArray[PROTOTYPE] = create($TypedArrayPrototype$); + hide(TypedArrayPrototype, 'constructor', TypedArray); + } else if (!fails(function () { + TypedArray(1); + }) || !fails(function () { + new TypedArray(-1); // eslint-disable-line no-new + }) || !$iterDetect(function (iter) { + new TypedArray(); // eslint-disable-line no-new + new TypedArray(null); // eslint-disable-line no-new + new TypedArray(1.5); // eslint-disable-line no-new + new TypedArray(iter); // eslint-disable-line no-new + }, true)) { + TypedArray = wrapper(function (that, data, $offset, $length) { + anInstance(that, TypedArray, NAME); + var klass; + // `ws` module bug, temporarily remove validation length for Uint8Array + // https://github.com/websockets/ws/pull/645 + if (!isObject(data)) return new Base(toIndex(data)); + if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) { + return $length !== undefined + ? new Base(data, toOffset($offset, BYTES), $length) + : $offset !== undefined + ? new Base(data, toOffset($offset, BYTES)) + : new Base(data); + } + if (TYPED_ARRAY in data) return fromList(TypedArray, data); + return $from.call(TypedArray, data); + }); + arrayForEach(TAC !== Function.prototype ? gOPN(Base).concat(gOPN(TAC)) : gOPN(Base), function (key) { + if (!(key in TypedArray)) hide(TypedArray, key, Base[key]); + }); + TypedArray[PROTOTYPE] = TypedArrayPrototype; + if (!LIBRARY) TypedArrayPrototype.constructor = TypedArray; + } + var $nativeIterator = TypedArrayPrototype[ITERATOR]; + var CORRECT_ITER_NAME = !!$nativeIterator + && ($nativeIterator.name == 'values' || $nativeIterator.name == undefined); + var $iterator = $iterators.values; + hide(TypedArray, TYPED_CONSTRUCTOR, true); + hide(TypedArrayPrototype, TYPED_ARRAY, NAME); + hide(TypedArrayPrototype, VIEW, true); + hide(TypedArrayPrototype, DEF_CONSTRUCTOR, TypedArray); + + if (CLAMPED ? new TypedArray(1)[TAG] != NAME : !(TAG in TypedArrayPrototype)) { + dP(TypedArrayPrototype, TAG, { + get: function () { return NAME; } + }); + } + + O[NAME] = TypedArray; + + $export($export.G + $export.W + $export.F * (TypedArray != Base), O); + + $export($export.S, NAME, { + BYTES_PER_ELEMENT: BYTES + }); + + $export($export.S + $export.F * fails(function () { Base.of.call(TypedArray, 1); }), NAME, { + from: $from, + of: $of + }); + + if (!(BYTES_PER_ELEMENT in TypedArrayPrototype)) hide(TypedArrayPrototype, BYTES_PER_ELEMENT, BYTES); + + $export($export.P, NAME, proto); + + setSpecies(NAME); + + $export($export.P + $export.F * FORCED_SET, NAME, { set: $set }); + + $export($export.P + $export.F * !CORRECT_ITER_NAME, NAME, $iterators); + + if (!LIBRARY && TypedArrayPrototype.toString != arrayToString) TypedArrayPrototype.toString = arrayToString; + + $export($export.P + $export.F * fails(function () { + new TypedArray(1).slice(); + }), NAME, { slice: $slice }); + + $export($export.P + $export.F * (fails(function () { + return [1, 2].toLocaleString() != new TypedArray([1, 2]).toLocaleString(); + }) || !fails(function () { + TypedArrayPrototype.toLocaleString.call([1, 2]); + })), NAME, { toLocaleString: $toLocaleString }); + + Iterators[NAME] = CORRECT_ITER_NAME ? $nativeIterator : $iterator; + if (!LIBRARY && !CORRECT_ITER_NAME) hide(TypedArrayPrototype, ITERATOR, $iterator); + }; +} else module.exports = function () { /* empty */ }; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_typed-buffer.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/_typed-buffer.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js"); +var LIBRARY = __webpack_require__(/*! ./_library */ "./node_modules/core-js/modules/_library.js"); +var $typed = __webpack_require__(/*! ./_typed */ "./node_modules/core-js/modules/_typed.js"); +var hide = __webpack_require__(/*! ./_hide */ "./node_modules/core-js/modules/_hide.js"); +var redefineAll = __webpack_require__(/*! ./_redefine-all */ "./node_modules/core-js/modules/_redefine-all.js"); +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +var anInstance = __webpack_require__(/*! ./_an-instance */ "./node_modules/core-js/modules/_an-instance.js"); +var toInteger = __webpack_require__(/*! ./_to-integer */ "./node_modules/core-js/modules/_to-integer.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var toIndex = __webpack_require__(/*! ./_to-index */ "./node_modules/core-js/modules/_to-index.js"); +var gOPN = __webpack_require__(/*! ./_object-gopn */ "./node_modules/core-js/modules/_object-gopn.js").f; +var dP = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js").f; +var arrayFill = __webpack_require__(/*! ./_array-fill */ "./node_modules/core-js/modules/_array-fill.js"); +var setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ "./node_modules/core-js/modules/_set-to-string-tag.js"); +var ARRAY_BUFFER = 'ArrayBuffer'; +var DATA_VIEW = 'DataView'; +var PROTOTYPE = 'prototype'; +var WRONG_LENGTH = 'Wrong length!'; +var WRONG_INDEX = 'Wrong index!'; +var $ArrayBuffer = global[ARRAY_BUFFER]; +var $DataView = global[DATA_VIEW]; +var Math = global.Math; +var RangeError = global.RangeError; +// eslint-disable-next-line no-shadow-restricted-names +var Infinity = global.Infinity; +var BaseBuffer = $ArrayBuffer; +var abs = Math.abs; +var pow = Math.pow; +var floor = Math.floor; +var log = Math.log; +var LN2 = Math.LN2; +var BUFFER = 'buffer'; +var BYTE_LENGTH = 'byteLength'; +var BYTE_OFFSET = 'byteOffset'; +var $BUFFER = DESCRIPTORS ? '_b' : BUFFER; +var $LENGTH = DESCRIPTORS ? '_l' : BYTE_LENGTH; +var $OFFSET = DESCRIPTORS ? '_o' : BYTE_OFFSET; + +// IEEE754 conversions based on https://github.com/feross/ieee754 +function packIEEE754(value, mLen, nBytes) { + var buffer = new Array(nBytes); + var eLen = nBytes * 8 - mLen - 1; + var eMax = (1 << eLen) - 1; + var eBias = eMax >> 1; + var rt = mLen === 23 ? pow(2, -24) - pow(2, -77) : 0; + var i = 0; + var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0; + var e, m, c; + value = abs(value); + // eslint-disable-next-line no-self-compare + if (value != value || value === Infinity) { + // eslint-disable-next-line no-self-compare + m = value != value ? 1 : 0; + e = eMax; + } else { + e = floor(log(value) / LN2); + if (value * (c = pow(2, -e)) < 1) { + e--; + c *= 2; + } + if (e + eBias >= 1) { + value += rt / c; + } else { + value += rt * pow(2, 1 - eBias); + } + if (value * c >= 2) { + e++; + c /= 2; + } + if (e + eBias >= eMax) { + m = 0; + e = eMax; + } else if (e + eBias >= 1) { + m = (value * c - 1) * pow(2, mLen); + e = e + eBias; + } else { + m = value * pow(2, eBias - 1) * pow(2, mLen); + e = 0; + } + } + for (; mLen >= 8; buffer[i++] = m & 255, m /= 256, mLen -= 8); + e = e << mLen | m; + eLen += mLen; + for (; eLen > 0; buffer[i++] = e & 255, e /= 256, eLen -= 8); + buffer[--i] |= s * 128; + return buffer; +} +function unpackIEEE754(buffer, mLen, nBytes) { + var eLen = nBytes * 8 - mLen - 1; + var eMax = (1 << eLen) - 1; + var eBias = eMax >> 1; + var nBits = eLen - 7; + var i = nBytes - 1; + var s = buffer[i--]; + var e = s & 127; + var m; + s >>= 7; + for (; nBits > 0; e = e * 256 + buffer[i], i--, nBits -= 8); + m = e & (1 << -nBits) - 1; + e >>= -nBits; + nBits += mLen; + for (; nBits > 0; m = m * 256 + buffer[i], i--, nBits -= 8); + if (e === 0) { + e = 1 - eBias; + } else if (e === eMax) { + return m ? NaN : s ? -Infinity : Infinity; + } else { + m = m + pow(2, mLen); + e = e - eBias; + } return (s ? -1 : 1) * m * pow(2, e - mLen); +} + +function unpackI32(bytes) { + return bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0]; +} +function packI8(it) { + return [it & 0xff]; +} +function packI16(it) { + return [it & 0xff, it >> 8 & 0xff]; +} +function packI32(it) { + return [it & 0xff, it >> 8 & 0xff, it >> 16 & 0xff, it >> 24 & 0xff]; +} +function packF64(it) { + return packIEEE754(it, 52, 8); +} +function packF32(it) { + return packIEEE754(it, 23, 4); +} + +function addGetter(C, key, internal) { + dP(C[PROTOTYPE], key, { get: function () { return this[internal]; } }); +} + +function get(view, bytes, index, isLittleEndian) { + var numIndex = +index; + var intIndex = toIndex(numIndex); + if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX); + var store = view[$BUFFER]._b; + var start = intIndex + view[$OFFSET]; + var pack = store.slice(start, start + bytes); + return isLittleEndian ? pack : pack.reverse(); +} +function set(view, bytes, index, conversion, value, isLittleEndian) { + var numIndex = +index; + var intIndex = toIndex(numIndex); + if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX); + var store = view[$BUFFER]._b; + var start = intIndex + view[$OFFSET]; + var pack = conversion(+value); + for (var i = 0; i < bytes; i++) store[start + i] = pack[isLittleEndian ? i : bytes - i - 1]; +} + +if (!$typed.ABV) { + $ArrayBuffer = function ArrayBuffer(length) { + anInstance(this, $ArrayBuffer, ARRAY_BUFFER); + var byteLength = toIndex(length); + this._b = arrayFill.call(new Array(byteLength), 0); + this[$LENGTH] = byteLength; + }; + + $DataView = function DataView(buffer, byteOffset, byteLength) { + anInstance(this, $DataView, DATA_VIEW); + anInstance(buffer, $ArrayBuffer, DATA_VIEW); + var bufferLength = buffer[$LENGTH]; + var offset = toInteger(byteOffset); + if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset!'); + byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength); + if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH); + this[$BUFFER] = buffer; + this[$OFFSET] = offset; + this[$LENGTH] = byteLength; + }; + + if (DESCRIPTORS) { + addGetter($ArrayBuffer, BYTE_LENGTH, '_l'); + addGetter($DataView, BUFFER, '_b'); + addGetter($DataView, BYTE_LENGTH, '_l'); + addGetter($DataView, BYTE_OFFSET, '_o'); + } + + redefineAll($DataView[PROTOTYPE], { + getInt8: function getInt8(byteOffset) { + return get(this, 1, byteOffset)[0] << 24 >> 24; + }, + getUint8: function getUint8(byteOffset) { + return get(this, 1, byteOffset)[0]; + }, + getInt16: function getInt16(byteOffset /* , littleEndian */) { + var bytes = get(this, 2, byteOffset, arguments[1]); + return (bytes[1] << 8 | bytes[0]) << 16 >> 16; + }, + getUint16: function getUint16(byteOffset /* , littleEndian */) { + var bytes = get(this, 2, byteOffset, arguments[1]); + return bytes[1] << 8 | bytes[0]; + }, + getInt32: function getInt32(byteOffset /* , littleEndian */) { + return unpackI32(get(this, 4, byteOffset, arguments[1])); + }, + getUint32: function getUint32(byteOffset /* , littleEndian */) { + return unpackI32(get(this, 4, byteOffset, arguments[1])) >>> 0; + }, + getFloat32: function getFloat32(byteOffset /* , littleEndian */) { + return unpackIEEE754(get(this, 4, byteOffset, arguments[1]), 23, 4); + }, + getFloat64: function getFloat64(byteOffset /* , littleEndian */) { + return unpackIEEE754(get(this, 8, byteOffset, arguments[1]), 52, 8); + }, + setInt8: function setInt8(byteOffset, value) { + set(this, 1, byteOffset, packI8, value); + }, + setUint8: function setUint8(byteOffset, value) { + set(this, 1, byteOffset, packI8, value); + }, + setInt16: function setInt16(byteOffset, value /* , littleEndian */) { + set(this, 2, byteOffset, packI16, value, arguments[2]); + }, + setUint16: function setUint16(byteOffset, value /* , littleEndian */) { + set(this, 2, byteOffset, packI16, value, arguments[2]); + }, + setInt32: function setInt32(byteOffset, value /* , littleEndian */) { + set(this, 4, byteOffset, packI32, value, arguments[2]); + }, + setUint32: function setUint32(byteOffset, value /* , littleEndian */) { + set(this, 4, byteOffset, packI32, value, arguments[2]); + }, + setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) { + set(this, 4, byteOffset, packF32, value, arguments[2]); + }, + setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) { + set(this, 8, byteOffset, packF64, value, arguments[2]); + } + }); +} else { + if (!fails(function () { + $ArrayBuffer(1); + }) || !fails(function () { + new $ArrayBuffer(-1); // eslint-disable-line no-new + }) || fails(function () { + new $ArrayBuffer(); // eslint-disable-line no-new + new $ArrayBuffer(1.5); // eslint-disable-line no-new + new $ArrayBuffer(NaN); // eslint-disable-line no-new + return $ArrayBuffer.name != ARRAY_BUFFER; + })) { + $ArrayBuffer = function ArrayBuffer(length) { + anInstance(this, $ArrayBuffer); + return new BaseBuffer(toIndex(length)); + }; + var ArrayBufferProto = $ArrayBuffer[PROTOTYPE] = BaseBuffer[PROTOTYPE]; + for (var keys = gOPN(BaseBuffer), j = 0, key; keys.length > j;) { + if (!((key = keys[j++]) in $ArrayBuffer)) hide($ArrayBuffer, key, BaseBuffer[key]); + } + if (!LIBRARY) ArrayBufferProto.constructor = $ArrayBuffer; + } + // iOS Safari 7.x bug + var view = new $DataView(new $ArrayBuffer(2)); + var $setInt8 = $DataView[PROTOTYPE].setInt8; + view.setInt8(0, 2147483648); + view.setInt8(1, 2147483649); + if (view.getInt8(0) || !view.getInt8(1)) redefineAll($DataView[PROTOTYPE], { + setInt8: function setInt8(byteOffset, value) { + $setInt8.call(this, byteOffset, value << 24 >> 24); + }, + setUint8: function setUint8(byteOffset, value) { + $setInt8.call(this, byteOffset, value << 24 >> 24); + } + }, true); +} +setToStringTag($ArrayBuffer, ARRAY_BUFFER); +setToStringTag($DataView, DATA_VIEW); +hide($DataView[PROTOTYPE], $typed.VIEW, true); +exports[ARRAY_BUFFER] = $ArrayBuffer; +exports[DATA_VIEW] = $DataView; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_typed.js": +/*!************************************************!*\ + !*** ./node_modules/core-js/modules/_typed.js ***! + \************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var hide = __webpack_require__(/*! ./_hide */ "./node_modules/core-js/modules/_hide.js"); +var uid = __webpack_require__(/*! ./_uid */ "./node_modules/core-js/modules/_uid.js"); +var TYPED = uid('typed_array'); +var VIEW = uid('view'); +var ABV = !!(global.ArrayBuffer && global.DataView); +var CONSTR = ABV; +var i = 0; +var l = 9; +var Typed; + +var TypedArrayConstructors = ( + 'Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array' +).split(','); + +while (i < l) { + if (Typed = global[TypedArrayConstructors[i++]]) { + hide(Typed.prototype, TYPED, true); + hide(Typed.prototype, VIEW, true); + } else CONSTR = false; +} + +module.exports = { + ABV: ABV, + CONSTR: CONSTR, + TYPED: TYPED, + VIEW: VIEW +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_uid.js": +/*!**********************************************!*\ + !*** ./node_modules/core-js/modules/_uid.js ***! + \**********************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +var id = 0; +var px = Math.random(); +module.exports = function (key) { + return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36)); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_user-agent.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_user-agent.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var navigator = global.navigator; + +module.exports = navigator && navigator.userAgent || ''; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_validate-collection.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/_validate-collection.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +module.exports = function (it, TYPE) { + if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!'); + return it; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_wks-define.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_wks-define.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var core = __webpack_require__(/*! ./_core */ "./node_modules/core-js/modules/_core.js"); +var LIBRARY = __webpack_require__(/*! ./_library */ "./node_modules/core-js/modules/_library.js"); +var wksExt = __webpack_require__(/*! ./_wks-ext */ "./node_modules/core-js/modules/_wks-ext.js"); +var defineProperty = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js").f; +module.exports = function (name) { + var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {}); + if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) }); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_wks-ext.js": +/*!**************************************************!*\ + !*** ./node_modules/core-js/modules/_wks-ext.js ***! + \**************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +exports.f = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js"); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_wks.js": +/*!**********************************************!*\ + !*** ./node_modules/core-js/modules/_wks.js ***! + \**********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var store = __webpack_require__(/*! ./_shared */ "./node_modules/core-js/modules/_shared.js")('wks'); +var uid = __webpack_require__(/*! ./_uid */ "./node_modules/core-js/modules/_uid.js"); +var Symbol = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js").Symbol; +var USE_SYMBOL = typeof Symbol == 'function'; + +var $exports = module.exports = function (name) { + return store[name] || (store[name] = + USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name)); +}; + +$exports.store = store; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/core.get-iterator-method.js": +/*!******************************************************************!*\ + !*** ./node_modules/core-js/modules/core.get-iterator-method.js ***! + \******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var classof = __webpack_require__(/*! ./_classof */ "./node_modules/core-js/modules/_classof.js"); +var ITERATOR = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('iterator'); +var Iterators = __webpack_require__(/*! ./_iterators */ "./node_modules/core-js/modules/_iterators.js"); +module.exports = __webpack_require__(/*! ./_core */ "./node_modules/core-js/modules/_core.js").getIteratorMethod = function (it) { + if (it != undefined) return it[ITERATOR] + || it['@@iterator'] + || Iterators[classof(it)]; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/core.regexp.escape.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/core.regexp.escape.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// https://github.com/benjamingr/RexExp.escape +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $re = __webpack_require__(/*! ./_replacer */ "./node_modules/core-js/modules/_replacer.js")(/[\\^$*+?.()|[\]{}]/g, '\\$&'); + +$export($export.S, 'RegExp', { escape: function escape(it) { return $re(it); } }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.copy-within.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.copy-within.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.P, 'Array', { copyWithin: __webpack_require__(/*! ./_array-copy-within */ "./node_modules/core-js/modules/_array-copy-within.js") }); + +__webpack_require__(/*! ./_add-to-unscopables */ "./node_modules/core-js/modules/_add-to-unscopables.js")('copyWithin'); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.every.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.every.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $every = __webpack_require__(/*! ./_array-methods */ "./node_modules/core-js/modules/_array-methods.js")(4); + +$export($export.P + $export.F * !__webpack_require__(/*! ./_strict-method */ "./node_modules/core-js/modules/_strict-method.js")([].every, true), 'Array', { + // 22.1.3.5 / 15.4.4.16 Array.prototype.every(callbackfn [, thisArg]) + every: function every(callbackfn /* , thisArg */) { + return $every(this, callbackfn, arguments[1]); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.fill.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.fill.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.P, 'Array', { fill: __webpack_require__(/*! ./_array-fill */ "./node_modules/core-js/modules/_array-fill.js") }); + +__webpack_require__(/*! ./_add-to-unscopables */ "./node_modules/core-js/modules/_add-to-unscopables.js")('fill'); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.filter.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.filter.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $filter = __webpack_require__(/*! ./_array-methods */ "./node_modules/core-js/modules/_array-methods.js")(2); + +$export($export.P + $export.F * !__webpack_require__(/*! ./_strict-method */ "./node_modules/core-js/modules/_strict-method.js")([].filter, true), 'Array', { + // 22.1.3.7 / 15.4.4.20 Array.prototype.filter(callbackfn [, thisArg]) + filter: function filter(callbackfn /* , thisArg */) { + return $filter(this, callbackfn, arguments[1]); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.find-index.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.find-index.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $find = __webpack_require__(/*! ./_array-methods */ "./node_modules/core-js/modules/_array-methods.js")(6); +var KEY = 'findIndex'; +var forced = true; +// Shouldn't skip holes +if (KEY in []) Array(1)[KEY](function () { forced = false; }); +$export($export.P + $export.F * forced, 'Array', { + findIndex: function findIndex(callbackfn /* , that = undefined */) { + return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); + } +}); +__webpack_require__(/*! ./_add-to-unscopables */ "./node_modules/core-js/modules/_add-to-unscopables.js")(KEY); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.find.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.find.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $find = __webpack_require__(/*! ./_array-methods */ "./node_modules/core-js/modules/_array-methods.js")(5); +var KEY = 'find'; +var forced = true; +// Shouldn't skip holes +if (KEY in []) Array(1)[KEY](function () { forced = false; }); +$export($export.P + $export.F * forced, 'Array', { + find: function find(callbackfn /* , that = undefined */) { + return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); + } +}); +__webpack_require__(/*! ./_add-to-unscopables */ "./node_modules/core-js/modules/_add-to-unscopables.js")(KEY); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.for-each.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.for-each.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $forEach = __webpack_require__(/*! ./_array-methods */ "./node_modules/core-js/modules/_array-methods.js")(0); +var STRICT = __webpack_require__(/*! ./_strict-method */ "./node_modules/core-js/modules/_strict-method.js")([].forEach, true); + +$export($export.P + $export.F * !STRICT, 'Array', { + // 22.1.3.10 / 15.4.4.18 Array.prototype.forEach(callbackfn [, thisArg]) + forEach: function forEach(callbackfn /* , thisArg */) { + return $forEach(this, callbackfn, arguments[1]); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.from.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.from.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var ctx = __webpack_require__(/*! ./_ctx */ "./node_modules/core-js/modules/_ctx.js"); +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var call = __webpack_require__(/*! ./_iter-call */ "./node_modules/core-js/modules/_iter-call.js"); +var isArrayIter = __webpack_require__(/*! ./_is-array-iter */ "./node_modules/core-js/modules/_is-array-iter.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var createProperty = __webpack_require__(/*! ./_create-property */ "./node_modules/core-js/modules/_create-property.js"); +var getIterFn = __webpack_require__(/*! ./core.get-iterator-method */ "./node_modules/core-js/modules/core.get-iterator-method.js"); + +$export($export.S + $export.F * !__webpack_require__(/*! ./_iter-detect */ "./node_modules/core-js/modules/_iter-detect.js")(function (iter) { Array.from(iter); }), 'Array', { + // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined) + from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) { + var O = toObject(arrayLike); + var C = typeof this == 'function' ? this : Array; + var aLen = arguments.length; + var mapfn = aLen > 1 ? arguments[1] : undefined; + var mapping = mapfn !== undefined; + var index = 0; + var iterFn = getIterFn(O); + var length, result, step, iterator; + if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2); + // if object isn't iterable or it's array with default iterator - use simple case + if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) { + for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) { + createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value); + } + } else { + length = toLength(O.length); + for (result = new C(length); length > index; index++) { + createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]); + } + } + result.length = index; + return result; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.index-of.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.index-of.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $indexOf = __webpack_require__(/*! ./_array-includes */ "./node_modules/core-js/modules/_array-includes.js")(false); +var $native = [].indexOf; +var NEGATIVE_ZERO = !!$native && 1 / [1].indexOf(1, -0) < 0; + +$export($export.P + $export.F * (NEGATIVE_ZERO || !__webpack_require__(/*! ./_strict-method */ "./node_modules/core-js/modules/_strict-method.js")($native)), 'Array', { + // 22.1.3.11 / 15.4.4.14 Array.prototype.indexOf(searchElement [, fromIndex]) + indexOf: function indexOf(searchElement /* , fromIndex = 0 */) { + return NEGATIVE_ZERO + // convert -0 to +0 + ? $native.apply(this, arguments) || 0 + : $indexOf(this, searchElement, arguments[1]); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.is-array.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.is-array.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 22.1.2.2 / 15.4.3.2 Array.isArray(arg) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Array', { isArray: __webpack_require__(/*! ./_is-array */ "./node_modules/core-js/modules/_is-array.js") }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.iterator.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.iterator.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var addToUnscopables = __webpack_require__(/*! ./_add-to-unscopables */ "./node_modules/core-js/modules/_add-to-unscopables.js"); +var step = __webpack_require__(/*! ./_iter-step */ "./node_modules/core-js/modules/_iter-step.js"); +var Iterators = __webpack_require__(/*! ./_iterators */ "./node_modules/core-js/modules/_iterators.js"); +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/core-js/modules/_to-iobject.js"); + +// 22.1.3.4 Array.prototype.entries() +// 22.1.3.13 Array.prototype.keys() +// 22.1.3.29 Array.prototype.values() +// 22.1.3.30 Array.prototype[@@iterator]() +module.exports = __webpack_require__(/*! ./_iter-define */ "./node_modules/core-js/modules/_iter-define.js")(Array, 'Array', function (iterated, kind) { + this._t = toIObject(iterated); // target + this._i = 0; // next index + this._k = kind; // kind +// 22.1.5.2.1 %ArrayIteratorPrototype%.next() +}, function () { + var O = this._t; + var kind = this._k; + var index = this._i++; + if (!O || index >= O.length) { + this._t = undefined; + return step(1); + } + if (kind == 'keys') return step(0, index); + if (kind == 'values') return step(0, O[index]); + return step(0, [index, O[index]]); +}, 'values'); + +// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7) +Iterators.Arguments = Iterators.Array; + +addToUnscopables('keys'); +addToUnscopables('values'); +addToUnscopables('entries'); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.join.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.join.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// 22.1.3.13 Array.prototype.join(separator) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/core-js/modules/_to-iobject.js"); +var arrayJoin = [].join; + +// fallback for not array-like strings +$export($export.P + $export.F * (__webpack_require__(/*! ./_iobject */ "./node_modules/core-js/modules/_iobject.js") != Object || !__webpack_require__(/*! ./_strict-method */ "./node_modules/core-js/modules/_strict-method.js")(arrayJoin)), 'Array', { + join: function join(separator) { + return arrayJoin.call(toIObject(this), separator === undefined ? ',' : separator); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.last-index-of.js": +/*!*****************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.last-index-of.js ***! + \*****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/core-js/modules/_to-iobject.js"); +var toInteger = __webpack_require__(/*! ./_to-integer */ "./node_modules/core-js/modules/_to-integer.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var $native = [].lastIndexOf; +var NEGATIVE_ZERO = !!$native && 1 / [1].lastIndexOf(1, -0) < 0; + +$export($export.P + $export.F * (NEGATIVE_ZERO || !__webpack_require__(/*! ./_strict-method */ "./node_modules/core-js/modules/_strict-method.js")($native)), 'Array', { + // 22.1.3.14 / 15.4.4.15 Array.prototype.lastIndexOf(searchElement [, fromIndex]) + lastIndexOf: function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) { + // convert -0 to +0 + if (NEGATIVE_ZERO) return $native.apply(this, arguments) || 0; + var O = toIObject(this); + var length = toLength(O.length); + var index = length - 1; + if (arguments.length > 1) index = Math.min(index, toInteger(arguments[1])); + if (index < 0) index = length + index; + for (;index >= 0; index--) if (index in O) if (O[index] === searchElement) return index || 0; + return -1; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.map.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.map.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $map = __webpack_require__(/*! ./_array-methods */ "./node_modules/core-js/modules/_array-methods.js")(1); + +$export($export.P + $export.F * !__webpack_require__(/*! ./_strict-method */ "./node_modules/core-js/modules/_strict-method.js")([].map, true), 'Array', { + // 22.1.3.15 / 15.4.4.19 Array.prototype.map(callbackfn [, thisArg]) + map: function map(callbackfn /* , thisArg */) { + return $map(this, callbackfn, arguments[1]); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.of.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.of.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var createProperty = __webpack_require__(/*! ./_create-property */ "./node_modules/core-js/modules/_create-property.js"); + +// WebKit Array.of isn't generic +$export($export.S + $export.F * __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + function F() { /* empty */ } + return !(Array.of.call(F) instanceof F); +}), 'Array', { + // 22.1.2.3 Array.of( ...items) + of: function of(/* ...args */) { + var index = 0; + var aLen = arguments.length; + var result = new (typeof this == 'function' ? this : Array)(aLen); + while (aLen > index) createProperty(result, index, arguments[index++]); + result.length = aLen; + return result; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.reduce-right.js": +/*!****************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.reduce-right.js ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $reduce = __webpack_require__(/*! ./_array-reduce */ "./node_modules/core-js/modules/_array-reduce.js"); + +$export($export.P + $export.F * !__webpack_require__(/*! ./_strict-method */ "./node_modules/core-js/modules/_strict-method.js")([].reduceRight, true), 'Array', { + // 22.1.3.19 / 15.4.4.22 Array.prototype.reduceRight(callbackfn [, initialValue]) + reduceRight: function reduceRight(callbackfn /* , initialValue */) { + return $reduce(this, callbackfn, arguments.length, arguments[1], true); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.reduce.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.reduce.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $reduce = __webpack_require__(/*! ./_array-reduce */ "./node_modules/core-js/modules/_array-reduce.js"); + +$export($export.P + $export.F * !__webpack_require__(/*! ./_strict-method */ "./node_modules/core-js/modules/_strict-method.js")([].reduce, true), 'Array', { + // 22.1.3.18 / 15.4.4.21 Array.prototype.reduce(callbackfn [, initialValue]) + reduce: function reduce(callbackfn /* , initialValue */) { + return $reduce(this, callbackfn, arguments.length, arguments[1], false); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.slice.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.slice.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var html = __webpack_require__(/*! ./_html */ "./node_modules/core-js/modules/_html.js"); +var cof = __webpack_require__(/*! ./_cof */ "./node_modules/core-js/modules/_cof.js"); +var toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ "./node_modules/core-js/modules/_to-absolute-index.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var arraySlice = [].slice; + +// fallback for not array-like ES3 strings and DOM objects +$export($export.P + $export.F * __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + if (html) arraySlice.call(html); +}), 'Array', { + slice: function slice(begin, end) { + var len = toLength(this.length); + var klass = cof(this); + end = end === undefined ? len : end; + if (klass == 'Array') return arraySlice.call(this, begin, end); + var start = toAbsoluteIndex(begin, len); + var upTo = toAbsoluteIndex(end, len); + var size = toLength(upTo - start); + var cloned = new Array(size); + var i = 0; + for (; i < size; i++) cloned[i] = klass == 'String' + ? this.charAt(start + i) + : this[start + i]; + return cloned; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.some.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.some.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $some = __webpack_require__(/*! ./_array-methods */ "./node_modules/core-js/modules/_array-methods.js")(3); + +$export($export.P + $export.F * !__webpack_require__(/*! ./_strict-method */ "./node_modules/core-js/modules/_strict-method.js")([].some, true), 'Array', { + // 22.1.3.23 / 15.4.4.17 Array.prototype.some(callbackfn [, thisArg]) + some: function some(callbackfn /* , thisArg */) { + return $some(this, callbackfn, arguments[1]); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.sort.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.sort.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var aFunction = __webpack_require__(/*! ./_a-function */ "./node_modules/core-js/modules/_a-function.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +var $sort = [].sort; +var test = [1, 2, 3]; + +$export($export.P + $export.F * (fails(function () { + // IE8- + test.sort(undefined); +}) || !fails(function () { + // V8 bug + test.sort(null); + // Old WebKit +}) || !__webpack_require__(/*! ./_strict-method */ "./node_modules/core-js/modules/_strict-method.js")($sort)), 'Array', { + // 22.1.3.25 Array.prototype.sort(comparefn) + sort: function sort(comparefn) { + return comparefn === undefined + ? $sort.call(toObject(this)) + : $sort.call(toObject(this), aFunction(comparefn)); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.species.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.species.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ./_set-species */ "./node_modules/core-js/modules/_set-species.js")('Array'); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.date.now.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.date.now.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.3.3.1 / 15.9.4.4 Date.now() +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Date', { now: function () { return new Date().getTime(); } }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.date.to-iso-string.js": +/*!****************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.date.to-iso-string.js ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString() +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var toISOString = __webpack_require__(/*! ./_date-to-iso-string */ "./node_modules/core-js/modules/_date-to-iso-string.js"); + +// PhantomJS / old WebKit has a broken implementations +$export($export.P + $export.F * (Date.prototype.toISOString !== toISOString), 'Date', { + toISOString: toISOString +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.date.to-json.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.date.to-json.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "./node_modules/core-js/modules/_to-primitive.js"); + +$export($export.P + $export.F * __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + return new Date(NaN).toJSON() !== null + || Date.prototype.toJSON.call({ toISOString: function () { return 1; } }) !== 1; +}), 'Date', { + // eslint-disable-next-line no-unused-vars + toJSON: function toJSON(key) { + var O = toObject(this); + var pv = toPrimitive(O); + return typeof pv == 'number' && !isFinite(pv) ? null : O.toISOString(); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.date.to-primitive.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.date.to-primitive.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var TO_PRIMITIVE = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('toPrimitive'); +var proto = Date.prototype; + +if (!(TO_PRIMITIVE in proto)) __webpack_require__(/*! ./_hide */ "./node_modules/core-js/modules/_hide.js")(proto, TO_PRIMITIVE, __webpack_require__(/*! ./_date-to-primitive */ "./node_modules/core-js/modules/_date-to-primitive.js")); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.date.to-string.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.date.to-string.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var DateProto = Date.prototype; +var INVALID_DATE = 'Invalid Date'; +var TO_STRING = 'toString'; +var $toString = DateProto[TO_STRING]; +var getTime = DateProto.getTime; +if (new Date(NaN) + '' != INVALID_DATE) { + __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js")(DateProto, TO_STRING, function toString() { + var value = getTime.call(this); + // eslint-disable-next-line no-self-compare + return value === value ? $toString.call(this) : INVALID_DATE; + }); +} + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.function.bind.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.function.bind.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.2.3.2 / 15.3.4.5 Function.prototype.bind(thisArg, args...) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.P, 'Function', { bind: __webpack_require__(/*! ./_bind */ "./node_modules/core-js/modules/_bind.js") }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.function.has-instance.js": +/*!*******************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.function.has-instance.js ***! + \*******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "./node_modules/core-js/modules/_object-gpo.js"); +var HAS_INSTANCE = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('hasInstance'); +var FunctionProto = Function.prototype; +// 19.2.3.6 Function.prototype[@@hasInstance](V) +if (!(HAS_INSTANCE in FunctionProto)) __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js").f(FunctionProto, HAS_INSTANCE, { value: function (O) { + if (typeof this != 'function' || !isObject(O)) return false; + if (!isObject(this.prototype)) return O instanceof this; + // for environment w/o native `@@hasInstance` logic enough `instanceof`, but add this: + while (O = getPrototypeOf(O)) if (this.prototype === O) return true; + return false; +} }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.function.name.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.function.name.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var dP = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js").f; +var FProto = Function.prototype; +var nameRE = /^\s*function ([^ (]*)/; +var NAME = 'name'; + +// 19.2.4.2 name +NAME in FProto || __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js") && dP(FProto, NAME, { + configurable: true, + get: function () { + try { + return ('' + this).match(nameRE)[1]; + } catch (e) { + return ''; + } + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.map.js": +/*!*************************************************!*\ + !*** ./node_modules/core-js/modules/es6.map.js ***! + \*************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var strong = __webpack_require__(/*! ./_collection-strong */ "./node_modules/core-js/modules/_collection-strong.js"); +var validate = __webpack_require__(/*! ./_validate-collection */ "./node_modules/core-js/modules/_validate-collection.js"); +var MAP = 'Map'; + +// 23.1 Map Objects +module.exports = __webpack_require__(/*! ./_collection */ "./node_modules/core-js/modules/_collection.js")(MAP, function (get) { + return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); }; +}, { + // 23.1.3.6 Map.prototype.get(key) + get: function get(key) { + var entry = strong.getEntry(validate(this, MAP), key); + return entry && entry.v; + }, + // 23.1.3.9 Map.prototype.set(key, value) + set: function set(key, value) { + return strong.def(validate(this, MAP), key === 0 ? 0 : key, value); + } +}, strong, true); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.acosh.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.acosh.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.3 Math.acosh(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var log1p = __webpack_require__(/*! ./_math-log1p */ "./node_modules/core-js/modules/_math-log1p.js"); +var sqrt = Math.sqrt; +var $acosh = Math.acosh; + +$export($export.S + $export.F * !($acosh + // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509 + && Math.floor($acosh(Number.MAX_VALUE)) == 710 + // Tor Browser bug: Math.acosh(Infinity) -> NaN + && $acosh(Infinity) == Infinity +), 'Math', { + acosh: function acosh(x) { + return (x = +x) < 1 ? NaN : x > 94906265.62425156 + ? Math.log(x) + Math.LN2 + : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1)); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.asinh.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.asinh.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.5 Math.asinh(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $asinh = Math.asinh; + +function asinh(x) { + return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1)); +} + +// Tor Browser bug: Math.asinh(0) -> -0 +$export($export.S + $export.F * !($asinh && 1 / $asinh(0) > 0), 'Math', { asinh: asinh }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.atanh.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.atanh.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.7 Math.atanh(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $atanh = Math.atanh; + +// Tor Browser bug: Math.atanh(-0) -> 0 +$export($export.S + $export.F * !($atanh && 1 / $atanh(-0) < 0), 'Math', { + atanh: function atanh(x) { + return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.cbrt.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.cbrt.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.9 Math.cbrt(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var sign = __webpack_require__(/*! ./_math-sign */ "./node_modules/core-js/modules/_math-sign.js"); + +$export($export.S, 'Math', { + cbrt: function cbrt(x) { + return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.clz32.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.clz32.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.11 Math.clz32(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Math', { + clz32: function clz32(x) { + return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.cosh.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.cosh.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.12 Math.cosh(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var exp = Math.exp; + +$export($export.S, 'Math', { + cosh: function cosh(x) { + return (exp(x = +x) + exp(-x)) / 2; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.expm1.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.expm1.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.14 Math.expm1(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $expm1 = __webpack_require__(/*! ./_math-expm1 */ "./node_modules/core-js/modules/_math-expm1.js"); + +$export($export.S + $export.F * ($expm1 != Math.expm1), 'Math', { expm1: $expm1 }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.fround.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.fround.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.16 Math.fround(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Math', { fround: __webpack_require__(/*! ./_math-fround */ "./node_modules/core-js/modules/_math-fround.js") }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.hypot.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.hypot.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.17 Math.hypot([value1[, value2[, … ]]]) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var abs = Math.abs; + +$export($export.S, 'Math', { + hypot: function hypot(value1, value2) { // eslint-disable-line no-unused-vars + var sum = 0; + var i = 0; + var aLen = arguments.length; + var larg = 0; + var arg, div; + while (i < aLen) { + arg = abs(arguments[i++]); + if (larg < arg) { + div = larg / arg; + sum = sum * div * div + 1; + larg = arg; + } else if (arg > 0) { + div = arg / larg; + sum += div * div; + } else sum += arg; + } + return larg === Infinity ? Infinity : larg * Math.sqrt(sum); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.imul.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.imul.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.18 Math.imul(x, y) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $imul = Math.imul; + +// some WebKit versions fails with big numbers, some has wrong arity +$export($export.S + $export.F * __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + return $imul(0xffffffff, 5) != -5 || $imul.length != 2; +}), 'Math', { + imul: function imul(x, y) { + var UINT16 = 0xffff; + var xn = +x; + var yn = +y; + var xl = UINT16 & xn; + var yl = UINT16 & yn; + return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.log10.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.log10.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.21 Math.log10(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Math', { + log10: function log10(x) { + return Math.log(x) * Math.LOG10E; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.log1p.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.log1p.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.20 Math.log1p(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Math', { log1p: __webpack_require__(/*! ./_math-log1p */ "./node_modules/core-js/modules/_math-log1p.js") }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.log2.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.log2.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.22 Math.log2(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Math', { + log2: function log2(x) { + return Math.log(x) / Math.LN2; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.sign.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.sign.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.28 Math.sign(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Math', { sign: __webpack_require__(/*! ./_math-sign */ "./node_modules/core-js/modules/_math-sign.js") }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.sinh.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.sinh.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.30 Math.sinh(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var expm1 = __webpack_require__(/*! ./_math-expm1 */ "./node_modules/core-js/modules/_math-expm1.js"); +var exp = Math.exp; + +// V8 near Chromium 38 has a problem with very small numbers +$export($export.S + $export.F * __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + return !Math.sinh(-2e-17) != -2e-17; +}), 'Math', { + sinh: function sinh(x) { + return Math.abs(x = +x) < 1 + ? (expm1(x) - expm1(-x)) / 2 + : (exp(x - 1) - exp(-x - 1)) * (Math.E / 2); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.tanh.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.tanh.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.33 Math.tanh(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var expm1 = __webpack_require__(/*! ./_math-expm1 */ "./node_modules/core-js/modules/_math-expm1.js"); +var exp = Math.exp; + +$export($export.S, 'Math', { + tanh: function tanh(x) { + var a = expm1(x = +x); + var b = expm1(-x); + return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x)); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.trunc.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.trunc.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.34 Math.trunc(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Math', { + trunc: function trunc(it) { + return (it > 0 ? Math.floor : Math.ceil)(it); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.number.constructor.js": +/*!****************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.number.constructor.js ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); +var cof = __webpack_require__(/*! ./_cof */ "./node_modules/core-js/modules/_cof.js"); +var inheritIfRequired = __webpack_require__(/*! ./_inherit-if-required */ "./node_modules/core-js/modules/_inherit-if-required.js"); +var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "./node_modules/core-js/modules/_to-primitive.js"); +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +var gOPN = __webpack_require__(/*! ./_object-gopn */ "./node_modules/core-js/modules/_object-gopn.js").f; +var gOPD = __webpack_require__(/*! ./_object-gopd */ "./node_modules/core-js/modules/_object-gopd.js").f; +var dP = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js").f; +var $trim = __webpack_require__(/*! ./_string-trim */ "./node_modules/core-js/modules/_string-trim.js").trim; +var NUMBER = 'Number'; +var $Number = global[NUMBER]; +var Base = $Number; +var proto = $Number.prototype; +// Opera ~12 has broken Object#toString +var BROKEN_COF = cof(__webpack_require__(/*! ./_object-create */ "./node_modules/core-js/modules/_object-create.js")(proto)) == NUMBER; +var TRIM = 'trim' in String.prototype; + +// 7.1.3 ToNumber(argument) +var toNumber = function (argument) { + var it = toPrimitive(argument, false); + if (typeof it == 'string' && it.length > 2) { + it = TRIM ? it.trim() : $trim(it, 3); + var first = it.charCodeAt(0); + var third, radix, maxCode; + if (first === 43 || first === 45) { + third = it.charCodeAt(2); + if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix + } else if (first === 48) { + switch (it.charCodeAt(1)) { + case 66: case 98: radix = 2; maxCode = 49; break; // fast equal /^0b[01]+$/i + case 79: case 111: radix = 8; maxCode = 55; break; // fast equal /^0o[0-7]+$/i + default: return +it; + } + for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) { + code = digits.charCodeAt(i); + // parseInt parses a string to a first unavailable symbol + // but ToNumber should return NaN if a string contains unavailable symbols + if (code < 48 || code > maxCode) return NaN; + } return parseInt(digits, radix); + } + } return +it; +}; + +if (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) { + $Number = function Number(value) { + var it = arguments.length < 1 ? 0 : value; + var that = this; + return that instanceof $Number + // check on 1..constructor(foo) case + && (BROKEN_COF ? fails(function () { proto.valueOf.call(that); }) : cof(that) != NUMBER) + ? inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it); + }; + for (var keys = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js") ? gOPN(Base) : ( + // ES3: + 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' + + // ES6 (in case, if modules with ES6 Number statics required before): + 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' + + 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger' + ).split(','), j = 0, key; keys.length > j; j++) { + if (has(Base, key = keys[j]) && !has($Number, key)) { + dP($Number, key, gOPD(Base, key)); + } + } + $Number.prototype = proto; + proto.constructor = $Number; + __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js")(global, NUMBER, $Number); +} + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.number.epsilon.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.number.epsilon.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.1.2.1 Number.EPSILON +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Number', { EPSILON: Math.pow(2, -52) }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.number.is-finite.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.number.is-finite.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.1.2.2 Number.isFinite(number) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var _isFinite = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js").isFinite; + +$export($export.S, 'Number', { + isFinite: function isFinite(it) { + return typeof it == 'number' && _isFinite(it); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.number.is-integer.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.number.is-integer.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.1.2.3 Number.isInteger(number) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Number', { isInteger: __webpack_require__(/*! ./_is-integer */ "./node_modules/core-js/modules/_is-integer.js") }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.number.is-nan.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.number.is-nan.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.1.2.4 Number.isNaN(number) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Number', { + isNaN: function isNaN(number) { + // eslint-disable-next-line no-self-compare + return number != number; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.number.is-safe-integer.js": +/*!********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.number.is-safe-integer.js ***! + \********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.1.2.5 Number.isSafeInteger(number) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var isInteger = __webpack_require__(/*! ./_is-integer */ "./node_modules/core-js/modules/_is-integer.js"); +var abs = Math.abs; + +$export($export.S, 'Number', { + isSafeInteger: function isSafeInteger(number) { + return isInteger(number) && abs(number) <= 0x1fffffffffffff; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.number.max-safe-integer.js": +/*!*********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.number.max-safe-integer.js ***! + \*********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.1.2.6 Number.MAX_SAFE_INTEGER +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Number', { MAX_SAFE_INTEGER: 0x1fffffffffffff }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.number.min-safe-integer.js": +/*!*********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.number.min-safe-integer.js ***! + \*********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.1.2.10 Number.MIN_SAFE_INTEGER +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Number', { MIN_SAFE_INTEGER: -0x1fffffffffffff }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.number.parse-float.js": +/*!****************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.number.parse-float.js ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $parseFloat = __webpack_require__(/*! ./_parse-float */ "./node_modules/core-js/modules/_parse-float.js"); +// 20.1.2.12 Number.parseFloat(string) +$export($export.S + $export.F * (Number.parseFloat != $parseFloat), 'Number', { parseFloat: $parseFloat }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.number.parse-int.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.number.parse-int.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $parseInt = __webpack_require__(/*! ./_parse-int */ "./node_modules/core-js/modules/_parse-int.js"); +// 20.1.2.13 Number.parseInt(string, radix) +$export($export.S + $export.F * (Number.parseInt != $parseInt), 'Number', { parseInt: $parseInt }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.number.to-fixed.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.number.to-fixed.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var toInteger = __webpack_require__(/*! ./_to-integer */ "./node_modules/core-js/modules/_to-integer.js"); +var aNumberValue = __webpack_require__(/*! ./_a-number-value */ "./node_modules/core-js/modules/_a-number-value.js"); +var repeat = __webpack_require__(/*! ./_string-repeat */ "./node_modules/core-js/modules/_string-repeat.js"); +var $toFixed = 1.0.toFixed; +var floor = Math.floor; +var data = [0, 0, 0, 0, 0, 0]; +var ERROR = 'Number.toFixed: incorrect invocation!'; +var ZERO = '0'; + +var multiply = function (n, c) { + var i = -1; + var c2 = c; + while (++i < 6) { + c2 += n * data[i]; + data[i] = c2 % 1e7; + c2 = floor(c2 / 1e7); + } +}; +var divide = function (n) { + var i = 6; + var c = 0; + while (--i >= 0) { + c += data[i]; + data[i] = floor(c / n); + c = (c % n) * 1e7; + } +}; +var numToString = function () { + var i = 6; + var s = ''; + while (--i >= 0) { + if (s !== '' || i === 0 || data[i] !== 0) { + var t = String(data[i]); + s = s === '' ? t : s + repeat.call(ZERO, 7 - t.length) + t; + } + } return s; +}; +var pow = function (x, n, acc) { + return n === 0 ? acc : n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc); +}; +var log = function (x) { + var n = 0; + var x2 = x; + while (x2 >= 4096) { + n += 12; + x2 /= 4096; + } + while (x2 >= 2) { + n += 1; + x2 /= 2; + } return n; +}; + +$export($export.P + $export.F * (!!$toFixed && ( + 0.00008.toFixed(3) !== '0.000' || + 0.9.toFixed(0) !== '1' || + 1.255.toFixed(2) !== '1.25' || + 1000000000000000128.0.toFixed(0) !== '1000000000000000128' +) || !__webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + // V8 ~ Android 4.3- + $toFixed.call({}); +})), 'Number', { + toFixed: function toFixed(fractionDigits) { + var x = aNumberValue(this, ERROR); + var f = toInteger(fractionDigits); + var s = ''; + var m = ZERO; + var e, z, j, k; + if (f < 0 || f > 20) throw RangeError(ERROR); + // eslint-disable-next-line no-self-compare + if (x != x) return 'NaN'; + if (x <= -1e21 || x >= 1e21) return String(x); + if (x < 0) { + s = '-'; + x = -x; + } + if (x > 1e-21) { + e = log(x * pow(2, 69, 1)) - 69; + z = e < 0 ? x * pow(2, -e, 1) : x / pow(2, e, 1); + z *= 0x10000000000000; + e = 52 - e; + if (e > 0) { + multiply(0, z); + j = f; + while (j >= 7) { + multiply(1e7, 0); + j -= 7; + } + multiply(pow(10, j, 1), 0); + j = e - 1; + while (j >= 23) { + divide(1 << 23); + j -= 23; + } + divide(1 << j); + multiply(1, 1); + divide(2); + m = numToString(); + } else { + multiply(0, z); + multiply(1 << -e, 0); + m = numToString() + repeat.call(ZERO, f); + } + } + if (f > 0) { + k = m.length; + m = s + (k <= f ? '0.' + repeat.call(ZERO, f - k) + m : m.slice(0, k - f) + '.' + m.slice(k - f)); + } else { + m = s + m; + } return m; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.number.to-precision.js": +/*!*****************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.number.to-precision.js ***! + \*****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +var aNumberValue = __webpack_require__(/*! ./_a-number-value */ "./node_modules/core-js/modules/_a-number-value.js"); +var $toPrecision = 1.0.toPrecision; + +$export($export.P + $export.F * ($fails(function () { + // IE7- + return $toPrecision.call(1, undefined) !== '1'; +}) || !$fails(function () { + // V8 ~ Android 4.3- + $toPrecision.call({}); +})), 'Number', { + toPrecision: function toPrecision(precision) { + var that = aNumberValue(this, 'Number#toPrecision: incorrect invocation!'); + return precision === undefined ? $toPrecision.call(that) : $toPrecision.call(that, precision); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.assign.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.assign.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.3.1 Object.assign(target, source) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S + $export.F, 'Object', { assign: __webpack_require__(/*! ./_object-assign */ "./node_modules/core-js/modules/_object-assign.js") }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.create.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.create.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) +$export($export.S, 'Object', { create: __webpack_require__(/*! ./_object-create */ "./node_modules/core-js/modules/_object-create.js") }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.define-properties.js": +/*!**********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.define-properties.js ***! + \**********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +// 19.1.2.3 / 15.2.3.7 Object.defineProperties(O, Properties) +$export($export.S + $export.F * !__webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js"), 'Object', { defineProperties: __webpack_require__(/*! ./_object-dps */ "./node_modules/core-js/modules/_object-dps.js") }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.define-property.js": +/*!********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.define-property.js ***! + \********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes) +$export($export.S + $export.F * !__webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js"), 'Object', { defineProperty: __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js").f }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.freeze.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.freeze.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.5 Object.freeze(O) +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var meta = __webpack_require__(/*! ./_meta */ "./node_modules/core-js/modules/_meta.js").onFreeze; + +__webpack_require__(/*! ./_object-sap */ "./node_modules/core-js/modules/_object-sap.js")('freeze', function ($freeze) { + return function freeze(it) { + return $freeze && isObject(it) ? $freeze(meta(it)) : it; + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.get-own-property-descriptor.js": +/*!********************************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.get-own-property-descriptor.js ***! + \********************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P) +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/core-js/modules/_to-iobject.js"); +var $getOwnPropertyDescriptor = __webpack_require__(/*! ./_object-gopd */ "./node_modules/core-js/modules/_object-gopd.js").f; + +__webpack_require__(/*! ./_object-sap */ "./node_modules/core-js/modules/_object-sap.js")('getOwnPropertyDescriptor', function () { + return function getOwnPropertyDescriptor(it, key) { + return $getOwnPropertyDescriptor(toIObject(it), key); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.get-own-property-names.js": +/*!***************************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.get-own-property-names.js ***! + \***************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.7 Object.getOwnPropertyNames(O) +__webpack_require__(/*! ./_object-sap */ "./node_modules/core-js/modules/_object-sap.js")('getOwnPropertyNames', function () { + return __webpack_require__(/*! ./_object-gopn-ext */ "./node_modules/core-js/modules/_object-gopn-ext.js").f; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.get-prototype-of.js": +/*!*********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.get-prototype-of.js ***! + \*********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.9 Object.getPrototypeOf(O) +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var $getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "./node_modules/core-js/modules/_object-gpo.js"); + +__webpack_require__(/*! ./_object-sap */ "./node_modules/core-js/modules/_object-sap.js")('getPrototypeOf', function () { + return function getPrototypeOf(it) { + return $getPrototypeOf(toObject(it)); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.is-extensible.js": +/*!******************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.is-extensible.js ***! + \******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.11 Object.isExtensible(O) +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); + +__webpack_require__(/*! ./_object-sap */ "./node_modules/core-js/modules/_object-sap.js")('isExtensible', function ($isExtensible) { + return function isExtensible(it) { + return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false; + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.is-frozen.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.is-frozen.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.12 Object.isFrozen(O) +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); + +__webpack_require__(/*! ./_object-sap */ "./node_modules/core-js/modules/_object-sap.js")('isFrozen', function ($isFrozen) { + return function isFrozen(it) { + return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true; + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.is-sealed.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.is-sealed.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.13 Object.isSealed(O) +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); + +__webpack_require__(/*! ./_object-sap */ "./node_modules/core-js/modules/_object-sap.js")('isSealed', function ($isSealed) { + return function isSealed(it) { + return isObject(it) ? $isSealed ? $isSealed(it) : false : true; + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.is.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.is.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.3.10 Object.is(value1, value2) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +$export($export.S, 'Object', { is: __webpack_require__(/*! ./_same-value */ "./node_modules/core-js/modules/_same-value.js") }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.keys.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.keys.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.14 Object.keys(O) +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var $keys = __webpack_require__(/*! ./_object-keys */ "./node_modules/core-js/modules/_object-keys.js"); + +__webpack_require__(/*! ./_object-sap */ "./node_modules/core-js/modules/_object-sap.js")('keys', function () { + return function keys(it) { + return $keys(toObject(it)); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.prevent-extensions.js": +/*!***********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.prevent-extensions.js ***! + \***********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.15 Object.preventExtensions(O) +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var meta = __webpack_require__(/*! ./_meta */ "./node_modules/core-js/modules/_meta.js").onFreeze; + +__webpack_require__(/*! ./_object-sap */ "./node_modules/core-js/modules/_object-sap.js")('preventExtensions', function ($preventExtensions) { + return function preventExtensions(it) { + return $preventExtensions && isObject(it) ? $preventExtensions(meta(it)) : it; + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.seal.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.seal.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.17 Object.seal(O) +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var meta = __webpack_require__(/*! ./_meta */ "./node_modules/core-js/modules/_meta.js").onFreeze; + +__webpack_require__(/*! ./_object-sap */ "./node_modules/core-js/modules/_object-sap.js")('seal', function ($seal) { + return function seal(it) { + return $seal && isObject(it) ? $seal(meta(it)) : it; + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.set-prototype-of.js": +/*!*********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.set-prototype-of.js ***! + \*********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.3.19 Object.setPrototypeOf(O, proto) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +$export($export.S, 'Object', { setPrototypeOf: __webpack_require__(/*! ./_set-proto */ "./node_modules/core-js/modules/_set-proto.js").set }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.to-string.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.to-string.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// 19.1.3.6 Object.prototype.toString() +var classof = __webpack_require__(/*! ./_classof */ "./node_modules/core-js/modules/_classof.js"); +var test = {}; +test[__webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('toStringTag')] = 'z'; +if (test + '' != '[object z]') { + __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js")(Object.prototype, 'toString', function toString() { + return '[object ' + classof(this) + ']'; + }, true); +} + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.parse-float.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.parse-float.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $parseFloat = __webpack_require__(/*! ./_parse-float */ "./node_modules/core-js/modules/_parse-float.js"); +// 18.2.4 parseFloat(string) +$export($export.G + $export.F * (parseFloat != $parseFloat), { parseFloat: $parseFloat }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.parse-int.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.parse-int.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $parseInt = __webpack_require__(/*! ./_parse-int */ "./node_modules/core-js/modules/_parse-int.js"); +// 18.2.5 parseInt(string, radix) +$export($export.G + $export.F * (parseInt != $parseInt), { parseInt: $parseInt }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.promise.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/es6.promise.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var LIBRARY = __webpack_require__(/*! ./_library */ "./node_modules/core-js/modules/_library.js"); +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var ctx = __webpack_require__(/*! ./_ctx */ "./node_modules/core-js/modules/_ctx.js"); +var classof = __webpack_require__(/*! ./_classof */ "./node_modules/core-js/modules/_classof.js"); +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var aFunction = __webpack_require__(/*! ./_a-function */ "./node_modules/core-js/modules/_a-function.js"); +var anInstance = __webpack_require__(/*! ./_an-instance */ "./node_modules/core-js/modules/_an-instance.js"); +var forOf = __webpack_require__(/*! ./_for-of */ "./node_modules/core-js/modules/_for-of.js"); +var speciesConstructor = __webpack_require__(/*! ./_species-constructor */ "./node_modules/core-js/modules/_species-constructor.js"); +var task = __webpack_require__(/*! ./_task */ "./node_modules/core-js/modules/_task.js").set; +var microtask = __webpack_require__(/*! ./_microtask */ "./node_modules/core-js/modules/_microtask.js")(); +var newPromiseCapabilityModule = __webpack_require__(/*! ./_new-promise-capability */ "./node_modules/core-js/modules/_new-promise-capability.js"); +var perform = __webpack_require__(/*! ./_perform */ "./node_modules/core-js/modules/_perform.js"); +var userAgent = __webpack_require__(/*! ./_user-agent */ "./node_modules/core-js/modules/_user-agent.js"); +var promiseResolve = __webpack_require__(/*! ./_promise-resolve */ "./node_modules/core-js/modules/_promise-resolve.js"); +var PROMISE = 'Promise'; +var TypeError = global.TypeError; +var process = global.process; +var versions = process && process.versions; +var v8 = versions && versions.v8 || ''; +var $Promise = global[PROMISE]; +var isNode = classof(process) == 'process'; +var empty = function () { /* empty */ }; +var Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper; +var newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f; + +var USE_NATIVE = !!function () { + try { + // correct subclassing with @@species support + var promise = $Promise.resolve(1); + var FakePromise = (promise.constructor = {})[__webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('species')] = function (exec) { + exec(empty, empty); + }; + // unhandled rejections tracking support, NodeJS Promise without it fails @@species test + return (isNode || typeof PromiseRejectionEvent == 'function') + && promise.then(empty) instanceof FakePromise + // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables + // https://bugs.chromium.org/p/chromium/issues/detail?id=830565 + // we can't detect it synchronously, so just check versions + && v8.indexOf('6.6') !== 0 + && userAgent.indexOf('Chrome/66') === -1; + } catch (e) { /* empty */ } +}(); + +// helpers +var isThenable = function (it) { + var then; + return isObject(it) && typeof (then = it.then) == 'function' ? then : false; +}; +var notify = function (promise, isReject) { + if (promise._n) return; + promise._n = true; + var chain = promise._c; + microtask(function () { + var value = promise._v; + var ok = promise._s == 1; + var i = 0; + var run = function (reaction) { + var handler = ok ? reaction.ok : reaction.fail; + var resolve = reaction.resolve; + var reject = reaction.reject; + var domain = reaction.domain; + var result, then, exited; + try { + if (handler) { + if (!ok) { + if (promise._h == 2) onHandleUnhandled(promise); + promise._h = 1; + } + if (handler === true) result = value; + else { + if (domain) domain.enter(); + result = handler(value); // may throw + if (domain) { + domain.exit(); + exited = true; + } + } + if (result === reaction.promise) { + reject(TypeError('Promise-chain cycle')); + } else if (then = isThenable(result)) { + then.call(result, resolve, reject); + } else resolve(result); + } else reject(value); + } catch (e) { + if (domain && !exited) domain.exit(); + reject(e); + } + }; + while (chain.length > i) run(chain[i++]); // variable length - can't use forEach + promise._c = []; + promise._n = false; + if (isReject && !promise._h) onUnhandled(promise); + }); +}; +var onUnhandled = function (promise) { + task.call(global, function () { + var value = promise._v; + var unhandled = isUnhandled(promise); + var result, handler, console; + if (unhandled) { + result = perform(function () { + if (isNode) { + process.emit('unhandledRejection', value, promise); + } else if (handler = global.onunhandledrejection) { + handler({ promise: promise, reason: value }); + } else if ((console = global.console) && console.error) { + console.error('Unhandled promise rejection', value); + } + }); + // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should + promise._h = isNode || isUnhandled(promise) ? 2 : 1; + } promise._a = undefined; + if (unhandled && result.e) throw result.v; + }); +}; +var isUnhandled = function (promise) { + return promise._h !== 1 && (promise._a || promise._c).length === 0; +}; +var onHandleUnhandled = function (promise) { + task.call(global, function () { + var handler; + if (isNode) { + process.emit('rejectionHandled', promise); + } else if (handler = global.onrejectionhandled) { + handler({ promise: promise, reason: promise._v }); + } + }); +}; +var $reject = function (value) { + var promise = this; + if (promise._d) return; + promise._d = true; + promise = promise._w || promise; // unwrap + promise._v = value; + promise._s = 2; + if (!promise._a) promise._a = promise._c.slice(); + notify(promise, true); +}; +var $resolve = function (value) { + var promise = this; + var then; + if (promise._d) return; + promise._d = true; + promise = promise._w || promise; // unwrap + try { + if (promise === value) throw TypeError("Promise can't be resolved itself"); + if (then = isThenable(value)) { + microtask(function () { + var wrapper = { _w: promise, _d: false }; // wrap + try { + then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1)); + } catch (e) { + $reject.call(wrapper, e); + } + }); + } else { + promise._v = value; + promise._s = 1; + notify(promise, false); + } + } catch (e) { + $reject.call({ _w: promise, _d: false }, e); // wrap + } +}; + +// constructor polyfill +if (!USE_NATIVE) { + // 25.4.3.1 Promise(executor) + $Promise = function Promise(executor) { + anInstance(this, $Promise, PROMISE, '_h'); + aFunction(executor); + Internal.call(this); + try { + executor(ctx($resolve, this, 1), ctx($reject, this, 1)); + } catch (err) { + $reject.call(this, err); + } + }; + // eslint-disable-next-line no-unused-vars + Internal = function Promise(executor) { + this._c = []; // <- awaiting reactions + this._a = undefined; // <- checked in isUnhandled reactions + this._s = 0; // <- state + this._d = false; // <- done + this._v = undefined; // <- value + this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled + this._n = false; // <- notify + }; + Internal.prototype = __webpack_require__(/*! ./_redefine-all */ "./node_modules/core-js/modules/_redefine-all.js")($Promise.prototype, { + // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected) + then: function then(onFulfilled, onRejected) { + var reaction = newPromiseCapability(speciesConstructor(this, $Promise)); + reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true; + reaction.fail = typeof onRejected == 'function' && onRejected; + reaction.domain = isNode ? process.domain : undefined; + this._c.push(reaction); + if (this._a) this._a.push(reaction); + if (this._s) notify(this, false); + return reaction.promise; + }, + // 25.4.5.1 Promise.prototype.catch(onRejected) + 'catch': function (onRejected) { + return this.then(undefined, onRejected); + } + }); + OwnPromiseCapability = function () { + var promise = new Internal(); + this.promise = promise; + this.resolve = ctx($resolve, promise, 1); + this.reject = ctx($reject, promise, 1); + }; + newPromiseCapabilityModule.f = newPromiseCapability = function (C) { + return C === $Promise || C === Wrapper + ? new OwnPromiseCapability(C) + : newGenericPromiseCapability(C); + }; +} + +$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise }); +__webpack_require__(/*! ./_set-to-string-tag */ "./node_modules/core-js/modules/_set-to-string-tag.js")($Promise, PROMISE); +__webpack_require__(/*! ./_set-species */ "./node_modules/core-js/modules/_set-species.js")(PROMISE); +Wrapper = __webpack_require__(/*! ./_core */ "./node_modules/core-js/modules/_core.js")[PROMISE]; + +// statics +$export($export.S + $export.F * !USE_NATIVE, PROMISE, { + // 25.4.4.5 Promise.reject(r) + reject: function reject(r) { + var capability = newPromiseCapability(this); + var $$reject = capability.reject; + $$reject(r); + return capability.promise; + } +}); +$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, { + // 25.4.4.6 Promise.resolve(x) + resolve: function resolve(x) { + return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x); + } +}); +$export($export.S + $export.F * !(USE_NATIVE && __webpack_require__(/*! ./_iter-detect */ "./node_modules/core-js/modules/_iter-detect.js")(function (iter) { + $Promise.all(iter)['catch'](empty); +})), PROMISE, { + // 25.4.4.1 Promise.all(iterable) + all: function all(iterable) { + var C = this; + var capability = newPromiseCapability(C); + var resolve = capability.resolve; + var reject = capability.reject; + var result = perform(function () { + var values = []; + var index = 0; + var remaining = 1; + forOf(iterable, false, function (promise) { + var $index = index++; + var alreadyCalled = false; + values.push(undefined); + remaining++; + C.resolve(promise).then(function (value) { + if (alreadyCalled) return; + alreadyCalled = true; + values[$index] = value; + --remaining || resolve(values); + }, reject); + }); + --remaining || resolve(values); + }); + if (result.e) reject(result.v); + return capability.promise; + }, + // 25.4.4.4 Promise.race(iterable) + race: function race(iterable) { + var C = this; + var capability = newPromiseCapability(C); + var reject = capability.reject; + var result = perform(function () { + forOf(iterable, false, function (promise) { + C.resolve(promise).then(capability.resolve, reject); + }); + }); + if (result.e) reject(result.v); + return capability.promise; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.apply.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.apply.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.1 Reflect.apply(target, thisArgument, argumentsList) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var aFunction = __webpack_require__(/*! ./_a-function */ "./node_modules/core-js/modules/_a-function.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var rApply = (__webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js").Reflect || {}).apply; +var fApply = Function.apply; +// MS Edge argumentsList argument is optional +$export($export.S + $export.F * !__webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + rApply(function () { /* empty */ }); +}), 'Reflect', { + apply: function apply(target, thisArgument, argumentsList) { + var T = aFunction(target); + var L = anObject(argumentsList); + return rApply ? rApply(T, thisArgument, L) : fApply.call(T, thisArgument, L); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.construct.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.construct.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.2 Reflect.construct(target, argumentsList [, newTarget]) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var create = __webpack_require__(/*! ./_object-create */ "./node_modules/core-js/modules/_object-create.js"); +var aFunction = __webpack_require__(/*! ./_a-function */ "./node_modules/core-js/modules/_a-function.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +var bind = __webpack_require__(/*! ./_bind */ "./node_modules/core-js/modules/_bind.js"); +var rConstruct = (__webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js").Reflect || {}).construct; + +// MS Edge supports only 2 arguments and argumentsList argument is optional +// FF Nightly sets third argument as `new.target`, but does not create `this` from it +var NEW_TARGET_BUG = fails(function () { + function F() { /* empty */ } + return !(rConstruct(function () { /* empty */ }, [], F) instanceof F); +}); +var ARGS_BUG = !fails(function () { + rConstruct(function () { /* empty */ }); +}); + +$export($export.S + $export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', { + construct: function construct(Target, args /* , newTarget */) { + aFunction(Target); + anObject(args); + var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]); + if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget); + if (Target == newTarget) { + // w/o altered newTarget, optimization for 0-4 arguments + switch (args.length) { + case 0: return new Target(); + case 1: return new Target(args[0]); + case 2: return new Target(args[0], args[1]); + case 3: return new Target(args[0], args[1], args[2]); + case 4: return new Target(args[0], args[1], args[2], args[3]); + } + // w/o altered newTarget, lot of arguments case + var $args = [null]; + $args.push.apply($args, args); + return new (bind.apply(Target, $args))(); + } + // with altered newTarget, not support built-in constructors + var proto = newTarget.prototype; + var instance = create(isObject(proto) ? proto : Object.prototype); + var result = Function.apply.call(Target, instance, args); + return isObject(result) ? result : instance; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.define-property.js": +/*!*********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.define-property.js ***! + \*********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.3 Reflect.defineProperty(target, propertyKey, attributes) +var dP = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js"); +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "./node_modules/core-js/modules/_to-primitive.js"); + +// MS Edge has broken Reflect.defineProperty - throwing instead of returning false +$export($export.S + $export.F * __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + // eslint-disable-next-line no-undef + Reflect.defineProperty(dP.f({}, 1, { value: 1 }), 1, { value: 2 }); +}), 'Reflect', { + defineProperty: function defineProperty(target, propertyKey, attributes) { + anObject(target); + propertyKey = toPrimitive(propertyKey, true); + anObject(attributes); + try { + dP.f(target, propertyKey, attributes); + return true; + } catch (e) { + return false; + } + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.delete-property.js": +/*!*********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.delete-property.js ***! + \*********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.4 Reflect.deleteProperty(target, propertyKey) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var gOPD = __webpack_require__(/*! ./_object-gopd */ "./node_modules/core-js/modules/_object-gopd.js").f; +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); + +$export($export.S, 'Reflect', { + deleteProperty: function deleteProperty(target, propertyKey) { + var desc = gOPD(anObject(target), propertyKey); + return desc && !desc.configurable ? false : delete target[propertyKey]; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.enumerate.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.enumerate.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// 26.1.5 Reflect.enumerate(target) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var Enumerate = function (iterated) { + this._t = anObject(iterated); // target + this._i = 0; // next index + var keys = this._k = []; // keys + var key; + for (key in iterated) keys.push(key); +}; +__webpack_require__(/*! ./_iter-create */ "./node_modules/core-js/modules/_iter-create.js")(Enumerate, 'Object', function () { + var that = this; + var keys = that._k; + var key; + do { + if (that._i >= keys.length) return { value: undefined, done: true }; + } while (!((key = keys[that._i++]) in that._t)); + return { value: key, done: false }; +}); + +$export($export.S, 'Reflect', { + enumerate: function enumerate(target) { + return new Enumerate(target); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js ***! + \*********************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey) +var gOPD = __webpack_require__(/*! ./_object-gopd */ "./node_modules/core-js/modules/_object-gopd.js"); +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); + +$export($export.S, 'Reflect', { + getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) { + return gOPD.f(anObject(target), propertyKey); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.get-prototype-of.js": +/*!**********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.get-prototype-of.js ***! + \**********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.8 Reflect.getPrototypeOf(target) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var getProto = __webpack_require__(/*! ./_object-gpo */ "./node_modules/core-js/modules/_object-gpo.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); + +$export($export.S, 'Reflect', { + getPrototypeOf: function getPrototypeOf(target) { + return getProto(anObject(target)); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.get.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.get.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.6 Reflect.get(target, propertyKey [, receiver]) +var gOPD = __webpack_require__(/*! ./_object-gopd */ "./node_modules/core-js/modules/_object-gopd.js"); +var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "./node_modules/core-js/modules/_object-gpo.js"); +var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); + +function get(target, propertyKey /* , receiver */) { + var receiver = arguments.length < 3 ? target : arguments[2]; + var desc, proto; + if (anObject(target) === receiver) return target[propertyKey]; + if (desc = gOPD.f(target, propertyKey)) return has(desc, 'value') + ? desc.value + : desc.get !== undefined + ? desc.get.call(receiver) + : undefined; + if (isObject(proto = getPrototypeOf(target))) return get(proto, propertyKey, receiver); +} + +$export($export.S, 'Reflect', { get: get }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.has.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.has.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.9 Reflect.has(target, propertyKey) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Reflect', { + has: function has(target, propertyKey) { + return propertyKey in target; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.is-extensible.js": +/*!*******************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.is-extensible.js ***! + \*******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.10 Reflect.isExtensible(target) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var $isExtensible = Object.isExtensible; + +$export($export.S, 'Reflect', { + isExtensible: function isExtensible(target) { + anObject(target); + return $isExtensible ? $isExtensible(target) : true; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.own-keys.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.own-keys.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.11 Reflect.ownKeys(target) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Reflect', { ownKeys: __webpack_require__(/*! ./_own-keys */ "./node_modules/core-js/modules/_own-keys.js") }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.prevent-extensions.js": +/*!************************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.prevent-extensions.js ***! + \************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.12 Reflect.preventExtensions(target) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var $preventExtensions = Object.preventExtensions; + +$export($export.S, 'Reflect', { + preventExtensions: function preventExtensions(target) { + anObject(target); + try { + if ($preventExtensions) $preventExtensions(target); + return true; + } catch (e) { + return false; + } + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.set-prototype-of.js": +/*!**********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.set-prototype-of.js ***! + \**********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.14 Reflect.setPrototypeOf(target, proto) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var setProto = __webpack_require__(/*! ./_set-proto */ "./node_modules/core-js/modules/_set-proto.js"); + +if (setProto) $export($export.S, 'Reflect', { + setPrototypeOf: function setPrototypeOf(target, proto) { + setProto.check(target, proto); + try { + setProto.set(target, proto); + return true; + } catch (e) { + return false; + } + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.set.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.set.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.13 Reflect.set(target, propertyKey, V [, receiver]) +var dP = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js"); +var gOPD = __webpack_require__(/*! ./_object-gopd */ "./node_modules/core-js/modules/_object-gopd.js"); +var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "./node_modules/core-js/modules/_object-gpo.js"); +var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var createDesc = __webpack_require__(/*! ./_property-desc */ "./node_modules/core-js/modules/_property-desc.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); + +function set(target, propertyKey, V /* , receiver */) { + var receiver = arguments.length < 4 ? target : arguments[3]; + var ownDesc = gOPD.f(anObject(target), propertyKey); + var existingDescriptor, proto; + if (!ownDesc) { + if (isObject(proto = getPrototypeOf(target))) { + return set(proto, propertyKey, V, receiver); + } + ownDesc = createDesc(0); + } + if (has(ownDesc, 'value')) { + if (ownDesc.writable === false || !isObject(receiver)) return false; + if (existingDescriptor = gOPD.f(receiver, propertyKey)) { + if (existingDescriptor.get || existingDescriptor.set || existingDescriptor.writable === false) return false; + existingDescriptor.value = V; + dP.f(receiver, propertyKey, existingDescriptor); + } else dP.f(receiver, propertyKey, createDesc(0, V)); + return true; + } + return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true); +} + +$export($export.S, 'Reflect', { set: set }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.regexp.constructor.js": +/*!****************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.regexp.constructor.js ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var inheritIfRequired = __webpack_require__(/*! ./_inherit-if-required */ "./node_modules/core-js/modules/_inherit-if-required.js"); +var dP = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js").f; +var gOPN = __webpack_require__(/*! ./_object-gopn */ "./node_modules/core-js/modules/_object-gopn.js").f; +var isRegExp = __webpack_require__(/*! ./_is-regexp */ "./node_modules/core-js/modules/_is-regexp.js"); +var $flags = __webpack_require__(/*! ./_flags */ "./node_modules/core-js/modules/_flags.js"); +var $RegExp = global.RegExp; +var Base = $RegExp; +var proto = $RegExp.prototype; +var re1 = /a/g; +var re2 = /a/g; +// "new" creates a new object, old webkit buggy here +var CORRECT_NEW = new $RegExp(re1) !== re1; + +if (__webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js") && (!CORRECT_NEW || __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + re2[__webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('match')] = false; + // RegExp constructor can alter flags and IsRegExp works correct with @@match + return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i'; +}))) { + $RegExp = function RegExp(p, f) { + var tiRE = this instanceof $RegExp; + var piRE = isRegExp(p); + var fiU = f === undefined; + return !tiRE && piRE && p.constructor === $RegExp && fiU ? p + : inheritIfRequired(CORRECT_NEW + ? new Base(piRE && !fiU ? p.source : p, f) + : Base((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? $flags.call(p) : f) + , tiRE ? this : proto, $RegExp); + }; + var proxy = function (key) { + key in $RegExp || dP($RegExp, key, { + configurable: true, + get: function () { return Base[key]; }, + set: function (it) { Base[key] = it; } + }); + }; + for (var keys = gOPN(Base), i = 0; keys.length > i;) proxy(keys[i++]); + proto.constructor = $RegExp; + $RegExp.prototype = proto; + __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js")(global, 'RegExp', $RegExp); +} + +__webpack_require__(/*! ./_set-species */ "./node_modules/core-js/modules/_set-species.js")('RegExp'); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.regexp.exec.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.regexp.exec.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var regexpExec = __webpack_require__(/*! ./_regexp-exec */ "./node_modules/core-js/modules/_regexp-exec.js"); +__webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js")({ + target: 'RegExp', + proto: true, + forced: regexpExec !== /./.exec +}, { + exec: regexpExec +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.regexp.flags.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.regexp.flags.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 21.2.5.3 get RegExp.prototype.flags() +if (__webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js") && /./g.flags != 'g') __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js").f(RegExp.prototype, 'flags', { + configurable: true, + get: __webpack_require__(/*! ./_flags */ "./node_modules/core-js/modules/_flags.js") +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.regexp.match.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.regexp.match.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var advanceStringIndex = __webpack_require__(/*! ./_advance-string-index */ "./node_modules/core-js/modules/_advance-string-index.js"); +var regExpExec = __webpack_require__(/*! ./_regexp-exec-abstract */ "./node_modules/core-js/modules/_regexp-exec-abstract.js"); + +// @@match logic +__webpack_require__(/*! ./_fix-re-wks */ "./node_modules/core-js/modules/_fix-re-wks.js")('match', 1, function (defined, MATCH, $match, maybeCallNative) { + return [ + // `String.prototype.match` method + // https://tc39.github.io/ecma262/#sec-string.prototype.match + function match(regexp) { + var O = defined(this); + var fn = regexp == undefined ? undefined : regexp[MATCH]; + return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O)); + }, + // `RegExp.prototype[@@match]` method + // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match + function (regexp) { + var res = maybeCallNative($match, regexp, this); + if (res.done) return res.value; + var rx = anObject(regexp); + var S = String(this); + if (!rx.global) return regExpExec(rx, S); + var fullUnicode = rx.unicode; + rx.lastIndex = 0; + var A = []; + var n = 0; + var result; + while ((result = regExpExec(rx, S)) !== null) { + var matchStr = String(result[0]); + A[n] = matchStr; + if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode); + n++; + } + return n === 0 ? null : A; + } + ]; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.regexp.replace.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.regexp.replace.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var toInteger = __webpack_require__(/*! ./_to-integer */ "./node_modules/core-js/modules/_to-integer.js"); +var advanceStringIndex = __webpack_require__(/*! ./_advance-string-index */ "./node_modules/core-js/modules/_advance-string-index.js"); +var regExpExec = __webpack_require__(/*! ./_regexp-exec-abstract */ "./node_modules/core-js/modules/_regexp-exec-abstract.js"); +var max = Math.max; +var min = Math.min; +var floor = Math.floor; +var SUBSTITUTION_SYMBOLS = /\$([$&`']|\d\d?|<[^>]*>)/g; +var SUBSTITUTION_SYMBOLS_NO_NAMED = /\$([$&`']|\d\d?)/g; + +var maybeToString = function (it) { + return it === undefined ? it : String(it); +}; + +// @@replace logic +__webpack_require__(/*! ./_fix-re-wks */ "./node_modules/core-js/modules/_fix-re-wks.js")('replace', 2, function (defined, REPLACE, $replace, maybeCallNative) { + return [ + // `String.prototype.replace` method + // https://tc39.github.io/ecma262/#sec-string.prototype.replace + function replace(searchValue, replaceValue) { + var O = defined(this); + var fn = searchValue == undefined ? undefined : searchValue[REPLACE]; + return fn !== undefined + ? fn.call(searchValue, O, replaceValue) + : $replace.call(String(O), searchValue, replaceValue); + }, + // `RegExp.prototype[@@replace]` method + // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace + function (regexp, replaceValue) { + var res = maybeCallNative($replace, regexp, this, replaceValue); + if (res.done) return res.value; + + var rx = anObject(regexp); + var S = String(this); + var functionalReplace = typeof replaceValue === 'function'; + if (!functionalReplace) replaceValue = String(replaceValue); + var global = rx.global; + if (global) { + var fullUnicode = rx.unicode; + rx.lastIndex = 0; + } + var results = []; + while (true) { + var result = regExpExec(rx, S); + if (result === null) break; + results.push(result); + if (!global) break; + var matchStr = String(result[0]); + if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode); + } + var accumulatedResult = ''; + var nextSourcePosition = 0; + for (var i = 0; i < results.length; i++) { + result = results[i]; + var matched = String(result[0]); + var position = max(min(toInteger(result.index), S.length), 0); + var captures = []; + // NOTE: This is equivalent to + // captures = result.slice(1).map(maybeToString) + // but for some reason `nativeSlice.call(result, 1, result.length)` (called in + // the slice polyfill when slicing native arrays) "doesn't work" in safari 9 and + // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it. + for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j])); + var namedCaptures = result.groups; + if (functionalReplace) { + var replacerArgs = [matched].concat(captures, position, S); + if (namedCaptures !== undefined) replacerArgs.push(namedCaptures); + var replacement = String(replaceValue.apply(undefined, replacerArgs)); + } else { + replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue); + } + if (position >= nextSourcePosition) { + accumulatedResult += S.slice(nextSourcePosition, position) + replacement; + nextSourcePosition = position + matched.length; + } + } + return accumulatedResult + S.slice(nextSourcePosition); + } + ]; + + // https://tc39.github.io/ecma262/#sec-getsubstitution + function getSubstitution(matched, str, position, captures, namedCaptures, replacement) { + var tailPos = position + matched.length; + var m = captures.length; + var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED; + if (namedCaptures !== undefined) { + namedCaptures = toObject(namedCaptures); + symbols = SUBSTITUTION_SYMBOLS; + } + return $replace.call(replacement, symbols, function (match, ch) { + var capture; + switch (ch.charAt(0)) { + case '$': return '$'; + case '&': return matched; + case '`': return str.slice(0, position); + case "'": return str.slice(tailPos); + case '<': + capture = namedCaptures[ch.slice(1, -1)]; + break; + default: // \d\d? + var n = +ch; + if (n === 0) return match; + if (n > m) { + var f = floor(n / 10); + if (f === 0) return match; + if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1); + return match; + } + capture = captures[n - 1]; + } + return capture === undefined ? '' : capture; + }); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.regexp.search.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.regexp.search.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var sameValue = __webpack_require__(/*! ./_same-value */ "./node_modules/core-js/modules/_same-value.js"); +var regExpExec = __webpack_require__(/*! ./_regexp-exec-abstract */ "./node_modules/core-js/modules/_regexp-exec-abstract.js"); + +// @@search logic +__webpack_require__(/*! ./_fix-re-wks */ "./node_modules/core-js/modules/_fix-re-wks.js")('search', 1, function (defined, SEARCH, $search, maybeCallNative) { + return [ + // `String.prototype.search` method + // https://tc39.github.io/ecma262/#sec-string.prototype.search + function search(regexp) { + var O = defined(this); + var fn = regexp == undefined ? undefined : regexp[SEARCH]; + return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O)); + }, + // `RegExp.prototype[@@search]` method + // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search + function (regexp) { + var res = maybeCallNative($search, regexp, this); + if (res.done) return res.value; + var rx = anObject(regexp); + var S = String(this); + var previousLastIndex = rx.lastIndex; + if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0; + var result = regExpExec(rx, S); + if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex; + return result === null ? -1 : result.index; + } + ]; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.regexp.split.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.regexp.split.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var isRegExp = __webpack_require__(/*! ./_is-regexp */ "./node_modules/core-js/modules/_is-regexp.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var speciesConstructor = __webpack_require__(/*! ./_species-constructor */ "./node_modules/core-js/modules/_species-constructor.js"); +var advanceStringIndex = __webpack_require__(/*! ./_advance-string-index */ "./node_modules/core-js/modules/_advance-string-index.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var callRegExpExec = __webpack_require__(/*! ./_regexp-exec-abstract */ "./node_modules/core-js/modules/_regexp-exec-abstract.js"); +var regexpExec = __webpack_require__(/*! ./_regexp-exec */ "./node_modules/core-js/modules/_regexp-exec.js"); +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +var $min = Math.min; +var $push = [].push; +var $SPLIT = 'split'; +var LENGTH = 'length'; +var LAST_INDEX = 'lastIndex'; +var MAX_UINT32 = 0xffffffff; + +// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError +var SUPPORTS_Y = !fails(function () { RegExp(MAX_UINT32, 'y'); }); + +// @@split logic +__webpack_require__(/*! ./_fix-re-wks */ "./node_modules/core-js/modules/_fix-re-wks.js")('split', 2, function (defined, SPLIT, $split, maybeCallNative) { + var internalSplit; + if ( + 'abbc'[$SPLIT](/(b)*/)[1] == 'c' || + 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 || + 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 || + '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 || + '.'[$SPLIT](/()()/)[LENGTH] > 1 || + ''[$SPLIT](/.?/)[LENGTH] + ) { + // based on es5-shim implementation, need to rework it + internalSplit = function (separator, limit) { + var string = String(this); + if (separator === undefined && limit === 0) return []; + // If `separator` is not a regex, use native split + if (!isRegExp(separator)) return $split.call(string, separator, limit); + var output = []; + var flags = (separator.ignoreCase ? 'i' : '') + + (separator.multiline ? 'm' : '') + + (separator.unicode ? 'u' : '') + + (separator.sticky ? 'y' : ''); + var lastLastIndex = 0; + var splitLimit = limit === undefined ? MAX_UINT32 : limit >>> 0; + // Make `global` and avoid `lastIndex` issues by working with a copy + var separatorCopy = new RegExp(separator.source, flags + 'g'); + var match, lastIndex, lastLength; + while (match = regexpExec.call(separatorCopy, string)) { + lastIndex = separatorCopy[LAST_INDEX]; + if (lastIndex > lastLastIndex) { + output.push(string.slice(lastLastIndex, match.index)); + if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1)); + lastLength = match[0][LENGTH]; + lastLastIndex = lastIndex; + if (output[LENGTH] >= splitLimit) break; + } + if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop + } + if (lastLastIndex === string[LENGTH]) { + if (lastLength || !separatorCopy.test('')) output.push(''); + } else output.push(string.slice(lastLastIndex)); + return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output; + }; + // Chakra, V8 + } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) { + internalSplit = function (separator, limit) { + return separator === undefined && limit === 0 ? [] : $split.call(this, separator, limit); + }; + } else { + internalSplit = $split; + } + + return [ + // `String.prototype.split` method + // https://tc39.github.io/ecma262/#sec-string.prototype.split + function split(separator, limit) { + var O = defined(this); + var splitter = separator == undefined ? undefined : separator[SPLIT]; + return splitter !== undefined + ? splitter.call(separator, O, limit) + : internalSplit.call(String(O), separator, limit); + }, + // `RegExp.prototype[@@split]` method + // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split + // + // NOTE: This cannot be properly polyfilled in engines that don't support + // the 'y' flag. + function (regexp, limit) { + var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== $split); + if (res.done) return res.value; + + var rx = anObject(regexp); + var S = String(this); + var C = speciesConstructor(rx, RegExp); + + var unicodeMatching = rx.unicode; + var flags = (rx.ignoreCase ? 'i' : '') + + (rx.multiline ? 'm' : '') + + (rx.unicode ? 'u' : '') + + (SUPPORTS_Y ? 'y' : 'g'); + + // ^(? + rx + ) is needed, in combination with some S slicing, to + // simulate the 'y' flag. + var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags); + var lim = limit === undefined ? MAX_UINT32 : limit >>> 0; + if (lim === 0) return []; + if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : []; + var p = 0; + var q = 0; + var A = []; + while (q < S.length) { + splitter.lastIndex = SUPPORTS_Y ? q : 0; + var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q)); + var e; + if ( + z === null || + (e = $min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p + ) { + q = advanceStringIndex(S, q, unicodeMatching); + } else { + A.push(S.slice(p, q)); + if (A.length === lim) return A; + for (var i = 1; i <= z.length - 1; i++) { + A.push(z[i]); + if (A.length === lim) return A; + } + q = p = e; + } + } + A.push(S.slice(p)); + return A; + } + ]; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.regexp.to-string.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.regexp.to-string.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +__webpack_require__(/*! ./es6.regexp.flags */ "./node_modules/core-js/modules/es6.regexp.flags.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var $flags = __webpack_require__(/*! ./_flags */ "./node_modules/core-js/modules/_flags.js"); +var DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js"); +var TO_STRING = 'toString'; +var $toString = /./[TO_STRING]; + +var define = function (fn) { + __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js")(RegExp.prototype, TO_STRING, fn, true); +}; + +// 21.2.5.14 RegExp.prototype.toString() +if (__webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { return $toString.call({ source: 'a', flags: 'b' }) != '/a/b'; })) { + define(function toString() { + var R = anObject(this); + return '/'.concat(R.source, '/', + 'flags' in R ? R.flags : !DESCRIPTORS && R instanceof RegExp ? $flags.call(R) : undefined); + }); +// FF44- RegExp#toString has a wrong name +} else if ($toString.name != TO_STRING) { + define(function toString() { + return $toString.call(this); + }); +} + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.set.js": +/*!*************************************************!*\ + !*** ./node_modules/core-js/modules/es6.set.js ***! + \*************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var strong = __webpack_require__(/*! ./_collection-strong */ "./node_modules/core-js/modules/_collection-strong.js"); +var validate = __webpack_require__(/*! ./_validate-collection */ "./node_modules/core-js/modules/_validate-collection.js"); +var SET = 'Set'; + +// 23.2 Set Objects +module.exports = __webpack_require__(/*! ./_collection */ "./node_modules/core-js/modules/_collection.js")(SET, function (get) { + return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); }; +}, { + // 23.2.3.1 Set.prototype.add(value) + add: function add(value) { + return strong.def(validate(this, SET), value = value === 0 ? 0 : value, value); + } +}, strong); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.anchor.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.anchor.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.2 String.prototype.anchor(name) +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('anchor', function (createHTML) { + return function anchor(name) { + return createHTML(this, 'a', 'name', name); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.big.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.big.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.3 String.prototype.big() +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('big', function (createHTML) { + return function big() { + return createHTML(this, 'big', '', ''); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.blink.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.blink.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.4 String.prototype.blink() +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('blink', function (createHTML) { + return function blink() { + return createHTML(this, 'blink', '', ''); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.bold.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.bold.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.5 String.prototype.bold() +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('bold', function (createHTML) { + return function bold() { + return createHTML(this, 'b', '', ''); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.code-point-at.js": +/*!******************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.code-point-at.js ***! + \******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $at = __webpack_require__(/*! ./_string-at */ "./node_modules/core-js/modules/_string-at.js")(false); +$export($export.P, 'String', { + // 21.1.3.3 String.prototype.codePointAt(pos) + codePointAt: function codePointAt(pos) { + return $at(this, pos); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.ends-with.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.ends-with.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +// 21.1.3.6 String.prototype.endsWith(searchString [, endPosition]) + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var context = __webpack_require__(/*! ./_string-context */ "./node_modules/core-js/modules/_string-context.js"); +var ENDS_WITH = 'endsWith'; +var $endsWith = ''[ENDS_WITH]; + +$export($export.P + $export.F * __webpack_require__(/*! ./_fails-is-regexp */ "./node_modules/core-js/modules/_fails-is-regexp.js")(ENDS_WITH), 'String', { + endsWith: function endsWith(searchString /* , endPosition = @length */) { + var that = context(this, searchString, ENDS_WITH); + var endPosition = arguments.length > 1 ? arguments[1] : undefined; + var len = toLength(that.length); + var end = endPosition === undefined ? len : Math.min(toLength(endPosition), len); + var search = String(searchString); + return $endsWith + ? $endsWith.call(that, search, end) + : that.slice(end - search.length, end) === search; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.fixed.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.fixed.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.6 String.prototype.fixed() +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('fixed', function (createHTML) { + return function fixed() { + return createHTML(this, 'tt', '', ''); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.fontcolor.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.fontcolor.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.7 String.prototype.fontcolor(color) +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('fontcolor', function (createHTML) { + return function fontcolor(color) { + return createHTML(this, 'font', 'color', color); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.fontsize.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.fontsize.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.8 String.prototype.fontsize(size) +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('fontsize', function (createHTML) { + return function fontsize(size) { + return createHTML(this, 'font', 'size', size); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.from-code-point.js": +/*!********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.from-code-point.js ***! + \********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ "./node_modules/core-js/modules/_to-absolute-index.js"); +var fromCharCode = String.fromCharCode; +var $fromCodePoint = String.fromCodePoint; + +// length should be 1, old FF problem +$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', { + // 21.1.2.2 String.fromCodePoint(...codePoints) + fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars + var res = []; + var aLen = arguments.length; + var i = 0; + var code; + while (aLen > i) { + code = +arguments[i++]; + if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point'); + res.push(code < 0x10000 + ? fromCharCode(code) + : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00) + ); + } return res.join(''); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.includes.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.includes.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +// 21.1.3.7 String.prototype.includes(searchString, position = 0) + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var context = __webpack_require__(/*! ./_string-context */ "./node_modules/core-js/modules/_string-context.js"); +var INCLUDES = 'includes'; + +$export($export.P + $export.F * __webpack_require__(/*! ./_fails-is-regexp */ "./node_modules/core-js/modules/_fails-is-regexp.js")(INCLUDES), 'String', { + includes: function includes(searchString /* , position = 0 */) { + return !!~context(this, searchString, INCLUDES) + .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.italics.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.italics.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.9 String.prototype.italics() +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('italics', function (createHTML) { + return function italics() { + return createHTML(this, 'i', '', ''); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.iterator.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.iterator.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $at = __webpack_require__(/*! ./_string-at */ "./node_modules/core-js/modules/_string-at.js")(true); + +// 21.1.3.27 String.prototype[@@iterator]() +__webpack_require__(/*! ./_iter-define */ "./node_modules/core-js/modules/_iter-define.js")(String, 'String', function (iterated) { + this._t = String(iterated); // target + this._i = 0; // next index +// 21.1.5.2.1 %StringIteratorPrototype%.next() +}, function () { + var O = this._t; + var index = this._i; + var point; + if (index >= O.length) return { value: undefined, done: true }; + point = $at(O, index); + this._i += point.length; + return { value: point, done: false }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.link.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.link.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.10 String.prototype.link(url) +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('link', function (createHTML) { + return function link(url) { + return createHTML(this, 'a', 'href', url); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.raw.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.raw.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/core-js/modules/_to-iobject.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); + +$export($export.S, 'String', { + // 21.1.2.4 String.raw(callSite, ...substitutions) + raw: function raw(callSite) { + var tpl = toIObject(callSite.raw); + var len = toLength(tpl.length); + var aLen = arguments.length; + var res = []; + var i = 0; + while (len > i) { + res.push(String(tpl[i++])); + if (i < aLen) res.push(String(arguments[i])); + } return res.join(''); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.repeat.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.repeat.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.P, 'String', { + // 21.1.3.13 String.prototype.repeat(count) + repeat: __webpack_require__(/*! ./_string-repeat */ "./node_modules/core-js/modules/_string-repeat.js") +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.small.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.small.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.11 String.prototype.small() +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('small', function (createHTML) { + return function small() { + return createHTML(this, 'small', '', ''); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.starts-with.js": +/*!****************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.starts-with.js ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +// 21.1.3.18 String.prototype.startsWith(searchString [, position ]) + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var context = __webpack_require__(/*! ./_string-context */ "./node_modules/core-js/modules/_string-context.js"); +var STARTS_WITH = 'startsWith'; +var $startsWith = ''[STARTS_WITH]; + +$export($export.P + $export.F * __webpack_require__(/*! ./_fails-is-regexp */ "./node_modules/core-js/modules/_fails-is-regexp.js")(STARTS_WITH), 'String', { + startsWith: function startsWith(searchString /* , position = 0 */) { + var that = context(this, searchString, STARTS_WITH); + var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length)); + var search = String(searchString); + return $startsWith + ? $startsWith.call(that, search, index) + : that.slice(index, index + search.length) === search; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.strike.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.strike.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.12 String.prototype.strike() +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('strike', function (createHTML) { + return function strike() { + return createHTML(this, 'strike', '', ''); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.sub.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.sub.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.13 String.prototype.sub() +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('sub', function (createHTML) { + return function sub() { + return createHTML(this, 'sub', '', ''); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.sup.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.sup.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.14 String.prototype.sup() +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('sup', function (createHTML) { + return function sup() { + return createHTML(this, 'sup', '', ''); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.trim.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.trim.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// 21.1.3.25 String.prototype.trim() +__webpack_require__(/*! ./_string-trim */ "./node_modules/core-js/modules/_string-trim.js")('trim', function ($trim) { + return function trim() { + return $trim(this, 3); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.symbol.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/es6.symbol.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// ECMAScript 6 symbols shim +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); +var DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js"); +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var redefine = __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js"); +var META = __webpack_require__(/*! ./_meta */ "./node_modules/core-js/modules/_meta.js").KEY; +var $fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +var shared = __webpack_require__(/*! ./_shared */ "./node_modules/core-js/modules/_shared.js"); +var setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ "./node_modules/core-js/modules/_set-to-string-tag.js"); +var uid = __webpack_require__(/*! ./_uid */ "./node_modules/core-js/modules/_uid.js"); +var wks = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js"); +var wksExt = __webpack_require__(/*! ./_wks-ext */ "./node_modules/core-js/modules/_wks-ext.js"); +var wksDefine = __webpack_require__(/*! ./_wks-define */ "./node_modules/core-js/modules/_wks-define.js"); +var enumKeys = __webpack_require__(/*! ./_enum-keys */ "./node_modules/core-js/modules/_enum-keys.js"); +var isArray = __webpack_require__(/*! ./_is-array */ "./node_modules/core-js/modules/_is-array.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/core-js/modules/_to-iobject.js"); +var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "./node_modules/core-js/modules/_to-primitive.js"); +var createDesc = __webpack_require__(/*! ./_property-desc */ "./node_modules/core-js/modules/_property-desc.js"); +var _create = __webpack_require__(/*! ./_object-create */ "./node_modules/core-js/modules/_object-create.js"); +var gOPNExt = __webpack_require__(/*! ./_object-gopn-ext */ "./node_modules/core-js/modules/_object-gopn-ext.js"); +var $GOPD = __webpack_require__(/*! ./_object-gopd */ "./node_modules/core-js/modules/_object-gopd.js"); +var $GOPS = __webpack_require__(/*! ./_object-gops */ "./node_modules/core-js/modules/_object-gops.js"); +var $DP = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js"); +var $keys = __webpack_require__(/*! ./_object-keys */ "./node_modules/core-js/modules/_object-keys.js"); +var gOPD = $GOPD.f; +var dP = $DP.f; +var gOPN = gOPNExt.f; +var $Symbol = global.Symbol; +var $JSON = global.JSON; +var _stringify = $JSON && $JSON.stringify; +var PROTOTYPE = 'prototype'; +var HIDDEN = wks('_hidden'); +var TO_PRIMITIVE = wks('toPrimitive'); +var isEnum = {}.propertyIsEnumerable; +var SymbolRegistry = shared('symbol-registry'); +var AllSymbols = shared('symbols'); +var OPSymbols = shared('op-symbols'); +var ObjectProto = Object[PROTOTYPE]; +var USE_NATIVE = typeof $Symbol == 'function' && !!$GOPS.f; +var QObject = global.QObject; +// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173 +var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild; + +// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687 +var setSymbolDesc = DESCRIPTORS && $fails(function () { + return _create(dP({}, 'a', { + get: function () { return dP(this, 'a', { value: 7 }).a; } + })).a != 7; +}) ? function (it, key, D) { + var protoDesc = gOPD(ObjectProto, key); + if (protoDesc) delete ObjectProto[key]; + dP(it, key, D); + if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc); +} : dP; + +var wrap = function (tag) { + var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]); + sym._k = tag; + return sym; +}; + +var isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) { + return typeof it == 'symbol'; +} : function (it) { + return it instanceof $Symbol; +}; + +var $defineProperty = function defineProperty(it, key, D) { + if (it === ObjectProto) $defineProperty(OPSymbols, key, D); + anObject(it); + key = toPrimitive(key, true); + anObject(D); + if (has(AllSymbols, key)) { + if (!D.enumerable) { + if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {})); + it[HIDDEN][key] = true; + } else { + if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false; + D = _create(D, { enumerable: createDesc(0, false) }); + } return setSymbolDesc(it, key, D); + } return dP(it, key, D); +}; +var $defineProperties = function defineProperties(it, P) { + anObject(it); + var keys = enumKeys(P = toIObject(P)); + var i = 0; + var l = keys.length; + var key; + while (l > i) $defineProperty(it, key = keys[i++], P[key]); + return it; +}; +var $create = function create(it, P) { + return P === undefined ? _create(it) : $defineProperties(_create(it), P); +}; +var $propertyIsEnumerable = function propertyIsEnumerable(key) { + var E = isEnum.call(this, key = toPrimitive(key, true)); + if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false; + return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true; +}; +var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) { + it = toIObject(it); + key = toPrimitive(key, true); + if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return; + var D = gOPD(it, key); + if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true; + return D; +}; +var $getOwnPropertyNames = function getOwnPropertyNames(it) { + var names = gOPN(toIObject(it)); + var result = []; + var i = 0; + var key; + while (names.length > i) { + if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key); + } return result; +}; +var $getOwnPropertySymbols = function getOwnPropertySymbols(it) { + var IS_OP = it === ObjectProto; + var names = gOPN(IS_OP ? OPSymbols : toIObject(it)); + var result = []; + var i = 0; + var key; + while (names.length > i) { + if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]); + } return result; +}; + +// 19.4.1.1 Symbol([description]) +if (!USE_NATIVE) { + $Symbol = function Symbol() { + if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!'); + var tag = uid(arguments.length > 0 ? arguments[0] : undefined); + var $set = function (value) { + if (this === ObjectProto) $set.call(OPSymbols, value); + if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false; + setSymbolDesc(this, tag, createDesc(1, value)); + }; + if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set }); + return wrap(tag); + }; + redefine($Symbol[PROTOTYPE], 'toString', function toString() { + return this._k; + }); + + $GOPD.f = $getOwnPropertyDescriptor; + $DP.f = $defineProperty; + __webpack_require__(/*! ./_object-gopn */ "./node_modules/core-js/modules/_object-gopn.js").f = gOPNExt.f = $getOwnPropertyNames; + __webpack_require__(/*! ./_object-pie */ "./node_modules/core-js/modules/_object-pie.js").f = $propertyIsEnumerable; + $GOPS.f = $getOwnPropertySymbols; + + if (DESCRIPTORS && !__webpack_require__(/*! ./_library */ "./node_modules/core-js/modules/_library.js")) { + redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true); + } + + wksExt.f = function (name) { + return wrap(wks(name)); + }; +} + +$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol }); + +for (var es6Symbols = ( + // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14 + 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables' +).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]); + +for (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]); + +$export($export.S + $export.F * !USE_NATIVE, 'Symbol', { + // 19.4.2.1 Symbol.for(key) + 'for': function (key) { + return has(SymbolRegistry, key += '') + ? SymbolRegistry[key] + : SymbolRegistry[key] = $Symbol(key); + }, + // 19.4.2.5 Symbol.keyFor(sym) + keyFor: function keyFor(sym) { + if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!'); + for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key; + }, + useSetter: function () { setter = true; }, + useSimple: function () { setter = false; } +}); + +$export($export.S + $export.F * !USE_NATIVE, 'Object', { + // 19.1.2.2 Object.create(O [, Properties]) + create: $create, + // 19.1.2.4 Object.defineProperty(O, P, Attributes) + defineProperty: $defineProperty, + // 19.1.2.3 Object.defineProperties(O, Properties) + defineProperties: $defineProperties, + // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P) + getOwnPropertyDescriptor: $getOwnPropertyDescriptor, + // 19.1.2.7 Object.getOwnPropertyNames(O) + getOwnPropertyNames: $getOwnPropertyNames, + // 19.1.2.8 Object.getOwnPropertySymbols(O) + getOwnPropertySymbols: $getOwnPropertySymbols +}); + +// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives +// https://bugs.chromium.org/p/v8/issues/detail?id=3443 +var FAILS_ON_PRIMITIVES = $fails(function () { $GOPS.f(1); }); + +$export($export.S + $export.F * FAILS_ON_PRIMITIVES, 'Object', { + getOwnPropertySymbols: function getOwnPropertySymbols(it) { + return $GOPS.f(toObject(it)); + } +}); + +// 24.3.2 JSON.stringify(value [, replacer [, space]]) +$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () { + var S = $Symbol(); + // MS Edge converts symbol values to JSON as {} + // WebKit converts symbol values to JSON as null + // V8 throws on boxed symbols + return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}'; +})), 'JSON', { + stringify: function stringify(it) { + var args = [it]; + var i = 1; + var replacer, $replacer; + while (arguments.length > i) args.push(arguments[i++]); + $replacer = replacer = args[1]; + if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined + if (!isArray(replacer)) replacer = function (key, value) { + if (typeof $replacer == 'function') value = $replacer.call(this, key, value); + if (!isSymbol(value)) return value; + }; + args[1] = replacer; + return _stringify.apply($JSON, args); + } +}); + +// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint) +$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(/*! ./_hide */ "./node_modules/core-js/modules/_hide.js")($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf); +// 19.4.3.5 Symbol.prototype[@@toStringTag] +setToStringTag($Symbol, 'Symbol'); +// 20.2.1.9 Math[@@toStringTag] +setToStringTag(Math, 'Math', true); +// 24.3.3 JSON[@@toStringTag] +setToStringTag(global.JSON, 'JSON', true); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.typed.array-buffer.js": +/*!****************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.typed.array-buffer.js ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $typed = __webpack_require__(/*! ./_typed */ "./node_modules/core-js/modules/_typed.js"); +var buffer = __webpack_require__(/*! ./_typed-buffer */ "./node_modules/core-js/modules/_typed-buffer.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ "./node_modules/core-js/modules/_to-absolute-index.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var ArrayBuffer = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js").ArrayBuffer; +var speciesConstructor = __webpack_require__(/*! ./_species-constructor */ "./node_modules/core-js/modules/_species-constructor.js"); +var $ArrayBuffer = buffer.ArrayBuffer; +var $DataView = buffer.DataView; +var $isView = $typed.ABV && ArrayBuffer.isView; +var $slice = $ArrayBuffer.prototype.slice; +var VIEW = $typed.VIEW; +var ARRAY_BUFFER = 'ArrayBuffer'; + +$export($export.G + $export.W + $export.F * (ArrayBuffer !== $ArrayBuffer), { ArrayBuffer: $ArrayBuffer }); + +$export($export.S + $export.F * !$typed.CONSTR, ARRAY_BUFFER, { + // 24.1.3.1 ArrayBuffer.isView(arg) + isView: function isView(it) { + return $isView && $isView(it) || isObject(it) && VIEW in it; + } +}); + +$export($export.P + $export.U + $export.F * __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + return !new $ArrayBuffer(2).slice(1, undefined).byteLength; +}), ARRAY_BUFFER, { + // 24.1.4.3 ArrayBuffer.prototype.slice(start, end) + slice: function slice(start, end) { + if ($slice !== undefined && end === undefined) return $slice.call(anObject(this), start); // FF fix + var len = anObject(this).byteLength; + var first = toAbsoluteIndex(start, len); + var fin = toAbsoluteIndex(end === undefined ? len : end, len); + var result = new (speciesConstructor(this, $ArrayBuffer))(toLength(fin - first)); + var viewS = new $DataView(this); + var viewT = new $DataView(result); + var index = 0; + while (first < fin) { + viewT.setUint8(index++, viewS.getUint8(first++)); + } return result; + } +}); + +__webpack_require__(/*! ./_set-species */ "./node_modules/core-js/modules/_set-species.js")(ARRAY_BUFFER); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.typed.data-view.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.typed.data-view.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +$export($export.G + $export.W + $export.F * !__webpack_require__(/*! ./_typed */ "./node_modules/core-js/modules/_typed.js").ABV, { + DataView: __webpack_require__(/*! ./_typed-buffer */ "./node_modules/core-js/modules/_typed-buffer.js").DataView +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.typed.float32-array.js": +/*!*****************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.typed.float32-array.js ***! + \*****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ./_typed-array */ "./node_modules/core-js/modules/_typed-array.js")('Float32', 4, function (init) { + return function Float32Array(data, byteOffset, length) { + return init(this, data, byteOffset, length); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.typed.float64-array.js": +/*!*****************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.typed.float64-array.js ***! + \*****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ./_typed-array */ "./node_modules/core-js/modules/_typed-array.js")('Float64', 8, function (init) { + return function Float64Array(data, byteOffset, length) { + return init(this, data, byteOffset, length); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.typed.int16-array.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.typed.int16-array.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ./_typed-array */ "./node_modules/core-js/modules/_typed-array.js")('Int16', 2, function (init) { + return function Int16Array(data, byteOffset, length) { + return init(this, data, byteOffset, length); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.typed.int32-array.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.typed.int32-array.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ./_typed-array */ "./node_modules/core-js/modules/_typed-array.js")('Int32', 4, function (init) { + return function Int32Array(data, byteOffset, length) { + return init(this, data, byteOffset, length); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.typed.int8-array.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.typed.int8-array.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ./_typed-array */ "./node_modules/core-js/modules/_typed-array.js")('Int8', 1, function (init) { + return function Int8Array(data, byteOffset, length) { + return init(this, data, byteOffset, length); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.typed.uint16-array.js": +/*!****************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.typed.uint16-array.js ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ./_typed-array */ "./node_modules/core-js/modules/_typed-array.js")('Uint16', 2, function (init) { + return function Uint16Array(data, byteOffset, length) { + return init(this, data, byteOffset, length); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.typed.uint32-array.js": +/*!****************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.typed.uint32-array.js ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ./_typed-array */ "./node_modules/core-js/modules/_typed-array.js")('Uint32', 4, function (init) { + return function Uint32Array(data, byteOffset, length) { + return init(this, data, byteOffset, length); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.typed.uint8-array.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.typed.uint8-array.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ./_typed-array */ "./node_modules/core-js/modules/_typed-array.js")('Uint8', 1, function (init) { + return function Uint8Array(data, byteOffset, length) { + return init(this, data, byteOffset, length); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.typed.uint8-clamped-array.js": +/*!***********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.typed.uint8-clamped-array.js ***! + \***********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ./_typed-array */ "./node_modules/core-js/modules/_typed-array.js")('Uint8', 1, function (init) { + return function Uint8ClampedArray(data, byteOffset, length) { + return init(this, data, byteOffset, length); + }; +}, true); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.weak-map.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.weak-map.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var each = __webpack_require__(/*! ./_array-methods */ "./node_modules/core-js/modules/_array-methods.js")(0); +var redefine = __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js"); +var meta = __webpack_require__(/*! ./_meta */ "./node_modules/core-js/modules/_meta.js"); +var assign = __webpack_require__(/*! ./_object-assign */ "./node_modules/core-js/modules/_object-assign.js"); +var weak = __webpack_require__(/*! ./_collection-weak */ "./node_modules/core-js/modules/_collection-weak.js"); +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var validate = __webpack_require__(/*! ./_validate-collection */ "./node_modules/core-js/modules/_validate-collection.js"); +var NATIVE_WEAK_MAP = __webpack_require__(/*! ./_validate-collection */ "./node_modules/core-js/modules/_validate-collection.js"); +var IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global; +var WEAK_MAP = 'WeakMap'; +var getWeak = meta.getWeak; +var isExtensible = Object.isExtensible; +var uncaughtFrozenStore = weak.ufstore; +var InternalMap; + +var wrapper = function (get) { + return function WeakMap() { + return get(this, arguments.length > 0 ? arguments[0] : undefined); + }; +}; + +var methods = { + // 23.3.3.3 WeakMap.prototype.get(key) + get: function get(key) { + if (isObject(key)) { + var data = getWeak(key); + if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key); + return data ? data[this._i] : undefined; + } + }, + // 23.3.3.5 WeakMap.prototype.set(key, value) + set: function set(key, value) { + return weak.def(validate(this, WEAK_MAP), key, value); + } +}; + +// 23.3 WeakMap Objects +var $WeakMap = module.exports = __webpack_require__(/*! ./_collection */ "./node_modules/core-js/modules/_collection.js")(WEAK_MAP, wrapper, methods, weak, true, true); + +// IE11 WeakMap frozen keys fix +if (NATIVE_WEAK_MAP && IS_IE11) { + InternalMap = weak.getConstructor(wrapper, WEAK_MAP); + assign(InternalMap.prototype, methods); + meta.NEED = true; + each(['delete', 'has', 'get', 'set'], function (key) { + var proto = $WeakMap.prototype; + var method = proto[key]; + redefine(proto, key, function (a, b) { + // store frozen objects on internal weakmap shim + if (isObject(a) && !isExtensible(a)) { + if (!this._f) this._f = new InternalMap(); + var result = this._f[key](a, b); + return key == 'set' ? this : result; + // store all the rest on native weakmap + } return method.call(this, a, b); + }); + }); +} + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.weak-set.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.weak-set.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var weak = __webpack_require__(/*! ./_collection-weak */ "./node_modules/core-js/modules/_collection-weak.js"); +var validate = __webpack_require__(/*! ./_validate-collection */ "./node_modules/core-js/modules/_validate-collection.js"); +var WEAK_SET = 'WeakSet'; + +// 23.4 WeakSet Objects +__webpack_require__(/*! ./_collection */ "./node_modules/core-js/modules/_collection.js")(WEAK_SET, function (get) { + return function WeakSet() { return get(this, arguments.length > 0 ? arguments[0] : undefined); }; +}, { + // 23.4.3.1 WeakSet.prototype.add(value) + add: function add(value) { + return weak.def(validate(this, WEAK_SET), value, true); + } +}, weak, false, true); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.array.flat-map.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/es7.array.flat-map.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// https://tc39.github.io/proposal-flatMap/#sec-Array.prototype.flatMap +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var flattenIntoArray = __webpack_require__(/*! ./_flatten-into-array */ "./node_modules/core-js/modules/_flatten-into-array.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var aFunction = __webpack_require__(/*! ./_a-function */ "./node_modules/core-js/modules/_a-function.js"); +var arraySpeciesCreate = __webpack_require__(/*! ./_array-species-create */ "./node_modules/core-js/modules/_array-species-create.js"); + +$export($export.P, 'Array', { + flatMap: function flatMap(callbackfn /* , thisArg */) { + var O = toObject(this); + var sourceLen, A; + aFunction(callbackfn); + sourceLen = toLength(O.length); + A = arraySpeciesCreate(O, 0); + flattenIntoArray(A, O, O, sourceLen, 0, 1, callbackfn, arguments[1]); + return A; + } +}); + +__webpack_require__(/*! ./_add-to-unscopables */ "./node_modules/core-js/modules/_add-to-unscopables.js")('flatMap'); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.array.flatten.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es7.array.flatten.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// https://tc39.github.io/proposal-flatMap/#sec-Array.prototype.flatten +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var flattenIntoArray = __webpack_require__(/*! ./_flatten-into-array */ "./node_modules/core-js/modules/_flatten-into-array.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var toInteger = __webpack_require__(/*! ./_to-integer */ "./node_modules/core-js/modules/_to-integer.js"); +var arraySpeciesCreate = __webpack_require__(/*! ./_array-species-create */ "./node_modules/core-js/modules/_array-species-create.js"); + +$export($export.P, 'Array', { + flatten: function flatten(/* depthArg = 1 */) { + var depthArg = arguments[0]; + var O = toObject(this); + var sourceLen = toLength(O.length); + var A = arraySpeciesCreate(O, 0); + flattenIntoArray(A, O, O, sourceLen, 0, depthArg === undefined ? 1 : toInteger(depthArg)); + return A; + } +}); + +__webpack_require__(/*! ./_add-to-unscopables */ "./node_modules/core-js/modules/_add-to-unscopables.js")('flatten'); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.array.includes.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/es7.array.includes.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// https://github.com/tc39/Array.prototype.includes +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $includes = __webpack_require__(/*! ./_array-includes */ "./node_modules/core-js/modules/_array-includes.js")(true); + +$export($export.P, 'Array', { + includes: function includes(el /* , fromIndex = 0 */) { + return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined); + } +}); + +__webpack_require__(/*! ./_add-to-unscopables */ "./node_modules/core-js/modules/_add-to-unscopables.js")('includes'); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.asap.js": +/*!**************************************************!*\ + !*** ./node_modules/core-js/modules/es7.asap.js ***! + \**************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// https://github.com/rwaldron/tc39-notes/blob/master/es6/2014-09/sept-25.md#510-globalasap-for-enqueuing-a-microtask +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var microtask = __webpack_require__(/*! ./_microtask */ "./node_modules/core-js/modules/_microtask.js")(); +var process = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js").process; +var isNode = __webpack_require__(/*! ./_cof */ "./node_modules/core-js/modules/_cof.js")(process) == 'process'; + +$export($export.G, { + asap: function asap(fn) { + var domain = isNode && process.domain; + microtask(domain ? domain.bind(fn) : fn); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.error.is-error.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/es7.error.is-error.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// https://github.com/ljharb/proposal-is-error +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var cof = __webpack_require__(/*! ./_cof */ "./node_modules/core-js/modules/_cof.js"); + +$export($export.S, 'Error', { + isError: function isError(it) { + return cof(it) === 'Error'; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.global.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/es7.global.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// https://github.com/tc39/proposal-global +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.G, { global: __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js") }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.map.from.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/es7.map.from.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// https://tc39.github.io/proposal-setmap-offrom/#sec-map.from +__webpack_require__(/*! ./_set-collection-from */ "./node_modules/core-js/modules/_set-collection-from.js")('Map'); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.map.of.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/es7.map.of.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// https://tc39.github.io/proposal-setmap-offrom/#sec-map.of +__webpack_require__(/*! ./_set-collection-of */ "./node_modules/core-js/modules/_set-collection-of.js")('Map'); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.map.to-json.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es7.map.to-json.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// https://github.com/DavidBruant/Map-Set.prototype.toJSON +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.P + $export.R, 'Map', { toJSON: __webpack_require__(/*! ./_collection-to-json */ "./node_modules/core-js/modules/_collection-to-json.js")('Map') }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.math.clamp.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es7.math.clamp.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// https://rwaldron.github.io/proposal-math-extensions/ +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Math', { + clamp: function clamp(x, lower, upper) { + return Math.min(upper, Math.max(lower, x)); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.math.deg-per-rad.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es7.math.deg-per-rad.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// https://rwaldron.github.io/proposal-math-extensions/ +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Math', { DEG_PER_RAD: Math.PI / 180 }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.math.degrees.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/es7.math.degrees.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// https://rwaldron.github.io/proposal-math-extensions/ +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var RAD_PER_DEG = 180 / Math.PI; + +$export($export.S, 'Math', { + degrees: function degrees(radians) { + return radians * RAD_PER_DEG; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.math.fscale.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es7.math.fscale.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// https://rwaldron.github.io/proposal-math-extensions/ +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var scale = __webpack_require__(/*! ./_math-scale */ "./node_modules/core-js/modules/_math-scale.js"); +var fround = __webpack_require__(/*! ./_math-fround */ "./node_modules/core-js/modules/_math-fround.js"); + +$export($export.S, 'Math', { + fscale: function fscale(x, inLow, inHigh, outLow, outHigh) { + return fround(scale(x, inLow, inHigh, outLow, outHigh)); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.math.iaddh.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es7.math.iaddh.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// https://gist.github.com/BrendanEich/4294d5c212a6d2254703 +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Math', { + iaddh: function iaddh(x0, x1, y0, y1) { + var $x0 = x0 >>> 0; + var $x1 = x1 >>> 0; + var $y0 = y0 >>> 0; + return $x1 + (y1 >>> 0) + (($x0 & $y0 | ($x0 | $y0) & ~($x0 + $y0 >>> 0)) >>> 31) | 0; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.math.imulh.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es7.math.imulh.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// https://gist.github.com/BrendanEich/4294d5c212a6d2254703 +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Math', { + imulh: function imulh(u, v) { + var UINT16 = 0xffff; + var $u = +u; + var $v = +v; + var u0 = $u & UINT16; + var v0 = $v & UINT16; + var u1 = $u >> 16; + var v1 = $v >> 16; + var t = (u1 * v0 >>> 0) + (u0 * v0 >>> 16); + return u1 * v1 + (t >> 16) + ((u0 * v1 >>> 0) + (t & UINT16) >> 16); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.math.isubh.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es7.math.isubh.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// https://gist.github.com/BrendanEich/4294d5c212a6d2254703 +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Math', { + isubh: function isubh(x0, x1, y0, y1) { + var $x0 = x0 >>> 0; + var $x1 = x1 >>> 0; + var $y0 = y0 >>> 0; + return $x1 - (y1 >>> 0) - ((~$x0 & $y0 | ~($x0 ^ $y0) & $x0 - $y0 >>> 0) >>> 31) | 0; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.math.rad-per-deg.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es7.math.rad-per-deg.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// https://rwaldron.github.io/proposal-math-extensions/ +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Math', { RAD_PER_DEG: 180 / Math.PI }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.math.radians.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/es7.math.radians.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// https://rwaldron.github.io/proposal-math-extensions/ +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var DEG_PER_RAD = Math.PI / 180; + +$export($export.S, 'Math', { + radians: function radians(degrees) { + return degrees * DEG_PER_RAD; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.math.scale.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es7.math.scale.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// https://rwaldron.github.io/proposal-math-extensions/ +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Math', { scale: __webpack_require__(/*! ./_math-scale */ "./node_modules/core-js/modules/_math-scale.js") }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.math.signbit.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/es7.math.signbit.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// http://jfbastien.github.io/papers/Math.signbit.html +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Math', { signbit: function signbit(x) { + // eslint-disable-next-line no-self-compare + return (x = +x) != x ? x : x == 0 ? 1 / x == Infinity : x > 0; +} }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.math.umulh.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es7.math.umulh.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// https://gist.github.com/BrendanEich/4294d5c212a6d2254703 +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Math', { + umulh: function umulh(u, v) { + var UINT16 = 0xffff; + var $u = +u; + var $v = +v; + var u0 = $u & UINT16; + var v0 = $v & UINT16; + var u1 = $u >>> 16; + var v1 = $v >>> 16; + var t = (u1 * v0 >>> 0) + (u0 * v0 >>> 16); + return u1 * v1 + (t >>> 16) + ((u0 * v1 >>> 0) + (t & UINT16) >>> 16); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.object.define-getter.js": +/*!******************************************************************!*\ + !*** ./node_modules/core-js/modules/es7.object.define-getter.js ***! + \******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var aFunction = __webpack_require__(/*! ./_a-function */ "./node_modules/core-js/modules/_a-function.js"); +var $defineProperty = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js"); + +// B.2.2.2 Object.prototype.__defineGetter__(P, getter) +__webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js") && $export($export.P + __webpack_require__(/*! ./_object-forced-pam */ "./node_modules/core-js/modules/_object-forced-pam.js"), 'Object', { + __defineGetter__: function __defineGetter__(P, getter) { + $defineProperty.f(toObject(this), P, { get: aFunction(getter), enumerable: true, configurable: true }); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.object.define-setter.js": +/*!******************************************************************!*\ + !*** ./node_modules/core-js/modules/es7.object.define-setter.js ***! + \******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var aFunction = __webpack_require__(/*! ./_a-function */ "./node_modules/core-js/modules/_a-function.js"); +var $defineProperty = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js"); + +// B.2.2.3 Object.prototype.__defineSetter__(P, setter) +__webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js") && $export($export.P + __webpack_require__(/*! ./_object-forced-pam */ "./node_modules/core-js/modules/_object-forced-pam.js"), 'Object', { + __defineSetter__: function __defineSetter__(P, setter) { + $defineProperty.f(toObject(this), P, { set: aFunction(setter), enumerable: true, configurable: true }); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.object.entries.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/es7.object.entries.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// https://github.com/tc39/proposal-object-values-entries +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $entries = __webpack_require__(/*! ./_object-to-array */ "./node_modules/core-js/modules/_object-to-array.js")(true); + +$export($export.S, 'Object', { + entries: function entries(it) { + return $entries(it); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.object.get-own-property-descriptors.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/core-js/modules/es7.object.get-own-property-descriptors.js ***! + \*********************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// https://github.com/tc39/proposal-object-getownpropertydescriptors +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var ownKeys = __webpack_require__(/*! ./_own-keys */ "./node_modules/core-js/modules/_own-keys.js"); +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/core-js/modules/_to-iobject.js"); +var gOPD = __webpack_require__(/*! ./_object-gopd */ "./node_modules/core-js/modules/_object-gopd.js"); +var createProperty = __webpack_require__(/*! ./_create-property */ "./node_modules/core-js/modules/_create-property.js"); + +$export($export.S, 'Object', { + getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) { + var O = toIObject(object); + var getDesc = gOPD.f; + var keys = ownKeys(O); + var result = {}; + var i = 0; + var key, desc; + while (keys.length > i) { + desc = getDesc(O, key = keys[i++]); + if (desc !== undefined) createProperty(result, key, desc); + } + return result; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.object.lookup-getter.js": +/*!******************************************************************!*\ + !*** ./node_modules/core-js/modules/es7.object.lookup-getter.js ***! + \******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "./node_modules/core-js/modules/_to-primitive.js"); +var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "./node_modules/core-js/modules/_object-gpo.js"); +var getOwnPropertyDescriptor = __webpack_require__(/*! ./_object-gopd */ "./node_modules/core-js/modules/_object-gopd.js").f; + +// B.2.2.4 Object.prototype.__lookupGetter__(P) +__webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js") && $export($export.P + __webpack_require__(/*! ./_object-forced-pam */ "./node_modules/core-js/modules/_object-forced-pam.js"), 'Object', { + __lookupGetter__: function __lookupGetter__(P) { + var O = toObject(this); + var K = toPrimitive(P, true); + var D; + do { + if (D = getOwnPropertyDescriptor(O, K)) return D.get; + } while (O = getPrototypeOf(O)); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.object.lookup-setter.js": +/*!******************************************************************!*\ + !*** ./node_modules/core-js/modules/es7.object.lookup-setter.js ***! + \******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "./node_modules/core-js/modules/_to-primitive.js"); +var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "./node_modules/core-js/modules/_object-gpo.js"); +var getOwnPropertyDescriptor = __webpack_require__(/*! ./_object-gopd */ "./node_modules/core-js/modules/_object-gopd.js").f; + +// B.2.2.5 Object.prototype.__lookupSetter__(P) +__webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js") && $export($export.P + __webpack_require__(/*! ./_object-forced-pam */ "./node_modules/core-js/modules/_object-forced-pam.js"), 'Object', { + __lookupSetter__: function __lookupSetter__(P) { + var O = toObject(this); + var K = toPrimitive(P, true); + var D; + do { + if (D = getOwnPropertyDescriptor(O, K)) return D.set; + } while (O = getPrototypeOf(O)); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.object.values.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es7.object.values.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// https://github.com/tc39/proposal-object-values-entries +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $values = __webpack_require__(/*! ./_object-to-array */ "./node_modules/core-js/modules/_object-to-array.js")(false); + +$export($export.S, 'Object', { + values: function values(it) { + return $values(it); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.observable.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es7.observable.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// https://github.com/zenparsing/es-observable +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var core = __webpack_require__(/*! ./_core */ "./node_modules/core-js/modules/_core.js"); +var microtask = __webpack_require__(/*! ./_microtask */ "./node_modules/core-js/modules/_microtask.js")(); +var OBSERVABLE = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('observable'); +var aFunction = __webpack_require__(/*! ./_a-function */ "./node_modules/core-js/modules/_a-function.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var anInstance = __webpack_require__(/*! ./_an-instance */ "./node_modules/core-js/modules/_an-instance.js"); +var redefineAll = __webpack_require__(/*! ./_redefine-all */ "./node_modules/core-js/modules/_redefine-all.js"); +var hide = __webpack_require__(/*! ./_hide */ "./node_modules/core-js/modules/_hide.js"); +var forOf = __webpack_require__(/*! ./_for-of */ "./node_modules/core-js/modules/_for-of.js"); +var RETURN = forOf.RETURN; + +var getMethod = function (fn) { + return fn == null ? undefined : aFunction(fn); +}; + +var cleanupSubscription = function (subscription) { + var cleanup = subscription._c; + if (cleanup) { + subscription._c = undefined; + cleanup(); + } +}; + +var subscriptionClosed = function (subscription) { + return subscription._o === undefined; +}; + +var closeSubscription = function (subscription) { + if (!subscriptionClosed(subscription)) { + subscription._o = undefined; + cleanupSubscription(subscription); + } +}; + +var Subscription = function (observer, subscriber) { + anObject(observer); + this._c = undefined; + this._o = observer; + observer = new SubscriptionObserver(this); + try { + var cleanup = subscriber(observer); + var subscription = cleanup; + if (cleanup != null) { + if (typeof cleanup.unsubscribe === 'function') cleanup = function () { subscription.unsubscribe(); }; + else aFunction(cleanup); + this._c = cleanup; + } + } catch (e) { + observer.error(e); + return; + } if (subscriptionClosed(this)) cleanupSubscription(this); +}; + +Subscription.prototype = redefineAll({}, { + unsubscribe: function unsubscribe() { closeSubscription(this); } +}); + +var SubscriptionObserver = function (subscription) { + this._s = subscription; +}; + +SubscriptionObserver.prototype = redefineAll({}, { + next: function next(value) { + var subscription = this._s; + if (!subscriptionClosed(subscription)) { + var observer = subscription._o; + try { + var m = getMethod(observer.next); + if (m) return m.call(observer, value); + } catch (e) { + try { + closeSubscription(subscription); + } finally { + throw e; + } + } + } + }, + error: function error(value) { + var subscription = this._s; + if (subscriptionClosed(subscription)) throw value; + var observer = subscription._o; + subscription._o = undefined; + try { + var m = getMethod(observer.error); + if (!m) throw value; + value = m.call(observer, value); + } catch (e) { + try { + cleanupSubscription(subscription); + } finally { + throw e; + } + } cleanupSubscription(subscription); + return value; + }, + complete: function complete(value) { + var subscription = this._s; + if (!subscriptionClosed(subscription)) { + var observer = subscription._o; + subscription._o = undefined; + try { + var m = getMethod(observer.complete); + value = m ? m.call(observer, value) : undefined; + } catch (e) { + try { + cleanupSubscription(subscription); + } finally { + throw e; + } + } cleanupSubscription(subscription); + return value; + } + } +}); + +var $Observable = function Observable(subscriber) { + anInstance(this, $Observable, 'Observable', '_f')._f = aFunction(subscriber); +}; + +redefineAll($Observable.prototype, { + subscribe: function subscribe(observer) { + return new Subscription(observer, this._f); + }, + forEach: function forEach(fn) { + var that = this; + return new (core.Promise || global.Promise)(function (resolve, reject) { + aFunction(fn); + var subscription = that.subscribe({ + next: function (value) { + try { + return fn(value); + } catch (e) { + reject(e); + subscription.unsubscribe(); + } + }, + error: reject, + complete: resolve + }); + }); + } +}); + +redefineAll($Observable, { + from: function from(x) { + var C = typeof this === 'function' ? this : $Observable; + var method = getMethod(anObject(x)[OBSERVABLE]); + if (method) { + var observable = anObject(method.call(x)); + return observable.constructor === C ? observable : new C(function (observer) { + return observable.subscribe(observer); + }); + } + return new C(function (observer) { + var done = false; + microtask(function () { + if (!done) { + try { + if (forOf(x, false, function (it) { + observer.next(it); + if (done) return RETURN; + }) === RETURN) return; + } catch (e) { + if (done) throw e; + observer.error(e); + return; + } observer.complete(); + } + }); + return function () { done = true; }; + }); + }, + of: function of() { + for (var i = 0, l = arguments.length, items = new Array(l); i < l;) items[i] = arguments[i++]; + return new (typeof this === 'function' ? this : $Observable)(function (observer) { + var done = false; + microtask(function () { + if (!done) { + for (var j = 0; j < items.length; ++j) { + observer.next(items[j]); + if (done) return; + } observer.complete(); + } + }); + return function () { done = true; }; + }); + } +}); + +hide($Observable.prototype, OBSERVABLE, function () { return this; }); + +$export($export.G, { Observable: $Observable }); + +__webpack_require__(/*! ./_set-species */ "./node_modules/core-js/modules/_set-species.js")('Observable'); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.promise.finally.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/modules/es7.promise.finally.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +// https://github.com/tc39/proposal-promise-finally + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var core = __webpack_require__(/*! ./_core */ "./node_modules/core-js/modules/_core.js"); +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var speciesConstructor = __webpack_require__(/*! ./_species-constructor */ "./node_modules/core-js/modules/_species-constructor.js"); +var promiseResolve = __webpack_require__(/*! ./_promise-resolve */ "./node_modules/core-js/modules/_promise-resolve.js"); + +$export($export.P + $export.R, 'Promise', { 'finally': function (onFinally) { + var C = speciesConstructor(this, core.Promise || global.Promise); + var isFunction = typeof onFinally == 'function'; + return this.then( + isFunction ? function (x) { + return promiseResolve(C, onFinally()).then(function () { return x; }); + } : onFinally, + isFunction ? function (e) { + return promiseResolve(C, onFinally()).then(function () { throw e; }); + } : onFinally + ); +} }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.promise.try.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es7.promise.try.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// https://github.com/tc39/proposal-promise-try +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var newPromiseCapability = __webpack_require__(/*! ./_new-promise-capability */ "./node_modules/core-js/modules/_new-promise-capability.js"); +var perform = __webpack_require__(/*! ./_perform */ "./node_modules/core-js/modules/_perform.js"); + +$export($export.S, 'Promise', { 'try': function (callbackfn) { + var promiseCapability = newPromiseCapability.f(this); + var result = perform(callbackfn); + (result.e ? promiseCapability.reject : promiseCapability.resolve)(result.v); + return promiseCapability.promise; +} }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.reflect.define-metadata.js": +/*!*********************************************************************!*\ + !*** ./node_modules/core-js/modules/es7.reflect.define-metadata.js ***! + \*********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var metadata = __webpack_require__(/*! ./_metadata */ "./node_modules/core-js/modules/_metadata.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var toMetaKey = metadata.key; +var ordinaryDefineOwnMetadata = metadata.set; + +metadata.exp({ defineMetadata: function defineMetadata(metadataKey, metadataValue, target, targetKey) { + ordinaryDefineOwnMetadata(metadataKey, metadataValue, anObject(target), toMetaKey(targetKey)); +} }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.reflect.delete-metadata.js": +/*!*********************************************************************!*\ + !*** ./node_modules/core-js/modules/es7.reflect.delete-metadata.js ***! + \*********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var metadata = __webpack_require__(/*! ./_metadata */ "./node_modules/core-js/modules/_metadata.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var toMetaKey = metadata.key; +var getOrCreateMetadataMap = metadata.map; +var store = metadata.store; + +metadata.exp({ deleteMetadata: function deleteMetadata(metadataKey, target /* , targetKey */) { + var targetKey = arguments.length < 3 ? undefined : toMetaKey(arguments[2]); + var metadataMap = getOrCreateMetadataMap(anObject(target), targetKey, false); + if (metadataMap === undefined || !metadataMap['delete'](metadataKey)) return false; + if (metadataMap.size) return true; + var targetMetadata = store.get(target); + targetMetadata['delete'](targetKey); + return !!targetMetadata.size || store['delete'](target); +} }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.reflect.get-metadata-keys.js": +/*!***********************************************************************!*\ + !*** ./node_modules/core-js/modules/es7.reflect.get-metadata-keys.js ***! + \***********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var Set = __webpack_require__(/*! ./es6.set */ "./node_modules/core-js/modules/es6.set.js"); +var from = __webpack_require__(/*! ./_array-from-iterable */ "./node_modules/core-js/modules/_array-from-iterable.js"); +var metadata = __webpack_require__(/*! ./_metadata */ "./node_modules/core-js/modules/_metadata.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "./node_modules/core-js/modules/_object-gpo.js"); +var ordinaryOwnMetadataKeys = metadata.keys; +var toMetaKey = metadata.key; + +var ordinaryMetadataKeys = function (O, P) { + var oKeys = ordinaryOwnMetadataKeys(O, P); + var parent = getPrototypeOf(O); + if (parent === null) return oKeys; + var pKeys = ordinaryMetadataKeys(parent, P); + return pKeys.length ? oKeys.length ? from(new Set(oKeys.concat(pKeys))) : pKeys : oKeys; +}; + +metadata.exp({ getMetadataKeys: function getMetadataKeys(target /* , targetKey */) { + return ordinaryMetadataKeys(anObject(target), arguments.length < 2 ? undefined : toMetaKey(arguments[1])); +} }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.reflect.get-metadata.js": +/*!******************************************************************!*\ + !*** ./node_modules/core-js/modules/es7.reflect.get-metadata.js ***! + \******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var metadata = __webpack_require__(/*! ./_metadata */ "./node_modules/core-js/modules/_metadata.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "./node_modules/core-js/modules/_object-gpo.js"); +var ordinaryHasOwnMetadata = metadata.has; +var ordinaryGetOwnMetadata = metadata.get; +var toMetaKey = metadata.key; + +var ordinaryGetMetadata = function (MetadataKey, O, P) { + var hasOwn = ordinaryHasOwnMetadata(MetadataKey, O, P); + if (hasOwn) return ordinaryGetOwnMetadata(MetadataKey, O, P); + var parent = getPrototypeOf(O); + return parent !== null ? ordinaryGetMetadata(MetadataKey, parent, P) : undefined; +}; + +metadata.exp({ getMetadata: function getMetadata(metadataKey, target /* , targetKey */) { + return ordinaryGetMetadata(metadataKey, anObject(target), arguments.length < 3 ? undefined : toMetaKey(arguments[2])); +} }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.reflect.get-own-metadata-keys.js": +/*!***************************************************************************!*\ + !*** ./node_modules/core-js/modules/es7.reflect.get-own-metadata-keys.js ***! + \***************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var metadata = __webpack_require__(/*! ./_metadata */ "./node_modules/core-js/modules/_metadata.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var ordinaryOwnMetadataKeys = metadata.keys; +var toMetaKey = metadata.key; + +metadata.exp({ getOwnMetadataKeys: function getOwnMetadataKeys(target /* , targetKey */) { + return ordinaryOwnMetadataKeys(anObject(target), arguments.length < 2 ? undefined : toMetaKey(arguments[1])); +} }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.reflect.get-own-metadata.js": +/*!**********************************************************************!*\ + !*** ./node_modules/core-js/modules/es7.reflect.get-own-metadata.js ***! + \**********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var metadata = __webpack_require__(/*! ./_metadata */ "./node_modules/core-js/modules/_metadata.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var ordinaryGetOwnMetadata = metadata.get; +var toMetaKey = metadata.key; + +metadata.exp({ getOwnMetadata: function getOwnMetadata(metadataKey, target /* , targetKey */) { + return ordinaryGetOwnMetadata(metadataKey, anObject(target) + , arguments.length < 3 ? undefined : toMetaKey(arguments[2])); +} }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.reflect.has-metadata.js": +/*!******************************************************************!*\ + !*** ./node_modules/core-js/modules/es7.reflect.has-metadata.js ***! + \******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var metadata = __webpack_require__(/*! ./_metadata */ "./node_modules/core-js/modules/_metadata.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "./node_modules/core-js/modules/_object-gpo.js"); +var ordinaryHasOwnMetadata = metadata.has; +var toMetaKey = metadata.key; + +var ordinaryHasMetadata = function (MetadataKey, O, P) { + var hasOwn = ordinaryHasOwnMetadata(MetadataKey, O, P); + if (hasOwn) return true; + var parent = getPrototypeOf(O); + return parent !== null ? ordinaryHasMetadata(MetadataKey, parent, P) : false; +}; + +metadata.exp({ hasMetadata: function hasMetadata(metadataKey, target /* , targetKey */) { + return ordinaryHasMetadata(metadataKey, anObject(target), arguments.length < 3 ? undefined : toMetaKey(arguments[2])); +} }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.reflect.has-own-metadata.js": +/*!**********************************************************************!*\ + !*** ./node_modules/core-js/modules/es7.reflect.has-own-metadata.js ***! + \**********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var metadata = __webpack_require__(/*! ./_metadata */ "./node_modules/core-js/modules/_metadata.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var ordinaryHasOwnMetadata = metadata.has; +var toMetaKey = metadata.key; + +metadata.exp({ hasOwnMetadata: function hasOwnMetadata(metadataKey, target /* , targetKey */) { + return ordinaryHasOwnMetadata(metadataKey, anObject(target) + , arguments.length < 3 ? undefined : toMetaKey(arguments[2])); +} }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.reflect.metadata.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es7.reflect.metadata.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $metadata = __webpack_require__(/*! ./_metadata */ "./node_modules/core-js/modules/_metadata.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var aFunction = __webpack_require__(/*! ./_a-function */ "./node_modules/core-js/modules/_a-function.js"); +var toMetaKey = $metadata.key; +var ordinaryDefineOwnMetadata = $metadata.set; + +$metadata.exp({ metadata: function metadata(metadataKey, metadataValue) { + return function decorator(target, targetKey) { + ordinaryDefineOwnMetadata( + metadataKey, metadataValue, + (targetKey !== undefined ? anObject : aFunction)(target), + toMetaKey(targetKey) + ); + }; +} }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.set.from.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/es7.set.from.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// https://tc39.github.io/proposal-setmap-offrom/#sec-set.from +__webpack_require__(/*! ./_set-collection-from */ "./node_modules/core-js/modules/_set-collection-from.js")('Set'); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.set.of.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/es7.set.of.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// https://tc39.github.io/proposal-setmap-offrom/#sec-set.of +__webpack_require__(/*! ./_set-collection-of */ "./node_modules/core-js/modules/_set-collection-of.js")('Set'); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.set.to-json.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es7.set.to-json.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// https://github.com/DavidBruant/Map-Set.prototype.toJSON +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.P + $export.R, 'Set', { toJSON: __webpack_require__(/*! ./_collection-to-json */ "./node_modules/core-js/modules/_collection-to-json.js")('Set') }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.string.at.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/es7.string.at.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// https://github.com/mathiasbynens/String.prototype.at +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $at = __webpack_require__(/*! ./_string-at */ "./node_modules/core-js/modules/_string-at.js")(true); + +$export($export.P, 'String', { + at: function at(pos) { + return $at(this, pos); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.string.match-all.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es7.string.match-all.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// https://tc39.github.io/String.prototype.matchAll/ +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var defined = __webpack_require__(/*! ./_defined */ "./node_modules/core-js/modules/_defined.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var isRegExp = __webpack_require__(/*! ./_is-regexp */ "./node_modules/core-js/modules/_is-regexp.js"); +var getFlags = __webpack_require__(/*! ./_flags */ "./node_modules/core-js/modules/_flags.js"); +var RegExpProto = RegExp.prototype; + +var $RegExpStringIterator = function (regexp, string) { + this._r = regexp; + this._s = string; +}; + +__webpack_require__(/*! ./_iter-create */ "./node_modules/core-js/modules/_iter-create.js")($RegExpStringIterator, 'RegExp String', function next() { + var match = this._r.exec(this._s); + return { value: match, done: match === null }; +}); + +$export($export.P, 'String', { + matchAll: function matchAll(regexp) { + defined(this); + if (!isRegExp(regexp)) throw TypeError(regexp + ' is not a regexp!'); + var S = String(this); + var flags = 'flags' in RegExpProto ? String(regexp.flags) : getFlags.call(regexp); + var rx = new RegExp(regexp.source, ~flags.indexOf('g') ? flags : 'g' + flags); + rx.lastIndex = toLength(regexp.lastIndex); + return new $RegExpStringIterator(rx, S); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.string.pad-end.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/es7.string.pad-end.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// https://github.com/tc39/proposal-string-pad-start-end +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $pad = __webpack_require__(/*! ./_string-pad */ "./node_modules/core-js/modules/_string-pad.js"); +var userAgent = __webpack_require__(/*! ./_user-agent */ "./node_modules/core-js/modules/_user-agent.js"); + +// https://github.com/zloirock/core-js/issues/280 +var WEBKIT_BUG = /Version\/10\.\d+(\.\d+)?( Mobile\/\w+)? Safari\//.test(userAgent); + +$export($export.P + $export.F * WEBKIT_BUG, 'String', { + padEnd: function padEnd(maxLength /* , fillString = ' ' */) { + return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.string.pad-start.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es7.string.pad-start.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// https://github.com/tc39/proposal-string-pad-start-end +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $pad = __webpack_require__(/*! ./_string-pad */ "./node_modules/core-js/modules/_string-pad.js"); +var userAgent = __webpack_require__(/*! ./_user-agent */ "./node_modules/core-js/modules/_user-agent.js"); + +// https://github.com/zloirock/core-js/issues/280 +var WEBKIT_BUG = /Version\/10\.\d+(\.\d+)?( Mobile\/\w+)? Safari\//.test(userAgent); + +$export($export.P + $export.F * WEBKIT_BUG, 'String', { + padStart: function padStart(maxLength /* , fillString = ' ' */) { + return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.string.trim-left.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es7.string.trim-left.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// https://github.com/sebmarkbage/ecmascript-string-left-right-trim +__webpack_require__(/*! ./_string-trim */ "./node_modules/core-js/modules/_string-trim.js")('trimLeft', function ($trim) { + return function trimLeft() { + return $trim(this, 1); + }; +}, 'trimStart'); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.string.trim-right.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/modules/es7.string.trim-right.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// https://github.com/sebmarkbage/ecmascript-string-left-right-trim +__webpack_require__(/*! ./_string-trim */ "./node_modules/core-js/modules/_string-trim.js")('trimRight', function ($trim) { + return function trimRight() { + return $trim(this, 2); + }; +}, 'trimEnd'); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.symbol.async-iterator.js": +/*!*******************************************************************!*\ + !*** ./node_modules/core-js/modules/es7.symbol.async-iterator.js ***! + \*******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ./_wks-define */ "./node_modules/core-js/modules/_wks-define.js")('asyncIterator'); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.symbol.observable.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/modules/es7.symbol.observable.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ./_wks-define */ "./node_modules/core-js/modules/_wks-define.js")('observable'); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.system.global.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es7.system.global.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// https://github.com/tc39/proposal-global +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'System', { global: __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js") }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.weak-map.from.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es7.weak-map.from.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.from +__webpack_require__(/*! ./_set-collection-from */ "./node_modules/core-js/modules/_set-collection-from.js")('WeakMap'); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.weak-map.of.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es7.weak-map.of.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.of +__webpack_require__(/*! ./_set-collection-of */ "./node_modules/core-js/modules/_set-collection-of.js")('WeakMap'); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.weak-set.from.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es7.weak-set.from.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// https://tc39.github.io/proposal-setmap-offrom/#sec-weakset.from +__webpack_require__(/*! ./_set-collection-from */ "./node_modules/core-js/modules/_set-collection-from.js")('WeakSet'); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es7.weak-set.of.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es7.weak-set.of.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// https://tc39.github.io/proposal-setmap-offrom/#sec-weakset.of +__webpack_require__(/*! ./_set-collection-of */ "./node_modules/core-js/modules/_set-collection-of.js")('WeakSet'); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/web.dom.iterable.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/web.dom.iterable.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $iterators = __webpack_require__(/*! ./es6.array.iterator */ "./node_modules/core-js/modules/es6.array.iterator.js"); +var getKeys = __webpack_require__(/*! ./_object-keys */ "./node_modules/core-js/modules/_object-keys.js"); +var redefine = __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js"); +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var hide = __webpack_require__(/*! ./_hide */ "./node_modules/core-js/modules/_hide.js"); +var Iterators = __webpack_require__(/*! ./_iterators */ "./node_modules/core-js/modules/_iterators.js"); +var wks = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js"); +var ITERATOR = wks('iterator'); +var TO_STRING_TAG = wks('toStringTag'); +var ArrayValues = Iterators.Array; + +var DOMIterables = { + CSSRuleList: true, // TODO: Not spec compliant, should be false. + CSSStyleDeclaration: false, + CSSValueList: false, + ClientRectList: false, + DOMRectList: false, + DOMStringList: false, + DOMTokenList: true, + DataTransferItemList: false, + FileList: false, + HTMLAllCollection: false, + HTMLCollection: false, + HTMLFormElement: false, + HTMLSelectElement: false, + MediaList: true, // TODO: Not spec compliant, should be false. + MimeTypeArray: false, + NamedNodeMap: false, + NodeList: true, + PaintRequestList: false, + Plugin: false, + PluginArray: false, + SVGLengthList: false, + SVGNumberList: false, + SVGPathSegList: false, + SVGPointList: false, + SVGStringList: false, + SVGTransformList: false, + SourceBufferList: false, + StyleSheetList: true, // TODO: Not spec compliant, should be false. + TextTrackCueList: false, + TextTrackList: false, + TouchList: false +}; + +for (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) { + var NAME = collections[i]; + var explicit = DOMIterables[NAME]; + var Collection = global[NAME]; + var proto = Collection && Collection.prototype; + var key; + if (proto) { + if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues); + if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME); + Iterators[NAME] = ArrayValues; + if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true); + } +} + + +/***/ }), + +/***/ "./node_modules/core-js/modules/web.immediate.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/web.immediate.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $task = __webpack_require__(/*! ./_task */ "./node_modules/core-js/modules/_task.js"); +$export($export.G + $export.B, { + setImmediate: $task.set, + clearImmediate: $task.clear +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/web.timers.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/web.timers.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// ie9- setTimeout & setInterval additional parameters fix +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var userAgent = __webpack_require__(/*! ./_user-agent */ "./node_modules/core-js/modules/_user-agent.js"); +var slice = [].slice; +var MSIE = /MSIE .\./.test(userAgent); // <- dirty ie9- check +var wrap = function (set) { + return function (fn, time /* , ...args */) { + var boundArgs = arguments.length > 2; + var args = boundArgs ? slice.call(arguments, 2) : false; + return set(boundArgs ? function () { + // eslint-disable-next-line no-new-func + (typeof fn == 'function' ? fn : Function(fn)).apply(this, args); + } : fn, time); + }; +}; +$export($export.G + $export.B + $export.F * MSIE, { + setTimeout: wrap(global.setTimeout), + setInterval: wrap(global.setInterval) +}); + + +/***/ }), + +/***/ "./node_modules/core-js/shim.js": +/*!**************************************!*\ + !*** ./node_modules/core-js/shim.js ***! + \**************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ./modules/es6.symbol */ "./node_modules/core-js/modules/es6.symbol.js"); +__webpack_require__(/*! ./modules/es6.object.create */ "./node_modules/core-js/modules/es6.object.create.js"); +__webpack_require__(/*! ./modules/es6.object.define-property */ "./node_modules/core-js/modules/es6.object.define-property.js"); +__webpack_require__(/*! ./modules/es6.object.define-properties */ "./node_modules/core-js/modules/es6.object.define-properties.js"); +__webpack_require__(/*! ./modules/es6.object.get-own-property-descriptor */ "./node_modules/core-js/modules/es6.object.get-own-property-descriptor.js"); +__webpack_require__(/*! ./modules/es6.object.get-prototype-of */ "./node_modules/core-js/modules/es6.object.get-prototype-of.js"); +__webpack_require__(/*! ./modules/es6.object.keys */ "./node_modules/core-js/modules/es6.object.keys.js"); +__webpack_require__(/*! ./modules/es6.object.get-own-property-names */ "./node_modules/core-js/modules/es6.object.get-own-property-names.js"); +__webpack_require__(/*! ./modules/es6.object.freeze */ "./node_modules/core-js/modules/es6.object.freeze.js"); +__webpack_require__(/*! ./modules/es6.object.seal */ "./node_modules/core-js/modules/es6.object.seal.js"); +__webpack_require__(/*! ./modules/es6.object.prevent-extensions */ "./node_modules/core-js/modules/es6.object.prevent-extensions.js"); +__webpack_require__(/*! ./modules/es6.object.is-frozen */ "./node_modules/core-js/modules/es6.object.is-frozen.js"); +__webpack_require__(/*! ./modules/es6.object.is-sealed */ "./node_modules/core-js/modules/es6.object.is-sealed.js"); +__webpack_require__(/*! ./modules/es6.object.is-extensible */ "./node_modules/core-js/modules/es6.object.is-extensible.js"); +__webpack_require__(/*! ./modules/es6.object.assign */ "./node_modules/core-js/modules/es6.object.assign.js"); +__webpack_require__(/*! ./modules/es6.object.is */ "./node_modules/core-js/modules/es6.object.is.js"); +__webpack_require__(/*! ./modules/es6.object.set-prototype-of */ "./node_modules/core-js/modules/es6.object.set-prototype-of.js"); +__webpack_require__(/*! ./modules/es6.object.to-string */ "./node_modules/core-js/modules/es6.object.to-string.js"); +__webpack_require__(/*! ./modules/es6.function.bind */ "./node_modules/core-js/modules/es6.function.bind.js"); +__webpack_require__(/*! ./modules/es6.function.name */ "./node_modules/core-js/modules/es6.function.name.js"); +__webpack_require__(/*! ./modules/es6.function.has-instance */ "./node_modules/core-js/modules/es6.function.has-instance.js"); +__webpack_require__(/*! ./modules/es6.parse-int */ "./node_modules/core-js/modules/es6.parse-int.js"); +__webpack_require__(/*! ./modules/es6.parse-float */ "./node_modules/core-js/modules/es6.parse-float.js"); +__webpack_require__(/*! ./modules/es6.number.constructor */ "./node_modules/core-js/modules/es6.number.constructor.js"); +__webpack_require__(/*! ./modules/es6.number.to-fixed */ "./node_modules/core-js/modules/es6.number.to-fixed.js"); +__webpack_require__(/*! ./modules/es6.number.to-precision */ "./node_modules/core-js/modules/es6.number.to-precision.js"); +__webpack_require__(/*! ./modules/es6.number.epsilon */ "./node_modules/core-js/modules/es6.number.epsilon.js"); +__webpack_require__(/*! ./modules/es6.number.is-finite */ "./node_modules/core-js/modules/es6.number.is-finite.js"); +__webpack_require__(/*! ./modules/es6.number.is-integer */ "./node_modules/core-js/modules/es6.number.is-integer.js"); +__webpack_require__(/*! ./modules/es6.number.is-nan */ "./node_modules/core-js/modules/es6.number.is-nan.js"); +__webpack_require__(/*! ./modules/es6.number.is-safe-integer */ "./node_modules/core-js/modules/es6.number.is-safe-integer.js"); +__webpack_require__(/*! ./modules/es6.number.max-safe-integer */ "./node_modules/core-js/modules/es6.number.max-safe-integer.js"); +__webpack_require__(/*! ./modules/es6.number.min-safe-integer */ "./node_modules/core-js/modules/es6.number.min-safe-integer.js"); +__webpack_require__(/*! ./modules/es6.number.parse-float */ "./node_modules/core-js/modules/es6.number.parse-float.js"); +__webpack_require__(/*! ./modules/es6.number.parse-int */ "./node_modules/core-js/modules/es6.number.parse-int.js"); +__webpack_require__(/*! ./modules/es6.math.acosh */ "./node_modules/core-js/modules/es6.math.acosh.js"); +__webpack_require__(/*! ./modules/es6.math.asinh */ "./node_modules/core-js/modules/es6.math.asinh.js"); +__webpack_require__(/*! ./modules/es6.math.atanh */ "./node_modules/core-js/modules/es6.math.atanh.js"); +__webpack_require__(/*! ./modules/es6.math.cbrt */ "./node_modules/core-js/modules/es6.math.cbrt.js"); +__webpack_require__(/*! ./modules/es6.math.clz32 */ "./node_modules/core-js/modules/es6.math.clz32.js"); +__webpack_require__(/*! ./modules/es6.math.cosh */ "./node_modules/core-js/modules/es6.math.cosh.js"); +__webpack_require__(/*! ./modules/es6.math.expm1 */ "./node_modules/core-js/modules/es6.math.expm1.js"); +__webpack_require__(/*! ./modules/es6.math.fround */ "./node_modules/core-js/modules/es6.math.fround.js"); +__webpack_require__(/*! ./modules/es6.math.hypot */ "./node_modules/core-js/modules/es6.math.hypot.js"); +__webpack_require__(/*! ./modules/es6.math.imul */ "./node_modules/core-js/modules/es6.math.imul.js"); +__webpack_require__(/*! ./modules/es6.math.log10 */ "./node_modules/core-js/modules/es6.math.log10.js"); +__webpack_require__(/*! ./modules/es6.math.log1p */ "./node_modules/core-js/modules/es6.math.log1p.js"); +__webpack_require__(/*! ./modules/es6.math.log2 */ "./node_modules/core-js/modules/es6.math.log2.js"); +__webpack_require__(/*! ./modules/es6.math.sign */ "./node_modules/core-js/modules/es6.math.sign.js"); +__webpack_require__(/*! ./modules/es6.math.sinh */ "./node_modules/core-js/modules/es6.math.sinh.js"); +__webpack_require__(/*! ./modules/es6.math.tanh */ "./node_modules/core-js/modules/es6.math.tanh.js"); +__webpack_require__(/*! ./modules/es6.math.trunc */ "./node_modules/core-js/modules/es6.math.trunc.js"); +__webpack_require__(/*! ./modules/es6.string.from-code-point */ "./node_modules/core-js/modules/es6.string.from-code-point.js"); +__webpack_require__(/*! ./modules/es6.string.raw */ "./node_modules/core-js/modules/es6.string.raw.js"); +__webpack_require__(/*! ./modules/es6.string.trim */ "./node_modules/core-js/modules/es6.string.trim.js"); +__webpack_require__(/*! ./modules/es6.string.iterator */ "./node_modules/core-js/modules/es6.string.iterator.js"); +__webpack_require__(/*! ./modules/es6.string.code-point-at */ "./node_modules/core-js/modules/es6.string.code-point-at.js"); +__webpack_require__(/*! ./modules/es6.string.ends-with */ "./node_modules/core-js/modules/es6.string.ends-with.js"); +__webpack_require__(/*! ./modules/es6.string.includes */ "./node_modules/core-js/modules/es6.string.includes.js"); +__webpack_require__(/*! ./modules/es6.string.repeat */ "./node_modules/core-js/modules/es6.string.repeat.js"); +__webpack_require__(/*! ./modules/es6.string.starts-with */ "./node_modules/core-js/modules/es6.string.starts-with.js"); +__webpack_require__(/*! ./modules/es6.string.anchor */ "./node_modules/core-js/modules/es6.string.anchor.js"); +__webpack_require__(/*! ./modules/es6.string.big */ "./node_modules/core-js/modules/es6.string.big.js"); +__webpack_require__(/*! ./modules/es6.string.blink */ "./node_modules/core-js/modules/es6.string.blink.js"); +__webpack_require__(/*! ./modules/es6.string.bold */ "./node_modules/core-js/modules/es6.string.bold.js"); +__webpack_require__(/*! ./modules/es6.string.fixed */ "./node_modules/core-js/modules/es6.string.fixed.js"); +__webpack_require__(/*! ./modules/es6.string.fontcolor */ "./node_modules/core-js/modules/es6.string.fontcolor.js"); +__webpack_require__(/*! ./modules/es6.string.fontsize */ "./node_modules/core-js/modules/es6.string.fontsize.js"); +__webpack_require__(/*! ./modules/es6.string.italics */ "./node_modules/core-js/modules/es6.string.italics.js"); +__webpack_require__(/*! ./modules/es6.string.link */ "./node_modules/core-js/modules/es6.string.link.js"); +__webpack_require__(/*! ./modules/es6.string.small */ "./node_modules/core-js/modules/es6.string.small.js"); +__webpack_require__(/*! ./modules/es6.string.strike */ "./node_modules/core-js/modules/es6.string.strike.js"); +__webpack_require__(/*! ./modules/es6.string.sub */ "./node_modules/core-js/modules/es6.string.sub.js"); +__webpack_require__(/*! ./modules/es6.string.sup */ "./node_modules/core-js/modules/es6.string.sup.js"); +__webpack_require__(/*! ./modules/es6.date.now */ "./node_modules/core-js/modules/es6.date.now.js"); +__webpack_require__(/*! ./modules/es6.date.to-json */ "./node_modules/core-js/modules/es6.date.to-json.js"); +__webpack_require__(/*! ./modules/es6.date.to-iso-string */ "./node_modules/core-js/modules/es6.date.to-iso-string.js"); +__webpack_require__(/*! ./modules/es6.date.to-string */ "./node_modules/core-js/modules/es6.date.to-string.js"); +__webpack_require__(/*! ./modules/es6.date.to-primitive */ "./node_modules/core-js/modules/es6.date.to-primitive.js"); +__webpack_require__(/*! ./modules/es6.array.is-array */ "./node_modules/core-js/modules/es6.array.is-array.js"); +__webpack_require__(/*! ./modules/es6.array.from */ "./node_modules/core-js/modules/es6.array.from.js"); +__webpack_require__(/*! ./modules/es6.array.of */ "./node_modules/core-js/modules/es6.array.of.js"); +__webpack_require__(/*! ./modules/es6.array.join */ "./node_modules/core-js/modules/es6.array.join.js"); +__webpack_require__(/*! ./modules/es6.array.slice */ "./node_modules/core-js/modules/es6.array.slice.js"); +__webpack_require__(/*! ./modules/es6.array.sort */ "./node_modules/core-js/modules/es6.array.sort.js"); +__webpack_require__(/*! ./modules/es6.array.for-each */ "./node_modules/core-js/modules/es6.array.for-each.js"); +__webpack_require__(/*! ./modules/es6.array.map */ "./node_modules/core-js/modules/es6.array.map.js"); +__webpack_require__(/*! ./modules/es6.array.filter */ "./node_modules/core-js/modules/es6.array.filter.js"); +__webpack_require__(/*! ./modules/es6.array.some */ "./node_modules/core-js/modules/es6.array.some.js"); +__webpack_require__(/*! ./modules/es6.array.every */ "./node_modules/core-js/modules/es6.array.every.js"); +__webpack_require__(/*! ./modules/es6.array.reduce */ "./node_modules/core-js/modules/es6.array.reduce.js"); +__webpack_require__(/*! ./modules/es6.array.reduce-right */ "./node_modules/core-js/modules/es6.array.reduce-right.js"); +__webpack_require__(/*! ./modules/es6.array.index-of */ "./node_modules/core-js/modules/es6.array.index-of.js"); +__webpack_require__(/*! ./modules/es6.array.last-index-of */ "./node_modules/core-js/modules/es6.array.last-index-of.js"); +__webpack_require__(/*! ./modules/es6.array.copy-within */ "./node_modules/core-js/modules/es6.array.copy-within.js"); +__webpack_require__(/*! ./modules/es6.array.fill */ "./node_modules/core-js/modules/es6.array.fill.js"); +__webpack_require__(/*! ./modules/es6.array.find */ "./node_modules/core-js/modules/es6.array.find.js"); +__webpack_require__(/*! ./modules/es6.array.find-index */ "./node_modules/core-js/modules/es6.array.find-index.js"); +__webpack_require__(/*! ./modules/es6.array.species */ "./node_modules/core-js/modules/es6.array.species.js"); +__webpack_require__(/*! ./modules/es6.array.iterator */ "./node_modules/core-js/modules/es6.array.iterator.js"); +__webpack_require__(/*! ./modules/es6.regexp.constructor */ "./node_modules/core-js/modules/es6.regexp.constructor.js"); +__webpack_require__(/*! ./modules/es6.regexp.exec */ "./node_modules/core-js/modules/es6.regexp.exec.js"); +__webpack_require__(/*! ./modules/es6.regexp.to-string */ "./node_modules/core-js/modules/es6.regexp.to-string.js"); +__webpack_require__(/*! ./modules/es6.regexp.flags */ "./node_modules/core-js/modules/es6.regexp.flags.js"); +__webpack_require__(/*! ./modules/es6.regexp.match */ "./node_modules/core-js/modules/es6.regexp.match.js"); +__webpack_require__(/*! ./modules/es6.regexp.replace */ "./node_modules/core-js/modules/es6.regexp.replace.js"); +__webpack_require__(/*! ./modules/es6.regexp.search */ "./node_modules/core-js/modules/es6.regexp.search.js"); +__webpack_require__(/*! ./modules/es6.regexp.split */ "./node_modules/core-js/modules/es6.regexp.split.js"); +__webpack_require__(/*! ./modules/es6.promise */ "./node_modules/core-js/modules/es6.promise.js"); +__webpack_require__(/*! ./modules/es6.map */ "./node_modules/core-js/modules/es6.map.js"); +__webpack_require__(/*! ./modules/es6.set */ "./node_modules/core-js/modules/es6.set.js"); +__webpack_require__(/*! ./modules/es6.weak-map */ "./node_modules/core-js/modules/es6.weak-map.js"); +__webpack_require__(/*! ./modules/es6.weak-set */ "./node_modules/core-js/modules/es6.weak-set.js"); +__webpack_require__(/*! ./modules/es6.typed.array-buffer */ "./node_modules/core-js/modules/es6.typed.array-buffer.js"); +__webpack_require__(/*! ./modules/es6.typed.data-view */ "./node_modules/core-js/modules/es6.typed.data-view.js"); +__webpack_require__(/*! ./modules/es6.typed.int8-array */ "./node_modules/core-js/modules/es6.typed.int8-array.js"); +__webpack_require__(/*! ./modules/es6.typed.uint8-array */ "./node_modules/core-js/modules/es6.typed.uint8-array.js"); +__webpack_require__(/*! ./modules/es6.typed.uint8-clamped-array */ "./node_modules/core-js/modules/es6.typed.uint8-clamped-array.js"); +__webpack_require__(/*! ./modules/es6.typed.int16-array */ "./node_modules/core-js/modules/es6.typed.int16-array.js"); +__webpack_require__(/*! ./modules/es6.typed.uint16-array */ "./node_modules/core-js/modules/es6.typed.uint16-array.js"); +__webpack_require__(/*! ./modules/es6.typed.int32-array */ "./node_modules/core-js/modules/es6.typed.int32-array.js"); +__webpack_require__(/*! ./modules/es6.typed.uint32-array */ "./node_modules/core-js/modules/es6.typed.uint32-array.js"); +__webpack_require__(/*! ./modules/es6.typed.float32-array */ "./node_modules/core-js/modules/es6.typed.float32-array.js"); +__webpack_require__(/*! ./modules/es6.typed.float64-array */ "./node_modules/core-js/modules/es6.typed.float64-array.js"); +__webpack_require__(/*! ./modules/es6.reflect.apply */ "./node_modules/core-js/modules/es6.reflect.apply.js"); +__webpack_require__(/*! ./modules/es6.reflect.construct */ "./node_modules/core-js/modules/es6.reflect.construct.js"); +__webpack_require__(/*! ./modules/es6.reflect.define-property */ "./node_modules/core-js/modules/es6.reflect.define-property.js"); +__webpack_require__(/*! ./modules/es6.reflect.delete-property */ "./node_modules/core-js/modules/es6.reflect.delete-property.js"); +__webpack_require__(/*! ./modules/es6.reflect.enumerate */ "./node_modules/core-js/modules/es6.reflect.enumerate.js"); +__webpack_require__(/*! ./modules/es6.reflect.get */ "./node_modules/core-js/modules/es6.reflect.get.js"); +__webpack_require__(/*! ./modules/es6.reflect.get-own-property-descriptor */ "./node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js"); +__webpack_require__(/*! ./modules/es6.reflect.get-prototype-of */ "./node_modules/core-js/modules/es6.reflect.get-prototype-of.js"); +__webpack_require__(/*! ./modules/es6.reflect.has */ "./node_modules/core-js/modules/es6.reflect.has.js"); +__webpack_require__(/*! ./modules/es6.reflect.is-extensible */ "./node_modules/core-js/modules/es6.reflect.is-extensible.js"); +__webpack_require__(/*! ./modules/es6.reflect.own-keys */ "./node_modules/core-js/modules/es6.reflect.own-keys.js"); +__webpack_require__(/*! ./modules/es6.reflect.prevent-extensions */ "./node_modules/core-js/modules/es6.reflect.prevent-extensions.js"); +__webpack_require__(/*! ./modules/es6.reflect.set */ "./node_modules/core-js/modules/es6.reflect.set.js"); +__webpack_require__(/*! ./modules/es6.reflect.set-prototype-of */ "./node_modules/core-js/modules/es6.reflect.set-prototype-of.js"); +__webpack_require__(/*! ./modules/es7.array.includes */ "./node_modules/core-js/modules/es7.array.includes.js"); +__webpack_require__(/*! ./modules/es7.array.flat-map */ "./node_modules/core-js/modules/es7.array.flat-map.js"); +__webpack_require__(/*! ./modules/es7.array.flatten */ "./node_modules/core-js/modules/es7.array.flatten.js"); +__webpack_require__(/*! ./modules/es7.string.at */ "./node_modules/core-js/modules/es7.string.at.js"); +__webpack_require__(/*! ./modules/es7.string.pad-start */ "./node_modules/core-js/modules/es7.string.pad-start.js"); +__webpack_require__(/*! ./modules/es7.string.pad-end */ "./node_modules/core-js/modules/es7.string.pad-end.js"); +__webpack_require__(/*! ./modules/es7.string.trim-left */ "./node_modules/core-js/modules/es7.string.trim-left.js"); +__webpack_require__(/*! ./modules/es7.string.trim-right */ "./node_modules/core-js/modules/es7.string.trim-right.js"); +__webpack_require__(/*! ./modules/es7.string.match-all */ "./node_modules/core-js/modules/es7.string.match-all.js"); +__webpack_require__(/*! ./modules/es7.symbol.async-iterator */ "./node_modules/core-js/modules/es7.symbol.async-iterator.js"); +__webpack_require__(/*! ./modules/es7.symbol.observable */ "./node_modules/core-js/modules/es7.symbol.observable.js"); +__webpack_require__(/*! ./modules/es7.object.get-own-property-descriptors */ "./node_modules/core-js/modules/es7.object.get-own-property-descriptors.js"); +__webpack_require__(/*! ./modules/es7.object.values */ "./node_modules/core-js/modules/es7.object.values.js"); +__webpack_require__(/*! ./modules/es7.object.entries */ "./node_modules/core-js/modules/es7.object.entries.js"); +__webpack_require__(/*! ./modules/es7.object.define-getter */ "./node_modules/core-js/modules/es7.object.define-getter.js"); +__webpack_require__(/*! ./modules/es7.object.define-setter */ "./node_modules/core-js/modules/es7.object.define-setter.js"); +__webpack_require__(/*! ./modules/es7.object.lookup-getter */ "./node_modules/core-js/modules/es7.object.lookup-getter.js"); +__webpack_require__(/*! ./modules/es7.object.lookup-setter */ "./node_modules/core-js/modules/es7.object.lookup-setter.js"); +__webpack_require__(/*! ./modules/es7.map.to-json */ "./node_modules/core-js/modules/es7.map.to-json.js"); +__webpack_require__(/*! ./modules/es7.set.to-json */ "./node_modules/core-js/modules/es7.set.to-json.js"); +__webpack_require__(/*! ./modules/es7.map.of */ "./node_modules/core-js/modules/es7.map.of.js"); +__webpack_require__(/*! ./modules/es7.set.of */ "./node_modules/core-js/modules/es7.set.of.js"); +__webpack_require__(/*! ./modules/es7.weak-map.of */ "./node_modules/core-js/modules/es7.weak-map.of.js"); +__webpack_require__(/*! ./modules/es7.weak-set.of */ "./node_modules/core-js/modules/es7.weak-set.of.js"); +__webpack_require__(/*! ./modules/es7.map.from */ "./node_modules/core-js/modules/es7.map.from.js"); +__webpack_require__(/*! ./modules/es7.set.from */ "./node_modules/core-js/modules/es7.set.from.js"); +__webpack_require__(/*! ./modules/es7.weak-map.from */ "./node_modules/core-js/modules/es7.weak-map.from.js"); +__webpack_require__(/*! ./modules/es7.weak-set.from */ "./node_modules/core-js/modules/es7.weak-set.from.js"); +__webpack_require__(/*! ./modules/es7.global */ "./node_modules/core-js/modules/es7.global.js"); +__webpack_require__(/*! ./modules/es7.system.global */ "./node_modules/core-js/modules/es7.system.global.js"); +__webpack_require__(/*! ./modules/es7.error.is-error */ "./node_modules/core-js/modules/es7.error.is-error.js"); +__webpack_require__(/*! ./modules/es7.math.clamp */ "./node_modules/core-js/modules/es7.math.clamp.js"); +__webpack_require__(/*! ./modules/es7.math.deg-per-rad */ "./node_modules/core-js/modules/es7.math.deg-per-rad.js"); +__webpack_require__(/*! ./modules/es7.math.degrees */ "./node_modules/core-js/modules/es7.math.degrees.js"); +__webpack_require__(/*! ./modules/es7.math.fscale */ "./node_modules/core-js/modules/es7.math.fscale.js"); +__webpack_require__(/*! ./modules/es7.math.iaddh */ "./node_modules/core-js/modules/es7.math.iaddh.js"); +__webpack_require__(/*! ./modules/es7.math.isubh */ "./node_modules/core-js/modules/es7.math.isubh.js"); +__webpack_require__(/*! ./modules/es7.math.imulh */ "./node_modules/core-js/modules/es7.math.imulh.js"); +__webpack_require__(/*! ./modules/es7.math.rad-per-deg */ "./node_modules/core-js/modules/es7.math.rad-per-deg.js"); +__webpack_require__(/*! ./modules/es7.math.radians */ "./node_modules/core-js/modules/es7.math.radians.js"); +__webpack_require__(/*! ./modules/es7.math.scale */ "./node_modules/core-js/modules/es7.math.scale.js"); +__webpack_require__(/*! ./modules/es7.math.umulh */ "./node_modules/core-js/modules/es7.math.umulh.js"); +__webpack_require__(/*! ./modules/es7.math.signbit */ "./node_modules/core-js/modules/es7.math.signbit.js"); +__webpack_require__(/*! ./modules/es7.promise.finally */ "./node_modules/core-js/modules/es7.promise.finally.js"); +__webpack_require__(/*! ./modules/es7.promise.try */ "./node_modules/core-js/modules/es7.promise.try.js"); +__webpack_require__(/*! ./modules/es7.reflect.define-metadata */ "./node_modules/core-js/modules/es7.reflect.define-metadata.js"); +__webpack_require__(/*! ./modules/es7.reflect.delete-metadata */ "./node_modules/core-js/modules/es7.reflect.delete-metadata.js"); +__webpack_require__(/*! ./modules/es7.reflect.get-metadata */ "./node_modules/core-js/modules/es7.reflect.get-metadata.js"); +__webpack_require__(/*! ./modules/es7.reflect.get-metadata-keys */ "./node_modules/core-js/modules/es7.reflect.get-metadata-keys.js"); +__webpack_require__(/*! ./modules/es7.reflect.get-own-metadata */ "./node_modules/core-js/modules/es7.reflect.get-own-metadata.js"); +__webpack_require__(/*! ./modules/es7.reflect.get-own-metadata-keys */ "./node_modules/core-js/modules/es7.reflect.get-own-metadata-keys.js"); +__webpack_require__(/*! ./modules/es7.reflect.has-metadata */ "./node_modules/core-js/modules/es7.reflect.has-metadata.js"); +__webpack_require__(/*! ./modules/es7.reflect.has-own-metadata */ "./node_modules/core-js/modules/es7.reflect.has-own-metadata.js"); +__webpack_require__(/*! ./modules/es7.reflect.metadata */ "./node_modules/core-js/modules/es7.reflect.metadata.js"); +__webpack_require__(/*! ./modules/es7.asap */ "./node_modules/core-js/modules/es7.asap.js"); +__webpack_require__(/*! ./modules/es7.observable */ "./node_modules/core-js/modules/es7.observable.js"); +__webpack_require__(/*! ./modules/web.timers */ "./node_modules/core-js/modules/web.timers.js"); +__webpack_require__(/*! ./modules/web.immediate */ "./node_modules/core-js/modules/web.immediate.js"); +__webpack_require__(/*! ./modules/web.dom.iterable */ "./node_modules/core-js/modules/web.dom.iterable.js"); +module.exports = __webpack_require__(/*! ./modules/_core */ "./node_modules/core-js/modules/_core.js"); + + +/***/ }), + +/***/ "./node_modules/webpack/buildin/global.js": +/*!***********************************!*\ + !*** (webpack)/buildin/global.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +var g; + +// This works in non-strict mode +g = (function() { + return this; +})(); + +try { + // This works if eval is allowed (see CSP) + g = g || new Function("return this")(); +} catch (e) { + // This works if the window reference is available + if (typeof window === "object") g = window; +} + +// g can still be undefined, but nothing to do about it... +// We return undefined, instead of nothing here, so it's +// easier to handle this case. if(!global) { ...} + +module.exports = g; + + +/***/ }) + +/******/ }); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9mbi9yZWdleHAvZXNjYXBlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2EtZnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYS1udW1iZXItdmFsdWUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYWRkLXRvLXVuc2NvcGFibGVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FkdmFuY2Utc3RyaW5nLWluZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FuLWluc3RhbmNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FuLW9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hcnJheS1jb3B5LXdpdGhpbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hcnJheS1maWxsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FycmF5LWZyb20taXRlcmFibGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYXJyYXktaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYXJyYXktbWV0aG9kcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hcnJheS1yZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYXJyYXktc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hcnJheS1zcGVjaWVzLWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19iaW5kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2NsYXNzb2YuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY29mLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2NvbGxlY3Rpb24tc3Ryb25nLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2NvbGxlY3Rpb24tdG8tanNvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jb2xsZWN0aW9uLXdlYWsuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY29sbGVjdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jb3JlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2NyZWF0ZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jdHguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZGF0ZS10by1pc28tc3RyaW5nLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2RhdGUtdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2RlZmluZWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZGVzY3JpcHRvcnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZG9tLWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19lbnVtLWJ1Zy1rZXlzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2VudW0ta2V5cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19leHBvcnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZmFpbHMtaXMtcmVnZXhwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2ZhaWxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2ZpeC1yZS13a3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZmxhZ3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZmxhdHRlbi1pbnRvLWFycmF5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2Zvci1vZi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19mdW5jdGlvbi10by1zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2hhcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19oaWRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2h0bWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faWU4LWRvbS1kZWZpbmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faW5oZXJpdC1pZi1yZXF1aXJlZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pbnZva2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faW9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pcy1hcnJheS1pdGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2lzLWFycmF5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2lzLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXMtb2JqZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2lzLXJlZ2V4cC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLWNhbGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1kZWZpbmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1kZXRlY3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1zdGVwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2l0ZXJhdG9ycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19saWJyYXJ5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX21hdGgtZXhwbTEuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fbWF0aC1mcm91bmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fbWF0aC1sb2cxcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19tYXRoLXNjYWxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX21hdGgtc2lnbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19tZXRhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX21ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX21pY3JvdGFzay5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1hc3NpZ24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZHAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWRwcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZm9yY2VkLXBhbS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wbi1leHQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdvcG4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdvcHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdwby5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3Qta2V5cy1pbnRlcm5hbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3Qta2V5cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtcGllLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1zYXAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LXRvLWFycmF5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX293bi1rZXlzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3BhcnNlLWZsb2F0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3BhcnNlLWludC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19wZXJmb3JtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3Byb21pc2UtcmVzb2x2ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19wcm9wZXJ0eS1kZXNjLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3JlZGVmaW5lLWFsbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZWdleHAtZXhlYy1hYnN0cmFjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZWdleHAtZXhlYy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZXBsYWNlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zYW1lLXZhbHVlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NldC1jb2xsZWN0aW9uLWZyb20uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc2V0LWNvbGxlY3Rpb24tb2YuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc2V0LXByb3RvLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NldC1zcGVjaWVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NldC10by1zdHJpbmctdGFnLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NoYXJlZC1rZXkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc2hhcmVkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NwZWNpZXMtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc3RyaWN0LW1ldGhvZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpbmctYXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLWNvbnRleHQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLWh0bWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLXBhZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpbmctcmVwZWF0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy10cmltLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy13cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190YXNrLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLWFic29sdXRlLWluZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLWluZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8taW9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1sZW5ndGguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8tb2JqZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLXByaW1pdGl2ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190eXBlZC1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190eXBlZC1idWZmZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdHlwZWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdWlkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3VzZXItYWdlbnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdmFsaWRhdGUtY29sbGVjdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL193a3MtZGVmaW5lLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3drcy1leHQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fd2tzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvY29yZS5yZWdleHAuZXNjYXBlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmNvcHktd2l0aGluLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmV2ZXJ5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmZpbGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZmlsdGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmZpbmQtaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZmluZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5mb3ItZWFjaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5mcm9tLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmluZGV4LW9mLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmlzLWFycmF5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5Lml0ZXJhdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmpvaW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkubGFzdC1pbmRleC1vZi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5tYXAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkub2YuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkucmVkdWNlLXJpZ2h0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LnJlZHVjZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5zbGljZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5zb21lLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LnNvcnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuc3BlY2llcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5kYXRlLm5vdy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5kYXRlLnRvLWlzby1zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS50by1qc29uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmRhdGUudG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmRhdGUudG8tc3RyaW5nLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmZ1bmN0aW9uLmJpbmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuZnVuY3Rpb24uaGFzLWluc3RhbmNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmZ1bmN0aW9uLm5hbWUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWFwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguYWNvc2guanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5hc2luaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmF0YW5oLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguY2JydC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmNsejMyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguY29zaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmV4cG0xLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguZnJvdW5kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguaHlwb3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5pbXVsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgubG9nMTAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5sb2cxcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmxvZzIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5zaWduLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguc2luaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLnRhbmguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC50cnVuYy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmVwc2lsb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmlzLWZpbml0ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuaXMtaW50ZWdlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuaXMtbmFuLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5pcy1zYWZlLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLm1heC1zYWZlLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLm1pbi1zYWZlLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLnBhcnNlLWZsb2F0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5wYXJzZS1pbnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLnRvLWZpeGVkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci50by1wcmVjaXNpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmFzc2lnbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuY3JlYXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5kZWZpbmUtcHJvcGVydGllcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuZGVmaW5lLXByb3BlcnR5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5mcmVlemUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuZ2V0LXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuaXMtZXh0ZW5zaWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuaXMtZnJvemVuLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5pcy1zZWFsZWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5rZXlzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5wcmV2ZW50LWV4dGVuc2lvbnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnNlYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnNldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5wYXJzZS1mbG9hdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5wYXJzZS1pbnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucHJvbWlzZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmFwcGx5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuY29uc3RydWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuZGVmaW5lLXByb3BlcnR5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuZGVsZXRlLXByb3BlcnR5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuZW51bWVyYXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0LXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0Lmhhcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmlzLWV4dGVuc2libGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5vd24ta2V5cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LnByZXZlbnQtZXh0ZW5zaW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LnNldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5zZXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLmNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5leGVjLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5mbGFncy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAubWF0Y2guanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnJlcGxhY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnNlYXJjaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAuc3BsaXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnRvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zZXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmFuY2hvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuYmlnLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5ibGluay5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuYm9sZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuY29kZS1wb2ludC1hdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuZW5kcy13aXRoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5maXhlZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuZm9udGNvbG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5mb250c2l6ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuZnJvbS1jb2RlLXBvaW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuaXRhbGljcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmxpbmsuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnJhdy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcucmVwZWF0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5zbWFsbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuc3RhcnRzLXdpdGguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnN0cmlrZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuc3ViLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5zdXAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnRyaW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3ltYm9sLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmFycmF5LWJ1ZmZlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5kYXRhLXZpZXcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuZmxvYXQzMi1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5mbG9hdDY0LWFycmF5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmludDE2LWFycmF5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmludDMyLWFycmF5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmludDgtYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQudWludDE2LWFycmF5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQzMi1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC51aW50OC1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC51aW50OC1jbGFtcGVkLWFycmF5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LndlYWstbWFwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LndlYWstc2V0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LmFycmF5LmZsYXQtbWFwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LmFycmF5LmZsYXR0ZW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuYXJyYXkuaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuYXNhcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5lcnJvci5pcy1lcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcubWFwLmZyb20uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcubWFwLm9mLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hcC50by1qc29uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hdGguY2xhbXAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5kZWctcGVyLXJhZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLmRlZ3JlZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5mc2NhbGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5pYWRkaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLmltdWxoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hdGguaXN1YmguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5yYWQtcGVyLWRlZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLnJhZGlhbnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5zY2FsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLnNpZ25iaXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC51bXVsaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QuZGVmaW5lLWdldHRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QuZGVmaW5lLXNldHRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QuZW50cmllcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9ycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QubG9va3VwLWdldHRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QubG9va3VwLXNldHRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QudmFsdWVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm9ic2VydmFibGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcucHJvbWlzZS5maW5hbGx5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnByb21pc2UudHJ5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZGVmaW5lLW1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZGVsZXRlLW1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZ2V0LW1ldGFkYXRhLWtleXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5nZXQtbWV0YWRhdGEuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5nZXQtb3duLW1ldGFkYXRhLWtleXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5nZXQtb3duLW1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuaGFzLW1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuaGFzLW93bi1tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0Lm1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnNldC5mcm9tLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnNldC5vZi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5zZXQudG8tanNvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5zdHJpbmcuYXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLm1hdGNoLWFsbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5zdHJpbmcucGFkLWVuZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5zdHJpbmcucGFkLXN0YXJ0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy50cmltLWxlZnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLnRyaW0tcmlnaHQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuc3ltYm9sLmFzeW5jLWl0ZXJhdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnN5bWJvbC5vYnNlcnZhYmxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnN5c3RlbS5nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcud2Vhay1tYXAuZnJvbS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy53ZWFrLW1hcC5vZi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy53ZWFrLXNldC5mcm9tLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LndlYWstc2V0Lm9mLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5pbW1lZGlhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIudGltZXJzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL3NoaW0uanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO1FBQUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7OztRQUdBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwwQ0FBMEMsZ0NBQWdDO1FBQzFFO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0Esd0RBQXdELGtCQUFrQjtRQUMxRTtRQUNBLGlEQUFpRCxjQUFjO1FBQy9EOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSx5Q0FBeUMsaUNBQWlDO1FBQzFFLGdIQUFnSCxtQkFBbUIsRUFBRTtRQUNySTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDJCQUEyQiwwQkFBMEIsRUFBRTtRQUN2RCxpQ0FBaUMsZUFBZTtRQUNoRDtRQUNBO1FBQ0E7O1FBRUE7UUFDQSxzREFBc0QsK0RBQStEOztRQUVySDtRQUNBOzs7UUFHQTtRQUNBOzs7Ozs7Ozs7Ozs7O0FDbEZBLDhDQUFhOztBQUViLG1CQUFPLENBQUMsb0RBQWM7O0FBRXRCLG1CQUFPLENBQUMsOEdBQTZCOztBQUVyQyxtQkFBTyxDQUFDLDRFQUEwQjs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUMsRTs7Ozs7Ozs7Ozs7O0FDM0JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkLEtBQUs7QUFDTCxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQ7QUFDekQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQSx3Q0FBd0MsV0FBVztBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsU0FBUztBQUNUO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQ0FBb0MsY0FBYztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUNBQWlDLGtCQUFrQjtBQUNuRDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCOztBQUVqQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsaUJBQWlCO0FBQ3pDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQSxZQUFZO0FBQ1o7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSw4Q0FBOEMsUUFBUTtBQUN0RDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUEsV0FBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSw4Q0FBOEMsUUFBUTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtB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LDRHQUF1QztBQUMvQyxtQkFBTyxDQUFDLG9GQUEyQjtBQUNuQyxtQkFBTyxDQUFDLHdIQUE2QztBQUNyRCxtQkFBTyxDQUFDLHdGQUE2QjtBQUNyQyxtQkFBTyxDQUFDLG9GQUEyQjtBQUNuQyxtQkFBTyxDQUFDLGdIQUF5QztBQUNqRCxtQkFBTyxDQUFDLDhGQUFnQztBQUN4QyxtQkFBTyxDQUFDLDhGQUFnQztBQUN4QyxtQkFBTyxDQUFDLHNHQUFvQztBQUM1QyxtQkFBTyxDQUFDLHdGQUE2QjtBQUNyQyxtQkFBTyxDQUFDLGdGQUF5QjtBQUNqQyxtQkFBTyxDQUFDLDRHQUF1QztBQUMvQyxtQkFBTyxDQUFDLDhGQUFnQztBQUN4QyxtQkFBTyxDQUFDLHdGQUE2QjtBQUNyQyxtQkFBTyxDQUFDLHdGQUE2QjtBQUNyQyxtQkFBTyxDQUFDLHdHQUFxQztBQUM3QyxtQkFBTyxDQUFDLGdGQUF5QjtBQUNqQyxtQkFBTyxDQUFDLG9GQUEyQjtBQUNuQyxtQkFBTyxDQUFDLGtHQUFrQztBQUMxQyxtQkFBTyxDQUFDLDRGQUErQjtBQUN2QyxtQkFBTyxDQUFDLG9HQUFtQztBQUMzQyxtQkFBTyxDQUFDLDBGQUE4QjtBQUN0QyxtQkFBTyxDQUFDLDhGQUFnQztBQUN4QyxtQkFBTyxDQUFDLGdHQUFpQztBQUN6QyxtQkFBTyxDQUFDLHdGQUE2QjtBQUNyQyxtQkFBTyxDQUFDLDBHQUFzQztBQUM5QyxtQkFBTyxDQUFDLDRHQUF1QztBQUMvQyxtQkFBTyxDQUFDLDRHQUF1QztBQUMvQyxtQkFBTyxDQUFDLGtHQUFrQztBQUMxQyxtQkFBTyxDQUFDLDhGQUFnQztBQUN4QyxtQkFBTyxDQUFDLGtGQUEwQjtBQUNsQyxtQkFBTyxDQUFDLGtGQUEwQjtBQUNsQyxtQkFBTyxDQUFDLGtGQUEwQjtBQUNsQyxtQkFBTyxDQUFDLGdGQUF5QjtBQUNqQyxtQkFBTyxDQUFDLGtGQUEwQjtBQUNsQyxtQkFBTyxDQUFDLGdGQUF5QjtBQUNqQyxtQkFBTyxDQUFDLGtGQUEwQjtBQUNsQyxtQkFBTyxDQUFDLG9GQUEyQjtBQUNuQyxtQkFBTyxDQUFDLGtGQUEwQjtBQUNsQyxtQkFBTyxDQUFDLGdGQUF5QjtBQUNqQyxtQkFBTyxDQUFDLGtGQUEwQjtBQUNsQyxtQkFBTyxDQUFDLGtGQUEwQjtBQUNsQyxtQkFBTyxDQUFDLGdGQUF5QjtBQUNqQyxtQkFBTyxDQUFDLGdGQUF5QjtBQUNqQyxtQkFBTyxDQUFDLGdGQUF5QjtBQUNqQyxtQkFBTyxDQUFDLGdGQUF5QjtBQUNqQyxtQkFBTyxDQUFDLGtGQUEwQjtBQUNsQyxtQkFBTyxDQUFDLDBHQUFzQztBQUM5QyxtQkFBTyxDQUFDLGtGQUEwQjtBQUNsQyxtQkFBTyxDQUFDLG9GQUEyQjtBQUNuQyxtQkFBTyxDQUFDLDRGQUErQjtBQUN2QyxtQkFBTyxDQUFDLHNHQUFvQztBQUM1QyxtQkFBTyxDQUFDLDhGQUFnQztBQUN4QyxtQkFBTyxDQUFDLDRGQUErQjtBQUN2QyxtQkFBTyxDQUFDLHdGQUE2QjtBQUNyQyxtQkFBTyxDQUFDLGtHQUFrQztBQUMxQyxtQkFBTyxDQUFDLHdGQUE2QjtBQUNyQyxtQkFBTyxDQUFDLGtGQUEwQjtBQUNsQyxtQkFBTyxDQUFDLHNGQUE0QjtBQUNwQyxtQkFBTyxDQUFDLG9GQUEyQjtBQUNuQyxtQkFBTyxDQUFDLHNGQUE0QjtBQUNwQyxtQkFBTyxDQUFDLDhGQUFnQztBQUN4QyxtQkFBTyxDQUFDLDRGQUErQjtBQUN2QyxtQkFBTyxDQUFDLDBGQUE4QjtBQUN0QyxtQkFBTyxDQUFDLG9GQUEyQjtBQUNuQyxtQkFBTyxDQUFDLHNGQUE0QjtBQUNwQyxtQkFBTyxDQUFDLHdGQUE2QjtBQUNyQyxtQkFBTyxDQUFDLGtGQUEwQjtBQUNsQyxtQkFBTyxDQUFDLGtGQUEwQjtBQUNsQyxtQkFBTyxDQUFDLDhFQUF3QjtBQUNoQyxtQkFBTyxDQUFDLHNGQUE0QjtBQUNwQyxtQkFBTyxDQUFDLGtHQUFrQztBQUMxQyxtQkFBTyxDQUFDLDBGQUE4QjtBQUN0QyxtQkFBTyxDQUFDLGdHQUFpQztBQUN6QyxtQkFBTyxDQUFDLDBGQUE4QjtBQUN0QyxtQkFBTyxDQUFD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LHNHQUFvQztBQUM1QyxtQkFBTyxDQUFDLG9GQUEyQjtBQUNuQyxtQkFBTyxDQUFDLG9GQUEyQjtBQUNuQyxtQkFBTyxDQUFDLDBFQUFzQjtBQUM5QixtQkFBTyxDQUFDLDBFQUFzQjtBQUM5QixtQkFBTyxDQUFDLG9GQUEyQjtBQUNuQyxtQkFBTyxDQUFDLG9GQUEyQjtBQUNuQyxtQkFBTyxDQUFDLDhFQUF3QjtBQUNoQyxtQkFBTyxDQUFDLDhFQUF3QjtBQUNoQyxtQkFBTyxDQUFDLHdGQUE2QjtBQUNyQyxtQkFBTyxDQUFDLHdGQUE2QjtBQUNyQyxtQkFBTyxDQUFDLDBFQUFzQjtBQUM5QixtQkFBTyxDQUFDLHdGQUE2QjtBQUNyQyxtQkFBTyxDQUFDLDBGQUE4QjtBQUN0QyxtQkFBTyxDQUFDLGtGQUEwQjtBQUNsQyxtQkFBTyxDQUFDLDhGQUFnQztBQUN4QyxtQkFBTyxDQUFDLHNGQUE0QjtBQUNwQyxtQkFBTyxDQUFDLG9GQUEyQjtBQUNuQyxtQkFBTyxDQUFDLGtGQUEwQjtBQUNsQyxtQkFBTyxDQUFDLGtGQUEwQjtBQUNsQyxtQkFBTyxDQUFDLGtGQUEwQjtBQUNsQyxtQkFBTyxDQUFDLDhGQUFnQztBQUN4QyxtQkFBTyxDQUFDLHNGQUE0QjtBQUNwQyxtQkFBTyxDQUFDLGtGQUEwQjtBQUNsQyxtQkFBTyxDQUFDLGtGQUEwQjtBQUNsQyxtQkFBTyxDQUFDLHNGQUE0QjtBQUNwQyxtQkFBTyxDQUFDLDRGQUErQjtBQUN2QyxtQkFBTyxDQUFDLG9GQUEyQjtBQUNuQyxtQkFBTyxDQUFDLDRHQUF1QztBQUMvQyxtQkFBTyxDQUFDLDRHQUF1QztBQUMvQyxtQkFBTyxDQUFDLHNHQUFvQztBQUM1QyxtQkFBTyxDQUFDLGdIQUF5QztBQUNqRCxtQkFBTyxDQUFDLDhHQUF3QztBQUNoRCxtQkFBTyxDQUFDLHdIQUE2QztBQUNyRCxtQkFBTyxDQUFDLHNHQUFvQztBQUM1QyxtQkFBTyxDQUFDLDhHQUF3QztBQUNoRCxtQkFBTyxDQUFDLDhGQUFnQztBQUN4QyxtQkFBTyxDQUFDLHNFQUFvQjtBQUM1QixtQkFBTyxDQUFDLGtGQUEwQjtBQUNsQyxtQkFBTyxDQUFDLDBFQUFzQjtBQUM5QixtQkFBTyxDQUFDLGdGQUF5QjtBQUNqQyxtQkFBTyxDQUFDLHNGQUE0QjtBQUNwQyxpQkFBaUIsbUJBQU8sQ0FBQyxnRUFBaUI7Ozs7Ozs7Ozs7OztBQ3JNMUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0Q0FBNEM7O0FBRTVDIiwiZmlsZSI6Ii4vSlMvcG9seWZpbGwuYXBwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9ub2RlX21vZHVsZXMvYmFiZWwtcG9seWZpbGwvbGliL2luZGV4LmpzXCIpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL3NoaW1cIik7XG5cbnJlcXVpcmUoXCJyZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWVcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL2ZuL3JlZ2V4cC9lc2NhcGVcIik7XG5cbmlmIChnbG9iYWwuX2JhYmVsUG9seWZpbGwpIHtcbiAgdGhyb3cgbmV3IEVycm9yKFwib25seSBvbmUgaW5zdGFuY2Ugb2YgYmFiZWwtcG9seWZpbGwgaXMgYWxsb3dlZFwiKTtcbn1cbmdsb2JhbC5fYmFiZWxQb2x5ZmlsbCA9IHRydWU7XG5cbnZhciBERUZJTkVfUFJPUEVSVFkgPSBcImRlZmluZVByb3BlcnR5XCI7XG5mdW5jdGlvbiBkZWZpbmUoTywga2V5LCB2YWx1ZSkge1xuICBPW2tleV0gfHwgT2JqZWN0W0RFRklORV9QUk9QRVJUWV0oTywga2V5LCB7XG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHZhbHVlOiB2YWx1ZVxuICB9KTtcbn1cblxuZGVmaW5lKFN0cmluZy5wcm90b3R5cGUsIFwicGFkTGVmdFwiLCBcIlwiLnBhZFN0YXJ0KTtcbmRlZmluZShTdHJpbmcucHJvdG90eXBlLCBcInBhZFJpZ2h0XCIsIFwiXCIucGFkRW5kKTtcblxuXCJwb3AscmV2ZXJzZSxzaGlmdCxrZXlzLHZhbHVlcyxlbnRyaWVzLGluZGV4T2YsZXZlcnksc29tZSxmb3JFYWNoLG1hcCxmaWx0ZXIsZmluZCxmaW5kSW5kZXgsaW5jbHVkZXMsam9pbixzbGljZSxjb25jYXQscHVzaCxzcGxpY2UsdW5zaGlmdCxzb3J0LGxhc3RJbmRleE9mLHJlZHVjZSxyZWR1Y2VSaWdodCxjb3B5V2l0aGluLGZpbGxcIi5zcGxpdChcIixcIikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gIFtdW2tleV0gJiYgZGVmaW5lKEFycmF5LCBrZXksIEZ1bmN0aW9uLmNhbGwuYmluZChbXVtrZXldKSk7XG59KTsiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBodHRwczovL3Jhdy5naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL21hc3Rlci9MSUNFTlNFIGZpbGUuIEFuXG4gKiBhZGRpdGlvbmFsIGdyYW50IG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW5cbiAqIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqL1xuXG4hKGZ1bmN0aW9uKGdsb2JhbCkge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICB2YXIgT3AgPSBPYmplY3QucHJvdG90eXBlO1xuICB2YXIgaGFzT3duID0gT3AuaGFzT3duUHJvcGVydHk7XG4gIHZhciB1bmRlZmluZWQ7IC8vIE1vcmUgY29tcHJlc3NpYmxlIHRoYW4gdm9pZCAwLlxuICB2YXIgJFN5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiA/IFN5bWJvbCA6IHt9O1xuICB2YXIgaXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLml0ZXJhdG9yIHx8IFwiQEBpdGVyYXRvclwiO1xuICB2YXIgYXN5bmNJdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuYXN5bmNJdGVyYXRvciB8fCBcIkBAYXN5bmNJdGVyYXRvclwiO1xuICB2YXIgdG9TdHJpbmdUYWdTeW1ib2wgPSAkU3ltYm9sLnRvU3RyaW5nVGFnIHx8IFwiQEB0b1N0cmluZ1RhZ1wiO1xuXG4gIHZhciBpbk1vZHVsZSA9IHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCI7XG4gIHZhciBydW50aW1lID0gZ2xvYmFsLnJlZ2VuZXJhdG9yUnVudGltZTtcbiAgaWYgKHJ1bnRpbWUpIHtcbiAgICBpZiAoaW5Nb2R1bGUpIHtcbiAgICAgIC8vIElmIHJlZ2VuZXJhdG9yUnVudGltZSBpcyBkZWZpbmVkIGdsb2JhbGx5IGFuZCB3ZSdyZSBpbiBhIG1vZHVsZSxcbiAgICAgIC8vIG1ha2UgdGhlIGV4cG9ydHMgb2JqZWN0IGlkZW50aWNhbCB0byByZWdlbmVyYXRvclJ1bnRpbWUuXG4gICAgICBtb2R1bGUuZXhwb3J0cyA9IHJ1bnRpbWU7XG4gICAgfVxuICAgIC8vIERvbid0IGJvdGhlciBldmFsdWF0aW5nIHRoZSByZXN0IG9mIHRoaXMgZmlsZSBpZiB0aGUgcnVudGltZSB3YXNcbiAgICAvLyBhbHJlYWR5IGRlZmluZWQgZ2xvYmFsbHkuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRGVmaW5lIHRoZSBydW50aW1lIGdsb2JhbGx5IChhcyBleHBlY3RlZCBieSBnZW5lcmF0ZWQgY29kZSkgYXMgZWl0aGVyXG4gIC8vIG1vZHVsZS5leHBvcnRzIChpZiB3ZSdyZSBpbiBhIG1vZHVsZSkgb3IgYSBuZXcsIGVtcHR5IG9iamVjdC5cbiAgcnVudGltZSA9IGdsb2JhbC5yZWdlbmVyYXRvclJ1bnRpbWUgPSBpbk1vZHVsZSA/IG1vZHVsZS5leHBvcnRzIDoge307XG5cbiAgZnVuY3Rpb24gd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkge1xuICAgIC8vIElmIG91dGVyRm4gcHJvdmlkZWQgYW5kIG91dGVyRm4ucHJvdG90eXBlIGlzIGEgR2VuZXJhdG9yLCB0aGVuIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yLlxuICAgIHZhciBwcm90b0dlbmVyYXRvciA9IG91dGVyRm4gJiYgb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IgPyBvdXRlckZuIDogR2VuZXJhdG9yO1xuICAgIHZhciBnZW5lcmF0b3IgPSBPYmplY3QuY3JlYXRlKHByb3RvR2VuZXJhdG9yLnByb3RvdHlwZSk7XG4gICAgdmFyIGNvbnRleHQgPSBuZXcgQ29udGV4dCh0cnlMb2NzTGlzdCB8fCBbXSk7XG5cbiAgICAvLyBUaGUgLl9pbnZva2UgbWV0aG9kIHVuaWZpZXMgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzLlxuICAgIGdlbmVyYXRvci5faW52b2tlID0gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBnZW5lcmF0b3I7XG4gIH1cbiAgcnVudGltZS53cmFwID0gd3JhcDtcblxuICAvLyBUcnkvY2F0Y2ggaGVscGVyIHRvIG1pbmltaXplIGRlb3B0aW1pemF0aW9ucy4gUmV0dXJucyBhIGNvbXBsZXRpb25cbiAgLy8gcmVjb3JkIGxpa2UgY29udGV4dC50cnlFbnRyaWVzW2ldLmNvbXBsZXRpb24uIFRoaXMgaW50ZXJmYWNlIGNvdWxkXG4gIC8vIGhhdmUgYmVlbiAoYW5kIHdhcyBwcmV2aW91c2x5KSBkZXNpZ25lZCB0byB0YWtlIGEgY2xvc3VyZSB0byBiZVxuICAvLyBpbnZva2VkIHdpdGhvdXQgYXJndW1lbnRzLCBidXQgaW4gYWxsIHRoZSBjYXNlcyB3ZSBjYXJlIGFib3V0IHdlXG4gIC8vIGFscmVhZHkgaGF2ZSBhbiBleGlzdGluZyBtZXRob2Qgd2Ugd2FudCB0byBjYWxsLCBzbyB0aGVyZSdzIG5vIG5lZWRcbiAgLy8gdG8gY3JlYXRlIGEgbmV3IGZ1bmN0aW9uIG9iamVjdC4gV2UgY2FuIGV2ZW4gZ2V0IGF3YXkgd2l0aCBhc3N1bWluZ1xuICAvLyB0aGUgbWV0aG9kIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50LCBzaW5jZSB0aGF0IGhhcHBlbnMgdG8gYmUgdHJ1ZVxuICAvLyBpbiBldmVyeSBjYXNlLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHRvdWNoIHRoZSBhcmd1bWVudHMgb2JqZWN0LiBUaGVcbiAgLy8gb25seSBhZGRpdGlvbmFsIGFsbG9jYXRpb24gcmVxdWlyZWQgaXMgdGhlIGNvbXBsZXRpb24gcmVjb3JkLCB3aGljaFxuICAvLyBoYXMgYSBzdGFibGUgc2hhcGUgYW5kIHNvIGhvcGVmdWxseSBzaG91bGQgYmUgY2hlYXAgdG8gYWxsb2NhdGUuXG4gIGZ1bmN0aW9uIHRyeUNhdGNoKGZuLCBvYmosIGFyZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcIm5vcm1hbFwiLCBhcmc6IGZuLmNhbGwob2JqLCBhcmcpIH07XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcInRocm93XCIsIGFyZzogZXJyIH07XG4gICAgfVxuICB9XG5cbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkU3RhcnQgPSBcInN1c3BlbmRlZFN0YXJ0XCI7XG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkID0gXCJzdXNwZW5kZWRZaWVsZFwiO1xuICB2YXIgR2VuU3RhdGVFeGVjdXRpbmcgPSBcImV4ZWN1dGluZ1wiO1xuICB2YXIgR2VuU3RhdGVDb21wbGV0ZWQgPSBcImNvbXBsZXRlZFwiO1xuXG4gIC8vIFJldHVybmluZyB0aGlzIG9iamVjdCBmcm9tIHRoZSBpbm5lckZuIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXNcbiAgLy8gYnJlYWtpbmcgb3V0IG9mIHRoZSBkaXNwYXRjaCBzd2l0Y2ggc3RhdGVtZW50LlxuICB2YXIgQ29udGludWVTZW50aW5lbCA9IHt9O1xuXG4gIC8vIER1bW15IGNvbnN0cnVjdG9yIGZ1bmN0aW9ucyB0aGF0IHdlIHVzZSBhcyB0aGUgLmNvbnN0cnVjdG9yIGFuZFxuICAvLyAuY29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMgZm9yIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBHZW5lcmF0b3JcbiAgLy8gb2JqZWN0cy4gRm9yIGZ1bGwgc3BlYyBjb21wbGlhbmNlLCB5b3UgbWF5IHdpc2ggdG8gY29uZmlndXJlIHlvdXJcbiAgLy8gbWluaWZpZXIgbm90IHRvIG1hbmdsZSB0aGUgbmFtZXMgb2YgdGhlc2UgdHdvIGZ1bmN0aW9ucy5cbiAgZnVuY3Rpb24gR2VuZXJhdG9yKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb24oKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSgpIHt9XG5cbiAgLy8gVGhpcyBpcyBhIHBvbHlmaWxsIGZvciAlSXRlcmF0b3JQcm90b3R5cGUlIGZvciBlbnZpcm9ubWVudHMgdGhhdFxuICAvLyBkb24ndCBuYXRpdmVseSBzdXBwb3J0IGl0LlxuICB2YXIgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcbiAgSXRlcmF0b3JQcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIHZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbiAgdmFyIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG8gJiYgZ2V0UHJvdG8oZ2V0UHJvdG8odmFsdWVzKFtdKSkpO1xuICBpZiAoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgJiZcbiAgICAgIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPcCAmJlxuICAgICAgaGFzT3duLmNhbGwoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUsIGl0ZXJhdG9yU3ltYm9sKSkge1xuICAgIC8vIFRoaXMgZW52aXJvbm1lbnQgaGFzIGEgbmF0aXZlICVJdGVyYXRvclByb3RvdHlwZSU7IHVzZSBpdCBpbnN0ZWFkXG4gICAgLy8gb2YgdGhlIHBvbHlmaWxsLlxuICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gTmF0aXZlSXRlcmF0b3JQcm90b3R5cGU7XG4gIH1cblxuICB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPVxuICAgIEdlbmVyYXRvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlKTtcbiAgR2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlID0gR3AuY29uc3RydWN0b3IgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUuY29uc3RydWN0b3IgPSBHZW5lcmF0b3JGdW5jdGlvbjtcbiAgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGVbdG9TdHJpbmdUYWdTeW1ib2xdID1cbiAgICBHZW5lcmF0b3JGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IFwiR2VuZXJhdG9yRnVuY3Rpb25cIjtcblxuICAvLyBIZWxwZXIgZm9yIGRlZmluaW5nIHRoZSAubmV4dCwgLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzIG9mIHRoZVxuICAvLyBJdGVyYXRvciBpbnRlcmZhY2UgaW4gdGVybXMgb2YgYSBzaW5nbGUgLl9pbnZva2UgbWV0aG9kLlxuICBmdW5jdGlvbiBkZWZpbmVJdGVyYXRvck1ldGhvZHMocHJvdG90eXBlKSB7XG4gICAgW1wibmV4dFwiLCBcInRocm93XCIsIFwicmV0dXJuXCJdLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICBwcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKGFyZykge1xuICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlKG1ldGhvZCwgYXJnKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBydW50aW1lLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICB2YXIgY3RvciA9IHR5cGVvZiBnZW5GdW4gPT09IFwiZnVuY3Rpb25cIiAmJiBnZW5GdW4uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIGN0b3JcbiAgICAgID8gY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHxcbiAgICAgICAgLy8gRm9yIHRoZSBuYXRpdmUgR2VuZXJhdG9yRnVuY3Rpb24gY29uc3RydWN0b3IsIHRoZSBiZXN0IHdlIGNhblxuICAgICAgICAvLyBkbyBpcyB0byBjaGVjayBpdHMgLm5hbWUgcHJvcGVydHkuXG4gICAgICAgIChjdG9yLmRpc3BsYXlOYW1lIHx8IGN0b3IubmFtZSkgPT09IFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICAgICAgOiBmYWxzZTtcbiAgfTtcblxuICBydW50aW1lLm1hcmsgPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSB7XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlbkZ1bi5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgICAgIGlmICghKHRvU3RyaW5nVGFnU3ltYm9sIGluIGdlbkZ1bikpIHtcbiAgICAgICAgZ2VuRnVuW3RvU3RyaW5nVGFnU3ltYm9sXSA9IFwiR2VuZXJhdG9yRnVuY3Rpb25cIjtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2VuRnVuLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoR3ApO1xuICAgIHJldHVybiBnZW5GdW47XG4gIH07XG5cbiAgLy8gV2l0aGluIHRoZSBib2R5IG9mIGFueSBhc3luYyBmdW5jdGlvbiwgYGF3YWl0IHhgIGlzIHRyYW5zZm9ybWVkIHRvXG4gIC8vIGB5aWVsZCByZWdlbmVyYXRvclJ1bnRpbWUuYXdyYXAoeClgLCBzbyB0aGF0IHRoZSBydW50aW1lIGNhbiB0ZXN0XG4gIC8vIGBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpYCB0byBkZXRlcm1pbmUgaWYgdGhlIHlpZWxkZWQgdmFsdWUgaXNcbiAgLy8gbWVhbnQgdG8gYmUgYXdhaXRlZC5cbiAgcnVudGltZS5hd3JhcCA9IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiB7IF9fYXdhaXQ6IGFyZyB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIEFzeW5jSXRlcmF0b3IoZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChnZW5lcmF0b3JbbWV0aG9kXSwgZ2VuZXJhdG9yLCBhcmcpO1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgcmVqZWN0KHJlY29yZC5hcmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlY29yZC5hcmc7XG4gICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIikpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIGludm9rZShcIm5leHRcIiwgdmFsdWUsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJ0aHJvd1wiLCBlcnIsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKGZ1bmN0aW9uKHVud3JhcHBlZCkge1xuICAgICAgICAgIC8vIFdoZW4gYSB5aWVsZGVkIFByb21pc2UgaXMgcmVzb2x2ZWQsIGl0cyBmaW5hbCB2YWx1ZSBiZWNvbWVzXG4gICAgICAgICAgLy8gdGhlIC52YWx1ZSBvZiB0aGUgUHJvbWlzZTx7dmFsdWUsZG9uZX0+IHJlc3VsdCBmb3IgdGhlXG4gICAgICAgICAgLy8gY3VycmVudCBpdGVyYXRpb24uIElmIHRoZSBQcm9taXNlIGlzIHJlamVjdGVkLCBob3dldmVyLCB0aGVcbiAgICAgICAgICAvLyByZXN1bHQgZm9yIHRoaXMgaXRlcmF0aW9uIHdpbGwgYmUgcmVqZWN0ZWQgd2l0aCB0aGUgc2FtZVxuICAgICAgICAgIC8vIHJlYXNvbi4gTm90ZSB0aGF0IHJlamVjdGlvbnMgb2YgeWllbGRlZCBQcm9taXNlcyBhcmUgbm90XG4gICAgICAgICAgLy8gdGhyb3duIGJhY2sgaW50byB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uLCBhcyBpcyB0aGUgY2FzZVxuICAgICAgICAgIC8vIHdoZW4gYW4gYXdhaXRlZCBQcm9taXNlIGlzIHJlamVjdGVkLiBUaGlzIGRpZmZlcmVuY2UgaW5cbiAgICAgICAgICAvLyBiZWhhdmlvciBiZXR3ZWVuIHlpZWxkIGFuZCBhd2FpdCBpcyBpbXBvcnRhbnQsIGJlY2F1c2UgaXRcbiAgICAgICAgICAvLyBhbGxvd3MgdGhlIGNvbnN1bWVyIHRvIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGggdGhlIHlpZWxkZWRcbiAgICAgICAgICAvLyByZWplY3Rpb24gKHN3YWxsb3cgaXQgYW5kIGNvbnRpbnVlLCBtYW51YWxseSAudGhyb3cgaXQgYmFja1xuICAgICAgICAgIC8vIGludG8gdGhlIGdlbmVyYXRvciwgYWJhbmRvbiBpdGVyYXRpb24sIHdoYXRldmVyKS4gV2l0aFxuICAgICAgICAgIC8vIGF3YWl0LCBieSBjb250cmFzdCwgdGhlcmUgaXMgbm8gb3Bwb3J0dW5pdHkgdG8gZXhhbWluZSB0aGVcbiAgICAgICAgICAvLyByZWplY3Rpb24gcmVhc29uIG91dHNpZGUgdGhlIGdlbmVyYXRvciBmdW5jdGlvbiwgc28gdGhlXG4gICAgICAgICAgLy8gb25seSBvcHRpb24gaXMgdG8gdGhyb3cgaXQgZnJvbSB0aGUgYXdhaXQgZXhwcmVzc2lvbiwgYW5kXG4gICAgICAgICAgLy8gbGV0IHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24gaGFuZGxlIHRoZSBleGNlcHRpb24uXG4gICAgICAgICAgcmVzdWx0LnZhbHVlID0gdW53cmFwcGVkO1xuICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGdsb2JhbC5wcm9jZXNzID09PSBcIm9iamVjdFwiICYmIGdsb2JhbC5wcm9jZXNzLmRvbWFpbikge1xuICAgICAgaW52b2tlID0gZ2xvYmFsLnByb2Nlc3MuZG9tYWluLmJpbmQoaW52b2tlKTtcbiAgICB9XG5cbiAgICB2YXIgcHJldmlvdXNQcm9taXNlO1xuXG4gICAgZnVuY3Rpb24gZW5xdWV1ZShtZXRob2QsIGFyZykge1xuICAgICAgZnVuY3Rpb24gY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlID1cbiAgICAgICAgLy8gSWYgZW5xdWV1ZSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gd2FpdCB1bnRpbFxuICAgICAgICAvLyBhbGwgcHJldmlvdXMgUHJvbWlzZXMgaGF2ZSBiZWVuIHJlc29sdmVkIGJlZm9yZSBjYWxsaW5nIGludm9rZSxcbiAgICAgICAgLy8gc28gdGhhdCByZXN1bHRzIGFyZSBhbHdheXMgZGVsaXZlcmVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLiBJZlxuICAgICAgICAvLyBlbnF1ZXVlIGhhcyBub3QgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIGl0IGlzIGltcG9ydGFudCB0b1xuICAgICAgICAvLyBjYWxsIGludm9rZSBpbW1lZGlhdGVseSwgd2l0aG91dCB3YWl0aW5nIG9uIGEgY2FsbGJhY2sgdG8gZmlyZSxcbiAgICAgICAgLy8gc28gdGhhdCB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIGhhcyB0aGUgb3Bwb3J0dW5pdHkgdG8gZG9cbiAgICAgICAgLy8gYW55IG5lY2Vzc2FyeSBzZXR1cCBpbiBhIHByZWRpY3RhYmxlIHdheS4gVGhpcyBwcmVkaWN0YWJpbGl0eVxuICAgICAgICAvLyBpcyB3aHkgdGhlIFByb21pc2UgY29uc3RydWN0b3Igc3luY2hyb25vdXNseSBpbnZva2VzIGl0c1xuICAgICAgICAvLyBleGVjdXRvciBjYWxsYmFjaywgYW5kIHdoeSBhc3luYyBmdW5jdGlvbnMgc3luY2hyb25vdXNseVxuICAgICAgICAvLyBleGVjdXRlIGNvZGUgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdC4gU2luY2Ugd2UgaW1wbGVtZW50IHNpbXBsZVxuICAgICAgICAvLyBhc3luYyBmdW5jdGlvbnMgaW4gdGVybXMgb2YgYXN5bmMgZ2VuZXJhdG9ycywgaXQgaXMgZXNwZWNpYWxseVxuICAgICAgICAvLyBpbXBvcnRhbnQgdG8gZ2V0IHRoaXMgcmlnaHQsIGV2ZW4gdGhvdWdoIGl0IHJlcXVpcmVzIGNhcmUuXG4gICAgICAgIHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKFxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLFxuICAgICAgICAgIC8vIEF2b2lkIHByb3BhZ2F0aW5nIGZhaWx1cmVzIHRvIFByb21pc2VzIHJldHVybmVkIGJ5IGxhdGVyXG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgb2YgdGhlIGl0ZXJhdG9yLlxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnXG4gICAgICAgICkgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpO1xuICAgIH1cblxuICAgIC8vIERlZmluZSB0aGUgdW5pZmllZCBoZWxwZXIgbWV0aG9kIHRoYXQgaXMgdXNlZCB0byBpbXBsZW1lbnQgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiAoc2VlIGRlZmluZUl0ZXJhdG9yTWV0aG9kcykuXG4gICAgdGhpcy5faW52b2tlID0gZW5xdWV1ZTtcbiAgfVxuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSk7XG4gIEFzeW5jSXRlcmF0b3IucHJvdG90eXBlW2FzeW5jSXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICBydW50aW1lLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yO1xuXG4gIC8vIE5vdGUgdGhhdCBzaW1wbGUgYXN5bmMgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBvbiB0b3Agb2ZcbiAgLy8gQXN5bmNJdGVyYXRvciBvYmplY3RzOyB0aGV5IGp1c3QgcmV0dXJuIGEgUHJvbWlzZSBmb3IgdGhlIHZhbHVlIG9mXG4gIC8vIHRoZSBmaW5hbCByZXN1bHQgcHJvZHVjZWQgYnkgdGhlIGl0ZXJhdG9yLlxuICBydW50aW1lLmFzeW5jID0gZnVuY3Rpb24oaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICB2YXIgaXRlciA9IG5ldyBBc3luY0l0ZXJhdG9yKFxuICAgICAgd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdClcbiAgICApO1xuXG4gICAgcmV0dXJuIHJ1bnRpbWUuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKVxuICAgICAgPyBpdGVyIC8vIElmIG91dGVyRm4gaXMgYSBnZW5lcmF0b3IsIHJldHVybiB0aGUgZnVsbCBpdGVyYXRvci5cbiAgICAgIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTtcbiAgICAgICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7XG4gICAgdmFyIHN0YXRlID0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydDtcblxuICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVFeGVjdXRpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZ1wiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUNvbXBsZXRlZCkge1xuICAgICAgICBpZiAobWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICB0aHJvdyBhcmc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZSBmb3JnaXZpbmcsIHBlciAyNS4zLjMuMy4zIG9mIHRoZSBzcGVjOlxuICAgICAgICAvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtZ2VuZXJhdG9ycmVzdW1lXG4gICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQubWV0aG9kID0gbWV0aG9kO1xuICAgICAgY29udGV4dC5hcmcgPSBhcmc7XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7XG4gICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTtcbiAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZVJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgICAgLy8gU2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgICBjb250ZXh0LnNlbnQgPSBjb250ZXh0Ll9zZW50ID0gY29udGV4dC5hcmc7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0KSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgICAgdGhyb3cgY29udGV4dC5hcmc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGNvbnRleHQuYXJnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlID0gR2VuU3RhdGVFeGVjdXRpbmc7XG5cbiAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgICAvLyBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gaW5uZXJGbiwgd2UgbGVhdmUgc3RhdGUgPT09XG4gICAgICAgICAgLy8gR2VuU3RhdGVFeGVjdXRpbmcgYW5kIGxvb3AgYmFjayBmb3IgYW5vdGhlciBpbnZvY2F0aW9uLlxuICAgICAgICAgIHN0YXRlID0gY29udGV4dC5kb25lXG4gICAgICAgICAgICA/IEdlblN0YXRlQ29tcGxldGVkXG4gICAgICAgICAgICA6IEdlblN0YXRlU3VzcGVuZGVkWWllbGQ7XG5cbiAgICAgICAgICBpZiAocmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiByZWNvcmQuYXJnLFxuICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lXG4gICAgICAgICAgfTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgIC8vIERpc3BhdGNoIHRoZSBleGNlcHRpb24gYnkgbG9vcGluZyBiYWNrIGFyb3VuZCB0byB0aGVcbiAgICAgICAgICAvLyBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKSBjYWxsIGFib3ZlLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBDYWxsIGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXShjb250ZXh0LmFyZykgYW5kIGhhbmRsZSB0aGVcbiAgLy8gcmVzdWx0LCBlaXRoZXIgYnkgcmV0dXJuaW5nIGEgeyB2YWx1ZSwgZG9uZSB9IHJlc3VsdCBmcm9tIHRoZVxuICAvLyBkZWxlZ2F0ZSBpdGVyYXRvciwgb3IgYnkgbW9kaWZ5aW5nIGNvbnRleHQubWV0aG9kIGFuZCBjb250ZXh0LmFyZyxcbiAgLy8gc2V0dGluZyBjb250ZXh0LmRlbGVnYXRlIHRvIG51bGwsIGFuZCByZXR1cm5pbmcgdGhlIENvbnRpbnVlU2VudGluZWwuXG4gIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdO1xuICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQSAudGhyb3cgb3IgLnJldHVybiB3aGVuIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgbm8gLnRocm93XG4gICAgICAvLyBtZXRob2QgYWx3YXlzIHRlcm1pbmF0ZXMgdGhlIHlpZWxkKiBsb29wLlxuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIGlmIChkZWxlZ2F0ZS5pdGVyYXRvci5yZXR1cm4pIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIGEgcmV0dXJuIG1ldGhvZCwgZ2l2ZSBpdCBhXG4gICAgICAgICAgLy8gY2hhbmNlIHRvIGNsZWFuIHVwLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcblxuICAgICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICAvLyBJZiBtYXliZUludm9rZURlbGVnYXRlKGNvbnRleHQpIGNoYW5nZWQgY29udGV4dC5tZXRob2QgZnJvbVxuICAgICAgICAgICAgLy8gXCJyZXR1cm5cIiB0byBcInRocm93XCIsIGxldCB0aGF0IG92ZXJyaWRlIHRoZSBUeXBlRXJyb3IgYmVsb3cuXG4gICAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIFwiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZFwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKG1ldGhvZCwgZGVsZWdhdGUuaXRlcmF0b3IsIGNvbnRleHQuYXJnKTtcblxuICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIGluZm8gPSByZWNvcmQuYXJnO1xuXG4gICAgaWYgKCEgaW5mbykge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdFwiKTtcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgLy8gQXNzaWduIHRoZSByZXN1bHQgb2YgdGhlIGZpbmlzaGVkIGRlbGVnYXRlIHRvIHRoZSB0ZW1wb3JhcnlcbiAgICAgIC8vIHZhcmlhYmxlIHNwZWNpZmllZCBieSBkZWxlZ2F0ZS5yZXN1bHROYW1lIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZTtcblxuICAgICAgLy8gUmVzdW1lIGV4ZWN1dGlvbiBhdCB0aGUgZGVzaXJlZCBsb2NhdGlvbiAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dC5uZXh0ID0gZGVsZWdhdGUubmV4dExvYztcblxuICAgICAgLy8gSWYgY29udGV4dC5tZXRob2Qgd2FzIFwidGhyb3dcIiBidXQgdGhlIGRlbGVnYXRlIGhhbmRsZWQgdGhlXG4gICAgICAvLyBleGNlcHRpb24sIGxldCB0aGUgb3V0ZXIgZ2VuZXJhdG9yIHByb2NlZWQgbm9ybWFsbHkuIElmXG4gICAgICAvLyBjb250ZXh0Lm1ldGhvZCB3YXMgXCJuZXh0XCIsIGZvcmdldCBjb250ZXh0LmFyZyBzaW5jZSBpdCBoYXMgYmVlblxuICAgICAgLy8gXCJjb25zdW1lZFwiIGJ5IHRoZSBkZWxlZ2F0ZSBpdGVyYXRvci4gSWYgY29udGV4dC5tZXRob2Qgd2FzXG4gICAgICAvLyBcInJldHVyblwiLCBhbGxvdyB0aGUgb3JpZ2luYWwgLnJldHVybiBjYWxsIHRvIGNvbnRpbnVlIGluIHRoZVxuICAgICAgLy8gb3V0ZXIgZ2VuZXJhdG9yLlxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kICE9PSBcInJldHVyblwiKSB7XG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlLXlpZWxkIHRoZSByZXN1bHQgcmV0dXJuZWQgYnkgdGhlIGRlbGVnYXRlIG1ldGhvZC5cbiAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cblxuICAgIC8vIFRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBpcyBmaW5pc2hlZCwgc28gZm9yZ2V0IGl0IGFuZCBjb250aW51ZSB3aXRoXG4gICAgLy8gdGhlIG91dGVyIGdlbmVyYXRvci5cbiAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgfVxuXG4gIC8vIERlZmluZSBHZW5lcmF0b3IucHJvdG90eXBlLntuZXh0LHRocm93LHJldHVybn0gaW4gdGVybXMgb2YgdGhlXG4gIC8vIHVuaWZpZWQgLl9pbnZva2UgaGVscGVyIG1ldGhvZC5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEdwKTtcblxuICBHcFt0b1N0cmluZ1RhZ1N5bWJvbF0gPSBcIkdlbmVyYXRvclwiO1xuXG4gIC8vIEEgR2VuZXJhdG9yIHNob3VsZCBhbHdheXMgcmV0dXJuIGl0c2VsZiBhcyB0aGUgaXRlcmF0b3Igb2JqZWN0IHdoZW4gdGhlXG4gIC8vIEBAaXRlcmF0b3IgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGl0LiBTb21lIGJyb3dzZXJzJyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlXG4gIC8vIGl0ZXJhdG9yIHByb3RvdHlwZSBjaGFpbiBpbmNvcnJlY3RseSBpbXBsZW1lbnQgdGhpcywgY2F1c2luZyB0aGUgR2VuZXJhdG9yXG4gIC8vIG9iamVjdCB0byBub3QgYmUgcmV0dXJuZWQgZnJvbSB0aGlzIGNhbGwuIFRoaXMgZW5zdXJlcyB0aGF0IGRvZXNuJ3QgaGFwcGVuLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2lzc3Vlcy8yNzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgR3BbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgR3AudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJbb2JqZWN0IEdlbmVyYXRvcl1cIjtcbiAgfTtcblxuICBmdW5jdGlvbiBwdXNoVHJ5RW50cnkobG9jcykge1xuICAgIHZhciBlbnRyeSA9IHsgdHJ5TG9jOiBsb2NzWzBdIH07XG5cbiAgICBpZiAoMSBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5jYXRjaExvYyA9IGxvY3NbMV07XG4gICAgfVxuXG4gICAgaWYgKDIgaW4gbG9jcykge1xuICAgICAgZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl07XG4gICAgICBlbnRyeS5hZnRlckxvYyA9IGxvY3NbM107XG4gICAgfVxuXG4gICAgdGhpcy50cnlFbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXRUcnlFbnRyeShlbnRyeSkge1xuICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uIHx8IHt9O1xuICAgIHJlY29yZC50eXBlID0gXCJub3JtYWxcIjtcbiAgICBkZWxldGUgcmVjb3JkLmFyZztcbiAgICBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkO1xuICB9XG5cbiAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkge1xuICAgIC8vIFRoZSByb290IGVudHJ5IG9iamVjdCAoZWZmZWN0aXZlbHkgYSB0cnkgc3RhdGVtZW50IHdpdGhvdXQgYSBjYXRjaFxuICAgIC8vIG9yIGEgZmluYWxseSBibG9jaykgZ2l2ZXMgdXMgYSBwbGFjZSB0byBzdG9yZSB2YWx1ZXMgdGhyb3duIGZyb21cbiAgICAvLyBsb2NhdGlvbnMgd2hlcmUgdGhlcmUgaXMgbm8gZW5jbG9zaW5nIHRyeSBzdGF0ZW1lbnQuXG4gICAgdGhpcy50cnlFbnRyaWVzID0gW3sgdHJ5TG9jOiBcInJvb3RcIiB9XTtcbiAgICB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyk7XG4gICAgdGhpcy5yZXNldCh0cnVlKTtcbiAgfVxuXG4gIHJ1bnRpbWUua2V5cyA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIGtleXMucmV2ZXJzZSgpO1xuXG4gICAgLy8gUmF0aGVyIHRoYW4gcmV0dXJuaW5nIGFuIG9iamVjdCB3aXRoIGEgbmV4dCBtZXRob2QsIHdlIGtlZXBcbiAgICAvLyB0aGluZ3Mgc2ltcGxlIGFuZCByZXR1cm4gdGhlIG5leHQgZnVuY3Rpb24gaXRzZWxmLlxuICAgIHJldHVybiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgd2hpbGUgKGtleXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzLnBvcCgpO1xuICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkge1xuICAgICAgICAgIG5leHQudmFsdWUgPSBrZXk7XG4gICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVG8gYXZvaWQgY3JlYXRpbmcgYW4gYWRkaXRpb25hbCBvYmplY3QsIHdlIGp1c3QgaGFuZyB0aGUgLnZhbHVlXG4gICAgICAvLyBhbmQgLmRvbmUgcHJvcGVydGllcyBvZmYgdGhlIG5leHQgZnVuY3Rpb24gb2JqZWN0IGl0c2VsZi4gVGhpc1xuICAgICAgLy8gYWxzbyBlbnN1cmVzIHRoYXQgdGhlIG1pbmlmaWVyIHdpbGwgbm90IGFub255bWl6ZSB0aGUgZnVuY3Rpb24uXG4gICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfTtcbiAgfTtcblxuICBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHtcbiAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTtcbiAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaXRlcmFibGUubmV4dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBpdGVyYWJsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBpID0gLTEsIG5leHQgPSBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgIHdoaWxlICgrK2kgPCBpdGVyYWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHtcbiAgICAgICAgICAgICAgbmV4dC52YWx1ZSA9IGl0ZXJhYmxlW2ldO1xuICAgICAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV4dC52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGFuIGl0ZXJhdG9yIHdpdGggbm8gdmFsdWVzLlxuICAgIHJldHVybiB7IG5leHQ6IGRvbmVSZXN1bHQgfTtcbiAgfVxuICBydW50aW1lLnZhbHVlcyA9IHZhbHVlcztcblxuICBmdW5jdGlvbiBkb25lUmVzdWx0KCkge1xuICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgfVxuXG4gIENvbnRleHQucHJvdG90eXBlID0ge1xuICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKHNraXBUZW1wUmVzZXQpIHtcbiAgICAgIHRoaXMucHJldiA9IDA7XG4gICAgICB0aGlzLm5leHQgPSAwO1xuICAgICAgLy8gUmVzZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICB0aGlzLnNlbnQgPSB0aGlzLl9zZW50ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICB0aGlzLmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuXG4gICAgICB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KTtcblxuICAgICAgaWYgKCFza2lwVGVtcFJlc2V0KSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcykge1xuICAgICAgICAgIC8vIE5vdCBzdXJlIGFib3V0IHRoZSBvcHRpbWFsIG9yZGVyIG9mIHRoZXNlIGNvbmRpdGlvbnM6XG4gICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09PSBcInRcIiAmJlxuICAgICAgICAgICAgICBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJlxuICAgICAgICAgICAgICAhaXNOYU4oK25hbWUuc2xpY2UoMSkpKSB7XG4gICAgICAgICAgICB0aGlzW25hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG5cbiAgICAgIHZhciByb290RW50cnkgPSB0aGlzLnRyeUVudHJpZXNbMF07XG4gICAgICB2YXIgcm9vdFJlY29yZCA9IHJvb3RFbnRyeS5jb21wbGV0aW9uO1xuICAgICAgaWYgKHJvb3RSZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJvb3RSZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5ydmFsO1xuICAgIH0sXG5cbiAgICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24oZXhjZXB0aW9uKSB7XG4gICAgICBpZiAodGhpcy5kb25lKSB7XG4gICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7XG4gICAgICAgIHJlY29yZC50eXBlID0gXCJ0aHJvd1wiO1xuICAgICAgICByZWNvcmQuYXJnID0gZXhjZXB0aW9uO1xuICAgICAgICBjb250ZXh0Lm5leHQgPSBsb2M7XG5cbiAgICAgICAgaWYgKGNhdWdodCkge1xuICAgICAgICAgIC8vIElmIHRoZSBkaXNwYXRjaGVkIGV4Y2VwdGlvbiB3YXMgY2F1Z2h0IGJ5IGEgY2F0Y2ggYmxvY2ssXG4gICAgICAgICAgLy8gdGhlbiBsZXQgdGhhdCBjYXRjaCBibG9jayBoYW5kbGUgdGhlIGV4Y2VwdGlvbiBub3JtYWxseS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEhIGNhdWdodDtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IFwicm9vdFwiKSB7XG4gICAgICAgICAgLy8gRXhjZXB0aW9uIHRocm93biBvdXRzaWRlIG9mIGFueSB0cnkgYmxvY2sgdGhhdCBjb3VsZCBoYW5kbGVcbiAgICAgICAgICAvLyBpdCwgc28gc2V0IHRoZSBjb21wbGV0aW9uIHZhbHVlIG9mIHRoZSBlbnRpcmUgZnVuY3Rpb24gdG9cbiAgICAgICAgICAvLyB0aHJvdyB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJldHVybiBoYW5kbGUoXCJlbmRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikge1xuICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCBcImNhdGNoTG9jXCIpO1xuICAgICAgICAgIHZhciBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKTtcblxuICAgICAgICAgIGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzQ2F0Y2gpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYWJydXB0OiBmdW5jdGlvbih0eXBlLCBhcmcpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKSAmJlxuICAgICAgICAgICAgdGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmluYWxseUVudHJ5ICYmXG4gICAgICAgICAgKHR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgICB0eXBlID09PSBcImNvbnRpbnVlXCIpICYmXG4gICAgICAgICAgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiZcbiAgICAgICAgICBhcmcgPD0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgLy8gSWdub3JlIHRoZSBmaW5hbGx5IGVudHJ5IGlmIGNvbnRyb2wgaXMgbm90IGp1bXBpbmcgdG8gYVxuICAgICAgICAvLyBsb2NhdGlvbiBvdXRzaWRlIHRoZSB0cnkvY2F0Y2ggYmxvY2suXG4gICAgICAgIGZpbmFsbHlFbnRyeSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9O1xuICAgICAgcmVjb3JkLnR5cGUgPSB0eXBlO1xuICAgICAgcmVjb3JkLmFyZyA9IGFyZztcblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSkge1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYztcbiAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbXBsZXRlKHJlY29yZCk7XG4gICAgfSxcblxuICAgIGNvbXBsZXRlOiBmdW5jdGlvbihyZWNvcmQsIGFmdGVyTG9jKSB7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgIHJlY29yZC50eXBlID09PSBcImNvbnRpbnVlXCIpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gcmVjb3JkLmFyZztcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgdGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgIHRoaXMubmV4dCA9IFwiZW5kXCI7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiICYmIGFmdGVyTG9jKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IGFmdGVyTG9jO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbihmaW5hbGx5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlKGVudHJ5LmNvbXBsZXRpb24sIGVudHJ5LmFmdGVyTG9jKTtcbiAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBcImNhdGNoXCI6IGZ1bmN0aW9uKHRyeUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IHRyeUxvYykge1xuICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZztcbiAgICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhyb3duO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBjb250ZXh0LmNhdGNoIG1ldGhvZCBtdXN0IG9ubHkgYmUgY2FsbGVkIHdpdGggYSBsb2NhdGlvblxuICAgICAgLy8gYXJndW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byBhIGtub3duIGNhdGNoIGJsb2NrLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCBjYXRjaCBhdHRlbXB0XCIpO1xuICAgIH0sXG5cbiAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbihpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykge1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IHtcbiAgICAgICAgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksXG4gICAgICAgIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsXG4gICAgICAgIG5leHRMb2M6IG5leHRMb2NcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IGZvcmdldCB0aGUgbGFzdCBzZW50IHZhbHVlIHNvIHRoYXQgd2UgZG9uJ3RcbiAgICAgICAgLy8gYWNjaWRlbnRhbGx5IHBhc3MgaXQgb24gdG8gdGhlIGRlbGVnYXRlLlxuICAgICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuICB9O1xufSkoXG4gIC8vIEFtb25nIHRoZSB2YXJpb3VzIHRyaWNrcyBmb3Igb2J0YWluaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWxcbiAgLy8gb2JqZWN0LCB0aGlzIHNlZW1zIHRvIGJlIHRoZSBtb3N0IHJlbGlhYmxlIHRlY2huaXF1ZSB0aGF0IGRvZXMgbm90XG4gIC8vIHVzZSBpbmRpcmVjdCBldmFsICh3aGljaCB2aW9sYXRlcyBDb250ZW50IFNlY3VyaXR5IFBvbGljeSkuXG4gIHR5cGVvZiBnbG9iYWwgPT09IFwib2JqZWN0XCIgPyBnbG9iYWwgOlxuICB0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiID8gd2luZG93IDpcbiAgdHlwZW9mIHNlbGYgPT09IFwib2JqZWN0XCIgPyBzZWxmIDogdGhpc1xuKTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvY29yZS5yZWdleHAuZXNjYXBlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5SZWdFeHAuZXNjYXBlO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uIScpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwidmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIG1zZykge1xuICBpZiAodHlwZW9mIGl0ICE9ICdudW1iZXInICYmIGNvZihpdCkgIT0gJ051bWJlcicpIHRocm93IFR5cGVFcnJvcihtc2cpO1xuICByZXR1cm4gK2l0O1xufTtcbiIsIi8vIDIyLjEuMy4zMSBBcnJheS5wcm90b3R5cGVbQEB1bnNjb3BhYmxlc11cbnZhciBVTlNDT1BBQkxFUyA9IHJlcXVpcmUoJy4vX3drcycpKCd1bnNjb3BhYmxlcycpO1xudmFyIEFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5pZiAoQXJyYXlQcm90b1tVTlNDT1BBQkxFU10gPT0gdW5kZWZpbmVkKSByZXF1aXJlKCcuL19oaWRlJykoQXJyYXlQcm90bywgVU5TQ09QQUJMRVMsIHt9KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICBBcnJheVByb3RvW1VOU0NPUEFCTEVTXVtrZXldID0gdHJ1ZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYXQgPSByZXF1aXJlKCcuL19zdHJpbmctYXQnKSh0cnVlKTtcblxuIC8vIGBBZHZhbmNlU3RyaW5nSW5kZXhgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYWR2YW5jZXN0cmluZ2luZGV4XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChTLCBpbmRleCwgdW5pY29kZSkge1xuICByZXR1cm4gaW5kZXggKyAodW5pY29kZSA/IGF0KFMsIGluZGV4KS5sZW5ndGggOiAxKTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgQ29uc3RydWN0b3IsIG5hbWUsIGZvcmJpZGRlbkZpZWxkKSB7XG4gIGlmICghKGl0IGluc3RhbmNlb2YgQ29uc3RydWN0b3IpIHx8IChmb3JiaWRkZW5GaWVsZCAhPT0gdW5kZWZpbmVkICYmIGZvcmJpZGRlbkZpZWxkIGluIGl0KSkge1xuICAgIHRocm93IFR5cGVFcnJvcihuYW1lICsgJzogaW5jb3JyZWN0IGludm9jYXRpb24hJyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKCFpc09iamVjdChpdCkpIHRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGFuIG9iamVjdCEnKTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsIi8vIDIyLjEuMy4zIEFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluKHRhcmdldCwgc3RhcnQsIGVuZCA9IHRoaXMubGVuZ3RoKVxuJ3VzZSBzdHJpY3QnO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFtdLmNvcHlXaXRoaW4gfHwgZnVuY3Rpb24gY29weVdpdGhpbih0YXJnZXQgLyogPSAwICovLCBzdGFydCAvKiA9IDAsIGVuZCA9IEBsZW5ndGggKi8pIHtcbiAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgdmFyIGxlbiA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgdmFyIHRvID0gdG9BYnNvbHV0ZUluZGV4KHRhcmdldCwgbGVuKTtcbiAgdmFyIGZyb20gPSB0b0Fic29sdXRlSW5kZXgoc3RhcnQsIGxlbik7XG4gIHZhciBlbmQgPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZDtcbiAgdmFyIGNvdW50ID0gTWF0aC5taW4oKGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogdG9BYnNvbHV0ZUluZGV4KGVuZCwgbGVuKSkgLSBmcm9tLCBsZW4gLSB0byk7XG4gIHZhciBpbmMgPSAxO1xuICBpZiAoZnJvbSA8IHRvICYmIHRvIDwgZnJvbSArIGNvdW50KSB7XG4gICAgaW5jID0gLTE7XG4gICAgZnJvbSArPSBjb3VudCAtIDE7XG4gICAgdG8gKz0gY291bnQgLSAxO1xuICB9XG4gIHdoaWxlIChjb3VudC0tID4gMCkge1xuICAgIGlmIChmcm9tIGluIE8pIE9bdG9dID0gT1tmcm9tXTtcbiAgICBlbHNlIGRlbGV0ZSBPW3RvXTtcbiAgICB0byArPSBpbmM7XG4gICAgZnJvbSArPSBpbmM7XG4gIH0gcmV0dXJuIE87XG59O1xuIiwiLy8gMjIuMS4zLjYgQXJyYXkucHJvdG90eXBlLmZpbGwodmFsdWUsIHN0YXJ0ID0gMCwgZW5kID0gdGhpcy5sZW5ndGgpXG4ndXNlIHN0cmljdCc7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuL190by1hYnNvbHV0ZS1pbmRleCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZpbGwodmFsdWUgLyogLCBzdGFydCA9IDAsIGVuZCA9IEBsZW5ndGggKi8pIHtcbiAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgdmFyIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoYUxlbiA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIGxlbmd0aCk7XG4gIHZhciBlbmQgPSBhTGVuID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZDtcbiAgdmFyIGVuZFBvcyA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogdG9BYnNvbHV0ZUluZGV4KGVuZCwgbGVuZ3RoKTtcbiAgd2hpbGUgKGVuZFBvcyA+IGluZGV4KSBPW2luZGV4KytdID0gdmFsdWU7XG4gIHJldHVybiBPO1xufTtcbiIsInZhciBmb3JPZiA9IHJlcXVpcmUoJy4vX2Zvci1vZicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyLCBJVEVSQVRPUikge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGZvck9mKGl0ZXIsIGZhbHNlLCByZXN1bHQucHVzaCwgcmVzdWx0LCBJVEVSQVRPUik7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwiLy8gZmFsc2UgLT4gQXJyYXkjaW5kZXhPZlxuLy8gdHJ1ZSAgLT4gQXJyYXkjaW5jbHVkZXNcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuL190by1hYnNvbHV0ZS1pbmRleCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSVNfSU5DTFVERVMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgZWwsIGZyb21JbmRleCkge1xuICAgIHZhciBPID0gdG9JT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IHRvQWJzb2x1dGVJbmRleChmcm9tSW5kZXgsIGxlbmd0aCk7XG4gICAgdmFyIHZhbHVlO1xuICAgIC8vIEFycmF5I2luY2x1ZGVzIHVzZXMgU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgaWYgKElTX0lOQ0xVREVTICYmIGVsICE9IGVsKSB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHtcbiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgIGlmICh2YWx1ZSAhPSB2YWx1ZSkgcmV0dXJuIHRydWU7XG4gICAgLy8gQXJyYXkjaW5kZXhPZiBpZ25vcmVzIGhvbGVzLCBBcnJheSNpbmNsdWRlcyAtIG5vdFxuICAgIH0gZWxzZSBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgaWYgKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pIHtcbiAgICAgIGlmIChPW2luZGV4XSA9PT0gZWwpIHJldHVybiBJU19JTkNMVURFUyB8fCBpbmRleCB8fCAwO1xuICAgIH0gcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcbiAgfTtcbn07XG4iLCIvLyAwIC0+IEFycmF5I2ZvckVhY2hcbi8vIDEgLT4gQXJyYXkjbWFwXG4vLyAyIC0+IEFycmF5I2ZpbHRlclxuLy8gMyAtPiBBcnJheSNzb21lXG4vLyA0IC0+IEFycmF5I2V2ZXJ5XG4vLyA1IC0+IEFycmF5I2ZpbmRcbi8vIDYgLT4gQXJyYXkjZmluZEluZGV4XG52YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgYXNjID0gcmVxdWlyZSgnLi9fYXJyYXktc3BlY2llcy1jcmVhdGUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFRZUEUsICRjcmVhdGUpIHtcbiAgdmFyIElTX01BUCA9IFRZUEUgPT0gMTtcbiAgdmFyIElTX0ZJTFRFUiA9IFRZUEUgPT0gMjtcbiAgdmFyIElTX1NPTUUgPSBUWVBFID09IDM7XG4gIHZhciBJU19FVkVSWSA9IFRZUEUgPT0gNDtcbiAgdmFyIElTX0ZJTkRfSU5ERVggPSBUWVBFID09IDY7XG4gIHZhciBOT19IT0xFUyA9IFRZUEUgPT0gNSB8fCBJU19GSU5EX0lOREVYO1xuICB2YXIgY3JlYXRlID0gJGNyZWF0ZSB8fCBhc2M7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGNhbGxiYWNrZm4sIHRoYXQpIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgc2VsZiA9IElPYmplY3QoTyk7XG4gICAgdmFyIGYgPSBjdHgoY2FsbGJhY2tmbiwgdGhhdCwgMyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKHNlbGYubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciByZXN1bHQgPSBJU19NQVAgPyBjcmVhdGUoJHRoaXMsIGxlbmd0aCkgOiBJU19GSUxURVIgPyBjcmVhdGUoJHRoaXMsIDApIDogdW5kZWZpbmVkO1xuICAgIHZhciB2YWwsIHJlcztcbiAgICBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgaWYgKE5PX0hPTEVTIHx8IGluZGV4IGluIHNlbGYpIHtcbiAgICAgIHZhbCA9IHNlbGZbaW5kZXhdO1xuICAgICAgcmVzID0gZih2YWwsIGluZGV4LCBPKTtcbiAgICAgIGlmIChUWVBFKSB7XG4gICAgICAgIGlmIChJU19NQVApIHJlc3VsdFtpbmRleF0gPSByZXM7ICAgLy8gbWFwXG4gICAgICAgIGVsc2UgaWYgKHJlcykgc3dpdGNoIChUWVBFKSB7XG4gICAgICAgICAgY2FzZSAzOiByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgLy8gc29tZVxuICAgICAgICAgIGNhc2UgNTogcmV0dXJuIHZhbDsgICAgICAgICAgICAgIC8vIGZpbmRcbiAgICAgICAgICBjYXNlIDY6IHJldHVybiBpbmRleDsgICAgICAgICAgICAvLyBmaW5kSW5kZXhcbiAgICAgICAgICBjYXNlIDI6IHJlc3VsdC5wdXNoKHZhbCk7ICAgICAgICAvLyBmaWx0ZXJcbiAgICAgICAgfSBlbHNlIGlmIChJU19FVkVSWSkgcmV0dXJuIGZhbHNlOyAvLyBldmVyeVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gSVNfRklORF9JTkRFWCA/IC0xIDogSVNfU09NRSB8fCBJU19FVkVSWSA/IElTX0VWRVJZIDogcmVzdWx0O1xuICB9O1xufTtcbiIsInZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciBJT2JqZWN0ID0gcmVxdWlyZSgnLi9faW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRoYXQsIGNhbGxiYWNrZm4sIGFMZW4sIG1lbW8sIGlzUmlnaHQpIHtcbiAgYUZ1bmN0aW9uKGNhbGxiYWNrZm4pO1xuICB2YXIgTyA9IHRvT2JqZWN0KHRoYXQpO1xuICB2YXIgc2VsZiA9IElPYmplY3QoTyk7XG4gIHZhciBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gIHZhciBpbmRleCA9IGlzUmlnaHQgPyBsZW5ndGggLSAxIDogMDtcbiAgdmFyIGkgPSBpc1JpZ2h0ID8gLTEgOiAxO1xuICBpZiAoYUxlbiA8IDIpIGZvciAoOzspIHtcbiAgICBpZiAoaW5kZXggaW4gc2VsZikge1xuICAgICAgbWVtbyA9IHNlbGZbaW5kZXhdO1xuICAgICAgaW5kZXggKz0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpbmRleCArPSBpO1xuICAgIGlmIChpc1JpZ2h0ID8gaW5kZXggPCAwIDogbGVuZ3RoIDw9IGluZGV4KSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ1JlZHVjZSBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUnKTtcbiAgICB9XG4gIH1cbiAgZm9yICg7aXNSaWdodCA/IGluZGV4ID49IDAgOiBsZW5ndGggPiBpbmRleDsgaW5kZXggKz0gaSkgaWYgKGluZGV4IGluIHNlbGYpIHtcbiAgICBtZW1vID0gY2FsbGJhY2tmbihtZW1vLCBzZWxmW2luZGV4XSwgaW5kZXgsIE8pO1xuICB9XG4gIHJldHVybiBtZW1vO1xufTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuL19pcy1hcnJheScpO1xudmFyIFNQRUNJRVMgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcmlnaW5hbCkge1xuICB2YXIgQztcbiAgaWYgKGlzQXJyYXkob3JpZ2luYWwpKSB7XG4gICAgQyA9IG9yaWdpbmFsLmNvbnN0cnVjdG9yO1xuICAgIC8vIGNyb3NzLXJlYWxtIGZhbGxiYWNrXG4gICAgaWYgKHR5cGVvZiBDID09ICdmdW5jdGlvbicgJiYgKEMgPT09IEFycmF5IHx8IGlzQXJyYXkoQy5wcm90b3R5cGUpKSkgQyA9IHVuZGVmaW5lZDtcbiAgICBpZiAoaXNPYmplY3QoQykpIHtcbiAgICAgIEMgPSBDW1NQRUNJRVNdO1xuICAgICAgaWYgKEMgPT09IG51bGwpIEMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9IHJldHVybiBDID09PSB1bmRlZmluZWQgPyBBcnJheSA6IEM7XG59O1xuIiwiLy8gOS40LjIuMyBBcnJheVNwZWNpZXNDcmVhdGUob3JpZ2luYWxBcnJheSwgbGVuZ3RoKVxudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4vX2FycmF5LXNwZWNpZXMtY29uc3RydWN0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3JpZ2luYWwsIGxlbmd0aCkge1xuICByZXR1cm4gbmV3IChzcGVjaWVzQ29uc3RydWN0b3Iob3JpZ2luYWwpKShsZW5ndGgpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBpbnZva2UgPSByZXF1aXJlKCcuL19pbnZva2UnKTtcbnZhciBhcnJheVNsaWNlID0gW10uc2xpY2U7XG52YXIgZmFjdG9yaWVzID0ge307XG5cbnZhciBjb25zdHJ1Y3QgPSBmdW5jdGlvbiAoRiwgbGVuLCBhcmdzKSB7XG4gIGlmICghKGxlbiBpbiBmYWN0b3JpZXMpKSB7XG4gICAgZm9yICh2YXIgbiA9IFtdLCBpID0gMDsgaSA8IGxlbjsgaSsrKSBuW2ldID0gJ2FbJyArIGkgKyAnXSc7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gICAgZmFjdG9yaWVzW2xlbl0gPSBGdW5jdGlvbignRixhJywgJ3JldHVybiBuZXcgRignICsgbi5qb2luKCcsJykgKyAnKScpO1xuICB9IHJldHVybiBmYWN0b3JpZXNbbGVuXShGLCBhcmdzKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRnVuY3Rpb24uYmluZCB8fCBmdW5jdGlvbiBiaW5kKHRoYXQgLyogLCAuLi5hcmdzICovKSB7XG4gIHZhciBmbiA9IGFGdW5jdGlvbih0aGlzKTtcbiAgdmFyIHBhcnRBcmdzID0gYXJyYXlTbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gIHZhciBib3VuZCA9IGZ1bmN0aW9uICgvKiBhcmdzLi4uICovKSB7XG4gICAgdmFyIGFyZ3MgPSBwYXJ0QXJncy5jb25jYXQoYXJyYXlTbGljZS5jYWxsKGFyZ3VtZW50cykpO1xuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgYm91bmQgPyBjb25zdHJ1Y3QoZm4sIGFyZ3MubGVuZ3RoLCBhcmdzKSA6IGludm9rZShmbiwgYXJncywgdGhhdCk7XG4gIH07XG4gIGlmIChpc09iamVjdChmbi5wcm90b3R5cGUpKSBib3VuZC5wcm90b3R5cGUgPSBmbi5wcm90b3R5cGU7XG4gIHJldHVybiBib3VuZDtcbn07XG4iLCIvLyBnZXR0aW5nIHRhZyBmcm9tIDE5LjEuMy42IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcoKVxudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xudmFyIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuLy8gRVMzIHdyb25nIGhlcmVcbnZhciBBUkcgPSBjb2YoZnVuY3Rpb24gKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09ICdBcmd1bWVudHMnO1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBTY3JpcHQgQWNjZXNzIERlbmllZCBlcnJvclxudmFyIHRyeUdldCA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGl0W2tleV07XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIE8sIFQsIEI7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mIChUID0gdHJ5R2V0KE8gPSBPYmplY3QoaXQpLCBUQUcpKSA9PSAnc3RyaW5nJyA/IFRcbiAgICAvLyBidWlsdGluVGFnIGNhc2VcbiAgICA6IEFSRyA/IGNvZihPKVxuICAgIC8vIEVTMyBhcmd1bWVudHMgZmFsbGJhY2tcbiAgICA6IChCID0gY29mKE8pKSA9PSAnT2JqZWN0JyAmJiB0eXBlb2YgTy5jYWxsZWUgPT0gJ2Z1bmN0aW9uJyA/ICdBcmd1bWVudHMnIDogQjtcbn07XG4iLCJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoaXQpLnNsaWNlKDgsIC0xKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKTtcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG52YXIgJGl0ZXJEZWZpbmUgPSByZXF1aXJlKCcuL19pdGVyLWRlZmluZScpO1xudmFyIHN0ZXAgPSByZXF1aXJlKCcuL19pdGVyLXN0ZXAnKTtcbnZhciBzZXRTcGVjaWVzID0gcmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFzdEtleSA9IHJlcXVpcmUoJy4vX21ldGEnKS5mYXN0S2V5O1xudmFyIHZhbGlkYXRlID0gcmVxdWlyZSgnLi9fdmFsaWRhdGUtY29sbGVjdGlvbicpO1xudmFyIFNJWkUgPSBERVNDUklQVE9SUyA/ICdfcycgOiAnc2l6ZSc7XG5cbnZhciBnZXRFbnRyeSA9IGZ1bmN0aW9uICh0aGF0LCBrZXkpIHtcbiAgLy8gZmFzdCBjYXNlXG4gIHZhciBpbmRleCA9IGZhc3RLZXkoa2V5KTtcbiAgdmFyIGVudHJ5O1xuICBpZiAoaW5kZXggIT09ICdGJykgcmV0dXJuIHRoYXQuX2lbaW5kZXhdO1xuICAvLyBmcm96ZW4gb2JqZWN0IGNhc2VcbiAgZm9yIChlbnRyeSA9IHRoYXQuX2Y7IGVudHJ5OyBlbnRyeSA9IGVudHJ5Lm4pIHtcbiAgICBpZiAoZW50cnkuayA9PSBrZXkpIHJldHVybiBlbnRyeTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldENvbnN0cnVjdG9yOiBmdW5jdGlvbiAod3JhcHBlciwgTkFNRSwgSVNfTUFQLCBBRERFUikge1xuICAgIHZhciBDID0gd3JhcHBlcihmdW5jdGlvbiAodGhhdCwgaXRlcmFibGUpIHtcbiAgICAgIGFuSW5zdGFuY2UodGhhdCwgQywgTkFNRSwgJ19pJyk7XG4gICAgICB0aGF0Ll90ID0gTkFNRTsgICAgICAgICAvLyBjb2xsZWN0aW9uIHR5cGVcbiAgICAgIHRoYXQuX2kgPSBjcmVhdGUobnVsbCk7IC8vIGluZGV4XG4gICAgICB0aGF0Ll9mID0gdW5kZWZpbmVkOyAgICAvLyBmaXJzdCBlbnRyeVxuICAgICAgdGhhdC5fbCA9IHVuZGVmaW5lZDsgICAgLy8gbGFzdCBlbnRyeVxuICAgICAgdGhhdFtTSVpFXSA9IDA7ICAgICAgICAgLy8gc2l6ZVxuICAgICAgaWYgKGl0ZXJhYmxlICE9IHVuZGVmaW5lZCkgZm9yT2YoaXRlcmFibGUsIElTX01BUCwgdGhhdFtBRERFUl0sIHRoYXQpO1xuICAgIH0pO1xuICAgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCB7XG4gICAgICAvLyAyMy4xLjMuMSBNYXAucHJvdG90eXBlLmNsZWFyKClcbiAgICAgIC8vIDIzLjIuMy4yIFNldC5wcm90b3R5cGUuY2xlYXIoKVxuICAgICAgY2xlYXI6IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgICBmb3IgKHZhciB0aGF0ID0gdmFsaWRhdGUodGhpcywgTkFNRSksIGRhdGEgPSB0aGF0Ll9pLCBlbnRyeSA9IHRoYXQuX2Y7IGVudHJ5OyBlbnRyeSA9IGVudHJ5Lm4pIHtcbiAgICAgICAgICBlbnRyeS5yID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoZW50cnkucCkgZW50cnkucCA9IGVudHJ5LnAubiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBkZWxldGUgZGF0YVtlbnRyeS5pXTtcbiAgICAgICAgfVxuICAgICAgICB0aGF0Ll9mID0gdGhhdC5fbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhhdFtTSVpFXSA9IDA7XG4gICAgICB9LFxuICAgICAgLy8gMjMuMS4zLjMgTWFwLnByb3RvdHlwZS5kZWxldGUoa2V5KVxuICAgICAgLy8gMjMuMi4zLjQgU2V0LnByb3RvdHlwZS5kZWxldGUodmFsdWUpXG4gICAgICAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgdGhhdCA9IHZhbGlkYXRlKHRoaXMsIE5BTUUpO1xuICAgICAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGF0LCBrZXkpO1xuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICB2YXIgbmV4dCA9IGVudHJ5Lm47XG4gICAgICAgICAgdmFyIHByZXYgPSBlbnRyeS5wO1xuICAgICAgICAgIGRlbGV0ZSB0aGF0Ll9pW2VudHJ5LmldO1xuICAgICAgICAgIGVudHJ5LnIgPSB0cnVlO1xuICAgICAgICAgIGlmIChwcmV2KSBwcmV2Lm4gPSBuZXh0O1xuICAgICAgICAgIGlmIChuZXh0KSBuZXh0LnAgPSBwcmV2O1xuICAgICAgICAgIGlmICh0aGF0Ll9mID09IGVudHJ5KSB0aGF0Ll9mID0gbmV4dDtcbiAgICAgICAgICBpZiAodGhhdC5fbCA9PSBlbnRyeSkgdGhhdC5fbCA9IHByZXY7XG4gICAgICAgICAgdGhhdFtTSVpFXS0tO1xuICAgICAgICB9IHJldHVybiAhIWVudHJ5O1xuICAgICAgfSxcbiAgICAgIC8vIDIzLjIuMy42IFNldC5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICAgICAgLy8gMjMuMS4zLjUgTWFwLnByb3RvdHlwZS5mb3JFYWNoKGNhbGxiYWNrZm4sIHRoaXNBcmcgPSB1bmRlZmluZWQpXG4gICAgICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgICAgIHZhbGlkYXRlKHRoaXMsIE5BTUUpO1xuICAgICAgICB2YXIgZiA9IGN0eChjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMyk7XG4gICAgICAgIHZhciBlbnRyeTtcbiAgICAgICAgd2hpbGUgKGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uIDogdGhpcy5fZikge1xuICAgICAgICAgIGYoZW50cnkudiwgZW50cnkuaywgdGhpcyk7XG4gICAgICAgICAgLy8gcmV2ZXJ0IHRvIHRoZSBsYXN0IGV4aXN0aW5nIGVudHJ5XG4gICAgICAgICAgd2hpbGUgKGVudHJ5ICYmIGVudHJ5LnIpIGVudHJ5ID0gZW50cnkucDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIDIzLjEuMy43IE1hcC5wcm90b3R5cGUuaGFzKGtleSlcbiAgICAgIC8vIDIzLjIuMy43IFNldC5wcm90b3R5cGUuaGFzKHZhbHVlKVxuICAgICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiAhIWdldEVudHJ5KHZhbGlkYXRlKHRoaXMsIE5BTUUpLCBrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChERVNDUklQVE9SUykgZFAoQy5wcm90b3R5cGUsICdzaXplJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZSh0aGlzLCBOQU1FKVtTSVpFXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gQztcbiAgfSxcbiAgZGVmOiBmdW5jdGlvbiAodGhhdCwga2V5LCB2YWx1ZSkge1xuICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoYXQsIGtleSk7XG4gICAgdmFyIHByZXYsIGluZGV4O1xuICAgIC8vIGNoYW5nZSBleGlzdGluZyBlbnRyeVxuICAgIGlmIChlbnRyeSkge1xuICAgICAgZW50cnkudiA9IHZhbHVlO1xuICAgIC8vIGNyZWF0ZSBuZXcgZW50cnlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhhdC5fbCA9IGVudHJ5ID0ge1xuICAgICAgICBpOiBpbmRleCA9IGZhc3RLZXkoa2V5LCB0cnVlKSwgLy8gPC0gaW5kZXhcbiAgICAgICAgazoga2V5LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIGtleVxuICAgICAgICB2OiB2YWx1ZSwgICAgICAgICAgICAgICAgICAgICAgLy8gPC0gdmFsdWVcbiAgICAgICAgcDogcHJldiA9IHRoYXQuX2wsICAgICAgICAgICAgIC8vIDwtIHByZXZpb3VzIGVudHJ5XG4gICAgICAgIG46IHVuZGVmaW5lZCwgICAgICAgICAgICAgICAgICAvLyA8LSBuZXh0IGVudHJ5XG4gICAgICAgIHI6IGZhbHNlICAgICAgICAgICAgICAgICAgICAgICAvLyA8LSByZW1vdmVkXG4gICAgICB9O1xuICAgICAgaWYgKCF0aGF0Ll9mKSB0aGF0Ll9mID0gZW50cnk7XG4gICAgICBpZiAocHJldikgcHJldi5uID0gZW50cnk7XG4gICAgICB0aGF0W1NJWkVdKys7XG4gICAgICAvLyBhZGQgdG8gaW5kZXhcbiAgICAgIGlmIChpbmRleCAhPT0gJ0YnKSB0aGF0Ll9pW2luZGV4XSA9IGVudHJ5O1xuICAgIH0gcmV0dXJuIHRoYXQ7XG4gIH0sXG4gIGdldEVudHJ5OiBnZXRFbnRyeSxcbiAgc2V0U3Ryb25nOiBmdW5jdGlvbiAoQywgTkFNRSwgSVNfTUFQKSB7XG4gICAgLy8gYWRkIC5rZXlzLCAudmFsdWVzLCAuZW50cmllcywgW0BAaXRlcmF0b3JdXG4gICAgLy8gMjMuMS4zLjQsIDIzLjEuMy44LCAyMy4xLjMuMTEsIDIzLjEuMy4xMiwgMjMuMi4zLjUsIDIzLjIuMy44LCAyMy4yLjMuMTAsIDIzLjIuMy4xMVxuICAgICRpdGVyRGVmaW5lKEMsIE5BTUUsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICAgICAgdGhpcy5fdCA9IHZhbGlkYXRlKGl0ZXJhdGVkLCBOQU1FKTsgLy8gdGFyZ2V0XG4gICAgICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgICAgICAvLyBraW5kXG4gICAgICB0aGlzLl9sID0gdW5kZWZpbmVkOyAgICAgICAgICAgICAgICAvLyBwcmV2aW91c1xuICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgIHZhciBraW5kID0gdGhhdC5faztcbiAgICAgIHZhciBlbnRyeSA9IHRoYXQuX2w7XG4gICAgICAvLyByZXZlcnQgdG8gdGhlIGxhc3QgZXhpc3RpbmcgZW50cnlcbiAgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS5yKSBlbnRyeSA9IGVudHJ5LnA7XG4gICAgICAvLyBnZXQgbmV4dCBlbnRyeVxuICAgICAgaWYgKCF0aGF0Ll90IHx8ICEodGhhdC5fbCA9IGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uIDogdGhhdC5fdC5fZikpIHtcbiAgICAgICAgLy8gb3IgZmluaXNoIHRoZSBpdGVyYXRpb25cbiAgICAgICAgdGhhdC5fdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHN0ZXAoMSk7XG4gICAgICB9XG4gICAgICAvLyByZXR1cm4gc3RlcCBieSBraW5kXG4gICAgICBpZiAoa2luZCA9PSAna2V5cycpIHJldHVybiBzdGVwKDAsIGVudHJ5LmspO1xuICAgICAgaWYgKGtpbmQgPT0gJ3ZhbHVlcycpIHJldHVybiBzdGVwKDAsIGVudHJ5LnYpO1xuICAgICAgcmV0dXJuIHN0ZXAoMCwgW2VudHJ5LmssIGVudHJ5LnZdKTtcbiAgICB9LCBJU19NQVAgPyAnZW50cmllcycgOiAndmFsdWVzJywgIUlTX01BUCwgdHJ1ZSk7XG5cbiAgICAvLyBhZGQgW0BAc3BlY2llc10sIDIzLjEuMi4yLCAyMy4yLjIuMlxuICAgIHNldFNwZWNpZXMoTkFNRSk7XG4gIH1cbn07XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vRGF2aWRCcnVhbnQvTWFwLVNldC5wcm90b3R5cGUudG9KU09OXG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKTtcbnZhciBmcm9tID0gcmVxdWlyZSgnLi9fYXJyYXktZnJvbS1pdGVyYWJsZScpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTkFNRSkge1xuICByZXR1cm4gZnVuY3Rpb24gdG9KU09OKCkge1xuICAgIGlmIChjbGFzc29mKHRoaXMpICE9IE5BTUUpIHRocm93IFR5cGVFcnJvcihOQU1FICsgXCIjdG9KU09OIGlzbid0IGdlbmVyaWNcIik7XG4gICAgcmV0dXJuIGZyb20odGhpcyk7XG4gIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHJlZGVmaW5lQWxsID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUtYWxsJyk7XG52YXIgZ2V0V2VhayA9IHJlcXVpcmUoJy4vX21ldGEnKS5nZXRXZWFrO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKTtcbnZhciBmb3JPZiA9IHJlcXVpcmUoJy4vX2Zvci1vZicpO1xudmFyIGNyZWF0ZUFycmF5TWV0aG9kID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpO1xudmFyICRoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciB2YWxpZGF0ZSA9IHJlcXVpcmUoJy4vX3ZhbGlkYXRlLWNvbGxlY3Rpb24nKTtcbnZhciBhcnJheUZpbmQgPSBjcmVhdGVBcnJheU1ldGhvZCg1KTtcbnZhciBhcnJheUZpbmRJbmRleCA9IGNyZWF0ZUFycmF5TWV0aG9kKDYpO1xudmFyIGlkID0gMDtcblxuLy8gZmFsbGJhY2sgZm9yIHVuY2F1Z2h0IGZyb3plbiBrZXlzXG52YXIgdW5jYXVnaHRGcm96ZW5TdG9yZSA9IGZ1bmN0aW9uICh0aGF0KSB7XG4gIHJldHVybiB0aGF0Ll9sIHx8ICh0aGF0Ll9sID0gbmV3IFVuY2F1Z2h0RnJvemVuU3RvcmUoKSk7XG59O1xudmFyIFVuY2F1Z2h0RnJvemVuU3RvcmUgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuYSA9IFtdO1xufTtcbnZhciBmaW5kVW5jYXVnaHRGcm96ZW4gPSBmdW5jdGlvbiAoc3RvcmUsIGtleSkge1xuICByZXR1cm4gYXJyYXlGaW5kKHN0b3JlLmEsIGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBpdFswXSA9PT0ga2V5O1xuICB9KTtcbn07XG5VbmNhdWdodEZyb3plblN0b3JlLnByb3RvdHlwZSA9IHtcbiAgZ2V0OiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIGVudHJ5ID0gZmluZFVuY2F1Z2h0RnJvemVuKHRoaXMsIGtleSk7XG4gICAgaWYgKGVudHJ5KSByZXR1cm4gZW50cnlbMV07XG4gIH0sXG4gIGhhczogZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiAhIWZpbmRVbmNhdWdodEZyb3plbih0aGlzLCBrZXkpO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgdmFyIGVudHJ5ID0gZmluZFVuY2F1Z2h0RnJvemVuKHRoaXMsIGtleSk7XG4gICAgaWYgKGVudHJ5KSBlbnRyeVsxXSA9IHZhbHVlO1xuICAgIGVsc2UgdGhpcy5hLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgfSxcbiAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgaW5kZXggPSBhcnJheUZpbmRJbmRleCh0aGlzLmEsIGZ1bmN0aW9uIChpdCkge1xuICAgICAgcmV0dXJuIGl0WzBdID09PSBrZXk7XG4gICAgfSk7XG4gICAgaWYgKH5pbmRleCkgdGhpcy5hLnNwbGljZShpbmRleCwgMSk7XG4gICAgcmV0dXJuICEhfmluZGV4O1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0Q29uc3RydWN0b3I6IGZ1bmN0aW9uICh3cmFwcGVyLCBOQU1FLCBJU19NQVAsIEFEREVSKSB7XG4gICAgdmFyIEMgPSB3cmFwcGVyKGZ1bmN0aW9uICh0aGF0LCBpdGVyYWJsZSkge1xuICAgICAgYW5JbnN0YW5jZSh0aGF0LCBDLCBOQU1FLCAnX2knKTtcbiAgICAgIHRoYXQuX3QgPSBOQU1FOyAgICAgIC8vIGNvbGxlY3Rpb24gdHlwZVxuICAgICAgdGhhdC5faSA9IGlkKys7ICAgICAgLy8gY29sbGVjdGlvbiBpZFxuICAgICAgdGhhdC5fbCA9IHVuZGVmaW5lZDsgLy8gbGVhayBzdG9yZSBmb3IgdW5jYXVnaHQgZnJvemVuIG9iamVjdHNcbiAgICAgIGlmIChpdGVyYWJsZSAhPSB1bmRlZmluZWQpIGZvck9mKGl0ZXJhYmxlLCBJU19NQVAsIHRoYXRbQURERVJdLCB0aGF0KTtcbiAgICB9KTtcbiAgICByZWRlZmluZUFsbChDLnByb3RvdHlwZSwge1xuICAgICAgLy8gMjMuMy4zLjIgV2Vha01hcC5wcm90b3R5cGUuZGVsZXRlKGtleSlcbiAgICAgIC8vIDIzLjQuMy4zIFdlYWtTZXQucHJvdG90eXBlLmRlbGV0ZSh2YWx1ZSlcbiAgICAgICdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGlmICghaXNPYmplY3Qoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB2YXIgZGF0YSA9IGdldFdlYWsoa2V5KTtcbiAgICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHJldHVybiB1bmNhdWdodEZyb3plblN0b3JlKHZhbGlkYXRlKHRoaXMsIE5BTUUpKVsnZGVsZXRlJ10oa2V5KTtcbiAgICAgICAgcmV0dXJuIGRhdGEgJiYgJGhhcyhkYXRhLCB0aGlzLl9pKSAmJiBkZWxldGUgZGF0YVt0aGlzLl9pXTtcbiAgICAgIH0sXG4gICAgICAvLyAyMy4zLjMuNCBXZWFrTWFwLnByb3RvdHlwZS5oYXMoa2V5KVxuICAgICAgLy8gMjMuNC4zLjQgV2Vha1NldC5wcm90b3R5cGUuaGFzKHZhbHVlKVxuICAgICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICAgIGlmICghaXNPYmplY3Qoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB2YXIgZGF0YSA9IGdldFdlYWsoa2V5KTtcbiAgICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHJldHVybiB1bmNhdWdodEZyb3plblN0b3JlKHZhbGlkYXRlKHRoaXMsIE5BTUUpKS5oYXMoa2V5KTtcbiAgICAgICAgcmV0dXJuIGRhdGEgJiYgJGhhcyhkYXRhLCB0aGlzLl9pKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gQztcbiAgfSxcbiAgZGVmOiBmdW5jdGlvbiAodGhhdCwga2V5LCB2YWx1ZSkge1xuICAgIHZhciBkYXRhID0gZ2V0V2Vhayhhbk9iamVjdChrZXkpLCB0cnVlKTtcbiAgICBpZiAoZGF0YSA9PT0gdHJ1ZSkgdW5jYXVnaHRGcm96ZW5TdG9yZSh0aGF0KS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgZWxzZSBkYXRhW3RoYXQuX2ldID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoYXQ7XG4gIH0sXG4gIHVmc3RvcmU6IHVuY2F1Z2h0RnJvemVuU3RvcmVcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpO1xudmFyIG1ldGEgPSByZXF1aXJlKCcuL19tZXRhJyk7XG52YXIgZm9yT2YgPSByZXF1aXJlKCcuL19mb3Itb2YnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciAkaXRlckRldGVjdCA9IHJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0Jyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGluaGVyaXRJZlJlcXVpcmVkID0gcmVxdWlyZSgnLi9faW5oZXJpdC1pZi1yZXF1aXJlZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChOQU1FLCB3cmFwcGVyLCBtZXRob2RzLCBjb21tb24sIElTX01BUCwgSVNfV0VBSykge1xuICB2YXIgQmFzZSA9IGdsb2JhbFtOQU1FXTtcbiAgdmFyIEMgPSBCYXNlO1xuICB2YXIgQURERVIgPSBJU19NQVAgPyAnc2V0JyA6ICdhZGQnO1xuICB2YXIgcHJvdG8gPSBDICYmIEMucHJvdG90eXBlO1xuICB2YXIgTyA9IHt9O1xuICB2YXIgZml4TWV0aG9kID0gZnVuY3Rpb24gKEtFWSkge1xuICAgIHZhciBmbiA9IHByb3RvW0tFWV07XG4gICAgcmVkZWZpbmUocHJvdG8sIEtFWSxcbiAgICAgIEtFWSA9PSAnZGVsZXRlJyA/IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIHJldHVybiBJU19XRUFLICYmICFpc09iamVjdChhKSA/IGZhbHNlIDogZm4uY2FsbCh0aGlzLCBhID09PSAwID8gMCA6IGEpO1xuICAgICAgfSA6IEtFWSA9PSAnaGFzJyA/IGZ1bmN0aW9uIGhhcyhhKSB7XG4gICAgICAgIHJldHVybiBJU19XRUFLICYmICFpc09iamVjdChhKSA/IGZhbHNlIDogZm4uY2FsbCh0aGlzLCBhID09PSAwID8gMCA6IGEpO1xuICAgICAgfSA6IEtFWSA9PSAnZ2V0JyA/IGZ1bmN0aW9uIGdldChhKSB7XG4gICAgICAgIHJldHVybiBJU19XRUFLICYmICFpc09iamVjdChhKSA/IHVuZGVmaW5lZCA6IGZuLmNhbGwodGhpcywgYSA9PT0gMCA/IDAgOiBhKTtcbiAgICAgIH0gOiBLRVkgPT0gJ2FkZCcgPyBmdW5jdGlvbiBhZGQoYSkgeyBmbi5jYWxsKHRoaXMsIGEgPT09IDAgPyAwIDogYSk7IHJldHVybiB0aGlzOyB9XG4gICAgICAgIDogZnVuY3Rpb24gc2V0KGEsIGIpIHsgZm4uY2FsbCh0aGlzLCBhID09PSAwID8gMCA6IGEsIGIpOyByZXR1cm4gdGhpczsgfVxuICAgICk7XG4gIH07XG4gIGlmICh0eXBlb2YgQyAhPSAnZnVuY3Rpb24nIHx8ICEoSVNfV0VBSyB8fCBwcm90by5mb3JFYWNoICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgbmV3IEMoKS5lbnRyaWVzKCkubmV4dCgpO1xuICB9KSkpIHtcbiAgICAvLyBjcmVhdGUgY29sbGVjdGlvbiBjb25zdHJ1Y3RvclxuICAgIEMgPSBjb21tb24uZ2V0Q29uc3RydWN0b3Iod3JhcHBlciwgTkFNRSwgSVNfTUFQLCBBRERFUik7XG4gICAgcmVkZWZpbmVBbGwoQy5wcm90b3R5cGUsIG1ldGhvZHMpO1xuICAgIG1ldGEuTkVFRCA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGluc3RhbmNlID0gbmV3IEMoKTtcbiAgICAvLyBlYXJseSBpbXBsZW1lbnRhdGlvbnMgbm90IHN1cHBvcnRzIGNoYWluaW5nXG4gICAgdmFyIEhBU05UX0NIQUlOSU5HID0gaW5zdGFuY2VbQURERVJdKElTX1dFQUsgPyB7fSA6IC0wLCAxKSAhPSBpbnN0YW5jZTtcbiAgICAvLyBWOCB+ICBDaHJvbWl1bSA0MC0gd2Vhay1jb2xsZWN0aW9ucyB0aHJvd3Mgb24gcHJpbWl0aXZlcywgYnV0IHNob3VsZCByZXR1cm4gZmFsc2VcbiAgICB2YXIgVEhST1dTX09OX1BSSU1JVElWRVMgPSBmYWlscyhmdW5jdGlvbiAoKSB7IGluc3RhbmNlLmhhcygxKTsgfSk7XG4gICAgLy8gbW9zdCBlYXJseSBpbXBsZW1lbnRhdGlvbnMgZG9lc24ndCBzdXBwb3J0cyBpdGVyYWJsZXMsIG1vc3QgbW9kZXJuIC0gbm90IGNsb3NlIGl0IGNvcnJlY3RseVxuICAgIHZhciBBQ0NFUFRfSVRFUkFCTEVTID0gJGl0ZXJEZXRlY3QoZnVuY3Rpb24gKGl0ZXIpIHsgbmV3IEMoaXRlcik7IH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIC8vIGZvciBlYXJseSBpbXBsZW1lbnRhdGlvbnMgLTAgYW5kICswIG5vdCB0aGUgc2FtZVxuICAgIHZhciBCVUdHWV9aRVJPID0gIUlTX1dFQUsgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgICAgLy8gVjggfiBDaHJvbWl1bSA0Mi0gZmFpbHMgb25seSB3aXRoIDUrIGVsZW1lbnRzXG4gICAgICB2YXIgJGluc3RhbmNlID0gbmV3IEMoKTtcbiAgICAgIHZhciBpbmRleCA9IDU7XG4gICAgICB3aGlsZSAoaW5kZXgtLSkgJGluc3RhbmNlW0FEREVSXShpbmRleCwgaW5kZXgpO1xuICAgICAgcmV0dXJuICEkaW5zdGFuY2UuaGFzKC0wKTtcbiAgICB9KTtcbiAgICBpZiAoIUFDQ0VQVF9JVEVSQUJMRVMpIHtcbiAgICAgIEMgPSB3cmFwcGVyKGZ1bmN0aW9uICh0YXJnZXQsIGl0ZXJhYmxlKSB7XG4gICAgICAgIGFuSW5zdGFuY2UodGFyZ2V0LCBDLCBOQU1FKTtcbiAgICAgICAgdmFyIHRoYXQgPSBpbmhlcml0SWZSZXF1aXJlZChuZXcgQmFzZSgpLCB0YXJnZXQsIEMpO1xuICAgICAgICBpZiAoaXRlcmFibGUgIT0gdW5kZWZpbmVkKSBmb3JPZihpdGVyYWJsZSwgSVNfTUFQLCB0aGF0W0FEREVSXSwgdGhhdCk7XG4gICAgICAgIHJldHVybiB0aGF0O1xuICAgICAgfSk7XG4gICAgICBDLnByb3RvdHlwZSA9IHByb3RvO1xuICAgICAgcHJvdG8uY29uc3RydWN0b3IgPSBDO1xuICAgIH1cbiAgICBpZiAoVEhST1dTX09OX1BSSU1JVElWRVMgfHwgQlVHR1lfWkVSTykge1xuICAgICAgZml4TWV0aG9kKCdkZWxldGUnKTtcbiAgICAgIGZpeE1ldGhvZCgnaGFzJyk7XG4gICAgICBJU19NQVAgJiYgZml4TWV0aG9kKCdnZXQnKTtcbiAgICB9XG4gICAgaWYgKEJVR0dZX1pFUk8gfHwgSEFTTlRfQ0hBSU5JTkcpIGZpeE1ldGhvZChBRERFUik7XG4gICAgLy8gd2VhayBjb2xsZWN0aW9ucyBzaG91bGQgbm90IGNvbnRhaW5zIC5jbGVhciBtZXRob2RcbiAgICBpZiAoSVNfV0VBSyAmJiBwcm90by5jbGVhcikgZGVsZXRlIHByb3RvLmNsZWFyO1xuICB9XG5cbiAgc2V0VG9TdHJpbmdUYWcoQywgTkFNRSk7XG5cbiAgT1tOQU1FXSA9IEM7XG4gICRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogKEMgIT0gQmFzZSksIE8pO1xuXG4gIGlmICghSVNfV0VBSykgY29tbW9uLnNldFN0cm9uZyhDLCBOQU1FLCBJU19NQVApO1xuXG4gIHJldHVybiBDO1xufTtcbiIsInZhciBjb3JlID0gbW9kdWxlLmV4cG9ydHMgPSB7IHZlcnNpb246ICcyLjYuMTEnIH07XG5pZiAodHlwZW9mIF9fZSA9PSAnbnVtYmVyJykgX19lID0gY29yZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwgaW5kZXgsIHZhbHVlKSB7XG4gIGlmIChpbmRleCBpbiBvYmplY3QpICRkZWZpbmVQcm9wZXJ0eS5mKG9iamVjdCwgaW5kZXgsIGNyZWF0ZURlc2MoMCwgdmFsdWUpKTtcbiAgZWxzZSBvYmplY3RbaW5kZXhdID0gdmFsdWU7XG59O1xuIiwiLy8gb3B0aW9uYWwgLyBzaW1wbGUgY29udGV4dCBiaW5kaW5nXG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4sIHRoYXQsIGxlbmd0aCkge1xuICBhRnVuY3Rpb24oZm4pO1xuICBpZiAodGhhdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZm47XG4gIHN3aXRjaCAobGVuZ3RoKSB7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24gKGEpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpO1xuICAgIH07XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpO1xuICAgIH07XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIsIGMpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIsIGMpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uICgvKiAuLi5hcmdzICovKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7XG4gIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gMjAuMy40LjM2IC8gMTUuOS41LjQzIERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nKClcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgZ2V0VGltZSA9IERhdGUucHJvdG90eXBlLmdldFRpbWU7XG52YXIgJHRvSVNPU3RyaW5nID0gRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmc7XG5cbnZhciBseiA9IGZ1bmN0aW9uIChudW0pIHtcbiAgcmV0dXJuIG51bSA+IDkgPyBudW0gOiAnMCcgKyBudW07XG59O1xuXG4vLyBQaGFudG9tSlMgLyBvbGQgV2ViS2l0IGhhcyBhIGJyb2tlbiBpbXBsZW1lbnRhdGlvbnNcbm1vZHVsZS5leHBvcnRzID0gKGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICR0b0lTT1N0cmluZy5jYWxsKG5ldyBEYXRlKC01ZTEzIC0gMSkpICE9ICcwMzg1LTA3LTI1VDA3OjA2OjM5Ljk5OVonO1xufSkgfHwgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgJHRvSVNPU3RyaW5nLmNhbGwobmV3IERhdGUoTmFOKSk7XG59KSkgPyBmdW5jdGlvbiB0b0lTT1N0cmluZygpIHtcbiAgaWYgKCFpc0Zpbml0ZShnZXRUaW1lLmNhbGwodGhpcykpKSB0aHJvdyBSYW5nZUVycm9yKCdJbnZhbGlkIHRpbWUgdmFsdWUnKTtcbiAgdmFyIGQgPSB0aGlzO1xuICB2YXIgeSA9IGQuZ2V0VVRDRnVsbFllYXIoKTtcbiAgdmFyIG0gPSBkLmdldFVUQ01pbGxpc2Vjb25kcygpO1xuICB2YXIgcyA9IHkgPCAwID8gJy0nIDogeSA+IDk5OTkgPyAnKycgOiAnJztcbiAgcmV0dXJuIHMgKyAoJzAwMDAwJyArIE1hdGguYWJzKHkpKS5zbGljZShzID8gLTYgOiAtNCkgK1xuICAgICctJyArIGx6KGQuZ2V0VVRDTW9udGgoKSArIDEpICsgJy0nICsgbHooZC5nZXRVVENEYXRlKCkpICtcbiAgICAnVCcgKyBseihkLmdldFVUQ0hvdXJzKCkpICsgJzonICsgbHooZC5nZXRVVENNaW51dGVzKCkpICtcbiAgICAnOicgKyBseihkLmdldFVUQ1NlY29uZHMoKSkgKyAnLicgKyAobSA+IDk5ID8gbSA6ICcwJyArIGx6KG0pKSArICdaJztcbn0gOiAkdG9JU09TdHJpbmc7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIE5VTUJFUiA9ICdudW1iZXInO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChoaW50KSB7XG4gIGlmIChoaW50ICE9PSAnc3RyaW5nJyAmJiBoaW50ICE9PSBOVU1CRVIgJiYgaGludCAhPT0gJ2RlZmF1bHQnKSB0aHJvdyBUeXBlRXJyb3IoJ0luY29ycmVjdCBoaW50Jyk7XG4gIHJldHVybiB0b1ByaW1pdGl2ZShhbk9iamVjdCh0aGlzKSwgaGludCAhPSBOVU1CRVIpO1xufTtcbiIsIi8vIDcuMi4xIFJlcXVpcmVPYmplY3RDb2VyY2libGUoYXJndW1lbnQpXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgPT0gdW5kZWZpbmVkKSB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAgXCIgKyBpdCk7XG4gIHJldHVybiBpdDtcbn07XG4iLCIvLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9ICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KS5hICE9IDc7XG59KTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGRvY3VtZW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnQ7XG4vLyB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0JyBpbiBvbGQgSUVcbnZhciBpcyA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpcyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXQpIDoge307XG59O1xuIiwiLy8gSUUgOC0gZG9uJ3QgZW51bSBidWcga2V5c1xubW9kdWxlLmV4cG9ydHMgPSAoXG4gICdjb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eSxpc1Byb3RvdHlwZU9mLHByb3BlcnR5SXNFbnVtZXJhYmxlLHRvTG9jYWxlU3RyaW5nLHRvU3RyaW5nLHZhbHVlT2YnXG4pLnNwbGl0KCcsJyk7XG4iLCIvLyBhbGwgZW51bWVyYWJsZSBvYmplY3Qga2V5cywgaW5jbHVkZXMgc3ltYm9sc1xudmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xudmFyIGdPUFMgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wcycpO1xudmFyIHBJRSA9IHJlcXVpcmUoJy4vX29iamVjdC1waWUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciByZXN1bHQgPSBnZXRLZXlzKGl0KTtcbiAgdmFyIGdldFN5bWJvbHMgPSBnT1BTLmY7XG4gIGlmIChnZXRTeW1ib2xzKSB7XG4gICAgdmFyIHN5bWJvbHMgPSBnZXRTeW1ib2xzKGl0KTtcbiAgICB2YXIgaXNFbnVtID0gcElFLmY7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBrZXk7XG4gICAgd2hpbGUgKHN5bWJvbHMubGVuZ3RoID4gaSkgaWYgKGlzRW51bS5jYWxsKGl0LCBrZXkgPSBzeW1ib2xzW2krK10pKSByZXN1bHQucHVzaChrZXkpO1xuICB9IHJldHVybiByZXN1bHQ7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cbnZhciAkZXhwb3J0ID0gZnVuY3Rpb24gKHR5cGUsIG5hbWUsIHNvdXJjZSkge1xuICB2YXIgSVNfRk9SQ0VEID0gdHlwZSAmICRleHBvcnQuRjtcbiAgdmFyIElTX0dMT0JBTCA9IHR5cGUgJiAkZXhwb3J0Lkc7XG4gIHZhciBJU19TVEFUSUMgPSB0eXBlICYgJGV4cG9ydC5TO1xuICB2YXIgSVNfUFJPVE8gPSB0eXBlICYgJGV4cG9ydC5QO1xuICB2YXIgSVNfQklORCA9IHR5cGUgJiAkZXhwb3J0LkI7XG4gIHZhciB0YXJnZXQgPSBJU19HTE9CQUwgPyBnbG9iYWwgOiBJU19TVEFUSUMgPyBnbG9iYWxbbmFtZV0gfHwgKGdsb2JhbFtuYW1lXSA9IHt9KSA6IChnbG9iYWxbbmFtZV0gfHwge30pW1BST1RPVFlQRV07XG4gIHZhciBleHBvcnRzID0gSVNfR0xPQkFMID8gY29yZSA6IGNvcmVbbmFtZV0gfHwgKGNvcmVbbmFtZV0gPSB7fSk7XG4gIHZhciBleHBQcm90byA9IGV4cG9ydHNbUFJPVE9UWVBFXSB8fCAoZXhwb3J0c1tQUk9UT1RZUEVdID0ge30pO1xuICB2YXIga2V5LCBvd24sIG91dCwgZXhwO1xuICBpZiAoSVNfR0xPQkFMKSBzb3VyY2UgPSBuYW1lO1xuICBmb3IgKGtleSBpbiBzb3VyY2UpIHtcbiAgICAvLyBjb250YWlucyBpbiBuYXRpdmVcbiAgICBvd24gPSAhSVNfRk9SQ0VEICYmIHRhcmdldCAmJiB0YXJnZXRba2V5XSAhPT0gdW5kZWZpbmVkO1xuICAgIC8vIGV4cG9ydCBuYXRpdmUgb3IgcGFzc2VkXG4gICAgb3V0ID0gKG93biA/IHRhcmdldCA6IHNvdXJjZSlba2V5XTtcbiAgICAvLyBiaW5kIHRpbWVycyB0byBnbG9iYWwgZm9yIGNhbGwgZnJvbSBleHBvcnQgY29udGV4dFxuICAgIGV4cCA9IElTX0JJTkQgJiYgb3duID8gY3R4KG91dCwgZ2xvYmFsKSA6IElTX1BST1RPICYmIHR5cGVvZiBvdXQgPT0gJ2Z1bmN0aW9uJyA/IGN0eChGdW5jdGlvbi5jYWxsLCBvdXQpIDogb3V0O1xuICAgIC8vIGV4dGVuZCBnbG9iYWxcbiAgICBpZiAodGFyZ2V0KSByZWRlZmluZSh0YXJnZXQsIGtleSwgb3V0LCB0eXBlICYgJGV4cG9ydC5VKTtcbiAgICAvLyBleHBvcnRcbiAgICBpZiAoZXhwb3J0c1trZXldICE9IG91dCkgaGlkZShleHBvcnRzLCBrZXksIGV4cCk7XG4gICAgaWYgKElTX1BST1RPICYmIGV4cFByb3RvW2tleV0gIT0gb3V0KSBleHBQcm90b1trZXldID0gb3V0O1xuICB9XG59O1xuZ2xvYmFsLmNvcmUgPSBjb3JlO1xuLy8gdHlwZSBiaXRtYXBcbiRleHBvcnQuRiA9IDE7ICAgLy8gZm9yY2VkXG4kZXhwb3J0LkcgPSAyOyAgIC8vIGdsb2JhbFxuJGV4cG9ydC5TID0gNDsgICAvLyBzdGF0aWNcbiRleHBvcnQuUCA9IDg7ICAgLy8gcHJvdG9cbiRleHBvcnQuQiA9IDE2OyAgLy8gYmluZFxuJGV4cG9ydC5XID0gMzI7ICAvLyB3cmFwXG4kZXhwb3J0LlUgPSA2NDsgIC8vIHNhZmVcbiRleHBvcnQuUiA9IDEyODsgLy8gcmVhbCBwcm90byBtZXRob2QgZm9yIGBsaWJyYXJ5YFxubW9kdWxlLmV4cG9ydHMgPSAkZXhwb3J0O1xuIiwidmFyIE1BVENIID0gcmVxdWlyZSgnLi9fd2tzJykoJ21hdGNoJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChLRVkpIHtcbiAgdmFyIHJlID0gLy4vO1xuICB0cnkge1xuICAgICcvLi8nW0tFWV0ocmUpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlW01BVENIXSA9IGZhbHNlO1xuICAgICAgcmV0dXJuICEnLy4vJ1tLRVldKHJlKTtcbiAgICB9IGNhdGNoIChmKSB7IC8qIGVtcHR5ICovIH1cbiAgfSByZXR1cm4gdHJ1ZTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhZXhlYygpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuL2VzNi5yZWdleHAuZXhlYycpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xudmFyIHdrcyA9IHJlcXVpcmUoJy4vX3drcycpO1xudmFyIHJlZ2V4cEV4ZWMgPSByZXF1aXJlKCcuL19yZWdleHAtZXhlYycpO1xuXG52YXIgU1BFQ0lFUyA9IHdrcygnc3BlY2llcycpO1xuXG52YXIgUkVQTEFDRV9TVVBQT1JUU19OQU1FRF9HUk9VUFMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyAjcmVwbGFjZSBuZWVkcyBidWlsdC1pbiBzdXBwb3J0IGZvciBuYW1lZCBncm91cHMuXG4gIC8vICNtYXRjaCB3b3JrcyBmaW5lIGJlY2F1c2UgaXQganVzdCByZXR1cm4gdGhlIGV4ZWMgcmVzdWx0cywgZXZlbiBpZiBpdCBoYXNcbiAgLy8gYSBcImdyb3BzXCIgcHJvcGVydHkuXG4gIHZhciByZSA9IC8uLztcbiAgcmUuZXhlYyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgcmVzdWx0Lmdyb3VwcyA9IHsgYTogJzcnIH07XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgcmV0dXJuICcnLnJlcGxhY2UocmUsICckPGE+JykgIT09ICc3Jztcbn0pO1xuXG52YXIgU1BMSVRfV09SS1NfV0lUSF9PVkVSV1JJVFRFTl9FWEVDID0gKGZ1bmN0aW9uICgpIHtcbiAgLy8gQ2hyb21lIDUxIGhhcyBhIGJ1Z2d5IFwic3BsaXRcIiBpbXBsZW1lbnRhdGlvbiB3aGVuIFJlZ0V4cCNleGVjICE9PSBuYXRpdmVFeGVjXG4gIHZhciByZSA9IC8oPzopLztcbiAgdmFyIG9yaWdpbmFsRXhlYyA9IHJlLmV4ZWM7XG4gIHJlLmV4ZWMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBvcmlnaW5hbEV4ZWMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfTtcbiAgdmFyIHJlc3VsdCA9ICdhYicuc3BsaXQocmUpO1xuICByZXR1cm4gcmVzdWx0Lmxlbmd0aCA9PT0gMiAmJiByZXN1bHRbMF0gPT09ICdhJyAmJiByZXN1bHRbMV0gPT09ICdiJztcbn0pKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEtFWSwgbGVuZ3RoLCBleGVjKSB7XG4gIHZhciBTWU1CT0wgPSB3a3MoS0VZKTtcblxuICB2YXIgREVMRUdBVEVTX1RPX1NZTUJPTCA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgLy8gU3RyaW5nIG1ldGhvZHMgY2FsbCBzeW1ib2wtbmFtZWQgUmVnRXAgbWV0aG9kc1xuICAgIHZhciBPID0ge307XG4gICAgT1tTWU1CT0xdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfTtcbiAgICByZXR1cm4gJydbS0VZXShPKSAhPSA3O1xuICB9KTtcblxuICB2YXIgREVMRUdBVEVTX1RPX0VYRUMgPSBERUxFR0FURVNfVE9fU1lNQk9MID8gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBTeW1ib2wtbmFtZWQgUmVnRXhwIG1ldGhvZHMgY2FsbCAuZXhlY1xuICAgIHZhciBleGVjQ2FsbGVkID0gZmFsc2U7XG4gICAgdmFyIHJlID0gL2EvO1xuICAgIHJlLmV4ZWMgPSBmdW5jdGlvbiAoKSB7IGV4ZWNDYWxsZWQgPSB0cnVlOyByZXR1cm4gbnVsbDsgfTtcbiAgICBpZiAoS0VZID09PSAnc3BsaXQnKSB7XG4gICAgICAvLyBSZWdFeHBbQEBzcGxpdF0gZG9lc24ndCBjYWxsIHRoZSByZWdleCdzIGV4ZWMgbWV0aG9kLCBidXQgZmlyc3QgY3JlYXRlc1xuICAgICAgLy8gYSBuZXcgb25lLiBXZSBuZWVkIHRvIHJldHVybiB0aGUgcGF0Y2hlZCByZWdleCB3aGVuIGNyZWF0aW5nIHRoZSBuZXcgb25lLlxuICAgICAgcmUuY29uc3RydWN0b3IgPSB7fTtcbiAgICAgIHJlLmNvbnN0cnVjdG9yW1NQRUNJRVNdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gcmU7IH07XG4gICAgfVxuICAgIHJlW1NZTUJPTF0oJycpO1xuICAgIHJldHVybiAhZXhlY0NhbGxlZDtcbiAgfSkgOiB1bmRlZmluZWQ7XG5cbiAgaWYgKFxuICAgICFERUxFR0FURVNfVE9fU1lNQk9MIHx8XG4gICAgIURFTEVHQVRFU19UT19FWEVDIHx8XG4gICAgKEtFWSA9PT0gJ3JlcGxhY2UnICYmICFSRVBMQUNFX1NVUFBPUlRTX05BTUVEX0dST1VQUykgfHxcbiAgICAoS0VZID09PSAnc3BsaXQnICYmICFTUExJVF9XT1JLU19XSVRIX09WRVJXUklUVEVOX0VYRUMpXG4gICkge1xuICAgIHZhciBuYXRpdmVSZWdFeHBNZXRob2QgPSAvLi9bU1lNQk9MXTtcbiAgICB2YXIgZm5zID0gZXhlYyhcbiAgICAgIGRlZmluZWQsXG4gICAgICBTWU1CT0wsXG4gICAgICAnJ1tLRVldLFxuICAgICAgZnVuY3Rpb24gbWF5YmVDYWxsTmF0aXZlKG5hdGl2ZU1ldGhvZCwgcmVnZXhwLCBzdHIsIGFyZzIsIGZvcmNlU3RyaW5nTWV0aG9kKSB7XG4gICAgICAgIGlmIChyZWdleHAuZXhlYyA9PT0gcmVnZXhwRXhlYykge1xuICAgICAgICAgIGlmIChERUxFR0FURVNfVE9fU1lNQk9MICYmICFmb3JjZVN0cmluZ01ldGhvZCkge1xuICAgICAgICAgICAgLy8gVGhlIG5hdGl2ZSBTdHJpbmcgbWV0aG9kIGFscmVhZHkgZGVsZWdhdGVzIHRvIEBAbWV0aG9kICh0aGlzXG4gICAgICAgICAgICAvLyBwb2x5ZmlsbGVkIGZ1bmN0aW9uKSwgbGVhc2luZyB0byBpbmZpbml0ZSByZWN1cnNpb24uXG4gICAgICAgICAgICAvLyBXZSBhdm9pZCBpdCBieSBkaXJlY3RseSBjYWxsaW5nIHRoZSBuYXRpdmUgQEBtZXRob2QgbWV0aG9kLlxuICAgICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IG5hdGl2ZVJlZ0V4cE1ldGhvZC5jYWxsKHJlZ2V4cCwgc3RyLCBhcmcyKSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogbmF0aXZlTWV0aG9kLmNhbGwoc3RyLCByZWdleHAsIGFyZzIpIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZG9uZTogZmFsc2UgfTtcbiAgICAgIH1cbiAgICApO1xuICAgIHZhciBzdHJmbiA9IGZuc1swXTtcbiAgICB2YXIgcnhmbiA9IGZuc1sxXTtcblxuICAgIHJlZGVmaW5lKFN0cmluZy5wcm90b3R5cGUsIEtFWSwgc3RyZm4pO1xuICAgIGhpZGUoUmVnRXhwLnByb3RvdHlwZSwgU1lNQk9MLCBsZW5ndGggPT0gMlxuICAgICAgLy8gMjEuMi41LjggUmVnRXhwLnByb3RvdHlwZVtAQHJlcGxhY2VdKHN0cmluZywgcmVwbGFjZVZhbHVlKVxuICAgICAgLy8gMjEuMi41LjExIFJlZ0V4cC5wcm90b3R5cGVbQEBzcGxpdF0oc3RyaW5nLCBsaW1pdClcbiAgICAgID8gZnVuY3Rpb24gKHN0cmluZywgYXJnKSB7IHJldHVybiByeGZuLmNhbGwoc3RyaW5nLCB0aGlzLCBhcmcpOyB9XG4gICAgICAvLyAyMS4yLjUuNiBSZWdFeHAucHJvdG90eXBlW0BAbWF0Y2hdKHN0cmluZylcbiAgICAgIC8vIDIxLjIuNS45IFJlZ0V4cC5wcm90b3R5cGVbQEBzZWFyY2hdKHN0cmluZylcbiAgICAgIDogZnVuY3Rpb24gKHN0cmluZykgeyByZXR1cm4gcnhmbi5jYWxsKHN0cmluZywgdGhpcyk7IH1cbiAgICApO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gMjEuMi41LjMgZ2V0IFJlZ0V4cC5wcm90b3R5cGUuZmxhZ3NcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB0aGF0ID0gYW5PYmplY3QodGhpcyk7XG4gIHZhciByZXN1bHQgPSAnJztcbiAgaWYgKHRoYXQuZ2xvYmFsKSByZXN1bHQgKz0gJ2cnO1xuICBpZiAodGhhdC5pZ25vcmVDYXNlKSByZXN1bHQgKz0gJ2knO1xuICBpZiAodGhhdC5tdWx0aWxpbmUpIHJlc3VsdCArPSAnbSc7XG4gIGlmICh0aGF0LnVuaWNvZGUpIHJlc3VsdCArPSAndSc7XG4gIGlmICh0aGF0LnN0aWNreSkgcmVzdWx0ICs9ICd5JztcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLWZsYXRNYXAvI3NlYy1GbGF0dGVuSW50b0FycmF5XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4vX2lzLWFycmF5Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIElTX0NPTkNBVF9TUFJFQURBQkxFID0gcmVxdWlyZSgnLi9fd2tzJykoJ2lzQ29uY2F0U3ByZWFkYWJsZScpO1xuXG5mdW5jdGlvbiBmbGF0dGVuSW50b0FycmF5KHRhcmdldCwgb3JpZ2luYWwsIHNvdXJjZSwgc291cmNlTGVuLCBzdGFydCwgZGVwdGgsIG1hcHBlciwgdGhpc0FyZykge1xuICB2YXIgdGFyZ2V0SW5kZXggPSBzdGFydDtcbiAgdmFyIHNvdXJjZUluZGV4ID0gMDtcbiAgdmFyIG1hcEZuID0gbWFwcGVyID8gY3R4KG1hcHBlciwgdGhpc0FyZywgMykgOiBmYWxzZTtcbiAgdmFyIGVsZW1lbnQsIHNwcmVhZGFibGU7XG5cbiAgd2hpbGUgKHNvdXJjZUluZGV4IDwgc291cmNlTGVuKSB7XG4gICAgaWYgKHNvdXJjZUluZGV4IGluIHNvdXJjZSkge1xuICAgICAgZWxlbWVudCA9IG1hcEZuID8gbWFwRm4oc291cmNlW3NvdXJjZUluZGV4XSwgc291cmNlSW5kZXgsIG9yaWdpbmFsKSA6IHNvdXJjZVtzb3VyY2VJbmRleF07XG5cbiAgICAgIHNwcmVhZGFibGUgPSBmYWxzZTtcbiAgICAgIGlmIChpc09iamVjdChlbGVtZW50KSkge1xuICAgICAgICBzcHJlYWRhYmxlID0gZWxlbWVudFtJU19DT05DQVRfU1BSRUFEQUJMRV07XG4gICAgICAgIHNwcmVhZGFibGUgPSBzcHJlYWRhYmxlICE9PSB1bmRlZmluZWQgPyAhIXNwcmVhZGFibGUgOiBpc0FycmF5KGVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3ByZWFkYWJsZSAmJiBkZXB0aCA+IDApIHtcbiAgICAgICAgdGFyZ2V0SW5kZXggPSBmbGF0dGVuSW50b0FycmF5KHRhcmdldCwgb3JpZ2luYWwsIGVsZW1lbnQsIHRvTGVuZ3RoKGVsZW1lbnQubGVuZ3RoKSwgdGFyZ2V0SW5kZXgsIGRlcHRoIC0gMSkgLSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRhcmdldEluZGV4ID49IDB4MWZmZmZmZmZmZmZmZmYpIHRocm93IFR5cGVFcnJvcigpO1xuICAgICAgICB0YXJnZXRbdGFyZ2V0SW5kZXhdID0gZWxlbWVudDtcbiAgICAgIH1cblxuICAgICAgdGFyZ2V0SW5kZXgrKztcbiAgICB9XG4gICAgc291cmNlSW5kZXgrKztcbiAgfVxuICByZXR1cm4gdGFyZ2V0SW5kZXg7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmxhdHRlbkludG9BcnJheTtcbiIsInZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi9faXRlci1jYWxsJyk7XG52YXIgaXNBcnJheUl0ZXIgPSByZXF1aXJlKCcuL19pcy1hcnJheS1pdGVyJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGdldEl0ZXJGbiA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgQlJFQUsgPSB7fTtcbnZhciBSRVRVUk4gPSB7fTtcbnZhciBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmFibGUsIGVudHJpZXMsIGZuLCB0aGF0LCBJVEVSQVRPUikge1xuICB2YXIgaXRlckZuID0gSVRFUkFUT1IgPyBmdW5jdGlvbiAoKSB7IHJldHVybiBpdGVyYWJsZTsgfSA6IGdldEl0ZXJGbihpdGVyYWJsZSk7XG4gIHZhciBmID0gY3R4KGZuLCB0aGF0LCBlbnRyaWVzID8gMiA6IDEpO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbGVuZ3RoLCBzdGVwLCBpdGVyYXRvciwgcmVzdWx0O1xuICBpZiAodHlwZW9mIGl0ZXJGbiAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoaXRlcmFibGUgKyAnIGlzIG5vdCBpdGVyYWJsZSEnKTtcbiAgLy8gZmFzdCBjYXNlIGZvciBhcnJheXMgd2l0aCBkZWZhdWx0IGl0ZXJhdG9yXG4gIGlmIChpc0FycmF5SXRlcihpdGVyRm4pKSBmb3IgKGxlbmd0aCA9IHRvTGVuZ3RoKGl0ZXJhYmxlLmxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgcmVzdWx0ID0gZW50cmllcyA/IGYoYW5PYmplY3Qoc3RlcCA9IGl0ZXJhYmxlW2luZGV4XSlbMF0sIHN0ZXBbMV0pIDogZihpdGVyYWJsZVtpbmRleF0pO1xuICAgIGlmIChyZXN1bHQgPT09IEJSRUFLIHx8IHJlc3VsdCA9PT0gUkVUVVJOKSByZXR1cm4gcmVzdWx0O1xuICB9IGVsc2UgZm9yIChpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKGl0ZXJhYmxlKTsgIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lOykge1xuICAgIHJlc3VsdCA9IGNhbGwoaXRlcmF0b3IsIGYsIHN0ZXAudmFsdWUsIGVudHJpZXMpO1xuICAgIGlmIChyZXN1bHQgPT09IEJSRUFLIHx8IHJlc3VsdCA9PT0gUkVUVVJOKSByZXR1cm4gcmVzdWx0O1xuICB9XG59O1xuZXhwb3J0cy5CUkVBSyA9IEJSRUFLO1xuZXhwb3J0cy5SRVRVUk4gPSBSRVRVUk47XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCduYXRpdmUtZnVuY3Rpb24tdG8tc3RyaW5nJywgRnVuY3Rpb24udG9TdHJpbmcpO1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbnZhciBnbG9iYWwgPSBtb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lk1hdGggPT0gTWF0aFxuICA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9ICd1bmRlZmluZWQnICYmIHNlbGYuTWF0aCA9PSBNYXRoID8gc2VsZlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgOiBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuaWYgKHR5cGVvZiBfX2cgPT0gJ251bWJlcicpIF9fZyA9IGdsb2JhbDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuIiwidmFyIGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xufTtcbiIsInZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHJldHVybiBkUC5mKG9iamVjdCwga2V5LCBjcmVhdGVEZXNjKDEsIHZhbHVlKSk7XG59IDogZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTtcbiIsInZhciBkb2N1bWVudCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLmRvY3VtZW50O1xubW9kdWxlLmV4cG9ydHMgPSBkb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4iLCJtb2R1bGUuZXhwb3J0cyA9ICFyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXF1aXJlKCcuL19kb20tY3JlYXRlJykoJ2RpdicpLCAnYScsIHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9IH0pLmEgIT0gNztcbn0pO1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19zZXQtcHJvdG8nKS5zZXQ7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0aGF0LCB0YXJnZXQsIEMpIHtcbiAgdmFyIFMgPSB0YXJnZXQuY29uc3RydWN0b3I7XG4gIHZhciBQO1xuICBpZiAoUyAhPT0gQyAmJiB0eXBlb2YgUyA9PSAnZnVuY3Rpb24nICYmIChQID0gUy5wcm90b3R5cGUpICE9PSBDLnByb3RvdHlwZSAmJiBpc09iamVjdChQKSAmJiBzZXRQcm90b3R5cGVPZikge1xuICAgIHNldFByb3RvdHlwZU9mKHRoYXQsIFApO1xuICB9IHJldHVybiB0aGF0O1xufTtcbiIsIi8vIGZhc3QgYXBwbHksIGh0dHA6Ly9qc3BlcmYubG5raXQuY29tL2Zhc3QtYXBwbHkvNVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4sIGFyZ3MsIHRoYXQpIHtcbiAgdmFyIHVuID0gdGhhdCA9PT0gdW5kZWZpbmVkO1xuICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgY2FzZSAwOiByZXR1cm4gdW4gPyBmbigpXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQpO1xuICAgIGNhc2UgMTogcmV0dXJuIHVuID8gZm4oYXJnc1swXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSk7XG4gICAgY2FzZSAyOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIGNhc2UgNDogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gIH0gcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3MpO1xufTtcbiIsIi8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApID8gT2JqZWN0IDogZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBjb2YoaXQpID09ICdTdHJpbmcnID8gaXQuc3BsaXQoJycpIDogT2JqZWN0KGl0KTtcbn07XG4iLCIvLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgSVRFUkFUT1IgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKTtcbnZhciBBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvW0lURVJBVE9SXSA9PT0gaXQpO1xufTtcbiIsIi8vIDcuMi4yIElzQXJyYXkoYXJndW1lbnQpXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gaXNBcnJheShhcmcpIHtcbiAgcmV0dXJuIGNvZihhcmcpID09ICdBcnJheSc7XG59O1xuIiwiLy8gMjAuMS4yLjMgTnVtYmVyLmlzSW50ZWdlcihudW1iZXIpXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzSW50ZWdlcihpdCkge1xuICByZXR1cm4gIWlzT2JqZWN0KGl0KSAmJiBpc0Zpbml0ZShpdCkgJiYgZmxvb3IoaXQpID09PSBpdDtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogdHlwZW9mIGl0ID09PSAnZnVuY3Rpb24nO1xufTtcbiIsIi8vIDcuMi44IElzUmVnRXhwKGFyZ3VtZW50KVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG52YXIgTUFUQ0ggPSByZXF1aXJlKCcuL193a3MnKSgnbWF0Y2gnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBpc1JlZ0V4cDtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiAoKGlzUmVnRXhwID0gaXRbTUFUQ0hdKSAhPT0gdW5kZWZpbmVkID8gISFpc1JlZ0V4cCA6IGNvZihpdCkgPT0gJ1JlZ0V4cCcpO1xufTtcbiIsIi8vIGNhbGwgc29tZXRoaW5nIG9uIGl0ZXJhdG9yIHN0ZXAgd2l0aCBzYWZlIGNsb3Npbmcgb24gZXJyb3JcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIGZuLCB2YWx1ZSwgZW50cmllcykge1xuICB0cnkge1xuICAgIHJldHVybiBlbnRyaWVzID8gZm4oYW5PYmplY3QodmFsdWUpWzBdLCB2YWx1ZVsxXSkgOiBmbih2YWx1ZSk7XG4gIC8vIDcuNC42IEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsIGNvbXBsZXRpb24pXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB2YXIgcmV0ID0gaXRlcmF0b3JbJ3JldHVybiddO1xuICAgIGlmIChyZXQgIT09IHVuZGVmaW5lZCkgYW5PYmplY3QocmV0LmNhbGwoaXRlcmF0b3IpKTtcbiAgICB0aHJvdyBlO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKTtcbnZhciBkZXNjcmlwdG9yID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuXG4vLyAyNS4xLjIuMS4xICVJdGVyYXRvclByb3RvdHlwZSVbQEBpdGVyYXRvcl0oKVxucmVxdWlyZSgnLi9faGlkZScpKEl0ZXJhdG9yUHJvdG90eXBlLCByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KSB7XG4gIENvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSwgeyBuZXh0OiBkZXNjcmlwdG9yKDEsIG5leHQpIH0pO1xuICBzZXRUb1N0cmluZ1RhZyhDb25zdHJ1Y3RvciwgTkFNRSArICcgSXRlcmF0b3InKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgTElCUkFSWSA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgJGl0ZXJDcmVhdGUgPSByZXF1aXJlKCcuL19pdGVyLWNyZWF0ZScpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcbnZhciBJVEVSQVRPUiA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpO1xudmFyIEJVR0dZID0gIShbXS5rZXlzICYmICduZXh0JyBpbiBbXS5rZXlzKCkpOyAvLyBTYWZhcmkgaGFzIGJ1Z2d5IGl0ZXJhdG9ycyB3L28gYG5leHRgXG52YXIgRkZfSVRFUkFUT1IgPSAnQEBpdGVyYXRvcic7XG52YXIgS0VZUyA9ICdrZXlzJztcbnZhciBWQUxVRVMgPSAndmFsdWVzJztcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChCYXNlLCBOQU1FLCBDb25zdHJ1Y3RvciwgbmV4dCwgREVGQVVMVCwgSVNfU0VULCBGT1JDRUQpIHtcbiAgJGl0ZXJDcmVhdGUoQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpO1xuICB2YXIgZ2V0TWV0aG9kID0gZnVuY3Rpb24gKGtpbmQpIHtcbiAgICBpZiAoIUJVR0dZICYmIGtpbmQgaW4gcHJvdG8pIHJldHVybiBwcm90b1traW5kXTtcbiAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgIGNhc2UgS0VZUzogcmV0dXJuIGZ1bmN0aW9uIGtleXMoKSB7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gICAgICBjYXNlIFZBTFVFUzogcmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICB9IHJldHVybiBmdW5jdGlvbiBlbnRyaWVzKCkgeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICB9O1xuICB2YXIgVEFHID0gTkFNRSArICcgSXRlcmF0b3InO1xuICB2YXIgREVGX1ZBTFVFUyA9IERFRkFVTFQgPT0gVkFMVUVTO1xuICB2YXIgVkFMVUVTX0JVRyA9IGZhbHNlO1xuICB2YXIgcHJvdG8gPSBCYXNlLnByb3RvdHlwZTtcbiAgdmFyICRuYXRpdmUgPSBwcm90b1tJVEVSQVRPUl0gfHwgcHJvdG9bRkZfSVRFUkFUT1JdIHx8IERFRkFVTFQgJiYgcHJvdG9bREVGQVVMVF07XG4gIHZhciAkZGVmYXVsdCA9ICRuYXRpdmUgfHwgZ2V0TWV0aG9kKERFRkFVTFQpO1xuICB2YXIgJGVudHJpZXMgPSBERUZBVUxUID8gIURFRl9WQUxVRVMgPyAkZGVmYXVsdCA6IGdldE1ldGhvZCgnZW50cmllcycpIDogdW5kZWZpbmVkO1xuICB2YXIgJGFueU5hdGl2ZSA9IE5BTUUgPT0gJ0FycmF5JyA/IHByb3RvLmVudHJpZXMgfHwgJG5hdGl2ZSA6ICRuYXRpdmU7XG4gIHZhciBtZXRob2RzLCBrZXksIEl0ZXJhdG9yUHJvdG90eXBlO1xuICAvLyBGaXggbmF0aXZlXG4gIGlmICgkYW55TmF0aXZlKSB7XG4gICAgSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZigkYW55TmF0aXZlLmNhbGwobmV3IEJhc2UoKSkpO1xuICAgIGlmIChJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBJdGVyYXRvclByb3RvdHlwZS5uZXh0KSB7XG4gICAgICAvLyBTZXQgQEB0b1N0cmluZ1RhZyB0byBuYXRpdmUgaXRlcmF0b3JzXG4gICAgICBzZXRUb1N0cmluZ1RhZyhJdGVyYXRvclByb3RvdHlwZSwgVEFHLCB0cnVlKTtcbiAgICAgIC8vIGZpeCBmb3Igc29tZSBvbGQgZW5naW5lc1xuICAgICAgaWYgKCFMSUJSQVJZICYmIHR5cGVvZiBJdGVyYXRvclByb3RvdHlwZVtJVEVSQVRPUl0gIT0gJ2Z1bmN0aW9uJykgaGlkZShJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpO1xuICAgIH1cbiAgfVxuICAvLyBmaXggQXJyYXkje3ZhbHVlcywgQEBpdGVyYXRvcn0ubmFtZSBpbiBWOCAvIEZGXG4gIGlmIChERUZfVkFMVUVTICYmICRuYXRpdmUgJiYgJG5hdGl2ZS5uYW1lICE9PSBWQUxVRVMpIHtcbiAgICBWQUxVRVNfQlVHID0gdHJ1ZTtcbiAgICAkZGVmYXVsdCA9IGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuICRuYXRpdmUuY2FsbCh0aGlzKTsgfTtcbiAgfVxuICAvLyBEZWZpbmUgaXRlcmF0b3JcbiAgaWYgKCghTElCUkFSWSB8fCBGT1JDRUQpICYmIChCVUdHWSB8fCBWQUxVRVNfQlVHIHx8ICFwcm90b1tJVEVSQVRPUl0pKSB7XG4gICAgaGlkZShwcm90bywgSVRFUkFUT1IsICRkZWZhdWx0KTtcbiAgfVxuICAvLyBQbHVnIGZvciBsaWJyYXJ5XG4gIEl0ZXJhdG9yc1tOQU1FXSA9ICRkZWZhdWx0O1xuICBJdGVyYXRvcnNbVEFHXSA9IHJldHVyblRoaXM7XG4gIGlmIChERUZBVUxUKSB7XG4gICAgbWV0aG9kcyA9IHtcbiAgICAgIHZhbHVlczogREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKFZBTFVFUyksXG4gICAgICBrZXlzOiBJU19TRVQgPyAkZGVmYXVsdCA6IGdldE1ldGhvZChLRVlTKSxcbiAgICAgIGVudHJpZXM6ICRlbnRyaWVzXG4gICAgfTtcbiAgICBpZiAoRk9SQ0VEKSBmb3IgKGtleSBpbiBtZXRob2RzKSB7XG4gICAgICBpZiAoIShrZXkgaW4gcHJvdG8pKSByZWRlZmluZShwcm90bywga2V5LCBtZXRob2RzW2tleV0pO1xuICAgIH0gZWxzZSAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChCVUdHWSB8fCBWQUxVRVNfQlVHKSwgTkFNRSwgbWV0aG9kcyk7XG4gIH1cbiAgcmV0dXJuIG1ldGhvZHM7XG59O1xuIiwidmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciByaXRlciA9IFs3XVtJVEVSQVRPUl0oKTtcbiAgcml0ZXJbJ3JldHVybiddID0gZnVuY3Rpb24gKCkgeyBTQUZFX0NMT1NJTkcgPSB0cnVlOyB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGhyb3ctbGl0ZXJhbFxuICBBcnJheS5mcm9tKHJpdGVyLCBmdW5jdGlvbiAoKSB7IHRocm93IDI7IH0pO1xufSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMsIHNraXBDbG9zaW5nKSB7XG4gIGlmICghc2tpcENsb3NpbmcgJiYgIVNBRkVfQ0xPU0lORykgcmV0dXJuIGZhbHNlO1xuICB2YXIgc2FmZSA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBhcnIgPSBbN107XG4gICAgdmFyIGl0ZXIgPSBhcnJbSVRFUkFUT1JdKCk7XG4gICAgaXRlci5uZXh0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4geyBkb25lOiBzYWZlID0gdHJ1ZSB9OyB9O1xuICAgIGFycltJVEVSQVRPUl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBpdGVyOyB9O1xuICAgIGV4ZWMoYXJyKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBzYWZlO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGRvbmUsIHZhbHVlKSB7XG4gIHJldHVybiB7IHZhbHVlOiB2YWx1ZSwgZG9uZTogISFkb25lIH07XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7fTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZmFsc2U7XG4iLCIvLyAyMC4yLjIuMTQgTWF0aC5leHBtMSh4KVxudmFyICRleHBtMSA9IE1hdGguZXhwbTE7XG5tb2R1bGUuZXhwb3J0cyA9ICghJGV4cG0xXG4gIC8vIE9sZCBGRiBidWdcbiAgfHwgJGV4cG0xKDEwKSA+IDIyMDI1LjQ2NTc5NDgwNjcxOSB8fCAkZXhwbTEoMTApIDwgMjIwMjUuNDY1Nzk0ODA2NzE2NTE2OFxuICAvLyBUb3IgQnJvd3NlciBidWdcbiAgfHwgJGV4cG0xKC0yZS0xNykgIT0gLTJlLTE3XG4pID8gZnVuY3Rpb24gZXhwbTEoeCkge1xuICByZXR1cm4gKHggPSAreCkgPT0gMCA/IHggOiB4ID4gLTFlLTYgJiYgeCA8IDFlLTYgPyB4ICsgeCAqIHggLyAyIDogTWF0aC5leHAoeCkgLSAxO1xufSA6ICRleHBtMTtcbiIsIi8vIDIwLjIuMi4xNiBNYXRoLmZyb3VuZCh4KVxudmFyIHNpZ24gPSByZXF1aXJlKCcuL19tYXRoLXNpZ24nKTtcbnZhciBwb3cgPSBNYXRoLnBvdztcbnZhciBFUFNJTE9OID0gcG93KDIsIC01Mik7XG52YXIgRVBTSUxPTjMyID0gcG93KDIsIC0yMyk7XG52YXIgTUFYMzIgPSBwb3coMiwgMTI3KSAqICgyIC0gRVBTSUxPTjMyKTtcbnZhciBNSU4zMiA9IHBvdygyLCAtMTI2KTtcblxudmFyIHJvdW5kVGllc1RvRXZlbiA9IGZ1bmN0aW9uIChuKSB7XG4gIHJldHVybiBuICsgMSAvIEVQU0lMT04gLSAxIC8gRVBTSUxPTjtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gTWF0aC5mcm91bmQgfHwgZnVuY3Rpb24gZnJvdW5kKHgpIHtcbiAgdmFyICRhYnMgPSBNYXRoLmFicyh4KTtcbiAgdmFyICRzaWduID0gc2lnbih4KTtcbiAgdmFyIGEsIHJlc3VsdDtcbiAgaWYgKCRhYnMgPCBNSU4zMikgcmV0dXJuICRzaWduICogcm91bmRUaWVzVG9FdmVuKCRhYnMgLyBNSU4zMiAvIEVQU0lMT04zMikgKiBNSU4zMiAqIEVQU0lMT04zMjtcbiAgYSA9ICgxICsgRVBTSUxPTjMyIC8gRVBTSUxPTikgKiAkYWJzO1xuICByZXN1bHQgPSBhIC0gKGEgLSAkYWJzKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICBpZiAocmVzdWx0ID4gTUFYMzIgfHwgcmVzdWx0ICE9IHJlc3VsdCkgcmV0dXJuICRzaWduICogSW5maW5pdHk7XG4gIHJldHVybiAkc2lnbiAqIHJlc3VsdDtcbn07XG4iLCIvLyAyMC4yLjIuMjAgTWF0aC5sb2cxcCh4KVxubW9kdWxlLmV4cG9ydHMgPSBNYXRoLmxvZzFwIHx8IGZ1bmN0aW9uIGxvZzFwKHgpIHtcbiAgcmV0dXJuICh4ID0gK3gpID4gLTFlLTggJiYgeCA8IDFlLTggPyB4IC0geCAqIHggLyAyIDogTWF0aC5sb2coMSArIHgpO1xufTtcbiIsIi8vIGh0dHBzOi8vcndhbGRyb24uZ2l0aHViLmlvL3Byb3Bvc2FsLW1hdGgtZXh0ZW5zaW9ucy9cbm1vZHVsZS5leHBvcnRzID0gTWF0aC5zY2FsZSB8fCBmdW5jdGlvbiBzY2FsZSh4LCBpbkxvdywgaW5IaWdoLCBvdXRMb3csIG91dEhpZ2gpIHtcbiAgaWYgKFxuICAgIGFyZ3VtZW50cy5sZW5ndGggPT09IDBcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgIHx8IHggIT0geFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgICAgfHwgaW5Mb3cgIT0gaW5Mb3dcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgIHx8IGluSGlnaCAhPSBpbkhpZ2hcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgIHx8IG91dExvdyAhPSBvdXRMb3dcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgIHx8IG91dEhpZ2ggIT0gb3V0SGlnaFxuICApIHJldHVybiBOYU47XG4gIGlmICh4ID09PSBJbmZpbml0eSB8fCB4ID09PSAtSW5maW5pdHkpIHJldHVybiB4O1xuICByZXR1cm4gKHggLSBpbkxvdykgKiAob3V0SGlnaCAtIG91dExvdykgLyAoaW5IaWdoIC0gaW5Mb3cpICsgb3V0TG93O1xufTtcbiIsIi8vIDIwLjIuMi4yOCBNYXRoLnNpZ24oeClcbm1vZHVsZS5leHBvcnRzID0gTWF0aC5zaWduIHx8IGZ1bmN0aW9uIHNpZ24oeCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIHJldHVybiAoeCA9ICt4KSA9PSAwIHx8IHggIT0geCA/IHggOiB4IDwgMCA/IC0xIDogMTtcbn07XG4iLCJ2YXIgTUVUQSA9IHJlcXVpcmUoJy4vX3VpZCcpKCdtZXRhJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBzZXREZXNjID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBpZCA9IDA7XG52YXIgaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZSB8fCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0cnVlO1xufTtcbnZhciBGUkVFWkUgPSAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBpc0V4dGVuc2libGUoT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHt9KSk7XG59KTtcbnZhciBzZXRNZXRhID0gZnVuY3Rpb24gKGl0KSB7XG4gIHNldERlc2MoaXQsIE1FVEEsIHsgdmFsdWU6IHtcbiAgICBpOiAnTycgKyArK2lkLCAvLyBvYmplY3QgSURcbiAgICB3OiB7fSAgICAgICAgICAvLyB3ZWFrIGNvbGxlY3Rpb25zIElEc1xuICB9IH0pO1xufTtcbnZhciBmYXN0S2V5ID0gZnVuY3Rpb24gKGl0LCBjcmVhdGUpIHtcbiAgLy8gcmV0dXJuIHByaW1pdGl2ZSB3aXRoIHByZWZpeFxuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJyA/IGl0IDogKHR5cGVvZiBpdCA9PSAnc3RyaW5nJyA/ICdTJyA6ICdQJykgKyBpdDtcbiAgaWYgKCFoYXMoaXQsIE1FVEEpKSB7XG4gICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RcbiAgICBpZiAoIWlzRXh0ZW5zaWJsZShpdCkpIHJldHVybiAnRic7XG4gICAgLy8gbm90IG5lY2Vzc2FyeSB0byBhZGQgbWV0YWRhdGFcbiAgICBpZiAoIWNyZWF0ZSkgcmV0dXJuICdFJztcbiAgICAvLyBhZGQgbWlzc2luZyBtZXRhZGF0YVxuICAgIHNldE1ldGEoaXQpO1xuICAvLyByZXR1cm4gb2JqZWN0IElEXG4gIH0gcmV0dXJuIGl0W01FVEFdLmk7XG59O1xudmFyIGdldFdlYWsgPSBmdW5jdGlvbiAoaXQsIGNyZWF0ZSkge1xuICBpZiAoIWhhcyhpdCwgTUVUQSkpIHtcbiAgICAvLyBjYW4ndCBzZXQgbWV0YWRhdGEgdG8gdW5jYXVnaHQgZnJvemVuIG9iamVjdFxuICAgIGlmICghaXNFeHRlbnNpYmxlKGl0KSkgcmV0dXJuIHRydWU7XG4gICAgLy8gbm90IG5lY2Vzc2FyeSB0byBhZGQgbWV0YWRhdGFcbiAgICBpZiAoIWNyZWF0ZSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG4gICAgc2V0TWV0YShpdCk7XG4gIC8vIHJldHVybiBoYXNoIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH0gcmV0dXJuIGl0W01FVEFdLnc7XG59O1xuLy8gYWRkIG1ldGFkYXRhIG9uIGZyZWV6ZS1mYW1pbHkgbWV0aG9kcyBjYWxsaW5nXG52YXIgb25GcmVlemUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKEZSRUVaRSAmJiBtZXRhLk5FRUQgJiYgaXNFeHRlbnNpYmxlKGl0KSAmJiAhaGFzKGl0LCBNRVRBKSkgc2V0TWV0YShpdCk7XG4gIHJldHVybiBpdDtcbn07XG52YXIgbWV0YSA9IG1vZHVsZS5leHBvcnRzID0ge1xuICBLRVk6IE1FVEEsXG4gIE5FRUQ6IGZhbHNlLFxuICBmYXN0S2V5OiBmYXN0S2V5LFxuICBnZXRXZWFrOiBnZXRXZWFrLFxuICBvbkZyZWV6ZTogb25GcmVlemVcbn07XG4iLCJ2YXIgTWFwID0gcmVxdWlyZSgnLi9lczYubWFwJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCdtZXRhZGF0YScpO1xudmFyIHN0b3JlID0gc2hhcmVkLnN0b3JlIHx8IChzaGFyZWQuc3RvcmUgPSBuZXcgKHJlcXVpcmUoJy4vZXM2LndlYWstbWFwJykpKCkpO1xuXG52YXIgZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcCA9IGZ1bmN0aW9uICh0YXJnZXQsIHRhcmdldEtleSwgY3JlYXRlKSB7XG4gIHZhciB0YXJnZXRNZXRhZGF0YSA9IHN0b3JlLmdldCh0YXJnZXQpO1xuICBpZiAoIXRhcmdldE1ldGFkYXRhKSB7XG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgc3RvcmUuc2V0KHRhcmdldCwgdGFyZ2V0TWV0YWRhdGEgPSBuZXcgTWFwKCkpO1xuICB9XG4gIHZhciBrZXlNZXRhZGF0YSA9IHRhcmdldE1ldGFkYXRhLmdldCh0YXJnZXRLZXkpO1xuICBpZiAoIWtleU1ldGFkYXRhKSB7XG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgdGFyZ2V0TWV0YWRhdGEuc2V0KHRhcmdldEtleSwga2V5TWV0YWRhdGEgPSBuZXcgTWFwKCkpO1xuICB9IHJldHVybiBrZXlNZXRhZGF0YTtcbn07XG52YXIgb3JkaW5hcnlIYXNPd25NZXRhZGF0YSA9IGZ1bmN0aW9uIChNZXRhZGF0YUtleSwgTywgUCkge1xuICB2YXIgbWV0YWRhdGFNYXAgPSBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIGZhbHNlKTtcbiAgcmV0dXJuIG1ldGFkYXRhTWFwID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IG1ldGFkYXRhTWFwLmhhcyhNZXRhZGF0YUtleSk7XG59O1xudmFyIG9yZGluYXJ5R2V0T3duTWV0YWRhdGEgPSBmdW5jdGlvbiAoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgdmFyIG1ldGFkYXRhTWFwID0gZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCBmYWxzZSk7XG4gIHJldHVybiBtZXRhZGF0YU1hcCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogbWV0YWRhdGFNYXAuZ2V0KE1ldGFkYXRhS2V5KTtcbn07XG52YXIgb3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YSA9IGZ1bmN0aW9uIChNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUCkge1xuICBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIHRydWUpLnNldChNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSk7XG59O1xudmFyIG9yZGluYXJ5T3duTWV0YWRhdGFLZXlzID0gZnVuY3Rpb24gKHRhcmdldCwgdGFyZ2V0S2V5KSB7XG4gIHZhciBtZXRhZGF0YU1hcCA9IGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAodGFyZ2V0LCB0YXJnZXRLZXksIGZhbHNlKTtcbiAgdmFyIGtleXMgPSBbXTtcbiAgaWYgKG1ldGFkYXRhTWFwKSBtZXRhZGF0YU1hcC5mb3JFYWNoKGZ1bmN0aW9uIChfLCBrZXkpIHsga2V5cy5wdXNoKGtleSk7IH0pO1xuICByZXR1cm4ga2V5cztcbn07XG52YXIgdG9NZXRhS2V5ID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBpdCA9PSAnc3ltYm9sJyA/IGl0IDogU3RyaW5nKGl0KTtcbn07XG52YXIgZXhwID0gZnVuY3Rpb24gKE8pIHtcbiAgJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0JywgTyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc3RvcmU6IHN0b3JlLFxuICBtYXA6IGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAsXG4gIGhhczogb3JkaW5hcnlIYXNPd25NZXRhZGF0YSxcbiAgZ2V0OiBvcmRpbmFyeUdldE93bk1ldGFkYXRhLFxuICBzZXQ6IG9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEsXG4gIGtleXM6IG9yZGluYXJ5T3duTWV0YWRhdGFLZXlzLFxuICBrZXk6IHRvTWV0YUtleSxcbiAgZXhwOiBleHBcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgbWFjcm90YXNrID0gcmVxdWlyZSgnLi9fdGFzaycpLnNldDtcbnZhciBPYnNlcnZlciA9IGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciBQcm9taXNlID0gZ2xvYmFsLlByb21pc2U7XG52YXIgaXNOb2RlID0gcmVxdWlyZSgnLi9fY29mJykocHJvY2VzcykgPT0gJ3Byb2Nlc3MnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGhlYWQsIGxhc3QsIG5vdGlmeTtcblxuICB2YXIgZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHBhcmVudCwgZm47XG4gICAgaWYgKGlzTm9kZSAmJiAocGFyZW50ID0gcHJvY2Vzcy5kb21haW4pKSBwYXJlbnQuZXhpdCgpO1xuICAgIHdoaWxlIChoZWFkKSB7XG4gICAgICBmbiA9IGhlYWQuZm47XG4gICAgICBoZWFkID0gaGVhZC5uZXh0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm4oKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGhlYWQpIG5vdGlmeSgpO1xuICAgICAgICBlbHNlIGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgIGlmIChwYXJlbnQpIHBhcmVudC5lbnRlcigpO1xuICB9O1xuXG4gIC8vIE5vZGUuanNcbiAgaWYgKGlzTm9kZSkge1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZmx1c2gpO1xuICAgIH07XG4gIC8vIGJyb3dzZXJzIHdpdGggTXV0YXRpb25PYnNlcnZlciwgZXhjZXB0IGlPUyBTYWZhcmkgLSBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMzM5XG4gIH0gZWxzZSBpZiAoT2JzZXJ2ZXIgJiYgIShnbG9iYWwubmF2aWdhdG9yICYmIGdsb2JhbC5uYXZpZ2F0b3Iuc3RhbmRhbG9uZSkpIHtcbiAgICB2YXIgdG9nZ2xlID0gdHJ1ZTtcbiAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgICBuZXcgT2JzZXJ2ZXIoZmx1c2gpLm9ic2VydmUobm9kZSwgeyBjaGFyYWN0ZXJEYXRhOiB0cnVlIH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vZGUuZGF0YSA9IHRvZ2dsZSA9ICF0b2dnbGU7XG4gICAgfTtcbiAgLy8gZW52aXJvbm1lbnRzIHdpdGggbWF5YmUgbm9uLWNvbXBsZXRlbHkgY29ycmVjdCwgYnV0IGV4aXN0ZW50IFByb21pc2VcbiAgfSBlbHNlIGlmIChQcm9taXNlICYmIFByb21pc2UucmVzb2x2ZSkge1xuICAgIC8vIFByb21pc2UucmVzb2x2ZSB3aXRob3V0IGFuIGFyZ3VtZW50IHRocm93cyBhbiBlcnJvciBpbiBMRyBXZWJPUyAyXG4gICAgdmFyIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9taXNlLnRoZW4oZmx1c2gpO1xuICAgIH07XG4gIC8vIGZvciBvdGhlciBlbnZpcm9ubWVudHMgLSBtYWNyb3Rhc2sgYmFzZWQgb246XG4gIC8vIC0gc2V0SW1tZWRpYXRlXG4gIC8vIC0gTWVzc2FnZUNoYW5uZWxcbiAgLy8gLSB3aW5kb3cucG9zdE1lc3NhZ1xuICAvLyAtIG9ucmVhZHlzdGF0ZWNoYW5nZVxuICAvLyAtIHNldFRpbWVvdXRcbiAgfSBlbHNlIHtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBzdHJhbmdlIElFICsgd2VicGFjayBkZXYgc2VydmVyIGJ1ZyAtIHVzZSAuY2FsbChnbG9iYWwpXG4gICAgICBtYWNyb3Rhc2suY2FsbChnbG9iYWwsIGZsdXNoKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChmbikge1xuICAgIHZhciB0YXNrID0geyBmbjogZm4sIG5leHQ6IHVuZGVmaW5lZCB9O1xuICAgIGlmIChsYXN0KSBsYXN0Lm5leHQgPSB0YXNrO1xuICAgIGlmICghaGVhZCkge1xuICAgICAgaGVhZCA9IHRhc2s7XG4gICAgICBub3RpZnkoKTtcbiAgICB9IGxhc3QgPSB0YXNrO1xuICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIDI1LjQuMS41IE5ld1Byb21pc2VDYXBhYmlsaXR5KEMpXG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xuXG5mdW5jdGlvbiBQcm9taXNlQ2FwYWJpbGl0eShDKSB7XG4gIHZhciByZXNvbHZlLCByZWplY3Q7XG4gIHRoaXMucHJvbWlzZSA9IG5ldyBDKGZ1bmN0aW9uICgkJHJlc29sdmUsICQkcmVqZWN0KSB7XG4gICAgaWYgKHJlc29sdmUgIT09IHVuZGVmaW5lZCB8fCByZWplY3QgIT09IHVuZGVmaW5lZCkgdGhyb3cgVHlwZUVycm9yKCdCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xuICAgIHJlc29sdmUgPSAkJHJlc29sdmU7XG4gICAgcmVqZWN0ID0gJCRyZWplY3Q7XG4gIH0pO1xuICB0aGlzLnJlc29sdmUgPSBhRnVuY3Rpb24ocmVzb2x2ZSk7XG4gIHRoaXMucmVqZWN0ID0gYUZ1bmN0aW9uKHJlamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiAoQykge1xuICByZXR1cm4gbmV3IFByb21pc2VDYXBhYmlsaXR5KEMpO1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIDE5LjEuMi4xIE9iamVjdC5hc3NpZ24odGFyZ2V0LCBzb3VyY2UsIC4uLilcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyk7XG52YXIgZ2V0S2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG52YXIgZ09QUyA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BzJyk7XG52YXIgcElFID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKTtcbnZhciAkYXNzaWduID0gT2JqZWN0LmFzc2lnbjtcblxuLy8gc2hvdWxkIHdvcmsgd2l0aCBzeW1ib2xzIGFuZCBzaG91bGQgaGF2ZSBkZXRlcm1pbmlzdGljIHByb3BlcnR5IG9yZGVyIChWOCBidWcpXG5tb2R1bGUuZXhwb3J0cyA9ICEkYXNzaWduIHx8IHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICB2YXIgQSA9IHt9O1xuICB2YXIgQiA9IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgdmFyIFMgPSBTeW1ib2woKTtcbiAgdmFyIEsgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3QnO1xuICBBW1NdID0gNztcbiAgSy5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAoaykgeyBCW2tdID0gazsgfSk7XG4gIHJldHVybiAkYXNzaWduKHt9LCBBKVtTXSAhPSA3IHx8IE9iamVjdC5rZXlzKCRhc3NpZ24oe30sIEIpKS5qb2luKCcnKSAhPSBLO1xufSkgPyBmdW5jdGlvbiBhc3NpZ24odGFyZ2V0LCBzb3VyY2UpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICB2YXIgVCA9IHRvT2JqZWN0KHRhcmdldCk7XG4gIHZhciBhTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIGluZGV4ID0gMTtcbiAgdmFyIGdldFN5bWJvbHMgPSBnT1BTLmY7XG4gIHZhciBpc0VudW0gPSBwSUUuZjtcbiAgd2hpbGUgKGFMZW4gPiBpbmRleCkge1xuICAgIHZhciBTID0gSU9iamVjdChhcmd1bWVudHNbaW5kZXgrK10pO1xuICAgIHZhciBrZXlzID0gZ2V0U3ltYm9scyA/IGdldEtleXMoUykuY29uY2F0KGdldFN5bWJvbHMoUykpIDogZ2V0S2V5cyhTKTtcbiAgICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgdmFyIGogPSAwO1xuICAgIHZhciBrZXk7XG4gICAgd2hpbGUgKGxlbmd0aCA+IGopIHtcbiAgICAgIGtleSA9IGtleXNbaisrXTtcbiAgICAgIGlmICghREVTQ1JJUFRPUlMgfHwgaXNFbnVtLmNhbGwoUywga2V5KSkgVFtrZXldID0gU1trZXldO1xuICAgIH1cbiAgfSByZXR1cm4gVDtcbn0gOiAkYXNzaWduO1xuIiwiLy8gMTkuMS4yLjIgLyAxNS4yLjMuNSBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBkUHMgPSByZXF1aXJlKCcuL19vYmplY3QtZHBzJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJyk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG52YXIgRW1wdHkgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cbi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBmYWtlIGBudWxsYCBwcm90b3R5cGU6IHVzZSBpZnJhbWUgT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGVcbnZhciBjcmVhdGVEaWN0ID0gZnVuY3Rpb24gKCkge1xuICAvLyBUaHJhc2gsIHdhc3RlIGFuZCBzb2RvbXk6IElFIEdDIGJ1Z1xuICB2YXIgaWZyYW1lID0gcmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpKCdpZnJhbWUnKTtcbiAgdmFyIGkgPSBlbnVtQnVnS2V5cy5sZW5ndGg7XG4gIHZhciBsdCA9ICc8JztcbiAgdmFyIGd0ID0gJz4nO1xuICB2YXIgaWZyYW1lRG9jdW1lbnQ7XG4gIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXF1aXJlKCcuL19odG1sJykuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lLnNyYyA9ICdqYXZhc2NyaXB0Oic7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2NyaXB0LXVybFxuICAvLyBjcmVhdGVEaWN0ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuT2JqZWN0O1xuICAvLyBodG1sLnJlbW92ZUNoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgaWZyYW1lRG9jdW1lbnQud3JpdGUobHQgKyAnc2NyaXB0JyArIGd0ICsgJ2RvY3VtZW50LkY9T2JqZWN0JyArIGx0ICsgJy9zY3JpcHQnICsgZ3QpO1xuICBpZnJhbWVEb2N1bWVudC5jbG9zZSgpO1xuICBjcmVhdGVEaWN0ID0gaWZyYW1lRG9jdW1lbnQuRjtcbiAgd2hpbGUgKGktLSkgZGVsZXRlIGNyZWF0ZURpY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tpXV07XG4gIHJldHVybiBjcmVhdGVEaWN0KCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpIHtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKE8gIT09IG51bGwpIHtcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gYW5PYmplY3QoTyk7XG4gICAgcmVzdWx0ID0gbmV3IEVtcHR5KCk7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IG51bGw7XG4gICAgLy8gYWRkIFwiX19wcm90b19fXCIgZm9yIE9iamVjdC5nZXRQcm90b3R5cGVPZiBwb2x5ZmlsbFxuICAgIHJlc3VsdFtJRV9QUk9UT10gPSBPO1xuICB9IGVsc2UgcmVzdWx0ID0gY3JlYXRlRGljdCgpO1xuICByZXR1cm4gUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogZFBzKHJlc3VsdCwgUHJvcGVydGllcyk7XG59O1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuL19pZTgtZG9tLWRlZmluZScpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG52YXIgZFAgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbmV4cG9ydHMuZiA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuIGRQKE8sIFAsIEF0dHJpYnV0ZXMpO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKCdnZXQnIGluIEF0dHJpYnV0ZXMgfHwgJ3NldCcgaW4gQXR0cmlidXRlcykgdGhyb3cgVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCEnKTtcbiAgaWYgKCd2YWx1ZScgaW4gQXR0cmlidXRlcykgT1tQXSA9IEF0dHJpYnV0ZXMudmFsdWU7XG4gIHJldHVybiBPO1xufTtcbiIsInZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgZ2V0S2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICB2YXIga2V5cyA9IGdldEtleXMoUHJvcGVydGllcyk7XG4gIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgdmFyIGkgPSAwO1xuICB2YXIgUDtcbiAgd2hpbGUgKGxlbmd0aCA+IGkpIGRQLmYoTywgUCA9IGtleXNbaSsrXSwgUHJvcGVydGllc1tQXSk7XG4gIHJldHVybiBPO1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIEZvcmNlZCByZXBsYWNlbWVudCBwcm90b3R5cGUgYWNjZXNzb3JzIG1ldGhvZHNcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fbGlicmFyeScpIHx8ICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgdmFyIEsgPSBNYXRoLnJhbmRvbSgpO1xuICAvLyBJbiBGRiB0aHJvd3Mgb25seSBkZWZpbmUgbWV0aG9kc1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWYsIG5vLXVzZWxlc3MtY2FsbFxuICBfX2RlZmluZVNldHRlcl9fLmNhbGwobnVsbCwgSywgZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbiAgZGVsZXRlIHJlcXVpcmUoJy4vX2dsb2JhbCcpW0tdO1xufSk7XG4iLCJ2YXIgcElFID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpO1xudmFyIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuL19pZTgtZG9tLWRlZmluZScpO1xudmFyIGdPUEQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG5leHBvcnRzLmYgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gZ09QRCA6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKSB7XG4gIE8gPSB0b0lPYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiBnT1BEKE8sIFApO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKGhhcyhPLCBQKSkgcmV0dXJuIGNyZWF0ZURlc2MoIXBJRS5mLmNhbGwoTywgUCksIE9bUF0pO1xufTtcbiIsIi8vIGZhbGxiYWNrIGZvciBJRTExIGJ1Z2d5IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHdpdGggaWZyYW1lIGFuZCB3aW5kb3dcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgZ09QTiA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZjtcbnZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG52YXIgd2luZG93TmFtZXMgPSB0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnICYmIHdpbmRvdyAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc1xuICA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHdpbmRvdykgOiBbXTtcblxudmFyIGdldFdpbmRvd05hbWVzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGdPUE4oaXQpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHdpbmRvd05hbWVzLnNsaWNlKCk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KSB7XG4gIHJldHVybiB3aW5kb3dOYW1lcyAmJiB0b1N0cmluZy5jYWxsKGl0KSA9PSAnW29iamVjdCBXaW5kb3ddJyA/IGdldFdpbmRvd05hbWVzKGl0KSA6IGdPUE4odG9JT2JqZWN0KGl0KSk7XG59O1xuIiwiLy8gMTkuMS4yLjcgLyAxNS4yLjMuNCBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxudmFyICRrZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpLmNvbmNhdCgnbGVuZ3RoJywgJ3Byb3RvdHlwZScpO1xuXG5leHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKE8pIHtcbiAgcmV0dXJuICRrZXlzKE8sIGhpZGRlbktleXMpO1xufTtcbiIsImV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG4iLCIvLyAxOS4xLjIuOSAvIDE1LjIuMy4yIE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG52YXIgT2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiAoTykge1xuICBPID0gdG9PYmplY3QoTyk7XG4gIGlmIChoYXMoTywgSUVfUFJPVE8pKSByZXR1cm4gT1tJRV9QUk9UT107XG4gIGlmICh0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIE8uY29uc3RydWN0b3IucHJvdG90eXBlO1xuICB9IHJldHVybiBPIGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG8gOiBudWxsO1xufTtcbiIsInZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgYXJyYXlJbmRleE9mID0gcmVxdWlyZSgnLi9fYXJyYXktaW5jbHVkZXMnKShmYWxzZSk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZXMpIHtcbiAgdmFyIE8gPSB0b0lPYmplY3Qob2JqZWN0KTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBrZXk7XG4gIGZvciAoa2V5IGluIE8pIGlmIChrZXkgIT0gSUVfUFJPVE8pIGhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIGlmIChoYXMoTywga2V5ID0gbmFtZXNbaSsrXSkpIHtcbiAgICB+YXJyYXlJbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwiLy8gMTkuMS4yLjE0IC8gMTUuMi4zLjE0IE9iamVjdC5rZXlzKE8pXG52YXIgJGtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXMoTykge1xuICByZXR1cm4gJGtleXMoTywgZW51bUJ1Z0tleXMpO1xufTtcbiIsImV4cG9ydHMuZiA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuIiwiLy8gbW9zdCBPYmplY3QgbWV0aG9kcyBieSBFUzYgc2hvdWxkIGFjY2VwdCBwcmltaXRpdmVzXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZLCBleGVjKSB7XG4gIHZhciBmbiA9IChjb3JlLk9iamVjdCB8fCB7fSlbS0VZXSB8fCBPYmplY3RbS0VZXTtcbiAgdmFyIGV4cCA9IHt9O1xuICBleHBbS0VZXSA9IGV4ZWMoZm4pO1xuICAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIGZhaWxzKGZ1bmN0aW9uICgpIHsgZm4oMSk7IH0pLCAnT2JqZWN0JywgZXhwKTtcbn07XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpO1xudmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciBpc0VudW0gPSByZXF1aXJlKCcuL19vYmplY3QtcGllJykuZjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGlzRW50cmllcykge1xuICByZXR1cm4gZnVuY3Rpb24gKGl0KSB7XG4gICAgdmFyIE8gPSB0b0lPYmplY3QoaXQpO1xuICAgIHZhciBrZXlzID0gZ2V0S2V5cyhPKTtcbiAgICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIga2V5O1xuICAgIHdoaWxlIChsZW5ndGggPiBpKSB7XG4gICAgICBrZXkgPSBrZXlzW2krK107XG4gICAgICBpZiAoIURFU0NSSVBUT1JTIHx8IGlzRW51bS5jYWxsKE8sIGtleSkpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goaXNFbnRyaWVzID8gW2tleSwgT1trZXldXSA6IE9ba2V5XSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59O1xuIiwiLy8gYWxsIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBub24tZW51bWVyYWJsZSBhbmQgc3ltYm9sc1xudmFyIGdPUE4gPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpO1xudmFyIGdPUFMgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wcycpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgUmVmbGVjdCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLlJlZmxlY3Q7XG5tb2R1bGUuZXhwb3J0cyA9IFJlZmxlY3QgJiYgUmVmbGVjdC5vd25LZXlzIHx8IGZ1bmN0aW9uIG93bktleXMoaXQpIHtcbiAgdmFyIGtleXMgPSBnT1BOLmYoYW5PYmplY3QoaXQpKTtcbiAgdmFyIGdldFN5bWJvbHMgPSBnT1BTLmY7XG4gIHJldHVybiBnZXRTeW1ib2xzID8ga2V5cy5jb25jYXQoZ2V0U3ltYm9scyhpdCkpIDoga2V5cztcbn07XG4iLCJ2YXIgJHBhcnNlRmxvYXQgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5wYXJzZUZsb2F0O1xudmFyICR0cmltID0gcmVxdWlyZSgnLi9fc3RyaW5nLXRyaW0nKS50cmltO1xuXG5tb2R1bGUuZXhwb3J0cyA9IDEgLyAkcGFyc2VGbG9hdChyZXF1aXJlKCcuL19zdHJpbmctd3MnKSArICctMCcpICE9PSAtSW5maW5pdHkgPyBmdW5jdGlvbiBwYXJzZUZsb2F0KHN0cikge1xuICB2YXIgc3RyaW5nID0gJHRyaW0oU3RyaW5nKHN0ciksIDMpO1xuICB2YXIgcmVzdWx0ID0gJHBhcnNlRmxvYXQoc3RyaW5nKTtcbiAgcmV0dXJuIHJlc3VsdCA9PT0gMCAmJiBzdHJpbmcuY2hhckF0KDApID09ICctJyA/IC0wIDogcmVzdWx0O1xufSA6ICRwYXJzZUZsb2F0O1xuIiwidmFyICRwYXJzZUludCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLnBhcnNlSW50O1xudmFyICR0cmltID0gcmVxdWlyZSgnLi9fc3RyaW5nLXRyaW0nKS50cmltO1xudmFyIHdzID0gcmVxdWlyZSgnLi9fc3RyaW5nLXdzJyk7XG52YXIgaGV4ID0gL15bLStdPzBbeFhdLztcblxubW9kdWxlLmV4cG9ydHMgPSAkcGFyc2VJbnQod3MgKyAnMDgnKSAhPT0gOCB8fCAkcGFyc2VJbnQod3MgKyAnMHgxNicpICE9PSAyMiA/IGZ1bmN0aW9uIHBhcnNlSW50KHN0ciwgcmFkaXgpIHtcbiAgdmFyIHN0cmluZyA9ICR0cmltKFN0cmluZyhzdHIpLCAzKTtcbiAgcmV0dXJuICRwYXJzZUludChzdHJpbmcsIChyYWRpeCA+Pj4gMCkgfHwgKGhleC50ZXN0KHN0cmluZykgPyAxNiA6IDEwKSk7XG59IDogJHBhcnNlSW50O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiB7IGU6IGZhbHNlLCB2OiBleGVjKCkgfTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB7IGU6IHRydWUsIHY6IGUgfTtcbiAgfVxufTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSByZXF1aXJlKCcuL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEMsIHgpIHtcbiAgYW5PYmplY3QoQyk7XG4gIGlmIChpc09iamVjdCh4KSAmJiB4LmNvbnN0cnVjdG9yID09PSBDKSByZXR1cm4geDtcbiAgdmFyIHByb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkuZihDKTtcbiAgdmFyIHJlc29sdmUgPSBwcm9taXNlQ2FwYWJpbGl0eS5yZXNvbHZlO1xuICByZXNvbHZlKHgpO1xuICByZXR1cm4gcHJvbWlzZUNhcGFiaWxpdHkucHJvbWlzZTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChiaXRtYXAsIHZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgZW51bWVyYWJsZTogIShiaXRtYXAgJiAxKSxcbiAgICBjb25maWd1cmFibGU6ICEoYml0bWFwICYgMiksXG4gICAgd3JpdGFibGU6ICEoYml0bWFwICYgNCksXG4gICAgdmFsdWU6IHZhbHVlXG4gIH07XG59O1xuIiwidmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgc3JjLCBzYWZlKSB7XG4gIGZvciAodmFyIGtleSBpbiBzcmMpIHJlZGVmaW5lKHRhcmdldCwga2V5LCBzcmNba2V5XSwgc2FmZSk7XG4gIHJldHVybiB0YXJnZXQ7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgU1JDID0gcmVxdWlyZSgnLi9fdWlkJykoJ3NyYycpO1xudmFyICR0b1N0cmluZyA9IHJlcXVpcmUoJy4vX2Z1bmN0aW9uLXRvLXN0cmluZycpO1xudmFyIFRPX1NUUklORyA9ICd0b1N0cmluZyc7XG52YXIgVFBMID0gKCcnICsgJHRvU3RyaW5nKS5zcGxpdChUT19TVFJJTkcpO1xuXG5yZXF1aXJlKCcuL19jb3JlJykuaW5zcGVjdFNvdXJjZSA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gJHRvU3RyaW5nLmNhbGwoaXQpO1xufTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGtleSwgdmFsLCBzYWZlKSB7XG4gIHZhciBpc0Z1bmN0aW9uID0gdHlwZW9mIHZhbCA9PSAnZnVuY3Rpb24nO1xuICBpZiAoaXNGdW5jdGlvbikgaGFzKHZhbCwgJ25hbWUnKSB8fCBoaWRlKHZhbCwgJ25hbWUnLCBrZXkpO1xuICBpZiAoT1trZXldID09PSB2YWwpIHJldHVybjtcbiAgaWYgKGlzRnVuY3Rpb24pIGhhcyh2YWwsIFNSQykgfHwgaGlkZSh2YWwsIFNSQywgT1trZXldID8gJycgKyBPW2tleV0gOiBUUEwuam9pbihTdHJpbmcoa2V5KSkpO1xuICBpZiAoTyA9PT0gZ2xvYmFsKSB7XG4gICAgT1trZXldID0gdmFsO1xuICB9IGVsc2UgaWYgKCFzYWZlKSB7XG4gICAgZGVsZXRlIE9ba2V5XTtcbiAgICBoaWRlKE8sIGtleSwgdmFsKTtcbiAgfSBlbHNlIGlmIChPW2tleV0pIHtcbiAgICBPW2tleV0gPSB2YWw7XG4gIH0gZWxzZSB7XG4gICAgaGlkZShPLCBrZXksIHZhbCk7XG4gIH1cbi8vIGFkZCBmYWtlIEZ1bmN0aW9uI3RvU3RyaW5nIGZvciBjb3JyZWN0IHdvcmsgd3JhcHBlZCBtZXRob2RzIC8gY29uc3RydWN0b3JzIHdpdGggbWV0aG9kcyBsaWtlIExvRGFzaCBpc05hdGl2ZVxufSkoRnVuY3Rpb24ucHJvdG90eXBlLCBUT19TVFJJTkcsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyAmJiB0aGlzW1NSQ10gfHwgJHRvU3RyaW5nLmNhbGwodGhpcyk7XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJyk7XG52YXIgYnVpbHRpbkV4ZWMgPSBSZWdFeHAucHJvdG90eXBlLmV4ZWM7XG5cbiAvLyBgUmVnRXhwRXhlY2AgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWdleHBleGVjXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChSLCBTKSB7XG4gIHZhciBleGVjID0gUi5leGVjO1xuICBpZiAodHlwZW9mIGV4ZWMgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgcmVzdWx0ID0gZXhlYy5jYWxsKFIsIFMpO1xuICAgIGlmICh0eXBlb2YgcmVzdWx0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVnRXhwIGV4ZWMgbWV0aG9kIHJldHVybmVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGFuIE9iamVjdCBvciBudWxsJyk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgaWYgKGNsYXNzb2YoUikgIT09ICdSZWdFeHAnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVnRXhwI2V4ZWMgY2FsbGVkIG9uIGluY29tcGF0aWJsZSByZWNlaXZlcicpO1xuICB9XG4gIHJldHVybiBidWlsdGluRXhlYy5jYWxsKFIsIFMpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHJlZ2V4cEZsYWdzID0gcmVxdWlyZSgnLi9fZmxhZ3MnKTtcblxudmFyIG5hdGl2ZUV4ZWMgPSBSZWdFeHAucHJvdG90eXBlLmV4ZWM7XG4vLyBUaGlzIGFsd2F5cyByZWZlcnMgdG8gdGhlIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbiwgYmVjYXVzZSB0aGVcbi8vIFN0cmluZyNyZXBsYWNlIHBvbHlmaWxsIHVzZXMgLi9maXgtcmVnZXhwLXdlbGwta25vd24tc3ltYm9sLWxvZ2ljLmpzLFxuLy8gd2hpY2ggbG9hZHMgdGhpcyBmaWxlIGJlZm9yZSBwYXRjaGluZyB0aGUgbWV0aG9kLlxudmFyIG5hdGl2ZVJlcGxhY2UgPSBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2U7XG5cbnZhciBwYXRjaGVkRXhlYyA9IG5hdGl2ZUV4ZWM7XG5cbnZhciBMQVNUX0lOREVYID0gJ2xhc3RJbmRleCc7XG5cbnZhciBVUERBVEVTX0xBU1RfSU5ERVhfV1JPTkcgPSAoZnVuY3Rpb24gKCkge1xuICB2YXIgcmUxID0gL2EvLFxuICAgICAgcmUyID0gL2IqL2c7XG4gIG5hdGl2ZUV4ZWMuY2FsbChyZTEsICdhJyk7XG4gIG5hdGl2ZUV4ZWMuY2FsbChyZTIsICdhJyk7XG4gIHJldHVybiByZTFbTEFTVF9JTkRFWF0gIT09IDAgfHwgcmUyW0xBU1RfSU5ERVhdICE9PSAwO1xufSkoKTtcblxuLy8gbm9ucGFydGljaXBhdGluZyBjYXB0dXJpbmcgZ3JvdXAsIGNvcGllZCBmcm9tIGVzNS1zaGltJ3MgU3RyaW5nI3NwbGl0IHBhdGNoLlxudmFyIE5QQ0dfSU5DTFVERUQgPSAvKCk/Py8uZXhlYygnJylbMV0gIT09IHVuZGVmaW5lZDtcblxudmFyIFBBVENIID0gVVBEQVRFU19MQVNUX0lOREVYX1dST05HIHx8IE5QQ0dfSU5DTFVERUQ7XG5cbmlmIChQQVRDSCkge1xuICBwYXRjaGVkRXhlYyA9IGZ1bmN0aW9uIGV4ZWMoc3RyKSB7XG4gICAgdmFyIHJlID0gdGhpcztcbiAgICB2YXIgbGFzdEluZGV4LCByZUNvcHksIG1hdGNoLCBpO1xuXG4gICAgaWYgKE5QQ0dfSU5DTFVERUQpIHtcbiAgICAgIHJlQ29weSA9IG5ldyBSZWdFeHAoJ14nICsgcmUuc291cmNlICsgJyQoPyFcXFxccyknLCByZWdleHBGbGFncy5jYWxsKHJlKSk7XG4gICAgfVxuICAgIGlmIChVUERBVEVTX0xBU1RfSU5ERVhfV1JPTkcpIGxhc3RJbmRleCA9IHJlW0xBU1RfSU5ERVhdO1xuXG4gICAgbWF0Y2ggPSBuYXRpdmVFeGVjLmNhbGwocmUsIHN0cik7XG5cbiAgICBpZiAoVVBEQVRFU19MQVNUX0lOREVYX1dST05HICYmIG1hdGNoKSB7XG4gICAgICByZVtMQVNUX0lOREVYXSA9IHJlLmdsb2JhbCA/IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoIDogbGFzdEluZGV4O1xuICAgIH1cbiAgICBpZiAoTlBDR19JTkNMVURFRCAmJiBtYXRjaCAmJiBtYXRjaC5sZW5ndGggPiAxKSB7XG4gICAgICAvLyBGaXggYnJvd3NlcnMgd2hvc2UgYGV4ZWNgIG1ldGhvZHMgZG9uJ3QgY29uc2lzdGVudGx5IHJldHVybiBgdW5kZWZpbmVkYFxuICAgICAgLy8gZm9yIE5QQ0csIGxpa2UgSUU4LiBOT1RFOiBUaGlzIGRvZXNuJyB3b3JrIGZvciAvKC4/KT8vXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbG9vcC1mdW5jXG4gICAgICBuYXRpdmVSZXBsYWNlLmNhbGwobWF0Y2hbMF0sIHJlQ29weSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aCAtIDI7IGkrKykge1xuICAgICAgICAgIGlmIChhcmd1bWVudHNbaV0gPT09IHVuZGVmaW5lZCkgbWF0Y2hbaV0gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBtYXRjaDtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwYXRjaGVkRXhlYztcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHJlZ0V4cCwgcmVwbGFjZSkge1xuICB2YXIgcmVwbGFjZXIgPSByZXBsYWNlID09PSBPYmplY3QocmVwbGFjZSkgPyBmdW5jdGlvbiAocGFydCkge1xuICAgIHJldHVybiByZXBsYWNlW3BhcnRdO1xuICB9IDogcmVwbGFjZTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBTdHJpbmcoaXQpLnJlcGxhY2UocmVnRXhwLCByZXBsYWNlcik7XG4gIH07XG59O1xuIiwiLy8gNy4yLjkgU2FtZVZhbHVlKHgsIHkpXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5pcyB8fCBmdW5jdGlvbiBpcyh4LCB5KSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgcmV0dXJuIHggPT09IHkgPyB4ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geSA6IHggIT0geCAmJiB5ICE9IHk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tL1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgZm9yT2YgPSByZXF1aXJlKCcuL19mb3Itb2YnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ09MTEVDVElPTikge1xuICAkZXhwb3J0KCRleHBvcnQuUywgQ09MTEVDVElPTiwgeyBmcm9tOiBmdW5jdGlvbiBmcm9tKHNvdXJjZSAvKiAsIG1hcEZuLCB0aGlzQXJnICovKSB7XG4gICAgdmFyIG1hcEZuID0gYXJndW1lbnRzWzFdO1xuICAgIHZhciBtYXBwaW5nLCBBLCBuLCBjYjtcbiAgICBhRnVuY3Rpb24odGhpcyk7XG4gICAgbWFwcGluZyA9IG1hcEZuICE9PSB1bmRlZmluZWQ7XG4gICAgaWYgKG1hcHBpbmcpIGFGdW5jdGlvbihtYXBGbik7XG4gICAgaWYgKHNvdXJjZSA9PSB1bmRlZmluZWQpIHJldHVybiBuZXcgdGhpcygpO1xuICAgIEEgPSBbXTtcbiAgICBpZiAobWFwcGluZykge1xuICAgICAgbiA9IDA7XG4gICAgICBjYiA9IGN0eChtYXBGbiwgYXJndW1lbnRzWzJdLCAyKTtcbiAgICAgIGZvck9mKHNvdXJjZSwgZmFsc2UsIGZ1bmN0aW9uIChuZXh0SXRlbSkge1xuICAgICAgICBBLnB1c2goY2IobmV4dEl0ZW0sIG4rKykpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvck9mKHNvdXJjZSwgZmFsc2UsIEEucHVzaCwgQSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgdGhpcyhBKTtcbiAgfSB9KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDT0xMRUNUSU9OKSB7XG4gICRleHBvcnQoJGV4cG9ydC5TLCBDT0xMRUNUSU9OLCB7IG9mOiBmdW5jdGlvbiBvZigpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgQSA9IG5ldyBBcnJheShsZW5ndGgpO1xuICAgIHdoaWxlIChsZW5ndGgtLSkgQVtsZW5ndGhdID0gYXJndW1lbnRzW2xlbmd0aF07XG4gICAgcmV0dXJuIG5ldyB0aGlzKEEpO1xuICB9IH0pO1xufTtcbiIsIi8vIFdvcmtzIHdpdGggX19wcm90b19fIG9ubHkuIE9sZCB2OCBjYW4ndCB3b3JrIHdpdGggbnVsbCBwcm90byBvYmplY3RzLlxuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgY2hlY2sgPSBmdW5jdGlvbiAoTywgcHJvdG8pIHtcbiAgYW5PYmplY3QoTyk7XG4gIGlmICghaXNPYmplY3QocHJvdG8pICYmIHByb3RvICE9PSBudWxsKSB0aHJvdyBUeXBlRXJyb3IocHJvdG8gKyBcIjogY2FuJ3Qgc2V0IGFzIHByb3RvdHlwZSFcIik7XG59O1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8ICgnX19wcm90b19fJyBpbiB7fSA/IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICBmdW5jdGlvbiAodGVzdCwgYnVnZ3ksIHNldCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0ID0gcmVxdWlyZSgnLi9fY3R4JykoRnVuY3Rpb24uY2FsbCwgcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKS5mKE9iamVjdC5wcm90b3R5cGUsICdfX3Byb3RvX18nKS5zZXQsIDIpO1xuICAgICAgICBzZXQodGVzdCwgW10pO1xuICAgICAgICBidWdneSA9ICEodGVzdCBpbnN0YW5jZW9mIEFycmF5KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHsgYnVnZ3kgPSB0cnVlOyB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24gc2V0UHJvdG90eXBlT2YoTywgcHJvdG8pIHtcbiAgICAgICAgY2hlY2soTywgcHJvdG8pO1xuICAgICAgICBpZiAoYnVnZ3kpIE8uX19wcm90b19fID0gcHJvdG87XG4gICAgICAgIGVsc2Ugc2V0KE8sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIE87XG4gICAgICB9O1xuICAgIH0oe30sIGZhbHNlKSA6IHVuZGVmaW5lZCksXG4gIGNoZWNrOiBjaGVja1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKTtcbnZhciBTUEVDSUVTID0gcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZKSB7XG4gIHZhciBDID0gZ2xvYmFsW0tFWV07XG4gIGlmIChERVNDUklQVE9SUyAmJiBDICYmICFDW1NQRUNJRVNdKSBkUC5mKEMsIFNQRUNJRVMsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9XG4gIH0pO1xufTtcbiIsInZhciBkZWYgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgdGFnLCBzdGF0KSB7XG4gIGlmIChpdCAmJiAhaGFzKGl0ID0gc3RhdCA/IGl0IDogaXQucHJvdG90eXBlLCBUQUcpKSBkZWYoaXQsIFRBRywgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiB0YWcgfSk7XG59O1xuIiwidmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCdrZXlzJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIHNoYXJlZFtrZXldIHx8IChzaGFyZWRba2V5XSA9IHVpZChrZXkpKTtcbn07XG4iLCJ2YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJztcbnZhciBzdG9yZSA9IGdsb2JhbFtTSEFSRURdIHx8IChnbG9iYWxbU0hBUkVEXSA9IHt9KTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiB7fSk7XG59KSgndmVyc2lvbnMnLCBbXSkucHVzaCh7XG4gIHZlcnNpb246IGNvcmUudmVyc2lvbixcbiAgbW9kZTogcmVxdWlyZSgnLi9fbGlicmFyeScpID8gJ3B1cmUnIDogJ2dsb2JhbCcsXG4gIGNvcHlyaWdodDogJ8KpIDIwMTkgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknXG59KTtcbiIsIi8vIDcuMy4yMCBTcGVjaWVzQ29uc3RydWN0b3IoTywgZGVmYXVsdENvbnN0cnVjdG9yKVxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIFNQRUNJRVMgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywgRCkge1xuICB2YXIgQyA9IGFuT2JqZWN0KE8pLmNvbnN0cnVjdG9yO1xuICB2YXIgUztcbiAgcmV0dXJuIEMgPT09IHVuZGVmaW5lZCB8fCAoUyA9IGFuT2JqZWN0KEMpW1NQRUNJRVNdKSA9PSB1bmRlZmluZWQgPyBEIDogYUZ1bmN0aW9uKFMpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG1ldGhvZCwgYXJnKSB7XG4gIHJldHVybiAhIW1ldGhvZCAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZWxlc3MtY2FsbFxuICAgIGFyZyA/IG1ldGhvZC5jYWxsKG51bGwsIGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSwgMSkgOiBtZXRob2QuY2FsbChudWxsKTtcbiAgfSk7XG59O1xuIiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xuLy8gdHJ1ZSAgLT4gU3RyaW5nI2F0XG4vLyBmYWxzZSAtPiBTdHJpbmcjY29kZVBvaW50QXRcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFRPX1NUUklORykge1xuICByZXR1cm4gZnVuY3Rpb24gKHRoYXQsIHBvcykge1xuICAgIHZhciBzID0gU3RyaW5nKGRlZmluZWQodGhhdCkpO1xuICAgIHZhciBpID0gdG9JbnRlZ2VyKHBvcyk7XG4gICAgdmFyIGwgPSBzLmxlbmd0aDtcbiAgICB2YXIgYSwgYjtcbiAgICBpZiAoaSA8IDAgfHwgaSA+PSBsKSByZXR1cm4gVE9fU1RSSU5HID8gJycgOiB1bmRlZmluZWQ7XG4gICAgYSA9IHMuY2hhckNvZGVBdChpKTtcbiAgICByZXR1cm4gYSA8IDB4ZDgwMCB8fCBhID4gMHhkYmZmIHx8IGkgKyAxID09PSBsIHx8IChiID0gcy5jaGFyQ29kZUF0KGkgKyAxKSkgPCAweGRjMDAgfHwgYiA+IDB4ZGZmZlxuICAgICAgPyBUT19TVFJJTkcgPyBzLmNoYXJBdChpKSA6IGFcbiAgICAgIDogVE9fU1RSSU5HID8gcy5zbGljZShpLCBpICsgMikgOiAoYSAtIDB4ZDgwMCA8PCAxMCkgKyAoYiAtIDB4ZGMwMCkgKyAweDEwMDAwO1xuICB9O1xufTtcbiIsIi8vIGhlbHBlciBmb3IgU3RyaW5nI3tzdGFydHNXaXRoLCBlbmRzV2l0aCwgaW5jbHVkZXN9XG52YXIgaXNSZWdFeHAgPSByZXF1aXJlKCcuL19pcy1yZWdleHAnKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0aGF0LCBzZWFyY2hTdHJpbmcsIE5BTUUpIHtcbiAgaWYgKGlzUmVnRXhwKHNlYXJjaFN0cmluZykpIHRocm93IFR5cGVFcnJvcignU3RyaW5nIycgKyBOQU1FICsgXCIgZG9lc24ndCBhY2NlcHQgcmVnZXghXCIpO1xuICByZXR1cm4gU3RyaW5nKGRlZmluZWQodGhhdCkpO1xufTtcbiIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG52YXIgcXVvdCA9IC9cIi9nO1xuLy8gQi4yLjMuMi4xIENyZWF0ZUhUTUwoc3RyaW5nLCB0YWcsIGF0dHJpYnV0ZSwgdmFsdWUpXG52YXIgY3JlYXRlSFRNTCA9IGZ1bmN0aW9uIChzdHJpbmcsIHRhZywgYXR0cmlidXRlLCB2YWx1ZSkge1xuICB2YXIgUyA9IFN0cmluZyhkZWZpbmVkKHN0cmluZykpO1xuICB2YXIgcDEgPSAnPCcgKyB0YWc7XG4gIGlmIChhdHRyaWJ1dGUgIT09ICcnKSBwMSArPSAnICcgKyBhdHRyaWJ1dGUgKyAnPVwiJyArIFN0cmluZyh2YWx1ZSkucmVwbGFjZShxdW90LCAnJnF1b3Q7JykgKyAnXCInO1xuICByZXR1cm4gcDEgKyAnPicgKyBTICsgJzwvJyArIHRhZyArICc+Jztcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChOQU1FLCBleGVjKSB7XG4gIHZhciBPID0ge307XG4gIE9bTkFNRV0gPSBleGVjKGNyZWF0ZUhUTUwpO1xuICAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdGVzdCA9ICcnW05BTUVdKCdcIicpO1xuICAgIHJldHVybiB0ZXN0ICE9PSB0ZXN0LnRvTG93ZXJDYXNlKCkgfHwgdGVzdC5zcGxpdCgnXCInKS5sZW5ndGggPiAzO1xuICB9KSwgJ1N0cmluZycsIE8pO1xufTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXN0cmluZy1wYWQtc3RhcnQtZW5kXG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciByZXBlYXQgPSByZXF1aXJlKCcuL19zdHJpbmctcmVwZWF0Jyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGhhdCwgbWF4TGVuZ3RoLCBmaWxsU3RyaW5nLCBsZWZ0KSB7XG4gIHZhciBTID0gU3RyaW5nKGRlZmluZWQodGhhdCkpO1xuICB2YXIgc3RyaW5nTGVuZ3RoID0gUy5sZW5ndGg7XG4gIHZhciBmaWxsU3RyID0gZmlsbFN0cmluZyA9PT0gdW5kZWZpbmVkID8gJyAnIDogU3RyaW5nKGZpbGxTdHJpbmcpO1xuICB2YXIgaW50TWF4TGVuZ3RoID0gdG9MZW5ndGgobWF4TGVuZ3RoKTtcbiAgaWYgKGludE1heExlbmd0aCA8PSBzdHJpbmdMZW5ndGggfHwgZmlsbFN0ciA9PSAnJykgcmV0dXJuIFM7XG4gIHZhciBmaWxsTGVuID0gaW50TWF4TGVuZ3RoIC0gc3RyaW5nTGVuZ3RoO1xuICB2YXIgc3RyaW5nRmlsbGVyID0gcmVwZWF0LmNhbGwoZmlsbFN0ciwgTWF0aC5jZWlsKGZpbGxMZW4gLyBmaWxsU3RyLmxlbmd0aCkpO1xuICBpZiAoc3RyaW5nRmlsbGVyLmxlbmd0aCA+IGZpbGxMZW4pIHN0cmluZ0ZpbGxlciA9IHN0cmluZ0ZpbGxlci5zbGljZSgwLCBmaWxsTGVuKTtcbiAgcmV0dXJuIGxlZnQgPyBzdHJpbmdGaWxsZXIgKyBTIDogUyArIHN0cmluZ0ZpbGxlcjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcmVwZWF0KGNvdW50KSB7XG4gIHZhciBzdHIgPSBTdHJpbmcoZGVmaW5lZCh0aGlzKSk7XG4gIHZhciByZXMgPSAnJztcbiAgdmFyIG4gPSB0b0ludGVnZXIoY291bnQpO1xuICBpZiAobiA8IDAgfHwgbiA9PSBJbmZpbml0eSkgdGhyb3cgUmFuZ2VFcnJvcihcIkNvdW50IGNhbid0IGJlIG5lZ2F0aXZlXCIpO1xuICBmb3IgKDtuID4gMDsgKG4gPj4+PSAxKSAmJiAoc3RyICs9IHN0cikpIGlmIChuICYgMSkgcmVzICs9IHN0cjtcbiAgcmV0dXJuIHJlcztcbn07XG4iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyIHNwYWNlcyA9IHJlcXVpcmUoJy4vX3N0cmluZy13cycpO1xudmFyIHNwYWNlID0gJ1snICsgc3BhY2VzICsgJ10nO1xudmFyIG5vbiA9ICdcXHUyMDBiXFx1MDA4NSc7XG52YXIgbHRyaW0gPSBSZWdFeHAoJ14nICsgc3BhY2UgKyBzcGFjZSArICcqJyk7XG52YXIgcnRyaW0gPSBSZWdFeHAoc3BhY2UgKyBzcGFjZSArICcqJCcpO1xuXG52YXIgZXhwb3J0ZXIgPSBmdW5jdGlvbiAoS0VZLCBleGVjLCBBTElBUykge1xuICB2YXIgZXhwID0ge307XG4gIHZhciBGT1JDRSA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gISFzcGFjZXNbS0VZXSgpIHx8IG5vbltLRVldKCkgIT0gbm9uO1xuICB9KTtcbiAgdmFyIGZuID0gZXhwW0tFWV0gPSBGT1JDRSA/IGV4ZWModHJpbSkgOiBzcGFjZXNbS0VZXTtcbiAgaWYgKEFMSUFTKSBleHBbQUxJQVNdID0gZm47XG4gICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogRk9SQ0UsICdTdHJpbmcnLCBleHApO1xufTtcblxuLy8gMSAtPiBTdHJpbmcjdHJpbUxlZnRcbi8vIDIgLT4gU3RyaW5nI3RyaW1SaWdodFxuLy8gMyAtPiBTdHJpbmcjdHJpbVxudmFyIHRyaW0gPSBleHBvcnRlci50cmltID0gZnVuY3Rpb24gKHN0cmluZywgVFlQRSkge1xuICBzdHJpbmcgPSBTdHJpbmcoZGVmaW5lZChzdHJpbmcpKTtcbiAgaWYgKFRZUEUgJiAxKSBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShsdHJpbSwgJycpO1xuICBpZiAoVFlQRSAmIDIpIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKHJ0cmltLCAnJyk7XG4gIHJldHVybiBzdHJpbmc7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydGVyO1xuIiwibW9kdWxlLmV4cG9ydHMgPSAnXFx4MDlcXHgwQVxceDBCXFx4MENcXHgwRFxceDIwXFx4QTBcXHUxNjgwXFx1MTgwRVxcdTIwMDBcXHUyMDAxXFx1MjAwMlxcdTIwMDMnICtcbiAgJ1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMEFcXHUyMDJGXFx1MjA1RlxcdTMwMDBcXHUyMDI4XFx1MjAyOVxcdUZFRkYnO1xuIiwidmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGludm9rZSA9IHJlcXVpcmUoJy4vX2ludm9rZScpO1xudmFyIGh0bWwgPSByZXF1aXJlKCcuL19odG1sJyk7XG52YXIgY2VsID0gcmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciBzZXRUYXNrID0gZ2xvYmFsLnNldEltbWVkaWF0ZTtcbnZhciBjbGVhclRhc2sgPSBnbG9iYWwuY2xlYXJJbW1lZGlhdGU7XG52YXIgTWVzc2FnZUNoYW5uZWwgPSBnbG9iYWwuTWVzc2FnZUNoYW5uZWw7XG52YXIgRGlzcGF0Y2ggPSBnbG9iYWwuRGlzcGF0Y2g7XG52YXIgY291bnRlciA9IDA7XG52YXIgcXVldWUgPSB7fTtcbnZhciBPTlJFQURZU1RBVEVDSEFOR0UgPSAnb25yZWFkeXN0YXRlY2hhbmdlJztcbnZhciBkZWZlciwgY2hhbm5lbCwgcG9ydDtcbnZhciBydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBpZCA9ICt0aGlzO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gIGlmIChxdWV1ZS5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICB2YXIgZm4gPSBxdWV1ZVtpZF07XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgICBmbigpO1xuICB9XG59O1xudmFyIGxpc3RlbmVyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gIHJ1bi5jYWxsKGV2ZW50LmRhdGEpO1xufTtcbi8vIE5vZGUuanMgMC45KyAmIElFMTArIGhhcyBzZXRJbW1lZGlhdGUsIG90aGVyd2lzZTpcbmlmICghc2V0VGFzayB8fCAhY2xlYXJUYXNrKSB7XG4gIHNldFRhc2sgPSBmdW5jdGlvbiBzZXRJbW1lZGlhdGUoZm4pIHtcbiAgICB2YXIgYXJncyA9IFtdO1xuICAgIHZhciBpID0gMTtcbiAgICB3aGlsZSAoYXJndW1lbnRzLmxlbmd0aCA+IGkpIGFyZ3MucHVzaChhcmd1bWVudHNbaSsrXSk7XG4gICAgcXVldWVbKytjb3VudGVyXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICAgICAgaW52b2tlKHR5cGVvZiBmbiA9PSAnZnVuY3Rpb24nID8gZm4gOiBGdW5jdGlvbihmbiksIGFyZ3MpO1xuICAgIH07XG4gICAgZGVmZXIoY291bnRlcik7XG4gICAgcmV0dXJuIGNvdW50ZXI7XG4gIH07XG4gIGNsZWFyVGFzayA9IGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlKGlkKSB7XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgfTtcbiAgLy8gTm9kZS5qcyAwLjgtXG4gIGlmIChyZXF1aXJlKCcuL19jb2YnKShwcm9jZXNzKSA9PSAncHJvY2VzcycpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhjdHgocnVuLCBpZCwgMSkpO1xuICAgIH07XG4gIC8vIFNwaGVyZSAoSlMgZ2FtZSBlbmdpbmUpIERpc3BhdGNoIEFQSVxuICB9IGVsc2UgaWYgKERpc3BhdGNoICYmIERpc3BhdGNoLm5vdykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBEaXNwYXRjaC5ub3coY3R4KHJ1biwgaWQsIDEpKTtcbiAgICB9O1xuICAvLyBCcm93c2VycyB3aXRoIE1lc3NhZ2VDaGFubmVsLCBpbmNsdWRlcyBXZWJXb3JrZXJzXG4gIH0gZWxzZSBpZiAoTWVzc2FnZUNoYW5uZWwpIHtcbiAgICBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgcG9ydCA9IGNoYW5uZWwucG9ydDI7XG4gICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBsaXN0ZW5lcjtcbiAgICBkZWZlciA9IGN0eChwb3J0LnBvc3RNZXNzYWdlLCBwb3J0LCAxKTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBwb3N0TWVzc2FnZSwgc2tpcCBXZWJXb3JrZXJzXG4gIC8vIElFOCBoYXMgcG9zdE1lc3NhZ2UsIGJ1dCBpdCdzIHN5bmMgJiB0eXBlb2YgaXRzIHBvc3RNZXNzYWdlIGlzICdvYmplY3QnXG4gIH0gZWxzZSBpZiAoZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIgJiYgdHlwZW9mIHBvc3RNZXNzYWdlID09ICdmdW5jdGlvbicgJiYgIWdsb2JhbC5pbXBvcnRTY3JpcHRzKSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZShpZCArICcnLCAnKicpO1xuICAgIH07XG4gICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBsaXN0ZW5lciwgZmFsc2UpO1xuICAvLyBJRTgtXG4gIH0gZWxzZSBpZiAoT05SRUFEWVNUQVRFQ0hBTkdFIGluIGNlbCgnc2NyaXB0JykpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgaHRtbC5hcHBlbmRDaGlsZChjZWwoJ3NjcmlwdCcpKVtPTlJFQURZU1RBVEVDSEFOR0VdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgICAgICBydW4uY2FsbChpZCk7XG4gICAgICB9O1xuICAgIH07XG4gIC8vIFJlc3Qgb2xkIGJyb3dzZXJzXG4gIH0gZWxzZSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIHNldFRpbWVvdXQoY3R4KHJ1biwgaWQsIDEpLCAwKTtcbiAgICB9O1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiBzZXRUYXNrLFxuICBjbGVhcjogY2xlYXJUYXNrXG59O1xuIiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciBtYXggPSBNYXRoLm1heDtcbnZhciBtaW4gPSBNYXRoLm1pbjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGluZGV4LCBsZW5ndGgpIHtcbiAgaW5kZXggPSB0b0ludGVnZXIoaW5kZXgpO1xuICByZXR1cm4gaW5kZXggPCAwID8gbWF4KGluZGV4ICsgbGVuZ3RoLCAwKSA6IG1pbihpbmRleCwgbGVuZ3RoKTtcbn07XG4iLCIvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b2luZGV4XG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIDA7XG4gIHZhciBudW1iZXIgPSB0b0ludGVnZXIoaXQpO1xuICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgobnVtYmVyKTtcbiAgaWYgKG51bWJlciAhPT0gbGVuZ3RoKSB0aHJvdyBSYW5nZUVycm9yKCdXcm9uZyBsZW5ndGghJyk7XG4gIHJldHVybiBsZW5ndGg7XG59O1xuIiwiLy8gNy4xLjQgVG9JbnRlZ2VyXG52YXIgY2VpbCA9IE1hdGguY2VpbDtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXNOYU4oaXQgPSAraXQpID8gMCA6IChpdCA+IDAgPyBmbG9vciA6IGNlaWwpKGl0KTtcbn07XG4iLCIvLyB0byBpbmRleGVkIG9iamVjdCwgdG9PYmplY3Qgd2l0aCBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIHN0cmluZ3NcbnZhciBJT2JqZWN0ID0gcmVxdWlyZSgnLi9faW9iamVjdCcpO1xudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gSU9iamVjdChkZWZpbmVkKGl0KSk7XG59O1xuIiwiLy8gNy4xLjE1IFRvTGVuZ3RoXG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIG1pbiA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ID4gMCA/IG1pbih0b0ludGVnZXIoaXQpLCAweDFmZmZmZmZmZmZmZmZmKSA6IDA7IC8vIHBvdygyLCA1MykgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07XG4iLCIvLyA3LjEuMTMgVG9PYmplY3QoYXJndW1lbnQpXG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBPYmplY3QoZGVmaW5lZChpdCkpO1xufTtcbiIsIi8vIDcuMS4xIFRvUHJpbWl0aXZlKGlucHV0IFssIFByZWZlcnJlZFR5cGVdKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG4vLyBpbnN0ZWFkIG9mIHRoZSBFUzYgc3BlYyB2ZXJzaW9uLCB3ZSBkaWRuJ3QgaW1wbGVtZW50IEBAdG9QcmltaXRpdmUgY2FzZVxuLy8gYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgLSBmbGFnIC0gcHJlZmVycmVkIHR5cGUgaXMgYSBzdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBTKSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSByZXR1cm4gaXQ7XG4gIHZhciBmbiwgdmFsO1xuICBpZiAoUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKHR5cGVvZiAoZm4gPSBpdC52YWx1ZU9mKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIGlmICghUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbmlmIChyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpKSB7XG4gIHZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xuICB2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG4gIHZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG4gIHZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG4gIHZhciAkdHlwZWQgPSByZXF1aXJlKCcuL190eXBlZCcpO1xuICB2YXIgJGJ1ZmZlciA9IHJlcXVpcmUoJy4vX3R5cGVkLWJ1ZmZlcicpO1xuICB2YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG4gIHZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKTtcbiAgdmFyIHByb3BlcnR5RGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbiAgdmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG4gIHZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpO1xuICB2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xuICB2YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbiAgdmFyIHRvSW5kZXggPSByZXF1aXJlKCcuL190by1pbmRleCcpO1xuICB2YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbiAgdmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG4gIHZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbiAgdmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJyk7XG4gIHZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuICB2YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbiAgdmFyIGlzQXJyYXlJdGVyID0gcmVxdWlyZSgnLi9faXMtYXJyYXktaXRlcicpO1xuICB2YXIgY3JlYXRlID0gcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpO1xuICB2YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG4gIHZhciBnT1BOID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4nKS5mO1xuICB2YXIgZ2V0SXRlckZuID0gcmVxdWlyZSgnLi9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QnKTtcbiAgdmFyIHVpZCA9IHJlcXVpcmUoJy4vX3VpZCcpO1xuICB2YXIgd2tzID0gcmVxdWlyZSgnLi9fd2tzJyk7XG4gIHZhciBjcmVhdGVBcnJheU1ldGhvZCA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKTtcbiAgdmFyIGNyZWF0ZUFycmF5SW5jbHVkZXMgPSByZXF1aXJlKCcuL19hcnJheS1pbmNsdWRlcycpO1xuICB2YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xuICB2YXIgQXJyYXlJdGVyYXRvcnMgPSByZXF1aXJlKCcuL2VzNi5hcnJheS5pdGVyYXRvcicpO1xuICB2YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG4gIHZhciAkaXRlckRldGVjdCA9IHJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0Jyk7XG4gIHZhciBzZXRTcGVjaWVzID0gcmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKTtcbiAgdmFyIGFycmF5RmlsbCA9IHJlcXVpcmUoJy4vX2FycmF5LWZpbGwnKTtcbiAgdmFyIGFycmF5Q29weVdpdGhpbiA9IHJlcXVpcmUoJy4vX2FycmF5LWNvcHktd2l0aGluJyk7XG4gIHZhciAkRFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbiAgdmFyICRHT1BEID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKTtcbiAgdmFyIGRQID0gJERQLmY7XG4gIHZhciBnT1BEID0gJEdPUEQuZjtcbiAgdmFyIFJhbmdlRXJyb3IgPSBnbG9iYWwuUmFuZ2VFcnJvcjtcbiAgdmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG4gIHZhciBVaW50OEFycmF5ID0gZ2xvYmFsLlVpbnQ4QXJyYXk7XG4gIHZhciBBUlJBWV9CVUZGRVIgPSAnQXJyYXlCdWZmZXInO1xuICB2YXIgU0hBUkVEX0JVRkZFUiA9ICdTaGFyZWQnICsgQVJSQVlfQlVGRkVSO1xuICB2YXIgQllURVNfUEVSX0VMRU1FTlQgPSAnQllURVNfUEVSX0VMRU1FTlQnO1xuICB2YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG4gIHZhciBBcnJheVByb3RvID0gQXJyYXlbUFJPVE9UWVBFXTtcbiAgdmFyICRBcnJheUJ1ZmZlciA9ICRidWZmZXIuQXJyYXlCdWZmZXI7XG4gIHZhciAkRGF0YVZpZXcgPSAkYnVmZmVyLkRhdGFWaWV3O1xuICB2YXIgYXJyYXlGb3JFYWNoID0gY3JlYXRlQXJyYXlNZXRob2QoMCk7XG4gIHZhciBhcnJheUZpbHRlciA9IGNyZWF0ZUFycmF5TWV0aG9kKDIpO1xuICB2YXIgYXJyYXlTb21lID0gY3JlYXRlQXJyYXlNZXRob2QoMyk7XG4gIHZhciBhcnJheUV2ZXJ5ID0gY3JlYXRlQXJyYXlNZXRob2QoNCk7XG4gIHZhciBhcnJheUZpbmQgPSBjcmVhdGVBcnJheU1ldGhvZCg1KTtcbiAgdmFyIGFycmF5RmluZEluZGV4ID0gY3JlYXRlQXJyYXlNZXRob2QoNik7XG4gIHZhciBhcnJheUluY2x1ZGVzID0gY3JlYXRlQXJyYXlJbmNsdWRlcyh0cnVlKTtcbiAgdmFyIGFycmF5SW5kZXhPZiA9IGNyZWF0ZUFycmF5SW5jbHVkZXMoZmFsc2UpO1xuICB2YXIgYXJyYXlWYWx1ZXMgPSBBcnJheUl0ZXJhdG9ycy52YWx1ZXM7XG4gIHZhciBhcnJheUtleXMgPSBBcnJheUl0ZXJhdG9ycy5rZXlzO1xuICB2YXIgYXJyYXlFbnRyaWVzID0gQXJyYXlJdGVyYXRvcnMuZW50cmllcztcbiAgdmFyIGFycmF5TGFzdEluZGV4T2YgPSBBcnJheVByb3RvLmxhc3RJbmRleE9mO1xuICB2YXIgYXJyYXlSZWR1Y2UgPSBBcnJheVByb3RvLnJlZHVjZTtcbiAgdmFyIGFycmF5UmVkdWNlUmlnaHQgPSBBcnJheVByb3RvLnJlZHVjZVJpZ2h0O1xuICB2YXIgYXJyYXlKb2luID0gQXJyYXlQcm90by5qb2luO1xuICB2YXIgYXJyYXlTb3J0ID0gQXJyYXlQcm90by5zb3J0O1xuICB2YXIgYXJyYXlTbGljZSA9IEFycmF5UHJvdG8uc2xpY2U7XG4gIHZhciBhcnJheVRvU3RyaW5nID0gQXJyYXlQcm90by50b1N0cmluZztcbiAgdmFyIGFycmF5VG9Mb2NhbGVTdHJpbmcgPSBBcnJheVByb3RvLnRvTG9jYWxlU3RyaW5nO1xuICB2YXIgSVRFUkFUT1IgPSB3a3MoJ2l0ZXJhdG9yJyk7XG4gIHZhciBUQUcgPSB3a3MoJ3RvU3RyaW5nVGFnJyk7XG4gIHZhciBUWVBFRF9DT05TVFJVQ1RPUiA9IHVpZCgndHlwZWRfY29uc3RydWN0b3InKTtcbiAgdmFyIERFRl9DT05TVFJVQ1RPUiA9IHVpZCgnZGVmX2NvbnN0cnVjdG9yJyk7XG4gIHZhciBBTExfQ09OU1RSVUNUT1JTID0gJHR5cGVkLkNPTlNUUjtcbiAgdmFyIFRZUEVEX0FSUkFZID0gJHR5cGVkLlRZUEVEO1xuICB2YXIgVklFVyA9ICR0eXBlZC5WSUVXO1xuICB2YXIgV1JPTkdfTEVOR1RIID0gJ1dyb25nIGxlbmd0aCEnO1xuXG4gIHZhciAkbWFwID0gY3JlYXRlQXJyYXlNZXRob2QoMSwgZnVuY3Rpb24gKE8sIGxlbmd0aCkge1xuICAgIHJldHVybiBhbGxvY2F0ZShzcGVjaWVzQ29uc3RydWN0b3IoTywgT1tERUZfQ09OU1RSVUNUT1JdKSwgbGVuZ3RoKTtcbiAgfSk7XG5cbiAgdmFyIExJVFRMRV9FTkRJQU4gPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KG5ldyBVaW50MTZBcnJheShbMV0pLmJ1ZmZlcilbMF0gPT09IDE7XG4gIH0pO1xuXG4gIHZhciBGT1JDRURfU0VUID0gISFVaW50OEFycmF5ICYmICEhVWludDhBcnJheVtQUk9UT1RZUEVdLnNldCAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgbmV3IFVpbnQ4QXJyYXkoMSkuc2V0KHt9KTtcbiAgfSk7XG5cbiAgdmFyIHRvT2Zmc2V0ID0gZnVuY3Rpb24gKGl0LCBCWVRFUykge1xuICAgIHZhciBvZmZzZXQgPSB0b0ludGVnZXIoaXQpO1xuICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCAlIEJZVEVTKSB0aHJvdyBSYW5nZUVycm9yKCdXcm9uZyBvZmZzZXQhJyk7XG4gICAgcmV0dXJuIG9mZnNldDtcbiAgfTtcblxuICB2YXIgdmFsaWRhdGUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICBpZiAoaXNPYmplY3QoaXQpICYmIFRZUEVEX0FSUkFZIGluIGl0KSByZXR1cm4gaXQ7XG4gICAgdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYSB0eXBlZCBhcnJheSEnKTtcbiAgfTtcblxuICB2YXIgYWxsb2NhdGUgPSBmdW5jdGlvbiAoQywgbGVuZ3RoKSB7XG4gICAgaWYgKCEoaXNPYmplY3QoQykgJiYgVFlQRURfQ09OU1RSVUNUT1IgaW4gQykpIHtcbiAgICAgIHRocm93IFR5cGVFcnJvcignSXQgaXMgbm90IGEgdHlwZWQgYXJyYXkgY29uc3RydWN0b3IhJyk7XG4gICAgfSByZXR1cm4gbmV3IEMobGVuZ3RoKTtcbiAgfTtcblxuICB2YXIgc3BlY2llc0Zyb21MaXN0ID0gZnVuY3Rpb24gKE8sIGxpc3QpIHtcbiAgICByZXR1cm4gZnJvbUxpc3Qoc3BlY2llc0NvbnN0cnVjdG9yKE8sIE9bREVGX0NPTlNUUlVDVE9SXSksIGxpc3QpO1xuICB9O1xuXG4gIHZhciBmcm9tTGlzdCA9IGZ1bmN0aW9uIChDLCBsaXN0KSB7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgbGVuZ3RoID0gbGlzdC5sZW5ndGg7XG4gICAgdmFyIHJlc3VsdCA9IGFsbG9jYXRlKEMsIGxlbmd0aCk7XG4gICAgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSByZXN1bHRbaW5kZXhdID0gbGlzdFtpbmRleCsrXTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIHZhciBhZGRHZXR0ZXIgPSBmdW5jdGlvbiAoaXQsIGtleSwgaW50ZXJuYWwpIHtcbiAgICBkUChpdCwga2V5LCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fZFtpbnRlcm5hbF07IH0gfSk7XG4gIH07XG5cbiAgdmFyICRmcm9tID0gZnVuY3Rpb24gZnJvbShzb3VyY2UgLyogLCBtYXBmbiwgdGhpc0FyZyAqLykge1xuICAgIHZhciBPID0gdG9PYmplY3Qoc291cmNlKTtcbiAgICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIG1hcGZuID0gYUxlbiA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gICAgdmFyIG1hcHBpbmcgPSBtYXBmbiAhPT0gdW5kZWZpbmVkO1xuICAgIHZhciBpdGVyRm4gPSBnZXRJdGVyRm4oTyk7XG4gICAgdmFyIGksIGxlbmd0aCwgdmFsdWVzLCByZXN1bHQsIHN0ZXAsIGl0ZXJhdG9yO1xuICAgIGlmIChpdGVyRm4gIT0gdW5kZWZpbmVkICYmICFpc0FycmF5SXRlcihpdGVyRm4pKSB7XG4gICAgICBmb3IgKGl0ZXJhdG9yID0gaXRlckZuLmNhbGwoTyksIHZhbHVlcyA9IFtdLCBpID0gMDsgIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lOyBpKyspIHtcbiAgICAgICAgdmFsdWVzLnB1c2goc3RlcC52YWx1ZSk7XG4gICAgICB9IE8gPSB2YWx1ZXM7XG4gICAgfVxuICAgIGlmIChtYXBwaW5nICYmIGFMZW4gPiAyKSBtYXBmbiA9IGN0eChtYXBmbiwgYXJndW1lbnRzWzJdLCAyKTtcbiAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCksIHJlc3VsdCA9IGFsbG9jYXRlKHRoaXMsIGxlbmd0aCk7IGxlbmd0aCA+IGk7IGkrKykge1xuICAgICAgcmVzdWx0W2ldID0gbWFwcGluZyA/IG1hcGZuKE9baV0sIGkpIDogT1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICB2YXIgJG9mID0gZnVuY3Rpb24gb2YoLyogLi4uaXRlbXMgKi8pIHtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciByZXN1bHQgPSBhbGxvY2F0ZSh0aGlzLCBsZW5ndGgpO1xuICAgIHdoaWxlIChsZW5ndGggPiBpbmRleCkgcmVzdWx0W2luZGV4XSA9IGFyZ3VtZW50c1tpbmRleCsrXTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIC8vIGlPUyBTYWZhcmkgNi54IGZhaWxzIGhlcmVcbiAgdmFyIFRPX0xPQ0FMRV9CVUcgPSAhIVVpbnQ4QXJyYXkgJiYgZmFpbHMoZnVuY3Rpb24gKCkgeyBhcnJheVRvTG9jYWxlU3RyaW5nLmNhbGwobmV3IFVpbnQ4QXJyYXkoMSkpOyB9KTtcblxuICB2YXIgJHRvTG9jYWxlU3RyaW5nID0gZnVuY3Rpb24gdG9Mb2NhbGVTdHJpbmcoKSB7XG4gICAgcmV0dXJuIGFycmF5VG9Mb2NhbGVTdHJpbmcuYXBwbHkoVE9fTE9DQUxFX0JVRyA/IGFycmF5U2xpY2UuY2FsbCh2YWxpZGF0ZSh0aGlzKSkgOiB2YWxpZGF0ZSh0aGlzKSwgYXJndW1lbnRzKTtcbiAgfTtcblxuICB2YXIgcHJvdG8gPSB7XG4gICAgY29weVdpdGhpbjogZnVuY3Rpb24gY29weVdpdGhpbih0YXJnZXQsIHN0YXJ0IC8qICwgZW5kICovKSB7XG4gICAgICByZXR1cm4gYXJyYXlDb3B5V2l0aGluLmNhbGwodmFsaWRhdGUodGhpcyksIHRhcmdldCwgc3RhcnQsIGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIGV2ZXJ5OiBmdW5jdGlvbiBldmVyeShjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgICAgcmV0dXJuIGFycmF5RXZlcnkodmFsaWRhdGUodGhpcyksIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIGZpbGw6IGZ1bmN0aW9uIGZpbGwodmFsdWUgLyogLCBzdGFydCwgZW5kICovKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIHJldHVybiBhcnJheUZpbGwuYXBwbHkodmFsaWRhdGUodGhpcyksIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBmaWx0ZXI6IGZ1bmN0aW9uIGZpbHRlcihjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgICAgcmV0dXJuIHNwZWNpZXNGcm9tTGlzdCh0aGlzLCBhcnJheUZpbHRlcih2YWxpZGF0ZSh0aGlzKSwgY2FsbGJhY2tmbixcbiAgICAgICAgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpKTtcbiAgICB9LFxuICAgIGZpbmQ6IGZ1bmN0aW9uIGZpbmQocHJlZGljYXRlIC8qICwgdGhpc0FyZyAqLykge1xuICAgICAgcmV0dXJuIGFycmF5RmluZCh2YWxpZGF0ZSh0aGlzKSwgcHJlZGljYXRlLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBmaW5kSW5kZXg6IGZ1bmN0aW9uIGZpbmRJbmRleChwcmVkaWNhdGUgLyogLCB0aGlzQXJnICovKSB7XG4gICAgICByZXR1cm4gYXJyYXlGaW5kSW5kZXgodmFsaWRhdGUodGhpcyksIHByZWRpY2F0ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgICAgYXJyYXlGb3JFYWNoKHZhbGlkYXRlKHRoaXMpLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBpbmRleE9mOiBmdW5jdGlvbiBpbmRleE9mKHNlYXJjaEVsZW1lbnQgLyogLCBmcm9tSW5kZXggKi8pIHtcbiAgICAgIHJldHVybiBhcnJheUluZGV4T2YodmFsaWRhdGUodGhpcyksIHNlYXJjaEVsZW1lbnQsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIGluY2x1ZGVzOiBmdW5jdGlvbiBpbmNsdWRlcyhzZWFyY2hFbGVtZW50IC8qICwgZnJvbUluZGV4ICovKSB7XG4gICAgICByZXR1cm4gYXJyYXlJbmNsdWRlcyh2YWxpZGF0ZSh0aGlzKSwgc2VhcmNoRWxlbWVudCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgam9pbjogZnVuY3Rpb24gam9pbihzZXBhcmF0b3IpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgcmV0dXJuIGFycmF5Sm9pbi5hcHBseSh2YWxpZGF0ZSh0aGlzKSwgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIGxhc3RJbmRleE9mOiBmdW5jdGlvbiBsYXN0SW5kZXhPZihzZWFyY2hFbGVtZW50IC8qICwgZnJvbUluZGV4ICovKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIHJldHVybiBhcnJheUxhc3RJbmRleE9mLmFwcGx5KHZhbGlkYXRlKHRoaXMpLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgbWFwOiBmdW5jdGlvbiBtYXAobWFwZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgICByZXR1cm4gJG1hcCh2YWxpZGF0ZSh0aGlzKSwgbWFwZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIHJlZHVjZTogZnVuY3Rpb24gcmVkdWNlKGNhbGxiYWNrZm4gLyogLCBpbml0aWFsVmFsdWUgKi8pIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgcmV0dXJuIGFycmF5UmVkdWNlLmFwcGx5KHZhbGlkYXRlKHRoaXMpLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgcmVkdWNlUmlnaHQ6IGZ1bmN0aW9uIHJlZHVjZVJpZ2h0KGNhbGxiYWNrZm4gLyogLCBpbml0aWFsVmFsdWUgKi8pIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgcmV0dXJuIGFycmF5UmVkdWNlUmlnaHQuYXBwbHkodmFsaWRhdGUodGhpcyksIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICByZXZlcnNlOiBmdW5jdGlvbiByZXZlcnNlKCkge1xuICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgdmFyIGxlbmd0aCA9IHZhbGlkYXRlKHRoYXQpLmxlbmd0aDtcbiAgICAgIHZhciBtaWRkbGUgPSBNYXRoLmZsb29yKGxlbmd0aCAvIDIpO1xuICAgICAgdmFyIGluZGV4ID0gMDtcbiAgICAgIHZhciB2YWx1ZTtcbiAgICAgIHdoaWxlIChpbmRleCA8IG1pZGRsZSkge1xuICAgICAgICB2YWx1ZSA9IHRoYXRbaW5kZXhdO1xuICAgICAgICB0aGF0W2luZGV4KytdID0gdGhhdFstLWxlbmd0aF07XG4gICAgICAgIHRoYXRbbGVuZ3RoXSA9IHZhbHVlO1xuICAgICAgfSByZXR1cm4gdGhhdDtcbiAgICB9LFxuICAgIHNvbWU6IGZ1bmN0aW9uIHNvbWUoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICAgIHJldHVybiBhcnJheVNvbWUodmFsaWRhdGUodGhpcyksIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIHNvcnQ6IGZ1bmN0aW9uIHNvcnQoY29tcGFyZWZuKSB7XG4gICAgICByZXR1cm4gYXJyYXlTb3J0LmNhbGwodmFsaWRhdGUodGhpcyksIGNvbXBhcmVmbik7XG4gICAgfSxcbiAgICBzdWJhcnJheTogZnVuY3Rpb24gc3ViYXJyYXkoYmVnaW4sIGVuZCkge1xuICAgICAgdmFyIE8gPSB2YWxpZGF0ZSh0aGlzKTtcbiAgICAgIHZhciBsZW5ndGggPSBPLmxlbmd0aDtcbiAgICAgIHZhciAkYmVnaW4gPSB0b0Fic29sdXRlSW5kZXgoYmVnaW4sIGxlbmd0aCk7XG4gICAgICByZXR1cm4gbmV3IChzcGVjaWVzQ29uc3RydWN0b3IoTywgT1tERUZfQ09OU1RSVUNUT1JdKSkoXG4gICAgICAgIE8uYnVmZmVyLFxuICAgICAgICBPLmJ5dGVPZmZzZXQgKyAkYmVnaW4gKiBPLkJZVEVTX1BFUl9FTEVNRU5ULFxuICAgICAgICB0b0xlbmd0aCgoZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiB0b0Fic29sdXRlSW5kZXgoZW5kLCBsZW5ndGgpKSAtICRiZWdpbilcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIHZhciAkc2xpY2UgPSBmdW5jdGlvbiBzbGljZShzdGFydCwgZW5kKSB7XG4gICAgcmV0dXJuIHNwZWNpZXNGcm9tTGlzdCh0aGlzLCBhcnJheVNsaWNlLmNhbGwodmFsaWRhdGUodGhpcyksIHN0YXJ0LCBlbmQpKTtcbiAgfTtcblxuICB2YXIgJHNldCA9IGZ1bmN0aW9uIHNldChhcnJheUxpa2UgLyogLCBvZmZzZXQgKi8pIHtcbiAgICB2YWxpZGF0ZSh0aGlzKTtcbiAgICB2YXIgb2Zmc2V0ID0gdG9PZmZzZXQoYXJndW1lbnRzWzFdLCAxKTtcbiAgICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGg7XG4gICAgdmFyIHNyYyA9IHRvT2JqZWN0KGFycmF5TGlrZSk7XG4gICAgdmFyIGxlbiA9IHRvTGVuZ3RoKHNyYy5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgaWYgKGxlbiArIG9mZnNldCA+IGxlbmd0aCkgdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19MRU5HVEgpO1xuICAgIHdoaWxlIChpbmRleCA8IGxlbikgdGhpc1tvZmZzZXQgKyBpbmRleF0gPSBzcmNbaW5kZXgrK107XG4gIH07XG5cbiAgdmFyICRpdGVyYXRvcnMgPSB7XG4gICAgZW50cmllczogZnVuY3Rpb24gZW50cmllcygpIHtcbiAgICAgIHJldHVybiBhcnJheUVudHJpZXMuY2FsbCh2YWxpZGF0ZSh0aGlzKSk7XG4gICAgfSxcbiAgICBrZXlzOiBmdW5jdGlvbiBrZXlzKCkge1xuICAgICAgcmV0dXJuIGFycmF5S2V5cy5jYWxsKHZhbGlkYXRlKHRoaXMpKTtcbiAgICB9LFxuICAgIHZhbHVlczogZnVuY3Rpb24gdmFsdWVzKCkge1xuICAgICAgcmV0dXJuIGFycmF5VmFsdWVzLmNhbGwodmFsaWRhdGUodGhpcykpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgaXNUQUluZGV4ID0gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KHRhcmdldClcbiAgICAgICYmIHRhcmdldFtUWVBFRF9BUlJBWV1cbiAgICAgICYmIHR5cGVvZiBrZXkgIT0gJ3N5bWJvbCdcbiAgICAgICYmIGtleSBpbiB0YXJnZXRcbiAgICAgICYmIFN0cmluZygra2V5KSA9PSBTdHJpbmcoa2V5KTtcbiAgfTtcbiAgdmFyICRnZXREZXNjID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSB7XG4gICAgcmV0dXJuIGlzVEFJbmRleCh0YXJnZXQsIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSkpXG4gICAgICA/IHByb3BlcnR5RGVzYygyLCB0YXJnZXRba2V5XSlcbiAgICAgIDogZ09QRCh0YXJnZXQsIGtleSk7XG4gIH07XG4gIHZhciAkc2V0RGVzYyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBkZXNjKSB7XG4gICAgaWYgKGlzVEFJbmRleCh0YXJnZXQsIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSkpXG4gICAgICAmJiBpc09iamVjdChkZXNjKVxuICAgICAgJiYgaGFzKGRlc2MsICd2YWx1ZScpXG4gICAgICAmJiAhaGFzKGRlc2MsICdnZXQnKVxuICAgICAgJiYgIWhhcyhkZXNjLCAnc2V0JylcbiAgICAgIC8vIFRPRE86IGFkZCB2YWxpZGF0aW9uIGRlc2NyaXB0b3Igdy9vIGNhbGxpbmcgYWNjZXNzb3JzXG4gICAgICAmJiAhZGVzYy5jb25maWd1cmFibGVcbiAgICAgICYmICghaGFzKGRlc2MsICd3cml0YWJsZScpIHx8IGRlc2Mud3JpdGFibGUpXG4gICAgICAmJiAoIWhhcyhkZXNjLCAnZW51bWVyYWJsZScpIHx8IGRlc2MuZW51bWVyYWJsZSlcbiAgICApIHtcbiAgICAgIHRhcmdldFtrZXldID0gZGVzYy52YWx1ZTtcbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfSByZXR1cm4gZFAodGFyZ2V0LCBrZXksIGRlc2MpO1xuICB9O1xuXG4gIGlmICghQUxMX0NPTlNUUlVDVE9SUykge1xuICAgICRHT1BELmYgPSAkZ2V0RGVzYztcbiAgICAkRFAuZiA9ICRzZXREZXNjO1xuICB9XG5cbiAgJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhQUxMX0NPTlNUUlVDVE9SUywgJ09iamVjdCcsIHtcbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6ICRnZXREZXNjLFxuICAgIGRlZmluZVByb3BlcnR5OiAkc2V0RGVzY1xuICB9KTtcblxuICBpZiAoZmFpbHMoZnVuY3Rpb24gKCkgeyBhcnJheVRvU3RyaW5nLmNhbGwoe30pOyB9KSkge1xuICAgIGFycmF5VG9TdHJpbmcgPSBhcnJheVRvTG9jYWxlU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICByZXR1cm4gYXJyYXlKb2luLmNhbGwodGhpcyk7XG4gICAgfTtcbiAgfVxuXG4gIHZhciAkVHlwZWRBcnJheVByb3RvdHlwZSQgPSByZWRlZmluZUFsbCh7fSwgcHJvdG8pO1xuICByZWRlZmluZUFsbCgkVHlwZWRBcnJheVByb3RvdHlwZSQsICRpdGVyYXRvcnMpO1xuICBoaWRlKCRUeXBlZEFycmF5UHJvdG90eXBlJCwgSVRFUkFUT1IsICRpdGVyYXRvcnMudmFsdWVzKTtcbiAgcmVkZWZpbmVBbGwoJFR5cGVkQXJyYXlQcm90b3R5cGUkLCB7XG4gICAgc2xpY2U6ICRzbGljZSxcbiAgICBzZXQ6ICRzZXQsXG4gICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uICgpIHsgLyogbm9vcCAqLyB9LFxuICAgIHRvU3RyaW5nOiBhcnJheVRvU3RyaW5nLFxuICAgIHRvTG9jYWxlU3RyaW5nOiAkdG9Mb2NhbGVTdHJpbmdcbiAgfSk7XG4gIGFkZEdldHRlcigkVHlwZWRBcnJheVByb3RvdHlwZSQsICdidWZmZXInLCAnYicpO1xuICBhZGRHZXR0ZXIoJFR5cGVkQXJyYXlQcm90b3R5cGUkLCAnYnl0ZU9mZnNldCcsICdvJyk7XG4gIGFkZEdldHRlcigkVHlwZWRBcnJheVByb3RvdHlwZSQsICdieXRlTGVuZ3RoJywgJ2wnKTtcbiAgYWRkR2V0dGVyKCRUeXBlZEFycmF5UHJvdG90eXBlJCwgJ2xlbmd0aCcsICdlJyk7XG4gIGRQKCRUeXBlZEFycmF5UHJvdG90eXBlJCwgVEFHLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzW1RZUEVEX0FSUkFZXTsgfVxuICB9KTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXN0YXRlbWVudHNcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZLCBCWVRFUywgd3JhcHBlciwgQ0xBTVBFRCkge1xuICAgIENMQU1QRUQgPSAhIUNMQU1QRUQ7XG4gICAgdmFyIE5BTUUgPSBLRVkgKyAoQ0xBTVBFRCA/ICdDbGFtcGVkJyA6ICcnKSArICdBcnJheSc7XG4gICAgdmFyIEdFVFRFUiA9ICdnZXQnICsgS0VZO1xuICAgIHZhciBTRVRURVIgPSAnc2V0JyArIEtFWTtcbiAgICB2YXIgVHlwZWRBcnJheSA9IGdsb2JhbFtOQU1FXTtcbiAgICB2YXIgQmFzZSA9IFR5cGVkQXJyYXkgfHwge307XG4gICAgdmFyIFRBQyA9IFR5cGVkQXJyYXkgJiYgZ2V0UHJvdG90eXBlT2YoVHlwZWRBcnJheSk7XG4gICAgdmFyIEZPUkNFRCA9ICFUeXBlZEFycmF5IHx8ICEkdHlwZWQuQUJWO1xuICAgIHZhciBPID0ge307XG4gICAgdmFyIFR5cGVkQXJyYXlQcm90b3R5cGUgPSBUeXBlZEFycmF5ICYmIFR5cGVkQXJyYXlbUFJPVE9UWVBFXTtcbiAgICB2YXIgZ2V0dGVyID0gZnVuY3Rpb24gKHRoYXQsIGluZGV4KSB7XG4gICAgICB2YXIgZGF0YSA9IHRoYXQuX2Q7XG4gICAgICByZXR1cm4gZGF0YS52W0dFVFRFUl0oaW5kZXggKiBCWVRFUyArIGRhdGEubywgTElUVExFX0VORElBTik7XG4gICAgfTtcbiAgICB2YXIgc2V0dGVyID0gZnVuY3Rpb24gKHRoYXQsIGluZGV4LCB2YWx1ZSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGF0Ll9kO1xuICAgICAgaWYgKENMQU1QRUQpIHZhbHVlID0gKHZhbHVlID0gTWF0aC5yb3VuZCh2YWx1ZSkpIDwgMCA/IDAgOiB2YWx1ZSA+IDB4ZmYgPyAweGZmIDogdmFsdWUgJiAweGZmO1xuICAgICAgZGF0YS52W1NFVFRFUl0oaW5kZXggKiBCWVRFUyArIGRhdGEubywgdmFsdWUsIExJVFRMRV9FTkRJQU4pO1xuICAgIH07XG4gICAgdmFyIGFkZEVsZW1lbnQgPSBmdW5jdGlvbiAodGhhdCwgaW5kZXgpIHtcbiAgICAgIGRQKHRoYXQsIGluZGV4LCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBnZXR0ZXIodGhpcywgaW5kZXgpO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIHJldHVybiBzZXR0ZXIodGhpcywgaW5kZXgsIHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfTtcbiAgICBpZiAoRk9SQ0VEKSB7XG4gICAgICBUeXBlZEFycmF5ID0gd3JhcHBlcihmdW5jdGlvbiAodGhhdCwgZGF0YSwgJG9mZnNldCwgJGxlbmd0aCkge1xuICAgICAgICBhbkluc3RhbmNlKHRoYXQsIFR5cGVkQXJyYXksIE5BTUUsICdfZCcpO1xuICAgICAgICB2YXIgaW5kZXggPSAwO1xuICAgICAgICB2YXIgb2Zmc2V0ID0gMDtcbiAgICAgICAgdmFyIGJ1ZmZlciwgYnl0ZUxlbmd0aCwgbGVuZ3RoLCBrbGFzcztcbiAgICAgICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgICAgIGxlbmd0aCA9IHRvSW5kZXgoZGF0YSk7XG4gICAgICAgICAgYnl0ZUxlbmd0aCA9IGxlbmd0aCAqIEJZVEVTO1xuICAgICAgICAgIGJ1ZmZlciA9IG5ldyAkQXJyYXlCdWZmZXIoYnl0ZUxlbmd0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mICRBcnJheUJ1ZmZlciB8fCAoa2xhc3MgPSBjbGFzc29mKGRhdGEpKSA9PSBBUlJBWV9CVUZGRVIgfHwga2xhc3MgPT0gU0hBUkVEX0JVRkZFUikge1xuICAgICAgICAgIGJ1ZmZlciA9IGRhdGE7XG4gICAgICAgICAgb2Zmc2V0ID0gdG9PZmZzZXQoJG9mZnNldCwgQllURVMpO1xuICAgICAgICAgIHZhciAkbGVuID0gZGF0YS5ieXRlTGVuZ3RoO1xuICAgICAgICAgIGlmICgkbGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmICgkbGVuICUgQllURVMpIHRocm93IFJhbmdlRXJyb3IoV1JPTkdfTEVOR1RIKTtcbiAgICAgICAgICAgIGJ5dGVMZW5ndGggPSAkbGVuIC0gb2Zmc2V0O1xuICAgICAgICAgICAgaWYgKGJ5dGVMZW5ndGggPCAwKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJ5dGVMZW5ndGggPSB0b0xlbmd0aCgkbGVuZ3RoKSAqIEJZVEVTO1xuICAgICAgICAgICAgaWYgKGJ5dGVMZW5ndGggKyBvZmZzZXQgPiAkbGVuKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxlbmd0aCA9IGJ5dGVMZW5ndGggLyBCWVRFUztcbiAgICAgICAgfSBlbHNlIGlmIChUWVBFRF9BUlJBWSBpbiBkYXRhKSB7XG4gICAgICAgICAgcmV0dXJuIGZyb21MaXN0KFR5cGVkQXJyYXksIGRhdGEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiAkZnJvbS5jYWxsKFR5cGVkQXJyYXksIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGhpZGUodGhhdCwgJ19kJywge1xuICAgICAgICAgIGI6IGJ1ZmZlcixcbiAgICAgICAgICBvOiBvZmZzZXQsXG4gICAgICAgICAgbDogYnl0ZUxlbmd0aCxcbiAgICAgICAgICBlOiBsZW5ndGgsXG4gICAgICAgICAgdjogbmV3ICREYXRhVmlldyhidWZmZXIpXG4gICAgICAgIH0pO1xuICAgICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIGFkZEVsZW1lbnQodGhhdCwgaW5kZXgrKyk7XG4gICAgICB9KTtcbiAgICAgIFR5cGVkQXJyYXlQcm90b3R5cGUgPSBUeXBlZEFycmF5W1BST1RPVFlQRV0gPSBjcmVhdGUoJFR5cGVkQXJyYXlQcm90b3R5cGUkKTtcbiAgICAgIGhpZGUoVHlwZWRBcnJheVByb3RvdHlwZSwgJ2NvbnN0cnVjdG9yJywgVHlwZWRBcnJheSk7XG4gICAgfSBlbHNlIGlmICghZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgICAgVHlwZWRBcnJheSgxKTtcbiAgICB9KSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgICAgbmV3IFR5cGVkQXJyYXkoLTEpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIH0pIHx8ICEkaXRlckRldGVjdChmdW5jdGlvbiAoaXRlcikge1xuICAgICAgbmV3IFR5cGVkQXJyYXkoKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICAgIG5ldyBUeXBlZEFycmF5KG51bGwpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgICAgbmV3IFR5cGVkQXJyYXkoMS41KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICAgIG5ldyBUeXBlZEFycmF5KGl0ZXIpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIH0sIHRydWUpKSB7XG4gICAgICBUeXBlZEFycmF5ID0gd3JhcHBlcihmdW5jdGlvbiAodGhhdCwgZGF0YSwgJG9mZnNldCwgJGxlbmd0aCkge1xuICAgICAgICBhbkluc3RhbmNlKHRoYXQsIFR5cGVkQXJyYXksIE5BTUUpO1xuICAgICAgICB2YXIga2xhc3M7XG4gICAgICAgIC8vIGB3c2AgbW9kdWxlIGJ1ZywgdGVtcG9yYXJpbHkgcmVtb3ZlIHZhbGlkYXRpb24gbGVuZ3RoIGZvciBVaW50OEFycmF5XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJzb2NrZXRzL3dzL3B1bGwvNjQ1XG4gICAgICAgIGlmICghaXNPYmplY3QoZGF0YSkpIHJldHVybiBuZXcgQmFzZSh0b0luZGV4KGRhdGEpKTtcbiAgICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiAkQXJyYXlCdWZmZXIgfHwgKGtsYXNzID0gY2xhc3NvZihkYXRhKSkgPT0gQVJSQVlfQlVGRkVSIHx8IGtsYXNzID09IFNIQVJFRF9CVUZGRVIpIHtcbiAgICAgICAgICByZXR1cm4gJGxlbmd0aCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IG5ldyBCYXNlKGRhdGEsIHRvT2Zmc2V0KCRvZmZzZXQsIEJZVEVTKSwgJGxlbmd0aClcbiAgICAgICAgICAgIDogJG9mZnNldCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gbmV3IEJhc2UoZGF0YSwgdG9PZmZzZXQoJG9mZnNldCwgQllURVMpKVxuICAgICAgICAgICAgICA6IG5ldyBCYXNlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChUWVBFRF9BUlJBWSBpbiBkYXRhKSByZXR1cm4gZnJvbUxpc3QoVHlwZWRBcnJheSwgZGF0YSk7XG4gICAgICAgIHJldHVybiAkZnJvbS5jYWxsKFR5cGVkQXJyYXksIGRhdGEpO1xuICAgICAgfSk7XG4gICAgICBhcnJheUZvckVhY2goVEFDICE9PSBGdW5jdGlvbi5wcm90b3R5cGUgPyBnT1BOKEJhc2UpLmNvbmNhdChnT1BOKFRBQykpIDogZ09QTihCYXNlKSwgZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBpZiAoIShrZXkgaW4gVHlwZWRBcnJheSkpIGhpZGUoVHlwZWRBcnJheSwga2V5LCBCYXNlW2tleV0pO1xuICAgICAgfSk7XG4gICAgICBUeXBlZEFycmF5W1BST1RPVFlQRV0gPSBUeXBlZEFycmF5UHJvdG90eXBlO1xuICAgICAgaWYgKCFMSUJSQVJZKSBUeXBlZEFycmF5UHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVHlwZWRBcnJheTtcbiAgICB9XG4gICAgdmFyICRuYXRpdmVJdGVyYXRvciA9IFR5cGVkQXJyYXlQcm90b3R5cGVbSVRFUkFUT1JdO1xuICAgIHZhciBDT1JSRUNUX0lURVJfTkFNRSA9ICEhJG5hdGl2ZUl0ZXJhdG9yXG4gICAgICAmJiAoJG5hdGl2ZUl0ZXJhdG9yLm5hbWUgPT0gJ3ZhbHVlcycgfHwgJG5hdGl2ZUl0ZXJhdG9yLm5hbWUgPT0gdW5kZWZpbmVkKTtcbiAgICB2YXIgJGl0ZXJhdG9yID0gJGl0ZXJhdG9ycy52YWx1ZXM7XG4gICAgaGlkZShUeXBlZEFycmF5LCBUWVBFRF9DT05TVFJVQ1RPUiwgdHJ1ZSk7XG4gICAgaGlkZShUeXBlZEFycmF5UHJvdG90eXBlLCBUWVBFRF9BUlJBWSwgTkFNRSk7XG4gICAgaGlkZShUeXBlZEFycmF5UHJvdG90eXBlLCBWSUVXLCB0cnVlKTtcbiAgICBoaWRlKFR5cGVkQXJyYXlQcm90b3R5cGUsIERFRl9DT05TVFJVQ1RPUiwgVHlwZWRBcnJheSk7XG5cbiAgICBpZiAoQ0xBTVBFRCA/IG5ldyBUeXBlZEFycmF5KDEpW1RBR10gIT0gTkFNRSA6ICEoVEFHIGluIFR5cGVkQXJyYXlQcm90b3R5cGUpKSB7XG4gICAgICBkUChUeXBlZEFycmF5UHJvdG90eXBlLCBUQUcsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBOQU1FOyB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBPW05BTUVdID0gVHlwZWRBcnJheTtcblxuICAgICRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogKFR5cGVkQXJyYXkgIT0gQmFzZSksIE8pO1xuXG4gICAgJGV4cG9ydCgkZXhwb3J0LlMsIE5BTUUsIHtcbiAgICAgIEJZVEVTX1BFUl9FTEVNRU5UOiBCWVRFU1xuICAgIH0pO1xuXG4gICAgJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiBmYWlscyhmdW5jdGlvbiAoKSB7IEJhc2Uub2YuY2FsbChUeXBlZEFycmF5LCAxKTsgfSksIE5BTUUsIHtcbiAgICAgIGZyb206ICRmcm9tLFxuICAgICAgb2Y6ICRvZlxuICAgIH0pO1xuXG4gICAgaWYgKCEoQllURVNfUEVSX0VMRU1FTlQgaW4gVHlwZWRBcnJheVByb3RvdHlwZSkpIGhpZGUoVHlwZWRBcnJheVByb3RvdHlwZSwgQllURVNfUEVSX0VMRU1FTlQsIEJZVEVTKTtcblxuICAgICRleHBvcnQoJGV4cG9ydC5QLCBOQU1FLCBwcm90byk7XG5cbiAgICBzZXRTcGVjaWVzKE5BTUUpO1xuXG4gICAgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiBGT1JDRURfU0VULCBOQU1FLCB7IHNldDogJHNldCB9KTtcblxuICAgICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogIUNPUlJFQ1RfSVRFUl9OQU1FLCBOQU1FLCAkaXRlcmF0b3JzKTtcblxuICAgIGlmICghTElCUkFSWSAmJiBUeXBlZEFycmF5UHJvdG90eXBlLnRvU3RyaW5nICE9IGFycmF5VG9TdHJpbmcpIFR5cGVkQXJyYXlQcm90b3R5cGUudG9TdHJpbmcgPSBhcnJheVRvU3RyaW5nO1xuXG4gICAgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgICBuZXcgVHlwZWRBcnJheSgxKS5zbGljZSgpO1xuICAgIH0pLCBOQU1FLCB7IHNsaWNlOiAkc2xpY2UgfSk7XG5cbiAgICAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gWzEsIDJdLnRvTG9jYWxlU3RyaW5nKCkgIT0gbmV3IFR5cGVkQXJyYXkoWzEsIDJdKS50b0xvY2FsZVN0cmluZygpO1xuICAgIH0pIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgICBUeXBlZEFycmF5UHJvdG90eXBlLnRvTG9jYWxlU3RyaW5nLmNhbGwoWzEsIDJdKTtcbiAgICB9KSksIE5BTUUsIHsgdG9Mb2NhbGVTdHJpbmc6ICR0b0xvY2FsZVN0cmluZyB9KTtcblxuICAgIEl0ZXJhdG9yc1tOQU1FXSA9IENPUlJFQ1RfSVRFUl9OQU1FID8gJG5hdGl2ZUl0ZXJhdG9yIDogJGl0ZXJhdG9yO1xuICAgIGlmICghTElCUkFSWSAmJiAhQ09SUkVDVF9JVEVSX05BTUUpIGhpZGUoVHlwZWRBcnJheVByb3RvdHlwZSwgSVRFUkFUT1IsICRpdGVyYXRvcik7XG4gIH07XG59IGVsc2UgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpO1xudmFyIExJQlJBUlkgPSByZXF1aXJlKCcuL19saWJyYXJ5Jyk7XG52YXIgJHR5cGVkID0gcmVxdWlyZSgnLi9fdHlwZWQnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIHJlZGVmaW5lQWxsID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUtYWxsJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpO1xudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIHRvSW5kZXggPSByZXF1aXJlKCcuL190by1pbmRleCcpO1xudmFyIGdPUE4gPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmY7XG52YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGFycmF5RmlsbCA9IHJlcXVpcmUoJy4vX2FycmF5LWZpbGwnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgQVJSQVlfQlVGRkVSID0gJ0FycmF5QnVmZmVyJztcbnZhciBEQVRBX1ZJRVcgPSAnRGF0YVZpZXcnO1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xudmFyIFdST05HX0xFTkdUSCA9ICdXcm9uZyBsZW5ndGghJztcbnZhciBXUk9OR19JTkRFWCA9ICdXcm9uZyBpbmRleCEnO1xudmFyICRBcnJheUJ1ZmZlciA9IGdsb2JhbFtBUlJBWV9CVUZGRVJdO1xudmFyICREYXRhVmlldyA9IGdsb2JhbFtEQVRBX1ZJRVddO1xudmFyIE1hdGggPSBnbG9iYWwuTWF0aDtcbnZhciBSYW5nZUVycm9yID0gZ2xvYmFsLlJhbmdlRXJyb3I7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93LXJlc3RyaWN0ZWQtbmFtZXNcbnZhciBJbmZpbml0eSA9IGdsb2JhbC5JbmZpbml0eTtcbnZhciBCYXNlQnVmZmVyID0gJEFycmF5QnVmZmVyO1xudmFyIGFicyA9IE1hdGguYWJzO1xudmFyIHBvdyA9IE1hdGgucG93O1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbnZhciBsb2cgPSBNYXRoLmxvZztcbnZhciBMTjIgPSBNYXRoLkxOMjtcbnZhciBCVUZGRVIgPSAnYnVmZmVyJztcbnZhciBCWVRFX0xFTkdUSCA9ICdieXRlTGVuZ3RoJztcbnZhciBCWVRFX09GRlNFVCA9ICdieXRlT2Zmc2V0JztcbnZhciAkQlVGRkVSID0gREVTQ1JJUFRPUlMgPyAnX2InIDogQlVGRkVSO1xudmFyICRMRU5HVEggPSBERVNDUklQVE9SUyA/ICdfbCcgOiBCWVRFX0xFTkdUSDtcbnZhciAkT0ZGU0VUID0gREVTQ1JJUFRPUlMgPyAnX28nIDogQllURV9PRkZTRVQ7XG5cbi8vIElFRUU3NTQgY29udmVyc2lvbnMgYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9pZWVlNzU0XG5mdW5jdGlvbiBwYWNrSUVFRTc1NCh2YWx1ZSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBidWZmZXIgPSBuZXcgQXJyYXkobkJ5dGVzKTtcbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDE7XG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxO1xuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDE7XG4gIHZhciBydCA9IG1MZW4gPT09IDIzID8gcG93KDIsIC0yNCkgLSBwb3coMiwgLTc3KSA6IDA7XG4gIHZhciBpID0gMDtcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgdmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCA/IDEgOiAwO1xuICB2YXIgZSwgbSwgYztcbiAgdmFsdWUgPSBhYnModmFsdWUpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIGlmICh2YWx1ZSAhPSB2YWx1ZSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgbSA9IHZhbHVlICE9IHZhbHVlID8gMSA6IDA7XG4gICAgZSA9IGVNYXg7XG4gIH0gZWxzZSB7XG4gICAgZSA9IGZsb29yKGxvZyh2YWx1ZSkgLyBMTjIpO1xuICAgIGlmICh2YWx1ZSAqIChjID0gcG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS07XG4gICAgICBjICo9IDI7XG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgdmFsdWUgKz0gcnQgLyBjO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIHBvdygyLCAxIC0gZUJpYXMpO1xuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrKztcbiAgICAgIGMgLz0gMjtcbiAgICB9XG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMDtcbiAgICAgIGUgPSBlTWF4O1xuICAgIH0gZWxzZSBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIG0gPSAodmFsdWUgKiBjIC0gMSkgKiBwb3coMiwgbUxlbik7XG4gICAgICBlID0gZSArIGVCaWFzO1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gdmFsdWUgKiBwb3coMiwgZUJpYXMgLSAxKSAqIHBvdygyLCBtTGVuKTtcbiAgICAgIGUgPSAwO1xuICAgIH1cbiAgfVxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbaSsrXSA9IG0gJiAyNTUsIG0gLz0gMjU2LCBtTGVuIC09IDgpO1xuICBlID0gZSA8PCBtTGVuIHwgbTtcbiAgZUxlbiArPSBtTGVuO1xuICBmb3IgKDsgZUxlbiA+IDA7IGJ1ZmZlcltpKytdID0gZSAmIDI1NSwgZSAvPSAyNTYsIGVMZW4gLT0gOCk7XG4gIGJ1ZmZlclstLWldIHw9IHMgKiAxMjg7XG4gIHJldHVybiBidWZmZXI7XG59XG5mdW5jdGlvbiB1bnBhY2tJRUVFNzU0KGJ1ZmZlciwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxO1xuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMTtcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxO1xuICB2YXIgbkJpdHMgPSBlTGVuIC0gNztcbiAgdmFyIGkgPSBuQnl0ZXMgLSAxO1xuICB2YXIgcyA9IGJ1ZmZlcltpLS1dO1xuICB2YXIgZSA9IHMgJiAxMjc7XG4gIHZhciBtO1xuICBzID4+PSA3O1xuICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gZSAqIDI1NiArIGJ1ZmZlcltpXSwgaS0tLCBuQml0cyAtPSA4KTtcbiAgbSA9IGUgJiAoMSA8PCAtbkJpdHMpIC0gMTtcbiAgZSA+Pj0gLW5CaXRzO1xuICBuQml0cyArPSBtTGVuO1xuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gbSAqIDI1NiArIGJ1ZmZlcltpXSwgaS0tLCBuQml0cyAtPSA4KTtcbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzO1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6IHMgPyAtSW5maW5pdHkgOiBJbmZpbml0eTtcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIHBvdygyLCBtTGVuKTtcbiAgICBlID0gZSAtIGVCaWFzO1xuICB9IHJldHVybiAocyA/IC0xIDogMSkgKiBtICogcG93KDIsIGUgLSBtTGVuKTtcbn1cblxuZnVuY3Rpb24gdW5wYWNrSTMyKGJ5dGVzKSB7XG4gIHJldHVybiBieXRlc1szXSA8PCAyNCB8IGJ5dGVzWzJdIDw8IDE2IHwgYnl0ZXNbMV0gPDwgOCB8IGJ5dGVzWzBdO1xufVxuZnVuY3Rpb24gcGFja0k4KGl0KSB7XG4gIHJldHVybiBbaXQgJiAweGZmXTtcbn1cbmZ1bmN0aW9uIHBhY2tJMTYoaXQpIHtcbiAgcmV0dXJuIFtpdCAmIDB4ZmYsIGl0ID4+IDggJiAweGZmXTtcbn1cbmZ1bmN0aW9uIHBhY2tJMzIoaXQpIHtcbiAgcmV0dXJuIFtpdCAmIDB4ZmYsIGl0ID4+IDggJiAweGZmLCBpdCA+PiAxNiAmIDB4ZmYsIGl0ID4+IDI0ICYgMHhmZl07XG59XG5mdW5jdGlvbiBwYWNrRjY0KGl0KSB7XG4gIHJldHVybiBwYWNrSUVFRTc1NChpdCwgNTIsIDgpO1xufVxuZnVuY3Rpb24gcGFja0YzMihpdCkge1xuICByZXR1cm4gcGFja0lFRUU3NTQoaXQsIDIzLCA0KTtcbn1cblxuZnVuY3Rpb24gYWRkR2V0dGVyKEMsIGtleSwgaW50ZXJuYWwpIHtcbiAgZFAoQ1tQUk9UT1RZUEVdLCBrZXksIHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzW2ludGVybmFsXTsgfSB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0KHZpZXcsIGJ5dGVzLCBpbmRleCwgaXNMaXR0bGVFbmRpYW4pIHtcbiAgdmFyIG51bUluZGV4ID0gK2luZGV4O1xuICB2YXIgaW50SW5kZXggPSB0b0luZGV4KG51bUluZGV4KTtcbiAgaWYgKGludEluZGV4ICsgYnl0ZXMgPiB2aWV3WyRMRU5HVEhdKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0lOREVYKTtcbiAgdmFyIHN0b3JlID0gdmlld1skQlVGRkVSXS5fYjtcbiAgdmFyIHN0YXJ0ID0gaW50SW5kZXggKyB2aWV3WyRPRkZTRVRdO1xuICB2YXIgcGFjayA9IHN0b3JlLnNsaWNlKHN0YXJ0LCBzdGFydCArIGJ5dGVzKTtcbiAgcmV0dXJuIGlzTGl0dGxlRW5kaWFuID8gcGFjayA6IHBhY2sucmV2ZXJzZSgpO1xufVxuZnVuY3Rpb24gc2V0KHZpZXcsIGJ5dGVzLCBpbmRleCwgY29udmVyc2lvbiwgdmFsdWUsIGlzTGl0dGxlRW5kaWFuKSB7XG4gIHZhciBudW1JbmRleCA9ICtpbmRleDtcbiAgdmFyIGludEluZGV4ID0gdG9JbmRleChudW1JbmRleCk7XG4gIGlmIChpbnRJbmRleCArIGJ5dGVzID4gdmlld1skTEVOR1RIXSkgdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19JTkRFWCk7XG4gIHZhciBzdG9yZSA9IHZpZXdbJEJVRkZFUl0uX2I7XG4gIHZhciBzdGFydCA9IGludEluZGV4ICsgdmlld1skT0ZGU0VUXTtcbiAgdmFyIHBhY2sgPSBjb252ZXJzaW9uKCt2YWx1ZSk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXM7IGkrKykgc3RvcmVbc3RhcnQgKyBpXSA9IHBhY2tbaXNMaXR0bGVFbmRpYW4gPyBpIDogYnl0ZXMgLSBpIC0gMV07XG59XG5cbmlmICghJHR5cGVkLkFCVikge1xuICAkQXJyYXlCdWZmZXIgPSBmdW5jdGlvbiBBcnJheUJ1ZmZlcihsZW5ndGgpIHtcbiAgICBhbkluc3RhbmNlKHRoaXMsICRBcnJheUJ1ZmZlciwgQVJSQVlfQlVGRkVSKTtcbiAgICB2YXIgYnl0ZUxlbmd0aCA9IHRvSW5kZXgobGVuZ3RoKTtcbiAgICB0aGlzLl9iID0gYXJyYXlGaWxsLmNhbGwobmV3IEFycmF5KGJ5dGVMZW5ndGgpLCAwKTtcbiAgICB0aGlzWyRMRU5HVEhdID0gYnl0ZUxlbmd0aDtcbiAgfTtcblxuICAkRGF0YVZpZXcgPSBmdW5jdGlvbiBEYXRhVmlldyhidWZmZXIsIGJ5dGVPZmZzZXQsIGJ5dGVMZW5ndGgpIHtcbiAgICBhbkluc3RhbmNlKHRoaXMsICREYXRhVmlldywgREFUQV9WSUVXKTtcbiAgICBhbkluc3RhbmNlKGJ1ZmZlciwgJEFycmF5QnVmZmVyLCBEQVRBX1ZJRVcpO1xuICAgIHZhciBidWZmZXJMZW5ndGggPSBidWZmZXJbJExFTkdUSF07XG4gICAgdmFyIG9mZnNldCA9IHRvSW50ZWdlcihieXRlT2Zmc2V0KTtcbiAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBidWZmZXJMZW5ndGgpIHRocm93IFJhbmdlRXJyb3IoJ1dyb25nIG9mZnNldCEnKTtcbiAgICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA9PT0gdW5kZWZpbmVkID8gYnVmZmVyTGVuZ3RoIC0gb2Zmc2V0IDogdG9MZW5ndGgoYnl0ZUxlbmd0aCk7XG4gICAgaWYgKG9mZnNldCArIGJ5dGVMZW5ndGggPiBidWZmZXJMZW5ndGgpIHRocm93IFJhbmdlRXJyb3IoV1JPTkdfTEVOR1RIKTtcbiAgICB0aGlzWyRCVUZGRVJdID0gYnVmZmVyO1xuICAgIHRoaXNbJE9GRlNFVF0gPSBvZmZzZXQ7XG4gICAgdGhpc1skTEVOR1RIXSA9IGJ5dGVMZW5ndGg7XG4gIH07XG5cbiAgaWYgKERFU0NSSVBUT1JTKSB7XG4gICAgYWRkR2V0dGVyKCRBcnJheUJ1ZmZlciwgQllURV9MRU5HVEgsICdfbCcpO1xuICAgIGFkZEdldHRlcigkRGF0YVZpZXcsIEJVRkZFUiwgJ19iJyk7XG4gICAgYWRkR2V0dGVyKCREYXRhVmlldywgQllURV9MRU5HVEgsICdfbCcpO1xuICAgIGFkZEdldHRlcigkRGF0YVZpZXcsIEJZVEVfT0ZGU0VULCAnX28nKTtcbiAgfVxuXG4gIHJlZGVmaW5lQWxsKCREYXRhVmlld1tQUk9UT1RZUEVdLCB7XG4gICAgZ2V0SW50ODogZnVuY3Rpb24gZ2V0SW50OChieXRlT2Zmc2V0KSB7XG4gICAgICByZXR1cm4gZ2V0KHRoaXMsIDEsIGJ5dGVPZmZzZXQpWzBdIDw8IDI0ID4+IDI0O1xuICAgIH0sXG4gICAgZ2V0VWludDg6IGZ1bmN0aW9uIGdldFVpbnQ4KGJ5dGVPZmZzZXQpIHtcbiAgICAgIHJldHVybiBnZXQodGhpcywgMSwgYnl0ZU9mZnNldClbMF07XG4gICAgfSxcbiAgICBnZXRJbnQxNjogZnVuY3Rpb24gZ2V0SW50MTYoYnl0ZU9mZnNldCAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgdmFyIGJ5dGVzID0gZ2V0KHRoaXMsIDIsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50c1sxXSk7XG4gICAgICByZXR1cm4gKGJ5dGVzWzFdIDw8IDggfCBieXRlc1swXSkgPDwgMTYgPj4gMTY7XG4gICAgfSxcbiAgICBnZXRVaW50MTY6IGZ1bmN0aW9uIGdldFVpbnQxNihieXRlT2Zmc2V0IC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICB2YXIgYnl0ZXMgPSBnZXQodGhpcywgMiwgYnl0ZU9mZnNldCwgYXJndW1lbnRzWzFdKTtcbiAgICAgIHJldHVybiBieXRlc1sxXSA8PCA4IHwgYnl0ZXNbMF07XG4gICAgfSxcbiAgICBnZXRJbnQzMjogZnVuY3Rpb24gZ2V0SW50MzIoYnl0ZU9mZnNldCAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgcmV0dXJuIHVucGFja0kzMihnZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgYXJndW1lbnRzWzFdKSk7XG4gICAgfSxcbiAgICBnZXRVaW50MzI6IGZ1bmN0aW9uIGdldFVpbnQzMihieXRlT2Zmc2V0IC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICByZXR1cm4gdW5wYWNrSTMyKGdldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBhcmd1bWVudHNbMV0pKSA+Pj4gMDtcbiAgICB9LFxuICAgIGdldEZsb2F0MzI6IGZ1bmN0aW9uIGdldEZsb2F0MzIoYnl0ZU9mZnNldCAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgcmV0dXJuIHVucGFja0lFRUU3NTQoZ2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50c1sxXSksIDIzLCA0KTtcbiAgICB9LFxuICAgIGdldEZsb2F0NjQ6IGZ1bmN0aW9uIGdldEZsb2F0NjQoYnl0ZU9mZnNldCAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgcmV0dXJuIHVucGFja0lFRUU3NTQoZ2V0KHRoaXMsIDgsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50c1sxXSksIDUyLCA4KTtcbiAgICB9LFxuICAgIHNldEludDg6IGZ1bmN0aW9uIHNldEludDgoYnl0ZU9mZnNldCwgdmFsdWUpIHtcbiAgICAgIHNldCh0aGlzLCAxLCBieXRlT2Zmc2V0LCBwYWNrSTgsIHZhbHVlKTtcbiAgICB9LFxuICAgIHNldFVpbnQ4OiBmdW5jdGlvbiBzZXRVaW50OChieXRlT2Zmc2V0LCB2YWx1ZSkge1xuICAgICAgc2V0KHRoaXMsIDEsIGJ5dGVPZmZzZXQsIHBhY2tJOCwgdmFsdWUpO1xuICAgIH0sXG4gICAgc2V0SW50MTY6IGZ1bmN0aW9uIHNldEludDE2KGJ5dGVPZmZzZXQsIHZhbHVlIC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICBzZXQodGhpcywgMiwgYnl0ZU9mZnNldCwgcGFja0kxNiwgdmFsdWUsIGFyZ3VtZW50c1syXSk7XG4gICAgfSxcbiAgICBzZXRVaW50MTY6IGZ1bmN0aW9uIHNldFVpbnQxNihieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgc2V0KHRoaXMsIDIsIGJ5dGVPZmZzZXQsIHBhY2tJMTYsIHZhbHVlLCBhcmd1bWVudHNbMl0pO1xuICAgIH0sXG4gICAgc2V0SW50MzI6IGZ1bmN0aW9uIHNldEludDMyKGJ5dGVPZmZzZXQsIHZhbHVlIC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICBzZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgcGFja0kzMiwgdmFsdWUsIGFyZ3VtZW50c1syXSk7XG4gICAgfSxcbiAgICBzZXRVaW50MzI6IGZ1bmN0aW9uIHNldFVpbnQzMihieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgc2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIHBhY2tJMzIsIHZhbHVlLCBhcmd1bWVudHNbMl0pO1xuICAgIH0sXG4gICAgc2V0RmxvYXQzMjogZnVuY3Rpb24gc2V0RmxvYXQzMihieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgc2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIHBhY2tGMzIsIHZhbHVlLCBhcmd1bWVudHNbMl0pO1xuICAgIH0sXG4gICAgc2V0RmxvYXQ2NDogZnVuY3Rpb24gc2V0RmxvYXQ2NChieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgc2V0KHRoaXMsIDgsIGJ5dGVPZmZzZXQsIHBhY2tGNjQsIHZhbHVlLCBhcmd1bWVudHNbMl0pO1xuICAgIH1cbiAgfSk7XG59IGVsc2Uge1xuICBpZiAoIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAkQXJyYXlCdWZmZXIoMSk7XG4gIH0pIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgbmV3ICRBcnJheUJ1ZmZlcigtMSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gIH0pIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICBuZXcgJEFycmF5QnVmZmVyKCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgbmV3ICRBcnJheUJ1ZmZlcigxLjUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIG5ldyAkQXJyYXlCdWZmZXIoTmFOKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICByZXR1cm4gJEFycmF5QnVmZmVyLm5hbWUgIT0gQVJSQVlfQlVGRkVSO1xuICB9KSkge1xuICAgICRBcnJheUJ1ZmZlciA9IGZ1bmN0aW9uIEFycmF5QnVmZmVyKGxlbmd0aCkge1xuICAgICAgYW5JbnN0YW5jZSh0aGlzLCAkQXJyYXlCdWZmZXIpO1xuICAgICAgcmV0dXJuIG5ldyBCYXNlQnVmZmVyKHRvSW5kZXgobGVuZ3RoKSk7XG4gICAgfTtcbiAgICB2YXIgQXJyYXlCdWZmZXJQcm90byA9ICRBcnJheUJ1ZmZlcltQUk9UT1RZUEVdID0gQmFzZUJ1ZmZlcltQUk9UT1RZUEVdO1xuICAgIGZvciAodmFyIGtleXMgPSBnT1BOKEJhc2VCdWZmZXIpLCBqID0gMCwga2V5OyBrZXlzLmxlbmd0aCA+IGo7KSB7XG4gICAgICBpZiAoISgoa2V5ID0ga2V5c1tqKytdKSBpbiAkQXJyYXlCdWZmZXIpKSBoaWRlKCRBcnJheUJ1ZmZlciwga2V5LCBCYXNlQnVmZmVyW2tleV0pO1xuICAgIH1cbiAgICBpZiAoIUxJQlJBUlkpIEFycmF5QnVmZmVyUHJvdG8uY29uc3RydWN0b3IgPSAkQXJyYXlCdWZmZXI7XG4gIH1cbiAgLy8gaU9TIFNhZmFyaSA3LnggYnVnXG4gIHZhciB2aWV3ID0gbmV3ICREYXRhVmlldyhuZXcgJEFycmF5QnVmZmVyKDIpKTtcbiAgdmFyICRzZXRJbnQ4ID0gJERhdGFWaWV3W1BST1RPVFlQRV0uc2V0SW50ODtcbiAgdmlldy5zZXRJbnQ4KDAsIDIxNDc0ODM2NDgpO1xuICB2aWV3LnNldEludDgoMSwgMjE0NzQ4MzY0OSk7XG4gIGlmICh2aWV3LmdldEludDgoMCkgfHwgIXZpZXcuZ2V0SW50OCgxKSkgcmVkZWZpbmVBbGwoJERhdGFWaWV3W1BST1RPVFlQRV0sIHtcbiAgICBzZXRJbnQ4OiBmdW5jdGlvbiBzZXRJbnQ4KGJ5dGVPZmZzZXQsIHZhbHVlKSB7XG4gICAgICAkc2V0SW50OC5jYWxsKHRoaXMsIGJ5dGVPZmZzZXQsIHZhbHVlIDw8IDI0ID4+IDI0KTtcbiAgICB9LFxuICAgIHNldFVpbnQ4OiBmdW5jdGlvbiBzZXRVaW50OChieXRlT2Zmc2V0LCB2YWx1ZSkge1xuICAgICAgJHNldEludDguY2FsbCh0aGlzLCBieXRlT2Zmc2V0LCB2YWx1ZSA8PCAyNCA+PiAyNCk7XG4gICAgfVxuICB9LCB0cnVlKTtcbn1cbnNldFRvU3RyaW5nVGFnKCRBcnJheUJ1ZmZlciwgQVJSQVlfQlVGRkVSKTtcbnNldFRvU3RyaW5nVGFnKCREYXRhVmlldywgREFUQV9WSUVXKTtcbmhpZGUoJERhdGFWaWV3W1BST1RPVFlQRV0sICR0eXBlZC5WSUVXLCB0cnVlKTtcbmV4cG9ydHNbQVJSQVlfQlVGRkVSXSA9ICRBcnJheUJ1ZmZlcjtcbmV4cG9ydHNbREFUQV9WSUVXXSA9ICREYXRhVmlldztcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4vX3VpZCcpO1xudmFyIFRZUEVEID0gdWlkKCd0eXBlZF9hcnJheScpO1xudmFyIFZJRVcgPSB1aWQoJ3ZpZXcnKTtcbnZhciBBQlYgPSAhIShnbG9iYWwuQXJyYXlCdWZmZXIgJiYgZ2xvYmFsLkRhdGFWaWV3KTtcbnZhciBDT05TVFIgPSBBQlY7XG52YXIgaSA9IDA7XG52YXIgbCA9IDk7XG52YXIgVHlwZWQ7XG5cbnZhciBUeXBlZEFycmF5Q29uc3RydWN0b3JzID0gKFxuICAnSW50OEFycmF5LFVpbnQ4QXJyYXksVWludDhDbGFtcGVkQXJyYXksSW50MTZBcnJheSxVaW50MTZBcnJheSxJbnQzMkFycmF5LFVpbnQzMkFycmF5LEZsb2F0MzJBcnJheSxGbG9hdDY0QXJyYXknXG4pLnNwbGl0KCcsJyk7XG5cbndoaWxlIChpIDwgbCkge1xuICBpZiAoVHlwZWQgPSBnbG9iYWxbVHlwZWRBcnJheUNvbnN0cnVjdG9yc1tpKytdXSkge1xuICAgIGhpZGUoVHlwZWQucHJvdG90eXBlLCBUWVBFRCwgdHJ1ZSk7XG4gICAgaGlkZShUeXBlZC5wcm90b3R5cGUsIFZJRVcsIHRydWUpO1xuICB9IGVsc2UgQ09OU1RSID0gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBBQlY6IEFCVixcbiAgQ09OU1RSOiBDT05TVFIsXG4gIFRZUEVEOiBUWVBFRCxcbiAgVklFVzogVklFV1xufTtcbiIsInZhciBpZCA9IDA7XG52YXIgcHggPSBNYXRoLnJhbmRvbSgpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiAnU3ltYm9sKCcuY29uY2F0KGtleSA9PT0gdW5kZWZpbmVkID8gJycgOiBrZXksICcpXycsICgrK2lkICsgcHgpLnRvU3RyaW5nKDM2KSk7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIG5hdmlnYXRvciA9IGdsb2JhbC5uYXZpZ2F0b3I7XG5cbm1vZHVsZS5leHBvcnRzID0gbmF2aWdhdG9yICYmIG5hdmlnYXRvci51c2VyQWdlbnQgfHwgJyc7XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBUWVBFKSB7XG4gIGlmICghaXNPYmplY3QoaXQpIHx8IGl0Ll90ICE9PSBUWVBFKSB0aHJvdyBUeXBlRXJyb3IoJ0luY29tcGF0aWJsZSByZWNlaXZlciwgJyArIFRZUEUgKyAnIHJlcXVpcmVkIScpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgTElCUkFSWSA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKTtcbnZhciB3a3NFeHQgPSByZXF1aXJlKCcuL193a3MtZXh0Jyk7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZSkge1xuICB2YXIgJFN5bWJvbCA9IGNvcmUuU3ltYm9sIHx8IChjb3JlLlN5bWJvbCA9IExJQlJBUlkgPyB7fSA6IGdsb2JhbC5TeW1ib2wgfHwge30pO1xuICBpZiAobmFtZS5jaGFyQXQoMCkgIT0gJ18nICYmICEobmFtZSBpbiAkU3ltYm9sKSkgZGVmaW5lUHJvcGVydHkoJFN5bWJvbCwgbmFtZSwgeyB2YWx1ZTogd2tzRXh0LmYobmFtZSkgfSk7XG59O1xuIiwiZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fd2tzJyk7XG4iLCJ2YXIgc3RvcmUgPSByZXF1aXJlKCcuL19zaGFyZWQnKSgnd2tzJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG52YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuU3ltYm9sO1xudmFyIFVTRV9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09ICdmdW5jdGlvbic7XG5cbnZhciAkZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIHN0b3JlW25hbWVdIHx8IChzdG9yZVtuYW1lXSA9XG4gICAgVVNFX1NZTUJPTCAmJiBTeW1ib2xbbmFtZV0gfHwgKFVTRV9TWU1CT0wgPyBTeW1ib2wgOiB1aWQpKCdTeW1ib2wuJyArIG5hbWUpKTtcbn07XG5cbiRleHBvcnRzLnN0b3JlID0gc3RvcmU7XG4iLCJ2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKTtcbnZhciBJVEVSQVRPUiA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19jb3JlJykuZ2V0SXRlcmF0b3JNZXRob2QgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ICE9IHVuZGVmaW5lZCkgcmV0dXJuIGl0W0lURVJBVE9SXVxuICAgIHx8IGl0WydAQGl0ZXJhdG9yJ11cbiAgICB8fCBJdGVyYXRvcnNbY2xhc3NvZihpdCldO1xufTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iZW5qYW1pbmdyL1JleEV4cC5lc2NhcGVcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJHJlID0gcmVxdWlyZSgnLi9fcmVwbGFjZXInKSgvW1xcXFxeJCorPy4oKXxbXFxde31dL2csICdcXFxcJCYnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWdFeHAnLCB7IGVzY2FwZTogZnVuY3Rpb24gZXNjYXBlKGl0KSB7IHJldHVybiAkcmUoaXQpOyB9IH0pO1xuIiwiLy8gMjIuMS4zLjMgQXJyYXkucHJvdG90eXBlLmNvcHlXaXRoaW4odGFyZ2V0LCBzdGFydCwgZW5kID0gdGhpcy5sZW5ndGgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCwgJ0FycmF5JywgeyBjb3B5V2l0aGluOiByZXF1aXJlKCcuL19hcnJheS1jb3B5LXdpdGhpbicpIH0pO1xuXG5yZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKSgnY29weVdpdGhpbicpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkZXZlcnkgPSByZXF1aXJlKCcuL19hcnJheS1tZXRob2RzJykoNCk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKShbXS5ldmVyeSwgdHJ1ZSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4zLjUgLyAxNS40LjQuMTYgQXJyYXkucHJvdG90eXBlLmV2ZXJ5KGNhbGxiYWNrZm4gWywgdGhpc0FyZ10pXG4gIGV2ZXJ5OiBmdW5jdGlvbiBldmVyeShjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHJldHVybiAkZXZlcnkodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzWzFdKTtcbiAgfVxufSk7XG4iLCIvLyAyMi4xLjMuNiBBcnJheS5wcm90b3R5cGUuZmlsbCh2YWx1ZSwgc3RhcnQgPSAwLCBlbmQgPSB0aGlzLmxlbmd0aClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnQXJyYXknLCB7IGZpbGw6IHJlcXVpcmUoJy4vX2FycmF5LWZpbGwnKSB9KTtcblxucmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJykoJ2ZpbGwnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJGZpbHRlciA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSgyKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKFtdLmZpbHRlciwgdHJ1ZSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4zLjcgLyAxNS40LjQuMjAgQXJyYXkucHJvdG90eXBlLmZpbHRlcihjYWxsYmFja2ZuIFssIHRoaXNBcmddKVxuICBmaWx0ZXI6IGZ1bmN0aW9uIGZpbHRlcihjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHJldHVybiAkZmlsdGVyKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50c1sxXSk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gMjIuMS4zLjkgQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleChwcmVkaWNhdGUsIHRoaXNBcmcgPSB1bmRlZmluZWQpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRmaW5kID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpKDYpO1xudmFyIEtFWSA9ICdmaW5kSW5kZXgnO1xudmFyIGZvcmNlZCA9IHRydWU7XG4vLyBTaG91bGRuJ3Qgc2tpcCBob2xlc1xuaWYgKEtFWSBpbiBbXSkgQXJyYXkoMSlbS0VZXShmdW5jdGlvbiAoKSB7IGZvcmNlZCA9IGZhbHNlOyB9KTtcbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogZm9yY2VkLCAnQXJyYXknLCB7XG4gIGZpbmRJbmRleDogZnVuY3Rpb24gZmluZEluZGV4KGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgcmV0dXJuICRmaW5kKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5yZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKShLRVkpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gMjIuMS4zLjggQXJyYXkucHJvdG90eXBlLmZpbmQocHJlZGljYXRlLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkZmluZCA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSg1KTtcbnZhciBLRVkgPSAnZmluZCc7XG52YXIgZm9yY2VkID0gdHJ1ZTtcbi8vIFNob3VsZG4ndCBza2lwIGhvbGVzXG5pZiAoS0VZIGluIFtdKSBBcnJheSgxKVtLRVldKGZ1bmN0aW9uICgpIHsgZm9yY2VkID0gZmFsc2U7IH0pO1xuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiBmb3JjZWQsICdBcnJheScsIHtcbiAgZmluZDogZnVuY3Rpb24gZmluZChjYWxsYmFja2ZuIC8qICwgdGhhdCA9IHVuZGVmaW5lZCAqLykge1xuICAgIHJldHVybiAkZmluZCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xucmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJykoS0VZKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJGZvckVhY2ggPSByZXF1aXJlKCcuL19hcnJheS1tZXRob2RzJykoMCk7XG52YXIgU1RSSUNUID0gcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKFtdLmZvckVhY2gsIHRydWUpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqICFTVFJJQ1QsICdBcnJheScsIHtcbiAgLy8gMjIuMS4zLjEwIC8gMTUuNC40LjE4IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoKGNhbGxiYWNrZm4gWywgdGhpc0FyZ10pXG4gIGZvckVhY2g6IGZ1bmN0aW9uIGZvckVhY2goY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICByZXR1cm4gJGZvckVhY2godGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzWzFdKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4vX2l0ZXItY2FsbCcpO1xudmFyIGlzQXJyYXlJdGVyID0gcmVxdWlyZSgnLi9faXMtYXJyYXktaXRlcicpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgY3JlYXRlUHJvcGVydHkgPSByZXF1aXJlKCcuL19jcmVhdGUtcHJvcGVydHknKTtcbnZhciBnZXRJdGVyRm4gPSByZXF1aXJlKCcuL2NvcmUuZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19pdGVyLWRldGVjdCcpKGZ1bmN0aW9uIChpdGVyKSB7IEFycmF5LmZyb20oaXRlcik7IH0pLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMi4xIEFycmF5LmZyb20oYXJyYXlMaWtlLCBtYXBmbiA9IHVuZGVmaW5lZCwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbiAgZnJvbTogZnVuY3Rpb24gZnJvbShhcnJheUxpa2UgLyogLCBtYXBmbiA9IHVuZGVmaW5lZCwgdGhpc0FyZyA9IHVuZGVmaW5lZCAqLykge1xuICAgIHZhciBPID0gdG9PYmplY3QoYXJyYXlMaWtlKTtcbiAgICB2YXIgQyA9IHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgPyB0aGlzIDogQXJyYXk7XG4gICAgdmFyIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciBtYXBmbiA9IGFMZW4gPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICAgIHZhciBtYXBwaW5nID0gbWFwZm4gIT09IHVuZGVmaW5lZDtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBpdGVyRm4gPSBnZXRJdGVyRm4oTyk7XG4gICAgdmFyIGxlbmd0aCwgcmVzdWx0LCBzdGVwLCBpdGVyYXRvcjtcbiAgICBpZiAobWFwcGluZykgbWFwZm4gPSBjdHgobWFwZm4sIGFMZW4gPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkLCAyKTtcbiAgICAvLyBpZiBvYmplY3QgaXNuJ3QgaXRlcmFibGUgb3IgaXQncyBhcnJheSB3aXRoIGRlZmF1bHQgaXRlcmF0b3IgLSB1c2Ugc2ltcGxlIGNhc2VcbiAgICBpZiAoaXRlckZuICE9IHVuZGVmaW5lZCAmJiAhKEMgPT0gQXJyYXkgJiYgaXNBcnJheUl0ZXIoaXRlckZuKSkpIHtcbiAgICAgIGZvciAoaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChPKSwgcmVzdWx0ID0gbmV3IEMoKTsgIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lOyBpbmRleCsrKSB7XG4gICAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIG1hcHBpbmcgPyBjYWxsKGl0ZXJhdG9yLCBtYXBmbiwgW3N0ZXAudmFsdWUsIGluZGV4XSwgdHJ1ZSkgOiBzdGVwLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgICAgZm9yIChyZXN1bHQgPSBuZXcgQyhsZW5ndGgpOyBsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgICBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGluZGV4LCBtYXBwaW5nID8gbWFwZm4oT1tpbmRleF0sIGluZGV4KSA6IE9baW5kZXhdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0Lmxlbmd0aCA9IGluZGV4O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkaW5kZXhPZiA9IHJlcXVpcmUoJy4vX2FycmF5LWluY2x1ZGVzJykoZmFsc2UpO1xudmFyICRuYXRpdmUgPSBbXS5pbmRleE9mO1xudmFyIE5FR0FUSVZFX1pFUk8gPSAhISRuYXRpdmUgJiYgMSAvIFsxXS5pbmRleE9mKDEsIC0wKSA8IDA7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKE5FR0FUSVZFX1pFUk8gfHwgIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKSgkbmF0aXZlKSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4zLjExIC8gMTUuNC40LjE0IEFycmF5LnByb3RvdHlwZS5pbmRleE9mKHNlYXJjaEVsZW1lbnQgWywgZnJvbUluZGV4XSlcbiAgaW5kZXhPZjogZnVuY3Rpb24gaW5kZXhPZihzZWFyY2hFbGVtZW50IC8qICwgZnJvbUluZGV4ID0gMCAqLykge1xuICAgIHJldHVybiBORUdBVElWRV9aRVJPXG4gICAgICAvLyBjb252ZXJ0IC0wIHRvICswXG4gICAgICA/ICRuYXRpdmUuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCAwXG4gICAgICA6ICRpbmRleE9mKHRoaXMsIHNlYXJjaEVsZW1lbnQsIGFyZ3VtZW50c1sxXSk7XG4gIH1cbn0pO1xuIiwiLy8gMjIuMS4yLjIgLyAxNS40LjMuMiBBcnJheS5pc0FycmF5KGFyZylcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnQXJyYXknLCB7IGlzQXJyYXk6IHJlcXVpcmUoJy4vX2lzLWFycmF5JykgfSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IHJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpO1xudmFyIHN0ZXAgPSByZXF1aXJlKCcuL19pdGVyLXN0ZXAnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG5cbi8vIDIyLjEuMy40IEFycmF5LnByb3RvdHlwZS5lbnRyaWVzKClcbi8vIDIyLjEuMy4xMyBBcnJheS5wcm90b3R5cGUua2V5cygpXG4vLyAyMi4xLjMuMjkgQXJyYXkucHJvdG90eXBlLnZhbHVlcygpXG4vLyAyMi4xLjMuMzAgQXJyYXkucHJvdG90eXBlW0BAaXRlcmF0b3JdKClcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9faXRlci1kZWZpbmUnKShBcnJheSwgJ0FycmF5JywgZnVuY3Rpb24gKGl0ZXJhdGVkLCBraW5kKSB7XG4gIHRoaXMuX3QgPSB0b0lPYmplY3QoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbiAgdGhpcy5fayA9IGtpbmQ7ICAgICAgICAgICAgICAgIC8vIGtpbmRcbi8vIDIyLjEuNS4yLjEgJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxufSwgZnVuY3Rpb24gKCkge1xuICB2YXIgTyA9IHRoaXMuX3Q7XG4gIHZhciBraW5kID0gdGhpcy5faztcbiAgdmFyIGluZGV4ID0gdGhpcy5faSsrO1xuICBpZiAoIU8gfHwgaW5kZXggPj0gTy5sZW5ndGgpIHtcbiAgICB0aGlzLl90ID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiBzdGVwKDEpO1xuICB9XG4gIGlmIChraW5kID09ICdrZXlzJykgcmV0dXJuIHN0ZXAoMCwgaW5kZXgpO1xuICBpZiAoa2luZCA9PSAndmFsdWVzJykgcmV0dXJuIHN0ZXAoMCwgT1tpbmRleF0pO1xuICByZXR1cm4gc3RlcCgwLCBbaW5kZXgsIE9baW5kZXhdXSk7XG59LCAndmFsdWVzJyk7XG5cbi8vIGFyZ3VtZW50c0xpc3RbQEBpdGVyYXRvcl0gaXMgJUFycmF5UHJvdG9fdmFsdWVzJSAoOS40LjQuNiwgOS40LjQuNylcbkl0ZXJhdG9ycy5Bcmd1bWVudHMgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbmFkZFRvVW5zY29wYWJsZXMoJ2tleXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ3ZhbHVlcycpO1xuYWRkVG9VbnNjb3BhYmxlcygnZW50cmllcycpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gMjIuMS4zLjEzIEFycmF5LnByb3RvdHlwZS5qb2luKHNlcGFyYXRvcilcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIGFycmF5Sm9pbiA9IFtdLmpvaW47XG5cbi8vIGZhbGxiYWNrIGZvciBub3QgYXJyYXktbGlrZSBzdHJpbmdzXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChyZXF1aXJlKCcuL19pb2JqZWN0JykgIT0gT2JqZWN0IHx8ICFyZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoYXJyYXlKb2luKSksICdBcnJheScsIHtcbiAgam9pbjogZnVuY3Rpb24gam9pbihzZXBhcmF0b3IpIHtcbiAgICByZXR1cm4gYXJyYXlKb2luLmNhbGwodG9JT2JqZWN0KHRoaXMpLCBzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCA/ICcsJyA6IHNlcGFyYXRvcik7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgJG5hdGl2ZSA9IFtdLmxhc3RJbmRleE9mO1xudmFyIE5FR0FUSVZFX1pFUk8gPSAhISRuYXRpdmUgJiYgMSAvIFsxXS5sYXN0SW5kZXhPZigxLCAtMCkgPCAwO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChORUdBVElWRV9aRVJPIHx8ICFyZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoJG5hdGl2ZSkpLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMy4xNCAvIDE1LjQuNC4xNSBBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2Yoc2VhcmNoRWxlbWVudCBbLCBmcm9tSW5kZXhdKVxuICBsYXN0SW5kZXhPZjogZnVuY3Rpb24gbGFzdEluZGV4T2Yoc2VhcmNoRWxlbWVudCAvKiAsIGZyb21JbmRleCA9IEBbKi0xXSAqLykge1xuICAgIC8vIGNvbnZlcnQgLTAgdG8gKzBcbiAgICBpZiAoTkVHQVRJVkVfWkVSTykgcmV0dXJuICRuYXRpdmUuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCAwO1xuICAgIHZhciBPID0gdG9JT2JqZWN0KHRoaXMpO1xuICAgIHZhciBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgdmFyIGluZGV4ID0gbGVuZ3RoIC0gMTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIGluZGV4ID0gTWF0aC5taW4oaW5kZXgsIHRvSW50ZWdlcihhcmd1bWVudHNbMV0pKTtcbiAgICBpZiAoaW5kZXggPCAwKSBpbmRleCA9IGxlbmd0aCArIGluZGV4O1xuICAgIGZvciAoO2luZGV4ID49IDA7IGluZGV4LS0pIGlmIChpbmRleCBpbiBPKSBpZiAoT1tpbmRleF0gPT09IHNlYXJjaEVsZW1lbnQpIHJldHVybiBpbmRleCB8fCAwO1xuICAgIHJldHVybiAtMTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRtYXAgPSByZXF1aXJlKCcuL19hcnJheS1tZXRob2RzJykoMSk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKShbXS5tYXAsIHRydWUpLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMy4xNSAvIDE1LjQuNC4xOSBBcnJheS5wcm90b3R5cGUubWFwKGNhbGxiYWNrZm4gWywgdGhpc0FyZ10pXG4gIG1hcDogZnVuY3Rpb24gbWFwKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgcmV0dXJuICRtYXAodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzWzFdKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fY3JlYXRlLXByb3BlcnR5Jyk7XG5cbi8vIFdlYktpdCBBcnJheS5vZiBpc24ndCBnZW5lcmljXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBGKCkgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiAhKEFycmF5Lm9mLmNhbGwoRikgaW5zdGFuY2VvZiBGKTtcbn0pLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMi4zIEFycmF5Lm9mKCAuLi5pdGVtcylcbiAgb2Y6IGZ1bmN0aW9uIG9mKC8qIC4uLmFyZ3MgKi8pIHtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBhTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgcmVzdWx0ID0gbmV3ICh0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nID8gdGhpcyA6IEFycmF5KShhTGVuKTtcbiAgICB3aGlsZSAoYUxlbiA+IGluZGV4KSBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGluZGV4LCBhcmd1bWVudHNbaW5kZXgrK10pO1xuICAgIHJlc3VsdC5sZW5ndGggPSBhTGVuO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkcmVkdWNlID0gcmVxdWlyZSgnLi9fYXJyYXktcmVkdWNlJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKShbXS5yZWR1Y2VSaWdodCwgdHJ1ZSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4zLjE5IC8gMTUuNC40LjIyIEFycmF5LnByb3RvdHlwZS5yZWR1Y2VSaWdodChjYWxsYmFja2ZuIFssIGluaXRpYWxWYWx1ZV0pXG4gIHJlZHVjZVJpZ2h0OiBmdW5jdGlvbiByZWR1Y2VSaWdodChjYWxsYmFja2ZuIC8qICwgaW5pdGlhbFZhbHVlICovKSB7XG4gICAgcmV0dXJuICRyZWR1Y2UodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCwgYXJndW1lbnRzWzFdLCB0cnVlKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRyZWR1Y2UgPSByZXF1aXJlKCcuL19hcnJheS1yZWR1Y2UnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKFtdLnJlZHVjZSwgdHJ1ZSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4zLjE4IC8gMTUuNC40LjIxIEFycmF5LnByb3RvdHlwZS5yZWR1Y2UoY2FsbGJhY2tmbiBbLCBpbml0aWFsVmFsdWVdKVxuICByZWR1Y2U6IGZ1bmN0aW9uIHJlZHVjZShjYWxsYmFja2ZuIC8qICwgaW5pdGlhbFZhbHVlICovKSB7XG4gICAgcmV0dXJuICRyZWR1Y2UodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCwgYXJndW1lbnRzWzFdLCBmYWxzZSk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBodG1sID0gcmVxdWlyZSgnLi9faHRtbCcpO1xudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4vX3RvLWFic29sdXRlLWluZGV4Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBhcnJheVNsaWNlID0gW10uc2xpY2U7XG5cbi8vIGZhbGxiYWNrIGZvciBub3QgYXJyYXktbGlrZSBFUzMgc3RyaW5ncyBhbmQgRE9NIG9iamVjdHNcbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIGlmIChodG1sKSBhcnJheVNsaWNlLmNhbGwoaHRtbCk7XG59KSwgJ0FycmF5Jywge1xuICBzbGljZTogZnVuY3Rpb24gc2xpY2UoYmVnaW4sIGVuZCkge1xuICAgIHZhciBsZW4gPSB0b0xlbmd0aCh0aGlzLmxlbmd0aCk7XG4gICAgdmFyIGtsYXNzID0gY29mKHRoaXMpO1xuICAgIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogZW5kO1xuICAgIGlmIChrbGFzcyA9PSAnQXJyYXknKSByZXR1cm4gYXJyYXlTbGljZS5jYWxsKHRoaXMsIGJlZ2luLCBlbmQpO1xuICAgIHZhciBzdGFydCA9IHRvQWJzb2x1dGVJbmRleChiZWdpbiwgbGVuKTtcbiAgICB2YXIgdXBUbyA9IHRvQWJzb2x1dGVJbmRleChlbmQsIGxlbik7XG4gICAgdmFyIHNpemUgPSB0b0xlbmd0aCh1cFRvIC0gc3RhcnQpO1xuICAgIHZhciBjbG9uZWQgPSBuZXcgQXJyYXkoc2l6ZSk7XG4gICAgdmFyIGkgPSAwO1xuICAgIGZvciAoOyBpIDwgc2l6ZTsgaSsrKSBjbG9uZWRbaV0gPSBrbGFzcyA9PSAnU3RyaW5nJ1xuICAgICAgPyB0aGlzLmNoYXJBdChzdGFydCArIGkpXG4gICAgICA6IHRoaXNbc3RhcnQgKyBpXTtcbiAgICByZXR1cm4gY2xvbmVkO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJHNvbWUgPSByZXF1aXJlKCcuL19hcnJheS1tZXRob2RzJykoMyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKShbXS5zb21lLCB0cnVlKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuMjMgLyAxNS40LjQuMTcgQXJyYXkucHJvdG90eXBlLnNvbWUoY2FsbGJhY2tmbiBbLCB0aGlzQXJnXSlcbiAgc29tZTogZnVuY3Rpb24gc29tZShjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHJldHVybiAkc29tZSh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHNbMV0pO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyICRzb3J0ID0gW10uc29ydDtcbnZhciB0ZXN0ID0gWzEsIDIsIDNdO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIElFOC1cbiAgdGVzdC5zb3J0KHVuZGVmaW5lZCk7XG59KSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBWOCBidWdcbiAgdGVzdC5zb3J0KG51bGwpO1xuICAvLyBPbGQgV2ViS2l0XG59KSB8fCAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKCRzb3J0KSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4zLjI1IEFycmF5LnByb3RvdHlwZS5zb3J0KGNvbXBhcmVmbilcbiAgc29ydDogZnVuY3Rpb24gc29ydChjb21wYXJlZm4pIHtcbiAgICByZXR1cm4gY29tcGFyZWZuID09PSB1bmRlZmluZWRcbiAgICAgID8gJHNvcnQuY2FsbCh0b09iamVjdCh0aGlzKSlcbiAgICAgIDogJHNvcnQuY2FsbCh0b09iamVjdCh0aGlzKSwgYUZ1bmN0aW9uKGNvbXBhcmVmbikpO1xuICB9XG59KTtcbiIsInJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoJ0FycmF5Jyk7XG4iLCIvLyAyMC4zLjMuMSAvIDE1LjkuNC40IERhdGUubm93KClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnRGF0ZScsIHsgbm93OiBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTsgfSB9KTtcbiIsIi8vIDIwLjMuNC4zNiAvIDE1LjkuNS40MyBEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZygpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHRvSVNPU3RyaW5nID0gcmVxdWlyZSgnLi9fZGF0ZS10by1pc28tc3RyaW5nJyk7XG5cbi8vIFBoYW50b21KUyAvIG9sZCBXZWJLaXQgaGFzIGEgYnJva2VuIGltcGxlbWVudGF0aW9uc1xuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcgIT09IHRvSVNPU3RyaW5nKSwgJ0RhdGUnLCB7XG4gIHRvSVNPU3RyaW5nOiB0b0lTT1N0cmluZ1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG5ldyBEYXRlKE5hTikudG9KU09OKCkgIT09IG51bGxcbiAgICB8fCBEYXRlLnByb3RvdHlwZS50b0pTT04uY2FsbCh7IHRvSVNPU3RyaW5nOiBmdW5jdGlvbiAoKSB7IHJldHVybiAxOyB9IH0pICE9PSAxO1xufSksICdEYXRlJywge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgdG9KU09OOiBmdW5jdGlvbiB0b0pTT04oa2V5KSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgICB2YXIgcHYgPSB0b1ByaW1pdGl2ZShPKTtcbiAgICByZXR1cm4gdHlwZW9mIHB2ID09ICdudW1iZXInICYmICFpc0Zpbml0ZShwdikgPyBudWxsIDogTy50b0lTT1N0cmluZygpO1xuICB9XG59KTtcbiIsInZhciBUT19QUklNSVRJVkUgPSByZXF1aXJlKCcuL193a3MnKSgndG9QcmltaXRpdmUnKTtcbnZhciBwcm90byA9IERhdGUucHJvdG90eXBlO1xuXG5pZiAoIShUT19QUklNSVRJVkUgaW4gcHJvdG8pKSByZXF1aXJlKCcuL19oaWRlJykocHJvdG8sIFRPX1BSSU1JVElWRSwgcmVxdWlyZSgnLi9fZGF0ZS10by1wcmltaXRpdmUnKSk7XG4iLCJ2YXIgRGF0ZVByb3RvID0gRGF0ZS5wcm90b3R5cGU7XG52YXIgSU5WQUxJRF9EQVRFID0gJ0ludmFsaWQgRGF0ZSc7XG52YXIgVE9fU1RSSU5HID0gJ3RvU3RyaW5nJztcbnZhciAkdG9TdHJpbmcgPSBEYXRlUHJvdG9bVE9fU1RSSU5HXTtcbnZhciBnZXRUaW1lID0gRGF0ZVByb3RvLmdldFRpbWU7XG5pZiAobmV3IERhdGUoTmFOKSArICcnICE9IElOVkFMSURfREFURSkge1xuICByZXF1aXJlKCcuL19yZWRlZmluZScpKERhdGVQcm90bywgVE9fU1RSSU5HLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICB2YXIgdmFsdWUgPSBnZXRUaW1lLmNhbGwodGhpcyk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgPyAkdG9TdHJpbmcuY2FsbCh0aGlzKSA6IElOVkFMSURfREFURTtcbiAgfSk7XG59XG4iLCIvLyAxOS4yLjMuMiAvIDE1LjMuNC41IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kKHRoaXNBcmcsIGFyZ3MuLi4pXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCwgJ0Z1bmN0aW9uJywgeyBiaW5kOiByZXF1aXJlKCcuL19iaW5kJykgfSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcbnZhciBIQVNfSU5TVEFOQ0UgPSByZXF1aXJlKCcuL193a3MnKSgnaGFzSW5zdGFuY2UnKTtcbnZhciBGdW5jdGlvblByb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuLy8gMTkuMi4zLjYgRnVuY3Rpb24ucHJvdG90eXBlW0BAaGFzSW5zdGFuY2VdKFYpXG5pZiAoIShIQVNfSU5TVEFOQ0UgaW4gRnVuY3Rpb25Qcm90bykpIHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmYoRnVuY3Rpb25Qcm90bywgSEFTX0lOU1RBTkNFLCB7IHZhbHVlOiBmdW5jdGlvbiAoTykge1xuICBpZiAodHlwZW9mIHRoaXMgIT0gJ2Z1bmN0aW9uJyB8fCAhaXNPYmplY3QoTykpIHJldHVybiBmYWxzZTtcbiAgaWYgKCFpc09iamVjdCh0aGlzLnByb3RvdHlwZSkpIHJldHVybiBPIGluc3RhbmNlb2YgdGhpcztcbiAgLy8gZm9yIGVudmlyb25tZW50IHcvbyBuYXRpdmUgYEBAaGFzSW5zdGFuY2VgIGxvZ2ljIGVub3VnaCBgaW5zdGFuY2VvZmAsIGJ1dCBhZGQgdGhpczpcbiAgd2hpbGUgKE8gPSBnZXRQcm90b3R5cGVPZihPKSkgaWYgKHRoaXMucHJvdG90eXBlID09PSBPKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGZhbHNlO1xufSB9KTtcbiIsInZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG52YXIgRlByb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlO1xudmFyIG5hbWVSRSA9IC9eXFxzKmZ1bmN0aW9uIChbXiAoXSopLztcbnZhciBOQU1FID0gJ25hbWUnO1xuXG4vLyAxOS4yLjQuMiBuYW1lXG5OQU1FIGluIEZQcm90byB8fCByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmIGRQKEZQcm90bywgTkFNRSwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKCcnICsgdGhpcykubWF0Y2gobmFtZVJFKVsxXTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBzdHJvbmcgPSByZXF1aXJlKCcuL19jb2xsZWN0aW9uLXN0cm9uZycpO1xudmFyIHZhbGlkYXRlID0gcmVxdWlyZSgnLi9fdmFsaWRhdGUtY29sbGVjdGlvbicpO1xudmFyIE1BUCA9ICdNYXAnO1xuXG4vLyAyMy4xIE1hcCBPYmplY3RzXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24nKShNQVAsIGZ1bmN0aW9uIChnZXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIE1hcCgpIHsgcmV0dXJuIGdldCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7IH07XG59LCB7XG4gIC8vIDIzLjEuMy42IE1hcC5wcm90b3R5cGUuZ2V0KGtleSlcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgdmFyIGVudHJ5ID0gc3Ryb25nLmdldEVudHJ5KHZhbGlkYXRlKHRoaXMsIE1BUCksIGtleSk7XG4gICAgcmV0dXJuIGVudHJ5ICYmIGVudHJ5LnY7XG4gIH0sXG4gIC8vIDIzLjEuMy45IE1hcC5wcm90b3R5cGUuc2V0KGtleSwgdmFsdWUpXG4gIHNldDogZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gc3Ryb25nLmRlZih2YWxpZGF0ZSh0aGlzLCBNQVApLCBrZXkgPT09IDAgPyAwIDoga2V5LCB2YWx1ZSk7XG4gIH1cbn0sIHN0cm9uZywgdHJ1ZSk7XG4iLCIvLyAyMC4yLjIuMyBNYXRoLmFjb3NoKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGxvZzFwID0gcmVxdWlyZSgnLi9fbWF0aC1sb2cxcCcpO1xudmFyIHNxcnQgPSBNYXRoLnNxcnQ7XG52YXIgJGFjb3NoID0gTWF0aC5hY29zaDtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhKCRhY29zaFxuICAvLyBWOCBidWc6IGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zNTA5XG4gICYmIE1hdGguZmxvb3IoJGFjb3NoKE51bWJlci5NQVhfVkFMVUUpKSA9PSA3MTBcbiAgLy8gVG9yIEJyb3dzZXIgYnVnOiBNYXRoLmFjb3NoKEluZmluaXR5KSAtPiBOYU5cbiAgJiYgJGFjb3NoKEluZmluaXR5KSA9PSBJbmZpbml0eVxuKSwgJ01hdGgnLCB7XG4gIGFjb3NoOiBmdW5jdGlvbiBhY29zaCh4KSB7XG4gICAgcmV0dXJuICh4ID0gK3gpIDwgMSA/IE5hTiA6IHggPiA5NDkwNjI2NS42MjQyNTE1NlxuICAgICAgPyBNYXRoLmxvZyh4KSArIE1hdGguTE4yXG4gICAgICA6IGxvZzFwKHggLSAxICsgc3FydCh4IC0gMSkgKiBzcXJ0KHggKyAxKSk7XG4gIH1cbn0pO1xuIiwiLy8gMjAuMi4yLjUgTWF0aC5hc2luaCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkYXNpbmggPSBNYXRoLmFzaW5oO1xuXG5mdW5jdGlvbiBhc2luaCh4KSB7XG4gIHJldHVybiAhaXNGaW5pdGUoeCA9ICt4KSB8fCB4ID09IDAgPyB4IDogeCA8IDAgPyAtYXNpbmgoLXgpIDogTWF0aC5sb2coeCArIE1hdGguc3FydCh4ICogeCArIDEpKTtcbn1cblxuLy8gVG9yIEJyb3dzZXIgYnVnOiBNYXRoLmFzaW5oKDApIC0+IC0wXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICEoJGFzaW5oICYmIDEgLyAkYXNpbmgoMCkgPiAwKSwgJ01hdGgnLCB7IGFzaW5oOiBhc2luaCB9KTtcbiIsIi8vIDIwLjIuMi43IE1hdGguYXRhbmgoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJGF0YW5oID0gTWF0aC5hdGFuaDtcblxuLy8gVG9yIEJyb3dzZXIgYnVnOiBNYXRoLmF0YW5oKC0wKSAtPiAwXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICEoJGF0YW5oICYmIDEgLyAkYXRhbmgoLTApIDwgMCksICdNYXRoJywge1xuICBhdGFuaDogZnVuY3Rpb24gYXRhbmgoeCkge1xuICAgIHJldHVybiAoeCA9ICt4KSA9PSAwID8geCA6IE1hdGgubG9nKCgxICsgeCkgLyAoMSAtIHgpKSAvIDI7XG4gIH1cbn0pO1xuIiwiLy8gMjAuMi4yLjkgTWF0aC5jYnJ0KHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHNpZ24gPSByZXF1aXJlKCcuL19tYXRoLXNpZ24nKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBjYnJ0OiBmdW5jdGlvbiBjYnJ0KHgpIHtcbiAgICByZXR1cm4gc2lnbih4ID0gK3gpICogTWF0aC5wb3coTWF0aC5hYnMoeCksIDEgLyAzKTtcbiAgfVxufSk7XG4iLCIvLyAyMC4yLjIuMTEgTWF0aC5jbHozMih4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBjbHozMjogZnVuY3Rpb24gY2x6MzIoeCkge1xuICAgIHJldHVybiAoeCA+Pj49IDApID8gMzEgLSBNYXRoLmZsb29yKE1hdGgubG9nKHggKyAwLjUpICogTWF0aC5MT0cyRSkgOiAzMjtcbiAgfVxufSk7XG4iLCIvLyAyMC4yLjIuMTIgTWF0aC5jb3NoKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGV4cCA9IE1hdGguZXhwO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGNvc2g6IGZ1bmN0aW9uIGNvc2goeCkge1xuICAgIHJldHVybiAoZXhwKHggPSAreCkgKyBleHAoLXgpKSAvIDI7XG4gIH1cbn0pO1xuIiwiLy8gMjAuMi4yLjE0IE1hdGguZXhwbTEoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJGV4cG0xID0gcmVxdWlyZSgnLi9fbWF0aC1leHBtMScpO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICgkZXhwbTEgIT0gTWF0aC5leHBtMSksICdNYXRoJywgeyBleHBtMTogJGV4cG0xIH0pO1xuIiwiLy8gMjAuMi4yLjE2IE1hdGguZnJvdW5kKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7IGZyb3VuZDogcmVxdWlyZSgnLi9fbWF0aC1mcm91bmQnKSB9KTtcbiIsIi8vIDIwLjIuMi4xNyBNYXRoLmh5cG90KFt2YWx1ZTFbLCB2YWx1ZTJbLCDigKYgXV1dKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBhYnMgPSBNYXRoLmFicztcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBoeXBvdDogZnVuY3Rpb24gaHlwb3QodmFsdWUxLCB2YWx1ZTIpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHZhciBzdW0gPSAwO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIGxhcmcgPSAwO1xuICAgIHZhciBhcmcsIGRpdjtcbiAgICB3aGlsZSAoaSA8IGFMZW4pIHtcbiAgICAgIGFyZyA9IGFicyhhcmd1bWVudHNbaSsrXSk7XG4gICAgICBpZiAobGFyZyA8IGFyZykge1xuICAgICAgICBkaXYgPSBsYXJnIC8gYXJnO1xuICAgICAgICBzdW0gPSBzdW0gKiBkaXYgKiBkaXYgKyAxO1xuICAgICAgICBsYXJnID0gYXJnO1xuICAgICAgfSBlbHNlIGlmIChhcmcgPiAwKSB7XG4gICAgICAgIGRpdiA9IGFyZyAvIGxhcmc7XG4gICAgICAgIHN1bSArPSBkaXYgKiBkaXY7XG4gICAgICB9IGVsc2Ugc3VtICs9IGFyZztcbiAgICB9XG4gICAgcmV0dXJuIGxhcmcgPT09IEluZmluaXR5ID8gSW5maW5pdHkgOiBsYXJnICogTWF0aC5zcXJ0KHN1bSk7XG4gIH1cbn0pO1xuIiwiLy8gMjAuMi4yLjE4IE1hdGguaW11bCh4LCB5KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkaW11bCA9IE1hdGguaW11bDtcblxuLy8gc29tZSBXZWJLaXQgdmVyc2lvbnMgZmFpbHMgd2l0aCBiaWcgbnVtYmVycywgc29tZSBoYXMgd3JvbmcgYXJpdHlcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAkaW11bCgweGZmZmZmZmZmLCA1KSAhPSAtNSB8fCAkaW11bC5sZW5ndGggIT0gMjtcbn0pLCAnTWF0aCcsIHtcbiAgaW11bDogZnVuY3Rpb24gaW11bCh4LCB5KSB7XG4gICAgdmFyIFVJTlQxNiA9IDB4ZmZmZjtcbiAgICB2YXIgeG4gPSAreDtcbiAgICB2YXIgeW4gPSAreTtcbiAgICB2YXIgeGwgPSBVSU5UMTYgJiB4bjtcbiAgICB2YXIgeWwgPSBVSU5UMTYgJiB5bjtcbiAgICByZXR1cm4gMCB8IHhsICogeWwgKyAoKFVJTlQxNiAmIHhuID4+PiAxNikgKiB5bCArIHhsICogKFVJTlQxNiAmIHluID4+PiAxNikgPDwgMTYgPj4+IDApO1xuICB9XG59KTtcbiIsIi8vIDIwLjIuMi4yMSBNYXRoLmxvZzEwKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGxvZzEwOiBmdW5jdGlvbiBsb2cxMCh4KSB7XG4gICAgcmV0dXJuIE1hdGgubG9nKHgpICogTWF0aC5MT0cxMEU7XG4gIH1cbn0pO1xuIiwiLy8gMjAuMi4yLjIwIE1hdGgubG9nMXAoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHsgbG9nMXA6IHJlcXVpcmUoJy4vX21hdGgtbG9nMXAnKSB9KTtcbiIsIi8vIDIwLjIuMi4yMiBNYXRoLmxvZzIoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgbG9nMjogZnVuY3Rpb24gbG9nMih4KSB7XG4gICAgcmV0dXJuIE1hdGgubG9nKHgpIC8gTWF0aC5MTjI7XG4gIH1cbn0pO1xuIiwiLy8gMjAuMi4yLjI4IE1hdGguc2lnbih4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywgeyBzaWduOiByZXF1aXJlKCcuL19tYXRoLXNpZ24nKSB9KTtcbiIsIi8vIDIwLjIuMi4zMCBNYXRoLnNpbmgoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgZXhwbTEgPSByZXF1aXJlKCcuL19tYXRoLWV4cG0xJyk7XG52YXIgZXhwID0gTWF0aC5leHA7XG5cbi8vIFY4IG5lYXIgQ2hyb21pdW0gMzggaGFzIGEgcHJvYmxlbSB3aXRoIHZlcnkgc21hbGwgbnVtYmVyc1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICFNYXRoLnNpbmgoLTJlLTE3KSAhPSAtMmUtMTc7XG59KSwgJ01hdGgnLCB7XG4gIHNpbmg6IGZ1bmN0aW9uIHNpbmgoeCkge1xuICAgIHJldHVybiBNYXRoLmFicyh4ID0gK3gpIDwgMVxuICAgICAgPyAoZXhwbTEoeCkgLSBleHBtMSgteCkpIC8gMlxuICAgICAgOiAoZXhwKHggLSAxKSAtIGV4cCgteCAtIDEpKSAqIChNYXRoLkUgLyAyKTtcbiAgfVxufSk7XG4iLCIvLyAyMC4yLjIuMzMgTWF0aC50YW5oKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGV4cG0xID0gcmVxdWlyZSgnLi9fbWF0aC1leHBtMScpO1xudmFyIGV4cCA9IE1hdGguZXhwO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIHRhbmg6IGZ1bmN0aW9uIHRhbmgoeCkge1xuICAgIHZhciBhID0gZXhwbTEoeCA9ICt4KTtcbiAgICB2YXIgYiA9IGV4cG0xKC14KTtcbiAgICByZXR1cm4gYSA9PSBJbmZpbml0eSA/IDEgOiBiID09IEluZmluaXR5ID8gLTEgOiAoYSAtIGIpIC8gKGV4cCh4KSArIGV4cCgteCkpO1xuICB9XG59KTtcbiIsIi8vIDIwLjIuMi4zNCBNYXRoLnRydW5jKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIHRydW5jOiBmdW5jdGlvbiB0cnVuYyhpdCkge1xuICAgIHJldHVybiAoaXQgPiAwID8gTWF0aC5mbG9vciA6IE1hdGguY2VpbCkoaXQpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbnZhciBpbmhlcml0SWZSZXF1aXJlZCA9IHJlcXVpcmUoJy4vX2luaGVyaXQtaWYtcmVxdWlyZWQnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciBnT1BOID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4nKS5mO1xudmFyIGdPUEQgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpLmY7XG52YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyICR0cmltID0gcmVxdWlyZSgnLi9fc3RyaW5nLXRyaW0nKS50cmltO1xudmFyIE5VTUJFUiA9ICdOdW1iZXInO1xudmFyICROdW1iZXIgPSBnbG9iYWxbTlVNQkVSXTtcbnZhciBCYXNlID0gJE51bWJlcjtcbnZhciBwcm90byA9ICROdW1iZXIucHJvdG90eXBlO1xuLy8gT3BlcmEgfjEyIGhhcyBicm9rZW4gT2JqZWN0I3RvU3RyaW5nXG52YXIgQlJPS0VOX0NPRiA9IGNvZihyZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJykocHJvdG8pKSA9PSBOVU1CRVI7XG52YXIgVFJJTSA9ICd0cmltJyBpbiBTdHJpbmcucHJvdG90eXBlO1xuXG4vLyA3LjEuMyBUb051bWJlcihhcmd1bWVudClcbnZhciB0b051bWJlciA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICB2YXIgaXQgPSB0b1ByaW1pdGl2ZShhcmd1bWVudCwgZmFsc2UpO1xuICBpZiAodHlwZW9mIGl0ID09ICdzdHJpbmcnICYmIGl0Lmxlbmd0aCA+IDIpIHtcbiAgICBpdCA9IFRSSU0gPyBpdC50cmltKCkgOiAkdHJpbShpdCwgMyk7XG4gICAgdmFyIGZpcnN0ID0gaXQuY2hhckNvZGVBdCgwKTtcbiAgICB2YXIgdGhpcmQsIHJhZGl4LCBtYXhDb2RlO1xuICAgIGlmIChmaXJzdCA9PT0gNDMgfHwgZmlyc3QgPT09IDQ1KSB7XG4gICAgICB0aGlyZCA9IGl0LmNoYXJDb2RlQXQoMik7XG4gICAgICBpZiAodGhpcmQgPT09IDg4IHx8IHRoaXJkID09PSAxMjApIHJldHVybiBOYU47IC8vIE51bWJlcignKzB4MScpIHNob3VsZCBiZSBOYU4sIG9sZCBWOCBmaXhcbiAgICB9IGVsc2UgaWYgKGZpcnN0ID09PSA0OCkge1xuICAgICAgc3dpdGNoIChpdC5jaGFyQ29kZUF0KDEpKSB7XG4gICAgICAgIGNhc2UgNjY6IGNhc2UgOTg6IHJhZGl4ID0gMjsgbWF4Q29kZSA9IDQ5OyBicmVhazsgLy8gZmFzdCBlcXVhbCAvXjBiWzAxXSskL2lcbiAgICAgICAgY2FzZSA3OTogY2FzZSAxMTE6IHJhZGl4ID0gODsgbWF4Q29kZSA9IDU1OyBicmVhazsgLy8gZmFzdCBlcXVhbCAvXjBvWzAtN10rJC9pXG4gICAgICAgIGRlZmF1bHQ6IHJldHVybiAraXQ7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBkaWdpdHMgPSBpdC5zbGljZSgyKSwgaSA9IDAsIGwgPSBkaWdpdHMubGVuZ3RoLCBjb2RlOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGNvZGUgPSBkaWdpdHMuY2hhckNvZGVBdChpKTtcbiAgICAgICAgLy8gcGFyc2VJbnQgcGFyc2VzIGEgc3RyaW5nIHRvIGEgZmlyc3QgdW5hdmFpbGFibGUgc3ltYm9sXG4gICAgICAgIC8vIGJ1dCBUb051bWJlciBzaG91bGQgcmV0dXJuIE5hTiBpZiBhIHN0cmluZyBjb250YWlucyB1bmF2YWlsYWJsZSBzeW1ib2xzXG4gICAgICAgIGlmIChjb2RlIDwgNDggfHwgY29kZSA+IG1heENvZGUpIHJldHVybiBOYU47XG4gICAgICB9IHJldHVybiBwYXJzZUludChkaWdpdHMsIHJhZGl4KTtcbiAgICB9XG4gIH0gcmV0dXJuICtpdDtcbn07XG5cbmlmICghJE51bWJlcignIDBvMScpIHx8ICEkTnVtYmVyKCcwYjEnKSB8fCAkTnVtYmVyKCcrMHgxJykpIHtcbiAgJE51bWJlciA9IGZ1bmN0aW9uIE51bWJlcih2YWx1ZSkge1xuICAgIHZhciBpdCA9IGFyZ3VtZW50cy5sZW5ndGggPCAxID8gMCA6IHZhbHVlO1xuICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICByZXR1cm4gdGhhdCBpbnN0YW5jZW9mICROdW1iZXJcbiAgICAgIC8vIGNoZWNrIG9uIDEuLmNvbnN0cnVjdG9yKGZvbykgY2FzZVxuICAgICAgJiYgKEJST0tFTl9DT0YgPyBmYWlscyhmdW5jdGlvbiAoKSB7IHByb3RvLnZhbHVlT2YuY2FsbCh0aGF0KTsgfSkgOiBjb2YodGhhdCkgIT0gTlVNQkVSKVxuICAgICAgICA/IGluaGVyaXRJZlJlcXVpcmVkKG5ldyBCYXNlKHRvTnVtYmVyKGl0KSksIHRoYXQsICROdW1iZXIpIDogdG9OdW1iZXIoaXQpO1xuICB9O1xuICBmb3IgKHZhciBrZXlzID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGdPUE4oQmFzZSkgOiAoXG4gICAgLy8gRVMzOlxuICAgICdNQVhfVkFMVUUsTUlOX1ZBTFVFLE5hTixORUdBVElWRV9JTkZJTklUWSxQT1NJVElWRV9JTkZJTklUWSwnICtcbiAgICAvLyBFUzYgKGluIGNhc2UsIGlmIG1vZHVsZXMgd2l0aCBFUzYgTnVtYmVyIHN0YXRpY3MgcmVxdWlyZWQgYmVmb3JlKTpcbiAgICAnRVBTSUxPTixpc0Zpbml0ZSxpc0ludGVnZXIsaXNOYU4saXNTYWZlSW50ZWdlcixNQVhfU0FGRV9JTlRFR0VSLCcgK1xuICAgICdNSU5fU0FGRV9JTlRFR0VSLHBhcnNlRmxvYXQscGFyc2VJbnQsaXNJbnRlZ2VyJ1xuICApLnNwbGl0KCcsJyksIGogPSAwLCBrZXk7IGtleXMubGVuZ3RoID4gajsgaisrKSB7XG4gICAgaWYgKGhhcyhCYXNlLCBrZXkgPSBrZXlzW2pdKSAmJiAhaGFzKCROdW1iZXIsIGtleSkpIHtcbiAgICAgIGRQKCROdW1iZXIsIGtleSwgZ09QRChCYXNlLCBrZXkpKTtcbiAgICB9XG4gIH1cbiAgJE51bWJlci5wcm90b3R5cGUgPSBwcm90bztcbiAgcHJvdG8uY29uc3RydWN0b3IgPSAkTnVtYmVyO1xuICByZXF1aXJlKCcuL19yZWRlZmluZScpKGdsb2JhbCwgTlVNQkVSLCAkTnVtYmVyKTtcbn1cbiIsIi8vIDIwLjEuMi4xIE51bWJlci5FUFNJTE9OXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHsgRVBTSUxPTjogTWF0aC5wb3coMiwgLTUyKSB9KTtcbiIsIi8vIDIwLjEuMi4yIE51bWJlci5pc0Zpbml0ZShudW1iZXIpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIF9pc0Zpbml0ZSA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLmlzRmluaXRlO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHtcbiAgaXNGaW5pdGU6IGZ1bmN0aW9uIGlzRmluaXRlKGl0KSB7XG4gICAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnbnVtYmVyJyAmJiBfaXNGaW5pdGUoaXQpO1xuICB9XG59KTtcbiIsIi8vIDIwLjEuMi4zIE51bWJlci5pc0ludGVnZXIobnVtYmVyKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7IGlzSW50ZWdlcjogcmVxdWlyZSgnLi9faXMtaW50ZWdlcicpIH0pO1xuIiwiLy8gMjAuMS4yLjQgTnVtYmVyLmlzTmFOKG51bWJlcilcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywge1xuICBpc05hTjogZnVuY3Rpb24gaXNOYU4obnVtYmVyKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIHJldHVybiBudW1iZXIgIT0gbnVtYmVyO1xuICB9XG59KTtcbiIsIi8vIDIwLjEuMi41IE51bWJlci5pc1NhZmVJbnRlZ2VyKG51bWJlcilcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgaXNJbnRlZ2VyID0gcmVxdWlyZSgnLi9faXMtaW50ZWdlcicpO1xudmFyIGFicyA9IE1hdGguYWJzO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHtcbiAgaXNTYWZlSW50ZWdlcjogZnVuY3Rpb24gaXNTYWZlSW50ZWdlcihudW1iZXIpIHtcbiAgICByZXR1cm4gaXNJbnRlZ2VyKG51bWJlcikgJiYgYWJzKG51bWJlcikgPD0gMHgxZmZmZmZmZmZmZmZmZjtcbiAgfVxufSk7XG4iLCIvLyAyMC4xLjIuNiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUlxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7IE1BWF9TQUZFX0lOVEVHRVI6IDB4MWZmZmZmZmZmZmZmZmYgfSk7XG4iLCIvLyAyMC4xLjIuMTAgTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVJcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywgeyBNSU5fU0FGRV9JTlRFR0VSOiAtMHgxZmZmZmZmZmZmZmZmZiB9KTtcbiIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJHBhcnNlRmxvYXQgPSByZXF1aXJlKCcuL19wYXJzZS1mbG9hdCcpO1xuLy8gMjAuMS4yLjEyIE51bWJlci5wYXJzZUZsb2F0KHN0cmluZylcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKE51bWJlci5wYXJzZUZsb2F0ICE9ICRwYXJzZUZsb2F0KSwgJ051bWJlcicsIHsgcGFyc2VGbG9hdDogJHBhcnNlRmxvYXQgfSk7XG4iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRwYXJzZUludCA9IHJlcXVpcmUoJy4vX3BhcnNlLWludCcpO1xuLy8gMjAuMS4yLjEzIE51bWJlci5wYXJzZUludChzdHJpbmcsIHJhZGl4KVxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoTnVtYmVyLnBhcnNlSW50ICE9ICRwYXJzZUludCksICdOdW1iZXInLCB7IHBhcnNlSW50OiAkcGFyc2VJbnQgfSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciBhTnVtYmVyVmFsdWUgPSByZXF1aXJlKCcuL19hLW51bWJlci12YWx1ZScpO1xudmFyIHJlcGVhdCA9IHJlcXVpcmUoJy4vX3N0cmluZy1yZXBlYXQnKTtcbnZhciAkdG9GaXhlZCA9IDEuMC50b0ZpeGVkO1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbnZhciBkYXRhID0gWzAsIDAsIDAsIDAsIDAsIDBdO1xudmFyIEVSUk9SID0gJ051bWJlci50b0ZpeGVkOiBpbmNvcnJlY3QgaW52b2NhdGlvbiEnO1xudmFyIFpFUk8gPSAnMCc7XG5cbnZhciBtdWx0aXBseSA9IGZ1bmN0aW9uIChuLCBjKSB7XG4gIHZhciBpID0gLTE7XG4gIHZhciBjMiA9IGM7XG4gIHdoaWxlICgrK2kgPCA2KSB7XG4gICAgYzIgKz0gbiAqIGRhdGFbaV07XG4gICAgZGF0YVtpXSA9IGMyICUgMWU3O1xuICAgIGMyID0gZmxvb3IoYzIgLyAxZTcpO1xuICB9XG59O1xudmFyIGRpdmlkZSA9IGZ1bmN0aW9uIChuKSB7XG4gIHZhciBpID0gNjtcbiAgdmFyIGMgPSAwO1xuICB3aGlsZSAoLS1pID49IDApIHtcbiAgICBjICs9IGRhdGFbaV07XG4gICAgZGF0YVtpXSA9IGZsb29yKGMgLyBuKTtcbiAgICBjID0gKGMgJSBuKSAqIDFlNztcbiAgfVxufTtcbnZhciBudW1Ub1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGkgPSA2O1xuICB2YXIgcyA9ICcnO1xuICB3aGlsZSAoLS1pID49IDApIHtcbiAgICBpZiAocyAhPT0gJycgfHwgaSA9PT0gMCB8fCBkYXRhW2ldICE9PSAwKSB7XG4gICAgICB2YXIgdCA9IFN0cmluZyhkYXRhW2ldKTtcbiAgICAgIHMgPSBzID09PSAnJyA/IHQgOiBzICsgcmVwZWF0LmNhbGwoWkVSTywgNyAtIHQubGVuZ3RoKSArIHQ7XG4gICAgfVxuICB9IHJldHVybiBzO1xufTtcbnZhciBwb3cgPSBmdW5jdGlvbiAoeCwgbiwgYWNjKSB7XG4gIHJldHVybiBuID09PSAwID8gYWNjIDogbiAlIDIgPT09IDEgPyBwb3coeCwgbiAtIDEsIGFjYyAqIHgpIDogcG93KHggKiB4LCBuIC8gMiwgYWNjKTtcbn07XG52YXIgbG9nID0gZnVuY3Rpb24gKHgpIHtcbiAgdmFyIG4gPSAwO1xuICB2YXIgeDIgPSB4O1xuICB3aGlsZSAoeDIgPj0gNDA5Nikge1xuICAgIG4gKz0gMTI7XG4gICAgeDIgLz0gNDA5NjtcbiAgfVxuICB3aGlsZSAoeDIgPj0gMikge1xuICAgIG4gKz0gMTtcbiAgICB4MiAvPSAyO1xuICB9IHJldHVybiBuO1xufTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoISEkdG9GaXhlZCAmJiAoXG4gIDAuMDAwMDgudG9GaXhlZCgzKSAhPT0gJzAuMDAwJyB8fFxuICAwLjkudG9GaXhlZCgwKSAhPT0gJzEnIHx8XG4gIDEuMjU1LnRvRml4ZWQoMikgIT09ICcxLjI1JyB8fFxuICAxMDAwMDAwMDAwMDAwMDAwMTI4LjAudG9GaXhlZCgwKSAhPT0gJzEwMDAwMDAwMDAwMDAwMDAxMjgnXG4pIHx8ICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgLy8gVjggfiBBbmRyb2lkIDQuMy1cbiAgJHRvRml4ZWQuY2FsbCh7fSk7XG59KSksICdOdW1iZXInLCB7XG4gIHRvRml4ZWQ6IGZ1bmN0aW9uIHRvRml4ZWQoZnJhY3Rpb25EaWdpdHMpIHtcbiAgICB2YXIgeCA9IGFOdW1iZXJWYWx1ZSh0aGlzLCBFUlJPUik7XG4gICAgdmFyIGYgPSB0b0ludGVnZXIoZnJhY3Rpb25EaWdpdHMpO1xuICAgIHZhciBzID0gJyc7XG4gICAgdmFyIG0gPSBaRVJPO1xuICAgIHZhciBlLCB6LCBqLCBrO1xuICAgIGlmIChmIDwgMCB8fCBmID4gMjApIHRocm93IFJhbmdlRXJyb3IoRVJST1IpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICBpZiAoeCAhPSB4KSByZXR1cm4gJ05hTic7XG4gICAgaWYgKHggPD0gLTFlMjEgfHwgeCA+PSAxZTIxKSByZXR1cm4gU3RyaW5nKHgpO1xuICAgIGlmICh4IDwgMCkge1xuICAgICAgcyA9ICctJztcbiAgICAgIHggPSAteDtcbiAgICB9XG4gICAgaWYgKHggPiAxZS0yMSkge1xuICAgICAgZSA9IGxvZyh4ICogcG93KDIsIDY5LCAxKSkgLSA2OTtcbiAgICAgIHogPSBlIDwgMCA/IHggKiBwb3coMiwgLWUsIDEpIDogeCAvIHBvdygyLCBlLCAxKTtcbiAgICAgIHogKj0gMHgxMDAwMDAwMDAwMDAwMDtcbiAgICAgIGUgPSA1MiAtIGU7XG4gICAgICBpZiAoZSA+IDApIHtcbiAgICAgICAgbXVsdGlwbHkoMCwgeik7XG4gICAgICAgIGogPSBmO1xuICAgICAgICB3aGlsZSAoaiA+PSA3KSB7XG4gICAgICAgICAgbXVsdGlwbHkoMWU3LCAwKTtcbiAgICAgICAgICBqIC09IDc7XG4gICAgICAgIH1cbiAgICAgICAgbXVsdGlwbHkocG93KDEwLCBqLCAxKSwgMCk7XG4gICAgICAgIGogPSBlIC0gMTtcbiAgICAgICAgd2hpbGUgKGogPj0gMjMpIHtcbiAgICAgICAgICBkaXZpZGUoMSA8PCAyMyk7XG4gICAgICAgICAgaiAtPSAyMztcbiAgICAgICAgfVxuICAgICAgICBkaXZpZGUoMSA8PCBqKTtcbiAgICAgICAgbXVsdGlwbHkoMSwgMSk7XG4gICAgICAgIGRpdmlkZSgyKTtcbiAgICAgICAgbSA9IG51bVRvU3RyaW5nKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtdWx0aXBseSgwLCB6KTtcbiAgICAgICAgbXVsdGlwbHkoMSA8PCAtZSwgMCk7XG4gICAgICAgIG0gPSBudW1Ub1N0cmluZygpICsgcmVwZWF0LmNhbGwoWkVSTywgZik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmID4gMCkge1xuICAgICAgayA9IG0ubGVuZ3RoO1xuICAgICAgbSA9IHMgKyAoayA8PSBmID8gJzAuJyArIHJlcGVhdC5jYWxsKFpFUk8sIGYgLSBrKSArIG0gOiBtLnNsaWNlKDAsIGsgLSBmKSArICcuJyArIG0uc2xpY2UoayAtIGYpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHMgKyBtO1xuICAgIH0gcmV0dXJuIG07XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyIGFOdW1iZXJWYWx1ZSA9IHJlcXVpcmUoJy4vX2EtbnVtYmVyLXZhbHVlJyk7XG52YXIgJHRvUHJlY2lzaW9uID0gMS4wLnRvUHJlY2lzaW9uO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqICgkZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBJRTctXG4gIHJldHVybiAkdG9QcmVjaXNpb24uY2FsbCgxLCB1bmRlZmluZWQpICE9PSAnMSc7XG59KSB8fCAhJGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gVjggfiBBbmRyb2lkIDQuMy1cbiAgJHRvUHJlY2lzaW9uLmNhbGwoe30pO1xufSkpLCAnTnVtYmVyJywge1xuICB0b1ByZWNpc2lvbjogZnVuY3Rpb24gdG9QcmVjaXNpb24ocHJlY2lzaW9uKSB7XG4gICAgdmFyIHRoYXQgPSBhTnVtYmVyVmFsdWUodGhpcywgJ051bWJlciN0b1ByZWNpc2lvbjogaW5jb3JyZWN0IGludm9jYXRpb24hJyk7XG4gICAgcmV0dXJuIHByZWNpc2lvbiA9PT0gdW5kZWZpbmVkID8gJHRvUHJlY2lzaW9uLmNhbGwodGhhdCkgOiAkdG9QcmVjaXNpb24uY2FsbCh0aGF0LCBwcmVjaXNpb24pO1xuICB9XG59KTtcbiIsIi8vIDE5LjEuMy4xIE9iamVjdC5hc3NpZ24odGFyZ2V0LCBzb3VyY2UpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiwgJ09iamVjdCcsIHsgYXNzaWduOiByZXF1aXJlKCcuL19vYmplY3QtYXNzaWduJykgfSk7XG4iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuLy8gMTkuMS4yLjIgLyAxNS4yLjMuNSBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHsgY3JlYXRlOiByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJykgfSk7XG4iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuLy8gMTkuMS4yLjMgLyAxNS4yLjMuNyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKVxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSwgJ09iamVjdCcsIHsgZGVmaW5lUHJvcGVydGllczogcmVxdWlyZSgnLi9fb2JqZWN0LWRwcycpIH0pO1xuIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbi8vIDE5LjEuMi40IC8gMTUuMi4zLjYgT2JqZWN0LmRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpLCAnT2JqZWN0JywgeyBkZWZpbmVQcm9wZXJ0eTogcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZiB9KTtcbiIsIi8vIDE5LjEuMi41IE9iamVjdC5mcmVlemUoTylcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIG1ldGEgPSByZXF1aXJlKCcuL19tZXRhJykub25GcmVlemU7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnZnJlZXplJywgZnVuY3Rpb24gKCRmcmVlemUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGZyZWV6ZShpdCkge1xuICAgIHJldHVybiAkZnJlZXplICYmIGlzT2JqZWN0KGl0KSA/ICRmcmVlemUobWV0YShpdCkpIDogaXQ7XG4gIH07XG59KTtcbiIsIi8vIDE5LjEuMi42IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUClcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZjtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3InLCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaXQsIGtleSkge1xuICAgIHJldHVybiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRvSU9iamVjdChpdCksIGtleSk7XG4gIH07XG59KTtcbiIsIi8vIDE5LjEuMi43IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE8pXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ2dldE93blByb3BlcnR5TmFtZXMnLCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiByZXF1aXJlKCcuL19vYmplY3QtZ29wbi1leHQnKS5mO1xufSk7XG4iLCIvLyAxOS4xLjIuOSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTylcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyICRnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdnZXRQcm90b3R5cGVPZicsIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGdldFByb3RvdHlwZU9mKGl0KSB7XG4gICAgcmV0dXJuICRnZXRQcm90b3R5cGVPZih0b09iamVjdChpdCkpO1xuICB9O1xufSk7XG4iLCIvLyAxOS4xLjIuMTEgT2JqZWN0LmlzRXh0ZW5zaWJsZShPKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnaXNFeHRlbnNpYmxlJywgZnVuY3Rpb24gKCRpc0V4dGVuc2libGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZShpdCkge1xuICAgIHJldHVybiBpc09iamVjdChpdCkgPyAkaXNFeHRlbnNpYmxlID8gJGlzRXh0ZW5zaWJsZShpdCkgOiB0cnVlIDogZmFsc2U7XG4gIH07XG59KTtcbiIsIi8vIDE5LjEuMi4xMiBPYmplY3QuaXNGcm96ZW4oTylcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ2lzRnJvemVuJywgZnVuY3Rpb24gKCRpc0Zyb3plbikge1xuICByZXR1cm4gZnVuY3Rpb24gaXNGcm96ZW4oaXQpIHtcbiAgICByZXR1cm4gaXNPYmplY3QoaXQpID8gJGlzRnJvemVuID8gJGlzRnJvemVuKGl0KSA6IGZhbHNlIDogdHJ1ZTtcbiAgfTtcbn0pO1xuIiwiLy8gMTkuMS4yLjEzIE9iamVjdC5pc1NlYWxlZChPKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnaXNTZWFsZWQnLCBmdW5jdGlvbiAoJGlzU2VhbGVkKSB7XG4gIHJldHVybiBmdW5jdGlvbiBpc1NlYWxlZChpdCkge1xuICAgIHJldHVybiBpc09iamVjdChpdCkgPyAkaXNTZWFsZWQgPyAkaXNTZWFsZWQoaXQpIDogZmFsc2UgOiB0cnVlO1xuICB9O1xufSk7XG4iLCIvLyAxOS4xLjMuMTAgT2JqZWN0LmlzKHZhbHVlMSwgdmFsdWUyKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0JywgeyBpczogcmVxdWlyZSgnLi9fc2FtZS12YWx1ZScpIH0pO1xuIiwiLy8gMTkuMS4yLjE0IE9iamVjdC5rZXlzKE8pXG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciAka2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgna2V5cycsIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGtleXMoaXQpIHtcbiAgICByZXR1cm4gJGtleXModG9PYmplY3QoaXQpKTtcbiAgfTtcbn0pO1xuIiwiLy8gMTkuMS4yLjE1IE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyhPKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgbWV0YSA9IHJlcXVpcmUoJy4vX21ldGEnKS5vbkZyZWV6ZTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdwcmV2ZW50RXh0ZW5zaW9ucycsIGZ1bmN0aW9uICgkcHJldmVudEV4dGVuc2lvbnMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHByZXZlbnRFeHRlbnNpb25zKGl0KSB7XG4gICAgcmV0dXJuICRwcmV2ZW50RXh0ZW5zaW9ucyAmJiBpc09iamVjdChpdCkgPyAkcHJldmVudEV4dGVuc2lvbnMobWV0YShpdCkpIDogaXQ7XG4gIH07XG59KTtcbiIsIi8vIDE5LjEuMi4xNyBPYmplY3Quc2VhbChPKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgbWV0YSA9IHJlcXVpcmUoJy4vX21ldGEnKS5vbkZyZWV6ZTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdzZWFsJywgZnVuY3Rpb24gKCRzZWFsKSB7XG4gIHJldHVybiBmdW5jdGlvbiBzZWFsKGl0KSB7XG4gICAgcmV0dXJuICRzZWFsICYmIGlzT2JqZWN0KGl0KSA/ICRzZWFsKG1ldGEoaXQpKSA6IGl0O1xuICB9O1xufSk7XG4iLCIvLyAxOS4xLjMuMTkgT2JqZWN0LnNldFByb3RvdHlwZU9mKE8sIHByb3RvKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0JywgeyBzZXRQcm90b3R5cGVPZjogcmVxdWlyZSgnLi9fc2V0LXByb3RvJykuc2V0IH0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gMTkuMS4zLjYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZygpXG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKTtcbnZhciB0ZXN0ID0ge307XG50ZXN0W3JlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpXSA9ICd6JztcbmlmICh0ZXN0ICsgJycgIT0gJ1tvYmplY3Qgel0nKSB7XG4gIHJlcXVpcmUoJy4vX3JlZGVmaW5lJykoT2JqZWN0LnByb3RvdHlwZSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuICdbb2JqZWN0ICcgKyBjbGFzc29mKHRoaXMpICsgJ10nO1xuICB9LCB0cnVlKTtcbn1cbiIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJHBhcnNlRmxvYXQgPSByZXF1aXJlKCcuL19wYXJzZS1mbG9hdCcpO1xuLy8gMTguMi40IHBhcnNlRmxvYXQoc3RyaW5nKVxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LkYgKiAocGFyc2VGbG9hdCAhPSAkcGFyc2VGbG9hdCksIHsgcGFyc2VGbG9hdDogJHBhcnNlRmxvYXQgfSk7XG4iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRwYXJzZUludCA9IHJlcXVpcmUoJy4vX3BhcnNlLWludCcpO1xuLy8gMTguMi41IHBhcnNlSW50KHN0cmluZywgcmFkaXgpXG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuRiAqIChwYXJzZUludCAhPSAkcGFyc2VJbnQpLCB7IHBhcnNlSW50OiAkcGFyc2VJbnQgfSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgTElCUkFSWSA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKTtcbnZhciBmb3JPZiA9IHJlcXVpcmUoJy4vX2Zvci1vZicpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4vX3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciB0YXNrID0gcmVxdWlyZSgnLi9fdGFzaycpLnNldDtcbnZhciBtaWNyb3Rhc2sgPSByZXF1aXJlKCcuL19taWNyb3Rhc2snKSgpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi9fbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xudmFyIHBlcmZvcm0gPSByZXF1aXJlKCcuL19wZXJmb3JtJyk7XG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi9fdXNlci1hZ2VudCcpO1xudmFyIHByb21pc2VSZXNvbHZlID0gcmVxdWlyZSgnLi9fcHJvbWlzZS1yZXNvbHZlJyk7XG52YXIgUFJPTUlTRSA9ICdQcm9taXNlJztcbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciB2ZXJzaW9ucyA9IHByb2Nlc3MgJiYgcHJvY2Vzcy52ZXJzaW9ucztcbnZhciB2OCA9IHZlcnNpb25zICYmIHZlcnNpb25zLnY4IHx8ICcnO1xudmFyICRQcm9taXNlID0gZ2xvYmFsW1BST01JU0VdO1xudmFyIGlzTm9kZSA9IGNsYXNzb2YocHJvY2VzcykgPT0gJ3Byb2Nlc3MnO1xudmFyIGVtcHR5ID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xudmFyIEludGVybmFsLCBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHksIE93blByb21pc2VDYXBhYmlsaXR5LCBXcmFwcGVyO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZjtcblxudmFyIFVTRV9OQVRJVkUgPSAhIWZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICAvLyBjb3JyZWN0IHN1YmNsYXNzaW5nIHdpdGggQEBzcGVjaWVzIHN1cHBvcnRcbiAgICB2YXIgcHJvbWlzZSA9ICRQcm9taXNlLnJlc29sdmUoMSk7XG4gICAgdmFyIEZha2VQcm9taXNlID0gKHByb21pc2UuY29uc3RydWN0b3IgPSB7fSlbcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKV0gPSBmdW5jdGlvbiAoZXhlYykge1xuICAgICAgZXhlYyhlbXB0eSwgZW1wdHkpO1xuICAgIH07XG4gICAgLy8gdW5oYW5kbGVkIHJlamVjdGlvbnMgdHJhY2tpbmcgc3VwcG9ydCwgTm9kZUpTIFByb21pc2Ugd2l0aG91dCBpdCBmYWlscyBAQHNwZWNpZXMgdGVzdFxuICAgIHJldHVybiAoaXNOb2RlIHx8IHR5cGVvZiBQcm9taXNlUmVqZWN0aW9uRXZlbnQgPT0gJ2Z1bmN0aW9uJylcbiAgICAgICYmIHByb21pc2UudGhlbihlbXB0eSkgaW5zdGFuY2VvZiBGYWtlUHJvbWlzZVxuICAgICAgLy8gdjggNi42IChOb2RlIDEwIGFuZCBDaHJvbWUgNjYpIGhhdmUgYSBidWcgd2l0aCByZXNvbHZpbmcgY3VzdG9tIHRoZW5hYmxlc1xuICAgICAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9ODMwNTY1XG4gICAgICAvLyB3ZSBjYW4ndCBkZXRlY3QgaXQgc3luY2hyb25vdXNseSwgc28ganVzdCBjaGVjayB2ZXJzaW9uc1xuICAgICAgJiYgdjguaW5kZXhPZignNi42JykgIT09IDBcbiAgICAgICYmIHVzZXJBZ2VudC5pbmRleE9mKCdDaHJvbWUvNjYnKSA9PT0gLTE7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxufSgpO1xuXG4vLyBoZWxwZXJzXG52YXIgaXNUaGVuYWJsZSA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgdGhlbjtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiB0eXBlb2YgKHRoZW4gPSBpdC50aGVuKSA9PSAnZnVuY3Rpb24nID8gdGhlbiA6IGZhbHNlO1xufTtcbnZhciBub3RpZnkgPSBmdW5jdGlvbiAocHJvbWlzZSwgaXNSZWplY3QpIHtcbiAgaWYgKHByb21pc2UuX24pIHJldHVybjtcbiAgcHJvbWlzZS5fbiA9IHRydWU7XG4gIHZhciBjaGFpbiA9IHByb21pc2UuX2M7XG4gIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZhbHVlID0gcHJvbWlzZS5fdjtcbiAgICB2YXIgb2sgPSBwcm9taXNlLl9zID09IDE7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBydW4gPSBmdW5jdGlvbiAocmVhY3Rpb24pIHtcbiAgICAgIHZhciBoYW5kbGVyID0gb2sgPyByZWFjdGlvbi5vayA6IHJlYWN0aW9uLmZhaWw7XG4gICAgICB2YXIgcmVzb2x2ZSA9IHJlYWN0aW9uLnJlc29sdmU7XG4gICAgICB2YXIgcmVqZWN0ID0gcmVhY3Rpb24ucmVqZWN0O1xuICAgICAgdmFyIGRvbWFpbiA9IHJlYWN0aW9uLmRvbWFpbjtcbiAgICAgIHZhciByZXN1bHQsIHRoZW4sIGV4aXRlZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgaWYgKCFvaykge1xuICAgICAgICAgICAgaWYgKHByb21pc2UuX2ggPT0gMikgb25IYW5kbGVVbmhhbmRsZWQocHJvbWlzZSk7XG4gICAgICAgICAgICBwcm9taXNlLl9oID0gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhhbmRsZXIgPT09IHRydWUpIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGRvbWFpbikgZG9tYWluLmVudGVyKCk7XG4gICAgICAgICAgICByZXN1bHQgPSBoYW5kbGVyKHZhbHVlKTsgLy8gbWF5IHRocm93XG4gICAgICAgICAgICBpZiAoZG9tYWluKSB7XG4gICAgICAgICAgICAgIGRvbWFpbi5leGl0KCk7XG4gICAgICAgICAgICAgIGV4aXRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHJlYWN0aW9uLnByb21pc2UpIHtcbiAgICAgICAgICAgIHJlamVjdChUeXBlRXJyb3IoJ1Byb21pc2UtY2hhaW4gY3ljbGUnKSk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGVuID0gaXNUaGVuYWJsZShyZXN1bHQpKSB7XG4gICAgICAgICAgICB0aGVuLmNhbGwocmVzdWx0LCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0gZWxzZSByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSByZWplY3QodmFsdWUpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZG9tYWluICYmICFleGl0ZWQpIGRvbWFpbi5leGl0KCk7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdoaWxlIChjaGFpbi5sZW5ndGggPiBpKSBydW4oY2hhaW5baSsrXSk7IC8vIHZhcmlhYmxlIGxlbmd0aCAtIGNhbid0IHVzZSBmb3JFYWNoXG4gICAgcHJvbWlzZS5fYyA9IFtdO1xuICAgIHByb21pc2UuX24gPSBmYWxzZTtcbiAgICBpZiAoaXNSZWplY3QgJiYgIXByb21pc2UuX2gpIG9uVW5oYW5kbGVkKHByb21pc2UpO1xuICB9KTtcbn07XG52YXIgb25VbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSkge1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZhbHVlID0gcHJvbWlzZS5fdjtcbiAgICB2YXIgdW5oYW5kbGVkID0gaXNVbmhhbmRsZWQocHJvbWlzZSk7XG4gICAgdmFyIHJlc3VsdCwgaGFuZGxlciwgY29uc29sZTtcbiAgICBpZiAodW5oYW5kbGVkKSB7XG4gICAgICByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGlzTm9kZSkge1xuICAgICAgICAgIHByb2Nlc3MuZW1pdCgndW5oYW5kbGVkUmVqZWN0aW9uJywgdmFsdWUsIHByb21pc2UpO1xuICAgICAgICB9IGVsc2UgaWYgKGhhbmRsZXIgPSBnbG9iYWwub251bmhhbmRsZWRyZWplY3Rpb24pIHtcbiAgICAgICAgICBoYW5kbGVyKHsgcHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiB2YWx1ZSB9KTtcbiAgICAgICAgfSBlbHNlIGlmICgoY29uc29sZSA9IGdsb2JhbC5jb25zb2xlKSAmJiBjb25zb2xlLmVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uJywgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIC8vIEJyb3dzZXJzIHNob3VsZCBub3QgdHJpZ2dlciBgcmVqZWN0aW9uSGFuZGxlZGAgZXZlbnQgaWYgaXQgd2FzIGhhbmRsZWQgaGVyZSwgTm9kZUpTIC0gc2hvdWxkXG4gICAgICBwcm9taXNlLl9oID0gaXNOb2RlIHx8IGlzVW5oYW5kbGVkKHByb21pc2UpID8gMiA6IDE7XG4gICAgfSBwcm9taXNlLl9hID0gdW5kZWZpbmVkO1xuICAgIGlmICh1bmhhbmRsZWQgJiYgcmVzdWx0LmUpIHRocm93IHJlc3VsdC52O1xuICB9KTtcbn07XG52YXIgaXNVbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSkge1xuICByZXR1cm4gcHJvbWlzZS5faCAhPT0gMSAmJiAocHJvbWlzZS5fYSB8fCBwcm9taXNlLl9jKS5sZW5ndGggPT09IDA7XG59O1xudmFyIG9uSGFuZGxlVW5oYW5kbGVkID0gZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgdGFzay5jYWxsKGdsb2JhbCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBoYW5kbGVyO1xuICAgIGlmIChpc05vZGUpIHtcbiAgICAgIHByb2Nlc3MuZW1pdCgncmVqZWN0aW9uSGFuZGxlZCcsIHByb21pc2UpO1xuICAgIH0gZWxzZSBpZiAoaGFuZGxlciA9IGdsb2JhbC5vbnJlamVjdGlvbmhhbmRsZWQpIHtcbiAgICAgIGhhbmRsZXIoeyBwcm9taXNlOiBwcm9taXNlLCByZWFzb246IHByb21pc2UuX3YgfSk7XG4gICAgfVxuICB9KTtcbn07XG52YXIgJHJlamVjdCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICB2YXIgcHJvbWlzZSA9IHRoaXM7XG4gIGlmIChwcm9taXNlLl9kKSByZXR1cm47XG4gIHByb21pc2UuX2QgPSB0cnVlO1xuICBwcm9taXNlID0gcHJvbWlzZS5fdyB8fCBwcm9taXNlOyAvLyB1bndyYXBcbiAgcHJvbWlzZS5fdiA9IHZhbHVlO1xuICBwcm9taXNlLl9zID0gMjtcbiAgaWYgKCFwcm9taXNlLl9hKSBwcm9taXNlLl9hID0gcHJvbWlzZS5fYy5zbGljZSgpO1xuICBub3RpZnkocHJvbWlzZSwgdHJ1ZSk7XG59O1xudmFyICRyZXNvbHZlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHZhciBwcm9taXNlID0gdGhpcztcbiAgdmFyIHRoZW47XG4gIGlmIChwcm9taXNlLl9kKSByZXR1cm47XG4gIHByb21pc2UuX2QgPSB0cnVlO1xuICBwcm9taXNlID0gcHJvbWlzZS5fdyB8fCBwcm9taXNlOyAvLyB1bndyYXBcbiAgdHJ5IHtcbiAgICBpZiAocHJvbWlzZSA9PT0gdmFsdWUpIHRocm93IFR5cGVFcnJvcihcIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmXCIpO1xuICAgIGlmICh0aGVuID0gaXNUaGVuYWJsZSh2YWx1ZSkpIHtcbiAgICAgIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB3cmFwcGVyID0geyBfdzogcHJvbWlzZSwgX2Q6IGZhbHNlIH07IC8vIHdyYXBcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGVuLmNhbGwodmFsdWUsIGN0eCgkcmVzb2x2ZSwgd3JhcHBlciwgMSksIGN0eCgkcmVqZWN0LCB3cmFwcGVyLCAxKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAkcmVqZWN0LmNhbGwod3JhcHBlciwgZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9taXNlLl92ID0gdmFsdWU7XG4gICAgICBwcm9taXNlLl9zID0gMTtcbiAgICAgIG5vdGlmeShwcm9taXNlLCBmYWxzZSk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgJHJlamVjdC5jYWxsKHsgX3c6IHByb21pc2UsIF9kOiBmYWxzZSB9LCBlKTsgLy8gd3JhcFxuICB9XG59O1xuXG4vLyBjb25zdHJ1Y3RvciBwb2x5ZmlsbFxuaWYgKCFVU0VfTkFUSVZFKSB7XG4gIC8vIDI1LjQuMy4xIFByb21pc2UoZXhlY3V0b3IpXG4gICRQcm9taXNlID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcikge1xuICAgIGFuSW5zdGFuY2UodGhpcywgJFByb21pc2UsIFBST01JU0UsICdfaCcpO1xuICAgIGFGdW5jdGlvbihleGVjdXRvcik7XG4gICAgSW50ZXJuYWwuY2FsbCh0aGlzKTtcbiAgICB0cnkge1xuICAgICAgZXhlY3V0b3IoY3R4KCRyZXNvbHZlLCB0aGlzLCAxKSwgY3R4KCRyZWplY3QsIHRoaXMsIDEpKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICRyZWplY3QuY2FsbCh0aGlzLCBlcnIpO1xuICAgIH1cbiAgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIEludGVybmFsID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcikge1xuICAgIHRoaXMuX2MgPSBbXTsgICAgICAgICAgICAgLy8gPC0gYXdhaXRpbmcgcmVhY3Rpb25zXG4gICAgdGhpcy5fYSA9IHVuZGVmaW5lZDsgICAgICAvLyA8LSBjaGVja2VkIGluIGlzVW5oYW5kbGVkIHJlYWN0aW9uc1xuICAgIHRoaXMuX3MgPSAwOyAgICAgICAgICAgICAgLy8gPC0gc3RhdGVcbiAgICB0aGlzLl9kID0gZmFsc2U7ICAgICAgICAgIC8vIDwtIGRvbmVcbiAgICB0aGlzLl92ID0gdW5kZWZpbmVkOyAgICAgIC8vIDwtIHZhbHVlXG4gICAgdGhpcy5faCA9IDA7ICAgICAgICAgICAgICAvLyA8LSByZWplY3Rpb24gc3RhdGUsIDAgLSBkZWZhdWx0LCAxIC0gaGFuZGxlZCwgMiAtIHVuaGFuZGxlZFxuICAgIHRoaXMuX24gPSBmYWxzZTsgICAgICAgICAgLy8gPC0gbm90aWZ5XG4gIH07XG4gIEludGVybmFsLnByb3RvdHlwZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpKCRQcm9taXNlLnByb3RvdHlwZSwge1xuICAgIC8vIDI1LjQuNS4zIFByb21pc2UucHJvdG90eXBlLnRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpXG4gICAgdGhlbjogZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgICAgdmFyIHJlYWN0aW9uID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsICRQcm9taXNlKSk7XG4gICAgICByZWFjdGlvbi5vayA9IHR5cGVvZiBvbkZ1bGZpbGxlZCA9PSAnZnVuY3Rpb24nID8gb25GdWxmaWxsZWQgOiB0cnVlO1xuICAgICAgcmVhY3Rpb24uZmFpbCA9IHR5cGVvZiBvblJlamVjdGVkID09ICdmdW5jdGlvbicgJiYgb25SZWplY3RlZDtcbiAgICAgIHJlYWN0aW9uLmRvbWFpbiA9IGlzTm9kZSA/IHByb2Nlc3MuZG9tYWluIDogdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fYy5wdXNoKHJlYWN0aW9uKTtcbiAgICAgIGlmICh0aGlzLl9hKSB0aGlzLl9hLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYgKHRoaXMuX3MpIG5vdGlmeSh0aGlzLCBmYWxzZSk7XG4gICAgICByZXR1cm4gcmVhY3Rpb24ucHJvbWlzZTtcbiAgICB9LFxuICAgIC8vIDI1LjQuNS4xIFByb21pc2UucHJvdG90eXBlLmNhdGNoKG9uUmVqZWN0ZWQpXG4gICAgJ2NhdGNoJzogZnVuY3Rpb24gKG9uUmVqZWN0ZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnRoZW4odW5kZWZpbmVkLCBvblJlamVjdGVkKTtcbiAgICB9XG4gIH0pO1xuICBPd25Qcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcHJvbWlzZSA9IG5ldyBJbnRlcm5hbCgpO1xuICAgIHRoaXMucHJvbWlzZSA9IHByb21pc2U7XG4gICAgdGhpcy5yZXNvbHZlID0gY3R4KCRyZXNvbHZlLCBwcm9taXNlLCAxKTtcbiAgICB0aGlzLnJlamVjdCA9IGN0eCgkcmVqZWN0LCBwcm9taXNlLCAxKTtcbiAgfTtcbiAgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZiA9IG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKEMpIHtcbiAgICByZXR1cm4gQyA9PT0gJFByb21pc2UgfHwgQyA9PT0gV3JhcHBlclxuICAgICAgPyBuZXcgT3duUHJvbWlzZUNhcGFiaWxpdHkoQylcbiAgICAgIDogbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICB9O1xufVxuXG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCB7IFByb21pc2U6ICRQcm9taXNlIH0pO1xucmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKSgkUHJvbWlzZSwgUFJPTUlTRSk7XG5yZXF1aXJlKCcuL19zZXQtc3BlY2llcycpKFBST01JU0UpO1xuV3JhcHBlciA9IHJlcXVpcmUoJy4vX2NvcmUnKVtQUk9NSVNFXTtcblxuLy8gc3RhdGljc1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuNSBQcm9taXNlLnJlamVjdChyKVxuICByZWplY3Q6IGZ1bmN0aW9uIHJlamVjdChyKSB7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSh0aGlzKTtcbiAgICB2YXIgJCRyZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICAkJHJlamVjdChyKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKExJQlJBUlkgfHwgIVVTRV9OQVRJVkUpLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC42IFByb21pc2UucmVzb2x2ZSh4KVxuICByZXNvbHZlOiBmdW5jdGlvbiByZXNvbHZlKHgpIHtcbiAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoTElCUkFSWSAmJiB0aGlzID09PSBXcmFwcGVyID8gJFByb21pc2UgOiB0aGlzLCB4KTtcbiAgfVxufSk7XG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICEoVVNFX05BVElWRSAmJiByZXF1aXJlKCcuL19pdGVyLWRldGVjdCcpKGZ1bmN0aW9uIChpdGVyKSB7XG4gICRQcm9taXNlLmFsbChpdGVyKVsnY2F0Y2gnXShlbXB0eSk7XG59KSksIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjEgUHJvbWlzZS5hbGwoaXRlcmFibGUpXG4gIGFsbDogZnVuY3Rpb24gYWxsKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgdmFyIHJlc29sdmUgPSBjYXBhYmlsaXR5LnJlc29sdmU7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gMTtcbiAgICAgIGZvck9mKGl0ZXJhYmxlLCBmYWxzZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgdmFyICRpbmRleCA9IGluZGV4Kys7XG4gICAgICAgIHZhciBhbHJlYWR5Q2FsbGVkID0gZmFsc2U7XG4gICAgICAgIHZhbHVlcy5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgIHJlbWFpbmluZysrO1xuICAgICAgICBDLnJlc29sdmUocHJvbWlzZSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeUNhbGxlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlc1skaW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lKSByZWplY3QocmVzdWx0LnYpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH0sXG4gIC8vIDI1LjQuNC40IFByb21pc2UucmFjZShpdGVyYWJsZSlcbiAgcmFjZTogZnVuY3Rpb24gcmFjZShpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICBmb3JPZihpdGVyYWJsZSwgZmFsc2UsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIEMucmVzb2x2ZShwcm9taXNlKS50aGVuKGNhcGFiaWxpdHkucmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZSkgcmVqZWN0KHJlc3VsdC52KTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiIsIi8vIDI2LjEuMSBSZWZsZWN0LmFwcGx5KHRhcmdldCwgdGhpc0FyZ3VtZW50LCBhcmd1bWVudHNMaXN0KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciByQXBwbHkgPSAocmVxdWlyZSgnLi9fZ2xvYmFsJykuUmVmbGVjdCB8fCB7fSkuYXBwbHk7XG52YXIgZkFwcGx5ID0gRnVuY3Rpb24uYXBwbHk7XG4vLyBNUyBFZGdlIGFyZ3VtZW50c0xpc3QgYXJndW1lbnQgaXMgb3B0aW9uYWxcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByQXBwbHkoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbn0pLCAnUmVmbGVjdCcsIHtcbiAgYXBwbHk6IGZ1bmN0aW9uIGFwcGx5KHRhcmdldCwgdGhpc0FyZ3VtZW50LCBhcmd1bWVudHNMaXN0KSB7XG4gICAgdmFyIFQgPSBhRnVuY3Rpb24odGFyZ2V0KTtcbiAgICB2YXIgTCA9IGFuT2JqZWN0KGFyZ3VtZW50c0xpc3QpO1xuICAgIHJldHVybiByQXBwbHkgPyByQXBwbHkoVCwgdGhpc0FyZ3VtZW50LCBMKSA6IGZBcHBseS5jYWxsKFQsIHRoaXNBcmd1bWVudCwgTCk7XG4gIH1cbn0pO1xuIiwiLy8gMjYuMS4yIFJlZmxlY3QuY29uc3RydWN0KHRhcmdldCwgYXJndW1lbnRzTGlzdCBbLCBuZXdUYXJnZXRdKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4vX2JpbmQnKTtcbnZhciByQ29uc3RydWN0ID0gKHJlcXVpcmUoJy4vX2dsb2JhbCcpLlJlZmxlY3QgfHwge30pLmNvbnN0cnVjdDtcblxuLy8gTVMgRWRnZSBzdXBwb3J0cyBvbmx5IDIgYXJndW1lbnRzIGFuZCBhcmd1bWVudHNMaXN0IGFyZ3VtZW50IGlzIG9wdGlvbmFsXG4vLyBGRiBOaWdodGx5IHNldHMgdGhpcmQgYXJndW1lbnQgYXMgYG5ldy50YXJnZXRgLCBidXQgZG9lcyBub3QgY3JlYXRlIGB0aGlzYCBmcm9tIGl0XG52YXIgTkVXX1RBUkdFVF9CVUcgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEYoKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuICEockNvbnN0cnVjdChmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0sIFtdLCBGKSBpbnN0YW5jZW9mIEYpO1xufSk7XG52YXIgQVJHU19CVUcgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICByQ29uc3RydWN0KGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSk7XG59KTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoTkVXX1RBUkdFVF9CVUcgfHwgQVJHU19CVUcpLCAnUmVmbGVjdCcsIHtcbiAgY29uc3RydWN0OiBmdW5jdGlvbiBjb25zdHJ1Y3QoVGFyZ2V0LCBhcmdzIC8qICwgbmV3VGFyZ2V0ICovKSB7XG4gICAgYUZ1bmN0aW9uKFRhcmdldCk7XG4gICAgYW5PYmplY3QoYXJncyk7XG4gICAgdmFyIG5ld1RhcmdldCA9IGFyZ3VtZW50cy5sZW5ndGggPCAzID8gVGFyZ2V0IDogYUZ1bmN0aW9uKGFyZ3VtZW50c1syXSk7XG4gICAgaWYgKEFSR1NfQlVHICYmICFORVdfVEFSR0VUX0JVRykgcmV0dXJuIHJDb25zdHJ1Y3QoVGFyZ2V0LCBhcmdzLCBuZXdUYXJnZXQpO1xuICAgIGlmIChUYXJnZXQgPT0gbmV3VGFyZ2V0KSB7XG4gICAgICAvLyB3L28gYWx0ZXJlZCBuZXdUYXJnZXQsIG9wdGltaXphdGlvbiBmb3IgMC00IGFyZ3VtZW50c1xuICAgICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6IHJldHVybiBuZXcgVGFyZ2V0KCk7XG4gICAgICAgIGNhc2UgMTogcmV0dXJuIG5ldyBUYXJnZXQoYXJnc1swXSk7XG4gICAgICAgIGNhc2UgMjogcmV0dXJuIG5ldyBUYXJnZXQoYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgIGNhc2UgMzogcmV0dXJuIG5ldyBUYXJnZXQoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICAgIGNhc2UgNDogcmV0dXJuIG5ldyBUYXJnZXQoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gICAgICB9XG4gICAgICAvLyB3L28gYWx0ZXJlZCBuZXdUYXJnZXQsIGxvdCBvZiBhcmd1bWVudHMgY2FzZVxuICAgICAgdmFyICRhcmdzID0gW251bGxdO1xuICAgICAgJGFyZ3MucHVzaC5hcHBseSgkYXJncywgYXJncyk7XG4gICAgICByZXR1cm4gbmV3IChiaW5kLmFwcGx5KFRhcmdldCwgJGFyZ3MpKSgpO1xuICAgIH1cbiAgICAvLyB3aXRoIGFsdGVyZWQgbmV3VGFyZ2V0LCBub3Qgc3VwcG9ydCBidWlsdC1pbiBjb25zdHJ1Y3RvcnNcbiAgICB2YXIgcHJvdG8gPSBuZXdUYXJnZXQucHJvdG90eXBlO1xuICAgIHZhciBpbnN0YW5jZSA9IGNyZWF0ZShpc09iamVjdChwcm90bykgPyBwcm90byA6IE9iamVjdC5wcm90b3R5cGUpO1xuICAgIHZhciByZXN1bHQgPSBGdW5jdGlvbi5hcHBseS5jYWxsKFRhcmdldCwgaW5zdGFuY2UsIGFyZ3MpO1xuICAgIHJldHVybiBpc09iamVjdChyZXN1bHQpID8gcmVzdWx0IDogaW5zdGFuY2U7XG4gIH1cbn0pO1xuIiwiLy8gMjYuMS4zIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSwgYXR0cmlidXRlcylcbnZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG5cbi8vIE1TIEVkZ2UgaGFzIGJyb2tlbiBSZWZsZWN0LmRlZmluZVByb3BlcnR5IC0gdGhyb3dpbmcgaW5zdGVhZCBvZiByZXR1cm5pbmcgZmFsc2VcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICBSZWZsZWN0LmRlZmluZVByb3BlcnR5KGRQLmYoe30sIDEsIHsgdmFsdWU6IDEgfSksIDEsIHsgdmFsdWU6IDIgfSk7XG59KSwgJ1JlZmxlY3QnLCB7XG4gIGRlZmluZVByb3BlcnR5OiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCBhdHRyaWJ1dGVzKSB7XG4gICAgYW5PYmplY3QodGFyZ2V0KTtcbiAgICBwcm9wZXJ0eUtleSA9IHRvUHJpbWl0aXZlKHByb3BlcnR5S2V5LCB0cnVlKTtcbiAgICBhbk9iamVjdChhdHRyaWJ1dGVzKTtcbiAgICB0cnkge1xuICAgICAgZFAuZih0YXJnZXQsIHByb3BlcnR5S2V5LCBhdHRyaWJ1dGVzKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn0pO1xuIiwiLy8gMjYuMS40IFJlZmxlY3QuZGVsZXRlUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgZ09QRCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZjtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIGRlbGV0ZVByb3BlcnR5OiBmdW5jdGlvbiBkZWxldGVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgdmFyIGRlc2MgPSBnT1BEKGFuT2JqZWN0KHRhcmdldCksIHByb3BlcnR5S2V5KTtcbiAgICByZXR1cm4gZGVzYyAmJiAhZGVzYy5jb25maWd1cmFibGUgPyBmYWxzZSA6IGRlbGV0ZSB0YXJnZXRbcHJvcGVydHlLZXldO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIDI2LjEuNSBSZWZsZWN0LmVudW1lcmF0ZSh0YXJnZXQpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgRW51bWVyYXRlID0gZnVuY3Rpb24gKGl0ZXJhdGVkKSB7XG4gIHRoaXMuX3QgPSBhbk9iamVjdChpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4gIHZhciBrZXlzID0gdGhpcy5fayA9IFtdOyAgICAgIC8vIGtleXNcbiAgdmFyIGtleTtcbiAgZm9yIChrZXkgaW4gaXRlcmF0ZWQpIGtleXMucHVzaChrZXkpO1xufTtcbnJlcXVpcmUoJy4vX2l0ZXItY3JlYXRlJykoRW51bWVyYXRlLCAnT2JqZWN0JywgZnVuY3Rpb24gKCkge1xuICB2YXIgdGhhdCA9IHRoaXM7XG4gIHZhciBrZXlzID0gdGhhdC5faztcbiAgdmFyIGtleTtcbiAgZG8ge1xuICAgIGlmICh0aGF0Ll9pID49IGtleXMubGVuZ3RoKSByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIH0gd2hpbGUgKCEoKGtleSA9IGtleXNbdGhhdC5faSsrXSkgaW4gdGhhdC5fdCkpO1xuICByZXR1cm4geyB2YWx1ZToga2V5LCBkb25lOiBmYWxzZSB9O1xufSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgZW51bWVyYXRlOiBmdW5jdGlvbiBlbnVtZXJhdGUodGFyZ2V0KSB7XG4gICAgcmV0dXJuIG5ldyBFbnVtZXJhdGUodGFyZ2V0KTtcbiAgfVxufSk7XG4iLCIvLyAyNi4xLjcgUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSlcbnZhciBnT1BEID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgcmV0dXJuIGdPUEQuZihhbk9iamVjdCh0YXJnZXQpLCBwcm9wZXJ0eUtleSk7XG4gIH1cbn0pO1xuIiwiLy8gMjYuMS44IFJlZmxlY3QuZ2V0UHJvdG90eXBlT2YodGFyZ2V0KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBnZXRQcm90byA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIGdldFByb3RvdHlwZU9mOiBmdW5jdGlvbiBnZXRQcm90b3R5cGVPZih0YXJnZXQpIHtcbiAgICByZXR1cm4gZ2V0UHJvdG8oYW5PYmplY3QodGFyZ2V0KSk7XG4gIH1cbn0pO1xuIiwiLy8gMjYuMS42IFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcGVydHlLZXkgWywgcmVjZWl2ZXJdKVxudmFyIGdPUEQgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5cbmZ1bmN0aW9uIGdldCh0YXJnZXQsIHByb3BlcnR5S2V5IC8qICwgcmVjZWl2ZXIgKi8pIHtcbiAgdmFyIHJlY2VpdmVyID0gYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB0YXJnZXQgOiBhcmd1bWVudHNbMl07XG4gIHZhciBkZXNjLCBwcm90bztcbiAgaWYgKGFuT2JqZWN0KHRhcmdldCkgPT09IHJlY2VpdmVyKSByZXR1cm4gdGFyZ2V0W3Byb3BlcnR5S2V5XTtcbiAgaWYgKGRlc2MgPSBnT1BELmYodGFyZ2V0LCBwcm9wZXJ0eUtleSkpIHJldHVybiBoYXMoZGVzYywgJ3ZhbHVlJylcbiAgICA/IGRlc2MudmFsdWVcbiAgICA6IGRlc2MuZ2V0ICE9PSB1bmRlZmluZWRcbiAgICAgID8gZGVzYy5nZXQuY2FsbChyZWNlaXZlcilcbiAgICAgIDogdW5kZWZpbmVkO1xuICBpZiAoaXNPYmplY3QocHJvdG8gPSBnZXRQcm90b3R5cGVPZih0YXJnZXQpKSkgcmV0dXJuIGdldChwcm90bywgcHJvcGVydHlLZXksIHJlY2VpdmVyKTtcbn1cblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0JywgeyBnZXQ6IGdldCB9KTtcbiIsIi8vIDI2LjEuOSBSZWZsZWN0Lmhhcyh0YXJnZXQsIHByb3BlcnR5S2V5KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge1xuICBoYXM6IGZ1bmN0aW9uIGhhcyh0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgcmV0dXJuIHByb3BlcnR5S2V5IGluIHRhcmdldDtcbiAgfVxufSk7XG4iLCIvLyAyNi4xLjEwIFJlZmxlY3QuaXNFeHRlbnNpYmxlKHRhcmdldClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciAkaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge1xuICBpc0V4dGVuc2libGU6IGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZSh0YXJnZXQpIHtcbiAgICBhbk9iamVjdCh0YXJnZXQpO1xuICAgIHJldHVybiAkaXNFeHRlbnNpYmxlID8gJGlzRXh0ZW5zaWJsZSh0YXJnZXQpIDogdHJ1ZTtcbiAgfVxufSk7XG4iLCIvLyAyNi4xLjExIFJlZmxlY3Qub3duS2V5cyh0YXJnZXQpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7IG93bktleXM6IHJlcXVpcmUoJy4vX293bi1rZXlzJykgfSk7XG4iLCIvLyAyNi4xLjEyIFJlZmxlY3QucHJldmVudEV4dGVuc2lvbnModGFyZ2V0KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyICRwcmV2ZW50RXh0ZW5zaW9ucyA9IE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucztcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge1xuICBwcmV2ZW50RXh0ZW5zaW9uczogZnVuY3Rpb24gcHJldmVudEV4dGVuc2lvbnModGFyZ2V0KSB7XG4gICAgYW5PYmplY3QodGFyZ2V0KTtcbiAgICB0cnkge1xuICAgICAgaWYgKCRwcmV2ZW50RXh0ZW5zaW9ucykgJHByZXZlbnRFeHRlbnNpb25zKHRhcmdldCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59KTtcbiIsIi8vIDI2LjEuMTQgUmVmbGVjdC5zZXRQcm90b3R5cGVPZih0YXJnZXQsIHByb3RvKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBzZXRQcm90byA9IHJlcXVpcmUoJy4vX3NldC1wcm90bycpO1xuXG5pZiAoc2V0UHJvdG8pICRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgc2V0UHJvdG90eXBlT2Y6IGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKHRhcmdldCwgcHJvdG8pIHtcbiAgICBzZXRQcm90by5jaGVjayh0YXJnZXQsIHByb3RvKTtcbiAgICB0cnkge1xuICAgICAgc2V0UHJvdG8uc2V0KHRhcmdldCwgcHJvdG8pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufSk7XG4iLCIvLyAyNi4xLjEzIFJlZmxlY3Quc2V0KHRhcmdldCwgcHJvcGVydHlLZXksIFYgWywgcmVjZWl2ZXJdKVxudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgZ09QRCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuXG5mdW5jdGlvbiBzZXQodGFyZ2V0LCBwcm9wZXJ0eUtleSwgViAvKiAsIHJlY2VpdmVyICovKSB7XG4gIHZhciByZWNlaXZlciA9IGFyZ3VtZW50cy5sZW5ndGggPCA0ID8gdGFyZ2V0IDogYXJndW1lbnRzWzNdO1xuICB2YXIgb3duRGVzYyA9IGdPUEQuZihhbk9iamVjdCh0YXJnZXQpLCBwcm9wZXJ0eUtleSk7XG4gIHZhciBleGlzdGluZ0Rlc2NyaXB0b3IsIHByb3RvO1xuICBpZiAoIW93bkRlc2MpIHtcbiAgICBpZiAoaXNPYmplY3QocHJvdG8gPSBnZXRQcm90b3R5cGVPZih0YXJnZXQpKSkge1xuICAgICAgcmV0dXJuIHNldChwcm90bywgcHJvcGVydHlLZXksIFYsIHJlY2VpdmVyKTtcbiAgICB9XG4gICAgb3duRGVzYyA9IGNyZWF0ZURlc2MoMCk7XG4gIH1cbiAgaWYgKGhhcyhvd25EZXNjLCAndmFsdWUnKSkge1xuICAgIGlmIChvd25EZXNjLndyaXRhYmxlID09PSBmYWxzZSB8fCAhaXNPYmplY3QocmVjZWl2ZXIpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGV4aXN0aW5nRGVzY3JpcHRvciA9IGdPUEQuZihyZWNlaXZlciwgcHJvcGVydHlLZXkpKSB7XG4gICAgICBpZiAoZXhpc3RpbmdEZXNjcmlwdG9yLmdldCB8fCBleGlzdGluZ0Rlc2NyaXB0b3Iuc2V0IHx8IGV4aXN0aW5nRGVzY3JpcHRvci53cml0YWJsZSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAgIGV4aXN0aW5nRGVzY3JpcHRvci52YWx1ZSA9IFY7XG4gICAgICBkUC5mKHJlY2VpdmVyLCBwcm9wZXJ0eUtleSwgZXhpc3RpbmdEZXNjcmlwdG9yKTtcbiAgICB9IGVsc2UgZFAuZihyZWNlaXZlciwgcHJvcGVydHlLZXksIGNyZWF0ZURlc2MoMCwgVikpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBvd25EZXNjLnNldCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiAob3duRGVzYy5zZXQuY2FsbChyZWNlaXZlciwgViksIHRydWUpO1xufVxuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7IHNldDogc2V0IH0pO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGluaGVyaXRJZlJlcXVpcmVkID0gcmVxdWlyZSgnLi9faW5oZXJpdC1pZi1yZXF1aXJlZCcpO1xudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBnT1BOID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4nKS5mO1xudmFyIGlzUmVnRXhwID0gcmVxdWlyZSgnLi9faXMtcmVnZXhwJyk7XG52YXIgJGZsYWdzID0gcmVxdWlyZSgnLi9fZmxhZ3MnKTtcbnZhciAkUmVnRXhwID0gZ2xvYmFsLlJlZ0V4cDtcbnZhciBCYXNlID0gJFJlZ0V4cDtcbnZhciBwcm90byA9ICRSZWdFeHAucHJvdG90eXBlO1xudmFyIHJlMSA9IC9hL2c7XG52YXIgcmUyID0gL2EvZztcbi8vIFwibmV3XCIgY3JlYXRlcyBhIG5ldyBvYmplY3QsIG9sZCB3ZWJraXQgYnVnZ3kgaGVyZVxudmFyIENPUlJFQ1RfTkVXID0gbmV3ICRSZWdFeHAocmUxKSAhPT0gcmUxO1xuXG5pZiAocmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSAmJiAoIUNPUlJFQ1RfTkVXIHx8IHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZTJbcmVxdWlyZSgnLi9fd2tzJykoJ21hdGNoJyldID0gZmFsc2U7XG4gIC8vIFJlZ0V4cCBjb25zdHJ1Y3RvciBjYW4gYWx0ZXIgZmxhZ3MgYW5kIElzUmVnRXhwIHdvcmtzIGNvcnJlY3Qgd2l0aCBAQG1hdGNoXG4gIHJldHVybiAkUmVnRXhwKHJlMSkgIT0gcmUxIHx8ICRSZWdFeHAocmUyKSA9PSByZTIgfHwgJFJlZ0V4cChyZTEsICdpJykgIT0gJy9hL2knO1xufSkpKSB7XG4gICRSZWdFeHAgPSBmdW5jdGlvbiBSZWdFeHAocCwgZikge1xuICAgIHZhciB0aVJFID0gdGhpcyBpbnN0YW5jZW9mICRSZWdFeHA7XG4gICAgdmFyIHBpUkUgPSBpc1JlZ0V4cChwKTtcbiAgICB2YXIgZmlVID0gZiA9PT0gdW5kZWZpbmVkO1xuICAgIHJldHVybiAhdGlSRSAmJiBwaVJFICYmIHAuY29uc3RydWN0b3IgPT09ICRSZWdFeHAgJiYgZmlVID8gcFxuICAgICAgOiBpbmhlcml0SWZSZXF1aXJlZChDT1JSRUNUX05FV1xuICAgICAgICA/IG5ldyBCYXNlKHBpUkUgJiYgIWZpVSA/IHAuc291cmNlIDogcCwgZilcbiAgICAgICAgOiBCYXNlKChwaVJFID0gcCBpbnN0YW5jZW9mICRSZWdFeHApID8gcC5zb3VyY2UgOiBwLCBwaVJFICYmIGZpVSA/ICRmbGFncy5jYWxsKHApIDogZilcbiAgICAgICwgdGlSRSA/IHRoaXMgOiBwcm90bywgJFJlZ0V4cCk7XG4gIH07XG4gIHZhciBwcm94eSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICBrZXkgaW4gJFJlZ0V4cCB8fCBkUCgkUmVnRXhwLCBrZXksIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gQmFzZVtrZXldOyB9LFxuICAgICAgc2V0OiBmdW5jdGlvbiAoaXQpIHsgQmFzZVtrZXldID0gaXQ7IH1cbiAgICB9KTtcbiAgfTtcbiAgZm9yICh2YXIga2V5cyA9IGdPUE4oQmFzZSksIGkgPSAwOyBrZXlzLmxlbmd0aCA+IGk7KSBwcm94eShrZXlzW2krK10pO1xuICBwcm90by5jb25zdHJ1Y3RvciA9ICRSZWdFeHA7XG4gICRSZWdFeHAucHJvdG90eXBlID0gcHJvdG87XG4gIHJlcXVpcmUoJy4vX3JlZGVmaW5lJykoZ2xvYmFsLCAnUmVnRXhwJywgJFJlZ0V4cCk7XG59XG5cbnJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoJ1JlZ0V4cCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHJlZ2V4cEV4ZWMgPSByZXF1aXJlKCcuL19yZWdleHAtZXhlYycpO1xucmVxdWlyZSgnLi9fZXhwb3J0Jykoe1xuICB0YXJnZXQ6ICdSZWdFeHAnLFxuICBwcm90bzogdHJ1ZSxcbiAgZm9yY2VkOiByZWdleHBFeGVjICE9PSAvLi8uZXhlY1xufSwge1xuICBleGVjOiByZWdleHBFeGVjXG59KTtcbiIsIi8vIDIxLjIuNS4zIGdldCBSZWdFeHAucHJvdG90eXBlLmZsYWdzKClcbmlmIChyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmIC8uL2cuZmxhZ3MgIT0gJ2cnKSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mKFJlZ0V4cC5wcm90b3R5cGUsICdmbGFncycsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBnZXQ6IHJlcXVpcmUoJy4vX2ZsYWdzJylcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGFkdmFuY2VTdHJpbmdJbmRleCA9IHJlcXVpcmUoJy4vX2FkdmFuY2Utc3RyaW5nLWluZGV4Jyk7XG52YXIgcmVnRXhwRXhlYyA9IHJlcXVpcmUoJy4vX3JlZ2V4cC1leGVjLWFic3RyYWN0Jyk7XG5cbi8vIEBAbWF0Y2ggbG9naWNcbnJlcXVpcmUoJy4vX2ZpeC1yZS13a3MnKSgnbWF0Y2gnLCAxLCBmdW5jdGlvbiAoZGVmaW5lZCwgTUFUQ0gsICRtYXRjaCwgbWF5YmVDYWxsTmF0aXZlKSB7XG4gIHJldHVybiBbXG4gICAgLy8gYFN0cmluZy5wcm90b3R5cGUubWF0Y2hgIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUubWF0Y2hcbiAgICBmdW5jdGlvbiBtYXRjaChyZWdleHApIHtcbiAgICAgIHZhciBPID0gZGVmaW5lZCh0aGlzKTtcbiAgICAgIHZhciBmbiA9IHJlZ2V4cCA9PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiByZWdleHBbTUFUQ0hdO1xuICAgICAgcmV0dXJuIGZuICE9PSB1bmRlZmluZWQgPyBmbi5jYWxsKHJlZ2V4cCwgTykgOiBuZXcgUmVnRXhwKHJlZ2V4cClbTUFUQ0hdKFN0cmluZyhPKSk7XG4gICAgfSxcbiAgICAvLyBgUmVnRXhwLnByb3RvdHlwZVtAQG1hdGNoXWAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVnZXhwLnByb3RvdHlwZS1AQG1hdGNoXG4gICAgZnVuY3Rpb24gKHJlZ2V4cCkge1xuICAgICAgdmFyIHJlcyA9IG1heWJlQ2FsbE5hdGl2ZSgkbWF0Y2gsIHJlZ2V4cCwgdGhpcyk7XG4gICAgICBpZiAocmVzLmRvbmUpIHJldHVybiByZXMudmFsdWU7XG4gICAgICB2YXIgcnggPSBhbk9iamVjdChyZWdleHApO1xuICAgICAgdmFyIFMgPSBTdHJpbmcodGhpcyk7XG4gICAgICBpZiAoIXJ4Lmdsb2JhbCkgcmV0dXJuIHJlZ0V4cEV4ZWMocngsIFMpO1xuICAgICAgdmFyIGZ1bGxVbmljb2RlID0gcngudW5pY29kZTtcbiAgICAgIHJ4Lmxhc3RJbmRleCA9IDA7XG4gICAgICB2YXIgQSA9IFtdO1xuICAgICAgdmFyIG4gPSAwO1xuICAgICAgdmFyIHJlc3VsdDtcbiAgICAgIHdoaWxlICgocmVzdWx0ID0gcmVnRXhwRXhlYyhyeCwgUykpICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBtYXRjaFN0ciA9IFN0cmluZyhyZXN1bHRbMF0pO1xuICAgICAgICBBW25dID0gbWF0Y2hTdHI7XG4gICAgICAgIGlmIChtYXRjaFN0ciA9PT0gJycpIHJ4Lmxhc3RJbmRleCA9IGFkdmFuY2VTdHJpbmdJbmRleChTLCB0b0xlbmd0aChyeC5sYXN0SW5kZXgpLCBmdWxsVW5pY29kZSk7XG4gICAgICAgIG4rKztcbiAgICAgIH1cbiAgICAgIHJldHVybiBuID09PSAwID8gbnVsbCA6IEE7XG4gICAgfVxuICBdO1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgYWR2YW5jZVN0cmluZ0luZGV4ID0gcmVxdWlyZSgnLi9fYWR2YW5jZS1zdHJpbmctaW5kZXgnKTtcbnZhciByZWdFeHBFeGVjID0gcmVxdWlyZSgnLi9fcmVnZXhwLWV4ZWMtYWJzdHJhY3QnKTtcbnZhciBtYXggPSBNYXRoLm1heDtcbnZhciBtaW4gPSBNYXRoLm1pbjtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG52YXIgU1VCU1RJVFVUSU9OX1NZTUJPTFMgPSAvXFwkKFskJmAnXXxcXGRcXGQ/fDxbXj5dKj4pL2c7XG52YXIgU1VCU1RJVFVUSU9OX1NZTUJPTFNfTk9fTkFNRUQgPSAvXFwkKFskJmAnXXxcXGRcXGQ/KS9nO1xuXG52YXIgbWF5YmVUb1N0cmluZyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/IGl0IDogU3RyaW5nKGl0KTtcbn07XG5cbi8vIEBAcmVwbGFjZSBsb2dpY1xucmVxdWlyZSgnLi9fZml4LXJlLXdrcycpKCdyZXBsYWNlJywgMiwgZnVuY3Rpb24gKGRlZmluZWQsIFJFUExBQ0UsICRyZXBsYWNlLCBtYXliZUNhbGxOYXRpdmUpIHtcbiAgcmV0dXJuIFtcbiAgICAvLyBgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnJlcGxhY2VcbiAgICBmdW5jdGlvbiByZXBsYWNlKHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpIHtcbiAgICAgIHZhciBPID0gZGVmaW5lZCh0aGlzKTtcbiAgICAgIHZhciBmbiA9IHNlYXJjaFZhbHVlID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHNlYXJjaFZhbHVlW1JFUExBQ0VdO1xuICAgICAgcmV0dXJuIGZuICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBmbi5jYWxsKHNlYXJjaFZhbHVlLCBPLCByZXBsYWNlVmFsdWUpXG4gICAgICAgIDogJHJlcGxhY2UuY2FsbChTdHJpbmcoTyksIHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpO1xuICAgIH0sXG4gICAgLy8gYFJlZ0V4cC5wcm90b3R5cGVbQEByZXBsYWNlXWAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVnZXhwLnByb3RvdHlwZS1AQHJlcGxhY2VcbiAgICBmdW5jdGlvbiAocmVnZXhwLCByZXBsYWNlVmFsdWUpIHtcbiAgICAgIHZhciByZXMgPSBtYXliZUNhbGxOYXRpdmUoJHJlcGxhY2UsIHJlZ2V4cCwgdGhpcywgcmVwbGFjZVZhbHVlKTtcbiAgICAgIGlmIChyZXMuZG9uZSkgcmV0dXJuIHJlcy52YWx1ZTtcblxuICAgICAgdmFyIHJ4ID0gYW5PYmplY3QocmVnZXhwKTtcbiAgICAgIHZhciBTID0gU3RyaW5nKHRoaXMpO1xuICAgICAgdmFyIGZ1bmN0aW9uYWxSZXBsYWNlID0gdHlwZW9mIHJlcGxhY2VWYWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbiAgICAgIGlmICghZnVuY3Rpb25hbFJlcGxhY2UpIHJlcGxhY2VWYWx1ZSA9IFN0cmluZyhyZXBsYWNlVmFsdWUpO1xuICAgICAgdmFyIGdsb2JhbCA9IHJ4Lmdsb2JhbDtcbiAgICAgIGlmIChnbG9iYWwpIHtcbiAgICAgICAgdmFyIGZ1bGxVbmljb2RlID0gcngudW5pY29kZTtcbiAgICAgICAgcngubGFzdEluZGV4ID0gMDtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHRzID0gW107XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVnRXhwRXhlYyhyeCwgUyk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIGJyZWFrO1xuICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgaWYgKCFnbG9iYWwpIGJyZWFrO1xuICAgICAgICB2YXIgbWF0Y2hTdHIgPSBTdHJpbmcocmVzdWx0WzBdKTtcbiAgICAgICAgaWYgKG1hdGNoU3RyID09PSAnJykgcngubGFzdEluZGV4ID0gYWR2YW5jZVN0cmluZ0luZGV4KFMsIHRvTGVuZ3RoKHJ4Lmxhc3RJbmRleCksIGZ1bGxVbmljb2RlKTtcbiAgICAgIH1cbiAgICAgIHZhciBhY2N1bXVsYXRlZFJlc3VsdCA9ICcnO1xuICAgICAgdmFyIG5leHRTb3VyY2VQb3NpdGlvbiA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0c1tpXTtcbiAgICAgICAgdmFyIG1hdGNoZWQgPSBTdHJpbmcocmVzdWx0WzBdKTtcbiAgICAgICAgdmFyIHBvc2l0aW9uID0gbWF4KG1pbih0b0ludGVnZXIocmVzdWx0LmluZGV4KSwgUy5sZW5ndGgpLCAwKTtcbiAgICAgICAgdmFyIGNhcHR1cmVzID0gW107XG4gICAgICAgIC8vIE5PVEU6IFRoaXMgaXMgZXF1aXZhbGVudCB0b1xuICAgICAgICAvLyAgIGNhcHR1cmVzID0gcmVzdWx0LnNsaWNlKDEpLm1hcChtYXliZVRvU3RyaW5nKVxuICAgICAgICAvLyBidXQgZm9yIHNvbWUgcmVhc29uIGBuYXRpdmVTbGljZS5jYWxsKHJlc3VsdCwgMSwgcmVzdWx0Lmxlbmd0aClgIChjYWxsZWQgaW5cbiAgICAgICAgLy8gdGhlIHNsaWNlIHBvbHlmaWxsIHdoZW4gc2xpY2luZyBuYXRpdmUgYXJyYXlzKSBcImRvZXNuJ3Qgd29ya1wiIGluIHNhZmFyaSA5IGFuZFxuICAgICAgICAvLyBjYXVzZXMgYSBjcmFzaCAoaHR0cHM6Ly9wYXN0ZWJpbi5jb20vTjIxUXplUUEpIHdoZW4gdHJ5aW5nIHRvIGRlYnVnIGl0LlxuICAgICAgICBmb3IgKHZhciBqID0gMTsgaiA8IHJlc3VsdC5sZW5ndGg7IGorKykgY2FwdHVyZXMucHVzaChtYXliZVRvU3RyaW5nKHJlc3VsdFtqXSkpO1xuICAgICAgICB2YXIgbmFtZWRDYXB0dXJlcyA9IHJlc3VsdC5ncm91cHM7XG4gICAgICAgIGlmIChmdW5jdGlvbmFsUmVwbGFjZSkge1xuICAgICAgICAgIHZhciByZXBsYWNlckFyZ3MgPSBbbWF0Y2hlZF0uY29uY2F0KGNhcHR1cmVzLCBwb3NpdGlvbiwgUyk7XG4gICAgICAgICAgaWYgKG5hbWVkQ2FwdHVyZXMgIT09IHVuZGVmaW5lZCkgcmVwbGFjZXJBcmdzLnB1c2gobmFtZWRDYXB0dXJlcyk7XG4gICAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gU3RyaW5nKHJlcGxhY2VWYWx1ZS5hcHBseSh1bmRlZmluZWQsIHJlcGxhY2VyQXJncykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlcGxhY2VtZW50ID0gZ2V0U3Vic3RpdHV0aW9uKG1hdGNoZWQsIFMsIHBvc2l0aW9uLCBjYXB0dXJlcywgbmFtZWRDYXB0dXJlcywgcmVwbGFjZVZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9zaXRpb24gPj0gbmV4dFNvdXJjZVBvc2l0aW9uKSB7XG4gICAgICAgICAgYWNjdW11bGF0ZWRSZXN1bHQgKz0gUy5zbGljZShuZXh0U291cmNlUG9zaXRpb24sIHBvc2l0aW9uKSArIHJlcGxhY2VtZW50O1xuICAgICAgICAgIG5leHRTb3VyY2VQb3NpdGlvbiA9IHBvc2l0aW9uICsgbWF0Y2hlZC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2N1bXVsYXRlZFJlc3VsdCArIFMuc2xpY2UobmV4dFNvdXJjZVBvc2l0aW9uKTtcbiAgICB9XG4gIF07XG5cbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1nZXRzdWJzdGl0dXRpb25cbiAgZnVuY3Rpb24gZ2V0U3Vic3RpdHV0aW9uKG1hdGNoZWQsIHN0ciwgcG9zaXRpb24sIGNhcHR1cmVzLCBuYW1lZENhcHR1cmVzLCByZXBsYWNlbWVudCkge1xuICAgIHZhciB0YWlsUG9zID0gcG9zaXRpb24gKyBtYXRjaGVkLmxlbmd0aDtcbiAgICB2YXIgbSA9IGNhcHR1cmVzLmxlbmd0aDtcbiAgICB2YXIgc3ltYm9scyA9IFNVQlNUSVRVVElPTl9TWU1CT0xTX05PX05BTUVEO1xuICAgIGlmIChuYW1lZENhcHR1cmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG5hbWVkQ2FwdHVyZXMgPSB0b09iamVjdChuYW1lZENhcHR1cmVzKTtcbiAgICAgIHN5bWJvbHMgPSBTVUJTVElUVVRJT05fU1lNQk9MUztcbiAgICB9XG4gICAgcmV0dXJuICRyZXBsYWNlLmNhbGwocmVwbGFjZW1lbnQsIHN5bWJvbHMsIGZ1bmN0aW9uIChtYXRjaCwgY2gpIHtcbiAgICAgIHZhciBjYXB0dXJlO1xuICAgICAgc3dpdGNoIChjaC5jaGFyQXQoMCkpIHtcbiAgICAgICAgY2FzZSAnJCc6IHJldHVybiAnJCc7XG4gICAgICAgIGNhc2UgJyYnOiByZXR1cm4gbWF0Y2hlZDtcbiAgICAgICAgY2FzZSAnYCc6IHJldHVybiBzdHIuc2xpY2UoMCwgcG9zaXRpb24pO1xuICAgICAgICBjYXNlIFwiJ1wiOiByZXR1cm4gc3RyLnNsaWNlKHRhaWxQb3MpO1xuICAgICAgICBjYXNlICc8JzpcbiAgICAgICAgICBjYXB0dXJlID0gbmFtZWRDYXB0dXJlc1tjaC5zbGljZSgxLCAtMSldO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OiAvLyBcXGRcXGQ/XG4gICAgICAgICAgdmFyIG4gPSArY2g7XG4gICAgICAgICAgaWYgKG4gPT09IDApIHJldHVybiBtYXRjaDtcbiAgICAgICAgICBpZiAobiA+IG0pIHtcbiAgICAgICAgICAgIHZhciBmID0gZmxvb3IobiAvIDEwKTtcbiAgICAgICAgICAgIGlmIChmID09PSAwKSByZXR1cm4gbWF0Y2g7XG4gICAgICAgICAgICBpZiAoZiA8PSBtKSByZXR1cm4gY2FwdHVyZXNbZiAtIDFdID09PSB1bmRlZmluZWQgPyBjaC5jaGFyQXQoMSkgOiBjYXB0dXJlc1tmIC0gMV0gKyBjaC5jaGFyQXQoMSk7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhcHR1cmUgPSBjYXB0dXJlc1tuIC0gMV07XG4gICAgICB9XG4gICAgICByZXR1cm4gY2FwdHVyZSA9PT0gdW5kZWZpbmVkID8gJycgOiBjYXB0dXJlO1xuICAgIH0pO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgc2FtZVZhbHVlID0gcmVxdWlyZSgnLi9fc2FtZS12YWx1ZScpO1xudmFyIHJlZ0V4cEV4ZWMgPSByZXF1aXJlKCcuL19yZWdleHAtZXhlYy1hYnN0cmFjdCcpO1xuXG4vLyBAQHNlYXJjaCBsb2dpY1xucmVxdWlyZSgnLi9fZml4LXJlLXdrcycpKCdzZWFyY2gnLCAxLCBmdW5jdGlvbiAoZGVmaW5lZCwgU0VBUkNILCAkc2VhcmNoLCBtYXliZUNhbGxOYXRpdmUpIHtcbiAgcmV0dXJuIFtcbiAgICAvLyBgU3RyaW5nLnByb3RvdHlwZS5zZWFyY2hgIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuc2VhcmNoXG4gICAgZnVuY3Rpb24gc2VhcmNoKHJlZ2V4cCkge1xuICAgICAgdmFyIE8gPSBkZWZpbmVkKHRoaXMpO1xuICAgICAgdmFyIGZuID0gcmVnZXhwID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHJlZ2V4cFtTRUFSQ0hdO1xuICAgICAgcmV0dXJuIGZuICE9PSB1bmRlZmluZWQgPyBmbi5jYWxsKHJlZ2V4cCwgTykgOiBuZXcgUmVnRXhwKHJlZ2V4cClbU0VBUkNIXShTdHJpbmcoTykpO1xuICAgIH0sXG4gICAgLy8gYFJlZ0V4cC5wcm90b3R5cGVbQEBzZWFyY2hdYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWdleHAucHJvdG90eXBlLUBAc2VhcmNoXG4gICAgZnVuY3Rpb24gKHJlZ2V4cCkge1xuICAgICAgdmFyIHJlcyA9IG1heWJlQ2FsbE5hdGl2ZSgkc2VhcmNoLCByZWdleHAsIHRoaXMpO1xuICAgICAgaWYgKHJlcy5kb25lKSByZXR1cm4gcmVzLnZhbHVlO1xuICAgICAgdmFyIHJ4ID0gYW5PYmplY3QocmVnZXhwKTtcbiAgICAgIHZhciBTID0gU3RyaW5nKHRoaXMpO1xuICAgICAgdmFyIHByZXZpb3VzTGFzdEluZGV4ID0gcngubGFzdEluZGV4O1xuICAgICAgaWYgKCFzYW1lVmFsdWUocHJldmlvdXNMYXN0SW5kZXgsIDApKSByeC5sYXN0SW5kZXggPSAwO1xuICAgICAgdmFyIHJlc3VsdCA9IHJlZ0V4cEV4ZWMocngsIFMpO1xuICAgICAgaWYgKCFzYW1lVmFsdWUocngubGFzdEluZGV4LCBwcmV2aW91c0xhc3RJbmRleCkpIHJ4Lmxhc3RJbmRleCA9IHByZXZpb3VzTGFzdEluZGV4O1xuICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gbnVsbCA/IC0xIDogcmVzdWx0LmluZGV4O1xuICAgIH1cbiAgXTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaXNSZWdFeHAgPSByZXF1aXJlKCcuL19pcy1yZWdleHAnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4vX3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciBhZHZhbmNlU3RyaW5nSW5kZXggPSByZXF1aXJlKCcuL19hZHZhbmNlLXN0cmluZy1pbmRleCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgY2FsbFJlZ0V4cEV4ZWMgPSByZXF1aXJlKCcuL19yZWdleHAtZXhlYy1hYnN0cmFjdCcpO1xudmFyIHJlZ2V4cEV4ZWMgPSByZXF1aXJlKCcuL19yZWdleHAtZXhlYycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciAkbWluID0gTWF0aC5taW47XG52YXIgJHB1c2ggPSBbXS5wdXNoO1xudmFyICRTUExJVCA9ICdzcGxpdCc7XG52YXIgTEVOR1RIID0gJ2xlbmd0aCc7XG52YXIgTEFTVF9JTkRFWCA9ICdsYXN0SW5kZXgnO1xudmFyIE1BWF9VSU5UMzIgPSAweGZmZmZmZmZmO1xuXG4vLyBiYWJlbC1taW5pZnkgdHJhbnNwaWxlcyBSZWdFeHAoJ3gnLCAneScpIC0+IC94L3kgYW5kIGl0IGNhdXNlcyBTeW50YXhFcnJvclxudmFyIFNVUFBPUlRTX1kgPSAhZmFpbHMoZnVuY3Rpb24gKCkgeyBSZWdFeHAoTUFYX1VJTlQzMiwgJ3knKTsgfSk7XG5cbi8vIEBAc3BsaXQgbG9naWNcbnJlcXVpcmUoJy4vX2ZpeC1yZS13a3MnKSgnc3BsaXQnLCAyLCBmdW5jdGlvbiAoZGVmaW5lZCwgU1BMSVQsICRzcGxpdCwgbWF5YmVDYWxsTmF0aXZlKSB7XG4gIHZhciBpbnRlcm5hbFNwbGl0O1xuICBpZiAoXG4gICAgJ2FiYmMnWyRTUExJVF0oLyhiKSovKVsxXSA9PSAnYycgfHxcbiAgICAndGVzdCdbJFNQTElUXSgvKD86KS8sIC0xKVtMRU5HVEhdICE9IDQgfHxcbiAgICAnYWInWyRTUExJVF0oLyg/OmFiKSovKVtMRU5HVEhdICE9IDIgfHxcbiAgICAnLidbJFNQTElUXSgvKC4/KSguPykvKVtMRU5HVEhdICE9IDQgfHxcbiAgICAnLidbJFNQTElUXSgvKCkoKS8pW0xFTkdUSF0gPiAxIHx8XG4gICAgJydbJFNQTElUXSgvLj8vKVtMRU5HVEhdXG4gICkge1xuICAgIC8vIGJhc2VkIG9uIGVzNS1zaGltIGltcGxlbWVudGF0aW9uLCBuZWVkIHRvIHJld29yayBpdFxuICAgIGludGVybmFsU3BsaXQgPSBmdW5jdGlvbiAoc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgICAgdmFyIHN0cmluZyA9IFN0cmluZyh0aGlzKTtcbiAgICAgIGlmIChzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCAmJiBsaW1pdCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgICAgLy8gSWYgYHNlcGFyYXRvcmAgaXMgbm90IGEgcmVnZXgsIHVzZSBuYXRpdmUgc3BsaXRcbiAgICAgIGlmICghaXNSZWdFeHAoc2VwYXJhdG9yKSkgcmV0dXJuICRzcGxpdC5jYWxsKHN0cmluZywgc2VwYXJhdG9yLCBsaW1pdCk7XG4gICAgICB2YXIgb3V0cHV0ID0gW107XG4gICAgICB2YXIgZmxhZ3MgPSAoc2VwYXJhdG9yLmlnbm9yZUNhc2UgPyAnaScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci5tdWx0aWxpbmUgPyAnbScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci51bmljb2RlID8gJ3UnIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChzZXBhcmF0b3Iuc3RpY2t5ID8gJ3knIDogJycpO1xuICAgICAgdmFyIGxhc3RMYXN0SW5kZXggPSAwO1xuICAgICAgdmFyIHNwbGl0TGltaXQgPSBsaW1pdCA9PT0gdW5kZWZpbmVkID8gTUFYX1VJTlQzMiA6IGxpbWl0ID4+PiAwO1xuICAgICAgLy8gTWFrZSBgZ2xvYmFsYCBhbmQgYXZvaWQgYGxhc3RJbmRleGAgaXNzdWVzIGJ5IHdvcmtpbmcgd2l0aCBhIGNvcHlcbiAgICAgIHZhciBzZXBhcmF0b3JDb3B5ID0gbmV3IFJlZ0V4cChzZXBhcmF0b3Iuc291cmNlLCBmbGFncyArICdnJyk7XG4gICAgICB2YXIgbWF0Y2gsIGxhc3RJbmRleCwgbGFzdExlbmd0aDtcbiAgICAgIHdoaWxlIChtYXRjaCA9IHJlZ2V4cEV4ZWMuY2FsbChzZXBhcmF0b3JDb3B5LCBzdHJpbmcpKSB7XG4gICAgICAgIGxhc3RJbmRleCA9IHNlcGFyYXRvckNvcHlbTEFTVF9JTkRFWF07XG4gICAgICAgIGlmIChsYXN0SW5kZXggPiBsYXN0TGFzdEluZGV4KSB7XG4gICAgICAgICAgb3V0cHV0LnB1c2goc3RyaW5nLnNsaWNlKGxhc3RMYXN0SW5kZXgsIG1hdGNoLmluZGV4KSk7XG4gICAgICAgICAgaWYgKG1hdGNoW0xFTkdUSF0gPiAxICYmIG1hdGNoLmluZGV4IDwgc3RyaW5nW0xFTkdUSF0pICRwdXNoLmFwcGx5KG91dHB1dCwgbWF0Y2guc2xpY2UoMSkpO1xuICAgICAgICAgIGxhc3RMZW5ndGggPSBtYXRjaFswXVtMRU5HVEhdO1xuICAgICAgICAgIGxhc3RMYXN0SW5kZXggPSBsYXN0SW5kZXg7XG4gICAgICAgICAgaWYgKG91dHB1dFtMRU5HVEhdID49IHNwbGl0TGltaXQpIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXBhcmF0b3JDb3B5W0xBU1RfSU5ERVhdID09PSBtYXRjaC5pbmRleCkgc2VwYXJhdG9yQ29weVtMQVNUX0lOREVYXSsrOyAvLyBBdm9pZCBhbiBpbmZpbml0ZSBsb29wXG4gICAgICB9XG4gICAgICBpZiAobGFzdExhc3RJbmRleCA9PT0gc3RyaW5nW0xFTkdUSF0pIHtcbiAgICAgICAgaWYgKGxhc3RMZW5ndGggfHwgIXNlcGFyYXRvckNvcHkudGVzdCgnJykpIG91dHB1dC5wdXNoKCcnKTtcbiAgICAgIH0gZWxzZSBvdXRwdXQucHVzaChzdHJpbmcuc2xpY2UobGFzdExhc3RJbmRleCkpO1xuICAgICAgcmV0dXJuIG91dHB1dFtMRU5HVEhdID4gc3BsaXRMaW1pdCA/IG91dHB1dC5zbGljZSgwLCBzcGxpdExpbWl0KSA6IG91dHB1dDtcbiAgICB9O1xuICAvLyBDaGFrcmEsIFY4XG4gIH0gZWxzZSBpZiAoJzAnWyRTUExJVF0odW5kZWZpbmVkLCAwKVtMRU5HVEhdKSB7XG4gICAgaW50ZXJuYWxTcGxpdCA9IGZ1bmN0aW9uIChzZXBhcmF0b3IsIGxpbWl0KSB7XG4gICAgICByZXR1cm4gc2VwYXJhdG9yID09PSB1bmRlZmluZWQgJiYgbGltaXQgPT09IDAgPyBbXSA6ICRzcGxpdC5jYWxsKHRoaXMsIHNlcGFyYXRvciwgbGltaXQpO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgaW50ZXJuYWxTcGxpdCA9ICRzcGxpdDtcbiAgfVxuXG4gIHJldHVybiBbXG4gICAgLy8gYFN0cmluZy5wcm90b3R5cGUuc3BsaXRgIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuc3BsaXRcbiAgICBmdW5jdGlvbiBzcGxpdChzZXBhcmF0b3IsIGxpbWl0KSB7XG4gICAgICB2YXIgTyA9IGRlZmluZWQodGhpcyk7XG4gICAgICB2YXIgc3BsaXR0ZXIgPSBzZXBhcmF0b3IgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2VwYXJhdG9yW1NQTElUXTtcbiAgICAgIHJldHVybiBzcGxpdHRlciAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gc3BsaXR0ZXIuY2FsbChzZXBhcmF0b3IsIE8sIGxpbWl0KVxuICAgICAgICA6IGludGVybmFsU3BsaXQuY2FsbChTdHJpbmcoTyksIHNlcGFyYXRvciwgbGltaXQpO1xuICAgIH0sXG4gICAgLy8gYFJlZ0V4cC5wcm90b3R5cGVbQEBzcGxpdF1gIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZ2V4cC5wcm90b3R5cGUtQEBzcGxpdFxuICAgIC8vXG4gICAgLy8gTk9URTogVGhpcyBjYW5ub3QgYmUgcHJvcGVybHkgcG9seWZpbGxlZCBpbiBlbmdpbmVzIHRoYXQgZG9uJ3Qgc3VwcG9ydFxuICAgIC8vIHRoZSAneScgZmxhZy5cbiAgICBmdW5jdGlvbiAocmVnZXhwLCBsaW1pdCkge1xuICAgICAgdmFyIHJlcyA9IG1heWJlQ2FsbE5hdGl2ZShpbnRlcm5hbFNwbGl0LCByZWdleHAsIHRoaXMsIGxpbWl0LCBpbnRlcm5hbFNwbGl0ICE9PSAkc3BsaXQpO1xuICAgICAgaWYgKHJlcy5kb25lKSByZXR1cm4gcmVzLnZhbHVlO1xuXG4gICAgICB2YXIgcnggPSBhbk9iamVjdChyZWdleHApO1xuICAgICAgdmFyIFMgPSBTdHJpbmcodGhpcyk7XG4gICAgICB2YXIgQyA9IHNwZWNpZXNDb25zdHJ1Y3RvcihyeCwgUmVnRXhwKTtcblxuICAgICAgdmFyIHVuaWNvZGVNYXRjaGluZyA9IHJ4LnVuaWNvZGU7XG4gICAgICB2YXIgZmxhZ3MgPSAocnguaWdub3JlQ2FzZSA/ICdpJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAocngubXVsdGlsaW5lID8gJ20nIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChyeC51bmljb2RlID8gJ3UnIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChTVVBQT1JUU19ZID8gJ3knIDogJ2cnKTtcblxuICAgICAgLy8gXig/ICsgcnggKyApIGlzIG5lZWRlZCwgaW4gY29tYmluYXRpb24gd2l0aCBzb21lIFMgc2xpY2luZywgdG9cbiAgICAgIC8vIHNpbXVsYXRlIHRoZSAneScgZmxhZy5cbiAgICAgIHZhciBzcGxpdHRlciA9IG5ldyBDKFNVUFBPUlRTX1kgPyByeCA6ICdeKD86JyArIHJ4LnNvdXJjZSArICcpJywgZmxhZ3MpO1xuICAgICAgdmFyIGxpbSA9IGxpbWl0ID09PSB1bmRlZmluZWQgPyBNQVhfVUlOVDMyIDogbGltaXQgPj4+IDA7XG4gICAgICBpZiAobGltID09PSAwKSByZXR1cm4gW107XG4gICAgICBpZiAoUy5sZW5ndGggPT09IDApIHJldHVybiBjYWxsUmVnRXhwRXhlYyhzcGxpdHRlciwgUykgPT09IG51bGwgPyBbU10gOiBbXTtcbiAgICAgIHZhciBwID0gMDtcbiAgICAgIHZhciBxID0gMDtcbiAgICAgIHZhciBBID0gW107XG4gICAgICB3aGlsZSAocSA8IFMubGVuZ3RoKSB7XG4gICAgICAgIHNwbGl0dGVyLmxhc3RJbmRleCA9IFNVUFBPUlRTX1kgPyBxIDogMDtcbiAgICAgICAgdmFyIHogPSBjYWxsUmVnRXhwRXhlYyhzcGxpdHRlciwgU1VQUE9SVFNfWSA/IFMgOiBTLnNsaWNlKHEpKTtcbiAgICAgICAgdmFyIGU7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB6ID09PSBudWxsIHx8XG4gICAgICAgICAgKGUgPSAkbWluKHRvTGVuZ3RoKHNwbGl0dGVyLmxhc3RJbmRleCArIChTVVBQT1JUU19ZID8gMCA6IHEpKSwgUy5sZW5ndGgpKSA9PT0gcFxuICAgICAgICApIHtcbiAgICAgICAgICBxID0gYWR2YW5jZVN0cmluZ0luZGV4KFMsIHEsIHVuaWNvZGVNYXRjaGluZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgQS5wdXNoKFMuc2xpY2UocCwgcSkpO1xuICAgICAgICAgIGlmIChBLmxlbmd0aCA9PT0gbGltKSByZXR1cm4gQTtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8PSB6Lmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgQS5wdXNoKHpbaV0pO1xuICAgICAgICAgICAgaWYgKEEubGVuZ3RoID09PSBsaW0pIHJldHVybiBBO1xuICAgICAgICAgIH1cbiAgICAgICAgICBxID0gcCA9IGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIEEucHVzaChTLnNsaWNlKHApKTtcbiAgICAgIHJldHVybiBBO1xuICAgIH1cbiAgXTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi9lczYucmVnZXhwLmZsYWdzJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciAkZmxhZ3MgPSByZXF1aXJlKCcuL19mbGFncycpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKTtcbnZhciBUT19TVFJJTkcgPSAndG9TdHJpbmcnO1xudmFyICR0b1N0cmluZyA9IC8uL1tUT19TVFJJTkddO1xuXG52YXIgZGVmaW5lID0gZnVuY3Rpb24gKGZuKSB7XG4gIHJlcXVpcmUoJy4vX3JlZGVmaW5lJykoUmVnRXhwLnByb3RvdHlwZSwgVE9fU1RSSU5HLCBmbiwgdHJ1ZSk7XG59O1xuXG4vLyAyMS4yLjUuMTQgUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZygpXG5pZiAocmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7IHJldHVybiAkdG9TdHJpbmcuY2FsbCh7IHNvdXJjZTogJ2EnLCBmbGFnczogJ2InIH0pICE9ICcvYS9iJzsgfSkpIHtcbiAgZGVmaW5lKGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHZhciBSID0gYW5PYmplY3QodGhpcyk7XG4gICAgcmV0dXJuICcvJy5jb25jYXQoUi5zb3VyY2UsICcvJyxcbiAgICAgICdmbGFncycgaW4gUiA/IFIuZmxhZ3MgOiAhREVTQ1JJUFRPUlMgJiYgUiBpbnN0YW5jZW9mIFJlZ0V4cCA/ICRmbGFncy5jYWxsKFIpIDogdW5kZWZpbmVkKTtcbiAgfSk7XG4vLyBGRjQ0LSBSZWdFeHAjdG9TdHJpbmcgaGFzIGEgd3JvbmcgbmFtZVxufSBlbHNlIGlmICgkdG9TdHJpbmcubmFtZSAhPSBUT19TVFJJTkcpIHtcbiAgZGVmaW5lKGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiAkdG9TdHJpbmcuY2FsbCh0aGlzKTtcbiAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG52YXIgc3Ryb25nID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbi1zdHJvbmcnKTtcbnZhciB2YWxpZGF0ZSA9IHJlcXVpcmUoJy4vX3ZhbGlkYXRlLWNvbGxlY3Rpb24nKTtcbnZhciBTRVQgPSAnU2V0JztcblxuLy8gMjMuMiBTZXQgT2JqZWN0c1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19jb2xsZWN0aW9uJykoU0VULCBmdW5jdGlvbiAoZ2V0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBTZXQoKSB7IHJldHVybiBnZXQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpOyB9O1xufSwge1xuICAvLyAyMy4yLjMuMSBTZXQucHJvdG90eXBlLmFkZCh2YWx1ZSlcbiAgYWRkOiBmdW5jdGlvbiBhZGQodmFsdWUpIHtcbiAgICByZXR1cm4gc3Ryb25nLmRlZih2YWxpZGF0ZSh0aGlzLCBTRVQpLCB2YWx1ZSA9IHZhbHVlID09PSAwID8gMCA6IHZhbHVlLCB2YWx1ZSk7XG4gIH1cbn0sIHN0cm9uZyk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy4yIFN0cmluZy5wcm90b3R5cGUuYW5jaG9yKG5hbWUpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdhbmNob3InLCBmdW5jdGlvbiAoY3JlYXRlSFRNTCkge1xuICByZXR1cm4gZnVuY3Rpb24gYW5jaG9yKG5hbWUpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnYScsICduYW1lJywgbmFtZSk7XG4gIH07XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjMgU3RyaW5nLnByb3RvdHlwZS5iaWcoKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnYmlnJywgZnVuY3Rpb24gKGNyZWF0ZUhUTUwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGJpZygpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnYmlnJywgJycsICcnKTtcbiAgfTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuNCBTdHJpbmcucHJvdG90eXBlLmJsaW5rKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2JsaW5rJywgZnVuY3Rpb24gKGNyZWF0ZUhUTUwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGJsaW5rKCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdibGluaycsICcnLCAnJyk7XG4gIH07XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjUgU3RyaW5nLnByb3RvdHlwZS5ib2xkKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2JvbGQnLCBmdW5jdGlvbiAoY3JlYXRlSFRNTCkge1xuICByZXR1cm4gZnVuY3Rpb24gYm9sZCgpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnYicsICcnLCAnJyk7XG4gIH07XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJGF0ID0gcmVxdWlyZSgnLi9fc3RyaW5nLWF0JykoZmFsc2UpO1xuJGV4cG9ydCgkZXhwb3J0LlAsICdTdHJpbmcnLCB7XG4gIC8vIDIxLjEuMy4zIFN0cmluZy5wcm90b3R5cGUuY29kZVBvaW50QXQocG9zKVxuICBjb2RlUG9pbnRBdDogZnVuY3Rpb24gY29kZVBvaW50QXQocG9zKSB7XG4gICAgcmV0dXJuICRhdCh0aGlzLCBwb3MpO1xuICB9XG59KTtcbiIsIi8vIDIxLjEuMy42IFN0cmluZy5wcm90b3R5cGUuZW5kc1dpdGgoc2VhcmNoU3RyaW5nIFssIGVuZFBvc2l0aW9uXSlcbid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBjb250ZXh0ID0gcmVxdWlyZSgnLi9fc3RyaW5nLWNvbnRleHQnKTtcbnZhciBFTkRTX1dJVEggPSAnZW5kc1dpdGgnO1xudmFyICRlbmRzV2l0aCA9ICcnW0VORFNfV0lUSF07XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi9fZmFpbHMtaXMtcmVnZXhwJykoRU5EU19XSVRIKSwgJ1N0cmluZycsIHtcbiAgZW5kc1dpdGg6IGZ1bmN0aW9uIGVuZHNXaXRoKHNlYXJjaFN0cmluZyAvKiAsIGVuZFBvc2l0aW9uID0gQGxlbmd0aCAqLykge1xuICAgIHZhciB0aGF0ID0gY29udGV4dCh0aGlzLCBzZWFyY2hTdHJpbmcsIEVORFNfV0lUSCk7XG4gICAgdmFyIGVuZFBvc2l0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gICAgdmFyIGxlbiA9IHRvTGVuZ3RoKHRoYXQubGVuZ3RoKTtcbiAgICB2YXIgZW5kID0gZW5kUG9zaXRpb24gPT09IHVuZGVmaW5lZCA/IGxlbiA6IE1hdGgubWluKHRvTGVuZ3RoKGVuZFBvc2l0aW9uKSwgbGVuKTtcbiAgICB2YXIgc2VhcmNoID0gU3RyaW5nKHNlYXJjaFN0cmluZyk7XG4gICAgcmV0dXJuICRlbmRzV2l0aFxuICAgICAgPyAkZW5kc1dpdGguY2FsbCh0aGF0LCBzZWFyY2gsIGVuZClcbiAgICAgIDogdGhhdC5zbGljZShlbmQgLSBzZWFyY2gubGVuZ3RoLCBlbmQpID09PSBzZWFyY2g7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuNiBTdHJpbmcucHJvdG90eXBlLmZpeGVkKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2ZpeGVkJywgZnVuY3Rpb24gKGNyZWF0ZUhUTUwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGZpeGVkKCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICd0dCcsICcnLCAnJyk7XG4gIH07XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjcgU3RyaW5nLnByb3RvdHlwZS5mb250Y29sb3IoY29sb3IpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdmb250Y29sb3InLCBmdW5jdGlvbiAoY3JlYXRlSFRNTCkge1xuICByZXR1cm4gZnVuY3Rpb24gZm9udGNvbG9yKGNvbG9yKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2ZvbnQnLCAnY29sb3InLCBjb2xvcik7XG4gIH07XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjggU3RyaW5nLnByb3RvdHlwZS5mb250c2l6ZShzaXplKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnZm9udHNpemUnLCBmdW5jdGlvbiAoY3JlYXRlSFRNTCkge1xuICByZXR1cm4gZnVuY3Rpb24gZm9udHNpemUoc2l6ZSkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdmb250JywgJ3NpemUnLCBzaXplKTtcbiAgfTtcbn0pO1xuIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuL190by1hYnNvbHV0ZS1pbmRleCcpO1xudmFyIGZyb21DaGFyQ29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGU7XG52YXIgJGZyb21Db2RlUG9pbnQgPSBTdHJpbmcuZnJvbUNvZGVQb2ludDtcblxuLy8gbGVuZ3RoIHNob3VsZCBiZSAxLCBvbGQgRkYgcHJvYmxlbVxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoISEkZnJvbUNvZGVQb2ludCAmJiAkZnJvbUNvZGVQb2ludC5sZW5ndGggIT0gMSksICdTdHJpbmcnLCB7XG4gIC8vIDIxLjEuMi4yIFN0cmluZy5mcm9tQ29kZVBvaW50KC4uLmNvZGVQb2ludHMpXG4gIGZyb21Db2RlUG9pbnQ6IGZ1bmN0aW9uIGZyb21Db2RlUG9pbnQoeCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHZhciBhTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIGNvZGU7XG4gICAgd2hpbGUgKGFMZW4gPiBpKSB7XG4gICAgICBjb2RlID0gK2FyZ3VtZW50c1tpKytdO1xuICAgICAgaWYgKHRvQWJzb2x1dGVJbmRleChjb2RlLCAweDEwZmZmZikgIT09IGNvZGUpIHRocm93IFJhbmdlRXJyb3IoY29kZSArICcgaXMgbm90IGEgdmFsaWQgY29kZSBwb2ludCcpO1xuICAgICAgcmVzLnB1c2goY29kZSA8IDB4MTAwMDBcbiAgICAgICAgPyBmcm9tQ2hhckNvZGUoY29kZSlcbiAgICAgICAgOiBmcm9tQ2hhckNvZGUoKChjb2RlIC09IDB4MTAwMDApID4+IDEwKSArIDB4ZDgwMCwgY29kZSAlIDB4NDAwICsgMHhkYzAwKVxuICAgICAgKTtcbiAgICB9IHJldHVybiByZXMuam9pbignJyk7XG4gIH1cbn0pO1xuIiwiLy8gMjEuMS4zLjcgU3RyaW5nLnByb3RvdHlwZS5pbmNsdWRlcyhzZWFyY2hTdHJpbmcsIHBvc2l0aW9uID0gMClcbid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgY29udGV4dCA9IHJlcXVpcmUoJy4vX3N0cmluZy1jb250ZXh0Jyk7XG52YXIgSU5DTFVERVMgPSAnaW5jbHVkZXMnO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzLWlzLXJlZ2V4cCcpKElOQ0xVREVTKSwgJ1N0cmluZycsIHtcbiAgaW5jbHVkZXM6IGZ1bmN0aW9uIGluY2x1ZGVzKHNlYXJjaFN0cmluZyAvKiAsIHBvc2l0aW9uID0gMCAqLykge1xuICAgIHJldHVybiAhIX5jb250ZXh0KHRoaXMsIHNlYXJjaFN0cmluZywgSU5DTFVERVMpXG4gICAgICAuaW5kZXhPZihzZWFyY2hTdHJpbmcsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy45IFN0cmluZy5wcm90b3R5cGUuaXRhbGljcygpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdpdGFsaWNzJywgZnVuY3Rpb24gKGNyZWF0ZUhUTUwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGl0YWxpY3MoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2knLCAnJywgJycpO1xuICB9O1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGF0ID0gcmVxdWlyZSgnLi9fc3RyaW5nLWF0JykodHJ1ZSk7XG5cbi8vIDIxLjEuMy4yNyBTdHJpbmcucHJvdG90eXBlW0BAaXRlcmF0b3JdKClcbnJlcXVpcmUoJy4vX2l0ZXItZGVmaW5lJykoU3RyaW5nLCAnU3RyaW5nJywgZnVuY3Rpb24gKGl0ZXJhdGVkKSB7XG4gIHRoaXMuX3QgPSBTdHJpbmcoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbi8vIDIxLjEuNS4yLjEgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcbn0sIGZ1bmN0aW9uICgpIHtcbiAgdmFyIE8gPSB0aGlzLl90O1xuICB2YXIgaW5kZXggPSB0aGlzLl9pO1xuICB2YXIgcG9pbnQ7XG4gIGlmIChpbmRleCA+PSBPLmxlbmd0aCkgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICBwb2ludCA9ICRhdChPLCBpbmRleCk7XG4gIHRoaXMuX2kgKz0gcG9pbnQubGVuZ3RoO1xuICByZXR1cm4geyB2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlIH07XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjEwIFN0cmluZy5wcm90b3R5cGUubGluayh1cmwpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdsaW5rJywgZnVuY3Rpb24gKGNyZWF0ZUhUTUwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGxpbmsodXJsKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2EnLCAnaHJlZicsIHVybCk7XG4gIH07XG59KTtcbiIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnU3RyaW5nJywge1xuICAvLyAyMS4xLjIuNCBTdHJpbmcucmF3KGNhbGxTaXRlLCAuLi5zdWJzdGl0dXRpb25zKVxuICByYXc6IGZ1bmN0aW9uIHJhdyhjYWxsU2l0ZSkge1xuICAgIHZhciB0cGwgPSB0b0lPYmplY3QoY2FsbFNpdGUucmF3KTtcbiAgICB2YXIgbGVuID0gdG9MZW5ndGgodHBsLmxlbmd0aCk7XG4gICAgdmFyIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciByZXMgPSBbXTtcbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKGxlbiA+IGkpIHtcbiAgICAgIHJlcy5wdXNoKFN0cmluZyh0cGxbaSsrXSkpO1xuICAgICAgaWYgKGkgPCBhTGVuKSByZXMucHVzaChTdHJpbmcoYXJndW1lbnRzW2ldKSk7XG4gICAgfSByZXR1cm4gcmVzLmpvaW4oJycpO1xuICB9XG59KTtcbiIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnU3RyaW5nJywge1xuICAvLyAyMS4xLjMuMTMgU3RyaW5nLnByb3RvdHlwZS5yZXBlYXQoY291bnQpXG4gIHJlcGVhdDogcmVxdWlyZSgnLi9fc3RyaW5nLXJlcGVhdCcpXG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjExIFN0cmluZy5wcm90b3R5cGUuc21hbGwoKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnc21hbGwnLCBmdW5jdGlvbiAoY3JlYXRlSFRNTCkge1xuICByZXR1cm4gZnVuY3Rpb24gc21hbGwoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ3NtYWxsJywgJycsICcnKTtcbiAgfTtcbn0pO1xuIiwiLy8gMjEuMS4zLjE4IFN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aChzZWFyY2hTdHJpbmcgWywgcG9zaXRpb24gXSlcbid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBjb250ZXh0ID0gcmVxdWlyZSgnLi9fc3RyaW5nLWNvbnRleHQnKTtcbnZhciBTVEFSVFNfV0lUSCA9ICdzdGFydHNXaXRoJztcbnZhciAkc3RhcnRzV2l0aCA9ICcnW1NUQVJUU19XSVRIXTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscy1pcy1yZWdleHAnKShTVEFSVFNfV0lUSCksICdTdHJpbmcnLCB7XG4gIHN0YXJ0c1dpdGg6IGZ1bmN0aW9uIHN0YXJ0c1dpdGgoc2VhcmNoU3RyaW5nIC8qICwgcG9zaXRpb24gPSAwICovKSB7XG4gICAgdmFyIHRoYXQgPSBjb250ZXh0KHRoaXMsIHNlYXJjaFN0cmluZywgU1RBUlRTX1dJVEgpO1xuICAgIHZhciBpbmRleCA9IHRvTGVuZ3RoKE1hdGgubWluKGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCB0aGF0Lmxlbmd0aCkpO1xuICAgIHZhciBzZWFyY2ggPSBTdHJpbmcoc2VhcmNoU3RyaW5nKTtcbiAgICByZXR1cm4gJHN0YXJ0c1dpdGhcbiAgICAgID8gJHN0YXJ0c1dpdGguY2FsbCh0aGF0LCBzZWFyY2gsIGluZGV4KVxuICAgICAgOiB0aGF0LnNsaWNlKGluZGV4LCBpbmRleCArIHNlYXJjaC5sZW5ndGgpID09PSBzZWFyY2g7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuMTIgU3RyaW5nLnByb3RvdHlwZS5zdHJpa2UoKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnc3RyaWtlJywgZnVuY3Rpb24gKGNyZWF0ZUhUTUwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHN0cmlrZSgpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnc3RyaWtlJywgJycsICcnKTtcbiAgfTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuMTMgU3RyaW5nLnByb3RvdHlwZS5zdWIoKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnc3ViJywgZnVuY3Rpb24gKGNyZWF0ZUhUTUwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHN1YigpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnc3ViJywgJycsICcnKTtcbiAgfTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuMTQgU3RyaW5nLnByb3RvdHlwZS5zdXAoKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnc3VwJywgZnVuY3Rpb24gKGNyZWF0ZUhUTUwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHN1cCgpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnc3VwJywgJycsICcnKTtcbiAgfTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gMjEuMS4zLjI1IFN0cmluZy5wcm90b3R5cGUudHJpbSgpXG5yZXF1aXJlKCcuL19zdHJpbmctdHJpbScpKCd0cmltJywgZnVuY3Rpb24gKCR0cmltKSB7XG4gIHJldHVybiBmdW5jdGlvbiB0cmltKCkge1xuICAgIHJldHVybiAkdHJpbSh0aGlzLCAzKTtcbiAgfTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gRUNNQVNjcmlwdCA2IHN5bWJvbHMgc2hpbVxudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIE1FVEEgPSByZXF1aXJlKCcuL19tZXRhJykuS0VZO1xudmFyICRmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgc2hhcmVkID0gcmVxdWlyZSgnLi9fc2hhcmVkJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4vX3VpZCcpO1xudmFyIHdrcyA9IHJlcXVpcmUoJy4vX3drcycpO1xudmFyIHdrc0V4dCA9IHJlcXVpcmUoJy4vX3drcy1leHQnKTtcbnZhciB3a3NEZWZpbmUgPSByZXF1aXJlKCcuL193a3MtZGVmaW5lJyk7XG52YXIgZW51bUtleXMgPSByZXF1aXJlKCcuL19lbnVtLWtleXMnKTtcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi9faXMtYXJyYXknKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xudmFyIF9jcmVhdGUgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJyk7XG52YXIgZ09QTkV4dCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuLWV4dCcpO1xudmFyICRHT1BEID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKTtcbnZhciAkR09QUyA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BzJyk7XG52YXIgJERQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgJGtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xudmFyIGdPUEQgPSAkR09QRC5mO1xudmFyIGRQID0gJERQLmY7XG52YXIgZ09QTiA9IGdPUE5FeHQuZjtcbnZhciAkU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciAkSlNPTiA9IGdsb2JhbC5KU09OO1xudmFyIF9zdHJpbmdpZnkgPSAkSlNPTiAmJiAkSlNPTi5zdHJpbmdpZnk7XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG52YXIgSElEREVOID0gd2tzKCdfaGlkZGVuJyk7XG52YXIgVE9fUFJJTUlUSVZFID0gd2tzKCd0b1ByaW1pdGl2ZScpO1xudmFyIGlzRW51bSA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xudmFyIFN5bWJvbFJlZ2lzdHJ5ID0gc2hhcmVkKCdzeW1ib2wtcmVnaXN0cnknKTtcbnZhciBBbGxTeW1ib2xzID0gc2hhcmVkKCdzeW1ib2xzJyk7XG52YXIgT1BTeW1ib2xzID0gc2hhcmVkKCdvcC1zeW1ib2xzJyk7XG52YXIgT2JqZWN0UHJvdG8gPSBPYmplY3RbUFJPVE9UWVBFXTtcbnZhciBVU0VfTkFUSVZFID0gdHlwZW9mICRTeW1ib2wgPT0gJ2Z1bmN0aW9uJyAmJiAhISRHT1BTLmY7XG52YXIgUU9iamVjdCA9IGdsb2JhbC5RT2JqZWN0O1xuLy8gRG9uJ3QgdXNlIHNldHRlcnMgaW4gUXQgU2NyaXB0LCBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMTczXG52YXIgc2V0dGVyID0gIVFPYmplY3QgfHwgIVFPYmplY3RbUFJPVE9UWVBFXSB8fCAhUU9iamVjdFtQUk9UT1RZUEVdLmZpbmRDaGlsZDtcblxuLy8gZmFsbGJhY2sgZm9yIG9sZCBBbmRyb2lkLCBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9Njg3XG52YXIgc2V0U3ltYm9sRGVzYyA9IERFU0NSSVBUT1JTICYmICRmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBfY3JlYXRlKGRQKHt9LCAnYScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRQKHRoaXMsICdhJywgeyB2YWx1ZTogNyB9KS5hOyB9XG4gIH0pKS5hICE9IDc7XG59KSA/IGZ1bmN0aW9uIChpdCwga2V5LCBEKSB7XG4gIHZhciBwcm90b0Rlc2MgPSBnT1BEKE9iamVjdFByb3RvLCBrZXkpO1xuICBpZiAocHJvdG9EZXNjKSBkZWxldGUgT2JqZWN0UHJvdG9ba2V5XTtcbiAgZFAoaXQsIGtleSwgRCk7XG4gIGlmIChwcm90b0Rlc2MgJiYgaXQgIT09IE9iamVjdFByb3RvKSBkUChPYmplY3RQcm90bywga2V5LCBwcm90b0Rlc2MpO1xufSA6IGRQO1xuXG52YXIgd3JhcCA9IGZ1bmN0aW9uICh0YWcpIHtcbiAgdmFyIHN5bSA9IEFsbFN5bWJvbHNbdGFnXSA9IF9jcmVhdGUoJFN5bWJvbFtQUk9UT1RZUEVdKTtcbiAgc3ltLl9rID0gdGFnO1xuICByZXR1cm4gc3ltO1xufTtcblxudmFyIGlzU3ltYm9sID0gVVNFX05BVElWRSAmJiB0eXBlb2YgJFN5bWJvbC5pdGVyYXRvciA9PSAnc3ltYm9sJyA/IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnO1xufSA6IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgaW5zdGFuY2VvZiAkU3ltYm9sO1xufTtcblxudmFyICRkZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KGl0LCBrZXksIEQpIHtcbiAgaWYgKGl0ID09PSBPYmplY3RQcm90bykgJGRlZmluZVByb3BlcnR5KE9QU3ltYm9scywga2V5LCBEKTtcbiAgYW5PYmplY3QoaXQpO1xuICBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpO1xuICBhbk9iamVjdChEKTtcbiAgaWYgKGhhcyhBbGxTeW1ib2xzLCBrZXkpKSB7XG4gICAgaWYgKCFELmVudW1lcmFibGUpIHtcbiAgICAgIGlmICghaGFzKGl0LCBISURERU4pKSBkUChpdCwgSElEREVOLCBjcmVhdGVEZXNjKDEsIHt9KSk7XG4gICAgICBpdFtISURERU5dW2tleV0gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaGFzKGl0LCBISURERU4pICYmIGl0W0hJRERFTl1ba2V5XSkgaXRbSElEREVOXVtrZXldID0gZmFsc2U7XG4gICAgICBEID0gX2NyZWF0ZShELCB7IGVudW1lcmFibGU6IGNyZWF0ZURlc2MoMCwgZmFsc2UpIH0pO1xuICAgIH0gcmV0dXJuIHNldFN5bWJvbERlc2MoaXQsIGtleSwgRCk7XG4gIH0gcmV0dXJuIGRQKGl0LCBrZXksIEQpO1xufTtcbnZhciAkZGVmaW5lUHJvcGVydGllcyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoaXQsIFApIHtcbiAgYW5PYmplY3QoaXQpO1xuICB2YXIga2V5cyA9IGVudW1LZXlzKFAgPSB0b0lPYmplY3QoUCkpO1xuICB2YXIgaSA9IDA7XG4gIHZhciBsID0ga2V5cy5sZW5ndGg7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChsID4gaSkgJGRlZmluZVByb3BlcnR5KGl0LCBrZXkgPSBrZXlzW2krK10sIFBba2V5XSk7XG4gIHJldHVybiBpdDtcbn07XG52YXIgJGNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShpdCwgUCkge1xuICByZXR1cm4gUCA9PT0gdW5kZWZpbmVkID8gX2NyZWF0ZShpdCkgOiAkZGVmaW5lUHJvcGVydGllcyhfY3JlYXRlKGl0KSwgUCk7XG59O1xudmFyICRwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IGZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKGtleSkge1xuICB2YXIgRSA9IGlzRW51bS5jYWxsKHRoaXMsIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSkpO1xuICBpZiAodGhpcyA9PT0gT2JqZWN0UHJvdG8gJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIWhhcyhPUFN5bWJvbHMsIGtleSkpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIEUgfHwgIWhhcyh0aGlzLCBrZXkpIHx8ICFoYXMoQWxsU3ltYm9scywga2V5KSB8fCBoYXModGhpcywgSElEREVOKSAmJiB0aGlzW0hJRERFTl1ba2V5XSA/IEUgOiB0cnVlO1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpIHtcbiAgaXQgPSB0b0lPYmplY3QoaXQpO1xuICBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpO1xuICBpZiAoaXQgPT09IE9iamVjdFByb3RvICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICFoYXMoT1BTeW1ib2xzLCBrZXkpKSByZXR1cm47XG4gIHZhciBEID0gZ09QRChpdCwga2V5KTtcbiAgaWYgKEQgJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIShoYXMoaXQsIEhJRERFTikgJiYgaXRbSElEREVOXVtrZXldKSkgRC5lbnVtZXJhYmxlID0gdHJ1ZTtcbiAgcmV0dXJuIEQ7XG59O1xudmFyICRnZXRPd25Qcm9wZXJ0eU5hbWVzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCkge1xuICB2YXIgbmFtZXMgPSBnT1BOKHRvSU9iamVjdChpdCkpO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBpID0gMDtcbiAgdmFyIGtleTtcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIHtcbiAgICBpZiAoIWhhcyhBbGxTeW1ib2xzLCBrZXkgPSBuYW1lc1tpKytdKSAmJiBrZXkgIT0gSElEREVOICYmIGtleSAhPSBNRVRBKSByZXN1bHQucHVzaChrZXkpO1xuICB9IHJldHVybiByZXN1bHQ7XG59O1xudmFyICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaXQpIHtcbiAgdmFyIElTX09QID0gaXQgPT09IE9iamVjdFByb3RvO1xuICB2YXIgbmFtZXMgPSBnT1BOKElTX09QID8gT1BTeW1ib2xzIDogdG9JT2JqZWN0KGl0KSk7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGkgPSAwO1xuICB2YXIga2V5O1xuICB3aGlsZSAobmFtZXMubGVuZ3RoID4gaSkge1xuICAgIGlmIChoYXMoQWxsU3ltYm9scywga2V5ID0gbmFtZXNbaSsrXSkgJiYgKElTX09QID8gaGFzKE9iamVjdFByb3RvLCBrZXkpIDogdHJ1ZSkpIHJlc3VsdC5wdXNoKEFsbFN5bWJvbHNba2V5XSk7XG4gIH0gcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vIDE5LjQuMS4xIFN5bWJvbChbZGVzY3JpcHRpb25dKVxuaWYgKCFVU0VfTkFUSVZFKSB7XG4gICRTeW1ib2wgPSBmdW5jdGlvbiBTeW1ib2woKSB7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiAkU3ltYm9sKSB0aHJvdyBUeXBlRXJyb3IoJ1N5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciEnKTtcbiAgICB2YXIgdGFnID0gdWlkKGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTtcbiAgICB2YXIgJHNldCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgaWYgKHRoaXMgPT09IE9iamVjdFByb3RvKSAkc2V0LmNhbGwoT1BTeW1ib2xzLCB2YWx1ZSk7XG4gICAgICBpZiAoaGFzKHRoaXMsIEhJRERFTikgJiYgaGFzKHRoaXNbSElEREVOXSwgdGFnKSkgdGhpc1tISURERU5dW3RhZ10gPSBmYWxzZTtcbiAgICAgIHNldFN5bWJvbERlc2ModGhpcywgdGFnLCBjcmVhdGVEZXNjKDEsIHZhbHVlKSk7XG4gICAgfTtcbiAgICBpZiAoREVTQ1JJUFRPUlMgJiYgc2V0dGVyKSBzZXRTeW1ib2xEZXNjKE9iamVjdFByb3RvLCB0YWcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCBzZXQ6ICRzZXQgfSk7XG4gICAgcmV0dXJuIHdyYXAodGFnKTtcbiAgfTtcbiAgcmVkZWZpbmUoJFN5bWJvbFtQUk9UT1RZUEVdLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5faztcbiAgfSk7XG5cbiAgJEdPUEQuZiA9ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG4gICREUC5mID0gJGRlZmluZVByb3BlcnR5O1xuICByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmYgPSBnT1BORXh0LmYgPSAkZ2V0T3duUHJvcGVydHlOYW1lcztcbiAgcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpLmYgPSAkcHJvcGVydHlJc0VudW1lcmFibGU7XG4gICRHT1BTLmYgPSAkZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG4gIGlmIChERVNDUklQVE9SUyAmJiAhcmVxdWlyZSgnLi9fbGlicmFyeScpKSB7XG4gICAgcmVkZWZpbmUoT2JqZWN0UHJvdG8sICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsICRwcm9wZXJ0eUlzRW51bWVyYWJsZSwgdHJ1ZSk7XG4gIH1cblxuICB3a3NFeHQuZiA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIHdyYXAod2tzKG5hbWUpKTtcbiAgfTtcbn1cblxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgeyBTeW1ib2w6ICRTeW1ib2wgfSk7XG5cbmZvciAodmFyIGVzNlN5bWJvbHMgPSAoXG4gIC8vIDE5LjQuMi4yLCAxOS40LjIuMywgMTkuNC4yLjQsIDE5LjQuMi42LCAxOS40LjIuOCwgMTkuNC4yLjksIDE5LjQuMi4xMCwgMTkuNC4yLjExLCAxOS40LjIuMTIsIDE5LjQuMi4xMywgMTkuNC4yLjE0XG4gICdoYXNJbnN0YW5jZSxpc0NvbmNhdFNwcmVhZGFibGUsaXRlcmF0b3IsbWF0Y2gscmVwbGFjZSxzZWFyY2gsc3BlY2llcyxzcGxpdCx0b1ByaW1pdGl2ZSx0b1N0cmluZ1RhZyx1bnNjb3BhYmxlcydcbikuc3BsaXQoJywnKSwgaiA9IDA7IGVzNlN5bWJvbHMubGVuZ3RoID4gajspd2tzKGVzNlN5bWJvbHNbaisrXSk7XG5cbmZvciAodmFyIHdlbGxLbm93blN5bWJvbHMgPSAka2V5cyh3a3Muc3RvcmUpLCBrID0gMDsgd2VsbEtub3duU3ltYm9scy5sZW5ndGggPiBrOykgd2tzRGVmaW5lKHdlbGxLbm93blN5bWJvbHNbaysrXSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsICdTeW1ib2wnLCB7XG4gIC8vIDE5LjQuMi4xIFN5bWJvbC5mb3Ioa2V5KVxuICAnZm9yJzogZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBoYXMoU3ltYm9sUmVnaXN0cnksIGtleSArPSAnJylcbiAgICAgID8gU3ltYm9sUmVnaXN0cnlba2V5XVxuICAgICAgOiBTeW1ib2xSZWdpc3RyeVtrZXldID0gJFN5bWJvbChrZXkpO1xuICB9LFxuICAvLyAxOS40LjIuNSBTeW1ib2wua2V5Rm9yKHN5bSlcbiAga2V5Rm9yOiBmdW5jdGlvbiBrZXlGb3Ioc3ltKSB7XG4gICAgaWYgKCFpc1N5bWJvbChzeW0pKSB0aHJvdyBUeXBlRXJyb3Ioc3ltICsgJyBpcyBub3QgYSBzeW1ib2whJyk7XG4gICAgZm9yICh2YXIga2V5IGluIFN5bWJvbFJlZ2lzdHJ5KSBpZiAoU3ltYm9sUmVnaXN0cnlba2V5XSA9PT0gc3ltKSByZXR1cm4ga2V5O1xuICB9LFxuICB1c2VTZXR0ZXI6IGZ1bmN0aW9uICgpIHsgc2V0dGVyID0gdHJ1ZTsgfSxcbiAgdXNlU2ltcGxlOiBmdW5jdGlvbiAoKSB7IHNldHRlciA9IGZhbHNlOyB9XG59KTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgJ09iamVjdCcsIHtcbiAgLy8gMTkuMS4yLjIgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxuICBjcmVhdGU6ICRjcmVhdGUsXG4gIC8vIDE5LjEuMi40IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKVxuICBkZWZpbmVQcm9wZXJ0eTogJGRlZmluZVByb3BlcnR5LFxuICAvLyAxOS4xLjIuMyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKVxuICBkZWZpbmVQcm9wZXJ0aWVzOiAkZGVmaW5lUHJvcGVydGllcyxcbiAgLy8gMTkuMS4yLjYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKVxuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG4gIC8vIDE5LjEuMi43IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE8pXG4gIGdldE93blByb3BlcnR5TmFtZXM6ICRnZXRPd25Qcm9wZXJ0eU5hbWVzLFxuICAvLyAxOS4xLjIuOCBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKE8pXG4gIGdldE93blByb3BlcnR5U3ltYm9sczogJGdldE93blByb3BlcnR5U3ltYm9sc1xufSk7XG5cbi8vIENocm9tZSAzOCBhbmQgMzkgYE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHNgIGZhaWxzIG9uIHByaW1pdGl2ZXNcbi8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTM0NDNcbnZhciBGQUlMU19PTl9QUklNSVRJVkVTID0gJGZhaWxzKGZ1bmN0aW9uICgpIHsgJEdPUFMuZigxKTsgfSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogRkFJTFNfT05fUFJJTUlUSVZFUywgJ09iamVjdCcsIHtcbiAgZ2V0T3duUHJvcGVydHlTeW1ib2xzOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaXQpIHtcbiAgICByZXR1cm4gJEdPUFMuZih0b09iamVjdChpdCkpO1xuICB9XG59KTtcblxuLy8gMjQuMy4yIEpTT04uc3RyaW5naWZ5KHZhbHVlIFssIHJlcGxhY2VyIFssIHNwYWNlXV0pXG4kSlNPTiAmJiAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICghVVNFX05BVElWRSB8fCAkZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgUyA9ICRTeW1ib2woKTtcbiAgLy8gTVMgRWRnZSBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMge31cbiAgLy8gV2ViS2l0IGNvbnZlcnRzIHN5bWJvbCB2YWx1ZXMgdG8gSlNPTiBhcyBudWxsXG4gIC8vIFY4IHRocm93cyBvbiBib3hlZCBzeW1ib2xzXG4gIHJldHVybiBfc3RyaW5naWZ5KFtTXSkgIT0gJ1tudWxsXScgfHwgX3N0cmluZ2lmeSh7IGE6IFMgfSkgIT0gJ3t9JyB8fCBfc3RyaW5naWZ5KE9iamVjdChTKSkgIT0gJ3t9Jztcbn0pKSwgJ0pTT04nLCB7XG4gIHN0cmluZ2lmeTogZnVuY3Rpb24gc3RyaW5naWZ5KGl0KSB7XG4gICAgdmFyIGFyZ3MgPSBbaXRdO1xuICAgIHZhciBpID0gMTtcbiAgICB2YXIgcmVwbGFjZXIsICRyZXBsYWNlcjtcbiAgICB3aGlsZSAoYXJndW1lbnRzLmxlbmd0aCA+IGkpIGFyZ3MucHVzaChhcmd1bWVudHNbaSsrXSk7XG4gICAgJHJlcGxhY2VyID0gcmVwbGFjZXIgPSBhcmdzWzFdO1xuICAgIGlmICghaXNPYmplY3QocmVwbGFjZXIpICYmIGl0ID09PSB1bmRlZmluZWQgfHwgaXNTeW1ib2woaXQpKSByZXR1cm47IC8vIElFOCByZXR1cm5zIHN0cmluZyBvbiB1bmRlZmluZWRcbiAgICBpZiAoIWlzQXJyYXkocmVwbGFjZXIpKSByZXBsYWNlciA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mICRyZXBsYWNlciA9PSAnZnVuY3Rpb24nKSB2YWx1ZSA9ICRyZXBsYWNlci5jYWxsKHRoaXMsIGtleSwgdmFsdWUpO1xuICAgICAgaWYgKCFpc1N5bWJvbCh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIGFyZ3NbMV0gPSByZXBsYWNlcjtcbiAgICByZXR1cm4gX3N0cmluZ2lmeS5hcHBseSgkSlNPTiwgYXJncyk7XG4gIH1cbn0pO1xuXG4vLyAxOS40LjMuNCBTeW1ib2wucHJvdG90eXBlW0BAdG9QcmltaXRpdmVdKGhpbnQpXG4kU3ltYm9sW1BST1RPVFlQRV1bVE9fUFJJTUlUSVZFXSB8fCByZXF1aXJlKCcuL19oaWRlJykoJFN5bWJvbFtQUk9UT1RZUEVdLCBUT19QUklNSVRJVkUsICRTeW1ib2xbUFJPVE9UWVBFXS52YWx1ZU9mKTtcbi8vIDE5LjQuMy41IFN5bWJvbC5wcm90b3R5cGVbQEB0b1N0cmluZ1RhZ11cbnNldFRvU3RyaW5nVGFnKCRTeW1ib2wsICdTeW1ib2wnKTtcbi8vIDIwLjIuMS45IE1hdGhbQEB0b1N0cmluZ1RhZ11cbnNldFRvU3RyaW5nVGFnKE1hdGgsICdNYXRoJywgdHJ1ZSk7XG4vLyAyNC4zLjMgSlNPTltAQHRvU3RyaW5nVGFnXVxuc2V0VG9TdHJpbmdUYWcoZ2xvYmFsLkpTT04sICdKU09OJywgdHJ1ZSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICR0eXBlZCA9IHJlcXVpcmUoJy4vX3R5cGVkJyk7XG52YXIgYnVmZmVyID0gcmVxdWlyZSgnLi9fdHlwZWQtYnVmZmVyJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuL190by1hYnNvbHV0ZS1pbmRleCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBBcnJheUJ1ZmZlciA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLkFycmF5QnVmZmVyO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4vX3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciAkQXJyYXlCdWZmZXIgPSBidWZmZXIuQXJyYXlCdWZmZXI7XG52YXIgJERhdGFWaWV3ID0gYnVmZmVyLkRhdGFWaWV3O1xudmFyICRpc1ZpZXcgPSAkdHlwZWQuQUJWICYmIEFycmF5QnVmZmVyLmlzVmlldztcbnZhciAkc2xpY2UgPSAkQXJyYXlCdWZmZXIucHJvdG90eXBlLnNsaWNlO1xudmFyIFZJRVcgPSAkdHlwZWQuVklFVztcbnZhciBBUlJBWV9CVUZGRVIgPSAnQXJyYXlCdWZmZXInO1xuXG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqIChBcnJheUJ1ZmZlciAhPT0gJEFycmF5QnVmZmVyKSwgeyBBcnJheUJ1ZmZlcjogJEFycmF5QnVmZmVyIH0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICEkdHlwZWQuQ09OU1RSLCBBUlJBWV9CVUZGRVIsIHtcbiAgLy8gMjQuMS4zLjEgQXJyYXlCdWZmZXIuaXNWaWV3KGFyZylcbiAgaXNWaWV3OiBmdW5jdGlvbiBpc1ZpZXcoaXQpIHtcbiAgICByZXR1cm4gJGlzVmlldyAmJiAkaXNWaWV3KGl0KSB8fCBpc09iamVjdChpdCkgJiYgVklFVyBpbiBpdDtcbiAgfVxufSk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5VICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAhbmV3ICRBcnJheUJ1ZmZlcigyKS5zbGljZSgxLCB1bmRlZmluZWQpLmJ5dGVMZW5ndGg7XG59KSwgQVJSQVlfQlVGRkVSLCB7XG4gIC8vIDI0LjEuNC4zIEFycmF5QnVmZmVyLnByb3RvdHlwZS5zbGljZShzdGFydCwgZW5kKVxuICBzbGljZTogZnVuY3Rpb24gc2xpY2Uoc3RhcnQsIGVuZCkge1xuICAgIGlmICgkc2xpY2UgIT09IHVuZGVmaW5lZCAmJiBlbmQgPT09IHVuZGVmaW5lZCkgcmV0dXJuICRzbGljZS5jYWxsKGFuT2JqZWN0KHRoaXMpLCBzdGFydCk7IC8vIEZGIGZpeFxuICAgIHZhciBsZW4gPSBhbk9iamVjdCh0aGlzKS5ieXRlTGVuZ3RoO1xuICAgIHZhciBmaXJzdCA9IHRvQWJzb2x1dGVJbmRleChzdGFydCwgbGVuKTtcbiAgICB2YXIgZmluID0gdG9BYnNvbHV0ZUluZGV4KGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogZW5kLCBsZW4pO1xuICAgIHZhciByZXN1bHQgPSBuZXcgKHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCAkQXJyYXlCdWZmZXIpKSh0b0xlbmd0aChmaW4gLSBmaXJzdCkpO1xuICAgIHZhciB2aWV3UyA9IG5ldyAkRGF0YVZpZXcodGhpcyk7XG4gICAgdmFyIHZpZXdUID0gbmV3ICREYXRhVmlldyhyZXN1bHQpO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgd2hpbGUgKGZpcnN0IDwgZmluKSB7XG4gICAgICB2aWV3VC5zZXRVaW50OChpbmRleCsrLCB2aWV3Uy5nZXRVaW50OChmaXJzdCsrKSk7XG4gICAgfSByZXR1cm4gcmVzdWx0O1xuICB9XG59KTtcblxucmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKShBUlJBWV9CVUZGRVIpO1xuIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX3R5cGVkJykuQUJWLCB7XG4gIERhdGFWaWV3OiByZXF1aXJlKCcuL190eXBlZC1idWZmZXInKS5EYXRhVmlld1xufSk7XG4iLCJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdGbG9hdDMyJywgNCwgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIEZsb2F0MzJBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSk7XG4iLCJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdGbG9hdDY0JywgOCwgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIEZsb2F0NjRBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSk7XG4iLCJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdJbnQxNicsIDIsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBJbnQxNkFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcbiIsInJlcXVpcmUoJy4vX3R5cGVkLWFycmF5JykoJ0ludDMyJywgNCwgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIEludDMyQXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfTtcbn0pO1xuIiwicmVxdWlyZSgnLi9fdHlwZWQtYXJyYXknKSgnSW50OCcsIDEsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBJbnQ4QXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfTtcbn0pO1xuIiwicmVxdWlyZSgnLi9fdHlwZWQtYXJyYXknKSgnVWludDE2JywgMiwgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFVpbnQxNkFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcbiIsInJlcXVpcmUoJy4vX3R5cGVkLWFycmF5JykoJ1VpbnQzMicsIDQsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBVaW50MzJBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSk7XG4iLCJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdVaW50OCcsIDEsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBVaW50OEFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcbiIsInJlcXVpcmUoJy4vX3R5cGVkLWFycmF5JykoJ1VpbnQ4JywgMSwgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFVpbnQ4Q2xhbXBlZEFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59LCB0cnVlKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBlYWNoID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpKDApO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbnZhciBtZXRhID0gcmVxdWlyZSgnLi9fbWV0YScpO1xudmFyIGFzc2lnbiA9IHJlcXVpcmUoJy4vX29iamVjdC1hc3NpZ24nKTtcbnZhciB3ZWFrID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbi13ZWFrJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciB2YWxpZGF0ZSA9IHJlcXVpcmUoJy4vX3ZhbGlkYXRlLWNvbGxlY3Rpb24nKTtcbnZhciBOQVRJVkVfV0VBS19NQVAgPSByZXF1aXJlKCcuL192YWxpZGF0ZS1jb2xsZWN0aW9uJyk7XG52YXIgSVNfSUUxMSA9ICFnbG9iYWwuQWN0aXZlWE9iamVjdCAmJiAnQWN0aXZlWE9iamVjdCcgaW4gZ2xvYmFsO1xudmFyIFdFQUtfTUFQID0gJ1dlYWtNYXAnO1xudmFyIGdldFdlYWsgPSBtZXRhLmdldFdlYWs7XG52YXIgaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZTtcbnZhciB1bmNhdWdodEZyb3plblN0b3JlID0gd2Vhay51ZnN0b3JlO1xudmFyIEludGVybmFsTWFwO1xuXG52YXIgd3JhcHBlciA9IGZ1bmN0aW9uIChnZXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFdlYWtNYXAoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7XG4gIH07XG59O1xuXG52YXIgbWV0aG9kcyA9IHtcbiAgLy8gMjMuMy4zLjMgV2Vha01hcC5wcm90b3R5cGUuZ2V0KGtleSlcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgaWYgKGlzT2JqZWN0KGtleSkpIHtcbiAgICAgIHZhciBkYXRhID0gZ2V0V2VhayhrZXkpO1xuICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHJldHVybiB1bmNhdWdodEZyb3plblN0b3JlKHZhbGlkYXRlKHRoaXMsIFdFQUtfTUFQKSkuZ2V0KGtleSk7XG4gICAgICByZXR1cm4gZGF0YSA/IGRhdGFbdGhpcy5faV0gOiB1bmRlZmluZWQ7XG4gICAgfVxuICB9LFxuICAvLyAyMy4zLjMuNSBXZWFrTWFwLnByb3RvdHlwZS5zZXQoa2V5LCB2YWx1ZSlcbiAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiB3ZWFrLmRlZih2YWxpZGF0ZSh0aGlzLCBXRUFLX01BUCksIGtleSwgdmFsdWUpO1xuICB9XG59O1xuXG4vLyAyMy4zIFdlYWtNYXAgT2JqZWN0c1xudmFyICRXZWFrTWFwID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19jb2xsZWN0aW9uJykoV0VBS19NQVAsIHdyYXBwZXIsIG1ldGhvZHMsIHdlYWssIHRydWUsIHRydWUpO1xuXG4vLyBJRTExIFdlYWtNYXAgZnJvemVuIGtleXMgZml4XG5pZiAoTkFUSVZFX1dFQUtfTUFQICYmIElTX0lFMTEpIHtcbiAgSW50ZXJuYWxNYXAgPSB3ZWFrLmdldENvbnN0cnVjdG9yKHdyYXBwZXIsIFdFQUtfTUFQKTtcbiAgYXNzaWduKEludGVybmFsTWFwLnByb3RvdHlwZSwgbWV0aG9kcyk7XG4gIG1ldGEuTkVFRCA9IHRydWU7XG4gIGVhY2goWydkZWxldGUnLCAnaGFzJywgJ2dldCcsICdzZXQnXSwgZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBwcm90byA9ICRXZWFrTWFwLnByb3RvdHlwZTtcbiAgICB2YXIgbWV0aG9kID0gcHJvdG9ba2V5XTtcbiAgICByZWRlZmluZShwcm90bywga2V5LCBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgLy8gc3RvcmUgZnJvemVuIG9iamVjdHMgb24gaW50ZXJuYWwgd2Vha21hcCBzaGltXG4gICAgICBpZiAoaXNPYmplY3QoYSkgJiYgIWlzRXh0ZW5zaWJsZShhKSkge1xuICAgICAgICBpZiAoIXRoaXMuX2YpIHRoaXMuX2YgPSBuZXcgSW50ZXJuYWxNYXAoKTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX2Zba2V5XShhLCBiKTtcbiAgICAgICAgcmV0dXJuIGtleSA9PSAnc2V0JyA/IHRoaXMgOiByZXN1bHQ7XG4gICAgICAvLyBzdG9yZSBhbGwgdGhlIHJlc3Qgb24gbmF0aXZlIHdlYWttYXBcbiAgICAgIH0gcmV0dXJuIG1ldGhvZC5jYWxsKHRoaXMsIGEsIGIpO1xuICAgIH0pO1xuICB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcbnZhciB3ZWFrID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbi13ZWFrJyk7XG52YXIgdmFsaWRhdGUgPSByZXF1aXJlKCcuL192YWxpZGF0ZS1jb2xsZWN0aW9uJyk7XG52YXIgV0VBS19TRVQgPSAnV2Vha1NldCc7XG5cbi8vIDIzLjQgV2Vha1NldCBPYmplY3RzXG5yZXF1aXJlKCcuL19jb2xsZWN0aW9uJykoV0VBS19TRVQsIGZ1bmN0aW9uIChnZXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFdlYWtTZXQoKSB7IHJldHVybiBnZXQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpOyB9O1xufSwge1xuICAvLyAyMy40LjMuMSBXZWFrU2V0LnByb3RvdHlwZS5hZGQodmFsdWUpXG4gIGFkZDogZnVuY3Rpb24gYWRkKHZhbHVlKSB7XG4gICAgcmV0dXJuIHdlYWsuZGVmKHZhbGlkYXRlKHRoaXMsIFdFQUtfU0VUKSwgdmFsdWUsIHRydWUpO1xuICB9XG59LCB3ZWFrLCBmYWxzZSwgdHJ1ZSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLWZsYXRNYXAvI3NlYy1BcnJheS5wcm90b3R5cGUuZmxhdE1hcFxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBmbGF0dGVuSW50b0FycmF5ID0gcmVxdWlyZSgnLi9fZmxhdHRlbi1pbnRvLWFycmF5Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbnZhciBhcnJheVNwZWNpZXNDcmVhdGUgPSByZXF1aXJlKCcuL19hcnJheS1zcGVjaWVzLWNyZWF0ZScpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCwgJ0FycmF5Jywge1xuICBmbGF0TWFwOiBmdW5jdGlvbiBmbGF0TWFwKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgICB2YXIgc291cmNlTGVuLCBBO1xuICAgIGFGdW5jdGlvbihjYWxsYmFja2ZuKTtcbiAgICBzb3VyY2VMZW4gPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgQSA9IGFycmF5U3BlY2llc0NyZWF0ZShPLCAwKTtcbiAgICBmbGF0dGVuSW50b0FycmF5KEEsIE8sIE8sIHNvdXJjZUxlbiwgMCwgMSwgY2FsbGJhY2tmbiwgYXJndW1lbnRzWzFdKTtcbiAgICByZXR1cm4gQTtcbiAgfVxufSk7XG5cbnJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpKCdmbGF0TWFwJyk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLWZsYXRNYXAvI3NlYy1BcnJheS5wcm90b3R5cGUuZmxhdHRlblxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBmbGF0dGVuSW50b0FycmF5ID0gcmVxdWlyZSgnLi9fZmxhdHRlbi1pbnRvLWFycmF5Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciBhcnJheVNwZWNpZXNDcmVhdGUgPSByZXF1aXJlKCcuL19hcnJheS1zcGVjaWVzLWNyZWF0ZScpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCwgJ0FycmF5Jywge1xuICBmbGF0dGVuOiBmdW5jdGlvbiBmbGF0dGVuKC8qIGRlcHRoQXJnID0gMSAqLykge1xuICAgIHZhciBkZXB0aEFyZyA9IGFyZ3VtZW50c1swXTtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpO1xuICAgIHZhciBzb3VyY2VMZW4gPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgdmFyIEEgPSBhcnJheVNwZWNpZXNDcmVhdGUoTywgMCk7XG4gICAgZmxhdHRlbkludG9BcnJheShBLCBPLCBPLCBzb3VyY2VMZW4sIDAsIGRlcHRoQXJnID09PSB1bmRlZmluZWQgPyAxIDogdG9JbnRlZ2VyKGRlcHRoQXJnKSk7XG4gICAgcmV0dXJuIEE7XG4gIH1cbn0pO1xuXG5yZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKSgnZmxhdHRlbicpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRpbmNsdWRlcyA9IHJlcXVpcmUoJy4vX2FycmF5LWluY2x1ZGVzJykodHJ1ZSk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnQXJyYXknLCB7XG4gIGluY2x1ZGVzOiBmdW5jdGlvbiBpbmNsdWRlcyhlbCAvKiAsIGZyb21JbmRleCA9IDAgKi8pIHtcbiAgICByZXR1cm4gJGluY2x1ZGVzKHRoaXMsIGVsLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xuXG5yZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKSgnaW5jbHVkZXMnKTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yd2FsZHJvbi90YzM5LW5vdGVzL2Jsb2IvbWFzdGVyL2VzNi8yMDE0LTA5L3NlcHQtMjUubWQjNTEwLWdsb2JhbGFzYXAtZm9yLWVucXVldWluZy1hLW1pY3JvdGFza1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBtaWNyb3Rhc2sgPSByZXF1aXJlKCcuL19taWNyb3Rhc2snKSgpO1xudmFyIHByb2Nlc3MgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5wcm9jZXNzO1xudmFyIGlzTm9kZSA9IHJlcXVpcmUoJy4vX2NvZicpKHByb2Nlc3MpID09ICdwcm9jZXNzJztcblxuJGV4cG9ydCgkZXhwb3J0LkcsIHtcbiAgYXNhcDogZnVuY3Rpb24gYXNhcChmbikge1xuICAgIHZhciBkb21haW4gPSBpc05vZGUgJiYgcHJvY2Vzcy5kb21haW47XG4gICAgbWljcm90YXNrKGRvbWFpbiA/IGRvbWFpbi5iaW5kKGZuKSA6IGZuKTtcbiAgfVxufSk7XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vbGpoYXJiL3Byb3Bvc2FsLWlzLWVycm9yXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ0Vycm9yJywge1xuICBpc0Vycm9yOiBmdW5jdGlvbiBpc0Vycm9yKGl0KSB7XG4gICAgcmV0dXJuIGNvZihpdCkgPT09ICdFcnJvcic7XG4gIH1cbn0pO1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtZ2xvYmFsXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuRywgeyBnbG9iYWw6IHJlcXVpcmUoJy4vX2dsb2JhbCcpIH0pO1xuIiwiLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tLyNzZWMtbWFwLmZyb21cbnJlcXVpcmUoJy4vX3NldC1jb2xsZWN0aW9uLWZyb20nKSgnTWFwJyk7XG4iLCIvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vI3NlYy1tYXAub2ZcbnJlcXVpcmUoJy4vX3NldC1jb2xsZWN0aW9uLW9mJykoJ01hcCcpO1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL0RhdmlkQnJ1YW50L01hcC1TZXQucHJvdG90eXBlLnRvSlNPTlxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LlIsICdNYXAnLCB7IHRvSlNPTjogcmVxdWlyZSgnLi9fY29sbGVjdGlvbi10by1qc29uJykoJ01hcCcpIH0pO1xuIiwiLy8gaHR0cHM6Ly9yd2FsZHJvbi5naXRodWIuaW8vcHJvcG9zYWwtbWF0aC1leHRlbnNpb25zL1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBjbGFtcDogZnVuY3Rpb24gY2xhbXAoeCwgbG93ZXIsIHVwcGVyKSB7XG4gICAgcmV0dXJuIE1hdGgubWluKHVwcGVyLCBNYXRoLm1heChsb3dlciwgeCkpO1xuICB9XG59KTtcbiIsIi8vIGh0dHBzOi8vcndhbGRyb24uZ2l0aHViLmlvL3Byb3Bvc2FsLW1hdGgtZXh0ZW5zaW9ucy9cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHsgREVHX1BFUl9SQUQ6IE1hdGguUEkgLyAxODAgfSk7XG4iLCIvLyBodHRwczovL3J3YWxkcm9uLmdpdGh1Yi5pby9wcm9wb3NhbC1tYXRoLWV4dGVuc2lvbnMvXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIFJBRF9QRVJfREVHID0gMTgwIC8gTWF0aC5QSTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBkZWdyZWVzOiBmdW5jdGlvbiBkZWdyZWVzKHJhZGlhbnMpIHtcbiAgICByZXR1cm4gcmFkaWFucyAqIFJBRF9QRVJfREVHO1xuICB9XG59KTtcbiIsIi8vIGh0dHBzOi8vcndhbGRyb24uZ2l0aHViLmlvL3Byb3Bvc2FsLW1hdGgtZXh0ZW5zaW9ucy9cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgc2NhbGUgPSByZXF1aXJlKCcuL19tYXRoLXNjYWxlJyk7XG52YXIgZnJvdW5kID0gcmVxdWlyZSgnLi9fbWF0aC1mcm91bmQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBmc2NhbGU6IGZ1bmN0aW9uIGZzY2FsZSh4LCBpbkxvdywgaW5IaWdoLCBvdXRMb3csIG91dEhpZ2gpIHtcbiAgICByZXR1cm4gZnJvdW5kKHNjYWxlKHgsIGluTG93LCBpbkhpZ2gsIG91dExvdywgb3V0SGlnaCkpO1xuICB9XG59KTtcbiIsIi8vIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL0JyZW5kYW5FaWNoLzQyOTRkNWMyMTJhNmQyMjU0NzAzXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGlhZGRoOiBmdW5jdGlvbiBpYWRkaCh4MCwgeDEsIHkwLCB5MSkge1xuICAgIHZhciAkeDAgPSB4MCA+Pj4gMDtcbiAgICB2YXIgJHgxID0geDEgPj4+IDA7XG4gICAgdmFyICR5MCA9IHkwID4+PiAwO1xuICAgIHJldHVybiAkeDEgKyAoeTEgPj4+IDApICsgKCgkeDAgJiAkeTAgfCAoJHgwIHwgJHkwKSAmIH4oJHgwICsgJHkwID4+PiAwKSkgPj4+IDMxKSB8IDA7XG4gIH1cbn0pO1xuIiwiLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vQnJlbmRhbkVpY2gvNDI5NGQ1YzIxMmE2ZDIyNTQ3MDNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgaW11bGg6IGZ1bmN0aW9uIGltdWxoKHUsIHYpIHtcbiAgICB2YXIgVUlOVDE2ID0gMHhmZmZmO1xuICAgIHZhciAkdSA9ICt1O1xuICAgIHZhciAkdiA9ICt2O1xuICAgIHZhciB1MCA9ICR1ICYgVUlOVDE2O1xuICAgIHZhciB2MCA9ICR2ICYgVUlOVDE2O1xuICAgIHZhciB1MSA9ICR1ID4+IDE2O1xuICAgIHZhciB2MSA9ICR2ID4+IDE2O1xuICAgIHZhciB0ID0gKHUxICogdjAgPj4+IDApICsgKHUwICogdjAgPj4+IDE2KTtcbiAgICByZXR1cm4gdTEgKiB2MSArICh0ID4+IDE2KSArICgodTAgKiB2MSA+Pj4gMCkgKyAodCAmIFVJTlQxNikgPj4gMTYpO1xuICB9XG59KTtcbiIsIi8vIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL0JyZW5kYW5FaWNoLzQyOTRkNWMyMTJhNmQyMjU0NzAzXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGlzdWJoOiBmdW5jdGlvbiBpc3ViaCh4MCwgeDEsIHkwLCB5MSkge1xuICAgIHZhciAkeDAgPSB4MCA+Pj4gMDtcbiAgICB2YXIgJHgxID0geDEgPj4+IDA7XG4gICAgdmFyICR5MCA9IHkwID4+PiAwO1xuICAgIHJldHVybiAkeDEgLSAoeTEgPj4+IDApIC0gKCh+JHgwICYgJHkwIHwgfigkeDAgXiAkeTApICYgJHgwIC0gJHkwID4+PiAwKSA+Pj4gMzEpIHwgMDtcbiAgfVxufSk7XG4iLCIvLyBodHRwczovL3J3YWxkcm9uLmdpdGh1Yi5pby9wcm9wb3NhbC1tYXRoLWV4dGVuc2lvbnMvXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7IFJBRF9QRVJfREVHOiAxODAgLyBNYXRoLlBJIH0pO1xuIiwiLy8gaHR0cHM6Ly9yd2FsZHJvbi5naXRodWIuaW8vcHJvcG9zYWwtbWF0aC1leHRlbnNpb25zL1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBERUdfUEVSX1JBRCA9IE1hdGguUEkgLyAxODA7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgcmFkaWFuczogZnVuY3Rpb24gcmFkaWFucyhkZWdyZWVzKSB7XG4gICAgcmV0dXJuIGRlZ3JlZXMgKiBERUdfUEVSX1JBRDtcbiAgfVxufSk7XG4iLCIvLyBodHRwczovL3J3YWxkcm9uLmdpdGh1Yi5pby9wcm9wb3NhbC1tYXRoLWV4dGVuc2lvbnMvXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7IHNjYWxlOiByZXF1aXJlKCcuL19tYXRoLXNjYWxlJykgfSk7XG4iLCIvLyBodHRwOi8vamZiYXN0aWVuLmdpdGh1Yi5pby9wYXBlcnMvTWF0aC5zaWduYml0Lmh0bWxcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHsgc2lnbmJpdDogZnVuY3Rpb24gc2lnbmJpdCh4KSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgcmV0dXJuICh4ID0gK3gpICE9IHggPyB4IDogeCA9PSAwID8gMSAvIHggPT0gSW5maW5pdHkgOiB4ID4gMDtcbn0gfSk7XG4iLCIvLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9CcmVuZGFuRWljaC80Mjk0ZDVjMjEyYTZkMjI1NDcwM1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICB1bXVsaDogZnVuY3Rpb24gdW11bGgodSwgdikge1xuICAgIHZhciBVSU5UMTYgPSAweGZmZmY7XG4gICAgdmFyICR1ID0gK3U7XG4gICAgdmFyICR2ID0gK3Y7XG4gICAgdmFyIHUwID0gJHUgJiBVSU5UMTY7XG4gICAgdmFyIHYwID0gJHYgJiBVSU5UMTY7XG4gICAgdmFyIHUxID0gJHUgPj4+IDE2O1xuICAgIHZhciB2MSA9ICR2ID4+PiAxNjtcbiAgICB2YXIgdCA9ICh1MSAqIHYwID4+PiAwKSArICh1MCAqIHYwID4+PiAxNik7XG4gICAgcmV0dXJuIHUxICogdjEgKyAodCA+Pj4gMTYpICsgKCh1MCAqIHYxID4+PiAwKSArICh0ICYgVUlOVDE2KSA+Pj4gMTYpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgJGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG5cbi8vIEIuMi4yLjIgT2JqZWN0LnByb3RvdHlwZS5fX2RlZmluZUdldHRlcl9fKFAsIGdldHRlcilcbnJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgJGV4cG9ydCgkZXhwb3J0LlAgKyByZXF1aXJlKCcuL19vYmplY3QtZm9yY2VkLXBhbScpLCAnT2JqZWN0Jywge1xuICBfX2RlZmluZUdldHRlcl9fOiBmdW5jdGlvbiBfX2RlZmluZUdldHRlcl9fKFAsIGdldHRlcikge1xuICAgICRkZWZpbmVQcm9wZXJ0eS5mKHRvT2JqZWN0KHRoaXMpLCBQLCB7IGdldDogYUZ1bmN0aW9uKGdldHRlciksIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyICRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xuXG4vLyBCLjIuMi4zIE9iamVjdC5wcm90b3R5cGUuX19kZWZpbmVTZXR0ZXJfXyhQLCBzZXR0ZXIpXG5yZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICRleHBvcnQoJGV4cG9ydC5QICsgcmVxdWlyZSgnLi9fb2JqZWN0LWZvcmNlZC1wYW0nKSwgJ09iamVjdCcsIHtcbiAgX19kZWZpbmVTZXR0ZXJfXzogZnVuY3Rpb24gX19kZWZpbmVTZXR0ZXJfXyhQLCBzZXR0ZXIpIHtcbiAgICAkZGVmaW5lUHJvcGVydHkuZih0b09iamVjdCh0aGlzKSwgUCwgeyBzZXQ6IGFGdW5jdGlvbihzZXR0ZXIpLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSk7XG4gIH1cbn0pO1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtb2JqZWN0LXZhbHVlcy1lbnRyaWVzXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRlbnRyaWVzID0gcmVxdWlyZSgnLi9fb2JqZWN0LXRvLWFycmF5JykodHJ1ZSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0Jywge1xuICBlbnRyaWVzOiBmdW5jdGlvbiBlbnRyaWVzKGl0KSB7XG4gICAgcmV0dXJuICRlbnRyaWVzKGl0KTtcbiAgfVxufSk7XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yc1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBvd25LZXlzID0gcmVxdWlyZSgnLi9fb3duLWtleXMnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgZ09QRCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJyk7XG52YXIgY3JlYXRlUHJvcGVydHkgPSByZXF1aXJlKCcuL19jcmVhdGUtcHJvcGVydHknKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7XG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnM6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KSB7XG4gICAgdmFyIE8gPSB0b0lPYmplY3Qob2JqZWN0KTtcbiAgICB2YXIgZ2V0RGVzYyA9IGdPUEQuZjtcbiAgICB2YXIga2V5cyA9IG93bktleXMoTyk7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIga2V5LCBkZXNjO1xuICAgIHdoaWxlIChrZXlzLmxlbmd0aCA+IGkpIHtcbiAgICAgIGRlc2MgPSBnZXREZXNjKE8sIGtleSA9IGtleXNbaSsrXSk7XG4gICAgICBpZiAoZGVzYyAhPT0gdW5kZWZpbmVkKSBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGtleSwgZGVzYyk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKS5mO1xuXG4vLyBCLjIuMi40IE9iamVjdC5wcm90b3R5cGUuX19sb29rdXBHZXR0ZXJfXyhQKVxucmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSAmJiAkZXhwb3J0KCRleHBvcnQuUCArIHJlcXVpcmUoJy4vX29iamVjdC1mb3JjZWQtcGFtJyksICdPYmplY3QnLCB7XG4gIF9fbG9va3VwR2V0dGVyX186IGZ1bmN0aW9uIF9fbG9va3VwR2V0dGVyX18oUCkge1xuICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gICAgdmFyIEsgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgICB2YXIgRDtcbiAgICBkbyB7XG4gICAgICBpZiAoRCA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBLKSkgcmV0dXJuIEQuZ2V0O1xuICAgIH0gd2hpbGUgKE8gPSBnZXRQcm90b3R5cGVPZihPKSk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKS5mO1xuXG4vLyBCLjIuMi41IE9iamVjdC5wcm90b3R5cGUuX19sb29rdXBTZXR0ZXJfXyhQKVxucmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSAmJiAkZXhwb3J0KCRleHBvcnQuUCArIHJlcXVpcmUoJy4vX29iamVjdC1mb3JjZWQtcGFtJyksICdPYmplY3QnLCB7XG4gIF9fbG9va3VwU2V0dGVyX186IGZ1bmN0aW9uIF9fbG9va3VwU2V0dGVyX18oUCkge1xuICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gICAgdmFyIEsgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgICB2YXIgRDtcbiAgICBkbyB7XG4gICAgICBpZiAoRCA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBLKSkgcmV0dXJuIEQuc2V0O1xuICAgIH0gd2hpbGUgKE8gPSBnZXRQcm90b3R5cGVPZihPKSk7XG4gIH1cbn0pO1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtb2JqZWN0LXZhbHVlcy1lbnRyaWVzXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICR2YWx1ZXMgPSByZXF1aXJlKCcuL19vYmplY3QtdG8tYXJyYXknKShmYWxzZSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0Jywge1xuICB2YWx1ZXM6IGZ1bmN0aW9uIHZhbHVlcyhpdCkge1xuICAgIHJldHVybiAkdmFsdWVzKGl0KTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vemVucGFyc2luZy9lcy1vYnNlcnZhYmxlXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgbWljcm90YXNrID0gcmVxdWlyZSgnLi9fbWljcm90YXNrJykoKTtcbnZhciBPQlNFUlZBQkxFID0gcmVxdWlyZSgnLi9fd2tzJykoJ29ic2VydmFibGUnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKTtcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgZm9yT2YgPSByZXF1aXJlKCcuL19mb3Itb2YnKTtcbnZhciBSRVRVUk4gPSBmb3JPZi5SRVRVUk47XG5cbnZhciBnZXRNZXRob2QgPSBmdW5jdGlvbiAoZm4pIHtcbiAgcmV0dXJuIGZuID09IG51bGwgPyB1bmRlZmluZWQgOiBhRnVuY3Rpb24oZm4pO1xufTtcblxudmFyIGNsZWFudXBTdWJzY3JpcHRpb24gPSBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uKSB7XG4gIHZhciBjbGVhbnVwID0gc3Vic2NyaXB0aW9uLl9jO1xuICBpZiAoY2xlYW51cCkge1xuICAgIHN1YnNjcmlwdGlvbi5fYyA9IHVuZGVmaW5lZDtcbiAgICBjbGVhbnVwKCk7XG4gIH1cbn07XG5cbnZhciBzdWJzY3JpcHRpb25DbG9zZWQgPSBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uKSB7XG4gIHJldHVybiBzdWJzY3JpcHRpb24uX28gPT09IHVuZGVmaW5lZDtcbn07XG5cbnZhciBjbG9zZVN1YnNjcmlwdGlvbiA9IGZ1bmN0aW9uIChzdWJzY3JpcHRpb24pIHtcbiAgaWYgKCFzdWJzY3JpcHRpb25DbG9zZWQoc3Vic2NyaXB0aW9uKSkge1xuICAgIHN1YnNjcmlwdGlvbi5fbyA9IHVuZGVmaW5lZDtcbiAgICBjbGVhbnVwU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XG4gIH1cbn07XG5cbnZhciBTdWJzY3JpcHRpb24gPSBmdW5jdGlvbiAob2JzZXJ2ZXIsIHN1YnNjcmliZXIpIHtcbiAgYW5PYmplY3Qob2JzZXJ2ZXIpO1xuICB0aGlzLl9jID0gdW5kZWZpbmVkO1xuICB0aGlzLl9vID0gb2JzZXJ2ZXI7XG4gIG9ic2VydmVyID0gbmV3IFN1YnNjcmlwdGlvbk9ic2VydmVyKHRoaXMpO1xuICB0cnkge1xuICAgIHZhciBjbGVhbnVwID0gc3Vic2NyaWJlcihvYnNlcnZlcik7XG4gICAgdmFyIHN1YnNjcmlwdGlvbiA9IGNsZWFudXA7XG4gICAgaWYgKGNsZWFudXAgIT0gbnVsbCkge1xuICAgICAgaWYgKHR5cGVvZiBjbGVhbnVwLnVuc3Vic2NyaWJlID09PSAnZnVuY3Rpb24nKSBjbGVhbnVwID0gZnVuY3Rpb24gKCkgeyBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsgfTtcbiAgICAgIGVsc2UgYUZ1bmN0aW9uKGNsZWFudXApO1xuICAgICAgdGhpcy5fYyA9IGNsZWFudXA7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgcmV0dXJuO1xuICB9IGlmIChzdWJzY3JpcHRpb25DbG9zZWQodGhpcykpIGNsZWFudXBTdWJzY3JpcHRpb24odGhpcyk7XG59O1xuXG5TdWJzY3JpcHRpb24ucHJvdG90eXBlID0gcmVkZWZpbmVBbGwoe30sIHtcbiAgdW5zdWJzY3JpYmU6IGZ1bmN0aW9uIHVuc3Vic2NyaWJlKCkgeyBjbG9zZVN1YnNjcmlwdGlvbih0aGlzKTsgfVxufSk7XG5cbnZhciBTdWJzY3JpcHRpb25PYnNlcnZlciA9IGZ1bmN0aW9uIChzdWJzY3JpcHRpb24pIHtcbiAgdGhpcy5fcyA9IHN1YnNjcmlwdGlvbjtcbn07XG5cblN1YnNjcmlwdGlvbk9ic2VydmVyLnByb3RvdHlwZSA9IHJlZGVmaW5lQWxsKHt9LCB7XG4gIG5leHQ6IGZ1bmN0aW9uIG5leHQodmFsdWUpIHtcbiAgICB2YXIgc3Vic2NyaXB0aW9uID0gdGhpcy5fcztcbiAgICBpZiAoIXN1YnNjcmlwdGlvbkNsb3NlZChzdWJzY3JpcHRpb24pKSB7XG4gICAgICB2YXIgb2JzZXJ2ZXIgPSBzdWJzY3JpcHRpb24uX287XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgbSA9IGdldE1ldGhvZChvYnNlcnZlci5uZXh0KTtcbiAgICAgICAgaWYgKG0pIHJldHVybiBtLmNhbGwob2JzZXJ2ZXIsIHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjbG9zZVN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIGVycm9yOiBmdW5jdGlvbiBlcnJvcih2YWx1ZSkge1xuICAgIHZhciBzdWJzY3JpcHRpb24gPSB0aGlzLl9zO1xuICAgIGlmIChzdWJzY3JpcHRpb25DbG9zZWQoc3Vic2NyaXB0aW9uKSkgdGhyb3cgdmFsdWU7XG4gICAgdmFyIG9ic2VydmVyID0gc3Vic2NyaXB0aW9uLl9vO1xuICAgIHN1YnNjcmlwdGlvbi5fbyA9IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgdmFyIG0gPSBnZXRNZXRob2Qob2JzZXJ2ZXIuZXJyb3IpO1xuICAgICAgaWYgKCFtKSB0aHJvdyB2YWx1ZTtcbiAgICAgIHZhbHVlID0gbS5jYWxsKG9ic2VydmVyLCB2YWx1ZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY2xlYW51cFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9IGNsZWFudXBTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0sXG4gIGNvbXBsZXRlOiBmdW5jdGlvbiBjb21wbGV0ZSh2YWx1ZSkge1xuICAgIHZhciBzdWJzY3JpcHRpb24gPSB0aGlzLl9zO1xuICAgIGlmICghc3Vic2NyaXB0aW9uQ2xvc2VkKHN1YnNjcmlwdGlvbikpIHtcbiAgICAgIHZhciBvYnNlcnZlciA9IHN1YnNjcmlwdGlvbi5fbztcbiAgICAgIHN1YnNjcmlwdGlvbi5fbyA9IHVuZGVmaW5lZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBtID0gZ2V0TWV0aG9kKG9ic2VydmVyLmNvbXBsZXRlKTtcbiAgICAgICAgdmFsdWUgPSBtID8gbS5jYWxsKG9ic2VydmVyLCB2YWx1ZSkgOiB1bmRlZmluZWQ7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY2xlYW51cFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgIH0gY2xlYW51cFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxufSk7XG5cbnZhciAkT2JzZXJ2YWJsZSA9IGZ1bmN0aW9uIE9ic2VydmFibGUoc3Vic2NyaWJlcikge1xuICBhbkluc3RhbmNlKHRoaXMsICRPYnNlcnZhYmxlLCAnT2JzZXJ2YWJsZScsICdfZicpLl9mID0gYUZ1bmN0aW9uKHN1YnNjcmliZXIpO1xufTtcblxucmVkZWZpbmVBbGwoJE9ic2VydmFibGUucHJvdG90eXBlLCB7XG4gIHN1YnNjcmliZTogZnVuY3Rpb24gc3Vic2NyaWJlKG9ic2VydmVyKSB7XG4gICAgcmV0dXJuIG5ldyBTdWJzY3JpcHRpb24ob2JzZXJ2ZXIsIHRoaXMuX2YpO1xuICB9LFxuICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGZuKSB7XG4gICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgIHJldHVybiBuZXcgKGNvcmUuUHJvbWlzZSB8fCBnbG9iYWwuUHJvbWlzZSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgYUZ1bmN0aW9uKGZuKTtcbiAgICAgIHZhciBzdWJzY3JpcHRpb24gPSB0aGF0LnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gZm4odmFsdWUpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IHJlamVjdCxcbiAgICAgICAgY29tcGxldGU6IHJlc29sdmVcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59KTtcblxucmVkZWZpbmVBbGwoJE9ic2VydmFibGUsIHtcbiAgZnJvbTogZnVuY3Rpb24gZnJvbSh4KSB7XG4gICAgdmFyIEMgPSB0eXBlb2YgdGhpcyA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiAkT2JzZXJ2YWJsZTtcbiAgICB2YXIgbWV0aG9kID0gZ2V0TWV0aG9kKGFuT2JqZWN0KHgpW09CU0VSVkFCTEVdKTtcbiAgICBpZiAobWV0aG9kKSB7XG4gICAgICB2YXIgb2JzZXJ2YWJsZSA9IGFuT2JqZWN0KG1ldGhvZC5jYWxsKHgpKTtcbiAgICAgIHJldHVybiBvYnNlcnZhYmxlLmNvbnN0cnVjdG9yID09PSBDID8gb2JzZXJ2YWJsZSA6IG5ldyBDKGZ1bmN0aW9uIChvYnNlcnZlcikge1xuICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZS5zdWJzY3JpYmUob2JzZXJ2ZXIpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQyhmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcbiAgICAgIHZhciBkb25lID0gZmFsc2U7XG4gICAgICBtaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWRvbmUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGZvck9mKHgsIGZhbHNlLCBmdW5jdGlvbiAoaXQpIHtcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChpdCk7XG4gICAgICAgICAgICAgIGlmIChkb25lKSByZXR1cm4gUkVUVVJOO1xuICAgICAgICAgICAgfSkgPT09IFJFVFVSTikgcmV0dXJuO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChkb25lKSB0aHJvdyBlO1xuICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfSBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IGRvbmUgPSB0cnVlOyB9O1xuICAgIH0pO1xuICB9LFxuICBvZjogZnVuY3Rpb24gb2YoKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcmd1bWVudHMubGVuZ3RoLCBpdGVtcyA9IG5ldyBBcnJheShsKTsgaSA8IGw7KSBpdGVtc1tpXSA9IGFyZ3VtZW50c1tpKytdO1xuICAgIHJldHVybiBuZXcgKHR5cGVvZiB0aGlzID09PSAnZnVuY3Rpb24nID8gdGhpcyA6ICRPYnNlcnZhYmxlKShmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcbiAgICAgIHZhciBkb25lID0gZmFsc2U7XG4gICAgICBtaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWRvbmUpIHtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGl0ZW1zLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KGl0ZW1zW2pdKTtcbiAgICAgICAgICAgIGlmIChkb25lKSByZXR1cm47XG4gICAgICAgICAgfSBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IGRvbmUgPSB0cnVlOyB9O1xuICAgIH0pO1xuICB9XG59KTtcblxuaGlkZSgkT2JzZXJ2YWJsZS5wcm90b3R5cGUsIE9CU0VSVkFCTEUsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0pO1xuXG4kZXhwb3J0KCRleHBvcnQuRywgeyBPYnNlcnZhYmxlOiAkT2JzZXJ2YWJsZSB9KTtcblxucmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKSgnT2JzZXJ2YWJsZScpO1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcHJvbWlzZS1maW5hbGx5XG4ndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xudmFyIHByb21pc2VSZXNvbHZlID0gcmVxdWlyZSgnLi9fcHJvbWlzZS1yZXNvbHZlJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5SLCAnUHJvbWlzZScsIHsgJ2ZpbmFsbHknOiBmdW5jdGlvbiAob25GaW5hbGx5KSB7XG4gIHZhciBDID0gc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsIGNvcmUuUHJvbWlzZSB8fCBnbG9iYWwuUHJvbWlzZSk7XG4gIHZhciBpc0Z1bmN0aW9uID0gdHlwZW9mIG9uRmluYWxseSA9PSAnZnVuY3Rpb24nO1xuICByZXR1cm4gdGhpcy50aGVuKFxuICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoeCkge1xuICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKEMsIG9uRmluYWxseSgpKS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHg7IH0pO1xuICAgIH0gOiBvbkZpbmFsbHksXG4gICAgaXNGdW5jdGlvbiA/IGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeyB0aHJvdyBlOyB9KTtcbiAgICB9IDogb25GaW5hbGx5XG4gICk7XG59IH0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcHJvbWlzZS10cnlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSByZXF1aXJlKCcuL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4vX3BlcmZvcm0nKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdQcm9taXNlJywgeyAndHJ5JzogZnVuY3Rpb24gKGNhbGxiYWNrZm4pIHtcbiAgdmFyIHByb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkuZih0aGlzKTtcbiAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oY2FsbGJhY2tmbik7XG4gIChyZXN1bHQuZSA/IHByb21pc2VDYXBhYmlsaXR5LnJlamVjdCA6IHByb21pc2VDYXBhYmlsaXR5LnJlc29sdmUpKHJlc3VsdC52KTtcbiAgcmV0dXJuIHByb21pc2VDYXBhYmlsaXR5LnByb21pc2U7XG59IH0pO1xuIiwidmFyIG1ldGFkYXRhID0gcmVxdWlyZSgnLi9fbWV0YWRhdGEnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIHRvTWV0YUtleSA9IG1ldGFkYXRhLmtleTtcbnZhciBvcmRpbmFyeURlZmluZU93bk1ldGFkYXRhID0gbWV0YWRhdGEuc2V0O1xuXG5tZXRhZGF0YS5leHAoeyBkZWZpbmVNZXRhZGF0YTogZnVuY3Rpb24gZGVmaW5lTWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUsIHRhcmdldCwgdGFyZ2V0S2V5KSB7XG4gIG9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUsIGFuT2JqZWN0KHRhcmdldCksIHRvTWV0YUtleSh0YXJnZXRLZXkpKTtcbn0gfSk7XG4iLCJ2YXIgbWV0YWRhdGEgPSByZXF1aXJlKCcuL19tZXRhZGF0YScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgdG9NZXRhS2V5ID0gbWV0YWRhdGEua2V5O1xudmFyIGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAgPSBtZXRhZGF0YS5tYXA7XG52YXIgc3RvcmUgPSBtZXRhZGF0YS5zdG9yZTtcblxubWV0YWRhdGEuZXhwKHsgZGVsZXRlTWV0YWRhdGE6IGZ1bmN0aW9uIGRlbGV0ZU1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQgLyogLCB0YXJnZXRLZXkgKi8pIHtcbiAgdmFyIHRhcmdldEtleSA9IGFyZ3VtZW50cy5sZW5ndGggPCAzID8gdW5kZWZpbmVkIDogdG9NZXRhS2V5KGFyZ3VtZW50c1syXSk7XG4gIHZhciBtZXRhZGF0YU1hcCA9IGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoYW5PYmplY3QodGFyZ2V0KSwgdGFyZ2V0S2V5LCBmYWxzZSk7XG4gIGlmIChtZXRhZGF0YU1hcCA9PT0gdW5kZWZpbmVkIHx8ICFtZXRhZGF0YU1hcFsnZGVsZXRlJ10obWV0YWRhdGFLZXkpKSByZXR1cm4gZmFsc2U7XG4gIGlmIChtZXRhZGF0YU1hcC5zaXplKSByZXR1cm4gdHJ1ZTtcbiAgdmFyIHRhcmdldE1ldGFkYXRhID0gc3RvcmUuZ2V0KHRhcmdldCk7XG4gIHRhcmdldE1ldGFkYXRhWydkZWxldGUnXSh0YXJnZXRLZXkpO1xuICByZXR1cm4gISF0YXJnZXRNZXRhZGF0YS5zaXplIHx8IHN0b3JlWydkZWxldGUnXSh0YXJnZXQpO1xufSB9KTtcbiIsInZhciBTZXQgPSByZXF1aXJlKCcuL2VzNi5zZXQnKTtcbnZhciBmcm9tID0gcmVxdWlyZSgnLi9fYXJyYXktZnJvbS1pdGVyYWJsZScpO1xudmFyIG1ldGFkYXRhID0gcmVxdWlyZSgnLi9fbWV0YWRhdGEnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIG9yZGluYXJ5T3duTWV0YWRhdGFLZXlzID0gbWV0YWRhdGEua2V5cztcbnZhciB0b01ldGFLZXkgPSBtZXRhZGF0YS5rZXk7XG5cbnZhciBvcmRpbmFyeU1ldGFkYXRhS2V5cyA9IGZ1bmN0aW9uIChPLCBQKSB7XG4gIHZhciBvS2V5cyA9IG9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKE8sIFApO1xuICB2YXIgcGFyZW50ID0gZ2V0UHJvdG90eXBlT2YoTyk7XG4gIGlmIChwYXJlbnQgPT09IG51bGwpIHJldHVybiBvS2V5cztcbiAgdmFyIHBLZXlzID0gb3JkaW5hcnlNZXRhZGF0YUtleXMocGFyZW50LCBQKTtcbiAgcmV0dXJuIHBLZXlzLmxlbmd0aCA/IG9LZXlzLmxlbmd0aCA/IGZyb20obmV3IFNldChvS2V5cy5jb25jYXQocEtleXMpKSkgOiBwS2V5cyA6IG9LZXlzO1xufTtcblxubWV0YWRhdGEuZXhwKHsgZ2V0TWV0YWRhdGFLZXlzOiBmdW5jdGlvbiBnZXRNZXRhZGF0YUtleXModGFyZ2V0IC8qICwgdGFyZ2V0S2V5ICovKSB7XG4gIHJldHVybiBvcmRpbmFyeU1ldGFkYXRhS2V5cyhhbk9iamVjdCh0YXJnZXQpLCBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IHVuZGVmaW5lZCA6IHRvTWV0YUtleShhcmd1bWVudHNbMV0pKTtcbn0gfSk7XG4iLCJ2YXIgbWV0YWRhdGEgPSByZXF1aXJlKCcuL19tZXRhZGF0YScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG52YXIgb3JkaW5hcnlIYXNPd25NZXRhZGF0YSA9IG1ldGFkYXRhLmhhcztcbnZhciBvcmRpbmFyeUdldE93bk1ldGFkYXRhID0gbWV0YWRhdGEuZ2V0O1xudmFyIHRvTWV0YUtleSA9IG1ldGFkYXRhLmtleTtcblxudmFyIG9yZGluYXJ5R2V0TWV0YWRhdGEgPSBmdW5jdGlvbiAoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgdmFyIGhhc093biA9IG9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApO1xuICBpZiAoaGFzT3duKSByZXR1cm4gb3JkaW5hcnlHZXRPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCk7XG4gIHZhciBwYXJlbnQgPSBnZXRQcm90b3R5cGVPZihPKTtcbiAgcmV0dXJuIHBhcmVudCAhPT0gbnVsbCA/IG9yZGluYXJ5R2V0TWV0YWRhdGEoTWV0YWRhdGFLZXksIHBhcmVudCwgUCkgOiB1bmRlZmluZWQ7XG59O1xuXG5tZXRhZGF0YS5leHAoeyBnZXRNZXRhZGF0YTogZnVuY3Rpb24gZ2V0TWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCAvKiAsIHRhcmdldEtleSAqLykge1xuICByZXR1cm4gb3JkaW5hcnlHZXRNZXRhZGF0YShtZXRhZGF0YUtleSwgYW5PYmplY3QodGFyZ2V0KSwgYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiB0b01ldGFLZXkoYXJndW1lbnRzWzJdKSk7XG59IH0pO1xuIiwidmFyIG1ldGFkYXRhID0gcmVxdWlyZSgnLi9fbWV0YWRhdGEnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIG9yZGluYXJ5T3duTWV0YWRhdGFLZXlzID0gbWV0YWRhdGEua2V5cztcbnZhciB0b01ldGFLZXkgPSBtZXRhZGF0YS5rZXk7XG5cbm1ldGFkYXRhLmV4cCh7IGdldE93bk1ldGFkYXRhS2V5czogZnVuY3Rpb24gZ2V0T3duTWV0YWRhdGFLZXlzKHRhcmdldCAvKiAsIHRhcmdldEtleSAqLykge1xuICByZXR1cm4gb3JkaW5hcnlPd25NZXRhZGF0YUtleXMoYW5PYmplY3QodGFyZ2V0KSwgYXJndW1lbnRzLmxlbmd0aCA8IDIgPyB1bmRlZmluZWQgOiB0b01ldGFLZXkoYXJndW1lbnRzWzFdKSk7XG59IH0pO1xuIiwidmFyIG1ldGFkYXRhID0gcmVxdWlyZSgnLi9fbWV0YWRhdGEnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIG9yZGluYXJ5R2V0T3duTWV0YWRhdGEgPSBtZXRhZGF0YS5nZXQ7XG52YXIgdG9NZXRhS2V5ID0gbWV0YWRhdGEua2V5O1xuXG5tZXRhZGF0YS5leHAoeyBnZXRPd25NZXRhZGF0YTogZnVuY3Rpb24gZ2V0T3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCAvKiAsIHRhcmdldEtleSAqLykge1xuICByZXR1cm4gb3JkaW5hcnlHZXRPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgYW5PYmplY3QodGFyZ2V0KVxuICAgICwgYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiB0b01ldGFLZXkoYXJndW1lbnRzWzJdKSk7XG59IH0pO1xuIiwidmFyIG1ldGFkYXRhID0gcmVxdWlyZSgnLi9fbWV0YWRhdGEnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIG9yZGluYXJ5SGFzT3duTWV0YWRhdGEgPSBtZXRhZGF0YS5oYXM7XG52YXIgdG9NZXRhS2V5ID0gbWV0YWRhdGEua2V5O1xuXG52YXIgb3JkaW5hcnlIYXNNZXRhZGF0YSA9IGZ1bmN0aW9uIChNZXRhZGF0YUtleSwgTywgUCkge1xuICB2YXIgaGFzT3duID0gb3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCk7XG4gIGlmIChoYXNPd24pIHJldHVybiB0cnVlO1xuICB2YXIgcGFyZW50ID0gZ2V0UHJvdG90eXBlT2YoTyk7XG4gIHJldHVybiBwYXJlbnQgIT09IG51bGwgPyBvcmRpbmFyeUhhc01ldGFkYXRhKE1ldGFkYXRhS2V5LCBwYXJlbnQsIFApIDogZmFsc2U7XG59O1xuXG5tZXRhZGF0YS5leHAoeyBoYXNNZXRhZGF0YTogZnVuY3Rpb24gaGFzTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCAvKiAsIHRhcmdldEtleSAqLykge1xuICByZXR1cm4gb3JkaW5hcnlIYXNNZXRhZGF0YShtZXRhZGF0YUtleSwgYW5PYmplY3QodGFyZ2V0KSwgYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiB0b01ldGFLZXkoYXJndW1lbnRzWzJdKSk7XG59IH0pO1xuIiwidmFyIG1ldGFkYXRhID0gcmVxdWlyZSgnLi9fbWV0YWRhdGEnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIG9yZGluYXJ5SGFzT3duTWV0YWRhdGEgPSBtZXRhZGF0YS5oYXM7XG52YXIgdG9NZXRhS2V5ID0gbWV0YWRhdGEua2V5O1xuXG5tZXRhZGF0YS5leHAoeyBoYXNPd25NZXRhZGF0YTogZnVuY3Rpb24gaGFzT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCAvKiAsIHRhcmdldEtleSAqLykge1xuICByZXR1cm4gb3JkaW5hcnlIYXNPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgYW5PYmplY3QodGFyZ2V0KVxuICAgICwgYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiB0b01ldGFLZXkoYXJndW1lbnRzWzJdKSk7XG59IH0pO1xuIiwidmFyICRtZXRhZGF0YSA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgdG9NZXRhS2V5ID0gJG1ldGFkYXRhLmtleTtcbnZhciBvcmRpbmFyeURlZmluZU93bk1ldGFkYXRhID0gJG1ldGFkYXRhLnNldDtcblxuJG1ldGFkYXRhLmV4cCh7IG1ldGFkYXRhOiBmdW5jdGlvbiBtZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24gZGVjb3JhdG9yKHRhcmdldCwgdGFyZ2V0S2V5KSB7XG4gICAgb3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShcbiAgICAgIG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLFxuICAgICAgKHRhcmdldEtleSAhPT0gdW5kZWZpbmVkID8gYW5PYmplY3QgOiBhRnVuY3Rpb24pKHRhcmdldCksXG4gICAgICB0b01ldGFLZXkodGFyZ2V0S2V5KVxuICAgICk7XG4gIH07XG59IH0pO1xuIiwiLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tLyNzZWMtc2V0LmZyb21cbnJlcXVpcmUoJy4vX3NldC1jb2xsZWN0aW9uLWZyb20nKSgnU2V0Jyk7XG4iLCIvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vI3NlYy1zZXQub2ZcbnJlcXVpcmUoJy4vX3NldC1jb2xsZWN0aW9uLW9mJykoJ1NldCcpO1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL0RhdmlkQnJ1YW50L01hcC1TZXQucHJvdG90eXBlLnRvSlNPTlxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LlIsICdTZXQnLCB7IHRvSlNPTjogcmVxdWlyZSgnLi9fY29sbGVjdGlvbi10by1qc29uJykoJ1NldCcpIH0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL21hdGhpYXNieW5lbnMvU3RyaW5nLnByb3RvdHlwZS5hdFxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkYXQgPSByZXF1aXJlKCcuL19zdHJpbmctYXQnKSh0cnVlKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdTdHJpbmcnLCB7XG4gIGF0OiBmdW5jdGlvbiBhdChwb3MpIHtcbiAgICByZXR1cm4gJGF0KHRoaXMsIHBvcyk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9TdHJpbmcucHJvdG90eXBlLm1hdGNoQWxsL1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgaXNSZWdFeHAgPSByZXF1aXJlKCcuL19pcy1yZWdleHAnKTtcbnZhciBnZXRGbGFncyA9IHJlcXVpcmUoJy4vX2ZsYWdzJyk7XG52YXIgUmVnRXhwUHJvdG8gPSBSZWdFeHAucHJvdG90eXBlO1xuXG52YXIgJFJlZ0V4cFN0cmluZ0l0ZXJhdG9yID0gZnVuY3Rpb24gKHJlZ2V4cCwgc3RyaW5nKSB7XG4gIHRoaXMuX3IgPSByZWdleHA7XG4gIHRoaXMuX3MgPSBzdHJpbmc7XG59O1xuXG5yZXF1aXJlKCcuL19pdGVyLWNyZWF0ZScpKCRSZWdFeHBTdHJpbmdJdGVyYXRvciwgJ1JlZ0V4cCBTdHJpbmcnLCBmdW5jdGlvbiBuZXh0KCkge1xuICB2YXIgbWF0Y2ggPSB0aGlzLl9yLmV4ZWModGhpcy5fcyk7XG4gIHJldHVybiB7IHZhbHVlOiBtYXRjaCwgZG9uZTogbWF0Y2ggPT09IG51bGwgfTtcbn0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUCwgJ1N0cmluZycsIHtcbiAgbWF0Y2hBbGw6IGZ1bmN0aW9uIG1hdGNoQWxsKHJlZ2V4cCkge1xuICAgIGRlZmluZWQodGhpcyk7XG4gICAgaWYgKCFpc1JlZ0V4cChyZWdleHApKSB0aHJvdyBUeXBlRXJyb3IocmVnZXhwICsgJyBpcyBub3QgYSByZWdleHAhJyk7XG4gICAgdmFyIFMgPSBTdHJpbmcodGhpcyk7XG4gICAgdmFyIGZsYWdzID0gJ2ZsYWdzJyBpbiBSZWdFeHBQcm90byA/IFN0cmluZyhyZWdleHAuZmxhZ3MpIDogZ2V0RmxhZ3MuY2FsbChyZWdleHApO1xuICAgIHZhciByeCA9IG5ldyBSZWdFeHAocmVnZXhwLnNvdXJjZSwgfmZsYWdzLmluZGV4T2YoJ2cnKSA/IGZsYWdzIDogJ2cnICsgZmxhZ3MpO1xuICAgIHJ4Lmxhc3RJbmRleCA9IHRvTGVuZ3RoKHJlZ2V4cC5sYXN0SW5kZXgpO1xuICAgIHJldHVybiBuZXcgJFJlZ0V4cFN0cmluZ0l0ZXJhdG9yKHJ4LCBTKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zdHJpbmctcGFkLXN0YXJ0LWVuZFxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkcGFkID0gcmVxdWlyZSgnLi9fc3RyaW5nLXBhZCcpO1xudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4vX3VzZXItYWdlbnQnKTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzI4MFxudmFyIFdFQktJVF9CVUcgPSAvVmVyc2lvblxcLzEwXFwuXFxkKyhcXC5cXGQrKT8oIE1vYmlsZVxcL1xcdyspPyBTYWZhcmlcXC8vLnRlc3QodXNlckFnZW50KTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiBXRUJLSVRfQlVHLCAnU3RyaW5nJywge1xuICBwYWRFbmQ6IGZ1bmN0aW9uIHBhZEVuZChtYXhMZW5ndGggLyogLCBmaWxsU3RyaW5nID0gJyAnICovKSB7XG4gICAgcmV0dXJuICRwYWQodGhpcywgbWF4TGVuZ3RoLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgZmFsc2UpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXN0cmluZy1wYWQtc3RhcnQtZW5kXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRwYWQgPSByZXF1aXJlKCcuL19zdHJpbmctcGFkJyk7XG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi9fdXNlci1hZ2VudCcpO1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMjgwXG52YXIgV0VCS0lUX0JVRyA9IC9WZXJzaW9uXFwvMTBcXC5cXGQrKFxcLlxcZCspPyggTW9iaWxlXFwvXFx3Kyk/IFNhZmFyaVxcLy8udGVzdCh1c2VyQWdlbnQpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIFdFQktJVF9CVUcsICdTdHJpbmcnLCB7XG4gIHBhZFN0YXJ0OiBmdW5jdGlvbiBwYWRTdGFydChtYXhMZW5ndGggLyogLCBmaWxsU3RyaW5nID0gJyAnICovKSB7XG4gICAgcmV0dXJuICRwYWQodGhpcywgbWF4TGVuZ3RoLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgdHJ1ZSk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3NlYm1hcmtiYWdlL2VjbWFzY3JpcHQtc3RyaW5nLWxlZnQtcmlnaHQtdHJpbVxucmVxdWlyZSgnLi9fc3RyaW5nLXRyaW0nKSgndHJpbUxlZnQnLCBmdW5jdGlvbiAoJHRyaW0pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHRyaW1MZWZ0KCkge1xuICAgIHJldHVybiAkdHJpbSh0aGlzLCAxKTtcbiAgfTtcbn0sICd0cmltU3RhcnQnKTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zZWJtYXJrYmFnZS9lY21hc2NyaXB0LXN0cmluZy1sZWZ0LXJpZ2h0LXRyaW1cbnJlcXVpcmUoJy4vX3N0cmluZy10cmltJykoJ3RyaW1SaWdodCcsIGZ1bmN0aW9uICgkdHJpbSkge1xuICByZXR1cm4gZnVuY3Rpb24gdHJpbVJpZ2h0KCkge1xuICAgIHJldHVybiAkdHJpbSh0aGlzLCAyKTtcbiAgfTtcbn0sICd0cmltRW5kJyk7XG4iLCJyZXF1aXJlKCcuL193a3MtZGVmaW5lJykoJ2FzeW5jSXRlcmF0b3InKTtcbiIsInJlcXVpcmUoJy4vX3drcy1kZWZpbmUnKSgnb2JzZXJ2YWJsZScpO1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtZ2xvYmFsXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1N5c3RlbScsIHsgZ2xvYmFsOiByZXF1aXJlKCcuL19nbG9iYWwnKSB9KTtcbiIsIi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS8jc2VjLXdlYWttYXAuZnJvbVxucmVxdWlyZSgnLi9fc2V0LWNvbGxlY3Rpb24tZnJvbScpKCdXZWFrTWFwJyk7XG4iLCIvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vI3NlYy13ZWFrbWFwLm9mXG5yZXF1aXJlKCcuL19zZXQtY29sbGVjdGlvbi1vZicpKCdXZWFrTWFwJyk7XG4iLCIvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vI3NlYy13ZWFrc2V0LmZyb21cbnJlcXVpcmUoJy4vX3NldC1jb2xsZWN0aW9uLWZyb20nKSgnV2Vha1NldCcpO1xuIiwiLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tLyNzZWMtd2Vha3NldC5vZlxucmVxdWlyZSgnLi9fc2V0LWNvbGxlY3Rpb24tb2YnKSgnV2Vha1NldCcpO1xuIiwidmFyICRpdGVyYXRvcnMgPSByZXF1aXJlKCcuL2VzNi5hcnJheS5pdGVyYXRvcicpO1xudmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyIHdrcyA9IHJlcXVpcmUoJy4vX3drcycpO1xudmFyIElURVJBVE9SID0gd2tzKCdpdGVyYXRvcicpO1xudmFyIFRPX1NUUklOR19UQUcgPSB3a3MoJ3RvU3RyaW5nVGFnJyk7XG52YXIgQXJyYXlWYWx1ZXMgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbnZhciBET01JdGVyYWJsZXMgPSB7XG4gIENTU1J1bGVMaXN0OiB0cnVlLCAvLyBUT0RPOiBOb3Qgc3BlYyBjb21wbGlhbnQsIHNob3VsZCBiZSBmYWxzZS5cbiAgQ1NTU3R5bGVEZWNsYXJhdGlvbjogZmFsc2UsXG4gIENTU1ZhbHVlTGlzdDogZmFsc2UsXG4gIENsaWVudFJlY3RMaXN0OiBmYWxzZSxcbiAgRE9NUmVjdExpc3Q6IGZhbHNlLFxuICBET01TdHJpbmdMaXN0OiBmYWxzZSxcbiAgRE9NVG9rZW5MaXN0OiB0cnVlLFxuICBEYXRhVHJhbnNmZXJJdGVtTGlzdDogZmFsc2UsXG4gIEZpbGVMaXN0OiBmYWxzZSxcbiAgSFRNTEFsbENvbGxlY3Rpb246IGZhbHNlLFxuICBIVE1MQ29sbGVjdGlvbjogZmFsc2UsXG4gIEhUTUxGb3JtRWxlbWVudDogZmFsc2UsXG4gIEhUTUxTZWxlY3RFbGVtZW50OiBmYWxzZSxcbiAgTWVkaWFMaXN0OiB0cnVlLCAvLyBUT0RPOiBOb3Qgc3BlYyBjb21wbGlhbnQsIHNob3VsZCBiZSBmYWxzZS5cbiAgTWltZVR5cGVBcnJheTogZmFsc2UsXG4gIE5hbWVkTm9kZU1hcDogZmFsc2UsXG4gIE5vZGVMaXN0OiB0cnVlLFxuICBQYWludFJlcXVlc3RMaXN0OiBmYWxzZSxcbiAgUGx1Z2luOiBmYWxzZSxcbiAgUGx1Z2luQXJyYXk6IGZhbHNlLFxuICBTVkdMZW5ndGhMaXN0OiBmYWxzZSxcbiAgU1ZHTnVtYmVyTGlzdDogZmFsc2UsXG4gIFNWR1BhdGhTZWdMaXN0OiBmYWxzZSxcbiAgU1ZHUG9pbnRMaXN0OiBmYWxzZSxcbiAgU1ZHU3RyaW5nTGlzdDogZmFsc2UsXG4gIFNWR1RyYW5zZm9ybUxpc3Q6IGZhbHNlLFxuICBTb3VyY2VCdWZmZXJMaXN0OiBmYWxzZSxcbiAgU3R5bGVTaGVldExpc3Q6IHRydWUsIC8vIFRPRE86IE5vdCBzcGVjIGNvbXBsaWFudCwgc2hvdWxkIGJlIGZhbHNlLlxuICBUZXh0VHJhY2tDdWVMaXN0OiBmYWxzZSxcbiAgVGV4dFRyYWNrTGlzdDogZmFsc2UsXG4gIFRvdWNoTGlzdDogZmFsc2Vcbn07XG5cbmZvciAodmFyIGNvbGxlY3Rpb25zID0gZ2V0S2V5cyhET01JdGVyYWJsZXMpLCBpID0gMDsgaSA8IGNvbGxlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gIHZhciBOQU1FID0gY29sbGVjdGlvbnNbaV07XG4gIHZhciBleHBsaWNpdCA9IERPTUl0ZXJhYmxlc1tOQU1FXTtcbiAgdmFyIENvbGxlY3Rpb24gPSBnbG9iYWxbTkFNRV07XG4gIHZhciBwcm90byA9IENvbGxlY3Rpb24gJiYgQ29sbGVjdGlvbi5wcm90b3R5cGU7XG4gIHZhciBrZXk7XG4gIGlmIChwcm90bykge1xuICAgIGlmICghcHJvdG9bSVRFUkFUT1JdKSBoaWRlKHByb3RvLCBJVEVSQVRPUiwgQXJyYXlWYWx1ZXMpO1xuICAgIGlmICghcHJvdG9bVE9fU1RSSU5HX1RBR10pIGhpZGUocHJvdG8sIFRPX1NUUklOR19UQUcsIE5BTUUpO1xuICAgIEl0ZXJhdG9yc1tOQU1FXSA9IEFycmF5VmFsdWVzO1xuICAgIGlmIChleHBsaWNpdCkgZm9yIChrZXkgaW4gJGl0ZXJhdG9ycykgaWYgKCFwcm90b1trZXldKSByZWRlZmluZShwcm90bywga2V5LCAkaXRlcmF0b3JzW2tleV0sIHRydWUpO1xuICB9XG59XG4iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICR0YXNrID0gcmVxdWlyZSgnLi9fdGFzaycpO1xuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LkIsIHtcbiAgc2V0SW1tZWRpYXRlOiAkdGFzay5zZXQsXG4gIGNsZWFySW1tZWRpYXRlOiAkdGFzay5jbGVhclxufSk7XG4iLCIvLyBpZTktIHNldFRpbWVvdXQgJiBzZXRJbnRlcnZhbCBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgZml4XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4vX3VzZXItYWdlbnQnKTtcbnZhciBzbGljZSA9IFtdLnNsaWNlO1xudmFyIE1TSUUgPSAvTVNJRSAuXFwuLy50ZXN0KHVzZXJBZ2VudCk7IC8vIDwtIGRpcnR5IGllOS0gY2hlY2tcbnZhciB3cmFwID0gZnVuY3Rpb24gKHNldCkge1xuICByZXR1cm4gZnVuY3Rpb24gKGZuLCB0aW1lIC8qICwgLi4uYXJncyAqLykge1xuICAgIHZhciBib3VuZEFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoID4gMjtcbiAgICB2YXIgYXJncyA9IGJvdW5kQXJncyA/IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKSA6IGZhbHNlO1xuICAgIHJldHVybiBzZXQoYm91bmRBcmdzID8gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gICAgICAodHlwZW9mIGZuID09ICdmdW5jdGlvbicgPyBmbiA6IEZ1bmN0aW9uKGZuKSkuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfSA6IGZuLCB0aW1lKTtcbiAgfTtcbn07XG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuQiArICRleHBvcnQuRiAqIE1TSUUsIHtcbiAgc2V0VGltZW91dDogd3JhcChnbG9iYWwuc2V0VGltZW91dCksXG4gIHNldEludGVydmFsOiB3cmFwKGdsb2JhbC5zZXRJbnRlcnZhbClcbn0pO1xuIiwicmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zeW1ib2wnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmNyZWF0ZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuZGVmaW5lLXByb3BlcnR5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5kZWZpbmUtcHJvcGVydGllcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtcHJvdG90eXBlLW9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5rZXlzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LW5hbWVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5mcmVlemUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LnNlYWwnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LnByZXZlbnQtZXh0ZW5zaW9ucycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuaXMtZnJvemVuJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5pcy1zZWFsZWQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmlzLWV4dGVuc2libGUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmFzc2lnbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuaXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LnNldC1wcm90b3R5cGUtb2YnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5mdW5jdGlvbi5iaW5kJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmZ1bmN0aW9uLm5hbWUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuZnVuY3Rpb24uaGFzLWluc3RhbmNlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnBhcnNlLWludCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5wYXJzZS1mbG9hdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIuY29uc3RydWN0b3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLnRvLWZpeGVkJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci50by1wcmVjaXNpb24nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLmVwc2lsb24nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLmlzLWZpbml0ZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIuaXMtaW50ZWdlcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIuaXMtbmFuJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5pcy1zYWZlLWludGVnZXInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLm1heC1zYWZlLWludGVnZXInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLm1pbi1zYWZlLWludGVnZXInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLnBhcnNlLWZsb2F0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5wYXJzZS1pbnQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5hY29zaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmFzaW5oJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguYXRhbmgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5jYnJ0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguY2x6MzInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5jb3NoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguZXhwbTEnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5mcm91bmQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5oeXBvdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmltdWwnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5sb2cxMCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmxvZzFwJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGgubG9nMicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLnNpZ24nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5zaW5oJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGgudGFuaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLnRydW5jJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5mcm9tLWNvZGUtcG9pbnQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLnJhdycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcudHJpbScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmNvZGUtcG9pbnQtYXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmVuZHMtd2l0aCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuaW5jbHVkZXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLnJlcGVhdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuc3RhcnRzLXdpdGgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmFuY2hvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuYmlnJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5ibGluaycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuYm9sZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuZml4ZWQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmZvbnRjb2xvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuZm9udHNpemUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLml0YWxpY3MnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmxpbmsnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLnNtYWxsJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5zdHJpa2UnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLnN1YicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuc3VwJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmRhdGUubm93Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmRhdGUudG8tanNvbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5kYXRlLnRvLWlzby1zdHJpbmcnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuZGF0ZS50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuZGF0ZS50by1wcmltaXRpdmUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuaXMtYXJyYXknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuZnJvbScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5qb2luJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LnNsaWNlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LnNvcnQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuZm9yLWVhY2gnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkubWFwJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmZpbHRlcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5zb21lJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmV2ZXJ5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LnJlZHVjZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5yZWR1Y2UtcmlnaHQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuaW5kZXgtb2YnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkubGFzdC1pbmRleC1vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5jb3B5LXdpdGhpbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5maWxsJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmZpbmQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuZmluZC1pbmRleCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5zcGVjaWVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5Lml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZ2V4cC5jb25zdHJ1Y3RvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWdleHAuZXhlYycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWdleHAudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZ2V4cC5mbGFncycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWdleHAubWF0Y2gnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVnZXhwLnJlcGxhY2UnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVnZXhwLnNlYXJjaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWdleHAuc3BsaXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucHJvbWlzZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXAnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc2V0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LndlYWstbWFwJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LndlYWstc2V0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLmFycmF5LWJ1ZmZlcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi50eXBlZC5kYXRhLXZpZXcnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQuaW50OC1hcnJheScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi50eXBlZC51aW50OC1hcnJheScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi50eXBlZC51aW50OC1jbGFtcGVkLWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLmludDE2LWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQxNi1hcnJheScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi50eXBlZC5pbnQzMi1hcnJheScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi50eXBlZC51aW50MzItYXJyYXknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQuZmxvYXQzMi1hcnJheScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi50eXBlZC5mbG9hdDY0LWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuYXBwbHknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5jb25zdHJ1Y3QnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5kZWZpbmUtcHJvcGVydHknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5kZWxldGUtcHJvcGVydHknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5lbnVtZXJhdGUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5nZXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5nZXQtcHJvdG90eXBlLW9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuaGFzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuaXMtZXh0ZW5zaWJsZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0Lm93bi1rZXlzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QucHJldmVudC1leHRlbnNpb25zJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3Quc2V0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3Quc2V0LXByb3RvdHlwZS1vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5hcnJheS5pbmNsdWRlcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5hcnJheS5mbGF0LW1hcCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5hcnJheS5mbGF0dGVuJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnN0cmluZy5hdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zdHJpbmcucGFkLXN0YXJ0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnN0cmluZy5wYWQtZW5kJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnN0cmluZy50cmltLWxlZnQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc3RyaW5nLnRyaW0tcmlnaHQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc3RyaW5nLm1hdGNoLWFsbCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zeW1ib2wuYXN5bmMtaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc3ltYm9sLm9ic2VydmFibGUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcnMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcub2JqZWN0LnZhbHVlcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5vYmplY3QuZW50cmllcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5vYmplY3QuZGVmaW5lLWdldHRlcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5vYmplY3QuZGVmaW5lLXNldHRlcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5vYmplY3QubG9va3VwLWdldHRlcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5vYmplY3QubG9va3VwLXNldHRlcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXAudG8tanNvbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zZXQudG8tanNvbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXAub2YnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc2V0Lm9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LndlYWstbWFwLm9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LndlYWstc2V0Lm9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hcC5mcm9tJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnNldC5mcm9tJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LndlYWstbWFwLmZyb20nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcud2Vhay1zZXQuZnJvbScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5nbG9iYWwnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc3lzdGVtLmdsb2JhbCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5lcnJvci5pcy1lcnJvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXRoLmNsYW1wJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hdGguZGVnLXBlci1yYWQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWF0aC5kZWdyZWVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hdGguZnNjYWxlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hdGguaWFkZGgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWF0aC5pc3ViaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXRoLmltdWxoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hdGgucmFkLXBlci1kZWcnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWF0aC5yYWRpYW5zJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hdGguc2NhbGUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWF0aC51bXVsaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXRoLnNpZ25iaXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcucHJvbWlzZS5maW5hbGx5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnByb21pc2UudHJ5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnJlZmxlY3QuZGVmaW5lLW1ldGFkYXRhJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnJlZmxlY3QuZGVsZXRlLW1ldGFkYXRhJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnJlZmxlY3QuZ2V0LW1ldGFkYXRhJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnJlZmxlY3QuZ2V0LW1ldGFkYXRhLWtleXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcucmVmbGVjdC5nZXQtb3duLW1ldGFkYXRhJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnJlZmxlY3QuZ2V0LW93bi1tZXRhZGF0YS1rZXlzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnJlZmxlY3QuaGFzLW1ldGFkYXRhJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnJlZmxlY3QuaGFzLW93bi1tZXRhZGF0YScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0Lm1ldGFkYXRhJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LmFzYXAnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcub2JzZXJ2YWJsZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL3dlYi50aW1lcnMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy93ZWIuaW1tZWRpYXRlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL21vZHVsZXMvX2NvcmUnKTtcbiIsInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgbmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcbn0gY2F0Y2ggKGUpIHtcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcblx0aWYgKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpIGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcbiJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/front/public/JS/questionnaire.app.js b/front/public/JS/questionnaire.app.js new file mode 100644 index 0000000..f9128ca --- /dev/null +++ b/front/public/JS/questionnaire.app.js @@ -0,0 +1,1458 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "./src/questionnaire.js"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "../config/instance.js": +/*!*****************************!*\ + !*** ../config/instance.js ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var _module$exports; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var users = __webpack_require__(/*! ./users */ "../config/users.js"); + +var questionnaires = __webpack_require__(/*! ./questionnaires */ "../config/questionnaires.js"); + +module.exports = (_module$exports = { + apiUrl: "http://localhost:3000/api", + siteUrl: "http://localhost:8080", + adminName: "Fabrice", + adminEmail: "dev@wikilerni.com", + senderName: "WikiLerni", + senderEmail: "bonjour@wikilerni.com", + adminLang: "fr", + theme: "default", + // le thème utilisé (dans /views) pour générer les pages HTML. Contient ses propres fichiers de configuration. + availableLangs: ["fr"], + // Languages in which the site is available. The first one is the default one. + siteName: "WikiLerni", + beginCodeGodfather: "wikilerni", + // case-sensitive and can't contain "@" ! + cronTimingAlertInSeconde: 120, + // for logs + responseTimingAlertInSeconde: 3, + // idem + tokenSignupValidationTimeInHours: "48h", + // https://github.com/zeit/ms + tokenLoginLinkTimeInHours: "1h", + tokenConnexionMinTimeInHours: "24h", + tokenConnexionMaxTimeInDays: "180 days", + tokenLoginChangingTimeInHours: "1h", + // for email & password changing + tokenDeleteUserTimeInHours: "1h", + tokenUnsubscribeLinkTimeInDays: "7 days", + // token send with subscription's emails + freeAccountTimingInDays: 10, + freeAccountExpirationNotificationInDays: 5, + accountExpirationFirstNotificationInDays: 14, + accountExpirationSecondNotificationInDays: 5, + inactiveAccountTimeToDeleteInDays: 180, + // Questionnaires: + nbQuestionsMin: 1, + // minimum number of questions for the questionnaire to be publishable + nbQuestionsMax: 10, + // if 0 = not maximum + nbChoicesMax: 10, + nbNewQuestionnaires: 10, + // for RSS, etc. + hourGiveNewQuestionnaireBegin: 1, + // in user local time + hourGiveNewQuestionnaireEnd: 24, + // idem + numberNewQuestionnaireAtSameTime: 50, + // for mass mailing + minSearchQuestionnaires: 3, + // Illustrations: + nbIllustrationsMin: 0, + nbIllustrationsMax: 1, + maxIllustrationSizeinOctet: 1000000, + // pas contrôlé pour l'instant. À revoir. + mimeTypesForIllustration: ["image/jpg", "image/jpeg", "image/png", "image/gif", "image/png"], + // -- Upload and resize: + illustrationsWidthMaxInPx: 400, + illustrationsMiniaturesWidthMaxInPx: 200, + // Links: + nbLinksMin: 1, + nbLinksMax: 1 +}, _defineProperty(_module$exports, "nbQuestionsMin", questionnaires.nbQuestionsMin), _defineProperty(_module$exports, "nbQuestionsMax", questionnaires.nbQuestionsMax), _defineProperty(_module$exports, "nbChoicesMax", questionnaires.nbChoicesMax), _defineProperty(_module$exports, "passwordMinLength", users.password.minlength), _defineProperty(_module$exports, "dirCacheUsers", users.dirCacheUsers), _defineProperty(_module$exports, "dirCacheUsersAnswers", users.dirCacheUsersAnswers), _defineProperty(_module$exports, "dirCacheQuestionnaires", questionnaires.dirCacheQuestionnaires), _defineProperty(_module$exports, "dirCacheQuestions", questionnaires.dirCacheQuestions), _defineProperty(_module$exports, "dirCacheUsersQuestionnaires", questionnaires.dirCacheUsersQuestionnaires), _defineProperty(_module$exports, "dirHTMLQuestionnaire", questionnaires.dirHTMLQuestionnaire), _defineProperty(_module$exports, "dirWebQuestionnaire", questionnaires.dirWebQuestionnaire), _module$exports); + +/***/ }), + +/***/ "../config/questionnaires.js": +/*!***********************************!*\ + !*** ../config/questionnaires.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + // API'routes (after "apiUrl" defined in instance.js) + questionnaireRoutes: "/questionnaire", + getQuestionnaireRoutes: "/get", + previewQuestionnaireRoutes: "/preview", + publishedQuestionnaireRoutes: "/quiz/", + saveAnswersRoute: "/answer/", + getStatsQuestionnaires: "/stats/", + searchQuestionnairesRoute: "/search", + searchAdminQuestionnairesRoute: "/searchadmin", + getListNextQuestionnaires: "/getlistnextquestionnaires/", + // -- questions & choices : + questionsRoute: "/question/", + // -- tags : + tagsSearchRoute: "/tags/search/", + // -- answers : + getQuestionnairesWithoutAnswer: "/withoutanswer/user/", + getPreviousAnswers: "/user/answers/", + getStatsAnswers: "/user/anwswers/stats/", + getAdminStats: "/getadminstats/", + // forms : à compléter avec valeurs par défaut, etc. cf modèle + Questionnaire: { + title: { + maxlength: 255, + required: true + }, + slug: { + maxlength: 150 + }, + // champ requis mais calculé à partir du titre qd vide + introduction: { + required: true + } + }, + searchQuestionnaires: { + minlength: 3, + required: true + }, + Question: { + text: { + maxlength: 255, + required: true + }, + rank: { + required: true, + min: 1, + defaultValue: 1 + } + }, + Choice: { + text: { + maxlength: 255, + required: true + } + }, + nbQuestionsMin: 1, + nbQuestionsMax: 10, + nbChoicesMax: 10, + nbTagsMin: 0, + nbTagsMax: 0, + // 0 = not max + // JSON and HTML dir + dirCacheQuestionnaires: "datas/questionnaires", + dirCacheQuestions: "datas/questionnaires/questions", + dirCacheUsersQuestionnaires: "datas/users/questionnaires", + dirCacheTags: "datas/questionnaires/tags", + dirHTMLQuestionnaire: "front/public/quiz", + dirHTMLTags: "front/public/quizs", + dirWebQuestionnaire: "quiz", + //pour url page + dirWebTags: "quizs" // idem + +}; + +/***/ }), + +/***/ "../config/users.js": +/*!**************************!*\ + !*** ../config/users.js ***! + \**************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + // API'routes (after "apiUrl" defined in instance.js) + userRoutes: "/user", + subscribeRoute: "/signup", + getGodfatherRoute: "/getgodfatherid", + checkIfIsEmailfreeRoute: "/isemailfree", + checkSubscribeTokenRoute: "/validation/", + checkLoginRoute: "/checklogin/", + connectionRoute: "/login", + getLoginLinkRoute: "/getloginlink", + connectionWithLinkRoute: "/checkloginlink", + getUserInfos: "/get/", + createUserRoute: "/create", + validateUserRoute: "/validate/", + updateUserInfos: "/modify/", + searchUserRoute: "/search/", + getGodChilds: "/getgodchilds/", + checkNewLoginLinkRoute: "/confirmnewlogin/", + checkDeleteLinkRoute: "/confirmdelete/", + getPayments: "/payment/getforoneuser/", + unsubscribeRoute: "/subscription/stop/", + getAdminStats: "/getadminstats/", + // forms : à compléter avec valeurs par défaut, etc. cf modèle + name: { + maxlength: 70, + required: true + }, + email: { + maxlength: 255, + required: true + }, + password: { + minlength: 8, + maxlength: 72, + required: true + }, + // https://www.npmjs.com/package/bcrypt#security-issues-and-concerns + newPassword: { + minlength: 8, + maxlength: 72 + }, + codeGodfather: { + maxlength: 255 + }, + cguOk: { + value: "true", + required: true + }, + timeDifferenceMin: -720, + timeDifferenceMax: 840, + // JSON dir + dirCacheUsers: "datas/users", + dirCacheUsersAnswers: "datas/users/questionnaires/answers" +}; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/answer$": +/*!*************************************!*\ + !*** ../lang sync ^\.\/.*\/answer$ ***! + \*************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/answer": "../lang/fr/answer.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/answer$"; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/general$": +/*!**************************************!*\ + !*** ../lang sync ^\.\/.*\/general$ ***! + \**************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/general": "../lang/fr/general.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/general$"; + +/***/ }), + +/***/ "../lang/fr/answer.js": +/*!****************************!*\ + !*** ../lang/fr/answer.js ***! + \****************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + needNumberUserResponses: "Le nombre de questions auxquelles l'utilisateur a répondu doit être fourni.", + needIntegerNumberUserResponses: "Le nombre de questions auxquelles l'utilisateur a répondu doit être un nombre entier.", + needMinNumberUserResponses: "Le nombre de questions auxquelles l'utilisateur a répondu ne peut être inférieur à 1.", + needMaxNumberUserResponses: "Le nombre de questions auxquelles l'utilisateur a répondu ne peut être aussi élevé.", + needNumberCorrectResponses: "Le nombre de réponses correctes doit être fourni.", + needIntegerNumberCorrectResponses: "Le nombre de réponses correctes doit être un nombre entier.", + needMinNumberCorrectResponses: "Le nombre de réponses correctes ne peut être négatif.", + needMaxNumberCorrectResponses: "Le nombre de réponses correctes ne peut être supérieur au nombre de questions.", + needIntegerNumberSecondesResponse: "La durée de la réponse doit être un nombre entier de secondes.", + needMinNumberSecondesResponse: "La durée de la réponse ne peut être négative.", + checkResponsesOuputFail: "Vous avez répondu en DURATION secondes et avez NBCORRECTANSWERS bonne(s) réponse(s) sur NBQUESTIONS. C'est certain, vous ferez mieux la prochaine fois !", + checkResponsesOuputMedium: "Vous avez répondu en DURATION secondes et avez NBCORRECTANSWERS bonne(s) réponse(s) sur NBQUESTIONS. C'est pas mal du tout !", + checkResponsesOuputSuccess: "Vous avez répondu en DURATION secondes et avez NBCORRECTANSWERS bonne(s) réponse(s) sur NBQUESTIONS. Bravo ! Rien ne vous échappe !", + wantToSaveResponses: "Si vous le souhaitez, vous pouvez sauvegarder votre résultat en créant votre compte.\nCela vous permettra de tester de nouveau ce quiz dans l'avenir pour voir si vous avez mémoriser les bonnes réponses. Vous pourrez ainsi aussi recevoir régulièrement de nouveaux quizs.", + responseSavedMessage: "Votre résultat a été enregistré. Accèder à tous vos quizs.", + responseSavedError: "Cependant une erreur a été rencontrée durant l'enregistrement de votre résultat. Accèder à tous vos quizs.", + noQuestionnaireWithoudAnswer: "Bravo ! Vous avez répondu à tous les quizs qui vous on été proposés !
    Il y en a des nouveaux publiés régulièrement et qui vous seront proposés.
    En attendant vous pouvez peut-être essayer de répondre de nouveau à certain quiz pour voir si vous vous souvenez des bonnes réponses ?", + nbQuestionnaireWithoudAnswer: "Il y a #NB quizs qui vous ont été proposés et auxquels vous n'avez pas répondu. Voici les derniers :!", + statsUser: "Vous avez enregistré NBANSWERS réponses à NBQUESTIONNAIRES questionnaires différents sur les NBTOTQUESTIONNAIRES proposés par le site.
    En moyenne, vous avez mis AVGDURATION secondes à répondre et avez correctement répondu à AVGCORRECTANSWERS % des questions.", + previousAnswersTitle: "Bonjour #NOM, voici vos précédents résultats à ce quiz", + previousAnswersStats: "En moyenne, vous avez répondu à ce quiz en AVGDURATION secondes, en ayant AVGCORRECTANSWERS % de bonnes réponses.", + previousAnswersLine: "Le DATEANSWER, vous avez répondu correctement à NBCORRECTANSWERS questions en AVGDURATION secondes.", + noPreviousAnswer: "Bonjour #NOM, c'est la première fois que vous répondez à ce quiz. Bonne lecture !" +}; + +/***/ }), + +/***/ "../lang/fr/general.js": +/*!*****************************!*\ + !*** ../lang/fr/general.js ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + siteHTMLTitle: "WikiLerni : qu'allez-vous apprendre aujourd'hui ?", + siteMetaDescription: "Chaque jour, testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.", + scriptTimingInfo: "Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", + scriptTimingAlert: "*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", + serverError: "Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.", + serverErrorAdmin: "Bug de l'application :", + neededParams: "Des paramètres nécessaires manquants sont manquants.", + badUrl: "Tentative d'accès à une page n'existant pas :", + notValidFormat: "Format non valide.", + notAllowed: "Vous n'avez pas les droits nécessaires pour cette action.", + notRequired: "Facultatif.", + updateBtnTxt: "Modifier", + addBtnTxt: "Ajouter", + deleteBtnTxt: "Supprimer", + addOkMessage: "Les données ont bien été enregistrées.", + updateOkMessage: "La mise à jour à jour a bien été enregistrée.", + deleteOkMessage: "La suppression a bien été enregistrée.", + failAuth: "Erreur d'authentification.", + failAuthHeader: "Absence de header Authorization.", + failAuthToken: "Token invalide ou utilisateur non trouvé.", + failAuthId: "Identifiant non valide : ", + failAuthCron: "Tentative de lancement d'un cron sans le bon token.", + previousPage: "Page précédente", + nextPage: "Page suivante", + btnLinkToQuestionnaire: "Aller au quiz !", + statsAdmin: "Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
    En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
    Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium." +}; + +/***/ }), + +/***/ "../tools/main.js": +/*!************************!*\ + !*** ../tools/main.js ***! + \************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +// Quelques fonctions utiles pour les chaînes +var Tool = /*#__PURE__*/function () { + function Tool() { + _classCallCheck(this, Tool); + } + + _createClass(Tool, null, [{ + key: "isEmpty", + value: function isEmpty(myVar) { + if (myVar === undefined || myVar === null) return true;else { + myVar += ""; // si autre chose qu'une chaîne envoyé... + + myVar = myVar.trim(); + if (myVar === "") return true;else return false; + } + } + }, { + key: "trimIfNotNull", + value: function trimIfNotNull(myString) { + if (Tool.isEmpty(myString)) myString = null;else { + myString += ""; // si autre chose qu'une chaîne envoyé... + + myString = myString.trim(); + } + return myString; + } + }, { + key: "shortenIfLongerThan", + value: function shortenIfLongerThan(myString, max) { + myString += ""; // au cas où cela ne serait pas une chaîne... + + if (myString.length > max) myString = myString.substring(0, max - 3) + "..."; + return myString; + } // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings + + }, { + key: "replaceAll", + value: function replaceAll(myString, mapObj) { + var replaceElts = new RegExp(Object.keys(mapObj).join("|"), "gi"); + return myString.replace(replaceElts, function (matched) { + return mapObj[matched]; + }); + } // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random + + }, { + key: "getRandomInt", + value: function getRandomInt(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min)) + min; + } // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country + + }, { + key: "dateFormat", + value: function dateFormat(dateString) { + var lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "fr"; + if (Tool.isEmpty(dateString)) return ""; + var myDate = new Date(dateString); + var myDay = myDate.getDate() + ""; + if (myDay.length === 1) myDay = "0" + myDay; + var myMounth = myDate.getMonth() + 1 + ""; + if (myMounth.length === 1) myMounth = "0" + myMounth; + var myYear = myDate.getFullYear(); + if (lang === "fr") return myDay + "/" + myMounth + "/" + myYear;else if (lang === "form") // 2014-02-09 + return myYear + "-" + myMounth + "-" + myDay;else return myMounth + "/" + myDay + "/" + myYear; + } + }]); + + return Tool; +}(); + +module.exports = Tool; + +/***/ }), + +/***/ "../views sync recursive ^\\.\\/.*\\.js$": +/*!**********************************!*\ + !*** ../views sync ^\.\/.*\.js$ ***! + \**********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./default/config/fr.js": "../views/default/config/fr.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../views sync recursive ^\\.\\/.*\\.js$"; + +/***/ }), + +/***/ "../views/default/config/fr.js": +/*!*************************************!*\ + !*** ../views/default/config/fr.js ***! + \*************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + headLinks: [{ + anchor: "Accueil", + attributes: { + href: "/" + } + }, { + anchor: "Mon compte", + attributes: { + href: "/connexion.hmt", + id: "accountHeadLink" + } + }, { + anchor: "À propos", + attributes: { + href: "/a-propos.html" + } + }, { + anchor: "Contact", + attributes: { + href: "/contact.html" + } + }], + footLinks: [{ + anchor: "Crédits", + attributes: { + href: "/credits.html" + } + }, { + anchor: "Mentions légales", + attributes: { + href: "/mentions-legales.html", + rel: "nofollow" + } + }, { + anchor: "Données personnelles", + attributes: { + href: "/donnees.html" + } + }, { + anchor: "C.G.U.", + attributes: { + href: "/cgu.html", + rel: "nofollow" + } + }, { + anchor: "C.G.V.", + attributes: { + href: "/cgv.html", + rel: "nofollow" + } + }], + maxQuestionnairesByPage: 10, + userHomePage: "accueil.html", + adminHomePage: "admin.html", + managerHomePage: "gestion.html", + subscribePage: "inscription.html", + connectionPage: "connexion.html", + accountPage: "compte.html", + questionnairesManagementPage: "gestion-quizs.html", + usersManagementPage: "gestion-utilisateurs.html", + nbQuestionnairesUserHomePage: 10, + illustrationDir: "/img/quizs/", + siteSlogan: "Cultivons notre jardin !", + homeTitle1: "De nature curieuse ?", + homeP1: "Avec WikiLerni vous apprenez chaque jour de nouvelles choses.
    Des articles de Wikipédia sont sélectionnés pour vous et sont suivis d'un quiz vous permettant de tester ce que vous en avez retenu.
    De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre \"jardin\".", + homeTitle2: "La culture en liberté", + homeP2: "Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
    Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
    Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
    Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.

    (*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.", + newQuestionnairesTitle: "Les derniers quizs publiés sur WikiLerni", + newQuestionnairesIntro: "Liste des derniers quizs publiés sur WikiLerni.", + explanationTitle: "Vous découvrez WikiLerni ?", + explanationTxt: "Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
    Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.

    Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.

    Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)

    Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
    Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.

    Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.", + noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript." +}; + +/***/ }), + +/***/ "./src/config/general.js": +/*!*******************************!*\ + !*** ./src/config/general.js ***! + \*******************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// à supprimer une fois que tout récupérer du backend : +module.exports = { + apiUrl: "http://localhost:3000/api", + usersGetConfigUrl: "/user/getconfig", + lang: "fr", + userHomePage: "accueil.html", + adminHomePage: "admin.html", + managerHomePage: "gestion.html", + subscribePage: "inscription.html", + connectionPage: "connexion.html", + accountPage: "compte.html", + questionnairesManagementPage: "gestion-quizs.html", + usersManagementPage: "gestion-utilisateurs.html", + nbQuestionnairesUserHomePage: 10, + illustrationDir: "/img/quizs/" +}; + +/***/ }), + +/***/ "./src/questionnaire.js": +/*!******************************!*\ + !*** ./src/questionnaire.js ***! + \******************************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ "../config/instance.js"); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _config_questionnaires_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../config/questionnaires.js */ "../config/questionnaires.js"); +/* harmony import */ var _config_questionnaires_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_questionnaires_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _tools_answers_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/answers.js */ "./src/tools/answers.js"); +/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js"); +/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js"); +/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_forms_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tools/forms.js */ "./src/tools/forms.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_7__); +/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./tools/users.js */ "./src/tools/users.js"); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + +// -- GESTION DU FORMULAIRE PERMETTANT D'AFFICHER ET RÉPONDRE À UN QUIZ +/// Il n'est pas nécessaire d'être connecté pour répondre au quiz et voir son résultat. +/// Mais si pas connecté, on propose à l'internaute de se connecter ou de créer un compte pour sauvegarder son résultat. +/// Dans ce but son résultat est stocké dans son navigateur. +/// Si il est connecté, l'enregistrement de son résultat se fait automatiquement côté serveur et ses éventuels précédents résultats sont affichés. +// Fichier de configuration tirés du backend : + +var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0]; + + +var configTemplate = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); + + + + + + + + // Dictionnaires : + +var txt = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + lang + "/general"); + +var txtAnswers = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/answer$")("./" + lang + "/answer"); // Principaux éléments du DOM manipulés : + + +var myForm = document.getElementById("questionnaire"); +var divResponse = document.getElementById("response"); +var btnShow = document.getElementById("showQuestionnaire"); +var btnSubmit = document.getElementById("checkResponses"); +var explanationsTitle = document.getElementById("explanationsTitle"); +var explanationsContent = document.getElementById("explanationsContent"); +var isConnected, user; + +var initialise = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _context.prev = 0; + btnShow.style.display = "inline"; // bouton caché si JS inactif, car JS nécessaire pour vérifier les réponses + + _context.next = 4; + return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_8__["checkSession"])(["user"]); + + case 4: + isConnected = _context.sent; + + // seuls les utilisateurs de base peuvent répondre aux quizs + // Si l'utilisateur est connecté et a déjà répondu à ce quiz, on affiche ses précédentes réponses à la place du texte servant à expliquer le topo aux nouveaux + if (isConnected) { + user = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_5__["getLocaly"])("user", true); + Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_4__["updateAccountLink"])(user.status, configTemplate); + checkPreviousResponses(user); + } + + _context.next = 11; + break; + + case 8: + _context.prev = 8; + _context.t0 = _context["catch"](0); + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]); + + case 11: + case "end": + return _context.stop(); + } + } + }, _callee, null, [[0, 8]]); + })); + + return function initialise() { + return _ref.apply(this, arguments); + }; +}(); + +initialise(); +Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_4__["helloDev"])(); // Affichage du questionnaire quand l'utilisateur clique sur le bouton ou si l'id du formulaire est passée par l'url +// Déclenche en même temps le chronomètre mesurant la durée de la réponse aux questions. + +var showQuestionnaire = function showQuestionnaire() { + chronoBegin = Date.now(); + myForm.style.display = "block"; + btnShow.setAttribute("disabled", true); + var here = window.location; // window.location à ajouter pour ne pas quitter la page en mode "preview"... + + window.location.assign(here + "#questionnaire"); +}; + +var chronoBegin = 0; +btnShow.addEventListener("click", function (e) { + try { + e.preventDefault(); + showQuestionnaire(); + } catch (e) { + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]); + } +}); // Lien passé par mail pour voir directement le quiz + +if (location.hash != undefined && location.hash === "#questionnaire") showQuestionnaire(); // Traitement de l'envoi de la réponse de l'utilisateur : + +var answer = {}; +myForm.addEventListener("submit", function (e) { + try { + e.preventDefault(); + btnSubmit.setAttribute("disabled", true); // seulement un envoi à la fois :) + + divResponse.innerHTML = ""; // supprime les éventuels messages déjà affichés + + var userResponses = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_6__["getDatasFromInputs"])(myForm); + answer.duration = Math.round((Date.now() - chronoBegin) / 1000); + answer.nbQuestions = 0; + answer.nbCorrectAnswers = 0; + answer.QuestionnaireId = document.getElementById("questionnaireId").value; // Les réponses sont regroupées par question, donc quand l'idQuestion change, on connaît le résultat pour la question précédente + // Pour qu'une réponse soit bonne, il faut cocher toutes les bonnes réponses (si QCM) à une question et cocher aucune des mauvaises + + var idChoice, + idQuestion = "", + goodResponse = false; + + for (var item in userResponses) { + if (item.startsWith("isCorrect_response_")) // = nouvelle réponse possible + { + idChoice = item.substring(item.lastIndexOf("_") + 1); // si on change de queston + + if (userResponses["question_id_response_" + idChoice] != idQuestion) // on commence à traiter une nouvelle question + { + idQuestion = userResponses["question_id_response_" + idChoice]; + answer.nbQuestions++; + if (goodResponse) // résultat pour la question précédente + answer.nbCorrectAnswers++; + goodResponse = true; // réponse bonne jusqu'à la première erreur... + } + + if (userResponses[item] == "true") { + document.getElementById("response_" + idChoice).parentNode.classList.add("success"); + if (userResponses["response_" + idChoice] === undefined) // bonne réponse non sélectionnée + goodResponse = false; + } else { + if (userResponses["response_" + idChoice] === "on") // réponse cochée n'étant pas une des bonnes + { + goodResponse = false; + document.getElementById("response_" + idChoice).parentNode.classList.add("error"); + } + } + } + } // si j'ai bien répondu à la dernière question, il faut le traiter ici, car je suis sorti de la boucle : + + + if (goodResponse) answer.nbCorrectAnswers++; // Affichage du résultat, suivant si l'utilisateur est connecté ou pas et son score : + + var getOuput = Object(_tools_answers_js__WEBPACK_IMPORTED_MODULE_2__["checkAnswerOuput"])(answer); + + if (isConnected) { + // Si l'utilisateur est connecté on enregistre son résultat sur le serveur. + var xhrSaveAnswer = new XMLHttpRequest(); + xhrSaveAnswer.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + _config_questionnaires_js__WEBPACK_IMPORTED_MODULE_1__["questionnaireRoutes"] + _config_questionnaires_js__WEBPACK_IMPORTED_MODULE_1__["saveAnswersRoute"]); + + xhrSaveAnswer.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var xhrResponse = JSON.parse(this.responseText); + + if (this.status === 201 && xhrResponse.message) { + getOuput += "
    " + xhrResponse.message.replace("#URL", configTemplate.userHomePage); + checkPreviousResponses(user); + } else getOuput += "
    " + txtAnswers.responseSavedError.replace("#URL", configTemplate.userHomePage); + + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", getOuput, "", ["information"]); + } + }; + + xhrSaveAnswer.setRequestHeader("Authorization", "Bearer " + user.token); + xhrSaveAnswer.setRequestHeader("Content-Type", "application/json"); + answer.timeDifference = Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_8__["getTimeDifference"])(); // on en profite pour mettre les pendules à l'heure + + xhrSaveAnswer.send(JSON.stringify(answer)); + } else { + // si pas connecté, on enregistre le résultat côté client pour permettre de le retrouver au moment de la création du compte ou de la connexion + if (Object(_tools_answers_js__WEBPACK_IMPORTED_MODULE_2__["saveAnswer"])(answer)) { + getOuput += "
    " + txtAnswers.wantToSaveResponses; + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", getOuput, "", ["information"]); + document.querySelector(".subcribeBtns").style.display = "block"; + } else // pas la peine de proposer de créer un compte si le stockage local ne fonctionne pas + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", getOuput, "", ["information"]); + } // affichage des textes d'explications pour chaque question + + + var explanations = document.querySelectorAll(".help"); + + for (var i in explanations) { + if (explanations[i].style != undefined) // sinon, la console affiche une erreur "TypeError: explanations[i].style is undefined", bien que tout fonctionne (?) + explanations[i].style.display = "block"; + } + } catch (e) { + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]); + console.error(e); + } +}); // Fonction vérifiant les précédentes réponses de l'utilisateur +// Utile si connecté lors du premier chargement de la page, puis après une nouvelle réponse + +var checkPreviousResponses = function checkPreviousResponses(user) { + var xhrPreviousRes = new XMLHttpRequest(); + xhrPreviousRes.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + _config_questionnaires_js__WEBPACK_IMPORTED_MODULE_1__["questionnaireRoutes"] + _config_questionnaires_js__WEBPACK_IMPORTED_MODULE_1__["getPreviousAnswers"] + user.id + "/" + document.getElementById("questionnaireId").value); + + xhrPreviousRes.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var response = JSON.parse(this.responseText); + + if (this.status === 200) { + var nbResponses = response.length; + var previousAnswersContent = ""; + + if (nbResponses !== 0) { + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(explanationsTitle, "span", txtAnswers.previousAnswersTitle.replace("#NOM", user.name)); + var totNbQuestions = 0, + totNbCorrectAnswers = 0, + totDuration = 0, + mapLineContent; + + for (var i in response) { + totNbQuestions += response[i].nbQuestions; + totNbCorrectAnswers += response[i].nbCorrectAnswers; + totDuration += response[i].duration; + mapLineContent = { + DATEANSWER: Object(_tools_main__WEBPACK_IMPORTED_MODULE_7__["dateFormat"])(response[i].createdAt), + // revoir problème de la langue + NBCORRECTANSWERS: response[i].nbCorrectAnswers, + AVGDURATION: response[i].duration + }; + previousAnswersContent += "
  • " + Object(_tools_main__WEBPACK_IMPORTED_MODULE_7__["replaceAll"])(txtAnswers.previousAnswersLine, mapLineContent) + "
  • "; + } + + mapLineContent = { + AVGDURATION: Math.round(totDuration / nbResponses), + AVGCORRECTANSWERS: Math.round(totNbCorrectAnswers / totNbQuestions * 100) + }; + previousAnswersContent = "
    " + Object(_tools_main__WEBPACK_IMPORTED_MODULE_7__["replaceAll"])(txtAnswers.previousAnswersStats, mapLineContent) + "
    " + previousAnswersContent; + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(explanationsContent, "ul", previousAnswersContent); + } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(explanationsContent, "ul", txtAnswers.noPreviousAnswer.replace("#NOM", user.name)); + } //else + // addElement(divResponse, "p", txt.serverError, "", ["error"]); // pas forcément utile de prévenir du bug ici ? + + } + }; + + xhrPreviousRes.setRequestHeader("Authorization", "Bearer " + user.token); + xhrPreviousRes.send(); +}; + +/***/ }), + +/***/ "./src/tools/answers.js": +/*!******************************!*\ + !*** ./src/tools/answers.js ***! + \******************************/ +/*! exports provided: saveAnswer, checkAnswerOuput */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveAnswer", function() { return saveAnswer; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkAnswerOuput", function() { return checkAnswerOuput; }); +/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_1__); +var configFrontEnd = __webpack_require__(/*! ../config/general */ "./src/config/general.js"); + + + + +var txt = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/answer$")("./" + configFrontEnd.lang + "/answer"); // Enregistrement côté client du dernier résultat à un quiz en attendant d'être connecté + + +var saveAnswer = function saveAnswer(answer) { + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.duration) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.nbCorrectAnswers) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.nbQuestions) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.QuestionnaireId)) { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["saveLocaly"])("lastAnswer", answer); + return true; + } else return false; +}; // Retourne le texte suivant le nombre de bonnes réponses + +var checkAnswerOuput = function checkAnswerOuput(answer) { + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.duration) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.nbCorrectAnswers) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.nbQuestions)) { + var ratio = answer.nbCorrectAnswers / answer.nbQuestions; + var mapObj = { + DURATION: answer.duration, + NBCORRECTANSWERS: answer.nbCorrectAnswers, + NBQUESTIONS: answer.nbQuestions + }; + var output = ""; + if (ratio < 0.4) output = Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["replaceAll"])(txt.checkResponsesOuputFail, mapObj);else if (ratio < 0.8) output = Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["replaceAll"])(txt.checkResponsesOuputMedium, mapObj);else output = Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["replaceAll"])(txt.checkResponsesOuputSuccess, mapObj); + if (output) return output;else return ""; + } else return ""; +}; +/* +export const checkSession = async (config) => +{ + return new Promise((resolve, reject) => + { + if(isEmpty(localStorage.getItem("user"))) + resolve(false); + else + { + const user=JSON.parse(localStorage.getItem("user")); + if(user.duration===undefined || user.duration < Date.now()) + { + localStorage.removeItem("user"); + resolve(false); + } + else + { + const xhr = new XMLHttpRequest(); + xhr.open("GET", configFrontEnd.apiUrl+config.userRoutes+config.checkLoginRoute+user.token); + xhr.onload = () => + { + let response=JSON.parse(xhr.responseText); + if (xhr.status === 200 && response.isValid && response.id != undefined) + { + if(response.id===user.id) + resolve(true); + else + { + localStorage.removeItem("user"); + resolve(false); + } + } + else + { + localStorage.removeItem("user"); + resolve(false); + } + } + xhr.onerror = () => reject(xhr.statusText); + xhr.send(); + } + } + }); +}*/ + +/***/ }), + +/***/ "./src/tools/clientstorage.js": +/*!************************************!*\ + !*** ./src/tools/clientstorage.js ***! + \************************************/ +/*! exports provided: saveLocaly, getLocaly, removeLocaly */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveLocaly", function() { return saveLocaly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaly", function() { return getLocaly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeLocaly", function() { return removeLocaly; }); +// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.) +// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie +var saveLocaly = function saveLocaly(name, data) { + localStorage.setItem(name, JSON.stringify(data)); +}; +var getLocaly = function getLocaly(name) { + var json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name); +}; +var removeLocaly = function removeLocaly(name) { + localStorage.removeItem(name); +}; + +/***/ }), + +/***/ "./src/tools/dom.js": +/*!**************************!*\ + !*** ./src/tools/dom.js ***! + \**************************/ +/*! exports provided: addElement */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addElement", function() { return addElement; }); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__); +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + + // Fonction associant les attributs fournis à un champ de formulaire + +var addElement = function addElement(eltParent, eltType) { + var eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; + var eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; + var eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : []; + var eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; + var replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true; + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltType) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltParent)) return false;else { + var newElement = document.createElement(eltType); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ? + newElement.id = eltId; + + if (Array.isArray(eltClass) && eltClass.length != 0) { + for (var i in eltClass) { + newElement.classList.add(eltClass[i]); + } + } + + if (_typeof(eltAttributes) === "object") // !! tous les objets ne sont pas ok + { + for (var attributName in eltAttributes) { + newElement.setAttribute(attributName, eltAttributes[attributName]); + } + } + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltContent)) newElement.innerHTML = eltContent.replace(/\n/g, "
    "); // innerHTML permet d'ajouter du texte ayant lui-même des balises, etc. + + if (replace) eltParent.innerHTML = ""; + eltParent.appendChild(newElement); + } +}; + +/***/ }), + +/***/ "./src/tools/everywhere.js": +/*!*********************************!*\ + !*** ./src/tools/everywhere.js ***! + \*********************************/ +/*! exports provided: helloDev, updateAccountLink */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "helloDev", function() { return helloDev; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateAccountLink", function() { return updateAccountLink; }); +// Ce script fournit des fonctions utilisées sur toutes les pages du site +var helloDev = function helloDev() { + console.log("**** Hello ami développeur :-)\n Le code de WikiLerni est libre et est lisible sur gitlab : \n Bonne lecture :-) \n Pour les suggestions d'amélioration ou questions : dev@wililerni.com ****"); + return true; +}; +var updateAccountLink = function updateAccountLink(status, configTemplate) { + var link = document.getElementById("accountHeadLink"); + var homePage = status + "HomePage"; + link.href = "/" + configTemplate[homePage]; +}; + +/***/ }), + +/***/ "./src/tools/forms.js": +/*!****************************!*\ + !*** ./src/tools/forms.js ***! + \****************************/ +/*! exports provided: setAttributesToInputs, getDatasFromInputs, empyForm, empyAndHideForm */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setAttributesToInputs", function() { return setAttributesToInputs; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDatasFromInputs", function() { return getDatasFromInputs; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empyForm", function() { return empyForm; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empyAndHideForm", function() { return empyAndHideForm; }); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__); +function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + + // Fonction associant les attributs fournis à un champ de formulaire + +var setAttributesToInputs = function setAttributesToInputs(inputsConf, myForm) { + for (var i in myForm.elements) { + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(myForm.elements[i].id)) { + var idInput = myForm.elements[i].id; + + if (inputsConf[idInput] !== undefined) { + var inputHTML = document.getElementById(idInput); + + for (var attribute in inputsConf[idInput]) { + inputHTML.setAttribute(attribute, inputsConf[idInput][attribute]); + } + } + } + } + + return true; +}; // Récupère toutes les valeurs de champs en omettant les checkbox non cochées, etc. + +var getDatasFromInputs = function getDatasFromInputs(myForm) { + var datas = {}; + var formData = new FormData(myForm); + + var _iterator = _createForOfIteratorHelper(formData.entries()), + _step; + + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var entrie = _step.value; + datas[entrie[0]] = entrie[1]; + } + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); + } + + return datas; +}; // Vide tous les champs d'un formulaire, y compris hidden, checkbox, etc. +// Revoir pour les select + +var empyForm = function empyForm(myForm) { + var formData = new FormData(myForm); + + var _iterator2 = _createForOfIteratorHelper(formData.entries()), + _step2; + + try { + for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { + var entrie = _step2.value; + if (myForm.elements[entrie[0]].type == "checkbox" || myForm.elements[entrie[0]].type == "radio") myForm.elements[entrie[0]].checked = false;else myForm.elements[entrie[0]].value = ""; + } + } catch (err) { + _iterator2.e(err); + } finally { + _iterator2.f(); + } + + return true; +}; // Vide et cache le formulaire + +var empyAndHideForm = function empyAndHideForm(myForm) { + empyForm(myForm); + myForm.style.display = "none"; +}; + +/***/ }), + +/***/ "./src/tools/users.js": +/*!****************************!*\ + !*** ./src/tools/users.js ***! + \****************************/ +/*! exports provided: getConfig, getTimeDifference, getPassword, setSession, checkAnswerDatas, checkSession */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getConfig", function() { return getConfig; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTimeDifference", function() { return getTimeDifference; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getPassword", function() { return getPassword; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setSession", function() { return setSession; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkAnswerDatas", function() { return checkAnswerDatas; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkSession", function() { return checkSession; }); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/instance.js */ "../config/instance.js"); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../config/users.js */ "../config/users.js"); +/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_3__); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + + +var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0]; + +var configTemplate = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); + + + + // Récupère les données de configuration des utilisateurs +// À terme, un fichier statique importable comme module devrait éviter une requête ajax + +var getConfig = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + return _context.abrupt("return", new Promise(function (resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + "/user/getconfig"); + + xhr.onload = function () { + return resolve(JSON.parse(xhr.responseText)); + }; + + xhr.onerror = function () { + return reject(xhr.statusText); + }; + + xhr.send(); + })); + + case 1: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + + return function getConfig() { + return _ref.apply(this, arguments); + }; +}(); +var getTimeDifference = function getTimeDifference() { + var timeLocal = new Date().getTimezoneOffset(); + if (timeLocal > _config_users_js__WEBPACK_IMPORTED_MODULE_1__["timeDifferenceMax"] || timeLocal < _config_users_js__WEBPACK_IMPORTED_MODULE_1__["timeDifferenceMin"]) return 0;else return timeLocal; +}; // On enlève volontairement les 0/O pour éviter les confusions ! +// Et mieux vaut aussi débuter et finir par une lettre simple. + +var getPassword = function getPassword(nbCarMin, nbCarMax) { + var nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin)); + var letters = "ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz"; + var others = "123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ"; + var password = letters[Math.floor(Math.random() * letters.length)]; + + for (var i = 1; i < nbCar - 1; i++) { + if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)]; + } + + password += letters[Math.floor(Math.random() * letters.length)]; + return password; +}; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite +// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides. + +var setSession = function setSession(userId, token, durationTS) { + var storageUser = { + id: userId, + token: token, + duration: durationTS + }; + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("user", storageUser); +}; // Vérifie qu'il y a des données locales concernant le résultat d'un quiz +// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas + +var checkAnswerDatas = function checkAnswerDatas(datas) { + var lastAnswer = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("lastAnswer"); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(lastAnswer)) { + var answer = JSON.parse(lastAnswer); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.duration) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbCorrectAnswers) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.QuestionnaireId) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbQuestions)) { + datas.duration = answer.duration; + datas.nbCorrectAnswers = answer.nbCorrectAnswers; + datas.QuestionnaireId = answer.QuestionnaireId; + datas.nbQuestions = answer.nbQuestions; + } + } + + return datas; +}; // Cette fonction teste la connexion de l'utilisateur d'une page +// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté + +var checkSession = /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() { + var status, + urlRedirection, + message, + urlWanted, + _args2 = arguments; + return regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + status = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : []; + urlRedirection = _args2.length > 1 ? _args2[1] : undefined; + message = _args2.length > 2 ? _args2[2] : undefined; + urlWanted = _args2.length > 3 ? _args2[3] : undefined; + return _context2.abrupt("return", new Promise(function (resolve, reject) { + var userDatas = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("user"); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(userDatas)) { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else { + var user = JSON.parse(userDatas); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.id) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.token) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.duration) || user.duration < Date.now()) { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else { + var xhr = new XMLHttpRequest(); + xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["userRoutes"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["checkLoginRoute"] + user.token); + + xhr.onload = function () { + var response = JSON.parse(xhr.responseText); + + if (xhr.status === 200 && response.isValid && response.id != undefined) { + if (response.id === user.id) { + user.name = response.name; + user.language = response.language; + user.timeDifference = response.timeDifference; + user.status = response.status; // le token et de toute façon vérifier à chaque requête à l'API + + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("user", user); // si il s'agit d'un "user" et que son abonnement a expiré, je le redirige vers la caisse :-) + + if (response.status === "user" && response.nbDaysOk <= 0) { + var urlAccount = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["siteUrl"] + "/" + configTemplate[lang].accountPage; + if (window.location.href.indexOf(urlAccount) === -1) window.location.assign("/" + configTemplate[lang].accountPage); // passée directement ici, l'ancre #subscribe ne fonctionne pas !? + + resolve(true); + } else { + if (status.length !== 0 && status.indexOf(response.status) === -1) { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else resolve(true); + } + } else { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + } else { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + }; + + xhr.onerror = function () { + return reject(xhr.statusText); + }; + + xhr.send(); + } + } + })); + + case 5: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + + return function checkSession() { + return _ref2.apply(this, arguments); + }; +}(); // Cette fonction sert à la précédente en cas de connexion non valide + +var redirectUser = function redirectUser(urlRedirection, message, urlWanted) { + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(message)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("message", message); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlWanted)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("url", urlWanted); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlRedirection)) window.location.assign(urlRedirection); +}; + +/***/ }) + +/******/ }); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9hbnN3ZXIkIiwid2VicGFjazovLy8uLi9sYW5nIHN5bmMgXlxcLlxcLy4qXFwvZ2VuZXJhbCQiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcvZnIvYW5zd2VyLmpzIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL2dlbmVyYWwuanMiLCJ3ZWJwYWNrOi8vLy4uL3Rvb2xzL21haW4uanMiLCJ3ZWJwYWNrOi8vLy4uL3ZpZXdzIHN5bmMgXlxcLlxcLy4qXFwuanMkIiwid2VicGFjazovLy8uLi92aWV3cy9kZWZhdWx0L2NvbmZpZy9mci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY29uZmlnL2dlbmVyYWwuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9ubmFpcmUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2Fuc3dlcnMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2RvbS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvZXZlcnl3aGVyZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvZm9ybXMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL3VzZXJzLmpzIl0sIm5hbWVzIjpbInVzZXJzIiwicmVxdWlyZSIsInF1ZXN0aW9ubmFpcmVzIiwibW9kdWxlIiwiZXhwb3J0cyIsImFwaVVybCIsInNpdGVVcmwiLCJhZG1pbk5hbWUiLCJhZG1pbkVtYWlsIiwic2VuZGVyTmFtZSIsInNlbmRlckVtYWlsIiwiYWRtaW5MYW5nIiwidGhlbWUiLCJhdmFpbGFibGVMYW5ncyIsInNpdGVOYW1lIiwiYmVnaW5Db2RlR29kZmF0aGVyIiwiY3JvblRpbWluZ0FsZXJ0SW5TZWNvbmRlIiwicmVzcG9uc2VUaW1pbmdBbGVydEluU2Vjb25kZSIsInRva2VuU2lnbnVwVmFsaWRhdGlvblRpbWVJbkhvdXJzIiwidG9rZW5Mb2dpbkxpbmtUaW1lSW5Ib3VycyIsInRva2VuQ29ubmV4aW9uTWluVGltZUluSG91cnMiLCJ0b2tlbkNvbm5leGlvbk1heFRpbWVJbkRheXMiLCJ0b2tlbkxvZ2luQ2hhbmdpbmdUaW1lSW5Ib3VycyIsInRva2VuRGVsZXRlVXNlclRpbWVJbkhvdXJzIiwidG9rZW5VbnN1YnNjcmliZUxpbmtUaW1lSW5EYXlzIiwiZnJlZUFjY291bnRUaW1pbmdJbkRheXMiLCJmcmVlQWNjb3VudEV4cGlyYXRpb25Ob3RpZmljYXRpb25JbkRheXMiLCJhY2NvdW50RXhwaXJhdGlvbkZpcnN0Tm90aWZpY2F0aW9uSW5EYXlzIiwiYWNjb3VudEV4cGlyYXRpb25TZWNvbmROb3RpZmljYXRpb25JbkRheXMiLCJpbmFjdGl2ZUFjY291bnRUaW1lVG9EZWxldGVJbkRheXMiLCJuYlF1ZXN0aW9uc01pbiIsIm5iUXVlc3Rpb25zTWF4IiwibmJDaG9pY2VzTWF4IiwibmJOZXdRdWVzdGlvbm5haXJlcyIsImhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUJlZ2luIiwiaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlRW5kIiwibnVtYmVyTmV3UXVlc3Rpb25uYWlyZUF0U2FtZVRpbWUiLCJtaW5TZWFyY2hRdWVzdGlvbm5haXJlcyIsIm5iSWxsdXN0cmF0aW9uc01pbiIsIm5iSWxsdXN0cmF0aW9uc01heCIsIm1heElsbHVzdHJhdGlvblNpemVpbk9jdGV0IiwibWltZVR5cGVzRm9ySWxsdXN0cmF0aW9uIiwiaWxsdXN0cmF0aW9uc1dpZHRoTWF4SW5QeCIsImlsbHVzdHJhdGlvbnNNaW5pYXR1cmVzV2lkdGhNYXhJblB4IiwibmJMaW5rc01pbiIsIm5iTGlua3NNYXgiLCJwYXNzd29yZCIsIm1pbmxlbmd0aCIsImRpckNhY2hlVXNlcnMiLCJkaXJDYWNoZVVzZXJzQW5zd2VycyIsImRpckNhY2hlUXVlc3Rpb25uYWlyZXMiLCJkaXJDYWNoZVF1ZXN0aW9ucyIsImRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlcyIsImRpckhUTUxRdWVzdGlvbm5haXJlIiwiZGlyV2ViUXVlc3Rpb25uYWlyZSIsInF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJnZXRRdWVzdGlvbm5haXJlUm91dGVzIiwicHJldmlld1F1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJwdWJsaXNoZWRRdWVzdGlvbm5haXJlUm91dGVzIiwic2F2ZUFuc3dlcnNSb3V0ZSIsImdldFN0YXRzUXVlc3Rpb25uYWlyZXMiLCJzZWFyY2hRdWVzdGlvbm5haXJlc1JvdXRlIiwic2VhcmNoQWRtaW5RdWVzdGlvbm5haXJlc1JvdXRlIiwiZ2V0TGlzdE5leHRRdWVzdGlvbm5haXJlcyIsInF1ZXN0aW9uc1JvdXRlIiwidGFnc1NlYXJjaFJvdXRlIiwiZ2V0UXVlc3Rpb25uYWlyZXNXaXRob3V0QW5zd2VyIiwiZ2V0UHJldmlvdXNBbnN3ZXJzIiwiZ2V0U3RhdHNBbnN3ZXJzIiwiZ2V0QWRtaW5TdGF0cyIsIlF1ZXN0aW9ubmFpcmUiLCJ0aXRsZSIsIm1heGxlbmd0aCIsInJlcXVpcmVkIiwic2x1ZyIsImludHJvZHVjdGlvbiIsInNlYXJjaFF1ZXN0aW9ubmFpcmVzIiwiUXVlc3Rpb24iLCJ0ZXh0IiwicmFuayIsIm1pbiIsImRlZmF1bHRWYWx1ZSIsIkNob2ljZSIsIm5iVGFnc01pbiIsIm5iVGFnc01heCIsImRpckNhY2hlVGFncyIsImRpckhUTUxUYWdzIiwiZGlyV2ViVGFncyIsInVzZXJSb3V0ZXMiLCJzdWJzY3JpYmVSb3V0ZSIsImdldEdvZGZhdGhlclJvdXRlIiwiY2hlY2tJZklzRW1haWxmcmVlUm91dGUiLCJjaGVja1N1YnNjcmliZVRva2VuUm91dGUiLCJjaGVja0xvZ2luUm91dGUiLCJjb25uZWN0aW9uUm91dGUiLCJnZXRMb2dpbkxpbmtSb3V0ZSIsImNvbm5lY3Rpb25XaXRoTGlua1JvdXRlIiwiZ2V0VXNlckluZm9zIiwiY3JlYXRlVXNlclJvdXRlIiwidmFsaWRhdGVVc2VyUm91dGUiLCJ1cGRhdGVVc2VySW5mb3MiLCJzZWFyY2hVc2VyUm91dGUiLCJnZXRHb2RDaGlsZHMiLCJjaGVja05ld0xvZ2luTGlua1JvdXRlIiwiY2hlY2tEZWxldGVMaW5rUm91dGUiLCJnZXRQYXltZW50cyIsInVuc3Vic2NyaWJlUm91dGUiLCJuYW1lIiwiZW1haWwiLCJuZXdQYXNzd29yZCIsImNvZGVHb2RmYXRoZXIiLCJjZ3VPayIsInZhbHVlIiwidGltZURpZmZlcmVuY2VNaW4iLCJ0aW1lRGlmZmVyZW5jZU1heCIsIm5lZWROdW1iZXJVc2VyUmVzcG9uc2VzIiwibmVlZEludGVnZXJOdW1iZXJVc2VyUmVzcG9uc2VzIiwibmVlZE1pbk51bWJlclVzZXJSZXNwb25zZXMiLCJuZWVkTWF4TnVtYmVyVXNlclJlc3BvbnNlcyIsIm5lZWROdW1iZXJDb3JyZWN0UmVzcG9uc2VzIiwibmVlZEludGVnZXJOdW1iZXJDb3JyZWN0UmVzcG9uc2VzIiwibmVlZE1pbk51bWJlckNvcnJlY3RSZXNwb25zZXMiLCJuZWVkTWF4TnVtYmVyQ29ycmVjdFJlc3BvbnNlcyIsIm5lZWRJbnRlZ2VyTnVtYmVyU2Vjb25kZXNSZXNwb25zZSIsIm5lZWRNaW5OdW1iZXJTZWNvbmRlc1Jlc3BvbnNlIiwiY2hlY2tSZXNwb25zZXNPdXB1dEZhaWwiLCJjaGVja1Jlc3BvbnNlc091cHV0TWVkaXVtIiwiY2hlY2tSZXNwb25zZXNPdXB1dFN1Y2Nlc3MiLCJ3YW50VG9TYXZlUmVzcG9uc2VzIiwicmVzcG9uc2VTYXZlZE1lc3NhZ2UiLCJyZXNwb25zZVNhdmVkRXJyb3IiLCJub1F1ZXN0aW9ubmFpcmVXaXRob3VkQW5zd2VyIiwibmJRdWVzdGlvbm5haXJlV2l0aG91ZEFuc3dlciIsInN0YXRzVXNlciIsInByZXZpb3VzQW5zd2Vyc1RpdGxlIiwicHJldmlvdXNBbnN3ZXJzU3RhdHMiLCJwcmV2aW91c0Fuc3dlcnNMaW5lIiwibm9QcmV2aW91c0Fuc3dlciIsInNpdGVIVE1MVGl0bGUiLCJzaXRlTWV0YURlc2NyaXB0aW9uIiwic2NyaXB0VGltaW5nSW5mbyIsInNjcmlwdFRpbWluZ0FsZXJ0Iiwic2VydmVyRXJyb3IiLCJzZXJ2ZXJFcnJvckFkbWluIiwibmVlZGVkUGFyYW1zIiwiYmFkVXJsIiwibm90VmFsaWRGb3JtYXQiLCJub3RBbGxvd2VkIiwibm90UmVxdWlyZWQiLCJ1cGRhdGVCdG5UeHQiLCJhZGRCdG5UeHQiLCJkZWxldGVCdG5UeHQiLCJhZGRPa01lc3NhZ2UiLCJ1cGRhdGVPa01lc3NhZ2UiLCJkZWxldGVPa01lc3NhZ2UiLCJmYWlsQXV0aCIsImZhaWxBdXRoSGVhZGVyIiwiZmFpbEF1dGhUb2tlbiIsImZhaWxBdXRoSWQiLCJmYWlsQXV0aENyb24iLCJwcmV2aW91c1BhZ2UiLCJuZXh0UGFnZSIsImJ0bkxpbmtUb1F1ZXN0aW9ubmFpcmUiLCJzdGF0c0FkbWluIiwiVG9vbCIsIm15VmFyIiwidW5kZWZpbmVkIiwidHJpbSIsIm15U3RyaW5nIiwiaXNFbXB0eSIsIm1heCIsImxlbmd0aCIsInN1YnN0cmluZyIsIm1hcE9iaiIsInJlcGxhY2VFbHRzIiwiUmVnRXhwIiwiT2JqZWN0Iiwia2V5cyIsImpvaW4iLCJyZXBsYWNlIiwibWF0Y2hlZCIsIk1hdGgiLCJjZWlsIiwiZmxvb3IiLCJyYW5kb20iLCJkYXRlU3RyaW5nIiwibGFuZyIsIm15RGF0ZSIsIkRhdGUiLCJteURheSIsImdldERhdGUiLCJteU1vdW50aCIsImdldE1vbnRoIiwibXlZZWFyIiwiZ2V0RnVsbFllYXIiLCJoZWFkTGlua3MiLCJhbmNob3IiLCJhdHRyaWJ1dGVzIiwiaHJlZiIsImlkIiwiZm9vdExpbmtzIiwicmVsIiwibWF4UXVlc3Rpb25uYWlyZXNCeVBhZ2UiLCJ1c2VySG9tZVBhZ2UiLCJhZG1pbkhvbWVQYWdlIiwibWFuYWdlckhvbWVQYWdlIiwic3Vic2NyaWJlUGFnZSIsImNvbm5lY3Rpb25QYWdlIiwiYWNjb3VudFBhZ2UiLCJxdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlIiwidXNlcnNNYW5hZ2VtZW50UGFnZSIsIm5iUXVlc3Rpb25uYWlyZXNVc2VySG9tZVBhZ2UiLCJpbGx1c3RyYXRpb25EaXIiLCJzaXRlU2xvZ2FuIiwiaG9tZVRpdGxlMSIsImhvbWVQMSIsImhvbWVUaXRsZTIiLCJob21lUDIiLCJuZXdRdWVzdGlvbm5haXJlc1RpdGxlIiwibmV3UXVlc3Rpb25uYWlyZXNJbnRybyIsImV4cGxhbmF0aW9uVGl0bGUiLCJleHBsYW5hdGlvblR4dCIsIm5vSlNOb3RpZmljYXRpb24iLCJ1c2Vyc0dldENvbmZpZ1VybCIsImNvbmZpZ1RlbXBsYXRlIiwidHh0IiwidHh0QW5zd2VycyIsIm15Rm9ybSIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJkaXZSZXNwb25zZSIsImJ0blNob3ciLCJidG5TdWJtaXQiLCJleHBsYW5hdGlvbnNUaXRsZSIsImV4cGxhbmF0aW9uc0NvbnRlbnQiLCJpc0Nvbm5lY3RlZCIsInVzZXIiLCJpbml0aWFsaXNlIiwic3R5bGUiLCJkaXNwbGF5IiwiY2hlY2tTZXNzaW9uIiwiZ2V0TG9jYWx5IiwidXBkYXRlQWNjb3VudExpbmsiLCJzdGF0dXMiLCJjaGVja1ByZXZpb3VzUmVzcG9uc2VzIiwiYWRkRWxlbWVudCIsImhlbGxvRGV2Iiwic2hvd1F1ZXN0aW9ubmFpcmUiLCJjaHJvbm9CZWdpbiIsIm5vdyIsInNldEF0dHJpYnV0ZSIsImhlcmUiLCJ3aW5kb3ciLCJsb2NhdGlvbiIsImFzc2lnbiIsImFkZEV2ZW50TGlzdGVuZXIiLCJlIiwicHJldmVudERlZmF1bHQiLCJoYXNoIiwiYW5zd2VyIiwiaW5uZXJIVE1MIiwidXNlclJlc3BvbnNlcyIsImdldERhdGFzRnJvbUlucHV0cyIsImR1cmF0aW9uIiwicm91bmQiLCJuYlF1ZXN0aW9ucyIsIm5iQ29ycmVjdEFuc3dlcnMiLCJRdWVzdGlvbm5haXJlSWQiLCJpZENob2ljZSIsImlkUXVlc3Rpb24iLCJnb29kUmVzcG9uc2UiLCJpdGVtIiwic3RhcnRzV2l0aCIsImxhc3RJbmRleE9mIiwicGFyZW50Tm9kZSIsImNsYXNzTGlzdCIsImFkZCIsImdldE91cHV0IiwiY2hlY2tBbnN3ZXJPdXB1dCIsInhoclNhdmVBbnN3ZXIiLCJYTUxIdHRwUmVxdWVzdCIsIm9wZW4iLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJyZWFkeVN0YXRlIiwiRE9ORSIsInhoclJlc3BvbnNlIiwiSlNPTiIsInBhcnNlIiwicmVzcG9uc2VUZXh0IiwibWVzc2FnZSIsInNldFJlcXVlc3RIZWFkZXIiLCJ0b2tlbiIsInRpbWVEaWZmZXJlbmNlIiwiZ2V0VGltZURpZmZlcmVuY2UiLCJzZW5kIiwic3RyaW5naWZ5Iiwic2F2ZUFuc3dlciIsInF1ZXJ5U2VsZWN0b3IiLCJleHBsYW5hdGlvbnMiLCJxdWVyeVNlbGVjdG9yQWxsIiwiaSIsImNvbnNvbGUiLCJlcnJvciIsInhoclByZXZpb3VzUmVzIiwicmVzcG9uc2UiLCJuYlJlc3BvbnNlcyIsInByZXZpb3VzQW5zd2Vyc0NvbnRlbnQiLCJ0b3ROYlF1ZXN0aW9ucyIsInRvdE5iQ29ycmVjdEFuc3dlcnMiLCJ0b3REdXJhdGlvbiIsIm1hcExpbmVDb250ZW50IiwiREFURUFOU1dFUiIsImRhdGVGb3JtYXQiLCJjcmVhdGVkQXQiLCJOQkNPUlJFQ1RBTlNXRVJTIiwiQVZHRFVSQVRJT04iLCJyZXBsYWNlQWxsIiwiQVZHQ09SUkVDVEFOU1dFUlMiLCJjb25maWdGcm9udEVuZCIsInNhdmVMb2NhbHkiLCJyYXRpbyIsIkRVUkFUSU9OIiwiTkJRVUVTVElPTlMiLCJvdXRwdXQiLCJkYXRhIiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsImpzb24iLCJnZXRJdGVtIiwicmVtb3ZlTG9jYWx5IiwicmVtb3ZlSXRlbSIsImVsdFBhcmVudCIsImVsdFR5cGUiLCJlbHRDb250ZW50IiwiZWx0SWQiLCJlbHRDbGFzcyIsImVsdEF0dHJpYnV0ZXMiLCJuZXdFbGVtZW50IiwiY3JlYXRlRWxlbWVudCIsIkFycmF5IiwiaXNBcnJheSIsImF0dHJpYnV0TmFtZSIsImFwcGVuZENoaWxkIiwibG9nIiwibGluayIsImhvbWVQYWdlIiwic2V0QXR0cmlidXRlc1RvSW5wdXRzIiwiaW5wdXRzQ29uZiIsImVsZW1lbnRzIiwiaWRJbnB1dCIsImlucHV0SFRNTCIsImF0dHJpYnV0ZSIsImRhdGFzIiwiZm9ybURhdGEiLCJGb3JtRGF0YSIsImVudHJpZXMiLCJlbnRyaWUiLCJlbXB5Rm9ybSIsInR5cGUiLCJjaGVja2VkIiwiZW1weUFuZEhpZGVGb3JtIiwiZ2V0Q29uZmlnIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJ4aHIiLCJvbmxvYWQiLCJvbmVycm9yIiwic3RhdHVzVGV4dCIsInRpbWVMb2NhbCIsImdldFRpbWV6b25lT2Zmc2V0IiwiZ2V0UGFzc3dvcmQiLCJuYkNhck1pbiIsIm5iQ2FyTWF4IiwibmJDYXIiLCJsZXR0ZXJzIiwib3RoZXJzIiwic2V0U2Vzc2lvbiIsInVzZXJJZCIsImR1cmF0aW9uVFMiLCJzdG9yYWdlVXNlciIsImNoZWNrQW5zd2VyRGF0YXMiLCJsYXN0QW5zd2VyIiwidXJsUmVkaXJlY3Rpb24iLCJ1cmxXYW50ZWQiLCJ1c2VyRGF0YXMiLCJyZWRpcmVjdFVzZXIiLCJpc1ZhbGlkIiwibGFuZ3VhZ2UiLCJuYkRheXNPayIsInVybEFjY291bnQiLCJpbmRleE9mIl0sIm1hcHBpbmdzIjoiO1FBQUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7OztRQUdBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwwQ0FBMEMsZ0NBQWdDO1FBQzFFO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0Esd0RBQXdELGtCQUFrQjtRQUMxRTtRQUNBLGlEQUFpRCxjQUFjO1FBQy9EOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7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O0FBQ0osYUF0RU0sQ0FGaUI7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsR0FBSDs7QUFBQSxrQkFBWnRELFlBQVk7QUFBQTtBQUFBO0FBQUEsR0FBbEIsQyxDQTBFUDs7QUFDQSxJQUFNa0osWUFBWSxHQUFHLFNBQWZBLFlBQWUsQ0FBQ0gsY0FBRCxFQUFpQjlGLE9BQWpCLEVBQTBCK0YsU0FBMUIsRUFDckI7QUFDSSxNQUFHLENBQUN2TiwyREFBTyxDQUFDd0gsT0FBRCxDQUFYLEVBQ0k4QixvRUFBVSxDQUFDLFNBQUQsRUFBWTlCLE9BQVosQ0FBVjtBQUNKLE1BQUcsQ0FBQ3hILDJEQUFPLENBQUN1TixTQUFELENBQVgsRUFDSWpFLG9FQUFVLENBQUMsS0FBRCxFQUFRaUUsU0FBUixDQUFWO0FBQ0osTUFBRyxDQUFDdk4sMkRBQU8sQ0FBQ3NOLGNBQUQsQ0FBWCxFQUNJbkksTUFBTSxDQUFDQyxRQUFQLENBQWdCQyxNQUFoQixDQUF1QmlJLGNBQXZCO0FBQ1AsQ0FSRCxDIiwiZmlsZSI6Ii4vSlMvcXVlc3Rpb25uYWlyZS5hcHAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gXCIuL3NyYy9xdWVzdGlvbm5haXJlLmpzXCIpO1xuIiwiY29uc3QgdXNlcnMgPSByZXF1aXJlKFwiLi91c2Vyc1wiKTtcbmNvbnN0IHF1ZXN0aW9ubmFpcmVzID0gcmVxdWlyZShcIi4vcXVlc3Rpb25uYWlyZXNcIik7XG5cbm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBhcGlVcmw6IFwiaHR0cDovL2xvY2FsaG9zdDozMDAwL2FwaVwiLFxuICAgIHNpdGVVcmw6IFwiaHR0cDovL2xvY2FsaG9zdDo4MDgwXCIsXG4gICAgYWRtaW5OYW1lOiBcIkZhYnJpY2VcIixcbiAgICBhZG1pbkVtYWlsOiBcImRldkB3aWtpbGVybmkuY29tXCIsXG4gICAgc2VuZGVyTmFtZTogXCJXaWtpTGVybmlcIixcbiAgICBzZW5kZXJFbWFpbDogXCJib25qb3VyQHdpa2lsZXJuaS5jb21cIixcbiAgICBhZG1pbkxhbmc6IFwiZnJcIixcbiAgICB0aGVtZTogXCJkZWZhdWx0XCIsIC8vIGxlIHRow6htZSB1dGlsaXPDqSAoZGFucyAvdmlld3MpIHBvdXIgZ8OpbsOpcmVyIGxlcyBwYWdlcyBIVE1MLiBDb250aWVudCBzZXMgcHJvcHJlcyBmaWNoaWVycyBkZSBjb25maWd1cmF0aW9uLlxuICAgIGF2YWlsYWJsZUxhbmdzOiBbXCJmclwiXSwvLyBMYW5ndWFnZXMgaW4gd2hpY2ggdGhlIHNpdGUgaXMgYXZhaWxhYmxlLiBUaGUgZmlyc3Qgb25lIGlzIHRoZSBkZWZhdWx0IG9uZS5cbiAgICBzaXRlTmFtZTogXCJXaWtpTGVybmlcIixcbiAgICBiZWdpbkNvZGVHb2RmYXRoZXI6IFwid2lraWxlcm5pXCIsIC8vIGNhc2Utc2Vuc2l0aXZlIGFuZCBjYW4ndCBjb250YWluIFwiQFwiICFcbiAgICBjcm9uVGltaW5nQWxlcnRJblNlY29uZGU6IDEyMCwgLy8gZm9yIGxvZ3NcbiAgICByZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlOiAzLCAvLyBpZGVtXG4gICAgdG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnM6IFwiNDhoXCIsIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96ZWl0L21zXG4gICAgdG9rZW5Mb2dpbkxpbmtUaW1lSW5Ib3VyczogXCIxaFwiLFxuICAgIHRva2VuQ29ubmV4aW9uTWluVGltZUluSG91cnM6IFwiMjRoXCIsXG4gICAgdG9rZW5Db25uZXhpb25NYXhUaW1lSW5EYXlzOiBcIjE4MCBkYXlzXCIsXG4gICAgdG9rZW5Mb2dpbkNoYW5naW5nVGltZUluSG91cnM6IFwiMWhcIiwvLyBmb3IgZW1haWwgJiBwYXNzd29yZCBjaGFuZ2luZ1xuICAgIHRva2VuRGVsZXRlVXNlclRpbWVJbkhvdXJzOiBcIjFoXCIsXG4gICAgdG9rZW5VbnN1YnNjcmliZUxpbmtUaW1lSW5EYXlzOiBcIjcgZGF5c1wiLCAvLyB0b2tlbiBzZW5kIHdpdGggc3Vic2NyaXB0aW9uJ3MgZW1haWxzXG4gICAgZnJlZUFjY291bnRUaW1pbmdJbkRheXM6IDEwLFxuICAgIGZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5czogNSxcbiAgICBhY2NvdW50RXhwaXJhdGlvbkZpcnN0Tm90aWZpY2F0aW9uSW5EYXlzOiAxNCwgICAgXG4gICAgYWNjb3VudEV4cGlyYXRpb25TZWNvbmROb3RpZmljYXRpb25JbkRheXM6IDUsXG4gICAgaW5hY3RpdmVBY2NvdW50VGltZVRvRGVsZXRlSW5EYXlzOiAxODAsXG4gICAgLy8gUXVlc3Rpb25uYWlyZXM6XG4gICAgbmJRdWVzdGlvbnNNaW46IDEsIC8vIG1pbmltdW0gbnVtYmVyIG9mIHF1ZXN0aW9ucyBmb3IgdGhlIHF1ZXN0aW9ubmFpcmUgdG8gYmUgcHVibGlzaGFibGVcbiAgICBuYlF1ZXN0aW9uc01heDogMTAsIC8vIGlmIDAgPSBub3QgbWF4aW11bVxuICAgIG5iQ2hvaWNlc01heDogMTAsXG4gICAgbmJOZXdRdWVzdGlvbm5haXJlczogMTAsLy8gZm9yIFJTUywgZXRjLlxuICAgIGhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUJlZ2luOjEsIC8vIGluIHVzZXIgbG9jYWwgdGltZVxuICAgIGhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUVuZDoyNCwgLy8gaWRlbVxuICAgIG51bWJlck5ld1F1ZXN0aW9ubmFpcmVBdFNhbWVUaW1lOiA1MCwgLy8gZm9yIG1hc3MgbWFpbGluZ1xuICAgIG1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzOiAzLFxuICAgIC8vIElsbHVzdHJhdGlvbnM6XG4gICAgbmJJbGx1c3RyYXRpb25zTWluOiAwLFxuICAgIG5iSWxsdXN0cmF0aW9uc01heDogMSxcbiAgICBtYXhJbGx1c3RyYXRpb25TaXplaW5PY3RldDogMTAwMDAwMCwvLyBwYXMgY29udHLDtGzDqSBwb3VyIGwnaW5zdGFudC4gw4AgcmV2b2lyLlxuICAgIG1pbWVUeXBlc0ZvcklsbHVzdHJhdGlvbjogWyBcImltYWdlL2pwZ1wiLCBcImltYWdlL2pwZWdcIiwgXCJpbWFnZS9wbmdcIiwgXCJpbWFnZS9naWZcIiwgXCJpbWFnZS9wbmdcIiBdLFxuICAgIC8vIC0tIFVwbG9hZCBhbmQgcmVzaXplOlxuICAgIGlsbHVzdHJhdGlvbnNXaWR0aE1heEluUHg6IDQwMCxcbiAgICBpbGx1c3RyYXRpb25zTWluaWF0dXJlc1dpZHRoTWF4SW5QeDogMjAwLFxuICAgIC8vIExpbmtzOlxuICAgIG5iTGlua3NNaW46IDEsXG4gICAgbmJMaW5rc01heDogMSxcbiAgICAvLyDDoCBzdXBwcmltZXIgcXVhbmQgdG91cyBsZXMgXCJyZXF1aXJlXCIgw6Agam91cjpcbiAgICBuYlF1ZXN0aW9uc01pbjogcXVlc3Rpb25uYWlyZXMubmJRdWVzdGlvbnNNaW4sXG4gICAgbmJRdWVzdGlvbnNNYXg6IHF1ZXN0aW9ubmFpcmVzLm5iUXVlc3Rpb25zTWF4LFxuICAgIG5iQ2hvaWNlc01heDogcXVlc3Rpb25uYWlyZXMubmJDaG9pY2VzTWF4LFxuICAgIHBhc3N3b3JkTWluTGVuZ3RoOiB1c2Vycy5wYXNzd29yZC5taW5sZW5ndGgsXG4gICAgZGlyQ2FjaGVVc2VyczogdXNlcnMuZGlyQ2FjaGVVc2VycyxcbiAgICBkaXJDYWNoZVVzZXJzQW5zd2VyczogdXNlcnMuZGlyQ2FjaGVVc2Vyc0Fuc3dlcnMsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbm5haXJlczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyxcbiAgICBkaXJDYWNoZVF1ZXN0aW9uczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVRdWVzdGlvbnMsXG4gICAgZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzOiBxdWVzdGlvbm5haXJlcy5kaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXMsXG4gICAgZGlySFRNTFF1ZXN0aW9ubmFpcmU6IHF1ZXN0aW9ubmFpcmVzLmRpckhUTUxRdWVzdGlvbm5haXJlLFxuICAgIGRpcldlYlF1ZXN0aW9ubmFpcmU6IHF1ZXN0aW9ubmFpcmVzLmRpcldlYlF1ZXN0aW9ubmFpcmVcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxueyAgICBcbiAgICAvLyBBUEkncm91dGVzIChhZnRlciBcImFwaVVybFwiIGRlZmluZWQgaW4gaW5zdGFuY2UuanMpXG4gICAgcXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcXVlc3Rpb25uYWlyZVwiLFxuICAgIGdldFF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL2dldFwiLFxuICAgIHByZXZpZXdRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9wcmV2aWV3XCIsXG4gICAgcHVibGlzaGVkUXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcXVpei9cIixcbiAgICBzYXZlQW5zd2Vyc1JvdXRlOiBcIi9hbnN3ZXIvXCIsXG4gICAgZ2V0U3RhdHNRdWVzdGlvbm5haXJlcyA6IFwiL3N0YXRzL1wiLFxuICAgIHNlYXJjaFF1ZXN0aW9ubmFpcmVzUm91dGUgOiBcIi9zZWFyY2hcIixcbiAgICBzZWFyY2hBZG1pblF1ZXN0aW9ubmFpcmVzUm91dGUgOiBcIi9zZWFyY2hhZG1pblwiLFxuICAgIGdldExpc3ROZXh0UXVlc3Rpb25uYWlyZXM6IFwiL2dldGxpc3RuZXh0cXVlc3Rpb25uYWlyZXMvXCIsXG4gICAgLy8gLS0gcXVlc3Rpb25zICYgY2hvaWNlcyA6XG4gICAgcXVlc3Rpb25zUm91dGU6IFwiL3F1ZXN0aW9uL1wiLFxuICAgIC8vIC0tIHRhZ3MgOlxuICAgIHRhZ3NTZWFyY2hSb3V0ZTogXCIvdGFncy9zZWFyY2gvXCIsXG4gICAgLy8gLS0gYW5zd2VycyA6XG4gICAgZ2V0UXVlc3Rpb25uYWlyZXNXaXRob3V0QW5zd2VyOiBcIi93aXRob3V0YW5zd2VyL3VzZXIvXCIsXG4gICAgZ2V0UHJldmlvdXNBbnN3ZXJzOiBcIi91c2VyL2Fuc3dlcnMvXCIsXG4gICAgZ2V0U3RhdHNBbnN3ZXJzIDogXCIvdXNlci9hbndzd2Vycy9zdGF0cy9cIixcbiAgICBnZXRBZG1pblN0YXRzOiBcIi9nZXRhZG1pbnN0YXRzL1wiLFxuICAgIC8vIGZvcm1zIDogw6AgY29tcGzDqXRlciBhdmVjIHZhbGV1cnMgcGFyIGTDqWZhdXQsIGV0Yy4gY2YgbW9kw6hsZVxuICAgIFF1ZXN0aW9ubmFpcmUgOlxuICAgIHtcbiAgICAgICAgdGl0bGU6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgIHNsdWc6IHsgbWF4bGVuZ3RoOiAxNTAgfSwgLy8gY2hhbXAgcmVxdWlzIG1haXMgY2FsY3Vsw6kgw6AgcGFydGlyIGR1IHRpdHJlIHFkIHZpZGVcbiAgICAgICAgaW50cm9kdWN0aW9uOiB7IHJlcXVpcmVkOiB0cnVlIH1cbiAgICB9LFxuICAgIHNlYXJjaFF1ZXN0aW9ubmFpcmVzIDogeyBtaW5sZW5ndGg6IDMsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgUXVlc3Rpb24gOlxuICAgIHtcbiAgICAgICAgdGV4dDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgcmFuazogeyByZXF1aXJlZDogdHJ1ZSwgbWluOjEsIGRlZmF1bHRWYWx1ZToxIH1cbiAgICB9LCAgICAgICAgICBcbiAgICBDaG9pY2UgOlxuICAgIHtcbiAgICAgICAgdGV4dDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfVxuICAgIH0sICAgICAgICAgIFxuICAgIG5iUXVlc3Rpb25zTWluOiAxLFxuICAgIG5iUXVlc3Rpb25zTWF4OiAxMCxcbiAgICBuYkNob2ljZXNNYXg6IDEwLFxuICAgIG5iVGFnc01pbjogMCxcbiAgICBuYlRhZ3NNYXg6IDAsIC8vIDAgPSBub3QgbWF4ICAgIFxuICAgIC8vIEpTT04gYW5kIEhUTUwgZGlyXG4gICAgZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXNcIixcbiAgICBkaXJDYWNoZVF1ZXN0aW9ucyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXMvcXVlc3Rpb25zXCIsXG4gICAgZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzIDogXCJkYXRhcy91c2Vycy9xdWVzdGlvbm5haXJlc1wiLFxuICAgIGRpckNhY2hlVGFncyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXMvdGFnc1wiLCAgXG4gICAgZGlySFRNTFF1ZXN0aW9ubmFpcmUgOiBcImZyb250L3B1YmxpYy9xdWl6XCIsXG4gICAgZGlySFRNTFRhZ3MgOiBcImZyb250L3B1YmxpYy9xdWl6c1wiLFxuICAgIGRpcldlYlF1ZXN0aW9ubmFpcmUgOiBcInF1aXpcIiwvL3BvdXIgdXJsIHBhZ2VcbiAgICBkaXJXZWJUYWdzIDogXCJxdWl6c1wiLy8gaWRlbVxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgLy8gQVBJJ3JvdXRlcyAoYWZ0ZXIgXCJhcGlVcmxcIiBkZWZpbmVkIGluIGluc3RhbmNlLmpzKVxuICAgIHVzZXJSb3V0ZXM6IFwiL3VzZXJcIixcbiAgICBzdWJzY3JpYmVSb3V0ZTogXCIvc2lnbnVwXCIsXG4gICAgZ2V0R29kZmF0aGVyUm91dGU6IFwiL2dldGdvZGZhdGhlcmlkXCIsXG4gICAgY2hlY2tJZklzRW1haWxmcmVlUm91dGU6IFwiL2lzZW1haWxmcmVlXCIsXG4gICAgY2hlY2tTdWJzY3JpYmVUb2tlblJvdXRlOiBcIi92YWxpZGF0aW9uL1wiLFxuICAgIGNoZWNrTG9naW5Sb3V0ZTogXCIvY2hlY2tsb2dpbi9cIixcbiAgICBjb25uZWN0aW9uUm91dGU6IFwiL2xvZ2luXCIsXG4gICAgZ2V0TG9naW5MaW5rUm91dGU6IFwiL2dldGxvZ2lubGlua1wiLFxuICAgIGNvbm5lY3Rpb25XaXRoTGlua1JvdXRlOiBcIi9jaGVja2xvZ2lubGlua1wiLFxuICAgIGdldFVzZXJJbmZvczogXCIvZ2V0L1wiLFxuICAgIGNyZWF0ZVVzZXJSb3V0ZTogXCIvY3JlYXRlXCIsXG4gICAgdmFsaWRhdGVVc2VyUm91dGU6IFwiL3ZhbGlkYXRlL1wiLFxuICAgIHVwZGF0ZVVzZXJJbmZvczogXCIvbW9kaWZ5L1wiLFxuICAgIHNlYXJjaFVzZXJSb3V0ZTogXCIvc2VhcmNoL1wiLFxuICAgIGdldEdvZENoaWxkczogXCIvZ2V0Z29kY2hpbGRzL1wiLFxuICAgIGNoZWNrTmV3TG9naW5MaW5rUm91dGU6IFwiL2NvbmZpcm1uZXdsb2dpbi9cIixcbiAgICBjaGVja0RlbGV0ZUxpbmtSb3V0ZTogXCIvY29uZmlybWRlbGV0ZS9cIixcbiAgICBnZXRQYXltZW50czogXCIvcGF5bWVudC9nZXRmb3JvbmV1c2VyL1wiLFxuICAgIHVuc3Vic2NyaWJlUm91dGU6IFwiL3N1YnNjcmlwdGlvbi9zdG9wL1wiLFxuICAgIGdldEFkbWluU3RhdHM6IFwiL2dldGFkbWluc3RhdHMvXCIsXG4gICAgLy8gZm9ybXMgOiDDoCBjb21wbMOpdGVyIGF2ZWMgdmFsZXVycyBwYXIgZMOpZmF1dCwgZXRjLiBjZiBtb2TDqGxlXG4gICAgbmFtZTogeyBtYXhsZW5ndGg6IDcwLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGVtYWlsOiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHBhc3N3b3JkOiB7IG1pbmxlbmd0aDogOCwgbWF4bGVuZ3RoOjcyLCByZXF1aXJlZDogdHJ1ZSB9LCAvLyBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9iY3J5cHQjc2VjdXJpdHktaXNzdWVzLWFuZC1jb25jZXJuc1xuICAgIG5ld1Bhc3N3b3JkOiB7IG1pbmxlbmd0aDogOCwgbWF4bGVuZ3RoOjcyIH0sXG4gICAgY29kZUdvZGZhdGhlcjogeyBtYXhsZW5ndGg6IDI1NSB9LFxuICAgIGNndU9rOiB7IHZhbHVlOiBcInRydWVcIiwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICB0aW1lRGlmZmVyZW5jZU1pbjogLTcyMCxcbiAgICB0aW1lRGlmZmVyZW5jZU1heDo4NDAsXG4gICAgLy8gSlNPTiBkaXJcbiAgICBkaXJDYWNoZVVzZXJzIDogXCJkYXRhcy91c2Vyc1wiLFxuICAgIGRpckNhY2hlVXNlcnNBbnN3ZXJzIDogXCJkYXRhcy91c2Vycy9xdWVzdGlvbm5haXJlcy9hbnN3ZXJzXCJcbn07XG4iLCJ2YXIgbWFwID0ge1xuXHRcIi4vZnIvYW5zd2VyXCI6IFwiLi4vbGFuZy9mci9hbnN3ZXIuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9hbnN3ZXIkXCI7IiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL2dlbmVyYWxcIjogXCIuLi9sYW5nL2ZyL2dlbmVyYWwuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9nZW5lcmFsJFwiOyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBuZWVkTnVtYmVyVXNlclJlc3BvbnNlcyA6IFwiTGUgbm9tYnJlIGRlIHF1ZXN0aW9ucyBhdXhxdWVsbGVzIGwndXRpbGlzYXRldXIgYSByw6lwb25kdSBkb2l0IMOqdHJlIGZvdXJuaS5cIixcbiAgICBuZWVkSW50ZWdlck51bWJlclVzZXJSZXNwb25zZXMgOiBcIkxlIG5vbWJyZSBkZSBxdWVzdGlvbnMgYXV4cXVlbGxlcyBsJ3V0aWxpc2F0ZXVyIGEgcsOpcG9uZHUgZG9pdCDDqnRyZSB1biBub21icmUgZW50aWVyLlwiLFxuICAgIG5lZWRNaW5OdW1iZXJVc2VyUmVzcG9uc2VzIDogXCJMZSBub21icmUgZGUgcXVlc3Rpb25zIGF1eHF1ZWxsZXMgbCd1dGlsaXNhdGV1ciBhIHLDqXBvbmR1IG5lIHBldXQgw6p0cmUgaW5mw6lyaWV1ciDDoCAxLlwiLFxuICAgIG5lZWRNYXhOdW1iZXJVc2VyUmVzcG9uc2VzIDogXCJMZSBub21icmUgZGUgcXVlc3Rpb25zIGF1eHF1ZWxsZXMgbCd1dGlsaXNhdGV1ciBhIHLDqXBvbmR1IG5lIHBldXQgw6p0cmUgYXVzc2kgw6lsZXbDqS5cIixcbiAgICBuZWVkTnVtYmVyQ29ycmVjdFJlc3BvbnNlcyA6IFwiTGUgbm9tYnJlIGRlIHLDqXBvbnNlcyBjb3JyZWN0ZXMgZG9pdCDDqnRyZSBmb3VybmkuXCIsXG4gICAgbmVlZEludGVnZXJOdW1iZXJDb3JyZWN0UmVzcG9uc2VzIDogXCJMZSBub21icmUgZGUgcsOpcG9uc2VzIGNvcnJlY3RlcyBkb2l0IMOqdHJlIHVuIG5vbWJyZSBlbnRpZXIuXCIsXG4gICAgbmVlZE1pbk51bWJlckNvcnJlY3RSZXNwb25zZXMgOiBcIkxlIG5vbWJyZSBkZSByw6lwb25zZXMgY29ycmVjdGVzIG5lIHBldXQgw6p0cmUgbsOpZ2F0aWYuXCIsXG4gICAgbmVlZE1heE51bWJlckNvcnJlY3RSZXNwb25zZXMgOiBcIkxlIG5vbWJyZSBkZSByw6lwb25zZXMgY29ycmVjdGVzIG5lIHBldXQgw6p0cmUgc3Vww6lyaWV1ciBhdSBub21icmUgZGUgcXVlc3Rpb25zLlwiLFxuICAgIG5lZWRJbnRlZ2VyTnVtYmVyU2Vjb25kZXNSZXNwb25zZSA6IFwiTGEgZHVyw6llIGRlIGxhIHLDqXBvbnNlIGRvaXQgw6p0cmUgdW4gbm9tYnJlIGVudGllciBkZSBzZWNvbmRlcy5cIixcbiAgICBuZWVkTWluTnVtYmVyU2Vjb25kZXNSZXNwb25zZSA6IFwiTGEgZHVyw6llIGRlIGxhIHLDqXBvbnNlIG5lIHBldXQgw6p0cmUgbsOpZ2F0aXZlLlwiLFxuICAgIGNoZWNrUmVzcG9uc2VzT3VwdXRGYWlsIDogXCJWb3VzIGF2ZXogcsOpcG9uZHUgZW4gRFVSQVRJT04gc2Vjb25kZXMgZXQgYXZleiBOQkNPUlJFQ1RBTlNXRVJTIGJvbm5lKHMpIHLDqXBvbnNlKHMpIHN1ciBOQlFVRVNUSU9OUy4gQydlc3QgY2VydGFpbiwgdm91cyBmZXJleiBtaWV1eCBsYSBwcm9jaGFpbmUgZm9pcyAhXCIsXG4gICAgY2hlY2tSZXNwb25zZXNPdXB1dE1lZGl1bSA6IFwiVm91cyBhdmV6IHLDqXBvbmR1IGVuIERVUkFUSU9OIHNlY29uZGVzIGV0IGF2ZXogTkJDT1JSRUNUQU5TV0VSUyBib25uZShzKSByw6lwb25zZShzKSBzdXIgTkJRVUVTVElPTlMuIEMnZXN0IHBhcyBtYWwgZHUgdG91dCAhXCIsXG4gICAgY2hlY2tSZXNwb25zZXNPdXB1dFN1Y2Nlc3MgOiBcIlZvdXMgYXZleiByw6lwb25kdSBlbiBEVVJBVElPTiBzZWNvbmRlcyBldCBhdmV6IE5CQ09SUkVDVEFOU1dFUlMgYm9ubmUocykgcsOpcG9uc2Uocykgc3VyIE5CUVVFU1RJT05TLiBCcmF2byAhIFJpZW4gbmUgdm91cyDDqWNoYXBwZSAhXCIsXG4gICAgd2FudFRvU2F2ZVJlc3BvbnNlczogXCJTaSB2b3VzIGxlIHNvdWhhaXRleiwgdm91cyBwb3V2ZXogc2F1dmVnYXJkZXIgdm90cmUgcsOpc3VsdGF0IGVuIGNyw6lhbnQgdm90cmUgY29tcHRlLlxcbkNlbGEgdm91cyBwZXJtZXR0cmEgZGUgdGVzdGVyIGRlIG5vdXZlYXUgY2UgcXVpeiBkYW5zIGwnYXZlbmlyIHBvdXIgdm9pciBzaSB2b3VzIGF2ZXogbcOpbW9yaXNlciBsZXMgYm9ubmVzIHLDqXBvbnNlcy4gVm91cyBwb3VycmV6IGFpbnNpIGF1c3NpIHJlY2V2b2lyIHLDqWd1bGnDqHJlbWVudCBkZSBub3V2ZWF1eCBxdWl6cy5cIixcbiAgICByZXNwb25zZVNhdmVkTWVzc2FnZSA6IFwiVm90cmUgcsOpc3VsdGF0IGEgw6l0w6kgZW5yZWdpc3Ryw6kuIDxhIGhyZWY9Jy8jVVJMJz5BY2PDqGRlciDDoCB0b3VzIHZvcyBxdWl6czwvYT4uXCIsXG4gICAgcmVzcG9uc2VTYXZlZEVycm9yIDogXCJDZXBlbmRhbnQgdW5lIGVycmV1ciBhIMOpdMOpIHJlbmNvbnRyw6llIGR1cmFudCBsJ2VucmVnaXN0cmVtZW50IGRlIHZvdHJlIHLDqXN1bHRhdC4gPGEgaHJlZj0nLyNVUkwnPkFjY8OoZGVyIMOgIHRvdXMgdm9zIHF1aXpzPC9hPi5cIixcbiAgICBub1F1ZXN0aW9ubmFpcmVXaXRob3VkQW5zd2VyOiBcIkJyYXZvICEgVm91cyBhdmV6IHLDqXBvbmR1IMOgIHRvdXMgbGVzIHF1aXpzIHF1aSB2b3VzIG9uIMOpdMOpIHByb3Bvc8OpcyAhPGJyPklsIHkgZW4gYSBkZXMgbm91dmVhdXggcHVibGnDqXMgcsOpZ3VsacOocmVtZW50IGV0IHF1aSB2b3VzIHNlcm9udCBwcm9wb3PDqXMuPGJyPkVuIGF0dGVuZGFudCB2b3VzIHBvdXZleiBwZXV0LcOqdHJlIGVzc2F5ZXIgZGUgcsOpcG9uZHJlIGRlIG5vdXZlYXUgw6AgY2VydGFpbiBxdWl6IHBvdXIgdm9pciBzaSB2b3VzIHZvdXMgc291dmVuZXogZGVzIGJvbm5lcyByw6lwb25zZXMgP1wiLFxuICAgIG5iUXVlc3Rpb25uYWlyZVdpdGhvdWRBbnN3ZXI6IFwiSWwgeSBhICNOQiBxdWl6cyBxdWkgdm91cyBvbnQgw6l0w6kgcHJvcG9zw6lzIGV0IGF1eHF1ZWxzIHZvdXMgbidhdmV6IHBhcyByw6lwb25kdS4gVm9pY2kgbGVzIGRlcm5pZXJzIDohXCIsXG4gICAgc3RhdHNVc2VyOiBcIlZvdXMgYXZleiBlbnJlZ2lzdHLDqSBOQkFOU1dFUlMgcsOpcG9uc2VzIMOgIDxiPk5CUVVFU1RJT05OQUlSRVMgcXVlc3Rpb25uYWlyZXMgZGlmZsOpcmVudHM8L2I+IHN1ciBsZXMgTkJUT1RRVUVTVElPTk5BSVJFUyBwcm9wb3PDqXMgcGFyIGxlIHNpdGUuPGJyPkVuIG1veWVubmUsIHZvdXMgYXZleiBtaXMgQVZHRFVSQVRJT04gc2Vjb25kZXMgw6AgcsOpcG9uZHJlIGV0IGF2ZXogPGI+Y29ycmVjdGVtZW50IHLDqXBvbmR1IMOgIEFWR0NPUlJFQ1RBTlNXRVJTICUgZGVzIHF1ZXN0aW9uczwvYj4uXCIsXG4gICAgcHJldmlvdXNBbnN3ZXJzVGl0bGU6IFwiQm9uam91ciAjTk9NLCB2b2ljaSB2b3MgcHLDqWPDqWRlbnRzIHLDqXN1bHRhdHMgw6AgY2UgcXVpelwiLFxuICAgIHByZXZpb3VzQW5zd2Vyc1N0YXRzOiBcIkVuIG1veWVubmUsIHZvdXMgYXZleiByw6lwb25kdSDDoCBjZSBxdWl6IGVuIEFWR0RVUkFUSU9OIHNlY29uZGVzLCBlbiBheWFudCA8Yj5BVkdDT1JSRUNUQU5TV0VSUyAlIGRlIGJvbm5lcyByw6lwb25zZXM8L2I+LlwiLFxuICAgIHByZXZpb3VzQW5zd2Vyc0xpbmU6IFwiTGUgREFURUFOU1dFUiwgdm91cyBhdmV6IHLDqXBvbmR1IGNvcnJlY3RlbWVudCDDoCBOQkNPUlJFQ1RBTlNXRVJTIHF1ZXN0aW9ucyBlbiBBVkdEVVJBVElPTiBzZWNvbmRlcy5cIixcbiAgICBub1ByZXZpb3VzQW5zd2VyOiBcIkJvbmpvdXIgI05PTSwgYydlc3QgbGEgcHJlbWnDqHJlIGZvaXMgcXVlIHZvdXMgcsOpcG9uZGV6IMOgIGNlIHF1aXouIEJvbm5lIGxlY3R1cmUgIVwiXG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIHNpdGVIVE1MVGl0bGUgOiBcIldpa2lMZXJuaSA6IHF1J2FsbGV6LXZvdXMgYXBwcmVuZHJlIGF1am91cmQnaHVpID9cIixcbiAgICBzaXRlTWV0YURlc2NyaXB0aW9uIDogXCJDaGFxdWUgam91ciwgdGVzdGV6IHZvcyBjb25uYWlzc2FuY2VzIGV0IGFwcHJlbmV6IGRlIG5vdXZlbGxlcyBjaG9zZXMgYXZlYyBXaWtpTGVybmkuXCIsXG4gICAgc2NyaXB0VGltaW5nSW5mbyA6IFwiRHVyw6llIGRlIGxhIHLDqXBvbnNlIDogU0NSSVBUX1RJTUlORyBtaWxsaXNlY29uZGVzLCByb3V0ZSA6IFNDUklQVF9VUkxcIixcbiAgICBzY3JpcHRUaW1pbmdBbGVydCA6IFwiKioqIFNjcmlwdCBsZW50IDogU0NSSVBUX1RJTUlORyBtaWxsaXNlY29uZGVzLCByb3V0ZSA6IFNDUklQVF9VUkxcIixcbiAgICBzZXJ2ZXJFcnJvciA6IFwiRMOpc29sw6kuIFVuZSBlcnJldXIgaW1wcsOpdnVlIGVzdCBzdXJ2ZW51ZS4gU2kgY2VsYSBwZXJzaXN0ZSwgbidow6lzaXRleiDDoCBwcsOpdmVuaXIgbCdhZG1pbmlzdHJhdGV1ciBkdSBzaXRlLlwiLFxuICAgIHNlcnZlckVycm9yQWRtaW4gOiBcIkJ1ZyBkZSBsJ2FwcGxpY2F0aW9uIDpcIixcbiAgICBuZWVkZWRQYXJhbXMgOiBcIkRlcyBwYXJhbcOodHJlcyBuw6ljZXNzYWlyZXMgbWFucXVhbnRzIHNvbnQgbWFucXVhbnRzLlwiLFxuICAgIGJhZFVybCA6IFwiVGVudGF0aXZlIGQnYWNjw6hzIMOgIHVuZSBwYWdlIG4nZXhpc3RhbnQgcGFzIDpcIixcbiAgICBub3RWYWxpZEZvcm1hdCA6IFwiRm9ybWF0IG5vbiB2YWxpZGUuXCIsXG4gICAgbm90QWxsb3dlZCA6IFwiVm91cyBuJ2F2ZXogcGFzIGxlcyBkcm9pdHMgbsOpY2Vzc2FpcmVzIHBvdXIgY2V0dGUgYWN0aW9uLlwiLFxuICAgIG5vdFJlcXVpcmVkIDogXCJGYWN1bHRhdGlmLlwiLFxuICAgIHVwZGF0ZUJ0blR4dDogXCJNb2RpZmllclwiLFxuICAgIGFkZEJ0blR4dDogXCJBam91dGVyXCIsXG4gICAgZGVsZXRlQnRuVHh0OiBcIlN1cHByaW1lclwiLFxuICAgIGFkZE9rTWVzc2FnZSA6IFwiTGVzIGRvbm7DqWVzIG9udCBiaWVuIMOpdMOpIGVucmVnaXN0csOpZXMuXCIsXG4gICAgdXBkYXRlT2tNZXNzYWdlIDogXCJMYSBtaXNlIMOgIGpvdXIgw6Agam91ciBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIGRlbGV0ZU9rTWVzc2FnZSA6IFwiTGEgc3VwcHJlc3Npb24gYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS5cIixcbiAgICBmYWlsQXV0aCA6IFwiRXJyZXVyIGQnYXV0aGVudGlmaWNhdGlvbi5cIixcbiAgICBmYWlsQXV0aEhlYWRlciA6IFwiQWJzZW5jZSBkZSBoZWFkZXIgQXV0aG9yaXphdGlvbi5cIixcbiAgICBmYWlsQXV0aFRva2VuIDogXCJUb2tlbiBpbnZhbGlkZSBvdSB1dGlsaXNhdGV1ciBub24gdHJvdXbDqS5cIixcbiAgICBmYWlsQXV0aElkIDogXCJJZGVudGlmaWFudCBub24gdmFsaWRlIDogXCIsXG4gICAgZmFpbEF1dGhDcm9uIDogXCJUZW50YXRpdmUgZGUgbGFuY2VtZW50IGQndW4gY3JvbiBzYW5zIGxlIGJvbiB0b2tlbi5cIixcbiAgICBwcmV2aW91c1BhZ2UgOiBcIlBhZ2UgcHLDqWPDqWRlbnRlXCIsXG4gICAgbmV4dFBhZ2UgOiBcIlBhZ2Ugc3VpdmFudGVcIixcbiAgICBidG5MaW5rVG9RdWVzdGlvbm5haXJlIDogXCJBbGxlciBhdSBxdWl6ICFcIixcbiAgICBzdGF0c0FkbWluIDogXCJEdXJhbnQgbGVzIGRlcm5pw6hyZXMgMjRoIDogTkJfVVNFUlNfMjRIIGNvbXB0ZXMgb250IMOpdMOpIGNyw6nDqXMsIE5CX1NVQlNDUklQVElPTlNfMjRIIHZhbGlkw6lzIGV0IE5CX1VTRVJTX0RFTEVURURfMjRIIHN1cHByaW3DqXMuIE5CX0FOU1dFUlNfMjRIIHLDqXBvbnNlcyBhdXggcXVpenMgb250IMOpdMOpIGVucmVnaXN0csOpZXMuPGJyPkVuIHRvdXQsIGlsIHkgYSA6IE5CX1VTRVJTX1RPVCBjb21wdGVzLCBkb250IE5CX1NVQlNDUklQVElPTlNfVE9UIHZhbGlkw6lzIGV0IE5CX1NVQlNDUklQVElPTlNfUFJFTUlVTSBjb21wdGVzIHByw6ltaXVtLiBOQl9BTlNXRVJTX1RPVCByw6lwb25zZXMgYXV4IHF1aXpzIG9udCDDqXTDqSBlbnJlZ2lzdHLDqWVzLjxicj5QYXJtaSBsZXMgTkJfVVNFUlNfREVMRVRFRF9UT1QgY29tcHRlcyBzdXBwcmltw6lzLCBOQl9VU0VSU19ERUxFVEVEX1ZBTElERUQgYXZhaWVudCB2YWxpZMOpIGxldXIgY29tcHRlIGV0IE5CX1VTRVJTX0RFTEVURURfUFJFTUlVTSBhdmFpZW50IHNvdXNjcml0IHVuIGNvbXB0ZSBwcsOpbWl1bS5cIlxufTsiLCIvLyBRdWVscXVlcyBmb25jdGlvbnMgdXRpbGVzIHBvdXIgbGVzIGNoYcOubmVzXG5cbmNsYXNzIFRvb2xcbntcbiAgICBzdGF0aWMgaXNFbXB0eShteVZhcilcbiAgICB7XG4gICAgICAgIGlmKG15VmFyPT09dW5kZWZpbmVkIHx8IG15VmFyPT09bnVsbClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIG15VmFyKz1cIlwiOy8vIHNpIGF1dHJlIGNob3NlIHF1J3VuZSBjaGHDrm5lIGVudm95w6kuLi5cbiAgICAgICAgICAgIG15VmFyPW15VmFyLnRyaW0oKTtcbiAgICAgICAgICAgIGlmKG15VmFyPT09XCJcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgc3RhdGljIHRyaW1JZk5vdE51bGwobXlTdHJpbmcpXG4gICAge1xuICAgICAgICBpZihUb29sLmlzRW1wdHkobXlTdHJpbmcpKVxuICAgICAgICAgICAgbXlTdHJpbmc9bnVsbDtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVN0cmluZys9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVN0cmluZz1teVN0cmluZy50cmltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG15U3RyaW5nO1xuICAgIH1cblxuXG4gICAgc3RhdGljIHNob3J0ZW5JZkxvbmdlclRoYW4obXlTdHJpbmcsIG1heClcbiAgICB7XG4gICAgICAgIG15U3RyaW5nKz1cIlwiOy8vIGF1IGNhcyBvw7kgY2VsYSBuZSBzZXJhaXQgcGFzIHVuZSBjaGHDrm5lLi4uXG4gICAgICAgaWYobXlTdHJpbmcubGVuZ3RoID4gbWF4KVxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcuc3Vic3RyaW5nKDAsIChtYXgtMykpK1wiLi4uXCI7XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cbiAgICAvLyBzb3VyY2UgOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNTYwNDE0MC9yZXBsYWNlLW11bHRpcGxlLXN0cmluZ3Mtd2l0aC1tdWx0aXBsZS1vdGhlci1zdHJpbmdzXG4gICAgc3RhdGljIHJlcGxhY2VBbGwobXlTdHJpbmcsIG1hcE9iailcbiAgICB7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VFbHRzID0gbmV3IFJlZ0V4cChPYmplY3Qua2V5cyhtYXBPYmopLmpvaW4oXCJ8XCIpLFwiZ2lcIik7XG4gICAgICAgIHJldHVybiBteVN0cmluZy5yZXBsYWNlKHJlcGxhY2VFbHRzLCAobWF0Y2hlZCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG1hcE9ialttYXRjaGVkXTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZnIvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT2JqZXRzX2dsb2JhdXgvTWF0aC9yYW5kb21cbiAgICBzdGF0aWMgZ2V0UmFuZG9tSW50KG1pbiwgbWF4KVxuICAgIHtcbiAgICAgICAgbWluID0gTWF0aC5jZWlsKG1pbik7XG4gICAgICAgIG1heCA9IE1hdGguZmxvb3IobWF4KTtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pKSArIG1pbjtcbiAgICB9XG5cbiAgICAvLyDDoCBjb21wbMOpdGVyIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGF0ZV9mb3JtYXRfYnlfY291bnRyeVxuICAgIHN0YXRpYyBkYXRlRm9ybWF0KGRhdGVTdHJpbmcsIGxhbmc9XCJmclwiKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KGRhdGVTdHJpbmcpKVxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIGxldCBteURhdGU9bmV3IERhdGUoZGF0ZVN0cmluZyk7XG4gICAgICAgIGxldCBteURheT1teURhdGUuZ2V0RGF0ZSgpK1wiXCI7XG4gICAgICAgIGlmKG15RGF5Lmxlbmd0aD09PTEpXG4gICAgICAgICAgICBteURheT1cIjBcIitteURheTtcbiAgICAgICAgbGV0IG15TW91bnRoPShteURhdGUuZ2V0TW9udGgoKSsxKStcIlwiO1xuICAgICAgICBpZihteU1vdW50aC5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlNb3VudGg9XCIwXCIrbXlNb3VudGg7XG4gICAgICAgIGxldCBteVllYXI9bXlEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGlmKGxhbmc9PT1cImZyXCIpXG4gICAgICAgICAgICByZXR1cm4gbXlEYXkrXCIvXCIrbXlNb3VudGgrXCIvXCIrbXlZZWFyO1xuICAgICAgICBlbHNlIGlmIChsYW5nPT09XCJmb3JtXCIpLy8gMjAxNC0wMi0wOVxuICAgICAgICAgICAgcmV0dXJuIG15WWVhcitcIi1cIitteU1vdW50aCtcIi1cIitteURheTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG15TW91bnRoK1wiL1wiK215RGF5K1wiL1wiK215WWVhcjtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVG9vbDsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZGVmYXVsdC9jb25maWcvZnIuanNcIjogXCIuLi92aWV3cy9kZWZhdWx0L2NvbmZpZy9mci5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi92aWV3cyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC5qcyRcIjsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgaGVhZExpbmtzOlxuICAgIFtcbiAgICAgICAgeyBhbmNob3I6IFwiQWNjdWVpbFwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNb24gY29tcHRlXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb25uZXhpb24uaG10XCIsIGlkOiBcImFjY291bnRIZWFkTGlua1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiw4AgcHJvcG9zXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9hLXByb3Bvcy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDb250YWN0XCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb250YWN0Lmh0bWxcIiB9IH0sXG4gICAgXSxcbiAgICBmb290TGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJDcsOpZGl0c1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY3JlZGl0cy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNZW50aW9ucyBsw6lnYWxlc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvbWVudGlvbnMtbGVnYWxlcy5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiRG9ubsOpZXMgcGVyc29ubmVsbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9kb25uZWVzLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkMuRy5VLlwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY2d1Lmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDLkcuVi5cIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nndi5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICBdLFxuICAgIG1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlOiAxMCxcbiAgICB1c2VySG9tZVBhZ2UgOiBcImFjY3VlaWwuaHRtbFwiLFxuICAgIGFkbWluSG9tZVBhZ2UgOiBcImFkbWluLmh0bWxcIixcbiAgICBtYW5hZ2VySG9tZVBhZ2UgOiBcImdlc3Rpb24uaHRtbFwiLFxuICAgIHN1YnNjcmliZVBhZ2UgOiBcImluc2NyaXB0aW9uLmh0bWxcIixcbiAgICBjb25uZWN0aW9uUGFnZSA6IFwiY29ubmV4aW9uLmh0bWxcIixcbiAgICBhY2NvdW50UGFnZTogXCJjb21wdGUuaHRtbFwiLFxuICAgIHF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi1xdWl6cy5odG1sXCIsXG4gICAgdXNlcnNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXV0aWxpc2F0ZXVycy5odG1sXCIsXG4gICAgbmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSA6IDEwLFxuICAgIGlsbHVzdHJhdGlvbkRpciA6IFwiL2ltZy9xdWl6cy9cIixcbiAgICBzaXRlU2xvZ2FuOiBcIkN1bHRpdm9ucyBub3RyZSBqYXJkaW4gIVwiLFxuICAgIGhvbWVUaXRsZTE6IFwiRGUgbmF0dXJlIGN1cmlldXNlID9cIixcbiAgICBob21lUDE6IFwiQXZlYyBXaWtpTGVybmkgdm91cyBhcHByZW5leiBjaGFxdWUgam91ciBkZSBub3V2ZWxsZXMgY2hvc2VzLjxicj5EZXMgYXJ0aWNsZXMgZGUgV2lraXDDqWRpYSBzb250IHPDqWxlY3Rpb25uw6lzIHBvdXIgdm91cyBldCBzb250IHN1aXZpcyBkJ3VuIHF1aXogdm91cyBwZXJtZXR0YW50IGRlIHRlc3RlciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudS48YnI+RGUgam91ciBlbiBqb3VyIGRlIG5vdXZlbGxlcyBncmFpbmVzIGRlIHNhdm9pciBzb250IGFpbnNpIHNlbcOpZXMgZGFucyB2b3RyZSBcXFwiamFyZGluXFxcIi5cIixcbiAgICBob21lVGl0bGUyOiBcIkxhIGN1bHR1cmUgZW4gbGliZXJ0w6lcIixcbiAgICBob21lUDI6IFwiVG91dCBjb21tZSBzdXIgV2lraXDDqWRpYSAoKiksIGxlIGxvZ2ljaWVsIGV0IGxlIGNvbnRlbnUgcGFydGFnw6kgc3VyIFdpa2lMZXJuaSBzb250IGxpYnJlcy48YnI+Vm91cyBwb3V2ZXogbGVzIHV0aWxpc2VyLCBsZXMgbW9kaWZpZXIgZXQgbGVzIGRpZmZ1c2VyIHNlbG9uIHZvdHJlIHNvdWhhaXQuPGJyPlN1ciBXaWtpTGVybmksIHBhcyBkZSBwdWJsaWNpdMOpLCBuaSBkZSBjb21tZXJjaWFsaXNhdGlvbiBkZSB2b3MgZG9ubsOpZXMgcGVyc29ubmVsbGVzLjxicj5Wb3VzIHBvdXZleiB2ZW5pciB5IFxcXCJjdWx0aXZlciB2b3RyZSBqYXJkaW5cXFwiIGVuIHRvdXRlIHRyYW5xdWlsbGl0w6kuPGJyPjxicj48c21hbGw+PGVtPigqKSBCaWVuIHF1ZSBwYXJ0YWdlYW50IHNlcyB2YWxldXJzLCBXaWtpTGVybmkgZXN0IHVuIHByb2pldCBpbmTDqXBlbmRhbnQgZGUgbGEgZm9uZGF0aW9uIFdpa2lww6lkaWEuPC9lbT48L3NtYWxsPlwiLFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzVGl0bGU6IFwiTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzIHN1ciBXaWtpTGVybmlcIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc0ludHJvOiBcIkxpc3RlIGRlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyBzdXIgV2lraUxlcm5pLlwiLFxuICAgIGV4cGxhbmF0aW9uVGl0bGU6IFwiVm91cyBkw6ljb3V2cmV6IFdpa2lMZXJuaSA/XCIsXG4gICAgZXhwbGFuYXRpb25UeHQ6IFwiTGUgcHJpbmNpcGUgZXN0IHNpbXBsZSA6IHZvdXMgY29tbWVuY2V6IHBhciBsaXJlIGwnYXJ0aWNsZSBXaWtpcMOpZGlhIGRvbnQgbGUgbGllbiB2b3VzIGVzdCBwcm9wb3PDqS48YnI+UHVpcyB2b3VzIGFmZmljaGVyIGxlIHF1aXogcG91ciB2w6lyaWZpZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUgZGUgdm90cmUgbGVjdHVyZS4gVm91cyBvYnRlbmV6IGFsb3JzIHZvdHJlIHLDqXN1bHRhdCBpbW3DqWRpYXRlbWVudC48YnI+PGJyPlRvdXRlcyBsZXMgcsOpcG9uc2VzIHNlIHRyb3V2ZW50IGRhbnMgbCdhcnRpY2xlIHByb3Bvc8OpIMOgIGxhIGxlY3R1cmUuIDxiPlZvdXMgw6p0ZXMgaWNpIHBvdXIgYXBwcmVuZHJlIGRlIG5vdXZlbGxlcyBjaG9zZXM8L2I+LCBtYWlzIGxpYnJlIMOgIHZvdXMgZCdlc3NheWVyIGQneSByw6lwb25kcmUgaW1tw6lkaWF0ZW1lbnQuPGJyPjxicj5RdWFuZCBsZSBzdWpldCBzJ3kgcHLDqnRlLCBuZSB2b3VzIMOpdG9ubmV6IHBhcyBzaSBjZXJ0YWluZXMgZGVzIHLDqXBvbnNlcyBwcm9wb3PDqWVzIHBldXZlbnQgw6p0cmUgdW4gcGV1IGTDqWNhbMOpZXMsIGFic3VyZGVzLi4uIE9uIHBldXQgYXBwcmVuZHJlIGF2ZWMgbGUgc291cmlyZSwgbm9uID8gOi0pPGJyPjxicj5VbmUgZm9pcyB2b3RyZSByw6lzdWx0YXQgb2J0ZW51LCBpbCB2b3VzIHNlcmEgcHJvcG9zw6kgZGUgY3LDqWVyIHVuIGNvbXB0ZSBwb3VyIGxlIHNhdXZlZ2FyZGVyLjxicj5DZSBjb21wdGUgdm91cyBwZXJtZXR0cmEgZGUgdGVzdGVyIGRlIG5vdXZlYXUgY2UgcXVpeiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudSBwbHVzaWV1cnMgam91cnMsIHNlbWFpbmVzLCBtb2lzLi4uIEV0IGRlIHJlY2V2b2lyIHLDqWd1bGnDqHJlbWVudCBkZSBub3V2ZWxsZXMgc3VnZ2VzdGlvbnMgZGUgbGVjdHVyZXMuPGJyPjxicj5NYWlzIDxiPmxhIGNyw6lhdGlvbiBkZSBjZSBjb21wdGUgZXN0IGZhY3VsdGF0aXZlPC9iPiBldCA8YSBocmVmPScvcXVpenMvJyB0aXRsZT0nTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzJz52b3VzIHBvdXZleiBwYXJjb3VyaXIgV2lraUxlcm5pIGxpYnJlbWVudDwvYT4uXCIsXG4gICAgbm9KU05vdGlmaWNhdGlvbjogXCJEw6lzb2zDqSwgbWFpcyBwb3VyIGwnaW5zdGFudCwgbCd1dGlsaXNhdGlvbiBkZSBXaWtpTGVybmkgbsOpY2Vzc2l0ZSBsJ2FjdGl2YXRpb24gZHUgSmF2YVNjcmlwdC5cIixcbn07IiwiLy8gw6Agc3VwcHJpbWVyIHVuZSBmb2lzIHF1ZSB0b3V0IHLDqWN1cMOpcmVyIGR1IGJhY2tlbmQgOlxuXG5tb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgYXBpVXJsIDogXCJodHRwOi8vbG9jYWxob3N0OjMwMDAvYXBpXCIsXG4gICAgdXNlcnNHZXRDb25maWdVcmwgOiBcIi91c2VyL2dldGNvbmZpZ1wiLFxuICAgIGxhbmcgOiBcImZyXCIsXG4gICAgdXNlckhvbWVQYWdlIDogXCJhY2N1ZWlsLmh0bWxcIixcbiAgICBhZG1pbkhvbWVQYWdlIDogXCJhZG1pbi5odG1sXCIsXG4gICAgbWFuYWdlckhvbWVQYWdlIDogXCJnZXN0aW9uLmh0bWxcIixcbiAgICBzdWJzY3JpYmVQYWdlIDogXCJpbnNjcmlwdGlvbi5odG1sXCIsXG4gICAgY29ubmVjdGlvblBhZ2UgOiBcImNvbm5leGlvbi5odG1sXCIsXG4gICAgYWNjb3VudFBhZ2U6IFwiY29tcHRlLmh0bWxcIixcbiAgICBxdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlOiBcImdlc3Rpb24tcXVpenMuaHRtbFwiLFxuICAgIHVzZXJzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi11dGlsaXNhdGV1cnMuaHRtbFwiLFxuICAgIG5iUXVlc3Rpb25uYWlyZXNVc2VySG9tZVBhZ2UgOiAxMCxcbiAgICBpbGx1c3RyYXRpb25EaXIgOiBcIi9pbWcvcXVpenMvXCJcbn07IiwiLy8gLS0gR0VTVElPTiBEVSBGT1JNVUxBSVJFIFBFUk1FVFRBTlQgRCdBRkZJQ0hFUiBFVCBSw4lQT05EUkUgw4AgVU4gUVVJWlxuXG4vLy8gSWwgbidlc3QgcGFzIG7DqWNlc3NhaXJlIGQnw6p0cmUgY29ubmVjdMOpIHBvdXIgcsOpcG9uZHJlIGF1IHF1aXogZXQgdm9pciBzb24gcsOpc3VsdGF0LlxuLy8vIE1haXMgc2kgcGFzIGNvbm5lY3TDqSwgb24gcHJvcG9zZSDDoCBsJ2ludGVybmF1dGUgZGUgc2UgY29ubmVjdGVyIG91IGRlIGNyw6llciB1biBjb21wdGUgcG91ciBzYXV2ZWdhcmRlciBzb24gcsOpc3VsdGF0LlxuLy8vIERhbnMgY2UgYnV0IHNvbiByw6lzdWx0YXQgZXN0IHN0b2Nrw6kgZGFucyBzb24gbmF2aWdhdGV1ci5cbi8vLyBTaSBpbCBlc3QgY29ubmVjdMOpLCBsJ2VucmVnaXN0cmVtZW50IGRlIHNvbiByw6lzdWx0YXQgc2UgZmFpdCBhdXRvbWF0aXF1ZW1lbnQgY8O0dMOpIHNlcnZldXIgZXQgc2VzIMOpdmVudHVlbHMgcHLDqWPDqWRlbnRzIHLDqXN1bHRhdHMgc29udCBhZmZpY2jDqXMuXG5cbi8vIEZpY2hpZXIgZGUgY29uZmlndXJhdGlvbiB0aXLDqXMgZHUgYmFja2VuZCA6XG5pbXBvcnQgeyBhcGlVcmwsIGF2YWlsYWJsZUxhbmdzLCB0aGVtZSB9IGZyb20gXCIuLi8uLi9jb25maWcvaW5zdGFuY2UuanNcIjtcbmNvbnN0IGxhbmc9YXZhaWxhYmxlTGFuZ3NbMF07XG5pbXBvcnQgeyBnZXRQcmV2aW91c0Fuc3dlcnMsIGdldFF1ZXN0aW9ubmFpcmVSb3V0ZXMsIHF1ZXN0aW9ubmFpcmVSb3V0ZXMsIHNhdmVBbnN3ZXJzUm91dGUgfSBmcm9tIFwiLi4vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzXCI7XG5jb25zdCBjb25maWdUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi8uLi92aWV3cy9cIit0aGVtZStcIi9jb25maWcvXCIrbGFuZytcIi5qc1wiKTtcblxuaW1wb3J0IHsgY2hlY2tBbnN3ZXJPdXB1dCwgc2F2ZUFuc3dlciB9IGZyb20gXCIuL3Rvb2xzL2Fuc3dlcnMuanNcIjtcbmltcG9ydCB7IGFkZEVsZW1lbnQgfSBmcm9tIFwiLi90b29scy9kb20uanNcIjtcbmltcG9ydCB7IGhlbGxvRGV2LCB1cGRhdGVBY2NvdW50TGluayB9IGZyb20gXCIuL3Rvb2xzL2V2ZXJ5d2hlcmUuanNcIjtcbmltcG9ydCB7IGdldExvY2FseSB9IGZyb20gXCIuL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanNcIjtcbmltcG9ydCB7IGdldERhdGFzRnJvbUlucHV0cyB9IGZyb20gXCIuL3Rvb2xzL2Zvcm1zLmpzXCI7XG5pbXBvcnQgeyBkYXRlRm9ybWF0LCByZXBsYWNlQWxsIH0gZnJvbSBcIi4uLy4uL3Rvb2xzL21haW5cIjtcbmltcG9ydCB7IGNoZWNrU2Vzc2lvbiwgZ2V0VGltZURpZmZlcmVuY2UgfSBmcm9tIFwiLi90b29scy91c2Vycy5qc1wiO1xuXG4vLyBEaWN0aW9ubmFpcmVzIDpcbmNvbnN0IHR4dCA9IHJlcXVpcmUoXCIuLi8uLi9sYW5nL1wiK2xhbmcrXCIvZ2VuZXJhbFwiKTtcbmNvbnN0IHR4dEFuc3dlcnMgPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL2Fuc3dlclwiKTtcblxuLy8gUHJpbmNpcGF1eCDDqWzDqW1lbnRzIGR1IERPTSBtYW5pcHVsw6lzIDpcbmNvbnN0IG15Rm9ybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicXVlc3Rpb25uYWlyZVwiKTtcbmNvbnN0IGRpdlJlc3BvbnNlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJyZXNwb25zZVwiKTtcbmNvbnN0IGJ0blNob3cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInNob3dRdWVzdGlvbm5haXJlXCIpO1xuY29uc3QgYnRuU3VibWl0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjaGVja1Jlc3BvbnNlc1wiKTtcbmNvbnN0IGV4cGxhbmF0aW9uc1RpdGxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJleHBsYW5hdGlvbnNUaXRsZVwiKTtcbmNvbnN0IGV4cGxhbmF0aW9uc0NvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImV4cGxhbmF0aW9uc0NvbnRlbnRcIik7XG5cbmxldCBpc0Nvbm5lY3RlZCwgdXNlcjtcbmNvbnN0IGluaXRpYWxpc2UgPSBhc3luYyAoKSA9Plxue1xuICAgIHRyeVxuICAgIHtcbiAgICAgICAgYnRuU2hvdy5zdHlsZS5kaXNwbGF5PVwiaW5saW5lXCI7Ly8gYm91dG9uIGNhY2jDqSBzaSBKUyBpbmFjdGlmLCBjYXIgSlMgbsOpY2Vzc2FpcmUgcG91ciB2w6lyaWZpZXIgbGVzIHLDqXBvbnNlc1xuICAgICAgICBpc0Nvbm5lY3RlZD1hd2FpdCBjaGVja1Nlc3Npb24oW1widXNlclwiXSk7Ly8gc2V1bHMgbGVzIHV0aWxpc2F0ZXVycyBkZSBiYXNlIHBldXZlbnQgcsOpcG9uZHJlIGF1eCBxdWl6c1xuICAgICAgICAvLyBTaSBsJ3V0aWxpc2F0ZXVyIGVzdCBjb25uZWN0w6kgZXQgYSBkw6lqw6AgcsOpcG9uZHUgw6AgY2UgcXVpeiwgb24gYWZmaWNoZSBzZXMgcHLDqWPDqWRlbnRlcyByw6lwb25zZXMgw6AgbGEgcGxhY2UgZHUgdGV4dGUgc2VydmFudCDDoCBleHBsaXF1ZXIgbGUgdG9wbyBhdXggbm91dmVhdXhcbiAgICAgICAgaWYoaXNDb25uZWN0ZWQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHVzZXI9Z2V0TG9jYWx5KFwidXNlclwiLCB0cnVlKTtcbiAgICAgICAgICAgIHVwZGF0ZUFjY291bnRMaW5rKHVzZXIuc3RhdHVzLCBjb25maWdUZW1wbGF0ZSk7XG4gICAgICAgICAgICBjaGVja1ByZXZpb3VzUmVzcG9uc2VzKHVzZXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoKGUpXG4gICAge1xuICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgdHh0LnNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgfVxufVxuaW5pdGlhbGlzZSgpO1xuaGVsbG9EZXYoKTtcblxuLy8gQWZmaWNoYWdlIGR1IHF1ZXN0aW9ubmFpcmUgcXVhbmQgbCd1dGlsaXNhdGV1ciBjbGlxdWUgc3VyIGxlIGJvdXRvbiBvdSBzaSBsJ2lkIGR1IGZvcm11bGFpcmUgZXN0IHBhc3PDqWUgcGFyIGwndXJsXG4vLyBEw6ljbGVuY2hlIGVuIG3Dqm1lIHRlbXBzIGxlIGNocm9ub23DqHRyZSBtZXN1cmFudCBsYSBkdXLDqWUgZGUgbGEgcsOpcG9uc2UgYXV4IHF1ZXN0aW9ucy5cbmNvbnN0IHNob3dRdWVzdGlvbm5haXJlID0gKCkgPT5cbntcbiAgICBjaHJvbm9CZWdpbj1EYXRlLm5vdygpO1xuICAgIG15Rm9ybS5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIjtcbiAgICBidG5TaG93LnNldEF0dHJpYnV0ZShcImRpc2FibGVkXCIsIHRydWUpO1xuICAgIGNvbnN0IGhlcmU9d2luZG93LmxvY2F0aW9uOy8vIHdpbmRvdy5sb2NhdGlvbiDDoCBham91dGVyIHBvdXIgbmUgcGFzIHF1aXR0ZXIgbGEgcGFnZSBlbiBtb2RlIFwicHJldmlld1wiLi4uXG4gICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihoZXJlK1wiI3F1ZXN0aW9ubmFpcmVcIik7XG59XG5sZXQgY2hyb25vQmVnaW49MDtcbmJ0blNob3cuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpXG57XG4gICAgdHJ5XG4gICAge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHNob3dRdWVzdGlvbm5haXJlKCk7XG4gICAgfVxuICAgIGNhdGNoKGUpXG4gICAge1xuICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgdHh0LnNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgfVxufSk7XG4vLyBMaWVuIHBhc3PDqSBwYXIgbWFpbCBwb3VyIHZvaXIgZGlyZWN0ZW1lbnQgbGUgcXVpelxuaWYobG9jYXRpb24uaGFzaCE9dW5kZWZpbmVkICYmIGxvY2F0aW9uLmhhc2g9PT1cIiNxdWVzdGlvbm5haXJlXCIpXG4gICAgc2hvd1F1ZXN0aW9ubmFpcmUoKTtcblxuLy8gVHJhaXRlbWVudCBkZSBsJ2Vudm9pIGRlIGxhIHLDqXBvbnNlIGRlIGwndXRpbGlzYXRldXIgOlxubGV0IGFuc3dlciA9IHt9O1xubXlGb3JtLmFkZEV2ZW50TGlzdGVuZXIoXCJzdWJtaXRcIiwgZnVuY3Rpb24oZSlcbntcbiAgICB0cnlcbiAgICB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTsgICAgICAgXG4gICAgICAgIGJ0blN1Ym1pdC5zZXRBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiLCB0cnVlKTsvLyBzZXVsZW1lbnQgdW4gZW52b2kgw6AgbGEgZm9pcyA6KVxuICAgICAgICBkaXZSZXNwb25zZS5pbm5lckhUTUw9XCJcIjsvLyBzdXBwcmltZSBsZXMgw6l2ZW50dWVscyBtZXNzYWdlcyBkw6lqw6AgYWZmaWNow6lzXG4gICAgICAgIGNvbnN0IHVzZXJSZXNwb25zZXM9Z2V0RGF0YXNGcm9tSW5wdXRzKG15Rm9ybSk7XG4gICAgICAgIGFuc3dlci5kdXJhdGlvbj1NYXRoLnJvdW5kKChEYXRlLm5vdygpLWNocm9ub0JlZ2luKS8xMDAwKTtcbiAgICAgICAgYW5zd2VyLm5iUXVlc3Rpb25zPTA7XG4gICAgICAgIGFuc3dlci5uYkNvcnJlY3RBbnN3ZXJzPTA7XG4gICAgICAgIGFuc3dlci5RdWVzdGlvbm5haXJlSWQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJxdWVzdGlvbm5haXJlSWRcIikudmFsdWU7XG4gICAgICAgIC8vIExlcyByw6lwb25zZXMgc29udCByZWdyb3Vww6llcyBwYXIgcXVlc3Rpb24sIGRvbmMgcXVhbmQgbCdpZFF1ZXN0aW9uIGNoYW5nZSwgb24gY29ubmHDrnQgbGUgcsOpc3VsdGF0IHBvdXIgbGEgcXVlc3Rpb24gcHLDqWPDqWRlbnRlXG4gICAgICAgIC8vIFBvdXIgcXUndW5lIHLDqXBvbnNlIHNvaXQgYm9ubmUsIGlsIGZhdXQgY29jaGVyIHRvdXRlcyBsZXMgYm9ubmVzIHLDqXBvbnNlcyAoc2kgUUNNKSDDoCB1bmUgcXVlc3Rpb24gZXQgY29jaGVyIGF1Y3VuZSBkZXMgbWF1dmFpc2VzXG4gICAgICAgIGxldCBpZENob2ljZSwgaWRRdWVzdGlvbj1cIlwiLCBnb29kUmVzcG9uc2U9ZmFsc2U7XG4gICAgICAgIGZvcihsZXQgaXRlbSBpbiB1c2VyUmVzcG9uc2VzKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZihpdGVtLnN0YXJ0c1dpdGgoXCJpc0NvcnJlY3RfcmVzcG9uc2VfXCIpKS8vID0gbm91dmVsbGUgcsOpcG9uc2UgcG9zc2libGVcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZENob2ljZSA9IGl0ZW0uc3Vic3RyaW5nKGl0ZW0ubGFzdEluZGV4T2YoXCJfXCIpICsgMSk7XG4gICAgICAgICAgICAgICAgLy8gc2kgb24gY2hhbmdlIGRlIHF1ZXN0b25cbiAgICAgICAgICAgICAgICBpZih1c2VyUmVzcG9uc2VzW1wicXVlc3Rpb25faWRfcmVzcG9uc2VfXCIraWRDaG9pY2VdIT1pZFF1ZXN0aW9uKSAvLyBvbiBjb21tZW5jZSDDoCB0cmFpdGVyIHVuZSBub3V2ZWxsZSBxdWVzdGlvblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWRRdWVzdGlvbj11c2VyUmVzcG9uc2VzW1wicXVlc3Rpb25faWRfcmVzcG9uc2VfXCIraWRDaG9pY2VdO1xuICAgICAgICAgICAgICAgICAgICBhbnN3ZXIubmJRdWVzdGlvbnMrKztcbiAgICAgICAgICAgICAgICAgICAgaWYoZ29vZFJlc3BvbnNlKSAvLyByw6lzdWx0YXQgcG91ciBsYSBxdWVzdGlvbiBwcsOpY8OpZGVudGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuc3dlci5uYkNvcnJlY3RBbnN3ZXJzKys7XG4gICAgICAgICAgICAgICAgICAgIGdvb2RSZXNwb25zZT10cnVlOy8vIHLDqXBvbnNlIGJvbm5lIGp1c3F1J8OgIGxhIHByZW1pw6hyZSBlcnJldXIuLi5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYodXNlclJlc3BvbnNlc1tpdGVtXT09XCJ0cnVlXCIpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJlc3BvbnNlX1wiK2lkQ2hvaWNlKS5wYXJlbnROb2RlLmNsYXNzTGlzdC5hZGQoXCJzdWNjZXNzXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZih1c2VyUmVzcG9uc2VzW1wicmVzcG9uc2VfXCIraWRDaG9pY2VdPT09dW5kZWZpbmVkKS8vIGJvbm5lIHLDqXBvbnNlIG5vbiBzw6lsZWN0aW9ubsOpZVxuICAgICAgICAgICAgICAgICAgICAgICAgZ29vZFJlc3BvbnNlPWZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZih1c2VyUmVzcG9uc2VzW1wicmVzcG9uc2VfXCIraWRDaG9pY2VdPT09XCJvblwiKS8vIHLDqXBvbnNlIGNvY2jDqWUgbifDqXRhbnQgcGFzIHVuZSBkZXMgYm9ubmVzXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdvb2RSZXNwb25zZT1mYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicmVzcG9uc2VfXCIraWRDaG9pY2UpLnBhcmVudE5vZGUuY2xhc3NMaXN0LmFkZChcImVycm9yXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHNpIGonYWkgYmllbiByw6lwb25kdSDDoCBsYSBkZXJuacOocmUgcXVlc3Rpb24sIGlsIGZhdXQgbGUgdHJhaXRlciBpY2ksIGNhciBqZSBzdWlzIHNvcnRpIGRlIGxhIGJvdWNsZSA6XG4gICAgICAgIGlmKGdvb2RSZXNwb25zZSlcbiAgICAgICAgICAgIGFuc3dlci5uYkNvcnJlY3RBbnN3ZXJzKys7XG5cbiAgICAgICAgLy8gQWZmaWNoYWdlIGR1IHLDqXN1bHRhdCwgc3VpdmFudCBzaSBsJ3V0aWxpc2F0ZXVyIGVzdCBjb25uZWN0w6kgb3UgcGFzIGV0IHNvbiBzY29yZSA6XG4gICAgICAgIGxldCBnZXRPdXB1dD1jaGVja0Fuc3dlck91cHV0KGFuc3dlcik7XG4gICAgICAgIGlmKGlzQ29ubmVjdGVkKVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyBTaSBsJ3V0aWxpc2F0ZXVyIGVzdCBjb25uZWN0w6kgb24gZW5yZWdpc3RyZSBzb24gcsOpc3VsdGF0IHN1ciBsZSBzZXJ2ZXVyLlxuICAgICAgICAgICAgY29uc3QgeGhyU2F2ZUFuc3dlciA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgeGhyU2F2ZUFuc3dlci5vcGVuKFwiUE9TVFwiLCBhcGlVcmwrcXVlc3Rpb25uYWlyZVJvdXRlcytzYXZlQW5zd2Vyc1JvdXRlKTtcbiAgICAgICAgICAgIHhoclNhdmVBbnN3ZXIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB4aHJSZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDEgJiYgKHhoclJlc3BvbnNlLm1lc3NhZ2UpKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXB1dCs9XCI8YnI+XCIreGhyUmVzcG9uc2UubWVzc2FnZS5yZXBsYWNlKFwiI1VSTFwiLCBjb25maWdUZW1wbGF0ZS51c2VySG9tZVBhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tQcmV2aW91c1Jlc3BvbnNlcyh1c2VyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXB1dCs9XCI8YnI+XCIrdHh0QW5zd2Vycy5yZXNwb25zZVNhdmVkRXJyb3IucmVwbGFjZShcIiNVUkxcIiwgY29uZmlnVGVtcGxhdGUudXNlckhvbWVQYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIGdldE91cHV0LCBcIlwiLCBbXCJpbmZvcm1hdGlvblwiXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeGhyU2F2ZUFuc3dlci5zZXRSZXF1ZXN0SGVhZGVyKFwiQXV0aG9yaXphdGlvblwiLCBcIkJlYXJlciBcIit1c2VyLnRva2VuKTtcbiAgICAgICAgICAgIHhoclNhdmVBbnN3ZXIuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG4gICAgICAgICAgICBhbnN3ZXIudGltZURpZmZlcmVuY2U9Z2V0VGltZURpZmZlcmVuY2UoKTsvLyBvbiBlbiBwcm9maXRlIHBvdXIgbWV0dHJlIGxlcyBwZW5kdWxlcyDDoCBsJ2hldXJlXG4gICAgICAgICAgICB4aHJTYXZlQW5zd2VyLnNlbmQoSlNPTi5zdHJpbmdpZnkoYW5zd2VyKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7ICAgLy8gc2kgcGFzIGNvbm5lY3TDqSwgb24gZW5yZWdpc3RyZSBsZSByw6lzdWx0YXQgY8O0dMOpIGNsaWVudCBwb3VyIHBlcm1ldHRyZSBkZSBsZSByZXRyb3V2ZXIgYXUgbW9tZW50IGRlIGxhIGNyw6lhdGlvbiBkdSBjb21wdGUgb3UgZGUgbGEgY29ubmV4aW9uXG4gICAgICAgICAgICBpZihzYXZlQW5zd2VyKGFuc3dlcikpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgIGdldE91cHV0Kz1cIjxicj5cIit0eHRBbnN3ZXJzLndhbnRUb1NhdmVSZXNwb25zZXM7XG4gICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCBnZXRPdXB1dCwgXCJcIiwgW1wiaW5mb3JtYXRpb25cIl0pO1xuICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLnN1YmNyaWJlQnRuc1wiKS5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgLy8gcGFzIGxhIHBlaW5lIGRlIHByb3Bvc2VyIGRlIGNyw6llciB1biBjb21wdGUgc2kgbGUgc3RvY2thZ2UgbG9jYWwgbmUgZm9uY3Rpb25uZSBwYXNcbiAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgZ2V0T3VwdXQsIFwiXCIsIFtcImluZm9ybWF0aW9uXCJdKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBhZmZpY2hhZ2UgZGVzIHRleHRlcyBkJ2V4cGxpY2F0aW9ucyBwb3VyIGNoYXF1ZSBxdWVzdGlvblxuICAgICAgICBjb25zdCBleHBsYW5hdGlvbnM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIi5oZWxwXCIpO1xuICAgICAgICBmb3IobGV0IGkgaW4gZXhwbGFuYXRpb25zKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZihleHBsYW5hdGlvbnNbaV0uc3R5bGUhPXVuZGVmaW5lZCkgLy8gc2lub24sIGxhIGNvbnNvbGUgYWZmaWNoZSB1bmUgZXJyZXVyIFwiVHlwZUVycm9yOiBleHBsYW5hdGlvbnNbaV0uc3R5bGUgaXMgdW5kZWZpbmVkXCIsIGJpZW4gcXVlIHRvdXQgZm9uY3Rpb25uZSAoPylcbiAgICAgICAgICAgICAgICBleHBsYW5hdGlvbnNbaV0uc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2goZSlcbiAgICB7XG4gICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHQuc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICB9XG59KVxuXG4vLyBGb25jdGlvbiB2w6lyaWZpYW50IGxlcyBwcsOpY8OpZGVudGVzIHLDqXBvbnNlcyBkZSBsJ3V0aWxpc2F0ZXVyXG4vLyBVdGlsZSBzaSBjb25uZWN0w6kgbG9ycyBkdSBwcmVtaWVyIGNoYXJnZW1lbnQgZGUgbGEgcGFnZSwgcHVpcyBhcHLDqHMgdW5lIG5vdXZlbGxlIHLDqXBvbnNlXG5jb25zdCBjaGVja1ByZXZpb3VzUmVzcG9uc2VzID0gKHVzZXIpID0+XG57XG4gICAgY29uc3QgeGhyUHJldmlvdXNSZXMgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICB4aHJQcmV2aW91c1Jlcy5vcGVuKFwiR0VUXCIsIGFwaVVybCtxdWVzdGlvbm5haXJlUm91dGVzK2dldFByZXZpb3VzQW5zd2Vycyt1c2VyLmlkK1wiL1wiK2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicXVlc3Rpb25uYWlyZUlkXCIpLnZhbHVlKTtcbiAgICB4aHJQcmV2aW91c1Jlcy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpXG4gICAge1xuICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gMjAwKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5iUmVzcG9uc2VzPXJlc3BvbnNlLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBsZXQgcHJldmlvdXNBbnN3ZXJzQ29udGVudD1cIlwiO1xuICAgICAgICAgICAgICAgIGlmKG5iUmVzcG9uc2VzIT09MClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZXhwbGFuYXRpb25zVGl0bGUsIFwic3BhblwiLCB0eHRBbnN3ZXJzLnByZXZpb3VzQW5zd2Vyc1RpdGxlLnJlcGxhY2UoXCIjTk9NXCIsIHVzZXIubmFtZSkpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdG90TmJRdWVzdGlvbnM9MCwgdG90TmJDb3JyZWN0QW5zd2Vycz0wLCB0b3REdXJhdGlvbj0wLCBtYXBMaW5lQ29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpIGluIHJlc3BvbnNlKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3ROYlF1ZXN0aW9ucys9cmVzcG9uc2VbaV0ubmJRdWVzdGlvbnM7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3ROYkNvcnJlY3RBbnN3ZXJzKz1yZXNwb25zZVtpXS5uYkNvcnJlY3RBbnN3ZXJzO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90RHVyYXRpb24rPXJlc3BvbnNlW2ldLmR1cmF0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFwTGluZUNvbnRlbnQgPVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEVBTlNXRVIgOiBkYXRlRm9ybWF0KHJlc3BvbnNlW2ldLmNyZWF0ZWRBdCksLy8gcmV2b2lyIHByb2Jsw6htZSBkZSBsYSBsYW5ndWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQkNPUlJFQ1RBTlNXRVJTIDogcmVzcG9uc2VbaV0ubmJDb3JyZWN0QW5zd2VycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkdEVVJBVElPTiA6IHJlc3BvbnNlW2ldLmR1cmF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNBbnN3ZXJzQ29udGVudCs9XCI8bGk+XCIrcmVwbGFjZUFsbCh0eHRBbnN3ZXJzLnByZXZpb3VzQW5zd2Vyc0xpbmUsIG1hcExpbmVDb250ZW50KStcIjwvbGk+XCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWFwTGluZUNvbnRlbnQgPVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBBVkdEVVJBVElPTiA6IE1hdGgucm91bmQodG90RHVyYXRpb24vbmJSZXNwb25zZXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgQVZHQ09SUkVDVEFOU1dFUlMgOiBNYXRoLnJvdW5kKHRvdE5iQ29ycmVjdEFuc3dlcnMvdG90TmJRdWVzdGlvbnMqMTAwKVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0Fuc3dlcnNDb250ZW50PVwiPGg1PlwiK3JlcGxhY2VBbGwodHh0QW5zd2Vycy5wcmV2aW91c0Fuc3dlcnNTdGF0cywgbWFwTGluZUNvbnRlbnQpK1wiPC9oNT5cIitwcmV2aW91c0Fuc3dlcnNDb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGV4cGxhbmF0aW9uc0NvbnRlbnQsIFwidWxcIiwgcHJldmlvdXNBbnN3ZXJzQ29udGVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChleHBsYW5hdGlvbnNDb250ZW50LCBcInVsXCIsIHR4dEFuc3dlcnMubm9QcmV2aW91c0Fuc3dlci5yZXBsYWNlKFwiI05PTVwiLCB1c2VyLm5hbWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vZWxzZVxuICAgICAgICAgICAgICAvLyAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pOyAvLyBwYXMgZm9yY8OpbWVudCB1dGlsZSBkZSBwcsOpdmVuaXIgZHUgYnVnIGljaSA/XG4gICAgICAgIH1cbiAgICB9XG4gICAgeGhyUHJldmlvdXNSZXMuc2V0UmVxdWVzdEhlYWRlcihcIkF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIrdXNlci50b2tlbik7XG4gICAgeGhyUHJldmlvdXNSZXMuc2VuZCgpO1xufSIsImNvbnN0IGNvbmZpZ0Zyb250RW5kID0gcmVxdWlyZShcIi4uL2NvbmZpZy9nZW5lcmFsXCIpO1xuXG5pbXBvcnQgeyBzYXZlTG9jYWx5IH0gZnJvbSBcIi4vY2xpZW50c3RvcmFnZS5qc1wiO1xuaW1wb3J0IHsgaXNFbXB0eSwgcmVwbGFjZUFsbCB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbmNvbnN0IHR4dCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9sYW5nL1wiK2NvbmZpZ0Zyb250RW5kLmxhbmcrXCIvYW5zd2VyXCIpO1xuXG4vLyBFbnJlZ2lzdHJlbWVudCBjw7R0w6kgY2xpZW50IGR1IGRlcm5pZXIgcsOpc3VsdGF0IMOgIHVuIHF1aXogZW4gYXR0ZW5kYW50IGQnw6p0cmUgY29ubmVjdMOpXG5leHBvcnQgY29uc3Qgc2F2ZUFuc3dlciA9IChhbnN3ZXIpID0+XG57XG4gICAgaWYoIWlzRW1wdHkoYW5zd2VyLmR1cmF0aW9uKSAmJiAhaXNFbXB0eShhbnN3ZXIubmJDb3JyZWN0QW5zd2VycykgJiYgIWlzRW1wdHkoYW5zd2VyLm5iUXVlc3Rpb25zKSAmJiAhaXNFbXB0eShhbnN3ZXIuUXVlc3Rpb25uYWlyZUlkKSlcbiAgICB7XG4gICAgICAgIHNhdmVMb2NhbHkoXCJsYXN0QW5zd2VyXCIsIGFuc3dlcik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBlbHNlXG4gICAgICAgIHJldHVybiBmYWxzZTtcbn1cblxuLy8gUmV0b3VybmUgbGUgdGV4dGUgc3VpdmFudCBsZSBub21icmUgZGUgYm9ubmVzIHLDqXBvbnNlc1xuZXhwb3J0IGNvbnN0IGNoZWNrQW5zd2VyT3VwdXQgPSAoYW5zd2VyKSA9Plxue1xuICAgIGlmKCFpc0VtcHR5KGFuc3dlci5kdXJhdGlvbikgJiYgIWlzRW1wdHkoYW5zd2VyLm5iQ29ycmVjdEFuc3dlcnMpICYmICFpc0VtcHR5KGFuc3dlci5uYlF1ZXN0aW9ucykpXG4gICAge1xuICAgICAgICBjb25zdCByYXRpbz1hbnN3ZXIubmJDb3JyZWN0QW5zd2Vycy9hbnN3ZXIubmJRdWVzdGlvbnM7XG4gICAgICAgIGNvbnN0IG1hcE9iaj1cbiAgICAgICAge1xuICAgICAgICAgICAgRFVSQVRJT046IGFuc3dlci5kdXJhdGlvbixcbiAgICAgICAgICAgIE5CQ09SUkVDVEFOU1dFUlM6IGFuc3dlci5uYkNvcnJlY3RBbnN3ZXJzLFxuICAgICAgICAgICAgTkJRVUVTVElPTlM6IGFuc3dlci5uYlF1ZXN0aW9uc1xuICAgICAgICB9XG4gICAgICAgIGxldCBvdXRwdXQ9XCJcIjtcbiAgICAgICAgaWYocmF0aW8gPCAwLjQpXG4gICAgICAgICAgICBvdXRwdXQ9cmVwbGFjZUFsbCh0eHQuY2hlY2tSZXNwb25zZXNPdXB1dEZhaWwsIG1hcE9iaik7XG4gICAgICAgIGVsc2UgaWYocmF0aW8gPCAwLjgpXG4gICAgICAgICAgICBvdXRwdXQ9cmVwbGFjZUFsbCh0eHQuY2hlY2tSZXNwb25zZXNPdXB1dE1lZGl1bSwgbWFwT2JqKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgb3V0cHV0PXJlcGxhY2VBbGwodHh0LmNoZWNrUmVzcG9uc2VzT3VwdXRTdWNjZXNzLCBtYXBPYmopO1xuICAgICAgICBpZihvdXRwdXQpXG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gXCJcIjtcbn1cblxuLypcbmV4cG9ydCBjb25zdCBjaGVja1Nlc3Npb24gPSBhc3luYyAoY29uZmlnKSA9Plxue1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuICAgIHtcbiAgICAgICAgaWYoaXNFbXB0eShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInVzZXJcIikpKVxuICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgdXNlcj1KU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwidXNlclwiKSk7XG4gICAgICAgICAgICBpZih1c2VyLmR1cmF0aW9uPT09dW5kZWZpbmVkIHx8IHVzZXIuZHVyYXRpb24gPCBEYXRlLm5vdygpKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBjb25maWdGcm9udEVuZC5hcGlVcmwrY29uZmlnLnVzZXJSb3V0ZXMrY29uZmlnLmNoZWNrTG9naW5Sb3V0ZSt1c2VyLnRva2VuKTtcbiAgICAgICAgICAgICAgICB4aHIub25sb2FkID0gKCkgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwICYmIHJlc3BvbnNlLmlzVmFsaWQgJiYgcmVzcG9uc2UuaWQgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5pZD09PXVzZXIuaWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB4aHIub25lcnJvciA9ICgpID0+IHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICAgICAgICAgICAgeGhyLnNlbmQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufSovIiwiLy8gRk9OQ1RJT05TIFVUSUxFUyBBVSBTVE9DS0FHRSBMT0NBTCAoU0VTU0lPTiwgQ09PS0lFUywgSU5ERVhEQiwgRVRDLilcbi8vIFJldmVuaXIgcG91ciBnw6lyZXIgbGUgY2FzIG/DuSBsb2NhbC5zdG9yYWdlIG4nZXN0IHBhcyBjb25udSBwb3VyIHV0aWxpc2VyIGNvb2tpZVxuICAgIFxuZXhwb3J0IGNvbnN0IHNhdmVMb2NhbHkgPSAobmFtZSwgZGF0YSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShuYW1lLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2NhbHkgPSAobmFtZSwganNvbj1mYWxzZSkgPT5cbntcbiAgICBpZihqc29uKVxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKSk7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSk7XG59XG5cbmV4cG9ydCBjb25zdCByZW1vdmVMb2NhbHkgPSAobmFtZSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShuYW1lKTtcbn0iLCJpbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gRm9uY3Rpb24gYXNzb2NpYW50IGxlcyBhdHRyaWJ1dHMgZm91cm5pcyDDoCB1biBjaGFtcCBkZSBmb3JtdWxhaXJlXG5leHBvcnQgY29uc3QgYWRkRWxlbWVudCA9IChlbHRQYXJlbnQsIGVsdFR5cGUsIGVsdENvbnRlbnQ9XCJcIiwgZWx0SWQ9XCJcIiwgZWx0Q2xhc3M9W10sIGVsdEF0dHJpYnV0ZXM9e30sIHJlcGxhY2U9dHJ1ZSkgPT5cbntcbiAgICBpZihpc0VtcHR5KGVsdFR5cGUpIHx8IGlzRW1wdHkoZWx0UGFyZW50KSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGVsc2VcbiAgICB7XG4gICAgICAgIGNvbnN0IG5ld0VsZW1lbnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlbHRUeXBlKTtcbiAgICAgICAgXG4gICAgICAgIGlmKCFpc0VtcHR5KGVsdElkKSkvLyB0ZXN0ZXIgc2kgbCdpZCBuJ2VzdCBwYXMgZMOpasOgIHV0aWxpc8OpIGRhbnMgbGUgRE9NID9cbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaWQ9ZWx0SWQ7XG5cbiAgICAgICAgaWYoQXJyYXkuaXNBcnJheShlbHRDbGFzcykgJiYgZWx0Q2xhc3MubGVuZ3RoIT0wKVxuICAgICAgICB7XG4gICAgICAgICAgICBmb3IobGV0IGkgaW4gZWx0Q2xhc3MpXG4gICAgICAgICAgICAgICAgbmV3RWxlbWVudC5jbGFzc0xpc3QuYWRkKGVsdENsYXNzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHR5cGVvZiBlbHRBdHRyaWJ1dGVzID09PSBcIm9iamVjdFwiKSAvLyAhISB0b3VzIGxlcyBvYmpldHMgbmUgc29udCBwYXMgb2tcbiAgICAgICAge1xuICAgICAgICAgICAgZm9yKGxldCBhdHRyaWJ1dE5hbWUgaW4gZWx0QXR0cmlidXRlcylcbiAgICAgICAgICAgICAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dE5hbWUsIGVsdEF0dHJpYnV0ZXNbYXR0cmlidXROYW1lXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZighaXNFbXB0eShlbHRDb250ZW50KSlcbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaW5uZXJIVE1MPWVsdENvbnRlbnQucmVwbGFjZSgvXFxuL2csXCI8YnI+XCIpOy8vIGlubmVySFRNTCBwZXJtZXQgZCdham91dGVyIGR1IHRleHRlIGF5YW50IGx1aS1tw6ptZSBkZXMgYmFsaXNlcywgZXRjLlxuICAgICAgICAgICAgXG4gICAgICAgIGlmKHJlcGxhY2UpXG4gICAgICAgICAgICBlbHRQYXJlbnQuaW5uZXJIVE1MPVwiXCI7XG4gICAgICAgIGVsdFBhcmVudC5hcHBlbmRDaGlsZChuZXdFbGVtZW50KTtcbiAgICB9ICAgIFxufSIsIi8vIENlIHNjcmlwdCBmb3Vybml0IGRlcyBmb25jdGlvbnMgdXRpbGlzw6llcyBzdXIgdG91dGVzIGxlcyBwYWdlcyBkdSBzaXRlXG5cbmV4cG9ydCBjb25zdCBoZWxsb0RldiA9ICgpID0+XG57XG4gICAgY29uc29sZS5sb2coXCIqKioqIEhlbGxvIGFtaSBkw6l2ZWxvcHBldXIgOi0pXFxuIExlIGNvZGUgZGUgV2lraUxlcm5pIGVzdCBsaWJyZSBldCBlc3QgbGlzaWJsZSBzdXIgZ2l0bGFiIDogXFxuIEJvbm5lIGxlY3R1cmUgOi0pIFxcbiBQb3VyIGxlcyBzdWdnZXN0aW9ucyBkJ2Ftw6lsaW9yYXRpb24gb3UgcXVlc3Rpb25zIDogZGV2QHdpbGlsZXJuaS5jb20gKioqKlwiKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUFjY291bnRMaW5rID0gKHN0YXR1cywgY29uZmlnVGVtcGxhdGUpID0+XG57XG4gICAgY29uc3QgbGluaz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFjY291bnRIZWFkTGlua1wiKTtcbiAgICBjb25zdCBob21lUGFnZT1zdGF0dXMrXCJIb21lUGFnZVwiO1xuICAgIGxpbmsuaHJlZj1cIi9cIitjb25maWdUZW1wbGF0ZVtob21lUGFnZV07XG59IiwiaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIEZvbmN0aW9uIGFzc29jaWFudCBsZXMgYXR0cmlidXRzIGZvdXJuaXMgw6AgdW4gY2hhbXAgZGUgZm9ybXVsYWlyZVxuZXhwb3J0IGNvbnN0IHNldEF0dHJpYnV0ZXNUb0lucHV0cyA9IChpbnB1dHNDb25mLCBteUZvcm0pID0+XG57XG4gICAgZm9yKGxldCBpIGluIG15Rm9ybS5lbGVtZW50cylcbiAgICB7XG4gICAgICAgIGlmKCFpc0VtcHR5KG15Rm9ybS5lbGVtZW50c1tpXS5pZCkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldCBpZElucHV0PW15Rm9ybS5lbGVtZW50c1tpXS5pZDtcbiAgICAgICAgICAgIGlmKGlucHV0c0NvbmZbaWRJbnB1dF0hPT11bmRlZmluZWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGV0IGlucHV0SFRNTD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZElucHV0KTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBhdHRyaWJ1dGUgaW4gaW5wdXRzQ29uZltpZElucHV0XSlcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRIVE1MLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIGlucHV0c0NvbmZbaWRJbnB1dF1bYXR0cmlidXRlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbi8vIFLDqWN1cMOocmUgdG91dGVzIGxlcyB2YWxldXJzIGRlIGNoYW1wcyBlbiBvbWV0dGFudCBsZXMgY2hlY2tib3ggbm9uIGNvY2jDqWVzLCBldGMuXG5leHBvcnQgY29uc3QgZ2V0RGF0YXNGcm9tSW5wdXRzID0gKG15Rm9ybSkgPT5cbntcbiAgICBjb25zdCBkYXRhcz17fTtcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShteUZvcm0pO1xuICAgIGZvcihsZXQgZW50cmllIG9mIGZvcm1EYXRhLmVudHJpZXMoKSlcbiAgICAgICBkYXRhc1tlbnRyaWVbMF1dPWVudHJpZVsxXTtcbiAgICByZXR1cm4gZGF0YXM7XG59XG5cbi8vIFZpZGUgdG91cyBsZXMgY2hhbXBzIGQndW4gZm9ybXVsYWlyZSwgeSBjb21wcmlzIGhpZGRlbiwgY2hlY2tib3gsIGV0Yy5cbi8vIFJldm9pciBwb3VyIGxlcyBzZWxlY3RcbmV4cG9ydCBjb25zdCBlbXB5Rm9ybSA9IChteUZvcm0pID0+XG57XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEobXlGb3JtKTtcbiAgICBmb3IobGV0IGVudHJpZSBvZiBmb3JtRGF0YS5lbnRyaWVzKCkpXG4gICAge1xuICAgICAgICBpZihteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS50eXBlPT1cImNoZWNrYm94XCIgfHwgbXlGb3JtLmVsZW1lbnRzW2VudHJpZVswXV0udHlwZT09XCJyYWRpb1wiKVxuICAgICAgICAgICAgbXlGb3JtLmVsZW1lbnRzW2VudHJpZVswXV0uY2hlY2tlZD1mYWxzZTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbXlGb3JtLmVsZW1lbnRzW2VudHJpZVswXV0udmFsdWU9XCJcIjtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG4vLyBWaWRlIGV0IGNhY2hlIGxlIGZvcm11bGFpcmVcbmV4cG9ydCBjb25zdCBlbXB5QW5kSGlkZUZvcm0gPSAobXlGb3JtKSA9Plxue1xuICAgIGVtcHlGb3JtKG15Rm9ybSk7XG4gICAgbXlGb3JtLnN0eWxlLmRpc3BsYXk9XCJub25lXCI7XG59IiwiaW1wb3J0IHsgYXBpVXJsLCBhdmFpbGFibGVMYW5ncywgc2l0ZVVybCwgdGhlbWUgfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCI7XG5jb25zdCBsYW5nPWF2YWlsYWJsZUxhbmdzWzBdO1xuXG5jb25zdCBjb25maWdUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi8uLi8uLi92aWV3cy9cIit0aGVtZStcIi9jb25maWcvXCIrbGFuZytcIi5qc1wiKTtcbmltcG9ydCB7ICBjaGVja0xvZ2luUm91dGUsIHRpbWVEaWZmZXJlbmNlTWF4LCB0aW1lRGlmZmVyZW5jZU1pbiwgdXNlclJvdXRlcyB9IGZyb20gXCIuLi8uLi8uLi9jb25maWcvdXNlcnMuanNcIjtcblxuaW1wb3J0IHsgZ2V0TG9jYWx5LCByZW1vdmVMb2NhbHksIHNhdmVMb2NhbHkgfSBmcm9tIFwiLi9jbGllbnRzdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gUsOpY3Vww6hyZSBsZXMgZG9ubsOpZXMgZGUgY29uZmlndXJhdGlvbiBkZXMgdXRpbGlzYXRldXJzXG4vLyDDgCB0ZXJtZSwgdW4gZmljaGllciBzdGF0aXF1ZSBpbXBvcnRhYmxlIGNvbW1lIG1vZHVsZSBkZXZyYWl0IMOpdml0ZXIgdW5lIHJlcXXDqnRlIGFqYXhcbmV4cG9ydCBjb25zdCBnZXRDb25maWcgPSAgYXN5bmMgKCkgPT5cbntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBhcGlVcmwrXCIvdXNlci9nZXRjb25maWdcIik7XG4gICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCkpO1xuICAgICAgICB4aHIub25lcnJvciA9ICgpID0+IHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICAgIHhoci5zZW5kKCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRUaW1lRGlmZmVyZW5jZSA9ICgpID0+XG57XG4gICAgY29uc3QgdGltZUxvY2FsPW5ldyBEYXRlKCkuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICBpZih0aW1lTG9jYWwgPiB0aW1lRGlmZmVyZW5jZU1heCB8fCB0aW1lTG9jYWwgPCB0aW1lRGlmZmVyZW5jZU1pbilcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgZWxzZSByZXR1cm4gdGltZUxvY2FsO1xufVxuXG4vLyBPbiBlbmzDqHZlIHZvbG9udGFpcmVtZW50IGxlcyAwL08gcG91ciDDqXZpdGVyIGxlcyBjb25mdXNpb25zICFcbi8vIEV0IG1pZXV4IHZhdXQgYXVzc2kgZMOpYnV0ZXIgZXQgZmluaXIgcGFyIHVuZSBsZXR0cmUgc2ltcGxlLlxuZXhwb3J0IGNvbnN0IGdldFBhc3N3b3JkID0gKG5iQ2FyTWluLCBuYkNhck1heCkgPT5cbntcbiAgICBjb25zdCBuYkNhcj1uYkNhck1pbitNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqKG5iQ2FyTWF4LW5iQ2FyTWluKSk7XG4gICAgY29uc3QgbGV0dGVycz1cIkFCQ0RFRkdISUpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbnBxcnN0dXZ3eHl6XCI7XG4gICAgY29uc3Qgb3RoZXJzPVwiMTIzNDU2Nzg5IT8uKi1fJUAmw4nDgMOIw5nigqwkw4LDisObw45cIjtcbiAgICBsZXQgcGFzc3dvcmQ9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICBmb3IobGV0IGk9MTtpPChuYkNhci0xKTtpKyspXG4gICAge1xuICAgICAgICBpZigoaSAlIDIpID09PTEpXG4gICAgICAgICAgICBwYXNzd29yZCs9b3RoZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpvdGhlcnMubGVuZ3RoKV07XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHBhc3N3b3JkKz1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldOyAgIFxuICAgIH1cbiAgICBwYXNzd29yZCs9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICByZXR1cm4gcGFzc3dvcmQ7XG59XG5cbi8vIEondXRpbGlzZSBsZSBzdG9ja2FnZSBsb2NhbCBkdSBuYXZpZ2F0ZXVyIHBvdXIgZW5yZWdpc3RyZXIgbGVzIGRvbm7DqWVzIHBlcm1ldHRhbnQgZGUgcmVjb25uYcOudHJlIGwndXRpbGlzYXRldXIgcGFyIGxhIHN1aXRlXG4vLyBTZXVsIGxlIHNlcnZldXIgcG91cnJhIHbDqXJpZmllciBxdWUgbGVzIGlkZW50aWZpYW50cyBzb250ICh0b3Vqb3VycykgdmFsaWRlcy5cbmV4cG9ydCBjb25zdCBzZXRTZXNzaW9uID0gKHVzZXJJZCwgdG9rZW4sIGR1cmF0aW9uVFMpID0+XG57XG4gICAgY29uc3Qgc3RvcmFnZVVzZXI9XG4gICAge1xuICAgICAgICBpZDogdXNlcklkLFxuICAgICAgICB0b2tlbjogdG9rZW4sXG4gICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvblRTXG4gICAgfVxuICAgIHNhdmVMb2NhbHkoXCJ1c2VyXCIsIHN0b3JhZ2VVc2VyKTtcbn1cblxuLy8gVsOpcmlmaWUgcXUnaWwgeSBhIGRlcyBkb25uw6llcyBsb2NhbGVzIGNvbmNlcm5hbnQgbGUgcsOpc3VsdGF0IGQndW4gcXVpelxuLy8gRXQgbGVzIGFqb3V0ZSBhdXggZG9ubsOpZXMgZW52b3nDqWVzIHBhciBsZXMgZm9ybXVsYWlyZXMgZCdpbnNjcmlwdGlvbi9jb25uZXhpb24gc2kgYydlc3QgbGUgY2FzXG5leHBvcnQgY29uc3QgY2hlY2tBbnN3ZXJEYXRhcyA9IChkYXRhcykgPT5cbntcbiAgICBjb25zdCBsYXN0QW5zd2VyPWdldExvY2FseShcImxhc3RBbnN3ZXJcIik7XG4gICAgaWYoIWlzRW1wdHkobGFzdEFuc3dlcikpXG4gICAge1xuICAgICAgICBjb25zdCBhbnN3ZXI9SlNPTi5wYXJzZShsYXN0QW5zd2VyKTtcbiAgICAgICAgaWYoIWlzRW1wdHkoYW5zd2VyLmR1cmF0aW9uKSAmJiAhaXNFbXB0eShhbnN3ZXIubmJDb3JyZWN0QW5zd2VycykgJiYgIWlzRW1wdHkoYW5zd2VyLlF1ZXN0aW9ubmFpcmVJZCkgJiYgIWlzRW1wdHkoYW5zd2VyLm5iUXVlc3Rpb25zKSlcbiAgICAgICAge1xuICAgICAgICAgICAgZGF0YXMuZHVyYXRpb249YW5zd2VyLmR1cmF0aW9uO1xuICAgICAgICAgICAgZGF0YXMubmJDb3JyZWN0QW5zd2Vycz1hbnN3ZXIubmJDb3JyZWN0QW5zd2VycztcbiAgICAgICAgICAgIGRhdGFzLlF1ZXN0aW9ubmFpcmVJZD1hbnN3ZXIuUXVlc3Rpb25uYWlyZUlkO1xuICAgICAgICAgICAgZGF0YXMubmJRdWVzdGlvbnM9YW5zd2VyLm5iUXVlc3Rpb25zO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhcztcbn1cblxuLy8gQ2V0dGUgZm9uY3Rpb24gdGVzdGUgbGEgY29ubmV4aW9uIGRlIGwndXRpbGlzYXRldXIgZCd1bmUgcGFnZVxuLy8gT24gcGV1dCBmb3VybmlzIHVuZSBsaXN0ZSBkZSBzdGF0dXRzIGFjY2VwdMOpcyAoc2kgdmlkZSA9IHRvdXMpLCBhaW5zaSBxdSd1bmUgdXJsIGRlIHJlZGlyZWN0aW9uIHNpIG5vbiBjb25uZWN0w6ksIHVuIG1lc3NhZ2UgZCdlcnJldXIgw6AgYWZmaWNoZXIgc3VyIGxhIHBhZ2UgZGUgZGVzdGluYXRpb24gZXQgbCd1cmwgc3VyIGxhcXVlbGxlIHJldmVuaXIgdW5lIGZvaXMgY29ubmVjdMOpXG5leHBvcnQgY29uc3QgY2hlY2tTZXNzaW9uID0gYXN5bmMgKHN0YXR1cz1bXSwgdXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCkgPT5cbntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IHVzZXJEYXRhcz1nZXRMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICBpZihpc0VtcHR5KHVzZXJEYXRhcykpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgdXNlcj1KU09OLnBhcnNlKHVzZXJEYXRhcyk7XG4gICAgICAgICAgICBpZihpc0VtcHR5KHVzZXIuaWQpIHx8wqBpc0VtcHR5KHVzZXIudG9rZW4pIHx8IGlzRW1wdHkodXNlci5kdXJhdGlvbikgfHwgdXNlci5kdXJhdGlvbiA8IERhdGUubm93KCkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgYXBpVXJsK3VzZXJSb3V0ZXMrY2hlY2tMb2dpblJvdXRlK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDAgJiYgcmVzcG9uc2UuaXNWYWxpZCAmJiByZXNwb25zZS5pZCAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLmlkPT09dXNlci5pZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLm5hbWU9cmVzcG9uc2UubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLmxhbmd1YWdlPXJlc3BvbnNlLmxhbmd1YWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIudGltZURpZmZlcmVuY2U9cmVzcG9uc2UudGltZURpZmZlcmVuY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5zdGF0dXM9cmVzcG9uc2Uuc3RhdHVzOy8vIGxlIHRva2VuIGV0IGRlIHRvdXRlIGZhw6dvbiB2w6lyaWZpZXIgw6AgY2hhcXVlIHJlcXXDqnRlIMOgIGwnQVBJXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUxvY2FseShcInVzZXJcIiwgdXNlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2kgaWwgcydhZ2l0IGQndW4gXCJ1c2VyXCIgZXQgcXVlIHNvbiBhYm9ubmVtZW50IGEgZXhwaXLDqSwgamUgbGUgcmVkaXJpZ2UgdmVycyBsYSBjYWlzc2UgOi0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2Uuc3RhdHVzPT09XCJ1c2VyXCIgJiYgcmVzcG9uc2UubmJEYXlzT2sgPD0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybEFjY291bnQ9c2l0ZVVybCtcIi9cIitjb25maWdUZW1wbGF0ZVtsYW5nXS5hY2NvdW50UGFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZih1cmxBY2NvdW50KT09PS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIi9cIitjb25maWdUZW1wbGF0ZVtsYW5nXS5hY2NvdW50UGFnZSk7Ly8gcGFzc8OpZSBkaXJlY3RlbWVudCBpY2ksIGwnYW5jcmUgI3N1YnNjcmliZSBuZSBmb25jdGlvbm5lIHBhcyAhP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzdGF0dXMubGVuZ3RoIT09MCAmJiBzdGF0dXMuaW5kZXhPZihyZXNwb25zZS5zdGF0dXMpPT09LTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHhoci5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICAgICAgICAgICAgICB4aHIuc2VuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4vLyBDZXR0ZSBmb25jdGlvbiBzZXJ0IMOgIGxhIHByw6ljw6lkZW50ZSBlbiBjYXMgZGUgY29ubmV4aW9uIG5vbiB2YWxpZGVcbmNvbnN0IHJlZGlyZWN0VXNlciA9ICh1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKSA9Plxue1xuICAgIGlmKCFpc0VtcHR5KG1lc3NhZ2UpKVxuICAgICAgICBzYXZlTG9jYWx5KFwibWVzc2FnZVwiLCBtZXNzYWdlKTtcbiAgICBpZighaXNFbXB0eSh1cmxXYW50ZWQpKVxuICAgICAgICBzYXZlTG9jYWx5KFwidXJsXCIsIHVybFdhbnRlZCk7XG4gICAgaWYoIWlzRW1wdHkodXJsUmVkaXJlY3Rpb24pKVxuICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKHVybFJlZGlyZWN0aW9uKTtcbn0iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/front/public/JS/quiz.app.js b/front/public/JS/quiz.app.js new file mode 100644 index 0000000..ac026ef --- /dev/null +++ b/front/public/JS/quiz.app.js @@ -0,0 +1,1104 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "./src/quiz.js"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "../lang sync recursive ^\\.\\/.*\\/answer$": +/*!*************************************!*\ + !*** ../lang sync ^\.\/.*\/answer$ ***! + \*************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/answer": "../lang/fr/answer.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/answer$"; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/general$": +/*!**************************************!*\ + !*** ../lang sync ^\.\/.*\/general$ ***! + \**************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/general": "../lang/fr/general.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/general$"; + +/***/ }), + +/***/ "../lang/fr/answer.js": +/*!****************************!*\ + !*** ../lang/fr/answer.js ***! + \****************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + needNumberUserResponses: "Le nombre de questions auxquelles l'utilisateur a répondu doit être fourni.", + needIntegerNumberUserResponses: "Le nombre de questions auxquelles l'utilisateur a répondu doit être un nombre entier.", + needMinNumberUserResponses: "Le nombre de questions auxquelles l'utilisateur a répondu ne peut être inférieur à 1.", + needMaxNumberUserResponses: "Le nombre de questions auxquelles l'utilisateur a répondu ne peut être aussi élevé.", + needNumberCorrectResponses: "Le nombre de réponses correctes doit être fourni.", + needIntegerNumberCorrectResponses: "Le nombre de réponses correctes doit être un nombre entier.", + needMinNumberCorrectResponses: "Le nombre de réponses correctes ne peut être négatif.", + needMaxNumberCorrectResponses: "Le nombre de réponses correctes ne peut être supérieur au nombre de questions.", + needIntegerNumberSecondesResponse: "La durée de la réponse doit être un nombre entier de secondes.", + needMinNumberSecondesResponse: "La durée de la réponse ne peut être négative.", + checkResponsesOuputFail: "Vous avez répondu en DURATION secondes et avez NBCORRECTANSWERS bonne(s) réponse(s) sur NBQUESTIONS. C'est certain, vous ferez mieux la prochaine fois !", + checkResponsesOuputMedium: "Vous avez répondu en DURATION secondes et avez NBCORRECTANSWERS bonne(s) réponse(s) sur NBQUESTIONS. C'est pas mal du tout !", + checkResponsesOuputSuccess: "Vous avez répondu en DURATION secondes et avez NBCORRECTANSWERS bonne(s) réponse(s) sur NBQUESTIONS. Bravo ! Rien ne vous échappe !", + wantToSaveResponses: "Si vous le souhaitez, vous pouvez sauvegarder votre résultat en créant votre compte.\nCela vous permettra de tester de nouveau ce quiz dans l'avenir pour voir si vous avez mémoriser les bonnes réponses. Vous pourrez ainsi aussi recevoir régulièrement de nouveaux quizs.", + responseSavedMessage: "Votre résultat a été enregistré. Accèder à tous vos quizs.", + responseSavedError: "Cependant une erreur a été rencontrée durant l'enregistrement de votre résultat. Accèder à tous vos quizs.", + noQuestionnaireWithoudAnswer: "Bravo ! Vous avez répondu à tous les quizs qui vous on été proposés !
    Il y en a des nouveaux publiés régulièrement et qui vous seront proposés.
    En attendant vous pouvez peut-être essayer de répondre de nouveau à certain quiz pour voir si vous vous souvenez des bonnes réponses ?", + nbQuestionnaireWithoudAnswer: "Il y a #NB quizs qui vous ont été proposés et auxquels vous n'avez pas répondu. Voici les derniers :!", + statsUser: "Vous avez enregistré NBANSWERS réponses à NBQUESTIONNAIRES questionnaires différents sur les NBTOTQUESTIONNAIRES proposés par le site.
    En moyenne, vous avez mis AVGDURATION secondes à répondre et avez correctement répondu à AVGCORRECTANSWERS % des questions.", + previousAnswersTitle: "Vos résultats précédents", + previousAnswersStats: "En moyenne, vous avez répondu à ce quiz en AVGDURATION secondes, en ayant AVGCORRECTANSWERS % de bonnes réponses.", + previousAnswersLine: "Le DATEANSWER, vous avez répondu correctement à NBCORRECTANSWERS questions en AVGDURATION secondes." +}; + +/***/ }), + +/***/ "../lang/fr/general.js": +/*!*****************************!*\ + !*** ../lang/fr/general.js ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + siteHTMLTitle: "WikiLerni : qu'allez-vous apprendre aujourd'hui ?", + siteMetaDescription: "Chaque jour, testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.", + scriptTimingInfo: "Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", + scriptTimingAlert: "*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", + serverError: "Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.", + serverErrorAdmin: "Bug de l'application :", + neededParams: "Des paramètres nécessaires manquants sont manquants.", + badUrl: "Tentative d'accès à une page n'existant pas :", + notValidFormat: "Format non valide.", + notAllowed: "Vous n'avez pas les droits nécessaires pour cette action.", + notRequired: "Facultatif.", + updateBtnTxt: "Modifier", + addBtnTxt: "Ajouter", + deleteBtnTxt: "Supprimer", + addOkMessage: "Les données ont bien été enregistrées.", + updateOkMessage: "La mise à jour à jour a bien été enregistrée.", + deleteOkMessage: "La suppression a bien été enregistrée.", + failAuth: "Erreur d'authentification.", + failAuthHeader: "Absence de header Authorization.", + failAuthToken: "Token invalide ou utilisateur non trouvé.", + failAuthId: "Identifiant non valide : ", + failAuthCron: "Tentative de lancement d'un cron sans le bon token.", + previousPage: "Page précédente", + nextPage: "Page suivante", + btnLinkToQuestionnaire: "Aller au quiz !", + statsAdmin: "Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
    En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
    Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium." +}; + +/***/ }), + +/***/ "../tools/main.js": +/*!************************!*\ + !*** ../tools/main.js ***! + \************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +// Quelques fonctions utiles pour les chaînes +var Tool = /*#__PURE__*/function () { + function Tool() { + _classCallCheck(this, Tool); + } + + _createClass(Tool, null, [{ + key: "isEmpty", + value: function isEmpty(myVar) { + if (myVar === undefined || myVar === null) return true;else { + myVar += ""; // si autre chose qu'une chaîne envoyé... + + myVar = myVar.trim(); + if (myVar === "") return true;else return false; + } + } + }, { + key: "trimIfNotNull", + value: function trimIfNotNull(myString) { + if (Tool.isEmpty(myString)) myString = null;else { + myString += ""; // si autre chose qu'une chaîne envoyé... + + myString = myString.trim(); + } + return myString; + } + }, { + key: "shortenIfLongerThan", + value: function shortenIfLongerThan(myString, max) { + myString += ""; // au cas où cela ne serait pas une chaîne... + + if (myString.length > max) myString = myString.substring(0, max - 3) + "..."; + return myString; + } // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings + + }, { + key: "replaceAll", + value: function replaceAll(myString, mapObj) { + var replaceElts = new RegExp(Object.keys(mapObj).join("|"), "gi"); + return myString.replace(replaceElts, function (matched) { + return mapObj[matched]; + }); + } // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random + + }, { + key: "getRandomInt", + value: function getRandomInt(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min)) + min; + } // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country + + }, { + key: "dateFormat", + value: function dateFormat(dateString) { + var lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "fr"; + if (Tool.isEmpty(dateString)) return ""; + var myDate = new Date(dateString); + var myDay = myDate.getDate() + ""; + if (myDay.length === 1) myDay = "0" + myDay; + var myMounth = myDate.getMonth() + 1 + ""; + if (myMounth.length === 1) myMounth = "0" + myMounth; + var myYear = myDate.getFullYear(); + if (lang === "fr") return myDay + "/" + myMounth + "/" + myYear;else if (lang === "form") // 2014-02-09 + return myYear + "-" + myMounth + "-" + myDay;else return myMounth + "/" + myDay + "/" + myYear; + } + }]); + + return Tool; +}(); + +module.exports = Tool; + +/***/ }), + +/***/ "./src/config/general.js": +/*!*******************************!*\ + !*** ./src/config/general.js ***! + \*******************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + apiUrl: "http://localhost:3000/api", + usersGetConfigUrl: "/user/getconfig", + lang: "fr", + userHomePage: "accueil.html", + adminHomePage: "admin.html", + managerHomePage: "gestion.html", + subscribePage: "inscription.html", + connectionPage: "connexion.html", + accountPage: "compte.html", + questionnairesManagementPage: "gestion-quizs.html", + usersManagementPage: "gestion-utilisateurs.html", + nbQuestionnairesUserHomePage: 10, + illustrationDir: "/img/quizs/" +}; // à terme fusionner avec les déclarations backend concernant le front, tout étant saisi dans l'admin + +/***/ }), + +/***/ "./src/quiz.js": +/*!*********************!*\ + !*** ./src/quiz.js ***! + \*********************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _tools_answers_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./tools/answers.js */ "./src/tools/answers.js"); +/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js"); +/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js"); +/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_forms_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/forms.js */ "./src/tools/forms.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tools/users.js */ "./src/tools/users.js"); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + +// -- GESTION DU FORMULAIRE PERMETTANT D'AFFICHER ET RÉPONDRE À UN QUIZ +/// Il n'est pas nécessaire d'être connecté pour répondre au quiz et voir son résultat. +/// Mais si pas connecté, je propose à l'internaute de se connecter ou de créer un compte. +/// Dans ce but son résultat est alors stocké dans son navigateur +/// Si il est connecté, l'enregistrement de son résultat se fait automatiquement et ses précédents résultats affichés +// Fichier de configuration côté client : +var configFrontEnd = __webpack_require__(/*! ./config/general */ "./src/config/general.js"); // Importation des fonctions utiles au script : + + + + + + + + + // Dictionnaires : + +var txt = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + configFrontEnd.lang + "/general"); + +var txtAnswers = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/answer$")("./" + configFrontEnd.lang + "/answer"); // Principaux éléments du DOM manipulés : + + +var myForm = document.getElementById("questionnaire"); +var divResponse = document.getElementById("response"); +var btnShow = document.getElementById("showQuestionnaire"); +var btnSubmit = document.getElementById("checkResponses"); +var explanationsTitle = document.getElementById("explanationsTitle"); +var explanationsContent = document.getElementById("explanationsContent"); +Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_2__["helloDev"])(); // Chargement des configurations fournies par le backend + test de connexion de l'utilisateur : + +var config, isConnected, user; + +var initialise = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _context.prev = 0; + _context.next = 3; + return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_6__["getConfig"])(); + + case 3: + config = _context.sent; + + if (config) { + _context.next = 8; + break; + } + + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_1__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]); + _context.next = 13; + break; + + case 8: + btnShow.style.display = "inline"; + _context.next = 11; + return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_6__["checkSession"])(config, ["user"]); + + case 11: + isConnected = _context.sent; + + // seuls les simples utilisateurs peuvent répondre aux quizs + // Si l'utilisateur est connecté, je vérifie sur il a déjà répondu à ce quiz et si oui affiche ses précédentes réponses dans l'encart servant à expliquer le topo aux nouveaux + if (isConnected) { + user = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_3__["getLocaly"])("user", true); + checkPreviousResponses(config, user); + } + + case 13: + _context.next = 18; + break; + + case 15: + _context.prev = 15; + _context.t0 = _context["catch"](0); + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_1__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]); + + case 18: + case "end": + return _context.stop(); + } + } + }, _callee, null, [[0, 15]]); + })); + + return function initialise() { + return _ref.apply(this, arguments); + }; +}(); + +initialise(); // Affichage du questionnaire si l'utilisateur clique sur le bouton ou si l'id du formulaire est passée par l'url +// Déclenche en même temps le chronomètre mesurant la durée de la réponse aux questions. + +var showQuestionnaire = function showQuestionnaire() { + chronoBegin = Date.now(); + myForm.style.display = "block"; + btnShow.setAttribute("disabled", true); + window.location.assign("#questionnaire"); +}; + +var chronoBegin = 0; +btnShow.addEventListener("click", function (e) { + try { + e.preventDefault(); + showQuestionnaire(); + } catch (e) { + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_1__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]); + } +}); +if (location.hash != undefined && location.hash === "#questionnaire") showQuestionnaire(); // Traitement de l'envoi de sa réponse par l'utilisateur : + +var answer = {}; +myForm.addEventListener("submit", function (e) { + try { + e.preventDefault(); + btnSubmit.setAttribute("disabled", true); // seulement un envoi à la fois :) + + divResponse.innerHTML = ""; // supprime les éventuels messages déjà affichés + + var userResponses = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["getDatasFromInputs"])(myForm); + answer.duration = Math.round((Date.now() - chronoBegin) / 1000); + answer.nbCorrectAnswers = 0; + answer.QuestionnaireId = document.getElementById("questionnaireId").value; // Récupére les réponses du quiz sur le serveur : + + var xhr = new XMLHttpRequest(); + xhr.open("GET", configFrontEnd.apiUrl + config.questionnaireRoutes + config.getQuestionnaireRoutes + "/" + userResponses.questionnaireId); + var idChoice, goodResponse; + + xhr.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var response = JSON.parse(this.responseText); + + if (this.status === 200 && Array.isArray(response.Questions)) { + answer.nbQuestions = response.Questions.length; // Puis on passe en revue les réponses pour afficher celles qui sont correctes et détecter les erreurs + // Il peut y avoir plusieurs bonnes réponses pour une même question (QCM) + + for (var i in response.Questions) { + goodResponse = true; + + for (var j in response.Questions[i].Choices) { + idChoice = response.Questions[i].Choices[j].id; + + if (response.Questions[i].Choices[j].isCorrect === true) { + document.getElementById("response_" + idChoice).parentNode.classList.add("success"); + if (userResponses["response_" + idChoice] === undefined) // bonne réponse non sélectionnée + goodResponse = false; + } else { + if (userResponses["response_" + idChoice] === "on") // réponse cochée n'étant pas une des bonnes + { + goodResponse = false; + document.getElementById("response_" + idChoice).parentNode.classList.add("error"); + } + } + } + + if (goodResponse) answer.nbCorrectAnswers++; + } // Affichage du résultat, suivant si l'utilisateur est connecté ou pas et son score : + + + var getOuput = Object(_tools_answers_js__WEBPACK_IMPORTED_MODULE_0__["checkAnswerOuput"])(answer); + + if (isConnected) { + // si l'utilisateur est connecté on enregistre son résultat sur le serveur. + var xhr2 = new XMLHttpRequest(); + xhr2.open("POST", configFrontEnd.apiUrl + config.questionnaireRoutes + config.saveAnswersRoute); + + xhr2.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var response2 = JSON.parse(this.responseText); + + if (this.status === 201 && response2.message) { + getOuput += "
    " + response2.message.replace("#URL", configFrontEnd.userHomePage); + checkPreviousResponses(config, user); + } else getOuput += "
    " + txtAnswers.responseSavedError.replace("#URL", configFrontEnd.userHomePage); + + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_1__["addElement"])(divResponse, "p", getOuput, "", ["information"]); + } + }; + + xhr2.setRequestHeader("Authorization", "Bearer " + user.token); + xhr2.setRequestHeader("Content-Type", "application/json"); + answer.timeDifference = Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_6__["getTimeDifference"])(config); // on en profite pour mettre les pendules à l'heure + + xhr2.send(JSON.stringify(answer)); + } else { + // sinon je l'enregistre côté client pour permettre de le retrouver au moment de la création du compte ou de la connexion + if (Object(_tools_answers_js__WEBPACK_IMPORTED_MODULE_0__["saveAnswer"])(answer)) { + getOuput += "
    " + txtAnswers.wantToSaveResponses; + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_1__["addElement"])(divResponse, "p", getOuput, "", ["information"]); + document.querySelector(".subcribeBtns").style.display = "block"; + } else // pas la peine de proposer de créer un compte si le stockage local ne fonctionne pas + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_1__["addElement"])(divResponse, "p", getOuput, "", ["information"]); + } // affichage des textes d'explications pour chaque question + + + var explanations = document.querySelectorAll(".help"); + + for (var _i in explanations) { + explanations[_i].style.display = "block"; + } // affiche une erreur "TypeError: explanations[i].style is undefined" mais tout fonctionne ? + + } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_1__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]); + } + }; + + xhr.send(); + } catch (e) { + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_1__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]); + } +}); // Fonction vérifiant les précédentes réponses de l'utilisateur +// Utile si connecté lors du premier chargement de la page, puis après une nouvelle réponse + +var checkPreviousResponses = function checkPreviousResponses(config, user) { + var xhrPreviousRes = new XMLHttpRequest(); + xhrPreviousRes.open("GET", configFrontEnd.apiUrl + config.questionnaireRoutes + config.getPreviousAnswers + user.id + "/" + document.getElementById("questionnaireId").value); + + xhrPreviousRes.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var response = JSON.parse(this.responseText); + + if (this.status === 200) { + var nbResponses = response.length; + var previousAnswersContent = ""; + + if (nbResponses !== 0) { + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_1__["addElement"])(explanationsTitle, "span", txtAnswers.previousAnswersTitle); + var totNbQuestions = 0, + totNbCorrectAnswers = 0, + totDuration = 0, + mapLineContent; + + for (var i in response) { + totNbQuestions += response[i].nbQuestions; + totNbCorrectAnswers += response[i].nbCorrectAnswers; + totDuration += response[i].duration; + mapLineContent = { + DATEANSWER: Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["dateFormat"])(response[i].createdAt), + // revoir problème de la langue + NBCORRECTANSWERS: response[i].nbCorrectAnswers, + AVGDURATION: response[i].duration + }; + previousAnswersContent += "
  • " + Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["replaceAll"])(txtAnswers.previousAnswersLine, mapLineContent) + "
  • "; + } + + mapLineContent = { + AVGDURATION: Math.round(totDuration / nbResponses), + AVGCORRECTANSWERS: Math.round(totNbCorrectAnswers / totNbQuestions * 100) + }; + previousAnswersContent = "
    " + Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["replaceAll"])(txtAnswers.previousAnswersStats, mapLineContent) + "
    " + previousAnswersContent; + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_1__["addElement"])(explanationsContent, "ul", previousAnswersContent); + } + } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_1__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]); + } + }; + + xhrPreviousRes.setRequestHeader("Authorization", "Bearer " + user.token); + xhrPreviousRes.send(); +}; + +/***/ }), + +/***/ "./src/tools/answers.js": +/*!******************************!*\ + !*** ./src/tools/answers.js ***! + \******************************/ +/*! exports provided: saveAnswer, checkAnswerOuput */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveAnswer", function() { return saveAnswer; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkAnswerOuput", function() { return checkAnswerOuput; }); +/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_1__); +var configFrontEnd = __webpack_require__(/*! ../config/general */ "./src/config/general.js"); + + + + +var txt = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/answer$")("./" + configFrontEnd.lang + "/answer"); // Enregistrement côté client du dernier résultat à un quiz en attendant d'être connecté + + +var saveAnswer = function saveAnswer(answer) { + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.duration) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.nbCorrectAnswers) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.nbQuestions) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.QuestionnaireId)) { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["saveLocaly"])("lastAnswer", answer); + return true; + } else return false; +}; // Retourne le texte suivant le nombre de bonnes réponses + +var checkAnswerOuput = function checkAnswerOuput(answer) { + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.duration) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.nbCorrectAnswers) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.nbQuestions)) { + var ratio = answer.nbCorrectAnswers / answer.nbQuestions; + var mapObj = { + DURATION: answer.duration, + NBCORRECTANSWERS: answer.nbCorrectAnswers, + NBQUESTIONS: answer.nbQuestions + }; + var output = ""; + if (ratio < 0.4) output = Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["replaceAll"])(txt.checkResponsesOuputFail, mapObj);else if (ratio < 0.8) output = Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["replaceAll"])(txt.checkResponsesOuputMedium, mapObj);else output = Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["replaceAll"])(txt.checkResponsesOuputSuccess, mapObj); + if (output) return output;else return ""; + } else return ""; +}; +/* +export const checkSession = async (config) => +{ + return new Promise((resolve, reject) => + { + if(isEmpty(localStorage.getItem("user"))) + resolve(false); + else + { + const user=JSON.parse(localStorage.getItem("user")); + if(user.duration===undefined || user.duration < Date.now()) + { + localStorage.removeItem("user"); + resolve(false); + } + else + { + const xhr = new XMLHttpRequest(); + xhr.open("GET", configFrontEnd.apiUrl+config.userRoutes+config.checkLoginRoute+user.token); + xhr.onload = () => + { + let response=JSON.parse(xhr.responseText); + if (xhr.status === 200 && response.isValid && response.id != undefined) + { + if(response.id===user.id) + resolve(true); + else + { + localStorage.removeItem("user"); + resolve(false); + } + } + else + { + localStorage.removeItem("user"); + resolve(false); + } + } + xhr.onerror = () => reject(xhr.statusText); + xhr.send(); + } + } + }); +}*/ + +/***/ }), + +/***/ "./src/tools/clientstorage.js": +/*!************************************!*\ + !*** ./src/tools/clientstorage.js ***! + \************************************/ +/*! exports provided: saveLocaly, getLocaly, removeLocaly */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveLocaly", function() { return saveLocaly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaly", function() { return getLocaly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeLocaly", function() { return removeLocaly; }); +// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.) +// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie +var saveLocaly = function saveLocaly(name, data) { + localStorage.setItem(name, JSON.stringify(data)); +}; +var getLocaly = function getLocaly(name) { + var json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name); +}; +var removeLocaly = function removeLocaly(name) { + localStorage.removeItem(name); +}; + +/***/ }), + +/***/ "./src/tools/dom.js": +/*!**************************!*\ + !*** ./src/tools/dom.js ***! + \**************************/ +/*! exports provided: addElement */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addElement", function() { return addElement; }); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__); +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + + // Fonction associant les attributs fournis à un champ de formulaire + +var addElement = function addElement(eltParent, eltType) { + var eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; + var eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; + var eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : []; + var eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; + var replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true; + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltType) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltParent)) return false;else { + var newElement = document.createElement(eltType); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ? + newElement.id = eltId; + + if (Array.isArray(eltClass) && eltClass.length != 0) { + for (var i in eltClass) { + newElement.classList.add(eltClass[i]); + } + } + + if (_typeof(eltAttributes) === "object") // !! tous les objets ne sont pas ok + { + for (var attributName in eltAttributes) { + newElement.setAttribute(attributName, eltAttributes[attributName]); + } + } + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltContent)) newElement.innerHTML = eltContent.replace(/\n/g, "
    "); // innerHTML permet d'ajouter du texte ayant lui-même des balises, etc. + + if (replace) eltParent.innerHTML = ""; + eltParent.appendChild(newElement); + } +}; + +/***/ }), + +/***/ "./src/tools/everywhere.js": +/*!*********************************!*\ + !*** ./src/tools/everywhere.js ***! + \*********************************/ +/*! exports provided: helloDev */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "helloDev", function() { return helloDev; }); +// Ce script fournit des fonctions utilisées sur toutes les pages du site +var helloDev = function helloDev() { + console.log("**** Hello ami développeur :-)\n Le code de WikiLerni est libre et est lisible sur gitlab : \n Bonne lecture :-) \n Pour les suggestions d'amélioration ou questions : dev@wililerni.com ****"); + return true; +}; + +/***/ }), + +/***/ "./src/tools/forms.js": +/*!****************************!*\ + !*** ./src/tools/forms.js ***! + \****************************/ +/*! exports provided: setAttributesToInputs, getDatasFromInputs, empyForm, empyAndHideForm */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setAttributesToInputs", function() { return setAttributesToInputs; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDatasFromInputs", function() { return getDatasFromInputs; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empyForm", function() { return empyForm; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empyAndHideForm", function() { return empyAndHideForm; }); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__); +function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + + // Fonction associant les attributs fournis à un champ de formulaire + +var setAttributesToInputs = function setAttributesToInputs(inputsConf, myForm) { + for (var i in myForm.elements) { + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(myForm.elements[i].id)) { + var idInput = myForm.elements[i].id; + + if (inputsConf[idInput] !== undefined) { + var inputHTML = document.getElementById(idInput); + + for (var attribute in inputsConf[idInput]) { + inputHTML.setAttribute(attribute, inputsConf[idInput][attribute]); + } + } + } + } + + return true; +}; // Récupère toutes les valeurs de champs en omettant les checkbox non cochées, etc. + +var getDatasFromInputs = function getDatasFromInputs(myForm) { + var datas = {}; + var formData = new FormData(myForm); + + var _iterator = _createForOfIteratorHelper(formData.entries()), + _step; + + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var entrie = _step.value; + datas[entrie[0]] = entrie[1]; + } + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); + } + + return datas; +}; // Vide tous les champs d'un formulaire, y compris hidden, checkbox, etc. +// Revoir pour les select + +var empyForm = function empyForm(myForm) { + var formData = new FormData(myForm); + + var _iterator2 = _createForOfIteratorHelper(formData.entries()), + _step2; + + try { + for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { + var entrie = _step2.value; + if (myForm.elements[entrie[0]].type == "checkbox" || myForm.elements[entrie[0]].type == "radio") myForm.elements[entrie[0]].checked = false;else myForm.elements[entrie[0]].value = ""; + } + } catch (err) { + _iterator2.e(err); + } finally { + _iterator2.f(); + } + + return true; +}; // Vide et cache le formulaire + +var empyAndHideForm = function empyAndHideForm(myForm) { + empyForm(myForm); + myForm.style.display = "none"; +}; + +/***/ }), + +/***/ "./src/tools/users.js": +/*!****************************!*\ + !*** ./src/tools/users.js ***! + \****************************/ +/*! exports provided: getConfig, getTimeDifference, getPassword, setSession, checkAnswerDatas, checkSession */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getConfig", function() { return getConfig; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTimeDifference", function() { return getTimeDifference; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getPassword", function() { return getPassword; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setSession", function() { return setSession; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkAnswerDatas", function() { return checkAnswerDatas; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkSession", function() { return checkSession; }); +/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_1__); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + +var configFrontEnd = __webpack_require__(/*! ../config/general */ "./src/config/general.js"); + + + // Récupère les données de configuration des utilisateurs +// À terme, un fichier statique importable comme module devrait éviter une requête ajax + +var getConfig = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + return _context.abrupt("return", new Promise(function (resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", configFrontEnd.apiUrl + configFrontEnd.usersGetConfigUrl); + + xhr.onload = function () { + return resolve(JSON.parse(xhr.responseText)); + }; + + xhr.onerror = function () { + return reject(xhr.statusText); + }; + + xhr.send(); + })); + + case 1: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + + return function getConfig() { + return _ref.apply(this, arguments); + }; +}(); +var getTimeDifference = function getTimeDifference(config) { + var timeLocal = new Date().getTimezoneOffset(); + if (timeLocal > config.timeDifferenceMax || timeLocal < config.timeDifferenceMin) return 0;else return timeLocal; +}; // On enlève volontairement les 0/O pour éviter les confusions ! +// Et mieux vaut aussi débuter et finir par une lettre simple. + +var getPassword = function getPassword(nbCarMin, nbCarMax) { + var nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin)); + var letters = "ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz"; + var others = "123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ"; + var password = letters[Math.floor(Math.random() * letters.length)]; + + for (var i = 1; i < nbCar - 1; i++) { + if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)]; + } + + password += letters[Math.floor(Math.random() * letters.length)]; + return password; +}; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite +// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides. + +var setSession = function setSession(userId, token, durationTS) { + var storageUser = { + id: userId, + token: token, + duration: durationTS + }; + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["saveLocaly"])("user", storageUser); +}; // Vérifie qu'il y a des données locales concernant le résultat d'un quiz +// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas + +var checkAnswerDatas = function checkAnswerDatas(datas) { + var lastAnswer = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["getLocaly"])("lastAnswer"); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(lastAnswer)) { + var answer = JSON.parse(lastAnswer); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.duration) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.nbCorrectAnswers) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.QuestionnaireId) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.nbQuestions)) { + datas.duration = answer.duration; + datas.nbCorrectAnswers = answer.nbCorrectAnswers; + datas.QuestionnaireId = answer.QuestionnaireId; + datas.nbQuestions = answer.nbQuestions; + } + } + + return datas; +}; // Cette fonction teste la connexion de l'utilisateur d'une page +// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté + +var checkSession = /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(config) { + var status, + urlRedirection, + message, + urlWanted, + _args2 = arguments; + return regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + status = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : []; + urlRedirection = _args2.length > 2 ? _args2[2] : undefined; + message = _args2.length > 3 ? _args2[3] : undefined; + urlWanted = _args2.length > 4 ? _args2[4] : undefined; + return _context2.abrupt("return", new Promise(function (resolve, reject) { + var userDatas = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["getLocaly"])("user"); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(userDatas)) { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else { + var user = JSON.parse(userDatas); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(user.id) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(user.token) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(user.duration) || user.duration < Date.now()) { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else { + var xhr = new XMLHttpRequest(); + xhr.open("GET", configFrontEnd.apiUrl + config.userRoutes + config.checkLoginRoute + user.token); + + xhr.onload = function () { + var response = JSON.parse(xhr.responseText); + + if (xhr.status === 200 && response.isValid && response.id != undefined) { + if (response.id === user.id) { + user.name = response.name; + user.language = response.language; + user.timeDifference = response.timeDifference; + user.status = response.status; // le token et de toute façon vérifier à chaque requête à l'API + + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["saveLocaly"])("user", user); // si il s'agit d'un "user" et que son abonnement a expiré, je le redirige vers la caisse :-) + + if (response.status === "user" && response.nbDaysOk <= 0) { + var urlAccount = config.siteUrl + "/" + configFrontEnd.accountPage; + if (window.location.href.indexOf(urlAccount) === -1) window.location.assign("/" + configFrontEnd.accountPage); // passée directement ici, l'ancre #subscribe ne fonctionne pas !? + + resolve(true); + } else { + if (status.length !== 0 && status.indexOf(response.status) === -1) { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else resolve(true); + } + } else { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + } else { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + }; + + xhr.onerror = function () { + return reject(xhr.statusText); + }; + + xhr.send(); + } + } + })); + + case 5: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + + return function checkSession(_x) { + return _ref2.apply(this, arguments); + }; +}(); // Cette fonction sert à la précédente en cas de connexion non valide + +var redirectUser = function redirectUser(urlRedirection, message, urlWanted) { + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(message)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["saveLocaly"])("message", message); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(urlWanted)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["saveLocaly"])("url", urlWanted); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(urlRedirection)) window.location.assign(urlRedirection); +}; + +/***/ }) + +/******/ }); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9hbnN3ZXIkIiwid2VicGFjazovLy8uLi9sYW5nIHN5bmMgXlxcLlxcLy4qXFwvZ2VuZXJhbCQiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcvZnIvYW5zd2VyLmpzIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL2dlbmVyYWwuanMiLCJ3ZWJwYWNrOi8vLy4uL3Rvb2xzL21haW4uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbmZpZy9nZW5lcmFsLmpzIiwid2VicGFjazovLy8uL3NyYy9xdWl6LmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy9hbnN3ZXJzLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy9jbGllbnRzdG9yYWdlLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy9kb20uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2V2ZXJ5d2hlcmUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2Zvcm1zLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy91c2Vycy5qcyJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIiwibmVlZE51bWJlclVzZXJSZXNwb25zZXMiLCJuZWVkSW50ZWdlck51bWJlclVzZXJSZXNwb25zZXMiLCJuZWVkTWluTnVtYmVyVXNlclJlc3BvbnNlcyIsIm5lZWRNYXhOdW1iZXJVc2VyUmVzcG9uc2VzIiwibmVlZE51bWJlckNvcnJlY3RSZXNwb25zZXMiLCJuZWVkSW50ZWdlck51bWJlckNvcnJlY3RSZXNwb25zZXMiLCJuZWVkTWluTnVtYmVyQ29ycmVjdFJlc3BvbnNlcyIsIm5lZWRNYXhOdW1iZXJDb3JyZWN0UmVzcG9uc2VzIiwibmVlZEludGVnZXJOdW1iZXJTZWNvbmRlc1Jlc3BvbnNlIiwibmVlZE1pbk51bWJlclNlY29uZGVzUmVzcG9uc2UiLCJjaGVja1Jlc3BvbnNlc091cHV0RmFpbCIsImNoZWNrUmVzcG9uc2VzT3VwdXRNZWRpdW0iLCJjaGVja1Jlc3BvbnNlc091cHV0U3VjY2VzcyIsIndhbnRUb1NhdmVSZXNwb25zZXMiLCJyZXNwb25zZVNhdmVkTWVzc2FnZSIsInJlc3BvbnNlU2F2ZWRFcnJvciIsIm5vUXVlc3Rpb25uYWlyZVdpdGhvdWRBbnN3ZXIiLCJuYlF1ZXN0aW9ubmFpcmVXaXRob3VkQW5zd2VyIiwic3RhdHNVc2VyIiwicHJldmlvdXNBbnN3ZXJzVGl0bGUiLCJwcmV2aW91c0Fuc3dlcnNTdGF0cyIsInByZXZpb3VzQW5zd2Vyc0xpbmUiLCJzaXRlSFRNTFRpdGxlIiwic2l0ZU1ldGFEZXNjcmlwdGlvbiIsInNjcmlwdFRpbWluZ0luZm8iLCJzY3JpcHRUaW1pbmdBbGVydCIsInNlcnZlckVycm9yIiwic2VydmVyRXJyb3JBZG1pbiIsIm5lZWRlZFBhcmFtcyIsImJhZFVybCIsIm5vdFZhbGlkRm9ybWF0Iiwibm90QWxsb3dlZCIsIm5vdFJlcXVpcmVkIiwidXBkYXRlQnRuVHh0IiwiYWRkQnRuVHh0IiwiZGVsZXRlQnRuVHh0IiwiYWRkT2tNZXNzYWdlIiwidXBkYXRlT2tNZXNzYWdlIiwiZGVsZXRlT2tNZXNzYWdlIiwiZmFpbEF1dGgiLCJmYWlsQXV0aEhlYWRlciIsImZhaWxBdXRoVG9rZW4iLCJmYWlsQXV0aElkIiwiZmFpbEF1dGhDcm9uIiwicHJldmlvdXNQYWdlIiwibmV4dFBhZ2UiLCJidG5MaW5rVG9RdWVzdGlvbm5haXJlIiwic3RhdHNBZG1pbiIsIlRvb2wiLCJteVZhciIsInVuZGVmaW5lZCIsInRyaW0iLCJteVN0cmluZyIsImlzRW1wdHkiLCJtYXgiLCJsZW5ndGgiLCJzdWJzdHJpbmciLCJtYXBPYmoiLCJyZXBsYWNlRWx0cyIsIlJlZ0V4cCIsIk9iamVjdCIsImtleXMiLCJqb2luIiwicmVwbGFjZSIsIm1hdGNoZWQiLCJtaW4iLCJNYXRoIiwiY2VpbCIsImZsb29yIiwicmFuZG9tIiwiZGF0ZVN0cmluZyIsImxhbmciLCJteURhdGUiLCJEYXRlIiwibXlEYXkiLCJnZXREYXRlIiwibXlNb3VudGgiLCJnZXRNb250aCIsIm15WWVhciIsImdldEZ1bGxZZWFyIiwiYXBpVXJsIiwidXNlcnNHZXRDb25maWdVcmwiLCJ1c2VySG9tZVBhZ2UiLCJhZG1pbkhvbWVQYWdlIiwibWFuYWdlckhvbWVQYWdlIiwic3Vic2NyaWJlUGFnZSIsImNvbm5lY3Rpb25QYWdlIiwiYWNjb3VudFBhZ2UiLCJxdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlIiwidXNlcnNNYW5hZ2VtZW50UGFnZSIsIm5iUXVlc3Rpb25uYWlyZXNVc2VySG9tZVBhZ2UiLCJpbGx1c3RyYXRpb25EaXIiLCJjb25maWdGcm9udEVuZCIsInJlcXVpcmUiLCJ0eHQiLCJ0eHRBbnN3ZXJzIiwibXlGb3JtIiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImRpdlJlc3BvbnNlIiwiYnRuU2hvdyIsImJ0blN1Ym1pdCIsImV4cGxhbmF0aW9uc1RpdGxlIiwiZXhwbGFuYXRpb25zQ29udGVudCIsImhlbGxvRGV2IiwiY29uZmlnIiwiaXNDb25uZWN0ZWQiLCJ1c2VyIiwiaW5pdGlhbGlzZSIsImdldENvbmZpZyIsImFkZEVsZW1lbnQiLCJzdHlsZSIsImRpc3BsYXkiLCJjaGVja1Nlc3Npb24iLCJnZXRMb2NhbHkiLCJjaGVja1ByZXZpb3VzUmVzcG9uc2VzIiwic2hvd1F1ZXN0aW9ubmFpcmUiLCJjaHJvbm9CZWdpbiIsIm5vdyIsInNldEF0dHJpYnV0ZSIsIndpbmRvdyIsImxvY2F0aW9uIiwiYXNzaWduIiwiYWRkRXZlbnRMaXN0ZW5lciIsImUiLCJwcmV2ZW50RGVmYXVsdCIsImhhc2giLCJhbnN3ZXIiLCJpbm5lckhUTUwiLCJ1c2VyUmVzcG9uc2VzIiwiZ2V0RGF0YXNGcm9tSW5wdXRzIiwiZHVyYXRpb24iLCJyb3VuZCIsIm5iQ29ycmVjdEFuc3dlcnMiLCJRdWVzdGlvbm5haXJlSWQiLCJ2YWx1ZSIsInhociIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsInF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJnZXRRdWVzdGlvbm5haXJlUm91dGVzIiwicXVlc3Rpb25uYWlyZUlkIiwiaWRDaG9pY2UiLCJnb29kUmVzcG9uc2UiLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJyZWFkeVN0YXRlIiwiRE9ORSIsInJlc3BvbnNlIiwiSlNPTiIsInBhcnNlIiwicmVzcG9uc2VUZXh0Iiwic3RhdHVzIiwiQXJyYXkiLCJpc0FycmF5IiwiUXVlc3Rpb25zIiwibmJRdWVzdGlvbnMiLCJpIiwiaiIsIkNob2ljZXMiLCJpZCIsImlzQ29ycmVjdCIsInBhcmVudE5vZGUiLCJjbGFzc0xpc3QiLCJhZGQiLCJnZXRPdXB1dCIsImNoZWNrQW5zd2VyT3VwdXQiLCJ4aHIyIiwic2F2ZUFuc3dlcnNSb3V0ZSIsInJlc3BvbnNlMiIsIm1lc3NhZ2UiLCJzZXRSZXF1ZXN0SGVhZGVyIiwidG9rZW4iLCJ0aW1lRGlmZmVyZW5jZSIsImdldFRpbWVEaWZmZXJlbmNlIiwic2VuZCIsInN0cmluZ2lmeSIsInNhdmVBbnN3ZXIiLCJxdWVyeVNlbGVjdG9yIiwiZXhwbGFuYXRpb25zIiwicXVlcnlTZWxlY3RvckFsbCIsInhoclByZXZpb3VzUmVzIiwiZ2V0UHJldmlvdXNBbnN3ZXJzIiwibmJSZXNwb25zZXMiLCJwcmV2aW91c0Fuc3dlcnNDb250ZW50IiwidG90TmJRdWVzdGlvbnMiLCJ0b3ROYkNvcnJlY3RBbnN3ZXJzIiwidG90RHVyYXRpb24iLCJtYXBMaW5lQ29udGVudCIsIkRBVEVBTlNXRVIiLCJkYXRlRm9ybWF0IiwiY3JlYXRlZEF0IiwiTkJDT1JSRUNUQU5TV0VSUyIsIkFWR0RVUkFUSU9OIiwicmVwbGFjZUFsbCIsIkFWR0NPUlJFQ1RBTlNXRVJTIiwic2F2ZUxvY2FseSIsInJhdGlvIiwiRFVSQVRJT04iLCJOQlFVRVNUSU9OUyIsIm91dHB1dCIsIm5hbWUiLCJkYXRhIiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsImpzb24iLCJnZXRJdGVtIiwicmVtb3ZlTG9jYWx5IiwicmVtb3ZlSXRlbSIsImVsdFBhcmVudCIsImVsdFR5cGUiLCJlbHRDb250ZW50IiwiZWx0SWQiLCJlbHRDbGFzcyIsImVsdEF0dHJpYnV0ZXMiLCJuZXdFbGVtZW50IiwiY3JlYXRlRWxlbWVudCIsImF0dHJpYnV0TmFtZSIsImFwcGVuZENoaWxkIiwiY29uc29sZSIsImxvZyIsInNldEF0dHJpYnV0ZXNUb0lucHV0cyIsImlucHV0c0NvbmYiLCJlbGVtZW50cyIsImlkSW5wdXQiLCJpbnB1dEhUTUwiLCJhdHRyaWJ1dGUiLCJkYXRhcyIsImZvcm1EYXRhIiwiRm9ybURhdGEiLCJlbnRyaWVzIiwiZW50cmllIiwiZW1weUZvcm0iLCJ0eXBlIiwiY2hlY2tlZCIsImVtcHlBbmRIaWRlRm9ybSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0Iiwib25sb2FkIiwib25lcnJvciIsInN0YXR1c1RleHQiLCJ0aW1lTG9jYWwiLCJnZXRUaW1lem9uZU9mZnNldCIsInRpbWVEaWZmZXJlbmNlTWF4IiwidGltZURpZmZlcmVuY2VNaW4iLCJnZXRQYXNzd29yZCIsIm5iQ2FyTWluIiwibmJDYXJNYXgiLCJuYkNhciIsImxldHRlcnMiLCJvdGhlcnMiLCJwYXNzd29yZCIsInNldFNlc3Npb24iLCJ1c2VySWQiLCJkdXJhdGlvblRTIiwic3RvcmFnZVVzZXIiLCJjaGVja0Fuc3dlckRhdGFzIiwibGFzdEFuc3dlciIsInVybFJlZGlyZWN0aW9uIiwidXJsV2FudGVkIiwidXNlckRhdGFzIiwicmVkaXJlY3RVc2VyIiwidXNlclJvdXRlcyIsImNoZWNrTG9naW5Sb3V0ZSIsImlzVmFsaWQiLCJsYW5ndWFnZSIsIm5iRGF5c09rIiwidXJsQWNjb3VudCIsInNpdGVVcmwiLCJocmVmIiwiaW5kZXhPZiJdLCJtYXBwaW5ncyI6IjtRQUFBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBOzs7UUFHQTtRQUNBOztRQUVBO1FB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QUo7QUFDSDtBQUNKO0FBQ0osYUF0RU0sQ0FGaUI7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsR0FBSDs7QUFBQSxrQkFBWjdELFlBQVk7QUFBQTtBQUFBO0FBQUEsR0FBbEIsQyxDQTBFUDs7QUFDQSxJQUFNb0osWUFBWSxHQUFHLFNBQWZBLFlBQWUsQ0FBQ0gsY0FBRCxFQUFpQnpGLE9BQWpCLEVBQTBCMEYsU0FBMUIsRUFDckI7QUFDSSxNQUFHLENBQUM5TSwyREFBTyxDQUFDb0gsT0FBRCxDQUFYLEVBQ0kwQixvRUFBVSxDQUFDLFNBQUQsRUFBWTFCLE9BQVosQ0FBVjtBQUNKLE1BQUcsQ0FBQ3BILDJEQUFPLENBQUM4TSxTQUFELENBQVgsRUFDSWhFLG9FQUFVLENBQUMsS0FBRCxFQUFRZ0UsU0FBUixDQUFWO0FBQ0osTUFBRyxDQUFDOU0sMkRBQU8sQ0FBQzZNLGNBQUQsQ0FBWCxFQUNJMUksTUFBTSxDQUFDQyxRQUFQLENBQWdCQyxNQUFoQixDQUF1QndJLGNBQXZCO0FBQ1AsQ0FSRCxDIiwiZmlsZSI6Ii4vSlMvcXVpei5hcHAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gXCIuL3NyYy9xdWl6LmpzXCIpO1xuIiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL2Fuc3dlclwiOiBcIi4uL2xhbmcvZnIvYW5zd2VyLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvYW5zd2VyJFwiOyIsInZhciBtYXAgPSB7XG5cdFwiLi9mci9nZW5lcmFsXCI6IFwiLi4vbGFuZy9mci9nZW5lcmFsLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvZ2VuZXJhbCRcIjsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgbmVlZE51bWJlclVzZXJSZXNwb25zZXMgOiBcIkxlIG5vbWJyZSBkZSBxdWVzdGlvbnMgYXV4cXVlbGxlcyBsJ3V0aWxpc2F0ZXVyIGEgcsOpcG9uZHUgZG9pdCDDqnRyZSBmb3VybmkuXCIsXG4gICAgbmVlZEludGVnZXJOdW1iZXJVc2VyUmVzcG9uc2VzIDogXCJMZSBub21icmUgZGUgcXVlc3Rpb25zIGF1eHF1ZWxsZXMgbCd1dGlsaXNhdGV1ciBhIHLDqXBvbmR1IGRvaXQgw6p0cmUgdW4gbm9tYnJlIGVudGllci5cIixcbiAgICBuZWVkTWluTnVtYmVyVXNlclJlc3BvbnNlcyA6IFwiTGUgbm9tYnJlIGRlIHF1ZXN0aW9ucyBhdXhxdWVsbGVzIGwndXRpbGlzYXRldXIgYSByw6lwb25kdSBuZSBwZXV0IMOqdHJlIGluZsOpcmlldXIgw6AgMS5cIixcbiAgICBuZWVkTWF4TnVtYmVyVXNlclJlc3BvbnNlcyA6IFwiTGUgbm9tYnJlIGRlIHF1ZXN0aW9ucyBhdXhxdWVsbGVzIGwndXRpbGlzYXRldXIgYSByw6lwb25kdSBuZSBwZXV0IMOqdHJlIGF1c3NpIMOpbGV2w6kuXCIsXG4gICAgbmVlZE51bWJlckNvcnJlY3RSZXNwb25zZXMgOiBcIkxlIG5vbWJyZSBkZSByw6lwb25zZXMgY29ycmVjdGVzIGRvaXQgw6p0cmUgZm91cm5pLlwiLFxuICAgIG5lZWRJbnRlZ2VyTnVtYmVyQ29ycmVjdFJlc3BvbnNlcyA6IFwiTGUgbm9tYnJlIGRlIHLDqXBvbnNlcyBjb3JyZWN0ZXMgZG9pdCDDqnRyZSB1biBub21icmUgZW50aWVyLlwiLFxuICAgIG5lZWRNaW5OdW1iZXJDb3JyZWN0UmVzcG9uc2VzIDogXCJMZSBub21icmUgZGUgcsOpcG9uc2VzIGNvcnJlY3RlcyBuZSBwZXV0IMOqdHJlIG7DqWdhdGlmLlwiLFxuICAgIG5lZWRNYXhOdW1iZXJDb3JyZWN0UmVzcG9uc2VzIDogXCJMZSBub21icmUgZGUgcsOpcG9uc2VzIGNvcnJlY3RlcyBuZSBwZXV0IMOqdHJlIHN1cMOpcmlldXIgYXUgbm9tYnJlIGRlIHF1ZXN0aW9ucy5cIixcbiAgICBuZWVkSW50ZWdlck51bWJlclNlY29uZGVzUmVzcG9uc2UgOiBcIkxhIGR1csOpZSBkZSBsYSByw6lwb25zZSBkb2l0IMOqdHJlIHVuIG5vbWJyZSBlbnRpZXIgZGUgc2Vjb25kZXMuXCIsXG4gICAgbmVlZE1pbk51bWJlclNlY29uZGVzUmVzcG9uc2UgOiBcIkxhIGR1csOpZSBkZSBsYSByw6lwb25zZSBuZSBwZXV0IMOqdHJlIG7DqWdhdGl2ZS5cIixcbiAgICBjaGVja1Jlc3BvbnNlc091cHV0RmFpbCA6IFwiVm91cyBhdmV6IHLDqXBvbmR1IGVuIERVUkFUSU9OIHNlY29uZGVzIGV0IGF2ZXogTkJDT1JSRUNUQU5TV0VSUyBib25uZShzKSByw6lwb25zZShzKSBzdXIgTkJRVUVTVElPTlMuIEMnZXN0IGNlcnRhaW4sIHZvdXMgZmVyZXogbWlldXggbGEgcHJvY2hhaW5lIGZvaXMgIVwiLFxuICAgIGNoZWNrUmVzcG9uc2VzT3VwdXRNZWRpdW0gOiBcIlZvdXMgYXZleiByw6lwb25kdSBlbiBEVVJBVElPTiBzZWNvbmRlcyBldCBhdmV6IE5CQ09SUkVDVEFOU1dFUlMgYm9ubmUocykgcsOpcG9uc2Uocykgc3VyIE5CUVVFU1RJT05TLiBDJ2VzdCBwYXMgbWFsIGR1IHRvdXQgIVwiLFxuICAgIGNoZWNrUmVzcG9uc2VzT3VwdXRTdWNjZXNzIDogXCJWb3VzIGF2ZXogcsOpcG9uZHUgZW4gRFVSQVRJT04gc2Vjb25kZXMgZXQgYXZleiBOQkNPUlJFQ1RBTlNXRVJTIGJvbm5lKHMpIHLDqXBvbnNlKHMpIHN1ciBOQlFVRVNUSU9OUy4gQnJhdm8gISBSaWVuIG5lIHZvdXMgw6ljaGFwcGUgIVwiLFxuICAgIHdhbnRUb1NhdmVSZXNwb25zZXM6IFwiU2kgdm91cyBsZSBzb3VoYWl0ZXosIHZvdXMgcG91dmV6IHNhdXZlZ2FyZGVyIHZvdHJlIHLDqXN1bHRhdCBlbiBjcsOpYW50IHZvdHJlIGNvbXB0ZS5cXG5DZWxhIHZvdXMgcGVybWV0dHJhIGRlIHRlc3RlciBkZSBub3V2ZWF1IGNlIHF1aXogZGFucyBsJ2F2ZW5pciBwb3VyIHZvaXIgc2kgdm91cyBhdmV6IG3DqW1vcmlzZXIgbGVzIGJvbm5lcyByw6lwb25zZXMuIFZvdXMgcG91cnJleiBhaW5zaSBhdXNzaSByZWNldm9pciByw6lndWxpw6hyZW1lbnQgZGUgbm91dmVhdXggcXVpenMuXCIsXG4gICAgcmVzcG9uc2VTYXZlZE1lc3NhZ2UgOiBcIlZvdHJlIHLDqXN1bHRhdCBhIMOpdMOpIGVucmVnaXN0csOpLiA8YSBocmVmPScvI1VSTCc+QWNjw6hkZXIgw6AgdG91cyB2b3MgcXVpenM8L2E+LlwiLFxuICAgIHJlc3BvbnNlU2F2ZWRFcnJvciA6IFwiQ2VwZW5kYW50IHVuZSBlcnJldXIgYSDDqXTDqSByZW5jb250csOpZSBkdXJhbnQgbCdlbnJlZ2lzdHJlbWVudCBkZSB2b3RyZSByw6lzdWx0YXQuIDxhIGhyZWY9Jy8jVVJMJz5BY2PDqGRlciDDoCB0b3VzIHZvcyBxdWl6czwvYT4uXCIsXG4gICAgbm9RdWVzdGlvbm5haXJlV2l0aG91ZEFuc3dlcjogXCJCcmF2byAhIFZvdXMgYXZleiByw6lwb25kdSDDoCB0b3VzIGxlcyBxdWl6cyBxdWkgdm91cyBvbiDDqXTDqSBwcm9wb3PDqXMgITxicj5JbCB5IGVuIGEgZGVzIG5vdXZlYXV4IHB1Ymxpw6lzIHLDqWd1bGnDqHJlbWVudCBldCBxdWkgdm91cyBzZXJvbnQgcHJvcG9zw6lzLjxicj5FbiBhdHRlbmRhbnQgdm91cyBwb3V2ZXogcGV1dC3DqnRyZSBlc3NheWVyIGRlIHLDqXBvbmRyZSBkZSBub3V2ZWF1IMOgIGNlcnRhaW4gcXVpeiBwb3VyIHZvaXIgc2kgdm91cyB2b3VzIHNvdXZlbmV6IGRlcyBib25uZXMgcsOpcG9uc2VzID9cIixcbiAgICBuYlF1ZXN0aW9ubmFpcmVXaXRob3VkQW5zd2VyOiBcIklsIHkgYSAjTkIgcXVpenMgcXVpIHZvdXMgb250IMOpdMOpIHByb3Bvc8OpcyBldCBhdXhxdWVscyB2b3VzIG4nYXZleiBwYXMgcsOpcG9uZHUuIFZvaWNpIGxlcyBkZXJuaWVycyA6IVwiLFxuICAgIHN0YXRzVXNlcjogXCJWb3VzIGF2ZXogZW5yZWdpc3Ryw6kgTkJBTlNXRVJTIHLDqXBvbnNlcyDDoCA8Yj5OQlFVRVNUSU9OTkFJUkVTIHF1ZXN0aW9ubmFpcmVzIGRpZmbDqXJlbnRzPC9iPiBzdXIgbGVzIE5CVE9UUVVFU1RJT05OQUlSRVMgcHJvcG9zw6lzIHBhciBsZSBzaXRlLjxicj5FbiBtb3llbm5lLCB2b3VzIGF2ZXogbWlzIEFWR0RVUkFUSU9OIHNlY29uZGVzIMOgIHLDqXBvbmRyZSBldCBhdmV6IDxiPmNvcnJlY3RlbWVudCByw6lwb25kdSDDoCBBVkdDT1JSRUNUQU5TV0VSUyAlIGRlcyBxdWVzdGlvbnM8L2I+LlwiLFxuICAgIHByZXZpb3VzQW5zd2Vyc1RpdGxlOiBcIlZvcyByw6lzdWx0YXRzIHByw6ljw6lkZW50c1wiLFxuICAgIHByZXZpb3VzQW5zd2Vyc1N0YXRzOiBcIkVuIG1veWVubmUsIHZvdXMgYXZleiByw6lwb25kdSDDoCBjZSBxdWl6IGVuIEFWR0RVUkFUSU9OIHNlY29uZGVzLCBlbiBheWFudCA8Yj5BVkdDT1JSRUNUQU5TV0VSUyAlIGRlIGJvbm5lcyByw6lwb25zZXM8L2I+LlwiLFxuICAgIHByZXZpb3VzQW5zd2Vyc0xpbmU6IFwiTGUgREFURUFOU1dFUiwgdm91cyBhdmV6IHLDqXBvbmR1IGNvcnJlY3RlbWVudCDDoCBOQkNPUlJFQ1RBTlNXRVJTIHF1ZXN0aW9ucyBlbiBBVkdEVVJBVElPTiBzZWNvbmRlcy5cIlxufTtcbiIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBzaXRlSFRNTFRpdGxlIDogXCJXaWtpTGVybmkgOiBxdSdhbGxlei12b3VzIGFwcHJlbmRyZSBhdWpvdXJkJ2h1aSA/XCIsXG4gICAgc2l0ZU1ldGFEZXNjcmlwdGlvbiA6IFwiQ2hhcXVlIGpvdXIsIHRlc3RleiB2b3MgY29ubmFpc3NhbmNlcyBldCBhcHByZW5leiBkZSBub3V2ZWxsZXMgY2hvc2VzIGF2ZWMgV2lraUxlcm5pLlwiLFxuICAgIHNjcmlwdFRpbWluZ0luZm8gOiBcIkR1csOpZSBkZSBsYSByw6lwb25zZSA6IFNDUklQVF9USU1JTkcgbWlsbGlzZWNvbmRlcywgcm91dGUgOiBTQ1JJUFRfVVJMXCIsXG4gICAgc2NyaXB0VGltaW5nQWxlcnQgOiBcIioqKiBTY3JpcHQgbGVudCA6IFNDUklQVF9USU1JTkcgbWlsbGlzZWNvbmRlcywgcm91dGUgOiBTQ1JJUFRfVVJMXCIsXG4gICAgc2VydmVyRXJyb3IgOiBcIkTDqXNvbMOpLiBVbmUgZXJyZXVyIGltcHLDqXZ1ZSBlc3Qgc3VydmVudWUuIFNpIGNlbGEgcGVyc2lzdGUsIG4naMOpc2l0ZXogw6AgcHLDqXZlbmlyIGwnYWRtaW5pc3RyYXRldXIgZHUgc2l0ZS5cIixcbiAgICBzZXJ2ZXJFcnJvckFkbWluIDogXCJCdWcgZGUgbCdhcHBsaWNhdGlvbiA6XCIsXG4gICAgbmVlZGVkUGFyYW1zIDogXCJEZXMgcGFyYW3DqHRyZXMgbsOpY2Vzc2FpcmVzIG1hbnF1YW50cyBzb250IG1hbnF1YW50cy5cIixcbiAgICBiYWRVcmwgOiBcIlRlbnRhdGl2ZSBkJ2FjY8OocyDDoCB1bmUgcGFnZSBuJ2V4aXN0YW50IHBhcyA6XCIsXG4gICAgbm90VmFsaWRGb3JtYXQgOiBcIkZvcm1hdCBub24gdmFsaWRlLlwiLFxuICAgIG5vdEFsbG93ZWQgOiBcIlZvdXMgbidhdmV6IHBhcyBsZXMgZHJvaXRzIG7DqWNlc3NhaXJlcyBwb3VyIGNldHRlIGFjdGlvbi5cIixcbiAgICBub3RSZXF1aXJlZCA6IFwiRmFjdWx0YXRpZi5cIixcbiAgICB1cGRhdGVCdG5UeHQ6IFwiTW9kaWZpZXJcIixcbiAgICBhZGRCdG5UeHQ6IFwiQWpvdXRlclwiLFxuICAgIGRlbGV0ZUJ0blR4dDogXCJTdXBwcmltZXJcIixcbiAgICBhZGRPa01lc3NhZ2UgOiBcIkxlcyBkb25uw6llcyBvbnQgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWVzLlwiLFxuICAgIHVwZGF0ZU9rTWVzc2FnZSA6IFwiTGEgbWlzZSDDoCBqb3VyIMOgIGpvdXIgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS5cIixcbiAgICBkZWxldGVPa01lc3NhZ2UgOiBcIkxhIHN1cHByZXNzaW9uIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgZmFpbEF1dGggOiBcIkVycmV1ciBkJ2F1dGhlbnRpZmljYXRpb24uXCIsXG4gICAgZmFpbEF1dGhIZWFkZXIgOiBcIkFic2VuY2UgZGUgaGVhZGVyIEF1dGhvcml6YXRpb24uXCIsXG4gICAgZmFpbEF1dGhUb2tlbiA6IFwiVG9rZW4gaW52YWxpZGUgb3UgdXRpbGlzYXRldXIgbm9uIHRyb3V2w6kuXCIsXG4gICAgZmFpbEF1dGhJZCA6IFwiSWRlbnRpZmlhbnQgbm9uIHZhbGlkZSA6IFwiLFxuICAgIGZhaWxBdXRoQ3JvbiA6IFwiVGVudGF0aXZlIGRlIGxhbmNlbWVudCBkJ3VuIGNyb24gc2FucyBsZSBib24gdG9rZW4uXCIsXG4gICAgcHJldmlvdXNQYWdlIDogXCJQYWdlIHByw6ljw6lkZW50ZVwiLFxuICAgIG5leHRQYWdlIDogXCJQYWdlIHN1aXZhbnRlXCIsXG4gICAgYnRuTGlua1RvUXVlc3Rpb25uYWlyZSA6IFwiQWxsZXIgYXUgcXVpeiAhXCIsXG4gICAgc3RhdHNBZG1pbiA6IFwiRHVyYW50IGxlcyBkZXJuacOocmVzIDI0aCA6IE5CX1VTRVJTXzI0SCBjb21wdGVzIG9udCDDqXTDqSBjcsOpw6lzLCBOQl9TVUJTQ1JJUFRJT05TXzI0SCB2YWxpZMOpcyBldCBOQl9VU0VSU19ERUxFVEVEXzI0SCBzdXBwcmltw6lzLiBOQl9BTlNXRVJTXzI0SCByw6lwb25zZXMgYXV4IHF1aXpzIG9udCDDqXTDqSBlbnJlZ2lzdHLDqWVzLjxicj5FbiB0b3V0LCBpbCB5IGEgOiBOQl9VU0VSU19UT1QgY29tcHRlcywgZG9udCBOQl9TVUJTQ1JJUFRJT05TX1RPVCB2YWxpZMOpcyBldCBOQl9TVUJTQ1JJUFRJT05TX1BSRU1JVU0gY29tcHRlcyBwcsOpbWl1bS4gTkJfQU5TV0VSU19UT1QgcsOpcG9uc2VzIGF1eCBxdWl6cyBvbnQgw6l0w6kgZW5yZWdpc3Ryw6llcy48YnI+UGFybWkgbGVzIE5CX1VTRVJTX0RFTEVURURfVE9UIGNvbXB0ZXMgc3VwcHJpbcOpcywgTkJfVVNFUlNfREVMRVRFRF9WQUxJREVEIGF2YWllbnQgdmFsaWTDqSBsZXVyIGNvbXB0ZSBldCBOQl9VU0VSU19ERUxFVEVEX1BSRU1JVU0gYXZhaWVudCBzb3VzY3JpdCB1biBjb21wdGUgcHLDqW1pdW0uXCJcbn07IiwiLy8gUXVlbHF1ZXMgZm9uY3Rpb25zIHV0aWxlcyBwb3VyIGxlcyBjaGHDrm5lc1xuXG5jbGFzcyBUb29sXG57XG4gICAgc3RhdGljIGlzRW1wdHkobXlWYXIpXG4gICAge1xuICAgICAgICBpZihteVZhcj09PXVuZGVmaW5lZCB8fCBteVZhcj09PW51bGwpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVZhcis9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVZhcj1teVZhci50cmltKCk7XG4gICAgICAgICAgICBpZihteVZhcj09PVwiXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIHN0YXRpYyB0cmltSWZOb3ROdWxsKG15U3RyaW5nKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KG15U3RyaW5nKSlcbiAgICAgICAgICAgIG15U3RyaW5nPW51bGw7XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgbXlTdHJpbmcrPVwiXCI7Ly8gc2kgYXV0cmUgY2hvc2UgcXUndW5lIGNoYcOubmUgZW52b3nDqS4uLlxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcudHJpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cblxuICAgIHN0YXRpYyBzaG9ydGVuSWZMb25nZXJUaGFuKG15U3RyaW5nLCBtYXgpXG4gICAge1xuICAgICAgICBteVN0cmluZys9XCJcIjsvLyBhdSBjYXMgb8O5IGNlbGEgbmUgc2VyYWl0IHBhcyB1bmUgY2hhw65uZS4uLlxuICAgICAgIGlmKG15U3RyaW5nLmxlbmd0aCA+IG1heClcbiAgICAgICAgICAgIG15U3RyaW5nPW15U3RyaW5nLnN1YnN0cmluZygwLCAobWF4LTMpKStcIi4uLlwiO1xuICAgICAgICByZXR1cm4gbXlTdHJpbmc7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTU2MDQxNDAvcmVwbGFjZS1tdWx0aXBsZS1zdHJpbmdzLXdpdGgtbXVsdGlwbGUtb3RoZXItc3RyaW5nc1xuICAgIHN0YXRpYyByZXBsYWNlQWxsKG15U3RyaW5nLCBtYXBPYmopXG4gICAge1xuICAgICAgICBjb25zdCByZXBsYWNlRWx0cyA9IG5ldyBSZWdFeHAoT2JqZWN0LmtleXMobWFwT2JqKS5qb2luKFwifFwiKSxcImdpXCIpO1xuICAgICAgICByZXR1cm4gbXlTdHJpbmcucmVwbGFjZShyZXBsYWNlRWx0cywgKG1hdGNoZWQpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBtYXBPYmpbbWF0Y2hlZF07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHNvdXJjZSA6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2ZyL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL09iamV0c19nbG9iYXV4L01hdGgvcmFuZG9tXG4gICAgc3RhdGljIGdldFJhbmRvbUludChtaW4sIG1heClcbiAgICB7XG4gICAgICAgIG1pbiA9IE1hdGguY2VpbChtaW4pO1xuICAgICAgICBtYXggPSBNYXRoLmZsb29yKG1heCk7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluKSkgKyBtaW47XG4gICAgfVxuXG4gICAgLy8gw6AgY29tcGzDqXRlciA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0RhdGVfZm9ybWF0X2J5X2NvdW50cnlcbiAgICBzdGF0aWMgZGF0ZUZvcm1hdChkYXRlU3RyaW5nLCBsYW5nPVwiZnJcIilcbiAgICB7XG4gICAgICAgIGlmKFRvb2wuaXNFbXB0eShkYXRlU3RyaW5nKSlcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICBsZXQgbXlEYXRlPW5ldyBEYXRlKGRhdGVTdHJpbmcpO1xuICAgICAgICBsZXQgbXlEYXk9bXlEYXRlLmdldERhdGUoKStcIlwiO1xuICAgICAgICBpZihteURheS5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlEYXk9XCIwXCIrbXlEYXk7XG4gICAgICAgIGxldCBteU1vdW50aD0obXlEYXRlLmdldE1vbnRoKCkrMSkrXCJcIjtcbiAgICAgICAgaWYobXlNb3VudGgubGVuZ3RoPT09MSlcbiAgICAgICAgICAgIG15TW91bnRoPVwiMFwiK215TW91bnRoO1xuICAgICAgICBsZXQgbXlZZWFyPW15RGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICBpZihsYW5nPT09XCJmclwiKVxuICAgICAgICAgICAgcmV0dXJuIG15RGF5K1wiL1wiK215TW91bnRoK1wiL1wiK215WWVhcjtcbiAgICAgICAgZWxzZSBpZiAobGFuZz09PVwiZm9ybVwiKS8vIDIwMTQtMDItMDlcbiAgICAgICAgICAgIHJldHVybiBteVllYXIrXCItXCIrbXlNb3VudGgrXCItXCIrbXlEYXk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBteU1vdW50aCtcIi9cIitteURheStcIi9cIitteVllYXI7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFRvb2w7IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIGFwaVVybCA6IFwiaHR0cDovL2xvY2FsaG9zdDozMDAwL2FwaVwiLFxuICAgIHVzZXJzR2V0Q29uZmlnVXJsIDogXCIvdXNlci9nZXRjb25maWdcIixcbiAgICBsYW5nIDogXCJmclwiLFxuICAgIHVzZXJIb21lUGFnZSA6IFwiYWNjdWVpbC5odG1sXCIsXG4gICAgYWRtaW5Ib21lUGFnZSA6IFwiYWRtaW4uaHRtbFwiLFxuICAgIG1hbmFnZXJIb21lUGFnZSA6IFwiZ2VzdGlvbi5odG1sXCIsXG4gICAgc3Vic2NyaWJlUGFnZSA6IFwiaW5zY3JpcHRpb24uaHRtbFwiLFxuICAgIGNvbm5lY3Rpb25QYWdlIDogXCJjb25uZXhpb24uaHRtbFwiLFxuICAgIGFjY291bnRQYWdlOiBcImNvbXB0ZS5odG1sXCIsXG4gICAgcXVlc3Rpb25uYWlyZXNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXF1aXpzLmh0bWxcIixcbiAgICB1c2Vyc01hbmFnZW1lbnRQYWdlOiBcImdlc3Rpb24tdXRpbGlzYXRldXJzLmh0bWxcIixcbiAgICBuYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlIDogMTAsXG4gICAgaWxsdXN0cmF0aW9uRGlyIDogXCIvaW1nL3F1aXpzL1wiXG59O1xuLy8gw6AgdGVybWUgZnVzaW9ubmVyIGF2ZWMgbGVzIGTDqWNsYXJhdGlvbnMgYmFja2VuZCBjb25jZXJuYW50IGxlIGZyb250LCB0b3V0IMOpdGFudCBzYWlzaSBkYW5zIGwnYWRtaW4iLCIvLyAtLSBHRVNUSU9OIERVIEZPUk1VTEFJUkUgUEVSTUVUVEFOVCBEJ0FGRklDSEVSIEVUIFLDiVBPTkRSRSDDgCBVTiBRVUlaXG5cbi8vLyBJbCBuJ2VzdCBwYXMgbsOpY2Vzc2FpcmUgZCfDqnRyZSBjb25uZWN0w6kgcG91ciByw6lwb25kcmUgYXUgcXVpeiBldCB2b2lyIHNvbiByw6lzdWx0YXQuXG4vLy8gTWFpcyBzaSBwYXMgY29ubmVjdMOpLCBqZSBwcm9wb3NlIMOgIGwnaW50ZXJuYXV0ZSBkZSBzZSBjb25uZWN0ZXIgb3UgZGUgY3LDqWVyIHVuIGNvbXB0ZS5cbi8vLyBEYW5zIGNlIGJ1dCBzb24gcsOpc3VsdGF0IGVzdCBhbG9ycyBzdG9ja8OpIGRhbnMgc29uIG5hdmlnYXRldXJcbi8vLyBTaSBpbCBlc3QgY29ubmVjdMOpLCBsJ2VucmVnaXN0cmVtZW50IGRlIHNvbiByw6lzdWx0YXQgc2UgZmFpdCBhdXRvbWF0aXF1ZW1lbnQgZXQgc2VzIHByw6ljw6lkZW50cyByw6lzdWx0YXRzIGFmZmljaMOpc1xuXG4vLyBGaWNoaWVyIGRlIGNvbmZpZ3VyYXRpb24gY8O0dMOpIGNsaWVudCA6XG5jb25zdCBjb25maWdGcm9udEVuZCA9IHJlcXVpcmUoXCIuL2NvbmZpZy9nZW5lcmFsXCIpO1xuXG4vLyBJbXBvcnRhdGlvbiBkZXMgZm9uY3Rpb25zIHV0aWxlcyBhdSBzY3JpcHQgOlxuaW1wb3J0IHsgY2hlY2tBbnN3ZXJPdXB1dCwgc2F2ZUFuc3dlciB9IGZyb20gXCIuL3Rvb2xzL2Fuc3dlcnMuanNcIjtcbmltcG9ydCB7IGFkZEVsZW1lbnQgfSBmcm9tIFwiLi90b29scy9kb20uanNcIjtcbmltcG9ydCB7IGhlbGxvRGV2IH0gZnJvbSBcIi4vdG9vbHMvZXZlcnl3aGVyZS5qc1wiO1xuaW1wb3J0IHsgZ2V0TG9jYWx5IH0gZnJvbSBcIi4vdG9vbHMvY2xpZW50c3RvcmFnZS5qc1wiO1xuaW1wb3J0IHsgZ2V0RGF0YXNGcm9tSW5wdXRzIH0gZnJvbSBcIi4vdG9vbHMvZm9ybXMuanNcIjtcbmltcG9ydCB7IGRhdGVGb3JtYXQsIGlzRW1wdHksIHJlcGxhY2VBbGwgfSBmcm9tIFwiLi4vLi4vdG9vbHMvbWFpblwiO1xuaW1wb3J0IHsgY2hlY2tTZXNzaW9uLCBnZXRDb25maWcsIGdldFRpbWVEaWZmZXJlbmNlIH0gZnJvbSBcIi4vdG9vbHMvdXNlcnMuanNcIjtcblxuLy8gRGljdGlvbm5haXJlcyA6XG5jb25zdCB0eHQgPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitjb25maWdGcm9udEVuZC5sYW5nK1wiL2dlbmVyYWxcIik7XG5jb25zdCB0eHRBbnN3ZXJzID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrY29uZmlnRnJvbnRFbmQubGFuZytcIi9hbnN3ZXJcIik7XG5cbi8vIFByaW5jaXBhdXggw6lsw6ltZW50cyBkdSBET00gbWFuaXB1bMOpcyA6XG5jb25zdCBteUZvcm0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInF1ZXN0aW9ubmFpcmVcIik7XG5jb25zdCBkaXZSZXNwb25zZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicmVzcG9uc2VcIik7XG5jb25zdCBidG5TaG93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzaG93UXVlc3Rpb25uYWlyZVwiKTtcbmNvbnN0IGJ0blN1Ym1pdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY2hlY2tSZXNwb25zZXNcIik7XG5jb25zdCBleHBsYW5hdGlvbnNUaXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZXhwbGFuYXRpb25zVGl0bGVcIik7XG5jb25zdCBleHBsYW5hdGlvbnNDb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJleHBsYW5hdGlvbnNDb250ZW50XCIpO1xuXG5oZWxsb0RldigpO1xuXG4vLyBDaGFyZ2VtZW50IGRlcyBjb25maWd1cmF0aW9ucyBmb3VybmllcyBwYXIgbGUgYmFja2VuZCArIHRlc3QgZGUgY29ubmV4aW9uIGRlIGwndXRpbGlzYXRldXIgOlxubGV0IGNvbmZpZywgaXNDb25uZWN0ZWQsIHVzZXI7XG5jb25zdCBpbml0aWFsaXNlID0gYXN5bmMgKCkgPT5cbntcbiAgICB0cnlcbiAgICB7XG4gICAgICAgIGNvbmZpZyA9IGF3YWl0IGdldENvbmZpZygpO1xuICAgICAgICBpZighY29uZmlnKVxuICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGJ0blNob3cuc3R5bGUuZGlzcGxheT1cImlubGluZVwiO1xuICAgICAgICAgICAgaXNDb25uZWN0ZWQ9YXdhaXQgY2hlY2tTZXNzaW9uKGNvbmZpZywgW1widXNlclwiXSk7Ly8gc2V1bHMgbGVzIHNpbXBsZXMgdXRpbGlzYXRldXJzIHBldXZlbnQgcsOpcG9uZHJlIGF1eCBxdWl6c1xuICAgICAgICAgICAgLy8gU2kgbCd1dGlsaXNhdGV1ciBlc3QgY29ubmVjdMOpLCBqZSB2w6lyaWZpZSBzdXIgaWwgYSBkw6lqw6AgcsOpcG9uZHUgw6AgY2UgcXVpeiBldCBzaSBvdWkgYWZmaWNoZSBzZXMgcHLDqWPDqWRlbnRlcyByw6lwb25zZXMgZGFucyBsJ2VuY2FydCBzZXJ2YW50IMOgIGV4cGxpcXVlciBsZSB0b3BvIGF1eCBub3V2ZWF1eFxuICAgICAgICAgICAgaWYoaXNDb25uZWN0ZWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdXNlcj1nZXRMb2NhbHkoXCJ1c2VyXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgIGNoZWNrUHJldmlvdXNSZXNwb25zZXMoY29uZmlnLCB1c2VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaChlKVxuICAgIHtcbiAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgIH1cbn1cbmluaXRpYWxpc2UoKTtcblxuLy8gQWZmaWNoYWdlIGR1IHF1ZXN0aW9ubmFpcmUgc2kgbCd1dGlsaXNhdGV1ciBjbGlxdWUgc3VyIGxlIGJvdXRvbiBvdSBzaSBsJ2lkIGR1IGZvcm11bGFpcmUgZXN0IHBhc3PDqWUgcGFyIGwndXJsXG4vLyBEw6ljbGVuY2hlIGVuIG3Dqm1lIHRlbXBzIGxlIGNocm9ub23DqHRyZSBtZXN1cmFudCBsYSBkdXLDqWUgZGUgbGEgcsOpcG9uc2UgYXV4IHF1ZXN0aW9ucy5cbmNvbnN0IHNob3dRdWVzdGlvbm5haXJlID0gKCkgPT5cbntcbiAgICBjaHJvbm9CZWdpbj1EYXRlLm5vdygpO1xuICAgIG15Rm9ybS5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIjtcbiAgICBidG5TaG93LnNldEF0dHJpYnV0ZShcImRpc2FibGVkXCIsIHRydWUpO1xuICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIjcXVlc3Rpb25uYWlyZVwiKTtcbn1cbmxldCBjaHJvbm9CZWdpbj0wO1xuYnRuU2hvdy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSlcbntcbiAgICB0cnlcbiAgICB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgc2hvd1F1ZXN0aW9ubmFpcmUoKTtcbiAgICB9XG4gICAgY2F0Y2goZSlcbiAgICB7XG4gICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHQuc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICB9XG59KTtcbmlmKGxvY2F0aW9uLmhhc2ghPXVuZGVmaW5lZCAmJiBsb2NhdGlvbi5oYXNoPT09XCIjcXVlc3Rpb25uYWlyZVwiKVxuICAgIHNob3dRdWVzdGlvbm5haXJlKCk7XG5cbi8vIFRyYWl0ZW1lbnQgZGUgbCdlbnZvaSBkZSBzYSByw6lwb25zZSBwYXIgbCd1dGlsaXNhdGV1ciA6XG5sZXQgYW5zd2VyID0ge307XG5teUZvcm0uYWRkRXZlbnRMaXN0ZW5lcihcInN1Ym1pdFwiLCBmdW5jdGlvbihlKVxue1xuICAgIHRyeVxuICAgIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOyAgICAgICBcbiAgICAgICAgYnRuU3VibWl0LnNldEF0dHJpYnV0ZShcImRpc2FibGVkXCIsIHRydWUpOy8vIHNldWxlbWVudCB1biBlbnZvaSDDoCBsYSBmb2lzIDopXG4gICAgICAgIGRpdlJlc3BvbnNlLmlubmVySFRNTD1cIlwiOy8vIHN1cHByaW1lIGxlcyDDqXZlbnR1ZWxzIG1lc3NhZ2VzIGTDqWrDoCBhZmZpY2jDqXNcbiAgICAgICAgY29uc3QgdXNlclJlc3BvbnNlcz1nZXREYXRhc0Zyb21JbnB1dHMobXlGb3JtKTtcbiAgICAgICAgYW5zd2VyLmR1cmF0aW9uPU1hdGgucm91bmQoKERhdGUubm93KCktY2hyb25vQmVnaW4pLzEwMDApO1xuICAgICAgICBhbnN3ZXIubmJDb3JyZWN0QW5zd2Vycz0wO1xuICAgICAgICBhbnN3ZXIuUXVlc3Rpb25uYWlyZUlkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicXVlc3Rpb25uYWlyZUlkXCIpLnZhbHVlO1xuICAgICAgICAvLyBSw6ljdXDDqXJlIGxlcyByw6lwb25zZXMgZHUgcXVpeiBzdXIgbGUgc2VydmV1ciA6XG4gICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBjb25maWdGcm9udEVuZC5hcGlVcmwrY29uZmlnLnF1ZXN0aW9ubmFpcmVSb3V0ZXMrY29uZmlnLmdldFF1ZXN0aW9ubmFpcmVSb3V0ZXMrXCIvXCIrdXNlclJlc3BvbnNlcy5xdWVzdGlvbm5haXJlSWQpO1xuICAgICAgICBsZXQgaWRDaG9pY2UsIGdvb2RSZXNwb25zZTtcbiAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCAmJiBBcnJheS5pc0FycmF5KHJlc3BvbnNlLlF1ZXN0aW9ucykpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBhbnN3ZXIubmJRdWVzdGlvbnM9cmVzcG9uc2UuUXVlc3Rpb25zLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgLy8gUHVpcyBvbiBwYXNzZSBlbiByZXZ1ZSBsZXMgcsOpcG9uc2VzIHBvdXIgYWZmaWNoZXIgY2VsbGVzIHF1aSBzb250IGNvcnJlY3RlcyBldCBkw6l0ZWN0ZXIgbGVzIGVycmV1cnNcbiAgICAgICAgICAgICAgICAgICAgLy8gSWwgcGV1dCB5IGF2b2lyIHBsdXNpZXVycyBib25uZXMgcsOpcG9uc2VzIHBvdXIgdW5lIG3Dqm1lIHF1ZXN0aW9uIChRQ00pXG4gICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiByZXNwb25zZS5RdWVzdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdvb2RSZXNwb25zZT10cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBqIGluIHJlc3BvbnNlLlF1ZXN0aW9uc1tpXS5DaG9pY2VzKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkQ2hvaWNlPXJlc3BvbnNlLlF1ZXN0aW9uc1tpXS5DaG9pY2VzW2pdLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLlF1ZXN0aW9uc1tpXS5DaG9pY2VzW2pdLmlzQ29ycmVjdD09PXRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJlc3BvbnNlX1wiK2lkQ2hvaWNlKS5wYXJlbnROb2RlLmNsYXNzTGlzdC5hZGQoXCJzdWNjZXNzXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih1c2VyUmVzcG9uc2VzW1wicmVzcG9uc2VfXCIraWRDaG9pY2VdPT09dW5kZWZpbmVkKS8vIGJvbm5lIHLDqXBvbnNlIG5vbiBzw6lsZWN0aW9ubsOpZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29vZFJlc3BvbnNlPWZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih1c2VyUmVzcG9uc2VzW1wicmVzcG9uc2VfXCIraWRDaG9pY2VdPT09XCJvblwiKS8vIHLDqXBvbnNlIGNvY2jDqWUgbifDqXRhbnQgcGFzIHVuZSBkZXMgYm9ubmVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2RSZXNwb25zZT1mYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicmVzcG9uc2VfXCIraWRDaG9pY2UpLnBhcmVudE5vZGUuY2xhc3NMaXN0LmFkZChcImVycm9yXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoZ29vZFJlc3BvbnNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuc3dlci5uYkNvcnJlY3RBbnN3ZXJzKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gQWZmaWNoYWdlIGR1IHLDqXN1bHRhdCwgc3VpdmFudCBzaSBsJ3V0aWxpc2F0ZXVyIGVzdCBjb25uZWN0w6kgb3UgcGFzIGV0IHNvbiBzY29yZSA6XG4gICAgICAgICAgICAgICAgICAgIGxldCBnZXRPdXB1dD1jaGVja0Fuc3dlck91cHV0KGFuc3dlcik7XG4gICAgICAgICAgICAgICAgICAgIGlmKGlzQ29ubmVjdGVkKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaSBsJ3V0aWxpc2F0ZXVyIGVzdCBjb25uZWN0w6kgb24gZW5yZWdpc3RyZSBzb24gcsOpc3VsdGF0IHN1ciBsZSBzZXJ2ZXVyLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeGhyMiA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgeGhyMi5vcGVuKFwiUE9TVFwiLCBjb25maWdGcm9udEVuZC5hcGlVcmwrY29uZmlnLnF1ZXN0aW9ubmFpcmVSb3V0ZXMrY29uZmlnLnNhdmVBbnN3ZXJzUm91dGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgeGhyMi5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlMj1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDEgJiYgKHJlc3BvbnNlMi5tZXNzYWdlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3VwdXQrPVwiPGJyPlwiK3Jlc3BvbnNlMi5tZXNzYWdlLnJlcGxhY2UoXCIjVVJMXCIsIGNvbmZpZ0Zyb250RW5kLnVzZXJIb21lUGFnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja1ByZXZpb3VzUmVzcG9uc2VzKGNvbmZpZywgdXNlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3VwdXQrPVwiPGJyPlwiK3R4dEFuc3dlcnMucmVzcG9uc2VTYXZlZEVycm9yLnJlcGxhY2UoXCIjVVJMXCIsIGNvbmZpZ0Zyb250RW5kLnVzZXJIb21lUGFnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCBnZXRPdXB1dCwgXCJcIiwgW1wiaW5mb3JtYXRpb25cIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHhocjIuc2V0UmVxdWVzdEhlYWRlcihcIkF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIrdXNlci50b2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB4aHIyLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5zd2VyLnRpbWVEaWZmZXJlbmNlPWdldFRpbWVEaWZmZXJlbmNlKGNvbmZpZyk7Ly8gb24gZW4gcHJvZml0ZSBwb3VyIG1ldHRyZSBsZXMgcGVuZHVsZXMgw6AgbCdoZXVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgeGhyMi5zZW5kKEpTT04uc3RyaW5naWZ5KGFuc3dlcikpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgeyAgIC8vIHNpbm9uIGplIGwnZW5yZWdpc3RyZSBjw7R0w6kgY2xpZW50IHBvdXIgcGVybWV0dHJlIGRlIGxlIHJldHJvdXZlciBhdSBtb21lbnQgZGUgbGEgY3LDqWF0aW9uIGR1IGNvbXB0ZSBvdSBkZSBsYSBjb25uZXhpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNhdmVBbnN3ZXIoYW5zd2VyKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3VwdXQrPVwiPGJyPlwiK3R4dEFuc3dlcnMud2FudFRvU2F2ZVJlc3BvbnNlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIGdldE91cHV0LCBcIlwiLCBbXCJpbmZvcm1hdGlvblwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuc3ViY3JpYmVCdG5zXCIpLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAvLyBwYXMgbGEgcGVpbmUgZGUgcHJvcG9zZXIgZGUgY3LDqWVyIHVuIGNvbXB0ZSBzaSBsZSBzdG9ja2FnZSBsb2NhbCBuZSBmb25jdGlvbm5lIHBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCBnZXRPdXB1dCwgXCJcIiwgW1wiaW5mb3JtYXRpb25cIl0pO1xuICAgICAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgICAgICAvLyBhZmZpY2hhZ2UgZGVzIHRleHRlcyBkJ2V4cGxpY2F0aW9ucyBwb3VyIGNoYXF1ZSBxdWVzdGlvblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBleHBsYW5hdGlvbnM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIi5oZWxwXCIpO1xuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gZXhwbGFuYXRpb25zKVxuICAgICAgICAgICAgICAgICAgICAgICAgZXhwbGFuYXRpb25zW2ldLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiOy8vIGFmZmljaGUgdW5lIGVycmV1ciBcIlR5cGVFcnJvcjogZXhwbGFuYXRpb25zW2ldLnN0eWxlIGlzIHVuZGVmaW5lZFwiIG1haXMgdG91dCBmb25jdGlvbm5lID9cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgdHh0LnNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgeGhyLnNlbmQoKTtcbiAgICB9XG4gICAgY2F0Y2goZSlcbiAgICB7XG4gICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHQuc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICB9XG59KVxuXG4vLyBGb25jdGlvbiB2w6lyaWZpYW50IGxlcyBwcsOpY8OpZGVudGVzIHLDqXBvbnNlcyBkZSBsJ3V0aWxpc2F0ZXVyXG4vLyBVdGlsZSBzaSBjb25uZWN0w6kgbG9ycyBkdSBwcmVtaWVyIGNoYXJnZW1lbnQgZGUgbGEgcGFnZSwgcHVpcyBhcHLDqHMgdW5lIG5vdXZlbGxlIHLDqXBvbnNlXG5jb25zdCBjaGVja1ByZXZpb3VzUmVzcG9uc2VzID0gKGNvbmZpZywgdXNlcikgPT5cbntcbiAgICBjb25zdCB4aHJQcmV2aW91c1JlcyA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHhoclByZXZpb3VzUmVzLm9wZW4oXCJHRVRcIiwgY29uZmlnRnJvbnRFbmQuYXBpVXJsK2NvbmZpZy5xdWVzdGlvbm5haXJlUm91dGVzK2NvbmZpZy5nZXRQcmV2aW91c0Fuc3dlcnMrdXNlci5pZCtcIi9cIitkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInF1ZXN0aW9ubmFpcmVJZFwiKS52YWx1ZSk7XG4gICAgeGhyUHJldmlvdXNSZXMub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICB7XG4gICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuYlJlc3BvbnNlcz1yZXNwb25zZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgbGV0IHByZXZpb3VzQW5zd2Vyc0NvbnRlbnQ9XCJcIjtcbiAgICAgICAgICAgICAgICBpZihuYlJlc3BvbnNlcyE9PTApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGV4cGxhbmF0aW9uc1RpdGxlLCBcInNwYW5cIiwgdHh0QW5zd2Vycy5wcmV2aW91c0Fuc3dlcnNUaXRsZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0b3ROYlF1ZXN0aW9ucz0wLCB0b3ROYkNvcnJlY3RBbnN3ZXJzPTAsIHRvdER1cmF0aW9uPTAsIG1hcExpbmVDb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gcmVzcG9uc2UpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdE5iUXVlc3Rpb25zKz1yZXNwb25zZVtpXS5uYlF1ZXN0aW9ucztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdE5iQ29ycmVjdEFuc3dlcnMrPXJlc3BvbnNlW2ldLm5iQ29ycmVjdEFuc3dlcnM7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3REdXJhdGlvbis9cmVzcG9uc2VbaV0uZHVyYXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXBMaW5lQ29udGVudCA9XG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgREFURUFOU1dFUiA6IGRhdGVGb3JtYXQocmVzcG9uc2VbaV0uY3JlYXRlZEF0KSwvLyByZXZvaXIgcHJvYmzDqG1lIGRlIGxhIGxhbmd1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5CQ09SUkVDVEFOU1dFUlMgOiByZXNwb25zZVtpXS5uYkNvcnJlY3RBbnN3ZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWR0RVUkFUSU9OIDogcmVzcG9uc2VbaV0uZHVyYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0Fuc3dlcnNDb250ZW50Kz1cIjxsaT5cIityZXBsYWNlQWxsKHR4dEFuc3dlcnMucHJldmlvdXNBbnN3ZXJzTGluZSwgbWFwTGluZUNvbnRlbnQpK1wiPC9saT5cIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtYXBMaW5lQ29udGVudCA9XG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEFWR0RVUkFUSU9OIDogTWF0aC5yb3VuZCh0b3REdXJhdGlvbi9uYlJlc3BvbnNlcyksXG4gICAgICAgICAgICAgICAgICAgICAgICBBVkdDT1JSRUNUQU5TV0VSUyA6IE1hdGgucm91bmQodG90TmJDb3JyZWN0QW5zd2Vycy90b3ROYlF1ZXN0aW9ucyoxMDApXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHByZXZpb3VzQW5zd2Vyc0NvbnRlbnQ9XCI8aDU+XCIrcmVwbGFjZUFsbCh0eHRBbnN3ZXJzLnByZXZpb3VzQW5zd2Vyc1N0YXRzLCBtYXBMaW5lQ29udGVudCkrXCI8L2g1PlwiK3ByZXZpb3VzQW5zd2Vyc0NvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZXhwbGFuYXRpb25zQ29udGVudCwgXCJ1bFwiLCBwcmV2aW91c0Fuc3dlcnNDb250ZW50KTtcbiAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgdHh0LnNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgeGhyUHJldmlvdXNSZXMuc2V0UmVxdWVzdEhlYWRlcihcIkF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIrdXNlci50b2tlbik7XG4gICAgeGhyUHJldmlvdXNSZXMuc2VuZCgpO1xufSIsImNvbnN0IGNvbmZpZ0Zyb250RW5kID0gcmVxdWlyZShcIi4uL2NvbmZpZy9nZW5lcmFsXCIpO1xuXG5pbXBvcnQgeyBzYXZlTG9jYWx5IH0gZnJvbSBcIi4vY2xpZW50c3RvcmFnZS5qc1wiO1xuaW1wb3J0IHsgaXNFbXB0eSwgcmVwbGFjZUFsbCB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbmNvbnN0IHR4dCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9sYW5nL1wiK2NvbmZpZ0Zyb250RW5kLmxhbmcrXCIvYW5zd2VyXCIpO1xuXG4vLyBFbnJlZ2lzdHJlbWVudCBjw7R0w6kgY2xpZW50IGR1IGRlcm5pZXIgcsOpc3VsdGF0IMOgIHVuIHF1aXogZW4gYXR0ZW5kYW50IGQnw6p0cmUgY29ubmVjdMOpXG5leHBvcnQgY29uc3Qgc2F2ZUFuc3dlciA9IChhbnN3ZXIpID0+XG57XG4gICAgaWYoIWlzRW1wdHkoYW5zd2VyLmR1cmF0aW9uKSAmJiAhaXNFbXB0eShhbnN3ZXIubmJDb3JyZWN0QW5zd2VycykgJiYgIWlzRW1wdHkoYW5zd2VyLm5iUXVlc3Rpb25zKSAmJiAhaXNFbXB0eShhbnN3ZXIuUXVlc3Rpb25uYWlyZUlkKSlcbiAgICB7XG4gICAgICAgIHNhdmVMb2NhbHkoXCJsYXN0QW5zd2VyXCIsIGFuc3dlcik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBlbHNlXG4gICAgICAgIHJldHVybiBmYWxzZTtcbn1cblxuLy8gUmV0b3VybmUgbGUgdGV4dGUgc3VpdmFudCBsZSBub21icmUgZGUgYm9ubmVzIHLDqXBvbnNlc1xuZXhwb3J0IGNvbnN0IGNoZWNrQW5zd2VyT3VwdXQgPSAoYW5zd2VyKSA9Plxue1xuICAgIGlmKCFpc0VtcHR5KGFuc3dlci5kdXJhdGlvbikgJiYgIWlzRW1wdHkoYW5zd2VyLm5iQ29ycmVjdEFuc3dlcnMpICYmICFpc0VtcHR5KGFuc3dlci5uYlF1ZXN0aW9ucykpXG4gICAge1xuICAgICAgICBjb25zdCByYXRpbz1hbnN3ZXIubmJDb3JyZWN0QW5zd2Vycy9hbnN3ZXIubmJRdWVzdGlvbnM7XG4gICAgICAgIGNvbnN0IG1hcE9iaj1cbiAgICAgICAge1xuICAgICAgICAgICAgRFVSQVRJT046IGFuc3dlci5kdXJhdGlvbixcbiAgICAgICAgICAgIE5CQ09SUkVDVEFOU1dFUlM6IGFuc3dlci5uYkNvcnJlY3RBbnN3ZXJzLFxuICAgICAgICAgICAgTkJRVUVTVElPTlM6IGFuc3dlci5uYlF1ZXN0aW9uc1xuICAgICAgICB9XG4gICAgICAgIGxldCBvdXRwdXQ9XCJcIjtcbiAgICAgICAgaWYocmF0aW8gPCAwLjQpXG4gICAgICAgICAgICBvdXRwdXQ9cmVwbGFjZUFsbCh0eHQuY2hlY2tSZXNwb25zZXNPdXB1dEZhaWwsIG1hcE9iaik7XG4gICAgICAgIGVsc2UgaWYocmF0aW8gPCAwLjgpXG4gICAgICAgICAgICBvdXRwdXQ9cmVwbGFjZUFsbCh0eHQuY2hlY2tSZXNwb25zZXNPdXB1dE1lZGl1bSwgbWFwT2JqKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgb3V0cHV0PXJlcGxhY2VBbGwodHh0LmNoZWNrUmVzcG9uc2VzT3VwdXRTdWNjZXNzLCBtYXBPYmopO1xuICAgICAgICBpZihvdXRwdXQpXG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gXCJcIjtcbn1cblxuLypcbmV4cG9ydCBjb25zdCBjaGVja1Nlc3Npb24gPSBhc3luYyAoY29uZmlnKSA9Plxue1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuICAgIHtcbiAgICAgICAgaWYoaXNFbXB0eShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInVzZXJcIikpKVxuICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgdXNlcj1KU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwidXNlclwiKSk7XG4gICAgICAgICAgICBpZih1c2VyLmR1cmF0aW9uPT09dW5kZWZpbmVkIHx8IHVzZXIuZHVyYXRpb24gPCBEYXRlLm5vdygpKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBjb25maWdGcm9udEVuZC5hcGlVcmwrY29uZmlnLnVzZXJSb3V0ZXMrY29uZmlnLmNoZWNrTG9naW5Sb3V0ZSt1c2VyLnRva2VuKTtcbiAgICAgICAgICAgICAgICB4aHIub25sb2FkID0gKCkgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwICYmIHJlc3BvbnNlLmlzVmFsaWQgJiYgcmVzcG9uc2UuaWQgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5pZD09PXVzZXIuaWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB4aHIub25lcnJvciA9ICgpID0+IHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICAgICAgICAgICAgeGhyLnNlbmQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufSovIiwiLy8gRk9OQ1RJT05TIFVUSUxFUyBBVSBTVE9DS0FHRSBMT0NBTCAoU0VTU0lPTiwgQ09PS0lFUywgSU5ERVhEQiwgRVRDLilcbi8vIFJldmVuaXIgcG91ciBnw6lyZXIgbGUgY2FzIG/DuSBsb2NhbC5zdG9yYWdlIG4nZXN0IHBhcyBjb25udSBwb3VyIHV0aWxpc2VyIGNvb2tpZVxuICAgIFxuZXhwb3J0IGNvbnN0IHNhdmVMb2NhbHkgPSAobmFtZSwgZGF0YSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShuYW1lLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2NhbHkgPSAobmFtZSwganNvbj1mYWxzZSkgPT5cbntcbiAgICBpZihqc29uKVxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKSk7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSk7XG59XG5cbmV4cG9ydCBjb25zdCByZW1vdmVMb2NhbHkgPSAobmFtZSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShuYW1lKTtcbn0iLCJpbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gRm9uY3Rpb24gYXNzb2NpYW50IGxlcyBhdHRyaWJ1dHMgZm91cm5pcyDDoCB1biBjaGFtcCBkZSBmb3JtdWxhaXJlXG5leHBvcnQgY29uc3QgYWRkRWxlbWVudCA9IChlbHRQYXJlbnQsIGVsdFR5cGUsIGVsdENvbnRlbnQ9XCJcIiwgZWx0SWQ9XCJcIiwgZWx0Q2xhc3M9W10sIGVsdEF0dHJpYnV0ZXM9e30sIHJlcGxhY2U9dHJ1ZSkgPT5cbntcbiAgICBpZihpc0VtcHR5KGVsdFR5cGUpIHx8IGlzRW1wdHkoZWx0UGFyZW50KSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGVsc2VcbiAgICB7XG4gICAgICAgIGNvbnN0IG5ld0VsZW1lbnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlbHRUeXBlKTtcbiAgICAgICAgXG4gICAgICAgIGlmKCFpc0VtcHR5KGVsdElkKSkvLyB0ZXN0ZXIgc2kgbCdpZCBuJ2VzdCBwYXMgZMOpasOgIHV0aWxpc8OpIGRhbnMgbGUgRE9NID9cbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaWQ9ZWx0SWQ7XG5cbiAgICAgICAgaWYoQXJyYXkuaXNBcnJheShlbHRDbGFzcykgJiYgZWx0Q2xhc3MubGVuZ3RoIT0wKVxuICAgICAgICB7XG4gICAgICAgICAgICBmb3IobGV0IGkgaW4gZWx0Q2xhc3MpXG4gICAgICAgICAgICAgICAgbmV3RWxlbWVudC5jbGFzc0xpc3QuYWRkKGVsdENsYXNzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHR5cGVvZiBlbHRBdHRyaWJ1dGVzID09PSBcIm9iamVjdFwiKSAvLyAhISB0b3VzIGxlcyBvYmpldHMgbmUgc29udCBwYXMgb2tcbiAgICAgICAge1xuICAgICAgICAgICAgZm9yKGxldCBhdHRyaWJ1dE5hbWUgaW4gZWx0QXR0cmlidXRlcylcbiAgICAgICAgICAgICAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dE5hbWUsIGVsdEF0dHJpYnV0ZXNbYXR0cmlidXROYW1lXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZighaXNFbXB0eShlbHRDb250ZW50KSlcbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaW5uZXJIVE1MPWVsdENvbnRlbnQucmVwbGFjZSgvXFxuL2csXCI8YnI+XCIpOy8vIGlubmVySFRNTCBwZXJtZXQgZCdham91dGVyIGR1IHRleHRlIGF5YW50IGx1aS1tw6ptZSBkZXMgYmFsaXNlcywgZXRjLlxuICAgICAgICAgICAgXG4gICAgICAgIGlmKHJlcGxhY2UpXG4gICAgICAgICAgICBlbHRQYXJlbnQuaW5uZXJIVE1MPVwiXCI7XG4gICAgICAgIGVsdFBhcmVudC5hcHBlbmRDaGlsZChuZXdFbGVtZW50KTtcbiAgICB9ICAgIFxufSIsIi8vIENlIHNjcmlwdCBmb3Vybml0IGRlcyBmb25jdGlvbnMgdXRpbGlzw6llcyBzdXIgdG91dGVzIGxlcyBwYWdlcyBkdSBzaXRlXG5cbmV4cG9ydCBjb25zdCBoZWxsb0RldiA9ICgpID0+XG57XG4gICAgY29uc29sZS5sb2coXCIqKioqIEhlbGxvIGFtaSBkw6l2ZWxvcHBldXIgOi0pXFxuIExlIGNvZGUgZGUgV2lraUxlcm5pIGVzdCBsaWJyZSBldCBlc3QgbGlzaWJsZSBzdXIgZ2l0bGFiIDogXFxuIEJvbm5lIGxlY3R1cmUgOi0pIFxcbiBQb3VyIGxlcyBzdWdnZXN0aW9ucyBkJ2Ftw6lsaW9yYXRpb24gb3UgcXVlc3Rpb25zIDogZGV2QHdpbGlsZXJuaS5jb20gKioqKlwiKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn0iLCJpbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gRm9uY3Rpb24gYXNzb2NpYW50IGxlcyBhdHRyaWJ1dHMgZm91cm5pcyDDoCB1biBjaGFtcCBkZSBmb3JtdWxhaXJlXG5leHBvcnQgY29uc3Qgc2V0QXR0cmlidXRlc1RvSW5wdXRzID0gKGlucHV0c0NvbmYsIG15Rm9ybSkgPT5cbntcbiAgICBmb3IobGV0IGkgaW4gbXlGb3JtLmVsZW1lbnRzKVxuICAgIHtcbiAgICAgICAgaWYoIWlzRW1wdHkobXlGb3JtLmVsZW1lbnRzW2ldLmlkKSlcbiAgICAgICAge1xuICAgICAgICAgICAgbGV0IGlkSW5wdXQ9bXlGb3JtLmVsZW1lbnRzW2ldLmlkO1xuICAgICAgICAgICAgaWYoaW5wdXRzQ29uZltpZElucHV0XSE9PXVuZGVmaW5lZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5wdXRIVE1MPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkSW5wdXQpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGF0dHJpYnV0ZSBpbiBpbnB1dHNDb25mW2lkSW5wdXRdKVxuICAgICAgICAgICAgICAgICAgICBpbnB1dEhUTUwuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgaW5wdXRzQ29uZltpZElucHV0XVthdHRyaWJ1dGVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gUsOpY3Vww6hyZSB0b3V0ZXMgbGVzIHZhbGV1cnMgZGUgY2hhbXBzIGVuIG9tZXR0YW50IGxlcyBjaGVja2JveCBub24gY29jaMOpZXMsIGV0Yy5cbmV4cG9ydCBjb25zdCBnZXREYXRhc0Zyb21JbnB1dHMgPSAobXlGb3JtKSA9Plxue1xuICAgIGNvbnN0IGRhdGFzPXt9O1xuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKG15Rm9ybSk7XG4gICAgZm9yKGxldCBlbnRyaWUgb2YgZm9ybURhdGEuZW50cmllcygpKVxuICAgICAgIGRhdGFzW2VudHJpZVswXV09ZW50cmllWzFdO1xuICAgIHJldHVybiBkYXRhcztcbn1cblxuLy8gVmlkZSB0b3VzIGxlcyBjaGFtcHMgZCd1biBmb3JtdWxhaXJlLCB5IGNvbXByaXMgaGlkZGVuLCBjaGVja2JveCwgZXRjLlxuLy8gUmV2b2lyIHBvdXIgbGVzIHNlbGVjdFxuZXhwb3J0IGNvbnN0IGVtcHlGb3JtID0gKG15Rm9ybSkgPT5cbntcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShteUZvcm0pO1xuICAgIGZvcihsZXQgZW50cmllIG9mIGZvcm1EYXRhLmVudHJpZXMoKSlcbiAgICB7XG4gICAgICAgIGlmKG15Rm9ybS5lbGVtZW50c1tlbnRyaWVbMF1dLnR5cGU9PVwiY2hlY2tib3hcIiB8fCBteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS50eXBlPT1cInJhZGlvXCIpXG4gICAgICAgICAgICBteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS5jaGVja2VkPWZhbHNlO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS52YWx1ZT1cIlwiO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8vIFZpZGUgZXQgY2FjaGUgbGUgZm9ybXVsYWlyZVxuZXhwb3J0IGNvbnN0IGVtcHlBbmRIaWRlRm9ybSA9IChteUZvcm0pID0+XG57XG4gICAgZW1weUZvcm0obXlGb3JtKTtcbiAgICBteUZvcm0uc3R5bGUuZGlzcGxheT1cIm5vbmVcIjtcbn0iLCJjb25zdCBjb25maWdGcm9udEVuZCA9IHJlcXVpcmUoXCIuLi9jb25maWcvZ2VuZXJhbFwiKTtcblxuaW1wb3J0IHsgZ2V0TG9jYWx5LCByZW1vdmVMb2NhbHksIHNhdmVMb2NhbHkgfSBmcm9tIFwiLi9jbGllbnRzdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gUsOpY3Vww6hyZSBsZXMgZG9ubsOpZXMgZGUgY29uZmlndXJhdGlvbiBkZXMgdXRpbGlzYXRldXJzXG4vLyDDgCB0ZXJtZSwgdW4gZmljaGllciBzdGF0aXF1ZSBpbXBvcnRhYmxlIGNvbW1lIG1vZHVsZSBkZXZyYWl0IMOpdml0ZXIgdW5lIHJlcXXDqnRlIGFqYXhcbmV4cG9ydCBjb25zdCBnZXRDb25maWcgPSAgYXN5bmMgKCkgPT5cbntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBjb25maWdGcm9udEVuZC5hcGlVcmwrY29uZmlnRnJvbnRFbmQudXNlcnNHZXRDb25maWdVcmwpO1xuICAgICAgICB4aHIub25sb2FkID0gKCkgPT4gcmVzb2x2ZShKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpKTtcbiAgICAgICAgeGhyLm9uZXJyb3IgPSAoKSA9PiByZWplY3QoeGhyLnN0YXR1c1RleHQpO1xuICAgICAgICB4aHIuc2VuZCgpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0VGltZURpZmZlcmVuY2UgPSAoY29uZmlnKSA9Plxue1xuICAgIGNvbnN0IHRpbWVMb2NhbD1uZXcgRGF0ZSgpLmdldFRpbWV6b25lT2Zmc2V0KCk7XG4gICAgaWYodGltZUxvY2FsID4gY29uZmlnLnRpbWVEaWZmZXJlbmNlTWF4IHx8IHRpbWVMb2NhbCA8IGNvbmZpZy50aW1lRGlmZmVyZW5jZU1pbilcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgZWxzZSByZXR1cm4gdGltZUxvY2FsO1xufVxuXG4vLyBPbiBlbmzDqHZlIHZvbG9udGFpcmVtZW50IGxlcyAwL08gcG91ciDDqXZpdGVyIGxlcyBjb25mdXNpb25zICFcbi8vIEV0IG1pZXV4IHZhdXQgYXVzc2kgZMOpYnV0ZXIgZXQgZmluaXIgcGFyIHVuZSBsZXR0cmUgc2ltcGxlLlxuZXhwb3J0IGNvbnN0IGdldFBhc3N3b3JkID0gKG5iQ2FyTWluLCBuYkNhck1heCkgPT5cbntcbiAgICBjb25zdCBuYkNhcj1uYkNhck1pbitNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqKG5iQ2FyTWF4LW5iQ2FyTWluKSk7XG4gICAgY29uc3QgbGV0dGVycz1cIkFCQ0RFRkdISUpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbnBxcnN0dXZ3eHl6XCI7XG4gICAgY29uc3Qgb3RoZXJzPVwiMTIzNDU2Nzg5IT8uKi1fJUAmw4nDgMOIw5nigqwkw4LDisObw45cIjtcbiAgICBsZXQgcGFzc3dvcmQ9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICBmb3IobGV0IGk9MTtpPChuYkNhci0xKTtpKyspXG4gICAge1xuICAgICAgICBpZigoaSAlIDIpID09PTEpXG4gICAgICAgICAgICBwYXNzd29yZCs9b3RoZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpvdGhlcnMubGVuZ3RoKV07XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHBhc3N3b3JkKz1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldOyAgIFxuICAgIH1cbiAgICBwYXNzd29yZCs9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICByZXR1cm4gcGFzc3dvcmQ7XG59XG5cbi8vIEondXRpbGlzZSBsZSBzdG9ja2FnZSBsb2NhbCBkdSBuYXZpZ2F0ZXVyIHBvdXIgZW5yZWdpc3RyZXIgbGVzIGRvbm7DqWVzIHBlcm1ldHRhbnQgZGUgcmVjb25uYcOudHJlIGwndXRpbGlzYXRldXIgcGFyIGxhIHN1aXRlXG4vLyBTZXVsIGxlIHNlcnZldXIgcG91cnJhIHbDqXJpZmllciBxdWUgbGVzIGlkZW50aWZpYW50cyBzb250ICh0b3Vqb3VycykgdmFsaWRlcy5cbmV4cG9ydCBjb25zdCBzZXRTZXNzaW9uID0gKHVzZXJJZCwgdG9rZW4sIGR1cmF0aW9uVFMpID0+XG57XG4gICAgY29uc3Qgc3RvcmFnZVVzZXI9XG4gICAge1xuICAgICAgICBpZDogdXNlcklkLFxuICAgICAgICB0b2tlbjogdG9rZW4sXG4gICAgICAgIGR1cmF0aW9uIDogZHVyYXRpb25UU1xuICAgIH1cbiAgICBzYXZlTG9jYWx5KFwidXNlclwiLCBzdG9yYWdlVXNlcik7XG59XG5cbi8vIFbDqXJpZmllIHF1J2lsIHkgYSBkZXMgZG9ubsOpZXMgbG9jYWxlcyBjb25jZXJuYW50IGxlIHLDqXN1bHRhdCBkJ3VuIHF1aXpcbi8vIEV0IGxlcyBham91dGUgYXV4IGRvbm7DqWVzIGVudm95w6llcyBwYXIgbGVzIGZvcm11bGFpcmVzIGQnaW5zY3JpcHRpb24vY29ubmV4aW9uIHNpIGMnZXN0IGxlIGNhc1xuZXhwb3J0IGNvbnN0IGNoZWNrQW5zd2VyRGF0YXMgPSAoZGF0YXMpID0+XG57XG4gICAgY29uc3QgbGFzdEFuc3dlcj1nZXRMb2NhbHkoXCJsYXN0QW5zd2VyXCIpO1xuICAgIGlmKCFpc0VtcHR5KGxhc3RBbnN3ZXIpKVxuICAgIHtcbiAgICAgICAgY29uc3QgYW5zd2VyPUpTT04ucGFyc2UobGFzdEFuc3dlcik7XG4gICAgICAgIGlmKCFpc0VtcHR5KGFuc3dlci5kdXJhdGlvbikgJiYgIWlzRW1wdHkoYW5zd2VyLm5iQ29ycmVjdEFuc3dlcnMpICYmICFpc0VtcHR5KGFuc3dlci5RdWVzdGlvbm5haXJlSWQpICYmICFpc0VtcHR5KGFuc3dlci5uYlF1ZXN0aW9ucykpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRhdGFzLmR1cmF0aW9uPWFuc3dlci5kdXJhdGlvbjtcbiAgICAgICAgICAgIGRhdGFzLm5iQ29ycmVjdEFuc3dlcnM9YW5zd2VyLm5iQ29ycmVjdEFuc3dlcnM7XG4gICAgICAgICAgICBkYXRhcy5RdWVzdGlvbm5haXJlSWQ9YW5zd2VyLlF1ZXN0aW9ubmFpcmVJZDtcbiAgICAgICAgICAgIGRhdGFzLm5iUXVlc3Rpb25zPWFuc3dlci5uYlF1ZXN0aW9ucztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YXM7XG59XG5cbi8vIENldHRlIGZvbmN0aW9uIHRlc3RlIGxhIGNvbm5leGlvbiBkZSBsJ3V0aWxpc2F0ZXVyIGQndW5lIHBhZ2Vcbi8vIE9uIHBldXQgZm91cm5pcyB1bmUgbGlzdGUgZGUgc3RhdHV0cyBhY2NlcHTDqXMgKHNpIHZpZGUgPSB0b3VzKSwgYWluc2kgcXUndW5lIHVybCBkZSByZWRpcmVjdGlvbiBzaSBub24gY29ubmVjdMOpLCB1biBtZXNzYWdlIGQnZXJyZXVyIMOgIGFmZmljaGVyIHN1ciBsYSBwYWdlIGRlIGRlc3RpbmF0aW9uIGV0IGwndXJsIHN1ciBsYXF1ZWxsZSByZXZlbmlyIHVuZSBmb2lzIGNvbm5lY3TDqVxuZXhwb3J0IGNvbnN0IGNoZWNrU2Vzc2lvbiA9IGFzeW5jIChjb25maWcsIHN0YXR1cz1bXSwgdXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCkgPT5cbntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IHVzZXJEYXRhcz1nZXRMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICBpZihpc0VtcHR5KHVzZXJEYXRhcykpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgdXNlcj1KU09OLnBhcnNlKHVzZXJEYXRhcyk7XG4gICAgICAgICAgICBpZihpc0VtcHR5KHVzZXIuaWQpIHx8wqBpc0VtcHR5KHVzZXIudG9rZW4pIHx8IGlzRW1wdHkodXNlci5kdXJhdGlvbikgfHwgdXNlci5kdXJhdGlvbiA8IERhdGUubm93KCkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgY29uZmlnRnJvbnRFbmQuYXBpVXJsK2NvbmZpZy51c2VyUm91dGVzK2NvbmZpZy5jaGVja0xvZ2luUm91dGUrdXNlci50b2tlbik7XG4gICAgICAgICAgICAgICAgeGhyLm9ubG9hZCA9ICgpID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDIwMCAmJiByZXNwb25zZS5pc1ZhbGlkICYmIHJlc3BvbnNlLmlkICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2UuaWQ9PT11c2VyLmlkKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIubmFtZT1yZXNwb25zZS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIubGFuZ3VhZ2U9cmVzcG9uc2UubGFuZ3VhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci50aW1lRGlmZmVyZW5jZT1yZXNwb25zZS50aW1lRGlmZmVyZW5jZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnN0YXR1cz1yZXNwb25zZS5zdGF0dXM7Ly8gbGUgdG9rZW4gZXQgZGUgdG91dGUgZmHDp29uIHbDqXJpZmllciDDoCBjaGFxdWUgcmVxdcOqdGUgw6AgbCdBUElcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlTG9jYWx5KFwidXNlclwiLCB1c2VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaSBpbCBzJ2FnaXQgZCd1biBcInVzZXJcIiBldCBxdWUgc29uIGFib25uZW1lbnQgYSBleHBpcsOpLCBqZSBsZSByZWRpcmlnZSB2ZXJzIGxhIGNhaXNzZSA6LSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5zdGF0dXM9PT1cInVzZXJcIiAmJiByZXNwb25zZS5uYkRheXNPayA8PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsQWNjb3VudD1jb25maWcuc2l0ZVVybCtcIi9cIitjb25maWdGcm9udEVuZC5hY2NvdW50UGFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZih1cmxBY2NvdW50KT09PS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIi9cIitjb25maWdGcm9udEVuZC5hY2NvdW50UGFnZSk7Ly8gcGFzc8OpZSBkaXJlY3RlbWVudCBpY2ksIGwnYW5jcmUgI3N1YnNjcmliZSBuZSBmb25jdGlvbm5lIHBhcyAhP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzdGF0dXMubGVuZ3RoIT09MCAmJiBzdGF0dXMuaW5kZXhPZihyZXNwb25zZS5zdGF0dXMpPT09LTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHhoci5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICAgICAgICAgICAgICB4aHIuc2VuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4vLyBDZXR0ZSBmb25jdGlvbiBzZXJ0IMOgIGxhIHByw6ljw6lkZW50ZSBlbiBjYXMgZGUgY29ubmV4aW9uIG5vbiB2YWxpZGVcbmNvbnN0IHJlZGlyZWN0VXNlciA9ICh1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKSA9Plxue1xuICAgIGlmKCFpc0VtcHR5KG1lc3NhZ2UpKVxuICAgICAgICBzYXZlTG9jYWx5KFwibWVzc2FnZVwiLCBtZXNzYWdlKTtcbiAgICBpZighaXNFbXB0eSh1cmxXYW50ZWQpKVxuICAgICAgICBzYXZlTG9jYWx5KFwidXJsXCIsIHVybFdhbnRlZCk7XG4gICAgaWYoIWlzRW1wdHkodXJsUmVkaXJlY3Rpb24pKVxuICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKHVybFJlZGlyZWN0aW9uKTtcbn0iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/front/public/JS/subscribe.app.js b/front/public/JS/subscribe.app.js new file mode 100644 index 0000000..bc84789 --- /dev/null +++ b/front/public/JS/subscribe.app.js @@ -0,0 +1,1328 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "./src/subscribe.js"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "../config/instance.js": +/*!*****************************!*\ + !*** ../config/instance.js ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var _module$exports; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var users = __webpack_require__(/*! ./users */ "../config/users.js"); + +var questionnaires = __webpack_require__(/*! ./questionnaires */ "../config/questionnaires.js"); + +module.exports = (_module$exports = { + apiUrl: "http://localhost:3000/api", + siteUrl: "http://localhost:8080", + adminName: "Fabrice", + adminEmail: "dev@wikilerni.com", + senderName: "WikiLerni", + senderEmail: "bonjour@wikilerni.com", + adminLang: "fr", + theme: "default", + // le thème utilisé (dans /views) pour générer les pages HTML. Contient ses propres fichiers de configuration. + availableLangs: ["fr"], + // Languages in which the site is available. The first one is the default one. + siteName: "WikiLerni", + beginCodeGodfather: "wikilerni", + // case-sensitive and can't contain "@" ! + cronTimingAlertInSeconde: 120, + // for logs + responseTimingAlertInSeconde: 3, + // idem + tokenSignupValidationTimeInHours: "48h", + // https://github.com/zeit/ms + tokenLoginLinkTimeInHours: "1h", + tokenConnexionMinTimeInHours: "24h", + tokenConnexionMaxTimeInDays: "180 days", + tokenLoginChangingTimeInHours: "1h", + // for email & password changing + tokenDeleteUserTimeInHours: "1h", + tokenUnsubscribeLinkTimeInDays: "7 days", + // token send with subscription's emails + freeAccountTimingInDays: 10, + freeAccountExpirationNotificationInDays: 5, + accountExpirationFirstNotificationInDays: 14, + accountExpirationSecondNotificationInDays: 5, + inactiveAccountTimeToDeleteInDays: 180, + // Questionnaires: + nbQuestionsMin: 1, + // minimum number of questions for the questionnaire to be publishable + nbQuestionsMax: 10, + // if 0 = not maximum + nbChoicesMax: 10, + nbNewQuestionnaires: 10, + // for RSS, etc. + hourGiveNewQuestionnaireBegin: 1, + // in user local time + hourGiveNewQuestionnaireEnd: 24, + // idem + numberNewQuestionnaireAtSameTime: 50, + // for mass mailing + minSearchQuestionnaires: 3, + // Illustrations: + nbIllustrationsMin: 0, + nbIllustrationsMax: 1, + maxIllustrationSizeinOctet: 1000000, + // pas contrôlé pour l'instant. À revoir. + mimeTypesForIllustration: ["image/jpg", "image/jpeg", "image/png", "image/gif", "image/png"], + // -- Upload and resize: + illustrationsWidthMaxInPx: 400, + illustrationsMiniaturesWidthMaxInPx: 200, + // Links: + nbLinksMin: 1, + nbLinksMax: 1 +}, _defineProperty(_module$exports, "nbQuestionsMin", questionnaires.nbQuestionsMin), _defineProperty(_module$exports, "nbQuestionsMax", questionnaires.nbQuestionsMax), _defineProperty(_module$exports, "nbChoicesMax", questionnaires.nbChoicesMax), _defineProperty(_module$exports, "passwordMinLength", users.password.minlength), _defineProperty(_module$exports, "dirCacheUsers", users.dirCacheUsers), _defineProperty(_module$exports, "dirCacheUsersAnswers", users.dirCacheUsersAnswers), _defineProperty(_module$exports, "dirCacheQuestionnaires", questionnaires.dirCacheQuestionnaires), _defineProperty(_module$exports, "dirCacheQuestions", questionnaires.dirCacheQuestions), _defineProperty(_module$exports, "dirCacheUsersQuestionnaires", questionnaires.dirCacheUsersQuestionnaires), _defineProperty(_module$exports, "dirHTMLQuestionnaire", questionnaires.dirHTMLQuestionnaire), _defineProperty(_module$exports, "dirWebQuestionnaire", questionnaires.dirWebQuestionnaire), _module$exports); + +/***/ }), + +/***/ "../config/questionnaires.js": +/*!***********************************!*\ + !*** ../config/questionnaires.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + // API'routes (after "apiUrl" defined in instance.js) + questionnaireRoutes: "/questionnaire", + getQuestionnaireRoutes: "/get", + previewQuestionnaireRoutes: "/preview", + publishedQuestionnaireRoutes: "/quiz/", + saveAnswersRoute: "/answer/", + getStatsQuestionnaires: "/stats/", + searchQuestionnairesRoute: "/search", + searchAdminQuestionnairesRoute: "/searchadmin", + getListNextQuestionnaires: "/getlistnextquestionnaires/", + // -- questions & choices : + questionsRoute: "/question/", + // -- tags : + tagsSearchRoute: "/tags/search/", + // -- answers : + getQuestionnairesWithoutAnswer: "/withoutanswer/user/", + getPreviousAnswers: "/user/answers/", + getStatsAnswers: "/user/anwswers/stats/", + getAdminStats: "/getadminstats/", + // forms : à compléter avec valeurs par défaut, etc. cf modèle + Questionnaire: { + title: { + maxlength: 255, + required: true + }, + slug: { + maxlength: 150 + }, + // champ requis mais calculé à partir du titre qd vide + introduction: { + required: true + } + }, + searchQuestionnaires: { + minlength: 3, + required: true + }, + Question: { + text: { + maxlength: 255, + required: true + }, + rank: { + required: true, + min: 1, + defaultValue: 1 + } + }, + Choice: { + text: { + maxlength: 255, + required: true + } + }, + nbQuestionsMin: 1, + nbQuestionsMax: 10, + nbChoicesMax: 10, + nbTagsMin: 0, + nbTagsMax: 0, + // 0 = not max + // JSON and HTML dir + dirCacheQuestionnaires: "datas/questionnaires", + dirCacheQuestions: "datas/questionnaires/questions", + dirCacheUsersQuestionnaires: "datas/users/questionnaires", + dirCacheTags: "datas/questionnaires/tags", + dirHTMLQuestionnaire: "front/public/quiz", + dirHTMLTags: "front/public/quizs", + dirWebQuestionnaire: "quiz", + //pour url page + dirWebTags: "quizs" // idem + +}; + +/***/ }), + +/***/ "../config/users.js": +/*!**************************!*\ + !*** ../config/users.js ***! + \**************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + // API'routes (after "apiUrl" defined in instance.js) + userRoutes: "/user", + subscribeRoute: "/signup", + getGodfatherRoute: "/getgodfatherid", + checkIfIsEmailfreeRoute: "/isemailfree", + checkSubscribeTokenRoute: "/validation/", + checkLoginRoute: "/checklogin/", + connectionRoute: "/login", + getLoginLinkRoute: "/getloginlink", + connectionWithLinkRoute: "/checkloginlink", + getUserInfos: "/get/", + createUserRoute: "/create", + validateUserRoute: "/validate/", + updateUserInfos: "/modify/", + searchUserRoute: "/search/", + getGodChilds: "/getgodchilds/", + checkNewLoginLinkRoute: "/confirmnewlogin/", + checkDeleteLinkRoute: "/confirmdelete/", + getPayments: "/payment/getforoneuser/", + unsubscribeRoute: "/subscription/stop/", + getAdminStats: "/getadminstats/", + // forms : à compléter avec valeurs par défaut, etc. cf modèle + name: { + maxlength: 70, + required: true + }, + email: { + maxlength: 255, + required: true + }, + password: { + minlength: 8, + maxlength: 72, + required: true + }, + // https://www.npmjs.com/package/bcrypt#security-issues-and-concerns + newPassword: { + minlength: 8, + maxlength: 72 + }, + codeGodfather: { + maxlength: 255 + }, + cguOk: { + value: "true", + required: true + }, + timeDifferenceMin: -720, + timeDifferenceMax: 840, + // JSON dir + dirCacheUsers: "datas/users", + dirCacheUsersAnswers: "datas/users/questionnaires/answers" +}; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/general$": +/*!**************************************!*\ + !*** ../lang sync ^\.\/.*\/general$ ***! + \**************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/general": "../lang/fr/general.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/general$"; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/user$": +/*!***********************************!*\ + !*** ../lang sync ^\.\/.*\/user$ ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/user": "../lang/fr/user.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/user$"; + +/***/ }), + +/***/ "../lang/fr/general.js": +/*!*****************************!*\ + !*** ../lang/fr/general.js ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + siteHTMLTitle: "WikiLerni : qu'allez-vous apprendre aujourd'hui ?", + siteMetaDescription: "Chaque jour, testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.", + scriptTimingInfo: "Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", + scriptTimingAlert: "*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", + serverError: "Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.", + serverErrorAdmin: "Bug de l'application :", + neededParams: "Des paramètres nécessaires manquants sont manquants.", + badUrl: "Tentative d'accès à une page n'existant pas :", + notValidFormat: "Format non valide.", + notAllowed: "Vous n'avez pas les droits nécessaires pour cette action.", + notRequired: "Facultatif.", + updateBtnTxt: "Modifier", + addBtnTxt: "Ajouter", + deleteBtnTxt: "Supprimer", + addOkMessage: "Les données ont bien été enregistrées.", + updateOkMessage: "La mise à jour à jour a bien été enregistrée.", + deleteOkMessage: "La suppression a bien été enregistrée.", + failAuth: "Erreur d'authentification.", + failAuthHeader: "Absence de header Authorization.", + failAuthToken: "Token invalide ou utilisateur non trouvé.", + failAuthId: "Identifiant non valide : ", + failAuthCron: "Tentative de lancement d'un cron sans le bon token.", + previousPage: "Page précédente", + nextPage: "Page suivante", + btnLinkToQuestionnaire: "Aller au quiz !", + statsAdmin: "Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
    En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
    Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium." +}; + +/***/ }), + +/***/ "../lang/fr/user.js": +/*!**************************!*\ + !*** ../lang/fr/user.js ***! + \**************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + notFound: "L'utilisateur n'a pas été trouvé.", + needName: "Merci de choisir un nom d'utilisateur.", + needNotTooLongName: "Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.", + needEmail: "Merci de saisir votre adresse e-mail.", + needUniqueEmail: "L'adresse e-mail que vous avez saisie est déjà utilisée par un autre utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.", + needNotTooLongEmail: "Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.", + needPassWord: "Merci de fournir un mot de passe.", + needLongPassWord: "Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.", + passwordCopied: "Le mot de passe généré a été copié dans le presse-papier. Vous pouvez le recopier où vous le souhaiter.", + needStatus: "Il manque le statut.", + needLanguage: "Il manque le code langue.", + needValidLastConnectionDate: "La date de dernière connexion n'est pas valide.", + needSMTP: "Il manque le serveur SMTP.", + needSMTPNotFound: "Il manque le serveur SMTP.", + needKnowNewsletterOk: "Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.", + needTimeDifference: "Il faut connaître le nombre de minutes du décalage horaire.", + needMinTimeDifference: "Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.", + needMaxTimeDifference: "Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.", + needUGCOk: "Vous devez accepter les CGU pour pouvoir créer votre compte. ", + godfatherNotFound: "Aucun utilisateur valide trouvé pour ce code parrain.", + godfatherFound: "Votre parrain a bien été trouvé !", + mailValidationMessage: "Votre inscription est bien enregistrée.\nPour la finaliser, merci de cliquer dans les 24H sur le lien de confirmation qui vient de vous être envoyé par e-mail.", + mailValidationLinkSubject: "Merci de valider votre compte", + mailValidationLinkSBodyTxt: "Bonjour USER_NAME,\n\nPour valider votre compte, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL", + mailValidationLinkSBodyHTML: "

    Bonjour USER_NAME,

    Pour valider votre compte, merci de cliquer sur le lien suivant dans les 24h.

    Valider.

    ", + validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue !
    Vous pouvez sans tarder vous connecter ci-dessous pour accéder à votre compte.", + validationMessageAdmin: "Le compte a bien été validé.", + validationAlreadyMessage: "Il semble que vous ayez déjà validé votre compte.", + validationAlreadyMessageAdmin: "Ce compte a déjà été validé.", + mailWelcomeSubject: "Bienvenue !", + mailWelcomeBodyTxt: "Bonjour USER_NAME,\nVotre venez de valider votre inscription à NOM_SITE.\nMerci et à bientôt !", + mailWelcomeBodyHTML: "

    Bonjour USER_NAME,

    Votre venez de valider votre inscription à NOM_SITE.

    Merci et à bientôt !

    ", + mailThankGodfatherSubject: "Merci !", + mailThankGodfatherBodyTxt: "Bonjour USER_NAME,\nGrâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nMerci et à bientôt !", + mailThankGodfatherBodyHTML: "

    Bonjour USER_NAME,

    Grâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.

    Merci et à bientôt !

    ", + badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.", + emailNotFound: "Aucun utilisateur trouvé pour cette adresse e-mail.", + alreadyConnected: "Vous êtes déjà connecté(e) au site !", + needBeConnected: "Vous devez être connecté(e) pour accéder à cette page.", + connectionOk: "Connexion réussie.", + needChooseLoginWay: "Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.", + needValidationToLogin: "Vous devez d'abord valider votre compte avant de vous connecter. Pour ce faire, un lien vient de vous être envoyé par e-mail.", + tooManyLoginFails: "Trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.", + badPassword: "Le mot de passe n'est pas le bon.", + mailLoginLinkSubject: "Votre lien de connexion.", + mailLoginLinkBodyTxt: "Bonjour USER_NAME,\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : LINK_URL", + mailLoginLinkBodyHTML: "

    Bonjour USER_NAME,

    Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :

    Valider.

    ", + mailLoginLinkMessage: "Un lien de connexion vient de vous être envoyé sur votre adresse e-mail. Ne tardez pas à l'utiliser, car il n'est valable que durant ", + updatedOkMessage: "Vos informations ont bien été mises à jour.", + updatedNeedGoodEmail: "Mais la nouvelle adresse e-mail n'a pu être enregistrée car elle n'a pas une format correct.", + updatedNeedUniqueEmail: "Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.", + mailUpdateLoginSubject: "Merci de valider vos nouveaux identifiants.", + mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL", + mailUpdateLoginBodyHTML: "

    Bonjour USER_NAME,

    Pour valider vos nouveaux identifiants de connexion, cliquez ici sans tarder.

    ", + mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (email et/ou mot de passe) et vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement. En attendant, merci de continuer à utiliser vos anciens identifiants.", + updatedNeedValidatedUser: "L'utilisateur que vous souhaité modifier n'existe pas/plus ou n'a pas encore validé son compte.", + updatedNeedGoodGodfather: "Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.", + mailUpdateLoginOkMessage: "La mise à jour de vos identifiants a bien été enregistrée.", + updatedFailedGodfatherNotFound: "L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.", + creationOkMessage: "Le nouvel utilisateur a bien été enregistré.", + mailDeleteSubject: "Confirmer la suppression de votre compte.", + mailDeleteBodyTxt: "Bonjour USER_NAME,\nPour valider la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL", + mailDeleteBodyHTML: "

    Bonjour USER_NAME,

    Pour valider la suppression de votre compte, cliquez ici sans tarder.

    ", + mailDeleteLinkMessage: "Votre demande de suppression a bien été enregistrée. Merci de cliquer sans tarder sur le lien qui vient de vous être envoyé par e-mail pour confirmer.", + deleteOkMessage: "L'utilisateur a bien été supprimé.", + deleteFailMessage: "Tentative de suppression d'un utilisateur inexistant : ", + mailDeleteLinkOkMessage: "Votre compte a bien été supprimé. Merci d'avoir utilisé nos services.", + mailDeleteLinkAlreadyMessage: "Il semble que vous ayez déjà validé la suppression de votre compte.", + mailDeleteLinkFailMessage: "Votre lien de suppression n'est pas valide ou alors il n'est plus valable.", + cronDeleteUnvalidedUsersMessage: " comptes utilisateurs non validés ont été supprimés.", + deleteInactiveUsersMessage: " comptes utilisateurs inactifs ont été supprimés.", + welcomeMessage: "Bienvenue #NAME !", + byebyeMessage: "Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
    À bientôt !", + infosUserForAdmin: "Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
    Date de sa dernière connexion : DATE_CONNECTION.", + infosAdminGodfather: "Cet utilisateur a été parrainé par ", + infosAdminNbGodChilds: "Ses #NB filleuils : " +}; + +/***/ }), + +/***/ "../tools/main.js": +/*!************************!*\ + !*** ../tools/main.js ***! + \************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +// Quelques fonctions utiles pour les chaînes +var Tool = /*#__PURE__*/function () { + function Tool() { + _classCallCheck(this, Tool); + } + + _createClass(Tool, null, [{ + key: "isEmpty", + value: function isEmpty(myVar) { + if (myVar === undefined || myVar === null) return true;else { + myVar += ""; // si autre chose qu'une chaîne envoyé... + + myVar = myVar.trim(); + if (myVar === "") return true;else return false; + } + } + }, { + key: "trimIfNotNull", + value: function trimIfNotNull(myString) { + if (Tool.isEmpty(myString)) myString = null;else { + myString += ""; // si autre chose qu'une chaîne envoyé... + + myString = myString.trim(); + } + return myString; + } + }, { + key: "shortenIfLongerThan", + value: function shortenIfLongerThan(myString, max) { + myString += ""; // au cas où cela ne serait pas une chaîne... + + if (myString.length > max) myString = myString.substring(0, max - 3) + "..."; + return myString; + } // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings + + }, { + key: "replaceAll", + value: function replaceAll(myString, mapObj) { + var replaceElts = new RegExp(Object.keys(mapObj).join("|"), "gi"); + return myString.replace(replaceElts, function (matched) { + return mapObj[matched]; + }); + } // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random + + }, { + key: "getRandomInt", + value: function getRandomInt(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min)) + min; + } // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country + + }, { + key: "dateFormat", + value: function dateFormat(dateString) { + var lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "fr"; + if (Tool.isEmpty(dateString)) return ""; + var myDate = new Date(dateString); + var myDay = myDate.getDate() + ""; + if (myDay.length === 1) myDay = "0" + myDay; + var myMounth = myDate.getMonth() + 1 + ""; + if (myMounth.length === 1) myMounth = "0" + myMounth; + var myYear = myDate.getFullYear(); + if (lang === "fr") return myDay + "/" + myMounth + "/" + myYear;else if (lang === "form") // 2014-02-09 + return myYear + "-" + myMounth + "-" + myDay;else return myMounth + "/" + myDay + "/" + myYear; + } + }]); + + return Tool; +}(); + +module.exports = Tool; + +/***/ }), + +/***/ "../views sync recursive ^\\.\\/.*\\.js$": +/*!**********************************!*\ + !*** ../views sync ^\.\/.*\.js$ ***! + \**********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./default/config/fr.js": "../views/default/config/fr.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../views sync recursive ^\\.\\/.*\\.js$"; + +/***/ }), + +/***/ "../views/default/config/fr.js": +/*!*************************************!*\ + !*** ../views/default/config/fr.js ***! + \*************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + headLinks: [{ + anchor: "Accueil", + attributes: { + href: "/" + } + }, { + anchor: "Mon compte", + attributes: { + href: "/connexion.hmt", + id: "accountHeadLink" + } + }, { + anchor: "À propos", + attributes: { + href: "/a-propos.html" + } + }, { + anchor: "Contact", + attributes: { + href: "/contact.html" + } + }], + footLinks: [{ + anchor: "Crédits", + attributes: { + href: "/credits.html" + } + }, { + anchor: "Mentions légales", + attributes: { + href: "/mentions-legales.html", + rel: "nofollow" + } + }, { + anchor: "Données personnelles", + attributes: { + href: "/donnees.html" + } + }, { + anchor: "C.G.U.", + attributes: { + href: "/cgu.html", + rel: "nofollow" + } + }, { + anchor: "C.G.V.", + attributes: { + href: "/cgv.html", + rel: "nofollow" + } + }], + maxQuestionnairesByPage: 10, + userHomePage: "accueil.html", + adminHomePage: "admin.html", + managerHomePage: "gestion.html", + subscribePage: "inscription.html", + connectionPage: "connexion.html", + accountPage: "compte.html", + questionnairesManagementPage: "gestion-quizs.html", + usersManagementPage: "gestion-utilisateurs.html", + nbQuestionnairesUserHomePage: 10, + illustrationDir: "/img/quizs/", + siteSlogan: "Cultivons notre jardin !", + homeTitle1: "De nature curieuse ?", + homeP1: "Avec WikiLerni vous apprenez chaque jour de nouvelles choses.
    Des articles de Wikipédia sont sélectionnés pour vous et sont suivis d'un quiz vous permettant de tester ce que vous en avez retenu.
    De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre \"jardin\".", + homeTitle2: "La culture en liberté", + homeP2: "Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
    Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
    Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
    Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.

    (*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.", + newQuestionnairesTitle: "Les derniers quizs publiés sur WikiLerni", + newQuestionnairesIntro: "Liste des derniers quizs publiés sur WikiLerni.", + explanationTitle: "Vous découvrez WikiLerni ?", + explanationTxt: "Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
    Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.

    Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.

    Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)

    Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
    Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.

    Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.", + noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript." +}; + +/***/ }), + +/***/ "./src/subscribe.js": +/*!**************************!*\ + !*** ./src/subscribe.js ***! + \**************************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ "../config/instance.js"); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js"); +/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js"); +/* harmony import */ var _tools_forms_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/forms.js */ "./src/tools/forms.js"); +/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./tools/users.js */ "./src/tools/users.js"); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + +// -- GESTION DU FORMULAIRE PERMETTANT DE CRÉER SON COMPTE +/// L'utilisateur peut avoir répondu à un quiz avant d'arriver sur la page d'inscription +/// Des ce cas il faut enregistrer son résultat en même temps que les informations de son compte +// Fichier de configuration tirés du backend : + +var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0]; + +var configTemplate = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); + +var configUsers = __webpack_require__(/*! ../../config/users */ "../config/users.js"); // Importation des fonctions utile au script : + + + + + + + // Dictionnaires : + +var txt = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + lang + "/general"); + +var txtUsers = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/user$")("./" + lang + "/user"); // Principaux éléments du DOM manipulés : + + +var myForm = document.getElementById("subscription"); +var divResponse = document.getElementById("response"); +var passwordInput = document.getElementById("password"); +var passwordLink = document.getElementById("getPassword"); +var passwordHelp = document.getElementById("passwordMessage"); +var emailInput = document.getElementById("email"); +var btnSubmit = document.getElementById("submitDatas"); +var codeGodfatherInput = document.getElementById("codeGodfather"); +Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["helloDev"])(); // Test de connexion de l'utilisateur + affichage formulaire d'inscription. + +var initialise = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + var isConnected, user, homePage; + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _context.prev = 0; + _context.next = 3; + return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_5__["checkSession"])(); + + case 3: + isConnected = _context.sent; + + if (isConnected) { + Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["saveLocaly"])("message", { + message: txtUsers.alreadyConnected, + color: "information" + }); // pour l'afficher sur la page suivante + + user = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("user", true); + homePage = user.status + "HomePage"; + window.location.assign("/" + configTemplate[homePage]); + } else { + Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(configUsers, myForm); + myForm.style.display = "block"; + } + + _context.next = 11; + break; + + case 7: + _context.prev = 7; + _context.t0 = _context["catch"](0); + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]); + console.error(_context.t0); + + case 11: + case "end": + return _context.stop(); + } + } + }, _callee, null, [[0, 7]]); + })); + + return function initialise() { + return _ref.apply(this, arguments); + }; +}(); + +initialise(); // Générateur de mot de passe "aléatoire" + +passwordLink.addEventListener("click", function (e) { + e.preventDefault(); + passwordInput.type = "text"; + passwordInput.value = Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_5__["getPassword"])(8, 12); // copie du mot de passe généré dans le presse-papier + + passwordInput.select(); + document.execCommand("copy"); + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(passwordHelp, "em", txtUsers.passwordCopied, "", ["success"]); +}); // Test si l'e-mail saisi est déjà utilisé pour un compte déjà existant. +// Si c'est le cas, la validation du formulaire est bloquée. + +emailInput.addEventListener("focus", function (e) { + document.getElementById("emailMessage").innerHTML = ""; // pour supprimer l'éventuel message d'erreur déjà affiché +}); +emailInput.addEventListener("blur", function (e) { + var emailValue = emailInput.value.trim(); + + if (emailValue !== "") { + var xhr = new XMLHttpRequest(); + xhr.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + configUsers.userRoutes + configUsers.checkIfIsEmailfreeRoute); + + xhr.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var response = JSON.parse(this.responseText); + + if (this.status === 200 && response.free !== undefined && response.free === false) { + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(document.getElementById("emailMessage"), "b", txtUsers.needUniqueEmail.replace("#URL", configTemplate.connectionPage), "", ["error"]); + btnSubmit.setAttribute("disabled", true); + } else btnSubmit.removeAttribute("disabled"); + } + }; + + xhr.setRequestHeader("Content-Type", "application/json"); + var datas = { + emailTest: emailValue + }; + xhr.send(JSON.stringify(datas)); + } +}); // Vérification que le code de parrainage saisi est valide. +// Si ce n'est pas le cas, cela n'est pas bloquant. + +codeGodfatherInput.addEventListener("focus", function (e) { + // on efface l'éventuel message d'erreur si on revient sur le champ pour rectifier le tir + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(document.getElementById("codeGodfatherMessage"), "i", txt.notRequired, "", ["information"]); +}); +codeGodfatherInput.addEventListener("blur", function (e) { + var codeValue = codeGodfatherInput.value.trim(); + + if (codeValue !== "") { + var xhr = new XMLHttpRequest(); + xhr.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + configUsers.userRoutes + configUsers.getGodfatherRoute); + + xhr.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + if (this.status === 204) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(document.getElementById("codeGodfatherMessage"), "b", txtUsers.godfatherNotFound, "", ["error"]);else // !! à revoir car cela peut permettre de savoir qu'une adresse e-mail est présente dans le bd + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(document.getElementById("codeGodfatherMessage"), "b", txtUsers.godfatherFound, "", ["success"]); + } + }; + + xhr.setRequestHeader("Content-Type", "application/json"); + var datas = { + codeTest: codeValue + }; + xhr.send(JSON.stringify(datas)); + } +}); // Traitement de l'envoi des données d'inscription : + +myForm.addEventListener("submit", function (e) { + try { + e.preventDefault(); + var xhr = new XMLHttpRequest(); + xhr.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + configUsers.userRoutes + configUsers.subscribeRoute); + + xhr.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var response = JSON.parse(this.responseText); + + if (this.status === 201) { + myForm.style.display = "none"; + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", response.message, "", ["success"]); + Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["removeLocaly"])("lastAnswer"); // ! important pour ne pas enregister plusieurs fois le résultat + } else if (response.errors) { + if (Array.isArray(response.errors)) response.errors = response.errors.join("
    ");else response.errors = txt.serverError; + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", response.errors, "", ["error"]); + } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]); + } + }; + + xhr.setRequestHeader("Content-Type", "application/json"); + var datas = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["getDatasFromInputs"])(myForm); + + if (datas) { + datas.timeDifference = Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_5__["getTimeDifference"])(configUsers); // si l'utilisateur a précédement répondu à un quiz, j'ajoute les infos de son résultat : + + xhr.send(JSON.stringify(datas)); + } + } catch (e) { + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]); + console.error(e); + } +}); + +/***/ }), + +/***/ "./src/tools/clientstorage.js": +/*!************************************!*\ + !*** ./src/tools/clientstorage.js ***! + \************************************/ +/*! exports provided: saveLocaly, getLocaly, removeLocaly */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveLocaly", function() { return saveLocaly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaly", function() { return getLocaly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeLocaly", function() { return removeLocaly; }); +// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.) +// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie +var saveLocaly = function saveLocaly(name, data) { + localStorage.setItem(name, JSON.stringify(data)); +}; +var getLocaly = function getLocaly(name) { + var json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name); +}; +var removeLocaly = function removeLocaly(name) { + localStorage.removeItem(name); +}; + +/***/ }), + +/***/ "./src/tools/dom.js": +/*!**************************!*\ + !*** ./src/tools/dom.js ***! + \**************************/ +/*! exports provided: addElement */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addElement", function() { return addElement; }); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__); +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + + // Fonction associant les attributs fournis à un champ de formulaire + +var addElement = function addElement(eltParent, eltType) { + var eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; + var eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; + var eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : []; + var eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; + var replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true; + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltType) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltParent)) return false;else { + var newElement = document.createElement(eltType); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ? + newElement.id = eltId; + + if (Array.isArray(eltClass) && eltClass.length != 0) { + for (var i in eltClass) { + newElement.classList.add(eltClass[i]); + } + } + + if (_typeof(eltAttributes) === "object") // !! tous les objets ne sont pas ok + { + for (var attributName in eltAttributes) { + newElement.setAttribute(attributName, eltAttributes[attributName]); + } + } + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltContent)) newElement.innerHTML = eltContent.replace(/\n/g, "
    "); // innerHTML permet d'ajouter du texte ayant lui-même des balises, etc. + + if (replace) eltParent.innerHTML = ""; + eltParent.appendChild(newElement); + } +}; + +/***/ }), + +/***/ "./src/tools/everywhere.js": +/*!*********************************!*\ + !*** ./src/tools/everywhere.js ***! + \*********************************/ +/*! exports provided: helloDev, updateAccountLink */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "helloDev", function() { return helloDev; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateAccountLink", function() { return updateAccountLink; }); +// Ce script fournit des fonctions utilisées sur toutes les pages du site +var helloDev = function helloDev() { + console.log("**** Hello ami développeur :-)\n Le code de WikiLerni est libre et est lisible sur gitlab : \n Bonne lecture :-) \n Pour les suggestions d'amélioration ou questions : dev@wililerni.com ****"); + return true; +}; +var updateAccountLink = function updateAccountLink(status, configTemplate) { + var link = document.getElementById("accountHeadLink"); + var homePage = status + "HomePage"; + link.href = "/" + configTemplate[homePage]; +}; + +/***/ }), + +/***/ "./src/tools/forms.js": +/*!****************************!*\ + !*** ./src/tools/forms.js ***! + \****************************/ +/*! exports provided: setAttributesToInputs, getDatasFromInputs, empyForm, empyAndHideForm */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setAttributesToInputs", function() { return setAttributesToInputs; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDatasFromInputs", function() { return getDatasFromInputs; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empyForm", function() { return empyForm; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empyAndHideForm", function() { return empyAndHideForm; }); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__); +function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + + // Fonction associant les attributs fournis à un champ de formulaire + +var setAttributesToInputs = function setAttributesToInputs(inputsConf, myForm) { + for (var i in myForm.elements) { + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(myForm.elements[i].id)) { + var idInput = myForm.elements[i].id; + + if (inputsConf[idInput] !== undefined) { + var inputHTML = document.getElementById(idInput); + + for (var attribute in inputsConf[idInput]) { + inputHTML.setAttribute(attribute, inputsConf[idInput][attribute]); + } + } + } + } + + return true; +}; // Récupère toutes les valeurs de champs en omettant les checkbox non cochées, etc. + +var getDatasFromInputs = function getDatasFromInputs(myForm) { + var datas = {}; + var formData = new FormData(myForm); + + var _iterator = _createForOfIteratorHelper(formData.entries()), + _step; + + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var entrie = _step.value; + datas[entrie[0]] = entrie[1]; + } + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); + } + + return datas; +}; // Vide tous les champs d'un formulaire, y compris hidden, checkbox, etc. +// Revoir pour les select + +var empyForm = function empyForm(myForm) { + var formData = new FormData(myForm); + + var _iterator2 = _createForOfIteratorHelper(formData.entries()), + _step2; + + try { + for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { + var entrie = _step2.value; + if (myForm.elements[entrie[0]].type == "checkbox" || myForm.elements[entrie[0]].type == "radio") myForm.elements[entrie[0]].checked = false;else myForm.elements[entrie[0]].value = ""; + } + } catch (err) { + _iterator2.e(err); + } finally { + _iterator2.f(); + } + + return true; +}; // Vide et cache le formulaire + +var empyAndHideForm = function empyAndHideForm(myForm) { + empyForm(myForm); + myForm.style.display = "none"; +}; + +/***/ }), + +/***/ "./src/tools/users.js": +/*!****************************!*\ + !*** ./src/tools/users.js ***! + \****************************/ +/*! exports provided: getConfig, getTimeDifference, getPassword, setSession, checkAnswerDatas, checkSession */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getConfig", function() { return getConfig; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTimeDifference", function() { return getTimeDifference; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getPassword", function() { return getPassword; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setSession", function() { return setSession; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkAnswerDatas", function() { return checkAnswerDatas; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkSession", function() { return checkSession; }); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/instance.js */ "../config/instance.js"); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../config/users.js */ "../config/users.js"); +/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_3__); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + + +var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0]; + +var configTemplate = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); + + + + // Récupère les données de configuration des utilisateurs +// À terme, un fichier statique importable comme module devrait éviter une requête ajax + +var getConfig = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + return _context.abrupt("return", new Promise(function (resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + "/user/getconfig"); + + xhr.onload = function () { + return resolve(JSON.parse(xhr.responseText)); + }; + + xhr.onerror = function () { + return reject(xhr.statusText); + }; + + xhr.send(); + })); + + case 1: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + + return function getConfig() { + return _ref.apply(this, arguments); + }; +}(); +var getTimeDifference = function getTimeDifference() { + var timeLocal = new Date().getTimezoneOffset(); + if (timeLocal > _config_users_js__WEBPACK_IMPORTED_MODULE_1__["timeDifferenceMax"] || timeLocal < _config_users_js__WEBPACK_IMPORTED_MODULE_1__["timeDifferenceMin"]) return 0;else return timeLocal; +}; // On enlève volontairement les 0/O pour éviter les confusions ! +// Et mieux vaut aussi débuter et finir par une lettre simple. + +var getPassword = function getPassword(nbCarMin, nbCarMax) { + var nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin)); + var letters = "ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz"; + var others = "123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ"; + var password = letters[Math.floor(Math.random() * letters.length)]; + + for (var i = 1; i < nbCar - 1; i++) { + if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)]; + } + + password += letters[Math.floor(Math.random() * letters.length)]; + return password; +}; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite +// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides. + +var setSession = function setSession(userId, token, durationTS) { + var storageUser = { + id: userId, + token: token, + duration: durationTS + }; + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("user", storageUser); +}; // Vérifie qu'il y a des données locales concernant le résultat d'un quiz +// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas + +var checkAnswerDatas = function checkAnswerDatas(datas) { + var lastAnswer = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("lastAnswer"); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(lastAnswer)) { + var answer = JSON.parse(lastAnswer); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.duration) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbCorrectAnswers) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.QuestionnaireId) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbQuestions)) { + datas.duration = answer.duration; + datas.nbCorrectAnswers = answer.nbCorrectAnswers; + datas.QuestionnaireId = answer.QuestionnaireId; + datas.nbQuestions = answer.nbQuestions; + } + } + + return datas; +}; // Cette fonction teste la connexion de l'utilisateur d'une page +// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté + +var checkSession = /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() { + var status, + urlRedirection, + message, + urlWanted, + _args2 = arguments; + return regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + status = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : []; + urlRedirection = _args2.length > 1 ? _args2[1] : undefined; + message = _args2.length > 2 ? _args2[2] : undefined; + urlWanted = _args2.length > 3 ? _args2[3] : undefined; + return _context2.abrupt("return", new Promise(function (resolve, reject) { + var userDatas = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("user"); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(userDatas)) { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else { + var user = JSON.parse(userDatas); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.id) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.token) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.duration) || user.duration < Date.now()) { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else { + var xhr = new XMLHttpRequest(); + xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["userRoutes"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["checkLoginRoute"] + user.token); + + xhr.onload = function () { + var response = JSON.parse(xhr.responseText); + + if (xhr.status === 200 && response.isValid && response.id != undefined) { + if (response.id === user.id) { + user.name = response.name; + user.language = response.language; + user.timeDifference = response.timeDifference; + user.status = response.status; // le token et de toute façon vérifier à chaque requête à l'API + + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("user", user); // si il s'agit d'un "user" et que son abonnement a expiré, je le redirige vers la caisse :-) + + if (response.status === "user" && response.nbDaysOk <= 0) { + var urlAccount = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["siteUrl"] + "/" + configTemplate[lang].accountPage; + if (window.location.href.indexOf(urlAccount) === -1) window.location.assign("/" + configTemplate[lang].accountPage); // passée directement ici, l'ancre #subscribe ne fonctionne pas !? + + resolve(true); + } else { + if (status.length !== 0 && status.indexOf(response.status) === -1) { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else resolve(true); + } + } else { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + } else { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + }; + + xhr.onerror = function () { + return reject(xhr.statusText); + }; + + xhr.send(); + } + } + })); + + case 5: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + + return function checkSession() { + return _ref2.apply(this, arguments); + }; +}(); // Cette fonction sert à la précédente en cas de connexion non valide + +var redirectUser = function redirectUser(urlRedirection, message, urlWanted) { + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(message)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("message", message); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlWanted)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("url", urlWanted); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlRedirection)) window.location.assign(urlRedirection); +}; + +/***/ }) + +/******/ }); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9nZW5lcmFsJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3VzZXIkIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL2dlbmVyYWwuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcvZnIvdXNlci5qcyIsIndlYnBhY2s6Ly8vLi4vdG9vbHMvbWFpbi5qcyIsIndlYnBhY2s6Ly8vLi4vdmlld3Mgc3luYyBeXFwuXFwvLipcXC5qcyQiLCJ3ZWJwYWNrOi8vLy4uL3ZpZXdzL2RlZmF1bHQvY29uZmlnL2ZyLmpzIiwid2VicGFjazovLy8uL3NyYy9zdWJzY3JpYmUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2RvbS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvZXZlcnl3aGVyZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvZm9ybXMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL3VzZXJzLmpzIl0sIm5hbWVzIjpbInVzZXJzIiwicmVxdWlyZSIsInF1ZXN0aW9ubmFpcmVzIiwibW9kdWxlIiwiZXhwb3J0cyIsImFwaVVybCIsInNpdGVVcmwiLCJhZG1pbk5hbWUiLCJhZG1pbkVtYWlsIiwic2VuZGVyTmFtZSIsInNlbmRlckVtYWlsIiwiYWRtaW5MYW5nIiwidGhlbWUiLCJhdmFpbGFibGVMYW5ncyIsInNpdGVOYW1lIiwiYmVnaW5Db2RlR29kZmF0aGVyIiwiY3JvblRpbWluZ0FsZXJ0SW5TZWNvbmRlIiwicmVzcG9uc2VUaW1pbmdBbGVydEluU2Vjb25kZSIsInRva2VuU2lnbnVwVmFsaWRhdGlvblRpbWVJbkhvdXJzIiwidG9rZW5Mb2dpbkxpbmtUaW1lSW5Ib3VycyIsInRva2VuQ29ubmV4aW9uTWluVGltZUluSG91cnMiLCJ0b2tlbkNvbm5leGlvbk1heFRpbWVJbkRheXMiLCJ0b2tlbkxvZ2luQ2hhbmdpbmdUaW1lSW5Ib3VycyIsInRva2VuRGVsZXRlVXNlclRpbWVJbkhvdXJzIiwidG9rZW5VbnN1YnNjcmliZUxpbmtUaW1lSW5EYXlzIiwiZnJlZUFjY291bnRUaW1pbmdJbkRheXMiLCJmcmVlQWNjb3VudEV4cGlyYXRpb25Ob3RpZmljYXRpb25JbkRheXMiLCJhY2NvdW50RXhwaXJhdGlvbkZpcnN0Tm90aWZpY2F0aW9uSW5EYXlzIiwiYWNjb3VudEV4cGlyYXRpb25TZWNvbmROb3RpZmljYXRpb25JbkRheXMiLCJpbmFjdGl2ZUFjY291bnRUaW1lVG9EZWxldGVJbkRheXMiLCJuYlF1ZXN0aW9uc01pbiIsIm5iUXVlc3Rpb25zTWF4IiwibmJDaG9pY2VzTWF4IiwibmJOZXdRdWVzdGlvbm5haXJlcyIsImhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUJlZ2luIiwiaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlRW5kIiwibnVtYmVyTmV3UXVlc3Rpb25uYWlyZUF0U2FtZVRpbWUiLCJtaW5TZWFyY2hRdWVzdGlvbm5haXJlcyIsIm5iSWxsdXN0cmF0aW9uc01pbiIsIm5iSWxsdXN0cmF0aW9uc01heCIsIm1heElsbHVzdHJhdGlvblNpemVpbk9jdGV0IiwibWltZVR5cGVzRm9ySWxsdXN0cmF0aW9uIiwiaWxsdXN0cmF0aW9uc1dpZHRoTWF4SW5QeCIsImlsbHVzdHJhdGlvbnNNaW5pYXR1cmVzV2lkdGhNYXhJblB4IiwibmJMaW5rc01pbiIsIm5iTGlua3NNYXgiLCJwYXNzd29yZCIsIm1pbmxlbmd0aCIsImRpckNhY2hlVXNlcnMiLCJkaXJDYWNoZVVzZXJzQW5zd2VycyIsImRpckNhY2hlUXVlc3Rpb25uYWlyZXMiLCJkaXJDYWNoZVF1ZXN0aW9ucyIsImRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlcyIsImRpckhUTUxRdWVzdGlvbm5haXJlIiwiZGlyV2ViUXVlc3Rpb25uYWlyZSIsInF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJnZXRRdWVzdGlvbm5haXJlUm91dGVzIiwicHJldmlld1F1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJwdWJsaXNoZWRRdWVzdGlvbm5haXJlUm91dGVzIiwic2F2ZUFuc3dlcnNSb3V0ZSIsImdldFN0YXRzUXVlc3Rpb25uYWlyZXMiLCJzZWFyY2hRdWVzdGlvbm5haXJlc1JvdXRlIiwic2VhcmNoQWRtaW5RdWVzdGlvbm5haXJlc1JvdXRlIiwiZ2V0TGlzdE5leHRRdWVzdGlvbm5haXJlcyIsInF1ZXN0aW9uc1JvdXRlIiwidGFnc1NlYXJjaFJvdXRlIiwiZ2V0UXVlc3Rpb25uYWlyZXNXaXRob3V0QW5zd2VyIiwiZ2V0UHJldmlvdXNBbnN3ZXJzIiwiZ2V0U3RhdHNBbnN3ZXJzIiwiZ2V0QWRtaW5TdGF0cyIsIlF1ZXN0aW9ubmFpcmUiLCJ0aXRsZSIsIm1heGxlbmd0aCIsInJlcXVpcmVkIiwic2x1ZyIsImludHJvZHVjdGlvbiIsInNlYXJjaFF1ZXN0aW9ubmFpcmVzIiwiUXVlc3Rpb24iLCJ0ZXh0IiwicmFuayIsIm1pbiIsImRlZmF1bHRWYWx1ZSIsIkNob2ljZSIsIm5iVGFnc01pbiIsIm5iVGFnc01heCIsImRpckNhY2hlVGFncyIsImRpckhUTUxUYWdzIiwiZGlyV2ViVGFncyIsInVzZXJSb3V0ZXMiLCJzdWJzY3JpYmVSb3V0ZSIsImdldEdvZGZhdGhlclJvdXRlIiwiY2hlY2tJZklzRW1haWxmcmVlUm91dGUiLCJjaGVja1N1YnNjcmliZVRva2VuUm91dGUiLCJjaGVja0xvZ2luUm91dGUiLCJjb25uZWN0aW9uUm91dGUiLCJnZXRMb2dpbkxpbmtSb3V0ZSIsImNvbm5lY3Rpb25XaXRoTGlua1JvdXRlIiwiZ2V0VXNlckluZm9zIiwiY3JlYXRlVXNlclJvdXRlIiwidmFsaWRhdGVVc2VyUm91dGUiLCJ1cGRhdGVVc2VySW5mb3MiLCJzZWFyY2hVc2VyUm91dGUiLCJnZXRHb2RDaGlsZHMiLCJjaGVja05ld0xvZ2luTGlua1JvdXRlIiwiY2hlY2tEZWxldGVMaW5rUm91dGUiLCJnZXRQYXltZW50cyIsInVuc3Vic2NyaWJlUm91dGUiLCJuYW1lIiwiZW1haWwiLCJuZXdQYXNzd29yZCIsImNvZGVHb2RmYXRoZXIiLCJjZ3VPayIsInZhbHVlIiwidGltZURpZmZlcmVuY2VNaW4iLCJ0aW1lRGlmZmVyZW5jZU1heCIsInNpdGVIVE1MVGl0bGUiLCJzaXRlTWV0YURlc2NyaXB0aW9uIiwic2NyaXB0VGltaW5nSW5mbyIsInNjcmlwdFRpbWluZ0FsZXJ0Iiwic2VydmVyRXJyb3IiLCJzZXJ2ZXJFcnJvckFkbWluIiwibmVlZGVkUGFyYW1zIiwiYmFkVXJsIiwibm90VmFsaWRGb3JtYXQiLCJub3RBbGxvd2VkIiwibm90UmVxdWlyZWQiLCJ1cGRhdGVCdG5UeHQiLCJhZGRCdG5UeHQiLCJkZWxldGVCdG5UeHQiLCJhZGRPa01lc3NhZ2UiLCJ1cGRhdGVPa01lc3NhZ2UiLCJkZWxldGVPa01lc3NhZ2UiLCJmYWlsQXV0aCIsImZhaWxBdXRoSGVhZGVyIiwiZmFpbEF1dGhUb2tlbiIsImZhaWxBdXRoSWQiLCJmYWlsQXV0aENyb24iLCJwcmV2aW91c1BhZ2UiLCJuZXh0UGFnZSIsImJ0bkxpbmtUb1F1ZXN0aW9ubmFpcmUiLCJzdGF0c0FkbWluIiwibm90Rm91bmQiLCJuZWVkTmFtZSIsIm5lZWROb3RUb29Mb25nTmFtZSIsIm5lZWRFbWFpbCIsIm5lZWRVbmlxdWVFbWFpbCIsIm5lZWROb3RUb29Mb25nRW1haWwiLCJuZWVkUGFzc1dvcmQiLCJuZWVkTG9uZ1Bhc3NXb3JkIiwicGFzc3dvcmRDb3BpZWQiLCJuZWVkU3RhdHVzIiwibmVlZExhbmd1YWdlIiwibmVlZFZhbGlkTGFzdENvbm5lY3Rpb25EYXRlIiwibmVlZFNNVFAiLCJuZWVkU01UUE5vdEZvdW5kIiwibmVlZEtub3dOZXdzbGV0dGVyT2siLCJuZWVkVGltZURpZmZlcmVuY2UiLCJuZWVkTWluVGltZURpZmZlcmVuY2UiLCJuZWVkTWF4VGltZURpZmZlcmVuY2UiLCJuZWVkVUdDT2siLCJnb2RmYXRoZXJOb3RGb3VuZCIsImdvZGZhdGhlckZvdW5kIiwibWFpbFZhbGlkYXRpb25NZXNzYWdlIiwibWFpbFZhbGlkYXRpb25MaW5rU3ViamVjdCIsIm1haWxWYWxpZGF0aW9uTGlua1NCb2R5VHh0IiwibWFpbFZhbGlkYXRpb25MaW5rU0JvZHlIVE1MIiwidmFsaWRhdGlvbk1lc3NhZ2UiLCJ2YWxpZGF0aW9uTWVzc2FnZUFkbWluIiwidmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlIiwidmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlQWRtaW4iLCJtYWlsV2VsY29tZVN1YmplY3QiLCJtYWlsV2VsY29tZUJvZHlUeHQiLCJtYWlsV2VsY29tZUJvZHlIVE1MIiwibWFpbFRoYW5rR29kZmF0aGVyU3ViamVjdCIsIm1haWxUaGFua0dvZGZhdGhlckJvZHlUeHQiLCJtYWlsVGhhbmtHb2RmYXRoZXJCb2R5SFRNTCIsImJhZExpbmtWYWxpZGF0aW9uTWVzc2FnZSIsImVtYWlsTm90Rm91bmQiLCJhbHJlYWR5Q29ubmVjdGVkIiwibmVlZEJlQ29ubmVjdGVkIiwiY29ubmVjdGlvbk9rIiwibmVlZENob29zZUxvZ2luV2F5IiwibmVlZFZhbGlkYXRpb25Ub0xvZ2luIiwidG9vTWFueUxvZ2luRmFpbHMiLCJiYWRQYXNzd29yZCIsIm1haWxMb2dpbkxpbmtTdWJqZWN0IiwibWFpbExvZ2luTGlua0JvZHlUeHQiLCJtYWlsTG9naW5MaW5rQm9keUhUTUwiLCJtYWlsTG9naW5MaW5rTWVzc2FnZSIsInVwZGF0ZWRPa01lc3NhZ2UiLCJ1cGRhdGVkTmVlZEdvb2RFbWFpbCIsInVwZGF0ZWROZWVkVW5pcXVlRW1haWwiLCJtYWlsVXBkYXRlTG9naW5TdWJqZWN0IiwibWFpbFVwZGF0ZUxvZ2luQm9keVR4dCIsIm1haWxVcGRhdGVMb2dpbkJvZHlIVE1MIiwibWFpbFVwZGF0ZUxvZ2luTGlua01lc3NhZ2UiLCJ1cGRhdGVkTmVlZFZhbGlkYXRlZFVzZXIiLCJ1cGRhdGVkTmVlZEdvb2RHb2RmYXRoZXIiLCJtYWlsVXBkYXRlTG9naW5Pa01lc3NhZ2UiLCJ1cGRhdGVkRmFpbGVkR29kZmF0aGVyTm90Rm91bmQiLCJjcmVhdGlvbk9rTWVzc2FnZSIsIm1haWxEZWxldGVTdWJqZWN0IiwibWFpbERlbGV0ZUJvZHlUeHQiLCJtYWlsRGVsZXRlQm9keUhUTUwiLCJtYWlsRGVsZXRlTGlua01lc3NhZ2UiLCJkZWxldGVGYWlsTWVzc2FnZSIsIm1haWxEZWxldGVMaW5rT2tNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtBbHJlYWR5TWVzc2FnZSIsIm1haWxEZWxldGVMaW5rRmFpbE1lc3NhZ2UiLCJjcm9uRGVsZXRlVW52YWxpZGVkVXNlcnNNZXNzYWdlIiwiZGVsZXRlSW5hY3RpdmVVc2Vyc01lc3NhZ2UiLCJ3ZWxjb21lTWVzc2FnZSIsImJ5ZWJ5ZU1lc3NhZ2UiLCJpbmZvc1VzZXJGb3JBZG1pbiIsImluZm9zQWRtaW5Hb2RmYXRoZXIiLCJpbmZvc0FkbWluTmJHb2RDaGlsZHMiLCJUb29sIiwibXlWYXIiLCJ1bmRlZmluZWQiLCJ0cmltIiwibXlTdHJpbmciLCJpc0VtcHR5IiwibWF4IiwibGVuZ3RoIiwic3Vic3RyaW5nIiwibWFwT2JqIiwicmVwbGFjZUVsdHMiLCJSZWdFeHAiLCJPYmplY3QiLCJrZXlzIiwiam9pbiIsInJlcGxhY2UiLCJtYXRjaGVkIiwiTWF0aCIsImNlaWwiLCJmbG9vciIsInJhbmRvbSIsImRhdGVTdHJpbmciLCJsYW5nIiwibXlEYXRlIiwiRGF0ZSIsIm15RGF5IiwiZ2V0RGF0ZSIsIm15TW91bnRoIiwiZ2V0TW9udGgiLCJteVllYXIiLCJnZXRGdWxsWWVhciIsImhlYWRMaW5rcyIsImFuY2hvciIsImF0dHJpYnV0ZXMiLCJocmVmIiwiaWQiLCJmb290TGlua3MiLCJyZWwiLCJtYXhRdWVzdGlvbm5haXJlc0J5UGFnZSIsInVzZXJIb21lUGFnZSIsImFkbWluSG9tZVBhZ2UiLCJtYW5hZ2VySG9tZVBhZ2UiLCJzdWJzY3JpYmVQYWdlIiwiY29ubmVjdGlvblBhZ2UiLCJhY2NvdW50UGFnZSIsInF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2UiLCJ1c2Vyc01hbmFnZW1lbnRQYWdlIiwibmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSIsImlsbHVzdHJhdGlvbkRpciIsInNpdGVTbG9nYW4iLCJob21lVGl0bGUxIiwiaG9tZVAxIiwiaG9tZVRpdGxlMiIsImhvbWVQMiIsIm5ld1F1ZXN0aW9ubmFpcmVzVGl0bGUiLCJuZXdRdWVzdGlvbm5haXJlc0ludHJvIiwiZXhwbGFuYXRpb25UaXRsZSIsImV4cGxhbmF0aW9uVHh0Iiwibm9KU05vdGlmaWNhdGlvbiIsImNvbmZpZ1RlbXBsYXRlIiwiY29uZmlnVXNlcnMiLCJ0eHQiLCJ0eHRVc2VycyIsIm15Rm9ybSIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJkaXZSZXNwb25zZSIsInBhc3N3b3JkSW5wdXQiLCJwYXNzd29yZExpbmsiLCJwYXNzd29yZEhlbHAiLCJlbWFpbElucHV0IiwiYnRuU3VibWl0IiwiY29kZUdvZGZhdGhlcklucHV0IiwiaGVsbG9EZXYiLCJpbml0aWFsaXNlIiwiY2hlY2tTZXNzaW9uIiwiaXNDb25uZWN0ZWQiLCJzYXZlTG9jYWx5IiwibWVzc2FnZSIsImNvbG9yIiwidXNlciIsImdldExvY2FseSIsImhvbWVQYWdlIiwic3RhdHVzIiwid2luZG93IiwibG9jYXRpb24iLCJhc3NpZ24iLCJzZXRBdHRyaWJ1dGVzVG9JbnB1dHMiLCJzdHlsZSIsImRpc3BsYXkiLCJhZGRFbGVtZW50IiwiY29uc29sZSIsImVycm9yIiwiYWRkRXZlbnRMaXN0ZW5lciIsImUiLCJwcmV2ZW50RGVmYXVsdCIsInR5cGUiLCJnZXRQYXNzd29yZCIsInNlbGVjdCIsImV4ZWNDb21tYW5kIiwiaW5uZXJIVE1MIiwiZW1haWxWYWx1ZSIsInhociIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsIm9ucmVhZHlzdGF0ZWNoYW5nZSIsInJlYWR5U3RhdGUiLCJET05FIiwicmVzcG9uc2UiLCJKU09OIiwicGFyc2UiLCJyZXNwb25zZVRleHQiLCJmcmVlIiwic2V0QXR0cmlidXRlIiwicmVtb3ZlQXR0cmlidXRlIiwic2V0UmVxdWVzdEhlYWRlciIsImRhdGFzIiwiZW1haWxUZXN0Iiwic2VuZCIsInN0cmluZ2lmeSIsImNvZGVWYWx1ZSIsImNvZGVUZXN0IiwicmVtb3ZlTG9jYWx5IiwiZXJyb3JzIiwiQXJyYXkiLCJpc0FycmF5IiwiZ2V0RGF0YXNGcm9tSW5wdXRzIiwidGltZURpZmZlcmVuY2UiLCJnZXRUaW1lRGlmZmVyZW5jZSIsImRhdGEiLCJsb2NhbFN0b3JhZ2UiLCJzZXRJdGVtIiwianNvbiIsImdldEl0ZW0iLCJyZW1vdmVJdGVtIiwiZWx0UGFyZW50IiwiZWx0VHlwZSIsImVsdENvbnRlbnQiLCJlbHRJZCIsImVsdENsYXNzIiwiZWx0QXR0cmlidXRlcyIsIm5ld0VsZW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiaSIsImNsYXNzTGlzdCIsImFkZCIsImF0dHJpYnV0TmFtZSIsImFwcGVuZENoaWxkIiwibG9nIiwidXBkYXRlQWNjb3VudExpbmsiLCJsaW5rIiwiaW5wdXRzQ29uZiIsImVsZW1lbnRzIiwiaWRJbnB1dCIsImlucHV0SFRNTCIsImF0dHJpYnV0ZSIsImZvcm1EYXRhIiwiRm9ybURhdGEiLCJlbnRyaWVzIiwiZW50cmllIiwiZW1weUZvcm0iLCJjaGVja2VkIiwiZW1weUFuZEhpZGVGb3JtIiwiZ2V0Q29uZmlnIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJvbmxvYWQiLCJvbmVycm9yIiwic3RhdHVzVGV4dCIsInRpbWVMb2NhbCIsImdldFRpbWV6b25lT2Zmc2V0IiwibmJDYXJNaW4iLCJuYkNhck1heCIsIm5iQ2FyIiwibGV0dGVycyIsIm90aGVycyIsInNldFNlc3Npb24iLCJ1c2VySWQiLCJ0b2tlbiIsImR1cmF0aW9uVFMiLCJzdG9yYWdlVXNlciIsImR1cmF0aW9uIiwiY2hlY2tBbnN3ZXJEYXRhcyIsImxhc3RBbnN3ZXIiLCJhbnN3ZXIiLCJuYkNvcnJlY3RBbnN3ZXJzIiwiUXVlc3Rpb25uYWlyZUlkIiwibmJRdWVzdGlvbnMiLCJ1cmxSZWRpcmVjdGlvbiIsInVybFdhbnRlZCIsInVzZXJEYXRhcyIsInJlZGlyZWN0VXNlciIsIm5vdyIsImlzVmFsaWQiLCJsYW5ndWFnZSIsIm5iRGF5c09rIiwidXJsQWNjb3VudCIsImluZGV4T2YiXSwibWFwcGluZ3MiOiI7UUFBQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7O1FBR0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDBDQUEwQyxnQ0FBZ0M7UUFDMUU7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSx3REFBd0Qsa0JBQWtCO1FBQzFFO1FBQ0EsaURBQWlELGNBQWM7UUFDL0Q7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLHlDQUF5QyxpQ0FBaUM7UUFDMUUsZ0hBQWdILG1CQUFtQixFQUFFO1FBQ3JJO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMkJBQTJCLDBCQUEwQixFQUFFO1FBQ3ZELGlDQUFpQyxlQUFlO1FBQ2hEO1FBQ0E7UUFDQTs7UUFFQTtRQUNBLHNEQUFzRCwrREFBK0Q7O1FBRXJIO1FBQ0E7OztRQUdBO1FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsRkEsSUFBTUEsS0FBSyxHQUFHQyxtQkFBTyxDQUFDLG1DQUFELENBQXJCOztBQUNBLElBQU1DLGNBQWMsR0FBR0QsbUJBQU8sQ0FBQyxxREFBRCxDQUE5Qjs7QUFFQUUsTUFBTSxDQUFDQyxPQUFQO0FBRUlDLFFBQU0sRUFBRSwyQkFGWjtBQUdJQyxTQUFPLEVBQUUsdUJBSGI7QUFJSUMsV0FBUyxFQUFFLFNBSmY7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LGNBQXZCO0FBQ1AsQ0FSRCxDIiwiZmlsZSI6Ii4vSlMvc3Vic2NyaWJlLmFwcC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL3N1YnNjcmliZS5qc1wiKTtcbiIsImNvbnN0IHVzZXJzID0gcmVxdWlyZShcIi4vdXNlcnNcIik7XG5jb25zdCBxdWVzdGlvbm5haXJlcyA9IHJlcXVpcmUoXCIuL3F1ZXN0aW9ubmFpcmVzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgYXBpVXJsOiBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9hcGlcIixcbiAgICBzaXRlVXJsOiBcImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MFwiLFxuICAgIGFkbWluTmFtZTogXCJGYWJyaWNlXCIsXG4gICAgYWRtaW5FbWFpbDogXCJkZXZAd2lraWxlcm5pLmNvbVwiLFxuICAgIHNlbmRlck5hbWU6IFwiV2lraUxlcm5pXCIsXG4gICAgc2VuZGVyRW1haWw6IFwiYm9uam91ckB3aWtpbGVybmkuY29tXCIsXG4gICAgYWRtaW5MYW5nOiBcImZyXCIsXG4gICAgdGhlbWU6IFwiZGVmYXVsdFwiLCAvLyBsZSB0aMOobWUgdXRpbGlzw6kgKGRhbnMgL3ZpZXdzKSBwb3VyIGfDqW7DqXJlciBsZXMgcGFnZXMgSFRNTC4gQ29udGllbnQgc2VzIHByb3ByZXMgZmljaGllcnMgZGUgY29uZmlndXJhdGlvbi5cbiAgICBhdmFpbGFibGVMYW5nczogW1wiZnJcIl0sLy8gTGFuZ3VhZ2VzIGluIHdoaWNoIHRoZSBzaXRlIGlzIGF2YWlsYWJsZS4gVGhlIGZpcnN0IG9uZSBpcyB0aGUgZGVmYXVsdCBvbmUuXG4gICAgc2l0ZU5hbWU6IFwiV2lraUxlcm5pXCIsXG4gICAgYmVnaW5Db2RlR29kZmF0aGVyOiBcIndpa2lsZXJuaVwiLCAvLyBjYXNlLXNlbnNpdGl2ZSBhbmQgY2FuJ3QgY29udGFpbiBcIkBcIiAhXG4gICAgY3JvblRpbWluZ0FsZXJ0SW5TZWNvbmRlOiAxMjAsIC8vIGZvciBsb2dzXG4gICAgcmVzcG9uc2VUaW1pbmdBbGVydEluU2Vjb25kZTogMywgLy8gaWRlbVxuICAgIHRva2VuU2lnbnVwVmFsaWRhdGlvblRpbWVJbkhvdXJzOiBcIjQ4aFwiLCAvLyBodHRwczovL2dpdGh1Yi5jb20vemVpdC9tc1xuICAgIHRva2VuTG9naW5MaW5rVGltZUluSG91cnM6IFwiMWhcIixcbiAgICB0b2tlbkNvbm5leGlvbk1pblRpbWVJbkhvdXJzOiBcIjI0aFwiLFxuICAgIHRva2VuQ29ubmV4aW9uTWF4VGltZUluRGF5czogXCIxODAgZGF5c1wiLFxuICAgIHRva2VuTG9naW5DaGFuZ2luZ1RpbWVJbkhvdXJzOiBcIjFoXCIsLy8gZm9yIGVtYWlsICYgcGFzc3dvcmQgY2hhbmdpbmdcbiAgICB0b2tlbkRlbGV0ZVVzZXJUaW1lSW5Ib3VyczogXCIxaFwiLFxuICAgIHRva2VuVW5zdWJzY3JpYmVMaW5rVGltZUluRGF5czogXCI3IGRheXNcIiwgLy8gdG9rZW4gc2VuZCB3aXRoIHN1YnNjcmlwdGlvbidzIGVtYWlsc1xuICAgIGZyZWVBY2NvdW50VGltaW5nSW5EYXlzOiAxMCxcbiAgICBmcmVlQWNjb3VudEV4cGlyYXRpb25Ob3RpZmljYXRpb25JbkRheXM6IDUsXG4gICAgYWNjb3VudEV4cGlyYXRpb25GaXJzdE5vdGlmaWNhdGlvbkluRGF5czogMTQsICAgIFxuICAgIGFjY291bnRFeHBpcmF0aW9uU2Vjb25kTm90aWZpY2F0aW9uSW5EYXlzOiA1LFxuICAgIGluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5czogMTgwLFxuICAgIC8vIFF1ZXN0aW9ubmFpcmVzOlxuICAgIG5iUXVlc3Rpb25zTWluOiAxLCAvLyBtaW5pbXVtIG51bWJlciBvZiBxdWVzdGlvbnMgZm9yIHRoZSBxdWVzdGlvbm5haXJlIHRvIGJlIHB1Ymxpc2hhYmxlXG4gICAgbmJRdWVzdGlvbnNNYXg6IDEwLCAvLyBpZiAwID0gbm90IG1heGltdW1cbiAgICBuYkNob2ljZXNNYXg6IDEwLFxuICAgIG5iTmV3UXVlc3Rpb25uYWlyZXM6IDEwLC8vIGZvciBSU1MsIGV0Yy5cbiAgICBob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVCZWdpbjoxLCAvLyBpbiB1c2VyIGxvY2FsIHRpbWVcbiAgICBob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQ6MjQsIC8vIGlkZW1cbiAgICBudW1iZXJOZXdRdWVzdGlvbm5haXJlQXRTYW1lVGltZTogNTAsIC8vIGZvciBtYXNzIG1haWxpbmdcbiAgICBtaW5TZWFyY2hRdWVzdGlvbm5haXJlczogMyxcbiAgICAvLyBJbGx1c3RyYXRpb25zOlxuICAgIG5iSWxsdXN0cmF0aW9uc01pbjogMCxcbiAgICBuYklsbHVzdHJhdGlvbnNNYXg6IDEsXG4gICAgbWF4SWxsdXN0cmF0aW9uU2l6ZWluT2N0ZXQ6IDEwMDAwMDAsLy8gcGFzIGNvbnRyw7Rsw6kgcG91ciBsJ2luc3RhbnQuIMOAIHJldm9pci5cbiAgICBtaW1lVHlwZXNGb3JJbGx1c3RyYXRpb246IFsgXCJpbWFnZS9qcGdcIiwgXCJpbWFnZS9qcGVnXCIsIFwiaW1hZ2UvcG5nXCIsIFwiaW1hZ2UvZ2lmXCIsIFwiaW1hZ2UvcG5nXCIgXSxcbiAgICAvLyAtLSBVcGxvYWQgYW5kIHJlc2l6ZTpcbiAgICBpbGx1c3RyYXRpb25zV2lkdGhNYXhJblB4OiA0MDAsXG4gICAgaWxsdXN0cmF0aW9uc01pbmlhdHVyZXNXaWR0aE1heEluUHg6IDIwMCxcbiAgICAvLyBMaW5rczpcbiAgICBuYkxpbmtzTWluOiAxLFxuICAgIG5iTGlua3NNYXg6IDEsXG4gICAgLy8gw6Agc3VwcHJpbWVyIHF1YW5kIHRvdXMgbGVzIFwicmVxdWlyZVwiIMOgIGpvdXI6XG4gICAgbmJRdWVzdGlvbnNNaW46IHF1ZXN0aW9ubmFpcmVzLm5iUXVlc3Rpb25zTWluLFxuICAgIG5iUXVlc3Rpb25zTWF4OiBxdWVzdGlvbm5haXJlcy5uYlF1ZXN0aW9uc01heCxcbiAgICBuYkNob2ljZXNNYXg6IHF1ZXN0aW9ubmFpcmVzLm5iQ2hvaWNlc01heCxcbiAgICBwYXNzd29yZE1pbkxlbmd0aDogdXNlcnMucGFzc3dvcmQubWlubGVuZ3RoLFxuICAgIGRpckNhY2hlVXNlcnM6IHVzZXJzLmRpckNhY2hlVXNlcnMsXG4gICAgZGlyQ2FjaGVVc2Vyc0Fuc3dlcnM6IHVzZXJzLmRpckNhY2hlVXNlcnNBbnN3ZXJzLFxuICAgIGRpckNhY2hlUXVlc3Rpb25uYWlyZXM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlUXVlc3Rpb25uYWlyZXMsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbnM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlUXVlc3Rpb25zLFxuICAgIGRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzLFxuICAgIGRpckhUTUxRdWVzdGlvbm5haXJlOiBxdWVzdGlvbm5haXJlcy5kaXJIVE1MUXVlc3Rpb25uYWlyZSxcbiAgICBkaXJXZWJRdWVzdGlvbm5haXJlOiBxdWVzdGlvbm5haXJlcy5kaXJXZWJRdWVzdGlvbm5haXJlXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbnsgICAgXG4gICAgLy8gQVBJJ3JvdXRlcyAoYWZ0ZXIgXCJhcGlVcmxcIiBkZWZpbmVkIGluIGluc3RhbmNlLmpzKVxuICAgIHF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3F1ZXN0aW9ubmFpcmVcIixcbiAgICBnZXRRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9nZXRcIixcbiAgICBwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcHJldmlld1wiLFxuICAgIHB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3F1aXovXCIsXG4gICAgc2F2ZUFuc3dlcnNSb3V0ZTogXCIvYW5zd2VyL1wiLFxuICAgIGdldFN0YXRzUXVlc3Rpb25uYWlyZXMgOiBcIi9zdGF0cy9cIixcbiAgICBzZWFyY2hRdWVzdGlvbm5haXJlc1JvdXRlIDogXCIvc2VhcmNoXCIsXG4gICAgc2VhcmNoQWRtaW5RdWVzdGlvbm5haXJlc1JvdXRlIDogXCIvc2VhcmNoYWRtaW5cIixcbiAgICBnZXRMaXN0TmV4dFF1ZXN0aW9ubmFpcmVzOiBcIi9nZXRsaXN0bmV4dHF1ZXN0aW9ubmFpcmVzL1wiLFxuICAgIC8vIC0tIHF1ZXN0aW9ucyAmIGNob2ljZXMgOlxuICAgIHF1ZXN0aW9uc1JvdXRlOiBcIi9xdWVzdGlvbi9cIixcbiAgICAvLyAtLSB0YWdzIDpcbiAgICB0YWdzU2VhcmNoUm91dGU6IFwiL3RhZ3Mvc2VhcmNoL1wiLFxuICAgIC8vIC0tIGFuc3dlcnMgOlxuICAgIGdldFF1ZXN0aW9ubmFpcmVzV2l0aG91dEFuc3dlcjogXCIvd2l0aG91dGFuc3dlci91c2VyL1wiLFxuICAgIGdldFByZXZpb3VzQW5zd2VyczogXCIvdXNlci9hbnN3ZXJzL1wiLFxuICAgIGdldFN0YXRzQW5zd2VycyA6IFwiL3VzZXIvYW53c3dlcnMvc3RhdHMvXCIsXG4gICAgZ2V0QWRtaW5TdGF0czogXCIvZ2V0YWRtaW5zdGF0cy9cIixcbiAgICAvLyBmb3JtcyA6IMOgIGNvbXBsw6l0ZXIgYXZlYyB2YWxldXJzIHBhciBkw6lmYXV0LCBldGMuIGNmIG1vZMOobGVcbiAgICBRdWVzdGlvbm5haXJlIDpcbiAgICB7XG4gICAgICAgIHRpdGxlOiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICBzbHVnOiB7IG1heGxlbmd0aDogMTUwIH0sIC8vIGNoYW1wIHJlcXVpcyBtYWlzIGNhbGN1bMOpIMOgIHBhcnRpciBkdSB0aXRyZSBxZCB2aWRlXG4gICAgICAgIGludHJvZHVjdGlvbjogeyByZXF1aXJlZDogdHJ1ZSB9XG4gICAgfSxcbiAgICBzZWFyY2hRdWVzdGlvbm5haXJlcyA6IHsgbWlubGVuZ3RoOiAzLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIFF1ZXN0aW9uIDpcbiAgICB7XG4gICAgICAgIHRleHQ6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgIHJhbms6IHsgcmVxdWlyZWQ6IHRydWUsIG1pbjoxLCBkZWZhdWx0VmFsdWU6MSB9XG4gICAgfSwgICAgICAgICAgXG4gICAgQ2hvaWNlIDpcbiAgICB7XG4gICAgICAgIHRleHQ6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH1cbiAgICB9LCAgICAgICAgICBcbiAgICBuYlF1ZXN0aW9uc01pbjogMSxcbiAgICBuYlF1ZXN0aW9uc01heDogMTAsXG4gICAgbmJDaG9pY2VzTWF4OiAxMCxcbiAgICBuYlRhZ3NNaW46IDAsXG4gICAgbmJUYWdzTWF4OiAwLCAvLyAwID0gbm90IG1heCAgICBcbiAgICAvLyBKU09OIGFuZCBIVE1MIGRpclxuICAgIGRpckNhY2hlUXVlc3Rpb25uYWlyZXMgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzXCIsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbnMgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzL3F1ZXN0aW9uc1wiLFxuICAgIGRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlcyA6IFwiZGF0YXMvdXNlcnMvcXVlc3Rpb25uYWlyZXNcIixcbiAgICBkaXJDYWNoZVRhZ3MgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzL3RhZ3NcIiwgIFxuICAgIGRpckhUTUxRdWVzdGlvbm5haXJlIDogXCJmcm9udC9wdWJsaWMvcXVpelwiLFxuICAgIGRpckhUTUxUYWdzIDogXCJmcm9udC9wdWJsaWMvcXVpenNcIixcbiAgICBkaXJXZWJRdWVzdGlvbm5haXJlIDogXCJxdWl6XCIsLy9wb3VyIHVybCBwYWdlXG4gICAgZGlyV2ViVGFncyA6IFwicXVpenNcIi8vIGlkZW1cbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIC8vIEFQSSdyb3V0ZXMgKGFmdGVyIFwiYXBpVXJsXCIgZGVmaW5lZCBpbiBpbnN0YW5jZS5qcylcbiAgICB1c2VyUm91dGVzOiBcIi91c2VyXCIsXG4gICAgc3Vic2NyaWJlUm91dGU6IFwiL3NpZ251cFwiLFxuICAgIGdldEdvZGZhdGhlclJvdXRlOiBcIi9nZXRnb2RmYXRoZXJpZFwiLFxuICAgIGNoZWNrSWZJc0VtYWlsZnJlZVJvdXRlOiBcIi9pc2VtYWlsZnJlZVwiLFxuICAgIGNoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZTogXCIvdmFsaWRhdGlvbi9cIixcbiAgICBjaGVja0xvZ2luUm91dGU6IFwiL2NoZWNrbG9naW4vXCIsXG4gICAgY29ubmVjdGlvblJvdXRlOiBcIi9sb2dpblwiLFxuICAgIGdldExvZ2luTGlua1JvdXRlOiBcIi9nZXRsb2dpbmxpbmtcIixcbiAgICBjb25uZWN0aW9uV2l0aExpbmtSb3V0ZTogXCIvY2hlY2tsb2dpbmxpbmtcIixcbiAgICBnZXRVc2VySW5mb3M6IFwiL2dldC9cIixcbiAgICBjcmVhdGVVc2VyUm91dGU6IFwiL2NyZWF0ZVwiLFxuICAgIHZhbGlkYXRlVXNlclJvdXRlOiBcIi92YWxpZGF0ZS9cIixcbiAgICB1cGRhdGVVc2VySW5mb3M6IFwiL21vZGlmeS9cIixcbiAgICBzZWFyY2hVc2VyUm91dGU6IFwiL3NlYXJjaC9cIixcbiAgICBnZXRHb2RDaGlsZHM6IFwiL2dldGdvZGNoaWxkcy9cIixcbiAgICBjaGVja05ld0xvZ2luTGlua1JvdXRlOiBcIi9jb25maXJtbmV3bG9naW4vXCIsXG4gICAgY2hlY2tEZWxldGVMaW5rUm91dGU6IFwiL2NvbmZpcm1kZWxldGUvXCIsXG4gICAgZ2V0UGF5bWVudHM6IFwiL3BheW1lbnQvZ2V0Zm9yb25ldXNlci9cIixcbiAgICB1bnN1YnNjcmliZVJvdXRlOiBcIi9zdWJzY3JpcHRpb24vc3RvcC9cIixcbiAgICBnZXRBZG1pblN0YXRzOiBcIi9nZXRhZG1pbnN0YXRzL1wiLFxuICAgIC8vIGZvcm1zIDogw6AgY29tcGzDqXRlciBhdmVjIHZhbGV1cnMgcGFyIGTDqWZhdXQsIGV0Yy4gY2YgbW9kw6hsZVxuICAgIG5hbWU6IHsgbWF4bGVuZ3RoOiA3MCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBlbWFpbDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBwYXNzd29yZDogeyBtaW5sZW5ndGg6IDgsIG1heGxlbmd0aDo3MiwgcmVxdWlyZWQ6IHRydWUgfSwgLy8gaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvYmNyeXB0I3NlY3VyaXR5LWlzc3Vlcy1hbmQtY29uY2VybnNcbiAgICBuZXdQYXNzd29yZDogeyBtaW5sZW5ndGg6IDgsIG1heGxlbmd0aDo3MiB9LFxuICAgIGNvZGVHb2RmYXRoZXI6IHsgbWF4bGVuZ3RoOiAyNTUgfSxcbiAgICBjZ3VPazogeyB2YWx1ZTogXCJ0cnVlXCIsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgdGltZURpZmZlcmVuY2VNaW46IC03MjAsXG4gICAgdGltZURpZmZlcmVuY2VNYXg6ODQwLFxuICAgIC8vIEpTT04gZGlyXG4gICAgZGlyQ2FjaGVVc2VycyA6IFwiZGF0YXMvdXNlcnNcIixcbiAgICBkaXJDYWNoZVVzZXJzQW5zd2VycyA6IFwiZGF0YXMvdXNlcnMvcXVlc3Rpb25uYWlyZXMvYW5zd2Vyc1wiXG59O1xuIiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL2dlbmVyYWxcIjogXCIuLi9sYW5nL2ZyL2dlbmVyYWwuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9nZW5lcmFsJFwiOyIsInZhciBtYXAgPSB7XG5cdFwiLi9mci91c2VyXCI6IFwiLi4vbGFuZy9mci91c2VyLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvdXNlciRcIjsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgc2l0ZUhUTUxUaXRsZSA6IFwiV2lraUxlcm5pIDogcXUnYWxsZXotdm91cyBhcHByZW5kcmUgYXVqb3VyZCdodWkgP1wiLFxuICAgIHNpdGVNZXRhRGVzY3JpcHRpb24gOiBcIkNoYXF1ZSBqb3VyLCB0ZXN0ZXogdm9zIGNvbm5haXNzYW5jZXMgZXQgYXBwcmVuZXogZGUgbm91dmVsbGVzIGNob3NlcyBhdmVjIFdpa2lMZXJuaS5cIixcbiAgICBzY3JpcHRUaW1pbmdJbmZvIDogXCJEdXLDqWUgZGUgbGEgcsOpcG9uc2UgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNjcmlwdFRpbWluZ0FsZXJ0IDogXCIqKiogU2NyaXB0IGxlbnQgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNlcnZlckVycm9yIDogXCJEw6lzb2zDqS4gVW5lIGVycmV1ciBpbXByw6l2dWUgZXN0IHN1cnZlbnVlLiBTaSBjZWxhIHBlcnNpc3RlLCBuJ2jDqXNpdGV6IMOgIHByw6l2ZW5pciBsJ2FkbWluaXN0cmF0ZXVyIGR1IHNpdGUuXCIsXG4gICAgc2VydmVyRXJyb3JBZG1pbiA6IFwiQnVnIGRlIGwnYXBwbGljYXRpb24gOlwiLFxuICAgIG5lZWRlZFBhcmFtcyA6IFwiRGVzIHBhcmFtw6h0cmVzIG7DqWNlc3NhaXJlcyBtYW5xdWFudHMgc29udCBtYW5xdWFudHMuXCIsXG4gICAgYmFkVXJsIDogXCJUZW50YXRpdmUgZCdhY2PDqHMgw6AgdW5lIHBhZ2UgbidleGlzdGFudCBwYXMgOlwiLFxuICAgIG5vdFZhbGlkRm9ybWF0IDogXCJGb3JtYXQgbm9uIHZhbGlkZS5cIixcbiAgICBub3RBbGxvd2VkIDogXCJWb3VzIG4nYXZleiBwYXMgbGVzIGRyb2l0cyBuw6ljZXNzYWlyZXMgcG91ciBjZXR0ZSBhY3Rpb24uXCIsXG4gICAgbm90UmVxdWlyZWQgOiBcIkZhY3VsdGF0aWYuXCIsXG4gICAgdXBkYXRlQnRuVHh0OiBcIk1vZGlmaWVyXCIsXG4gICAgYWRkQnRuVHh0OiBcIkFqb3V0ZXJcIixcbiAgICBkZWxldGVCdG5UeHQ6IFwiU3VwcHJpbWVyXCIsXG4gICAgYWRkT2tNZXNzYWdlIDogXCJMZXMgZG9ubsOpZXMgb250IGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llcy5cIixcbiAgICB1cGRhdGVPa01lc3NhZ2UgOiBcIkxhIG1pc2Ugw6Agam91ciDDoCBqb3VyIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgZGVsZXRlT2tNZXNzYWdlIDogXCJMYSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIGZhaWxBdXRoIDogXCJFcnJldXIgZCdhdXRoZW50aWZpY2F0aW9uLlwiLFxuICAgIGZhaWxBdXRoSGVhZGVyIDogXCJBYnNlbmNlIGRlIGhlYWRlciBBdXRob3JpemF0aW9uLlwiLFxuICAgIGZhaWxBdXRoVG9rZW4gOiBcIlRva2VuIGludmFsaWRlIG91IHV0aWxpc2F0ZXVyIG5vbiB0cm91dsOpLlwiLFxuICAgIGZhaWxBdXRoSWQgOiBcIklkZW50aWZpYW50IG5vbiB2YWxpZGUgOiBcIixcbiAgICBmYWlsQXV0aENyb24gOiBcIlRlbnRhdGl2ZSBkZSBsYW5jZW1lbnQgZCd1biBjcm9uIHNhbnMgbGUgYm9uIHRva2VuLlwiLFxuICAgIHByZXZpb3VzUGFnZSA6IFwiUGFnZSBwcsOpY8OpZGVudGVcIixcbiAgICBuZXh0UGFnZSA6IFwiUGFnZSBzdWl2YW50ZVwiLFxuICAgIGJ0bkxpbmtUb1F1ZXN0aW9ubmFpcmUgOiBcIkFsbGVyIGF1IHF1aXogIVwiLFxuICAgIHN0YXRzQWRtaW4gOiBcIkR1cmFudCBsZXMgZGVybmnDqHJlcyAyNGggOiBOQl9VU0VSU18yNEggY29tcHRlcyBvbnQgw6l0w6kgY3LDqcOpcywgTkJfU1VCU0NSSVBUSU9OU18yNEggdmFsaWTDqXMgZXQgTkJfVVNFUlNfREVMRVRFRF8yNEggc3VwcHJpbcOpcy4gTkJfQU5TV0VSU18yNEggcsOpcG9uc2VzIGF1eCBxdWl6cyBvbnQgw6l0w6kgZW5yZWdpc3Ryw6llcy48YnI+RW4gdG91dCwgaWwgeSBhIDogTkJfVVNFUlNfVE9UIGNvbXB0ZXMsIGRvbnQgTkJfU1VCU0NSSVBUSU9OU19UT1QgdmFsaWTDqXMgZXQgTkJfU1VCU0NSSVBUSU9OU19QUkVNSVVNIGNvbXB0ZXMgcHLDqW1pdW0uIE5CX0FOU1dFUlNfVE9UIHLDqXBvbnNlcyBhdXggcXVpenMgb250IMOpdMOpIGVucmVnaXN0csOpZXMuPGJyPlBhcm1pIGxlcyBOQl9VU0VSU19ERUxFVEVEX1RPVCBjb21wdGVzIHN1cHByaW3DqXMsIE5CX1VTRVJTX0RFTEVURURfVkFMSURFRCBhdmFpZW50IHZhbGlkw6kgbGV1ciBjb21wdGUgZXQgTkJfVVNFUlNfREVMRVRFRF9QUkVNSVVNIGF2YWllbnQgc291c2NyaXQgdW4gY29tcHRlIHByw6ltaXVtLlwiXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBub3RGb3VuZDogXCJMJ3V0aWxpc2F0ZXVyIG4nYSBwYXMgw6l0w6kgdHJvdXbDqS5cIixcbiAgICBuZWVkTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyLlwiLFxuICAgIG5lZWROb3RUb29Mb25nTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyIG5lIGNvbXB0YW50IHBhcyBwbHVzIGRlIDcwIGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRFbWFpbDogXCJNZXJjaSBkZSBzYWlzaXIgdm90cmUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgbmVlZFVuaXF1ZUVtYWlsOiBcIkwnYWRyZXNzZSBlLW1haWwgcXVlIHZvdXMgYXZleiBzYWlzaWUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcGFyIHVuIGF1dHJlIHV0aWxpc2F0ZXVyLiBTaSB2b3VzIGF2ZXogZMOpasOgIHVuIGNvbXB0ZSwgPGEgaHJlZj0nLyNVUkwnPmNsaXF1ZXotaWNpIHBvdXIgdm91cyBjb25uZWN0ZXI8L2E+LlwiLFxuICAgIG5lZWROb3RUb29Mb25nRW1haWw6IFwiTWVyY2kgZGUgc2Fpc2lyIHVuZSBhZHJlc3NlIGUtbWFpbCBuZSBjb21wdGFudCBwYXMgcGx1cyBkZSAyNTUgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZFBhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZS5cIixcbiAgICBuZWVkTG9uZ1Bhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZSBkJ2F1IG1vaW5zIE1JTl9MRU5HVEggY2FyYWN0w6hyZXMuXCIsXG4gICAgcGFzc3dvcmRDb3BpZWQ6IFwiTGUgbW90IGRlIHBhc3NlIGfDqW7DqXLDqSBhIMOpdMOpIGNvcGnDqSBkYW5zIGxlIHByZXNzZS1wYXBpZXIuIFZvdXMgcG91dmV6IGxlIHJlY29waWVyIG/DuSB2b3VzIGxlIHNvdWhhaXRlci5cIixcbiAgICBuZWVkU3RhdHVzIDogXCJJbCBtYW5xdWUgbGUgc3RhdHV0LlwiLFxuICAgIG5lZWRMYW5ndWFnZSA6IFwiSWwgbWFucXVlIGxlIGNvZGUgbGFuZ3VlLlwiLFxuICAgIG5lZWRWYWxpZExhc3RDb25uZWN0aW9uRGF0ZSA6IFwiTGEgZGF0ZSBkZSBkZXJuacOocmUgY29ubmV4aW9uIG4nZXN0IHBhcyB2YWxpZGUuXCIsXG4gICAgbmVlZFNNVFAgOiBcIklsIG1hbnF1ZSBsZSBzZXJ2ZXVyIFNNVFAuXCIsXG4gICAgbmVlZFNNVFBOb3RGb3VuZCA6IFwiSWwgbWFucXVlIGxlIHNlcnZldXIgU01UUC5cIixcbiAgICBuZWVkS25vd05ld3NsZXR0ZXJPayA6IFwiSWwgZmF1dCBzYXZvaXIgc2kgbCd1dGlsaXNhdGV1ciBhY2NlcHRlIG91IHJlZnVzZSBkZSByZWNldm9pciBsYSBuZXdzbGV0dGVyLlwiLFxuICAgIG5lZWRUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBjb25uYcOudHJlIGxlIG5vbWJyZSBkZSBtaW51dGVzIGR1IGTDqWNhbGFnZSBob3JhaXJlLlwiLFxuICAgIG5lZWRNaW5UaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGVubGV2ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgNzIwLlwiLFxuICAgIG5lZWRNYXhUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGFqb3V0ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgODQwLlwiLFxuICAgIG5lZWRVR0NPayA6IFwiVm91cyBkZXZleiBhY2NlcHRlciBsZXMgQ0dVIHBvdXIgcG91dm9pciBjcsOpZXIgdm90cmUgY29tcHRlLiBcIixcbiAgICBnb2RmYXRoZXJOb3RGb3VuZDogXCJBdWN1biB1dGlsaXNhdGV1ciB2YWxpZGUgdHJvdXbDqSBwb3VyIGNlIGNvZGUgcGFycmFpbi5cIixcbiAgICBnb2RmYXRoZXJGb3VuZDogXCJWb3RyZSBwYXJyYWluIGEgYmllbiDDqXTDqSB0cm91dsOpICFcIixcbiAgICBtYWlsVmFsaWRhdGlvbk1lc3NhZ2U6IFwiVm90cmUgaW5zY3JpcHRpb24gZXN0IGJpZW4gZW5yZWdpc3Ryw6llLlxcblBvdXIgbGEgZmluYWxpc2VyLCBtZXJjaSBkZSBjbGlxdWVyIGRhbnMgbGVzIDI0SCBzdXIgbGUgbGllbiBkZSBjb25maXJtYXRpb24gcXVpIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBwYXIgZS1tYWlsLlwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1N1YmplY3QgOiBcIk1lcmNpIGRlIHZhbGlkZXIgdm90cmUgY29tcHRlXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblBvdXIgdmFsaWRlciB2b3RyZSBjb21wdGUsIG1lcmNpIGRlIGNsaXF1ZXIgc3VyIGxlIGxpZW4gc3VpdmFudCBkYW5zIGxlcyAyNGggOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm90cmUgY29tcHRlLCBtZXJjaSBkZSBjbGlxdWVyIHN1ciBsZSBsaWVuIHN1aXZhbnQgZGFucyBsZXMgMjRoLjwvcD48cD48YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+VmFsaWRlci48L2E+PC9wPlwiLFxuICAgIHZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGNvbXB0ZSB2aWVudCBiaWVuIGQnw6p0cmUgdmFsaWTDqS4gTWVyY2kgZXQgYmllbnZlbnVlICE8YnI+Vm91cyBwb3V2ZXogc2FucyB0YXJkZXIgdm91cyBjb25uZWN0ZXIgY2ktZGVzc291cyBwb3VyIGFjY8OpZGVyIMOgIHZvdHJlIGNvbXB0ZS5cIixcbiAgICB2YWxpZGF0aW9uTWVzc2FnZUFkbWluOiBcIkxlIGNvbXB0ZSBhIGJpZW4gw6l0w6kgdmFsaWTDqS5cIixcbiAgICB2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2U6IFwiSWwgc2VtYmxlIHF1ZSB2b3VzIGF5ZXogZMOpasOgIHZhbGlkw6kgdm90cmUgY29tcHRlLlwiLFxuICAgIHZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZUFkbWluOiBcIkNlIGNvbXB0ZSBhIGTDqWrDoCDDqXTDqSB2YWxpZMOpLlwiLFxuICAgIG1haWxXZWxjb21lU3ViamVjdCA6IFwiQmllbnZlbnVlICFcIixcbiAgICBtYWlsV2VsY29tZUJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblZvdHJlIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuXFxuTWVyY2kgZXQgw6AgYmllbnTDtHQgIVwiLFxuICAgIG1haWxXZWxjb21lQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlZvdHJlIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuPC9wPjxwPk1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyU3ViamVjdCA6IFwiTWVyY2kgIVwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlckJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcbkdyw6JjZSDDoCB2b3VzIHVuIG5vdXZlbCB1dGlsaXNhdGV1ciAoRU1BSUwpIHZpZW50IGRlIHMnaW5zY3JpcmUgc3VyIE5PTV9TSVRFLlxcbk1lcmNpIGV0IMOgIGJpZW50w7R0ICFcIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+R3LDomNlIMOgIHZvdXMgdW4gbm91dmVsIHV0aWxpc2F0ZXVyIChFTUFJTCkgdmllbnQgZGUgcydpbnNjcmlyZSBzdXIgTk9NX1NJVEUuPC9wPjxwPk1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGxpZW4gZGUgY29uZmlybWF0aW9uIG5lIHNlbWJsZSBwYXMgdmFsaWRlIG91IGJpZW4gaWwgYSBleHBpcsOpLiBWb3VzIHBvdXZleiBlbiByZWNldm9pciB1biBub3V2ZWF1IDxhIGhyZWY9JyNVUkwnPmVuIGNsaXF1YW50IGljaTwvYT4uXCIsXG4gICAgZW1haWxOb3RGb3VuZDogXCJBdWN1biB1dGlsaXNhdGV1ciB0cm91dsOpIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgYWxyZWFkeUNvbm5lY3RlZDogXCJWb3VzIMOqdGVzIGTDqWrDoCBjb25uZWN0w6koZSkgYXUgc2l0ZSAhXCIsXG4gICAgbmVlZEJlQ29ubmVjdGVkOiBcIlZvdXMgZGV2ZXogw6p0cmUgY29ubmVjdMOpKGUpIHBvdXIgYWNjw6lkZXIgw6AgY2V0dGUgcGFnZS5cIixcbiAgICBjb25uZWN0aW9uT2s6IFwiQ29ubmV4aW9uIHLDqXVzc2llLlwiLFxuICAgIG5lZWRDaG9vc2VMb2dpbldheTogXCJWb3VzIGRldmV6IHNvaXQgc2Fpc2lyIHZvdHJlIG1vdCBkZSBwYXNzZSwgc29pdCBjb2NoZXIgbGEgY2FzZSB2b3VzIHBlcm1ldHRhbnQgZGUgcmVjZXZvaXIgdW4gbGllbiBkZSBjb25uZXhpb24gcGFyIGUtbWFpbC5cIixcbiAgICBuZWVkVmFsaWRhdGlvblRvTG9naW4gOiBcIlZvdXMgZGV2ZXogZCdhYm9yZCB2YWxpZGVyIHZvdHJlIGNvbXB0ZSBhdmFudCBkZSB2b3VzIGNvbm5lY3Rlci4gUG91ciBjZSBmYWlyZSwgdW4gbGllbiB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbC5cIixcbiAgICB0b29NYW55TG9naW5GYWlscyA6IFwiVHJvcCBkZSB0ZW50YXRpdmVzIGRlIGNvbm5leGlvbiBpbmZydWN0dWV1c2VzIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuIFZvdXMgZGV2ZXogYXR0ZW5kcmUgTUlOVVRFUyBtaW51dGVzIHBvdXIgZXNzYXllciBkZSBub3V2ZWF1LlwiLFxuICAgIGJhZFBhc3N3b3JkOiBcIkxlIG1vdCBkZSBwYXNzZSBuJ2VzdCBwYXMgbGUgYm9uLlwiLFxuICAgIG1haWxMb2dpbkxpbmtTdWJqZWN0IDogXCJWb3RyZSBsaWVuIGRlIGNvbm5leGlvbi5cIixcbiAgICBtYWlsTG9naW5MaW5rQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuUG91ciB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6IExJTktfVVJMXCIsXG4gICAgbWFpbExvZ2luTGlua0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZvdXMgY29ubmVjdGVyIMOgIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDo8L3A+PHA+PGEgaHJlZj1cXFwiTElOS19VUkxcXFwiPlZhbGlkZXIuPC9hPjwvcD5cIixcbiAgICBtYWlsTG9naW5MaW5rTWVzc2FnZSA6IFwiVW4gbGllbiBkZSBjb25uZXhpb24gdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHN1ciB2b3RyZSBhZHJlc3NlIGUtbWFpbC4gTmUgdGFyZGV6IHBhcyDDoCBsJ3V0aWxpc2VyLCBjYXIgaWwgbidlc3QgdmFsYWJsZSBxdWUgZHVyYW50IFwiLFxuICAgIHVwZGF0ZWRPa01lc3NhZ2U6IFwiVm9zIGluZm9ybWF0aW9ucyBvbnQgYmllbiDDqXTDqSBtaXNlcyDDoCBqb3VyLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEVtYWlsIDogXCJNYWlzIGxhIG5vdXZlbGxlIGFkcmVzc2UgZS1tYWlsIG4nYSBwdSDDqnRyZSBlbnJlZ2lzdHLDqWUgY2FyIGVsbGUgbidhIHBhcyB1bmUgZm9ybWF0IGNvcnJlY3QuXCIsXG4gICAgdXBkYXRlZE5lZWRVbmlxdWVFbWFpbCA6IFwiTWFpcyBsYSBub3V2ZWxsZSBhZHJlc3NlIGUtbWFpbCBzYWlzaWUgKE5FV19FTUFJTCkgbidhIHB1IMOqdHJlIGVucmVnaXN0csOpZSwgY2FyIGVsbGUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcG91ciB1biBhdXRyZSBjb21wdGUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luU3ViamVjdCA6IFwiTWVyY2kgZGUgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblBvdXIgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cyBkZSBjb25uZXhpb24sIDxhIGhyZWY9XFxcIkxJTktfVVJMXFxcIj5jbGlxdWV6IGljaTwvYT4gc2FucyB0YXJkZXIuPC9wPlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkxpbmtNZXNzYWdlOiBcIkNlcGVuZGFudCwgdm91cyBhdmV6IG1vZGlmacOpIGF1IG1vaW5zIHVuIGRlIHZvcyBpZGVudGlmaWFudHMgZGUgY29ubmV4aW9uIChlbWFpbCBldC9vdSBtb3QgZGUgcGFzc2UpIGV0IDxiPnZvdXMgZGV2ZXogY2xpcXVlciBzdXIgbGUgbGllbiBxdWkgdmllbnQgZGUgdm91cyDDqnRyZXMgZW52b3nDqSBzdXIgdm90cmUgYWRyZXNzZSAoTkVXX0VNQUlMKSBwb3VyIHZhbGlkZXIgY2UgY2hhbmdlbWVudDwvYj4uIEVuIGF0dGVuZGFudCwgbWVyY2kgZGUgY29udGludWVyIMOgIHV0aWxpc2VyIHZvcyBhbmNpZW5zIGlkZW50aWZpYW50cy5cIixcbiAgICB1cGRhdGVkTmVlZFZhbGlkYXRlZFVzZXI6IFwiTCd1dGlsaXNhdGV1ciBxdWUgdm91cyBzb3VoYWl0w6kgbW9kaWZpZXIgbidleGlzdGUgcGFzL3BsdXMgb3UgbidhIHBhcyBlbmNvcmUgdmFsaWTDqSBzb24gY29tcHRlLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEdvZGZhdGhlciA6IFwiTWFpcyBsZSBub3V2ZWF1IGNvZGUgcGFycmFpbiBuJ2EgcHUgw6p0cmUgcmV0ZW51LCBjYXIgaWwgbmUgY29ycmVzcG9uZCDDoCBhdWN1biBjb21wdGUgdXRpbGlzYXRldXIgb3Ugw6AgbCd1dGlsaXNhdGV1ciBsdWktbcOqbWUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luT2tNZXNzYWdlOiBcIkxhIG1pc2Ugw6Agam91ciBkZSB2b3MgaWRlbnRpZmlhbnRzIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgdXBkYXRlZEZhaWxlZEdvZGZhdGhlck5vdEZvdW5kIDogXCJMJ2lkZW50aWZpYW50IGZvdXJuaSBwb3VyIGxlIHBhcnJhaW4gbmUgY29ycmVzcG9uZCDDoCBhdWN1biB1dGlsaXNhdGV1ci5cIixcbiAgICBjcmVhdGlvbk9rTWVzc2FnZTogXCJMZSBub3V2ZWwgdXRpbGlzYXRldXIgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpLlwiLFxuICAgIG1haWxEZWxldGVTdWJqZWN0IDogXCJDb25maXJtZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLlwiLFxuICAgIG1haWxEZWxldGVCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5Qb3VyIHZhbGlkZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbERlbGV0ZUJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCA8YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+Y2xpcXVleiBpY2k8L2E+IHNhbnMgdGFyZGVyLjwvcD5cIixcbiAgICBtYWlsRGVsZXRlTGlua01lc3NhZ2U6IFwiVm90cmUgZGVtYW5kZSBkZSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLiBNZXJjaSBkZSBjbGlxdWVyIHNhbnMgdGFyZGVyIHN1ciBsZSBsaWVuIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbCBwb3VyIGNvbmZpcm1lci5cIixcbiAgICBkZWxldGVPa01lc3NhZ2U6IFwiTCd1dGlsaXNhdGV1ciBhIGJpZW4gw6l0w6kgc3VwcHJpbcOpLlwiLFxuICAgIGRlbGV0ZUZhaWxNZXNzYWdlOiBcIlRlbnRhdGl2ZSBkZSBzdXBwcmVzc2lvbiBkJ3VuIHV0aWxpc2F0ZXVyIGluZXhpc3RhbnQgOiBcIixcbiAgICBtYWlsRGVsZXRlTGlua09rTWVzc2FnZTogXCJWb3RyZSBjb21wdGUgYSBiaWVuIMOpdMOpIHN1cHByaW3DqS4gTWVyY2kgZCdhdm9pciB1dGlsaXPDqSBub3Mgc2VydmljZXMuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtBbHJlYWR5TWVzc2FnZTogXCJJbCBzZW1ibGUgcXVlIHZvdXMgYXlleiBkw6lqw6AgdmFsaWTDqSBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtGYWlsTWVzc2FnZTogXCJWb3RyZSBsaWVuIGRlIHN1cHByZXNzaW9uIG4nZXN0IHBhcyB2YWxpZGUgb3UgYWxvcnMgaWwgbidlc3QgcGx1cyB2YWxhYmxlLlwiLFxuICAgIGNyb25EZWxldGVVbnZhbGlkZWRVc2Vyc01lc3NhZ2U6IFwiIGNvbXB0ZXMgdXRpbGlzYXRldXJzIG5vbiB2YWxpZMOpcyBvbnQgw6l0w6kgc3VwcHJpbcOpcy5cIixcbiAgICBkZWxldGVJbmFjdGl2ZVVzZXJzTWVzc2FnZTogXCIgY29tcHRlcyB1dGlsaXNhdGV1cnMgaW5hY3RpZnMgb250IMOpdMOpIHN1cHByaW3DqXMuXCIsXG4gICAgd2VsY29tZU1lc3NhZ2U6IFwiQmllbnZlbnVlICNOQU1FICFcIixcbiAgICBieWVieWVNZXNzYWdlOiBcIlNpIHZvdXMgdm95ZXogY2UgbWVzc2FnZSwgYydlc3QgcXVlIHZvdHJlIGTDqWNvbm5leGlvbiBzJ2VzdCBiaWVuIGTDqXJvdWzDqWUuPGJyPsOAIGJpZW50w7R0ICFcIixcbiAgICBpbmZvc1VzZXJGb3JBZG1pbjogXCJDZXQgdXRpbGlzYXRldXIgKGlkOiBJRF9VU0VSKSBhIDxiPmNyw6nDqSBzb24gY29tcHRlIGxlIERBVEVfQ1JFQTwvYj4sIGxhIGRlcm5pw6hyZSBtaXNlIMOgIGpvdXIgZGF0YW50IGR1IERBVEVfVVBEQVRFLjxicj48Yj5EYXRlIGRlIHNhIGRlcm5pw6hyZSBjb25uZXhpb24gOiBEQVRFX0NPTk5FQ1RJT04uPC9iPlwiLFxuICAgIGluZm9zQWRtaW5Hb2RmYXRoZXI6IFwiQ2V0IHV0aWxpc2F0ZXVyIGEgw6l0w6kgcGFycmFpbsOpIHBhciBcIixcbiAgICBpbmZvc0FkbWluTmJHb2RDaGlsZHM6IFwiU2VzICNOQiBmaWxsZXVpbHMgOiBcIlxufTsiLCIvLyBRdWVscXVlcyBmb25jdGlvbnMgdXRpbGVzIHBvdXIgbGVzIGNoYcOubmVzXG5cbmNsYXNzIFRvb2xcbntcbiAgICBzdGF0aWMgaXNFbXB0eShteVZhcilcbiAgICB7XG4gICAgICAgIGlmKG15VmFyPT09dW5kZWZpbmVkIHx8IG15VmFyPT09bnVsbClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIG15VmFyKz1cIlwiOy8vIHNpIGF1dHJlIGNob3NlIHF1J3VuZSBjaGHDrm5lIGVudm95w6kuLi5cbiAgICAgICAgICAgIG15VmFyPW15VmFyLnRyaW0oKTtcbiAgICAgICAgICAgIGlmKG15VmFyPT09XCJcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgc3RhdGljIHRyaW1JZk5vdE51bGwobXlTdHJpbmcpXG4gICAge1xuICAgICAgICBpZihUb29sLmlzRW1wdHkobXlTdHJpbmcpKVxuICAgICAgICAgICAgbXlTdHJpbmc9bnVsbDtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVN0cmluZys9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVN0cmluZz1teVN0cmluZy50cmltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG15U3RyaW5nO1xuICAgIH1cblxuXG4gICAgc3RhdGljIHNob3J0ZW5JZkxvbmdlclRoYW4obXlTdHJpbmcsIG1heClcbiAgICB7XG4gICAgICAgIG15U3RyaW5nKz1cIlwiOy8vIGF1IGNhcyBvw7kgY2VsYSBuZSBzZXJhaXQgcGFzIHVuZSBjaGHDrm5lLi4uXG4gICAgICAgaWYobXlTdHJpbmcubGVuZ3RoID4gbWF4KVxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcuc3Vic3RyaW5nKDAsIChtYXgtMykpK1wiLi4uXCI7XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cbiAgICAvLyBzb3VyY2UgOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNTYwNDE0MC9yZXBsYWNlLW11bHRpcGxlLXN0cmluZ3Mtd2l0aC1tdWx0aXBsZS1vdGhlci1zdHJpbmdzXG4gICAgc3RhdGljIHJlcGxhY2VBbGwobXlTdHJpbmcsIG1hcE9iailcbiAgICB7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VFbHRzID0gbmV3IFJlZ0V4cChPYmplY3Qua2V5cyhtYXBPYmopLmpvaW4oXCJ8XCIpLFwiZ2lcIik7XG4gICAgICAgIHJldHVybiBteVN0cmluZy5yZXBsYWNlKHJlcGxhY2VFbHRzLCAobWF0Y2hlZCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG1hcE9ialttYXRjaGVkXTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZnIvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT2JqZXRzX2dsb2JhdXgvTWF0aC9yYW5kb21cbiAgICBzdGF0aWMgZ2V0UmFuZG9tSW50KG1pbiwgbWF4KVxuICAgIHtcbiAgICAgICAgbWluID0gTWF0aC5jZWlsKG1pbik7XG4gICAgICAgIG1heCA9IE1hdGguZmxvb3IobWF4KTtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pKSArIG1pbjtcbiAgICB9XG5cbiAgICAvLyDDoCBjb21wbMOpdGVyIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGF0ZV9mb3JtYXRfYnlfY291bnRyeVxuICAgIHN0YXRpYyBkYXRlRm9ybWF0KGRhdGVTdHJpbmcsIGxhbmc9XCJmclwiKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KGRhdGVTdHJpbmcpKVxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIGxldCBteURhdGU9bmV3IERhdGUoZGF0ZVN0cmluZyk7XG4gICAgICAgIGxldCBteURheT1teURhdGUuZ2V0RGF0ZSgpK1wiXCI7XG4gICAgICAgIGlmKG15RGF5Lmxlbmd0aD09PTEpXG4gICAgICAgICAgICBteURheT1cIjBcIitteURheTtcbiAgICAgICAgbGV0IG15TW91bnRoPShteURhdGUuZ2V0TW9udGgoKSsxKStcIlwiO1xuICAgICAgICBpZihteU1vdW50aC5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlNb3VudGg9XCIwXCIrbXlNb3VudGg7XG4gICAgICAgIGxldCBteVllYXI9bXlEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGlmKGxhbmc9PT1cImZyXCIpXG4gICAgICAgICAgICByZXR1cm4gbXlEYXkrXCIvXCIrbXlNb3VudGgrXCIvXCIrbXlZZWFyO1xuICAgICAgICBlbHNlIGlmIChsYW5nPT09XCJmb3JtXCIpLy8gMjAxNC0wMi0wOVxuICAgICAgICAgICAgcmV0dXJuIG15WWVhcitcIi1cIitteU1vdW50aCtcIi1cIitteURheTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG15TW91bnRoK1wiL1wiK215RGF5K1wiL1wiK215WWVhcjtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVG9vbDsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZGVmYXVsdC9jb25maWcvZnIuanNcIjogXCIuLi92aWV3cy9kZWZhdWx0L2NvbmZpZy9mci5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi92aWV3cyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC5qcyRcIjsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgaGVhZExpbmtzOlxuICAgIFtcbiAgICAgICAgeyBhbmNob3I6IFwiQWNjdWVpbFwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNb24gY29tcHRlXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb25uZXhpb24uaG10XCIsIGlkOiBcImFjY291bnRIZWFkTGlua1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiw4AgcHJvcG9zXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9hLXByb3Bvcy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDb250YWN0XCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb250YWN0Lmh0bWxcIiB9IH0sXG4gICAgXSxcbiAgICBmb290TGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJDcsOpZGl0c1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY3JlZGl0cy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNZW50aW9ucyBsw6lnYWxlc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvbWVudGlvbnMtbGVnYWxlcy5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiRG9ubsOpZXMgcGVyc29ubmVsbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9kb25uZWVzLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkMuRy5VLlwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY2d1Lmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDLkcuVi5cIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nndi5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICBdLFxuICAgIG1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlOiAxMCxcbiAgICB1c2VySG9tZVBhZ2UgOiBcImFjY3VlaWwuaHRtbFwiLFxuICAgIGFkbWluSG9tZVBhZ2UgOiBcImFkbWluLmh0bWxcIixcbiAgICBtYW5hZ2VySG9tZVBhZ2UgOiBcImdlc3Rpb24uaHRtbFwiLFxuICAgIHN1YnNjcmliZVBhZ2UgOiBcImluc2NyaXB0aW9uLmh0bWxcIixcbiAgICBjb25uZWN0aW9uUGFnZSA6IFwiY29ubmV4aW9uLmh0bWxcIixcbiAgICBhY2NvdW50UGFnZTogXCJjb21wdGUuaHRtbFwiLFxuICAgIHF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi1xdWl6cy5odG1sXCIsXG4gICAgdXNlcnNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXV0aWxpc2F0ZXVycy5odG1sXCIsXG4gICAgbmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSA6IDEwLFxuICAgIGlsbHVzdHJhdGlvbkRpciA6IFwiL2ltZy9xdWl6cy9cIixcbiAgICBzaXRlU2xvZ2FuOiBcIkN1bHRpdm9ucyBub3RyZSBqYXJkaW4gIVwiLFxuICAgIGhvbWVUaXRsZTE6IFwiRGUgbmF0dXJlIGN1cmlldXNlID9cIixcbiAgICBob21lUDE6IFwiQXZlYyBXaWtpTGVybmkgdm91cyBhcHByZW5leiBjaGFxdWUgam91ciBkZSBub3V2ZWxsZXMgY2hvc2VzLjxicj5EZXMgYXJ0aWNsZXMgZGUgV2lraXDDqWRpYSBzb250IHPDqWxlY3Rpb25uw6lzIHBvdXIgdm91cyBldCBzb250IHN1aXZpcyBkJ3VuIHF1aXogdm91cyBwZXJtZXR0YW50IGRlIHRlc3RlciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudS48YnI+RGUgam91ciBlbiBqb3VyIGRlIG5vdXZlbGxlcyBncmFpbmVzIGRlIHNhdm9pciBzb250IGFpbnNpIHNlbcOpZXMgZGFucyB2b3RyZSBcXFwiamFyZGluXFxcIi5cIixcbiAgICBob21lVGl0bGUyOiBcIkxhIGN1bHR1cmUgZW4gbGliZXJ0w6lcIixcbiAgICBob21lUDI6IFwiVG91dCBjb21tZSBzdXIgV2lraXDDqWRpYSAoKiksIGxlIGxvZ2ljaWVsIGV0IGxlIGNvbnRlbnUgcGFydGFnw6kgc3VyIFdpa2lMZXJuaSBzb250IGxpYnJlcy48YnI+Vm91cyBwb3V2ZXogbGVzIHV0aWxpc2VyLCBsZXMgbW9kaWZpZXIgZXQgbGVzIGRpZmZ1c2VyIHNlbG9uIHZvdHJlIHNvdWhhaXQuPGJyPlN1ciBXaWtpTGVybmksIHBhcyBkZSBwdWJsaWNpdMOpLCBuaSBkZSBjb21tZXJjaWFsaXNhdGlvbiBkZSB2b3MgZG9ubsOpZXMgcGVyc29ubmVsbGVzLjxicj5Wb3VzIHBvdXZleiB2ZW5pciB5IFxcXCJjdWx0aXZlciB2b3RyZSBqYXJkaW5cXFwiIGVuIHRvdXRlIHRyYW5xdWlsbGl0w6kuPGJyPjxicj48c21hbGw+PGVtPigqKSBCaWVuIHF1ZSBwYXJ0YWdlYW50IHNlcyB2YWxldXJzLCBXaWtpTGVybmkgZXN0IHVuIHByb2pldCBpbmTDqXBlbmRhbnQgZGUgbGEgZm9uZGF0aW9uIFdpa2lww6lkaWEuPC9lbT48L3NtYWxsPlwiLFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzVGl0bGU6IFwiTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzIHN1ciBXaWtpTGVybmlcIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc0ludHJvOiBcIkxpc3RlIGRlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyBzdXIgV2lraUxlcm5pLlwiLFxuICAgIGV4cGxhbmF0aW9uVGl0bGU6IFwiVm91cyBkw6ljb3V2cmV6IFdpa2lMZXJuaSA/XCIsXG4gICAgZXhwbGFuYXRpb25UeHQ6IFwiTGUgcHJpbmNpcGUgZXN0IHNpbXBsZSA6IHZvdXMgY29tbWVuY2V6IHBhciBsaXJlIGwnYXJ0aWNsZSBXaWtpcMOpZGlhIGRvbnQgbGUgbGllbiB2b3VzIGVzdCBwcm9wb3PDqS48YnI+UHVpcyB2b3VzIGFmZmljaGVyIGxlIHF1aXogcG91ciB2w6lyaWZpZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUgZGUgdm90cmUgbGVjdHVyZS4gVm91cyBvYnRlbmV6IGFsb3JzIHZvdHJlIHLDqXN1bHRhdCBpbW3DqWRpYXRlbWVudC48YnI+PGJyPlRvdXRlcyBsZXMgcsOpcG9uc2VzIHNlIHRyb3V2ZW50IGRhbnMgbCdhcnRpY2xlIHByb3Bvc8OpIMOgIGxhIGxlY3R1cmUuIDxiPlZvdXMgw6p0ZXMgaWNpIHBvdXIgYXBwcmVuZHJlIGRlIG5vdXZlbGxlcyBjaG9zZXM8L2I+LCBtYWlzIGxpYnJlIMOgIHZvdXMgZCdlc3NheWVyIGQneSByw6lwb25kcmUgaW1tw6lkaWF0ZW1lbnQuPGJyPjxicj5RdWFuZCBsZSBzdWpldCBzJ3kgcHLDqnRlLCBuZSB2b3VzIMOpdG9ubmV6IHBhcyBzaSBjZXJ0YWluZXMgZGVzIHLDqXBvbnNlcyBwcm9wb3PDqWVzIHBldXZlbnQgw6p0cmUgdW4gcGV1IGTDqWNhbMOpZXMsIGFic3VyZGVzLi4uIE9uIHBldXQgYXBwcmVuZHJlIGF2ZWMgbGUgc291cmlyZSwgbm9uID8gOi0pPGJyPjxicj5VbmUgZm9pcyB2b3RyZSByw6lzdWx0YXQgb2J0ZW51LCBpbCB2b3VzIHNlcmEgcHJvcG9zw6kgZGUgY3LDqWVyIHVuIGNvbXB0ZSBwb3VyIGxlIHNhdXZlZ2FyZGVyLjxicj5DZSBjb21wdGUgdm91cyBwZXJtZXR0cmEgZGUgdGVzdGVyIGRlIG5vdXZlYXUgY2UgcXVpeiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudSBwbHVzaWV1cnMgam91cnMsIHNlbWFpbmVzLCBtb2lzLi4uIEV0IGRlIHJlY2V2b2lyIHLDqWd1bGnDqHJlbWVudCBkZSBub3V2ZWxsZXMgc3VnZ2VzdGlvbnMgZGUgbGVjdHVyZXMuPGJyPjxicj5NYWlzIDxiPmxhIGNyw6lhdGlvbiBkZSBjZSBjb21wdGUgZXN0IGZhY3VsdGF0aXZlPC9iPiBldCA8YSBocmVmPScvcXVpenMvJyB0aXRsZT0nTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzJz52b3VzIHBvdXZleiBwYXJjb3VyaXIgV2lraUxlcm5pIGxpYnJlbWVudDwvYT4uXCIsXG4gICAgbm9KU05vdGlmaWNhdGlvbjogXCJEw6lzb2zDqSwgbWFpcyBwb3VyIGwnaW5zdGFudCwgbCd1dGlsaXNhdGlvbiBkZSBXaWtpTGVybmkgbsOpY2Vzc2l0ZSBsJ2FjdGl2YXRpb24gZHUgSmF2YVNjcmlwdC5cIixcbn07IiwiLy8gLS0gR0VTVElPTiBEVSBGT1JNVUxBSVJFIFBFUk1FVFRBTlQgREUgQ1LDiUVSIFNPTiBDT01QVEVcblxuLy8vIEwndXRpbGlzYXRldXIgcGV1dCBhdm9pciByw6lwb25kdSDDoCB1biBxdWl6IGF2YW50IGQnYXJyaXZlciBzdXIgbGEgcGFnZSBkJ2luc2NyaXB0aW9uXG4vLy8gRGVzIGNlIGNhcyBpbCBmYXV0IGVucmVnaXN0cmVyIHNvbiByw6lzdWx0YXQgZW4gbcOqbWUgdGVtcHMgcXVlIGxlcyBpbmZvcm1hdGlvbnMgZGUgc29uIGNvbXB0ZVxuXG4vLyBGaWNoaWVyIGRlIGNvbmZpZ3VyYXRpb24gdGlyw6lzIGR1IGJhY2tlbmQgOlxuaW1wb3J0IHsgYXBpVXJsLCBhdmFpbGFibGVMYW5ncywgdGhlbWUgfSBmcm9tIFwiLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCI7XG5jb25zdCBsYW5nPWF2YWlsYWJsZUxhbmdzWzBdO1xuXG5jb25zdCBjb25maWdUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi8uLi92aWV3cy9cIit0aGVtZStcIi9jb25maWcvXCIrbGFuZytcIi5qc1wiKTtcbmNvbnN0IGNvbmZpZ1VzZXJzID0gcmVxdWlyZShcIi4uLy4uL2NvbmZpZy91c2Vyc1wiKTtcblxuLy8gSW1wb3J0YXRpb24gZGVzIGZvbmN0aW9ucyB1dGlsZSBhdSBzY3JpcHQgOlxuaW1wb3J0IHsgZ2V0TG9jYWx5LCByZW1vdmVMb2NhbHksIHNhdmVMb2NhbHkgfSBmcm9tIFwiLi90b29scy9jbGllbnRzdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyBhZGRFbGVtZW50IH0gZnJvbSBcIi4vdG9vbHMvZG9tLmpzXCI7XG5pbXBvcnQgeyBoZWxsb0RldiB9IGZyb20gXCIuL3Rvb2xzL2V2ZXJ5d2hlcmUuanNcIjtcbmltcG9ydCB7IGdldERhdGFzRnJvbUlucHV0cywgc2V0QXR0cmlidXRlc1RvSW5wdXRzIH0gZnJvbSBcIi4vdG9vbHMvZm9ybXMuanNcIjtcbmltcG9ydCB7IGNoZWNrQW5zd2VyRGF0YXMsIGNoZWNrU2Vzc2lvbiwgZ2V0Q29uZmlnLCBnZXRQYXNzd29yZCwgZ2V0VGltZURpZmZlcmVuY2UgfSBmcm9tIFwiLi90b29scy91c2Vycy5qc1wiO1xuXG4vLyBEaWN0aW9ubmFpcmVzIDpcbmNvbnN0IHR4dCA9IHJlcXVpcmUoXCIuLi8uLi9sYW5nL1wiK2xhbmcrXCIvZ2VuZXJhbFwiKTtcbmNvbnN0IHR4dFVzZXJzID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi91c2VyXCIpO1xuXG4vLyBQcmluY2lwYXV4IMOpbMOpbWVudHMgZHUgRE9NIG1hbmlwdWzDqXMgOlxuY29uc3QgbXlGb3JtPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic3Vic2NyaXB0aW9uXCIpO1xuY29uc3QgZGl2UmVzcG9uc2U9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJyZXNwb25zZVwiKTtcbmNvbnN0IHBhc3N3b3JkSW5wdXQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJwYXNzd29yZFwiKTtcbmNvbnN0IHBhc3N3b3JkTGluaz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImdldFBhc3N3b3JkXCIpO1xuY29uc3QgcGFzc3dvcmRIZWxwPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicGFzc3dvcmRNZXNzYWdlXCIpO1xuY29uc3QgZW1haWxJbnB1dD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImVtYWlsXCIpO1xuY29uc3QgYnRuU3VibWl0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic3VibWl0RGF0YXNcIik7XG5jb25zdCBjb2RlR29kZmF0aGVySW5wdXQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjb2RlR29kZmF0aGVyXCIpO1xuXG5oZWxsb0RldigpO1xuXG4vLyBUZXN0IGRlIGNvbm5leGlvbiBkZSBsJ3V0aWxpc2F0ZXVyICsgYWZmaWNoYWdlIGZvcm11bGFpcmUgZCdpbnNjcmlwdGlvbi5cbmNvbnN0IGluaXRpYWxpc2UgPSBhc3luYyAoKSA9Plxue1xuICAgIHRyeVxuICAgIHtcbiAgICAgICAgY29uc3QgaXNDb25uZWN0ZWQ9YXdhaXQgY2hlY2tTZXNzaW9uKCk7XG4gICAgICAgIGlmKGlzQ29ubmVjdGVkKVxuICAgICAgICB7XG4gICAgICAgICAgICBzYXZlTG9jYWx5KFwibWVzc2FnZVwiLCB7IG1lc3NhZ2U6IHR4dFVzZXJzLmFscmVhZHlDb25uZWN0ZWQsIGNvbG9yOlwiaW5mb3JtYXRpb25cIiB9KTsvLyBwb3VyIGwnYWZmaWNoZXIgc3VyIGxhIHBhZ2Ugc3VpdmFudGVcbiAgICAgICAgICAgIGNvbnN0IHVzZXI9Z2V0TG9jYWx5KFwidXNlclwiLCB0cnVlKTtcbiAgICAgICAgICAgIGNvbnN0IGhvbWVQYWdlPXVzZXIuc3RhdHVzK1wiSG9tZVBhZ2VcIjtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIvXCIrY29uZmlnVGVtcGxhdGVbaG9tZVBhZ2VdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHNldEF0dHJpYnV0ZXNUb0lucHV0cyhjb25maWdVc2VycywgbXlGb3JtKTtcbiAgICAgICAgICAgIG15Rm9ybS5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaChlKVxuICAgIHtcbiAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIH1cbn1cbmluaXRpYWxpc2UoKTtcblxuLy8gR8OpbsOpcmF0ZXVyIGRlIG1vdCBkZSBwYXNzZSBcImFsw6lhdG9pcmVcIlxucGFzc3dvcmRMaW5rLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbihlKVxue1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBwYXNzd29yZElucHV0LnR5cGU9XCJ0ZXh0XCI7XG4gICAgcGFzc3dvcmRJbnB1dC52YWx1ZT1nZXRQYXNzd29yZCg4LCAxMik7XG4gICAgLy8gY29waWUgZHUgbW90IGRlIHBhc3NlIGfDqW7DqXLDqSBkYW5zIGxlIHByZXNzZS1wYXBpZXJcbiAgICBwYXNzd29yZElucHV0LnNlbGVjdCgpO1xuICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiY29weVwiKTtcbiAgICBhZGRFbGVtZW50KHBhc3N3b3JkSGVscCwgXCJlbVwiLCB0eHRVc2Vycy5wYXNzd29yZENvcGllZCwgXCJcIiwgW1wic3VjY2Vzc1wiXSk7XG59KTtcblxuLy8gVGVzdCBzaSBsJ2UtbWFpbCBzYWlzaSBlc3QgZMOpasOgIHV0aWxpc8OpIHBvdXIgdW4gY29tcHRlIGTDqWrDoCBleGlzdGFudC5cbi8vIFNpIGMnZXN0IGxlIGNhcywgbGEgdmFsaWRhdGlvbiBkdSBmb3JtdWxhaXJlIGVzdCBibG9xdcOpZS5cbmVtYWlsSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIGZ1bmN0aW9uKGUpXG57XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJlbWFpbE1lc3NhZ2VcIikuaW5uZXJIVE1MPVwiXCI7Ly8gcG91ciBzdXBwcmltZXIgbCfDqXZlbnR1ZWwgbWVzc2FnZSBkJ2VycmV1ciBkw6lqw6AgYWZmaWNow6lcbn0pO1xuZW1haWxJbnB1dC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCBmdW5jdGlvbihlKVxue1xuICAgIGNvbnN0IGVtYWlsVmFsdWU9ZW1haWxJbnB1dC52YWx1ZS50cmltKCk7XG4gICAgaWYoZW1haWxWYWx1ZSE9PVwiXCIpXG4gICAge1xuICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgeGhyLm9wZW4oXCJQT1NUXCIsIGFwaVVybCtjb25maWdVc2Vycy51c2VyUm91dGVzK2NvbmZpZ1VzZXJzLmNoZWNrSWZJc0VtYWlsZnJlZVJvdXRlKTtcbiAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCAmJiByZXNwb25zZS5mcmVlIT09dW5kZWZpbmVkICYmIHJlc3BvbnNlLmZyZWUgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImVtYWlsTWVzc2FnZVwiKSwgXCJiXCIsIHR4dFVzZXJzLm5lZWRVbmlxdWVFbWFpbC5yZXBsYWNlKFwiI1VSTFwiLCBjb25maWdUZW1wbGF0ZS5jb25uZWN0aW9uUGFnZSksIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgYnRuU3VibWl0LnNldEF0dHJpYnV0ZShcImRpc2FibGVkXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGJ0blN1Ym1pdC5yZW1vdmVBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG4gICAgICAgIGNvbnN0IGRhdGFzPXsgZW1haWxUZXN0OmVtYWlsVmFsdWUgfTtcbiAgICAgICAgeGhyLnNlbmQoSlNPTi5zdHJpbmdpZnkoZGF0YXMpKTtcbiAgICB9XG59KTtcblxuLy8gVsOpcmlmaWNhdGlvbiBxdWUgbGUgY29kZSBkZSBwYXJyYWluYWdlIHNhaXNpIGVzdCB2YWxpZGUuXG4vLyBTaSBjZSBuJ2VzdCBwYXMgbGUgY2FzLCBjZWxhIG4nZXN0IHBhcyBibG9xdWFudC5cbmNvZGVHb2RmYXRoZXJJbnB1dC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNcIiwgZnVuY3Rpb24oZSlcbnsgICAvLyBvbiBlZmZhY2UgbCfDqXZlbnR1ZWwgbWVzc2FnZSBkJ2VycmV1ciBzaSBvbiByZXZpZW50IHN1ciBsZSBjaGFtcCBwb3VyIHJlY3RpZmllciBsZSB0aXJcbiAgICBhZGRFbGVtZW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY29kZUdvZGZhdGhlck1lc3NhZ2VcIiksIFwiaVwiLCB0eHQubm90UmVxdWlyZWQsIFwiXCIsIFtcImluZm9ybWF0aW9uXCJdKTtcbn0pO1xuY29kZUdvZGZhdGhlcklucHV0LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGZ1bmN0aW9uKGUpXG57XG4gICAgY29uc3QgY29kZVZhbHVlPWNvZGVHb2RmYXRoZXJJbnB1dC52YWx1ZS50cmltKCk7XG4gICAgaWYoY29kZVZhbHVlIT09XCJcIilcbiAgICB7XG4gICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB4aHIub3BlbihcIlBPU1RcIiwgYXBpVXJsK2NvbmZpZ1VzZXJzLnVzZXJSb3V0ZXMrY29uZmlnVXNlcnMuZ2V0R29kZmF0aGVyUm91dGUpO1xuICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDQpXG4gICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjb2RlR29kZmF0aGVyTWVzc2FnZVwiKSwgXCJiXCIsIHR4dFVzZXJzLmdvZGZhdGhlck5vdEZvdW5kLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgZWxzZSAvLyAhISDDoCByZXZvaXIgY2FyIGNlbGEgcGV1dCBwZXJtZXR0cmUgZGUgc2F2b2lyIHF1J3VuZSBhZHJlc3NlIGUtbWFpbCBlc3QgcHLDqXNlbnRlIGRhbnMgbGUgYmRcbiAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImNvZGVHb2RmYXRoZXJNZXNzYWdlXCIpLCBcImJcIiwgdHh0VXNlcnMuZ29kZmF0aGVyRm91bmQsIFwiXCIsIFtcInN1Y2Nlc3NcIl0pOyAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuICAgICAgICBjb25zdCBkYXRhcz17IGNvZGVUZXN0OmNvZGVWYWx1ZSB9O1xuICAgICAgICB4aHIuc2VuZChKU09OLnN0cmluZ2lmeShkYXRhcykpO1xuICAgIH1cbn0pO1xuXG4vLyBUcmFpdGVtZW50IGRlIGwnZW52b2kgZGVzIGRvbm7DqWVzIGQnaW5zY3JpcHRpb24gOlxubXlGb3JtLmFkZEV2ZW50TGlzdGVuZXIoXCJzdWJtaXRcIiwgZnVuY3Rpb24oZSlcbntcbiAgICB0cnlcbiAgICB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTsgICAgICAgIFxuICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgeGhyLm9wZW4oXCJQT1NUXCIsIGFwaVVybCtjb25maWdVc2Vycy51c2VyUm91dGVzK2NvbmZpZ1VzZXJzLnN1YnNjcmliZVJvdXRlKTtcbiAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG15Rm9ybS5zdHlsZS5kaXNwbGF5PVwibm9uZVwiO1xuICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgcmVzcG9uc2UubWVzc2FnZSwgXCJcIiwgW1wic3VjY2Vzc1wiXSk7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcImxhc3RBbnN3ZXJcIik7Ly8gISBpbXBvcnRhbnQgcG91ciBuZSBwYXMgZW5yZWdpc3RlciBwbHVzaWV1cnMgZm9pcyBsZSByw6lzdWx0YXRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzcG9uc2UuZXJyb3JzKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShyZXNwb25zZS5lcnJvcnMpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3JzID0gcmVzcG9uc2UuZXJyb3JzLmpvaW4oXCI8YnI+XCIpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvcnMgPSB0eHQuc2VydmVyRXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCByZXNwb25zZS5lcnJvcnMsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgdHh0LnNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuICAgICAgICBsZXQgZGF0YXM9Z2V0RGF0YXNGcm9tSW5wdXRzKG15Rm9ybSk7XG4gICAgICAgIGlmKGRhdGFzKVxuICAgICAgICB7XG4gICAgICAgICAgICBkYXRhcy50aW1lRGlmZmVyZW5jZT1nZXRUaW1lRGlmZmVyZW5jZShjb25maWdVc2Vycyk7XG4gICAgICAgICAgICAvLyBzaSBsJ3V0aWxpc2F0ZXVyIGEgcHLDqWPDqWRlbWVudCByw6lwb25kdSDDoCB1biBxdWl6LCBqJ2Fqb3V0ZSBsZXMgaW5mb3MgZGUgc29uIHLDqXN1bHRhdCA6XG4gICAgICAgICAgICB4aHIuc2VuZChKU09OLnN0cmluZ2lmeShkYXRhcykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoKGUpXG4gICAge1xuICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgdHh0LnNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgfVxufSk7IiwiLy8gRk9OQ1RJT05TIFVUSUxFUyBBVSBTVE9DS0FHRSBMT0NBTCAoU0VTU0lPTiwgQ09PS0lFUywgSU5ERVhEQiwgRVRDLilcbi8vIFJldmVuaXIgcG91ciBnw6lyZXIgbGUgY2FzIG/DuSBsb2NhbC5zdG9yYWdlIG4nZXN0IHBhcyBjb25udSBwb3VyIHV0aWxpc2VyIGNvb2tpZVxuICAgIFxuZXhwb3J0IGNvbnN0IHNhdmVMb2NhbHkgPSAobmFtZSwgZGF0YSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShuYW1lLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2NhbHkgPSAobmFtZSwganNvbj1mYWxzZSkgPT5cbntcbiAgICBpZihqc29uKVxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKSk7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSk7XG59XG5cbmV4cG9ydCBjb25zdCByZW1vdmVMb2NhbHkgPSAobmFtZSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShuYW1lKTtcbn0iLCJpbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gRm9uY3Rpb24gYXNzb2NpYW50IGxlcyBhdHRyaWJ1dHMgZm91cm5pcyDDoCB1biBjaGFtcCBkZSBmb3JtdWxhaXJlXG5leHBvcnQgY29uc3QgYWRkRWxlbWVudCA9IChlbHRQYXJlbnQsIGVsdFR5cGUsIGVsdENvbnRlbnQ9XCJcIiwgZWx0SWQ9XCJcIiwgZWx0Q2xhc3M9W10sIGVsdEF0dHJpYnV0ZXM9e30sIHJlcGxhY2U9dHJ1ZSkgPT5cbntcbiAgICBpZihpc0VtcHR5KGVsdFR5cGUpIHx8IGlzRW1wdHkoZWx0UGFyZW50KSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGVsc2VcbiAgICB7XG4gICAgICAgIGNvbnN0IG5ld0VsZW1lbnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlbHRUeXBlKTtcbiAgICAgICAgXG4gICAgICAgIGlmKCFpc0VtcHR5KGVsdElkKSkvLyB0ZXN0ZXIgc2kgbCdpZCBuJ2VzdCBwYXMgZMOpasOgIHV0aWxpc8OpIGRhbnMgbGUgRE9NID9cbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaWQ9ZWx0SWQ7XG5cbiAgICAgICAgaWYoQXJyYXkuaXNBcnJheShlbHRDbGFzcykgJiYgZWx0Q2xhc3MubGVuZ3RoIT0wKVxuICAgICAgICB7XG4gICAgICAgICAgICBmb3IobGV0IGkgaW4gZWx0Q2xhc3MpXG4gICAgICAgICAgICAgICAgbmV3RWxlbWVudC5jbGFzc0xpc3QuYWRkKGVsdENsYXNzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHR5cGVvZiBlbHRBdHRyaWJ1dGVzID09PSBcIm9iamVjdFwiKSAvLyAhISB0b3VzIGxlcyBvYmpldHMgbmUgc29udCBwYXMgb2tcbiAgICAgICAge1xuICAgICAgICAgICAgZm9yKGxldCBhdHRyaWJ1dE5hbWUgaW4gZWx0QXR0cmlidXRlcylcbiAgICAgICAgICAgICAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dE5hbWUsIGVsdEF0dHJpYnV0ZXNbYXR0cmlidXROYW1lXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZighaXNFbXB0eShlbHRDb250ZW50KSlcbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaW5uZXJIVE1MPWVsdENvbnRlbnQucmVwbGFjZSgvXFxuL2csXCI8YnI+XCIpOy8vIGlubmVySFRNTCBwZXJtZXQgZCdham91dGVyIGR1IHRleHRlIGF5YW50IGx1aS1tw6ptZSBkZXMgYmFsaXNlcywgZXRjLlxuICAgICAgICAgICAgXG4gICAgICAgIGlmKHJlcGxhY2UpXG4gICAgICAgICAgICBlbHRQYXJlbnQuaW5uZXJIVE1MPVwiXCI7XG4gICAgICAgIGVsdFBhcmVudC5hcHBlbmRDaGlsZChuZXdFbGVtZW50KTtcbiAgICB9ICAgIFxufSIsIi8vIENlIHNjcmlwdCBmb3Vybml0IGRlcyBmb25jdGlvbnMgdXRpbGlzw6llcyBzdXIgdG91dGVzIGxlcyBwYWdlcyBkdSBzaXRlXG5cbmV4cG9ydCBjb25zdCBoZWxsb0RldiA9ICgpID0+XG57XG4gICAgY29uc29sZS5sb2coXCIqKioqIEhlbGxvIGFtaSBkw6l2ZWxvcHBldXIgOi0pXFxuIExlIGNvZGUgZGUgV2lraUxlcm5pIGVzdCBsaWJyZSBldCBlc3QgbGlzaWJsZSBzdXIgZ2l0bGFiIDogXFxuIEJvbm5lIGxlY3R1cmUgOi0pIFxcbiBQb3VyIGxlcyBzdWdnZXN0aW9ucyBkJ2Ftw6lsaW9yYXRpb24gb3UgcXVlc3Rpb25zIDogZGV2QHdpbGlsZXJuaS5jb20gKioqKlwiKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUFjY291bnRMaW5rID0gKHN0YXR1cywgY29uZmlnVGVtcGxhdGUpID0+XG57XG4gICAgY29uc3QgbGluaz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFjY291bnRIZWFkTGlua1wiKTtcbiAgICBjb25zdCBob21lUGFnZT1zdGF0dXMrXCJIb21lUGFnZVwiO1xuICAgIGxpbmsuaHJlZj1cIi9cIitjb25maWdUZW1wbGF0ZVtob21lUGFnZV07XG59IiwiaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIEZvbmN0aW9uIGFzc29jaWFudCBsZXMgYXR0cmlidXRzIGZvdXJuaXMgw6AgdW4gY2hhbXAgZGUgZm9ybXVsYWlyZVxuZXhwb3J0IGNvbnN0IHNldEF0dHJpYnV0ZXNUb0lucHV0cyA9IChpbnB1dHNDb25mLCBteUZvcm0pID0+XG57XG4gICAgZm9yKGxldCBpIGluIG15Rm9ybS5lbGVtZW50cylcbiAgICB7XG4gICAgICAgIGlmKCFpc0VtcHR5KG15Rm9ybS5lbGVtZW50c1tpXS5pZCkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldCBpZElucHV0PW15Rm9ybS5lbGVtZW50c1tpXS5pZDtcbiAgICAgICAgICAgIGlmKGlucHV0c0NvbmZbaWRJbnB1dF0hPT11bmRlZmluZWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGV0IGlucHV0SFRNTD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZElucHV0KTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBhdHRyaWJ1dGUgaW4gaW5wdXRzQ29uZltpZElucHV0XSlcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRIVE1MLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIGlucHV0c0NvbmZbaWRJbnB1dF1bYXR0cmlidXRlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbi8vIFLDqWN1cMOocmUgdG91dGVzIGxlcyB2YWxldXJzIGRlIGNoYW1wcyBlbiBvbWV0dGFudCBsZXMgY2hlY2tib3ggbm9uIGNvY2jDqWVzLCBldGMuXG5leHBvcnQgY29uc3QgZ2V0RGF0YXNGcm9tSW5wdXRzID0gKG15Rm9ybSkgPT5cbntcbiAgICBjb25zdCBkYXRhcz17fTtcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShteUZvcm0pO1xuICAgIGZvcihsZXQgZW50cmllIG9mIGZvcm1EYXRhLmVudHJpZXMoKSlcbiAgICAgICBkYXRhc1tlbnRyaWVbMF1dPWVudHJpZVsxXTtcbiAgICByZXR1cm4gZGF0YXM7XG59XG5cbi8vIFZpZGUgdG91cyBsZXMgY2hhbXBzIGQndW4gZm9ybXVsYWlyZSwgeSBjb21wcmlzIGhpZGRlbiwgY2hlY2tib3gsIGV0Yy5cbi8vIFJldm9pciBwb3VyIGxlcyBzZWxlY3RcbmV4cG9ydCBjb25zdCBlbXB5Rm9ybSA9IChteUZvcm0pID0+XG57XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEobXlGb3JtKTtcbiAgICBmb3IobGV0IGVudHJpZSBvZiBmb3JtRGF0YS5lbnRyaWVzKCkpXG4gICAge1xuICAgICAgICBpZihteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS50eXBlPT1cImNoZWNrYm94XCIgfHwgbXlGb3JtLmVsZW1lbnRzW2VudHJpZVswXV0udHlwZT09XCJyYWRpb1wiKVxuICAgICAgICAgICAgbXlGb3JtLmVsZW1lbnRzW2VudHJpZVswXV0uY2hlY2tlZD1mYWxzZTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbXlGb3JtLmVsZW1lbnRzW2VudHJpZVswXV0udmFsdWU9XCJcIjtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG4vLyBWaWRlIGV0IGNhY2hlIGxlIGZvcm11bGFpcmVcbmV4cG9ydCBjb25zdCBlbXB5QW5kSGlkZUZvcm0gPSAobXlGb3JtKSA9Plxue1xuICAgIGVtcHlGb3JtKG15Rm9ybSk7XG4gICAgbXlGb3JtLnN0eWxlLmRpc3BsYXk9XCJub25lXCI7XG59IiwiaW1wb3J0IHsgYXBpVXJsLCBhdmFpbGFibGVMYW5ncywgc2l0ZVVybCwgdGhlbWUgfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCI7XG5jb25zdCBsYW5nPWF2YWlsYWJsZUxhbmdzWzBdO1xuXG5jb25zdCBjb25maWdUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi8uLi8uLi92aWV3cy9cIit0aGVtZStcIi9jb25maWcvXCIrbGFuZytcIi5qc1wiKTtcbmltcG9ydCB7ICBjaGVja0xvZ2luUm91dGUsIHRpbWVEaWZmZXJlbmNlTWF4LCB0aW1lRGlmZmVyZW5jZU1pbiwgdXNlclJvdXRlcyB9IGZyb20gXCIuLi8uLi8uLi9jb25maWcvdXNlcnMuanNcIjtcblxuaW1wb3J0IHsgZ2V0TG9jYWx5LCByZW1vdmVMb2NhbHksIHNhdmVMb2NhbHkgfSBmcm9tIFwiLi9jbGllbnRzdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gUsOpY3Vww6hyZSBsZXMgZG9ubsOpZXMgZGUgY29uZmlndXJhdGlvbiBkZXMgdXRpbGlzYXRldXJzXG4vLyDDgCB0ZXJtZSwgdW4gZmljaGllciBzdGF0aXF1ZSBpbXBvcnRhYmxlIGNvbW1lIG1vZHVsZSBkZXZyYWl0IMOpdml0ZXIgdW5lIHJlcXXDqnRlIGFqYXhcbmV4cG9ydCBjb25zdCBnZXRDb25maWcgPSAgYXN5bmMgKCkgPT5cbntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBhcGlVcmwrXCIvdXNlci9nZXRjb25maWdcIik7XG4gICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCkpO1xuICAgICAgICB4aHIub25lcnJvciA9ICgpID0+IHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICAgIHhoci5zZW5kKCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRUaW1lRGlmZmVyZW5jZSA9ICgpID0+XG57XG4gICAgY29uc3QgdGltZUxvY2FsPW5ldyBEYXRlKCkuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICBpZih0aW1lTG9jYWwgPiB0aW1lRGlmZmVyZW5jZU1heCB8fCB0aW1lTG9jYWwgPCB0aW1lRGlmZmVyZW5jZU1pbilcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgZWxzZSByZXR1cm4gdGltZUxvY2FsO1xufVxuXG4vLyBPbiBlbmzDqHZlIHZvbG9udGFpcmVtZW50IGxlcyAwL08gcG91ciDDqXZpdGVyIGxlcyBjb25mdXNpb25zICFcbi8vIEV0IG1pZXV4IHZhdXQgYXVzc2kgZMOpYnV0ZXIgZXQgZmluaXIgcGFyIHVuZSBsZXR0cmUgc2ltcGxlLlxuZXhwb3J0IGNvbnN0IGdldFBhc3N3b3JkID0gKG5iQ2FyTWluLCBuYkNhck1heCkgPT5cbntcbiAgICBjb25zdCBuYkNhcj1uYkNhck1pbitNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqKG5iQ2FyTWF4LW5iQ2FyTWluKSk7XG4gICAgY29uc3QgbGV0dGVycz1cIkFCQ0RFRkdISUpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbnBxcnN0dXZ3eHl6XCI7XG4gICAgY29uc3Qgb3RoZXJzPVwiMTIzNDU2Nzg5IT8uKi1fJUAmw4nDgMOIw5nigqwkw4LDisObw45cIjtcbiAgICBsZXQgcGFzc3dvcmQ9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICBmb3IobGV0IGk9MTtpPChuYkNhci0xKTtpKyspXG4gICAge1xuICAgICAgICBpZigoaSAlIDIpID09PTEpXG4gICAgICAgICAgICBwYXNzd29yZCs9b3RoZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpvdGhlcnMubGVuZ3RoKV07XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHBhc3N3b3JkKz1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldOyAgIFxuICAgIH1cbiAgICBwYXNzd29yZCs9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICByZXR1cm4gcGFzc3dvcmQ7XG59XG5cbi8vIEondXRpbGlzZSBsZSBzdG9ja2FnZSBsb2NhbCBkdSBuYXZpZ2F0ZXVyIHBvdXIgZW5yZWdpc3RyZXIgbGVzIGRvbm7DqWVzIHBlcm1ldHRhbnQgZGUgcmVjb25uYcOudHJlIGwndXRpbGlzYXRldXIgcGFyIGxhIHN1aXRlXG4vLyBTZXVsIGxlIHNlcnZldXIgcG91cnJhIHbDqXJpZmllciBxdWUgbGVzIGlkZW50aWZpYW50cyBzb250ICh0b3Vqb3VycykgdmFsaWRlcy5cbmV4cG9ydCBjb25zdCBzZXRTZXNzaW9uID0gKHVzZXJJZCwgdG9rZW4sIGR1cmF0aW9uVFMpID0+XG57XG4gICAgY29uc3Qgc3RvcmFnZVVzZXI9XG4gICAge1xuICAgICAgICBpZDogdXNlcklkLFxuICAgICAgICB0b2tlbjogdG9rZW4sXG4gICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvblRTXG4gICAgfVxuICAgIHNhdmVMb2NhbHkoXCJ1c2VyXCIsIHN0b3JhZ2VVc2VyKTtcbn1cblxuLy8gVsOpcmlmaWUgcXUnaWwgeSBhIGRlcyBkb25uw6llcyBsb2NhbGVzIGNvbmNlcm5hbnQgbGUgcsOpc3VsdGF0IGQndW4gcXVpelxuLy8gRXQgbGVzIGFqb3V0ZSBhdXggZG9ubsOpZXMgZW52b3nDqWVzIHBhciBsZXMgZm9ybXVsYWlyZXMgZCdpbnNjcmlwdGlvbi9jb25uZXhpb24gc2kgYydlc3QgbGUgY2FzXG5leHBvcnQgY29uc3QgY2hlY2tBbnN3ZXJEYXRhcyA9IChkYXRhcykgPT5cbntcbiAgICBjb25zdCBsYXN0QW5zd2VyPWdldExvY2FseShcImxhc3RBbnN3ZXJcIik7XG4gICAgaWYoIWlzRW1wdHkobGFzdEFuc3dlcikpXG4gICAge1xuICAgICAgICBjb25zdCBhbnN3ZXI9SlNPTi5wYXJzZShsYXN0QW5zd2VyKTtcbiAgICAgICAgaWYoIWlzRW1wdHkoYW5zd2VyLmR1cmF0aW9uKSAmJiAhaXNFbXB0eShhbnN3ZXIubmJDb3JyZWN0QW5zd2VycykgJiYgIWlzRW1wdHkoYW5zd2VyLlF1ZXN0aW9ubmFpcmVJZCkgJiYgIWlzRW1wdHkoYW5zd2VyLm5iUXVlc3Rpb25zKSlcbiAgICAgICAge1xuICAgICAgICAgICAgZGF0YXMuZHVyYXRpb249YW5zd2VyLmR1cmF0aW9uO1xuICAgICAgICAgICAgZGF0YXMubmJDb3JyZWN0QW5zd2Vycz1hbnN3ZXIubmJDb3JyZWN0QW5zd2VycztcbiAgICAgICAgICAgIGRhdGFzLlF1ZXN0aW9ubmFpcmVJZD1hbnN3ZXIuUXVlc3Rpb25uYWlyZUlkO1xuICAgICAgICAgICAgZGF0YXMubmJRdWVzdGlvbnM9YW5zd2VyLm5iUXVlc3Rpb25zO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhcztcbn1cblxuLy8gQ2V0dGUgZm9uY3Rpb24gdGVzdGUgbGEgY29ubmV4aW9uIGRlIGwndXRpbGlzYXRldXIgZCd1bmUgcGFnZVxuLy8gT24gcGV1dCBmb3VybmlzIHVuZSBsaXN0ZSBkZSBzdGF0dXRzIGFjY2VwdMOpcyAoc2kgdmlkZSA9IHRvdXMpLCBhaW5zaSBxdSd1bmUgdXJsIGRlIHJlZGlyZWN0aW9uIHNpIG5vbiBjb25uZWN0w6ksIHVuIG1lc3NhZ2UgZCdlcnJldXIgw6AgYWZmaWNoZXIgc3VyIGxhIHBhZ2UgZGUgZGVzdGluYXRpb24gZXQgbCd1cmwgc3VyIGxhcXVlbGxlIHJldmVuaXIgdW5lIGZvaXMgY29ubmVjdMOpXG5leHBvcnQgY29uc3QgY2hlY2tTZXNzaW9uID0gYXN5bmMgKHN0YXR1cz1bXSwgdXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCkgPT5cbntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IHVzZXJEYXRhcz1nZXRMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICBpZihpc0VtcHR5KHVzZXJEYXRhcykpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgdXNlcj1KU09OLnBhcnNlKHVzZXJEYXRhcyk7XG4gICAgICAgICAgICBpZihpc0VtcHR5KHVzZXIuaWQpIHx8wqBpc0VtcHR5KHVzZXIudG9rZW4pIHx8IGlzRW1wdHkodXNlci5kdXJhdGlvbikgfHwgdXNlci5kdXJhdGlvbiA8IERhdGUubm93KCkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgYXBpVXJsK3VzZXJSb3V0ZXMrY2hlY2tMb2dpblJvdXRlK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDAgJiYgcmVzcG9uc2UuaXNWYWxpZCAmJiByZXNwb25zZS5pZCAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLmlkPT09dXNlci5pZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLm5hbWU9cmVzcG9uc2UubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLmxhbmd1YWdlPXJlc3BvbnNlLmxhbmd1YWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIudGltZURpZmZlcmVuY2U9cmVzcG9uc2UudGltZURpZmZlcmVuY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5zdGF0dXM9cmVzcG9uc2Uuc3RhdHVzOy8vIGxlIHRva2VuIGV0IGRlIHRvdXRlIGZhw6dvbiB2w6lyaWZpZXIgw6AgY2hhcXVlIHJlcXXDqnRlIMOgIGwnQVBJXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUxvY2FseShcInVzZXJcIiwgdXNlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2kgaWwgcydhZ2l0IGQndW4gXCJ1c2VyXCIgZXQgcXVlIHNvbiBhYm9ubmVtZW50IGEgZXhwaXLDqSwgamUgbGUgcmVkaXJpZ2UgdmVycyBsYSBjYWlzc2UgOi0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2Uuc3RhdHVzPT09XCJ1c2VyXCIgJiYgcmVzcG9uc2UubmJEYXlzT2sgPD0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybEFjY291bnQ9c2l0ZVVybCtcIi9cIitjb25maWdUZW1wbGF0ZVtsYW5nXS5hY2NvdW50UGFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZih1cmxBY2NvdW50KT09PS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIi9cIitjb25maWdUZW1wbGF0ZVtsYW5nXS5hY2NvdW50UGFnZSk7Ly8gcGFzc8OpZSBkaXJlY3RlbWVudCBpY2ksIGwnYW5jcmUgI3N1YnNjcmliZSBuZSBmb25jdGlvbm5lIHBhcyAhP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzdGF0dXMubGVuZ3RoIT09MCAmJiBzdGF0dXMuaW5kZXhPZihyZXNwb25zZS5zdGF0dXMpPT09LTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHhoci5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICAgICAgICAgICAgICB4aHIuc2VuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4vLyBDZXR0ZSBmb25jdGlvbiBzZXJ0IMOgIGxhIHByw6ljw6lkZW50ZSBlbiBjYXMgZGUgY29ubmV4aW9uIG5vbiB2YWxpZGVcbmNvbnN0IHJlZGlyZWN0VXNlciA9ICh1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKSA9Plxue1xuICAgIGlmKCFpc0VtcHR5KG1lc3NhZ2UpKVxuICAgICAgICBzYXZlTG9jYWx5KFwibWVzc2FnZVwiLCBtZXNzYWdlKTtcbiAgICBpZighaXNFbXB0eSh1cmxXYW50ZWQpKVxuICAgICAgICBzYXZlTG9jYWx5KFwidXJsXCIsIHVybFdhbnRlZCk7XG4gICAgaWYoIWlzRW1wdHkodXJsUmVkaXJlY3Rpb24pKVxuICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKHVybFJlZGlyZWN0aW9uKTtcbn0iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/front/public/JS/subscribeValidation.app.js b/front/public/JS/subscribeValidation.app.js new file mode 100644 index 0000000..33dd172 --- /dev/null +++ b/front/public/JS/subscribeValidation.app.js @@ -0,0 +1,1186 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "./src/subscribeValidation.js"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "../config/instance.js": +/*!*****************************!*\ + !*** ../config/instance.js ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var _module$exports; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var users = __webpack_require__(/*! ./users */ "../config/users.js"); + +var questionnaires = __webpack_require__(/*! ./questionnaires */ "../config/questionnaires.js"); + +module.exports = (_module$exports = { + apiUrl: "http://localhost:3000/api", + siteUrl: "http://localhost:8080", + adminName: "Fabrice", + adminEmail: "dev@wikilerni.com", + senderName: "WikiLerni", + senderEmail: "bonjour@wikilerni.com", + adminLang: "fr", + theme: "default", + // le thème utilisé (dans /views) pour générer les pages HTML. Contient ses propres fichiers de configuration. + availableLangs: ["fr"], + // Languages in which the site is available. The first one is the default one. + siteName: "WikiLerni", + beginCodeGodfather: "wikilerni", + // case-sensitive and can't contain "@" ! + cronTimingAlertInSeconde: 120, + // for logs + responseTimingAlertInSeconde: 3, + // idem + tokenSignupValidationTimeInHours: "48h", + // https://github.com/zeit/ms + tokenLoginLinkTimeInHours: "1h", + tokenConnexionMinTimeInHours: "24h", + tokenConnexionMaxTimeInDays: "180 days", + tokenLoginChangingTimeInHours: "1h", + // for email & password changing + tokenDeleteUserTimeInHours: "1h", + tokenUnsubscribeLinkTimeInDays: "7 days", + // token send with subscription's emails + freeAccountTimingInDays: 10, + freeAccountExpirationNotificationInDays: 5, + accountExpirationFirstNotificationInDays: 14, + accountExpirationSecondNotificationInDays: 5, + inactiveAccountTimeToDeleteInDays: 180, + // Questionnaires: + nbQuestionsMin: 1, + // minimum number of questions for the questionnaire to be publishable + nbQuestionsMax: 10, + // if 0 = not maximum + nbChoicesMax: 10, + nbNewQuestionnaires: 10, + // for RSS, etc. + hourGiveNewQuestionnaireBegin: 1, + // in user local time + hourGiveNewQuestionnaireEnd: 24, + // idem + numberNewQuestionnaireAtSameTime: 50, + // for mass mailing + minSearchQuestionnaires: 3, + // Illustrations: + nbIllustrationsMin: 0, + nbIllustrationsMax: 1, + maxIllustrationSizeinOctet: 1000000, + // pas contrôlé pour l'instant. À revoir. + mimeTypesForIllustration: ["image/jpg", "image/jpeg", "image/png", "image/gif", "image/png"], + // -- Upload and resize: + illustrationsWidthMaxInPx: 400, + illustrationsMiniaturesWidthMaxInPx: 200, + // Links: + nbLinksMin: 1, + nbLinksMax: 1 +}, _defineProperty(_module$exports, "nbQuestionsMin", questionnaires.nbQuestionsMin), _defineProperty(_module$exports, "nbQuestionsMax", questionnaires.nbQuestionsMax), _defineProperty(_module$exports, "nbChoicesMax", questionnaires.nbChoicesMax), _defineProperty(_module$exports, "passwordMinLength", users.password.minlength), _defineProperty(_module$exports, "dirCacheUsers", users.dirCacheUsers), _defineProperty(_module$exports, "dirCacheUsersAnswers", users.dirCacheUsersAnswers), _defineProperty(_module$exports, "dirCacheQuestionnaires", questionnaires.dirCacheQuestionnaires), _defineProperty(_module$exports, "dirCacheQuestions", questionnaires.dirCacheQuestions), _defineProperty(_module$exports, "dirCacheUsersQuestionnaires", questionnaires.dirCacheUsersQuestionnaires), _defineProperty(_module$exports, "dirHTMLQuestionnaire", questionnaires.dirHTMLQuestionnaire), _defineProperty(_module$exports, "dirWebQuestionnaire", questionnaires.dirWebQuestionnaire), _module$exports); + +/***/ }), + +/***/ "../config/questionnaires.js": +/*!***********************************!*\ + !*** ../config/questionnaires.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + // API'routes (after "apiUrl" defined in instance.js) + questionnaireRoutes: "/questionnaire", + getQuestionnaireRoutes: "/get", + previewQuestionnaireRoutes: "/preview", + publishedQuestionnaireRoutes: "/quiz/", + saveAnswersRoute: "/answer/", + getStatsQuestionnaires: "/stats/", + searchQuestionnairesRoute: "/search", + searchAdminQuestionnairesRoute: "/searchadmin", + getListNextQuestionnaires: "/getlistnextquestionnaires/", + // -- questions & choices : + questionsRoute: "/question/", + // -- tags : + tagsSearchRoute: "/tags/search/", + // -- answers : + getQuestionnairesWithoutAnswer: "/withoutanswer/user/", + getPreviousAnswers: "/user/answers/", + getStatsAnswers: "/user/anwswers/stats/", + getAdminStats: "/getadminstats/", + // forms : à compléter avec valeurs par défaut, etc. cf modèle + Questionnaire: { + title: { + maxlength: 255, + required: true + }, + slug: { + maxlength: 150 + }, + // champ requis mais calculé à partir du titre qd vide + introduction: { + required: true + } + }, + searchQuestionnaires: { + minlength: 3, + required: true + }, + Question: { + text: { + maxlength: 255, + required: true + }, + rank: { + required: true, + min: 1, + defaultValue: 1 + } + }, + Choice: { + text: { + maxlength: 255, + required: true + } + }, + nbQuestionsMin: 1, + nbQuestionsMax: 10, + nbChoicesMax: 10, + nbTagsMin: 0, + nbTagsMax: 0, + // 0 = not max + // JSON and HTML dir + dirCacheQuestionnaires: "datas/questionnaires", + dirCacheQuestions: "datas/questionnaires/questions", + dirCacheUsersQuestionnaires: "datas/users/questionnaires", + dirCacheTags: "datas/questionnaires/tags", + dirHTMLQuestionnaire: "front/public/quiz", + dirHTMLTags: "front/public/quizs", + dirWebQuestionnaire: "quiz", + //pour url page + dirWebTags: "quizs" // idem + +}; + +/***/ }), + +/***/ "../config/users.js": +/*!**************************!*\ + !*** ../config/users.js ***! + \**************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + // API'routes (after "apiUrl" defined in instance.js) + userRoutes: "/user", + subscribeRoute: "/signup", + getGodfatherRoute: "/getgodfatherid", + checkIfIsEmailfreeRoute: "/isemailfree", + checkSubscribeTokenRoute: "/validation/", + checkLoginRoute: "/checklogin/", + connectionRoute: "/login", + getLoginLinkRoute: "/getloginlink", + connectionWithLinkRoute: "/checkloginlink", + getUserInfos: "/get/", + createUserRoute: "/create", + validateUserRoute: "/validate/", + updateUserInfos: "/modify/", + searchUserRoute: "/search/", + getGodChilds: "/getgodchilds/", + checkNewLoginLinkRoute: "/confirmnewlogin/", + checkDeleteLinkRoute: "/confirmdelete/", + getPayments: "/payment/getforoneuser/", + unsubscribeRoute: "/subscription/stop/", + getAdminStats: "/getadminstats/", + // forms : à compléter avec valeurs par défaut, etc. cf modèle + name: { + maxlength: 70, + required: true + }, + email: { + maxlength: 255, + required: true + }, + password: { + minlength: 8, + maxlength: 72, + required: true + }, + // https://www.npmjs.com/package/bcrypt#security-issues-and-concerns + newPassword: { + minlength: 8, + maxlength: 72 + }, + codeGodfather: { + maxlength: 255 + }, + cguOk: { + value: "true", + required: true + }, + timeDifferenceMin: -720, + timeDifferenceMax: 840, + // JSON dir + dirCacheUsers: "datas/users", + dirCacheUsersAnswers: "datas/users/questionnaires/answers" +}; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/general$": +/*!**************************************!*\ + !*** ../lang sync ^\.\/.*\/general$ ***! + \**************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/general": "../lang/fr/general.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/general$"; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/user$": +/*!***********************************!*\ + !*** ../lang sync ^\.\/.*\/user$ ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/user": "../lang/fr/user.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/user$"; + +/***/ }), + +/***/ "../lang/fr/general.js": +/*!*****************************!*\ + !*** ../lang/fr/general.js ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + siteHTMLTitle: "WikiLerni : qu'allez-vous apprendre aujourd'hui ?", + siteMetaDescription: "Chaque jour, testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.", + scriptTimingInfo: "Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", + scriptTimingAlert: "*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", + serverError: "Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.", + serverErrorAdmin: "Bug de l'application :", + neededParams: "Des paramètres nécessaires manquants sont manquants.", + badUrl: "Tentative d'accès à une page n'existant pas :", + notValidFormat: "Format non valide.", + notAllowed: "Vous n'avez pas les droits nécessaires pour cette action.", + notRequired: "Facultatif.", + updateBtnTxt: "Modifier", + addBtnTxt: "Ajouter", + deleteBtnTxt: "Supprimer", + addOkMessage: "Les données ont bien été enregistrées.", + updateOkMessage: "La mise à jour à jour a bien été enregistrée.", + deleteOkMessage: "La suppression a bien été enregistrée.", + failAuth: "Erreur d'authentification.", + failAuthHeader: "Absence de header Authorization.", + failAuthToken: "Token invalide ou utilisateur non trouvé.", + failAuthId: "Identifiant non valide : ", + failAuthCron: "Tentative de lancement d'un cron sans le bon token.", + previousPage: "Page précédente", + nextPage: "Page suivante", + btnLinkToQuestionnaire: "Aller au quiz !", + statsAdmin: "Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
    En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
    Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium." +}; + +/***/ }), + +/***/ "../lang/fr/user.js": +/*!**************************!*\ + !*** ../lang/fr/user.js ***! + \**************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + notFound: "L'utilisateur n'a pas été trouvé.", + needName: "Merci de choisir un nom d'utilisateur.", + needNotTooLongName: "Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.", + needEmail: "Merci de saisir votre adresse e-mail.", + needUniqueEmail: "L'adresse e-mail que vous avez saisie est déjà utilisée par un autre utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.", + needNotTooLongEmail: "Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.", + needPassWord: "Merci de fournir un mot de passe.", + needLongPassWord: "Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.", + passwordCopied: "Le mot de passe généré a été copié dans le presse-papier. Vous pouvez le recopier où vous le souhaiter.", + needStatus: "Il manque le statut.", + needLanguage: "Il manque le code langue.", + needValidLastConnectionDate: "La date de dernière connexion n'est pas valide.", + needSMTP: "Il manque le serveur SMTP.", + needSMTPNotFound: "Il manque le serveur SMTP.", + needKnowNewsletterOk: "Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.", + needTimeDifference: "Il faut connaître le nombre de minutes du décalage horaire.", + needMinTimeDifference: "Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.", + needMaxTimeDifference: "Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.", + needUGCOk: "Vous devez accepter les CGU pour pouvoir créer votre compte. ", + godfatherNotFound: "Aucun utilisateur valide trouvé pour ce code parrain.", + godfatherFound: "Votre parrain a bien été trouvé !", + mailValidationMessage: "Votre inscription est bien enregistrée.\nPour la finaliser, merci de cliquer dans les 24H sur le lien de confirmation qui vient de vous être envoyé par e-mail.", + mailValidationLinkSubject: "Merci de valider votre compte", + mailValidationLinkSBodyTxt: "Bonjour USER_NAME,\n\nPour valider votre compte, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL", + mailValidationLinkSBodyHTML: "

    Bonjour USER_NAME,

    Pour valider votre compte, merci de cliquer sur le lien suivant dans les 24h.

    Valider.

    ", + validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue !
    Vous pouvez sans tarder vous connecter ci-dessous pour accéder à votre compte.", + validationMessageAdmin: "Le compte a bien été validé.", + validationAlreadyMessage: "Il semble que vous ayez déjà validé votre compte.", + validationAlreadyMessageAdmin: "Ce compte a déjà été validé.", + mailWelcomeSubject: "Bienvenue !", + mailWelcomeBodyTxt: "Bonjour USER_NAME,\nVotre venez de valider votre inscription à NOM_SITE.\nMerci et à bientôt !", + mailWelcomeBodyHTML: "

    Bonjour USER_NAME,

    Votre venez de valider votre inscription à NOM_SITE.

    Merci et à bientôt !

    ", + mailThankGodfatherSubject: "Merci !", + mailThankGodfatherBodyTxt: "Bonjour USER_NAME,\nGrâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nMerci et à bientôt !", + mailThankGodfatherBodyHTML: "

    Bonjour USER_NAME,

    Grâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.

    Merci et à bientôt !

    ", + badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.", + emailNotFound: "Aucun utilisateur trouvé pour cette adresse e-mail.", + alreadyConnected: "Vous êtes déjà connecté(e) au site !", + needBeConnected: "Vous devez être connecté(e) pour accéder à cette page.", + connectionOk: "Connexion réussie.", + needChooseLoginWay: "Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.", + needValidationToLogin: "Vous devez d'abord valider votre compte avant de vous connecter. Pour ce faire, un lien vient de vous être envoyé par e-mail.", + tooManyLoginFails: "Trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.", + badPassword: "Le mot de passe n'est pas le bon.", + mailLoginLinkSubject: "Votre lien de connexion.", + mailLoginLinkBodyTxt: "Bonjour USER_NAME,\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : LINK_URL", + mailLoginLinkBodyHTML: "

    Bonjour USER_NAME,

    Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :

    Valider.

    ", + mailLoginLinkMessage: "Un lien de connexion vient de vous être envoyé sur votre adresse e-mail. Ne tardez pas à l'utiliser, car il n'est valable que durant ", + updatedOkMessage: "Vos informations ont bien été mises à jour.", + updatedNeedGoodEmail: "Mais la nouvelle adresse e-mail n'a pu être enregistrée car elle n'a pas une format correct.", + updatedNeedUniqueEmail: "Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.", + mailUpdateLoginSubject: "Merci de valider vos nouveaux identifiants.", + mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL", + mailUpdateLoginBodyHTML: "

    Bonjour USER_NAME,

    Pour valider vos nouveaux identifiants de connexion, cliquez ici sans tarder.

    ", + mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (email et/ou mot de passe) et vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement. En attendant, merci de continuer à utiliser vos anciens identifiants.", + updatedNeedValidatedUser: "L'utilisateur que vous souhaité modifier n'existe pas/plus ou n'a pas encore validé son compte.", + updatedNeedGoodGodfather: "Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.", + mailUpdateLoginOkMessage: "La mise à jour de vos identifiants a bien été enregistrée.", + updatedFailedGodfatherNotFound: "L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.", + creationOkMessage: "Le nouvel utilisateur a bien été enregistré.", + mailDeleteSubject: "Confirmer la suppression de votre compte.", + mailDeleteBodyTxt: "Bonjour USER_NAME,\nPour valider la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL", + mailDeleteBodyHTML: "

    Bonjour USER_NAME,

    Pour valider la suppression de votre compte, cliquez ici sans tarder.

    ", + mailDeleteLinkMessage: "Votre demande de suppression a bien été enregistrée. Merci de cliquer sans tarder sur le lien qui vient de vous être envoyé par e-mail pour confirmer.", + deleteOkMessage: "L'utilisateur a bien été supprimé.", + deleteFailMessage: "Tentative de suppression d'un utilisateur inexistant : ", + mailDeleteLinkOkMessage: "Votre compte a bien été supprimé. Merci d'avoir utilisé nos services.", + mailDeleteLinkAlreadyMessage: "Il semble que vous ayez déjà validé la suppression de votre compte.", + mailDeleteLinkFailMessage: "Votre lien de suppression n'est pas valide ou alors il n'est plus valable.", + cronDeleteUnvalidedUsersMessage: " comptes utilisateurs non validés ont été supprimés.", + deleteInactiveUsersMessage: " comptes utilisateurs inactifs ont été supprimés.", + welcomeMessage: "Bienvenue #NAME !", + byebyeMessage: "Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
    À bientôt !", + infosUserForAdmin: "Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
    Date de sa dernière connexion : DATE_CONNECTION.", + infosAdminGodfather: "Cet utilisateur a été parrainé par ", + infosAdminNbGodChilds: "Ses #NB filleuils : " +}; + +/***/ }), + +/***/ "../tools/main.js": +/*!************************!*\ + !*** ../tools/main.js ***! + \************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +// Quelques fonctions utiles pour les chaînes +var Tool = /*#__PURE__*/function () { + function Tool() { + _classCallCheck(this, Tool); + } + + _createClass(Tool, null, [{ + key: "isEmpty", + value: function isEmpty(myVar) { + if (myVar === undefined || myVar === null) return true;else { + myVar += ""; // si autre chose qu'une chaîne envoyé... + + myVar = myVar.trim(); + if (myVar === "") return true;else return false; + } + } + }, { + key: "trimIfNotNull", + value: function trimIfNotNull(myString) { + if (Tool.isEmpty(myString)) myString = null;else { + myString += ""; // si autre chose qu'une chaîne envoyé... + + myString = myString.trim(); + } + return myString; + } + }, { + key: "shortenIfLongerThan", + value: function shortenIfLongerThan(myString, max) { + myString += ""; // au cas où cela ne serait pas une chaîne... + + if (myString.length > max) myString = myString.substring(0, max - 3) + "..."; + return myString; + } // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings + + }, { + key: "replaceAll", + value: function replaceAll(myString, mapObj) { + var replaceElts = new RegExp(Object.keys(mapObj).join("|"), "gi"); + return myString.replace(replaceElts, function (matched) { + return mapObj[matched]; + }); + } // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random + + }, { + key: "getRandomInt", + value: function getRandomInt(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min)) + min; + } // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country + + }, { + key: "dateFormat", + value: function dateFormat(dateString) { + var lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "fr"; + if (Tool.isEmpty(dateString)) return ""; + var myDate = new Date(dateString); + var myDay = myDate.getDate() + ""; + if (myDay.length === 1) myDay = "0" + myDay; + var myMounth = myDate.getMonth() + 1 + ""; + if (myMounth.length === 1) myMounth = "0" + myMounth; + var myYear = myDate.getFullYear(); + if (lang === "fr") return myDay + "/" + myMounth + "/" + myYear;else if (lang === "form") // 2014-02-09 + return myYear + "-" + myMounth + "-" + myDay;else return myMounth + "/" + myDay + "/" + myYear; + } + }]); + + return Tool; +}(); + +module.exports = Tool; + +/***/ }), + +/***/ "../views sync recursive ^\\.\\/.*\\.js$": +/*!**********************************!*\ + !*** ../views sync ^\.\/.*\.js$ ***! + \**********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./default/config/fr.js": "../views/default/config/fr.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../views sync recursive ^\\.\\/.*\\.js$"; + +/***/ }), + +/***/ "../views/default/config/fr.js": +/*!*************************************!*\ + !*** ../views/default/config/fr.js ***! + \*************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + headLinks: [{ + anchor: "Accueil", + attributes: { + href: "/" + } + }, { + anchor: "Mon compte", + attributes: { + href: "/connexion.hmt", + id: "accountHeadLink" + } + }, { + anchor: "À propos", + attributes: { + href: "/a-propos.html" + } + }, { + anchor: "Contact", + attributes: { + href: "/contact.html" + } + }], + footLinks: [{ + anchor: "Crédits", + attributes: { + href: "/credits.html" + } + }, { + anchor: "Mentions légales", + attributes: { + href: "/mentions-legales.html", + rel: "nofollow" + } + }, { + anchor: "Données personnelles", + attributes: { + href: "/donnees.html" + } + }, { + anchor: "C.G.U.", + attributes: { + href: "/cgu.html", + rel: "nofollow" + } + }, { + anchor: "C.G.V.", + attributes: { + href: "/cgv.html", + rel: "nofollow" + } + }], + maxQuestionnairesByPage: 10, + userHomePage: "accueil.html", + adminHomePage: "admin.html", + managerHomePage: "gestion.html", + subscribePage: "inscription.html", + connectionPage: "connexion.html", + accountPage: "compte.html", + questionnairesManagementPage: "gestion-quizs.html", + usersManagementPage: "gestion-utilisateurs.html", + nbQuestionnairesUserHomePage: 10, + illustrationDir: "/img/quizs/", + siteSlogan: "Cultivons notre jardin !", + homeTitle1: "De nature curieuse ?", + homeP1: "Avec WikiLerni vous apprenez chaque jour de nouvelles choses.
    Des articles de Wikipédia sont sélectionnés pour vous et sont suivis d'un quiz vous permettant de tester ce que vous en avez retenu.
    De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre \"jardin\".", + homeTitle2: "La culture en liberté", + homeP2: "Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
    Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
    Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
    Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.

    (*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.", + newQuestionnairesTitle: "Les derniers quizs publiés sur WikiLerni", + newQuestionnairesIntro: "Liste des derniers quizs publiés sur WikiLerni.", + explanationTitle: "Vous découvrez WikiLerni ?", + explanationTxt: "Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
    Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.

    Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.

    Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)

    Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
    Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.

    Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.", + noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript." +}; + +/***/ }), + +/***/ "./src/subscribeValidation.js": +/*!************************************!*\ + !*** ./src/subscribeValidation.js ***! + \************************************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ "../config/instance.js"); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../config/users.js */ "../config/users.js"); +/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js"); +/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js"); +/* harmony import */ var _tools_url_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./tools/url.js */ "./src/tools/url.js"); +/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tools/users.js */ "./src/tools/users.js"); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + +// -- PAGE PERMETTANT DE VALIDER LA CRÉATION DE SON COMPTE +/// Un token est transmis en paramètre de l'Url. Il a une validité limité dans le temps. +/// Si le token n'est pas/plus valide, on redirige l'utilisateur vers la page de connexion pour obtenir un nouveau lien. +/// Si le token est ok, on l'informe que tout est ok et lui propose de se connecter. +/// Si l'utilisateur a déjà une session active valide, c'est qu'il a déjà cliqué sur le lien. On le redirige vers sa page d'accueil. +// Fichier de configuration tirés du backend : + +var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0]; + + +var configTemplate = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); // Importation des fonctions utiles au script : + + + + + + + // Dictionnaires : + +var txt = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + lang + "/general"); + +var txtUsers = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/user$")("./" + lang + "/user"); + +var divResponse = document.getElementById("response"); + +var initialise = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + var isConnected, user, homePage, datas, xhr; + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _context.prev = 0; + _context.next = 3; + return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_6__["checkSession"])(); + + case 3: + isConnected = _context.sent; + + if (isConnected) { + Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("message", { + message: txtUsers.alreadyConnected, + color: "information" + }); + user = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("user", true); + homePage = user.status + "HomePage"; // lors de la création, seul le statut 'user" est possible + + window.location.assign("/" + configTemplate[homePage]); + } else { + datas = Object(_tools_url_js__WEBPACK_IMPORTED_MODULE_5__["getUrlParams"])(); + + if (datas && datas.t !== undefined) { + xhr = new XMLHttpRequest(); + xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["userRoutes"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["checkSubscribeTokenRoute"] + datas.t); + + xhr.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var response = JSON.parse(this.responseText); + + if (this.status === 200 && response.userId != undefined && response.token != undefined) { + Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("message", { + message: txtUsers.validationMessage, + color: "success" + }); // pour l'afficher sur la page suivante + + window.location.assign("/" + configTemplate.connectionPage); + } else if ((this.status === 200 || this.status === 404) && response.errors != undefined) { + if (Array.isArray(response.errors)) response.errors = response.errors.join("
    ");else response.errors = txt.serverError; + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", response.errors, "", ["error"]); + } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", txtUsers.badLinkValidationMessage.replace("#URL", configTemplate.connectionPage), "", ["error"]); + } + }; + + xhr.send(); + } + } + + _context.next = 11; + break; + + case 7: + _context.prev = 7; + _context.t0 = _context["catch"](0); + console.error(_context.t0); + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]); + + case 11: + case "end": + return _context.stop(); + } + } + }, _callee, null, [[0, 7]]); + })); + + return function initialise() { + return _ref.apply(this, arguments); + }; +}(); + +initialise(); +Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_4__["helloDev"])(); + +/***/ }), + +/***/ "./src/tools/clientstorage.js": +/*!************************************!*\ + !*** ./src/tools/clientstorage.js ***! + \************************************/ +/*! exports provided: saveLocaly, getLocaly, removeLocaly */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveLocaly", function() { return saveLocaly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaly", function() { return getLocaly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeLocaly", function() { return removeLocaly; }); +// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.) +// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie +var saveLocaly = function saveLocaly(name, data) { + localStorage.setItem(name, JSON.stringify(data)); +}; +var getLocaly = function getLocaly(name) { + var json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name); +}; +var removeLocaly = function removeLocaly(name) { + localStorage.removeItem(name); +}; + +/***/ }), + +/***/ "./src/tools/dom.js": +/*!**************************!*\ + !*** ./src/tools/dom.js ***! + \**************************/ +/*! exports provided: addElement */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addElement", function() { return addElement; }); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__); +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + + // Fonction associant les attributs fournis à un champ de formulaire + +var addElement = function addElement(eltParent, eltType) { + var eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; + var eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; + var eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : []; + var eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; + var replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true; + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltType) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltParent)) return false;else { + var newElement = document.createElement(eltType); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ? + newElement.id = eltId; + + if (Array.isArray(eltClass) && eltClass.length != 0) { + for (var i in eltClass) { + newElement.classList.add(eltClass[i]); + } + } + + if (_typeof(eltAttributes) === "object") // !! tous les objets ne sont pas ok + { + for (var attributName in eltAttributes) { + newElement.setAttribute(attributName, eltAttributes[attributName]); + } + } + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltContent)) newElement.innerHTML = eltContent.replace(/\n/g, "
    "); // innerHTML permet d'ajouter du texte ayant lui-même des balises, etc. + + if (replace) eltParent.innerHTML = ""; + eltParent.appendChild(newElement); + } +}; + +/***/ }), + +/***/ "./src/tools/everywhere.js": +/*!*********************************!*\ + !*** ./src/tools/everywhere.js ***! + \*********************************/ +/*! exports provided: helloDev, updateAccountLink */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "helloDev", function() { return helloDev; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateAccountLink", function() { return updateAccountLink; }); +// Ce script fournit des fonctions utilisées sur toutes les pages du site +var helloDev = function helloDev() { + console.log("**** Hello ami développeur :-)\n Le code de WikiLerni est libre et est lisible sur gitlab : \n Bonne lecture :-) \n Pour les suggestions d'amélioration ou questions : dev@wililerni.com ****"); + return true; +}; +var updateAccountLink = function updateAccountLink(status, configTemplate) { + var link = document.getElementById("accountHeadLink"); + var homePage = status + "HomePage"; + link.href = "/" + configTemplate[homePage]; +}; + +/***/ }), + +/***/ "./src/tools/url.js": +/*!**************************!*\ + !*** ./src/tools/url.js ***! + \**************************/ +/*! exports provided: getUrlParams */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getUrlParams", function() { return getUrlParams; }); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__); + // Fonction récupérant les paramètres passés par l'url + +var getUrlParams = function getUrlParams() { + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(location.search)) return false; + var parameters = location.search.substring(1).split("&"); + if (!Array.isArray(parameters) || parameters.length === 0) return false; + var param, + datas = {}; + + for (var i in parameters) { + param = parameters[i].split("="); + if (param.length === 2) datas[param[0]] = decodeURI(param[1]); + } + + return datas; +}; + +/***/ }), + +/***/ "./src/tools/users.js": +/*!****************************!*\ + !*** ./src/tools/users.js ***! + \****************************/ +/*! exports provided: getConfig, getTimeDifference, getPassword, setSession, checkAnswerDatas, checkSession */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getConfig", function() { return getConfig; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTimeDifference", function() { return getTimeDifference; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getPassword", function() { return getPassword; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setSession", function() { return setSession; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkAnswerDatas", function() { return checkAnswerDatas; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkSession", function() { return checkSession; }); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/instance.js */ "../config/instance.js"); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../config/users.js */ "../config/users.js"); +/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_3__); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + + +var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0]; + +var configTemplate = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); + + + + // Récupère les données de configuration des utilisateurs +// À terme, un fichier statique importable comme module devrait éviter une requête ajax + +var getConfig = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + return _context.abrupt("return", new Promise(function (resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + "/user/getconfig"); + + xhr.onload = function () { + return resolve(JSON.parse(xhr.responseText)); + }; + + xhr.onerror = function () { + return reject(xhr.statusText); + }; + + xhr.send(); + })); + + case 1: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + + return function getConfig() { + return _ref.apply(this, arguments); + }; +}(); +var getTimeDifference = function getTimeDifference() { + var timeLocal = new Date().getTimezoneOffset(); + if (timeLocal > _config_users_js__WEBPACK_IMPORTED_MODULE_1__["timeDifferenceMax"] || timeLocal < _config_users_js__WEBPACK_IMPORTED_MODULE_1__["timeDifferenceMin"]) return 0;else return timeLocal; +}; // On enlève volontairement les 0/O pour éviter les confusions ! +// Et mieux vaut aussi débuter et finir par une lettre simple. + +var getPassword = function getPassword(nbCarMin, nbCarMax) { + var nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin)); + var letters = "ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz"; + var others = "123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ"; + var password = letters[Math.floor(Math.random() * letters.length)]; + + for (var i = 1; i < nbCar - 1; i++) { + if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)]; + } + + password += letters[Math.floor(Math.random() * letters.length)]; + return password; +}; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite +// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides. + +var setSession = function setSession(userId, token, durationTS) { + var storageUser = { + id: userId, + token: token, + duration: durationTS + }; + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("user", storageUser); +}; // Vérifie qu'il y a des données locales concernant le résultat d'un quiz +// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas + +var checkAnswerDatas = function checkAnswerDatas(datas) { + var lastAnswer = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("lastAnswer"); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(lastAnswer)) { + var answer = JSON.parse(lastAnswer); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.duration) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbCorrectAnswers) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.QuestionnaireId) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbQuestions)) { + datas.duration = answer.duration; + datas.nbCorrectAnswers = answer.nbCorrectAnswers; + datas.QuestionnaireId = answer.QuestionnaireId; + datas.nbQuestions = answer.nbQuestions; + } + } + + return datas; +}; // Cette fonction teste la connexion de l'utilisateur d'une page +// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté + +var checkSession = /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() { + var status, + urlRedirection, + message, + urlWanted, + _args2 = arguments; + return regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + status = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : []; + urlRedirection = _args2.length > 1 ? _args2[1] : undefined; + message = _args2.length > 2 ? _args2[2] : undefined; + urlWanted = _args2.length > 3 ? _args2[3] : undefined; + return _context2.abrupt("return", new Promise(function (resolve, reject) { + var userDatas = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("user"); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(userDatas)) { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else { + var user = JSON.parse(userDatas); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.id) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.token) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.duration) || user.duration < Date.now()) { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else { + var xhr = new XMLHttpRequest(); + xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["userRoutes"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["checkLoginRoute"] + user.token); + + xhr.onload = function () { + var response = JSON.parse(xhr.responseText); + + if (xhr.status === 200 && response.isValid && response.id != undefined) { + if (response.id === user.id) { + user.name = response.name; + user.language = response.language; + user.timeDifference = response.timeDifference; + user.status = response.status; // le token et de toute façon vérifier à chaque requête à l'API + + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("user", user); // si il s'agit d'un "user" et que son abonnement a expiré, je le redirige vers la caisse :-) + + if (response.status === "user" && response.nbDaysOk <= 0) { + var urlAccount = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["siteUrl"] + "/" + configTemplate[lang].accountPage; + if (window.location.href.indexOf(urlAccount) === -1) window.location.assign("/" + configTemplate[lang].accountPage); // passée directement ici, l'ancre #subscribe ne fonctionne pas !? + + resolve(true); + } else { + if (status.length !== 0 && status.indexOf(response.status) === -1) { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else resolve(true); + } + } else { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + } else { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + }; + + xhr.onerror = function () { + return reject(xhr.statusText); + }; + + xhr.send(); + } + } + })); + + case 5: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + + return function checkSession() { + return _ref2.apply(this, arguments); + }; +}(); // Cette fonction sert à la précédente en cas de connexion non valide + +var redirectUser = function redirectUser(urlRedirection, message, urlWanted) { + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(message)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("message", message); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlWanted)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("url", urlWanted); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlRedirection)) window.location.assign(urlRedirection); +}; + +/***/ }) + +/******/ }); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9nZW5lcmFsJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3VzZXIkIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL2dlbmVyYWwuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcvZnIvdXNlci5qcyIsIndlYnBhY2s6Ly8vLi4vdG9vbHMvbWFpbi5qcyIsIndlYnBhY2s6Ly8vLi4vdmlld3Mgc3luYyBeXFwuXFwvLipcXC5qcyQiLCJ3ZWJwYWNrOi8vLy4uL3ZpZXdzL2RlZmF1bHQvY29uZmlnL2ZyLmpzIiwid2VicGFjazovLy8uL3NyYy9zdWJzY3JpYmVWYWxpZGF0aW9uLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy9jbGllbnRzdG9yYWdlLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy9kb20uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2V2ZXJ5d2hlcmUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL3VybC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvdXNlcnMuanMiXSwibmFtZXMiOlsidXNlcnMiLCJyZXF1aXJlIiwicXVlc3Rpb25uYWlyZXMiLCJtb2R1bGUiLCJleHBvcnRzIiwiYXBpVXJsIiwic2l0ZVVybCIsImFkbWluTmFtZSIsImFkbWluRW1haWwiLCJzZW5kZXJOYW1lIiwic2VuZGVyRW1haWwiLCJhZG1pbkxhbmciLCJ0aGVtZSIsImF2YWlsYWJsZUxhbmdzIiwic2l0ZU5hbWUiLCJiZWdpbkNvZGVHb2RmYXRoZXIiLCJjcm9uVGltaW5nQWxlcnRJblNlY29uZGUiLCJyZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlIiwidG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnMiLCJ0b2tlbkxvZ2luTGlua1RpbWVJbkhvdXJzIiwidG9rZW5Db25uZXhpb25NaW5UaW1lSW5Ib3VycyIsInRva2VuQ29ubmV4aW9uTWF4VGltZUluRGF5cyIsInRva2VuTG9naW5DaGFuZ2luZ1RpbWVJbkhvdXJzIiwidG9rZW5EZWxldGVVc2VyVGltZUluSG91cnMiLCJ0b2tlblVuc3Vic2NyaWJlTGlua1RpbWVJbkRheXMiLCJmcmVlQWNjb3VudFRpbWluZ0luRGF5cyIsImZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5cyIsImFjY291bnRFeHBpcmF0aW9uRmlyc3ROb3RpZmljYXRpb25JbkRheXMiLCJhY2NvdW50RXhwaXJhdGlvblNlY29uZE5vdGlmaWNhdGlvbkluRGF5cyIsImluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5cyIsIm5iUXVlc3Rpb25zTWluIiwibmJRdWVzdGlvbnNNYXgiLCJuYkNob2ljZXNNYXgiLCJuYk5ld1F1ZXN0aW9ubmFpcmVzIiwiaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlQmVnaW4iLCJob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQiLCJudW1iZXJOZXdRdWVzdGlvbm5haXJlQXRTYW1lVGltZSIsIm1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzIiwibmJJbGx1c3RyYXRpb25zTWluIiwibmJJbGx1c3RyYXRpb25zTWF4IiwibWF4SWxsdXN0cmF0aW9uU2l6ZWluT2N0ZXQiLCJtaW1lVHlwZXNGb3JJbGx1c3RyYXRpb24iLCJpbGx1c3RyYXRpb25zV2lkdGhNYXhJblB4IiwiaWxsdXN0cmF0aW9uc01pbmlhdHVyZXNXaWR0aE1heEluUHgiLCJuYkxpbmtzTWluIiwibmJMaW5rc01heCIsInBhc3N3b3JkIiwibWlubGVuZ3RoIiwiZGlyQ2FjaGVVc2VycyIsImRpckNhY2hlVXNlcnNBbnN3ZXJzIiwiZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyIsImRpckNhY2hlUXVlc3Rpb25zIiwiZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzIiwiZGlySFRNTFF1ZXN0aW9ubmFpcmUiLCJkaXJXZWJRdWVzdGlvbm5haXJlIiwicXVlc3Rpb25uYWlyZVJvdXRlcyIsImdldFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlcyIsInB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJzYXZlQW5zd2Vyc1JvdXRlIiwiZ2V0U3RhdHNRdWVzdGlvbm5haXJlcyIsInNlYXJjaFF1ZXN0aW9ubmFpcmVzUm91dGUiLCJzZWFyY2hBZG1pblF1ZXN0aW9ubmFpcmVzUm91dGUiLCJnZXRMaXN0TmV4dFF1ZXN0aW9ubmFpcmVzIiwicXVlc3Rpb25zUm91dGUiLCJ0YWdzU2VhcmNoUm91dGUiLCJnZXRRdWVzdGlvbm5haXJlc1dpdGhvdXRBbnN3ZXIiLCJnZXRQcmV2aW91c0Fuc3dlcnMiLCJnZXRTdGF0c0Fuc3dlcnMiLCJnZXRBZG1pblN0YXRzIiwiUXVlc3Rpb25uYWlyZSIsInRpdGxlIiwibWF4bGVuZ3RoIiwicmVxdWlyZWQiLCJzbHVnIiwiaW50cm9kdWN0aW9uIiwic2VhcmNoUXVlc3Rpb25uYWlyZXMiLCJRdWVzdGlvbiIsInRleHQiLCJyYW5rIiwibWluIiwiZGVmYXVsdFZhbHVlIiwiQ2hvaWNlIiwibmJUYWdzTWluIiwibmJUYWdzTWF4IiwiZGlyQ2FjaGVUYWdzIiwiZGlySFRNTFRhZ3MiLCJkaXJXZWJUYWdzIiwidXNlclJvdXRlcyIsInN1YnNjcmliZVJvdXRlIiwiZ2V0R29kZmF0aGVyUm91dGUiLCJjaGVja0lmSXNFbWFpbGZyZWVSb3V0ZSIsImNoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZSIsImNoZWNrTG9naW5Sb3V0ZSIsImNvbm5lY3Rpb25Sb3V0ZSIsImdldExvZ2luTGlua1JvdXRlIiwiY29ubmVjdGlvbldpdGhMaW5rUm91dGUiLCJnZXRVc2VySW5mb3MiLCJjcmVhdGVVc2VyUm91dGUiLCJ2YWxpZGF0ZVVzZXJSb3V0ZSIsInVwZGF0ZVVzZXJJbmZvcyIsInNlYXJjaFVzZXJSb3V0ZSIsImdldEdvZENoaWxkcyIsImNoZWNrTmV3TG9naW5MaW5rUm91dGUiLCJjaGVja0RlbGV0ZUxpbmtSb3V0ZSIsImdldFBheW1lbnRzIiwidW5zdWJzY3JpYmVSb3V0ZSIsIm5hbWUiLCJlbWFpbCIsIm5ld1Bhc3N3b3JkIiwiY29kZUdvZGZhdGhlciIsImNndU9rIiwidmFsdWUiLCJ0aW1lRGlmZmVyZW5jZU1pbiIsInRpbWVEaWZmZXJlbmNlTWF4Iiwic2l0ZUhUTUxUaXRsZSIsInNpdGVNZXRhRGVzY3JpcHRpb24iLCJzY3JpcHRUaW1pbmdJbmZvIiwic2NyaXB0VGltaW5nQWxlcnQiLCJzZXJ2ZXJFcnJvciIsInNlcnZlckVycm9yQWRtaW4iLCJuZWVkZWRQYXJhbXMiLCJiYWRVcmwiLCJub3RWYWxpZEZvcm1hdCIsIm5vdEFsbG93ZWQiLCJub3RSZXF1aXJlZCIsInVwZGF0ZUJ0blR4dCIsImFkZEJ0blR4dCIsImRlbGV0ZUJ0blR4dCIsImFkZE9rTWVzc2FnZSIsInVwZGF0ZU9rTWVzc2FnZSIsImRlbGV0ZU9rTWVzc2FnZSIsImZhaWxBdXRoIiwiZmFpbEF1dGhIZWFkZXIiLCJmYWlsQXV0aFRva2VuIiwiZmFpbEF1dGhJZCIsImZhaWxBdXRoQ3JvbiIsInByZXZpb3VzUGFnZSIsIm5leHRQYWdlIiwiYnRuTGlua1RvUXVlc3Rpb25uYWlyZSIsInN0YXRzQWRtaW4iLCJub3RGb3VuZCIsIm5lZWROYW1lIiwibmVlZE5vdFRvb0xvbmdOYW1lIiwibmVlZEVtYWlsIiwibmVlZFVuaXF1ZUVtYWlsIiwibmVlZE5vdFRvb0xvbmdFbWFpbCIsIm5lZWRQYXNzV29yZCIsIm5lZWRMb25nUGFzc1dvcmQiLCJwYXNzd29yZENvcGllZCIsIm5lZWRTdGF0dXMiLCJuZWVkTGFuZ3VhZ2UiLCJuZWVkVmFsaWRMYXN0Q29ubmVjdGlvbkRhdGUiLCJuZWVkU01UUCIsIm5lZWRTTVRQTm90Rm91bmQiLCJuZWVkS25vd05ld3NsZXR0ZXJPayIsIm5lZWRUaW1lRGlmZmVyZW5jZSIsIm5lZWRNaW5UaW1lRGlmZmVyZW5jZSIsIm5lZWRNYXhUaW1lRGlmZmVyZW5jZSIsIm5lZWRVR0NPayIsImdvZGZhdGhlck5vdEZvdW5kIiwiZ29kZmF0aGVyRm91bmQiLCJtYWlsVmFsaWRhdGlvbk1lc3NhZ2UiLCJtYWlsVmFsaWRhdGlvbkxpbmtTdWJqZWN0IiwibWFpbFZhbGlkYXRpb25MaW5rU0JvZHlUeHQiLCJtYWlsVmFsaWRhdGlvbkxpbmtTQm9keUhUTUwiLCJ2YWxpZGF0aW9uTWVzc2FnZSIsInZhbGlkYXRpb25NZXNzYWdlQWRtaW4iLCJ2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2UiLCJ2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2VBZG1pbiIsIm1haWxXZWxjb21lU3ViamVjdCIsIm1haWxXZWxjb21lQm9keVR4dCIsIm1haWxXZWxjb21lQm9keUhUTUwiLCJtYWlsVGhhbmtHb2RmYXRoZXJTdWJqZWN0IiwibWFpbFRoYW5rR29kZmF0aGVyQm9keVR4dCIsIm1haWxUaGFua0dvZGZhdGhlckJvZHlIVE1MIiwiYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlIiwiZW1haWxOb3RGb3VuZCIsImFscmVhZHlDb25uZWN0ZWQiLCJuZWVkQmVDb25uZWN0ZWQiLCJjb25uZWN0aW9uT2siLCJuZWVkQ2hvb3NlTG9naW5XYXkiLCJuZWVkVmFsaWRhdGlvblRvTG9naW4iLCJ0b29NYW55TG9naW5GYWlscyIsImJhZFBhc3N3b3JkIiwibWFpbExvZ2luTGlua1N1YmplY3QiLCJtYWlsTG9naW5MaW5rQm9keVR4dCIsIm1haWxMb2dpbkxpbmtCb2R5SFRNTCIsIm1haWxMb2dpbkxpbmtNZXNzYWdlIiwidXBkYXRlZE9rTWVzc2FnZSIsInVwZGF0ZWROZWVkR29vZEVtYWlsIiwidXBkYXRlZE5lZWRVbmlxdWVFbWFpbCIsIm1haWxVcGRhdGVMb2dpblN1YmplY3QiLCJtYWlsVXBkYXRlTG9naW5Cb2R5VHh0IiwibWFpbFVwZGF0ZUxvZ2luQm9keUhUTUwiLCJtYWlsVXBkYXRlTG9naW5MaW5rTWVzc2FnZSIsInVwZGF0ZWROZWVkVmFsaWRhdGVkVXNlciIsInVwZGF0ZWROZWVkR29vZEdvZGZhdGhlciIsIm1haWxVcGRhdGVMb2dpbk9rTWVzc2FnZSIsInVwZGF0ZWRGYWlsZWRHb2RmYXRoZXJOb3RGb3VuZCIsImNyZWF0aW9uT2tNZXNzYWdlIiwibWFpbERlbGV0ZVN1YmplY3QiLCJtYWlsRGVsZXRlQm9keVR4dCIsIm1haWxEZWxldGVCb2R5SFRNTCIsIm1haWxEZWxldGVMaW5rTWVzc2FnZSIsImRlbGV0ZUZhaWxNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtPa01lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua0FscmVhZHlNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtGYWlsTWVzc2FnZSIsImNyb25EZWxldGVVbnZhbGlkZWRVc2Vyc01lc3NhZ2UiLCJkZWxldGVJbmFjdGl2ZVVzZXJzTWVzc2FnZSIsIndlbGNvbWVNZXNzYWdlIiwiYnllYnllTWVzc2FnZSIsImluZm9zVXNlckZvckFkbWluIiwiaW5mb3NBZG1pbkdvZGZhdGhlciIsImluZm9zQWRtaW5OYkdvZENoaWxkcyIsIlRvb2wiLCJteVZhciIsInVuZGVmaW5lZCIsInRyaW0iLCJteVN0cmluZyIsImlzRW1wdHkiLCJtYXgiLCJsZW5ndGgiLCJzdWJzdHJpbmciLCJtYXBPYmoiLCJyZXBsYWNlRWx0cyIsIlJlZ0V4cCIsIk9iamVjdCIsImtleXMiLCJqb2luIiwicmVwbGFjZSIsIm1hdGNoZWQiLCJNYXRoIiwiY2VpbCIsImZsb29yIiwicmFuZG9tIiwiZGF0ZVN0cmluZyIsImxhbmciLCJteURhdGUiLCJEYXRlIiwibXlEYXkiLCJnZXREYXRlIiwibXlNb3VudGgiLCJnZXRNb250aCIsIm15WWVhciIsImdldEZ1bGxZZWFyIiwiaGVhZExpbmtzIiwiYW5jaG9yIiwiYXR0cmlidXRlcyIsImhyZWYiLCJpZCIsImZvb3RMaW5rcyIsInJlbCIsIm1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlIiwidXNlckhvbWVQYWdlIiwiYWRtaW5Ib21lUGFnZSIsIm1hbmFnZXJIb21lUGFnZSIsInN1YnNjcmliZVBhZ2UiLCJjb25uZWN0aW9uUGFnZSIsImFjY291bnRQYWdlIiwicXVlc3Rpb25uYWlyZXNNYW5hZ2VtZW50UGFnZSIsInVzZXJzTWFuYWdlbWVudFBhZ2UiLCJuYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlIiwiaWxsdXN0cmF0aW9uRGlyIiwic2l0ZVNsb2dhbiIsImhvbWVUaXRsZTEiLCJob21lUDEiLCJob21lVGl0bGUyIiwiaG9tZVAyIiwibmV3UXVlc3Rpb25uYWlyZXNUaXRsZSIsIm5ld1F1ZXN0aW9ubmFpcmVzSW50cm8iLCJleHBsYW5hdGlvblRpdGxlIiwiZXhwbGFuYXRpb25UeHQiLCJub0pTTm90aWZpY2F0aW9uIiwiY29uZmlnVGVtcGxhdGUiLCJ0eHQiLCJ0eHRVc2VycyIsImRpdlJlc3BvbnNlIiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImluaXRpYWxpc2UiLCJjaGVja1Nlc3Npb24iLCJpc0Nvbm5lY3RlZCIsInNhdmVMb2NhbHkiLCJtZXNzYWdlIiwiY29sb3IiLCJ1c2VyIiwiZ2V0TG9jYWx5IiwiaG9tZVBhZ2UiLCJzdGF0dXMiLCJ3aW5kb3ciLCJsb2NhdGlvbiIsImFzc2lnbiIsImRhdGFzIiwiZ2V0VXJsUGFyYW1zIiwidCIsInhociIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsIm9ucmVhZHlzdGF0ZWNoYW5nZSIsInJlYWR5U3RhdGUiLCJET05FIiwicmVzcG9uc2UiLCJKU09OIiwicGFyc2UiLCJyZXNwb25zZVRleHQiLCJ1c2VySWQiLCJ0b2tlbiIsImVycm9ycyIsIkFycmF5IiwiaXNBcnJheSIsImFkZEVsZW1lbnQiLCJzZW5kIiwiY29uc29sZSIsImVycm9yIiwiaGVsbG9EZXYiLCJkYXRhIiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsInN0cmluZ2lmeSIsImpzb24iLCJnZXRJdGVtIiwicmVtb3ZlTG9jYWx5IiwicmVtb3ZlSXRlbSIsImVsdFBhcmVudCIsImVsdFR5cGUiLCJlbHRDb250ZW50IiwiZWx0SWQiLCJlbHRDbGFzcyIsImVsdEF0dHJpYnV0ZXMiLCJuZXdFbGVtZW50IiwiY3JlYXRlRWxlbWVudCIsImkiLCJjbGFzc0xpc3QiLCJhZGQiLCJhdHRyaWJ1dE5hbWUiLCJzZXRBdHRyaWJ1dGUiLCJpbm5lckhUTUwiLCJhcHBlbmRDaGlsZCIsImxvZyIsInVwZGF0ZUFjY291bnRMaW5rIiwibGluayIsInNlYXJjaCIsInBhcmFtZXRlcnMiLCJzcGxpdCIsInBhcmFtIiwiZGVjb2RlVVJJIiwiZ2V0Q29uZmlnIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJvbmxvYWQiLCJvbmVycm9yIiwic3RhdHVzVGV4dCIsImdldFRpbWVEaWZmZXJlbmNlIiwidGltZUxvY2FsIiwiZ2V0VGltZXpvbmVPZmZzZXQiLCJnZXRQYXNzd29yZCIsIm5iQ2FyTWluIiwibmJDYXJNYXgiLCJuYkNhciIsImxldHRlcnMiLCJvdGhlcnMiLCJzZXRTZXNzaW9uIiwiZHVyYXRpb25UUyIsInN0b3JhZ2VVc2VyIiwiZHVyYXRpb24iLCJjaGVja0Fuc3dlckRhdGFzIiwibGFzdEFuc3dlciIsImFuc3dlciIsIm5iQ29ycmVjdEFuc3dlcnMiLCJRdWVzdGlvbm5haXJlSWQiLCJuYlF1ZXN0aW9ucyIsInVybFJlZGlyZWN0aW9uIiwidXJsV2FudGVkIiwidXNlckRhdGFzIiwicmVkaXJlY3RVc2VyIiwibm93IiwiaXNWYWxpZCIsImxhbmd1YWdlIiwidGltZURpZmZlcmVuY2UiLCJuYkRheXNPayIsInVybEFjY291bnQiLCJpbmRleE9mIl0sIm1hcHBpbmdzIjoiO1FBQUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7OztRQUdBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwwQ0FBMEMsZ0NBQWdDO1FBQzFF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LDZCQUFPLENBQUMsS0FBRCxDQUFQO0FBQ0g7QUFDSixtQkE1Q0Q7O0FBNkNBckQscUJBQUcsQ0FBQ3dELE9BQUosR0FBYztBQUFBLDJCQUFNRixNQUFNLENBQUN0RCxHQUFHLENBQUN5RCxVQUFMLENBQVo7QUFBQSxtQkFBZDs7QUFDQXpELHFCQUFHLENBQUNnQixJQUFKO0FBQ0g7QUFDSjtBQUNKLGFBdEVNLENBRmlCOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEdBQUg7O0FBQUEsa0JBQVovQixZQUFZO0FBQUE7QUFBQTtBQUFBLEdBQWxCLEMsQ0EwRVA7O0FBQ0EsSUFBTStGLFlBQVksR0FBRyxTQUFmQSxZQUFlLENBQUNILGNBQUQsRUFBaUJ6RixPQUFqQixFQUEwQjBGLFNBQTFCLEVBQ3JCO0FBQ0ksTUFBRyxDQUFDMUosMkRBQU8sQ0FBQ2dFLE9BQUQsQ0FBWCxFQUNJRCxvRUFBVSxDQUFDLFNBQUQsRUFBWUMsT0FBWixDQUFWO0FBQ0osTUFBRyxDQUFDaEUsMkRBQU8sQ0FBQzBKLFNBQUQsQ0FBWCxFQUNJM0Ysb0VBQVUsQ0FBQyxLQUFELEVBQVEyRixTQUFSLENBQVY7QUFDSixNQUFHLENBQUMxSiwyREFBTyxDQUFDeUosY0FBRCxDQUFYLEVBQ0luRixNQUFNLENBQUNDLFFBQVAsQ0FBZ0JDLE1BQWhCLENBQXVCaUYsY0FBdkI7QUFDUCxDQVJELEMiLCJmaWxlIjoiLi9KUy9zdWJzY3JpYmVWYWxpZGF0aW9uLmFwcC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL3N1YnNjcmliZVZhbGlkYXRpb24uanNcIik7XG4iLCJjb25zdCB1c2VycyA9IHJlcXVpcmUoXCIuL3VzZXJzXCIpO1xuY29uc3QgcXVlc3Rpb25uYWlyZXMgPSByZXF1aXJlKFwiLi9xdWVzdGlvbm5haXJlc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIGFwaVVybDogXCJodHRwOi8vbG9jYWxob3N0OjMwMDAvYXBpXCIsXG4gICAgc2l0ZVVybDogXCJodHRwOi8vbG9jYWxob3N0OjgwODBcIixcbiAgICBhZG1pbk5hbWU6IFwiRmFicmljZVwiLFxuICAgIGFkbWluRW1haWw6IFwiZGV2QHdpa2lsZXJuaS5jb21cIixcbiAgICBzZW5kZXJOYW1lOiBcIldpa2lMZXJuaVwiLFxuICAgIHNlbmRlckVtYWlsOiBcImJvbmpvdXJAd2lraWxlcm5pLmNvbVwiLFxuICAgIGFkbWluTGFuZzogXCJmclwiLFxuICAgIHRoZW1lOiBcImRlZmF1bHRcIiwgLy8gbGUgdGjDqG1lIHV0aWxpc8OpIChkYW5zIC92aWV3cykgcG91ciBnw6luw6lyZXIgbGVzIHBhZ2VzIEhUTUwuIENvbnRpZW50IHNlcyBwcm9wcmVzIGZpY2hpZXJzIGRlIGNvbmZpZ3VyYXRpb24uXG4gICAgYXZhaWxhYmxlTGFuZ3M6IFtcImZyXCJdLC8vIExhbmd1YWdlcyBpbiB3aGljaCB0aGUgc2l0ZSBpcyBhdmFpbGFibGUuIFRoZSBmaXJzdCBvbmUgaXMgdGhlIGRlZmF1bHQgb25lLlxuICAgIHNpdGVOYW1lOiBcIldpa2lMZXJuaVwiLFxuICAgIGJlZ2luQ29kZUdvZGZhdGhlcjogXCJ3aWtpbGVybmlcIiwgLy8gY2FzZS1zZW5zaXRpdmUgYW5kIGNhbid0IGNvbnRhaW4gXCJAXCIgIVxuICAgIGNyb25UaW1pbmdBbGVydEluU2Vjb25kZTogMTIwLCAvLyBmb3IgbG9nc1xuICAgIHJlc3BvbnNlVGltaW5nQWxlcnRJblNlY29uZGU6IDMsIC8vIGlkZW1cbiAgICB0b2tlblNpZ251cFZhbGlkYXRpb25UaW1lSW5Ib3VyczogXCI0OGhcIiwgLy8gaHR0cHM6Ly9naXRodWIuY29tL3plaXQvbXNcbiAgICB0b2tlbkxvZ2luTGlua1RpbWVJbkhvdXJzOiBcIjFoXCIsXG4gICAgdG9rZW5Db25uZXhpb25NaW5UaW1lSW5Ib3VyczogXCIyNGhcIixcbiAgICB0b2tlbkNvbm5leGlvbk1heFRpbWVJbkRheXM6IFwiMTgwIGRheXNcIixcbiAgICB0b2tlbkxvZ2luQ2hhbmdpbmdUaW1lSW5Ib3VyczogXCIxaFwiLC8vIGZvciBlbWFpbCAmIHBhc3N3b3JkIGNoYW5naW5nXG4gICAgdG9rZW5EZWxldGVVc2VyVGltZUluSG91cnM6IFwiMWhcIixcbiAgICB0b2tlblVuc3Vic2NyaWJlTGlua1RpbWVJbkRheXM6IFwiNyBkYXlzXCIsIC8vIHRva2VuIHNlbmQgd2l0aCBzdWJzY3JpcHRpb24ncyBlbWFpbHNcbiAgICBmcmVlQWNjb3VudFRpbWluZ0luRGF5czogMTAsXG4gICAgZnJlZUFjY291bnRFeHBpcmF0aW9uTm90aWZpY2F0aW9uSW5EYXlzOiA1LFxuICAgIGFjY291bnRFeHBpcmF0aW9uRmlyc3ROb3RpZmljYXRpb25JbkRheXM6IDE0LCAgICBcbiAgICBhY2NvdW50RXhwaXJhdGlvblNlY29uZE5vdGlmaWNhdGlvbkluRGF5czogNSxcbiAgICBpbmFjdGl2ZUFjY291bnRUaW1lVG9EZWxldGVJbkRheXM6IDE4MCxcbiAgICAvLyBRdWVzdGlvbm5haXJlczpcbiAgICBuYlF1ZXN0aW9uc01pbjogMSwgLy8gbWluaW11bSBudW1iZXIgb2YgcXVlc3Rpb25zIGZvciB0aGUgcXVlc3Rpb25uYWlyZSB0byBiZSBwdWJsaXNoYWJsZVxuICAgIG5iUXVlc3Rpb25zTWF4OiAxMCwgLy8gaWYgMCA9IG5vdCBtYXhpbXVtXG4gICAgbmJDaG9pY2VzTWF4OiAxMCxcbiAgICBuYk5ld1F1ZXN0aW9ubmFpcmVzOiAxMCwvLyBmb3IgUlNTLCBldGMuXG4gICAgaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlQmVnaW46MSwgLy8gaW4gdXNlciBsb2NhbCB0aW1lXG4gICAgaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlRW5kOjI0LCAvLyBpZGVtXG4gICAgbnVtYmVyTmV3UXVlc3Rpb25uYWlyZUF0U2FtZVRpbWU6IDUwLCAvLyBmb3IgbWFzcyBtYWlsaW5nXG4gICAgbWluU2VhcmNoUXVlc3Rpb25uYWlyZXM6IDMsXG4gICAgLy8gSWxsdXN0cmF0aW9uczpcbiAgICBuYklsbHVzdHJhdGlvbnNNaW46IDAsXG4gICAgbmJJbGx1c3RyYXRpb25zTWF4OiAxLFxuICAgIG1heElsbHVzdHJhdGlvblNpemVpbk9jdGV0OiAxMDAwMDAwLC8vIHBhcyBjb250csO0bMOpIHBvdXIgbCdpbnN0YW50LiDDgCByZXZvaXIuXG4gICAgbWltZVR5cGVzRm9ySWxsdXN0cmF0aW9uOiBbIFwiaW1hZ2UvanBnXCIsIFwiaW1hZ2UvanBlZ1wiLCBcImltYWdlL3BuZ1wiLCBcImltYWdlL2dpZlwiLCBcImltYWdlL3BuZ1wiIF0sXG4gICAgLy8gLS0gVXBsb2FkIGFuZCByZXNpemU6XG4gICAgaWxsdXN0cmF0aW9uc1dpZHRoTWF4SW5QeDogNDAwLFxuICAgIGlsbHVzdHJhdGlvbnNNaW5pYXR1cmVzV2lkdGhNYXhJblB4OiAyMDAsXG4gICAgLy8gTGlua3M6XG4gICAgbmJMaW5rc01pbjogMSxcbiAgICBuYkxpbmtzTWF4OiAxLFxuICAgIC8vIMOgIHN1cHByaW1lciBxdWFuZCB0b3VzIGxlcyBcInJlcXVpcmVcIiDDoCBqb3VyOlxuICAgIG5iUXVlc3Rpb25zTWluOiBxdWVzdGlvbm5haXJlcy5uYlF1ZXN0aW9uc01pbixcbiAgICBuYlF1ZXN0aW9uc01heDogcXVlc3Rpb25uYWlyZXMubmJRdWVzdGlvbnNNYXgsXG4gICAgbmJDaG9pY2VzTWF4OiBxdWVzdGlvbm5haXJlcy5uYkNob2ljZXNNYXgsXG4gICAgcGFzc3dvcmRNaW5MZW5ndGg6IHVzZXJzLnBhc3N3b3JkLm1pbmxlbmd0aCxcbiAgICBkaXJDYWNoZVVzZXJzOiB1c2Vycy5kaXJDYWNoZVVzZXJzLFxuICAgIGRpckNhY2hlVXNlcnNBbnN3ZXJzOiB1c2Vycy5kaXJDYWNoZVVzZXJzQW5zd2VycyxcbiAgICBkaXJDYWNoZVF1ZXN0aW9ubmFpcmVzOiBxdWVzdGlvbm5haXJlcy5kaXJDYWNoZVF1ZXN0aW9ubmFpcmVzLFxuICAgIGRpckNhY2hlUXVlc3Rpb25zOiBxdWVzdGlvbm5haXJlcy5kaXJDYWNoZVF1ZXN0aW9ucyxcbiAgICBkaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlcyxcbiAgICBkaXJIVE1MUXVlc3Rpb25uYWlyZTogcXVlc3Rpb25uYWlyZXMuZGlySFRNTFF1ZXN0aW9ubmFpcmUsXG4gICAgZGlyV2ViUXVlc3Rpb25uYWlyZTogcXVlc3Rpb25uYWlyZXMuZGlyV2ViUXVlc3Rpb25uYWlyZVxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57ICAgIFxuICAgIC8vIEFQSSdyb3V0ZXMgKGFmdGVyIFwiYXBpVXJsXCIgZGVmaW5lZCBpbiBpbnN0YW5jZS5qcylcbiAgICBxdWVzdGlvbm5haXJlUm91dGVzOiBcIi9xdWVzdGlvbm5haXJlXCIsXG4gICAgZ2V0UXVlc3Rpb25uYWlyZVJvdXRlczogXCIvZ2V0XCIsXG4gICAgcHJldmlld1F1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3ByZXZpZXdcIixcbiAgICBwdWJsaXNoZWRRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9xdWl6L1wiLFxuICAgIHNhdmVBbnN3ZXJzUm91dGU6IFwiL2Fuc3dlci9cIixcbiAgICBnZXRTdGF0c1F1ZXN0aW9ubmFpcmVzIDogXCIvc3RhdHMvXCIsXG4gICAgc2VhcmNoUXVlc3Rpb25uYWlyZXNSb3V0ZSA6IFwiL3NlYXJjaFwiLFxuICAgIHNlYXJjaEFkbWluUXVlc3Rpb25uYWlyZXNSb3V0ZSA6IFwiL3NlYXJjaGFkbWluXCIsXG4gICAgZ2V0TGlzdE5leHRRdWVzdGlvbm5haXJlczogXCIvZ2V0bGlzdG5leHRxdWVzdGlvbm5haXJlcy9cIixcbiAgICAvLyAtLSBxdWVzdGlvbnMgJiBjaG9pY2VzIDpcbiAgICBxdWVzdGlvbnNSb3V0ZTogXCIvcXVlc3Rpb24vXCIsXG4gICAgLy8gLS0gdGFncyA6XG4gICAgdGFnc1NlYXJjaFJvdXRlOiBcIi90YWdzL3NlYXJjaC9cIixcbiAgICAvLyAtLSBhbnN3ZXJzIDpcbiAgICBnZXRRdWVzdGlvbm5haXJlc1dpdGhvdXRBbnN3ZXI6IFwiL3dpdGhvdXRhbnN3ZXIvdXNlci9cIixcbiAgICBnZXRQcmV2aW91c0Fuc3dlcnM6IFwiL3VzZXIvYW5zd2Vycy9cIixcbiAgICBnZXRTdGF0c0Fuc3dlcnMgOiBcIi91c2VyL2Fud3N3ZXJzL3N0YXRzL1wiLFxuICAgIGdldEFkbWluU3RhdHM6IFwiL2dldGFkbWluc3RhdHMvXCIsXG4gICAgLy8gZm9ybXMgOiDDoCBjb21wbMOpdGVyIGF2ZWMgdmFsZXVycyBwYXIgZMOpZmF1dCwgZXRjLiBjZiBtb2TDqGxlXG4gICAgUXVlc3Rpb25uYWlyZSA6XG4gICAge1xuICAgICAgICB0aXRsZTogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgc2x1ZzogeyBtYXhsZW5ndGg6IDE1MCB9LCAvLyBjaGFtcCByZXF1aXMgbWFpcyBjYWxjdWzDqSDDoCBwYXJ0aXIgZHUgdGl0cmUgcWQgdmlkZVxuICAgICAgICBpbnRyb2R1Y3Rpb246IHsgcmVxdWlyZWQ6IHRydWUgfVxuICAgIH0sXG4gICAgc2VhcmNoUXVlc3Rpb25uYWlyZXMgOiB7IG1pbmxlbmd0aDogMywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBRdWVzdGlvbiA6XG4gICAge1xuICAgICAgICB0ZXh0OiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICByYW5rOiB7IHJlcXVpcmVkOiB0cnVlLCBtaW46MSwgZGVmYXVsdFZhbHVlOjEgfVxuICAgIH0sICAgICAgICAgIFxuICAgIENob2ljZSA6XG4gICAge1xuICAgICAgICB0ZXh0OiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9XG4gICAgfSwgICAgICAgICAgXG4gICAgbmJRdWVzdGlvbnNNaW46IDEsXG4gICAgbmJRdWVzdGlvbnNNYXg6IDEwLFxuICAgIG5iQ2hvaWNlc01heDogMTAsXG4gICAgbmJUYWdzTWluOiAwLFxuICAgIG5iVGFnc01heDogMCwgLy8gMCA9IG5vdCBtYXggICAgXG4gICAgLy8gSlNPTiBhbmQgSFRNTCBkaXJcbiAgICBkaXJDYWNoZVF1ZXN0aW9ubmFpcmVzIDogXCJkYXRhcy9xdWVzdGlvbm5haXJlc1wiLFxuICAgIGRpckNhY2hlUXVlc3Rpb25zIDogXCJkYXRhcy9xdWVzdGlvbm5haXJlcy9xdWVzdGlvbnNcIixcbiAgICBkaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXMgOiBcImRhdGFzL3VzZXJzL3F1ZXN0aW9ubmFpcmVzXCIsXG4gICAgZGlyQ2FjaGVUYWdzIDogXCJkYXRhcy9xdWVzdGlvbm5haXJlcy90YWdzXCIsICBcbiAgICBkaXJIVE1MUXVlc3Rpb25uYWlyZSA6IFwiZnJvbnQvcHVibGljL3F1aXpcIixcbiAgICBkaXJIVE1MVGFncyA6IFwiZnJvbnQvcHVibGljL3F1aXpzXCIsXG4gICAgZGlyV2ViUXVlc3Rpb25uYWlyZSA6IFwicXVpelwiLC8vcG91ciB1cmwgcGFnZVxuICAgIGRpcldlYlRhZ3MgOiBcInF1aXpzXCIvLyBpZGVtXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICAvLyBBUEkncm91dGVzIChhZnRlciBcImFwaVVybFwiIGRlZmluZWQgaW4gaW5zdGFuY2UuanMpXG4gICAgdXNlclJvdXRlczogXCIvdXNlclwiLFxuICAgIHN1YnNjcmliZVJvdXRlOiBcIi9zaWdudXBcIixcbiAgICBnZXRHb2RmYXRoZXJSb3V0ZTogXCIvZ2V0Z29kZmF0aGVyaWRcIixcbiAgICBjaGVja0lmSXNFbWFpbGZyZWVSb3V0ZTogXCIvaXNlbWFpbGZyZWVcIixcbiAgICBjaGVja1N1YnNjcmliZVRva2VuUm91dGU6IFwiL3ZhbGlkYXRpb24vXCIsXG4gICAgY2hlY2tMb2dpblJvdXRlOiBcIi9jaGVja2xvZ2luL1wiLFxuICAgIGNvbm5lY3Rpb25Sb3V0ZTogXCIvbG9naW5cIixcbiAgICBnZXRMb2dpbkxpbmtSb3V0ZTogXCIvZ2V0bG9naW5saW5rXCIsXG4gICAgY29ubmVjdGlvbldpdGhMaW5rUm91dGU6IFwiL2NoZWNrbG9naW5saW5rXCIsXG4gICAgZ2V0VXNlckluZm9zOiBcIi9nZXQvXCIsXG4gICAgY3JlYXRlVXNlclJvdXRlOiBcIi9jcmVhdGVcIixcbiAgICB2YWxpZGF0ZVVzZXJSb3V0ZTogXCIvdmFsaWRhdGUvXCIsXG4gICAgdXBkYXRlVXNlckluZm9zOiBcIi9tb2RpZnkvXCIsXG4gICAgc2VhcmNoVXNlclJvdXRlOiBcIi9zZWFyY2gvXCIsXG4gICAgZ2V0R29kQ2hpbGRzOiBcIi9nZXRnb2RjaGlsZHMvXCIsXG4gICAgY2hlY2tOZXdMb2dpbkxpbmtSb3V0ZTogXCIvY29uZmlybW5ld2xvZ2luL1wiLFxuICAgIGNoZWNrRGVsZXRlTGlua1JvdXRlOiBcIi9jb25maXJtZGVsZXRlL1wiLFxuICAgIGdldFBheW1lbnRzOiBcIi9wYXltZW50L2dldGZvcm9uZXVzZXIvXCIsXG4gICAgdW5zdWJzY3JpYmVSb3V0ZTogXCIvc3Vic2NyaXB0aW9uL3N0b3AvXCIsXG4gICAgZ2V0QWRtaW5TdGF0czogXCIvZ2V0YWRtaW5zdGF0cy9cIixcbiAgICAvLyBmb3JtcyA6IMOgIGNvbXBsw6l0ZXIgYXZlYyB2YWxldXJzIHBhciBkw6lmYXV0LCBldGMuIGNmIG1vZMOobGVcbiAgICBuYW1lOiB7IG1heGxlbmd0aDogNzAsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZW1haWw6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgcGFzc3dvcmQ6IHsgbWlubGVuZ3RoOiA4LCBtYXhsZW5ndGg6NzIsIHJlcXVpcmVkOiB0cnVlIH0sIC8vIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2JjcnlwdCNzZWN1cml0eS1pc3N1ZXMtYW5kLWNvbmNlcm5zXG4gICAgbmV3UGFzc3dvcmQ6IHsgbWlubGVuZ3RoOiA4LCBtYXhsZW5ndGg6NzIgfSxcbiAgICBjb2RlR29kZmF0aGVyOiB7IG1heGxlbmd0aDogMjU1IH0sXG4gICAgY2d1T2s6IHsgdmFsdWU6IFwidHJ1ZVwiLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHRpbWVEaWZmZXJlbmNlTWluOiAtNzIwLFxuICAgIHRpbWVEaWZmZXJlbmNlTWF4Ojg0MCxcbiAgICAvLyBKU09OIGRpclxuICAgIGRpckNhY2hlVXNlcnMgOiBcImRhdGFzL3VzZXJzXCIsXG4gICAgZGlyQ2FjaGVVc2Vyc0Fuc3dlcnMgOiBcImRhdGFzL3VzZXJzL3F1ZXN0aW9ubmFpcmVzL2Fuc3dlcnNcIlxufTtcbiIsInZhciBtYXAgPSB7XG5cdFwiLi9mci9nZW5lcmFsXCI6IFwiLi4vbGFuZy9mci9nZW5lcmFsLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvZ2VuZXJhbCRcIjsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZnIvdXNlclwiOiBcIi4uL2xhbmcvZnIvdXNlci5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi9sYW5nIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcL3VzZXIkXCI7IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIHNpdGVIVE1MVGl0bGUgOiBcIldpa2lMZXJuaSA6IHF1J2FsbGV6LXZvdXMgYXBwcmVuZHJlIGF1am91cmQnaHVpID9cIixcbiAgICBzaXRlTWV0YURlc2NyaXB0aW9uIDogXCJDaGFxdWUgam91ciwgdGVzdGV6IHZvcyBjb25uYWlzc2FuY2VzIGV0IGFwcHJlbmV6IGRlIG5vdXZlbGxlcyBjaG9zZXMgYXZlYyBXaWtpTGVybmkuXCIsXG4gICAgc2NyaXB0VGltaW5nSW5mbyA6IFwiRHVyw6llIGRlIGxhIHLDqXBvbnNlIDogU0NSSVBUX1RJTUlORyBtaWxsaXNlY29uZGVzLCByb3V0ZSA6IFNDUklQVF9VUkxcIixcbiAgICBzY3JpcHRUaW1pbmdBbGVydCA6IFwiKioqIFNjcmlwdCBsZW50IDogU0NSSVBUX1RJTUlORyBtaWxsaXNlY29uZGVzLCByb3V0ZSA6IFNDUklQVF9VUkxcIixcbiAgICBzZXJ2ZXJFcnJvciA6IFwiRMOpc29sw6kuIFVuZSBlcnJldXIgaW1wcsOpdnVlIGVzdCBzdXJ2ZW51ZS4gU2kgY2VsYSBwZXJzaXN0ZSwgbidow6lzaXRleiDDoCBwcsOpdmVuaXIgbCdhZG1pbmlzdHJhdGV1ciBkdSBzaXRlLlwiLFxuICAgIHNlcnZlckVycm9yQWRtaW4gOiBcIkJ1ZyBkZSBsJ2FwcGxpY2F0aW9uIDpcIixcbiAgICBuZWVkZWRQYXJhbXMgOiBcIkRlcyBwYXJhbcOodHJlcyBuw6ljZXNzYWlyZXMgbWFucXVhbnRzIHNvbnQgbWFucXVhbnRzLlwiLFxuICAgIGJhZFVybCA6IFwiVGVudGF0aXZlIGQnYWNjw6hzIMOgIHVuZSBwYWdlIG4nZXhpc3RhbnQgcGFzIDpcIixcbiAgICBub3RWYWxpZEZvcm1hdCA6IFwiRm9ybWF0IG5vbiB2YWxpZGUuXCIsXG4gICAgbm90QWxsb3dlZCA6IFwiVm91cyBuJ2F2ZXogcGFzIGxlcyBkcm9pdHMgbsOpY2Vzc2FpcmVzIHBvdXIgY2V0dGUgYWN0aW9uLlwiLFxuICAgIG5vdFJlcXVpcmVkIDogXCJGYWN1bHRhdGlmLlwiLFxuICAgIHVwZGF0ZUJ0blR4dDogXCJNb2RpZmllclwiLFxuICAgIGFkZEJ0blR4dDogXCJBam91dGVyXCIsXG4gICAgZGVsZXRlQnRuVHh0OiBcIlN1cHByaW1lclwiLFxuICAgIGFkZE9rTWVzc2FnZSA6IFwiTGVzIGRvbm7DqWVzIG9udCBiaWVuIMOpdMOpIGVucmVnaXN0csOpZXMuXCIsXG4gICAgdXBkYXRlT2tNZXNzYWdlIDogXCJMYSBtaXNlIMOgIGpvdXIgw6Agam91ciBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIGRlbGV0ZU9rTWVzc2FnZSA6IFwiTGEgc3VwcHJlc3Npb24gYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS5cIixcbiAgICBmYWlsQXV0aCA6IFwiRXJyZXVyIGQnYXV0aGVudGlmaWNhdGlvbi5cIixcbiAgICBmYWlsQXV0aEhlYWRlciA6IFwiQWJzZW5jZSBkZSBoZWFkZXIgQXV0aG9yaXphdGlvbi5cIixcbiAgICBmYWlsQXV0aFRva2VuIDogXCJUb2tlbiBpbnZhbGlkZSBvdSB1dGlsaXNhdGV1ciBub24gdHJvdXbDqS5cIixcbiAgICBmYWlsQXV0aElkIDogXCJJZGVudGlmaWFudCBub24gdmFsaWRlIDogXCIsXG4gICAgZmFpbEF1dGhDcm9uIDogXCJUZW50YXRpdmUgZGUgbGFuY2VtZW50IGQndW4gY3JvbiBzYW5zIGxlIGJvbiB0b2tlbi5cIixcbiAgICBwcmV2aW91c1BhZ2UgOiBcIlBhZ2UgcHLDqWPDqWRlbnRlXCIsXG4gICAgbmV4dFBhZ2UgOiBcIlBhZ2Ugc3VpdmFudGVcIixcbiAgICBidG5MaW5rVG9RdWVzdGlvbm5haXJlIDogXCJBbGxlciBhdSBxdWl6ICFcIixcbiAgICBzdGF0c0FkbWluIDogXCJEdXJhbnQgbGVzIGRlcm5pw6hyZXMgMjRoIDogTkJfVVNFUlNfMjRIIGNvbXB0ZXMgb250IMOpdMOpIGNyw6nDqXMsIE5CX1NVQlNDUklQVElPTlNfMjRIIHZhbGlkw6lzIGV0IE5CX1VTRVJTX0RFTEVURURfMjRIIHN1cHByaW3DqXMuIE5CX0FOU1dFUlNfMjRIIHLDqXBvbnNlcyBhdXggcXVpenMgb250IMOpdMOpIGVucmVnaXN0csOpZXMuPGJyPkVuIHRvdXQsIGlsIHkgYSA6IE5CX1VTRVJTX1RPVCBjb21wdGVzLCBkb250IE5CX1NVQlNDUklQVElPTlNfVE9UIHZhbGlkw6lzIGV0IE5CX1NVQlNDUklQVElPTlNfUFJFTUlVTSBjb21wdGVzIHByw6ltaXVtLiBOQl9BTlNXRVJTX1RPVCByw6lwb25zZXMgYXV4IHF1aXpzIG9udCDDqXTDqSBlbnJlZ2lzdHLDqWVzLjxicj5QYXJtaSBsZXMgTkJfVVNFUlNfREVMRVRFRF9UT1QgY29tcHRlcyBzdXBwcmltw6lzLCBOQl9VU0VSU19ERUxFVEVEX1ZBTElERUQgYXZhaWVudCB2YWxpZMOpIGxldXIgY29tcHRlIGV0IE5CX1VTRVJTX0RFTEVURURfUFJFTUlVTSBhdmFpZW50IHNvdXNjcml0IHVuIGNvbXB0ZSBwcsOpbWl1bS5cIlxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgbm90Rm91bmQ6IFwiTCd1dGlsaXNhdGV1ciBuJ2EgcGFzIMOpdMOpIHRyb3V2w6kuXCIsXG4gICAgbmVlZE5hbWU6IFwiTWVyY2kgZGUgY2hvaXNpciB1biBub20gZCd1dGlsaXNhdGV1ci5cIixcbiAgICBuZWVkTm90VG9vTG9uZ05hbWU6IFwiTWVyY2kgZGUgY2hvaXNpciB1biBub20gZCd1dGlsaXNhdGV1ciBuZSBjb21wdGFudCBwYXMgcGx1cyBkZSA3MCBjYXJhY3TDqHJlcy5cIixcbiAgICBuZWVkRW1haWw6IFwiTWVyY2kgZGUgc2Fpc2lyIHZvdHJlIGFkcmVzc2UgZS1tYWlsLlwiLFxuICAgIG5lZWRVbmlxdWVFbWFpbDogXCJMJ2FkcmVzc2UgZS1tYWlsIHF1ZSB2b3VzIGF2ZXogc2Fpc2llIGVzdCBkw6lqw6AgdXRpbGlzw6llIHBhciB1biBhdXRyZSB1dGlsaXNhdGV1ci4gU2kgdm91cyBhdmV6IGTDqWrDoCB1biBjb21wdGUsIDxhIGhyZWY9Jy8jVVJMJz5jbGlxdWV6LWljaSBwb3VyIHZvdXMgY29ubmVjdGVyPC9hPi5cIixcbiAgICBuZWVkTm90VG9vTG9uZ0VtYWlsOiBcIk1lcmNpIGRlIHNhaXNpciB1bmUgYWRyZXNzZSBlLW1haWwgbmUgY29tcHRhbnQgcGFzIHBsdXMgZGUgMjU1IGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRQYXNzV29yZCA6IFwiTWVyY2kgZGUgZm91cm5pciB1biBtb3QgZGUgcGFzc2UuXCIsXG4gICAgbmVlZExvbmdQYXNzV29yZCA6IFwiTWVyY2kgZGUgZm91cm5pciB1biBtb3QgZGUgcGFzc2UgZCdhdSBtb2lucyBNSU5fTEVOR1RIIGNhcmFjdMOocmVzLlwiLFxuICAgIHBhc3N3b3JkQ29waWVkOiBcIkxlIG1vdCBkZSBwYXNzZSBnw6luw6lyw6kgYSDDqXTDqSBjb3Bpw6kgZGFucyBsZSBwcmVzc2UtcGFwaWVyLiBWb3VzIHBvdXZleiBsZSByZWNvcGllciBvw7kgdm91cyBsZSBzb3VoYWl0ZXIuXCIsXG4gICAgbmVlZFN0YXR1cyA6IFwiSWwgbWFucXVlIGxlIHN0YXR1dC5cIixcbiAgICBuZWVkTGFuZ3VhZ2UgOiBcIklsIG1hbnF1ZSBsZSBjb2RlIGxhbmd1ZS5cIixcbiAgICBuZWVkVmFsaWRMYXN0Q29ubmVjdGlvbkRhdGUgOiBcIkxhIGRhdGUgZGUgZGVybmnDqHJlIGNvbm5leGlvbiBuJ2VzdCBwYXMgdmFsaWRlLlwiLFxuICAgIG5lZWRTTVRQIDogXCJJbCBtYW5xdWUgbGUgc2VydmV1ciBTTVRQLlwiLFxuICAgIG5lZWRTTVRQTm90Rm91bmQgOiBcIklsIG1hbnF1ZSBsZSBzZXJ2ZXVyIFNNVFAuXCIsXG4gICAgbmVlZEtub3dOZXdzbGV0dGVyT2sgOiBcIklsIGZhdXQgc2F2b2lyIHNpIGwndXRpbGlzYXRldXIgYWNjZXB0ZSBvdSByZWZ1c2UgZGUgcmVjZXZvaXIgbGEgbmV3c2xldHRlci5cIixcbiAgICBuZWVkVGltZURpZmZlcmVuY2UgOiBcIklsIGZhdXQgY29ubmHDrnRyZSBsZSBub21icmUgZGUgbWludXRlcyBkdSBkw6ljYWxhZ2UgaG9yYWlyZS5cIixcbiAgICBuZWVkTWluVGltZURpZmZlcmVuY2UgOiBcIklsIGZhdXQgZm91cm5pciB1biBub21icmUgZGUgbWludXRlcyDDoCBlbmxldmVyIMOgIGwnaGV1cmUgR01UIG5lIGTDqXBhc3NhbnQgcGFzIDcyMC5cIixcbiAgICBuZWVkTWF4VGltZURpZmZlcmVuY2UgOiBcIklsIGZhdXQgZm91cm5pciB1biBub21icmUgZGUgbWludXRlcyDDoCBham91dGVyIMOgIGwnaGV1cmUgR01UIG5lIGTDqXBhc3NhbnQgcGFzIDg0MC5cIixcbiAgICBuZWVkVUdDT2sgOiBcIlZvdXMgZGV2ZXogYWNjZXB0ZXIgbGVzIENHVSBwb3VyIHBvdXZvaXIgY3LDqWVyIHZvdHJlIGNvbXB0ZS4gXCIsXG4gICAgZ29kZmF0aGVyTm90Rm91bmQ6IFwiQXVjdW4gdXRpbGlzYXRldXIgdmFsaWRlIHRyb3V2w6kgcG91ciBjZSBjb2RlIHBhcnJhaW4uXCIsXG4gICAgZ29kZmF0aGVyRm91bmQ6IFwiVm90cmUgcGFycmFpbiBhIGJpZW4gw6l0w6kgdHJvdXbDqSAhXCIsXG4gICAgbWFpbFZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGluc2NyaXB0aW9uIGVzdCBiaWVuIGVucmVnaXN0csOpZS5cXG5Qb3VyIGxhIGZpbmFsaXNlciwgbWVyY2kgZGUgY2xpcXVlciBkYW5zIGxlcyAyNEggc3VyIGxlIGxpZW4gZGUgY29uZmlybWF0aW9uIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbC5cIixcbiAgICBtYWlsVmFsaWRhdGlvbkxpbmtTdWJqZWN0IDogXCJNZXJjaSBkZSB2YWxpZGVyIHZvdHJlIGNvbXB0ZVwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1NCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5cXG5Qb3VyIHZhbGlkZXIgdm90cmUgY29tcHRlLCBtZXJjaSBkZSBjbGlxdWVyIHN1ciBsZSBsaWVuIHN1aXZhbnQgZGFucyBsZXMgMjRoIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1NCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+UG91ciB2YWxpZGVyIHZvdHJlIGNvbXB0ZSwgbWVyY2kgZGUgY2xpcXVlciBzdXIgbGUgbGllbiBzdWl2YW50IGRhbnMgbGVzIDI0aC48L3A+PHA+PGEgaHJlZj1cXFwiTElOS19VUkxcXFwiPlZhbGlkZXIuPC9hPjwvcD5cIixcbiAgICB2YWxpZGF0aW9uTWVzc2FnZTogXCJWb3RyZSBjb21wdGUgdmllbnQgYmllbiBkJ8OqdHJlIHZhbGlkw6kuIE1lcmNpIGV0IGJpZW52ZW51ZSAhPGJyPlZvdXMgcG91dmV6IHNhbnMgdGFyZGVyIHZvdXMgY29ubmVjdGVyIGNpLWRlc3NvdXMgcG91ciBhY2PDqWRlciDDoCB2b3RyZSBjb21wdGUuXCIsXG4gICAgdmFsaWRhdGlvbk1lc3NhZ2VBZG1pbjogXCJMZSBjb21wdGUgYSBiaWVuIMOpdMOpIHZhbGlkw6kuXCIsXG4gICAgdmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlOiBcIklsIHNlbWJsZSBxdWUgdm91cyBheWV6IGTDqWrDoCB2YWxpZMOpIHZvdHJlIGNvbXB0ZS5cIixcbiAgICB2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2VBZG1pbjogXCJDZSBjb21wdGUgYSBkw6lqw6Agw6l0w6kgdmFsaWTDqS5cIixcbiAgICBtYWlsV2VsY29tZVN1YmplY3QgOiBcIkJpZW52ZW51ZSAhXCIsXG4gICAgbWFpbFdlbGNvbWVCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5Wb3RyZSB2ZW5leiBkZSB2YWxpZGVyIHZvdHJlIGluc2NyaXB0aW9uIMOgIE5PTV9TSVRFLlxcbk1lcmNpIGV0IMOgIGJpZW50w7R0ICFcIixcbiAgICBtYWlsV2VsY29tZUJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Wb3RyZSB2ZW5leiBkZSB2YWxpZGVyIHZvdHJlIGluc2NyaXB0aW9uIMOgIE5PTV9TSVRFLjwvcD48cD5NZXJjaSBldCDDoCBiaWVudMO0dCAhPC9wPlwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlclN1YmplY3QgOiBcIk1lcmNpICFcIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5HcsOiY2Ugw6Agdm91cyB1biBub3V2ZWwgdXRpbGlzYXRldXIgKEVNQUlMKSB2aWVudCBkZSBzJ2luc2NyaXJlIHN1ciBOT01fU0lURS5cXG5NZXJjaSBldCDDoCBiaWVudMO0dCAhXCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPkdyw6JjZSDDoCB2b3VzIHVuIG5vdXZlbCB1dGlsaXNhdGV1ciAoRU1BSUwpIHZpZW50IGRlIHMnaW5zY3JpcmUgc3VyIE5PTV9TSVRFLjwvcD48cD5NZXJjaSBldCDDoCBiaWVudMO0dCAhPC9wPlwiLFxuICAgIGJhZExpbmtWYWxpZGF0aW9uTWVzc2FnZTogXCJWb3RyZSBsaWVuIGRlIGNvbmZpcm1hdGlvbiBuZSBzZW1ibGUgcGFzIHZhbGlkZSBvdSBiaWVuIGlsIGEgZXhwaXLDqS4gVm91cyBwb3V2ZXogZW4gcmVjZXZvaXIgdW4gbm91dmVhdSA8YSBocmVmPScjVVJMJz5lbiBjbGlxdWFudCBpY2k8L2E+LlwiLFxuICAgIGVtYWlsTm90Rm91bmQ6IFwiQXVjdW4gdXRpbGlzYXRldXIgdHJvdXbDqSBwb3VyIGNldHRlIGFkcmVzc2UgZS1tYWlsLlwiLFxuICAgIGFscmVhZHlDb25uZWN0ZWQ6IFwiVm91cyDDqnRlcyBkw6lqw6AgY29ubmVjdMOpKGUpIGF1IHNpdGUgIVwiLFxuICAgIG5lZWRCZUNvbm5lY3RlZDogXCJWb3VzIGRldmV6IMOqdHJlIGNvbm5lY3TDqShlKSBwb3VyIGFjY8OpZGVyIMOgIGNldHRlIHBhZ2UuXCIsXG4gICAgY29ubmVjdGlvbk9rOiBcIkNvbm5leGlvbiByw6l1c3NpZS5cIixcbiAgICBuZWVkQ2hvb3NlTG9naW5XYXk6IFwiVm91cyBkZXZleiBzb2l0IHNhaXNpciB2b3RyZSBtb3QgZGUgcGFzc2UsIHNvaXQgY29jaGVyIGxhIGNhc2Ugdm91cyBwZXJtZXR0YW50IGRlIHJlY2V2b2lyIHVuIGxpZW4gZGUgY29ubmV4aW9uIHBhciBlLW1haWwuXCIsXG4gICAgbmVlZFZhbGlkYXRpb25Ub0xvZ2luIDogXCJWb3VzIGRldmV6IGQnYWJvcmQgdmFsaWRlciB2b3RyZSBjb21wdGUgYXZhbnQgZGUgdm91cyBjb25uZWN0ZXIuIFBvdXIgY2UgZmFpcmUsIHVuIGxpZW4gdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHBhciBlLW1haWwuXCIsXG4gICAgdG9vTWFueUxvZ2luRmFpbHMgOiBcIlRyb3AgZGUgdGVudGF0aXZlcyBkZSBjb25uZXhpb24gaW5mcnVjdHVldXNlcyBwb3VyIGNldHRlIGFkcmVzc2UgZS1tYWlsLiBWb3VzIGRldmV6IGF0dGVuZHJlIE1JTlVURVMgbWludXRlcyBwb3VyIGVzc2F5ZXIgZGUgbm91dmVhdS5cIixcbiAgICBiYWRQYXNzd29yZDogXCJMZSBtb3QgZGUgcGFzc2Ugbidlc3QgcGFzIGxlIGJvbi5cIixcbiAgICBtYWlsTG9naW5MaW5rU3ViamVjdCA6IFwiVm90cmUgbGllbiBkZSBjb25uZXhpb24uXCIsXG4gICAgbWFpbExvZ2luTGlua0JvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblBvdXIgdm91cyBjb25uZWN0ZXIgw6Agdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOiBMSU5LX1VSTFwiLFxuICAgIG1haWxMb2dpbkxpbmtCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+UG91ciB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6PC9wPjxwPjxhIGhyZWY9XFxcIkxJTktfVVJMXFxcIj5WYWxpZGVyLjwvYT48L3A+XCIsXG4gICAgbWFpbExvZ2luTGlua01lc3NhZ2UgOiBcIlVuIGxpZW4gZGUgY29ubmV4aW9uIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBzdXIgdm90cmUgYWRyZXNzZSBlLW1haWwuIE5lIHRhcmRleiBwYXMgw6AgbCd1dGlsaXNlciwgY2FyIGlsIG4nZXN0IHZhbGFibGUgcXVlIGR1cmFudCBcIixcbiAgICB1cGRhdGVkT2tNZXNzYWdlOiBcIlZvcyBpbmZvcm1hdGlvbnMgb250IGJpZW4gw6l0w6kgbWlzZXMgw6Agam91ci5cIixcbiAgICB1cGRhdGVkTmVlZEdvb2RFbWFpbCA6IFwiTWFpcyBsYSBub3V2ZWxsZSBhZHJlc3NlIGUtbWFpbCBuJ2EgcHUgw6p0cmUgZW5yZWdpc3Ryw6llIGNhciBlbGxlIG4nYSBwYXMgdW5lIGZvcm1hdCBjb3JyZWN0LlwiLFxuICAgIHVwZGF0ZWROZWVkVW5pcXVlRW1haWwgOiBcIk1haXMgbGEgbm91dmVsbGUgYWRyZXNzZSBlLW1haWwgc2Fpc2llIChORVdfRU1BSUwpIG4nYSBwdSDDqnRyZSBlbnJlZ2lzdHLDqWUsIGNhciBlbGxlIGVzdCBkw6lqw6AgdXRpbGlzw6llIHBvdXIgdW4gYXV0cmUgY29tcHRlLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpblN1YmplY3QgOiBcIk1lcmNpIGRlIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cy5cIixcbiAgICBtYWlsVXBkYXRlTG9naW5Cb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5Qb3VyIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cyBkZSBjb25uZXhpb24sIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6XFxuTElOS19VUkxcIixcbiAgICBtYWlsVXBkYXRlTG9naW5Cb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+UG91ciB2YWxpZGVyIHZvcyBub3V2ZWF1eCBpZGVudGlmaWFudHMgZGUgY29ubmV4aW9uLCA8YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+Y2xpcXVleiBpY2k8L2E+IHNhbnMgdGFyZGVyLjwvcD5cIixcbiAgICBtYWlsVXBkYXRlTG9naW5MaW5rTWVzc2FnZTogXCJDZXBlbmRhbnQsIHZvdXMgYXZleiBtb2RpZmnDqSBhdSBtb2lucyB1biBkZSB2b3MgaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiAoZW1haWwgZXQvb3UgbW90IGRlIHBhc3NlKSBldCA8Yj52b3VzIGRldmV6IGNsaXF1ZXIgc3VyIGxlIGxpZW4gcXVpIHZpZW50IGRlIHZvdXMgw6p0cmVzIGVudm95w6kgc3VyIHZvdHJlIGFkcmVzc2UgKE5FV19FTUFJTCkgcG91ciB2YWxpZGVyIGNlIGNoYW5nZW1lbnQ8L2I+LiBFbiBhdHRlbmRhbnQsIG1lcmNpIGRlIGNvbnRpbnVlciDDoCB1dGlsaXNlciB2b3MgYW5jaWVucyBpZGVudGlmaWFudHMuXCIsXG4gICAgdXBkYXRlZE5lZWRWYWxpZGF0ZWRVc2VyOiBcIkwndXRpbGlzYXRldXIgcXVlIHZvdXMgc291aGFpdMOpIG1vZGlmaWVyIG4nZXhpc3RlIHBhcy9wbHVzIG91IG4nYSBwYXMgZW5jb3JlIHZhbGlkw6kgc29uIGNvbXB0ZS5cIixcbiAgICB1cGRhdGVkTmVlZEdvb2RHb2RmYXRoZXIgOiBcIk1haXMgbGUgbm91dmVhdSBjb2RlIHBhcnJhaW4gbidhIHB1IMOqdHJlIHJldGVudSwgY2FyIGlsIG5lIGNvcnJlc3BvbmQgw6AgYXVjdW4gY29tcHRlIHV0aWxpc2F0ZXVyIG91IMOgIGwndXRpbGlzYXRldXIgbHVpLW3Dqm1lLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbk9rTWVzc2FnZTogXCJMYSBtaXNlIMOgIGpvdXIgZGUgdm9zIGlkZW50aWZpYW50cyBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIHVwZGF0ZWRGYWlsZWRHb2RmYXRoZXJOb3RGb3VuZCA6IFwiTCdpZGVudGlmaWFudCBmb3VybmkgcG91ciBsZSBwYXJyYWluIG5lIGNvcnJlc3BvbmQgw6AgYXVjdW4gdXRpbGlzYXRldXIuXCIsXG4gICAgY3JlYXRpb25Pa01lc3NhZ2U6IFwiTGUgbm91dmVsIHV0aWxpc2F0ZXVyIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqS5cIixcbiAgICBtYWlsRGVsZXRlU3ViamVjdCA6IFwiQ29uZmlybWVyIGxhIHN1cHByZXNzaW9uIGRlIHZvdHJlIGNvbXB0ZS5cIixcbiAgICBtYWlsRGVsZXRlQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuUG91ciB2YWxpZGVyIGxhIHN1cHByZXNzaW9uIGRlIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxEZWxldGVCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+UG91ciB2YWxpZGVyIGxhIHN1cHByZXNzaW9uIGRlIHZvdHJlIGNvbXB0ZSwgPGEgaHJlZj1cXFwiTElOS19VUkxcXFwiPmNsaXF1ZXogaWNpPC9hPiBzYW5zIHRhcmRlci48L3A+XCIsXG4gICAgbWFpbERlbGV0ZUxpbmtNZXNzYWdlOiBcIlZvdHJlIGRlbWFuZGUgZGUgc3VwcHJlc3Npb24gYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS4gTWVyY2kgZGUgY2xpcXVlciBzYW5zIHRhcmRlciBzdXIgbGUgbGllbiBxdWkgdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHBhciBlLW1haWwgcG91ciBjb25maXJtZXIuXCIsXG4gICAgZGVsZXRlT2tNZXNzYWdlOiBcIkwndXRpbGlzYXRldXIgYSBiaWVuIMOpdMOpIHN1cHByaW3DqS5cIixcbiAgICBkZWxldGVGYWlsTWVzc2FnZTogXCJUZW50YXRpdmUgZGUgc3VwcHJlc3Npb24gZCd1biB1dGlsaXNhdGV1ciBpbmV4aXN0YW50IDogXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtPa01lc3NhZ2U6IFwiVm90cmUgY29tcHRlIGEgYmllbiDDqXTDqSBzdXBwcmltw6kuIE1lcmNpIGQnYXZvaXIgdXRpbGlzw6kgbm9zIHNlcnZpY2VzLlwiLFxuICAgIG1haWxEZWxldGVMaW5rQWxyZWFkeU1lc3NhZ2U6IFwiSWwgc2VtYmxlIHF1ZSB2b3VzIGF5ZXogZMOpasOgIHZhbGlkw6kgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLlwiLFxuICAgIG1haWxEZWxldGVMaW5rRmFpbE1lc3NhZ2U6IFwiVm90cmUgbGllbiBkZSBzdXBwcmVzc2lvbiBuJ2VzdCBwYXMgdmFsaWRlIG91IGFsb3JzIGlsIG4nZXN0IHBsdXMgdmFsYWJsZS5cIixcbiAgICBjcm9uRGVsZXRlVW52YWxpZGVkVXNlcnNNZXNzYWdlOiBcIiBjb21wdGVzIHV0aWxpc2F0ZXVycyBub24gdmFsaWTDqXMgb250IMOpdMOpIHN1cHByaW3DqXMuXCIsXG4gICAgZGVsZXRlSW5hY3RpdmVVc2Vyc01lc3NhZ2U6IFwiIGNvbXB0ZXMgdXRpbGlzYXRldXJzIGluYWN0aWZzIG9udCDDqXTDqSBzdXBwcmltw6lzLlwiLFxuICAgIHdlbGNvbWVNZXNzYWdlOiBcIkJpZW52ZW51ZSAjTkFNRSAhXCIsXG4gICAgYnllYnllTWVzc2FnZTogXCJTaSB2b3VzIHZveWV6IGNlIG1lc3NhZ2UsIGMnZXN0IHF1ZSB2b3RyZSBkw6ljb25uZXhpb24gcydlc3QgYmllbiBkw6lyb3Vsw6llLjxicj7DgCBiaWVudMO0dCAhXCIsXG4gICAgaW5mb3NVc2VyRm9yQWRtaW46IFwiQ2V0IHV0aWxpc2F0ZXVyIChpZDogSURfVVNFUikgYSA8Yj5jcsOpw6kgc29uIGNvbXB0ZSBsZSBEQVRFX0NSRUE8L2I+LCBsYSBkZXJuacOocmUgbWlzZSDDoCBqb3VyIGRhdGFudCBkdSBEQVRFX1VQREFURS48YnI+PGI+RGF0ZSBkZSBzYSBkZXJuacOocmUgY29ubmV4aW9uIDogREFURV9DT05ORUNUSU9OLjwvYj5cIixcbiAgICBpbmZvc0FkbWluR29kZmF0aGVyOiBcIkNldCB1dGlsaXNhdGV1ciBhIMOpdMOpIHBhcnJhaW7DqSBwYXIgXCIsXG4gICAgaW5mb3NBZG1pbk5iR29kQ2hpbGRzOiBcIlNlcyAjTkIgZmlsbGV1aWxzIDogXCJcbn07IiwiLy8gUXVlbHF1ZXMgZm9uY3Rpb25zIHV0aWxlcyBwb3VyIGxlcyBjaGHDrm5lc1xuXG5jbGFzcyBUb29sXG57XG4gICAgc3RhdGljIGlzRW1wdHkobXlWYXIpXG4gICAge1xuICAgICAgICBpZihteVZhcj09PXVuZGVmaW5lZCB8fCBteVZhcj09PW51bGwpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVZhcis9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVZhcj1teVZhci50cmltKCk7XG4gICAgICAgICAgICBpZihteVZhcj09PVwiXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIHN0YXRpYyB0cmltSWZOb3ROdWxsKG15U3RyaW5nKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KG15U3RyaW5nKSlcbiAgICAgICAgICAgIG15U3RyaW5nPW51bGw7XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgbXlTdHJpbmcrPVwiXCI7Ly8gc2kgYXV0cmUgY2hvc2UgcXUndW5lIGNoYcOubmUgZW52b3nDqS4uLlxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcudHJpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cblxuICAgIHN0YXRpYyBzaG9ydGVuSWZMb25nZXJUaGFuKG15U3RyaW5nLCBtYXgpXG4gICAge1xuICAgICAgICBteVN0cmluZys9XCJcIjsvLyBhdSBjYXMgb8O5IGNlbGEgbmUgc2VyYWl0IHBhcyB1bmUgY2hhw65uZS4uLlxuICAgICAgIGlmKG15U3RyaW5nLmxlbmd0aCA+IG1heClcbiAgICAgICAgICAgIG15U3RyaW5nPW15U3RyaW5nLnN1YnN0cmluZygwLCAobWF4LTMpKStcIi4uLlwiO1xuICAgICAgICByZXR1cm4gbXlTdHJpbmc7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTU2MDQxNDAvcmVwbGFjZS1tdWx0aXBsZS1zdHJpbmdzLXdpdGgtbXVsdGlwbGUtb3RoZXItc3RyaW5nc1xuICAgIHN0YXRpYyByZXBsYWNlQWxsKG15U3RyaW5nLCBtYXBPYmopXG4gICAge1xuICAgICAgICBjb25zdCByZXBsYWNlRWx0cyA9IG5ldyBSZWdFeHAoT2JqZWN0LmtleXMobWFwT2JqKS5qb2luKFwifFwiKSxcImdpXCIpO1xuICAgICAgICByZXR1cm4gbXlTdHJpbmcucmVwbGFjZShyZXBsYWNlRWx0cywgKG1hdGNoZWQpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBtYXBPYmpbbWF0Y2hlZF07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHNvdXJjZSA6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2ZyL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL09iamV0c19nbG9iYXV4L01hdGgvcmFuZG9tXG4gICAgc3RhdGljIGdldFJhbmRvbUludChtaW4sIG1heClcbiAgICB7XG4gICAgICAgIG1pbiA9IE1hdGguY2VpbChtaW4pO1xuICAgICAgICBtYXggPSBNYXRoLmZsb29yKG1heCk7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluKSkgKyBtaW47XG4gICAgfVxuXG4gICAgLy8gw6AgY29tcGzDqXRlciA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0RhdGVfZm9ybWF0X2J5X2NvdW50cnlcbiAgICBzdGF0aWMgZGF0ZUZvcm1hdChkYXRlU3RyaW5nLCBsYW5nPVwiZnJcIilcbiAgICB7XG4gICAgICAgIGlmKFRvb2wuaXNFbXB0eShkYXRlU3RyaW5nKSlcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICBsZXQgbXlEYXRlPW5ldyBEYXRlKGRhdGVTdHJpbmcpO1xuICAgICAgICBsZXQgbXlEYXk9bXlEYXRlLmdldERhdGUoKStcIlwiO1xuICAgICAgICBpZihteURheS5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlEYXk9XCIwXCIrbXlEYXk7XG4gICAgICAgIGxldCBteU1vdW50aD0obXlEYXRlLmdldE1vbnRoKCkrMSkrXCJcIjtcbiAgICAgICAgaWYobXlNb3VudGgubGVuZ3RoPT09MSlcbiAgICAgICAgICAgIG15TW91bnRoPVwiMFwiK215TW91bnRoO1xuICAgICAgICBsZXQgbXlZZWFyPW15RGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICBpZihsYW5nPT09XCJmclwiKVxuICAgICAgICAgICAgcmV0dXJuIG15RGF5K1wiL1wiK215TW91bnRoK1wiL1wiK215WWVhcjtcbiAgICAgICAgZWxzZSBpZiAobGFuZz09PVwiZm9ybVwiKS8vIDIwMTQtMDItMDlcbiAgICAgICAgICAgIHJldHVybiBteVllYXIrXCItXCIrbXlNb3VudGgrXCItXCIrbXlEYXk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBteU1vdW50aCtcIi9cIitteURheStcIi9cIitteVllYXI7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFRvb2w7IiwidmFyIG1hcCA9IHtcblx0XCIuL2RlZmF1bHQvY29uZmlnL2ZyLmpzXCI6IFwiLi4vdmlld3MvZGVmYXVsdC9jb25maWcvZnIuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vdmlld3Mgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwuanMkXCI7IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIGhlYWRMaW5rczpcbiAgICBbXG4gICAgICAgIHsgYW5jaG9yOiBcIkFjY3VlaWxcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiTW9uIGNvbXB0ZVwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY29ubmV4aW9uLmhtdFwiLCBpZDogXCJhY2NvdW50SGVhZExpbmtcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIsOAIHByb3Bvc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvYS1wcm9wb3MuaHRtbFwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQ29udGFjdFwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY29udGFjdC5odG1sXCIgfSB9LFxuICAgIF0sXG4gICAgZm9vdExpbmtzOlxuICAgIFtcbiAgICAgICAgeyBhbmNob3I6IFwiQ3LDqWRpdHNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2NyZWRpdHMuaHRtbFwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiTWVudGlvbnMgbMOpZ2FsZXNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL21lbnRpb25zLWxlZ2FsZXMuaHRtbFwiLCByZWw6IFwibm9mb2xsb3dcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkRvbm7DqWVzIHBlcnNvbm5lbGxlc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvZG9ubmVlcy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDLkcuVS5cIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2NndS5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQy5HLlYuXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jZ3YuaHRtbFwiLCByZWw6IFwibm9mb2xsb3dcIiB9IH0sXG4gICAgXSxcbiAgICBtYXhRdWVzdGlvbm5haXJlc0J5UGFnZTogMTAsXG4gICAgdXNlckhvbWVQYWdlIDogXCJhY2N1ZWlsLmh0bWxcIixcbiAgICBhZG1pbkhvbWVQYWdlIDogXCJhZG1pbi5odG1sXCIsXG4gICAgbWFuYWdlckhvbWVQYWdlIDogXCJnZXN0aW9uLmh0bWxcIixcbiAgICBzdWJzY3JpYmVQYWdlIDogXCJpbnNjcmlwdGlvbi5odG1sXCIsXG4gICAgY29ubmVjdGlvblBhZ2UgOiBcImNvbm5leGlvbi5odG1sXCIsXG4gICAgYWNjb3VudFBhZ2U6IFwiY29tcHRlLmh0bWxcIixcbiAgICBxdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlOiBcImdlc3Rpb24tcXVpenMuaHRtbFwiLFxuICAgIHVzZXJzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi11dGlsaXNhdGV1cnMuaHRtbFwiLFxuICAgIG5iUXVlc3Rpb25uYWlyZXNVc2VySG9tZVBhZ2UgOiAxMCxcbiAgICBpbGx1c3RyYXRpb25EaXIgOiBcIi9pbWcvcXVpenMvXCIsXG4gICAgc2l0ZVNsb2dhbjogXCJDdWx0aXZvbnMgbm90cmUgamFyZGluICFcIixcbiAgICBob21lVGl0bGUxOiBcIkRlIG5hdHVyZSBjdXJpZXVzZSA/XCIsXG4gICAgaG9tZVAxOiBcIkF2ZWMgV2lraUxlcm5pIHZvdXMgYXBwcmVuZXogY2hhcXVlIGpvdXIgZGUgbm91dmVsbGVzIGNob3Nlcy48YnI+RGVzIGFydGljbGVzIGRlIFdpa2lww6lkaWEgc29udCBzw6lsZWN0aW9ubsOpcyBwb3VyIHZvdXMgZXQgc29udCBzdWl2aXMgZCd1biBxdWl6IHZvdXMgcGVybWV0dGFudCBkZSB0ZXN0ZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUuPGJyPkRlIGpvdXIgZW4gam91ciBkZSBub3V2ZWxsZXMgZ3JhaW5lcyBkZSBzYXZvaXIgc29udCBhaW5zaSBzZW3DqWVzIGRhbnMgdm90cmUgXFxcImphcmRpblxcXCIuXCIsXG4gICAgaG9tZVRpdGxlMjogXCJMYSBjdWx0dXJlIGVuIGxpYmVydMOpXCIsXG4gICAgaG9tZVAyOiBcIlRvdXQgY29tbWUgc3VyIFdpa2lww6lkaWEgKCopLCBsZSBsb2dpY2llbCBldCBsZSBjb250ZW51IHBhcnRhZ8OpIHN1ciBXaWtpTGVybmkgc29udCBsaWJyZXMuPGJyPlZvdXMgcG91dmV6IGxlcyB1dGlsaXNlciwgbGVzIG1vZGlmaWVyIGV0IGxlcyBkaWZmdXNlciBzZWxvbiB2b3RyZSBzb3VoYWl0Ljxicj5TdXIgV2lraUxlcm5pLCBwYXMgZGUgcHVibGljaXTDqSwgbmkgZGUgY29tbWVyY2lhbGlzYXRpb24gZGUgdm9zIGRvbm7DqWVzIHBlcnNvbm5lbGxlcy48YnI+Vm91cyBwb3V2ZXogdmVuaXIgeSBcXFwiY3VsdGl2ZXIgdm90cmUgamFyZGluXFxcIiBlbiB0b3V0ZSB0cmFucXVpbGxpdMOpLjxicj48YnI+PHNtYWxsPjxlbT4oKikgQmllbiBxdWUgcGFydGFnZWFudCBzZXMgdmFsZXVycywgV2lraUxlcm5pIGVzdCB1biBwcm9qZXQgaW5kw6lwZW5kYW50IGRlIGxhIGZvbmRhdGlvbiBXaWtpcMOpZGlhLjwvZW0+PC9zbWFsbD5cIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc1RpdGxlOiBcIkxlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyBzdXIgV2lraUxlcm5pXCIsXG4gICAgbmV3UXVlc3Rpb25uYWlyZXNJbnRybzogXCJMaXN0ZSBkZXMgZGVybmllcnMgcXVpenMgcHVibGnDqXMgc3VyIFdpa2lMZXJuaS5cIixcbiAgICBleHBsYW5hdGlvblRpdGxlOiBcIlZvdXMgZMOpY291dnJleiBXaWtpTGVybmkgP1wiLFxuICAgIGV4cGxhbmF0aW9uVHh0OiBcIkxlIHByaW5jaXBlIGVzdCBzaW1wbGUgOiB2b3VzIGNvbW1lbmNleiBwYXIgbGlyZSBsJ2FydGljbGUgV2lraXDDqWRpYSBkb250IGxlIGxpZW4gdm91cyBlc3QgcHJvcG9zw6kuPGJyPlB1aXMgdm91cyBhZmZpY2hlciBsZSBxdWl6IHBvdXIgdsOpcmlmaWVyIGNlIHF1ZSB2b3VzIGVuIGF2ZXogcmV0ZW51IGRlIHZvdHJlIGxlY3R1cmUuIFZvdXMgb2J0ZW5leiBhbG9ycyB2b3RyZSByw6lzdWx0YXQgaW1tw6lkaWF0ZW1lbnQuPGJyPjxicj5Ub3V0ZXMgbGVzIHLDqXBvbnNlcyBzZSB0cm91dmVudCBkYW5zIGwnYXJ0aWNsZSBwcm9wb3PDqSDDoCBsYSBsZWN0dXJlLiA8Yj5Wb3VzIMOqdGVzIGljaSBwb3VyIGFwcHJlbmRyZSBkZSBub3V2ZWxsZXMgY2hvc2VzPC9iPiwgbWFpcyBsaWJyZSDDoCB2b3VzIGQnZXNzYXllciBkJ3kgcsOpcG9uZHJlIGltbcOpZGlhdGVtZW50Ljxicj48YnI+UXVhbmQgbGUgc3VqZXQgcyd5IHByw6p0ZSwgbmUgdm91cyDDqXRvbm5leiBwYXMgc2kgY2VydGFpbmVzIGRlcyByw6lwb25zZXMgcHJvcG9zw6llcyBwZXV2ZW50IMOqdHJlIHVuIHBldSBkw6ljYWzDqWVzLCBhYnN1cmRlcy4uLiBPbiBwZXV0IGFwcHJlbmRyZSBhdmVjIGxlIHNvdXJpcmUsIG5vbiA/IDotKTxicj48YnI+VW5lIGZvaXMgdm90cmUgcsOpc3VsdGF0IG9idGVudSwgaWwgdm91cyBzZXJhIHByb3Bvc8OpIGRlIGNyw6llciB1biBjb21wdGUgcG91ciBsZSBzYXV2ZWdhcmRlci48YnI+Q2UgY29tcHRlIHZvdXMgcGVybWV0dHJhIGRlIHRlc3RlciBkZSBub3V2ZWF1IGNlIHF1aXogcG91ciB2w6lyaWZpZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUgcGx1c2lldXJzIGpvdXJzLCBzZW1haW5lcywgbW9pcy4uLiBFdCBkZSByZWNldm9pciByw6lndWxpw6hyZW1lbnQgZGUgbm91dmVsbGVzIHN1Z2dlc3Rpb25zIGRlIGxlY3R1cmVzLjxicj48YnI+TWFpcyA8Yj5sYSBjcsOpYXRpb24gZGUgY2UgY29tcHRlIGVzdCBmYWN1bHRhdGl2ZTwvYj4gZXQgPGEgaHJlZj0nL3F1aXpzLycgdGl0bGU9J0xlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyc+dm91cyBwb3V2ZXogcGFyY291cmlyIFdpa2lMZXJuaSBsaWJyZW1lbnQ8L2E+LlwiLFxuICAgIG5vSlNOb3RpZmljYXRpb246IFwiRMOpc29sw6ksIG1haXMgcG91ciBsJ2luc3RhbnQsIGwndXRpbGlzYXRpb24gZGUgV2lraUxlcm5pIG7DqWNlc3NpdGUgbCdhY3RpdmF0aW9uIGR1IEphdmFTY3JpcHQuXCIsXG59OyIsIi8vIC0tIFBBR0UgUEVSTUVUVEFOVCBERSBWQUxJREVSIExBIENSw4lBVElPTiBERSBTT04gQ09NUFRFXG5cbi8vLyBVbiB0b2tlbiBlc3QgdHJhbnNtaXMgZW4gcGFyYW3DqHRyZSBkZSBsJ1VybC4gSWwgYSB1bmUgdmFsaWRpdMOpIGxpbWl0w6kgZGFucyBsZSB0ZW1wcy5cbi8vLyBTaSBsZSB0b2tlbiBuJ2VzdCBwYXMvcGx1cyB2YWxpZGUsIG9uIHJlZGlyaWdlIGwndXRpbGlzYXRldXIgdmVycyBsYSBwYWdlIGRlIGNvbm5leGlvbiBwb3VyIG9idGVuaXIgdW4gbm91dmVhdSBsaWVuLlxuLy8vIFNpIGxlIHRva2VuIGVzdCBvaywgb24gbCdpbmZvcm1lIHF1ZSB0b3V0IGVzdCBvayBldCBsdWkgcHJvcG9zZSBkZSBzZSBjb25uZWN0ZXIuXG4vLy8gU2kgbCd1dGlsaXNhdGV1ciBhIGTDqWrDoCB1bmUgc2Vzc2lvbiBhY3RpdmUgdmFsaWRlLCBjJ2VzdCBxdSdpbCBhIGTDqWrDoCBjbGlxdcOpIHN1ciBsZSBsaWVuLiBPbiBsZSByZWRpcmlnZSB2ZXJzIHNhIHBhZ2UgZCdhY2N1ZWlsLlxuXG4vLyBGaWNoaWVyIGRlIGNvbmZpZ3VyYXRpb24gdGlyw6lzIGR1IGJhY2tlbmQgOlxuaW1wb3J0IHsgYXBpVXJsLCBhdmFpbGFibGVMYW5ncywgdGhlbWUgfSBmcm9tIFwiLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCI7XG5jb25zdCBsYW5nPWF2YWlsYWJsZUxhbmdzWzBdO1xuXG5pbXBvcnQgeyBjaGVja1N1YnNjcmliZVRva2VuUm91dGUsIHVzZXJSb3V0ZXMgfSBmcm9tIFwiLi4vLi4vY29uZmlnL3VzZXJzLmpzXCI7XG5jb25zdCBjb25maWdUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi8uLi92aWV3cy9cIit0aGVtZStcIi9jb25maWcvXCIrbGFuZytcIi5qc1wiKTtcblxuLy8gSW1wb3J0YXRpb24gZGVzIGZvbmN0aW9ucyB1dGlsZXMgYXUgc2NyaXB0IDpcbmltcG9ydCB7IGdldExvY2FseSwgc2F2ZUxvY2FseSB9IGZyb20gXCIuL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanNcIjtcbmltcG9ydCB7IGFkZEVsZW1lbnQgfSBmcm9tIFwiLi90b29scy9kb20uanNcIjtcbmltcG9ydCB7IGhlbGxvRGV2IH0gZnJvbSBcIi4vdG9vbHMvZXZlcnl3aGVyZS5qc1wiO1xuaW1wb3J0IHsgZ2V0VXJsUGFyYW1zIH0gZnJvbSBcIi4vdG9vbHMvdXJsLmpzXCI7XG5pbXBvcnQgeyBjaGVja1Nlc3Npb24gfSBmcm9tIFwiLi90b29scy91c2Vycy5qc1wiO1xuXG4vLyBEaWN0aW9ubmFpcmVzIDpcbmNvbnN0IHR4dCA9IHJlcXVpcmUoXCIuLi8uLi9sYW5nL1wiK2xhbmcrXCIvZ2VuZXJhbFwiKTtcbmNvbnN0IHR4dFVzZXJzID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi91c2VyXCIpO1xuXG5jb25zdCBkaXZSZXNwb25zZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicmVzcG9uc2VcIik7XG5cbmNvbnN0IGluaXRpYWxpc2UgPSBhc3luYyAoKSA9Plxue1xuICAgIHRyeVxuICAgIHtcbiAgICAgICAgLy8gc2kgbCd1dGlsaXNhdGV1ciBlc3QgZMOpasOgIGNvbm5lY3TDqSwgcGFzIGxhIHBlaW5lIGQnYWxsZXIgKyBsb2luIDpcbiAgICAgICAgY29uc3QgaXNDb25uZWN0ZWQ9YXdhaXQgY2hlY2tTZXNzaW9uKCk7XG4gICAgICAgIGlmKGlzQ29ubmVjdGVkKVxuICAgICAgICB7XG4gICAgICAgICAgICBzYXZlTG9jYWx5KFwibWVzc2FnZVwiLCB7IG1lc3NhZ2U6IHR4dFVzZXJzLmFscmVhZHlDb25uZWN0ZWQsIGNvbG9yOlwiaW5mb3JtYXRpb25cIiB9KTtcbiAgICAgICAgICAgIGNvbnN0IHVzZXI9Z2V0TG9jYWx5KFwidXNlclwiLCB0cnVlKTtcbiAgICAgICAgICAgIGNvbnN0IGhvbWVQYWdlPXVzZXIuc3RhdHVzK1wiSG9tZVBhZ2VcIjsvLyBsb3JzIGRlIGxhIGNyw6lhdGlvbiwgc2V1bCBsZSBzdGF0dXQgJ3VzZXJcIiBlc3QgcG9zc2libGVcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIvXCIrY29uZmlnVGVtcGxhdGVbaG9tZVBhZ2VdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFzPWdldFVybFBhcmFtcygpO1xuICAgICAgICAgICAgaWYoZGF0YXMgJiYgZGF0YXMudCE9PXVuZGVmaW5lZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBhcGlVcmwrdXNlclJvdXRlcytjaGVja1N1YnNjcmliZVRva2VuUm91dGUrZGF0YXMudCk7XG4gICAgICAgICAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UodGhpcy5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDAgJiYgcmVzcG9uc2UudXNlcklkICE9IHVuZGVmaW5lZCAmJiByZXNwb25zZS50b2tlbiAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUxvY2FseShcIm1lc3NhZ2VcIiwgeyBtZXNzYWdlOiB0eHRVc2Vycy52YWxpZGF0aW9uTWVzc2FnZSwgY29sb3I6XCJzdWNjZXNzXCIgfSk7Ly8gcG91ciBsJ2FmZmljaGVyIHN1ciBsYSBwYWdlIHN1aXZhbnRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIi9cIitjb25maWdUZW1wbGF0ZS5jb25uZWN0aW9uUGFnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgodGhpcy5zdGF0dXMgPT09IDIwMCB8fCB0aGlzLnN0YXR1cyA9PT0gNDA0KSAmJiByZXNwb25zZS5lcnJvcnMgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihBcnJheS5pc0FycmF5KHJlc3BvbnNlLmVycm9ycykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVycm9ycyA9IHJlc3BvbnNlLmVycm9ycy5qb2luKFwiPGJyPlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVycm9ycyA9IHR4dC5zZXJ2ZXJFcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgcmVzcG9uc2UuZXJyb3JzLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHR4dFVzZXJzLmJhZExpbmtWYWxpZGF0aW9uTWVzc2FnZS5yZXBsYWNlKFwiI1VSTFwiLCBjb25maWdUZW1wbGF0ZS5jb25uZWN0aW9uUGFnZSksIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB4aHIuc2VuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoKGUpXG4gICAge1xuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgdHh0LnNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgfVxufVxuaW5pdGlhbGlzZSgpO1xuaGVsbG9EZXYoKTsiLCIvLyBGT05DVElPTlMgVVRJTEVTIEFVIFNUT0NLQUdFIExPQ0FMIChTRVNTSU9OLCBDT09LSUVTLCBJTkRFWERCLCBFVEMuKVxuLy8gUmV2ZW5pciBwb3VyIGfDqXJlciBsZSBjYXMgb8O5IGxvY2FsLnN0b3JhZ2Ugbidlc3QgcGFzIGNvbm51IHBvdXIgdXRpbGlzZXIgY29va2llXG4gICAgXG5leHBvcnQgY29uc3Qgc2F2ZUxvY2FseSA9IChuYW1lLCBkYXRhKSA9Plxue1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKG5hbWUsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldExvY2FseSA9IChuYW1lLCBqc29uPWZhbHNlKSA9Plxue1xuICAgIGlmKGpzb24pXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKG5hbWUpKTtcbiAgICBlbHNlXG4gICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJlbW92ZUxvY2FseSA9IChuYW1lKSA9Plxue1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKG5hbWUpO1xufSIsImltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG4vLyBGb25jdGlvbiBhc3NvY2lhbnQgbGVzIGF0dHJpYnV0cyBmb3VybmlzIMOgIHVuIGNoYW1wIGRlIGZvcm11bGFpcmVcbmV4cG9ydCBjb25zdCBhZGRFbGVtZW50ID0gKGVsdFBhcmVudCwgZWx0VHlwZSwgZWx0Q29udGVudD1cIlwiLCBlbHRJZD1cIlwiLCBlbHRDbGFzcz1bXSwgZWx0QXR0cmlidXRlcz17fSwgcmVwbGFjZT10cnVlKSA9Plxue1xuICAgIGlmKGlzRW1wdHkoZWx0VHlwZSkgfHwgaXNFbXB0eShlbHRQYXJlbnQpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZWxzZVxuICAgIHtcbiAgICAgICAgY29uc3QgbmV3RWxlbWVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGVsdFR5cGUpO1xuICAgICAgICBcbiAgICAgICAgaWYoIWlzRW1wdHkoZWx0SWQpKS8vIHRlc3RlciBzaSBsJ2lkIG4nZXN0IHBhcyBkw6lqw6AgdXRpbGlzw6kgZGFucyBsZSBET00gP1xuICAgICAgICAgICAgbmV3RWxlbWVudC5pZD1lbHRJZDtcblxuICAgICAgICBpZihBcnJheS5pc0FycmF5KGVsdENsYXNzKSAmJiBlbHRDbGFzcy5sZW5ndGghPTApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGZvcihsZXQgaSBpbiBlbHRDbGFzcylcbiAgICAgICAgICAgICAgICBuZXdFbGVtZW50LmNsYXNzTGlzdC5hZGQoZWx0Q2xhc3NbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYodHlwZW9mIGVsdEF0dHJpYnV0ZXMgPT09IFwib2JqZWN0XCIpIC8vICEhIHRvdXMgbGVzIG9iamV0cyBuZSBzb250IHBhcyBva1xuICAgICAgICB7XG4gICAgICAgICAgICBmb3IobGV0IGF0dHJpYnV0TmFtZSBpbiBlbHRBdHRyaWJ1dGVzKVxuICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0TmFtZSwgZWx0QXR0cmlidXRlc1thdHRyaWJ1dE5hbWVdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFpc0VtcHR5KGVsdENvbnRlbnQpKVxuICAgICAgICAgICAgbmV3RWxlbWVudC5pbm5lckhUTUw9ZWx0Q29udGVudC5yZXBsYWNlKC9cXG4vZyxcIjxicj5cIik7Ly8gaW5uZXJIVE1MIHBlcm1ldCBkJ2Fqb3V0ZXIgZHUgdGV4dGUgYXlhbnQgbHVpLW3Dqm1lIGRlcyBiYWxpc2VzLCBldGMuXG4gICAgICAgICAgICBcbiAgICAgICAgaWYocmVwbGFjZSlcbiAgICAgICAgICAgIGVsdFBhcmVudC5pbm5lckhUTUw9XCJcIjtcbiAgICAgICAgZWx0UGFyZW50LmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpO1xuICAgIH0gICAgXG59IiwiLy8gQ2Ugc2NyaXB0IGZvdXJuaXQgZGVzIGZvbmN0aW9ucyB1dGlsaXPDqWVzIHN1ciB0b3V0ZXMgbGVzIHBhZ2VzIGR1IHNpdGVcblxuZXhwb3J0IGNvbnN0IGhlbGxvRGV2ID0gKCkgPT5cbntcbiAgICBjb25zb2xlLmxvZyhcIioqKiogSGVsbG8gYW1pIGTDqXZlbG9wcGV1ciA6LSlcXG4gTGUgY29kZSBkZSBXaWtpTGVybmkgZXN0IGxpYnJlIGV0IGVzdCBsaXNpYmxlIHN1ciBnaXRsYWIgOiBcXG4gQm9ubmUgbGVjdHVyZSA6LSkgXFxuIFBvdXIgbGVzIHN1Z2dlc3Rpb25zIGQnYW3DqWxpb3JhdGlvbiBvdSBxdWVzdGlvbnMgOiBkZXZAd2lsaWxlcm5pLmNvbSAqKioqXCIpO1xuICAgIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgY29uc3QgdXBkYXRlQWNjb3VudExpbmsgPSAoc3RhdHVzLCBjb25maWdUZW1wbGF0ZSkgPT5cbntcbiAgICBjb25zdCBsaW5rPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYWNjb3VudEhlYWRMaW5rXCIpO1xuICAgIGNvbnN0IGhvbWVQYWdlPXN0YXR1cytcIkhvbWVQYWdlXCI7XG4gICAgbGluay5ocmVmPVwiL1wiK2NvbmZpZ1RlbXBsYXRlW2hvbWVQYWdlXTtcbn0iLCJpbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gRm9uY3Rpb24gcsOpY3Vww6lyYW50IGxlcyBwYXJhbcOodHJlcyBwYXNzw6lzIHBhciBsJ3VybFxuZXhwb3J0IGNvbnN0IGdldFVybFBhcmFtcyA9ICgpID0+XG57XG4gICAgaWYoaXNFbXB0eShsb2NhdGlvbi5zZWFyY2gpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gbG9jYXRpb24uc2VhcmNoLnN1YnN0cmluZygxKS5zcGxpdChcIiZcIik7XG4gICAgaWYoIUFycmF5LmlzQXJyYXkocGFyYW1ldGVycykgfHwgcGFyYW1ldGVycy5sZW5ndGg9PT0wKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIFxuICAgIGxldCBwYXJhbSwgZGF0YXM9e307XG4gICAgZm9yKGxldCBpIGluIHBhcmFtZXRlcnMpXG4gICAge1xuICAgICAgICBwYXJhbSA9IHBhcmFtZXRlcnNbaV0uc3BsaXQoXCI9XCIpO1xuICAgICAgICBpZihwYXJhbS5sZW5ndGg9PT0yKVxuICAgICAgICAgICAgZGF0YXNbcGFyYW1bMF1dPWRlY29kZVVSSShwYXJhbVsxXSk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhcztcbn0iLCJpbXBvcnQgeyBhcGlVcmwsIGF2YWlsYWJsZUxhbmdzLCBzaXRlVXJsLCB0aGVtZSB9IGZyb20gXCIuLi8uLi8uLi9jb25maWcvaW5zdGFuY2UuanNcIjtcbmNvbnN0IGxhbmc9YXZhaWxhYmxlTGFuZ3NbMF07XG5cbmNvbnN0IGNvbmZpZ1RlbXBsYXRlID0gcmVxdWlyZShcIi4uLy4uLy4uL3ZpZXdzL1wiK3RoZW1lK1wiL2NvbmZpZy9cIitsYW5nK1wiLmpzXCIpO1xuaW1wb3J0IHsgIGNoZWNrTG9naW5Sb3V0ZSwgdGltZURpZmZlcmVuY2VNYXgsIHRpbWVEaWZmZXJlbmNlTWluLCB1c2VyUm91dGVzIH0gZnJvbSBcIi4uLy4uLy4uL2NvbmZpZy91c2Vycy5qc1wiO1xuXG5pbXBvcnQgeyBnZXRMb2NhbHksIHJlbW92ZUxvY2FseSwgc2F2ZUxvY2FseSB9IGZyb20gXCIuL2NsaWVudHN0b3JhZ2UuanNcIjtcbmltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG4vLyBSw6ljdXDDqHJlIGxlcyBkb25uw6llcyBkZSBjb25maWd1cmF0aW9uIGRlcyB1dGlsaXNhdGV1cnNcbi8vIMOAIHRlcm1lLCB1biBmaWNoaWVyIHN0YXRpcXVlIGltcG9ydGFibGUgY29tbWUgbW9kdWxlIGRldnJhaXQgw6l2aXRlciB1bmUgcmVxdcOqdGUgYWpheFxuZXhwb3J0IGNvbnN0IGdldENvbmZpZyA9ICBhc3luYyAoKSA9Plxue1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuICAgIHtcbiAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHhoci5vcGVuKFwiR0VUXCIsIGFwaVVybCtcIi91c2VyL2dldGNvbmZpZ1wiKTtcbiAgICAgICAgeGhyLm9ubG9hZCA9ICgpID0+IHJlc29sdmUoSlNPTi5wYXJzZSh4aHIucmVzcG9uc2VUZXh0KSk7XG4gICAgICAgIHhoci5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICAgICAgeGhyLnNlbmQoKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldFRpbWVEaWZmZXJlbmNlID0gKCkgPT5cbntcbiAgICBjb25zdCB0aW1lTG9jYWw9bmV3IERhdGUoKS5nZXRUaW1lem9uZU9mZnNldCgpO1xuICAgIGlmKHRpbWVMb2NhbCA+IHRpbWVEaWZmZXJlbmNlTWF4IHx8IHRpbWVMb2NhbCA8IHRpbWVEaWZmZXJlbmNlTWluKVxuICAgICAgICByZXR1cm4gMDtcbiAgICBlbHNlIHJldHVybiB0aW1lTG9jYWw7XG59XG5cbi8vIE9uIGVubMOodmUgdm9sb250YWlyZW1lbnQgbGVzIDAvTyBwb3VyIMOpdml0ZXIgbGVzIGNvbmZ1c2lvbnMgIVxuLy8gRXQgbWlldXggdmF1dCBhdXNzaSBkw6lidXRlciBldCBmaW5pciBwYXIgdW5lIGxldHRyZSBzaW1wbGUuXG5leHBvcnQgY29uc3QgZ2V0UGFzc3dvcmQgPSAobmJDYXJNaW4sIG5iQ2FyTWF4KSA9Plxue1xuICAgIGNvbnN0IG5iQ2FyPW5iQ2FyTWluK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoobmJDYXJNYXgtbmJDYXJNaW4pKTtcbiAgICBjb25zdCBsZXR0ZXJzPVwiQUJDREVGR0hJSktMTU5QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ucHFyc3R1dnd4eXpcIjtcbiAgICBjb25zdCBvdGhlcnM9XCIxMjM0NTY3ODkhPy4qLV8lQCbDicOAw4jDmeKCrCTDgsOKw5vDjlwiO1xuICAgIGxldCBwYXNzd29yZD1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldO1xuICAgIGZvcihsZXQgaT0xO2k8KG5iQ2FyLTEpO2krKylcbiAgICB7XG4gICAgICAgIGlmKChpICUgMikgPT09MSlcbiAgICAgICAgICAgIHBhc3N3b3JkKz1vdGhlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKm90aGVycy5sZW5ndGgpXTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcGFzc3dvcmQrPWxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxldHRlcnMubGVuZ3RoKV07ICAgXG4gICAgfVxuICAgIHBhc3N3b3JkKz1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldO1xuICAgIHJldHVybiBwYXNzd29yZDtcbn1cblxuLy8gSid1dGlsaXNlIGxlIHN0b2NrYWdlIGxvY2FsIGR1IG5hdmlnYXRldXIgcG91ciBlbnJlZ2lzdHJlciBsZXMgZG9ubsOpZXMgcGVybWV0dGFudCBkZSByZWNvbm5hw650cmUgbCd1dGlsaXNhdGV1ciBwYXIgbGEgc3VpdGVcbi8vIFNldWwgbGUgc2VydmV1ciBwb3VycmEgdsOpcmlmaWVyIHF1ZSBsZXMgaWRlbnRpZmlhbnRzIHNvbnQgKHRvdWpvdXJzKSB2YWxpZGVzLlxuZXhwb3J0IGNvbnN0IHNldFNlc3Npb24gPSAodXNlcklkLCB0b2tlbiwgZHVyYXRpb25UUykgPT5cbntcbiAgICBjb25zdCBzdG9yYWdlVXNlcj1cbiAgICB7XG4gICAgICAgIGlkOiB1c2VySWQsXG4gICAgICAgIHRva2VuOiB0b2tlbixcbiAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uVFNcbiAgICB9XG4gICAgc2F2ZUxvY2FseShcInVzZXJcIiwgc3RvcmFnZVVzZXIpO1xufVxuXG4vLyBWw6lyaWZpZSBxdSdpbCB5IGEgZGVzIGRvbm7DqWVzIGxvY2FsZXMgY29uY2VybmFudCBsZSByw6lzdWx0YXQgZCd1biBxdWl6XG4vLyBFdCBsZXMgYWpvdXRlIGF1eCBkb25uw6llcyBlbnZvecOpZXMgcGFyIGxlcyBmb3JtdWxhaXJlcyBkJ2luc2NyaXB0aW9uL2Nvbm5leGlvbiBzaSBjJ2VzdCBsZSBjYXNcbmV4cG9ydCBjb25zdCBjaGVja0Fuc3dlckRhdGFzID0gKGRhdGFzKSA9Plxue1xuICAgIGNvbnN0IGxhc3RBbnN3ZXI9Z2V0TG9jYWx5KFwibGFzdEFuc3dlclwiKTtcbiAgICBpZighaXNFbXB0eShsYXN0QW5zd2VyKSlcbiAgICB7XG4gICAgICAgIGNvbnN0IGFuc3dlcj1KU09OLnBhcnNlKGxhc3RBbnN3ZXIpO1xuICAgICAgICBpZighaXNFbXB0eShhbnN3ZXIuZHVyYXRpb24pICYmICFpc0VtcHR5KGFuc3dlci5uYkNvcnJlY3RBbnN3ZXJzKSAmJiAhaXNFbXB0eShhbnN3ZXIuUXVlc3Rpb25uYWlyZUlkKSAmJiAhaXNFbXB0eShhbnN3ZXIubmJRdWVzdGlvbnMpKVxuICAgICAgICB7XG4gICAgICAgICAgICBkYXRhcy5kdXJhdGlvbj1hbnN3ZXIuZHVyYXRpb247XG4gICAgICAgICAgICBkYXRhcy5uYkNvcnJlY3RBbnN3ZXJzPWFuc3dlci5uYkNvcnJlY3RBbnN3ZXJzO1xuICAgICAgICAgICAgZGF0YXMuUXVlc3Rpb25uYWlyZUlkPWFuc3dlci5RdWVzdGlvbm5haXJlSWQ7XG4gICAgICAgICAgICBkYXRhcy5uYlF1ZXN0aW9ucz1hbnN3ZXIubmJRdWVzdGlvbnM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGFzO1xufVxuXG4vLyBDZXR0ZSBmb25jdGlvbiB0ZXN0ZSBsYSBjb25uZXhpb24gZGUgbCd1dGlsaXNhdGV1ciBkJ3VuZSBwYWdlXG4vLyBPbiBwZXV0IGZvdXJuaXMgdW5lIGxpc3RlIGRlIHN0YXR1dHMgYWNjZXB0w6lzIChzaSB2aWRlID0gdG91cyksIGFpbnNpIHF1J3VuZSB1cmwgZGUgcmVkaXJlY3Rpb24gc2kgbm9uIGNvbm5lY3TDqSwgdW4gbWVzc2FnZSBkJ2VycmV1ciDDoCBhZmZpY2hlciBzdXIgbGEgcGFnZSBkZSBkZXN0aW5hdGlvbiBldCBsJ3VybCBzdXIgbGFxdWVsbGUgcmV2ZW5pciB1bmUgZm9pcyBjb25uZWN0w6lcbmV4cG9ydCBjb25zdCBjaGVja1Nlc3Npb24gPSBhc3luYyAoc3RhdHVzPVtdLCB1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKSA9Plxue1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuICAgIHtcbiAgICAgICAgY29uc3QgdXNlckRhdGFzPWdldExvY2FseShcInVzZXJcIik7XG4gICAgICAgIGlmKGlzRW1wdHkodXNlckRhdGFzKSlcbiAgICAgICAge1xuICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCB1c2VyPUpTT04ucGFyc2UodXNlckRhdGFzKTtcbiAgICAgICAgICAgIGlmKGlzRW1wdHkodXNlci5pZCkgfHzCoGlzRW1wdHkodXNlci50b2tlbikgfHwgaXNFbXB0eSh1c2VyLmR1cmF0aW9uKSB8fCB1c2VyLmR1cmF0aW9uIDwgRGF0ZS5ub3coKSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBhcGlVcmwrdXNlclJvdXRlcytjaGVja0xvZ2luUm91dGUrdXNlci50b2tlbik7XG4gICAgICAgICAgICAgICAgeGhyLm9ubG9hZCA9ICgpID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDIwMCAmJiByZXNwb25zZS5pc1ZhbGlkICYmIHJlc3BvbnNlLmlkICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2UuaWQ9PT11c2VyLmlkKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIubmFtZT1yZXNwb25zZS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIubGFuZ3VhZ2U9cmVzcG9uc2UubGFuZ3VhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci50aW1lRGlmZmVyZW5jZT1yZXNwb25zZS50aW1lRGlmZmVyZW5jZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnN0YXR1cz1yZXNwb25zZS5zdGF0dXM7Ly8gbGUgdG9rZW4gZXQgZGUgdG91dGUgZmHDp29uIHbDqXJpZmllciDDoCBjaGFxdWUgcmVxdcOqdGUgw6AgbCdBUElcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlTG9jYWx5KFwidXNlclwiLCB1c2VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaSBpbCBzJ2FnaXQgZCd1biBcInVzZXJcIiBldCBxdWUgc29uIGFib25uZW1lbnQgYSBleHBpcsOpLCBqZSBsZSByZWRpcmlnZSB2ZXJzIGxhIGNhaXNzZSA6LSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5zdGF0dXM9PT1cInVzZXJcIiAmJiByZXNwb25zZS5uYkRheXNPayA8PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsQWNjb3VudD1zaXRlVXJsK1wiL1wiK2NvbmZpZ1RlbXBsYXRlW2xhbmddLmFjY291bnRQYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKHVybEFjY291bnQpPT09LTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKFwiL1wiK2NvbmZpZ1RlbXBsYXRlW2xhbmddLmFjY291bnRQYWdlKTsvLyBwYXNzw6llIGRpcmVjdGVtZW50IGljaSwgbCdhbmNyZSAjc3Vic2NyaWJlIG5lIGZvbmN0aW9ubmUgcGFzICE/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHN0YXR1cy5sZW5ndGghPT0wICYmIHN0YXR1cy5pbmRleE9mKHJlc3BvbnNlLnN0YXR1cyk9PT0tMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgeGhyLm9uZXJyb3IgPSAoKSA9PiByZWplY3QoeGhyLnN0YXR1c1RleHQpO1xuICAgICAgICAgICAgICAgIHhoci5zZW5kKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8vIENldHRlIGZvbmN0aW9uIHNlcnQgw6AgbGEgcHLDqWPDqWRlbnRlIGVuIGNhcyBkZSBjb25uZXhpb24gbm9uIHZhbGlkZVxuY29uc3QgcmVkaXJlY3RVc2VyID0gKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpID0+XG57XG4gICAgaWYoIWlzRW1wdHkobWVzc2FnZSkpXG4gICAgICAgIHNhdmVMb2NhbHkoXCJtZXNzYWdlXCIsIG1lc3NhZ2UpO1xuICAgIGlmKCFpc0VtcHR5KHVybFdhbnRlZCkpXG4gICAgICAgIHNhdmVMb2NhbHkoXCJ1cmxcIiwgdXJsV2FudGVkKTtcbiAgICBpZighaXNFbXB0eSh1cmxSZWRpcmVjdGlvbikpXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24odXJsUmVkaXJlY3Rpb24pO1xufSJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/front/public/JS/unsubscribe.app.js b/front/public/JS/unsubscribe.app.js new file mode 100644 index 0000000..4a27948 --- /dev/null +++ b/front/public/JS/unsubscribe.app.js @@ -0,0 +1,1235 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "./src/unsubscribe.js"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "../config/instance.js": +/*!*****************************!*\ + !*** ../config/instance.js ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var _module$exports; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var users = __webpack_require__(/*! ./users */ "../config/users.js"); + +var questionnaires = __webpack_require__(/*! ./questionnaires */ "../config/questionnaires.js"); + +module.exports = (_module$exports = { + apiUrl: "http://localhost:3000/api", + siteUrl: "http://localhost:8080", + adminName: "Fabrice", + adminEmail: "dev@wikilerni.com", + senderName: "WikiLerni", + senderEmail: "bonjour@wikilerni.com", + adminLang: "fr", + theme: "default", + // le thème utilisé (dans /views) pour générer les pages HTML. Contient ses propres fichiers de configuration. + availableLangs: ["fr"], + // Languages in which the site is available. The first one is the default one. + siteName: "WikiLerni", + beginCodeGodfather: "wikilerni", + // case-sensitive and can't contain "@" ! + cronTimingAlertInSeconde: 120, + // for logs + responseTimingAlertInSeconde: 3, + // idem + tokenSignupValidationTimeInHours: "48h", + // https://github.com/zeit/ms + tokenLoginLinkTimeInHours: "1h", + tokenConnexionMinTimeInHours: "24h", + tokenConnexionMaxTimeInDays: "180 days", + tokenLoginChangingTimeInHours: "1h", + // for email & password changing + tokenDeleteUserTimeInHours: "1h", + tokenUnsubscribeLinkTimeInDays: "7 days", + // token send with subscription's emails + freeAccountTimingInDays: 10, + freeAccountExpirationNotificationInDays: 5, + accountExpirationFirstNotificationInDays: 14, + accountExpirationSecondNotificationInDays: 5, + inactiveAccountTimeToDeleteInDays: 180, + // Questionnaires: + nbQuestionsMin: 1, + // minimum number of questions for the questionnaire to be publishable + nbQuestionsMax: 10, + // if 0 = not maximum + nbChoicesMax: 10, + nbNewQuestionnaires: 10, + // for RSS, etc. + hourGiveNewQuestionnaireBegin: 1, + // in user local time + hourGiveNewQuestionnaireEnd: 24, + // idem + numberNewQuestionnaireAtSameTime: 50, + // for mass mailing + minSearchQuestionnaires: 3, + // Illustrations: + nbIllustrationsMin: 0, + nbIllustrationsMax: 1, + maxIllustrationSizeinOctet: 1000000, + // pas contrôlé pour l'instant. À revoir. + mimeTypesForIllustration: ["image/jpg", "image/jpeg", "image/png", "image/gif", "image/png"], + // -- Upload and resize: + illustrationsWidthMaxInPx: 400, + illustrationsMiniaturesWidthMaxInPx: 200, + // Links: + nbLinksMin: 1, + nbLinksMax: 1 +}, _defineProperty(_module$exports, "nbQuestionsMin", questionnaires.nbQuestionsMin), _defineProperty(_module$exports, "nbQuestionsMax", questionnaires.nbQuestionsMax), _defineProperty(_module$exports, "nbChoicesMax", questionnaires.nbChoicesMax), _defineProperty(_module$exports, "passwordMinLength", users.password.minlength), _defineProperty(_module$exports, "dirCacheUsers", users.dirCacheUsers), _defineProperty(_module$exports, "dirCacheUsersAnswers", users.dirCacheUsersAnswers), _defineProperty(_module$exports, "dirCacheQuestionnaires", questionnaires.dirCacheQuestionnaires), _defineProperty(_module$exports, "dirCacheQuestions", questionnaires.dirCacheQuestions), _defineProperty(_module$exports, "dirCacheUsersQuestionnaires", questionnaires.dirCacheUsersQuestionnaires), _defineProperty(_module$exports, "dirHTMLQuestionnaire", questionnaires.dirHTMLQuestionnaire), _defineProperty(_module$exports, "dirWebQuestionnaire", questionnaires.dirWebQuestionnaire), _module$exports); + +/***/ }), + +/***/ "../config/questionnaires.js": +/*!***********************************!*\ + !*** ../config/questionnaires.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + // API'routes (after "apiUrl" defined in instance.js) + questionnaireRoutes: "/questionnaire", + getQuestionnaireRoutes: "/get", + previewQuestionnaireRoutes: "/preview", + publishedQuestionnaireRoutes: "/quiz/", + saveAnswersRoute: "/answer/", + getStatsQuestionnaires: "/stats/", + searchQuestionnairesRoute: "/search", + searchAdminQuestionnairesRoute: "/searchadmin", + getListNextQuestionnaires: "/getlistnextquestionnaires/", + // -- questions & choices : + questionsRoute: "/question/", + // -- tags : + tagsSearchRoute: "/tags/search/", + // -- answers : + getQuestionnairesWithoutAnswer: "/withoutanswer/user/", + getPreviousAnswers: "/user/answers/", + getStatsAnswers: "/user/anwswers/stats/", + getAdminStats: "/getadminstats/", + // forms : à compléter avec valeurs par défaut, etc. cf modèle + Questionnaire: { + title: { + maxlength: 255, + required: true + }, + slug: { + maxlength: 150 + }, + // champ requis mais calculé à partir du titre qd vide + introduction: { + required: true + } + }, + searchQuestionnaires: { + minlength: 3, + required: true + }, + Question: { + text: { + maxlength: 255, + required: true + }, + rank: { + required: true, + min: 1, + defaultValue: 1 + } + }, + Choice: { + text: { + maxlength: 255, + required: true + } + }, + nbQuestionsMin: 1, + nbQuestionsMax: 10, + nbChoicesMax: 10, + nbTagsMin: 0, + nbTagsMax: 0, + // 0 = not max + // JSON and HTML dir + dirCacheQuestionnaires: "datas/questionnaires", + dirCacheQuestions: "datas/questionnaires/questions", + dirCacheUsersQuestionnaires: "datas/users/questionnaires", + dirCacheTags: "datas/questionnaires/tags", + dirHTMLQuestionnaire: "front/public/quiz", + dirHTMLTags: "front/public/quizs", + dirWebQuestionnaire: "quiz", + //pour url page + dirWebTags: "quizs" // idem + +}; + +/***/ }), + +/***/ "../config/users.js": +/*!**************************!*\ + !*** ../config/users.js ***! + \**************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + // API'routes (after "apiUrl" defined in instance.js) + userRoutes: "/user", + subscribeRoute: "/signup", + getGodfatherRoute: "/getgodfatherid", + checkIfIsEmailfreeRoute: "/isemailfree", + checkSubscribeTokenRoute: "/validation/", + checkLoginRoute: "/checklogin/", + connectionRoute: "/login", + getLoginLinkRoute: "/getloginlink", + connectionWithLinkRoute: "/checkloginlink", + getUserInfos: "/get/", + createUserRoute: "/create", + validateUserRoute: "/validate/", + updateUserInfos: "/modify/", + searchUserRoute: "/search/", + getGodChilds: "/getgodchilds/", + checkNewLoginLinkRoute: "/confirmnewlogin/", + checkDeleteLinkRoute: "/confirmdelete/", + getPayments: "/payment/getforoneuser/", + unsubscribeRoute: "/subscription/stop/", + getAdminStats: "/getadminstats/", + // forms : à compléter avec valeurs par défaut, etc. cf modèle + name: { + maxlength: 70, + required: true + }, + email: { + maxlength: 255, + required: true + }, + password: { + minlength: 8, + maxlength: 72, + required: true + }, + // https://www.npmjs.com/package/bcrypt#security-issues-and-concerns + newPassword: { + minlength: 8, + maxlength: 72 + }, + codeGodfather: { + maxlength: 255 + }, + cguOk: { + value: "true", + required: true + }, + timeDifferenceMin: -720, + timeDifferenceMax: 840, + // JSON dir + dirCacheUsers: "datas/users", + dirCacheUsersAnswers: "datas/users/questionnaires/answers" +}; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/general$": +/*!**************************************!*\ + !*** ../lang sync ^\.\/.*\/general$ ***! + \**************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/general": "../lang/fr/general.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/general$"; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/subscription$": +/*!*******************************************!*\ + !*** ../lang sync ^\.\/.*\/subscription$ ***! + \*******************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/subscription": "../lang/fr/subscription.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/subscription$"; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/user$": +/*!***********************************!*\ + !*** ../lang sync ^\.\/.*\/user$ ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/user": "../lang/fr/user.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/user$"; + +/***/ }), + +/***/ "../lang/fr/general.js": +/*!*****************************!*\ + !*** ../lang/fr/general.js ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + siteHTMLTitle: "WikiLerni : qu'allez-vous apprendre aujourd'hui ?", + siteMetaDescription: "Chaque jour, testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.", + scriptTimingInfo: "Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", + scriptTimingAlert: "*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", + serverError: "Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.", + serverErrorAdmin: "Bug de l'application :", + neededParams: "Des paramètres nécessaires manquants sont manquants.", + badUrl: "Tentative d'accès à une page n'existant pas :", + notValidFormat: "Format non valide.", + notAllowed: "Vous n'avez pas les droits nécessaires pour cette action.", + notRequired: "Facultatif.", + updateBtnTxt: "Modifier", + addBtnTxt: "Ajouter", + deleteBtnTxt: "Supprimer", + addOkMessage: "Les données ont bien été enregistrées.", + updateOkMessage: "La mise à jour à jour a bien été enregistrée.", + deleteOkMessage: "La suppression a bien été enregistrée.", + failAuth: "Erreur d'authentification.", + failAuthHeader: "Absence de header Authorization.", + failAuthToken: "Token invalide ou utilisateur non trouvé.", + failAuthId: "Identifiant non valide : ", + failAuthCron: "Tentative de lancement d'un cron sans le bon token.", + previousPage: "Page précédente", + nextPage: "Page suivante", + btnLinkToQuestionnaire: "Aller au quiz !", + statsAdmin: "Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
    En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
    Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium." +}; + +/***/ }), + +/***/ "../lang/fr/subscription.js": +/*!**********************************!*\ + !*** ../lang/fr/subscription.js ***! + \**********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + needNumberOfDays: "Il faut un nombre de jours pour l'abonnement.", + needIntegerNumberOfDays: "Le nombre de jours de l'abonnement doit être un nombre entier.", + needMinNumberOfDays: "Le nombre de jours de l'abonnement ne peut être négatif !", + needNotTooLongDaysList: "La liste de jours sélectionnés n'a pas le bon format (trop longue).", + needValidDaysList: "La liste de jours sélectionnés n'a pas le bon format. Caractère non valide : ", + needUniqueDaysList: "La liste de jours sélectionnés n'a pas le bon format. Doublon : ", + needKnowIfNoticeOk: "Il manque l'information sur l'acceptation ou non de recevoir des notifications.", + unsubscriptionOk: "Votre demande a bien été prise en compte. Vous ne recevrez plus de messages venant du site, sauf pour vous signaler la fin de votre abonnement.
    N'hésitez pas à accéder à votre compte pour de nouveau autoriser certains envois.", + unsubscriptionFail: "Si vous voyez ce message, c'est que votre lien de désabonnement ne fonctionne pas.
    Vous pouvez accéder à votre compte pour désactiver les envois manuellement.", + allSubscriptionProcessed: "Tous les abonnés ont été traités pour le moment.", + mailNewQuestionnaireSubject: "Qu'allez-vous apprendre aujourd'hui ?", + mailNewQuestionnaireBodyTxt: "Bonjour USER_NAME,\n\nUn nouveau quiz vient de vous être proposé :\nQUESTIONNAIRE_URL\n\nBonne lecture !\n\nStopper les envois ?\nUNSUBSCRIBE_URL", + mailNewQuestionnaireBodyHTML: "

    Bonjour USER_NAME,

    MAIL_INTRODUCTION

    Stopper les envois.

    ", + noNewQuestionnaireForUser: "Aucun nouveau questionnaire trouvé pour un abonné : ", + mailEndFreeTimeSubject: "Votre abonnement gratuit va expirer", + mailEndFreeTimeBodyTxt: "Bonjour USER_NAME,\nVotre abonnement gratuit à SITE_NAME va expirer d'ici quelques jours.\nPour continuer à utiliser le site, vous pouvez souscrire à un abonnement dès aujourd'hui :\nLINK_URL", + mailEndFreeTimeBodyHTML: "

    Bonjour USER_NAME,

    Votre abonnement gratuit à SITE_NAME va expirer d'ici quelques jours. Pour continuer à utiliser le site, vous pouvez souscrire à un abonnement dès aujourd'hui en cliquez ici sans tarder.

    ", + mailEndFreeTimeMessage: " relances envoyées.", + mailExpirationSubject: "Votre abonnement va bientôt expirer", + mailExpirationBodyTxt: "Bonjour USER_NAME,\nVotre abonnement gratuit à SITE_NAME va expirer d'ici quelques jours.\nPour continuer à utiliser le site, vous pouvez le prolonger dès aujourd'hui :\nLINK_URL", + mailExpirationBodyHTML: "

    Bonjour USER_NAME,

    Votre abonnement à SITE_NAME va expirer d'ici quelques jours.
    Pour continuer à utiliser le site, vous pouvez le prolonger dès aujourd'hui en cliquant ici.

    ", + mailExpirationMessage: "FIRST premières et SECOND deuxièmes relances envoyées pour des abonnements expirant d'ici peu.", + infosNbDays: "Votre abonnement est encore valable pendant NB_DAYS jours.
    Vous pouvez à tout moment prolonger votre abonnement en suivant les indications ci-dessous :", + infosExpirated: "Votre abonnement a expiré, mais il vous reste encore quelques jours avant que votre compte et vos données ne soient complètement supprimées.
    Pour ce faire, suivez sans tarder les indications ci-dessous :", + infosNbDaysAdmin: "Cet abonnement est encore valable pendant NB_DAYS jours.", + infosExpiratedAdmin: "Cet abonnement a expiré.", + isNotValided: "Cet utilisateur n'a pas encore validé son compte.
    Vous pouvez le faire à sa place en cochant la case indiquée et enregistrant.", + infosPaymentsAdmin: "DATE_PAYMENT : paiement de AMOUNT € au nom de CLIENT_NAME." +}; + +/***/ }), + +/***/ "../lang/fr/user.js": +/*!**************************!*\ + !*** ../lang/fr/user.js ***! + \**************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + notFound: "L'utilisateur n'a pas été trouvé.", + needName: "Merci de choisir un nom d'utilisateur.", + needNotTooLongName: "Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.", + needEmail: "Merci de saisir votre adresse e-mail.", + needUniqueEmail: "L'adresse e-mail que vous avez saisie est déjà utilisée par un autre utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.", + needNotTooLongEmail: "Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.", + needPassWord: "Merci de fournir un mot de passe.", + needLongPassWord: "Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.", + passwordCopied: "Le mot de passe généré a été copié dans le presse-papier. Vous pouvez le recopier où vous le souhaiter.", + needStatus: "Il manque le statut.", + needLanguage: "Il manque le code langue.", + needValidLastConnectionDate: "La date de dernière connexion n'est pas valide.", + needSMTP: "Il manque le serveur SMTP.", + needSMTPNotFound: "Il manque le serveur SMTP.", + needKnowNewsletterOk: "Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.", + needTimeDifference: "Il faut connaître le nombre de minutes du décalage horaire.", + needMinTimeDifference: "Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.", + needMaxTimeDifference: "Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.", + needUGCOk: "Vous devez accepter les CGU pour pouvoir créer votre compte. ", + godfatherNotFound: "Aucun utilisateur valide trouvé pour ce code parrain.", + godfatherFound: "Votre parrain a bien été trouvé !", + mailValidationMessage: "Votre inscription est bien enregistrée.\nPour la finaliser, merci de cliquer dans les 24H sur le lien de confirmation qui vient de vous être envoyé par e-mail.", + mailValidationLinkSubject: "Merci de valider votre compte", + mailValidationLinkSBodyTxt: "Bonjour USER_NAME,\n\nPour valider votre compte, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL", + mailValidationLinkSBodyHTML: "

    Bonjour USER_NAME,

    Pour valider votre compte, merci de cliquer sur le lien suivant dans les 24h.

    Valider.

    ", + validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue !
    Vous pouvez sans tarder vous connecter ci-dessous pour accéder à votre compte.", + validationMessageAdmin: "Le compte a bien été validé.", + validationAlreadyMessage: "Il semble que vous ayez déjà validé votre compte.", + validationAlreadyMessageAdmin: "Ce compte a déjà été validé.", + mailWelcomeSubject: "Bienvenue !", + mailWelcomeBodyTxt: "Bonjour USER_NAME,\nVotre venez de valider votre inscription à NOM_SITE.\nMerci et à bientôt !", + mailWelcomeBodyHTML: "

    Bonjour USER_NAME,

    Votre venez de valider votre inscription à NOM_SITE.

    Merci et à bientôt !

    ", + mailThankGodfatherSubject: "Merci !", + mailThankGodfatherBodyTxt: "Bonjour USER_NAME,\nGrâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nMerci et à bientôt !", + mailThankGodfatherBodyHTML: "

    Bonjour USER_NAME,

    Grâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.

    Merci et à bientôt !

    ", + badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.", + emailNotFound: "Aucun utilisateur trouvé pour cette adresse e-mail.", + alreadyConnected: "Vous êtes déjà connecté(e) au site !", + needBeConnected: "Vous devez être connecté(e) pour accéder à cette page.", + connectionOk: "Connexion réussie.", + needChooseLoginWay: "Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.", + needValidationToLogin: "Vous devez d'abord valider votre compte avant de vous connecter. Pour ce faire, un lien vient de vous être envoyé par e-mail.", + tooManyLoginFails: "Trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.", + badPassword: "Le mot de passe n'est pas le bon.", + mailLoginLinkSubject: "Votre lien de connexion.", + mailLoginLinkBodyTxt: "Bonjour USER_NAME,\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : LINK_URL", + mailLoginLinkBodyHTML: "

    Bonjour USER_NAME,

    Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :

    Valider.

    ", + mailLoginLinkMessage: "Un lien de connexion vient de vous être envoyé sur votre adresse e-mail. Ne tardez pas à l'utiliser, car il n'est valable que durant ", + updatedOkMessage: "Vos informations ont bien été mises à jour.", + updatedNeedGoodEmail: "Mais la nouvelle adresse e-mail n'a pu être enregistrée car elle n'a pas une format correct.", + updatedNeedUniqueEmail: "Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.", + mailUpdateLoginSubject: "Merci de valider vos nouveaux identifiants.", + mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL", + mailUpdateLoginBodyHTML: "

    Bonjour USER_NAME,

    Pour valider vos nouveaux identifiants de connexion, cliquez ici sans tarder.

    ", + mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (email et/ou mot de passe) et vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement. En attendant, merci de continuer à utiliser vos anciens identifiants.", + updatedNeedValidatedUser: "L'utilisateur que vous souhaité modifier n'existe pas/plus ou n'a pas encore validé son compte.", + updatedNeedGoodGodfather: "Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.", + mailUpdateLoginOkMessage: "La mise à jour de vos identifiants a bien été enregistrée.", + updatedFailedGodfatherNotFound: "L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.", + creationOkMessage: "Le nouvel utilisateur a bien été enregistré.", + mailDeleteSubject: "Confirmer la suppression de votre compte.", + mailDeleteBodyTxt: "Bonjour USER_NAME,\nPour valider la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL", + mailDeleteBodyHTML: "

    Bonjour USER_NAME,

    Pour valider la suppression de votre compte, cliquez ici sans tarder.

    ", + mailDeleteLinkMessage: "Votre demande de suppression a bien été enregistrée. Merci de cliquer sans tarder sur le lien qui vient de vous être envoyé par e-mail pour confirmer.", + deleteOkMessage: "L'utilisateur a bien été supprimé.", + deleteFailMessage: "Tentative de suppression d'un utilisateur inexistant : ", + mailDeleteLinkOkMessage: "Votre compte a bien été supprimé. Merci d'avoir utilisé nos services.", + mailDeleteLinkAlreadyMessage: "Il semble que vous ayez déjà validé la suppression de votre compte.", + mailDeleteLinkFailMessage: "Votre lien de suppression n'est pas valide ou alors il n'est plus valable.", + cronDeleteUnvalidedUsersMessage: " comptes utilisateurs non validés ont été supprimés.", + deleteInactiveUsersMessage: " comptes utilisateurs inactifs ont été supprimés.", + welcomeMessage: "Bienvenue #NAME !", + byebyeMessage: "Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
    À bientôt !", + infosUserForAdmin: "Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
    Date de sa dernière connexion : DATE_CONNECTION.", + infosAdminGodfather: "Cet utilisateur a été parrainé par ", + infosAdminNbGodChilds: "Ses #NB filleuils : " +}; + +/***/ }), + +/***/ "../tools/main.js": +/*!************************!*\ + !*** ../tools/main.js ***! + \************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +// Quelques fonctions utiles pour les chaînes +var Tool = /*#__PURE__*/function () { + function Tool() { + _classCallCheck(this, Tool); + } + + _createClass(Tool, null, [{ + key: "isEmpty", + value: function isEmpty(myVar) { + if (myVar === undefined || myVar === null) return true;else { + myVar += ""; // si autre chose qu'une chaîne envoyé... + + myVar = myVar.trim(); + if (myVar === "") return true;else return false; + } + } + }, { + key: "trimIfNotNull", + value: function trimIfNotNull(myString) { + if (Tool.isEmpty(myString)) myString = null;else { + myString += ""; // si autre chose qu'une chaîne envoyé... + + myString = myString.trim(); + } + return myString; + } + }, { + key: "shortenIfLongerThan", + value: function shortenIfLongerThan(myString, max) { + myString += ""; // au cas où cela ne serait pas une chaîne... + + if (myString.length > max) myString = myString.substring(0, max - 3) + "..."; + return myString; + } // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings + + }, { + key: "replaceAll", + value: function replaceAll(myString, mapObj) { + var replaceElts = new RegExp(Object.keys(mapObj).join("|"), "gi"); + return myString.replace(replaceElts, function (matched) { + return mapObj[matched]; + }); + } // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random + + }, { + key: "getRandomInt", + value: function getRandomInt(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min)) + min; + } // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country + + }, { + key: "dateFormat", + value: function dateFormat(dateString) { + var lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "fr"; + if (Tool.isEmpty(dateString)) return ""; + var myDate = new Date(dateString); + var myDay = myDate.getDate() + ""; + if (myDay.length === 1) myDay = "0" + myDay; + var myMounth = myDate.getMonth() + 1 + ""; + if (myMounth.length === 1) myMounth = "0" + myMounth; + var myYear = myDate.getFullYear(); + if (lang === "fr") return myDay + "/" + myMounth + "/" + myYear;else if (lang === "form") // 2014-02-09 + return myYear + "-" + myMounth + "-" + myDay;else return myMounth + "/" + myDay + "/" + myYear; + } + }]); + + return Tool; +}(); + +module.exports = Tool; + +/***/ }), + +/***/ "../views sync recursive ^\\.\\/.*\\.js$": +/*!**********************************!*\ + !*** ../views sync ^\.\/.*\.js$ ***! + \**********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./default/config/fr.js": "../views/default/config/fr.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../views sync recursive ^\\.\\/.*\\.js$"; + +/***/ }), + +/***/ "../views/default/config/fr.js": +/*!*************************************!*\ + !*** ../views/default/config/fr.js ***! + \*************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + headLinks: [{ + anchor: "Accueil", + attributes: { + href: "/" + } + }, { + anchor: "Mon compte", + attributes: { + href: "/connexion.hmt", + id: "accountHeadLink" + } + }, { + anchor: "À propos", + attributes: { + href: "/a-propos.html" + } + }, { + anchor: "Contact", + attributes: { + href: "/contact.html" + } + }], + footLinks: [{ + anchor: "Crédits", + attributes: { + href: "/credits.html" + } + }, { + anchor: "Mentions légales", + attributes: { + href: "/mentions-legales.html", + rel: "nofollow" + } + }, { + anchor: "Données personnelles", + attributes: { + href: "/donnees.html" + } + }, { + anchor: "C.G.U.", + attributes: { + href: "/cgu.html", + rel: "nofollow" + } + }, { + anchor: "C.G.V.", + attributes: { + href: "/cgv.html", + rel: "nofollow" + } + }], + maxQuestionnairesByPage: 10, + userHomePage: "accueil.html", + adminHomePage: "admin.html", + managerHomePage: "gestion.html", + subscribePage: "inscription.html", + connectionPage: "connexion.html", + accountPage: "compte.html", + questionnairesManagementPage: "gestion-quizs.html", + usersManagementPage: "gestion-utilisateurs.html", + nbQuestionnairesUserHomePage: 10, + illustrationDir: "/img/quizs/", + siteSlogan: "Cultivons notre jardin !", + homeTitle1: "De nature curieuse ?", + homeP1: "Avec WikiLerni vous apprenez chaque jour de nouvelles choses.
    Des articles de Wikipédia sont sélectionnés pour vous et sont suivis d'un quiz vous permettant de tester ce que vous en avez retenu.
    De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre \"jardin\".", + homeTitle2: "La culture en liberté", + homeP2: "Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
    Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
    Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
    Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.

    (*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.", + newQuestionnairesTitle: "Les derniers quizs publiés sur WikiLerni", + newQuestionnairesIntro: "Liste des derniers quizs publiés sur WikiLerni.", + explanationTitle: "Vous découvrez WikiLerni ?", + explanationTxt: "Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
    Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.

    Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.

    Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)

    Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
    Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.

    Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.", + noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript." +}; + +/***/ }), + +/***/ "./src/tools/clientstorage.js": +/*!************************************!*\ + !*** ./src/tools/clientstorage.js ***! + \************************************/ +/*! exports provided: saveLocaly, getLocaly, removeLocaly */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveLocaly", function() { return saveLocaly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaly", function() { return getLocaly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeLocaly", function() { return removeLocaly; }); +// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.) +// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie +var saveLocaly = function saveLocaly(name, data) { + localStorage.setItem(name, JSON.stringify(data)); +}; +var getLocaly = function getLocaly(name) { + var json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name); +}; +var removeLocaly = function removeLocaly(name) { + localStorage.removeItem(name); +}; + +/***/ }), + +/***/ "./src/tools/dom.js": +/*!**************************!*\ + !*** ./src/tools/dom.js ***! + \**************************/ +/*! exports provided: addElement */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addElement", function() { return addElement; }); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__); +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + + // Fonction associant les attributs fournis à un champ de formulaire + +var addElement = function addElement(eltParent, eltType) { + var eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; + var eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; + var eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : []; + var eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; + var replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true; + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltType) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltParent)) return false;else { + var newElement = document.createElement(eltType); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ? + newElement.id = eltId; + + if (Array.isArray(eltClass) && eltClass.length != 0) { + for (var i in eltClass) { + newElement.classList.add(eltClass[i]); + } + } + + if (_typeof(eltAttributes) === "object") // !! tous les objets ne sont pas ok + { + for (var attributName in eltAttributes) { + newElement.setAttribute(attributName, eltAttributes[attributName]); + } + } + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltContent)) newElement.innerHTML = eltContent.replace(/\n/g, "
    "); // innerHTML permet d'ajouter du texte ayant lui-même des balises, etc. + + if (replace) eltParent.innerHTML = ""; + eltParent.appendChild(newElement); + } +}; + +/***/ }), + +/***/ "./src/tools/everywhere.js": +/*!*********************************!*\ + !*** ./src/tools/everywhere.js ***! + \*********************************/ +/*! exports provided: helloDev, updateAccountLink */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "helloDev", function() { return helloDev; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateAccountLink", function() { return updateAccountLink; }); +// Ce script fournit des fonctions utilisées sur toutes les pages du site +var helloDev = function helloDev() { + console.log("**** Hello ami développeur :-)\n Le code de WikiLerni est libre et est lisible sur gitlab : \n Bonne lecture :-) \n Pour les suggestions d'amélioration ou questions : dev@wililerni.com ****"); + return true; +}; +var updateAccountLink = function updateAccountLink(status, configTemplate) { + var link = document.getElementById("accountHeadLink"); + var homePage = status + "HomePage"; + link.href = "/" + configTemplate[homePage]; +}; + +/***/ }), + +/***/ "./src/tools/url.js": +/*!**************************!*\ + !*** ./src/tools/url.js ***! + \**************************/ +/*! exports provided: getUrlParams */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getUrlParams", function() { return getUrlParams; }); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__); + // Fonction récupérant les paramètres passés par l'url + +var getUrlParams = function getUrlParams() { + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(location.search)) return false; + var parameters = location.search.substring(1).split("&"); + if (!Array.isArray(parameters) || parameters.length === 0) return false; + var param, + datas = {}; + + for (var i in parameters) { + param = parameters[i].split("="); + if (param.length === 2) datas[param[0]] = decodeURI(param[1]); + } + + return datas; +}; + +/***/ }), + +/***/ "./src/tools/users.js": +/*!****************************!*\ + !*** ./src/tools/users.js ***! + \****************************/ +/*! exports provided: getConfig, getTimeDifference, getPassword, setSession, checkAnswerDatas, checkSession */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getConfig", function() { return getConfig; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTimeDifference", function() { return getTimeDifference; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getPassword", function() { return getPassword; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setSession", function() { return setSession; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkAnswerDatas", function() { return checkAnswerDatas; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkSession", function() { return checkSession; }); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/instance.js */ "../config/instance.js"); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../config/users.js */ "../config/users.js"); +/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_3__); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + + +var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0]; + +var configTemplate = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); + + + + // Récupère les données de configuration des utilisateurs +// À terme, un fichier statique importable comme module devrait éviter une requête ajax + +var getConfig = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + return _context.abrupt("return", new Promise(function (resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + "/user/getconfig"); + + xhr.onload = function () { + return resolve(JSON.parse(xhr.responseText)); + }; + + xhr.onerror = function () { + return reject(xhr.statusText); + }; + + xhr.send(); + })); + + case 1: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + + return function getConfig() { + return _ref.apply(this, arguments); + }; +}(); +var getTimeDifference = function getTimeDifference() { + var timeLocal = new Date().getTimezoneOffset(); + if (timeLocal > _config_users_js__WEBPACK_IMPORTED_MODULE_1__["timeDifferenceMax"] || timeLocal < _config_users_js__WEBPACK_IMPORTED_MODULE_1__["timeDifferenceMin"]) return 0;else return timeLocal; +}; // On enlève volontairement les 0/O pour éviter les confusions ! +// Et mieux vaut aussi débuter et finir par une lettre simple. + +var getPassword = function getPassword(nbCarMin, nbCarMax) { + var nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin)); + var letters = "ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz"; + var others = "123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ"; + var password = letters[Math.floor(Math.random() * letters.length)]; + + for (var i = 1; i < nbCar - 1; i++) { + if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)]; + } + + password += letters[Math.floor(Math.random() * letters.length)]; + return password; +}; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite +// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides. + +var setSession = function setSession(userId, token, durationTS) { + var storageUser = { + id: userId, + token: token, + duration: durationTS + }; + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("user", storageUser); +}; // Vérifie qu'il y a des données locales concernant le résultat d'un quiz +// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas + +var checkAnswerDatas = function checkAnswerDatas(datas) { + var lastAnswer = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("lastAnswer"); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(lastAnswer)) { + var answer = JSON.parse(lastAnswer); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.duration) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbCorrectAnswers) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.QuestionnaireId) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbQuestions)) { + datas.duration = answer.duration; + datas.nbCorrectAnswers = answer.nbCorrectAnswers; + datas.QuestionnaireId = answer.QuestionnaireId; + datas.nbQuestions = answer.nbQuestions; + } + } + + return datas; +}; // Cette fonction teste la connexion de l'utilisateur d'une page +// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté + +var checkSession = /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() { + var status, + urlRedirection, + message, + urlWanted, + _args2 = arguments; + return regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + status = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : []; + urlRedirection = _args2.length > 1 ? _args2[1] : undefined; + message = _args2.length > 2 ? _args2[2] : undefined; + urlWanted = _args2.length > 3 ? _args2[3] : undefined; + return _context2.abrupt("return", new Promise(function (resolve, reject) { + var userDatas = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("user"); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(userDatas)) { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else { + var user = JSON.parse(userDatas); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.id) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.token) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.duration) || user.duration < Date.now()) { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else { + var xhr = new XMLHttpRequest(); + xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["userRoutes"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["checkLoginRoute"] + user.token); + + xhr.onload = function () { + var response = JSON.parse(xhr.responseText); + + if (xhr.status === 200 && response.isValid && response.id != undefined) { + if (response.id === user.id) { + user.name = response.name; + user.language = response.language; + user.timeDifference = response.timeDifference; + user.status = response.status; // le token et de toute façon vérifier à chaque requête à l'API + + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("user", user); // si il s'agit d'un "user" et que son abonnement a expiré, je le redirige vers la caisse :-) + + if (response.status === "user" && response.nbDaysOk <= 0) { + var urlAccount = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["siteUrl"] + "/" + configTemplate[lang].accountPage; + if (window.location.href.indexOf(urlAccount) === -1) window.location.assign("/" + configTemplate[lang].accountPage); // passée directement ici, l'ancre #subscribe ne fonctionne pas !? + + resolve(true); + } else { + if (status.length !== 0 && status.indexOf(response.status) === -1) { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else resolve(true); + } + } else { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + } else { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + }; + + xhr.onerror = function () { + return reject(xhr.statusText); + }; + + xhr.send(); + } + } + })); + + case 5: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + + return function checkSession() { + return _ref2.apply(this, arguments); + }; +}(); // Cette fonction sert à la précédente en cas de connexion non valide + +var redirectUser = function redirectUser(urlRedirection, message, urlWanted) { + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(message)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("message", message); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlWanted)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("url", urlWanted); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlRedirection)) window.location.assign(urlRedirection); +}; + +/***/ }), + +/***/ "./src/unsubscribe.js": +/*!****************************!*\ + !*** ./src/unsubscribe.js ***! + \****************************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ "../config/instance.js"); +/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js"); +/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js"); +/* harmony import */ var _tools_url_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/url.js */ "./src/tools/url.js"); +/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./tools/users.js */ "./src/tools/users.js"); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + +// -- GESTION DE LA PAGE PERMETTANT DE SE DÉBONNER DE TOUS LES ENVOIS +/// Un token est transmis en paramètre de l'Url. Il a une validité limité dans le temps. Si le token est ok, il n'est pas nécessaire d'être connecté. +/// Dans le cas où il n'est plus valide, on peut proposer à l'utilisateur de se connecter à son compte pour se désabonner. +/// Si le token est ok, on valide enregistrement le désabonnement et affiche un message de confirmation +// Fichier de configuration côté client : + +var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0]; + +var configFrontEnd = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); // Importation des fonctions utile au script : + + + + + + + // Dictionnaires : + +var txt = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + lang + "/general"); + +var txtUsers = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/user$")("./" + lang + "/user"); + +var txtSubscriptions = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/subscription$")("./" + lang + "/subscription"); + +var divResponse = document.getElementById("response"); +Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["helloDev"])(); +var config; + +var initialise = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + var datas, xhr; + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _context.prev = 0; + _context.next = 3; + return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_5__["getConfig"])(); + + case 3: + config = _context.sent; + if (!config) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]);else { + datas = Object(_tools_url_js__WEBPACK_IMPORTED_MODULE_4__["getUrlParams"])(); + + if (datas && datas.t !== undefined) { + xhr = new XMLHttpRequest(); + xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.userRoutes + config.unsubscribeRoute + datas.t); + + xhr.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var response = JSON.parse(this.responseText); + if (this.status === 200 && response.message != undefined) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", response.message.replace("#URL", configFrontEnd.accountPage), "", ["success"]);else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txtSubscriptions.unsubscriptionFail.replace("#URL", configFrontEnd.accountPage), "", ["error"]); + } + }; + + xhr.send(); + } + } + _context.next = 10; + break; + + case 7: + _context.prev = 7; + _context.t0 = _context["catch"](0); + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]); + + case 10: + case "end": + return _context.stop(); + } + } + }, _callee, null, [[0, 7]]); + })); + + return function initialise() { + return _ref.apply(this, arguments); + }; +}(); + +initialise(); + +/***/ }) + +/******/ }); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9nZW5lcmFsJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3N1YnNjcmlwdGlvbiQiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC91c2VyJCIsIndlYnBhY2s6Ly8vLi4vbGFuZy9mci9nZW5lcmFsLmpzIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL3N1YnNjcmlwdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi4vbGFuZy9mci91c2VyLmpzIiwid2VicGFjazovLy8uLi90b29scy9tYWluLmpzIiwid2VicGFjazovLy8uLi92aWV3cyBzeW5jIF5cXC5cXC8uKlxcLmpzJCIsIndlYnBhY2s6Ly8vLi4vdmlld3MvZGVmYXVsdC9jb25maWcvZnIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2RvbS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvZXZlcnl3aGVyZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvdXJsLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy91c2Vycy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdW5zdWJzY3JpYmUuanMiXSwibmFtZXMiOlsidXNlcnMiLCJyZXF1aXJlIiwicXVlc3Rpb25uYWlyZXMiLCJtb2R1bGUiLCJleHBvcnRzIiwiYXBpVXJsIiwic2l0ZVVybCIsImFkbWluTmFtZSIsImFkbWluRW1haWwiLCJzZW5kZXJOYW1lIiwic2VuZGVyRW1haWwiLCJhZG1pbkxhbmciLCJ0aGVtZSIsImF2YWlsYWJsZUxhbmdzIiwic2l0ZU5hbWUiLCJiZWdpbkNvZGVHb2RmYXRoZXIiLCJjcm9uVGltaW5nQWxlcnRJblNlY29uZGUiLCJyZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlIiwidG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnMiLCJ0b2tlbkxvZ2luTGlua1RpbWVJbkhvdXJzIiwidG9rZW5Db25uZXhpb25NaW5UaW1lSW5Ib3VycyIsInRva2VuQ29ubmV4aW9uTWF4VGltZUluRGF5cyIsInRva2VuTG9naW5DaGFuZ2luZ1RpbWVJbkhvdXJzIiwidG9rZW5EZWxldGVVc2VyVGltZUluSG91cnMiLCJ0b2tlblVuc3Vic2NyaWJlTGlua1RpbWVJbkRheXMiLCJmcmVlQWNjb3VudFRpbWluZ0luRGF5cyIsImZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5cyIsImFjY291bnRFeHBpcmF0aW9uRmlyc3ROb3RpZmljYXRpb25JbkRheXMiLCJhY2NvdW50RXhwaXJhdGlvblNlY29uZE5vdGlmaWNhdGlvbkluRGF5cyIsImluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5cyIsIm5iUXVlc3Rpb25zTWluIiwibmJRdWVzdGlvbnNNYXgiLCJuYkNob2ljZXNNYXgiLCJuYk5ld1F1ZXN0aW9ubmFpcmVzIiwiaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlQmVnaW4iLCJob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQiLCJudW1iZXJOZXdRdWVzdGlvbm5haXJlQXRTYW1lVGltZSIsIm1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzIiwibmJJbGx1c3RyYXRpb25zTWluIiwibmJJbGx1c3RyYXRpb25zTWF4IiwibWF4SWxsdXN0cmF0aW9uU2l6ZWluT2N0ZXQiLCJtaW1lVHlwZXNGb3JJbGx1c3RyYXRpb24iLCJpbGx1c3RyYXRpb25zV2lkdGhNYXhJblB4IiwiaWxsdXN0cmF0aW9uc01pbmlhdHVyZXNXaWR0aE1heEluUHgiLCJuYkxpbmtzTWluIiwibmJMaW5rc01heCIsInBhc3N3b3JkIiwibWlubGVuZ3RoIiwiZGlyQ2FjaGVVc2VycyIsImRpckNhY2hlVXNlcnNBbnN3ZXJzIiwiZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyIsImRpckNhY2hlUXVlc3Rpb25zIiwiZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzIiwiZGlySFRNTFF1ZXN0aW9ubmFpcmUiLCJkaXJXZWJRdWVzdGlvbm5haXJlIiwicXVlc3Rpb25uYWlyZVJvdXRlcyIsImdldFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlcyIsInB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJzYXZlQW5zd2Vyc1JvdXRlIiwiZ2V0U3RhdHNRdWVzdGlvbm5haXJlcyIsInNlYXJjaFF1ZXN0aW9ubmFpcmVzUm91dGUiLCJzZWFyY2hBZG1pblF1ZXN0aW9ubmFpcmVzUm91dGUiLCJnZXRMaXN0TmV4dFF1ZXN0aW9ubmFpcmVzIiwicXVlc3Rpb25zUm91dGUiLCJ0YWdzU2VhcmNoUm91dGUiLCJnZXRRdWVzdGlvbm5haXJlc1dpdGhvdXRBbnN3ZXIiLCJnZXRQcmV2aW91c0Fuc3dlcnMiLCJnZXRTdGF0c0Fuc3dlcnMiLCJnZXRBZG1pblN0YXRzIiwiUXVlc3Rpb25uYWlyZSIsInRpdGxlIiwibWF4bGVuZ3RoIiwicmVxdWlyZWQiLCJzbHVnIiwiaW50cm9kdWN0aW9uIiwic2VhcmNoUXVlc3Rpb25uYWlyZXMiLCJRdWVzdGlvbiIsInRleHQiLCJyYW5rIiwibWluIiwiZGVmYXVsdFZhbHVlIiwiQ2hvaWNlIiwibmJUYWdzTWluIiwibmJUYWdzTWF4IiwiZGlyQ2FjaGVUYWdzIiwiZGlySFRNTFRhZ3MiLCJkaXJXZWJUYWdzIiwidXNlclJvdXRlcyIsInN1YnNjcmliZVJvdXRlIiwiZ2V0R29kZmF0aGVyUm91dGUiLCJjaGVja0lmSXNFbWFpbGZyZWVSb3V0ZSIsImNoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZSIsImNoZWNrTG9naW5Sb3V0ZSIsImNvbm5lY3Rpb25Sb3V0ZSIsImdldExvZ2luTGlua1JvdXRlIiwiY29ubmVjdGlvbldpdGhMaW5rUm91dGUiLCJnZXRVc2VySW5mb3MiLCJjcmVhdGVVc2VyUm91dGUiLCJ2YWxpZGF0ZVVzZXJSb3V0ZSIsInVwZGF0ZVVzZXJJbmZvcyIsInNlYXJjaFVzZXJSb3V0ZSIsImdldEdvZENoaWxkcyIsImNoZWNrTmV3TG9naW5MaW5rUm91dGUiLCJjaGVja0RlbGV0ZUxpbmtSb3V0ZSIsImdldFBheW1lbnRzIiwidW5zdWJzY3JpYmVSb3V0ZSIsIm5hbWUiLCJlbWFpbCIsIm5ld1Bhc3N3b3JkIiwiY29kZUdvZGZhdGhlciIsImNndU9rIiwidmFsdWUiLCJ0aW1lRGlmZmVyZW5jZU1pbiIsInRpbWVEaWZmZXJlbmNlTWF4Iiwic2l0ZUhUTUxUaXRsZSIsInNpdGVNZXRhRGVzY3JpcHRpb24iLCJzY3JpcHRUaW1pbmdJbmZvIiwic2NyaXB0VGltaW5nQWxlcnQiLCJzZXJ2ZXJFcnJvciIsInNlcnZlckVycm9yQWRtaW4iLCJuZWVkZWRQYXJhbXMiLCJiYWRVcmwiLCJub3RWYWxpZEZvcm1hdCIsIm5vdEFsbG93ZWQiLCJub3RSZXF1aXJlZCIsInVwZGF0ZUJ0blR4dCIsImFkZEJ0blR4dCIsImRlbGV0ZUJ0blR4dCIsImFkZE9rTWVzc2FnZSIsInVwZGF0ZU9rTWVzc2FnZSIsImRlbGV0ZU9rTWVzc2FnZSIsImZhaWxBdXRoIiwiZmFpbEF1dGhIZWFkZXIiLCJmYWlsQXV0aFRva2VuIiwiZmFpbEF1dGhJZCIsImZhaWxBdXRoQ3JvbiIsInByZXZpb3VzUGFnZSIsIm5leHRQYWdlIiwiYnRuTGlua1RvUXVlc3Rpb25uYWlyZSIsInN0YXRzQWRtaW4iLCJuZWVkTnVtYmVyT2ZEYXlzIiwibmVlZEludGVnZXJOdW1iZXJPZkRheXMiLCJuZWVkTWluTnVtYmVyT2ZEYXlzIiwibmVlZE5vdFRvb0xvbmdEYXlzTGlzdCIsIm5lZWRWYWxpZERheXNMaXN0IiwibmVlZFVuaXF1ZURheXNMaXN0IiwibmVlZEtub3dJZk5vdGljZU9rIiwidW5zdWJzY3JpcHRpb25PayIsInVuc3Vic2NyaXB0aW9uRmFpbCIsImFsbFN1YnNjcmlwdGlvblByb2Nlc3NlZCIsIm1haWxOZXdRdWVzdGlvbm5haXJlU3ViamVjdCIsIm1haWxOZXdRdWVzdGlvbm5haXJlQm9keVR4dCIsIm1haWxOZXdRdWVzdGlvbm5haXJlQm9keUhUTUwiLCJub05ld1F1ZXN0aW9ubmFpcmVGb3JVc2VyIiwibWFpbEVuZEZyZWVUaW1lU3ViamVjdCIsIm1haWxFbmRGcmVlVGltZUJvZHlUeHQiLCJtYWlsRW5kRnJlZVRpbWVCb2R5SFRNTCIsIm1haWxFbmRGcmVlVGltZU1lc3NhZ2UiLCJtYWlsRXhwaXJhdGlvblN1YmplY3QiLCJtYWlsRXhwaXJhdGlvbkJvZHlUeHQiLCJtYWlsRXhwaXJhdGlvbkJvZHlIVE1MIiwibWFpbEV4cGlyYXRpb25NZXNzYWdlIiwiaW5mb3NOYkRheXMiLCJpbmZvc0V4cGlyYXRlZCIsImluZm9zTmJEYXlzQWRtaW4iLCJpbmZvc0V4cGlyYXRlZEFkbWluIiwiaXNOb3RWYWxpZGVkIiwiaW5mb3NQYXltZW50c0FkbWluIiwibm90Rm91bmQiLCJuZWVkTmFtZSIsIm5lZWROb3RUb29Mb25nTmFtZSIsIm5lZWRFbWFpbCIsIm5lZWRVbmlxdWVFbWFpbCIsIm5lZWROb3RUb29Mb25nRW1haWwiLCJuZWVkUGFzc1dvcmQiLCJuZWVkTG9uZ1Bhc3NXb3JkIiwicGFzc3dvcmRDb3BpZWQiLCJuZWVkU3RhdHVzIiwibmVlZExhbmd1YWdlIiwibmVlZFZhbGlkTGFzdENvbm5lY3Rpb25EYXRlIiwibmVlZFNNVFAiLCJuZWVkU01UUE5vdEZvdW5kIiwibmVlZEtub3dOZXdzbGV0dGVyT2siLCJuZWVkVGltZURpZmZlcmVuY2UiLCJuZWVkTWluVGltZURpZmZlcmVuY2UiLCJuZWVkTWF4VGltZURpZmZlcmVuY2UiLCJuZWVkVUdDT2siLCJnb2RmYXRoZXJOb3RGb3VuZCIsImdvZGZhdGhlckZvdW5kIiwibWFpbFZhbGlkYXRpb25NZXNzYWdlIiwibWFpbFZhbGlkYXRpb25MaW5rU3ViamVjdCIsIm1haWxWYWxpZGF0aW9uTGlua1NCb2R5VHh0IiwibWFpbFZhbGlkYXRpb25MaW5rU0JvZHlIVE1MIiwidmFsaWRhdGlvbk1lc3NhZ2UiLCJ2YWxpZGF0aW9uTWVzc2FnZUFkbWluIiwidmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlIiwidmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlQWRtaW4iLCJtYWlsV2VsY29tZVN1YmplY3QiLCJtYWlsV2VsY29tZUJvZHlUeHQiLCJtYWlsV2VsY29tZUJvZHlIVE1MIiwibWFpbFRoYW5rR29kZmF0aGVyU3ViamVjdCIsIm1haWxUaGFua0dvZGZhdGhlckJvZHlUeHQiLCJtYWlsVGhhbmtHb2RmYXRoZXJCb2R5SFRNTCIsImJhZExpbmtWYWxpZGF0aW9uTWVzc2FnZSIsImVtYWlsTm90Rm91bmQiLCJhbHJlYWR5Q29ubmVjdGVkIiwibmVlZEJlQ29ubmVjdGVkIiwiY29ubmVjdGlvbk9rIiwibmVlZENob29zZUxvZ2luV2F5IiwibmVlZFZhbGlkYXRpb25Ub0xvZ2luIiwidG9vTWFueUxvZ2luRmFpbHMiLCJiYWRQYXNzd29yZCIsIm1haWxMb2dpbkxpbmtTdWJqZWN0IiwibWFpbExvZ2luTGlua0JvZHlUeHQiLCJtYWlsTG9naW5MaW5rQm9keUhUTUwiLCJtYWlsTG9naW5MaW5rTWVzc2FnZSIsInVwZGF0ZWRPa01lc3NhZ2UiLCJ1cGRhdGVkTmVlZEdvb2RFbWFpbCIsInVwZGF0ZWROZWVkVW5pcXVlRW1haWwiLCJtYWlsVXBkYXRlTG9naW5TdWJqZWN0IiwibWFpbFVwZGF0ZUxvZ2luQm9keVR4dCIsIm1haWxVcGRhdGVMb2dpbkJvZHlIVE1MIiwibWFpbFVwZGF0ZUxvZ2luTGlua01lc3NhZ2UiLCJ1cGRhdGVkTmVlZFZhbGlkYXRlZFVzZXIiLCJ1cGRhdGVkTmVlZEdvb2RHb2RmYXRoZXIiLCJtYWlsVXBkYXRlTG9naW5Pa01lc3NhZ2UiLCJ1cGRhdGVkRmFpbGVkR29kZmF0aGVyTm90Rm91bmQiLCJjcmVhdGlvbk9rTWVzc2FnZSIsIm1haWxEZWxldGVTdWJqZWN0IiwibWFpbERlbGV0ZUJvZHlUeHQiLCJtYWlsRGVsZXRlQm9keUhUTUwiLCJtYWlsRGVsZXRlTGlua01lc3NhZ2UiLCJkZWxldGVGYWlsTWVzc2FnZSIsIm1haWxEZWxldGVMaW5rT2tNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtBbHJlYWR5TWVzc2FnZSIsIm1haWxEZWxldGVMaW5rRmFpbE1lc3NhZ2UiLCJjcm9uRGVsZXRlVW52YWxpZGVkVXNlcnNNZXNzYWdlIiwiZGVsZXRlSW5hY3RpdmVVc2Vyc01lc3NhZ2UiLCJ3ZWxjb21lTWVzc2FnZSIsImJ5ZWJ5ZU1lc3NhZ2UiLCJpbmZvc1VzZXJGb3JBZG1pbiIsImluZm9zQWRtaW5Hb2RmYXRoZXIiLCJpbmZvc0FkbWluTmJHb2RDaGlsZHMiLCJUb29sIiwibXlWYXIiLCJ1bmRlZmluZWQiLCJ0cmltIiwibXlTdHJpbmciLCJpc0VtcHR5IiwibWF4IiwibGVuZ3RoIiwic3Vic3RyaW5nIiwibWFwT2JqIiwicmVwbGFjZUVsdHMiLCJSZWdFeHAiLCJPYmplY3QiLCJrZXlzIiwiam9pbiIsInJlcGxhY2UiLCJtYXRjaGVkIiwiTWF0aCIsImNlaWwiLCJmbG9vciIsInJhbmRvbSIsImRhdGVTdHJpbmciLCJsYW5nIiwibXlEYXRlIiwiRGF0ZSIsIm15RGF5IiwiZ2V0RGF0ZSIsIm15TW91bnRoIiwiZ2V0TW9udGgiLCJteVllYXIiLCJnZXRGdWxsWWVhciIsImhlYWRMaW5rcyIsImFuY2hvciIsImF0dHJpYnV0ZXMiLCJocmVmIiwiaWQiLCJmb290TGlua3MiLCJyZWwiLCJtYXhRdWVzdGlvbm5haXJlc0J5UGFnZSIsInVzZXJIb21lUGFnZSIsImFkbWluSG9tZVBhZ2UiLCJtYW5hZ2VySG9tZVBhZ2UiLCJzdWJzY3JpYmVQYWdlIiwiY29ubmVjdGlvblBhZ2UiLCJhY2NvdW50UGFnZSIsInF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2UiLCJ1c2Vyc01hbmFnZW1lbnRQYWdlIiwibmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSIsImlsbHVzdHJhdGlvbkRpciIsInNpdGVTbG9nYW4iLCJob21lVGl0bGUxIiwiaG9tZVAxIiwiaG9tZVRpdGxlMiIsImhvbWVQMiIsIm5ld1F1ZXN0aW9ubmFpcmVzVGl0bGUiLCJuZXdRdWVzdGlvbm5haXJlc0ludHJvIiwiZXhwbGFuYXRpb25UaXRsZSIsImV4cGxhbmF0aW9uVHh0Iiwibm9KU05vdGlmaWNhdGlvbiIsInNhdmVMb2NhbHkiLCJkYXRhIiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsIkpTT04iLCJzdHJpbmdpZnkiLCJnZXRMb2NhbHkiLCJqc29uIiwicGFyc2UiLCJnZXRJdGVtIiwicmVtb3ZlTG9jYWx5IiwicmVtb3ZlSXRlbSIsImFkZEVsZW1lbnQiLCJlbHRQYXJlbnQiLCJlbHRUeXBlIiwiZWx0Q29udGVudCIsImVsdElkIiwiZWx0Q2xhc3MiLCJlbHRBdHRyaWJ1dGVzIiwibmV3RWxlbWVudCIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsIkFycmF5IiwiaXNBcnJheSIsImkiLCJjbGFzc0xpc3QiLCJhZGQiLCJhdHRyaWJ1dE5hbWUiLCJzZXRBdHRyaWJ1dGUiLCJpbm5lckhUTUwiLCJhcHBlbmRDaGlsZCIsImhlbGxvRGV2IiwiY29uc29sZSIsImxvZyIsInVwZGF0ZUFjY291bnRMaW5rIiwic3RhdHVzIiwiY29uZmlnVGVtcGxhdGUiLCJsaW5rIiwiZ2V0RWxlbWVudEJ5SWQiLCJob21lUGFnZSIsImdldFVybFBhcmFtcyIsImxvY2F0aW9uIiwic2VhcmNoIiwicGFyYW1ldGVycyIsInNwbGl0IiwicGFyYW0iLCJkYXRhcyIsImRlY29kZVVSSSIsImdldENvbmZpZyIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwieGhyIiwiWE1MSHR0cFJlcXVlc3QiLCJvcGVuIiwib25sb2FkIiwicmVzcG9uc2VUZXh0Iiwib25lcnJvciIsInN0YXR1c1RleHQiLCJzZW5kIiwiZ2V0VGltZURpZmZlcmVuY2UiLCJ0aW1lTG9jYWwiLCJnZXRUaW1lem9uZU9mZnNldCIsImdldFBhc3N3b3JkIiwibmJDYXJNaW4iLCJuYkNhck1heCIsIm5iQ2FyIiwibGV0dGVycyIsIm90aGVycyIsInNldFNlc3Npb24iLCJ1c2VySWQiLCJ0b2tlbiIsImR1cmF0aW9uVFMiLCJzdG9yYWdlVXNlciIsImR1cmF0aW9uIiwiY2hlY2tBbnN3ZXJEYXRhcyIsImxhc3RBbnN3ZXIiLCJhbnN3ZXIiLCJuYkNvcnJlY3RBbnN3ZXJzIiwiUXVlc3Rpb25uYWlyZUlkIiwibmJRdWVzdGlvbnMiLCJjaGVja1Nlc3Npb24iLCJ1cmxSZWRpcmVjdGlvbiIsIm1lc3NhZ2UiLCJ1cmxXYW50ZWQiLCJ1c2VyRGF0YXMiLCJyZWRpcmVjdFVzZXIiLCJ1c2VyIiwibm93IiwicmVzcG9uc2UiLCJpc1ZhbGlkIiwibGFuZ3VhZ2UiLCJ0aW1lRGlmZmVyZW5jZSIsIm5iRGF5c09rIiwidXJsQWNjb3VudCIsIndpbmRvdyIsImluZGV4T2YiLCJhc3NpZ24iLCJjb25maWdGcm9udEVuZCIsInR4dCIsInR4dFVzZXJzIiwidHh0U3Vic2NyaXB0aW9ucyIsImRpdlJlc3BvbnNlIiwiY29uZmlnIiwiaW5pdGlhbGlzZSIsInQiLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJyZWFkeVN0YXRlIiwiRE9ORSJdLCJtYXBwaW5ncyI6IjtRQUFBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBOzs7UUFHQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMENBQTBDLGdDQUFnQztRQUMxRTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLHdEQUF3RCxrQkFBa0I7UUFDMUU7UUFDQSxpREFBaUQsY0FBYztRQUMvRDs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EseUNBQXlDLGlDQUFpQztRQUMxRSxnSEFBZ0gsbUJBQW1CLEVBQUU7UUFDckk7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwyQkFBMkIsMEJBQTBCLEVBQUU7UUFDdkQsaUNBQWlDLGVBQWU7UUFDaEQ7UUFDQTtRQUNBOztRQUVBO1FBQ0Esc0RBQXNELCtEQUErRDs7UUFFckg7UUFDQTs7O1FBR0E7UUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ2xGQSxJQUFNQSxLQUFLLEdBQUdDLG1CQUFPLENBQUMsbUNBQUQsQ0FBckI7O0FBQ0EsSUFBTUMsY0FBYyxHQUFHRCxtQkFBTyxDQUFDLHFEQUFELENBQTlCOztBQUVBRSxNQUFNLENBQUNDLE9BQVA7QUFFSUMsUUFBTSxFQUFFLDJCQUZaO0FBR0lDLFNBQU8sRUFBRSx1QkFIYjtBQUlJQyxXQUFTLEVBQUUsU0FKZjtBQUtJQyxZQUFVLEVBQUUsbUJBTGhCO0FBTUlDLFlBQVUsRUFBRSxXQU5oQjtBQU9JQyxhQUFXLEVBQUUsdUJBUGpCO0FBUUlDLFdBQVMsRUFBRSxJQVJmO0FBU0lDLE9BQUssRUFBRSxTQVRYO0FBU3NCO0FBQ2xCQyxnQkFBYyxFQUFFLENBQUMsSUFBRCxDQVZwQjtBQVUyQjtBQUN2QkMsVUFBUSxFQUFFLFdBWGQ7QUFZSUMsb0JBQWtCLEVBQUUsV0FaeEI7QUFZcUM7QUFDakNDLDBCQUF3QixFQUFFLEdBYjlCO0FBYW1DO0FBQy9CQyw4QkFBNEIsRUFBRSxDQWRsQztBQWNxQztBQUNqQ0Msa0NBQWdDLEVBQUUsS0FmdEM7QUFlNkM7QUFDekNDLDJCQUF5QixFQUFFLElBaEIvQjtBQWlCSUMsOEJBQTRCLEVBQUUsS0FqQmxDO0FBa0JJQyw2QkFBMkIsRUFBRSxVQWxCakM7QUFtQklDLCtCQUE2QixFQUFFLElBbkJuQztBQW1Cd0M7QUFDcENDLDRCQUEwQixFQUFFLElBcEJoQztBQXFCSUMsZ0NBQThCLEVBQUUsUUFyQnBDO0FBcUI4QztBQUMxQ0MseUJBQXVCLEVBQUUsRUF0QjdCO0FBdUJJQyx5Q0FBdUMsRUFBRSxDQXZCN0M7QUF3QklDLDBDQUF3QyxFQUFFLEVBeEI5QztBQXlCSUMsMkNBQXlDLEVBQUUsQ0F6Qi9DO0FBMEJJQyxtQ0FBaUMsRUFBRSxHQTFCdkM7QUEyQkk7QUFDQUMsZ0JBQWMsRUFBRSxDQTVCcEI7QUE0QnVCO0FBQ25CQyxnQkFBYyxFQUFFLEVBN0JwQjtBQTZCd0I7QUFDcEJDLGNBQVksRUFBRSxFQTlCbEI7QUErQklDLHFCQUFtQixFQUFFLEVBL0J6QjtBQStCNEI7QUFDeEJDLCtCQUE2QixFQUFDLENBaENsQztBQWdDcUM7QUFDakNDLDZCQUEyQixFQUFDLEVBakNoQztBQWlDb0M7QUFDaENDLGtDQUFnQyxFQUFFLEVBbEN0QztBQWtDMEM7QUFDdENDLHlCQUF1QixFQUFFLENBbkM3QjtBQW9DSTtBQUNBQyxvQkFBa0IsRUFBRSxDQXJDeEI7QUFzQ0lDLG9CQUFrQixFQUFFLENBdEN4QjtBQXVDSUMsNEJBQTBCLEVBQUUsT0F2Q2hDO0FBdUN3QztBQUNwQ0MsMEJBQXdCLEVBQUUsQ0FBRSxXQUFGLEVBQWUsWUFBZixFQUE2QixXQUE3QixFQUEwQyxXQUExQyxFQUF1RCxXQUF2RCxDQXhDOUI7QUF5Q0k7QUFDQUMsMkJBQXlCLEVBQUUsR0ExQy9CO0FBMkNJQyxxQ0FBbUMsRUFBRSxHQTNDekM7QUE0Q0k7QUFDQUMsWUFBVSxFQUFFLENBN0NoQjtBQThDSUMsWUFBVSxFQUFFO0FBOUNoQixzREFnRG9CM0MsY0FBYyxDQUFDNEIsY0FoRG5DLHNEQWlEb0I1QixjQUFjLENBQUM2QixjQWpEbkMsb0RBa0RrQjdCLGNBQWMsQ0FBQzhCLFlBbERqQyx5REFtRHVCaEMsS0FBSyxDQUFDOEMsUUFBTixDQUFlQyxTQW5EdEMscURBb0RtQi9DLEtBQUssQ0FBQ2dELGFBcER6Qiw0REFxRDBCaEQsS0FBSyxDQUFDaUQsb0JBckRoQyw4REFzRDRCL0MsY0FBYyxDQUFDZ0Qsc0JBdEQzQyx5REF1RHVCaEQsY0FBYyxDQUFDaUQsaUJBdkR0QyxtRUF3RGlDakQsY0FBYyxDQUFDa0QsMkJBeERoRCw0REF5RDBCbEQsY0FBYyxDQUFDbUQsb0JBekR6QywyREEwRHlCbkQsY0FBYyxDQUFDb0QsbUJBMUR4QyxvQjs7Ozs7Ozs7Ozs7QUNIQW5ELE1BQU0sQ0FBQ0MsT0FBUCxHQUNBO0FBQ0k7QUFDQW1ELHFCQUFtQixFQUFFLGdCQUZ6QjtBQUdJQyx3QkFBc0IsRUFBRSxNQUg1QjtBQUlJQyw0QkFBMEIsRUFBRSxVQUpoQztBQUtJQyw4QkFBNEIsRUFBRSxRQUxsQztBQU1JQyxrQkFBZ0IsRUFBRSxVQU50QjtBQU9JQyx3QkFBc0IsRUFBRyxTQVA3QjtBQVFJQywyQkFBeUIsRUFBRyxTQVJoQztBQVNJQyxnQ0FBOEIsRUFBRyxjQVRyQztBQVVJQywyQkFBeUIsRUFBRSw2QkFWL0I7QUFXSTtBQUNBQyxnQkFBYyxFQUFFLFlBWnBCO0FBYUk7QUFDQUMsaUJBQWUsRUFBRSxlQWRyQjtBQWVJO0FBQ0FDLGdDQUE4QixFQUFFLHNCQWhCcEM7QUFpQklDLG9CQUFrQixFQUFFLGdCQWpCeEI7QUFrQklDLGlCQUFlLEVBQUcsdUJBbEJ0QjtBQW1CSUMsZUFBYSxFQUFFLGlCQW5CbkI7QUFvQkk7QUFDQUMsZUFBYSxFQUNiO0FBQ0lDLFNBQUssRUFBRTtBQUFFQyxlQUFTLEVBQUUsR0FBYjtBQUFrQkMsY0FBUSxFQUFFO0FBQTVCLEtBRFg7QUFFSUMsUUFBSSxFQUFFO0FBQUVGLGVBQVMsRUFBRTtBQUFiLEtBRlY7QUFFOEI7QUFDMUJHLGdCQUFZLEVBQUU7QUFBRUYsY0FBUSxFQUFFO0FBQVo7QUFIbEIsR0F0Qko7QUEyQklHLHNCQUFvQixFQUFHO0FBQUU3QixhQUFTLEVBQUUsQ0FBYjtBQUFnQjBCLFlBQVEsRUFBRTtBQUExQixHQTNCM0I7QUE0QklJLFVBQVEsRUFDUjtBQUNJQyxRQUFJLEVBQUU7QUFBRU4sZUFBUyxFQUFFLEdBQWI7QUFBa0JDLGNBQVEsRUFBRTtBQUE1QixLQURWO0FBRUlNLFFBQUksRUFBRTtBQUFFTixjQUFRLEVBQUUsSUFBWjtBQUFrQk8sU0FBRyxFQUFDLENBQXRCO0FBQXlCQyxrQkFBWSxFQUFDO0FBQXRDO0FBRlYsR0E3Qko7QUFpQ0lDLFFBQU0sRUFDTjtBQUNJSixRQUFJLEVBQUU7QUFBRU4sZUFBUyxFQUFFLEdBQWI7QUFBa0JDLGNBQVEsRUFBRTtBQUE1QjtBQURWLEdBbENKO0FBcUNJM0MsZ0JBQWMsRUFBRSxDQXJDcEI7QUFzQ0lDLGdCQUFjLEVBQUUsRUF0Q3BCO0FBdUNJQyxjQUFZLEVBQUUsRUF2Q2xCO0FBd0NJbUQsV0FBUyxFQUFFLENBeENmO0FBeUNJQyxXQUFTLEVBQUUsQ0F6Q2Y7QUF5Q2tCO0FBQ2Q7QUFDQWxDLHdCQUFzQixFQUFHLHNCQTNDN0I7QUE0Q0lDLG1CQUFpQixFQUFHLGdDQTVDeEI7QUE2Q0lDLDZCQUEyQixFQUFHLDRCQTdDbEM7QUE4Q0lpQyxjQUFZLEVBQUcsMkJBOUNuQjtBQStDSWhDLHNCQUFvQixFQUFHLG1CQS9DM0I7QUFnRElpQyxhQUFXLEVBQUcsb0JBaERsQjtBQWlESWhDLHFCQUFtQixFQUFHLE1BakQxQjtBQWlEaUM7QUFDN0JpQyxZQUFVLEVBQUcsT0FsRGpCLENBa0R3Qjs7QUFsRHhCLENBREEsQzs7Ozs7Ozs7Ozs7QUNBQXBGLE1BQU0sQ0FBQ0MsT0FBUCxHQUNBO0FBQ0k7QUFDQW9GLFlBQVUsRUFBRSxPQUZoQjtBQUdJQyxnQkFBYyxFQUFFLFNBSHBCO0FBSUlDLG1CQUFpQixFQUFFLGlCQUp2QjtBQUtJQyx5QkFBdUIsRUFBRSxjQUw3QjtBQU1JQywwQkFBd0IsRUFBRSxjQU45QjtBQU9JQyxpQkFBZSxFQUFFLGNBUHJCO0FBUUlDLGlCQUFlLEVBQUUsUUFSckI7QUFTSUMsbUJBQWlCLEVBQUUsZUFUdkI7QUFVSUMseUJBQXVCLEVBQUUsaUJBVjdCO0FBV0lDLGNBQVksRUFBRSxPQVhsQjtBQVlJQyxpQkFBZSxFQUFFLFNBWnJCO0FBYUlDLG1CQUFpQixFQUFFLFlBYnZCO0FBY0lDLGlCQUFlLEVBQUUsVUFkckI7QUFlSUMsaUJBQWUsRUFBRSxVQWZyQjtBQWdCSUMsY0FBWSxFQUFFLGdCQWhCbEI7QUFpQklDLHdCQUFzQixFQUFFLG1CQWpCNUI7QUFrQklDLHNCQUFvQixFQUFFLGlCQWxCMUI7QUFtQklDLGFBQVcsRUFBRSx5QkFuQmpCO0FBb0JJQyxrQkFBZ0IsRUFBRSxxQkFwQnRCO0FBcUJJckMsZUFBYSxFQUFFLGlCQXJCbkI7QUFzQkk7QUFDQXNDLE1BQUksRUFBRTtBQUFFbkMsYUFBUyxFQUFFLEVBQWI7QUFBaUJDLFlBQVEsRUFBRTtBQUEzQixHQXZCVjtBQXdCSW1DLE9BQUssRUFBRTtBQUFFcEMsYUFBUyxFQUFFLEdBQWI7QUFBa0JDLFlBQVEsRUFBRTtBQUE1QixHQXhCWDtBQXlCSTNCLFVBQVEsRUFBRTtBQUFFQyxhQUFTLEVBQUUsQ0FBYjtBQUFnQnlCLGFBQVMsRUFBQyxFQUExQjtBQUE4QkMsWUFBUSxFQUFFO0FBQXhDLEdBekJkO0FBeUI4RDtBQUMxRG9DLGFBQVcsRUFBRTtBQUFFOUQsYUFBUyxFQUFFLENBQWI7QUFBZ0J5QixhQUFTLEVBQUM7QUFBMUIsR0ExQmpCO0FBMkJJc0MsZUFBYSxFQUFFO0FBQUV0QyxhQUFTLEVBQUU7QUFBYixHQTNCbkI7QUE0Qkl1QyxPQUFLLEVBQUU7QUFBRUMsU0FBSyxFQUFFLE1BQVQ7QUFBaUJ2QyxZQUFRLEVBQUU7QUFBM0IsR0E1Qlg7QUE2Qkl3QyxtQkFBaUIsRUFBRSxDQUFDLEdBN0J4QjtBQThCSUMsbUJBQWlCLEVBQUMsR0E5QnRCO0FBK0JJO0FBQ0FsRSxlQUFhLEVBQUcsYUFoQ3BCO0FBaUNJQyxzQkFBb0IsRUFBRztBQWpDM0IsQ0FEQSxDOzs7Ozs7Ozs7OztBQ0FBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtFOzs7Ozs7Ozs7OztBQ3RCQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1RTs7Ozs7Ozs7Ozs7QUN0QkE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0Q7Ozs7Ozs7Ozs7O0FDdEJBOUMsTUFBTSxDQUFDQyxPQUFQLEdBQ0E7QUFDSStHLGVBQWEsRUFBRyxtREFEcEI7QUFFSUMscUJBQW1CLEVBQUcsdUZBRjFCO0FBR0lDLGtCQUFnQixFQUFHLHVFQUh2QjtBQUlJQyxtQkFBaUIsRUFBRyxtRUFKeEI7QUFLSUMsYUFBVyxFQUFHLDRHQUxsQjtBQU1JQyxrQkFBZ0IsRUFBRyx3QkFOdkI7QUFPSUMsY0FBWSxFQUFHLHNEQVBuQjtBQVFJQyxRQUFNLEVBQUcsK0NBUmI7QUFTSUMsZ0JBQWMsRUFBRyxvQkFUckI7QUFVSUMsWUFBVSxFQUFHLDJEQVZqQjtBQVdJQyxhQUFXLEVBQUcsYUFYbEI7QUFZSUMsY0FBWSxFQUFFLFVBWmxCO0FBYUlDLFdBQVMsRUFBRSxTQWJmO0FBY0lDLGNBQVksRUFBRSxXQWRsQjtBQWVJQyxjQUFZLEVBQUcsd0NBZm5CO0FBZ0JJQyxpQkFBZSxFQUFHLCtDQWhCdEI7QUFpQklDLGlCQUFlLEVBQUcsd0NBakJ0QjtBQWtCSUMsVUFBUSxFQUFHLDRCQWxCZjtBQW1CSUMsZ0JBQWMsRUFBRyxrQ0FuQnJCO0FBb0JJQyxlQUFhLEVBQUcsMkNBcEJwQjtBQXFCSUMsWUFBVSxFQUFHLDJCQXJCakI7QUFzQklDLGNBQVksRUFBRyxxREF0Qm5CO0FBdUJJQyxjQUFZLEVBQUcsaUJBdkJuQjtBQXdCSUMsVUFBUSxFQUFHLGVBeEJmO0FBeUJJQyx3QkFBc0IsRUFBRyxpQkF6QjdCO0FBMEJJQyxZQUFVLEVBQUc7QUExQmpCLENBREEsQzs7Ozs7Ozs7Ozs7QUNBQXpJLE1BQU0sQ0FBQ0MsT0FBUCxHQUNBO0FBQ0l5SSxrQkFBZ0IsRUFBRywrQ0FEdkI7QUFFSUMseUJBQXVCLEVBQUcsZ0VBRjlCO0FBR0lDLHFCQUFtQixFQUFHLDJEQUgxQjtBQUlJQyx3QkFBc0IsRUFBRyxxRUFKN0I7QUFLSUMsbUJBQWlCLEVBQUcsK0VBTHhCO0FBTUlDLG9CQUFrQixFQUFHLGtFQU56QjtBQU9JQyxvQkFBa0IsRUFBRyxpRkFQekI7QUFRSUMsa0JBQWdCLEVBQUcsMFBBUnZCO0FBU0lDLG9CQUFrQixFQUFHLHVMQVR6QjtBQVVJQywwQkFBd0IsRUFBRyxrREFWL0I7QUFXSUMsNkJBQTJCLEVBQUcsdUNBWGxDO0FBWUlDLDZCQUEyQixFQUFHLG1KQVpsQztBQWFJQyw4QkFBNEIsRUFBRyxnUEFibkM7QUFjSUMsMkJBQXlCLEVBQUcsc0RBZGhDO0FBZUlDLHdCQUFzQixFQUFFLHFDQWY1QjtBQWdCSUMsd0JBQXNCLEVBQUUsaU1BaEI1QjtBQWlCSUMseUJBQXVCLEVBQUUsdVBBakI3QjtBQWtCSUMsd0JBQXNCLEVBQUUscUJBbEI1QjtBQW1CSUMsdUJBQXFCLEVBQUUscUNBbkIzQjtBQW9CSUMsdUJBQXFCLEVBQUUsb0xBcEIzQjtBQXFCSUMsd0JBQXNCLEVBQUUsME5BckI1QjtBQXNCSUMsdUJBQXFCLEVBQUUsZ0dBdEIzQjtBQXVCSUMsYUFBVyxFQUFFLG1LQXZCakI7QUF3QklDLGdCQUFjLEVBQUUsZ05BeEJwQjtBQXlCSUMsa0JBQWdCLEVBQUUsaUVBekJ0QjtBQTBCSUMscUJBQW1CLEVBQUUsMEJBMUJ6QjtBQTJCSUMsY0FBWSxFQUFHLCtKQTNCbkI7QUE0QklDLG9CQUFrQixFQUFHO0FBNUJ6QixDQURBLEM7Ozs7Ozs7Ozs7O0FDQUFySyxNQUFNLENBQUNDLE9BQVAsR0FDQTtBQUNJcUssVUFBUSxFQUFFLG1DQURkO0FBRUlDLFVBQVEsRUFBRSx3Q0FGZDtBQUdJQyxvQkFBa0IsRUFBRSw4RUFIeEI7QUFJSUMsV0FBUyxFQUFFLHVDQUpmO0FBS0lDLGlCQUFlLEVBQUUscUtBTHJCO0FBTUlDLHFCQUFtQixFQUFFLDRFQU56QjtBQU9JQyxjQUFZLEVBQUcsbUNBUG5CO0FBUUlDLGtCQUFnQixFQUFHLG9FQVJ2QjtBQVNJQyxnQkFBYyxFQUFFLHlHQVRwQjtBQVVJQyxZQUFVLEVBQUcsc0JBVmpCO0FBV0lDLGNBQVksRUFBRywyQkFYbkI7QUFZSUMsNkJBQTJCLEVBQUcsaURBWmxDO0FBYUlDLFVBQVEsRUFBRyw0QkFiZjtBQWNJQyxrQkFBZ0IsRUFBRyw0QkFkdkI7QUFlSUMsc0JBQW9CLEVBQUcsOEVBZjNCO0FBZ0JJQyxvQkFBa0IsRUFBRyw2REFoQnpCO0FBaUJJQyx1QkFBcUIsRUFBRyxvRkFqQjVCO0FBa0JJQyx1QkFBcUIsRUFBRyxvRkFsQjVCO0FBbUJJQyxXQUFTLEVBQUcsK0RBbkJoQjtBQW9CSUMsbUJBQWlCLEVBQUUsdURBcEJ2QjtBQXFCSUMsZ0JBQWMsRUFBRSxtQ0FyQnBCO0FBc0JJQyx1QkFBcUIsRUFBRSxpS0F0QjNCO0FBdUJJQywyQkFBeUIsRUFBRywrQkF2QmhDO0FBd0JJQyw0QkFBMEIsRUFBRyxnSEF4QmpDO0FBeUJJQyw2QkFBMkIsRUFBRyx5SkF6QmxDO0FBMEJJQyxtQkFBaUIsRUFBRSwrSUExQnZCO0FBMkJJQyx3QkFBc0IsRUFBRSw4QkEzQjVCO0FBNEJJQywwQkFBd0IsRUFBRSxtREE1QjlCO0FBNkJJQywrQkFBNkIsRUFBRSw4QkE3Qm5DO0FBOEJJQyxvQkFBa0IsRUFBRyxhQTlCekI7QUErQklDLG9CQUFrQixFQUFHLGdHQS9CekI7QUFnQ0lDLHFCQUFtQixFQUFHLG1IQWhDMUI7QUFpQ0lDLDJCQUF5QixFQUFHLFNBakNoQztBQWtDSUMsMkJBQXlCLEVBQUcsd0hBbENoQztBQW1DSUMsNEJBQTBCLEVBQUcsMklBbkNqQztBQW9DSUMsMEJBQXdCLEVBQUUsNklBcEM5QjtBQXFDSUMsZUFBYSxFQUFFLHFEQXJDbkI7QUFzQ0lDLGtCQUFnQixFQUFFLHNDQXRDdEI7QUF1Q0lDLGlCQUFlLEVBQUUsd0RBdkNyQjtBQXdDSUMsY0FBWSxFQUFFLG9CQXhDbEI7QUF5Q0lDLG9CQUFrQixFQUFFLDZIQXpDeEI7QUEwQ0lDLHVCQUFxQixFQUFHLCtIQTFDNUI7QUEyQ0lDLG1CQUFpQixFQUFHLHVJQTNDeEI7QUE0Q0lDLGFBQVcsRUFBRSxtQ0E1Q2pCO0FBNkNJQyxzQkFBb0IsRUFBRywwQkE3QzNCO0FBOENJQyxzQkFBb0IsRUFBRyw0R0E5QzNCO0FBK0NJQyx1QkFBcUIsRUFBRyx5SkEvQzVCO0FBZ0RJQyxzQkFBb0IsRUFBRyx1SUFoRDNCO0FBaURJQyxrQkFBZ0IsRUFBRSw2Q0FqRHRCO0FBa0RJQyxzQkFBb0IsRUFBRyw4RkFsRDNCO0FBbURJQyx3QkFBc0IsRUFBRyw4SEFuRDdCO0FBb0RJQyx3QkFBc0IsRUFBRyw2Q0FwRDdCO0FBcURJQyx3QkFBc0IsRUFBRyw4SEFyRDdCO0FBc0RJQyx5QkFBdUIsRUFBRywwSUF0RDlCO0FBdURJQyw0QkFBMEIsRUFBRSw4U0F2RGhDO0FBd0RJQywwQkFBd0IsRUFBRSxpR0F4RDlCO0FBeURJQywwQkFBd0IsRUFBRywrSEF6RC9CO0FBMERJQywwQkFBd0IsRUFBRSw0REExRDlCO0FBMkRJQyxnQ0FBOEIsRUFBRyx5RUEzRHJDO0FBNERJQyxtQkFBaUIsRUFBRSw4Q0E1RHZCO0FBNkRJQyxtQkFBaUIsRUFBRywyQ0E3RHhCO0FBOERJQyxtQkFBaUIsRUFBRyxzSEE5RHhCO0FBK0RJQyxvQkFBa0IsRUFBRyxrSUEvRHpCO0FBZ0VJQyx1QkFBcUIsRUFBRSx3SkFoRTNCO0FBaUVJckcsaUJBQWUsRUFBRSxvQ0FqRXJCO0FBa0VJc0csbUJBQWlCLEVBQUUseURBbEV2QjtBQW1FSUMseUJBQXVCLEVBQUUsdUVBbkU3QjtBQW9FSUMsOEJBQTRCLEVBQUUscUVBcEVsQztBQXFFSUMsMkJBQXlCLEVBQUUsNEVBckUvQjtBQXNFSUMsaUNBQStCLEVBQUUsc0RBdEVyQztBQXVFSUMsNEJBQTBCLEVBQUUsbURBdkVoQztBQXdFSUMsZ0JBQWMsRUFBRSxtQkF4RXBCO0FBeUVJQyxlQUFhLEVBQUUsMkZBekVuQjtBQTBFSUMsbUJBQWlCLEVBQUUsZ0xBMUV2QjtBQTJFSUMscUJBQW1CLEVBQUUscUNBM0V6QjtBQTRFSUMsdUJBQXFCLEVBQUU7QUE1RTNCLENBREEsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNBQTtJQUVNQyxJOzs7Ozs7OzRCQUVhQyxLLEVBQ2Y7QUFDSSxVQUFHQSxLQUFLLEtBQUdDLFNBQVIsSUFBcUJELEtBQUssS0FBRyxJQUFoQyxFQUNJLE9BQU8sSUFBUCxDQURKLEtBR0E7QUFDSUEsYUFBSyxJQUFFLEVBQVAsQ0FESixDQUNjOztBQUNWQSxhQUFLLEdBQUNBLEtBQUssQ0FBQ0UsSUFBTixFQUFOO0FBQ0EsWUFBR0YsS0FBSyxLQUFHLEVBQVgsRUFDSSxPQUFPLElBQVAsQ0FESixLQUdJLE9BQU8sS0FBUDtBQUNQO0FBQ0o7OztrQ0FFb0JHLFEsRUFDckI7QUFDSSxVQUFHSixJQUFJLENBQUNLLE9BQUwsQ0FBYUQsUUFBYixDQUFILEVBQ0lBLFFBQVEsR0FBQyxJQUFULENBREosS0FHQTtBQUNJQSxnQkFBUSxJQUFFLEVBQVYsQ0FESixDQUNpQjs7QUFDYkEsZ0JBQVEsR0FBQ0EsUUFBUSxDQUFDRCxJQUFULEVBQVQ7QUFDSDtBQUNELGFBQU9DLFFBQVA7QUFDSDs7O3dDQUcwQkEsUSxFQUFVRSxHLEVBQ3JDO0FBQ0lGLGNBQVEsSUFBRSxFQUFWLENBREosQ0FDaUI7O0FBQ2QsVUFBR0EsUUFBUSxDQUFDRyxNQUFULEdBQWtCRCxHQUFyQixFQUNLRixRQUFRLEdBQUNBLFFBQVEsQ0FBQ0ksU0FBVCxDQUFtQixDQUFuQixFQUF1QkYsR0FBRyxHQUFDLENBQTNCLElBQStCLEtBQXhDO0FBQ0osYUFBT0YsUUFBUDtBQUNILEssQ0FFRDs7OzsrQkFDa0JBLFEsRUFBVUssTSxFQUM1QjtBQUNJLFVBQU1DLFdBQVcsR0FBRyxJQUFJQyxNQUFKLENBQVdDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZSixNQUFaLEVBQW9CSyxJQUFwQixDQUF5QixHQUF6QixDQUFYLEVBQXlDLElBQXpDLENBQXBCO0FBQ0EsYUFBT1YsUUFBUSxDQUFDVyxPQUFULENBQWlCTCxXQUFqQixFQUE4QixVQUFDTSxPQUFELEVBQ3JDO0FBQ0ksZUFBT1AsTUFBTSxDQUFDTyxPQUFELENBQWI7QUFDSCxPQUhNLENBQVA7QUFJSCxLLENBRUQ7Ozs7aUNBQ29CcEwsRyxFQUFLMEssRyxFQUN6QjtBQUNJMUssU0FBRyxHQUFHcUwsSUFBSSxDQUFDQyxJQUFMLENBQVV0TCxHQUFWLENBQU47QUFDQTBLLFNBQUcsR0FBR1csSUFBSSxDQUFDRSxLQUFMLENBQVdiLEdBQVgsQ0FBTjtBQUNBLGFBQU9XLElBQUksQ0FBQ0UsS0FBTCxDQUFXRixJQUFJLENBQUNHLE1BQUwsTUFBaUJkLEdBQUcsR0FBRzFLLEdBQXZCLENBQVgsSUFBMENBLEdBQWpEO0FBQ0gsSyxDQUVEOzs7OytCQUNrQnlMLFUsRUFDbEI7QUFBQSxVQUQ4QkMsSUFDOUIsdUVBRG1DLElBQ25DO0FBQ0ksVUFBR3RCLElBQUksQ0FBQ0ssT0FBTCxDQUFhZ0IsVUFBYixDQUFILEVBQ0ksT0FBTyxFQUFQO0FBQ0osVUFBSUUsTUFBTSxHQUFDLElBQUlDLElBQUosQ0FBU0gsVUFBVCxDQUFYO0FBQ0EsVUFBSUksS0FBSyxHQUFDRixNQUFNLENBQUNHLE9BQVAsS0FBaUIsRUFBM0I7QUFDQSxVQUFHRCxLQUFLLENBQUNsQixNQUFOLEtBQWUsQ0FBbEIsRUFDSWtCLEtBQUssR0FBQyxNQUFJQSxLQUFWO0FBQ0osVUFBSUUsUUFBUSxHQUFFSixNQUFNLENBQUNLLFFBQVAsS0FBa0IsQ0FBbkIsR0FBc0IsRUFBbkM7QUFDQSxVQUFHRCxRQUFRLENBQUNwQixNQUFULEtBQWtCLENBQXJCLEVBQ0lvQixRQUFRLEdBQUMsTUFBSUEsUUFBYjtBQUNKLFVBQUlFLE1BQU0sR0FBQ04sTUFBTSxDQUFDTyxXQUFQLEVBQVg7QUFDQSxVQUFHUixJQUFJLEtBQUcsSUFBVixFQUNJLE9BQU9HLEtBQUssR0FBQyxHQUFOLEdBQVVFLFFBQVYsR0FBbUIsR0FBbkIsR0FBdUJFLE1BQTlCLENBREosS0FFSyxJQUFJUCxJQUFJLEtBQUcsTUFBWCxFQUFrQjtBQUNuQixlQUFPTyxNQUFNLEdBQUMsR0FBUCxHQUFXRixRQUFYLEdBQW9CLEdBQXBCLEdBQXdCRixLQUEvQixDQURDLEtBR0QsT0FBT0UsUUFBUSxHQUFDLEdBQVQsR0FBYUYsS0FBYixHQUFtQixHQUFuQixHQUF1QkksTUFBOUI7QUFDUDs7Ozs7O0FBR0w5USxNQUFNLENBQUNDLE9BQVAsR0FBaUJnUCxJQUFqQixDOzs7Ozs7Ozs7OztBQ2hGQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4RDs7Ozs7Ozs7Ozs7QUN0QkFqUCxNQUFNLENBQUNDLE9BQVAsR0FDQTtBQUNJK1EsV0FBUyxFQUNULENBQ0k7QUFBRUMsVUFBTSxFQUFFLFNBQVY7QUFBcUJDLGNBQVUsRUFBRTtBQUFFQyxVQUFJLEVBQUM7QUFBUDtBQUFqQyxHQURKLEVBRUk7QUFBRUYsVUFBTSxFQUFFLFlBQVY7QUFBd0JDLGNBQVUsRUFBRTtBQUFFQyxVQUFJLEVBQUMsZ0JBQVA7QUFBeUJDLFFBQUUsRUFBRTtBQUE3QjtBQUFwQyxHQUZKLEVBR0k7QUFBRUgsVUFBTSxFQUFFLFVBQVY7QUFBc0JDLGNBQVUsRUFBRTtBQUFFQyxVQUFJLEVBQUM7QUFBUDtBQUFsQyxHQUhKLEVBSUk7QUFBRUYsVUFBTSxFQUFFLFNBQVY7QUFBcUJDLGNBQVUsRUFBRTtBQUFFQyxVQUFJLEVBQUM7QUFBUDtBQUFqQyxHQUpKLENBRko7QUFRSUUsV0FBUyxFQUNULENBQ0k7QUFBRUosVUFBTSxFQUFFLFNBQVY7QUFBcUJDLGNBQVUsRUFBRTtBQUFFQyxVQUFJLEVBQUM7QUFBUDtBQUFqQyxHQURKLEVBRUk7QUFBRUYsVUFBTSxFQUFFLGtCQUFWO0FBQThCQyxjQUFVLEVBQUU7QUFBRUMsVUFBSSxFQUFDLHdCQUFQO0FBQWlDRyxTQUFHLEVBQUU7QUFBdEM7QUFBMUMsR0FGSixFQUdJO0FBQUVMLFVBQU0sRUFBRSxzQkFBVjtBQUFrQ0MsY0FBVSxFQUFFO0FBQUVDLFVBQUksRUFBQztBQUFQO0FBQTlDLEdBSEosRUFJSTtBQUFFRixVQUFNLEVBQUUsUUFBVjtBQUFvQkMsY0FBVSxFQUFFO0FBQUVDLFVBQUksRUFBQyxXQUFQO0FBQW9CRyxTQUFHLEVBQUU7QUFBekI7QUFBaEMsR0FKSixFQUtJO0FBQUVMLFVBQU0sRUFBRSxRQUFWO0FBQW9CQyxjQUFVLEVBQUU7QUFBRUMsVUFBSSxFQUFDLFdBQVA7QUFBb0JHLFNBQUcsRUFBRTtBQUF6QjtBQUFoQyxHQUxKLENBVEo7QUFnQklDLHlCQUF1QixFQUFFLEVBaEI3QjtBQWlCSUMsY0FBWSxFQUFHLGNBakJuQjtBQWtCSUMsZUFBYSxFQUFHLFlBbEJwQjtBQW1CSUMsaUJBQWUsRUFBRyxjQW5CdEI7QUFvQklDLGVBQWEsRUFBRyxrQkFwQnBCO0FBcUJJQyxnQkFBYyxFQUFHLGdCQXJCckI7QUFzQklDLGFBQVcsRUFBRSxhQXRCakI7QUF1QklDLDhCQUE0QixFQUFFLG9CQXZCbEM7QUF3QklDLHFCQUFtQixFQUFFLDJCQXhCekI7QUF5QklDLDhCQUE0QixFQUFHLEVBekJuQztBQTBCSUMsaUJBQWUsRUFBRyxhQTFCdEI7QUEyQklDLFlBQVUsRUFBRSwwQkEzQmhCO0FBNEJJQyxZQUFVLEVBQUUsc0JBNUJoQjtBQTZCSUMsUUFBTSxFQUFFLGtTQTdCWjtBQThCSUMsWUFBVSxFQUFFLHVCQTlCaEI7QUErQklDLFFBQU0sRUFBRSwrY0EvQlo7QUFnQ0lDLHdCQUFzQixFQUFFLDBDQWhDNUI7QUFpQ0lDLHdCQUFzQixFQUFFLGlEQWpDNUI7QUFrQ0lDLGtCQUFnQixFQUFFLDRCQWxDdEI7QUFtQ0lDLGdCQUFjLEVBQUUsMmlDQW5DcEI7QUFvQ0lDLGtCQUFnQixFQUFFO0FBcEN0QixDQURBLEM7Ozs7Ozs7Ozs7OztBQ0FBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVPLElBQU1DLFVBQVUsR0FBRyxTQUFiQSxVQUFhLENBQUNwTSxJQUFELEVBQU9xTSxJQUFQLEVBQzFCO0FBQ0lDLGNBQVksQ0FBQ0MsT0FBYixDQUFxQnZNLElBQXJCLEVBQTJCd00sSUFBSSxDQUFDQyxTQUFMLENBQWVKLElBQWYsQ0FBM0I7QUFDSCxDQUhNO0FBS0EsSUFBTUssU0FBUyxHQUFHLFNBQVpBLFNBQVksQ0FBQzFNLElBQUQsRUFDekI7QUFBQSxNQURnQzJNLElBQ2hDLHVFQURxQyxLQUNyQztBQUNJLE1BQUdBLElBQUgsRUFDSSxPQUFPSCxJQUFJLENBQUNJLEtBQUwsQ0FBV04sWUFBWSxDQUFDTyxPQUFiLENBQXFCN00sSUFBckIsQ0FBWCxDQUFQLENBREosS0FHSSxPQUFPc00sWUFBWSxDQUFDTyxPQUFiLENBQXFCN00sSUFBckIsQ0FBUDtBQUNQLENBTk07QUFRQSxJQUFNOE0sWUFBWSxHQUFHLFNBQWZBLFlBQWUsQ0FBQzlNLElBQUQsRUFDNUI7QUFDSXNNLGNBQVksQ0FBQ1MsVUFBYixDQUF3Qi9NLElBQXhCO0FBQ0gsQ0FITSxDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0NkUDs7QUFDTyxJQUFNZ04sVUFBVSxHQUFHLFNBQWJBLFVBQWEsQ0FBQ0MsU0FBRCxFQUFZQyxPQUFaLEVBQzFCO0FBQUEsTUFEK0NDLFVBQy9DLHVFQUQwRCxFQUMxRDtBQUFBLE1BRDhEQyxLQUM5RCx1RUFEb0UsRUFDcEU7QUFBQSxNQUR3RUMsUUFDeEUsdUVBRGlGLEVBQ2pGO0FBQUEsTUFEcUZDLGFBQ3JGLHVFQURtRyxFQUNuRztBQUFBLE1BRHVHOUQsT0FDdkcsdUVBRCtHLElBQy9HO0FBQ0ksTUFBR1YsMkRBQU8sQ0FBQ29FLE9BQUQsQ0FBUCxJQUFvQnBFLDJEQUFPLENBQUNtRSxTQUFELENBQTlCLEVBQ0ksT0FBTyxLQUFQLENBREosS0FHQTtBQUNJLFFBQU1NLFVBQVUsR0FBQ0MsUUFBUSxDQUFDQyxhQUFULENBQXVCUCxPQUF2QixDQUFqQjtBQUVBLFFBQUcsQ0FBQ3BFLDJEQUFPLENBQUNzRSxLQUFELENBQVgsRUFBbUI7QUFDZkcsZ0JBQVUsQ0FBQzNDLEVBQVgsR0FBY3dDLEtBQWQ7O0FBRUosUUFBR00sS0FBSyxDQUFDQyxPQUFOLENBQWNOLFFBQWQsS0FBMkJBLFFBQVEsQ0FBQ3JFLE1BQVQsSUFBaUIsQ0FBL0MsRUFDQTtBQUNJLFdBQUksSUFBSTRFLENBQVIsSUFBYVAsUUFBYjtBQUNJRSxrQkFBVSxDQUFDTSxTQUFYLENBQXFCQyxHQUFyQixDQUF5QlQsUUFBUSxDQUFDTyxDQUFELENBQWpDO0FBREo7QUFFSDs7QUFFRCxRQUFHLFFBQU9OLGFBQVAsTUFBeUIsUUFBNUIsRUFBc0M7QUFDdEM7QUFDSSxhQUFJLElBQUlTLFlBQVIsSUFBd0JULGFBQXhCO0FBQ0lDLG9CQUFVLENBQUNTLFlBQVgsQ0FBd0JELFlBQXhCLEVBQXNDVCxhQUFhLENBQUNTLFlBQUQsQ0FBbkQ7QUFESjtBQUVIOztBQUVELFFBQUcsQ0FBQ2pGLDJEQUFPLENBQUNxRSxVQUFELENBQVgsRUFDSUksVUFBVSxDQUFDVSxTQUFYLEdBQXFCZCxVQUFVLENBQUMzRCxPQUFYLENBQW1CLEtBQW5CLEVBQXlCLE1BQXpCLENBQXJCLENBbkJSLENBbUI4RDs7QUFFMUQsUUFBR0EsT0FBSCxFQUNJeUQsU0FBUyxDQUFDZ0IsU0FBVixHQUFvQixFQUFwQjtBQUNKaEIsYUFBUyxDQUFDaUIsV0FBVixDQUFzQlgsVUFBdEI7QUFDSDtBQUNKLENBOUJNLEM7Ozs7Ozs7Ozs7OztBQ0hQO0FBQUE7QUFBQTtBQUFBO0FBRU8sSUFBTVksUUFBUSxHQUFHLFNBQVhBLFFBQVcsR0FDeEI7QUFDSUMsU0FBTyxDQUFDQyxHQUFSLENBQVksK0xBQVo7QUFDQSxTQUFPLElBQVA7QUFDSCxDQUpNO0FBTUEsSUFBTUMsaUJBQWlCLEdBQUcsU0FBcEJBLGlCQUFvQixDQUFDQyxNQUFELEVBQVNDLGNBQVQsRUFDakM7QUFDSSxNQUFNQyxJQUFJLEdBQUNqQixRQUFRLENBQUNrQixjQUFULENBQXdCLGlCQUF4QixDQUFYO0FBQ0EsTUFBTUMsUUFBUSxHQUFDSixNQUFNLEdBQUMsVUFBdEI7QUFDQUUsTUFBSSxDQUFDOUQsSUFBTCxHQUFVLE1BQUk2RCxjQUFjLENBQUNHLFFBQUQsQ0FBNUI7QUFDSCxDQUxNLEM7Ozs7Ozs7Ozs7OztBQ1JQO0FBQUE7QUFBQTtBQUFBO0NBRUE7O0FBQ08sSUFBTUMsWUFBWSxHQUFHLFNBQWZBLFlBQWUsR0FDNUI7QUFDSSxNQUFHOUYsMkRBQU8sQ0FBQytGLFFBQVEsQ0FBQ0MsTUFBVixDQUFWLEVBQ0ksT0FBTyxLQUFQO0FBRUosTUFBTUMsVUFBVSxHQUFHRixRQUFRLENBQUNDLE1BQVQsQ0FBZ0I3RixTQUFoQixDQUEwQixDQUExQixFQUE2QitGLEtBQTdCLENBQW1DLEdBQW5DLENBQW5CO0FBQ0EsTUFBRyxDQUFDdEIsS0FBSyxDQUFDQyxPQUFOLENBQWNvQixVQUFkLENBQUQsSUFBOEJBLFVBQVUsQ0FBQy9GLE1BQVgsS0FBb0IsQ0FBckQsRUFDSSxPQUFPLEtBQVA7QUFFSixNQUFJaUcsS0FBSjtBQUFBLE1BQVdDLEtBQUssR0FBQyxFQUFqQjs7QUFDQSxPQUFJLElBQUl0QixDQUFSLElBQWFtQixVQUFiLEVBQ0E7QUFDSUUsU0FBSyxHQUFHRixVQUFVLENBQUNuQixDQUFELENBQVYsQ0FBY29CLEtBQWQsQ0FBb0IsR0FBcEIsQ0FBUjtBQUNBLFFBQUdDLEtBQUssQ0FBQ2pHLE1BQU4sS0FBZSxDQUFsQixFQUNJa0csS0FBSyxDQUFDRCxLQUFLLENBQUMsQ0FBRCxDQUFOLENBQUwsR0FBZ0JFLFNBQVMsQ0FBQ0YsS0FBSyxDQUFDLENBQUQsQ0FBTixDQUF6QjtBQUNQOztBQUNELFNBQU9DLEtBQVA7QUFDSCxDQWpCTSxDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNIUDtBQUNBLElBQU1uRixJQUFJLEdBQUM3UCxrRUFBYyxDQUFDLENBQUQsQ0FBekI7O0FBRUEsSUFBTXNVLGNBQWMsR0FBR2xWLCtEQUFRLElBQWlCLEdBQUNXLHlEQUFsQixHQUF3QixVQUF4QixHQUFtQzhQLElBQW5DLEdBQXdDLEtBQXpDLENBQTlCOztBQUNBO0FBRUE7Q0FHQTtBQUNBOztBQUNPLElBQU1xRixTQUFTO0FBQUEscUVBQUk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLDZDQUVmLElBQUlDLE9BQUosQ0FBWSxVQUFDQyxPQUFELEVBQVVDLE1BQVYsRUFDbkI7QUFDSSxrQkFBTUMsR0FBRyxHQUFHLElBQUlDLGNBQUosRUFBWjtBQUNBRCxpQkFBRyxDQUFDRSxJQUFKLENBQVMsS0FBVCxFQUFnQmhXLDBEQUFNLEdBQUMsaUJBQXZCOztBQUNBOFYsaUJBQUcsQ0FBQ0csTUFBSixHQUFhO0FBQUEsdUJBQU1MLE9BQU8sQ0FBQzlDLElBQUksQ0FBQ0ksS0FBTCxDQUFXNEMsR0FBRyxDQUFDSSxZQUFmLENBQUQsQ0FBYjtBQUFBLGVBQWI7O0FBQ0FKLGlCQUFHLENBQUNLLE9BQUosR0FBYztBQUFBLHVCQUFNTixNQUFNLENBQUNDLEdBQUcsQ0FBQ00sVUFBTCxDQUFaO0FBQUEsZUFBZDs7QUFDQU4saUJBQUcsQ0FBQ08sSUFBSjtBQUNILGFBUE0sQ0FGZTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxHQUFKOztBQUFBLGtCQUFUWCxTQUFTO0FBQUE7QUFBQTtBQUFBLEdBQWY7QUFZQSxJQUFNWSxpQkFBaUIsR0FBRyxTQUFwQkEsaUJBQW9CLEdBQ2pDO0FBQ0ksTUFBTUMsU0FBUyxHQUFDLElBQUloRyxJQUFKLEdBQVdpRyxpQkFBWCxFQUFoQjtBQUNBLE1BQUdELFNBQVMsR0FBRzFQLGtFQUFaLElBQWlDMFAsU0FBUyxHQUFHM1Asa0VBQWhELEVBQ0ksT0FBTyxDQUFQLENBREosS0FFSyxPQUFPMlAsU0FBUDtBQUNSLENBTk0sQyxDQVFQO0FBQ0E7O0FBQ08sSUFBTUUsV0FBVyxHQUFHLFNBQWRBLFdBQWMsQ0FBQ0MsUUFBRCxFQUFXQyxRQUFYLEVBQzNCO0FBQ0ksTUFBTUMsS0FBSyxHQUFDRixRQUFRLEdBQUMxRyxJQUFJLENBQUNFLEtBQUwsQ0FBV0YsSUFBSSxDQUFDRyxNQUFMLE1BQWV3RyxRQUFRLEdBQUNELFFBQXhCLENBQVgsQ0FBckI7QUFDQSxNQUFNRyxPQUFPLEdBQUMsb0RBQWQ7QUFDQSxNQUFNQyxNQUFNLEdBQUMsOEJBQWI7QUFDQSxNQUFJclUsUUFBUSxHQUFDb1UsT0FBTyxDQUFDN0csSUFBSSxDQUFDRSxLQUFMLENBQVdGLElBQUksQ0FBQ0csTUFBTCxLQUFjMEcsT0FBTyxDQUFDdkgsTUFBakMsQ0FBRCxDQUFwQjs7QUFDQSxPQUFJLElBQUk0RSxDQUFDLEdBQUMsQ0FBVixFQUFZQSxDQUFDLEdBQUUwQyxLQUFLLEdBQUMsQ0FBckIsRUFBd0IxQyxDQUFDLEVBQXpCLEVBQ0E7QUFDSSxRQUFJQSxDQUFDLEdBQUcsQ0FBTCxLQUFXLENBQWQsRUFDSXpSLFFBQVEsSUFBRXFVLE1BQU0sQ0FBQzlHLElBQUksQ0FBQ0UsS0FBTCxDQUFXRixJQUFJLENBQUNHLE1BQUwsS0FBYzJHLE1BQU0sQ0FBQ3hILE1BQWhDLENBQUQsQ0FBaEIsQ0FESixLQUdJN00sUUFBUSxJQUFFb1UsT0FBTyxDQUFDN0csSUFBSSxDQUFDRSxLQUFMLENBQVdGLElBQUksQ0FBQ0csTUFBTCxLQUFjMEcsT0FBTyxDQUFDdkgsTUFBakMsQ0FBRCxDQUFqQjtBQUNQOztBQUNEN00sVUFBUSxJQUFFb1UsT0FBTyxDQUFDN0csSUFBSSxDQUFDRSxLQUFMLENBQVdGLElBQUksQ0FBQ0csTUFBTCxLQUFjMEcsT0FBTyxDQUFDdkgsTUFBakMsQ0FBRCxDQUFqQjtBQUNBLFNBQU83TSxRQUFQO0FBQ0gsQ0FmTSxDLENBaUJQO0FBQ0E7O0FBQ08sSUFBTXNVLFVBQVUsR0FBRyxTQUFiQSxVQUFhLENBQUNDLE1BQUQsRUFBU0MsS0FBVCxFQUFnQkMsVUFBaEIsRUFDMUI7QUFDSSxNQUFNQyxXQUFXLEdBQ2pCO0FBQ0lqRyxNQUFFLEVBQUU4RixNQURSO0FBRUlDLFNBQUssRUFBRUEsS0FGWDtBQUdJRyxZQUFRLEVBQUVGO0FBSGQsR0FEQTtBQU1BeEUsc0VBQVUsQ0FBQyxNQUFELEVBQVN5RSxXQUFULENBQVY7QUFDSCxDQVRNLEMsQ0FXUDtBQUNBOztBQUNPLElBQU1FLGdCQUFnQixHQUFHLFNBQW5CQSxnQkFBbUIsQ0FBQzdCLEtBQUQsRUFDaEM7QUFDSSxNQUFNOEIsVUFBVSxHQUFDdEUsbUVBQVMsQ0FBQyxZQUFELENBQTFCOztBQUNBLE1BQUcsQ0FBQzVELDJEQUFPLENBQUNrSSxVQUFELENBQVgsRUFDQTtBQUNJLFFBQU1DLE1BQU0sR0FBQ3pFLElBQUksQ0FBQ0ksS0FBTCxDQUFXb0UsVUFBWCxDQUFiOztBQUNBLFFBQUcsQ0FBQ2xJLDJEQUFPLENBQUNtSSxNQUFNLENBQUNILFFBQVIsQ0FBUixJQUE2QixDQUFDaEksMkRBQU8sQ0FBQ21JLE1BQU0sQ0FBQ0MsZ0JBQVIsQ0FBckMsSUFBa0UsQ0FBQ3BJLDJEQUFPLENBQUNtSSxNQUFNLENBQUNFLGVBQVIsQ0FBMUUsSUFBc0csQ0FBQ3JJLDJEQUFPLENBQUNtSSxNQUFNLENBQUNHLFdBQVIsQ0FBakgsRUFDQTtBQUNJbEMsV0FBSyxDQUFDNEIsUUFBTixHQUFlRyxNQUFNLENBQUNILFFBQXRCO0FBQ0E1QixXQUFLLENBQUNnQyxnQkFBTixHQUF1QkQsTUFBTSxDQUFDQyxnQkFBOUI7QUFDQWhDLFdBQUssQ0FBQ2lDLGVBQU4sR0FBc0JGLE1BQU0sQ0FBQ0UsZUFBN0I7QUFDQWpDLFdBQUssQ0FBQ2tDLFdBQU4sR0FBa0JILE1BQU0sQ0FBQ0csV0FBekI7QUFDSDtBQUNKOztBQUNELFNBQU9sQyxLQUFQO0FBQ0gsQ0FmTSxDLENBaUJQO0FBQ0E7O0FBQ08sSUFBTW1DLFlBQVk7QUFBQSxzRUFBRztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFPOUMsa0JBQVAsOERBQWMsRUFBZDtBQUFrQitDLDBCQUFsQjtBQUFrQ0MsbUJBQWxDO0FBQTJDQyxxQkFBM0M7QUFBQSw4Q0FFakIsSUFBSW5DLE9BQUosQ0FBWSxVQUFDQyxPQUFELEVBQVVDLE1BQVYsRUFDbkI7QUFDSSxrQkFBTWtDLFNBQVMsR0FBQy9FLG1FQUFTLENBQUMsTUFBRCxDQUF6Qjs7QUFDQSxrQkFBRzVELDJEQUFPLENBQUMySSxTQUFELENBQVYsRUFDQTtBQUNJQyw0QkFBWSxDQUFDSixjQUFELEVBQWlCQyxPQUFqQixFQUEwQkMsU0FBMUIsQ0FBWjtBQUNBbEMsdUJBQU8sQ0FBQyxLQUFELENBQVA7QUFDSCxlQUpELE1BTUE7QUFDSSxvQkFBTXFDLElBQUksR0FBQ25GLElBQUksQ0FBQ0ksS0FBTCxDQUFXNkUsU0FBWCxDQUFYOztBQUNBLG9CQUFHM0ksMkRBQU8sQ0FBQzZJLElBQUksQ0FBQy9HLEVBQU4sQ0FBUCxJQUFvQjlCLDJEQUFPLENBQUM2SSxJQUFJLENBQUNoQixLQUFOLENBQTNCLElBQTJDN0gsMkRBQU8sQ0FBQzZJLElBQUksQ0FBQ2IsUUFBTixDQUFsRCxJQUFxRWEsSUFBSSxDQUFDYixRQUFMLEdBQWdCN0csSUFBSSxDQUFDMkgsR0FBTCxFQUF4RixFQUNBO0FBQ0k5RSx3RkFBWSxDQUFDLE1BQUQsQ0FBWjtBQUNBNEUsOEJBQVksQ0FBQ0osY0FBRCxFQUFpQkMsT0FBakIsRUFBMEJDLFNBQTFCLENBQVo7QUFDQWxDLHlCQUFPLENBQUMsS0FBRCxDQUFQO0FBQ0gsaUJBTEQsTUFPQTtBQUNJLHNCQUFNRSxHQUFHLEdBQUcsSUFBSUMsY0FBSixFQUFaO0FBQ0FELHFCQUFHLENBQUNFLElBQUosQ0FBUyxLQUFULEVBQWdCaFcsMERBQU0sR0FBQ21GLDJEQUFQLEdBQWtCSyxnRUFBbEIsR0FBa0N5UyxJQUFJLENBQUNoQixLQUF2RDs7QUFDQW5CLHFCQUFHLENBQUNHLE1BQUosR0FBYSxZQUNiO0FBQ0ksd0JBQUlrQyxRQUFRLEdBQUNyRixJQUFJLENBQUNJLEtBQUwsQ0FBVzRDLEdBQUcsQ0FBQ0ksWUFBZixDQUFiOztBQUNBLHdCQUFJSixHQUFHLENBQUNqQixNQUFKLEtBQWUsR0FBZixJQUFzQnNELFFBQVEsQ0FBQ0MsT0FBL0IsSUFBMENELFFBQVEsQ0FBQ2pILEVBQVQsSUFBZWpDLFNBQTdELEVBQ0E7QUFDSSwwQkFBR2tKLFFBQVEsQ0FBQ2pILEVBQVQsS0FBYytHLElBQUksQ0FBQy9HLEVBQXRCLEVBQ0E7QUFDSStHLDRCQUFJLENBQUMzUixJQUFMLEdBQVU2UixRQUFRLENBQUM3UixJQUFuQjtBQUNBMlIsNEJBQUksQ0FBQ0ksUUFBTCxHQUFjRixRQUFRLENBQUNFLFFBQXZCO0FBQ0FKLDRCQUFJLENBQUNLLGNBQUwsR0FBb0JILFFBQVEsQ0FBQ0csY0FBN0I7QUFDQUwsNEJBQUksQ0FBQ3BELE1BQUwsR0FBWXNELFFBQVEsQ0FBQ3RELE1BQXJCLENBSkosQ0FJZ0M7O0FBQzVCbkMsNEZBQVUsQ0FBQyxNQUFELEVBQVN1RixJQUFULENBQVYsQ0FMSixDQU1JOztBQUNBLDRCQUFHRSxRQUFRLENBQUN0RCxNQUFULEtBQWtCLE1BQWxCLElBQTRCc0QsUUFBUSxDQUFDSSxRQUFULElBQXFCLENBQXBELEVBQ0E7QUFDSSw4QkFBTUMsVUFBVSxHQUFDdlksMkRBQU8sR0FBQyxHQUFSLEdBQVk2VSxjQUFjLENBQUN6RSxJQUFELENBQWQsQ0FBcUJzQixXQUFsRDtBQUNBLDhCQUFHOEcsTUFBTSxDQUFDdEQsUUFBUCxDQUFnQmxFLElBQWhCLENBQXFCeUgsT0FBckIsQ0FBNkJGLFVBQTdCLE1BQTJDLENBQUMsQ0FBL0MsRUFDSUMsTUFBTSxDQUFDdEQsUUFBUCxDQUFnQndELE1BQWhCLENBQXVCLE1BQUk3RCxjQUFjLENBQUN6RSxJQUFELENBQWQsQ0FBcUJzQixXQUFoRCxFQUhSLENBR3FFOztBQUNqRWlFLGlDQUFPLENBQUMsSUFBRCxDQUFQO0FBQ0gseUJBTkQsTUFRQTtBQUNJLDhCQUFHZixNQUFNLENBQUN2RixNQUFQLEtBQWdCLENBQWhCLElBQXFCdUYsTUFBTSxDQUFDNkQsT0FBUCxDQUFlUCxRQUFRLENBQUN0RCxNQUF4QixNQUFrQyxDQUFDLENBQTNELEVBQ0E7QUFDSW1ELHdDQUFZLENBQUNKLGNBQUQsRUFBaUJDLE9BQWpCLEVBQTBCQyxTQUExQixDQUFaO0FBQ0FsQyxtQ0FBTyxDQUFDLEtBQUQsQ0FBUDtBQUNILDJCQUpELE1BTUlBLE9BQU8sQ0FBQyxJQUFELENBQVA7QUFDUDtBQUNKLHVCQXpCRCxNQTJCQTtBQUNJeEMsOEZBQVksQ0FBQyxNQUFELENBQVo7QUFDQTRFLG9DQUFZLENBQUNKLGNBQUQsRUFBaUJDLE9BQWpCLEVBQTBCQyxTQUExQixDQUFaO0FBQ0FsQywrQkFBTyxDQUFDLEtBQUQsQ0FBUDtBQUNIO0FBQ0oscUJBbENELE1Bb0NBO0FBQ0l4Qyw0RkFBWSxDQUFDLE1BQUQsQ0FBWjtBQUNBNEUsa0NBQVksQ0FBQ0osY0FBRCxFQUFpQkMsT0FBakIsRUFBMEJDLFNBQTFCLENBQVo7QUFDQWxDLDZCQUFPLENBQUMsS0FBRCxDQUFQO0FBQ0g7QUFDSixtQkE1Q0Q7O0FBNkNBRSxxQkFBRyxDQUFDSyxPQUFKLEdBQWM7QUFBQSwyQkFBTU4sTUFBTSxDQUFDQyxHQUFHLENBQUNNLFVBQUwsQ0FBWjtBQUFBLG1CQUFkOztBQUNBTixxQkFBRyxDQUFDTyxJQUFKO0FBQ0g7QUFDSjtBQUNKLGFBdEVNLENBRmlCOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEdBQUg7O0FBQUEsa0JBQVpzQixZQUFZO0FBQUE7QUFBQTtBQUFBLEdBQWxCLEMsQ0EwRVA7O0FBQ0EsSUFBTUssWUFBWSxHQUFHLFNBQWZBLFlBQWUsQ0FBQ0osY0FBRCxFQUFpQkMsT0FBakIsRUFBMEJDLFNBQTFCLEVBQ3JCO0FBQ0ksTUFBRyxDQUFDMUksMkRBQU8sQ0FBQ3lJLE9BQUQsQ0FBWCxFQUNJbkYsb0VBQVUsQ0FBQyxTQUFELEVBQVltRixPQUFaLENBQVY7QUFDSixNQUFHLENBQUN6SSwyREFBTyxDQUFDMEksU0FBRCxDQUFYLEVBQ0lwRixvRUFBVSxDQUFDLEtBQUQsRUFBUW9GLFNBQVIsQ0FBVjtBQUNKLE1BQUcsQ0FBQzFJLDJEQUFPLENBQUN3SSxjQUFELENBQVgsRUFDSWEsTUFBTSxDQUFDdEQsUUFBUCxDQUFnQndELE1BQWhCLENBQXVCZixjQUF2QjtBQUNQLENBUkQsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDL0pBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBLElBQU12SCxJQUFJLEdBQUM3UCxrRUFBYyxDQUFDLENBQUQsQ0FBekI7O0FBQ0EsSUFBTW9ZLGNBQWMsR0FBR2haLCtEQUFRLElBQWMsR0FBQ1cseURBQWYsR0FBcUIsVUFBckIsR0FBZ0M4UCxJQUFoQyxHQUFxQyxLQUF0QyxDQUE5QixDLENBRUE7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0NBR0E7O0FBQ0EsSUFBTXdJLEdBQUcsR0FBR2paLG1FQUFRLElBQWEsR0FBQ3lRLElBQWQsR0FBbUIsVUFBcEIsQ0FBbkI7O0FBQ0EsSUFBTXlJLFFBQVEsR0FBR2xaLGdFQUFRLElBQWEsR0FBQ3lRLElBQWQsR0FBbUIsT0FBcEIsQ0FBeEI7O0FBQ0EsSUFBTTBJLGdCQUFnQixHQUFHblosd0VBQVEsSUFBYSxHQUFDeVEsSUFBZCxHQUFtQixlQUFwQixDQUFoQzs7QUFFQSxJQUFNMkksV0FBVyxHQUFHbEYsUUFBUSxDQUFDa0IsY0FBVCxDQUF3QixVQUF4QixDQUFwQjtBQUVBUCxxRUFBUTtBQUVSLElBQUl3RSxNQUFKOztBQUNBLElBQU1DLFVBQVU7QUFBQSxxRUFBRztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBSUl4RCxpRUFBUyxFQUpiOztBQUFBO0FBSVh1RCxrQkFKVztBQUtYLGdCQUFHLENBQUNBLE1BQUosRUFDSTNGLGdFQUFVLENBQUMwRixXQUFELEVBQWMsR0FBZCxFQUFtQkgsR0FBRyxDQUFDM1IsV0FBdkIsRUFBb0MsRUFBcEMsRUFBd0MsQ0FBQyxPQUFELENBQXhDLENBQVYsQ0FESixLQUdBO0FBQ1VzTyxtQkFEVixHQUNnQk4sa0VBQVksRUFENUI7O0FBRUksa0JBQUdNLEtBQUssSUFBSUEsS0FBSyxDQUFDMkQsQ0FBTixLQUFVbEssU0FBdEIsRUFDQTtBQUNVNkcsbUJBRFYsR0FDZ0IsSUFBSUMsY0FBSixFQURoQjtBQUVJRCxtQkFBRyxDQUFDRSxJQUFKLENBQVMsS0FBVCxFQUFnQmhXLDBEQUFNLEdBQUNpWixNQUFNLENBQUM5VCxVQUFkLEdBQXlCOFQsTUFBTSxDQUFDNVMsZ0JBQWhDLEdBQWlEbVAsS0FBSyxDQUFDMkQsQ0FBdkU7O0FBQ0FyRCxtQkFBRyxDQUFDc0Qsa0JBQUosR0FBeUIsWUFDekI7QUFDSSxzQkFBSSxLQUFLQyxVQUFMLElBQW1CdEQsY0FBYyxDQUFDdUQsSUFBdEMsRUFDQTtBQUNJLHdCQUFJbkIsUUFBUSxHQUFDckYsSUFBSSxDQUFDSSxLQUFMLENBQVcsS0FBS2dELFlBQWhCLENBQWI7QUFDQSx3QkFBSSxLQUFLckIsTUFBTCxLQUFnQixHQUFoQixJQUF1QnNELFFBQVEsQ0FBQ04sT0FBVCxJQUFvQjVJLFNBQS9DLEVBQ0lxRSxnRUFBVSxDQUFDMEYsV0FBRCxFQUFjLEdBQWQsRUFBbUJiLFFBQVEsQ0FBQ04sT0FBVCxDQUFpQi9ILE9BQWpCLENBQXlCLE1BQXpCLEVBQWlDOEksY0FBYyxDQUFDakgsV0FBaEQsQ0FBbkIsRUFBaUYsRUFBakYsRUFBcUYsQ0FBQyxTQUFELENBQXJGLENBQVYsQ0FESixLQUdJMkIsZ0VBQVUsQ0FBQzBGLFdBQUQsRUFBYyxHQUFkLEVBQW1CRCxnQkFBZ0IsQ0FBQy9QLGtCQUFqQixDQUFvQzhHLE9BQXBDLENBQTRDLE1BQTVDLEVBQW9EOEksY0FBYyxDQUFDakgsV0FBbkUsQ0FBbkIsRUFBb0csRUFBcEcsRUFBd0csQ0FBQyxPQUFELENBQXhHLENBQVY7QUFDUDtBQUNKLGlCQVZEOztBQVdBbUUsbUJBQUcsQ0FBQ08sSUFBSjtBQUNIO0FBQ0o7QUEzQlU7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUErQlgvQyw0RUFBVSxDQUFDMEYsV0FBRCxFQUFjLEdBQWQsRUFBbUJILEdBQUcsQ0FBQzNSLFdBQXZCLEVBQW9DLEVBQXBDLEVBQXdDLENBQUMsT0FBRCxDQUF4QyxDQUFWOztBQS9CVztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxHQUFIOztBQUFBLGtCQUFWZ1MsVUFBVTtBQUFBO0FBQUE7QUFBQSxHQUFoQjs7QUFrQ0FBLFVBQVUsRyIsImZpbGUiOiIuL0pTL3Vuc3Vic2NyaWJlLmFwcC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL3Vuc3Vic2NyaWJlLmpzXCIpO1xuIiwiY29uc3QgdXNlcnMgPSByZXF1aXJlKFwiLi91c2Vyc1wiKTtcbmNvbnN0IHF1ZXN0aW9ubmFpcmVzID0gcmVxdWlyZShcIi4vcXVlc3Rpb25uYWlyZXNcIik7XG5cbm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBhcGlVcmw6IFwiaHR0cDovL2xvY2FsaG9zdDozMDAwL2FwaVwiLFxuICAgIHNpdGVVcmw6IFwiaHR0cDovL2xvY2FsaG9zdDo4MDgwXCIsXG4gICAgYWRtaW5OYW1lOiBcIkZhYnJpY2VcIixcbiAgICBhZG1pbkVtYWlsOiBcImRldkB3aWtpbGVybmkuY29tXCIsXG4gICAgc2VuZGVyTmFtZTogXCJXaWtpTGVybmlcIixcbiAgICBzZW5kZXJFbWFpbDogXCJib25qb3VyQHdpa2lsZXJuaS5jb21cIixcbiAgICBhZG1pbkxhbmc6IFwiZnJcIixcbiAgICB0aGVtZTogXCJkZWZhdWx0XCIsIC8vIGxlIHRow6htZSB1dGlsaXPDqSAoZGFucyAvdmlld3MpIHBvdXIgZ8OpbsOpcmVyIGxlcyBwYWdlcyBIVE1MLiBDb250aWVudCBzZXMgcHJvcHJlcyBmaWNoaWVycyBkZSBjb25maWd1cmF0aW9uLlxuICAgIGF2YWlsYWJsZUxhbmdzOiBbXCJmclwiXSwvLyBMYW5ndWFnZXMgaW4gd2hpY2ggdGhlIHNpdGUgaXMgYXZhaWxhYmxlLiBUaGUgZmlyc3Qgb25lIGlzIHRoZSBkZWZhdWx0IG9uZS5cbiAgICBzaXRlTmFtZTogXCJXaWtpTGVybmlcIixcbiAgICBiZWdpbkNvZGVHb2RmYXRoZXI6IFwid2lraWxlcm5pXCIsIC8vIGNhc2Utc2Vuc2l0aXZlIGFuZCBjYW4ndCBjb250YWluIFwiQFwiICFcbiAgICBjcm9uVGltaW5nQWxlcnRJblNlY29uZGU6IDEyMCwgLy8gZm9yIGxvZ3NcbiAgICByZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlOiAzLCAvLyBpZGVtXG4gICAgdG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnM6IFwiNDhoXCIsIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96ZWl0L21zXG4gICAgdG9rZW5Mb2dpbkxpbmtUaW1lSW5Ib3VyczogXCIxaFwiLFxuICAgIHRva2VuQ29ubmV4aW9uTWluVGltZUluSG91cnM6IFwiMjRoXCIsXG4gICAgdG9rZW5Db25uZXhpb25NYXhUaW1lSW5EYXlzOiBcIjE4MCBkYXlzXCIsXG4gICAgdG9rZW5Mb2dpbkNoYW5naW5nVGltZUluSG91cnM6IFwiMWhcIiwvLyBmb3IgZW1haWwgJiBwYXNzd29yZCBjaGFuZ2luZ1xuICAgIHRva2VuRGVsZXRlVXNlclRpbWVJbkhvdXJzOiBcIjFoXCIsXG4gICAgdG9rZW5VbnN1YnNjcmliZUxpbmtUaW1lSW5EYXlzOiBcIjcgZGF5c1wiLCAvLyB0b2tlbiBzZW5kIHdpdGggc3Vic2NyaXB0aW9uJ3MgZW1haWxzXG4gICAgZnJlZUFjY291bnRUaW1pbmdJbkRheXM6IDEwLFxuICAgIGZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5czogNSxcbiAgICBhY2NvdW50RXhwaXJhdGlvbkZpcnN0Tm90aWZpY2F0aW9uSW5EYXlzOiAxNCwgICAgXG4gICAgYWNjb3VudEV4cGlyYXRpb25TZWNvbmROb3RpZmljYXRpb25JbkRheXM6IDUsXG4gICAgaW5hY3RpdmVBY2NvdW50VGltZVRvRGVsZXRlSW5EYXlzOiAxODAsXG4gICAgLy8gUXVlc3Rpb25uYWlyZXM6XG4gICAgbmJRdWVzdGlvbnNNaW46IDEsIC8vIG1pbmltdW0gbnVtYmVyIG9mIHF1ZXN0aW9ucyBmb3IgdGhlIHF1ZXN0aW9ubmFpcmUgdG8gYmUgcHVibGlzaGFibGVcbiAgICBuYlF1ZXN0aW9uc01heDogMTAsIC8vIGlmIDAgPSBub3QgbWF4aW11bVxuICAgIG5iQ2hvaWNlc01heDogMTAsXG4gICAgbmJOZXdRdWVzdGlvbm5haXJlczogMTAsLy8gZm9yIFJTUywgZXRjLlxuICAgIGhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUJlZ2luOjEsIC8vIGluIHVzZXIgbG9jYWwgdGltZVxuICAgIGhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUVuZDoyNCwgLy8gaWRlbVxuICAgIG51bWJlck5ld1F1ZXN0aW9ubmFpcmVBdFNhbWVUaW1lOiA1MCwgLy8gZm9yIG1hc3MgbWFpbGluZ1xuICAgIG1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzOiAzLFxuICAgIC8vIElsbHVzdHJhdGlvbnM6XG4gICAgbmJJbGx1c3RyYXRpb25zTWluOiAwLFxuICAgIG5iSWxsdXN0cmF0aW9uc01heDogMSxcbiAgICBtYXhJbGx1c3RyYXRpb25TaXplaW5PY3RldDogMTAwMDAwMCwvLyBwYXMgY29udHLDtGzDqSBwb3VyIGwnaW5zdGFudC4gw4AgcmV2b2lyLlxuICAgIG1pbWVUeXBlc0ZvcklsbHVzdHJhdGlvbjogWyBcImltYWdlL2pwZ1wiLCBcImltYWdlL2pwZWdcIiwgXCJpbWFnZS9wbmdcIiwgXCJpbWFnZS9naWZcIiwgXCJpbWFnZS9wbmdcIiBdLFxuICAgIC8vIC0tIFVwbG9hZCBhbmQgcmVzaXplOlxuICAgIGlsbHVzdHJhdGlvbnNXaWR0aE1heEluUHg6IDQwMCxcbiAgICBpbGx1c3RyYXRpb25zTWluaWF0dXJlc1dpZHRoTWF4SW5QeDogMjAwLFxuICAgIC8vIExpbmtzOlxuICAgIG5iTGlua3NNaW46IDEsXG4gICAgbmJMaW5rc01heDogMSxcbiAgICAvLyDDoCBzdXBwcmltZXIgcXVhbmQgdG91cyBsZXMgXCJyZXF1aXJlXCIgw6Agam91cjpcbiAgICBuYlF1ZXN0aW9uc01pbjogcXVlc3Rpb25uYWlyZXMubmJRdWVzdGlvbnNNaW4sXG4gICAgbmJRdWVzdGlvbnNNYXg6IHF1ZXN0aW9ubmFpcmVzLm5iUXVlc3Rpb25zTWF4LFxuICAgIG5iQ2hvaWNlc01heDogcXVlc3Rpb25uYWlyZXMubmJDaG9pY2VzTWF4LFxuICAgIHBhc3N3b3JkTWluTGVuZ3RoOiB1c2Vycy5wYXNzd29yZC5taW5sZW5ndGgsXG4gICAgZGlyQ2FjaGVVc2VyczogdXNlcnMuZGlyQ2FjaGVVc2VycyxcbiAgICBkaXJDYWNoZVVzZXJzQW5zd2VyczogdXNlcnMuZGlyQ2FjaGVVc2Vyc0Fuc3dlcnMsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbm5haXJlczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyxcbiAgICBkaXJDYWNoZVF1ZXN0aW9uczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVRdWVzdGlvbnMsXG4gICAgZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzOiBxdWVzdGlvbm5haXJlcy5kaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXMsXG4gICAgZGlySFRNTFF1ZXN0aW9ubmFpcmU6IHF1ZXN0aW9ubmFpcmVzLmRpckhUTUxRdWVzdGlvbm5haXJlLFxuICAgIGRpcldlYlF1ZXN0aW9ubmFpcmU6IHF1ZXN0aW9ubmFpcmVzLmRpcldlYlF1ZXN0aW9ubmFpcmVcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxueyAgICBcbiAgICAvLyBBUEkncm91dGVzIChhZnRlciBcImFwaVVybFwiIGRlZmluZWQgaW4gaW5zdGFuY2UuanMpXG4gICAgcXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcXVlc3Rpb25uYWlyZVwiLFxuICAgIGdldFF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL2dldFwiLFxuICAgIHByZXZpZXdRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9wcmV2aWV3XCIsXG4gICAgcHVibGlzaGVkUXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcXVpei9cIixcbiAgICBzYXZlQW5zd2Vyc1JvdXRlOiBcIi9hbnN3ZXIvXCIsXG4gICAgZ2V0U3RhdHNRdWVzdGlvbm5haXJlcyA6IFwiL3N0YXRzL1wiLFxuICAgIHNlYXJjaFF1ZXN0aW9ubmFpcmVzUm91dGUgOiBcIi9zZWFyY2hcIixcbiAgICBzZWFyY2hBZG1pblF1ZXN0aW9ubmFpcmVzUm91dGUgOiBcIi9zZWFyY2hhZG1pblwiLFxuICAgIGdldExpc3ROZXh0UXVlc3Rpb25uYWlyZXM6IFwiL2dldGxpc3RuZXh0cXVlc3Rpb25uYWlyZXMvXCIsXG4gICAgLy8gLS0gcXVlc3Rpb25zICYgY2hvaWNlcyA6XG4gICAgcXVlc3Rpb25zUm91dGU6IFwiL3F1ZXN0aW9uL1wiLFxuICAgIC8vIC0tIHRhZ3MgOlxuICAgIHRhZ3NTZWFyY2hSb3V0ZTogXCIvdGFncy9zZWFyY2gvXCIsXG4gICAgLy8gLS0gYW5zd2VycyA6XG4gICAgZ2V0UXVlc3Rpb25uYWlyZXNXaXRob3V0QW5zd2VyOiBcIi93aXRob3V0YW5zd2VyL3VzZXIvXCIsXG4gICAgZ2V0UHJldmlvdXNBbnN3ZXJzOiBcIi91c2VyL2Fuc3dlcnMvXCIsXG4gICAgZ2V0U3RhdHNBbnN3ZXJzIDogXCIvdXNlci9hbndzd2Vycy9zdGF0cy9cIixcbiAgICBnZXRBZG1pblN0YXRzOiBcIi9nZXRhZG1pbnN0YXRzL1wiLFxuICAgIC8vIGZvcm1zIDogw6AgY29tcGzDqXRlciBhdmVjIHZhbGV1cnMgcGFyIGTDqWZhdXQsIGV0Yy4gY2YgbW9kw6hsZVxuICAgIFF1ZXN0aW9ubmFpcmUgOlxuICAgIHtcbiAgICAgICAgdGl0bGU6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgIHNsdWc6IHsgbWF4bGVuZ3RoOiAxNTAgfSwgLy8gY2hhbXAgcmVxdWlzIG1haXMgY2FsY3Vsw6kgw6AgcGFydGlyIGR1IHRpdHJlIHFkIHZpZGVcbiAgICAgICAgaW50cm9kdWN0aW9uOiB7IHJlcXVpcmVkOiB0cnVlIH1cbiAgICB9LFxuICAgIHNlYXJjaFF1ZXN0aW9ubmFpcmVzIDogeyBtaW5sZW5ndGg6IDMsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgUXVlc3Rpb24gOlxuICAgIHtcbiAgICAgICAgdGV4dDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgcmFuazogeyByZXF1aXJlZDogdHJ1ZSwgbWluOjEsIGRlZmF1bHRWYWx1ZToxIH1cbiAgICB9LCAgICAgICAgICBcbiAgICBDaG9pY2UgOlxuICAgIHtcbiAgICAgICAgdGV4dDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfVxuICAgIH0sICAgICAgICAgIFxuICAgIG5iUXVlc3Rpb25zTWluOiAxLFxuICAgIG5iUXVlc3Rpb25zTWF4OiAxMCxcbiAgICBuYkNob2ljZXNNYXg6IDEwLFxuICAgIG5iVGFnc01pbjogMCxcbiAgICBuYlRhZ3NNYXg6IDAsIC8vIDAgPSBub3QgbWF4ICAgIFxuICAgIC8vIEpTT04gYW5kIEhUTUwgZGlyXG4gICAgZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXNcIixcbiAgICBkaXJDYWNoZVF1ZXN0aW9ucyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXMvcXVlc3Rpb25zXCIsXG4gICAgZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzIDogXCJkYXRhcy91c2Vycy9xdWVzdGlvbm5haXJlc1wiLFxuICAgIGRpckNhY2hlVGFncyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXMvdGFnc1wiLCAgXG4gICAgZGlySFRNTFF1ZXN0aW9ubmFpcmUgOiBcImZyb250L3B1YmxpYy9xdWl6XCIsXG4gICAgZGlySFRNTFRhZ3MgOiBcImZyb250L3B1YmxpYy9xdWl6c1wiLFxuICAgIGRpcldlYlF1ZXN0aW9ubmFpcmUgOiBcInF1aXpcIiwvL3BvdXIgdXJsIHBhZ2VcbiAgICBkaXJXZWJUYWdzIDogXCJxdWl6c1wiLy8gaWRlbVxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgLy8gQVBJJ3JvdXRlcyAoYWZ0ZXIgXCJhcGlVcmxcIiBkZWZpbmVkIGluIGluc3RhbmNlLmpzKVxuICAgIHVzZXJSb3V0ZXM6IFwiL3VzZXJcIixcbiAgICBzdWJzY3JpYmVSb3V0ZTogXCIvc2lnbnVwXCIsXG4gICAgZ2V0R29kZmF0aGVyUm91dGU6IFwiL2dldGdvZGZhdGhlcmlkXCIsXG4gICAgY2hlY2tJZklzRW1haWxmcmVlUm91dGU6IFwiL2lzZW1haWxmcmVlXCIsXG4gICAgY2hlY2tTdWJzY3JpYmVUb2tlblJvdXRlOiBcIi92YWxpZGF0aW9uL1wiLFxuICAgIGNoZWNrTG9naW5Sb3V0ZTogXCIvY2hlY2tsb2dpbi9cIixcbiAgICBjb25uZWN0aW9uUm91dGU6IFwiL2xvZ2luXCIsXG4gICAgZ2V0TG9naW5MaW5rUm91dGU6IFwiL2dldGxvZ2lubGlua1wiLFxuICAgIGNvbm5lY3Rpb25XaXRoTGlua1JvdXRlOiBcIi9jaGVja2xvZ2lubGlua1wiLFxuICAgIGdldFVzZXJJbmZvczogXCIvZ2V0L1wiLFxuICAgIGNyZWF0ZVVzZXJSb3V0ZTogXCIvY3JlYXRlXCIsXG4gICAgdmFsaWRhdGVVc2VyUm91dGU6IFwiL3ZhbGlkYXRlL1wiLFxuICAgIHVwZGF0ZVVzZXJJbmZvczogXCIvbW9kaWZ5L1wiLFxuICAgIHNlYXJjaFVzZXJSb3V0ZTogXCIvc2VhcmNoL1wiLFxuICAgIGdldEdvZENoaWxkczogXCIvZ2V0Z29kY2hpbGRzL1wiLFxuICAgIGNoZWNrTmV3TG9naW5MaW5rUm91dGU6IFwiL2NvbmZpcm1uZXdsb2dpbi9cIixcbiAgICBjaGVja0RlbGV0ZUxpbmtSb3V0ZTogXCIvY29uZmlybWRlbGV0ZS9cIixcbiAgICBnZXRQYXltZW50czogXCIvcGF5bWVudC9nZXRmb3JvbmV1c2VyL1wiLFxuICAgIHVuc3Vic2NyaWJlUm91dGU6IFwiL3N1YnNjcmlwdGlvbi9zdG9wL1wiLFxuICAgIGdldEFkbWluU3RhdHM6IFwiL2dldGFkbWluc3RhdHMvXCIsXG4gICAgLy8gZm9ybXMgOiDDoCBjb21wbMOpdGVyIGF2ZWMgdmFsZXVycyBwYXIgZMOpZmF1dCwgZXRjLiBjZiBtb2TDqGxlXG4gICAgbmFtZTogeyBtYXhsZW5ndGg6IDcwLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGVtYWlsOiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHBhc3N3b3JkOiB7IG1pbmxlbmd0aDogOCwgbWF4bGVuZ3RoOjcyLCByZXF1aXJlZDogdHJ1ZSB9LCAvLyBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9iY3J5cHQjc2VjdXJpdHktaXNzdWVzLWFuZC1jb25jZXJuc1xuICAgIG5ld1Bhc3N3b3JkOiB7IG1pbmxlbmd0aDogOCwgbWF4bGVuZ3RoOjcyIH0sXG4gICAgY29kZUdvZGZhdGhlcjogeyBtYXhsZW5ndGg6IDI1NSB9LFxuICAgIGNndU9rOiB7IHZhbHVlOiBcInRydWVcIiwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICB0aW1lRGlmZmVyZW5jZU1pbjogLTcyMCxcbiAgICB0aW1lRGlmZmVyZW5jZU1heDo4NDAsXG4gICAgLy8gSlNPTiBkaXJcbiAgICBkaXJDYWNoZVVzZXJzIDogXCJkYXRhcy91c2Vyc1wiLFxuICAgIGRpckNhY2hlVXNlcnNBbnN3ZXJzIDogXCJkYXRhcy91c2Vycy9xdWVzdGlvbm5haXJlcy9hbnN3ZXJzXCJcbn07XG4iLCJ2YXIgbWFwID0ge1xuXHRcIi4vZnIvZ2VuZXJhbFwiOiBcIi4uL2xhbmcvZnIvZ2VuZXJhbC5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi9sYW5nIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcL2dlbmVyYWwkXCI7IiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL3N1YnNjcmlwdGlvblwiOiBcIi4uL2xhbmcvZnIvc3Vic2NyaXB0aW9uLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvc3Vic2NyaXB0aW9uJFwiOyIsInZhciBtYXAgPSB7XG5cdFwiLi9mci91c2VyXCI6IFwiLi4vbGFuZy9mci91c2VyLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvdXNlciRcIjsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgc2l0ZUhUTUxUaXRsZSA6IFwiV2lraUxlcm5pIDogcXUnYWxsZXotdm91cyBhcHByZW5kcmUgYXVqb3VyZCdodWkgP1wiLFxuICAgIHNpdGVNZXRhRGVzY3JpcHRpb24gOiBcIkNoYXF1ZSBqb3VyLCB0ZXN0ZXogdm9zIGNvbm5haXNzYW5jZXMgZXQgYXBwcmVuZXogZGUgbm91dmVsbGVzIGNob3NlcyBhdmVjIFdpa2lMZXJuaS5cIixcbiAgICBzY3JpcHRUaW1pbmdJbmZvIDogXCJEdXLDqWUgZGUgbGEgcsOpcG9uc2UgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNjcmlwdFRpbWluZ0FsZXJ0IDogXCIqKiogU2NyaXB0IGxlbnQgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNlcnZlckVycm9yIDogXCJEw6lzb2zDqS4gVW5lIGVycmV1ciBpbXByw6l2dWUgZXN0IHN1cnZlbnVlLiBTaSBjZWxhIHBlcnNpc3RlLCBuJ2jDqXNpdGV6IMOgIHByw6l2ZW5pciBsJ2FkbWluaXN0cmF0ZXVyIGR1IHNpdGUuXCIsXG4gICAgc2VydmVyRXJyb3JBZG1pbiA6IFwiQnVnIGRlIGwnYXBwbGljYXRpb24gOlwiLFxuICAgIG5lZWRlZFBhcmFtcyA6IFwiRGVzIHBhcmFtw6h0cmVzIG7DqWNlc3NhaXJlcyBtYW5xdWFudHMgc29udCBtYW5xdWFudHMuXCIsXG4gICAgYmFkVXJsIDogXCJUZW50YXRpdmUgZCdhY2PDqHMgw6AgdW5lIHBhZ2UgbidleGlzdGFudCBwYXMgOlwiLFxuICAgIG5vdFZhbGlkRm9ybWF0IDogXCJGb3JtYXQgbm9uIHZhbGlkZS5cIixcbiAgICBub3RBbGxvd2VkIDogXCJWb3VzIG4nYXZleiBwYXMgbGVzIGRyb2l0cyBuw6ljZXNzYWlyZXMgcG91ciBjZXR0ZSBhY3Rpb24uXCIsXG4gICAgbm90UmVxdWlyZWQgOiBcIkZhY3VsdGF0aWYuXCIsXG4gICAgdXBkYXRlQnRuVHh0OiBcIk1vZGlmaWVyXCIsXG4gICAgYWRkQnRuVHh0OiBcIkFqb3V0ZXJcIixcbiAgICBkZWxldGVCdG5UeHQ6IFwiU3VwcHJpbWVyXCIsXG4gICAgYWRkT2tNZXNzYWdlIDogXCJMZXMgZG9ubsOpZXMgb250IGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llcy5cIixcbiAgICB1cGRhdGVPa01lc3NhZ2UgOiBcIkxhIG1pc2Ugw6Agam91ciDDoCBqb3VyIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgZGVsZXRlT2tNZXNzYWdlIDogXCJMYSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIGZhaWxBdXRoIDogXCJFcnJldXIgZCdhdXRoZW50aWZpY2F0aW9uLlwiLFxuICAgIGZhaWxBdXRoSGVhZGVyIDogXCJBYnNlbmNlIGRlIGhlYWRlciBBdXRob3JpemF0aW9uLlwiLFxuICAgIGZhaWxBdXRoVG9rZW4gOiBcIlRva2VuIGludmFsaWRlIG91IHV0aWxpc2F0ZXVyIG5vbiB0cm91dsOpLlwiLFxuICAgIGZhaWxBdXRoSWQgOiBcIklkZW50aWZpYW50IG5vbiB2YWxpZGUgOiBcIixcbiAgICBmYWlsQXV0aENyb24gOiBcIlRlbnRhdGl2ZSBkZSBsYW5jZW1lbnQgZCd1biBjcm9uIHNhbnMgbGUgYm9uIHRva2VuLlwiLFxuICAgIHByZXZpb3VzUGFnZSA6IFwiUGFnZSBwcsOpY8OpZGVudGVcIixcbiAgICBuZXh0UGFnZSA6IFwiUGFnZSBzdWl2YW50ZVwiLFxuICAgIGJ0bkxpbmtUb1F1ZXN0aW9ubmFpcmUgOiBcIkFsbGVyIGF1IHF1aXogIVwiLFxuICAgIHN0YXRzQWRtaW4gOiBcIkR1cmFudCBsZXMgZGVybmnDqHJlcyAyNGggOiBOQl9VU0VSU18yNEggY29tcHRlcyBvbnQgw6l0w6kgY3LDqcOpcywgTkJfU1VCU0NSSVBUSU9OU18yNEggdmFsaWTDqXMgZXQgTkJfVVNFUlNfREVMRVRFRF8yNEggc3VwcHJpbcOpcy4gTkJfQU5TV0VSU18yNEggcsOpcG9uc2VzIGF1eCBxdWl6cyBvbnQgw6l0w6kgZW5yZWdpc3Ryw6llcy48YnI+RW4gdG91dCwgaWwgeSBhIDogTkJfVVNFUlNfVE9UIGNvbXB0ZXMsIGRvbnQgTkJfU1VCU0NSSVBUSU9OU19UT1QgdmFsaWTDqXMgZXQgTkJfU1VCU0NSSVBUSU9OU19QUkVNSVVNIGNvbXB0ZXMgcHLDqW1pdW0uIE5CX0FOU1dFUlNfVE9UIHLDqXBvbnNlcyBhdXggcXVpenMgb250IMOpdMOpIGVucmVnaXN0csOpZXMuPGJyPlBhcm1pIGxlcyBOQl9VU0VSU19ERUxFVEVEX1RPVCBjb21wdGVzIHN1cHByaW3DqXMsIE5CX1VTRVJTX0RFTEVURURfVkFMSURFRCBhdmFpZW50IHZhbGlkw6kgbGV1ciBjb21wdGUgZXQgTkJfVVNFUlNfREVMRVRFRF9QUkVNSVVNIGF2YWllbnQgc291c2NyaXQgdW4gY29tcHRlIHByw6ltaXVtLlwiXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBuZWVkTnVtYmVyT2ZEYXlzIDogXCJJbCBmYXV0IHVuIG5vbWJyZSBkZSBqb3VycyBwb3VyIGwnYWJvbm5lbWVudC5cIixcbiAgICBuZWVkSW50ZWdlck51bWJlck9mRGF5cyA6IFwiTGUgbm9tYnJlIGRlIGpvdXJzIGRlIGwnYWJvbm5lbWVudCBkb2l0IMOqdHJlIHVuIG5vbWJyZSBlbnRpZXIuXCIsXG4gICAgbmVlZE1pbk51bWJlck9mRGF5cyA6IFwiTGUgbm9tYnJlIGRlIGpvdXJzIGRlIGwnYWJvbm5lbWVudCBuZSBwZXV0IMOqdHJlIG7DqWdhdGlmICFcIixcbiAgICBuZWVkTm90VG9vTG9uZ0RheXNMaXN0IDogXCJMYSBsaXN0ZSBkZSBqb3VycyBzw6lsZWN0aW9ubsOpcyBuJ2EgcGFzIGxlIGJvbiBmb3JtYXQgKHRyb3AgbG9uZ3VlKS5cIixcbiAgICBuZWVkVmFsaWREYXlzTGlzdCA6IFwiTGEgbGlzdGUgZGUgam91cnMgc8OpbGVjdGlvbm7DqXMgbidhIHBhcyBsZSBib24gZm9ybWF0LiBDYXJhY3TDqHJlIG5vbiB2YWxpZGUgOiBcIixcbiAgICBuZWVkVW5pcXVlRGF5c0xpc3QgOiBcIkxhIGxpc3RlIGRlIGpvdXJzIHPDqWxlY3Rpb25uw6lzIG4nYSBwYXMgbGUgYm9uIGZvcm1hdC4gRG91YmxvbiA6IFwiLFxuICAgIG5lZWRLbm93SWZOb3RpY2VPayA6IFwiSWwgbWFucXVlIGwnaW5mb3JtYXRpb24gc3VyIGwnYWNjZXB0YXRpb24gb3Ugbm9uIGRlIHJlY2V2b2lyIGRlcyBub3RpZmljYXRpb25zLlwiLFxuICAgIHVuc3Vic2NyaXB0aW9uT2sgOiBcIlZvdHJlIGRlbWFuZGUgYSBiaWVuIMOpdMOpIHByaXNlIGVuIGNvbXB0ZS4gVm91cyBuZSByZWNldnJleiBwbHVzIGRlIG1lc3NhZ2VzIHZlbmFudCBkdSBzaXRlLCBzYXVmIHBvdXIgdm91cyBzaWduYWxlciBsYSBmaW4gZGUgdm90cmUgYWJvbm5lbWVudC48YnI+Tidow6lzaXRleiBwYXMgPGEgaHJlZj0nLyNVUkwnPsOgIGFjY8OpZGVyIMOgIHZvdHJlIGNvbXB0ZTwvYT4gcG91ciBkZSBub3V2ZWF1IGF1dG9yaXNlciBjZXJ0YWlucyBlbnZvaXMuXCIsXG4gICAgdW5zdWJzY3JpcHRpb25GYWlsIDogXCJTaSB2b3VzIHZveWV6IGNlIG1lc3NhZ2UsIGMnZXN0IHF1ZSB2b3RyZSBsaWVuIGRlIGTDqXNhYm9ubmVtZW50IG5lIGZvbmN0aW9ubmUgcGFzLjxicj5Wb3VzIHBvdXZleiA8YSBocmVmPScvI1VSTCc+YWNjw6lkZXIgw6Agdm90cmUgY29tcHRlPC9hPiBwb3VyIGTDqXNhY3RpdmVyIGxlcyBlbnZvaXMgbWFudWVsbGVtZW50LlwiLFxuICAgIGFsbFN1YnNjcmlwdGlvblByb2Nlc3NlZCA6IFwiVG91cyBsZXMgYWJvbm7DqXMgb250IMOpdMOpIHRyYWl0w6lzIHBvdXIgbGUgbW9tZW50LlwiLFxuICAgIG1haWxOZXdRdWVzdGlvbm5haXJlU3ViamVjdCA6IFwiUXUnYWxsZXotdm91cyBhcHByZW5kcmUgYXVqb3VyZCdodWkgP1wiLFxuICAgIG1haWxOZXdRdWVzdGlvbm5haXJlQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuXFxuVW4gbm91dmVhdSBxdWl6IHZpZW50IGRlIHZvdXMgw6p0cmUgcHJvcG9zw6kgOlxcblFVRVNUSU9OTkFJUkVfVVJMXFxuXFxuQm9ubmUgbGVjdHVyZSAhXFxuXFxuU3RvcHBlciBsZXMgZW52b2lzID9cXG5VTlNVQlNDUklCRV9VUkxcIixcbiAgICBtYWlsTmV3UXVlc3Rpb25uYWlyZUJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz5NQUlMX0lOVFJPRFVDVElPTjx1bD48bGk+PGEgaHJlZj1cXFwiTElOS19VUkxcXFwiIHRpdGxlPVxcXCJMSU5LX1RJVExFXFxcIj5MaXJlIGwnYXJ0aWNsZS48L2E+PC9saT48bGk+PGEgaHJlZj1cXFwiUVVFU1RJT05OQUlSRV9VUkxcXFwiPkFsbGV6IGF1IHF1aXouPC9hPjwvbGk+PC91bD48cD48YSBocmVmPVxcXCJVTlNVQlNDUklCRV9VUkxcXFwiPlN0b3BwZXIgbGVzIGVudm9pcy48L2E+PC9wPlwiLFxuICAgIG5vTmV3UXVlc3Rpb25uYWlyZUZvclVzZXIgOiBcIkF1Y3VuIG5vdXZlYXUgcXVlc3Rpb25uYWlyZSB0cm91dsOpIHBvdXIgdW4gYWJvbm7DqSA6IFwiLFxuICAgIG1haWxFbmRGcmVlVGltZVN1YmplY3Q6IFwiVm90cmUgYWJvbm5lbWVudCBncmF0dWl0IHZhIGV4cGlyZXJcIixcbiAgICBtYWlsRW5kRnJlZVRpbWVCb2R5VHh0OiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblZvdHJlIGFib25uZW1lbnQgZ3JhdHVpdCDDoCBTSVRFX05BTUUgdmEgZXhwaXJlciBkJ2ljaSBxdWVscXVlcyBqb3Vycy5cXG5Qb3VyIGNvbnRpbnVlciDDoCB1dGlsaXNlciBsZSBzaXRlLCB2b3VzIHBvdXZleiBzb3VzY3JpcmUgw6AgdW4gYWJvbm5lbWVudCBkw6hzIGF1am91cmQnaHVpIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxFbmRGcmVlVGltZUJvZHlIVE1MOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlZvdHJlIGFib25uZW1lbnQgZ3JhdHVpdCDDoCBTSVRFX05BTUUgdmEgZXhwaXJlciBkJ2ljaSBxdWVscXVlcyBqb3Vycy4gUG91ciBjb250aW51ZXIgw6AgdXRpbGlzZXIgbGUgc2l0ZSwgdm91cyBwb3V2ZXogc291c2NyaXJlIMOgIHVuIGFib25uZW1lbnQgZMOocyBhdWpvdXJkJ2h1aSBlbiA8YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+Y2xpcXVleiBpY2k8L2E+IHNhbnMgdGFyZGVyLjwvcD5cIixcbiAgICBtYWlsRW5kRnJlZVRpbWVNZXNzYWdlOiBcIiByZWxhbmNlcyBlbnZvecOpZXMuXCIsXG4gICAgbWFpbEV4cGlyYXRpb25TdWJqZWN0OiBcIlZvdHJlIGFib25uZW1lbnQgdmEgYmllbnTDtHQgZXhwaXJlclwiLFxuICAgIG1haWxFeHBpcmF0aW9uQm9keVR4dDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5Wb3RyZSBhYm9ubmVtZW50IGdyYXR1aXQgw6AgU0lURV9OQU1FIHZhIGV4cGlyZXIgZCdpY2kgcXVlbHF1ZXMgam91cnMuXFxuUG91ciBjb250aW51ZXIgw6AgdXRpbGlzZXIgbGUgc2l0ZSwgdm91cyBwb3V2ZXogbGUgcHJvbG9uZ2VyIGTDqHMgYXVqb3VyZCdodWkgOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbEV4cGlyYXRpb25Cb2R5SFRNTDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Wb3RyZSBhYm9ubmVtZW50IMOgIFNJVEVfTkFNRSB2YSBleHBpcmVyIGQnaWNpIHF1ZWxxdWVzIGpvdXJzLjxicj5Qb3VyIGNvbnRpbnVlciDDoCB1dGlsaXNlciBsZSBzaXRlLCB2b3VzIHBvdXZleiBsZSBwcm9sb25nZXIgZMOocyBhdWpvdXJkJ2h1aSBlbiA8YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+Y2xpcXVhbnQgaWNpPC9hPi48L3A+XCIsXG4gICAgbWFpbEV4cGlyYXRpb25NZXNzYWdlOiBcIkZJUlNUIHByZW1pw6hyZXMgZXQgU0VDT05EIGRldXhpw6htZXMgcmVsYW5jZXMgZW52b3nDqWVzIHBvdXIgZGVzIGFib25uZW1lbnRzIGV4cGlyYW50IGQnaWNpIHBldS5cIixcbiAgICBpbmZvc05iRGF5czogXCJWb3RyZSBhYm9ubmVtZW50IGVzdCBlbmNvcmUgdmFsYWJsZSA8Yj5wZW5kYW50IE5CX0RBWVMgam91cnM8L2I+Ljxicj5Wb3VzIHBvdXZleiDDoCB0b3V0IG1vbWVudCBwcm9sb25nZXIgdm90cmUgYWJvbm5lbWVudCBlbiBzdWl2YW50IGxlcyBpbmRpY2F0aW9ucyBjaS1kZXNzb3VzIDpcIixcbiAgICBpbmZvc0V4cGlyYXRlZDogXCJWb3RyZSBhYm9ubmVtZW50IGEgZXhwaXLDqSwgbWFpcyBpbCB2b3VzIHJlc3RlIGVuY29yZSBxdWVscXVlcyBqb3VycyBhdmFudCBxdWUgdm90cmUgY29tcHRlIGV0IHZvcyBkb25uw6llcyBuZSBzb2llbnQgY29tcGzDqHRlbWVudCBzdXBwcmltw6llcy48YnI+UG91ciBjZSBmYWlyZSwgc3VpdmV6IHNhbnMgdGFyZGVyIGxlcyBpbmRpY2F0aW9ucyBjaS1kZXNzb3VzIDpcIixcbiAgICBpbmZvc05iRGF5c0FkbWluOiBcIkNldCBhYm9ubmVtZW50IGVzdCBlbmNvcmUgdmFsYWJsZSA8Yj5wZW5kYW50IE5CX0RBWVMgam91cnM8L2I+LlwiLFxuICAgIGluZm9zRXhwaXJhdGVkQWRtaW46IFwiQ2V0IGFib25uZW1lbnQgYSBleHBpcsOpLlwiLCAgXG4gICAgaXNOb3RWYWxpZGVkIDogXCJDZXQgdXRpbGlzYXRldXIgbidhIHBhcyBlbmNvcmUgdmFsaWTDqSBzb24gY29tcHRlLjxicj5Wb3VzIHBvdXZleiBsZSBmYWlyZSDDoCBzYSBwbGFjZSA8YSBocmVmPScjdmFsaWRhdGlvbk9rJz5lbiBjb2NoYW50IGxhIGNhc2UgaW5kaXF1w6llPC9hPiBldCBlbnJlZ2lzdHJhbnQuXCIsXG4gICAgaW5mb3NQYXltZW50c0FkbWluIDogXCJEQVRFX1BBWU1FTlQgOiBwYWllbWVudCBkZSBBTU9VTlQg4oKsIGF1IG5vbSBkZSBDTElFTlRfTkFNRS5cIixcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgbm90Rm91bmQ6IFwiTCd1dGlsaXNhdGV1ciBuJ2EgcGFzIMOpdMOpIHRyb3V2w6kuXCIsXG4gICAgbmVlZE5hbWU6IFwiTWVyY2kgZGUgY2hvaXNpciB1biBub20gZCd1dGlsaXNhdGV1ci5cIixcbiAgICBuZWVkTm90VG9vTG9uZ05hbWU6IFwiTWVyY2kgZGUgY2hvaXNpciB1biBub20gZCd1dGlsaXNhdGV1ciBuZSBjb21wdGFudCBwYXMgcGx1cyBkZSA3MCBjYXJhY3TDqHJlcy5cIixcbiAgICBuZWVkRW1haWw6IFwiTWVyY2kgZGUgc2Fpc2lyIHZvdHJlIGFkcmVzc2UgZS1tYWlsLlwiLFxuICAgIG5lZWRVbmlxdWVFbWFpbDogXCJMJ2FkcmVzc2UgZS1tYWlsIHF1ZSB2b3VzIGF2ZXogc2Fpc2llIGVzdCBkw6lqw6AgdXRpbGlzw6llIHBhciB1biBhdXRyZSB1dGlsaXNhdGV1ci4gU2kgdm91cyBhdmV6IGTDqWrDoCB1biBjb21wdGUsIDxhIGhyZWY9Jy8jVVJMJz5jbGlxdWV6LWljaSBwb3VyIHZvdXMgY29ubmVjdGVyPC9hPi5cIixcbiAgICBuZWVkTm90VG9vTG9uZ0VtYWlsOiBcIk1lcmNpIGRlIHNhaXNpciB1bmUgYWRyZXNzZSBlLW1haWwgbmUgY29tcHRhbnQgcGFzIHBsdXMgZGUgMjU1IGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRQYXNzV29yZCA6IFwiTWVyY2kgZGUgZm91cm5pciB1biBtb3QgZGUgcGFzc2UuXCIsXG4gICAgbmVlZExvbmdQYXNzV29yZCA6IFwiTWVyY2kgZGUgZm91cm5pciB1biBtb3QgZGUgcGFzc2UgZCdhdSBtb2lucyBNSU5fTEVOR1RIIGNhcmFjdMOocmVzLlwiLFxuICAgIHBhc3N3b3JkQ29waWVkOiBcIkxlIG1vdCBkZSBwYXNzZSBnw6luw6lyw6kgYSDDqXTDqSBjb3Bpw6kgZGFucyBsZSBwcmVzc2UtcGFwaWVyLiBWb3VzIHBvdXZleiBsZSByZWNvcGllciBvw7kgdm91cyBsZSBzb3VoYWl0ZXIuXCIsXG4gICAgbmVlZFN0YXR1cyA6IFwiSWwgbWFucXVlIGxlIHN0YXR1dC5cIixcbiAgICBuZWVkTGFuZ3VhZ2UgOiBcIklsIG1hbnF1ZSBsZSBjb2RlIGxhbmd1ZS5cIixcbiAgICBuZWVkVmFsaWRMYXN0Q29ubmVjdGlvbkRhdGUgOiBcIkxhIGRhdGUgZGUgZGVybmnDqHJlIGNvbm5leGlvbiBuJ2VzdCBwYXMgdmFsaWRlLlwiLFxuICAgIG5lZWRTTVRQIDogXCJJbCBtYW5xdWUgbGUgc2VydmV1ciBTTVRQLlwiLFxuICAgIG5lZWRTTVRQTm90Rm91bmQgOiBcIklsIG1hbnF1ZSBsZSBzZXJ2ZXVyIFNNVFAuXCIsXG4gICAgbmVlZEtub3dOZXdzbGV0dGVyT2sgOiBcIklsIGZhdXQgc2F2b2lyIHNpIGwndXRpbGlzYXRldXIgYWNjZXB0ZSBvdSByZWZ1c2UgZGUgcmVjZXZvaXIgbGEgbmV3c2xldHRlci5cIixcbiAgICBuZWVkVGltZURpZmZlcmVuY2UgOiBcIklsIGZhdXQgY29ubmHDrnRyZSBsZSBub21icmUgZGUgbWludXRlcyBkdSBkw6ljYWxhZ2UgaG9yYWlyZS5cIixcbiAgICBuZWVkTWluVGltZURpZmZlcmVuY2UgOiBcIklsIGZhdXQgZm91cm5pciB1biBub21icmUgZGUgbWludXRlcyDDoCBlbmxldmVyIMOgIGwnaGV1cmUgR01UIG5lIGTDqXBhc3NhbnQgcGFzIDcyMC5cIixcbiAgICBuZWVkTWF4VGltZURpZmZlcmVuY2UgOiBcIklsIGZhdXQgZm91cm5pciB1biBub21icmUgZGUgbWludXRlcyDDoCBham91dGVyIMOgIGwnaGV1cmUgR01UIG5lIGTDqXBhc3NhbnQgcGFzIDg0MC5cIixcbiAgICBuZWVkVUdDT2sgOiBcIlZvdXMgZGV2ZXogYWNjZXB0ZXIgbGVzIENHVSBwb3VyIHBvdXZvaXIgY3LDqWVyIHZvdHJlIGNvbXB0ZS4gXCIsXG4gICAgZ29kZmF0aGVyTm90Rm91bmQ6IFwiQXVjdW4gdXRpbGlzYXRldXIgdmFsaWRlIHRyb3V2w6kgcG91ciBjZSBjb2RlIHBhcnJhaW4uXCIsXG4gICAgZ29kZmF0aGVyRm91bmQ6IFwiVm90cmUgcGFycmFpbiBhIGJpZW4gw6l0w6kgdHJvdXbDqSAhXCIsXG4gICAgbWFpbFZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGluc2NyaXB0aW9uIGVzdCBiaWVuIGVucmVnaXN0csOpZS5cXG5Qb3VyIGxhIGZpbmFsaXNlciwgbWVyY2kgZGUgY2xpcXVlciBkYW5zIGxlcyAyNEggc3VyIGxlIGxpZW4gZGUgY29uZmlybWF0aW9uIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbC5cIixcbiAgICBtYWlsVmFsaWRhdGlvbkxpbmtTdWJqZWN0IDogXCJNZXJjaSBkZSB2YWxpZGVyIHZvdHJlIGNvbXB0ZVwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1NCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5cXG5Qb3VyIHZhbGlkZXIgdm90cmUgY29tcHRlLCBtZXJjaSBkZSBjbGlxdWVyIHN1ciBsZSBsaWVuIHN1aXZhbnQgZGFucyBsZXMgMjRoIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1NCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+UG91ciB2YWxpZGVyIHZvdHJlIGNvbXB0ZSwgbWVyY2kgZGUgY2xpcXVlciBzdXIgbGUgbGllbiBzdWl2YW50IGRhbnMgbGVzIDI0aC48L3A+PHA+PGEgaHJlZj1cXFwiTElOS19VUkxcXFwiPlZhbGlkZXIuPC9hPjwvcD5cIixcbiAgICB2YWxpZGF0aW9uTWVzc2FnZTogXCJWb3RyZSBjb21wdGUgdmllbnQgYmllbiBkJ8OqdHJlIHZhbGlkw6kuIE1lcmNpIGV0IGJpZW52ZW51ZSAhPGJyPlZvdXMgcG91dmV6IHNhbnMgdGFyZGVyIHZvdXMgY29ubmVjdGVyIGNpLWRlc3NvdXMgcG91ciBhY2PDqWRlciDDoCB2b3RyZSBjb21wdGUuXCIsXG4gICAgdmFsaWRhdGlvbk1lc3NhZ2VBZG1pbjogXCJMZSBjb21wdGUgYSBiaWVuIMOpdMOpIHZhbGlkw6kuXCIsXG4gICAgdmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlOiBcIklsIHNlbWJsZSBxdWUgdm91cyBheWV6IGTDqWrDoCB2YWxpZMOpIHZvdHJlIGNvbXB0ZS5cIixcbiAgICB2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2VBZG1pbjogXCJDZSBjb21wdGUgYSBkw6lqw6Agw6l0w6kgdmFsaWTDqS5cIixcbiAgICBtYWlsV2VsY29tZVN1YmplY3QgOiBcIkJpZW52ZW51ZSAhXCIsXG4gICAgbWFpbFdlbGNvbWVCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5Wb3RyZSB2ZW5leiBkZSB2YWxpZGVyIHZvdHJlIGluc2NyaXB0aW9uIMOgIE5PTV9TSVRFLlxcbk1lcmNpIGV0IMOgIGJpZW50w7R0ICFcIixcbiAgICBtYWlsV2VsY29tZUJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Wb3RyZSB2ZW5leiBkZSB2YWxpZGVyIHZvdHJlIGluc2NyaXB0aW9uIMOgIE5PTV9TSVRFLjwvcD48cD5NZXJjaSBldCDDoCBiaWVudMO0dCAhPC9wPlwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlclN1YmplY3QgOiBcIk1lcmNpICFcIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5HcsOiY2Ugw6Agdm91cyB1biBub3V2ZWwgdXRpbGlzYXRldXIgKEVNQUlMKSB2aWVudCBkZSBzJ2luc2NyaXJlIHN1ciBOT01fU0lURS5cXG5NZXJjaSBldCDDoCBiaWVudMO0dCAhXCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPkdyw6JjZSDDoCB2b3VzIHVuIG5vdXZlbCB1dGlsaXNhdGV1ciAoRU1BSUwpIHZpZW50IGRlIHMnaW5zY3JpcmUgc3VyIE5PTV9TSVRFLjwvcD48cD5NZXJjaSBldCDDoCBiaWVudMO0dCAhPC9wPlwiLFxuICAgIGJhZExpbmtWYWxpZGF0aW9uTWVzc2FnZTogXCJWb3RyZSBsaWVuIGRlIGNvbmZpcm1hdGlvbiBuZSBzZW1ibGUgcGFzIHZhbGlkZSBvdSBiaWVuIGlsIGEgZXhwaXLDqS4gVm91cyBwb3V2ZXogZW4gcmVjZXZvaXIgdW4gbm91dmVhdSA8YSBocmVmPScjVVJMJz5lbiBjbGlxdWFudCBpY2k8L2E+LlwiLFxuICAgIGVtYWlsTm90Rm91bmQ6IFwiQXVjdW4gdXRpbGlzYXRldXIgdHJvdXbDqSBwb3VyIGNldHRlIGFkcmVzc2UgZS1tYWlsLlwiLFxuICAgIGFscmVhZHlDb25uZWN0ZWQ6IFwiVm91cyDDqnRlcyBkw6lqw6AgY29ubmVjdMOpKGUpIGF1IHNpdGUgIVwiLFxuICAgIG5lZWRCZUNvbm5lY3RlZDogXCJWb3VzIGRldmV6IMOqdHJlIGNvbm5lY3TDqShlKSBwb3VyIGFjY8OpZGVyIMOgIGNldHRlIHBhZ2UuXCIsXG4gICAgY29ubmVjdGlvbk9rOiBcIkNvbm5leGlvbiByw6l1c3NpZS5cIixcbiAgICBuZWVkQ2hvb3NlTG9naW5XYXk6IFwiVm91cyBkZXZleiBzb2l0IHNhaXNpciB2b3RyZSBtb3QgZGUgcGFzc2UsIHNvaXQgY29jaGVyIGxhIGNhc2Ugdm91cyBwZXJtZXR0YW50IGRlIHJlY2V2b2lyIHVuIGxpZW4gZGUgY29ubmV4aW9uIHBhciBlLW1haWwuXCIsXG4gICAgbmVlZFZhbGlkYXRpb25Ub0xvZ2luIDogXCJWb3VzIGRldmV6IGQnYWJvcmQgdmFsaWRlciB2b3RyZSBjb21wdGUgYXZhbnQgZGUgdm91cyBjb25uZWN0ZXIuIFBvdXIgY2UgZmFpcmUsIHVuIGxpZW4gdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHBhciBlLW1haWwuXCIsXG4gICAgdG9vTWFueUxvZ2luRmFpbHMgOiBcIlRyb3AgZGUgdGVudGF0aXZlcyBkZSBjb25uZXhpb24gaW5mcnVjdHVldXNlcyBwb3VyIGNldHRlIGFkcmVzc2UgZS1tYWlsLiBWb3VzIGRldmV6IGF0dGVuZHJlIE1JTlVURVMgbWludXRlcyBwb3VyIGVzc2F5ZXIgZGUgbm91dmVhdS5cIixcbiAgICBiYWRQYXNzd29yZDogXCJMZSBtb3QgZGUgcGFzc2Ugbidlc3QgcGFzIGxlIGJvbi5cIixcbiAgICBtYWlsTG9naW5MaW5rU3ViamVjdCA6IFwiVm90cmUgbGllbiBkZSBjb25uZXhpb24uXCIsXG4gICAgbWFpbExvZ2luTGlua0JvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblBvdXIgdm91cyBjb25uZWN0ZXIgw6Agdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOiBMSU5LX1VSTFwiLFxuICAgIG1haWxMb2dpbkxpbmtCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+UG91ciB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6PC9wPjxwPjxhIGhyZWY9XFxcIkxJTktfVVJMXFxcIj5WYWxpZGVyLjwvYT48L3A+XCIsXG4gICAgbWFpbExvZ2luTGlua01lc3NhZ2UgOiBcIlVuIGxpZW4gZGUgY29ubmV4aW9uIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBzdXIgdm90cmUgYWRyZXNzZSBlLW1haWwuIE5lIHRhcmRleiBwYXMgw6AgbCd1dGlsaXNlciwgY2FyIGlsIG4nZXN0IHZhbGFibGUgcXVlIGR1cmFudCBcIixcbiAgICB1cGRhdGVkT2tNZXNzYWdlOiBcIlZvcyBpbmZvcm1hdGlvbnMgb250IGJpZW4gw6l0w6kgbWlzZXMgw6Agam91ci5cIixcbiAgICB1cGRhdGVkTmVlZEdvb2RFbWFpbCA6IFwiTWFpcyBsYSBub3V2ZWxsZSBhZHJlc3NlIGUtbWFpbCBuJ2EgcHUgw6p0cmUgZW5yZWdpc3Ryw6llIGNhciBlbGxlIG4nYSBwYXMgdW5lIGZvcm1hdCBjb3JyZWN0LlwiLFxuICAgIHVwZGF0ZWROZWVkVW5pcXVlRW1haWwgOiBcIk1haXMgbGEgbm91dmVsbGUgYWRyZXNzZSBlLW1haWwgc2Fpc2llIChORVdfRU1BSUwpIG4nYSBwdSDDqnRyZSBlbnJlZ2lzdHLDqWUsIGNhciBlbGxlIGVzdCBkw6lqw6AgdXRpbGlzw6llIHBvdXIgdW4gYXV0cmUgY29tcHRlLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpblN1YmplY3QgOiBcIk1lcmNpIGRlIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cy5cIixcbiAgICBtYWlsVXBkYXRlTG9naW5Cb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5Qb3VyIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cyBkZSBjb25uZXhpb24sIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6XFxuTElOS19VUkxcIixcbiAgICBtYWlsVXBkYXRlTG9naW5Cb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+UG91ciB2YWxpZGVyIHZvcyBub3V2ZWF1eCBpZGVudGlmaWFudHMgZGUgY29ubmV4aW9uLCA8YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+Y2xpcXVleiBpY2k8L2E+IHNhbnMgdGFyZGVyLjwvcD5cIixcbiAgICBtYWlsVXBkYXRlTG9naW5MaW5rTWVzc2FnZTogXCJDZXBlbmRhbnQsIHZvdXMgYXZleiBtb2RpZmnDqSBhdSBtb2lucyB1biBkZSB2b3MgaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiAoZW1haWwgZXQvb3UgbW90IGRlIHBhc3NlKSBldCA8Yj52b3VzIGRldmV6IGNsaXF1ZXIgc3VyIGxlIGxpZW4gcXVpIHZpZW50IGRlIHZvdXMgw6p0cmVzIGVudm95w6kgc3VyIHZvdHJlIGFkcmVzc2UgKE5FV19FTUFJTCkgcG91ciB2YWxpZGVyIGNlIGNoYW5nZW1lbnQ8L2I+LiBFbiBhdHRlbmRhbnQsIG1lcmNpIGRlIGNvbnRpbnVlciDDoCB1dGlsaXNlciB2b3MgYW5jaWVucyBpZGVudGlmaWFudHMuXCIsXG4gICAgdXBkYXRlZE5lZWRWYWxpZGF0ZWRVc2VyOiBcIkwndXRpbGlzYXRldXIgcXVlIHZvdXMgc291aGFpdMOpIG1vZGlmaWVyIG4nZXhpc3RlIHBhcy9wbHVzIG91IG4nYSBwYXMgZW5jb3JlIHZhbGlkw6kgc29uIGNvbXB0ZS5cIixcbiAgICB1cGRhdGVkTmVlZEdvb2RHb2RmYXRoZXIgOiBcIk1haXMgbGUgbm91dmVhdSBjb2RlIHBhcnJhaW4gbidhIHB1IMOqdHJlIHJldGVudSwgY2FyIGlsIG5lIGNvcnJlc3BvbmQgw6AgYXVjdW4gY29tcHRlIHV0aWxpc2F0ZXVyIG91IMOgIGwndXRpbGlzYXRldXIgbHVpLW3Dqm1lLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbk9rTWVzc2FnZTogXCJMYSBtaXNlIMOgIGpvdXIgZGUgdm9zIGlkZW50aWZpYW50cyBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIHVwZGF0ZWRGYWlsZWRHb2RmYXRoZXJOb3RGb3VuZCA6IFwiTCdpZGVudGlmaWFudCBmb3VybmkgcG91ciBsZSBwYXJyYWluIG5lIGNvcnJlc3BvbmQgw6AgYXVjdW4gdXRpbGlzYXRldXIuXCIsXG4gICAgY3JlYXRpb25Pa01lc3NhZ2U6IFwiTGUgbm91dmVsIHV0aWxpc2F0ZXVyIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqS5cIixcbiAgICBtYWlsRGVsZXRlU3ViamVjdCA6IFwiQ29uZmlybWVyIGxhIHN1cHByZXNzaW9uIGRlIHZvdHJlIGNvbXB0ZS5cIixcbiAgICBtYWlsRGVsZXRlQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuUG91ciB2YWxpZGVyIGxhIHN1cHByZXNzaW9uIGRlIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxEZWxldGVCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+UG91ciB2YWxpZGVyIGxhIHN1cHByZXNzaW9uIGRlIHZvdHJlIGNvbXB0ZSwgPGEgaHJlZj1cXFwiTElOS19VUkxcXFwiPmNsaXF1ZXogaWNpPC9hPiBzYW5zIHRhcmRlci48L3A+XCIsXG4gICAgbWFpbERlbGV0ZUxpbmtNZXNzYWdlOiBcIlZvdHJlIGRlbWFuZGUgZGUgc3VwcHJlc3Npb24gYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS4gTWVyY2kgZGUgY2xpcXVlciBzYW5zIHRhcmRlciBzdXIgbGUgbGllbiBxdWkgdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHBhciBlLW1haWwgcG91ciBjb25maXJtZXIuXCIsXG4gICAgZGVsZXRlT2tNZXNzYWdlOiBcIkwndXRpbGlzYXRldXIgYSBiaWVuIMOpdMOpIHN1cHByaW3DqS5cIixcbiAgICBkZWxldGVGYWlsTWVzc2FnZTogXCJUZW50YXRpdmUgZGUgc3VwcHJlc3Npb24gZCd1biB1dGlsaXNhdGV1ciBpbmV4aXN0YW50IDogXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtPa01lc3NhZ2U6IFwiVm90cmUgY29tcHRlIGEgYmllbiDDqXTDqSBzdXBwcmltw6kuIE1lcmNpIGQnYXZvaXIgdXRpbGlzw6kgbm9zIHNlcnZpY2VzLlwiLFxuICAgIG1haWxEZWxldGVMaW5rQWxyZWFkeU1lc3NhZ2U6IFwiSWwgc2VtYmxlIHF1ZSB2b3VzIGF5ZXogZMOpasOgIHZhbGlkw6kgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLlwiLFxuICAgIG1haWxEZWxldGVMaW5rRmFpbE1lc3NhZ2U6IFwiVm90cmUgbGllbiBkZSBzdXBwcmVzc2lvbiBuJ2VzdCBwYXMgdmFsaWRlIG91IGFsb3JzIGlsIG4nZXN0IHBsdXMgdmFsYWJsZS5cIixcbiAgICBjcm9uRGVsZXRlVW52YWxpZGVkVXNlcnNNZXNzYWdlOiBcIiBjb21wdGVzIHV0aWxpc2F0ZXVycyBub24gdmFsaWTDqXMgb250IMOpdMOpIHN1cHByaW3DqXMuXCIsXG4gICAgZGVsZXRlSW5hY3RpdmVVc2Vyc01lc3NhZ2U6IFwiIGNvbXB0ZXMgdXRpbGlzYXRldXJzIGluYWN0aWZzIG9udCDDqXTDqSBzdXBwcmltw6lzLlwiLFxuICAgIHdlbGNvbWVNZXNzYWdlOiBcIkJpZW52ZW51ZSAjTkFNRSAhXCIsXG4gICAgYnllYnllTWVzc2FnZTogXCJTaSB2b3VzIHZveWV6IGNlIG1lc3NhZ2UsIGMnZXN0IHF1ZSB2b3RyZSBkw6ljb25uZXhpb24gcydlc3QgYmllbiBkw6lyb3Vsw6llLjxicj7DgCBiaWVudMO0dCAhXCIsXG4gICAgaW5mb3NVc2VyRm9yQWRtaW46IFwiQ2V0IHV0aWxpc2F0ZXVyIChpZDogSURfVVNFUikgYSA8Yj5jcsOpw6kgc29uIGNvbXB0ZSBsZSBEQVRFX0NSRUE8L2I+LCBsYSBkZXJuacOocmUgbWlzZSDDoCBqb3VyIGRhdGFudCBkdSBEQVRFX1VQREFURS48YnI+PGI+RGF0ZSBkZSBzYSBkZXJuacOocmUgY29ubmV4aW9uIDogREFURV9DT05ORUNUSU9OLjwvYj5cIixcbiAgICBpbmZvc0FkbWluR29kZmF0aGVyOiBcIkNldCB1dGlsaXNhdGV1ciBhIMOpdMOpIHBhcnJhaW7DqSBwYXIgXCIsXG4gICAgaW5mb3NBZG1pbk5iR29kQ2hpbGRzOiBcIlNlcyAjTkIgZmlsbGV1aWxzIDogXCJcbn07IiwiLy8gUXVlbHF1ZXMgZm9uY3Rpb25zIHV0aWxlcyBwb3VyIGxlcyBjaGHDrm5lc1xuXG5jbGFzcyBUb29sXG57XG4gICAgc3RhdGljIGlzRW1wdHkobXlWYXIpXG4gICAge1xuICAgICAgICBpZihteVZhcj09PXVuZGVmaW5lZCB8fCBteVZhcj09PW51bGwpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVZhcis9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVZhcj1teVZhci50cmltKCk7XG4gICAgICAgICAgICBpZihteVZhcj09PVwiXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIHN0YXRpYyB0cmltSWZOb3ROdWxsKG15U3RyaW5nKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KG15U3RyaW5nKSlcbiAgICAgICAgICAgIG15U3RyaW5nPW51bGw7XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgbXlTdHJpbmcrPVwiXCI7Ly8gc2kgYXV0cmUgY2hvc2UgcXUndW5lIGNoYcOubmUgZW52b3nDqS4uLlxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcudHJpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cblxuICAgIHN0YXRpYyBzaG9ydGVuSWZMb25nZXJUaGFuKG15U3RyaW5nLCBtYXgpXG4gICAge1xuICAgICAgICBteVN0cmluZys9XCJcIjsvLyBhdSBjYXMgb8O5IGNlbGEgbmUgc2VyYWl0IHBhcyB1bmUgY2hhw65uZS4uLlxuICAgICAgIGlmKG15U3RyaW5nLmxlbmd0aCA+IG1heClcbiAgICAgICAgICAgIG15U3RyaW5nPW15U3RyaW5nLnN1YnN0cmluZygwLCAobWF4LTMpKStcIi4uLlwiO1xuICAgICAgICByZXR1cm4gbXlTdHJpbmc7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTU2MDQxNDAvcmVwbGFjZS1tdWx0aXBsZS1zdHJpbmdzLXdpdGgtbXVsdGlwbGUtb3RoZXItc3RyaW5nc1xuICAgIHN0YXRpYyByZXBsYWNlQWxsKG15U3RyaW5nLCBtYXBPYmopXG4gICAge1xuICAgICAgICBjb25zdCByZXBsYWNlRWx0cyA9IG5ldyBSZWdFeHAoT2JqZWN0LmtleXMobWFwT2JqKS5qb2luKFwifFwiKSxcImdpXCIpO1xuICAgICAgICByZXR1cm4gbXlTdHJpbmcucmVwbGFjZShyZXBsYWNlRWx0cywgKG1hdGNoZWQpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBtYXBPYmpbbWF0Y2hlZF07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHNvdXJjZSA6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2ZyL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL09iamV0c19nbG9iYXV4L01hdGgvcmFuZG9tXG4gICAgc3RhdGljIGdldFJhbmRvbUludChtaW4sIG1heClcbiAgICB7XG4gICAgICAgIG1pbiA9IE1hdGguY2VpbChtaW4pO1xuICAgICAgICBtYXggPSBNYXRoLmZsb29yKG1heCk7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluKSkgKyBtaW47XG4gICAgfVxuXG4gICAgLy8gw6AgY29tcGzDqXRlciA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0RhdGVfZm9ybWF0X2J5X2NvdW50cnlcbiAgICBzdGF0aWMgZGF0ZUZvcm1hdChkYXRlU3RyaW5nLCBsYW5nPVwiZnJcIilcbiAgICB7XG4gICAgICAgIGlmKFRvb2wuaXNFbXB0eShkYXRlU3RyaW5nKSlcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICBsZXQgbXlEYXRlPW5ldyBEYXRlKGRhdGVTdHJpbmcpO1xuICAgICAgICBsZXQgbXlEYXk9bXlEYXRlLmdldERhdGUoKStcIlwiO1xuICAgICAgICBpZihteURheS5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlEYXk9XCIwXCIrbXlEYXk7XG4gICAgICAgIGxldCBteU1vdW50aD0obXlEYXRlLmdldE1vbnRoKCkrMSkrXCJcIjtcbiAgICAgICAgaWYobXlNb3VudGgubGVuZ3RoPT09MSlcbiAgICAgICAgICAgIG15TW91bnRoPVwiMFwiK215TW91bnRoO1xuICAgICAgICBsZXQgbXlZZWFyPW15RGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICBpZihsYW5nPT09XCJmclwiKVxuICAgICAgICAgICAgcmV0dXJuIG15RGF5K1wiL1wiK215TW91bnRoK1wiL1wiK215WWVhcjtcbiAgICAgICAgZWxzZSBpZiAobGFuZz09PVwiZm9ybVwiKS8vIDIwMTQtMDItMDlcbiAgICAgICAgICAgIHJldHVybiBteVllYXIrXCItXCIrbXlNb3VudGgrXCItXCIrbXlEYXk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBteU1vdW50aCtcIi9cIitteURheStcIi9cIitteVllYXI7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFRvb2w7IiwidmFyIG1hcCA9IHtcblx0XCIuL2RlZmF1bHQvY29uZmlnL2ZyLmpzXCI6IFwiLi4vdmlld3MvZGVmYXVsdC9jb25maWcvZnIuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vdmlld3Mgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwuanMkXCI7IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIGhlYWRMaW5rczpcbiAgICBbXG4gICAgICAgIHsgYW5jaG9yOiBcIkFjY3VlaWxcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiTW9uIGNvbXB0ZVwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY29ubmV4aW9uLmhtdFwiLCBpZDogXCJhY2NvdW50SGVhZExpbmtcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIsOAIHByb3Bvc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvYS1wcm9wb3MuaHRtbFwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQ29udGFjdFwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY29udGFjdC5odG1sXCIgfSB9LFxuICAgIF0sXG4gICAgZm9vdExpbmtzOlxuICAgIFtcbiAgICAgICAgeyBhbmNob3I6IFwiQ3LDqWRpdHNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2NyZWRpdHMuaHRtbFwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiTWVudGlvbnMgbMOpZ2FsZXNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL21lbnRpb25zLWxlZ2FsZXMuaHRtbFwiLCByZWw6IFwibm9mb2xsb3dcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkRvbm7DqWVzIHBlcnNvbm5lbGxlc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvZG9ubmVlcy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDLkcuVS5cIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2NndS5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQy5HLlYuXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jZ3YuaHRtbFwiLCByZWw6IFwibm9mb2xsb3dcIiB9IH0sXG4gICAgXSxcbiAgICBtYXhRdWVzdGlvbm5haXJlc0J5UGFnZTogMTAsXG4gICAgdXNlckhvbWVQYWdlIDogXCJhY2N1ZWlsLmh0bWxcIixcbiAgICBhZG1pbkhvbWVQYWdlIDogXCJhZG1pbi5odG1sXCIsXG4gICAgbWFuYWdlckhvbWVQYWdlIDogXCJnZXN0aW9uLmh0bWxcIixcbiAgICBzdWJzY3JpYmVQYWdlIDogXCJpbnNjcmlwdGlvbi5odG1sXCIsXG4gICAgY29ubmVjdGlvblBhZ2UgOiBcImNvbm5leGlvbi5odG1sXCIsXG4gICAgYWNjb3VudFBhZ2U6IFwiY29tcHRlLmh0bWxcIixcbiAgICBxdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlOiBcImdlc3Rpb24tcXVpenMuaHRtbFwiLFxuICAgIHVzZXJzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi11dGlsaXNhdGV1cnMuaHRtbFwiLFxuICAgIG5iUXVlc3Rpb25uYWlyZXNVc2VySG9tZVBhZ2UgOiAxMCxcbiAgICBpbGx1c3RyYXRpb25EaXIgOiBcIi9pbWcvcXVpenMvXCIsXG4gICAgc2l0ZVNsb2dhbjogXCJDdWx0aXZvbnMgbm90cmUgamFyZGluICFcIixcbiAgICBob21lVGl0bGUxOiBcIkRlIG5hdHVyZSBjdXJpZXVzZSA/XCIsXG4gICAgaG9tZVAxOiBcIkF2ZWMgV2lraUxlcm5pIHZvdXMgYXBwcmVuZXogY2hhcXVlIGpvdXIgZGUgbm91dmVsbGVzIGNob3Nlcy48YnI+RGVzIGFydGljbGVzIGRlIFdpa2lww6lkaWEgc29udCBzw6lsZWN0aW9ubsOpcyBwb3VyIHZvdXMgZXQgc29udCBzdWl2aXMgZCd1biBxdWl6IHZvdXMgcGVybWV0dGFudCBkZSB0ZXN0ZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUuPGJyPkRlIGpvdXIgZW4gam91ciBkZSBub3V2ZWxsZXMgZ3JhaW5lcyBkZSBzYXZvaXIgc29udCBhaW5zaSBzZW3DqWVzIGRhbnMgdm90cmUgXFxcImphcmRpblxcXCIuXCIsXG4gICAgaG9tZVRpdGxlMjogXCJMYSBjdWx0dXJlIGVuIGxpYmVydMOpXCIsXG4gICAgaG9tZVAyOiBcIlRvdXQgY29tbWUgc3VyIFdpa2lww6lkaWEgKCopLCBsZSBsb2dpY2llbCBldCBsZSBjb250ZW51IHBhcnRhZ8OpIHN1ciBXaWtpTGVybmkgc29udCBsaWJyZXMuPGJyPlZvdXMgcG91dmV6IGxlcyB1dGlsaXNlciwgbGVzIG1vZGlmaWVyIGV0IGxlcyBkaWZmdXNlciBzZWxvbiB2b3RyZSBzb3VoYWl0Ljxicj5TdXIgV2lraUxlcm5pLCBwYXMgZGUgcHVibGljaXTDqSwgbmkgZGUgY29tbWVyY2lhbGlzYXRpb24gZGUgdm9zIGRvbm7DqWVzIHBlcnNvbm5lbGxlcy48YnI+Vm91cyBwb3V2ZXogdmVuaXIgeSBcXFwiY3VsdGl2ZXIgdm90cmUgamFyZGluXFxcIiBlbiB0b3V0ZSB0cmFucXVpbGxpdMOpLjxicj48YnI+PHNtYWxsPjxlbT4oKikgQmllbiBxdWUgcGFydGFnZWFudCBzZXMgdmFsZXVycywgV2lraUxlcm5pIGVzdCB1biBwcm9qZXQgaW5kw6lwZW5kYW50IGRlIGxhIGZvbmRhdGlvbiBXaWtpcMOpZGlhLjwvZW0+PC9zbWFsbD5cIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc1RpdGxlOiBcIkxlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyBzdXIgV2lraUxlcm5pXCIsXG4gICAgbmV3UXVlc3Rpb25uYWlyZXNJbnRybzogXCJMaXN0ZSBkZXMgZGVybmllcnMgcXVpenMgcHVibGnDqXMgc3VyIFdpa2lMZXJuaS5cIixcbiAgICBleHBsYW5hdGlvblRpdGxlOiBcIlZvdXMgZMOpY291dnJleiBXaWtpTGVybmkgP1wiLFxuICAgIGV4cGxhbmF0aW9uVHh0OiBcIkxlIHByaW5jaXBlIGVzdCBzaW1wbGUgOiB2b3VzIGNvbW1lbmNleiBwYXIgbGlyZSBsJ2FydGljbGUgV2lraXDDqWRpYSBkb250IGxlIGxpZW4gdm91cyBlc3QgcHJvcG9zw6kuPGJyPlB1aXMgdm91cyBhZmZpY2hlciBsZSBxdWl6IHBvdXIgdsOpcmlmaWVyIGNlIHF1ZSB2b3VzIGVuIGF2ZXogcmV0ZW51IGRlIHZvdHJlIGxlY3R1cmUuIFZvdXMgb2J0ZW5leiBhbG9ycyB2b3RyZSByw6lzdWx0YXQgaW1tw6lkaWF0ZW1lbnQuPGJyPjxicj5Ub3V0ZXMgbGVzIHLDqXBvbnNlcyBzZSB0cm91dmVudCBkYW5zIGwnYXJ0aWNsZSBwcm9wb3PDqSDDoCBsYSBsZWN0dXJlLiA8Yj5Wb3VzIMOqdGVzIGljaSBwb3VyIGFwcHJlbmRyZSBkZSBub3V2ZWxsZXMgY2hvc2VzPC9iPiwgbWFpcyBsaWJyZSDDoCB2b3VzIGQnZXNzYXllciBkJ3kgcsOpcG9uZHJlIGltbcOpZGlhdGVtZW50Ljxicj48YnI+UXVhbmQgbGUgc3VqZXQgcyd5IHByw6p0ZSwgbmUgdm91cyDDqXRvbm5leiBwYXMgc2kgY2VydGFpbmVzIGRlcyByw6lwb25zZXMgcHJvcG9zw6llcyBwZXV2ZW50IMOqdHJlIHVuIHBldSBkw6ljYWzDqWVzLCBhYnN1cmRlcy4uLiBPbiBwZXV0IGFwcHJlbmRyZSBhdmVjIGxlIHNvdXJpcmUsIG5vbiA/IDotKTxicj48YnI+VW5lIGZvaXMgdm90cmUgcsOpc3VsdGF0IG9idGVudSwgaWwgdm91cyBzZXJhIHByb3Bvc8OpIGRlIGNyw6llciB1biBjb21wdGUgcG91ciBsZSBzYXV2ZWdhcmRlci48YnI+Q2UgY29tcHRlIHZvdXMgcGVybWV0dHJhIGRlIHRlc3RlciBkZSBub3V2ZWF1IGNlIHF1aXogcG91ciB2w6lyaWZpZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUgcGx1c2lldXJzIGpvdXJzLCBzZW1haW5lcywgbW9pcy4uLiBFdCBkZSByZWNldm9pciByw6lndWxpw6hyZW1lbnQgZGUgbm91dmVsbGVzIHN1Z2dlc3Rpb25zIGRlIGxlY3R1cmVzLjxicj48YnI+TWFpcyA8Yj5sYSBjcsOpYXRpb24gZGUgY2UgY29tcHRlIGVzdCBmYWN1bHRhdGl2ZTwvYj4gZXQgPGEgaHJlZj0nL3F1aXpzLycgdGl0bGU9J0xlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyc+dm91cyBwb3V2ZXogcGFyY291cmlyIFdpa2lMZXJuaSBsaWJyZW1lbnQ8L2E+LlwiLFxuICAgIG5vSlNOb3RpZmljYXRpb246IFwiRMOpc29sw6ksIG1haXMgcG91ciBsJ2luc3RhbnQsIGwndXRpbGlzYXRpb24gZGUgV2lraUxlcm5pIG7DqWNlc3NpdGUgbCdhY3RpdmF0aW9uIGR1IEphdmFTY3JpcHQuXCIsXG59OyIsIi8vIEZPTkNUSU9OUyBVVElMRVMgQVUgU1RPQ0tBR0UgTE9DQUwgKFNFU1NJT04sIENPT0tJRVMsIElOREVYREIsIEVUQy4pXG4vLyBSZXZlbmlyIHBvdXIgZ8OpcmVyIGxlIGNhcyBvw7kgbG9jYWwuc3RvcmFnZSBuJ2VzdCBwYXMgY29ubnUgcG91ciB1dGlsaXNlciBjb29raWVcbiAgICBcbmV4cG9ydCBjb25zdCBzYXZlTG9jYWx5ID0gKG5hbWUsIGRhdGEpID0+XG57XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obmFtZSwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0TG9jYWx5ID0gKG5hbWUsIGpzb249ZmFsc2UpID0+XG57XG4gICAgaWYoanNvbilcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSkpO1xuICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKG5hbWUpO1xufVxuXG5leHBvcnQgY29uc3QgcmVtb3ZlTG9jYWx5ID0gKG5hbWUpID0+XG57XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0obmFtZSk7XG59IiwiaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIEZvbmN0aW9uIGFzc29jaWFudCBsZXMgYXR0cmlidXRzIGZvdXJuaXMgw6AgdW4gY2hhbXAgZGUgZm9ybXVsYWlyZVxuZXhwb3J0IGNvbnN0IGFkZEVsZW1lbnQgPSAoZWx0UGFyZW50LCBlbHRUeXBlLCBlbHRDb250ZW50PVwiXCIsIGVsdElkPVwiXCIsIGVsdENsYXNzPVtdLCBlbHRBdHRyaWJ1dGVzPXt9LCByZXBsYWNlPXRydWUpID0+XG57XG4gICAgaWYoaXNFbXB0eShlbHRUeXBlKSB8fCBpc0VtcHR5KGVsdFBhcmVudCkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBlbHNlXG4gICAge1xuICAgICAgICBjb25zdCBuZXdFbGVtZW50PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZWx0VHlwZSk7XG4gICAgICAgIFxuICAgICAgICBpZighaXNFbXB0eShlbHRJZCkpLy8gdGVzdGVyIHNpIGwnaWQgbidlc3QgcGFzIGTDqWrDoCB1dGlsaXPDqSBkYW5zIGxlIERPTSA/XG4gICAgICAgICAgICBuZXdFbGVtZW50LmlkPWVsdElkO1xuXG4gICAgICAgIGlmKEFycmF5LmlzQXJyYXkoZWx0Q2xhc3MpICYmIGVsdENsYXNzLmxlbmd0aCE9MClcbiAgICAgICAge1xuICAgICAgICAgICAgZm9yKGxldCBpIGluIGVsdENsYXNzKVxuICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuY2xhc3NMaXN0LmFkZChlbHRDbGFzc1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZih0eXBlb2YgZWx0QXR0cmlidXRlcyA9PT0gXCJvYmplY3RcIikgLy8gISEgdG91cyBsZXMgb2JqZXRzIG5lIHNvbnQgcGFzIG9rXG4gICAgICAgIHtcbiAgICAgICAgICAgIGZvcihsZXQgYXR0cmlidXROYW1lIGluIGVsdEF0dHJpYnV0ZXMpXG4gICAgICAgICAgICAgICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmlidXROYW1lLCBlbHRBdHRyaWJ1dGVzW2F0dHJpYnV0TmFtZV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoIWlzRW1wdHkoZWx0Q29udGVudCkpXG4gICAgICAgICAgICBuZXdFbGVtZW50LmlubmVySFRNTD1lbHRDb250ZW50LnJlcGxhY2UoL1xcbi9nLFwiPGJyPlwiKTsvLyBpbm5lckhUTUwgcGVybWV0IGQnYWpvdXRlciBkdSB0ZXh0ZSBheWFudCBsdWktbcOqbWUgZGVzIGJhbGlzZXMsIGV0Yy5cbiAgICAgICAgICAgIFxuICAgICAgICBpZihyZXBsYWNlKVxuICAgICAgICAgICAgZWx0UGFyZW50LmlubmVySFRNTD1cIlwiO1xuICAgICAgICBlbHRQYXJlbnQuYXBwZW5kQ2hpbGQobmV3RWxlbWVudCk7XG4gICAgfSAgICBcbn0iLCIvLyBDZSBzY3JpcHQgZm91cm5pdCBkZXMgZm9uY3Rpb25zIHV0aWxpc8OpZXMgc3VyIHRvdXRlcyBsZXMgcGFnZXMgZHUgc2l0ZVxuXG5leHBvcnQgY29uc3QgaGVsbG9EZXYgPSAoKSA9Plxue1xuICAgIGNvbnNvbGUubG9nKFwiKioqKiBIZWxsbyBhbWkgZMOpdmVsb3BwZXVyIDotKVxcbiBMZSBjb2RlIGRlIFdpa2lMZXJuaSBlc3QgbGlicmUgZXQgZXN0IGxpc2libGUgc3VyIGdpdGxhYiA6IFxcbiBCb25uZSBsZWN0dXJlIDotKSBcXG4gUG91ciBsZXMgc3VnZ2VzdGlvbnMgZCdhbcOpbGlvcmF0aW9uIG91IHF1ZXN0aW9ucyA6IGRldkB3aWxpbGVybmkuY29tICoqKipcIik7XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVBY2NvdW50TGluayA9IChzdGF0dXMsIGNvbmZpZ1RlbXBsYXRlKSA9Plxue1xuICAgIGNvbnN0IGxpbms9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJhY2NvdW50SGVhZExpbmtcIik7XG4gICAgY29uc3QgaG9tZVBhZ2U9c3RhdHVzK1wiSG9tZVBhZ2VcIjtcbiAgICBsaW5rLmhyZWY9XCIvXCIrY29uZmlnVGVtcGxhdGVbaG9tZVBhZ2VdO1xufSIsImltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG4vLyBGb25jdGlvbiByw6ljdXDDqXJhbnQgbGVzIHBhcmFtw6h0cmVzIHBhc3PDqXMgcGFyIGwndXJsXG5leHBvcnQgY29uc3QgZ2V0VXJsUGFyYW1zID0gKCkgPT5cbntcbiAgICBpZihpc0VtcHR5KGxvY2F0aW9uLnNlYXJjaCkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBsb2NhdGlvbi5zZWFyY2guc3Vic3RyaW5nKDEpLnNwbGl0KFwiJlwiKTtcbiAgICBpZighQXJyYXkuaXNBcnJheShwYXJhbWV0ZXJzKSB8fCBwYXJhbWV0ZXJzLmxlbmd0aD09PTApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgXG4gICAgbGV0IHBhcmFtLCBkYXRhcz17fTtcbiAgICBmb3IobGV0IGkgaW4gcGFyYW1ldGVycylcbiAgICB7XG4gICAgICAgIHBhcmFtID0gcGFyYW1ldGVyc1tpXS5zcGxpdChcIj1cIik7XG4gICAgICAgIGlmKHBhcmFtLmxlbmd0aD09PTIpXG4gICAgICAgICAgICBkYXRhc1twYXJhbVswXV09ZGVjb2RlVVJJKHBhcmFtWzFdKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGFzO1xufSIsImltcG9ydCB7IGFwaVVybCwgYXZhaWxhYmxlTGFuZ3MsIHNpdGVVcmwsIHRoZW1lIH0gZnJvbSBcIi4uLy4uLy4uL2NvbmZpZy9pbnN0YW5jZS5qc1wiO1xuY29uc3QgbGFuZz1hdmFpbGFibGVMYW5nc1swXTtcblxuY29uc3QgY29uZmlnVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vLi4vLi4vdmlld3MvXCIrdGhlbWUrXCIvY29uZmlnL1wiK2xhbmcrXCIuanNcIik7XG5pbXBvcnQgeyAgY2hlY2tMb2dpblJvdXRlLCB0aW1lRGlmZmVyZW5jZU1heCwgdGltZURpZmZlcmVuY2VNaW4sIHVzZXJSb3V0ZXMgfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnL3VzZXJzLmpzXCI7XG5cbmltcG9ydCB7IGdldExvY2FseSwgcmVtb3ZlTG9jYWx5LCBzYXZlTG9jYWx5IH0gZnJvbSBcIi4vY2xpZW50c3RvcmFnZS5qc1wiO1xuaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIFLDqWN1cMOocmUgbGVzIGRvbm7DqWVzIGRlIGNvbmZpZ3VyYXRpb24gZGVzIHV0aWxpc2F0ZXVyc1xuLy8gw4AgdGVybWUsIHVuIGZpY2hpZXIgc3RhdGlxdWUgaW1wb3J0YWJsZSBjb21tZSBtb2R1bGUgZGV2cmFpdCDDqXZpdGVyIHVuZSByZXF1w6p0ZSBhamF4XG5leHBvcnQgY29uc3QgZ2V0Q29uZmlnID0gIGFzeW5jICgpID0+XG57XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+XG4gICAge1xuICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgYXBpVXJsK1wiL3VzZXIvZ2V0Y29uZmlnXCIpO1xuICAgICAgICB4aHIub25sb2FkID0gKCkgPT4gcmVzb2x2ZShKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpKTtcbiAgICAgICAgeGhyLm9uZXJyb3IgPSAoKSA9PiByZWplY3QoeGhyLnN0YXR1c1RleHQpO1xuICAgICAgICB4aHIuc2VuZCgpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0VGltZURpZmZlcmVuY2UgPSAoKSA9Plxue1xuICAgIGNvbnN0IHRpbWVMb2NhbD1uZXcgRGF0ZSgpLmdldFRpbWV6b25lT2Zmc2V0KCk7XG4gICAgaWYodGltZUxvY2FsID4gdGltZURpZmZlcmVuY2VNYXggfHwgdGltZUxvY2FsIDwgdGltZURpZmZlcmVuY2VNaW4pXG4gICAgICAgIHJldHVybiAwO1xuICAgIGVsc2UgcmV0dXJuIHRpbWVMb2NhbDtcbn1cblxuLy8gT24gZW5sw6h2ZSB2b2xvbnRhaXJlbWVudCBsZXMgMC9PIHBvdXIgw6l2aXRlciBsZXMgY29uZnVzaW9ucyAhXG4vLyBFdCBtaWV1eCB2YXV0IGF1c3NpIGTDqWJ1dGVyIGV0IGZpbmlyIHBhciB1bmUgbGV0dHJlIHNpbXBsZS5cbmV4cG9ydCBjb25zdCBnZXRQYXNzd29yZCA9IChuYkNhck1pbiwgbmJDYXJNYXgpID0+XG57XG4gICAgY29uc3QgbmJDYXI9bmJDYXJNaW4rTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKihuYkNhck1heC1uYkNhck1pbikpO1xuICAgIGNvbnN0IGxldHRlcnM9XCJBQkNERUZHSElKS0xNTlBRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5wcXJzdHV2d3h5elwiO1xuICAgIGNvbnN0IG90aGVycz1cIjEyMzQ1Njc4OSE/LiotXyVAJsOJw4DDiMOZ4oKsJMOCw4rDm8OOXCI7XG4gICAgbGV0IHBhc3N3b3JkPWxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxldHRlcnMubGVuZ3RoKV07XG4gICAgZm9yKGxldCBpPTE7aTwobmJDYXItMSk7aSsrKVxuICAgIHtcbiAgICAgICAgaWYoKGkgJSAyKSA9PT0xKVxuICAgICAgICAgICAgcGFzc3dvcmQrPW90aGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqb3RoZXJzLmxlbmd0aCldO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBwYXNzd29yZCs9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTsgICBcbiAgICB9XG4gICAgcGFzc3dvcmQrPWxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxldHRlcnMubGVuZ3RoKV07XG4gICAgcmV0dXJuIHBhc3N3b3JkO1xufVxuXG4vLyBKJ3V0aWxpc2UgbGUgc3RvY2thZ2UgbG9jYWwgZHUgbmF2aWdhdGV1ciBwb3VyIGVucmVnaXN0cmVyIGxlcyBkb25uw6llcyBwZXJtZXR0YW50IGRlIHJlY29ubmHDrnRyZSBsJ3V0aWxpc2F0ZXVyIHBhciBsYSBzdWl0ZVxuLy8gU2V1bCBsZSBzZXJ2ZXVyIHBvdXJyYSB2w6lyaWZpZXIgcXVlIGxlcyBpZGVudGlmaWFudHMgc29udCAodG91am91cnMpIHZhbGlkZXMuXG5leHBvcnQgY29uc3Qgc2V0U2Vzc2lvbiA9ICh1c2VySWQsIHRva2VuLCBkdXJhdGlvblRTKSA9Plxue1xuICAgIGNvbnN0IHN0b3JhZ2VVc2VyPVxuICAgIHtcbiAgICAgICAgaWQ6IHVzZXJJZCxcbiAgICAgICAgdG9rZW46IHRva2VuLFxuICAgICAgICBkdXJhdGlvbjogZHVyYXRpb25UU1xuICAgIH1cbiAgICBzYXZlTG9jYWx5KFwidXNlclwiLCBzdG9yYWdlVXNlcik7XG59XG5cbi8vIFbDqXJpZmllIHF1J2lsIHkgYSBkZXMgZG9ubsOpZXMgbG9jYWxlcyBjb25jZXJuYW50IGxlIHLDqXN1bHRhdCBkJ3VuIHF1aXpcbi8vIEV0IGxlcyBham91dGUgYXV4IGRvbm7DqWVzIGVudm95w6llcyBwYXIgbGVzIGZvcm11bGFpcmVzIGQnaW5zY3JpcHRpb24vY29ubmV4aW9uIHNpIGMnZXN0IGxlIGNhc1xuZXhwb3J0IGNvbnN0IGNoZWNrQW5zd2VyRGF0YXMgPSAoZGF0YXMpID0+XG57XG4gICAgY29uc3QgbGFzdEFuc3dlcj1nZXRMb2NhbHkoXCJsYXN0QW5zd2VyXCIpO1xuICAgIGlmKCFpc0VtcHR5KGxhc3RBbnN3ZXIpKVxuICAgIHtcbiAgICAgICAgY29uc3QgYW5zd2VyPUpTT04ucGFyc2UobGFzdEFuc3dlcik7XG4gICAgICAgIGlmKCFpc0VtcHR5KGFuc3dlci5kdXJhdGlvbikgJiYgIWlzRW1wdHkoYW5zd2VyLm5iQ29ycmVjdEFuc3dlcnMpICYmICFpc0VtcHR5KGFuc3dlci5RdWVzdGlvbm5haXJlSWQpICYmICFpc0VtcHR5KGFuc3dlci5uYlF1ZXN0aW9ucykpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRhdGFzLmR1cmF0aW9uPWFuc3dlci5kdXJhdGlvbjtcbiAgICAgICAgICAgIGRhdGFzLm5iQ29ycmVjdEFuc3dlcnM9YW5zd2VyLm5iQ29ycmVjdEFuc3dlcnM7XG4gICAgICAgICAgICBkYXRhcy5RdWVzdGlvbm5haXJlSWQ9YW5zd2VyLlF1ZXN0aW9ubmFpcmVJZDtcbiAgICAgICAgICAgIGRhdGFzLm5iUXVlc3Rpb25zPWFuc3dlci5uYlF1ZXN0aW9ucztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YXM7XG59XG5cbi8vIENldHRlIGZvbmN0aW9uIHRlc3RlIGxhIGNvbm5leGlvbiBkZSBsJ3V0aWxpc2F0ZXVyIGQndW5lIHBhZ2Vcbi8vIE9uIHBldXQgZm91cm5pcyB1bmUgbGlzdGUgZGUgc3RhdHV0cyBhY2NlcHTDqXMgKHNpIHZpZGUgPSB0b3VzKSwgYWluc2kgcXUndW5lIHVybCBkZSByZWRpcmVjdGlvbiBzaSBub24gY29ubmVjdMOpLCB1biBtZXNzYWdlIGQnZXJyZXVyIMOgIGFmZmljaGVyIHN1ciBsYSBwYWdlIGRlIGRlc3RpbmF0aW9uIGV0IGwndXJsIHN1ciBsYXF1ZWxsZSByZXZlbmlyIHVuZSBmb2lzIGNvbm5lY3TDqVxuZXhwb3J0IGNvbnN0IGNoZWNrU2Vzc2lvbiA9IGFzeW5jIChzdGF0dXM9W10sIHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpID0+XG57XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+XG4gICAge1xuICAgICAgICBjb25zdCB1c2VyRGF0YXM9Z2V0TG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgaWYoaXNFbXB0eSh1c2VyRGF0YXMpKVxuICAgICAgICB7XG4gICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHVzZXI9SlNPTi5wYXJzZSh1c2VyRGF0YXMpO1xuICAgICAgICAgICAgaWYoaXNFbXB0eSh1c2VyLmlkKSB8fMKgaXNFbXB0eSh1c2VyLnRva2VuKSB8fCBpc0VtcHR5KHVzZXIuZHVyYXRpb24pIHx8IHVzZXIuZHVyYXRpb24gPCBEYXRlLm5vdygpKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgIHhoci5vcGVuKFwiR0VUXCIsIGFwaVVybCt1c2VyUm91dGVzK2NoZWNrTG9naW5Sb3V0ZSt1c2VyLnRva2VuKTtcbiAgICAgICAgICAgICAgICB4aHIub25sb2FkID0gKCkgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwICYmIHJlc3BvbnNlLmlzVmFsaWQgJiYgcmVzcG9uc2UuaWQgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5pZD09PXVzZXIuaWQpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5uYW1lPXJlc3BvbnNlLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5sYW5ndWFnZT1yZXNwb25zZS5sYW5ndWFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnRpbWVEaWZmZXJlbmNlPXJlc3BvbnNlLnRpbWVEaWZmZXJlbmNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIuc3RhdHVzPXJlc3BvbnNlLnN0YXR1czsvLyBsZSB0b2tlbiBldCBkZSB0b3V0ZSBmYcOnb24gdsOpcmlmaWVyIMOgIGNoYXF1ZSByZXF1w6p0ZSDDoCBsJ0FQSVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVMb2NhbHkoXCJ1c2VyXCIsIHVzZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpIGlsIHMnYWdpdCBkJ3VuIFwidXNlclwiIGV0IHF1ZSBzb24gYWJvbm5lbWVudCBhIGV4cGlyw6ksIGplIGxlIHJlZGlyaWdlIHZlcnMgbGEgY2Fpc3NlIDotKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLnN0YXR1cz09PVwidXNlclwiICYmIHJlc3BvbnNlLm5iRGF5c09rIDw9IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cmxBY2NvdW50PXNpdGVVcmwrXCIvXCIrY29uZmlnVGVtcGxhdGVbbGFuZ10uYWNjb3VudFBhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YodXJsQWNjb3VudCk9PT0tMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIvXCIrY29uZmlnVGVtcGxhdGVbbGFuZ10uYWNjb3VudFBhZ2UpOy8vIHBhc3PDqWUgZGlyZWN0ZW1lbnQgaWNpLCBsJ2FuY3JlICNzdWJzY3JpYmUgbmUgZm9uY3Rpb25uZSBwYXMgIT9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RhdHVzLmxlbmd0aCE9PTAgJiYgc3RhdHVzLmluZGV4T2YocmVzcG9uc2Uuc3RhdHVzKT09PS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB4aHIub25lcnJvciA9ICgpID0+IHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICAgICAgICAgICAgeGhyLnNlbmQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuLy8gQ2V0dGUgZm9uY3Rpb24gc2VydCDDoCBsYSBwcsOpY8OpZGVudGUgZW4gY2FzIGRlIGNvbm5leGlvbiBub24gdmFsaWRlXG5jb25zdCByZWRpcmVjdFVzZXIgPSAodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCkgPT5cbntcbiAgICBpZighaXNFbXB0eShtZXNzYWdlKSlcbiAgICAgICAgc2F2ZUxvY2FseShcIm1lc3NhZ2VcIiwgbWVzc2FnZSk7XG4gICAgaWYoIWlzRW1wdHkodXJsV2FudGVkKSlcbiAgICAgICAgc2F2ZUxvY2FseShcInVybFwiLCB1cmxXYW50ZWQpO1xuICAgIGlmKCFpc0VtcHR5KHVybFJlZGlyZWN0aW9uKSlcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbih1cmxSZWRpcmVjdGlvbik7XG59IiwiLy8gLS0gR0VTVElPTiBERSBMQSBQQUdFIFBFUk1FVFRBTlQgREUgU0UgRMOJQk9OTkVSIERFIFRPVVMgTEVTIEVOVk9JU1xuXG4vLy8gVW4gdG9rZW4gZXN0IHRyYW5zbWlzIGVuIHBhcmFtw6h0cmUgZGUgbCdVcmwuIElsIGEgdW5lIHZhbGlkaXTDqSBsaW1pdMOpIGRhbnMgbGUgdGVtcHMuIFNpIGxlIHRva2VuIGVzdCBvaywgaWwgbidlc3QgcGFzIG7DqWNlc3NhaXJlIGQnw6p0cmUgY29ubmVjdMOpLlxuLy8vIERhbnMgbGUgY2FzIG/DuSBpbCBuJ2VzdCBwbHVzIHZhbGlkZSwgb24gcGV1dCBwcm9wb3NlciDDoCBsJ3V0aWxpc2F0ZXVyIGRlIHNlIGNvbm5lY3RlciDDoCBzb24gY29tcHRlIHBvdXIgc2UgZMOpc2Fib25uZXIuXG4vLy8gU2kgbGUgdG9rZW4gZXN0IG9rLCBvbiB2YWxpZGUgZW5yZWdpc3RyZW1lbnQgbGUgZMOpc2Fib25uZW1lbnQgZXQgYWZmaWNoZSB1biBtZXNzYWdlIGRlIGNvbmZpcm1hdGlvblxuXG4vLyBGaWNoaWVyIGRlIGNvbmZpZ3VyYXRpb24gY8O0dMOpIGNsaWVudCA6XG5pbXBvcnQgeyBhcGlVcmwsIGF2YWlsYWJsZUxhbmdzLCB0aGVtZSB9IGZyb20gXCIuLi8uLi9jb25maWcvaW5zdGFuY2UuanNcIjtcbmNvbnN0IGxhbmc9YXZhaWxhYmxlTGFuZ3NbMF07XG5jb25zdCBjb25maWdGcm9udEVuZCA9IHJlcXVpcmUoXCIuLi8uLi92aWV3cy9cIit0aGVtZStcIi9jb25maWcvXCIrbGFuZytcIi5qc1wiKTtcblxuLy8gSW1wb3J0YXRpb24gZGVzIGZvbmN0aW9ucyB1dGlsZSBhdSBzY3JpcHQgOlxuaW1wb3J0IHsgZ2V0TG9jYWx5LCByZW1vdmVMb2NhbHksIHNhdmVMb2NhbHkgfSBmcm9tIFwiLi90b29scy9jbGllbnRzdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyBhZGRFbGVtZW50IH0gZnJvbSBcIi4vdG9vbHMvZG9tLmpzXCI7XG5pbXBvcnQgeyBoZWxsb0RldiB9IGZyb20gXCIuL3Rvb2xzL2V2ZXJ5d2hlcmUuanNcIjtcbmltcG9ydCB7IGdldFVybFBhcmFtcyB9IGZyb20gXCIuL3Rvb2xzL3VybC5qc1wiO1xuaW1wb3J0IHsgY2hlY2tTZXNzaW9uLCBnZXRDb25maWcsIHNldFNlc3Npb24gfSBmcm9tIFwiLi90b29scy91c2Vycy5qc1wiO1xuXG4vLyBEaWN0aW9ubmFpcmVzIDpcbmNvbnN0IHR4dCA9IHJlcXVpcmUoXCIuLi8uLi9sYW5nL1wiK2xhbmcrXCIvZ2VuZXJhbFwiKTtcbmNvbnN0IHR4dFVzZXJzID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi91c2VyXCIpO1xuY29uc3QgdHh0U3Vic2NyaXB0aW9ucyA9IHJlcXVpcmUoXCIuLi8uLi9sYW5nL1wiK2xhbmcrXCIvc3Vic2NyaXB0aW9uXCIpO1xuXG5jb25zdCBkaXZSZXNwb25zZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicmVzcG9uc2VcIik7XG5cbmhlbGxvRGV2KCk7XG5cbmxldCBjb25maWc7XG5jb25zdCBpbml0aWFsaXNlID0gYXN5bmMgKCkgPT5cbntcbiAgICB0cnlcbiAgICB7XG4gICAgICAgIGNvbmZpZyA9IGF3YWl0IGdldENvbmZpZygpO1xuICAgICAgICBpZighY29uZmlnKVxuICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICBlbHNlXG4gICAgICAgIHsgXG4gICAgICAgICAgICBjb25zdCBkYXRhcz1nZXRVcmxQYXJhbXMoKTtcbiAgICAgICAgICAgIGlmKGRhdGFzICYmIGRhdGFzLnQhPT11bmRlZmluZWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgYXBpVXJsK2NvbmZpZy51c2VyUm91dGVzK2NvbmZpZy51bnN1YnNjcmliZVJvdXRlK2RhdGFzLnQpO1xuICAgICAgICAgICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gMjAwICYmIHJlc3BvbnNlLm1lc3NhZ2UgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCByZXNwb25zZS5tZXNzYWdlLnJlcGxhY2UoXCIjVVJMXCIsIGNvbmZpZ0Zyb250RW5kLmFjY291bnRQYWdlKSwgXCJcIiwgW1wic3VjY2Vzc1wiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHR4dFN1YnNjcmlwdGlvbnMudW5zdWJzY3JpcHRpb25GYWlsLnJlcGxhY2UoXCIjVVJMXCIsIGNvbmZpZ0Zyb250RW5kLmFjY291bnRQYWdlKSwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHhoci5zZW5kKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2goZSlcbiAgICB7XG4gICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHQuc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICB9XG59XG5pbml0aWFsaXNlKCk7Il0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/front/public/JS/validation.app.js b/front/public/JS/validation.app.js new file mode 100644 index 0000000..8e33f60 --- /dev/null +++ b/front/public/JS/validation.app.js @@ -0,0 +1,868 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "./src/validation.js"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "../lang sync recursive ^\\.\\/.*\\/general$": +/*!**************************************!*\ + !*** ../lang sync ^\.\/.*\/general$ ***! + \**************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/general": "../lang/fr/general.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/general$"; + +/***/ }), + +/***/ "../lang sync recursive ^\\.\\/.*\\/user$": +/*!***********************************!*\ + !*** ../lang sync ^\.\/.*\/user$ ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var map = { + "./fr/user": "../lang/fr/user.js" +}; + + +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/user$"; + +/***/ }), + +/***/ "../lang/fr/general.js": +/*!*****************************!*\ + !*** ../lang/fr/general.js ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + siteHTMLTitle: "WikiLerni : qu'allez-vous apprendre aujourd'hui ?", + siteMetaDescription: "Chaque jour, testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.", + scriptTimingInfo: "Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", + scriptTimingAlert: "*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", + serverError: "Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.", + serverErrorAdmin: "Bug de l'application :", + neededParams: "Des paramètres nécessaires manquants sont manquants.", + badUrl: "Tentative d'accès à une page n'existant pas :", + notValidFormat: "Format non valide.", + notAllowed: "Vous n'avez pas les droits nécessaires pour cette action.", + notRequired: "Facultatif.", + updateBtnTxt: "Modifier", + addBtnTxt: "Ajouter", + deleteBtnTxt: "Supprimer", + addOkMessage: "Les données ont bien été enregistrées.", + updateOkMessage: "La mise à jour à jour a bien été enregistrée.", + deleteOkMessage: "La suppression a bien été enregistrée.", + failAuth: "Erreur d'authentification.", + failAuthHeader: "Absence de header Authorization.", + failAuthToken: "Token invalide ou utilisateur non trouvé.", + failAuthId: "Identifiant non valide : ", + failAuthCron: "Tentative de lancement d'un cron sans le bon token.", + previousPage: "Page précédente", + nextPage: "Page suivante", + btnLinkToQuestionnaire: "Aller au quiz !", + statsAdmin: "Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
    En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
    Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium." +}; + +/***/ }), + +/***/ "../lang/fr/user.js": +/*!**************************!*\ + !*** ../lang/fr/user.js ***! + \**************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + notFound: "L'utilisateur n'a pas été trouvé.", + needName: "Merci de choisir un nom d'utilisateur.", + needNotTooLongName: "Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.", + needEmail: "Merci de saisir votre adresse e-mail.", + needUniqueEmail: "L'adresse e-mail que vous avez saisie est déjà utilisée par un autre utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.", + needNotTooLongEmail: "Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.", + needPassWord: "Merci de fournir un mot de passe.", + needLongPassWord: "Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.", + passwordCopied: "Le mot de passe généré a été copié dans le presse-papier. Vous pouvez le recopier où vous le souhaiter.", + needStatus: "Il manque le statut.", + needLanguage: "Il manque le code langue.", + needValidLastConnectionDate: "La date de dernière connexion n'est pas valide.", + needSMTP: "Il manque le serveur SMTP.", + needSMTPNotFound: "Il manque le serveur SMTP.", + needKnowNewsletterOk: "Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.", + needTimeDifference: "Il faut connaître le nombre de minutes du décalage horaire.", + needMinTimeDifference: "Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.", + needMaxTimeDifference: "Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.", + needUGCOk: "Vous devez accepter les CGU pour pouvoir créer votre compte. ", + godfatherNotFound: "Aucun utilisateur valide trouvé pour ce code parrain.", + godfatherFound: "Votre parrain a bien été trouvé !", + mailValidationMessage: "Votre inscription est bien enregistrée.\nPour la finaliser, merci de cliquer dans les 24H sur le lien de confirmation qui vient de vous être envoyé par e-mail.", + mailValidationLinkSubject: "Merci de valider votre compte", + mailValidationLinkSBodyTxt: "Bonjour USER_NAME,\n\nPour valider votre compte, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL", + mailValidationLinkSBodyHTML: "

    Bonjour USER_NAME,

    Pour valider votre compte, merci de cliquer sur le lien suivant dans les 24h.

    Valider.

    ", + validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue !", + validationMessageAdmin: "Le compte a bien été validé.", + validationAlreadyMessage: "Il semble que vous ayez déjà validé votre compte.", + validationAlreadyMessageAdmin: "Ce compte a déjà été validé.", + mailWelcomeSubject: "Bienvenue !", + mailWelcomeBodyTxt: "Bonjour USER_NAME,\nVotre venez de valider votre inscription à NOM_SITE.\nMerci et à bientôt !", + mailWelcomeBodyHTML: "

    Bonjour USER_NAME,

    Votre venez de valider votre inscription à NOM_SITE.

    Merci et à bientôt !

    ", + mailThankGodfatherSubject: "Merci !", + mailThankGodfatherBodyTxt: "Bonjour USER_NAME,\nGrâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nMerci et à bientôt !", + mailThankGodfatherBodyHTML: "

    Bonjour USER_NAME,

    Grâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.

    Merci et à bientôt !

    ", + badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.", + emailNotFound: "Aucun utilisateur trouvé pour cette adresse e-mail.", + alreadyConnected: "Vous êtes déjà connecté(e) au site !", + needBeConnected: "Vous devez être connecté(e) pour accéder à cette page.", + connectionOk: "Connexion réussie.", + needChooseLoginWay: "Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.", + needValidationToLogin: "Vous devez d'abord valider votre compte avant de vous connecter. Pour ce faire, un lien vient de vous être envoyé par e-mail.", + tooManyLoginFails: "Trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.", + badPassword: "Le mot de passe n'est pas le bon.", + mailLoginLinkSubject: "Votre lien de connexion.", + mailLoginLinkBodyTxt: "Bonjour USER_NAME,\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : LINK_URL", + mailLoginLinkBodyHTML: "

    Bonjour USER_NAME,

    Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :

    Valider.

    ", + mailLoginLinkMessage: "Un lien de connexion vient de vous être envoyé sur votre adresse e-mail. Ne tardez pas à l'utiliser, car il n'est valable que durant ", + updatedOkMessage: "Vos informations ont bien été mises à jour.", + updatedNeedGoodEmail: "Mais la nouvelle adresse e-mail n'a pu être enregistrée car elle n'a pas une format correct.", + updatedNeedUniqueEmail: "Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.", + mailUpdateLoginSubject: "Merci de valider vos nouveaux identifiants.", + mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL", + mailUpdateLoginBodyHTML: "

    Bonjour USER_NAME,

    Pour valider vos nouveaux identifiants de connexion, cliquez ici sans tarder.

    ", + mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (email et/ou mot de passe) et vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement. En attendant, merci de continuer à utiliser vos anciens identifiants.", + updatedNeedValidatedUser: "L'utilisateur que vous souhaité modifier n'existe pas/plus ou n'a pas encore validé son compte.", + updatedNeedGoodGodfather: "Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.", + mailUpdateLoginOkMessage: "La mise à jour de vos identifiants a bien été enregistrée.", + updatedFailedGodfatherNotFound: "L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.", + creationOkMessage: "Le nouvel utilisateur a bien été enregistré.", + mailDeleteSubject: "Confirmer la suppression de votre compte.", + mailDeleteBodyTxt: "Bonjour USER_NAME,\nPour valider la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL", + mailDeleteBodyHTML: "

    Bonjour USER_NAME,

    Pour valider la suppression de votre compte, cliquez ici sans tarder.

    ", + mailDeleteLinkMessage: "Votre demande de suppression a bien été enregistrée. Merci de cliquer sans tarder sur le lien qui vient de vous être envoyé par e-mail pour confirmer.", + deleteOkMessage: "L'utilisateur a bien été supprimé.", + deleteFailMessage: "Tentative de suppression d'un utilisateur inexistant : ", + mailDeleteLinkOkMessage: "Votre compte a bien été supprimé. Merci d'avoir utilisé nos services.", + mailDeleteLinkAlreadyMessage: "Il semble que vous ayez déjà validé la suppression de votre compte.", + mailDeleteLinkFailMessage: "Votre lien de suppression n'est pas valide ou alors il n'est plus valable.", + cronDeleteUnvalidedUsersMessage: " comptes utilisateurs non validés ont été supprimés.", + deleteInactiveUsersMessage: " comptes utilisateurs inactifs ont été supprimés.", + welcomeMessage: "Bienvenue #NAME !", + byebyeMessage: "Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
    À bientôt !", + infosUserForAdmin: "Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
    Date de sa dernière connexion : DATE_CONNECTION.", + infosAdminGodfather: "Cet utilisateur a été parrainé par ", + infosAdminNbGodChilds: "Ses #NB filleuils : " +}; + +/***/ }), + +/***/ "../tools/main.js": +/*!************************!*\ + !*** ../tools/main.js ***! + \************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +// Quelques fonctions utiles pour les chaînes +var Tool = /*#__PURE__*/function () { + function Tool() { + _classCallCheck(this, Tool); + } + + _createClass(Tool, null, [{ + key: "isEmpty", + value: function isEmpty(myVar) { + if (myVar === undefined || myVar === null) return true;else { + myVar += ""; // si autre chose qu'une chaîne envoyé... + + myVar = myVar.trim(); + if (myVar === "") return true;else return false; + } + } + }, { + key: "trimIfNotNull", + value: function trimIfNotNull(myString) { + if (Tool.isEmpty(myString)) myString = null;else { + myString += ""; // si autre chose qu'une chaîne envoyé... + + myString = myString.trim(); + } + return myString; + } + }, { + key: "shortenIfLongerThan", + value: function shortenIfLongerThan(myString, max) { + myString += ""; // au cas où cela ne serait pas une chaîne... + + if (myString.length > max) myString = myString.substring(0, max - 3) + "..."; + return myString; + } // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings + + }, { + key: "replaceAll", + value: function replaceAll(myString, mapObj) { + var replaceElts = new RegExp(Object.keys(mapObj).join("|"), "gi"); + return myString.replace(replaceElts, function (matched) { + return mapObj[matched]; + }); + } // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random + + }, { + key: "getRandomInt", + value: function getRandomInt(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min)) + min; + } // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country + + }, { + key: "dateFormat", + value: function dateFormat(dateString) { + var lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "fr"; + if (Tool.isEmpty(dateString)) return ""; + var myDate = new Date(dateString); + var myDay = myDate.getDate() + ""; + if (myDay.length === 1) myDay = "0" + myDay; + var myMounth = myDate.getMonth() + 1 + ""; + if (myMounth.length === 1) myMounth = "0" + myMounth; + var myYear = myDate.getFullYear(); + if (lang === "fr") return myDay + "/" + myMounth + "/" + myYear;else if (lang === "form") // 2014-02-09 + return myYear + "-" + myMounth + "-" + myDay;else return myMounth + "/" + myDay + "/" + myYear; + } + }]); + + return Tool; +}(); + +module.exports = Tool; + +/***/ }), + +/***/ "./src/config/general.js": +/*!*******************************!*\ + !*** ./src/config/general.js ***! + \*******************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = { + apiUrl: "http://localhost:3000/api", + usersGetConfigUrl: "/user/getconfig", + lang: "fr", + userHomePage: "accueil.html", + adminHomePage: "admin.html", + managerHomePage: "gestion.html", + subscribePage: "inscription.html", + connectionPage: "connexion.html", + accountPage: "compte.html", + questionnairesManagementPage: "gestion-quizs.html", + usersManagementPage: "gestion-utilisateurs.html", + nbQuestionnairesUserHomePage: 10, + illustrationDir: "/img/quizs/" +}; // à terme fusionner avec les déclarations backend concernant le front, tout étant saisi dans l'admin + +/***/ }), + +/***/ "./src/tools/clientstorage.js": +/*!************************************!*\ + !*** ./src/tools/clientstorage.js ***! + \************************************/ +/*! exports provided: saveLocaly, getLocaly, removeLocaly */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveLocaly", function() { return saveLocaly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaly", function() { return getLocaly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeLocaly", function() { return removeLocaly; }); +// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.) +// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie +var saveLocaly = function saveLocaly(name, data) { + localStorage.setItem(name, JSON.stringify(data)); +}; +var getLocaly = function getLocaly(name) { + var json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name); +}; +var removeLocaly = function removeLocaly(name) { + localStorage.removeItem(name); +}; + +/***/ }), + +/***/ "./src/tools/dom.js": +/*!**************************!*\ + !*** ./src/tools/dom.js ***! + \**************************/ +/*! exports provided: addElement */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addElement", function() { return addElement; }); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__); +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + + // Fonction associant les attributs fournis à un champ de formulaire + +var addElement = function addElement(eltParent, eltType) { + var eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; + var eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; + var eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : []; + var eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; + var replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true; + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltType) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltParent)) return false;else { + var newElement = document.createElement(eltType); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ? + newElement.id = eltId; + + if (Array.isArray(eltClass) && eltClass.length != 0) { + for (var i in eltClass) { + newElement.classList.add(eltClass[i]); + } + } + + if (_typeof(eltAttributes) === "object") // !! tous les objets ne sont pas ok + { + for (var attributName in eltAttributes) { + newElement.setAttribute(attributName, eltAttributes[attributName]); + } + } + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltContent)) newElement.innerHTML = eltContent.replace(/\n/g, "
    "); // innerHTML permet d'ajouter du texte ayant lui-même des balises, etc. + + if (replace) eltParent.innerHTML = ""; + eltParent.appendChild(newElement); + } +}; + +/***/ }), + +/***/ "./src/tools/everywhere.js": +/*!*********************************!*\ + !*** ./src/tools/everywhere.js ***! + \*********************************/ +/*! exports provided: helloDev */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "helloDev", function() { return helloDev; }); +// Ce script fournit des fonctions utilisées sur toutes les pages du site +var helloDev = function helloDev() { + console.log("**** Hello ami développeur :-)\n Le code de WikiLerni est libre et est lisible sur gitlab : \n Bonne lecture :-) \n Pour les suggestions d'amélioration ou questions : dev@wililerni.com ****"); + return true; +}; + +/***/ }), + +/***/ "./src/tools/url.js": +/*!**************************!*\ + !*** ./src/tools/url.js ***! + \**************************/ +/*! exports provided: getUrlParams */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getUrlParams", function() { return getUrlParams; }); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__); + // Fonction récupérant les paramètres passés par l'url + +var getUrlParams = function getUrlParams() { + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(location.search)) return false; + var parameters = location.search.substring(1).split("&"); + if (!Array.isArray(parameters) || parameters.length === 0) return false; + var param, + datas = {}; + + for (var i in parameters) { + param = parameters[i].split("="); + if (param.length === 2) datas[param[0]] = decodeURI(param[1]); + } + + return datas; +}; + +/***/ }), + +/***/ "./src/tools/users.js": +/*!****************************!*\ + !*** ./src/tools/users.js ***! + \****************************/ +/*! exports provided: getConfig, getTimeDifference, getPassword, setSession, checkAnswerDatas, checkSession */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getConfig", function() { return getConfig; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTimeDifference", function() { return getTimeDifference; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getPassword", function() { return getPassword; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setSession", function() { return setSession; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkAnswerDatas", function() { return checkAnswerDatas; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkSession", function() { return checkSession; }); +/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js"); +/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_1__); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + +var configFrontEnd = __webpack_require__(/*! ../config/general */ "./src/config/general.js"); + + + // Récupère les données de configuration des utilisateurs +// À terme, un fichier statique importable comme module devrait éviter une requête ajax + +var getConfig = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + return _context.abrupt("return", new Promise(function (resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", configFrontEnd.apiUrl + configFrontEnd.usersGetConfigUrl); + + xhr.onload = function () { + return resolve(JSON.parse(xhr.responseText)); + }; + + xhr.onerror = function () { + return reject(xhr.statusText); + }; + + xhr.send(); + })); + + case 1: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + + return function getConfig() { + return _ref.apply(this, arguments); + }; +}(); +var getTimeDifference = function getTimeDifference(config) { + var timeLocal = new Date().getTimezoneOffset(); + if (timeLocal > config.timeDifferenceMax || timeLocal < config.timeDifferenceMin) return 0;else return timeLocal; +}; // On enlève volontairement les 0/O pour éviter les confusions ! +// Et mieux vaut aussi débuter et finir par une lettre simple. + +var getPassword = function getPassword(nbCarMin, nbCarMax) { + var nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin)); + var letters = "ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz"; + var others = "123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ"; + var password = letters[Math.floor(Math.random() * letters.length)]; + + for (var i = 1; i < nbCar - 1; i++) { + if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)]; + } + + password += letters[Math.floor(Math.random() * letters.length)]; + return password; +}; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite +// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides. + +var setSession = function setSession(userId, token, durationTS) { + var storageUser = { + id: userId, + token: token, + duration: durationTS + }; + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["saveLocaly"])("user", storageUser); +}; // Vérifie qu'il y a des données locales concernant le résultat d'un quiz +// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas + +var checkAnswerDatas = function checkAnswerDatas(datas) { + var lastAnswer = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["getLocaly"])("lastAnswer"); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(lastAnswer)) { + var answer = JSON.parse(lastAnswer); + + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.duration) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.nbCorrectAnswers) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.QuestionnaireId) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.nbQuestions)) { + datas.duration = answer.duration; + datas.nbCorrectAnswers = answer.nbCorrectAnswers; + datas.QuestionnaireId = answer.QuestionnaireId; + datas.nbQuestions = answer.nbQuestions; + } + } + + return datas; +}; // Cette fonction teste la connexion de l'utilisateur d'une page +// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté + +var checkSession = /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(config) { + var status, + urlRedirection, + message, + urlWanted, + _args2 = arguments; + return regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + status = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : []; + urlRedirection = _args2.length > 2 ? _args2[2] : undefined; + message = _args2.length > 3 ? _args2[3] : undefined; + urlWanted = _args2.length > 4 ? _args2[4] : undefined; + return _context2.abrupt("return", new Promise(function (resolve, reject) { + var userDatas = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["getLocaly"])("user"); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(userDatas)) { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else { + var user = JSON.parse(userDatas); + + if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(user.id) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(user.token) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(user.duration) || user.duration < Date.now()) { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else { + var xhr = new XMLHttpRequest(); + xhr.open("GET", configFrontEnd.apiUrl + config.userRoutes + config.checkLoginRoute + user.token); + + xhr.onload = function () { + var response = JSON.parse(xhr.responseText); + + if (xhr.status === 200 && response.isValid && response.id != undefined) { + if (response.id === user.id) { + user.name = response.name; + user.language = response.language; + user.timeDifference = response.timeDifference; + user.status = response.status; // le token et de toute façon vérifier à chaque requête à l'API + + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["saveLocaly"])("user", user); // si il s'agit d'un "user" et que son abonnement a expiré, je le redirige vers la caisse :-) + + if (response.status === "user" && response.nbDaysOk <= 0) { + var urlAccount = config.siteUrl + "/" + configFrontEnd.accountPage; + if (window.location.href.indexOf(urlAccount) === -1) window.location.assign("/" + configFrontEnd.accountPage); // passée directement ici, l'ancre #subscribe ne fonctionne pas !? + + resolve(true); + } else { + if (status.length !== 0 && status.indexOf(response.status) === -1) { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } else resolve(true); + } + } else { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + } else { + Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["removeLocaly"])("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + }; + + xhr.onerror = function () { + return reject(xhr.statusText); + }; + + xhr.send(); + } + } + })); + + case 5: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + + return function checkSession(_x) { + return _ref2.apply(this, arguments); + }; +}(); // Cette fonction sert à la précédente en cas de connexion non valide + +var redirectUser = function redirectUser(urlRedirection, message, urlWanted) { + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(message)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["saveLocaly"])("message", message); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(urlWanted)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["saveLocaly"])("url", urlWanted); + if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(urlRedirection)) window.location.assign(urlRedirection); +}; + +/***/ }), + +/***/ "./src/validation.js": +/*!***************************!*\ + !*** ./src/validation.js ***! + \***************************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js"); +/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js"); +/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js"); +/* harmony import */ var _tools_url_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/url.js */ "./src/tools/url.js"); +/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/users.js */ "./src/tools/users.js"); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + +// -- GESTION DE LA PAGE PERMETTANT DE VALIDER LA CRÉATION DE SON COMPTE +/// Un token est transmis en paramètre de l'Url. Il a une validité limité dans le temps. +/// Dans ce cas, on peut rediriger l'utilisateur vers la page de connexion pour obtenir un nouveau lien de validation +/// Si le token est ok, on crée une session de courte durée et redirige l'utilisateur vers sa page d'accueil +/// Si l'utilisateur a déjà une session active valide, c'est qu'il a déjà cliqué sur le lien. On le redirige également vers sa page d'accueil. +// Fichier de configuration côté client : +var configFrontEnd = __webpack_require__(/*! ./config/general */ "./src/config/general.js"); // Importation des fonctions utile au script : + + + + + + + // Dictionnaires : + +var txt = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + configFrontEnd.lang + "/general"); + +var txtUsers = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/user$")("./" + configFrontEnd.lang + "/user"); + +var divResponse = document.getElementById("response"); +Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_2__["helloDev"])(); +var config; + +var initialise = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { + var isConnected, user, homePage, datas, xhr; + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _context.prev = 0; + _context.next = 3; + return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_4__["getConfig"])(); + + case 3: + config = _context.sent; + + if (config) { + _context.next = 8; + break; + } + + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_1__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]); + _context.next = 12; + break; + + case 8: + _context.next = 10; + return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_4__["checkSession"])(config); + + case 10: + isConnected = _context.sent; + + if (isConnected) { + Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["saveLocaly"])("message", { + message: txtUsers.alreadyConnected, + color: "information" + }); // pour l'afficher sur la page suivante + + user = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["getLocaly"])("user", true); + homePage = user.status + "HomePage"; // ne devrait pouvoir être que user ici + + window.location.assign("/" + configFrontEnd[homePage]); + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_1__["addElement"])(divResponse, "p", txtUsers.alreadyConnected, "", ["information"]); // au cas où blocage redirection + } else { + datas = Object(_tools_url_js__WEBPACK_IMPORTED_MODULE_3__["getUrlParams"])(); + + if (datas && datas.t !== undefined) { + xhr = new XMLHttpRequest(); + xhr.open("GET", configFrontEnd.apiUrl + config.userRoutes + config.checkSubscribeTokenRoute + datas.t); + + xhr.onreadystatechange = function () { + if (this.readyState == XMLHttpRequest.DONE) { + var response = JSON.parse(this.responseText); + + if (this.status === 200 && response.userId != undefined && response.token != undefined) { + var connexionMaxTime = Date.now() + parseInt(config.connexionMinTimeInHours, 10) * 3600 * 1000; + Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_4__["setSession"])(response.userId, response.token, connexionMaxTime); + Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["saveLocaly"])("message", { + message: txtUsers.validationMessage, + color: "success" + }); // pour l'afficher sur la page suivante + + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_1__["addElement"])(divResponse, "p", txtUsers.validationMessage, "", ["success"]); // au cas où blocage redirection + + window.location.assign("/" + configFrontEnd.userHomePage); // que user possible lors de la création + } else if ((this.status === 200 || this.status === 404) && response.errors != undefined) { + if (Array.isArray(response.errors)) response.errors = response.errors.join("
    ");else response.errors = txt.serverError; + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_1__["addElement"])(divResponse, "p", response.errors, "", ["error"]); + } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_1__["addElement"])(divResponse, "p", txtUsers.badLinkValidationMessage.replace("#URL", configFrontEnd.connectionPage), "", ["error"]); + } + }; + + xhr.send(); + } + } + + case 12: + _context.next = 17; + break; + + case 14: + _context.prev = 14; + _context.t0 = _context["catch"](0); + Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_1__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]); + + case 17: + case "end": + return _context.stop(); + } + } + }, _callee, null, [[0, 14]]); + })); + + return function initialise() { + return _ref.apply(this, arguments); + }; +}(); + +initialise(); + +/***/ }) + +/******/ }); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9nZW5lcmFsJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3VzZXIkIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL2dlbmVyYWwuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcvZnIvdXNlci5qcyIsIndlYnBhY2s6Ly8vLi4vdG9vbHMvbWFpbi5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY29uZmlnL2dlbmVyYWwuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2RvbS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvZXZlcnl3aGVyZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvdXJsLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy91c2Vycy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdmFsaWRhdGlvbi5qcyJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIiwic2l0ZUhUTUxUaXRsZSIsInNpdGVNZXRhRGVzY3JpcHRpb24iLCJzY3JpcHRUaW1pbmdJbmZvIiwic2NyaXB0VGltaW5nQWxlcnQiLCJzZXJ2ZXJFcnJvciIsInNlcnZlckVycm9yQWRtaW4iLCJuZWVkZWRQYXJhbXMiLCJiYWRVcmwiLCJub3RWYWxpZEZvcm1hdCIsIm5vdEFsbG93ZWQiLCJub3RSZXF1aXJlZCIsInVwZGF0ZUJ0blR4dCIsImFkZEJ0blR4dCIsImRlbGV0ZUJ0blR4dCIsImFkZE9rTWVzc2FnZSIsInVwZGF0ZU9rTWVzc2FnZSIsImRlbGV0ZU9rTWVzc2FnZSIsImZhaWxBdXRoIiwiZmFpbEF1dGhIZWFkZXIiLCJmYWlsQXV0aFRva2VuIiwiZmFpbEF1dGhJZCIsImZhaWxBdXRoQ3JvbiIsInByZXZpb3VzUGFnZSIsIm5leHRQYWdlIiwiYnRuTGlua1RvUXVlc3Rpb25uYWlyZSIsInN0YXRzQWRtaW4iLCJub3RGb3VuZCIsIm5lZWROYW1lIiwibmVlZE5vdFRvb0xvbmdOYW1lIiwibmVlZEVtYWlsIiwibmVlZFVuaXF1ZUVtYWlsIiwibmVlZE5vdFRvb0xvbmdFbWFpbCIsIm5lZWRQYXNzV29yZCIsIm5lZWRMb25nUGFzc1dvcmQiLCJwYXNzd29yZENvcGllZCIsIm5lZWRTdGF0dXMiLCJuZWVkTGFuZ3VhZ2UiLCJuZWVkVmFsaWRMYXN0Q29ubmVjdGlvbkRhdGUiLCJuZWVkU01UUCIsIm5lZWRTTVRQTm90Rm91bmQiLCJuZWVkS25vd05ld3NsZXR0ZXJPayIsIm5lZWRUaW1lRGlmZmVyZW5jZSIsIm5lZWRNaW5UaW1lRGlmZmVyZW5jZSIsIm5lZWRNYXhUaW1lRGlmZmVyZW5jZSIsIm5lZWRVR0NPayIsImdvZGZhdGhlck5vdEZvdW5kIiwiZ29kZmF0aGVyRm91bmQiLCJtYWlsVmFsaWRhdGlvbk1lc3NhZ2UiLCJtYWlsVmFsaWRhdGlvbkxpbmtTdWJqZWN0IiwibWFpbFZhbGlkYXRpb25MaW5rU0JvZHlUeHQiLCJtYWlsVmFsaWRhdGlvbkxpbmtTQm9keUhUTUwiLCJ2YWxpZGF0aW9uTWVzc2FnZSIsInZhbGlkYXRpb25NZXNzYWdlQWRtaW4iLCJ2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2UiLCJ2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2VBZG1pbiIsIm1haWxXZWxjb21lU3ViamVjdCIsIm1haWxXZWxjb21lQm9keVR4dCIsIm1haWxXZWxjb21lQm9keUhUTUwiLCJtYWlsVGhhbmtHb2RmYXRoZXJTdWJqZWN0IiwibWFpbFRoYW5rR29kZmF0aGVyQm9keVR4dCIsIm1haWxUaGFua0dvZGZhdGhlckJvZHlIVE1MIiwiYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlIiwiZW1haWxOb3RGb3VuZCIsImFscmVhZHlDb25uZWN0ZWQiLCJuZWVkQmVDb25uZWN0ZWQiLCJjb25uZWN0aW9uT2siLCJuZWVkQ2hvb3NlTG9naW5XYXkiLCJuZWVkVmFsaWRhdGlvblRvTG9naW4iLCJ0b29NYW55TG9naW5GYWlscyIsImJhZFBhc3N3b3JkIiwibWFpbExvZ2luTGlua1N1YmplY3QiLCJtYWlsTG9naW5MaW5rQm9keVR4dCIsIm1haWxMb2dpbkxpbmtCb2R5SFRNTCIsIm1haWxMb2dpbkxpbmtNZXNzYWdlIiwidXBkYXRlZE9rTWVzc2FnZSIsInVwZGF0ZWROZWVkR29vZEVtYWlsIiwidXBkYXRlZE5lZWRVbmlxdWVFbWFpbCIsIm1haWxVcGRhdGVMb2dpblN1YmplY3QiLCJtYWlsVXBkYXRlTG9naW5Cb2R5VHh0IiwibWFpbFVwZGF0ZUxvZ2luQm9keUhUTUwiLCJtYWlsVXBkYXRlTG9naW5MaW5rTWVzc2FnZSIsInVwZGF0ZWROZWVkVmFsaWRhdGVkVXNlciIsInVwZGF0ZWROZWVkR29vZEdvZGZhdGhlciIsIm1haWxVcGRhdGVMb2dpbk9rTWVzc2FnZSIsInVwZGF0ZWRGYWlsZWRHb2RmYXRoZXJOb3RGb3VuZCIsImNyZWF0aW9uT2tNZXNzYWdlIiwibWFpbERlbGV0ZVN1YmplY3QiLCJtYWlsRGVsZXRlQm9keVR4dCIsIm1haWxEZWxldGVCb2R5SFRNTCIsIm1haWxEZWxldGVMaW5rTWVzc2FnZSIsImRlbGV0ZUZhaWxNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtPa01lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua0FscmVhZHlNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtGYWlsTWVzc2FnZSIsImNyb25EZWxldGVVbnZhbGlkZWRVc2Vyc01lc3NhZ2UiLCJkZWxldGVJbmFjdGl2ZVVzZXJzTWVzc2FnZSIsIndlbGNvbWVNZXNzYWdlIiwiYnllYnllTWVzc2FnZSIsImluZm9zVXNlckZvckFkbWluIiwiaW5mb3NBZG1pbkdvZGZhdGhlciIsImluZm9zQWRtaW5OYkdvZENoaWxkcyIsIlRvb2wiLCJteVZhciIsInVuZGVmaW5lZCIsInRyaW0iLCJteVN0cmluZyIsImlzRW1wdHkiLCJtYXgiLCJsZW5ndGgiLCJzdWJzdHJpbmciLCJtYXBPYmoiLCJyZXBsYWNlRWx0cyIsIlJlZ0V4cCIsIk9iamVjdCIsImtleXMiLCJqb2luIiwicmVwbGFjZSIsIm1hdGNoZWQiLCJtaW4iLCJNYXRoIiwiY2VpbCIsImZsb29yIiwicmFuZG9tIiwiZGF0ZVN0cmluZyIsImxhbmciLCJteURhdGUiLCJEYXRlIiwibXlEYXkiLCJnZXREYXRlIiwibXlNb3VudGgiLCJnZXRNb250aCIsIm15WWVhciIsImdldEZ1bGxZZWFyIiwiYXBpVXJsIiwidXNlcnNHZXRDb25maWdVcmwiLCJ1c2VySG9tZVBhZ2UiLCJhZG1pbkhvbWVQYWdlIiwibWFuYWdlckhvbWVQYWdlIiwic3Vic2NyaWJlUGFnZSIsImNvbm5lY3Rpb25QYWdlIiwiYWNjb3VudFBhZ2UiLCJxdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlIiwidXNlcnNNYW5hZ2VtZW50UGFnZSIsIm5iUXVlc3Rpb25uYWlyZXNVc2VySG9tZVBhZ2UiLCJpbGx1c3RyYXRpb25EaXIiLCJzYXZlTG9jYWx5IiwibmFtZSIsImRhdGEiLCJsb2NhbFN0b3JhZ2UiLCJzZXRJdGVtIiwiSlNPTiIsInN0cmluZ2lmeSIsImdldExvY2FseSIsImpzb24iLCJwYXJzZSIsImdldEl0ZW0iLCJyZW1vdmVMb2NhbHkiLCJyZW1vdmVJdGVtIiwiYWRkRWxlbWVudCIsImVsdFBhcmVudCIsImVsdFR5cGUiLCJlbHRDb250ZW50IiwiZWx0SWQiLCJlbHRDbGFzcyIsImVsdEF0dHJpYnV0ZXMiLCJuZXdFbGVtZW50IiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiaWQiLCJBcnJheSIsImlzQXJyYXkiLCJpIiwiY2xhc3NMaXN0IiwiYWRkIiwiYXR0cmlidXROYW1lIiwic2V0QXR0cmlidXRlIiwiaW5uZXJIVE1MIiwiYXBwZW5kQ2hpbGQiLCJoZWxsb0RldiIsImNvbnNvbGUiLCJsb2ciLCJnZXRVcmxQYXJhbXMiLCJsb2NhdGlvbiIsInNlYXJjaCIsInBhcmFtZXRlcnMiLCJzcGxpdCIsInBhcmFtIiwiZGF0YXMiLCJkZWNvZGVVUkkiLCJjb25maWdGcm9udEVuZCIsInJlcXVpcmUiLCJnZXRDb25maWciLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInhociIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsIm9ubG9hZCIsInJlc3BvbnNlVGV4dCIsIm9uZXJyb3IiLCJzdGF0dXNUZXh0Iiwic2VuZCIsImdldFRpbWVEaWZmZXJlbmNlIiwiY29uZmlnIiwidGltZUxvY2FsIiwiZ2V0VGltZXpvbmVPZmZzZXQiLCJ0aW1lRGlmZmVyZW5jZU1heCIsInRpbWVEaWZmZXJlbmNlTWluIiwiZ2V0UGFzc3dvcmQiLCJuYkNhck1pbiIsIm5iQ2FyTWF4IiwibmJDYXIiLCJsZXR0ZXJzIiwib3RoZXJzIiwicGFzc3dvcmQiLCJzZXRTZXNzaW9uIiwidXNlcklkIiwidG9rZW4iLCJkdXJhdGlvblRTIiwic3RvcmFnZVVzZXIiLCJkdXJhdGlvbiIsImNoZWNrQW5zd2VyRGF0YXMiLCJsYXN0QW5zd2VyIiwiYW5zd2VyIiwibmJDb3JyZWN0QW5zd2VycyIsIlF1ZXN0aW9ubmFpcmVJZCIsIm5iUXVlc3Rpb25zIiwiY2hlY2tTZXNzaW9uIiwic3RhdHVzIiwidXJsUmVkaXJlY3Rpb24iLCJtZXNzYWdlIiwidXJsV2FudGVkIiwidXNlckRhdGFzIiwicmVkaXJlY3RVc2VyIiwidXNlciIsIm5vdyIsInVzZXJSb3V0ZXMiLCJjaGVja0xvZ2luUm91dGUiLCJyZXNwb25zZSIsImlzVmFsaWQiLCJsYW5ndWFnZSIsInRpbWVEaWZmZXJlbmNlIiwibmJEYXlzT2siLCJ1cmxBY2NvdW50Iiwic2l0ZVVybCIsIndpbmRvdyIsImhyZWYiLCJpbmRleE9mIiwiYXNzaWduIiwidHh0IiwidHh0VXNlcnMiLCJkaXZSZXNwb25zZSIsImdldEVsZW1lbnRCeUlkIiwiaW5pdGlhbGlzZSIsImlzQ29ubmVjdGVkIiwiY29sb3IiLCJob21lUGFnZSIsInQiLCJjaGVja1N1YnNjcmliZVRva2VuUm91dGUiLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJyZWFkeVN0YXRlIiwiRE9ORSIsImNvbm5leGlvbk1heFRpbWUiLCJwYXJzZUludCIsImNvbm5leGlvbk1pblRpbWVJbkhvdXJzIiwiZXJyb3JzIl0sIm1hcHBpbmdzIjoiO1FBQUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7OztRQUdBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwwQ0FBMEMsZ0NBQWdDO1FBQzFFO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0Esd0RBQXdELGtCQUFrQjtRQUMxRTtRQUNBLGlEQUFpRCxjQUFjO1FBQy9EOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSx5Q0FBeUMsaUNBQWlDO1FBQzFFLGdIQUFnSCxtQkFBbUIsRUFBRTtRQUNySTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDJCQUEyQiwwQkFBMEIsRUFBRTtRQUN2RCxpQ0FBaUMsZUFBZTtRQUNoRDtRQUNBO1FBQ0E7O1FBRUE7UUFDQSxzREFBc0QsK0RBQStEOztRQUVySDtRQUNBOzs7UUFHQTtRQUNBOzs7Ozs7Ozs7Ozs7QUNsRkE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0U7Ozs7Ozs7Ozs7O0FDdEJBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEOzs7Ozs7Ozs7OztBQ3RCQUEsTUFBTSxDQUFDQyxPQUFQLEdBQ0E7QUFDSUMsZUFBYSxFQUFHLG1EQURwQjtBQUVJQyxxQkFBbUIsRUFBRyx1RkFGMUI7QUFHSUMsa0JBQWdCLEVBQUcsdUVBSHZCO0FBSUlDLG1CQUFpQixFQUFHLG1FQUp4QjtBQUtJQyxhQUFXLEVBQUcsNEdBTGxCO0FBTUlDLGtCQUFnQixFQUFHLHdCQU52QjtBQU9JQyxjQUFZLEVBQUcsc0RBUG5CO0FBUUlDLFFBQU0sRUFBRywrQ0FSYjtBQVNJQyxnQkFBYyxFQUFHLG9CQVRyQjtBQVVJQyxZQUFVLEVBQUcsMkRBVmpCO0FBV0lDLGFBQVcsRUFBRyxhQVhsQjtBQVlJQyxjQUFZLEVBQUUsVUFabEI7QUFhSUMsV0FBUyxFQUFFLFNBYmY7QUFjSUMsY0FBWSxFQUFFLFdBZGxCO0FBZUlDLGNBQVksRUFBRyx3Q0FmbkI7QUFnQklDLGlCQUFlLEVBQUcsK0NBaEJ0QjtBQWlCSUMsaUJBQWUsRUFBRyx3Q0FqQnRCO0FBa0JJQyxVQUFRLEVBQUcsNEJBbEJmO0FBbUJJQyxnQkFBYyxFQUFHLGtDQW5CckI7QUFvQklDLGVBQWEsRUFBRywyQ0FwQnBCO0FBcUJJQyxZQUFVLEVBQUcsMkJBckJqQjtBQXNCSUMsY0FBWSxFQUFHLHFEQXRCbkI7QUF1QklDLGNBQVksRUFBRyxpQkF2Qm5CO0FBd0JJQyxVQUFRLEVBQUcsZUF4QmY7QUF5QklDLHdCQUFzQixFQUFHLGlCQXpCN0I7QUEwQklDLFlBQVUsRUFBRztBQTFCakIsQ0FEQSxDOzs7Ozs7Ozs7OztBQ0FBM0IsTUFBTSxDQUFDQyxPQUFQLEdBQ0E7QUFDSTJCLFVBQVEsRUFBRSxtQ0FEZDtBQUVJQyxVQUFRLEVBQUUsd0NBRmQ7QUFHSUMsb0JBQWtCLEVBQUUsOEVBSHhCO0FBSUlDLFdBQVMsRUFBRSx1Q0FKZjtBQUtJQyxpQkFBZSxFQUFFLHFLQUxyQjtBQU1JQyxxQkFBbUIsRUFBRSw0RUFOekI7QUFPSUMsY0FBWSxFQUFHLG1DQVBuQjtBQVFJQyxrQkFBZ0IsRUFBRyxvRUFSdkI7QUFTSUMsZ0JBQWMsRUFBRSx5R0FUcEI7QUFVSUMsWUFBVSxFQUFHLHNCQVZqQjtBQVdJQyxjQUFZLEVBQUcsMkJBWG5CO0FBWUlDLDZCQUEyQixFQUFHLGlEQVpsQztBQWFJQyxVQUFRLEVBQUcsNEJBYmY7QUFjSUMsa0JBQWdCLEVBQUcsNEJBZHZCO0FBZUlDLHNCQUFvQixFQUFHLDhFQWYzQjtBQWdCSUMsb0JBQWtCLEVBQUcsNkRBaEJ6QjtBQWlCSUMsdUJBQXFCLEVBQUcsb0ZBakI1QjtBQWtCSUMsdUJBQXFCLEVBQUcsb0ZBbEI1QjtBQW1CSUMsV0FBUyxFQUFHLCtEQW5CaEI7QUFvQklDLG1CQUFpQixFQUFFLHVEQXBCdkI7QUFxQklDLGdCQUFjLEVBQUUsbUNBckJwQjtBQXNCSUMsdUJBQXFCLEVBQUUsaUtBdEIzQjtBQXVCSUMsMkJBQXlCLEVBQUcsK0JBdkJoQztBQXdCSUMsNEJBQTBCLEVBQUcsZ0hBeEJqQztBQXlCSUMsNkJBQTJCLEVBQUcseUpBekJsQztBQTBCSUMsbUJBQWlCLEVBQUUsNkRBMUJ2QjtBQTJCSUMsd0JBQXNCLEVBQUUsOEJBM0I1QjtBQTRCSUMsMEJBQXdCLEVBQUUsbURBNUI5QjtBQTZCSUMsK0JBQTZCLEVBQUUsOEJBN0JuQztBQThCSUMsb0JBQWtCLEVBQUcsYUE5QnpCO0FBK0JJQyxvQkFBa0IsRUFBRyxnR0EvQnpCO0FBZ0NJQyxxQkFBbUIsRUFBRyxtSEFoQzFCO0FBaUNJQywyQkFBeUIsRUFBRyxTQWpDaEM7QUFrQ0lDLDJCQUF5QixFQUFHLHdIQWxDaEM7QUFtQ0lDLDRCQUEwQixFQUFHLDJJQW5DakM7QUFvQ0lDLDBCQUF3QixFQUFFLDZJQXBDOUI7QUFxQ0lDLGVBQWEsRUFBRSxxREFyQ25CO0FBc0NJQyxrQkFBZ0IsRUFBRSxzQ0F0Q3RCO0FBdUNJQyxpQkFBZSxFQUFFLHdEQXZDckI7QUF3Q0lDLGNBQVksRUFBRSxvQkF4Q2xCO0FBeUNJQyxvQkFBa0IsRUFBRSw2SEF6Q3hCO0FBMENJQyx1QkFBcUIsRUFBRywrSEExQzVCO0FBMkNJQyxtQkFBaUIsRUFBRyx1SUEzQ3hCO0FBNENJQyxhQUFXLEVBQUUsbUNBNUNqQjtBQTZDSUMsc0JBQW9CLEVBQUcsMEJBN0MzQjtBQThDSUMsc0JBQW9CLEVBQUcsNEdBOUMzQjtBQStDSUMsdUJBQXFCLEVBQUcseUpBL0M1QjtBQWdESUMsc0JBQW9CLEVBQUcsdUlBaEQzQjtBQWlESUMsa0JBQWdCLEVBQUUsNkNBakR0QjtBQWtESUMsc0JBQW9CLEVBQUcsOEZBbEQzQjtBQW1ESUMsd0JBQXNCLEVBQUcsOEhBbkQ3QjtBQW9ESUMsd0JBQXNCLEVBQUcsNkNBcEQ3QjtBQXFESUMsd0JBQXNCLEVBQUcsOEhBckQ3QjtBQXNESUMseUJBQXVCLEVBQUcsMElBdEQ5QjtBQXVESUMsNEJBQTBCLEVBQUUsOFNBdkRoQztBQXdESUMsMEJBQXdCLEVBQUUsaUdBeEQ5QjtBQXlESUMsMEJBQXdCLEVBQUcsK0hBekQvQjtBQTBESUMsMEJBQXdCLEVBQUUsNERBMUQ5QjtBQTJESUMsZ0NBQThCLEVBQUcseUVBM0RyQztBQTRESUMsbUJBQWlCLEVBQUUsOENBNUR2QjtBQTZESUMsbUJBQWlCLEVBQUcsMkNBN0R4QjtBQThESUMsbUJBQWlCLEVBQUcsc0hBOUR4QjtBQStESUMsb0JBQWtCLEVBQUcsa0lBL0R6QjtBQWdFSUMsdUJBQXFCLEVBQUUsd0pBaEUzQjtBQWlFSXpFLGlCQUFlLEVBQUUsb0NBakVyQjtBQWtFSTBFLG1CQUFpQixFQUFFLHlEQWxFdkI7QUFtRUlDLHlCQUF1QixFQUFFLHVFQW5FN0I7QUFvRUlDLDhCQUE0QixFQUFFLHFFQXBFbEM7QUFxRUlDLDJCQUF5QixFQUFFLDRFQXJFL0I7QUFzRUlDLGlDQUErQixFQUFFLHNEQXRFckM7QUF1RUlDLDRCQUEwQixFQUFFLG1EQXZFaEM7QUF3RUlDLGdCQUFjLEVBQUUsbUJBeEVwQjtBQXlFSUMsZUFBYSxFQUFFLDJGQXpFbkI7QUEwRUlDLG1CQUFpQixFQUFFLGdMQTFFdkI7QUEyRUlDLHFCQUFtQixFQUFFLHFDQTNFekI7QUE0RUlDLHVCQUFxQixFQUFFO0FBNUUzQixDQURBLEM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQUE7SUFFTUMsSTs7Ozs7Ozs0QkFFYUMsSyxFQUNmO0FBQ0ksVUFBR0EsS0FBSyxLQUFHQyxTQUFSLElBQXFCRCxLQUFLLEtBQUcsSUFBaEMsRUFDSSxPQUFPLElBQVAsQ0FESixLQUdBO0FBQ0lBLGFBQUssSUFBRSxFQUFQLENBREosQ0FDYzs7QUFDVkEsYUFBSyxHQUFDQSxLQUFLLENBQUNFLElBQU4sRUFBTjtBQUNBLFlBQUdGLEtBQUssS0FBRyxFQUFYLEVBQ0ksT0FBTyxJQUFQLENBREosS0FHSSxPQUFPLEtBQVA7QUFDUDtBQUNKOzs7a0NBRW9CRyxRLEVBQ3JCO0FBQ0ksVUFBR0osSUFBSSxDQUFDSyxPQUFMLENBQWFELFFBQWIsQ0FBSCxFQUNJQSxRQUFRLEdBQUMsSUFBVCxDQURKLEtBR0E7QUFDSUEsZ0JBQVEsSUFBRSxFQUFWLENBREosQ0FDaUI7O0FBQ2JBLGdCQUFRLEdBQUNBLFFBQVEsQ0FBQ0QsSUFBVCxFQUFUO0FBQ0g7QUFDRCxhQUFPQyxRQUFQO0FBQ0g7Ozt3Q0FHMEJBLFEsRUFBVUUsRyxFQUNyQztBQUNJRixjQUFRLElBQUUsRUFBVixDQURKLENBQ2lCOztBQUNkLFVBQUdBLFFBQVEsQ0FBQ0csTUFBVCxHQUFrQkQsR0FBckIsRUFDS0YsUUFBUSxHQUFDQSxRQUFRLENBQUNJLFNBQVQsQ0FBbUIsQ0FBbkIsRUFBdUJGLEdBQUcsR0FBQyxDQUEzQixJQUErQixLQUF4QztBQUNKLGFBQU9GLFFBQVA7QUFDSCxLLENBRUQ7Ozs7K0JBQ2tCQSxRLEVBQVVLLE0sRUFDNUI7QUFDSSxVQUFNQyxXQUFXLEdBQUcsSUFBSUMsTUFBSixDQUFXQyxNQUFNLENBQUNDLElBQVAsQ0FBWUosTUFBWixFQUFvQkssSUFBcEIsQ0FBeUIsR0FBekIsQ0FBWCxFQUF5QyxJQUF6QyxDQUFwQjtBQUNBLGFBQU9WLFFBQVEsQ0FBQ1csT0FBVCxDQUFpQkwsV0FBakIsRUFBOEIsVUFBQ00sT0FBRCxFQUNyQztBQUNJLGVBQU9QLE1BQU0sQ0FBQ08sT0FBRCxDQUFiO0FBQ0gsT0FITSxDQUFQO0FBSUgsSyxDQUVEOzs7O2lDQUNvQkMsRyxFQUFLWCxHLEVBQ3pCO0FBQ0lXLFNBQUcsR0FBR0MsSUFBSSxDQUFDQyxJQUFMLENBQVVGLEdBQVYsQ0FBTjtBQUNBWCxTQUFHLEdBQUdZLElBQUksQ0FBQ0UsS0FBTCxDQUFXZCxHQUFYLENBQU47QUFDQSxhQUFPWSxJQUFJLENBQUNFLEtBQUwsQ0FBV0YsSUFBSSxDQUFDRyxNQUFMLE1BQWlCZixHQUFHLEdBQUdXLEdBQXZCLENBQVgsSUFBMENBLEdBQWpEO0FBQ0gsSyxDQUVEOzs7OytCQUNrQkssVSxFQUNsQjtBQUFBLFVBRDhCQyxJQUM5Qix1RUFEbUMsSUFDbkM7QUFDSSxVQUFHdkIsSUFBSSxDQUFDSyxPQUFMLENBQWFpQixVQUFiLENBQUgsRUFDSSxPQUFPLEVBQVA7QUFDSixVQUFJRSxNQUFNLEdBQUMsSUFBSUMsSUFBSixDQUFTSCxVQUFULENBQVg7QUFDQSxVQUFJSSxLQUFLLEdBQUNGLE1BQU0sQ0FBQ0csT0FBUCxLQUFpQixFQUEzQjtBQUNBLFVBQUdELEtBQUssQ0FBQ25CLE1BQU4sS0FBZSxDQUFsQixFQUNJbUIsS0FBSyxHQUFDLE1BQUlBLEtBQVY7QUFDSixVQUFJRSxRQUFRLEdBQUVKLE1BQU0sQ0FBQ0ssUUFBUCxLQUFrQixDQUFuQixHQUFzQixFQUFuQztBQUNBLFVBQUdELFFBQVEsQ0FBQ3JCLE1BQVQsS0FBa0IsQ0FBckIsRUFDSXFCLFFBQVEsR0FBQyxNQUFJQSxRQUFiO0FBQ0osVUFBSUUsTUFBTSxHQUFDTixNQUFNLENBQUNPLFdBQVAsRUFBWDtBQUNBLFVBQUdSLElBQUksS0FBRyxJQUFWLEVBQ0ksT0FBT0csS0FBSyxHQUFDLEdBQU4sR0FBVUUsUUFBVixHQUFtQixHQUFuQixHQUF1QkUsTUFBOUIsQ0FESixLQUVLLElBQUlQLElBQUksS0FBRyxNQUFYLEVBQWtCO0FBQ25CLGVBQU9PLE1BQU0sR0FBQyxHQUFQLEdBQVdGLFFBQVgsR0FBb0IsR0FBcEIsR0FBd0JGLEtBQS9CLENBREMsS0FHRCxPQUFPRSxRQUFRLEdBQUMsR0FBVCxHQUFhRixLQUFiLEdBQW1CLEdBQW5CLEdBQXVCSSxNQUE5QjtBQUNQOzs7Ozs7QUFHTHJJLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQnNHLElBQWpCLEM7Ozs7Ozs7Ozs7O0FDaEZBdkcsTUFBTSxDQUFDQyxPQUFQLEdBQ0E7QUFDSXNJLFFBQU0sRUFBRywyQkFEYjtBQUVJQyxtQkFBaUIsRUFBRyxpQkFGeEI7QUFHSVYsTUFBSSxFQUFHLElBSFg7QUFJSVcsY0FBWSxFQUFHLGNBSm5CO0FBS0lDLGVBQWEsRUFBRyxZQUxwQjtBQU1JQyxpQkFBZSxFQUFHLGNBTnRCO0FBT0lDLGVBQWEsRUFBRyxrQkFQcEI7QUFRSUMsZ0JBQWMsRUFBRyxnQkFSckI7QUFTSUMsYUFBVyxFQUFFLGFBVGpCO0FBVUlDLDhCQUE0QixFQUFFLG9CQVZsQztBQVdJQyxxQkFBbUIsRUFBRSwyQkFYekI7QUFZSUMsOEJBQTRCLEVBQUcsRUFabkM7QUFhSUMsaUJBQWUsRUFBRztBQWJ0QixDQURBLEMsQ0FnQkEscUc7Ozs7Ozs7Ozs7OztBQ2hCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFTyxJQUFNQyxVQUFVLEdBQUcsU0FBYkEsVUFBYSxDQUFDQyxJQUFELEVBQU9DLElBQVAsRUFDMUI7QUFDSUMsY0FBWSxDQUFDQyxPQUFiLENBQXFCSCxJQUFyQixFQUEyQkksSUFBSSxDQUFDQyxTQUFMLENBQWVKLElBQWYsQ0FBM0I7QUFDSCxDQUhNO0FBS0EsSUFBTUssU0FBUyxHQUFHLFNBQVpBLFNBQVksQ0FBQ04sSUFBRCxFQUN6QjtBQUFBLE1BRGdDTyxJQUNoQyx1RUFEcUMsS0FDckM7QUFDSSxNQUFHQSxJQUFILEVBQ0ksT0FBT0gsSUFBSSxDQUFDSSxLQUFMLENBQVdOLFlBQVksQ0FBQ08sT0FBYixDQUFxQlQsSUFBckIsQ0FBWCxDQUFQLENBREosS0FHSSxPQUFPRSxZQUFZLENBQUNPLE9BQWIsQ0FBcUJULElBQXJCLENBQVA7QUFDUCxDQU5NO0FBUUEsSUFBTVUsWUFBWSxHQUFHLFNBQWZBLFlBQWUsQ0FBQ1YsSUFBRCxFQUM1QjtBQUNJRSxjQUFZLENBQUNTLFVBQWIsQ0FBd0JYLElBQXhCO0FBQ0gsQ0FITSxDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0NkUDs7QUFDTyxJQUFNWSxVQUFVLEdBQUcsU0FBYkEsVUFBYSxDQUFDQyxTQUFELEVBQVlDLE9BQVosRUFDMUI7QUFBQSxNQUQrQ0MsVUFDL0MsdUVBRDBELEVBQzFEO0FBQUEsTUFEOERDLEtBQzlELHVFQURvRSxFQUNwRTtBQUFBLE1BRHdFQyxRQUN4RSx1RUFEaUYsRUFDakY7QUFBQSxNQURxRkMsYUFDckYsdUVBRG1HLEVBQ25HO0FBQUEsTUFEdUdoRCxPQUN2Ryx1RUFEK0csSUFDL0c7QUFDSSxNQUFHViwyREFBTyxDQUFDc0QsT0FBRCxDQUFQLElBQW9CdEQsMkRBQU8sQ0FBQ3FELFNBQUQsQ0FBOUIsRUFDSSxPQUFPLEtBQVAsQ0FESixLQUdBO0FBQ0ksUUFBTU0sVUFBVSxHQUFDQyxRQUFRLENBQUNDLGFBQVQsQ0FBdUJQLE9BQXZCLENBQWpCO0FBRUEsUUFBRyxDQUFDdEQsMkRBQU8sQ0FBQ3dELEtBQUQsQ0FBWCxFQUFtQjtBQUNmRyxnQkFBVSxDQUFDRyxFQUFYLEdBQWNOLEtBQWQ7O0FBRUosUUFBR08sS0FBSyxDQUFDQyxPQUFOLENBQWNQLFFBQWQsS0FBMkJBLFFBQVEsQ0FBQ3ZELE1BQVQsSUFBaUIsQ0FBL0MsRUFDQTtBQUNJLFdBQUksSUFBSStELENBQVIsSUFBYVIsUUFBYjtBQUNJRSxrQkFBVSxDQUFDTyxTQUFYLENBQXFCQyxHQUFyQixDQUF5QlYsUUFBUSxDQUFDUSxDQUFELENBQWpDO0FBREo7QUFFSDs7QUFFRCxRQUFHLFFBQU9QLGFBQVAsTUFBeUIsUUFBNUIsRUFBc0M7QUFDdEM7QUFDSSxhQUFJLElBQUlVLFlBQVIsSUFBd0JWLGFBQXhCO0FBQ0lDLG9CQUFVLENBQUNVLFlBQVgsQ0FBd0JELFlBQXhCLEVBQXNDVixhQUFhLENBQUNVLFlBQUQsQ0FBbkQ7QUFESjtBQUVIOztBQUVELFFBQUcsQ0FBQ3BFLDJEQUFPLENBQUN1RCxVQUFELENBQVgsRUFDSUksVUFBVSxDQUFDVyxTQUFYLEdBQXFCZixVQUFVLENBQUM3QyxPQUFYLENBQW1CLEtBQW5CLEVBQXlCLE1BQXpCLENBQXJCLENBbkJSLENBbUI4RDs7QUFFMUQsUUFBR0EsT0FBSCxFQUNJMkMsU0FBUyxDQUFDaUIsU0FBVixHQUFvQixFQUFwQjtBQUNKakIsYUFBUyxDQUFDa0IsV0FBVixDQUFzQlosVUFBdEI7QUFDSDtBQUNKLENBOUJNLEM7Ozs7Ozs7Ozs7OztBQ0hQO0FBQUE7QUFBQTtBQUVPLElBQU1hLFFBQVEsR0FBRyxTQUFYQSxRQUFXLEdBQ3hCO0FBQ0lDLFNBQU8sQ0FBQ0MsR0FBUixDQUFZLCtMQUFaO0FBQ0EsU0FBTyxJQUFQO0FBQ0gsQ0FKTSxDOzs7Ozs7Ozs7Ozs7QUNGUDtBQUFBO0FBQUE7QUFBQTtDQUVBOztBQUNPLElBQU1DLFlBQVksR0FBRyxTQUFmQSxZQUFlLEdBQzVCO0FBQ0ksTUFBRzNFLDJEQUFPLENBQUM0RSxRQUFRLENBQUNDLE1BQVYsQ0FBVixFQUNJLE9BQU8sS0FBUDtBQUVKLE1BQU1DLFVBQVUsR0FBR0YsUUFBUSxDQUFDQyxNQUFULENBQWdCMUUsU0FBaEIsQ0FBMEIsQ0FBMUIsRUFBNkI0RSxLQUE3QixDQUFtQyxHQUFuQyxDQUFuQjtBQUNBLE1BQUcsQ0FBQ2hCLEtBQUssQ0FBQ0MsT0FBTixDQUFjYyxVQUFkLENBQUQsSUFBOEJBLFVBQVUsQ0FBQzVFLE1BQVgsS0FBb0IsQ0FBckQsRUFDSSxPQUFPLEtBQVA7QUFFSixNQUFJOEUsS0FBSjtBQUFBLE1BQVdDLEtBQUssR0FBQyxFQUFqQjs7QUFDQSxPQUFJLElBQUloQixDQUFSLElBQWFhLFVBQWIsRUFDQTtBQUNJRSxTQUFLLEdBQUdGLFVBQVUsQ0FBQ2IsQ0FBRCxDQUFWLENBQWNjLEtBQWQsQ0FBb0IsR0FBcEIsQ0FBUjtBQUNBLFFBQUdDLEtBQUssQ0FBQzlFLE1BQU4sS0FBZSxDQUFsQixFQUNJK0UsS0FBSyxDQUFDRCxLQUFLLENBQUMsQ0FBRCxDQUFOLENBQUwsR0FBZ0JFLFNBQVMsQ0FBQ0YsS0FBSyxDQUFDLENBQUQsQ0FBTixDQUF6QjtBQUNQOztBQUNELFNBQU9DLEtBQVA7QUFDSCxDQWpCTSxDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0hQLElBQU1FLGNBQWMsR0FBR0MsbUJBQU8sQ0FBQyxrREFBRCxDQUE5Qjs7QUFFQTtDQUdBO0FBQ0E7O0FBQ08sSUFBTUMsU0FBUztBQUFBLHFFQUFJO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSw2Q0FFZixJQUFJQyxPQUFKLENBQVksVUFBQ0MsT0FBRCxFQUFVQyxNQUFWLEVBQ25CO0FBQ0ksa0JBQU1DLEdBQUcsR0FBRyxJQUFJQyxjQUFKLEVBQVo7QUFDQUQsaUJBQUcsQ0FBQ0UsSUFBSixDQUFTLEtBQVQsRUFBZ0JSLGNBQWMsQ0FBQ3hELE1BQWYsR0FBc0J3RCxjQUFjLENBQUN2RCxpQkFBckQ7O0FBQ0E2RCxpQkFBRyxDQUFDRyxNQUFKLEdBQWE7QUFBQSx1QkFBTUwsT0FBTyxDQUFDM0MsSUFBSSxDQUFDSSxLQUFMLENBQVd5QyxHQUFHLENBQUNJLFlBQWYsQ0FBRCxDQUFiO0FBQUEsZUFBYjs7QUFDQUosaUJBQUcsQ0FBQ0ssT0FBSixHQUFjO0FBQUEsdUJBQU1OLE1BQU0sQ0FBQ0MsR0FBRyxDQUFDTSxVQUFMLENBQVo7QUFBQSxlQUFkOztBQUNBTixpQkFBRyxDQUFDTyxJQUFKO0FBQ0gsYUFQTSxDQUZlOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEdBQUo7O0FBQUEsa0JBQVRYLFNBQVM7QUFBQTtBQUFBO0FBQUEsR0FBZjtBQVlBLElBQU1ZLGlCQUFpQixHQUFHLFNBQXBCQSxpQkFBb0IsQ0FBQ0MsTUFBRCxFQUNqQztBQUNJLE1BQU1DLFNBQVMsR0FBQyxJQUFJL0UsSUFBSixHQUFXZ0YsaUJBQVgsRUFBaEI7QUFDQSxNQUFHRCxTQUFTLEdBQUdELE1BQU0sQ0FBQ0csaUJBQW5CLElBQXdDRixTQUFTLEdBQUdELE1BQU0sQ0FBQ0ksaUJBQTlELEVBQ0ksT0FBTyxDQUFQLENBREosS0FFSyxPQUFPSCxTQUFQO0FBQ1IsQ0FOTSxDLENBUVA7QUFDQTs7QUFDTyxJQUFNSSxXQUFXLEdBQUcsU0FBZEEsV0FBYyxDQUFDQyxRQUFELEVBQVdDLFFBQVgsRUFDM0I7QUFDSSxNQUFNQyxLQUFLLEdBQUNGLFFBQVEsR0FBQzNGLElBQUksQ0FBQ0UsS0FBTCxDQUFXRixJQUFJLENBQUNHLE1BQUwsTUFBZXlGLFFBQVEsR0FBQ0QsUUFBeEIsQ0FBWCxDQUFyQjtBQUNBLE1BQU1HLE9BQU8sR0FBQyxvREFBZDtBQUNBLE1BQU1DLE1BQU0sR0FBQyw4QkFBYjtBQUNBLE1BQUlDLFFBQVEsR0FBQ0YsT0FBTyxDQUFDOUYsSUFBSSxDQUFDRSxLQUFMLENBQVdGLElBQUksQ0FBQ0csTUFBTCxLQUFjMkYsT0FBTyxDQUFDekcsTUFBakMsQ0FBRCxDQUFwQjs7QUFDQSxPQUFJLElBQUkrRCxDQUFDLEdBQUMsQ0FBVixFQUFZQSxDQUFDLEdBQUV5QyxLQUFLLEdBQUMsQ0FBckIsRUFBd0J6QyxDQUFDLEVBQXpCLEVBQ0E7QUFDSSxRQUFJQSxDQUFDLEdBQUcsQ0FBTCxLQUFXLENBQWQsRUFDSTRDLFFBQVEsSUFBRUQsTUFBTSxDQUFDL0YsSUFBSSxDQUFDRSxLQUFMLENBQVdGLElBQUksQ0FBQ0csTUFBTCxLQUFjNEYsTUFBTSxDQUFDMUcsTUFBaEMsQ0FBRCxDQUFoQixDQURKLEtBR0kyRyxRQUFRLElBQUVGLE9BQU8sQ0FBQzlGLElBQUksQ0FBQ0UsS0FBTCxDQUFXRixJQUFJLENBQUNHLE1BQUwsS0FBYzJGLE9BQU8sQ0FBQ3pHLE1BQWpDLENBQUQsQ0FBakI7QUFDUDs7QUFDRDJHLFVBQVEsSUFBRUYsT0FBTyxDQUFDOUYsSUFBSSxDQUFDRSxLQUFMLENBQVdGLElBQUksQ0FBQ0csTUFBTCxLQUFjMkYsT0FBTyxDQUFDekcsTUFBakMsQ0FBRCxDQUFqQjtBQUNBLFNBQU8yRyxRQUFQO0FBQ0gsQ0FmTSxDLENBaUJQO0FBQ0E7O0FBQ08sSUFBTUMsVUFBVSxHQUFHLFNBQWJBLFVBQWEsQ0FBQ0MsTUFBRCxFQUFTQyxLQUFULEVBQWdCQyxVQUFoQixFQUMxQjtBQUNJLE1BQU1DLFdBQVcsR0FDakI7QUFDSXBELE1BQUUsRUFBRWlELE1BRFI7QUFFSUMsU0FBSyxFQUFFQSxLQUZYO0FBR0lHLFlBQVEsRUFBR0Y7QUFIZixHQURBO0FBTUExRSxzRUFBVSxDQUFDLE1BQUQsRUFBUzJFLFdBQVQsQ0FBVjtBQUNILENBVE0sQyxDQVdQO0FBQ0E7O0FBQ08sSUFBTUUsZ0JBQWdCLEdBQUcsU0FBbkJBLGdCQUFtQixDQUFDbkMsS0FBRCxFQUNoQztBQUNJLE1BQU1vQyxVQUFVLEdBQUN2RSxtRUFBUyxDQUFDLFlBQUQsQ0FBMUI7O0FBQ0EsTUFBRyxDQUFDOUMsMkRBQU8sQ0FBQ3FILFVBQUQsQ0FBWCxFQUNBO0FBQ0ksUUFBTUMsTUFBTSxHQUFDMUUsSUFBSSxDQUFDSSxLQUFMLENBQVdxRSxVQUFYLENBQWI7O0FBQ0EsUUFBRyxDQUFDckgsMkRBQU8sQ0FBQ3NILE1BQU0sQ0FBQ0gsUUFBUixDQUFSLElBQTZCLENBQUNuSCwyREFBTyxDQUFDc0gsTUFBTSxDQUFDQyxnQkFBUixDQUFyQyxJQUFrRSxDQUFDdkgsMkRBQU8sQ0FBQ3NILE1BQU0sQ0FBQ0UsZUFBUixDQUExRSxJQUFzRyxDQUFDeEgsMkRBQU8sQ0FBQ3NILE1BQU0sQ0FBQ0csV0FBUixDQUFqSCxFQUNBO0FBQ0l4QyxXQUFLLENBQUNrQyxRQUFOLEdBQWVHLE1BQU0sQ0FBQ0gsUUFBdEI7QUFDQWxDLFdBQUssQ0FBQ3NDLGdCQUFOLEdBQXVCRCxNQUFNLENBQUNDLGdCQUE5QjtBQUNBdEMsV0FBSyxDQUFDdUMsZUFBTixHQUFzQkYsTUFBTSxDQUFDRSxlQUE3QjtBQUNBdkMsV0FBSyxDQUFDd0MsV0FBTixHQUFrQkgsTUFBTSxDQUFDRyxXQUF6QjtBQUNIO0FBQ0o7O0FBQ0QsU0FBT3hDLEtBQVA7QUFDSCxDQWZNLEMsQ0FpQlA7QUFDQTs7QUFDTyxJQUFNeUMsWUFBWTtBQUFBLHNFQUFHLGtCQUFPeEIsTUFBUDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFleUIsa0JBQWYsOERBQXNCLEVBQXRCO0FBQTBCQywwQkFBMUI7QUFBMENDLG1CQUExQztBQUFtREMscUJBQW5EO0FBQUEsOENBRWpCLElBQUl4QyxPQUFKLENBQVksVUFBQ0MsT0FBRCxFQUFVQyxNQUFWLEVBQ25CO0FBQ0ksa0JBQU11QyxTQUFTLEdBQUNqRixtRUFBUyxDQUFDLE1BQUQsQ0FBekI7O0FBQ0Esa0JBQUc5QywyREFBTyxDQUFDK0gsU0FBRCxDQUFWLEVBQ0E7QUFDSUMsNEJBQVksQ0FBQ0osY0FBRCxFQUFpQkMsT0FBakIsRUFBMEJDLFNBQTFCLENBQVo7QUFDQXZDLHVCQUFPLENBQUMsS0FBRCxDQUFQO0FBQ0gsZUFKRCxNQU1BO0FBQ0ksb0JBQU0wQyxJQUFJLEdBQUNyRixJQUFJLENBQUNJLEtBQUwsQ0FBVytFLFNBQVgsQ0FBWDs7QUFDQSxvQkFBRy9ILDJEQUFPLENBQUNpSSxJQUFJLENBQUNuRSxFQUFOLENBQVAsSUFBb0I5RCwyREFBTyxDQUFDaUksSUFBSSxDQUFDakIsS0FBTixDQUEzQixJQUEyQ2hILDJEQUFPLENBQUNpSSxJQUFJLENBQUNkLFFBQU4sQ0FBbEQsSUFBcUVjLElBQUksQ0FBQ2QsUUFBTCxHQUFnQi9GLElBQUksQ0FBQzhHLEdBQUwsRUFBeEYsRUFDQTtBQUNJaEYsd0ZBQVksQ0FBQyxNQUFELENBQVo7QUFDQThFLDhCQUFZLENBQUNKLGNBQUQsRUFBaUJDLE9BQWpCLEVBQTBCQyxTQUExQixDQUFaO0FBQ0F2Qyx5QkFBTyxDQUFDLEtBQUQsQ0FBUDtBQUNILGlCQUxELE1BT0E7QUFDSSxzQkFBTUUsR0FBRyxHQUFHLElBQUlDLGNBQUosRUFBWjtBQUNBRCxxQkFBRyxDQUFDRSxJQUFKLENBQVMsS0FBVCxFQUFnQlIsY0FBYyxDQUFDeEQsTUFBZixHQUFzQnVFLE1BQU0sQ0FBQ2lDLFVBQTdCLEdBQXdDakMsTUFBTSxDQUFDa0MsZUFBL0MsR0FBK0RILElBQUksQ0FBQ2pCLEtBQXBGOztBQUNBdkIscUJBQUcsQ0FBQ0csTUFBSixHQUFhLFlBQ2I7QUFDSSx3QkFBSXlDLFFBQVEsR0FBQ3pGLElBQUksQ0FBQ0ksS0FBTCxDQUFXeUMsR0FBRyxDQUFDSSxZQUFmLENBQWI7O0FBQ0Esd0JBQUlKLEdBQUcsQ0FBQ2tDLE1BQUosS0FBZSxHQUFmLElBQXNCVSxRQUFRLENBQUNDLE9BQS9CLElBQTBDRCxRQUFRLENBQUN2RSxFQUFULElBQWVqRSxTQUE3RCxFQUNBO0FBQ0ksMEJBQUd3SSxRQUFRLENBQUN2RSxFQUFULEtBQWNtRSxJQUFJLENBQUNuRSxFQUF0QixFQUNBO0FBQ0ltRSw0QkFBSSxDQUFDekYsSUFBTCxHQUFVNkYsUUFBUSxDQUFDN0YsSUFBbkI7QUFDQXlGLDRCQUFJLENBQUNNLFFBQUwsR0FBY0YsUUFBUSxDQUFDRSxRQUF2QjtBQUNBTiw0QkFBSSxDQUFDTyxjQUFMLEdBQW9CSCxRQUFRLENBQUNHLGNBQTdCO0FBQ0FQLDRCQUFJLENBQUNOLE1BQUwsR0FBWVUsUUFBUSxDQUFDVixNQUFyQixDQUpKLENBSWdDOztBQUM1QnBGLDRGQUFVLENBQUMsTUFBRCxFQUFTMEYsSUFBVCxDQUFWLENBTEosQ0FNSTs7QUFDQSw0QkFBR0ksUUFBUSxDQUFDVixNQUFULEtBQWtCLE1BQWxCLElBQTRCVSxRQUFRLENBQUNJLFFBQVQsSUFBcUIsQ0FBcEQsRUFDQTtBQUNJLDhCQUFNQyxVQUFVLEdBQUN4QyxNQUFNLENBQUN5QyxPQUFQLEdBQWUsR0FBZixHQUFtQnhELGNBQWMsQ0FBQ2pELFdBQW5EO0FBQ0EsOEJBQUcwRyxNQUFNLENBQUNoRSxRQUFQLENBQWdCaUUsSUFBaEIsQ0FBcUJDLE9BQXJCLENBQTZCSixVQUE3QixNQUEyQyxDQUFDLENBQS9DLEVBQ0lFLE1BQU0sQ0FBQ2hFLFFBQVAsQ0FBZ0JtRSxNQUFoQixDQUF1QixNQUFJNUQsY0FBYyxDQUFDakQsV0FBMUMsRUFIUixDQUcrRDs7QUFDM0RxRCxpQ0FBTyxDQUFDLElBQUQsQ0FBUDtBQUNILHlCQU5ELE1BUUE7QUFDSSw4QkFBR29DLE1BQU0sQ0FBQ3pILE1BQVAsS0FBZ0IsQ0FBaEIsSUFBcUJ5SCxNQUFNLENBQUNtQixPQUFQLENBQWVULFFBQVEsQ0FBQ1YsTUFBeEIsTUFBa0MsQ0FBQyxDQUEzRCxFQUNBO0FBQ0lLLHdDQUFZLENBQUNKLGNBQUQsRUFBaUJDLE9BQWpCLEVBQTBCQyxTQUExQixDQUFaO0FBQ0F2QyxtQ0FBTyxDQUFDLEtBQUQsQ0FBUDtBQUNILDJCQUpELE1BTUlBLE9BQU8sQ0FBQyxJQUFELENBQVA7QUFDUDtBQUNKLHVCQXpCRCxNQTJCQTtBQUNJckMsOEZBQVksQ0FBQyxNQUFELENBQVo7QUFDQThFLG9DQUFZLENBQUNKLGNBQUQsRUFBaUJDLE9BQWpCLEVBQTBCQyxTQUExQixDQUFaO0FBQ0F2QywrQkFBTyxDQUFDLEtBQUQsQ0FBUDtBQUNIO0FBQ0oscUJBbENELE1Bb0NBO0FBQ0lyQyw0RkFBWSxDQUFDLE1BQUQsQ0FBWjtBQUNBOEUsa0NBQVksQ0FBQ0osY0FBRCxFQUFpQkMsT0FBakIsRUFBMEJDLFNBQTFCLENBQVo7QUFDQXZDLDZCQUFPLENBQUMsS0FBRCxDQUFQO0FBQ0g7QUFDSixtQkE1Q0Q7O0FBNkNBRSxxQkFBRyxDQUFDSyxPQUFKLEdBQWM7QUFBQSwyQkFBTU4sTUFBTSxDQUFDQyxHQUFHLENBQUNNLFVBQUwsQ0FBWjtBQUFBLG1CQUFkOztBQUNBTixxQkFBRyxDQUFDTyxJQUFKO0FBQ0g7QUFDSjtBQUNKLGFBdEVNLENBRmlCOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEdBQUg7O0FBQUEsa0JBQVowQixZQUFZO0FBQUE7QUFBQTtBQUFBLEdBQWxCLEMsQ0EwRVA7O0FBQ0EsSUFBTU0sWUFBWSxHQUFHLFNBQWZBLFlBQWUsQ0FBQ0osY0FBRCxFQUFpQkMsT0FBakIsRUFBMEJDLFNBQTFCLEVBQ3JCO0FBQ0ksTUFBRyxDQUFDOUgsMkRBQU8sQ0FBQzZILE9BQUQsQ0FBWCxFQUNJdEYsb0VBQVUsQ0FBQyxTQUFELEVBQVlzRixPQUFaLENBQVY7QUFDSixNQUFHLENBQUM3SCwyREFBTyxDQUFDOEgsU0FBRCxDQUFYLEVBQ0l2RixvRUFBVSxDQUFDLEtBQUQsRUFBUXVGLFNBQVIsQ0FBVjtBQUNKLE1BQUcsQ0FBQzlILDJEQUFPLENBQUM0SCxjQUFELENBQVgsRUFDSWdCLE1BQU0sQ0FBQ2hFLFFBQVAsQ0FBZ0JtRSxNQUFoQixDQUF1Qm5CLGNBQXZCO0FBQ1AsQ0FSRCxDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDM0pBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBLElBQU16QyxjQUFjLEdBQUdDLG1CQUFPLENBQUMsaURBQUQsQ0FBOUIsQyxDQUVBOzs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtDQUdBOztBQUNBLElBQU00RCxHQUFHLEdBQUc1RCxtRUFBUSxJQUFhLEdBQUNELGNBQWMsQ0FBQ2pFLElBQTdCLEdBQWtDLFVBQW5DLENBQW5COztBQUNBLElBQU0rSCxRQUFRLEdBQUc3RCxnRUFBUSxJQUFhLEdBQUNELGNBQWMsQ0FBQ2pFLElBQTdCLEdBQWtDLE9BQW5DLENBQXhCOztBQUVBLElBQU1nSSxXQUFXLEdBQUd0RixRQUFRLENBQUN1RixjQUFULENBQXdCLFVBQXhCLENBQXBCO0FBRUEzRSxxRUFBUTtBQUVSLElBQUkwQixNQUFKOztBQUNBLElBQU1rRCxVQUFVO0FBQUEscUVBQUc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1CQUlJL0QsaUVBQVMsRUFKYjs7QUFBQTtBQUlYYSxrQkFKVzs7QUFBQSxnQkFLUEEsTUFMTztBQUFBO0FBQUE7QUFBQTs7QUFNUDlDLDRFQUFVLENBQUM4RixXQUFELEVBQWMsR0FBZCxFQUFtQkYsR0FBRyxDQUFDdFAsV0FBdkIsRUFBb0MsRUFBcEMsRUFBd0MsQ0FBQyxPQUFELENBQXhDLENBQVY7QUFOTztBQUFBOztBQUFBO0FBQUE7QUFBQSxtQkFVaUJnTyxvRUFBWSxDQUFDeEIsTUFBRCxDQVY3Qjs7QUFBQTtBQVVEbUQsdUJBVkM7O0FBV1AsZ0JBQUdBLFdBQUgsRUFDQTtBQUNJOUcsd0ZBQVUsQ0FBQyxTQUFELEVBQVk7QUFBRXNGLHVCQUFPLEVBQUVvQixRQUFRLENBQUM1TCxnQkFBcEI7QUFBc0NpTSxxQkFBSyxFQUFDO0FBQTVDLGVBQVosQ0FBVixDQURKLENBQ3VGOztBQUM3RXJCLGtCQUZWLEdBRWVuRix5RUFBUyxDQUFDLE1BQUQsRUFBUyxJQUFULENBRnhCO0FBR1V5RyxzQkFIVixHQUdtQnRCLElBQUksQ0FBQ04sTUFBTCxHQUFZLFVBSC9CLEVBRzBDOztBQUN0Q2lCLG9CQUFNLENBQUNoRSxRQUFQLENBQWdCbUUsTUFBaEIsQ0FBdUIsTUFBSTVELGNBQWMsQ0FBQ29FLFFBQUQsQ0FBekM7QUFDQW5HLDhFQUFVLENBQUM4RixXQUFELEVBQWMsR0FBZCxFQUFtQkQsUUFBUSxDQUFDNUwsZ0JBQTVCLEVBQThDLEVBQTlDLEVBQWtELENBQUMsYUFBRCxDQUFsRCxDQUFWLENBTEosQ0FLaUY7QUFDaEYsYUFQRCxNQVNBO0FBQ1U0SCxtQkFEVixHQUNnQk4sa0VBQVksRUFENUI7O0FBRUksa0JBQUdNLEtBQUssSUFBSUEsS0FBSyxDQUFDdUUsQ0FBTixLQUFVM0osU0FBdEIsRUFDQTtBQUNVNEYsbUJBRFYsR0FDZ0IsSUFBSUMsY0FBSixFQURoQjtBQUVJRCxtQkFBRyxDQUFDRSxJQUFKLENBQVMsS0FBVCxFQUFnQlIsY0FBYyxDQUFDeEQsTUFBZixHQUFzQnVFLE1BQU0sQ0FBQ2lDLFVBQTdCLEdBQXdDakMsTUFBTSxDQUFDdUQsd0JBQS9DLEdBQXdFeEUsS0FBSyxDQUFDdUUsQ0FBOUY7O0FBQ0EvRCxtQkFBRyxDQUFDaUUsa0JBQUosR0FBeUIsWUFDekI7QUFDSSxzQkFBSSxLQUFLQyxVQUFMLElBQW1CakUsY0FBYyxDQUFDa0UsSUFBdEMsRUFDQTtBQUNJLHdCQUFJdkIsUUFBUSxHQUFDekYsSUFBSSxDQUFDSSxLQUFMLENBQVcsS0FBSzZDLFlBQWhCLENBQWI7O0FBQ0Esd0JBQUksS0FBSzhCLE1BQUwsS0FBZ0IsR0FBaEIsSUFBdUJVLFFBQVEsQ0FBQ3RCLE1BQVQsSUFBbUJsSCxTQUExQyxJQUF1RHdJLFFBQVEsQ0FBQ3JCLEtBQVQsSUFBa0JuSCxTQUE3RSxFQUNBO0FBQ0ksMEJBQUlnSyxnQkFBZ0IsR0FBQ3pJLElBQUksQ0FBQzhHLEdBQUwsS0FBVzRCLFFBQVEsQ0FBQzVELE1BQU0sQ0FBQzZELHVCQUFSLEVBQWdDLEVBQWhDLENBQVIsR0FBNEMsSUFBNUMsR0FBaUQsSUFBakY7QUFDQWpELHdGQUFVLENBQUN1QixRQUFRLENBQUN0QixNQUFWLEVBQWtCc0IsUUFBUSxDQUFDckIsS0FBM0IsRUFBa0M2QyxnQkFBbEMsQ0FBVjtBQUNBdEgsZ0dBQVUsQ0FBQyxTQUFELEVBQVk7QUFBRXNGLCtCQUFPLEVBQUVvQixRQUFRLENBQUN4TSxpQkFBcEI7QUFBdUM2TSw2QkFBSyxFQUFDO0FBQTdDLHVCQUFaLENBQVYsQ0FISixDQUdvRjs7QUFDaEZsRyxzRkFBVSxDQUFDOEYsV0FBRCxFQUFjLEdBQWQsRUFBbUJELFFBQVEsQ0FBQ3hNLGlCQUE1QixFQUErQyxFQUEvQyxFQUFtRCxDQUFDLFNBQUQsQ0FBbkQsQ0FBVixDQUpKLENBSThFOztBQUMxRW1NLDRCQUFNLENBQUNoRSxRQUFQLENBQWdCbUUsTUFBaEIsQ0FBdUIsTUFBSTVELGNBQWMsQ0FBQ3RELFlBQTFDLEVBTEosQ0FLNEQ7QUFDM0QscUJBUEQsTUFRSyxJQUFJLENBQUMsS0FBSzhGLE1BQUwsS0FBZ0IsR0FBaEIsSUFBdUIsS0FBS0EsTUFBTCxLQUFnQixHQUF4QyxLQUFnRFUsUUFBUSxDQUFDMkIsTUFBVCxJQUFtQm5LLFNBQXZFLEVBQ0w7QUFDSywwQkFBR2tFLEtBQUssQ0FBQ0MsT0FBTixDQUFjcUUsUUFBUSxDQUFDMkIsTUFBdkIsQ0FBSCxFQUNHM0IsUUFBUSxDQUFDMkIsTUFBVCxHQUFrQjNCLFFBQVEsQ0FBQzJCLE1BQVQsQ0FBZ0J2SixJQUFoQixDQUFxQixNQUFyQixDQUFsQixDQURILEtBR0c0SCxRQUFRLENBQUMyQixNQUFULEdBQWtCaEIsR0FBRyxDQUFDdFAsV0FBdEI7QUFDSjBKLHNGQUFVLENBQUM4RixXQUFELEVBQWMsR0FBZCxFQUFtQmIsUUFBUSxDQUFDMkIsTUFBNUIsRUFBb0MsRUFBcEMsRUFBd0MsQ0FBQyxPQUFELENBQXhDLENBQVY7QUFDSCxxQkFQSSxNQVNENUcsZ0VBQVUsQ0FBQzhGLFdBQUQsRUFBYyxHQUFkLEVBQW1CRCxRQUFRLENBQUM5TCx3QkFBVCxDQUFrQ3VELE9BQWxDLENBQTBDLE1BQTFDLEVBQWtEeUUsY0FBYyxDQUFDbEQsY0FBakUsQ0FBbkIsRUFBcUcsRUFBckcsRUFBeUcsQ0FBQyxPQUFELENBQXpHLENBQVY7QUFDUDtBQUNKLGlCQXhCRDs7QUF5QkF3RCxtQkFBRyxDQUFDTyxJQUFKO0FBQ0g7QUFDSjs7QUFyRE07QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQTBEWDVDLDRFQUFVLENBQUM4RixXQUFELEVBQWMsR0FBZCxFQUFtQkYsR0FBRyxDQUFDdFAsV0FBdkIsRUFBb0MsRUFBcEMsRUFBd0MsQ0FBQyxPQUFELENBQXhDLENBQVY7O0FBMURXO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEdBQUg7O0FBQUEsa0JBQVYwUCxVQUFVO0FBQUE7QUFBQTtBQUFBLEdBQWhCOztBQTZEQUEsVUFBVSxHIiwiZmlsZSI6Ii4vSlMvdmFsaWRhdGlvbi5hcHAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gXCIuL3NyYy92YWxpZGF0aW9uLmpzXCIpO1xuIiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL2dlbmVyYWxcIjogXCIuLi9sYW5nL2ZyL2dlbmVyYWwuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9nZW5lcmFsJFwiOyIsInZhciBtYXAgPSB7XG5cdFwiLi9mci91c2VyXCI6IFwiLi4vbGFuZy9mci91c2VyLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvdXNlciRcIjsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgc2l0ZUhUTUxUaXRsZSA6IFwiV2lraUxlcm5pIDogcXUnYWxsZXotdm91cyBhcHByZW5kcmUgYXVqb3VyZCdodWkgP1wiLFxuICAgIHNpdGVNZXRhRGVzY3JpcHRpb24gOiBcIkNoYXF1ZSBqb3VyLCB0ZXN0ZXogdm9zIGNvbm5haXNzYW5jZXMgZXQgYXBwcmVuZXogZGUgbm91dmVsbGVzIGNob3NlcyBhdmVjIFdpa2lMZXJuaS5cIixcbiAgICBzY3JpcHRUaW1pbmdJbmZvIDogXCJEdXLDqWUgZGUgbGEgcsOpcG9uc2UgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNjcmlwdFRpbWluZ0FsZXJ0IDogXCIqKiogU2NyaXB0IGxlbnQgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNlcnZlckVycm9yIDogXCJEw6lzb2zDqS4gVW5lIGVycmV1ciBpbXByw6l2dWUgZXN0IHN1cnZlbnVlLiBTaSBjZWxhIHBlcnNpc3RlLCBuJ2jDqXNpdGV6IMOgIHByw6l2ZW5pciBsJ2FkbWluaXN0cmF0ZXVyIGR1IHNpdGUuXCIsXG4gICAgc2VydmVyRXJyb3JBZG1pbiA6IFwiQnVnIGRlIGwnYXBwbGljYXRpb24gOlwiLFxuICAgIG5lZWRlZFBhcmFtcyA6IFwiRGVzIHBhcmFtw6h0cmVzIG7DqWNlc3NhaXJlcyBtYW5xdWFudHMgc29udCBtYW5xdWFudHMuXCIsXG4gICAgYmFkVXJsIDogXCJUZW50YXRpdmUgZCdhY2PDqHMgw6AgdW5lIHBhZ2UgbidleGlzdGFudCBwYXMgOlwiLFxuICAgIG5vdFZhbGlkRm9ybWF0IDogXCJGb3JtYXQgbm9uIHZhbGlkZS5cIixcbiAgICBub3RBbGxvd2VkIDogXCJWb3VzIG4nYXZleiBwYXMgbGVzIGRyb2l0cyBuw6ljZXNzYWlyZXMgcG91ciBjZXR0ZSBhY3Rpb24uXCIsXG4gICAgbm90UmVxdWlyZWQgOiBcIkZhY3VsdGF0aWYuXCIsXG4gICAgdXBkYXRlQnRuVHh0OiBcIk1vZGlmaWVyXCIsXG4gICAgYWRkQnRuVHh0OiBcIkFqb3V0ZXJcIixcbiAgICBkZWxldGVCdG5UeHQ6IFwiU3VwcHJpbWVyXCIsXG4gICAgYWRkT2tNZXNzYWdlIDogXCJMZXMgZG9ubsOpZXMgb250IGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llcy5cIixcbiAgICB1cGRhdGVPa01lc3NhZ2UgOiBcIkxhIG1pc2Ugw6Agam91ciDDoCBqb3VyIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgZGVsZXRlT2tNZXNzYWdlIDogXCJMYSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIGZhaWxBdXRoIDogXCJFcnJldXIgZCdhdXRoZW50aWZpY2F0aW9uLlwiLFxuICAgIGZhaWxBdXRoSGVhZGVyIDogXCJBYnNlbmNlIGRlIGhlYWRlciBBdXRob3JpemF0aW9uLlwiLFxuICAgIGZhaWxBdXRoVG9rZW4gOiBcIlRva2VuIGludmFsaWRlIG91IHV0aWxpc2F0ZXVyIG5vbiB0cm91dsOpLlwiLFxuICAgIGZhaWxBdXRoSWQgOiBcIklkZW50aWZpYW50IG5vbiB2YWxpZGUgOiBcIixcbiAgICBmYWlsQXV0aENyb24gOiBcIlRlbnRhdGl2ZSBkZSBsYW5jZW1lbnQgZCd1biBjcm9uIHNhbnMgbGUgYm9uIHRva2VuLlwiLFxuICAgIHByZXZpb3VzUGFnZSA6IFwiUGFnZSBwcsOpY8OpZGVudGVcIixcbiAgICBuZXh0UGFnZSA6IFwiUGFnZSBzdWl2YW50ZVwiLFxuICAgIGJ0bkxpbmtUb1F1ZXN0aW9ubmFpcmUgOiBcIkFsbGVyIGF1IHF1aXogIVwiLFxuICAgIHN0YXRzQWRtaW4gOiBcIkR1cmFudCBsZXMgZGVybmnDqHJlcyAyNGggOiBOQl9VU0VSU18yNEggY29tcHRlcyBvbnQgw6l0w6kgY3LDqcOpcywgTkJfU1VCU0NSSVBUSU9OU18yNEggdmFsaWTDqXMgZXQgTkJfVVNFUlNfREVMRVRFRF8yNEggc3VwcHJpbcOpcy4gTkJfQU5TV0VSU18yNEggcsOpcG9uc2VzIGF1eCBxdWl6cyBvbnQgw6l0w6kgZW5yZWdpc3Ryw6llcy48YnI+RW4gdG91dCwgaWwgeSBhIDogTkJfVVNFUlNfVE9UIGNvbXB0ZXMsIGRvbnQgTkJfU1VCU0NSSVBUSU9OU19UT1QgdmFsaWTDqXMgZXQgTkJfU1VCU0NSSVBUSU9OU19QUkVNSVVNIGNvbXB0ZXMgcHLDqW1pdW0uIE5CX0FOU1dFUlNfVE9UIHLDqXBvbnNlcyBhdXggcXVpenMgb250IMOpdMOpIGVucmVnaXN0csOpZXMuPGJyPlBhcm1pIGxlcyBOQl9VU0VSU19ERUxFVEVEX1RPVCBjb21wdGVzIHN1cHByaW3DqXMsIE5CX1VTRVJTX0RFTEVURURfVkFMSURFRCBhdmFpZW50IHZhbGlkw6kgbGV1ciBjb21wdGUgZXQgTkJfVVNFUlNfREVMRVRFRF9QUkVNSVVNIGF2YWllbnQgc291c2NyaXQgdW4gY29tcHRlIHByw6ltaXVtLlwiXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBub3RGb3VuZDogXCJMJ3V0aWxpc2F0ZXVyIG4nYSBwYXMgw6l0w6kgdHJvdXbDqS5cIixcbiAgICBuZWVkTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyLlwiLFxuICAgIG5lZWROb3RUb29Mb25nTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyIG5lIGNvbXB0YW50IHBhcyBwbHVzIGRlIDcwIGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRFbWFpbDogXCJNZXJjaSBkZSBzYWlzaXIgdm90cmUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgbmVlZFVuaXF1ZUVtYWlsOiBcIkwnYWRyZXNzZSBlLW1haWwgcXVlIHZvdXMgYXZleiBzYWlzaWUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcGFyIHVuIGF1dHJlIHV0aWxpc2F0ZXVyLiBTaSB2b3VzIGF2ZXogZMOpasOgIHVuIGNvbXB0ZSwgPGEgaHJlZj0nLyNVUkwnPmNsaXF1ZXotaWNpIHBvdXIgdm91cyBjb25uZWN0ZXI8L2E+LlwiLFxuICAgIG5lZWROb3RUb29Mb25nRW1haWw6IFwiTWVyY2kgZGUgc2Fpc2lyIHVuZSBhZHJlc3NlIGUtbWFpbCBuZSBjb21wdGFudCBwYXMgcGx1cyBkZSAyNTUgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZFBhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZS5cIixcbiAgICBuZWVkTG9uZ1Bhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZSBkJ2F1IG1vaW5zIE1JTl9MRU5HVEggY2FyYWN0w6hyZXMuXCIsXG4gICAgcGFzc3dvcmRDb3BpZWQ6IFwiTGUgbW90IGRlIHBhc3NlIGfDqW7DqXLDqSBhIMOpdMOpIGNvcGnDqSBkYW5zIGxlIHByZXNzZS1wYXBpZXIuIFZvdXMgcG91dmV6IGxlIHJlY29waWVyIG/DuSB2b3VzIGxlIHNvdWhhaXRlci5cIixcbiAgICBuZWVkU3RhdHVzIDogXCJJbCBtYW5xdWUgbGUgc3RhdHV0LlwiLFxuICAgIG5lZWRMYW5ndWFnZSA6IFwiSWwgbWFucXVlIGxlIGNvZGUgbGFuZ3VlLlwiLFxuICAgIG5lZWRWYWxpZExhc3RDb25uZWN0aW9uRGF0ZSA6IFwiTGEgZGF0ZSBkZSBkZXJuacOocmUgY29ubmV4aW9uIG4nZXN0IHBhcyB2YWxpZGUuXCIsXG4gICAgbmVlZFNNVFAgOiBcIklsIG1hbnF1ZSBsZSBzZXJ2ZXVyIFNNVFAuXCIsXG4gICAgbmVlZFNNVFBOb3RGb3VuZCA6IFwiSWwgbWFucXVlIGxlIHNlcnZldXIgU01UUC5cIixcbiAgICBuZWVkS25vd05ld3NsZXR0ZXJPayA6IFwiSWwgZmF1dCBzYXZvaXIgc2kgbCd1dGlsaXNhdGV1ciBhY2NlcHRlIG91IHJlZnVzZSBkZSByZWNldm9pciBsYSBuZXdzbGV0dGVyLlwiLFxuICAgIG5lZWRUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBjb25uYcOudHJlIGxlIG5vbWJyZSBkZSBtaW51dGVzIGR1IGTDqWNhbGFnZSBob3JhaXJlLlwiLFxuICAgIG5lZWRNaW5UaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGVubGV2ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgNzIwLlwiLFxuICAgIG5lZWRNYXhUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGFqb3V0ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgODQwLlwiLFxuICAgIG5lZWRVR0NPayA6IFwiVm91cyBkZXZleiBhY2NlcHRlciBsZXMgQ0dVIHBvdXIgcG91dm9pciBjcsOpZXIgdm90cmUgY29tcHRlLiBcIixcbiAgICBnb2RmYXRoZXJOb3RGb3VuZDogXCJBdWN1biB1dGlsaXNhdGV1ciB2YWxpZGUgdHJvdXbDqSBwb3VyIGNlIGNvZGUgcGFycmFpbi5cIixcbiAgICBnb2RmYXRoZXJGb3VuZDogXCJWb3RyZSBwYXJyYWluIGEgYmllbiDDqXTDqSB0cm91dsOpICFcIixcbiAgICBtYWlsVmFsaWRhdGlvbk1lc3NhZ2U6IFwiVm90cmUgaW5zY3JpcHRpb24gZXN0IGJpZW4gZW5yZWdpc3Ryw6llLlxcblBvdXIgbGEgZmluYWxpc2VyLCBtZXJjaSBkZSBjbGlxdWVyIGRhbnMgbGVzIDI0SCBzdXIgbGUgbGllbiBkZSBjb25maXJtYXRpb24gcXVpIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBwYXIgZS1tYWlsLlwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1N1YmplY3QgOiBcIk1lcmNpIGRlIHZhbGlkZXIgdm90cmUgY29tcHRlXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblBvdXIgdmFsaWRlciB2b3RyZSBjb21wdGUsIG1lcmNpIGRlIGNsaXF1ZXIgc3VyIGxlIGxpZW4gc3VpdmFudCBkYW5zIGxlcyAyNGggOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm90cmUgY29tcHRlLCBtZXJjaSBkZSBjbGlxdWVyIHN1ciBsZSBsaWVuIHN1aXZhbnQgZGFucyBsZXMgMjRoLjwvcD48cD48YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+VmFsaWRlci48L2E+PC9wPlwiLFxuICAgIHZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGNvbXB0ZSB2aWVudCBiaWVuIGQnw6p0cmUgdmFsaWTDqS4gTWVyY2kgZXQgYmllbnZlbnVlICFcIixcbiAgICB2YWxpZGF0aW9uTWVzc2FnZUFkbWluOiBcIkxlIGNvbXB0ZSBhIGJpZW4gw6l0w6kgdmFsaWTDqS5cIixcbiAgICB2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2U6IFwiSWwgc2VtYmxlIHF1ZSB2b3VzIGF5ZXogZMOpasOgIHZhbGlkw6kgdm90cmUgY29tcHRlLlwiLFxuICAgIHZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZUFkbWluOiBcIkNlIGNvbXB0ZSBhIGTDqWrDoCDDqXTDqSB2YWxpZMOpLlwiLFxuICAgIG1haWxXZWxjb21lU3ViamVjdCA6IFwiQmllbnZlbnVlICFcIixcbiAgICBtYWlsV2VsY29tZUJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblZvdHJlIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuXFxuTWVyY2kgZXQgw6AgYmllbnTDtHQgIVwiLFxuICAgIG1haWxXZWxjb21lQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlZvdHJlIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuPC9wPjxwPk1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyU3ViamVjdCA6IFwiTWVyY2kgIVwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlckJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcbkdyw6JjZSDDoCB2b3VzIHVuIG5vdXZlbCB1dGlsaXNhdGV1ciAoRU1BSUwpIHZpZW50IGRlIHMnaW5zY3JpcmUgc3VyIE5PTV9TSVRFLlxcbk1lcmNpIGV0IMOgIGJpZW50w7R0ICFcIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+R3LDomNlIMOgIHZvdXMgdW4gbm91dmVsIHV0aWxpc2F0ZXVyIChFTUFJTCkgdmllbnQgZGUgcydpbnNjcmlyZSBzdXIgTk9NX1NJVEUuPC9wPjxwPk1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGxpZW4gZGUgY29uZmlybWF0aW9uIG5lIHNlbWJsZSBwYXMgdmFsaWRlIG91IGJpZW4gaWwgYSBleHBpcsOpLiBWb3VzIHBvdXZleiBlbiByZWNldm9pciB1biBub3V2ZWF1IDxhIGhyZWY9JyNVUkwnPmVuIGNsaXF1YW50IGljaTwvYT4uXCIsXG4gICAgZW1haWxOb3RGb3VuZDogXCJBdWN1biB1dGlsaXNhdGV1ciB0cm91dsOpIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgYWxyZWFkeUNvbm5lY3RlZDogXCJWb3VzIMOqdGVzIGTDqWrDoCBjb25uZWN0w6koZSkgYXUgc2l0ZSAhXCIsXG4gICAgbmVlZEJlQ29ubmVjdGVkOiBcIlZvdXMgZGV2ZXogw6p0cmUgY29ubmVjdMOpKGUpIHBvdXIgYWNjw6lkZXIgw6AgY2V0dGUgcGFnZS5cIixcbiAgICBjb25uZWN0aW9uT2s6IFwiQ29ubmV4aW9uIHLDqXVzc2llLlwiLFxuICAgIG5lZWRDaG9vc2VMb2dpbldheTogXCJWb3VzIGRldmV6IHNvaXQgc2Fpc2lyIHZvdHJlIG1vdCBkZSBwYXNzZSwgc29pdCBjb2NoZXIgbGEgY2FzZSB2b3VzIHBlcm1ldHRhbnQgZGUgcmVjZXZvaXIgdW4gbGllbiBkZSBjb25uZXhpb24gcGFyIGUtbWFpbC5cIixcbiAgICBuZWVkVmFsaWRhdGlvblRvTG9naW4gOiBcIlZvdXMgZGV2ZXogZCdhYm9yZCB2YWxpZGVyIHZvdHJlIGNvbXB0ZSBhdmFudCBkZSB2b3VzIGNvbm5lY3Rlci4gUG91ciBjZSBmYWlyZSwgdW4gbGllbiB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbC5cIixcbiAgICB0b29NYW55TG9naW5GYWlscyA6IFwiVHJvcCBkZSB0ZW50YXRpdmVzIGRlIGNvbm5leGlvbiBpbmZydWN0dWV1c2VzIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuIFZvdXMgZGV2ZXogYXR0ZW5kcmUgTUlOVVRFUyBtaW51dGVzIHBvdXIgZXNzYXllciBkZSBub3V2ZWF1LlwiLFxuICAgIGJhZFBhc3N3b3JkOiBcIkxlIG1vdCBkZSBwYXNzZSBuJ2VzdCBwYXMgbGUgYm9uLlwiLFxuICAgIG1haWxMb2dpbkxpbmtTdWJqZWN0IDogXCJWb3RyZSBsaWVuIGRlIGNvbm5leGlvbi5cIixcbiAgICBtYWlsTG9naW5MaW5rQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuUG91ciB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6IExJTktfVVJMXCIsXG4gICAgbWFpbExvZ2luTGlua0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZvdXMgY29ubmVjdGVyIMOgIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDo8L3A+PHA+PGEgaHJlZj1cXFwiTElOS19VUkxcXFwiPlZhbGlkZXIuPC9hPjwvcD5cIixcbiAgICBtYWlsTG9naW5MaW5rTWVzc2FnZSA6IFwiVW4gbGllbiBkZSBjb25uZXhpb24gdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHN1ciB2b3RyZSBhZHJlc3NlIGUtbWFpbC4gTmUgdGFyZGV6IHBhcyDDoCBsJ3V0aWxpc2VyLCBjYXIgaWwgbidlc3QgdmFsYWJsZSBxdWUgZHVyYW50IFwiLFxuICAgIHVwZGF0ZWRPa01lc3NhZ2U6IFwiVm9zIGluZm9ybWF0aW9ucyBvbnQgYmllbiDDqXTDqSBtaXNlcyDDoCBqb3VyLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEVtYWlsIDogXCJNYWlzIGxhIG5vdXZlbGxlIGFkcmVzc2UgZS1tYWlsIG4nYSBwdSDDqnRyZSBlbnJlZ2lzdHLDqWUgY2FyIGVsbGUgbidhIHBhcyB1bmUgZm9ybWF0IGNvcnJlY3QuXCIsXG4gICAgdXBkYXRlZE5lZWRVbmlxdWVFbWFpbCA6IFwiTWFpcyBsYSBub3V2ZWxsZSBhZHJlc3NlIGUtbWFpbCBzYWlzaWUgKE5FV19FTUFJTCkgbidhIHB1IMOqdHJlIGVucmVnaXN0csOpZSwgY2FyIGVsbGUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcG91ciB1biBhdXRyZSBjb21wdGUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luU3ViamVjdCA6IFwiTWVyY2kgZGUgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblBvdXIgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cyBkZSBjb25uZXhpb24sIDxhIGhyZWY9XFxcIkxJTktfVVJMXFxcIj5jbGlxdWV6IGljaTwvYT4gc2FucyB0YXJkZXIuPC9wPlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkxpbmtNZXNzYWdlOiBcIkNlcGVuZGFudCwgdm91cyBhdmV6IG1vZGlmacOpIGF1IG1vaW5zIHVuIGRlIHZvcyBpZGVudGlmaWFudHMgZGUgY29ubmV4aW9uIChlbWFpbCBldC9vdSBtb3QgZGUgcGFzc2UpIGV0IDxiPnZvdXMgZGV2ZXogY2xpcXVlciBzdXIgbGUgbGllbiBxdWkgdmllbnQgZGUgdm91cyDDqnRyZXMgZW52b3nDqSBzdXIgdm90cmUgYWRyZXNzZSAoTkVXX0VNQUlMKSBwb3VyIHZhbGlkZXIgY2UgY2hhbmdlbWVudDwvYj4uIEVuIGF0dGVuZGFudCwgbWVyY2kgZGUgY29udGludWVyIMOgIHV0aWxpc2VyIHZvcyBhbmNpZW5zIGlkZW50aWZpYW50cy5cIixcbiAgICB1cGRhdGVkTmVlZFZhbGlkYXRlZFVzZXI6IFwiTCd1dGlsaXNhdGV1ciBxdWUgdm91cyBzb3VoYWl0w6kgbW9kaWZpZXIgbidleGlzdGUgcGFzL3BsdXMgb3UgbidhIHBhcyBlbmNvcmUgdmFsaWTDqSBzb24gY29tcHRlLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEdvZGZhdGhlciA6IFwiTWFpcyBsZSBub3V2ZWF1IGNvZGUgcGFycmFpbiBuJ2EgcHUgw6p0cmUgcmV0ZW51LCBjYXIgaWwgbmUgY29ycmVzcG9uZCDDoCBhdWN1biBjb21wdGUgdXRpbGlzYXRldXIgb3Ugw6AgbCd1dGlsaXNhdGV1ciBsdWktbcOqbWUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luT2tNZXNzYWdlOiBcIkxhIG1pc2Ugw6Agam91ciBkZSB2b3MgaWRlbnRpZmlhbnRzIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgdXBkYXRlZEZhaWxlZEdvZGZhdGhlck5vdEZvdW5kIDogXCJMJ2lkZW50aWZpYW50IGZvdXJuaSBwb3VyIGxlIHBhcnJhaW4gbmUgY29ycmVzcG9uZCDDoCBhdWN1biB1dGlsaXNhdGV1ci5cIixcbiAgICBjcmVhdGlvbk9rTWVzc2FnZTogXCJMZSBub3V2ZWwgdXRpbGlzYXRldXIgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpLlwiLFxuICAgIG1haWxEZWxldGVTdWJqZWN0IDogXCJDb25maXJtZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLlwiLFxuICAgIG1haWxEZWxldGVCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5Qb3VyIHZhbGlkZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbERlbGV0ZUJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCA8YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+Y2xpcXVleiBpY2k8L2E+IHNhbnMgdGFyZGVyLjwvcD5cIixcbiAgICBtYWlsRGVsZXRlTGlua01lc3NhZ2U6IFwiVm90cmUgZGVtYW5kZSBkZSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLiBNZXJjaSBkZSBjbGlxdWVyIHNhbnMgdGFyZGVyIHN1ciBsZSBsaWVuIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbCBwb3VyIGNvbmZpcm1lci5cIixcbiAgICBkZWxldGVPa01lc3NhZ2U6IFwiTCd1dGlsaXNhdGV1ciBhIGJpZW4gw6l0w6kgc3VwcHJpbcOpLlwiLFxuICAgIGRlbGV0ZUZhaWxNZXNzYWdlOiBcIlRlbnRhdGl2ZSBkZSBzdXBwcmVzc2lvbiBkJ3VuIHV0aWxpc2F0ZXVyIGluZXhpc3RhbnQgOiBcIixcbiAgICBtYWlsRGVsZXRlTGlua09rTWVzc2FnZTogXCJWb3RyZSBjb21wdGUgYSBiaWVuIMOpdMOpIHN1cHByaW3DqS4gTWVyY2kgZCdhdm9pciB1dGlsaXPDqSBub3Mgc2VydmljZXMuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtBbHJlYWR5TWVzc2FnZTogXCJJbCBzZW1ibGUgcXVlIHZvdXMgYXlleiBkw6lqw6AgdmFsaWTDqSBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtGYWlsTWVzc2FnZTogXCJWb3RyZSBsaWVuIGRlIHN1cHByZXNzaW9uIG4nZXN0IHBhcyB2YWxpZGUgb3UgYWxvcnMgaWwgbidlc3QgcGx1cyB2YWxhYmxlLlwiLFxuICAgIGNyb25EZWxldGVVbnZhbGlkZWRVc2Vyc01lc3NhZ2U6IFwiIGNvbXB0ZXMgdXRpbGlzYXRldXJzIG5vbiB2YWxpZMOpcyBvbnQgw6l0w6kgc3VwcHJpbcOpcy5cIixcbiAgICBkZWxldGVJbmFjdGl2ZVVzZXJzTWVzc2FnZTogXCIgY29tcHRlcyB1dGlsaXNhdGV1cnMgaW5hY3RpZnMgb250IMOpdMOpIHN1cHByaW3DqXMuXCIsXG4gICAgd2VsY29tZU1lc3NhZ2U6IFwiQmllbnZlbnVlICNOQU1FICFcIixcbiAgICBieWVieWVNZXNzYWdlOiBcIlNpIHZvdXMgdm95ZXogY2UgbWVzc2FnZSwgYydlc3QgcXVlIHZvdHJlIGTDqWNvbm5leGlvbiBzJ2VzdCBiaWVuIGTDqXJvdWzDqWUuPGJyPsOAIGJpZW50w7R0ICFcIixcbiAgICBpbmZvc1VzZXJGb3JBZG1pbjogXCJDZXQgdXRpbGlzYXRldXIgKGlkOiBJRF9VU0VSKSBhIDxiPmNyw6nDqSBzb24gY29tcHRlIGxlIERBVEVfQ1JFQTwvYj4sIGxhIGRlcm5pw6hyZSBtaXNlIMOgIGpvdXIgZGF0YW50IGR1IERBVEVfVVBEQVRFLjxicj48Yj5EYXRlIGRlIHNhIGRlcm5pw6hyZSBjb25uZXhpb24gOiBEQVRFX0NPTk5FQ1RJT04uPC9iPlwiLFxuICAgIGluZm9zQWRtaW5Hb2RmYXRoZXI6IFwiQ2V0IHV0aWxpc2F0ZXVyIGEgw6l0w6kgcGFycmFpbsOpIHBhciBcIixcbiAgICBpbmZvc0FkbWluTmJHb2RDaGlsZHM6IFwiU2VzICNOQiBmaWxsZXVpbHMgOiBcIlxufTsiLCIvLyBRdWVscXVlcyBmb25jdGlvbnMgdXRpbGVzIHBvdXIgbGVzIGNoYcOubmVzXG5cbmNsYXNzIFRvb2xcbntcbiAgICBzdGF0aWMgaXNFbXB0eShteVZhcilcbiAgICB7XG4gICAgICAgIGlmKG15VmFyPT09dW5kZWZpbmVkIHx8IG15VmFyPT09bnVsbClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIG15VmFyKz1cIlwiOy8vIHNpIGF1dHJlIGNob3NlIHF1J3VuZSBjaGHDrm5lIGVudm95w6kuLi5cbiAgICAgICAgICAgIG15VmFyPW15VmFyLnRyaW0oKTtcbiAgICAgICAgICAgIGlmKG15VmFyPT09XCJcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgc3RhdGljIHRyaW1JZk5vdE51bGwobXlTdHJpbmcpXG4gICAge1xuICAgICAgICBpZihUb29sLmlzRW1wdHkobXlTdHJpbmcpKVxuICAgICAgICAgICAgbXlTdHJpbmc9bnVsbDtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVN0cmluZys9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVN0cmluZz1teVN0cmluZy50cmltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG15U3RyaW5nO1xuICAgIH1cblxuXG4gICAgc3RhdGljIHNob3J0ZW5JZkxvbmdlclRoYW4obXlTdHJpbmcsIG1heClcbiAgICB7XG4gICAgICAgIG15U3RyaW5nKz1cIlwiOy8vIGF1IGNhcyBvw7kgY2VsYSBuZSBzZXJhaXQgcGFzIHVuZSBjaGHDrm5lLi4uXG4gICAgICAgaWYobXlTdHJpbmcubGVuZ3RoID4gbWF4KVxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcuc3Vic3RyaW5nKDAsIChtYXgtMykpK1wiLi4uXCI7XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cbiAgICAvLyBzb3VyY2UgOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNTYwNDE0MC9yZXBsYWNlLW11bHRpcGxlLXN0cmluZ3Mtd2l0aC1tdWx0aXBsZS1vdGhlci1zdHJpbmdzXG4gICAgc3RhdGljIHJlcGxhY2VBbGwobXlTdHJpbmcsIG1hcE9iailcbiAgICB7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VFbHRzID0gbmV3IFJlZ0V4cChPYmplY3Qua2V5cyhtYXBPYmopLmpvaW4oXCJ8XCIpLFwiZ2lcIik7XG4gICAgICAgIHJldHVybiBteVN0cmluZy5yZXBsYWNlKHJlcGxhY2VFbHRzLCAobWF0Y2hlZCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG1hcE9ialttYXRjaGVkXTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZnIvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT2JqZXRzX2dsb2JhdXgvTWF0aC9yYW5kb21cbiAgICBzdGF0aWMgZ2V0UmFuZG9tSW50KG1pbiwgbWF4KVxuICAgIHtcbiAgICAgICAgbWluID0gTWF0aC5jZWlsKG1pbik7XG4gICAgICAgIG1heCA9IE1hdGguZmxvb3IobWF4KTtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pKSArIG1pbjtcbiAgICB9XG5cbiAgICAvLyDDoCBjb21wbMOpdGVyIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGF0ZV9mb3JtYXRfYnlfY291bnRyeVxuICAgIHN0YXRpYyBkYXRlRm9ybWF0KGRhdGVTdHJpbmcsIGxhbmc9XCJmclwiKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KGRhdGVTdHJpbmcpKVxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIGxldCBteURhdGU9bmV3IERhdGUoZGF0ZVN0cmluZyk7XG4gICAgICAgIGxldCBteURheT1teURhdGUuZ2V0RGF0ZSgpK1wiXCI7XG4gICAgICAgIGlmKG15RGF5Lmxlbmd0aD09PTEpXG4gICAgICAgICAgICBteURheT1cIjBcIitteURheTtcbiAgICAgICAgbGV0IG15TW91bnRoPShteURhdGUuZ2V0TW9udGgoKSsxKStcIlwiO1xuICAgICAgICBpZihteU1vdW50aC5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlNb3VudGg9XCIwXCIrbXlNb3VudGg7XG4gICAgICAgIGxldCBteVllYXI9bXlEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGlmKGxhbmc9PT1cImZyXCIpXG4gICAgICAgICAgICByZXR1cm4gbXlEYXkrXCIvXCIrbXlNb3VudGgrXCIvXCIrbXlZZWFyO1xuICAgICAgICBlbHNlIGlmIChsYW5nPT09XCJmb3JtXCIpLy8gMjAxNC0wMi0wOVxuICAgICAgICAgICAgcmV0dXJuIG15WWVhcitcIi1cIitteU1vdW50aCtcIi1cIitteURheTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG15TW91bnRoK1wiL1wiK215RGF5K1wiL1wiK215WWVhcjtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVG9vbDsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgYXBpVXJsIDogXCJodHRwOi8vbG9jYWxob3N0OjMwMDAvYXBpXCIsXG4gICAgdXNlcnNHZXRDb25maWdVcmwgOiBcIi91c2VyL2dldGNvbmZpZ1wiLFxuICAgIGxhbmcgOiBcImZyXCIsXG4gICAgdXNlckhvbWVQYWdlIDogXCJhY2N1ZWlsLmh0bWxcIixcbiAgICBhZG1pbkhvbWVQYWdlIDogXCJhZG1pbi5odG1sXCIsXG4gICAgbWFuYWdlckhvbWVQYWdlIDogXCJnZXN0aW9uLmh0bWxcIixcbiAgICBzdWJzY3JpYmVQYWdlIDogXCJpbnNjcmlwdGlvbi5odG1sXCIsXG4gICAgY29ubmVjdGlvblBhZ2UgOiBcImNvbm5leGlvbi5odG1sXCIsXG4gICAgYWNjb3VudFBhZ2U6IFwiY29tcHRlLmh0bWxcIixcbiAgICBxdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlOiBcImdlc3Rpb24tcXVpenMuaHRtbFwiLFxuICAgIHVzZXJzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi11dGlsaXNhdGV1cnMuaHRtbFwiLFxuICAgIG5iUXVlc3Rpb25uYWlyZXNVc2VySG9tZVBhZ2UgOiAxMCxcbiAgICBpbGx1c3RyYXRpb25EaXIgOiBcIi9pbWcvcXVpenMvXCJcbn07XG4vLyDDoCB0ZXJtZSBmdXNpb25uZXIgYXZlYyBsZXMgZMOpY2xhcmF0aW9ucyBiYWNrZW5kIGNvbmNlcm5hbnQgbGUgZnJvbnQsIHRvdXQgw6l0YW50IHNhaXNpIGRhbnMgbCdhZG1pbiIsIi8vIEZPTkNUSU9OUyBVVElMRVMgQVUgU1RPQ0tBR0UgTE9DQUwgKFNFU1NJT04sIENPT0tJRVMsIElOREVYREIsIEVUQy4pXG4vLyBSZXZlbmlyIHBvdXIgZ8OpcmVyIGxlIGNhcyBvw7kgbG9jYWwuc3RvcmFnZSBuJ2VzdCBwYXMgY29ubnUgcG91ciB1dGlsaXNlciBjb29raWVcbiAgICBcbmV4cG9ydCBjb25zdCBzYXZlTG9jYWx5ID0gKG5hbWUsIGRhdGEpID0+XG57XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obmFtZSwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0TG9jYWx5ID0gKG5hbWUsIGpzb249ZmFsc2UpID0+XG57XG4gICAgaWYoanNvbilcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSkpO1xuICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKG5hbWUpO1xufVxuXG5leHBvcnQgY29uc3QgcmVtb3ZlTG9jYWx5ID0gKG5hbWUpID0+XG57XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0obmFtZSk7XG59IiwiaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIEZvbmN0aW9uIGFzc29jaWFudCBsZXMgYXR0cmlidXRzIGZvdXJuaXMgw6AgdW4gY2hhbXAgZGUgZm9ybXVsYWlyZVxuZXhwb3J0IGNvbnN0IGFkZEVsZW1lbnQgPSAoZWx0UGFyZW50LCBlbHRUeXBlLCBlbHRDb250ZW50PVwiXCIsIGVsdElkPVwiXCIsIGVsdENsYXNzPVtdLCBlbHRBdHRyaWJ1dGVzPXt9LCByZXBsYWNlPXRydWUpID0+XG57XG4gICAgaWYoaXNFbXB0eShlbHRUeXBlKSB8fCBpc0VtcHR5KGVsdFBhcmVudCkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBlbHNlXG4gICAge1xuICAgICAgICBjb25zdCBuZXdFbGVtZW50PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZWx0VHlwZSk7XG4gICAgICAgIFxuICAgICAgICBpZighaXNFbXB0eShlbHRJZCkpLy8gdGVzdGVyIHNpIGwnaWQgbidlc3QgcGFzIGTDqWrDoCB1dGlsaXPDqSBkYW5zIGxlIERPTSA/XG4gICAgICAgICAgICBuZXdFbGVtZW50LmlkPWVsdElkO1xuXG4gICAgICAgIGlmKEFycmF5LmlzQXJyYXkoZWx0Q2xhc3MpICYmIGVsdENsYXNzLmxlbmd0aCE9MClcbiAgICAgICAge1xuICAgICAgICAgICAgZm9yKGxldCBpIGluIGVsdENsYXNzKVxuICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuY2xhc3NMaXN0LmFkZChlbHRDbGFzc1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZih0eXBlb2YgZWx0QXR0cmlidXRlcyA9PT0gXCJvYmplY3RcIikgLy8gISEgdG91cyBsZXMgb2JqZXRzIG5lIHNvbnQgcGFzIG9rXG4gICAgICAgIHtcbiAgICAgICAgICAgIGZvcihsZXQgYXR0cmlidXROYW1lIGluIGVsdEF0dHJpYnV0ZXMpXG4gICAgICAgICAgICAgICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmlidXROYW1lLCBlbHRBdHRyaWJ1dGVzW2F0dHJpYnV0TmFtZV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoIWlzRW1wdHkoZWx0Q29udGVudCkpXG4gICAgICAgICAgICBuZXdFbGVtZW50LmlubmVySFRNTD1lbHRDb250ZW50LnJlcGxhY2UoL1xcbi9nLFwiPGJyPlwiKTsvLyBpbm5lckhUTUwgcGVybWV0IGQnYWpvdXRlciBkdSB0ZXh0ZSBheWFudCBsdWktbcOqbWUgZGVzIGJhbGlzZXMsIGV0Yy5cbiAgICAgICAgICAgIFxuICAgICAgICBpZihyZXBsYWNlKVxuICAgICAgICAgICAgZWx0UGFyZW50LmlubmVySFRNTD1cIlwiO1xuICAgICAgICBlbHRQYXJlbnQuYXBwZW5kQ2hpbGQobmV3RWxlbWVudCk7XG4gICAgfSAgICBcbn0iLCIvLyBDZSBzY3JpcHQgZm91cm5pdCBkZXMgZm9uY3Rpb25zIHV0aWxpc8OpZXMgc3VyIHRvdXRlcyBsZXMgcGFnZXMgZHUgc2l0ZVxuXG5leHBvcnQgY29uc3QgaGVsbG9EZXYgPSAoKSA9Plxue1xuICAgIGNvbnNvbGUubG9nKFwiKioqKiBIZWxsbyBhbWkgZMOpdmVsb3BwZXVyIDotKVxcbiBMZSBjb2RlIGRlIFdpa2lMZXJuaSBlc3QgbGlicmUgZXQgZXN0IGxpc2libGUgc3VyIGdpdGxhYiA6IFxcbiBCb25uZSBsZWN0dXJlIDotKSBcXG4gUG91ciBsZXMgc3VnZ2VzdGlvbnMgZCdhbcOpbGlvcmF0aW9uIG91IHF1ZXN0aW9ucyA6IGRldkB3aWxpbGVybmkuY29tICoqKipcIik7XG4gICAgcmV0dXJuIHRydWU7XG59IiwiaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIEZvbmN0aW9uIHLDqWN1cMOpcmFudCBsZXMgcGFyYW3DqHRyZXMgcGFzc8OpcyBwYXIgbCd1cmxcbmV4cG9ydCBjb25zdCBnZXRVcmxQYXJhbXMgPSAoKSA9Plxue1xuICAgIGlmKGlzRW1wdHkobG9jYXRpb24uc2VhcmNoKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgcGFyYW1ldGVycyA9IGxvY2F0aW9uLnNlYXJjaC5zdWJzdHJpbmcoMSkuc3BsaXQoXCImXCIpO1xuICAgIGlmKCFBcnJheS5pc0FycmF5KHBhcmFtZXRlcnMpIHx8IHBhcmFtZXRlcnMubGVuZ3RoPT09MClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICBsZXQgcGFyYW0sIGRhdGFzPXt9O1xuICAgIGZvcihsZXQgaSBpbiBwYXJhbWV0ZXJzKVxuICAgIHtcbiAgICAgICAgcGFyYW0gPSBwYXJhbWV0ZXJzW2ldLnNwbGl0KFwiPVwiKTtcbiAgICAgICAgaWYocGFyYW0ubGVuZ3RoPT09MilcbiAgICAgICAgICAgIGRhdGFzW3BhcmFtWzBdXT1kZWNvZGVVUkkocGFyYW1bMV0pO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YXM7XG59IiwiY29uc3QgY29uZmlnRnJvbnRFbmQgPSByZXF1aXJlKFwiLi4vY29uZmlnL2dlbmVyYWxcIik7XG5cbmltcG9ydCB7IGdldExvY2FseSwgcmVtb3ZlTG9jYWx5LCBzYXZlTG9jYWx5IH0gZnJvbSBcIi4vY2xpZW50c3RvcmFnZS5qc1wiO1xuaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIFLDqWN1cMOocmUgbGVzIGRvbm7DqWVzIGRlIGNvbmZpZ3VyYXRpb24gZGVzIHV0aWxpc2F0ZXVyc1xuLy8gw4AgdGVybWUsIHVuIGZpY2hpZXIgc3RhdGlxdWUgaW1wb3J0YWJsZSBjb21tZSBtb2R1bGUgZGV2cmFpdCDDqXZpdGVyIHVuZSByZXF1w6p0ZSBhamF4XG5leHBvcnQgY29uc3QgZ2V0Q29uZmlnID0gIGFzeW5jICgpID0+XG57XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+XG4gICAge1xuICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgY29uZmlnRnJvbnRFbmQuYXBpVXJsK2NvbmZpZ0Zyb250RW5kLnVzZXJzR2V0Q29uZmlnVXJsKTtcbiAgICAgICAgeGhyLm9ubG9hZCA9ICgpID0+IHJlc29sdmUoSlNPTi5wYXJzZSh4aHIucmVzcG9uc2VUZXh0KSk7XG4gICAgICAgIHhoci5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICAgICAgeGhyLnNlbmQoKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldFRpbWVEaWZmZXJlbmNlID0gKGNvbmZpZykgPT5cbntcbiAgICBjb25zdCB0aW1lTG9jYWw9bmV3IERhdGUoKS5nZXRUaW1lem9uZU9mZnNldCgpO1xuICAgIGlmKHRpbWVMb2NhbCA+IGNvbmZpZy50aW1lRGlmZmVyZW5jZU1heCB8fCB0aW1lTG9jYWwgPCBjb25maWcudGltZURpZmZlcmVuY2VNaW4pXG4gICAgICAgIHJldHVybiAwO1xuICAgIGVsc2UgcmV0dXJuIHRpbWVMb2NhbDtcbn1cblxuLy8gT24gZW5sw6h2ZSB2b2xvbnRhaXJlbWVudCBsZXMgMC9PIHBvdXIgw6l2aXRlciBsZXMgY29uZnVzaW9ucyAhXG4vLyBFdCBtaWV1eCB2YXV0IGF1c3NpIGTDqWJ1dGVyIGV0IGZpbmlyIHBhciB1bmUgbGV0dHJlIHNpbXBsZS5cbmV4cG9ydCBjb25zdCBnZXRQYXNzd29yZCA9IChuYkNhck1pbiwgbmJDYXJNYXgpID0+XG57XG4gICAgY29uc3QgbmJDYXI9bmJDYXJNaW4rTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKihuYkNhck1heC1uYkNhck1pbikpO1xuICAgIGNvbnN0IGxldHRlcnM9XCJBQkNERUZHSElKS0xNTlBRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5wcXJzdHV2d3h5elwiO1xuICAgIGNvbnN0IG90aGVycz1cIjEyMzQ1Njc4OSE/LiotXyVAJsOJw4DDiMOZ4oKsJMOCw4rDm8OOXCI7XG4gICAgbGV0IHBhc3N3b3JkPWxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxldHRlcnMubGVuZ3RoKV07XG4gICAgZm9yKGxldCBpPTE7aTwobmJDYXItMSk7aSsrKVxuICAgIHtcbiAgICAgICAgaWYoKGkgJSAyKSA9PT0xKVxuICAgICAgICAgICAgcGFzc3dvcmQrPW90aGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqb3RoZXJzLmxlbmd0aCldO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBwYXNzd29yZCs9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTsgICBcbiAgICB9XG4gICAgcGFzc3dvcmQrPWxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxldHRlcnMubGVuZ3RoKV07XG4gICAgcmV0dXJuIHBhc3N3b3JkO1xufVxuXG4vLyBKJ3V0aWxpc2UgbGUgc3RvY2thZ2UgbG9jYWwgZHUgbmF2aWdhdGV1ciBwb3VyIGVucmVnaXN0cmVyIGxlcyBkb25uw6llcyBwZXJtZXR0YW50IGRlIHJlY29ubmHDrnRyZSBsJ3V0aWxpc2F0ZXVyIHBhciBsYSBzdWl0ZVxuLy8gU2V1bCBsZSBzZXJ2ZXVyIHBvdXJyYSB2w6lyaWZpZXIgcXVlIGxlcyBpZGVudGlmaWFudHMgc29udCAodG91am91cnMpIHZhbGlkZXMuXG5leHBvcnQgY29uc3Qgc2V0U2Vzc2lvbiA9ICh1c2VySWQsIHRva2VuLCBkdXJhdGlvblRTKSA9Plxue1xuICAgIGNvbnN0IHN0b3JhZ2VVc2VyPVxuICAgIHtcbiAgICAgICAgaWQ6IHVzZXJJZCxcbiAgICAgICAgdG9rZW46IHRva2VuLFxuICAgICAgICBkdXJhdGlvbiA6IGR1cmF0aW9uVFNcbiAgICB9XG4gICAgc2F2ZUxvY2FseShcInVzZXJcIiwgc3RvcmFnZVVzZXIpO1xufVxuXG4vLyBWw6lyaWZpZSBxdSdpbCB5IGEgZGVzIGRvbm7DqWVzIGxvY2FsZXMgY29uY2VybmFudCBsZSByw6lzdWx0YXQgZCd1biBxdWl6XG4vLyBFdCBsZXMgYWpvdXRlIGF1eCBkb25uw6llcyBlbnZvecOpZXMgcGFyIGxlcyBmb3JtdWxhaXJlcyBkJ2luc2NyaXB0aW9uL2Nvbm5leGlvbiBzaSBjJ2VzdCBsZSBjYXNcbmV4cG9ydCBjb25zdCBjaGVja0Fuc3dlckRhdGFzID0gKGRhdGFzKSA9Plxue1xuICAgIGNvbnN0IGxhc3RBbnN3ZXI9Z2V0TG9jYWx5KFwibGFzdEFuc3dlclwiKTtcbiAgICBpZighaXNFbXB0eShsYXN0QW5zd2VyKSlcbiAgICB7XG4gICAgICAgIGNvbnN0IGFuc3dlcj1KU09OLnBhcnNlKGxhc3RBbnN3ZXIpO1xuICAgICAgICBpZighaXNFbXB0eShhbnN3ZXIuZHVyYXRpb24pICYmICFpc0VtcHR5KGFuc3dlci5uYkNvcnJlY3RBbnN3ZXJzKSAmJiAhaXNFbXB0eShhbnN3ZXIuUXVlc3Rpb25uYWlyZUlkKSAmJiAhaXNFbXB0eShhbnN3ZXIubmJRdWVzdGlvbnMpKVxuICAgICAgICB7XG4gICAgICAgICAgICBkYXRhcy5kdXJhdGlvbj1hbnN3ZXIuZHVyYXRpb247XG4gICAgICAgICAgICBkYXRhcy5uYkNvcnJlY3RBbnN3ZXJzPWFuc3dlci5uYkNvcnJlY3RBbnN3ZXJzO1xuICAgICAgICAgICAgZGF0YXMuUXVlc3Rpb25uYWlyZUlkPWFuc3dlci5RdWVzdGlvbm5haXJlSWQ7XG4gICAgICAgICAgICBkYXRhcy5uYlF1ZXN0aW9ucz1hbnN3ZXIubmJRdWVzdGlvbnM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGFzO1xufVxuXG4vLyBDZXR0ZSBmb25jdGlvbiB0ZXN0ZSBsYSBjb25uZXhpb24gZGUgbCd1dGlsaXNhdGV1ciBkJ3VuZSBwYWdlXG4vLyBPbiBwZXV0IGZvdXJuaXMgdW5lIGxpc3RlIGRlIHN0YXR1dHMgYWNjZXB0w6lzIChzaSB2aWRlID0gdG91cyksIGFpbnNpIHF1J3VuZSB1cmwgZGUgcmVkaXJlY3Rpb24gc2kgbm9uIGNvbm5lY3TDqSwgdW4gbWVzc2FnZSBkJ2VycmV1ciDDoCBhZmZpY2hlciBzdXIgbGEgcGFnZSBkZSBkZXN0aW5hdGlvbiBldCBsJ3VybCBzdXIgbGFxdWVsbGUgcmV2ZW5pciB1bmUgZm9pcyBjb25uZWN0w6lcbmV4cG9ydCBjb25zdCBjaGVja1Nlc3Npb24gPSBhc3luYyAoY29uZmlnLCBzdGF0dXM9W10sIHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpID0+XG57XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+XG4gICAge1xuICAgICAgICBjb25zdCB1c2VyRGF0YXM9Z2V0TG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgaWYoaXNFbXB0eSh1c2VyRGF0YXMpKVxuICAgICAgICB7XG4gICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHVzZXI9SlNPTi5wYXJzZSh1c2VyRGF0YXMpO1xuICAgICAgICAgICAgaWYoaXNFbXB0eSh1c2VyLmlkKSB8fMKgaXNFbXB0eSh1c2VyLnRva2VuKSB8fCBpc0VtcHR5KHVzZXIuZHVyYXRpb24pIHx8IHVzZXIuZHVyYXRpb24gPCBEYXRlLm5vdygpKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgIHhoci5vcGVuKFwiR0VUXCIsIGNvbmZpZ0Zyb250RW5kLmFwaVVybCtjb25maWcudXNlclJvdXRlcytjb25maWcuY2hlY2tMb2dpblJvdXRlK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDAgJiYgcmVzcG9uc2UuaXNWYWxpZCAmJiByZXNwb25zZS5pZCAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLmlkPT09dXNlci5pZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLm5hbWU9cmVzcG9uc2UubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLmxhbmd1YWdlPXJlc3BvbnNlLmxhbmd1YWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIudGltZURpZmZlcmVuY2U9cmVzcG9uc2UudGltZURpZmZlcmVuY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5zdGF0dXM9cmVzcG9uc2Uuc3RhdHVzOy8vIGxlIHRva2VuIGV0IGRlIHRvdXRlIGZhw6dvbiB2w6lyaWZpZXIgw6AgY2hhcXVlIHJlcXXDqnRlIMOgIGwnQVBJXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUxvY2FseShcInVzZXJcIiwgdXNlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2kgaWwgcydhZ2l0IGQndW4gXCJ1c2VyXCIgZXQgcXVlIHNvbiBhYm9ubmVtZW50IGEgZXhwaXLDqSwgamUgbGUgcmVkaXJpZ2UgdmVycyBsYSBjYWlzc2UgOi0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2Uuc3RhdHVzPT09XCJ1c2VyXCIgJiYgcmVzcG9uc2UubmJEYXlzT2sgPD0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybEFjY291bnQ9Y29uZmlnLnNpdGVVcmwrXCIvXCIrY29uZmlnRnJvbnRFbmQuYWNjb3VudFBhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YodXJsQWNjb3VudCk9PT0tMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIvXCIrY29uZmlnRnJvbnRFbmQuYWNjb3VudFBhZ2UpOy8vIHBhc3PDqWUgZGlyZWN0ZW1lbnQgaWNpLCBsJ2FuY3JlICNzdWJzY3JpYmUgbmUgZm9uY3Rpb25uZSBwYXMgIT9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RhdHVzLmxlbmd0aCE9PTAgJiYgc3RhdHVzLmluZGV4T2YocmVzcG9uc2Uuc3RhdHVzKT09PS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB4aHIub25lcnJvciA9ICgpID0+IHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICAgICAgICAgICAgeGhyLnNlbmQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuLy8gQ2V0dGUgZm9uY3Rpb24gc2VydCDDoCBsYSBwcsOpY8OpZGVudGUgZW4gY2FzIGRlIGNvbm5leGlvbiBub24gdmFsaWRlXG5jb25zdCByZWRpcmVjdFVzZXIgPSAodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCkgPT5cbntcbiAgICBpZighaXNFbXB0eShtZXNzYWdlKSlcbiAgICAgICAgc2F2ZUxvY2FseShcIm1lc3NhZ2VcIiwgbWVzc2FnZSk7XG4gICAgaWYoIWlzRW1wdHkodXJsV2FudGVkKSlcbiAgICAgICAgc2F2ZUxvY2FseShcInVybFwiLCB1cmxXYW50ZWQpO1xuICAgIGlmKCFpc0VtcHR5KHVybFJlZGlyZWN0aW9uKSlcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbih1cmxSZWRpcmVjdGlvbik7XG59IiwiLy8gLS0gR0VTVElPTiBERSBMQSBQQUdFIFBFUk1FVFRBTlQgREUgVkFMSURFUiBMQSBDUsOJQVRJT04gREUgU09OIENPTVBURVxuXG4vLy8gVW4gdG9rZW4gZXN0IHRyYW5zbWlzIGVuIHBhcmFtw6h0cmUgZGUgbCdVcmwuIElsIGEgdW5lIHZhbGlkaXTDqSBsaW1pdMOpIGRhbnMgbGUgdGVtcHMuXG4vLy8gRGFucyBjZSBjYXMsIG9uIHBldXQgcmVkaXJpZ2VyIGwndXRpbGlzYXRldXIgdmVycyBsYSBwYWdlIGRlIGNvbm5leGlvbiBwb3VyIG9idGVuaXIgdW4gbm91dmVhdSBsaWVuIGRlIHZhbGlkYXRpb25cbi8vLyBTaSBsZSB0b2tlbiBlc3Qgb2ssIG9uIGNyw6llIHVuZSBzZXNzaW9uIGRlIGNvdXJ0ZSBkdXLDqWUgZXQgcmVkaXJpZ2UgbCd1dGlsaXNhdGV1ciB2ZXJzIHNhIHBhZ2UgZCdhY2N1ZWlsXG4vLy8gU2kgbCd1dGlsaXNhdGV1ciBhIGTDqWrDoCB1bmUgc2Vzc2lvbiBhY3RpdmUgdmFsaWRlLCBjJ2VzdCBxdSdpbCBhIGTDqWrDoCBjbGlxdcOpIHN1ciBsZSBsaWVuLiBPbiBsZSByZWRpcmlnZSDDqWdhbGVtZW50IHZlcnMgc2EgcGFnZSBkJ2FjY3VlaWwuXG5cbi8vIEZpY2hpZXIgZGUgY29uZmlndXJhdGlvbiBjw7R0w6kgY2xpZW50IDpcbmNvbnN0IGNvbmZpZ0Zyb250RW5kID0gcmVxdWlyZShcIi4vY29uZmlnL2dlbmVyYWxcIik7XG5cbi8vIEltcG9ydGF0aW9uIGRlcyBmb25jdGlvbnMgdXRpbGUgYXUgc2NyaXB0IDpcbmltcG9ydCB7IGdldExvY2FseSwgc2F2ZUxvY2FseSB9IGZyb20gXCIuL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanNcIjtcbmltcG9ydCB7IGFkZEVsZW1lbnQgfSBmcm9tIFwiLi90b29scy9kb20uanNcIjtcbmltcG9ydCB7IGhlbGxvRGV2IH0gZnJvbSBcIi4vdG9vbHMvZXZlcnl3aGVyZS5qc1wiO1xuaW1wb3J0IHsgZ2V0VXJsUGFyYW1zIH0gZnJvbSBcIi4vdG9vbHMvdXJsLmpzXCI7XG5pbXBvcnQgeyBjaGVja1Nlc3Npb24sIGdldENvbmZpZywgc2V0U2Vzc2lvbiB9IGZyb20gXCIuL3Rvb2xzL3VzZXJzLmpzXCI7XG5cbi8vIERpY3Rpb25uYWlyZXMgOlxuY29uc3QgdHh0ID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrY29uZmlnRnJvbnRFbmQubGFuZytcIi9nZW5lcmFsXCIpO1xuY29uc3QgdHh0VXNlcnMgPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitjb25maWdGcm9udEVuZC5sYW5nK1wiL3VzZXJcIik7XG5cbmNvbnN0IGRpdlJlc3BvbnNlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJyZXNwb25zZVwiKTtcblxuaGVsbG9EZXYoKTtcblxubGV0IGNvbmZpZztcbmNvbnN0IGluaXRpYWxpc2UgPSBhc3luYyAoKSA9Plxue1xuICAgIHRyeVxuICAgIHtcbiAgICAgICAgY29uZmlnID0gYXdhaXQgZ2V0Q29uZmlnKCk7XG4gICAgICAgIGlmKCFjb25maWcpXG4gICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgdHh0LnNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gc2kgbCd1dGlsaXNhdGV1ciBlc3QgZMOpasOgIGNvbm5lY3TDqSwgcGFzIGxhIHBlaW5lIGQnYWxsZXIgKyBsb2luIDpcbiAgICAgICAgICAgIGNvbnN0IGlzQ29ubmVjdGVkPWF3YWl0IGNoZWNrU2Vzc2lvbihjb25maWcpO1xuICAgICAgICAgICAgaWYoaXNDb25uZWN0ZWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2F2ZUxvY2FseShcIm1lc3NhZ2VcIiwgeyBtZXNzYWdlOiB0eHRVc2Vycy5hbHJlYWR5Q29ubmVjdGVkLCBjb2xvcjpcImluZm9ybWF0aW9uXCIgfSk7Ly8gcG91ciBsJ2FmZmljaGVyIHN1ciBsYSBwYWdlIHN1aXZhbnRlXG4gICAgICAgICAgICAgICAgY29uc3QgdXNlcj1nZXRMb2NhbHkoXCJ1c2VyXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvbWVQYWdlPXVzZXIuc3RhdHVzK1wiSG9tZVBhZ2VcIjsvLyBuZSBkZXZyYWl0IHBvdXZvaXIgw6p0cmUgcXVlIHVzZXIgaWNpXG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIi9cIitjb25maWdGcm9udEVuZFtob21lUGFnZV0pO1xuICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHRVc2Vycy5hbHJlYWR5Q29ubmVjdGVkLCBcIlwiLCBbXCJpbmZvcm1hdGlvblwiXSk7Ly8gYXUgY2FzIG/DucKgYmxvY2FnZSByZWRpcmVjdGlvblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFzPWdldFVybFBhcmFtcygpO1xuICAgICAgICAgICAgICAgIGlmKGRhdGFzICYmIGRhdGFzLnQhPT11bmRlZmluZWQpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgY29uZmlnRnJvbnRFbmQuYXBpVXJsK2NvbmZpZy51c2VyUm91dGVzK2NvbmZpZy5jaGVja1N1YnNjcmliZVRva2VuUm91dGUrZGF0YXMudCk7XG4gICAgICAgICAgICAgICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDAgJiYgcmVzcG9uc2UudXNlcklkICE9IHVuZGVmaW5lZCAmJiByZXNwb25zZS50b2tlbiAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29ubmV4aW9uTWF4VGltZT1EYXRlLm5vdygpK3BhcnNlSW50KGNvbmZpZy5jb25uZXhpb25NaW5UaW1lSW5Ib3VycywxMCkqMzYwMCoxMDAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTZXNzaW9uKHJlc3BvbnNlLnVzZXJJZCwgcmVzcG9uc2UudG9rZW4sIGNvbm5leGlvbk1heFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlTG9jYWx5KFwibWVzc2FnZVwiLCB7IG1lc3NhZ2U6IHR4dFVzZXJzLnZhbGlkYXRpb25NZXNzYWdlLCBjb2xvcjpcInN1Y2Nlc3NcIiB9KTsvLyBwb3VyIGwnYWZmaWNoZXIgc3VyIGxhIHBhZ2Ugc3VpdmFudGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHR4dFVzZXJzLnZhbGlkYXRpb25NZXNzYWdlLCBcIlwiLCBbXCJzdWNjZXNzXCJdKTsvLyBhdSBjYXMgb8O5wqBibG9jYWdlIHJlZGlyZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIvXCIrY29uZmlnRnJvbnRFbmQudXNlckhvbWVQYWdlKTsvLyBxdWUgdXNlciBwb3NzaWJsZSBsb3JzIGRlIGxhIGNyw6lhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgodGhpcy5zdGF0dXMgPT09IDIwMCB8fCB0aGlzLnN0YXR1cyA9PT0gNDA0KSAmJiByZXNwb25zZS5lcnJvcnMgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkocmVzcG9uc2UuZXJyb3JzKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVycm9ycyA9IHJlc3BvbnNlLmVycm9ycy5qb2luKFwiPGJyPlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3JzID0gdHh0LnNlcnZlckVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgcmVzcG9uc2UuZXJyb3JzLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHR4dFVzZXJzLmJhZExpbmtWYWxpZGF0aW9uTWVzc2FnZS5yZXBsYWNlKFwiI1VSTFwiLCBjb25maWdGcm9udEVuZC5jb25uZWN0aW9uUGFnZSksIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB4aHIuc2VuZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaChlKVxuICAgIHtcbiAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgIH1cbn1cbmluaXRpYWxpc2UoKTsiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/front/public/a-propos.html b/front/public/a-propos.html new file mode 100644 index 0000000..5163c56 --- /dev/null +++ b/front/public/a-propos.html @@ -0,0 +1,138 @@ + + + + + + + Tout savoir sur WikiLerni + + + + + + + + + + + + +
    + WikiLerni (logo) + +
    + +
    + Logo WikiLerni +

    Cultivons notre jardin !

    +
    + +
    + +
    +

    Qu'est-ce que WikiLerni ?

    + +

    WikiLerni vous propose de lire une sélection d'articles de Wikipédia.
    + Suite à chaque lecture, une série de questions vous permet de tester ce que vous avez retenu.
    + Toutes les réponses à ce quiz se trouvent dans l'article proposé à la lecture.
    + Vous pouvez sauvegarder vos résultats au quiz en créant un compte WikiLerni.
    + Vous pourrez ensuite répondre de nouveau aux mêmes questions plusieurs semaines, mois... après avoir lu l'article.
    + De quoi tester votre mémoire à plus en moins long terme !

    + +

    Que signifie "WikiLerni" ?

    + +

    Le nom "WikiLerni" est composé de deux parties : +

      +
    • « Wiki » fait évidemment référence à l'encyclopédie en ligne Wikipédia. Comme je vous sais curieux, sachez que le terme « wiki » vient lui-même du mot hawaïen « wikiwiki » signifiant « rapide », « vite » ou « informel ».
    • +
    • « Lerni » est un verbe espéranto signifiant « apprendre » ou encore « étudier ». Vous pouvez penser à « learn » en anglais ou encore « lernen » en allemand.
    • +

    +

    Bref, WikiLerni vous invite à apprendre de nouvelles choses avec Wikipédia !
    + Et en lisant ces quelques lignes, vous venez peut-être déjà d'apprendre quelque chose :-)

    + +

    À qui s'adresse WikiLerni ?

    + +

    À toute personne curieuse aimant apprendre de nouvelles choses !
    + Contrairement à d'autres sites de quiz testant votre culture générale, WikiLerni ne vous demande pas d'être déjà très "savants", même si vous l'êtes forcément, au moins dans certains domaines. Si ! Si !
    + Vous êtes ici pour apprendre et toutes les réponses aux questions des quizs se trouvent dans l'article qui vous est proposé à la lecture.
    + C'est donc une façon ludique d'apprendre de nouvelles choses sur des sujets auxquels vous ne vous seriez peut-être jamais intéressé par vous-même.

    + +

    Est-il nécessaire de créer un compte pour utiliser WikiLerni ?

    + +

    Non, vous pouvez parcourir librement WikiLerni sans avoir besoin d'être connecté au site.
    + Votre compte vous permettra de : +

      +
    • Sauvegarder vos résultats aux quizs
    • +
    • Recevoir des suggestions de nouvelles lectures, directement par e-mail
    • +
    • Faciliter votre navigation via un moteur de recherche interne à WikiLerni
    • +
    • + d'autres fonctionnalités à venir...
    • +

    + +

    Comment sont sélectionnés les articles proposés par WikiLerni ?

    + +

    Tout comme Wikipédia, WikiLerni se veut éclectique.
    + Donc il vous sera proposé des articles sur des sujets très variés : sciences, arts, histoire, littérature, mythologie, géographie, culture populaire, etc.
    + Il n'y aucun sujet qui ne soit pas digne d'intérêt à priori. Seront évités des articles indiqués par Wikipédia comme de faible qualité ou encore sujets à polémique.

    + +

    Les articles proposés à la lecture peuvent être de longueurs variées.
    + Une estimation de la durée de lecture vous est indiquée sur la page du quiz ou encore dans les e-mails que vous recevez si vous êtes abonné.
    + Vous pourrez ainsi choisir de laisser de côté un article un peu long pour y revenir quand vous aurez plus de temps.

    + +

    Pour l'instant, les articles proposés sont uniquement francophones.
    + Mais suivant le succès du site, des versions dans d'autres langues pourront être envisagées.
    + Si vous souhaitez vous-même lancer une version dans une autre langue, mais n'avez pas les compétences techniques pour le faire, n'hésitez à me contacter pour un éventuel partenariat.

    + +

    Quel lien entre WikiLerni et Wikipédia ?

    + +

    Puisque toutes les suggestions de lecture de WikiLerni vous amènent sur Wikipédia, le lien est évident.
    + Pour autant, WikiLerni n'est pas un projet porté par la fondation Wikipédia, ni par une de ses associations locales, mais est un projet indépendant.
    + Au-delà de ce lien pratique, WikiLerni se veut très proche de l'esprit de Wikipédia en partageant son attrait pour la culture libre et le "libre" en général. + L'application faisant fonctionner WikiLerni est un logiciel libre, c'est-à-dire que toute personne peut l'utiliser, étudier son code, le modifier, le distribuer selon son souhait.
    Ceci est également vrai pour le graphisme du site et les quizs eux-mêmes : texte d'introduction, questions/réponses, illustrations... Sauf exceptions indiquées.

    + +

    Est-ce que WikiLerni est gratuit ?

    + +

    Oui.. et non ! Réponse de normand venant d'un breton ? :-)
    Vous pouvez tout à fait parcourir WikiLerni, lire les articles proposés et répondre aux quizs.
    + Tout cela se fait sans avoir besoin de vous abonner et donc gratuitement.
    Par contre, si vous souhaitez garder vos résultats, recevoir par mail de nouvelles suggestions de lectures... vous devrez vous abonner au site.
    Vous pourrez alors tester gratuitement l'abonnement pendant une période de découverte.
    Ensuite, vous serez invité à souscrire à un abonnement, mais à un prix "libre", c'est-à-dire que différentes possibilités vous seront proposées.
    Tout le monde n'a pas les mêmes moyens, ni le même intérêt pour le WikiLerni, donc à vous de choisir en conscience.
    + Vous aimez WikiLerni, mais ne pouvez vraiment pas payer pour ce service ? Contactez-moi. Vous n'avez pas à vous justifier.
    + De même, si aucune des options ne vous convient ou encore si vous préférez un autre moyen de paiement (chèque, virement...), contactez-moi pour me dire ce que vous souhaitez.
    Des abonnements de groupe (famille, écoles, associations...) ou autres formules peuvent aussi être envisagées, dans la mesure où cela sera techniquement possible.
    Bref, nous sommes ici plus dans l'esprit d'un financement participatif que dans celui d'un abonnement classique.
    En souscrivant à un abonnement, vous permettez à WikiLerni d'exister.

    + +

    À quoi va servir l'argent de mon abonnement ?

    +

    Cet argent va principalement servir à : +

      +
    • Payer les frais techniques liés au site : serveurs, routeurs e-mail, paiement en ligne...
    • +
    • Développer le logiciel libre permettant à WikiLerni de fonctionner.
    • +
    • Consacrer du temps à sélectionner les articles Wikipédia et préparer les questions.
    • +
    • Gérer le site au quotidien : répondre à vos courriels, communiquer, etc.
    • +

    +

    Tout cela sans vous imposer de publicités ou faire commerce de vos données personnelles.
    + Par ailleurs, une partie des bénéfices nets de WikiLerni seront distribués sous forme de dons à l'association Wikimédia France et aux développeurs des logiciels libres utilisés par WikiLerni.
    Je parle de bénéfices "nets", car au-delà des frais de fonctionnement, mon activité étant déclarée, il faut y soustraire TVA, cotisations, etc.

    + Pas de publicité, respect de vos données personnelles, activité déclarée en France... cela change, non ?

    + +

    Comment puis-je aider WikiLerni ?

    + +

    Tout d'abord en l'utilisant et me retournant vos éventuelles remarques/suggestions.
    + Un bug ? Une erreur d'orthographe ? Une suggestion de fonctionnalité ? Quelque chose que vous ne comprenez pas ? N'hésitez pas à me le dire, cela m'intéresse.
    + Ensuite, si vous avez les moyens, vous pouvez souscrire un abonnement payant pour permettre au projet de perdurer.
    + Et WikiLerni n'ayant pas les moyens des grandes sociétés pour communiquer, vous pouvez aussi en parler autour de vous, en ligne ou dans la vie de tous les jours. + Vous le savez sans doute, rien ne vaut le bouche à oreille !
    + Un système de parrainage est d'ailleurs prévu pour vous récompenser : à chaque fois qu'une personne inscrite en vous désignant comme "parrain" souscrit un abonnement payant, votre propre abonnement se trouve prolongé de 30 jours.

    + +

    Tester gratuitement

    +
    + +
    + + + \ No newline at end of file diff --git a/front/public/accueil.html b/front/public/accueil.html new file mode 100644 index 0000000..42e41d2 --- /dev/null +++ b/front/public/accueil.html @@ -0,0 +1,79 @@ + + + + + + + + Mon WikiLerni + + + + + + + + + + + + + +
    + WikiLerni (logo) + +
    + +
    + +
    + + + + +
    + +
    + +

    Chercher un quiz

    + + + +

    Les quizs attendant votre réponse

    +
    +
    + +
    +
    + +
    + +
    + + + + \ No newline at end of file diff --git a/front/public/aurevoir.html b/front/public/aurevoir.html new file mode 100644 index 0000000..386214d --- /dev/null +++ b/front/public/aurevoir.html @@ -0,0 +1,46 @@ + + + + + + + Validation de la suppression de votre compte + + + + + + + + + + + +
    + WikiLerni (logo) + +
    + +
    + Logo WikiLerni +

    Cultivons notre jardin !

    +

    Validation de la suppression de votre compte

    +

    Si vous voyez ce message, c'est que votre lien de validation n'est pas valide ou a expiré. Vous pouvez en demander un nouveau en cliquant ici.

    +
    + + + + \ No newline at end of file diff --git a/front/public/compte.html b/front/public/compte.html new file mode 100644 index 0000000..4928336 --- /dev/null +++ b/front/public/compte.html @@ -0,0 +1,168 @@ + + + + + + + Mon compte WikiLerni + + + + + + + + + + + + + +
    + WikiLerni (logo) + +
    + +
    + +
    + + + +
    +

    Votre compte WikiLerni

    +
    +
    +
    +
    +
    +
    +
    Laisser vide sauf si vous souhaitez le changer.
    +
    +

    Par défaut un nouveau quiz vous est proposé tous les jours. Vous pouvez préciser ci-dessous les jours souhaités.

    +
      +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    +
    +
      +
    • + +
    • +
    • + +
    • +
    • + + +
    • +
    +
    +
    +
    + +

    Votre abonnement

    +
    + +
      +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    • + +
    • + +
    • + +
    • +
    + +
    + +
    +

    Paiement de votre abonnement annuel prémium à 12 € TTC/an.

    + +
    +
    +

    Paiement de votre abonnement annuel prémium à 24 € TTC/an.

    + +
    +
    +

    Paiement de votre abonnement annuel prémium à 60 € TTC/an.

    + +
    +
    +

    Paiement de votre abonnement annuel prémium à 120 € TTC/an.

    + +
    +

    En cliquant sur le bouton de paiement, vous serez dirigé vers l'outil de facturation et de paiement en ligne.
    Lors de votre premier abonnement, vous devrez y créer un compte client qui est distinct de votre compte utilisateur WikiLerni. Vous pouvez y utiliser un mot de passe différent.
    Les années suivantes, lors de vos renouvellements, vous pourrez vous reconnecter à ce compte client.

    + +
    + +
    +

    Prix libre ?

    +

    WikiLerni pratique le "prix libre", c'est-à-dire que vous pouvez choisir quel montant vous êtes prêt à payer pour continuer à utiliser WikiLerni.

    +

    Cependant, il ne s'agit pas vraiment d'un don, car sans ce financement participatif, le site WikiLerni cessera son activité et vous ne pourrez donc plus l'utiliser.

    +

    Vous pouvez donc choisir en conscience ce que vous pouvez et souhaitez payer cette année pour WikiLerni, sachant que ce choix ne vous engagera pas pour les futurs renouvellements.

    +

    Une fois sélectionné le montant qui vous convient, il vous faudra cocher la case de validation des Conditions Générales de Vente, pour voir apparaître un bouton de paiement qui vous mènera sur l'outil de facturation et paiement en ligne de la société WebPortage.

    +

    Vous aimez WikiLerni, mais ne pouvez vraiment pas payer ? Vous préférez un autre montant ou un autre moyen de paiement (chèque, virement) ? Ou encore vous avez besoin d'explications ? Alors contactez-moi. Je me ferai un plaisir de vous répondre et d'essayer de m'adapter à chaque situation.

    +
    + +

    Les utilisateurs que vous avez parrainés

    +
    +

    Vous pouvez parrainer d'autres utilisateurs. Pour ce faire, demandez-leur de saisir lors de l'inscription votre adresse e-mail ou encore le code suivant : .

    +

    À chaque fois qu'un utilisateur que vous avez parrainé souscrit ou renouvelle un abonnement payant, son abonnement comme le vôtre se trouve prolongé gratuitement de 30 jours. Cet avantage restera valable tant que cet utilisateur et vous-mêmes garderez votre compte WikiLerni.

    +
    +

    Pour l'instant, aucune personne ne s'est inscrite, en vous désignant comme "parrain".

    +
    +
    + + + + \ No newline at end of file diff --git a/front/public/connexion.html b/front/public/connexion.html new file mode 100644 index 0000000..928cffa --- /dev/null +++ b/front/public/connexion.html @@ -0,0 +1,85 @@ + + + + + + + Se connecter à WikiLerni + + + + + + + + + + + + +
    + WikiLerni (logo) + +
    + +
    + Logo WikiLerni +

    Cultivons notre jardin !

    +
    + +
    + +

    Connectez-vous à WikiLerni

    + +

    Pas de compte WikiLerni ? créez-le ici.

    +
    +
    +
    + +
    + +
    + + +
    Oublié ? Alors laissez vide et cochez la case ci-dessous.
    +
    + +
      +
    • + +
    • +
    • + +
    • +
    + +
    + +
    +
    +
    + +
    +

    Besoin d'aide?

    +

    Si vous avez oublié votre mot de passe, il vous suffit de cocher la case "Je souhaite recevoir un lien de connexion par e-mail". Un lien valide pendant une courte durée vous permettra de vous connecter au site.

    +

    Si vous ne vous souvenez pas non plus de l'adresse e-mail utilisée sur ce site ou que vous n'y avez plus accès, vous pouvez nous contacter en fournissant des informations permettant de vous identifier.

    +

    La case "Je souhaite ne pas avoir à me connecter à chaque fois." vous permettra de rester connecté.e jusqu'à 6 mois, pour peu que vous utilisiez le même navigateur internet.

    +
    + +
    + + + \ No newline at end of file diff --git a/front/public/contact.html b/front/public/contact.html new file mode 100644 index 0000000..93445d4 --- /dev/null +++ b/front/public/contact.html @@ -0,0 +1,53 @@ + + + + + + + WikiLerni : page de contact + + + + + + + + + + + +
    + WikiLerni (logo) + +
    + +
    + Logo WikiLerni +

    Cultivons notre jardin !

    +
    + +
    +
    +

    Pour me contacter, le plus simple est de m'écrire sur l'adresse suivante : bonjour@wikilerni.com
    J'essayerai de vous répondre au plus tôt.

    +

    Je vous conseille d'ailleurs d'ajouter cette adresse à votre carnet d'adresse.
    Cela limitera le risque que les messages de WikiLerni finissent dans votre dossier "spam", voire soient complètement bloqués ...

    +

    Si vous souhaitez échanger par téléphone, merci d'indiquer vos coordonnées téléphoniques, ainsi que les créneaux horaires où vous êtes généralement disponibles.

    +

    D'une manière générale, merci de préciser votre demande dans votre message ! Ma boule de cristal fonctionne fort mal :)

    +

    Si vous êtes adepte du chiffrement de e-mails, vous pouvez télécharger ma clé OpenPGP publique.
    Si vous ne savez pas de quoi il s'agit, ne vous en préoccupez pas, mais je sais que les intéressés apprécieront :)

    +
    +
    + + + \ No newline at end of file diff --git a/front/public/credits.html b/front/public/credits.html new file mode 100644 index 0000000..3018575 --- /dev/null +++ b/front/public/credits.html @@ -0,0 +1,59 @@ + + + + + + + Qui sont les créateurs de WikiLerni et avec quelles licences ? + + + + + + + + + + + + +
    + WikiLerni (logo) + +
    + +
    + Logo WikiLerni +

    Cultivons notre jardin !

    +
    + +
    +
    +

    Le logiciel servant à faire fonctionner WikiLerni est un logiciel libre. J'en suis le créateur et pour l'instant le principal développeur. Je me nomme Fabrice PENHOËT et pour en savoir plus sur moi, vous pouvez consulter mon CV en ligne. La licence utilisée est la GNU GENERAL PUBLIC LICENSE (GNU/GPLv3) dont vous pouvez lire la version officielle (en anglais). Pour des explications en français, évidemment, Wikipédia y consacre un article !

    + +

    Le graphisme du site est la création de Denis SALEM. Les éléments graphiques sont soumis à la licence CC-By-SA. La partie logicielle (CSS...) étant de nouveau soumise à la licence GNU/GPLv3.

    + +

    Les textes du site, et notamment les quizs et leur introduction sont eux-mêmes libres. Cette fois, la licence utilisée est la CC BY-SA 3.0, par cohérence avec celle utilisée par Wikipédia. + +

    Les illustrations du site, notamment celles des quizs viennent principalement de Wikipédia. Les licences d'utilisation sont variables et un lien est généralement fourni. Les extraits des articles Wikipédia sont eux soumis à la licence CC BY-SA 3.0.

    + +

    Si vous avez des doutes sur ce que vous pouvez faire ou pas du contenu de WikiLerni, n'hésitez pas à me demander.
    De même, si le logiciel utilisé par WikiLerni vous intéresse pour vos propres projets, mais que vous avez besoin d'aide pour le prendre en main, je peux vous fournir un devis sur demande.

    + +
    +
    + + + \ No newline at end of file diff --git a/front/public/donnees.html b/front/public/donnees.html new file mode 100644 index 0000000..0f0e157 --- /dev/null +++ b/front/public/donnees.html @@ -0,0 +1,101 @@ + + + + + + + WikiLerni et vos données personnelles + + + + + + + + + + + + +
    + WikiLerni (logo) + +
    + +
    + Logo WikiLerni +

    Cultivons notre jardin !

    +
    + +
    + +
    +

    CNIL, RGPD... aujourd'hui toutes les organisations souhaitent montrer patte blanche quant au bon usage qu'elles font de vos données personnelles.
    Cela avec plus ou moins de sincérité et de pédagogie. Ici, je vous explique quelles données sont traitées par WikiLerni et pourquoi.
    Néanmoins, pour la responsabilité légale du site, merci de vous reporter aux CGU & CGV du site qui sont les seuls textes valables.

    + +

    Les données liées à votre abonnement

    + +

    Lorsque vous créez votre compte, vous devez choisir un pseudonyme qui est complètement libre, donc vous n'êtes pas obligé de saisir votre vrai nom.

    + +

    De même, votre adresse e-mail est libre. Vous devez juste y avoir accès pour pouvoir valider la création de votre compte.
    + Pour l'instant, WikiLerni ne bloque pas les adresses e-mail jetables. Toutefois, sachez qu'elles peuvent fragiliser la sécurité de votre compte.
    + Par ailleurs, certains fournisseurs d'adresses e-mail rejettent sytématiquement les courriels venant de sites internet et vous ne pourrez donc pas valider votre compte, etc. Ce n'est pas un choix de WikiLerni.

    + +

    Le mot de passe que vous choisissez est évidemment chiffré. Personne n'y a accès et je ne pourrai donc vous le redonner si vous l'avez oublié.
    + Mais vous pouvez vous connecter sans mot de passe en demandant à recevoir sur votre adresse e-mail un lien valable pendant une courte durée.

    + +

    En résumé, je peux donc accéder à votre e-mail, le pseudonyme que vous avez choisi, ainsi que quelques informations telles que les dates de création/modification de vos informations ou encore la date de votre dernière connexion au site. Ceci est utile au bon fonctionnement du site.

    + +

    J'ai aussi évidemment accès aux informations concernant votre abonnement (durée de votre abonnement, jours où vous souhaitez recevoir de nouveaux quizs, période de pauses, etc.). De nouveau, il s'agit d'informations nécessaires au site et que vous pouvez modifier vous-mêmes.

    + +

    Lorsque que vous supprimez votre compte, toutes les données sont supprimées immédiatement et définitivement.
    + De même, si vous n'avez plus d'abonnement actif et que vous ne vous connectez pendant un certain nombre de mois, votre compte et ses informations sont supprimés définitivement.

    + +

    En fait, vos données peuvent toujours apparaître un certain temps dans les sauvegardes du site, mais ne comptez pas dessus pour récupérer votre compte après une suppression. Ses sauvegardes existent pour permettre de remettre en route l'ensemble du site en cas d'incident.

    + +

    Il existe quelques informations vous concernant auxquelles vous n'avez pas directement accès.
    Le décalage horaire de votre compte qui est détecté périodiquement lorsque vous vous connectez au site. En effet, pour WikiLerni vous envoi en général ces messages durant la nuit, mais l'heure n'est pas la même suivant si vous habitez en Nouvelle-Calédonie ou en métropole.
    Un champ mémo me permet d’enregistrer des données libres concernant votre compte. Il est vide dans 99 % des cas et ne contient rien de personnel. Mais vous pouvez me demander cette information si vous le souhaitez.

    + +

    Les prestataires

    + +

    Le site WikiLerni est hébergé sur un serveur situé en France et appartenant à une entreprise elle-même française (alwaysdata).

    + +

    Pour envoyer ses e-mails en essayant d'éviter de se retrouver en "spam", WikiLerni utilise les services d'un routeur e-mail.
    + De nouveau, il s'agit d'une société française (Spirion), ses serveurs étant eux-mêmes situés en France (OVH) au moment où j'écris ce texte. Je l'ai choisie pour ça.
    + Donc, en théorie, ce prestataire peut avoir accès à votre adresse e-mail, mais à aucune autre information.
    + Il n'y aucun pistage des affichages ou clics des messages envoyés par WikiLerni, ce qui est chose rare !

    +

    Les données de facturation

    + +

    Si vous optez pour un abonnement prémium, vous devrez passer par le site de la société WebPortage/Nodalys qui est une société de portage salarial me permettant d'avoir une activité déclarée en France. Les employés de Nodalys ont donc accès à vos données de facturation et paiement. Pour en savoir plus sur ce sujet cliquez-ici.

    + +

    Ce logiciel de facturation est séparé de WikiLerni, tout comme ceux de Paypal ou Paybox qui vous permettrons de payer votre abonnement en ligne. + Si vous souhaitez éviter de passer par Paypal ou Paybox, vous pouvez me contacter pour demander un paiement par chèque ou virement.

    +

    Les statistiques de visite

    + +

    Lorsque l'on gère un site internet, il est difficile de naviguer complètement à vue et avoir certaines informations sur les visites de son site est utile. + Pour ce faire WikiLerni privilégie en toute cohérence un logiciel libre nommé Matomo.
    + Ce logiciel est configuré conformément aux préconisations de la CNIL, c'est-à-dire entre autres pour ne pas collecter votre adresse IP, qui est une information permettant de vous identifier sur internet.
    + Par ailleurs, Matomo est inactif lorsque vous êtes connecté à votre compte WikiLerni.
    + Cet outil est installé sur un serveur internet situé en France et je suis la seule personne à avoir accès à ces informations.

    + +

    Si vous souhaitez vous opposer à ce suivi statistique, vous pouvez utiliser le lien suivant :
    +

    + +

    Pour toutes questions/réclamations concernant vos données personnelles sur WikiLerni, n'hésitez pas à me contacter.

    +
    + +
    + + + \ No newline at end of file diff --git a/front/public/gestion-quizs.html b/front/public/gestion-quizs.html new file mode 100644 index 0000000..4665818 --- /dev/null +++ b/front/public/gestion-quizs.html @@ -0,0 +1,261 @@ + + + + + + + + Les quizs + + + + + + + + + + + + + +
    + + + +
    +

    Les quizs

    + + + +
    +
    +
    +
    +
    + Informations du quiz +
    + + + +
    +
    + + .html +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + Séparer les rubriques par des virgules +
    +
    + + + + Nouveau questionnaire + Voir le quiz +
    +
    + +
    +
    +
    +
    + + + +
    +
    + Informations de l'illustration +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + + + +
    +
    +
    +
    + + +
    +
    + La question et les réponses proposées +
    + + + +
    +
    + + Permet de fixer l'ordre d'affichage des questions. +
    +
    + + +
    + Réponses proposées +
    +   Réponse correcte + +
    +
    +   Réponse correcte + +
    +
    +   Réponse correcte + +
    +
    +   Réponse correcte + +
    +
    +   Réponse correcte + +
    +
    +   Réponse correcte + +
    +
    +   Réponse correcte + +
    +
    +   Réponse correcte + +
    +
    +   Réponse correcte + +
    +
    +   Réponse correcte + +
    +
    + + + + +
    +
    +
    +
    + +
    + +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/front/public/gestion-utilisateurs.html b/front/public/gestion-utilisateurs.html new file mode 100644 index 0000000..337aa3a --- /dev/null +++ b/front/public/gestion-utilisateurs.html @@ -0,0 +1,206 @@ + + + + + + + + Les abonnés + + + + + + + + + + + + + +
    + + + +
    +

    Les abonnés

    + + + +
    +
    +
    +
    +
    + Informations de l'abonné +
    +
    + + + +
    +
    + + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + + Laisser vide sauf si vous souhaitez le changer. +
    + +
    + + +
    + +
    + + Depuis la création de son compte. +
    + +
    + Jours valables pour l'abonnement +
      +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    • + +
    • + +
    • + +
    • +
    • + +
    • +
    +
    +
    + + + + + + + Vider +
    +
    +

    Payments reçus via l'API WebPortage

    +

    Parrainages

    +
    +
    + +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/front/public/gestion.html b/front/public/gestion.html new file mode 100644 index 0000000..6d99e66 --- /dev/null +++ b/front/public/gestion.html @@ -0,0 +1,78 @@ + + + + + + + + WikiLerni - gestion du site + + + + + + + + + + + + + +
    + + + +
    +

    WikiLerni

    +
    +
    +
    +
    +

    Régénérer le HTML.

    +
    +
    + + + + \ No newline at end of file diff --git a/front/public/img/404-notfound.png b/front/public/img/404-notfound.png new file mode 100644 index 0000000000000000000000000000000000000000..6bf65891b0318445176a35358d01a5d60621690f GIT binary patch literal 189680 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
    2e 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
  • _C@|--YRyXeNBS5T8=^A147KPtW2o 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�dBtA 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 maPdh~E>SrmBoCSs!h$-sCHP|14L3)XCuN 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 U%a~uDqw14O$=F~MV|g(48wrY>ivR!s literal 0 HcmV?d00001 diff --git a/front/public/inscription.html b/front/public/inscription.html new file mode 100644 index 0000000..e1b9b37 --- /dev/null +++ b/front/public/inscription.html @@ -0,0 +1,94 @@ + + + + + + + S'inscrire à WikiLerni + + + + + + + + + + + + + + +
    + Logo WikiLerni +

    Cultivons notre jardin !

    +
    + +
    + +

    Créer votre compte WIKILERNI

    + + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    +
    Au moins 8 caractères. Générer un mot de passe.
    + +
    + +
    +
    Facultatif.
    + + +
    + +
    +
    +
    + +
    +

    Besoin d'aide ?

    +

    La saisie d'un pseudonyme, d'une adresse e-mail et d'un mot de passe est obligatoire et vous devez accepter les Conditions Générales d'Utilisation.

    +

    Votre pseudonyme est complétement libre, mais servira à personnaliser certains affichages.

    +

    Vous recevrez un lien sur l'adresse e-mail saisie sur lequel vous devrez cliquer pour valider la création de votre compte.

    +

    Votre mot de passe doit compter au moins 8 caractères. Si vous manquez d'inspiration, cliquez sur le lien "Générer un mot de passe" pour en obtenir un !

    +

    Si vous connaissez une personne déjà inscrite à WikiLerni, vous pouvez fournir son code parrain ou encore son adresse e-mail. Dans le cas où vous optez ensuite pour un abonnement prémium, il sera alors allongé de 30 jours grâce à ce parrainage.

    +
    + +
    + + + \ No newline at end of file diff --git a/front/public/login.html b/front/public/login.html new file mode 100644 index 0000000..1488236 --- /dev/null +++ b/front/public/login.html @@ -0,0 +1,45 @@ + + + + + + + Tester votre lien de connexion + + + + + + + + + + + +
    + WikiLerni (logo) + +
    + +
    + Logo WikiLerni +

    Cultivons notre jardin !

    +
    Si vous voyez ce message, c'est que votre lien de connexion n'est pas valide. Vous pouvez en demander un nouveau en cliquant ici.
    +
    + + + + \ No newline at end of file diff --git a/front/public/newlogin.html b/front/public/newlogin.html new file mode 100644 index 0000000..8b2af5d --- /dev/null +++ b/front/public/newlogin.html @@ -0,0 +1,45 @@ + + + + + + + Lien pour changer vos informations de connexion + + + + + + + + + + + +
    + WikiLerni (logo) + +
    + +
    + Logo WikiLerni +

    Cultivons notre jardin !

    +
    Si vous voyez ce message, c'est que votre lien de validation n'est pas valide ou a expiré. Vous pouvez en demander un nouveau en cliquant ici.
    +
    + + + + \ No newline at end of file diff --git a/front/public/robots.txt b/front/public/robots.txt new file mode 100644 index 0000000..77470cb --- /dev/null +++ b/front/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: / \ No newline at end of file diff --git a/front/public/sortie.html b/front/public/sortie.html new file mode 100644 index 0000000..8f3bbf1 --- /dev/null +++ b/front/public/sortie.html @@ -0,0 +1,46 @@ + + + + + + + Déconnexion WikiLerni + + + + + + + + + + + +
    + WikiLerni (logo) + +
    + +
    + Logo WikiLerni +

    Cultivons notre jardin !

    +

    Au revoir !

    +

    Si vous voyez ce message, c'est qu'un problème a été rencontré durant la déconnexion.
    N'hésitez pas à nous prévenir si le problème persiste.

    +
    + + + + \ No newline at end of file diff --git a/front/public/stop-mail.html b/front/public/stop-mail.html new file mode 100644 index 0000000..a5a4cdc --- /dev/null +++ b/front/public/stop-mail.html @@ -0,0 +1,45 @@ + + + + + + + Ne plus recevoir d'e-mail de WikiLerni + + + + + + + + + + + +
    + WikiLerni (logo) + +
    + +
    + Logo WikiLerni +

    Cultivons notre jardin !

    +
    Si vous voyez ce message, c'est que votre lien de désabonnement ne fonctionne pas. Vous pouvez accéder à votre compte pour désactiver les envois.
    +
    + + + + \ No newline at end of file diff --git a/front/public/themes/default/404.html b/front/public/themes/default/404.html new file mode 100644 index 0000000..02818e6 --- /dev/null +++ b/front/public/themes/default/404.html @@ -0,0 +1,80 @@ + + + + + + + + WikiLerni : page non trouvée + + + + + + + + + + +
    +
    +

    WikiLerni

    +

    Cultivons notre jardin !

    +
    + + + + +
    + + \ No newline at end of file diff --git a/front/public/themes/default/CSS/grids-responsive-min.css b/front/public/themes/default/CSS/grids-responsive-min.css new file mode 100644 index 0000000..24f59bf --- /dev/null +++ b/front/public/themes/default/CSS/grids-responsive-min.css @@ -0,0 +1,7 @@ +/*! +Pure v2.0.3 +Copyright 2013 Yahoo! +Licensed under the BSD License. +https://github.com/pure-css/pure/blob/master/LICENSE.md +*/ +@media screen and (min-width:35.5em){.pure-u-sm-1,.pure-u-sm-1-1,.pure-u-sm-1-12,.pure-u-sm-1-2,.pure-u-sm-1-24,.pure-u-sm-1-3,.pure-u-sm-1-4,.pure-u-sm-1-5,.pure-u-sm-1-6,.pure-u-sm-1-8,.pure-u-sm-10-24,.pure-u-sm-11-12,.pure-u-sm-11-24,.pure-u-sm-12-24,.pure-u-sm-13-24,.pure-u-sm-14-24,.pure-u-sm-15-24,.pure-u-sm-16-24,.pure-u-sm-17-24,.pure-u-sm-18-24,.pure-u-sm-19-24,.pure-u-sm-2-24,.pure-u-sm-2-3,.pure-u-sm-2-5,.pure-u-sm-20-24,.pure-u-sm-21-24,.pure-u-sm-22-24,.pure-u-sm-23-24,.pure-u-sm-24-24,.pure-u-sm-3-24,.pure-u-sm-3-4,.pure-u-sm-3-5,.pure-u-sm-3-8,.pure-u-sm-4-24,.pure-u-sm-4-5,.pure-u-sm-5-12,.pure-u-sm-5-24,.pure-u-sm-5-5,.pure-u-sm-5-6,.pure-u-sm-5-8,.pure-u-sm-6-24,.pure-u-sm-7-12,.pure-u-sm-7-24,.pure-u-sm-7-8,.pure-u-sm-8-24,.pure-u-sm-9-24{display:inline-block;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-sm-1-24{width:4.1667%}.pure-u-sm-1-12,.pure-u-sm-2-24{width:8.3333%}.pure-u-sm-1-8,.pure-u-sm-3-24{width:12.5%}.pure-u-sm-1-6,.pure-u-sm-4-24{width:16.6667%}.pure-u-sm-1-5{width:20%}.pure-u-sm-5-24{width:20.8333%}.pure-u-sm-1-4,.pure-u-sm-6-24{width:25%}.pure-u-sm-7-24{width:29.1667%}.pure-u-sm-1-3,.pure-u-sm-8-24{width:33.3333%}.pure-u-sm-3-8,.pure-u-sm-9-24{width:37.5%}.pure-u-sm-2-5{width:40%}.pure-u-sm-10-24,.pure-u-sm-5-12{width:41.6667%}.pure-u-sm-11-24{width:45.8333%}.pure-u-sm-1-2,.pure-u-sm-12-24{width:50%}.pure-u-sm-13-24{width:54.1667%}.pure-u-sm-14-24,.pure-u-sm-7-12{width:58.3333%}.pure-u-sm-3-5{width:60%}.pure-u-sm-15-24,.pure-u-sm-5-8{width:62.5%}.pure-u-sm-16-24,.pure-u-sm-2-3{width:66.6667%}.pure-u-sm-17-24{width:70.8333%}.pure-u-sm-18-24,.pure-u-sm-3-4{width:75%}.pure-u-sm-19-24{width:79.1667%}.pure-u-sm-4-5{width:80%}.pure-u-sm-20-24,.pure-u-sm-5-6{width:83.3333%}.pure-u-sm-21-24,.pure-u-sm-7-8{width:87.5%}.pure-u-sm-11-12,.pure-u-sm-22-24{width:91.6667%}.pure-u-sm-23-24{width:95.8333%}.pure-u-sm-1,.pure-u-sm-1-1,.pure-u-sm-24-24,.pure-u-sm-5-5{width:100%}}@media screen and (min-width:48em){.pure-u-md-1,.pure-u-md-1-1,.pure-u-md-1-12,.pure-u-md-1-2,.pure-u-md-1-24,.pure-u-md-1-3,.pure-u-md-1-4,.pure-u-md-1-5,.pure-u-md-1-6,.pure-u-md-1-8,.pure-u-md-10-24,.pure-u-md-11-12,.pure-u-md-11-24,.pure-u-md-12-24,.pure-u-md-13-24,.pure-u-md-14-24,.pure-u-md-15-24,.pure-u-md-16-24,.pure-u-md-17-24,.pure-u-md-18-24,.pure-u-md-19-24,.pure-u-md-2-24,.pure-u-md-2-3,.pure-u-md-2-5,.pure-u-md-20-24,.pure-u-md-21-24,.pure-u-md-22-24,.pure-u-md-23-24,.pure-u-md-24-24,.pure-u-md-3-24,.pure-u-md-3-4,.pure-u-md-3-5,.pure-u-md-3-8,.pure-u-md-4-24,.pure-u-md-4-5,.pure-u-md-5-12,.pure-u-md-5-24,.pure-u-md-5-5,.pure-u-md-5-6,.pure-u-md-5-8,.pure-u-md-6-24,.pure-u-md-7-12,.pure-u-md-7-24,.pure-u-md-7-8,.pure-u-md-8-24,.pure-u-md-9-24{display:inline-block;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-md-1-24{width:4.1667%}.pure-u-md-1-12,.pure-u-md-2-24{width:8.3333%}.pure-u-md-1-8,.pure-u-md-3-24{width:12.5%}.pure-u-md-1-6,.pure-u-md-4-24{width:16.6667%}.pure-u-md-1-5{width:20%}.pure-u-md-5-24{width:20.8333%}.pure-u-md-1-4,.pure-u-md-6-24{width:25%}.pure-u-md-7-24{width:29.1667%}.pure-u-md-1-3,.pure-u-md-8-24{width:33.3333%}.pure-u-md-3-8,.pure-u-md-9-24{width:37.5%}.pure-u-md-2-5{width:40%}.pure-u-md-10-24,.pure-u-md-5-12{width:41.6667%}.pure-u-md-11-24{width:45.8333%}.pure-u-md-1-2,.pure-u-md-12-24{width:50%}.pure-u-md-13-24{width:54.1667%}.pure-u-md-14-24,.pure-u-md-7-12{width:58.3333%}.pure-u-md-3-5{width:60%}.pure-u-md-15-24,.pure-u-md-5-8{width:62.5%}.pure-u-md-16-24,.pure-u-md-2-3{width:66.6667%}.pure-u-md-17-24{width:70.8333%}.pure-u-md-18-24,.pure-u-md-3-4{width:75%}.pure-u-md-19-24{width:79.1667%}.pure-u-md-4-5{width:80%}.pure-u-md-20-24,.pure-u-md-5-6{width:83.3333%}.pure-u-md-21-24,.pure-u-md-7-8{width:87.5%}.pure-u-md-11-12,.pure-u-md-22-24{width:91.6667%}.pure-u-md-23-24{width:95.8333%}.pure-u-md-1,.pure-u-md-1-1,.pure-u-md-24-24,.pure-u-md-5-5{width:100%}}@media screen and (min-width:64em){.pure-u-lg-1,.pure-u-lg-1-1,.pure-u-lg-1-12,.pure-u-lg-1-2,.pure-u-lg-1-24,.pure-u-lg-1-3,.pure-u-lg-1-4,.pure-u-lg-1-5,.pure-u-lg-1-6,.pure-u-lg-1-8,.pure-u-lg-10-24,.pure-u-lg-11-12,.pure-u-lg-11-24,.pure-u-lg-12-24,.pure-u-lg-13-24,.pure-u-lg-14-24,.pure-u-lg-15-24,.pure-u-lg-16-24,.pure-u-lg-17-24,.pure-u-lg-18-24,.pure-u-lg-19-24,.pure-u-lg-2-24,.pure-u-lg-2-3,.pure-u-lg-2-5,.pure-u-lg-20-24,.pure-u-lg-21-24,.pure-u-lg-22-24,.pure-u-lg-23-24,.pure-u-lg-24-24,.pure-u-lg-3-24,.pure-u-lg-3-4,.pure-u-lg-3-5,.pure-u-lg-3-8,.pure-u-lg-4-24,.pure-u-lg-4-5,.pure-u-lg-5-12,.pure-u-lg-5-24,.pure-u-lg-5-5,.pure-u-lg-5-6,.pure-u-lg-5-8,.pure-u-lg-6-24,.pure-u-lg-7-12,.pure-u-lg-7-24,.pure-u-lg-7-8,.pure-u-lg-8-24,.pure-u-lg-9-24{display:inline-block;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-lg-1-24{width:4.1667%}.pure-u-lg-1-12,.pure-u-lg-2-24{width:8.3333%}.pure-u-lg-1-8,.pure-u-lg-3-24{width:12.5%}.pure-u-lg-1-6,.pure-u-lg-4-24{width:16.6667%}.pure-u-lg-1-5{width:20%}.pure-u-lg-5-24{width:20.8333%}.pure-u-lg-1-4,.pure-u-lg-6-24{width:25%}.pure-u-lg-7-24{width:29.1667%}.pure-u-lg-1-3,.pure-u-lg-8-24{width:33.3333%}.pure-u-lg-3-8,.pure-u-lg-9-24{width:37.5%}.pure-u-lg-2-5{width:40%}.pure-u-lg-10-24,.pure-u-lg-5-12{width:41.6667%}.pure-u-lg-11-24{width:45.8333%}.pure-u-lg-1-2,.pure-u-lg-12-24{width:50%}.pure-u-lg-13-24{width:54.1667%}.pure-u-lg-14-24,.pure-u-lg-7-12{width:58.3333%}.pure-u-lg-3-5{width:60%}.pure-u-lg-15-24,.pure-u-lg-5-8{width:62.5%}.pure-u-lg-16-24,.pure-u-lg-2-3{width:66.6667%}.pure-u-lg-17-24{width:70.8333%}.pure-u-lg-18-24,.pure-u-lg-3-4{width:75%}.pure-u-lg-19-24{width:79.1667%}.pure-u-lg-4-5{width:80%}.pure-u-lg-20-24,.pure-u-lg-5-6{width:83.3333%}.pure-u-lg-21-24,.pure-u-lg-7-8{width:87.5%}.pure-u-lg-11-12,.pure-u-lg-22-24{width:91.6667%}.pure-u-lg-23-24{width:95.8333%}.pure-u-lg-1,.pure-u-lg-1-1,.pure-u-lg-24-24,.pure-u-lg-5-5{width:100%}}@media screen and (min-width:80em){.pure-u-xl-1,.pure-u-xl-1-1,.pure-u-xl-1-12,.pure-u-xl-1-2,.pure-u-xl-1-24,.pure-u-xl-1-3,.pure-u-xl-1-4,.pure-u-xl-1-5,.pure-u-xl-1-6,.pure-u-xl-1-8,.pure-u-xl-10-24,.pure-u-xl-11-12,.pure-u-xl-11-24,.pure-u-xl-12-24,.pure-u-xl-13-24,.pure-u-xl-14-24,.pure-u-xl-15-24,.pure-u-xl-16-24,.pure-u-xl-17-24,.pure-u-xl-18-24,.pure-u-xl-19-24,.pure-u-xl-2-24,.pure-u-xl-2-3,.pure-u-xl-2-5,.pure-u-xl-20-24,.pure-u-xl-21-24,.pure-u-xl-22-24,.pure-u-xl-23-24,.pure-u-xl-24-24,.pure-u-xl-3-24,.pure-u-xl-3-4,.pure-u-xl-3-5,.pure-u-xl-3-8,.pure-u-xl-4-24,.pure-u-xl-4-5,.pure-u-xl-5-12,.pure-u-xl-5-24,.pure-u-xl-5-5,.pure-u-xl-5-6,.pure-u-xl-5-8,.pure-u-xl-6-24,.pure-u-xl-7-12,.pure-u-xl-7-24,.pure-u-xl-7-8,.pure-u-xl-8-24,.pure-u-xl-9-24{display:inline-block;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-xl-1-24{width:4.1667%}.pure-u-xl-1-12,.pure-u-xl-2-24{width:8.3333%}.pure-u-xl-1-8,.pure-u-xl-3-24{width:12.5%}.pure-u-xl-1-6,.pure-u-xl-4-24{width:16.6667%}.pure-u-xl-1-5{width:20%}.pure-u-xl-5-24{width:20.8333%}.pure-u-xl-1-4,.pure-u-xl-6-24{width:25%}.pure-u-xl-7-24{width:29.1667%}.pure-u-xl-1-3,.pure-u-xl-8-24{width:33.3333%}.pure-u-xl-3-8,.pure-u-xl-9-24{width:37.5%}.pure-u-xl-2-5{width:40%}.pure-u-xl-10-24,.pure-u-xl-5-12{width:41.6667%}.pure-u-xl-11-24{width:45.8333%}.pure-u-xl-1-2,.pure-u-xl-12-24{width:50%}.pure-u-xl-13-24{width:54.1667%}.pure-u-xl-14-24,.pure-u-xl-7-12{width:58.3333%}.pure-u-xl-3-5{width:60%}.pure-u-xl-15-24,.pure-u-xl-5-8{width:62.5%}.pure-u-xl-16-24,.pure-u-xl-2-3{width:66.6667%}.pure-u-xl-17-24{width:70.8333%}.pure-u-xl-18-24,.pure-u-xl-3-4{width:75%}.pure-u-xl-19-24{width:79.1667%}.pure-u-xl-4-5{width:80%}.pure-u-xl-20-24,.pure-u-xl-5-6{width:83.3333%}.pure-u-xl-21-24,.pure-u-xl-7-8{width:87.5%}.pure-u-xl-11-12,.pure-u-xl-22-24{width:91.6667%}.pure-u-xl-23-24{width:95.8333%}.pure-u-xl-1,.pure-u-xl-1-1,.pure-u-xl-24-24,.pure-u-xl-5-5{width:100%}} \ No newline at end of file diff --git a/front/public/themes/default/CSS/layout.css b/front/public/themes/default/CSS/layout.css new file mode 100644 index 0000000..83fbc6d --- /dev/null +++ b/front/public/themes/default/CSS/layout.css @@ -0,0 +1,286 @@ +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +/* + * -- BASE STYLES -- + * Most of these are inherited from Base, but I want to change a few. + */ +body { + line-height: 1.7em; + color: #C1B654; + font-size: 13px; +} + +h1, +h2, +h3, +h4, +h5, +h6, +label { + color: #34495e; +} + +.pure-img-responsive { + max-width: 100%; + height: auto; +} + +/* + * -- LAYOUT STYLES -- + * These are some useful classes which I will need + */ +.l-box { + padding: 1em; +} + +.l-box-lrg { + padding: 2em; + border-bottom: 1px solid rgba(0,0,0,0.1); +} + +.is-center { + text-align: center; +} + + + +/* + * -- PURE FORM STYLES -- + * Style the form inputs and labels + */ +.pure-form label { + margin: 1em 0 0; + font-weight: bold; + font-size: 100%; +} + +.pure-form input[type] { + border: 2px solid #ddd; + box-shadow: none; + font-size: 100%; + width: 100%; + margin-bottom: 1em; +} + +/* + * -- PURE BUTTON STYLES -- + * I want my pure-button elements to look a little different + */ +.pure-button { + background-color: #1f8dd6; + color: white; + padding: 0.5em 2em; + border-radius: 5px; +} + +a.pure-button-primary { + background: white; + color: #8D847B; + border-radius: 5px; + font-size: 130%; +} + + +/* + * -- MENU STYLES -- + * I want to customize how my .pure-menu looks at the top of the page + */ + +.home-menu { + padding: 0.5em; + text-align: center; + box-shadow: 0 1px 1px rgba(0,0,0, 0.10); +} +.home-menu { + background: #D8AD32; +} +.pure-menu.pure-menu-fixed { + /* Fixed menus normally have a border at the bottom. */ + border-bottom: none; + /* I need a higher z-index here because of the scroll-over effect. */ + z-index: 4; +} + +.home-menu .pure-menu-heading { + color: white; + font-weight: 400; + font-size: 120%; +} + +.home-menu .pure-menu-selected a { + color: white; +} + +.home-menu a { + color: #8F543B; +} +.home-menu li a:hover, +.home-menu li a:focus { + background: none; + border: none; + color: #8D847B; +} + + +/* + * -- SPLASH STYLES -- + * This is the blue top section that appears on the page. + */ + +.splash-container { + background: #FCF6EC; + z-index: 1; + overflow: hidden; + /* The following styles are required for the "scroll-over" effect */ + width: 100%; + height: 40%; + top: 0; + left: 0; + position: fixed !important; +} + +.splash { + /* absolute center .splash within .splash-container */ + width: 80%; + height: 80%; + margin: auto; + position: absolute; + top: 100px; left: 0; bottom: 0; right: 0; + text-align: center; + text-transform: uppercase; +} + +/* This is the main heading that appears on the blue section */ +.splash-head { + font-size: 20px; + font-weight: bold; + color: #DDE023; + border: 3px solid #DDE023; + padding: 1em 1.6em; + font-weight: 100; + border-radius: 5px; + line-height: 0.5em; +} + +/* This is the subheading that appears on the blue section */ +.splash-subhead { + color: #8F543B; + letter-spacing: 0.05em; + opacity: 0.8; +} + +/* + * -- CONTENT STYLES -- + * This represents the content area (everything below the blue section) + */ +.content-wrapper { + /* These styles are required for the "scroll-over" effect */ + position: absolute; + top: 39%; + width: 100%; + min-height: 12%; + z-index: 2; + background: white; + +} + +/* We want to give the content area some more padding */ +.content { + padding: 1em 1em 3em; +} + +/* This is the class used for the main content headers (

    ) */ +.content-head { + font-weight: 400; + text-transform: uppercase; + letter-spacing: 0.1em; + margin: 2em 0 1em; +} + +/* This is a modifier class used when the content-head is inside a ribbon */ +.content-head-ribbon { + color: white; +} + +/* This is the class used for the content sub-headers (

    ) */ +.content-subhead { + color: #8F543B; +} + .content-subhead i { + margin-right: 7px; + } + +/* This is the class used for the dark-background areas. */ +.ribbon { + background: #2d3e50; + color: #aaa; +} + +/* This is the class used for the footer */ +.footer { + background: #111; + position: fixed; + bottom: 0; + width: 100%; +} + +/* + * -- TABLET (AND UP) MEDIA QUERIES -- + * On tablets and other medium-sized devices, we want to customize some + * of the mobile styles. + */ +@media (min-width: 48em) { + + /* We increase the body font size */ + body { + font-size: 16px; + } + + /* We can align the menu header to the left, but float the + menu items to the right. */ + .home-menu { + text-align: left; + } + .home-menu ul { + float: right; + } + + /* We increase the height of the splash-container */ +/* .splash-container { + height: 500px; + }*/ + + /* We decrease the width of the .splash, since we have more width + to work with */ + .splash { + width: 50%; + height: 50%; + } + + .splash-head { + font-size: 250%; + } + + + /* We remove the border-separator assigned to .l-box-lrg */ + .l-box-lrg { + border: none; + } + +} + +/* + * -- DESKTOP (AND UP) MEDIA QUERIES -- + * On desktops and other large devices, we want to over-ride some + * of the mobile and tablet styles. + */ +@media (min-width: 78em) { + /* We increase the header font size even more */ + .splash-head { + font-size: 300%; + } +} \ No newline at end of file diff --git a/front/public/themes/default/CSS/pure-min.css b/front/public/themes/default/CSS/pure-min.css new file mode 100644 index 0000000..7b6e7b9 --- /dev/null +++ b/front/public/themes/default/CSS/pure-min.css @@ -0,0 +1,11 @@ +/*! +Pure v2.0.3 +Copyright 2013 Yahoo! +Licensed under the BSD License. +https://github.com/pure-css/pure/blob/master/LICENSE.md +*/ +/*! +normalize.css v | MIT License | git.io/normalize +Copyright (c) Nicolas Gallagher and Jonathan Neal +*/ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}html{font-family:sans-serif}.hidden,[hidden]{display:none!important}.pure-img{max-width:100%;height:auto;display:block}.pure-g{letter-spacing:-.31em;text-rendering:optimizespeed;font-family:FreeSans,Arimo,"Droid Sans",Helvetica,Arial,sans-serif;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-line-pack:start;align-content:flex-start}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){table .pure-g{display:block}}.opera-only :-o-prefocus,.pure-g{word-spacing:-.43em}.pure-u{display:inline-block;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-g [class*=pure-u]{font-family:sans-serif}.pure-u-1,.pure-u-1-1,.pure-u-1-12,.pure-u-1-2,.pure-u-1-24,.pure-u-1-3,.pure-u-1-4,.pure-u-1-5,.pure-u-1-6,.pure-u-1-8,.pure-u-10-24,.pure-u-11-12,.pure-u-11-24,.pure-u-12-24,.pure-u-13-24,.pure-u-14-24,.pure-u-15-24,.pure-u-16-24,.pure-u-17-24,.pure-u-18-24,.pure-u-19-24,.pure-u-2-24,.pure-u-2-3,.pure-u-2-5,.pure-u-20-24,.pure-u-21-24,.pure-u-22-24,.pure-u-23-24,.pure-u-24-24,.pure-u-3-24,.pure-u-3-4,.pure-u-3-5,.pure-u-3-8,.pure-u-4-24,.pure-u-4-5,.pure-u-5-12,.pure-u-5-24,.pure-u-5-5,.pure-u-5-6,.pure-u-5-8,.pure-u-6-24,.pure-u-7-12,.pure-u-7-24,.pure-u-7-8,.pure-u-8-24,.pure-u-9-24{display:inline-block;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-1-24{width:4.1667%}.pure-u-1-12,.pure-u-2-24{width:8.3333%}.pure-u-1-8,.pure-u-3-24{width:12.5%}.pure-u-1-6,.pure-u-4-24{width:16.6667%}.pure-u-1-5{width:20%}.pure-u-5-24{width:20.8333%}.pure-u-1-4,.pure-u-6-24{width:25%}.pure-u-7-24{width:29.1667%}.pure-u-1-3,.pure-u-8-24{width:33.3333%}.pure-u-3-8,.pure-u-9-24{width:37.5%}.pure-u-2-5{width:40%}.pure-u-10-24,.pure-u-5-12{width:41.6667%}.pure-u-11-24{width:45.8333%}.pure-u-1-2,.pure-u-12-24{width:50%}.pure-u-13-24{width:54.1667%}.pure-u-14-24,.pure-u-7-12{width:58.3333%}.pure-u-3-5{width:60%}.pure-u-15-24,.pure-u-5-8{width:62.5%}.pure-u-16-24,.pure-u-2-3{width:66.6667%}.pure-u-17-24{width:70.8333%}.pure-u-18-24,.pure-u-3-4{width:75%}.pure-u-19-24{width:79.1667%}.pure-u-4-5{width:80%}.pure-u-20-24,.pure-u-5-6{width:83.3333%}.pure-u-21-24,.pure-u-7-8{width:87.5%}.pure-u-11-12,.pure-u-22-24{width:91.6667%}.pure-u-23-24{width:95.8333%}.pure-u-1,.pure-u-1-1,.pure-u-24-24,.pure-u-5-5{width:100%}.pure-button{display:inline-block;line-height:normal;white-space:nowrap;vertical-align:middle;text-align:center;cursor:pointer;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-box-sizing:border-box;box-sizing:border-box}.pure-button::-moz-focus-inner{padding:0;border:0}.pure-button-group{letter-spacing:-.31em;text-rendering:optimizespeed}.opera-only :-o-prefocus,.pure-button-group{word-spacing:-.43em}.pure-button-group .pure-button{letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-button{font-family:inherit;font-size:100%;padding:.5em 1em;color:rgba(0,0,0,.8);border:none transparent;background-color:#e6e6e6;text-decoration:none;border-radius:2px}.pure-button-hover,.pure-button:focus,.pure-button:hover{background-image:-webkit-gradient(linear,left top,left bottom,from(transparent),color-stop(40%,rgba(0,0,0,.05)),to(rgba(0,0,0,.1)));background-image:linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1))}.pure-button:focus{outline:0}.pure-button-active,.pure-button:active{-webkit-box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 0 6px rgba(0,0,0,.2) inset;box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 0 6px rgba(0,0,0,.2) inset;border-color:#000}.pure-button-disabled,.pure-button-disabled:active,.pure-button-disabled:focus,.pure-button-disabled:hover,.pure-button[disabled]{border:none;background-image:none;opacity:.4;cursor:not-allowed;-webkit-box-shadow:none;box-shadow:none;pointer-events:none}.pure-button-hidden{display:none}.pure-button-primary,.pure-button-selected,a.pure-button-primary,a.pure-button-selected{background-color:#0078e7;color:#fff}.pure-button-group .pure-button{margin:0;border-radius:0;border-right:1px solid rgba(0,0,0,.2)}.pure-button-group .pure-button:first-child{border-top-left-radius:2px;border-bottom-left-radius:2px}.pure-button-group .pure-button:last-child{border-top-right-radius:2px;border-bottom-right-radius:2px;border-right:none}.pure-form input[type=color],.pure-form input[type=date],.pure-form input[type=datetime-local],.pure-form input[type=datetime],.pure-form input[type=email],.pure-form input[type=month],.pure-form input[type=number],.pure-form input[type=password],.pure-form input[type=search],.pure-form input[type=tel],.pure-form input[type=text],.pure-form input[type=time],.pure-form input[type=url],.pure-form input[type=week],.pure-form select,.pure-form textarea{padding:.5em .6em;display:inline-block;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 3px #ddd;box-shadow:inset 0 1px 3px #ddd;border-radius:4px;vertical-align:middle;-webkit-box-sizing:border-box;box-sizing:border-box}.pure-form input:not([type]){padding:.5em .6em;display:inline-block;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 3px #ddd;box-shadow:inset 0 1px 3px #ddd;border-radius:4px;-webkit-box-sizing:border-box;box-sizing:border-box}.pure-form input[type=color]{padding:.2em .5em}.pure-form input[type=color]:focus,.pure-form input[type=date]:focus,.pure-form input[type=datetime-local]:focus,.pure-form input[type=datetime]:focus,.pure-form input[type=email]:focus,.pure-form input[type=month]:focus,.pure-form input[type=number]:focus,.pure-form input[type=password]:focus,.pure-form input[type=search]:focus,.pure-form input[type=tel]:focus,.pure-form input[type=text]:focus,.pure-form input[type=time]:focus,.pure-form input[type=url]:focus,.pure-form input[type=week]:focus,.pure-form select:focus,.pure-form textarea:focus{outline:0;border-color:#129fea}.pure-form input:not([type]):focus{outline:0;border-color:#129fea}.pure-form input[type=checkbox]:focus,.pure-form input[type=file]:focus,.pure-form input[type=radio]:focus{outline:thin solid #129fea;outline:1px auto #129fea}.pure-form .pure-checkbox,.pure-form .pure-radio{margin:.5em 0;display:block}.pure-form input[type=color][disabled],.pure-form input[type=date][disabled],.pure-form input[type=datetime-local][disabled],.pure-form input[type=datetime][disabled],.pure-form input[type=email][disabled],.pure-form input[type=month][disabled],.pure-form input[type=number][disabled],.pure-form input[type=password][disabled],.pure-form input[type=search][disabled],.pure-form input[type=tel][disabled],.pure-form input[type=text][disabled],.pure-form input[type=time][disabled],.pure-form input[type=url][disabled],.pure-form input[type=week][disabled],.pure-form select[disabled],.pure-form textarea[disabled]{cursor:not-allowed;background-color:#eaeded;color:#cad2d3}.pure-form input:not([type])[disabled]{cursor:not-allowed;background-color:#eaeded;color:#cad2d3}.pure-form input[readonly],.pure-form select[readonly],.pure-form textarea[readonly]{background-color:#eee;color:#777;border-color:#ccc}.pure-form input:focus:invalid,.pure-form select:focus:invalid,.pure-form textarea:focus:invalid{color:#b94a48;border-color:#e9322d}.pure-form input[type=checkbox]:focus:invalid:focus,.pure-form input[type=file]:focus:invalid:focus,.pure-form input[type=radio]:focus:invalid:focus{outline-color:#e9322d}.pure-form select{height:2.25em;border:1px solid #ccc;background-color:#fff}.pure-form select[multiple]{height:auto}.pure-form label{margin:.5em 0 .2em}.pure-form fieldset{margin:0;padding:.35em 0 .75em;border:0}.pure-form legend{display:block;width:100%;padding:.3em 0;margin-bottom:.3em;color:#333;border-bottom:1px solid #e5e5e5}.pure-form-stacked input[type=color],.pure-form-stacked input[type=date],.pure-form-stacked input[type=datetime-local],.pure-form-stacked input[type=datetime],.pure-form-stacked input[type=email],.pure-form-stacked input[type=file],.pure-form-stacked input[type=month],.pure-form-stacked input[type=number],.pure-form-stacked input[type=password],.pure-form-stacked input[type=search],.pure-form-stacked input[type=tel],.pure-form-stacked input[type=text],.pure-form-stacked input[type=time],.pure-form-stacked input[type=url],.pure-form-stacked input[type=week],.pure-form-stacked label,.pure-form-stacked select,.pure-form-stacked textarea{display:block;margin:.25em 0}.pure-form-stacked input:not([type]){display:block;margin:.25em 0}.pure-form-aligned input,.pure-form-aligned select,.pure-form-aligned textarea,.pure-form-message-inline{display:inline-block;vertical-align:middle}.pure-form-aligned textarea{vertical-align:top}.pure-form-aligned .pure-control-group{margin-bottom:.5em}.pure-form-aligned .pure-control-group label{text-align:right;display:inline-block;vertical-align:middle;width:10em;margin:0 1em 0 0}.pure-form-aligned .pure-controls{margin:1.5em 0 0 11em}.pure-form .pure-input-rounded,.pure-form input.pure-input-rounded{border-radius:2em;padding:.5em 1em}.pure-form .pure-group fieldset{margin-bottom:10px}.pure-form .pure-group input,.pure-form .pure-group textarea{display:block;padding:10px;margin:0 0 -1px;border-radius:0;position:relative;top:-1px}.pure-form .pure-group input:focus,.pure-form .pure-group textarea:focus{z-index:3}.pure-form .pure-group input:first-child,.pure-form .pure-group textarea:first-child{top:1px;border-radius:4px 4px 0 0;margin:0}.pure-form .pure-group input:first-child:last-child,.pure-form .pure-group textarea:first-child:last-child{top:1px;border-radius:4px;margin:0}.pure-form .pure-group input:last-child,.pure-form .pure-group textarea:last-child{top:-2px;border-radius:0 0 4px 4px;margin:0}.pure-form .pure-group button{margin:.35em 0}.pure-form .pure-input-1{width:100%}.pure-form .pure-input-3-4{width:75%}.pure-form .pure-input-2-3{width:66%}.pure-form .pure-input-1-2{width:50%}.pure-form .pure-input-1-3{width:33%}.pure-form .pure-input-1-4{width:25%}.pure-form-message-inline{display:inline-block;padding-left:.3em;color:#666;vertical-align:middle;font-size:.875em}.pure-form-message{display:block;color:#666;font-size:.875em}@media only screen and (max-width :480px){.pure-form button[type=submit]{margin:.7em 0 0}.pure-form input:not([type]),.pure-form input[type=color],.pure-form input[type=date],.pure-form input[type=datetime-local],.pure-form input[type=datetime],.pure-form input[type=email],.pure-form input[type=month],.pure-form input[type=number],.pure-form input[type=password],.pure-form input[type=search],.pure-form input[type=tel],.pure-form input[type=text],.pure-form input[type=time],.pure-form input[type=url],.pure-form input[type=week],.pure-form label{margin-bottom:.3em;display:block}.pure-group input:not([type]),.pure-group input[type=color],.pure-group input[type=date],.pure-group input[type=datetime-local],.pure-group input[type=datetime],.pure-group input[type=email],.pure-group input[type=month],.pure-group input[type=number],.pure-group input[type=password],.pure-group input[type=search],.pure-group input[type=tel],.pure-group input[type=text],.pure-group input[type=time],.pure-group input[type=url],.pure-group input[type=week]{margin-bottom:0}.pure-form-aligned .pure-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.pure-form-aligned .pure-controls{margin:1.5em 0 0 0}.pure-form-message,.pure-form-message-inline{display:block;font-size:.75em;padding:.2em 0 .8em}}.pure-menu{-webkit-box-sizing:border-box;box-sizing:border-box}.pure-menu-fixed{position:fixed;left:0;top:0;z-index:3}.pure-menu-item,.pure-menu-list{position:relative}.pure-menu-list{list-style:none;margin:0;padding:0}.pure-menu-item{padding:0;margin:0;height:100%}.pure-menu-heading,.pure-menu-link{display:block;text-decoration:none;white-space:nowrap}.pure-menu-horizontal{width:100%;white-space:nowrap}.pure-menu-horizontal .pure-menu-list{display:inline-block}.pure-menu-horizontal .pure-menu-heading,.pure-menu-horizontal .pure-menu-item,.pure-menu-horizontal .pure-menu-separator{display:inline-block;vertical-align:middle}.pure-menu-item .pure-menu-item{display:block}.pure-menu-children{display:none;position:absolute;left:100%;top:0;margin:0;padding:0;z-index:3}.pure-menu-horizontal .pure-menu-children{left:0;top:auto;width:inherit}.pure-menu-active>.pure-menu-children,.pure-menu-allow-hover:hover>.pure-menu-children{display:block;position:absolute}.pure-menu-has-children>.pure-menu-link:after{padding-left:.5em;content:"\25B8";font-size:small}.pure-menu-horizontal .pure-menu-has-children>.pure-menu-link:after{content:"\25BE"}.pure-menu-scrollable{overflow-y:scroll;overflow-x:hidden}.pure-menu-scrollable .pure-menu-list{display:block}.pure-menu-horizontal.pure-menu-scrollable .pure-menu-list{display:inline-block}.pure-menu-horizontal.pure-menu-scrollable{white-space:nowrap;overflow-y:hidden;overflow-x:auto;padding:.5em 0}.pure-menu-horizontal .pure-menu-children .pure-menu-separator,.pure-menu-separator{background-color:#ccc;height:1px;margin:.3em 0}.pure-menu-horizontal .pure-menu-separator{width:1px;height:1.3em;margin:0 .3em}.pure-menu-horizontal .pure-menu-children .pure-menu-separator{display:block;width:auto}.pure-menu-heading{text-transform:uppercase;color:#565d64}.pure-menu-link{color:#777}.pure-menu-children{background-color:#fff}.pure-menu-disabled,.pure-menu-heading,.pure-menu-link{padding:.5em 1em}.pure-menu-disabled{opacity:.5}.pure-menu-disabled .pure-menu-link:hover{background-color:transparent}.pure-menu-active>.pure-menu-link,.pure-menu-link:focus,.pure-menu-link:hover{background-color:#eee}.pure-menu-selected>.pure-menu-link,.pure-menu-selected>.pure-menu-link:visited{color:#000}.pure-table{border-collapse:collapse;border-spacing:0;empty-cells:show;border:1px solid #cbcbcb}.pure-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.pure-table td,.pure-table th{border-left:1px solid #cbcbcb;border-width:0 0 0 1px;font-size:inherit;margin:0;overflow:visible;padding:.5em 1em}.pure-table thead{background-color:#e0e0e0;color:#000;text-align:left;vertical-align:bottom}.pure-table td{background-color:transparent}.pure-table-odd td{background-color:#f2f2f2}.pure-table-striped tr:nth-child(2n-1) td{background-color:#f2f2f2}.pure-table-bordered td{border-bottom:1px solid #cbcbcb}.pure-table-bordered tbody>tr:last-child>td{border-bottom-width:0}.pure-table-horizontal td,.pure-table-horizontal th{border-width:0 0 1px 0;border-bottom:1px solid #cbcbcb}.pure-table-horizontal tbody>tr:last-child>td{border-bottom-width:0} \ No newline at end of file diff --git a/front/public/themes/default/CSS/wikilerni.css b/front/public/themes/default/CSS/wikilerni.css new file mode 100644 index 0000000..5352ed9 --- /dev/null +++ b/front/public/themes/default/CSS/wikilerni.css @@ -0,0 +1,352 @@ +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +/* + * -- BASE STYLES -- + * Most of these are inherited from Base, but I want to change a few. + */ +body +{ + line-height: 1.7em; + color: #C1B654; + font-size: 13px; +} + +h1,h2,h3,h4,h5,h6,label +{ + color: #34495e; +} + +.pure-img-responsive +{ + max-width: 100%; + height: auto; +} + +/* + * -- LAYOUT STYLES -- + * These are some useful classes which I will need + */ +.l-box +{ + padding: 1em; +} + +.l-box-lrg +{ + padding: 2em; + border-bottom: 1px solid rgba(0,0,0,0.1); +} + +.is-center +{ + text-align: center; +} + +/* + * -- PURE BUTTON STYLES -- + * I want my pure-button elements to look a little different + */ +.pure-button +{ + background-color: #1f8dd6; + color: white; + padding: 0.5em 2em; + border-radius: 5px; +} + +a.pure-button-primary +{ + background: white; + color: #8D847B; + border-radius: 5px; + font-size: 130%; +} + + +/* + * -- MENU STYLES -- + * I want to customize how my .pure-menu looks at the top of the page + */ + +.menu +{ + padding: 0.5em; + margin-bottom:0; + text-align: center; + box-shadow: 0 1px 1px rgba(0,0,0, 0.10); + background: #D8AD32; +} +.menu .menu-heading +{ + padding: 0.5em 0 0.5em 0; +} +.menu .pure-menu-heading +{ + color: white; + font-weight: 400; + font-size: 120%; +} +.menu .pure-menu-selected a +{ + color: white; +} +.menu a +{ + color: #8F543B; +} +.menu li a:hover, .menu li a:focus +{ + background: none; + border: none; + color: #8D847B; +} + +/* Header */ +#main-header +{ + background: #FCF6EC; + min-height: 20%; + padding-top:2em; + text-align: center; +} + +#main-header h1 +{ + width:80%; + margin:auto; + border: 3px solid #DDE023; + border-radius: 5px; + padding: 1em 1.6em; + font-size:20px; + font-weight: bold; + color: #DDE023; + font-weight: 100; + line-height: 0.5em; +} + +#main-header p +{ + color: #8F543B; + letter-spacing: 0.05em; + opacity: 0.8; +} + +/* + * -- PURE BUTTON STYLES -- + * I want my pure-button elements to look a little different + */ +.pure-button { + background-color: #1f8dd6; + color: white; + padding: 0.5em 2em; + border-radius: 5px; +} + +a.pure-button-primary { + background: white; + color: #8D847B; + border-radius: 5px; + font-size: 130%; +} + +#quizsPagination a +{ + background: #E7DEDE; + color: #7F7F7F; + border-radius: 5px; + font-size: 130%; + margin: 0.5em; +} + +/* We want to give the content area some more padding */ +.content +{ + padding: 1em 1em 3em; +} + +/* This is the class used for the main content headers (

    ) */ +.content-head +{ + font-weight: 400; + text-transform: uppercase; + letter-spacing: 0.1em; + margin: 2em 0 1em; +} + +/* This is a modifier class used when the content-head is inside a ribbon */ +.content-head-questionnaire +{ + color: white; +} + +/* This is the class used for the dark-background areas. */ +.questionnaire-listed, .questionnaire-intro +{ + background: #2d3e50; + color: #aaa; +} + +.questionnaire-intro img +{ + max-height:500px; + width:auto; +} + +.questionnaire-listed img +{ + max-height:200px; + width:auto; +} + +nav#pagination +{ +clear:both; +} + +/* + * -- PURE FORM STYLES -- + * Style the form inputs and labels + */ +.pure-form +{ + width:90%; + margin-left:1em; +} +.pure-form label +{ + font-weight: bold; + font-size: 100%; +} + +.pure-form input[type] +{ + border: 2px solid #ddd; + box-shadow: none; + font-size: 100%; + margin-bottom: 1em; +} +.error +{ + color: rgb(202, 60, 60); +} +.success +{ + color: rgb(28, 184, 65); +} +.information +{ + color: rgb(66, 184, 221); +} +#helpClassification a +{ + margin-right:1em; +} + +.needJS +{ + display:none; +} + +#links +{ + margin:1em 0; +} +#response +{ +margin:0.5em 1em; +padding:0.5em; +} + +/* Bouton permettant de demander l'affichage du quiz */ +#showQuestionnaire +{ + display:none; +} + +/* Boutons inscription/connexion suite réponse quiz */ +.subcribeBtns +{ + display:none; +} +.subcribeBtns .pure-button +{ + background-color: #1f8dd6; + color: white; + font-size: 1.1em; + margin:0 0.5em; +} +.accountBtns .pure-button +{ + background-color: #1f8dd6; + color: white; + font-size: 1.1em; + margin:0 0.5em; +} + +.quizs, .help +{ + display: none; +} + +#main-content +{ + padding-bottom:3em; +} + +.footer +{ + background: #111; + width: 100%; +} +.footer a +{ + color:white; + font-weight:normal; +} +.footer ul +{ + margin:0; + padding:0; +} + +.fab, .fas, .far +{ + margin-right:0.5em; +} + + +/* + * -- TABLET (AND UP) MEDIA QUERIES -- + * On tablets and other medium-sized devices, we want to customize some + * of the mobile styles. + */ +@media (min-width: 48em) +{ + body + { + font-size: 16px; + } + .menu + { + text-align: left; + } + .menu ul + { + float: right; + } + /* We remove the border-separator assigned to .l-box-lrg */ + .l-box-lrg + { + border: none; + } + .footer + { + position: fixed; + bottom: 0; + height:3em; + } +} \ No newline at end of file diff --git a/front/public/themes/default/a-propos.html b/front/public/themes/default/a-propos.html new file mode 100644 index 0000000..d520991 --- /dev/null +++ b/front/public/themes/default/a-propos.html @@ -0,0 +1,161 @@ + + + + + + +Tout savoir sur WikiLerni + + + + + + + + + + + +
    +
    +
    +

    WikiLerni

    +

    Cultivons notre jardin !

    +

    +Tester gratuitement +

    +
    + +
    + +
    +
    + +

    Qu'est-ce que WikiLerni ?

    + +

    WikiLerni vous propose de lire une sélection d'articles de Wikipédia.
    + Suite à chaque lecture, une série de questions vous permet de tester ce que vous avez retenu.
    + Toutes les réponses à ce quiz se trouvent dans l'article proposé à la lecture.
    + Vous pouvez sauvegarder vos résultats au quiz en créant un compte WikiLerni.
    + Vous pourrez ensuite répondre de nouveau aux mêmes questions plusieurs semaines, mois... après avoir lu l'article.
    + De quoi tester votre mémoire à plus en moins long terme !

    + +

    Que signifie "WikiLerni" ?

    + +

    Le nom "WikiLerni" est composé de deux parties : +

      +
    • « Wiki » fait évidemment référence à l'encyclopédie en ligne Wikipédia. Comme je vous sais curieux, sachez que le terme « wiki » vient lui-même du mot hawaïen « wikiwiki » signifiant « rapide », « vite » ou « informel ».
    • +
    • « Lerni » est un verbe espéranto signifiant « apprendre » ou encore « étudier ». Vous pouvez penser à « learn » en anglais ou encore « lernen » en allemand.
    • +
    + Bref, WikiLerni vous invite à apprendre de nouvelles choses avec Wikipédia !
    + Et en lisant ces quelques lignes, vous venez peut-être déjà d'apprendre quelque chose :-)

    + +

    À qui s'adresse WikiLerni ?

    + +

    À toute personne curieuse aimant apprendre de nouvelles choses !
    + Contrairement à d'autres sites de quiz testant votre culture générale, WikiLerni ne vous demande pas d'être déjà très "savants", même si vous l'êtes forcément, au moins dans certains domaines. Si ! Si !
    + Vous êtes ici pour apprendre et toutes les réponses aux questions des quizs se trouvent dans l'article qui vous est proposé à la lecture.
    + C'est donc une façon ludique d'apprendre de nouvelles choses sur des sujets auxquels vous ne vous seriez peut-être jamais intéressé par vous-même.

    + +

    Est-il nécessaire de créer un compte pour utiliser WikiLerni ?

    + +

    Non, vous pouvez parcourir librement WikiLerni sans avoir besoin d'être connecté au site.
    + Votre compte vous permettra de : +

      +
    • sauvegarder vos résultats aux quizs
    • +
    • recevoir des suggestions de nouvelles lectures, directement par e-mail
    • +
    • faciliter votre navigation via un moteur de recherche interne à WikiLerni
    • +
    • et d'autres fonctionnalités à venir...
    • +

    + +

    Comment sont sélectionnés les articles proposés par WikiLerni ?

    + +

    Tout comme Wikipédia, WikiLerni se veut éclectique.
    + Donc il vous sera proposé des articles sur des sujets très variés : sciences, arts, histoire, littérature, mythologie, géographie, culture populaire, etc.
    + Il n'y aucun sujet qui ne soit pas digne d'intérêt à priori. Seront évités des articles indiqués par Wikipédia comme de faible qualité ou encore sujets à polémique.

    + +

    Les articles proposés à la lecture peuvent être de longueurs variées.
    + Une estimation de la durée de lecture vous est indiquée sur la page du quiz ou encore dans les e-mails que vous recevez si vous êtes abonné.
    + Vous pourrez ainsi choisir de laisser de côté un article un peu long pour y revenir quand vous aurez plus de temps.

    + +

    Pour l'instant, les articles proposés sont uniquement francophones.
    + Mais suivant le succès du site, des versions dans d'autres langues pourront être envisagées.
    + Si vous souhaitez vous-même lancer une version dans une autre langue, mais n'avez pas les compétences techniques pour le faire, n'hésitez à me contacter pour un éventuel partenariat.

    + +

    Quel lien entre WikiLerni et Wikipédia ?

    + +

    Puisque toutes les suggestions de lecture de WikiLerni vous amènent sur Wikipédia, le lien est évident.
    + Pour autant, WikiLerni n'est pas un projet porté par la fondation Wikipédia, ni par une de ses associations locales, mais est un projet indépendant.
    + Au-delà de ce lien pratique, WikiLerni se veut très proche de l'esprit de Wikipédia en partageant son attrait pour la culture libre et le "libre" en général. + L'application faisant fonctionner WikiLerni est un logiciel libre, c'est-à-dire que toute personne peut l'utiliser, étudier son code, le modifier, le distribuer selon son souhait.
    Ceci est également vrai pour le graphisme du site et les quizs eux-mêmes : texte d'introduction, questions/réponses, illustrations... Sauf exceptions indiquées.

    + +

    Est-ce que WikiLerni est gratuit ?

    + +

    Oui.. et non ! Réponse de normand venant d'un breton ? :-)
    Vous pouvez tout à fait parcourir WikiLerni, lire les articles proposés et répondre aux quizs.
    + Tout cela se fait sans avoir besoin de vous abonner et donc gratuitement.
    Par contre, si vous souhaitez garder vos résultats, recevoir par mail de nouvelles suggestions de lectures... vous devrez vous abonner au site.
    Vous pourrez alors tester gratuitement l'abonnement pendant une période de découverte.
    Ensuite, vous serez invité à souscrire à un abonnement, mais à un prix "libre", c'est-à-dire que différentes possibilités vous seront proposées.
    Tout le monde n'a pas les mêmes moyens, ni le même intérêt pour le WikiLerni, donc à vous de choisir en conscience.
    + Vous aimez WikiLerni, mais ne pouvez vraiment pas payer pour ce service ? Contactez-moi. Vous n'avez pas à vous justifier.
    + De même, si aucune des options ne vous convient ou encore si vous préférez un autre moyen de paiement (chèque, virement...), contactez-moi pour me dire ce que vous souhaitez.
    Des abonnements de groupe (famille, écoles, associations...) ou autres formules peuvent aussi être envisagées, dans la mesure où cela sera techniquement possible.
    Bref, nous sommes ici plus dans l'esprit d'un financement participatif que dans celui d'un abonnement classique.
    En souscrivant à un abonnement, vous permettez à WikiLerni d'exister.

    + +

    À quoi va servir l'argent de mon abonnement ?

    + +

    Cet argent va principalement servir à :

      +
    • payer les frais techniques liés au site : serveurs, routeurs e-mail, paiement en ligne...
    • +
    • développer le logiciel permettant à WikiLerni de fonctionner.
    • +
    • consacrer du temps à sélectionner les articles Wikipédia et préparer les questions.
    • +
    • gérer le site au quotidien : répondre à vos courriels, communiquer, etc.
    • +
    Tout cela sans vous imposer de publicités ou faire commerce de vos données personnelles.
    + Par ailleurs, une partie des bénéfices nets de WikiLerni seront distribués sous forme de dons à l'association Wikimédia France et aux développeurs des logiciels libres utilisés par WikiLerni.
    Je parle de bénéfices "nets", car au-delà des frais de fonctionnement, mon activité étant déclarée, il faut y soustraire TVA, cotisations, etc.

    + Pas de publicité, respect de vos données personnelles, activité déclarée en France... un autre internet serait possible ?

    + +

    Comment puis-je aider WikiLerni ?

    + +

    Tout d'abord en l'utilisant et me retournant vos éventuelles remarques/suggestions.
    + Un bug ? Une erreur d'orthographe ? Une suggestion de fonctionnalité ? Quelque chose que vous ne comprenez pas ? N'hésitez pas à me le dire, cela m'intéresse.
    + Ensuite, si vous avez les moyens, vous pouvez souscrire un abonnement payant pour permettre au projet de perdurer.
    + Et WikiLerni n'ayant pas les moyens des grandes sociétés pour communiquer, vous pouvez aussi en parler autour de vous, en ligne ou dans la vie de tous les jours. + Vous le savez sans doute, rien ne vaut le bouche à oreille !
    + Un système de parrainage est d'ailleurs prévu pour vous récompenser : à chaque fois qu'une personne inscrite en vous désignant comme "parrain" souscrit un abonnement payant, votre propre abonnement se trouve prolongé de 30 jours.

    + +
    + + +
    + + + + \ No newline at end of file diff --git a/front/public/themes/default/accueil.html b/front/public/themes/default/accueil.html new file mode 100644 index 0000000..f029a24 --- /dev/null +++ b/front/public/themes/default/accueil.html @@ -0,0 +1,100 @@ + + + + + + + + WikiLerni + + + + + + + + + + + + + +
    + + + +
    +

    WikiLerni

    +
    +
    + + + +
    +

    Les quizs attendant votre réponse

    +
    +
    +
    +
    + +
    +
    +
    + + + + \ No newline at end of file diff --git a/front/public/themes/default/aurevoir.html b/front/public/themes/default/aurevoir.html new file mode 100644 index 0000000..0f6541c --- /dev/null +++ b/front/public/themes/default/aurevoir.html @@ -0,0 +1,79 @@ + + + + + + + + Valider la suppression de votre compte + + + + + + + + + + + + + +
    +
    +

    WikiLerni

    +

    Cultivons notre jardin !

    +
    + +
    +

    Valider la suppression de votre compte

    +
    +
    + +
    Si vous voyez ce message, c'est que votre lien de validation n'est pas valide ou a expiré. Vous pouvez en demander un nouveau en cliquant ici.
    +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/front/public/themes/default/compte.html b/front/public/themes/default/compte.html new file mode 100644 index 0000000..d4ece81 --- /dev/null +++ b/front/public/themes/default/compte.html @@ -0,0 +1,176 @@ + + + + + + + + Mon compte + + + + + + + + + + + + + +
    + + + +
    +

    Votre compte WikiLerni

    + +
    +
    +
    +
    +
    +
    + + + +
    +
    + + + +
    +
    + + + Laisser vide sauf si vous souhaitez le changer. +
    +
    + Par défaut un nouveau quiz vous est proposé tous les jours. Vous pouvez préciser ci-dessous les jours souhaités : +
      +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    • + +
    • + +
    • + +
    • +
    • + +
    • +
    +
    +
    + + + + +
    +
    +
    +
    + +

    Votre abonnement

    +
    +

    Le coût de l'abonnement dépend de la durée pour laquelle vous vous engagez.

    +

    Merci de sélectionnez l'offre qui vous convient et de valider les C.G.V.
    Un bouton vous permettra ensuite d'effectuer votre paiement.

    + + +
    +
    +

    Merci de sélectionné l'offre qui vous convient.

    + +

    Les utilisateurs que vous avez parrainés

    +

    Vous pouvez parrainer d'autres utilisateurs. Pour ce faire, demandez-leur de saisir lors de l'inscription votre adresse e-mail ou encore le code suivant : (en gardant les majuscules/minuscules).

    +

    À chaque fois qu'un utilisateur que vous avez parrainé souscrit un abonnement payant, son abonnement comme le vôtre se trouve prolongé gratuitement de 30 jours. Ceci reste valable tant que cet utilisateur garde son compte WikiLerni.

    +

    Pour l'instant aucune personne ne s'est inscrite en vous désignant comme "parrain".

    +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/front/public/themes/default/connexion.html b/front/public/themes/default/connexion.html new file mode 100644 index 0000000..ccf1dab --- /dev/null +++ b/front/public/themes/default/connexion.html @@ -0,0 +1,108 @@ + + + + + + + Se connecter à WikiLerni + + + + + + + + + + + + + +
    +
    +

    WikiLerni

    +

    Cultivons notre jardin !

    +
    + +
    +

    Connectez-vous à WikiLerni

    +
    +
    + +
    +
    +
    +

    Pas de compte WikiLerni ? créez-le ici.

    +
    + + + +
    +
    + + + Oublié ? Alors laissez vide et cochez la case ci-dessous. +
    +
    + + + + +
    +
    +
    +
    +
    +
    +

    Besoin d'aide ?

    +

    Si vous avez oublié votre mot de passe, il vous suffit de cocher la case "Je souhaite recevoir un lien de connexion par e-mail.". Un lien valide pendant une courte durée vous permettra de vous connecter au site.
    Si vous ne vous souvenez pas non plus de l'adresse e-mail utilisée sur ce site ou que vous n'y avez plus accès, vous pouvez nous contacter en fournissant des informations permettant de vous identifier.

    La case "Je souhaite ne pas avoir à me connecter à chaque fois." vous permettra de rester connecté(e) jusqu'à 6 mois, pour peu que vous utilisiez le même navigateur internet.

    +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/front/public/themes/default/gestion-quizs.html b/front/public/themes/default/gestion-quizs.html new file mode 100644 index 0000000..d550807 --- /dev/null +++ b/front/public/themes/default/gestion-quizs.html @@ -0,0 +1,266 @@ + + + + + + + + Les quizs + + + + + + + + + + + + + +
    + + + +
    +

    Les quizs

    + + + +
    +
    +
    +
    +
    + Informations du quiz +
    + + + +
    +
    + + .html +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + Séparer les rubriques par des virgules +
    +
    + + + + Nouveau questionnaire + Voir le quiz +
    +
    + +
    +
    +
    +
    + + + +
    +
    + Informations de l'illustration +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + + + +
    +
    +
    +
    + + +
    +
    + La question et les réponses proposées +
    + + + +
    +
    + + Permet de fixer l'ordre d'affichage des questions. +
    +
    + + +
    + Réponses proposées +
    +   Réponse correcte + +
    +
    +   Réponse correcte + +
    +
    +   Réponse correcte + +
    +
    +   Réponse correcte + +
    +
    +   Réponse correcte + +
    +
    +   Réponse correcte + +
    +
    +   Réponse correcte + +
    +
    +   Réponse correcte + +
    +
    +   Réponse correcte + +
    +
    +   Réponse correcte + +
    +
    + + + + +
    +
    +
    +
    + +
    + +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/front/public/themes/default/gestion-utilisateurs.html b/front/public/themes/default/gestion-utilisateurs.html new file mode 100644 index 0000000..47cbce1 --- /dev/null +++ b/front/public/themes/default/gestion-utilisateurs.html @@ -0,0 +1,211 @@ + + + + + + + + Les abonnés + + + + + + + + + + + + + +
    + + + +
    +

    Les abonnés

    + + + +
    +
    +
    +
    +
    + Informations de l'abonné +
    +
    + + + +
    +
    + + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + + Laisser vide sauf si vous souhaitez le changer. +
    + +
    + + +
    + +
    + + Depuis la création de son compte. +
    + +
    + Jours valables pour l'abonnement +
      +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    • + +
    • + +
    • + +
    • +
    • + +
    • +
    +
    +
    + + + + + + + Vider +
    +
    +

    Payments reçus via l'API WebPortage

    +

    Parrainages

    +
    +
    + +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/front/public/themes/default/gestion.html b/front/public/themes/default/gestion.html new file mode 100644 index 0000000..8bba4c3 --- /dev/null +++ b/front/public/themes/default/gestion.html @@ -0,0 +1,83 @@ + + + + + + + + WikiLerni - gestion du site + + + + + + + + + + + + + +
    + + + +
    +

    WikiLerni

    +
    +
    +
    +
    +

    Régénérer le HTML.

    +
    +
    + + + + \ No newline at end of file diff --git a/front/public/themes/default/index.html b/front/public/themes/default/index.html new file mode 100644 index 0000000..bfc7f51 --- /dev/null +++ b/front/public/themes/default/index.html @@ -0,0 +1 @@ +WikiLerni : qu'allez-vous apprendre aujourd'hui ?

    WikiLerni

    Inscription

    De nature curieuse ?

    Avec WikiLerni vous apprenez chaque jour de nouvelles choses.
    Des articles de Wikipédia sont sélectionnés pour vous et sont suivis d'un quiz vous permettant de tester ce que vous en avez retenu.
    De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre "jardin".

    La culture en liberté

    Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
    Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
    Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
    Vous pouvez venir y "cultiver votre jardin" en toute tranquillité.

    (*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.

    sans fichier !

    Que savez-vous des éditions Gallimard ?

    Les éditions Gallimard, appelées jusqu’en 1919 les éditions de la Nouvelle Revue française et jusqu’en 1961 la librairie Gallimard, sont un groupe d'édition français. La maison d'édition est fondée par Gaston Gallimard en 1911. Le groupe Gallimard est actuellement dirigé par Antoine Gallimard.Con...
    Allez au quiz !
    \ No newline at end of file diff --git a/front/public/themes/default/inscription.html b/front/public/themes/default/inscription.html new file mode 100644 index 0000000..5eb8946 --- /dev/null +++ b/front/public/themes/default/inscription.html @@ -0,0 +1,115 @@ + + + + + + + S'inscrire à WikiLerni + + + + + + + + + + + + + +
    +
    +

    WikiLerni

    +

    Cultivons notre jardin !

    +
    + +
    +

    Créer votre compte WikiLerni

    +
    +
    + +
    +
    +
    + + + +
    +
    + + + +
    +
    + + + Votre mot de passe doit compter au moins 8 caractères. Générer un mot de passe. +
    +
    + + + Facultatif. +
    +
    + + + +
    +
    +
    +
    +
    +
    +

    Pourquoi s'inscrire ?

    +

    Cela prend quelques instants et n'engage à rien, car c'est totalement gratuit les quinze premiers jours. Libre à vous ensuite de vous abonner pour quelques euros par an. Sinon, il vous suffira de ne pas donner suite à la notification vous proposant de vous abonner.

    +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/front/public/themes/default/login.html b/front/public/themes/default/login.html new file mode 100644 index 0000000..9ed553c --- /dev/null +++ b/front/public/themes/default/login.html @@ -0,0 +1,79 @@ + + + + + + + + Tester votre lien de connexion + + + + + + + + + + + + + +
    +
    +

    WikiLerni

    +

    Cultivons notre jardin !

    +
    + +
    +

    Test de votre lien de connexion

    +
    +
    + +
    Si vous voyez ce message, c'est que votre lien de connexion n'est pas valide. Vous pouvez en demander un nouveau en cliquant ici.
    +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/front/public/themes/default/newlogin.html b/front/public/themes/default/newlogin.html new file mode 100644 index 0000000..0e4e17e --- /dev/null +++ b/front/public/themes/default/newlogin.html @@ -0,0 +1,79 @@ + + + + + + + + Valider vos nouveaux identifiants + + + + + + + + + + + + + +
    +
    +

    WikiLerni

    +

    Cultivons notre jardin !

    +
    + +
    +

    Validation de vos nouveaux identifiants

    +
    +
    + +
    Si vous voyez ce message, c'est que votre lien de validation n'est pas valide ou a expiré. Vous pouvez en demander un nouveau en cliquant ici.
    +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/front/public/themes/default/sortie.html b/front/public/themes/default/sortie.html new file mode 100644 index 0000000..01bd6ff --- /dev/null +++ b/front/public/themes/default/sortie.html @@ -0,0 +1,78 @@ + + + + + + + + Déconnexion + + + + + + + + + + + + + +
    +
    +

    WikiLerni

    +

    Cultivons notre jardin !

    +
    + +
    +

    Au revoir !

    +
    +
    +
    Si vous voyez ce message, c'est qu'un problème a été rencontré durant la déconnexion.
    N'hésitez pas à nous prévenir si le problème persiste.
    +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/front/public/themes/default/stop-mail.html b/front/public/themes/default/stop-mail.html new file mode 100644 index 0000000..0ca6b19 --- /dev/null +++ b/front/public/themes/default/stop-mail.html @@ -0,0 +1,78 @@ + + + + + + + + Ne plus recevoir d'e-mail + + + + + + + + + + + + + +
    +
    +

    WikiLerni

    +

    Cultivons notre jardin !

    +
    + +
    +

    Stopper les e-mail de WikiLerni

    +
    +
    +
    Si vous voyez ce message, c'est que votre lien de désabonnement ne fonctionne pas. Vous pouvez accéder à votre compte pour désactiver les envois.
    +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/front/public/themes/default/validation.html b/front/public/themes/default/validation.html new file mode 100644 index 0000000..ed3dbe8 --- /dev/null +++ b/front/public/themes/default/validation.html @@ -0,0 +1,79 @@ + + + + + + + + Valider votre compte WikiLerni + + + + + + + + + + + + + +
    +
    +

    WikiLerni

    +

    Cultivons notre jardin !

    +
    + +
    +

    Validation de votre compte WikiLerni

    +
    +
    + +
    Si vous voyez ce message, c'est que votre lien de validation n'est pas valide ou a expiré. Vous pouvez en demander un nouveau en cliquant ici.
    +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/front/public/themes/wikilerni/css/account-mobile.css b/front/public/themes/wikilerni/css/account-mobile.css new file mode 100644 index 0000000..658c9ba --- /dev/null +++ b/front/public/themes/wikilerni/css/account-mobile.css @@ -0,0 +1,67 @@ +#account fieldset +{ +width: 80%; +margin: auto; +} + +#account label +{ +width: 49%; +margin-right: 1%; +text-align: right; +display: inline-block; +} + +#account label.check +{ +text-align: left; +width:100%; +display: inline; +} + + +#account + {background-color: #FF8800; + width: 85%; + margin: auto; + padding-top: 2.5em; + margin-top: -2.5em; + box-shadow: 0px 0px 5px black; + padding-bottom: 2.5em; + margin-bottom: -2.5em; + text-align: center;} + +#account h1 + {width: 105%; + background-color: #FF8800; + box-shadow: 0px 0px 5px black; + margin-left: -2.5%; + text-align: center; + border-radius: 5px; + padding-top: 0.5em; + padding-bottom: 0.5em; + border-top: 1px solid rgba(255,255,255,0.5); + border-bottom: 1px solid rgba(0, 0, 0, 0.5);} + +#account p, +#account ul + {margin: 1em; + text-align: justify;} + +#account .error, #account .info, #account .success +{ +margin: 1em; +width: auto; +border-radius: 5px; +} + +@media screen and (max-width: 660px) { +#account label + {width: 100%; + text-align: center; + display: inline-block;} + + #account fieldset input + {display: block; + margin: auto;} +} diff --git a/front/public/themes/wikilerni/css/account.css b/front/public/themes/wikilerni/css/account.css new file mode 100644 index 0000000..48f4a9f --- /dev/null +++ b/front/public/themes/wikilerni/css/account.css @@ -0,0 +1,49 @@ +#account fieldset { width: 80%; } +#account label +{ +width: 49%; +margin-right: 1%; +text-align: right; +display: inline-block; +} +#account label.check +{ +text-align: left; +width:100%; +display: inline; +} + +#account + {background-color: #FF8800; + width: 50%; + margin: auto; + padding-top: 2.5em; + margin-top: -2.5em; + box-shadow: 0px 0px 5px black; + padding-bottom: 2.5em; + margin-bottom: -2.5em; + text-align: center;} + +#account h1 + {width: 105%; + background-color: #FF8800; + box-shadow: 0px 0px 5px black; + margin-left: -2.5%; + text-align: center; + border-radius: 5px; + padding-top: 0.5em; + padding-bottom: 0.5em; + border-top: 1px solid rgba(255,255,255,0.5); + border-bottom: 1px solid rgba(0, 0, 0, 0.5);} + +#account p, +#account ul + {margin: 1em; + text-align: justify;} + +#account .error, #account .info, #account .success +{ +margin: 1em; +width: auto; +border-radius: 5px; +} \ No newline at end of file diff --git a/front/public/themes/wikilerni/css/common-mobile.css b/front/public/themes/wikilerni/css/common-mobile.css new file mode 100644 index 0000000..220e637 --- /dev/null +++ b/front/public/themes/wikilerni/css/common-mobile.css @@ -0,0 +1,308 @@ +@font-face { + font-family: Millimetre; + src: url(../webfonts/Light/Millimetre-Light_web.woff); + font-weight: lighter; +} + +@font-face { + font-family: Millimetre; + src: url(../webfonts/Regular/Millimetre-Regular_web.woff); + font-weight: regular; +} + +@font-face { + font-family: Millimetre; + src: url(../webfonts/Bold/Millimetre-Bold_web.woff); + font-weight: bold; +} + +body + {margin: 0px; + overflow-x: hidden; + background-color: #8c599c;} + +body, +a, +input + {font-family: Millimetre; + font-weight: regular; + color: rgba(255,255,255,1); + text-shadow: 0px 1px 0px rgba(0, 0, 0, 0.75);} + +input, #headLinks a, #footLinks a, a.button, +h1 a, h2 a, h3 a, h4 a, h5 a, h6 a +{ +text-decoration: none; +outline: none; +} +a:hover +{ +color: rgba(0,0,0,0.66); +text-shadow: 0px 1px 0px rgba(255,255,255,0.75); +} +a.button:hover +{ +color:white; +text-shadow:none; +} + +header, +footer + {background-color: #FF8800; + border-bottom: 1px solid rgba(0,0,0,0.75); + box-shadow: 0px 0px 10px black; + font-size: 1.5em; + width: 100%; + height:100px; + margin-top: 1em; + transform: rotate(0.66deg);} + +footer + {font-size: 1em;} + +/* +header img + {max-height:80px; + margin-left:10px; + margin-top: 10px; + display: inline-block;}*/ + +header img +{ +display:none; +} +header ul +{ +width:100%; +} + +header ul, footer ul + {list-style-type: none; + display: inline-block; + float: right; + line-height: 50px;} + +header ul li + {float: right; + display: block;} + +footer ul li + {margin-top: 10px; + display:inline-block;} + +footer ul + {width: 100%;} + +header ul li::after, +footer ul li::after + {width: 1px; + height: 80px; + display: block; + float: right; + content: ''; + margin-left: 1em; + margin-top: -20px; + background: linear-gradient(to top, rgba(255,255,255,0.25), rgba(255,255,255,0.0));} + +header ul li::before, +footer ul li::before + {width: 1px; + height: 80px; + display: block; + float: right; + content: ''; + margin-top: -20px; + margin-right: 1em; + background: linear-gradient(to top, rgba(0,0,0,0.25), rgba(0,0,0,0.0));} + +header ul li:first-child::after, +footer ul li:last-child::after + {display: none;} + +header ul li:first-child::before, +footer ul li:last-child::before + {display: none;} + +header ul li:first-child, +footer ul li:first-child + {margin-right: 1em;} + +footer + {transform: rotate(-0.66deg); + clear: both; + text-align: center;} + +fieldset + {border: 0px; + text-align: left;} + +.needJS +{ +display: none; +} + +label + {width: 50%;} + +.engraved +{ +color: white; +text-shadow: 0px -1px 0px rgba(0, 0, 0, 1); +font-family: verdana; +} + +.framed + {border: 1px solid rgba(0, 0, 0, 0.33); + border-radius: 5px; + box-shadow: 0px 1px 0px rgba(255,255,255,0.5), inset 0px 1px 0px rgba(255,255,255,0.33); + display: inline-block; + margin: 1em;} + +.cardboard +{ +background-opacity: 0.75; +background-image: url('../img/background-texture.png'); +} + +#explanations +{ +padding: 0.7em; +} + +#explanations p +{ +margin:1.3em; +text-align:left; +} + + +/* This allow the motion of the button while overing without displacing the content of the page */ +.input_wrapper +{ +height: 40px; +display: inline-block; +margin-top: 1em; +} + +input[type=submit], input[type=text], input[type=email], input[type=password], .button +{ + background-color: #8c599c; + padding: 10px; + border: 0px; + border-radius: 3px; + margin-top:-10px; + color: white; + font-family: sans; + font-weight: bold; + font-size: 0.6em; + position: relative; + transition: 0.125s ease all; + margin-top: 0px; + box-shadow: inset 0px 1px 0px rgba(255,255,255,0.66), inset 0px -1px 0px rgba(0, 0, 0,0.66), 0px 3px 8px rgba(0,0,0,0.66); +} + +input[type=submit]:hover, +.button:hover + {margin-top: 2px; + box-shadow: inset 0px 1px 0px rgba(255,255,255,0.66), inset 0px -1px 0px rgba(0, 0, 0,0.66), 0px 0px 5px rgba(0,0,0,0.66);} + +input[type=text], input[type=password], input[type=email] { + box-shadow: inset 0px 1px 0px rgba(0,0,0,0.66), inset 0px -1px 0px rgba(255,255,255,0.66), inset 0px 3px 8px rgba(0,0,0,0.66);} + +input[type=checkbox] + {width:15px; + height:15px; + margin-left: 0px; + margin-right: -15px; + opacity:0.0;} + +/* The following is a trick to force browser to let me redefine checkbox style */ +.checkbox_override + {width: 15px; + height: 15px; + border-radius: 2px; + box-shadow: inset 0px 2px 2px rgba(0, 0, 0, 0.5); + background-color: rgba(0, 0, 0, 0.25); + border-top: 1px solid rgba(0,0,0,0.75); + border-bottom: 1px solid rgba(255,255,255,0.5); + display: inline-block;} + +input:hover ~ .checkbox_override + {background-color: rgba(0, 0, 0, 0.125);} + +input:checked ~ .checkbox_override { + border-bottom: 1px solid rgba(0,0,0,0.75); + border-top: 1px solid rgba(255,255,255,0.5); + box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.5); + background-color: rgba(255, 255, 255, 0.25); +} + +/*#ERROR:target, #SUCCESS:target, #INFO:target,*/ +p.error, p.success, p.info, +div.error, div.success, div.info +{ +width: calc(100% - 20px); +height: auto; +padding: 1em; +opacity: 1; +margin-left: 0px; +line-height: 1.25em; +background-image: url('../img/background-texture.png'); +} + +.info {background-color: #8c599c;} +.success {background-color: #00c684;} +.error {background-color: red;} + +@media screen and (max-width: 570px) { + header ul + {line-height: 66px;} + + header + {font-size: 1em;} +} + +@media screen and (max-width: 600px) { + footer + {font-size: 0.75em;} + + header ul li::after, + footer ul li::after + {display: none;} + + header ul li, + footer ul li + {display: inline-block; + margin-left: 0.5em; + margin-right: 0.5em;} + + header ul li::before, + footer ul li::before + {display: none;} + + header + { + height:60px; + } +} + +@media screen and (max-width: 400px) { + header + {font-size: 0.75em;} + + footer ul + {line-height: 25px;} + + header ul + {line-height: 75px;} +} + +#zerozozio +{ +margin:1em; +text-align:right; +} +#zerozozio a, span +{ +padding:0 0.3em; +} \ No newline at end of file diff --git a/front/public/themes/wikilerni/css/common.css b/front/public/themes/wikilerni/css/common.css new file mode 100644 index 0000000..275ebb9 --- /dev/null +++ b/front/public/themes/wikilerni/css/common.css @@ -0,0 +1,247 @@ +@font-face { + font-family: Millimetre; + src: url(../webfonts/Light/Millimetre-Light_web.woff); + font-weight: lighter; +} + +@font-face { + font-family: Millimetre; + src: url(../webfonts/Regular/Millimetre-Regular_web.woff); + font-weight: regular; +} + +@font-face { + font-family: Millimetre; + src: url(../webfonts/Bold/Millimetre-Bold_web.woff); + font-weight: bold; +} + +body + {margin: 0px; + overflow-x: hidden; + background-color: #8c599c;} + +body, a, input +{ +font-family: Millimetre; +font-weight: regular; +color: rgba(255,255,255,1); +text-shadow: 0px 1px 0px rgba(0, 0, 0, 0.75); +} + +input, #headLinks a, #footLinks a, a.button, +h1 a, h2 a, h3 a, h4 a, h5 a, h6 a +{ +text-decoration: none; +outline: none; +} +a:hover +{ +color: rgba(0,0,0,0.66); +text-shadow: 0px 1px 0px rgba(255,255,255,0.75); +} +a.button:hover +{ +color:white; +text-shadow:none; +} + +header, +footer + {background-color: #FF8800; + border-bottom: 1px solid rgba(0,0,0,0.75); + box-shadow: 0px 0px 10px black; + font-size: 1.5em; + width: 100%; + height:100px; + margin-top: 1em; + transform: rotate(0.66deg);} + +header img + {max-height:80px; + margin-left:10px; + margin-top: 10px; + display: inline-block;} + +header ul, footer ul + {list-style-type: none; + display: inline-block; + float: right; + line-height: 50px;} + +header ul li + {float: right; + display: block;} + +footer ul li + {display:inline-block;} + +footer ul + {width: 100%;} + +header ul li::after, +footer ul li::after + {width: 1px; + height: 80px; + display: block; + float: right; + content: ''; + margin-left: 1em; + margin-top: -20px; + background: linear-gradient(to top, rgba(255,255,255,0.25), rgba(255,255,255,0.0));} + +header ul li::before, +footer ul li::before + {width: 1px; + height: 80px; + display: block; + float: right; + content: ''; + margin-top: -20px; + margin-right: 1em; + background: linear-gradient(to top, rgba(0,0,0,0.25), rgba(0,0,0,0.0));} + +header ul li:first-child::after, +footer ul li:last-child::after + {display: none;} + +header ul li:first-child::before, +footer ul li:last-child::before + {display: none;} + +header ul li:first-child, +footer ul li:first-child + + {margin-right: 1em;} + +footer + {transform: rotate(-0.66deg); + clear: both; + text-align: center;} + +fieldset + {border: 0px;} + +.needJS +{ +display: none; +} + +.engraved +{ +color: white; +text-shadow: 0px -1px 0px rgba(0, 0, 0, 1); +font-family: verdana; +} + +.framed +{ +border: 1px solid rgba(0, 0, 0, 0.33); +border-radius: 5px; +padding-top: 0.5em; +padding-bottom: 0.5em; +box-shadow: 0px 1px 0px rgba(255,255,255,0.5), inset 0px 1px 0px rgba(255,255,255,1); +background-image: url('../img/background-texture.png'); +display: inline-block; +margin: 1em; +} + +#explanations +{ +padding: 1em; +} + +#explanations p +{ +margin:1.3em; +} + +.cardboard, .error, .success, .info +{ +background-opacity: 0.75; +background-image: url('../img/background-texture.png'); +} + +/* This allow the motion of the button while overing without displacing the content of the page */ +.input_wrapper +{ +height: 40px; +display: inline-block; +margin-bottom: 1em; +} + +input[type=submit], input[type=text], input[type=email], input[type=password], .button + {background-color: #8c599c; + padding: 10px; + border: 0px; + border-radius: 3px; + margin-top:-10px; + color: white; + font-family: sans; + font-weight: bold; + position: relative; + transition: 0.125s ease all; + margin-top: 0px; + box-shadow: inset 0px 1px 0px rgba(255,255,255,0.66), inset 0px -1px 0px rgba(0, 0, 0,0.66), 0px 3px 8px rgba(0,0,0,0.66);} + +input[type=submit]:hover, .button:hover +{ +margin-top: 2px; +box-shadow: inset 0px 1px 0px rgba(255,255,255,0.66), inset 0px -1px 0px rgba(0, 0, 0,0.66), 0px 0px 5px rgba(0,0,0,0.66); +} + +input[type=text], input[type=password], input[type=email] { + box-shadow: inset 0px 1px 0px rgba(0,0,0,0.66), inset 0px -1px 0px rgba(255,255,255,0.66), inset 0px 3px 8px rgba(0,0,0,0.66);} + +input[type=checkbox] + {width:15px; + height:15px; + margin-left: 0px; + margin-right: -16px; + opacity:0.0;} + +/* The following is a trick to force browser to let me redefine checkbox style */ +.checkbox_override + {width: 15px; + height: 15px; + border-radius: 2px; + box-shadow: inset 0px 2px 2px rgba(0, 0, 0, 0.5); + background-color: rgba(0, 0, 0, 0.25); + border-top: 1px solid rgba(0,0,0,0.75); + border-bottom: 1px solid rgba(255,255,255,0.5); + display: inline-block;} + +input:hover ~ .checkbox_override + {background-color: rgba(0, 0, 0, 0.125);} + +input:checked ~ .checkbox_override { + border-bottom: 1px solid rgba(0,0,0,0.75); + border-top: 1px solid rgba(255,255,255,0.5); + box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.5); + background-color: rgba(255, 255, 255, 0.25); +} + +p.error, p.success, p.info, +div.error, div.success, div.info +{ +width: calc(100% - 20px); +height: auto; +padding: 1em; +opacity: 1; +margin-left: 0px; +line-height: 1.4em; +} + +.error {background-color: red;} +.info {background-color: #8c599c;} +.success {background-color: #00c684;} + +#zerozozio +{ +margin:1em; +text-align:right; +} +#zerozozio a, span +{ +padding:0 0.3em; +} \ No newline at end of file diff --git a/front/public/themes/wikilerni/css/home-mobile.css b/front/public/themes/wikilerni/css/home-mobile.css new file mode 100644 index 0000000..2ab8d69 --- /dev/null +++ b/front/public/themes/wikilerni/css/home-mobile.css @@ -0,0 +1,160 @@ +#home + {width: 80%; + margin: auto; + border-radius: 5px; + box-shadow: 0px 0px 5px black; + margin-top: -1.5em; + padding-top: 1.5em; + background-color: #FF8800; + border-bottom: 1px solid rgba(0, 0, 0, 0.75);} + +#home h1, +#home h2 + {text-align: center;} + +#home p + {margin-left:1em; + margin-right: 1em;} + +#home form + {border-top: 1px solid rgba(0, 0, 0, 0.5); + border-bottom: 1px solid rgba(0, 0, 0, 0.5); + box-shadow: inset 0px 1px 0px rgba(255, 255, 255, 0.5), 0px 1px 0px rgba(255, 255, 255, 0.5); + width: 80%; + margin: auto; + padding-bottom: 1em; + display: block; + padding-top: 1em; + text-align: center; + margin-bottom: 1em;} + +#home form input[type=text] + {width: calc(49% - 20px); + margin-right: 1%;} + +#home form input[type=submit] + {width: 40%;} + +#home form .line +{ +margin-top: 1em; +width: 100%; +} + +#logo + {width: 50%; + margin: auto; + display: block;} + +#home .error, #home .info, #home .success +{ +margin: 1em; +width: auto; +border-radius: 5px; +} + +/* Sur tablette la troisième colonne vient se placer en dessous de la première ou de la deuxième (la plus courte des deux) */ +#triple-column +{ +width: 90%; +margin: auto; +margin-top: 1em; +} +.column-1, .column-3, .column-2 +{ +width: 48%; +float: left; +margin-left:1.5%; +} + +.quiz +{ +width: 100%; +margin-bottom: 1em; +background-color: #FF8800; +border-radius: 5px; +border-top: 1px solid rgba(255,255,255,0.66); +border-bottom: 1px solid rgba(0,0,0,0.66); +box-shadow: 0px 0px 5px black; +} +.quiz h3 +{ +text-align: center; +margin: 1em; +} +.quiz p +{ +margin: 2em; +text-align: justify; +} +.quiz p:last-child +{ +text-align: center; +} +.quiz-image-wrapper +{ +width: 95%; +background-size: cover; +border-radius: 5px; +border-top: 1px solid rgba(0,0,0,0.66); +border-bottom: 1px solid rgba(255,255,255,0.66); +box-shadow: inset 0px 5px 5px rgba(0,0,0,0.33); +background-repeat: no-repeat; +margin: auto; +} +.quiz-image-wrapper img +{ +opacity: 0; +width: 100%; +} + +nav#pagination +{ +clear:both; +display:flex; +flex-wrap: wrap; +margin:0.5em; +} +nav#pagination div +{ +flex: 0 0 50%; +text-align:center; +} +nav#pagination a +{ +background-image: url('../img/background-texture.png'); +} + +@media screen and (max-width: 520px) +{ + /* Sur mobile, les colonnes se placent les unes sous les autres */ + #triple-column + { + display: block; + width: 80%; + margin: auto; + margin-top: 1em; + } + .column-1, .column-2, .column-3 + { + width: 98%; + float: left; + margin-right: 1%; + } + + #home form + { + text-align: center; + } + #home form input[type=text] + { + width: calc(100% - 20px); + margin-right: 0%; + } + #home form input[type=submit] + { + width: 100%; + margin-top: 1em; + display: inline-block; + } +} diff --git a/front/public/themes/wikilerni/css/home.css b/front/public/themes/wikilerni/css/home.css new file mode 100644 index 0000000..b6718ec --- /dev/null +++ b/front/public/themes/wikilerni/css/home.css @@ -0,0 +1,131 @@ +#home + {width: 50%; + margin: auto; + border-radius: 5px; + box-shadow: 0px 0px 5px black; + margin-top: -1.5em; + padding-top: 1.5em; + background-color: #FF8800; + border-bottom: 1px solid rgba(0, 0, 0, 0.75);} + +#home h1, +#home h2 + {text-align: center;} + +#home p + {margin-left:1em; + margin-right: 1em;} + +#home form + {border-top: 1px solid rgba(0, 0, 0, 0.5); + border-bottom: 1px solid rgba(0, 0, 0, 0.5); + box-shadow: inset 0px 1px 0px rgba(255, 255, 255, 0.5), 0px 1px 0px rgba(255, 255, 255, 0.5); + width: 80%; + margin: auto; + padding-bottom: 1em; + display: block; + padding-top: 1em; + text-align: center; + margin-bottom: 1em;} + +#home form input[type=text] + {width: calc(66% - 20px); + margin-right: 1%;} + +#home form input[type=submit] + {width: 32%;} + +#home form input[type=submit] + {width: 32%;} + +#home form .line +{ +margin-top:0.5em; +width: 100%; +} + +#logo + {width: 33%; + margin: auto; + display: block;} + + +#home .error, #home .info, #home .success +{ +margin: 1em; +width: auto; +border-radius: 5px; +} + +/* Les colonnes de l'enfer ! */ +#triple-column +{ +width: 95%; +margin: auto; +margin-top: 1em; +} +.column-1, +.column-2, +.column-3 +{ +float: left; +width: 32%; +margin-bottom: 1em; +} +.column-1, .column-2 +{ +margin-right: 1.33%; +} +.quiz +{ +width: 100%; +margin-bottom:1em; +background-color: #FF8800; +border-radius: 5px; +border-top: 1px solid rgba(255,255,255,0.66); +border-bottom: 1px solid rgba(0,0,0,0.66); +box-shadow: 0px 0px 5px black; +} +.quiz h3 +{ +text-align: center; +margin:1em; +} +.quiz p +{ +margin: 2em; +text-align: left; +} +.quiz p:last-child +{ +text-align: center; +} +.quiz-image-wrapper +{ +width: 95%; +background-size: cover; +background-repeat: no-repeat; +border-radius: 5px; +border-top: 1px solid rgba(0,0,0,0.66); +border-bottom: 1px solid rgba(255,255,255,0.66); +box-shadow: inset 0px 5px 5px rgba(0,0,0,0.33); +margin: auto; +} +.quiz-image-wrapper img +{ +opacity: 0; +width: 100%; +} + +nav#pagination +{ +clear:both; +display:flex; +flex-wrap: wrap; +margin:0.5em; +} +nav#pagination div +{ +flex: 0 0 50%; +text-align:center; +} \ No newline at end of file diff --git a/front/public/themes/wikilerni/css/links-page-mobile.css b/front/public/themes/wikilerni/css/links-page-mobile.css new file mode 100644 index 0000000..9603241 --- /dev/null +++ b/front/public/themes/wikilerni/css/links-page-mobile.css @@ -0,0 +1,28 @@ +#prompt, #login + {background-color: #FF8800; + width: 75%; + margin: auto; + text-align: center; + border-radius: 5px; + margin-top: -1em; + padding-top:1.5em; + border-bottom: 1px solid rgba(0,0,0,0.8); + box-shadow: 0px 0px 5px rgba(0,0,0,0.75);} + +#prompt img + {width: 33%;} + +#prompt p +{ +background-color: #FF8800; +box-shadow: 0px 0px 5px rgba(0,0,0,0.75); +width: 102%; +margin-left:-1%; +border-radius: 5px; +padding-top: 1em; +padding-bottom: 1em; +font-size:0.8em; +letter-spacing: 0.3em; +border-top: 1px solid rgba(255,255,255,0.5); +border-bottom: 1px solid rgba(0,0,0,0.66); +} \ No newline at end of file diff --git a/front/public/themes/wikilerni/css/links-page.css b/front/public/themes/wikilerni/css/links-page.css new file mode 100644 index 0000000..fd84c95 --- /dev/null +++ b/front/public/themes/wikilerni/css/links-page.css @@ -0,0 +1,27 @@ +#prompt, #login + {background-color: #FF8800; + width: 50%; + margin: auto; + text-align: center; + border-radius: 5px; + margin-top: -1em; + padding-top:1.5em; + border-bottom: 1px solid rgba(0,0,0,0.8); + box-shadow: 0px 0px 5px rgba(0,0,0,0.75);} + +#prompt img + {width: 33%;} + +#prompt p, #login h1 +{ +background-color: #FF8800; +box-shadow: 0px 0px 5px rgba(0,0,0,0.75); +width: 102%; +margin-left:-1%; +border-radius: 5px; +padding-top: 1em; +padding-bottom: 1em; +letter-spacing: 0.5em; +border-top: 1px solid rgba(255,255,255,0.5); +border-bottom: 1px solid rgba(0,0,0,0.66); +} \ No newline at end of file diff --git a/front/public/themes/wikilerni/css/list-mobile.css b/front/public/themes/wikilerni/css/list-mobile.css new file mode 100644 index 0000000..7a29e0e --- /dev/null +++ b/front/public/themes/wikilerni/css/list-mobile.css @@ -0,0 +1,176 @@ +#prompt +{ +width: 80%; +margin: auto; +border-radius: 5px; +box-shadow: 0px 0px 5px black; +margin-top: -1.5em; +padding-top: 1.5em; +background-color: #FF8800; +border-bottom: 1px solid rgba(0, 0, 0, 0.75); +} + +#prompt h1 +{ +text-align: center; +width: 105%; +background-color: #FF8800; +margin-left: -2.5%; +box-shadow: 0px 0px 5px black; +border-radius: 5px; +border-top: 1px solid rgba(255,255,255,0.5); +border-bottom: 1px solid rgba(0,0,0,0.75); +padding-top: 0.25em; +padding-bottom: 0.25em; +} + +#prompt img +{ +width: 50%; +margin: auto; +display: block; +} + +#prompt h2, h3 +{ +text-align: center; +font-size: 1.4em; +} + +#prompt p +{ +text-align: center; +line-height: 1.5em; +font-size: 1.2em; +} + +span.postscriptum +{ +font-style:italic; +font-size:13px; +} + +#explanations img +{ +width:inherit; +margin: 0; +} + +#zerozozio +{ +margin:1em; +text-align:right; +} +#zerozozio a, span +{ +padding:0 0.3em; +} + + + +/* Sur tablette la troisième colonne vient se placer en dessous de la première ou de la deuxième (la plus courte des deux) */ +#triple-column +{ +width: 90%; +margin: auto; +margin-top: 1em; +} +.column-1, .column-3, .column-2 +{ +width: 48%; +float: left; +margin-left:1.5%; +} + +.quiz +{ +width: 100%; +margin-bottom: 1em; +background-color: #FF8800; +border-radius: 5px; +border-top: 1px solid rgba(255,255,255,0.66); +border-bottom: 1px solid rgba(0,0,0,0.66); +box-shadow: 0px 0px 5px black; +} +.quiz h3 +{ +text-align: center; +margin: 1em; +} +.quiz p +{ +margin: 2em; +text-align: justify; +} +.quiz p:last-child +{ +text-align: center; +} +.quiz-image-wrapper +{ +width: 95%; +background-size: cover; +border-radius: 5px; +border-top: 1px solid rgba(0,0,0,0.66); +border-bottom: 1px solid rgba(255,255,255,0.66); +box-shadow: inset 0px 5px 5px rgba(0,0,0,0.33); +background-repeat: no-repeat; +margin: auto; +} +.quiz-image-wrapper img +{ +opacity: 0; +width: 100%; +} + +h3 +{ +clear:both; +} +nav#pagination, nav#tagsList +{ +clear:both; +display:flex; +flex-wrap: wrap; +margin:0.5em; +} +nav#pagination div +{ +flex: 0 0 50%; +text-align:center; +} +nav#tagsList div +{ +flex: 0 0 33%; +margin: 1em; +text-align:center; +} + +@media screen and (max-width: 520px) +{ + /* Sur mobile, les colonnes se placent les unes sous les autres */ + #triple-column + { + display: block; + width: 80%; + margin: auto; + margin-top: 1em; + } + .column-1, .column-2, .column-3 + { + width: 98%; + float: left; + margin-right: 1%; + } + + nav#pagination div, nav#tagsList div + { + flex: 0 0 90%; + margin: 1em; + } + + #prompt a.button + { + font-size:11px; + } +} diff --git a/front/public/themes/wikilerni/css/list.css b/front/public/themes/wikilerni/css/list.css new file mode 100644 index 0000000..be26aa5 --- /dev/null +++ b/front/public/themes/wikilerni/css/list.css @@ -0,0 +1,152 @@ +#prompt +{ +width: 50%; +margin: auto; +border-radius: 5px; +box-shadow: 0px 0px 5px black; +text-align: center; +margin-top: -1.5em; +padding-top: 1.5em; +background-color: #FF8800; +border-bottom: 1px solid rgba(0, 0, 0, 0.75); +} + +#prompt h1 +{ +text-align: center; +width: 105%; +background-color: #FF8800; +margin-left: -2.5%; +box-shadow: 0px 0px 5px black; +border-radius: 5px; +border-top: 1px solid rgba(255,255,255,0.5); +border-bottom: 1px solid rgba(0,0,0,0.75); +padding-top: 0.25em; +padding-bottom: 0.25em; +} + +#prompt img +{ +width: 33%; +margin: auto; +display: block; +} + +#prompt h3 +{ +text-align: center; +font-size: 1.4em; +} + +#prompt p +{ +text-align: center; +line-height: 1.5em; +font-size: 1.2em; +} + +span.postscriptum +{ +font-style:italic; +font-size:13px; +} + +#explanations img +{ +width:inherit; +} + +#zerozozio +{ +margin:1em; +text-align:right; +} +#zerozozio a, span +{ +padding:0 0.3em; +} + + +/* Les colonnes de l'enfer ! */ +#triple-column +{ +width: 95%; +margin: auto; +margin-top: 1em; +} +.column-1, +.column-2, +.column-3 +{ +float: left; +width: 32%; +margin-bottom: 1em; +} +.column-1, .column-2 +{ +margin-right: 1.33%; +} +.quiz +{ +width: 100%; +margin-bottom:1em; +background-color: #FF8800; +border-radius: 5px; +border-top: 1px solid rgba(255,255,255,0.66); +border-bottom: 1px solid rgba(0,0,0,0.66); +box-shadow: 0px 0px 5px black; +} +.quiz h3 +{ +text-align: center; +margin:1em; +} +.quiz p +{ +margin: 2em; +text-align: left; +} +.quiz p:last-child +{ +text-align: center; +} +.quiz-image-wrapper +{ +width: 95%; +background-size: cover; +background-repeat: no-repeat; +border-radius: 5px; +border-top: 1px solid rgba(0,0,0,0.66); +border-bottom: 1px solid rgba(255,255,255,0.66); +box-shadow: inset 0px 5px 5px rgba(0,0,0,0.33); +margin: auto; +} +.quiz-image-wrapper img +{ +opacity: 0; +width: 100%; +} + +/* pagination + liste de tags */ +h3 +{ +clear:both; +} +nav#pagination, nav#tagsList +{ +clear:both; +display:flex; +flex-wrap: wrap; +margin:0.5em; +} +nav#pagination div +{ +flex: 0 0 50%; +text-align:center; +} +nav#tagsList div +{ +flex: 0 0 15%; +margin: 1em; +text-align:center; +} \ No newline at end of file diff --git a/front/public/themes/wikilerni/css/login-mobile.css b/front/public/themes/wikilerni/css/login-mobile.css new file mode 100644 index 0000000..76a5203 --- /dev/null +++ b/front/public/themes/wikilerni/css/login-mobile.css @@ -0,0 +1,87 @@ +#prompt, #login + {background-color: #FF8800; + width: 75%; + margin: auto; + text-align: center; + border-radius: 5px; + margin-top: -1em; + padding-top:1.5em; + border-bottom: 1px solid rgba(0,0,0,0.8); + box-shadow: 0px 0px 5px rgba(0,0,0,0.75);} + +#prompt img + {width: 33%;} + +#prompt p, #login h1 + {background-color: #FF8800; + box-shadow: 0px 0px 5px rgba(0,0,0,0.75); + width: 102%; + margin-left:-1%; + border-radius: 5px; + padding-top: 1em; + padding-bottom: 1em; + letter-spacing: 0.5em; + border-top: 1px solid rgba(255,255,255,0.5); + border-bottom: 1px solid rgba(0,0,0,0.66);} + +#login + {margin-top: 1em; + padding-top:0em; + margin-bottom: -2.2em; + padding-bottom: 2.5em; + border-top: 1px solid rgba(255,255,255,0.5);} + +#login h1 { font-size:0.9em; } + + +#login fieldset + {width: 80%; + margin: auto; + text-align: left;} + +#login label +{ + margin-right: 1%; + text-align: right; + display:inline-block; +} +ul.checkbox_li +{ +width:100%; +padding-left:1em; +} +li.checkbox_li +{ +width:100%; +} +#login label.check +{ +text-align:left; +display:inline-block; +margin-left: 1%; +} + +#login ul + {list-style-type: none; + text-align: left;} + + +#login .framed .engraved + {text-align: justify; + margin: 1em;} + +#login .error, #login .success, #login .info + {margin: 1em; + width: auto; + border-radius: 5px;} + +@media screen and (max-width: 659px) +{ + #login fieldset + {width: 90%; + text-align: right;} + + #login label + {width: auto; + float: left;} +} \ No newline at end of file diff --git a/front/public/themes/wikilerni/css/login.css b/front/public/themes/wikilerni/css/login.css new file mode 100644 index 0000000..bb9fdba --- /dev/null +++ b/front/public/themes/wikilerni/css/login.css @@ -0,0 +1,71 @@ +#prompt, #login + {background-color: #FF8800; + width: 50%; + margin: auto; + text-align: center; + border-radius: 5px; + margin-top: -1em; + padding-top:1.5em; + border-bottom: 1px solid rgba(0,0,0,0.8); + box-shadow: 0px 0px 5px rgba(0,0,0,0.75);} + +#prompt img + {width: 33%;} + +#prompt p, #login h1 + {background-color: #FF8800; + box-shadow: 0px 0px 5px rgba(0,0,0,0.75); + width: 102%; + margin-left:-1%; + border-radius: 5px; + padding-top: 1em; + padding-bottom: 1em; + letter-spacing: 0.5em; + border-top: 1px solid rgba(255,255,255,0.5); + border-bottom: 1px solid rgba(0,0,0,0.66);} + +#login + {margin-top: 1em; + padding-top:0em; + margin-bottom: -2.2em; + padding-bottom: 2.5em; + border-top: 1px solid rgba(255,255,255,0.5);} + +#login fieldset + {width: 80%; + margin: auto; + text-align: left;} + +#login label + {width: 49%; + margin-right: 1%; + text-align: right; + display:inline-block;} + +ul.checkbox_li +{ +width:100%; +text-align:left; +} +#login label.check +{ +text-align:left; +display:inline; +margin-left: 1%; +} + +#login ul + {list-style-type: none; + text-align: left;} + +#signup h2 + {margin-bottom: 0px;} + +#login .framed .engraved + {text-align: justify; + margin: 1em;} + +#login #ERROR, #login .error, #login .success, #login .info + {margin: 1em; + width: auto; + border-radius: 5px;} diff --git a/front/public/themes/wikilerni/css/menu-mobile.css b/front/public/themes/wikilerni/css/menu-mobile.css new file mode 100644 index 0000000..b2f650e --- /dev/null +++ b/front/public/themes/wikilerni/css/menu-mobile.css @@ -0,0 +1,30 @@ +#menu + {list-style-type: none; + width: 100%; + padding: 0px; + box-shadow: 0px 0px 5px black; + text-align: center; + transform: rotate(-0.5deg); + background-color: #FF8800;} + +#menu li + {display: inline-block; + margin: 0.5em; + font-size: 0.9em; + margin-left: 0.5em; + margin-right: 0.5em;} + +#menu a +{ +text-decoration: none; +} + +@media screen and (max-width: 520px) { + #menu + {font-size: 0.8em;} + + #menu li + {margin-left: 0.33em; + margin-right: 0.33em;} +} + diff --git a/front/public/themes/wikilerni/css/menu.css b/front/public/themes/wikilerni/css/menu.css new file mode 100644 index 0000000..4b5e482 --- /dev/null +++ b/front/public/themes/wikilerni/css/menu.css @@ -0,0 +1,18 @@ +#menu + {list-style-type: none; + width: 100%; + box-shadow: 0px 0px 5px black; + text-align: center; + transform: rotate(-0.5deg); + background-color: #FF8800;} + +#menu li + {display: inline-block; + margin: 0.5em; + margin-left: 1.5em; + margin-right: 1.5em;} + +#menu a +{ +text-decoration: none; +} diff --git a/front/public/themes/wikilerni/css/pages-mobile.css b/front/public/themes/wikilerni/css/pages-mobile.css new file mode 100644 index 0000000..d70d4fe --- /dev/null +++ b/front/public/themes/wikilerni/css/pages-mobile.css @@ -0,0 +1,89 @@ +#prompt, #page + {background-color: #FF8800; + width: 75%; + margin: auto; + text-align: center; + border-radius: 5px; + margin-top: -1em; + padding-top:1.5em; + border-bottom: 1px solid rgba(0,0,0,0.8); + box-shadow: 0px 0px 5px rgba(0,0,0,0.75);} + +#prompt img + {width: 33%;} + +#prompt p, #page h1 + {background-color: #FF8800; + box-shadow: 0px 0px 5px rgba(0,0,0,0.75); + width: 102%; + margin-left:-1%; + border-radius: 5px; + padding-top: 1em; + padding-bottom: 1em; + letter-spacing: 0.5em; + border-top: 1px solid rgba(255,255,255,0.5); + border-bottom: 1px solid rgba(0,0,0,0.66);} + +#page + {margin-top: 1em; + padding-top:0em; + margin-bottom: -2.2em; + padding-bottom: 2.5em; + border-top: 1px solid rgba(255,255,255,0.5);} + +#page h1 { font-size:0.9em; } + + +#page fieldset + {width: 80%; + margin: auto; + text-align: left;} + +#page label + {width: 49%; + margin-right: 1%; + text-align: right; + display:inline-block;} + +#page ul + {list-style-type: none; + text-align: left;} + +#signup h2 + {margin-bottom: 0px;} + +#page .framed .engraved + {text-align: left; + margin: 1em;} + +#page img { max-width:90% } +#page figure { margin : 1em 0 } + +#page #ERROR, #page .error, #page .success, #page .info + {margin: 1em; + width: auto; + border-radius: 5px;} + +#page p, li +{ +text-align: left; +line-height: 1.5em; +font-size: 1em; +} + +@media screen and (max-width: 659px) +{ + #page fieldset + {width: 90%; + text-align: right;} + + #page label + {width: auto; + float: left;} + + #page a.button + { + font-size:12px; + } + +} \ No newline at end of file diff --git a/front/public/themes/wikilerni/css/pages.css b/front/public/themes/wikilerni/css/pages.css new file mode 100644 index 0000000..8534e65 --- /dev/null +++ b/front/public/themes/wikilerni/css/pages.css @@ -0,0 +1,62 @@ +#prompt, #page + {background-color: #FF8800; + width: 50%; + margin: auto; + text-align: center; + border-radius: 5px; + margin-top: -1em; + padding-top:1.5em; + border-bottom: 1px solid rgba(0,0,0,0.8); + box-shadow: 0px 0px 5px rgba(0,0,0,0.75);} + +#prompt img + {width: 33%;} + +#prompt p, #page h1 + {background-color: #FF8800; + box-shadow: 0px 0px 5px rgba(0,0,0,0.75); + width: 102%; + margin-left:-1%; + border-radius: 5px; + padding-top: 1em; + padding-bottom: 1em; + letter-spacing: 0.5em; + border-top: 1px solid rgba(255,255,255,0.5); + border-bottom: 1px solid rgba(0,0,0,0.66);} + +#page + {margin-top: 1em; + padding-top:0em; + margin-bottom: -2.2em; + padding-bottom: 2.5em; + border-top: 1px solid rgba(255,255,255,0.5);} + +#page fieldset + {width: 80%; + margin: auto; + text-align: left;} + +#page label + {width: 49%; + margin-right: 1%; + text-align: right; + display:inline-block;} + +#page ul + {list-style-type: none; + text-align: left;} + +#page p, li +{ +text-align: left; +line-height: 1.5em; +font-size: 1em; +} + +#page img { max-width:90% } +#page figure { margin : 1em 0 } + +#page #ERROR, #page .error, #page .success, #page .info + {margin: 1em; + width: auto; + border-radius: 5px;} diff --git a/front/public/themes/wikilerni/css/quiz-mobile.css b/front/public/themes/wikilerni/css/quiz-mobile.css new file mode 100644 index 0000000..b50d089 --- /dev/null +++ b/front/public/themes/wikilerni/css/quiz-mobile.css @@ -0,0 +1,180 @@ +.checkbox_list {font-family: sans;} + +#content-picture + {display: none;} + +#content-picture div + {width: 100%; + background-size: cover; + border-radius: 5px 5px 0px 0px; + border-top: 1px solid rgba(0,0,0,0.5); + box-shadow: inset 0px 3px 5px rgba(0,0,0,0.25);} + +#content-picture p + {text-align: center; + font-family: sans; + background-color: rgba(0, 0, 0, 0.25); + padding: 5px; + border-radius: 0px 0px 5px 5px; + border-top: 1px solid rgba(0,0,0,0.5); + box-shadow: inset 0px 3px 5px rgba(0,0,0,0.33); + border-bottom: 1px solid rgba(255,255,255,0.5); + margin-top: 0px; + margin-bottom: 0px;} + +#content-side + {float: right; + margin-top: -0.25em; + width: 95%; + margin-bottom: 100px;} + +#content-title h1 + {background-color: #FF8800; + padding: 10px; + margin: 0px; + transform: rotate(-0.33deg); + border-radius: 5px 0px 0px 5px; + border-bottom: 1px solid rgba(0,0,0,0.75); + border-left: 1px solid rgba(0,0,0,0.33); + box-shadow: 0px 0px 10px black; + border-top: 1px solid rgba(255,255,255,0.5); + position: relative; + z-index: 2;} + +#content-title-corner + {width: 43px; + height:43px; + display:block; + margin-left:-10px; + display :none; + background-image: url('../img/corner.png'); + position: relative; + z-index: -1;} + +#author-date + {font-size:0.75em; + color: rgba(0,0,0,0.80); + text-shadow: 0px 1px 0px rgba(255,255,255,0.75);} + +#required-time-icon + {margin-bottom:-3px; + margin-right: 5px;} + +#content + {width: calc(100% - 53px); /* 10 + 10 + 33 */ + border-left: 1px solid rgba(0,0,0,0.33); + border-bottom: 1px solid rgba(0,0,0,0.75); + background-color: #FF8800; + margin-top: -5px; + float: right; + font-size: 1.3em; + border-radius: 0px 0px 0px 5px; + box-shadow: 0px 0px 10px black; + text-align: left; + padding-left: 10px; + padding-right: 10px; +} + +#content i + {font-size: 0.75em;} + +#content-top-decoration + {width: calc(100% - 33px); /* 10 + 10 + 33 */ + border-top: 1px solid rgba(255,255,255,0.33); + border-radius: 5px 0px 0px 0px; + box-shadow: 0px 0px 10px black; + height: 2em; + padding-left: 10px; + padding-top:0.5em; + margin-bottom: -5px; + margin-left: 33px; + background-color: #FF8800;} + +#tags + {background-color: #FF8800; + transform: rotate(-0.5deg); + box-shadow: 0px 0px 5px black; + border-top: 1px solid rgba(255,255,255,0.5); + border-bottom: 1px solid rgba(0,0,0,0.8);} + +#tags ul + {padding-left: 0px; + text-align: center;} + +#tags ul li + {display: inline-block; + margin: 0.5em;} + +#tags ul li a +{ +text-decoration: none; +outline: none; +text-transform: capitalize; +} + +#content-side .error, #content-side .info, #content-side .success +{ + margin: 1em; + width: auto; + border-radius: 5px; +} + +.needJS +{ + display:none; +} + +/* Bouton permettant de demander l'affichage du quiz */ +#showQuestionnaire +{ + display:none; +} + +/* Boutons inscription/connexion suite réponse quiz */ +.subcribeBtns +{ + display:none; +} + +.quizs, .help +{ + display: none; +} + +/* affichage de l'image suivant si la réponse est bonne ou mauvaise */ +li.checkbox_li span +{ +display:none; +} +.isCorrect span.rightResponse, .isNotCorrect span.wrongResponse +{ +display:inline; +} +.isCorrect em +{ +display:inline; +background-color: #00c684; +background-image: url('../img/background-texture.png'); +} +.isNotCorrect em +{ +display:inline; +background-color: red; +background-image: url('../img/background-texture.png'); +} +li.checkbox_li em +{ +margin-left:0.5em; +} + +#links, #show, .subcribeBtns p +{ +margin: 1.3em; +text-align:center; +} +blockquote.help +{ +font-style:italic; +font-size: 0.9em; +margin-left:1em; +} \ No newline at end of file diff --git a/front/public/themes/wikilerni/css/quiz.css b/front/public/themes/wikilerni/css/quiz.css new file mode 100644 index 0000000..740ff5b --- /dev/null +++ b/front/public/themes/wikilerni/css/quiz.css @@ -0,0 +1,209 @@ +div#show +{ +margin-top: 2em; +} + +.checkbox_list {font-family: sans;} + +#content-picture + {width: 34%; + transform: rotate(-0.5deg); + margin-left: -1%; + background-color: #FF8800; + margin-top: 1em; + padding:25px; + float: left; + box-shadow: 0px 0px 10px black; + border-radius: 0px 5px 5px 0px; + border-bottom: 1px solid rgba(0,0,0,0.75); + border-top: 1px solid rgba(255,255,255,0.5);} + +#content-picture div + {width: 100%; + background-size: cover; + border-radius: 5px 5px 0px 0px; + border-top: 1px solid rgba(0,0,0,0.5); + box-shadow: inset 0px 3px 5px rgba(0,0,0,0.25);} + +#content-picture div img + {width: 100%;} + +#content-picture p + {text-align: center; + font-family: sans; + background-color: rgba(0, 0, 0, 0.25); + padding: 5px; + border-radius: 0px 0px 5px 5px; + border-top: 1px solid rgba(0,0,0,0.5); + box-shadow: inset 0px 3px 5px rgba(0,0,0,0.33); + border-bottom: 1px solid rgba(255,255,255,0.5); + margin-top: 0px; + margin-bottom: 0px;} + +#content-side + {float: right; + width: 60%; + margin-top: -0.25em; + margin-bottom: 100px;} + +#content-title h1 + {background-color: #FF8800; + padding: 10px; + margin: 0px; + transform: rotate(-0.33deg); + border-radius: 5px 0px 0px 5px; + border-bottom: 1px solid rgba(0,0,0,0.75); + border-left: 1px solid rgba(0,0,0,0.33); + box-shadow: 0px 0px 10px black; + border-top: 1px solid rgba(255,255,255,0.5); + position: relative; + z-index: 2;} + +#content-title-corner + {width: 43px; + height:43px; + display:block; + margin-left:-10px; + display :none; + position: relative; + z-index: -1;} + +#author-date + {font-size:0.75em; + color: rgba(0,0,0,0.80); + text-shadow: 0px 1px 0px rgba(255,255,255,0.75);} + +#required-time-icon + {margin-bottom:-3px; + margin-right: 5px;} + +#content + {width: calc(100% - 53px); /* 10 + 10 + 33 */ + border-left: 1px solid rgba(0,0,0,0.33); + border-bottom: 1px solid rgba(0,0,0,0.75); + background-color: #FF8800; + margin-top: -5px; + float: right; + font-size: 1.3em; + border-radius: 0px 0px 0px 5px; + box-shadow: 0px 0px 10px black; + text-align: left; + padding-left: 10px; + padding-right: 10px; +} + +#content i + {font-size: 0.75em;} + +#content ul:last-child + {padding: 0.5em; + display: block; + list-style-type: none; + font-size: 0.75em;} + +#content ul:last-child li + {margin: 0.25em;} + +#content ul:last-child li::before + {content: '- ';} + +#content-top-decoration + {width: calc(100% - 33px); /* 10 + 10 + 33 */ + border-top: 1px solid rgba(255,255,255,0.33); + border-radius: 5px 0px 0px 0px; + box-shadow: 0px 0px 10px black; + height: 2em; + padding-left: 10px; + padding-top:0.5em; + margin-bottom: -5px; + margin-left: 33px; + background-color: #FF8800;} + +#tags + {background-color: #FF8800; + transform: rotate(-0.5deg); + box-shadow: 0px 0px 5px black; + border-top: 1px solid rgba(255,255,255,0.5); + border-bottom: 1px solid rgba(0,0,0,0.8);} + +#tags ul + {padding-left: 0px; + text-align: center;} + +#tags ul li + {display: inline-block; + margin: 0.5em;} +#tags ul li a +{ +text-decoration: none; +outline: none; +text-transform: capitalize; +} + +#content-side .error, #content-side .info, #content-side .success +{ + margin: 1em; + width: auto; + border-radius: 5px; +} + +.needJS +{ + display:none; +} + +/* Bouton permettant de demander l'affichage du quiz */ +#showQuestionnaire +{ + display:none; +} + +/* Boutons inscription/connexion suite réponse quiz */ +.subcribeBtns +{ + display:none; +} + +.quizs, .help +{ + display: none; +} + +/* affichage de l'image suivant si la réponse est bonne ou mauvaise */ +li.checkbox_li span +{ +display:none; +} +.isCorrect span.rightResponse, .isNotCorrect span.wrongResponse +{ +display:inline; +} +.isCorrect em +{ +background-color: #00c684; +background-image: url('../img/background-texture.png'); +} +.isNotCorrect em +{ +background-color: red; +background-image: url('../img/background-texture.png'); +} +li.checkbox_li em +{ +margin-left:0.5em; +} + +#links, #show, .subcribeBtns p +{ +margin: 1.3em; +text-align:left; +} +blockquote.help +{ +font-style:italic; +font-size: 0.9em; +} +#links, subcribeBtns p +{ +margin: 1.5em; +} \ No newline at end of file diff --git a/front/public/themes/wikilerni/css/signup-mobile.css b/front/public/themes/wikilerni/css/signup-mobile.css new file mode 100644 index 0000000..58f0449 --- /dev/null +++ b/front/public/themes/wikilerni/css/signup-mobile.css @@ -0,0 +1,84 @@ +#prompt, #signup + {background-color: #FF8800; + width: 75%; + margin: auto; + text-align: center; + border-radius: 5px; + margin-top: -1em; + padding-top:1.5em; + border-bottom: 1px solid rgba(0,0,0,0.8); + box-shadow: 0px 0px 5px rgba(0,0,0,0.75);} + +#prompt img + {width: 33%;} + +#prompt p, #signup h1 + {background-color: #FF8800; + box-shadow: 0px 0px 5px rgba(0,0,0,0.75); + width: 102%; + margin-left:-1%; + border-radius: 5px; + padding-top: 1em; + padding-bottom: 1em; + letter-spacing: 0.5em; + border-top: 1px solid rgba(255,255,255,0.5); + border-bottom: 1px solid rgba(0,0,0,0.66);} + +#signup + {margin-top: 1em; + padding-top:0em; + margin-bottom: -2.2em; + padding-bottom: 2.5em; + border-top: 1px solid rgba(255,255,255,0.5);} + +#signup h1 { font-size:0.9em; } + +#signup ul + {list-style-type: none; + text-align: left;} + +#signup h2 + {margin-bottom: 0px;} + +#signup fieldset + {width: 80%; + margin: auto; + text-align: left;} + +#signup label + {margin-right: 1%; + width: 50%; + text-align: right; + display:inline-block;} + +ul.checkbox_li +{ +width:100%; +padding-left:1em; +} +li.checkbox_li +{ +width:100%; +} +#login label.check +{ +text-align:left; +display:inline-block; +margin-left: 1%; +} + + +#signup .error, #signup .info, #signup .success + {margin: 1em; + width: auto; + border-radius: 5px;} + +@media screen and (max-width: 659px) { + #signup fieldset + {width: 90%; + text-align: right;} + + #signup label + {width: auto; + float: left;} +} \ No newline at end of file diff --git a/front/public/themes/wikilerni/css/signup.css b/front/public/themes/wikilerni/css/signup.css new file mode 100644 index 0000000..b2001f4 --- /dev/null +++ b/front/public/themes/wikilerni/css/signup.css @@ -0,0 +1,69 @@ +#prompt, #signup + {background-color: #FF8800; + width: 50%; + margin: auto; + text-align: center; + border-radius: 5px; + margin-top: -1em; + padding-top:1.5em; + border-bottom: 1px solid rgba(0,0,0,0.8); + box-shadow: 0px 0px 5px rgba(0,0,0,0.75);} + +#prompt img + {width: 33%;} + +#prompt p, #signup h1 + {background-color: #FF8800; + box-shadow: 0px 0px 5px rgba(0,0,0,0.75); + width: 102%; + margin-left:-1%; + border-radius: 5px; + padding-top: 1em; + padding-bottom: 1em; + letter-spacing: 0.5em; + border-top: 1px solid rgba(255,255,255,0.5); + border-bottom: 1px solid rgba(0,0,0,0.66);} + +#signup + {margin-top: 1em; + padding-top:0em; + margin-bottom: -2.2em; + padding-bottom: 2.5em; + border-top: 1px solid rgba(255,255,255,0.5);} + +#signup ul + {list-style-type: none; + text-align: left;} + +#signup h2 + {margin-bottom: 0px;} + +#signup fieldset + {width: 80%; + margin: auto; + text-align: left;} + +#signup label + {width: 49%; + margin-right: 1%; + text-align: right; + display:inline-block;} + +ul.checkbox_li +{ +width:100%; +text-align:left; +} +#signup label.check +{ +text-align:left; +display:inline; +margin-left: 1%; +} + +#signup .error, #signup .info, #signup .success +{ + margin: 1em; + width: auto; + border-radius: 5px; +} diff --git a/front/public/themes/wikilerni/img/background-texture.png b/front/public/themes/wikilerni/img/background-texture.png new file mode 100644 index 0000000000000000000000000000000000000000..f4656edef646dec117edd561099177b44f9041f8 GIT binary patch literal 202055 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 z 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

    vaq+w*5CR3_( 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 Hu0mjfFB#R^ literal 0 HcmV?d00001 diff --git a/front/public/themes/wikilerni/img/twitter.png b/front/public/themes/wikilerni/img/twitter.png new file mode 100755 index 0000000000000000000000000000000000000000..396f9b5c678cbaa8a31f846f441d411acbbbfe3d GIT binary patch literal 2346 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

    vC_7de43;zI2 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 literal 0 HcmV?d00001 diff --git a/front/public/themes/wikilerni/img/wrong-min.png b/front/public/themes/wikilerni/img/wrong-min.png new file mode 100644 index 0000000000000000000000000000000000000000..6ef8eb7bf5fd491cb071076082c627966b57a177 GIT binary patch literal 928 zcmV;R17G}!P)EX>4Tx04R}tkv&MmKp2MKrfNkh9qb_DkfAzR5EXIMDionYs1;guFuC*(nlvOS zE{=k0!NH%!s)LKOt`4q(Aov5~32Q=L_ z)5(OG&8>=|SM(r?2(6;bEMrcRQt%yL_XzO)F3z+3>;4@5YTjZ%KqQ`JhG`RT5KnK~ z2Iqa^C@aY-@j3CBNf#u3)BVfh)c3uQq_0Ptxmc zEp`M%wtmpj1VlOdb3D+Or^g#z$?M&FbJ25y1AHLq{2bDTZ^8R}K)1~@nb zMvIia?(^>6&c6Ly)9T+3FQRgcsP;&y00006VoOIv0RI600RN!9r;`8x010qNS#tmY zE+YT{E+YYWr9XB6000McNlirui}02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00DSOL_t(2&!v+;NCI&b$G`WZYdCI@1P?iG@+S^LB&oQ! zHAss?a=FC?Ee>+K&>*S2WHMjEq%s4r4T)oS&Qh_ty!XD-X#ZuihIj1NhY zt^g>L$(n{?I7GDit)oR@JRa{h{zzK zh~JF)eEvO~&Gv%a_5d6O?Y3!}XO81Urn~;1U-bz`%X6_`aSU7l0000moa z002t>0AP4HKiU7vD$+3m01*FKN5Kwf4I}1nD7TA5P4wBX4Xz_0Dv9rPu+b# zH8twMO08Mh8vf|)e`*1l{=w!Y1BsKhzS~b;=iDD3!G8czfDf?Iw>JLadVlVV=TD07 zlb}v_J6lI503ej>r@U|g0BJiN#Ddz+!T86UeE8$b{Xw1MK@g+c`c$&Hm69?>@XpJ0 z|7`NSfTjeE@ozB7#VTNiX8%gyp>+X%WBlM`|EoqPjb3DA9}L6LFeD9Vq7O0xPMg+) zU~HoNQ8FT6B7(u&0Yqfao3uP!1D{fcVX0}ynYI_|owserZd*QpyqdndJ{%5LCuE&* z_c_2}Z}G2IPc*BCnnl~5e9v;Is3u81?)m|m6Q8J)fT&3ocf=15jujfoH!s>KogQ)Va3=3lt?MpW)IHXU#Uup3xpn9WR&7-ZPZ^pR{8 zgVqUR9J1A>S*G3NeYH<` zQ%(TVRsX8h;Hy=?tks~DJ7}FDOE=t(JMis6O*e>}eeTP?k5>TxKCx$H*DGkwK9grO zT`hvH0dM!blTvYs;PmA*-sHY@XO?SiJd@fG zL52E2TISH2=jJOJh^wVf7rm0k;U0h1H}s?knFRyHT53eeEQ+il(EF^*AU($^AD$)y z{6N~M(63rVgr({$NbPUsgd6%w}ZBsYMKaULwkgkb389*vL8m@lCMa- z2dY|q%2m52kS#IASN z*GE8j2bem$#yWd9ohE$_8hBJ9&C7d;H%YG9BlcOM3;Ui;7k62$h#^DZ>iYUf(cuyH zQU!|{Gi6PnI}vnZ!Z4C|0j;p)Lr3-N{m_}ns{7`K{uATMpYK_f53WTI~EOYtEsG>gnzLE9|Ds6C65tBkCwfzD;MHo01C|2_zvuR zx(>#sgy3WSbr?9&&>Xzsb;%+mYjOT3hXe58L~Q3gk<4?2#Gg?u%h6bvwFoz-qpmB~ zHR>jCsVu9H$|rwl_m_FYy4gvN5G3yk6y94Oxe2vpC1w=o?;005sg|b2s~!~2@)z4k zl>d#TqRg9iE~fsz`8c%h>C~jg){4?eFaNDlp(}e(p);)7MO>NXTWWG*b{^l7 z#37qfZ9LD=8y<>BaX#nSSvy%yUlF`tS0xhcDQlF5fgS#Q6$L+be7tZt^*BtIr+&Xk zow!pVJ@fmjQv87WflR_SzfcHS!FQO9n;RegU&(rsis;KXmCNuP0x%i%2Da zXvsjhlr&sY5;Z273cgC|Q@yIRL1oUQD}NGPI7K>~GUNLR$MpMTTvf%-VI1d?UY&Hp zC~5m!($ZSm)@bOOjOsb6mI>vK&3Mz~q3Y{KFrGb;!f-9!-X&Qn`jL{&q&9+4nazZf zSLFBTM`W-t5*2CRz?)Vt$1;^8i(MR1t4)k&S`AN8cxvQnRF=#E z&#gQYnM3@FGr=u@+q$8iiG#k1o}RIu{<%T8o}S)q@NA?#U*$k=@8Hx}|KQ*t06Y>_ ztaoN-CW+sVfA8DJBY<~|mYAdwB|3BRN}wDT8) zvuB<)h#GiaqW~wRKz^95X(KT*>{D8`sAyN3?sD6XSC(x~*UC145y&XCVUR*Y z2B=9O#JYXljvEBG|4ES%{M5ba-@14NJ+L7?7;0(+<)S`S^Bx12-_N@Y#H>HW%upBp zSWU)+)YJjK0(pi!ngk0*Bi}||M+vbg-%05gs^~#MNJ816_SjZgrjmL&5zAIm2j`YZ z%hHu2#HQr6^-H&oq#L~}A6I&5PPLQsO_P?9D_4ju z>}zdTCC=Z`uCb<^dhoN&vY#-|YP8c&5zXcXnBC8>^*yIgOAp7YIz6p#Ln|RHHI~9BHWZ* zyR_RmYgNAy!Vy;e)+Y7Yp7m%SFwAFwirs<@9MQUu@??+Byu7;ilKctMIQFcf_uDG> zHCz_iID|W}a_Z5$^<0zp9X*Fpwfd8!?0zq-3lpX^u<^{>z9_j+ld`8vNIm5hd@t81DfO84;rC zGg!(67<0s+s)a4Jf;3@-uVMKA!6??kjDEw2A|2n^IpC`7e^U!!)CzT|9O$tJM%Syl z=FUm88li4JLHIS|hf~d-T+?b4IdhQ6{~fjf7agCiKWm!Eq(&-@twlw{yefY#TVAvL&(Rc%I{ukS z4Og}8L~(8>cV+~LK{vDk&ILgkZ&qDk2|NqHE~A0-(1wBekcMGw7t}bo8{bL^swyFh zEhRRBfkXM!!!V>7lWH-$b3q699IIn9yYo^5`(EDBFK5FaZRANpIiz)G$S?zm>6Ou! zJ^u!d%Bh5@MX7BI%2~;D`qJIEi*+Uv@Q;TTb27<>HE~HLCtKw%w@-gQ1ooZXhGkW~ zeQNhsZUtyr0-vc>>|JP*;V!X{aJ~fYJ#!uJAyqdzfgeAH7yHq^obA-G zVIcPgnRCdGoeg1Fi{u}n4%$hmV6eq6H`3vp9#5F4yFWcxO#Gc_O!CY_udi$o2t%;; z%*W5KTABw99Qvi(dE+b=`+uL?+Nh_^XDn=c8C(aOPRg1xA>A1k?+Fh3ttxWl1jA_{ zuVS8Yhbz?N?lzZoPpzKT!`xR(F6er1XX zhoy}j4~4Zz)rj&Q3QY5E__b!l)UhfaK&EiDsq6OO-#mAnl7Y-J*QSU zKPo%Zp!!$6xx1w>G`Cgu1T)VOa6WPk6!32yJRnAl4NJ+oV+tHU#fIUv@R2{DT%X+5 zZX4zE<*YNao#V^(lBra~=>x7@Wou_}r^#F9-M>$J9t2!@K<4ROXI|swW*gDg@=Nus zW8bUlOGn96=48Tj(S#`AMhx|)@iV|y`~^Ev_m>H_r{a}q4gZ@-4_Cm8u}d z(fp?ESoDWi(7aCrl+wfp-x>)Npj(#4f|?s@V^fn&Ri-;Hyq!N~b~qysTr#_F)CXXl zu}9y$9i`;XN}@M`igTFSw}OYcRPA}39=YTWb1?3wQJ$H>z@K8=JZ0YA@88p$=e+0# zcg|llPNELsPG~Hht8al&Y1>IE{!AED$s)-{!#cmkJl0DaChU+6ELM zmh)J7+jHfgJWP*A!dgR1c@bVLN2nn-_QV#ceF-bcZ+J!1cgCkcLFZ5D1^tzWB_zCb zOQ51O2U^LsD6()lScQKWC7Bk1r)WT!M>4B0jR?T?YfU2d={X}I8??$gn}$B5?Fvx( zhWrk`fwxI7Ch#nKqflMIo2_DaHu+J8^1%;Bb!b9P3|7{>3ZLCm@|fLl=W_& z`aG|%k-KqrD)`9#XnN*T+#``w@Qwau`-p#va2j*k10BDM;xCZt>2<;x zSc-`J=}+kd<`Q#ZAyU1-wlE$^#G#FY z?B<~i2zq&gxH|SE~!ywq={EhCocm2)C><;m3@uwo$O{# zV2A_%gJ3kUWPp$OsG6Se9e-yT=uF=^Wv!35C!VS8Y~%^pS6j|k!{Nflz&2&w$(#S+ zxP4btV(mcrnPqk|bsaa)TWoqIIFU{A~MHQRn;>|&n3iFd%LnpWSqyN%| zSsd!|ayB~6R;`QNI`x)n^|i9f8)bvrn*oLvP5IjhJgODlx#K2>$*OikXrqzu zNBBy+@_z*eb>6*Kcxc@uZ7a4*7jC&yf>Ui-M=9$6Ce}B6{L!6Y@qz~4ecm&M_TLkR zh`5VdOi;I7y-n+0u|DTHyL)u#H6O&@FvUtHZpYtC_K5n*zt}I-wDs6>3~ro4@__VR zzj7*F`*Z4X(5KF6`(e&?Rf-w=Yr4NwZ^hE!F1%iIHF4;McLiEIG^!}m8M(9uzwH#u z^u|A54C|y||1mCUk%4?yBpD!O^GO8xC{u;^(;6;GM1CpP5=qM+?`bGc*tkk9OsHty zE4#~hj_c^)f}0I1y|y;Jy$yG)Q6;(ueX(}oD3;u^w7uOtj6cHHUQj&a4Sh0JKcTTw z8lb8sVm*Rq^krPQz?9*9BKsXeA}R07f z1X+`OON zFEuq)9OZbggjs!^ZH+)c#DLrdBn`OrV5`J}wpBGQhznzHo#e6-L9^P2i6Lu~BqmQV zqJq|&okX35xwTV-y$B<7hsot~UP5hv?ibsX`P?Fng3Kp@o)D^EEBpxiJzr4SHfTcpf>A|7>P~A8Rv#9BCH3JM zL5fe>HD@=wv9-3>n81FOQYRSp%Sn$YCq##^RZ*iK9v9}Y&d~idPoyIm-^`$aFN{p zm5L`VzVEVl)-$+S72gxRTJY|d>~2OyKk4%})?Z_~Duhi7#^wC7&QX6xt<=CW|SJmIT;j1?-FD(y8X1 z;3bYQ6w4+mLdhzVEV%;>Yq*P!=VW@gr=n5YuG4EoJ)+BlgG{1&LA%ij`dGORzLd}b zeO`%6ms0>?bHRIt$M{Szp=2IrJeZ~tJk#l-w5xxxze=z23lVmL@e-H|2o86@x<^K06abt zP&%O}5n}uNyV;%aREfJ4{kw1`Bdpae7AjD3g)oSp+12Cxeb|YqtB9vXz5J~)tcxn6lfaTDwQT0pbmJpclJg> z#y#*X6w2ADuYT{C5>3$fOTpa{$EJuUUhrM7g-raN0EaL3U@rz&^hoSoX5#{=MlmB) zzM!u{-b<*n2jZK6V;QMmc_LMEi5(ba`1nZkXSuwt&zMa;4Gp?p$5vGbp`yxz>7}LF z#JIDsKH)c^LoS15wqMN^`0r{~k{;}F6Qsclng;kEv&!>QFyIpQm?7cUDC{`GeE<@I z#F>MHTuFNd$k4=>BB0dAm2TQ4l|4b9XZq>YcUk;mK^##m<|>p!L<|a?Uw6Ozj$rnj zeoi*v>m%fm3>%7!h!1tdB{mSK5Pas+ufsnd^Acvkr&$a6j~ zEyAPUC1{&=cP$^O&0LLkhC|X{2t#p^y96;qKy$gD$f`^uadS8RF#}`%AIl{m(?wc|k8^9$4l{Z%S;1})recKLJ*{NG zfJHzMHGVoM-`a~Bp|q@ZP%TO5FG`S99Qe@kD>!J4 z8O02O#D7;TB}_Wr>Se&!ZZy%apHZU@e{2*mW2EV)#z`9{DR`%9x(M{CM4b@-> zvZZVYypLEg#xa+N@Acy2@lqf===%vTEknL{%q@GLk+!&QXM4Xpf6s}h6;^gI$D{i| zQxc?qicl@f7?xrH$&Z`LY9VKsHp&-af4_Se6x8>yo*wJ}-L(GBmT{bmenLQQu-f<6 zNkT+iwPZimYEUu{YucNjtZ`QAkj)|#I&v!4M;?D9uSB=Z)_9@!J{q#QA%WE_S`026 zg)q*nw-~hk4JodVoD9_Uwt|+wdmKZYH1+&S8Vq$<)`9i@d~t58<@s^5{o`~|d0I~6 zOe?%l5+wZ`I8wBq$d1vJR+%CmI#2*e=a*l@%Sh9fpC zxJa<*r}rx~-+OfyXMbE4Q;Yul>8Tn4Ju8QWbw&8EL5PLstGVolthe*hdN`+U1!6XEPLC(-iR$L9$S*uExz!M)>(8~R%Pc8A&jDw zggNDNu|^yNc{IIP5zOWjPeRz@PNJ|6|NJhz#Y`H@h;0CO2Yt7)HsrQtSs`v*exNep z<|RUiMKIv*Z@@QlXXi%c?Hw)(xuleafWwpqJ_p?-B6NYMq^nK5xCLRbnxlZ>&_umG zNG0?^yLJ0jM2^iC)C}$@{SZVOr=wQ!l$gV{px3za^11e!orfr9Gs4^GnVVz3^|-3r z`Vm}QceO&crdB)_Gxjhm$9Y!!jQzei^!^CqkfxL;>qHzm#bw286MGVsG5U}kHv()3 zai3{b+3E3Dh*hQ0y>fITnTwZ1lkKptry`ll7QkXN=6FTpX3%ixJ~2wne2y9Hp@SBK zNIcWi>t)I9gCOgf?6Ga-g|7Jk*S#u>HZk+A?;PP*>zm0Ct_UpVfQ@m;Gf4mx&?z20 zq>!?5@$~nL=P(76yu(kImj2)7VVdPkg$>NYCuNtf0sf@3@QFI7czK~ShmjsPg*||? z(G~>c;)MacSq>Dw`84ILcf=!6>T2`PuCe*eo6P!`#Qog`xcqlcp`XP|}yjHqp zD#*X}N}Ev;O?HXWZW#9CsoH7>nSdQBMr5bfEE^)lwL?3vvcyo>A`HmU(d)BGiCT=s zC6dwNLgPbM-fAK4%MbkKQXoCxzYl(ko(ITpJ9Ki&zb>fkui_N!Kj+~Fx{?$%EWySlr@He9~5tXszswjpv^ zXpLQWEfJ59cF;-V0U~49gm?yF?1F9bVYrxm`@dlqUFDj|Sg9hnN4XN;6#9$IHkUmp z-7C7V;rJHpUftLXVHcCisE^Rrqy%cdAR_Ot>yN6Sb=aRr5+@we_wp{6J87Qupx;KxFOstOu)+%c> z66GeZV@N_>faT}h)COvzI)x`Y$hN`6REBe=Z09ORol2=$vN%D?no&&yR%~^G56mq} zXzC73KdtD)W?b1uR%nDL?g`SOrf>l$rmkQ1^Hdi|AQ6lxsfnZkksVOvE5?DP2D@}9 z7c9ZFwOFNRn3vUt<`oMRp-o7s*bu$!8;mXNq+p$H%=dsTzPf<1UEnIL*TwUb#L)B%5(VCgh4@p8FTv#aJ`HcjwWmG z@Cx_1ogE8!LO+2Rak+kM)8a{)IhkLP_p*8)b%)0u0tuuP(RbfmG29fhYZ%3UVQjZ# zON51KOe%BItBAXFb%N|mwg&EaU)m7DH-hXlK_@nM6IvS&S9L^mP4&yLzv%rUz!0H&vWAPDmEHDy4uj`0 zkNVQE-i~wY33x?ZFpfBItp7@RMS6`7?U~g6GL^bA-D0#E%aSnY;PDg%-y?P`Rw~-l z+kNkGeywN$W}*(m0&}q}k`0l#(Al$`?h!yKj~i4l3p(9xN58R_A3B~*49wisbHvcc zUyBVxZln+Gs-vHap^+dXn&u z>qZXb`Kcsfp#!<;eZi6)fIre!7k=wQf^!zX$>PestNdqscibLm_lA6Eo*lBvU&7Dr zDu8MY9*($~)VH`ggdiAeNA?phhK^^~e%FfjaKXy@nJM)icgBGFoSnHr1xAQYr}7W& zvI`H3V`=d)?J{k4Yrvggnk6x;iFfW@!J(q(sJ0j*lTIJ){^B5K`OcYR1A@dl>6|z8 z+{5qi8qasA7e1;JutL*6&9;U{g4V1PlB`Bxu=9>%Qb$yoX4BS!=Sx{Q80(Dm={V9R zEV}(b)D1BO5_7vLBjm9MlG^#AY#sp5O>r{LpZNflcR=|}6=7Ph{? z!CRWA>!GyKQfKkF-K@%_)Fehm#q@LWM^^aoML)tS_L(f}8LbxmNG?yz(4)RWhIH}|RbWv%#9e(`9$DHtfcyt$4P z*j7KNtO#H-NU$aVqZjVczGE7Ih=W3D!dj8_J6-d0*7>+@67P~>8%q%(wb-IfAE<_W zS*5@xg`&K+`*X?Ka%iGFA+l6!g>4{N-CSJ$ySDblZKjMN&+#iNNSLZK->8y#A3PA) zOkd!n>$=G%YMF(yH{03NWI}N8{7hd8I~R zXQkPeDfV%NJ|^4A>)%e7N)AW z>jwD>i-1DnXL;v)Y!9sLhYpTu0IE4x;748&Ud7DAuyD1hn#l>^64Ryg95Q%>rfv~@ zyJQ#4*zOaeRR7jISn=g<+!B560hC&>ZjCrCv;RGjvbySv!e?9ok3pBr!j^Lv)O375 zMjtROE;rEUa!6ZXZ)a4ZtI#I+KE^*2<*GIOxD? zCG`gFW1wR!2Eo@O8`hw)ngo%8Xy!q_ui&v&&FQdZDjtCF1i$V8m7X5Zy5F>_Qhe=S z8FchCv#R~qZfCBe`w`jHF;|i^?@p!F*8w2Mv;|{h^=>e$JZsfCkZ9FYudvroOL=7R zvKffC9lJ-VJR6c;b~0{Sc9G8+NgH`Nq@AUjZE-T^GvcsmmhY`=&WpPt$+DMT8D)yS zH%3I7XZgbo!;DwQpe-pyBwQ3}iw~9>6{ky0L5Vu3AA5iV6A#EH+{LsSZ2;1w*+>b4 zD@5;z%B-(7uBYBIwA&}<>aYfTK(8LUJ!ViXyXgO!L5t-`@Q zFEz~9J^2I6GWQzF7c#z7cKbd2r!%dRn?2D=+HI^DUaEK^mSCIRUCaSbv{|6zYniMCj&eeK<5dudeUO+ za5QOUYzwDB;8$f;jO&6ZPc3oJa@d*=uo`YbpmsBZ#@A_+>Ww!*$dD{oX=-dVugOq~ zJqIr0_uC6M*;Zz|YG&JqTDWyHAd5`R8Yc#QC-Nx$}F}?b{RRt zGUECk?X#<-=Is+l4k$NRQaRb9N5C3Bx~{IeJ!rm-3uk?<`WlpRw{FN`iG-Ze_0464 zEx+tHkc>nYcHg)fCu{Pd6ZUCCm+M)G3SH<{BD0V@fL;XBT|}w9cARvLY!bZUNH);p z9=+nK8(8%6yxp3g`)omyyr-s|NHJ-7p(q$fo+0E<=4o-Cc&_HWd?A zJ=(KAOC_AT|Iyrm@a^0ig} z!kos1u`h&GL#WrUq6=is?QrY~Dr)%BGV|JFNqZH$N;~sP0i-wPiGw1jQ}J19@nTs* z9I!{?B~lzUx;SSe(;2ifll@1u>vQ^7K$N=AD1Ak0lnS|&!UETcOGfGpVH3_M&e42X z5VbNXxs{(IN*d`6%PSNcs{g!DY3q9wj7FX}T&#B*3}>3FP=Yo~llh8&1!}Wt@HQ&HGdZ{HWJt@=ss(g*W9)bbL1cdUSAE{6HHrDTo%+l+P~6aGBK}`;_Vjbb zPZ%sNm<`l!GRowbG0xO}TG9eF4(Xzj0{70`|J)|mEyNp;GCuPR07eM-8Pv-OT6zA7 zHes8*lY`0Exj$%;6Egt(PoE)A_?_^pWR~8^;xTpxhP3MWnzP8 zeDZAb*k@7Cpr4~cfBL6ug&(i{c@(!awoH#QQw!6D6if0nyo!=FdGc=RmwKiT4P&)% zAO3o3cgtwqFMsRn-!X<@9o;i(@?Pe|LE%ol)AZA&c&=ax(6J1o-mk5lFScp zYyB7pk4^$eusa;_)Hp2LaH5=ZZi?q_`dz;eq_VgM{0gKmKoTm{-npe)x6*BPT`b?R zGZq`vzhF;*<_A{(!On~N!NbLBj$Y4O@5up{uL#uEX!`*~8Z+60`Y4$ws_AXP$0EpILZCKW$^|H-1(NYX(#(%rZ#yaIs4V6RI= z|9BMBfYfQx;qqAj>*=UoJ1-jiJC`=@WVx9yeC<@nl(|zM$)Q8SajO|6Lr!Dt$=P48 z>mu_-bH?$nkz$E7c}tBJWMdk%h1A`s#rJYrchh1MXXBFThDb&&jy}6HX!o(%tO!lL zZmEPF3W_cz5|l++%y{>BvHC4q8seaMp|@WW-Ef+bf2}+jpX`8a>>eg#;UrhD3CRWt z>Fj8z*rs6-U5l7?Eq>o*IQ^cZ277k%&*-=a$Fj);|1A6Bh}ZNGDh%5&89rD`!$OP_ zWU`d)ww-x2vgJgICY?1rvZh_zbD^@Rgzwy*%nNXIy-GN`hVPi5fXNVdpR!yUlV0vj z$f$HDXH$QWVXbnnI8TU{*TO2!wqZNpw}6H-|0LO;B1VqMFB=k< zEjAj`5yeUe_RXzpv=+z5kqb^M0i3y)qWia(Uaqw72wm&LI^N^FAC}|uJ^wi#z%OgZZZ>yy`oY+e;sW+NuC+VdxB)9M zz@2qYV2M>xAPk?Lt!J`Jm25>+ju&@*_W;?bxs-4b_f=VmxSTS5$fS%`DjJh;Vq z4=sO03=A_F&bf=?{0jCt!V83wYb~c4iWvHp!#E8Ot=7Tlb6`Yq$VA7vk4%el^b0)v zGafJAtp|uK_fYp)QWsO$mCeiZ;N&(!`yK*r_3lP0U2n!ZrtP|~W<-wI>^?cN#Q`}{ z%M;37%WK#y6~cFB|EEwZlw$(y=CCZu>MaTs%SYH~#`{lSlNO6=!}8X$EXn9Eu{<(f zq_(OY$VD}7*XdgnKNfcJZZ&UKW}lY`jUK>hV+{lyjvdgwMeHAc$o#Cb3nR+4%lY^` zmy5j)G58W+Z0J^YKAIxf8F3uTAj_`_^1B}<#-pwfq}=TyF9i$&XgLOm1y z5u!ZNv3&~G+R9&QsxE9J-4M>BpXNfiMz&u$kX#5FM!R5(q#KWn#)S?c!#j>Z1{Oqk zj+j}JVpUnOxI{YjAiDMJp(8U-oeONz3EAAk@N-qGJNqJ8xwcN&tiOXh*Tlx^7vS>M zAg0-t+0`H_rJ%<~=#9q96i9~BZLeXza62}uM3=F!s1&Pat1|KEig>?1k9FZP6ztz2svL z|5e=#P*e{`2y(-Z1uH(Z57J)bGEKzv2RYqIgz+YlfrW8QM;4Wv^xPk*` zHGt<#4POWi)BvroU#=h;b^Io*&<)t!U*U^cvN+W+>7!bxAzYQ)3eot)GTN%D&ntMb zy|rvr@yTdoSq03J>5iOEQyh2^gkX9+`ZnZ=A~tnrT3_rBv zeVrG$F2$pGY4%sAQ*{>E5~+7w%$@J*q*&hUPNMT_lx4d6ux94)s8uS3LzF!1U4G0c zQR08?OI;4Gu7+Wl+njhw+pX!X;2Uwm5JqVCbf#&4kAXDBg@whf`z7?SKTQhIsI#E&vAX*r^yuU5j@hQ3O#Q#r zK2fu&2Wf7E^NI`y=1X;;Wd7XO4v7V%1+<;KjeW%k8t++y2z&u+33gDhfJrpnr{9bX zLo0tK$Q(b7x&dHp=?6P^} z2hEH;*1gWbJ#_MSdk=8gV!Bh?C8yFNKY03I5RIuyckN^(KjI&ETg(Zw&hJ3_EagX7 z751S1vxxY2i-NXgM7)!cI#Zit+L*pJBf7CZ(?XAEeR-1c7Hab0-d6R+Rj77#!V6a4 zu%SnJ{W-w4!)$f3w(Wqu@pde{eKR23t=5Zv*8BiQs`z&oNbQE#wfkX#H;FxmUH${v zyf5f`o>{fhaP&xN@}ZG%Md!mJ!--XQqp;!6I@y08p>JBBV~@_edwI^|w}k2XB3_TbuQA1Lhn2vWFV^yh{*%=Le^DPb%k%mmn}`sOML3=bnN|8 zr9dgozR#h1Y+EZq^$C8E615}hMf|2fj{Y6dJ51*{*)Z@bOVX2K%GVRa{Oqx(o?^xW z(n6}|sR!$c^qNz~Lth~7aFBtaXdp17!d2DuS)CwLT^LQ?Y;xG@WS#_(|6f3yP|!a& zhYU6zkS7 zNYd~py2d^>jFjKv`N~UV$;ZUSMSprVAKnqy8FQyZ%rf+3urrvaZo6@A&cak_bB6HW zv*Ms+JquelnKn<>Sn3q-oFf>6`R?1aCbu(n2xb72U5B?YI^pYn!A-m%2K81W!VXAJ zu@vBPpl+ZxS00e4OvFB|Y6@IBF~>mu0b(=#cJ_ar07lz2V5(H*>1hrf$~1eR-G8^a zS+wlmjzivfh@|P&g7lU$2n zir2^LX0YjGi#@J!k1E5EmI1$HvR{=Stqo1B^*baAI~9?k+N^wmsg#wtca@ysPF)<}Al z_WnkH5Gglsd+`TSrI<@dQ?IGRvCO?cBFXof#SW;^?{Er_i%hG5rmdGMpq=lvt2397 z@qD39q=NAjmLgsR;`LRPfn821O^g#FVj3)WlDkH-3`!{^N2N6;OL#zw2iA4 zi$Up!zglENpqVQBX*E+!dl#%j>~~rA1yuRM0F)w)ifTtYdSar2LLqY$;00P|$^+ZK!$9?rv(zBeu>| z*H?z+99)$n?H0We7ibBS)Oxx49ecM26y%;<;H%Xt=w||C$?^oa+3j@6 zJi^n9PL&`(KVNwl20P#qbbs@5PP(xH0zs{SrIb8)gZt;yv9@46LNQE8v1Y_ot5Z<_ zP%xoWZ=0^0Xb!S-hS6vkK)!L|Q!ALY_Nq1n9|=%eS6UnwzSr``ZKgl&L95WJ5fMqln@A#TYDy|%53q>X>k-Y>sQrc)qmX_*BIYiVD%nK@37{!^u*0pf&l9F{E_Qei!#=5#y{p@5pcoZ;GC2OEs zTr3qiD5m+6NuVim(uJM%&&^jQu|gRWac5Hh=r6}o>A-ZbcrV5dYm`5JNwFQWmdU- zngJ`*)Nb!aO@F)l$`1B8?LZOw*v}KNqhDjx9t^a3@CaM0iYC7k_?MaS#U<<{TYmGb zkAh>+$1m!=24B@^WH0LydxsQ?;-0H>LPTL^t)eB#19bScpooaO@@7HNp?8Dkx8J3s zi$jL2B>MdfFZ~BUMku3g4YYIT;5mkY^DZ8uVru`4{<6U)YB5Brd|6alc73{@!??w9 zK!ZSea5LM=KfH5yxO4khc@ujuTHf!;3sK{71zFCv^<4|O446=R-IxW#$>(i?UqDy{T1KMnPq z8ZTuGW0y>Bqwu9a!4;_baT9Vk4kCIT*`lB(qJdmcNONt?A&+M1vJ108aV^;9rc$*S z2T_ooUKpnr*HGp4m+UFmjv>l)T2KWC#F|=Jv?UYTQioc&Zv26k-!b&k|KwX1rs|dp z*M7$jcnZoQTSE?mSab2KW6xVH=)zN(8k(Z&zvFz~HED(de_iQ$&Y-E-;y)@Nmf1m* z7rF_Z_y{>b82Th4R@f?{ovvoLwQ;}x!NJ0T-4lHsP5gKA@Zoi<|H@2_LqrGT1ATL4 zYWu`w#pTb<5k7N+A(pyo=DsqqX2ckQzc*$kEBlLQvcxjp6Wih`HfN+==hT3VZ?Nnv5+5@r)iy1zbtMcL6m5PM$W|ORY>>?*+=RYJDFWfOG z!IA3KHgIG|AtOng=^;H#t~%iJS+gdqNhI@F7Ay=KrqR&Rye7 zU?>bvn6O8ezKT z&K|3qwck@k`1D3J^56YzCRL=~=FF}I8xDS&yZwL{k@*zr*+N9m_DAJ zk&jFQvoZ?W3^;>0Dy%HMgFpDgCi3!KAp=5tLyc#W^}94 zgT=CfkSg&K=?=R@xOPHm@*XbpJFpr&LbV6tjYc#ogq6Tw#O~70Ek##EOKsy00nM5V z8fG0e{2P9G`!{@V9}(2Sp;=DxYv|gnd2?V(BI@`;!~b$+Ql9!l#$L%JDMS4+KGp~N zht9L0G~O3aQ^jX!ZnWLxfneD>(0$SMzKzDB$0A5_e)k%(N!vwCmY z-9m7q;4ME-C?7vIOm-~EBI9^~o9YVSqOYl@Hz`7W-xJ-N2~z1{S@q16`pl`jde2XV zs&cn6VF&zahSFnk1eC8fFs(MG%Zt*`v|_~yfBj1P-sfS;C} znx%3Iz1x;)>~^?~KUFenm6-dAC;3B)!{-$AvdfPViNNkt?4pB;m!Ykh!9DZlrT|8E z4BSYla=z9(K5n4?aeXyAQ-Xo)b8X5r${I>8-A z*IJcgBSKYws0nEEsxe_GkI4|3k-ZWK$EiaO7ruQGyfG!fSA*Y|E23z-rq*MtQ-?_; zulL+5Y3V`$^1_P&Xn=C%FF)G_*k9$Sn3TN`mo7JQ!|qN<$Z`m-y5u{;DkhK;_f)&o z6`|Z(Wg`sld^bwAP*X>3JVZ*y{k2@is(%t*U_I&?biju;A(en87v!=z3@z$q+Vjo> zVZx#DK&Q0<|Dn!?F*m|#oSqu3Lk?7bW`Fes3`WU`$-7i!W~|`cb)J$QNzc3C8)RM2 zkCH)z-Hut>i1%FC9tbyNn_=EY-CQ0sPM(Oyzu-6hrgLy^5pi;2 z^jk33UO366qr&To9t8H-+_CV(3w_>N$l;TzqN)v2rxuVVumu%-ms-Si#qD0SLrcn6 z{ljQf7~su;ftnh`xZ0T$LF9i{*Dub93fD1fpX8#U0E>p<(h%O%3;28M;Pp&v~+m8H`R% zOYNKNfo|yOnleIhdxWT6jU4d>=-!QsI@pgchSIwyS##njSNUWapL66cwMl;2l_SzE z%0qfqsK8UsFdF!cg}TQ@#_c|n0Rb@?ictd#p3^AK+?vhLymRK{?3xHFon9{-`Use* zj}`T3*qxChbV*H$rPs>$-GKV{%tYU+F!)`>KtVkhhi4tswQ3Zr@ZVo?8Nn?fJv%2? z;I9|f^Lw^~o%A6b!p|)?>yBqt!+`}BYK3E-a zUd!fZCaujr#MM#S_$#>%9+6MQ{~9rSE$@NEA^JkxHBXSp_r*4%`q z)kwVDNZsHl}E?u$IfIMOA`-MKzbx!ZA&Fa9GoZm0@M4q9|&3I9x2kmkKvK zm0|rHg=?Q+=P3BdRB5ZrAyC27A!Fz?FBM=x-)C!ZG-Yn;i=vdIN6hp1;6DoJK~E8Q z>3oniv z#>T)lZD^bMi>JD1VQ5}cTN^jf(ww!~jT=3#?5OZ1vYp&Xeo*pesbmjRr#wkTM+cyq zO^;MnB$8c5M`w!4@?{srW!xd2LZ{`UJTj-#$##eJ5KD?4Vu`C7w({cg3YG^HUb*=S zj8`|xf?NXFW#Zuq&4odd!-f`#jonyBQrU$hCn75m`jcljeJB(Ow%^uVG zblEIA7WdHlhF;jjxfZ{KJl zd5g<8HE40P-tdHOb98mfPC#?H!{fwX9&79q!XL0b$2)lJ0JIJRrhb{(FFb_U#v^+Q zJZvC76IV7qY-~AtJefG38q7otEyU1S2mf82G7Q4#l}ruYrvm9>B2i2SYU_^)Pp&`K zILqfrc4kX~oGU4W%JyDrbD+2V2(!3yNWk_vm?4Zot7Vy;nZ*O+>8ik<(k;a1K+lX7 z;vf=rNH;36Sn3!UNNT=9JekMywW#4gkHd|2ppCr-}W{&6kB4QkuyE|y!opo= zqXFEu4n)tc&AoSiaB%*;b5q8Ja9e0(CR@$UjD*-ldghj%`rC7R_AaSQd-u%Ysg`OC z{<+;s{l&~|b?T|9>TJfm;4x=Rm}kfs*-NTSnp*7d6C@dR=7NNl)+<)Hp%LyWU?LIS2JE!gY=YkI)?KU|r=I{!drDmm(Qk0z%om2H!i$!+w)PA;~nVbFHQ zpsQGUFC9@BH+%96Rqs$%H5rU z5y1r)pfo094pFk5Y*X0GUK%4^HmPd?^DC5PcTv$z#KRuyW@X&1Wq<=oG{y*;$=!Z{ zW%hW{ZxDvd3ky@eSkz<vhh6nEl<<*w{L?5@r~ zU!6Z&J^Q?QLDOf>Aiu81Lmno-#(9ECViTC%mka2fYuQc(ncG=A(5F^#D#W>D*lxkf zswf@zkdBW19RPt_v8aG1UQm{}oGUk9c#(xE9wtC7afRuPqD`GI2SC8!Z|P#bpcR=R zn`JqX^D+<xglB(tTNk-mTrx;H-D?*cke$lw@*?9e#;K!n8s zAPOufYSY9;v?CEw+c!uC{V_l4!GjI!oC4=0;l?l&O8Yqj=@;>_-R{GriHXkr?15c+iTKn-td2Tp!} zI4fV4v%~c-4|i4%o;_IY9L_37DzR9%PyD|{Uw154Iil!xQ5rP90C<}rrPB5w6>TX8 z3!$kPI>RNI%{3>*x$U5AE04{(Oj=8*A=QK2YqtxqE2*E=jbU@(XQM|nOfulPig}^% z`P%1a%dxmzj>(SN(B$M$%^}Ciay(X^y?F8BIk&qII2XA!QmHPyXMFrU3)KqToC_4( z?*9*+TiG~=8P6VK(E{{ihv+^_lb8g0)Xv+4ekvfx2Dj}}$;0hSJU|*ext#jEkgBcUW{L6MkG8D*97r3?MYLsw ziqH><+46F0Vf|DpAop%=%ZfSCN_F$BXv=Emf@y!IZ8o%J&HFO!9O6i}$m}%Y$nZ36 z^6QMz+FGsNapwG)K)bbBnS%8aWw|iX?baW%TObZ{g;3` z{rH7J-M+}#hgW_vu=8wsgiSPf7*AEmcAjkB`z7GrX*&}y-vXdDjCLq70RvvWB; zavUC!k;-OMk1iXhA2j=9z4h552FvbC%G)}ft%nml#|KR0o_H0FjW(t#@; z5=sff1K3Wssv~tt+3OG5*@47n@M2ig7-t#I-Z`DB9o@aBawb!&ogH4h_tZo#cj~kI z9Z#KE|5D9@&jaMi7b9Uol#N~Okp>i0^+vqr~1goEz{585FxrF>=Ex3qye<%VAiirFljkH0e4y7fWFb43kdw z$I$1xW2iGLOBfu6MM5`O;_;NsMV8jX*?D&vwVND*MPY1gVf;`r);M_^Nb(bdnvX^)7{G-a(NsmZPF!H?){Iz> zX3R%6Yo9P?F97@d?A&{F^!zqP;e}8AYdeQ-?e5w-qLk;Y6PcgiJZ!ELL*(KMo$Tmh zj$;{vd^WU?NaA%i0w;*vLYIef{fR=h*cnGV9)THCIS6*ZDQLFEzzYw9}pczu`%m&NIhQcs4VJE^Zz)PH6Xd*#;ES zcNY1#P|SU96+@aS^zqNFu79&uyLzSx2De#Y@+G*xo!y7c=d&#^+ub;$klpWTdA_%$ zzJ117r26yn^?b~BnbLVl_c3$+dwt9(QRoF`*V)9+-OBj6Nee&cM1v#b=caP%S=6c2 zUm;CCdI|FTC0B&XFjd2_aHP=t07}iR>7d)#DimCO~*~IHOr#gWc1((LFMIerA_|>|k!!+^$pr8s-@mjH9V+c#6_h-`^X49J3Ckwv9q`fHtHwCfWkPj3L0hnOmeHesKi z+7K%I$TwK(ZKC1Ag@O>!<6BMdp%SBCQGP%c<}?|Jwpr2V%*D_>1p>7ndjtDh`=#5|g2Cl$)WCcOU`(8Ty#41;8+GSt;2HulZ}P zq2cjc=MK&ss&E&=K%ZQpLzjhut1B}+J)WI$OGv?;uIDQmV#d+HIUgY@^1hPd1L*a$ z6W+?tZs8M&pEzR!bhk<7!7&WW$x&RI7%HU9qh_v~ak1p5B&qfF`c;p+vqN!^2#q+L zYLV@e1Zffcz9D-iV|s#E|<%P^#~5BKp+*{f7{3*xj#GP8b}0E^ojB5a$>9> zkS5?zVs=qU4v%N6or-942RbE#X5jcK%t}!J97WFoVV~hSb!(X;hu_;RI)hnX9Bn0w z#k8#D=mbZKj|-P{jKDQY_mK=^90jtybgSx`^h+C4}@G0xR3=gJE+Mgn4ONs>Sai4x(D8~bvT|y?C;Q2xJQ)X0O)-e_Ut0Xc! zfP8k`bh~cG#gebHBi`TJ6AlH`j#OuA0LWti9Xta${Y-};Hj}CG8@#oa~97qqni)5Y%b(h`Ja2#1crIF>=gj)=+gLxLfL(ka;(B(e8qL!+`s&$wzhRpyGJ^d* z-4|wve3I=-x>A%n=)NR;?d7_gybEZ!Ea3jGU2;hFWoAWhLtAsMTB#BTlsQZs4!Y=6 z@Z^UBJ*DxMQjV3ID7ILNp(X54c1tE22?l%~biQ#IRvOB_r|PdDH0Xu3YW*=5+!?vIu(slr%iWB1hCjec1QuNW%uLC4NbByVaRd;xT-2qoG#@sadvfdiqz$V zjwy<3k+>Asfga9i?rf@oIDp@A2rFhy)}ZSCS^%Ntt|>Bl{MZ#tx_Ks1oDg z&$6kKnL}eL@u*$l=f9cSTwo1kiJUS^>b`BdZKHy=@K}=B(j2ifZ7z?OajI?64Fv$G zp+I2o?p>v=#gU<;7K;YL@NaOy#ZFVh#or7x1(ZTWur^taY|NuIKW8zF48tS*y~=1z z#t0@tztftb5;MbZpm7o!DXGTA`qywIgi(B~;#YlTLmu-PVNN}G-q{xzU*#q}Bo9pR z0rK6FlBJ5HkBTni6p=9}b$B|uMaAV%+K*5t#dEV{x4p||9i$>c+5wPms-StGx)|KC z0y|V7=wnr|j#b+l+LePL8``zAFy0&O=-9h^=Yd@Zwrw3R6-u`Z52m$vG~b&?y?lqe z!|emHg&&G%Dhg<00J*ZjJoUwTdY5W%C|P0JTk1=%$Zt-XmY~mn@FPV zm3dWvjfHya>-!@NS_RjpE@J)X*-)l*mBjj+XxxEMjNfl#x;~Wfg?C)%6NWXVllaKi z(nNPBNIl$kRAgRQVymaZQo~aL%|?C9c`a#LVKyu@h1B_+RFiV&^`EuICHxrrrZpkO z{G{!l5%8R+h6l(R-xsK|^{xkZZduy`&^VhQhJt8rD}-%O%C=8t&PU{!eo}|w)-osT z=QgCCZahN<>fY3h6yFK0YHA{USK(4&2_OGB`%!XC?wTS~LR5$X%Qp* z-D@2V!)Y3pR~w_%4&84%2r$G0xn8SXL_pU6xJECaPdM}87C20GpYUiYjFpSRy%u*W z!#tcqJsxvB@I#N`L0)WJRA}oo>%SAn&9L2w7xTK+MqJJni@&k&b-HK#Y%cd}`~I$e zX;Pi9RcmE*lAkx?_kJAs$~22&TCKlR=S$z&;5*4YJpXN=`}q8IJzqcZvV5;YJ`5pR z?>Bu;$WGQbg$y#DAm#)--~mMhB0P*}@&II1h@zT7E+|I0fPn+_r4!$GzZ{Fb?EXHz z@{emTXEHCZ{UfW_h+nMWd6|kViA2&BqsE?lfV&cMy$jZ;eD3*YH0_z^KSymwrNoF0 z50a@~m&0zOK&_ZxA3uC^KiMB(=HgVB)d5rK6MALTrs|b(U5Cc_daSF9I9}*F5IBu10P_3v|t;I0Q)`z0rv3^FqDOLE#UKtf+XteYaG>VmK`f*H-H)m{ZcU2)4t}6%r>}e>=Pal^{p)+qvTZE z=cw+?ZqWk13{rZ^%|>`!Gu;QxubFFJ!*HBCr%9~;s1Buz(e7wG8VJO%)e-}I-EUo*tcsjQPW2*Z3TyFO9;r*Gg$NT=D zo;%bT-QGX9bht8g%>T2YZTrUZlI^p~EgW`}!mrXg*-Cbk!=%ok)YV5N!4L9`n>q^Y2E-tv2)S|T z(sp8V*d4fQi|))0`@gL`3`czL9!lm9>^Z#muG?pJOpT8YZAquJcyEs)ldW{Jlbxl7 za;RO4TSmnaF1#gPAB@$Qj;zHdZd2rmI=4^%IkEkg=zYueAI=<#^#sDb(P;1Kr5#5? za&dV4wpBcMY3W`y;8kN&2Fp1MBN+P@e$@im(%`|9bK?WKE>FHcbxViu)&X_qP@=Ct ze%tuxKNwSekzEG`r^_w9jA3gO{Hp(Mw-3*G@^u@wTyL4@ub*K<_W~ZjPWScTFF&U! z%)%SCp1O{vM@NJxHt;Xn4o_0{$#uA66r8fUuEU)E#OKi@X}hZt?AP5Op2 z^o=&KjYrb>=i^n zWzn(JB?v5-qFumq(iCT>h@_{(B^YNk^0}q}@1o#|fevLuA!jG7CboObGNtjB?99o* zC_~wKY#kl@jdCvYz{Vt6nU$ueZY>t_qa(wHUBB1U<#+q}u(~%4YZ7fPktuH(Uh@=Q zw8Y#YmQ2Kz4=Q1G5mp9 z{dlIUQ$(H-*h_XOnMd>F=!GhJZ$l02r@lfj@E8$hn;b77uLQhF&=dD0@kloD18={I zuUmtQpQ@sVJh7C)U3SL{fo?mNk#tYbICsF*(z;7#T=)B=T`Lbhx=g=<-?7TnwuSmT z@q5iktBc|<91k{*lc$@XN6PR3E2r?mbL%L6c%$Ba746zNBH*YXGO#y@{d}0X zdp{pAvE@C=XPvEW_Zii)F`z?6Ye7=b$D9t4oN$SLu>qeXHVs;l;}Lf8{IW(K%NS$6 zWWJ#B7O$=4IC8Mqde>ay-wOZGkQpVX0OE;<{xkjOH}R|PVR+EU$Lkds9yskrUidy$ z|MmK>>t*V{PETP1ql4D6*mph!L{?q`>8`a7dg@0%`j?i9Amv}kP2g~S2R&AQx;+kW zj`!Cq15CvW5-)>8FHs)opdaVIa0x>mRG9*PlQQf*w9WL|h!aW+P7Df0^K|@bU#!gCf7Dn({jXn_zI)ox_lV+^fg}y!X(8{T=VB8 z{o44@>)cCt79xkc3HJ5dEX~%Jlhzx^XF{*4mt}td#Fh)Tt^qATWP!dLJ={&ogbJPWzcKWL_qZ~5R!k1Zd_>-#srr`>&y{fV#Vj6b8JRd#tJ(6!!N?~h*D6s+b2 z#>H&Ht1jXt0TRYIHsPS(=W%!GxGU@ULJKrc3+cQT6!X;YgO5L-1}s=l36IqStMu6A z%d@kWSJ$7syjp*Hc2*zg^(R;9cj`~CUY=clQh02&9-znIn(?j1*f#JwKs==`z*SFI zrwfmPCw7=O@FJQI!Uui}RD(}eD6ES2)Sp{@Y5nx7& zrB!;z`Wvfs-|E|cP48H(Cs&*LYiIfrv%jGrNat=oR|V{^1hZfA7iB-yMEGF8X}(zS z6l5NB=IvK!XR#mHp?i$}L5Hgd03hyxRpBvMroUqX<9hvNrpuii*3e&sbDS26@No(n z^}y@JBBvDhtiMrz?j`zH>!*cI`q$8RF$q9`eq*;oR*=-6TR#mCx744be+`{qh4*(h z_1{T4OiB_Xagrn%pe22!Xm&7@N^1Rmv1pHu1}?=RW7|4)JV1`R2+)ZK3sSI{hWm67 ze~W3UAjk14pAPDn@zBbdhgQ~~e2D(_N`2?j$&>XTom^V_C-|&iedrfBpQw zR!qymxbcNOmGqCa2USuT2F=Qmu9hY_!T|@FsmNN1|2_H|FHqiA436l2_^9cTD)|kg-7UQJc88V z5s)82mb8UUsIOQUQ6{FWkY*m#$?EFB1J|)GpU!{s+H!2Y#u!xwXUprVuW)H(v$`bC z)9Ea7+=E|yde%EE{0lI&7qA*+MM>Mb0Kx67kB$D}7uJP`Nf?DW^M!0SZzr46&2y@g zbiCgG`;?-)JdK7AJw0x>H0UI<=-#> z`VCAd)_;W0Ay=9wu(%f^`aWI|ct1~vWXMT|Jd(B=SYLVdyWf2kKNmmuxr^|*{QBSF z-QT@lec>~h^qCiU`~{;<`)4G^n_KEL>oCjeI?qNsG=ODq2-_lV-j-s!I*oQ+)J3O_ z?R(yop=>ShyaoNc2M73zZ8!Jg>jLNE&ph$O&*10ILx=8!&&I}_{J?p9e*Oa|SqAt3 zEILT++JN|F;cI5QwgI7`7(s(KjPfYCjKYH?kK>lw7`5w5qJUKBj zDSQpTP3#eK>*InV3%?^P>w9HI5WWI;_5c0kg&|?v$S<8Z@k=A?e?D}9G|g=+rU!cYivTd*0VW{Xr2Mh=)SQ%|8INO9^1BY#(5+~TBImiq9s~>$dMF@l4Uzm zBuh#n$Bttwb(Fe~#Lc5i(sXidXL0HvY5G`=tdFHdlCEvKs2RGXc{JUS7EQYi-3D|+ zAHWbG?H(Pn4QsKXXwj_;wm*gd8$5^E-I0_i+0Fx5|JxrTDe~^SyYKhi^ZV{QyR8Q4 zn1VC4CDhv$QK!sQXVMX8q2trG(wFI6ilMTYDOJ#M&s{FxOdhF+tC~JAsx^HTG;3$) zIfdw%sg($U_Yob_dJTYT72pzm78LlCplknl1N3Ie}7 z^?B&NQX7;adWk_|1F?k|CmtleNjys&CSD?5C*C67BO*PacYpTg8>del{myd-_wU{F z(9Z26ci(mAnp}S!sc?a`OMOGE-Lkk%%Au{xHXVdS@^iJwI0$84d|)iGOecxAuz6fA?ujy~R&i)zU2ji95V-d;D16z_gByjE)pUf&)7+6ER~fR+YX5#np`yQ7J%kIlmVw3Sy*B{R*bv2;A>Mm=Es^k(%wZitlYHgJ}jqw3*mS|Y{)q*;psDLGh0 zO0!_$%y^r@s7C$L7egG_zv(qZO5X#09*${B`I3OFP-#fXr=%^i0v?zdkvyqBcX~6} z&kbGrLZc5xXQh>Z#gi#E4P?NkgEE^lLgx$uro!g*@@x9NJRFxFDe1MnPL4sgex1Gw zq=AmV&*j6I7r;kl=BqY*L+iQdC3waxkm_^hszFdh;c|u^#y(}+i8R6eINlL(*=o=l zmy$}!6{#{zuoIuRRq+;`xh2cG)AAH~GN0Xh+X%|cvB_lvBgwB`dS>(XpByW$D&&?; z9)mgSzh&3!M~)Xh&vzfZWAjk=PN3wnD`^I2@tBzHVyMNL!envMx+E(eLz!J%1OL63 zPYxEc=saAQ-v_au;C{%TzI2O~MD+pfi?6H7hT)j_%@1Ip?`~OXBe*^SHvU+p1rT>LIaxPWbX~ z$td}6q7#md?jVMVUBpS^4AL*W`trdix81XGZN7g=N}<^p-gk{NTHWhlyD!%5hMkz! z*BB06B~yWaPQbLG2_6cjGtoZ## z-&r<%-0WzYFS(moCnvOUtV?hzJng8pHq_VF3Kk1xI6&pRk&bP8c$me9)W@Uko zmzo^@P04W1O9AAdtgfEsnw^5%D~evX0QNt4FfT`!pX6$UM#1Lw^McTv2nI6_S9(#} zEj83P)aM75@}7=)bOTt?F!0z2#oFk9`5V-=tlSn!b~p1RU>I9l_(?loM2!Qb&=y~}9}y6rp=1)r~(WvxxVU>zS@+y!S%4!OD4<7slaPqBi)!XHtE z`!ZsJ*h74aIHBSG%BdHh-TRIEcMRXTG=p(BPQLD}9#kObvEJI0k8hm0B8*3 zC0rZ0Oi3Dcl_ccWlGGp(+D@^COo5*3f&LyHpA!hIt0MZb3IDK3E(#`jk)Zsj$Nde4 zOd;Gi69wvVas=YuN9-gXE#v;`_rCk|laKA$z4a^0G7Fj@?m-RUL?Tpa(5W>85KdHy zvDK}e(jcS^!%ckjp=>yAR%AEBc2F#X!Xv;+wAi{jO=8%Jm==?NAPaK7lUgVzOsn4( z)Rrp9vz(s+?_URx9o3a)zI>HRGi72ecu_}4-DzSls-Ws;rfU1b^$8+)xZJ=&Szb=V*eTtpxQdA`sDx8qDJc?3P*jDy-*AUj8N7Nq$Z&h3Ic1zD|6f_z}|cz46MCr*@9tb637U zNHejhPpiHi6zZu_^NJgE>^&P9(!;m1mqeW}>#peU8MN~ZhK64>pT0041b!(QLVY!S zn>KGco6)-?abZxn5FFfTy*tZXt#=11-Mf-IC2tGc0do+pWI)5GzH| z-03%lD3WWDM9I&th|zRoJP~9Wz`5)#Yua1$O^g-!6T^7=3_z?-yVdJ$Sh=#tAvW1* zXYID9RtFinrTZ9fxAUhm5tbI))(i->7N*&wNvg8gv0y9M>TG?%@1g17&69W5I3T3f za2vZgAC+iY@}BY6da(4xGgaMx#Lv2Tp-JFGQH+Oq*5Yn#mc-6%cfG?Yx%{iVNd8Y7 z-M?jqE;5C5Nr}=Lmt}5!BsGT)4!!ryq8qj7D{>&GKm6{FO<;5uRVjF6#wy_7vF4PR zp*w9wYctC1x>I1vtIwQoq+Bs6R@8ODSPXV>9pDG}sM%QTZs&hG!shwW(XEKfTUSD2RG z*+EtMa4kK+20jqNHT6PfAR-n6aL7;$B^J&v)<$m16qGJe>{0?7M|NZih1K^b61&&H z`|f1o{?&y-X2;0JfMLOJY(Z-zI3Ky2u9uPLGUO1~ zf$jE?GBy+fyS5uyKo^UG zFB2WxkS*XsBSsXm8^)p;pHM8q08_}6RXriK^L#rH3d4u{`VJ3cTRhByy8Js6_yO~2 z;+=e*&ai^Mmhcat!uhRkTaj=iD%K_)0f#2V<%fj_IJzg9?00Yjsll6zE&i5fd;u44 zjl^5yk%hzetA7H`5q~JCernt`|M#Xkt`LvCDG8(%dxt{K$l3`jQA1ksW(=?%ABz}5 zp4l~r=XuUTqN6ml_h`>et2w;x9=$R&_O?ug(C!*kqe5Ib8Goe3jdD zK*_L>2}yAv7aZjtNkWIZy=`o^yY$E3TZ#wZ540KE?h1JSLwUmay*RI&Iu^3Bc+VBPQTxknOG0*8_ED=|yjr)HA3YiVq0001Z z+GAj30E0@!?V<7fHeVSSnO}hTH&wECLg`)qE&g3$bz`2)z{tSHzyuNn08g$AX#fCt z+GAj3U|?4GZ^6L8TJhiFzXhus15gARFunxMccF#UX^1S!lQ*|~VS~tJQ zy~OyXazP%W|HSOUYQf=eI4`&BI;ZB_+TJ}&Z@aXwT;50Jq<-^q z*}>?-$@NjXl!xq#)JfTK@9fyOiquKk)m;Vf#j!P_?iYgk%rTb6o|(DWo)35V zTEf`yO~IH}cx%lE_|)&Mz6WAk1D4@~H&@^L60zP?Ud_hU%Ti-)84K(!Xbc$f$AH7R z)>v@yP0p0m+qu~9rsuTslNznIaqK);Uo|gaW9lT6nt2tZuD0NvwWh3ln)ukans_xr zT|LUL@tFU<9vApC?mLRTFPMA#&Ld2{eH;OrHtRr6DD~*`qXWkf4#+#!e7epxxEgftj`hs;^A+8=~e-I z+B)-IYnR@6`eFVD;N_AL0001Z+GWCzOJWBA0AN}6(&y96{O!x$d%irgmzh4zHS0Y0 zvS+(q?)CJ_Y3r=D@v(j5hFt4I3kWCBtjzMkdQGV zVvPL(bWr zB!iMr8d`y}&>?gNT|@U`fmkah#O>mMI3xZj8J2vmBr7wOe@m^>(<*+IrE0ipv+7S7 zCL5J)RLiPos{fFa@=^JQJg+b*rWEUnbH$aSsCZEFl~N_FT2`&Awp9nJoa&RRpt@5% zssXi3O{hurvHDUY(8x82hS0b)lqR6r*T%I|Iz&h4Tsle@&_#5kx=G!P?u~8<=D{4i z2;ah`8dFWECZ(6_-Fiwtt3T3T*21;ETBbH#`w`J2MubL^$P99doTC6LK@rr3QfLSr zMW@jd^c=lGA21MuF%w2&9_%^BVS`u}yTFRrgMn|58eoITuxNP1AzY7JaWBr{BX|-| z<12U;Kdb}lJay|vnQ_8+`Gj~fX@X6Crj#jbD%FGaiTd68J9EfN%zDwxHNS7Zwkd6_Eo0lY zeX#>}!ro<%+ZXMJ_7C=={gK2-H_4LYWQN=#bL5SK=a4vHhuM*Gym2f$HXM1U#A$Id z&L!tni>!re8E%wuRe@?aB7yQ~K%J(;JV= z6Y`uqn|pTPb$NHZrElXDj}lN)N=+e@iLz3&)F!n}?NLWmjyj_*r~>t+1L^Q|ocMgc zY2S5cxO2AimL8xJbc%jUuhLoifc`*V(s%T~eu-c2xA@!rjDNtN@TdH5{j2`HF1G8_ zcc;%6yI*(jb>|o*<6$P54711Nm_m=FhwKUWyzW^I00D2{>iaXcmG!YKJHW=-DR#Cu z&^yz+)tl?R=Cqud@~0RR92?E)eIGyq2c1ONg6Bmgu3cK`qYj|<`e0ssPd+QnMiavR5)9wkn) z?uu(|ITtBcD%-^imsmT5C|Qyn=_U|46cK{}4S-T~IT$pEvF4PS0cbqI-evFh1@;B@ z5%y*uCfEA{`~81+&jAOL_U=|pgKYG4|A+5Cc8?s#`R#)*od=Ho?-P9V_<{3}_@>7{ zb3Sr@XU0EwzHp=&f8_ked1=PKaQ@&7%=nks`!8nvD^U42GyWLke>dY_JD)oLVaA_) zcIf=48Gq`C&;AB34?g-B-@f?lzs>l8^ZSRNnDNh?e|Y%MX8d#K*~72Q_#@}h!)r7C zg_A%0S2O;l^ZU;qnDMWiFFyY#GyWLkKbY~a9r^j#j6XRTeO{RHr_OJl|JR@Xn*TLk z%f6q?RB;hTQ5dT-SMqfl&FFL7IX*sqH5d-OSM}2)da|*Yf4x$FP?q<&GGRD?Uq!nFN?CwUOs;O{r6FnB%OJF zl4k2Xyk3;@QE(`q9zS{E%GL(?sLaDGQh%(r9J=BrEEjU53YD+aOrE7lDF=S6WGzNV zh{+->^s{j~FK>J(iis!;R8nBq64Y~9E|eVi`f`}5L@(~^1+KJUJn1~?XkunBkqOc) z1d*wV(i>MoQkwLmB9;Ei4Hi6q|I!=Cv*BPO`@IuyF!q|_%Om;pg*;Q!eCg+FpnUxG|B9iw9C_V~*L@GLD0!Vi zZ<)>+%Pkz`BPe(%3H>saMH$A+$S(m-nn$ynaHhmet$<<{D{KOlAdLWDn)_wAQgTkD zvON7>1!dtfiDj0hdCA=PX^<3GV}8? z0rrb9(|(#l(!5}Y1U_edxCxx5UmoBX9MVN~Y$gDMBxIk~9=p`=Y-WGXODt(i-IUg~r# zf~q7GAk2n=E<}BZ=`islo7*<=q11sqL0JzlwNpPLKT8wEK2(UN_io}REBuJ(g^j)) zJU7B7M$RE>{)~gFOkF&UREaOHp!ir$k%Y=6O~|7on=HsLIK!l<8JK2&og0NJq4kW| zguo?+!NO0ji75Ox_O+*Bn$o28z&02pyGYcHRLLsL(}XZ4WxLCAk>=Yf7U6Y5F{X%( zq7j1n8u>A%ajAku5(a)GZt{?<2=+SQGEhlbHK>wQh#PaYWCHt3Z*8@Q~iNvdzAg4W(hSzQ@_30Xd)Ec$2G~%xM%8f$NWGia6@CYhw7La*Lm4QqKv}PeW za`94#Cx>#NLY=|3Oqry)^_UQr53vu~b_oxuoySE$%gS@GVbiG*+_tEhk^x#On!_kh z4{zVO6HrUdmX04&FWilSp?qWqGKe4-f-!aFM2oOevd$Gq$H;KHrZ@5(=Xj(&UCV4@ zn@NKwWuFpzj(ikQ#D)5ywApU4jQ!*YseH!G+yVoNi8LoLS%M6LW_d{6Obj6r8TE2B zp%|6uDMA&^3RaW$5d)Bz0#9^eI+M4`cUmaB$JAeB`4Gu^6{?#$Tftj%Sm!IaM!IE` z{Wifie$vX*g7UO37Z9hA>W2*Ig{7o$F3|~PtpGHUXC(>J9Q8aSheecaW>HgAumaXM zsX3vR1(lQH!gxMlj2RG;m`VgC>5Te>q>(U4X{wmd4!I*pjMzro9SPi&T&eR~V{I!A zsgpwlo9=#$R;445s*{tus|2|sUKWf*Gh|^0G)XYr zc1xj?AaBwTwyNu957vxJxv%#U_wBvpp59B;z1L=ynNXD(bg8toPjyp;j7h|oa0XIo zm4@i(=gop_vyRQq)Vm6j2JudhGjws-2C z%7gA0-w#~*t~WU!UQHxcjJku#dmIpCcko_*+Z&v^!uvB$TH~=Cj%4rRvfuMgUD+F) z^si2PgE#Uu_6>$~;=AZgKy)(Xt%g+3!@e^CSx(OJwfnl)?@ivj@~k%*5Y00X?aIsU zXwo~m>UT%-@@jNB#KEyUI0e~3Z*VpO7w^IwOa!Dl8D730_1>IMTx^1NnX-{l%OHKw;myI-tG4#o{EZwJRkN?vHGAN^dYH=VvF zH?HZ@GOdBA5ugokyn#3B_FXx?^iFy-0Cc^PcQRqD05_EHvxMj=#@=^Vn7}$=SilD7 z95!li_GmiSn*D_FUN=^~MlEoQ;MMmrRHqWb`XQNcI{SdC4p^ zx9t#EMZ1Mo@YL(}L2yiBY_08x`f9`Zlk+zx$0v5yj&%Bt?*Zam8%`v*cer-{` zg7ydao-jw^wKTHl7?V7TclV%`ga>83wn@3)qCjYDdIs713CmVX*5+%a2^jCtNHWFW z2s1ZKRby&b`gl^{8I4x>5EedmL`<#5(q~z_&UZX6VQH~p^#WYAeM*cwEO&&zDQ2(n ze2D#h##O-E{vJP~f&V2Uc)&VQG*1}+9{iMM$N0SueF-|`voCnB0#Z3FO}?-;zI=>0 z`}=7qpxFrWcj4Esp_6C4g{*lEO|-owdvWcTcl#s7pSIv3dw}-+l0B!uUy7b3`%Y;* zhwM)IgnWqNK=ALC@x_dzO>@$+1e|}g_t9RTsjisXypk%zlN6D!u%7(PZAh`i(~S3) z4c+R!0ZXmv(wxAzIX};tmX*ZEN}r{T8G|}zDB2R>xa8<5%~O&*X8jY6myq*LGuE_( zTK1K}L&wydWm45z!Psb9%ozp3Nu&9Jqc&l57tDLn(2wM&8n8A2+a4t05idC}YfH^q zaUWNbC^M6=bUx#d7{6a|EI0FMYB0??zD2{cv}fpSqBBj=u)ub1Y|5;$(GoAs3fFkm z663I%iLsKt&#TO4G1EF~o8(;gmh6YK2Eq{||Ac zG0Pb-f`o-MNQj1Ju0b}yI<1H0m@p+>8$!;ywWnK4>-_<*w&+YvO^GT*NRlakn^kkS zqoEOd%v_qOw|DI? zxGPw&SL*zeH?XymXoPdNs$#F$uHsh5It~bdHOH&X9c^E4dIr({3ulg;?Pjyz+}L6} zCiFVr#OG!|vAh1yuv24gHS;+ulJ^TkxAwpkdzTGa>I`YMFDkz+ci^5jx|@*4yDgxz z#VM-M8LI36p9wxguC>BBxTU{3FgVOj-m%zNX$tPyEc$cqIkf)UwrobQ+|iQ?=iI~t z@p^=Phxf+adSGC9<|g07JpNEcUtua0dAyx@okHZpZnbNW7KFRT4Wn69;bN+^uPb;M}9SlNeW zb;uG#TYcMI{$sli-A~wFPkYmCUB9mR8Lv={JXCO>vpe_R<$rRA|5-gRwrbz~^t`>= z#HP=&viV#|>WEL-%Vs8$O7q0!E+seioSIIkWKHefBkq&iorTR8bq|x8bB11B=hyj$ zg|?Ayt`T>7fm>-9aK%c@+UqL+#*9my)AVZFO>XAE+dRYKE?C|huF?rt&75~xKem?b zGHwgzbRR1gtZ7o!F;!`!sySV$uTB3LSMw$N`GWh@fRUp9E@$iMSWM0Dy252fmb76t zX>K95eY_oA`*G@+vx1cE8>=r)71{x1H|V^d*|6?s!#0 z!n)gQcf)Ir$bDU3^BkhP*65aATGzYnr}d3Ou~%EMQ(K)Q?1^pDL*^#`rrd$*DAT?* zGiRxkYwSz*mnU422i$Emd$7BsGBKXr&M~2h`Oxswz3tNEkX@O_H5FR!$T^zBU75Nt z)@z^C+NTUH7ujlVBIPM-{?mEh-$OTL+dOsrf1NMfJ5Csi&*h6ogor8&>BwxJIrS~V zs;VHHl~#Ahq3NpXbNcT7uI}RtL$N-WZFX!kmbK}hw)ZIwpCh)N_9~r|e=sM3W^cFP zo{e@KnXY`+xS3m+8Cxd^Z|j*g2AM%LW8LlDOl*+UHDecbeG{tZN^?&UvOmt4o3*Cp zXEo4LOpSl)JF#X@zW?-{8f4pi+UH;0%ZH}3Uh&GCoxRo4^s_p4zA{-Oy+@?{lsH)$ z+3lYF{j{k1>E`J|qf@YkKk!*ClYDdqly)kZhh{ZUmZsm0+omKY<$(|0wTH2m5pE0WTjv(1U zyKUS1b>Qt&u59&dyXo$)hxSfR*WmWuLwy(0ye*7*jjB4m8S^bnACsG&UEgYyY#&wS zSaGMfyT<1z(`Ak7O!?sh%Xee){&ma4x4S=0ZxoD?AO& z9sPXo33;>E+3cO|y{o9O(e>Tl%F*fT#OXuo9^@x2Na}Nb3s%1$8}lvy#CeBxBYxK7 zx6|~#X^6biQe3j{>6I>PNcx=ee&YHq&uYnr#>yk^SuB-~!BWd1 z@%*i!M?OIM_xW9q-Ya&<~m|4cn15fc_-OKM`K_6AIW#h?=QQo_jsqgmRi#W zVy6#S4sTcskMZa;moeWzoG_(+;Xs;nU!HXaxoo>UecvM+6;@{S|U<5gX@$Jn4C*pr3^T^og(hmG_r za3e4#(rxzuNd8Dor=6c-nndcYGW5 z9eq!UWl5GtLa?(S?2Uo2H%{UtPMkQyPU0}n(pkFrq*HEKcG#orSw<(6(U!9JD6?hn zQFaTo>=~df(3Z~M?{_EN+0Li_!|#39`|a-uG5p^@u9yE9<2a7TIM(2L##xK4ur;>9 zw%88aV+ZVrov<@nu?u#^ZkUPPu?P0VUf3J^U|;Nq{c!*e#0_{7kK;!4A%pXg#naI7 z1fIh4cm~hnIef6V9muc4HLwthun1goA z#XQVM2Nqxgie*@iZuDRUR$>);u^NZsFdU9GFff1uOcZfBEUZNdHXL|x zF^Do7@ERN0#0hv0Ls*Al9F1df46eW}_yA|%cpQfla3Uw-b8dutI0+x&Q+&aV*~}JB z<`holG*0Ix+>|r888_z^+>%>yYi`4BxgEFX4&0GDac8!27w*d4IFq|`5AMmmxHtFV zzTA)d^8g;mgLp6xVH;<0Hs`RNb2*Rm*}(-|$WAWeVs>!}mvR}Gvzt9!!IfOaUasb$ zJdB6)2p-9!sIiY3W~sBEIp%3_4F_nlz#=V{xE8Z<4qnGQcmwC+Exd`h(TGj42`1n= zjK@{9u?4QAgFA5-ZpR&X1dk$x8a#jpaSg7eOOJyrVv%nH;ElYAH}e+W%G+=szQ#BB7709t27HMN z@fGgIW;hQTu0|VXU~^oAi*Y|rMv}Ml4&KSTcsGB|dw4JJG_#~g=(|m@{@;N@w7x*H7$CvmrU*W5Kjj!_!{+@r}n|zCJ^N;)!-{HG_kMHvX ze#npbF+bs_{EVM-J-^_W{EC0(U-(yk&2RWE|Hi-bAN-F0 ztH(MP#CsI0>&+N;#w+xj`cS+#XKRCce6^PGTs>~6gc_r@d)dO6u_lqVTvKv1X9qYZ!1e&=1~@Ok`2ltWxFEoV0d@wsD8R)5b_KX3z@-5$ z3vhXW-2wIlxFW!n0j>(LH^9|CrrXrADu&t?-JSI3Wioov zt<*jn?*#sqGzA+Z!Esb!0}#b~l)DU3cEH18+(ks#nr&!?II- zA!H||iIuz33 zkgluJ27M@FYK5#-F1BX0Qqx*bcU;3NRvZ&@o?$xT#h9kv?@G_as>e2RdAFKm>IK=A zB1y_qO-kj5OL<+1ru1S~-Y!K8Rodr?62DwcE-N2`IQpz~)t59|FIMy$lvUMk?6bAZ zfL_D{6s?0Pyz{G)hpFXL5WgPVA7WqETJ?Nk)kq3s>&Q+Rx)2#CMjV_l(JFmSIQEl zvcN!DFke{_sVsA(vdr<7CG(YKl2Vo~rJOBVg@lw=L~2Wt^2H@hDs`Vpd6g&iRh~b9 zqW%afQ4JwkO|Dfl-5O2)PicO0P}FZLf;MWArlLZA`w_HWt9BP*B{lVN5G=0w;X&PY zjf`g6o~hf7qN^C|tfCv(Q}enuI9y55irFyURL&c&?tk^ydg8K9R1VwnidjADyPEn; zaZ4jPY0>`OO0?dGz?$kq*>Ll!O0~AAOw^%8W__99H|>PTf#Br z%gJkIzsi{$`qdk%1~%~nUP-14k(^c3%xZLoA2qGAsu~lY=Ep1B*=IO<#+7|W9CW(k z?H6sOIUGOgj!Y{&2N`G>X->#%@~ubqJ??v^MyKyum5Iul7Ox~)(pZ1BM0r$9CaGCQ zoqnx!PY;eYSbfH}94D{2nY^mmuzOm#vg$m9Cu?g(HxjFkQ;AI<6;t!sKv0Q}2sQ>+ zK>UnVS#|2t$X8_Qb?UTyE}ECvxnVsad$%J42r8>mp(&M6bf?tvTKxA|-6`?;(8TrAn?t|40VCYu#R%Ljp?ic%%9NHk zRPlSgAkN<_D4xt}_JCq3{{c$cAO*{sopm(Zw#sR*6dH|6HMAS#r#fQFQkA02I%z%jLzCB6pu-FyL zD9T4|h&DLX?6)E@zYVzM5F^|zeg~BUjqukE8X4EJhx4KVS6ZJTnntc)eB>+5vFe!U z42Y{LQq>dd6JI4qJpV#Lx8o(T63ZO7qI+(jht zHVB_+bx?bl_AoF2RRL}LZvj>Z;R9`j@ButJG-$76qUTiNyt*N(4sC+ zyf{tmCzDbL222Q&Wf$DV*;)xoE5%N_FVHf>Z_ux~GVKig#!u_Hl5Gr0+8L&qjP7~& z9ldvVnKUIx+xJ{wi1ssWcDqf5-FqHgHfYTcjzqNYQKl6BUDS$Nw<`|}(`;xSdcj)^T zWtG4=xl#zr@=nL2ytJtxZTR7n9$1u95_XARoIkJy@36&2Y5_kf7r0%@mQ8FrA`%fU zh}ZKaIJxZw9V6WFJ?WdipsigGdj`8UxZk3@q6w$c*D`6O3Rp^8BI42xDRXc{dKXqu zzHHHi5^UMuLDTirx{-DU^Ro4MRPc2J_(6H1iHAFW}QGpfuLCg&7yhL-t*#I zui>xI%%OZ@(HpA0?X`DPrC~z9km%2y^!rJ>>pmT#-L$nqT(PqO?#$zj~75Fo-*R7rop4PsGw zY;$?E`7qtAjBT!tHXo&%?<$REDzD++d+_gF*d^c}OB4RFya4}LO8Cce1^%%t!9SL( z@Q>yD@Q>vh{9~zD0=ra6=!6(~`rU+{mT~XC@b&EFsi;4p7f_@b#(Uwc1Dq7t52<4q9YRMKRg@-Q$ z1}mn)hORFy;{F;Y)H0e2{|SXAoyuWUl|s}boOSKRwy36OP!4B;B`Dxov9;|z&4{cp zo@Q3F=Y5;!XAz@VCT!V6=Q^*pVZbvi{aj?6peHHoggtC$oX`Lccz(V5P6(4Q)nyYo zl(?Y@zaWxZaNY@*$aGTXFdPv3JPIm*>{Oh{9+eU!@a&`$^2J?9`E`zgfF{2>h=Hsl zG&d48712CGG-Zn~<80NFkg)@Uh-!OYRn+lyWs3(&!L|%TUMOL8XZ%B+ChDXL9%M#x z8Q&aO;0#j}@R$Bo7l*0b#5|~S)S4LTb-x-{^+hz`t&zGjuHJf?eIn*Ds-QZf3L8e3i%X)^t7ww+xCVv>=KpJyV(b5^J~p4{OI>1wjOE+( z2R6DKjG_Nc_TQ9)01W&Xx!i)wOKEfBmjU{4p-Pw0iyxn&zk`{pFD}p(;Jb>hLbN$* zF5)Vh_zVu?^oinfq&DEEs*gDX@EL&4;B(d26HNyo(QGrv1=wK@gI(q@*kcZZedgQ- z_<}hMzGMyqk2wr{<~RWNn8V;ca~OQZ90m`V(**dMISjsG4ugO>3_|AE00+!r&}9yT z9&;ERD!M)j^ARs-6X@Fn-2(b9sV6M9u=rlljS>3?UL@=v6U6MF62#P>71c-7UwDyF ze@zfme@hTkA1b;zqCVn9Lj65KO#LH4Ont1LPUbShA6|Baiieb4={y;JQ>=dg+8kq7 zc-mv|-obDpC}JZcV_)P3#+@7t91O_?8yVQ0wuU+BF|aUbf!GdQo*bqeiX5UWEF4gQ zU^aU;Z8m8pumHEyUZDow295^S2A~#Bpa{RyUIqs!1dA{;xNKBm> zqZ){}i=%;ok;S1SIV1w4BoYW5xV$;cIg~lXSy*_qb};^L-N4ejk%_@&GiwSPgNq9Q z64)v20000100000c-o~{+mhSH5q+Pp=;A|4TZQFHN^GZ;l^uu#wTQVO4PvF}5d?^_OuZAxNB&$s4 zs(O4oct|GKe;@qxqqr?)o91bo{wRoUGb3}=HvIYUjjFViZwLSS?N{^LujP)WX_d=n zKt>l>9?M2OR?-ZpGsWA%x^3$>H#eU@7e!SKS7vZy?cSUizAaQHt48*hwDN09MarOL zHE@eWBVF%|dR({kBDvM5uU_`guvz7aiXO$LA3X4t4=sLkWeY%&!> zT>trh!s4F?5lv=MLep>*M2p}QK3&u6?`a~Jrc2EZJiq+m|GH4j=csfTH%3(l4fZxOO@Hk6sUzx;pz;=%d)Fft7PM%27|D^ z0S-iJWu)X)q1lU-K}rGU7g7~%*D71v`x+|K9Rg3y8cyXd_9Yv^7woK4)1p$EwW?j7 zY9KX@O-S%FnIcV)G>vuOkd4kV(7`J%P=mIIa%Wt`pOloIn4ns`^|7Kkyy|@L(KN^ zdE<$--XedDMaxD2*vLYr#}eloZ49X0)snNLXWfxua4R?Y(nz&4RhNbuxl$f%A7iYv=|4IFbb1!7A?f!Os}B6a)sPs zG;F4kwnA2_!2Jg=U4V~TD((;mX{CuW04)2LIcA#Fz|(~ z&#otBqvzOH(Q4xrtNxTL`23$ryED;q`r zmZ{4$EVE4RGw_@Y#x5$k#i+1RMpw)+JL`AtTAQaXy5^%KprIuGe{{cJC8IrV(90<}1E zouY}NHh5C)6>r^@X>|=b&+S0B#s{toZJ11ppa#&|D4u9afJAj1x9?|eSd&HGSU33` zUjP$J@QG>6srgw8*Nxnt>3cAgUO})oN^Xyeg={s5&R>xl`bki}9TOb0PtLSjuvWX4 z0XPlGuQk}iYXO&Zi)pAnE5N?;_DC{q(9>&9SX9}ilJ<=SI}rU|o+}<(&^@^>`pgH7 zr6q(BbDLnHu6b6dPDF#9=C1j-D?1fbJ?!4wXGFYjyX3U(WbauW@-&AE?k5O4iMY|Q z)Li1S%C!M+TxdDQjaJ!Kx)YbQW9!#U*0!9}>`SG$$o)szv(!r<_8oDE=PnIWo^{yE zIqbA9>09%c_;2Sg`o{bvj`P=Lr%AZeL_W8c^EbPtgkrMs4#~hSZM4EvzdCKod)3*i zGtaMr(V*UWoC_DDsUO}4u}JO$_fEE$O_Gm(98kERc|7|Nj)O4``~|)bJo*?Wce96t zup{=Pu q^UCd^1ODNUEf+tmoEkebaN8PwdB(fJpEY-4;P&SD%hT_K5J%`3E2CWi literal 0 HcmV?d00001 diff --git a/front/public/themes/wikilerni/webfonts/Light/Millimetre-Light_web.woff b/front/public/themes/wikilerni/webfonts/Light/Millimetre-Light_web.woff new file mode 100644 index 0000000000000000000000000000000000000000..47b1217c759c92d1247af56efd2d866f9aa18a2b GIT binary patch literal 34600 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 literal 0 HcmV?d00001 diff --git a/front/public/themes/wikilerni/webfonts/Regular/Millimetre-Regular_web.eot b/front/public/themes/wikilerni/webfonts/Regular/Millimetre-Regular_web.eot new file mode 100644 index 0000000000000000000000000000000000000000..21221e46f484445b20efbb33a82f8e274af45204 GIT binary patch literal 88328 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 tF;6fJ3a3DhAW*7^;n2b=Y}y| zt$pk9lC`z|(n?Q}?q92WO8i9)J{Qi5u2@x2;K$Y^dA^cx{AAUthSh=67EjLc(ltEH z)?bgwx`gm7+? z%k3&IbLo|VV5QSnmA|@NIv%$5Yn?2SbCuv?>s&D)o!Eyz%z_{0%+t*K_@= z{drY2KEHp>=DNCVg(aO=be0BJIm;?n4GvuCD{l?CD#TTHeHpWAa|5nl)m5hs_|~+y zZ0oBHV11H*YwPMjacNCsu&FEG*YC`A^;ZRAf%4+2+CbfwdwiRBcC9L@$SJ9)8LAYH zRTaUKRoE$`t~5X3^7$L;t34i1RbA7I9>3p%pXC4Fg8wgq|6SMu>_*r=A5{GR*oW_X z*V6AV#)tOo!mJ(eA5KHb1-Y#TrVxU$5H}RYFkH#`Bh5I)-7$|e!UbeFkVSlCj=1x ze{gArXGw?2pmUO8ua3D-ro~~9(xK!eW=Rg^DCY8|CF_~Xusbh9HpJf;+)3RbnN@mO zrq6-*_%DJ9SNG zvzPUsth>@_R$H|f6E=9{WMS(nl>jPueSK$XsWs8q+;gammA1;+xs}{vyXb+)2uO}% zCnghn(rTj(5`kI{mQpF08otchE28GW28ym!T&u zX%JhKGA2XcWY@;v^$!g8Kap0;NH+rG*N0->r3Ez3djpKSJ|gugz$$)$Z3G=D68IAHVyiTXRN_2;j_#@~ z@~$ljHU(PH%zIp}7Edr(;`OgC5CI38{qkJHHYmz3@THy#mirogeqTj?qraiNvb)4v zQCgf+a4&5==)A>N{VFAiDXzrU+60Ol1H%>2<WP>~*f6tBN)(TTQoh+}qpdv|SXYp$#C$uT>w=xgA56+oQMEzWae#Ox*UZSnOM+k>Tjf~9t?al4D5i=hwG+7@b&iRuj#+t9dBqnT0gTA&_Z)s6sd&Op79+u)e{m$T;yn;0)SS|~#>}x9Df@a?9FZUF9JcyurXHoAp!+~)&46B%5Z+)xFf%P1Jtp;t~@8tT^B6S%L6^0a@|*U<9~%x23n3_ z=?ynuwZWTPvVFcBOZzK}ubbOenAbjiZBc~~MQcv%D%YLG&BIp~1zqT4+Ew(Q4^JHs zzJ{Sa2g@p)&VtG})l|Cu@BN4?5W+%f-^O;QBYec`F0FlUfgeXK{mxW2d_RrYb?_d{ zzf7-h=#(Rxs{M>qa7}tmO;TR*1U033UU|Zh*8{Kwe;?N0-P*Ub@3H^?oyWd%-yOHz z^7_}Fy7sDi_W!f(083`2?X6^%f~dNM=n0_SW}5_M%4m>gL<7vfGRsC-UTXh0*a_Hm z%p242c9gd ze;dX2t_MW^+5$stqepd!?FZJD{|*fe*>-bni`uuMM9zM^rAsds9(O?GdbwxCDlD&T z!6eCCY#PIzL2*hFSC8S`1DqSmg~iQ-I<}>8ncrPl%eUShpId>nX2({?eb;lvPQZ;IQUUQVm|piUserYa$6s=Sb&htetc%r{|3E+7-LS`DGyLhj?|j|-$+7K? zI&3b(2ZyR+b;IO~X>%LBZ_`+(>y14l<(z@%CT&p|wJkIFk}X2o`mU$(jsG<3?dJFK zVCC98J>c=y6ql~cbq8{NYgQLKT=}{5y-~YYn&!E`I1f8UV1ppf4_5hntDJ5a<{oT% z<14LpI*NO@Y#6MlF7=^4sqgm(a&*6*?{$@1_I71ePC;8}clj#4{HlG;y31SMwtl=z z_mmab3~lk28<%?gUO#qN*`<4YTTVw^F1p>MExkpV;lbAC2Al_^*Ia++N4IQj>AZK{ zhEk8Gbi=xv>#E=TXX~ykD_B<=T;qHAUDb8xjG$&1*Cj#aa!VW6YeI$V3POHQu%Kx} zQvf?67YFM$R22Suhy!ke?msm9I6Po!T1BjPKGaU`MJr zIhbX8z47cu+B=MA51^PZInUF4&cmF@4;yj(g-zP$jOPOExB3h`@51Fp+={~IjAx;( zE8>P!{O-{5i<*pQr?$PQ(|C4i9Yv>&=Nv6j^g-jS}ArTFYMo%oxgcHVXQ|qQpn|2J3 z4EOD@;M~y@KbrZ`^qD5AxB+9dpY)!^yTH}cm8%O$w zu+3-7Z~sr1_#f;W4)u==kB5c^disXP`t0b3T0-qxL;cZ-#9}yc9#r1c`M;E*esHu8 zI|~i4S{32%&Zy6PR<|?CY(DTLT!khQAB5< zL7&O+9MPFTO_?Dg(b}NTdzglV?_VvRR*wpN0G+B(^Lw5KcsAqG79wvv86Jp@sAFQHq#Bbw!Ls z^z>pZ5tZTx`7!bVC-5x{ewup1(jB2l99T26@cjJDc^z>j0ppX45{eW^6lF0<+Jg87 zOaRAAEMYGI#G<#ae_(iEd|+gFOt0yuyqo%}1~^PXb|@DFlZ?t5G8LOa{^?RG28Ys` zRNn`-M-z?7rsZ%a0VhG91mtEmoH#|fN`{h)lhY&z3JK}fm1H2p_+nxb=rhA+2to|< zWauwSBM702EbAYNQgg9RwwHlaQY=r-M<)%TR+)#wQwvHR>rkymlaO41rXWdC7D69E zOA(t3&zQQ+4x99$>VTeLQw1((kdifjK0XInkhi36uSD7O3#IADJP(+)&u9+pd1h6c zS?CI~@o8=hAA+ z5a$e>kp02F(E|fxW2gwB`cTivaIaA*4n`BRv81#>AfHgCQ4|ij&p`z?E2YhL1M2uh zR5lT$ppkWaVgZ#HRM5jfVIG=5Q8puQnF!iPDc$qXC5Q>d8+5m;d#-6QiR&QjtIKhU^tlv|R-}qUw4AhFCm5R?Lx9fUaQ)oB}i^nim zGEj#aN|+K81LtE%ht_NnmBbRBW>n}vv0GlEforxr+Ey#4t03ary#$bslO`g$w$APSo#%O=hmc^i~ z&%~lo`p_=DtvY_Q;y)aY($cV-W1Yz^XCW1A`GBM4<+4ur< zLUb+?Pk?T$Xc3qi3o*Pv#pv0!2vN^XM(1U94o{w%i=TzrbV3n4t^QD_Ej%tF7lYWa zlCULKw(|Gw~QK`YD-#A!DZ2F|{*oSDmFseFyB`fw7*U z?tue+qx$&1KGh!^8|fdvx_h)QG%yxAI6888ptr9#RMS0%_nPL=)dS=EMh=aK5M#7^ zc>D-D2%+xbBcZ{8;ofGw?;7;9#>PS;qoIKV2ZsjwdYeN7!#zWXdIyI0hV~%c@CbW+ z2L{FgbbLf6H9!sYAzi-?Tzd8aa`&Erp@H!u&7uB*@nOR32hi@&!S2!Vfu2J{-J_v{ zhei*MpySv*+zYV71H=8J$ffT<-|)B&ta?Tc9vL0jyKlT1iN^7=OGqahik6<7jBsP8c1g~s-E4-JJ7s;6Ou_KghnBKDp>VBd|Nq(TP;m-K56^>!cV z-pdl0a2ZXNK({DBO6~0%?i=kMY7UJZ?CTle14uV8+SdaF5fkJ_;qeuaU{j3sU3CZ_ z5KlL<01x){Nz{RJH~#lfG{^@;M+pgMd}MSyjmp&nV|~q`?$LoUkVo$y9XSBtU4!i<wLB#xU7IPYVQMF}1D;*W1@U1b~o>;fv$8>XvIm+pqmhOW?c4*Uxv4HI{81D?ew@Ex(wQcy@fzpMs zZAMhanL-FlJb|IrRvZA{3RiFkhL5+&QZ0vNc1fm@(*m|x+m3|{8?}@8BMs;9*Q!kc z-yY;M4_YUX%L!n%0DKyOTNCc>$fXTAHsg6^zA!$y5d)kV;N7)ME=_=;V;hhdVon1Z z`IMCOI)iHjU-~6AnENowPY#Ec+^u8N^Po=z?&ZVbqv>)s2>96l-aE^Z4{JB zfYa0p)FhN;9t!+_u7oI-jq%?7%%u;Jm`k0nd7K2PO zpDBD%apw^dN8OJ?+9+qNCngq)fI2VJ5~^7?D=p1~tTU`_bFw91ttWmACFZlT{B!uiuhcul%uJ^+RJfl(IO)MqmW(*5H|h%=uuR>+ zFr}r=%2J&|eCE%3NzF8gt3?~?DQb1fA!~dHI85W6@TreXT*xUC6BVLh&daz9fUjB@ z<}eR@EPcxMgp$Pe$I_6@Nl6CtAP1>wh>gjCOdUmBOrEG%)IJL1MWiE6q#fzIh-an6 z_+=K5`95WQGs~nKWmG(&4w^tp%Av|jQFumDCM+={j^raDSeTM>rex0{2BnC)ky1?UN+)R%GU}LaD;Y5+WhW6&mBY+&PC`;`10~!p=_aR@{7??bZ$%xJiZVjo ztY{PkO&AuzpZV?5)KF5e5v5|gWR=e1GGnl$49jfkOsP@wOPY`x#9ncNsYq*ko2vtw zl3~(0o4O{yP3m5bCKjbLWyqB6<+MGn5vO zBYpxY_-2)m`h^;SB_`}l`%BeGe$VEz(l*q8N{83HDm!^4KA5s(ujNTuBPM~FT~m`M zX32>ixlB5nI#ovr+4g1j64(k5W7Y&!V-#OZ+(!U`eF{n`Tc2#ZZ6&--`7x~yWlxyB zDrFt@10PjKv!&8(^J#6cy<{wwkNl;bvwTZ*Ir$4MBY$Q&4#ew$^40TFJDN89xM`vJR+PN`9-a zv|(7=n7fK?;+kojD(fnn()KtyG|8of`P`e;QXG`H&?-+#Iw+i!{#2GJdt~IZ zDmyVW?IO$4RlALCMfR2#vXJR>2SsZB3|8HerN#g?|x&8la! zQfb-0CT%V62=k`SpGf!E%+i~bV(l~g3}!7;vPC^aeL@~5rN2Rk_k%6+FgT`sJW6Iw zSSw4LvWBR8%$lTRfKaHnnKScKeKYpwNu%X74=K&q?DJ&n994HNr>T`?uUdQ4vS;nG z_c9b-LR5igWfx==!LS~y!DY7h9Wgmr%vS;?b zxq&lrQx>C{kDbn>Dk({OmvC8E*}kftN~Ue4bZf$>JDUxy!FKC%wez>BCn`5f_C|pd zOOuejP0E9*nRMtb)f=|=E>w?&T%;thuSU6~4q$t$T4&Oj5~tdw( zNZ^mSDQn8K^z>!=LYcN`D{>xB*9`?jwf*$MSyuC$!5g#BX|@-cR)La6%C;#X%9fy( zR@70F!h>5>UdqB&oX&)0a@y=;c1T_mS4xu!&!o1}`X)tsWX;Ib3(NHYNjHnTc6)7k zxE8lB)~(7Xr`lk%hpzOjDhZ`Ul~C1Ow#4K;wIiv(-W+Q@OQ-N+Ev25Lg-zYX5NZwf z_b(^y3hFtj1?Q38%$u6_6kyP2Lg|c1E6Jh(WhvA8Q!=m|JuWX@W-6r}tz4F;G*>I@1^Vu zY6nF(d(O;nx%TYI1ELDAk(%pj zgc9NiHv1Vzh=MVScpQ5>f-i&}lJ9&QM11!CSSR|lYm6~1_7NF#6jx$;P>$I#Pf9jZ zuoQ>z&gZ@Ow#Uei6GqD;#9F<=`uuydAK^YXz-GI%pT*5jc z^QUKX9QiU8(~)w-v>U&JxQ-%}BaDZTif{aS2={}Cr$!tJnOLb=1S~^8!c|%NBnG4w zy&a?#d&mcoH)HGtUgHuA=ETx5CaE%x@NPh5dgeMPzbec~6LOijSWwv3Gf#y_2;qkf zc+`e0{}BENnQ5urv+-xgB3p zKAQ)+#5-FCNL9)dVUate$B?AL80gmr{0T{YVYw+il5)S&C9@`2RADV6Cd`Sv<{NX^ z3ocQTMnF@BnYB>mp|A-7dnJXcTuhfqU$eHD@yv9W(hv%knKvcZDm&>(S}F|5Wkrq4 z!=>Ij0F6jpX`iQqHDj0jC;k-+(;NZ^91EBBF_9y%W(=oZ)Z+}DMl}EHv1dXvxe!VEvo)<;h z7er9|C++9j3!)f@tdwHkzEz@JREX80QmheGVyy__Op+Q=E7plRfj!1Vqi7QA#ReRc z&>~vJMzKk>Vf(?&q64RwY!#hio47)37dymGu}fSjc8f02E%t~W(JT5yzt}7Gi2<=+ z42mIfKn#l!aZp?(M#Y#I7l*`QakaQc91%ywwc zuhAY6uf;m|Jnc$MKsu(~AYLbK6u&2K62C8Ak9ChXYhTsgto;FY6Mu_#tGHQP!cGi# zYi{udtgU<_R!auO8?|DbCs>Ld$5&xL&kF20St;Ix)0%G)e<1!)+$!E8mc$>4w~Du6 z*Z;SRcZhe2cZu7@9pc^MJ>tFMed12>$Koz=xA+rrkGNOdC*ChUAU-HQB>q% zFFq-xc2z-xp7bABevfKNLR_Pm5>7 zKZqZTpNM}HKNbHZo)te6KNru5=fy8@R>D7vUy6Sb|0;fkQ^5aC{6@Se{$2cscuD*Z z@v^ueQsNaH`z9PX&E4U`{&a4K$C2ysI&_E6k>~I`@*M$3fuqn-N&UD zphAAnBo^mk@uC5s&z@PIJ+r>-%mRIx@bd=jX$S0S2QErGkeRk%0E`V!VwLNHfrye3 z1KRFB21qY5~rBzkKNPEyJ0;}T8|OyF={c;XU-WJX>aqhx2R{k>b6jo@;I~GebJQ+L3@Fdp65?F4OYwH;SYv33m zS3zBz_YfdNz(a_*qq!kSJmpH5@_|4Zhfo zlv(g8=R|9GW+5lcs~%QLNj@sIg2zDErjTTiQhj*zhtt{xZ{DzM9Ps20M+wh8&^jBR zi@Rg$c2eDD)GZ-zc}7bqU;IYPtm6CSlB3D+Ok!~+ng~EA#a_dOaO%AR>(b7gH=|(H ziWOdfHR}seWiy<{!vAQI{E&!qNlqjwKNU>OK;~_6@{l)HT&YmMx*2a3>WvG$Wh&Vc z+QHaA$gFH1@??@oEDTCS@?@y-Qfb^X;Tj*ytUOuouuf}A0$OE#mo+dQuto(eV#kQ7 z1pqk_$9my(=vozuMV2zvMd7PexJk|ltn|W~HRvr=o;>p_7VXWHTKU^Q+t9N3!1(!@ zuZ7dl3(<&;?r!zPps_-KA#Nf{5M|i+AevyYGQX#j$Rf!wMv_=AVqG2Tzx=4u@^hs^ z-YorOBA&zwxP{4SnP&OV24%>kG#-$k2v_0S!ho>K#|$&_VmcWn@mVHN0?h~v01*lc zj9@9MJ}ES;gELW|6aw|^nWEM`AI+uaPvXH4VHH}cZp`1#s50wwrd(OyB{FHrS!D&t zax51h%a9JJP$>)+m_?R|mzzP%+YFJ#E0f_CrLbrcOS@;HrPg;T0U4ju3^8LXC>BZ0 z@A?d-0lbE_KMPxRaaKNiBiIK(KIt+W`IygquxUyp8BQePXY&^4t(SnLjrE?-hTitd zq%w+3>RX&=xO~pXa^;2TvoH^AuUOz}ykfrrEE3FoO-C-XKw{~ytO*iG*}_?Di4l!t zA(aeF&cr8AAq<-xpajWcNnubW9>Zcru4Ioy&y^}w1pJoy%yMLWE|alkMj79IXRx+4 zo;Z(n_z|Ucld~~yJ2C}>LFriAhoa;uh$^DWnm2(qE$KWw-tPy^(oouULr+5==h*|? zuqI$yc$1T$6>SRaN+fWGI?u__;19UR5z-vJ{X^qg{!Dmb4n7|j-Aag2gqs6zIBOg6 z0`MyY(VH(rPkuGL4D3tS!k<*CIlGVcg|x07EP2!Rp|2Q%A4jFf*_ZG)c(6^F58j0$ zcmqn|38>I2;isVEd>y<|j49w_P(QL@!ksZK3wB>N?q;oYY=2uGp+YXp{2F zwph5;6&tWjiad3Nu98=eys9(k3nkyVS5}3#RlLUe1?Thpb7`(BSF`K;u9tJFat`L)o%4P7 zwEI5yWBB{2=Uurwb3c^(4*Z@#j?6U|SUwJ);K$%U`~-Z0pM)3gQ`$q)4@G~}=d{mj zU(o&xo)~(gzN~!(zNAN_hw5waHa-fUZ~Jrk6~dMTrU_vu!BfX80}(;J_V({LjMs*a(l~d3aD? z3%^$fd}42h$1H`v{n*w}XoK*4=4(SD2%qCYdK$H>;AyPT#^7hH(#Azdz#R==V}o`W z9>7U>I~8wndWxd}UeOQ0uk}^X-~T7Z=29;Nx3@C+;42***=Q*rV`w{Q$nK=i$5hHT+dC z!$;+UUn&o{zC(LbYy)-Pqdf(Aly5k_(*f_>cW`}|_IJ464o{^6K0%)7`fly}NQKzq zZFqYxJeLmbeehs9v^(L$bZCF9{Rr2)w5M^s8~#m)_9rNT6JFmRi!1PUFMP`m?LK&Q z9oR?xr?`FqzFY^+RCpHG55dFifVc1GxPDlB4%d%p&*OSO{LT(|Mqj}7W8&?&eq6i* z*H4Id;`)Gi7p|Wax8wStxC7TuiFa!`;Kv9&uydkIbHO)z6@0OAJY5IR?G!w)F8FH4 z;F~>-r(^KsPQ%;kg75Yae6>kD-2j@N6bpC?!^3+@EaGVbp57UFU0v|)9)T|xas_Yk zLF}H`jo%*pdhqMTuMfX|{PyCv55ECmMO|DC2^@kSyaMTVYdhd)9?*6I&k?N;7#_jk zhtdj=AIPf%8lV(UF7Z5QxEk8Qd_E3uJGIFgct_1zORcdEZvsAe+qYMKiFgi~hbHr2 z3{}qsB)K5{=0FYD4X^)q!1eEf+uw&w`~bZDA$a;Uc=-?T&i@3Q`zbi~EI9RZaOin( z=7rxX&EGHQF$bnOX(~mb#m?ccL(*!Cq}5g%w#PJmSr}&N9B2>q<$Ulq7!`=IyuKi3 zcY{pikkZHG#yappVC;oDmNeARqLL4#80%n25q>r45Yl}&(rcjp5wxR>nG60~JZ{Dp zPMUP#R{$uLg4`;V*Q2~*WP;Z}l4(mYrec+D9wR>g+qea+oELM(hE1jBgGOFv6oe_I z{?sHzQCE!Gpk&abTBVI@0z7#w-W{kp)T)ZoY?;Uj$}j0UV$1zjjDEZWT8kqDcR)+M z2fFEf&`EzR$2I;0`sZF~o%ciAd=OgZPoZ5fiUN)DyKduXa}A+Y(a@%x$0!|Jm1fzh z*d_P>9&E`|vsGL#TgBZrsy3q4w70m+wzr61sHMa+2csyz5}!z0xhSYF)gj-Kn=^6V|E<3TdwvBSW&sCO+(tzWhD|I IW!~EV1Z^fSFaQ7m literal 0 HcmV?d00001 diff --git a/front/public/themes/wikilerni/webfonts/Regular/Millimetre-Regular_web.otf b/front/public/themes/wikilerni/webfonts/Regular/Millimetre-Regular_web.otf new file mode 100644 index 0000000000000000000000000000000000000000..be13480fdb617f2dc47c2e2ad7f1a2863597d44c GIT binary patch literal 81148 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 JH~4+*{{@uM^Bn*H literal 0 HcmV?d00001 diff --git a/front/public/themes/wikilerni/webfonts/Regular/Millimetre-Regular_web.ttf b/front/public/themes/wikilerni/webfonts/Regular/Millimetre-Regular_web.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d33064ef823559292edda029846acc77d8ddb5b3 GIT binary patch literal 88068 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 TZ>pa^lw@DkddVXj0RR91AVrk5 literal 0 HcmV?d00001 diff --git a/front/public/validation.html b/front/public/validation.html new file mode 100644 index 0000000..633dd4f --- /dev/null +++ b/front/public/validation.html @@ -0,0 +1,45 @@ + + + + + + + Valider la création de votre compte WikiLerni + + + + + + + + + + + +

    + WikiLerni (logo) + +
    + +
    + Logo WikiLerni +

    Cultivons notre jardin !

    +
    Si vous voyez ce message, c'est que votre lien de validation n'est pas valide ou a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.
    +
    + + + + \ No newline at end of file diff --git a/front/src/accountUser.js b/front/src/accountUser.js new file mode 100644 index 0000000..ad84946 --- /dev/null +++ b/front/src/accountUser.js @@ -0,0 +1,261 @@ +// -- GESTION DES FORMULAIRES PERMETTANT AUX UTILISATEURS DE METTRE À JOUR LEURS INFORMATIONS + LEUR ABONNEMENT + +/// Vérifier que l'utilisateur est bien connecté, a le bon statut et le rediriger vers le formulaire d'inscription si ce n'est pas le cas. +/// Si c'est ok, on récupère les infos de son compte et son abonnement et les affiche dans le formulaire. +/// Une information est affichée concernant la possibilité de parrainage et les listes les filleuils existants. +/// Un menu permet à l'utilisateur d'accéder à la modification de ses infos, etc. +/// Des boutons de paiement sont aussi affichés suivant le choix de l'utilisateur pour lui permettre de prolonger son abonnement. +/// Un message venant d'une autre page peut aussi être à afficher lors du premier chargement. + +/// Ajout test email en doublon avant envoi ? + +// Fichier de configuration côté client : +import { apiUrl, availableLangs, theme } from "../../config/instance.js"; +const lang=availableLangs[0]; +const configFrontEnd = require("../../views/"+theme+"/config/"+lang+".js"); + +// Fonctions utiles au script : !! revoir quand le rest sera fini pour vérifier si tout est utile +import { getLocaly, removeLocaly, saveLocaly } from "./tools/clientstorage.js"; +import { addElement } from "./tools/dom.js"; +import { helloDev, updateAccountLink } from "./tools/everywhere.js"; +import { getDatasFromInputs, setAttributesToInputs } from "./tools/forms.js"; +import { isEmpty, replaceAll } from "../../tools/main"; +import { checkSession, getConfig, getTimeDifference } from "./tools/users.js"; + +// Spécifique WebPortage pour paiements: +import { showBtnPayment, unCheckAllOthers } from "./tools/webportage.js"; + +// Dictionnaires : +const txt = require("../../lang/"+lang+"/general"); +const txtUsers = require("../../lang/"+lang+"/user"); +const txtSubscriptions = require("../../lang/"+lang+"/subscription"); + +// Principaux éléments du DOM manipulés : +const divCrash = document.getElementById("crash"); +const divMain = document.getElementById("main-content"); +const divMessage = document.getElementById("message"); +const divResponse = document.getElementById("response"); +const divGodchilds = document.getElementById("godchilds"); +const divSubscribeIntro = document.getElementById("subscribeIntro"); +const formAccount = document.getElementById("accountUpdate"); +const newPassword = document.getElementById("newPassword"); +const showGFEmail = document.getElementById("godfatherEmail"); +const showGFCode = document.getElementById("godfatherCode"); + +helloDev(); + +const initialise = async () => +{ + try + { + const config = await getConfig(); + if(!config) + addElement(divCrash, "p", txt.serverError, "", ["error"]); + else + { + // Si l'utilisateur n'est pas connecté avec le bon statut, pas la peine d'aller + loin : + const isConnected=await checkSession(["user"], "/"+configFrontEnd.connectionPage, { message: txtUsers.needBeConnected, color:"error" }, window.location); + if(isConnected) + { + divMain.style.display="block"; + if(!isEmpty(getLocaly("message"))) + { + addElement(divMessage, "p", getLocaly("message", true).message, "", [getLocaly("message", true).color], "", false); + removeLocaly("message"); + } + const user=getLocaly("user", true); + updateAccountLink(user.status, configFrontEnd); + // Initialise le formulaire permettant de mettre à jour les infos : + setAttributesToInputs(config, formAccount); + // Certains navigateurs ont tendance à remplir tout seul les champs password + newPassword.value=""; + + // Fonction affichant les infos connues au premier affichage puis après envoi mise à jour + const getInfos = () => + { + const xhrGetInfos = new XMLHttpRequest(); + xhrGetInfos.open("GET", apiUrl+config.userRoutes+config.getUserInfos+user.id); + xhrGetInfos.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let response=JSON.parse(this.responseText); + if (this.status === 200 && response.User != undefined && response.Subscription != undefined) + { + for(let data in response.User) + { + if(formAccount.elements[data]!==undefined) + { + if(response.User[data]!==true && response.User[data]!==false)// booléen = case à cocher ! + formAccount.elements[data].value=response.User[data]; + else if (response.User[data]==true) // si false, on ne fait rien + formAccount.elements[""+data].checked="checked"; + } + } + // infos de l'abonnement + if(response.Subscription.noticeOk==true) + formAccount.elements["noticeOk"].checked="checked"; + // jours de réception + for(let i in response.Subscription.receiptDays) + formAccount.elements["d"+response.Subscription.receiptDays[i]].checked="checked"; + showGFEmail.innerHTML=response.User.email; + showGFCode.innerHTML=config.beginCodeGodfather+response.User.id; + } + const beginSubTS=new Date(response.Subscription.createdAt).getTime(); + const nbDaysOk=response.Subscription.numberOfDays-Math.round((Date.now()-beginSubTS)/1000/3600/24); + if(nbDaysOk>0) + addElement(divSubscribeIntro, "p", txtSubscriptions.infosNbDays.replace("NB_DAYS", nbDaysOk), "", ["information"]); + else + { + addElement(divSubscribeIntro, "p", txtSubscriptions.infosExpirated.replace("NB_DAYS", nbDaysOk), "", ["error"]); + window.location.assign("#subscribe"); + } + } + } + xhrGetInfos.setRequestHeader("Authorization", "Bearer "+user.token); + xhrGetInfos.send(); + } + // Remonte les infos déjà enregistrées : + getInfos(); + + // Traitement de l'envoi d'une mise à jour des infos + formAccount.addEventListener("submit", function(e) + { + e.preventDefault(); + divResponse.innerHTML=""; + let datas=getDatasFromInputs(formAccount); + // recomposition des jours valables pour l'abonnement : + datas.receiptDays=""; + for(let i=1; i<=7; i++) + { + if(datas["d"+i]!==undefined) + datas.receiptDays+=""+i; + } + if(datas.noticeOk===undefined) + datas.noticeOk="false"; + if(datas.newsletterOk===undefined) + datas.newsletterOk="false"; + datas.timeDifference=getTimeDifference(config); + const xhrUserUpdate = new XMLHttpRequest(); + if(datas.deleteOk!==undefined) + xhrUserUpdate.open("DELETE", apiUrl+config.userRoutes+"/"+user.id); + else + xhrUserUpdate.open("PUT", apiUrl+config.userRoutes+config.updateUserInfos+user.id); + xhrUserUpdate.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let response=JSON.parse(this.responseText); + if (this.status === 200 && response.message!=undefined) + { + if(Array.isArray(response.message)) + response.message = response.message.join("
    "); + else + response.message = response.message; + addElement(divResponse, "p", response.message, "", ["success"]); + } + else if (response.errors) + { + if(Array.isArray(response.errors)) + response.errors = response.errors.join("
    "); + else + response.errors = txt.serverError; + addElement(divResponse, "p", response.errors, "", ["error"]); + } + else + addElement(divResponse, "p", txt.serverError, "", ["error"]); + // dans tous les cas, je mets à jour le contenu du formulaire : + getInfos(); + } + } + xhrUserUpdate.setRequestHeader("Content-Type", "application/json"); + xhrUserUpdate.setRequestHeader("Authorization", "Bearer "+user.token); + if(datas) + { + datas.output="html"; + xhrUserUpdate.send(JSON.stringify(datas)); + } + }); + + // on passe à la caisse ? + const CGV=document.getElementById("CGVOk"); + const abo12=document.getElementById("abo12"); + const abo24=document.getElementById("abo24"); + const abo60=document.getElementById("abo60"); + const abo120=document.getElementById("abo120"); + const divWPBtns=document.getElementById("WPBtns"); + divWPBtns.style.display="none"; + abo12.addEventListener("change", function(e) + { + unCheckAllOthers("abo12"); + }); + abo24.addEventListener("change", function(e) + { + unCheckAllOthers("abo24"); + }); + abo60.addEventListener("change", function(e) + { + unCheckAllOthers("abo60"); + }); + abo120.addEventListener("change", function(e) + { + unCheckAllOthers("abo120"); + }); + CGV.addEventListener("change", function(e) + { + if(CGV.checked===true) + { + divWPBtns.style.display="block"; + if(abo12.checked===true) + showBtnPayment("btn12"); + else if(abo24.checked===true) + showBtnPayment("btn24"); + else if(abo60.checked===true) + showBtnPayment("btn60"); + else if(abo120.checked===true) + showBtnPayment("btn120"); + else + { + divWPBtns.style.display="none"; + CGV.checked=false; + } + } + else + divWPBtns.style.display="none"; + }); + + // Liste des filleuils, si il y en a + const xhrGetGodchilds = new XMLHttpRequest(); + xhrGetGodchilds.open("GET", apiUrl+config.userRoutes+config.getGodChilds); + xhrGetGodchilds.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let response=JSON.parse(this.responseText), txtGodchilds=""; + if (this.status === 200) + { + const nbGodchilds=response.length; + if(nbGodchilds===0) + txtGodchilds="Pour l'instant, aucune personne ne s'est inscrite, en vous désignant comme \"parrain\".";// revoir : utiliser le dictionnaire User + else + { + txtGodchilds=nbGodchilds+" utilisateur(s) inscrit(s) en vous désignant comme \"parrain\" :"; + for(let i in response) + txtGodchilds+=response[i].name+" ("+response[i].email+") "; + } + } + addElement(divGodchilds, "p", txtGodchilds, "", ["info"]); + } + } + xhrGetGodchilds.setRequestHeader("Authorization", "Bearer "+user.token); + xhrGetGodchilds.send(); + } + } + } + catch(e) + { + addElement(divCrash, "p", txt.serverError, "", ["error"]); + console.error(e); + } +} +initialise(); \ No newline at end of file diff --git a/front/src/config/general.js b/front/src/config/general.js new file mode 100644 index 0000000..301baaf --- /dev/null +++ b/front/src/config/general.js @@ -0,0 +1,18 @@ +// à supprimer une fois que tout récupérer du backend : + +module.exports = +{ + apiUrl : "http://localhost:3000/api", + usersGetConfigUrl : "/user/getconfig", + lang : "fr", + userHomePage : "accueil.html", + adminHomePage : "admin.html", + managerHomePage : "gestion.html", + subscribePage : "inscription.html", + connectionPage : "connexion.html", + accountPage: "compte.html", + questionnairesManagementPage: "gestion-quizs.html", + usersManagementPage: "gestion-utilisateurs.html", + nbQuestionnairesUserHomePage : 10, + illustrationDir : "/img/quizs/" +}; \ No newline at end of file diff --git a/front/src/connection.js b/front/src/connection.js new file mode 100644 index 0000000..9c41666 --- /dev/null +++ b/front/src/connection.js @@ -0,0 +1,148 @@ +// -- GESTION DU FORMULAIRE PERMETTANT DE SE CONNECTER + +/// L'utilisateur peut avoir répondu à un quiz avant d'arriver sur la page de connexion +/// Dans ce cas il faut enregistrer son résultat en même temps, une fois la connexion validée + +/// Le connexion peut se faire directement ici via la saisie d'un mot de passe +/// Ou via l'envoi d'un token par e-mail + +// Fichier de configuration tirés du backend : +import { apiUrl, availableLangs, siteUrl, theme } from "../../config/instance.js"; +const lang=availableLangs[0]; + +import { connectionRoute, getLoginLinkRoute, userRoutes } from "../../config/users.js"; +const configTemplate = require("../../views/"+theme+"/config/"+lang+".js"); + +// Importation des fonctions utile au script : +import { getLocaly, removeLocaly, saveLocaly } from "./tools/clientstorage.js"; +import { addElement } from "./tools/dom.js"; +import { helloDev } from "./tools/everywhere.js"; +import { getDatasFromInputs } from "./tools/forms.js"; +import { isEmpty } from "../../tools/main"; +import { checkAnswerDatas, checkSession, getConfig, getTimeDifference, setSession } from "./tools/users.js"; + +// Dictionnaires : +const txt = require("../../lang/"+lang+"/general"); +const txtUsers = require("../../lang/"+lang+"/user"); + +// Principaux éléments du DOM manipulés : +const myForm = document.getElementById("connection"); +const divMessage = document.getElementById("message"); +const divResponse = document.getElementById("response"); + +helloDev(); + +// Test de connexion de l'utilisateur + affichage formulaire d'inscription. +const initialise = async () => +{ + try + { + const isConnected=await checkSession(); + if(isConnected) + { + saveLocaly("message", { message: txtUsers.alreadyConnected, color:"information" });// pour l'afficher sur la page suivante + const user=getLocaly("user", true); + const homePage=user.status+"HomePage"; + window.location.assign("/"+configTemplate[homePage]); + addElement(divResponse, "p", txtUsers.alreadyConnected, "", ["information"]);// au cas où blocage redirection + } + else + { + myForm.style.display="block"; + if(!isEmpty(getLocaly("message"))) + { + addElement(divMessage, "p", getLocaly("message", true).message, "", [getLocaly("message", true).color]); + removeLocaly("message"); + } + } + } + catch(e) + { + addElement(divResponse, "p", txt.serverError, "", ["error"]); + console.error(e); + } +} +initialise(); + +// Traitement de l'envoi des données de connexion : +myForm.addEventListener("submit", function(e) +{ + try + { + e.preventDefault(); + divResponse.innerHTML="";// efface d'éventuels messages déjà affichés + let datas=getDatasFromInputs(myForm); + if(isEmpty(datas.password) && isEmpty(datas.getLoginLink)) + addElement(divResponse, "div", txtUsers.needChooseLoginWay, "", ["error"]); + else + { + const xhr = new XMLHttpRequest(); + if(!isEmpty(datas.getLoginLink)) + xhr.open("POST", apiUrl+userRoutes+getLoginLinkRoute); + else + xhr.open("POST", apiUrl+userRoutes+connectionRoute); + xhr.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let response=JSON.parse(this.responseText); + if (this.status === 200) + { + if(!isEmpty(response.message)) + { // cas d'une demande de lien de connexion + myForm.style.display="none"; + addElement(divResponse, "p", response.message, "", ["success"]); + } + else if(!isEmpty(response.userId) && !isEmpty(response.connexionTime) && !isEmpty(response.token)) + { // cas d'une connexion directe, on créé une session de connexion et redirige l'utilisateur + let connexionMaxTime=Date.now(); + if(response.connexionTime.endsWith("days")) + connexionMaxTime+=parseInt(response.connexionTime,10)*24*3600*1000; + else + connexionMaxTime+=parseInt(response.connexionTime,10)*3600*1000; + setSession(response.userId, response.token, connexionMaxTime); + removeLocaly("lastAnswer");// ! important pour ne pas enregister plusieurs fois le résultat + myForm.style.display="none"; + //addElement(divResponse, "p", txtUsers.connectionOk, "", ["success"]);// au cas où blocage redirection + // l'utilisateur peut avoir tenté d'accéder à une autre page que sa page d'accueil : + let url=getLocaly("url", true); + if(!isEmpty(url) && url.href.indexOf(siteUrl)!==-1) + { + url=url.href; + removeLocaly("url"); + } + else + url=configTemplate[response.status+"HomePage"] + window.location.assign(url); + } + else + addElement(divResponse, "p", txt.serverError, "", ["error"]); + } + else if (response.errors) + { + if(Array.isArray(response.errors)) + response.errors = response.errors.join("
    "); + else + response.errors = txt.serverError; + addElement(divResponse, "p", response.errors, "", ["error"]); + } + else + addElement(divResponse, "p", txt.serverError, "", ["error"]); + } + } + xhr.setRequestHeader("Content-Type", "application/json"); + if(datas) + { + datas.timeDifference=getTimeDifference(); + // si l'utilisateur a précédement répondu à un quiz, j'ajoute les infos de son résultat : + datas=checkAnswerDatas(datas); + xhr.send(JSON.stringify(datas)); + } + } + } + catch(e) + { + addElement(divResponse, "p", txt.serverError, "", ["error"]); + console.error(e); + } +}); \ No newline at end of file diff --git a/front/src/deconnection.js b/front/src/deconnection.js new file mode 100644 index 0000000..f011120 --- /dev/null +++ b/front/src/deconnection.js @@ -0,0 +1,44 @@ +// -- GESTION DE LA PAGE DE DÉCONNEXION + +/// On se contente ici de supprimer la session stockée côté client + +// Fichier de configuration côté client : +import { apiUrl, availableLangs, theme } from "../../config/instance.js"; +const lang=availableLangs[0]; +const configFrontEnd = require("../../views/"+theme+"/config/"+lang+".js"); + +// Importation des fonctions utile au script : +import { removeLocaly } from "./tools/clientstorage.js"; +import { addElement } from "./tools/dom.js"; +import { helloDev } from "./tools/everywhere.js"; +import { getConfig } from "./tools/users.js"; + +// Dictionnaires : +const txt = require("../../lang/"+lang+"/general"); +const txtUsers = require("../../lang/"+lang+"/user"); + +helloDev(); + +const divResponse = document.getElementById("response"); +let config; +const initialise = async () => +{ + try + { + config = await getConfig(); + if(!config) + addElement(divResponse, "p", txt.serverError, "", ["error"]); + else + { + removeLocaly("user"); + removeLocaly("url"); + removeLocaly("message"); + addElement(divResponse, "p", txtUsers.byebyeMessage, "", ["success"]); + } + } + catch(e) + { + addElement(divResponse, "p", txt.serverError, "", ["error"]); + } +} +initialise(); \ No newline at end of file diff --git a/front/src/deleteValidation.js b/front/src/deleteValidation.js new file mode 100644 index 0000000..d19d93a --- /dev/null +++ b/front/src/deleteValidation.js @@ -0,0 +1,74 @@ +// -- GESTION DE LA PAGE PERMETTANT DE VALIDER UN CHANGEMENT D'EMAIL OU DE MOT DE PASSE + +/// Un token est transmis en paramètre de l'Url. Il a une validité limité dans le temps. +/// Si le token est ok, on valide la suppression, supprime la session de l'utilisateur et affiche un message de confirmation + +// Fichier de configuration côté client : +import { apiUrl, availableLangs, theme } from "../../config/instance.js"; +const lang=availableLangs[0]; +const configFrontEnd = require("../../views/"+theme+"/config/"+lang+".js"); + +// Importation des fonctions utile au script : +import { getLocaly, removeLocaly, saveLocaly } from "./tools/clientstorage.js"; +import { addElement } from "./tools/dom.js"; +import { helloDev } from "./tools/everywhere.js"; +import { getUrlParams } from "./tools/url.js"; +import { checkSession, getConfig, setSession } from "./tools/users.js"; + +// Dictionnaires : +const txt = require("../../lang/"+lang+"/general"); +const txtUsers = require("../../lang/"+lang+"/user"); + +const divResponse = document.getElementById("response"); + +helloDev(); + +let config; +const initialise = async () => +{ + try + { + config = await getConfig(); + if(!config) + addElement(divResponse, "p", txt.serverError, "", ["error"]); + else + { + const datas=getUrlParams(); + if(datas && datas.t!==undefined) + { + const xhr = new XMLHttpRequest(); + xhr.open("GET", apiUrl+config.userRoutes+config.checkDeleteLinkRoute+datas.t); + xhr.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let response=JSON.parse(this.responseText); + if (this.status === 200 && response.message != undefined) + { + addElement(divResponse, "p", response.message, "", ["success"]); + removeLocaly("user"); + } + else if (this.status === 400 && response.errors != undefined) + { + if(Array.isArray(response.errors)) + response.errors = response.errors.join("
    "); + else + response.errors = txt.serverError; + addElement(divResponse, "p", response.errors, "", ["error"]); + } + else + addElement(divResponse, "p", txtUsers.badLinkValidationMessage.replace("#URL", configFrontEnd.accountPage), "", ["error"]); + } + } + xhr.setRequestHeader("Authorization", "Bearer "+datas.t); + xhr.send(); + } + } + } + catch(e) + { + addElement(divResponse, "p", txt.serverError, "", ["error"]); + console.error(e); + } +} +initialise(); \ No newline at end of file diff --git a/front/src/homeManager.js b/front/src/homeManager.js new file mode 100644 index 0000000..ce9a8a9 --- /dev/null +++ b/front/src/homeManager.js @@ -0,0 +1,147 @@ +// -- PAGE D'ACCUEIL POUR LES GESTIONNAIRES + +/// Vérifie que l'utilisateur est bien connecté, a le bon statut et le redirige vers le formulaire d'inscription si ce n'est pas le cas. +/// Si c'est ok, on récupère les stats générales et des dernières 24H et les affiche +/// On liste ensuite les prochains quizs devant être publiés en faisant ressortir ceux devant être complétés + la prochaine date sans quiz +/// Un menu permet à l'utilisateur d'accéder aux formulaires permettant de gérer les quizs et les comptes utilisateurs et abonnements +/// Un message venant d'une autre page peut aussi être à afficher lors du premier chargement. + +/// C'est ici aussi que l'on peut régénérer tout le HTML -> à terme dans homeAdmin ! + +// Fichier de configuration côté client : +import { apiUrl, availableLangs, theme } from "../../config/instance.js"; +const lang=availableLangs[0]; +const configFrontEnd = require("../../views/"+theme+"/config/"+lang+".js"); + +// Fonctions utiles au script : +import { getLocaly, removeLocaly } from "./tools/clientstorage.js"; +import { addElement } from "./tools/dom.js"; +import { helloDev, updateAccountLink } from "./tools/everywhere.js"; +import { dateFormat, isEmpty, replaceAll } from "../../tools/main"; +import { checkSession, getConfig } from "./tools/users.js"; + +// Dictionnaires : +const txt = require("../../lang/"+lang+"/general"); +const txtUsers = require("../../lang/"+lang+"/user"); +const txtQuestionnaire = require("../../lang/"+lang+"/questionnaire"); + +// Principaux éléments du DOM manipulés : +const divMain = document.getElementById("main-content"); +const divMessage = document.getElementById("message"); +const divQuestionnaires = document.getElementById("questionnaires"); + +const btnRegenerate = document.getElementById("wantRegenerate"); + +helloDev(); + +const initialise = async () => +{ + try + { + const config = await getConfig(); + if(!config) + addElement(divResponse, "p", txt.serverError, "", ["error"]); + else + { + const isConnected=await checkSession(["manager", "admin"], "/"+configFrontEnd.connectionPage, { message: txt.notAllowed, color:"error" }); + if(isConnected) + { + const user=getLocaly("user", true); + updateAccountLink(user.status, configFrontEnd); + addElement(divMessage, "h4", txtUsers.welcomeMessage.replace("#NAME", user.name)); + divMain.style.display="block"; + if(!isEmpty(getLocaly("message"))) + { + addElement(divMessage, "p", getLocaly("message", true).message, "", [getLocaly("message", true).color], "", false); + removeLocaly("message"); + } + // Les stats : + const xhrStats = new XMLHttpRequest(); + xhrStats.open("GET", apiUrl+config.userRoutes+config.getAdminStats); + xhrStats.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let response=JSON.parse(this.responseText); + if (this.status === 200) + { + const mapText = + { + NB_USERS_24H : response.nbNewUsers24H, + NB_SUBSCRIPTIONS_24H : response.Subscriptions.nbSubscriptions24H, + NB_USERS_DELETED_24H : response.nbDeletedUsers24H, + NB_ANSWERS_24H : response.Answers.nbAnswers24H, + NB_USERS_TOT : response.nbNewUsersTot, + NB_SUBSCRIPTIONS_TOT : response.Subscriptions.nbSubscriptionsTot, + NB_SUBSCRIPTIONS_PREMIUM : response.Subscriptions.nbSubscriptionsPremium, + NB_ANSWERS_TOT : response.Answers.nbAnswersTot, + NB_USERS_DELETED_TOT : response.nbDeletedUsersTot, + NB_USERS_DELETED_VALIDED : response.nbDeletedUsersWasValided, + NB_USERS_DELETED_PREMIUM : response.nbDeletedUsersTotWasPremium + }; + addElement(divMessage, "p", replaceAll(txt.statsAdmin, mapText), "", "", "", false); + } + } + } + xhrStats.setRequestHeader("Authorization", "Bearer "+user.token); + xhrStats.send(); + + // Les questionnaires bientôt publiés : + const xhrNextQuestionnaires = new XMLHttpRequest(); + xhrNextQuestionnaires.open("GET", apiUrl+config.questionnaireRoutes+config.getListNextQuestionnaires); + xhrNextQuestionnaires.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let response=JSON.parse(this.responseText); + if (this.status === 200 && Array.isArray(response.questionnaires)) + { + let listHTML=""; + for(let i in response.questionnaires) + { + listHTML+="
  • "+dateFormat(response.questionnaires[i].datePublishing, "fr")+": "+response.questionnaires[i].title+""; + if(response.questionnaires[i].isPublishable===false) + listHTML+=" ("+txtQuestionnaire.needBeCompleted+")
  • "; + listHTML+="

    + WikiLerni (logo) + +
  • "; + } + if(response.questionnaires.length!==0) + addElement(divQuestionnaires, "h3", txtQuestionnaire.nextQuestionnairesList.replace("#NB", response.questionnaires.length)); + addElement(divQuestionnaires, "h4", txtQuestionnaire.nextDateWithoutQuestionnaire+dateFormat(response.dateNeeded, "fr"), "", ["information"], "", false); + addElement(divQuestionnaires, "ul", listHTML, "", "", "", false); + } + } + } + xhrNextQuestionnaires.setRequestHeader("Authorization", "Bearer "+user.token); + xhrNextQuestionnaires.send(); + + // Traitement demande régénérer HTML + btnRegenerate.addEventListener("click", function(e) + { + e.preventDefault(); + const xhrRegenerate = new XMLHttpRequest(); + xhrRegenerate.open("GET", apiUrl+config.questionnaireRoutes+"/htmlregenerated"); + xhrRegenerate.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let response=JSON.parse(this.responseText); + if (this.status === 200 && response.message!=undefined) + addElement(divMessage, "p", response.message, "", ["success"], "", false); + else + addElement(divMessage, "p", txt.serverError, "", ["error"], "", false); + } + } + xhrRegenerate.setRequestHeader("Content-Type", "application/json"); + xhrRegenerate.setRequestHeader("Authorization", "Bearer "+user.token); + xhrRegenerate.send(); + }); + } + } + } + catch(e) + { + addElement(divMessage, "p", txt.serverError, "", ["error"]); + console.error(e); + } +} +initialise(); \ No newline at end of file diff --git a/front/src/homeUser.js b/front/src/homeUser.js new file mode 100644 index 0000000..a6a6fbc --- /dev/null +++ b/front/src/homeUser.js @@ -0,0 +1,236 @@ +// -- PAGE D'ACCUEIL DE L'UTILISATEUR + +/// Vérifier que l'utilisateur est bien connecté, a le bon statut et le rediriger vers le formulaire d'inscription si ce n'est pas le cas. +/// Si c'est ok, on récupère ses infos et stats + les derniers quizs auxquels il a accès, mais n'a pas répondu. +/// Un moteur de recherche permet d'obtenir d'autres quizs parmi ceux publiés. +/// Pour l'affichage des listings de quiz, l'API retourne directement du html. +/// Un menu permet à l'utilisateur d'accéder à la modification de ses infos, de son abonnement, etc. +/// Un message venant d'une autre page peut aussi être à afficher lors du premier chargement. + +// Fichier de configuration côté client : +import { apiUrl, availableLangs, theme } from "../../config/instance.js"; +const lang=availableLangs[0]; +const configFrontEnd = require("../../views/"+theme+"/config/"+lang+".js"); + +// Fonctions utiles au script : +import { getLocaly, removeLocaly, saveLocaly } from "./tools/clientstorage.js"; +import { addElement } from "./tools/dom.js"; +import { helloDev, updateAccountLink } from "./tools/everywhere.js"; +import { getDatasFromInputs, setAttributesToInputs } from "./tools/forms.js"; +import { isEmpty, replaceAll } from "../../tools/main"; +import { checkSession, getConfig } from "./tools/users.js"; + +// Dictionnaires : +const txt = require("../../lang/"+lang+"/general"); +const txtUsers = require("../../lang/"+lang+"/user"); +const txtAnwers = require("../../lang/"+lang+"/answer"); +const txtQuestionnaire = require("../../lang/"+lang+"/questionnaire"); + +// Principaux éléments du DOM manipulés : +const divMain= document.getElementById("main-content"); +const divCrash= document.getElementById("crash"); +const divMessage = document.getElementById("message"); +const quizTitle = document.getElementById("quizsTitle"); +const quizIntro = document.getElementById("quizsIntro"); +const quizListing = document.getElementById("quizsList"); +const quizPaginationPrevious = document.getElementById("previous"); +const quizPaginationNext = document.getElementById("next"); +const formSearch = document.getElementById("search"); +const inputBegin = document.getElementById("begin"); +const btnRandom = document.getElementById("random"); + +helloDev(); + +const initialise = async () => +{ + try + { + const config = await getConfig(); + if(!config) + addElement(divCrash, "p", txt.serverError, "", ["error"]); + else + { + // Si l'utilisateur n'est pas connecté, pas la peine d'aller + loin : + const isConnected=await checkSession(["user"], "/"+configFrontEnd.connectionPage, { message: txtUsers.needBeConnected, color:"error" }, window.location); + if(isConnected) + { + const user=getLocaly("user", true); + updateAccountLink(user.status, configFrontEnd); + addElement(divMessage, "h1", txtUsers.welcomeMessage.replace("#NAME", user.name)); + divMain.style.display="block"; + if(!isEmpty(getLocaly("message"))) + { + addElement(divMessage, "p", getLocaly("message", true).message, "", [getLocaly("message", true).color], "", false); + removeLocaly("message"); + } + // Initialisation du formulaire de recherche : + setAttributesToInputs(config, formSearch); + // Les stats : + const xhrStats = new XMLHttpRequest(); + xhrStats.open("GET", apiUrl+config.questionnaireRoutes+config.getStatsAnswers+user.id); + xhrStats.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let response=JSON.parse(this.responseText); + if (this.status === 200 && !isEmpty(response.nbAnswers) && response.nbAnswers!==0)// pas de stats si aucune réponse ! + { + const mapText = + { + NBANSWERS : response.nbAnswers, + NBQUESTIONNAIRES : response.nbQuestionnaires, + NBTOTQUESTIONNAIRES : response.general.nbPublished, + AVGDURATION : response.avgDuration, + AVGCORRECTANSWERS : response.avgCorrectAnswers + }; + addElement(divMessage, "p", replaceAll(txtAnwers.statsUser, mapText), "", "", "", false); + } + } + } + xhrStats.setRequestHeader("Authorization", "Bearer "+user.token); + xhrStats.send(); + + // Par défaut, on affiche des derniers quizs proposés sans réponse : + const xhrLastQuizs = new XMLHttpRequest(); + xhrLastQuizs.open("GET", apiUrl+config.questionnaireRoutes+config.getQuestionnairesWithoutAnswer+""+user.id+"/"+0+"/"+configFrontEnd.nbQuestionnairesUserHomePage+"/html"); + xhrLastQuizs.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let response=JSON.parse(this.responseText); + if (this.status === 200) + { + if(response.nbTot===0) + addElement(quizIntro, "p", txtAnwers.noQuestionnaireWithoudAnswer, "", ["success"]); + else if(response.html) + { + addElement(quizIntro, "p", txtAnwers.nbQuestionnaireWithoudAnswer.replace("#NB", response.questionnaires.length), "", ["info"]); + quizListing.innerHTML=response.html; + window.location.hash="";// sinon les hash s'enchaînent... + window.location.assign("#quizsTitle"); + } + else + addElement(quizs, "p", txt.serverError, "", ["error"]);// revoir si intérêt d'afficher quelque chose + } + else + addElement(quizs, "p", txt.serverError, "", ["error"]); // idem + } + } + xhrLastQuizs.setRequestHeader("Authorization", "Bearer "+user.token); + xhrLastQuizs.send(); + + // Traitement du lancement d'une recherche + // La recherche peut être lancée via la bouton submit ou un lien de pagination + const sendSearch = (type="search") => + { + quizTitle.innerHTML=txtQuestionnaire.searchResultTitle; + quizListing.innerHTML=""+""; + let datas=getDatasFromInputs(formSearch); + const xhrSearch = new XMLHttpRequest(); + if(type=="search") + xhrSearch.open("POST", config.apiUrl+config.questionnaireRoutes+config.searchQuestionnairesRoute); + else if(type=="random") + xhrSearch.open("POST", config.apiUrl+config.questionnaireRoutes+"/getrandom");// revoir : changer par la variable getRandomQuestionnairesRoute du fichier de config + xhrSearch.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let response=JSON.parse(this.responseText); + if (this.status === 200 && !isEmpty(response.nbTot)) + { + if(response.nbTot===0) + { + addElement(quizIntro, "p", txtQuestionnaire.notFound, "", ["info"]); + window.location.hash="";// sinon les hash s'enchaînent... + window.location.assign("#quizsTitle"); + } + else if(response.html) + { + addElement(quizIntro, "p", txtQuestionnaire.searchWithResult.replace("#NB", response.nbTot) , "", ["success"]); + quizListing.innerHTML=response.html; + window.location.hash=""; + window.location.assign("#quizsTitle"); + // Pagination nécessaire ? + // on commence par vider... + quizPaginationPrevious.innerHTML=""; + quizPaginationNext.innerHTML=""; + if(response.begin != 0)// peut retourner "0" et non 0 ! + { + addElement(quizPaginationPrevious, "a", "<< "+txt.previousPage , "previousRes", ["button"], { href: "#search" }); // revoir, les "<<" pourraient être gérées par le CSS + const previousPage=document.getElementById("previousRes"); + // le retour à la page précédente peut se faire en cliquant sur le bouton ou via l'historique du navigateur + const goBackRes = () => + { + let newBegin=response.begin-configFrontEnd.nbQuestionnairesUserHomePage; + if(newBegin<0) // ne devrait pas être possible.. + newBegin=0; + document.getElementById("begin").value=newBegin; + sendSearch(); + window.location.hash=""; + window.location.assign("#quizsTitle");// pour remonter + } + previousPage.addEventListener("click", function(e) + { + e.preventDefault(); + goBackRes(); + }); + /* semble provoqué bug ??? + window.onpopstate = function(e) + { + e.preventDefault(); + goBackRes(); + };*/ + } + if(response.end < (response.nbTot-1))// -1, car tableau commence à 0 ! + { + addElement(quizPaginationNext, "a", txt.nextPage+ " >>", "nextRes", ["button"], { href: "#search" }, false); + const nextPage=document.getElementById("nextRes"); + nextPage.addEventListener("click", function(e) + { + e.preventDefault(); + document.getElementById("begin").value=response.end+1; + sendSearch(); + window.location.hash="";// sinon les hash s'enchaînent... + window.location.assign("#quizsTitle"); // pour remonter + }); + } + } + else + addElement(quizs, "p", txt.serverError, "", ["error"]); + } + else + addElement(quizs, "p", txt.serverError, "", ["error"]); + } + } + xhrSearch.setRequestHeader("Content-Type", "application/json"); + xhrSearch.setRequestHeader("Authorization", "Bearer "+user.token); + if(datas) + { + datas.output="html"; + xhrSearch.send(JSON.stringify(datas)); + } + } + + btnRandom.addEventListener("click", function(e) + { + e.preventDefault(); + document.getElementById("begin").value=0; + sendSearch("random"); + }); + + formSearch.addEventListener("submit", function(e) + { + e.preventDefault(); + document.getElementById("begin").value=0; + sendSearch(); + }); + } + } + } + catch(e) + { + console.error(e); + addElement(divCrash, "p", txt.serverError, "", ["error"]); + } +} +initialise(); \ No newline at end of file diff --git a/front/src/index.js b/front/src/index.js new file mode 100644 index 0000000..635b38f --- /dev/null +++ b/front/src/index.js @@ -0,0 +1,64 @@ +// -- SCRIPT DE BASE APPELÉ DANS LES PAGES TYPE ACCUEIL DU SITE + +// Fichier de configuration tirés du backend : +import { availableLangs, theme } from "../../config/instance.js"; +const lang=availableLangs[0]; + +const configTemplate = require("../../views/"+theme+"/config/"+lang+".js"); + +import { getLocaly } from "./tools/clientstorage.js"; +import { helloDev, updateAccountLink } from "./tools/everywhere.js"; +import { checkSession } from "./tools/users.js"; + +helloDev(); + +// Test de connexion de l'utilisateur pour adapter le lien du menu... +const initialise = async () => +{ + try + { + const isConnected=await checkSession(); + if(isConnected) + { + // on change le lien du compte en haut + const user=getLocaly("user", true); + updateAccountLink(user.status, configTemplate); + } + else + { + // chargement de matomo + var _paq = window._paq = window._paq || []; + //ajout cnil : + _paq.push([function() + { + var self = this; + function getOriginalVisitorCookieTimeout() + { + var now = new Date(), + nowTs = Math.round(now.getTime() / 1000), + visitorInfo = self.getVisitorInfo(); + var createTs = parseInt(visitorInfo[2]); + var cookieTimeout = 33696000; // 13 mois en secondes + var originalTimeout = createTs + cookieTimeout - nowTs; + return originalTimeout; + } + this.setVisitorCookieTimeout( getOriginalVisitorCookieTimeout() ); + }]); + //--fin ajout cnil + _paq.push(['trackPageView']); + _paq.push(['enableLinkTracking']); + (function() { + var u="https://stats.le-fab-lab.com/"; + _paq.push(['setTrackerUrl', u+'matomo.php']); + _paq.push(['setSiteId', '5']); + var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; + g.type='text/javascript'; g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s); + })(); + } + } + catch(e) + { + console.error(e); + } +} +initialise(); \ No newline at end of file diff --git a/front/src/loginLink.js b/front/src/loginLink.js new file mode 100644 index 0000000..72a7d1e --- /dev/null +++ b/front/src/loginLink.js @@ -0,0 +1,99 @@ +// -- PAGE PERMETTANT DE TESTER UN LIEN DE CONNEXION REÇU PAR E-MAIL + +/// Un token est transmis en paramètre de l'Url. Il a une validité limité dans le temps. +/// Dans ce cas, on peut rediriger l'utilisateur vers la page de connexion pour obtenir un nouveau lien de validation +/// Si le token est ok, on crée une session suivant la durée retournée par l'API et redirige l'utilisateur vers sa page d'accueil +/// Un résultat de quiz peut aussi avoir été enregistré côté client et est alors à transmettre à l'API. +/// Si l'utilisateur a déjà une session active valide, c'est qu'il a déjà cliqué sur le lien. On le redirige également vers sa page d'accueil. + +// Fichier de configuration côté client : +import { apiUrl, availableLangs, theme } from "../../config/instance.js"; +const lang=availableLangs[0]; +const configFrontEnd = require("../../views/"+theme+"/config/"+lang+".js"); + +// Importation des fonctions utile au script : +import { getLocaly, removeLocaly, saveLocaly } from "./tools/clientstorage.js"; +import { addElement } from "./tools/dom.js"; +import { helloDev } from "./tools/everywhere.js"; +import { isEmpty } from "../../tools/main"; +import { getUrlParams } from "./tools/url.js"; +import { checkAnswerDatas, checkSession, getConfig, getTimeDifference, setSession } from "./tools/users.js"; + +// Dictionnaires : +const txt = require("../../lang/"+lang+"/general"); +const txtUsers = require("../../lang/"+lang+"/user"); + +const divResponse = document.getElementById("response"); + +helloDev(); + +let config; +const initialise = async () => +{ + try + { + config = await getConfig(); + if(!config) + addElement(divResponse, "p", txt.serverError, "", ["error"]); + else + { + // si l'utilisateur est déjà connecté, pas la peine d'aller + loin : + const isConnected=await checkSession(); + if(isConnected) + { + saveLocaly("message", { message: txtUsers.alreadyConnected, color:"information" });// pour l'afficher sur la page suivante + const user=getLocaly("user", true); + const homePage=user.status+"HomePage"; + window.location.assign("/"+configFrontEnd[homePage]); + } + else + { + let datas=getUrlParams(); + if(datas && datas.t!==undefined) + { + const xhr = new XMLHttpRequest(); + xhr.open("POST", apiUrl+config.userRoutes+config.connectionWithLinkRoute); + xhr.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let response=JSON.parse(this.responseText); + if (this.status === 200 && !isEmpty(response.userId) && !isEmpty(response.connexionTime) && !isEmpty(response.token)) + { + let connexionMaxTime=Date.now(); + if(response.connexionTime.endsWith("days")) + connexionMaxTime+=parseInt(response.connexionTime,10)*24*3600*1000; + else + connexionMaxTime+=parseInt(response.connexionTime,10)*3600*1000; + setSession(response.userId, response.token, connexionMaxTime); + removeLocaly("lastAnswer");// ! important pour ne pas enregister plusieurs fois le résultat + addElement(divResponse, "p", txtUsers.validationMessage, "", ["success"]);// au cas où blocage redirection + window.location.assign("/"+configFrontEnd.userHomePage);// connexion par lien ne concerne que les simples "user" + } + else if ((this.status === 401 || this.status === 403) && response.errors != undefined) + { + if(Array.isArray(response.errors)) + response.errors = response.errors.join("
    "); + else + response.errors = txt.serverError; + addElement(divResponse, "p", response.errors, "", ["error"]); + } + else + addElement(divResponse, "p", txtUsers.badLinkValidationMessage.replace("#URL", configFrontEnd.connectionPage), "", ["error"]); + } + } + datas.timeDifference=getTimeDifference(config); + // si l'utilisateur a précédement répondu à un quiz, j'ajoute les infos de son résultat : + datas=checkAnswerDatas(datas); + xhr.setRequestHeader("Content-Type", "application/json"); + xhr.send(JSON.stringify(datas)); + } + } + } + } + catch(e) + { + addElement(divResponse, "p", txt.serverError, "", ["error"]); + } +} +initialise(); \ No newline at end of file diff --git a/front/src/manageQuestionnaires.js b/front/src/manageQuestionnaires.js new file mode 100644 index 0000000..4f7a5f0 --- /dev/null +++ b/front/src/manageQuestionnaires.js @@ -0,0 +1,706 @@ +// -- GESTION DU FORMULAIRE PERMETTANT DE SAISIR / ÉDITER LES QUIZS ET LEURS DÉPENDANCES (LIENS, IMAGES, TAGS, ETC.) + +/// Vérifie que l'utilisateur est bien connecté, a le bon statut et le redirige vers le formulaire d'inscription si ce n'est pas le cas. +/// Si c'est ok, propose un moteur de recherche permettant de chercher un quiz +/// Si un id est passé par l'url on affiche les informations du quiz dans un formulaire permettant de l'éditer/supprimer avec une liste des éléments liés (liens, illustrations, questions...) pouvant eux-mêmes être édités/supprimés. +/// Si le nombre max configuré pour chacun de ses éléments n'est pas atteint, il est aussi proposé d'ajouter un nouvel élément. +/// Sinon pas d'id passé par l'url, on affiche un formulaire vide permettant d'en saisir un nouveau avec ses tags. + +// Fichier de configuration côté client : +import { apiUrl, availableLangs, theme } from "../../config/instance.js"; +const lang=availableLangs[0]; +const configFrontEnd = require("../../views/"+theme+"/config/"+lang+".js"); + +// Fonctions utiles au script : !! revoir quand le reste sera fini pour vérifier si tout est utile +import { getLocaly, removeLocaly, saveLocaly } from "./tools/clientstorage.js"; +import { addElement } from "./tools/dom.js"; +import { helloDev, updateAccountLink } from "./tools/everywhere.js"; +import { empyAndHideForm, empyForm, getDatasFromInputs, setAttributesToInputs } from "./tools/forms.js"; +import { dateFormat, isEmpty, replaceAll } from "../../tools/main"; +import { getUrlParams } from "./tools/url.js"; +import { checkSession, getConfig } from "./tools/users.js"; + +// Dictionnaires : +const txt = require("../../lang/"+lang+"/general"); +const txtUsers = require("../../lang/"+lang+"/user"); +const txtQuestionnaire = require("../../lang/"+lang+"/questionnaire"); +const txtQuestion = require("../../lang/"+lang+"/question"); +const txtLink = require("../../lang/"+lang+"/link"); +const txtIllustration = require("../../lang/"+lang+"/illustration"); + +helloDev(); + +// Principaux éléments du DOM manipulés : +const divMain = document.getElementById("main-content"); +const divMessage = document.getElementById("message"); +const divResponse = document.getElementById("response"); +const formQuestionnaire = document.getElementById("questionnaires"); +const inputClassification = document.getElementById("classification"); +const helpClassification = document.getElementById("helpClassification"); +const helpPublishingAt = document.getElementById("helpPublishingAt"); +const deleteCheckBox = document.getElementById("deleteOkLabel"); +const btnNewQuestionnaire = document.getElementById("wantNewQuestionnaire"); +const btnPreviewQuestionnaire = document.getElementById("previewQuestionnaire"); + +const divQuestionnaires = document.getElementById("questionnairesList"); + +const formSearch = document.getElementById("search"); +const divSearchResult = document.getElementById("searchResult"); + +const formLink = document.getElementById("links"); +const formIllustration = document.getElementById("illustrations"); +const formQuestion = document.getElementById("questions"); +const divLinks = document.getElementById("linksList"); +const divIllustrations = document.getElementById("illustrationsList"); +const divQuestions = document.getElementById("questionsList"); + +const initialise = async () => +{ + try + { + const config = await getConfig(); + if(!config) + addElement(divMessage, "p", txt.serverError, "", ["error"]); + else + { + const isConnected=await checkSession(["manager", "admin"], "/"+configFrontEnd.connectionPage, { message: txtUsers.needBeConnected, color:"error" }, window.location); + if(isConnected) + { + divMain.style.display="block"; + if(!isEmpty(getLocaly("message"))) + { + addElement(divMessage, "p", getLocaly("message", true).message, "", [getLocaly("message", true).color], "", false); + removeLocaly("message"); + } + const user=getLocaly("user", true); + updateAccountLink(user.status, configFrontEnd); + + // Initialisation du formulaire de recherche : + setAttributesToInputs(config, formSearch); + + // Initialise le formulaire permettant de mettre à jour les infos de base du questionnaire : + setAttributesToInputs(config.Questionnaire, formQuestionnaire); + // Case de suppression cachée par défaut, car inutile pour formulaire de création + deleteCheckBox.style.display="none"; + + // Fonction vidant et cachant tous les formulaires annexes + const hideAllForms = () => + { + empyAndHideForm(formLink); + if(txtLink.defaultValue!=0) + document.getElementById("anchor").value=txtLink.defaultValue; + empyAndHideForm(formIllustration); + empyAndHideForm(formQuestion); + } + hideAllForms(); + + // Affiche les infos connues concernant les liens + const showLinkInfos = (Links) => + { + addElement(divLinks, "h4", txtLink.introTitle);// remplace l'existant dans divLinks + let listLinks=""; + for(let i in Links) + listLinks+="
  • "+Links[i].anchor+" | "+txt.updateBtnTxt+" | "+txt.deleteBtnTxt+"
  • "; + if(listLinks==="") + listLinks="
  • "+txtLink.introNoLink+"
  • "; + addElement(divLinks, "ul", listLinks, "", ["information"], "", false);// à intégrer dans le DOM pour pouvoir ajouter des addEventListener ensuite + for(let i in Links) + { + document.getElementById("#updateLink"+Links[i].id).addEventListener("click", function(e) + { + e.preventDefault(); + showFormLinkInfos(Links[i]); + window.location.assign("#links"); + }); + document.getElementById("#deleteLink"+Links[i].id).addEventListener("click", function(e) + { + e.preventDefault(); + showFormLinkInfos(Links[i]); + formLink.elements["deleteOk"].value=true; + sendLinkForm(); + }); + } + if(config.nbLinksMax > Links.length || config.nbLinksMax===0) + { + if(Links.length < config.nbLinksMin) + addElement(divLinks, "a", txt.addBtnTxt, "#newLink", ["error"], { href:"#newLink" }, false); + else + addElement(divLinks, "a", txt.addBtnTxt, "#newLink", ["information"], { href:"#newLink" }, false); + document.getElementById("#newLink").addEventListener("click", function(e) + { + e.preventDefault(); + hideAllForms(); + formLink.style.display="block"; + formLink.elements["QuestionnaireId"].value=formQuestionnaire.elements["id"].value; + window.location.assign("#links"); + setAttributesToInputs(config.Link, formLink); + }); + } + } + + // Affiche les infos connues concernant les illustrations + const showIllustrationInfos = (Illustrations) => + { + addElement(divIllustrations, "h4", txtIllustration.introTitle);// remplace l'existant dans divIllustrations + let listIllustrations=""; + for(let i in Illustrations) + listIllustrations+="
  • "+txtIllustration.defaultAlt+" | "+txt.updateBtnTxt+" | "+txt.deleteBtnTxt+"
  • "; + if(listIllustrations==="") + listIllustrations="
  • "+txtIllustration.introNoIllustration+"
  • "; + addElement(divIllustrations, "ul", listIllustrations, "", ["information"], "", false);// à intégrer dans le DOM pour pouvoir ajouter des addEventListener ensuite + for(let i in Illustrations) + { + document.getElementById("#updateIllustration"+Illustrations[i].id).addEventListener("click", function(e) + { + e.preventDefault(); + showFormIllustrationInfos(Illustrations[i]); + window.location.assign("#illustrations"); + }); + document.getElementById("#deleteIllustration"+Illustrations[i].id).addEventListener("click", function(e) + { + e.preventDefault(); + showFormIllustrationInfos(Illustrations[i]); + formIllustration.elements["deleteOk"].value=true; + sendIllustrationForm(); + }); + } + if(config.nbIllustrationsMax > Illustrations.length || config.nbIllustrationsMax===0) + { + if(Illustrations.length < config.nbIllustrationsMin) + addElement(divIllustrations, "a", txt.addBtnTxt, "#newIllustration", ["error"], { href:"#newIllustration" }, false); + else + addElement(divIllustrations, "a", txt.addBtnTxt, "#newIllustration", ["information"], { href:"#newIllustration" }, false); + document.getElementById("#newIllustration").addEventListener("click", function(e) + { + e.preventDefault(); + hideAllForms(); + formIllustration.style.display="block"; + formIllustration.elements["QuestionnaireId"].value=formQuestionnaire.elements["id"].value; + window.location.assign("#illustrations"); + setAttributesToInputs(config.Illustration, formIllustration); + }); + } + } + + // Affiche les infos connues concernant les questions + const showQuestionInfos = (Questions) => + { + addElement(divQuestions, "h4", txtQuestion.introTitle);// remplace l'existant dans divQuestions + let listQuestions=""; + for(let i in Questions) + listQuestions+="
  • "+Questions[i].Question.text+" | "+txt.updateBtnTxt+" | "+txt.deleteBtnTxt+"
  • "; + if(listQuestions==="") + listQuestions="
  • "+txtQuestion.introNoQuestion+"
  • "; + addElement(divQuestions, "ul", listQuestions, "", ["information"], "", false);// à intégrer dans le DOM pour pouvoir ajouter des addEventListener ensuite + for(let i in Questions) + { + document.getElementById("#updateQuestion"+Questions[i].Question.id).addEventListener("click", function(e) + { + e.preventDefault(); + showFormQuestionInfos(Questions[i]); + window.location.assign("#links"); + }); + document.getElementById("#deleteQuestion"+Questions[i].Question.id).addEventListener("click", function(e) + { + e.preventDefault(); + showFormQuestionInfos(Questions[i]); + formQuestion.elements["deleteOk"].value=true; + sendQuestionForm(); + }); + } + + console.log(config.nbQuestionsMax); + console.log(Questions.length); + + + if(config.nbQuestionsMax > Questions.length || config.nbQuestionsMax===0) + { + if(Questions.length < config.nbQuestionsMin) + addElement(divQuestions, "a", txt.addBtnTxt, "#newQuestion", ["error"], { href:"#newQuestion" }, false); + else + addElement(divQuestions, "a", txt.addBtnTxt, "#newQuestion", ["information"], { href:"#newQuestion" }, false); + document.getElementById("#newQuestion").addEventListener("click", function(e) + { + e.preventDefault(); + hideAllForms(); + formQuestion.style.display="block"; + formQuestion.elements["QuestionnaireId"].value=formQuestionnaire.elements["id"].value; + formQuestion.elements["rank"].value=config.Question.rank.defaultValue; + window.location.assign("#questions"); + setAttributesToInputs(config.Question, formQuestion); + }); + } + } + + // Fonction affichant les infos d'un lien dans le formulaire adhoc + const showFormLinkInfos = (Link) => + { + // on commence par cacher et vider tous les formulaires annexes + hideAllForms(); + // puis on affiche celui dont l'id est passé avec ses données connues + formLink.style.display="block"; + for(let data in Link) + { + if(formLink.elements[data]!==undefined) + formLink.elements[data].value=Link[data]; + } + // + les contraintes de champ : + setAttributesToInputs(config.Link, formLink); + } + + // Fonction affichant les infos d'une illustration dans le formulaire adhoc + const showFormIllustrationInfos = (Illustration) => + { + // on commence par cacher et vider tous les formulaires annexes + hideAllForms(); + // puis on affiche celui dont l'id est passé avec ses données connues + formIllustration.style.display="block"; + for(let data in Illustration) + { + if(formIllustration.elements[data]!==undefined) + formIllustration.elements[data].value=Illustration[data]; + } + // + les contraintes de champ : + setAttributesToInputs(config.Illustration, formIllustration); + // sauf le champ file qui n'est plus requis quand un fichier existe déjà ! + formIllustration.elements["image"].removeAttribute("required"); + } + + // Fonction affichant les infos d'une question + ses réponses possibles dans le formulaire adhoc + const showFormQuestionInfos = (Question) => + { + // on commence par cacher et vider tous les formulaires annexes + hideAllForms(); + // puis on affiche celui dont l'id est passé avec ses données connues + formQuestion.style.display="block"; + for(let data in Question.Question) + { + if(formQuestion.elements[data]!==undefined) + formQuestion.elements[data].value=Question.Question[data]; + } + for(let data in Question.Choices) + { + if(formQuestion.elements["choiceText"+data]!==undefined) + { + formQuestion.elements["choiceText"+data].value=Question.Choices[data].text; + if(Question.Choices[data].isCorrect==true) + formQuestion.elements["choiceIsCorrect"+data].checked=true; + formQuestion.elements["idChoice"+data].value=Question.Choices[data].id; + } + } + // + les contraintes de champ : + setAttributesToInputs(config.Question, formQuestion); + } + + // Fonction affichant les infos connues concernant un questionnaire et ses dépendances + const showFormQuestionnaireInfos = (id) => + { + const xhrGetInfos = new XMLHttpRequest(); + xhrGetInfos.open("GET", apiUrl+config.questionnaireRoutes+config.getQuestionnaireRoutes+"/"+id); + xhrGetInfos.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let response=JSON.parse(this.responseText); + if (this.status === 200 && response.Questionnaire != undefined) + { + formQuestionnaire.reset();// pour ne pas garder données déjà affichées si vide dans ce qui est retourné + for(let data in response.Questionnaire) + { + if(formQuestionnaire.elements[data]!==undefined) + { + if(data==="publishingAt" && response.Questionnaire[data]!==null) + formQuestionnaire.elements[data].value=dateFormat(response.Questionnaire[data], "form");// !! revoir car format pouvant poser soucis si navigateur ne gère pas les champs de type "date" + else + formQuestionnaire.elements[data].value=response.Questionnaire[data]; + } + } + deleteCheckBox.style.display="block"; + } + if(response.Tags != undefined) + { + let classification=""; + for(let i in response.Tags) + { + if(i==0) + classification+=response.Tags[i].name; + else + classification+=","+response.Tags[i].name; + } + formQuestionnaire.elements["classification"].value=classification; + } + divLinks.style.display="block"; + divQuestions.style.display="block"; + divIllustrations.style.display="block"; + if(response.Links != undefined) + showLinkInfos(response.Links); + if(response.Questions != undefined) + showQuestionInfos(response.Questions); + if(response.Illustrations != undefined) + showIllustrationInfos(response.Illustrations); + helpPublishingAt.style.display="none";// info utile pour "placer" un nouveau quiz + // à revoir : remplacer lien pour un bouton + reset complet du formulaire, y compris champs hidden : + btnNewQuestionnaire.style.display="block"; + btnNewQuestionnaire.setAttribute("href", configFrontEnd.questionnairesManagementPage); + btnPreviewQuestionnaire.style.display="block"; + if(response.Questionnaire["isPublished"]===false) + btnPreviewQuestionnaire.setAttribute("href", apiUrl+config.questionnaireRoutes+config.previewQuestionnaireRoutes+"/"+id+"/"+user.token); + else + btnPreviewQuestionnaire.setAttribute("href", config.siteUrl+config.publishedQuestionnaireRoutes+response.Questionnaire["slug"]+".html"); + } + } + xhrGetInfos.send(); + } + + // Si un id est passé par l'url, on essaye d'afficher le questionnaire : + let urlDatas=getUrlParams(); + if(urlDatas && urlDatas.id!==undefined) + showFormQuestionnaireInfos(urlDatas.id); + + // Traitement du lancement d'une recherche + formSearch.addEventListener("submit", function(e) + { + e.preventDefault(); + let datas=getDatasFromInputs(formSearch); + const xhrSearch = new XMLHttpRequest(); + xhrSearch.open("POST", apiUrl+config.questionnaireRoutes+config.searchAdminQuestionnairesRoute); + xhrSearch.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let response=JSON.parse(this.responseText); + if (this.status === 200 && Array.isArray(response)) + { + if(response.length===0) + addElement(divSearchResult, "p", txtQuestionnaire.notFound, "", ["information"]); + else + { + let selectHTML=""; + for(let i in response) + selectHTML+=""; + addElement(divSearchResult, "select", selectHTML, "selectSearch"); + const searchSelect=document.getElementById("selectSearch"); + searchSelect.addEventListener("change", function() + { + if(searchSelect.value!=="") + showFormQuestionnaireInfos(searchSelect.value); + }); + } + } + else + addElement(divSearchResult, "p", txt.serverError, "", ["error"]); + } + } + xhrSearch.setRequestHeader("Content-Type", "application/json"); + xhrSearch.setRequestHeader("Authorization", "Bearer "+user.token); + if(datas) + xhrSearch.send(JSON.stringify(datas)); + }); + + // Les questionnaires bientôt publiés. Dans une fonction car devant être rechargé. + const showNextQuestionnaires = () => + { + const xhrNextQuestionnaires = new XMLHttpRequest(); + xhrNextQuestionnaires.open("GET", apiUrl+config.questionnaireRoutes+config.getListNextQuestionnaires); + xhrNextQuestionnaires.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let response=JSON.parse(this.responseText); + if (this.status === 200 && Array.isArray(response.questionnaires)) + { + let listHTML=""; + for(let i in response.questionnaires) + { + listHTML+="
  • "+dateFormat(response.questionnaires[i].datePublishing, "fr")+": "+response.questionnaires[i].title+""; + if(response.questionnaires[i].isPublishable===false) + listHTML+=" ("+txtQuestionnaire.needBeCompleted+")
  • "; + listHTML+=""; + } + if(response.questionnaires.length!==0) + addElement(divQuestionnaires, "h3", txtQuestionnaire.nextQuestionnairesList.replace("#NB", response.questionnaires.length)); + addElement(helpPublishingAt, "em", txtQuestionnaire.nextDateWithoutQuestionnaire+dateFormat(new Date(response.dateNeeded), "fr")); + addElement(divQuestionnaires, "ul", listHTML, "", "", "", false); + for(let i in response.questionnaires) + { + document.getElementById("questionnaire_"+response.questionnaires[i].id).addEventListener("click", function(e) + { + e.preventDefault(); + showFormQuestionnaireInfos(e.target.id.split("_")[1]); + window.location.assign("#questionnaires"); + }); + } + } + } + } + xhrNextQuestionnaires.setRequestHeader("Authorization", "Bearer "+user.token); + xhrNextQuestionnaires.send(); + } + showNextQuestionnaires(); + + // Aide saisie classement du quiz + inputClassification.addEventListener("input", function(e) + { + divResponse.innerHTML=""; + const tags=inputClassification.value.split(","); + tags.reverse(); + const lastTag=tags[0].trim(); + if(lastTag.length >= 2) + { + // à revoir : importer la liste des tags lors de l'initialisation pour éviter les appels multiples + // mais dans ce cas actualiser cette liste après chaque mise à jour. + const xhrSearchTags = new XMLHttpRequest(); + xhrSearchTags.open("POST", apiUrl+config.questionnaireRoutes+config.tagsSearchRoute); + xhrSearchTags.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let response=JSON.parse(this.responseText); + if (this.status === 200 && Array.isArray(response)) + { + helpClassification.innerHTML=""; + for(let i in response) + { + addElement(helpClassification, "a", response[i].name, "#tag"+response[i].id, ["information"], { href:"#tag"+response[i].id }, false); + document.getElementById("#tag"+response[i].id).addEventListener("click", function(e) + { + e.preventDefault(); + tags[0]=e.target.innerHTML; + tags.reverse(); + inputClassification.value=tags.join(","); + }); + + } + } + } + } + xhrSearchTags.setRequestHeader("Content-Type", "application/json"); + xhrSearchTags.setRequestHeader("Authorization", "Bearer "+user.token); + xhrSearchTags.send(JSON.stringify({search: lastTag})); + } + }); + + // Traitement de l'envoi du formulaire des infos de base du quiz + formQuestionnaire.addEventListener("submit", function(e) + { + e.preventDefault(); + divResponse.innerHTML=""; + let datas=getDatasFromInputs(formQuestionnaire); + const xhrQuestionnaireDatas = new XMLHttpRequest(); + if(!isEmpty(datas.id) && (datas.deleteOk!==undefined)) + xhrQuestionnaireDatas.open("DELETE", apiUrl+config.questionnaireRoutes+"/"+datas.id); + else if(!isEmpty(datas.id)) + xhrQuestionnaireDatas.open("PUT", apiUrl+config.questionnaireRoutes+"/"+datas.id); + else + xhrQuestionnaireDatas.open("POST", apiUrl+config.questionnaireRoutes+"/"); + xhrQuestionnaireDatas.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let response=JSON.parse(this.responseText); + if (this.status === 201 && response.id!=undefined) + { + addElement(divResponse, "p", txt.addOkMessage, "", ["success"]); + datas.id=response.id; + showNextQuestionnaires();// peut avoir évolué suivant ce qui s'est passé + } + else if (this.status === 200 && response.message!=undefined) + { + if(Array.isArray(response.message)) + response.message = response.message.join("
    "); + else + response.message = response.message; + addElement(divResponse, "p", response.message, "", ["success"]); + showNextQuestionnaires();// peut avoir évolué suivant ce qui s'est passé + } + else if (response.errors) + { + if(Array.isArray(response.errors)) + response.errors = response.errors.join("
    "); + else + response.errors = txt.serverError; + addElement(divResponse, "p", response.errors, "", ["error"]); + } + else + addElement(divResponse, "p", txt.serverError, "", ["error"]); + if(datas.deleteOk===undefined) + showFormQuestionnaireInfos(datas.id); + else + formQuestionnaire.reset(); + } + } + xhrQuestionnaireDatas.setRequestHeader("Content-Type", "application/json"); + xhrQuestionnaireDatas.setRequestHeader("Authorization", "Bearer "+user.token); + if(datas) + xhrQuestionnaireDatas.send(JSON.stringify(datas)); + }); + + // L'envoi des données d'un lien peut être généré par le bouton formulaire ou par le lien supprimer + const sendLinkForm = () => + { + const divResponseLink=document.getElementById("responseLink"); + divResponseLink.innerHTML=""; + let datas=getDatasFromInputs(formLink); + const xhrLinkDatas = new XMLHttpRequest(); + if(!isEmpty(datas.id) && (!isEmpty(datas.deleteOk))) + xhrLinkDatas.open("DELETE", apiUrl+config.linksRoute+datas.id); + else if(!isEmpty(datas.id)) + xhrLinkDatas.open("PUT", apiUrl+config.linksRoute+datas.id); + else + xhrLinkDatas.open("POST", apiUrl+config.linksRoute); + xhrLinkDatas.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let response=JSON.parse(this.responseText); + if ((this.status === 200 || this.status === 201) && response.message!=undefined && response.questionnaire!=undefined) + { + if(Array.isArray(response.message)) + response.message = response.message.join("
    "); + else + response.message = response.message; + showLinkInfos(response.questionnaire.Links);// le serveur me retourne une version actualisée de la liste des liens + addElement(divLinks, "p", response.message, "", ["success"], "", false); + hideAllForms(); + window.location.assign("#linksList"); + showNextQuestionnaires();// peut avoir évolué suivant ce qui s'est passé + } + else if (response.errors) + { + if(Array.isArray(response.errors)) + response.errors = response.errors.join("
    "); + else + response.errors = txt.serverError; + addElement(divResponseLink, "p", response.errors, "", ["error"]); + } + else + addElement(divResponseLink, "p", txt.serverError, "", ["error"]); + } + } + xhrLinkDatas.setRequestHeader("Content-Type", "application/json"); + xhrLinkDatas.setRequestHeader("Authorization", "Bearer "+user.token); + xhrLinkDatas.send(JSON.stringify(datas)); + } + formLink.addEventListener("submit", function(e) + { + e.preventDefault(); + sendLinkForm(); + }); + + // L'envoi des données d'un lien peut être généré par le bouton formulaire ou par le lien supprimer + const sendIllustrationForm = () => + { + const divResponseIllustration=document.getElementById("responseIllustration"); + divResponseIllustration.innerHTML=""; + let datas=getDatasFromInputs(formIllustration); + let datasWithFiles=new FormData(formIllustration); // il me manque les informations du fichier avec ma fonction getDatasFromInputs + const xhrIllustrationDatas = new XMLHttpRequest(); + if(!isEmpty(datas.id) && (!isEmpty(datas.deleteOk))) + xhrIllustrationDatas.open("DELETE", apiUrl+config.illustrationsRoute+datas.id); + else if(!isEmpty(datas.id)) + xhrIllustrationDatas.open("PUT", apiUrl+config.illustrationsRoute+datas.id); + else + xhrIllustrationDatas.open("POST", apiUrl+config.illustrationsRoute); + xhrIllustrationDatas.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let response=JSON.parse(this.responseText); + if ((this.status === 200 || this.status === 201) && response.message!=undefined && response.questionnaire!=undefined) + { + if(Array.isArray(response.message)) + response.message = response.message.join("
    "); + else + response.message = response.message; + showIllustrationInfos(response.questionnaire.Illustrations);// le serveur me retourne une version actualisée de la liste des liens + addElement(divIllustrations, "p", response.message, "", ["success"], "", false); + hideAllForms(); + window.location.assign("#illustrationsList"); + showNextQuestionnaires();// peut avoir évolué suivant ce qui s'est passé + } + else if (response.errors) + { + if(Array.isArray(response.errors)) + response.errors = response.errors.join("
    "); + else + response.errors = txt.serverError; + addElement(divResponseIllustration, "p", response.errors, "", ["error"]); + } + else + addElement(divResponseIllustration, "p", txt.serverError, "", ["error"]); + } + } + xhrIllustrationDatas.setRequestHeader("Authorization", "Bearer "+user.token); + xhrIllustrationDatas.send(datasWithFiles); + } + formIllustration.addEventListener("submit", function(e) + { + e.preventDefault(); + sendIllustrationForm(); + }); + + + // L'envoi des données d'une question et de ses réponse qui peut être généré par le bouton submit ou par le lien supprimer + const sendQuestionForm = () => + { + const divResponseQuestion=document.getElementById("responseQuestion"); + divResponseQuestion.innerHTML=""; + let datas=getDatasFromInputs(formQuestion); + const xhrQuestionDatas = new XMLHttpRequest(); + if(!isEmpty(datas.id) && (!isEmpty(datas.deleteOk))) + xhrQuestionDatas.open("DELETE", apiUrl+config.questionsRoute+datas.id); + else if(!isEmpty(datas.id)) + xhrQuestionDatas.open("PUT", apiUrl+config.questionsRoute+datas.id); + else + xhrQuestionDatas.open("POST", apiUrl+config.questionsRoute); + xhrQuestionDatas.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let response=JSON.parse(this.responseText); + if ((this.status === 200 || this.status === 201) && response.message!=undefined && response.questionnaire!=undefined) + { + if(Array.isArray(response.message)) + response.message = response.message.join("
    "); + else + response.message = response.message; + showQuestionInfos(response.questionnaire.Questions);// le serveur me retourne une version actualisée de la liste des questions + addElement(divQuestions, "p", response.message, "", ["success"], "", false); + hideAllForms(); + window.location.assign("#questionsList"); + showNextQuestionnaires();// peut avoir évolué suivant ce qui s'est passé + } + else if (response.errors) + { + if(Array.isArray(response.errors)) + response.errors = response.errors.join("
    "); + else + response.errors = txt.serverError; + addElement(divResponseQuestion, "p", response.errors, "", ["error"]); + } + else + addElement(divResponseQuestion, "p", txt.serverError, "", ["error"]); + } + } + xhrQuestionDatas.setRequestHeader("Content-Type", "application/json"); + xhrQuestionDatas.setRequestHeader("Authorization", "Bearer "+user.token); + xhrQuestionDatas.send(JSON.stringify(datas)); + } + formQuestion.addEventListener("submit", function(e) + { + e.preventDefault(); + sendQuestionForm(); + }); + + + + } + } + } + catch(e) + { + console.error(e); + addElement(divMessage, "p", txt.serverError, "", ["error"]); + } +} +initialise(); \ No newline at end of file diff --git a/front/src/manageUsers.js b/front/src/manageUsers.js new file mode 100644 index 0000000..e106fac --- /dev/null +++ b/front/src/manageUsers.js @@ -0,0 +1,370 @@ +// -- GESTION DU FORMULAIRE PERMETTANT DE SAISIR / ÉDITER LES INFOS DES UTILISATEURS ET DE LEUR ABONNEMENT + +/// Vérifie que l'utilisateur est bien connecté, a le bon statut et le redirige vers le formulaire d'inscription si ce n'est pas le cas. +/// Si c'est ok, propose un moteur de recherche permettant de chercher un utilisateur +/// Si un id est passé par l'url on affiche les informations de l'utilisateur dans un formulaire permettant de l'éditer/supprimer. +/// Si pas d'id passé par l'url, on affiche un formulaire vide permettant d'en saisir un nouvel utilisateur + +/// À ajouter : +/// - importation liste de comptes utilisateur à créer +/// - attribution d'un parrain à un utilisateur (via un moteur de recherche). Prévu par le contrôleur. + +// Fichier de configuration côté client : +import { apiUrl, availableLangs, theme } from "../../config/instance.js"; +const lang=availableLangs[0]; +const configFrontEnd = require("../../views/"+theme+"/config/"+lang+".js"); + +// Fonctions utiles au script : !! revoir quand le reste sera fini pour vérifier si tout est utile +import { getLocaly, removeLocaly, saveLocaly } from "./tools/clientstorage.js"; +import { addElement } from "./tools/dom.js"; +import { helloDev, updateAccountLink } from "./tools/everywhere.js"; +import { empyForm, getDatasFromInputs, setAttributesToInputs } from "./tools/forms.js"; +import { dateFormat, isEmpty, replaceAll } from "../../tools/main"; +import { getUrlParams } from "./tools/url.js"; +import { checkSession, getConfig, getPassword } from "./tools/users.js"; + +// Dictionnaires : +const txt = require("../../lang/"+lang+"/general"); +const txtUsers = require("../../lang/"+lang+"/user"); +const txtSubscriptions = require("../../lang/"+lang+"/subscription"); + +helloDev(); + +// Principaux éléments du DOM manipulés : +const divMain = document.getElementById("main-content"); +const divMessage = document.getElementById("message"); +const divResponse = document.getElementById("response"); +const divSubscribeIntro = document.getElementById("subscribeIntro"); +const divPaymentsInfos = document.getElementById("infosPayments"); +const divGodchildsInfos = document.getElementById("infosGodchilds"); + +const formUser = document.getElementById("users"); +const deleteCheckBox = document.getElementById("deleteOkLabel"); +const validationCheckBox = document.getElementById("validationOkLabel"); +const btnNewUser = document.getElementById("wantNewUser"); +const newPassword = document.getElementById("newPassword"); +const timeDifference = document.getElementById("timeDifference"); +const formSearch = document.getElementById("search"); +const divSearchResult = document.getElementById("searchResult"); + +const initialise = async () => +{ + try + { + const config = await getConfig(); + if(!config) + addElement(divMessage, "p", txt.serverError, "", ["error"]); + else + { + const isConnected=await checkSession(["manager", "admin"], "/"+configFrontEnd.connectionPage, { message: txtUsers.needBeConnected, color:"error" }, window.location); + if(isConnected) + { + const user=getLocaly("user", true); + updateAccountLink(user.status, configFrontEnd); + divMain.style.display="block"; + if(!isEmpty(getLocaly("message"))) + { + addElement(divMessage, "p", getLocaly("message", true).message, "", [getLocaly("message", true).color], "", false); + removeLocaly("message"); + } + // Initialisation du formulaire de recherche : + setAttributesToInputs(config, formSearch); + + // Fonction utile pour vider le formulaire, y compris les champs hidden, etc. + // Cache aussi certains champs en mode création + const emptyUserForm = () => + { + empyForm(formUser); + // Case de suppression cachée par défaut, car inutile pour formulaire de création + deleteCheckBox.style.display="none"; + // Case de validation cachée par défaut, car utile que dans certains cas + validationCheckBox.style.display="none"; + divSubscribeIntro.innerHTML=""; + divPaymentsInfos.innerHTML=""; + divGodchildsInfos.innerHTML=""; + // Certains navigateurs ont tendance à remplir tout seul les champs password + newPassword.value=""; + // En mode création, pas de champ pour changer le mot de passe + newPassword.parentNode.style.display="none"; + // Inutile en mode création + timeDifference.parentNode.style.display="none"; + } + emptyUserForm(); + // Initialise les contraintes du formulaire : + setAttributesToInputs(config, formUser); + + // Fonction affichant les infos connues concernant un utilisateur et son abonnement + const showFormUserInfos = (id) => + { + // on commence par tout vider, des fois que... : + emptyUserForm(); + const xhrGetInfos = new XMLHttpRequest(); + xhrGetInfos.open("GET", apiUrl+config.userRoutes+config.getUserInfos+id); + xhrGetInfos.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let response=JSON.parse(this.responseText); + if (this.status === 200 && response.User != undefined) + { + newPassword.parentNode.style.display="block"; + timeDifference.parentNode.style.display="block"; + const mapText = + { + ID_USER : response.User.id, + DATE_CREA : dateFormat(response.User.createdAt), + DATE_UPDATE : dateFormat(response.User.updatedAt), + DATE_CONNECTION : dateFormat(response.User.connectedAt) + }; + let subscribeIntro=replaceAll(txtUsers.infosUserForAdmin, mapText); + for(let data in response.User) + { + if(formUser.elements[data]!==undefined) + { + if(response.User[data]!==true && response.User[data]!==false)// booléen = case à cocher ! + formUser.elements[data].value=response.User[data]; + else if (response.User[data]==true) // si false, on ne fait rien + formUser.elements[""+data].checked="checked"; + } + } + if(response.Subscription != undefined) + { + // nombre de jours de l'abonnement + formUser.elements["numberOfDays"].value=response.Subscription["numberOfDays"]; + // infos de l'abonnement + if(response.Subscription.noticeOk==true) + formUser.elements["noticeOk"].checked="checked"; + // jours de réception + for(let i in response.Subscription.receiptDays) + formUser.elements["d"+response.Subscription.receiptDays[i]].checked="checked"; + + const beginSubTS=new Date(response.Subscription.createdAt).getTime(); + const nbDaysOk=response.Subscription.numberOfDays-Math.round((Date.now()-beginSubTS)/1000/3600/24); + if(nbDaysOk>0) + subscribeIntro+="
    "+txtSubscriptions.infosNbDaysAdmin.replace("NB_DAYS", nbDaysOk); + else + subscribeIntro+="
    "+txtSubscriptions.infosExpiratedAdmin; + addElement(divSubscribeIntro, "p", subscribeIntro, "", ["information"], "", false); + } + else + { + addElement(divSubscribeIntro, "p", txtSubscriptions.isNotValided, "", ["error"]); + validationCheckBox.style.display="block"; + } + deleteCheckBox.style.display="block"; + // Infos de paiements via API WP + const xhrGetPaymentsInfos = new XMLHttpRequest(); + xhrGetPaymentsInfos.open("GET", apiUrl+config.getPayments+response.User.id); + xhrGetPaymentsInfos.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let responsePay=JSON.parse(this.responseText); + if (this.status === 200) + { + if(responsePay.length!==0) + { + let txtPayments=""; + for(let i in responsePay) + { + const mapText = + { + DATE_PAYMENT : dateFormat(responsePay[i].createdAt, "fr"), + AMOUNT : responsePay[i].amount, + CLIENT_NAME : responsePay[i].clientName + }; + txtPayments+="
  • "+replaceAll(txtSubscriptions.infosPaymentsAdmin, mapText)+"
  • "; + } + addElement(divPaymentsInfos, "ul", txtPayments, "", ["information"], "", false); + divPaymentsInfos.style.display="block" + } + } + } + } + xhrGetPaymentsInfos.setRequestHeader("Authorization", "Bearer "+user.token); + xhrGetPaymentsInfos.send(); + + // Un parrain ou deux par deux ? + let txtGodchilds=""; + if(!isEmpty(response.User.GodfatherId)) + { + const xhrGetGodFatherInfos = new XMLHttpRequest(); + xhrGetGodFatherInfos.open("GET", apiUrl+config.userRoutes+config.getUserInfos+response.User.GodfatherId); + xhrGetGodFatherInfos.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let responseGF=JSON.parse(this.responseText); + if (this.status === 200 && responseGF.User != undefined) + txtGodchilds+=txtUsers.infosAdminGodfather+""+responseGF.User.name+""+".
    "; + } + } + xhrGetGodFatherInfos.setRequestHeader("Authorization", "Bearer "+user.token); + xhrGetGodFatherInfos.send(); + } + // Des filleuls ? + const xhrGetGodchilds = new XMLHttpRequest(); + xhrGetGodchilds.open("GET", apiUrl+config.userRoutes+config.getGodChilds+id); + xhrGetGodchilds.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let responseGS=JSON.parse(this.responseText); + if (this.status === 200) + { + if(responseGS.length!==0) + { + txtGodchilds+=txtUsers.infosAdminNbGodChilds.replace("#NB", responseGS.length); + for(let i in responseGS) + txtGodchilds+=""+responseGS[i].name+""; + } + } + } + } + xhrGetGodchilds.setRequestHeader("Authorization", "Bearer "+user.token); + xhrGetGodchilds.send(); + if(txtGodchilds!=="") + { + addElement(divGodchildsInfos, "p", txtGodchilds+".", "", ["information"], "", false); + divGodchildsInfos.style.display="block"; + } + } + } + } + xhrGetInfos.setRequestHeader("Authorization", "Bearer "+user.token); + xhrGetInfos.send(); + } + + // Si un id est passé par l'url, on essaye d'afficher l'utilisateur : + let urlDatas=getUrlParams(); + if(urlDatas && urlDatas.id!==undefined) + showFormUserInfos(urlDatas.id); + + // Besoin d'un coup de Kärcher ? + btnNewUser.addEventListener("click", function(e) + { + emptyUserForm(); + }); + + // Envoi du formulaire des infos de l'utilisateur + formUser.addEventListener("submit", function(e) + { + e.preventDefault(); + divResponse.innerHTML=""; + let datas=getDatasFromInputs(formUser); + // recomposition des jours valables pour l'abonnement : + datas.receiptDays=""; + for(let i=1; i<=7; i++) + { + if(datas["d"+i]!==undefined) + datas.receiptDays+=""+i; + } + if(datas.noticeOk===undefined) + datas.noticeOk="false"; + if(datas.newsletterOk===undefined) + datas.newsletterOk="false"; + const xhrUserDatas = new XMLHttpRequest(); + if(!isEmpty(datas.id) && (datas.deleteOk!==undefined)) + xhrUserDatas.open("DELETE", apiUrl+config.userRoutes+"/"+datas.id); + else if(!isEmpty(datas.id) && (datas.validationOk!==undefined)) + xhrUserDatas.open("POST", apiUrl+config.userRoutes+config.validateUserRoute+datas.id); + else if(!isEmpty(datas.id)) + xhrUserDatas.open("PUT", apiUrl+config.userRoutes+config.updateUserInfos+datas.id); + else + { + datas.password=getPassword(config.password.minlength, config.password.minlength+2);// mot de passe temporaire + xhrUserDatas.open("POST", apiUrl+config.userRoutes+config.createUserRoute); + } + xhrUserDatas.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let response=JSON.parse(this.responseText); + if (this.status === 201 && response.id!=undefined) + { + addElement(divResponse, "p", txt.addOkMessage, "", ["success"]); + datas.id=response.id; + } + else if (this.status === 200 && response.message!=undefined) + { + if(Array.isArray(response.message)) + response.message = response.message.join("
    "); + else + response.message = response.message; + addElement(divResponse, "p", response.message, "", ["success"]); + } + else if (response.errors) + { + if(Array.isArray(response.errors)) + response.errors = response.errors.join("
    "); + else + response.errors = txt.serverError; + addElement(divResponse, "p", response.errors, "", ["error"]); + } + else + addElement(divResponse, "p", txt.serverError, "", ["error"]); + if(isEmpty(response.errors)) + { + if(datas.deleteOk===undefined) + showFormUserInfos(datas.id);// peut avoir évolué suivant ce qui s'est passé + else + emptyUserForm(); + } + } + } + xhrUserDatas.setRequestHeader("Content-Type", "application/json"); + xhrUserDatas.setRequestHeader("Authorization", "Bearer "+user.token); + if(datas) + xhrUserDatas.send(JSON.stringify(datas)); + }); + + // Traitement du lancement d'une recherche + formSearch.addEventListener("submit", function(e) + { + e.preventDefault(); + let datas=getDatasFromInputs(formSearch); + const xhrSearch = new XMLHttpRequest(); + xhrSearch.open("POST", apiUrl+config.userRoutes+config.searchUserRoute); + xhrSearch.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let response=JSON.parse(this.responseText); + if (this.status === 200 && Array.isArray(response)) + { + if(response.length===0) + addElement(divSearchResult, "p", txtUsers.notFound, "", ["information"]); + else + { + let selectHTML=""; + for(let i in response) + selectHTML+=""; + addElement(divSearchResult, "select", selectHTML, "selectSearch"); + const searchSelect=document.getElementById("selectSearch"); + searchSelect.addEventListener("change", function() + { + if(searchSelect.value!=="") + showFormUserInfos(searchSelect.value); + }); + } + } + else + addElement(divSearchResult, "p", txt.serverError, "", ["error"]); + } + } + xhrSearch.setRequestHeader("Content-Type", "application/json"); + xhrSearch.setRequestHeader("Authorization", "Bearer "+user.token); + if(datas) + xhrSearch.send(JSON.stringify(datas)); + }); + + } + } + } + catch(e) + { + console.error(e); + addElement(divMessage, "p", txt.serverError, "", ["error"]); + } +} +initialise(); \ No newline at end of file diff --git a/front/src/newLoginValidation.js b/front/src/newLoginValidation.js new file mode 100644 index 0000000..8b225e2 --- /dev/null +++ b/front/src/newLoginValidation.js @@ -0,0 +1,75 @@ +// -- PAGE PERMETTANT DE VALIDER UN CHANGEMENT D'EMAIL OU DE MOT DE PASSE + +/// Un token est transmis en paramètre de l'Url. Il a une validité limité dans le temps. +/// Si le token est ok, on valide la mise à jour et redirige l'utilisateur vers sa page d'accueil + +// Fichier de configuration côté client : +import { apiUrl, availableLangs, theme } from "../../config/instance.js"; +const lang=availableLangs[0]; +const configFrontEnd = require("../../views/"+theme+"/config/"+lang+".js"); + +// Importation des fonctions utile au script : +import { getLocaly, saveLocaly } from "./tools/clientstorage.js"; +import { addElement } from "./tools/dom.js"; +import { helloDev, updateAccountLink } from "./tools/everywhere.js"; +import { getUrlParams } from "./tools/url.js"; +import { checkSession, getConfig, setSession } from "./tools/users.js"; + +// Dictionnaires : +const txt = require("../../lang/"+lang+"/general"); +const txtUsers = require("../../lang/"+lang+"/user"); + +const divResponse = document.getElementById("response"); + +helloDev(); + +let config; +const initialise = async () => +{ + try + { + config = await getConfig(); + if(!config) + addElement(divResponse, "p", txt.serverError, "", ["error"]); + else + { + const datas=getUrlParams(); + if(datas && datas.t!==undefined) + { + const xhr = new XMLHttpRequest(); + xhr.open("GET", apiUrl+config.userRoutes+config.checkNewLoginLinkRoute+datas.t); + xhr.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let response=JSON.parse(this.responseText); + if (this.status === 200 && response.message != undefined) + { + saveLocaly("message", { message: response.message, color:"success" });// pour l'afficher sur la page suivante + addElement(divResponse, "p", response.message, "", ["success"]);// au cas où blocage redirection + window.location.assign("/"+configFrontEnd.userHomePage);// que user possible ici + } + else if (this.status === 404 && response.errors != undefined) + { + if(Array.isArray(response.errors)) + response.errors = response.errors.join("
    "); + else + response.errors = txt.serverError; + addElement(divResponse, "p", response.errors, "", ["error"]); + } + else + addElement(divResponse, "p", txtUsers.badLinkValidationMessage.replace("#URL", configFrontEnd.accountPage), "", ["error"]); + } + } + xhr.setRequestHeader("Authorization", "Bearer "+datas.t); + xhr.send(); + } + } + } + catch(e) + { + addElement(divResponse, "p", txt.serverError, "", ["error"]); + console.error(e); + } +} +initialise(); \ No newline at end of file diff --git a/front/src/questionnaire.js b/front/src/questionnaire.js new file mode 100644 index 0000000..845ff10 --- /dev/null +++ b/front/src/questionnaire.js @@ -0,0 +1,244 @@ +// -- GESTION DU FORMULAIRE PERMETTANT D'AFFICHER ET RÉPONDRE À UN QUIZ + +/// Il n'est pas nécessaire d'être connecté pour répondre au quiz et voir son résultat. +/// Mais si pas connecté, on propose à l'internaute de se connecter ou de créer un compte pour sauvegarder son résultat. +/// Dans ce but son résultat est stocké dans son navigateur. +/// Si il est connecté, l'enregistrement de son résultat se fait automatiquement côté serveur et ses éventuels précédents résultats sont affichés. + +// Fichier de configuration tirés du backend : +import { apiUrl, availableLangs, theme } from "../../config/instance.js"; +const lang=availableLangs[0]; +import { getPreviousAnswers, getQuestionnaireRoutes, questionnaireRoutes, saveAnswersRoute } from "../../config/questionnaires.js"; +const configTemplate = require("../../views/"+theme+"/config/"+lang+".js"); + +import { checkAnswerOuput, saveAnswer } from "./tools/answers.js"; +import { addElement } from "./tools/dom.js"; +import { helloDev, updateAccountLink } from "./tools/everywhere.js"; +import { getLocaly } from "./tools/clientstorage.js"; +import { getDatasFromInputs } from "./tools/forms.js"; +import { dateFormat, replaceAll } from "../../tools/main"; +import { checkSession, getTimeDifference } from "./tools/users.js"; + +// Dictionnaires : +const txt = require("../../lang/"+lang+"/general"); +const txtAnswers = require("../../lang/"+lang+"/answer"); + +// Principaux éléments du DOM manipulés : +const myForm = document.getElementById("questionnaire"); +const divResponse = document.getElementById("response"); +const btnShow = document.getElementById("showQuestionnaire"); +const btnSubmit = document.getElementById("checkResponses"); +const explanationsTitle = document.getElementById("explanationsTitle"); +const explanationsContent = document.getElementById("explanationsContent"); + +let isConnected, user; +const initialise = async () => +{ + try + { + btnShow.style.display="inline";// bouton caché si JS inactif, car JS nécessaire pour vérifier les réponses + isConnected=await checkSession(["user"]);// seuls les utilisateurs de base peuvent répondre aux quizs + // Si l'utilisateur est connecté et a déjà répondu à ce quiz, on affiche ses précédentes réponses à la place du texte servant à expliquer le topo aux nouveaux + if(isConnected) + { + user=getLocaly("user", true); + updateAccountLink(user.status, configTemplate); + checkPreviousResponses(user); + } + } + catch(e) + { + addElement(divResponse, "p", txt.serverError, "", ["error"]); + console.error(e); + } +} +initialise(); +helloDev(); + +// Affichage du questionnaire quand l'utilisateur clique sur le bouton ou si l'id du formulaire est passée par l'url +// Déclenche en même temps le chronomètre mesurant la durée de la réponse aux questions. +const showQuestionnaire = () => +{ + chronoBegin=Date.now(); + myForm.style.display="block"; + btnShow.style.display="none"; + window.location.hash="";// risque d'enchaîner les ancres si on recharge la page + const here=window.location;// window.location à ajouter pour ne pas quitter la page en mode "preview"... + window.location.assign(here+"questionnaire"); +} +let chronoBegin=0; +btnShow.addEventListener("click", function(e) +{ + try + { + e.preventDefault(); + showQuestionnaire(); + } + catch(e) + { + addElement(divResponse, "p", txt.serverError, "", ["error"]); + console.error(e); + } +}); +// Lien passé par mail pour voir directement le quiz +if(location.hash!=undefined && location.hash==="#questionnaire") + showQuestionnaire(); + +// Traitement de l'envoi de la réponse de l'utilisateur : +let answer = {}; +myForm.addEventListener("submit", function(e) +{ + try + { + e.preventDefault(); + btnSubmit.style.display="none";// seulement un envoi à la fois :) + divResponse.innerHTML="";// supprime les éventuels messages déjà affichés + const userResponses=getDatasFromInputs(myForm); + answer.duration=Math.round((Date.now()-chronoBegin)/1000); + answer.nbQuestions=0; + answer.nbCorrectAnswers=0; + answer.QuestionnaireId=document.getElementById("questionnaireId").value; + // Les réponses sont regroupées par question, donc quand l'idQuestion change, on connaît le résultat pour la question précédente + // Pour qu'une réponse soit bonne, il faut cocher toutes les bonnes réponses (si QCM) à une question et cocher aucune des mauvaises + let idChoice, idQuestion="", goodResponse=false; + for(let item in userResponses) + { + if(item.startsWith("isCorrect_response_"))// = nouvelle réponse possible + { + idChoice = item.substring(item.lastIndexOf("_") + 1); + // si on change de queston + if(userResponses["question_id_response_"+idChoice]!=idQuestion) // on commence à traiter une nouvelle question + { + idQuestion=userResponses["question_id_response_"+idChoice]; + answer.nbQuestions++; + if(goodResponse) // résultat pour la question précédente + answer.nbCorrectAnswers++; + goodResponse=true;// réponse bonne jusqu'à la première erreur... + } + if(userResponses[item]=="true") + { + document.getElementById("response_"+idChoice).parentNode.classList.add("isCorrect"); + if(userResponses["response_"+idChoice]===undefined)// bonne réponse non sélectionnée + goodResponse=false; + } + else + { + if(userResponses["response_"+idChoice]==="on")// réponse cochée n'étant pas une des bonnes + { + goodResponse=false; + document.getElementById("response_"+idChoice).parentNode.classList.add("isNotCorrect"); + } + } + } + } + // si j'ai bien répondu à la dernière question, il faut le traiter ici, car je suis sorti de la boucle : + if(goodResponse) + answer.nbCorrectAnswers++; + + // Affichage du résultat, suivant si l'utilisateur est connecté ou pas et son score : + let getOuput=checkAnswerOuput(answer); + if(isConnected) + { + // Si l'utilisateur est connecté on enregistre son résultat sur le serveur. + const xhrSaveAnswer = new XMLHttpRequest(); + xhrSaveAnswer.open("POST", apiUrl+questionnaireRoutes+saveAnswersRoute); + xhrSaveAnswer.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let xhrResponse=JSON.parse(this.responseText); + if (this.status === 201 && (xhrResponse.message)) + { + getOuput+="
    "+xhrResponse.message.replace("#URL", configTemplate.userHomePage); + checkPreviousResponses(user); + } + else + getOuput+="
    "+txtAnswers.responseSavedError.replace("#URL", configTemplate.userHomePage); + addElement(divResponse, "p", getOuput, "", ["info"]); + } + } + xhrSaveAnswer.setRequestHeader("Authorization", "Bearer "+user.token); + xhrSaveAnswer.setRequestHeader("Content-Type", "application/json"); + answer.timeDifference=getTimeDifference();// on en profite pour mettre les pendules à l'heure + xhrSaveAnswer.send(JSON.stringify(answer)); + } + else + { // si pas connecté, on enregistre le résultat côté client pour permettre de le retrouver au moment de la création du compte ou de la connexion + if(saveAnswer(answer)) + { + getOuput+="

    "+txtAnswers.wantToSaveResponses; + addElement(divResponse, "p", getOuput, "", ["info"]); + document.querySelector(".subcribeBtns").style.display="block"; + } + else // pas la peine de proposer de créer un compte si le stockage local ne fonctionne pas + addElement(divResponse, "p", getOuput, "", ["info"]); + // on redirige vers le résultat + window.location.hash=""; + const here=window.location;// window.location à ajouter pour ne pas quitter la page en mode "preview"... + window.location.assign(here+"response"); + } + // affichage des textes d'explications pour chaque question + const explanations=document.querySelectorAll(".help"); + for(let i in explanations) + { + if(explanations[i].style!=undefined) // sinon, la console affiche une erreur "TypeError: explanations[i].style is undefined", bien que tout fonctionne (?) + explanations[i].style.display="block"; + } + } + catch(e) + { + addElement(divResponse, "p", txt.serverError, "", ["error"]); + console.error(e); + } +}) + +// Fonction vérifiant les précédentes réponses de l'utilisateur +// Utile si connecté lors du premier chargement de la page, puis après une nouvelle réponse +const checkPreviousResponses = (user) => +{ + const xhrPreviousRes = new XMLHttpRequest(); + xhrPreviousRes.open("GET", apiUrl+questionnaireRoutes+getPreviousAnswers+user.id+"/"+document.getElementById("questionnaireId").value); + xhrPreviousRes.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let response=JSON.parse(this.responseText); + if (this.status === 200) + { + const nbResponses=response.length; + let previousAnswersContent=""; + addElement(explanationsTitle, "span", txtAnswers.previousAnswersTitle.replace("#NOM", user.name)); + if(nbResponses!==0) + { + let totNbQuestions=0, totNbCorrectAnswers=0, totDuration=0, mapLineContent; + for(let i in response) + { + totNbQuestions+=response[i].nbQuestions; + totNbCorrectAnswers+=response[i].nbCorrectAnswers; + totDuration+=response[i].duration; + mapLineContent = + { + DATEANSWER : dateFormat(response[i].createdAt),// revoir problème de la langue + NBCORRECTANSWERS : response[i].nbCorrectAnswers, + AVGDURATION : response[i].duration + }; + previousAnswersContent+="
  • "+replaceAll(txtAnswers.previousAnswersLine, mapLineContent)+"
  • "; + } + mapLineContent = + { + AVGDURATION : Math.round(totDuration/nbResponses), + AVGCORRECTANSWERS : Math.round(totNbCorrectAnswers/totNbQuestions*100) + }; + previousAnswersContent="
    "+replaceAll(txtAnswers.previousAnswersStats, mapLineContent)+"
    "+previousAnswersContent; + addElement(explanationsContent, "ul", previousAnswersContent); + } + else + addElement(explanationsContent, "ul", txtAnswers.noPreviousAnswer.replace("#NOM", user.name)); + } + //else + // addElement(divResponse, "p", txt.serverError, "", ["error"]); // pas forcément utile de prévenir du bug ici ? + } + } + xhrPreviousRes.setRequestHeader("Authorization", "Bearer "+user.token); + xhrPreviousRes.send(); +} \ No newline at end of file diff --git a/front/src/subscribe.js b/front/src/subscribe.js new file mode 100644 index 0000000..5d526ef --- /dev/null +++ b/front/src/subscribe.js @@ -0,0 +1,183 @@ +// -- GESTION DU FORMULAIRE PERMETTANT DE CRÉER SON COMPTE + +/// L'utilisateur peut avoir répondu à un quiz avant d'arriver sur la page d'inscription +/// Des ce cas il faut enregistrer son résultat en même temps que les informations de son compte + +// Fichier de configuration tirés du backend : +import { apiUrl, availableLangs, theme } from "../../config/instance.js"; +const lang=availableLangs[0]; + +const configTemplate = require("../../views/"+theme+"/config/"+lang+".js"); +const configUsers = require("../../config/users"); + +// Importation des fonctions utile au script : +import { getLocaly, removeLocaly, saveLocaly } from "./tools/clientstorage.js"; +import { addElement } from "./tools/dom.js"; +import { helloDev } from "./tools/everywhere.js"; +import { getDatasFromInputs, setAttributesToInputs } from "./tools/forms.js"; +import { checkAnswerDatas, checkSession, getConfig, getPassword, getTimeDifference } from "./tools/users.js"; + +// Dictionnaires : +const txt = require("../../lang/"+lang+"/general"); +const txtUsers = require("../../lang/"+lang+"/user"); + +// Principaux éléments du DOM manipulés : +const myForm=document.getElementById("subscription"); +const divResponse=document.getElementById("response"); +const passwordInput=document.getElementById("password"); +const passwordLink=document.getElementById("getPassword"); +const passwordHelp=document.getElementById("passwordMessage"); +const emailInput=document.getElementById("email"); +const btnSubmit=document.getElementById("submitDatas"); +const codeGodfatherInput=document.getElementById("codeGodfather"); + +helloDev(); + +// Test de connexion de l'utilisateur + affichage formulaire d'inscription. +const initialise = async () => +{ + try + { + const isConnected=await checkSession(); + if(isConnected) + { + saveLocaly("message", { message: txtUsers.alreadyConnected, color:"information" });// pour l'afficher sur la page suivante + const user=getLocaly("user", true); + const homePage=user.status+"HomePage"; + window.location.assign("/"+configTemplate[homePage]); + } + else + { + setAttributesToInputs(configUsers, myForm); + myForm.style.display="block"; + } + } + catch(e) + { + addElement(divResponse, "p", txt.serverError, "", ["error"]); + console.error(e); + } +} +initialise(); + +// Générateur de mot de passe "aléatoire" +passwordLink.addEventListener("click", function(e) +{ + e.preventDefault(); + passwordInput.type="text"; + passwordInput.value=getPassword(8, 12); + // copie du mot de passe généré dans le presse-papier + passwordInput.select(); + document.execCommand("copy"); + addElement(passwordHelp, "div", txtUsers.passwordCopied, "", ["success"]); +}); + +// Test si l'e-mail saisi est déjà utilisé pour un compte déjà existant. +// Si c'est le cas, la validation du formulaire est bloquée. +emailInput.addEventListener("focus", function(e) +{ + document.getElementById("emailMessage").innerHTML="";// pour supprimer l'éventuel message d'erreur déjà affiché +}); +emailInput.addEventListener("blur", function(e) +{ + const emailValue=emailInput.value.trim(); + if(emailValue!=="") + { + const xhr = new XMLHttpRequest(); + xhr.open("POST", apiUrl+configUsers.userRoutes+configUsers.checkIfIsEmailfreeRoute); + xhr.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let response=JSON.parse(this.responseText); + if (this.status === 200 && response.free!==undefined && response.free === false) + { + addElement(document.getElementById("emailMessage"), "div", txtUsers.needUniqueEmail.replace("#URL", configTemplate.connectionPage), "", ["error"]); + btnSubmit.setAttribute("disabled", true); + } + else + btnSubmit.removeAttribute("disabled"); + } + } + xhr.setRequestHeader("Content-Type", "application/json"); + const datas={ emailTest:emailValue }; + xhr.send(JSON.stringify(datas)); + } +}); + +// Vérification que le code de parrainage saisi est valide. +// Si ce n'est pas le cas, cela n'est pas bloquant. +codeGodfatherInput.addEventListener("focus", function(e) +{ // on efface l'éventuel message d'erreur si on revient sur le champ pour rectifier le tir + addElement(document.getElementById("codeGodfatherMessage"), "i", txt.notRequired); +}); +codeGodfatherInput.addEventListener("blur", function(e) +{ + const codeValue=codeGodfatherInput.value.trim(); + if(codeValue!=="") + { + const xhr = new XMLHttpRequest(); + xhr.open("POST", apiUrl+configUsers.userRoutes+configUsers.getGodfatherRoute); + xhr.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + if (this.status === 204) + addElement(document.getElementById("codeGodfatherMessage"), "div", txtUsers.godfatherNotFound, "", ["error"]); + else // !! à revoir car cela peut permettre de savoir qu'une adresse e-mail est présente dans le bd + addElement(document.getElementById("codeGodfatherMessage"), "div", txtUsers.godfatherFound, "", ["success"]); + } + } + xhr.setRequestHeader("Content-Type", "application/json"); + const datas={ codeTest:codeValue }; + xhr.send(JSON.stringify(datas)); + } +}); + +// Traitement de l'envoi des données d'inscription : +myForm.addEventListener("submit", function(e) +{ + try + { + e.preventDefault(); + const xhr = new XMLHttpRequest(); + xhr.open("POST", apiUrl+configUsers.userRoutes+configUsers.subscribeRoute); + xhr.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let response=JSON.parse(this.responseText); + if (this.status === 201) + { + myForm.style.display="none"; + addElement(divResponse, "p", response.message, "", ["success"]); + removeLocaly("lastAnswer");// ! important pour ne pas enregister plusieurs fois le résultat + } + else if (response.errors) + { + if(Array.isArray(response.errors)) + response.errors = response.errors.join("
    "); + else + response.errors = txt.serverError; + addElement(divResponse, "p", response.errors, "", ["error"]); + } + else + addElement(divResponse, "p", txt.serverError, "", ["error"]); + } + } + xhr.setRequestHeader("Content-Type", "application/json"); + let datas=getDatasFromInputs(myForm); + if(datas) + { + datas.timeDifference=getTimeDifference(configUsers); + // si l'utilisateur a précédement répondu à un quiz, j'ajoute les infos de son résultat : + datas=checkAnswerDatas(datas); + xhr.send(JSON.stringify(datas)); + } + } + catch(e) + { + addElement(divResponse, "p", txt.serverError, "", ["error"]); + console.error(e); + } +}); \ No newline at end of file diff --git a/front/src/subscribeValidation.js b/front/src/subscribeValidation.js new file mode 100644 index 0000000..36a9449 --- /dev/null +++ b/front/src/subscribeValidation.js @@ -0,0 +1,81 @@ +// -- PAGE PERMETTANT DE VALIDER LA CRÉATION DE SON COMPTE + +/// Un token est transmis en paramètre de l'Url. Il a une validité limité dans le temps. +/// Si le token n'est pas/plus valide, on redirige l'utilisateur vers la page de connexion pour obtenir un nouveau lien. +/// Si le token est ok, on l'informe que tout est ok et lui propose de se connecter. +/// Si l'utilisateur a déjà une session active valide, c'est qu'il a déjà cliqué sur le lien. On le redirige vers sa page d'accueil. + +// Fichier de configuration tirés du backend : +import { apiUrl, availableLangs, theme } from "../../config/instance.js"; +const lang=availableLangs[0]; + +import { checkSubscribeTokenRoute, userRoutes } from "../../config/users.js"; +const configTemplate = require("../../views/"+theme+"/config/"+lang+".js"); + +// Importation des fonctions utiles au script : +import { getLocaly, saveLocaly } from "./tools/clientstorage.js"; +import { addElement } from "./tools/dom.js"; +import { helloDev } from "./tools/everywhere.js"; +import { getUrlParams } from "./tools/url.js"; +import { checkSession } from "./tools/users.js"; + +// Dictionnaires : +const txt = require("../../lang/"+lang+"/general"); +const txtUsers = require("../../lang/"+lang+"/user"); + +const divResponse = document.getElementById("response"); + +const initialise = async () => +{ + try + { + // si l'utilisateur est déjà connecté, pas la peine d'aller + loin : + const isConnected=await checkSession(); + if(isConnected) + { + saveLocaly("message", { message: txtUsers.alreadyConnected, color:"information" }); + const user=getLocaly("user", true); + const homePage=user.status+"HomePage";// lors de la création, seul le statut 'user" est possible + window.location.assign("/"+configTemplate[homePage]); + } + else + { + const datas=getUrlParams(); + if(datas && datas.t!==undefined) + { + const xhr = new XMLHttpRequest(); + xhr.open("GET", apiUrl+userRoutes+checkSubscribeTokenRoute+datas.t); + xhr.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let response=JSON.parse(this.responseText); + if (this.status === 200 && response.userId != undefined && response.token != undefined) + { + saveLocaly("message", { message: txtUsers.validationMessage, color:"success" });// pour l'afficher sur la page suivante + window.location.assign("/"+configTemplate.connectionPage); + } + else if ((this.status === 200 || this.status === 404) && response.errors != undefined) + { + if(Array.isArray(response.errors)) + response.errors = response.errors.join("
    "); + else + response.errors = txt.serverError; + addElement(divResponse, "p", response.errors, "", ["error"]); + } + else + addElement(divResponse, "p", txtUsers.badLinkValidationMessage.replace("#URL", configTemplate.connectionPage), "", ["error"]); + } + } + xhr.send(); + } + } + } + catch(e) + { + console.error(e); + addElement(divResponse, "p", txt.serverError, "", ["error"]); + } +} +initialise(); +helloDev(); \ No newline at end of file diff --git a/front/src/tools/answers.js b/front/src/tools/answers.js new file mode 100644 index 0000000..81183e2 --- /dev/null +++ b/front/src/tools/answers.js @@ -0,0 +1,91 @@ +const configFrontEnd = require("../config/general"); + +import { saveLocaly } from "./clientstorage.js"; +import { isEmpty, replaceAll } from "../../../tools/main"; + +const txt = require("../../../lang/"+configFrontEnd.lang+"/answer"); + +// Enregistrement côté client du dernier résultat à un quiz en attendant d'être connecté +export const saveAnswer = (answer) => +{ + if(!isEmpty(answer.duration) && !isEmpty(answer.nbCorrectAnswers) && !isEmpty(answer.nbQuestions) && !isEmpty(answer.QuestionnaireId)) + { + saveLocaly("lastAnswer", answer); + return true; + } + else + return false; +} + +// Retourne le texte suivant le nombre de bonnes réponses +export const checkAnswerOuput = (answer) => +{ + if(!isEmpty(answer.duration) && !isEmpty(answer.nbCorrectAnswers) && !isEmpty(answer.nbQuestions)) + { + const ratio=answer.nbCorrectAnswers/answer.nbQuestions; + const mapObj= + { + DURATION: answer.duration, + NBCORRECTANSWERS: answer.nbCorrectAnswers, + NBQUESTIONS: answer.nbQuestions + } + let output=""; + if(ratio < 0.4) + output=replaceAll(txt.checkResponsesOuputFail, mapObj); + else if(ratio < 0.8) + output=replaceAll(txt.checkResponsesOuputMedium, mapObj); + else + output=replaceAll(txt.checkResponsesOuputSuccess, mapObj); + if(output) + return output; + else + return ""; + } + else + return ""; +} + +/* +export const checkSession = async (config) => +{ + return new Promise((resolve, reject) => + { + if(isEmpty(localStorage.getItem("user"))) + resolve(false); + else + { + const user=JSON.parse(localStorage.getItem("user")); + if(user.duration===undefined || user.duration < Date.now()) + { + localStorage.removeItem("user"); + resolve(false); + } + else + { + const xhr = new XMLHttpRequest(); + xhr.open("GET", configFrontEnd.apiUrl+config.userRoutes+config.checkLoginRoute+user.token); + xhr.onload = () => + { + let response=JSON.parse(xhr.responseText); + if (xhr.status === 200 && response.isValid && response.id != undefined) + { + if(response.id===user.id) + resolve(true); + else + { + localStorage.removeItem("user"); + resolve(false); + } + } + else + { + localStorage.removeItem("user"); + resolve(false); + } + } + xhr.onerror = () => reject(xhr.statusText); + xhr.send(); + } + } + }); +}*/ \ No newline at end of file diff --git a/front/src/tools/clientstorage.js b/front/src/tools/clientstorage.js new file mode 100644 index 0000000..5182280 --- /dev/null +++ b/front/src/tools/clientstorage.js @@ -0,0 +1,20 @@ +// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.) +// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie + +export const saveLocaly = (name, data) => +{ + localStorage.setItem(name, JSON.stringify(data)); +} + +export const getLocaly = (name, json=false) => +{ + if(json) + return JSON.parse(localStorage.getItem(name)); + else + return localStorage.getItem(name); +} + +export const removeLocaly = (name) => +{ + localStorage.removeItem(name); +} \ No newline at end of file diff --git a/front/src/tools/dom.js b/front/src/tools/dom.js new file mode 100644 index 0000000..4758e7f --- /dev/null +++ b/front/src/tools/dom.js @@ -0,0 +1,34 @@ +import { isEmpty } from "../../../tools/main"; + +// Fonction associant les attributs fournis à un champ de formulaire +export const addElement = (eltParent, eltType, eltContent="", eltId="", eltClass=[], eltAttributes={}, replace=true) => +{ + if(isEmpty(eltType) || isEmpty(eltParent)) + return false; + else + { + const newElement=document.createElement(eltType); + + if(!isEmpty(eltId))// tester si l'id n'est pas déjà utilisé dans le DOM ? + newElement.id=eltId; + + if(Array.isArray(eltClass) && eltClass.length!=0) + { + for(let i in eltClass) + newElement.classList.add(eltClass[i]); + } + + if(typeof eltAttributes === "object") // !! tous les objets ne sont pas ok + { + for(let attributName in eltAttributes) + newElement.setAttribute(attributName, eltAttributes[attributName]); + } + + if(!isEmpty(eltContent)) + newElement.innerHTML=eltContent.replace(/\n/g,"
    ");// innerHTML permet d'ajouter du texte ayant lui-même des balises, etc. + + if(replace) + eltParent.innerHTML=""; + eltParent.appendChild(newElement); + } +} \ No newline at end of file diff --git a/front/src/tools/everywhere.js b/front/src/tools/everywhere.js new file mode 100644 index 0000000..115ad81 --- /dev/null +++ b/front/src/tools/everywhere.js @@ -0,0 +1,14 @@ +// Ce script fournit des fonctions utilisées sur toutes les pages du site + +export const helloDev = () => +{ + console.log("**** Hello ami développeur :-)\n Le code de WikiLerni est libre et sera bientôt lisible sur Gitlab.\n Pour les suggestions d'amélioration ou questions : dev@wililerni.com ****"); + return true; +} + +export const updateAccountLink = (status, configTemplate) => +{ + const link=document.getElementById("accountHeadLink"); + const homePage=status+"HomePage"; + link.href="/"+configTemplate[homePage]; +} \ No newline at end of file diff --git a/front/src/tools/forms.js b/front/src/tools/forms.js new file mode 100644 index 0000000..c3df966 --- /dev/null +++ b/front/src/tools/forms.js @@ -0,0 +1,51 @@ +import { isEmpty } from "../../../tools/main"; + +// Fonction associant les attributs fournis à un champ de formulaire +export const setAttributesToInputs = (inputsConf, myForm) => +{ + for(let i in myForm.elements) + { + if(!isEmpty(myForm.elements[i].id)) + { + let idInput=myForm.elements[i].id; + if(inputsConf[idInput]!==undefined) + { + let inputHTML=document.getElementById(idInput); + for (let attribute in inputsConf[idInput]) + inputHTML.setAttribute(attribute, inputsConf[idInput][attribute]); + } + } + } + return true; +} + +// Récupère toutes les valeurs de champs en omettant les checkbox non cochées, etc. +export const getDatasFromInputs = (myForm) => +{ + const datas={}; + const formData = new FormData(myForm); + for(let entrie of formData.entries()) + datas[entrie[0]]=entrie[1]; + return datas; +} + +// Vide tous les champs d'un formulaire, y compris hidden, checkbox, etc. +// Revoir pour les select +export const empyForm = (myForm) => +{ + const formData = new FormData(myForm); + for(let entrie of formData.entries()) + { + if(myForm.elements[entrie[0]].type=="checkbox" || myForm.elements[entrie[0]].type=="radio") + myForm.elements[entrie[0]].checked=false; + else + myForm.elements[entrie[0]].value=""; + } + return true; +} +// Vide et cache le formulaire +export const empyAndHideForm = (myForm) => +{ + empyForm(myForm); + myForm.style.display="none"; +} \ No newline at end of file diff --git a/front/src/tools/url.js b/front/src/tools/url.js new file mode 100644 index 0000000..38b9ca9 --- /dev/null +++ b/front/src/tools/url.js @@ -0,0 +1,21 @@ +import { isEmpty } from "../../../tools/main"; + +// Fonction récupérant les paramètres passés par l'url +export const getUrlParams = () => +{ + if(isEmpty(location.search)) + return false; + + const parameters = location.search.substring(1).split("&"); + if(!Array.isArray(parameters) || parameters.length===0) + return false; + + let param, datas={}; + for(let i in parameters) + { + param = parameters[i].split("="); + if(param.length===2) + datas[param[0]]=decodeURI(param[1]); + } + return datas; +} \ No newline at end of file diff --git a/front/src/tools/users.js b/front/src/tools/users.js new file mode 100644 index 0000000..8773465 --- /dev/null +++ b/front/src/tools/users.js @@ -0,0 +1,170 @@ +import { apiUrl, availableLangs, siteUrl, theme } from "../../../config/instance.js"; +const lang=availableLangs[0]; + +const configTemplate = require("../../../views/"+theme+"/config/"+lang+".js"); + +import { checkLoginRoute, timeDifferenceMax, timeDifferenceMin, userRoutes } from "../../../config/users.js"; + +import { getLocaly, removeLocaly, saveLocaly } from "./clientstorage.js"; +import { isEmpty } from "../../../tools/main"; + +// Récupère les données de configuration des utilisateurs +// À terme, un fichier statique importable comme module devrait éviter une requête ajax +export const getConfig = async () => +{ + return new Promise((resolve, reject) => + { + const xhr = new XMLHttpRequest(); + xhr.open("GET", apiUrl+"/user/getconfig"); + xhr.onload = () => resolve(JSON.parse(xhr.responseText)); + xhr.onerror = () => reject(xhr.statusText); + xhr.send(); + }); +} + +export const getTimeDifference = () => +{ + // multiplier par -1, car c'est ce qu'il faut "ajouter" à l'heure UTC pour revenir en heure locale qui m'intéresse et non l'inverse + const timeLocal=new Date().getTimezoneOffset()*-1; + if(timeLocal > timeDifferenceMax || timeLocal < timeDifferenceMin) + return 0; + else return timeLocal; +} + +// On enlève volontairement les 0/O pour éviter les confusions ! +// Et mieux vaut aussi débuter et finir par une lettre simple. +export const getPassword = (nbCarMin, nbCarMax) => +{ + const nbCar=nbCarMin+Math.floor(Math.random()*(nbCarMax-nbCarMin)); + const letters="ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz"; + const others="123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ"; + let password=letters[Math.floor(Math.random()*letters.length)]; + for(let i=1;i<(nbCar-1);i++) + { + if((i % 2) ===1) + password+=others[Math.floor(Math.random()*others.length)]; + else + password+=letters[Math.floor(Math.random()*letters.length)]; + } + password+=letters[Math.floor(Math.random()*letters.length)]; + return password; +} + +// J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite +// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides. +export const setSession = (userId, token, durationTS) => +{ + const storageUser= + { + id: userId, + token: token, + duration: durationTS + } + saveLocaly("user", storageUser); +} + +// Vérifie qu'il y a des données locales concernant le résultat d'un quiz +// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas +export const checkAnswerDatas = (datas) => +{ + const lastAnswer=getLocaly("lastAnswer"); + if(!isEmpty(lastAnswer)) + { + const answer=JSON.parse(lastAnswer); + if(!isEmpty(answer.duration) && !isEmpty(answer.nbCorrectAnswers) && !isEmpty(answer.QuestionnaireId) && !isEmpty(answer.nbQuestions)) + { + datas.duration=answer.duration; + datas.nbCorrectAnswers=answer.nbCorrectAnswers; + datas.QuestionnaireId=answer.QuestionnaireId; + datas.nbQuestions=answer.nbQuestions; + } + } + return datas; +} + +// Cette fonction teste la connexion de l'utilisateur d'une page +// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté +export const checkSession = async (status=[], urlRedirection, message, urlWanted) => +{ + return new Promise((resolve, reject) => + { + const userDatas=getLocaly("user"); + if(isEmpty(userDatas)) + { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + else + { + const user=JSON.parse(userDatas); + if(isEmpty(user.id) || isEmpty(user.token) || isEmpty(user.duration) || user.duration < Date.now()) + { + removeLocaly("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + else + { + const xhr = new XMLHttpRequest(); + xhr.open("GET", apiUrl+userRoutes+checkLoginRoute+user.token); + xhr.onload = () => + { + let response=JSON.parse(xhr.responseText); + if (xhr.status === 200 && response.isValid && response.id != undefined) + { + if(response.id===user.id) + { + user.name=response.name; + user.language=response.language; + user.timeDifference=response.timeDifference; + user.status=response.status;// c'est le token qui sert à vérifier le statut à chaque requête à l'API + saveLocaly("user", user); + // si il s'agit d'un "user" et que son abonnement a expiré, je le redirige vers la caisse :-) + if(response.status==="user" && response.nbDaysOk <= 0) + { + const urlAccount=siteUrl+"/"+configTemplate.accountPage; + if(window.location.href.indexOf(urlAccount)===-1) + window.location.assign("/"+configTemplate.accountPage+"#subscribe");// passée directement ici, l'ancre #subscribe ne fonctionne pas !? + resolve(true); + } + else + { + if(status.length!==0 && status.indexOf(response.status)===-1) + { + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + else + resolve(true); + } + } + else + { + removeLocaly("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + } + else + { + removeLocaly("user"); + redirectUser(urlRedirection, message, urlWanted); + resolve(false); + } + } + xhr.onerror = () => reject(xhr.statusText); + xhr.send(); + } + } + }); +} +// Cette fonction sert à la précédente en cas de connexion non valide +const redirectUser = (urlRedirection, message, urlWanted) => +{ + if(!isEmpty(message)) + saveLocaly("message", message); + if(!isEmpty(urlWanted)) + saveLocaly("url", urlWanted); + if(!isEmpty(urlRedirection)) + window.location.assign(urlRedirection); +} \ No newline at end of file diff --git a/front/src/tools/webportage.js b/front/src/tools/webportage.js new file mode 100644 index 0000000..0beaead --- /dev/null +++ b/front/src/tools/webportage.js @@ -0,0 +1,41 @@ +const checkBoxes= +{ + "CGV" : document.getElementById("CGVOk"), + "abo12" : document.getElementById("abo12"), + "abo24" : document.getElementById("abo24"), + "abo60" : document.getElementById("abo60"), + "abo120" : document.getElementById("abo120") +} +const divWPBtns=document.getElementById("WPBtns"); + +// Lorsque l'on sélectionne un montant, les autres options + les CGV sont désélectionnés +export const unCheckAllOthers = (choice) => +{ + for (let id in checkBoxes) + { + if(id!==choice) + checkBoxes[id].checked=false; + divWPBtns.style.display="none"; + } +} + + +const btns= +{ + "btn12" : document.getElementById("WPBtn12"), + "btn24" : document.getElementById("WPBtn24"), + "btn60" : document.getElementById("WPBtn60"), + "btn120" : document.getElementById("WPBtn120") +} + +// Affiche le bon bouton de paiement et cache les autres +export const showBtnPayment = (choice) => +{ + for (let id in btns) + { + if(id!==choice) + btns[id].style.display="none"; + else + btns[id].style.display="block"; + } +} \ No newline at end of file diff --git a/front/src/unsubscribe.js b/front/src/unsubscribe.js new file mode 100644 index 0000000..a361dcf --- /dev/null +++ b/front/src/unsubscribe.js @@ -0,0 +1,63 @@ +// -- GESTION DE LA PAGE PERMETTANT DE SE DÉBONNER DE TOUS LES ENVOIS + +/// Un token est transmis en paramètre de l'Url. Il a une validité limité dans le temps. Si le token est ok, il n'est pas nécessaire d'être connecté. +/// Dans le cas où il n'est plus valide, on peut proposer à l'utilisateur de se connecter à son compte pour se désabonner. +/// Si le token est ok, on valide enregistrement le désabonnement et affiche un message de confirmation + +// Fichier de configuration côté client : +import { apiUrl, availableLangs, theme } from "../../config/instance.js"; +const lang=availableLangs[0]; +const configFrontEnd = require("../../views/"+theme+"/config/"+lang+".js"); + +// Importation des fonctions utile au script : +import { getLocaly, removeLocaly, saveLocaly } from "./tools/clientstorage.js"; +import { addElement } from "./tools/dom.js"; +import { helloDev } from "./tools/everywhere.js"; +import { getUrlParams } from "./tools/url.js"; +import { checkSession, getConfig, setSession } from "./tools/users.js"; + +// Dictionnaires : +const txt = require("../../lang/"+lang+"/general"); +const txtUsers = require("../../lang/"+lang+"/user"); +const txtSubscriptions = require("../../lang/"+lang+"/subscription"); + +const divResponse = document.getElementById("response"); + +helloDev(); + +let config; +const initialise = async () => +{ + try + { + config = await getConfig(); + if(!config) + addElement(divResponse, "p", txt.serverError, "", ["error"]); + else + { + const datas=getUrlParams(); + if(datas && datas.t!==undefined) + { + const xhr = new XMLHttpRequest(); + xhr.open("GET", apiUrl+config.userRoutes+config.unsubscribeRoute+datas.t); + xhr.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let response=JSON.parse(this.responseText); + if (this.status === 200 && response.message != undefined) + addElement(divResponse, "p", response.message.replace("#URL", configFrontEnd.accountPage), "", ["success"]); + else + addElement(divResponse, "p", txtSubscriptions.unsubscriptionFail.replace("#URL", configFrontEnd.accountPage), "", ["error"]); + } + } + xhr.send(); + } + } + } + catch(e) + { + addElement(divResponse, "p", txt.serverError, "", ["error"]); + } +} +initialise(); \ No newline at end of file diff --git a/front/webpack.config.js b/front/webpack.config.js new file mode 100644 index 0000000..09fdd8d --- /dev/null +++ b/front/webpack.config.js @@ -0,0 +1,51 @@ +const path = require('path'); + +module.exports = +{ + mode: "development", + devtool: "inline-source-map", + entry: + { + accountUser: "./src/accountUser.js", + connection: "./src/connection.js", + deconnection: "./src/deconnection.js", + deleteValidation: "./src/deleteValidation.js", + homeManager: "./src/homeManager.js", + homeUser: "./src/homeUser.js", + index: "./src/index.js", + loginLink: "./src/loginLink.js", + manageQuestionnaires: "./src/manageQuestionnaires.js", + manageUsers: "./src/manageUsers.js", + newLoginValidation: "./src/newLoginValidation.js", + polyfill: "babel-polyfill", + questionnaire: "./src/questionnaire.js", + subscribe: "./src/subscribe.js", + subscribeValidation: "./src/subscribeValidation.js", + unsubscribe: "./src/unsubscribe.js" + }, + output: + { + filename: "./JS/[name].app.js", + path: path.resolve(__dirname, "public") + }, + module: + { + rules: [ + { + test: /\.js$/, + exclude: /node_modules/, + use: { + loader: "babel-loader", + options: { + presets: ["@babel/preset-env"] + } + } + } + + ] + }, + devServer: + { + contentBase: path.resolve(__dirname, "./public") + } +}; \ No newline at end of file diff --git a/front/webpack.config_prod.js b/front/webpack.config_prod.js new file mode 100644 index 0000000..2cb3a26 --- /dev/null +++ b/front/webpack.config_prod.js @@ -0,0 +1,51 @@ +const path = require('path'); + +module.exports = +{ + mode: "production", // pour tester les fichiers en version compressée + devtool: "inline-source-map", + entry: + { + accountUser: "./src/accountUser.js", + connection: "./src/connection.js", + deconnection: "./src/deconnection.js", + deleteValidation: "./src/deleteValidation.js", + homeManager: "./src/homeManager.js", + homeUser: "./src/homeUser.js", + index: "./src/index.js", + loginLink: "./src/loginLink.js", + manageQuestionnaires: "./src/manageQuestionnaires.js", + manageUsers: "./src/manageUsers.js", + newLoginValidation: "./src/newLoginValidation.js", + polyfill: "babel-polyfill", + questionnaire: "./src/questionnaire.js", + subscribe: "./src/subscribe.js", + subscribeValidation: "./src/subscribeValidation.js", + unsubscribe: "./src/unsubscribe.js" + }, + output: + { + filename: "./JS/prod/[name].app.js", + path: path.resolve(__dirname, "public") + }, + module: + { + rules: [ + { + test: /\.js$/, + exclude: /node_modules/, + use: { + loader: "babel-loader", + options: { + presets: ["@babel/preset-env"] + } + } + } + + ] + }, + devServer: + { + contentBase: path.resolve(__dirname, "./public") + } +}; \ No newline at end of file diff --git a/lang/fr/answer.js b/lang/fr/answer.js new file mode 100644 index 0000000..fd33c2d --- /dev/null +++ b/lang/fr/answer.js @@ -0,0 +1,26 @@ +module.exports = +{ + needNumberUserResponses : "Le nombre de questions auxquelles l'utilisateur a répondu doit être fourni.", + needIntegerNumberUserResponses : "Le nombre de questions auxquelles l'utilisateur a répondu doit être un nombre entier.", + needMinNumberUserResponses : "Le nombre de questions auxquelles l'utilisateur a répondu ne peut être inférieur à 1.", + needMaxNumberUserResponses : "Le nombre de questions auxquelles l'utilisateur a répondu ne peut être aussi élevé.", + needNumberCorrectResponses : "Le nombre de réponses correctes doit être fourni.", + needIntegerNumberCorrectResponses : "Le nombre de réponses correctes doit être un nombre entier.", + needMinNumberCorrectResponses : "Le nombre de réponses correctes ne peut être négatif.", + needMaxNumberCorrectResponses : "Le nombre de réponses correctes ne peut être supérieur au nombre de questions.", + needIntegerNumberSecondesResponse : "La durée de la réponse doit être un nombre entier de secondes.", + needMinNumberSecondesResponse : "La durée de la réponse ne peut être négative.", + checkResponsesOuputFail : "Vous avez répondu en DURATION secondes et avez NBCORRECTANSWERS bonne(s) réponse(s) sur NBQUESTIONS. C'est certain, vous ferez mieux la prochaine fois !", + checkResponsesOuputMedium : "Vous avez répondu en DURATION secondes et avez NBCORRECTANSWERS bonne(s) réponse(s) sur NBQUESTIONS. C'est pas mal du tout !", + checkResponsesOuputSuccess : "Vous avez répondu en DURATION secondes et avez NBCORRECTANSWERS bonne(s) réponse(s) sur NBQUESTIONS. Bravo ! Rien ne vous échappe !", + wantToSaveResponses: "Si vous le souhaitez, vous pouvez sauvegarder votre résultat en vous connectant à votre compte.", + responseSavedMessage : "Votre résultat a été enregistré. Accèder à tous vos quizs.", + responseSavedError : "Cependant une erreur a été rencontrée durant l'enregistrement de votre résultat. Accèder à tous vos quizs.", + noQuestionnaireWithoudAnswer: "Bravo ! Vous avez répondu à tous les quizs qui vous on été proposés !
    Il y en a des nouveaux publiés régulièrement et qui vous seront proposés.
    En attendant vous pouvez peut-être essayer de répondre de nouveau à certain quiz pour voir si vous vous souvenez des bonnes réponses ?", + nbQuestionnaireWithoudAnswer: "Il y a #NB quizs qui vous ont été proposés et auxquels vous n'avez pas répondu. Voici les derniers :!", + statsUser: "Vous avez enregistré NBANSWERS réponses à NBQUESTIONNAIRES questionnaires différents sur les NBTOTQUESTIONNAIRES proposés par le site.
    En moyenne, vous avez mis AVGDURATION secondes à répondre et avez correctement répondu à AVGCORRECTANSWERS % des questions.", + previousAnswersTitle: "Bonjour #NOM, voici vos précédents résultats à ce quiz", + previousAnswersStats: "En moyenne, vous avez répondu à ce quiz en AVGDURATION secondes, en ayant AVGCORRECTANSWERS % de bonnes réponses.", + previousAnswersLine: "Le DATEANSWER, vous avez répondu correctement à NBCORRECTANSWERS questions en AVGDURATION secondes.", + noPreviousAnswer: "Bonjour #NOM, c'est la première fois que vous répondez à ce quiz. Bonne lecture !" +}; diff --git a/lang/fr/choice.js b/lang/fr/choice.js new file mode 100644 index 0000000..88e06d3 --- /dev/null +++ b/lang/fr/choice.js @@ -0,0 +1,10 @@ +module.exports = +{ + needTextForChoice : "Merci de saisir le texte de la réponse proposée.", + needGoodLongTextForChoice : "Merci de saisir des réponses ne comptant pas plus de 255 caractères.", + needKnowIsCorrectChoice : "Merci de spécifier si cette réponse est correcte ou pas.", + needQuestionForChoices : "Tentative d'ajout/actualisation de réponses possibles pour une question n'ayant pas été trouvée : ", + needOneGoodChoice : "Merci de désigner au moins une des réponses comme étant correcte.", + needMinChoicesForQuestion : "Merci de fournir au moins 2 réponses possibles pour chaque question.", + needMaxChoicesForQuestion : "Le nombre de réponses possibles pour une question ne peut dépasser : ", +}; \ No newline at end of file diff --git a/lang/fr/general.js b/lang/fr/general.js new file mode 100644 index 0000000..55a04d8 --- /dev/null +++ b/lang/fr/general.js @@ -0,0 +1,30 @@ +module.exports = +{ + siteHTMLTitle : "WikiLerni : Wikipédia en questions", + siteMetaDescription : "Avec WikiLerni, recevez chaque jour de nouveaux quizs pour tester vos connaissances et apprendre de nouvelles choses.", + scriptTimingInfo : "Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", + scriptTimingAlert : "*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL", + serverError : "Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.", + serverErrorAdmin : "Bug de l'application :", + neededParams : "Des paramètres nécessaires manquants sont manquants.", + badUrl : "Tentative d'accès à une page n'existant pas :", + notValidFormat : "Format non valide.", + notAllowed : "Vous n'avez pas les droits nécessaires pour cette action.", + notRequired : "Facultatif.", + updateBtnTxt: "Modifier", + addBtnTxt: "Ajouter", + deleteBtnTxt: "Supprimer", + addOkMessage : "Les données ont bien été enregistrées.", + updateOkMessage : "La mise à jour à jour a bien été enregistrée.", + deleteOkMessage : "La suppression a bien été enregistrée.", + failAuth : "Erreur d'authentification.", + failAuthHeader : "Absence de header Authorization.", + failAuthToken : "Token invalide ou utilisateur non trouvé.", + failAuthId : "Identifiant non valide : ", + failAuthCron : "Tentative de lancement d'un cron sans le bon token.", + previousPage : "Page précédente", + nextPage : "Page suivante", + alertNewWindow: "nouvelle fenêtre", + btnLinkToQuestionnaire : "Aller au quiz !", + statsAdmin : "Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
    En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
    Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium." +}; \ No newline at end of file diff --git a/lang/fr/illustration.js b/lang/fr/illustration.js new file mode 100644 index 0000000..b731fd4 --- /dev/null +++ b/lang/fr/illustration.js @@ -0,0 +1,19 @@ +module.exports = +{ + needUrl : "Merci de fournir une url pour l'image.", + needUniqueUrl : "L'url est déjà utilisée par une autre image.", + needGoodLongUrl : "L'url de l'image doit contenir entre 5 et 255 caractères.", + needGoodLongAlt : "Le texte de la propriété 'alt' ne doit pas compter plus de 255 caractères.", + needGoodLongTitle : "Le texte de la propriété 'title' ne doit pas compter plus de 255 caractères.", + needGoodLongCaption : "Le texte de la légende de l'image ne doit pas compter plus de 255 caractères.", + needGoodFile : "Votre fichier n'a pas été accepté.", + needQuestionnaireForIllustration : "Tentative d'ajout/mise à jour/suppreession d'une illustration pour un questionnaire n'ayant pas été trouvé.", + needMaxIllustrationsForQuestionnaire : "Vous avez déjà atteint le nombre maximal d'illustrations pour ce questionnaire.", + notFound: "L'enregistrement de l'illustration n'a pas été trouvé : ", + addedOkMessage: "L'illustration a bien été enregistrée.", + updatedOkMessage: "L'illustration a bien été modifiée.", + deletedOkMessage: "L'illustration a bien été supprimée.", + defaultAlt : "Illustration du quiz", + introTitle : "Illustrations du quiz", + introNoIllustration : "Aucune illustration pour l'instant." +}; \ No newline at end of file diff --git a/lang/fr/link.js b/lang/fr/link.js new file mode 100644 index 0000000..0f37483 --- /dev/null +++ b/lang/fr/link.js @@ -0,0 +1,17 @@ +module.exports = +{ + needUrl : "Merci de saisir l'url du lien.", + needValidUrl : "Merci de saisir un url ayant un format valide.", + needNotTooLongUrl : "Merci de saisir un url ne comptant pas plus de 255 caractères.", + needAnchor : "Merci de fournir une ancre pour ce lien.", + needGoodLongAnchor : "Merci de fournir une ancre pour ce lien comptant entre 5 et 150 caractères.", + needQuestionnaire : "Le questionnaire du lien n'a pas été trouvé.", + needMaxLinksForQuestionnaire : "Vous avez déjà atteint le nombre maximal de liens pour ce questionnaire.", + updatedOkMessage: "Le lien a bien été modifié.", + addedOkMessage: "Le lien a bien été ajouté.", + deletedOkMessage: "Le lien a bien été supprimé.", + notFound : "L'enregistrement du lien n'a pas été trouvé.", + introTitle : "Lectures proposées", + introNoLink : "Aucun lien pour l'instant.", + defaultValue: "Lire l'article sur Wikipédia." +}; \ No newline at end of file diff --git a/lang/fr/pause.js b/lang/fr/pause.js new file mode 100644 index 0000000..172003a --- /dev/null +++ b/lang/fr/pause.js @@ -0,0 +1,13 @@ +module.exports = +{ + needName : "Merci de saisir un nom pour cette période de pause.", + needGoodLongName : "Le nom saisi pour cette période de pause ne doit pas compter plus de 255 caractères.", + needStartingDate : "Merci de fournir la date de début de la période de pause.", + needValidStartingDate : "La date de début fournie n'a pas un format valide.", + needEndingDate : "Merci de fournir la date de fin de la période de pause.", + needValidEndingDate : "La date de fin fournie n'a pas un format valide.", + needMinEndingDate : "La date de fin doit être supérieure à celle de début.", + createdOkMessage: "La nouvelle période de pause a bien été enregistrée.", + updatedOkMessage: "La période de pause a bien été modifiée.", + deletedOkMessage: "La période de pause a bien été supprimée." +}; \ No newline at end of file diff --git a/lang/fr/payment.js b/lang/fr/payment.js new file mode 100644 index 0000000..25992ad --- /dev/null +++ b/lang/fr/payment.js @@ -0,0 +1,21 @@ +module.exports = +{ + needName : "Il manque le nom du client ayant payé.", + needAmount : "Il manque le montant du paiement.", + needCorrectAmount : "Le montant du paiement n'a pas un format valide.", + needCode : "Il manque le code de la commande associée à ce paiement.", + paymentUrlFail: "Un retour paiement a été reçu avec une url non conforme : ", + paymentDatasFail: "Un retour paiement a été reçu avec des paramètres non conformes : ", + paymentUserNotFound: "Un retour paiement a été reçu avec l'id d'un utilisateur inconnu : ", + mailPaymentThankSubject: "Merci !", + mailPaymentLinkTxt: "Mon compte WikiLerni.", + mailPaymentThankBodyTxt: "Bonjour USER_NAME,\n\nSuite à votre paiement, votre abonnement à SITE_NAME vient d'être prolongé de NBDAYS jours.\n\nMerci beaucoup et à bientôt !", + mailPaymentThankBodyHTML: "

    Bonjour USER_NAME,

    Suite à votre paiement, votre abonnement à SITE_NAME vient d'être prolongé de NBDAYS jours.
    Merci beaucoup et à bientôt !

    ", + mailPaymentAdminNoticeSubject: "Nouvel abonnement prémium !", + mailPaymentAdminNoticeBodyTxt: "Bonjour,\nUn nouvel abonnement prémium vient d'être enregistré pour l'utilisateur EMAIL.", + mailPaymentAdminNoticeBodyHTML: "

    Bonjour,

    Un nouvel abonnement payant vient d'être enregistré pour l'utilisateur EMAIL.

    ", + mailPaymentThankGodfatherSubject: "Merci !", + mailPaymentThankGodfatherBodyTxt: "Bonjour USER_NAME,\n\nUn des utilisateurs que vous avez parrainé vient de souscrire à un abonnement payant.\n\nEn récompense, votre abonnement vient donc d'être prolongé de 30 jours.\n\nMerci à vous et à bientôt !", + mailPaymentThankGodfatherBodyHTML: "

    Bonjour USER_NAME,

    Un des utilisateurs que vous avez parrainé vient de souscrire à un abonnement payant.
    En récompense, votre abonnement vient donc d'être prolongé de 30 jours.
    Merci à vous et à bientôt !

    ", + paymentGodfatherNotFound: "Un retour paiement a été reçu pour un utilisateur, mais les infos de son parrain n'ont pas été retrouvées : " +}; \ No newline at end of file diff --git a/lang/fr/question.js b/lang/fr/question.js new file mode 100644 index 0000000..79be426 --- /dev/null +++ b/lang/fr/question.js @@ -0,0 +1,14 @@ +module.exports = +{ + needText: "Merci de saisir le texte de la question !", + needNotTooLongText: "La question ne doit pas compter plus de 255 caractères.", + needQuestionnaire: "Le questionnaire concerné n'a pas été trouvé.", + needMaxQuestions: "Vous avez déjà atteint le nombre maximal de questions pour ce questionnaire : ", + notFound: "L'enregistrement de la question n'a pas été trouvé.", + addOkMessage: "La question a bien été ajoutée.", + updateOkMessage: "La question a bien été modifiée.", + deleteOkMessage: "La question a bien été supprimée.", + introTitle: "Les questions enregistrées", + introNoQuestion: "Aucune question n'a été saisie pour l'instant", + needNumberForRank : "Vous devez fournir un nombre supérieur ou égal à 1 pour le rang de cette question." +}; \ No newline at end of file diff --git a/lang/fr/questionnaire.js b/lang/fr/questionnaire.js new file mode 100644 index 0000000..4a8f516 --- /dev/null +++ b/lang/fr/questionnaire.js @@ -0,0 +1,40 @@ +module.exports = +{ + needTitle: "Merci de fournir un titre à votre quiz.", + needNotTooLongTitle: "Le titre du quiz ne doit pas compter plus de 255 caractères.", + needUrl: "Merci de fournir l'url à votre quiz.", + needUniqueUrl: "L'url du quiz doit être unique.", + needIntroduction: "Merci de fournir un texte d'introduction à votre quiz.", + needCorrectPublishingDate: "La date de publication fournie n'a pas un format valide.", + needKnowIfIsPublished: "Il faut savoir si ce quiz est publié.", + needLanguage: "Vous devez sélectionner la langue de ce quiz.", + needEstimatedTime: "Merci de sélectionner une estimation de la durée de ce quiz.", + notFound : "Aucun quiz n'a pas été trouvé.", + searchResultTitle : "Résultat pour votre recherche", + searchNoResult : "Aucun résultat n'a été trouvé pour votre recherche", + searchWithResult : "Voici #NB quizs pour votre recherche :", + questionnairesName: "quiz", + publishedBy: "Quiz publié par", + publishedAt: ", le", + lastUpdated: "Dernière mise à jour, le ", + estimatedTime: "Durée de lecture estimée : ", + estimatedTimeOption : + { + short: "courte", + medium: "moyenne", + long: "longue" + }, + explanationBeforeTxt: "Extrait :", + correctAnswerTxt: "Bonne réponse", + wrongAnswerTxt: "Mauvaise réponse", + btnSendResponse: "Testez vos réponses.", + btnProposeSubscribe: "Je crée mon compte.", + btnProposeConnection: "Je me connecte.", + btnShowQuestionnaire: "Afficher le quiz !", + btnShareQuizTxt: "Partager ce quiz sur ", + nextQuestionnairesList: "Les #NB prochains quizs devant être publiés", + needBeCompleted: "Quiz incomplet", + nextDateWithoutQuestionnaire: "Prochaine date sans quiz programmé : ", + haveBeenPublished : ":NB nouveaux questionnaires ont été publiés.", + haveBeenRegenerated : "Les fichiers HTML de #NB1 questionnaires et #NB2 rubriques ont été regénérés." +}; \ No newline at end of file diff --git a/lang/fr/questionnaireaccess.js b/lang/fr/questionnaireaccess.js new file mode 100644 index 0000000..8b6645a --- /dev/null +++ b/lang/fr/questionnaireaccess.js @@ -0,0 +1,5 @@ +module.exports = +{ + "notFound" : "Les informations d'un questionnaire attribué à un abonné n'ont pas été trouvées : ", + "searchIsNotLongEnough" : "Merci de fournir un mot-clés d'au moins deux caractères pour votre recherche." +}; \ No newline at end of file diff --git a/lang/fr/subscription.js b/lang/fr/subscription.js new file mode 100644 index 0000000..29d692c --- /dev/null +++ b/lang/fr/subscription.js @@ -0,0 +1,34 @@ +module.exports = +{ + needNumberOfDays : "Il faut un nombre de jours pour l'abonnement.", + needIntegerNumberOfDays : "Le nombre de jours de l'abonnement doit être un nombre entier.", + needMinNumberOfDays : "Le nombre de jours de l'abonnement ne peut être négatif !", + needNotTooLongDaysList : "La liste de jours sélectionnés n'a pas le bon format (trop longue).", + needValidDaysList : "La liste de jours sélectionnés n'a pas le bon format. Caractère non valide : ", + needUniqueDaysList : "La liste de jours sélectionnés n'a pas le bon format. Doublon : ", + needKnowIfNoticeOk : "Il manque l'information sur l'acceptation ou non de recevoir des notifications.", + unsubscriptionOk : "Votre demande a bien été prise en compte. Vous ne recevrez plus de messages venant du site, sauf pour vous signaler la fin de votre abonnement.
    N'hésitez pas à accéder à votre compte pour de nouveau autoriser certains envois.", + unsubscriptionFail : "Si vous voyez ce message, c'est que votre lien de désabonnement ne fonctionne pas.
    Vous pouvez accéder à votre compte pour désactiver les envois manuellement.", + allSubscriptionProcessed : "Tous les abonnés ont été traités pour le moment.", + mailStopMailLinkTxt : "Stopper les envois.", + mailNewQuestionnaireBodyTxt : "Bonjour USER_NAME,\n\nUn nouveau quiz vient de vous être proposé :\n\nQUESTIONNAIRE_URL\n\nBonne lecture !\n\nStopper les envois ?\nUNSUBSCRIBE_URL", + noNewQuestionnaireForUser : "Aucun nouveau questionnaire trouvé pour un abonné : ", + mailEndFreeTimeSubject: "Votre abonnement gratuit va expirer", + mailEndFreeTimeLinkTxt : "M'abonner.", + mailEndFreeTimeBodyTxt: "Bonjour USER_NAME,\n\nVotre abonnement gratuit à SITE_NAME va expirer d'ici quelques jours.\n\nPour continuer à utiliser le site, vous pouvez sans attendre souscrire à un abonnement :\nLINK_URL", + mailEndFreeTimeBodyHTML: "

    Bonjour USER_NAME,

    Votre abonnement gratuit à SITE_NAME va expirer d'ici quelques jours.

    Pour continuer à utiliser le site, vous pouvez souscrire à un abonnement sans tarder en cliquant sur le lien ci-dessous.

    ", + mailEndFreeTimeMessage: " relances envoyées.", + + mailExpirationSubject: "Votre abonnement va bientôt expirer", + mailExpirationLinkTxt : "Prolonger mon abonnement.", + mailExpirationBodyTxt: "Bonjour USER_NAME,\n\nVotre abonnement à SITE_NAME va expirer d'ici quelques jours.\n\nPour continuer à utiliser le site, vous pouvez le prolonger dès aujourd'hui :\nLINK_URL", + mailExpirationBodyHTML: "

    Bonjour USER_NAME,

    Votre abonnement à SITE_NAME va expirer d'ici quelques jours.

    Pour continuer à utiliser SITE_NAME, vous pouvez le prolonger dès aujourd'hui en cliquant sur le lien ci-dessous.

    ", + + mailExpirationMessage: "FIRST premières et SECOND deuxièmes relances envoyées pour des abonnements expirant d'ici peu.", + infosNbDays: "Votre abonnement est encore valable pendant NB_DAYS jours.
    Vous pouvez à tout moment prolonger votre abonnement en suivant les indications ci-dessous :", + infosExpirated: "Votre abonnement a expiré, mais il vous reste encore quelques jours avant que votre compte et vos données ne soient complètement supprimées.
    Pour ce faire, suivez sans tarder les indications ci-dessous :", + infosNbDaysAdmin: "Cet abonnement est encore valable pendant NB_DAYS jours.", + infosExpiratedAdmin: "Cet abonnement a expiré.", + isNotValided : "Cet utilisateur n'a pas encore validé son compte.
    Vous pouvez le faire à sa place en cochant la case indiquée et enregistrant.", + infosPaymentsAdmin : "DATE_PAYMENT : paiement de AMOUNT € au nom de CLIENT_NAME.", +}; diff --git a/lang/fr/tag.js b/lang/fr/tag.js new file mode 100644 index 0000000..1c8e88c --- /dev/null +++ b/lang/fr/tag.js @@ -0,0 +1,11 @@ +module.exports = +{ + needName: "Merci de donner un nom à cette nouvelle étiquette.", + needUniqueName: "Une étiquette ayant le même nom existe déjà.", + needNotTooLongName: "Merci de saisir un nom d'étiquette ne contenant pas plus de 100 caractères.", + needUrl : "Merci de saisir une url pour cette étiquette.", + needUniqueUrl : "Une étiquette ayant la même url existe déjà.", + notFound: "Le tag n'a pas été trouvé.", + tagsForQuestionnaireNotFound: "Il manque la liste des tags actuellement associés à ce questionnaire.", + tagMetaDescription: "une sélection d'articles Wikipédia et de quizs sur le thème : " +}; \ No newline at end of file diff --git a/lang/fr/user.js b/lang/fr/user.js new file mode 100644 index 0000000..361172a --- /dev/null +++ b/lang/fr/user.js @@ -0,0 +1,85 @@ +module.exports = +{ + notFound: "L'utilisateur n'a pas été trouvé.", + needName: "Merci de choisir un nom d'utilisateur.", + needNotTooLongName: "Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.", + needEmail: "Merci de saisir votre adresse e-mail.", + needUniqueEmail: "L'adresse e-mail que vous avez saisie est déjà utilisée par un autre utilisateur. Si vous avez déjà un compte, cliquez-ici pour vous connecter.", + needNotTooLongEmail: "Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.", + needPassWord : "Merci de fournir un mot de passe.", + needLongPassWord : "Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.", + passwordCopied: "Le mot de passe généré a été copié dans votre presse-papier. Vous pouvez le recopier (Ctrl+V) où vous le souhaitez.", + needStatus : "Il manque le statut.", + needLanguage : "Il manque le code langue.", + needValidLastConnectionDate : "La date de dernière connexion n'est pas valide.", + needSMTP : "Il manque le serveur SMTP.", + needSMTPNotFound : "Il manque le serveur SMTP.", + needKnowNewsletterOk : "Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.", + needTimeDifference : "Il faut connaître le nombre de minutes du décalage horaire.", + needMinTimeDifference : "Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.", + needMaxTimeDifference : "Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.", + needUGCOk : "Vous devez accepter les CGU pour pouvoir créer votre compte. ", + godfatherNotFound: "Aucun utilisateur n'a été trouvé pour ce code parrain.", + godfatherFound: "Votre parrain a bien été trouvé !", + mailValidationMessage: "Votre inscription est bien enregistrée.\nPour la finaliser, merci de cliquer dans les 24H sur le lien de confirmation qui vient de vous être envoyé par e-mail.", + mailValidationLinkSubject : "Merci de valider votre inscription", + mailValidationLinkTxt : "Valider mon compte.", + mailValidationLinkSBodyTxt : "Bonjour USER_NAME,\n\nPour valider votre inscription, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL", + mailValidationLinkSBodyHTML : "

    Bonjour USER_NAME,

    Pour valider votre inscription, merci de cliquer sur le lien ci-dessous dans les 24h.

    ", + validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue !
    Vous pouvez sans tarder vous connecter ci-dessous pour accéder à votre compte.", + validationMessageAdmin: "Le compte a bien été validé.", + validationAlreadyMessage: "Il semble que vous ayez déjà validé votre compte.", + validationAlreadyMessageAdmin: "Ce compte a déjà été validé.", + mailWelcomeSubject : "Bienvenue !", + mailWelcomeLinkTxt : "Me connecter à mon compte.", + mailWelcomeBodyTxt : "Bonjour USER_NAME,\n\nVous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !\n\nSi vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.\n\nJe vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois du site n'arrivent en \"spam\".\n\nPar ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi les quizs du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.\n\nPour ce faire, utilisez le lien suivant : LINK_URL\n\nEncore merci et à bientôt.", + mailWelcomeBodyHTML : "

    Bonjour USER_NAME,

    Vous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !

    Si vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.

    Je vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois du site n'arrivent en spam.

    Par ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi les quizs du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.

    Pour ce faire, utilisez le lien ci-dessous.

    Encore merci et à bientôt.", + mailThankGodfatherSubject : "Merci !", + mailThankGodfatherLinkTxt : "Me connecter à mon compte.", + mailThankGodfatherBodyTxt : "Bonjour USER_NAME,\nGrâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nMerci et à bientôt !", + mailThankGodfatherBodyHTML : "

    Bonjour USER_NAME,

    Grâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.

    Merci et à bientôt !

    ", + badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.", + emailNotFound: "Aucun utilisateur trouvé pour cette adresse e-mail.", + alreadyConnected: "Vous êtes déjà connecté(e) au site !", + needBeConnected: "Vous devez être connecté(e) pour accéder à cette page.", + connectionOk: "Connexion réussie.", + needChooseLoginWay: "Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.", + needValidationToLogin : "Vous devez d'abord valider votre compte avant de vous connecter. Pour ce faire, un lien vient de vous être envoyé par e-mail.", + tooManyLoginFails : "Trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.", + badPassword: "Le mot de passe n'est pas le bon.", + mailLoginLinkSubject : "Votre lien de connexion.", + mailLoginLinkTxt : "Me connecter.", + mailLoginLinkBodyTxt : "Bonjour USER_NAME,\n\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL", + mailLoginLinkBodyHTML : "

    Bonjour USER_NAME,

    Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :

    ", + mailLoginLinkMessage : "Un lien de connexion vient de vous être envoyé sur votre adresse e-mail. Ne tardez pas à l'utiliser, car il n'est valable que durant ", + updatedOkMessage: "Vos informations ont bien été mises à jour.", + updatedNeedGoodEmail : "Mais la nouvelle adresse e-mail n'a pu être enregistrée car elle n'a pas un format correct.", + updatedNeedUniqueEmail : "Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.", + mailUpdateLoginSubject : "Merci de valider vos nouveaux identifiants.", + mailUpdateLoginLinkTxt : "Valider.", + mailUpdateLoginBodyTxt : "Bonjour USER_NAME,\n\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL", + mailUpdateLoginBodyHTML : "

    Bonjour USER_NAME,

    Pour valider vos nouveaux identifiants de connexion, cliquez sur le lien ci-dessous sans tarder.

    ", + mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (email et/ou mot de passe) et vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement. En attendant, merci de continuer à utiliser vos anciens identifiants.", + updatedNeedValidatedUser: "L'utilisateur que vous souhaité modifier n'existe pas/plus ou n'a pas encore validé son compte.", + updatedNeedGoodGodfather : "Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.", + mailUpdateLoginOkMessage: "La mise à jour de vos identifiants a bien été enregistrée.", + updatedFailedGodfatherNotFound : "L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.", + creationOkMessage: "Le nouvel utilisateur a bien été enregistré.", + mailDeleteSubject : "Confirmer la suppression de votre compte.", + mailDeleteLinkTxt : "Confirmer.", + mailDeleteBodyTxt : "Bonjour USER_NAME,\n\nPour confirmer la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL", + mailDeleteBodyHTML : "

    Bonjour USER_NAME,

    Pour confirmer la suppression de votre compte, cliquez sur le lien ci-dessous sans tarder.

    ", + mailDeleteLinkMessage: "Votre demande de suppression a bien été enregistrée. Merci de cliquer sans tarder sur le lien qui vient de vous être envoyé par e-mail pour confirmer.", + deleteOkMessage: "L'utilisateur a bien été supprimé.", + deleteFailMessage: "Tentative de suppression d'un utilisateur inexistant : ", + mailDeleteLinkOkMessage: "Votre compte a bien été supprimé. Merci d'avoir utilisé nos services.", + mailDeleteLinkAlreadyMessage: "Il semble que vous ayez déjà validé la suppression de votre compte.", + mailDeleteLinkFailMessage: "Votre lien de suppression n'est pas valide ou alors il n'est plus valable.", + cronDeleteUnvalidedUsersMessage: " comptes utilisateurs non validés ont été supprimés.", + deleteInactiveUsersMessage: " comptes utilisateurs inactifs ont été supprimés.", + welcomeMessage: "Bienvenue #NAME !", + byebyeMessage: "Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.
    À bientôt !", + infosUserForAdmin: "Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE.
    Date de sa dernière connexion : DATE_CONNECTION.", + infosAdminGodfather: "Cet utilisateur a été parrainé par ", + infosAdminNbGodChilds: "Ses #NB filleuils : " +}; \ No newline at end of file diff --git a/lang/fr/userdeleted.js b/lang/fr/userdeleted.js new file mode 100644 index 0000000..672b107 --- /dev/null +++ b/lang/fr/userdeleted.js @@ -0,0 +1,7 @@ +module.exports = +{ + needValidCreationDate: "La date de création du compte fournie n'a pas un format valide.", + needValidDeleteDate: "La date de suppression du compte fournie n'a pas un format valide.", + needKnowIfWasValided: "Nous devons savoir si ce compte était validé ou pas.", + needKnowIfWasPremium: "Nous devons savoir si ce compte avait un abonnement prémium ou pas." +}; \ No newline at end of file diff --git a/middleware/auth.js b/middleware/auth.js new file mode 100644 index 0000000..547647c --- /dev/null +++ b/middleware/auth.js @@ -0,0 +1,37 @@ +const jwt=require("jsonwebtoken"); + +const config=require("../config/main.js"); + +const userTools=require("../controllers/user.js"); + +const txt = require("../lang/"+config.adminLang+"/general"); + +module.exports = async (req, res, next) => +{ + try + { + if(!req.headers.authorization) + throw { message: txt.failAuthHeader, status:401 }; + else + { + const token=req.headers.authorization.split(" ")[1]; // Le header contient "Bearer" avant le token lui-même. + const connectedUser=await userTools.checkTokenUser(token); + if(connectedUser===false) + throw { message: txt.failAuthToken, status:403 }; + else + { + if (req.body.UserId && req.body.UserId !== connectedUser.User.id && connectedUser.User.status==="user") + throw { message: txt.failAuthId+req.body.UserId +" vs "+connectedUser.User.id, status:403 }; + else + { + req.connectedUser=connectedUser; + next(); + } + } + } + } + catch(e) + { + next(e); + } +}; \ No newline at end of file diff --git a/middleware/authAdmin.js b/middleware/authAdmin.js new file mode 100644 index 0000000..f9b57e0 --- /dev/null +++ b/middleware/authAdmin.js @@ -0,0 +1,37 @@ +const jwt=require("jsonwebtoken"); + +const config=require("../config/main.js"); + +const userTools=require("../controllers/user.js"); + +const txt = require("../lang/"+config.adminLang+"/general"); + +module.exports = async (req, res, next) => +{ + try + { + if(!req.headers.authorization) + throw { message: txt.failAuthHeader, status:401 }; + else + { + const token=req.headers.authorization.split(" ")[1]; // Le header contient "Bearer" en un espace avant le token lui-même. + const connectedUser=await userTools.checkTokenUser(token); + if(connectedUser===false) + throw { message: txt.failAuthToken, status:403 }; + else + { + if(["admin","manager","creator"].indexOf(connectedUser.User.status) === -1) + throw { message: txt.notAllowed+" ("+connectedUser.User.id+")", status: 403 }; + else + { + req.connectedUser=connectedUser; + next(); + } + } + } + } + catch(e) + { + next(e); + } +}; \ No newline at end of file diff --git a/middleware/cronAuth.js b/middleware/cronAuth.js new file mode 100644 index 0000000..ff74e19 --- /dev/null +++ b/middleware/cronAuth.js @@ -0,0 +1,29 @@ +const config = require("../config/main.js"); +const toolFile = require("../tools/file"); + +const txt = require("../lang/"+config.adminLang+"/general"); + +module.exports = async (req, res, next) => +{ + try + { + // possibilité de bloquer si ip appel non acceptée ? + if (req.params.token !== config.cronToken) + { + const newCountFail={ ip: req.ip, lastTime: new Date() }; // utile vu qu'il y a les logs généraux ? + let logsCronFail=await toolFile.readJSON(config.dirTmp, "cronfails"); + if(!logsCronFail) + logsCronFail=[newCountFail]; + else + logsCronFail.unshift(newCountFail); + await toolFile.createJSON(config.dirTmp, "cronfails", logsCronFail); + throw { message:txt.failAuthCron, status:401 }; + } + else + next(); + } + catch(e) + { + next(e); + } +}; \ No newline at end of file diff --git a/middleware/initialise.js b/middleware/initialise.js new file mode 100644 index 0000000..a312c81 --- /dev/null +++ b/middleware/initialise.js @@ -0,0 +1,18 @@ +// Pour l'instant se contente d'initialiser la durée de certains scripts... +const config = require("../config/main.js"); + +const txt = require("../lang/"+config.adminLang+"/general"); + +module.exports = async (req, res, next) => +{ + try + { + req.timeBegin=Date.now();// bug étrange quand appelé dans app.js, ce qui aurait été + simple... + next(); + } + catch(e) + { + res.status(500).json({ errors: txt.serverError }); + next(e); + } +}; \ No newline at end of file diff --git a/middleware/multer-config.js b/middleware/multer-config.js new file mode 100644 index 0000000..4806686 --- /dev/null +++ b/middleware/multer-config.js @@ -0,0 +1,48 @@ +const multer = require("multer"); +const slugify = require('slugify'); +const fs = require("fs-extra"); + +const configIllustrations = require("../config/illustrations.js"); + +const config = require("../config/main.js"); +const txt = require("../lang/"+config.adminLang+"/illustration"); + +const storage = multer.diskStorage( +{ + destination: (req, file, callback) => + { + callback(null, configIllustrations.dirIllustrationsTmp);// sera ensuite redimensionnée dans son répertoire final + }, + filename: (req, file, callback) => + { + // par défaut, multer créé un nom de fichier unique, mais aléatoire et sans extension. + let name=file.originalname; + let extension = name.substring(name.lastIndexOf(".") + 1).toLowerCase(); + name=slugify(name.substring(0, name.lastIndexOf(".")).substring(0, 230), { lower:true }); + name=name+"-"+Date.now()+"."+extension; + callback(null, name); + } +}); + +const fileFilter = (req, file, callback) => +{ + if(config.mimeTypesForIllustration.indexOf(file.mimetype) ===-1) + { + callback(null, false); + req.body.fileError=txt.needGoodFile; + } + else + callback(null, true); +} + +try +{ + module.exports = multer({storage: storage, fileFilter}).single("image"); + // -> indique que nous permettons uniquement le téléversement d'un fichier via un champ nommé "image". + // Même si plusieurs illustrations sont possibles, elles seront téléversées et enregistrées séparément. + // module.exports = multer({storage: storage, limits : {fileSize:... }, fileFilter}).single("image"); -> pas possible d'intercepter l'erreur si fichier trop gros ? +} +catch(e) +{ + next(e); +} \ No newline at end of file diff --git a/models/Answer.js b/models/Answer.js new file mode 100644 index 0000000..62ffc94 --- /dev/null +++ b/models/Answer.js @@ -0,0 +1,75 @@ +"use strict"; + +const config = require("../config/main.js"); +const txt = require("../lang/"+config.adminLang+"/answer"); +// !! Attention, car on teste ici des données envoyées par l'application. +// Donc ne pas afficher les messages à l'utilisateur final, mais les journaliser. + +module.exports = (sequelize, DataTypes) => +{ + const Answer = sequelize.define("Answer", + { + nbQuestions: + { + type: DataTypes.INTEGER(2).UNSIGNED, allowNull: false, + comment: "The number of questions in the quiz may change between answers.", + validate: + { + notNull: { msg: txt.needNumberUserResponses }, + isInt: { msg: txt.needIntegerNumberUserResponses }, + min: + { + args: [1], + msg: txt.needMinNumberUserResponses + }, + max: + { + args: [100],// dans le contrôleur plutôt comparer au nombre de question du questionnaire. + msg: txt.needMaxNumberUserResponses + } + } + }, + nbCorrectAnswers: + { + type: DataTypes.INTEGER(2).UNSIGNED, allowNull: false, + validate: + { + notNull: { msg: txt.needNumberCorrectResponses }, + isInt: { msg: txt.needIntegerNumberCorrectResponses }, + min: + { + args: [0], + msg: txt.needMinNumberCorrectResponses + }, + moreAnswersThanQuestions(value) + { + if(parseInt(value,10) > parseInt(this.nbQuestions,10)) + throw new Error(txt.needMaxNumberCorrectResponses); + } + } + }, + duration: + { + type: DataTypes.INTEGER(5).UNSIGNED, + validate: + { + isInt: { msg: txt.needIntegerNumberSecondesResponse }, + min: + { + args: [0], + msg: txt.needMinNumberSecondesResponse + } + } + } + }, + { + timestamps: true, + updatedAt: false + }); + Answer.associate = function(models) + { + Answer.belongsTo(models.User, { foreignKey: { name: "UserId", allowNull: false }, onDelete: 'CASCADE', onUpdate: 'CASCADE' }); + Answer.belongsTo(models.Questionnaire, { foreignKey: { name: "QuestionnaireId", allowNull: false }, onDelete: 'CASCADE', onUpdate: 'CASCADE' }); + }; + return Answer; +}; \ No newline at end of file diff --git a/models/Choice.js b/models/Choice.js new file mode 100644 index 0000000..4e33427 --- /dev/null +++ b/models/Choice.js @@ -0,0 +1,54 @@ +"use strict"; + +const striptags = require("striptags"); + +const tool = require("../tools/main"); +const config = require("../config/main.js"); +const txt = require("../lang/"+config.adminLang+"/choice"); +const txtGeneral = require("../lang/"+config.adminLang+"/general"); +// !! Attention, car on teste ici des données envoyées par l'application. +// Donc ne pas afficher les messages à l'utilisateur final, mais les journaliser. + +module.exports = (sequelize, DataTypes) => +{ + const Choice = sequelize.define("Choice", + { + text: + { + type:DataTypes.STRING(255), allowNull: false, + set(value) { this.setDataValue("text", tool.trimIfNotNull(striptags(value))); }, + validate: + { + notNull: { msg: txt.needTextForChoice }, // mais si vide, le contrôleur ne lancera pas l'enregistrement + len: + { + args: [1, 255], + msg: txt.needGoodLongTextForChoice + } + } + }, + isCorrect: + { + type: DataTypes.BOOLEAN, allowNull: false, defaultValue:false, + comment: "Necessary to designate the correct answers to a quiz.", + validate: + { + notNull: { msg: txt.needKnowIsCorrectChoice }, + isIn: + { + args: [[true, false]], + msg: txt.needKnowIsCorrectChoice+" "+txtGeneral.notValidFormat + } + } + } + }, + { + charset: "utf8mb4", + collate: "utf8mb4_unicode_ci" + }); + Choice.associate = function(models) + { + Choice.belongsTo(models.Question, { foreignKey: { name: "QuestionId", allowNull: false }, onDelete: 'CASCADE', onUpdate: 'CASCADE' }); + }; + return Choice; +}; \ No newline at end of file diff --git a/models/Illustration.js b/models/Illustration.js new file mode 100644 index 0000000..6bd6898 --- /dev/null +++ b/models/Illustration.js @@ -0,0 +1,84 @@ +"use strict"; + +const striptags = require("striptags"); + +const tool = require("../tools/main"); + +const config = require("../config/main.js"); +const txt = require("../lang/"+config.adminLang+"/illustration"); + +module.exports = (sequelize, DataTypes) => +{ + const Illustration = sequelize.define("Illustration", + { + url: // pas saisie, mais générée par "multer" lors du téléversement + { + type: DataTypes.STRING(255), allowNull: false, + set(value) { this.setDataValue("url", striptags(value)); }, + unique: + { + args: true, + msg: txt.needUniqueUrl + }, + comment: "Part of the url corresponding to the file name.", + validate: + { + notNull: { msg: txt.needUrl }, + len: + { + args: [5, 255], + msg: txt.needGoodLongUrl + } + } + }, + alt: + { + type: DataTypes.STRING(255), + set(value) { this.setDataValue("alt", tool.trimIfNotNull(striptags(value))); }, + validate: + { + len: + { + args: [0, 255], + msg: txt.needGoodLongAlt + } + } + }, + title: + { + type: DataTypes.STRING(255), + set(value) { this.setDataValue("title", tool.trimIfNotNull(striptags(value))); }, + validate: + { + len: + { + args: [0, 255], + msg: txt.needGoodLongTitle + } + } + }, + caption: + { + type: DataTypes.STRING(255), + set(value) { this.setDataValue("caption", tool.trimIfNotNull(striptags(value, ""))); }, // on accepte balise "a" car lien possible pour crédit image + validate: + { + len: + { + args: [0, 255], + msg: txt.needGoodLongCaption + } + } + } + }, + { + charset: "utf8mb4", + collate: "utf8mb4_unicode_ci" + } + ); + Illustration.associate = function(models) + { + Illustration.belongsTo(models.Questionnaire, { foreignKey: { name: "QuestionnaireId", allowNull: false }, onDelete: 'CASCADE', onUpdate: 'CASCADE' }); + }; + return Illustration; +}; \ No newline at end of file diff --git a/models/Link.js b/models/Link.js new file mode 100644 index 0000000..38fdb5f --- /dev/null +++ b/models/Link.js @@ -0,0 +1,53 @@ +"use strict"; + +const striptags = require("striptags"); + +const tool = require("../tools/main"); + +const config = require("../config/main.js"); +const txt = require("../lang/"+config.adminLang+"/link"); + +module.exports = (sequelize, DataTypes) => +{ + const Link = sequelize.define("Link", + { + url: + { + type: DataTypes.STRING(255), allowNull: false, + set(value) { this.setDataValue("url", tool.trimIfNotNull(striptags(value))); }, + validate: + { + notNull: { msg: txt.needUrl }, + isUrl: { msg: txt.needValidUrl }, + len: + { + args: [0, 255], + msg: txt.needNotTooLongUrl + } + } + }, + anchor: + { + type:DataTypes.STRING(150), allowNull: false, + set(value) { this.setDataValue("anchor", tool.trimIfNotNull(striptags(value))); }, + validate: + { + notNull: { msg: txt.needAnchor }, + len: + { + args: [5, 150], + msg: txt.needGoodLongAnchor + } + } + } + }, + { + charset: "utf8mb4", + collate: "utf8mb4_unicode_ci" + }); + Link.associate = function(models) + { + Link.belongsTo(models.Questionnaire, { foreignKey: { name: "QuestionnaireId", allowNull: false }, onDelete: 'CASCADE', onUpdate: 'CASCADE' }); + }; + return Link; +}; \ No newline at end of file diff --git a/models/Pause.js b/models/Pause.js new file mode 100644 index 0000000..fc8a4be --- /dev/null +++ b/models/Pause.js @@ -0,0 +1,62 @@ +"use strict"; + +const striptags = require("striptags"); + +const tool = require("../tools/main"); + +const config = require("../config/main.js"); +const txt = require("../lang/"+config.adminLang+"/pause"); + +module.exports = (sequelize, DataTypes) => +{ + const Pause = sequelize.define("Pause", + { + name: + { + type: DataTypes.STRING(255), allowNull: false, + set(value) { this.setDataValue("name", tool.trimIfNotNull(striptags(value))); }, + validate: + { + notNull: { msg: txt.needName }, + len: + { + args: [1, 255], + msg: txt.needGoodLongName + } + } + }, + startingAt: + { + type: DataTypes.DATE, allowNull: false, defaultValue: DataTypes.NOW, + validate: + { + notNull: { msg: txt.needStartingDate }, + isDate: { msg: txt.needValidStartingDate } + } + }, + endingAt: + { + type: DataTypes.DATE, allowNull: false, + validate: + { + notNull: { msg: txt.needEndingDate }, + isDate: { msg: txt.needValidEndingDate }, + dateOk(value) + { + if (value<=this.startingAt) + throw new Error(txt.needMinEndingDate); + } + } + } + }, + { + charset: "utf8mb4", + collate: "utf8mb4_unicode_ci" + } + ); + Pause.associate = function(models) + { + Pause.belongsTo(models.Subscription, { foreignKey: { name: "SubscriptionId", allowNull: false, unique: true }, onDelete: "CASCADE", onUpdate: "CASCADE" }); + }; + return Pause; +}; \ No newline at end of file diff --git a/models/Payment.js b/models/Payment.js new file mode 100644 index 0000000..8f2e004 --- /dev/null +++ b/models/Payment.js @@ -0,0 +1,59 @@ +"use strict"; + +const striptags = require("striptags"); + +const tool = require("../tools/main"); + +const config = require("../config/main.js"); +const txt = require("../lang/"+config.adminLang+"/payment"); + +module.exports = (sequelize, DataTypes) => +{ // toutes les données viennent de WP, donc je ne maîtrise pas! + const Payment = sequelize.define("Payment", + { + clientName: + { + type:DataTypes.STRING(255), allowNull: false, + set(value) + { + value=tool.trimIfNotNull(striptags(value)).substring(0,255); + this.setDataValue("clientName", value); + }, + validate: + { + notNull: { msg: txt.needName } + } + }, + amount: + { + type: DataTypes.INTEGER(4).UNSIGNED, allowNull: false, + validate: + { + notNull: { msg: txt.needAmount }, + isInt : { msg: txt.needCorrectAmount } + } + }, + codeCommande: + { + type:DataTypes.STRING(25), allowNull: false, + set(value) + { + value=tool.trimIfNotNull(striptags(value)).substring(0,25); + this.setDataValue("codeCommande", value); + }, + validate: + { + notNull: { msg: txt.needCode } + } + } + }, + { + charset: "utf8mb4", + collate: "utf8mb4_unicode_ci" + }); + Payment.associate = function(models) + { + Payment.belongsTo(models.User, { foreignKey: { name: "UserId", allowNull: false }, onDelete: 'CASCADE', onUpdate: 'CASCADE' }); + }; + return Payment; +}; \ No newline at end of file diff --git a/models/Question.js b/models/Question.js new file mode 100644 index 0000000..863ac5f --- /dev/null +++ b/models/Question.js @@ -0,0 +1,60 @@ +"use strict"; + +const striptags = require("striptags"); + +const tool = require("../tools/main"); + +const config = require("../config/main.js"); +const txt = require("../lang/"+config.adminLang+"/question"); + +module.exports = (sequelize, DataTypes) => +{ + const Question = sequelize.define('Question', + { + text: + { + type:DataTypes.STRING(255), allowNull: false, + set(value) { this.setDataValue('text', tool.trimIfNotNull(striptags(value))); }, + validate: + { + notNull: { msg: txt.needText }, + len: + { + args: [1, 255], + msg: txt.needNotTooLongText + } + } + }, + explanation: + { + type: DataTypes.TEXT, + set(value) { this.setDataValue('explanation', tool.trimIfNotNull(striptags(value))); }, + comment: "Allows you to display explanation for this question after checking the user's answers." + }, + rank: + { + type: DataTypes.INTEGER(2).UNSIGNED, allowNull: false, defaultValue:1, + comment: "Ranking of the answer among those proposed.", + validate: + { + notNull: { msg: txt.needNumberForRank }, + isInt: { msg: txt.needNumberForRank }, + min: + { + args: [1], + msg: txt.needNumberForRank + } + } + } + }, + { + charset: "utf8mb4", + collate: "utf8mb4_unicode_ci" + }); + Question.associate = function(models) + { + Question.hasMany(models.Choice); + Question.belongsTo(models.Questionnaire, { foreignKey: { name: "QuestionnaireId", allowNull: false }, onDelete: 'CASCADE', onUpdate: 'CASCADE' }); + }; + return Question; +}; \ No newline at end of file diff --git a/models/Questionnaire.js b/models/Questionnaire.js new file mode 100644 index 0000000..4c0c60a --- /dev/null +++ b/models/Questionnaire.js @@ -0,0 +1,136 @@ +"use strict"; + +const striptags = require("striptags"); + +const slugify = require("slugify"); +const tool = require("../tools/main"); + +const config = require("../config/main.js"); +const txt = require("../lang/"+config.adminLang+"/questionnaire"); +const txtGeneral = require("../lang/"+config.adminLang+"/general"); + +module.exports = (sequelize, DataTypes) => +{ + const Questionnaire = sequelize.define("Questionnaire", + { + title: + { + type: DataTypes.STRING(255), allowNull: false, + set(value) + { + this.setDataValue("title", tool.trimIfNotNull(striptags(value))); + }, + validate: + { + notNull: { msg: txt.needTitle }, + len: + { + args: [1, 255], + msg: txt.needNotTooLongTitle + } + } + }, + slug: + { + type: DataTypes.STRING(150), allowNull: false, + unique: + { + args: true, + msg: txt.needUniqueUrl + }, + set(value) + { + value=tool.trimIfNotNull(striptags(value)); + if(value!==null) + this.setDataValue("slug", slugify(value.substring(0,150), { lower:true, strict:true })); + else if(this.title!==null) + this.setDataValue("slug", slugify(this.title.substring(0,150), { lower:true, strict:true })); + }, + validate: + { + notNull: { msg: txt.needUrl } + } + }, + introduction: + { + type: DataTypes.TEXT, allowNull: false, + set(value) { this.setDataValue("introduction", tool.trimIfNotNull(striptags(value,"