/******/ (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 (local)", 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 (local)", 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: 10, freeAccountExpirationNotificationInDays: 5, accountExpirationFirstNotificationInDays: 14, accountExpirationSecondNotificationInDays: 5, inactiveAccountTimeToDeleteInDays: 180, // Questionnaires: nbQuestionsMin: 1, // minimum number of questions for the questionnaire to be publishable nbQuestionsMax: 2, // 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", 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 }; /***/ }), /***/ "../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 : 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." }; /***/ }), /***/ "../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: "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." }; /***/ }), /***/ "../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 pour un compte 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 de votre ordinateur (ou mobile). Vous pouvez le \"coller\" 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 un serveur SMTP valide.", 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: "Merci d'accepter les CGU pour créer votre compte.", godfatherNotFound: "Désolé mais aucun utilisateur n'a été trouvé pour ce code/e-mail parrain :(", godfatherFound: "Votre \"parrain\" a bien été trouvé :)", mailValidationMessage: "Votre inscription est bien enregistrée.\nPour la finaliser, merci de cliquer dans les 24 H 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 espace WikiLerni.", 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\nÀ bientôt sur NOM_SITE.", 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.

À bientôt sur NOM_SITE.", 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.\nSi dans l'avenir cette personne souscrit un abonnement prémium, votre propre abonnement sera prolongé de 30 jours.\nEncore merci et à bientôt !", mailThankGodfatherBodyHTML: "

Bonjour USER_NAME,

Grâce à vous, un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.
Si dans l'avenir cette personne souscrit un abonnement prémium, votre propre abonnement sera prolongé de 30 jours.

Encore 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 compte utilisateur n'a été trouvé pour cette adresse e-mail.", alreadyConnected: "Vous êtes déjà connecté au site !", needBeConnected: "Vous devez être connecté 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 pouvoir vous connecter. Pour ce faire, un nouveau lien vient de vous être envoyé par e-mail.", tooManyLoginFails: "Désolé mais il y a eu trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.", badPassword: "Aucun compte utilisateur ne correspond aux informations saisies.", 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 *TIMING* !", 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 (e-mail 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 souhaitez 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 a expiré.", 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", "./wikilerni/config/fr.js": "../views/wikilerni/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.html", 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.", tagsListTxt: "Parcourir les rubriques :" }; /***/ }), /***/ "../views/wikilerni/config/fr.js": /*!***************************************!*\ !*** ../views/wikilerni/config/fr.js ***! \***************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = { headLinks: [{ anchor: "Contact", attributes: { href: "/contact.html", rel: "nofollow" } }, { anchor: "Parcourir", attributes: { href: "/quizs/", id: "indexHeadLink", title: "Les derniers quizs" } }, { anchor: "Mon compte", attributes: { href: "/connexion.html", id: "accountHeadLink" } }, { anchor: "À propos", attributes: { href: "/a-propos.html" } }], footLinks: [{ anchor: "Blog", attributes: { href: "https://framasphere.org/people/7e54b7a0b53201389eef2a0000053625", title: "Blog WikiLerni sur diaspora*" } }, { 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: "CGV & CGU", attributes: { href: "/CGV-CGU.html", rel: "nofollow" } }], maxQuestionnairesSiteHomePage: 3, maxQuestionnairesByPage: 9, nbQuestionnairesUserHomePage: 3, userHomePage: "accueil.html", adminHomePage: "admin.html", managerHomePage: "gestion.html", subscribePage: "inscription.html", connectionPage: "connexion.html", validationLinkPage: "validation.html?t=", loginLinkPage: "login.html?t=", newLoginLinkPage: "newlogin.html?t=", deleteLinkPage: "aurevoir.html?t=", stopMailPage: "stop-mail.html?t=", accountPage: "compte.html", updateAccountPage: "mon-compte.html", questionnairesManagementPage: "gestion-quizs.html", usersManagementPage: "gestion-utilisateurs.html", aboutPage: "a-propos.html", illustrationDir: "/img/quizs/", siteSlogan: "Cultivons notre jardin !", homePageTxt: "Page d'accueil", 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.
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.", homeBtnAboutTxt: "En savoir plus sur WikiLerni ?", homeBtnSubscribeTxt: "Tester WikiLerni gratuitement.", 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 avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.

Suivant les questions, une ou plusieurs réponses peuvent être correctes et doivent donc être cochées. C'est toujours le contenu de l'article Wikipédia qui fait foi concernant les \"bonnes\" réponses. Mais les articles de Wikipédia peuvent évoluer, donc n'hésitez pas à me signaler une erreur.

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... Grâce à ce compte, vous pourrez aussi recevoir régulièrement de nouveaux quizs pour continuer à \"cultiver votre jardin\".

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.", newsListTitle: "Les dernières graines de savoir", tagsListTxt: "Parcourir les rubriques", mailRecipientTxt: "Message envoyé à :" }; /***/ }), /***/ "./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.rank + " - " + 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 = Questions.length === 0 ? config.Question.rank.defaultValue : Questions.length + 1; 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\nLe code de WikiLerni est libre et vous pouvez le trouver si Gitlab :\nhttps://gitlab.com/lefablab/wikilerni\n\nPour 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() { // 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 var timeLocal = new Date().getTimezoneOffset() * -1; 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; // c'est le token qui sert à vérifier le statut à 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.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 { 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9nZW5lcmFsJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL2lsbHVzdHJhdGlvbiQiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9saW5rJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3F1ZXN0aW9uJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3F1ZXN0aW9ubmFpcmUkIiwid2VicGFjazovLy8uLi9sYW5nIHN5bmMgXlxcLlxcLy4qXFwvdXNlciQiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcvZnIvZ2VuZXJhbC5qcyIsIndlYnBhY2s6Ly8vLi4vbGFuZy9mci9pbGx1c3RyYXRpb24uanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcvZnIvbGluay5qcyIsIndlYnBhY2s6Ly8vLi4vbGFuZy9mci9xdWVzdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi4vbGFuZy9mci9xdWVzdGlvbm5haXJlLmpzIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL3VzZXIuanMiLCJ3ZWJwYWNrOi8vLy4uL3Rvb2xzL21haW4uanMiLCJ3ZWJwYWNrOi8vLy4uL3ZpZXdzIHN5bmMgXlxcLlxcLy4qXFwuanMkIiwid2VicGFjazovLy8uLi92aWV3cy9kZWZhdWx0L2NvbmZpZy9mci5qcyIsIndlYnBhY2s6Ly8vLi4vdmlld3Mvd2lraWxlcm5pL2NvbmZpZy9mci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvbWFuYWdlUXVlc3Rpb25uYWlyZXMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2RvbS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvZXZlcnl3aGVyZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvZm9ybXMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL3VybC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvdXNlcnMuanMiXSwibmFtZXMiOlsidXNlcnMiLCJyZXF1aXJlIiwicXVlc3Rpb25uYWlyZXMiLCJtb2R1bGUiLCJleHBvcnRzIiwiYXBpVXJsIiwic2l0ZVVybCIsImFkbWluTmFtZSIsImFkbWluRW1haWwiLCJzZW5kZXJOYW1lIiwic2VuZGVyRW1haWwiLCJhZG1pbkxhbmciLCJ0aGVtZSIsImF2YWlsYWJsZUxhbmdzIiwic2l0ZU5hbWUiLCJiZWdpbkNvZGVHb2RmYXRoZXIiLCJjcm9uVGltaW5nQWxlcnRJblNlY29uZGUiLCJyZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlIiwidG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnMiLCJ0b2tlbkxvZ2luTGlua1RpbWVJbkhvdXJzIiwidG9rZW5Db25uZXhpb25NaW5UaW1lSW5Ib3VycyIsInRva2VuQ29ubmV4aW9uTWF4VGltZUluRGF5cyIsInRva2VuTG9naW5DaGFuZ2luZ1RpbWVJbkhvdXJzIiwidG9rZW5EZWxldGVVc2VyVGltZUluSG91cnMiLCJ0b2tlblVuc3Vic2NyaWJlTGlua1RpbWVJbkRheXMiLCJmcmVlQWNjb3VudFRpbWluZ0luRGF5cyIsImZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5cyIsImFjY291bnRFeHBpcmF0aW9uRmlyc3ROb3RpZmljYXRpb25JbkRheXMiLCJhY2NvdW50RXhwaXJhdGlvblNlY29uZE5vdGlmaWNhdGlvbkluRGF5cyIsImluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5cyIsIm5iUXVlc3Rpb25zTWluIiwibmJRdWVzdGlvbnNNYXgiLCJuYkNob2ljZXNNYXgiLCJuYk5ld1F1ZXN0aW9ubmFpcmVzIiwiaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlQmVnaW4iLCJob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQiLCJudW1iZXJOZXdRdWVzdGlvbm5haXJlQXRTYW1lVGltZSIsIm1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzIiwibmJJbGx1c3RyYXRpb25zTWluIiwibmJJbGx1c3RyYXRpb25zTWF4IiwibWF4SWxsdXN0cmF0aW9uU2l6ZWluT2N0ZXQiLCJtaW1lVHlwZXNGb3JJbGx1c3RyYXRpb24iLCJpbGx1c3RyYXRpb25zV2lkdGhNYXhJblB4IiwiaWxsdXN0cmF0aW9uc01pbmlhdHVyZXNXaWR0aE1heEluUHgiLCJuYkxpbmtzTWluIiwibmJMaW5rc01heCIsInBhc3N3b3JkIiwibWlubGVuZ3RoIiwiZGlyQ2FjaGVVc2VycyIsImRpckNhY2hlVXNlcnNBbnN3ZXJzIiwiZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyIsImRpckNhY2hlUXVlc3Rpb25zIiwiZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzIiwiZGlySFRNTFF1ZXN0aW9ubmFpcmUiLCJkaXJXZWJRdWVzdGlvbm5haXJlIiwicXVlc3Rpb25uYWlyZVJvdXRlcyIsImdldFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlcyIsInB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJzYXZlQW5zd2Vyc1JvdXRlIiwiZ2V0U3RhdHNRdWVzdGlvbm5haXJlcyIsInNlYXJjaFF1ZXN0aW9ubmFpcmVzUm91dGUiLCJnZXRSYW5kb21RdWVzdGlvbm5haXJlc1JvdXRlIiwic2VhcmNoQWRtaW5RdWVzdGlvbm5haXJlc1JvdXRlIiwiZ2V0TGlzdE5leHRRdWVzdGlvbm5haXJlcyIsInJlZ2VuZXJhdGVIVE1MIiwicXVlc3Rpb25zUm91dGUiLCJ0YWdzU2VhcmNoUm91dGUiLCJnZXRRdWVzdGlvbm5haXJlc1dpdGhvdXRBbnN3ZXIiLCJnZXRQcmV2aW91c0Fuc3dlcnMiLCJnZXRTdGF0c0Fuc3dlcnMiLCJnZXRBZG1pblN0YXRzIiwiUXVlc3Rpb25uYWlyZSIsInRpdGxlIiwibWF4bGVuZ3RoIiwicmVxdWlyZWQiLCJzbHVnIiwiaW50cm9kdWN0aW9uIiwic2VhcmNoUXVlc3Rpb25uYWlyZXMiLCJRdWVzdGlvbiIsInRleHQiLCJyYW5rIiwibWluIiwiZGVmYXVsdFZhbHVlIiwiQ2hvaWNlIiwibmJUYWdzTWluIiwibmJUYWdzTWF4IiwiZGlyQ2FjaGVUYWdzIiwiZGlySFRNTFRhZ3MiLCJkaXJXZWJUYWdzIiwibmJSYW5kb21SZXN1bHRzIiwidXNlclJvdXRlcyIsInN1YnNjcmliZVJvdXRlIiwiZ2V0R29kZmF0aGVyUm91dGUiLCJjaGVja0lmSXNFbWFpbGZyZWVSb3V0ZSIsImNoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZSIsImNoZWNrTG9naW5Sb3V0ZSIsImNvbm5lY3Rpb25Sb3V0ZSIsImdldExvZ2luTGlua1JvdXRlIiwiY29ubmVjdGlvbldpdGhMaW5rUm91dGUiLCJnZXRVc2VySW5mb3MiLCJjcmVhdGVVc2VyUm91dGUiLCJ2YWxpZGF0ZVVzZXJSb3V0ZSIsInVwZGF0ZVVzZXJJbmZvcyIsInNlYXJjaFVzZXJSb3V0ZSIsImdldEdvZENoaWxkcyIsImNoZWNrTmV3TG9naW5MaW5rUm91dGUiLCJjaGVja0RlbGV0ZUxpbmtSb3V0ZSIsImdldFBheW1lbnRzIiwidW5zdWJzY3JpYmVSb3V0ZSIsIm5hbWUiLCJlbWFpbCIsIm5ld1Bhc3N3b3JkIiwiY29kZUdvZGZhdGhlciIsImNndU9rIiwidmFsdWUiLCJ0aW1lRGlmZmVyZW5jZU1pbiIsInRpbWVEaWZmZXJlbmNlTWF4Iiwic2l0ZUhUTUxUaXRsZSIsInNpdGVNZXRhRGVzY3JpcHRpb24iLCJzY3JpcHRUaW1pbmdJbmZvIiwic2NyaXB0VGltaW5nQWxlcnQiLCJzZXJ2ZXJFcnJvciIsInNlcnZlckVycm9yQWRtaW4iLCJuZWVkZWRQYXJhbXMiLCJiYWRVcmwiLCJub3RWYWxpZEZvcm1hdCIsIm5vdEFsbG93ZWQiLCJub3RSZXF1aXJlZCIsInVwZGF0ZUJ0blR4dCIsImFkZEJ0blR4dCIsImRlbGV0ZUJ0blR4dCIsImFkZE9rTWVzc2FnZSIsInVwZGF0ZU9rTWVzc2FnZSIsImRlbGV0ZU9rTWVzc2FnZSIsImZhaWxBdXRoIiwiZmFpbEF1dGhIZWFkZXIiLCJmYWlsQXV0aFRva2VuIiwiZmFpbEF1dGhJZCIsImZhaWxBdXRoQ3JvbiIsInByZXZpb3VzUGFnZSIsIm5leHRQYWdlIiwiYWxlcnROZXdXaW5kb3ciLCJidG5MaW5rVG9RdWVzdGlvbm5haXJlIiwic3RhdHNBZG1pbiIsIm5lZWRVcmwiLCJuZWVkVW5pcXVlVXJsIiwibmVlZEdvb2RMb25nVXJsIiwibmVlZEdvb2RMb25nQWx0IiwibmVlZEdvb2RMb25nVGl0bGUiLCJuZWVkR29vZExvbmdDYXB0aW9uIiwibmVlZEdvb2RGaWxlIiwibmVlZFF1ZXN0aW9ubmFpcmVGb3JJbGx1c3RyYXRpb24iLCJuZWVkTWF4SWxsdXN0cmF0aW9uc0ZvclF1ZXN0aW9ubmFpcmUiLCJub3RGb3VuZCIsImFkZGVkT2tNZXNzYWdlIiwidXBkYXRlZE9rTWVzc2FnZSIsImRlbGV0ZWRPa01lc3NhZ2UiLCJkZWZhdWx0QWx0IiwiaW50cm9UaXRsZSIsImludHJvTm9JbGx1c3RyYXRpb24iLCJuZWVkVmFsaWRVcmwiLCJuZWVkTm90VG9vTG9uZ1VybCIsIm5lZWRBbmNob3IiLCJuZWVkR29vZExvbmdBbmNob3IiLCJuZWVkUXVlc3Rpb25uYWlyZSIsIm5lZWRNYXhMaW5rc0ZvclF1ZXN0aW9ubmFpcmUiLCJpbnRyb05vTGluayIsIm5lZWRUZXh0IiwibmVlZE5vdFRvb0xvbmdUZXh0IiwibmVlZE1heFF1ZXN0aW9ucyIsImludHJvTm9RdWVzdGlvbiIsIm5lZWROdW1iZXJGb3JSYW5rIiwibmVlZFRpdGxlIiwibmVlZE5vdFRvb0xvbmdUaXRsZSIsIm5lZWRJbnRyb2R1Y3Rpb24iLCJuZWVkQ29ycmVjdFB1Ymxpc2hpbmdEYXRlIiwibmVlZEtub3dJZklzUHVibGlzaGVkIiwibmVlZExhbmd1YWdlIiwibmVlZEVzdGltYXRlZFRpbWUiLCJzZWFyY2hSZXN1bHRUaXRsZSIsInNlYXJjaE5vUmVzdWx0Iiwic2VhcmNoV2l0aFJlc3VsdCIsInF1ZXN0aW9ubmFpcmVzTmFtZSIsInB1Ymxpc2hlZEJ5IiwicHVibGlzaGVkQXQiLCJsYXN0VXBkYXRlZCIsImVzdGltYXRlZFRpbWUiLCJlc3RpbWF0ZWRUaW1lT3B0aW9uIiwic2hvcnQiLCJtZWRpdW0iLCJsb25nIiwiZXhwbGFuYXRpb25CZWZvcmVUeHQiLCJjb3JyZWN0QW5zd2VyVHh0Iiwid3JvbmdBbnN3ZXJUeHQiLCJidG5TZW5kUmVzcG9uc2UiLCJidG5Qcm9wb3NlU3Vic2NyaWJlIiwiYnRuUHJvcG9zZUNvbm5lY3Rpb24iLCJidG5TaG93UXVlc3Rpb25uYWlyZSIsImJ0blNoYXJlUXVpelR4dCIsIm5leHRRdWVzdGlvbm5haXJlc0xpc3QiLCJuZWVkQmVDb21wbGV0ZWQiLCJuZXh0RGF0ZVdpdGhvdXRRdWVzdGlvbm5haXJlIiwiaGF2ZUJlZW5QdWJsaXNoZWQiLCJoYXZlQmVlblJlZ2VuZXJhdGVkIiwibmVlZE5hbWUiLCJuZWVkTm90VG9vTG9uZ05hbWUiLCJuZWVkRW1haWwiLCJuZWVkVW5pcXVlRW1haWwiLCJuZWVkTm90VG9vTG9uZ0VtYWlsIiwibmVlZFBhc3NXb3JkIiwibmVlZExvbmdQYXNzV29yZCIsInBhc3N3b3JkQ29waWVkIiwibmVlZFN0YXR1cyIsIm5lZWRWYWxpZExhc3RDb25uZWN0aW9uRGF0ZSIsIm5lZWRTTVRQIiwibmVlZFNNVFBOb3RGb3VuZCIsIm5lZWRLbm93TmV3c2xldHRlck9rIiwibmVlZFRpbWVEaWZmZXJlbmNlIiwibmVlZE1pblRpbWVEaWZmZXJlbmNlIiwibmVlZE1heFRpbWVEaWZmZXJlbmNlIiwibmVlZFVHQ09rIiwiZ29kZmF0aGVyTm90Rm91bmQiLCJnb2RmYXRoZXJGb3VuZCIsIm1haWxWYWxpZGF0aW9uTWVzc2FnZSIsIm1haWxWYWxpZGF0aW9uTGlua1N1YmplY3QiLCJtYWlsVmFsaWRhdGlvbkxpbmtUeHQiLCJtYWlsVmFsaWRhdGlvbkxpbmtTQm9keVR4dCIsIm1haWxWYWxpZGF0aW9uTGlua1NCb2R5SFRNTCIsInZhbGlkYXRpb25NZXNzYWdlIiwidmFsaWRhdGlvbk1lc3NhZ2VBZG1pbiIsInZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZSIsInZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZUFkbWluIiwibWFpbFdlbGNvbWVTdWJqZWN0IiwibWFpbFdlbGNvbWVMaW5rVHh0IiwibWFpbFdlbGNvbWVCb2R5VHh0IiwibWFpbFdlbGNvbWVCb2R5SFRNTCIsIm1haWxUaGFua0dvZGZhdGhlclN1YmplY3QiLCJtYWlsVGhhbmtHb2RmYXRoZXJMaW5rVHh0IiwibWFpbFRoYW5rR29kZmF0aGVyQm9keVR4dCIsIm1haWxUaGFua0dvZGZhdGhlckJvZHlIVE1MIiwiYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlIiwiZW1haWxOb3RGb3VuZCIsImFscmVhZHlDb25uZWN0ZWQiLCJuZWVkQmVDb25uZWN0ZWQiLCJjb25uZWN0aW9uT2siLCJuZWVkQ2hvb3NlTG9naW5XYXkiLCJuZWVkVmFsaWRhdGlvblRvTG9naW4iLCJ0b29NYW55TG9naW5GYWlscyIsImJhZFBhc3N3b3JkIiwibWFpbExvZ2luTGlua1N1YmplY3QiLCJtYWlsTG9naW5MaW5rVHh0IiwibWFpbExvZ2luTGlua0JvZHlUeHQiLCJtYWlsTG9naW5MaW5rQm9keUhUTUwiLCJtYWlsTG9naW5MaW5rTWVzc2FnZSIsInVwZGF0ZWROZWVkR29vZEVtYWlsIiwidXBkYXRlZE5lZWRVbmlxdWVFbWFpbCIsIm1haWxVcGRhdGVMb2dpblN1YmplY3QiLCJtYWlsVXBkYXRlTG9naW5MaW5rVHh0IiwibWFpbFVwZGF0ZUxvZ2luQm9keVR4dCIsIm1haWxVcGRhdGVMb2dpbkJvZHlIVE1MIiwibWFpbFVwZGF0ZUxvZ2luTGlua01lc3NhZ2UiLCJ1cGRhdGVkTmVlZFZhbGlkYXRlZFVzZXIiLCJ1cGRhdGVkTmVlZEdvb2RHb2RmYXRoZXIiLCJtYWlsVXBkYXRlTG9naW5Pa01lc3NhZ2UiLCJ1cGRhdGVkRmFpbGVkR29kZmF0aGVyTm90Rm91bmQiLCJjcmVhdGlvbk9rTWVzc2FnZSIsIm1haWxEZWxldGVTdWJqZWN0IiwibWFpbERlbGV0ZUxpbmtUeHQiLCJtYWlsRGVsZXRlQm9keVR4dCIsIm1haWxEZWxldGVCb2R5SFRNTCIsIm1haWxEZWxldGVMaW5rTWVzc2FnZSIsImRlbGV0ZUZhaWxNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtPa01lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua0FscmVhZHlNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtGYWlsTWVzc2FnZSIsImNyb25EZWxldGVVbnZhbGlkZWRVc2Vyc01lc3NhZ2UiLCJkZWxldGVJbmFjdGl2ZVVzZXJzTWVzc2FnZSIsIndlbGNvbWVNZXNzYWdlIiwiYnllYnllTWVzc2FnZSIsImluZm9zVXNlckZvckFkbWluIiwiaW5mb3NBZG1pbkdvZGZhdGhlciIsImluZm9zQWRtaW5OYkdvZENoaWxkcyIsIlRvb2wiLCJteVZhciIsInVuZGVmaW5lZCIsInRyaW0iLCJteVN0cmluZyIsImlzRW1wdHkiLCJtYXgiLCJsZW5ndGgiLCJzdWJzdHJpbmciLCJtYXBPYmoiLCJyZXBsYWNlRWx0cyIsIlJlZ0V4cCIsIk9iamVjdCIsImtleXMiLCJqb2luIiwicmVwbGFjZSIsIm1hdGNoZWQiLCJNYXRoIiwiY2VpbCIsImZsb29yIiwicmFuZG9tIiwiZGF0ZVN0cmluZyIsImxhbmciLCJteURhdGUiLCJEYXRlIiwibXlEYXkiLCJnZXREYXRlIiwibXlNb3VudGgiLCJnZXRNb250aCIsIm15WWVhciIsImdldEZ1bGxZZWFyIiwiaGVhZExpbmtzIiwiYW5jaG9yIiwiYXR0cmlidXRlcyIsImhyZWYiLCJpZCIsImZvb3RMaW5rcyIsInJlbCIsIm1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlIiwidXNlckhvbWVQYWdlIiwiYWRtaW5Ib21lUGFnZSIsIm1hbmFnZXJIb21lUGFnZSIsInN1YnNjcmliZVBhZ2UiLCJjb25uZWN0aW9uUGFnZSIsImFjY291bnRQYWdlIiwicXVlc3Rpb25uYWlyZXNNYW5hZ2VtZW50UGFnZSIsInVzZXJzTWFuYWdlbWVudFBhZ2UiLCJuYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlIiwiaWxsdXN0cmF0aW9uRGlyIiwic2l0ZVNsb2dhbiIsImhvbWVUaXRsZTEiLCJob21lUDEiLCJob21lVGl0bGUyIiwiaG9tZVAyIiwibmV3UXVlc3Rpb25uYWlyZXNUaXRsZSIsIm5ld1F1ZXN0aW9ubmFpcmVzSW50cm8iLCJleHBsYW5hdGlvblRpdGxlIiwiZXhwbGFuYXRpb25UeHQiLCJub0pTTm90aWZpY2F0aW9uIiwidGFnc0xpc3RUeHQiLCJtYXhRdWVzdGlvbm5haXJlc1NpdGVIb21lUGFnZSIsInZhbGlkYXRpb25MaW5rUGFnZSIsImxvZ2luTGlua1BhZ2UiLCJuZXdMb2dpbkxpbmtQYWdlIiwiZGVsZXRlTGlua1BhZ2UiLCJzdG9wTWFpbFBhZ2UiLCJ1cGRhdGVBY2NvdW50UGFnZSIsImFib3V0UGFnZSIsImhvbWVQYWdlVHh0IiwiaG9tZUJ0bkFib3V0VHh0IiwiaG9tZUJ0blN1YnNjcmliZVR4dCIsIm5ld3NMaXN0VGl0bGUiLCJtYWlsUmVjaXBpZW50VHh0IiwiY29uZmlnRnJvbnRFbmQiLCJ0eHQiLCJ0eHRVc2VycyIsInR4dFF1ZXN0aW9ubmFpcmUiLCJ0eHRRdWVzdGlvbiIsInR4dExpbmsiLCJ0eHRJbGx1c3RyYXRpb24iLCJoZWxsb0RldiIsImRpdk1haW4iLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwiZGl2TWVzc2FnZSIsImRpdlJlc3BvbnNlIiwiZm9ybVF1ZXN0aW9ubmFpcmUiLCJpbnB1dENsYXNzaWZpY2F0aW9uIiwiaGVscENsYXNzaWZpY2F0aW9uIiwiaGVscFB1Ymxpc2hpbmdBdCIsImRlbGV0ZUNoZWNrQm94IiwiYnRuTmV3UXVlc3Rpb25uYWlyZSIsImJ0blByZXZpZXdRdWVzdGlvbm5haXJlIiwiZGl2UXVlc3Rpb25uYWlyZXMiLCJmb3JtU2VhcmNoIiwiZGl2U2VhcmNoUmVzdWx0IiwiZm9ybUxpbmsiLCJmb3JtSWxsdXN0cmF0aW9uIiwiZm9ybVF1ZXN0aW9uIiwiZGl2TGlua3MiLCJkaXZJbGx1c3RyYXRpb25zIiwiZGl2UXVlc3Rpb25zIiwiaW5pdGlhbGlzZSIsImdldENvbmZpZyIsImNvbmZpZyIsImFkZEVsZW1lbnQiLCJjaGVja1Nlc3Npb24iLCJtZXNzYWdlIiwiY29sb3IiLCJ3aW5kb3ciLCJsb2NhdGlvbiIsImlzQ29ubmVjdGVkIiwic3R5bGUiLCJkaXNwbGF5IiwiZ2V0TG9jYWx5IiwicmVtb3ZlTG9jYWx5IiwidXNlciIsInVwZGF0ZUFjY291bnRMaW5rIiwic3RhdHVzIiwic2V0QXR0cmlidXRlc1RvSW5wdXRzIiwiaGlkZUFsbEZvcm1zIiwiZW1weUFuZEhpZGVGb3JtIiwic2hvd0xpbmtJbmZvcyIsIkxpbmtzIiwibGlzdExpbmtzIiwiaSIsInVybCIsImFkZEV2ZW50TGlzdGVuZXIiLCJlIiwicHJldmVudERlZmF1bHQiLCJzaG93Rm9ybUxpbmtJbmZvcyIsImFzc2lnbiIsImVsZW1lbnRzIiwic2VuZExpbmtGb3JtIiwiTGluayIsInNob3dJbGx1c3RyYXRpb25JbmZvcyIsIklsbHVzdHJhdGlvbnMiLCJsaXN0SWxsdXN0cmF0aW9ucyIsInNob3dGb3JtSWxsdXN0cmF0aW9uSW5mb3MiLCJzZW5kSWxsdXN0cmF0aW9uRm9ybSIsIklsbHVzdHJhdGlvbiIsInNob3dRdWVzdGlvbkluZm9zIiwiUXVlc3Rpb25zIiwibGlzdFF1ZXN0aW9ucyIsInNob3dGb3JtUXVlc3Rpb25JbmZvcyIsInNlbmRRdWVzdGlvbkZvcm0iLCJkYXRhIiwicmVtb3ZlQXR0cmlidXRlIiwiQ2hvaWNlcyIsImlzQ29ycmVjdCIsImNoZWNrZWQiLCJzaG93Rm9ybVF1ZXN0aW9ubmFpcmVJbmZvcyIsInhockdldEluZm9zIiwiWE1MSHR0cFJlcXVlc3QiLCJvcGVuIiwib25yZWFkeXN0YXRlY2hhbmdlIiwicmVhZHlTdGF0ZSIsIkRPTkUiLCJyZXNwb25zZSIsIkpTT04iLCJwYXJzZSIsInJlc3BvbnNlVGV4dCIsInJlc2V0IiwiZGF0ZUZvcm1hdCIsIlRhZ3MiLCJjbGFzc2lmaWNhdGlvbiIsInNldEF0dHJpYnV0ZSIsInRva2VuIiwic2VuZCIsInVybERhdGFzIiwiZ2V0VXJsUGFyYW1zIiwiZGF0YXMiLCJnZXREYXRhc0Zyb21JbnB1dHMiLCJ4aHJTZWFyY2giLCJBcnJheSIsImlzQXJyYXkiLCJzZWxlY3RIVE1MIiwic2VhcmNoU2VsZWN0Iiwic2V0UmVxdWVzdEhlYWRlciIsInN0cmluZ2lmeSIsInNob3dOZXh0UXVlc3Rpb25uYWlyZXMiLCJ4aHJOZXh0UXVlc3Rpb25uYWlyZXMiLCJsaXN0SFRNTCIsImRhdGVQdWJsaXNoaW5nIiwiaXNQdWJsaXNoYWJsZSIsImRhdGVOZWVkZWQiLCJ0YXJnZXQiLCJzcGxpdCIsImlubmVySFRNTCIsInRhZ3MiLCJyZXZlcnNlIiwibGFzdFRhZyIsInhoclNlYXJjaFRhZ3MiLCJzZWFyY2giLCJ4aHJRdWVzdGlvbm5haXJlRGF0YXMiLCJkZWxldGVPayIsImVycm9ycyIsImRpdlJlc3BvbnNlTGluayIsInhockxpbmtEYXRhcyIsImxpbmtzUm91dGUiLCJxdWVzdGlvbm5haXJlIiwiZGl2UmVzcG9uc2VJbGx1c3RyYXRpb24iLCJkYXRhc1dpdGhGaWxlcyIsIkZvcm1EYXRhIiwieGhySWxsdXN0cmF0aW9uRGF0YXMiLCJpbGx1c3RyYXRpb25zUm91dGUiLCJkaXZSZXNwb25zZVF1ZXN0aW9uIiwieGhyUXVlc3Rpb25EYXRhcyIsImNvbnNvbGUiLCJlcnJvciIsInNhdmVMb2NhbHkiLCJsb2NhbFN0b3JhZ2UiLCJzZXRJdGVtIiwianNvbiIsImdldEl0ZW0iLCJyZW1vdmVJdGVtIiwiZWx0UGFyZW50IiwiZWx0VHlwZSIsImVsdENvbnRlbnQiLCJlbHRJZCIsImVsdENsYXNzIiwiZWx0QXR0cmlidXRlcyIsIm5ld0VsZW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NMaXN0IiwiYWRkIiwiYXR0cmlidXROYW1lIiwiYXBwZW5kQ2hpbGQiLCJsb2ciLCJjb25maWdUZW1wbGF0ZSIsImxpbmsiLCJob21lUGFnZSIsImlucHV0c0NvbmYiLCJteUZvcm0iLCJpZElucHV0IiwiaW5wdXRIVE1MIiwiYXR0cmlidXRlIiwiZm9ybURhdGEiLCJlbnRyaWVzIiwiZW50cmllIiwiZW1weUZvcm0iLCJ0eXBlIiwicGFyYW1ldGVycyIsInBhcmFtIiwiZGVjb2RlVVJJIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJ4aHIiLCJvbmxvYWQiLCJvbmVycm9yIiwic3RhdHVzVGV4dCIsImdldFRpbWVEaWZmZXJlbmNlIiwidGltZUxvY2FsIiwiZ2V0VGltZXpvbmVPZmZzZXQiLCJnZXRQYXNzd29yZCIsIm5iQ2FyTWluIiwibmJDYXJNYXgiLCJuYkNhciIsImxldHRlcnMiLCJvdGhlcnMiLCJzZXRTZXNzaW9uIiwidXNlcklkIiwiZHVyYXRpb25UUyIsInN0b3JhZ2VVc2VyIiwiZHVyYXRpb24iLCJjaGVja0Fuc3dlckRhdGFzIiwibGFzdEFuc3dlciIsImFuc3dlciIsIm5iQ29ycmVjdEFuc3dlcnMiLCJRdWVzdGlvbm5haXJlSWQiLCJuYlF1ZXN0aW9ucyIsInVybFJlZGlyZWN0aW9uIiwidXJsV2FudGVkIiwidXNlckRhdGFzIiwicmVkaXJlY3RVc2VyIiwibm93IiwiaXNWYWxpZCIsImxhbmd1YWdlIiwidGltZURpZmZlcmVuY2UiLCJuYkRheXNPayIsInVybEFjY291bnQiLCJpbmRleE9mIl0sIm1hcHBpbmdzIjoiO1FBQUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7OztRQUdBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwwQ0FBMEMsZ0NBQWdDO1FBQzFFO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0Esd0RBQXdELGtCQUFrQjtRQUMxRTtRQUNBLGlEQUFpRCxjQUFjO1FB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LENBQUNFLE9BQUosR0FBYztBQUFBLDJCQUFNSCxNQUFNLENBQUNDLEdBQUcsQ0FBQ0csVUFBTCxDQUFaO0FBQUEsbUJBQWQ7O0FBQ0FILHFCQUFHLENBQUNoRixJQUFKO0FBQ0g7QUFDSjtBQUNKLGFBdEVNLENBRmlCOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEdBQUg7O0FBQUEsa0JBQVo5RCxZQUFZO0FBQUE7QUFBQTtBQUFBLEdBQWxCLEMsQ0EwRVA7O0FBQ0EsSUFBTXlLLFlBQVksR0FBRyxTQUFmQSxZQUFlLENBQUNILGNBQUQsRUFBaUJySyxPQUFqQixFQUEwQnNLLFNBQTFCLEVBQ3JCO0FBQ0ksTUFBRyxDQUFDNVEsMkRBQU8sQ0FBQ3NHLE9BQUQsQ0FBWCxFQUNJdUcsb0VBQVUsQ0FBQyxTQUFELEVBQVl2RyxPQUFaLENBQVY7QUFDSixNQUFHLENBQUN0RywyREFBTyxDQUFDNFEsU0FBRCxDQUFYLEVBQ0kvRCxvRUFBVSxDQUFDLEtBQUQsRUFBUStELFNBQVIsQ0FBVjtBQUNKLE1BQUcsQ0FBQzVRLDJEQUFPLENBQUMyUSxjQUFELENBQVgsRUFDSW5LLE1BQU0sQ0FBQ0MsUUFBUCxDQUFnQnFCLE1BQWhCLENBQXVCNkksY0FBdkI7QUFDUCxDQVJELEMiLCJmaWxlIjoiLi9KUy9tYW5hZ2VRdWVzdGlvbm5haXJlcy5hcHAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gXCIuL3NyYy9tYW5hZ2VRdWVzdGlvbm5haXJlcy5qc1wiKTtcbiIsImNvbnN0IHVzZXJzID0gcmVxdWlyZShcIi4vdXNlcnNcIik7XG5jb25zdCBxdWVzdGlvbm5haXJlcyA9IHJlcXVpcmUoXCIuL3F1ZXN0aW9ubmFpcmVzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgYXBpVXJsOiBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9hcGlcIixcbiAgICBzaXRlVXJsOiBcImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MFwiLFxuICAgIGFkbWluTmFtZTogXCJGYWJyaWNlXCIsXG4gICAgYWRtaW5FbWFpbDogXCJkZXZAd2lraWxlcm5pLmNvbVwiLFxuICAgIHNlbmRlck5hbWU6IFwiV2lraUxlcm5pIChsb2NhbClcIixcbiAgICBzZW5kZXJFbWFpbDogXCJib25qb3VyQHdpa2lsZXJuaS5jb21cIixcbiAgICBhZG1pbkxhbmc6IFwiZnJcIixcbiAgICB0aGVtZTogXCJ3aWtpbGVybmlcIiwgLy8gbGUgdGjDqG1lIHV0aWxpc8OpIChkYW5zIC92aWV3cykgcG91ciBnw6luw6lyZXIgbGVzIHBhZ2VzIEhUTUwuIENvbnRpZW50IHNlcyBwcm9wcmVzIGZpY2hpZXJzIGRlIGNvbmZpZ3VyYXRpb24uXG4gICAgYXZhaWxhYmxlTGFuZ3M6IFtcImZyXCJdLC8vIExhbmd1YWdlcyBpbiB3aGljaCB0aGUgc2l0ZSBpcyBhdmFpbGFibGUuIFRoZSBmaXJzdCBvbmUgaXMgdGhlIGRlZmF1bHQgb25lLlxuICAgIHNpdGVOYW1lOiBcIldpa2lMZXJuaSAobG9jYWwpXCIsXG4gICAgYmVnaW5Db2RlR29kZmF0aGVyOiBcIldMXCIsIC8vIGNhc2Utc2Vuc2l0aXZlIGFuZCBjYW4ndCBjb250YWluIFwiQFwiICFcbiAgICBjcm9uVGltaW5nQWxlcnRJblNlY29uZGU6IDEyMCwgLy8gZm9yIGxvZ3NcbiAgICByZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlOiAzLCAvLyBpZGVtXG4gICAgdG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnM6IFwiNDhoXCIsIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96ZWl0L21zXG4gICAgdG9rZW5Mb2dpbkxpbmtUaW1lSW5Ib3VyczogXCIxaFwiLFxuICAgIHRva2VuQ29ubmV4aW9uTWluVGltZUluSG91cnM6IFwiMjRoXCIsXG4gICAgdG9rZW5Db25uZXhpb25NYXhUaW1lSW5EYXlzOiBcIjE4MCBkYXlzXCIsXG4gICAgdG9rZW5Mb2dpbkNoYW5naW5nVGltZUluSG91cnM6IFwiMWhcIiwvLyBmb3IgZW1haWwgJiBwYXNzd29yZCBjaGFuZ2luZ1xuICAgIHRva2VuRGVsZXRlVXNlclRpbWVJbkhvdXJzOiBcIjFoXCIsXG4gICAgdG9rZW5VbnN1YnNjcmliZUxpbmtUaW1lSW5EYXlzOiBcIjcgZGF5c1wiLCAvLyB0b2tlbiBzZW5kIHdpdGggc3Vic2NyaXB0aW9uJ3MgZW1haWxzXG4gICAgZnJlZUFjY291bnRUaW1pbmdJbkRheXM6IDEwLFxuICAgIGZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5czogNSxcbiAgICBhY2NvdW50RXhwaXJhdGlvbkZpcnN0Tm90aWZpY2F0aW9uSW5EYXlzOiAxNCxcbiAgICBhY2NvdW50RXhwaXJhdGlvblNlY29uZE5vdGlmaWNhdGlvbkluRGF5czogNSxcbiAgICBpbmFjdGl2ZUFjY291bnRUaW1lVG9EZWxldGVJbkRheXM6IDE4MCxcbiAgICAvLyBRdWVzdGlvbm5haXJlczpcbiAgICBuYlF1ZXN0aW9uc01pbjogMSwgLy8gbWluaW11bSBudW1iZXIgb2YgcXVlc3Rpb25zIGZvciB0aGUgcXVlc3Rpb25uYWlyZSB0byBiZSBwdWJsaXNoYWJsZVxuICAgIG5iUXVlc3Rpb25zTWF4OiAyLCAvLyBpZiAwID0gbm90IG1heGltdW1cbiAgICBuYkNob2ljZXNNYXg6IDEwLFxuICAgIG5iTmV3UXVlc3Rpb25uYWlyZXM6IDEwLC8vIGZvciBSU1MsIGV0Yy5cbiAgICBob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVCZWdpbjoxLCAvLyBpbiB1c2VyIGxvY2FsIHRpbWVcbiAgICBob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQ6MjQsIC8vIGlkZW1cbiAgICBudW1iZXJOZXdRdWVzdGlvbm5haXJlQXRTYW1lVGltZTogNTAsIC8vIGZvciBtYXNzIG1haWxpbmdcbiAgICBtaW5TZWFyY2hRdWVzdGlvbm5haXJlczogMyxcbiAgICAvLyBJbGx1c3RyYXRpb25zOlxuICAgIG5iSWxsdXN0cmF0aW9uc01pbjogMCxcbiAgICBuYklsbHVzdHJhdGlvbnNNYXg6IDEsXG4gICAgbWF4SWxsdXN0cmF0aW9uU2l6ZWluT2N0ZXQ6IDEwMDAwMDAsLy8gcGFzIGNvbnRyw7Rsw6kgcG91ciBsJ2luc3RhbnQuIMOAIHJldm9pci5cbiAgICBtaW1lVHlwZXNGb3JJbGx1c3RyYXRpb246IFsgXCJpbWFnZS9qcGdcIiwgXCJpbWFnZS9qcGVnXCIsIFwiaW1hZ2UvcG5nXCIsIFwiaW1hZ2UvZ2lmXCIsIFwiaW1hZ2UvcG5nXCIgXSxcbiAgICAvLyAtLSBVcGxvYWQgYW5kIHJlc2l6ZTpcbiAgICBpbGx1c3RyYXRpb25zV2lkdGhNYXhJblB4OiA0MDAsXG4gICAgaWxsdXN0cmF0aW9uc01pbmlhdHVyZXNXaWR0aE1heEluUHg6IDIwMCxcbiAgICAvLyBMaW5rczpcbiAgICBuYkxpbmtzTWluOiAxLFxuICAgIG5iTGlua3NNYXg6IDEsXG4gICAgLy8gw6Agc3VwcHJpbWVyIHF1YW5kIHRvdXMgbGVzIFwicmVxdWlyZVwiIMOgIGpvdXI6XG4gICAgbmJRdWVzdGlvbnNNaW46IHF1ZXN0aW9ubmFpcmVzLm5iUXVlc3Rpb25zTWluLFxuICAgIG5iUXVlc3Rpb25zTWF4OiBxdWVzdGlvbm5haXJlcy5uYlF1ZXN0aW9uc01heCxcbiAgICBuYkNob2ljZXNNYXg6IHF1ZXN0aW9ubmFpcmVzLm5iQ2hvaWNlc01heCxcbiAgICBwYXNzd29yZE1pbkxlbmd0aDogdXNlcnMucGFzc3dvcmQubWlubGVuZ3RoLFxuICAgIGRpckNhY2hlVXNlcnM6IHVzZXJzLmRpckNhY2hlVXNlcnMsXG4gICAgZGlyQ2FjaGVVc2Vyc0Fuc3dlcnM6IHVzZXJzLmRpckNhY2hlVXNlcnNBbnN3ZXJzLFxuICAgIGRpckNhY2hlUXVlc3Rpb25uYWlyZXM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlUXVlc3Rpb25uYWlyZXMsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbnM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlUXVlc3Rpb25zLFxuICAgIGRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzLFxuICAgIGRpckhUTUxRdWVzdGlvbm5haXJlOiBxdWVzdGlvbm5haXJlcy5kaXJIVE1MUXVlc3Rpb25uYWlyZSxcbiAgICBkaXJXZWJRdWVzdGlvbm5haXJlOiBxdWVzdGlvbm5haXJlcy5kaXJXZWJRdWVzdGlvbm5haXJlXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbnsgICAgXG4gICAgLy8gQVBJJ3JvdXRlcyAoYWZ0ZXIgXCJhcGlVcmxcIiBkZWZpbmVkIGluIGluc3RhbmNlLmpzKVxuICAgIHF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3F1ZXN0aW9ubmFpcmVcIixcbiAgICBnZXRRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9nZXRcIixcbiAgICBwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcHJldmlld1wiLFxuICAgIHB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3F1aXovXCIsXG4gICAgc2F2ZUFuc3dlcnNSb3V0ZTogXCIvYW5zd2VyL1wiLFxuICAgIGdldFN0YXRzUXVlc3Rpb25uYWlyZXMgOiBcIi9zdGF0cy9cIixcbiAgICBzZWFyY2hRdWVzdGlvbm5haXJlc1JvdXRlIDogXCIvc2VhcmNoXCIsXG4gICAgZ2V0UmFuZG9tUXVlc3Rpb25uYWlyZXNSb3V0ZSA6IFwiL2dldHJhbmRvbVwiLFxuICAgIHNlYXJjaEFkbWluUXVlc3Rpb25uYWlyZXNSb3V0ZSA6IFwiL3NlYXJjaGFkbWluXCIsXG4gICAgZ2V0TGlzdE5leHRRdWVzdGlvbm5haXJlczogXCIvZ2V0bGlzdG5leHRxdWVzdGlvbm5haXJlcy9cIixcbiAgICByZWdlbmVyYXRlSFRNTDogXCIvaHRtbHJlZ2VuZXJhdGVkXCIsXG4gICAgLy8gLS0gcXVlc3Rpb25zICYgY2hvaWNlcyA6XG4gICAgcXVlc3Rpb25zUm91dGU6IFwiL3F1ZXN0aW9uL1wiLFxuICAgIC8vIC0tIHRhZ3MgOlxuICAgIHRhZ3NTZWFyY2hSb3V0ZTogXCIvdGFncy9zZWFyY2gvXCIsXG4gICAgLy8gLS0gYW5zd2VycyA6XG4gICAgZ2V0UXVlc3Rpb25uYWlyZXNXaXRob3V0QW5zd2VyOiBcIi93aXRob3V0YW5zd2VyL3VzZXIvXCIsXG4gICAgZ2V0UHJldmlvdXNBbnN3ZXJzOiBcIi91c2VyL2Fuc3dlcnMvXCIsXG4gICAgZ2V0U3RhdHNBbnN3ZXJzIDogXCIvdXNlci9hbndzd2Vycy9zdGF0cy9cIixcbiAgICBnZXRBZG1pblN0YXRzOiBcIi9nZXRhZG1pbnN0YXRzL1wiLFxuICAgIC8vIGZvcm1zIDogw6AgY29tcGzDqXRlciBhdmVjIHZhbGV1cnMgcGFyIGTDqWZhdXQsIGV0Yy4gY2YgbW9kw6hsZVxuICAgIFF1ZXN0aW9ubmFpcmUgOlxuICAgIHtcbiAgICAgICAgdGl0bGU6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgIHNsdWc6IHsgbWF4bGVuZ3RoOiAxNTAgfSwgLy8gY2hhbXAgcmVxdWlzIG1haXMgY2FsY3Vsw6kgw6AgcGFydGlyIGR1IHRpdHJlIHFkIHZpZGVcbiAgICAgICAgaW50cm9kdWN0aW9uOiB7IHJlcXVpcmVkOiB0cnVlIH1cbiAgICB9LFxuICAgIHNlYXJjaFF1ZXN0aW9ubmFpcmVzIDogeyBtaW5sZW5ndGg6IDMsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgUXVlc3Rpb24gOlxuICAgIHtcbiAgICAgICAgdGV4dDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgcmFuazogeyByZXF1aXJlZDogdHJ1ZSwgbWluOjEsIGRlZmF1bHRWYWx1ZToxIH1cbiAgICB9LCAgICAgICAgICBcbiAgICBDaG9pY2UgOlxuICAgIHtcbiAgICAgICAgdGV4dDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfVxuICAgIH0sICAgICAgICAgIFxuICAgIG5iUXVlc3Rpb25zTWluOiAxLFxuICAgIG5iUXVlc3Rpb25zTWF4OiAwLFxuICAgIG5iQ2hvaWNlc01heDogMTAsXG4gICAgbmJUYWdzTWluOiAwLFxuICAgIG5iVGFnc01heDogMCwgLy8gMCA9IG5vdCBtYXggICAgXG4gICAgLy8gSlNPTiBhbmQgSFRNTCBkaXJcbiAgICBkaXJDYWNoZVF1ZXN0aW9ubmFpcmVzIDogXCJkYXRhcy9xdWVzdGlvbm5haXJlc1wiLFxuICAgIGRpckNhY2hlUXVlc3Rpb25zIDogXCJkYXRhcy9xdWVzdGlvbm5haXJlcy9xdWVzdGlvbnNcIixcbiAgICBkaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXMgOiBcImRhdGFzL3VzZXJzL3F1ZXN0aW9ubmFpcmVzXCIsXG4gICAgZGlyQ2FjaGVUYWdzIDogXCJkYXRhcy9xdWVzdGlvbm5haXJlcy90YWdzXCIsICBcbiAgICBkaXJIVE1MUXVlc3Rpb25uYWlyZSA6IFwiZnJvbnQvcHVibGljL3F1aXpcIixcbiAgICBkaXJIVE1MVGFncyA6IFwiZnJvbnQvcHVibGljL3F1aXpzXCIsXG4gICAgZGlyV2ViUXVlc3Rpb25uYWlyZSA6IFwicXVpelwiLC8vcG91ciB1cmwgcGFnZVxuICAgIGRpcldlYlRhZ3MgOiBcInF1aXpzXCIsLy8gaWRlbVxuICAgIG5iUmFuZG9tUmVzdWx0cyA6IDMvLyBsaW1pdGUgbGVzIHLDqXN1bHRhdCBkdSBtb3RldXIgZGUgcmVjaGVyY2hlIHF1YW5kIGRlbWFuZGUgZGUgcsOpc3VsdGF0cyBhdSBoYXNhcmRcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIC8vIEFQSSdyb3V0ZXMgKGFmdGVyIFwiYXBpVXJsXCIgZGVmaW5lZCBpbiBpbnN0YW5jZS5qcylcbiAgICB1c2VyUm91dGVzOiBcIi91c2VyXCIsXG4gICAgc3Vic2NyaWJlUm91dGU6IFwiL3NpZ251cFwiLFxuICAgIGdldEdvZGZhdGhlclJvdXRlOiBcIi9nZXRnb2RmYXRoZXJpZFwiLFxuICAgIGNoZWNrSWZJc0VtYWlsZnJlZVJvdXRlOiBcIi9pc2VtYWlsZnJlZVwiLFxuICAgIGNoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZTogXCIvdmFsaWRhdGlvbi9cIixcbiAgICBjaGVja0xvZ2luUm91dGU6IFwiL2NoZWNrbG9naW4vXCIsXG4gICAgY29ubmVjdGlvblJvdXRlOiBcIi9sb2dpblwiLFxuICAgIGdldExvZ2luTGlua1JvdXRlOiBcIi9nZXRsb2dpbmxpbmtcIixcbiAgICBjb25uZWN0aW9uV2l0aExpbmtSb3V0ZTogXCIvY2hlY2tsb2dpbmxpbmtcIixcbiAgICBnZXRVc2VySW5mb3M6IFwiL2dldC9cIixcbiAgICBjcmVhdGVVc2VyUm91dGU6IFwiL2NyZWF0ZVwiLFxuICAgIHZhbGlkYXRlVXNlclJvdXRlOiBcIi92YWxpZGF0ZS9cIixcbiAgICB1cGRhdGVVc2VySW5mb3M6IFwiL21vZGlmeS9cIixcbiAgICBzZWFyY2hVc2VyUm91dGU6IFwiL3NlYXJjaC9cIixcbiAgICBnZXRHb2RDaGlsZHM6IFwiL2dldGdvZGNoaWxkcy9cIixcbiAgICBjaGVja05ld0xvZ2luTGlua1JvdXRlOiBcIi9jb25maXJtbmV3bG9naW4vXCIsXG4gICAgY2hlY2tEZWxldGVMaW5rUm91dGU6IFwiL2NvbmZpcm1kZWxldGUvXCIsXG4gICAgZ2V0UGF5bWVudHM6IFwiL3BheW1lbnQvZ2V0Zm9yb25ldXNlci9cIixcbiAgICB1bnN1YnNjcmliZVJvdXRlOiBcIi9zdWJzY3JpcHRpb24vc3RvcC9cIixcbiAgICBnZXRBZG1pblN0YXRzOiBcIi9nZXRhZG1pbnN0YXRzL1wiLFxuICAgIC8vIGZvcm1zIDogw6AgY29tcGzDqXRlciBhdmVjIHZhbGV1cnMgcGFyIGTDqWZhdXQsIGV0Yy4gY2YgbW9kw6hsZVxuICAgIG5hbWU6IHsgbWF4bGVuZ3RoOiA3MCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBlbWFpbDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBwYXNzd29yZDogeyBtaW5sZW5ndGg6IDgsIG1heGxlbmd0aDo3MiwgcmVxdWlyZWQ6IHRydWUgfSwgLy8gaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvYmNyeXB0I3NlY3VyaXR5LWlzc3Vlcy1hbmQtY29uY2VybnNcbiAgICBuZXdQYXNzd29yZDogeyBtaW5sZW5ndGg6IDgsIG1heGxlbmd0aDo3MiB9LFxuICAgIGNvZGVHb2RmYXRoZXI6IHsgbWF4bGVuZ3RoOiAyNTUgfSxcbiAgICBjZ3VPazogeyB2YWx1ZTogXCJ0cnVlXCIsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgdGltZURpZmZlcmVuY2VNaW46IC03MjAsXG4gICAgdGltZURpZmZlcmVuY2VNYXg6ODQwLFxuICAgIC8vIEpTT04gZGlyXG4gICAgZGlyQ2FjaGVVc2VycyA6IFwiZGF0YXMvdXNlcnNcIixcbiAgICBkaXJDYWNoZVVzZXJzQW5zd2VycyA6IFwiZGF0YXMvdXNlcnMvcXVlc3Rpb25uYWlyZXMvYW5zd2Vyc1wiXG59O1xuIiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL2dlbmVyYWxcIjogXCIuLi9sYW5nL2ZyL2dlbmVyYWwuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9nZW5lcmFsJFwiOyIsInZhciBtYXAgPSB7XG5cdFwiLi9mci9pbGx1c3RyYXRpb25cIjogXCIuLi9sYW5nL2ZyL2lsbHVzdHJhdGlvbi5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi9sYW5nIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcL2lsbHVzdHJhdGlvbiRcIjsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZnIvbGlua1wiOiBcIi4uL2xhbmcvZnIvbGluay5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi9sYW5nIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcL2xpbmskXCI7IiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL3F1ZXN0aW9uXCI6IFwiLi4vbGFuZy9mci9xdWVzdGlvbi5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi9sYW5nIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcL3F1ZXN0aW9uJFwiOyIsInZhciBtYXAgPSB7XG5cdFwiLi9mci9xdWVzdGlvbm5haXJlXCI6IFwiLi4vbGFuZy9mci9xdWVzdGlvbm5haXJlLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvcXVlc3Rpb25uYWlyZSRcIjsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZnIvdXNlclwiOiBcIi4uL2xhbmcvZnIvdXNlci5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi9sYW5nIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcL3VzZXIkXCI7IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIHNpdGVIVE1MVGl0bGUgOiBcIldpa2lMZXJuaSA6IFdpa2lww6lkaWEgZW4gcXVlc3Rpb25zXCIsXG4gICAgc2l0ZU1ldGFEZXNjcmlwdGlvbiA6IFwiQXZlYyBXaWtpTGVybmksIHJlY2V2ZXogY2hhcXVlIGpvdXIgZGUgbm91dmVhdXggcXVpenMgcG91ciB0ZXN0ZXIgdm9zIGNvbm5haXNzYW5jZXMgZXQgYXBwcmVuZHJlIGRlIG5vdXZlbGxlcyBjaG9zZXMuXCIsXG4gICAgc2NyaXB0VGltaW5nSW5mbyA6IFwiRHVyw6llIGRlIGxhIHLDqXBvbnNlIDogU0NSSVBUX1RJTUlORyBtaWxsaXNlY29uZGVzLCByb3V0ZSA6IFNDUklQVF9VUkxcIixcbiAgICBzY3JpcHRUaW1pbmdBbGVydCA6IFwiKioqIFNjcmlwdCBsZW50IDogU0NSSVBUX1RJTUlORyBtaWxsaXNlY29uZGVzLCByb3V0ZSA6IFNDUklQVF9VUkxcIixcbiAgICBzZXJ2ZXJFcnJvciA6IFwiRMOpc29sw6kuIFVuZSBlcnJldXIgaW1wcsOpdnVlIGVzdCBzdXJ2ZW51ZS4gU2kgY2VsYSBwZXJzaXN0ZSwgbidow6lzaXRleiDDoCBwcsOpdmVuaXIgbCdhZG1pbmlzdHJhdGV1ciBkdSBzaXRlLlwiLFxuICAgIHNlcnZlckVycm9yQWRtaW4gOiBcIkJ1ZyBkZSBsJ2FwcGxpY2F0aW9uIDpcIixcbiAgICBuZWVkZWRQYXJhbXMgOiBcIkRlcyBwYXJhbcOodHJlcyBuw6ljZXNzYWlyZXMgbWFucXVhbnRzIHNvbnQgbWFucXVhbnRzLlwiLFxuICAgIGJhZFVybCA6IFwiVGVudGF0aXZlIGQnYWNjw6hzIMOgIHVuZSBwYWdlIG4nZXhpc3RhbnQgcGFzIDpcIixcbiAgICBub3RWYWxpZEZvcm1hdCA6IFwiRm9ybWF0IG5vbiB2YWxpZGUuXCIsXG4gICAgbm90QWxsb3dlZCA6IFwiVm91cyBuJ2F2ZXogcGFzIGxlcyBkcm9pdHMgbsOpY2Vzc2FpcmVzIHBvdXIgY2V0dGUgYWN0aW9uLlwiLFxuICAgIG5vdFJlcXVpcmVkIDogXCJGYWN1bHRhdGlmLlwiLFxuICAgIHVwZGF0ZUJ0blR4dDogXCJNb2RpZmllclwiLFxuICAgIGFkZEJ0blR4dDogXCJBam91dGVyXCIsXG4gICAgZGVsZXRlQnRuVHh0OiBcIlN1cHByaW1lclwiLFxuICAgIGFkZE9rTWVzc2FnZSA6IFwiTGVzIGRvbm7DqWVzIG9udCBiaWVuIMOpdMOpIGVucmVnaXN0csOpZXMuXCIsXG4gICAgdXBkYXRlT2tNZXNzYWdlIDogXCJMYSBtaXNlIMOgIGpvdXIgw6Agam91ciBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIGRlbGV0ZU9rTWVzc2FnZSA6IFwiTGEgc3VwcHJlc3Npb24gYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS5cIixcbiAgICBmYWlsQXV0aCA6IFwiRXJyZXVyIGQnYXV0aGVudGlmaWNhdGlvbi5cIixcbiAgICBmYWlsQXV0aEhlYWRlciA6IFwiQWJzZW5jZSBkZSBoZWFkZXIgQXV0aG9yaXphdGlvbi5cIixcbiAgICBmYWlsQXV0aFRva2VuIDogXCJUb2tlbiBpbnZhbGlkZSBvdSB1dGlsaXNhdGV1ciBub24gdHJvdXbDqS5cIixcbiAgICBmYWlsQXV0aElkIDogXCJJZGVudGlmaWFudCBub24gdmFsaWRlIDogXCIsXG4gICAgZmFpbEF1dGhDcm9uIDogXCJUZW50YXRpdmUgZGUgbGFuY2VtZW50IGQndW4gY3JvbiBzYW5zIGxlIGJvbiB0b2tlbi5cIixcbiAgICBwcmV2aW91c1BhZ2UgOiBcIlBhZ2UgcHLDqWPDqWRlbnRlXCIsXG4gICAgbmV4dFBhZ2UgOiBcIlBhZ2Ugc3VpdmFudGVcIixcbiAgICBhbGVydE5ld1dpbmRvdzogXCJub3V2ZWxsZSBmZW7DqnRyZVwiLFxuICAgIGJ0bkxpbmtUb1F1ZXN0aW9ubmFpcmUgOiBcIkFsbGVyIGF1IHF1aXogIVwiLFxuICAgIHN0YXRzQWRtaW4gOiBcIkR1cmFudCBsZXMgZGVybmnDqHJlcyAyNGggOiBOQl9VU0VSU18yNEggY29tcHRlcyBvbnQgw6l0w6kgY3LDqcOpcywgTkJfU1VCU0NSSVBUSU9OU18yNEggdmFsaWTDqXMgZXQgTkJfVVNFUlNfREVMRVRFRF8yNEggc3VwcHJpbcOpcy4gTkJfQU5TV0VSU18yNEggcsOpcG9uc2VzIGF1eCBxdWl6cyBvbnQgw6l0w6kgZW5yZWdpc3Ryw6llcy48YnI+RW4gdG91dCwgaWwgeSBhIDogTkJfVVNFUlNfVE9UIGNvbXB0ZXMsIGRvbnQgTkJfU1VCU0NSSVBUSU9OU19UT1QgdmFsaWTDqXMgZXQgTkJfU1VCU0NSSVBUSU9OU19QUkVNSVVNIGNvbXB0ZXMgcHLDqW1pdW0uIE5CX0FOU1dFUlNfVE9UIHLDqXBvbnNlcyBhdXggcXVpenMgb250IMOpdMOpIGVucmVnaXN0csOpZXMuPGJyPlBhcm1pIGxlcyBOQl9VU0VSU19ERUxFVEVEX1RPVCBjb21wdGVzIHN1cHByaW3DqXMsIE5CX1VTRVJTX0RFTEVURURfVkFMSURFRCBhdmFpZW50IHZhbGlkw6kgbGV1ciBjb21wdGUgZXQgTkJfVVNFUlNfREVMRVRFRF9QUkVNSVVNIGF2YWllbnQgc291c2NyaXQgdW4gY29tcHRlIHByw6ltaXVtLlwiXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBuZWVkVXJsIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuZSB1cmwgcG91ciBsJ2ltYWdlLlwiLFxuICAgIG5lZWRVbmlxdWVVcmwgOiBcIkwndXJsIGVzdCBkw6lqw6AgdXRpbGlzw6llIHBhciB1bmUgYXV0cmUgaW1hZ2UuXCIsXG4gICAgbmVlZEdvb2RMb25nVXJsIDogXCJMJ3VybCBkZSBsJ2ltYWdlIGRvaXQgY29udGVuaXIgZW50cmUgNSBldCAyNTUgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZEdvb2RMb25nQWx0IDogXCJMZSB0ZXh0ZSBkZSBsYSBwcm9wcmnDqXTDqSAnYWx0JyBuZSBkb2l0IHBhcyBjb21wdGVyIHBsdXMgZGUgMjU1IGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRHb29kTG9uZ1RpdGxlIDogXCJMZSB0ZXh0ZSBkZSBsYSBwcm9wcmnDqXTDqSAndGl0bGUnIG5lIGRvaXQgcGFzIGNvbXB0ZXIgcGx1cyBkZSAyNTUgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZEdvb2RMb25nQ2FwdGlvbiA6IFwiTGUgdGV4dGUgZGUgbGEgbMOpZ2VuZGUgZGUgbCdpbWFnZSBuZSBkb2l0IHBhcyBjb21wdGVyIHBsdXMgZGUgMjU1IGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRHb29kRmlsZSA6IFwiVm90cmUgZmljaGllciBuJ2EgcGFzIMOpdMOpIGFjY2VwdMOpLlwiLFxuICAgIG5lZWRRdWVzdGlvbm5haXJlRm9ySWxsdXN0cmF0aW9uIDogXCJUZW50YXRpdmUgZCdham91dC9taXNlIMOgIGpvdXIvc3VwcHJlZXNzaW9uIGQndW5lIGlsbHVzdHJhdGlvbiBwb3VyIHVuIHF1ZXN0aW9ubmFpcmUgbidheWFudCBwYXMgw6l0w6kgdHJvdXbDqS5cIixcbiAgICBuZWVkTWF4SWxsdXN0cmF0aW9uc0ZvclF1ZXN0aW9ubmFpcmUgOiBcIlZvdXMgYXZleiBkw6lqw6AgYXR0ZWludCBsZSBub21icmUgbWF4aW1hbCBkJ2lsbHVzdHJhdGlvbnMgcG91ciBjZSBxdWVzdGlvbm5haXJlLlwiLFxuICAgIG5vdEZvdW5kOiBcIkwnZW5yZWdpc3RyZW1lbnQgZGUgbCdpbGx1c3RyYXRpb24gbidhIHBhcyDDqXTDqSB0cm91dsOpIDogXCIsXG4gICAgYWRkZWRPa01lc3NhZ2U6IFwiTCdpbGx1c3RyYXRpb24gYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS5cIixcbiAgICB1cGRhdGVkT2tNZXNzYWdlOiBcIkwnaWxsdXN0cmF0aW9uIGEgYmllbiDDqXTDqSBtb2RpZmnDqWUuXCIsXG4gICAgZGVsZXRlZE9rTWVzc2FnZTogXCJMJ2lsbHVzdHJhdGlvbiBhIGJpZW4gw6l0w6kgc3VwcHJpbcOpZS5cIixcbiAgICBkZWZhdWx0QWx0IDogXCJJbGx1c3RyYXRpb24gZHUgcXVpelwiLFxuICAgIGludHJvVGl0bGUgOiBcIklsbHVzdHJhdGlvbnMgZHUgcXVpelwiLFxuICAgIGludHJvTm9JbGx1c3RyYXRpb24gOiBcIkF1Y3VuZSBpbGx1c3RyYXRpb24gcG91ciBsJ2luc3RhbnQuXCJcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIG5lZWRVcmwgOiBcIk1lcmNpIGRlICBzYWlzaXIgbCd1cmwgZHUgbGllbi5cIixcbiAgICBuZWVkVmFsaWRVcmwgOiBcIk1lcmNpIGRlICBzYWlzaXIgdW4gdXJsIGF5YW50IHVuIGZvcm1hdCB2YWxpZGUuXCIsXG4gICAgbmVlZE5vdFRvb0xvbmdVcmwgOiBcIk1lcmNpIGRlICBzYWlzaXIgdW4gdXJsIG5lIGNvbXB0YW50IHBhcyBwbHVzIGRlIDI1NSBjYXJhY3TDqHJlcy5cIixcbiAgICBuZWVkQW5jaG9yIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuZSBhbmNyZSBwb3VyIGNlIGxpZW4uXCIsXG4gICAgbmVlZEdvb2RMb25nQW5jaG9yIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuZSBhbmNyZSBwb3VyIGNlIGxpZW4gY29tcHRhbnQgZW50cmUgNSBldCAxNTAgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZFF1ZXN0aW9ubmFpcmUgOiBcIkxlIHF1ZXN0aW9ubmFpcmUgZHUgbGllbiBuJ2EgcGFzIMOpdMOpIHRyb3V2w6kuXCIsXG4gICAgbmVlZE1heExpbmtzRm9yUXVlc3Rpb25uYWlyZSA6IFwiVm91cyBhdmV6IGTDqWrDoCBhdHRlaW50IGxlIG5vbWJyZSBtYXhpbWFsIGRlIGxpZW5zIHBvdXIgY2UgcXVlc3Rpb25uYWlyZS5cIixcbiAgICB1cGRhdGVkT2tNZXNzYWdlOiBcIkxlIGxpZW4gYSBiaWVuIMOpdMOpIG1vZGlmacOpLlwiLFxuICAgIGFkZGVkT2tNZXNzYWdlOiBcIkxlIGxpZW4gYSBiaWVuIMOpdMOpIGFqb3V0w6kuXCIsXG4gICAgZGVsZXRlZE9rTWVzc2FnZTogXCJMZSBsaWVuIGEgYmllbiDDqXTDqSBzdXBwcmltw6kuXCIsXG4gICAgbm90Rm91bmQgOiBcIkwnZW5yZWdpc3RyZW1lbnQgZHUgbGllbiBuJ2EgcGFzIMOpdMOpIHRyb3V2w6kuXCIsXG4gICAgaW50cm9UaXRsZSA6IFwiTGVjdHVyZXMgcHJvcG9zw6llc1wiLFxuICAgIGludHJvTm9MaW5rIDogXCJBdWN1biBsaWVuIHBvdXIgbCdpbnN0YW50LlwiLFxuICAgIGRlZmF1bHRWYWx1ZTogXCJMaXJlIGwnYXJ0aWNsZSBzdXIgV2lraXDDqWRpYS5cIlxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgbmVlZFRleHQ6IFwiTWVyY2kgZGUgc2Fpc2lyIGxlIHRleHRlIGRlIGxhIHF1ZXN0aW9uICFcIixcbiAgICBuZWVkTm90VG9vTG9uZ1RleHQ6IFwiTGEgcXVlc3Rpb24gbmUgZG9pdCBwYXMgY29tcHRlciBwbHVzIGRlIDI1NSBjYXJhY3TDqHJlcy5cIixcbiAgICBuZWVkUXVlc3Rpb25uYWlyZTogXCJMZSBxdWVzdGlvbm5haXJlIGNvbmNlcm7DqSBuJ2EgcGFzIMOpdMOpIHRyb3V2w6kuXCIsXG4gICAgbmVlZE1heFF1ZXN0aW9uczogXCJWb3VzIGF2ZXogZMOpasOgIGF0dGVpbnQgbGUgbm9tYnJlIG1heGltYWwgZGUgcXVlc3Rpb25zIHBvdXIgY2UgcXVlc3Rpb25uYWlyZSA6IFwiLFxuICAgIG5vdEZvdW5kOiBcIkwnZW5yZWdpc3RyZW1lbnQgZGUgbGEgcXVlc3Rpb24gbidhIHBhcyDDqXTDqSB0cm91dsOpLlwiLFxuICAgIGFkZE9rTWVzc2FnZTogXCJMYSBxdWVzdGlvbiBhIGJpZW4gw6l0w6kgYWpvdXTDqWUuXCIsXG4gICAgdXBkYXRlT2tNZXNzYWdlOiBcIkxhIHF1ZXN0aW9uIGEgYmllbiDDqXTDqSBtb2RpZmnDqWUuXCIsXG4gICAgZGVsZXRlT2tNZXNzYWdlOiBcIkxhIHF1ZXN0aW9uIGEgYmllbiDDqXTDqSBzdXBwcmltw6llLlwiLFxuICAgIGludHJvVGl0bGU6IFwiTGVzIHF1ZXN0aW9ucyBlbnJlZ2lzdHLDqWVzXCIsXG4gICAgaW50cm9Ob1F1ZXN0aW9uOiBcIkF1Y3VuZSBxdWVzdGlvbiBuJ2Egw6l0w6kgc2Fpc2llIHBvdXIgbCdpbnN0YW50XCIsXG4gICAgbmVlZE51bWJlckZvclJhbmsgOiBcIlZvdXMgZGV2ZXogZm91cm5pciB1biBub21icmUgc3Vww6lyaWV1ciBvdSDDqWdhbCDDoCAxIHBvdXIgbGUgcmFuZyBkZSBjZXR0ZSBxdWVzdGlvbi5cIlxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgbmVlZFRpdGxlOiBcIk1lcmNpIGRlIGZvdXJuaXIgdW4gdGl0cmUgw6Agdm90cmUgcXVpei5cIixcbiAgICBuZWVkTm90VG9vTG9uZ1RpdGxlOiBcIkxlIHRpdHJlIGR1IHF1aXogbmUgZG9pdCBwYXMgY29tcHRlciBwbHVzIGRlIDI1NSBjYXJhY3TDqHJlcy5cIixcbiAgICBuZWVkVXJsOiBcIk1lcmNpIGRlIGZvdXJuaXIgbCd1cmwgw6Agdm90cmUgcXVpei5cIixcbiAgICBuZWVkVW5pcXVlVXJsOiBcIkwndXJsIGR1IHF1aXogZG9pdCDDqnRyZSB1bmlxdWUuXCIsXG4gICAgbmVlZEludHJvZHVjdGlvbjogXCJNZXJjaSBkZSBmb3VybmlyIHVuIHRleHRlIGQnaW50cm9kdWN0aW9uIMOgIHZvdHJlIHF1aXouXCIsXG4gICAgbmVlZENvcnJlY3RQdWJsaXNoaW5nRGF0ZTogXCJMYSBkYXRlIGRlIHB1YmxpY2F0aW9uIGZvdXJuaWUgbidhIHBhcyB1biBmb3JtYXQgdmFsaWRlLlwiLFxuICAgIG5lZWRLbm93SWZJc1B1Ymxpc2hlZDogXCJJbCBmYXV0IHNhdm9pciBzaSBjZSBxdWl6IGVzdCBwdWJsacOpLlwiLFxuICAgIG5lZWRMYW5ndWFnZTogXCJWb3VzIGRldmV6IHPDqWxlY3Rpb25uZXIgbGEgbGFuZ3VlIGRlIGNlIHF1aXouXCIsXG4gICAgbmVlZEVzdGltYXRlZFRpbWU6IFwiTWVyY2kgZGUgc8OpbGVjdGlvbm5lciB1bmUgZXN0aW1hdGlvbiBkZSBsYSBkdXLDqWUgZGUgY2UgcXVpei5cIixcbiAgICBub3RGb3VuZCA6IFwiQXVjdW4gcXVpeiBuJ2EgcGFzIMOpdMOpIHRyb3V2w6kuXCIsXG4gICAgc2VhcmNoUmVzdWx0VGl0bGUgOiBcIlLDqXN1bHRhdCBwb3VyIHZvdHJlIHJlY2hlcmNoZVwiLFxuICAgIHNlYXJjaE5vUmVzdWx0IDogXCJBdWN1biByw6lzdWx0YXQgbidhIMOpdMOpIHRyb3V2w6kgcG91ciB2b3RyZSByZWNoZXJjaGVcIixcbiAgICBzZWFyY2hXaXRoUmVzdWx0IDogXCJWb2ljaSAjTkIgcXVpenMgcG91ciB2b3RyZSByZWNoZXJjaGUgOlwiLFxuICAgIHF1ZXN0aW9ubmFpcmVzTmFtZTogXCJxdWl6XCIsXG4gICAgcHVibGlzaGVkQnk6IFwiUXVpeiBwdWJsacOpIHBhclwiLFxuICAgIHB1Ymxpc2hlZEF0OiBcIiwgbGVcIixcbiAgICBsYXN0VXBkYXRlZDogXCJEZXJuacOocmUgbWlzZSDDoCBqb3VyLCBsZSBcIixcbiAgICBlc3RpbWF0ZWRUaW1lOiBcIkR1csOpZSBkZSBsZWN0dXJlIGVzdGltw6llIDogXCIsXG4gICAgZXN0aW1hdGVkVGltZU9wdGlvbiA6XG4gICAge1xuICAgICAgICBzaG9ydDogXCJjb3VydGVcIixcbiAgICAgICAgbWVkaXVtOiBcIm1veWVubmVcIixcbiAgICAgICAgbG9uZzogXCJsb25ndWVcIlxuICAgIH0sXG4gICAgZXhwbGFuYXRpb25CZWZvcmVUeHQ6IFwiRXh0cmFpdCA6XCIsXG4gICAgY29ycmVjdEFuc3dlclR4dDogXCJCb25uZSByw6lwb25zZVwiLFxuICAgIHdyb25nQW5zd2VyVHh0OiBcIk1hdXZhaXNlIHLDqXBvbnNlXCIsXG4gICAgYnRuU2VuZFJlc3BvbnNlOiBcIlRlc3RleiB2b3MgcsOpcG9uc2VzLlwiLFxuICAgIGJ0blByb3Bvc2VTdWJzY3JpYmU6IFwiSmUgY3LDqWUgbW9uIGNvbXB0ZS5cIixcbiAgICBidG5Qcm9wb3NlQ29ubmVjdGlvbjogXCJKZSBtZSBjb25uZWN0ZS5cIixcbiAgICBidG5TaG93UXVlc3Rpb25uYWlyZTogXCJBZmZpY2hlciBsZSBxdWl6ICFcIixcbiAgICBidG5TaGFyZVF1aXpUeHQ6IFwiUGFydGFnZXIgY2UgcXVpeiBzdXIgXCIsXG4gICAgbmV4dFF1ZXN0aW9ubmFpcmVzTGlzdDogXCJMZXMgI05CIHByb2NoYWlucyBxdWl6cyBkZXZhbnQgw6p0cmUgcHVibGnDqXNcIixcbiAgICBuZWVkQmVDb21wbGV0ZWQ6IFwiUXVpeiBpbmNvbXBsZXRcIixcbiAgICBuZXh0RGF0ZVdpdGhvdXRRdWVzdGlvbm5haXJlOiBcIlByb2NoYWluZSBkYXRlIHNhbnMgcXVpeiBwcm9ncmFtbcOpIDogXCIsXG4gICAgaGF2ZUJlZW5QdWJsaXNoZWQgOiBcIjpOQiBub3V2ZWF1eCBxdWVzdGlvbm5haXJlcyBvbnQgw6l0w6kgcHVibGnDqXMuXCIsXG4gICAgaGF2ZUJlZW5SZWdlbmVyYXRlZCA6IFwiTGVzIGZpY2hpZXJzIEhUTUwgZGUgI05CMSBxdWVzdGlvbm5haXJlcyBldCAjTkIyIHJ1YnJpcXVlcyBvbnQgw6l0w6kgcmVnw6luw6lyw6lzLlwiXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBub3RGb3VuZDogXCJMJ3V0aWxpc2F0ZXVyIG4nYSBwYXMgw6l0w6kgdHJvdXbDqS5cIixcbiAgICBuZWVkTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyLlwiLFxuICAgIG5lZWROb3RUb29Mb25nTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyIG5lIGNvbXB0YW50IHBhcyBwbHVzIGRlIDcwIGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRFbWFpbDogXCJNZXJjaSBkZSBzYWlzaXIgdm90cmUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgbmVlZFVuaXF1ZUVtYWlsOiBcIkwnYWRyZXNzZSBlLW1haWwgcXVlIHZvdXMgYXZleiBzYWlzaWUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcG91ciB1biBjb21wdGUgdXRpbGlzYXRldXIuIFNpIHZvdXMgYXZleiBkw6lqw6AgdW4gY29tcHRlLCA8YSBocmVmPScvI1VSTCc+Y2xpcXVlei1pY2kgcG91ciB2b3VzIGNvbm5lY3RlcjwvYT4uXCIsXG4gICAgbmVlZE5vdFRvb0xvbmdFbWFpbDogXCJNZXJjaSBkZSBzYWlzaXIgdW5lIGFkcmVzc2UgZS1tYWlsIG5lIGNvbXB0YW50IHBhcyBwbHVzIGRlIDI1NSBjYXJhY3TDqHJlcy5cIixcbiAgICBuZWVkUGFzc1dvcmQgOiBcIk1lcmNpIGRlIGZvdXJuaXIgdW4gbW90IGRlIHBhc3NlLlwiLFxuICAgIG5lZWRMb25nUGFzc1dvcmQgOiBcIk1lcmNpIGRlIGZvdXJuaXIgdW4gbW90IGRlIHBhc3NlIGQnYXUgbW9pbnMgTUlOX0xFTkdUSCBjYXJhY3TDqHJlcy5cIixcbiAgICBwYXNzd29yZENvcGllZDogXCJMZSBtb3QgZGUgcGFzc2UgZ8OpbsOpcsOpIGEgw6l0w6kgY29wacOpIGRhbnMgbGUgcHJlc3NlLXBhcGllciBkZSB2b3RyZSBvcmRpbmF0ZXVyIChvdSBtb2JpbGUpLiBWb3VzIHBvdXZleiBsZSBcXFwiY29sbGVyXFxcIiBvw7kgdm91cyBsZSBzb3VoYWl0ZXouXCIsXG4gICAgbmVlZFN0YXR1cyA6IFwiSWwgbWFucXVlIGxlIHN0YXR1dC5cIixcbiAgICBuZWVkTGFuZ3VhZ2UgOiBcIklsIG1hbnF1ZSBsZSBjb2RlIGxhbmd1ZS5cIixcbiAgICBuZWVkVmFsaWRMYXN0Q29ubmVjdGlvbkRhdGUgOiBcIkxhIGRhdGUgZGUgZGVybmnDqHJlIGNvbm5leGlvbiBuJ2VzdCBwYXMgdmFsaWRlLlwiLFxuICAgIG5lZWRTTVRQIDogXCJJbCBtYW5xdWUgbGUgc2VydmV1ciBTTVRQLlwiLFxuICAgIG5lZWRTTVRQTm90Rm91bmQgOiBcIklsIG1hbnF1ZSB1biBzZXJ2ZXVyIFNNVFAgdmFsaWRlLlwiLFxuICAgIG5lZWRLbm93TmV3c2xldHRlck9rIDogXCJJbCBmYXV0IHNhdm9pciBzaSBsJ3V0aWxpc2F0ZXVyIGFjY2VwdGUgb3UgcmVmdXNlIGRlIHJlY2V2b2lyIGxhIG5ld3NsZXR0ZXIuXCIsXG4gICAgbmVlZFRpbWVEaWZmZXJlbmNlIDogXCJJbCBmYXV0IGNvbm5hw650cmUgbGUgbm9tYnJlIGRlIG1pbnV0ZXMgZHUgZMOpY2FsYWdlIGhvcmFpcmUuXCIsXG4gICAgbmVlZE1pblRpbWVEaWZmZXJlbmNlIDogXCJJbCBmYXV0IGZvdXJuaXIgdW4gbm9tYnJlIGRlIG1pbnV0ZXMgw6AgZW5sZXZlciDDoCBsJ2hldXJlIEdNVCBuZSBkw6lwYXNzYW50IHBhcyA3MjAuXCIsXG4gICAgbmVlZE1heFRpbWVEaWZmZXJlbmNlIDogXCJJbCBmYXV0IGZvdXJuaXIgdW4gbm9tYnJlIGRlIG1pbnV0ZXMgw6AgYWpvdXRlciDDoCBsJ2hldXJlIEdNVCBuZSBkw6lwYXNzYW50IHBhcyA4NDAuXCIsXG4gICAgbmVlZFVHQ09rIDogXCJNZXJjaSBkJ2FjY2VwdGVyIGxlcyBDR1UgcG91ciBjcsOpZXIgdm90cmUgY29tcHRlLlwiLFxuICAgIGdvZGZhdGhlck5vdEZvdW5kOiBcIkTDqXNvbMOpIG1haXMgYXVjdW4gdXRpbGlzYXRldXIgbidhIMOpdMOpIHRyb3V2w6kgcG91ciBjZSBjb2RlL2UtbWFpbCBwYXJyYWluIDooXCIsXG4gICAgZ29kZmF0aGVyRm91bmQ6IFwiVm90cmUgXFxcInBhcnJhaW5cXFwiIGEgYmllbiDDqXTDqSB0cm91dsOpIDopXCIsXG4gICAgbWFpbFZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGluc2NyaXB0aW9uIGVzdCBiaWVuIGVucmVnaXN0csOpZS5cXG5Qb3VyIGxhIGZpbmFsaXNlciwgbWVyY2kgZGUgY2xpcXVlciBkYW5zIGxlcyAyNCBIIHN1ciBsZSBsaWVuIGRlIGNvbmZpcm1hdGlvbiBxdWkgdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHBhciBlLW1haWwuXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU3ViamVjdCA6IFwiTWVyY2kgZGUgdmFsaWRlciB2b3RyZSBpbnNjcmlwdGlvblwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1R4dCA6IFwiVmFsaWRlciBtb24gY29tcHRlLlwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1NCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5cXG5Qb3VyIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24sIG1lcmNpIGRlIGNsaXF1ZXIgc3VyIGxlIGxpZW4gc3VpdmFudCBkYW5zIGxlcyAyNGggOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24sIG1lcmNpIGRlIGNsaXF1ZXIgc3VyIGxlIGxpZW4gY2ktZGVzc291cyBkYW5zIGxlcyAyNGguPC9wPlwiLFxuICAgIHZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGNvbXB0ZSB2aWVudCBiaWVuIGQnw6p0cmUgdmFsaWTDqS4gTWVyY2kgZXQgYmllbnZlbnVlICE8YnI+Vm91cyBwb3V2ZXogc2FucyB0YXJkZXIgdm91cyBjb25uZWN0ZXIgY2ktZGVzc291cyBwb3VyIGFjY8OpZGVyIMOgIHZvdHJlIGVzcGFjZSBXaWtpTGVybmkuXCIsXG4gICAgdmFsaWRhdGlvbk1lc3NhZ2VBZG1pbjogXCJMZSBjb21wdGUgYSBiaWVuIMOpdMOpIHZhbGlkw6kuXCIsXG4gICAgdmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlOiBcIklsIHNlbWJsZSBxdWUgdm91cyBheWV6IGTDqWrDoCB2YWxpZMOpIHZvdHJlIGNvbXB0ZS5cIixcbiAgICB2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2VBZG1pbjogXCJDZSBjb21wdGUgYSBkw6lqw6Agw6l0w6kgdmFsaWTDqS5cIixcbiAgICBtYWlsV2VsY29tZVN1YmplY3QgOiBcIkJpZW52ZW51ZSAhXCIsXG4gICAgbWFpbFdlbGNvbWVMaW5rVHh0IDogXCJNZSBjb25uZWN0ZXIgw6AgbW9uIGNvbXB0ZS5cIixcbiAgICBtYWlsV2VsY29tZUJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblZvdXMgdmVuZXogZGUgdmFsaWRlciB2b3RyZSBpbnNjcmlwdGlvbiDDoCBOT01fU0lURS4gTWVyY2kgZXQgYmllbnZlbnVlICFcXG5cXG5TaSB2b3VzIGF2ZXogbGEgbW9pbmRyZSBxdWVzdGlvbiBvdSBzdWdnZXN0aW9uIGNvbmNlcm5hbnQgTk9NX1NJVEUsIG4naMOpc2l0ZXogcGFzIMOgIG1lIGNvbnRhY3RlciBlbiDDqWNyaXZhbnQgw6AgRU1BSUwuXFxuXFxuSmUgdm91cyBjb25zZWlsbGUgZCdhaWxsZXVycyBkJ2Fqb3V0ZXIgRU1BSUwgw6Agdm90cmUgY2FybmV0IGQnYWRyZXNzZXMgcG91ciDDqXZpdGVyIHF1ZSBsZXMgcHJvY2hhaW5zIGVudm9pcyBkdSBzaXRlIG4nYXJyaXZlbnQgZW4gXFxcInNwYW1cXFwiLlxcblxcblBhciBhaWxsZXVycywgcG91ciBnw6lyZXIgdm90cmUgYWJvbm5lbWVudCwgYWNjw6lkZXIgw6Agdm9zIGluZm9ybWF0aW9ucyBvdSBlbmNvcmUgY2hlcmNoZXIgcGx1cyBmYWNpbGVtZW50IHBhcm1pIGxlcyBxdWl6cyBkdSBzaXRlLCB2b3VzIHBvdXZleiDDoCB0b3V0IG1vbWVudCB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUgdXRpbGlzYXRldXIuXFxuXFxuUG91ciBjZSBmYWlyZSwgdXRpbGlzZXogbGUgbGllbiBzdWl2YW50IDogTElOS19VUkxcXG5cXG7DgCBiaWVudMO0dCBzdXIgTk9NX1NJVEUuXCIsXG4gICAgbWFpbFdlbGNvbWVCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+Vm91cyB2ZW5leiBkZSB2YWxpZGVyIHZvdHJlIGluc2NyaXB0aW9uIMOgIE5PTV9TSVRFLiBNZXJjaSBldCBiaWVudmVudWUgITxicj48YnI+U2kgdm91cyBhdmV6IGxhIG1vaW5kcmUgcXVlc3Rpb24gb3Ugc3VnZ2VzdGlvbiBjb25jZXJuYW50IE5PTV9TSVRFLCBuJ2jDqXNpdGV6IHBhcyDDoCBtZSBjb250YWN0ZXIgZW4gw6ljcml2YW50IMOgIDxiPkVNQUlMPC9iPi48YnI+PGJyPkplIHZvdXMgY29uc2VpbGxlIGQnYWlsbGV1cnMgZCdham91dGVyIDxiPkVNQUlMPC9iPiDDoCB2b3RyZSBjYXJuZXQgZCdhZHJlc3NlcyBwb3VyIMOpdml0ZXIgcXVlIGxlcyBwcm9jaGFpbnMgZW52b2lzIGR1IHNpdGUgbidhcnJpdmVudCBlbiA8aT5zcGFtPC9pPi48YnI+PGJyPlBhciBhaWxsZXVycywgcG91ciBnw6lyZXIgdm90cmUgYWJvbm5lbWVudCwgYWNjw6lkZXIgw6Agdm9zIGluZm9ybWF0aW9ucyBvdSBlbmNvcmUgY2hlcmNoZXIgcGx1cyBmYWNpbGVtZW50IHBhcm1pIGxlcyBxdWl6cyBkdSBzaXRlLCB2b3VzIHBvdXZleiDDoCB0b3V0IG1vbWVudCB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUgdXRpbGlzYXRldXIuPGJyPjxicj5Qb3VyIGNlIGZhaXJlLCB1dGlsaXNleiBsZSBsaWVuIGNpLWRlc3NvdXMuPGJyPjxicj7DgCBiaWVudMO0dCBzdXIgTk9NX1NJVEUuXCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyU3ViamVjdCA6IFwiTWVyY2kgIVwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlckxpbmtUeHQgOiBcIk1lIGNvbm5lY3RlciDDoCBtb24gY29tcHRlLlwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlckJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcbkdyw6JjZSDDoCB2b3VzLCB1biBub3V2ZWwgdXRpbGlzYXRldXIgKEVNQUlMKSB2aWVudCBkZSBzJ2luc2NyaXJlIHN1ciBOT01fU0lURS5cXG5TaSBkYW5zIGwnYXZlbmlyIGNldHRlIHBlcnNvbm5lIHNvdXNjcml0IHVuIGFib25uZW1lbnQgcHLDqW1pdW0sIHZvdHJlIHByb3ByZSBhYm9ubmVtZW50IHNlcmEgcHJvbG9uZ8OpIGRlIDMwIGpvdXJzLlxcbkVuY29yZSBtZXJjaSBldCDDoCBiaWVudMO0dCAhXCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPkdyw6JjZSDDoCB2b3VzLCB1biBub3V2ZWwgdXRpbGlzYXRldXIgKEVNQUlMKSB2aWVudCBkZSBzJ2luc2NyaXJlIHN1ciBOT01fU0lURS48YnI+U2kgZGFucyBsJ2F2ZW5pciBjZXR0ZSBwZXJzb25uZSBzb3VzY3JpdCB1biBhYm9ubmVtZW50IHByw6ltaXVtLCB2b3RyZSBwcm9wcmUgYWJvbm5lbWVudCBzZXJhIHByb2xvbmfDqSBkZSAzMCBqb3Vycy48L3A+PHA+RW5jb3JlIG1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGxpZW4gZGUgY29uZmlybWF0aW9uIG5lIHNlbWJsZSBwYXMgdmFsaWRlIG91IGJpZW4gaWwgYSBleHBpcsOpLiBWb3VzIHBvdXZleiBlbiByZWNldm9pciB1biBub3V2ZWF1IDxhIGhyZWY9JyNVUkwnPmVuIGNsaXF1YW50IGljaTwvYT4uXCIsXG4gICAgZW1haWxOb3RGb3VuZDogXCJBdWN1biBjb21wdGUgdXRpbGlzYXRldXIgbidhIMOpdMOpIHRyb3V2w6kgcG91ciBjZXR0ZSBhZHJlc3NlIGUtbWFpbC5cIixcbiAgICBhbHJlYWR5Q29ubmVjdGVkOiBcIlZvdXMgw6p0ZXMgZMOpasOgIGNvbm5lY3TDqSBhdSBzaXRlICFcIixcbiAgICBuZWVkQmVDb25uZWN0ZWQ6IFwiVm91cyBkZXZleiDDqnRyZSBjb25uZWN0w6kgcG91ciBhY2PDqWRlciDDoCBjZXR0ZSBwYWdlLlwiLFxuICAgIGNvbm5lY3Rpb25PazogXCJDb25uZXhpb24gcsOpdXNzaWUuXCIsXG4gICAgbmVlZENob29zZUxvZ2luV2F5OiBcIlZvdXMgZGV2ZXogc29pdCBzYWlzaXIgdm90cmUgbW90IGRlIHBhc3NlLCBzb2l0IGNvY2hlciBsYSBjYXNlIHZvdXMgcGVybWV0dGFudCBkZSByZWNldm9pciB1biBsaWVuIGRlIGNvbm5leGlvbiBwYXIgZS1tYWlsLlwiLFxuICAgIG5lZWRWYWxpZGF0aW9uVG9Mb2dpbiA6IFwiVm91cyBkZXZleiBkJ2Fib3JkIHZhbGlkZXIgdm90cmUgY29tcHRlIGF2YW50IGRlIHBvdXZvaXIgdm91cyBjb25uZWN0ZXIuIFBvdXIgY2UgZmFpcmUsIHVuIG5vdXZlYXUgbGllbiB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbC5cIixcbiAgICB0b29NYW55TG9naW5GYWlscyA6IFwiRMOpc29sw6kgbWFpcyBpbCB5IGEgZXUgdHJvcCBkZSB0ZW50YXRpdmVzIGRlIGNvbm5leGlvbiBpbmZydWN0dWV1c2VzIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuIFZvdXMgZGV2ZXogYXR0ZW5kcmUgTUlOVVRFUyBtaW51dGVzIHBvdXIgZXNzYXllciBkZSBub3V2ZWF1LlwiLFxuICAgIGJhZFBhc3N3b3JkOiBcIkF1Y3VuIGNvbXB0ZSB1dGlsaXNhdGV1ciBuZSBjb3JyZXNwb25kIGF1eCBpbmZvcm1hdGlvbnMgc2Fpc2llcy5cIixcbiAgICBtYWlsTG9naW5MaW5rU3ViamVjdCA6IFwiVm90cmUgbGllbiBkZSBjb25uZXhpb24uXCIsXG4gICAgbWFpbExvZ2luTGlua1R4dCA6IFwiTWUgY29ubmVjdGVyLlwiLFxuICAgIG1haWxMb2dpbkxpbmtCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5cXG5Qb3VyIHZvdXMgY29ubmVjdGVyIMOgIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxMb2dpbkxpbmtCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+UG91ciB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6PC9wPlwiLFxuICAgIG1haWxMb2dpbkxpbmtNZXNzYWdlIDogXCJVbiBsaWVuIGRlIGNvbm5leGlvbiB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgc3VyIHZvdHJlIGFkcmVzc2UgZS1tYWlsLiBOZSB0YXJkZXogcGFzIMOgIGwndXRpbGlzZXIsIGNhciBpbCBuJ2VzdCB2YWxhYmxlIHF1ZSBkdXJhbnQgKlRJTUlORyogIVwiLFxuICAgIHVwZGF0ZWRPa01lc3NhZ2U6IFwiVm9zIGluZm9ybWF0aW9ucyBvbnQgYmllbiDDqXTDqSBtaXNlcyDDoCBqb3VyLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEVtYWlsIDogXCJNYWlzIGxhIG5vdXZlbGxlIGFkcmVzc2UgZS1tYWlsIG4nYSBwdSDDqnRyZSBlbnJlZ2lzdHLDqWUsIGNhciBlbGxlIG4nYSBwYXMgdW4gZm9ybWF0IGNvcnJlY3QuXCIsXG4gICAgdXBkYXRlZE5lZWRVbmlxdWVFbWFpbCA6IFwiTWFpcyBsYSBub3V2ZWxsZSBhZHJlc3NlIGUtbWFpbCBzYWlzaWUgKE5FV19FTUFJTCkgbidhIHB1IMOqdHJlIGVucmVnaXN0csOpZSwgY2FyIGVsbGUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcG91ciB1biBhdXRyZSBjb21wdGUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luU3ViamVjdCA6IFwiTWVyY2kgZGUgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkxpbmtUeHQgOiBcIlZhbGlkZXIuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuXFxuUG91ciB2YWxpZGVyIHZvcyBub3V2ZWF1eCBpZGVudGlmaWFudHMgZGUgY29ubmV4aW9uLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlBvdXIgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiwgY2xpcXVleiBzdXIgbGUgbGllbiBjaS1kZXNzb3VzIHNhbnMgdGFyZGVyLjwvcD5cIixcbiAgICBtYWlsVXBkYXRlTG9naW5MaW5rTWVzc2FnZTogXCJDZXBlbmRhbnQsIHZvdXMgYXZleiBtb2RpZmnDqSBhdSBtb2lucyB1biBkZSB2b3MgaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiAoZS1tYWlsIGV0L291IG1vdCBkZSBwYXNzZSkgZXQgPGI+dm91cyBkZXZleiBjbGlxdWVyIHN1ciBsZSBsaWVuIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlcyBlbnZvecOpIHN1ciB2b3RyZSBhZHJlc3NlIChORVdfRU1BSUwpIHBvdXIgdmFsaWRlciBjZSBjaGFuZ2VtZW50PC9iPi48YnI+RW4gYXR0ZW5kYW50LCBtZXJjaSBkZSBjb250aW51ZXIgw6AgdXRpbGlzZXIgdm9zIGFuY2llbnMgaWRlbnRpZmlhbnRzLlwiLFxuICAgIHVwZGF0ZWROZWVkVmFsaWRhdGVkVXNlcjogXCJMJ3V0aWxpc2F0ZXVyIHF1ZSB2b3VzIHNvdWhhaXRleiBtb2RpZmllciBuJ2V4aXN0ZSBwYXMvcGx1cyBvdSBuJ2EgcGFzIGVuY29yZSB2YWxpZMOpIHNvbiBjb21wdGUuXCIsXG4gICAgdXBkYXRlZE5lZWRHb29kR29kZmF0aGVyIDogXCJNYWlzIGxlIG5vdXZlYXUgY29kZSBwYXJyYWluIG4nYSBwdSDDqnRyZSByZXRlbnUsIGNhciBpbCBuZSBjb3JyZXNwb25kIMOgIGF1Y3VuIGNvbXB0ZSB1dGlsaXNhdGV1ciBvdSDDoCBsJ3V0aWxpc2F0ZXVyIGx1aS1tw6ptZS5cIixcbiAgICBtYWlsVXBkYXRlTG9naW5Pa01lc3NhZ2U6IFwiTGEgbWlzZSDDoCBqb3VyIGRlIHZvcyBpZGVudGlmaWFudHMgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS5cIixcbiAgICB1cGRhdGVkRmFpbGVkR29kZmF0aGVyTm90Rm91bmQgOiBcIkwnaWRlbnRpZmlhbnQgZm91cm5pIHBvdXIgbGUgcGFycmFpbiBuZSBjb3JyZXNwb25kIMOgIGF1Y3VuIHV0aWxpc2F0ZXVyLlwiLFxuICAgIGNyZWF0aW9uT2tNZXNzYWdlOiBcIkxlIG5vdXZlbCB1dGlsaXNhdGV1ciBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6kuXCIsXG4gICAgbWFpbERlbGV0ZVN1YmplY3QgOiBcIkNvbmZpcm1lciBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtUeHQgOiBcIkNvbmZpcm1lci5cIixcbiAgICBtYWlsRGVsZXRlQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuXFxuUG91ciBjb25maXJtZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbERlbGV0ZUJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIGNvbmZpcm1lciBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gY2ktZGVzc291cyBzYW5zIHRhcmRlci48L3A+XCIsXG4gICAgbWFpbERlbGV0ZUxpbmtNZXNzYWdlOiBcIlZvdHJlIGRlbWFuZGUgZGUgc3VwcHJlc3Npb24gYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS4gTWVyY2kgZGUgY2xpcXVlciBzYW5zIHRhcmRlciBzdXIgbGUgbGllbiBxdWkgdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHBhciBlLW1haWwgcG91ciBjb25maXJtZXIuXCIsXG4gICAgZGVsZXRlT2tNZXNzYWdlOiBcIkwndXRpbGlzYXRldXIgYSBiaWVuIMOpdMOpIHN1cHByaW3DqS5cIixcbiAgICBkZWxldGVGYWlsTWVzc2FnZTogXCJUZW50YXRpdmUgZGUgc3VwcHJlc3Npb24gZCd1biB1dGlsaXNhdGV1ciBpbmV4aXN0YW50IDogXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtPa01lc3NhZ2U6IFwiVm90cmUgY29tcHRlIGEgYmllbiDDqXTDqSBzdXBwcmltw6kuIE1lcmNpIGQnYXZvaXIgdXRpbGlzw6kgbm9zIHNlcnZpY2VzLlwiLFxuICAgIG1haWxEZWxldGVMaW5rQWxyZWFkeU1lc3NhZ2U6IFwiSWwgc2VtYmxlIHF1ZSB2b3VzIGF5ZXogZMOpasOgIHZhbGlkw6kgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLlwiLFxuICAgIG1haWxEZWxldGVMaW5rRmFpbE1lc3NhZ2U6IFwiVm90cmUgbGllbiBkZSBzdXBwcmVzc2lvbiBuJ2VzdCBwYXMgdmFsaWRlIG91IGFsb3JzIGlsIGEgZXhwaXLDqS5cIixcbiAgICBjcm9uRGVsZXRlVW52YWxpZGVkVXNlcnNNZXNzYWdlOiBcIiBjb21wdGVzIHV0aWxpc2F0ZXVycyBub24gdmFsaWTDqXMgb250IMOpdMOpIHN1cHByaW3DqXMuXCIsXG4gICAgZGVsZXRlSW5hY3RpdmVVc2Vyc01lc3NhZ2U6IFwiIGNvbXB0ZXMgdXRpbGlzYXRldXJzIGluYWN0aWZzIG9udCDDqXTDqSBzdXBwcmltw6lzLlwiLFxuICAgIHdlbGNvbWVNZXNzYWdlOiBcIkJpZW52ZW51ZSAjTkFNRSAhXCIsXG4gICAgYnllYnllTWVzc2FnZTogXCJTaSB2b3VzIHZveWV6IGNlIG1lc3NhZ2UsIGMnZXN0IHF1ZSB2b3RyZSBkw6ljb25uZXhpb24gcydlc3QgYmllbiBkw6lyb3Vsw6llLjxicj7DgCBiaWVudMO0dCAhXCIsXG4gICAgaW5mb3NVc2VyRm9yQWRtaW46IFwiQ2V0IHV0aWxpc2F0ZXVyIChpZDogSURfVVNFUikgYSA8Yj5jcsOpw6kgc29uIGNvbXB0ZSBsZSBEQVRFX0NSRUE8L2I+LCBsYSBkZXJuacOocmUgbWlzZSDDoCBqb3VyIGRhdGFudCBkdSBEQVRFX1VQREFURS48YnI+PGI+RGF0ZSBkZSBzYSBkZXJuacOocmUgY29ubmV4aW9uIDogREFURV9DT05ORUNUSU9OLjwvYj5cIixcbiAgICBpbmZvc0FkbWluR29kZmF0aGVyOiBcIkNldCB1dGlsaXNhdGV1ciBhIMOpdMOpIHBhcnJhaW7DqSBwYXIgXCIsXG4gICAgaW5mb3NBZG1pbk5iR29kQ2hpbGRzOiBcIlNlcyAjTkIgZmlsbGV1aWxzIDogXCJcbn07IiwiLy8gUXVlbHF1ZXMgZm9uY3Rpb25zIHV0aWxlcyBwb3VyIGxlcyBjaGHDrm5lc1xuXG5jbGFzcyBUb29sXG57XG4gICAgc3RhdGljIGlzRW1wdHkobXlWYXIpXG4gICAge1xuICAgICAgICBpZihteVZhcj09PXVuZGVmaW5lZCB8fCBteVZhcj09PW51bGwpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVZhcis9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVZhcj1teVZhci50cmltKCk7XG4gICAgICAgICAgICBpZihteVZhcj09PVwiXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIHN0YXRpYyB0cmltSWZOb3ROdWxsKG15U3RyaW5nKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KG15U3RyaW5nKSlcbiAgICAgICAgICAgIG15U3RyaW5nPW51bGw7XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgbXlTdHJpbmcrPVwiXCI7Ly8gc2kgYXV0cmUgY2hvc2UgcXUndW5lIGNoYcOubmUgZW52b3nDqS4uLlxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcudHJpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cblxuICAgIHN0YXRpYyBzaG9ydGVuSWZMb25nZXJUaGFuKG15U3RyaW5nLCBtYXgpXG4gICAge1xuICAgICAgICBteVN0cmluZys9XCJcIjsvLyBhdSBjYXMgb8O5IGNlbGEgbmUgc2VyYWl0IHBhcyB1bmUgY2hhw65uZS4uLlxuICAgICAgIGlmKG15U3RyaW5nLmxlbmd0aCA+IG1heClcbiAgICAgICAgICAgIG15U3RyaW5nPW15U3RyaW5nLnN1YnN0cmluZygwLCAobWF4LTMpKStcIi4uLlwiO1xuICAgICAgICByZXR1cm4gbXlTdHJpbmc7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTU2MDQxNDAvcmVwbGFjZS1tdWx0aXBsZS1zdHJpbmdzLXdpdGgtbXVsdGlwbGUtb3RoZXItc3RyaW5nc1xuICAgIHN0YXRpYyByZXBsYWNlQWxsKG15U3RyaW5nLCBtYXBPYmopXG4gICAge1xuICAgICAgICBjb25zdCByZXBsYWNlRWx0cyA9IG5ldyBSZWdFeHAoT2JqZWN0LmtleXMobWFwT2JqKS5qb2luKFwifFwiKSxcImdpXCIpO1xuICAgICAgICByZXR1cm4gbXlTdHJpbmcucmVwbGFjZShyZXBsYWNlRWx0cywgKG1hdGNoZWQpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBtYXBPYmpbbWF0Y2hlZF07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHNvdXJjZSA6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2ZyL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL09iamV0c19nbG9iYXV4L01hdGgvcmFuZG9tXG4gICAgc3RhdGljIGdldFJhbmRvbUludChtaW4sIG1heClcbiAgICB7XG4gICAgICAgIG1pbiA9IE1hdGguY2VpbChtaW4pO1xuICAgICAgICBtYXggPSBNYXRoLmZsb29yKG1heCk7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluKSkgKyBtaW47XG4gICAgfVxuXG4gICAgLy8gw6AgY29tcGzDqXRlciA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0RhdGVfZm9ybWF0X2J5X2NvdW50cnlcbiAgICBzdGF0aWMgZGF0ZUZvcm1hdChkYXRlU3RyaW5nLCBsYW5nPVwiZnJcIilcbiAgICB7XG4gICAgICAgIGlmKFRvb2wuaXNFbXB0eShkYXRlU3RyaW5nKSlcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICBsZXQgbXlEYXRlPW5ldyBEYXRlKGRhdGVTdHJpbmcpO1xuICAgICAgICBsZXQgbXlEYXk9bXlEYXRlLmdldERhdGUoKStcIlwiO1xuICAgICAgICBpZihteURheS5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlEYXk9XCIwXCIrbXlEYXk7XG4gICAgICAgIGxldCBteU1vdW50aD0obXlEYXRlLmdldE1vbnRoKCkrMSkrXCJcIjtcbiAgICAgICAgaWYobXlNb3VudGgubGVuZ3RoPT09MSlcbiAgICAgICAgICAgIG15TW91bnRoPVwiMFwiK215TW91bnRoO1xuICAgICAgICBsZXQgbXlZZWFyPW15RGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICBpZihsYW5nPT09XCJmclwiKVxuICAgICAgICAgICAgcmV0dXJuIG15RGF5K1wiL1wiK215TW91bnRoK1wiL1wiK215WWVhcjtcbiAgICAgICAgZWxzZSBpZiAobGFuZz09PVwiZm9ybVwiKS8vIDIwMTQtMDItMDlcbiAgICAgICAgICAgIHJldHVybiBteVllYXIrXCItXCIrbXlNb3VudGgrXCItXCIrbXlEYXk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBteU1vdW50aCtcIi9cIitteURheStcIi9cIitteVllYXI7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFRvb2w7IiwidmFyIG1hcCA9IHtcblx0XCIuL2RlZmF1bHQvY29uZmlnL2ZyLmpzXCI6IFwiLi4vdmlld3MvZGVmYXVsdC9jb25maWcvZnIuanNcIixcblx0XCIuL3dpa2lsZXJuaS9jb25maWcvZnIuanNcIjogXCIuLi92aWV3cy93aWtpbGVybmkvY29uZmlnL2ZyLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL3ZpZXdzIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcLmpzJFwiOyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBoZWFkTGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJBY2N1ZWlsXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9cIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIk1vbiBjb21wdGVcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nvbm5leGlvbi5odG1sXCIsIGlkOiBcImFjY291bnRIZWFkTGlua1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiw4AgcHJvcG9zXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9hLXByb3Bvcy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDb250YWN0XCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb250YWN0Lmh0bWxcIiB9IH0sXG4gICAgXSxcbiAgICBmb290TGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJDcsOpZGl0c1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY3JlZGl0cy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNZW50aW9ucyBsw6lnYWxlc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvbWVudGlvbnMtbGVnYWxlcy5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiRG9ubsOpZXMgcGVyc29ubmVsbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9kb25uZWVzLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkMuRy5VLlwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY2d1Lmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDLkcuVi5cIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nndi5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICBdLFxuICAgIG1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlOiAxMCxcbiAgICB1c2VySG9tZVBhZ2UgOiBcImFjY3VlaWwuaHRtbFwiLFxuICAgIGFkbWluSG9tZVBhZ2UgOiBcImFkbWluLmh0bWxcIixcbiAgICBtYW5hZ2VySG9tZVBhZ2UgOiBcImdlc3Rpb24uaHRtbFwiLFxuICAgIHN1YnNjcmliZVBhZ2UgOiBcImluc2NyaXB0aW9uLmh0bWxcIixcbiAgICBjb25uZWN0aW9uUGFnZSA6IFwiY29ubmV4aW9uLmh0bWxcIixcbiAgICBhY2NvdW50UGFnZTogXCJjb21wdGUuaHRtbFwiLFxuICAgIHF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi1xdWl6cy5odG1sXCIsXG4gICAgdXNlcnNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXV0aWxpc2F0ZXVycy5odG1sXCIsXG4gICAgbmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSA6IDEwLFxuICAgIGlsbHVzdHJhdGlvbkRpciA6IFwiL2ltZy9xdWl6cy9cIixcbiAgICBzaXRlU2xvZ2FuOiBcIkN1bHRpdm9ucyBub3RyZSBqYXJkaW4gIVwiLFxuICAgIGhvbWVUaXRsZTE6IFwiRGUgbmF0dXJlIGN1cmlldXNlID9cIixcbiAgICBob21lUDE6IFwiQXZlYyBXaWtpTGVybmkgdm91cyBhcHByZW5leiBjaGFxdWUgam91ciBkZSBub3V2ZWxsZXMgY2hvc2VzLjxicj5EZXMgYXJ0aWNsZXMgZGUgV2lraXDDqWRpYSBzb250IHPDqWxlY3Rpb25uw6lzIHBvdXIgdm91cyBldCBzb250IHN1aXZpcyBkJ3VuIHF1aXogdm91cyBwZXJtZXR0YW50IGRlIHRlc3RlciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudS48YnI+RGUgam91ciBlbiBqb3VyIGRlIG5vdXZlbGxlcyBncmFpbmVzIGRlIHNhdm9pciBzb250IGFpbnNpIHNlbcOpZXMgZGFucyB2b3RyZSBcXFwiamFyZGluXFxcIi5cIixcbiAgICBob21lVGl0bGUyOiBcIkxhIGN1bHR1cmUgZW4gbGliZXJ0w6lcIixcbiAgICBob21lUDI6IFwiVG91dCBjb21tZSBzdXIgV2lraXDDqWRpYSAoKiksIGxlIGxvZ2ljaWVsIGV0IGxlIGNvbnRlbnUgcGFydGFnw6kgc3VyIFdpa2lMZXJuaSBzb250IGxpYnJlcy48YnI+Vm91cyBwb3V2ZXogbGVzIHV0aWxpc2VyLCBsZXMgbW9kaWZpZXIgZXQgbGVzIGRpZmZ1c2VyIHNlbG9uIHZvdHJlIHNvdWhhaXQuPGJyPlN1ciBXaWtpTGVybmksIHBhcyBkZSBwdWJsaWNpdMOpLCBuaSBkZSBjb21tZXJjaWFsaXNhdGlvbiBkZSB2b3MgZG9ubsOpZXMgcGVyc29ubmVsbGVzLjxicj5Wb3VzIHBvdXZleiB2ZW5pciB5IFxcXCJjdWx0aXZlciB2b3RyZSBqYXJkaW5cXFwiIGVuIHRvdXRlIHRyYW5xdWlsbGl0w6kuPGJyPjxicj48c21hbGw+PGVtPigqKSBCaWVuIHF1ZSBwYXJ0YWdlYW50IHNlcyB2YWxldXJzLCBXaWtpTGVybmkgZXN0IHVuIHByb2pldCBpbmTDqXBlbmRhbnQgZGUgbGEgZm9uZGF0aW9uIFdpa2lww6lkaWEuPC9lbT48L3NtYWxsPlwiLFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzVGl0bGU6IFwiTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzIHN1ciBXaWtpTGVybmlcIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc0ludHJvOiBcIkxpc3RlIGRlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyBzdXIgV2lraUxlcm5pLlwiLFxuICAgIGV4cGxhbmF0aW9uVGl0bGU6IFwiVm91cyBkw6ljb3V2cmV6IFdpa2lMZXJuaSA/XCIsXG4gICAgZXhwbGFuYXRpb25UeHQ6IFwiTGUgcHJpbmNpcGUgZXN0IHNpbXBsZSA6IHZvdXMgY29tbWVuY2V6IHBhciBsaXJlIGwnYXJ0aWNsZSBXaWtpcMOpZGlhIGRvbnQgbGUgbGllbiB2b3VzIGVzdCBwcm9wb3PDqS48YnI+UHVpcyB2b3VzIGFmZmljaGVyIGxlIHF1aXogcG91ciB2w6lyaWZpZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUgZGUgdm90cmUgbGVjdHVyZS4gVm91cyBvYnRlbmV6IGFsb3JzIHZvdHJlIHLDqXN1bHRhdCBpbW3DqWRpYXRlbWVudC48YnI+PGJyPlRvdXRlcyBsZXMgcsOpcG9uc2VzIHNlIHRyb3V2ZW50IGRhbnMgbCdhcnRpY2xlIHByb3Bvc8OpIMOgIGxhIGxlY3R1cmUuIDxiPlZvdXMgw6p0ZXMgaWNpIHBvdXIgYXBwcmVuZHJlIGRlIG5vdXZlbGxlcyBjaG9zZXM8L2I+LCBtYWlzIGxpYnJlIMOgIHZvdXMgZCdlc3NheWVyIGQneSByw6lwb25kcmUgaW1tw6lkaWF0ZW1lbnQuPGJyPjxicj5RdWFuZCBsZSBzdWpldCBzJ3kgcHLDqnRlLCBuZSB2b3VzIMOpdG9ubmV6IHBhcyBzaSBjZXJ0YWluZXMgZGVzIHLDqXBvbnNlcyBwcm9wb3PDqWVzIHBldXZlbnQgw6p0cmUgdW4gcGV1IGTDqWNhbMOpZXMsIGFic3VyZGVzLi4uIE9uIHBldXQgYXBwcmVuZHJlIGF2ZWMgbGUgc291cmlyZSwgbm9uID8gOi0pPGJyPjxicj5VbmUgZm9pcyB2b3RyZSByw6lzdWx0YXQgb2J0ZW51LCBpbCB2b3VzIHNlcmEgcHJvcG9zw6kgZGUgY3LDqWVyIHVuIGNvbXB0ZSBwb3VyIGxlIHNhdXZlZ2FyZGVyLjxicj5DZSBjb21wdGUgdm91cyBwZXJtZXR0cmEgZGUgdGVzdGVyIGRlIG5vdXZlYXUgY2UgcXVpeiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudSBwbHVzaWV1cnMgam91cnMsIHNlbWFpbmVzLCBtb2lzLi4uIEV0IGRlIHJlY2V2b2lyIHLDqWd1bGnDqHJlbWVudCBkZSBub3V2ZWxsZXMgc3VnZ2VzdGlvbnMgZGUgbGVjdHVyZXMuPGJyPjxicj5NYWlzIDxiPmxhIGNyw6lhdGlvbiBkZSBjZSBjb21wdGUgZXN0IGZhY3VsdGF0aXZlPC9iPiBldCA8YSBocmVmPScvcXVpenMvJyB0aXRsZT0nTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzJz52b3VzIHBvdXZleiBwYXJjb3VyaXIgV2lraUxlcm5pIGxpYnJlbWVudDwvYT4uXCIsXG4gICAgbm9KU05vdGlmaWNhdGlvbjogXCJEw6lzb2zDqSwgbWFpcyBwb3VyIGwnaW5zdGFudCwgbCd1dGlsaXNhdGlvbiBkZSBXaWtpTGVybmkgbsOpY2Vzc2l0ZSBsJ2FjdGl2YXRpb24gZHUgSmF2YVNjcmlwdC5cIixcbiAgICB0YWdzTGlzdFR4dDogXCJQYXJjb3VyaXIgbGVzIHJ1YnJpcXVlcyA6XCIsXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBoZWFkTGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJDb250YWN0XCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb250YWN0Lmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJQYXJjb3VyaXJcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL3F1aXpzL1wiLCBpZDpcImluZGV4SGVhZExpbmtcIiwgdGl0bGU6XCJMZXMgZGVybmllcnMgcXVpenNcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIk1vbiBjb21wdGVcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nvbm5leGlvbi5odG1sXCIsIGlkOiBcImFjY291bnRIZWFkTGlua1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiw4AgcHJvcG9zXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9hLXByb3Bvcy5odG1sXCIgfSB9XG4gICAgXSxcbiAgICBmb290TGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJCbG9nXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcImh0dHBzOi8vZnJhbWFzcGhlcmUub3JnL3Blb3BsZS83ZTU0YjdhMGI1MzIwMTM4OWVlZjJhMDAwMDA1MzYyNVwiLCB0aXRsZTpcIkJsb2cgV2lraUxlcm5pIHN1ciBkaWFzcG9yYSpcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkNyw6lkaXRzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jcmVkaXRzLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIk1lbnRpb25zIGzDqWdhbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9tZW50aW9ucy1sZWdhbGVzLmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJEb25uw6llcyBwZXJzb25uZWxsZXNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Rvbm5lZXMuaHRtbFwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQ0dWICYgQ0dVXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9DR1YtQ0dVLmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9XG4gICAgXSxcbiAgICBtYXhRdWVzdGlvbm5haXJlc1NpdGVIb21lUGFnZTogMyxcbiAgICBtYXhRdWVzdGlvbm5haXJlc0J5UGFnZTogOSxcbiAgICBuYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlIDogMyxcbiAgICB1c2VySG9tZVBhZ2UgOiBcImFjY3VlaWwuaHRtbFwiLFxuICAgIGFkbWluSG9tZVBhZ2UgOiBcImFkbWluLmh0bWxcIixcbiAgICBtYW5hZ2VySG9tZVBhZ2UgOiBcImdlc3Rpb24uaHRtbFwiLFxuICAgIHN1YnNjcmliZVBhZ2UgOiBcImluc2NyaXB0aW9uLmh0bWxcIixcbiAgICBjb25uZWN0aW9uUGFnZSA6IFwiY29ubmV4aW9uLmh0bWxcIixcbiAgICB2YWxpZGF0aW9uTGlua1BhZ2UgOiBcInZhbGlkYXRpb24uaHRtbD90PVwiLFxuICAgIGxvZ2luTGlua1BhZ2UgOiBcImxvZ2luLmh0bWw/dD1cIixcbiAgICBuZXdMb2dpbkxpbmtQYWdlIDogXCJuZXdsb2dpbi5odG1sP3Q9XCIsXG4gICAgZGVsZXRlTGlua1BhZ2UgOiBcImF1cmV2b2lyLmh0bWw/dD1cIixcbiAgICBzdG9wTWFpbFBhZ2UgOiBcInN0b3AtbWFpbC5odG1sP3Q9XCIsXG4gICAgYWNjb3VudFBhZ2U6IFwiY29tcHRlLmh0bWxcIixcbiAgICB1cGRhdGVBY2NvdW50UGFnZTogXCJtb24tY29tcHRlLmh0bWxcIixcbiAgICBxdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlOiBcImdlc3Rpb24tcXVpenMuaHRtbFwiLFxuICAgIHVzZXJzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi11dGlsaXNhdGV1cnMuaHRtbFwiLFxuICAgIGFib3V0UGFnZTogXCJhLXByb3Bvcy5odG1sXCIsXG4gICAgaWxsdXN0cmF0aW9uRGlyIDogXCIvaW1nL3F1aXpzL1wiLFxuICAgIHNpdGVTbG9nYW46IFwiQ3VsdGl2b25zIG5vdHJlIGphcmRpbiAhXCIsXG4gICAgaG9tZVBhZ2VUeHQ6IFwiUGFnZSBkJ2FjY3VlaWxcIixcbiAgICBob21lVGl0bGUxOiBcIkRlIG5hdHVyZSBjdXJpZXVzZSA/XCIsXG4gICAgaG9tZVAxOiBcIkF2ZWMgV2lraUxlcm5pLCB2b3VzIGFwcHJlbmV6IGNoYXF1ZSBqb3VyIGRlIG5vdXZlbGxlcyBjaG9zZXMuPGJyPkRlcyBhcnRpY2xlcyBkZSBXaWtpcMOpZGlhIHNvbnQgc8OpbGVjdGlvbm7DqXMgcG91ciB2b3VzIGV0IHNvbnQgc3VpdmlzIGQndW4gcXVpeiB2b3VzIHBlcm1ldHRhbnQgZGUgdGVzdGVyIGNlIHF1ZSB2b3VzIGVuIGF2ZXogcmV0ZW51Ljxicj5EZSBqb3VyIGVuIGpvdXIgZGUgbm91dmVsbGVzIGdyYWluZXMgZGUgc2F2b2lyIHNvbnQgYWluc2kgc2Vtw6llcyBkYW5zIHZvdHJlIFxcXCJqYXJkaW5cXFwiLlwiLFxuICAgIGhvbWVUaXRsZTI6IFwiTGEgY3VsdHVyZSBlbiBsaWJlcnTDqVwiLFxuICAgIGhvbWVQMjogXCJUb3V0IGNvbW1lIHN1ciBXaWtpcMOpZGlhIDxzcGFuIGNsYXNzPSdwb3N0c2NyaXB0dW0nPigqKTwvc3Bhbj4sIGxlIGxvZ2ljaWVsIGV0IGxlIGNvbnRlbnUgcGFydGFnw6kgc3VyIFdpa2lMZXJuaSA8YSBocmVmPVxcXCIvY3JlZGl0cy5odG1sXFxcIiB0aXRsZT1cXFwiRW4gc2F2b2lyIHBsdXNcXFwiPnNvbnQgbGlicmVzPC9hPi48YnI+U3VyIFdpa2lMZXJuaSwgcGFzIGRlIHB1YmxpY2l0w6ksIG5pIGRlIGNvbW1lcmNpYWxpc2F0aW9uIGRlIHZvcyBkb25uw6llcyBwZXJzb25uZWxsZXMuPGJyPlZvdXMgcG91dmV6IHZlbmlyIHkgXFxcImN1bHRpdmVyIHZvdHJlIGphcmRpblxcXCIgZW4gdG91dGUgdHJhbnF1aWxsaXTDqS48YnI+PGJyPjxzcGFuIGNsYXNzPSdwb3N0c2NyaXB0dW0nPigqKSBCaWVuIHF1ZSBwYXJ0YWdlYW50IHNlcyB2YWxldXJzLCBXaWtpTGVybmkgZXN0IHVuIHByb2pldCBpbmTDqXBlbmRhbnQgZGUgbGEgZm9uZGF0aW9uIFdpa2lww6lkaWEuPC9zcGFuPlwiLFxuICAgIGhvbWVCdG5BYm91dFR4dDogXCJFbiBzYXZvaXIgcGx1cyBzdXIgV2lraUxlcm5pID9cIixcbiAgICBob21lQnRuU3Vic2NyaWJlVHh0OiBcIlRlc3RlciBXaWtpTGVybmkgZ3JhdHVpdGVtZW50LlwiLFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzVGl0bGU6IFwiTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzIHN1ciBXaWtpTGVybmlcIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc0ludHJvOiBcIkxpc3RlIGRlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyBzdXIgV2lraUxlcm5pLlwiLFxuICAgIGV4cGxhbmF0aW9uVGl0bGU6IFwiVm91cyBkw6ljb3V2cmV6IFdpa2lMZXJuaSA/XCIsXG4gICAgZXhwbGFuYXRpb25UeHQ6IFwiTGUgcHJpbmNpcGUgZXN0IHNpbXBsZSA6IHZvdXMgY29tbWVuY2V6IHBhciBsaXJlIGwnYXJ0aWNsZSBXaWtpcMOpZGlhIGRvbnQgbGUgbGllbiB2b3VzIGVzdCBwcm9wb3PDqS48YnI+UHVpcyB2b3VzIGFmZmljaGVyIGxlIHF1aXogcG91ciB2w6lyaWZpZXIgY2UgcXVlIHZvdXMgYXZleiByZXRlbnUgZGUgdm90cmUgbGVjdHVyZS4gVm91cyBvYnRlbmV6IGFsb3JzIHZvdHJlIHLDqXN1bHRhdCBpbW3DqWRpYXRlbWVudC48YnI+PGJyPlN1aXZhbnQgbGVzIHF1ZXN0aW9ucywgdW5lIG91IHBsdXNpZXVycyByw6lwb25zZXMgcGV1dmVudCDDqnRyZSBjb3JyZWN0ZXMgZXQgZG9pdmVudCBkb25jIMOqdHJlIGNvY2jDqWVzLiA8Yj5DJ2VzdCB0b3Vqb3VycyBsZSBjb250ZW51IGRlIGwnYXJ0aWNsZSBXaWtpcMOpZGlhIHF1aSBmYWl0IGZvaSBjb25jZXJuYW50IGxlcyBcXFwiYm9ubmVzXFxcIiByw6lwb25zZXM8L2I+LiBNYWlzIGxlcyBhcnRpY2xlcyBkZSBXaWtpcMOpZGlhIHBldXZlbnQgw6l2b2x1ZXIsIGRvbmMgbidow6lzaXRleiBwYXMgPGEgaHJlZj0nL2NvbnRhY3QuaHRtbCc+w6AgbWUgc2lnbmFsZXIgdW5lIGVycmV1cjwvYT4uPGJyPjxicj5Ub3V0ZXMgbGVzIHLDqXBvbnNlcyBzZSB0cm91dmVudCBkYW5zIGwnYXJ0aWNsZSBwcm9wb3PDqSDDoCBsYSBsZWN0dXJlLiA8Yj5Wb3VzIMOqdGVzIGljaSBwb3VyIGFwcHJlbmRyZSBkZSBub3V2ZWxsZXMgY2hvc2VzLCBtYWlzIGxpYnJlIMOgIHZvdXMgZCdlc3NheWVyIGQneSByw6lwb25kcmUgaW1tw6lkaWF0ZW1lbnQ8L2I+Ljxicj48YnI+UXVhbmQgbGUgc3VqZXQgcyd5IHByw6p0ZSwgbmUgdm91cyDDqXRvbm5leiBwYXMgc2kgY2VydGFpbmVzIGRlcyByw6lwb25zZXMgcHJvcG9zw6llcyBwZXV2ZW50IMOqdHJlIHVuIHBldSBkw6ljYWzDqWVzLCBhYnN1cmRlcy4uLiBPbiBwZXV0IGFwcHJlbmRyZSBhdmVjIGxlIHNvdXJpcmUsIG5vbiA/IDotKTxicj48YnI+VW5lIGZvaXMgdm90cmUgcsOpc3VsdGF0IG9idGVudSwgaWwgdm91cyBzZXJhIHByb3Bvc8OpIGRlIGNyw6llciB1biBjb21wdGUgcG91ciBsZSBzYXV2ZWdhcmRlci4gQ2UgY29tcHRlIHZvdXMgcGVybWV0dHJhIGRlIDxiPnRlc3RlciBkZSBub3V2ZWF1IGNlIHF1aXo8L2I+IHBvdXIgdsOpcmlmaWVyIGNlIHF1ZSB2b3VzIGVuIGF2ZXogcmV0ZW51IHBsdXNpZXVycyBqb3Vycywgc2VtYWluZXMsIG1vaXMuLi4gR3LDomNlIMOgIGNlIGNvbXB0ZSwgdm91cyBwb3VycmV6IGF1c3NpIDxiPnJlY2V2b2lyIHLDqWd1bGnDqHJlbWVudCBkZSBub3V2ZWF1eCBxdWl6czwvYj4gcG91ciBjb250aW51ZXIgw6AgXFxcImN1bHRpdmVyIHZvdHJlIGphcmRpblxcXCIuPGJyPjxicj5NYWlzIDxiPmxhIGNyw6lhdGlvbiBkZSBjZSBjb21wdGUgZXN0IGZhY3VsdGF0aXZlPC9iPiBldCA8YSBocmVmPScvcXVpenMvJyB0aXRsZT0nTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzJz52b3VzIHBvdXZleiBwYXJjb3VyaXIgV2lraUxlcm5pIGxpYnJlbWVudDwvYT4uXCIsXG4gICAgbm9KU05vdGlmaWNhdGlvbjogXCJEw6lzb2zDqSwgbWFpcyBwb3VyIGwnaW5zdGFudCwgbCd1dGlsaXNhdGlvbiBkZSBXaWtpTGVybmkgbsOpY2Vzc2l0ZSBsJ2FjdGl2YXRpb24gZHUgSmF2YVNjcmlwdC5cIixcbiAgICBuZXdzTGlzdFRpdGxlOiBcIkxlcyBkZXJuacOocmVzIGdyYWluZXMgZGUgc2F2b2lyXCIsXG4gICAgdGFnc0xpc3RUeHQ6IFwiUGFyY291cmlyIGxlcyBydWJyaXF1ZXNcIixcbiAgICBtYWlsUmVjaXBpZW50VHh0OiBcIk1lc3NhZ2UgZW52b3nDqSDDoCA6XCIsXG59OyIsIi8vIC0tIEdFU1RJT04gRFUgRk9STVVMQUlSRSBQRVJNRVRUQU5UIERFIFNBSVNJUiAvIMOJRElURVIgTEVTIFFVSVpTIEVUIExFVVJTIETDiVBFTkRBTkNFUyAoTElFTlMsIElNQUdFUywgVEFHUywgRVRDLilcblxuLy8vIFbDqXJpZmllIHF1ZSBsJ3V0aWxpc2F0ZXVyIGVzdCBiaWVuIGNvbm5lY3TDqSwgYSBsZSBib24gc3RhdHV0IGV0IGxlIHJlZGlyaWdlIHZlcnMgbGUgZm9ybXVsYWlyZSBkJ2luc2NyaXB0aW9uIHNpIGNlIG4nZXN0IHBhcyBsZSBjYXMuXG4vLy8gU2kgYydlc3Qgb2ssIHByb3Bvc2UgdW4gbW90ZXVyIGRlIHJlY2hlcmNoZSBwZXJtZXR0YW50IGRlIGNoZXJjaGVyIHVuIHF1aXpcbi8vLyBTaSB1biBpZCBlc3QgcGFzc8OpIHBhciBsJ3VybCBvbiBhZmZpY2hlIGxlcyBpbmZvcm1hdGlvbnMgZHUgcXVpeiBkYW5zIHVuIGZvcm11bGFpcmUgcGVybWV0dGFudCBkZSBsJ8OpZGl0ZXIvc3VwcHJpbWVyIGF2ZWMgdW5lIGxpc3RlIGRlcyDDqWzDqW1lbnRzIGxpw6lzIChsaWVucywgaWxsdXN0cmF0aW9ucywgcXVlc3Rpb25zLi4uKSBwb3V2YW50IGV1eC1tw6ptZXMgw6p0cmUgw6lkaXTDqXMvc3VwcHJpbcOpcy5cbi8vLyBTaSBsZSBub21icmUgbWF4IGNvbmZpZ3Vyw6kgcG91ciBjaGFjdW4gZGUgc2VzIMOpbMOpbWVudHMgbidlc3QgcGFzIGF0dGVpbnQsIGlsIGVzdCBhdXNzaSBwcm9wb3PDqSBkJ2Fqb3V0ZXIgdW4gbm91dmVsIMOpbMOpbWVudC5cbi8vLyBTaW5vbiBwYXMgZCdpZCBwYXNzw6kgcGFyIGwndXJsLCBvbiBhZmZpY2hlIHVuIGZvcm11bGFpcmUgdmlkZSBwZXJtZXR0YW50IGQnZW4gc2Fpc2lyIHVuIG5vdXZlYXUgYXZlYyBzZXMgdGFncy5cblxuLy8gRmljaGllciBkZSBjb25maWd1cmF0aW9uIGPDtHTDqSBjbGllbnQgOlxuaW1wb3J0IHsgYXBpVXJsLCBhdmFpbGFibGVMYW5ncywgdGhlbWUgfSBmcm9tIFwiLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCI7XG5jb25zdCBsYW5nPWF2YWlsYWJsZUxhbmdzWzBdO1xuY29uc3QgY29uZmlnRnJvbnRFbmQgPSByZXF1aXJlKFwiLi4vLi4vdmlld3MvXCIrdGhlbWUrXCIvY29uZmlnL1wiK2xhbmcrXCIuanNcIik7XG5cbi8vIEZvbmN0aW9ucyB1dGlsZXMgYXUgc2NyaXB0IDogISEgcmV2b2lyIHF1YW5kIGxlIHJlc3RlIHNlcmEgZmluaSBwb3VyIHbDqXJpZmllciBzaSB0b3V0IGVzdCB1dGlsZVxuaW1wb3J0IHsgZ2V0TG9jYWx5LCByZW1vdmVMb2NhbHksIHNhdmVMb2NhbHkgfSBmcm9tIFwiLi90b29scy9jbGllbnRzdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyBhZGRFbGVtZW50IH0gZnJvbSBcIi4vdG9vbHMvZG9tLmpzXCI7XG5pbXBvcnQgeyBoZWxsb0RldiwgdXBkYXRlQWNjb3VudExpbmsgfSBmcm9tIFwiLi90b29scy9ldmVyeXdoZXJlLmpzXCI7XG5pbXBvcnQgeyBlbXB5QW5kSGlkZUZvcm0sIGVtcHlGb3JtLCBnZXREYXRhc0Zyb21JbnB1dHMsIHNldEF0dHJpYnV0ZXNUb0lucHV0cyB9IGZyb20gXCIuL3Rvb2xzL2Zvcm1zLmpzXCI7XG5pbXBvcnQgeyBkYXRlRm9ybWF0LCBpc0VtcHR5LCByZXBsYWNlQWxsIH0gZnJvbSBcIi4uLy4uL3Rvb2xzL21haW5cIjtcbmltcG9ydCB7IGdldFVybFBhcmFtcyB9IGZyb20gXCIuL3Rvb2xzL3VybC5qc1wiO1xuaW1wb3J0IHsgY2hlY2tTZXNzaW9uLCBnZXRDb25maWcgfSBmcm9tIFwiLi90b29scy91c2Vycy5qc1wiO1xuXG4vLyBEaWN0aW9ubmFpcmVzIDpcbmNvbnN0IHR4dCA9IHJlcXVpcmUoXCIuLi8uLi9sYW5nL1wiK2xhbmcrXCIvZ2VuZXJhbFwiKTtcbmNvbnN0IHR4dFVzZXJzID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi91c2VyXCIpO1xuY29uc3QgdHh0UXVlc3Rpb25uYWlyZSA9IHJlcXVpcmUoXCIuLi8uLi9sYW5nL1wiK2xhbmcrXCIvcXVlc3Rpb25uYWlyZVwiKTtcbmNvbnN0IHR4dFF1ZXN0aW9uID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi9xdWVzdGlvblwiKTtcbmNvbnN0IHR4dExpbmsgPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL2xpbmtcIik7XG5jb25zdCB0eHRJbGx1c3RyYXRpb24gPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL2lsbHVzdHJhdGlvblwiKTtcblxuaGVsbG9EZXYoKTtcblxuLy8gUHJpbmNpcGF1eCDDqWzDqW1lbnRzIGR1IERPTSBtYW5pcHVsw6lzIDpcbmNvbnN0IGRpdk1haW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1haW4tY29udGVudFwiKTtcbmNvbnN0IGRpdk1lc3NhZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1lc3NhZ2VcIik7XG5jb25zdCBkaXZSZXNwb25zZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicmVzcG9uc2VcIik7XG5jb25zdCBmb3JtUXVlc3Rpb25uYWlyZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicXVlc3Rpb25uYWlyZXNcIik7XG5jb25zdCBpbnB1dENsYXNzaWZpY2F0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjbGFzc2lmaWNhdGlvblwiKTtcbmNvbnN0IGhlbHBDbGFzc2lmaWNhdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaGVscENsYXNzaWZpY2F0aW9uXCIpO1xuY29uc3QgaGVscFB1Ymxpc2hpbmdBdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaGVscFB1Ymxpc2hpbmdBdFwiKTtcbmNvbnN0IGRlbGV0ZUNoZWNrQm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJkZWxldGVPa0xhYmVsXCIpO1xuY29uc3QgYnRuTmV3UXVlc3Rpb25uYWlyZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwid2FudE5ld1F1ZXN0aW9ubmFpcmVcIik7XG5jb25zdCBidG5QcmV2aWV3UXVlc3Rpb25uYWlyZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicHJldmlld1F1ZXN0aW9ubmFpcmVcIik7XG5cbmNvbnN0IGRpdlF1ZXN0aW9ubmFpcmVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJxdWVzdGlvbm5haXJlc0xpc3RcIik7XG5cbmNvbnN0IGZvcm1TZWFyY2ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInNlYXJjaFwiKTtcbmNvbnN0IGRpdlNlYXJjaFJlc3VsdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic2VhcmNoUmVzdWx0XCIpO1xuXG5jb25zdCBmb3JtTGluayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibGlua3NcIik7XG5jb25zdCBmb3JtSWxsdXN0cmF0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJpbGx1c3RyYXRpb25zXCIpO1xuY29uc3QgZm9ybVF1ZXN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJxdWVzdGlvbnNcIik7XG5jb25zdCBkaXZMaW5rcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibGlua3NMaXN0XCIpO1xuY29uc3QgZGl2SWxsdXN0cmF0aW9ucyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaWxsdXN0cmF0aW9uc0xpc3RcIik7XG5jb25zdCBkaXZRdWVzdGlvbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInF1ZXN0aW9uc0xpc3RcIik7XG5cbmNvbnN0IGluaXRpYWxpc2UgPSBhc3luYyAoKSA9Plxue1xuICAgIHRyeVxuICAgIHsgICAgICAgIFxuICAgICAgICBjb25zdCBjb25maWcgPSBhd2FpdCBnZXRDb25maWcoKTtcbiAgICAgICAgaWYoIWNvbmZpZylcbiAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2TWVzc2FnZSwgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IGlzQ29ubmVjdGVkPWF3YWl0IGNoZWNrU2Vzc2lvbihbXCJtYW5hZ2VyXCIsIFwiYWRtaW5cIl0sIFwiL1wiK2NvbmZpZ0Zyb250RW5kLmNvbm5lY3Rpb25QYWdlLCB7IG1lc3NhZ2U6IHR4dFVzZXJzLm5lZWRCZUNvbm5lY3RlZCwgY29sb3I6XCJlcnJvclwiIH0sIHdpbmRvdy5sb2NhdGlvbik7XG4gICAgICAgICAgICBpZihpc0Nvbm5lY3RlZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkaXZNYWluLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgICAgICAgICAgICAgIGlmKCFpc0VtcHR5KGdldExvY2FseShcIm1lc3NhZ2VcIikpKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZNZXNzYWdlLCBcInBcIiwgZ2V0TG9jYWx5KFwibWVzc2FnZVwiLCB0cnVlKS5tZXNzYWdlLCBcIlwiLCBbZ2V0TG9jYWx5KFwibWVzc2FnZVwiLCB0cnVlKS5jb2xvcl0sIFwiXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwibWVzc2FnZVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgdXNlcj1nZXRMb2NhbHkoXCJ1c2VyXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgIHVwZGF0ZUFjY291bnRMaW5rKHVzZXIuc3RhdHVzLCBjb25maWdGcm9udEVuZCk7XG5cbiAgICAgICAgICAgICAgICAvLyBJbml0aWFsaXNhdGlvbiBkdSBmb3JtdWxhaXJlIGRlIHJlY2hlcmNoZSA6XG4gICAgICAgICAgICAgICAgc2V0QXR0cmlidXRlc1RvSW5wdXRzKGNvbmZpZywgZm9ybVNlYXJjaCk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gSW5pdGlhbGlzZSBsZSBmb3JtdWxhaXJlIHBlcm1ldHRhbnQgZGUgbWV0dHJlIMOgIGpvdXIgbGVzIGluZm9zIGRlIGJhc2UgZHUgcXVlc3Rpb25uYWlyZSA6XG4gICAgICAgICAgICAgICAgc2V0QXR0cmlidXRlc1RvSW5wdXRzKGNvbmZpZy5RdWVzdGlvbm5haXJlLCBmb3JtUXVlc3Rpb25uYWlyZSk7XG4gICAgICAgICAgICAgICAgLy8gQ2FzZSBkZSBzdXBwcmVzc2lvbiBjYWNow6llIHBhciBkw6lmYXV0LCBjYXIgaW51dGlsZSBwb3VyIGZvcm11bGFpcmUgZGUgY3LDqWF0aW9uXG4gICAgICAgICAgICAgICAgZGVsZXRlQ2hlY2tCb3guc3R5bGUuZGlzcGxheT1cIm5vbmVcIjtcblxuICAgICAgICAgICAgICAgIC8vIEZvbmN0aW9uIHZpZGFudCBldCBjYWNoYW50IHRvdXMgbGVzIGZvcm11bGFpcmVzIGFubmV4ZXNcbiAgICAgICAgICAgICAgICBjb25zdCBoaWRlQWxsRm9ybXMgPSAoKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZW1weUFuZEhpZGVGb3JtKGZvcm1MaW5rKTtcbiAgICAgICAgICAgICAgICAgICAgaWYodHh0TGluay5kZWZhdWx0VmFsdWUhPTApXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFuY2hvclwiKS52YWx1ZT10eHRMaW5rLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgZW1weUFuZEhpZGVGb3JtKGZvcm1JbGx1c3RyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBlbXB5QW5kSGlkZUZvcm0oZm9ybVF1ZXN0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGlkZUFsbEZvcm1zKCk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQWZmaWNoZSBsZXMgaW5mb3MgY29ubnVlcyBjb25jZXJuYW50IGxlcyBsaWVuc1xuICAgICAgICAgICAgICAgIGNvbnN0IHNob3dMaW5rSW5mb3MgPSAoTGlua3MpID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdkxpbmtzLCBcImg0XCIsIHR4dExpbmsuaW50cm9UaXRsZSk7Ly8gcmVtcGxhY2UgbCdleGlzdGFudCBkYW5zIGRpdkxpbmtzXG4gICAgICAgICAgICAgICAgICAgIGxldCBsaXN0TGlua3M9XCJcIjtcbiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpIGluIExpbmtzKVxuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdExpbmtzKz1cIjxsaT48YSBocmVmPSdcIitMaW5rc1tpXS51cmwrXCInIHRhcmdldD0nX2JsYW5rJz5cIitMaW5rc1tpXS5hbmNob3IrXCI8L2E+IHwgPGEgaHJlZj0nI3VwZGF0ZUxpbmtcIitMaW5rc1tpXS5pZCtcIicgaWQ9JyN1cGRhdGVMaW5rXCIrTGlua3NbaV0uaWQrXCInID5cIit0eHQudXBkYXRlQnRuVHh0K1wiPC9hPiB8IDxhIGhyZWY9JyNkZWxldGVMaW5rXCIrTGlua3NbaV0uaWQrXCInIGlkPScjZGVsZXRlTGlua1wiK0xpbmtzW2ldLmlkK1wiJyA+XCIrdHh0LmRlbGV0ZUJ0blR4dCtcIjwvYT48L2xpPlwiO1xuICAgICAgICAgICAgICAgICAgICBpZihsaXN0TGlua3M9PT1cIlwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdExpbmtzPVwiPGxpPlwiK3R4dExpbmsuaW50cm9Ob0xpbmsrXCI8L2xpPlwiO1xuICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdkxpbmtzLCBcInVsXCIsIGxpc3RMaW5rcywgXCJcIiwgW1wiaW5mb3JtYXRpb25cIl0sIFwiXCIsIGZhbHNlKTsvLyDDoCBpbnTDqWdyZXIgZGFucyBsZSBET00gcG91ciBwb3V2b2lyIGFqb3V0ZXIgZGVzIGFkZEV2ZW50TGlzdGVuZXIgZW5zdWl0ZVxuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gTGlua3MpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiI3VwZGF0ZUxpbmtcIitMaW5rc1tpXS5pZCkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dGb3JtTGlua0luZm9zKExpbmtzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKFwiI2xpbmtzXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIiNkZWxldGVMaW5rXCIrTGlua3NbaV0uaWQpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbihlKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93Rm9ybUxpbmtJbmZvcyhMaW5rc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUxpbmsuZWxlbWVudHNbXCJkZWxldGVPa1wiXS52YWx1ZT10cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRMaW5rRm9ybSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYoY29uZmlnLm5iTGlua3NNYXggPiBMaW5rcy5sZW5ndGggfHwgY29uZmlnLm5iTGlua3NNYXg9PT0wKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihMaW5rcy5sZW5ndGggPCBjb25maWcubmJMaW5rc01pbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdkxpbmtzLCBcImFcIiwgdHh0LmFkZEJ0blR4dCwgXCIjbmV3TGlua1wiLCBbXCJlcnJvclwiXSwgeyBocmVmOlwiI25ld0xpbmtcIiB9LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZMaW5rcywgXCJhXCIsIHR4dC5hZGRCdG5UeHQsIFwiI25ld0xpbmtcIiwgW1wiaW5mb3JtYXRpb25cIl0sIHsgaHJlZjpcIiNuZXdMaW5rXCIgfSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCIjbmV3TGlua1wiKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZUFsbEZvcm1zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUxpbmsuc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUxpbmsuZWxlbWVudHNbXCJRdWVzdGlvbm5haXJlSWRcIl0udmFsdWU9Zm9ybVF1ZXN0aW9ubmFpcmUuZWxlbWVudHNbXCJpZFwiXS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKFwiI2xpbmtzXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEF0dHJpYnV0ZXNUb0lucHV0cyhjb25maWcuTGluaywgZm9ybUxpbmspO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQWZmaWNoZSBsZXMgaW5mb3MgY29ubnVlcyBjb25jZXJuYW50IGxlcyBpbGx1c3RyYXRpb25zXG4gICAgICAgICAgICAgICAgY29uc3Qgc2hvd0lsbHVzdHJhdGlvbkluZm9zID0gKElsbHVzdHJhdGlvbnMpID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdklsbHVzdHJhdGlvbnMsIFwiaDRcIiwgdHh0SWxsdXN0cmF0aW9uLmludHJvVGl0bGUpOy8vIHJlbXBsYWNlIGwnZXhpc3RhbnQgZGFucyBkaXZJbGx1c3RyYXRpb25zXG4gICAgICAgICAgICAgICAgICAgIGxldCBsaXN0SWxsdXN0cmF0aW9ucz1cIlwiO1xuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gSWxsdXN0cmF0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RJbGx1c3RyYXRpb25zKz1cIjxsaT48YSBocmVmPSdcIitjb25maWdGcm9udEVuZC5pbGx1c3RyYXRpb25EaXIrSWxsdXN0cmF0aW9uc1tpXS51cmwrXCInIHRhcmdldD0nX2JsYW5rJz48aW1nIHNyYz0nXCIrY29uZmlnRnJvbnRFbmQuaWxsdXN0cmF0aW9uRGlyK0lsbHVzdHJhdGlvbnNbaV0udXJsK1wiJyBhbHQ9J1wiK3R4dElsbHVzdHJhdGlvbi5kZWZhdWx0QWx0K1wiJyBzdHlsZT0nbWF4LWhlaWdodDoxNTBweCc+PC9hPiB8IDxhIGhyZWY9JyN1cGRhdGVJbGx1c3RyYXRpb25cIitJbGx1c3RyYXRpb25zW2ldLmlkK1wiJyBpZD0nI3VwZGF0ZUlsbHVzdHJhdGlvblwiK0lsbHVzdHJhdGlvbnNbaV0uaWQrXCInID5cIit0eHQudXBkYXRlQnRuVHh0K1wiPC9hPiB8IDxhIGhyZWY9JyNkZWxldGVJbGx1c3RyYXRpb25cIitJbGx1c3RyYXRpb25zW2ldLmlkK1wiJyBpZD0nI2RlbGV0ZUlsbHVzdHJhdGlvblwiK0lsbHVzdHJhdGlvbnNbaV0uaWQrXCInID5cIit0eHQuZGVsZXRlQnRuVHh0K1wiPC9hPjwvbGk+XCI7XG4gICAgICAgICAgICAgICAgICAgIGlmKGxpc3RJbGx1c3RyYXRpb25zPT09XCJcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RJbGx1c3RyYXRpb25zPVwiPGxpPlwiK3R4dElsbHVzdHJhdGlvbi5pbnRyb05vSWxsdXN0cmF0aW9uK1wiPC9saT5cIjtcbiAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZJbGx1c3RyYXRpb25zLCBcInVsXCIsIGxpc3RJbGx1c3RyYXRpb25zLCBcIlwiLCBbXCJpbmZvcm1hdGlvblwiXSwgXCJcIiwgZmFsc2UpOy8vIMOgIGludMOpZ3JlciBkYW5zIGxlIERPTSBwb3VyIHBvdXZvaXIgYWpvdXRlciBkZXMgYWRkRXZlbnRMaXN0ZW5lciBlbnN1aXRlXG4gICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiBJbGx1c3RyYXRpb25zKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIiN1cGRhdGVJbGx1c3RyYXRpb25cIitJbGx1c3RyYXRpb25zW2ldLmlkKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0Zvcm1JbGx1c3RyYXRpb25JbmZvcyhJbGx1c3RyYXRpb25zW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKFwiI2lsbHVzdHJhdGlvbnNcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiI2RlbGV0ZUlsbHVzdHJhdGlvblwiK0lsbHVzdHJhdGlvbnNbaV0uaWQpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbihlKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93Rm9ybUlsbHVzdHJhdGlvbkluZm9zKElsbHVzdHJhdGlvbnNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1JbGx1c3RyYXRpb24uZWxlbWVudHNbXCJkZWxldGVPa1wiXS52YWx1ZT10cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRJbGx1c3RyYXRpb25Gb3JtKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZihjb25maWcubmJJbGx1c3RyYXRpb25zTWF4ID4gSWxsdXN0cmF0aW9ucy5sZW5ndGggfHwgY29uZmlnLm5iSWxsdXN0cmF0aW9uc01heD09PTApXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgaWYoSWxsdXN0cmF0aW9ucy5sZW5ndGggPCBjb25maWcubmJJbGx1c3RyYXRpb25zTWluKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2SWxsdXN0cmF0aW9ucywgXCJhXCIsIHR4dC5hZGRCdG5UeHQsIFwiI25ld0lsbHVzdHJhdGlvblwiLCBbXCJlcnJvclwiXSwgeyBocmVmOlwiI25ld0lsbHVzdHJhdGlvblwiIH0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdklsbHVzdHJhdGlvbnMsIFwiYVwiLCB0eHQuYWRkQnRuVHh0LCBcIiNuZXdJbGx1c3RyYXRpb25cIiwgW1wiaW5mb3JtYXRpb25cIl0sIHsgaHJlZjpcIiNuZXdJbGx1c3RyYXRpb25cIiB9LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIiNuZXdJbGx1c3RyYXRpb25cIikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGVBbGxGb3JtcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1JbGx1c3RyYXRpb24uc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUlsbHVzdHJhdGlvbi5lbGVtZW50c1tcIlF1ZXN0aW9ubmFpcmVJZFwiXS52YWx1ZT1mb3JtUXVlc3Rpb25uYWlyZS5lbGVtZW50c1tcImlkXCJdLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIjaWxsdXN0cmF0aW9uc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBdHRyaWJ1dGVzVG9JbnB1dHMoY29uZmlnLklsbHVzdHJhdGlvbiwgZm9ybUlsbHVzdHJhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBBZmZpY2hlIGxlcyBpbmZvcyBjb25udWVzIGNvbmNlcm5hbnQgbGVzIHF1ZXN0aW9uc1xuICAgICAgICAgICAgICAgIGNvbnN0IHNob3dRdWVzdGlvbkluZm9zID0gKFF1ZXN0aW9ucykgPT5cbiAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZRdWVzdGlvbnMsIFwiaDRcIiwgdHh0UXVlc3Rpb24uaW50cm9UaXRsZSk7Ly8gcmVtcGxhY2UgbCdleGlzdGFudCBkYW5zIGRpdlF1ZXN0aW9uc1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGlzdFF1ZXN0aW9ucz1cIlwiO1xuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gUXVlc3Rpb25zKVxuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFF1ZXN0aW9ucys9XCI8bGk+XCIrUXVlc3Rpb25zW2ldLlF1ZXN0aW9uLnJhbmsrXCIgLSBcIitRdWVzdGlvbnNbaV0uUXVlc3Rpb24udGV4dCtcIiB8IDxhIGhyZWY9JyN1cGRhdGVRdWVzdGlvblwiK1F1ZXN0aW9uc1tpXS5RdWVzdGlvbi5pZCtcIicgaWQ9JyN1cGRhdGVRdWVzdGlvblwiK1F1ZXN0aW9uc1tpXS5RdWVzdGlvbi5pZCtcIicgPlwiK3R4dC51cGRhdGVCdG5UeHQrXCI8L2E+IHwgPGEgaHJlZj0nI2RlbGV0ZVF1ZXN0aW9uXCIrUXVlc3Rpb25zW2ldLlF1ZXN0aW9uLmlkK1wiJyBpZD0nI2RlbGV0ZVF1ZXN0aW9uXCIrUXVlc3Rpb25zW2ldLlF1ZXN0aW9uLmlkK1wiJyA+XCIrdHh0LmRlbGV0ZUJ0blR4dCtcIjwvYT48L2xpPlwiO1xuICAgICAgICAgICAgICAgICAgICBpZihsaXN0UXVlc3Rpb25zPT09XCJcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RRdWVzdGlvbnM9XCI8bGk+XCIrdHh0UXVlc3Rpb24uaW50cm9Ob1F1ZXN0aW9uK1wiPC9saT5cIjtcbiAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZRdWVzdGlvbnMsIFwidWxcIiwgbGlzdFF1ZXN0aW9ucywgXCJcIiwgW1wiaW5mb3JtYXRpb25cIl0sIFwiXCIsIGZhbHNlKTsvLyDDoCBpbnTDqWdyZXIgZGFucyBsZSBET00gcG91ciBwb3V2b2lyIGFqb3V0ZXIgZGVzIGFkZEV2ZW50TGlzdGVuZXIgZW5zdWl0ZVxuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gUXVlc3Rpb25zKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIiN1cGRhdGVRdWVzdGlvblwiK1F1ZXN0aW9uc1tpXS5RdWVzdGlvbi5pZCkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dGb3JtUXVlc3Rpb25JbmZvcyhRdWVzdGlvbnNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIjbGlua3NcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiI2RlbGV0ZVF1ZXN0aW9uXCIrUXVlc3Rpb25zW2ldLlF1ZXN0aW9uLmlkKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0Zvcm1RdWVzdGlvbkluZm9zKFF1ZXN0aW9uc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVF1ZXN0aW9uLmVsZW1lbnRzW1wiZGVsZXRlT2tcIl0udmFsdWU9dHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kUXVlc3Rpb25Gb3JtKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYoY29uZmlnLm5iUXVlc3Rpb25zTWF4ID4gUXVlc3Rpb25zLmxlbmd0aCB8fCBjb25maWcubmJRdWVzdGlvbnNNYXg9PT0wKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgIGlmKFF1ZXN0aW9ucy5sZW5ndGggPCBjb25maWcubmJRdWVzdGlvbnNNaW4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZRdWVzdGlvbnMsIFwiYVwiLCB0eHQuYWRkQnRuVHh0LCBcIiNuZXdRdWVzdGlvblwiLCBbXCJlcnJvclwiXSwgeyBocmVmOlwiI25ld1F1ZXN0aW9uXCIgfSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UXVlc3Rpb25zLCBcImFcIiwgdHh0LmFkZEJ0blR4dCwgXCIjbmV3UXVlc3Rpb25cIiwgW1wiaW5mb3JtYXRpb25cIl0sIHsgaHJlZjpcIiNuZXdRdWVzdGlvblwiIH0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiI25ld1F1ZXN0aW9uXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbihlKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRlQWxsRm9ybXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtUXVlc3Rpb24uc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVF1ZXN0aW9uLmVsZW1lbnRzW1wiUXVlc3Rpb25uYWlyZUlkXCJdLnZhbHVlPWZvcm1RdWVzdGlvbm5haXJlLmVsZW1lbnRzW1wiaWRcIl0udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVF1ZXN0aW9uLmVsZW1lbnRzW1wicmFua1wiXS52YWx1ZT0oUXVlc3Rpb25zLmxlbmd0aD09PTApID8gY29uZmlnLlF1ZXN0aW9uLnJhbmsuZGVmYXVsdFZhbHVlIDogUXVlc3Rpb25zLmxlbmd0aCsxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIjcXVlc3Rpb25zXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEF0dHJpYnV0ZXNUb0lucHV0cyhjb25maWcuUXVlc3Rpb24sIGZvcm1RdWVzdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEZvbmN0aW9uIGFmZmljaGFudCBsZXMgaW5mb3MgZCd1biBsaWVuIGRhbnMgbGUgZm9ybXVsYWlyZSBhZGhvY1xuICAgICAgICAgICAgICAgIGNvbnN0IHNob3dGb3JtTGlua0luZm9zID0gKExpbmspID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvLyBvbiBjb21tZW5jZSBwYXIgY2FjaGVyIGV0IHZpZGVyIHRvdXMgbGVzIGZvcm11bGFpcmVzIGFubmV4ZXNcbiAgICAgICAgICAgICAgICAgICAgaGlkZUFsbEZvcm1zKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHB1aXMgb24gYWZmaWNoZSBjZWx1aSBkb250IGwnaWQgZXN0IHBhc3PDqSBhdmVjIHNlcyBkb25uw6llcyBjb25udWVzXG4gICAgICAgICAgICAgICAgICAgIGZvcm1MaW5rLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGRhdGEgaW4gTGluaylcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoZm9ybUxpbmsuZWxlbWVudHNbZGF0YV0hPT11bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUxpbmsuZWxlbWVudHNbZGF0YV0udmFsdWU9TGlua1tkYXRhXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyArIGxlcyBjb250cmFpbnRlcyBkZSBjaGFtcCA6XG4gICAgICAgICAgICAgICAgICAgIHNldEF0dHJpYnV0ZXNUb0lucHV0cyhjb25maWcuTGluaywgZm9ybUxpbmspO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBGb25jdGlvbiBhZmZpY2hhbnQgbGVzIGluZm9zIGQndW5lIGlsbHVzdHJhdGlvbiBkYW5zIGxlIGZvcm11bGFpcmUgYWRob2NcbiAgICAgICAgICAgICAgICBjb25zdCBzaG93Rm9ybUlsbHVzdHJhdGlvbkluZm9zID0gKElsbHVzdHJhdGlvbikgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG9uIGNvbW1lbmNlIHBhciBjYWNoZXIgZXQgdmlkZXIgdG91cyBsZXMgZm9ybXVsYWlyZXMgYW5uZXhlc1xuICAgICAgICAgICAgICAgICAgICBoaWRlQWxsRm9ybXMoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gcHVpcyBvbiBhZmZpY2hlIGNlbHVpIGRvbnQgbCdpZCBlc3QgcGFzc8OpIGF2ZWMgc2VzIGRvbm7DqWVzIGNvbm51ZXNcbiAgICAgICAgICAgICAgICAgICAgZm9ybUlsbHVzdHJhdGlvbi5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIjtcbiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBkYXRhIGluIElsbHVzdHJhdGlvbilcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoZm9ybUlsbHVzdHJhdGlvbi5lbGVtZW50c1tkYXRhXSE9PXVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtSWxsdXN0cmF0aW9uLmVsZW1lbnRzW2RhdGFdLnZhbHVlPUlsbHVzdHJhdGlvbltkYXRhXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyArIGxlcyBjb250cmFpbnRlcyBkZSBjaGFtcCA6XG4gICAgICAgICAgICAgICAgICAgIHNldEF0dHJpYnV0ZXNUb0lucHV0cyhjb25maWcuSWxsdXN0cmF0aW9uLCBmb3JtSWxsdXN0cmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2F1ZiBsZSBjaGFtcCBmaWxlIHF1aSBuJ2VzdCBwbHVzIHJlcXVpcyBxdWFuZCB1biBmaWNoaWVyIGV4aXN0ZSBkw6lqw6AgIVxuICAgICAgICAgICAgICAgICAgICBmb3JtSWxsdXN0cmF0aW9uLmVsZW1lbnRzW1wiaW1hZ2VcIl0ucmVtb3ZlQXR0cmlidXRlKFwicmVxdWlyZWRcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEZvbmN0aW9uIGFmZmljaGFudCBsZXMgaW5mb3MgZCd1bmUgcXVlc3Rpb24gKyBzZXMgcsOpcG9uc2VzIHBvc3NpYmxlcyBkYW5zIGxlIGZvcm11bGFpcmUgYWRob2NcbiAgICAgICAgICAgICAgICBjb25zdCBzaG93Rm9ybVF1ZXN0aW9uSW5mb3MgPSAoUXVlc3Rpb24pID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvLyBvbiBjb21tZW5jZSBwYXIgY2FjaGVyIGV0IHZpZGVyIHRvdXMgbGVzIGZvcm11bGFpcmVzIGFubmV4ZXNcbiAgICAgICAgICAgICAgICAgICAgaGlkZUFsbEZvcm1zKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHB1aXMgb24gYWZmaWNoZSBjZWx1aSBkb250IGwnaWQgZXN0IHBhc3PDqSBhdmVjIHNlcyBkb25uw6llcyBjb25udWVzXG4gICAgICAgICAgICAgICAgICAgIGZvcm1RdWVzdGlvbi5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIjtcbiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBkYXRhIGluIFF1ZXN0aW9uLlF1ZXN0aW9uKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihmb3JtUXVlc3Rpb24uZWxlbWVudHNbZGF0YV0hPT11bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVF1ZXN0aW9uLmVsZW1lbnRzW2RhdGFdLnZhbHVlPVF1ZXN0aW9uLlF1ZXN0aW9uW2RhdGFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZvcihsZXQgZGF0YSBpbiBRdWVzdGlvbi5DaG9pY2VzKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihmb3JtUXVlc3Rpb24uZWxlbWVudHNbXCJjaG9pY2VUZXh0XCIrZGF0YV0hPT11bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVF1ZXN0aW9uLmVsZW1lbnRzW1wiY2hvaWNlVGV4dFwiK2RhdGFdLnZhbHVlPVF1ZXN0aW9uLkNob2ljZXNbZGF0YV0udGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihRdWVzdGlvbi5DaG9pY2VzW2RhdGFdLmlzQ29ycmVjdD09dHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVF1ZXN0aW9uLmVsZW1lbnRzW1wiY2hvaWNlSXNDb3JyZWN0XCIrZGF0YV0uY2hlY2tlZD10cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1RdWVzdGlvbi5lbGVtZW50c1tcImlkQ2hvaWNlXCIrZGF0YV0udmFsdWU9UXVlc3Rpb24uQ2hvaWNlc1tkYXRhXS5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gKyBsZXMgY29udHJhaW50ZXMgZGUgY2hhbXAgOlxuICAgICAgICAgICAgICAgICAgICBzZXRBdHRyaWJ1dGVzVG9JbnB1dHMoY29uZmlnLlF1ZXN0aW9uLCBmb3JtUXVlc3Rpb24pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEZvbmN0aW9uIGFmZmljaGFudCBsZXMgaW5mb3MgY29ubnVlcyBjb25jZXJuYW50IHVuIHF1ZXN0aW9ubmFpcmUgZXQgc2VzIGTDqXBlbmRhbmNlc1xuICAgICAgICAgICAgICAgIGNvbnN0IHNob3dGb3JtUXVlc3Rpb25uYWlyZUluZm9zID0gKGlkKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeGhyR2V0SW5mb3MgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyR2V0SW5mb3Mub3BlbihcIkdFVFwiLCBhcGlVcmwrY29uZmlnLnF1ZXN0aW9ubmFpcmVSb3V0ZXMrY29uZmlnLmdldFF1ZXN0aW9ubmFpcmVSb3V0ZXMrXCIvXCIraWQpO1xuICAgICAgICAgICAgICAgICAgICB4aHJHZXRJbmZvcy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDAgJiYgcmVzcG9uc2UuUXVlc3Rpb25uYWlyZSAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtUXVlc3Rpb25uYWlyZS5yZXNldCgpOy8vIHBvdXIgbmUgcGFzIGdhcmRlciBkb25uw6llcyBkw6lqw6AgYWZmaWNow6llcyBzaSB2aWRlIGRhbnMgY2UgcXVpIGVzdCByZXRvdXJuw6lcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBkYXRhIGluIHJlc3BvbnNlLlF1ZXN0aW9ubmFpcmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZvcm1RdWVzdGlvbm5haXJlLmVsZW1lbnRzW2RhdGFdIT09dW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGE9PT1cInB1Ymxpc2hpbmdBdFwiICYmIHJlc3BvbnNlLlF1ZXN0aW9ubmFpcmVbZGF0YV0hPT1udWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtUXVlc3Rpb25uYWlyZS5lbGVtZW50c1tkYXRhXS52YWx1ZT1kYXRlRm9ybWF0KHJlc3BvbnNlLlF1ZXN0aW9ubmFpcmVbZGF0YV0sIFwiZm9ybVwiKTsvLyAhISByZXZvaXIgY2FyIGZvcm1hdCBwb3V2YW50IHBvc2VyIHNvdWNpcyBzaSBuYXZpZ2F0ZXVyIG5lIGfDqHJlIHBhcyBsZXMgY2hhbXBzIGRlIHR5cGUgXCJkYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVF1ZXN0aW9ubmFpcmUuZWxlbWVudHNbZGF0YV0udmFsdWU9cmVzcG9uc2UuUXVlc3Rpb25uYWlyZVtkYXRhXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUNoZWNrQm94LnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5UYWdzICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjbGFzc2lmaWNhdGlvbj1cIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gcmVzcG9uc2UuVGFncylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaT09MClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2lmaWNhdGlvbis9cmVzcG9uc2UuVGFnc1tpXS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uKz1cIixcIityZXNwb25zZS5UYWdzW2ldLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVF1ZXN0aW9ubmFpcmUuZWxlbWVudHNbXCJjbGFzc2lmaWNhdGlvblwiXS52YWx1ZT1jbGFzc2lmaWNhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2TGlua3Muc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2UXVlc3Rpb25zLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdklsbHVzdHJhdGlvbnMuc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2UuTGlua3MgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93TGlua0luZm9zKHJlc3BvbnNlLkxpbmtzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5RdWVzdGlvbnMgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93UXVlc3Rpb25JbmZvcyhyZXNwb25zZS5RdWVzdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLklsbHVzdHJhdGlvbnMgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93SWxsdXN0cmF0aW9uSW5mb3MocmVzcG9uc2UuSWxsdXN0cmF0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscFB1Ymxpc2hpbmdBdC5zdHlsZS5kaXNwbGF5PVwibm9uZVwiOy8vIGluZm8gdXRpbGUgcG91ciBcInBsYWNlclwiIHVuIG5vdXZlYXUgcXVpelxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIMOgIHJldm9pciA6IHJlbXBsYWNlciBsaWVuIHBvdXIgdW4gYm91dG9uICsgcmVzZXQgY29tcGxldCBkdSBmb3JtdWxhaXJlLCB5IGNvbXByaXMgY2hhbXBzIGhpZGRlbiA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRuTmV3UXVlc3Rpb25uYWlyZS5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidG5OZXdRdWVzdGlvbm5haXJlLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgY29uZmlnRnJvbnRFbmQucXVlc3Rpb25uYWlyZXNNYW5hZ2VtZW50UGFnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRuUHJldmlld1F1ZXN0aW9ubmFpcmUuc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2UuUXVlc3Rpb25uYWlyZVtcImlzUHVibGlzaGVkXCJdPT09ZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0blByZXZpZXdRdWVzdGlvbm5haXJlLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgYXBpVXJsK2NvbmZpZy5xdWVzdGlvbm5haXJlUm91dGVzK2NvbmZpZy5wcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlcytcIi9cIitpZCtcIi9cIit1c2VyLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0blByZXZpZXdRdWVzdGlvbm5haXJlLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgY29uZmlnLnNpdGVVcmwrY29uZmlnLnB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXMrcmVzcG9uc2UuUXVlc3Rpb25uYWlyZVtcInNsdWdcIl0rXCIuaHRtbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB4aHJHZXRJbmZvcy5zZW5kKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU2kgdW4gaWQgZXN0IHBhc3PDqSBwYXIgbCd1cmwsIG9uIGVzc2F5ZSBkJ2FmZmljaGVyIGxlIHF1ZXN0aW9ubmFpcmUgOlxuICAgICAgICAgICAgICAgIGxldCB1cmxEYXRhcz1nZXRVcmxQYXJhbXMoKTtcbiAgICAgICAgICAgICAgICBpZih1cmxEYXRhcyAmJiB1cmxEYXRhcy5pZCE9PXVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgc2hvd0Zvcm1RdWVzdGlvbm5haXJlSW5mb3ModXJsRGF0YXMuaWQpO1xuXG4gICAgICAgICAgICAgICAgLy8gVHJhaXRlbWVudCBkdSBsYW5jZW1lbnQgZCd1bmUgcmVjaGVyY2hlXG4gICAgICAgICAgICAgICAgZm9ybVNlYXJjaC5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhcz1nZXREYXRhc0Zyb21JbnB1dHMoZm9ybVNlYXJjaCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhoclNlYXJjaCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgICAgICB4aHJTZWFyY2gub3BlbihcIlBPU1RcIiwgYXBpVXJsK2NvbmZpZy5xdWVzdGlvbm5haXJlUm91dGVzK2NvbmZpZy5zZWFyY2hBZG1pblF1ZXN0aW9ubmFpcmVzUm91dGUpO1xuICAgICAgICAgICAgICAgICAgICB4aHJTZWFyY2gub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UodGhpcy5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gMjAwICYmIEFycmF5LmlzQXJyYXkocmVzcG9uc2UpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2UubGVuZ3RoPT09MClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2U2VhcmNoUmVzdWx0LCBcInBcIiwgdHh0UXVlc3Rpb25uYWlyZS5ub3RGb3VuZCwgXCJcIiwgW1wiaW5mb3JtYXRpb25cIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3RIVE1MPVwiPG9wdGlvbiB2YWx1ZT0nJz48L29wdGlvbj5cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiByZXNwb25zZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RIVE1MKz1cIjxvcHRpb24gdmFsdWU9J1wiK3Jlc3BvbnNlW2ldLmlkK1wiJz5cIityZXNwb25zZVtpXS50aXRsZStcIjwvb3B0aW9uPlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZTZWFyY2hSZXN1bHQsIFwic2VsZWN0XCIsIHNlbGVjdEhUTUwsIFwic2VsZWN0U2VhcmNoXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VhcmNoU2VsZWN0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic2VsZWN0U2VhcmNoXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoU2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgZnVuY3Rpb24oKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNlYXJjaFNlbGVjdC52YWx1ZSE9PVwiXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dGb3JtUXVlc3Rpb25uYWlyZUluZm9zKHNlYXJjaFNlbGVjdC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2U2VhcmNoUmVzdWx0LCBcInBcIiwgdHh0LnNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgeGhyU2VhcmNoLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuICAgICAgICAgICAgICAgICAgICB4aHJTZWFyY2guc2V0UmVxdWVzdEhlYWRlcihcIkF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIrdXNlci50b2tlbik7XG4gICAgICAgICAgICAgICAgICAgIGlmKGRhdGFzKVxuICAgICAgICAgICAgICAgICAgICAgICAgeGhyU2VhcmNoLnNlbmQoSlNPTi5zdHJpbmdpZnkoZGF0YXMpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBMZXMgcXVlc3Rpb25uYWlyZXMgYmllbnTDtHQgcHVibGnDqXMuIERhbnMgdW5lIGZvbmN0aW9uIGNhciBkZXZhbnQgw6p0cmUgcmVjaGFyZ8OpLlxuICAgICAgICAgICAgICAgIGNvbnN0IHNob3dOZXh0UXVlc3Rpb25uYWlyZXMgPSAoKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeGhyTmV4dFF1ZXN0aW9ubmFpcmVzID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgICAgIHhock5leHRRdWVzdGlvbm5haXJlcy5vcGVuKFwiR0VUXCIsIGFwaVVybCtjb25maWcucXVlc3Rpb25uYWlyZVJvdXRlcytjb25maWcuZ2V0TGlzdE5leHRRdWVzdGlvbm5haXJlcyk7XG4gICAgICAgICAgICAgICAgICAgIHhock5leHRRdWVzdGlvbm5haXJlcy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDAgJiYgQXJyYXkuaXNBcnJheShyZXNwb25zZS5xdWVzdGlvbm5haXJlcykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGlzdEhUTUw9XCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpIGluIHJlc3BvbnNlLnF1ZXN0aW9ubmFpcmVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0SFRNTCs9XCI8bGk+XCIrZGF0ZUZvcm1hdChyZXNwb25zZS5xdWVzdGlvbm5haXJlc1tpXS5kYXRlUHVibGlzaGluZywgXCJmclwiKStcIjogPGEgaHJlZj0nXCIrY29uZmlnRnJvbnRFbmQucXVlc3Rpb25uYWlyZXNNYW5hZ2VtZW50UGFnZStcIj9pZD1cIityZXNwb25zZS5xdWVzdGlvbm5haXJlc1tpXS5pZCtcIicgaWQ9J3F1ZXN0aW9ubmFpcmVfXCIrcmVzcG9uc2UucXVlc3Rpb25uYWlyZXNbaV0uaWQrXCInPlwiK3Jlc3BvbnNlLnF1ZXN0aW9ubmFpcmVzW2ldLnRpdGxlK1wiPC9hPlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2UucXVlc3Rpb25uYWlyZXNbaV0uaXNQdWJsaXNoYWJsZT09PWZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RIVE1MKz1cIiA8c3BhbiBjbGFzcz0nZXJyb3InPihcIit0eHRRdWVzdGlvbm5haXJlLm5lZWRCZUNvbXBsZXRlZCtcIik8L2xpPlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdEhUTUwrPVwiPC9saT5cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5xdWVzdGlvbm5haXJlcy5sZW5ndGghPT0wKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZRdWVzdGlvbm5haXJlcywgXCJoM1wiLCB0eHRRdWVzdGlvbm5haXJlLm5leHRRdWVzdGlvbm5haXJlc0xpc3QucmVwbGFjZShcIiNOQlwiLCByZXNwb25zZS5xdWVzdGlvbm5haXJlcy5sZW5ndGgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChoZWxwUHVibGlzaGluZ0F0LCBcImVtXCIsIHR4dFF1ZXN0aW9ubmFpcmUubmV4dERhdGVXaXRob3V0UXVlc3Rpb25uYWlyZStkYXRlRm9ybWF0KG5ldyBEYXRlKHJlc3BvbnNlLmRhdGVOZWVkZWQpLCBcImZyXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZRdWVzdGlvbm5haXJlcywgXCJ1bFwiLCBsaXN0SFRNTCwgXCJcIiwgXCJcIiwgXCJcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gcmVzcG9uc2UucXVlc3Rpb25uYWlyZXMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicXVlc3Rpb25uYWlyZV9cIityZXNwb25zZS5xdWVzdGlvbm5haXJlc1tpXS5pZCkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dGb3JtUXVlc3Rpb25uYWlyZUluZm9zKGUudGFyZ2V0LmlkLnNwbGl0KFwiX1wiKVsxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIiNxdWVzdGlvbm5haXJlc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHhock5leHRRdWVzdGlvbm5haXJlcy5zZXRSZXF1ZXN0SGVhZGVyKFwiQXV0aG9yaXphdGlvblwiLCBcIkJlYXJlciBcIit1c2VyLnRva2VuKTsgXG4gICAgICAgICAgICAgICAgICAgIHhock5leHRRdWVzdGlvbm5haXJlcy5zZW5kKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNob3dOZXh0UXVlc3Rpb25uYWlyZXMoKTtcbiBcbiAgICAgICAgICAgICAgICAvLyBBaWRlIHNhaXNpZSBjbGFzc2VtZW50IGR1IHF1aXpcbiAgICAgICAgICAgICAgICBpbnB1dENsYXNzaWZpY2F0aW9uLmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCBmdW5jdGlvbihlKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZGl2UmVzcG9uc2UuaW5uZXJIVE1MPVwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhZ3M9aW5wdXRDbGFzc2lmaWNhdGlvbi52YWx1ZS5zcGxpdChcIixcIik7XG4gICAgICAgICAgICAgICAgICAgIHRhZ3MucmV2ZXJzZSgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXN0VGFnPXRhZ3NbMF0udHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICBpZihsYXN0VGFnLmxlbmd0aCA+PSAyKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyDDoCByZXZvaXIgOiBpbXBvcnRlciBsYSBsaXN0ZSBkZXMgdGFncyBsb3JzIGRlIGwnaW5pdGlhbGlzYXRpb24gcG91ciDDqXZpdGVyIGxlcyBhcHBlbHMgbXVsdGlwbGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYWlzIGRhbnMgY2UgY2FzIGFjdHVhbGlzZXIgY2V0dGUgbGlzdGUgYXByw6hzIGNoYXF1ZSBtaXNlIMOgIGpvdXIuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4aHJTZWFyY2hUYWdzID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB4aHJTZWFyY2hUYWdzLm9wZW4oXCJQT1NUXCIsIGFwaVVybCtjb25maWcucXVlc3Rpb25uYWlyZVJvdXRlcytjb25maWcudGFnc1NlYXJjaFJvdXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHhoclNlYXJjaFRhZ3Mub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDAgJiYgQXJyYXkuaXNBcnJheShyZXNwb25zZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHBDbGFzc2lmaWNhdGlvbi5pbm5lckhUTUw9XCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiByZXNwb25zZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGhlbHBDbGFzc2lmaWNhdGlvbiwgXCJhXCIsIHJlc3BvbnNlW2ldLm5hbWUsIFwiI3RhZ1wiK3Jlc3BvbnNlW2ldLmlkLCBbXCJpbmZvcm1hdGlvblwiXSwgeyBocmVmOlwiI3RhZ1wiK3Jlc3BvbnNlW2ldLmlkIH0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIiN0YWdcIityZXNwb25zZVtpXS5pZCkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ3NbMF09ZS50YXJnZXQuaW5uZXJIVE1MO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdzLnJldmVyc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRDbGFzc2lmaWNhdGlvbi52YWx1ZT10YWdzLmpvaW4oXCIsXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgeGhyU2VhcmNoVGFncy5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHhoclNlYXJjaFRhZ3Muc2V0UmVxdWVzdEhlYWRlcihcIkF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIrdXNlci50b2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB4aHJTZWFyY2hUYWdzLnNlbmQoSlNPTi5zdHJpbmdpZnkoe3NlYXJjaDogbGFzdFRhZ30pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgLy8gVHJhaXRlbWVudCBkZSBsJ2Vudm9pIGR1IGZvcm11bGFpcmUgZGVzIGluZm9zIGRlIGJhc2UgZHUgcXVpelxuICAgICAgICAgICAgICAgIGZvcm1RdWVzdGlvbm5haXJlLmFkZEV2ZW50TGlzdGVuZXIoXCJzdWJtaXRcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgZGl2UmVzcG9uc2UuaW5uZXJIVE1MPVwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhcz1nZXREYXRhc0Zyb21JbnB1dHMoZm9ybVF1ZXN0aW9ubmFpcmUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4aHJRdWVzdGlvbm5haXJlRGF0YXMgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYoIWlzRW1wdHkoZGF0YXMuaWQpICYmIChkYXRhcy5kZWxldGVPayE9PXVuZGVmaW5lZCkpXG4gICAgICAgICAgICAgICAgICAgICAgICB4aHJRdWVzdGlvbm5haXJlRGF0YXMub3BlbihcIkRFTEVURVwiLCBhcGlVcmwrY29uZmlnLnF1ZXN0aW9ubmFpcmVSb3V0ZXMrXCIvXCIrZGF0YXMuaWQpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCFpc0VtcHR5KGRhdGFzLmlkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHhoclF1ZXN0aW9ubmFpcmVEYXRhcy5vcGVuKFwiUFVUXCIsIGFwaVVybCtjb25maWcucXVlc3Rpb25uYWlyZVJvdXRlcytcIi9cIitkYXRhcy5pZCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHhoclF1ZXN0aW9ubmFpcmVEYXRhcy5vcGVuKFwiUE9TVFwiLCBhcGlVcmwrY29uZmlnLnF1ZXN0aW9ubmFpcmVSb3V0ZXMrXCIvXCIpO1xuICAgICAgICAgICAgICAgICAgICB4aHJRdWVzdGlvbm5haXJlRGF0YXMub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UodGhpcy5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gMjAxICYmIHJlc3BvbnNlLmlkIT11bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgdHh0LmFkZE9rTWVzc2FnZSwgXCJcIiwgW1wic3VjY2Vzc1wiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFzLmlkPXJlc3BvbnNlLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93TmV4dFF1ZXN0aW9ubmFpcmVzKCk7Ly8gcGV1dCBhdm9pciDDqXZvbHXDqSBzdWl2YW50IGNlIHF1aSBzJ2VzdCBwYXNzw6lcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCAmJiByZXNwb25zZS5tZXNzYWdlIT11bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihBcnJheS5pc0FycmF5KHJlc3BvbnNlLm1lc3NhZ2UpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UubWVzc2FnZSA9IHJlc3BvbnNlLm1lc3NhZ2Uuam9pbihcIjxicj5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLm1lc3NhZ2UgPSByZXNwb25zZS5tZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgcmVzcG9uc2UubWVzc2FnZSwgXCJcIiwgW1wic3VjY2Vzc1wiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dOZXh0UXVlc3Rpb25uYWlyZXMoKTsvLyBwZXV0IGF2b2lyIMOpdm9sdcOpIHN1aXZhbnQgY2UgcXVpIHMnZXN0IHBhc3PDqVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZS5lcnJvcnMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihBcnJheS5pc0FycmF5KHJlc3BvbnNlLmVycm9ycykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvcnMgPSByZXNwb25zZS5lcnJvcnMuam9pbihcIjxicj5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVycm9ycyA9IHR4dC5zZXJ2ZXJFcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHJlc3BvbnNlLmVycm9ycywgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHQuc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhcy5kZWxldGVPaz09PXVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0Zvcm1RdWVzdGlvbm5haXJlSW5mb3MoZGF0YXMuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVF1ZXN0aW9ubmFpcmUucmVzZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB4aHJRdWVzdGlvbm5haXJlRGF0YXMuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG4gICAgICAgICAgICAgICAgICAgIHhoclF1ZXN0aW9ubmFpcmVEYXRhcy5zZXRSZXF1ZXN0SGVhZGVyKFwiQXV0aG9yaXphdGlvblwiLCBcIkJlYXJlciBcIit1c2VyLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgaWYoZGF0YXMpXG4gICAgICAgICAgICAgICAgICAgICAgICB4aHJRdWVzdGlvbm5haXJlRGF0YXMuc2VuZChKU09OLnN0cmluZ2lmeShkYXRhcykpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgLy8gTCdlbnZvaSBkZXMgZG9ubsOpZXMgZCd1biBsaWVuIHBldXQgw6p0cmUgZ8OpbsOpcsOpIHBhciBsZSBib3V0b24gZm9ybXVsYWlyZSBvdSBwYXIgbGUgbGllbiBzdXBwcmltZXJcbiAgICAgICAgICAgICAgICBjb25zdCBzZW5kTGlua0Zvcm0gPSAoKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGl2UmVzcG9uc2VMaW5rPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicmVzcG9uc2VMaW5rXCIpO1xuICAgICAgICAgICAgICAgICAgICBkaXZSZXNwb25zZUxpbmsuaW5uZXJIVE1MPVwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhcz1nZXREYXRhc0Zyb21JbnB1dHMoZm9ybUxpbmspO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4aHJMaW5rRGF0YXMgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYoIWlzRW1wdHkoZGF0YXMuaWQpICYmICghaXNFbXB0eShkYXRhcy5kZWxldGVPaykpKVxuICAgICAgICAgICAgICAgICAgICAgICAgeGhyTGlua0RhdGFzLm9wZW4oXCJERUxFVEVcIiwgYXBpVXJsK2NvbmZpZy5saW5rc1JvdXRlK2RhdGFzLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZighaXNFbXB0eShkYXRhcy5pZCkpXG4gICAgICAgICAgICAgICAgICAgICAgICB4aHJMaW5rRGF0YXMub3BlbihcIlBVVFwiLCBhcGlVcmwrY29uZmlnLmxpbmtzUm91dGUrZGF0YXMuaWQpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB4aHJMaW5rRGF0YXMub3BlbihcIlBPU1RcIiwgYXBpVXJsK2NvbmZpZy5saW5rc1JvdXRlKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyTGlua0RhdGFzLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXMuc3RhdHVzID09PSAyMDAgfHwgdGhpcy5zdGF0dXMgPT09IDIwMSkgJiYgcmVzcG9uc2UubWVzc2FnZSE9dW5kZWZpbmVkICYmIHJlc3BvbnNlLnF1ZXN0aW9ubmFpcmUhPXVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkocmVzcG9uc2UubWVzc2FnZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5tZXNzYWdlID0gcmVzcG9uc2UubWVzc2FnZS5qb2luKFwiPGJyPlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UubWVzc2FnZSA9IHJlc3BvbnNlLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dMaW5rSW5mb3MocmVzcG9uc2UucXVlc3Rpb25uYWlyZS5MaW5rcyk7Ly8gbGUgc2VydmV1ciBtZSByZXRvdXJuZSB1bmUgdmVyc2lvbiBhY3R1YWxpc8OpZSBkZSBsYSBsaXN0ZSBkZXMgbGllbnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZMaW5rcywgXCJwXCIsIHJlc3BvbnNlLm1lc3NhZ2UsIFwiXCIsIFtcInN1Y2Nlc3NcIl0sIFwiXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZUFsbEZvcm1zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIjbGlua3NMaXN0XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93TmV4dFF1ZXN0aW9ubmFpcmVzKCk7Ly8gcGV1dCBhdm9pciDDqXZvbHXDqSBzdWl2YW50IGNlIHF1aSBzJ2VzdCBwYXNzw6lcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzcG9uc2UuZXJyb3JzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShyZXNwb25zZS5lcnJvcnMpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3JzID0gcmVzcG9uc2UuZXJyb3JzLmpvaW4oXCI8YnI+XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvcnMgPSB0eHQuc2VydmVyRXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2VMaW5rLCBcInBcIiwgcmVzcG9uc2UuZXJyb3JzLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZUxpbmssIFwicFwiLCB0eHQuc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB4aHJMaW5rRGF0YXMuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG4gICAgICAgICAgICAgICAgICAgIHhockxpbmtEYXRhcy5zZXRSZXF1ZXN0SGVhZGVyKFwiQXV0aG9yaXphdGlvblwiLCBcIkJlYXJlciBcIit1c2VyLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyTGlua0RhdGFzLnNlbmQoSlNPTi5zdHJpbmdpZnkoZGF0YXMpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9ybUxpbmsuYWRkRXZlbnRMaXN0ZW5lcihcInN1Ym1pdFwiLCBmdW5jdGlvbihlKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBzZW5kTGlua0Zvcm0oKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIC8vIEwnZW52b2kgZGVzIGRvbm7DqWVzIGQndW4gbGllbiBwZXV0IMOqdHJlIGfDqW7DqXLDqSBwYXIgbGUgYm91dG9uIGZvcm11bGFpcmUgb3UgcGFyIGxlIGxpZW4gc3VwcHJpbWVyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VuZElsbHVzdHJhdGlvbkZvcm0gPSAoKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGl2UmVzcG9uc2VJbGx1c3RyYXRpb249ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJyZXNwb25zZUlsbHVzdHJhdGlvblwiKTtcbiAgICAgICAgICAgICAgICAgICAgZGl2UmVzcG9uc2VJbGx1c3RyYXRpb24uaW5uZXJIVE1MPVwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhcz1nZXREYXRhc0Zyb21JbnB1dHMoZm9ybUlsbHVzdHJhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhc1dpdGhGaWxlcz1uZXcgRm9ybURhdGEoZm9ybUlsbHVzdHJhdGlvbik7IC8vIGlsIG1lIG1hbnF1ZSBsZXMgaW5mb3JtYXRpb25zIGR1IGZpY2hpZXIgYXZlYyBtYSBmb25jdGlvbiBnZXREYXRhc0Zyb21JbnB1dHNcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeGhySWxsdXN0cmF0aW9uRGF0YXMgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYoIWlzRW1wdHkoZGF0YXMuaWQpICYmICghaXNFbXB0eShkYXRhcy5kZWxldGVPaykpKVxuICAgICAgICAgICAgICAgICAgICAgICAgeGhySWxsdXN0cmF0aW9uRGF0YXMub3BlbihcIkRFTEVURVwiLCBhcGlVcmwrY29uZmlnLmlsbHVzdHJhdGlvbnNSb3V0ZStkYXRhcy5pZCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIWlzRW1wdHkoZGF0YXMuaWQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgeGhySWxsdXN0cmF0aW9uRGF0YXMub3BlbihcIlBVVFwiLCBhcGlVcmwrY29uZmlnLmlsbHVzdHJhdGlvbnNSb3V0ZStkYXRhcy5pZCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHhocklsbHVzdHJhdGlvbkRhdGFzLm9wZW4oXCJQT1NUXCIsIGFwaVVybCtjb25maWcuaWxsdXN0cmF0aW9uc1JvdXRlKTtcbiAgICAgICAgICAgICAgICAgICAgeGhySWxsdXN0cmF0aW9uRGF0YXMub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UodGhpcy5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy5zdGF0dXMgPT09IDIwMCB8fCB0aGlzLnN0YXR1cyA9PT0gMjAxKSAmJiByZXNwb25zZS5tZXNzYWdlIT11bmRlZmluZWQgJiYgcmVzcG9uc2UucXVlc3Rpb25uYWlyZSE9dW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShyZXNwb25zZS5tZXNzYWdlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLm1lc3NhZ2UgPSByZXNwb25zZS5tZXNzYWdlLmpvaW4oXCI8YnI+XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5tZXNzYWdlID0gcmVzcG9uc2UubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0lsbHVzdHJhdGlvbkluZm9zKHJlc3BvbnNlLnF1ZXN0aW9ubmFpcmUuSWxsdXN0cmF0aW9ucyk7Ly8gbGUgc2VydmV1ciBtZSByZXRvdXJuZSB1bmUgdmVyc2lvbiBhY3R1YWxpc8OpZSBkZSBsYSBsaXN0ZSBkZXMgbGllbnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZJbGx1c3RyYXRpb25zLCBcInBcIiwgcmVzcG9uc2UubWVzc2FnZSwgXCJcIiwgW1wic3VjY2Vzc1wiXSwgXCJcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRlQWxsRm9ybXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIiNpbGx1c3RyYXRpb25zTGlzdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd05leHRRdWVzdGlvbm5haXJlcygpOy8vIHBldXQgYXZvaXIgw6l2b2x1w6kgc3VpdmFudCBjZSBxdWkgcydlc3QgcGFzc8OpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3BvbnNlLmVycm9ycylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkocmVzcG9uc2UuZXJyb3JzKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVycm9ycyA9IHJlc3BvbnNlLmVycm9ycy5qb2luKFwiPGJyPlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3JzID0gdHh0LnNlcnZlckVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlSWxsdXN0cmF0aW9uLCBcInBcIiwgcmVzcG9uc2UuZXJyb3JzLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZUlsbHVzdHJhdGlvbiwgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHhocklsbHVzdHJhdGlvbkRhdGFzLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB4aHJJbGx1c3RyYXRpb25EYXRhcy5zZW5kKGRhdGFzV2l0aEZpbGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9ybUlsbHVzdHJhdGlvbi5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHNlbmRJbGx1c3RyYXRpb25Gb3JtKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAvLyBMJ2Vudm9pIGRlcyBkb25uw6llcyBkJ3VuZSBxdWVzdGlvbiBldCBkZSBzZXMgcsOpcG9uc2UgcXVpIHBldXQgw6p0cmUgZ8OpbsOpcsOpIHBhciBsZSBib3V0b24gc3VibWl0IG91IHBhciBsZSBsaWVuIHN1cHByaW1lclxuICAgICAgICAgICAgICAgIGNvbnN0IHNlbmRRdWVzdGlvbkZvcm0gPSAoKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGl2UmVzcG9uc2VRdWVzdGlvbj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJlc3BvbnNlUXVlc3Rpb25cIik7XG4gICAgICAgICAgICAgICAgICAgIGRpdlJlc3BvbnNlUXVlc3Rpb24uaW5uZXJIVE1MPVwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhcz1nZXREYXRhc0Zyb21JbnB1dHMoZm9ybVF1ZXN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeGhyUXVlc3Rpb25EYXRhcyA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZighaXNFbXB0eShkYXRhcy5pZCkgJiYgKCFpc0VtcHR5KGRhdGFzLmRlbGV0ZU9rKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB4aHJRdWVzdGlvbkRhdGFzLm9wZW4oXCJERUxFVEVcIiwgYXBpVXJsK2NvbmZpZy5xdWVzdGlvbnNSb3V0ZStkYXRhcy5pZCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIWlzRW1wdHkoZGF0YXMuaWQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgeGhyUXVlc3Rpb25EYXRhcy5vcGVuKFwiUFVUXCIsIGFwaVVybCtjb25maWcucXVlc3Rpb25zUm91dGUrZGF0YXMuaWQpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB4aHJRdWVzdGlvbkRhdGFzLm9wZW4oXCJQT1NUXCIsIGFwaVVybCtjb25maWcucXVlc3Rpb25zUm91dGUpO1xuICAgICAgICAgICAgICAgICAgICB4aHJRdWVzdGlvbkRhdGFzLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXMuc3RhdHVzID09PSAyMDAgfHwgdGhpcy5zdGF0dXMgPT09IDIwMSkgJiYgcmVzcG9uc2UubWVzc2FnZSE9dW5kZWZpbmVkICYmIHJlc3BvbnNlLnF1ZXN0aW9ubmFpcmUhPXVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkocmVzcG9uc2UubWVzc2FnZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5tZXNzYWdlID0gcmVzcG9uc2UubWVzc2FnZS5qb2luKFwiPGJyPlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UubWVzc2FnZSA9IHJlc3BvbnNlLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dRdWVzdGlvbkluZm9zKHJlc3BvbnNlLnF1ZXN0aW9ubmFpcmUuUXVlc3Rpb25zKTsvLyBsZSBzZXJ2ZXVyIG1lIHJldG91cm5lIHVuZSB2ZXJzaW9uIGFjdHVhbGlzw6llIGRlIGxhIGxpc3RlIGRlcyBxdWVzdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZRdWVzdGlvbnMsIFwicFwiLCByZXNwb25zZS5tZXNzYWdlLCBcIlwiLCBbXCJzdWNjZXNzXCJdLCBcIlwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGVBbGxGb3JtcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKFwiI3F1ZXN0aW9uc0xpc3RcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dOZXh0UXVlc3Rpb25uYWlyZXMoKTsvLyBwZXV0IGF2b2lyIMOpdm9sdcOpIHN1aXZhbnQgY2UgcXVpIHMnZXN0IHBhc3PDqVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZS5lcnJvcnMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihBcnJheS5pc0FycmF5KHJlc3BvbnNlLmVycm9ycykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvcnMgPSByZXNwb25zZS5lcnJvcnMuam9pbihcIjxicj5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVycm9ycyA9IHR4dC5zZXJ2ZXJFcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZVF1ZXN0aW9uLCBcInBcIiwgcmVzcG9uc2UuZXJyb3JzLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZVF1ZXN0aW9uLCBcInBcIiwgdHh0LnNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgeGhyUXVlc3Rpb25EYXRhcy5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyUXVlc3Rpb25EYXRhcy5zZXRSZXF1ZXN0SGVhZGVyKFwiQXV0aG9yaXphdGlvblwiLCBcIkJlYXJlciBcIit1c2VyLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyUXVlc3Rpb25EYXRhcy5zZW5kKEpTT04uc3RyaW5naWZ5KGRhdGFzKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvcm1RdWVzdGlvbi5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHNlbmRRdWVzdGlvbkZvcm0oKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaChlKVxuICAgIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgYWRkRWxlbWVudChkaXZNZXNzYWdlLCBcInBcIiwgdHh0LnNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgfVxufVxuaW5pdGlhbGlzZSgpOyIsIi8vIEZPTkNUSU9OUyBVVElMRVMgQVUgU1RPQ0tBR0UgTE9DQUwgKFNFU1NJT04sIENPT0tJRVMsIElOREVYREIsIEVUQy4pXG4vLyBSZXZlbmlyIHBvdXIgZ8OpcmVyIGxlIGNhcyBvw7kgbG9jYWwuc3RvcmFnZSBuJ2VzdCBwYXMgY29ubnUgcG91ciB1dGlsaXNlciBjb29raWVcbiAgICBcbmV4cG9ydCBjb25zdCBzYXZlTG9jYWx5ID0gKG5hbWUsIGRhdGEpID0+XG57XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obmFtZSwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0TG9jYWx5ID0gKG5hbWUsIGpzb249ZmFsc2UpID0+XG57XG4gICAgaWYoanNvbilcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSkpO1xuICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKG5hbWUpO1xufVxuXG5leHBvcnQgY29uc3QgcmVtb3ZlTG9jYWx5ID0gKG5hbWUpID0+XG57XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0obmFtZSk7XG59IiwiaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIEZvbmN0aW9uIGFzc29jaWFudCBsZXMgYXR0cmlidXRzIGZvdXJuaXMgw6AgdW4gY2hhbXAgZGUgZm9ybXVsYWlyZVxuZXhwb3J0IGNvbnN0IGFkZEVsZW1lbnQgPSAoZWx0UGFyZW50LCBlbHRUeXBlLCBlbHRDb250ZW50PVwiXCIsIGVsdElkPVwiXCIsIGVsdENsYXNzPVtdLCBlbHRBdHRyaWJ1dGVzPXt9LCByZXBsYWNlPXRydWUpID0+XG57XG4gICAgaWYoaXNFbXB0eShlbHRUeXBlKSB8fCBpc0VtcHR5KGVsdFBhcmVudCkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBlbHNlXG4gICAge1xuICAgICAgICBjb25zdCBuZXdFbGVtZW50PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZWx0VHlwZSk7XG4gICAgICAgIFxuICAgICAgICBpZighaXNFbXB0eShlbHRJZCkpLy8gdGVzdGVyIHNpIGwnaWQgbidlc3QgcGFzIGTDqWrDoCB1dGlsaXPDqSBkYW5zIGxlIERPTSA/XG4gICAgICAgICAgICBuZXdFbGVtZW50LmlkPWVsdElkO1xuXG4gICAgICAgIGlmKEFycmF5LmlzQXJyYXkoZWx0Q2xhc3MpICYmIGVsdENsYXNzLmxlbmd0aCE9MClcbiAgICAgICAge1xuICAgICAgICAgICAgZm9yKGxldCBpIGluIGVsdENsYXNzKVxuICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuY2xhc3NMaXN0LmFkZChlbHRDbGFzc1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZih0eXBlb2YgZWx0QXR0cmlidXRlcyA9PT0gXCJvYmplY3RcIikgLy8gISEgdG91cyBsZXMgb2JqZXRzIG5lIHNvbnQgcGFzIG9rXG4gICAgICAgIHtcbiAgICAgICAgICAgIGZvcihsZXQgYXR0cmlidXROYW1lIGluIGVsdEF0dHJpYnV0ZXMpXG4gICAgICAgICAgICAgICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmlidXROYW1lLCBlbHRBdHRyaWJ1dGVzW2F0dHJpYnV0TmFtZV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoIWlzRW1wdHkoZWx0Q29udGVudCkpXG4gICAgICAgICAgICBuZXdFbGVtZW50LmlubmVySFRNTD1lbHRDb250ZW50LnJlcGxhY2UoL1xcbi9nLFwiPGJyPlwiKTsvLyBpbm5lckhUTUwgcGVybWV0IGQnYWpvdXRlciBkdSB0ZXh0ZSBheWFudCBsdWktbcOqbWUgZGVzIGJhbGlzZXMsIGV0Yy5cbiAgICAgICAgICAgIFxuICAgICAgICBpZihyZXBsYWNlKVxuICAgICAgICAgICAgZWx0UGFyZW50LmlubmVySFRNTD1cIlwiO1xuICAgICAgICBlbHRQYXJlbnQuYXBwZW5kQ2hpbGQobmV3RWxlbWVudCk7XG4gICAgfSAgICBcbn0iLCIvLyBDZSBzY3JpcHQgZm91cm5pdCBkZXMgZm9uY3Rpb25zIHV0aWxpc8OpZXMgc3VyIHRvdXRlcyBsZXMgcGFnZXMgZHUgc2l0ZVxuXG5leHBvcnQgY29uc3QgaGVsbG9EZXYgPSAoKSA9Plxue1xuICAgIGNvbnNvbGUubG9nKFwiKioqKiBIZWxsbyBhbWkgZMOpdmVsb3BwZXVyIDotKVxcblxcbkxlIGNvZGUgZGUgV2lraUxlcm5pIGVzdCBsaWJyZSBldCB2b3VzIHBvdXZleiBsZSB0cm91dmVyIHNpIEdpdGxhYiA6XFxuaHR0cHM6Ly9naXRsYWIuY29tL2xlZmFibGFiL3dpa2lsZXJuaVxcblxcblBvdXIgbGVzIHN1Z2dlc3Rpb25zIGQnYW3DqWxpb3JhdGlvbiBvdSBxdWVzdGlvbnMgOiBkZXZAd2lsaWxlcm5pLmNvbSAqKioqXCIpO1xuICAgIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgY29uc3QgdXBkYXRlQWNjb3VudExpbmsgPSAoc3RhdHVzLCBjb25maWdUZW1wbGF0ZSkgPT5cbntcbiAgICBjb25zdCBsaW5rPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYWNjb3VudEhlYWRMaW5rXCIpO1xuICAgIGNvbnN0IGhvbWVQYWdlPXN0YXR1cytcIkhvbWVQYWdlXCI7XG4gICAgbGluay5ocmVmPVwiL1wiK2NvbmZpZ1RlbXBsYXRlW2hvbWVQYWdlXTtcbn0iLCJpbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gRm9uY3Rpb24gYXNzb2NpYW50IGxlcyBhdHRyaWJ1dHMgZm91cm5pcyDDoCB1biBjaGFtcCBkZSBmb3JtdWxhaXJlXG5leHBvcnQgY29uc3Qgc2V0QXR0cmlidXRlc1RvSW5wdXRzID0gKGlucHV0c0NvbmYsIG15Rm9ybSkgPT5cbntcbiAgICBmb3IobGV0IGkgaW4gbXlGb3JtLmVsZW1lbnRzKVxuICAgIHtcbiAgICAgICAgaWYoIWlzRW1wdHkobXlGb3JtLmVsZW1lbnRzW2ldLmlkKSlcbiAgICAgICAge1xuICAgICAgICAgICAgbGV0IGlkSW5wdXQ9bXlGb3JtLmVsZW1lbnRzW2ldLmlkO1xuICAgICAgICAgICAgaWYoaW5wdXRzQ29uZltpZElucHV0XSE9PXVuZGVmaW5lZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5wdXRIVE1MPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkSW5wdXQpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGF0dHJpYnV0ZSBpbiBpbnB1dHNDb25mW2lkSW5wdXRdKVxuICAgICAgICAgICAgICAgICAgICBpbnB1dEhUTUwuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgaW5wdXRzQ29uZltpZElucHV0XVthdHRyaWJ1dGVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gUsOpY3Vww6hyZSB0b3V0ZXMgbGVzIHZhbGV1cnMgZGUgY2hhbXBzIGVuIG9tZXR0YW50IGxlcyBjaGVja2JveCBub24gY29jaMOpZXMsIGV0Yy5cbmV4cG9ydCBjb25zdCBnZXREYXRhc0Zyb21JbnB1dHMgPSAobXlGb3JtKSA9Plxue1xuICAgIGNvbnN0IGRhdGFzPXt9O1xuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKG15Rm9ybSk7XG4gICAgZm9yKGxldCBlbnRyaWUgb2YgZm9ybURhdGEuZW50cmllcygpKVxuICAgICAgIGRhdGFzW2VudHJpZVswXV09ZW50cmllWzFdO1xuICAgIHJldHVybiBkYXRhcztcbn1cblxuLy8gVmlkZSB0b3VzIGxlcyBjaGFtcHMgZCd1biBmb3JtdWxhaXJlLCB5IGNvbXByaXMgaGlkZGVuLCBjaGVja2JveCwgZXRjLlxuLy8gUmV2b2lyIHBvdXIgbGVzIHNlbGVjdFxuZXhwb3J0IGNvbnN0IGVtcHlGb3JtID0gKG15Rm9ybSkgPT5cbntcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShteUZvcm0pO1xuICAgIGZvcihsZXQgZW50cmllIG9mIGZvcm1EYXRhLmVudHJpZXMoKSlcbiAgICB7XG4gICAgICAgIGlmKG15Rm9ybS5lbGVtZW50c1tlbnRyaWVbMF1dLnR5cGU9PVwiY2hlY2tib3hcIiB8fCBteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS50eXBlPT1cInJhZGlvXCIpXG4gICAgICAgICAgICBteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS5jaGVja2VkPWZhbHNlO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS52YWx1ZT1cIlwiO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8vIFZpZGUgZXQgY2FjaGUgbGUgZm9ybXVsYWlyZVxuZXhwb3J0IGNvbnN0IGVtcHlBbmRIaWRlRm9ybSA9IChteUZvcm0pID0+XG57XG4gICAgZW1weUZvcm0obXlGb3JtKTtcbiAgICBteUZvcm0uc3R5bGUuZGlzcGxheT1cIm5vbmVcIjtcbn0iLCJpbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gRm9uY3Rpb24gcsOpY3Vww6lyYW50IGxlcyBwYXJhbcOodHJlcyBwYXNzw6lzIHBhciBsJ3VybFxuZXhwb3J0IGNvbnN0IGdldFVybFBhcmFtcyA9ICgpID0+XG57XG4gICAgaWYoaXNFbXB0eShsb2NhdGlvbi5zZWFyY2gpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gbG9jYXRpb24uc2VhcmNoLnN1YnN0cmluZygxKS5zcGxpdChcIiZcIik7XG4gICAgaWYoIUFycmF5LmlzQXJyYXkocGFyYW1ldGVycykgfHwgcGFyYW1ldGVycy5sZW5ndGg9PT0wKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIFxuICAgIGxldCBwYXJhbSwgZGF0YXM9e307XG4gICAgZm9yKGxldCBpIGluIHBhcmFtZXRlcnMpXG4gICAge1xuICAgICAgICBwYXJhbSA9IHBhcmFtZXRlcnNbaV0uc3BsaXQoXCI9XCIpO1xuICAgICAgICBpZihwYXJhbS5sZW5ndGg9PT0yKVxuICAgICAgICAgICAgZGF0YXNbcGFyYW1bMF1dPWRlY29kZVVSSShwYXJhbVsxXSk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhcztcbn0iLCJpbXBvcnQgeyBhcGlVcmwsIGF2YWlsYWJsZUxhbmdzLCBzaXRlVXJsLCB0aGVtZSB9IGZyb20gXCIuLi8uLi8uLi9jb25maWcvaW5zdGFuY2UuanNcIjtcbmNvbnN0IGxhbmc9YXZhaWxhYmxlTGFuZ3NbMF07XG5cbmNvbnN0IGNvbmZpZ1RlbXBsYXRlID0gcmVxdWlyZShcIi4uLy4uLy4uL3ZpZXdzL1wiK3RoZW1lK1wiL2NvbmZpZy9cIitsYW5nK1wiLmpzXCIpO1xuXG5pbXBvcnQgeyAgY2hlY2tMb2dpblJvdXRlLCB0aW1lRGlmZmVyZW5jZU1heCwgdGltZURpZmZlcmVuY2VNaW4sIHVzZXJSb3V0ZXMgfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnL3VzZXJzLmpzXCI7XG5cbmltcG9ydCB7IGdldExvY2FseSwgcmVtb3ZlTG9jYWx5LCBzYXZlTG9jYWx5IH0gZnJvbSBcIi4vY2xpZW50c3RvcmFnZS5qc1wiO1xuaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIFLDqWN1cMOocmUgbGVzIGRvbm7DqWVzIGRlIGNvbmZpZ3VyYXRpb24gZGVzIHV0aWxpc2F0ZXVyc1xuLy8gw4AgdGVybWUsIHVuIGZpY2hpZXIgc3RhdGlxdWUgaW1wb3J0YWJsZSBjb21tZSBtb2R1bGUgZGV2cmFpdCDDqXZpdGVyIHVuZSByZXF1w6p0ZSBhamF4XG5leHBvcnQgY29uc3QgZ2V0Q29uZmlnID0gIGFzeW5jICgpID0+XG57XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+XG4gICAge1xuICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgYXBpVXJsK1wiL3VzZXIvZ2V0Y29uZmlnXCIpO1xuICAgICAgICB4aHIub25sb2FkID0gKCkgPT4gcmVzb2x2ZShKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpKTtcbiAgICAgICAgeGhyLm9uZXJyb3IgPSAoKSA9PiByZWplY3QoeGhyLnN0YXR1c1RleHQpO1xuICAgICAgICB4aHIuc2VuZCgpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0VGltZURpZmZlcmVuY2UgPSAoKSA9Plxue1xuICAgIC8vIG11bHRpcGxpZXIgcGFyIC0xLCBjYXIgYydlc3QgY2UgcXUnaWwgZmF1dCBcImFqb3V0ZXJcIiDDoCBsJ2hldXJlIFVUQyBwb3VyIHJldmVuaXIgZW4gaGV1cmUgbG9jYWxlIHF1aSBtJ2ludMOpcmVzc2UgZXQgbm9uIGwnaW52ZXJzZVxuICAgIGNvbnN0IHRpbWVMb2NhbD1uZXcgRGF0ZSgpLmdldFRpbWV6b25lT2Zmc2V0KCkqLTE7XG4gICAgaWYodGltZUxvY2FsID4gdGltZURpZmZlcmVuY2VNYXggfHwgdGltZUxvY2FsIDwgdGltZURpZmZlcmVuY2VNaW4pXG4gICAgICAgIHJldHVybiAwO1xuICAgIGVsc2UgcmV0dXJuIHRpbWVMb2NhbDtcbn1cblxuLy8gT24gZW5sw6h2ZSB2b2xvbnRhaXJlbWVudCBsZXMgMC9PIHBvdXIgw6l2aXRlciBsZXMgY29uZnVzaW9ucyAhXG4vLyBFdCBtaWV1eCB2YXV0IGF1c3NpIGTDqWJ1dGVyIGV0IGZpbmlyIHBhciB1bmUgbGV0dHJlIHNpbXBsZS5cbmV4cG9ydCBjb25zdCBnZXRQYXNzd29yZCA9IChuYkNhck1pbiwgbmJDYXJNYXgpID0+XG57XG4gICAgY29uc3QgbmJDYXI9bmJDYXJNaW4rTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKihuYkNhck1heC1uYkNhck1pbikpO1xuICAgIGNvbnN0IGxldHRlcnM9XCJBQkNERUZHSElKS0xNTlBRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5wcXJzdHV2d3h5elwiO1xuICAgIGNvbnN0IG90aGVycz1cIjEyMzQ1Njc4OSE/LiotXyVAJsOJw4DDiMOZ4oKsJMOCw4rDm8OOXCI7XG4gICAgbGV0IHBhc3N3b3JkPWxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxldHRlcnMubGVuZ3RoKV07XG4gICAgZm9yKGxldCBpPTE7aTwobmJDYXItMSk7aSsrKVxuICAgIHtcbiAgICAgICAgaWYoKGkgJSAyKSA9PT0xKVxuICAgICAgICAgICAgcGFzc3dvcmQrPW90aGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqb3RoZXJzLmxlbmd0aCldO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBwYXNzd29yZCs9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTsgICBcbiAgICB9XG4gICAgcGFzc3dvcmQrPWxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxldHRlcnMubGVuZ3RoKV07XG4gICAgcmV0dXJuIHBhc3N3b3JkO1xufVxuXG4vLyBKJ3V0aWxpc2UgbGUgc3RvY2thZ2UgbG9jYWwgZHUgbmF2aWdhdGV1ciBwb3VyIGVucmVnaXN0cmVyIGxlcyBkb25uw6llcyBwZXJtZXR0YW50IGRlIHJlY29ubmHDrnRyZSBsJ3V0aWxpc2F0ZXVyIHBhciBsYSBzdWl0ZVxuLy8gU2V1bCBsZSBzZXJ2ZXVyIHBvdXJyYSB2w6lyaWZpZXIgcXVlIGxlcyBpZGVudGlmaWFudHMgc29udCAodG91am91cnMpIHZhbGlkZXMuXG5leHBvcnQgY29uc3Qgc2V0U2Vzc2lvbiA9ICh1c2VySWQsIHRva2VuLCBkdXJhdGlvblRTKSA9Plxue1xuICAgIGNvbnN0IHN0b3JhZ2VVc2VyPVxuICAgIHtcbiAgICAgICAgaWQ6IHVzZXJJZCxcbiAgICAgICAgdG9rZW46IHRva2VuLFxuICAgICAgICBkdXJhdGlvbjogZHVyYXRpb25UU1xuICAgIH1cbiAgICBzYXZlTG9jYWx5KFwidXNlclwiLCBzdG9yYWdlVXNlcik7XG59XG5cbi8vIFbDqXJpZmllIHF1J2lsIHkgYSBkZXMgZG9ubsOpZXMgbG9jYWxlcyBjb25jZXJuYW50IGxlIHLDqXN1bHRhdCBkJ3VuIHF1aXpcbi8vIEV0IGxlcyBham91dGUgYXV4IGRvbm7DqWVzIGVudm95w6llcyBwYXIgbGVzIGZvcm11bGFpcmVzIGQnaW5zY3JpcHRpb24vY29ubmV4aW9uIHNpIGMnZXN0IGxlIGNhc1xuZXhwb3J0IGNvbnN0IGNoZWNrQW5zd2VyRGF0YXMgPSAoZGF0YXMpID0+XG57XG4gICAgY29uc3QgbGFzdEFuc3dlcj1nZXRMb2NhbHkoXCJsYXN0QW5zd2VyXCIpO1xuICAgIGlmKCFpc0VtcHR5KGxhc3RBbnN3ZXIpKVxuICAgIHtcbiAgICAgICAgY29uc3QgYW5zd2VyPUpTT04ucGFyc2UobGFzdEFuc3dlcik7XG4gICAgICAgIGlmKCFpc0VtcHR5KGFuc3dlci5kdXJhdGlvbikgJiYgIWlzRW1wdHkoYW5zd2VyLm5iQ29ycmVjdEFuc3dlcnMpICYmICFpc0VtcHR5KGFuc3dlci5RdWVzdGlvbm5haXJlSWQpICYmICFpc0VtcHR5KGFuc3dlci5uYlF1ZXN0aW9ucykpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRhdGFzLmR1cmF0aW9uPWFuc3dlci5kdXJhdGlvbjtcbiAgICAgICAgICAgIGRhdGFzLm5iQ29ycmVjdEFuc3dlcnM9YW5zd2VyLm5iQ29ycmVjdEFuc3dlcnM7XG4gICAgICAgICAgICBkYXRhcy5RdWVzdGlvbm5haXJlSWQ9YW5zd2VyLlF1ZXN0aW9ubmFpcmVJZDtcbiAgICAgICAgICAgIGRhdGFzLm5iUXVlc3Rpb25zPWFuc3dlci5uYlF1ZXN0aW9ucztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YXM7XG59XG5cbi8vIENldHRlIGZvbmN0aW9uIHRlc3RlIGxhIGNvbm5leGlvbiBkZSBsJ3V0aWxpc2F0ZXVyIGQndW5lIHBhZ2Vcbi8vIE9uIHBldXQgZm91cm5pcyB1bmUgbGlzdGUgZGUgc3RhdHV0cyBhY2NlcHTDqXMgKHNpIHZpZGUgPSB0b3VzKSwgYWluc2kgcXUndW5lIHVybCBkZSByZWRpcmVjdGlvbiBzaSBub24gY29ubmVjdMOpLCB1biBtZXNzYWdlIGQnZXJyZXVyIMOgIGFmZmljaGVyIHN1ciBsYSBwYWdlIGRlIGRlc3RpbmF0aW9uIGV0IGwndXJsIHN1ciBsYXF1ZWxsZSByZXZlbmlyIHVuZSBmb2lzIGNvbm5lY3TDqVxuZXhwb3J0IGNvbnN0IGNoZWNrU2Vzc2lvbiA9IGFzeW5jIChzdGF0dXM9W10sIHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpID0+XG57XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+XG4gICAge1xuICAgICAgICBjb25zdCB1c2VyRGF0YXM9Z2V0TG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgaWYoaXNFbXB0eSh1c2VyRGF0YXMpKVxuICAgICAgICB7XG4gICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHVzZXI9SlNPTi5wYXJzZSh1c2VyRGF0YXMpO1xuICAgICAgICAgICAgaWYoaXNFbXB0eSh1c2VyLmlkKSB8fMKgaXNFbXB0eSh1c2VyLnRva2VuKSB8fCBpc0VtcHR5KHVzZXIuZHVyYXRpb24pIHx8IHVzZXIuZHVyYXRpb24gPCBEYXRlLm5vdygpKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgIHhoci5vcGVuKFwiR0VUXCIsIGFwaVVybCt1c2VyUm91dGVzK2NoZWNrTG9naW5Sb3V0ZSt1c2VyLnRva2VuKTtcbiAgICAgICAgICAgICAgICB4aHIub25sb2FkID0gKCkgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwICYmIHJlc3BvbnNlLmlzVmFsaWQgJiYgcmVzcG9uc2UuaWQgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5pZD09PXVzZXIuaWQpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5uYW1lPXJlc3BvbnNlLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5sYW5ndWFnZT1yZXNwb25zZS5sYW5ndWFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnRpbWVEaWZmZXJlbmNlPXJlc3BvbnNlLnRpbWVEaWZmZXJlbmNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIuc3RhdHVzPXJlc3BvbnNlLnN0YXR1czsvLyBjJ2VzdCBsZSB0b2tlbiBxdWkgc2VydCDDoCB2w6lyaWZpZXIgbGUgc3RhdHV0IMOgIGNoYXF1ZSByZXF1w6p0ZSDDoCBsJ0FQSVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVMb2NhbHkoXCJ1c2VyXCIsIHVzZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpIGlsIHMnYWdpdCBkJ3VuIFwidXNlclwiIGV0IHF1ZSBzb24gYWJvbm5lbWVudCBhIGV4cGlyw6ksIGplIGxlIHJlZGlyaWdlIHZlcnMgbGEgY2Fpc3NlIDotKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLnN0YXR1cz09PVwidXNlclwiICYmIHJlc3BvbnNlLm5iRGF5c09rIDw9IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cmxBY2NvdW50PXNpdGVVcmwrXCIvXCIrY29uZmlnVGVtcGxhdGUuYWNjb3VudFBhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YodXJsQWNjb3VudCk9PT0tMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIvXCIrY29uZmlnVGVtcGxhdGUuYWNjb3VudFBhZ2UrXCIjc3Vic2NyaWJlXCIpOy8vIHBhc3PDqWUgZGlyZWN0ZW1lbnQgaWNpLCBsJ2FuY3JlICNzdWJzY3JpYmUgbmUgZm9uY3Rpb25uZSBwYXMgIT9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RhdHVzLmxlbmd0aCE9PTAgJiYgc3RhdHVzLmluZGV4T2YocmVzcG9uc2Uuc3RhdHVzKT09PS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB4aHIub25lcnJvciA9ICgpID0+IHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICAgICAgICAgICAgeGhyLnNlbmQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuLy8gQ2V0dGUgZm9uY3Rpb24gc2VydCDDoCBsYSBwcsOpY8OpZGVudGUgZW4gY2FzIGRlIGNvbm5leGlvbiBub24gdmFsaWRlXG5jb25zdCByZWRpcmVjdFVzZXIgPSAodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCkgPT5cbntcbiAgICBpZighaXNFbXB0eShtZXNzYWdlKSlcbiAgICAgICAgc2F2ZUxvY2FseShcIm1lc3NhZ2VcIiwgbWVzc2FnZSk7XG4gICAgaWYoIWlzRW1wdHkodXJsV2FudGVkKSlcbiAgICAgICAgc2F2ZUxvY2FseShcInVybFwiLCB1cmxXYW50ZWQpO1xuICAgIGlmKCFpc0VtcHR5KHVybFJlZGlyZWN0aW9uKSlcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbih1cmxSZWRpcmVjdGlvbik7XG59Il0sInNvdXJjZVJvb3QiOiIifQ==