1625 lines
227 KiB
JavaScript
1625 lines
227 KiB
JavaScript
/******/ (function(modules) { // webpackBootstrap
|
||
/******/ // The module cache
|
||
/******/ var installedModules = {};
|
||
/******/
|
||
/******/ // The require function
|
||
/******/ function __webpack_require__(moduleId) {
|
||
/******/
|
||
/******/ // Check if module is in cache
|
||
/******/ if(installedModules[moduleId]) {
|
||
/******/ return installedModules[moduleId].exports;
|
||
/******/ }
|
||
/******/ // Create a new module (and put it into the cache)
|
||
/******/ var module = installedModules[moduleId] = {
|
||
/******/ i: moduleId,
|
||
/******/ l: false,
|
||
/******/ exports: {}
|
||
/******/ };
|
||
/******/
|
||
/******/ // Execute the module function
|
||
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
||
/******/
|
||
/******/ // Flag the module as loaded
|
||
/******/ module.l = true;
|
||
/******/
|
||
/******/ // Return the exports of the module
|
||
/******/ return module.exports;
|
||
/******/ }
|
||
/******/
|
||
/******/
|
||
/******/ // expose the modules object (__webpack_modules__)
|
||
/******/ __webpack_require__.m = modules;
|
||
/******/
|
||
/******/ // expose the module cache
|
||
/******/ __webpack_require__.c = installedModules;
|
||
/******/
|
||
/******/ // define getter function for harmony exports
|
||
/******/ __webpack_require__.d = function(exports, name, getter) {
|
||
/******/ if(!__webpack_require__.o(exports, name)) {
|
||
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
|
||
/******/ }
|
||
/******/ };
|
||
/******/
|
||
/******/ // define __esModule on exports
|
||
/******/ __webpack_require__.r = function(exports) {
|
||
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
|
||
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
||
/******/ }
|
||
/******/ Object.defineProperty(exports, '__esModule', { value: true });
|
||
/******/ };
|
||
/******/
|
||
/******/ // create a fake namespace object
|
||
/******/ // mode & 1: value is a module id, require it
|
||
/******/ // mode & 2: merge all properties of value into the ns
|
||
/******/ // mode & 4: return value when already ns object
|
||
/******/ // mode & 8|1: behave like require
|
||
/******/ __webpack_require__.t = function(value, mode) {
|
||
/******/ if(mode & 1) value = __webpack_require__(value);
|
||
/******/ if(mode & 8) return value;
|
||
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
|
||
/******/ var ns = Object.create(null);
|
||
/******/ __webpack_require__.r(ns);
|
||
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
|
||
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
|
||
/******/ return ns;
|
||
/******/ };
|
||
/******/
|
||
/******/ // getDefaultExport function for compatibility with non-harmony modules
|
||
/******/ __webpack_require__.n = function(module) {
|
||
/******/ var getter = module && module.__esModule ?
|
||
/******/ function getDefault() { return module['default']; } :
|
||
/******/ function getModuleExports() { return module; };
|
||
/******/ __webpack_require__.d(getter, 'a', getter);
|
||
/******/ return getter;
|
||
/******/ };
|
||
/******/
|
||
/******/ // Object.prototype.hasOwnProperty.call
|
||
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
|
||
/******/
|
||
/******/ // __webpack_public_path__
|
||
/******/ __webpack_require__.p = "";
|
||
/******/
|
||
/******/
|
||
/******/ // Load entry module and return exports
|
||
/******/ return __webpack_require__(__webpack_require__.s = "./src/accountUser.js");
|
||
/******/ })
|
||
/************************************************************************/
|
||
/******/ ({
|
||
|
||
/***/ "../config/instance.js":
|
||
/*!*****************************!*\
|
||
!*** ../config/instance.js ***!
|
||
\*****************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
var _module$exports;
|
||
|
||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||
|
||
var users = __webpack_require__(/*! ./users */ "../config/users.js");
|
||
|
||
var questionnaires = __webpack_require__(/*! ./questionnaires */ "../config/questionnaires.js");
|
||
|
||
module.exports = (_module$exports = {
|
||
apiUrl: "http://localhost:3000/api",
|
||
siteUrl: "http://localhost:8080",
|
||
adminName: "Fabrice",
|
||
adminEmail: "dev@wikilerni.com",
|
||
senderName: "WikiLerni (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 "@" !
|
||
defaultReceiptDays: "147",
|
||
// Par défaut, quel(s) jour(s) de la semaine, l'utilisateur reçoit-il quelque chose ? (1=dimanche, 2=lundi... 7=samedi)
|
||
cronTimingAlertInSeconde: 120,
|
||
// for logs
|
||
responseTimingAlertInSeconde: 3,
|
||
// idem
|
||
tokenSignupValidationTimeInHours: "48h",
|
||
// https://github.com/zeit/ms
|
||
tokenLoginLinkTimeInHours: "1h",
|
||
tokenConnexionMinTimeInHours: "24h",
|
||
tokenConnexionMaxTimeInDays: "180 days",
|
||
tokenLoginChangingTimeInHours: "1h",
|
||
// for email & password changing
|
||
tokenDeleteUserTimeInHours: "1h",
|
||
tokenUnsubscribeLinkTimeInDays: "7 days",
|
||
// token send with subscription's emails
|
||
freeAccountTimingInDays: 15,
|
||
freeAccountExpirationNotificationInDays: 3,
|
||
accountExpirationFirstNotificationInDays: 10,
|
||
accountExpirationSecondNotificationInDays: 3,
|
||
inactiveAccountTimeToDeleteInDays: 180,
|
||
// Questionnaires:
|
||
nbQuestionsMin: 1,
|
||
// minimum number of questions for the questionnaire to be publishable
|
||
nbQuestionsMax: 2,
|
||
// if 0 = not maximum
|
||
nbChoicesMax: 10,
|
||
nbNewQuestionnaires: 12,
|
||
// for RSS, etc.
|
||
hourGiveNewQuestionnaireBegin: 7,
|
||
// in user local time
|
||
hourGiveNewQuestionnaireEnd: 21,
|
||
// idem
|
||
numberNewQuestionnaireAtSameTime: 50,
|
||
// for mass mailing
|
||
minSearchQuestionnaires: 3,
|
||
fieldNewQuestionnaires: "publishingAt",
|
||
// field to be used to create the list of the last questionnaires, can be "createdAt", "updatedAt" or "publishingAt"
|
||
// 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: 500,
|
||
illustrationsMiniaturesWidthMaxInPx: 200,
|
||
// Links:
|
||
nbLinksMin: 1,
|
||
nbLinksMax: 1
|
||
}, _defineProperty(_module$exports, "nbQuestionsMin", 1), _defineProperty(_module$exports, "nbQuestionsMax", 0), _defineProperty(_module$exports, "nbChoicesMax", 10), _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
|
||
}
|
||
},
|
||
search: {
|
||
minlength: 3,
|
||
required: true
|
||
},
|
||
|
||
/* valeurs en fait définies dans instance.js donc à supprimer quand plus utilisées ailleurs */
|
||
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",
|
||
checkDeleteLinkRoute: "/confirmdelete/",
|
||
checkIfIsEmailfreeRoute: "/isemailfree",
|
||
checkLoginRoute: "/checklogin/",
|
||
checkNewLoginLinkRoute: "/confirmnewlogin/",
|
||
checkSubscribeTokenRoute: "/validation/",
|
||
connectionRoute: "/login",
|
||
connectionWithLinkRoute: "/checkloginlink",
|
||
createUserRoute: "/create",
|
||
getAdminStats: "/getadminstats/",
|
||
getGodChilds: "/getgodchilds/",
|
||
getGodfatherRoute: "/getgodfatherid",
|
||
getLoginLinkRoute: "/getloginlink",
|
||
getPayments: "/payment/getforoneuser/",
|
||
getUserInfos: "/get/",
|
||
searchUserRoute: "/search/",
|
||
subscribeRoute: "/signup",
|
||
unsubscribeRoute: "/subscription/stop/",
|
||
updateUserInfos: "/modify/",
|
||
validateUserRoute: "/validate/",
|
||
// 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
|
||
},
|
||
search: {
|
||
minlength: 1,
|
||
required: true
|
||
},
|
||
timeDifferenceMin: -720,
|
||
timeDifferenceMax: 840,
|
||
// JSON dir
|
||
dirCacheUsers: "datas/users",
|
||
dirCacheUsersAnswers: "datas/users/questionnaires/answers",
|
||
dirCacheUsersWithoutAnswers: "datas/users/questionnaires/without"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "../lang sync recursive ^\\.\\/.*\\/general$":
|
||
/*!**************************************!*\
|
||
!*** ../lang sync ^\.\/.*\/general$ ***!
|
||
\**************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
var map = {
|
||
"./fr/general": "../lang/fr/general.js"
|
||
};
|
||
|
||
|
||
function webpackContext(req) {
|
||
var id = webpackContextResolve(req);
|
||
return __webpack_require__(id);
|
||
}
|
||
function webpackContextResolve(req) {
|
||
if(!__webpack_require__.o(map, req)) {
|
||
var e = new Error("Cannot find module '" + req + "'");
|
||
e.code = 'MODULE_NOT_FOUND';
|
||
throw e;
|
||
}
|
||
return map[req];
|
||
}
|
||
webpackContext.keys = function webpackContextKeys() {
|
||
return Object.keys(map);
|
||
};
|
||
webpackContext.resolve = webpackContextResolve;
|
||
module.exports = webpackContext;
|
||
webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/general$";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "../lang sync recursive ^\\.\\/.*\\/subscription$":
|
||
/*!*******************************************!*\
|
||
!*** ../lang sync ^\.\/.*\/subscription$ ***!
|
||
\*******************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
var map = {
|
||
"./fr/subscription": "../lang/fr/subscription.js"
|
||
};
|
||
|
||
|
||
function webpackContext(req) {
|
||
var id = webpackContextResolve(req);
|
||
return __webpack_require__(id);
|
||
}
|
||
function webpackContextResolve(req) {
|
||
if(!__webpack_require__.o(map, req)) {
|
||
var e = new Error("Cannot find module '" + req + "'");
|
||
e.code = 'MODULE_NOT_FOUND';
|
||
throw e;
|
||
}
|
||
return map[req];
|
||
}
|
||
webpackContext.keys = function webpackContextKeys() {
|
||
return Object.keys(map);
|
||
};
|
||
webpackContext.resolve = webpackContextResolve;
|
||
module.exports = webpackContext;
|
||
webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/subscription$";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "../lang sync recursive ^\\.\\/.*\\/user$":
|
||
/*!***********************************!*\
|
||
!*** ../lang sync ^\.\/.*\/user$ ***!
|
||
\***********************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
var map = {
|
||
"./fr/user": "../lang/fr/user.js"
|
||
};
|
||
|
||
|
||
function webpackContext(req) {
|
||
var id = webpackContextResolve(req);
|
||
return __webpack_require__(id);
|
||
}
|
||
function webpackContextResolve(req) {
|
||
if(!__webpack_require__.o(map, req)) {
|
||
var e = new Error("Cannot find module '" + req + "'");
|
||
e.code = 'MODULE_NOT_FOUND';
|
||
throw e;
|
||
}
|
||
return map[req];
|
||
}
|
||
webpackContext.keys = function webpackContextKeys() {
|
||
return Object.keys(map);
|
||
};
|
||
webpackContext.resolve = webpackContextResolve;
|
||
module.exports = webpackContext;
|
||
webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/user$";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "../lang/fr/general.js":
|
||
/*!*****************************!*\
|
||
!*** ../lang/fr/general.js ***!
|
||
\*****************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports) {
|
||
|
||
module.exports = {
|
||
addBtnTxt: "Ajouter",
|
||
addOkMessage: "Les données ont bien été enregistrées.",
|
||
alertNewWindow: "nouvelle fenêtre",
|
||
badUrl: "Tentative d'accès à une page n'existant pas :",
|
||
btnLinkToQuestionnaire: "Aller au quiz !",
|
||
deleteBtnTxt: "Supprimer",
|
||
deleteOkMessage: "La suppression a bien été enregistrée.",
|
||
failAuth: "Erreur d'authentification.",
|
||
failAuthCron: "Tentative de lancement d'un cron sans le bon token.",
|
||
failAuthHeader: "Absence de header Authorization.",
|
||
failAuthId: "Identifiant non valide : ",
|
||
failAuthToken: "Token invalide ou utilisateur non trouvé.",
|
||
neededParams: "Des paramètres nécessaires manquants sont manquants.",
|
||
nextPage: "Page suivante",
|
||
notAllowed: "Vous n'avez pas les droits nécessaires pour cette action.",
|
||
notRequired: "Facultatif.",
|
||
notValidFormat: "Format non valide.",
|
||
previousPage: "Page précédente",
|
||
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 :",
|
||
siteHTMLTitle: "WikiLerni : Wikipédia en questions",
|
||
siteMetaDescription: "Avec WikiLerni, recevez chaque jour de nouveaux quizs pour tester vos connaissances et apprendre de nouvelles choses.",
|
||
scriptTimingAlert: "*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL",
|
||
scriptTimingInfo: "Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL",
|
||
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.<br>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.<br>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.",
|
||
updateBtnTxt: "Modifier",
|
||
updateOkMessage: "La mise à jour à jour a bien été enregistrée."
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "../lang/fr/subscription.js":
|
||
/*!**********************************!*\
|
||
!*** ../lang/fr/subscription.js ***!
|
||
\**********************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports) {
|
||
|
||
module.exports = {
|
||
allSubscriptionProcessed: "Tous les abonnés ont été traités pour le moment.",
|
||
infosExpirated: "Votre abonnement a expiré, mais il vous reste encore quelques jours avant que votre compte et vos données ne soient complètement supprimées.<br>Pour ce faire, suivez sans tarder les indications ci-dessous :",
|
||
infosExpiratedAdmin: "Cet abonnement a expiré.",
|
||
infosNbDays: "Votre abonnement est encore valable <b>pendant NB_DAYS jours</b>.<br>Vous pouvez à tout moment prolonger votre abonnement en suivant les indications ci-dessous :",
|
||
infosNbDaysAdmin: "Cet abonnement est encore valable <b>pendant NB_DAYS jours</b>.",
|
||
infosPaymentsAdmin: "DATE_PAYMENT : paiement de AMOUNT € au nom de CLIENT_NAME.",
|
||
isNotValided: "Cet utilisateur n'a pas encore validé son compte.<br>Vous pouvez le faire à sa place <a href='#validationOk'>en cochant la case indiquée</a> et enregistrant.",
|
||
mailEndFreeTimeBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Votre abonnement gratuit à SITE_NAME va expirer d'ici quelques jours.<br><br>Pour continuer à utiliser le site, vous pouvez souscrire à un abonnement sans tarder en cliquant sur le lien ci-dessous.</p>",
|
||
mailEndFreeTimeBodyTxt: "Bonjour USER_NAME,\n\nVotre abonnement gratuit à SITE_NAME va expirer d'ici quelques jours.\n\nPour continuer à utiliser le site, vous pouvez sans attendre souscrire à un abonnement :\nLINK_URL",
|
||
mailEndFreeTimeLinkTxt: "M'abonner.",
|
||
mailEndFreeTimeMessage: " relances envoyées.",
|
||
mailEndFreeTimeSubject: "Votre abonnement gratuit va expirer",
|
||
mailExpirationBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Votre abonnement à SITE_NAME va expirer d'ici quelques jours.<br><br>Pour continuer à utiliser SITE_NAME, vous pouvez le prolonger dès aujourd'hui en cliquant sur le lien ci-dessous.</p>",
|
||
mailExpirationBodyTxt: "Bonjour USER_NAME,\n\nVotre abonnement à SITE_NAME va expirer d'ici quelques jours.\n\nPour continuer à utiliser SITE_NAME, vous pouvez le prolonger dès aujourd'hui :\nLINK_URL",
|
||
mailExpirationLinkTxt: "Prolonger mon abonnement.",
|
||
mailExpirationMessage: "FIRST premières et SECOND deuxièmes relances envoyées pour des abonnements expirant d'ici peu.",
|
||
mailExpirationRelaunchTxt: "[Rappel] ",
|
||
mailExpirationSubject: "Votre abonnement va bientôt expirer",
|
||
mailNewQuestionnaireBodyTxt: "Bonjour USER_NAME,\n\nUn nouveau quiz vient de vous être proposé :\n\nQUESTIONNAIRE_URL\n\nBonne lecture !\n\nStopper les envois ?\nUNSUBSCRIBE_URL",
|
||
mailStopMailLinkTxt: "Stopper les envois.",
|
||
needKnowIfNoticeOk: "Il manque l'information sur l'acceptation ou non de recevoir des notifications.",
|
||
needIntegerNumberOfDays: "Le nombre de jours de l'abonnement doit être un nombre entier.",
|
||
needMinNumberOfDays: "Le nombre de jours de l'abonnement ne peut être négatif !",
|
||
needNotTooLongDaysList: "La liste de jours sélectionnés n'a pas le bon format (trop longue).",
|
||
needNumberOfDays: "Il faut un nombre de jours pour l'abonnement.",
|
||
needUniqueDaysList: "La liste de jours sélectionnés n'a pas le bon format. Doublon : ",
|
||
needValidDaysList: "La liste de jours sélectionnés n'a pas le bon format. Caractère non valide : ",
|
||
noNewQuestionnaireForUser: "Aucun nouveau questionnaire trouvé pour un abonné : ",
|
||
unsubscriptionOk: "Votre demande a bien été prise en compte. Vous ne recevrez plus de messages venant du site, sauf pour vous signaler la fin de votre abonnement.<br>N'hésitez pas <a href='/#URL'>à accéder à votre compte</a> pour de nouveau autoriser certains envois.",
|
||
unsubscriptionFail: "Si vous voyez ce message, c'est que votre lien de désabonnement ne fonctionne pas.<br>Vous pouvez <a href='/#URL'>accéder à votre compte</a> pour désactiver les envois manuellement."
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "../lang/fr/user.js":
|
||
/*!**************************!*\
|
||
!*** ../lang/fr/user.js ***!
|
||
\**************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports) {
|
||
|
||
module.exports = {
|
||
alreadyConnected: "Vous êtes déjà connecté au site !",
|
||
badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau <a href='#URL'>en cliquant ici</a>.",
|
||
badPassword: "Aucun compte utilisateur ne correspond aux informations saisies.",
|
||
byebyeMessage: "Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.<br>À bientôt !",
|
||
connectionOk: "Connexion réussie.",
|
||
creationOkMessage: "Le nouvel utilisateur a bien été enregistré.",
|
||
cronDeleteUnvalidedUsersMessage: " comptes utilisateurs non validés ont été supprimés.",
|
||
deleteFailMessage: "Tentative de suppression d'un utilisateur inexistant : ",
|
||
deleteInactiveUsersMessage: " comptes utilisateurs inactifs ont été supprimés.",
|
||
deleteOkMessage: "L'utilisateur a bien été supprimé.",
|
||
emailNotFound: "Aucun compte utilisateur n'a été trouvé pour cette adresse e-mail.",
|
||
godfatherFound: "Votre \"parrain\" a bien été trouvé :)",
|
||
godfatherNotFound: "Désolé mais aucun utilisateur n'a été trouvé pour ce code/e-mail parrain :(",
|
||
infosAdminGodfather: "Cet utilisateur a été parrainé par ",
|
||
infosAdminNbGodChilds: "Ses #NB filleuls : ",
|
||
infosUserForAdmin: "Cet utilisateur (id: ID_USER) a <b>créé son compte le DATE_CREA</b>, la dernière mise à jour datant du DATE_UPDATE.<br><b>Date de sa dernière connexion : DATE_CONNECTION.</b>",
|
||
infosUserNbGodChilds: "Voici les #NB utilisateur(s) inscrit(s) en vous désignant comme \"parrain\" : ",
|
||
infosUserNoGodchilds: "Pour l'instant, aucune personne ne s'est inscrite, en vous désignant comme \"parrain\".",
|
||
mailDeleteBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Pour confirmer la suppression de votre compte, cliquez sur le lien ci-dessous sans tarder.</p>",
|
||
mailDeleteBodyTxt: "Bonjour USER_NAME,\n\nPour confirmer la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL",
|
||
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é.",
|
||
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.",
|
||
mailDeleteLinkOkMessage: "Votre compte a bien été supprimé. Merci d'avoir utilisé nos services.",
|
||
mailDeleteLinkTxt: "Confirmer.",
|
||
mailDeleteSubject: "Confirmer la suppression de votre compte.",
|
||
mailLoginLinkBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :</p>",
|
||
mailLoginLinkBodyTxt: "Bonjour USER_NAME,\n\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL",
|
||
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* !",
|
||
mailLoginLinkSubject: "Votre lien de connexion.",
|
||
mailLoginLinkTxt: "Me connecter.",
|
||
mailThankGodfatherBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Grâce à vous, un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.<br>Si dans l'avenir cette personne souscrit un abonnement prémium, votre propre abonnement sera prolongé de 30 jours.</p><p>Encore merci et à bientôt !</p>",
|
||
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 !",
|
||
mailThankGodfatherLinkTxt: "Me connecter à mon compte.",
|
||
mailThankGodfatherSubject: "Merci !",
|
||
mailUpdateLoginBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Pour valider vos nouveaux identifiants de connexion, cliquez sur le lien ci-dessous sans tarder.</p>",
|
||
mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\n\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL",
|
||
mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (e-mail et/ou mot de passe) et <b>vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement</b>.<br>En attendant, merci de continuer à utiliser vos anciens identifiants.",
|
||
mailUpdateLoginLinkTxt: "Valider.",
|
||
mailUpdateLoginOkMessage: "La mise à jour de vos identifiants a bien été enregistrée.",
|
||
mailUpdateLoginSubject: "Merci de valider vos nouveaux identifiants.",
|
||
mailValidationLinkSBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Pour valider votre inscription, merci de cliquer sur le lien ci-dessous dans les 24h.</p>",
|
||
mailValidationLinkSBodyTxt: "Bonjour USER_NAME,\n\nPour valider votre inscription, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL",
|
||
mailValidationLinkSubject: "Merci de valider votre inscription",
|
||
mailValidationLinkTxt: "Valider mon compte.",
|
||
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.",
|
||
mailWelcomeBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Vous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !<br><br>Si vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à <b>EMAIL</b>.<br><br>Je vous conseille d'ailleurs d'ajouter <b>EMAIL</b> à votre carnet d'adresses pour éviter que les prochains envois du site n'arrivent en <i>spam</i>.<br><br>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.<br><br>Pour ce faire, utilisez le lien ci-dessous.<br><br>À bientôt sur NOM_SITE.",
|
||
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.",
|
||
mailWelcomeLinkTxt: "Me connecter à mon compte.",
|
||
mailWelcomeSubject: "Bienvenue !",
|
||
needBeConnected: "Vous devez être connecté pour accéder à cette page.",
|
||
needChooseLoginWay: "Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.",
|
||
needEmail: "Merci de saisir votre adresse e-mail.",
|
||
needKnowNewsletterOk: "Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.",
|
||
needLanguage: "Il manque le code langue.",
|
||
needLongPassWord: "Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.",
|
||
needMaxTimeDifference: "Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.",
|
||
needMinTimeDifference: "Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.",
|
||
needName: "Merci de choisir un nom d'utilisateur.",
|
||
needNotTooLongName: "Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.",
|
||
needNotTooLongEmail: "Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.",
|
||
needPassWord: "Merci de fournir un mot de passe.",
|
||
needSMTP: "Il manque le serveur SMTP.",
|
||
needSMTPNotFound: "Il manque un serveur SMTP valide.",
|
||
needStatus: "Il manque le statut.",
|
||
needTimeDifference: "Il faut connaître le nombre de minutes du décalage horaire.",
|
||
needUGCOk: "Merci d'accepter les CGU pour créer votre compte.",
|
||
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, <a href='/#URL'>cliquez-ici pour vous connecter</a>.",
|
||
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.",
|
||
needValidLastConnectionDate: "La date de dernière connexion n'est pas valide.",
|
||
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.",
|
||
searchUsersWithoutResult: "L'utilisateur n'a pas été trouvé.",
|
||
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.",
|
||
updatedFailedGodfatherNotFound: "L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.",
|
||
updatedNeedGoodEmail: "Mais la nouvelle adresse e-mail n'a pu être enregistrée, car elle n'a pas un format correct.",
|
||
updatedNeedGoodGodfather: "Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.",
|
||
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.",
|
||
updatedNeedValidatedUser: "L'utilisateur que vous souhaitez modifier n'existe pas/plus ou n'a pas encore validé son compte.",
|
||
updatedOkMessage: "Vos informations ont bien été mises à jour.",
|
||
validationAlreadyMessage: "Il semble que vous ayez déjà validé votre compte.",
|
||
validationAlreadyMessageAdmin: "Ce compte a déjà été validé.",
|
||
validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue !<br>Vous pouvez sans tarder vous connecter ci-dessous pour accéder à votre espace WikiLerni.",
|
||
validationMessageAdmin: "Le compte a bien été validé.",
|
||
welcomeMessage: "Bienvenue #NAME !"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "../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.<br>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.<br>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.<br>Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.<br>Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.<br>Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.<br><br><small><em>(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.</em></small>",
|
||
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é.<br>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.<br><br>Toutes les réponses se trouvent dans l'article proposé à la lecture. <b>Vous êtes ici pour apprendre de nouvelles choses</b>, mais libre à vous d'essayer d'y répondre immédiatement.<br><br>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 ? :-)<br><br>Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.<br>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.<br><br>Mais <b>la création de ce compte est facultative</b> et <a href='/quizs/' title='Les derniers quizs publiés'>vous pouvez parcourir WikiLerni librement</a>.",
|
||
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 dernières mises à jour WikiLerni"
|
||
}
|
||
}, {
|
||
anchor: "Mon compte",
|
||
attributes: {
|
||
href: "/connexion.html",
|
||
id: "accountHeadLink",
|
||
title: "Accéder ou créez votre compte WikiLerni"
|
||
}
|
||
}, {
|
||
anchor: "À propos",
|
||
attributes: {
|
||
href: "/a-propos.html",
|
||
title: "En savoir + sur WikiLerni"
|
||
}
|
||
}, {
|
||
anchor: "Accueil",
|
||
attributes: {
|
||
href: "/",
|
||
title: "Page d'accueil"
|
||
}
|
||
}],
|
||
footLinks: [{
|
||
anchor: "Blog",
|
||
attributes: {
|
||
href: "https://framasphere.org/people/7e54b7a0b53201389eef2a0000053625",
|
||
title: "Le blog WikiLerni sur diaspora*"
|
||
}
|
||
}, {
|
||
anchor: "Crédits",
|
||
attributes: {
|
||
href: "/credits.html",
|
||
title: "Qui a créé WikiLerni ? Quels sont vos droits ?"
|
||
}
|
||
}, {
|
||
anchor: "Mentions légales",
|
||
attributes: {
|
||
href: "/mentions-legales.html",
|
||
rel: "nofollow"
|
||
}
|
||
}, {
|
||
anchor: "Données personnelles",
|
||
attributes: {
|
||
href: "/donnees.html",
|
||
title: "Vos données personnelles sur WikiLerni"
|
||
}
|
||
}, {
|
||
anchor: "CGV & CGU",
|
||
attributes: {
|
||
href: "/CGV-CGU.html",
|
||
rel: "nofollow"
|
||
}
|
||
}],
|
||
maxQuestionnairesSiteHomePage: 3,
|
||
maxQuestionnairesByPage: 12,
|
||
nbQuestionnairesUserHomePage: 3,
|
||
userHomePage: "accueil.html",
|
||
userHomePageTxt: "Ma page d'accueil.",
|
||
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: "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.<br>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.<br>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 <span class='postscriptum'>(*)</span>, le logiciel et le contenu partagé sur WikiLerni <a href=\"/credits.html\" title=\"En savoir plus\">sont libres</a>.<br>Sur WikiLerni, pas de publicité, ni de commercialisation de vos données.<br>Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.",
|
||
homeBtnAboutTxt: "En savoir plus sur WikiLerni ?",
|
||
homeBtnSubscribeTxt: "Tester WikiLerni gratuitement.",
|
||
newQuestionnairesTitle: "Culture générale - apprenez de nouvelles choses avec WikiLerni",
|
||
newQuestionnairesIntro: "WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec les quizs WikiLerni.",
|
||
explanationTitle: "Vous découvrez WikiLerni ?",
|
||
explanationTxt: "<p>Le principe est simple : <b>vous commencez par lire l'article Wikipédia dont le lien vous est proposé</b>.<br>Puis vous <b>afficher le quiz pour vérifier ce que vous avez retenu de votre lecture</b>.</p><p>Suivant les questions, <b>une ou plusieurs réponses peuvent être correctes</b> et doivent donc être cochées.<br>C'est toujours <b>le contenu de l'article Wikipédia qui fait foi</b> concernant les \"bonnes\" réponses.<br>Mais les articles de Wikipédia peuvent évoluer, donc n'hésitez pas <a href='/contact.html'>à me signaler une erreur</a>.</p><h3>Pas le temps de lire l'article Wikipédia ?</h3><p>Il est vrai que certains sont longs ! :-)<br>Dans ce cas, <b>essayez simplement de répondre avec vos connaissances actuelles</b>.<br>Il n'est pas nécessaire de répondre à toutes les questions pour obtenir les réponses.<br>Après validation, vous verrez apparaître les bonnes réponses + un extrait de l'article Wikipédia.<br>Vous pouvez ainsi <b>apprendre de nouvelles choses en quelques minutes</b>.</p><p>Une autre possibilité est d'afficher le quiz avant d'aller chercher les réponses dans l'article Wikipédia... Elles y sont toutes !</p><p><b>Il n'y a pas de bonne façon de faire</b>, et dans tous les cas <b>vous apprenez des choses sur des sujets très variés, ce qui est le but de WikiLerni</b>.</p><p>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 ? :)</p><p>Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder. Ce compte vous permettra de <b>tester de nouveau ce quiz</b> pour vérifier ce que vous en avez retenu après plusieurs jours, semaines, mois... Grâce à ce compte, vous pourrez aussi <b>recevoir régulièrement de nouveaux quizs</b> pour continuer à \"cultiver votre jardin\".</p>",
|
||
questionnaireLicenceTxt: "Ce quiz <a href=\"/credits.html\">est libre</a>, mais il n'est pas gratuit. Vous pouvez <a href=\"/participer-financement.html\">participer à son financement en cliquant ici</a>.",
|
||
noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",
|
||
newsListTitle: "<h3>1 article Wikipédia + 1 quiz = 1 WikiLerni</h3><p>WikiLerni, ce sont plusieurs quizs publiés chaque semaine, chacun associé à un article Wikipédia.<br>Sans publicité, ni commerce de vos données, <b>vous apprenez de nouvelles choses en toute liberté</b>.</p><blockquote>Aristote : « L’homme a naturellement la passion de connaître… »</blockquote>",
|
||
mailRecipientTxt: "Message envoyé à :",
|
||
twitterAccount: "@WikiLerni"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/accountUser.js":
|
||
/*!****************************!*\
|
||
!*** ./src/accountUser.js ***!
|
||
\****************************/
|
||
/*! no exports provided */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ "../config/instance.js");
|
||
/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js");
|
||
/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js");
|
||
/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js");
|
||
/* harmony import */ var _tools_forms_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/forms.js */ "./src/tools/forms.js");
|
||
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../tools/main */ "../tools/main.js");
|
||
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_5__);
|
||
/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tools/users.js */ "./src/tools/users.js");
|
||
/* harmony import */ var _tools_webportage_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./tools/webportage.js */ "./src/tools/webportage.js");
|
||
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
||
|
||
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
||
|
||
// -- GESTION DES FORMULAIRES PERMETTANT AUX UTILISATEURS DE METTRE À JOUR LEURS INFORMATIONS + LEUR ABONNEMENT
|
||
/// Vérifier que l'utilisateur est bien connecté, a le bon statut et le rediriger vers le formulaire d'inscription si ce n'est pas le cas.
|
||
/// Si c'est ok, on récupère les infos de son compte et son abonnement et les affiche dans le formulaire.
|
||
/// Une information est affichée concernant la possibilité de parrainage et liste les filleuls existants.
|
||
/// Un menu permet à l'utilisateur d'accéder à la modification de ses infos, etc.
|
||
/// Des boutons de paiement sont aussi affichés suivant le choix de l'utilisateur pour lui permettre de prolonger son abonnement.
|
||
/// Un message venant d'une autre page peut aussi être à afficher lors du premier chargement.
|
||
// Fichier de configuration côté client :
|
||
|
||
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"); // besoin de toutes les déclarations pour la fonction : updateAccountLink()
|
||
|
||
|
||
var _require = __webpack_require__(/*! ../../config/instance */ "../config/instance.js"),
|
||
beginCodeGodfather = _require.beginCodeGodfather;
|
||
|
||
var configUsers = __webpack_require__(/*! ../../config/users */ "../config/users.js"); // besoin de tous le fichier pour configurer le formulaire
|
||
// Fonctions utiles au script
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
// Spécifique WebPortage pour paiements:
|
||
|
||
// Dictionnaires :
|
||
|
||
var _require2 = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + lang + "/general"),
|
||
serverError = _require2.serverError;
|
||
|
||
var _require3 = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/user$")("./" + lang + "/user"),
|
||
infosUserNbGodChilds = _require3.infosUserNbGodChilds,
|
||
infosUserNoGodchilds = _require3.infosUserNoGodchilds,
|
||
needBeConnected = _require3.needBeConnected;
|
||
|
||
var _require4 = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/subscription$")("./" + lang + "/subscription"),
|
||
infosExpirated = _require4.infosExpirated,
|
||
infosNbDays = _require4.infosNbDays; // Principaux éléments du DOM manipulés :
|
||
|
||
|
||
var divCrash = document.getElementById("crash");
|
||
var divMain = document.getElementById("main-content");
|
||
var divMessage = document.getElementById("message");
|
||
var divResponse = document.getElementById("response");
|
||
var divGodchilds = document.getElementById("godchilds");
|
||
var divSubscribeIntro = document.getElementById("subscribeIntro");
|
||
var formAccount = document.getElementById("accountUpdate");
|
||
var newPassword = document.getElementById("newPassword");
|
||
var showGFEmail = document.getElementById("godfatherEmail");
|
||
var showGFCode = document.getElementById("godfatherCode");
|
||
Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["helloDev"])();
|
||
|
||
var initialise = /*#__PURE__*/function () {
|
||
var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
|
||
var isConnected, user, getInfos, abo9, abo18, abo36, abo54, CGV, divWPBtns, xhrGetGodchilds;
|
||
return regeneratorRuntime.wrap(function _callee$(_context) {
|
||
while (1) {
|
||
switch (_context.prev = _context.next) {
|
||
case 0:
|
||
_context.prev = 0;
|
||
_context.next = 3;
|
||
return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_6__["checkSession"])(["user"], "/" + configTemplate.connectionPage, {
|
||
message: needBeConnected,
|
||
color: "error"
|
||
}, window.location);
|
||
|
||
case 3:
|
||
isConnected = _context.sent;
|
||
|
||
if (isConnected) {
|
||
divMain.style.display = "block"; // l'éventuelle ancre est ignorée, car absente du DOM avant d'avoir vérifié la connexion
|
||
|
||
if (window.location.hash !== undefined) window.location.assign(window.location.hash);
|
||
|
||
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, configTemplate); // Initialise le formulaire permettant de mettre à jour les infos :
|
||
|
||
Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(configUsers, formAccount); // Certains navigateurs remplissent les champs password :
|
||
|
||
newPassword.value = ""; // Fonction affichant les infos connues au premier affichage, puis après envoi mise à jour
|
||
|
||
getInfos = function getInfos() {
|
||
var xhrGetInfos = new XMLHttpRequest();
|
||
xhrGetInfos.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + configUsers.userRoutes + configUsers.getUserInfos + user.id);
|
||
|
||
xhrGetInfos.onreadystatechange = function () {
|
||
if (this.readyState == XMLHttpRequest.DONE) {
|
||
var response = JSON.parse(this.responseText);
|
||
|
||
if (this.status === 200 && response.User != undefined && response.Subscription != undefined) {
|
||
for (var data in response.User) {
|
||
if (formAccount.elements[data] !== undefined) {
|
||
if (response.User[data] !== true && response.User[data] !== false) // booléen = case à cocher !
|
||
formAccount.elements[data].value = response.User[data];else if (response.User[data] == true) // si false, on ne fait rien
|
||
formAccount.elements["" + data].checked = "checked";
|
||
}
|
||
} // infos de l'abonnement
|
||
|
||
|
||
if (response.Subscription.noticeOk == true) formAccount.elements["noticeOk"].checked = "checked"; // jours de réception
|
||
|
||
for (var i in response.Subscription.receiptDays) {
|
||
formAccount.elements["d" + response.Subscription.receiptDays[i]].checked = "checked";
|
||
} // "codes" possibles à transmettre pour parrainer d'autres utilisateurs
|
||
|
||
|
||
showGFEmail.innerHTML = response.User.email;
|
||
showGFCode.innerHTML = beginCodeGodfather + response.User.id;
|
||
}
|
||
|
||
var beginSubTS = new Date(response.Subscription.createdAt).getTime();
|
||
var nbDaysOk = response.Subscription.numberOfDays - Math.round((Date.now() - beginSubTS) / 1000 / 3600 / 24);
|
||
if (nbDaysOk > 0) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divSubscribeIntro, "p", infosNbDays.replace("NB_DAYS", nbDaysOk), "", ["info"]);else {
|
||
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divSubscribeIntro, "p", infosExpirated.replace("NB_DAYS", nbDaysOk), "", ["error"]);
|
||
window.location.assign("#subscribe");
|
||
}
|
||
}
|
||
};
|
||
|
||
xhrGetInfos.setRequestHeader("Authorization", "Bearer " + user.token);
|
||
xhrGetInfos.send();
|
||
}; // Remonte les infos déjà enregistrées :
|
||
|
||
|
||
getInfos(); // Traitement de l'envoi d'une mise à jour des infos
|
||
|
||
formAccount.addEventListener("submit", function (e) {
|
||
e.preventDefault();
|
||
divResponse.innerHTML = "";
|
||
var datas = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["getDatasFromInputs"])(formAccount); // recomposition des jours valables pour l'abonnement :
|
||
|
||
datas.receiptDays = "";
|
||
|
||
for (var i = 1; i <= 7; i++) {
|
||
if (datas["d" + i] !== undefined) datas.receiptDays += "" + i;
|
||
}
|
||
|
||
if (datas.noticeOk === undefined) datas.noticeOk = "false";
|
||
if (datas.newsletterOk === undefined) datas.newsletterOk = "false";
|
||
datas.timeDifference = Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_6__["getTimeDifference"])();
|
||
var xhrUserUpdate = new XMLHttpRequest();
|
||
if (datas.deleteOk !== undefined) xhrUserUpdate.open("DELETE", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + configUsers.userRoutes + "/" + user.id);else xhrUserUpdate.open("PUT", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + configUsers.userRoutes + configUsers.updateUserInfos + user.id);
|
||
|
||
xhrUserUpdate.onreadystatechange = function () {
|
||
if (this.readyState == XMLHttpRequest.DONE) {
|
||
var response = JSON.parse(this.responseText);
|
||
|
||
if (this.status === 200 && response.message != undefined) {
|
||
if (Array.isArray(response.message)) response.message = response.message.join("<br>");else response.message = response.message;
|
||
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", response.message, "", ["success"]);
|
||
} else if (response.errors) {
|
||
if (Array.isArray(response.errors)) response.errors = response.errors.join("<br>");else response.errors = 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", serverError, "", ["error"]); // dans tous les cas, je mets à jour le contenu du formulaire :
|
||
|
||
|
||
getInfos();
|
||
}
|
||
};
|
||
|
||
xhrUserUpdate.setRequestHeader("Content-Type", "application/json");
|
||
xhrUserUpdate.setRequestHeader("Authorization", "Bearer " + user.token);
|
||
|
||
if (datas) {
|
||
datas.output = "html";
|
||
xhrUserUpdate.send(JSON.stringify(datas));
|
||
}
|
||
}); // on passe à la caisse ?
|
||
|
||
abo9 = document.getElementById("abo9");
|
||
abo18 = document.getElementById("abo18");
|
||
abo36 = document.getElementById("abo36");
|
||
abo54 = document.getElementById("abo54");
|
||
CGV = document.getElementById("CGVOk");
|
||
divWPBtns = document.getElementById("WPBtns");
|
||
divWPBtns.style.display = "none";
|
||
abo9.addEventListener("change", function (e) {
|
||
Object(_tools_webportage_js__WEBPACK_IMPORTED_MODULE_7__["unCheckAllOthers"])("abo9");
|
||
});
|
||
abo18.addEventListener("change", function (e) {
|
||
Object(_tools_webportage_js__WEBPACK_IMPORTED_MODULE_7__["unCheckAllOthers"])("abo18");
|
||
});
|
||
abo36.addEventListener("change", function (e) {
|
||
Object(_tools_webportage_js__WEBPACK_IMPORTED_MODULE_7__["unCheckAllOthers"])("abo36");
|
||
});
|
||
abo54.addEventListener("change", function (e) {
|
||
Object(_tools_webportage_js__WEBPACK_IMPORTED_MODULE_7__["unCheckAllOthers"])("abo54");
|
||
});
|
||
CGV.addEventListener("change", function (e) {
|
||
if (CGV.checked === true) {
|
||
divWPBtns.style.display = "block";
|
||
if (abo9.checked === true) Object(_tools_webportage_js__WEBPACK_IMPORTED_MODULE_7__["showBtnPayment"])("btn9");else if (abo18.checked === true) Object(_tools_webportage_js__WEBPACK_IMPORTED_MODULE_7__["showBtnPayment"])("btn18");else if (abo36.checked === true) Object(_tools_webportage_js__WEBPACK_IMPORTED_MODULE_7__["showBtnPayment"])("btn36");else if (abo54.checked === true) Object(_tools_webportage_js__WEBPACK_IMPORTED_MODULE_7__["showBtnPayment"])("btn54");else {
|
||
divWPBtns.style.display = "none";
|
||
CGV.checked = false;
|
||
}
|
||
} else divWPBtns.style.display = "none";
|
||
}); // Liste des filleuls, si il y en a
|
||
|
||
xhrGetGodchilds = new XMLHttpRequest();
|
||
xhrGetGodchilds.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + configUsers.userRoutes + configUsers.getGodChilds);
|
||
|
||
xhrGetGodchilds.onreadystatechange = function () {
|
||
if (this.readyState == XMLHttpRequest.DONE) {
|
||
var response = JSON.parse(this.responseText),
|
||
txtGodchilds = "";
|
||
|
||
if (this.status === 200) {
|
||
var nbGodchilds = response.length;
|
||
if (nbGodchilds === 0) txtGodchilds = infosUserNoGodchilds;else {
|
||
txtGodchilds = infosUserNbGodChilds.replace("#NB", nbGodchilds);
|
||
|
||
for (var i in response) {
|
||
txtGodchilds += response[i].name + " (" + response[i].email + ") ";
|
||
}
|
||
}
|
||
}
|
||
|
||
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divGodchilds, "p", txtGodchilds, "", ["info"]);
|
||
}
|
||
};
|
||
|
||
xhrGetGodchilds.setRequestHeader("Authorization", "Bearer " + user.token);
|
||
xhrGetGodchilds.send();
|
||
}
|
||
|
||
_context.next = 11;
|
||
break;
|
||
|
||
case 7:
|
||
_context.prev = 7;
|
||
_context.t0 = _context["catch"](0);
|
||
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divCrash, "p", serverError, "", ["error"]);
|
||
console.error(_context.t0);
|
||
|
||
case 11:
|
||
case "end":
|
||
return _context.stop();
|
||
}
|
||
}
|
||
}, _callee, null, [[0, 7]]);
|
||
}));
|
||
|
||
return function initialise() {
|
||
return _ref.apply(this, arguments);
|
||
};
|
||
}();
|
||
|
||
initialise();
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/tools/clientstorage.js":
|
||
/*!************************************!*\
|
||
!*** ./src/tools/clientstorage.js ***!
|
||
\************************************/
|
||
/*! exports provided: saveLocaly, getLocaly, removeLocaly */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveLocaly", function() { return saveLocaly; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaly", function() { return getLocaly; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeLocaly", function() { return removeLocaly; });
|
||
// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.)
|
||
// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie
|
||
var saveLocaly = function saveLocaly(name, data) {
|
||
localStorage.setItem(name, JSON.stringify(data));
|
||
};
|
||
var getLocaly = function getLocaly(name) {
|
||
var json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
||
if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name);
|
||
};
|
||
var removeLocaly = function removeLocaly(name) {
|
||
localStorage.removeItem(name);
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/tools/dom.js":
|
||
/*!**************************!*\
|
||
!*** ./src/tools/dom.js ***!
|
||
\**************************/
|
||
/*! exports provided: addElement */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addElement", function() { return addElement; });
|
||
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js");
|
||
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);
|
||
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
||
|
||
// Fonction associant les attributs fournis à un champ de formulaire
|
||
|
||
var addElement = function addElement(eltParent, eltType) {
|
||
var eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "";
|
||
var eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "";
|
||
var eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : [];
|
||
var eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
|
||
var replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true;
|
||
if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltType) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltParent)) return false;else {
|
||
var newElement = document.createElement(eltType);
|
||
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ?
|
||
newElement.id = eltId;
|
||
|
||
if (Array.isArray(eltClass) && eltClass.length != 0) {
|
||
for (var i in eltClass) {
|
||
newElement.classList.add(eltClass[i]);
|
||
}
|
||
}
|
||
|
||
if (_typeof(eltAttributes) === "object") // !! tous les objets ne sont pas ok
|
||
{
|
||
for (var attributName in eltAttributes) {
|
||
newElement.setAttribute(attributName, eltAttributes[attributName]);
|
||
}
|
||
}
|
||
|
||
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltContent)) newElement.innerHTML = eltContent.replace(/\n/g, "<br>"); // 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/users.js":
|
||
/*!****************************!*\
|
||
!*** ./src/tools/users.js ***!
|
||
\****************************/
|
||
/*! exports provided: 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__, "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");
|
||
|
||
|
||
|
||
|
||
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 _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
|
||
var status,
|
||
urlRedirection,
|
||
message,
|
||
urlWanted,
|
||
_args = arguments;
|
||
return regeneratorRuntime.wrap(function _callee$(_context) {
|
||
while (1) {
|
||
switch (_context.prev = _context.next) {
|
||
case 0:
|
||
status = _args.length > 0 && _args[0] !== undefined ? _args[0] : [];
|
||
urlRedirection = _args.length > 1 ? _args[1] : undefined;
|
||
message = _args.length > 2 ? _args[2] : undefined;
|
||
urlWanted = _args.length > 3 ? _args[3] : undefined;
|
||
return _context.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 _context.stop();
|
||
}
|
||
}
|
||
}, _callee);
|
||
}));
|
||
|
||
return function checkSession() {
|
||
return _ref.apply(this, arguments);
|
||
};
|
||
}(); // Cette fonction sert à la précédente en cas de connexion non valide
|
||
|
||
var redirectUser = function redirectUser(urlRedirection, message, urlWanted) {
|
||
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(message)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("message", message);
|
||
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlWanted)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("url", urlWanted);
|
||
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlRedirection)) window.location.assign(urlRedirection);
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/tools/webportage.js":
|
||
/*!*********************************!*\
|
||
!*** ./src/tools/webportage.js ***!
|
||
\*********************************/
|
||
/*! exports provided: unCheckAllOthers, showBtnPayment */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "unCheckAllOthers", function() { return unCheckAllOthers; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "showBtnPayment", function() { return showBtnPayment; });
|
||
var checkBoxes = {
|
||
"CGV": document.getElementById("CGVOk"),
|
||
"abo9": document.getElementById("abo9"),
|
||
"abo18": document.getElementById("abo18"),
|
||
"abo36": document.getElementById("abo36"),
|
||
"abo54": document.getElementById("abo54")
|
||
};
|
||
var divWPBtns = document.getElementById("WPBtns"); // Lorsque l'on sélectionne un montant, les autres options + les CGV sont désélectionnés
|
||
|
||
var unCheckAllOthers = function unCheckAllOthers(choice) {
|
||
for (var id in checkBoxes) {
|
||
if (id !== choice) checkBoxes[id].checked = false;
|
||
divWPBtns.style.display = "none";
|
||
}
|
||
};
|
||
var btns = {
|
||
"btn9": document.getElementById("WPBtn9"),
|
||
"btn18": document.getElementById("WPBtn18"),
|
||
"btn36": document.getElementById("WPBtn36"),
|
||
"btn54": document.getElementById("WPBtn54")
|
||
}; // Affiche le bon bouton de paiement et cache les autres
|
||
|
||
var showBtnPayment = function showBtnPayment(choice) {
|
||
for (var id in btns) {
|
||
if (id !== choice) btns[id].style.display = "none";else btns[id].style.display = "block";
|
||
}
|
||
};
|
||
|
||
/***/ })
|
||
|
||
/******/ });
|
||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9nZW5lcmFsJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3N1YnNjcmlwdGlvbiQiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC91c2VyJCIsIndlYnBhY2s6Ly8vLi4vbGFuZy9mci9nZW5lcmFsLmpzIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL3N1YnNjcmlwdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi4vbGFuZy9mci91c2VyLmpzIiwid2VicGFjazovLy8uLi90b29scy9tYWluLmpzIiwid2VicGFjazovLy8uLi92aWV3cyBzeW5jIF5cXC5cXC8uKlxcLmpzJCIsIndlYnBhY2s6Ly8vLi4vdmlld3MvZGVmYXVsdC9jb25maWcvZnIuanMiLCJ3ZWJwYWNrOi8vLy4uL3ZpZXdzL3dpa2lsZXJuaS9jb25maWcvZnIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FjY291bnRVc2VyLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy9jbGllbnRzdG9yYWdlLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy9kb20uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2V2ZXJ5d2hlcmUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2Zvcm1zLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy91c2Vycy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvd2VicG9ydGFnZS5qcyJdLCJuYW1lcyI6WyJ1c2VycyIsInJlcXVpcmUiLCJxdWVzdGlvbm5haXJlcyIsIm1vZHVsZSIsImV4cG9ydHMiLCJhcGlVcmwiLCJzaXRlVXJsIiwiYWRtaW5OYW1lIiwiYWRtaW5FbWFpbCIsInNlbmRlck5hbWUiLCJzZW5kZXJFbWFpbCIsImFkbWluTGFuZyIsInRoZW1lIiwiYXZhaWxhYmxlTGFuZ3MiLCJzaXRlTmFtZSIsImJlZ2luQ29kZUdvZGZhdGhlciIsImRlZmF1bHRSZWNlaXB0RGF5cyIsImNyb25UaW1pbmdBbGVydEluU2Vjb25kZSIsInJlc3BvbnNlVGltaW5nQWxlcnRJblNlY29uZGUiLCJ0b2tlblNpZ251cFZhbGlkYXRpb25UaW1lSW5Ib3VycyIsInRva2VuTG9naW5MaW5rVGltZUluSG91cnMiLCJ0b2tlbkNvbm5leGlvbk1pblRpbWVJbkhvdXJzIiwidG9rZW5Db25uZXhpb25NYXhUaW1lSW5EYXlzIiwidG9rZW5Mb2dpbkNoYW5naW5nVGltZUluSG91cnMiLCJ0b2tlbkRlbGV0ZVVzZXJUaW1lSW5Ib3VycyIsInRva2VuVW5zdWJzY3JpYmVMaW5rVGltZUluRGF5cyIsImZyZWVBY2NvdW50VGltaW5nSW5EYXlzIiwiZnJlZUFjY291bnRFeHBpcmF0aW9uTm90aWZpY2F0aW9uSW5EYXlzIiwiYWNjb3VudEV4cGlyYXRpb25GaXJzdE5vdGlmaWNhdGlvbkluRGF5cyIsImFjY291bnRFeHBpcmF0aW9uU2Vjb25kTm90aWZpY2F0aW9uSW5EYXlzIiwiaW5hY3RpdmVBY2NvdW50VGltZVRvRGVsZXRlSW5EYXlzIiwibmJRdWVzdGlvbnNNaW4iLCJuYlF1ZXN0aW9uc01heCIsIm5iQ2hvaWNlc01heCIsIm5iTmV3UXVlc3Rpb25uYWlyZXMiLCJob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVCZWdpbiIsImhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUVuZCIsIm51bWJlck5ld1F1ZXN0aW9ubmFpcmVBdFNhbWVUaW1lIiwibWluU2VhcmNoUXVlc3Rpb25uYWlyZXMiLCJmaWVsZE5ld1F1ZXN0aW9ubmFpcmVzIiwibmJJbGx1c3RyYXRpb25zTWluIiwibmJJbGx1c3RyYXRpb25zTWF4IiwibWF4SWxsdXN0cmF0aW9uU2l6ZWluT2N0ZXQiLCJtaW1lVHlwZXNGb3JJbGx1c3RyYXRpb24iLCJpbGx1c3RyYXRpb25zV2lkdGhNYXhJblB4IiwiaWxsdXN0cmF0aW9uc01pbmlhdHVyZXNXaWR0aE1heEluUHgiLCJuYkxpbmtzTWluIiwibmJMaW5rc01heCIsInBhc3N3b3JkIiwibWlubGVuZ3RoIiwiZGlyQ2FjaGVVc2VycyIsImRpckNhY2hlVXNlcnNBbnN3ZXJzIiwiZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyIsImRpckNhY2hlUXVlc3Rpb25zIiwiZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzIiwiZGlySFRNTFF1ZXN0aW9ubmFpcmUiLCJkaXJXZWJRdWVzdGlvbm5haXJlIiwicXVlc3Rpb25uYWlyZVJvdXRlcyIsImdldFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlcyIsInB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJzYXZlQW5zd2Vyc1JvdXRlIiwiZ2V0U3RhdHNRdWVzdGlvbm5haXJlcyIsInNlYXJjaFF1ZXN0aW9ubmFpcmVzUm91dGUiLCJnZXRSYW5kb21RdWVzdGlvbm5haXJlc1JvdXRlIiwic2VhcmNoQWRtaW5RdWVzdGlvbm5haXJlc1JvdXRlIiwiZ2V0TGlzdE5leHRRdWVzdGlvbm5haXJlcyIsInJlZ2VuZXJhdGVIVE1MIiwicXVlc3Rpb25zUm91dGUiLCJ0YWdzU2VhcmNoUm91dGUiLCJnZXRRdWVzdGlvbm5haXJlc1dpdGhvdXRBbnN3ZXIiLCJnZXRQcmV2aW91c0Fuc3dlcnMiLCJnZXRTdGF0c0Fuc3dlcnMiLCJnZXRBZG1pblN0YXRzIiwiUXVlc3Rpb25uYWlyZSIsInRpdGxlIiwibWF4bGVuZ3RoIiwicmVxdWlyZWQiLCJzbHVnIiwiaW50cm9kdWN0aW9uIiwic2VhcmNoUXVlc3Rpb25uYWlyZXMiLCJRdWVzdGlvbiIsInRleHQiLCJyYW5rIiwibWluIiwiZGVmYXVsdFZhbHVlIiwiQ2hvaWNlIiwic2VhcmNoIiwibmJUYWdzTWluIiwibmJUYWdzTWF4IiwiZGlyQ2FjaGVUYWdzIiwiZGlySFRNTFRhZ3MiLCJkaXJXZWJUYWdzIiwibmJSYW5kb21SZXN1bHRzIiwidXNlclJvdXRlcyIsImNoZWNrRGVsZXRlTGlua1JvdXRlIiwiY2hlY2tJZklzRW1haWxmcmVlUm91dGUiLCJjaGVja0xvZ2luUm91dGUiLCJjaGVja05ld0xvZ2luTGlua1JvdXRlIiwiY2hlY2tTdWJzY3JpYmVUb2tlblJvdXRlIiwiY29ubmVjdGlvblJvdXRlIiwiY29ubmVjdGlvbldpdGhMaW5rUm91dGUiLCJjcmVhdGVVc2VyUm91dGUiLCJnZXRHb2RDaGlsZHMiLCJnZXRHb2RmYXRoZXJSb3V0ZSIsImdldExvZ2luTGlua1JvdXRlIiwiZ2V0UGF5bWVudHMiLCJnZXRVc2VySW5mb3MiLCJzZWFyY2hVc2VyUm91dGUiLCJzdWJzY3JpYmVSb3V0ZSIsInVuc3Vic2NyaWJlUm91dGUiLCJ1cGRhdGVVc2VySW5mb3MiLCJ2YWxpZGF0ZVVzZXJSb3V0ZSIsIm5hbWUiLCJlbWFpbCIsIm5ld1Bhc3N3b3JkIiwiY29kZUdvZGZhdGhlciIsImNndU9rIiwidmFsdWUiLCJ0aW1lRGlmZmVyZW5jZU1pbiIsInRpbWVEaWZmZXJlbmNlTWF4IiwiZGlyQ2FjaGVVc2Vyc1dpdGhvdXRBbnN3ZXJzIiwiYWRkQnRuVHh0IiwiYWRkT2tNZXNzYWdlIiwiYWxlcnROZXdXaW5kb3ciLCJiYWRVcmwiLCJidG5MaW5rVG9RdWVzdGlvbm5haXJlIiwiZGVsZXRlQnRuVHh0IiwiZGVsZXRlT2tNZXNzYWdlIiwiZmFpbEF1dGgiLCJmYWlsQXV0aENyb24iLCJmYWlsQXV0aEhlYWRlciIsImZhaWxBdXRoSWQiLCJmYWlsQXV0aFRva2VuIiwibmVlZGVkUGFyYW1zIiwibmV4dFBhZ2UiLCJub3RBbGxvd2VkIiwibm90UmVxdWlyZWQiLCJub3RWYWxpZEZvcm1hdCIsInByZXZpb3VzUGFnZSIsInNlcnZlckVycm9yIiwic2VydmVyRXJyb3JBZG1pbiIsInNpdGVIVE1MVGl0bGUiLCJzaXRlTWV0YURlc2NyaXB0aW9uIiwic2NyaXB0VGltaW5nQWxlcnQiLCJzY3JpcHRUaW1pbmdJbmZvIiwic3RhdHNBZG1pbiIsInVwZGF0ZUJ0blR4dCIsInVwZGF0ZU9rTWVzc2FnZSIsImFsbFN1YnNjcmlwdGlvblByb2Nlc3NlZCIsImluZm9zRXhwaXJhdGVkIiwiaW5mb3NFeHBpcmF0ZWRBZG1pbiIsImluZm9zTmJEYXlzIiwiaW5mb3NOYkRheXNBZG1pbiIsImluZm9zUGF5bWVudHNBZG1pbiIsImlzTm90VmFsaWRlZCIsIm1haWxFbmRGcmVlVGltZUJvZHlIVE1MIiwibWFpbEVuZEZyZWVUaW1lQm9keVR4dCIsIm1haWxFbmRGcmVlVGltZUxpbmtUeHQiLCJtYWlsRW5kRnJlZVRpbWVNZXNzYWdlIiwibWFpbEVuZEZyZWVUaW1lU3ViamVjdCIsIm1haWxFeHBpcmF0aW9uQm9keUhUTUwiLCJtYWlsRXhwaXJhdGlvbkJvZHlUeHQiLCJtYWlsRXhwaXJhdGlvbkxpbmtUeHQiLCJtYWlsRXhwaXJhdGlvbk1lc3NhZ2UiLCJtYWlsRXhwaXJhdGlvblJlbGF1bmNoVHh0IiwibWFpbEV4cGlyYXRpb25TdWJqZWN0IiwibWFpbE5ld1F1ZXN0aW9ubmFpcmVCb2R5VHh0IiwibWFpbFN0b3BNYWlsTGlua1R4dCIsIm5lZWRLbm93SWZOb3RpY2VPayIsIm5lZWRJbnRlZ2VyTnVtYmVyT2ZEYXlzIiwibmVlZE1pbk51bWJlck9mRGF5cyIsIm5lZWROb3RUb29Mb25nRGF5c0xpc3QiLCJuZWVkTnVtYmVyT2ZEYXlzIiwibmVlZFVuaXF1ZURheXNMaXN0IiwibmVlZFZhbGlkRGF5c0xpc3QiLCJub05ld1F1ZXN0aW9ubmFpcmVGb3JVc2VyIiwidW5zdWJzY3JpcHRpb25PayIsInVuc3Vic2NyaXB0aW9uRmFpbCIsImFscmVhZHlDb25uZWN0ZWQiLCJiYWRMaW5rVmFsaWRhdGlvbk1lc3NhZ2UiLCJiYWRQYXNzd29yZCIsImJ5ZWJ5ZU1lc3NhZ2UiLCJjb25uZWN0aW9uT2siLCJjcmVhdGlvbk9rTWVzc2FnZSIsImNyb25EZWxldGVVbnZhbGlkZWRVc2Vyc01lc3NhZ2UiLCJkZWxldGVGYWlsTWVzc2FnZSIsImRlbGV0ZUluYWN0aXZlVXNlcnNNZXNzYWdlIiwiZW1haWxOb3RGb3VuZCIsImdvZGZhdGhlckZvdW5kIiwiZ29kZmF0aGVyTm90Rm91bmQiLCJpbmZvc0FkbWluR29kZmF0aGVyIiwiaW5mb3NBZG1pbk5iR29kQ2hpbGRzIiwiaW5mb3NVc2VyRm9yQWRtaW4iLCJpbmZvc1VzZXJOYkdvZENoaWxkcyIsImluZm9zVXNlck5vR29kY2hpbGRzIiwibWFpbERlbGV0ZUJvZHlIVE1MIiwibWFpbERlbGV0ZUJvZHlUeHQiLCJtYWlsRGVsZXRlTGlua0FscmVhZHlNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtGYWlsTWVzc2FnZSIsIm1haWxEZWxldGVMaW5rTWVzc2FnZSIsIm1haWxEZWxldGVMaW5rT2tNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtUeHQiLCJtYWlsRGVsZXRlU3ViamVjdCIsIm1haWxMb2dpbkxpbmtCb2R5SFRNTCIsIm1haWxMb2dpbkxpbmtCb2R5VHh0IiwibWFpbExvZ2luTGlua01lc3NhZ2UiLCJtYWlsTG9naW5MaW5rU3ViamVjdCIsIm1haWxMb2dpbkxpbmtUeHQiLCJtYWlsVGhhbmtHb2RmYXRoZXJCb2R5SFRNTCIsIm1haWxUaGFua0dvZGZhdGhlckJvZHlUeHQiLCJtYWlsVGhhbmtHb2RmYXRoZXJMaW5rVHh0IiwibWFpbFRoYW5rR29kZmF0aGVyU3ViamVjdCIsIm1haWxVcGRhdGVMb2dpbkJvZHlIVE1MIiwibWFpbFVwZGF0ZUxvZ2luQm9keVR4dCIsIm1haWxVcGRhdGVMb2dpbkxpbmtNZXNzYWdlIiwibWFpbFVwZGF0ZUxvZ2luTGlua1R4dCIsIm1haWxVcGRhdGVMb2dpbk9rTWVzc2FnZSIsIm1haWxVcGRhdGVMb2dpblN1YmplY3QiLCJtYWlsVmFsaWRhdGlvbkxpbmtTQm9keUhUTUwiLCJtYWlsVmFsaWRhdGlvbkxpbmtTQm9keVR4dCIsIm1haWxWYWxpZGF0aW9uTGlua1N1YmplY3QiLCJtYWlsVmFsaWRhdGlvbkxpbmtUeHQiLCJtYWlsVmFsaWRhdGlvbk1lc3NhZ2UiLCJtYWlsV2VsY29tZUJvZHlIVE1MIiwibWFpbFdlbGNvbWVCb2R5VHh0IiwibWFpbFdlbGNvbWVMaW5rVHh0IiwibWFpbFdlbGNvbWVTdWJqZWN0IiwibmVlZEJlQ29ubmVjdGVkIiwibmVlZENob29zZUxvZ2luV2F5IiwibmVlZEVtYWlsIiwibmVlZEtub3dOZXdzbGV0dGVyT2siLCJuZWVkTGFuZ3VhZ2UiLCJuZWVkTG9uZ1Bhc3NXb3JkIiwibmVlZE1heFRpbWVEaWZmZXJlbmNlIiwibmVlZE1pblRpbWVEaWZmZXJlbmNlIiwibmVlZE5hbWUiLCJuZWVkTm90VG9vTG9uZ05hbWUiLCJuZWVkTm90VG9vTG9uZ0VtYWlsIiwibmVlZFBhc3NXb3JkIiwibmVlZFNNVFAiLCJuZWVkU01UUE5vdEZvdW5kIiwibmVlZFN0YXR1cyIsIm5lZWRUaW1lRGlmZmVyZW5jZSIsIm5lZWRVR0NPayIsIm5lZWRVbmlxdWVFbWFpbCIsIm5lZWRWYWxpZGF0aW9uVG9Mb2dpbiIsIm5lZWRWYWxpZExhc3RDb25uZWN0aW9uRGF0ZSIsInBhc3N3b3JkQ29waWVkIiwic2VhcmNoVXNlcnNXaXRob3V0UmVzdWx0IiwidG9vTWFueUxvZ2luRmFpbHMiLCJ1cGRhdGVkRmFpbGVkR29kZmF0aGVyTm90Rm91bmQiLCJ1cGRhdGVkTmVlZEdvb2RFbWFpbCIsInVwZGF0ZWROZWVkR29vZEdvZGZhdGhlciIsInVwZGF0ZWROZWVkVW5pcXVlRW1haWwiLCJ1cGRhdGVkTmVlZFZhbGlkYXRlZFVzZXIiLCJ1cGRhdGVkT2tNZXNzYWdlIiwidmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlIiwidmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlQWRtaW4iLCJ2YWxpZGF0aW9uTWVzc2FnZSIsInZhbGlkYXRpb25NZXNzYWdlQWRtaW4iLCJ3ZWxjb21lTWVzc2FnZSIsIlRvb2wiLCJteVZhciIsInVuZGVmaW5lZCIsInRyaW0iLCJteVN0cmluZyIsImlzRW1wdHkiLCJtYXgiLCJsZW5ndGgiLCJzdWJzdHJpbmciLCJtYXBPYmoiLCJyZXBsYWNlRWx0cyIsIlJlZ0V4cCIsIk9iamVjdCIsImtleXMiLCJqb2luIiwicmVwbGFjZSIsIm1hdGNoZWQiLCJNYXRoIiwiY2VpbCIsImZsb29yIiwicmFuZG9tIiwiZGF0ZVN0cmluZyIsImxhbmciLCJteURhdGUiLCJEYXRlIiwibXlEYXkiLCJnZXREYXRlIiwibXlNb3VudGgiLCJnZXRNb250aCIsIm15WWVhciIsImdldEZ1bGxZZWFyIiwiaGVhZExpbmtzIiwiYW5jaG9yIiwiYXR0cmlidXRlcyIsImhyZWYiLCJpZCIsImZvb3RMaW5rcyIsInJlbCIsIm1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlIiwidXNlckhvbWVQYWdlIiwiYWRtaW5Ib21lUGFnZSIsIm1hbmFnZXJIb21lUGFnZSIsInN1YnNjcmliZVBhZ2UiLCJjb25uZWN0aW9uUGFnZSIsImFjY291bnRQYWdlIiwicXVlc3Rpb25uYWlyZXNNYW5hZ2VtZW50UGFnZSIsInVzZXJzTWFuYWdlbWVudFBhZ2UiLCJuYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlIiwiaWxsdXN0cmF0aW9uRGlyIiwic2l0ZVNsb2dhbiIsImhvbWVUaXRsZTEiLCJob21lUDEiLCJob21lVGl0bGUyIiwiaG9tZVAyIiwibmV3UXVlc3Rpb25uYWlyZXNUaXRsZSIsIm5ld1F1ZXN0aW9ubmFpcmVzSW50cm8iLCJleHBsYW5hdGlvblRpdGxlIiwiZXhwbGFuYXRpb25UeHQiLCJub0pTTm90aWZpY2F0aW9uIiwidGFnc0xpc3RUeHQiLCJtYXhRdWVzdGlvbm5haXJlc1NpdGVIb21lUGFnZSIsInVzZXJIb21lUGFnZVR4dCIsInZhbGlkYXRpb25MaW5rUGFnZSIsImxvZ2luTGlua1BhZ2UiLCJuZXdMb2dpbkxpbmtQYWdlIiwiZGVsZXRlTGlua1BhZ2UiLCJzdG9wTWFpbFBhZ2UiLCJ1cGRhdGVBY2NvdW50UGFnZSIsImFib3V0UGFnZSIsImhvbWVQYWdlVHh0IiwiaG9tZUJ0bkFib3V0VHh0IiwiaG9tZUJ0blN1YnNjcmliZVR4dCIsInF1ZXN0aW9ubmFpcmVMaWNlbmNlVHh0IiwibmV3c0xpc3RUaXRsZSIsIm1haWxSZWNpcGllbnRUeHQiLCJ0d2l0dGVyQWNjb3VudCIsImNvbmZpZ1RlbXBsYXRlIiwiY29uZmlnVXNlcnMiLCJkaXZDcmFzaCIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJkaXZNYWluIiwiZGl2TWVzc2FnZSIsImRpdlJlc3BvbnNlIiwiZGl2R29kY2hpbGRzIiwiZGl2U3Vic2NyaWJlSW50cm8iLCJmb3JtQWNjb3VudCIsInNob3dHRkVtYWlsIiwic2hvd0dGQ29kZSIsImhlbGxvRGV2IiwiaW5pdGlhbGlzZSIsImNoZWNrU2Vzc2lvbiIsIm1lc3NhZ2UiLCJjb2xvciIsIndpbmRvdyIsImxvY2F0aW9uIiwiaXNDb25uZWN0ZWQiLCJzdHlsZSIsImRpc3BsYXkiLCJoYXNoIiwiYXNzaWduIiwiZ2V0TG9jYWx5IiwiYWRkRWxlbWVudCIsInJlbW92ZUxvY2FseSIsInVzZXIiLCJ1cGRhdGVBY2NvdW50TGluayIsInN0YXR1cyIsInNldEF0dHJpYnV0ZXNUb0lucHV0cyIsImdldEluZm9zIiwieGhyR2V0SW5mb3MiLCJYTUxIdHRwUmVxdWVzdCIsIm9wZW4iLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJyZWFkeVN0YXRlIiwiRE9ORSIsInJlc3BvbnNlIiwiSlNPTiIsInBhcnNlIiwicmVzcG9uc2VUZXh0IiwiVXNlciIsIlN1YnNjcmlwdGlvbiIsImRhdGEiLCJlbGVtZW50cyIsImNoZWNrZWQiLCJub3RpY2VPayIsImkiLCJyZWNlaXB0RGF5cyIsImlubmVySFRNTCIsImJlZ2luU3ViVFMiLCJjcmVhdGVkQXQiLCJnZXRUaW1lIiwibmJEYXlzT2siLCJudW1iZXJPZkRheXMiLCJyb3VuZCIsIm5vdyIsInNldFJlcXVlc3RIZWFkZXIiLCJ0b2tlbiIsInNlbmQiLCJhZGRFdmVudExpc3RlbmVyIiwiZSIsInByZXZlbnREZWZhdWx0IiwiZGF0YXMiLCJnZXREYXRhc0Zyb21JbnB1dHMiLCJuZXdzbGV0dGVyT2siLCJ0aW1lRGlmZmVyZW5jZSIsImdldFRpbWVEaWZmZXJlbmNlIiwieGhyVXNlclVwZGF0ZSIsImRlbGV0ZU9rIiwiQXJyYXkiLCJpc0FycmF5IiwiZXJyb3JzIiwib3V0cHV0Iiwic3RyaW5naWZ5IiwiYWJvOSIsImFibzE4IiwiYWJvMzYiLCJhYm81NCIsIkNHViIsImRpdldQQnRucyIsInVuQ2hlY2tBbGxPdGhlcnMiLCJzaG93QnRuUGF5bWVudCIsInhockdldEdvZGNoaWxkcyIsInR4dEdvZGNoaWxkcyIsIm5iR29kY2hpbGRzIiwiY29uc29sZSIsImVycm9yIiwic2F2ZUxvY2FseSIsImxvY2FsU3RvcmFnZSIsInNldEl0ZW0iLCJqc29uIiwiZ2V0SXRlbSIsInJlbW92ZUl0ZW0iLCJlbHRQYXJlbnQiLCJlbHRUeXBlIiwiZWx0Q29udGVudCIsImVsdElkIiwiZWx0Q2xhc3MiLCJlbHRBdHRyaWJ1dGVzIiwibmV3RWxlbWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc0xpc3QiLCJhZGQiLCJhdHRyaWJ1dE5hbWUiLCJzZXRBdHRyaWJ1dGUiLCJhcHBlbmRDaGlsZCIsImxvZyIsImxpbmsiLCJob21lUGFnZSIsImlucHV0c0NvbmYiLCJteUZvcm0iLCJpZElucHV0IiwiaW5wdXRIVE1MIiwiYXR0cmlidXRlIiwiZm9ybURhdGEiLCJGb3JtRGF0YSIsImVudHJpZXMiLCJlbnRyaWUiLCJlbXB5Rm9ybSIsInR5cGUiLCJlbXB5QW5kSGlkZUZvcm0iLCJ0aW1lTG9jYWwiLCJnZXRUaW1lem9uZU9mZnNldCIsImdldFBhc3N3b3JkIiwibmJDYXJNaW4iLCJuYkNhck1heCIsIm5iQ2FyIiwibGV0dGVycyIsIm90aGVycyIsInNldFNlc3Npb24iLCJ1c2VySWQiLCJkdXJhdGlvblRTIiwic3RvcmFnZVVzZXIiLCJkdXJhdGlvbiIsImNoZWNrQW5zd2VyRGF0YXMiLCJsYXN0QW5zd2VyIiwiYW5zd2VyIiwibmJDb3JyZWN0QW5zd2VycyIsIlF1ZXN0aW9ubmFpcmVJZCIsIm5iUXVlc3Rpb25zIiwidXJsUmVkaXJlY3Rpb24iLCJ1cmxXYW50ZWQiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInVzZXJEYXRhcyIsInJlZGlyZWN0VXNlciIsInhociIsIm9ubG9hZCIsImlzVmFsaWQiLCJsYW5ndWFnZSIsInVybEFjY291bnQiLCJpbmRleE9mIiwib25lcnJvciIsInN0YXR1c1RleHQiLCJjaGVja0JveGVzIiwiY2hvaWNlIiwiYnRucyJdLCJtYXBwaW5ncyI6IjtRQUFBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBOzs7UUFHQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMENBQTBDLGdDQUFnQztRQUMxRTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLHdEQUF3RCxrQkFBa0I7UUFDMUU7UUFDQSxpREFBaUQsY0FBYztRQUMvRDs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EseUNBQXlDLGlDQUFpQztRQUMxRSxnSEFBZ0gsbUJBQW1CLEVBQUU7UUFDckk7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwyQkFBMkIsMEJBQTBCLEVBQUU7UUFDdkQsaUNBQWlDLGVBQWU7UUFDaEQ7UUFDQTtRQUNBOztRQUVBO1FBQ0Esc0RBQXNELCtEQUErRDs7UUFFckg7UUFDQTs7O1FBR0E7UUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ2xGQSxJQUFNQSxLQUFLLEdBQUdDLG1CQUFPLENBQUMsbUNBQUQsQ0FBckI7O0FBQ0EsSUFBTUMsY0FBYyxHQUFHRCxtQkFBTyxDQUFDLHFEQUFELENBQTlCOztBQUVBRSxNQUFNLENBQUNDLE9BQVA7QUFFSUMsUUFBTSxFQUFFLDJCQUZaO0FBR0lDLFNBQU8sRUFBRSx1QkFIYjtBQUlJQyxXQUFTLEVBQUUsU0FKZjtBQUtJQyxZQUFVLEVBQUUsbUJBTGhCO0FBTUlDLFlBQVUsRUFBRSxtQkFOaEI7QUFPSUMsYUFBVyxFQUFFLHVCQVBqQjtBQVFJQyxXQUFTLEVBQUUsSUFSZjtBQVNJQyxPQUFLLEVBQUUsV0FUWDtBQVN3QjtBQUNwQkMsZ0JBQWMsRUFBRSxDQUFDLElBQUQsQ0FWcEI7QUFVMkI7QUFDdkJDLFVBQVEsRUFBRSxtQkFYZDtBQVlJQyxvQkFBa0IsRUFBRSxJQVp4QjtBQVk4QjtBQUMxQkMsb0JBQWtCLEVBQUUsS0FieEI7QUFhK0I7QUFDM0JDLDBCQUF3QixFQUFFLEdBZDlCO0FBY21DO0FBQy9CQyw4QkFBNEIsRUFBRSxDQWZsQztBQWVxQztBQUNqQ0Msa0NBQWdDLEVBQUUsS0FoQnRDO0FBZ0I2QztBQUN6Q0MsMkJBQXlCLEVBQUUsSUFqQi9CO0FBa0JJQyw4QkFBNEIsRUFBRSxLQWxCbEM7QUFtQklDLDZCQUEyQixFQUFFLFVBbkJqQztBQW9CSUMsK0JBQTZCLEVBQUUsSUFwQm5DO0FBb0J3QztBQUNwQ0MsNEJBQTBCLEVBQUUsSUFyQmhDO0FBc0JJQyxnQ0FBOEIsRUFBRSxRQXRCcEM7QUFzQjhDO0FBQzFDQyx5QkFBdUIsRUFBRSxFQXZCN0I7QUF3QklDLHlDQUF1QyxFQUFFLENBeEI3QztBQXlCSUMsMENBQXdDLEVBQUUsRUF6QjlDO0FBMEJJQywyQ0FBeUMsRUFBRSxDQTFCL0M7QUEyQklDLG1DQUFpQyxFQUFFLEdBM0J2QztBQTRCSTtBQUNBQyxnQkFBYyxFQUFFLENBN0JwQjtBQTZCdUI7QUFDbkJDLGdCQUFjLEVBQUUsQ0E5QnBCO0FBOEJ1QjtBQUNuQkMsY0FBWSxFQUFFLEVBL0JsQjtBQWdDSUMscUJBQW1CLEVBQUUsRUFoQ3pCO0FBZ0M0QjtBQUN4QkMsK0JBQTZCLEVBQUMsQ0FqQ2xDO0FBaUNxQztBQUNqQ0MsNkJBQTJCLEVBQUMsRUFsQ2hDO0FBa0NvQztBQUNoQ0Msa0NBQWdDLEVBQUUsRUFuQ3RDO0FBbUMwQztBQUN0Q0MseUJBQXVCLEVBQUUsQ0FwQzdCO0FBcUNJQyx3QkFBc0IsRUFBRyxjQXJDN0I7QUFxQzZDO0FBQ3pDO0FBQ0FDLG9CQUFrQixFQUFFLENBdkN4QjtBQXdDSUMsb0JBQWtCLEVBQUUsQ0F4Q3hCO0FBeUNJQyw0QkFBMEIsRUFBRSxPQXpDaEM7QUF5Q3dDO0FBQ3BDQywwQkFBd0IsRUFBRSxDQUFFLFdBQUYsRUFBZSxZQUFmLEVBQTZCLFdBQTdCLEVBQTBDLFdBQTFDLEVBQXVELFdBQXZELENBMUM5QjtBQTJDSTtBQUNBQywyQkFBeUIsRUFBRSxHQTVDL0I7QUE2Q0lDLHFDQUFtQyxFQUFFLEdBN0N6QztBQThDSTtBQUNBQyxZQUFVLEVBQUUsQ0EvQ2hCO0FBZ0RJQyxZQUFVLEVBQUU7QUFoRGhCLHNEQWtEb0IsQ0FsRHBCLHNEQW1Eb0IsQ0FuRHBCLG9EQW9Ea0IsRUFwRGxCLHlEQXNEdUIvQyxLQUFLLENBQUNnRCxRQUFOLENBQWVDLFNBdER0QyxxREF1RG1CakQsS0FBSyxDQUFDa0QsYUF2RHpCLDREQXdEMEJsRCxLQUFLLENBQUNtRCxvQkF4RGhDLDhEQXlENEJqRCxjQUFjLENBQUNrRCxzQkF6RDNDLHlEQTBEdUJsRCxjQUFjLENBQUNtRCxpQkExRHRDLG1FQTJEaUNuRCxjQUFjLENBQUNvRCwyQkEzRGhELDREQTREMEJwRCxjQUFjLENBQUNxRCxvQkE1RHpDLDJEQTZEeUJyRCxjQUFjLENBQUNzRCxtQkE3RHhDLG9COzs7Ozs7Ozs7OztBQ0hBckQsTUFBTSxDQUFDQyxPQUFQLEdBQ0E7QUFDSTtBQUNBcUQscUJBQW1CLEVBQUUsZ0JBRnpCO0FBR0lDLHdCQUFzQixFQUFFLE1BSDVCO0FBSUlDLDRCQUEwQixFQUFFLFVBSmhDO0FBS0lDLDhCQUE0QixFQUFFLFFBTGxDO0FBTUlDLGtCQUFnQixFQUFFLFVBTnRCO0FBT0lDLHdCQUFzQixFQUFHLFNBUDdCO0FBUUlDLDJCQUF5QixFQUFHLFNBUmhDO0FBU0lDLDhCQUE0QixFQUFHLFlBVG5DO0FBVUlDLGdDQUE4QixFQUFHLGNBVnJDO0FBV0lDLDJCQUF5QixFQUFFLDZCQVgvQjtBQVlJQyxnQkFBYyxFQUFFLGtCQVpwQjtBQWFJO0FBQ0FDLGdCQUFjLEVBQUUsWUFkcEI7QUFlSTtBQUNBQyxpQkFBZSxFQUFFLGVBaEJyQjtBQWlCSTtBQUNBQyxnQ0FBOEIsRUFBRSxzQkFsQnBDO0FBbUJJQyxvQkFBa0IsRUFBRSxnQkFuQnhCO0FBb0JJQyxpQkFBZSxFQUFHLHVCQXBCdEI7QUFxQklDLGVBQWEsRUFBRSxpQkFyQm5CO0FBc0JJO0FBQ0FDLGVBQWEsRUFDYjtBQUNJQyxTQUFLLEVBQUU7QUFBRUMsZUFBUyxFQUFFLEdBQWI7QUFBa0JDLGNBQVEsRUFBRTtBQUE1QixLQURYO0FBRUlDLFFBQUksRUFBRTtBQUFFRixlQUFTLEVBQUU7QUFBYixLQUZWO0FBRThCO0FBQzFCRyxnQkFBWSxFQUFFO0FBQUVGLGNBQVEsRUFBRTtBQUFaO0FBSGxCLEdBeEJKO0FBNkJJRyxzQkFBb0IsRUFBRztBQUFFL0IsYUFBUyxFQUFFLENBQWI7QUFBZ0I0QixZQUFRLEVBQUU7QUFBMUIsR0E3QjNCO0FBOEJJSSxVQUFRLEVBQ1I7QUFDSUMsUUFBSSxFQUFFO0FBQUVOLGVBQVMsRUFBRSxHQUFiO0FBQWtCQyxjQUFRLEVBQUU7QUFBNUIsS0FEVjtBQUVJTSxRQUFJLEVBQUU7QUFBRU4sY0FBUSxFQUFFLElBQVo7QUFBa0JPLFNBQUcsRUFBQyxDQUF0QjtBQUF5QkMsa0JBQVksRUFBQztBQUF0QztBQUZWLEdBL0JKO0FBbUNJQyxRQUFNLEVBQ047QUFDSUosUUFBSSxFQUFFO0FBQUVOLGVBQVMsRUFBRSxHQUFiO0FBQWtCQyxjQUFRLEVBQUU7QUFBNUI7QUFEVixHQXBDSjtBQXVDSVUsUUFBTSxFQUFFO0FBQUV0QyxhQUFTLEVBQUUsQ0FBYjtBQUFnQjRCLFlBQVEsRUFBRTtBQUExQixHQXZDWjs7QUF3Q0k7QUFDQTlDLGdCQUFjLEVBQUUsQ0F6Q3BCO0FBMENJQyxnQkFBYyxFQUFFLENBMUNwQjtBQTJDSUMsY0FBWSxFQUFFLEVBM0NsQjtBQTRDSXVELFdBQVMsRUFBRSxDQTVDZjtBQTZDSUMsV0FBUyxFQUFFLENBN0NmO0FBNkNrQjtBQUNkO0FBQ0FyQyx3QkFBc0IsRUFBRyxzQkEvQzdCO0FBZ0RJQyxtQkFBaUIsRUFBRyxnQ0FoRHhCO0FBaURJQyw2QkFBMkIsRUFBRyw0QkFqRGxDO0FBa0RJb0MsY0FBWSxFQUFHLDJCQWxEbkI7QUFtREluQyxzQkFBb0IsRUFBRyxtQkFuRDNCO0FBb0RJb0MsYUFBVyxFQUFHLG9CQXBEbEI7QUFxREluQyxxQkFBbUIsRUFBRyxNQXJEMUI7QUFxRGlDO0FBQzdCb0MsWUFBVSxFQUFHLFFBdERqQjtBQXNEMEI7QUFDdEJDLGlCQUFlLEVBQUcsQ0F2RHRCLENBdUR1Qjs7QUF2RHZCLENBREEsQzs7Ozs7Ozs7Ozs7QUNBQTFGLE1BQU0sQ0FBQ0MsT0FBUCxHQUNBO0FBQ0k7QUFDQTBGLFlBQVUsRUFBRSxPQUZoQjtBQUdJQyxzQkFBb0IsRUFBRSxpQkFIMUI7QUFJSUMseUJBQXVCLEVBQUUsY0FKN0I7QUFLSUMsaUJBQWUsRUFBRSxjQUxyQjtBQU1JQyx3QkFBc0IsRUFBRSxtQkFONUI7QUFPSUMsMEJBQXdCLEVBQUUsY0FQOUI7QUFRSUMsaUJBQWUsRUFBRSxRQVJyQjtBQVNJQyx5QkFBdUIsRUFBRSxpQkFUN0I7QUFVSUMsaUJBQWUsRUFBRSxTQVZyQjtBQVdJN0IsZUFBYSxFQUFFLGlCQVhuQjtBQVlJOEIsY0FBWSxFQUFFLGdCQVpsQjtBQWFJQyxtQkFBaUIsRUFBRSxpQkFidkI7QUFjSUMsbUJBQWlCLEVBQUUsZUFkdkI7QUFlSUMsYUFBVyxFQUFFLHlCQWZqQjtBQWdCSUMsY0FBWSxFQUFFLE9BaEJsQjtBQWlCSUMsaUJBQWUsRUFBRSxVQWpCckI7QUFrQklDLGdCQUFjLEVBQUUsU0FsQnBCO0FBbUJJQyxrQkFBZ0IsRUFBRSxxQkFuQnRCO0FBb0JJQyxpQkFBZSxFQUFFLFVBcEJyQjtBQXFCSUMsbUJBQWlCLEVBQUUsWUFyQnZCO0FBc0JJO0FBQ0FDLE1BQUksRUFBRTtBQUFFckMsYUFBUyxFQUFFLEVBQWI7QUFBaUJDLFlBQVEsRUFBRTtBQUEzQixHQXZCVjtBQXdCSXFDLE9BQUssRUFBRTtBQUFFdEMsYUFBUyxFQUFFLEdBQWI7QUFBa0JDLFlBQVEsRUFBRTtBQUE1QixHQXhCWDtBQXlCSTdCLFVBQVEsRUFBRTtBQUFFQyxhQUFTLEVBQUUsQ0FBYjtBQUFnQjJCLGFBQVMsRUFBQyxFQUExQjtBQUE4QkMsWUFBUSxFQUFFO0FBQXhDLEdBekJkO0FBeUI4RDtBQUMxRHNDLGFBQVcsRUFBRTtBQUFFbEUsYUFBUyxFQUFFLENBQWI7QUFBZ0IyQixhQUFTLEVBQUM7QUFBMUIsR0ExQmpCO0FBMkJJd0MsZUFBYSxFQUFFO0FBQUV4QyxhQUFTLEVBQUU7QUFBYixHQTNCbkI7QUE0Qkl5QyxPQUFLLEVBQUU7QUFBRUMsU0FBSyxFQUFFLE1BQVQ7QUFBaUJ6QyxZQUFRLEVBQUU7QUFBM0IsR0E1Qlg7QUE2QklVLFFBQU0sRUFBRTtBQUFFdEMsYUFBUyxFQUFFLENBQWI7QUFBZ0I0QixZQUFRLEVBQUU7QUFBMUIsR0E3Qlo7QUE4QkkwQyxtQkFBaUIsRUFBRSxDQUFDLEdBOUJ4QjtBQStCSUMsbUJBQWlCLEVBQUMsR0EvQnRCO0FBZ0NJO0FBQ0F0RSxlQUFhLEVBQUcsYUFqQ3BCO0FBa0NJQyxzQkFBb0IsRUFBRyxvQ0FsQzNCO0FBbUNJc0UsNkJBQTJCLEVBQUc7QUFuQ2xDLENBREEsQzs7Ozs7Ozs7Ozs7QUNBQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRTs7Ozs7Ozs7Ozs7QUN0QkE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUU7Ozs7Ozs7Ozs7O0FDdEJBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEOzs7Ozs7Ozs7OztBQ3RCQXRILE1BQU0sQ0FBQ0MsT0FBUCxHQUNBO0FBQ0lzSCxXQUFTLEVBQUUsU0FEZjtBQUVJQyxjQUFZLEVBQUcsd0NBRm5CO0FBR0lDLGdCQUFjLEVBQUUsa0JBSHBCO0FBSUlDLFFBQU0sRUFBRywrQ0FKYjtBQUtJQyx3QkFBc0IsRUFBRyxpQkFMN0I7QUFNSUMsY0FBWSxFQUFFLFdBTmxCO0FBT0lDLGlCQUFlLEVBQUcsd0NBUHRCO0FBUUlDLFVBQVEsRUFBRyw0QkFSZjtBQVNJQyxjQUFZLEVBQUcscURBVG5CO0FBVUlDLGdCQUFjLEVBQUcsa0NBVnJCO0FBV0lDLFlBQVUsRUFBRywyQkFYakI7QUFZSUMsZUFBYSxFQUFHLDJDQVpwQjtBQWFJQyxjQUFZLEVBQUcsc0RBYm5CO0FBY0lDLFVBQVEsRUFBRyxlQWRmO0FBZUlDLFlBQVUsRUFBRywyREFmakI7QUFnQklDLGFBQVcsRUFBRyxhQWhCbEI7QUFpQklDLGdCQUFjLEVBQUcsb0JBakJyQjtBQWtCSUMsY0FBWSxFQUFHLGlCQWxCbkI7QUFtQklDLGFBQVcsRUFBRyw0R0FuQmxCO0FBb0JJQyxrQkFBZ0IsRUFBRyx3QkFwQnZCO0FBcUJJQyxlQUFhLEVBQUcsb0NBckJwQjtBQXNCSUMscUJBQW1CLEVBQUcsdUhBdEIxQjtBQXVCSUMsbUJBQWlCLEVBQUcsbUVBdkJ4QjtBQXdCSUMsa0JBQWdCLEVBQUcsdUVBeEJ2QjtBQXlCSUMsWUFBVSxFQUFHLG1oQkF6QmpCO0FBMEJJQyxjQUFZLEVBQUUsVUExQmxCO0FBMkJJQyxpQkFBZSxFQUFHO0FBM0J0QixDQURBLEM7Ozs7Ozs7Ozs7O0FDQUFqSixNQUFNLENBQUNDLE9BQVAsR0FDQTtBQUNJaUosMEJBQXdCLEVBQUcsa0RBRC9CO0FBRUlDLGdCQUFjLEVBQUUsZ05BRnBCO0FBR0lDLHFCQUFtQixFQUFFLDBCQUh6QjtBQUlJQyxhQUFXLEVBQUUsbUtBSmpCO0FBS0lDLGtCQUFnQixFQUFFLGlFQUx0QjtBQU1JQyxvQkFBa0IsRUFBRyw0REFOekI7QUFPSUMsY0FBWSxFQUFHLCtKQVBuQjtBQVFJQyx5QkFBdUIsRUFBRSx5T0FSN0I7QUFTSUMsd0JBQXNCLEVBQUUsbU1BVDVCO0FBVUlDLHdCQUFzQixFQUFHLFlBVjdCO0FBV0lDLHdCQUFzQixFQUFFLHFCQVg1QjtBQVlJQyx3QkFBc0IsRUFBRSxxQ0FaNUI7QUFhSUMsd0JBQXNCLEVBQUUsME5BYjVCO0FBY0lDLHVCQUFxQixFQUFFLGtMQWQzQjtBQWVJQyx1QkFBcUIsRUFBRywyQkFmNUI7QUFnQklDLHVCQUFxQixFQUFFLGdHQWhCM0I7QUFpQklDLDJCQUF5QixFQUFFLFdBakIvQjtBQWtCSUMsdUJBQXFCLEVBQUUscUNBbEIzQjtBQW1CSUMsNkJBQTJCLEVBQUcscUpBbkJsQztBQW9CSUMscUJBQW1CLEVBQUcscUJBcEIxQjtBQXFCSUMsb0JBQWtCLEVBQUcsaUZBckJ6QjtBQXNCSUMseUJBQXVCLEVBQUcsZ0VBdEI5QjtBQXVCSUMscUJBQW1CLEVBQUcsMkRBdkIxQjtBQXdCSUMsd0JBQXNCLEVBQUcscUVBeEI3QjtBQXlCSUMsa0JBQWdCLEVBQUcsK0NBekJ2QjtBQTBCSUMsb0JBQWtCLEVBQUcsa0VBMUJ6QjtBQTJCSUMsbUJBQWlCLEVBQUcsK0VBM0J4QjtBQTRCSUMsMkJBQXlCLEVBQUcsc0RBNUJoQztBQTZCSUMsa0JBQWdCLEVBQUcsMFBBN0J2QjtBQThCSUMsb0JBQWtCLEVBQUc7QUE5QnpCLENBREEsQzs7Ozs7Ozs7Ozs7QUNBQS9LLE1BQU0sQ0FBQ0MsT0FBUCxHQUNBO0FBQ0krSyxrQkFBZ0IsRUFBRSxtQ0FEdEI7QUFFSUMsMEJBQXdCLEVBQUUsNklBRjlCO0FBR0lDLGFBQVcsRUFBRSxrRUFIakI7QUFJSUMsZUFBYSxFQUFFLDJGQUpuQjtBQUtJQyxjQUFZLEVBQUUsb0JBTGxCO0FBTUlDLG1CQUFpQixFQUFFLDhDQU52QjtBQU9JQyxpQ0FBK0IsRUFBRSxzREFQckM7QUFRSUMsbUJBQWlCLEVBQUUseURBUnZCO0FBU0lDLDRCQUEwQixFQUFFLG1EQVRoQztBQVVJM0QsaUJBQWUsRUFBRSxvQ0FWckI7QUFXSTRELGVBQWEsRUFBRSxvRUFYbkI7QUFZSUMsZ0JBQWMsRUFBRSx3Q0FacEI7QUFhSUMsbUJBQWlCLEVBQUUsNkVBYnZCO0FBY0lDLHFCQUFtQixFQUFFLHFDQWR6QjtBQWVJQyx1QkFBcUIsRUFBRSxxQkFmM0I7QUFnQklDLG1CQUFpQixFQUFFLGdMQWhCdkI7QUFpQklDLHNCQUFvQixFQUFFLGdGQWpCMUI7QUFrQklDLHNCQUFvQixFQUFFLHlGQWxCMUI7QUFtQklDLG9CQUFrQixFQUFHLDhIQW5CekI7QUFvQklDLG1CQUFpQixFQUFHLDBIQXBCeEI7QUFxQklDLDhCQUE0QixFQUFFLHFFQXJCbEM7QUFzQklDLDJCQUF5QixFQUFFLGtFQXRCL0I7QUF1QklDLHVCQUFxQixFQUFFLHdKQXZCM0I7QUF3QklDLHlCQUF1QixFQUFFLHVFQXhCN0I7QUF5QklDLG1CQUFpQixFQUFHLFlBekJ4QjtBQTBCSUMsbUJBQWlCLEVBQUcsMkNBMUJ4QjtBQTJCSUMsdUJBQXFCLEVBQUcsaUhBM0I1QjtBQTRCSUMsc0JBQW9CLEVBQUcsK0dBNUIzQjtBQTZCSUMsc0JBQW9CLEVBQUcsaUpBN0IzQjtBQThCSUMsc0JBQW9CLEVBQUcsMEJBOUIzQjtBQStCSUMsa0JBQWdCLEVBQUcsZUEvQnZCO0FBZ0NJQyw0QkFBMEIsRUFBRyx5UUFoQ2pDO0FBaUNJQywyQkFBeUIsRUFBRyxvUEFqQ2hDO0FBa0NJQywyQkFBeUIsRUFBRyw0QkFsQ2hDO0FBbUNJQywyQkFBeUIsRUFBRyxTQW5DaEM7QUFvQ0lDLHlCQUF1QixFQUFHLG9JQXBDOUI7QUFxQ0lDLHdCQUFzQixFQUFHLGdJQXJDN0I7QUFzQ0lDLDRCQUEwQixFQUFFLGtUQXRDaEM7QUF1Q0lDLHdCQUFzQixFQUFHLFVBdkM3QjtBQXdDSUMsMEJBQXdCLEVBQUUsNERBeEM5QjtBQXlDSUMsd0JBQXNCLEVBQUcsNkNBekM3QjtBQTBDSUMsNkJBQTJCLEVBQUcseUhBMUNsQztBQTJDSUMsNEJBQTBCLEVBQUcscUhBM0NqQztBQTRDSUMsMkJBQXlCLEVBQUcsb0NBNUNoQztBQTZDSUMsdUJBQXFCLEVBQUcscUJBN0M1QjtBQThDSUMsdUJBQXFCLEVBQUUsa0tBOUMzQjtBQStDSUMscUJBQW1CLEVBQUcseXFCQS9DMUI7QUFnRElDLG9CQUFrQixFQUFHLG1vQkFoRHpCO0FBaURJQyxvQkFBa0IsRUFBRyw0QkFqRHpCO0FBa0RJQyxvQkFBa0IsRUFBRyxhQWxEekI7QUFtRElDLGlCQUFlLEVBQUUscURBbkRyQjtBQW9ESUMsb0JBQWtCLEVBQUUsNkhBcER4QjtBQXFESUMsV0FBUyxFQUFFLHVDQXJEZjtBQXNESUMsc0JBQW9CLEVBQUcsOEVBdEQzQjtBQXVESUMsY0FBWSxFQUFHLDJCQXZEbkI7QUF3RElDLGtCQUFnQixFQUFHLG9FQXhEdkI7QUF5RElDLHVCQUFxQixFQUFHLG9GQXpENUI7QUEwRElDLHVCQUFxQixFQUFHLG9GQTFENUI7QUEyRElDLFVBQVEsRUFBRSx3Q0EzRGQ7QUE0RElDLG9CQUFrQixFQUFFLDhFQTVEeEI7QUE2RElDLHFCQUFtQixFQUFFLDRFQTdEekI7QUE4RElDLGNBQVksRUFBRyxtQ0E5RG5CO0FBK0RJQyxVQUFRLEVBQUcsNEJBL0RmO0FBZ0VJQyxrQkFBZ0IsRUFBRyxtQ0FoRXZCO0FBaUVJQyxZQUFVLEVBQUcsc0JBakVqQjtBQWtFSUMsb0JBQWtCLEVBQUcsNkRBbEV6QjtBQW1FSUMsV0FBUyxFQUFHLG1EQW5FaEI7QUFvRUlDLGlCQUFlLEVBQUUsdUtBcEVyQjtBQXFFSUMsdUJBQXFCLEVBQUcsK0lBckU1QjtBQXNFSUMsNkJBQTJCLEVBQUcsaURBdEVsQztBQXVFSUMsZ0JBQWMsRUFBRSwySUF2RXBCO0FBd0VJQywwQkFBd0IsRUFBRSxtQ0F4RTlCO0FBeUVJQyxtQkFBaUIsRUFBRyw2SkF6RXhCO0FBMEVJQyxnQ0FBOEIsRUFBRyx5RUExRXJDO0FBMkVJQyxzQkFBb0IsRUFBRyw4RkEzRTNCO0FBNEVJQywwQkFBd0IsRUFBRywrSEE1RS9CO0FBNkVJQyx3QkFBc0IsRUFBRyw4SEE3RTdCO0FBOEVJQywwQkFBd0IsRUFBRSxrR0E5RTlCO0FBK0VJQyxrQkFBZ0IsRUFBRSw2Q0EvRXRCO0FBZ0ZJQywwQkFBd0IsRUFBRSxtREFoRjlCO0FBaUZJQywrQkFBNkIsRUFBRSw4QkFqRm5DO0FBa0ZJQyxtQkFBaUIsRUFBRSx5SkFsRnZCO0FBbUZJQyx3QkFBc0IsRUFBRSw4QkFuRjVCO0FBb0ZJQyxnQkFBYyxFQUFFO0FBcEZwQixDQURBLEM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQUE7SUFFTUMsSTs7Ozs7Ozs0QkFFYUMsSyxFQUNmO0FBQ0ksVUFBR0EsS0FBSyxLQUFHQyxTQUFSLElBQXFCRCxLQUFLLEtBQUcsSUFBaEMsRUFDSSxPQUFPLElBQVAsQ0FESixLQUdBO0FBQ0lBLGFBQUssSUFBRSxFQUFQLENBREosQ0FDYzs7QUFDVkEsYUFBSyxHQUFDQSxLQUFLLENBQUNFLElBQU4sRUFBTjtBQUNBLFlBQUdGLEtBQUssS0FBRyxFQUFYLEVBQ0ksT0FBTyxJQUFQLENBREosS0FHSSxPQUFPLEtBQVA7QUFDUDtBQUNKOzs7a0NBRW9CRyxRLEVBQ3JCO0FBQ0ksVUFBR0osSUFBSSxDQUFDSyxPQUFMLENBQWFELFFBQWIsQ0FBSCxFQUNJQSxRQUFRLEdBQUMsSUFBVCxDQURKLEtBR0E7QUFDSUEsZ0JBQVEsSUFBRSxFQUFWLENBREosQ0FDaUI7O0FBQ2JBLGdCQUFRLEdBQUNBLFFBQVEsQ0FBQ0QsSUFBVCxFQUFUO0FBQ0g7QUFDRCxhQUFPQyxRQUFQO0FBQ0g7Ozt3Q0FHMEJBLFEsRUFBVUUsRyxFQUNyQztBQUNJRixjQUFRLElBQUUsRUFBVixDQURKLENBQ2lCOztBQUNkLFVBQUdBLFFBQVEsQ0FBQ0csTUFBVCxHQUFrQkQsR0FBckIsRUFDS0YsUUFBUSxHQUFDQSxRQUFRLENBQUNJLFNBQVQsQ0FBbUIsQ0FBbkIsRUFBdUJGLEdBQUcsR0FBQyxDQUEzQixJQUErQixLQUF4QztBQUNKLGFBQU9GLFFBQVA7QUFDSCxLLENBRUQ7Ozs7K0JBQ2tCQSxRLEVBQVVLLE0sRUFDNUI7QUFDSSxVQUFNQyxXQUFXLEdBQUcsSUFBSUMsTUFBSixDQUFXQyxNQUFNLENBQUNDLElBQVAsQ0FBWUosTUFBWixFQUFvQkssSUFBcEIsQ0FBeUIsR0FBekIsQ0FBWCxFQUF5QyxJQUF6QyxDQUFwQjtBQUNBLGFBQU9WLFFBQVEsQ0FBQ1csT0FBVCxDQUFpQkwsV0FBakIsRUFBOEIsVUFBQ00sT0FBRCxFQUNyQztBQUNJLGVBQU9QLE1BQU0sQ0FBQ08sT0FBRCxDQUFiO0FBQ0gsT0FITSxDQUFQO0FBSUgsSyxDQUVEOzs7O2lDQUNvQmxNLEcsRUFBS3dMLEcsRUFDekI7QUFDSXhMLFNBQUcsR0FBR21NLElBQUksQ0FBQ0MsSUFBTCxDQUFVcE0sR0FBVixDQUFOO0FBQ0F3TCxTQUFHLEdBQUdXLElBQUksQ0FBQ0UsS0FBTCxDQUFXYixHQUFYLENBQU47QUFDQSxhQUFPVyxJQUFJLENBQUNFLEtBQUwsQ0FBV0YsSUFBSSxDQUFDRyxNQUFMLE1BQWlCZCxHQUFHLEdBQUd4TCxHQUF2QixDQUFYLElBQTBDQSxHQUFqRDtBQUNILEssQ0FFRDs7OzsrQkFDa0J1TSxVLEVBQ2xCO0FBQUEsVUFEOEJDLElBQzlCLHVFQURtQyxJQUNuQztBQUNJLFVBQUd0QixJQUFJLENBQUNLLE9BQUwsQ0FBYWdCLFVBQWIsQ0FBSCxFQUNJLE9BQU8sRUFBUDtBQUNKLFVBQUlFLE1BQU0sR0FBQyxJQUFJQyxJQUFKLENBQVNILFVBQVQsQ0FBWDtBQUNBLFVBQUlJLEtBQUssR0FBQ0YsTUFBTSxDQUFDRyxPQUFQLEtBQWlCLEVBQTNCO0FBQ0EsVUFBR0QsS0FBSyxDQUFDbEIsTUFBTixLQUFlLENBQWxCLEVBQ0lrQixLQUFLLEdBQUMsTUFBSUEsS0FBVjtBQUNKLFVBQUlFLFFBQVEsR0FBRUosTUFBTSxDQUFDSyxRQUFQLEtBQWtCLENBQW5CLEdBQXNCLEVBQW5DO0FBQ0EsVUFBR0QsUUFBUSxDQUFDcEIsTUFBVCxLQUFrQixDQUFyQixFQUNJb0IsUUFBUSxHQUFDLE1BQUlBLFFBQWI7QUFDSixVQUFJRSxNQUFNLEdBQUNOLE1BQU0sQ0FBQ08sV0FBUCxFQUFYO0FBQ0EsVUFBR1IsSUFBSSxLQUFHLElBQVYsRUFDSSxPQUFPRyxLQUFLLEdBQUMsR0FBTixHQUFVRSxRQUFWLEdBQW1CLEdBQW5CLEdBQXVCRSxNQUE5QixDQURKLEtBRUssSUFBSVAsSUFBSSxLQUFHLE1BQVgsRUFBa0I7QUFDbkIsZUFBT08sTUFBTSxHQUFDLEdBQVAsR0FBV0YsUUFBWCxHQUFvQixHQUFwQixHQUF3QkYsS0FBL0IsQ0FEQyxLQUdELE9BQU9FLFFBQVEsR0FBQyxHQUFULEdBQWFGLEtBQWIsR0FBbUIsR0FBbkIsR0FBdUJJLE1BQTlCO0FBQ1A7Ozs7OztBQUdMaFMsTUFBTSxDQUFDQyxPQUFQLEdBQWlCa1EsSUFBakIsQzs7Ozs7Ozs7Ozs7QUNoRkE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4RDs7Ozs7Ozs7Ozs7QUN2QkFuUSxNQUFNLENBQUNDLE9BQVAsR0FDQTtBQUNJaVMsV0FBUyxFQUNULENBQ0k7QUFBRUMsVUFBTSxFQUFFLFNBQVY7QUFBcUJDLGNBQVUsRUFBRTtBQUFFQyxVQUFJLEVBQUM7QUFBUDtBQUFqQyxHQURKLEVBRUk7QUFBRUYsVUFBTSxFQUFFLFlBQVY7QUFBd0JDLGNBQVUsRUFBRTtBQUFFQyxVQUFJLEVBQUMsaUJBQVA7QUFBMEJDLFFBQUUsRUFBRTtBQUE5QjtBQUFwQyxHQUZKLEVBR0k7QUFBRUgsVUFBTSxFQUFFLFVBQVY7QUFBc0JDLGNBQVUsRUFBRTtBQUFFQyxVQUFJLEVBQUM7QUFBUDtBQUFsQyxHQUhKLEVBSUk7QUFBRUYsVUFBTSxFQUFFLFNBQVY7QUFBcUJDLGNBQVUsRUFBRTtBQUFFQyxVQUFJLEVBQUM7QUFBUDtBQUFqQyxHQUpKLENBRko7QUFRSUUsV0FBUyxFQUNULENBQ0k7QUFBRUosVUFBTSxFQUFFLFNBQVY7QUFBcUJDLGNBQVUsRUFBRTtBQUFFQyxVQUFJLEVBQUM7QUFBUDtBQUFqQyxHQURKLEVBRUk7QUFBRUYsVUFBTSxFQUFFLGtCQUFWO0FBQThCQyxjQUFVLEVBQUU7QUFBRUMsVUFBSSxFQUFDLHdCQUFQO0FBQWlDRyxTQUFHLEVBQUU7QUFBdEM7QUFBMUMsR0FGSixFQUdJO0FBQUVMLFVBQU0sRUFBRSxzQkFBVjtBQUFrQ0MsY0FBVSxFQUFFO0FBQUVDLFVBQUksRUFBQztBQUFQO0FBQTlDLEdBSEosRUFJSTtBQUFFRixVQUFNLEVBQUUsUUFBVjtBQUFvQkMsY0FBVSxFQUFFO0FBQUVDLFVBQUksRUFBQyxXQUFQO0FBQW9CRyxTQUFHLEVBQUU7QUFBekI7QUFBaEMsR0FKSixFQUtJO0FBQUVMLFVBQU0sRUFBRSxRQUFWO0FBQW9CQyxjQUFVLEVBQUU7QUFBRUMsVUFBSSxFQUFDLFdBQVA7QUFBb0JHLFNBQUcsRUFBRTtBQUF6QjtBQUFoQyxHQUxKLENBVEo7QUFnQklDLHlCQUF1QixFQUFFLEVBaEI3QjtBQWlCSUMsY0FBWSxFQUFHLGNBakJuQjtBQWtCSUMsZUFBYSxFQUFHLFlBbEJwQjtBQW1CSUMsaUJBQWUsRUFBRyxjQW5CdEI7QUFvQklDLGVBQWEsRUFBRyxrQkFwQnBCO0FBcUJJQyxnQkFBYyxFQUFHLGdCQXJCckI7QUFzQklDLGFBQVcsRUFBRSxhQXRCakI7QUF1QklDLDhCQUE0QixFQUFFLG9CQXZCbEM7QUF3QklDLHFCQUFtQixFQUFFLDJCQXhCekI7QUF5QklDLDhCQUE0QixFQUFHLEVBekJuQztBQTBCSUMsaUJBQWUsRUFBRyxhQTFCdEI7QUEyQklDLFlBQVUsRUFBRSwwQkEzQmhCO0FBNEJJQyxZQUFVLEVBQUUsc0JBNUJoQjtBQTZCSUMsUUFBTSxFQUFFLGtTQTdCWjtBQThCSUMsWUFBVSxFQUFFLHVCQTlCaEI7QUErQklDLFFBQU0sRUFBRSwrY0EvQlo7QUFnQ0lDLHdCQUFzQixFQUFFLDBDQWhDNUI7QUFpQ0lDLHdCQUFzQixFQUFFLGlEQWpDNUI7QUFrQ0lDLGtCQUFnQixFQUFFLDRCQWxDdEI7QUFtQ0lDLGdCQUFjLEVBQUUsMmlDQW5DcEI7QUFvQ0lDLGtCQUFnQixFQUFFLCtGQXBDdEI7QUFxQ0lDLGFBQVcsRUFBRTtBQXJDakIsQ0FEQSxDOzs7Ozs7Ozs7OztBQ0FBOVQsTUFBTSxDQUFDQyxPQUFQLEdBQ0E7QUFDSWlTLFdBQVMsRUFDVCxDQUNJO0FBQUVDLFVBQU0sRUFBRSxTQUFWO0FBQXFCQyxjQUFVLEVBQUU7QUFBRUMsVUFBSSxFQUFDLGVBQVA7QUFBd0JHLFNBQUcsRUFBRTtBQUE3QjtBQUFqQyxHQURKLEVBRUk7QUFBRUwsVUFBTSxFQUFFLFdBQVY7QUFBdUJDLGNBQVUsRUFBRTtBQUFFQyxVQUFJLEVBQUMsU0FBUDtBQUFrQkMsUUFBRSxFQUFDLGVBQXJCO0FBQXNDOU4sV0FBSyxFQUFDO0FBQTVDO0FBQW5DLEdBRkosRUFHSTtBQUFFMk4sVUFBTSxFQUFFLFlBQVY7QUFBd0JDLGNBQVUsRUFBRTtBQUFFQyxVQUFJLEVBQUMsaUJBQVA7QUFBMEJDLFFBQUUsRUFBRSxpQkFBOUI7QUFBaUQ5TixXQUFLLEVBQUM7QUFBdkQ7QUFBcEMsR0FISixFQUlJO0FBQUUyTixVQUFNLEVBQUUsVUFBVjtBQUFzQkMsY0FBVSxFQUFFO0FBQUVDLFVBQUksRUFBQyxnQkFBUDtBQUF5QjdOLFdBQUssRUFBQztBQUEvQjtBQUFsQyxHQUpKLEVBS0k7QUFBRTJOLFVBQU0sRUFBRSxTQUFWO0FBQXFCQyxjQUFVLEVBQUU7QUFBRUMsVUFBSSxFQUFDLEdBQVA7QUFBWTdOLFdBQUssRUFBQztBQUFsQjtBQUFqQyxHQUxKLENBRko7QUFTSStOLFdBQVMsRUFDVCxDQUNJO0FBQUVKLFVBQU0sRUFBRSxNQUFWO0FBQWtCQyxjQUFVLEVBQUU7QUFBRUMsVUFBSSxFQUFDLGlFQUFQO0FBQTBFN04sV0FBSyxFQUFDO0FBQWhGO0FBQTlCLEdBREosRUFFSTtBQUFFMk4sVUFBTSxFQUFFLFNBQVY7QUFBcUJDLGNBQVUsRUFBRTtBQUFFQyxVQUFJLEVBQUMsZUFBUDtBQUF3QjdOLFdBQUssRUFBQztBQUE5QjtBQUFqQyxHQUZKLEVBR0k7QUFBRTJOLFVBQU0sRUFBRSxrQkFBVjtBQUE4QkMsY0FBVSxFQUFFO0FBQUVDLFVBQUksRUFBQyx3QkFBUDtBQUFpQ0csU0FBRyxFQUFFO0FBQXRDO0FBQTFDLEdBSEosRUFJSTtBQUFFTCxVQUFNLEVBQUUsc0JBQVY7QUFBa0NDLGNBQVUsRUFBRTtBQUFFQyxVQUFJLEVBQUMsZUFBUDtBQUF3QjdOLFdBQUssRUFBQztBQUE5QjtBQUE5QyxHQUpKLEVBS0k7QUFBRTJOLFVBQU0sRUFBRSxXQUFWO0FBQXVCQyxjQUFVLEVBQUU7QUFBRUMsVUFBSSxFQUFDLGVBQVA7QUFBd0JHLFNBQUcsRUFBRTtBQUE3QjtBQUFuQyxHQUxKLENBVko7QUFpQkl1QiwrQkFBNkIsRUFBRSxDQWpCbkM7QUFrQkl0Qix5QkFBdUIsRUFBRSxFQWxCN0I7QUFtQklTLDhCQUE0QixFQUFHLENBbkJuQztBQW9CSVIsY0FBWSxFQUFHLGNBcEJuQjtBQXFCSXNCLGlCQUFlLEVBQUcsb0JBckJ0QjtBQXNCSXJCLGVBQWEsRUFBRyxZQXRCcEI7QUF1QklDLGlCQUFlLEVBQUcsY0F2QnRCO0FBd0JJQyxlQUFhLEVBQUcsa0JBeEJwQjtBQXlCSUMsZ0JBQWMsRUFBRyxnQkF6QnJCO0FBMEJJbUIsb0JBQWtCLEVBQUcsb0JBMUJ6QjtBQTJCSUMsZUFBYSxFQUFHLGVBM0JwQjtBQTRCSUMsa0JBQWdCLEVBQUcsa0JBNUJ2QjtBQTZCSUMsZ0JBQWMsRUFBRyxrQkE3QnJCO0FBOEJJQyxjQUFZLEVBQUcsbUJBOUJuQjtBQStCSXRCLGFBQVcsRUFBRSxhQS9CakI7QUFnQ0l1QixtQkFBaUIsRUFBRSxhQWhDdkI7QUFpQ0l0Qiw4QkFBNEIsRUFBRSxvQkFqQ2xDO0FBa0NJQyxxQkFBbUIsRUFBRSwyQkFsQ3pCO0FBbUNJc0IsV0FBUyxFQUFFLGVBbkNmO0FBb0NJcEIsaUJBQWUsRUFBRyxhQXBDdEI7QUFxQ0lDLFlBQVUsRUFBRSwwQkFyQ2hCO0FBc0NJb0IsYUFBVyxFQUFFLGdCQXRDakI7QUF1Q0luQixZQUFVLEVBQUUsc0JBdkNoQjtBQXdDSUMsUUFBTSxFQUFFLG1TQXhDWjtBQXlDSUMsWUFBVSxFQUFFLHVCQXpDaEI7QUEwQ0lDLFFBQU0sRUFBRSx5VUExQ1o7QUEyQ0lpQixpQkFBZSxFQUFFLGdDQTNDckI7QUE0Q0lDLHFCQUFtQixFQUFFLGdDQTVDekI7QUE2Q0lqQix3QkFBc0IsRUFBRSxnRUE3QzVCO0FBOENJQyx3QkFBc0IsRUFBRSxnR0E5QzVCO0FBK0NJQyxrQkFBZ0IsRUFBRSw0QkEvQ3RCO0FBZ0RJQyxnQkFBYyxFQUFFLGswREFoRHBCO0FBaURJZSx5QkFBdUIsRUFBRSxvTEFqRDdCO0FBa0RJZCxrQkFBZ0IsRUFBRSwrRkFsRHRCO0FBbURJZSxlQUFhLEVBQUUsK1ZBbkRuQjtBQW9ESUMsa0JBQWdCLEVBQUUsb0JBcER0QjtBQXFESUMsZ0JBQWMsRUFBRTtBQXJEcEIsQ0FEQSxDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQSxJQUFNckQsSUFBSSxHQUFDL1Esa0VBQWMsQ0FBQyxDQUFELENBQXpCOztBQUNBLElBQU1xVSxjQUFjLEdBQUdqViwrREFBUSxJQUFjLEdBQUNXLHlEQUFmLEdBQXFCLFVBQXJCLEdBQWdDZ1IsSUFBaEMsR0FBcUMsS0FBdEMsQ0FBOUIsQyxDQUEyRTs7O2VBQzVDM1IsbUJBQU8sQ0FBQyxvREFBRCxDO0lBQTlCYyxrQixZQUFBQSxrQjs7QUFDUixJQUFNb1UsV0FBVyxHQUFHbFYsbUJBQU8sQ0FBQyw4Q0FBRCxDQUEzQixDLENBQW1EO0FBRW5EOzs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0NBR0E7O0NBR0E7O2dCQUN3QkEsbUVBQVEsSUFBYSxHQUFDMlIsSUFBZCxHQUFtQixVQUFwQixDO0lBQXZCaEosVyxhQUFBQSxXOztnQkFDZ0UzSSxnRUFBUSxJQUFhLEdBQUMyUixJQUFkLEdBQW1CLE9BQXBCLEM7SUFBdkUxRixvQixhQUFBQSxvQjtJQUFzQkMsb0IsYUFBQUEsb0I7SUFBc0JpQyxlLGFBQUFBLGU7O2dCQUNabk8sd0VBQVEsSUFBYSxHQUFDMlIsSUFBZCxHQUFtQixlQUFwQixDO0lBQXZDdEksYyxhQUFBQSxjO0lBQWdCRSxXLGFBQUFBLFcsRUFFeEI7OztBQUNBLElBQU00TCxRQUFRLEdBQUdDLFFBQVEsQ0FBQ0MsY0FBVCxDQUF3QixPQUF4QixDQUFqQjtBQUNBLElBQU1DLE9BQU8sR0FBR0YsUUFBUSxDQUFDQyxjQUFULENBQXdCLGNBQXhCLENBQWhCO0FBQ0EsSUFBTUUsVUFBVSxHQUFHSCxRQUFRLENBQUNDLGNBQVQsQ0FBd0IsU0FBeEIsQ0FBbkI7QUFDQSxJQUFNRyxXQUFXLEdBQUdKLFFBQVEsQ0FBQ0MsY0FBVCxDQUF3QixVQUF4QixDQUFwQjtBQUNBLElBQU1JLFlBQVksR0FBR0wsUUFBUSxDQUFDQyxjQUFULENBQXdCLFdBQXhCLENBQXJCO0FBQ0EsSUFBTUssaUJBQWlCLEdBQUdOLFFBQVEsQ0FBQ0MsY0FBVCxDQUF3QixnQkFBeEIsQ0FBMUI7QUFDQSxJQUFNTSxXQUFXLEdBQUdQLFFBQVEsQ0FBQ0MsY0FBVCxDQUF3QixlQUF4QixDQUFwQjtBQUNBLElBQU1uTyxXQUFXLEdBQUdrTyxRQUFRLENBQUNDLGNBQVQsQ0FBd0IsYUFBeEIsQ0FBcEI7QUFDQSxJQUFNTyxXQUFXLEdBQUdSLFFBQVEsQ0FBQ0MsY0FBVCxDQUF3QixnQkFBeEIsQ0FBcEI7QUFDQSxJQUFNUSxVQUFVLEdBQUdULFFBQVEsQ0FBQ0MsY0FBVCxDQUF3QixlQUF4QixDQUFuQjtBQUVBUyxxRUFBUTs7QUFFUixJQUFNQyxVQUFVO0FBQUEscUVBQUc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1CQUthQyxvRUFBWSxDQUFDLENBQUMsTUFBRCxDQUFELEVBQVcsTUFBSWYsY0FBYyxDQUFDakMsY0FBOUIsRUFBOEM7QUFBRWlELHFCQUFPLEVBQUU5SCxlQUFYO0FBQTRCK0gsbUJBQUssRUFBQztBQUFsQyxhQUE5QyxFQUEyRkMsTUFBTSxDQUFDQyxRQUFsRyxDQUx6Qjs7QUFBQTtBQUtMQyx1QkFMSzs7QUFNWCxnQkFBR0EsV0FBSCxFQUNBO0FBQ0lmLHFCQUFPLENBQUNnQixLQUFSLENBQWNDLE9BQWQsR0FBc0IsT0FBdEIsQ0FESixDQUVJOztBQUNBLGtCQUFHSixNQUFNLENBQUNDLFFBQVAsQ0FBZ0JJLElBQWhCLEtBQXVCakcsU0FBMUIsRUFDSTRGLE1BQU0sQ0FBQ0MsUUFBUCxDQUFnQkssTUFBaEIsQ0FBdUJOLE1BQU0sQ0FBQ0MsUUFBUCxDQUFnQkksSUFBdkM7O0FBRUosa0JBQUcsQ0FBQzlGLDJEQUFPLENBQUNnRyx5RUFBUyxDQUFDLFNBQUQsQ0FBVixDQUFYLEVBQ0E7QUFDSUMsZ0ZBQVUsQ0FBQ3BCLFVBQUQsRUFBYSxHQUFiLEVBQWtCbUIseUVBQVMsQ0FBQyxTQUFELEVBQVksSUFBWixDQUFULENBQTJCVCxPQUE3QyxFQUFzRCxFQUF0RCxFQUEwRCxDQUFDUyx5RUFBUyxDQUFDLFNBQUQsRUFBWSxJQUFaLENBQVQsQ0FBMkJSLEtBQTVCLENBQTFELEVBQThGLEVBQTlGLEVBQWtHLEtBQWxHLENBQVY7QUFDQVUsNEZBQVksQ0FBQyxTQUFELENBQVo7QUFDSDs7QUFDS0Msa0JBWFYsR0FXZUgseUVBQVMsQ0FBQyxNQUFELEVBQVMsSUFBVCxDQVh4QjtBQVlJSSw0RkFBaUIsQ0FBQ0QsSUFBSSxDQUFDRSxNQUFOLEVBQWM5QixjQUFkLENBQWpCLENBWkosQ0FhSTs7QUFDQStCLDJGQUFxQixDQUFDOUIsV0FBRCxFQUFjUyxXQUFkLENBQXJCLENBZEosQ0FlSTs7QUFDQXpPLHlCQUFXLENBQUNHLEtBQVosR0FBa0IsRUFBbEIsQ0FoQkosQ0FrQkk7O0FBQ000UCxzQkFuQlYsR0FtQnFCLFNBQVhBLFFBQVcsR0FDakI7QUFDSSxvQkFBTUMsV0FBVyxHQUFHLElBQUlDLGNBQUosRUFBcEI7QUFDQUQsMkJBQVcsQ0FBQ0UsSUFBWixDQUFpQixLQUFqQixFQUF3QmhYLDBEQUFNLEdBQUM4VSxXQUFXLENBQUNyUCxVQUFuQixHQUE4QnFQLFdBQVcsQ0FBQ3hPLFlBQTFDLEdBQXVEbVEsSUFBSSxDQUFDckUsRUFBcEY7O0FBQ0EwRSwyQkFBVyxDQUFDRyxrQkFBWixHQUFpQyxZQUNqQztBQUNJLHNCQUFJLEtBQUtDLFVBQUwsSUFBbUJILGNBQWMsQ0FBQ0ksSUFBdEMsRUFDQTtBQUNJLHdCQUFJQyxRQUFRLEdBQUNDLElBQUksQ0FBQ0MsS0FBTCxDQUFXLEtBQUtDLFlBQWhCLENBQWI7O0FBQ0Esd0JBQUksS0FBS1osTUFBTCxLQUFnQixHQUFoQixJQUF1QlMsUUFBUSxDQUFDSSxJQUFULElBQWlCckgsU0FBeEMsSUFBcURpSCxRQUFRLENBQUNLLFlBQVQsSUFBeUJ0SCxTQUFsRixFQUNBO0FBQ0ksMkJBQUksSUFBSXVILElBQVIsSUFBZ0JOLFFBQVEsQ0FBQ0ksSUFBekIsRUFDQTtBQUNJLDRCQUFHakMsV0FBVyxDQUFDb0MsUUFBWixDQUFxQkQsSUFBckIsTUFBNkJ2SCxTQUFoQyxFQUNBO0FBQ0ksOEJBQUdpSCxRQUFRLENBQUNJLElBQVQsQ0FBY0UsSUFBZCxNQUFzQixJQUF0QixJQUE4Qk4sUUFBUSxDQUFDSSxJQUFULENBQWNFLElBQWQsTUFBc0IsS0FBdkQsRUFBNkQ7QUFDekRuQyx1Q0FBVyxDQUFDb0MsUUFBWixDQUFxQkQsSUFBckIsRUFBMkJ6USxLQUEzQixHQUFpQ21RLFFBQVEsQ0FBQ0ksSUFBVCxDQUFjRSxJQUFkLENBQWpDLENBREosS0FFSyxJQUFJTixRQUFRLENBQUNJLElBQVQsQ0FBY0UsSUFBZCxLQUFxQixJQUF6QixFQUErQjtBQUNoQ25DLHVDQUFXLENBQUNvQyxRQUFaLENBQXFCLEtBQUdELElBQXhCLEVBQThCRSxPQUE5QixHQUFzQyxTQUF0QztBQUNQO0FBQ0osdUJBVkwsQ0FXSTs7O0FBQ0EsMEJBQUdSLFFBQVEsQ0FBQ0ssWUFBVCxDQUFzQkksUUFBdEIsSUFBZ0MsSUFBbkMsRUFDSXRDLFdBQVcsQ0FBQ29DLFFBQVosQ0FBcUIsVUFBckIsRUFBaUNDLE9BQWpDLEdBQXlDLFNBQXpDLENBYlIsQ0FjSTs7QUFDQSwyQkFBSSxJQUFJRSxDQUFSLElBQWFWLFFBQVEsQ0FBQ0ssWUFBVCxDQUFzQk0sV0FBbkM7QUFDSXhDLG1DQUFXLENBQUNvQyxRQUFaLENBQXFCLE1BQUlQLFFBQVEsQ0FBQ0ssWUFBVCxDQUFzQk0sV0FBdEIsQ0FBa0NELENBQWxDLENBQXpCLEVBQStERixPQUEvRCxHQUF1RSxTQUF2RTtBQURKLHVCQWZKLENBaUJJOzs7QUFDQXBDLGlDQUFXLENBQUN3QyxTQUFaLEdBQXNCWixRQUFRLENBQUNJLElBQVQsQ0FBYzNRLEtBQXBDO0FBQ0E0TyxnQ0FBVSxDQUFDdUMsU0FBWCxHQUFxQnRYLGtCQUFrQixHQUFDMFcsUUFBUSxDQUFDSSxJQUFULENBQWNwRixFQUF0RDtBQUNIOztBQUNELHdCQUFNNkYsVUFBVSxHQUFDLElBQUl4RyxJQUFKLENBQVMyRixRQUFRLENBQUNLLFlBQVQsQ0FBc0JTLFNBQS9CLEVBQTBDQyxPQUExQyxFQUFqQjtBQUNBLHdCQUFNQyxRQUFRLEdBQUNoQixRQUFRLENBQUNLLFlBQVQsQ0FBc0JZLFlBQXRCLEdBQW1DbkgsSUFBSSxDQUFDb0gsS0FBTCxDQUFXLENBQUM3RyxJQUFJLENBQUM4RyxHQUFMLEtBQVdOLFVBQVosSUFBd0IsSUFBeEIsR0FBNkIsSUFBN0IsR0FBa0MsRUFBN0MsQ0FBbEQ7QUFDQSx3QkFBR0csUUFBUSxHQUFHLENBQWQsRUFDSTdCLGdFQUFVLENBQUNqQixpQkFBRCxFQUFvQixHQUFwQixFQUF5Qm5NLFdBQVcsQ0FBQzZILE9BQVosQ0FBb0IsU0FBcEIsRUFBK0JvSCxRQUEvQixDQUF6QixFQUFtRSxFQUFuRSxFQUF1RSxDQUFDLE1BQUQsQ0FBdkUsQ0FBVixDQURKLEtBR0E7QUFDSTdCLHNGQUFVLENBQUNqQixpQkFBRCxFQUFvQixHQUFwQixFQUF5QnJNLGNBQWMsQ0FBQytILE9BQWYsQ0FBdUIsU0FBdkIsRUFBa0NvSCxRQUFsQyxDQUF6QixFQUFzRSxFQUF0RSxFQUEwRSxDQUFDLE9BQUQsQ0FBMUUsQ0FBVjtBQUNBckMsNEJBQU0sQ0FBQ0MsUUFBUCxDQUFnQkssTUFBaEIsQ0FBdUIsWUFBdkI7QUFDSDtBQUNKO0FBQ0osaUJBckNEOztBQXNDQVMsMkJBQVcsQ0FBQzBCLGdCQUFaLENBQTZCLGVBQTdCLEVBQThDLFlBQVUvQixJQUFJLENBQUNnQyxLQUE3RDtBQUNBM0IsMkJBQVcsQ0FBQzRCLElBQVo7QUFDSCxlQS9ETCxFQWdFSTs7O0FBQ0E3QixzQkFBUSxHQWpFWixDQW1FSTs7QUFDQXRCLHlCQUFXLENBQUNvRCxnQkFBWixDQUE2QixRQUE3QixFQUF1QyxVQUFTQyxDQUFULEVBQ3ZDO0FBQ0lBLGlCQUFDLENBQUNDLGNBQUY7QUFDQXpELDJCQUFXLENBQUM0QyxTQUFaLEdBQXNCLEVBQXRCO0FBQ0Esb0JBQUljLEtBQUssR0FBQ0MsMEVBQWtCLENBQUN4RCxXQUFELENBQTVCLENBSEosQ0FJSTs7QUFDQXVELHFCQUFLLENBQUNmLFdBQU4sR0FBa0IsRUFBbEI7O0FBQ0EscUJBQUksSUFBSUQsQ0FBQyxHQUFDLENBQVYsRUFBYUEsQ0FBQyxJQUFFLENBQWhCLEVBQW1CQSxDQUFDLEVBQXBCLEVBQ0E7QUFDSSxzQkFBR2dCLEtBQUssQ0FBQyxNQUFJaEIsQ0FBTCxDQUFMLEtBQWUzSCxTQUFsQixFQUNJMkksS0FBSyxDQUFDZixXQUFOLElBQW1CLEtBQUdELENBQXRCO0FBQ1A7O0FBQ0Qsb0JBQUdnQixLQUFLLENBQUNqQixRQUFOLEtBQWlCMUgsU0FBcEIsRUFDSTJJLEtBQUssQ0FBQ2pCLFFBQU4sR0FBZSxPQUFmO0FBQ0osb0JBQUdpQixLQUFLLENBQUNFLFlBQU4sS0FBcUI3SSxTQUF4QixFQUNJMkksS0FBSyxDQUFDRSxZQUFOLEdBQW1CLE9BQW5CO0FBQ0pGLHFCQUFLLENBQUNHLGNBQU4sR0FBcUJDLHlFQUFpQixFQUF0QztBQUNBLG9CQUFNQyxhQUFhLEdBQUcsSUFBSXBDLGNBQUosRUFBdEI7QUFDQSxvQkFBRytCLEtBQUssQ0FBQ00sUUFBTixLQUFpQmpKLFNBQXBCLEVBQ0lnSixhQUFhLENBQUNuQyxJQUFkLENBQW1CLFFBQW5CLEVBQTZCaFgsMERBQU0sR0FBQzhVLFdBQVcsQ0FBQ3JQLFVBQW5CLEdBQThCLEdBQTlCLEdBQWtDZ1IsSUFBSSxDQUFDckUsRUFBcEUsRUFESixLQUdJK0csYUFBYSxDQUFDbkMsSUFBZCxDQUFtQixLQUFuQixFQUEwQmhYLDBEQUFNLEdBQUM4VSxXQUFXLENBQUNyUCxVQUFuQixHQUE4QnFQLFdBQVcsQ0FBQ3BPLGVBQTFDLEdBQTBEK1AsSUFBSSxDQUFDckUsRUFBekY7O0FBQ0orRyw2QkFBYSxDQUFDbEMsa0JBQWQsR0FBbUMsWUFDbkM7QUFDSSxzQkFBSSxLQUFLQyxVQUFMLElBQW1CSCxjQUFjLENBQUNJLElBQXRDLEVBQ0E7QUFDSSx3QkFBSUMsUUFBUSxHQUFDQyxJQUFJLENBQUNDLEtBQUwsQ0FBVyxLQUFLQyxZQUFoQixDQUFiOztBQUNBLHdCQUFJLEtBQUtaLE1BQUwsS0FBZ0IsR0FBaEIsSUFBdUJTLFFBQVEsQ0FBQ3ZCLE9BQVQsSUFBa0IxRixTQUE3QyxFQUNBO0FBQ0ksMEJBQUdrSixLQUFLLENBQUNDLE9BQU4sQ0FBY2xDLFFBQVEsQ0FBQ3ZCLE9BQXZCLENBQUgsRUFDSXVCLFFBQVEsQ0FBQ3ZCLE9BQVQsR0FBbUJ1QixRQUFRLENBQUN2QixPQUFULENBQWlCOUUsSUFBakIsQ0FBc0IsTUFBdEIsQ0FBbkIsQ0FESixLQUdJcUcsUUFBUSxDQUFDdkIsT0FBVCxHQUFtQnVCLFFBQVEsQ0FBQ3ZCLE9BQTVCO0FBQ0pVLHNGQUFVLENBQUNuQixXQUFELEVBQWMsR0FBZCxFQUFtQmdDLFFBQVEsQ0FBQ3ZCLE9BQTVCLEVBQXFDLEVBQXJDLEVBQXlDLENBQUMsU0FBRCxDQUF6QyxDQUFWO0FBQ0gscUJBUEQsTUFRSyxJQUFJdUIsUUFBUSxDQUFDbUMsTUFBYixFQUNMO0FBQ0ksMEJBQUdGLEtBQUssQ0FBQ0MsT0FBTixDQUFjbEMsUUFBUSxDQUFDbUMsTUFBdkIsQ0FBSCxFQUNJbkMsUUFBUSxDQUFDbUMsTUFBVCxHQUFrQm5DLFFBQVEsQ0FBQ21DLE1BQVQsQ0FBZ0J4SSxJQUFoQixDQUFxQixNQUFyQixDQUFsQixDQURKLEtBR0lxRyxRQUFRLENBQUNtQyxNQUFULEdBQWtCaFIsV0FBbEI7QUFDSmdPLHNGQUFVLENBQUNuQixXQUFELEVBQWMsR0FBZCxFQUFtQmdDLFFBQVEsQ0FBQ21DLE1BQTVCLEVBQW9DLEVBQXBDLEVBQXdDLENBQUMsT0FBRCxDQUF4QyxDQUFWO0FBQ0gscUJBUEksTUFTRGhELGdFQUFVLENBQUNuQixXQUFELEVBQWMsR0FBZCxFQUFtQjdNLFdBQW5CLEVBQWdDLEVBQWhDLEVBQW9DLENBQUMsT0FBRCxDQUFwQyxDQUFWLENBbkJSLENBb0JJOzs7QUFDQXNPLDRCQUFRO0FBQ1g7QUFDSixpQkExQkQ7O0FBMkJBc0MsNkJBQWEsQ0FBQ1gsZ0JBQWQsQ0FBK0IsY0FBL0IsRUFBK0Msa0JBQS9DO0FBQ0FXLDZCQUFhLENBQUNYLGdCQUFkLENBQStCLGVBQS9CLEVBQWdELFlBQVUvQixJQUFJLENBQUNnQyxLQUEvRDs7QUFDQSxvQkFBR0ssS0FBSCxFQUNBO0FBQ0lBLHVCQUFLLENBQUNVLE1BQU4sR0FBYSxNQUFiO0FBQ0FMLCtCQUFhLENBQUNULElBQWQsQ0FBbUJyQixJQUFJLENBQUNvQyxTQUFMLENBQWVYLEtBQWYsQ0FBbkI7QUFDSDtBQUNKLGVBeERELEVBcEVKLENBOEhJOztBQUNNWSxrQkEvSFYsR0ErSGUxRSxRQUFRLENBQUNDLGNBQVQsQ0FBd0IsTUFBeEIsQ0EvSGY7QUFnSVUwRSxtQkFoSVYsR0FnSWdCM0UsUUFBUSxDQUFDQyxjQUFULENBQXdCLE9BQXhCLENBaEloQjtBQWlJVTJFLG1CQWpJVixHQWlJZ0I1RSxRQUFRLENBQUNDLGNBQVQsQ0FBd0IsT0FBeEIsQ0FqSWhCO0FBa0lVNEUsbUJBbElWLEdBa0lnQjdFLFFBQVEsQ0FBQ0MsY0FBVCxDQUF3QixPQUF4QixDQWxJaEI7QUFtSVU2RSxpQkFuSVYsR0FtSWM5RSxRQUFRLENBQUNDLGNBQVQsQ0FBd0IsT0FBeEIsQ0FuSWQ7QUFvSVU4RSx1QkFwSVYsR0FvSW9CL0UsUUFBUSxDQUFDQyxjQUFULENBQXdCLFFBQXhCLENBcElwQjtBQXFJSThFLHVCQUFTLENBQUM3RCxLQUFWLENBQWdCQyxPQUFoQixHQUF3QixNQUF4QjtBQUNBdUQsa0JBQUksQ0FBQ2YsZ0JBQUwsQ0FBc0IsUUFBdEIsRUFBZ0MsVUFBU0MsQ0FBVCxFQUNoQztBQUNJb0IsNkZBQWdCLENBQUMsTUFBRCxDQUFoQjtBQUNILGVBSEQ7QUFJQUwsbUJBQUssQ0FBQ2hCLGdCQUFOLENBQXVCLFFBQXZCLEVBQWlDLFVBQVNDLENBQVQsRUFDakM7QUFDSW9CLDZGQUFnQixDQUFDLE9BQUQsQ0FBaEI7QUFDSCxlQUhEO0FBSUFKLG1CQUFLLENBQUNqQixnQkFBTixDQUF1QixRQUF2QixFQUFpQyxVQUFTQyxDQUFULEVBQ2pDO0FBQ0lvQiw2RkFBZ0IsQ0FBQyxPQUFELENBQWhCO0FBQ0gsZUFIRDtBQUlBSCxtQkFBSyxDQUFDbEIsZ0JBQU4sQ0FBdUIsUUFBdkIsRUFBaUMsVUFBU0MsQ0FBVCxFQUNqQztBQUNJb0IsNkZBQWdCLENBQUMsT0FBRCxDQUFoQjtBQUNILGVBSEQ7QUFJQUYsaUJBQUcsQ0FBQ25CLGdCQUFKLENBQXFCLFFBQXJCLEVBQStCLFVBQVNDLENBQVQsRUFDL0I7QUFDSSxvQkFBR2tCLEdBQUcsQ0FBQ2xDLE9BQUosS0FBYyxJQUFqQixFQUNBO0FBQ0ltQywyQkFBUyxDQUFDN0QsS0FBVixDQUFnQkMsT0FBaEIsR0FBd0IsT0FBeEI7QUFDQSxzQkFBR3VELElBQUksQ0FBQzlCLE9BQUwsS0FBZSxJQUFsQixFQUNJcUMsMkVBQWMsQ0FBQyxNQUFELENBQWQsQ0FESixLQUVLLElBQUdOLEtBQUssQ0FBQy9CLE9BQU4sS0FBZ0IsSUFBbkIsRUFDRHFDLDJFQUFjLENBQUMsT0FBRCxDQUFkLENBREMsS0FFQSxJQUFHTCxLQUFLLENBQUNoQyxPQUFOLEtBQWdCLElBQW5CLEVBQ0RxQywyRUFBYyxDQUFDLE9BQUQsQ0FBZCxDQURDLEtBRUEsSUFBR0osS0FBSyxDQUFDakMsT0FBTixLQUFnQixJQUFuQixFQUNEcUMsMkVBQWMsQ0FBQyxPQUFELENBQWQsQ0FEQyxLQUdMO0FBQ0lGLDZCQUFTLENBQUM3RCxLQUFWLENBQWdCQyxPQUFoQixHQUF3QixNQUF4QjtBQUNBMkQsdUJBQUcsQ0FBQ2xDLE9BQUosR0FBWSxLQUFaO0FBQ0g7QUFDSixpQkFoQkQsTUFrQkltQyxTQUFTLENBQUM3RCxLQUFWLENBQWdCQyxPQUFoQixHQUF3QixNQUF4QjtBQUNQLGVBckJELEVBdEpKLENBNktJOztBQUNNK0QsNkJBOUtWLEdBOEs0QixJQUFJbkQsY0FBSixFQTlLNUI7QUErS0ltRCw2QkFBZSxDQUFDbEQsSUFBaEIsQ0FBcUIsS0FBckIsRUFBNEJoWCwwREFBTSxHQUFDOFUsV0FBVyxDQUFDclAsVUFBbkIsR0FBOEJxUCxXQUFXLENBQUM1TyxZQUF0RTs7QUFDQWdVLDZCQUFlLENBQUNqRCxrQkFBaEIsR0FBcUMsWUFDckM7QUFDSSxvQkFBSSxLQUFLQyxVQUFMLElBQW1CSCxjQUFjLENBQUNJLElBQXRDLEVBQ0E7QUFDSSxzQkFBSUMsUUFBUSxHQUFDQyxJQUFJLENBQUNDLEtBQUwsQ0FBVyxLQUFLQyxZQUFoQixDQUFiO0FBQUEsc0JBQTRDNEMsWUFBWSxHQUFDLEVBQXpEOztBQUNBLHNCQUFJLEtBQUt4RCxNQUFMLEtBQWdCLEdBQXBCLEVBQ0E7QUFDSSx3QkFBTXlELFdBQVcsR0FBQ2hELFFBQVEsQ0FBQzVHLE1BQTNCO0FBQ0Esd0JBQUc0SixXQUFXLEtBQUcsQ0FBakIsRUFDSUQsWUFBWSxHQUFDck8sb0JBQWIsQ0FESixLQUdBO0FBQ0lxTyxrQ0FBWSxHQUFDdE8sb0JBQW9CLENBQUNtRixPQUFyQixDQUE2QixLQUE3QixFQUFvQ29KLFdBQXBDLENBQWI7O0FBQ0EsMkJBQUksSUFBSXRDLENBQVIsSUFBYVYsUUFBYjtBQUNJK0Msb0NBQVksSUFBRS9DLFFBQVEsQ0FBQ1UsQ0FBRCxDQUFSLENBQVlsUixJQUFaLEdBQWlCLElBQWpCLEdBQXNCd1EsUUFBUSxDQUFDVSxDQUFELENBQVIsQ0FBWWpSLEtBQWxDLEdBQXdDLElBQXREO0FBREo7QUFFSDtBQUNKOztBQUNEMFAsa0ZBQVUsQ0FBQ2xCLFlBQUQsRUFBZSxHQUFmLEVBQW9COEUsWUFBcEIsRUFBa0MsRUFBbEMsRUFBc0MsQ0FBQyxNQUFELENBQXRDLENBQVY7QUFDSDtBQUNKLGVBbkJEOztBQW9CQUQsNkJBQWUsQ0FBQzFCLGdCQUFoQixDQUFpQyxlQUFqQyxFQUFrRCxZQUFVL0IsSUFBSSxDQUFDZ0MsS0FBakU7QUFDQXlCLDZCQUFlLENBQUN4QixJQUFoQjtBQUNIOztBQTdNVTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQWlOWG5DLDRFQUFVLENBQUN4QixRQUFELEVBQVcsR0FBWCxFQUFnQnhNLFdBQWhCLEVBQTZCLEVBQTdCLEVBQWlDLENBQUMsT0FBRCxDQUFqQyxDQUFWO0FBQ0E4UixtQkFBTyxDQUFDQyxLQUFSOztBQWxOVztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxHQUFIOztBQUFBLGtCQUFWM0UsVUFBVTtBQUFBO0FBQUE7QUFBQSxHQUFoQjs7QUFxTkFBLFVBQVUsRzs7Ozs7Ozs7Ozs7O0FDblFWO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVPLElBQU00RSxVQUFVLEdBQUcsU0FBYkEsVUFBYSxDQUFDM1QsSUFBRCxFQUFPOFEsSUFBUCxFQUMxQjtBQUNJOEMsY0FBWSxDQUFDQyxPQUFiLENBQXFCN1QsSUFBckIsRUFBMkJ5USxJQUFJLENBQUNvQyxTQUFMLENBQWUvQixJQUFmLENBQTNCO0FBQ0gsQ0FITTtBQUtBLElBQU1wQixTQUFTLEdBQUcsU0FBWkEsU0FBWSxDQUFDMVAsSUFBRCxFQUN6QjtBQUFBLE1BRGdDOFQsSUFDaEMsdUVBRHFDLEtBQ3JDO0FBQ0ksTUFBR0EsSUFBSCxFQUNJLE9BQU9yRCxJQUFJLENBQUNDLEtBQUwsQ0FBV2tELFlBQVksQ0FBQ0csT0FBYixDQUFxQi9ULElBQXJCLENBQVgsQ0FBUCxDQURKLEtBR0ksT0FBTzRULFlBQVksQ0FBQ0csT0FBYixDQUFxQi9ULElBQXJCLENBQVA7QUFDUCxDQU5NO0FBUUEsSUFBTTRQLFlBQVksR0FBRyxTQUFmQSxZQUFlLENBQUM1UCxJQUFELEVBQzVCO0FBQ0k0VCxjQUFZLENBQUNJLFVBQWIsQ0FBd0JoVSxJQUF4QjtBQUNILENBSE0sQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NDZFA7O0FBQ08sSUFBTTJQLFVBQVUsR0FBRyxTQUFiQSxVQUFhLENBQUNzRSxTQUFELEVBQVlDLE9BQVosRUFDMUI7QUFBQSxNQUQrQ0MsVUFDL0MsdUVBRDBELEVBQzFEO0FBQUEsTUFEOERDLEtBQzlELHVFQURvRSxFQUNwRTtBQUFBLE1BRHdFQyxRQUN4RSx1RUFEaUYsRUFDakY7QUFBQSxNQURxRkMsYUFDckYsdUVBRG1HLEVBQ25HO0FBQUEsTUFEdUdsSyxPQUN2Ryx1RUFEK0csSUFDL0c7QUFDSSxNQUFHViwyREFBTyxDQUFDd0ssT0FBRCxDQUFQLElBQW9CeEssMkRBQU8sQ0FBQ3VLLFNBQUQsQ0FBOUIsRUFDSSxPQUFPLEtBQVAsQ0FESixLQUdBO0FBQ0ksUUFBTU0sVUFBVSxHQUFDbkcsUUFBUSxDQUFDb0csYUFBVCxDQUF1Qk4sT0FBdkIsQ0FBakI7QUFFQSxRQUFHLENBQUN4SywyREFBTyxDQUFDMEssS0FBRCxDQUFYLEVBQW1CO0FBQ2ZHLGdCQUFVLENBQUMvSSxFQUFYLEdBQWM0SSxLQUFkOztBQUVKLFFBQUczQixLQUFLLENBQUNDLE9BQU4sQ0FBYzJCLFFBQWQsS0FBMkJBLFFBQVEsQ0FBQ3pLLE1BQVQsSUFBaUIsQ0FBL0MsRUFDQTtBQUNJLFdBQUksSUFBSXNILENBQVIsSUFBYW1ELFFBQWI7QUFDSUUsa0JBQVUsQ0FBQ0UsU0FBWCxDQUFxQkMsR0FBckIsQ0FBeUJMLFFBQVEsQ0FBQ25ELENBQUQsQ0FBakM7QUFESjtBQUVIOztBQUVELFFBQUcsUUFBT29ELGFBQVAsTUFBeUIsUUFBNUIsRUFBc0M7QUFDdEM7QUFDSSxhQUFJLElBQUlLLFlBQVIsSUFBd0JMLGFBQXhCO0FBQ0lDLG9CQUFVLENBQUNLLFlBQVgsQ0FBd0JELFlBQXhCLEVBQXNDTCxhQUFhLENBQUNLLFlBQUQsQ0FBbkQ7QUFESjtBQUVIOztBQUVELFFBQUcsQ0FBQ2pMLDJEQUFPLENBQUN5SyxVQUFELENBQVgsRUFDSUksVUFBVSxDQUFDbkQsU0FBWCxHQUFxQitDLFVBQVUsQ0FBQy9KLE9BQVgsQ0FBbUIsS0FBbkIsRUFBeUIsTUFBekIsQ0FBckIsQ0FuQlIsQ0FtQjhEOztBQUUxRCxRQUFHQSxPQUFILEVBQ0k2SixTQUFTLENBQUM3QyxTQUFWLEdBQW9CLEVBQXBCO0FBQ0o2QyxhQUFTLENBQUNZLFdBQVYsQ0FBc0JOLFVBQXRCO0FBQ0g7QUFDSixDQTlCTSxDOzs7Ozs7Ozs7Ozs7QUNIUDtBQUFBO0FBQUE7QUFBQTtBQUVPLElBQU16RixRQUFRLEdBQUcsU0FBWEEsUUFBVyxHQUN4QjtBQUNJMkUsU0FBTyxDQUFDcUIsR0FBUixDQUFZLDROQUFaO0FBQ0EsU0FBTyxJQUFQO0FBQ0gsQ0FKTTtBQU1BLElBQU1oRixpQkFBaUIsR0FBRyxTQUFwQkEsaUJBQW9CLENBQUNDLE1BQUQsRUFBUzlCLGNBQVQsRUFDakM7QUFDSSxNQUFNOEcsSUFBSSxHQUFDM0csUUFBUSxDQUFDQyxjQUFULENBQXdCLGlCQUF4QixDQUFYO0FBQ0EsTUFBTTJHLFFBQVEsR0FBQ2pGLE1BQU0sR0FBQyxVQUF0QjtBQUNBZ0YsTUFBSSxDQUFDeEosSUFBTCxHQUFVLE1BQUkwQyxjQUFjLENBQUMrRyxRQUFELENBQTVCO0FBQ0gsQ0FMTSxDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NDTlA7O0FBQ08sSUFBTWhGLHFCQUFxQixHQUFHLFNBQXhCQSxxQkFBd0IsQ0FBQ2lGLFVBQUQsRUFBYUMsTUFBYixFQUNyQztBQUNJLE9BQUksSUFBSWhFLENBQVIsSUFBYWdFLE1BQU0sQ0FBQ25FLFFBQXBCLEVBQ0E7QUFDSSxRQUFHLENBQUNySCwyREFBTyxDQUFDd0wsTUFBTSxDQUFDbkUsUUFBUCxDQUFnQkcsQ0FBaEIsRUFBbUIxRixFQUFwQixDQUFYLEVBQ0E7QUFDSSxVQUFJMkosT0FBTyxHQUFDRCxNQUFNLENBQUNuRSxRQUFQLENBQWdCRyxDQUFoQixFQUFtQjFGLEVBQS9COztBQUNBLFVBQUd5SixVQUFVLENBQUNFLE9BQUQsQ0FBVixLQUFzQjVMLFNBQXpCLEVBQ0E7QUFDSSxZQUFJNkwsU0FBUyxHQUFDaEgsUUFBUSxDQUFDQyxjQUFULENBQXdCOEcsT0FBeEIsQ0FBZDs7QUFDQSxhQUFLLElBQUlFLFNBQVQsSUFBc0JKLFVBQVUsQ0FBQ0UsT0FBRCxDQUFoQztBQUNJQyxtQkFBUyxDQUFDUixZQUFWLENBQXVCUyxTQUF2QixFQUFrQ0osVUFBVSxDQUFDRSxPQUFELENBQVYsQ0FBb0JFLFNBQXBCLENBQWxDO0FBREo7QUFFSDtBQUNKO0FBQ0o7O0FBQ0QsU0FBTyxJQUFQO0FBQ0gsQ0FoQk0sQyxDQWtCUDs7QUFDTyxJQUFNbEQsa0JBQWtCLEdBQUcsU0FBckJBLGtCQUFxQixDQUFDK0MsTUFBRCxFQUNsQztBQUNJLE1BQU1oRCxLQUFLLEdBQUMsRUFBWjtBQUNBLE1BQU1vRCxRQUFRLEdBQUcsSUFBSUMsUUFBSixDQUFhTCxNQUFiLENBQWpCOztBQUZKLDZDQUdzQkksUUFBUSxDQUFDRSxPQUFULEVBSHRCO0FBQUE7O0FBQUE7QUFHSTtBQUFBLFVBQVFDLE1BQVI7QUFDR3ZELFdBQUssQ0FBQ3VELE1BQU0sQ0FBQyxDQUFELENBQVAsQ0FBTCxHQUFpQkEsTUFBTSxDQUFDLENBQUQsQ0FBdkI7QUFESDtBQUhKO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBS0ksU0FBT3ZELEtBQVA7QUFDSCxDQVBNLEMsQ0FTUDtBQUNBOztBQUNPLElBQU13RCxRQUFRLEdBQUcsU0FBWEEsUUFBVyxDQUFDUixNQUFELEVBQ3hCO0FBQ0ksTUFBTUksUUFBUSxHQUFHLElBQUlDLFFBQUosQ0FBYUwsTUFBYixDQUFqQjs7QUFESiw4Q0FFc0JJLFFBQVEsQ0FBQ0UsT0FBVCxFQUZ0QjtBQUFBOztBQUFBO0FBRUksMkRBQ0E7QUFBQSxVQURRQyxNQUNSO0FBQ0ksVUFBR1AsTUFBTSxDQUFDbkUsUUFBUCxDQUFnQjBFLE1BQU0sQ0FBQyxDQUFELENBQXRCLEVBQTJCRSxJQUEzQixJQUFpQyxVQUFqQyxJQUErQ1QsTUFBTSxDQUFDbkUsUUFBUCxDQUFnQjBFLE1BQU0sQ0FBQyxDQUFELENBQXRCLEVBQTJCRSxJQUEzQixJQUFpQyxPQUFuRixFQUNJVCxNQUFNLENBQUNuRSxRQUFQLENBQWdCMEUsTUFBTSxDQUFDLENBQUQsQ0FBdEIsRUFBMkJ6RSxPQUEzQixHQUFtQyxLQUFuQyxDQURKLEtBR0lrRSxNQUFNLENBQUNuRSxRQUFQLENBQWdCMEUsTUFBTSxDQUFDLENBQUQsQ0FBdEIsRUFBMkJwVixLQUEzQixHQUFpQyxFQUFqQztBQUNQO0FBUkw7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFTSSxTQUFPLElBQVA7QUFDSCxDQVhNLEMsQ0FZUDs7QUFDTyxJQUFNdVYsZUFBZSxHQUFHLFNBQWxCQSxlQUFrQixDQUFDVixNQUFELEVBQy9CO0FBQ0lRLFVBQVEsQ0FBQ1IsTUFBRCxDQUFSO0FBQ0FBLFFBQU0sQ0FBQzVGLEtBQVAsQ0FBYUMsT0FBYixHQUFxQixNQUFyQjtBQUNILENBSk0sQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM5Q1A7QUFDQSxJQUFNNUUsSUFBSSxHQUFDL1Esa0VBQWMsQ0FBQyxDQUFELENBQXpCOztBQUVBLElBQU1xVSxjQUFjLEdBQUdqViwrREFBUSxJQUFpQixHQUFDVyx5REFBbEIsR0FBd0IsVUFBeEIsR0FBbUNnUixJQUFuQyxHQUF3QyxLQUF6QyxDQUE5Qjs7QUFFQTtBQUVBO0FBQ0E7QUFFTyxJQUFNMkgsaUJBQWlCLEdBQUcsU0FBcEJBLGlCQUFvQixHQUNqQztBQUNJO0FBQ0EsTUFBTXVELFNBQVMsR0FBQyxJQUFJaEwsSUFBSixHQUFXaUwsaUJBQVgsS0FBK0IsQ0FBQyxDQUFoRDtBQUNBLE1BQUdELFNBQVMsR0FBR3RWLGtFQUFaLElBQWlDc1YsU0FBUyxHQUFHdlYsa0VBQWhELEVBQ0ksT0FBTyxDQUFQLENBREosS0FHSSxPQUFPdVYsU0FBUDtBQUNQLENBUk0sQyxDQVVQO0FBQ0E7O0FBQ08sSUFBTUUsV0FBVyxHQUFHLFNBQWRBLFdBQWMsQ0FBQ0MsUUFBRCxFQUFXQyxRQUFYLEVBQzNCO0FBQ0ksTUFBTUMsS0FBSyxHQUFDRixRQUFRLEdBQUMxTCxJQUFJLENBQUNFLEtBQUwsQ0FBV0YsSUFBSSxDQUFDRyxNQUFMLE1BQWV3TCxRQUFRLEdBQUNELFFBQXhCLENBQVgsQ0FBckI7QUFDQSxNQUFNRyxPQUFPLEdBQUMsb0RBQWQ7QUFDQSxNQUFNQyxNQUFNLEdBQUMsOEJBQWI7QUFDQSxNQUFJcmEsUUFBUSxHQUFDb2EsT0FBTyxDQUFDN0wsSUFBSSxDQUFDRSxLQUFMLENBQVdGLElBQUksQ0FBQ0csTUFBTCxLQUFjMEwsT0FBTyxDQUFDdk0sTUFBakMsQ0FBRCxDQUFwQjs7QUFDQSxPQUFJLElBQUlzSCxDQUFDLEdBQUMsQ0FBVixFQUFZQSxDQUFDLEdBQUVnRixLQUFLLEdBQUMsQ0FBckIsRUFBd0JoRixDQUFDLEVBQXpCLEVBQ0E7QUFDSSxRQUFJQSxDQUFDLEdBQUcsQ0FBTCxLQUFXLENBQWQsRUFDSW5WLFFBQVEsSUFBRXFhLE1BQU0sQ0FBQzlMLElBQUksQ0FBQ0UsS0FBTCxDQUFXRixJQUFJLENBQUNHLE1BQUwsS0FBYzJMLE1BQU0sQ0FBQ3hNLE1BQWhDLENBQUQsQ0FBaEIsQ0FESixLQUdJN04sUUFBUSxJQUFFb2EsT0FBTyxDQUFDN0wsSUFBSSxDQUFDRSxLQUFMLENBQVdGLElBQUksQ0FBQ0csTUFBTCxLQUFjMEwsT0FBTyxDQUFDdk0sTUFBakMsQ0FBRCxDQUFqQjtBQUNQOztBQUNEN04sVUFBUSxJQUFFb2EsT0FBTyxDQUFDN0wsSUFBSSxDQUFDRSxLQUFMLENBQVdGLElBQUksQ0FBQ0csTUFBTCxLQUFjMEwsT0FBTyxDQUFDdk0sTUFBakMsQ0FBRCxDQUFqQjtBQUNBLFNBQU83TixRQUFQO0FBQ0gsQ0FmTSxDLENBaUJQO0FBQ0E7O0FBQ08sSUFBTXNhLFVBQVUsR0FBRyxTQUFiQSxVQUFhLENBQUNDLE1BQUQsRUFBU3pFLEtBQVQsRUFBZ0IwRSxVQUFoQixFQUMxQjtBQUNJLE1BQU1DLFdBQVcsR0FDakI7QUFDSWhMLE1BQUUsRUFBRThLLE1BRFI7QUFFSXpFLFNBQUssRUFBRUEsS0FGWDtBQUdJNEUsWUFBUSxFQUFFRjtBQUhkLEdBREE7QUFNQTVDLHNFQUFVLENBQUMsTUFBRCxFQUFTNkMsV0FBVCxDQUFWO0FBQ0gsQ0FUTSxDLENBV1A7QUFDQTs7QUFDTyxJQUFNRSxnQkFBZ0IsR0FBRyxTQUFuQkEsZ0JBQW1CLENBQUN4RSxLQUFELEVBQ2hDO0FBQ0ksTUFBTXlFLFVBQVUsR0FBQ2pILG1FQUFTLENBQUMsWUFBRCxDQUExQjs7QUFDQSxNQUFHLENBQUNoRywyREFBTyxDQUFDaU4sVUFBRCxDQUFYLEVBQ0E7QUFDSSxRQUFNQyxNQUFNLEdBQUNuRyxJQUFJLENBQUNDLEtBQUwsQ0FBV2lHLFVBQVgsQ0FBYjs7QUFDQSxRQUFHLENBQUNqTiwyREFBTyxDQUFDa04sTUFBTSxDQUFDSCxRQUFSLENBQVIsSUFBNkIsQ0FBQy9NLDJEQUFPLENBQUNrTixNQUFNLENBQUNDLGdCQUFSLENBQXJDLElBQWtFLENBQUNuTiwyREFBTyxDQUFDa04sTUFBTSxDQUFDRSxlQUFSLENBQTFFLElBQXNHLENBQUNwTiwyREFBTyxDQUFDa04sTUFBTSxDQUFDRyxXQUFSLENBQWpILEVBQ0E7QUFDSTdFLFdBQUssQ0FBQ3VFLFFBQU4sR0FBZUcsTUFBTSxDQUFDSCxRQUF0QjtBQUNBdkUsV0FBSyxDQUFDMkUsZ0JBQU4sR0FBdUJELE1BQU0sQ0FBQ0MsZ0JBQTlCO0FBQ0EzRSxXQUFLLENBQUM0RSxlQUFOLEdBQXNCRixNQUFNLENBQUNFLGVBQTdCO0FBQ0E1RSxXQUFLLENBQUM2RSxXQUFOLEdBQWtCSCxNQUFNLENBQUNHLFdBQXpCO0FBQ0g7QUFDSjs7QUFDRCxTQUFPN0UsS0FBUDtBQUNILENBZk0sQyxDQWlCUDtBQUNBOztBQUNPLElBQU1sRCxZQUFZO0FBQUEscUVBQUc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBT2Usa0JBQVAsMkRBQWMsRUFBZDtBQUFrQmlILDBCQUFsQjtBQUFrQy9ILG1CQUFsQztBQUEyQ2dJLHFCQUEzQztBQUFBLDZDQUVqQixJQUFJQyxPQUFKLENBQVksVUFBQ0MsT0FBRCxFQUFVQyxNQUFWLEVBQ25CO0FBQ0ksa0JBQU1DLFNBQVMsR0FBQzNILG1FQUFTLENBQUMsTUFBRCxDQUF6Qjs7QUFDQSxrQkFBR2hHLDJEQUFPLENBQUMyTixTQUFELENBQVYsRUFDQTtBQUNJQyw0QkFBWSxDQUFDTixjQUFELEVBQWlCL0gsT0FBakIsRUFBMEJnSSxTQUExQixDQUFaO0FBQ0FFLHVCQUFPLENBQUMsS0FBRCxDQUFQO0FBQ0gsZUFKRCxNQU1BO0FBQ0ksb0JBQU10SCxJQUFJLEdBQUNZLElBQUksQ0FBQ0MsS0FBTCxDQUFXMkcsU0FBWCxDQUFYOztBQUNBLG9CQUFHM04sMkRBQU8sQ0FBQ21HLElBQUksQ0FBQ3JFLEVBQU4sQ0FBUCxJQUFvQjlCLDJEQUFPLENBQUNtRyxJQUFJLENBQUNnQyxLQUFOLENBQTNCLElBQTJDbkksMkRBQU8sQ0FBQ21HLElBQUksQ0FBQzRHLFFBQU4sQ0FBbEQsSUFBcUU1RyxJQUFJLENBQUM0RyxRQUFMLEdBQWdCNUwsSUFBSSxDQUFDOEcsR0FBTCxFQUF4RixFQUNBO0FBQ0kvQix3RkFBWSxDQUFDLE1BQUQsQ0FBWjtBQUNBMEgsOEJBQVksQ0FBQ04sY0FBRCxFQUFpQi9ILE9BQWpCLEVBQTBCZ0ksU0FBMUIsQ0FBWjtBQUNBRSx5QkFBTyxDQUFDLEtBQUQsQ0FBUDtBQUNILGlCQUxELE1BT0E7QUFDSSxzQkFBTUksR0FBRyxHQUFHLElBQUlwSCxjQUFKLEVBQVo7QUFDQW9ILHFCQUFHLENBQUNuSCxJQUFKLENBQVMsS0FBVCxFQUFnQmhYLDBEQUFNLEdBQUN5RiwyREFBUCxHQUFrQkcsZ0VBQWxCLEdBQWtDNlEsSUFBSSxDQUFDZ0MsS0FBdkQ7O0FBQ0EwRixxQkFBRyxDQUFDQyxNQUFKLEdBQWEsWUFDYjtBQUNJLHdCQUFJaEgsUUFBUSxHQUFDQyxJQUFJLENBQUNDLEtBQUwsQ0FBVzZHLEdBQUcsQ0FBQzVHLFlBQWYsQ0FBYjs7QUFDQSx3QkFBSTRHLEdBQUcsQ0FBQ3hILE1BQUosS0FBZSxHQUFmLElBQXNCUyxRQUFRLENBQUNpSCxPQUEvQixJQUEwQ2pILFFBQVEsQ0FBQ2hGLEVBQVQsSUFBZWpDLFNBQTdELEVBQ0E7QUFDSSwwQkFBR2lILFFBQVEsQ0FBQ2hGLEVBQVQsS0FBY3FFLElBQUksQ0FBQ3JFLEVBQXRCLEVBQ0E7QUFDSXFFLDRCQUFJLENBQUM3UCxJQUFMLEdBQVV3USxRQUFRLENBQUN4USxJQUFuQjtBQUNBNlAsNEJBQUksQ0FBQzZILFFBQUwsR0FBY2xILFFBQVEsQ0FBQ2tILFFBQXZCO0FBQ0E3SCw0QkFBSSxDQUFDd0MsY0FBTCxHQUFvQjdCLFFBQVEsQ0FBQzZCLGNBQTdCO0FBQ0F4Qyw0QkFBSSxDQUFDRSxNQUFMLEdBQVlTLFFBQVEsQ0FBQ1QsTUFBckIsQ0FKSixDQUlnQzs7QUFDNUI0RCw0RkFBVSxDQUFDLE1BQUQsRUFBUzlELElBQVQsQ0FBVixDQUxKLENBTUk7O0FBQ0EsNEJBQUdXLFFBQVEsQ0FBQ1QsTUFBVCxLQUFrQixNQUFsQixJQUE0QlMsUUFBUSxDQUFDZ0IsUUFBVCxJQUFxQixDQUFwRCxFQUNBO0FBQ0ksOEJBQU1tRyxVQUFVLEdBQUN0ZSwyREFBTyxHQUFDLEdBQVIsR0FBWTRVLGNBQWMsQ0FBQ2hDLFdBQTVDO0FBQ0EsOEJBQUdrRCxNQUFNLENBQUNDLFFBQVAsQ0FBZ0I3RCxJQUFoQixDQUFxQnFNLE9BQXJCLENBQTZCRCxVQUE3QixNQUEyQyxDQUFDLENBQS9DLEVBQ0l4SSxNQUFNLENBQUNDLFFBQVAsQ0FBZ0JLLE1BQWhCLENBQXVCLE1BQUl4QixjQUFjLENBQUNoQyxXQUFuQixHQUErQixZQUF0RCxFQUhSLENBRzRFOztBQUN4RWtMLGlDQUFPLENBQUMsSUFBRCxDQUFQO0FBQ0gseUJBTkQsTUFRQTtBQUNJLDhCQUFHcEgsTUFBTSxDQUFDbkcsTUFBUCxLQUFnQixDQUFoQixJQUFxQm1HLE1BQU0sQ0FBQzZILE9BQVAsQ0FBZXBILFFBQVEsQ0FBQ1QsTUFBeEIsTUFBa0MsQ0FBQyxDQUEzRCxFQUNBO0FBQ0l1SCx3Q0FBWSxDQUFDTixjQUFELEVBQWlCL0gsT0FBakIsRUFBMEJnSSxTQUExQixDQUFaO0FBQ0FFLG1DQUFPLENBQUMsS0FBRCxDQUFQO0FBQ0gsMkJBSkQsTUFNSUEsT0FBTyxDQUFDLElBQUQsQ0FBUDtBQUNQO0FBQ0osdUJBekJELE1BMkJBO0FBQ0l2SCw4RkFBWSxDQUFDLE1BQUQsQ0FBWjtBQUNBMEgsb0NBQVksQ0FBQ04sY0FBRCxFQUFpQi9ILE9BQWpCLEVBQTBCZ0ksU0FBMUIsQ0FBWjtBQUNBRSwrQkFBTyxDQUFDLEtBQUQsQ0FBUDtBQUNIO0FBQ0oscUJBbENELE1Bb0NBO0FBQ0l2SCw0RkFBWSxDQUFDLE1BQUQsQ0FBWjtBQUNBMEgsa0NBQVksQ0FBQ04sY0FBRCxFQUFpQi9ILE9BQWpCLEVBQTBCZ0ksU0FBMUIsQ0FBWjtBQUNBRSw2QkFBTyxDQUFDLEtBQUQsQ0FBUDtBQUNIO0FBQ0osbUJBNUNEOztBQTZDQUkscUJBQUcsQ0FBQ00sT0FBSixHQUFjO0FBQUEsMkJBQU1ULE1BQU0sQ0FBQ0csR0FBRyxDQUFDTyxVQUFMLENBQVo7QUFBQSxtQkFBZDs7QUFDQVAscUJBQUcsQ0FBQ3pGLElBQUo7QUFDSDtBQUNKO0FBQ0osYUF0RU0sQ0FGaUI7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsR0FBSDs7QUFBQSxrQkFBWjlDLFlBQVk7QUFBQTtBQUFBO0FBQUEsR0FBbEIsQyxDQTBFUDs7QUFDQSxJQUFNc0ksWUFBWSxHQUFHLFNBQWZBLFlBQWUsQ0FBQ04sY0FBRCxFQUFpQi9ILE9BQWpCLEVBQTBCZ0ksU0FBMUIsRUFDckI7QUFDSSxNQUFHLENBQUN2TiwyREFBTyxDQUFDdUYsT0FBRCxDQUFYLEVBQ0kwRSxvRUFBVSxDQUFDLFNBQUQsRUFBWTFFLE9BQVosQ0FBVjtBQUNKLE1BQUcsQ0FBQ3ZGLDJEQUFPLENBQUN1TixTQUFELENBQVgsRUFDSXRELG9FQUFVLENBQUMsS0FBRCxFQUFRc0QsU0FBUixDQUFWO0FBQ0osTUFBRyxDQUFDdk4sMkRBQU8sQ0FBQ3NOLGNBQUQsQ0FBWCxFQUNJN0gsTUFBTSxDQUFDQyxRQUFQLENBQWdCSyxNQUFoQixDQUF1QnVILGNBQXZCO0FBQ1AsQ0FSRCxDOzs7Ozs7Ozs7Ozs7QUNwSkE7QUFBQTtBQUFBO0FBQUEsSUFBTWUsVUFBVSxHQUNoQjtBQUNJLFNBQVEzSixRQUFRLENBQUNDLGNBQVQsQ0FBd0IsT0FBeEIsQ0FEWjtBQUVJLFVBQVNELFFBQVEsQ0FBQ0MsY0FBVCxDQUF3QixNQUF4QixDQUZiO0FBR0ksV0FBVUQsUUFBUSxDQUFDQyxjQUFULENBQXdCLE9BQXhCLENBSGQ7QUFJSSxXQUFVRCxRQUFRLENBQUNDLGNBQVQsQ0FBd0IsT0FBeEIsQ0FKZDtBQUtJLFdBQVVELFFBQVEsQ0FBQ0MsY0FBVCxDQUF3QixPQUF4QjtBQUxkLENBREE7QUFRQSxJQUFNOEUsU0FBUyxHQUFDL0UsUUFBUSxDQUFDQyxjQUFULENBQXdCLFFBQXhCLENBQWhCLEMsQ0FFQTs7QUFDTyxJQUFNK0UsZ0JBQWdCLEdBQUcsU0FBbkJBLGdCQUFtQixDQUFDNEUsTUFBRCxFQUNoQztBQUNJLE9BQUssSUFBSXhNLEVBQVQsSUFBZXVNLFVBQWYsRUFDQTtBQUNJLFFBQUd2TSxFQUFFLEtBQUd3TSxNQUFSLEVBQ0lELFVBQVUsQ0FBQ3ZNLEVBQUQsQ0FBVixDQUFld0YsT0FBZixHQUF1QixLQUF2QjtBQUNKbUMsYUFBUyxDQUFDN0QsS0FBVixDQUFnQkMsT0FBaEIsR0FBd0IsTUFBeEI7QUFDSDtBQUNKLENBUk07QUFXUCxJQUFNMEksSUFBSSxHQUNWO0FBQ0ksVUFBUzdKLFFBQVEsQ0FBQ0MsY0FBVCxDQUF3QixRQUF4QixDQURiO0FBRUksV0FBVUQsUUFBUSxDQUFDQyxjQUFULENBQXdCLFNBQXhCLENBRmQ7QUFHSSxXQUFVRCxRQUFRLENBQUNDLGNBQVQsQ0FBd0IsU0FBeEIsQ0FIZDtBQUlJLFdBQVVELFFBQVEsQ0FBQ0MsY0FBVCxDQUF3QixTQUF4QjtBQUpkLENBREEsQyxDQVFBOztBQUNPLElBQU1nRixjQUFjLEdBQUcsU0FBakJBLGNBQWlCLENBQUMyRSxNQUFELEVBQzlCO0FBQ0ksT0FBSyxJQUFJeE0sRUFBVCxJQUFleU0sSUFBZixFQUNBO0FBQ0ksUUFBR3pNLEVBQUUsS0FBR3dNLE1BQVIsRUFDSUMsSUFBSSxDQUFDek0sRUFBRCxDQUFKLENBQVM4RCxLQUFULENBQWVDLE9BQWYsR0FBdUIsTUFBdkIsQ0FESixLQUdJMEksSUFBSSxDQUFDek0sRUFBRCxDQUFKLENBQVM4RCxLQUFULENBQWVDLE9BQWYsR0FBdUIsT0FBdkI7QUFDUDtBQUNKLENBVE0sQyIsImZpbGUiOiIuL0pTL2FjY291bnRVc2VyLmFwcC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL2FjY291bnRVc2VyLmpzXCIpO1xuIiwiY29uc3QgdXNlcnMgPSByZXF1aXJlKFwiLi91c2Vyc1wiKTtcbmNvbnN0IHF1ZXN0aW9ubmFpcmVzID0gcmVxdWlyZShcIi4vcXVlc3Rpb25uYWlyZXNcIik7XG5cbm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBhcGlVcmw6IFwiaHR0cDovL2xvY2FsaG9zdDozMDAwL2FwaVwiLFxuICAgIHNpdGVVcmw6IFwiaHR0cDovL2xvY2FsaG9zdDo4MDgwXCIsXG4gICAgYWRtaW5OYW1lOiBcIkZhYnJpY2VcIixcbiAgICBhZG1pbkVtYWlsOiBcImRldkB3aWtpbGVybmkuY29tXCIsXG4gICAgc2VuZGVyTmFtZTogXCJXaWtpTGVybmkgKGxvY2FsKVwiLFxuICAgIHNlbmRlckVtYWlsOiBcImJvbmpvdXJAd2lraWxlcm5pLmNvbVwiLFxuICAgIGFkbWluTGFuZzogXCJmclwiLFxuICAgIHRoZW1lOiBcIndpa2lsZXJuaVwiLCAvLyBsZSB0aMOobWUgdXRpbGlzw6kgKGRhbnMgL3ZpZXdzKSBwb3VyIGfDqW7DqXJlciBsZXMgcGFnZXMgSFRNTC4gQ29udGllbnQgc2VzIHByb3ByZXMgZmljaGllcnMgZGUgY29uZmlndXJhdGlvbi5cbiAgICBhdmFpbGFibGVMYW5nczogW1wiZnJcIl0sLy8gTGFuZ3VhZ2VzIGluIHdoaWNoIHRoZSBzaXRlIGlzIGF2YWlsYWJsZS4gVGhlIGZpcnN0IG9uZSBpcyB0aGUgZGVmYXVsdCBvbmUuXG4gICAgc2l0ZU5hbWU6IFwiV2lraUxlcm5pIChsb2NhbClcIixcbiAgICBiZWdpbkNvZGVHb2RmYXRoZXI6IFwiV0xcIiwgLy8gY2FzZS1zZW5zaXRpdmUgYW5kIGNhbid0IGNvbnRhaW4gXCJAXCIgIVxuICAgIGRlZmF1bHRSZWNlaXB0RGF5czogXCIxNDdcIiwgLy8gUGFyIGTDqWZhdXQsIHF1ZWwocykgam91cihzKSBkZSBsYSBzZW1haW5lLCBsJ3V0aWxpc2F0ZXVyIHJlw6dvaXQtaWwgcXVlbHF1ZSBjaG9zZSA/ICgxPWRpbWFuY2hlLCAyPWx1bmRpLi4uIDc9c2FtZWRpKVxuICAgIGNyb25UaW1pbmdBbGVydEluU2Vjb25kZTogMTIwLCAvLyBmb3IgbG9nc1xuICAgIHJlc3BvbnNlVGltaW5nQWxlcnRJblNlY29uZGU6IDMsIC8vIGlkZW1cbiAgICB0b2tlblNpZ251cFZhbGlkYXRpb25UaW1lSW5Ib3VyczogXCI0OGhcIiwgLy8gaHR0cHM6Ly9naXRodWIuY29tL3plaXQvbXNcbiAgICB0b2tlbkxvZ2luTGlua1RpbWVJbkhvdXJzOiBcIjFoXCIsXG4gICAgdG9rZW5Db25uZXhpb25NaW5UaW1lSW5Ib3VyczogXCIyNGhcIixcbiAgICB0b2tlbkNvbm5leGlvbk1heFRpbWVJbkRheXM6IFwiMTgwIGRheXNcIixcbiAgICB0b2tlbkxvZ2luQ2hhbmdpbmdUaW1lSW5Ib3VyczogXCIxaFwiLC8vIGZvciBlbWFpbCAmIHBhc3N3b3JkIGNoYW5naW5nXG4gICAgdG9rZW5EZWxldGVVc2VyVGltZUluSG91cnM6IFwiMWhcIixcbiAgICB0b2tlblVuc3Vic2NyaWJlTGlua1RpbWVJbkRheXM6IFwiNyBkYXlzXCIsIC8vIHRva2VuIHNlbmQgd2l0aCBzdWJzY3JpcHRpb24ncyBlbWFpbHNcbiAgICBmcmVlQWNjb3VudFRpbWluZ0luRGF5czogMTUsXG4gICAgZnJlZUFjY291bnRFeHBpcmF0aW9uTm90aWZpY2F0aW9uSW5EYXlzOiAzLFxuICAgIGFjY291bnRFeHBpcmF0aW9uRmlyc3ROb3RpZmljYXRpb25JbkRheXM6IDEwLFxuICAgIGFjY291bnRFeHBpcmF0aW9uU2Vjb25kTm90aWZpY2F0aW9uSW5EYXlzOiAzLFxuICAgIGluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5czogMTgwLFxuICAgIC8vIFF1ZXN0aW9ubmFpcmVzOlxuICAgIG5iUXVlc3Rpb25zTWluOiAxLCAvLyBtaW5pbXVtIG51bWJlciBvZiBxdWVzdGlvbnMgZm9yIHRoZSBxdWVzdGlvbm5haXJlIHRvIGJlIHB1Ymxpc2hhYmxlXG4gICAgbmJRdWVzdGlvbnNNYXg6IDIsIC8vIGlmIDAgPSBub3QgbWF4aW11bVxuICAgIG5iQ2hvaWNlc01heDogMTAsXG4gICAgbmJOZXdRdWVzdGlvbm5haXJlczogMTIsLy8gZm9yIFJTUywgZXRjLlxuICAgIGhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUJlZ2luOjcsIC8vIGluIHVzZXIgbG9jYWwgdGltZVxuICAgIGhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUVuZDoyMSwgLy8gaWRlbVxuICAgIG51bWJlck5ld1F1ZXN0aW9ubmFpcmVBdFNhbWVUaW1lOiA1MCwgLy8gZm9yIG1hc3MgbWFpbGluZ1xuICAgIG1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzOiAzLFxuICAgIGZpZWxkTmV3UXVlc3Rpb25uYWlyZXMgOiBcInB1Ymxpc2hpbmdBdFwiLCAvLyBmaWVsZCB0byBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgbGlzdCBvZiB0aGUgbGFzdCBxdWVzdGlvbm5haXJlcywgY2FuIGJlIFwiY3JlYXRlZEF0XCIsIFwidXBkYXRlZEF0XCIgb3IgXCJwdWJsaXNoaW5nQXRcIlxuICAgIC8vIElsbHVzdHJhdGlvbnM6XG4gICAgbmJJbGx1c3RyYXRpb25zTWluOiAwLFxuICAgIG5iSWxsdXN0cmF0aW9uc01heDogMSxcbiAgICBtYXhJbGx1c3RyYXRpb25TaXplaW5PY3RldDogMTAwMDAwMCwvLyBwYXMgY29udHLDtGzDqSBwb3VyIGwnaW5zdGFudC4gw4AgcmV2b2lyLlxuICAgIG1pbWVUeXBlc0ZvcklsbHVzdHJhdGlvbjogWyBcImltYWdlL2pwZ1wiLCBcImltYWdlL2pwZWdcIiwgXCJpbWFnZS9wbmdcIiwgXCJpbWFnZS9naWZcIiwgXCJpbWFnZS9wbmdcIiBdLFxuICAgIC8vIC0tIFVwbG9hZCBhbmQgcmVzaXplOlxuICAgIGlsbHVzdHJhdGlvbnNXaWR0aE1heEluUHg6IDUwMCxcbiAgICBpbGx1c3RyYXRpb25zTWluaWF0dXJlc1dpZHRoTWF4SW5QeDogMjAwLFxuICAgIC8vIExpbmtzOlxuICAgIG5iTGlua3NNaW46IDEsXG4gICAgbmJMaW5rc01heDogMSxcbiAgICAvLyBRdWVzdGlvbnMgJiByZXNwb25zZXM6XG4gICAgbmJRdWVzdGlvbnNNaW46IDEsXG4gICAgbmJRdWVzdGlvbnNNYXg6IDAsXG4gICAgbmJDaG9pY2VzTWF4OiAxMCxcbiAgICAvLyDDoCBzdXBwcmltZXIgcXVhbmQgdG91cyBsZXMgXCJyZXF1aXJlXCIgw6Agam91cjpcbiAgICBwYXNzd29yZE1pbkxlbmd0aDogdXNlcnMucGFzc3dvcmQubWlubGVuZ3RoLFxuICAgIGRpckNhY2hlVXNlcnM6IHVzZXJzLmRpckNhY2hlVXNlcnMsXG4gICAgZGlyQ2FjaGVVc2Vyc0Fuc3dlcnM6IHVzZXJzLmRpckNhY2hlVXNlcnNBbnN3ZXJzLFxuICAgIGRpckNhY2hlUXVlc3Rpb25uYWlyZXM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlUXVlc3Rpb25uYWlyZXMsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbnM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlUXVlc3Rpb25zLFxuICAgIGRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzLFxuICAgIGRpckhUTUxRdWVzdGlvbm5haXJlOiBxdWVzdGlvbm5haXJlcy5kaXJIVE1MUXVlc3Rpb25uYWlyZSxcbiAgICBkaXJXZWJRdWVzdGlvbm5haXJlOiBxdWVzdGlvbm5haXJlcy5kaXJXZWJRdWVzdGlvbm5haXJlXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbnsgICAgXG4gICAgLy8gQVBJJ3JvdXRlcyAoYWZ0ZXIgXCJhcGlVcmxcIiBkZWZpbmVkIGluIGluc3RhbmNlLmpzKVxuICAgIHF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3F1ZXN0aW9ubmFpcmVcIixcbiAgICBnZXRRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9nZXRcIixcbiAgICBwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcHJldmlld1wiLFxuICAgIHB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3F1aXovXCIsXG4gICAgc2F2ZUFuc3dlcnNSb3V0ZTogXCIvYW5zd2VyL1wiLFxuICAgIGdldFN0YXRzUXVlc3Rpb25uYWlyZXMgOiBcIi9zdGF0cy9cIixcbiAgICBzZWFyY2hRdWVzdGlvbm5haXJlc1JvdXRlIDogXCIvc2VhcmNoXCIsXG4gICAgZ2V0UmFuZG9tUXVlc3Rpb25uYWlyZXNSb3V0ZSA6IFwiL2dldHJhbmRvbVwiLFxuICAgIHNlYXJjaEFkbWluUXVlc3Rpb25uYWlyZXNSb3V0ZSA6IFwiL3NlYXJjaGFkbWluXCIsXG4gICAgZ2V0TGlzdE5leHRRdWVzdGlvbm5haXJlczogXCIvZ2V0bGlzdG5leHRxdWVzdGlvbm5haXJlcy9cIixcbiAgICByZWdlbmVyYXRlSFRNTDogXCIvaHRtbHJlZ2VuZXJhdGVkXCIsXG4gICAgLy8gLS0gcXVlc3Rpb25zICYgY2hvaWNlcyA6XG4gICAgcXVlc3Rpb25zUm91dGU6IFwiL3F1ZXN0aW9uL1wiLFxuICAgIC8vIC0tIHRhZ3MgOlxuICAgIHRhZ3NTZWFyY2hSb3V0ZTogXCIvdGFncy9zZWFyY2gvXCIsXG4gICAgLy8gLS0gYW5zd2VycyA6XG4gICAgZ2V0UXVlc3Rpb25uYWlyZXNXaXRob3V0QW5zd2VyOiBcIi93aXRob3V0YW5zd2VyL3VzZXIvXCIsXG4gICAgZ2V0UHJldmlvdXNBbnN3ZXJzOiBcIi91c2VyL2Fuc3dlcnMvXCIsXG4gICAgZ2V0U3RhdHNBbnN3ZXJzIDogXCIvdXNlci9hbndzd2Vycy9zdGF0cy9cIixcbiAgICBnZXRBZG1pblN0YXRzOiBcIi9nZXRhZG1pbnN0YXRzL1wiLFxuICAgIC8vIGZvcm1zIDogw6AgY29tcGzDqXRlciBhdmVjIHZhbGV1cnMgcGFyIGTDqWZhdXQsIGV0Yy4gY2YgbW9kw6hsZVxuICAgIFF1ZXN0aW9ubmFpcmUgOlxuICAgIHtcbiAgICAgICAgdGl0bGU6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgIHNsdWc6IHsgbWF4bGVuZ3RoOiAxNTAgfSwgLy8gY2hhbXAgcmVxdWlzIG1haXMgY2FsY3Vsw6kgw6AgcGFydGlyIGR1IHRpdHJlIHFkIHZpZGVcbiAgICAgICAgaW50cm9kdWN0aW9uOiB7IHJlcXVpcmVkOiB0cnVlIH1cbiAgICB9LFxuICAgIHNlYXJjaFF1ZXN0aW9ubmFpcmVzIDogeyBtaW5sZW5ndGg6IDMsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgUXVlc3Rpb24gOlxuICAgIHtcbiAgICAgICAgdGV4dDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgcmFuazogeyByZXF1aXJlZDogdHJ1ZSwgbWluOjEsIGRlZmF1bHRWYWx1ZToxIH1cbiAgICB9LCAgICAgICAgICBcbiAgICBDaG9pY2UgOlxuICAgIHtcbiAgICAgICAgdGV4dDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfVxuICAgIH0sXG4gICAgc2VhcmNoOiB7IG1pbmxlbmd0aDogMywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAvKiB2YWxldXJzIGVuIGZhaXQgZMOpZmluaWVzIGRhbnMgaW5zdGFuY2UuanMgZG9uYyDDoCBzdXBwcmltZXIgcXVhbmQgcGx1cyB1dGlsaXPDqWVzIGFpbGxldXJzICovXG4gICAgbmJRdWVzdGlvbnNNaW46IDEsXG4gICAgbmJRdWVzdGlvbnNNYXg6IDAsXG4gICAgbmJDaG9pY2VzTWF4OiAxMCxcbiAgICBuYlRhZ3NNaW46IDAsXG4gICAgbmJUYWdzTWF4OiAwLCAvLyAwID0gbm90IG1heCBcbiAgICAvLyBKU09OIGFuZCBIVE1MIGRpclxuICAgIGRpckNhY2hlUXVlc3Rpb25uYWlyZXMgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzXCIsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbnMgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzL3F1ZXN0aW9uc1wiLFxuICAgIGRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlcyA6IFwiZGF0YXMvdXNlcnMvcXVlc3Rpb25uYWlyZXNcIixcbiAgICBkaXJDYWNoZVRhZ3MgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzL3RhZ3NcIiwgIFxuICAgIGRpckhUTUxRdWVzdGlvbm5haXJlIDogXCJmcm9udC9wdWJsaWMvcXVpelwiLFxuICAgIGRpckhUTUxUYWdzIDogXCJmcm9udC9wdWJsaWMvcXVpenNcIixcbiAgICBkaXJXZWJRdWVzdGlvbm5haXJlIDogXCJxdWl6XCIsLy9wb3VyIHVybCBwYWdlXG4gICAgZGlyV2ViVGFncyA6IFwicXVpenMvXCIsLy8gaWRlbVxuICAgIG5iUmFuZG9tUmVzdWx0cyA6IDMvLyBsaW1pdGUgbGVzIHLDqXN1bHRhdCBkdSBtb3RldXIgZGUgcmVjaGVyY2hlIHF1YW5kIGRlbWFuZGUgZGUgcsOpc3VsdGF0cyBhdSBoYXNhcmRcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIC8vIEFQSSdyb3V0ZXMgKGFmdGVyIFwiYXBpVXJsXCIgZGVmaW5lZCBpbiBpbnN0YW5jZS5qcylcbiAgICB1c2VyUm91dGVzOiBcIi91c2VyXCIsXG4gICAgY2hlY2tEZWxldGVMaW5rUm91dGU6IFwiL2NvbmZpcm1kZWxldGUvXCIsICAgXG4gICAgY2hlY2tJZklzRW1haWxmcmVlUm91dGU6IFwiL2lzZW1haWxmcmVlXCIsXG4gICAgY2hlY2tMb2dpblJvdXRlOiBcIi9jaGVja2xvZ2luL1wiLFxuICAgIGNoZWNrTmV3TG9naW5MaW5rUm91dGU6IFwiL2NvbmZpcm1uZXdsb2dpbi9cIixcbiAgICBjaGVja1N1YnNjcmliZVRva2VuUm91dGU6IFwiL3ZhbGlkYXRpb24vXCIsXG4gICAgY29ubmVjdGlvblJvdXRlOiBcIi9sb2dpblwiLFxuICAgIGNvbm5lY3Rpb25XaXRoTGlua1JvdXRlOiBcIi9jaGVja2xvZ2lubGlua1wiLFxuICAgIGNyZWF0ZVVzZXJSb3V0ZTogXCIvY3JlYXRlXCIsXG4gICAgZ2V0QWRtaW5TdGF0czogXCIvZ2V0YWRtaW5zdGF0cy9cIixcbiAgICBnZXRHb2RDaGlsZHM6IFwiL2dldGdvZGNoaWxkcy9cIiwgICAgXG4gICAgZ2V0R29kZmF0aGVyUm91dGU6IFwiL2dldGdvZGZhdGhlcmlkXCIsXG4gICAgZ2V0TG9naW5MaW5rUm91dGU6IFwiL2dldGxvZ2lubGlua1wiLFxuICAgIGdldFBheW1lbnRzOiBcIi9wYXltZW50L2dldGZvcm9uZXVzZXIvXCIsXG4gICAgZ2V0VXNlckluZm9zOiBcIi9nZXQvXCIsXG4gICAgc2VhcmNoVXNlclJvdXRlOiBcIi9zZWFyY2gvXCIsICAgICAgICBcbiAgICBzdWJzY3JpYmVSb3V0ZTogXCIvc2lnbnVwXCIsXG4gICAgdW5zdWJzY3JpYmVSb3V0ZTogXCIvc3Vic2NyaXB0aW9uL3N0b3AvXCIsXG4gICAgdXBkYXRlVXNlckluZm9zOiBcIi9tb2RpZnkvXCIsXG4gICAgdmFsaWRhdGVVc2VyUm91dGU6IFwiL3ZhbGlkYXRlL1wiLFxuICAgIC8vIGZvcm1zIDogw6AgY29tcGzDqXRlciBhdmVjIHZhbGV1cnMgcGFyIGTDqWZhdXQsIGV0Yy4gY2YgbW9kw6hsZVxuICAgIG5hbWU6IHsgbWF4bGVuZ3RoOiA3MCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBlbWFpbDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBwYXNzd29yZDogeyBtaW5sZW5ndGg6IDgsIG1heGxlbmd0aDo3MiwgcmVxdWlyZWQ6IHRydWUgfSwgLy8gaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvYmNyeXB0I3NlY3VyaXR5LWlzc3Vlcy1hbmQtY29uY2VybnNcbiAgICBuZXdQYXNzd29yZDogeyBtaW5sZW5ndGg6IDgsIG1heGxlbmd0aDo3MiB9LFxuICAgIGNvZGVHb2RmYXRoZXI6IHsgbWF4bGVuZ3RoOiAyNTUgfSxcbiAgICBjZ3VPazogeyB2YWx1ZTogXCJ0cnVlXCIsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgc2VhcmNoOiB7IG1pbmxlbmd0aDogMSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICB0aW1lRGlmZmVyZW5jZU1pbjogLTcyMCxcbiAgICB0aW1lRGlmZmVyZW5jZU1heDo4NDAsXG4gICAgLy8gSlNPTiBkaXJcbiAgICBkaXJDYWNoZVVzZXJzIDogXCJkYXRhcy91c2Vyc1wiLFxuICAgIGRpckNhY2hlVXNlcnNBbnN3ZXJzIDogXCJkYXRhcy91c2Vycy9xdWVzdGlvbm5haXJlcy9hbnN3ZXJzXCIsXG4gICAgZGlyQ2FjaGVVc2Vyc1dpdGhvdXRBbnN3ZXJzIDogXCJkYXRhcy91c2Vycy9xdWVzdGlvbm5haXJlcy93aXRob3V0XCJcbn07XG4iLCJ2YXIgbWFwID0ge1xuXHRcIi4vZnIvZ2VuZXJhbFwiOiBcIi4uL2xhbmcvZnIvZ2VuZXJhbC5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi9sYW5nIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcL2dlbmVyYWwkXCI7IiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL3N1YnNjcmlwdGlvblwiOiBcIi4uL2xhbmcvZnIvc3Vic2NyaXB0aW9uLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvc3Vic2NyaXB0aW9uJFwiOyIsInZhciBtYXAgPSB7XG5cdFwiLi9mci91c2VyXCI6IFwiLi4vbGFuZy9mci91c2VyLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvdXNlciRcIjsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgYWRkQnRuVHh0OiBcIkFqb3V0ZXJcIixcbiAgICBhZGRPa01lc3NhZ2UgOiBcIkxlcyBkb25uw6llcyBvbnQgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWVzLlwiLFxuICAgIGFsZXJ0TmV3V2luZG93OiBcIm5vdXZlbGxlIGZlbsOqdHJlXCIsXG4gICAgYmFkVXJsIDogXCJUZW50YXRpdmUgZCdhY2PDqHMgw6AgdW5lIHBhZ2UgbidleGlzdGFudCBwYXMgOlwiLFxuICAgIGJ0bkxpbmtUb1F1ZXN0aW9ubmFpcmUgOiBcIkFsbGVyIGF1IHF1aXogIVwiLFxuICAgIGRlbGV0ZUJ0blR4dDogXCJTdXBwcmltZXJcIixcbiAgICBkZWxldGVPa01lc3NhZ2UgOiBcIkxhIHN1cHByZXNzaW9uIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgZmFpbEF1dGggOiBcIkVycmV1ciBkJ2F1dGhlbnRpZmljYXRpb24uXCIsXG4gICAgZmFpbEF1dGhDcm9uIDogXCJUZW50YXRpdmUgZGUgbGFuY2VtZW50IGQndW4gY3JvbiBzYW5zIGxlIGJvbiB0b2tlbi5cIixcbiAgICBmYWlsQXV0aEhlYWRlciA6IFwiQWJzZW5jZSBkZSBoZWFkZXIgQXV0aG9yaXphdGlvbi5cIixcbiAgICBmYWlsQXV0aElkIDogXCJJZGVudGlmaWFudCBub24gdmFsaWRlIDogXCIsXG4gICAgZmFpbEF1dGhUb2tlbiA6IFwiVG9rZW4gaW52YWxpZGUgb3UgdXRpbGlzYXRldXIgbm9uIHRyb3V2w6kuXCIsXG4gICAgbmVlZGVkUGFyYW1zIDogXCJEZXMgcGFyYW3DqHRyZXMgbsOpY2Vzc2FpcmVzIG1hbnF1YW50cyBzb250IG1hbnF1YW50cy5cIixcbiAgICBuZXh0UGFnZSA6IFwiUGFnZSBzdWl2YW50ZVwiLFxuICAgIG5vdEFsbG93ZWQgOiBcIlZvdXMgbidhdmV6IHBhcyBsZXMgZHJvaXRzIG7DqWNlc3NhaXJlcyBwb3VyIGNldHRlIGFjdGlvbi5cIixcbiAgICBub3RSZXF1aXJlZCA6IFwiRmFjdWx0YXRpZi5cIixcbiAgICBub3RWYWxpZEZvcm1hdCA6IFwiRm9ybWF0IG5vbiB2YWxpZGUuXCIsXG4gICAgcHJldmlvdXNQYWdlIDogXCJQYWdlIHByw6ljw6lkZW50ZVwiLFxuICAgIHNlcnZlckVycm9yIDogXCJEw6lzb2zDqS4gVW5lIGVycmV1ciBpbXByw6l2dWUgZXN0IHN1cnZlbnVlLiBTaSBjZWxhIHBlcnNpc3RlLCBuJ2jDqXNpdGV6IMOgIHByw6l2ZW5pciBsJ2FkbWluaXN0cmF0ZXVyIGR1IHNpdGUuXCIsXG4gICAgc2VydmVyRXJyb3JBZG1pbiA6IFwiQnVnIGRlIGwnYXBwbGljYXRpb24gOlwiLFxuICAgIHNpdGVIVE1MVGl0bGUgOiBcIldpa2lMZXJuaSA6IFdpa2lww6lkaWEgZW4gcXVlc3Rpb25zXCIsXG4gICAgc2l0ZU1ldGFEZXNjcmlwdGlvbiA6IFwiQXZlYyBXaWtpTGVybmksIHJlY2V2ZXogY2hhcXVlIGpvdXIgZGUgbm91dmVhdXggcXVpenMgcG91ciB0ZXN0ZXIgdm9zIGNvbm5haXNzYW5jZXMgZXQgYXBwcmVuZHJlIGRlIG5vdXZlbGxlcyBjaG9zZXMuXCIsXG4gICAgc2NyaXB0VGltaW5nQWxlcnQgOiBcIioqKiBTY3JpcHQgbGVudCA6IFNDUklQVF9USU1JTkcgbWlsbGlzZWNvbmRlcywgcm91dGUgOiBTQ1JJUFRfVVJMXCIsXG4gICAgc2NyaXB0VGltaW5nSW5mbyA6IFwiRHVyw6llIGRlIGxhIHLDqXBvbnNlIDogU0NSSVBUX1RJTUlORyBtaWxsaXNlY29uZGVzLCByb3V0ZSA6IFNDUklQVF9VUkxcIixcbiAgICBzdGF0c0FkbWluIDogXCJEdXJhbnQgbGVzIGRlcm5pw6hyZXMgMjRoIDogTkJfVVNFUlNfMjRIIGNvbXB0ZXMgb250IMOpdMOpIGNyw6nDqXMsIE5CX1NVQlNDUklQVElPTlNfMjRIIHZhbGlkw6lzIGV0IE5CX1VTRVJTX0RFTEVURURfMjRIIHN1cHByaW3DqXMuIE5CX0FOU1dFUlNfMjRIIHLDqXBvbnNlcyBhdXggcXVpenMgb250IMOpdMOpIGVucmVnaXN0csOpZXMuPGJyPkVuIHRvdXQsIGlsIHkgYSA6IE5CX1VTRVJTX1RPVCBjb21wdGVzLCBkb250IE5CX1NVQlNDUklQVElPTlNfVE9UIHZhbGlkw6lzIGV0IE5CX1NVQlNDUklQVElPTlNfUFJFTUlVTSBjb21wdGVzIHByw6ltaXVtLiBOQl9BTlNXRVJTX1RPVCByw6lwb25zZXMgYXV4IHF1aXpzIG9udCDDqXTDqSBlbnJlZ2lzdHLDqWVzLjxicj5QYXJtaSBsZXMgTkJfVVNFUlNfREVMRVRFRF9UT1QgY29tcHRlcyBzdXBwcmltw6lzLCBOQl9VU0VSU19ERUxFVEVEX1ZBTElERUQgYXZhaWVudCB2YWxpZMOpIGxldXIgY29tcHRlIGV0IE5CX1VTRVJTX0RFTEVURURfUFJFTUlVTSBhdmFpZW50IHNvdXNjcml0IHVuIGNvbXB0ZSBwcsOpbWl1bS5cIixcbiAgICB1cGRhdGVCdG5UeHQ6IFwiTW9kaWZpZXJcIixcbiAgICB1cGRhdGVPa01lc3NhZ2UgOiBcIkxhIG1pc2Ugw6Agam91ciDDoCBqb3VyIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCJcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIGFsbFN1YnNjcmlwdGlvblByb2Nlc3NlZCA6IFwiVG91cyBsZXMgYWJvbm7DqXMgb250IMOpdMOpIHRyYWl0w6lzIHBvdXIgbGUgbW9tZW50LlwiLFxuICAgIGluZm9zRXhwaXJhdGVkOiBcIlZvdHJlIGFib25uZW1lbnQgYSBleHBpcsOpLCBtYWlzIGlsIHZvdXMgcmVzdGUgZW5jb3JlIHF1ZWxxdWVzIGpvdXJzIGF2YW50IHF1ZSB2b3RyZSBjb21wdGUgZXQgdm9zIGRvbm7DqWVzIG5lIHNvaWVudCBjb21wbMOodGVtZW50IHN1cHByaW3DqWVzLjxicj5Qb3VyIGNlIGZhaXJlLCBzdWl2ZXogc2FucyB0YXJkZXIgbGVzIGluZGljYXRpb25zIGNpLWRlc3NvdXMgOlwiLFxuICAgIGluZm9zRXhwaXJhdGVkQWRtaW46IFwiQ2V0IGFib25uZW1lbnQgYSBleHBpcsOpLlwiLFxuICAgIGluZm9zTmJEYXlzOiBcIlZvdHJlIGFib25uZW1lbnQgZXN0IGVuY29yZSB2YWxhYmxlIDxiPnBlbmRhbnQgTkJfREFZUyBqb3VyczwvYj4uPGJyPlZvdXMgcG91dmV6IMOgIHRvdXQgbW9tZW50IHByb2xvbmdlciB2b3RyZSBhYm9ubmVtZW50IGVuIHN1aXZhbnQgbGVzIGluZGljYXRpb25zIGNpLWRlc3NvdXMgOlwiLFxuICAgIGluZm9zTmJEYXlzQWRtaW46IFwiQ2V0IGFib25uZW1lbnQgZXN0IGVuY29yZSB2YWxhYmxlIDxiPnBlbmRhbnQgTkJfREFZUyBqb3VyczwvYj4uXCIsXG4gICAgaW5mb3NQYXltZW50c0FkbWluIDogXCJEQVRFX1BBWU1FTlQgOiBwYWllbWVudCBkZSBBTU9VTlQg4oKsIGF1IG5vbSBkZSBDTElFTlRfTkFNRS5cIixcbiAgICBpc05vdFZhbGlkZWQgOiBcIkNldCB1dGlsaXNhdGV1ciBuJ2EgcGFzIGVuY29yZSB2YWxpZMOpIHNvbiBjb21wdGUuPGJyPlZvdXMgcG91dmV6IGxlIGZhaXJlIMOgIHNhIHBsYWNlIDxhIGhyZWY9JyN2YWxpZGF0aW9uT2snPmVuIGNvY2hhbnQgbGEgY2FzZSBpbmRpcXXDqWU8L2E+IGV0IGVucmVnaXN0cmFudC5cIixcbiAgICBtYWlsRW5kRnJlZVRpbWVCb2R5SFRNTDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Wb3RyZSBhYm9ubmVtZW50IGdyYXR1aXQgw6AgU0lURV9OQU1FIHZhIGV4cGlyZXIgZCdpY2kgcXVlbHF1ZXMgam91cnMuPGJyPjxicj5Qb3VyIGNvbnRpbnVlciDDoCB1dGlsaXNlciBsZSBzaXRlLCB2b3VzIHBvdXZleiBzb3VzY3JpcmUgw6AgdW4gYWJvbm5lbWVudCBzYW5zIHRhcmRlciBlbiBjbGlxdWFudCBzdXIgbGUgbGllbiBjaS1kZXNzb3VzLjwvcD5cIixcbiAgICBtYWlsRW5kRnJlZVRpbWVCb2R5VHh0OiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblZvdHJlIGFib25uZW1lbnQgZ3JhdHVpdCDDoCBTSVRFX05BTUUgdmEgZXhwaXJlciBkJ2ljaSBxdWVscXVlcyBqb3Vycy5cXG5cXG5Qb3VyIGNvbnRpbnVlciDDoCB1dGlsaXNlciBsZSBzaXRlLCB2b3VzIHBvdXZleiBzYW5zIGF0dGVuZHJlIHNvdXNjcmlyZSDDoCB1biBhYm9ubmVtZW50IDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxFbmRGcmVlVGltZUxpbmtUeHQgOiBcIk0nYWJvbm5lci5cIixcbiAgICBtYWlsRW5kRnJlZVRpbWVNZXNzYWdlOiBcIiByZWxhbmNlcyBlbnZvecOpZXMuXCIsXG4gICAgbWFpbEVuZEZyZWVUaW1lU3ViamVjdDogXCJWb3RyZSBhYm9ubmVtZW50IGdyYXR1aXQgdmEgZXhwaXJlclwiLFxuICAgIG1haWxFeHBpcmF0aW9uQm9keUhUTUw6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+Vm90cmUgYWJvbm5lbWVudCDDoCBTSVRFX05BTUUgdmEgZXhwaXJlciBkJ2ljaSBxdWVscXVlcyBqb3Vycy48YnI+PGJyPlBvdXIgY29udGludWVyIMOgIHV0aWxpc2VyIFNJVEVfTkFNRSwgdm91cyBwb3V2ZXogbGUgcHJvbG9uZ2VyIGTDqHMgYXVqb3VyZCdodWkgZW4gY2xpcXVhbnQgc3VyIGxlIGxpZW4gY2ktZGVzc291cy48L3A+XCIsXG4gICAgbWFpbEV4cGlyYXRpb25Cb2R5VHh0OiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblZvdHJlIGFib25uZW1lbnQgw6AgU0lURV9OQU1FIHZhIGV4cGlyZXIgZCdpY2kgcXVlbHF1ZXMgam91cnMuXFxuXFxuUG91ciBjb250aW51ZXIgw6AgdXRpbGlzZXIgU0lURV9OQU1FLCB2b3VzIHBvdXZleiBsZSBwcm9sb25nZXIgZMOocyBhdWpvdXJkJ2h1aSA6XFxuTElOS19VUkxcIixcbiAgICBtYWlsRXhwaXJhdGlvbkxpbmtUeHQgOiBcIlByb2xvbmdlciBtb24gYWJvbm5lbWVudC5cIixcbiAgICBtYWlsRXhwaXJhdGlvbk1lc3NhZ2U6IFwiRklSU1QgcHJlbWnDqHJlcyBldCBTRUNPTkQgZGV1eGnDqG1lcyByZWxhbmNlcyBlbnZvecOpZXMgcG91ciBkZXMgYWJvbm5lbWVudHMgZXhwaXJhbnQgZCdpY2kgcGV1LlwiLFxuICAgIG1haWxFeHBpcmF0aW9uUmVsYXVuY2hUeHQ6IFwiW1JhcHBlbF0gXCIsXG4gICAgbWFpbEV4cGlyYXRpb25TdWJqZWN0OiBcIlZvdHJlIGFib25uZW1lbnQgdmEgYmllbnTDtHQgZXhwaXJlclwiLFxuICAgIG1haWxOZXdRdWVzdGlvbm5haXJlQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuXFxuVW4gbm91dmVhdSBxdWl6IHZpZW50IGRlIHZvdXMgw6p0cmUgcHJvcG9zw6kgOlxcblxcblFVRVNUSU9OTkFJUkVfVVJMXFxuXFxuQm9ubmUgbGVjdHVyZSAhXFxuXFxuU3RvcHBlciBsZXMgZW52b2lzID9cXG5VTlNVQlNDUklCRV9VUkxcIixcbiAgICBtYWlsU3RvcE1haWxMaW5rVHh0IDogXCJTdG9wcGVyIGxlcyBlbnZvaXMuXCIsXG4gICAgbmVlZEtub3dJZk5vdGljZU9rIDogXCJJbCBtYW5xdWUgbCdpbmZvcm1hdGlvbiBzdXIgbCdhY2NlcHRhdGlvbiBvdSBub24gZGUgcmVjZXZvaXIgZGVzIG5vdGlmaWNhdGlvbnMuXCIsXG4gICAgbmVlZEludGVnZXJOdW1iZXJPZkRheXMgOiBcIkxlIG5vbWJyZSBkZSBqb3VycyBkZSBsJ2Fib25uZW1lbnQgZG9pdCDDqnRyZSB1biBub21icmUgZW50aWVyLlwiLFxuICAgIG5lZWRNaW5OdW1iZXJPZkRheXMgOiBcIkxlIG5vbWJyZSBkZSBqb3VycyBkZSBsJ2Fib25uZW1lbnQgbmUgcGV1dCDDqnRyZSBuw6lnYXRpZiAhXCIsXG4gICAgbmVlZE5vdFRvb0xvbmdEYXlzTGlzdCA6IFwiTGEgbGlzdGUgZGUgam91cnMgc8OpbGVjdGlvbm7DqXMgbidhIHBhcyBsZSBib24gZm9ybWF0ICh0cm9wIGxvbmd1ZSkuXCIsXG4gICAgbmVlZE51bWJlck9mRGF5cyA6IFwiSWwgZmF1dCB1biBub21icmUgZGUgam91cnMgcG91ciBsJ2Fib25uZW1lbnQuXCIsXG4gICAgbmVlZFVuaXF1ZURheXNMaXN0IDogXCJMYSBsaXN0ZSBkZSBqb3VycyBzw6lsZWN0aW9ubsOpcyBuJ2EgcGFzIGxlIGJvbiBmb3JtYXQuIERvdWJsb24gOiBcIixcbiAgICBuZWVkVmFsaWREYXlzTGlzdCA6IFwiTGEgbGlzdGUgZGUgam91cnMgc8OpbGVjdGlvbm7DqXMgbidhIHBhcyBsZSBib24gZm9ybWF0LiBDYXJhY3TDqHJlIG5vbiB2YWxpZGUgOiBcIixcbiAgICBub05ld1F1ZXN0aW9ubmFpcmVGb3JVc2VyIDogXCJBdWN1biBub3V2ZWF1IHF1ZXN0aW9ubmFpcmUgdHJvdXbDqSBwb3VyIHVuIGFib25uw6kgOiBcIixcbiAgICB1bnN1YnNjcmlwdGlvbk9rIDogXCJWb3RyZSBkZW1hbmRlIGEgYmllbiDDqXTDqSBwcmlzZSBlbiBjb21wdGUuIFZvdXMgbmUgcmVjZXZyZXogcGx1cyBkZSBtZXNzYWdlcyB2ZW5hbnQgZHUgc2l0ZSwgc2F1ZiBwb3VyIHZvdXMgc2lnbmFsZXIgbGEgZmluIGRlIHZvdHJlIGFib25uZW1lbnQuPGJyPk4naMOpc2l0ZXogcGFzIDxhIGhyZWY9Jy8jVVJMJz7DoCBhY2PDqWRlciDDoCB2b3RyZSBjb21wdGU8L2E+IHBvdXIgZGUgbm91dmVhdSBhdXRvcmlzZXIgY2VydGFpbnMgZW52b2lzLlwiLFxuICAgIHVuc3Vic2NyaXB0aW9uRmFpbCA6IFwiU2kgdm91cyB2b3lleiBjZSBtZXNzYWdlLCBjJ2VzdCBxdWUgdm90cmUgbGllbiBkZSBkw6lzYWJvbm5lbWVudCBuZSBmb25jdGlvbm5lIHBhcy48YnI+Vm91cyBwb3V2ZXogPGEgaHJlZj0nLyNVUkwnPmFjY8OpZGVyIMOgIHZvdHJlIGNvbXB0ZTwvYT4gcG91ciBkw6lzYWN0aXZlciBsZXMgZW52b2lzIG1hbnVlbGxlbWVudC5cIlxufTtcbiIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBhbHJlYWR5Q29ubmVjdGVkOiBcIlZvdXMgw6p0ZXMgZMOpasOgIGNvbm5lY3TDqSBhdSBzaXRlICFcIixcbiAgICBiYWRMaW5rVmFsaWRhdGlvbk1lc3NhZ2U6IFwiVm90cmUgbGllbiBkZSBjb25maXJtYXRpb24gbmUgc2VtYmxlIHBhcyB2YWxpZGUgb3UgYmllbiBpbCBhIGV4cGlyw6kuIFZvdXMgcG91dmV6IGVuIHJlY2V2b2lyIHVuIG5vdXZlYXUgPGEgaHJlZj0nI1VSTCc+ZW4gY2xpcXVhbnQgaWNpPC9hPi5cIixcbiAgICBiYWRQYXNzd29yZDogXCJBdWN1biBjb21wdGUgdXRpbGlzYXRldXIgbmUgY29ycmVzcG9uZCBhdXggaW5mb3JtYXRpb25zIHNhaXNpZXMuXCIsXG4gICAgYnllYnllTWVzc2FnZTogXCJTaSB2b3VzIHZveWV6IGNlIG1lc3NhZ2UsIGMnZXN0IHF1ZSB2b3RyZSBkw6ljb25uZXhpb24gcydlc3QgYmllbiBkw6lyb3Vsw6llLjxicj7DgCBiaWVudMO0dCAhXCIsIFxuICAgIGNvbm5lY3Rpb25PazogXCJDb25uZXhpb24gcsOpdXNzaWUuXCIsXG4gICAgY3JlYXRpb25Pa01lc3NhZ2U6IFwiTGUgbm91dmVsIHV0aWxpc2F0ZXVyIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqS5cIixcbiAgICBjcm9uRGVsZXRlVW52YWxpZGVkVXNlcnNNZXNzYWdlOiBcIiBjb21wdGVzIHV0aWxpc2F0ZXVycyBub24gdmFsaWTDqXMgb250IMOpdMOpIHN1cHByaW3DqXMuXCIsXG4gICAgZGVsZXRlRmFpbE1lc3NhZ2U6IFwiVGVudGF0aXZlIGRlIHN1cHByZXNzaW9uIGQndW4gdXRpbGlzYXRldXIgaW5leGlzdGFudCA6IFwiLFxuICAgIGRlbGV0ZUluYWN0aXZlVXNlcnNNZXNzYWdlOiBcIiBjb21wdGVzIHV0aWxpc2F0ZXVycyBpbmFjdGlmcyBvbnQgw6l0w6kgc3VwcHJpbcOpcy5cIixcbiAgICBkZWxldGVPa01lc3NhZ2U6IFwiTCd1dGlsaXNhdGV1ciBhIGJpZW4gw6l0w6kgc3VwcHJpbcOpLlwiLFxuICAgIGVtYWlsTm90Rm91bmQ6IFwiQXVjdW4gY29tcHRlIHV0aWxpc2F0ZXVyIG4nYSDDqXTDqSB0cm91dsOpIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgZ29kZmF0aGVyRm91bmQ6IFwiVm90cmUgXFxcInBhcnJhaW5cXFwiIGEgYmllbiDDqXTDqSB0cm91dsOpIDopXCIsXG4gICAgZ29kZmF0aGVyTm90Rm91bmQ6IFwiRMOpc29sw6kgbWFpcyBhdWN1biB1dGlsaXNhdGV1ciBuJ2Egw6l0w6kgdHJvdXbDqSBwb3VyIGNlIGNvZGUvZS1tYWlsIHBhcnJhaW4gOihcIixcbiAgICBpbmZvc0FkbWluR29kZmF0aGVyOiBcIkNldCB1dGlsaXNhdGV1ciBhIMOpdMOpIHBhcnJhaW7DqSBwYXIgXCIsXG4gICAgaW5mb3NBZG1pbk5iR29kQ2hpbGRzOiBcIlNlcyAjTkIgZmlsbGV1bHMgOiBcIixcbiAgICBpbmZvc1VzZXJGb3JBZG1pbjogXCJDZXQgdXRpbGlzYXRldXIgKGlkOiBJRF9VU0VSKSBhIDxiPmNyw6nDqSBzb24gY29tcHRlIGxlIERBVEVfQ1JFQTwvYj4sIGxhIGRlcm5pw6hyZSBtaXNlIMOgIGpvdXIgZGF0YW50IGR1IERBVEVfVVBEQVRFLjxicj48Yj5EYXRlIGRlIHNhIGRlcm5pw6hyZSBjb25uZXhpb24gOiBEQVRFX0NPTk5FQ1RJT04uPC9iPlwiLFxuICAgIGluZm9zVXNlck5iR29kQ2hpbGRzOiBcIlZvaWNpIGxlcyAjTkIgdXRpbGlzYXRldXIocykgaW5zY3JpdChzKSBlbiB2b3VzIGTDqXNpZ25hbnQgY29tbWUgXFxcInBhcnJhaW5cXFwiIDogXCIsXG4gICAgaW5mb3NVc2VyTm9Hb2RjaGlsZHM6IFwiUG91ciBsJ2luc3RhbnQsIGF1Y3VuZSBwZXJzb25uZSBuZSBzJ2VzdCBpbnNjcml0ZSwgZW4gdm91cyBkw6lzaWduYW50IGNvbW1lIFxcXCJwYXJyYWluXFxcIi5cIixcbiAgICBtYWlsRGVsZXRlQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlBvdXIgY29uZmlybWVyIGxhIHN1cHByZXNzaW9uIGRlIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBjaS1kZXNzb3VzIHNhbnMgdGFyZGVyLjwvcD5cIixcbiAgICBtYWlsRGVsZXRlQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuXFxuUG91ciBjb25maXJtZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtBbHJlYWR5TWVzc2FnZTogXCJJbCBzZW1ibGUgcXVlIHZvdXMgYXlleiBkw6lqw6AgdmFsaWTDqSBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtGYWlsTWVzc2FnZTogXCJWb3RyZSBsaWVuIGRlIHN1cHByZXNzaW9uIG4nZXN0IHBhcyB2YWxpZGUgb3UgYWxvcnMgaWwgYSBleHBpcsOpLlwiLFxuICAgIG1haWxEZWxldGVMaW5rTWVzc2FnZTogXCJWb3RyZSBkZW1hbmRlIGRlIHN1cHByZXNzaW9uIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuIE1lcmNpIGRlIGNsaXF1ZXIgc2FucyB0YXJkZXIgc3VyIGxlIGxpZW4gcXVpIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBwYXIgZS1tYWlsIHBvdXIgY29uZmlybWVyLlwiLFxuICAgIG1haWxEZWxldGVMaW5rT2tNZXNzYWdlOiBcIlZvdHJlIGNvbXB0ZSBhIGJpZW4gw6l0w6kgc3VwcHJpbcOpLiBNZXJjaSBkJ2F2b2lyIHV0aWxpc8OpIG5vcyBzZXJ2aWNlcy5cIixcbiAgICBtYWlsRGVsZXRlTGlua1R4dCA6IFwiQ29uZmlybWVyLlwiLFxuICAgIG1haWxEZWxldGVTdWJqZWN0IDogXCJDb25maXJtZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLlwiLFxuICAgIG1haWxMb2dpbkxpbmtCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+UG91ciB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6PC9wPlwiLFxuICAgIG1haWxMb2dpbkxpbmtCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5cXG5Qb3VyIHZvdXMgY29ubmVjdGVyIMOgIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxMb2dpbkxpbmtNZXNzYWdlIDogXCJVbiBsaWVuIGRlIGNvbm5leGlvbiB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgc3VyIHZvdHJlIGFkcmVzc2UgZS1tYWlsLiBOZSB0YXJkZXogcGFzIMOgIGwndXRpbGlzZXIsIGNhciBpbCBuJ2VzdCB2YWxhYmxlIHF1ZSBkdXJhbnQgKlRJTUlORyogIVwiLFxuICAgIG1haWxMb2dpbkxpbmtTdWJqZWN0IDogXCJWb3RyZSBsaWVuIGRlIGNvbm5leGlvbi5cIixcbiAgICBtYWlsTG9naW5MaW5rVHh0IDogXCJNZSBjb25uZWN0ZXIuXCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPkdyw6JjZSDDoCB2b3VzLCB1biBub3V2ZWwgdXRpbGlzYXRldXIgKEVNQUlMKSB2aWVudCBkZSBzJ2luc2NyaXJlIHN1ciBOT01fU0lURS48YnI+U2kgZGFucyBsJ2F2ZW5pciBjZXR0ZSBwZXJzb25uZSBzb3VzY3JpdCB1biBhYm9ubmVtZW50IHByw6ltaXVtLCB2b3RyZSBwcm9wcmUgYWJvbm5lbWVudCBzZXJhIHByb2xvbmfDqSBkZSAzMCBqb3Vycy48L3A+PHA+RW5jb3JlIG1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuR3LDomNlIMOgIHZvdXMsIHVuIG5vdXZlbCB1dGlsaXNhdGV1ciAoRU1BSUwpIHZpZW50IGRlIHMnaW5zY3JpcmUgc3VyIE5PTV9TSVRFLlxcblNpIGRhbnMgbCdhdmVuaXIgY2V0dGUgcGVyc29ubmUgc291c2NyaXQgdW4gYWJvbm5lbWVudCBwcsOpbWl1bSwgdm90cmUgcHJvcHJlIGFib25uZW1lbnQgc2VyYSBwcm9sb25nw6kgZGUgMzAgam91cnMuXFxuRW5jb3JlIG1lcmNpIGV0IMOgIGJpZW50w7R0ICFcIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJMaW5rVHh0IDogXCJNZSBjb25uZWN0ZXIgw6AgbW9uIGNvbXB0ZS5cIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJTdWJqZWN0IDogXCJNZXJjaSAhXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlBvdXIgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiwgY2xpcXVleiBzdXIgbGUgbGllbiBjaS1kZXNzb3VzIHNhbnMgdGFyZGVyLjwvcD5cIixcbiAgICBtYWlsVXBkYXRlTG9naW5Cb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5cXG5Qb3VyIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cyBkZSBjb25uZXhpb24sIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6XFxuTElOS19VUkxcIixcbiAgICBtYWlsVXBkYXRlTG9naW5MaW5rTWVzc2FnZTogXCJDZXBlbmRhbnQsIHZvdXMgYXZleiBtb2RpZmnDqSBhdSBtb2lucyB1biBkZSB2b3MgaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiAoZS1tYWlsIGV0L291IG1vdCBkZSBwYXNzZSkgZXQgPGI+dm91cyBkZXZleiBjbGlxdWVyIHN1ciBsZSBsaWVuIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlcyBlbnZvecOpIHN1ciB2b3RyZSBhZHJlc3NlIChORVdfRU1BSUwpIHBvdXIgdmFsaWRlciBjZSBjaGFuZ2VtZW50PC9iPi48YnI+RW4gYXR0ZW5kYW50LCBtZXJjaSBkZSBjb250aW51ZXIgw6AgdXRpbGlzZXIgdm9zIGFuY2llbnMgaWRlbnRpZmlhbnRzLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkxpbmtUeHQgOiBcIlZhbGlkZXIuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luT2tNZXNzYWdlOiBcIkxhIG1pc2Ugw6Agam91ciBkZSB2b3MgaWRlbnRpZmlhbnRzIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luU3ViamVjdCA6IFwiTWVyY2kgZGUgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzLlwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1NCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+UG91ciB2YWxpZGVyIHZvdHJlIGluc2NyaXB0aW9uLCBtZXJjaSBkZSBjbGlxdWVyIHN1ciBsZSBsaWVuIGNpLWRlc3NvdXMgZGFucyBsZXMgMjRoLjwvcD5cIixcbiAgICBtYWlsVmFsaWRhdGlvbkxpbmtTQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuXFxuUG91ciB2YWxpZGVyIHZvdHJlIGluc2NyaXB0aW9uLCBtZXJjaSBkZSBjbGlxdWVyIHN1ciBsZSBsaWVuIHN1aXZhbnQgZGFucyBsZXMgMjRoIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1N1YmplY3QgOiBcIk1lcmNpIGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb25cIixcbiAgICBtYWlsVmFsaWRhdGlvbkxpbmtUeHQgOiBcIlZhbGlkZXIgbW9uIGNvbXB0ZS5cIixcbiAgICBtYWlsVmFsaWRhdGlvbk1lc3NhZ2U6IFwiVm90cmUgaW5zY3JpcHRpb24gZXN0IGJpZW4gZW5yZWdpc3Ryw6llLlxcblBvdXIgbGEgZmluYWxpc2VyLCBtZXJjaSBkZSBjbGlxdWVyIGRhbnMgbGVzIDI0IEggc3VyIGxlIGxpZW4gZGUgY29uZmlybWF0aW9uIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbC5cIixcbiAgICBtYWlsV2VsY29tZUJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Wb3VzIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuIE1lcmNpIGV0IGJpZW52ZW51ZSAhPGJyPjxicj5TaSB2b3VzIGF2ZXogbGEgbW9pbmRyZSBxdWVzdGlvbiBvdSBzdWdnZXN0aW9uIGNvbmNlcm5hbnQgTk9NX1NJVEUsIG4naMOpc2l0ZXogcGFzIMOgIG1lIGNvbnRhY3RlciBlbiDDqWNyaXZhbnQgw6AgPGI+RU1BSUw8L2I+Ljxicj48YnI+SmUgdm91cyBjb25zZWlsbGUgZCdhaWxsZXVycyBkJ2Fqb3V0ZXIgPGI+RU1BSUw8L2I+IMOgIHZvdHJlIGNhcm5ldCBkJ2FkcmVzc2VzIHBvdXIgw6l2aXRlciBxdWUgbGVzIHByb2NoYWlucyBlbnZvaXMgZHUgc2l0ZSBuJ2Fycml2ZW50IGVuIDxpPnNwYW08L2k+Ljxicj48YnI+UGFyIGFpbGxldXJzLCBwb3VyIGfDqXJlciB2b3RyZSBhYm9ubmVtZW50LCBhY2PDqWRlciDDoCB2b3MgaW5mb3JtYXRpb25zIG91IGVuY29yZSBjaGVyY2hlciBwbHVzIGZhY2lsZW1lbnQgcGFybWkgbGVzIHF1aXpzIGR1IHNpdGUsIHZvdXMgcG91dmV6IMOgIHRvdXQgbW9tZW50IHZvdXMgY29ubmVjdGVyIMOgIHZvdHJlIGNvbXB0ZSB1dGlsaXNhdGV1ci48YnI+PGJyPlBvdXIgY2UgZmFpcmUsIHV0aWxpc2V6IGxlIGxpZW4gY2ktZGVzc291cy48YnI+PGJyPsOAIGJpZW50w7R0IHN1ciBOT01fU0lURS5cIixcbiAgICBtYWlsV2VsY29tZUJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblZvdXMgdmVuZXogZGUgdmFsaWRlciB2b3RyZSBpbnNjcmlwdGlvbiDDoCBOT01fU0lURS4gTWVyY2kgZXQgYmllbnZlbnVlICFcXG5cXG5TaSB2b3VzIGF2ZXogbGEgbW9pbmRyZSBxdWVzdGlvbiBvdSBzdWdnZXN0aW9uIGNvbmNlcm5hbnQgTk9NX1NJVEUsIG4naMOpc2l0ZXogcGFzIMOgIG1lIGNvbnRhY3RlciBlbiDDqWNyaXZhbnQgw6AgRU1BSUwuXFxuXFxuSmUgdm91cyBjb25zZWlsbGUgZCdhaWxsZXVycyBkJ2Fqb3V0ZXIgRU1BSUwgw6Agdm90cmUgY2FybmV0IGQnYWRyZXNzZXMgcG91ciDDqXZpdGVyIHF1ZSBsZXMgcHJvY2hhaW5zIGVudm9pcyBkdSBzaXRlIG4nYXJyaXZlbnQgZW4gXFxcInNwYW1cXFwiLlxcblxcblBhciBhaWxsZXVycywgcG91ciBnw6lyZXIgdm90cmUgYWJvbm5lbWVudCwgYWNjw6lkZXIgw6Agdm9zIGluZm9ybWF0aW9ucyBvdSBlbmNvcmUgY2hlcmNoZXIgcGx1cyBmYWNpbGVtZW50IHBhcm1pIGxlcyBxdWl6cyBkdSBzaXRlLCB2b3VzIHBvdXZleiDDoCB0b3V0IG1vbWVudCB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUgdXRpbGlzYXRldXIuXFxuXFxuUG91ciBjZSBmYWlyZSwgdXRpbGlzZXogbGUgbGllbiBzdWl2YW50IDogTElOS19VUkxcXG5cXG7DgCBiaWVudMO0dCBzdXIgTk9NX1NJVEUuXCIsXG4gICAgbWFpbFdlbGNvbWVMaW5rVHh0IDogXCJNZSBjb25uZWN0ZXIgw6AgbW9uIGNvbXB0ZS5cIixcbiAgICBtYWlsV2VsY29tZVN1YmplY3QgOiBcIkJpZW52ZW51ZSAhXCIsXG4gICAgbmVlZEJlQ29ubmVjdGVkOiBcIlZvdXMgZGV2ZXogw6p0cmUgY29ubmVjdMOpIHBvdXIgYWNjw6lkZXIgw6AgY2V0dGUgcGFnZS5cIixcbiAgICBuZWVkQ2hvb3NlTG9naW5XYXk6IFwiVm91cyBkZXZleiBzb2l0IHNhaXNpciB2b3RyZSBtb3QgZGUgcGFzc2UsIHNvaXQgY29jaGVyIGxhIGNhc2Ugdm91cyBwZXJtZXR0YW50IGRlIHJlY2V2b2lyIHVuIGxpZW4gZGUgY29ubmV4aW9uIHBhciBlLW1haWwuXCIsXG4gICAgbmVlZEVtYWlsOiBcIk1lcmNpIGRlIHNhaXNpciB2b3RyZSBhZHJlc3NlIGUtbWFpbC5cIixcbiAgICBuZWVkS25vd05ld3NsZXR0ZXJPayA6IFwiSWwgZmF1dCBzYXZvaXIgc2kgbCd1dGlsaXNhdGV1ciBhY2NlcHRlIG91IHJlZnVzZSBkZSByZWNldm9pciBsYSBuZXdzbGV0dGVyLlwiLFxuICAgIG5lZWRMYW5ndWFnZSA6IFwiSWwgbWFucXVlIGxlIGNvZGUgbGFuZ3VlLlwiLFxuICAgIG5lZWRMb25nUGFzc1dvcmQgOiBcIk1lcmNpIGRlIGZvdXJuaXIgdW4gbW90IGRlIHBhc3NlIGQnYXUgbW9pbnMgTUlOX0xFTkdUSCBjYXJhY3TDqHJlcy5cIixcbiAgICBuZWVkTWF4VGltZURpZmZlcmVuY2UgOiBcIklsIGZhdXQgZm91cm5pciB1biBub21icmUgZGUgbWludXRlcyDDoCBham91dGVyIMOgIGwnaGV1cmUgR01UIG5lIGTDqXBhc3NhbnQgcGFzIDg0MC5cIixcbiAgICBuZWVkTWluVGltZURpZmZlcmVuY2UgOiBcIklsIGZhdXQgZm91cm5pciB1biBub21icmUgZGUgbWludXRlcyDDoCBlbmxldmVyIMOgIGwnaGV1cmUgR01UIG5lIGTDqXBhc3NhbnQgcGFzIDcyMC5cIixcbiAgICBuZWVkTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyLlwiLFxuICAgIG5lZWROb3RUb29Mb25nTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyIG5lIGNvbXB0YW50IHBhcyBwbHVzIGRlIDcwIGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWROb3RUb29Mb25nRW1haWw6IFwiTWVyY2kgZGUgc2Fpc2lyIHVuZSBhZHJlc3NlIGUtbWFpbCBuZSBjb21wdGFudCBwYXMgcGx1cyBkZSAyNTUgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZFBhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZS5cIixcbiAgICBuZWVkU01UUCA6IFwiSWwgbWFucXVlIGxlIHNlcnZldXIgU01UUC5cIixcbiAgICBuZWVkU01UUE5vdEZvdW5kIDogXCJJbCBtYW5xdWUgdW4gc2VydmV1ciBTTVRQIHZhbGlkZS5cIixcbiAgICBuZWVkU3RhdHVzIDogXCJJbCBtYW5xdWUgbGUgc3RhdHV0LlwiLFxuICAgIG5lZWRUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBjb25uYcOudHJlIGxlIG5vbWJyZSBkZSBtaW51dGVzIGR1IGTDqWNhbGFnZSBob3JhaXJlLlwiLFxuICAgIG5lZWRVR0NPayA6IFwiTWVyY2kgZCdhY2NlcHRlciBsZXMgQ0dVIHBvdXIgY3LDqWVyIHZvdHJlIGNvbXB0ZS5cIixcbiAgICBuZWVkVW5pcXVlRW1haWw6IFwiTCdhZHJlc3NlIGUtbWFpbCBxdWUgdm91cyBhdmV6IHNhaXNpZSBlc3QgZMOpasOgIHV0aWxpc8OpZSBwb3VyIHVuIGNvbXB0ZSB1dGlsaXNhdGV1ci4gU2kgdm91cyBhdmV6IGTDqWrDoCB1biBjb21wdGUsIDxhIGhyZWY9Jy8jVVJMJz5jbGlxdWV6LWljaSBwb3VyIHZvdXMgY29ubmVjdGVyPC9hPi5cIixcbiAgICBuZWVkVmFsaWRhdGlvblRvTG9naW4gOiBcIlZvdXMgZGV2ZXogZCdhYm9yZCB2YWxpZGVyIHZvdHJlIGNvbXB0ZSBhdmFudCBkZSBwb3V2b2lyIHZvdXMgY29ubmVjdGVyLiBQb3VyIGNlIGZhaXJlLCB1biBub3V2ZWF1IGxpZW4gdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHBhciBlLW1haWwuXCIsXG4gICAgbmVlZFZhbGlkTGFzdENvbm5lY3Rpb25EYXRlIDogXCJMYSBkYXRlIGRlIGRlcm5pw6hyZSBjb25uZXhpb24gbidlc3QgcGFzIHZhbGlkZS5cIixcbiAgICBwYXNzd29yZENvcGllZDogXCJMZSBtb3QgZGUgcGFzc2UgZ8OpbsOpcsOpIGEgw6l0w6kgY29wacOpIGRhbnMgbGUgcHJlc3NlLXBhcGllciBkZSB2b3RyZSBvcmRpbmF0ZXVyIChvdSBtb2JpbGUpLiBWb3VzIHBvdXZleiBsZSBcXFwiY29sbGVyXFxcIiBvw7kgdm91cyBsZSBzb3VoYWl0ZXouXCIsXG4gICAgc2VhcmNoVXNlcnNXaXRob3V0UmVzdWx0OiBcIkwndXRpbGlzYXRldXIgbidhIHBhcyDDqXTDqSB0cm91dsOpLlwiLFxuICAgIHRvb01hbnlMb2dpbkZhaWxzIDogXCJEw6lzb2zDqSBtYWlzIGlsIHkgYSBldSB0cm9wIGRlIHRlbnRhdGl2ZXMgZGUgY29ubmV4aW9uIGluZnJ1Y3R1ZXVzZXMgcG91ciBjZXR0ZSBhZHJlc3NlIGUtbWFpbC4gVm91cyBkZXZleiBhdHRlbmRyZSBNSU5VVEVTIG1pbnV0ZXMgcG91ciBlc3NheWVyIGRlIG5vdXZlYXUuXCIsXG4gICAgdXBkYXRlZEZhaWxlZEdvZGZhdGhlck5vdEZvdW5kIDogXCJMJ2lkZW50aWZpYW50IGZvdXJuaSBwb3VyIGxlIHBhcnJhaW4gbmUgY29ycmVzcG9uZCDDoCBhdWN1biB1dGlsaXNhdGV1ci5cIixcbiAgICB1cGRhdGVkTmVlZEdvb2RFbWFpbCA6IFwiTWFpcyBsYSBub3V2ZWxsZSBhZHJlc3NlIGUtbWFpbCBuJ2EgcHUgw6p0cmUgZW5yZWdpc3Ryw6llLCBjYXIgZWxsZSBuJ2EgcGFzIHVuIGZvcm1hdCBjb3JyZWN0LlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEdvZGZhdGhlciA6IFwiTWFpcyBsZSBub3V2ZWF1IGNvZGUgcGFycmFpbiBuJ2EgcHUgw6p0cmUgcmV0ZW51LCBjYXIgaWwgbmUgY29ycmVzcG9uZCDDoCBhdWN1biBjb21wdGUgdXRpbGlzYXRldXIgb3Ugw6AgbCd1dGlsaXNhdGV1ciBsdWktbcOqbWUuXCIsXG4gICAgdXBkYXRlZE5lZWRVbmlxdWVFbWFpbCA6IFwiTWFpcyBsYSBub3V2ZWxsZSBhZHJlc3NlIGUtbWFpbCBzYWlzaWUgKE5FV19FTUFJTCkgbidhIHB1IMOqdHJlIGVucmVnaXN0csOpZSwgY2FyIGVsbGUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcG91ciB1biBhdXRyZSBjb21wdGUuXCIsXG4gICAgdXBkYXRlZE5lZWRWYWxpZGF0ZWRVc2VyOiBcIkwndXRpbGlzYXRldXIgcXVlIHZvdXMgc291aGFpdGV6IG1vZGlmaWVyIG4nZXhpc3RlIHBhcy9wbHVzIG91IG4nYSBwYXMgZW5jb3JlIHZhbGlkw6kgc29uIGNvbXB0ZS5cIixcbiAgICB1cGRhdGVkT2tNZXNzYWdlOiBcIlZvcyBpbmZvcm1hdGlvbnMgb250IGJpZW4gw6l0w6kgbWlzZXMgw6Agam91ci5cIixcbiAgICB2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2U6IFwiSWwgc2VtYmxlIHF1ZSB2b3VzIGF5ZXogZMOpasOgIHZhbGlkw6kgdm90cmUgY29tcHRlLlwiLFxuICAgIHZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZUFkbWluOiBcIkNlIGNvbXB0ZSBhIGTDqWrDoCDDqXTDqSB2YWxpZMOpLlwiLFxuICAgIHZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGNvbXB0ZSB2aWVudCBiaWVuIGQnw6p0cmUgdmFsaWTDqS4gTWVyY2kgZXQgYmllbnZlbnVlICE8YnI+Vm91cyBwb3V2ZXogc2FucyB0YXJkZXIgdm91cyBjb25uZWN0ZXIgY2ktZGVzc291cyBwb3VyIGFjY8OpZGVyIMOgIHZvdHJlIGVzcGFjZSBXaWtpTGVybmkuXCIsXG4gICAgdmFsaWRhdGlvbk1lc3NhZ2VBZG1pbjogXCJMZSBjb21wdGUgYSBiaWVuIMOpdMOpIHZhbGlkw6kuXCIsXG4gICAgd2VsY29tZU1lc3NhZ2U6IFwiQmllbnZlbnVlICNOQU1FICFcIlxufTsiLCIvLyBRdWVscXVlcyBmb25jdGlvbnMgdXRpbGVzIHBvdXIgbGVzIGNoYcOubmVzXG5cbmNsYXNzIFRvb2xcbntcbiAgICBzdGF0aWMgaXNFbXB0eShteVZhcilcbiAgICB7XG4gICAgICAgIGlmKG15VmFyPT09dW5kZWZpbmVkIHx8IG15VmFyPT09bnVsbClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIG15VmFyKz1cIlwiOy8vIHNpIGF1dHJlIGNob3NlIHF1J3VuZSBjaGHDrm5lIGVudm95w6kuLi5cbiAgICAgICAgICAgIG15VmFyPW15VmFyLnRyaW0oKTtcbiAgICAgICAgICAgIGlmKG15VmFyPT09XCJcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgc3RhdGljIHRyaW1JZk5vdE51bGwobXlTdHJpbmcpXG4gICAge1xuICAgICAgICBpZihUb29sLmlzRW1wdHkobXlTdHJpbmcpKVxuICAgICAgICAgICAgbXlTdHJpbmc9bnVsbDtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVN0cmluZys9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVN0cmluZz1teVN0cmluZy50cmltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG15U3RyaW5nO1xuICAgIH1cblxuXG4gICAgc3RhdGljIHNob3J0ZW5JZkxvbmdlclRoYW4obXlTdHJpbmcsIG1heClcbiAgICB7XG4gICAgICAgIG15U3RyaW5nKz1cIlwiOy8vIGF1IGNhcyBvw7kgY2VsYSBuZSBzZXJhaXQgcGFzIHVuZSBjaGHDrm5lLi4uXG4gICAgICAgaWYobXlTdHJpbmcubGVuZ3RoID4gbWF4KVxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcuc3Vic3RyaW5nKDAsIChtYXgtMykpK1wiLi4uXCI7XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cbiAgICAvLyBzb3VyY2UgOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNTYwNDE0MC9yZXBsYWNlLW11bHRpcGxlLXN0cmluZ3Mtd2l0aC1tdWx0aXBsZS1vdGhlci1zdHJpbmdzXG4gICAgc3RhdGljIHJlcGxhY2VBbGwobXlTdHJpbmcsIG1hcE9iailcbiAgICB7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VFbHRzID0gbmV3IFJlZ0V4cChPYmplY3Qua2V5cyhtYXBPYmopLmpvaW4oXCJ8XCIpLFwiZ2lcIik7XG4gICAgICAgIHJldHVybiBteVN0cmluZy5yZXBsYWNlKHJlcGxhY2VFbHRzLCAobWF0Y2hlZCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG1hcE9ialttYXRjaGVkXTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZnIvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT2JqZXRzX2dsb2JhdXgvTWF0aC9yYW5kb21cbiAgICBzdGF0aWMgZ2V0UmFuZG9tSW50KG1pbiwgbWF4KVxuICAgIHtcbiAgICAgICAgbWluID0gTWF0aC5jZWlsKG1pbik7XG4gICAgICAgIG1heCA9IE1hdGguZmxvb3IobWF4KTtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pKSArIG1pbjtcbiAgICB9XG5cbiAgICAvLyDDoCBjb21wbMOpdGVyIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGF0ZV9mb3JtYXRfYnlfY291bnRyeVxuICAgIHN0YXRpYyBkYXRlRm9ybWF0KGRhdGVTdHJpbmcsIGxhbmc9XCJmclwiKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KGRhdGVTdHJpbmcpKVxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIGxldCBteURhdGU9bmV3IERhdGUoZGF0ZVN0cmluZyk7XG4gICAgICAgIGxldCBteURheT1teURhdGUuZ2V0RGF0ZSgpK1wiXCI7XG4gICAgICAgIGlmKG15RGF5Lmxlbmd0aD09PTEpXG4gICAgICAgICAgICBteURheT1cIjBcIitteURheTtcbiAgICAgICAgbGV0IG15TW91bnRoPShteURhdGUuZ2V0TW9udGgoKSsxKStcIlwiO1xuICAgICAgICBpZihteU1vdW50aC5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlNb3VudGg9XCIwXCIrbXlNb3VudGg7XG4gICAgICAgIGxldCBteVllYXI9bXlEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGlmKGxhbmc9PT1cImZyXCIpXG4gICAgICAgICAgICByZXR1cm4gbXlEYXkrXCIvXCIrbXlNb3VudGgrXCIvXCIrbXlZZWFyO1xuICAgICAgICBlbHNlIGlmIChsYW5nPT09XCJmb3JtXCIpLy8gMjAxNC0wMi0wOVxuICAgICAgICAgICAgcmV0dXJuIG15WWVhcitcIi1cIitteU1vdW50aCtcIi1cIitteURheTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG15TW91bnRoK1wiL1wiK215RGF5K1wiL1wiK215WWVhcjtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVG9vbDsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZGVmYXVsdC9jb25maWcvZnIuanNcIjogXCIuLi92aWV3cy9kZWZhdWx0L2NvbmZpZy9mci5qc1wiLFxuXHRcIi4vd2lraWxlcm5pL2NvbmZpZy9mci5qc1wiOiBcIi4uL3ZpZXdzL3dpa2lsZXJuaS9jb25maWcvZnIuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vdmlld3Mgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwuanMkXCI7IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIGhlYWRMaW5rczpcbiAgICBbXG4gICAgICAgIHsgYW5jaG9yOiBcIkFjY3VlaWxcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiTW9uIGNvbXB0ZVwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY29ubmV4aW9uLmh0bWxcIiwgaWQ6IFwiYWNjb3VudEhlYWRMaW5rXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCLDgCBwcm9wb3NcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2EtcHJvcG9zLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkNvbnRhY3RcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2NvbnRhY3QuaHRtbFwiIH0gfSxcbiAgICBdLFxuICAgIGZvb3RMaW5rczpcbiAgICBbXG4gICAgICAgIHsgYW5jaG9yOiBcIkNyw6lkaXRzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jcmVkaXRzLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIk1lbnRpb25zIGzDqWdhbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9tZW50aW9ucy1sZWdhbGVzLmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJEb25uw6llcyBwZXJzb25uZWxsZXNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Rvbm5lZXMuaHRtbFwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQy5HLlUuXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jZ3UuaHRtbFwiLCByZWw6IFwibm9mb2xsb3dcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkMuRy5WLlwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY2d2Lmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgIF0sXG4gICAgbWF4UXVlc3Rpb25uYWlyZXNCeVBhZ2U6IDEwLFxuICAgIHVzZXJIb21lUGFnZSA6IFwiYWNjdWVpbC5odG1sXCIsXG4gICAgYWRtaW5Ib21lUGFnZSA6IFwiYWRtaW4uaHRtbFwiLFxuICAgIG1hbmFnZXJIb21lUGFnZSA6IFwiZ2VzdGlvbi5odG1sXCIsXG4gICAgc3Vic2NyaWJlUGFnZSA6IFwiaW5zY3JpcHRpb24uaHRtbFwiLFxuICAgIGNvbm5lY3Rpb25QYWdlIDogXCJjb25uZXhpb24uaHRtbFwiLFxuICAgIGFjY291bnRQYWdlOiBcImNvbXB0ZS5odG1sXCIsXG4gICAgcXVlc3Rpb25uYWlyZXNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXF1aXpzLmh0bWxcIixcbiAgICB1c2Vyc01hbmFnZW1lbnRQYWdlOiBcImdlc3Rpb24tdXRpbGlzYXRldXJzLmh0bWxcIixcbiAgICBuYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlIDogMTAsXG4gICAgaWxsdXN0cmF0aW9uRGlyIDogXCIvaW1nL3F1aXpzL1wiLFxuICAgIHNpdGVTbG9nYW46IFwiQ3VsdGl2b25zIG5vdHJlIGphcmRpbiAhXCIsXG4gICAgaG9tZVRpdGxlMTogXCJEZSBuYXR1cmUgY3VyaWV1c2UgP1wiLFxuICAgIGhvbWVQMTogXCJBdmVjIFdpa2lMZXJuaSB2b3VzIGFwcHJlbmV6IGNoYXF1ZSBqb3VyIGRlIG5vdXZlbGxlcyBjaG9zZXMuPGJyPkRlcyBhcnRpY2xlcyBkZSBXaWtpcMOpZGlhIHNvbnQgc8OpbGVjdGlvbm7DqXMgcG91ciB2b3VzIGV0IHNvbnQgc3VpdmlzIGQndW4gcXVpeiB2b3VzIHBlcm1ldHRhbnQgZGUgdGVzdGVyIGNlIHF1ZSB2b3VzIGVuIGF2ZXogcmV0ZW51Ljxicj5EZSBqb3VyIGVuIGpvdXIgZGUgbm91dmVsbGVzIGdyYWluZXMgZGUgc2F2b2lyIHNvbnQgYWluc2kgc2Vtw6llcyBkYW5zIHZvdHJlIFxcXCJqYXJkaW5cXFwiLlwiLFxuICAgIGhvbWVUaXRsZTI6IFwiTGEgY3VsdHVyZSBlbiBsaWJlcnTDqVwiLFxuICAgIGhvbWVQMjogXCJUb3V0IGNvbW1lIHN1ciBXaWtpcMOpZGlhICgqKSwgbGUgbG9naWNpZWwgZXQgbGUgY29udGVudSBwYXJ0YWfDqSBzdXIgV2lraUxlcm5pIHNvbnQgbGlicmVzLjxicj5Wb3VzIHBvdXZleiBsZXMgdXRpbGlzZXIsIGxlcyBtb2RpZmllciBldCBsZXMgZGlmZnVzZXIgc2Vsb24gdm90cmUgc291aGFpdC48YnI+U3VyIFdpa2lMZXJuaSwgcGFzIGRlIHB1YmxpY2l0w6ksIG5pIGRlIGNvbW1lcmNpYWxpc2F0aW9uIGRlIHZvcyBkb25uw6llcyBwZXJzb25uZWxsZXMuPGJyPlZvdXMgcG91dmV6IHZlbmlyIHkgXFxcImN1bHRpdmVyIHZvdHJlIGphcmRpblxcXCIgZW4gdG91dGUgdHJhbnF1aWxsaXTDqS48YnI+PGJyPjxzbWFsbD48ZW0+KCopIEJpZW4gcXVlIHBhcnRhZ2VhbnQgc2VzIHZhbGV1cnMsIFdpa2lMZXJuaSBlc3QgdW4gcHJvamV0IGluZMOpcGVuZGFudCBkZSBsYSBmb25kYXRpb24gV2lraXDDqWRpYS48L2VtPjwvc21hbGw+XCIsXG4gICAgbmV3UXVlc3Rpb25uYWlyZXNUaXRsZTogXCJMZXMgZGVybmllcnMgcXVpenMgcHVibGnDqXMgc3VyIFdpa2lMZXJuaVwiLFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzSW50cm86IFwiTGlzdGUgZGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzIHN1ciBXaWtpTGVybmkuXCIsXG4gICAgZXhwbGFuYXRpb25UaXRsZTogXCJWb3VzIGTDqWNvdXZyZXogV2lraUxlcm5pID9cIixcbiAgICBleHBsYW5hdGlvblR4dDogXCJMZSBwcmluY2lwZSBlc3Qgc2ltcGxlIDogdm91cyBjb21tZW5jZXogcGFyIGxpcmUgbCdhcnRpY2xlIFdpa2lww6lkaWEgZG9udCBsZSBsaWVuIHZvdXMgZXN0IHByb3Bvc8OpLjxicj5QdWlzIHZvdXMgYWZmaWNoZXIgbGUgcXVpeiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudSBkZSB2b3RyZSBsZWN0dXJlLiBWb3VzIG9idGVuZXogYWxvcnMgdm90cmUgcsOpc3VsdGF0IGltbcOpZGlhdGVtZW50Ljxicj48YnI+VG91dGVzIGxlcyByw6lwb25zZXMgc2UgdHJvdXZlbnQgZGFucyBsJ2FydGljbGUgcHJvcG9zw6kgw6AgbGEgbGVjdHVyZS4gPGI+Vm91cyDDqnRlcyBpY2kgcG91ciBhcHByZW5kcmUgZGUgbm91dmVsbGVzIGNob3NlczwvYj4sIG1haXMgbGlicmUgw6Agdm91cyBkJ2Vzc2F5ZXIgZCd5IHLDqXBvbmRyZSBpbW3DqWRpYXRlbWVudC48YnI+PGJyPlF1YW5kIGxlIHN1amV0IHMneSBwcsOqdGUsIG5lIHZvdXMgw6l0b25uZXogcGFzIHNpIGNlcnRhaW5lcyBkZXMgcsOpcG9uc2VzIHByb3Bvc8OpZXMgcGV1dmVudCDDqnRyZSB1biBwZXUgZMOpY2Fsw6llcywgYWJzdXJkZXMuLi4gT24gcGV1dCBhcHByZW5kcmUgYXZlYyBsZSBzb3VyaXJlLCBub24gPyA6LSk8YnI+PGJyPlVuZSBmb2lzIHZvdHJlIHLDqXN1bHRhdCBvYnRlbnUsIGlsIHZvdXMgc2VyYSBwcm9wb3PDqSBkZSBjcsOpZXIgdW4gY29tcHRlIHBvdXIgbGUgc2F1dmVnYXJkZXIuPGJyPkNlIGNvbXB0ZSB2b3VzIHBlcm1ldHRyYSBkZSB0ZXN0ZXIgZGUgbm91dmVhdSBjZSBxdWl6IHBvdXIgdsOpcmlmaWVyIGNlIHF1ZSB2b3VzIGVuIGF2ZXogcmV0ZW51IHBsdXNpZXVycyBqb3Vycywgc2VtYWluZXMsIG1vaXMuLi4gRXQgZGUgcmVjZXZvaXIgcsOpZ3VsacOocmVtZW50IGRlIG5vdXZlbGxlcyBzdWdnZXN0aW9ucyBkZSBsZWN0dXJlcy48YnI+PGJyPk1haXMgPGI+bGEgY3LDqWF0aW9uIGRlIGNlIGNvbXB0ZSBlc3QgZmFjdWx0YXRpdmU8L2I+IGV0IDxhIGhyZWY9Jy9xdWl6cy8nIHRpdGxlPSdMZXMgZGVybmllcnMgcXVpenMgcHVibGnDqXMnPnZvdXMgcG91dmV6IHBhcmNvdXJpciBXaWtpTGVybmkgbGlicmVtZW50PC9hPi5cIixcbiAgICBub0pTTm90aWZpY2F0aW9uOiBcIkTDqXNvbMOpLCBtYWlzIHBvdXIgbCdpbnN0YW50LCBsJ3V0aWxpc2F0aW9uIGRlIFdpa2lMZXJuaSBuw6ljZXNzaXRlIGwnYWN0aXZhdGlvbiBkdSBKYXZhU2NyaXB0LlwiLFxuICAgIHRhZ3NMaXN0VHh0OiBcIlBhcmNvdXJpciBsZXMgcnVicmlxdWVzIDpcIixcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIGhlYWRMaW5rczpcbiAgICBbXG4gICAgICAgIHsgYW5jaG9yOiBcIkNvbnRhY3RcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2NvbnRhY3QuaHRtbFwiLCByZWw6IFwibm9mb2xsb3dcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIlBhcmNvdXJpclwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvcXVpenMvXCIsIGlkOlwiaW5kZXhIZWFkTGlua1wiLCB0aXRsZTpcIkxlcyBkZXJuacOocmVzIG1pc2VzIMOgIGpvdXIgV2lraUxlcm5pXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNb24gY29tcHRlXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb25uZXhpb24uaHRtbFwiLCBpZDogXCJhY2NvdW50SGVhZExpbmtcIiwgdGl0bGU6XCJBY2PDqWRlciBvdSBjcsOpZXogdm90cmUgY29tcHRlIFdpa2lMZXJuaVwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiw4AgcHJvcG9zXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9hLXByb3Bvcy5odG1sXCIsIHRpdGxlOlwiRW4gc2F2b2lyICsgc3VyIFdpa2lMZXJuaVwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQWNjdWVpbFwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvXCIsIHRpdGxlOlwiUGFnZSBkJ2FjY3VlaWxcIiB9IH1cbiAgICBdLFxuICAgIGZvb3RMaW5rczpcbiAgICBbXG4gICAgICAgIHsgYW5jaG9yOiBcIkJsb2dcIiwgYXR0cmlidXRlczogeyBocmVmOlwiaHR0cHM6Ly9mcmFtYXNwaGVyZS5vcmcvcGVvcGxlLzdlNTRiN2EwYjUzMjAxMzg5ZWVmMmEwMDAwMDUzNjI1XCIsIHRpdGxlOlwiTGUgYmxvZyBXaWtpTGVybmkgc3VyIGRpYXNwb3JhKlwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQ3LDqWRpdHNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2NyZWRpdHMuaHRtbFwiLCB0aXRsZTpcIlF1aSBhIGNyw6nDqSBXaWtpTGVybmkgPyBRdWVscyBzb250IHZvcyBkcm9pdHMgP1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiTWVudGlvbnMgbMOpZ2FsZXNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL21lbnRpb25zLWxlZ2FsZXMuaHRtbFwiLCByZWw6IFwibm9mb2xsb3dcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkRvbm7DqWVzIHBlcnNvbm5lbGxlc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvZG9ubmVlcy5odG1sXCIsIHRpdGxlOlwiVm9zIGRvbm7DqWVzIHBlcnNvbm5lbGxlcyBzdXIgV2lraUxlcm5pXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDR1YgJiBDR1VcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL0NHVi1DR1UuaHRtbFwiLCByZWw6IFwibm9mb2xsb3dcIiB9IH1cbiAgICBdLFxuICAgIG1heFF1ZXN0aW9ubmFpcmVzU2l0ZUhvbWVQYWdlOiAzLFxuICAgIG1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlOiAxMixcbiAgICBuYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlIDogMyxcbiAgICB1c2VySG9tZVBhZ2UgOiBcImFjY3VlaWwuaHRtbFwiLFxuICAgIHVzZXJIb21lUGFnZVR4dCA6IFwiTWEgcGFnZSBkJ2FjY3VlaWwuXCIsXG4gICAgYWRtaW5Ib21lUGFnZSA6IFwiYWRtaW4uaHRtbFwiLFxuICAgIG1hbmFnZXJIb21lUGFnZSA6IFwiZ2VzdGlvbi5odG1sXCIsXG4gICAgc3Vic2NyaWJlUGFnZSA6IFwiaW5zY3JpcHRpb24uaHRtbFwiLFxuICAgIGNvbm5lY3Rpb25QYWdlIDogXCJjb25uZXhpb24uaHRtbFwiLFxuICAgIHZhbGlkYXRpb25MaW5rUGFnZSA6IFwidmFsaWRhdGlvbi5odG1sP3Q9XCIsXG4gICAgbG9naW5MaW5rUGFnZSA6IFwibG9naW4uaHRtbD90PVwiLFxuICAgIG5ld0xvZ2luTGlua1BhZ2UgOiBcIm5ld2xvZ2luLmh0bWw/dD1cIixcbiAgICBkZWxldGVMaW5rUGFnZSA6IFwiYXVyZXZvaXIuaHRtbD90PVwiLFxuICAgIHN0b3BNYWlsUGFnZSA6IFwic3RvcC1tYWlsLmh0bWw/dD1cIixcbiAgICBhY2NvdW50UGFnZTogXCJjb21wdGUuaHRtbFwiLFxuICAgIHVwZGF0ZUFjY291bnRQYWdlOiBcImNvbXB0ZS5odG1sXCIsXG4gICAgcXVlc3Rpb25uYWlyZXNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXF1aXpzLmh0bWxcIixcbiAgICB1c2Vyc01hbmFnZW1lbnRQYWdlOiBcImdlc3Rpb24tdXRpbGlzYXRldXJzLmh0bWxcIixcbiAgICBhYm91dFBhZ2U6IFwiYS1wcm9wb3MuaHRtbFwiLFxuICAgIGlsbHVzdHJhdGlvbkRpciA6IFwiL2ltZy9xdWl6cy9cIixcbiAgICBzaXRlU2xvZ2FuOiBcIkN1bHRpdm9ucyBub3RyZSBqYXJkaW4gIVwiLFxuICAgIGhvbWVQYWdlVHh0OiBcIlBhZ2UgZCdhY2N1ZWlsXCIsXG4gICAgaG9tZVRpdGxlMTogXCJEZSBuYXR1cmUgY3VyaWV1c2UgP1wiLFxuICAgIGhvbWVQMTogXCJBdmVjIFdpa2lMZXJuaSwgdm91cyBhcHByZW5leiBjaGFxdWUgam91ciBkZSBub3V2ZWxsZXMgY2hvc2VzLjxicj5EZXMgYXJ0aWNsZXMgZGUgV2lraXDDqWRpYSBzb250IHPDqWxlY3Rpb25uw6lzIHBvdXIgdm91cyBldCBzb250IHN1aXZpcyBkJ3VuIHF1aXogdm91cyBwZXJtZXR0YW50IGRlIHRlc3RlciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudS48YnI+RGUgam91ciBlbiBqb3VyIGRlIG5vdXZlbGxlcyBncmFpbmVzIGRlIHNhdm9pciBzb250IGFpbnNpIHNlbcOpZXMgZGFucyB2b3RyZSBcXFwiamFyZGluXFxcIi5cIixcbiAgICBob21lVGl0bGUyOiBcIkxhIGN1bHR1cmUgZW4gbGliZXJ0w6lcIixcbiAgICBob21lUDI6IFwiVG91dCBjb21tZSBzdXIgV2lraXDDqWRpYSA8c3BhbiBjbGFzcz0ncG9zdHNjcmlwdHVtJz4oKik8L3NwYW4+LCBsZSBsb2dpY2llbCBldCBsZSBjb250ZW51IHBhcnRhZ8OpIHN1ciBXaWtpTGVybmkgPGEgaHJlZj1cXFwiL2NyZWRpdHMuaHRtbFxcXCIgdGl0bGU9XFxcIkVuIHNhdm9pciBwbHVzXFxcIj5zb250IGxpYnJlczwvYT4uPGJyPlN1ciBXaWtpTGVybmksIHBhcyBkZSBwdWJsaWNpdMOpLCBuaSBkZSBjb21tZXJjaWFsaXNhdGlvbiBkZSB2b3MgZG9ubsOpZXMuPGJyPlZvdXMgcG91dmV6IHZlbmlyIHkgXFxcImN1bHRpdmVyIHZvdHJlIGphcmRpblxcXCIgZW4gdG91dGUgdHJhbnF1aWxsaXTDqS5cIixcbiAgICBob21lQnRuQWJvdXRUeHQ6IFwiRW4gc2F2b2lyIHBsdXMgc3VyIFdpa2lMZXJuaSA/XCIsXG4gICAgaG9tZUJ0blN1YnNjcmliZVR4dDogXCJUZXN0ZXIgV2lraUxlcm5pIGdyYXR1aXRlbWVudC5cIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc1RpdGxlOiBcIkN1bHR1cmUgZ8OpbsOpcmFsZSAtIGFwcHJlbmV6IGRlIG5vdXZlbGxlcyBjaG9zZXMgYXZlYyBXaWtpTGVybmlcIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc0ludHJvOiBcIldpa2lMZXJuaSA6IHRlc3RleiB2b3MgY29ubmFpc3NhbmNlcyBldCBhcHByZW5leiBkZSBub3V2ZWxsZXMgY2hvc2VzIGF2ZWMgbGVzIHF1aXpzIFdpa2lMZXJuaS5cIixcbiAgICBleHBsYW5hdGlvblRpdGxlOiBcIlZvdXMgZMOpY291dnJleiBXaWtpTGVybmkgP1wiLFxuICAgIGV4cGxhbmF0aW9uVHh0OiBcIjxwPkxlIHByaW5jaXBlIGVzdCBzaW1wbGUgOiA8Yj52b3VzIGNvbW1lbmNleiBwYXIgbGlyZSBsJ2FydGljbGUgV2lraXDDqWRpYSBkb250IGxlIGxpZW4gdm91cyBlc3QgcHJvcG9zw6k8L2I+Ljxicj5QdWlzIHZvdXMgPGI+YWZmaWNoZXIgbGUgcXVpeiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBhdmV6IHJldGVudSBkZSB2b3RyZSBsZWN0dXJlPC9iPi48L3A+PHA+U3VpdmFudCBsZXMgcXVlc3Rpb25zLCA8Yj51bmUgb3UgcGx1c2lldXJzIHLDqXBvbnNlcyBwZXV2ZW50IMOqdHJlIGNvcnJlY3RlczwvYj4gZXQgZG9pdmVudCBkb25jIMOqdHJlIGNvY2jDqWVzLjxicj5DJ2VzdCB0b3Vqb3VycyA8Yj5sZSBjb250ZW51IGRlIGwnYXJ0aWNsZSBXaWtpcMOpZGlhIHF1aSBmYWl0IGZvaTwvYj4gY29uY2VybmFudCBsZXMgXFxcImJvbm5lc1xcXCIgcsOpcG9uc2VzLjxicj5NYWlzIGxlcyBhcnRpY2xlcyBkZSBXaWtpcMOpZGlhIHBldXZlbnQgw6l2b2x1ZXIsIGRvbmMgbidow6lzaXRleiBwYXMgPGEgaHJlZj0nL2NvbnRhY3QuaHRtbCc+w6AgbWUgc2lnbmFsZXIgdW5lIGVycmV1cjwvYT4uPC9wPjxoMz5QYXMgbGUgdGVtcHMgZGUgbGlyZSBsJ2FydGljbGUgV2lraXDDqWRpYSA/PC9oMz48cD5JbCBlc3QgdnJhaSBxdWUgY2VydGFpbnMgc29udCBsb25ncyAhIDotKTxicj5EYW5zIGNlIGNhcywgPGI+ZXNzYXlleiBzaW1wbGVtZW50IGRlIHLDqXBvbmRyZSBhdmVjIHZvcyBjb25uYWlzc2FuY2VzIGFjdHVlbGxlczwvYj4uPGJyPklsIG4nZXN0IHBhcyBuw6ljZXNzYWlyZSBkZSByw6lwb25kcmUgw6AgdG91dGVzIGxlcyBxdWVzdGlvbnMgcG91ciBvYnRlbmlyIGxlcyByw6lwb25zZXMuPGJyPkFwcsOocyB2YWxpZGF0aW9uLCB2b3VzIHZlcnJleiBhcHBhcmHDrnRyZSBsZXMgYm9ubmVzIHLDqXBvbnNlcyArIHVuIGV4dHJhaXQgZGUgbCdhcnRpY2xlIFdpa2lww6lkaWEuPGJyPlZvdXMgcG91dmV6IGFpbnNpIDxiPmFwcHJlbmRyZSBkZSBub3V2ZWxsZXMgY2hvc2VzIGVuIHF1ZWxxdWVzIG1pbnV0ZXM8L2I+LjwvcD48cD5VbmUgYXV0cmUgcG9zc2liaWxpdMOpIGVzdCBkJ2FmZmljaGVyIGxlIHF1aXogYXZhbnQgZCdhbGxlciBjaGVyY2hlciBsZXMgcsOpcG9uc2VzIGRhbnMgbCdhcnRpY2xlIFdpa2lww6lkaWEuLi4gRWxsZXMgeSBzb250IHRvdXRlcyAhPC9wPjxwPjxiPklsIG4neSBhIHBhcyBkZSBib25uZSBmYcOnb24gZGUgZmFpcmU8L2I+LCBldCBkYW5zIHRvdXMgbGVzIGNhcyA8Yj52b3VzIGFwcHJlbmV6IGRlcyBjaG9zZXMgc3VyIGRlcyBzdWpldHMgdHLDqHMgdmFyacOpcywgY2UgcXVpIGVzdCBsZSBidXQgZGUgV2lraUxlcm5pPC9iPi48L3A+PHA+UXVhbmQgbGUgc3VqZXQgcyd5IHByw6p0ZSwgbmUgdm91cyDDqXRvbm5leiBwYXMgc2kgY2VydGFpbmVzIGRlcyByw6lwb25zZXMgcHJvcG9zw6llcyBwZXV2ZW50IMOqdHJlIHVuIHBldSBkw6ljYWzDqWVzLCBhYnN1cmRlcy4uLiBPbiBwZXV0IGFwcHJlbmRyZSBhdmVjIGxlIHNvdXJpcmUsIG5vbiA/IDopPC9wPjxwPlVuZSBmb2lzIHZvdHJlIHLDqXN1bHRhdCBvYnRlbnUsIGlsIHZvdXMgc2VyYSBwcm9wb3PDqSBkZSBjcsOpZXIgdW4gY29tcHRlIHBvdXIgbGUgc2F1dmVnYXJkZXIuIENlIGNvbXB0ZSB2b3VzIHBlcm1ldHRyYSBkZSA8Yj50ZXN0ZXIgZGUgbm91dmVhdSBjZSBxdWl6PC9iPiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudSBhcHLDqHMgcGx1c2lldXJzIGpvdXJzLCBzZW1haW5lcywgbW9pcy4uLiBHcsOiY2Ugw6AgY2UgY29tcHRlLCB2b3VzIHBvdXJyZXogYXVzc2kgPGI+cmVjZXZvaXIgcsOpZ3VsacOocmVtZW50IGRlIG5vdXZlYXV4IHF1aXpzPC9iPiBwb3VyIGNvbnRpbnVlciDDoCBcXFwiY3VsdGl2ZXIgdm90cmUgamFyZGluXFxcIi48L3A+XCIsXG4gICAgcXVlc3Rpb25uYWlyZUxpY2VuY2VUeHQ6IFwiQ2UgcXVpeiA8YSBocmVmPVxcXCIvY3JlZGl0cy5odG1sXFxcIj5lc3QgbGlicmU8L2E+LCBtYWlzIGlsIG4nZXN0IHBhcyBncmF0dWl0LiBWb3VzIHBvdXZleiA8YSBocmVmPVxcXCIvcGFydGljaXBlci1maW5hbmNlbWVudC5odG1sXFxcIj5wYXJ0aWNpcGVyIMOgIHNvbiBmaW5hbmNlbWVudCBlbiBjbGlxdWFudCBpY2k8L2E+LlwiLFxuICAgIG5vSlNOb3RpZmljYXRpb246IFwiRMOpc29sw6ksIG1haXMgcG91ciBsJ2luc3RhbnQsIGwndXRpbGlzYXRpb24gZGUgV2lraUxlcm5pIG7DqWNlc3NpdGUgbCdhY3RpdmF0aW9uIGR1IEphdmFTY3JpcHQuXCIsXG4gICAgbmV3c0xpc3RUaXRsZTogXCI8aDM+MSBhcnRpY2xlIFdpa2lww6lkaWEgKyAxIHF1aXogPSAxIFdpa2lMZXJuaTwvaDM+PHA+V2lraUxlcm5pLCBjZSBzb250IHBsdXNpZXVycyBxdWl6cyBwdWJsacOpcyBjaGFxdWUgc2VtYWluZSwgY2hhY3VuIGFzc29jacOpIMOgIHVuIGFydGljbGUgV2lraXDDqWRpYS48YnI+U2FucyBwdWJsaWNpdMOpLCBuaSBjb21tZXJjZSBkZSB2b3MgZG9ubsOpZXMsIDxiPnZvdXMgYXBwcmVuZXogZGUgbm91dmVsbGVzIGNob3NlcyBlbiB0b3V0ZSBsaWJlcnTDqTwvYj4uPC9wPjxibG9ja3F1b3RlPkFyaXN0b3Rl4oCvOiDCq+KAr0zigJlob21tZSBhIG5hdHVyZWxsZW1lbnQgbGEgcGFzc2lvbiBkZSBjb25uYcOudHJl4oCm4oCvwrs8L2Jsb2NrcXVvdGU+XCIsXG4gICAgbWFpbFJlY2lwaWVudFR4dDogXCJNZXNzYWdlIGVudm95w6kgw6AgOlwiLFxuICAgIHR3aXR0ZXJBY2NvdW50OiBcIkBXaWtpTGVybmlcIixcbn07IiwiLy8gLS0gR0VTVElPTiBERVMgRk9STVVMQUlSRVMgUEVSTUVUVEFOVCBBVVggVVRJTElTQVRFVVJTIERFIE1FVFRSRSDDgCBKT1VSIExFVVJTIElORk9STUFUSU9OUyArIExFVVIgQUJPTk5FTUVOVFxuXG4vLy8gVsOpcmlmaWVyIHF1ZSBsJ3V0aWxpc2F0ZXVyIGVzdCBiaWVuIGNvbm5lY3TDqSwgYSBsZSBib24gc3RhdHV0IGV0IGxlIHJlZGlyaWdlciB2ZXJzIGxlIGZvcm11bGFpcmUgZCdpbnNjcmlwdGlvbiBzaSBjZSBuJ2VzdCBwYXMgbGUgY2FzLlxuLy8vIFNpIGMnZXN0IG9rLCBvbiByw6ljdXDDqHJlIGxlcyBpbmZvcyBkZSBzb24gY29tcHRlIGV0IHNvbiBhYm9ubmVtZW50IGV0IGxlcyBhZmZpY2hlIGRhbnMgbGUgZm9ybXVsYWlyZS5cbi8vLyBVbmUgaW5mb3JtYXRpb24gZXN0IGFmZmljaMOpZSBjb25jZXJuYW50IGxhIHBvc3NpYmlsaXTDqSBkZSBwYXJyYWluYWdlIGV0IGxpc3RlIGxlcyBmaWxsZXVscyBleGlzdGFudHMuXG4vLy8gVW4gbWVudSBwZXJtZXQgw6AgbCd1dGlsaXNhdGV1ciBkJ2FjY8OpZGVyIMOgIGxhIG1vZGlmaWNhdGlvbiBkZSBzZXMgaW5mb3MsIGV0Yy5cbi8vLyBEZXMgYm91dG9ucyBkZSBwYWllbWVudCBzb250IGF1c3NpIGFmZmljaMOpcyBzdWl2YW50IGxlIGNob2l4IGRlIGwndXRpbGlzYXRldXIgcG91ciBsdWkgcGVybWV0dHJlIGRlIHByb2xvbmdlciBzb24gYWJvbm5lbWVudC5cbi8vLyBVbiBtZXNzYWdlIHZlbmFudCBkJ3VuZSBhdXRyZSBwYWdlIHBldXQgYXVzc2kgw6p0cmUgw6AgYWZmaWNoZXIgbG9ycyBkdSBwcmVtaWVyIGNoYXJnZW1lbnQuXG5cbi8vIEZpY2hpZXIgZGUgY29uZmlndXJhdGlvbiBjw7R0w6kgY2xpZW50IDpcbmltcG9ydCB7IGFwaVVybCwgYXZhaWxhYmxlTGFuZ3MsIHRoZW1lIH0gZnJvbSBcIi4uLy4uL2NvbmZpZy9pbnN0YW5jZS5qc1wiO1xuY29uc3QgbGFuZz1hdmFpbGFibGVMYW5nc1swXTtcbmNvbnN0IGNvbmZpZ1RlbXBsYXRlID0gcmVxdWlyZShcIi4uLy4uL3ZpZXdzL1wiK3RoZW1lK1wiL2NvbmZpZy9cIitsYW5nK1wiLmpzXCIpOy8vIGJlc29pbiBkZSB0b3V0ZXMgbGVzIGTDqWNsYXJhdGlvbnMgcG91ciBsYSBmb25jdGlvbiA6IHVwZGF0ZUFjY291bnRMaW5rKClcbmNvbnN0IHsgYmVnaW5Db2RlR29kZmF0aGVyIH0gPSByZXF1aXJlKFwiLi4vLi4vY29uZmlnL2luc3RhbmNlXCIpO1xuY29uc3QgY29uZmlnVXNlcnMgPSByZXF1aXJlKFwiLi4vLi4vY29uZmlnL3VzZXJzXCIpOyAvLyBiZXNvaW4gZGUgdG91cyBsZSBmaWNoaWVyIHBvdXIgY29uZmlndXJlciBsZSBmb3JtdWxhaXJlXG5cbi8vIEZvbmN0aW9ucyB1dGlsZXMgYXUgc2NyaXB0XG5pbXBvcnQgeyBnZXRMb2NhbHksIHJlbW92ZUxvY2FseSB9IGZyb20gXCIuL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanNcIjtcbmltcG9ydCB7IGFkZEVsZW1lbnQgfSBmcm9tIFwiLi90b29scy9kb20uanNcIjtcbmltcG9ydCB7IGhlbGxvRGV2LCB1cGRhdGVBY2NvdW50TGluayB9IGZyb20gXCIuL3Rvb2xzL2V2ZXJ5d2hlcmUuanNcIjtcbmltcG9ydCB7IGdldERhdGFzRnJvbUlucHV0cywgc2V0QXR0cmlidXRlc1RvSW5wdXRzIH0gZnJvbSBcIi4vdG9vbHMvZm9ybXMuanNcIjtcbmltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vdG9vbHMvbWFpblwiO1xuaW1wb3J0IHsgY2hlY2tTZXNzaW9uLCBnZXRDb25maWcsIGdldFRpbWVEaWZmZXJlbmNlIH0gZnJvbSBcIi4vdG9vbHMvdXNlcnMuanNcIjtcblxuLy8gU3DDqWNpZmlxdWUgV2ViUG9ydGFnZSBwb3VyIHBhaWVtZW50czpcbmltcG9ydCB7IHNob3dCdG5QYXltZW50LCB1bkNoZWNrQWxsT3RoZXJzIH0gZnJvbSBcIi4vdG9vbHMvd2VicG9ydGFnZS5qc1wiO1xuXG4vLyBEaWN0aW9ubmFpcmVzIDpcbmNvbnN0IHsgc2VydmVyRXJyb3IgfSA9IHJlcXVpcmUoXCIuLi8uLi9sYW5nL1wiK2xhbmcrXCIvZ2VuZXJhbFwiKTtcbmNvbnN0IHsgaW5mb3NVc2VyTmJHb2RDaGlsZHMsIGluZm9zVXNlck5vR29kY2hpbGRzLCBuZWVkQmVDb25uZWN0ZWQgfSA9IHJlcXVpcmUoXCIuLi8uLi9sYW5nL1wiK2xhbmcrXCIvdXNlclwiKTtcbmNvbnN0IHsgaW5mb3NFeHBpcmF0ZWQsIGluZm9zTmJEYXlzIH0gPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL3N1YnNjcmlwdGlvblwiKTtcblxuLy8gUHJpbmNpcGF1eCDDqWzDqW1lbnRzIGR1IERPTSBtYW5pcHVsw6lzIDpcbmNvbnN0IGRpdkNyYXNoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjcmFzaFwiKTtcbmNvbnN0IGRpdk1haW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1haW4tY29udGVudFwiKTtcbmNvbnN0IGRpdk1lc3NhZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1lc3NhZ2VcIik7XG5jb25zdCBkaXZSZXNwb25zZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicmVzcG9uc2VcIik7XG5jb25zdCBkaXZHb2RjaGlsZHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImdvZGNoaWxkc1wiKTtcbmNvbnN0IGRpdlN1YnNjcmliZUludHJvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzdWJzY3JpYmVJbnRyb1wiKTtcbmNvbnN0IGZvcm1BY2NvdW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJhY2NvdW50VXBkYXRlXCIpO1xuY29uc3QgbmV3UGFzc3dvcmQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm5ld1Bhc3N3b3JkXCIpO1xuY29uc3Qgc2hvd0dGRW1haWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImdvZGZhdGhlckVtYWlsXCIpO1xuY29uc3Qgc2hvd0dGQ29kZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZ29kZmF0aGVyQ29kZVwiKTtcblxuaGVsbG9EZXYoKTtcblxuY29uc3QgaW5pdGlhbGlzZSA9IGFzeW5jICgpID0+XG57XG4gICAgdHJ5XG4gICAge1xuICAgICAgICAvLyBTaSBsJ3V0aWxpc2F0ZXVyIG4nZXN0IHBhcyBjb25uZWN0w6kgYXZlYyBsZSBib24gc3RhdHV0LCBwYXMgbGEgcGVpbmUgZCdhbGxlciArIGxvaW4gOlxuICAgICAgICBjb25zdCBpc0Nvbm5lY3RlZD1hd2FpdCBjaGVja1Nlc3Npb24oW1widXNlclwiXSwgXCIvXCIrY29uZmlnVGVtcGxhdGUuY29ubmVjdGlvblBhZ2UsIHsgbWVzc2FnZTogbmVlZEJlQ29ubmVjdGVkLCBjb2xvcjpcImVycm9yXCIgfSwgd2luZG93LmxvY2F0aW9uKTtcbiAgICAgICAgaWYoaXNDb25uZWN0ZWQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRpdk1haW4uc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgICAgICAvLyBsJ8OpdmVudHVlbGxlIGFuY3JlIGVzdCBpZ25vcsOpZSwgY2FyIGFic2VudGUgZHUgRE9NIGF2YW50IGQnYXZvaXIgdsOpcmlmacOpIGxhIGNvbm5leGlvblxuICAgICAgICAgICAgaWYod2luZG93LmxvY2F0aW9uLmhhc2ghPT11bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbih3aW5kb3cubG9jYXRpb24uaGFzaCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmKCFpc0VtcHR5KGdldExvY2FseShcIm1lc3NhZ2VcIikpKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2TWVzc2FnZSwgXCJwXCIsIGdldExvY2FseShcIm1lc3NhZ2VcIiwgdHJ1ZSkubWVzc2FnZSwgXCJcIiwgW2dldExvY2FseShcIm1lc3NhZ2VcIiwgdHJ1ZSkuY29sb3JdLCBcIlwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwibWVzc2FnZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHVzZXI9Z2V0TG9jYWx5KFwidXNlclwiLCB0cnVlKTtcbiAgICAgICAgICAgIHVwZGF0ZUFjY291bnRMaW5rKHVzZXIuc3RhdHVzLCBjb25maWdUZW1wbGF0ZSk7XG4gICAgICAgICAgICAvLyBJbml0aWFsaXNlIGxlIGZvcm11bGFpcmUgcGVybWV0dGFudCBkZSBtZXR0cmUgw6Agam91ciBsZXMgaW5mb3MgOlxuICAgICAgICAgICAgc2V0QXR0cmlidXRlc1RvSW5wdXRzKGNvbmZpZ1VzZXJzLCBmb3JtQWNjb3VudCk7XG4gICAgICAgICAgICAvLyBDZXJ0YWlucyBuYXZpZ2F0ZXVycyByZW1wbGlzc2VudCBsZXMgY2hhbXBzIHBhc3N3b3JkIDpcbiAgICAgICAgICAgIG5ld1Bhc3N3b3JkLnZhbHVlPVwiXCI7XG5cbiAgICAgICAgICAgIC8vIEZvbmN0aW9uIGFmZmljaGFudCBsZXMgaW5mb3MgY29ubnVlcyBhdSBwcmVtaWVyIGFmZmljaGFnZSwgcHVpcyBhcHLDqHMgZW52b2kgbWlzZSDDoCBqb3VyXG4gICAgICAgICAgICBjb25zdCBnZXRJbmZvcyA9ICgpID0+XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgeGhyR2V0SW5mb3MgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICB4aHJHZXRJbmZvcy5vcGVuKFwiR0VUXCIsIGFwaVVybCtjb25maWdVc2Vycy51c2VyUm91dGVzK2NvbmZpZ1VzZXJzLmdldFVzZXJJbmZvcyt1c2VyLmlkKTtcbiAgICAgICAgICAgICAgICB4aHJHZXRJbmZvcy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gMjAwICYmIHJlc3BvbnNlLlVzZXIgIT0gdW5kZWZpbmVkICYmIHJlc3BvbnNlLlN1YnNjcmlwdGlvbiAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBkYXRhIGluIHJlc3BvbnNlLlVzZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihmb3JtQWNjb3VudC5lbGVtZW50c1tkYXRhXSE9PXVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2UuVXNlcltkYXRhXSE9PXRydWUgJiYgcmVzcG9uc2UuVXNlcltkYXRhXSE9PWZhbHNlKS8vIGJvb2zDqWVuID0gY2FzZSDDoCBjb2NoZXIgIVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1BY2NvdW50LmVsZW1lbnRzW2RhdGFdLnZhbHVlPXJlc3BvbnNlLlVzZXJbZGF0YV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZS5Vc2VyW2RhdGFdPT10cnVlKSAvLyBzaSBmYWxzZSwgb24gbmUgZmFpdCByaWVuICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1BY2NvdW50LmVsZW1lbnRzW1wiXCIrZGF0YV0uY2hlY2tlZD1cImNoZWNrZWRcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmZvcyBkZSBsJ2Fib25uZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5TdWJzY3JpcHRpb24ubm90aWNlT2s9PXRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1BY2NvdW50LmVsZW1lbnRzW1wibm90aWNlT2tcIl0uY2hlY2tlZD1cImNoZWNrZWRcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqb3VycyBkZSByw6ljZXB0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpIGluIHJlc3BvbnNlLlN1YnNjcmlwdGlvbi5yZWNlaXB0RGF5cylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUFjY291bnQuZWxlbWVudHNbXCJkXCIrcmVzcG9uc2UuU3Vic2NyaXB0aW9uLnJlY2VpcHREYXlzW2ldXS5jaGVja2VkPVwiY2hlY2tlZFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFwiY29kZXNcIiBwb3NzaWJsZXMgw6AgdHJhbnNtZXR0cmUgcG91ciBwYXJyYWluZXIgZCdhdXRyZXMgdXRpbGlzYXRldXJzIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dHRkVtYWlsLmlubmVySFRNTD1yZXNwb25zZS5Vc2VyLmVtYWlsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dHRkNvZGUuaW5uZXJIVE1MPWJlZ2luQ29kZUdvZGZhdGhlcityZXNwb25zZS5Vc2VyLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmVnaW5TdWJUUz1uZXcgRGF0ZShyZXNwb25zZS5TdWJzY3JpcHRpb24uY3JlYXRlZEF0KS5nZXRUaW1lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYkRheXNPaz1yZXNwb25zZS5TdWJzY3JpcHRpb24ubnVtYmVyT2ZEYXlzLU1hdGgucm91bmQoKERhdGUubm93KCktYmVnaW5TdWJUUykvMTAwMC8zNjAwLzI0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKG5iRGF5c09rID4gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlN1YnNjcmliZUludHJvLCBcInBcIiwgaW5mb3NOYkRheXMucmVwbGFjZShcIk5CX0RBWVNcIiwgbmJEYXlzT2spLCBcIlwiLCBbXCJpbmZvXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlN1YnNjcmliZUludHJvLCBcInBcIiwgaW5mb3NFeHBpcmF0ZWQucmVwbGFjZShcIk5CX0RBWVNcIiwgbmJEYXlzT2spLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIiNzdWJzY3JpYmVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgeGhyR2V0SW5mb3Muc2V0UmVxdWVzdEhlYWRlcihcIkF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIrdXNlci50b2tlbik7XG4gICAgICAgICAgICAgICAgeGhyR2V0SW5mb3Muc2VuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUmVtb250ZSBsZXMgaW5mb3MgZMOpasOgIGVucmVnaXN0csOpZXMgOlxuICAgICAgICAgICAgZ2V0SW5mb3MoKTtcbiAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFRyYWl0ZW1lbnQgZGUgbCdlbnZvaSBkJ3VuZSBtaXNlIMOgIGpvdXIgZGVzIGluZm9zXG4gICAgICAgICAgICBmb3JtQWNjb3VudC5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGRpdlJlc3BvbnNlLmlubmVySFRNTD1cIlwiO1xuICAgICAgICAgICAgICAgIGxldCBkYXRhcz1nZXREYXRhc0Zyb21JbnB1dHMoZm9ybUFjY291bnQpO1xuICAgICAgICAgICAgICAgIC8vIHJlY29tcG9zaXRpb24gZGVzIGpvdXJzIHZhbGFibGVzIHBvdXIgbCdhYm9ubmVtZW50IDpcbiAgICAgICAgICAgICAgICBkYXRhcy5yZWNlaXB0RGF5cz1cIlwiO1xuICAgICAgICAgICAgICAgIGZvcihsZXQgaT0xOyBpPD03OyBpKyspXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZihkYXRhc1tcImRcIitpXSE9PXVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFzLnJlY2VpcHREYXlzKz1cIlwiK2k7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmKGRhdGFzLm5vdGljZU9rPT09dW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICBkYXRhcy5ub3RpY2VPaz1cImZhbHNlXCI7XG4gICAgICAgICAgICAgICAgaWYoZGF0YXMubmV3c2xldHRlck9rPT09dW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICBkYXRhcy5uZXdzbGV0dGVyT2s9XCJmYWxzZVwiO1xuICAgICAgICAgICAgICAgIGRhdGFzLnRpbWVEaWZmZXJlbmNlPWdldFRpbWVEaWZmZXJlbmNlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgeGhyVXNlclVwZGF0ZSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgIGlmKGRhdGFzLmRlbGV0ZU9rIT09dW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICB4aHJVc2VyVXBkYXRlLm9wZW4oXCJERUxFVEVcIiwgYXBpVXJsK2NvbmZpZ1VzZXJzLnVzZXJSb3V0ZXMrXCIvXCIrdXNlci5pZCk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB4aHJVc2VyVXBkYXRlLm9wZW4oXCJQVVRcIiwgYXBpVXJsK2NvbmZpZ1VzZXJzLnVzZXJSb3V0ZXMrY29uZmlnVXNlcnMudXBkYXRlVXNlckluZm9zK3VzZXIuaWQpO1xuICAgICAgICAgICAgICAgIHhoclVzZXJVcGRhdGUub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCAmJiByZXNwb25zZS5tZXNzYWdlIT11bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShyZXNwb25zZS5tZXNzYWdlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UubWVzc2FnZSA9IHJlc3BvbnNlLm1lc3NhZ2Uuam9pbihcIjxicj5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5tZXNzYWdlID0gcmVzcG9uc2UubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgcmVzcG9uc2UubWVzc2FnZSwgXCJcIiwgW1wic3VjY2Vzc1wiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZS5lcnJvcnMpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShyZXNwb25zZS5lcnJvcnMpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvcnMgPSByZXNwb25zZS5lcnJvcnMuam9pbihcIjxicj5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvcnMgPSBzZXJ2ZXJFcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgcmVzcG9uc2UuZXJyb3JzLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkYW5zIHRvdXMgbGVzIGNhcywgamUgbWV0cyDDoCBqb3VyIGxlIGNvbnRlbnUgZHUgZm9ybXVsYWlyZSA6XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRJbmZvcygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHhoclVzZXJVcGRhdGUuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG4gICAgICAgICAgICAgICAgeGhyVXNlclVwZGF0ZS5zZXRSZXF1ZXN0SGVhZGVyKFwiQXV0aG9yaXphdGlvblwiLCBcIkJlYXJlciBcIit1c2VyLnRva2VuKTtcbiAgICAgICAgICAgICAgICBpZihkYXRhcylcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFzLm91dHB1dD1cImh0bWxcIjtcbiAgICAgICAgICAgICAgICAgICAgeGhyVXNlclVwZGF0ZS5zZW5kKEpTT04uc3RyaW5naWZ5KGRhdGFzKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIG9uIHBhc3NlIMOgIGxhIGNhaXNzZSA/XG4gICAgICAgICAgICBjb25zdCBhYm85PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYWJvOVwiKTtcbiAgICAgICAgICAgIGNvbnN0IGFibzE4PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYWJvMThcIik7XG4gICAgICAgICAgICBjb25zdCBhYm8zNj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFibzM2XCIpO1xuICAgICAgICAgICAgY29uc3QgYWJvNTQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJhYm81NFwiKTtcbiAgICAgICAgICAgIGNvbnN0IENHVj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIkNHVk9rXCIpO1xuICAgICAgICAgICAgY29uc3QgZGl2V1BCdG5zPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiV1BCdG5zXCIpO1xuICAgICAgICAgICAgZGl2V1BCdG5zLnN0eWxlLmRpc3BsYXk9XCJub25lXCI7XG4gICAgICAgICAgICBhYm85LmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB1bkNoZWNrQWxsT3RoZXJzKFwiYWJvOVwiKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYWJvMTguYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBmdW5jdGlvbihlKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHVuQ2hlY2tBbGxPdGhlcnMoXCJhYm8xOFwiKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYWJvMzYuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBmdW5jdGlvbihlKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHVuQ2hlY2tBbGxPdGhlcnMoXCJhYm8zNlwiKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYWJvNTQuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBmdW5jdGlvbihlKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHVuQ2hlY2tBbGxPdGhlcnMoXCJhYm81NFwiKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgQ0dWLmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZihDR1YuY2hlY2tlZD09PXRydWUpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBkaXZXUEJ0bnMuc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmKGFibzkuY2hlY2tlZD09PXRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93QnRuUGF5bWVudChcImJ0bjlcIik7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoYWJvMTguY2hlY2tlZD09PXRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93QnRuUGF5bWVudChcImJ0bjE4XCIpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKGFibzM2LmNoZWNrZWQ9PT10cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0J0blBheW1lbnQoXCJidG4zNlwiKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihhYm81NC5jaGVja2VkPT09dHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dCdG5QYXltZW50KFwiYnRuNTRcIik7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGl2V1BCdG5zLnN0eWxlLmRpc3BsYXk9XCJub25lXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBDR1YuY2hlY2tlZD1mYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGRpdldQQnRucy5zdHlsZS5kaXNwbGF5PVwibm9uZVwiO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIExpc3RlIGRlcyBmaWxsZXVscywgc2kgaWwgeSBlbiBhXG4gICAgICAgICAgICBjb25zdCB4aHJHZXRHb2RjaGlsZHMgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgIHhockdldEdvZGNoaWxkcy5vcGVuKFwiR0VUXCIsIGFwaVVybCtjb25maWdVc2Vycy51c2VyUm91dGVzK2NvbmZpZ1VzZXJzLmdldEdvZENoaWxkcyk7XG4gICAgICAgICAgICB4aHJHZXRHb2RjaGlsZHMub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KSwgdHh0R29kY2hpbGRzPVwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gMjAwKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYkdvZGNoaWxkcz1yZXNwb25zZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihuYkdvZGNoaWxkcz09PTApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHh0R29kY2hpbGRzPWluZm9zVXNlck5vR29kY2hpbGRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4dEdvZGNoaWxkcz1pbmZvc1VzZXJOYkdvZENoaWxkcy5yZXBsYWNlKFwiI05CXCIsIG5iR29kY2hpbGRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gcmVzcG9uc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4dEdvZGNoaWxkcys9cmVzcG9uc2VbaV0ubmFtZStcIiAoXCIrcmVzcG9uc2VbaV0uZW1haWwrXCIpIFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2R29kY2hpbGRzLCBcInBcIiwgdHh0R29kY2hpbGRzLCBcIlwiLCBbXCJpbmZvXCJdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB4aHJHZXRHb2RjaGlsZHMuc2V0UmVxdWVzdEhlYWRlcihcIkF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIrdXNlci50b2tlbik7IFxuICAgICAgICAgICAgeGhyR2V0R29kY2hpbGRzLnNlbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaChlKVxuICAgIHtcbiAgICAgICAgYWRkRWxlbWVudChkaXZDcmFzaCwgXCJwXCIsIHNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgfVxufVxuaW5pdGlhbGlzZSgpOyIsIi8vIEZPTkNUSU9OUyBVVElMRVMgQVUgU1RPQ0tBR0UgTE9DQUwgKFNFU1NJT04sIENPT0tJRVMsIElOREVYREIsIEVUQy4pXG4vLyBSZXZlbmlyIHBvdXIgZ8OpcmVyIGxlIGNhcyBvw7kgbG9jYWwuc3RvcmFnZSBuJ2VzdCBwYXMgY29ubnUgcG91ciB1dGlsaXNlciBjb29raWVcbiAgICBcbmV4cG9ydCBjb25zdCBzYXZlTG9jYWx5ID0gKG5hbWUsIGRhdGEpID0+XG57XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obmFtZSwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0TG9jYWx5ID0gKG5hbWUsIGpzb249ZmFsc2UpID0+XG57XG4gICAgaWYoanNvbilcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSkpO1xuICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKG5hbWUpO1xufVxuXG5leHBvcnQgY29uc3QgcmVtb3ZlTG9jYWx5ID0gKG5hbWUpID0+XG57XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0obmFtZSk7XG59IiwiaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIEZvbmN0aW9uIGFzc29jaWFudCBsZXMgYXR0cmlidXRzIGZvdXJuaXMgw6AgdW4gY2hhbXAgZGUgZm9ybXVsYWlyZVxuZXhwb3J0IGNvbnN0IGFkZEVsZW1lbnQgPSAoZWx0UGFyZW50LCBlbHRUeXBlLCBlbHRDb250ZW50PVwiXCIsIGVsdElkPVwiXCIsIGVsdENsYXNzPVtdLCBlbHRBdHRyaWJ1dGVzPXt9LCByZXBsYWNlPXRydWUpID0+XG57XG4gICAgaWYoaXNFbXB0eShlbHRUeXBlKSB8fCBpc0VtcHR5KGVsdFBhcmVudCkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBlbHNlXG4gICAge1xuICAgICAgICBjb25zdCBuZXdFbGVtZW50PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZWx0VHlwZSk7XG4gICAgICAgIFxuICAgICAgICBpZighaXNFbXB0eShlbHRJZCkpLy8gdGVzdGVyIHNpIGwnaWQgbidlc3QgcGFzIGTDqWrDoCB1dGlsaXPDqSBkYW5zIGxlIERPTSA/XG4gICAgICAgICAgICBuZXdFbGVtZW50LmlkPWVsdElkO1xuXG4gICAgICAgIGlmKEFycmF5LmlzQXJyYXkoZWx0Q2xhc3MpICYmIGVsdENsYXNzLmxlbmd0aCE9MClcbiAgICAgICAge1xuICAgICAgICAgICAgZm9yKGxldCBpIGluIGVsdENsYXNzKVxuICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuY2xhc3NMaXN0LmFkZChlbHRDbGFzc1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZih0eXBlb2YgZWx0QXR0cmlidXRlcyA9PT0gXCJvYmplY3RcIikgLy8gISEgdG91cyBsZXMgb2JqZXRzIG5lIHNvbnQgcGFzIG9rXG4gICAgICAgIHtcbiAgICAgICAgICAgIGZvcihsZXQgYXR0cmlidXROYW1lIGluIGVsdEF0dHJpYnV0ZXMpXG4gICAgICAgICAgICAgICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmlidXROYW1lLCBlbHRBdHRyaWJ1dGVzW2F0dHJpYnV0TmFtZV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoIWlzRW1wdHkoZWx0Q29udGVudCkpXG4gICAgICAgICAgICBuZXdFbGVtZW50LmlubmVySFRNTD1lbHRDb250ZW50LnJlcGxhY2UoL1xcbi9nLFwiPGJyPlwiKTsvLyBpbm5lckhUTUwgcGVybWV0IGQnYWpvdXRlciBkdSB0ZXh0ZSBheWFudCBsdWktbcOqbWUgZGVzIGJhbGlzZXMsIGV0Yy5cbiAgICAgICAgICAgIFxuICAgICAgICBpZihyZXBsYWNlKVxuICAgICAgICAgICAgZWx0UGFyZW50LmlubmVySFRNTD1cIlwiO1xuICAgICAgICBlbHRQYXJlbnQuYXBwZW5kQ2hpbGQobmV3RWxlbWVudCk7XG4gICAgfSAgICBcbn0iLCIvLyBDZSBzY3JpcHQgZm91cm5pdCBkZXMgZm9uY3Rpb25zIHV0aWxpc8OpZXMgc3VyIHRvdXRlcyBsZXMgcGFnZXMgZHUgc2l0ZVxuXG5leHBvcnQgY29uc3QgaGVsbG9EZXYgPSAoKSA9Plxue1xuICAgIGNvbnNvbGUubG9nKFwiKioqKiBIZWxsbyBhbWkgZMOpdmVsb3BwZXVyIDotKVxcblxcbkxlIGNvZGUgZGUgV2lraUxlcm5pIGVzdCBsaWJyZSBldCB2b3VzIHBvdXZleiBsZSB0cm91dmVyIHNpIEdpdGxhYiA6XFxuaHR0cHM6Ly9naXRsYWIuY29tL2xlZmFibGFiL3dpa2lsZXJuaVxcblxcblBvdXIgbGVzIHN1Z2dlc3Rpb25zIGQnYW3DqWxpb3JhdGlvbiBvdSBxdWVzdGlvbnMgOiBkZXZAd2lsaWxlcm5pLmNvbSAqKioqXCIpO1xuICAgIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgY29uc3QgdXBkYXRlQWNjb3VudExpbmsgPSAoc3RhdHVzLCBjb25maWdUZW1wbGF0ZSkgPT5cbntcbiAgICBjb25zdCBsaW5rPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYWNjb3VudEhlYWRMaW5rXCIpO1xuICAgIGNvbnN0IGhvbWVQYWdlPXN0YXR1cytcIkhvbWVQYWdlXCI7XG4gICAgbGluay5ocmVmPVwiL1wiK2NvbmZpZ1RlbXBsYXRlW2hvbWVQYWdlXTtcbn0iLCJpbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gRm9uY3Rpb24gYXNzb2NpYW50IGxlcyBhdHRyaWJ1dHMgZm91cm5pcyDDoCB1biBjaGFtcCBkZSBmb3JtdWxhaXJlXG5leHBvcnQgY29uc3Qgc2V0QXR0cmlidXRlc1RvSW5wdXRzID0gKGlucHV0c0NvbmYsIG15Rm9ybSkgPT5cbntcbiAgICBmb3IobGV0IGkgaW4gbXlGb3JtLmVsZW1lbnRzKVxuICAgIHtcbiAgICAgICAgaWYoIWlzRW1wdHkobXlGb3JtLmVsZW1lbnRzW2ldLmlkKSlcbiAgICAgICAge1xuICAgICAgICAgICAgbGV0IGlkSW5wdXQ9bXlGb3JtLmVsZW1lbnRzW2ldLmlkO1xuICAgICAgICAgICAgaWYoaW5wdXRzQ29uZltpZElucHV0XSE9PXVuZGVmaW5lZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5wdXRIVE1MPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkSW5wdXQpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGF0dHJpYnV0ZSBpbiBpbnB1dHNDb25mW2lkSW5wdXRdKVxuICAgICAgICAgICAgICAgICAgICBpbnB1dEhUTUwuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgaW5wdXRzQ29uZltpZElucHV0XVthdHRyaWJ1dGVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gUsOpY3Vww6hyZSB0b3V0ZXMgbGVzIHZhbGV1cnMgZGUgY2hhbXBzIGVuIG9tZXR0YW50IGxlcyBjaGVja2JveCBub24gY29jaMOpZXMsIGV0Yy5cbmV4cG9ydCBjb25zdCBnZXREYXRhc0Zyb21JbnB1dHMgPSAobXlGb3JtKSA9Plxue1xuICAgIGNvbnN0IGRhdGFzPXt9O1xuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKG15Rm9ybSk7XG4gICAgZm9yKGxldCBlbnRyaWUgb2YgZm9ybURhdGEuZW50cmllcygpKVxuICAgICAgIGRhdGFzW2VudHJpZVswXV09ZW50cmllWzFdO1xuICAgIHJldHVybiBkYXRhcztcbn1cblxuLy8gVmlkZSB0b3VzIGxlcyBjaGFtcHMgZCd1biBmb3JtdWxhaXJlLCB5IGNvbXByaXMgaGlkZGVuLCBjaGVja2JveCwgZXRjLlxuLy8gUmV2b2lyIHBvdXIgbGVzIHNlbGVjdFxuZXhwb3J0IGNvbnN0IGVtcHlGb3JtID0gKG15Rm9ybSkgPT5cbntcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShteUZvcm0pO1xuICAgIGZvcihsZXQgZW50cmllIG9mIGZvcm1EYXRhLmVudHJpZXMoKSlcbiAgICB7XG4gICAgICAgIGlmKG15Rm9ybS5lbGVtZW50c1tlbnRyaWVbMF1dLnR5cGU9PVwiY2hlY2tib3hcIiB8fCBteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS50eXBlPT1cInJhZGlvXCIpXG4gICAgICAgICAgICBteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS5jaGVja2VkPWZhbHNlO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS52YWx1ZT1cIlwiO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8vIFZpZGUgZXQgY2FjaGUgbGUgZm9ybXVsYWlyZVxuZXhwb3J0IGNvbnN0IGVtcHlBbmRIaWRlRm9ybSA9IChteUZvcm0pID0+XG57XG4gICAgZW1weUZvcm0obXlGb3JtKTtcbiAgICBteUZvcm0uc3R5bGUuZGlzcGxheT1cIm5vbmVcIjtcbn0iLCJpbXBvcnQgeyBhcGlVcmwsIGF2YWlsYWJsZUxhbmdzLCBzaXRlVXJsLCB0aGVtZSB9IGZyb20gXCIuLi8uLi8uLi9jb25maWcvaW5zdGFuY2UuanNcIjtcbmNvbnN0IGxhbmc9YXZhaWxhYmxlTGFuZ3NbMF07XG5cbmNvbnN0IGNvbmZpZ1RlbXBsYXRlID0gcmVxdWlyZShcIi4uLy4uLy4uL3ZpZXdzL1wiK3RoZW1lK1wiL2NvbmZpZy9cIitsYW5nK1wiLmpzXCIpO1xuXG5pbXBvcnQgeyAgY2hlY2tMb2dpblJvdXRlLCB0aW1lRGlmZmVyZW5jZU1heCwgdGltZURpZmZlcmVuY2VNaW4sIHVzZXJSb3V0ZXMgfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnL3VzZXJzLmpzXCI7XG5cbmltcG9ydCB7IGdldExvY2FseSwgcmVtb3ZlTG9jYWx5LCBzYXZlTG9jYWx5IH0gZnJvbSBcIi4vY2xpZW50c3RvcmFnZS5qc1wiO1xuaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbmV4cG9ydCBjb25zdCBnZXRUaW1lRGlmZmVyZW5jZSA9ICgpID0+XG57XG4gICAgLy8gbXVsdGlwbGllciBwYXIgLTEsIGNhciBjJ2VzdCBjZSBxdSdpbCBmYXV0IFwiYWpvdXRlclwiIMOgIGwnaGV1cmUgVVRDIHBvdXIgcmV2ZW5pciBlbiBoZXVyZSBsb2NhbGUgcXVpIG0naW50w6lyZXNzZSBldCBub24gbCdpbnZlcnNlXG4gICAgY29uc3QgdGltZUxvY2FsPW5ldyBEYXRlKCkuZ2V0VGltZXpvbmVPZmZzZXQoKSotMTtcbiAgICBpZih0aW1lTG9jYWwgPiB0aW1lRGlmZmVyZW5jZU1heCB8fCB0aW1lTG9jYWwgPCB0aW1lRGlmZmVyZW5jZU1pbilcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gdGltZUxvY2FsO1xufVxuXG4vLyBPbiBlbmzDqHZlIHZvbG9udGFpcmVtZW50IGxlcyAwL08gcG91ciDDqXZpdGVyIGxlcyBjb25mdXNpb25zICFcbi8vIEV0IG1pZXV4IHZhdXQgYXVzc2kgZMOpYnV0ZXIgZXQgZmluaXIgcGFyIHVuZSBsZXR0cmUgc2ltcGxlLlxuZXhwb3J0IGNvbnN0IGdldFBhc3N3b3JkID0gKG5iQ2FyTWluLCBuYkNhck1heCkgPT5cbntcbiAgICBjb25zdCBuYkNhcj1uYkNhck1pbitNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqKG5iQ2FyTWF4LW5iQ2FyTWluKSk7XG4gICAgY29uc3QgbGV0dGVycz1cIkFCQ0RFRkdISUpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbnBxcnN0dXZ3eHl6XCI7XG4gICAgY29uc3Qgb3RoZXJzPVwiMTIzNDU2Nzg5IT8uKi1fJUAmw4nDgMOIw5nigqwkw4LDisObw45cIjtcbiAgICBsZXQgcGFzc3dvcmQ9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICBmb3IobGV0IGk9MTtpPChuYkNhci0xKTtpKyspXG4gICAge1xuICAgICAgICBpZigoaSAlIDIpID09PTEpXG4gICAgICAgICAgICBwYXNzd29yZCs9b3RoZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpvdGhlcnMubGVuZ3RoKV07XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHBhc3N3b3JkKz1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldOyAgIFxuICAgIH1cbiAgICBwYXNzd29yZCs9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICByZXR1cm4gcGFzc3dvcmQ7XG59XG5cbi8vIEondXRpbGlzZSBsZSBzdG9ja2FnZSBsb2NhbCBkdSBuYXZpZ2F0ZXVyIHBvdXIgZW5yZWdpc3RyZXIgbGVzIGRvbm7DqWVzIHBlcm1ldHRhbnQgZGUgcmVjb25uYcOudHJlIGwndXRpbGlzYXRldXIgcGFyIGxhIHN1aXRlXG4vLyBTZXVsIGxlIHNlcnZldXIgcG91cnJhIHbDqXJpZmllciBxdWUgbGVzIGlkZW50aWZpYW50cyBzb250ICh0b3Vqb3VycykgdmFsaWRlcy5cbmV4cG9ydCBjb25zdCBzZXRTZXNzaW9uID0gKHVzZXJJZCwgdG9rZW4sIGR1cmF0aW9uVFMpID0+XG57XG4gICAgY29uc3Qgc3RvcmFnZVVzZXI9XG4gICAge1xuICAgICAgICBpZDogdXNlcklkLFxuICAgICAgICB0b2tlbjogdG9rZW4sXG4gICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvblRTXG4gICAgfVxuICAgIHNhdmVMb2NhbHkoXCJ1c2VyXCIsIHN0b3JhZ2VVc2VyKTtcbn1cblxuLy8gVsOpcmlmaWUgcXUnaWwgeSBhIGRlcyBkb25uw6llcyBsb2NhbGVzIGNvbmNlcm5hbnQgbGUgcsOpc3VsdGF0IGQndW4gcXVpelxuLy8gRXQgbGVzIGFqb3V0ZSBhdXggZG9ubsOpZXMgZW52b3nDqWVzIHBhciBsZXMgZm9ybXVsYWlyZXMgZCdpbnNjcmlwdGlvbi9jb25uZXhpb24gc2kgYydlc3QgbGUgY2FzXG5leHBvcnQgY29uc3QgY2hlY2tBbnN3ZXJEYXRhcyA9IChkYXRhcykgPT5cbntcbiAgICBjb25zdCBsYXN0QW5zd2VyPWdldExvY2FseShcImxhc3RBbnN3ZXJcIik7XG4gICAgaWYoIWlzRW1wdHkobGFzdEFuc3dlcikpXG4gICAge1xuICAgICAgICBjb25zdCBhbnN3ZXI9SlNPTi5wYXJzZShsYXN0QW5zd2VyKTtcbiAgICAgICAgaWYoIWlzRW1wdHkoYW5zd2VyLmR1cmF0aW9uKSAmJiAhaXNFbXB0eShhbnN3ZXIubmJDb3JyZWN0QW5zd2VycykgJiYgIWlzRW1wdHkoYW5zd2VyLlF1ZXN0aW9ubmFpcmVJZCkgJiYgIWlzRW1wdHkoYW5zd2VyLm5iUXVlc3Rpb25zKSlcbiAgICAgICAge1xuICAgICAgICAgICAgZGF0YXMuZHVyYXRpb249YW5zd2VyLmR1cmF0aW9uO1xuICAgICAgICAgICAgZGF0YXMubmJDb3JyZWN0QW5zd2Vycz1hbnN3ZXIubmJDb3JyZWN0QW5zd2VycztcbiAgICAgICAgICAgIGRhdGFzLlF1ZXN0aW9ubmFpcmVJZD1hbnN3ZXIuUXVlc3Rpb25uYWlyZUlkO1xuICAgICAgICAgICAgZGF0YXMubmJRdWVzdGlvbnM9YW5zd2VyLm5iUXVlc3Rpb25zO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhcztcbn1cblxuLy8gQ2V0dGUgZm9uY3Rpb24gdGVzdGUgbGEgY29ubmV4aW9uIGRlIGwndXRpbGlzYXRldXIgZCd1bmUgcGFnZVxuLy8gT24gcGV1dCBmb3VybmlzIHVuZSBsaXN0ZSBkZSBzdGF0dXRzIGFjY2VwdMOpcyAoc2kgdmlkZSA9IHRvdXMpLCBhaW5zaSBxdSd1bmUgdXJsIGRlIHJlZGlyZWN0aW9uIHNpIG5vbiBjb25uZWN0w6ksIHVuIG1lc3NhZ2UgZCdlcnJldXIgw6AgYWZmaWNoZXIgc3VyIGxhIHBhZ2UgZGUgZGVzdGluYXRpb24gZXQgbCd1cmwgc3VyIGxhcXVlbGxlIHJldmVuaXIgdW5lIGZvaXMgY29ubmVjdMOpXG5leHBvcnQgY29uc3QgY2hlY2tTZXNzaW9uID0gYXN5bmMgKHN0YXR1cz1bXSwgdXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCkgPT5cbntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IHVzZXJEYXRhcz1nZXRMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICBpZihpc0VtcHR5KHVzZXJEYXRhcykpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgdXNlcj1KU09OLnBhcnNlKHVzZXJEYXRhcyk7XG4gICAgICAgICAgICBpZihpc0VtcHR5KHVzZXIuaWQpIHx8wqBpc0VtcHR5KHVzZXIudG9rZW4pIHx8IGlzRW1wdHkodXNlci5kdXJhdGlvbikgfHwgdXNlci5kdXJhdGlvbiA8IERhdGUubm93KCkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgYXBpVXJsK3VzZXJSb3V0ZXMrY2hlY2tMb2dpblJvdXRlK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDAgJiYgcmVzcG9uc2UuaXNWYWxpZCAmJiByZXNwb25zZS5pZCAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLmlkPT09dXNlci5pZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLm5hbWU9cmVzcG9uc2UubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLmxhbmd1YWdlPXJlc3BvbnNlLmxhbmd1YWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIudGltZURpZmZlcmVuY2U9cmVzcG9uc2UudGltZURpZmZlcmVuY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5zdGF0dXM9cmVzcG9uc2Uuc3RhdHVzOy8vIGMnZXN0IGxlIHRva2VuIHF1aSBzZXJ0IMOgIHbDqXJpZmllciBsZSBzdGF0dXQgw6AgY2hhcXVlIHJlcXXDqnRlIMOgIGwnQVBJXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUxvY2FseShcInVzZXJcIiwgdXNlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2kgaWwgcydhZ2l0IGQndW4gXCJ1c2VyXCIgZXQgcXVlIHNvbiBhYm9ubmVtZW50IGEgZXhwaXLDqSwgamUgbGUgcmVkaXJpZ2UgdmVycyBsYSBjYWlzc2UgOi0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2Uuc3RhdHVzPT09XCJ1c2VyXCIgJiYgcmVzcG9uc2UubmJEYXlzT2sgPD0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybEFjY291bnQ9c2l0ZVVybCtcIi9cIitjb25maWdUZW1wbGF0ZS5hY2NvdW50UGFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZih1cmxBY2NvdW50KT09PS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIi9cIitjb25maWdUZW1wbGF0ZS5hY2NvdW50UGFnZStcIiNzdWJzY3JpYmVcIik7Ly8gcGFzc8OpZSBkaXJlY3RlbWVudCBpY2ksIGwnYW5jcmUgI3N1YnNjcmliZSBuZSBmb25jdGlvbm5lIHBhcyAhP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzdGF0dXMubGVuZ3RoIT09MCAmJiBzdGF0dXMuaW5kZXhPZihyZXNwb25zZS5zdGF0dXMpPT09LTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHhoci5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICAgICAgICAgICAgICB4aHIuc2VuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4vLyBDZXR0ZSBmb25jdGlvbiBzZXJ0IMOgIGxhIHByw6ljw6lkZW50ZSBlbiBjYXMgZGUgY29ubmV4aW9uIG5vbiB2YWxpZGVcbmNvbnN0IHJlZGlyZWN0VXNlciA9ICh1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKSA9Plxue1xuICAgIGlmKCFpc0VtcHR5KG1lc3NhZ2UpKVxuICAgICAgICBzYXZlTG9jYWx5KFwibWVzc2FnZVwiLCBtZXNzYWdlKTtcbiAgICBpZighaXNFbXB0eSh1cmxXYW50ZWQpKVxuICAgICAgICBzYXZlTG9jYWx5KFwidXJsXCIsIHVybFdhbnRlZCk7XG4gICAgaWYoIWlzRW1wdHkodXJsUmVkaXJlY3Rpb24pKVxuICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKHVybFJlZGlyZWN0aW9uKTtcbn0iLCJjb25zdCBjaGVja0JveGVzPVxue1xuICAgIFwiQ0dWXCIgOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIkNHVk9rXCIpLFxuICAgIFwiYWJvOVwiIDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJhYm85XCIpLFxuICAgIFwiYWJvMThcIiA6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYWJvMThcIiksXG4gICAgXCJhYm8zNlwiIDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJhYm8zNlwiKSxcbiAgICBcImFibzU0XCIgOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFibzU0XCIpXG59XG5jb25zdCBkaXZXUEJ0bnM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJXUEJ0bnNcIik7XG5cbi8vIExvcnNxdWUgbCdvbiBzw6lsZWN0aW9ubmUgdW4gbW9udGFudCwgbGVzIGF1dHJlcyBvcHRpb25zICsgbGVzIENHViBzb250IGTDqXPDqWxlY3Rpb25uw6lzXG5leHBvcnQgY29uc3QgdW5DaGVja0FsbE90aGVycyA9IChjaG9pY2UpID0+XG57XG4gICAgZm9yIChsZXQgaWQgaW4gY2hlY2tCb3hlcylcbiAgICB7XG4gICAgICAgIGlmKGlkIT09Y2hvaWNlKVxuICAgICAgICAgICAgY2hlY2tCb3hlc1tpZF0uY2hlY2tlZD1mYWxzZTtcbiAgICAgICAgZGl2V1BCdG5zLnN0eWxlLmRpc3BsYXk9XCJub25lXCI7XG4gICAgfVxufVxuXG5cbmNvbnN0IGJ0bnM9XG57XG4gICAgXCJidG45XCIgOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIldQQnRuOVwiKSxcbiAgICBcImJ0bjE4XCIgOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIldQQnRuMThcIiksXG4gICAgXCJidG4zNlwiIDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJXUEJ0bjM2XCIpLFxuICAgIFwiYnRuNTRcIiA6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiV1BCdG41NFwiKVxufVxuXG4vLyBBZmZpY2hlIGxlIGJvbiBib3V0b24gZGUgcGFpZW1lbnQgZXQgY2FjaGUgbGVzIGF1dHJlc1xuZXhwb3J0IGNvbnN0IHNob3dCdG5QYXltZW50ID0gKGNob2ljZSkgPT5cbntcbiAgICBmb3IgKGxldCBpZCBpbiBidG5zKVxuICAgIHtcbiAgICAgICAgaWYoaWQhPT1jaG9pY2UpXG4gICAgICAgICAgICBidG5zW2lkXS5zdHlsZS5kaXNwbGF5PVwibm9uZVwiO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBidG5zW2lkXS5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIjtcbiAgICB9XG59Il0sInNvdXJjZVJvb3QiOiIifQ==
|