/*! * surveyjs - Survey JavaScript library v1.8.72 * Copyright (c) 2015-2021 Devsoft Baltic OÜ - http://surveyjs.io/ * License: MIT (http://www.opensource.org/licenses/mit-license.php) */ (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(require("jquery")); else if(typeof define === 'function' && define.amd) define("survey-jquery", ["jquery"], factory); else if(typeof exports === 'object') exports["survey-jquery"] = factory(require("jquery")); else root["Survey"] = factory(root["jQuery"]); })(this, function(__WEBPACK_EXTERNAL_MODULE_jquery__) { return /******/ (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/entries/jquery.ts"); /******/ }) /************************************************************************/ /******/ ({ /***/ "./node_modules/html-loader/index.js?interpolate!./node_modules/val-loader/index.js!./src/knockout/components/panel/panel.html": /*!*******************************************************************************************************************!*\ !*** ./node_modules/html-loader?interpolate!./node_modules/val-loader!./src/knockout/components/panel/panel.html ***! \*******************************************************************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = ""; /***/ }), /***/ "./node_modules/html-loader/index.js?interpolate!./node_modules/val-loader/index.js!./src/knockout/components/popup/popup.html": /*!*******************************************************************************************************************!*\ !*** ./node_modules/html-loader?interpolate!./node_modules/val-loader!./src/knockout/components/popup/popup.html ***! \*******************************************************************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = "
\n
\n \n \n \n \n
\n \n
\n
\n
\n \n
\n \n \n
\n \n
\n
"; /***/ }), /***/ "./node_modules/html-loader/index.js?interpolate!./node_modules/val-loader/index.js!./src/knockout/components/progress/buttons.html": /*!************************************************************************************************************************!*\ !*** ./node_modules/html-loader?interpolate!./node_modules/val-loader!./src/knockout/components/progress/buttons.html ***! \************************************************************************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = "
\n
\n
\n
\n
    \n
  • \n
    \n
    \n
  • \n
\n
\n
\n
\n
"; /***/ }), /***/ "./node_modules/html-loader/index.js?interpolate!./node_modules/val-loader/index.js!./src/knockout/components/progress/progress.html": /*!*************************************************************************************************************************!*\ !*** ./node_modules/html-loader?interpolate!./node_modules/val-loader!./src/knockout/components/progress/progress.html ***! \*************************************************************************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = "
\n
\n \n
\n \n
"; /***/ }), /***/ "./node_modules/html-loader/index.js?interpolate!./node_modules/val-loader/index.js!./src/knockout/templates/entry.html": /*!************************************************************************************************************!*\ !*** ./node_modules/html-loader?interpolate!./node_modules/val-loader!./src/knockout/templates/entry.html ***! \************************************************************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { module.exports = "" + __webpack_require__(/*! ./comment.html */ "./src/knockout/templates/comment.html") + "\n" + __webpack_require__(/*! ./flowpanel.html */ "./src/knockout/templates/flowpanel.html") + "\n" + __webpack_require__(/*! ./header.html */ "./src/knockout/templates/header.html") + "\n" + __webpack_require__(/*! ./index.html */ "./src/knockout/templates/index.html") + "\n" + __webpack_require__(/*! ./page.html */ "./src/knockout/templates/page.html") + "\n" + __webpack_require__(/*! ./panel.html */ "./src/knockout/templates/panel.html") + "\n" + __webpack_require__(/*! ./rows.html */ "./src/knockout/templates/rows.html") + "\n" + __webpack_require__(/*! ./row.html */ "./src/knockout/templates/row.html") + "\n" + __webpack_require__(/*! ./string.html */ "./src/knockout/templates/string.html") + "\n" + __webpack_require__(/*! ./timerpanel.html */ "./src/knockout/templates/timerpanel.html") + "\n" + __webpack_require__(/*! ./question.html */ "./src/knockout/templates/question.html") + "\n" + __webpack_require__(/*! ./questiontitle.html */ "./src/knockout/templates/questiontitle.html") + "\n" + __webpack_require__(/*! ./question-boolean.html */ "./src/knockout/templates/question-boolean.html") + "\n" + __webpack_require__(/*! ./question-checkbox.html */ "./src/knockout/templates/question-checkbox.html") + "\n" + __webpack_require__(/*! ./question-ranking.html */ "./src/knockout/templates/question-ranking.html") + "\n" + __webpack_require__(/*! ./question-comment.html */ "./src/knockout/templates/question-comment.html") + "\n" + __webpack_require__(/*! ./question-composite.html */ "./src/knockout/templates/question-composite.html") + "\n" + __webpack_require__(/*! ./question-custom.html */ "./src/knockout/templates/question-custom.html") + "\n" + __webpack_require__(/*! ./question-dropdown.html */ "./src/knockout/templates/question-dropdown.html") + "\n" + __webpack_require__(/*! ./question-empty.html */ "./src/knockout/templates/question-empty.html") + "\n" + __webpack_require__(/*! ./question-errors.html */ "./src/knockout/templates/question-errors.html") + "\n" + __webpack_require__(/*! ./question-expression.html */ "./src/knockout/templates/question-expression.html") + "\n" + __webpack_require__(/*! ./question-file.html */ "./src/knockout/templates/question-file.html") + "\n" + __webpack_require__(/*! ./question-html.html */ "./src/knockout/templates/question-html.html") + "\n" + __webpack_require__(/*! ./question-image.html */ "./src/knockout/templates/question-image.html") + "\n" + __webpack_require__(/*! ./question-imagepicker.html */ "./src/knockout/templates/question-imagepicker.html") + "\n" + __webpack_require__(/*! ./question-matrix.html */ "./src/knockout/templates/question-matrix.html") + "\n" + __webpack_require__(/*! ./question-matrixdynamic.html */ "./src/knockout/templates/question-matrixdynamic.html") + "\n" + __webpack_require__(/*! ./question-multipletext.html */ "./src/knockout/templates/question-multipletext.html") + "\n" + __webpack_require__(/*! ./question-paneldynamic.html */ "./src/knockout/templates/question-paneldynamic.html") + "\n" + __webpack_require__(/*! ./question-paneldynamic-navigator.html */ "./src/knockout/templates/question-paneldynamic-navigator.html") + "\n" + __webpack_require__(/*! ./question-radiogroup.html */ "./src/knockout/templates/question-radiogroup.html") + "\n" + __webpack_require__(/*! ./question-rating.html */ "./src/knockout/templates/question-rating.html") + "\n" + __webpack_require__(/*! ./question-signaturepad.html */ "./src/knockout/templates/question-signaturepad.html") + "\n" + __webpack_require__(/*! ./question-text.html */ "./src/knockout/templates/question-text.html") + "\n" + __webpack_require__(/*! ./question-buttongroup.html */ "./src/knockout/templates/question-buttongroup.html") + ""; /***/ }), /***/ "./node_modules/html-loader/index.js?interpolate!./node_modules/val-loader/index.js!./src/knockout/templates/window/window.html": /*!********************************************************************************************************************!*\ !*** ./node_modules/html-loader?interpolate!./node_modules/val-loader!./src/knockout/templates/window/window.html ***! \********************************************************************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = "
\n
\n \n \n \n \n \n X\n \n
\n
\n
\n
\n
"; /***/ }), /***/ "./node_modules/knockout/build/output/knockout-latest.js": /*!***************************************************************!*\ !*** ./node_modules/knockout/build/output/knockout-latest.js ***! \***************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! * Knockout JavaScript library v3.5.1 * (c) The Knockout.js team - http://knockoutjs.com/ * License: MIT (http://www.opensource.org/licenses/mit-license.php) */ (function() {(function(n){var A=this||(0,eval)("this"),w=A.document,R=A.navigator,v=A.jQuery,H=A.JSON;v||"undefined"===typeof jQuery||(v=jQuery);(function(n){ true?!(__WEBPACK_AMD_DEFINE_ARRAY__ = [exports,__webpack_require__], __WEBPACK_AMD_DEFINE_FACTORY__ = (n), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)):undefined})(function(S,T){function K(a,c){return null===a||typeof a in W?a===c:!1}function X(b,c){var d;return function(){d||(d=a.a.setTimeout(function(){d=n;b()},c))}}function Y(b,c){var d;return function(){clearTimeout(d); d=a.a.setTimeout(b,c)}}function Z(a,c){c&&"change"!==c?"beforeChange"===c?this.pc(a):this.gb(a,c):this.qc(a)}function aa(a,c){null!==c&&c.s&&c.s()}function ba(a,c){var d=this.qd,e=d[r];e.ra||(this.Qb&&this.mb[c]?(d.uc(c,a,this.mb[c]),this.mb[c]=null,--this.Qb):e.I[c]||d.uc(c,a,e.J?{da:a}:d.$c(a)),a.Ja&&a.gd())}var a="undefined"!==typeof S?S:{};a.b=function(b,c){for(var d=b.split("."),e=a,f=0;fa.a.A(c,b)&&c.push(b)});return c},Mb:function(a, b,c){var d=[];if(a)for(var e=0,l=a.length;ee?d&&b.push(c):d||b.splice(e,1)},Ba:g,extend:c,setPrototypeOf:d,Ab:g?d:c,P:b,Ga:function(a,b,c){if(!a)return a;var d={},e;for(e in a)f.call(a,e)&&(d[e]= b.call(c,a[e],e,a));return d},Tb:function(b){for(;b.firstChild;)a.removeNode(b.firstChild)},Yb:function(b){b=a.a.la(b);for(var c=(b[0]&&b[0].ownerDocument||w).createElement("div"),d=0,e=b.length;dp?a.setAttribute("selected",b):a.selected=b},Db:function(a){return null===a||a===n?"":a.trim? a.trim():a.toString().replace(/^[\s\xa0]+|[\s\xa0]+$/g,"")},Ud:function(a,b){a=a||"";return b.length>a.length?!1:a.substring(0,b.length)===b},vd:function(a,b){if(a===b)return!0;if(11===a.nodeType)return!1;if(b.contains)return b.contains(1!==a.nodeType?a.parentNode:a);if(b.compareDocumentPosition)return 16==(b.compareDocumentPosition(a)&16);for(;a&&a!=b;)a=a.parentNode;return!!a},Sb:function(b){return a.a.vd(b,b.ownerDocument.documentElement)},kd:function(b){return!!a.a.Lb(b,a.a.Sb)},R:function(a){return a&& a.tagName&&a.tagName.toLowerCase()},Ac:function(b){return a.onError?function(){try{return b.apply(this,arguments)}catch(c){throw a.onError&&a.onError(c),c;}}:b},setTimeout:function(b,c){return setTimeout(a.a.Ac(b),c)},Gc:function(b){setTimeout(function(){a.onError&&a.onError(b);throw b;},0)},B:function(b,c,d){var e=a.a.Ac(d);d=l[c];if(a.options.useOnlyNativeEvents||d||!v)if(d||"function"!=typeof b.addEventListener)if("undefined"!=typeof b.attachEvent){var k=function(a){e.call(b,a)},f="on"+c;b.attachEvent(f, k);a.a.K.za(b,function(){b.detachEvent(f,k)})}else throw Error("Browser doesn't support addEventListener or attachEvent");else b.addEventListener(c,e,!1);else t||(t="function"==typeof v(b).on?"on":"bind"),v(b)[t](c,e)},Fb:function(b,c){if(!b||!b.nodeType)throw Error("element must be a DOM node when calling triggerEvent");var d;"input"===a.a.R(b)&&b.type&&"click"==c.toLowerCase()?(d=b.type,d="checkbox"==d||"radio"==d):d=!1;if(a.options.useOnlyNativeEvents||!v||d)if("function"==typeof w.createEvent)if("function"== typeof b.dispatchEvent)d=w.createEvent(k[c]||"HTMLEvents"),d.initEvent(c,!0,!0,A,0,0,0,0,0,!1,!1,!1,!1,0,b),b.dispatchEvent(d);else throw Error("The supplied element doesn't support dispatchEvent");else if(d&&b.click)b.click();else if("undefined"!=typeof b.fireEvent)b.fireEvent("on"+c);else throw Error("Browser doesn't support triggering events");else v(b).trigger(c)},f:function(b){return a.O(b)?b():b},bc:function(b){return a.O(b)?b.v():b},Eb:function(b,c,d){var l;c&&("object"===typeof b.classList? (l=b.classList[d?"add":"remove"],a.a.D(c.match(q),function(a){l.call(b.classList,a)})):"string"===typeof b.className.baseVal?e(b.className,"baseVal",c,d):e(b,"className",c,d))},Bb:function(b,c){var d=a.a.f(c);if(null===d||d===n)d="";var e=a.h.firstChild(b);!e||3!=e.nodeType||a.h.nextSibling(e)?a.h.va(b,[b.ownerDocument.createTextNode(d)]):e.data=d;a.a.Ad(b)},Yc:function(a,b){a.name=b;if(7>=p)try{var c=a.name.replace(/[&<>'"]/g,function(a){return"&#"+a.charCodeAt(0)+";"});a.mergeAttributes(w.createElement(""),!1)}catch(d){}},Ad:function(a){9<=p&&(a=1==a.nodeType?a:a.parentNode,a.style&&(a.style.zoom=a.style.zoom))},wd:function(a){if(p){var b=a.style.width;a.style.width=0;a.style.width=b}},Pd:function(b,c){b=a.a.f(b);c=a.a.f(c);for(var d=[],e=b;e<=c;e++)d.push(e);return d},la:function(a){for(var b=[],c=0,d=a.length;c",""],d=[3,"","
"],e=[1,""],f={thead:c,tbody:c,tfoot:c,tr:[2,"","
"],td:d,th:d,option:e,optgroup:e},g=8>=a.a.W;a.a.ua=function(c,d){var e;if(v)if(v.parseHTML)e=v.parseHTML(c,d)||[];else{if((e=v.clean([c],d))&&e[0]){for(var l=e[0];l.parentNode&&11!==l.parentNode.nodeType;)l=l.parentNode; l.parentNode&&l.parentNode.removeChild(l)}}else{(e=d)||(e=w);var l=e.parentWindow||e.defaultView||A,p=a.a.Db(c).toLowerCase(),q=e.createElement("div"),t;t=(p=p.match(/^(?:\x3c!--.*?--\x3e\s*?)*?<([a-z]+)[\s>]/))&&f[p[1]]||b;p=t[0];t="ignored
"+t[1]+c+t[2]+"
";"function"==typeof l.innerShiv?q.appendChild(l.innerShiv(t)):(g&&e.body.appendChild(q),q.innerHTML=t,g&&q.parentNode.removeChild(q));for(;p--;)q=q.lastChild;e=a.a.la(q.lastChild.childNodes)}return e};a.a.Md=function(b,c){var d=a.a.ua(b, c);return d.length&&d[0].parentElement||a.a.Yb(d)};a.a.fc=function(b,c){a.a.Tb(b);c=a.a.f(c);if(null!==c&&c!==n)if("string"!=typeof c&&(c=c.toString()),v)v(b).html(c);else for(var d=a.a.ua(c,b.ownerDocument),e=0;eb){if(5E3<= ++c){h=f;a.a.Gc(Error("'Too much recursion' after processing "+c+" task groups."));break}b=f}try{d()}catch(p){a.a.Gc(p)}}}function c(){b();h=f=e.length=0}var d,e=[],f=0,g=1,h=0;A.MutationObserver?d=function(a){var b=w.createElement("div");(new MutationObserver(a)).observe(b,{attributes:!0});return function(){b.classList.toggle("foo")}}(c):d=w&&"onreadystatechange"in w.createElement("script")?function(a){var b=w.createElement("script");b.onreadystatechange=function(){b.onreadystatechange=null;w.documentElement.removeChild(b); b=null;a()};w.documentElement.appendChild(b)}:function(a){setTimeout(a,0)};return{scheduler:d,zb:function(b){f||a.na.scheduler(c);e[f++]=b;return g++},cancel:function(a){a=a-(g-f);a>=h&&ad[0]?p+d[0]: d[0]),p);for(var p=1===g?p:Math.min(c+(d[1]||0),p),g=c+g-2,h=Math.max(p,g),U=[],L=[],n=2;cc;c++)b=b();return b})};a.toJSON=function(b,c,d){b=a.ad(b);return a.a.hc(b,c,d)};d.prototype={constructor:d,save:function(b,c){var d=a.a.A(this.keys, b);0<=d?this.values[d]=c:(this.keys.push(b),this.values.push(c))},get:function(b){b=a.a.A(this.keys,b);return 0<=b?this.values[b]:n}}})();a.b("toJS",a.ad);a.b("toJSON",a.toJSON);a.Wd=function(b,c,d){function e(c){var e=a.xb(b,d).extend({ma:"always"}),h=e.subscribe(function(a){a&&(h.s(),c(a))});e.notifySubscribers(e.v());return h}return"function"!==typeof Promise||c?e(c.bind(d)):new Promise(e)};a.b("when",a.Wd);(function(){a.w={M:function(b){switch(a.a.R(b)){case "option":return!0===b.__ko__hasDomDataOptionValue__? a.a.g.get(b,a.c.options.$b):7>=a.a.W?b.getAttributeNode("value")&&b.getAttributeNode("value").specified?b.value:b.text:b.value;case "select":return 0<=b.selectedIndex?a.w.M(b.options[b.selectedIndex]):n;default:return b.value}},cb:function(b,c,d){switch(a.a.R(b)){case "option":"string"===typeof c?(a.a.g.set(b,a.c.options.$b,n),"__ko__hasDomDataOptionValue__"in b&&delete b.__ko__hasDomDataOptionValue__,b.value=c):(a.a.g.set(b,a.c.options.$b,c),b.__ko__hasDomDataOptionValue__=!0,b.value="number"=== typeof c?c:"");break;case "select":if(""===c||null===c)c=n;for(var e=-1,f=0,g=b.options.length,h;f=h){c.push(p&&q.length?{key:p,value:q.join("")}:{unknown:p||q.join("")});p=h=0;q=[];continue}}else if(58===u){if(!h&&!p&&1===q.length){p=q.pop();continue}}else if(47===u&&1arguments.length){if(b=w.body,!b)throw Error("ko.applyBindings: could not find document.body; has the document been loaded?"); }else if(!b||1!==b.nodeType&&8!==b.nodeType)throw Error("ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node");k(q(a,c),b)};a.Dc=function(b){return!b||1!==b.nodeType&&8!==b.nodeType?n:a.Td(b)};a.Ec=function(b){return(b=a.Dc(b))?b.$data:n};a.b("bindingHandlers",a.c);a.b("bindingEvent",a.i);a.b("bindingEvent.subscribe",a.i.subscribe);a.b("bindingEvent.startPossiblyAsyncContentBinding",a.i.Cb);a.b("applyBindings",a.vc);a.b("applyBindingsToDescendants",a.Oa); a.b("applyBindingAccessorsToNode",a.ib);a.b("applyBindingsToNode",a.ld);a.b("contextFor",a.Dc);a.b("dataFor",a.Ec)})();(function(b){function c(c,e){var k=Object.prototype.hasOwnProperty.call(f,c)?f[c]:b,l;k?k.subscribe(e):(k=f[c]=new a.T,k.subscribe(e),d(c,function(b,d){var e=!(!d||!d.synchronous);g[c]={definition:b,Gd:e};delete f[c];l||e?k.notifySubscribers(b):a.na.zb(function(){k.notifySubscribers(b)})}),l=!0)}function d(a,b){e("getConfig",[a],function(c){c?e("loadComponent",[a,c],function(a){b(a, c)}):b(null,null)})}function e(c,d,f,l){l||(l=a.j.loaders.slice(0));var g=l.shift();if(g){var q=g[c];if(q){var t=!1;if(q.apply(g,d.concat(function(a){t?f(null):null!==a?f(a):e(c,d,f,l)}))!==b&&(t=!0,!g.suppressLoaderExceptions))throw Error("Component loaders must supply values by invoking the callback, not by returning values synchronously.");}else e(c,d,f,l)}else f(null)}var f={},g={};a.j={get:function(d,e){var f=Object.prototype.hasOwnProperty.call(g,d)?g[d]:b;f?f.Gd?a.u.G(function(){e(f.definition)}): a.na.zb(function(){e(f.definition)}):c(d,e)},Bc:function(a){delete g[a]},oc:e};a.j.loaders=[];a.b("components",a.j);a.b("components.get",a.j.get);a.b("components.clearCachedDefinition",a.j.Bc)})();(function(){function b(b,c,d,e){function g(){0===--B&&e(h)}var h={},B=2,u=d.template;d=d.viewModel;u?f(c,u,function(c){a.j.oc("loadTemplate",[b,c],function(a){h.template=a;g()})}):g();d?f(c,d,function(c){a.j.oc("loadViewModel",[b,c],function(a){h[m]=a;g()})}):g()}function c(a,b,d){if("function"===typeof b)d(function(a){return new b(a)}); else if("function"===typeof b[m])d(b[m]);else if("instance"in b){var e=b.instance;d(function(){return e})}else"viewModel"in b?c(a,b.viewModel,d):a("Unknown viewModel value: "+b)}function d(b){switch(a.a.R(b)){case "script":return a.a.ua(b.text);case "textarea":return a.a.ua(b.value);case "template":if(e(b.content))return a.a.Ca(b.content.childNodes)}return a.a.Ca(b.childNodes)}function e(a){return A.DocumentFragment?a instanceof DocumentFragment:a&&11===a.nodeType}function f(a,b,c){"string"===typeof b.require? T||A.require?(T||A.require)([b.require],function(a){a&&"object"===typeof a&&a.Xd&&a["default"]&&(a=a["default"]);c(a)}):a("Uses require, but no AMD loader is present"):c(b)}function g(a){return function(b){throw Error("Component '"+a+"': "+b);}}var h={};a.j.register=function(b,c){if(!c)throw Error("Invalid configuration for "+b);if(a.j.tb(b))throw Error("Component "+b+" is already registered");h[b]=c};a.j.tb=function(a){return Object.prototype.hasOwnProperty.call(h,a)};a.j.unregister=function(b){delete h[b]; a.j.Bc(b)};a.j.Fc={getConfig:function(b,c){c(a.j.tb(b)?h[b]:null)},loadComponent:function(a,c,d){var e=g(a);f(e,c,function(c){b(a,e,c,d)})},loadTemplate:function(b,c,f){b=g(b);if("string"===typeof c)f(a.a.ua(c));else if(c instanceof Array)f(c);else if(e(c))f(a.a.la(c.childNodes));else if(c.element)if(c=c.element,A.HTMLElement?c instanceof HTMLElement:c&&c.tagName&&1===c.nodeType)f(d(c));else if("string"===typeof c){var h=w.getElementById(c);h?f(d(h)):b("Cannot find element with ID "+c)}else b("Unknown element type: "+ c);else b("Unknown template value: "+c)},loadViewModel:function(a,b,d){c(g(a),b,d)}};var m="createViewModel";a.b("components.register",a.j.register);a.b("components.isRegistered",a.j.tb);a.b("components.unregister",a.j.unregister);a.b("components.defaultLoader",a.j.Fc);a.j.loaders.push(a.j.Fc);a.j.dd=h})();(function(){function b(b,e){var f=b.getAttribute("params");if(f){var f=c.parseBindingsString(f,e,b,{valueAccessors:!0,bindingParams:!0}),f=a.a.Ga(f,function(c){return a.o(c,null,{l:b})}),g=a.a.Ga(f, function(c){var e=c.v();return c.ja()?a.o({read:function(){return a.a.f(c())},write:a.Za(e)&&function(a){c()(a)},l:b}):e});Object.prototype.hasOwnProperty.call(g,"$raw")||(g.$raw=f);return g}return{$raw:{}}}a.j.getComponentNameForNode=function(b){var c=a.a.R(b);if(a.j.tb(c)&&(-1!=c.indexOf("-")||"[object HTMLUnknownElement]"==""+b||8>=a.a.W&&b.tagName===c))return c};a.j.tc=function(c,e,f,g){if(1===e.nodeType){var h=a.j.getComponentNameForNode(e);if(h){c=c||{};if(c.component)throw Error('Cannot use the "component" binding on a custom element matching a component'); var m={name:h,params:b(e,f)};c.component=g?function(){return m}:m}}return c};var c=new a.ga;9>a.a.W&&(a.j.register=function(a){return function(b){return a.apply(this,arguments)}}(a.j.register),w.createDocumentFragment=function(b){return function(){var c=b(),f=a.j.dd,g;for(g in f);return c}}(w.createDocumentFragment))})();(function(){function b(b,c,d){c=c.template;if(!c)throw Error("Component '"+b+"' has no template");b=a.a.Ca(c);a.h.va(d,b)}function c(a,b,c){var d=a.createViewModel;return d?d.call(a, b,c):b}var d=0;a.c.component={init:function(e,f,g,h,m){function k(){var a=l&&l.dispose;"function"===typeof a&&a.call(l);q&&q.s();p=l=q=null}var l,p,q,t=a.a.la(a.h.childNodes(e));a.h.Ea(e);a.a.K.za(e,k);a.o(function(){var g=a.a.f(f()),h,u;"string"===typeof g?h=g:(h=a.a.f(g.name),u=a.a.f(g.params));if(!h)throw Error("No component name specified");var n=a.i.Cb(e,m),z=p=++d;a.j.get(h,function(d){if(p===z){k();if(!d)throw Error("Unknown component '"+h+"'");b(h,d,e);var f=c(d,u,{element:e,templateNodes:t}); d=n.createChildContext(f,{extend:function(a){a.$component=f;a.$componentTemplateNodes=t}});f&&f.koDescendantsComplete&&(q=a.i.subscribe(e,a.i.pa,f.koDescendantsComplete,f));l=f;a.Oa(d,e)}})},null,{l:e});return{controlsDescendantBindings:!0}}};a.h.ea.component=!0})();var V={"class":"className","for":"htmlFor"};a.c.attr={update:function(b,c){var d=a.a.f(c())||{};a.a.P(d,function(c,d){d=a.a.f(d);var g=c.indexOf(":"),g="lookupNamespaceURI"in b&&0=a.a.W&&c in V?(c=V[c],h?b.removeAttribute(c):b[c]=d):h||(g?b.setAttributeNS(g,c,d):b.setAttribute(c,d));"name"===c&&a.a.Yc(b,h?"":d)})}};(function(){a.c.checked={after:["value","attr"],init:function(b,c,d){function e(){var e=b.checked,f=g();if(!a.S.Ya()&&(e||!m&&!a.S.qa())){var k=a.u.G(c);if(l){var q=p?k.v():k,z=t;t=f;z!==f?e&&(a.a.Na(q,f,!0),a.a.Na(q,z,!1)):a.a.Na(q,f,e);p&&a.Za(k)&&k(q)}else h&&(f===n?f=e:e||(f=n)),a.m.eb(k, d,"checked",f,!0)}}function f(){var d=a.a.f(c()),e=g();l?(b.checked=0<=a.a.A(d,e),t=e):b.checked=h&&e===n?!!d:g()===d}var g=a.xb(function(){if(d.has("checkedValue"))return a.a.f(d.get("checkedValue"));if(q)return d.has("value")?a.a.f(d.get("value")):b.value}),h="checkbox"==b.type,m="radio"==b.type;if(h||m){var k=c(),l=h&&a.a.f(k)instanceof Array,p=!(l&&k.push&&k.splice),q=m||l,t=l?g():n;m&&!b.name&&a.c.uniqueName.init(b,function(){return!0});a.o(e,null,{l:b});a.a.B(b,"click",e);a.o(f,null,{l:b}); k=n}}};a.m.wa.checked=!0;a.c.checkedValue={update:function(b,c){b.value=a.a.f(c())}}})();a.c["class"]={update:function(b,c){var d=a.a.Db(a.a.f(c()));a.a.Eb(b,b.__ko__cssValue,!1);b.__ko__cssValue=d;a.a.Eb(b,d,!0)}};a.c.css={update:function(b,c){var d=a.a.f(c());null!==d&&"object"==typeof d?a.a.P(d,function(c,d){d=a.a.f(d);a.a.Eb(b,c,d)}):a.c["class"].update(b,c)}};a.c.enable={update:function(b,c){var d=a.a.f(c());d&&b.disabled?b.removeAttribute("disabled"):d||b.disabled||(b.disabled=!0)}};a.c.disable= {update:function(b,c){a.c.enable.update(b,function(){return!a.a.f(c())})}};a.c.event={init:function(b,c,d,e,f){var g=c()||{};a.a.P(g,function(g){"string"==typeof g&&a.a.B(b,g,function(b){var k,l=c()[g];if(l){try{var p=a.a.la(arguments);e=f.$data;p.unshift(e);k=l.apply(e,p)}finally{!0!==k&&(b.preventDefault?b.preventDefault():b.returnValue=!1)}!1===d.get(g+"Bubble")&&(b.cancelBubble=!0,b.stopPropagation&&b.stopPropagation())}})})}};a.c.foreach={Rc:function(b){return function(){var c=b(),d=a.a.bc(c); if(!d||"number"==typeof d.length)return{foreach:c,templateEngine:a.ba.Ma};a.a.f(c);return{foreach:d.data,as:d.as,noChildContext:d.noChildContext,includeDestroyed:d.includeDestroyed,afterAdd:d.afterAdd,beforeRemove:d.beforeRemove,afterRender:d.afterRender,beforeMove:d.beforeMove,afterMove:d.afterMove,templateEngine:a.ba.Ma}}},init:function(b,c){return a.c.template.init(b,a.c.foreach.Rc(c))},update:function(b,c,d,e,f){return a.c.template.update(b,a.c.foreach.Rc(c),d,e,f)}};a.m.Ra.foreach=!1;a.h.ea.foreach= !0;a.c.hasfocus={init:function(b,c,d){function e(e){b.__ko_hasfocusUpdating=!0;var f=b.ownerDocument;if("activeElement"in f){var g;try{g=f.activeElement}catch(l){g=f.body}e=g===b}f=c();a.m.eb(f,d,"hasfocus",e,!0);b.__ko_hasfocusLastValue=e;b.__ko_hasfocusUpdating=!1}var f=e.bind(null,!0),g=e.bind(null,!1);a.a.B(b,"focus",f);a.a.B(b,"focusin",f);a.a.B(b,"blur",g);a.a.B(b,"focusout",g);b.__ko_hasfocusLastValue=!1},update:function(b,c){var d=!!a.a.f(c());b.__ko_hasfocusUpdating||b.__ko_hasfocusLastValue=== d||(d?b.focus():b.blur(),!d&&b.__ko_hasfocusLastValue&&b.ownerDocument.body.focus(),a.u.G(a.a.Fb,null,[b,d?"focusin":"focusout"]))}};a.m.wa.hasfocus=!0;a.c.hasFocus=a.c.hasfocus;a.m.wa.hasFocus="hasfocus";a.c.html={init:function(){return{controlsDescendantBindings:!0}},update:function(b,c){a.a.fc(b,c())}};(function(){function b(b,d,e){a.c[b]={init:function(b,c,h,m,k){var l,p,q={},t,x,n;if(d){m=h.get("as");var u=h.get("noChildContext");n=!(m&&u);q={as:m,noChildContext:u,exportDependencies:n}}x=(t= "render"==h.get("completeOn"))||h.has(a.i.pa);a.o(function(){var h=a.a.f(c()),m=!e!==!h,u=!p,r;if(n||m!==l){x&&(k=a.i.Cb(b,k));if(m){if(!d||n)q.dataDependency=a.S.o();r=d?k.createChildContext("function"==typeof h?h:c,q):a.S.qa()?k.extend(null,q):k}u&&a.S.qa()&&(p=a.a.Ca(a.h.childNodes(b),!0));m?(u||a.h.va(b,a.a.Ca(p)),a.Oa(r,b)):(a.h.Ea(b),t||a.i.ma(b,a.i.H));l=m}},null,{l:b});return{controlsDescendantBindings:!0}}};a.m.Ra[b]=!1;a.h.ea[b]=!0}b("if");b("ifnot",!1,!0);b("with",!0)})();a.c.let={init:function(b, c,d,e,f){c=f.extend(c);a.Oa(c,b);return{controlsDescendantBindings:!0}}};a.h.ea.let=!0;var Q={};a.c.options={init:function(b){if("select"!==a.a.R(b))throw Error("options binding applies only to SELECT elements");for(;0g)var m=a.a.g.Z(),k=a.a.g.Z(),l=function(b){var c=this.activeElement;(c=c&&a.a.g.get(c,k))&&c(b)},p=function(b,c){var d=b.ownerDocument;a.a.g.get(d,m)||(a.a.g.set(d,m,!0),a.a.B(d,"selectionchange",l));a.a.g.set(b,k,c)};a.c.textInput={init:function(b,c,k){function l(c,d){a.a.B(b,c,d)}function m(){var d=a.a.f(c());if(null===d||d===n)d="";L!==n&&d===L?a.a.setTimeout(m,4):b.value!==d&&(y=!0,b.value=d,y=!1,v=b.value)}function r(){w||(L=b.value,w=a.a.setTimeout(z, 4))}function z(){clearTimeout(w);L=w=n;var d=b.value;v!==d&&(v=d,a.m.eb(c(),k,"textInput",d))}var v=b.value,w,L,A=9==a.a.W?r:z,y=!1;g&&l("keypress",z);11>g&&l("propertychange",function(a){y||"value"!==a.propertyName||A(a)});8==g&&(l("keyup",z),l("keydown",z));p&&(p(b,A),l("dragend",r));(!g||9<=g)&&l("input",A);5>e&&"textarea"===a.a.R(b)?(l("keydown",r),l("paste",r),l("cut",r)):11>d?l("keydown",r):4>f?(l("DOMAutoComplete",z),l("dragdrop",z),l("drop",z)):h&&"number"===b.type&&l("keydown",r);l("change", z);l("blur",z);a.o(m,null,{l:b})}};a.m.wa.textInput=!0;a.c.textinput={preprocess:function(a,b,c){c("textInput",a)}}})();a.c.uniqueName={init:function(b,c){if(c()){var d="ko_unique_"+ ++a.c.uniqueName.rd;a.a.Yc(b,d)}}};a.c.uniqueName.rd=0;a.c.using={init:function(b,c,d,e,f){var g;d.has("as")&&(g={as:d.get("as"),noChildContext:d.get("noChildContext")});c=f.createChildContext(c,g);a.Oa(c,b);return{controlsDescendantBindings:!0}}};a.h.ea.using=!0;a.c.value={init:function(b,c,d){var e=a.a.R(b),f="input"== e;if(!f||"checkbox"!=b.type&&"radio"!=b.type){var g=[],h=d.get("valueUpdate"),m=!1,k=null;h&&("string"==typeof h?g=[h]:g=a.a.wc(h),a.a.Pa(g,"change"));var l=function(){k=null;m=!1;var e=c(),f=a.w.M(b);a.m.eb(e,d,"value",f)};!a.a.W||!f||"text"!=b.type||"off"==b.autocomplete||b.form&&"off"==b.form.autocomplete||-1!=a.a.A(g,"propertychange")||(a.a.B(b,"propertychange",function(){m=!0}),a.a.B(b,"focus",function(){m=!1}),a.a.B(b,"blur",function(){m&&l()}));a.a.D(g,function(c){var d=l;a.a.Ud(c,"after")&& (d=function(){k=a.w.M(b);a.a.setTimeout(l,0)},c=c.substring(5));a.a.B(b,c,d)});var p;p=f&&"file"==b.type?function(){var d=a.a.f(c());null===d||d===n||""===d?b.value="":a.u.G(l)}:function(){var f=a.a.f(c()),g=a.w.M(b);if(null!==k&&f===k)a.a.setTimeout(p,0);else if(f!==g||g===n)"select"===e?(g=d.get("valueAllowUnset"),a.w.cb(b,f,g),g||f===a.w.M(b)||a.u.G(l)):a.w.cb(b,f)};if("select"===e){var q;a.i.subscribe(b,a.i.H,function(){q?d.get("valueAllowUnset")?p():l():(a.a.B(b,"change",l),q=a.o(p,null,{l:b}))}, null,{notifyImmediately:!0})}else a.a.B(b,"change",l),a.o(p,null,{l:b})}else a.ib(b,{checkedValue:c})},update:function(){}};a.m.wa.value=!0;a.c.visible={update:function(b,c){var d=a.a.f(c()),e="none"!=b.style.display;d&&!e?b.style.display="":!d&&e&&(b.style.display="none")}};a.c.hidden={update:function(b,c){a.c.visible.update(b,function(){return!a.a.f(c())})}};(function(b){a.c[b]={init:function(c,d,e,f,g){return a.c.event.init.call(this,c,function(){var a={};a[b]=d();return a},e,f,g)}}})("click"); a.ca=function(){};a.ca.prototype.renderTemplateSource=function(){throw Error("Override renderTemplateSource");};a.ca.prototype.createJavaScriptEvaluatorBlock=function(){throw Error("Override createJavaScriptEvaluatorBlock");};a.ca.prototype.makeTemplateSource=function(b,c){if("string"==typeof b){c=c||w;var d=c.getElementById(b);if(!d)throw Error("Cannot find template with ID "+b);return new a.C.F(d)}if(1==b.nodeType||8==b.nodeType)return new a.C.ia(b);throw Error("Unknown template type: "+b);};a.ca.prototype.renderTemplate= function(a,c,d,e){a=this.makeTemplateSource(a,e);return this.renderTemplateSource(a,c,d,e)};a.ca.prototype.isTemplateRewritten=function(a,c){return!1===this.allowTemplateRewriting?!0:this.makeTemplateSource(a,c).data("isRewritten")};a.ca.prototype.rewriteTemplate=function(a,c,d){a=this.makeTemplateSource(a,d);c=c(a.text());a.text(c);a.data("isRewritten",!0)};a.b("templateEngine",a.ca);a.kc=function(){function b(b,c,d,h){b=a.m.ac(b);for(var m=a.m.Ra,k=0;k]*))?)*\s+)data-bind\s*=\s*(["'])([\s\S]*?)\3/gi, d=/\x3c!--\s*ko\b\s*([\s\S]*?)\s*--\x3e/g;return{xd:function(b,c,d){c.isTemplateRewritten(b,d)||c.rewriteTemplate(b,function(b){return a.kc.Ld(b,c)},d)},Ld:function(a,f){return a.replace(c,function(a,c,d,e,l){return b(l,c,d,f)}).replace(d,function(a,c){return b(c,"\x3c!-- ko --\x3e","#comment",f)})},md:function(b,c){return a.aa.Xb(function(d,h){var m=d.nextSibling;m&&m.nodeName.toLowerCase()===c&&a.ib(m,b,h)})}}}();a.b("__tr_ambtns",a.kc.md);(function(){a.C={};a.C.F=function(b){if(this.F=b){var c= a.a.R(b);this.ab="script"===c?1:"textarea"===c?2:"template"==c&&b.content&&11===b.content.nodeType?3:4}};a.C.F.prototype.text=function(){var b=1===this.ab?"text":2===this.ab?"value":"innerHTML";if(0==arguments.length)return this.F[b];var c=arguments[0];"innerHTML"===b?a.a.fc(this.F,c):this.F[b]=c};var b=a.a.g.Z()+"_";a.C.F.prototype.data=function(c){if(1===arguments.length)return a.a.g.get(this.F,b+c);a.a.g.set(this.F,b+c,arguments[1])};var c=a.a.g.Z();a.C.F.prototype.nodes=function(){var b=this.F; if(0==arguments.length){var e=a.a.g.get(b,c)||{},f=e.lb||(3===this.ab?b.content:4===this.ab?b:n);if(!f||e.jd){var g=this.text();g&&g!==e.bb&&(f=a.a.Md(g,b.ownerDocument),a.a.g.set(b,c,{lb:f,bb:g,jd:!0}))}return f}e=arguments[0];this.ab!==n&&this.text("");a.a.g.set(b,c,{lb:e})};a.C.ia=function(a){this.F=a};a.C.ia.prototype=new a.C.F;a.C.ia.prototype.constructor=a.C.ia;a.C.ia.prototype.text=function(){if(0==arguments.length){var b=a.a.g.get(this.F,c)||{};b.bb===n&&b.lb&&(b.bb=b.lb.innerHTML);return b.bb}a.a.g.set(this.F, c,{bb:arguments[0]})};a.b("templateSources",a.C);a.b("templateSources.domElement",a.C.F);a.b("templateSources.anonymousTemplate",a.C.ia)})();(function(){function b(b,c,d){var e;for(c=a.h.nextSibling(c);b&&(e=b)!==c;)b=a.h.nextSibling(e),d(e,b)}function c(c,d){if(c.length){var e=c[0],f=c[c.length-1],g=e.parentNode,h=a.ga.instance,m=h.preprocessNode;if(m){b(e,f,function(a,b){var c=a.previousSibling,d=m.call(h,a);d&&(a===e&&(e=d[0]||b),a===f&&(f=d[d.length-1]||c))});c.length=0;if(!e)return;e===f?c.push(e): (c.push(e,f),a.a.Ua(c,g))}b(e,f,function(b){1!==b.nodeType&&8!==b.nodeType||a.vc(d,b)});b(e,f,function(b){1!==b.nodeType&&8!==b.nodeType||a.aa.cd(b,[d])});a.a.Ua(c,g)}}function d(a){return a.nodeType?a:0a.a.W?0:b.nodes)?b.nodes():null)return a.a.la(c.cloneNode(!0).childNodes);b=b.text();return a.a.ua(b,e)};a.ba.Ma=new a.ba;a.gc(a.ba.Ma);a.b("nativeTemplateEngine",a.ba);(function(){a.$a=function(){var a=this.Hd=function(){if(!v||!v.tmpl)return 0;try{if(0<=v.tmpl.tag.tmpl.open.toString().indexOf("__"))return 2}catch(a){}return 1}(); this.renderTemplateSource=function(b,e,f,g){g=g||w;f=f||{};if(2>a)throw Error("Your version of jQuery.tmpl is too old. Please upgrade to jQuery.tmpl 1.0.0pre or later.");var h=b.data("precompiled");h||(h=b.text()||"",h=v.template(null,"{{ko_with $item.koBindingContext}}"+h+"{{/ko_with}}"),b.data("precompiled",h));b=[e.$data];e=v.extend({koBindingContext:e},f.templateOptions);e=v.tmpl(h,b,e);e.appendTo(g.createElement("div"));v.fragments={};return e};this.createJavaScriptEvaluatorBlock=function(a){return"{{ko_code ((function() { return "+ a+" })()) }}"};this.addTemplate=function(a,b){w.write(""; }; SurveyTemplateText.prototype.replaceText = function (replaceText, id, questionType) { if (questionType === void 0) { questionType = null; } var posId = this.getId(id, questionType); var pos = this.text.indexOf(posId); if (pos < 0) { this.addText(replaceText, id, questionType); return; } pos = this.text.indexOf(">", pos); if (pos < 0) return; var startPos = pos + 1; var endString = ""; pos = this.text.indexOf(endString, startPos); if (pos < 0) return; this.text = this.text.substr(0, startPos) + replaceText + this.text.substr(pos); }; SurveyTemplateText.prototype.getId = function (id, questionType) { var result = 'id="survey-' + id; if (questionType) { result += "-" + questionType; } return result + '"'; }; Object.defineProperty(SurveyTemplateText.prototype, "text", { get: function () { return koTemplate; }, set: function (value) { koTemplate = value; }, enumerable: false, configurable: true }); return SurveyTemplateText; }()); /***/ }), /***/ "./src/knockout/templates/comment.html": /*!*********************************************!*\ !*** ./src/knockout/templates/comment.html ***! \*********************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = ""; /***/ }), /***/ "./src/knockout/templates/flowpanel.html": /*!***********************************************!*\ !*** ./src/knockout/templates/flowpanel.html ***! \***********************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = "\n\n"; /***/ }), /***/ "./src/knockout/templates/header.html": /*!********************************************!*\ !*** ./src/knockout/templates/header.html ***! \********************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = "\n"; /***/ }), /***/ "./src/knockout/templates/index.html": /*!*******************************************!*\ !*** ./src/knockout/templates/index.html ***! \*******************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = "\n\n\n"; /***/ }), /***/ "./src/knockout/templates/page.html": /*!******************************************!*\ !*** ./src/knockout/templates/page.html ***! \******************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = "\n"; /***/ }), /***/ "./src/knockout/templates/panel.html": /*!*******************************************!*\ !*** ./src/knockout/templates/panel.html ***! \*******************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = "\n"; /***/ }), /***/ "./src/knockout/templates/question-boolean.html": /*!******************************************************!*\ !*** ./src/knockout/templates/question-boolean.html ***! \******************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = ""; /***/ }), /***/ "./src/knockout/templates/question-buttongroup.html": /*!**********************************************************!*\ !*** ./src/knockout/templates/question-buttongroup.html ***! \**********************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = "\n"; /***/ }), /***/ "./src/knockout/templates/question-checkbox.html": /*!*******************************************************!*\ !*** ./src/knockout/templates/question-checkbox.html ***! \*******************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = "\n\n"; /***/ }), /***/ "./src/knockout/templates/question-comment.html": /*!******************************************************!*\ !*** ./src/knockout/templates/question-comment.html ***! \******************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = ""; /***/ }), /***/ "./src/knockout/templates/question-composite.html": /*!********************************************************!*\ !*** ./src/knockout/templates/question-composite.html ***! \********************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = "\n"; /***/ }), /***/ "./src/knockout/templates/question-custom.html": /*!*****************************************************!*\ !*** ./src/knockout/templates/question-custom.html ***! \*****************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = "\n"; /***/ }), /***/ "./src/knockout/templates/question-dropdown.html": /*!*******************************************************!*\ !*** ./src/knockout/templates/question-dropdown.html ***! \*******************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = "\n"; /***/ }), /***/ "./src/knockout/templates/question-empty.html": /*!****************************************************!*\ !*** ./src/knockout/templates/question-empty.html ***! \****************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = "\n"; /***/ }), /***/ "./src/knockout/templates/question-errors.html": /*!*****************************************************!*\ !*** ./src/knockout/templates/question-errors.html ***! \*****************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = ""; /***/ }), /***/ "./src/knockout/templates/question-expression.html": /*!*********************************************************!*\ !*** ./src/knockout/templates/question-expression.html ***! \*********************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = "\n"; /***/ }), /***/ "./src/knockout/templates/question-file.html": /*!***************************************************!*\ !*** ./src/knockout/templates/question-file.html ***! \***************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = "\n"; /***/ }), /***/ "./src/knockout/templates/question-html.html": /*!***************************************************!*\ !*** ./src/knockout/templates/question-html.html ***! \***************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = "\n"; /***/ }), /***/ "./src/knockout/templates/question-image.html": /*!****************************************************!*\ !*** ./src/knockout/templates/question-image.html ***! \****************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = "\n"; /***/ }), /***/ "./src/knockout/templates/question-imagepicker.html": /*!**********************************************************!*\ !*** ./src/knockout/templates/question-imagepicker.html ***! \**********************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = "\n"; /***/ }), /***/ "./src/knockout/templates/question-matrix.html": /*!*****************************************************!*\ !*** ./src/knockout/templates/question-matrix.html ***! \*****************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = "\n\n"; /***/ }), /***/ "./src/knockout/templates/question-matrixdynamic.html": /*!************************************************************!*\ !*** ./src/knockout/templates/question-matrixdynamic.html ***! \************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = "\n\n"; /***/ }), /***/ "./src/knockout/templates/question-multipletext.html": /*!***********************************************************!*\ !*** ./src/knockout/templates/question-multipletext.html ***! \***********************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = "\n"; /***/ }), /***/ "./src/knockout/templates/question-paneldynamic-navigator.html": /*!*********************************************************************!*\ !*** ./src/knockout/templates/question-paneldynamic-navigator.html ***! \*********************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = ""; /***/ }), /***/ "./src/knockout/templates/question-paneldynamic.html": /*!***********************************************************!*\ !*** ./src/knockout/templates/question-paneldynamic.html ***! \***********************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = "\n"; /***/ }), /***/ "./src/knockout/templates/question-radiogroup.html": /*!*********************************************************!*\ !*** ./src/knockout/templates/question-radiogroup.html ***! \*********************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = "\n\n"; /***/ }), /***/ "./src/knockout/templates/question-ranking.html": /*!******************************************************!*\ !*** ./src/knockout/templates/question-ranking.html ***! \******************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = "\n\n\n"; /***/ }), /***/ "./src/knockout/templates/question-rating.html": /*!*****************************************************!*\ !*** ./src/knockout/templates/question-rating.html ***! \*****************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = "\n"; /***/ }), /***/ "./src/knockout/templates/question-signaturepad.html": /*!***********************************************************!*\ !*** ./src/knockout/templates/question-signaturepad.html ***! \***********************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = ""; /***/ }), /***/ "./src/knockout/templates/question-text.html": /*!***************************************************!*\ !*** ./src/knockout/templates/question-text.html ***! \***************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = "\n"; /***/ }), /***/ "./src/knockout/templates/question.html": /*!**********************************************!*\ !*** ./src/knockout/templates/question.html ***! \**********************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = "\n"; /***/ }), /***/ "./src/knockout/templates/questiontitle.html": /*!***************************************************!*\ !*** ./src/knockout/templates/questiontitle.html ***! \***************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = ""; /***/ }), /***/ "./src/knockout/templates/row.html": /*!*****************************************!*\ !*** ./src/knockout/templates/row.html ***! \*****************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = "\n"; /***/ }), /***/ "./src/knockout/templates/rows.html": /*!******************************************!*\ !*** ./src/knockout/templates/rows.html ***! \******************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = ""; /***/ }), /***/ "./src/knockout/templates/string.html": /*!********************************************!*\ !*** ./src/knockout/templates/string.html ***! \********************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = "\n"; /***/ }), /***/ "./src/knockout/templates/timerpanel.html": /*!************************************************!*\ !*** ./src/knockout/templates/timerpanel.html ***! \************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = "\n"; /***/ }), /***/ "./src/list.ts": /*!*********************!*\ !*** ./src/list.ts ***! \*********************/ /*! exports provided: ListModel */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ListModel", function() { return ListModel; }); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./base */ "./src/base.ts"); /* harmony import */ var _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/cssClassBuilder */ "./src/utils/cssClassBuilder.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __spreadArray = (undefined && undefined.__spreadArray) || function (to, from, pack) { if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { if (ar || !(i in from)) { if (!ar) ar = Array.prototype.slice.call(from, 0, i); ar[i] = from[i]; } } return to.concat(ar || Array.prototype.slice.call(from)); }; var ListModel = /** @class */ (function (_super) { __extends(ListModel, _super); function ListModel(items, onItemSelect, allowSelection, selectedItem) { var _this = _super.call(this) || this; _this.onItemSelect = onItemSelect; _this.allowSelection = allowSelection; _this.selectItem = function (itemValue) { _this.isExpanded = false; if (_this.allowSelection) { _this.selectedItem = itemValue; } if (!!_this.onItemSelect) { _this.onItemSelect(itemValue); } }; _this.isItemDisabled = function (itemValue) { return itemValue.enabled !== undefined && !itemValue.enabled; }; _this.isItemSelected = function (itemValue) { return _this.allowSelection && _this.selectedItem == itemValue; }; _this.getItemClass = function (itemValue) { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_2__["CssClassBuilder"]() .append("sv-list__item") .append("sv-list__item--disabled", _this.isItemDisabled(itemValue)) .append("sv-list__item--selected", _this.isItemSelected(itemValue)) .toString(); }; _this.getItemIndent = function (itemValue) { var level = itemValue.level || 0; return (level + 1) * ListModel.INDENT + "px"; }; _this.createNewArray("items"); _this.items = items; _this.selectedItem = selectedItem; return _this; } Object.defineProperty(ListModel.prototype, "items", { get: function () { return this.getPropertyValue("items"); }, set: function (value) { var _a; (_a = this.items).splice.apply(_a, __spreadArray([0, this.items.length], (value || []), false)); }, enumerable: false, configurable: true }); ListModel.prototype.onKeyDown = function (event) { var currentElement = event.target; if (event.key === "ArrowDown" || event.keyCode === 40) { if (!!currentElement.nextElementSibling) { currentElement.nextElementSibling.focus(); } else { currentElement.parentElement.firstElementChild && currentElement.parentElement.firstElementChild.focus(); } event.preventDefault(); } else if (event.key === "ArrowUp" || event.keyCode === 38) { if (!!currentElement.previousElementSibling) { currentElement.previousElementSibling.focus(); } else { currentElement.parentElement.lastElementChild && currentElement.parentElement.lastElementChild.focus(); } event.preventDefault(); } }; ListModel.INDENT = 16; __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_0__["property"])({ defaultValue: false }) ], ListModel.prototype, "isExpanded", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_0__["property"])() ], ListModel.prototype, "selectedItem", void 0); return ListModel; }(_base__WEBPACK_IMPORTED_MODULE_1__["Base"])); /***/ }), /***/ "./src/localizablestring.ts": /*!**********************************!*\ !*** ./src/localizablestring.ts ***! \**********************************/ /*! exports provided: LocalizableString, LocalizableStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LocalizableString", function() { return LocalizableString; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LocalizableStrings", function() { return LocalizableStrings; }); /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers */ "./src/helpers.ts"); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./surveyStrings */ "./src/surveyStrings.ts"); /* harmony import */ var _settings__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./settings */ "./src/settings.ts"); /** * The class represents the string that supports multi-languages and markdown. * It uses in all objects where support for multi-languages and markdown is required. */ var LocalizableString = /** @class */ (function () { function LocalizableString(owner, useMarkdown, name) { if (useMarkdown === void 0) { useMarkdown = false; } this.owner = owner; this.useMarkdown = useMarkdown; this.name = name; this.values = {}; this.htmlValues = {}; this.onCreating(); } Object.defineProperty(LocalizableString, "defaultLocale", { get: function () { return _settings__WEBPACK_IMPORTED_MODULE_2__["settings"].defaultLocaleName; }, set: function (val) { _settings__WEBPACK_IMPORTED_MODULE_2__["settings"].defaultLocaleName = val; }, enumerable: false, configurable: true }); LocalizableString.prototype.getIsMultiple = function () { return false; }; Object.defineProperty(LocalizableString.prototype, "locale", { get: function () { return this.owner && this.owner.getLocale ? this.owner.getLocale() : ""; }, enumerable: false, configurable: true }); LocalizableString.prototype.strChanged = function () { this.searchableText = undefined; if (this.renderedText === undefined) return; this.calculatedTextValue = this.calcText(); if (this.renderedText !== this.calculatedTextValue) { this.renderedText = undefined; this.calculatedTextValue = undefined; } this.onChanged(); }; Object.defineProperty(LocalizableString.prototype, "text", { get: function () { return this.pureText; }, set: function (value) { this.setLocaleText(this.locale, value); }, enumerable: false, configurable: true }); Object.defineProperty(LocalizableString.prototype, "calculatedText", { get: function () { this.renderedText = this.calculatedTextValue !== undefined ? this.calculatedTextValue : this.calcText(); this.calculatedTextValue = undefined; return this.renderedText; }, enumerable: false, configurable: true }); LocalizableString.prototype.calcText = function () { var res = this.pureText; if (res && this.owner && this.owner.getProcessedText && res.indexOf("{") > -1) { res = this.owner.getProcessedText(res); } if (this.onGetTextCallback) res = this.onGetTextCallback(res); return res; }; Object.defineProperty(LocalizableString.prototype, "pureText", { get: function () { var loc = this.locale; if (!loc) loc = _settings__WEBPACK_IMPORTED_MODULE_2__["settings"].defaultLocaleName; var res = this.getValue(loc); if (!res && loc == _settings__WEBPACK_IMPORTED_MODULE_2__["settings"].defaultLocaleName) { res = this.getValue(_surveyStrings__WEBPACK_IMPORTED_MODULE_1__["surveyLocalization"].defaultLocale); } if (!res && loc !== _settings__WEBPACK_IMPORTED_MODULE_2__["settings"].defaultLocaleName) { res = this.getValue(_settings__WEBPACK_IMPORTED_MODULE_2__["settings"].defaultLocaleName); } if (!res && !!this.localizationName) { res = _surveyStrings__WEBPACK_IMPORTED_MODULE_1__["surveyLocalization"].getString(this.localizationName); } if (!res) res = ""; return res; }, enumerable: false, configurable: true }); Object.defineProperty(LocalizableString.prototype, "hasHtml", { get: function () { return this.hasHtmlValue(); }, enumerable: false, configurable: true }); Object.defineProperty(LocalizableString.prototype, "html", { get: function () { if (!this.hasHtml) return ""; return this.getHtmlValue(); }, enumerable: false, configurable: true }); Object.defineProperty(LocalizableString.prototype, "isEmpty", { get: function () { return this.getValuesKeys().length == 0; }, enumerable: false, configurable: true }); Object.defineProperty(LocalizableString.prototype, "textOrHtml", { get: function () { return this.hasHtml ? this.getHtmlValue() : this.calculatedText; }, enumerable: false, configurable: true }); Object.defineProperty(LocalizableString.prototype, "renderedHtml", { get: function () { return this.textOrHtml; }, enumerable: false, configurable: true }); LocalizableString.prototype.getLocaleText = function (loc) { if (!loc) loc = _settings__WEBPACK_IMPORTED_MODULE_2__["settings"].defaultLocaleName; var res = this.getValue(loc); return res ? res : ""; }; LocalizableString.prototype.setLocaleText = function (loc, value) { if (value == this.getLocaleText(loc)) return; if (value && loc && loc != _settings__WEBPACK_IMPORTED_MODULE_2__["settings"].defaultLocaleName && !this.getValue(loc) && value == this.getLocaleText(_settings__WEBPACK_IMPORTED_MODULE_2__["settings"].defaultLocaleName)) return; var curLoc = this.locale; if (!loc) loc = _settings__WEBPACK_IMPORTED_MODULE_2__["settings"].defaultLocaleName; if (!curLoc) curLoc = _settings__WEBPACK_IMPORTED_MODULE_2__["settings"].defaultLocaleName; var hasOnStrChanged = this.onStrChanged && loc === curLoc; var oldValue = hasOnStrChanged ? this.pureText : undefined; delete this.htmlValues[loc]; if (!value) { if (this.getValue(loc)) this.deleteValue(loc); } else { if (typeof value === "string") { if (loc != _settings__WEBPACK_IMPORTED_MODULE_2__["settings"].defaultLocaleName && value == this.getLocaleText(_settings__WEBPACK_IMPORTED_MODULE_2__["settings"].defaultLocaleName)) { this.setLocaleText(loc, null); } else { this.setValue(loc, value); if (loc == _settings__WEBPACK_IMPORTED_MODULE_2__["settings"].defaultLocaleName) { this.deleteValuesEqualsToDefault(value); } } } } this.strChanged(); if (hasOnStrChanged) { this.onStrChanged(oldValue, value); } }; LocalizableString.prototype.hasNonDefaultText = function () { var keys = this.getValuesKeys(); if (keys.length == 0) return false; return keys.length > 1 || keys[0] != _settings__WEBPACK_IMPORTED_MODULE_2__["settings"].defaultLocaleName; }; LocalizableString.prototype.getLocales = function () { var keys = this.getValuesKeys(); if (keys.length == 0) return []; return keys; }; LocalizableString.prototype.getJson = function () { if (!!this.sharedData) return this.sharedData.getJson(); var keys = this.getValuesKeys(); if (keys.length == 0) return null; if (keys.length == 1 && keys[0] == _settings__WEBPACK_IMPORTED_MODULE_2__["settings"].defaultLocaleName && !_settings__WEBPACK_IMPORTED_MODULE_2__["settings"].serializeLocalizableStringAsObject) return this.values[keys[0]]; return this.values; }; LocalizableString.prototype.setJson = function (value) { if (!!this.sharedData) { this.sharedData.setJson(value); return; } this.values = {}; this.htmlValues = {}; if (!value) return; if (typeof value === "string") { this.setLocaleText(null, value); } else { for (var key in value) { this.setLocaleText(key, value[key]); } } this.strChanged(); }; Object.defineProperty(LocalizableString.prototype, "renderAs", { get: function () { if (!this.owner || typeof this.owner.getRenderer !== "function") { return LocalizableString.defaultRenderer; } return this.owner.getRenderer(this.name) || LocalizableString.defaultRenderer; }, enumerable: false, configurable: true }); Object.defineProperty(LocalizableString.prototype, "renderAsData", { get: function () { if (!this.owner || typeof this.owner.getRendererContext !== "function") { return this; } return this.owner.getRendererContext(this) || this; }, enumerable: false, configurable: true }); LocalizableString.prototype.equals = function (obj) { if (!!this.sharedData) return this.sharedData.equals(obj); if (!obj || !obj.values) return false; return _helpers__WEBPACK_IMPORTED_MODULE_0__["Helpers"].isTwoValueEquals(this.values, obj.values, false, true, false); }; LocalizableString.prototype.setFindText = function (text) { if (this.searchText == text) return; this.searchText = text; if (!this.searchableText) { var textOrHtml = this.textOrHtml; this.searchableText = !!textOrHtml ? textOrHtml.toLowerCase() : ""; } var str = this.searchableText; var index = !!str && !!text ? str.indexOf(text) : undefined; if (index < 0) index = undefined; if (index != undefined || this.searchIndex != index) { this.searchIndex = index; if (!!this.onSearchChanged) { this.onSearchChanged(); } } return this.searchIndex != undefined; }; LocalizableString.prototype.onChanged = function () { }; LocalizableString.prototype.onCreating = function () { }; LocalizableString.prototype.hasHtmlValue = function () { if (!this.owner || !this.useMarkdown) return false; var renderedText = this.calculatedText; if (!renderedText) return false; var loc = this.locale; if (!loc) loc = _settings__WEBPACK_IMPORTED_MODULE_2__["settings"].defaultLocaleName; this.htmlValues[loc] = this.owner.getMarkdownHtml(renderedText, this.name); return this.htmlValues[loc] ? true : false; }; LocalizableString.prototype.getHtmlValue = function () { var loc = this.locale; if (!loc) loc = _settings__WEBPACK_IMPORTED_MODULE_2__["settings"].defaultLocaleName; return this.htmlValues[loc]; }; LocalizableString.prototype.deleteValuesEqualsToDefault = function (defaultValue) { var keys = this.getValuesKeys(); for (var i = 0; i < keys.length; i++) { if (keys[i] == _settings__WEBPACK_IMPORTED_MODULE_2__["settings"].defaultLocaleName) continue; if (this.getValue(keys[i]) == defaultValue) { this.deleteValue(keys[i]); } } }; LocalizableString.prototype.getValue = function (loc) { if (!!this.sharedData) return this.sharedData.getValue(loc); return this.values[loc]; }; LocalizableString.prototype.setValue = function (loc, value) { if (!!this.sharedData) this.sharedData.setValue(loc, value); else this.values[loc] = value; }; LocalizableString.prototype.deleteValue = function (loc) { if (!!this.sharedData) this.sharedData.deleteValue(loc); else delete this.values[loc]; }; LocalizableString.prototype.getValuesKeys = function () { if (!!this.sharedData) return this.sharedData.getValuesKeys(); return Object.keys(this.values); }; LocalizableString.SerializeAsObject = false; LocalizableString.defaultRenderer = "sv-string-viewer"; LocalizableString.editableRenderer = "sv-string-editor"; return LocalizableString; }()); /** * The class represents the list of strings that supports multi-languages. */ var LocalizableStrings = /** @class */ (function () { function LocalizableStrings(owner) { this.owner = owner; this.values = {}; } LocalizableStrings.prototype.getIsMultiple = function () { return true; }; Object.defineProperty(LocalizableStrings.prototype, "locale", { get: function () { return this.owner && this.owner.getLocale ? this.owner.getLocale() : ""; }, enumerable: false, configurable: true }); Object.defineProperty(LocalizableStrings.prototype, "value", { get: function () { return this.getValue(""); }, set: function (val) { this.setValue("", val); }, enumerable: false, configurable: true }); Object.defineProperty(LocalizableStrings.prototype, "text", { get: function () { return Array.isArray(this.value) ? this.value.join("\n") : ""; }, set: function (val) { this.value = !!val ? val.split("\n") : []; }, enumerable: false, configurable: true }); LocalizableStrings.prototype.getLocaleText = function (loc) { var res = this.getValueCore(loc, !loc || loc === this.locale); if (!res || !Array.isArray(res) || res.length == 0) return ""; return res.join("\n"); }; LocalizableStrings.prototype.setLocaleText = function (loc, newValue) { var val = !!newValue ? newValue.split("\n") : null; this.setValue(loc, val); }; LocalizableStrings.prototype.getValue = function (loc) { return this.getValueCore(loc); }; LocalizableStrings.prototype.getValueCore = function (loc, useDefault) { if (useDefault === void 0) { useDefault = true; } loc = this.getLocale(loc); if (this.values[loc]) return this.values[loc]; if (useDefault) { var defLoc = _settings__WEBPACK_IMPORTED_MODULE_2__["settings"].defaultLocaleName; if (loc !== defLoc && this.values[defLoc]) return this.values[defLoc]; } return []; }; LocalizableStrings.prototype.setValue = function (loc, val) { loc = this.getLocale(loc); var oldValue = _helpers__WEBPACK_IMPORTED_MODULE_0__["Helpers"].createCopy(this.values); if (!val || val.length == 0) { delete this.values[loc]; } else { this.values[loc] = val; } if (!!this.onValueChanged) { this.onValueChanged(oldValue, this.values); } }; LocalizableStrings.prototype.hasValue = function (loc) { if (loc === void 0) { loc = ""; } return !this.isEmpty && this.getValue(loc).length > 0; }; Object.defineProperty(LocalizableStrings.prototype, "isEmpty", { get: function () { return this.getValuesKeys().length == 0; }, enumerable: false, configurable: true }); LocalizableStrings.prototype.getLocale = function (loc) { if (!!loc) return loc; loc = this.locale; return !!loc ? loc : _settings__WEBPACK_IMPORTED_MODULE_2__["settings"].defaultLocaleName; }; LocalizableStrings.prototype.getLocales = function () { var keys = this.getValuesKeys(); if (keys.length == 0) return []; return keys; }; LocalizableStrings.prototype.getJson = function () { var keys = this.getValuesKeys(); if (keys.length == 0) return null; if (keys.length == 1 && keys[0] == _settings__WEBPACK_IMPORTED_MODULE_2__["settings"].defaultLocaleName && !_settings__WEBPACK_IMPORTED_MODULE_2__["settings"].serializeLocalizableStringAsObject) return this.values[keys[0]]; return _helpers__WEBPACK_IMPORTED_MODULE_0__["Helpers"].createCopy(this.values); }; LocalizableStrings.prototype.setJson = function (value) { this.values = {}; if (!value) return; if (Array.isArray(value)) { this.setValue(null, value); } else { for (var key in value) { this.setValue(key, value[key]); } } }; LocalizableStrings.prototype.getValuesKeys = function () { return Object.keys(this.values); }; return LocalizableStrings; }()); /***/ }), /***/ "./src/localization/arabic.ts": /*!************************************!*\ !*** ./src/localization/arabic.ts ***! \************************************/ /*! exports provided: arabicSurveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "arabicSurveyStrings", function() { return arabicSurveyStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var arabicSurveyStrings = { pagePrevText: "السابق", pageNextText: "التالي", completeText: "إرسال البيانات", previewText: "معاينة", editText: "تعديل", startSurveyText: "بداية", otherItemText: "نص آخر", noneItemText: "لا شيء", selectAllItemText: "اختر الكل", progressText: "{1} صفحة {0} من", panelDynamicProgressText: "سجل {0} من {1}", questionsProgressText: "تمت الإجابة على أسئلة {0} / {1}", emptySurvey: "لا توجد صفحة مرئية أو سؤال في النموذج", completingSurvey: "شكرا لكم لاستكمال النموذج!", completingSurveyBefore: "تظهر سجلاتنا أنك قد أكملت هذا الاستطلاع بالفعل.", loadingSurvey: "...يتم تحميل النموذج", optionsCaption: "...اختر", value: "القيمة", requiredError: ".يرجى الإجابة على السؤال", requiredErrorInPanel: "الرجاء الإجابة على سؤال واحد على الأقل.", requiredInAllRowsError: "يرجى الإجابة على الأسئلة في جميع الصفوف", numericError: "يجب أن تكون القيمة رقمية.", textMinLength: "الرجاء إدخال ما لا يقل عن {0} حروف", textMaxLength: "الرجاء إدخال أقل من {0} حروف", textMinMaxLength: "يرجى إدخال أكثر من {0} وأقل من {1} حروف", minRowCountError: "يرجى ملء ما لا يقل عن {0} الصفوف", minSelectError: "يرجى تحديد ما لا يقل عن {0} المتغيرات", maxSelectError: "يرجى تحديد ما لا يزيد عن {0} المتغيرات", numericMinMax: "و'{0}' يجب أن تكون مساوية أو أكثر من {1} وتساوي أو أقل من {2}ا", numericMin: "و'{0}' يجب أن تكون مساوية أو أكثر من {1}ا", numericMax: "و'{0}' يجب أن تكون مساوية أو أقل من {1}ا", invalidEmail: "الرجاء إدخال بريد الكتروني صحيح", invalidExpression: "يجب أن يعرض التعبير: {0} 'صواب'.", urlRequestError: "طلب إرجاع خطأ '{0}'. {1}ا", urlGetChoicesError: "عاد طلب البيانات فارغ أو 'المسار' غير صحيح ", exceedMaxSize: "ينبغي ألا يتجاوز حجم الملف {0}ا", otherRequiredError: "الرجاء إدخال قيمة أخرى", uploadingFile: "تحميل الملف الخاص بك. يرجى الانتظار عدة ثوان والمحاولة لاحقًا", loadingFile: "جار التحميل...", chooseFile: "اختر الملفات...", noFileChosen: "لم تقم باختيار ملف", confirmDelete: "هل تريد حذف السجل؟", keyDuplicationError: "يجب أن تكون هذه القيمة فريدة.", addColumn: "أضف العمود", addRow: "اضافة صف", removeRow: "إزالة صف", addPanel: "اضف جديد", removePanel: "إزالة", choices_Item: "بند", matrix_column: "عمود", matrix_row: "صف", savingData: "يتم حفظ النتائج على الخادم ...", savingDataError: "حدث خطأ ولم نتمكن من حفظ النتائج.", savingDataSuccess: "تم حفظ النتائج بنجاح!", saveAgainButton: "حاول مجددا", timerMin: "دقيقة", timerSec: "ثانية", timerSpentAll: "لقد أنفقت {0} على هذه الصفحة و {1} إجمالاً.", timerSpentPage: "لقد أنفقت {0} على هذه الصفحة.", timerSpentSurvey: "لقد أنفقت {0} إجمالاً.", timerLimitAll: "لقد أنفقت {0} من {1} في هذه الصفحة و {2} من إجمالي {3}.", timerLimitPage: "لقد أنفقت {0} من {1} في هذه الصفحة.", timerLimitSurvey: "لقد أنفقت {0} من إجمالي {1}.", cleanCaption: "نظيف", clearCaption: "واضح", chooseFileCaption: "اختر ملف", removeFileCaption: "قم بإزالة هذا الملف", booleanCheckedLabel: "نعم", booleanUncheckedLabel: "لا", confirmRemoveFile: "هل أنت متأكد أنك تريد إزالة هذا الملف: {0}؟", confirmRemoveAllFiles: "هل أنت متأكد أنك تريد إزالة كافة الملفات؟", questionTitlePatternText: "عنوان السؤال", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["ar"] = arabicSurveyStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["ar"] = "العربية"; /***/ }), /***/ "./src/localization/basque.ts": /*!************************************!*\ !*** ./src/localization/basque.ts ***! \************************************/ /*! exports provided: basqueSurveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "basqueSurveyStrings", function() { return basqueSurveyStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var basqueSurveyStrings = { pagePrevText: "Aurrekoa", pageNextText: "Hurrengoa", completeText: "Bukatu", previewText: "Aurrebista", editText: "Editatu", startSurveyText: "Hasi", otherItemText: "Beste bat (zehaztu)", noneItemText: "Bat ere ez", selectAllItemText: "Guztia hautatu", progressText: "{1}-(e)tik {0} orrialde", panelDynamicProgressText: "{0} errigistro {1}-(e)tik", questionsProgressText: "Erantzundako galderak {0}/{1}", emptySurvey: "Ez dago orrialde bistaragarririk edo ez dago galderarik.", completingSurvey: "Eskerrik asko galdetegia erantzuteagatik!", completingSurveyBefore: "Gure datuek diote dagoeneko galdetegia erantzun duzula.", loadingSurvey: "Galdetegia kargatzen...", optionsCaption: "Hautatu...", value: "balioa", requiredError: "Mesedez, galdera erantzun.", requiredErrorInPanel: "Mesedez, gutxienez galdera bat erantzun.", requiredInAllRowsError: "Mesedez, errenkadako galdera guztiak erantzun.", numericError: "Estimazioa zenbakizkoa izan behar du.", minError: "Balioa ez da {0} baino txikiagoa izan behar", maxError: "Balioa ez da {0} baino handiagoa izan behar", textMinLength: "Mesedez, gutxienez {0} karaktere erabili behar dira.", textMaxLength: "Mesedez, gehienez {0} karaktere erabili behar dira.", textMinMaxLength: "Mesedez, gehienez {0} eta gutxienez {1} karaktere erabili behar dira.", minRowCountError: "Mesedez, gutxienez {0} errenkada bete.", minSelectError: "Mesedez, gutxienez {0} aukera hautatu.", maxSelectError: "Mesedez, {0} aukera baino gehiago ez hautatu.", numericMinMax: "El '{0}' debe de ser igual o más de {1} y igual o menos de {2}", numericMin: "'{0}' {1} baino handiagoa edo berdin izan behar da", numericMax: "'{0}' {1} baino txikiago edo berdin izan behar da", invalidEmail: "Mesedez, baliozko emaila idatz ezazu.", invalidExpression: "{0} adierazpenak 'egiazkoa' itzuli beharko luke.", urlRequestError: "Eskaerak '{0}' errorea itzuli du. {1}", urlGetChoicesError: "La solicitud regresó vacío de data o la propiedad 'trayectoria' no es correcta", exceedMaxSize: "Fitxategiaren tamaina ez da {0} baino handiagoa izan behar.", otherRequiredError: "Mesedez, beste estimazioa gehitu.", uploadingFile: "Zure fitxategia igotzen ari da. Mesedez, segundo batzuk itxaron eta saiatu berriro.", loadingFile: "Kargatzen...", chooseFile: "Fitxategia(k) hautatu...", noFileChosen: "Ez da inolako fitxategirik hautatu", confirmDelete: "¿Erregistroa borratu nahi al duzu?", keyDuplicationError: "Balio hau bakarra izan behar du.", addColumn: "Zutabe bat gehitu", addRow: "Errenkada bat gehitu", removeRow: "Errenkada bat kendu", emptyRowsText: "Ez dago errenkadarik.", addPanel: "Berria gehitu", removePanel: "Kendu", choices_Item: "artikulua", matrix_column: "Zutabea", matrix_row: "Errenkada", multipletext_itemname: "testua", savingData: "Erantzunak zerbitzarian gordetzen ari dira...", savingDataError: "Erroreren bat gertatu eta erantzunak ez dira zerbitzarian gorde ahal izan.", savingDataSuccess: "Erantzunak egoki gorde dira!", saveAgainButton: "Berriro saiatu.", timerMin: "min", timerSec: "seg", timerSpentAll: "{0} erabili duzu orrialde honetan eta orotara {1}.", timerSpentPage: "Zuk {0} erabili duzu.", timerSpentSurvey: "Orotara gastatu duzu.", timerLimitAll: "{0} gastatu duzu {1}-(e)tik orrialde honetan eta orotara {2} {3}-(e)tik.", timerLimitPage: "{0} gastatu duzu orrialde honetan {1}-(e)tik.", timerLimitSurvey: "Zuk orotara {0} gastatu duzu {1}-(e)tik.", cleanCaption: "Garbitu", clearCaption: "Hustu", signaturePlaceHolder: "Sinatu hemen", chooseFileCaption: "Fitxategia hautatu", removeFileCaption: "Fitxategi hau ezabatu", booleanCheckedLabel: "Bai", booleanUncheckedLabel: "Ez", confirmRemoveFile: "Ziur zaude hurrengo fitxategia ezabatu nahi duzula: {0}?", confirmRemoveAllFiles: "Ziur al zaude fitxategi guztiak ezabatu nahi dituzula?", questionTitlePatternText: "Galderaren izenburua", modalCancelButtonText: "Ezeztatu", modalApplyButtonText: "Ezarri", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["eu"] = basqueSurveyStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["eu"] = "Euskara"; /***/ }), /***/ "./src/localization/bulgarian.ts": /*!***************************************!*\ !*** ./src/localization/bulgarian.ts ***! \***************************************/ /*! exports provided: bulgarianStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bulgarianStrings", function() { return bulgarianStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var bulgarianStrings = { pagePrevText: "Назад", pageNextText: "Напред", completeText: "Край", previewText: "Визуализация", editText: "редактиране", startSurveyText: "Начало", otherItemText: "Друго (опишете)", noneItemText: "Нито един", selectAllItemText: "Всички", progressText: "стр. {0}, общо стр. {1}", panelDynamicProgressText: "Запис {0} от {1}", questionsProgressText: "Отговорени на {0} / {1} въпроса", emptySurvey: "Анкетата не съдържа видими страници или въпроси.", completingSurvey: "Благодарим ви за участието в анкетата!", completingSurveyBefore: "Изглежда, че вие вече сте попълнили анкетата.", loadingSurvey: "Зареждане на анкетата...", optionsCaption: "Изберете...", value: "value", requiredError: "Моля, отговорете на следния въпрос.", requiredErrorInPanel: "Моля, отговорете поне на един от въпросите.", requiredInAllRowsError: "Моля, отговорете на въпросите на всички редове.", numericError: "Стойността следва да бъде число.", textMinLength: "Моля, използвайте поне {0} символа.", textMaxLength: "Моля, използвайте не повече от {0} символа.", textMinMaxLength: "Моля, използвайте повече от {0} и по-малко от {1} символа.", minRowCountError: "Моля, попълнете поне {0} реда.", minSelectError: "Моля, изберете поне {0} варианта.", maxSelectError: "Моля, изберете не повече от {0} варианта.", numericMinMax: "Стойността '{0}' следва да бъде равна или по-голяма от {1} и равна или по-малка от {2}", numericMin: "Стойността '{0}' следва да бъде равна или по-голяма от {1}", numericMax: "Стойността '{0}' следва да бъде равна или по-малка от {1}", invalidEmail: "Моля, въведете валиден адрес на електронна поща.", invalidExpression: "Изразът: {0} трябва да дава резултат 'true' (истина).", urlRequestError: "Заявката води до грешка '{0}'. {1}", urlGetChoicesError: "Заявката не връща данни или частта 'path' (път до търсения ресурс на сървъра) е неправилно зададена", exceedMaxSize: "Размерът на файла следва да не превишава {0}.", otherRequiredError: "Моля, въведете другата стойност.", uploadingFile: "Вашит файл се зарежда на сървъра. Моля, изчакайте няколко секунди и тогава опитвайте отново.", loadingFile: "Зареждане...", chooseFile: "Изберете файл(ове)...", noFileChosen: "Няма избран файл", confirmDelete: "Желаете ли да изтриете записа?", keyDuplicationError: "Стойността следва да бъде уникална.", addColumn: "Добавяне на колона", addRow: "Добавяне на ред", removeRow: "Премахване на ред", addPanel: "Добавяне на панел", removePanel: "Премахване на панел", choices_Item: "елемент", matrix_column: "Колона", matrix_row: "Ред", savingData: "Резултатите се запазват на сървъра...", savingDataError: "Поради възникнала грешка резултатите не можаха да бъдат запазени.", savingDataSuccess: "Резултатите бяха запазени успешно!", saveAgainButton: "Нов опит", timerMin: "мин", timerSec: "сек", timerSpentAll: "Вие използвахте {0} на тази страница и общо {1}.", timerSpentPage: "Вие използвахте {0} на тази страница.", timerSpentSurvey: "Вие използвахте общо {0}.", timerLimitAll: "Вие изпозвахте {0} от {1} на тази страница и общо {2} от {3}.", timerLimitPage: "Вие използвахте {0} от {1} на тази страница.", timerLimitSurvey: "Вие използвахте общо {0} от {1}.", cleanCaption: "Изчистване", clearCaption: "Начално състояние", chooseFileCaption: "Изберете файл", removeFileCaption: "Премахване на файла", booleanCheckedLabel: "Да", booleanUncheckedLabel: "Не", confirmRemoveFile: "Наистина ли искате да премахнете този файл: {0}?", confirmRemoveAllFiles: "Наистина ли искате да премахнете всички файлове?", questionTitlePatternText: "Заглавие на въпроса", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["bg"] = bulgarianStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["bg"] = "български"; /***/ }), /***/ "./src/localization/catalan.ts": /*!*************************************!*\ !*** ./src/localization/catalan.ts ***! \*************************************/ /*! exports provided: catalanSurveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "catalanSurveyStrings", function() { return catalanSurveyStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var catalanSurveyStrings = { pagePrevText: "Anterior", pageNextText: "Següent", completeText: "Complet", otherItemText: "Un altre (descrigui)", progressText: "Pàgina {0} de {1}", emptySurvey: "No hi ha cap pàgina visible o pregunta a l'enquesta.", completingSurvey: "Gràcies per completar l'enquesta!", loadingSurvey: "L'enquesta s'està carregant ...", optionsCaption: "Selecciona ...", requiredError: "Si us plau contesti la pregunta.", requiredInAllRowsError: "Si us plau contesti les preguntes de cada filera.", numericError: "L'estimació ha de ser numèrica.", textMinLength: "Si us plau entre almenys {0} símbols.", textMaxLength: "Si us plau entre menys de {0} símbols.", textMinMaxLength: "Si us plau entre més de {0} i menys de {1} símbols.", minRowCountError: "Si us plau ompli almenys {0} fileres.", minSelectError: "Si us plau seleccioni almenys {0} variants.", maxSelectError: "Si us plau seleccioni no més de {0} variants.", numericMinMax: "El '{0}' deu ser igual o més de {1} i igual o menys de {2}", numericMin: "El '{0}' ha de ser igual o més de {1}", numericMax: "El '{0}' ha de ser igual o menys de {1}", invalidEmail: "Si us plau afegiu un correu electrònic vàlid.", urlRequestError: "La sol·licitud va tornar error '{0}'. {1}", urlGetChoicesError: "La sol·licitud va tornar buida de dates o la propietat 'trajectòria' no és correcta", exceedMaxSize: "La mida de l'arxiu no pot excedir {0}.", otherRequiredError: "Si us plau afegiu l'altra estimació.", uploadingFile: "El seu arxiu s'està pujant. Si us plau esperi uns segons i intenteu-ho de nou.", addRow: "Afegiu una filera", removeRow: "Eliminar una filera", choices_firstItem: "primer article", choices_secondItem: "segon article", choices_thirdItem: "tercer article", matrix_column: "Columna", matrix_row: "Filera" }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["ca"] = catalanSurveyStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["ca"] = "català"; /***/ }), /***/ "./src/localization/croatian.ts": /*!**************************************!*\ !*** ./src/localization/croatian.ts ***! \**************************************/ /*! exports provided: croatianStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "croatianStrings", function() { return croatianStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var croatianStrings = { pagePrevText: "Prethodni", pageNextText: "Sljedeći", completeText: "Kompletan", previewText: "Pregled", editText: "Uređivanje", startSurveyText: "Početak", otherItemText: "Ostali (opis)", noneItemText: "Nitko", selectAllItemText: "Select All", progressText: "Stranica {0} od {1}", panelDynamicProgressText: "Zapisa {0} od {1}", questionsProgressText: "Odgovorio na {0}/{1} pitanja", emptySurvey: "U anketi nema vidljive stranice ili pitanja.", completingSurvey: "Hvala vam što ste završili anketu!", completingSurveyBefore: "Naši zapisi pokazuju da ste već završili ovu anketu.", loadingSurvey: "Anketa o učitavanje...", optionsCaption: "Odaberite...", value: "vrijednost", requiredError: "Molim vas odgovorite na pitanje.", requiredErrorInPanel: "Molim vas odgovorite na barem jedno pitanje.", requiredInAllRowsError: "Odgovorite na pitanja u svim redovima.", numericError: "Vrijednost bi trebala biti brojčana.", textMinLength: "Unesite najmanje {0} znak(ova).", textMaxLength: "Unesite manje od {0} znak(ova).", textMinMaxLength: "Unesite više od {0} i manje od {1} znakova.", minRowCountError: "Molimo ispunite najmanje {0} redaka.", minSelectError: "Odaberite barem {0} varijante.", maxSelectError: "Odaberite ne više od {0} varijanti.", numericMinMax: "'{0}'bi trebao biti jednak ili više od {1} i jednak ili manji od {2}.", numericMin: "'{0}' bi trebao biti jednak ili više od {1}.", numericMax: "'{0}' bi trebao biti jednak ili manji od {1}", invalidEmail: "Unesite valjanu e-mail adresu.", invalidExpression: "Izraz: {0} treba vratiti 'true'.", urlRequestError: "Zahtjev vratio pogrešku '{0}'. {1}", urlGetChoicesError: "Zahtjev je vratio prazne podatke ili je 'path' svojstvo netočna.", exceedMaxSize: "Veličina datoteke ne smije prelaziti {0}.", otherRequiredError: "Unesite drugu vrijednost.", uploadingFile: "Vaša datoteka se prenosi. Pričekajte nekoliko sekundi i pokušajte ponovno.", loadingFile: "Učitavanje...", chooseFile: "Odaberite datoteku...", noFileChosen: "Nije odabrana datoteka", confirmDelete: "Želite li izbrisati zapis?", keyDuplicationError: "Ta bi vrijednost trebala biti jedinstvena.", addColumn: "Dodavanje stupca", addRow: "Dodavanje redaka", removeRow: "Ukloniti", addPanel: "Dodavanje novih", removePanel: "Ukloniti", choices_Item: "stavku", matrix_column: "Stupca", matrix_row: "Redak", savingData: "Rezultati se spremaju na poslužitelju...", savingDataError: "Došlo je do pogreške i nismo mogli spremiti rezultate.", savingDataSuccess: "Rezultati su uspješno spremljeni!", saveAgainButton: "Pokušaj ponovo", timerMin: "min", timerSec: "sec", timerSpentAll: "Vi ste proveli {0} na ovoj stranici i {1} ukupno.", timerSpentPage: "Potrošili ste {0} na ovu stranicu.", timerSpentSurvey: "You have spent {0} in total. {0}.", timerLimitAll: "Vi ste proveli {0} od {1} na ovoj stranici i {2} od {3} ukupno.", timerLimitPage: "Potrošio si {0} od {1} na ovoj stranici.", timerLimitSurvey: "Ukupno ste potrošili {0} od {1}.", cleanCaption: "Očistiti", clearCaption: "Očistiti", chooseFileCaption: "Odaberite datoteku", removeFileCaption: "Uklonite ovu datoteku", booleanCheckedLabel: "Da", booleanUncheckedLabel: "Ne", confirmRemoveFile: "Jeste li sigurni da želite ukloniti ovu datoteku: {0}?", confirmRemoveAllFiles: "Jeste li sigurni da želite ukloniti sve datoteke?", questionTitlePatternText: "Naslov pitanja", modalCancelButtonText: "Otkazati", modalApplyButtonText: "Primijeniti", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["hr"] = croatianStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["hr"] = "hrvatski"; /***/ }), /***/ "./src/localization/czech.ts": /*!***********************************!*\ !*** ./src/localization/czech.ts ***! \***********************************/ /*! exports provided: czechSurveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "czechSurveyStrings", function() { return czechSurveyStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var czechSurveyStrings = { pagePrevText: "Předchozí", pageNextText: "Další", completeText: "Hotovo", previewText: "Náhled", editText: "Upravit", startSurveyText: "Start", otherItemText: "Jiná odpověď (napište)", noneItemText: "Žádný", selectAllItemText: "Vybrat vše", progressText: "Strana {0} z {1}", panelDynamicProgressText: "Záznam {0} z {1}", questionsProgressText: "Zodpovězené otázky: {0} / {1}", emptySurvey: "Průzkumu neobsahuje žádné otázky.", completingSurvey: "Děkujeme za vyplnění průzkumu!", completingSurveyBefore: "Naše záznamy ukazují, že jste tento průzkum již dokončili.", loadingSurvey: "Probíhá načítání průzkumu...", optionsCaption: "Vyber...", value: "hodnota", requiredError: "Odpovězte prosím na otázku.", requiredErrorInPanel: "Please answer at least one question.", requiredInAllRowsError: "Odpovězte prosím na všechny otázky.", numericError: "V tomto poli lze zadat pouze čísla.", textMinLength: "Zadejte prosím alespoň {0} znaků.", textMaxLength: "Zadejte prosím méně než {0} znaků.", textMinMaxLength: "Zadejte prosím více než {0} a méně než {1} znaků.", minRowCountError: "Vyplňte prosím alespoň {0} řádků.", minSelectError: "Vyberte prosím alespoň {0} varianty.", maxSelectError: "Nevybírejte prosím více než {0} variant.", numericMinMax: "Odpověď '{0}' by mělo být větší nebo rovno {1} a menší nebo rovno {2}", numericMin: "Odpověď '{0}' by mělo být větší nebo rovno {1}", numericMax: "Odpověď '{0}' by mělo být menší nebo rovno {1}", invalidEmail: "Zadejte prosím platnou e-mailovou adresu.", invalidExpression: "Výraz: {0} by měl vrátit hodnotu „true“.", urlRequestError: "Požadavek vrátil chybu '{0}'. {1}", urlGetChoicesError: "Požadavek nevrátil data nebo cesta je neplatná", exceedMaxSize: "Velikost souboru by neměla být větší než {0}.", otherRequiredError: "Zadejte prosím jinou hodnotu.", uploadingFile: "Váš soubor se nahrává. Zkuste to prosím za několik sekund.", loadingFile: "Načítání...", chooseFile: "Vyberte soubory ...", noFileChosen: "Není zvolený žádný soubor", confirmDelete: "Chcete smazat záznam?", keyDuplicationError: "Tato hodnota by měla být jedinečná.", addColumn: "Přidat sloupec", addRow: "Přidat řádek", removeRow: "Odstranit", addPanel: "Přidat nový", removePanel: "Odstranit", choices_Item: "položka", matrix_column: "Sloupec", matrix_row: "Řádek", savingData: "Výsledky se ukládají na server ...", savingDataError: "Došlo k chybě a výsledky jsme nemohli uložit.", savingDataSuccess: "Výsledky byly úspěšně uloženy!", saveAgainButton: "Zkus to znovu", timerMin: "min", timerSec: "sek", timerSpentAll: "Na této stránce jste utratili celkem {0} a celkem {1}.", timerSpentPage: "Na této stránce jste utratili {0}.", timerSpentSurvey: "Celkem jste utratili {0}.", timerLimitAll: "Na této stránce jste utratili {0} z {1} a celkem {2} z {3}.", timerLimitPage: "Na této stránce jste strávili {0} z {1}.", timerLimitSurvey: "Celkově jste utratili {0} z {1}.", cleanCaption: "Čistý", clearCaption: "Průhledná", chooseFileCaption: "Vyberte soubor", removeFileCaption: "Odeberte tento soubor", booleanCheckedLabel: "Ano", booleanUncheckedLabel: "Ne", confirmRemoveFile: "Opravdu chcete odebrat tento soubor: {0}?", confirmRemoveAllFiles: "Opravdu chcete odstranit všechny soubory?", questionTitlePatternText: "Název otázky", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["cs"] = czechSurveyStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["cs"] = "čeština"; /***/ }), /***/ "./src/localization/danish.ts": /*!************************************!*\ !*** ./src/localization/danish.ts ***! \************************************/ /*! exports provided: danishSurveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "danishSurveyStrings", function() { return danishSurveyStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var danishSurveyStrings = { pagePrevText: "Tilbage", pageNextText: "Videre", completeText: "Færdig", previewText: "Forpremiere", editText: "Redigér", startSurveyText: "Start", otherItemText: "Valgfrit svar...", noneItemText: "Ingen", selectAllItemText: "Vælg alle", progressText: "Side {0} af {1}", panelDynamicProgressText: "Optag {0} af {1}", questionsProgressText: "Besvarede {0} / {1} spørgsmål", emptySurvey: "Der er ingen synlige spørgsmål.", completingSurvey: "Mange tak for din besvarelse!", completingSurveyBefore: "Vores data viser at du allerede har gennemført dette spørgeskema.", loadingSurvey: "Spørgeskemaet hentes fra serveren...", optionsCaption: "Vælg...", value: "værdi", requiredError: "Besvar venligst spørgsmålet.", requiredErrorInPanel: "Besvar venligst mindst ét spørgsmål.", requiredInAllRowsError: "Besvar venligst spørgsmål i alle rækker.", numericError: "Angiv et tal.", textMinLength: "Angiv mindst {0} tegn.", textMaxLength: "Please enter less than {0} characters.", textMinMaxLength: "Angiv mere end {0} og mindre end {1} tegn.", minRowCountError: "Udfyld mindst {0} rækker.", minSelectError: "Vælg venligst mindst {0} svarmulighed(er).", maxSelectError: "Vælg venligst færre {0} svarmuligheder(er).", numericMinMax: "'{0}' skal være lig med eller større end {1} og lig med eller mindre end {2}", numericMin: "'{0}' skal være lig med eller større end {1}", numericMax: "'{0}' skal være lig med eller mindre end {1}", invalidEmail: "Angiv venligst en gyldig e-mail adresse.", invalidExpression: "Udtrykket: {0} skal returnere 'true'.", urlRequestError: "Forespørgslen returnerede fejlen '{0}'. {1}", urlGetChoicesError: "Forespørgslen returnerede ingen data eller 'path' parameteren er forkert", exceedMaxSize: "Filstørrelsen må ikke overstige {0}.", otherRequiredError: "Angiv en værdi for dit valgfrie svar.", uploadingFile: "Din fil bliver uploadet. Vent nogle sekunder og prøv eventuelt igen.", loadingFile: "Indlæser...", chooseFile: "Vælg fil(er)...", noFileChosen: "Ingen fil er valgt", confirmDelete: "Vil du fjerne den?", keyDuplicationError: "Denne værdi skal være unik.", addColumn: "Tilføj kolonne", addRow: "Tilføj række", removeRow: "Fjern", addPanel: "Tilføj ny", removePanel: "Fjern", choices_Item: "valg", matrix_column: "Kolonne", matrix_row: "Række", savingData: "Resultaterne bliver gemt på serveren...", savingDataError: "Der opstod en fejl og vi kunne ikke gemme resultatet.", savingDataSuccess: "Resultatet blev gemt!", saveAgainButton: "Prøv igen", timerMin: "min", timerSec: "sek", timerSpentAll: "Du har brugt {0} på denne side og {1} i alt.", timerSpentPage: "Du har brugt {0} på denne side.", timerSpentSurvey: "Du har brugt {0} i alt.", timerLimitAll: "Du har brugt {0} af {1} på denne side og {2} af {3} i alt.", timerLimitPage: "Du har brugt {0} af {1} på denne side.", timerLimitSurvey: "Du har brugt {0} af {1} i alt.", cleanCaption: "Rens", clearCaption: "Fjern", chooseFileCaption: "Vælg fil", removeFileCaption: "Fjern denne fil", booleanCheckedLabel: "Ja", booleanUncheckedLabel: "Ingen", confirmRemoveFile: "Er du sikker på, at du vil fjerne denne fil: {0}?", confirmRemoveAllFiles: "Er du sikker på, at du vil fjerne alle filer?", questionTitlePatternText: "Spørgsmåls titel", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["da"] = danishSurveyStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["da"] = "dansk"; /***/ }), /***/ "./src/localization/dutch.ts": /*!***********************************!*\ !*** ./src/localization/dutch.ts ***! \***********************************/ /*! exports provided: dutchSurveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dutchSurveyStrings", function() { return dutchSurveyStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); //Created on behalf https://github.com/Frank13 //Modified on behalf Roeland Verbakel var dutchSurveyStrings = { pagePrevText: "Vorige", pageNextText: "Volgende", completeText: "Verzenden", previewText: "Voorbeeld", editText: "Bewerk", startSurveyText: "Begin met", otherItemText: "Anders, nl.", noneItemText: "Geen", selectAllItemText: "Selecteer Alles", progressText: "Pagina {0} van {1}", panelDynamicProgressText: "Record {0} of {1}", questionsProgressText: "Geantwoord {0}/{1} vragen", emptySurvey: "Er is geen zichtbare pagina of vraag in deze vragenlijst", completingSurvey: "Bedankt voor het invullen van de vragenlijst", completingSurveyBefore: "Onze gegevens tonen aan dat je deze vragenlijst reeds beantwoord hebt.", loadingSurvey: "De vragenlijst is aan het laden...", optionsCaption: "Kies...", value: "waarde", requiredError: "Dit is een vereiste vraag", requiredErrorInPanel: "Gelieve ten minste een vraag te beantwoorden.", requiredInAllRowsError: "Deze vraag vereist één antwoord per rij", numericError: "Het antwoord moet een getal zijn", textMinLength: "Vul minstens {0} karakters in", textMaxLength: "Gelieve minder dan {0} karakters in te vullen.", textMinMaxLength: "Gelieve meer dan {0} en minder dan {1} karakters in te vullen.", minRowCountError: "Gelieve ten minste {0} rijen in te vullen.", minSelectError: "Selecteer minimum {0} antwoorden", maxSelectError: "Selecteer niet meer dan {0} antwoorden", numericMinMax: "Uw antwoord '{0}' moet groter of gelijk zijn aan {1} en kleiner of gelijk aan {2}", numericMin: "Uw antwoord '{0}' moet groter of gelijk zijn aan {1}", numericMax: "Uw antwoord '{0}' moet groter of gelijk zijn aan {1}", invalidEmail: "Vul een geldig e-mailadres in", invalidExpression: "De uitdrukking: {0} moet 'waar' teruggeven.", urlRequestError: "De vraag keerde een fout terug '{0}'. {1}", urlGetChoicesError: "De vraag gaf een leeg antwoord terug of de 'pad' eigenschap is niet correct", exceedMaxSize: "De grootte van het bestand mag niet groter zijn dan {0}", otherRequiredError: "Vul het veld 'Anders, nl.' in", uploadingFile: "Uw bestand wordt opgeladen. Gelieve enkele seconden te wachten en opnieuw te proberen.", loadingFile: "Opladen...", chooseFile: "Kies uw bestand(en)...", noFileChosen: "Geen bestand gekozen", confirmDelete: "Wil je deze gegevens verwijderen?", keyDuplicationError: "Deze waarde moet uniek zijn.", addColumn: "Voeg kolom toe", addRow: "Voeg rij toe", removeRow: "Verwijder", addPanel: "Nieuwe toevoegen", removePanel: "Verwijder", choices_Item: "onderwerp", matrix_column: "Kolom", matrix_row: "Rij", savingData: "De resultaten worden bewaard op de server...", savingDataError: "Er was een probleem en we konden de resultaten niet bewaren.", savingDataSuccess: "De resultaten werden succesvol bewaard!", saveAgainButton: "Probeer opnieuw", timerMin: "minimum", timerSec: "sec", timerSpentAll: "U heeft {0} gespendeerd op deze pagina en {1} in totaal.", timerSpentPage: "U heeft {0} op deze pagina gespendeerd.", timerSpentSurvey: "U heeft in totaal {0} gespendeerd.", timerLimitAll: "U heeft {0} van {1} op deze pagina gespendeerd en {2} van {3} in totaal.", timerLimitPage: "U heeft {0} van {1} gespendeerd op deze pagina.", timerLimitSurvey: "U heeft {0} van {1} in het totaal.", cleanCaption: "Kuis op", clearCaption: "Kuis op", chooseFileCaption: "Gekozen bestand", removeFileCaption: "Verwijder deze file", booleanCheckedLabel: "Ja", booleanUncheckedLabel: "Neen", confirmRemoveFile: "Bent u zeker dat u deze file wilt verwijderen: {0}?", confirmRemoveAllFiles: "Bent u zeker dat u al deze files wilt verwijderen?", questionTitlePatternText: "Titel van de vraag", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["nl"] = dutchSurveyStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["nl"] = "nederlands"; /***/ }), /***/ "./src/localization/english.ts": /*!*************************************!*\ !*** ./src/localization/english.ts ***! \*************************************/ /*! exports provided: englishStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "englishStrings", function() { return englishStrings; }); //Uncomment this line on creating a translation file //import { surveyLocalization } from "../surveyStrings"; var englishStrings = { pagePrevText: "Previous", pageNextText: "Next", completeText: "Complete", previewText: "Preview", editText: "Edit", startSurveyText: "Start", otherItemText: "Other (describe)", noneItemText: "None", selectAllItemText: "Select All", progressText: "Page {0} of {1}", panelDynamicProgressText: "Record {0} of {1}", questionsProgressText: "Answered {0}/{1} questions", emptySurvey: "There is no visible page or question in the survey.", completingSurvey: "Thank you for completing the survey!", completingSurveyBefore: "Our records show that you have already completed this survey.", loadingSurvey: "Loading Survey...", optionsCaption: "Choose...", value: "value", requiredError: "Response required.", requiredErrorInPanel: "Response required: answer at least one question.", requiredInAllRowsError: "Response required: answer questions in all rows.", numericError: "The value should be numeric.", minError: "The value should not be less than {0}", maxError: "The value should not be greater than {0}", textMinLength: "Please enter at least {0} character(s).", textMaxLength: "Please enter no more than {0} character(s).", textMinMaxLength: "Please enter at least {0} and no more than {1} characters.", minRowCountError: "Please fill in at least {0} row(s).", minSelectError: "Please select at least {0} variant(s).", maxSelectError: "Please select no more than {0} variant(s).", numericMinMax: "The '{0}' should be at least {1} and at most {2}", numericMin: "The '{0}' should be at least {1}", numericMax: "The '{0}' should be at most {1}", invalidEmail: "Please enter a valid e-mail address.", invalidExpression: "The expression: {0} should return 'true'.", urlRequestError: "The request returned error '{0}'. {1}", urlGetChoicesError: "The request returned empty data or the 'path' property is incorrect", exceedMaxSize: "The file size should not exceed {0}.", otherRequiredError: "Response required: enter another value.", uploadingFile: "Your file is uploading. Please wait several seconds and try again.", loadingFile: "Loading...", chooseFile: "Choose file(s)...", noFileChosen: "No file chosen", fileDragAreaPlaceholder: "Drop a file here or click the button below to load the file.", confirmDelete: "Do you want to delete the record?", keyDuplicationError: "This value should be unique.", addColumn: "Add column", addRow: "Add row", removeRow: "Remove", emptyRowsText: "There are no rows.", addPanel: "Add new", removePanel: "Remove", choices_Item: "item", matrix_column: "Column", matrix_row: "Row", multipletext_itemname: "text", savingData: "The results are being saved on the server...", savingDataError: "An error occurred and we could not save the results.", savingDataSuccess: "The results were saved successfully!", saveAgainButton: "Try again", timerMin: "min", timerSec: "sec", timerSpentAll: "You have spent {0} on this page and {1} in total.", timerSpentPage: "You have spent {0} on this page.", timerSpentSurvey: "You have spent {0} in total.", timerLimitAll: "You have spent {0} of {1} on this page and {2} of {3} in total.", timerLimitPage: "You have spent {0} of {1} on this page.", timerLimitSurvey: "You have spent {0} of {1} in total.", cleanCaption: "Clean", clearCaption: "Clear", signaturePlaceHolder: "Sign here", chooseFileCaption: "Choose file", removeFileCaption: "Remove this file", booleanCheckedLabel: "Yes", booleanUncheckedLabel: "No", confirmRemoveFile: "Are you sure that you want to remove this file: {0}?", confirmRemoveAllFiles: "Are you sure that you want to remove all files?", questionTitlePatternText: "Question Title", modalCancelButtonText: "Cancel", modalApplyButtonText: "Apply", }; //Uncomment these two lines on creating a translation file. You should replace "en" and enStrings with your locale ("fr", "de" and so on) and your variable. //surveyLocalization.locales["en"] = englishStrings; //surveyLocalization.localeNames["en"] = "English"; /***/ }), /***/ "./src/localization/estonian.ts": /*!**************************************!*\ !*** ./src/localization/estonian.ts ***! \**************************************/ /*! exports provided: estonianSurveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "estonianSurveyStrings", function() { return estonianSurveyStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var estonianSurveyStrings = { pagePrevText: "Tagasi", pageNextText: "Edasi", completeText: "Lõpeta", previewText: "Eelvaade", editText: "Muuda", startSurveyText: "Alusta", otherItemText: "Muu (täpsusta)", noneItemText: "Mitte midagi", selectAllItemText: "Vali kõik", progressText: "Lehekülg {0}/{1}", panelDynamicProgressText: "Kirje {0}/{1}", questionsProgressText: "Vastatud {0} küsimust {1}-st", emptySurvey: "Selles uuringus ei ole ühtki nähtavat lehekülge või küsimust.", completingSurvey: "Aitäh, et vastasid ankeedile!", completingSurveyBefore: "Meie andmetel oled sa sellele ankeedile juba vastanud.", loadingSurvey: "Laen ankeeti...", optionsCaption: "Vali...", value: "väärtus", requiredError: "Palun vasta küsimusele.", requiredErrorInPanel: "Palun vasta vähemalt ühele küsimusele.", requiredInAllRowsError: "Palun anna vastus igal real.", numericError: "See peaks olema numbriline väärtus.", textMinLength: "Palun sisesta vähemalt {0} tähemärki.", textMaxLength: "Palun ära sisesta rohkem kui {0} tähemärki.", textMinMaxLength: "Sisesta palun {0} - {1} tähemärki.", minRowCountError: "Sisesta plaun vähemalt {0} rida.", minSelectError: "Palun vali vähemalt {0} varianti.", maxSelectError: "Palun vali kõige rohkem {0} varianti.", numericMinMax: "'{0}' peaks olema võrdne või suurem kui {1} ja võrdne või väiksem kui {2}", numericMin: "'{0}' peaks olema võrdne või suurem kui {1}", numericMax: "'{0}' peaks olema võrnde või väiksem kui {1}", invalidEmail: "Sisesta palun korrektne e-posti aadress.", invalidExpression: "Avaldis: {0} peaks tagastama tõese.", urlRequestError: "Taotlus tagastas vea „{0}”. {1}", urlGetChoicesError: "Taotlus tagastas tühjad andmed või atribuut 'path' on vale", exceedMaxSize: "Faili suurus ei tohi ületada {0}.", otherRequiredError: "Sisesta palun muu vastus.", uploadingFile: "Sinu fail laeb üles. Palun oota mõned sekundid ning proovi seejärel uuesti.", loadingFile: "Laen...", chooseFile: "Vali fail(id)...", noFileChosen: "Faili pole valitud", confirmDelete: "Kas tahad kirje kustutada?", keyDuplicationError: "See väärtus peab olema unikaalne.", addColumn: "Lisa veerg", addRow: "Lisa rida", removeRow: "Eemalda", addPanel: "Lisa uus", removePanel: "Eemalda", choices_Item: "üksus", matrix_column: "Veerg", matrix_row: "Rida", savingData: "Salvestan andmed serveris...", savingDataError: "Tekkis viga ning me ei saanud vastuseid salvestada.", savingDataSuccess: "Vastuste salvestamine õnnestus!", saveAgainButton: "Proovi uuesti", timerMin: "min", timerSec: "sek", timerSpentAll: "Oled veetnud {0} sellel lehel ning kokku {1}.", timerSpentPage: "Oled veetnud {0} sellel lehel.", timerSpentSurvey: "Oled veetnud {0} kokku.", timerLimitAll: "Oled kulutanud {0} võimalikust {1} sellel lehel ning {2} võimalikust {3} kokku.", timerLimitPage: "Oled kulutanud {0} võimalikust {1} sellel lehel.", timerLimitSurvey: "Oled kulutanud {0} võimalikust {1} koguajast.", cleanCaption: "Puhasta", clearCaption: "Puhasta", chooseFileCaption: "Vali fail", removeFileCaption: "Eemalda see fail", booleanCheckedLabel: "Jah", booleanUncheckedLabel: "Ei", confirmRemoveFile: "Oled sa kindel, et soovid selle faili eemaldada: {0}?", confirmRemoveAllFiles: "Oled sa kindel, et soovid eemaldada kõik failid?", questionTitlePatternText: "Küsimuse pealkiri", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["et"] = estonianSurveyStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["et"] = "eesti keel"; /***/ }), /***/ "./src/localization/finnish.ts": /*!*************************************!*\ !*** ./src/localization/finnish.ts ***! \*************************************/ /*! exports provided: finnishSurveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "finnishSurveyStrings", function() { return finnishSurveyStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var finnishSurveyStrings = { pagePrevText: "Edellinen", pageNextText: "Seuraava", completeText: "Valmis", previewText: "Esikatselu", editText: "Muokkaa", startSurveyText: "Aloita", otherItemText: "Muu (tarkenna)", noneItemText: "Ei mitään", selectAllItemText: "Valitse kaikki", progressText: "Sivu {0} / {1}", panelDynamicProgressText: "Osio {0} / {1}", questionsProgressText: "Olet vastannut {0} / {1} kysymykseen.", emptySurvey: "Tässä kyselyssä ei ole yhtään näkyvillä olevaa sivua tai kysymystä.", completingSurvey: "Kiitos kyselyyn vastaamisesta!", completingSurveyBefore: "Tietojemme mukaan olet jo suorittanut tämän kyselyn.", loadingSurvey: "Kyselyä ladataan palvelimelta...", optionsCaption: "Valitse...", value: "arvo", requiredError: "Vastaa kysymykseen, kiitos.", requiredErrorInPanel: "Vastaa ainakin yhteen kysymykseen.", requiredInAllRowsError: "Vastaa kysymyksiin kaikilla riveillä.", numericError: "Arvon tulee olla numeerinen.", textMinLength: "Syötä vähintään {0} merkkiä.", textMaxLength: "Älä syötä yli {0} merkkiä.", textMinMaxLength: "Syötä vähintään {0} ja enintään {1} merkkiä.", minRowCountError: "Täytä vähintään {0} riviä.", minSelectError: "Valitse vähintään {0} vaihtoehtoa.", maxSelectError: "Valitse enintään {0} vaihtoehtoa.", numericMinMax: "Luvun '{0}' tulee olla vähintään {1} ja korkeintaan {2}.", numericMin: "Luvun '{0}' tulee olla vähintään {1}.", numericMax: "Luvun '{0}' tulee olla korkeintaan {1}.", invalidEmail: "Syötä validi sähköpostiosoite.", invalidExpression: "Lausekkeen: {0} pitäisi palauttaa 'true'.", urlRequestError: "Pyyntö palautti virheen {0}. {1}", urlGetChoicesError: "Pyyntö palautti tyhjän tiedoston tai 'path'-asetus on väärä", exceedMaxSize: "Tiedoston koko ei saa olla suurempi kuin {0}.", otherRequiredError: "Tarkenna vastaustasi tekstikenttään.", uploadingFile: "Tiedostoa lähetetään. Odota muutama sekunti ja yritä uudelleen.", loadingFile: "Ladataan...", chooseFile: "Valitse tiedosto(t)...", noFileChosen: "Ei tiedostoa valittuna", confirmDelete: "Haluatko poistaa osion?", keyDuplicationError: "Tämä arvo on jo käytössä. Syötä toinen arvo.", addColumn: "Lisää sarake", addRow: "Lisää rivi", removeRow: "Poista", emptyRowsText: "Ei rivejä", addPanel: "Lisää uusi", removePanel: "Poista", choices_Item: "kohde", matrix_column: "Sarake", matrix_row: "Rivi", savingData: "Tietoja tallennetaan palvelimelle...", savingDataError: "Tapahtui virhe, emmekä voineet tallentaa kyselyn tietoja.", savingDataSuccess: "Tiedot tallennettiin onnistuneesti!", saveAgainButton: "Yritä uudelleen", timerMin: "min", timerSec: "sek", timerSpentAll: "Olet käyttänyt {0} tällä sivulla ja yhteensä {1}.", timerSpentPage: "Olet käyttänyt {0} tällä sivulla.", timerSpentSurvey: "Olet käyttänyt yhteensä {0}.", timerLimitAll: "Olet käyttänyt tällä sivulla {0} / {1} ja yhteensä {2} / {3}.", timerLimitPage: "Olet käyttänyt {0} / {1} tällä sivulla.", timerLimitSurvey: "Olet käyttänyt yhteensä {0} / {1}.", cleanCaption: "Pyyhi", clearCaption: "Tyhjennä", chooseFileCaption: "Valitse tiedosto", removeFileCaption: "Poista tämä tiedosto", booleanCheckedLabel: "Kyllä", booleanUncheckedLabel: "Ei", confirmRemoveFile: "Haluatko varmasti poistaa tämän tiedoston: {0}?", confirmRemoveAllFiles: "Haluatko varmasti poistaa kaikki tiedostot?", questionTitlePatternText: "Kysymyksen otsikko", modalCancelButtonText: "Peruuta", modalApplyButtonText: "Käytä", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["fi"] = finnishSurveyStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["fi"] = "suomi"; /***/ }), /***/ "./src/localization/french.ts": /*!************************************!*\ !*** ./src/localization/french.ts ***! \************************************/ /*! exports provided: frenchSurveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "frenchSurveyStrings", function() { return frenchSurveyStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var frenchSurveyStrings = { pagePrevText: "Précédent", pageNextText: "Suivant", completeText: "Terminer", previewText: "Aperçu", editText: "Modifier", startSurveyText: "Commencer", otherItemText: "Autre (préciser)", noneItemText: "Aucun", selectAllItemText: "Tout sélectionner", progressText: "Page {0} sur {1}", panelDynamicProgressText: "Enregistrement {0} sur {1}", questionsProgressText: "{0}/{1} question(s) répondue(s)", emptySurvey: "Il n'y a ni page visible ni question visible dans ce questionnaire", completingSurvey: "Merci d'avoir répondu au questionnaire !", completingSurveyBefore: "Nos données indiquent que vous avez déjà rempli ce questionnaire.", loadingSurvey: "Le questionnaire est en cours de chargement...", optionsCaption: "Choisissez...", value: "valeur", requiredError: "La réponse à cette question est obligatoire.", requiredErrorInPanel: "Merci de répondre au moins à une question.", requiredInAllRowsError: "Toutes les lignes sont obligatoires", numericError: "La réponse doit être un nombre.", textMinLength: "Merci de saisir au moins {0} caractères.", textMaxLength: "Merci de saisir moins de {0} caractères.", textMinMaxLength: "Merci de saisir entre {0} et {1} caractères.", minRowCountError: "Merci de compléter au moins {0} lignes.", minSelectError: "Merci de sélectionner au minimum {0} réponses.", maxSelectError: "Merci de sélectionner au maximum {0} réponses.", numericMinMax: "Votre réponse '{0}' doit être supérieure ou égale à {1} et inférieure ou égale à {2}", numericMin: "Votre réponse '{0}' doit être supérieure ou égale à {1}", numericMax: "Votre réponse '{0}' doit être inférieure ou égale à {1}", invalidEmail: "Merci d'entrer une adresse mail valide.", invalidExpression: "L'expression: {0} doit retourner 'true'.", urlRequestError: "La requête a renvoyé une erreur '{0}'. {1}", urlGetChoicesError: "La requête a renvoyé des données vides ou la propriété 'path' est incorrecte", exceedMaxSize: "La taille du fichier ne doit pas excéder {0}.", otherRequiredError: "Merci de préciser le champ 'Autre'.", uploadingFile: "Votre fichier est en cours de chargement. Merci d'attendre quelques secondes et de réessayer.", loadingFile: "Chargement...", chooseFile: "Ajouter des fichiers...", noFileChosen: "Aucun fichier ajouté", confirmDelete: "Voulez-vous supprimer cet enregistrement ?", keyDuplicationError: "Cette valeur doit être unique.", addColumn: "Ajouter une colonne", addRow: "Ajouter une ligne", removeRow: "Supprimer", addPanel: "Ajouter", removePanel: "Supprimer", choices_Item: "item", matrix_column: "Colonne", matrix_row: "Ligne", savingData: "Les résultats sont en cours de sauvegarde sur le serveur...", savingDataError: "Une erreur est survenue et a empêché la sauvegarde des résultats.", savingDataSuccess: "Les résultats ont bien été enregistrés !", saveAgainButton: "Réessayer", timerMin: "min", timerSec: "sec", timerSpentAll: "Vous avez passé {0} sur cette page et {1} au total.", timerSpentPage: "Vous avez passé {0} sur cette page.", timerSpentSurvey: "Vous avez passé {0} au total.", timerLimitAll: "Vous avez passé {0} sur {1} sur cette page et {2} sur {3} au total.", timerLimitPage: "Vous avez passé {0} sur {1} sur cette page.", timerLimitSurvey: "Vous avez passé {0} sur {1} au total.", cleanCaption: "Nettoyer", clearCaption: "Vider", chooseFileCaption: "Ajouter un fichier", removeFileCaption: "Enlever ce fichier", booleanCheckedLabel: "Oui", booleanUncheckedLabel: "Non", confirmRemoveFile: "Êtes-vous certains de vouloir supprimer ce fichier : {0}?", confirmRemoveAllFiles: "Êtes-vous certains de vouloir supprimer tous les fichiers?", questionTitlePatternText: "Titre de la question", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["fr"] = frenchSurveyStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["fr"] = "français"; /***/ }), /***/ "./src/localization/georgian.ts": /*!**************************************!*\ !*** ./src/localization/georgian.ts ***! \**************************************/ /*! exports provided: georgianSurveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "georgianSurveyStrings", function() { return georgianSurveyStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var georgianSurveyStrings = { pagePrevText: "უკან", pageNextText: "შემდეგ", completeText: "დასრულება", progressText: "გვერდი {0} / {1}", emptySurvey: "არცერთი კითხვა არ არის.", completingSurvey: "გმადლობთ კითხვარის შევსებისთვის!", loadingSurvey: "ჩატვირთვა სერვერიდან...", otherItemText: "სხვა (გთხოვთ მიუთითეთ)", optionsCaption: "არჩევა...", requiredError: "გთხოვთ უპასუხეთ კითხვას.", numericError: "პასუხი უნდა იყოს რიცხვი.", textMinLength: "გთხოვთ შეიყვანეთ არანაკლებ {0} სიმბოლო.", minSelectError: "გთხოვთ აირჩიეთ არანაკლებ {0} ვარიანტი.", maxSelectError: "გთხოვთ აირჩიეთ არაუმეტეს {0} ვარიანტი.", numericMinMax: "'{0}' უნდა იყოს მეტი ან ტოლი, ვიდრე {1}, და ნაკლები ან ტოლი ვიდრე {2}", numericMin: "'{0}' უნდა იყოს მეტი ან ტოლი ვიდრე {1}", numericMax: "'{0}' უნდა იყოს ნაკლები ან ტოლი ვიდრე {1}", invalidEmail: "გთხოვთ შეიყვანოთ ელ. ფოსტის რეალური მისამართი.", otherRequiredEror: "გთხოვთ შეავსეთ ველი 'სხვა'" }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["ka"] = georgianSurveyStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["ka"] = "ქართული"; /***/ }), /***/ "./src/localization/german.ts": /*!************************************!*\ !*** ./src/localization/german.ts ***! \************************************/ /*! exports provided: germanSurveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "germanSurveyStrings", function() { return germanSurveyStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var germanSurveyStrings = { pagePrevText: "Zurück", pageNextText: "Weiter", completeText: "Abschließen", previewText: "Vorschau", editText: "Bearbeiten", startSurveyText: "Start", otherItemText: "Sonstiges (Bitte angeben)", noneItemText: "Nichts trifft zu", selectAllItemText: "Alles auswählen", progressText: "Seite {0} von {1}", panelDynamicProgressText: "Eintrag {0} von {1}", questionsProgressText: "{0}/{1} Fragen beantwortet", emptySurvey: "Es sind keine Fragen vorhanden.", completingSurvey: "Vielen Dank, dass Sie die Umfrage abgeschlossen haben!", completingSurveyBefore: "Wir haben festgestellt, dass Sie diese Umfrage bereits abgeschlossen haben.", loadingSurvey: "Umfrage wird geladen...", optionsCaption: "Bitte auswählen...", value: "Wert", requiredError: "Bitte beantworten Sie diese Frage.", requiredErrorInPanel: "Bitte beantworten Sie mindestens eine Frage.", requiredInAllRowsError: "Bitte beantworten Sie alle Fragen.", numericError: "Der Wert muss eine Zahl sein.", textMinLength: "Bitte geben Sie mindestens {0} Zeichen ein.", textMaxLength: "Bitte geben Sie nicht mehr als {0} Zeichen ein.", textMinMaxLength: "Bitte geben Sie mindestens {0} und maximal {1} Zeichen ein.", minRowCountError: "Bitte machen Sie in mindestens {0} Zeilen eine Eingabe.", minSelectError: "Bitte wählen Sie mindestens {0} Antwort(en) aus.", maxSelectError: "Bitte wählen Sie nicht mehr als {0} Antwort(en) aus.", numericMinMax: "'{0}' muss größer oder gleich {1} und kleiner oder gleich {2} sein", numericMin: "'{0}' muss größer oder gleich {1} sein", numericMax: "'{0}' muss kleiner oder gleich {1} sein", invalidEmail: "Bitte geben Sie eine gültige E-Mail-Adresse ein.", invalidExpression: "Der Ausdruck: {0} muss den Wert 'wahr' zurückgeben.", urlRequestError: "Ein Netzwerkdienst hat folgenden Fehler zurückgegeben '{0}'. {1}", urlGetChoicesError: "Eine Netzwerkdienst hat ungültige Daten zurückgegeben", exceedMaxSize: "Die Datei darf nicht größer als {0} sein.", otherRequiredError: "Bitte geben Sie einen Wert an.", uploadingFile: "Bitte warten Sie bis der Upload Ihrer Dateien abgeschlossen ist.", loadingFile: "Wird hochgeladen...", chooseFile: "Datei(en) auswählen...", noFileChosen: "Keine Datei ausgewählt", confirmDelete: "Wollen Sie den Eintrag löschen?", keyDuplicationError: "Dieser Wert muss einmalig sein.", addColumn: "Spalte hinzufügen", addRow: "Zeile hinzufügen", removeRow: "Entfernen", addPanel: "Neu hinzufügen", removePanel: "Entfernen", choices_Item: "Element", matrix_column: "Spalte", matrix_row: "Zeile", savingData: "Die Ergebnisse werden auf dem Server gespeichert...", savingDataError: "Es ist ein Fehler aufgetreten. Die Ergebnisse konnten nicht gespeichert werden.", savingDataSuccess: "Die Ergebnisse wurden gespeichert!", saveAgainButton: "Erneut absenden", timerMin: "Min.", timerSec: "Sek.", timerSpentAll: "Sie waren {0} auf dieser Seite und brauchten insgesamt {1}.", timerSpentPage: "Sie waren {0} auf dieser Seite.", timerSpentSurvey: "Sie haben insgesamt {0} gebraucht.", timerLimitAll: "Sie waren {0} von {1} auf dieser Seite und brauchten insgesamt {2} von {3}.", timerLimitPage: "Sie waren {0} von {1} auf dieser Seite.", timerLimitSurvey: "Sie haben insgesamt {0} von {1} gebraucht.", cleanCaption: "Alles löschen", clearCaption: "Auswahl entfernen", chooseFileCaption: "Datei auswählen", removeFileCaption: "Datei löschen", booleanCheckedLabel: "Ja", booleanUncheckedLabel: "Nein", confirmRemoveFile: "Sind Sie sicher, dass Sie diese Datei löschen möchten: {0}?", confirmRemoveAllFiles: "Sind Sie sicher, dass Sie alle Dateien löschen möchten?", questionTitlePatternText: "Fragentitel", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["de"] = germanSurveyStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["de"] = "deutsch"; /***/ }), /***/ "./src/localization/greek.ts": /*!***********************************!*\ !*** ./src/localization/greek.ts ***! \***********************************/ /*! exports provided: greekSurveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "greekSurveyStrings", function() { return greekSurveyStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); //Created by https://github.com/agelospanagiotakis var greekSurveyStrings = { pagePrevText: "Προηγούμενο", pageNextText: "Επόμενο", completeText: "Ολοκλήρωση", previewText: "Προεπισκόπηση", editText: "Επεξεργασία", startSurveyText: "Αρχή", otherItemText: "Άλλο (παρακαλώ διευκρινίστε)", noneItemText: "Κανένας", selectAllItemText: "Επιλογή όλων", progressText: "Σελίδα {0} από {1}", panelDynamicProgressText: "Εγγραφή {0} από {1}", questionsProgressText: "Απαντήθηκαν {0} / {1} ερωτήσεις", emptySurvey: "Δεν υπάρχει καμία ορατή σελίδα ή ορατή ερώτηση σε αυτό το ερωτηματολόγιο.", completingSurvey: "Ευχαριστούμε για την συμπλήρωση αυτού του ερωτηματολογίου!", completingSurveyBefore: "Τα αρχεία μας δείχνουν ότι έχετε ήδη ολοκληρώσει αυτήν την έρευνα.", loadingSurvey: "Το ερωτηματολόγιο φορτώνεται απο το διακομιστή...", optionsCaption: "Επιλέξτε...", value: "αξία", requiredError: "Παρακαλώ απαντήστε στην ερώτηση.", requiredErrorInPanel: "Απαντήστε σε τουλάχιστον μία ερώτηση.", requiredInAllRowsError: "Παρακαλώ απαντήστε στις ερωτήσεις σε όλες τις γραμμές.", numericError: "Η τιμή πρέπει να είναι αριθμητική.", textMinLength: "Παρακαλώ συμπληρώστε τουλάχιστον {0} σύμβολα.", textMaxLength: "Εισαγάγετε λιγότερους από {0} χαρακτήρες.", textMinMaxLength: "Εισαγάγετε περισσότερους από {0} και λιγότερους από {1} χαρακτήρες.", minRowCountError: "Παρακαλώ συμπληρώστε τουλάχιστον {0} γραμμές.", minSelectError: "Παρακαλώ επιλέξτε τουλάχιστον {0} παραλλαγές.", maxSelectError: "Παρακαλώ επιλέξτε όχι παραπάνω απο {0} παραλλαγές.", numericMinMax: "Το '{0}' θα πρέπει να είναι ίσο ή μεγαλύτερο απο το {1} και ίσο ή μικρότερο απο το {2}", numericMin: "Το '{0}' πρέπει να είναι μεγαλύτερο ή ισο με το {1}", numericMax: "Το '{0}' πρέπει να είναι μικρότερο ή ίσο απο το {1}", invalidEmail: "Παρακαλώ δώστε μια αποδεκτή διεύθυνση e-mail.", invalidExpression: "Η έκφραση: {0} θα πρέπει να επιστρέψει 'true'.", urlRequestError: "Η αίτηση επέστρεψε σφάλμα '{0}'. {1}", urlGetChoicesError: "Η αίτηση επέστρεψε κενά δεδομένα ή η ιδιότητα 'μονοπάτι/path' είναι εσφαλμένη", exceedMaxSize: "Το μέγεθος δεν μπορεί να υπερβαίνει τα {0}.", otherRequiredError: "Παρακαλώ συμπληρώστε την τιμή για το πεδίο 'άλλο'.", uploadingFile: "Το αρχείο σας ανεβαίνει. Παρακαλώ περιμένετε καποια δευτερόλεπτα και δοκιμάστε ξανά.", loadingFile: "Φόρτωση...", chooseFile: "Επιλογή αρχείων ...", noFileChosen: "Δεν έχει επιλεγεί αρχείο", confirmDelete: "Θέλετε να διαγράψετε την εγγραφή;", keyDuplicationError: "Αυτή η τιμή πρέπει να είναι μοναδική.", addColumn: "Προσθήκη στήλης", addRow: "Προσθήκη γραμμής", removeRow: "Αφαίρεση", addPanel: "Προσθεσε νεο", removePanel: "Αφαιρώ", choices_Item: "είδος", matrix_column: "Στήλη", matrix_row: "Σειρά", savingData: "Τα αποτελέσματα αποθηκεύονται στον διακομιστή ...", savingDataError: "Παρουσιάστηκε σφάλμα και δεν ήταν δυνατή η αποθήκευση των αποτελεσμάτων.", savingDataSuccess: "Τα αποτελέσματα αποθηκεύτηκαν με επιτυχία!", saveAgainButton: "Προσπάθησε ξανά", timerMin: "ελάχ", timerSec: "δευτ", timerSpentAll: "Έχετε δαπανήσει {0} σε αυτήν τη σελίδα και {1} συνολικά.", timerSpentPage: "Έχετε ξοδέψει {0} σε αυτήν τη σελίδα.", timerSpentSurvey: "Έχετε ξοδέψει συνολικά {0}.", timerLimitAll: "Έχετε δαπανήσει {0} από {1} σε αυτήν τη σελίδα και {2} από {3} συνολικά.", timerLimitPage: "Έχετε ξοδέψει {0} από {1} σε αυτήν τη σελίδα.", timerLimitSurvey: "Έχετε ξοδέψει {0} από {1} συνολικά.", cleanCaption: "ΚΑΘΑΡΗ", clearCaption: "Σαφή", chooseFileCaption: "Επιλέξτε το αρχείο", removeFileCaption: "Καταργήστε αυτό το αρχείο", booleanCheckedLabel: "Ναί", booleanUncheckedLabel: "Οχι", confirmRemoveFile: "Είστε βέβαιοι ότι θέλετε να καταργήσετε αυτό το αρχείο: {0};", confirmRemoveAllFiles: "Είστε βέβαιοι ότι θέλετε να καταργήσετε όλα τα αρχεία;", questionTitlePatternText: "Τίτλος ερώτησης", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["gr"] = greekSurveyStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["gr"] = "ελληνικά"; /***/ }), /***/ "./src/localization/hebrew.ts": /*!************************************!*\ !*** ./src/localization/hebrew.ts ***! \************************************/ /*! exports provided: hebrewSurveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hebrewSurveyStrings", function() { return hebrewSurveyStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var hebrewSurveyStrings = { pagePrevText: "אחורה", pageNextText: "קדימה", completeText: "סיום", previewText: "תצוגה מקדימה", editText: "לַעֲרוֹך", startSurveyText: "הַתחָלָה", otherItemText: "אחר (נא לתאר)", noneItemText: "אף אחד", selectAllItemText: "בחר הכל", progressText: "דף {1} מתוך {0}", panelDynamicProgressText: "הקלטה {0} מתוך {1}", questionsProgressText: "ענה על שאלות", emptySurvey: "אין שאלות", completingSurvey: "תודה על מילוי השאלון!", completingSurveyBefore: "הרשומות שלנו מראות שכבר סיימת את הסקר הזה.", loadingSurvey: "טעינה מהשרת...", optionsCaption: "בחר...", value: "ערך", requiredError: "אנא השב על השאלה", requiredErrorInPanel: "אנא ענה לפחות על שאלה אחת.", requiredInAllRowsError: "אנא ענה על שאלות בכל השורות.", numericError: "התשובה צריכה להיות מספר.", textMinLength: "הזן לפחות {0} תווים.", textMaxLength: "הזן פחות מ- {0} תווים.", textMinMaxLength: "הזן יותר מ- {0} ופחות מ- {1} תווים.", minRowCountError: "אנא מלא לפחות {0} שורות.", minSelectError: "בחר לפחות {0} אפשרויות.", maxSelectError: "בחר עד {0} אפשרויות.", numericMinMax: "'{0}' חייב להיות שווה או גדול מ {1}, ושווה ל- {2} או פחות מ- {}}", numericMin: "'{0}' חייב להיות שווה או גדול מ {1}", numericMax: "'{0}' חייב להיות שווה או קטן מ {1}", invalidEmail: 'הזן כתובת דוא"ל חוקית.', invalidExpression: "הביטוי: {0} צריך להחזיר 'אמת'.", urlRequestError: "הבקשה החזירה את השגיאה '{0}'. {1}", urlGetChoicesError: "הבקשה החזירה נתונים ריקים או שהמאפיין 'נתיב' שגוי", exceedMaxSize: "גודל הקובץ לא יעלה על {0}.", otherRequiredError: 'נא להזין נתונים בשדה "אחר"', uploadingFile: "הקובץ שלך נטען. המתן מספר שניות ונסה שוב.", loadingFile: "טוען...", chooseFile: "לבחור קבצים...", noFileChosen: "לא נבחר קובץ", confirmDelete: "האם אתה רוצה למחוק את הרשומה?", keyDuplicationError: "ערך זה צריך להיות ייחודי.", addColumn: "הוסף עמודה", addRow: "להוסיף שורה", removeRow: "לְהַסִיר", addPanel: "הוסף חדש", removePanel: "לְהַסִיר", choices_Item: "פריט", matrix_column: "טור", matrix_row: "שׁוּרָה", savingData: "התוצאות נשמרות בשרת ...", savingDataError: "אירעה שגיאה ולא הצלחנו לשמור את התוצאות.", savingDataSuccess: "התוצאות נשמרו בהצלחה!", saveAgainButton: "נסה שוב", timerMin: "דקה", timerSec: "שניות", timerSpentAll: "הוצאת {0} בדף זה ובסך הכל {1}.", timerSpentPage: "הוצאת {0} בדף זה.", timerSpentSurvey: "הוצאת סכום כולל של {0}.", timerLimitAll: "הוצאת {0} מתוך {1} בדף זה ו- {2} מתוך {3} בסך הכל.", timerLimitPage: "הוצאת {0} מתוך {1} בדף זה.", timerLimitSurvey: "הוצאת סכום כולל של {0} מתוך {1}.", cleanCaption: "לְנַקוֹת", clearCaption: "ברור", chooseFileCaption: "בחר קובץ", removeFileCaption: "הסר קובץ זה", booleanCheckedLabel: "כן", booleanUncheckedLabel: "לא", confirmRemoveFile: "האם אתה בטוח שברצונך להסיר קובץ זה: {0}?", confirmRemoveAllFiles: "האם אתה בטוח שברצונך להסיר את כל הקבצים?", questionTitlePatternText: "כותרת שאלה", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["he"] = hebrewSurveyStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["he"] = "עברית"; /***/ }), /***/ "./src/localization/hindi.ts": /*!***********************************!*\ !*** ./src/localization/hindi.ts ***! \***********************************/ /*! exports provided: hindiStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hindiStrings", function() { return hindiStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var hindiStrings = { pagePrevText: "पिछला", pageNextText: "अगला", completeText: "पूरा", previewText: "पूर्वसमीक्षा", editText: "संपादित", startSurveyText: "शुरू", otherItemText: "दूसरा (वर्णन करें)", noneItemTex: "कोई नहीं", selectAllItemText: "सभी का चयन करें", progressText: "पृष्ठ 1 में से 0", panelDynamicProgressText: " दस्तावेज {1} के {0}", questionsProgressText: "{1} सवालों में से {0} के जवाब दिए", emptySurvey: "सर्वेक्षण में कोई दृश्यमान पृष्ठ या प्रश्न नहीं है", completingSurvey: "सर्वेक्षण को पूरा करने के लिए धन्यवाद", completingSurveyBefore: " हमारे रिकॉर्ड बताते हैं कि आप पहले ही इस सर्वेक्षण को पूरा कर चुके हैं", loadingSurvey: "सर्वेक्षण खुल रहा है.…", optionsCaption: "चुनें", value: "मूल्य", requiredError: "कृपया प्रश्न का उत्तर दें", requiredErrorInPanel: "कृपया कम से कम एक प्रश्न का उत्तर दें", requiredInAllRowsError: "कृपया सभी पंक्तियों में सवालों के जवाब दें", numericError: "मूल्य संख्यात्मक होना चाहिए", textMinLength: "कृपया कम से कम {0} वर्ण दर्ज करें", textMaxLength: "कृपया {0} से कम वर्ण दर्ज करें", textMinMaxLength: "कृपया {0} से अधिक और {1} से कम पात्रों में प्रवेश करें", minRowCountError: "कृपया कम से कम {0} पंक्तियों को भरें", minSelectError: "कृपया कम से कम {0} विकल्प का चयन करें", maxSelectError: "कृपया {0} विकल्पों से अधिक नहीं चुनें", numericMinMax: "'{0}' {1} से बराबर या अधिक और {2} से बराबर या कम होना चाहिए", numericMin: "'{0}' {1} से बराबर या अधिक होना चाहिए", numericMax: "'{0}' {1} से बराबर या कम होना चाहिए", invalidEmail: "कृपया एक वैध ईमेल पता दर्ज करें", invalidExpression: "अभिव्यक्ति: {0} को ' सच ' लौटना चाहिए", urlRequestError: "अनुरोध लौटाया त्रुटि '{0}' . {1}", urlGetChoicesError: "अनुरोध ने खाली डेटा वापस कर दिया है ", exceedMaxSize: "फ़ाइल का आकार {0} से अधिक नहीं होना चाहिए या फिर 'पाथ' प्रॉपर्टी गलत है", otherRequiredError: "कृपया दूसरा मूल्य दर्ज करें", uploadingFile: "आपकी फाइल अपलोड हो रही है। कृपया कई सेकंड इंतजार करें और फिर से प्रयास करें।", loadingFile: "लोडिंग", chooseFile: "फ़ाइल चुनें", noFileChosen: "कोई फाइल नहीं चुनी गई", confirmDelete: "क्या आप रिकॉर्ड हटाना चाहते हैं", keyDuplicationError: "यह मान अनोखा होना चाहिए", addColumn: "कॉलम जोड़ें", addRow: "पंक्ति जोड़ें", removeRow: "हटाए", addPanel: "नया जोड़ें", removePanel: "हटाए", choices_Item: "मद", matrix_column: "कॉलम", matrix_row: "पंक्ति", savingData: "परिणाम सर्वर पर सेव हो रहे हैं", savingDataError: "एक त्रुटि हुई और हम परिणामों को नहीं सेव कर सके", savingDataSuccess: "परिणाम सफलतापूर्वक सेव हो गए", saveAgainButton: "फिर कोशिश करो", timerMin: "मिनट", timerSec: "सेकंड", timerSpentAll: "आपने इस पृष्ठ पर {0} खर्च किए हैं और कुल {1}", timerSpentPage: "आपने इस पृष्ठ पर {0} खर्च किया है", timerSpentSurvey: "आपने कुल {0} खर्च किया है", timerLimitAll: "आपने इस पृष्ठ पर {1} की {0} और कुल {3} की {2} खर्च की है।", timerLimitPage: "आपने इस पृष्ठ पर {1} का {0} खर्च किया है", timerLimitSurvey: "आपने कुल {1} की {0} खर्च की है", cleanCaption: "साफ", clearCaption: "स्पष्ट", chooseFileCaption: "फ़ाइल चुनें", removeFileCaption: "इस फाइल को निकालें", booleanCheckedLabel: "हाँ", booleanUncheckedLabel: "नहीं", confirmRemoveFile: "क्या आप सुनिश्चित हैं कि आप इस फ़ाइल को हटाना चाहते हैं: {0}", confirmRemoveAllFiles: "क्या आप सुनिश्चित हैं कि आप सभी फ़ाइलों को हटाना चाहते हैं", questionTitlePatternText: "प्रश्न का शीर्षक", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["hi"] = hindiStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["hi"] = "hindi"; /***/ }), /***/ "./src/localization/hungarian.ts": /*!***************************************!*\ !*** ./src/localization/hungarian.ts ***! \***************************************/ /*! exports provided: hungarianSurveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hungarianSurveyStrings", function() { return hungarianSurveyStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var hungarianSurveyStrings = { pagePrevText: "Vissza", pageNextText: "Tovább", completeText: "Kész", previewText: "Előnézet", editText: "Szerkesztés", startSurveyText: "Rajt", otherItemText: "Egyéb (adja meg)", noneItemText: "Egyik sem", selectAllItemText: "Mindet kiválaszt", progressText: "{0}./{1} oldal", panelDynamicProgressText: "{0} / {1} rekord", questionsProgressText: "Válaszolt kérdések: {0} / {1}", emptySurvey: "There is no visible page or question in the survey.", completingSurvey: "Köszönjük, hogy kitöltötte felmérésünket!", completingSurveyBefore: "Már kitöltötte a felmérést.", loadingSurvey: "Felmérés betöltése...", optionsCaption: "Válasszon...", value: "érték", requiredError: "Kérjük, válaszolja meg ezt a kérdést!", requiredErrorInPanel: "Kérjük, válaszoljon legalább egy kérdésre.", requiredInAllRowsError: "Kérjük adjon választ minden sorban!", numericError: "Az érték szám kell, hogy legyen!", textMinLength: "Adjon meg legalább {0} karaktert!", textMaxLength: "Legfeljebb {0} karaktert adjon meg!", textMinMaxLength: "Adjon meg legalább {0}, de legfeljebb {1} karaktert!", minRowCountError: "Töltsön ki minimum {0} sort!", minSelectError: "Válasszon ki legalább {0} lehetőséget!", maxSelectError: "Ne válasszon többet, mint {0} lehetőség!", numericMinMax: "'{0}' legyen nagyobb, vagy egyenlő, mint {1} és kisebb, vagy egyenlő, mint {2}!", numericMin: "'{0}' legyen legalább {1}!", numericMax: "The '{0}' ne legyen nagyobb, mint {1}!", invalidEmail: "Adjon meg egy valós email címet!", invalidExpression: "A következő kifejezés: {0} vissza kell adnia az „igaz” értéket.", urlRequestError: "A lekérdezés hibával tért vissza: '{0}'. {1}", urlGetChoicesError: "A lekérdezés üres adattal tért vissza, vagy a 'path' paraméter helytelen.", exceedMaxSize: "A méret nem lehet nagyobb, mint {0}.", otherRequiredError: "Adja meg az egyéb értéket!", uploadingFile: "Feltöltés folyamatban. Várjon pár másodpercet, majd próbálja újra.", loadingFile: "Betöltés...", chooseFile: "Fájlok kiválasztása ...", noFileChosen: "Nincs kiválasztva fájl", confirmDelete: "Törli ezt a rekordot?", keyDuplicationError: "Az értéknek egyedinek kell lennie.", addColumn: "Oszlop hozzáadása", addRow: "Sor hozzáadása", removeRow: "Eltávolítás", addPanel: "Új hozzáadása", removePanel: "Eltávolítás", choices_Item: "elem", matrix_column: "Oszlop", matrix_row: "Sor", savingData: "Eredmény mentése a szerverre...", savingDataError: "Egy hiba folytán nem tudtuk elmenteni az eredményt.", savingDataSuccess: "Eredmény sikeresen mentve!", saveAgainButton: "Próbálja újra", timerMin: "min", timerSec: "sec", timerSpentAll: "Ön {0} összeget költött ezen az oldalon, és összesen {1}.", timerSpentPage: "{0} összeget költött ezen az oldalon.", timerSpentSurvey: "Összesen {0} költött.", timerLimitAll: "Ön {0} / {1} összeget költött ezen az oldalon, és összesen {2} / {3}.", timerLimitPage: "Ön {0} / {1} összeget költött ezen az oldalon.", timerLimitSurvey: "Összesen {0} / {1} összeget költött el.", cleanCaption: "Tiszta", clearCaption: "Egyértelmű", chooseFileCaption: "Válassz fájlt", removeFileCaption: "Távolítsa el ezt a fájlt", booleanCheckedLabel: "Igen", booleanUncheckedLabel: "Nem", confirmRemoveFile: "Biztosan eltávolítja ezt a fájlt: {0}?", confirmRemoveAllFiles: "Biztosan el akarja távolítani az összes fájlt?", questionTitlePatternText: "Kérdés címe", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["hu"] = hungarianSurveyStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["hu"] = "magyar"; /***/ }), /***/ "./src/localization/icelandic.ts": /*!***************************************!*\ !*** ./src/localization/icelandic.ts ***! \***************************************/ /*! exports provided: icelandicSurveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "icelandicSurveyStrings", function() { return icelandicSurveyStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var icelandicSurveyStrings = { pagePrevText: "Tilbaka", pageNextText: "Áfram", completeText: "Lokið", previewText: "Forskoða", editText: "Breyta", startSurveyText: "Byrjaðu", otherItemText: "Hinn (skýring)", noneItemText: "Enginn", selectAllItemText: "Velja allt", progressText: "Síða {0} of {1}", panelDynamicProgressText: "Taka upp {0} af {1}", questionsProgressText: "Svarað {0} / {1} spurningum", emptySurvey: "Það er enginn síða eða spurningar í þessari könnun.", completingSurvey: "Takk fyrir að fyllja út þessa könnun!", completingSurveyBefore: "Skrár okkar sýna að þú hefur þegar lokið þessari könnun.", loadingSurvey: "Könnunin er að hlaða...", optionsCaption: "Veldu...", value: "gildi", requiredError: "Vinsamlegast svarið spurningunni.", requiredErrorInPanel: "Vinsamlegast svaraðu að minnsta kosti einni spurningu.", requiredInAllRowsError: "Vinsamlegast svarið spurningum í öllum röðum.", numericError: "Þetta gildi verður að vera tala.", textMinLength: "Það ætti að vera minnst {0} tákn.", textMaxLength: "Það ætti að vera mest {0} tákn.", textMinMaxLength: "Það ætti að vera fleiri en {0} og færri en {1} tákn.", minRowCountError: "Vinsamlegast fyllið úr að minnsta kosti {0} raðir.", minSelectError: "Vinsamlegast veljið að minnsta kosti {0} möguleika.", maxSelectError: "Vinsamlegast veljið ekki fleiri en {0} möguleika.", numericMinMax: "'{0}' ætti að vera meira en eða jafnt og {1} minna en eða jafnt og {2}", numericMin: "{0}' ætti að vera meira en eða jafnt og {1}", numericMax: "'{0}' ætti að vera minna en eða jafnt og {1}", invalidEmail: "Vinsamlegast sláið inn gilt netfang.", invalidExpression: "Tjáningin: {0} ætti að skila 'satt'.", urlRequestError: "Beiðninn skilaði eftirfaranadi villu '{0}'. {1}", urlGetChoicesError: "Beiðninng skilaði engum gögnum eða slóðinn var röng", exceedMaxSize: "Skráinn skal ekki vera stærri en {0}.", otherRequiredError: "Vinamlegast fyllið út hitt gildið.", uploadingFile: "Skráinn þín var send. Vinsamlegast bíðið í nokkrar sekúndur og reynið aftur.", loadingFile: "Hleður ...", chooseFile: "Veldu skrár ...", noFileChosen: "Engin skrá valin", confirmDelete: "Viltu eyða skránni?", keyDuplicationError: "Þetta gildi ætti að vera einstakt.", addColumn: "Bæta við dálki", addRow: "Bæta við röð", removeRow: "Fjarlægja", addPanel: "Bæta við nýju", removePanel: "Fjarlægðu", choices_Item: "hlutur", matrix_column: "Dálkur", matrix_row: "Röð", savingData: "Niðurstöðurnar eru að spara á netþjóninum ... ", savingDataError: "Villa kom upp og við gátum ekki vistað niðurstöðurnar.", savingDataSuccess: "Árangurinn var vistaður með góðum árangri!", saveAgainButton: "Reyndu aftur", timerMin: "mín", timerSec: "sek", timerSpentAll: "Þú hefur eytt {0} á þessari síðu og {1} samtals.", timerSpentPage: "Þú hefur eytt {0} á þessari síðu.", timerSpentSurvey: "Þú hefur eytt {0} samtals.", timerLimitAll: "Þú hefur eytt {0} af {1} á þessari síðu og {2} af {3} samtals.", timerLimitPage: "Þú hefur eytt {0} af {1} á þessari síðu.", timerLimitSurvey: "Þú hefur eytt {0} af {1} samtals.", cleanCaption: "Hreint", clearCaption: "Hreinsa", chooseFileCaption: "Veldu skrá", removeFileCaption: "Fjarlægðu þessa skrá", booleanCheckedLabel: "Já", booleanUncheckedLabel: "Nei", confirmRemoveFile: "Ertu viss um að þú viljir fjarlægja þessa skrá: {0}?", confirmRemoveAllFiles: "Ertu viss um að þú viljir fjarlægja allar skrár?", questionTitlePatternText: "Spurningartitill", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["is"] = icelandicSurveyStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["is"] = "íslenska"; /***/ }), /***/ "./src/localization/indonesian.ts": /*!****************************************!*\ !*** ./src/localization/indonesian.ts ***! \****************************************/ /*! exports provided: indonesianStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "indonesianStrings", function() { return indonesianStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var indonesianStrings = { pagePrevText: "Sebelumnya", pageNextText: "Selanjutnya", completeText: "Selesai", previewText: "Pratinjau", editText: "Sunting", startSurveyText: "Mulai", otherItemText: "Lainnya (jelaskan)", noneItemText: "Tidak Ada", selectAllItemText: "Pilih Semua", progressText: "Halaman {0} dari {1}", panelDynamicProgressText: "Rekam {0} dari {1}", questionsProgressText: "Menjawab pertanyaan {0} / {1}", emptySurvey: "Tidak ada halaman atau pertanyaan dalam survei.", completingSurvey: "Terima kasih telah menyelesaikan survei!", completingSurveyBefore: "Catatan kami menunjukkan bahwa Anda telah menyelesaikan survei ini.", loadingSurvey: "Memuat survei...", optionsCaption: "Pilih...", value: "nilai", requiredError: "Silahkan jawab pertanyaan berikut.", requiredErrorInPanel: "Silahkan jawab setidaknya satu petanyaan.", requiredInAllRowsError: "Silahkan jawab pertanyaan pada semua baris.", numericError: "Nilai harus berupa angka.", textMinLength: "Silahkan masukkan setidaknya {0} karakter.", textMaxLength: "Silahkan masukkan kurang {0} karakter.", textMinMaxLength: "PSilahkan masukkan lebih dari {0} dan kurang dari {1} karakter.", minRowCountError: "Silahkan isi setidaknya {0} baris.", minSelectError: "Silahkan pilih setidaknya {0} varian.", maxSelectError: "Silahkan pilih tidak lebih dari {0} varian.", numericMinMax: "'{0}' harus sama dengan atau lebih dari {1} dan harus sama dengan atau kurang dari {2}", numericMin: "'{0}' harus sama dengan atau lebih dari {1}", numericMax: "'{0}' harus sama dengan atau kurang dari {1}", invalidEmail: "Silahkan masukkan e-mail yang benar.", invalidExpression: "Ekspresi: {0} harus mengembalikan 'benar'.", urlRequestError: "Permintaan mengembalikan kesalahan '{0}'. {1}", urlGetChoicesError: "Permintaan mengembalikan data kosong atau properti 'path' salah.", exceedMaxSize: "Ukuran berkas tidak boleh melebihi {0}.", otherRequiredError: "Silahkan masukkan nilai lainnnya.", uploadingFile: "Berkas Anda sedang diunggah. Silahkan tunggu beberapa saat atau coba lagi.", loadingFile: "Memuat...", chooseFile: "Pilih berkas...", noFileChosen: "Tidak ada file yang dipilih", confirmDelete: "Apakah Anda ingin menghapus catatan?", keyDuplicationError: "Nilai harus unik.", addColumn: "Tambah kolom", addRow: "Tambah baris", removeRow: "Hapus", addPanel: "Tambah baru", removePanel: "Hapus", choices_Item: "item", matrix_column: "Kolom", matrix_row: "Baris", savingData: "Hasil sedang disimpan pada server...", savingDataError: "Kesalahan terjadi dan kami tidak dapat menyimpan hasil.", savingDataSuccess: "Hasil telah sukses disimpan!", saveAgainButton: "Coba lagi", timerMin: "menit", timerSec: "detik", timerSpentAll: "Anda telah menghabiskan {0} pada halaman ini dan {1} secara keseluruhan.", timerSpentPage: "YAnda telah menghabiskan {0} pada halaman ini.", timerSpentSurvey: "Anda telah menghabiskan {0} secara keseluruhan.", timerLimitAll: "Anda telah menghabiskan {0} dari {1} pada halaman ini dan {2} dari {3} secara keseluruhan.", timerLimitPage: "Anda telah menghabiskan {0} dari {1} pada halaman ini.", timerLimitSurvey: "Anda telah menghabiskan {0} dari {1} secara keseluruhan.", cleanCaption: "Bersihkan", clearCaption: "Bersihkan", chooseFileCaption: "Pilih File", removeFileCaption: "Hapus berkas ini", booleanCheckedLabel: "Iya", booleanUncheckedLabel: "Tidak", confirmRemoveFile: "Anda yakin ingin menghapus file ini: {0}?", confirmRemoveAllFiles: "Anda yakin ingin menghapus semua file?", questionTitlePatternText: "Judul pertanyaan", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["id"] = indonesianStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["id"] = "bahasa Indonesia"; /***/ }), /***/ "./src/localization/italian.ts": /*!*************************************!*\ !*** ./src/localization/italian.ts ***! \*************************************/ /*! exports provided: italianSurveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "italianSurveyStrings", function() { return italianSurveyStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var italianSurveyStrings = { pagePrevText: "Precedente", pageNextText: "Successivo", completeText: "Salva", previewText: "Anteprima", editText: "Modifica", startSurveyText: "Inizio", otherItemText: "Altro (descrivi)", noneItemText: "Nessuno", selectAllItemText: "Seleziona tutti", progressText: "Pagina {0} di {1}", panelDynamicProgressText: "Record di {0} di {1}", questionsProgressText: "Risposte a {0}/{1} domande", emptySurvey: "Non ci sono pagine o domande visibili nel questionario.", completingSurvey: "Grazie per aver completato il questionario!", completingSurveyBefore: "I nostri records mostrano che hai già completato questo questionario.", loadingSurvey: "Caricamento del questionario in corso...", optionsCaption: "Scegli...", value: "valore", requiredError: "Campo obbligatorio", requiredErrorInPanel: "Per Favore, rispondi ad almeno una domanda.", requiredInAllRowsError: "Completare tutte le righe", numericError: "Il valore deve essere numerico", textMinLength: "Inserire almeno {0} caratteri", textMaxLength: "Lunghezza massima consentita {0} caratteri", textMinMaxLength: "Inserire una stringa con minimo {0} e massimo {1} caratteri", minRowCountError: "Completare almeno {0} righe.", minSelectError: "Selezionare almeno {0} varianti.", maxSelectError: "Selezionare massimo {0} varianti.", numericMinMax: "'{0}' deve essere uguale o superiore a {1} e uguale o inferiore a {2}", numericMin: "'{0}' deve essere uguale o superiore a {1}", numericMax: "'{0}' deve essere uguale o inferiore a {1}", invalidEmail: "Inserire indirizzo mail valido", invalidExpression: "L'espressione: {0} dovrebbe tornare 'vero'.", urlRequestError: "La richiesta ha risposto con un errore '{0}'. {1}", urlGetChoicesError: "La richiesta ha risposto null oppure il percorso non è corretto", exceedMaxSize: "Il file non può eccedere {0}", otherRequiredError: "Inserire il valore 'altro'", uploadingFile: "File in caricamento. Attendi alcuni secondi e riprova", loadingFile: "Caricamento...", chooseFile: "Selezionare file(s)...", noFileChosen: "Nessun file selezionato", confirmDelete: "Sei sicuro di voler elminare il record?", keyDuplicationError: "Questo valore deve essere univoco.", addColumn: "Aggiungi colonna", addRow: "Aggiungi riga", removeRow: "Rimuovi riga", addPanel: "Aggiungi riga", removePanel: "Elimina", choices_Item: "Elemento", matrix_column: "Colonna", matrix_row: "Riga", savingData: "Salvataggio dati sul server...", savingDataError: "Si è verificato un errore e non è stato possibile salvare i risultati.", savingDataSuccess: "I risultati sono stati salvati con successo!", saveAgainButton: "Riprova", timerMin: "min", timerSec: "sec", timerSpentAll: "Hai impiegato {0} su questa pagina e {1} in totale.", timerSpentPage: "Hai impiegato {0} su questa pagina.", timerSpentSurvey: "Hai impiegato {0} in totale.", timerLimitAll: "Hai impiegato {0} di {1} su questa pagina e {2} di {3} in totale.", timerLimitPage: "Hai impiegato {0} di {1} su questa pagina.", timerLimitSurvey: "Hai impiegato {0} di {1} in totale.", cleanCaption: "Pulisci", clearCaption: "Cancella", chooseFileCaption: "Scegliere il file", removeFileCaption: "Rimuovere questo file", booleanCheckedLabel: "Sì", booleanUncheckedLabel: "No", confirmRemoveFile: "Sei sicuro di voler elminare questo file: {0}?", confirmRemoveAllFiles: "Sei sicuro di voler elminare tutti i files?", questionTitlePatternText: "Titolo della domanda", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["it"] = italianSurveyStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["it"] = "italiano"; /***/ }), /***/ "./src/localization/japanese.ts": /*!**************************************!*\ !*** ./src/localization/japanese.ts ***! \**************************************/ /*! exports provided: japaneseSurveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "japaneseSurveyStrings", function() { return japaneseSurveyStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var japaneseSurveyStrings = { pagePrevText: "前へ", pageNextText: "次へ", completeText: "完了", previewText: "プレビュー", editText: "編集", startSurveyText: "スタート", otherItemText: "その他(説明)", noneItemText: "なし", selectAllItemText: "すべて選択", progressText: "{0}/{1}頁", panelDynamicProgressText: "{1}の{0}を記録する", questionsProgressText: "{0}/{1}の質問に回答しました。", emptySurvey: "この調査に表示できるページや質問はありません", completingSurvey: "調査を完了してくれてありがとうございました", completingSurveyBefore: "当社の記録によると、この調査はすでに完了しています。", loadingSurvey: "調査をダウンロード中", optionsCaption: "選択", value: "値打ち", requiredError: "質問にお答え下さい", requiredErrorInPanel: "最低でも1つの質問に答えてください。", requiredInAllRowsError: "質問には全列で回答してください。", numericError: "数字でご記入下さい", textMinLength: "{0} 文字以上で入力して下さい", textMaxLength: "{0}文字以下で入力してください。", textMinMaxLength: "{0}以上{1}未満の文字を入力してください。", minRowCountError: "{0}行以上で入力して下さい", minSelectError: "{0}種類以上を選択して下さい", maxSelectError: "{0}以上のバリアントを選択しないでください。", numericMinMax: "{0}は{1}以上であり、{2}以下であることが望ましい。", numericMin: "'{0}' は同等か{1}より大きくなければなりません", numericMax: "'{0}' は同等か{1}より小さくなければなりません", invalidEmail: "有効なメールアドレスをご記入下さい", invalidExpression: "式は {0}は'true'を返すべきです。", urlRequestError: "リクエストはエラー '{0}' を返しました。{1}", urlGetChoicesError: "リクエストが空のデータを返したか、'path' プロパティが正しくありません。", exceedMaxSize: "ファイルのサイズは{0}を超えてはいけません", otherRequiredError: "その他の値を入力してください。", uploadingFile: "ファイルをアップロード中です。しばらくしてから再度お試し下さい", loadingFile: "読み込み中", chooseFile: "ファイルを選択", noFileChosen: "選択されたファイルはありません", confirmDelete: "レコードを削除しますか?", keyDuplicationError: "この値は一意でなければなりません。", addColumn: "列の追加", addRow: "追加行", removeRow: "除去", addPanel: "新規追加", removePanel: "除去", choices_Item: "品目", matrix_column: "コラム", matrix_row: "行", savingData: "結果はサーバーに保存されています...。", savingDataError: "エラーが発生し、結果を保存できませんでした。", savingDataSuccess: "結果は無事に保存されました", saveAgainButton: "もう一度試してみてください。", timerMin: "僅少", timerSec: "セック", timerSpentAll: "あなたはこのページに{0}を費やし、合計で{1}を費やしました。", timerSpentPage: "あなたはこのページに{0}を費やしました。", timerSpentSurvey: "合計で{0}を使ったことになります。", timerLimitAll: "このページに{1}のうち{0}を費やし、{3}のうち{2}を合計で費やしました。", timerLimitPage: "このページで{1}の{0}を使ったことがあります。", timerLimitSurvey: "合計で{1}の{0}を使ったことがあります。", cleanCaption: "削除", clearCaption: "空白", chooseFileCaption: "ファイルを選択", removeFileCaption: "このファイルを削除", booleanCheckedLabel: "噫", booleanUncheckedLabel: "否", confirmRemoveFile: "このファイルを削除してもよろしいですか?{0}?", confirmRemoveAllFiles: "すべてのファイルを削除してもよろしいですか?", questionTitlePatternText: "質問名", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["ja"] = japaneseSurveyStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["ja"] = "日本語"; /***/ }), /***/ "./src/localization/kazakh.ts": /*!************************************!*\ !*** ./src/localization/kazakh.ts ***! \************************************/ /*! exports provided: kazakhStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "kazakhStrings", function() { return kazakhStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var kazakhStrings = { pagePrevText: "Артқа", pageNextText: "Келесі", completeText: "Дайын", previewText: "Алдын ала қарау", editText: "Редакциялау", startSurveyText: "Бастау", otherItemText: "Басқа (өтінеміз, жазыңыз)", noneItemText: "Жоқ", selectAllItemText: "Барлығын таңдау", progressText: "{0} ден {1} бет ", panelDynamicProgressText: "{0} ден {1} жазба", questionsProgressText: "{0}/{1} сұрақтарға жауап", emptySurvey: "Бір де бір сұрақ жоқ.", completingSurvey: "Сауалнаманы толтырғаныңыз үшін рахмет!", completingSurveyBefore: "Сіз бұл сауалнаманы өтіп қойдыңыз.", loadingSurvey: "Серверден жүктеу...", optionsCaption: "Таңдау...", value: "мәні", requiredError: "Өтінеміз, сұраққа жауап беріңіз.", requiredErrorInPanel: "Өтінеміз, кем дегенде бір сұраққа жауап беріңіз.", requiredInAllRowsError: "Өтінеміз, әрбір жолдың сұрағаны жауап беріңіз.", numericError: "Жауап сан түрінде болуы керек.", textMinLength: "Өтінеміз, {0} ден көп таңба енгізіңіз.", textMaxLength: "Өтінеміз, {0} ден аз таңба енгізіңіз.", textMinMaxLength: "Өтінеміз, {0} аз және {1} көп таңба енгізіңіз.", minRowCountError: "Өтінеміз, {0} ден кем емес жол толтырыңыз.", minSelectError: "Өтінеміз, тым болмаса {0} нұсқа таңдаңыз.", maxSelectError: "Өтінеміз, {0} нұсқадан көп таңдамаңыз.", numericMinMax: "'{0}' {1} ден кем емес және {2} ден көп емес болу керек", numericMin: "'{0}' {1} ден кем емес болу керек", numericMax: "'{0}' {1} ден көп емес болу керек", invalidEmail: "Өтінеміз, жарамды электрондық поштаңызды енгізіңіз.", invalidExpression: "{0} өрнегі 'true' қайтару керек.", urlRequestError: "Сұратым қателікті қайтарды'{0}'. {1}", urlGetChoicesError: "Сұратымға жауап бос келді немесе 'path' қасиеті қате көрсетілген ", exceedMaxSize: "Файлдың мөлшері {0} аспау керек.", otherRequiredError: "Өтінеміз, “Басқа” жолына деректі енгізіңіз", uploadingFile: "Сіздің файлыңыз жүктеліп жатыр. Бірнеше секунд тосып, қайтадан байқап көріңіз.", loadingFile: "Жүктеу...", chooseFile: "Файлдарды таңдаңыз...", noFileChosen: "Файл таңдалынбады", confirmDelete: "Сіз жазбаны жоятыныңызға сенімдісіз бе?", keyDuplicationError: "Бұл мән бірегей болу керек.", addColumn: "Бағана қосу", addRow: "Жолды қосу", removeRow: "Өшіру", addPanel: "Жаңа қосу", removePanel: "Өшіру", choices_Item: "Нұсқа", matrix_column: "Бағана", matrix_row: "Жол", savingData: "Нәтижелер серверде сақталады...", savingDataError: "Қателік туындады, нәтиже сақталынбады.", savingDataSuccess: "Нәтиже ойдағыдай сақталды!", saveAgainButton: "Қайтадан байқап көру", timerMin: "мин", timerSec: "сек", timerSpentAll: "Сіз бұл бетте {0} кетірдіңіз және барлығы {1}.", timerSpentPage: "Сіз бұл бетте {0} кетірдіңіз.", timerSpentSurvey: "Сіз сауалнама кезінде {0} кетірдіңіз.", timerLimitAll: "Сіз бұл бетте {0} ден {1} кетірдіңіз және {2} ден {3} бүкіл сауалнама үшін.", timerLimitPage: "Сіз бұл бетте {0} ден {1} кетірдіңіз.", timerLimitSurvey: "Сіз бүкіл сауалнама үшін {0} ден {1} кетірдіңіз ", cleanCaption: "Тазалау", clearCaption: "Тазалау", chooseFileCaption: "Файл таңдаңыз", removeFileCaption: "Файлды жойыңыз", booleanCheckedLabel: "Иә", booleanUncheckedLabel: "Жоқ", confirmRemoveFile: "Сіз бұл файлды жоятыныңызға сенімдісіз бе: {0}?", confirmRemoveAllFiles: "Сіз барлық файлдарды жоятыныңызға сенімдісіз бе?", questionTitlePatternText: "Сұрақтың атауы", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["kk"] = kazakhStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["kk"] = "Kazakh"; /***/ }), /***/ "./src/localization/korean.ts": /*!************************************!*\ !*** ./src/localization/korean.ts ***! \************************************/ /*! exports provided: koreanStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "koreanStrings", function() { return koreanStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var koreanStrings = { pagePrevText: "이전", pageNextText: "다음", completeText: "완료", previewText: "시사", editText: "편집하다", startSurveyText: "시작", otherItemText: "기타(설명)", noneItemText: "없음", selectAllItemText: "모두 선택", progressText: "페이지 {1} 중 {0}", panelDynamicProgressText: "{0} / {1} 기록", questionsProgressText: "{0} / {1} 개의 질문에 답변 함", emptySurvey: "설문지에 보여지는 페이지나 질문이 없습니다", completingSurvey: "설문 조사를 완료해 주셔서 감사합니다!", completingSurveyBefore: "기록에 따르면 이미 설문 조사를 마치셨습니다.", loadingSurvey: "설문조사가 로드중입니다...", optionsCaption: "선택하십시오...", value: "값", requiredError: "질문에 답하시오.", requiredErrorInPanel: "하나 이상의 질문에 답하십시오.", requiredInAllRowsError: "모든 행에 있는 질문에 답하십시오.", numericError: "값은 숫자여야 합니다.", textMinLength: "답변의 길이는 최소 {0}자여야 입니다.", textMaxLength: "답변의 길이는 {0}자를 초과 할 수 없습니다.", textMinMaxLength: "답변의 길이는 {0} - {1}자 사이여야 합니다.", minRowCountError: "최소 {0}개의 행을 채우십시오", minSelectError: "최소 {0}개의 변수를 선택하십시오.", maxSelectError: "최대 {0}개의 변수를 선택하십시오.", numericMinMax: "'{0}'은 {1}보다 크거나 같고 {2}보다 작거나 같아야합니다.", numericMin: "'{0}'은 {1}보다 크거나 같아야합니다.", numericMax: "'{0}'은 {1}보다 작거나 같아야합니다.", invalidEmail: "올바른 이메일 주소를 입력하십시오.", invalidExpression: "표현식: {0}은 '참'이어야 합니다.", urlRequestError: "'{0}'으로 잘못된 요청입니다. {1}", urlGetChoicesError: "비어있는 데이터를 요청했거나 잘못된 속성의 경로입니다.", exceedMaxSize: "파일 크기가 {0}을 초과 할 수 없습니다.", otherRequiredError: "다른 질문을 작성하십시오.", uploadingFile: "파일 업로드 중입니다. 잠시 후 다시 시도하십시오.", loadingFile: "로드 중...", chooseFile: "파일 선택...", noFileChosen: "선택된 파일이 없습니다", confirmDelete: "기록을 삭제하시겠습니까?", keyDuplicationError: " 이 값은 고유해야합니다.", addColumn: "열 추가", addRow: "행 추가", removeRow: "제거", addPanel: "새롭게 추가", removePanel: "제거", choices_Item: "항목", matrix_column: "열", matrix_row: "행", savingData: "결과가 서버에 저장 중입니다...", savingDataError: "오류가 발생하여 결과를 저장할 수 없습니다.", savingDataSuccess: "결과가 성공적으로 저장되었습니다!", saveAgainButton: "다시 시도하십시오", timerMin: "분", timerSec: "초", timerSpentAll: "현재 페이지에서 {0}을 소요해 총 {1}이 걸렸습니다.", timerSpentPage: "현재 페이지에서 {0]이 걸렸습니다", timerSpentSurvey: "총 {0}이 걸렸습니다.", timerLimitAll: "현재 페이지에서 {0}/{1}을 소요해 총 {2}/{3}이 걸렸습니다.", timerLimitPage: "현재 페이지에서 {0}/{1}이 걸렸습니다.", timerLimitSurvey: "총 {0}/{1}이 걸렸습니다.", cleanCaption: "닦기", clearCaption: "지우기", chooseFileCaption: "파일을 선택", removeFileCaption: "이 파일 제거", booleanCheckedLabel: "예", booleanUncheckedLabel: "아니", confirmRemoveFile: "{0} 파일을 제거 하시겠습니까?", confirmRemoveAllFiles: "모든 파일을 제거 하시겠습니까?", questionTitlePatternText: "질문 제목", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["ko"] = koreanStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["ko"] = "한국어"; /***/ }), /***/ "./src/localization/latvian.ts": /*!*************************************!*\ !*** ./src/localization/latvian.ts ***! \*************************************/ /*! exports provided: latvianSurveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "latvianSurveyStrings", function() { return latvianSurveyStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var latvianSurveyStrings = { pagePrevText: "Atpakaļ", pageNextText: "Tālāk", completeText: "Pabeigt", previewText: "Priekšskatījums", editText: "Rediģēt", startSurveyText: "Sākt", otherItemText: "Cits (lūdzu, aprakstiet!)", noneItemText: "Nav", selectAllItemText: "Izvēlēties visus", progressText: "Lappuse {0} no {1}", panelDynamicProgressText: "Ierakstīt {0} no {1}", questionsProgressText: "Atbildēja uz jautājumiem {0} / {1}", emptySurvey: "Nav neviena jautājuma.", completingSurvey: "Pateicamies Jums par anketas aizpildīšanu!", completingSurveyBefore: "Mūsu ieraksti liecina, ka jūs jau esat aizpildījis šo aptauju.", loadingSurvey: "Ielāde no servera...", optionsCaption: "Izvēlēties...", value: "value", requiredError: "Lūdzu, atbildiet uz jautājumu!", requiredErrorInPanel: "Lūdzu, atbildiet uz vismaz vienu jautājumu.", requiredInAllRowsError: "Lūdzu, atbildiet uz jautājumiem visās rindās.", numericError: "Atbildei ir jābūt skaitlim.", textMinLength: "Lūdzu, ievadiet vismaz {0} simbolus.", textMaxLength: "Lūdzu, ievadiet mazāk nekā {0} rakstzīmes.", textMinMaxLength: "Lūdzu, ievadiet vairāk nekā {0} rakstzīmes un mazāk nekā {1} rakstzīmes.", minRowCountError: "Lūdzu, aizpildiet vismaz {0} rindas.", minSelectError: "Lūdzu, izvēlieties vismaz {0} variantu.", maxSelectError: "Lūdzu, izvēlieties ne vairak par {0} variantiem.", numericMinMax: "'{0}' jābūt vienādam vai lielākam nekā {1}, un vienādam vai mazākam, nekā {2}", numericMin: "'{0}' jābūt vienādam vai lielākam {1}", numericMax: "'{0}' jābūt vienādam vai lielākam {1}", invalidEmail: "Lūdzu, ievadiet patiesu e-pasta adresi!", invalidExpression: "Izteicienam: {0} jāatgriež “true”.", urlRequestError: "Pieprasījumā tika atgriezta kļūda “{0}”. {1}", urlGetChoicesError: "Pieprasījums atgrieza tukšus datus vai rekvizīts “path” ir nepareizs", exceedMaxSize: "Faila lielums nedrīkst pārsniegt {0}.", otherRequiredError: "Lūdzu, ievadiet datus laukā 'Cits'", uploadingFile: "Jūsu fails tiek augšupielādēts. Lūdzu, uzgaidiet vairākas sekundes un mēģiniet vēlreiz.", loadingFile: "Notiek ielāde ...", chooseFile: "Izvēlieties failus ...", noFileChosen: "Nav izvēlēts neviens fails", confirmDelete: "Vai vēlaties izdzēst ierakstu?", keyDuplicationError: "Šai vērtībai jābūt unikālai.", addColumn: "Pievienot kolonnu", addRow: "Pievienot rindu", removeRow: "Noņemt", addPanel: "Pievieno jaunu", removePanel: "Noņemt", choices_Item: "lieta", matrix_column: "Sleja", matrix_row: "Rinda", savingData: "Rezultāti tiek saglabāti serverī ...", savingDataError: "Radās kļūda, un mēs nevarējām saglabāt rezultātus.", savingDataSuccess: "Rezultāti tika veiksmīgi saglabāti!", saveAgainButton: "Mēģini vēlreiz", timerMin: "min", timerSec: "sek", timerSpentAll: "Šajā lapā esat iztērējis {0} un kopā {1}.", timerSpentPage: "Šajā lapā esat iztērējis {0}.", timerSpentSurvey: "Kopā esat iztērējis {0}.", timerLimitAll: "Šajā lapā esat iztērējis {0} no {1} un kopā {2} no {3}.", timerLimitPage: "Šajā lapā esat iztērējis {0} no {1}.", timerLimitSurvey: "Kopā esat iztērējis {0} no {1}.", cleanCaption: "Tīrs", clearCaption: "Skaidrs", chooseFileCaption: "Izvēlēties failu", removeFileCaption: "Noņemiet šo failu", booleanCheckedLabel: "Jā", booleanUncheckedLabel: "Nē", confirmRemoveFile: "Vai tiešām vēlaties noņemt šo failu: {0}?", confirmRemoveAllFiles: "Vai tiešām vēlaties noņemt visus failus?", questionTitlePatternText: "Jautājuma nosaukums", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["lv"] = latvianSurveyStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["lv"] = "latviešu"; /***/ }), /***/ "./src/localization/lithuanian.ts": /*!****************************************!*\ !*** ./src/localization/lithuanian.ts ***! \****************************************/ /*! exports provided: lithuaniaSurveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "lithuaniaSurveyStrings", function() { return lithuaniaSurveyStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var lithuaniaSurveyStrings = { pagePrevText: "Atgal", pageNextText: "Toliau", completeText: "Baigti", previewText: "Peržiūra", editText: "Redaguoti", startSurveyText: "Pradėti", otherItemText: "Kita (įvesti)", noneItemText: "Nėra", selectAllItemText: "Pasirinkti visus", progressText: "Puslapis {0} iš {1}", panelDynamicProgressText: "Įrašyti {0} iš {1}", questionsProgressText: "Atsakė į {0} / {1} klausimus", emptySurvey: "Apklausoje nėra matomo puslapio ar klausimo.", completingSurvey: "Dėkojame už dalyvavimą apklausoje!", completingSurveyBefore: "Mūsų įrašai rodo, kad jau atlikote šią apklausą.", loadingSurvey: "Prašome palaukti...", optionsCaption: "Pasirinkti...", value: "reikšmė", requiredError: "Būtina atsakyti į šį klausimą.", requiredErrorInPanel: "Būtina atsakyti bent į vieną klausimą.", requiredInAllRowsError: "Prašome atsakyti į klausimus visose eilutėse.", numericError: "Turi būti skaičiai.", textMinLength: "Prašome suvesti bent {0} simbolius.", textMaxLength: "Prašome suvesti mažiau nei {0} simbolių.", textMinMaxLength: "Prašome suvesti daugiau nei {0} ir mažiau nei {1} simbolių.", minRowCountError: "Prašome suvesti ne mažiau nei {0} eilučių.", minSelectError: "Prašome pasirinkti bent {0} variantų.", maxSelectError: "Pasirinkite ne daugiau kaip {0} variantus.", numericMinMax: "'{0}' turi būti lygus arba didesnis nei {1} ir lygus arba mažesnis nei {2}", numericMin: "'{0}' turėtų būti lygus arba didesnis nei {1}", numericMax: "'{0}' turėtų būti lygus ar mažesnis už {1}", invalidEmail: "Prašome įvesti galiojantį elektroninio pašto adresą.", invalidExpression: "Reikšmė: {0} turi grąžinti 'true'.", urlRequestError: "Užklausa grąžino klaidą'{0}'. {1}", urlGetChoicesError: "Užklausa grąžino tuščius duomenis arba 'path' savybė yra neteisinga", exceedMaxSize: "Failo dydis neturi viršyti {0}.", otherRequiredError: "Įveskite kitą reikšmę.", uploadingFile: "Jūsų failas yra keliamas. Palaukite keletą sekundžių ir bandykite dar kartą.", loadingFile: "Prašome palaukti...", chooseFile: "Pasirinkti failą(us)...", noFileChosen: "Nepasirinktas joks failas", confirmDelete: "Ar norite ištrinti įrašą?", keyDuplicationError: "Ši reikšmė turėtų būti unikali.", addColumn: "Pridėti stulpelį", addRow: "Pridėti eilutę", removeRow: "Ištrinti", addPanel: "Pridėti naują", removePanel: "Ištrinti", choices_Item: "elementas", matrix_column: "Stulpelis", matrix_row: "Eilutė", savingData: "Rezultatai saugomi serveryje...", savingDataError: "Įvyko klaida ir mes negalėjome išsaugoti rezultatų.", savingDataSuccess: "Rezultatai buvo išsaugoti sėkmingai!", saveAgainButton: "Bandyti dar kartą", timerMin: "min", timerSec: "sek", timerSpentAll: "Praleidote {0} šiame puslapyje ir {1} iš viso.", timerSpentPage: "Praleidote {0} šiame puslapyje.", timerSpentSurvey: "Praleidote {0} iš viso.", timerLimitAll: "Praleidote {0} iš {1} šiame puslapyje ir {2} iš {3} iš viso.", timerLimitPage: "Praleidote {0} iš {1} šiame puslapyje.", timerLimitSurvey: "Praleidote {0} iš {1} iš viso.", cleanCaption: "Išvalyti", clearCaption: "Valyti", chooseFileCaption: "Pasirinkti failą", removeFileCaption: "Ištrinti šį failą", booleanCheckedLabel: "Taip", booleanUncheckedLabel: "Ne", confirmRemoveFile: "Ar tikrai norite pašalinti šį failą: {0}?", confirmRemoveAllFiles: "Ar tikrai norite pašalinti visus failus?", questionTitlePatternText: "Klausimo pavadinimas", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["lt"] = lithuaniaSurveyStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["lt"] = "lietuvių"; /***/ }), /***/ "./src/localization/macedonian.ts": /*!****************************************!*\ !*** ./src/localization/macedonian.ts ***! \****************************************/ /*! exports provided: macedonianSurveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "macedonianSurveyStrings", function() { return macedonianSurveyStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var macedonianSurveyStrings = { pagePrevText: "Претходна", pageNextText: "Следно", completeText: "Заврши", previewText: "Преглед", editText: "Уредување", startSurveyText: "Започнете", otherItemText: "Друго (опиши)", noneItemText: "Ништо", selectAllItemText: "Селектирај се", progressText: "Страница {0} од {1}", panelDynamicProgressText: "Сними {0} од {1}", questionsProgressText: "Одговорени на {0} / {1} прашања", emptySurvey: "Нема видлива страница или прашање во истражувањето.", completingSurvey: "Ви благодариме што го завршивте истражувањето!", completingSurveyBefore: "Нашите записи покажуваат дека веќе сте го завршиле ова истражување.", loadingSurvey: "Анкетата се вчитува ...", optionsCaption: "Изберете ...", value: "вредност", requiredError: "Ве молам, одговорете на прашањето.", requiredErrorInPanel: "Ве молам, одговорете барем на едно прашање.", requiredInAllRowsError: "Ве молиме, одговорете на прашања во сите редови.", numericError: "Вредноста треба да биде нумеричка.", minError: "Вредноста не треба да биде помала од {0}", maxError: "Вредноста не треба да биде поголема од {0}", textMinLength: "Внесете најмалку {0} знак/ци.", textMaxLength: "Внесете не повеќе од {0} знак/ци.", textMinMaxLength: "Внесете најмалку {0} и не повеќе од {1} знаци.", minRowCountError: "Пополнете најмалку {0} ред(ови).", minSelectError: "Ве молиме изберете најмалку {0} варијанта(и).", maxSelectError: "Изберете не повеќе од {0} варијанта(и).", numericMinMax: "'{0}' треба да биде најмалку {1} и најмногу {2}", numericMin: "'{0}' треба да биде најмалку {1}", numericMax: "'{0}' треба да биде најмногу {1}", invalidEmail: "Ве молиме внесете валидна е-маил адреса.", invalidExpression: "Изразот: {0} треба да се врати 'true'.", urlRequestError: "Барањето врати грешка '{0}'. {1} ", urlGetChoicesError: "Барањето врати празни податоци или својството 'path' е неточно", exceedMaxSize: "Големината на датотеката не треба да надминува {0}.", otherRequiredError: "Внесете ја другата вредност.", uploadingFile: "Вашата датотека се поставува. Ве молиме почекајте неколку секунди и обидете се повторно.", loadingFile: "Се вчитува ...", chooseFile: "Изберете датотека (и) ...", noFileChosen: "Не се избрани датотеки", confirmDelete: "Дали сакате да го избришете записот?", keyDuplicationError: "Оваа вредност треба да биде единствена.", addColumn: "Додај колона", addRow: "Додади ред", removeRow: "Отстрани", emptyRowsText: "Нема редови.", addPanel: "Додади ново", removePanel: "Отстрани", choices_Item: "ставка", matrix_column: "Колона", matrix_row: "Ред", savingData: "Резултатите се зачувуваат на серверот ...", savingDataError: "Настана грешка и не можевме да ги зачуваме резултатите.", savingDataSuccess: "Резултатите беа успешно зачувани!", saveAgainButton: "Обиди се повторно", timerMin: "мин", timerSec: "сек", timerSpentAll: "Поминавте {0} на оваа страница и вкупно {1}.", timerSpentPage: "Поминавте {0} на оваа страница.", timerSpentSurvey: "Вие потрошивте вкупно {0}.", timerLimitAll: "Поминавте {0} од {1} на оваа страница и {2} од {3} вкупно.", timerLimitPage: "Поминавте {0} од {1} на оваа страница.", timerLimitSurvey: "Вие потрошивте вкупно {0} од {1}.", cleanCaption: "Чисти", clearCaption: "Да расчисти", chooseFileCaption: "Изберете датотека", removeFileCaption: "Отстранете ја оваа датотека", booleanCheckedLabel: "Да", booleanUncheckedLabel: "Не", confirmRemoveFile: "Дали сте сигурни дека сакате да ја отстраните оваа датотека: {0}?", confirmRemoveAllFiles: "Дали сте сигурни дека сакате да ги отстраните сите датотеки?", questionTitlePatternText: "Наслов на прашањето", modalCancelButtonText: "Откажи", modalApplyButtonText: "Аплицирај", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["mk"] = macedonianSurveyStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["mk"] = "Македонски"; /***/ }), /***/ "./src/localization/norwegian.ts": /*!***************************************!*\ !*** ./src/localization/norwegian.ts ***! \***************************************/ /*! exports provided: norwegianSurveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "norwegianSurveyStrings", function() { return norwegianSurveyStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var norwegianSurveyStrings = { pagePrevText: "Forrige", pageNextText: "Neste", completeText: "Fullfør", previewText: "Forhåndsvisning", editText: "Redigere", startSurveyText: "Start", otherItemText: "Annet (beskriv)", noneItemText: "Ingen", selectAllItemText: "Velg alle", progressText: "Side {0} av {1}", panelDynamicProgressText: "Ta opp {0} av {1}", questionsProgressText: "Besvarte {0} / {1} spørsmål", emptySurvey: "Det er ingen synlig side eller spørsmål i undersøkelsen.", completingSurvey: "Takk for at du fullførte undersøkelsen!", completingSurveyBefore: "Våre data viser at du allerede har gjennomført denne undersøkelsen.", loadingSurvey: "Undersøkelsen laster...", optionsCaption: "Velg...", value: "verdi", requiredError: "Vennligst svar på spørsmålet.", requiredErrorInPanel: "Vennligst svar på minst ett spørsmål.", requiredInAllRowsError: "Vennligst svar på spørsmål i alle rader.", numericError: "Verdien skal være numerisk.", textMinLength: "Vennligst skriv inn minst {0} tegn.", textMaxLength: "Vennligst skriv inn mindre enn {0} tegn.", textMinMaxLength: "Vennligst skriv inn mer enn {0} og mindre enn {1} tegn.", minRowCountError: "Vennligst fyll inn minst {0} rader.", minSelectError: "Vennligst velg minst {0} varianter.", maxSelectError: "Vennligst ikke velg mer enn {0} varianter.", numericMinMax: "'{0}' bør være lik eller mer enn {1} og lik eller mindre enn {2}", numericMin: "'{0}' bør være lik eller mer enn {1}", numericMax: "'{0}' bør være lik eller mindre enn {1}", invalidEmail: "Vennligst skriv inn en gyldig e-post adresse.", invalidExpression: "Uttrykket: {0} skal returnere 'sant'.", urlRequestError: "Forespørselen returnerte feilen '{0}'. {1}", urlGetChoicesError: "Forespørselen returnerte tomme data, eller 'sti' -egenskapen er feil", exceedMaxSize: "Filstørrelsen bør ikke overstige {0}.", otherRequiredError: "Vennligst skriv inn den andre verdien.", uploadingFile: "Filen din lastes opp. Vennligst vent noen sekunder og prøv igjen.", loadingFile: "Laster inn ...", chooseFile: "Velg fil (er) ...", noFileChosen: "Ingen fil valgt", confirmDelete: "Ønsker du å slette posten?", keyDuplicationError: "Denne verdien skal være unik.", addColumn: "Legg til kolonne", addRow: "Legg til rad", removeRow: "Fjern", addPanel: "Legg til ny", removePanel: "Fjerne", choices_Item: "element", matrix_column: "Kolonne", matrix_row: "Rad", savingData: "Resultatene lagres på serveren ...", savingDataError: "Det oppsto en feil, og vi kunne ikke lagre resultatene.", savingDataSuccess: "Resultatene ble lagret!", saveAgainButton: "Prøv igjen", timerMin: "min", timerSec: "sek", timerSpentAll: "Du har tilbrakt {0} på denne siden og {1} totalt.", timerSpentPage: "Du har tilbrakt {0} på denne siden.", timerSpentSurvey: "Du har tilbrakt {0} totalt.", timerLimitAll: "Du har tilbrakt {0} av {1} på denne siden og totalt {2} av {3}.", timerLimitPage: "Du har tilbrakt {0} av {1} på denne siden.", timerLimitSurvey: "Du har tilbrakt {0} av {1} totalt.", cleanCaption: "Rens", clearCaption: "Klar", chooseFileCaption: "Velg Fil", removeFileCaption: "Fjern denne filen", booleanCheckedLabel: "Ja", booleanUncheckedLabel: "Nei", confirmRemoveFile: "Er du sikker på at du vil fjerne denne filen: {0}?", confirmRemoveAllFiles: "Er du sikker på at du vil fjerne alle filene?", questionTitlePatternText: "Spørsmålstittel", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["no"] = norwegianSurveyStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["no"] = "norsk"; /***/ }), /***/ "./src/localization/persian.ts": /*!*************************************!*\ !*** ./src/localization/persian.ts ***! \*************************************/ /*! exports provided: persianSurveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "persianSurveyStrings", function() { return persianSurveyStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var persianSurveyStrings = { pagePrevText: "قبلی", pageNextText: "بعدی", completeText: "تکمیل", previewText: "پیش نمایش", editText: "ویرایش", startSurveyText: "شروع", otherItemText: "دیگر(توضیح)", noneItemText: "هیچ", selectAllItemText: "انتخاب همه", progressText: "صفحه {0} از {1}", panelDynamicProgressText: "مورد {0} از {1}", questionsProgressText: "تعداد پاسخ {0}/{1} سوال", emptySurvey: "صفحه ای یا گزینه ای برای این پرسشنامه موجود نیست.", completingSurvey: "از شما بابت تکمیل این پرسشنامه متشکریم", completingSurveyBefore: "به نظر می رسد هم هم اکنون پرسشنامه را تکمیل کرده اید.", loadingSurvey: "درحال ایجاد پرسشنامه", optionsCaption: "انتخاب کنید...", value: "مقدار", requiredError: "لطفا به سوال پاسخ دهید", requiredErrorInPanel: "لطفا حداقل به یک سوال پاسخ دهید.", requiredInAllRowsError: "لطفا سوالات تمام سطرها را پاسخ دهید.", numericError: "مقدار باید عددی باشد", textMinLength: "لطفا حداقل {0} حرف وارد کنید", textMaxLength: "لطفا کمتر از {0} حرف وارد کنید.", textMinMaxLength: "لطفا بیشتر از {0} حرف و کمتر از {1} حرف وارد کنید.", minRowCountError: "لطفا حداقل {0} سطر وارد کنید.", minSelectError: "حداقل {0} انتخاب کنید.", maxSelectError: "لطفا بیشتر از {0} انتخاب کنید.", numericMinMax: "'{0}' باید بین {1} و {2} باشد", numericMin: "'{0}' بزرگتر مساوی {1} باشد", numericMax: "'{0}' باید کوچکتر یا مساوی {1} باشد", invalidEmail: "لطفا ایمیل صحیح درج کنید", invalidExpression: "عبارت: {0} پاسخ باید 'true' باشد.", urlRequestError: "درخواست با خطا روبرو شد: '{0}'. {1}", urlGetChoicesError: "درخواست مسیری خالی بازگشت داده یا مسیر درست تنظیم نشده", exceedMaxSize: "بیشترین حجم مجاز فایل: {0}", otherRequiredError: "مقدار 'دیگر' را وارد کنید", uploadingFile: "فایل در حال آیلود است. لطفا صبر کنید.", loadingFile: "بارگیری...", chooseFile: "انتخاب فایل(ها)...", noFileChosen: "هیچ فایلی انتخاب نشده", confirmDelete: "آیا مایل به حذف این ردیف هستید؟", keyDuplicationError: "این مقدار باید غیر تکراری باشد", addColumn: "ستون جدید", addRow: "سطر جدید", removeRow: "حذف", addPanel: "جدید", removePanel: "حذف", choices_Item: "آیتم", matrix_column: "ستون", matrix_row: "سطر", savingData: "نتایج در حال ذخیره سازی در سرور است", savingDataError: "خطایی در ذخیره سازی نتایج رخ داده است", savingDataSuccess: "نتایج با موفقیت ذخیره شد", saveAgainButton: "مجدد تلاش کنید", timerMin: "دقیقه", timerSec: "ثانیه", timerSpentAll: "شما مدت {0} در این صفحه و مدت {1} را در مجموع سپری کرده اید.", timerSpentPage: "شما مدت {0} را در این صفحه سپری کرده اید.", timerSpentSurvey: "شما مدت {0} را در مجموع سپری کرده اید.", timerLimitAll: "شما مدت {0} از {1} در این صفحه و مدت {2} از {3} را در مجموع سپری کرده اید.", timerLimitPage: "شما مدت {0} از {1} را در این صفحه سپری کرده اید.", timerLimitSurvey: "شما مدت {0} از {1} را در مجموع سپری کرده اید.", cleanCaption: "پاکسازی", clearCaption: "خالی کردن", chooseFileCaption: "انتخاب فایل", removeFileCaption: "حذف این فایل", booleanCheckedLabel: "بله", booleanUncheckedLabel: "خیر", confirmRemoveFile: "آیا میخواهید این فایل را پاک کنید: {0}?", confirmRemoveAllFiles: "آیا میخواهید تمام فایل ها را پاک کنید?", questionTitlePatternText: "عنوان سوال", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["fa"] = persianSurveyStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["fa"] = "فارْسِى"; /***/ }), /***/ "./src/localization/polish.ts": /*!************************************!*\ !*** ./src/localization/polish.ts ***! \************************************/ /*! exports provided: polishSurveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "polishSurveyStrings", function() { return polishSurveyStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var polishSurveyStrings = { pagePrevText: "Wstecz", pageNextText: "Dalej", completeText: "Gotowe", previewText: "Premiera", editText: "Edycja", startSurveyText: "Start", otherItemText: "Inna odpowiedź (wpisz)", noneItemText: "Brak", selectAllItemText: "Wybierz wszystkie", progressText: "Strona {0} z {1}", panelDynamicProgressText: "Zapis {0} z {1}", questionsProgressText: "Odpowiedzi na {0}/{1} pytania", emptySurvey: "Nie ma widocznych pytań.", completingSurvey: "Dziękujemy za wypełnienie ankiety!", completingSurveyBefore: "Z naszych zapisów wynika, że wypełniłeś już tę ankietę.", loadingSurvey: "Trwa wczytywanie ankiety...", optionsCaption: "Wybierz...", value: "Wartość", requiredError: "Proszę odpowiedzieć na to pytanie.", requiredErrorInPanel: "Proszę odpowiedzieć na co najmniej jedno pytanie.", requiredInAllRowsError: "Proszę odpowiedzieć na wszystkie pytania.", numericError: "W tym polu można wpisać tylko liczby.", textMinLength: "Proszę wpisać co najmniej {0} znaków.", textMaxLength: "Proszę wpisać mniej niż {0} znaków.", textMinMaxLength: "Proszę wpisać więcej niż {0} i mniej niż {1} znaków.", minRowCountError: "Proszę uzupełnić przynajmniej {0} wierszy.", minSelectError: "Proszę wybrać co najmniej {0} pozycji.", maxSelectError: "Proszę wybrać nie więcej niż {0} pozycji.", numericMinMax: "Odpowiedź '{0}' powinna być większa lub równa {1} oraz mniejsza lub równa {2}", numericMin: "Odpowiedź '{0}' powinna być większa lub równa {1}", numericMax: "Odpowiedź '{0}' powinna być mniejsza lub równa {1}", invalidEmail: "Proszę podać prawidłowy adres email.", invalidExpression: "Wyrażenie: {0} powinno wracać 'prawdziwe'.", urlRequestError: "Żądanie zwróciło błąd '{0}'. {1}", urlGetChoicesError: "Żądanie nie zwróciło danych albo ścieżka jest nieprawidłowa", exceedMaxSize: "Rozmiar przesłanego pliku nie może przekraczać {0}.", otherRequiredError: "Proszę podać inną odpowiedź.", uploadingFile: "Trwa przenoszenie Twojego pliku, proszę spróbować ponownie za kilka sekund.", loadingFile: "Ładowanie...", chooseFile: "Wybierz plik(i)...", noFileChosen: "Nie wybrano żadnego pliku", confirmDelete: "Chcesz skasować nagranie?", keyDuplicationError: "Ta wartość powinna być wyjątkowa.", addColumn: "Dodaj kolumnę", addRow: "Dodaj wiersz", removeRow: "Usuń", addPanel: "Dodaj panel", removePanel: "Usuń", choices_Item: "element", matrix_column: "Kolumna", matrix_row: "Wiersz", savingData: "Zapisuję wyniki ankiety na serwerze...", savingDataError: "Wystąpił błąd i wyniki nie mogły zostać zapisane.", savingDataSuccess: "Wyniki zostały poprawnie zapisane!", saveAgainButton: "Spróbuj ponownie", timerMin: "min", timerSec: "sek", timerSpentAll: "Spędziłeś {0} na tej stronie a w sumie {1}.", timerSpentPage: "Spędziłeś {0} na tej stronie.", timerSpentSurvey: "Spędziłeś w sumie {0}.", timerLimitAll: "Spędziłeś {0} z {1} na tej stronie a w sumie {2} z {3}.", timerLimitPage: "Spędziłeś {0} z {1} na tej stronie", timerLimitSurvey: "Spędziłeś {0} z {1}.", cleanCaption: "Wyczyść", clearCaption: "Jasne", chooseFileCaption: "Wybierz plik", removeFileCaption: "Usuń ten plik", booleanCheckedLabel: "Tak", booleanUncheckedLabel: "Nie", confirmRemoveFile: "Jesteś pewien, że chcesz usunąć ten plik: {0}?", confirmRemoveAllFiles: "Jesteś pewien, że chcesz usunąć wszystkie pliki?", questionTitlePatternText: "Tytuł pytania", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["pl"] = polishSurveyStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["pl"] = "polski"; /***/ }), /***/ "./src/localization/portuguese-br.ts": /*!*******************************************!*\ !*** ./src/localization/portuguese-br.ts ***! \*******************************************/ /*! exports provided: portugueseBrSurveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "portugueseBrSurveyStrings", function() { return portugueseBrSurveyStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var portugueseBrSurveyStrings = { pagePrevText: "Anterior", pageNextText: "Próximo", completeText: "Finalizar", previewText: "Pré-visualização", editText: "Editar", startSurveyText: "Começar", otherItemText: "Outros (descrever)", noneItemText: "Nenhum", selectAllItemText: "Selecionar Todos", progressText: "Página {0} de {1}", panelDynamicProgressText: "Registro {0} de {1}", questionsProgressText: "Respostas {0}/{1} perguntas", emptySurvey: "Não há página visível ou pergunta na pesquisa.", completingSurvey: "Obrigado por finalizar a pesquisa!", completingSurveyBefore: "Nossos registros mostram que você já finalizou a pesquisa.", loadingSurvey: "A pesquisa está carregando...", optionsCaption: "Selecione...", value: "valor", requiredError: "Por favor, responda a pergunta.", requiredErrorInPanel: "Por favor, responda pelo menos uma pergunta.", requiredInAllRowsError: "Por favor, responda as perguntas em todas as linhas.", numericError: "O valor deve ser numérico.", textMinLength: "Por favor, insira pelo menos {0} caracteres.", textMaxLength: "Por favor, insira menos de {0} caracteres.", textMinMaxLength: "Por favor, insira mais de {0} e menos de {1} caracteres.", minRowCountError: "Preencha pelo menos {0} linhas.", minSelectError: "Selecione pelo menos {0} opções.", maxSelectError: "Por favor, selecione não mais do que {0} opções.", numericMinMax: "O '{0}' deve ser igual ou superior a {1} e igual ou menor que {2}", numericMin: "O '{0}' deve ser igual ou superior a {1}", numericMax: "O '{0}' deve ser igual ou inferior a {1}", invalidEmail: "Por favor, informe um e-mail válido.", invalidExpression: "A expressão: {0} deve retornar 'verdadeiro'.", urlRequestError: "A requisição retornou o erro '{0}'. {1}", urlGetChoicesError: "A requisição não retornou dados ou o 'caminho' da requisição não está correto", exceedMaxSize: "O tamanho do arquivo não deve exceder {0}.", otherRequiredError: "Por favor, informe o outro valor.", uploadingFile: "Seu arquivo está sendo carregado. Por favor, aguarde alguns segundos e tente novamente.", loadingFile: "Carregando...", chooseFile: "Selecione o(s) arquivo(s)...", noFileChosen: "Nenhum arquivo escolhido", confirmDelete: "Tem certeza que deseja deletar?", keyDuplicationError: "Esse valor deve ser único.", addColumn: "Adicionar coluna", addRow: "Adicionar linha", removeRow: "Remover linha", addPanel: "Adicionar novo", removePanel: "Remover", choices_Item: "item", matrix_column: "Coluna", matrix_row: "Linha", savingData: "Os resultados esto sendo salvos no servidor...", savingDataError: "Ocorreu um erro e não foi possível salvar os resultados.", savingDataSuccess: "Os resultados foram salvos com sucesso!", saveAgainButton: "Tente novamente", timerMin: "min", timerSec: "seg", timerSpentAll: "Você gastou {0} nesta página e {1} no total.", timerSpentPage: "Você gastou {0} nesta página.", timerSpentSurvey: "Você gastou {0} no total.", timerLimitAll: "Você gastou {0} de {1} nesta página e {2} de {3} no total.", timerLimitPage: "Você gastou {0} de {1} nesta página.", timerLimitSurvey: "Você gastou {0} de {1} no total.", cleanCaption: "Limpar", clearCaption: "Limpar", chooseFileCaption: "Escolher arquivo", removeFileCaption: "Remover este arquivo", booleanCheckedLabel: "Sim", booleanUncheckedLabel: "Não", confirmRemoveFile: "Tem certeza que deseja remover este arquivo: {0}?", confirmRemoveAllFiles: "Tem certeza que deseja remover todos os arquivos?", questionTitlePatternText: "Título da questão", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["pt-br"] = portugueseBrSurveyStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["pt-br"] = "português brasileiro"; /***/ }), /***/ "./src/localization/portuguese.ts": /*!****************************************!*\ !*** ./src/localization/portuguese.ts ***! \****************************************/ /*! exports provided: portugueseSurveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "portugueseSurveyStrings", function() { return portugueseSurveyStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var portugueseSurveyStrings = { pagePrevText: "Anterior", pageNextText: "Próximo", completeText: "Finalizar", previewText: "Pré-visualização", editText: "Editar", startSurveyText: "Começar", otherItemText: "Outros (descrever)", noneItemText: "Nenhum", selectAllItemText: "Selecionar Todos", progressText: "Página {0} de {1}", panelDynamicProgressText: "Registo {0} de {1}", questionsProgressText: "Respostas {0}/{1} perguntas", emptySurvey: "Não há página visível ou pergunta no questionário.", completingSurvey: "Obrigado por finalizar o questionário!", completingSurveyBefore: "Os nossos registos mostram que já finalizou o questionário.", loadingSurvey: "O questionário está a carregar...", optionsCaption: "Selecione...", value: "valor", requiredError: "Por favor, responda à pergunta.", requiredErrorInPanel: "Por favor, responda pelo menos a uma pergunta.", requiredInAllRowsError: "Por favor, responda às perguntas em todas as linhas.", numericError: "O valor deve ser numérico.", textMinLength: "Por favor, insira pelo menos {0} caracteres.", textMaxLength: "Por favor, insira menos de {0} caracteres.", textMinMaxLength: "Por favor, insira mais de {0} e menos de {1} caracteres.", minRowCountError: "Preencha pelo menos {0} linhas.", minSelectError: "Selecione pelo menos {0} opções.", maxSelectError: "Por favor, selecione no máximo {0} opções.", numericMinMax: "O '{0}' deve ser igual ou superior a {1} e igual ou menor que {2}", numericMin: "O '{0}' deve ser igual ou superior a {1}", numericMax: "O '{0}' deve ser igual ou inferior a {1}", invalidEmail: "Por favor, insira um e-mail válido.", invalidExpression: "A expressão: {0} deve retornar 'verdadeiro'.", urlRequestError: "O pedido retornou o erro '{0}'. {1}", urlGetChoicesError: "O pedido não retornou dados ou o 'caminho' do pedido não está correto", exceedMaxSize: "O tamanho do arquivo não deve exceder {0}.", otherRequiredError: "Por favor, insira o outro valor.", uploadingFile: "O seu ficheiro está a carregar. Por favor, aguarde alguns segundos e tente novamente.", loadingFile: "A carregar...", chooseFile: "Selecione o(s) arquivo(s)...", noFileChosen: "Nenhum ficheiro escolhido", confirmDelete: "Tem a certeza que deseja apagar?", keyDuplicationError: "Este valor deve ser único.", addColumn: "Adicionar coluna", addRow: "Adicionar linha", removeRow: "Remover linha", addPanel: "Adicionar novo", removePanel: "Remover", choices_Item: "item", matrix_column: "Coluna", matrix_row: "Linha", savingData: "Os resultados estão a ser guardados no servidor...", savingDataError: "Ocorreu um erro e não foi possível guardar os resultados.", savingDataSuccess: "Os resultados foram guardados com sucesso!", saveAgainButton: "Tente novamente", timerMin: "min", timerSec: "seg", timerSpentAll: "Você gastou {0} nesta página e {1} no total.", timerSpentPage: "Você gastou {0} nesta página.", timerSpentSurvey: "Você gastou {0} no total.", timerLimitAll: "Você gastou {0} de {1} nesta página e {2} de {3} no total.", timerLimitPage: "Você gastou {0} de {1} nesta página.", timerLimitSurvey: "Você gastou {0} de {1} no total.", cleanCaption: "Limpar", clearCaption: "Limpar", chooseFileCaption: "Escolher ficheiro", removeFileCaption: "Remover este ficheiro", booleanCheckedLabel: "Sim", booleanUncheckedLabel: "Não", confirmRemoveFile: "Tem a certeza que deseja remover este ficheiro: {0}?", confirmRemoveAllFiles: "Tem a certeza que deseja remover todos os ficheiros?", questionTitlePatternText: "Título da questão", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["pt"] = portugueseSurveyStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["pt"] = "português"; /***/ }), /***/ "./src/localization/romanian.ts": /*!**************************************!*\ !*** ./src/localization/romanian.ts ***! \**************************************/ /*! exports provided: romanianSurveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "romanianSurveyStrings", function() { return romanianSurveyStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var romanianSurveyStrings = { pagePrevText: "Precedent", pageNextText: "Următor", completeText: "Finalizare", previewText: "previzualizare", editText: "Editați", startSurveyText: "start", otherItemText: "Altul(precizaţi)", noneItemText: "Nici unul", selectAllItemText: "Selectează tot", progressText: "Pagina {0} din {1}", panelDynamicProgressText: "Înregistrare {0} din {1}", questionsProgressText: "Răspunsuri la {0} / {1} întrebări", emptySurvey: "Nu sunt întrebări pentru acest chestionar", completingSurvey: "Vă mulţumim pentru timpul acordat!", completingSurveyBefore: "Din înregistrările noastre reiese că ați completat deja acest chestionar.", loadingSurvey: "Chestionarul se încarcă...", optionsCaption: "Alegeţi...", value: "valoare", requiredError: "Răspunsul la această întrebare este obligatoriu.", requiredErrorInPanel: "Vă rugăm să răspundeți la cel puțin o întrebare.", requiredInAllRowsError: "Toate răspunsurile sunt obligatorii", numericError: "Răspunsul trebuie să fie numeric.", textMinLength: "Trebuie să introduceți minim {0} caractere.", textMaxLength: "Trebuie să introduceți maxim {0} caractere.", textMinMaxLength: "Trebuie să introduceți mai mult de {0} și mai puțin de {1} caractere.", minRowCountError: "Trebuie să completați minim {0} rânduri.", minSelectError: "Trebuie să selectați minim {0} opţiuni.", maxSelectError: "Trebuie să selectați maxim {0} opţiuni.", numericMinMax: "Răspunsul '{0}' trebuie să fie mai mare sau egal ca {1} şî mai mic sau egal cu {2}", numericMin: "Răspunsul '{0}' trebuie să fie mai mare sau egal ca {1}", numericMax: "Răspunsul '{0}' trebuie să fie mai mic sau egal ca {1}", invalidEmail: "Trebuie să introduceţi o adresa de email validă.", invalidExpression: "Expresia: {0} ar trebui să returneze „adevărat”.", urlRequestError: "Request-ul a returnat eroarea '{0}'. {1}", urlGetChoicesError: "Request-ul nu a returnat date sau proprietatea 'path' este incorectă", exceedMaxSize: "Dimensiunea fişierului nu trebuie să depăşească {0}.", otherRequiredError: "Trebuie să completați câmpul 'Altul'.", uploadingFile: "Fișierul dumneavoastră este în curs de încărcare. Vă rugăm așteptați câteva secunde și reveniți apoi.", loadingFile: "Se încarcă...", chooseFile: "Alege fisierele...", noFileChosen: "Niciun fișier ales", confirmDelete: "Sunteți sigur că doriți să ștergeți înregistrarea?", keyDuplicationError: "Valoarea trebuie să fie unică.", addColumn: "Adăugați coloană", addRow: "Adăugare rând", removeRow: "Ștergere", addPanel: "Adăugare", removePanel: "Ștergere", choices_Item: "opțiune", matrix_column: "Coloană", matrix_row: "Rând", savingData: "Rezultatele sunt în curs de salvare...", savingDataError: "A intervenit o eroare, rezultatele nu au putut fi salvate.", savingDataSuccess: "Rezultatele au fost salvate cu succes!", saveAgainButton: "Încercați din nou", timerMin: "min", timerSec: "sec", timerSpentAll: "Ați petrecut {0} pe această pagină și {1} în total.", timerSpentPage: "Ați petrecut {0} pe această pagină.", timerSpentSurvey: "Ați petrecut {0} în total.", timerLimitAll: "Ați petrecut {0} din {1} pe această pagină și {2} din {3} în total.", timerLimitPage: "Ați petrecut {0} din {1} pe această pagină.", timerLimitSurvey: "Ați petrecut {0} din {1} în total.", cleanCaption: "Curat", clearCaption: "clar", chooseFileCaption: "Alege fișierul", removeFileCaption: "Eliminați acest fișier", booleanCheckedLabel: "da", booleanUncheckedLabel: "Nu", confirmRemoveFile: "Sigur doriți să eliminați acest fișier: {0}?", confirmRemoveAllFiles: "Sigur doriți să eliminați toate fișierele?", questionTitlePatternText: "Titlul intrebarii", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["ro"] = romanianSurveyStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["ro"] = "română"; /***/ }), /***/ "./src/localization/russian.ts": /*!*************************************!*\ !*** ./src/localization/russian.ts ***! \*************************************/ /*! exports provided: russianSurveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "russianSurveyStrings", function() { return russianSurveyStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var russianSurveyStrings = { pagePrevText: "Назад", pageNextText: "Далее", completeText: "Готово", previewText: "Предварительный просмотр", editText: "Редактирование", startSurveyText: "Начать", otherItemText: "Другое (пожалуйста, опишите)", noneItemText: "Нет", selectAllItemText: "Выбрать всё", progressText: "Страница {0} из {1}", panelDynamicProgressText: "Запись {0} из {1}", questionsProgressText: "Ответы на {0}/{1}вопросы", emptySurvey: "Нет ни одного вопроса.", completingSurvey: "Благодарим Вас за заполнение анкеты!", completingSurveyBefore: "Вы уже проходили этот опрос.", loadingSurvey: "Загрузка с сервера...", optionsCaption: "Выбрать...", value: "значение", requiredError: "Пожалуйста, ответьте на вопрос.", requiredErrorInPanel: "Пожалуйста, ответьте по крайней мере на один вопрос.", requiredInAllRowsError: "Пожалуйста, ответьте на вопросы в каждой строке.", numericError: "Ответ должен быть числом.", textMinLength: "Пожалуйста введите больше {0} символов.", textMaxLength: "Пожалуйста введите меньше {0} символов.", textMinMaxLength: "Пожалуйста введите больше {0} и меньше {1} символов.", minRowCountError: "Пожалуйста, заполните не меньше {0} строк.", minSelectError: "Пожалуйста, выберите хотя бы {0} вариантов.", maxSelectError: "Пожалуйста, выберите не более {0} вариантов.", numericMinMax: "'{0}' должно быть не меньше чем {1}, и не больше чем {2}", numericMin: "'{0}' должно быть не меньше чем {1}", numericMax: "'{0}' должно быть не больше чем {1}", invalidEmail: "Пожалуйста, введите действительный адрес электронной почты.", invalidExpression: "Выражение {0} должно возвращать 'true'.", urlRequestError: "Запрос вернул ошибку '{0}'. {1}", urlGetChoicesError: "Ответ на запрос пришел пустой или свойство 'path' указано неверно", exceedMaxSize: "Размер файла не должен превышать {0}.", otherRequiredError: "Пожалуйста, введите данные в поле 'Другое'", uploadingFile: "Ваш файл загружается. Подождите несколько секунд и попробуйте снова.", loadingFile: "Загрузка...", chooseFile: "Выберите файл(ы)...", noFileChosen: "Файл не выбран", confirmDelete: "Вы точно хотите удалить запись?", keyDuplicationError: "Это значение должно быть уникальным.", addColumn: "Добавить колонку", addRow: "Добавить строку", removeRow: "Удалить", addPanel: "Добавить новую", removePanel: "Удалить", choices_Item: "Вариант", matrix_column: "Колонка", matrix_row: "Строка", savingData: "Результаты сохраняются на сервер...", savingDataError: "Произошла ошибка, результат не был сохранён.", savingDataSuccess: "Результат успешно сохранён!", saveAgainButton: "Попробовать снова", timerMin: "мин", timerSec: "сек", timerSpentAll: "Вы потратили {0} на этой странице и {1} всего.", timerSpentPage: "Вы потратили {0} на этой странице.", timerSpentSurvey: "Вы потратили {0} в течение теста.", timerLimitAll: "Вы потратили {0} из {1} на этой странице и {2} из {3} для всего теста.", timerLimitPage: "Вы потратили {0} из {1} на этой странице.", timerLimitSurvey: "Вы потратили {0} из {1} для всего теста.", cleanCaption: "Очистить", clearCaption: "Очистить", chooseFileCaption: "Выберите файл", removeFileCaption: "Удалить файл", booleanCheckedLabel: "Да", booleanUncheckedLabel: "Нет", confirmRemoveFile: "Вы уверены, что хотите удалить этот файл: {0}?", confirmRemoveAllFiles: "Вы уверены, что хотите удалить все файлы?", questionTitlePatternText: "Название вопроса", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["ru"] = russianSurveyStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["ru"] = "русский"; /***/ }), /***/ "./src/localization/serbian.ts": /*!*************************************!*\ !*** ./src/localization/serbian.ts ***! \*************************************/ /*! exports provided: serbianStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "serbianStrings", function() { return serbianStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); //Uncomment this line on creating a translation file var serbianStrings = { pagePrevText: "Nazad", pageNextText: "Dalje", completeText: "Završi", previewText: "Pregledaj", editText: "Izmeni", startSurveyText: "Započni", otherItemText: "Drugo (upiši)", noneItemText: "Ništa", selectAllItemText: "Izaberi sve", progressText: "Stranica {0} od {1}", panelDynamicProgressText: "Upis {0} od {1}", questionsProgressText: "Odgovoreno na {0}/{1} pitanja", emptySurvey: "Nema vidljivih stranica ili pitanja u anketi.", completingSurvey: "Hvala na popunjavanju ankete!", completingSurveyBefore: "Prema našim podacima, već ste popunili ovu anketu.", loadingSurvey: "Učitavam anketu...", optionsCaption: "Izaberi...", value: "vrednost", requiredError: "Molimo odgovorite na ovo pitanje.", requiredErrorInPanel: "Molimo odgovorite na bar jedno pitanje.", requiredInAllRowsError: "Molimo odgovorite na pitanja u svim redovima.", numericError: "Vrednost bi trebalo da bude numerička.", minError: "Vrednost ne bi trebalo da bude manja od {0}", maxError: "Vrednost ne bi trebalo da bude veća od {0}", textMinLength: "Molimo unesite bar {0} znak(ov)a.", textMaxLength: "Molimo unesite najviše {0} znak(ov)a.", textMinMaxLength: "Molimo unesite najmanje {0} i ne više od {1} znak(ov)a.", minRowCountError: "Molimo popunite najmanje {0} red(ova).", minSelectError: "Molimo izaberite najmanje {0} opcija/e.", maxSelectError: "Molimo izaberite najviše {0} opcija/e.", numericMinMax: "'{0}' bi trebalo da bude najmanje {1} i najviše {2}", numericMin: "'{0}' bi trebalo da bude najmanje {1}", numericMax: "'{0}' bi trebalo da bude najviše {1}", invalidEmail: "Molimo unesite ispravnu e-mail adresu.", // vratiti "true" ? invalidExpression: "Izraz: {0} bi trebalo da bude tačan.", urlRequestError: "Zahtev je naišao na grešku '{0}'. {1}", urlGetChoicesError: "Zahtev nije pronašao podatke, ili je putanja netačna", exceedMaxSize: "Veličina fajla ne bi trebalo da prelazi {0}.", otherRequiredError: "Molimo unesite drugu vrednost.", uploadingFile: "Fajl se šalje. Molimo sačekajte neko vreme i pokušajte ponovo.", loadingFile: "Učitavanje...", chooseFile: "Izaberite fajlove...", noFileChosen: "Nije izabran nijedan fajl", confirmDelete: "Da li želite da izbrišete unos?", keyDuplicationError: "Ova vrednost treba da bude jedinstvena.", addColumn: "Dodaj kolonu", addRow: "Dodaj red", removeRow: "Ukloni", emptyRowsText: "Nema redova.", addPanel: "Dodaj novo", removePanel: "Ukloni", choices_Item: "stavka", matrix_column: "Kolona", matrix_row: "Red", multipletext_itemname: "tekst", savingData: "U toku je čuvanje podataka na serveru...", savingDataError: "Došlo je do greške i rezultati nisu sačuvani.", savingDataSuccess: "Rezultati su uspešno sačuvani!", saveAgainButton: "Pokušajte ponovo", timerMin: "min", timerSec: "sek", timerSpentAll: "Proveli ste {0} na ovoj stranici i {1} ukupno.", timerSpentPage: "Proveli ste {0} na ovoj stranici.", timerSpentSurvey: "Proveli ste {0} ukupno.", timerLimitAll: "Proveli ste {0} od {1} na ovoj stranici i {2} od {3} ukupno.", timerLimitPage: "Proveli ste {0} od {1} na ovoj stranici.", timerLimitSurvey: "Proveli ste {0} od {1} ukupno.", cleanCaption: "Očisti", clearCaption: "Poništi", chooseFileCaption: "Izaberi fajl", removeFileCaption: "Ukloni ovaj fajl", booleanCheckedLabel: "Da", booleanUncheckedLabel: "Ne", confirmRemoveFile: "Da li ste sigurni da želite da uklonite ovaj fajl: {0}?", confirmRemoveAllFiles: "Da li ste sigurni da želite da uklonite sve fajlove?", questionTitlePatternText: "Naslov pitanja", modalCancelButtonText: "Otkaži", modalApplyButtonText: "Primeni", }; //Uncomment these two lines on creating a translation file. You should replace "en" and enStrings with your locale ("fr", "de" and so on) and your variable. _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["rs"] = serbianStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["rs"] = "Srpski"; /***/ }), /***/ "./src/localization/simplified-chinese.ts": /*!************************************************!*\ !*** ./src/localization/simplified-chinese.ts ***! \************************************************/ /*! exports provided: simplifiedChineseSurveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "simplifiedChineseSurveyStrings", function() { return simplifiedChineseSurveyStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var simplifiedChineseSurveyStrings = { pagePrevText: "上一页", pageNextText: "下一页", completeText: "提交问卷", previewText: "预览", editText: "编辑", startSurveyText: "开始问卷", otherItemText: "填写其他答案", noneItemText: "无", selectAllItemText: "选择全部", progressText: "第 {0} 页, 共 {1} 页", panelDynamicProgressText: "{0} of {1}", questionsProgressText: "第 {0}/{1} 题", emptySurvey: "问卷中没有问题或页面", completingSurvey: "感谢您的参与!", completingSurveyBefore: "你已完成问卷.", loadingSurvey: "问卷正在加载中...", optionsCaption: "请选择...", value: "值", requiredError: "请填写此问题", requiredErrorInPanel: "至少回答一题.", requiredInAllRowsError: "请填写所有行中问题", numericError: "答案必须是个数字", minError: "该值不能小于 {0}", maxError: "该值不能大于 {0}", textMinLength: "答案长度至少 {0} 个字符", textMaxLength: "答案长度不能超过 {0} 个字符", textMinMaxLength: "答案长度必须在 {0} - {1} 个字符之间", minRowCountError: "最少需要填写 {0} 行答案", minSelectError: "最少需要选择 {0} 项答案", maxSelectError: "最多只能选择 {0} 项答案", numericMinMax: "答案 '{0}' 必须大于等于 {1} 且小于等于 {2}", numericMin: "答案 '{0}' 必须大于等于 {1}", numericMax: "答案 '{0}' 必须小于等于 {1}", invalidEmail: "请输入有效的 Email 地址", invalidExpression: "公式: {0} 无效.", urlRequestError: "载入选项时发生错误 '{0}': {1}", urlGetChoicesError: "未能载入有效的选项或请求参数路径有误", exceedMaxSize: "文件大小不能超过 {0}", otherRequiredError: "请完成其他问题", uploadingFile: "文件上传中... 请耐心等待几秒后重试", loadingFile: "加载...", chooseFile: "选择文件...", noFileChosen: "未选择文件", confirmDelete: "删除记录?", keyDuplicationError: "主键不能重复", addColumn: "添加列", addRow: "添加行", removeRow: "删除答案", emptyRowsText: "无内容", addPanel: "新添", removePanel: "删除", choices_Item: "选项", matrix_column: "列", matrix_row: "行", multipletext_itemname: "文本", savingData: "正在将结果保存到服务器...", savingDataError: "在保存结果过程中发生了错误,结果未能保存", savingDataSuccess: "结果保存成功!", saveAgainButton: "请重试", timerMin: "分", timerSec: "秒", timerSpentAll: "本页用时 {0} 总计用时{1} .", timerSpentPage: "本页用时{0} .", timerSpentSurvey: "总计用时 {0} .", timerLimitAll: "本页用时 {0} 共 {1}, 总计用时 {2} 共 {3} .", timerLimitPage: "本页用时 {0} 共 {1} .", timerLimitSurvey: "总计用时 {0} 共 {1}.", cleanCaption: "清理", clearCaption: "清除", chooseFileCaption: "选择文件", removeFileCaption: "移除文件", booleanCheckedLabel: "是", booleanUncheckedLabel: "否", confirmRemoveFile: "删除文件: {0}?", confirmRemoveAllFiles: "删除所有文件?", questionTitlePatternText: "标题", modalCancelButtonText: "取消", modalApplyButtonText: "确定", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["zh-cn"] = simplifiedChineseSurveyStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["zh-cn"] = "简体中文"; /***/ }), /***/ "./src/localization/spanish.ts": /*!*************************************!*\ !*** ./src/localization/spanish.ts ***! \*************************************/ /*! exports provided: spanishSurveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "spanishSurveyStrings", function() { return spanishSurveyStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var spanishSurveyStrings = { pagePrevText: "Anterior", pageNextText: "Siguiente", completeText: "Completar", previewText: "Vista previa", editText: "Edita", startSurveyText: "Comienza", otherItemText: "Otro (describa)", noneItemText: "Ninguno", selectAllItemText: "Seleccionar todo", progressText: "Página {0} de {1}", panelDynamicProgressText: "Registro {0} de {1}", questionsProgressText: "Respondió a {0}/{1} preguntas", emptySurvey: "No hay página visible o pregunta en la encuesta.", completingSurvey: "Gracias por completar la encuesta!", completingSurveyBefore: "Nuestros registros muestran que ya ha completado esta encuesta.", loadingSurvey: "La encuesta está cargando...", optionsCaption: "Seleccione...", value: "valor", requiredError: "Por favor conteste la pregunta.", requiredErrorInPanel: "Por favor, responda al menos una pregunta.", requiredInAllRowsError: "Por favor conteste las preguntas en cada hilera.", numericError: "La estimación debe ser numérica.", minError: "La estimación no debe ser menor que {0}", maxError: "La estimación no debe ser mayor que {0}", textMinLength: "Por favor entre por lo menos {0} símbolos.", textMaxLength: "Por favor entre menos de {0} símbolos.", textMinMaxLength: "Por favor entre más de {0} y menos de {1} símbolos.", minRowCountError: "Por favor llene por lo menos {0} hileras.", minSelectError: "Por favor seleccione por lo menos {0} variantes.", maxSelectError: "Por favor seleccione no más de {0} variantes.", numericMinMax: "El '{0}' debe de ser igual o más de {1} y igual o menos de {2}", numericMin: "El '{0}' debe ser igual o más de {1}", numericMax: "El '{0}' debe ser igual o menos de {1}", invalidEmail: "Por favor agregue un correo electrónico válido.", invalidExpression: "La expresión: {0} debería devolver 'verdadero'.", urlRequestError: "La solicitud regresó error '{0}'. {1}", urlGetChoicesError: "La solicitud regresó vacío de data o la propiedad 'trayectoria' no es correcta", exceedMaxSize: "El tamaño del archivo no debe de exceder {0}.", otherRequiredError: "Por favor agregue la otra estimación.", uploadingFile: "Su archivo se está subiendo. Por favor espere unos segundos e intente de nuevo.", loadingFile: "Cargando...", chooseFile: "Elija archivo(s)...", noFileChosen: "No se ha elegido ningún archivo", confirmDelete: "¿Quieres borrar el registro?", keyDuplicationError: "Este valor debe ser único.", addColumn: "Añadir columna", addRow: "Agregue una hilera", removeRow: "Eliminar una hilera", emptyRowsText: "No hay hileras.", addPanel: "Añadir nuevo", removePanel: "Retire", choices_Item: "artículo", matrix_column: "Columna", matrix_row: "Hilera", multipletext_itemname: "texto", savingData: "Los resultados se están guardando en el servidor...", savingDataError: "Los resultados se están guardando en el servidor...", savingDataSuccess: "¡Los resultados se guardaron con éxito!", saveAgainButton: "Inténtalo de nuevo.", timerMin: "min", timerSec: "sec", timerSpentAll: "Has gastado {0} en esta página y {1} en total.", timerSpentPage: "Usted ha pasado {0} en esta página.", timerSpentSurvey: "Has gastado en total.", timerLimitAll: "Has gastado {0} de {1} en esta página y {2} de {3} en total.", timerLimitPage: "Has gastado {0} de {1} en esta página.", timerLimitSurvey: "Usted ha gastado {0} de {1} en total.", cleanCaption: "Limpia", clearCaption: "Despejen", signaturePlaceHolder: "Firma aqui", chooseFileCaption: "Elija el archivo", removeFileCaption: "Elimina este archivo", booleanCheckedLabel: "Sí", booleanUncheckedLabel: "No", confirmRemoveFile: "¿Estás seguro de que quieres eliminar este archivo: {0}?", confirmRemoveAllFiles: "¿Estás seguro de que quieres eliminar todos los archivos?", questionTitlePatternText: "Título de la pregunta", modalCancelButtonText: "Anular", modalApplyButtonText: "Aplicar", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["es"] = spanishSurveyStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["es"] = "español"; /***/ }), /***/ "./src/localization/swahili.ts": /*!*************************************!*\ !*** ./src/localization/swahili.ts ***! \*************************************/ /*! exports provided: swahiliStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "swahiliStrings", function() { return swahiliStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var swahiliStrings = { pagePrevText: "Iliyotangulia", pageNextText: "Ifuatayo", completeText: "Kamili", previewText: "Hakiki", editText: "Hariri", startSurveyText: "Anza", otherItemText: "Nyingine (eleza)", noneItemText: "Hakuna", selectAllItemText: "Chagua Zote", progressText: "Ukurasa {0} wa {1}", panelDynamicProgressText: "Rekodi {0} ya {1}", questionsProgressText: "Yaliyojibiwa {0}/{1} maswali", emptySurvey: "Hakuna ukurasa unaoonekana au swali katika utafiti.", completingSurvey: "Asanti kwa kukamilisha utafiti!", completingSurveyBefore: "Recodi zetu zinatuonyesha tayari umekamilisha utafiti.", loadingSurvey: "Tunaandaa utafiti...", optionsCaption: "Chagua...", value: "thamani", requiredError: "Tafadhali jibu hili swali.", requiredErrorInPanel: "Tafadhali jibu swali angalau moja.", requiredInAllRowsError: "Tafadhali jibu maswali katika safu zote.", numericError: "Thamani inapaswa kuwa ya nambari.", textMinLength: "Tafadhali ingiza angalau{0} husika.", textMaxLength: "Tafadhali ingiza isiozidi {0} husika.", textMinMaxLength: "Tafadhali ingiza kiwango zaidi ya {0} na kisichopungua {1} husika.", minRowCountError: "Tafadhali jaza isiopungua {0} safu.", minSelectError: "Tafadhali chagua angalau {0} lahaja.", maxSelectError: "Tafadhali changua isiozidi {0} lahaja.", numericMinMax: " '{0}' inapaswa kuwa sawa au zaidi ya {1} na sawa au chini ya {2}", numericMin: " '{0}'inapaswa kuwa sawa au zaidi ya {1}", numericMax: " '{0}'inapaswa kuwa sawa au chini ya {1}", invalidEmail: "Tafadhali ingiza anwani halali ya barua-pepe.", invalidExpression: "Usemi:{0} inapaswa kurudi 'kweli'.", urlRequestError: "Ombi lina kosa '{0}'. {1}", urlGetChoicesError: "Ombi lilirudisha data tupu au the 'path' mali ya njia sio sahihi", exceedMaxSize: "Saizi ya faili haipaswi kuzidi {0}.", otherRequiredError: "Tafadhali ingiza thamani nyingine.", uploadingFile: "Faili yako inapakia.Tafadhali subiri sekunde kadhaa na ujaribu tena.", loadingFile: "Inapakia...", chooseFile: "Chagua faili...", noFileChosen: "Hujachagua faili", confirmDelete: "Je! Unataka kufuta rekodi?", keyDuplicationError: "Thamani hii inapaswa kuwa ya kipekee.", addColumn: "Ongeza Kolamu", addRow: "Ongeza safu", removeRow: "Toa", addPanel: "Ongeza mpya", removePanel: "Toa", choices_Item: "kitu", matrix_column: "Kolamu", matrix_row: "Safu", savingData: "Matokeo yamehifadhiwa kwa seva...", savingDataError: "Kosa limetokea na hatukuweza kuhifadhi matokeo.", savingDataSuccess: "Matokeo yamehifadhiwa!", saveAgainButton: "Jaribu tena", timerMin: "dakika", timerSec: "sekunde", timerSpentAll: "Umetumia {0} kwenye ukurasa huu na {1} kwa jumla.", timerSpentPage: "Umetumia {0} kwenye ukurasa huu.", timerSpentSurvey: "Umetumia {0} kwa jumla.", timerLimitAll: "Umetumia {0} ya {1} kwenye ukurasa huu {2} wa {3} kwa jumla.", timerLimitPage: "Umetumia {0} ya {1} kwenye ukurasa huu.", timerLimitSurvey: "Umetumia {0} ya {1} kwa jumla.", cleanCaption: "Safisha", clearCaption: "Ondoa", chooseFileCaption: "Chagua faili", removeFileCaption: "Ondoa faili", booleanCheckedLabel: "Ndio", booleanUncheckedLabel: "Hapana", confirmRemoveFile: "Je! Una uhakika kuwa unataka kuondoa faili hii: {0}?", confirmRemoveAllFiles: "Je! Una uhakika kuwa unataka kuondoa faili zote?", questionTitlePatternText: "Kichwa cha Swali", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["sw"] = swahiliStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["sw"] = "swahili"; /***/ }), /***/ "./src/localization/swedish.ts": /*!*************************************!*\ !*** ./src/localization/swedish.ts ***! \*************************************/ /*! exports provided: swedishSurveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "swedishSurveyStrings", function() { return swedishSurveyStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); //Create by Mattias Asplund var swedishSurveyStrings = { pagePrevText: "Föregående", pageNextText: "Nästa", completeText: "Färdig", previewText: "Förhandsvisning", editText: "Redigera", startSurveyText: "Start", otherItemText: "Annat (beskriv)", noneItemText: "Ingen", selectAllItemText: "Välj alla", progressText: "Sida {0} av {1}", panelDynamicProgressText: "Spela in {0} av {1}", questionsProgressText: "Besvarade {0} / {1} frågor", emptySurvey: "Det finns ingen synlig sida eller fråga i enkäten.", completingSurvey: "Tack för att du genomfört enkäten!!", completingSurveyBefore: "Våra register visar att du redan har slutfört denna undersökning.", loadingSurvey: "Enkäten laddas...", optionsCaption: "Välj...", value: "värde", requiredError: "Var vänlig besvara frågan.", requiredErrorInPanel: "Vänligen svara på minst en fråga.", requiredInAllRowsError: "Var vänlig besvara frågorna på alla rader.", numericError: "Värdet ska vara numeriskt.", textMinLength: "Var vänlig ange minst {0} tecken.", textMaxLength: "Ange färre än {0} tecken.", textMinMaxLength: "Ange mer än {0} och färre än {1} tecken.", minRowCountError: "Var vänlig fyll i minst {0} rader.", minSelectError: "Var vänlig välj åtminstone {0} varianter.", maxSelectError: "Var vänlig välj inte fler än {0} varianter.", numericMinMax: "'{0}' ska vara lika med eller mer än {1} samt lika med eller mindre än {2}", numericMin: "'{0}' ska vara lika med eller mer än {1}", numericMax: "'{0}' ska vara lika med eller mindre än {1}", invalidEmail: "Var vänlig ange en korrekt e-postadress.", invalidExpression: "Uttrycket: {0} ska returnera 'true'.", urlRequestError: "Förfrågan returnerade felet '{0}'. {1}", urlGetChoicesError: "Antingen returnerade förfrågan ingen data eller så är egenskapen 'path' inte korrekt", exceedMaxSize: "Filstorleken får ej överstiga {0}.", otherRequiredError: "Var vänlig ange det andra värdet.", uploadingFile: "Din fil laddas upp. Var vänlig vänta några sekunder och försök sedan igen.", loadingFile: "Läser in...", chooseFile: "Välj fil (er) ...", noFileChosen: "Ingen fil vald", confirmDelete: "Vill du radera posten?", keyDuplicationError: "Detta värde ska vara unikt.", addColumn: "Lägg till kolumn", addRow: "Lägg till rad", removeRow: "Ta bort", addPanel: "Lägg till ny", removePanel: "Ta bort", choices_Item: "Artikel", matrix_column: "Kolumn", matrix_row: "Rad", savingData: "Resultaten sparas på servern ...", savingDataError: "Ett fel inträffade och vi kunde inte spara resultaten.", savingDataSuccess: "Resultaten sparades framgångsrikt!", saveAgainButton: "Försök igen", timerMin: "min", timerSec: "sek", timerSpentAll: "Du har spenderat {0} på den här sidan och {1} totalt.", timerSpentPage: "Du har spenderat {0} på den här sidan.", timerSpentSurvey: "Du har spenderat {0} totalt.", timerLimitAll: "Du har spenderat {0} av {1} på den här sidan och {2} av {3} totalt.", timerLimitPage: "Du har spenderat {0} av {1} på den här sidan.", timerLimitSurvey: "Du har spenderat {0} av {1} totalt.", cleanCaption: "Rena", clearCaption: "Klar", chooseFileCaption: "Välj FIL", removeFileCaption: "Ta bort den här filen", booleanCheckedLabel: "Ja", booleanUncheckedLabel: "Nej", confirmRemoveFile: "Är du säker på att du vill ta bort den här filen: {0}?", confirmRemoveAllFiles: "Är du säker på att du vill ta bort alla filer?", questionTitlePatternText: "Frågetitel", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["sv"] = swedishSurveyStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["sv"] = "svenska"; /***/ }), /***/ "./src/localization/tajik.ts": /*!***********************************!*\ !*** ./src/localization/tajik.ts ***! \***********************************/ /*! exports provided: tajikSurveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tajikSurveyStrings", function() { return tajikSurveyStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var tajikSurveyStrings = { pagePrevText: "Бозгашт", pageNextText: "Оянда", completeText: "Иҷро шуд", startSurveyText: "Оғоз", otherItemText: "Дигар (лутфан тавсиф кунед)", noneItemText: "Не", selectAllItemText: "Ҳамаро интихоб кардан", progressText: "Саҳифаи {0} аз {1}", emptySurvey: "Ягон савол вуҷуд надорад.", completingSurvey: "Ташаккур барои пур кардани саволнома!", completingSurveyBefore: "Шумо аллакай ин пурсишро анҷом додаед.", loadingSurvey: "Боргирӣ аз сервер...", optionsCaption: "Интихоб кардан...", value: "қиммат", requiredError: "Илтимос, ба савол ҷавоб диҳед.", requiredErrorInPanel: "Илтимос, ақалан ба як савол ҷавоб диҳед.", requiredInAllRowsError: "Илтимос, ба ҳамаи саволҳо дар ҳамаи сатрҳо ҷавоб диҳед.", numericError: "Ҷавоб бояд рақам бошад.", textMinLength: "Илтимос, аз {0} зиёдтар рамз ворид кунед.", textMaxLength: "Илтимос, аз {0} камтар рамз ворид кунед.", textMinMaxLength: "Илтимос, аз {0} зиёдтар ва аз {1} камтар рамз ворид кунед.", minRowCountError: "Илтимос, на камтар аз {0} сатр пур кунед.", minSelectError: "Илтимос, ақалан {0} вариант интихоб кунед.", maxSelectError: "Илтимос, на зиёдтар аз {0} вариант интихоб кунед.", numericMinMax: "'{0}' бояд на кам аз {1} ва на бисёр аз {2} бошад", numericMin: "'{0}' бояд на кам аз {1} бошад", numericMax: "'{0}' бояд на зиёд аз {1} бошад", invalidEmail: "Илтимос, почтаи электронии воқеиро ворид кунед.", invalidExpression: "Ифодаи {0} бояд 'true' баргардонад.", urlRequestError: "Дархост хатогӣ бозгардонд '{0}'. {1}", urlGetChoicesError: "Ҷавоб ба дархост холӣ омад ё хосияти 'path' нодуруст муайян карда шудааст", exceedMaxSize: "Андозаи файл бояд на калон аз {0} бошад.", otherRequiredError: "Илтимос, ба майдони 'Дигар' додаҳоро ворид кунед", uploadingFile: "Файли шумо бор шуда истодааст. Якчанд сония интизор шавед ва бори дигар кӯшиш кунед.", loadingFile: "Боркунӣ...", chooseFile: "Файл(ҳо)-ро интихоб кунед...", confirmDelete: "Шумо мутмаин ҳастед, ки мехоҳед воридро тоза кунед?", keyDuplicationError: "Ин арзиш бояд беназир бошад.", addColumn: "Иловаи сутун", addRow: "Иловаи сатр", removeRow: "Нест кардан", addPanel: "Илова кардан", removePanel: "Нест кардан", choices_Item: "Вариант", matrix_column: "Сутун", matrix_row: "Сатр", savingData: "Натиҷа ба сервер сабт шуда истодаанд...", savingDataError: "Хатогӣ ба амал омад, натиҷа сабт нашуд.", savingDataSuccess: "Натиҷа бомуваффакият сабт шуд!", saveAgainButton: "Бори дигар кӯшиш карданд", timerMin: "дақ", timerSec: "сон", timerSpentAll: "Шумо {0} дар ин саҳифа ва {1} дар умум сарф кардед.", timerSpentPage: "Шумо {0} дар ин саҳифа сарф кардед.", timerSpentSurvey: "Шумо {0} дар ин тест сарф намудед.", timerLimitAll: "Шумо {0} аз {1} дар ин саҳифа ва {2} аз {3} дар умум сарф кардед дар дохили ин тест.", timerLimitPage: "Шумо {0} аз {1} дар ин саҳифа сарф кардед.", timerLimitSurvey: "Шумо {0} аз {1} дар ҳамаи тест сарф кардед.", cleanCaption: "Тоза кардан", clearCaption: "Тоза кардан", removeFileCaption: "Файлро нест кардан" }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["tg"] = tajikSurveyStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["tg"] = "тоҷикӣ"; /***/ }), /***/ "./src/localization/thai.ts": /*!**********************************!*\ !*** ./src/localization/thai.ts ***! \**********************************/ /*! exports provided: thaiStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "thaiStrings", function() { return thaiStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); //Created by Padet Taweekunkan var thaiStrings = { pagePrevText: "ก่อนหน้า", pageNextText: "ถัดไป", completeText: "สำเร็จ", previewText: "ดูตัวอย่าง", editText: "แก้ไข", startSurveyText: "เริ่ม", otherItemText: "อื่นๆ (โปรดระบุ)", noneItemText: "ไม่มี", selectAllItemText: "เลือกทั้งหมด", progressText: "หน้าที่ {0} จาก {1}", panelDynamicProgressText: "รายการที่ {0} จาก {1}", questionsProgressText: "คำตอบที่ {0}/{1} จำนวนคำถาม", emptySurvey: "ไม่มีหน้าเพจที่มองเห็น หรือ คำถามใน survey นี้", completingSurvey: "ขอบคุณที่ทำ survey จนเสร็จ", completingSurveyBefore: "รายการของเราแสดงว่าคุณได้ทำ survey เสร็จเรียบร้อยแล้ว", loadingSurvey: "กำลังโหลด Survey...", optionsCaption: "เลือก...", value: "ข้อมูล", requiredError: "กรุณาตอบคำถาม", requiredErrorInPanel: "กรุณาตอบขั้นต่ำหนึ่งคำถาม", requiredInAllRowsError: "กรุณาตอบคำถามในทุกๆแถว", numericError: "ข้อมูลที่ใส่ต้องเป็นตัวเลข", textMinLength: "กรุณาใส่ขั้นต่ำจำนวน {0} ตัวอักษร", textMaxLength: "กรุณาใส่ไม่เกินจำนวน {0} ตัวอักษร", textMinMaxLength: "กรุณาใส่ขั้นต่ำจำนวน {0} และไม่เกินจำนวน {1} ตัวอักษร", minRowCountError: "กรุณาใส่ขั้นต่ำจำนวน {0} แถว", minSelectError: "กรุณาเลือกอย่างน้อย {0} รายการ", maxSelectError: "กรุณาเลือกไม่เกิน {0} รายการ", numericMinMax: "'{0}' ต้องมากกว่าหรือเท่ากับ {1} และน้อยกว่าหรือเท่ากับ {2}", numericMin: "'{0}' ต้องมากกว่าหรือเท่ากับ {1}", numericMax: "'{0}' น้อยกว่าหรือเท่ากับ {1}", invalidEmail: "กรุณาใส่อีเมล์แอดเดรสที่ถูกต้อง", invalidExpression: "The expression: {0} ต้องรีเทิร์น 'true'.", urlRequestError: "รีเควสรีเทิร์น error '{0}'. {1}", urlGetChoicesError: "รีเควสรีเทิร์นข้อมูลว่างเปล่า หรือ 'path' property ไม่ถูกต้อง", exceedMaxSize: "ขนาดไฟล์ต้องไม่เกิน {0}.", otherRequiredError: "กรุณาใส่ค่าอื่น", uploadingFile: "ไฟล์ของคุณกำลังอัพโหลดอยู่. กรุณารอสักครู่แล้วทำการลองอีกครั้ง", loadingFile: "กำลังโหลด...", chooseFile: "เลือกไฟล์...", noFileChosen: "ไม่ไฟล์ที่เลือก", confirmDelete: "คุณต้องการลบรายการนี้จริงหรือไม่?", keyDuplicationError: "ข้อมูลนี้ต้องเป็น unique.", addColumn: "เพิ่มคอลัมน์", addRow: "เพิ่มแถว", removeRow: "ลบ", addPanel: "เพิ่ม", removePanel: "ลบ", choices_Item: "ชิ้น", matrix_column: "คอลัมน์", matrix_row: "แถว", savingData: "ผลลัพท์กำลังบันทึกลงที่เซิร์ฟเวอร์...", savingDataError: "มีความผิดพลาดเกิดขึ้นส่งผลให้ไม่สามารถบันทึกผลได้", savingDataSuccess: "บันทึกสำเร็จแล้ว", saveAgainButton: "รบกวนลองอีกครั้ง", timerMin: "นาที", timerSec: "วินาที", timerSpentAll: "คุณใช้เวลา {0} บนหน้านี้และ {1} รวมทั้งหมด", timerSpentPage: "คุณใช้เวลา {0} บนหน้านี้", timerSpentSurvey: "คุณใช้เวลา {0} รวมทั้งหมด", timerLimitAll: "คุณใช้เวลา {0} ของ {1} บนหน้านี้และ {2} ของ {3} รวมทั้งหมด", timerLimitPage: "คุณใช้เวลา {0} ของ {1} บนหน้านี้", timerLimitSurvey: "คุณใช้เวลา {0} ของ {1} รวมทั้งหมด", cleanCaption: "คลีน", clearCaption: "เคลียร์", chooseFileCaption: "เลือกไฟล์", removeFileCaption: "นำไฟล์นี้ออก", booleanCheckedLabel: "ใช่", booleanUncheckedLabel: "ไม่ใช่", confirmRemoveFile: "คุณแน่ใจที่จะนำไฟล์นี้ออกใช่หรือไม่: {0}?", confirmRemoveAllFiles: "คุณแน่ใจที่จะนำไฟล์ทั้งหมดออกใช่หรือไม่", questionTitlePatternText: "ชื่อคำถาม", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["th"] = thaiStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["th"] = "ไทย"; /***/ }), /***/ "./src/localization/traditional-chinese.ts": /*!*************************************************!*\ !*** ./src/localization/traditional-chinese.ts ***! \*************************************************/ /*! exports provided: traditionalChineseSurveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "traditionalChineseSurveyStrings", function() { return traditionalChineseSurveyStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var traditionalChineseSurveyStrings = { pagePrevText: "上一頁", pageNextText: "下一頁", completeText: "提交問卷", otherItemText: "填寫其他答案", progressText: "第 {0} 頁, 共 {1} 頁", emptySurvey: "問卷中沒有問題或頁面", completingSurvey: "感謝您的參與!", loadingSurvey: "問卷載入中...", optionsCaption: "請選擇...", requiredError: "請填寫此問題", requiredInAllRowsError: "請填寫所有行中問題", numericError: "答案必須是個數字", textMinLength: "答案長度至少 {0} 個字元", textMaxLength: "答案長度不能超過 {0} 個字元", textMinMaxLength: "答案長度必須在 {0} - {1} 個字元之間", minRowCountError: "最少需要填寫 {0} 行答案", minSelectError: "最少需要選擇 {0} 項答案", maxSelectError: "最多只能選擇 {0} 項答案", numericMinMax: "答案 '{0}' 必須大於等於 {1} 且小於等於 {2}", numericMin: "答案 '{0}' 必須大於等於 {1}", numericMax: "答案 '{0}' 必須小於等於 {1}", invalidEmail: "請輸入有效的 Email 地址", urlRequestError: "載入選項時發生錯誤 '{0}': {1}", urlGetChoicesError: "未能載入有效的選項或請求參數路徑有誤", exceedMaxSize: "文件大小不能超過 {0}", otherRequiredError: "請完成其他問題", uploadingFile: "文件上傳中... 請耐心等待幾秒後重試", addRow: "添加答案", removeRow: "刪除答案", choices_Item: "選項", matrix_column: "列", matrix_row: "行", savingData: "正在將結果保存到服務器...", savingDataError: "在保存結果過程中發生了錯誤,結果未能保存", savingDataSuccess: "結果保存成功!", saveAgainButton: "請重試" }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["zh-tw"] = traditionalChineseSurveyStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["zh-tw"] = "繁體中文"; /***/ }), /***/ "./src/localization/turkish.ts": /*!*************************************!*\ !*** ./src/localization/turkish.ts ***! \*************************************/ /*! exports provided: turkishSurveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "turkishSurveyStrings", function() { return turkishSurveyStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var turkishSurveyStrings = { pagePrevText: "Geri", pageNextText: "İleri", completeText: "Anketi Tamamla", previewText: "Ön izleme", editText: "Düzenle", startSurveyText: "Başlat", otherItemText: "Diğer (açıklayınız)", noneItemText: "Yok", selectAllItemText: "Hepsini seç", progressText: "Sayfa {0} / {1}", panelDynamicProgressText: "Kayıt {0} / {1}", questionsProgressText: "Soruları cevapladı {0} / {1}", emptySurvey: "Ankette görüntülenecek sayfa ya da soru mevcut değil.", completingSurvey: "Anketimizi tamamladığınız için teşekkür ederiz.", completingSurveyBefore: "Kayıtlarımız, bu anketi zaten tamamladığınızı gösteriyor.", loadingSurvey: "Anket sunucudan yükleniyor ...", optionsCaption: "Seçiniz ...", value: "değer", requiredError: "Lütfen soruya cevap veriniz", requiredErrorInPanel: "Lütfen en az bir soruyu yanıtlayın.", requiredInAllRowsError: "Lütfen tüm satırlardaki soruları cevaplayınız.", numericError: "Girilen değer numerik olmalıdır", textMinLength: "En az {0} sembol giriniz.", textMaxLength: "Lütfen {0} karakterden az girin.", textMinMaxLength: "Lütfen {0} ’den fazla ve {1} ’den az karakter girin.", minRowCountError: "Lütfen en az {0} satırı doldurun.", minSelectError: "Lütfen en az {0} seçeneği seçiniz.", maxSelectError: "Lütfen {0} adetten fazla seçmeyiniz.", numericMinMax: "The '{0}' should be equal or more than {1} and equal or less than {2}", numericMin: "'{0}' değeri {1} değerine eşit veya büyük olmalıdır", numericMax: "'{0}' değeri {1} değerine eşit ya da küçük olmalıdır.", invalidEmail: "Lütfen geçerli bir eposta adresi giriniz.", invalidExpression: "İfade: {0} 'true' döndürmelidir.", urlRequestError: "Talebi şu hatayı döndü '{0}'. {1}", urlGetChoicesError: "Talep herhangi bir veri dönmedi ya da 'path' özelliği hatalı.", exceedMaxSize: "Dosya boyutu {0} değerini geçemez.", otherRequiredError: "Lütfen diğer değerleri giriniz.", uploadingFile: "Dosyanız yükleniyor. LÜtfen birkaç saniye bekleyin ve tekrar deneyin.", loadingFile: "Yükleniyor...", chooseFile: "Dosyaları seçin ...", noFileChosen: "Dosya seçili değil", confirmDelete: "Kaydı silmek istiyor musunuz?", keyDuplicationError: "Bu değer benzersiz olmalıdır.", addColumn: "Sütun ekleyin", addRow: "Satır Ekle", removeRow: "Kaldır", addPanel: "Yeni ekle", removePanel: "Kaldırmak", choices_Item: "eşya", matrix_column: "Sütun", matrix_row: "Kürek çekmek", savingData: "Sonuçlar sunucuya kaydediliyor ...", savingDataError: "Bir hata oluştu ve sonuçları kaydedemedik.", savingDataSuccess: "Sonuçlar başarıyla kaydedildi!", saveAgainButton: "Tekrar deneyin", timerMin: "min", timerSec: "saniye", timerSpentAll: "Bu sayfada {0} ve toplamda {1} harcadınız.", timerSpentPage: "Bu sayfaya {0} harcadınız.", timerSpentSurvey: "Toplamda {0} harcadınız.", timerLimitAll: "Bu sayfaya {0} / {1} ve toplamda {2} / {3} harcadınız.", timerLimitPage: "Bu sayfaya {0} / {1} harcadınız.", timerLimitSurvey: "Toplamda {0} / {1} harcadınız.", cleanCaption: "Temiz", clearCaption: "Açık", chooseFileCaption: "Dosya seçin", removeFileCaption: "Bu dosyayı kaldır", booleanCheckedLabel: "Evet", booleanUncheckedLabel: "Hayır", confirmRemoveFile: "Bu dosyayı kaldırmak istediğinizden emin misiniz: {0}?", confirmRemoveAllFiles: "Tüm dosyaları kaldırmak istediğinizden emin misiniz?", questionTitlePatternText: "Soru başlığı", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["tr"] = turkishSurveyStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["tr"] = "türkçe"; /***/ }), /***/ "./src/localization/ukrainian.ts": /*!***************************************!*\ !*** ./src/localization/ukrainian.ts ***! \***************************************/ /*! exports provided: ukrainianSurveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ukrainianSurveyStrings", function() { return ukrainianSurveyStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var ukrainianSurveyStrings = { pagePrevText: "Назад", pageNextText: "Далі", completeText: "Завершити", previewText: "Попередній перегляд", editText: "Редагувати", startSurveyText: "Почати", otherItemText: "Інше (будь ласка, опишіть)", noneItemText: "Жоден", selectAllItemText: "Вибрати все", progressText: "Сторінка {0} з {1}", panelDynamicProgressText: "Запис {0} із {1}", questionsProgressText: "Відповіли на {0}/{1} питань", emptySurvey: "Немає жодного питання.", completingSurvey: "Дякуємо Вам за заповнення анкети!", completingSurveyBefore: "Ви вже проходили це опитування.", loadingSurvey: "Завантаження опитування...", optionsCaption: "Вибрати...", value: "значення", requiredError: "Будь ласка, дайте відповідь.", requiredErrorInPanel: "Будь ласка, дайте відповідь хоча б на одне питання.", requiredInAllRowsError: "Будь ласка, дайте відповідь на питання в кожному рядку.", numericError: "Відповідь повинна бути числом.", textMinLength: "Будь ласка введіть більше {0} символів.", textMaxLength: "Будь ласка введіть менше {0} символів.", textMinMaxLength: "Будь ласка введіть більше {0} и менше {1} символів.", minRowCountError: "Будь ласка, заповніть не менше {0} рядків.", minSelectError: "Будь ласка, виберіть хоча б {0} варіантів.", maxSelectError: "Будь ласка, виберіть не більше {0} варіантів.", numericMinMax: "'{0}' повинно бути не менше ніж {1}, і не більше ніж {2}", numericMin: "'{0}' повинно бути не менше ніж {1}", numericMax: "'{0}' повинно бути не більше ніж {1}", invalidEmail: "Будь ласка, введіть дійсну адресу електронної пошти.", invalidExpression: "Вираз {0} повинен повертати 'true'.", urlRequestError: "Запит повернув помилку '{0}'. {1}", urlGetChoicesError: "Відповідь на запит повернулась порожньою або властивіть 'path' вказано невірно", exceedMaxSize: "Розмір файлу не повинен перевищувати {0}.", otherRequiredError: "Будь ласка, введіть дані в поле 'Інше'", uploadingFile: "Ваш файл завантажується. Зачекайте декілька секунд і спробуйте знову.", loadingFile: "Завантаження...", chooseFile: "Виберіть файл(и)...", noFileChosen: "Файл не вибрано", confirmDelete: "Ви хочете видалити запис?", keyDuplicationError: "Це значення повинно бути унікальним.", addColumn: "Додати колонку", addRow: "Додати рядок", removeRow: "Видалити", addPanel: "Додати нову", removePanel: "Видалити", choices_Item: "Варіант", matrix_column: "Колонка", matrix_row: "Рядок", savingData: "Результати зберігаються на сервер...", savingDataError: "Відбулася помилка, результат не був збережений.", savingDataSuccess: "Резвультат успішно збережений!", saveAgainButton: "Спробувати знову", timerMin: "хв", timerSec: "сек", timerSpentAll: "Ви витратили {0} на цій сторінці і {1} загалом.", timerSpentPage: "Ви витратили {0} на цій сторінці.", timerSpentSurvey: "Ви витратили {0} протягом тесту.", timerLimitAll: "Ви витратили {0} з {1} на цій сторінці і {2} з {3} для всього тесту.", timerLimitPage: "Ви витратили {0} з {1} на цій сторінці.", timerLimitSurvey: "Ви витратили {0} з {1} для всього тесту.", cleanCaption: "Очистити", clearCaption: "Очистити", chooseFileCaption: "Виберіть файл", removeFileCaption: "Видалити файл", booleanCheckedLabel: "Так", booleanUncheckedLabel: "Ні", confirmRemoveFile: "Ви впевнені, що хочете видалити цей файл: {0}?", confirmRemoveAllFiles: "Ви впевнені, що хочете видалити всі файли?", questionTitlePatternText: "Назва запитання", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["ua"] = ukrainianSurveyStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["ua"] = "українська"; /***/ }), /***/ "./src/localization/vietnamese.ts": /*!****************************************!*\ !*** ./src/localization/vietnamese.ts ***! \****************************************/ /*! exports provided: vietnameseSurveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "vietnameseSurveyStrings", function() { return vietnameseSurveyStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); //Uncomment this line on creating a translation file var vietnameseSurveyStrings = { pagePrevText: "Previous", pageNextText: "Next", completeText: "Complete", previewText: "Preview", editText: "Edit", startSurveyText: "Start", otherItemText: "Other (describe)", noneItemText: "None", selectAllItemText: "Select All", progressText: "Page {0} of {1}", panelDynamicProgressText: "Record {0} of {1}", questionsProgressText: "Answered {0}/{1} questions", emptySurvey: "There is no visible page or question in the survey.", completingSurvey: "Thank you for completing the survey!", completingSurveyBefore: "Our records show that you have already completed this survey.", loadingSurvey: "Loading Survey...", optionsCaption: "Chọn...", value: "value", requiredError: "Please answer the question.", requiredErrorInPanel: "Please answer at least one question.", requiredInAllRowsError: "Please answer questions in all rows.", numericError: "The value should be numeric.", textMinLength: "Please enter at least {0} characters.", textMaxLength: "Please enter less than {0} characters.", textMinMaxLength: "Please enter more than {0} and less than {1} characters.", minRowCountError: "Please fill in at least {0} rows.", minSelectError: "Please select at least {0} variants.", maxSelectError: "Please select no more than {0} variants.", numericMinMax: "The '{0}' should be equal or more than {1} and equal or less than {2}", numericMin: "The '{0}' should be equal or more than {1}", numericMax: "The '{0}' should be equal or less than {1}", invalidEmail: "Please enter a valid e-mail address.", invalidExpression: "The expression: {0} should return 'true'.", urlRequestError: "The request returned error '{0}'. {1}", urlGetChoicesError: "The request returned empty data or the 'path' property is incorrect", exceedMaxSize: "The file size should not exceed {0}.", otherRequiredError: "Please enter the other value.", uploadingFile: "Your file is uploading. Please wait several seconds and try again.", loadingFile: "Loading...", chooseFile: "Choose file(s)...", noFileChosen: "No file chosen", confirmDelete: "Do you want to delete the record?", keyDuplicationError: "This value should be unique.", addColumn: "Add column", addRow: "Add row", removeRow: "Remove", addPanel: "Add new", removePanel: "Remove", choices_Item: "item", matrix_column: "Column", matrix_row: "Row", savingData: "The results are saving on the server...", savingDataError: "An error occurred and we could not save the results.", savingDataSuccess: "The results were saved successfully!", saveAgainButton: "Try again", timerMin: "min", timerSec: "sec", timerSpentAll: "You have spent {0} on this page and {1} in total.", timerSpentPage: "You have spent {0} on this page.", timerSpentSurvey: "You have spent {0} in total.", timerLimitAll: "You have spent {0} of {1} on this page and {2} of {3} in total.", timerLimitPage: "You have spent {0} of {1} on this page.", timerLimitSurvey: "You have spent {0} of {1} in total.", cleanCaption: "Clean", clearCaption: "Clear", chooseFileCaption: "Choose file", removeFileCaption: "Remove this file", booleanCheckedLabel: "Yes", booleanUncheckedLabel: "No", confirmRemoveFile: "Are you sure that you want to remove this file: {0}?", confirmRemoveAllFiles: "Are you sure that you want to remove all files?", questionTitlePatternText: "Question Title", }; //Uncomment these two lines on creating a translation file. You should replace "en" and enStrings with your locale ("fr", "de" and so on) and your variable. _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["vi"] = vietnameseSurveyStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["vi"] = "vietnamese"; /***/ }), /***/ "./src/localization/welsh.ts": /*!***********************************!*\ !*** ./src/localization/welsh.ts ***! \***********************************/ /*! exports provided: welshSurveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "welshSurveyStrings", function() { return welshSurveyStrings; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ "./src/surveyStrings.ts"); var welshSurveyStrings = { pagePrevText: "Blaenorol", pageNextText: "Nesaf", completeText: "Cwblhau", previewText: "Rhagolwg", editText: "Golygu", startSurveyText: "Dechrau", otherItemText: "Arall (disgrifiwch)", noneItemText: "Dim", selectAllItemText: "Dewis y Cyfan ", progressText: "Tudalen {0} o {1}", panelDynamicProgressText: "Cofnod {0} o {1}", questionsProgressText: "Wedi ateb {0}/{1} cwestiwn", emptySurvey: "Does dim modd gweld tudalen na chwestiwn yn yr arolwg.", completingSurvey: "Diolch am lenwi’r holiadur!", completingSurveyBefore: "Rydych chi wedi llenwi’r arolwg hwn yn barod yn ôl ein cofnodion.", loadingSurvey: "Wrthi’n Llwytho’r Arolwg...", optionsCaption: "Dewiswch...", value: "gwerth", requiredError: "Atebwch y cwestiwn.", requiredErrorInPanel: "Atebwch o leiaf un cwestiwn.", requiredInAllRowsError: "Atebwch y cwestiynau ym mhob rhes.", numericError: "Dylai’r gwerth fod yn rhif.", textMinLength: "Rhowch o leiaf {0} nod.", textMaxLength: "Rhowch lai na {0} nod.", textMinMaxLength: "Rhowch o leiaf {0} nod ond dim mwy na {1}.", minRowCountError: "Llenwch o leiaf {0} rhes.", minSelectError: "Dewiswch o leiaf {0} amrywiolyn.", maxSelectError: "Peidiwch â dewis mwy na {0} amrywiolyn.", numericMinMax: "Dylai’r '{0}' fod yr un fath â {1} neu’n fwy, a’r fath â {2} neu’n llai", numericMin: "Dylai’r '{0}' fod yr un fath â {1} neu’n fwy", numericMax: "Dylai’r '{0}' fod yr un fath â {1} neu’n llai", invalidEmail: "Rhowch gyfeiriad e-bost dilys.", invalidExpression: "Dylai’r mynegiad {0} arwain at 'true'.", urlRequestError: "Roedd y cais wedi arwain at y gwall '{0}'. {1}", urlGetChoicesError: "Roedd y cais wedi arwain at ddata gwag neu mae priodwedd y ‘path’ yn anghywir ", exceedMaxSize: "Ddylai’r ffeil ddim bod yn fwy na {0}.", otherRequiredError: "Rhowch y gwerth arall.", uploadingFile: "Mae eich ffeil wrthi’n llwytho i fyny. Arhoswch ychydig o eiliadau a rhoi cynnig arall arni.", loadingFile: "Wrthi’n llwytho...", chooseFile: "Dewiswch ffeil(iau)...", noFileChosen: "Heb ddewis ffeil ", confirmDelete: "Ydych chi am ddileu’r cofnod?", keyDuplicationError: "Dylai’r gwerth hwn fod yn unigryw.", addColumn: "Ychwanegu colofn ", addRow: "Ychwanegu rhes", removeRow: "Tynnu", addPanel: "Ychwanegu o’r newydd", removePanel: "Tynnu", choices_Item: "eitem", matrix_column: "Colofn", matrix_row: "Rhes", savingData: "Mae’r canlyniadau’n cael eu cadw ar y gweinydd...", savingDataError: "Roedd gwall a doedd dim modd cadw’r canlyniadau.", savingDataSuccess: "Wedi llwyddo i gadw’r canlyniadau!", saveAgainButton: "Rhowch gynnig arall arni", timerMin: "mun", timerSec: "eil", timerSpentAll: "Rydych chi wedi treulio {0} ar y dudalen hon a {1} gyda’i gilydd.", timerSpentPage: "Rydych chi wedi treulio {0} ar y dudalen hon.", timerSpentSurvey: "Rydych chi wedi treulio {0} gyda’i gilydd.", timerLimitAll: "Rydych chi wedi treulio {0} o {1} ar y dudalen hon a {2} o {3} gyda’i gilydd.", timerLimitPage: "Rydych chi wedi treulio {0} o {1} ar y dudalen hon.", timerLimitSurvey: "Rydych chi wedi treulio {0} o {1} gyda’i gilydd.", cleanCaption: "Glanhau", clearCaption: "Clirio", chooseFileCaption: "Dewiswch ffeil ", removeFileCaption: "Tynnu’r ffeil hon ", booleanCheckedLabel: "Iawn", booleanUncheckedLabel: "Na", confirmRemoveFile: "Ydych chi’n siŵr eich bod am dynnu’r ffeil hon: {0}?", confirmRemoveAllFiles: "Ydych chi’n siŵr eich bod am dynnu pob ffeil?", questionTitlePatternText: "Teitl y Cwestiwn ", }; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].locales["cy"] = welshSurveyStrings; _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].localeNames["cy"] = "cymraeg"; /***/ }), /***/ "./src/main.scss": /*!***********************!*\ !*** ./src/main.scss ***! \***********************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { // extracted by mini-css-extract-plugin /***/ }), /***/ "./src/martixBase.ts": /*!***************************!*\ !*** ./src/martixBase.ts ***! \***************************/ /*! exports provided: QuestionMatrixBaseModel */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixBaseModel", function() { return QuestionMatrixBaseModel; }); /* harmony import */ var _itemvalue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./itemvalue */ "./src/itemvalue.ts"); /* harmony import */ var _question__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./question */ "./src/question.ts"); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _conditions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./conditions */ "./src/conditions.ts"); /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./helpers */ "./src/helpers.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); /** * A Model for a matrix base question. */ var QuestionMatrixBaseModel = /** @class */ (function (_super) { __extends(QuestionMatrixBaseModel, _super); function QuestionMatrixBaseModel(name) { var _this = _super.call(this, name) || this; _this.generatedVisibleRows = null; _this.generatedTotalRow = null; _this.filteredRows = null; _this.filteredColumns = null; _this.columns = _this.createColumnValues(); _this.rows = _this.createItemValues("rows"); return _this; } QuestionMatrixBaseModel.prototype.createColumnValues = function () { return this.createItemValues("columns"); }; QuestionMatrixBaseModel.prototype.getType = function () { return "matrixbase"; }; Object.defineProperty(QuestionMatrixBaseModel.prototype, "isCompositeQuestion", { get: function () { return true; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixBaseModel.prototype, "showHeader", { /** * Set this property to false, to hide table header. The default value is true. */ get: function () { return this.getPropertyValue("showHeader"); }, set: function (val) { this.setPropertyValue("showHeader", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixBaseModel.prototype, "columns", { /** * The list of columns. A column has a value and an optional text */ get: function () { return this.getPropertyValue("columns"); }, set: function (newValue) { this.setPropertyValue("columns", newValue); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixBaseModel.prototype, "visibleColumns", { get: function () { return !!this.filteredColumns ? this.filteredColumns : this.columns; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixBaseModel.prototype, "rows", { /** * The list of rows. A row has a value and an optional text */ get: function () { return this.getPropertyValue("rows"); }, set: function (newValue) { var newRows = this.processRowsOnSet(newValue); this.setPropertyValue("rows", newRows); this.filterItems(); }, enumerable: false, configurable: true }); QuestionMatrixBaseModel.prototype.processRowsOnSet = function (newRows) { return newRows; }; QuestionMatrixBaseModel.prototype.getVisibleRows = function () { return []; }; Object.defineProperty(QuestionMatrixBaseModel.prototype, "visibleRows", { /** * Returns the list of visible rows as model objects. * @see rowsVisibleIf */ get: function () { return this.getVisibleRows(); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixBaseModel.prototype, "rowsVisibleIf", { /** * An expression that returns true or false. It runs against each row item and if for this item it returns true, then the item is visible otherwise the item becomes invisible. Please use {item} to get the current item value in the expression. * @see visibleIf */ get: function () { return this.getPropertyValue("rowsVisibleIf", ""); }, set: function (val) { this.setPropertyValue("rowsVisibleIf", val); this.filterItems(); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixBaseModel.prototype, "columnsVisibleIf", { /** * An expression that returns true or false. It runs against each column item and if for this item it returns true, then the item is visible otherwise the item becomes invisible. Please use {item} to get the current item value in the expression. * @see rowsVisibleIf */ get: function () { return this.getPropertyValue("columnsVisibleIf", ""); }, set: function (val) { this.setPropertyValue("columnsVisibleIf", val); this.filterItems(); }, enumerable: false, configurable: true }); QuestionMatrixBaseModel.prototype.runCondition = function (values, properties) { _super.prototype.runCondition.call(this, values, properties); this.runItemsCondition(values, properties); }; QuestionMatrixBaseModel.prototype.filterItems = function () { if (this.areInvisibleElementsShowing) { this.onRowsChanged(); return false; } if (this.isLoadingFromJson || !this.data) return false; return this.runItemsCondition(this.getDataFilteredValues(), this.getDataFilteredProperties()); }; QuestionMatrixBaseModel.prototype.onColumnsChanged = function () { }; QuestionMatrixBaseModel.prototype.onRowsChanged = function () { this.fireCallback(this.visibleRowsChangedCallback); }; QuestionMatrixBaseModel.prototype.shouldRunColumnExpression = function () { return !this.survey || !this.survey.areInvisibleElementsShowing; }; QuestionMatrixBaseModel.prototype.hasRowsAsItems = function () { return true; }; QuestionMatrixBaseModel.prototype.runItemsCondition = function (values, properties) { var oldVisibleRows = null; if (!!this.filteredRows && !_helpers__WEBPACK_IMPORTED_MODULE_4__["Helpers"].isValueEmpty(this.defaultValue)) { oldVisibleRows = []; for (var i = 0; i < this.filteredRows.length; i++) { oldVisibleRows.push(this.filteredRows[i]); } } var hasChanges = this.hasRowsAsItems() && this.runConditionsForRows(values, properties); var hasColumnsChanged = this.runConditionsForColumns(values, properties); hasChanges = hasColumnsChanged || hasChanges; if (hasChanges) { if (!!this.survey && this.survey.isClearValueOnHidden && (!!this.filteredColumns || !!this.filteredRows)) { this.clearIncorrectValues(); } if (!!oldVisibleRows) { this.restoreNewVisibleRowsValues(oldVisibleRows); } this.clearGeneratedRows(); if (hasColumnsChanged) { this.onColumnsChanged(); } this.onRowsChanged(); } return hasChanges; }; QuestionMatrixBaseModel.prototype.clearGeneratedRows = function () { this.generatedVisibleRows = null; }; QuestionMatrixBaseModel.prototype.runConditionsForRows = function (values, properties) { var showInvisibile = !!this.survey && this.survey.areInvisibleElementsShowing; var runner = !showInvisibile && !!this.rowsVisibleIf ? new _conditions__WEBPACK_IMPORTED_MODULE_3__["ConditionRunner"](this.rowsVisibleIf) : null; this.filteredRows = []; var hasChanged = _itemvalue__WEBPACK_IMPORTED_MODULE_0__["ItemValue"].runConditionsForItems(this.rows, this.filteredRows, runner, values, properties, !showInvisibile); if (this.filteredRows.length === this.rows.length) { this.filteredRows = null; } return hasChanged; }; QuestionMatrixBaseModel.prototype.runConditionsForColumns = function (values, properties) { var useColumnsExpression = !!this.survey && !this.survey.areInvisibleElementsShowing; var runner = useColumnsExpression && !!this.columnsVisibleIf ? new _conditions__WEBPACK_IMPORTED_MODULE_3__["ConditionRunner"](this.columnsVisibleIf) : null; this.filteredColumns = []; var hasChanged = _itemvalue__WEBPACK_IMPORTED_MODULE_0__["ItemValue"].runConditionsForItems(this.columns, this.filteredColumns, runner, values, properties, this.shouldRunColumnExpression()); if (this.filteredColumns.length === this.columns.length) { this.filteredColumns = null; } return hasChanged; }; QuestionMatrixBaseModel.prototype.clearIncorrectValues = function () { var val = this.value; if (!val) return; var newVal = null; var isChanged = false; var rows = !!this.filteredRows ? this.filteredRows : this.rows; var columns = !!this.filteredColumns ? this.filteredColumns : this.columns; for (var key in val) { if (_itemvalue__WEBPACK_IMPORTED_MODULE_0__["ItemValue"].getItemByValue(rows, key) && _itemvalue__WEBPACK_IMPORTED_MODULE_0__["ItemValue"].getItemByValue(columns, val[key])) { if (newVal == null) newVal = {}; newVal[key] = val[key]; } else { isChanged = true; } } if (isChanged) { this.value = newVal; } _super.prototype.clearIncorrectValues.call(this); }; QuestionMatrixBaseModel.prototype.clearInvisibleValuesInRows = function () { if (this.isEmpty()) return; var newData = this.getUnbindValue(this.value); var rows = this.rows; for (var i = 0; i < rows.length; i++) { var key = rows[i].value; if (!!newData[key] && !rows[i].isVisible) { delete newData[key]; } } if (this.isTwoValueEquals(newData, this.value)) return; this.value = newData; }; QuestionMatrixBaseModel.prototype.restoreNewVisibleRowsValues = function (oldVisibleRows) { var rows = !!this.filteredRows ? this.filteredRows : this.rows; var val = this.defaultValue; var newValue = this.getUnbindValue(this.value); var isChanged = false; for (var key in val) { if (_itemvalue__WEBPACK_IMPORTED_MODULE_0__["ItemValue"].getItemByValue(rows, key) && !_itemvalue__WEBPACK_IMPORTED_MODULE_0__["ItemValue"].getItemByValue(oldVisibleRows, key)) { if (newValue == null) newValue = {}; newValue[key] = val[key]; isChanged = true; } } if (isChanged) { this.value = newValue; } }; return QuestionMatrixBaseModel; }(_question__WEBPACK_IMPORTED_MODULE_1__["Question"])); _jsonobject__WEBPACK_IMPORTED_MODULE_2__["Serializer"].addClass("matrixbase", [ "columnsVisibleIf:condition", "rowsVisibleIf:condition", { name: "showHeader:boolean", default: true }, ], undefined, "question"); /***/ }), /***/ "./src/page.ts": /*!*********************!*\ !*** ./src/page.ts ***! \*********************/ /*! exports provided: PageModel */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PageModel", function() { return PageModel; }); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _panel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./panel */ "./src/panel.ts"); /* harmony import */ var _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/cssClassBuilder */ "./src/utils/cssClassBuilder.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); /** * The page object. It has elements collection, that contains questions and panels. */ var PageModel = /** @class */ (function (_super) { __extends(PageModel, _super); function PageModel(name) { if (name === void 0) { name = ""; } var _this = _super.call(this, name) || this; _this.hasShownValue = false; /** * Time in seconds end-user spent on this page */ _this.timeSpent = 0; var self = _this; _this.locTitle.onGetTextCallback = function (text) { if (self.num > 0) return self.num + ". " + text; return text; }; _this.createLocalizableString("navigationTitle", _this, true); _this.createLocalizableString("navigationDescription", _this, true); return _this; } PageModel.prototype.getType = function () { return "page"; }; PageModel.prototype.toString = function () { return this.name; }; Object.defineProperty(PageModel.prototype, "isPage", { get: function () { return true; }, enumerable: false, configurable: true }); PageModel.prototype.canShowTitle = function () { return this.survey.showPageTitles; }; Object.defineProperty(PageModel.prototype, "navigationTitle", { /** * Use this property to show title in navigation buttons. If the value is empty then page name is used. * @see survey.progressBarType */ get: function () { return this.getLocalizableStringText("navigationTitle"); }, set: function (val) { this.setLocalizableStringText("navigationTitle", val); }, enumerable: false, configurable: true }); Object.defineProperty(PageModel.prototype, "locNavigationTitle", { get: function () { return this.getLocalizableString("navigationTitle"); }, enumerable: false, configurable: true }); Object.defineProperty(PageModel.prototype, "navigationDescription", { get: function () { return this.getLocalizableStringText("navigationDescription"); }, set: function (val) { this.setLocalizableStringText("navigationDescription", val); }, enumerable: false, configurable: true }); Object.defineProperty(PageModel.prototype, "locNavigationDescription", { get: function () { return this.getLocalizableString("navigationDescription"); }, enumerable: false, configurable: true }); Object.defineProperty(PageModel.prototype, "passed", { get: function () { return this.getPropertyValue("passed", false); }, set: function (val) { this.setPropertyValue("passed", val); }, enumerable: false, configurable: true }); PageModel.prototype.delete = function () { if (!!this.survey) { this.removeSelfFromList(this.survey.pages); } }; PageModel.prototype.onFirstRendering = function () { if (this.wasShown) return; _super.prototype.onFirstRendering.call(this); }; Object.defineProperty(PageModel.prototype, "visibleIndex", { /** * The visible index of the page. It has values from 0 to visible page count - 1. * @see SurveyModel.visiblePages * @see SurveyModel.pages */ get: function () { return this.getPropertyValue("visibleIndex", -1); }, set: function (val) { this.setPropertyValue("visibleIndex", val); }, enumerable: false, configurable: true }); PageModel.prototype.canRenderFirstRows = function () { return !this.isDesignMode || this.visibleIndex == 0; }; Object.defineProperty(PageModel.prototype, "isStarted", { /** * Returns true, if the page is started page in the survey. It can be shown on the start only and the end-user could not comeback to it after it passed it. */ get: function () { return this.survey && this.survey.isPageStarted(this); }, enumerable: false, configurable: true }); PageModel.prototype.calcCssClasses = function (css) { var classes = { page: {}, pageTitle: "", pageDescription: "", row: "", rowMultiple: "" }; this.copyCssClasses(classes.page, css.page); if (!!css.pageTitle) { classes.pageTitle = css.pageTitle; } if (!!css.pageDescription) { classes.pageDescription = css.pageDescription; } if (!!css.row) { classes.row = css.row; } if (!!css.rowMultiple) { classes.rowMultiple = css.rowMultiple; } if (this.survey) { this.survey.updatePageCssClasses(this, classes); } return classes; }; Object.defineProperty(PageModel.prototype, "cssTitle", { get: function () { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_2__["CssClassBuilder"]() .append(this.cssClasses.page.title) .toString(); }, enumerable: false, configurable: true }); Object.defineProperty(PageModel.prototype, "num", { get: function () { return this.getPropertyValue("num", -1); }, set: function (val) { if (this.num == val) return; this.setPropertyValue("num", val); this.onNumChanged(val); }, enumerable: false, configurable: true }); Object.defineProperty(PageModel.prototype, "navigationButtonsVisibility", { /** * Set this property to "hide" to make "Prev", "Next" and "Complete" buttons are invisible for this page. Set this property to "show" to make these buttons visible, even if survey showNavigationButtons property is false. * @see SurveyMode.showNavigationButtons */ get: function () { return this.getPropertyValue("navigationButtonsVisibility"); }, set: function (val) { this.setPropertyValue("navigationButtonsVisibility", val.toLowerCase()); }, enumerable: false, configurable: true }); Object.defineProperty(PageModel.prototype, "wasShown", { /** * The property returns true, if the page has been shown to the end-user. */ get: function () { return this.hasShownValue; }, enumerable: false, configurable: true }); Object.defineProperty(PageModel.prototype, "hasShown", { get: function () { return this.wasShown; }, enumerable: false, configurable: true }); PageModel.prototype.setWasShown = function (val) { if (val == this.hasShownValue) return; this.hasShownValue = val; if (this.isDesignMode || val !== true) return; var els = this.elements; for (var i = 0; i < els.length; i++) { if (els[i].isPanel) { els[i].randomizeElements(this.areQuestionsRandomized); } } this.randomizeElements(this.areQuestionsRandomized); }; Object.defineProperty(PageModel.prototype, "areQuestionsRandomized", { /** * The property returns true, if the elements are randomized on the page * @see hasShown * @see questionsOrder * @see SurveyModel.questionsOrder */ get: function () { var order = this.questionsOrder == "default" && this.survey ? this.survey.questionsOrder : this.questionsOrder; return order == "random"; }, enumerable: false, configurable: true }); /** * Call it to scroll to the page top. */ PageModel.prototype.scrollToTop = function () { if (!!this.survey) { this.survey.scrollElementToTop(this, null, this, this.id); } }; // public get timeSpent(): number { // return this.getPropertyValue("timeSpent", 0); // } // public set timeSpent(val: number) { // this.setPropertyValue("timeSpent", val); // } /** * Returns the list of all panels in the page */ PageModel.prototype.getPanels = function (visibleOnly, includingDesignTime) { if (visibleOnly === void 0) { visibleOnly = false; } if (includingDesignTime === void 0) { includingDesignTime = false; } var result = new Array(); this.addPanelsIntoList(result, visibleOnly, includingDesignTime); return result; }; Object.defineProperty(PageModel.prototype, "maxTimeToFinish", { /** * The maximum time in seconds that end-user has to complete the page. If the value is 0 or less, the end-user has unlimited number of time to finish the page. * @see startTimer * @see SurveyModel.maxTimeToFinishPage */ get: function () { return this.getPropertyValue("maxTimeToFinish", 0); }, set: function (val) { this.setPropertyValue("maxTimeToFinish", val); }, enumerable: false, configurable: true }); PageModel.prototype.onNumChanged = function (value) { }; PageModel.prototype.onVisibleChanged = function () { if (this.isRandomizing) return; _super.prototype.onVisibleChanged.call(this); if (this.survey != null) { this.survey.pageVisibilityChanged(this, this.isVisible); } }; PageModel.prototype.dragDropStart = function (src, target, nestedPanelDepth) { if (nestedPanelDepth === void 0) { nestedPanelDepth = -1; } this.dragDropInfo = new _panel__WEBPACK_IMPORTED_MODULE_1__["DragDropInfo"](src, target, nestedPanelDepth); }; PageModel.prototype.dragDropMoveTo = function (destination, isBottom, isEdge) { if (isBottom === void 0) { isBottom = false; } if (isEdge === void 0) { isEdge = false; } if (!this.dragDropInfo) return false; this.dragDropInfo.destination = destination; this.dragDropInfo.isBottom = isBottom; this.dragDropInfo.isEdge = isEdge; this.correctDragDropInfo(this.dragDropInfo); if (!this.dragDropCanDropTagert()) return false; if (!this.dragDropCanDropSource() || !this.dragDropAllowFromSurvey()) { if (!!this.dragDropInfo.source) { var row = this.dragDropFindRow(this.dragDropInfo.target); this.updateRowsRemoveElementFromRow(this.dragDropInfo.target, row); } return false; } this.dragDropAddTarget(this.dragDropInfo); return true; }; PageModel.prototype.correctDragDropInfo = function (dragDropInfo) { if (!dragDropInfo.destination) return; var panel = dragDropInfo.destination.isPanel ? dragDropInfo.destination : null; if (!panel) return; if (!dragDropInfo.target.isLayoutTypeSupported(panel.getChildrenLayoutType())) { dragDropInfo.isEdge = true; } }; PageModel.prototype.dragDropAllowFromSurvey = function () { var dest = this.dragDropInfo.destination; if (!dest || !this.survey) return true; var insertBefore = null; var insertAfter = null; var parent = dest.isPage || (!this.dragDropInfo.isEdge && dest.isPanel) ? dest : dest.parent; if (!dest.isPage) { var container = dest.parent; if (!!container) { var elements = container.elements; var index = elements.indexOf(dest); if (index > -1) { insertBefore = dest; insertAfter = dest; if (this.dragDropInfo.isBottom) { insertBefore = index < elements.length - 1 ? elements[index + 1] : null; } else { insertAfter = index > 0 ? elements[index - 1] : null; } } } } var options = { target: this.dragDropInfo.target, source: this.dragDropInfo.source, parent: parent, insertAfter: insertAfter, insertBefore: insertBefore, }; return this.survey.dragAndDropAllow(options); }; PageModel.prototype.dragDropFinish = function (isCancel) { if (isCancel === void 0) { isCancel = false; } if (!this.dragDropInfo) return; var target = this.dragDropInfo.target; var row = this.dragDropFindRow(target); var targetIndex = this.dragDropGetElementIndex(target, row); this.updateRowsRemoveElementFromRow(target, row); if (!isCancel && !!row) { var src = this.dragDropInfo.source; var isSamePanel = false; if (!!src && !!src.parent) { isSamePanel = row.panel == src.parent; if (isSamePanel) { row.panel.dragDropMoveElement(src, target, targetIndex); targetIndex = -1; } else { src.parent.removeElement(src); } } if (targetIndex > -1) { row.panel.addElement(target, targetIndex); } } this.dragDropInfo = null; return !isCancel ? target : null; }; PageModel.prototype.dragDropGetElementIndex = function (target, row) { if (!row) return -1; var index = row.elements.indexOf(target); if (row.index == 0) return index; var prevRow = row.panel.rows[row.index - 1]; var prevElement = prevRow.elements[prevRow.elements.length - 1]; return index + row.panel.elements.indexOf(prevElement) + 1; }; PageModel.prototype.dragDropCanDropTagert = function () { var destination = this.dragDropInfo.destination; if (!destination || destination.isPage) return true; return this.dragDropCanDropCore(this.dragDropInfo.target, destination); }; PageModel.prototype.dragDropCanDropSource = function () { var source = this.dragDropInfo.source; if (!source) return true; var destination = this.dragDropInfo.destination; if (!this.dragDropCanDropCore(source, destination)) return false; return this.dragDropCanDropNotNext(source, destination, this.dragDropInfo.isEdge, this.dragDropInfo.isBottom); }; PageModel.prototype.dragDropCanDropCore = function (target, destination) { if (!destination) return true; if (this.dragDropIsSameElement(destination, target)) return false; if (target.isPanel) { var pnl = target; if (pnl.containsElement(destination) || !!pnl.getElementByName(destination.name)) return false; } return true; }; PageModel.prototype.dragDropCanDropNotNext = function (source, destination, isEdge, isBottom) { if (!destination || (destination.isPanel && !isEdge)) return true; if (typeof source.parent === "undefined" || source.parent !== destination.parent) return true; var pnl = source.parent; var srcIndex = pnl.elements.indexOf(source); var destIndex = pnl.elements.indexOf(destination); if (destIndex < srcIndex && !isBottom) destIndex--; if (isBottom) destIndex++; return srcIndex < destIndex ? destIndex - srcIndex > 1 : srcIndex - destIndex > 0; }; PageModel.prototype.dragDropIsSameElement = function (el1, el2) { return el1 == el2 || el1.name == el2.name; }; PageModel.prototype.ensureRowsVisibility = function () { _super.prototype.ensureRowsVisibility.call(this); this.getPanels().forEach(function (panel) { return panel.ensureRowsVisibility(); }); }; return PageModel; }(_panel__WEBPACK_IMPORTED_MODULE_1__["PanelModelBase"])); _jsonobject__WEBPACK_IMPORTED_MODULE_0__["Serializer"].addClass("page", [ { name: "navigationButtonsVisibility", default: "inherit", choices: ["inherit", "show", "hide"], }, { name: "maxTimeToFinish:number", default: 0, minValue: 0 }, { name: "navigationTitle", visibleIf: function (obj) { return !!obj.survey && obj.survey.progressBarType === "buttons"; }, serializationProperty: "locNavigationTitle", }, { name: "navigationDescription", visibleIf: function (obj) { return !!obj.survey && obj.survey.progressBarType === "buttons"; }, serializationProperty: "locNavigationDescription", }, { name: "title:text", serializationProperty: "locTitle" }, { name: "description:text", serializationProperty: "locDescription" }, ], function () { return new PageModel(); }, "panelbase"); /***/ }), /***/ "./src/panel.ts": /*!**********************!*\ !*** ./src/panel.ts ***! \**********************/ /*! exports provided: DragDropInfo, QuestionRowModel, PanelModelBase, PanelModel */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DragDropInfo", function() { return DragDropInfo; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionRowModel", function() { return QuestionRowModel; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PanelModelBase", function() { return PanelModelBase; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PanelModel", function() { return PanelModel; }); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ "./src/helpers.ts"); /* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./base */ "./src/base.ts"); /* harmony import */ var _survey_element__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./survey-element */ "./src/survey-element.ts"); /* harmony import */ var _question__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./question */ "./src/question.ts"); /* harmony import */ var _conditions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./conditions */ "./src/conditions.ts"); /* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./questionfactory */ "./src/questionfactory.ts"); /* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./error */ "./src/error.ts"); /* harmony import */ var _settings__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./settings */ "./src/settings.ts"); /* harmony import */ var _utils_utils__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./utils/utils */ "./src/utils/utils.ts"); /* harmony import */ var _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./utils/cssClassBuilder */ "./src/utils/cssClassBuilder.ts"); /* harmony import */ var _actions_adaptive_container__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./actions/adaptive-container */ "./src/actions/adaptive-container.ts"); /* harmony import */ var _actions_container__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./actions/container */ "./src/actions/container.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var DragDropInfo = /** @class */ (function () { function DragDropInfo(source, target, nestedPanelDepth) { if (nestedPanelDepth === void 0) { nestedPanelDepth = -1; } this.source = source; this.target = target; this.nestedPanelDepth = nestedPanelDepth; } return DragDropInfo; }()); var QuestionRowModel = /** @class */ (function (_super) { __extends(QuestionRowModel, _super); function QuestionRowModel(panel) { var _this = _super.call(this) || this; _this.panel = panel; _this._scrollableParent = undefined; _this._updateVisibility = undefined; _this.idValue = QuestionRowModel.getRowId(); _this.visible = panel.areInvisibleElementsShowing; _this.createNewArray("elements"); _this.createNewArray("visibleElements"); return _this; } QuestionRowModel.getRowId = function () { return "pr_" + QuestionRowModel.rowCounter++; }; QuestionRowModel.prototype.startLazyRendering = function (rowContainerDiv, findScrollableContainer) { var _this = this; if (findScrollableContainer === void 0) { findScrollableContainer = _utils_utils__WEBPACK_IMPORTED_MODULE_9__["findScrollableParent"]; } this._scrollableParent = findScrollableContainer(rowContainerDiv); this.isNeedRender = !(this._scrollableParent.scrollHeight > this._scrollableParent.clientHeight); // if this._scrollableParent is html the scroll event isn't fired, so we should use window if (this._scrollableParent === document.documentElement) { this._scrollableParent = window; } if (!this.isNeedRender) { this._updateVisibility = function () { var isRowContainerDivVisible = Object(_utils_utils__WEBPACK_IMPORTED_MODULE_9__["isElementVisible"])(rowContainerDiv, 50); if (!_this.isNeedRender && isRowContainerDivVisible) { _this.isNeedRender = true; _this.stopLazyRendering(); } }; setTimeout(function () { if (!!_this._scrollableParent && !!_this._scrollableParent.addEventListener) { _this._scrollableParent.addEventListener("scroll", _this._updateVisibility); } _this.ensureVisibility(); }, 10); } }; QuestionRowModel.prototype.ensureVisibility = function () { if (!!this._updateVisibility) { this._updateVisibility(); } }; QuestionRowModel.prototype.stopLazyRendering = function () { if (!!this._scrollableParent && !!this._updateVisibility && !!this._scrollableParent.removeEventListener) { this._scrollableParent.removeEventListener("scroll", this._updateVisibility); } this._scrollableParent = undefined; this._updateVisibility = undefined; }; QuestionRowModel.prototype.setIsLazyRendering = function (val) { this.isLazyRenderingValue = val; this.isNeedRender = !val; }; QuestionRowModel.prototype.isLazyRendering = function () { return this.isLazyRenderingValue === true; }; Object.defineProperty(QuestionRowModel.prototype, "id", { get: function () { return this.idValue; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionRowModel.prototype, "elements", { get: function () { return this.getPropertyValue("elements"); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionRowModel.prototype, "visibleElements", { get: function () { return this.getPropertyValue("visibleElements"); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionRowModel.prototype, "visible", { get: function () { return this.getPropertyValue("visible", true); }, set: function (val) { this.setPropertyValue("visible", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionRowModel.prototype, "isNeedRender", { get: function () { return this.getPropertyValue("isneedrender", true); }, set: function (val) { this.setPropertyValue("isneedrender", val); }, enumerable: false, configurable: true }); QuestionRowModel.prototype.updateVisible = function () { this.visible = this.calcVisible(); this.setWidth(); }; QuestionRowModel.prototype.addElement = function (q) { this.elements.push(q); this.updateVisible(); }; Object.defineProperty(QuestionRowModel.prototype, "index", { get: function () { return this.panel.rows.indexOf(this); }, enumerable: false, configurable: true }); QuestionRowModel.prototype.setWidth = function () { var visCount = this.visibleElements.length; if (visCount == 0) return; var counter = 0; var preSetWidthElements = []; for (var i = 0; i < this.elements.length; i++) { var el = this.elements[i]; this.setElementMaxMinWidth(el); if (el.isVisible) { var width = this.getElementWidth(el); if (!!width) { el.renderWidth = this.getRenderedWidthFromWidth(width); preSetWidthElements.push(el); } el.rightIndent = counter < visCount - 1 ? 1 : 0; counter++; } else { el.renderWidth = ""; } } for (var i = 0; i < this.elements.length; i++) { var el = this.elements[i]; if (!el.isVisible || preSetWidthElements.indexOf(el) > -1) continue; if (preSetWidthElements.length == 0) { el.renderWidth = (100 / visCount).toFixed(6) + "%"; } else { el.renderWidth = this.getRenderedCalcWidth(el, preSetWidthElements, visCount); } } }; QuestionRowModel.prototype.setElementMaxMinWidth = function (el) { if (el.width && typeof el.width === "string" && el.width.indexOf("%") === -1) { el.minWidth = el.width; el.maxWidth = el.width; } }; QuestionRowModel.prototype.getRenderedCalcWidth = function (el, preSetWidthElements, visCount) { var expression = "100%"; for (var i = 0; i < preSetWidthElements.length; i++) { expression += " - " + preSetWidthElements[i].renderWidth; } var calcWidthEl = visCount - preSetWidthElements.length; if (calcWidthEl > 1) { expression = "(" + expression + ")/" + calcWidthEl.toString(); } return "calc(" + expression + ")"; }; QuestionRowModel.prototype.getElementWidth = function (el) { var width = el.width; if (!width || typeof width !== "string") return ""; return width.trim(); }; QuestionRowModel.prototype.getRenderedWidthFromWidth = function (width) { return _helpers__WEBPACK_IMPORTED_MODULE_1__["Helpers"].isNumber(width) ? width + "px" : width; }; QuestionRowModel.prototype.calcVisible = function () { var visElements = []; for (var i = 0; i < this.elements.length; i++) { if (this.elements[i].isVisible) { visElements.push(this.elements[i]); } } if (this.needToUpdateVisibleElements(visElements)) { this.setPropertyValue("visibleElements", visElements); } return visElements.length > 0; }; QuestionRowModel.prototype.needToUpdateVisibleElements = function (visElements) { if (visElements.length !== this.visibleElements.length) return true; for (var i = 0; i < visElements.length; i++) { if (visElements[i] !== this.visibleElements[i]) return true; } return false; }; QuestionRowModel.prototype.dispose = function () { _super.prototype.dispose.call(this); this.stopLazyRendering(); }; QuestionRowModel.prototype.getRowCss = function () { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_10__["CssClassBuilder"]() .append(this.panel.cssClasses.row) .append(this.panel.cssClasses.rowMultiple, this.visibleElements.length > 1) .toString(); }; QuestionRowModel.rowCounter = 100; return QuestionRowModel; }(_base__WEBPACK_IMPORTED_MODULE_2__["Base"])); /** * A base class for a Panel and Page objects. */ var PanelModelBase = /** @class */ (function (_super) { __extends(PanelModelBase, _super); function PanelModelBase(name) { if (name === void 0) { name = ""; } var _this = _super.call(this, name) || this; _this.isQuestionsReady = false; _this.questionsValue = new Array(); _this.isRandomizing = false; _this.createNewArray("rows"); _this.elementsValue = _this.createNewArray("elements", _this.onAddElement.bind(_this), _this.onRemoveElement.bind(_this)); _this.id = PanelModelBase.getPanelId(); _this.createLocalizableString("requiredErrorText", _this); _this.registerFunctionOnPropertyValueChanged("questionTitleLocation", function () { _this.onVisibleChanged.bind(_this); _this.updateElementCss(true); }); _this.registerFunctionOnPropertiesValueChanged(["questionStartIndex", "showQuestionNumbers"], function () { _this.updateVisibleIndexes(); }); return _this; } PanelModelBase.getPanelId = function () { return "sp_" + PanelModelBase.panelCounter++; }; PanelModelBase.prototype.getType = function () { return "panelbase"; }; PanelModelBase.prototype.setSurveyImpl = function (value) { _super.prototype.setSurveyImpl.call(this, value); if (this.isDesignMode) this.onVisibleChanged(); for (var i = 0; i < this.elements.length; i++) { this.elements[i].setSurveyImpl(value); } }; PanelModelBase.prototype.endLoadingFromJson = function () { _super.prototype.endLoadingFromJson.call(this); this.markQuestionListDirty(); this.onRowsChanged(); }; Object.defineProperty(PanelModelBase.prototype, "hasTitle", { get: function () { return ((this.canShowTitle() && this.title.length > 0) || (this.isDesignMode && _settings__WEBPACK_IMPORTED_MODULE_8__["settings"].allowShowEmptyTitleInDesignMode)); }, enumerable: false, configurable: true }); PanelModelBase.prototype.canShowTitle = function () { return true; }; Object.defineProperty(PanelModelBase.prototype, "_showDescription", { get: function () { return ((this.survey.showPageTitles && this.description.length > 0) || (this.isDesignMode && _settings__WEBPACK_IMPORTED_MODULE_8__["settings"].allowShowEmptyTitleInDesignMode && _settings__WEBPACK_IMPORTED_MODULE_8__["settings"].allowShowEmptyDescriptionInDesignMode)); }, enumerable: false, configurable: true }); PanelModelBase.prototype.localeChanged = function () { _super.prototype.localeChanged.call(this); for (var i = 0; i < this.elements.length; i++) { this.elements[i].localeChanged(); } }; PanelModelBase.prototype.locStrsChanged = function () { _super.prototype.locStrsChanged.call(this); for (var i = 0; i < this.elements.length; i++) { this.elements[i].locStrsChanged(); } }; Object.defineProperty(PanelModelBase.prototype, "requiredText", { /** * Returns the char/string for a required panel. * @see SurveyModel.requiredText */ get: function () { return this.survey != null && this.isRequired ? this.survey.requiredText : ""; }, enumerable: false, configurable: true }); Object.defineProperty(PanelModelBase.prototype, "titlePattern", { get: function () { return !!this.survey ? this.survey.questionTitlePattern : "numTitleRequire"; }, enumerable: false, configurable: true }); Object.defineProperty(PanelModelBase.prototype, "isRequireTextOnStart", { get: function () { return this.isRequired && this.titlePattern == "requireNumTitle"; }, enumerable: false, configurable: true }); Object.defineProperty(PanelModelBase.prototype, "isRequireTextBeforeTitle", { get: function () { return this.isRequired && this.titlePattern == "numRequireTitle"; }, enumerable: false, configurable: true }); Object.defineProperty(PanelModelBase.prototype, "isRequireTextAfterTitle", { get: function () { return this.isRequired && this.titlePattern == "numTitleRequire"; }, enumerable: false, configurable: true }); Object.defineProperty(PanelModelBase.prototype, "requiredErrorText", { /** * The custom text that will be shown on required error. Use this property, if you do not want to show the default text. */ get: function () { return this.getLocalizableStringText("requiredErrorText"); }, set: function (val) { this.setLocalizableStringText("requiredErrorText", val); }, enumerable: false, configurable: true }); Object.defineProperty(PanelModelBase.prototype, "locRequiredErrorText", { get: function () { return this.getLocalizableString("requiredErrorText"); }, enumerable: false, configurable: true }); Object.defineProperty(PanelModelBase.prototype, "questionsOrder", { /** * Use this property to randomize questions. Set it to 'random' to randomize questions, 'initial' to keep them in the same order or 'default' to use the Survey questionsOrder property * @see SurveyModel.questionsOrder * @see areQuestionsRandomized */ get: function () { return this.getPropertyValue("questionsOrder"); }, set: function (val) { this.setPropertyValue("questionsOrder", val); }, enumerable: false, configurable: true }); PanelModelBase.prototype.canRandomize = function (isRandom) { return isRandom && (this.questionsOrder !== "initial") || this.questionsOrder === "random"; }; PanelModelBase.prototype.randomizeElements = function (isRandom) { if (!this.canRandomize(isRandom) || this.isRandomizing) return; this.isRandomizing = true; var oldElements = []; var elements = this.elements; for (var i = 0; i < elements.length; i++) { oldElements.push(elements[i]); } var newElements = _helpers__WEBPACK_IMPORTED_MODULE_1__["Helpers"].randomizeArray(oldElements); this.elements.splice(0, this.elements.length); for (var i = 0; i < newElements.length; i++) { this.elements.push(newElements[i]); } this.isRandomizing = false; }; Object.defineProperty(PanelModelBase.prototype, "parent", { /** * A parent element. It is always null for the Page object and always not null for the Panel object. Panel object may contain Questions and other Panels. */ get: function () { return this.getPropertyValue("parent", null); }, set: function (val) { this.setPropertyValue("parent", val); }, enumerable: false, configurable: true }); Object.defineProperty(PanelModelBase.prototype, "depth", { get: function () { if (this.parent == null) return 0; return this.parent.depth + 1; }, enumerable: false, configurable: true }); Object.defineProperty(PanelModelBase.prototype, "visibleIf", { /** * An expression that returns true or false. If it returns true the Panel becomes visible and if it returns false the Panel becomes invisible. The library runs the expression on survey start and on changing a question value. If the property is empty then visible property is used. * @see visible */ get: function () { return this.getPropertyValue("visibleIf", ""); }, set: function (val) { this.setPropertyValue("visibleIf", val); }, enumerable: false, configurable: true }); PanelModelBase.prototype.calcCssClasses = function (css) { var classes = { panel: {}, error: {}, row: "", rowMultiple: "" }; this.copyCssClasses(classes.panel, css.panel); this.copyCssClasses(classes.error, css.error); if (!!css.row) { classes.row = css.row; } if (!!css.rowMultiple) { classes.rowMultiple = css.rowMultiple; } if (this.survey) { this.survey.updatePanelCssClasses(this, classes); } return classes; }; Object.defineProperty(PanelModelBase.prototype, "id", { /** * A unique element identificator. It is generated automatically. */ get: function () { return this.getPropertyValue("id"); }, set: function (val) { this.setPropertyValue("id", val); }, enumerable: false, configurable: true }); Object.defineProperty(PanelModelBase.prototype, "isPanel", { /** * Returns true if the current object is Panel. Returns false if the current object is Page (a root Panel). */ get: function () { return false; }, enumerable: false, configurable: true }); PanelModelBase.prototype.getPanel = function () { return this; }; PanelModelBase.prototype.getLayoutType = function () { return "row"; }; PanelModelBase.prototype.isLayoutTypeSupported = function (layoutType) { return layoutType !== "flow"; }; Object.defineProperty(PanelModelBase.prototype, "questions", { /** * Returns the list of all questions located in the Panel/Page, including in the nested Panels. * @see Question * @see elements */ get: function () { if (!this.isQuestionsReady) { this.questionsValue = []; for (var i = 0; i < this.elements.length; i++) { var el = this.elements[i]; if (el.isPanel) { var qs = el.questions; for (var j = 0; j < qs.length; j++) { this.questionsValue.push(qs[j]); } } else { this.questionsValue.push(el); } } this.isQuestionsReady = true; } return this.questionsValue; }, enumerable: false, configurable: true }); PanelModelBase.prototype.getValidName = function (name) { if (!!name) return name.trim(); return name; }; /** * Returns the question by its name * @param name the question name */ PanelModelBase.prototype.getQuestionByName = function (name) { var questions = this.questions; for (var i = 0; i < questions.length; i++) { if (questions[i].name == name) return questions[i]; } return null; }; /** * Returns the element by its name. It works recursively. * @param name the element name */ PanelModelBase.prototype.getElementByName = function (name) { var elements = this.elements; for (var i = 0; i < elements.length; i++) { var el = elements[i]; if (el.name == name) return el; var pnl = el.getPanel(); if (!!pnl) { var res = pnl.getElementByName(name); if (!!res) return res; } } return null; }; PanelModelBase.prototype.getQuestionByValueName = function (valueName) { var questions = this.questions; for (var i = 0; i < questions.length; i++) { if (questions[i].getValueName() == valueName) return questions[i]; } return null; }; /** * Returns question values on the current page */ PanelModelBase.prototype.getValue = function () { var data = {}; var questions = this.questions; for (var i = 0; i < questions.length; i++) { var q = questions[i]; if (q.isEmpty()) continue; var valueName = q.getValueName(); data[valueName] = q.value; if (!!this.data) { var comment = this.data.getComment(valueName); if (!!comment) { data[valueName + _settings__WEBPACK_IMPORTED_MODULE_8__["settings"].commentPrefix] = comment; } } } return data; }; /** * Return questions values as a JSON object with display text. For example, for dropdown, it would return the item text instead of item value. * @param keysAsText Set this value to true, to return key (in matrices questions) as display text as well. */ PanelModelBase.prototype.getDisplayValue = function (keysAsText) { var data = {}; var questions = this.questions; for (var i = 0; i < questions.length; i++) { var q = questions[i]; if (q.isEmpty()) continue; var valueName = keysAsText ? q.title : q.getValueName(); data[valueName] = q.getDisplayValue(keysAsText); } return data; }; /** * Returns question comments on the current page */ PanelModelBase.prototype.getComments = function () { var comments = {}; if (!this.data) return comments; var questions = this.questions; for (var i = 0; i < questions.length; i++) { var q = questions[i]; var comment = this.data.getComment(q.getValueName()); if (!!comment) { comments[q.getValueName()] = comment; } } return comments; }; /** * Call this function to remove all question values from the current page/panel, that end-user will not be able to enter. * For example the value that doesn't exists in a radigroup/dropdown/checkbox choices or matrix rows/columns. * Please note, this function doesn't clear values for invisible questions or values that doesn't associated with questions. * @see Question.clearIncorrectValues */ PanelModelBase.prototype.clearIncorrectValues = function () { for (var i = 0; i < this.elements.length; i++) { this.elements[i].clearIncorrectValues(); } }; /** * Call this function to clear all errors in the panel / page and all its child elements (panels and questions) */ PanelModelBase.prototype.clearErrors = function () { for (var i = 0; i < this.elements.length; i++) { this.elements[i].clearErrors(); } this.errors = []; }; PanelModelBase.prototype.markQuestionListDirty = function () { this.isQuestionsReady = false; if (this.parent) this.parent.markQuestionListDirty(); }; Object.defineProperty(PanelModelBase.prototype, "elements", { /** * Returns the list of the elements in the object, Panel/Page. Elements can be questions or panels. The function doesn't return elements in the nested Panels. */ get: function () { return this.elementsValue; }, enumerable: false, configurable: true }); PanelModelBase.prototype.getElementsInDesign = function (includeHidden) { if (includeHidden === void 0) { includeHidden = false; } return this.elements; }; /** * Returns true if the current element belongs to the Panel/Page. It looks in nested Panels as well. * @param element * @see PanelModel */ PanelModelBase.prototype.containsElement = function (element) { for (var i = 0; i < this.elements.length; i++) { var el = this.elements[i]; if (el == element) return true; var pnl = el.getPanel(); if (!!pnl) { if (pnl.containsElement(element)) return true; } } return false; }; Object.defineProperty(PanelModelBase.prototype, "isRequired", { /** * Set this property to true, to require the answer at least in one question in the panel. */ get: function () { return this.getPropertyValue("isRequired", false); }, set: function (val) { this.setPropertyValue("isRequired", val); }, enumerable: false, configurable: true }); Object.defineProperty(PanelModelBase.prototype, "requiredIf", { /** * An expression that returns true or false. If it returns true the Panel/Page becomes required. * The library runs the expression on survey start and on changing a question value. If the property is empty then isRequired property is used. * @see isRequired */ get: function () { return this.getPropertyValue("requiredIf", ""); }, set: function (val) { this.setPropertyValue("requiredIf", val); }, enumerable: false, configurable: true }); PanelModelBase.prototype.searchText = function (text, founded) { _super.prototype.searchText.call(this, text, founded); for (var i = 0; i < this.elements.length; i++) { this.elements[i].searchText(text, founded); } }; /** * Returns true, if there is an error on this Page or inside the current Panel * @param fireCallback set it to true, to show errors in UI * @param focusOnFirstError set it to true to focus on the first question that doesn't pass the validation */ PanelModelBase.prototype.hasErrors = function (fireCallback, focusOnFirstError, rec) { if (fireCallback === void 0) { fireCallback = true; } if (focusOnFirstError === void 0) { focusOnFirstError = false; } if (rec === void 0) { rec = null; } rec = !!rec ? rec : { fireCallback: fireCallback, focuseOnFirstError: focusOnFirstError, firstErrorQuestion: null, result: false, }; this.hasErrorsCore(rec); if (rec.firstErrorQuestion) { rec.firstErrorQuestion.focus(true); } return rec.result; }; PanelModelBase.prototype.hasErrorsInPanels = function (rec) { var errors = []; this.hasRequiredError(rec, errors); if (this.survey) { var customError = this.survey.validatePanel(this); if (customError) { errors.push(customError); rec.result = true; } } if (!!rec.fireCallback) { if (!!this.survey) { this.survey.beforeSettingPanelErrors(this, errors); } this.errors = errors; } }; //ISurveyErrorOwner PanelModelBase.prototype.getErrorCustomText = function (text, error) { if (!!this.survey) return this.survey.getErrorCustomText(text, error); return text; }; PanelModelBase.prototype.hasRequiredError = function (rec, errors) { if (!this.isRequired) return; var visQuestions = []; this.addQuestionsToList(visQuestions, true); if (visQuestions.length == 0) return; for (var i = 0; i < visQuestions.length; i++) { if (!visQuestions[i].isEmpty()) return; } rec.result = true; errors.push(new _error__WEBPACK_IMPORTED_MODULE_7__["OneAnswerRequiredError"](this.requiredErrorText, this)); if (rec.focuseOnFirstError && !rec.firstErrorQuestion) { rec.firstErrorQuestion = visQuestions[0]; } }; PanelModelBase.prototype.hasErrorsCore = function (rec) { var elements = this.elements; var element = null; for (var i = 0; i < elements.length; i++) { element = elements[i]; if (!element.isVisible) continue; if (element.isPanel) { element.hasErrorsCore(rec); } else { var question = element; if (question.isReadOnly) continue; if (question.hasErrors(rec.fireCallback, rec)) { if (rec.focuseOnFirstError && rec.firstErrorQuestion == null) { rec.firstErrorQuestion = question; } rec.result = true; } } } this.hasErrorsInPanels(rec); this.updateContainsErrors(); }; PanelModelBase.prototype.getContainsErrors = function () { var res = _super.prototype.getContainsErrors.call(this); if (res) return res; var elements = this.elements; for (var i = 0; i < elements.length; i++) { if (elements[i].containsErrors) return true; } return false; }; PanelModelBase.prototype.updateElementVisibility = function () { for (var i = 0; i < this.elements.length; i++) { var el = this.elements[i]; el.setPropertyValue("isVisible", el.isVisible); if (el.isPanel) { el.updateElementVisibility(); } } }; PanelModelBase.prototype.getFirstQuestionToFocus = function (withError) { if (withError === void 0) { withError = false; } var elements = this.elements; for (var i = 0; i < elements.length; i++) { var el = elements[i]; if (!el.isVisible) continue; if (el.isPanel) { var res = el.getFirstQuestionToFocus(withError); if (!!res) return res; } else { var q = el; if (q.hasInput && (!withError || q.currentErrorCount > 0)) return q; } } return null; }; /** * Call it to focus the input on the first question */ PanelModelBase.prototype.focusFirstQuestion = function () { var q = this.getFirstQuestionToFocus(); if (!!q) { q.focus(); } }; /** * Call it to focus the input of the first question that has an error. */ PanelModelBase.prototype.focusFirstErrorQuestion = function () { var q = this.getFirstQuestionToFocus(true); if (!!q) { q.focus(); } }; /** * Fill list array with the questions. * @param list * @param visibleOnly set it to true to get visible questions only */ PanelModelBase.prototype.addQuestionsToList = function (list, visibleOnly, includingDesignTime) { if (visibleOnly === void 0) { visibleOnly = false; } if (includingDesignTime === void 0) { includingDesignTime = false; } this.addElementsToList(list, visibleOnly, includingDesignTime, false); }; /** * Fill list array with the panels. * @param list */ PanelModelBase.prototype.addPanelsIntoList = function (list, visibleOnly, includingDesignTime) { if (visibleOnly === void 0) { visibleOnly = false; } if (includingDesignTime === void 0) { includingDesignTime = false; } this.addElementsToList(list, visibleOnly, includingDesignTime, true); }; PanelModelBase.prototype.addElementsToList = function (list, visibleOnly, includingDesignTime, isPanel) { if (visibleOnly && !this.visible) return; this.addElementsToListCore(list, this.elements, visibleOnly, includingDesignTime, isPanel); }; PanelModelBase.prototype.addElementsToListCore = function (list, elements, visibleOnly, includingDesignTime, isPanel) { for (var i = 0; i < elements.length; i++) { var el = elements[i]; if (visibleOnly && !el.visible) continue; if ((isPanel && el.isPanel) || (!isPanel && !el.isPanel)) { list.push(el); } if (el.isPanel) { el.addElementsToListCore(list, el.elements, visibleOnly, includingDesignTime, isPanel); } else { if (includingDesignTime) { this.addElementsToListCore(list, el.getElementsInDesign(false), visibleOnly, includingDesignTime, isPanel); } } } }; Object.defineProperty(PanelModelBase.prototype, "isActive", { /** * Returns true if the current object is Page and it is the current page. */ get: function () { return !this.survey || this.survey.currentPage == this.root; }, enumerable: false, configurable: true }); PanelModelBase.prototype.updateCustomWidgets = function () { for (var i = 0; i < this.elements.length; i++) { this.elements[i].updateCustomWidgets(); } }; Object.defineProperty(PanelModelBase.prototype, "questionTitleLocation", { /** * Set this property different from "default" to set the specific question title location for this panel/page. * @see SurveyModel.questionTitleLocation */ get: function () { return this.getPropertyValue("questionTitleLocation"); }, set: function (value) { this.setPropertyValue("questionTitleLocation", value.toLowerCase()); }, enumerable: false, configurable: true }); PanelModelBase.prototype.getQuestionTitleLocation = function () { if (this.onGetQuestionTitleLocation) return this.onGetQuestionTitleLocation(); if (this.questionTitleLocation != "default") return this.questionTitleLocation; if (this.parent) return this.parent.getQuestionTitleLocation(); return this.survey ? this.survey.questionTitleLocation : "top"; }; PanelModelBase.prototype.getStartIndex = function () { if (!!this.parent) return this.parent.getQuestionStartIndex(); if (!!this.survey) return this.survey.questionStartIndex; return ""; }; PanelModelBase.prototype.getQuestionStartIndex = function () { return this.getStartIndex(); }; PanelModelBase.prototype.getChildrenLayoutType = function () { return "row"; }; PanelModelBase.prototype.getProgressInfo = function () { return _survey_element__WEBPACK_IMPORTED_MODULE_3__["SurveyElement"].getProgressInfoByElements(this.elements, this.isRequired); }; Object.defineProperty(PanelModelBase.prototype, "root", { get: function () { var res = this; while (res.parent) res = res.parent; return res; }, enumerable: false, configurable: true }); PanelModelBase.prototype.childVisibilityChanged = function () { var newIsVisibleValue = this.getIsPageVisible(null); var oldIsVisibleValue = this.getPropertyValue("isVisible", true); if (newIsVisibleValue !== oldIsVisibleValue) { this.onVisibleChanged(); } }; PanelModelBase.prototype.createRowAndSetLazy = function (index) { var row = this.createRow(); row.setIsLazyRendering(this.isLazyRenderInRow(index)); return row; }; PanelModelBase.prototype.createRow = function () { return new QuestionRowModel(this); }; PanelModelBase.prototype.onSurveyLoad = function () { for (var i = 0; i < this.elements.length; i++) { this.elements[i].onSurveyLoad(); } this.onElementVisibilityChanged(this); }; PanelModelBase.prototype.onFirstRendering = function () { for (var i = 0; i < this.elements.length; i++) { this.elements[i].onFirstRendering(); } this.onRowsChanged(); }; Object.defineProperty(PanelModelBase.prototype, "rows", { get: function () { return this.getPropertyValue("rows"); }, enumerable: false, configurable: true }); PanelModelBase.prototype.ensureRowsVisibility = function () { this.rows.forEach(function (row) { row.ensureVisibility(); }); }; PanelModelBase.prototype.onRowsChanged = function () { if (this.isLoadingFromJson) return; this.setPropertyValue("rows", this.buildRows()); }; PanelModelBase.prototype.onAddElement = function (element, index) { element.setSurveyImpl(this.surveyImpl); element.parent = this; this.markQuestionListDirty(); this.updateRowsOnElementAdded(element, index); if (element.isPanel) { var p = element; if (this.survey) { this.survey.panelAdded(p, index, this, this.root); } } else { if (this.survey) { var q = element; this.survey.questionAdded(q, index, this, this.root); } } if (!!this.addElementCallback) this.addElementCallback(element); var self = this; element.registerFunctionOnPropertiesValueChanged(["visible", "isVisible"], function () { self.onElementVisibilityChanged(element); }, this.id); element.registerFunctionOnPropertyValueChanged("startWithNewLine", function () { self.onElementStartWithNewLineChanged(element); }, this.id); this.onElementVisibilityChanged(this); }; PanelModelBase.prototype.onRemoveElement = function (element) { element.parent = null; this.markQuestionListDirty(); element.unRegisterFunctionOnPropertiesValueChanged(["visible", "isVisible", "startWithNewLine"], this.id); this.updateRowsOnElementRemoved(element); if (this.isRandomizing) return; if (!element.isPanel) { if (this.survey) this.survey.questionRemoved(element); } else { if (this.survey) this.survey.panelRemoved(element); } if (!!this.removeElementCallback) this.removeElementCallback(element); this.onElementVisibilityChanged(this); }; PanelModelBase.prototype.onElementVisibilityChanged = function (element) { if (this.isLoadingFromJson || this.isRandomizing) return; this.updateRowsVisibility(element); this.childVisibilityChanged(); if (!!this.parent) { this.parent.onElementVisibilityChanged(this); } }; PanelModelBase.prototype.onElementStartWithNewLineChanged = function (element) { this.onRowsChanged(); }; PanelModelBase.prototype.updateRowsVisibility = function (element) { var rows = this.rows; for (var i = 0; i < rows.length; i++) { var row = rows[i]; if (row.elements.indexOf(element) > -1) { row.updateVisible(); if (row.visible && !row.isNeedRender) { row.isNeedRender = true; } break; } } }; PanelModelBase.prototype.canBuildRows = function () { return !this.isLoadingFromJson && this.getChildrenLayoutType() == "row"; }; PanelModelBase.prototype.buildRows = function () { if (!this.canBuildRows()) return []; var result = new Array(); for (var i = 0; i < this.elements.length; i++) { var el = this.elements[i]; var isNewRow = i == 0 || el.startWithNewLine; var row = isNewRow ? this.createRowAndSetLazy(result.length) : result[result.length - 1]; if (isNewRow) result.push(row); row.addElement(el); } for (var i = 0; i < result.length; i++) { result[i].updateVisible(); } return result; }; PanelModelBase.prototype.isLazyRenderInRow = function (rowIndex) { if (!this.survey || !this.survey.isLazyRendering) return false; return (rowIndex >= _settings__WEBPACK_IMPORTED_MODULE_8__["settings"].lazyRowsRenderingStartRow || !this.canRenderFirstRows()); }; PanelModelBase.prototype.canRenderFirstRows = function () { return this.isPage; }; PanelModelBase.prototype.updateRowsOnElementAdded = function (element, index) { if (!this.canBuildRows()) return; var dragDropInfo = new DragDropInfo(null, element); dragDropInfo.target = element; dragDropInfo.isEdge = this.elements.length > 1; if (this.elements.length < 2) { dragDropInfo.destination = this; } else { dragDropInfo.isBottom = index > 0; if (index == 0) { dragDropInfo.destination = this.elements[1]; } else { dragDropInfo.destination = this.elements[index - 1]; } } this.dragDropAddTargetToRow(dragDropInfo, null); }; PanelModelBase.prototype.updateRowsOnElementRemoved = function (element) { if (!this.canBuildRows()) return; this.updateRowsRemoveElementFromRow(element, this.findRowByElement(element)); }; PanelModelBase.prototype.updateRowsRemoveElementFromRow = function (element, row) { if (!row || !row.panel) return; var elIndex = row.elements.indexOf(element); if (elIndex < 0) return; row.elements.splice(elIndex, 1); if (row.elements.length > 0) { row.updateVisible(); } else { if (row.index >= 0) { row.panel.rows.splice(row.index, 1); } } }; PanelModelBase.prototype.findRowByElement = function (el) { var rows = this.rows; for (var i = 0; i < rows.length; i++) { if (rows[i].elements.indexOf(el) > -1) return rows[i]; } return null; }; PanelModelBase.prototype.elementWidthChanged = function (el) { if (this.isLoadingFromJson) return; var row = this.findRowByElement(el); if (!!row) { row.updateVisible(); } }; Object.defineProperty(PanelModelBase.prototype, "processedTitle", { /** * Returns rendered title text or html. */ get: function () { return this.getRenderedTitle(this.locTitle.textOrHtml); }, enumerable: false, configurable: true }); PanelModelBase.prototype.getRenderedTitle = function (str) { return this.textProcessor != null ? this.textProcessor.processText(str, true) : str; }; Object.defineProperty(PanelModelBase.prototype, "visible", { /** * Use it to get/set the object visibility. * @see visibleIf */ get: function () { return this.getPropertyValue("visible", true); }, set: function (value) { if (value === this.visible) return; this.setPropertyValue("visible", value); this.setPropertyValue("isVisible", this.isVisible); if (!this.isLoadingFromJson) this.onVisibleChanged(); }, enumerable: false, configurable: true }); PanelModelBase.prototype.onVisibleChanged = function () { if (this.isRandomizing) return; this.setPropertyValue("isVisible", this.isVisible); if (!!this.survey && this.survey.isClearValueOnHiddenContainer && !this.isLoadingFromJson) { var questions = this.questions; for (var i = 0; i < questions.length; i++) { if (!this.isVisible) { questions[i].clearValue(); } else { questions[i].updateValueWithDefaults(); } } } }; Object.defineProperty(PanelModelBase.prototype, "isVisible", { /** * Returns true if object is visible or survey is in design mode right now. */ get: function () { return this.areInvisibleElementsShowing || this.getIsPageVisible(null); }, enumerable: false, configurable: true }); PanelModelBase.prototype.getIsPageVisible = function (exceptionQuestion) { if (!this.visible) return false; for (var i = 0; i < this.elements.length; i++) { if (this.elements[i] == exceptionQuestion) continue; if (this.elements[i].isVisible) return true; } return false; }; PanelModelBase.prototype.setVisibleIndex = function (index) { if (!this.isVisible || index < 0) { this.resetVisibleIndexes(); return 0; } this.lastVisibleIndex = index; var startIndex = index; index += this.beforeSetVisibleIndex(index); var panelStartIndex = this.getPanelStartIndex(index); var panelIndex = panelStartIndex; for (var i = 0; i < this.elements.length; i++) { panelIndex += this.elements[i].setVisibleIndex(panelIndex); } if (this.isContinueNumbering()) { index += panelIndex - panelStartIndex; } return index - startIndex; }; PanelModelBase.prototype.updateVisibleIndexes = function () { if (this.lastVisibleIndex === undefined) return; this.resetVisibleIndexes(); this.setVisibleIndex(this.lastVisibleIndex); }; PanelModelBase.prototype.resetVisibleIndexes = function () { for (var i = 0; i < this.elements.length; i++) { this.elements[i].setVisibleIndex(-1); } }; PanelModelBase.prototype.beforeSetVisibleIndex = function (index) { return 0; }; PanelModelBase.prototype.getPanelStartIndex = function (index) { return index; }; PanelModelBase.prototype.isContinueNumbering = function () { return true; }; Object.defineProperty(PanelModelBase.prototype, "isReadOnly", { /** * Returns true if readOnly property is true or survey is in display mode or parent panel/page is readOnly. * @see SurveyModel.model * @see readOnly */ get: function () { var isParentReadOnly = !!this.parent && this.parent.isReadOnly; var isSurveyReadOnly = !!this.survey && this.survey.isDisplayMode; return this.readOnly || isParentReadOnly || isSurveyReadOnly; }, enumerable: false, configurable: true }); PanelModelBase.prototype.onReadOnlyChanged = function () { for (var i = 0; i < this.elements.length; i++) { var el = this.elements[i]; el.setPropertyValue("isReadOnly", el.isReadOnly); } _super.prototype.onReadOnlyChanged.call(this); }; PanelModelBase.prototype.updateElementCss = function (reNew) { _super.prototype.updateElementCss.call(this, reNew); for (var i = 0; i < this.elements.length; i++) { var el = this.elements[i]; el.updateElementCss(reNew); } }; Object.defineProperty(PanelModelBase.prototype, "enableIf", { /** * An expression that returns true or false. If it returns false the Panel/Page becomes read only and an end-user will not able to answer on qustions inside it. * The library runs the expression on survey start and on changing a question value. If the property is empty then readOnly property is used. * @see readOnly * @see isReadOnly */ get: function () { return this.getPropertyValue("enableIf", ""); }, set: function (val) { this.setPropertyValue("enableIf", val); }, enumerable: false, configurable: true }); /** * Add an element into Panel or Page. Returns true if the element added successfully. Otherwise returns false. * @param element * @param index element index in the elements array */ PanelModelBase.prototype.addElement = function (element, index) { if (index === void 0) { index = -1; } if (!this.canAddElement(element)) return false; if (index < 0 || index >= this.elements.length) { this.elements.push(element); } else { this.elements.splice(index, 0, element); } return true; }; PanelModelBase.prototype.insertElementAfter = function (element, after) { var index = this.elements.indexOf(after); if (index >= 0) this.addElement(element, index + 1); }; PanelModelBase.prototype.insertElementBefore = function (element, before) { var index = this.elements.indexOf(before); if (index >= 0) this.addElement(element, index); }; PanelModelBase.prototype.canAddElement = function (element) { return (!!element && element.isLayoutTypeSupported(this.getChildrenLayoutType())); }; /** * Add a question into Panel or Page. Returns true if the question added successfully. Otherwise returns false. * @param question * @param index element index in the elements array */ PanelModelBase.prototype.addQuestion = function (question, index) { if (index === void 0) { index = -1; } return this.addElement(question, index); }; /** * Add a panel into Panel or Page. Returns true if the panel added successfully. Otherwise returns false. * @param panel * @param index element index in the elements array */ PanelModelBase.prototype.addPanel = function (panel, index) { if (index === void 0) { index = -1; } return this.addElement(panel, index); }; /** * Creates a new question and adds it at location of index, by default the end of the elements list. Returns null, if the question could not be created or could not be added into page or panel. * @param questionType the possible values are: "text", "checkbox", "dropdown", "matrix", "html", "matrixdynamic", "matrixdropdown" and so on. * @param name a question name * @param index element index in the elements array */ PanelModelBase.prototype.addNewQuestion = function (questionType, name, index) { if (name === void 0) { name = null; } if (index === void 0) { index = -1; } var question = _questionfactory__WEBPACK_IMPORTED_MODULE_6__["QuestionFactory"].Instance.createQuestion(questionType, name); if (!this.addQuestion(question, index)) return null; return question; }; /** * Creates a new panel and adds it into the end of the elements list. Returns null, if the panel could not be created or could not be added into page or panel. * @param name a panel name */ PanelModelBase.prototype.addNewPanel = function (name) { if (name === void 0) { name = null; } var panel = this.createNewPanel(name); if (!this.addPanel(panel)) return null; return panel; }; /** * Returns the index of element parameter in the elements list. * @param element question or panel */ PanelModelBase.prototype.indexOf = function (element) { return this.elements.indexOf(element); }; PanelModelBase.prototype.createNewPanel = function (name) { var res = _jsonobject__WEBPACK_IMPORTED_MODULE_0__["Serializer"].createClass("panel"); res.name = name; return res; }; /** * Remove an element (Panel or Question) from the elements list. * @param element * @see elements */ PanelModelBase.prototype.removeElement = function (element) { var index = this.elements.indexOf(element); if (index < 0) { for (var i = 0; i < this.elements.length; i++) { if (this.elements[i].removeElement(element)) return true; } return false; } this.elements.splice(index, 1); return true; }; /** * Remove question from the elements list. * @param question * @see elements * @see removeElement */ PanelModelBase.prototype.removeQuestion = function (question) { this.removeElement(question); }; PanelModelBase.prototype.runCondition = function (values, properties) { if (this.isDesignMode || this.isLoadingFromJson) return; var elements = this.elements.slice(); for (var i = 0; i < elements.length; i++) { elements[i].runCondition(values, properties); } if (!this.areInvisibleElementsShowing) { this.runVisibleCondition(values, properties); } this.runEnableCondition(values, properties); this.runRequiredCondition(values, properties); }; PanelModelBase.prototype.runVisibleCondition = function (values, properties) { var _this = this; if (!this.visibleIf) return; var conditionRunner = new _conditions__WEBPACK_IMPORTED_MODULE_5__["ConditionRunner"](this.visibleIf); conditionRunner.onRunComplete = function (res) { _this.visible = res; }; conditionRunner.run(values, properties); }; PanelModelBase.prototype.runEnableCondition = function (values, properties) { var _this = this; if (!this.enableIf) return; var conditionRunner = new _conditions__WEBPACK_IMPORTED_MODULE_5__["ConditionRunner"](this.enableIf); conditionRunner.onRunComplete = function (res) { _this.readOnly = !res; }; conditionRunner.run(values, properties); }; PanelModelBase.prototype.runRequiredCondition = function (values, properties) { var _this = this; if (!this.requiredIf) return; var conditionRunner = new _conditions__WEBPACK_IMPORTED_MODULE_5__["ConditionRunner"](this.requiredIf); conditionRunner.onRunComplete = function (res) { _this.isRequired = res; }; conditionRunner.run(values, properties); }; PanelModelBase.prototype.onAnyValueChanged = function (name) { var els = this.elements; for (var i = 0; i < els.length; i++) { els[i].onAnyValueChanged(name); } }; PanelModelBase.prototype.checkBindings = function (valueName, value) { var els = this.elements; for (var i = 0; i < els.length; i++) { els[i].checkBindings(valueName, value); } }; PanelModelBase.prototype.dragDropAddTarget = function (dragDropInfo) { var prevRow = this.dragDropFindRow(dragDropInfo.target); if (this.dragDropAddTargetToRow(dragDropInfo, prevRow)) { this.updateRowsRemoveElementFromRow(dragDropInfo.target, prevRow); } }; PanelModelBase.prototype.dragDropFindRow = function (findElement) { if (!findElement || findElement.isPage) return null; var element = findElement; var rows = this.rows; for (var i = 0; i < rows.length; i++) { if (rows[i].elements.indexOf(element) > -1) return rows[i]; } for (var i = 0; i < this.elements.length; i++) { var pnl = this.elements[i].getPanel(); if (!pnl) continue; var row = pnl.dragDropFindRow(element); if (!!row) return row; } return null; }; PanelModelBase.prototype.dragDropAddTargetToRow = function (dragDropInfo, prevRow) { if (!dragDropInfo.destination) return true; if (this.dragDropAddTargetToEmptyPanel(dragDropInfo)) return true; var dest = dragDropInfo.destination; var destRow = this.dragDropFindRow(dest); if (!destRow) return true; if (!dragDropInfo.target.startWithNewLine) return this.dragDropAddTargetToExistingRow(dragDropInfo, destRow, prevRow); return this.dragDropAddTargetToNewRow(dragDropInfo, destRow, prevRow); }; PanelModelBase.prototype.dragDropAddTargetToEmptyPanel = function (dragDropInfo) { if (dragDropInfo.destination.isPage) { this.dragDropAddTargetToEmptyPanelCore(this.root, dragDropInfo.target, dragDropInfo.isBottom); return true; } var dest = dragDropInfo.destination; if (dest.isPanel && !dragDropInfo.isEdge) { var panel = dest; if (dragDropInfo.target["template"] === dest) { return false; } if (dragDropInfo.nestedPanelDepth < 0 || dragDropInfo.nestedPanelDepth >= panel.depth) { this.dragDropAddTargetToEmptyPanelCore(dest, dragDropInfo.target, dragDropInfo.isBottom); return true; } } return false; }; PanelModelBase.prototype.dragDropAddTargetToExistingRow = function (dragDropInfo, destRow, prevRow) { var index = destRow.elements.indexOf(dragDropInfo.destination); if (index == 0 && !dragDropInfo.isBottom && destRow.elements[0].startWithNewLine) { if (destRow.index > 0) { dragDropInfo.isBottom = true; destRow = destRow.panel.rows[destRow.index - 1]; dragDropInfo.destination = destRow.elements[destRow.elements.length - 1]; return this.dragDropAddTargetToExistingRow(dragDropInfo, destRow, prevRow); } else { return this.dragDropAddTargetToNewRow(dragDropInfo, destRow, prevRow); } } var prevRowIndex = -1; if (prevRow == destRow) { prevRowIndex = destRow.elements.indexOf(dragDropInfo.target); } if (dragDropInfo.isBottom) index++; var srcRow = this.findRowByElement(dragDropInfo.source); if (srcRow == destRow && srcRow.elements.indexOf(dragDropInfo.source) == index) return false; if (index == prevRowIndex) return false; if (prevRowIndex > -1) { destRow.elements.splice(prevRowIndex, 1); if (prevRowIndex < index) index--; } destRow.elements.splice(index, 0, dragDropInfo.target); destRow.updateVisible(); return prevRowIndex < 0; }; PanelModelBase.prototype.dragDropAddTargetToNewRow = function (dragDropInfo, destRow, prevRow) { var targetRow = destRow.panel.createRowAndSetLazy(destRow.panel.rows.length); targetRow.addElement(dragDropInfo.target); var index = destRow.index; if (dragDropInfo.isBottom) { index++; } //same row if (!!prevRow && prevRow.panel == targetRow.panel && prevRow.index == index) return false; var srcRow = this.findRowByElement(dragDropInfo.source); if (!!srcRow && srcRow.panel == targetRow.panel && srcRow.elements.length == 1 && srcRow.index == index) return false; destRow.panel.rows.splice(index, 0, targetRow); return true; }; PanelModelBase.prototype.dragDropAddTargetToEmptyPanelCore = function (panel, target, isBottom) { var targetRow = panel.createRow(); targetRow.addElement(target); if (panel.elements.length == 0 || isBottom) { panel.rows.push(targetRow); } else { panel.rows.splice(0, 0, targetRow); } }; PanelModelBase.prototype.dragDropMoveElement = function (src, target, targetIndex) { var srcIndex = src.parent.elements.indexOf(src); if (targetIndex > srcIndex) { targetIndex--; } this.removeElement(src); this.addElement(target, targetIndex); }; Object.defineProperty(PanelModelBase.prototype, "no", { //ITitleOwner get: function () { return ""; }, enumerable: false, configurable: true }); PanelModelBase.prototype.dispose = function () { _super.prototype.dispose.call(this); if (this.rows) { for (var i = 0; i < this.rows.length; i++) { this.rows[i].dispose(); } this.rows.splice(0, this.rows.length); } for (var i = 0; i < this.elements.length; i++) { this.elements[i].dispose(); } this.elements.splice(0, this.elements.length); }; PanelModelBase.panelCounter = 100; return PanelModelBase; }(_survey_element__WEBPACK_IMPORTED_MODULE_3__["SurveyElement"])); /** * A container element, similar to the Page objects. However, unlike the Page, Panel can't be a root. * It may contain questions and other panels. */ var PanelModel = /** @class */ (function (_super) { __extends(PanelModel, _super); function PanelModel(name) { if (name === void 0) { name = ""; } var _this = _super.call(this, name) || this; var self = _this; _this.createNewArray("footerActions"); _this.registerFunctionOnPropertyValueChanged("width", function () { if (!!self.parent) { self.parent.elementWidthChanged(self); } }); _this.registerFunctionOnPropertiesValueChanged(["indent", "innerIndent", "rightIndent"], function () { self.onIndentChanged(); }); return _this; } PanelModel.prototype.getType = function () { return "panel"; }; Object.defineProperty(PanelModel.prototype, "contentId", { get: function () { return this.id + "_content"; }, enumerable: false, configurable: true }); PanelModel.prototype.getSurvey = function (live) { if (live === void 0) { live = false; } if (live) { return !!this.parent ? this.parent.getSurvey(live) : null; } return _super.prototype.getSurvey.call(this, live); }; PanelModel.prototype.onSurveyLoad = function () { _super.prototype.onSurveyLoad.call(this); this.onIndentChanged(); }; PanelModel.prototype.onSetData = function () { _super.prototype.onSetData.call(this); this.onIndentChanged(); }; Object.defineProperty(PanelModel.prototype, "isPanel", { get: function () { return true; }, enumerable: false, configurable: true }); Object.defineProperty(PanelModel.prototype, "page", { /** * Get/set the page where the panel is located. */ get: function () { return this.getPage(this.parent); }, set: function (val) { this.setPage(this.parent, val); }, enumerable: false, configurable: true }); PanelModel.prototype.delete = function () { if (!!this.parent) { this.removeSelfFromList(this.parent.elements); } }; /** * Move panel to a new container Page/Panel. Add as a last element if insertBefore parameter is not used or inserted into the given index, * if insert parameter is number, or before the given element, if the insertBefore parameter is a question or panel * @param container Page or Panel to where a question is relocated. * @param insertBefore Use it if you want to set the panel to a specific position. You may use a number (use 0 to insert int the beginning) or element, if you want to insert before this element. */ PanelModel.prototype.moveTo = function (container, insertBefore) { if (insertBefore === void 0) { insertBefore = null; } return this.moveToBase(this.parent, container, insertBefore); }; Object.defineProperty(PanelModel.prototype, "visibleIndex", { /** * Returns the visible index of the panel in the survey. Commonly it is -1 and it doesn't show. * You have to set showNumber to true to show index/numbering for the Panel * @see showNumber */ get: function () { return this.getPropertyValue("visibleIndex", -1); }, enumerable: false, configurable: true }); PanelModel.prototype.getTitleOwner = function () { return this; }; Object.defineProperty(PanelModel.prototype, "showNumber", { /** * Set showNumber to true to start showing the number for this panel. * @see visibleIndex */ get: function () { return this.getPropertyValue("showNumber", false); }, set: function (val) { this.setPropertyValue("showNumber", val); this.notifySurveyOnVisibilityChanged(); }, enumerable: false, configurable: true }); Object.defineProperty(PanelModel.prototype, "showQuestionNumbers", { /** * Gets or sets a value that specifies how the elements numbers inside panel are displayed. * * The following options are available: * * - `default` - display questions numbers as defined in parent panel or survey * - `onpanel` - display questions numbers, start numbering from beginning of this page * - `off` - turn off the numbering for questions titles * @see showNumber */ get: function () { return this.getPropertyValue("showQuestionNumbers"); }, set: function (value) { this.setPropertyValue("showQuestionNumbers", value); this.notifySurveyOnVisibilityChanged(); }, enumerable: false, configurable: true }); Object.defineProperty(PanelModel.prototype, "questionStartIndex", { /** * Gets or sets the first question index for elements inside the panel. The first question index is '1.' by default and it is taken from survey.questionStartIndex property. * You may start it from '100' or from 'A', by setting '100' or 'A' to this property. * You can set the start index to "(1)" or "# A)" or "a)" to render question number as (1), # A) and a) accordingly. * @see survey.questionStartIndex */ get: function () { return this.getPropertyValue("questionStartIndex", ""); }, set: function (val) { this.setPropertyValue("questionStartIndex", val); }, enumerable: false, configurable: true }); PanelModel.prototype.getQuestionStartIndex = function () { if (!!this.questionStartIndex) return this.questionStartIndex; return _super.prototype.getQuestionStartIndex.call(this); }; Object.defineProperty(PanelModel.prototype, "no", { /** * The property returns the question number. If question is invisible then it returns empty string. * If visibleIndex is 1, then no is 2, or 'B' if survey.questionStartIndex is 'A'. * @see SurveyModel.questionStartIndex */ get: function () { return this.getPropertyValue("no", ""); }, enumerable: false, configurable: true }); PanelModel.prototype.setNo = function (visibleIndex) { this.setPropertyValue("no", _helpers__WEBPACK_IMPORTED_MODULE_1__["Helpers"].getNumberByIndex(this.visibleIndex, this.getStartIndex())); }; PanelModel.prototype.beforeSetVisibleIndex = function (index) { var visibleIndex = -1; if (this.showNumber && (this.isDesignMode || !this.locTitle.isEmpty)) { visibleIndex = index; } this.setPropertyValue("visibleIndex", visibleIndex); this.setNo(visibleIndex); return visibleIndex < 0 ? 0 : 1; }; PanelModel.prototype.getPanelStartIndex = function (index) { if (this.showQuestionNumbers == "off") return -1; if (this.showQuestionNumbers == "onpanel") return 0; return index; }; PanelModel.prototype.isContinueNumbering = function () { return (this.showQuestionNumbers != "off" && this.showQuestionNumbers != "onpanel"); }; PanelModel.prototype.notifySurveyOnVisibilityChanged = function () { if (this.survey != null && !this.isLoadingFromJson) { this.survey.panelVisibilityChanged(this, this.isVisible); } }; PanelModel.prototype.hasErrorsCore = function (rec) { _super.prototype.hasErrorsCore.call(this, rec); if (this.isCollapsed && rec.result && rec.fireCallback) { this.expand(); } }; PanelModel.prototype.getRenderedTitle = function (str) { if (!str) { if (this.isCollapsed || this.isExpanded) return this.name; if (this.isDesignMode) return "[" + this.name + "]"; } return _super.prototype.getRenderedTitle.call(this, str); }; Object.defineProperty(PanelModel.prototype, "width", { /** * The Panel width. */ get: function () { return this.getPropertyValue("width"); }, set: function (val) { this.setPropertyValue("width", val); }, enumerable: false, configurable: true }); Object.defineProperty(PanelModel.prototype, "indent", { /** * The left indent. Set this property to increase the panel left indent. */ get: function () { return this.getPropertyValue("indent"); }, set: function (val) { this.setPropertyValue("indent", val); }, enumerable: false, configurable: true }); Object.defineProperty(PanelModel.prototype, "innerIndent", { /** * The inner indent. Set this property to increase the panel content margin. */ get: function () { return this.getPropertyValue("innerIndent"); }, set: function (val) { this.setPropertyValue("innerIndent", val); }, enumerable: false, configurable: true }); Object.defineProperty(PanelModel.prototype, "renderWidth", { get: function () { return this.getPropertyValue("renderWidth"); }, set: function (val) { this.setPropertyValue("renderWidth", val); }, enumerable: false, configurable: true }); Object.defineProperty(PanelModel.prototype, "startWithNewLine", { /** * The Panel renders on the new line if the property is true. If the property is false, the panel tries to render on the same line/row with a previous question/panel. */ get: function () { return this.getPropertyValue("startWithNewLine"); }, set: function (value) { this.setPropertyValue("startWithNewLine", value); }, enumerable: false, configurable: true }); Object.defineProperty(PanelModel.prototype, "rightIndent", { /** * The right indent of the Panel. */ get: function () { return this.getPropertyValue("rightIndent", 0); }, set: function (val) { this.setPropertyValue("rightIndent", val); }, enumerable: false, configurable: true }); Object.defineProperty(PanelModel.prototype, "allowAdaptiveActions", { /** * The Panel toolbar gets adaptive if the property is set to true. */ get: function () { return this.getPropertyValue("allowAdaptiveActions"); }, set: function (val) { this.setPropertyValue("allowAdaptiveActions", val); }, enumerable: false, configurable: true }); Object.defineProperty(PanelModel.prototype, "paddingLeft", { get: function () { return this.getPropertyValue("paddingLeft", ""); }, set: function (val) { this.setPropertyValue("paddingLeft", val); }, enumerable: false, configurable: true }); Object.defineProperty(PanelModel.prototype, "innerPaddingLeft", { get: function () { return this.getPropertyValue("innerPaddingLeft", ""); }, set: function (val) { this.setPropertyValue("innerPaddingLeft", val); }, enumerable: false, configurable: true }); Object.defineProperty(PanelModel.prototype, "paddingRight", { get: function () { return this.getPropertyValue("paddingRight", ""); }, set: function (val) { this.setPropertyValue("paddingRight", val); }, enumerable: false, configurable: true }); PanelModel.prototype.onIndentChanged = function () { if (!this.getSurvey()) return; this.innerPaddingLeft = this.getIndentSize(this.innerIndent); this.paddingLeft = this.getIndentSize(this.indent); this.paddingRight = this.getIndentSize(this.rightIndent); }; PanelModel.prototype.getIndentSize = function (indent) { if (indent < 1) return ""; var css = this.survey["css"]; if (!css) return ""; return indent * css.question.indent + "px"; }; PanelModel.prototype.clearOnDeletingContainer = function () { this.elements.forEach(function (element) { if (element instanceof _question__WEBPACK_IMPORTED_MODULE_4__["Question"] || element instanceof PanelModel) { element.clearOnDeletingContainer(); } }); }; Object.defineProperty(PanelModel.prototype, "footerActions", { get: function () { return this.getPropertyValue("footerActions"); }, enumerable: false, configurable: true }); PanelModel.prototype.getFooterToolbar = function () { var _this = this; if (!this.footerToolbarValue) { var actions = this.footerActions; if (this.hasEditButton) { actions.push({ id: "cancel-preview", title: this.survey.editText, innerCss: this.survey.cssNavigationEdit, action: function () { _this.cancelPreview(); } }); } this.footerToolbarValue = this.allowAdaptiveActions ? new _actions_adaptive_container__WEBPACK_IMPORTED_MODULE_11__["AdaptiveActionContainer"]() : new _actions_container__WEBPACK_IMPORTED_MODULE_12__["ActionContainer"](); if (!!this.cssClasses.panel) { this.footerToolbarValue.containerCss = this.cssClasses.panel.footer; } this.footerToolbarValue.setItems(actions); } return this.footerToolbarValue; }; Object.defineProperty(PanelModel.prototype, "hasEditButton", { get: function () { if (this.survey && this.survey.state === "preview") return this.depth === 1; return false; }, enumerable: false, configurable: true }); PanelModel.prototype.cancelPreview = function () { if (!this.hasEditButton) return; this.survey.cancelPreviewByPage(this); }; Object.defineProperty(PanelModel.prototype, "cssTitle", { get: function () { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_10__["CssClassBuilder"]() .append(this.cssClasses.panel.title) .append(this.cssClasses.panel.titleExpandable, this.state !== "default") .append(this.cssClasses.panel.titleOnError, this.containsErrors) .toString(); }, enumerable: false, configurable: true }); Object.defineProperty(PanelModel.prototype, "cssError", { get: function () { return this.getCssError(this.cssClasses); }, enumerable: false, configurable: true }); PanelModel.prototype.getCssError = function (cssClasses) { var builder = new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_10__["CssClassBuilder"]().append(this.cssClasses.error.root); return builder.append("panel-error-root", builder.isEmpty()).toString(); }; PanelModel.prototype.onVisibleChanged = function () { _super.prototype.onVisibleChanged.call(this); this.notifySurveyOnVisibilityChanged(); }; return PanelModel; }(PanelModelBase)); _jsonobject__WEBPACK_IMPORTED_MODULE_0__["Serializer"].addClass("panelbase", [ "name", { name: "elements", alternativeName: "questions", baseClassName: "question", visible: false, isLightSerializable: false, }, { name: "visible:switch", default: true }, "visibleIf:condition", "enableIf:condition", "requiredIf:condition", "readOnly:boolean", { name: "questionTitleLocation", default: "default", choices: ["default", "top", "bottom", "left", "hidden"], }, { name: "title:text", serializationProperty: "locTitle" }, { name: "description:text", serializationProperty: "locDescription" }, { name: "questionsOrder", default: "default", choices: ["default", "initial", "random"], }, ], function () { return new PanelModelBase(); }); _jsonobject__WEBPACK_IMPORTED_MODULE_0__["Serializer"].addClass("panel", [ { name: "state", default: "default", choices: ["default", "collapsed", "expanded"], }, "isRequired:switch", { name: "requiredErrorText:text", serializationProperty: "locRequiredErrorText", }, { name: "startWithNewLine:boolean", default: true }, "width", { name: "innerIndent:number", default: 0, choices: [0, 1, 2, 3] }, { name: "indent:number", default: 0, choices: [0, 1, 2, 3] }, { name: "page", isSerializable: false, visibleIf: function (obj) { var survey = obj ? obj.survey : null; return !survey || survey.pages.length > 1; }, choices: function (obj) { var survey = obj ? obj.survey : null; return survey ? survey.pages.map(function (p) { return { value: p.name, text: p.title }; }) : []; }, }, "showNumber:boolean", { name: "showQuestionNumbers", default: "default", choices: ["default", "onpanel", "off"], }, "questionStartIndex", { name: "allowAdaptiveActions:boolean", default: true, visible: false }, ], function () { return new PanelModel(); }, "panelbase"); _questionfactory__WEBPACK_IMPORTED_MODULE_6__["ElementFactory"].Instance.registerElement("panel", function (name) { return new PanelModel(name); }); /***/ }), /***/ "./src/popup.ts": /*!**********************!*\ !*** ./src/popup.ts ***! \**********************/ /*! exports provided: PopupModel, createPopupModalViewModel, PopupBaseViewModel */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PopupModel", function() { return PopupModel; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createPopupModalViewModel", function() { return createPopupModalViewModel; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PopupBaseViewModel", function() { return PopupBaseViewModel; }); /* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base */ "./src/base.ts"); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./surveyStrings */ "./src/surveyStrings.ts"); /* harmony import */ var _utils_popup__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils/popup */ "./src/utils/popup.ts"); /* harmony import */ var _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils/cssClassBuilder */ "./src/utils/cssClassBuilder.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var PopupModel = /** @class */ (function (_super) { __extends(PopupModel, _super); function PopupModel(contentComponentName, contentComponentData, verticalPosition, horizontalPosition, showPointer, isModal, onCancel, onApply, onHide, onShow, cssClass, title) { if (verticalPosition === void 0) { verticalPosition = "bottom"; } if (horizontalPosition === void 0) { horizontalPosition = "left"; } if (showPointer === void 0) { showPointer = true; } if (isModal === void 0) { isModal = false; } if (onCancel === void 0) { onCancel = function () { }; } if (onApply === void 0) { onApply = function () { return true; }; } if (onHide === void 0) { onHide = function () { }; } if (onShow === void 0) { onShow = function () { }; } if (cssClass === void 0) { cssClass = ""; } if (title === void 0) { title = ""; } var _this = _super.call(this) || this; _this.contentComponentName = contentComponentName; _this.contentComponentData = contentComponentData; _this.verticalPosition = verticalPosition; _this.horizontalPosition = horizontalPosition; _this.showPointer = showPointer; _this.isModal = isModal; _this.onCancel = onCancel; _this.onApply = onApply; _this.onHide = onHide; _this.onShow = onShow; _this.cssClass = cssClass; _this.title = title; return _this; } Object.defineProperty(PopupModel.prototype, "isVisible", { get: function () { return this.getPropertyValue("isVisible", false); }, set: function (value) { if (this.isVisible === value) { return; } this.setPropertyValue("isVisible", value); this.onVisibilityChanged && this.onVisibilityChanged(value); if (this.isVisible) { this.onShow(); } else { this.onHide(); } }, enumerable: false, configurable: true }); PopupModel.prototype.toggleVisibility = function () { this.isVisible = !this.isVisible; }; __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__["property"])() ], PopupModel.prototype, "contentComponentName", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__["property"])() ], PopupModel.prototype, "contentComponentData", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__["property"])({ defaultValue: "bottom" }) ], PopupModel.prototype, "verticalPosition", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__["property"])({ defaultValue: "left" }) ], PopupModel.prototype, "horizontalPosition", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__["property"])({ defaultValue: false }) ], PopupModel.prototype, "showPointer", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__["property"])({ defaultValue: false }) ], PopupModel.prototype, "isModal", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__["property"])({ defaultValue: function () { } }) ], PopupModel.prototype, "onCancel", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__["property"])({ defaultValue: function () { return true; } }) ], PopupModel.prototype, "onApply", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__["property"])({ defaultValue: function () { } }) ], PopupModel.prototype, "onHide", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__["property"])({ defaultValue: function () { } }) ], PopupModel.prototype, "onShow", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__["property"])({ defaultValue: "" }) ], PopupModel.prototype, "cssClass", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__["property"])({ defaultValue: "" }) ], PopupModel.prototype, "title", void 0); return PopupModel; }(_base__WEBPACK_IMPORTED_MODULE_0__["Base"])); function createPopupModalViewModel(componentName, data, onApply, onCancel, onHide, onShow, cssClass, title) { if (onHide === void 0) { onHide = function () { }; } if (onShow === void 0) { onShow = function () { }; } var popupModel = new PopupModel(componentName, data, "top", "left", false, true, onCancel, onApply, onHide, onShow, cssClass, title); var popupViewModel = new PopupBaseViewModel(popupModel, undefined); popupViewModel.initializePopupContainer(); return popupViewModel; } var FOCUS_INPUT_SELECTOR = "input:not(:disabled):not([readonly]):not([type=hidden]),select:not(:disabled):not([readonly]),textarea:not(:disabled):not([readonly]), button:not(:disabled):not([readonly]), [tabindex]:not([tabindex^=\"-\"])"; var PopupBaseViewModel = /** @class */ (function (_super) { __extends(PopupBaseViewModel, _super); function PopupBaseViewModel(model, targetElement) { var _this = _super.call(this) || this; _this.targetElement = targetElement; _this.scrollEventCallBack = function () { return _this.hidePopup(); }; _this.model = model; return _this; } PopupBaseViewModel.prototype.hidePopup = function () { this.model.isVisible = false; }; Object.defineProperty(PopupBaseViewModel.prototype, "model", { get: function () { return this._model; }, set: function (model) { var _this = this; if (!!this.model) { this.model.unRegisterFunctionOnPropertiesValueChanged(["isVisible"], "PopupBaseViewModel"); } this._model = model; var updater = function () { if (!model.isVisible) { _this.updateOnHiding(); } _this.isVisible = model.isVisible; }; model.registerFunctionOnPropertyValueChanged("isVisible", updater, "PopupBaseViewModel"); updater(); }, enumerable: false, configurable: true }); Object.defineProperty(PopupBaseViewModel.prototype, "title", { get: function () { return this.model.title; }, enumerable: false, configurable: true }); Object.defineProperty(PopupBaseViewModel.prototype, "contentComponentName", { get: function () { return this.model.contentComponentName; }, enumerable: false, configurable: true }); Object.defineProperty(PopupBaseViewModel.prototype, "contentComponentData", { get: function () { return this.model.contentComponentData; }, enumerable: false, configurable: true }); Object.defineProperty(PopupBaseViewModel.prototype, "showPointer", { get: function () { return this.model.showPointer; }, enumerable: false, configurable: true }); Object.defineProperty(PopupBaseViewModel.prototype, "isModal", { get: function () { return this.model.isModal; }, enumerable: false, configurable: true }); Object.defineProperty(PopupBaseViewModel.prototype, "styleClass", { get: function () { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_4__["CssClassBuilder"]() .append(this.model.cssClass) .append("sv-popup--modal", this.isModal) .append("sv-popup--show-pointer", !this.isModal && this.showPointer) .append("sv-popup--" + this.popupDirection, !this.isModal && this.showPointer) .toString(); }, enumerable: false, configurable: true }); PopupBaseViewModel.prototype.onKeyDown = function (event) { if (event.key === "Tab" || event.keyCode === 9) { this.trapFocus(event); } else if (event.key === "Escape" || event.keyCode === 27) { if (this.isModal) { this.model.onCancel(); } this.hidePopup(); } }; PopupBaseViewModel.prototype.trapFocus = function (event) { var focusableElements = this.container.querySelectorAll(FOCUS_INPUT_SELECTOR); var firstFocusableElement = focusableElements[0]; var lastFocusableElement = focusableElements[focusableElements.length - 1]; if (event.shiftKey) { if (document.activeElement === firstFocusableElement) { lastFocusableElement.focus(); event.preventDefault(); } } else { if (document.activeElement === lastFocusableElement) { firstFocusableElement.focus(); event.preventDefault(); } } }; PopupBaseViewModel.prototype.updateOnShowing = function () { this.prevActiveElement = document.activeElement; if (!this.isModal) { this.updatePosition(); } this.focusFirstInput(); if (!this.isModal) { window.addEventListener("scroll", this.scrollEventCallBack); } }; PopupBaseViewModel.prototype.updateOnHiding = function () { this.prevActiveElement && this.prevActiveElement.focus(); if (!this.isModal) { window.removeEventListener("scroll", this.scrollEventCallBack); } }; PopupBaseViewModel.prototype.updatePosition = function () { var rect = this.targetElement.getBoundingClientRect(); var background = this.container.children[0]; var popupContainer = background.children[0]; var scrollContent = background.children[0].querySelector(".sv-popup__scrolling-content"); var height = popupContainer.offsetHeight - scrollContent.offsetHeight + scrollContent.scrollHeight; var width = popupContainer.offsetWidth; this.height = "auto"; var verticalPosition = this.model.verticalPosition; if (!!window) { height = Math.min(height, window.innerHeight * 0.9); verticalPosition = _utils_popup__WEBPACK_IMPORTED_MODULE_3__["PopupUtils"].updateVerticalPosition(rect, height, this.model.verticalPosition, this.model.showPointer, window.innerHeight); } this.popupDirection = _utils_popup__WEBPACK_IMPORTED_MODULE_3__["PopupUtils"].calculatePopupDirection(verticalPosition, this.model.horizontalPosition); var pos = _utils_popup__WEBPACK_IMPORTED_MODULE_3__["PopupUtils"].calculatePosition(rect, height, width, verticalPosition, this.model.horizontalPosition, this.showPointer); if (!!window) { var newVerticalDimensions = _utils_popup__WEBPACK_IMPORTED_MODULE_3__["PopupUtils"].updateVerticalDimensions(pos.top, height, window.innerHeight); if (!!newVerticalDimensions) { this.height = newVerticalDimensions.height + "px"; pos.top = newVerticalDimensions.top; } } this.left = pos.left + "px"; this.top = pos.top + "px"; if (this.showPointer) { this.pointerTarget = _utils_popup__WEBPACK_IMPORTED_MODULE_3__["PopupUtils"].calculatePointerTarget(rect, pos.top, pos.left, verticalPosition, this.model.horizontalPosition); } this.pointerTarget.top += "px"; this.pointerTarget.left += "px"; }; PopupBaseViewModel.prototype.focusFirstInput = function () { var _this = this; setTimeout(function () { var el = _this.container.querySelector(FOCUS_INPUT_SELECTOR); if (!!el) el.focus(); else _this.container.children[0].focus(); }, 100); }; PopupBaseViewModel.prototype.clickOutside = function () { if (this.isModal) { return; } this.hidePopup(); }; PopupBaseViewModel.prototype.cancel = function () { this.model.onCancel(); this.hidePopup(); }; PopupBaseViewModel.prototype.apply = function () { if (!!this.model.onApply && !this.model.onApply()) return; this.hidePopup(); }; Object.defineProperty(PopupBaseViewModel.prototype, "cancelButtonText", { get: function () { return _surveyStrings__WEBPACK_IMPORTED_MODULE_2__["surveyLocalization"].getString("modalCancelButtonText"); }, enumerable: false, configurable: true }); Object.defineProperty(PopupBaseViewModel.prototype, "applyButtonText", { get: function () { return _surveyStrings__WEBPACK_IMPORTED_MODULE_2__["surveyLocalization"].getString("modalApplyButtonText"); }, enumerable: false, configurable: true }); PopupBaseViewModel.prototype.dispose = function () { _super.prototype.dispose.call(this); this.model.onVisibilityChanged = undefined; }; PopupBaseViewModel.prototype.createPopupContainer = function () { var container = document.createElement("div"); this.container = container; }; PopupBaseViewModel.prototype.mountPopupContainer = function () { document.body.appendChild(this.container); }; PopupBaseViewModel.prototype.initializePopupContainer = function () { this.createPopupContainer(); this.mountPopupContainer(); }; PopupBaseViewModel.prototype.destroyPopupContainer = function () { this.container.remove(); this.container = undefined; }; __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__["property"])({ defaultValue: "0px" }) ], PopupBaseViewModel.prototype, "top", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__["property"])({ defaultValue: "0px" }) ], PopupBaseViewModel.prototype, "left", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__["property"])({ defaultValue: "auto" }) ], PopupBaseViewModel.prototype, "height", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__["property"])({ defaultValue: false }) ], PopupBaseViewModel.prototype, "isVisible", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__["property"])({ defaultValue: "left" }) ], PopupBaseViewModel.prototype, "popupDirection", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__["property"])({ defaultValue: { left: "0px", top: "0px" } }) ], PopupBaseViewModel.prototype, "pointerTarget", void 0); return PopupBaseViewModel; }(_base__WEBPACK_IMPORTED_MODULE_0__["Base"])); /***/ }), /***/ "./src/question.ts": /*!*************************!*\ !*** ./src/question.ts ***! \*************************/ /*! exports provided: Question */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Question", function() { return Question; }); /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers */ "./src/helpers.ts"); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _survey_element__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./survey-element */ "./src/survey-element.ts"); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./surveyStrings */ "./src/surveyStrings.ts"); /* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./error */ "./src/error.ts"); /* harmony import */ var _validator__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./validator */ "./src/validator.ts"); /* harmony import */ var _localizablestring__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./localizablestring */ "./src/localizablestring.ts"); /* harmony import */ var _conditions__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./conditions */ "./src/conditions.ts"); /* harmony import */ var _questionCustomWidgets__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./questionCustomWidgets */ "./src/questionCustomWidgets.ts"); /* harmony import */ var _settings__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./settings */ "./src/settings.ts"); /* harmony import */ var _rendererFactory__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./rendererFactory */ "./src/rendererFactory.ts"); /* harmony import */ var _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./utils/cssClassBuilder */ "./src/utils/cssClassBuilder.ts"); /* harmony import */ var _utils_utils__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./utils/utils */ "./src/utils/utils.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; /** * A base class for all questions. */ var Question = /** @class */ (function (_super) { __extends(Question, _super); function Question(name) { var _this = _super.call(this, name) || this; _this.conditionRunner = null; _this.customWidgetData = { isNeedRender: true }; _this.isReadyValue = true; /** * The event is fired when isReady property of question is changed. *
options.question - the question *
options.isReady - current value of isReady *
options.oldIsReady - old value of isReady */ _this.onReadyChanged = _this.addEvent(); _this.parentQuestionValue = null; _this.isRunningValidatorsValue = false; _this.isValueChangedInSurvey = false; _this.allowNotifyValueChanged = true; _this.id = Question.getQuestionId(); _this.onCreating(); _this.createNewArray("validators", function (validator) { validator.errorOwner = _this; }); var locCommentText = _this.createLocalizableString("commentText", _this, true); locCommentText.onGetTextCallback = function (text) { return !!text ? text : _surveyStrings__WEBPACK_IMPORTED_MODULE_3__["surveyLocalization"].getString("otherItemText"); }; _this.createLocalizableString("requiredErrorText", _this); _this.registerFunctionOnPropertyValueChanged("width", function () { _this.updateQuestionCss(); if (!!_this.parent) { _this.parent.elementWidthChanged(_this); } }); _this.registerFunctionOnPropertyValueChanged("isRequired", function () { _this.locTitle.onChanged(); _this.cssClassesValue = undefined; }); _this.registerFunctionOnPropertiesValueChanged(["indent", "rightIndent"], function () { _this.onIndentChanged(); }); _this.registerFunctionOnPropertiesValueChanged(["hasComment", "hasOther"], function () { _this.initCommentFromSurvey(); }); return _this; } Question.getQuestionId = function () { return "sq_" + Question.questionCounter++; }; Question.prototype.isReadOnlyRenderDiv = function () { return this.isReadOnly && _settings__WEBPACK_IMPORTED_MODULE_9__["settings"].readOnlyCommentRenderMode === "div"; }; Question.prototype.createLocTitleProperty = function () { var _this = this; var locTitleValue = _super.prototype.createLocTitleProperty.call(this); locTitleValue.onGetTextCallback = function (text) { if (!text) { text = _this.name; } if (!_this.survey) return text; return _this.survey.getUpdatedQuestionTitle(_this, text); }; this.locProcessedTitle = new _localizablestring__WEBPACK_IMPORTED_MODULE_6__["LocalizableString"](this, true); this.locProcessedTitle.sharedData = locTitleValue; return locTitleValue; }; Question.prototype.getSurvey = function (live) { if (live === void 0) { live = false; } if (live) { return !!this.parent ? this.parent.getSurvey(live) : null; } if (!!this.onGetSurvey) return this.onGetSurvey(); return _super.prototype.getSurvey.call(this); }; Question.prototype.getValueName = function () { if (!!this.valueName) return this.valueName.toString(); return this.name; }; Object.defineProperty(Question.prototype, "valueName", { /** * Use this property if you want to store the question result in the name different from the question name. * Question name should be unique in the survey and valueName could be not unique. It allows to share data between several questions with the same valueName. * The library set the value automatically if the question.name property is not valid. For example, if it contains the period '.' symbol. * In this case if you set the question.name property to 'x.y' then the valueName becomes 'x y'. * Please note, this property is hidden for questions without input, for example html question. * @see name */ get: function () { return this.getPropertyValue("valueName", ""); }, set: function (val) { var oldValueName = this.getValueName(); this.setPropertyValue("valueName", val); this.onValueNameChanged(oldValueName); }, enumerable: false, configurable: true }); Question.prototype.onValueNameChanged = function (oldValue) { if (!this.survey) return; this.survey.questionRenamed(this, this.name, !!oldValue ? oldValue : this.name); this.initDataFromSurvey(); }; Question.prototype.onNameChanged = function (oldValue) { this.locTitle.onChanged(); if (!this.survey) return; this.survey.questionRenamed(this, oldValue, this.valueName ? this.valueName : oldValue); }; Object.defineProperty(Question.prototype, "isReady", { get: function () { return this.isReadyValue; }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "ariaRequired", { /** * A11Y properties */ get: function () { return this.isRequired; }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "ariaLabel", { get: function () { return this.locTitle.renderedHtml; }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "ariaInvalid", { get: function () { return this.errors.length > 0; }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "ariaDescribedBy", { get: function () { return this.errors.length > 0 ? this.id + "_errors" : null; }, enumerable: false, configurable: true }); /** * Get is question ready to use */ Question.prototype.choicesLoaded = function () { }; Object.defineProperty(Question.prototype, "page", { /** * Get/set the page where the question is located. */ get: function () { return this.getPage(this.parent); }, set: function (val) { this.setPage(this.parent, val); }, enumerable: false, configurable: true }); Question.prototype.getPanel = function () { return null; }; Question.prototype.delete = function () { if (!!this.parent) { this.removeSelfFromList(this.parent.elements); } }; Object.defineProperty(Question.prototype, "isFlowLayout", { get: function () { return this.getLayoutType() === "flow"; }, enumerable: false, configurable: true }); Question.prototype.getLayoutType = function () { if (!!this.parent) return this.parent.getChildrenLayoutType(); return "row"; }; Question.prototype.isLayoutTypeSupported = function (layoutType) { return layoutType !== "flow"; }; Object.defineProperty(Question.prototype, "visible", { /** * Use it to get/set the question visibility. * @see visibleIf */ get: function () { return this.getPropertyValue("visible", true); }, set: function (val) { if (val == this.visible) return; this.setPropertyValue("visible", val); this.onVisibleChanged(); this.notifySurveyVisibilityChanged(); }, enumerable: false, configurable: true }); Question.prototype.onVisibleChanged = function () { this.setPropertyValue("isVisible", this.isVisible); if (this.isVisible && this.survey && this.survey.isClearValueOnHidden) { this.updateValueWithDefaults(); } if (!this.isVisible && this.errors && this.errors.length > 0) { this.errors = []; } }; Object.defineProperty(Question.prototype, "useDisplayValuesInTitle", { /** * Use it to choose how other question values will be rendered in title if referenced in {}. * Please note, this property is hidden for question without input, for example html question. */ get: function () { return this.getPropertyValue("useDisplayValuesInTitle"); }, set: function (val) { this.setPropertyValue("useDisplayValuesInTitle", val); }, enumerable: false, configurable: true }); Question.prototype.getUseDisplayValuesInTitle = function () { return this.useDisplayValuesInTitle; }; Object.defineProperty(Question.prototype, "visibleIf", { /** * An expression that returns true or false. If it returns true the Question becomes visible and if it returns false the Question becomes invisible. The library runs the expression on survey start and on changing a question value. If the property is empty then visible property is used. * @see visible */ get: function () { return this.getPropertyValue("visibleIf", ""); }, set: function (val) { this.setPropertyValue("visibleIf", val); this.runConditions(); }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "isVisible", { /** * Returns true if the question is visible or survey is in design mode right now. */ get: function () { if (this.survey && this.survey.areEmptyElementsHidden && this.isEmpty()) return false; return this.visible || this.areInvisibleElementsShowing; }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "visibleIndex", { /** * Returns the visible index of the question in the survey. It can be from 0 to all visible questions count - 1 * The visibleIndex is -1 if the title is 'hidden' or hideNumber is true * @see titleLocation * @see hideNumber */ get: function () { return this.getPropertyValue("visibleIndex", -1); }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "hideNumber", { /** * Set hideNumber to true to stop showing the number for this question. The question will not be counter * @see visibleIndex * @see titleLocation */ get: function () { return this.getPropertyValue("hideNumber"); }, set: function (val) { this.setPropertyValue("hideNumber", val); this.notifySurveyVisibilityChanged(); }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "isAllowTitleLeft", { /** * Returns true if the question may have a title located on the left */ get: function () { return true; }, enumerable: false, configurable: true }); /** * Returns the type of the object as a string as it represents in the json. */ Question.prototype.getType = function () { return "question"; }; Object.defineProperty(Question.prototype, "isQuestion", { get: function () { return true; }, enumerable: false, configurable: true }); /** * Move question to a new container Page/Panel. Add as a last element if insertBefore parameter is not used or inserted into the given index, * if insert parameter is number, or before the given element, if the insertBefore parameter is a question or panel * @param container Page or Panel to where a question is relocated. * @param insertBefore Use it if you want to set the question to a specific position. You may use a number (use 0 to insert int the beginning) or element, if you want to insert before this element. */ Question.prototype.moveTo = function (container, insertBefore) { if (insertBefore === void 0) { insertBefore = null; } return this.moveToBase(this.parent, container, insertBefore); }; Question.prototype.getProgressInfo = function () { if (!this.hasInput) return _super.prototype.getProgressInfo.call(this); return { questionCount: 1, answeredQuestionCount: !this.isEmpty() ? 1 : 0, requiredQuestionCount: this.isRequired ? 1 : 0, requiredAnsweredQuestionCount: !this.isEmpty() && this.isRequired ? 1 : 0, }; }; Question.prototype.runConditions = function () { if (this.data && !this.isLoadingFromJson) { if (!this.isDesignMode) { this.runCondition(this.getDataFilteredValues(), this.getDataFilteredProperties()); } this.locStrsChanged(); } }; Question.prototype.setSurveyImpl = function (value) { _super.prototype.setSurveyImpl.call(this, value); if (this.survey) { this.survey.questionCreated(this); } if (this.survey && this.survey.isDesignMode && !this.isDesignMode) { this.onVisibleChanged(); } this.runConditions(); }; Question.prototype.getDataFilteredValues = function () { return !!this.data ? this.data.getFilteredValues() : null; }; Question.prototype.getDataFilteredProperties = function () { var props = !!this.data ? this.data.getFilteredProperties() : {}; props.question = this; return props; }; Object.defineProperty(Question.prototype, "parent", { /** * A parent element. It can be panel or page. */ get: function () { return this.getPropertyValue("parent", null); }, set: function (val) { if (this.parent === val) return; this.delete(); this.setPropertyValue("parent", val); this.updateQuestionCss(); this.onParentChanged(); }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "parentQuestion", { /** * A parent question. It can be a dynamic panel or dynamic/dropdown matrices. If the value is a matrix, it means that question is a cell question. * This property is null for a stand alone question. */ get: function () { return this.parentQuestionValue; }, enumerable: false, configurable: true }); Question.prototype.setParentQuestion = function (val) { this.parentQuestionValue = val; this.onParentQuestionChanged(); }; Question.prototype.onParentQuestionChanged = function () { }; Question.prototype.onParentChanged = function () { }; Object.defineProperty(Question.prototype, "hasTitle", { /** * Returns false if the question doesn't have a title property, for example: QuestionHtmlModel, or titleLocation property equals to "hidden" * @see titleLocation */ get: function () { return this.getTitleLocation() !== "hidden"; }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "titleLocation", { /** * Set this property different from "default" to set the specific question title location for this panel/page. * Please note, this property is hidden for questions without input, for example html question. * @see SurveyModel.questionTitleLocation */ get: function () { return this.getPropertyValue("titleLocation"); }, set: function (value) { var isVisibilityChanged = this.titleLocation == "hidden" || value == "hidden"; this.setPropertyValue("titleLocation", value.toLowerCase()); this.updateQuestionCss(); if (isVisibilityChanged) { this.notifySurveyVisibilityChanged(); } }, enumerable: false, configurable: true }); Question.prototype.getTitleOwner = function () { return this; }; Question.prototype.notifySurveyVisibilityChanged = function () { if (!this.survey || this.isLoadingFromJson) return; this.survey.questionVisibilityChanged(this, this.isVisible); if (this.survey.isClearValueOnHidden && !this.visible) { this.clearValue(); } }; /** * Return the title location based on question titleLocation property and QuestionTitleLocation of it's parents * @see titleLocation * @see PanelModelBase.QuestionTitleLocation * @see SurveyModel.QuestionTitleLocation */ Question.prototype.getTitleLocation = function () { if (this.isFlowLayout) return "hidden"; var location = this.getTitleLocationCore(); if (location === "left" && !this.isAllowTitleLeft) location = "top"; return location; }; Question.prototype.getTitleLocationCore = function () { if (this.titleLocation !== "default") return this.titleLocation; if (!!this.parent) return this.parent.getQuestionTitleLocation(); if (!!this.survey) return this.survey.questionTitleLocation; return "top"; }; Object.defineProperty(Question.prototype, "hasTitleOnLeft", { get: function () { return this.hasTitle && this.getTitleLocation() === "left"; }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "hasTitleOnTop", { get: function () { return this.hasTitle && this.getTitleLocation() === "top"; }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "hasTitleOnBottom", { get: function () { return this.hasTitle && this.getTitleLocation() === "bottom"; }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "hasTitleOnLeftTop", { get: function () { if (!this.hasTitle) return false; var location = this.getTitleLocation(); return location === "left" || location === "top"; }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "errorLocation", { get: function () { return this.survey ? this.survey.questionErrorLocation : "top"; }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "hasInput", { /** * Returns false if the question doesn't have an input element, for example: QuestionHtmlModel * @see hasSingleInput */ get: function () { return true; }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "hasSingleInput", { /** * Returns false if the question doesn't have an input element or have multiple inputs: matrices or panel dynamic * @see hasInput */ get: function () { return this.hasInput; }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "inputId", { get: function () { return this.id + "i"; }, enumerable: false, configurable: true }); Question.prototype.getDefaultTitleValue = function () { return this.name; }; Question.prototype.getDefaultTitleTagName = function () { return _settings__WEBPACK_IMPORTED_MODULE_9__["settings"].titleTags.question; }; Object.defineProperty(Question.prototype, "descriptionLocation", { /** * Question description location. By default, value is "default" and it depends on survey questionDescriptionLocation property * You may change it to "underInput" to render it under question input or "underTitle" to rendered it under title. * @see description * @see Survey.questionDescriptionLocation */ get: function () { return this.getPropertyValue("descriptionLocation"); }, set: function (val) { this.setPropertyValue("descriptionLocation", val); }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "hasDescriptionUnderTitle", { get: function () { return this.getDescriptionLocation() == "underTitle"; }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "hasDescriptionUnderInput", { get: function () { return this.getDescriptionLocation() == "underInput"; }, enumerable: false, configurable: true }); Question.prototype.getDescriptionLocation = function () { if (this.descriptionLocation !== "default") return this.descriptionLocation; return !!this.survey ? this.survey.questionDescriptionLocation : "underTitle"; }; Object.defineProperty(Question.prototype, "clickTitleFunction", { get: function () { if (this.hasInput) { var self = this; return function () { if (self.isCollapsed) return; setTimeout(function () { self.focus(); }, 1); return true; }; } return undefined; }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "requiredErrorText", { /** * The custom text that will be shown on required error. Use this property, if you do not want to show the default text. * Please note, this property is hidden for question without input, for example html question. */ get: function () { return this.getLocalizableStringText("requiredErrorText"); }, set: function (val) { this.setLocalizableStringText("requiredErrorText", val); }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "locRequiredErrorText", { get: function () { return this.getLocalizableString("requiredErrorText"); }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "commentText", { /** * Use it to get or set the comment value. */ get: function () { return this.getLocalizableStringText("commentText", _surveyStrings__WEBPACK_IMPORTED_MODULE_3__["surveyLocalization"].getString("otherItemText")); }, set: function (val) { this.setLocalizableStringText("commentText", val); }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "locCommentText", { get: function () { return this.getLocalizableString("commentText"); }, enumerable: false, configurable: true }); /** * Returns a copy of question errors survey. For some questions like matrix and panel dynamic it includes the errors of nested questions. */ Question.prototype.getAllErrors = function () { return this.errors.slice(); }; Question.prototype.getErrorByType = function (errorType) { for (var i = 0; i < this.errors.length; i++) { if (this.errors[i].getErrorType() === errorType) return this.errors[i]; } return null; }; Object.defineProperty(Question.prototype, "customWidget", { /** * The link to the custom widget. */ get: function () { if (!this.isCustomWidgetRequested && !this.customWidgetValue) { this.isCustomWidgetRequested = true; this.updateCustomWidget(); } return this.customWidgetValue; }, enumerable: false, configurable: true }); Question.prototype.updateCustomWidget = function () { this.customWidgetValue = _questionCustomWidgets__WEBPACK_IMPORTED_MODULE_8__["CustomWidgetCollection"].Instance.getCustomWidget(this); }; Object.defineProperty(Question.prototype, "isCompositeQuestion", { get: function () { return false; }, enumerable: false, configurable: true }); Question.prototype.updateCommentElement = function () { if (this.commentElement && this.autoGrowComment) Object(_utils_utils__WEBPACK_IMPORTED_MODULE_12__["increaseHeightByContent"])(this.commentElement); }; Question.prototype.onCommentInput = function (event) { if (this.isInputTextUpdate) this.comment = event.target.value; else this.updateCommentElement(); }; Question.prototype.onCommentChange = function (event) { this.comment = event.target.value; if (this.comment !== event.target.value) { event.target.value = this.comment; } }; Question.prototype.afterRenderQuestionElement = function (el) { if (!this.survey || !this.hasSingleInput) return; this.survey.afterRenderQuestionInput(this, el); }; Question.prototype.afterRender = function (el) { if (!this.survey) return; this.survey.afterRenderQuestion(this, el); if (!!this.afterRenderQuestionCallback) { this.afterRenderQuestionCallback(this, el); } if (this.supportComment() || this.supportOther()) { this.commentElement = (document.getElementById(this.id) && document.getElementById(this.id).querySelector("textarea")) || null; this.updateCommentElement(); } }; Question.prototype.beforeDestroyQuestionElement = function (el) { }; Object.defineProperty(Question.prototype, "processedTitle", { /** * Returns the rendred question title. */ get: function () { var res = this.locProcessedTitle.textOrHtml; return res ? res : this.name; }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "fullTitle", { /** * Returns the title after processing the question template. * @see SurveyModel.questionTitleTemplate */ get: function () { return this.locTitle.renderedHtml; }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "titlePattern", { get: function () { return !!this.survey ? this.survey.questionTitlePattern : "numTitleRequire"; }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "isRequireTextOnStart", { get: function () { return this.isRequired && this.titlePattern == "requireNumTitle"; }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "isRequireTextBeforeTitle", { get: function () { return this.isRequired && this.titlePattern == "numRequireTitle"; }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "isRequireTextAfterTitle", { get: function () { return this.isRequired && this.titlePattern == "numTitleRequire"; }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "startWithNewLine", { /** * The Question renders on the new line if the property is true. If the property is false, the question tries to render on the same line/row with a previous question/panel. */ get: function () { return this.getPropertyValue("startWithNewLine"); }, set: function (val) { if (this.startWithNewLine == val) return; this.setPropertyValue("startWithNewLine", val); }, enumerable: false, configurable: true }); Question.prototype.calcCssClasses = function (css) { var classes = { error: {} }; this.copyCssClasses(classes, css.question); this.copyCssClasses(classes.error, css.error); this.updateCssClasses(classes, css); if (this.survey) { this.survey.updateQuestionCssClasses(this, classes); } return classes; }; Object.defineProperty(Question.prototype, "cssRoot", { get: function () { this.ensureElementCss(); return this.getPropertyValue("cssRoot", ""); }, enumerable: false, configurable: true }); Question.prototype.setCssRoot = function (val) { this.setPropertyValue("cssRoot", val); }; Question.prototype.getCssRoot = function (cssClasses) { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_11__["CssClassBuilder"]() .append(this.isFlowLayout && !this.isDesignMode ? cssClasses.flowRoot : cssClasses.mainRoot) .append(cssClasses.titleLeftRoot, !this.isFlowLayout && this.hasTitleOnLeft) .append(cssClasses.hasError, this.errors.length > 0) .append(cssClasses.small, !this.width) .append(cssClasses.answered, this.isAnswered) .toString(); }; Object.defineProperty(Question.prototype, "cssHeader", { get: function () { this.ensureElementCss(); return this.getPropertyValue("cssHeader", ""); }, enumerable: false, configurable: true }); Question.prototype.setCssHeader = function (val) { this.setPropertyValue("cssHeader", val); }; Question.prototype.getCssHeader = function (cssClasses) { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_11__["CssClassBuilder"]() .append(cssClasses.header) .append(cssClasses.headerTop, this.hasTitleOnTop) .append(cssClasses.headerLeft, this.hasTitleOnLeft) .append(cssClasses.headerBottom, this.hasTitleOnBottom) .toString(); }; Object.defineProperty(Question.prototype, "cssContent", { get: function () { this.ensureElementCss(); return this.getPropertyValue("cssContent", ""); }, enumerable: false, configurable: true }); Question.prototype.setCssContent = function (val) { this.setPropertyValue("cssContent", val); }; Question.prototype.getCssContent = function (cssClasses) { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_11__["CssClassBuilder"]() .append(cssClasses.content) .append(cssClasses.contentLeft, this.hasTitleOnLeft) .toString(); }; Object.defineProperty(Question.prototype, "cssTitle", { get: function () { this.ensureElementCss(); return this.getPropertyValue("cssTitle", ""); }, enumerable: false, configurable: true }); Question.prototype.setCssTitle = function (val) { this.setPropertyValue("cssTitle", val); }; Question.prototype.getCssTitle = function (cssClasses) { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_11__["CssClassBuilder"]() .append(cssClasses.title) .append(cssClasses.titleExpandable, this.isCollapsed || this.isExpanded) .append(cssClasses.titleOnError, this.containsErrors) .append(cssClasses.titleOnAnswer, !this.containsErrors && this.isAnswered) .toString(); }; Object.defineProperty(Question.prototype, "cssError", { get: function () { this.ensureElementCss(); return this.getPropertyValue("cssError", ""); }, enumerable: false, configurable: true }); Question.prototype.setCssError = function (val) { this.setPropertyValue("cssError", val); }; Question.prototype.getCssError = function (cssClasses) { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_11__["CssClassBuilder"]() .append(cssClasses.error.root) .append(cssClasses.error.locationTop, this.errorLocation === "top") .append(cssClasses.error.locationBottom, this.errorLocation === "bottom") .toString(); }; Question.prototype.getRootCss = function () { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_11__["CssClassBuilder"]() .append(this.cssRoot) .append(this.cssClasses.disabled, this.isReadOnly) .toString(); }; Question.prototype.updateElementCss = function (reNew) { this.cssClassesValue = undefined; if (reNew) { this.updateQuestionCss(true); } }; Question.prototype.updateQuestionCss = function (reNew) { if (this.isLoadingFromJson || !this.survey || (reNew !== true && !this.cssClassesValue)) return; this.updateElementCssCore(this.cssClasses); }; Question.prototype.ensureElementCss = function () { if (!this.cssClassesValue) { this.updateQuestionCss(true); } }; Question.prototype.updateElementCssCore = function (cssClasses) { this.setCssRoot(this.getCssRoot(cssClasses)); this.setCssHeader(this.getCssHeader(cssClasses)); this.setCssContent(this.getCssContent(cssClasses)); this.setCssTitle(this.getCssTitle(cssClasses)); this.setCssError(this.getCssError(cssClasses)); }; Question.prototype.updateCssClasses = function (res, css) { if (!css.question) return; var objCss = css[this.getCssType()]; var titleBuilder = new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_11__["CssClassBuilder"]().append(res.title) .append(css.question.titleRequired, this.isRequired); res.title = titleBuilder.toString(); var rootBuilder = new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_11__["CssClassBuilder"]().append(res.root) .append(objCss, this.isRequired && !!css.question.required); if (objCss === undefined || objCss === null) { res.root = rootBuilder.toString(); } else if (typeof objCss === "string" || objCss instanceof String) { res.root = rootBuilder.append(objCss.toString()).toString(); } else { res.root = rootBuilder.toString(); for (var key in objCss) { res[key] = objCss[key]; } } }; Question.prototype.getCssType = function () { return this.getType(); }; Object.defineProperty(Question.prototype, "width", { /** * Use it to set the specific width to the question like css style (%, px, em etc). */ get: function () { return this.getPropertyValue("width", ""); }, set: function (val) { this.setPropertyValue("width", val); }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "minWidth", { /** * Use it to set the specific minWidth constraint to the question like css style (%, px, em etc). */ get: function () { return this.getPropertyValue("minWidth"); }, set: function (val) { this.setPropertyValue("minWidth", val); }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "maxWidth", { /** * Use it to set the specific maxWidth constraint to the question like css style (%, px, em etc). */ get: function () { return this.getPropertyValue("maxWidth"); }, set: function (val) { this.setPropertyValue("maxWidth", val); }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "renderWidth", { /** * The rendered width of the question. */ get: function () { return this.getPropertyValue("renderWidth", ""); }, set: function (val) { this.setPropertyValue("renderWidth", val); }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "indent", { /** * Set it different from 0 to increase the left padding. */ get: function () { return this.getPropertyValue("indent"); }, set: function (val) { this.setPropertyValue("indent", val); }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "rightIndent", { /** * Set it different from 0 to increase the right padding. */ get: function () { return this.getPropertyValue("rightIndent", 0); }, set: function (val) { this.setPropertyValue("rightIndent", val); }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "paddingLeft", { get: function () { return this.getPropertyValue("paddintLeft", ""); }, set: function (val) { this.setPropertyValue("paddintLeft", val); }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "paddingRight", { get: function () { return this.getPropertyValue("paddingRight", ""); }, set: function (val) { this.setPropertyValue("paddingRight", val); }, enumerable: false, configurable: true }); Question.prototype.onIndentChanged = function () { this.paddingLeft = this.getIndentSize(this.indent); this.paddingRight = this.getIndentSize(this.rightIndent); }; Question.prototype.getIndentSize = function (indent) { if (indent < 1 || !this.getSurvey() || !this.cssClasses) return ""; return indent * this.cssClasses.indent + "px"; }; /** * Move the focus to the input of this question. * @param onError set this parameter to true, to focus the input with the first error, other wise the first input will be focused. */ Question.prototype.focus = function (onError) { if (onError === void 0) { onError = false; } if (this.isDesignMode) return; if (!!this.survey) { this.survey.scrollElementToTop(this, this, null, this.id); } var id = !onError ? this.getFirstInputElementId() : this.getFirstErrorInputElementId(); if (_survey_element__WEBPACK_IMPORTED_MODULE_2__["SurveyElement"].FocusElement(id)) { this.fireCallback(this.focusCallback); } }; Question.prototype.fireCallback = function (callback) { if (callback) callback(); }; Question.prototype.getOthersMaxLength = function () { if (!this.survey) return null; return this.survey.maxOthersLength > 0 ? this.survey.maxOthersLength : null; }; Question.prototype.onCreating = function () { }; Question.prototype.getFirstInputElementId = function () { return this.inputId; }; Question.prototype.getFirstErrorInputElementId = function () { return this.getFirstInputElementId(); }; Question.prototype.getProcessedTextValue = function (textValue) { var name = textValue.name.toLocaleLowerCase(); textValue.isExists = Object.keys(Question.TextPreprocessorValuesMap).indexOf(name) !== -1 || this[textValue.name] !== undefined; textValue.value = this[Question.TextPreprocessorValuesMap[name] || textValue.name]; }; Question.prototype.supportComment = function () { return false; }; Question.prototype.supportOther = function () { return false; }; Object.defineProperty(Question.prototype, "isRequired", { /** * Set this property to true, to make the question a required. If a user doesn't answer the question then a validation error will be generated. * Please note, this property is hidden for question without input, for example html question. */ get: function () { return this.getPropertyValue("isRequired", false); }, set: function (val) { this.setPropertyValue("isRequired", val); }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "requiredIf", { /** * An expression that returns true or false. If it returns true the Question becomes required and an end-user has to answer it. * If it returns false the Question then an end-user may not answer it the Question maybe empty. * The library runs the expression on survey start and on changing a question value. If the property is empty then isRequired property is used. * Please note, this property is hidden for question without input, for example html question. * @see isRequired */ get: function () { return this.getPropertyValue("requiredIf", ""); }, set: function (val) { this.setPropertyValue("requiredIf", val); this.runConditions(); }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "hasComment", { /** * Set it to true, to add a comment for the question. */ get: function () { return this.getPropertyValue("hasComment", false); }, set: function (val) { if (!this.supportComment()) return; this.setPropertyValue("hasComment", val); if (this.hasComment) this.hasOther = false; }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "id", { /** * The unique identificator. It is generated automatically. */ get: function () { return this.getPropertyValue("id"); }, set: function (val) { this.setPropertyValue("id", val); }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "ariaTitleId", { get: function () { return this.id + "_ariaTitle"; }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "ariaRole", { get: function () { return null; }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "hasOther", { get: function () { return this.getPropertyValue("hasOther", false); }, set: function (val) { if (!this.supportOther() || this.hasOther == val) return; this.setPropertyValue("hasOther", val); if (this.hasOther) this.hasComment = false; this.hasOtherChanged(); }, enumerable: false, configurable: true }); Question.prototype.hasOtherChanged = function () { }; Object.defineProperty(Question.prototype, "requireUpdateCommentValue", { get: function () { return this.hasComment || this.hasOther; }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "isReadOnly", { /** * Returns true if readOnly property is true or survey is in display mode or parent panel/page is readOnly. * @see SurveyModel.model * @see readOnly */ get: function () { var isParentReadOnly = !!this.parent && this.parent.isReadOnly; var isSurveyReadOnly = !!this.survey && this.survey.isDisplayMode; return this.readOnly || isParentReadOnly || isSurveyReadOnly; }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "isInputReadOnly", { get: function () { var isDesignModeV2 = _settings__WEBPACK_IMPORTED_MODULE_9__["settings"].supportCreatorV2 && this.isDesignMode; return this.isReadOnly || isDesignModeV2; }, enumerable: false, configurable: true }); Question.prototype.onReadOnlyChanged = function () { this.setPropertyValue("isInputReadOnly", this.isInputReadOnly); _super.prototype.onReadOnlyChanged.call(this); }; Object.defineProperty(Question.prototype, "enableIf", { /** * An expression that returns true or false. If it returns false the Question becomes read only and an end-user will not able to answer on the qustion. The library runs the expression on survey start and on changing a question value. If the property is empty then readOnly property is used. * Please note, this property is hidden for question without input, for example html question. * @see readOnly * @see isReadOnly */ get: function () { return this.getPropertyValue("enableIf", ""); }, set: function (val) { this.setPropertyValue("enableIf", val); this.runConditions(); }, enumerable: false, configurable: true }); /** * Run visibleIf and enableIf expressions. If visibleIf or/and enabledIf are not empty, then the results of performing the expression (true or false) set to the visible/readOnly properties. * @param values Typically survey results * @see visible * @see visibleIf * @see readOnly * @see enableIf */ Question.prototype.runCondition = function (values, properties) { if (this.isDesignMode) return; if (!properties) properties = {}; properties["question"] = this; if (!this.areInvisibleElementsShowing) { this.runVisibleIfCondition(values, properties); } this.runEnableIfCondition(values, properties); this.runRequiredIfCondition(values, properties); }; Question.prototype.runVisibleIfCondition = function (values, properties) { var _this = this; if (!this.visibleIf) return; if (!this.conditionRunner) this.conditionRunner = new _conditions__WEBPACK_IMPORTED_MODULE_7__["ConditionRunner"](this.visibleIf); this.conditionRunner.expression = this.visibleIf; this.conditionRunner.onRunComplete = function (res) { _this.visible = res; }; this.conditionRunner.run(values, properties); }; Question.prototype.runEnableIfCondition = function (values, properties) { var _this = this; if (!this.enableIf) return; if (!this.conditionEnabelRunner) this.conditionEnabelRunner = new _conditions__WEBPACK_IMPORTED_MODULE_7__["ConditionRunner"](this.enableIf); this.conditionEnabelRunner.expression = this.enableIf; this.conditionEnabelRunner.onRunComplete = function (res) { _this.readOnly = !res; }; this.conditionEnabelRunner.run(values, properties); }; Question.prototype.runRequiredIfCondition = function (values, properties) { var _this = this; if (!this.requiredIf) return; if (!this.conditionRequiredRunner) this.conditionRequiredRunner = new _conditions__WEBPACK_IMPORTED_MODULE_7__["ConditionRunner"](this.requiredIf); this.conditionRequiredRunner.expression = this.requiredIf; this.conditionRequiredRunner.onRunComplete = function (res) { _this.isRequired = res; }; this.conditionRequiredRunner.run(values, properties); }; Object.defineProperty(Question.prototype, "no", { /** * The property returns the question number. If question is invisible then it returns empty string. * If visibleIndex is 1, then no is 2, or 'B' if survey.questionStartIndex is 'A'. * @see SurveyModel.questionStartIndex */ get: function () { return this.getPropertyValue("no"); }, enumerable: false, configurable: true }); Question.prototype.calcNo = function () { if (!this.hasTitle || this.hideNumber) return ""; var no = _helpers__WEBPACK_IMPORTED_MODULE_0__["Helpers"].getNumberByIndex(this.visibleIndex, this.getStartIndex()); if (!!this.survey) { no = this.survey.getUpdatedQuestionNo(this, no); } return no; }; Question.prototype.getStartIndex = function () { if (!!this.parent) return this.parent.getQuestionStartIndex(); if (!!this.survey) return this.survey.questionStartIndex; return ""; }; Question.prototype.onSurveyLoad = function () { this.fireCallback(this.surveyLoadCallback); this.updateValueWithDefaults(); }; Question.prototype.onSetData = function () { _super.prototype.onSetData.call(this); if (!this.survey) return; this.initDataFromSurvey(); this.onSurveyValueChanged(this.value); this.updateValueWithDefaults(); this.onIndentChanged(); this.updateQuestionCss(); this.updateIsAnswered(); }; Question.prototype.initDataFromSurvey = function () { if (!!this.data) { var val = this.data.getValue(this.getValueName()); if (!_helpers__WEBPACK_IMPORTED_MODULE_0__["Helpers"].isValueEmpty(val) || !this.isLoadingFromJson) { this.updateValueFromSurvey(val); } this.initCommentFromSurvey(); } }; Question.prototype.initCommentFromSurvey = function () { if (!!this.data && this.requireUpdateCommentValue) { this.updateCommentFromSurvey(this.data.getComment(this.getValueName())); } else { this.updateCommentFromSurvey(""); } }; Question.prototype.runExpression = function (expression) { if (!this.survey || !expression) return undefined; return this.survey.runExpression(expression); }; Object.defineProperty(Question.prototype, "autoGrowComment", { get: function () { return this.survey && this.survey.autoGrowComment; }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "questionValue", { get: function () { return this.getPropertyValue("value"); }, set: function (val) { this.setPropertyValue("value", val); }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "questionComment", { get: function () { return this.getPropertyValue("comment"); }, set: function (val) { this.setPropertyValue("comment", val); this.fireCallback(this.commentChangedCallback); }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "value", { /** * Get/Set the question value. * @see SurveyMode.setValue * @see SurveyMode.getValue */ get: function () { return this.getValueCore(); }, set: function (newValue) { this.setNewValue(newValue); }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "valueForSurvey", { get: function () { if (!!this.valueToDataCallback) { return this.valueToDataCallback(this.value); } return this.value; }, enumerable: false, configurable: true }); /** * Clear the question value. It clears the question comment as well. */ Question.prototype.clearValue = function () { if (this.value !== undefined) { this.value = undefined; } this.comment = undefined; }; Question.prototype.unbindValue = function () { this.clearValue(); }; Question.prototype.createValueCopy = function () { return this.getUnbindValue(this.value); }; Question.prototype.getUnbindValue = function (value) { if (this.isValueSurveyElement(value)) return value; return _helpers__WEBPACK_IMPORTED_MODULE_0__["Helpers"].getUnbindValue(value); }; Question.prototype.isValueSurveyElement = function (val) { if (!val) return false; if (Array.isArray(val)) return val.length > 0 ? this.isValueSurveyElement(val[0]) : false; return !!val.getType && !!val.onPropertyChanged; }; Question.prototype.canClearValueAsInvisible = function () { if (this.isVisible && this.isParentVisible) return false; if (!!this.page && this.page.isStarted) return false; if (!this.survey || !this.valueName) return true; return !this.survey.hasVisibleQuestionByValueName(this.valueName); }; Object.defineProperty(Question.prototype, "isParentVisible", { get: function () { var parent = this.parent; while (parent) { if (!parent.isVisible) return false; parent = parent.parent; } return true; }, enumerable: false, configurable: true }); Question.prototype.clearValueIfInvisible = function () { if (this.canClearValueAsInvisible()) { this.clearValue(); } }; Object.defineProperty(Question.prototype, "displayValue", { get: function () { if (this.isLoadingFromJson) return ""; return this.getDisplayValue(true); }, enumerable: false, configurable: true }); /** * Return the question value as a display text. For example, for dropdown, it would return the item text instead of item value. * @param keysAsText Set this value to true, to return key (in matrices questions) as display text as well. * @param value use this parameter, if you want to get display value for this value and not question.value. It is undefined by default. */ Question.prototype.getDisplayValue = function (keysAsText, value) { if (value === void 0) { value = undefined; } var res = this.calcDisplayValue(keysAsText, value); return !!this.displayValueCallback ? this.displayValueCallback(res) : res; }; Question.prototype.calcDisplayValue = function (keysAsText, value) { if (value === void 0) { value = undefined; } if (this.customWidget) { var res = this.customWidget.getDisplayValue(this, value); if (res) return res; } value = value == undefined ? this.createValueCopy() : value; if (this.isValueEmpty(value)) return this.getDisplayValueEmpty(); return this.getDisplayValueCore(keysAsText, value); }; Question.prototype.getDisplayValueCore = function (keyAsText, value) { return value; }; Question.prototype.getDisplayValueEmpty = function () { return ""; }; Object.defineProperty(Question.prototype, "defaultValue", { /** * Set the default value to the question. It will be assign to the question on loading the survey from JSON or adding a question to the survey or on setting this property of the value is empty. * Please note, this property is hidden for question without input, for example html question. */ get: function () { return this.getPropertyValue("defaultValue"); }, set: function (val) { if (this.isValueExpression(val)) { this.defaultValueExpression = val.substr(1); return; } this.setPropertyValue("defaultValue", this.convertDefaultValue(val)); this.updateValueWithDefaults(); }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "defaultValueExpression", { get: function () { return this.getPropertyValue("defaultValueExpression"); }, set: function (val) { this.setPropertyValue("defaultValueExpression", val); this.updateValueWithDefaults(); }, enumerable: false, configurable: true }); /** * Returns question answer data as a plain object: with question title, name, value and displayValue. * For complex questions (like matrix, etc.) isNode flag is set to true and data contains array of nested objects (rows) * set options.includeEmpty to false if you want to skip empty answers */ Question.prototype.getPlainData = function (options) { var _this = this; if (options === void 0) { options = { includeEmpty: true, includeQuestionTypes: false, }; } if (options.includeEmpty || !this.isEmpty()) { var questionPlainData = { name: this.name, title: this.locTitle.renderedHtml, value: this.value, displayValue: this.displayValue, isNode: false, getString: function (val) { return typeof val === "object" ? JSON.stringify(val) : val; }, }; if (options.includeQuestionTypes === true) { questionPlainData.questionType = this.getType(); } (options.calculations || []).forEach(function (calculation) { questionPlainData[calculation.propertyName] = _this[calculation.propertyName]; }); if (this.hasComment) { questionPlainData.isNode = true; questionPlainData.data = [ { name: 0, isComment: true, title: "Comment", value: _settings__WEBPACK_IMPORTED_MODULE_9__["settings"].commentPrefix, displayValue: this.comment, getString: function (val) { return typeof val === "object" ? JSON.stringify(val) : val; }, isNode: false, }, ]; } return questionPlainData; } return undefined; }; Object.defineProperty(Question.prototype, "correctAnswer", { /** * The correct answer on the question. Set this value if you are doing a quiz. * Please note, this property is hidden for question without input, for example html question. * @see SurveyModel.correctAnswers * @see SurveyModel.inCorrectAnswers */ get: function () { return this.getPropertyValue("correctAnswer"); }, set: function (val) { this.setPropertyValue("correctAnswer", this.convertDefaultValue(val)); }, enumerable: false, configurable: true }); Question.prototype.convertDefaultValue = function (val) { return val; }; Object.defineProperty(Question.prototype, "quizQuestionCount", { /** * Returns questions count: 1 for the non-matrix questions and all inner visible questions that has input(s) widgets for question of matrix types. * @see getQuizQuestions */ get: function () { if (this.isVisible && this.hasInput && !this.isValueEmpty(this.correctAnswer)) return this.getQuizQuestionCount(); return 0; }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "correctAnswerCount", { get: function () { if (!this.isEmpty() && !this.isValueEmpty(this.correctAnswer)) return this.getCorrectAnswerCount(); return 0; }, enumerable: false, configurable: true }); Question.prototype.getQuizQuestionCount = function () { return 1; }; Question.prototype.getCorrectAnswerCount = function () { return this.isTwoValueEquals(this.value, this.correctAnswer, true, true) ? 1 : 0; }; Question.prototype.isAnswerCorrect = function () { return this.correctAnswerCount == this.quizQuestionCount; }; Question.prototype.updateValueWithDefaults = function () { if (this.isLoadingFromJson || (!this.isDesignMode && this.isDefaultValueEmpty())) return; if (!this.isDesignMode && !this.isEmpty()) return; if (this.isEmpty() && this.isDefaultValueEmpty()) return; if (!!this.survey && this.survey.isClearValueOnHidden && !this.isVisible) return; this.setDefaultValue(); }; Question.prototype.getQuestionFromArray = function (name, index) { return null; }; Question.prototype.getDefaultValue = function () { return this.defaultValue; }; Question.prototype.isDefaultValueEmpty = function () { return !this.defaultValueExpression && this.isValueEmpty(this.defaultValue); }; Question.prototype.setDefaultValue = function () { var _this = this; this.setValueAndRunExpression(this.defaultValueExpression, this.getUnbindValue(this.defaultValue), function (val) { _this.value = val; }); }; Question.prototype.isValueExpression = function (val) { return !!val && typeof val == "string" && val.length > 0 && val[0] == "="; }; Question.prototype.setValueAndRunExpression = function (expression, defaultValue, setFunc, values, properties) { var _this = this; if (values === void 0) { values = null; } if (properties === void 0) { properties = null; } var func = function (val) { if (val instanceof Date) { val = val.toISOString().slice(0, 10); } setFunc(val); }; if (!!expression && !!this.data) { if (!values) values = this.data.getFilteredValues(); if (!properties) properties = this.data.getFilteredProperties(); var runner = new _conditions__WEBPACK_IMPORTED_MODULE_7__["ExpressionRunner"](expression); if (runner.canRun) { runner.onRunComplete = function (res) { if (res == undefined) res = _this.defaultValue; func(res); }; runner.run(values, properties); } } else { func(defaultValue); } }; Object.defineProperty(Question.prototype, "comment", { /** * The question comment value. */ get: function () { return this.getQuestionComment(); }, set: function (newValue) { if (!!newValue) { var trimmedValue = newValue.toString().trim(); if (trimmedValue !== newValue) { newValue = trimmedValue; if (newValue === this.comment) { this.setPropertyValueDirectly("comment", newValue); } } } if (this.comment == newValue) return; this.setQuestionComment(newValue); this.updateCommentElement(); }, enumerable: false, configurable: true }); Question.prototype.getQuestionComment = function () { return this.questionComment; }; Question.prototype.setQuestionComment = function (newValue) { this.setNewComment(newValue); }; /** * Returns true if the question value is empty */ Question.prototype.isEmpty = function () { return this.isValueEmpty(this.value); }; Object.defineProperty(Question.prototype, "isAnswered", { get: function () { return this.getPropertyValue("isAnswered"); }, set: function (val) { this.setPropertyValue("isAnswered", val); }, enumerable: false, configurable: true }); Question.prototype.updateIsAnswered = function () { this.setPropertyValue("isAnswered", this.getIsAnswered()); }; Question.prototype.getIsAnswered = function () { return !this.isEmpty(); }; Object.defineProperty(Question.prototype, "validators", { /** * The list of question validators. * Please note, this property is hidden for question without input, for example html question. */ get: function () { return this.getPropertyValue("validators"); }, set: function (val) { this.setPropertyValue("validators", val); }, enumerable: false, configurable: true }); Question.prototype.getValidators = function () { return this.validators; }; Question.prototype.getSupportedValidators = function () { var res = []; var className = this.getType(); while (!!className) { var classValidators = _settings__WEBPACK_IMPORTED_MODULE_9__["settings"].supportedValidators[className]; if (!!classValidators) { for (var i = classValidators.length - 1; i >= 0; i--) { res.splice(0, 0, classValidators[i]); } } var classInfo = _jsonobject__WEBPACK_IMPORTED_MODULE_1__["Serializer"].findClass(className); className = classInfo.parentName; } return res; }; Question.prototype.addSupportedValidators = function (supportedValidators, classValidators) { }; Question.prototype.addConditionObjectsByContext = function (objects, context) { objects.push({ name: this.getValueName(), text: this.processedTitle, question: this, }); }; Question.prototype.getConditionJson = function (operator, path) { if (operator === void 0) { operator = null; } if (path === void 0) { path = null; } var json = new _jsonobject__WEBPACK_IMPORTED_MODULE_1__["JsonObject"]().toJsonObject(this); json["type"] = this.getType(); return json; }; /** * Returns true if there is a validation error(s) in the question. * @param fireCallback set it to true to show an error in UI. */ Question.prototype.hasErrors = function (fireCallback, rec) { if (fireCallback === void 0) { fireCallback = true; } if (rec === void 0) { rec = null; } var oldHasErrors = this.errors.length > 0; var errors = this.checkForErrors(!!rec && rec.isOnValueChanged === true); if (fireCallback) { if (!!this.survey) { this.survey.beforeSettingQuestionErrors(this, errors); } this.errors = errors; } this.updateContainsErrors(); if (oldHasErrors != errors.length > 0) { this.updateQuestionCss(); } if (this.isCollapsed && rec && fireCallback && errors.length > 0) { this.expand(); } return errors.length > 0; }; Object.defineProperty(Question.prototype, "currentErrorCount", { /** * Returns the validation errors count. */ get: function () { return this.errors.length; }, enumerable: false, configurable: true }); Object.defineProperty(Question.prototype, "requiredText", { /** * Returns the char/string for a required question. * @see SurveyModel.requiredText */ get: function () { return this.survey != null && this.isRequired ? this.survey.requiredText : ""; }, enumerable: false, configurable: true }); /** * Add error into the question error list. * @param error */ Question.prototype.addError = function (error) { if (!error) return; var newError = null; if (typeof error === "string" || error instanceof String) { newError = new _error__WEBPACK_IMPORTED_MODULE_4__["CustomError"](error, this.survey); } else { newError = error; } this.errors.push(newError); }; /** * Remove a particular error from the question error list. * @param error */ Question.prototype.removeError = function (error) { var errors = this.errors; var index = errors.indexOf(error); if (index !== -1) errors.splice(index, 1); }; Question.prototype.checkForErrors = function (isOnValueChanged) { var qErrors = new Array(); if (this.isVisible && this.canCollectErrors()) { this.collectErrors(qErrors, isOnValueChanged); } return qErrors; }; Question.prototype.canCollectErrors = function () { return !this.isReadOnly; }; Question.prototype.collectErrors = function (qErrors, isOnValueChanged) { this.onCheckForErrors(qErrors, isOnValueChanged); if (qErrors.length > 0 || !this.canRunValidators(isOnValueChanged)) return; var errors = this.runValidators(); if (errors.length > 0) { //validators may change the question value. qErrors.length = 0; for (var i = 0; i < errors.length; i++) { qErrors.push(errors[i]); } } if (this.survey && qErrors.length == 0) { var error = this.fireSurveyValidation(); if (error) { qErrors.push(error); } } }; Question.prototype.canRunValidators = function (isOnValueChanged) { return true; }; Question.prototype.fireSurveyValidation = function () { if (this.validateValueCallback) return this.validateValueCallback(); return this.survey ? this.survey.validateQuestion(this) : null; }; Question.prototype.onCheckForErrors = function (errors, isOnValueChanged) { if (!isOnValueChanged && this.hasRequiredError()) { errors.push(new _error__WEBPACK_IMPORTED_MODULE_4__["AnswerRequiredError"](this.requiredErrorText, this)); } }; Question.prototype.hasRequiredError = function () { return this.isRequired && this.isEmpty(); }; Object.defineProperty(Question.prototype, "isRunningValidators", { get: function () { return this.getIsRunningValidators(); }, enumerable: false, configurable: true }); Question.prototype.getIsRunningValidators = function () { return this.isRunningValidatorsValue; }; Question.prototype.runValidators = function () { var _this = this; if (!!this.validatorRunner) { this.validatorRunner.onAsyncCompleted = null; } this.validatorRunner = new _validator__WEBPACK_IMPORTED_MODULE_5__["ValidatorRunner"](); this.isRunningValidatorsValue = true; this.validatorRunner.onAsyncCompleted = function (errors) { _this.doOnAsyncCompleted(errors); }; return this.validatorRunner.run(this); }; Question.prototype.doOnAsyncCompleted = function (errors) { for (var i = 0; i < errors.length; i++) { this.errors.push(errors[i]); } this.isRunningValidatorsValue = false; this.raiseOnCompletedAsyncValidators(); }; Question.prototype.raiseOnCompletedAsyncValidators = function () { if (!!this.onCompletedAsyncValidators && !this.isRunningValidators) { this.onCompletedAsyncValidators(this.getAllErrors().length > 0); this.onCompletedAsyncValidators = null; } }; Question.prototype.setNewValue = function (newValue) { var oldAnswered = this.isAnswered; this.setNewValueInData(newValue); this.allowNotifyValueChanged && this.onValueChanged(); if (this.isAnswered != oldAnswered) { this.updateQuestionCss(); } }; Question.prototype.isTextValue = function () { return false; }; Object.defineProperty(Question.prototype, "isSurveyInputTextUpdate", { get: function () { return !!this.survey ? this.survey.isUpdateValueTextOnTyping : false; }, enumerable: false, configurable: true }); Question.prototype.getDataLocNotification = function () { return this.isInputTextUpdate ? "text" : false; }; Object.defineProperty(Question.prototype, "isInputTextUpdate", { get: function () { return this.isSurveyInputTextUpdate && this.isTextValue(); }, enumerable: false, configurable: true }); Question.prototype.setNewValueInData = function (newValue) { newValue = this.valueToData(newValue); if (!this.isValueChangedInSurvey) { this.setValueCore(newValue); } }; Question.prototype.getValueCore = function () { return this.questionValue; }; Question.prototype.setValueCore = function (newValue) { this.setQuestionValue(newValue); if (this.data != null && this.canSetValueToSurvey()) { newValue = this.valueForSurvey; this.data.setValue(this.getValueName(), newValue, this.getDataLocNotification(), this.allowNotifyValueChanged); } }; Question.prototype.canSetValueToSurvey = function () { return true; }; Question.prototype.valueFromData = function (val) { return val; }; Question.prototype.valueToData = function (val) { return val; }; Question.prototype.onValueChanged = function () { }; Question.prototype.setNewComment = function (newValue) { this.questionComment = newValue; if (this.data != null) { this.data.setComment(this.getValueName(), newValue, this.isSurveyInputTextUpdate ? "text" : false); } }; Question.prototype.getValidName = function (name) { if (!name) return name; return name.trim().replace(/[\{\}]+/g, ""); }; //IQuestion Question.prototype.updateValueFromSurvey = function (newValue) { newValue = this.getUnbindValue(newValue); if (!!this.valueFromDataCallback) { newValue = this.valueFromDataCallback(newValue); } this.setQuestionValue(this.valueFromData(newValue)); }; Question.prototype.updateCommentFromSurvey = function (newValue) { this.questionComment = newValue; }; Question.prototype.setQuestionValue = function (newValue, updateIsAnswered) { if (updateIsAnswered === void 0) { updateIsAnswered = true; } var isEqual = this.isTwoValueEquals(this.questionValue, newValue); this.questionValue = newValue; !isEqual && this.allowNotifyValueChanged && this.fireCallback(this.valueChangedCallback); if (updateIsAnswered) this.updateIsAnswered(); }; Question.prototype.onSurveyValueChanged = function (newValue) { }; Question.prototype.setVisibleIndex = function (val) { if (!this.isVisible || (!this.hasTitle && !_settings__WEBPACK_IMPORTED_MODULE_9__["settings"].setQuestionVisibleIndexForHiddenTitle) || (this.hideNumber && !_settings__WEBPACK_IMPORTED_MODULE_9__["settings"].setQuestionVisibleIndexForHiddenNumber)) { val = -1; } this.setPropertyValue("visibleIndex", val); this.setPropertyValue("no", this.calcNo()); return val < 0 ? 0 : 1; }; Question.prototype.removeElement = function (element) { return false; }; Question.prototype.supportGoNextPageAutomatic = function () { return false; }; Question.prototype.supportGoNextPageError = function () { return true; }; /** * Call this function to remove values from the current question, that end-user will not be able to enter. * For example the value that doesn't exists in a radigroup/dropdown/checkbox choices or matrix rows/columns. */ Question.prototype.clearIncorrectValues = function () { }; Question.prototype.clearOnDeletingContainer = function () { }; /** * Call this function to clear all errors in the question */ Question.prototype.clearErrors = function () { this.errors = []; }; Question.prototype.clearUnusedValues = function () { }; Question.prototype.onAnyValueChanged = function (name) { }; Question.prototype.checkBindings = function (valueName, value) { if (this.bindings.isEmpty() || !this.data) return; var props = this.bindings.getPropertiesByValueName(valueName); for (var i = 0; i < props.length; i++) { this[props[i]] = value; } }; Question.prototype.getComponentName = function () { return _rendererFactory__WEBPACK_IMPORTED_MODULE_10__["RendererFactory"].Instance.getRendererByQuestion(this); }; Question.prototype.isDefaultRendering = function () { return (!!this.customWidget || this.renderAs === "default" || this.getComponentName() === "default"); }; //ISurveyErrorOwner Question.prototype.getErrorCustomText = function (text, error) { if (!!this.survey) return this.survey.getErrorCustomText(text, error); return text; }; //IValidatorOwner Question.prototype.getValidatorTitle = function () { return null; }; Object.defineProperty(Question.prototype, "validatedValue", { get: function () { return this.value; }, set: function (val) { this.value = val; }, enumerable: false, configurable: true }); Question.prototype.getAllValues = function () { return !!this.data ? this.data.getAllValues() : null; }; Question.TextPreprocessorValuesMap = { title: "processedTitle", require: "requiredText", }; Question.questionCounter = 100; __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__["property"])({ defaultValue: "default" }) ], Question.prototype, "renderAs", void 0); return Question; }(_survey_element__WEBPACK_IMPORTED_MODULE_2__["SurveyElement"])); _jsonobject__WEBPACK_IMPORTED_MODULE_1__["Serializer"].addClass("question", [ "!name", { name: "state", default: "default", choices: ["default", "collapsed", "expanded"], }, { name: "visible:switch", default: true }, { name: "useDisplayValuesInTitle:boolean", default: true, layout: "row" }, "visibleIf:condition", { name: "width" }, { name: "minWidth", default: _settings__WEBPACK_IMPORTED_MODULE_9__["settings"].minWidth }, { name: "maxWidth", default: _settings__WEBPACK_IMPORTED_MODULE_9__["settings"].maxWidth }, { name: "startWithNewLine:boolean", default: true, layout: "row" }, { name: "indent:number", default: 0, choices: [0, 1, 2, 3], layout: "row" }, { name: "page", isSerializable: false, visibleIf: function (obj) { var survey = obj ? obj.survey : null; return !survey || survey.pages.length > 1; }, choices: function (obj) { var survey = obj ? obj.survey : null; return survey ? survey.pages.map(function (p) { return { value: p.name, text: p.title }; }) : []; }, }, { name: "title:text", serializationProperty: "locTitle", layout: "row" }, { name: "titleLocation", default: "default", choices: ["default", "top", "bottom", "left", "hidden"], layout: "row", }, { name: "description:text", serializationProperty: "locDescription", layout: "row", }, { name: "descriptionLocation", default: "default", choices: ["default", "underInput", "underTitle"], }, { name: "hideNumber:boolean", dependsOn: "titleLocation", visibleIf: function (obj) { if (!obj) { return true; } if (obj.titleLocation === "hidden") { return false; } var parent = obj ? obj.parent : null; var numberingAllowedByParent = !parent || parent.showQuestionNumbers !== "off"; if (!numberingAllowedByParent) { return false; } var survey = obj ? obj.survey : null; return (!survey || survey.showQuestionNumbers !== "off" || (!!parent && parent.showQuestionNumbers === "onpanel")); }, }, "valueName", "enableIf:condition", "defaultValue:value", { name: "defaultValueExpression:expression", category: "logic", }, "correctAnswer:value", "isRequired:switch", "requiredIf:condition", { name: "requiredErrorText:text", serializationProperty: "locRequiredErrorText", }, "readOnly:switch", { name: "validators:validators", baseClassName: "surveyvalidator", classNamePart: "validator", }, { name: "bindings:bindings", serializationProperty: "bindings", visibleIf: function (obj) { return obj.bindings.getNames().length > 0; }, }, { name: "renderAs", default: "default", visible: false }, ]); _jsonobject__WEBPACK_IMPORTED_MODULE_1__["Serializer"].addAlterNativeClassName("question", "questionbase"); /***/ }), /***/ "./src/questionCustomWidgets.ts": /*!**************************************!*\ !*** ./src/questionCustomWidgets.ts ***! \**************************************/ /*! exports provided: QuestionCustomWidget, CustomWidgetCollection */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionCustomWidget", function() { return QuestionCustomWidget; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CustomWidgetCollection", function() { return CustomWidgetCollection; }); /* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base */ "./src/base.ts"); var QuestionCustomWidget = /** @class */ (function () { function QuestionCustomWidget(name, widgetJson) { this.name = name; this.widgetJson = widgetJson; this.isFirstRender = true; this.htmlTemplate = widgetJson.htmlTemplate ? widgetJson.htmlTemplate : ""; } QuestionCustomWidget.prototype.afterRender = function (question, el) { var _this = this; if (this.isFirstRender) { this.isFirstRender = false; question.survey.onLocaleChangedEvent.add(function () { _this.widgetJson.willUnmount(question, el); _this.widgetJson.afterRender(question, el); }); } if (this.widgetJson.afterRender) this.widgetJson.afterRender(question, el); }; QuestionCustomWidget.prototype.willUnmount = function (question, el) { if (this.widgetJson.willUnmount) this.widgetJson.willUnmount(question, el); }; QuestionCustomWidget.prototype.getDisplayValue = function (question, value) { if (value === void 0) { value = undefined; } if (this.widgetJson.getDisplayValue) return this.widgetJson.getDisplayValue(question, value); return null; }; QuestionCustomWidget.prototype.isFit = function (question) { if (this.isLibraryLoaded() && this.widgetJson.isFit) return this.widgetJson.isFit(question); return false; }; Object.defineProperty(QuestionCustomWidget.prototype, "canShowInToolbox", { get: function () { if (this.widgetJson.showInToolbox === false) return false; if (CustomWidgetCollection.Instance.getActivatedBy(this.name) != "customtype") return false; return !this.widgetJson.widgetIsLoaded || this.widgetJson.widgetIsLoaded(); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionCustomWidget.prototype, "showInToolbox", { get: function () { return this.widgetJson.showInToolbox !== false; }, set: function (val) { this.widgetJson.showInToolbox = val; }, enumerable: false, configurable: true }); QuestionCustomWidget.prototype.init = function () { if (this.widgetJson.init) { this.widgetJson.init(); } }; QuestionCustomWidget.prototype.activatedByChanged = function (activatedBy) { if (this.isLibraryLoaded() && this.widgetJson.activatedByChanged) { this.widgetJson.activatedByChanged(activatedBy); } }; QuestionCustomWidget.prototype.isLibraryLoaded = function () { if (this.widgetJson.widgetIsLoaded) return this.widgetJson.widgetIsLoaded() == true; return true; }; Object.defineProperty(QuestionCustomWidget.prototype, "isDefaultRender", { get: function () { return this.widgetJson.isDefaultRender; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionCustomWidget.prototype, "pdfQuestionType", { get: function () { return this.widgetJson.pdfQuestionType; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionCustomWidget.prototype, "pdfRender", { get: function () { return this.widgetJson.pdfRender; }, enumerable: false, configurable: true }); return QuestionCustomWidget; }()); var CustomWidgetCollection = /** @class */ (function () { function CustomWidgetCollection() { this.widgetsValues = []; this.widgetsActivatedBy = {}; this.onCustomWidgetAdded = new _base__WEBPACK_IMPORTED_MODULE_0__["Event"](); } Object.defineProperty(CustomWidgetCollection.prototype, "widgets", { get: function () { return this.widgetsValues; }, enumerable: false, configurable: true }); CustomWidgetCollection.prototype.add = function (widgetJson, activatedBy) { if (activatedBy === void 0) { activatedBy = "property"; } this.addCustomWidget(widgetJson, activatedBy); }; CustomWidgetCollection.prototype.addCustomWidget = function (widgetJson, activatedBy) { if (activatedBy === void 0) { activatedBy = "property"; } var name = widgetJson.name; if (!name) { name = "widget_" + this.widgets.length + 1; } var customWidget = new QuestionCustomWidget(name, widgetJson); this.widgetsValues.push(customWidget); customWidget.init(); this.widgetsActivatedBy[name] = activatedBy; customWidget.activatedByChanged(activatedBy); this.onCustomWidgetAdded.fire(customWidget, null); return customWidget; }; /** * Returns the way the custom wiget is activated. It can be activated by a property ("property"), question type ("type") or by new/custom question type ("customtype"). * @param widgetName the custom widget name * @see setActivatedBy */ CustomWidgetCollection.prototype.getActivatedBy = function (widgetName) { var res = this.widgetsActivatedBy[widgetName]; return res ? res : "property"; }; /** * Sets the way the custom wiget is activated. The activation types are: property ("property"), question type ("type") or new/custom question type ("customtype"). A custom wiget may support all or only some of this activation types. * @param widgetName * @param activatedBy there are three possible variants: "property", "type" and "customtype" */ CustomWidgetCollection.prototype.setActivatedBy = function (widgetName, activatedBy) { if (!widgetName || !activatedBy) return; var widget = this.getCustomWidgetByName(widgetName); if (!widget) return; this.widgetsActivatedBy[widgetName] = activatedBy; widget.activatedByChanged(activatedBy); }; CustomWidgetCollection.prototype.clear = function () { this.widgetsValues = []; }; CustomWidgetCollection.prototype.getCustomWidgetByName = function (name) { for (var i = 0; i < this.widgets.length; i++) { if (this.widgets[i].name == name) return this.widgets[i]; } return null; }; CustomWidgetCollection.prototype.getCustomWidget = function (question) { for (var i = 0; i < this.widgetsValues.length; i++) { if (this.widgetsValues[i].isFit(question)) return this.widgetsValues[i]; } return null; }; CustomWidgetCollection.Instance = new CustomWidgetCollection(); return CustomWidgetCollection; }()); /***/ }), /***/ "./src/question_baseselect.ts": /*!************************************!*\ !*** ./src/question_baseselect.ts ***! \************************************/ /*! exports provided: QuestionSelectBase, QuestionCheckboxBase */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionSelectBase", function() { return QuestionSelectBase; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionCheckboxBase", function() { return QuestionCheckboxBase; }); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _survey__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./survey */ "./src/survey.ts"); /* harmony import */ var _question__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./question */ "./src/question.ts"); /* harmony import */ var _itemvalue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./itemvalue */ "./src/itemvalue.ts"); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./surveyStrings */ "./src/surveyStrings.ts"); /* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./error */ "./src/error.ts"); /* harmony import */ var _choicesRestful__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./choicesRestful */ "./src/choicesRestful.ts"); /* harmony import */ var _conditions__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./conditions */ "./src/conditions.ts"); /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./helpers */ "./src/helpers.ts"); /* harmony import */ var _settings__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./settings */ "./src/settings.ts"); /* harmony import */ var _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./utils/cssClassBuilder */ "./src/utils/cssClassBuilder.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); /** * It is a base class for checkbox, dropdown and radiogroup questions. */ var QuestionSelectBase = /** @class */ (function (_super) { __extends(QuestionSelectBase, _super); function QuestionSelectBase(name) { var _this = _super.call(this, name) || this; _this.otherItemValue = new _itemvalue__WEBPACK_IMPORTED_MODULE_3__["ItemValue"]("other"); _this.dependedQuestions = []; _this.noneItemValue = new _itemvalue__WEBPACK_IMPORTED_MODULE_3__["ItemValue"]("none"); _this.isSettingDefaultValue = false; _this.isSettingComment = false; _this.isRunningChoices = false; _this.isFirstLoadChoicesFromUrl = true; _this.isUpdatingChoicesDependedQuestions = false; var noneItemText = _this.createLocalizableString("noneText", _this, true); noneItemText.onGetTextCallback = function (text) { return !!text ? text : _surveyStrings__WEBPACK_IMPORTED_MODULE_4__["surveyLocalization"].getString("noneItemText"); }; _this.noneItemValue.locOwner = _this; _this.noneItemValue.setLocText(noneItemText); _this.createItemValues("choices"); _this.registerFunctionOnPropertyValueChanged("choices", function () { if (!_this.filterItems()) { _this.onVisibleChoicesChanged(); } }); _this.registerFunctionOnPropertiesValueChanged(["choicesFromQuestion", "choicesFromQuestionMode", "hasNone"], function () { _this.onVisibleChoicesChanged(); }); _this.registerFunctionOnPropertyValueChanged("hideIfChoicesEmpty", function () { _this.updateVisibilityBasedOnChoices(); }); _this.createNewArray("visibleChoices"); _this.setNewRestfulProperty(); var locOtherText = _this.createLocalizableString("otherText", _this, true); _this.createLocalizableString("otherErrorText", _this, true); _this.otherItemValue.locOwner = _this; _this.otherItemValue.setLocText(locOtherText); locOtherText.onGetTextCallback = function (text) { return !!text ? text : _surveyStrings__WEBPACK_IMPORTED_MODULE_4__["surveyLocalization"].getString("otherItemText"); }; _this.choicesByUrl.createItemValue = function (value) { return _this.createItemValue(value); }; _this.choicesByUrl.beforeSendRequestCallback = function () { _this.onBeforeSendRequest(); }; _this.choicesByUrl.getResultCallback = function (items) { _this.onLoadChoicesFromUrl(items); }; _this.choicesByUrl.updateResultCallback = function (items, serverResult) { if (_this.survey) { return _this.survey.updateChoicesFromServer(_this, items, serverResult); } return items; }; _this.createLocalizableString("otherPlaceHolder", _this); return _this; } QuestionSelectBase.prototype.getType = function () { return "selectbase"; }; QuestionSelectBase.prototype.dispose = function () { _super.prototype.dispose.call(this); for (var i = 0; i < this.dependedQuestions.length; i++) { this.dependedQuestions[i].choicesFromQuestion = ""; } this.removeFromDependedQuestion(this.getQuestionWithChoices()); }; QuestionSelectBase.prototype.getItemValueType = function () { return "itemvalue"; }; QuestionSelectBase.prototype.createItemValue = function (value) { return _jsonobject__WEBPACK_IMPORTED_MODULE_0__["Serializer"].createClass(this.getItemValueType(), value); }; QuestionSelectBase.prototype.supportGoNextPageError = function () { return !this.isOtherSelected || !!this.comment; }; QuestionSelectBase.prototype.isLayoutTypeSupported = function (layoutType) { return true; }; QuestionSelectBase.prototype.localeChanged = function () { _super.prototype.localeChanged.call(this); if (this.choicesOrder !== "none") { this.updateVisibleChoices(); } }; QuestionSelectBase.prototype.locStrsChanged = function () { _super.prototype.locStrsChanged.call(this); if (!!this.choicesFromUrl) { _itemvalue__WEBPACK_IMPORTED_MODULE_3__["ItemValue"].locStrsChanged(this.choicesFromUrl); _itemvalue__WEBPACK_IMPORTED_MODULE_3__["ItemValue"].locStrsChanged(this.visibleChoices); } }; Object.defineProperty(QuestionSelectBase.prototype, "otherItem", { /** * Returns the other item. By using this property, you may change programmatically it's value and text. * @see hasOther */ get: function () { return this.otherItemValue; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionSelectBase.prototype, "isOtherSelected", { /** * Returns true if a user select the 'other' item. */ get: function () { return this.hasOther && this.getHasOther(this.renderedValue); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionSelectBase.prototype, "hasNone", { /** * Set this property to true, to show the "None" item on the bottom. If end-user checks this item, all other items would be unchecked. */ get: function () { return this.getPropertyValue("hasNone", false); }, set: function (val) { this.setPropertyValue("hasNone", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionSelectBase.prototype, "noneItem", { /** * Returns the none item. By using this property, you may change programmatically it's value and text. * @see hasNone */ get: function () { return this.noneItemValue; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionSelectBase.prototype, "noneText", { /** * Use this property to set the different text for none item. */ get: function () { return this.getLocalizableStringText("noneText", _surveyStrings__WEBPACK_IMPORTED_MODULE_4__["surveyLocalization"].getString("noneItemText")); }, set: function (val) { this.setLocalizableStringText("noneText", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionSelectBase.prototype, "locNoneText", { get: function () { return this.getLocalizableString("noneText"); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionSelectBase.prototype, "choicesVisibleIf", { /** * An expression that returns true or false. It runs against each choices item and if for this item it returns true, then the item is visible otherwise the item becomes invisible. Please use {item} to get the current item value in the expression. * @see visibleIf * @see choicesEnableIf */ get: function () { return this.getPropertyValue("choicesVisibleIf", ""); }, set: function (val) { this.setPropertyValue("choicesVisibleIf", val); this.filterItems(); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionSelectBase.prototype, "choicesEnableIf", { /** * An expression that returns true or false. It runs against each choices item and if for this item it returns true, then the item is enabled otherwise the item becomes disabled. Please use {item} to get the current item value in the expression. * @see choicesVisibleIf */ get: function () { return this.getPropertyValue("choicesEnableIf", ""); }, set: function (val) { this.setPropertyValue("choicesEnableIf", val); this.filterItems(); }, enumerable: false, configurable: true }); QuestionSelectBase.prototype.runCondition = function (values, properties) { _super.prototype.runCondition.call(this, values, properties); this.runItemsEnableCondition(values, properties); this.runItemsCondition(values, properties); }; QuestionSelectBase.prototype.isTextValue = function () { return true; //for comments and others }; QuestionSelectBase.prototype.setDefaultValue = function () { this.isSettingDefaultValue = !this.isValueEmpty(this.defaultValue) && this.hasUnknownValue(this.defaultValue); this.prevCommentValue = undefined; _super.prototype.setDefaultValue.call(this); this.isSettingDefaultValue = false; }; QuestionSelectBase.prototype.getIsMultipleValue = function () { return false; }; QuestionSelectBase.prototype.convertDefaultValue = function (val) { if (val == null || val == undefined) return val; if (this.getIsMultipleValue()) { if (!Array.isArray(val)) return [val]; } else { if (Array.isArray(val) && val.length > 0) return val[0]; } return val; }; QuestionSelectBase.prototype.filterItems = function () { if (this.isLoadingFromJson || !this.data || this.areInvisibleElementsShowing) return false; var values = this.getDataFilteredValues(); var properties = this.getDataFilteredProperties(); this.runItemsEnableCondition(values, properties); return this.runItemsCondition(values, properties); }; QuestionSelectBase.prototype.runItemsCondition = function (values, properties) { this.setConditionalChoicesRunner(); var hasChanges = this.runConditionsForItems(values, properties); if (!!this.filteredChoicesValue && this.filteredChoicesValue.length === this.activeChoices.length) { this.filteredChoicesValue = undefined; } if (hasChanges) { this.onVisibleChoicesChanged(); this.clearIncorrectValues(); } return hasChanges; }; QuestionSelectBase.prototype.runItemsEnableCondition = function (values, properties) { var _this = this; this.setConditionalEnableChoicesRunner(); var hasChanged = _itemvalue__WEBPACK_IMPORTED_MODULE_3__["ItemValue"].runEnabledConditionsForItems(this.activeChoices, this.conditionChoicesEnableIfRunner, values, properties, function (item) { return _this.onEnableItemCallBack(item); }); if (hasChanged) { this.clearDisabledValues(); } this.onAfterRunItemsEnableCondition(); }; QuestionSelectBase.prototype.onAfterRunItemsEnableCondition = function () { }; QuestionSelectBase.prototype.onEnableItemCallBack = function (item) { return true; }; QuestionSelectBase.prototype.setConditionalChoicesRunner = function () { if (this.choicesVisibleIf) { if (!this.conditionChoicesVisibleIfRunner) { this.conditionChoicesVisibleIfRunner = new _conditions__WEBPACK_IMPORTED_MODULE_7__["ConditionRunner"](this.choicesVisibleIf); } this.conditionChoicesVisibleIfRunner.expression = this.choicesVisibleIf; } else { this.conditionChoicesVisibleIfRunner = null; } }; QuestionSelectBase.prototype.setConditionalEnableChoicesRunner = function () { if (this.choicesEnableIf) { if (!this.conditionChoicesEnableIfRunner) { this.conditionChoicesEnableIfRunner = new _conditions__WEBPACK_IMPORTED_MODULE_7__["ConditionRunner"](this.choicesEnableIf); } this.conditionChoicesEnableIfRunner.expression = this.choicesEnableIf; } else { this.conditionChoicesEnableIfRunner = null; } }; QuestionSelectBase.prototype.runConditionsForItems = function (values, properties) { this.filteredChoicesValue = []; return _itemvalue__WEBPACK_IMPORTED_MODULE_3__["ItemValue"].runConditionsForItems(this.activeChoices, this.getFilteredChoices(), this.areInvisibleElementsShowing ? null : this.conditionChoicesVisibleIfRunner, values, properties, !this.survey || !this.survey.areInvisibleElementsShowing); }; QuestionSelectBase.prototype.getHasOther = function (val) { return val === this.otherItem.value; }; Object.defineProperty(QuestionSelectBase.prototype, "validatedValue", { get: function () { return this.rendredValueToDataCore(this.value); }, enumerable: false, configurable: true }); QuestionSelectBase.prototype.createRestful = function () { return new _choicesRestful__WEBPACK_IMPORTED_MODULE_6__["ChoicesRestful"](); }; QuestionSelectBase.prototype.setNewRestfulProperty = function () { this.setPropertyValue("choicesByUrl", this.createRestful()); this.choicesByUrl.owner = this; this.choicesByUrl.loadingOwner = this; }; QuestionSelectBase.prototype.getQuestionComment = function () { if (!!this.commentValue) return this.commentValue; if (this.hasComment || this.getStoreOthersAsComment()) return _super.prototype.getQuestionComment.call(this); return this.commentValue; }; QuestionSelectBase.prototype.setQuestionComment = function (newValue) { if (this.hasComment || this.getStoreOthersAsComment()) _super.prototype.setQuestionComment.call(this, newValue); else { if (!this.isSettingComment && newValue != this.commentValue) { this.isSettingComment = true; this.commentValue = newValue; if (this.isOtherSelected && !this.isRenderedValueSetting) { this.value = this.rendredValueToData(this.renderedValue); } this.isSettingComment = false; } } }; QuestionSelectBase.prototype.clearValue = function () { _super.prototype.clearValue.call(this); this.prevCommentValue = undefined; }; QuestionSelectBase.prototype.updateCommentFromSurvey = function (newValue) { _super.prototype.updateCommentFromSurvey.call(this, newValue); this.prevCommentValue = undefined; }; Object.defineProperty(QuestionSelectBase.prototype, "renderedValue", { get: function () { return this.getPropertyValue("renderedValue", null); }, set: function (val) { this.setPropertyValue("renderedValue", val); var val = this.rendredValueToData(val); if (!this.isTwoValueEquals(val, this.value)) { this.value = val; } }, enumerable: false, configurable: true }); QuestionSelectBase.prototype.setQuestionValue = function (newValue, updateIsAnswered, updateComment) { if (updateIsAnswered === void 0) { updateIsAnswered = true; } if (updateComment === void 0) { updateComment = true; } if (this.isLoadingFromJson || this.isTwoValueEquals(this.value, newValue)) return; _super.prototype.setQuestionValue.call(this, newValue, updateIsAnswered); this.setPropertyValue("renderedValue", this.rendredValueFromData(newValue)); if (this.hasComment || !updateComment) return; var isOtherSel = this.isOtherSelected; if (isOtherSel && !!this.prevCommentValue) { var oldComment = this.prevCommentValue; this.prevCommentValue = undefined; this.comment = oldComment; } if (!isOtherSel && !!this.comment) { if (this.getStoreOthersAsComment()) { this.prevCommentValue = this.comment; } this.comment = ""; } }; QuestionSelectBase.prototype.setNewValue = function (newValue) { newValue = this.valueFromData(newValue); if ((!this.choicesByUrl.isRunning && !this.choicesByUrl.isWaitingForParameters) || !this.isValueEmpty(newValue)) { this.cachedValueForUrlRequests = newValue; } _super.prototype.setNewValue.call(this, newValue); }; QuestionSelectBase.prototype.valueFromData = function (val) { var choiceitem = _itemvalue__WEBPACK_IMPORTED_MODULE_3__["ItemValue"].getItemByValue(this.activeChoices, val); if (!!choiceitem) { return choiceitem.value; } return _super.prototype.valueFromData.call(this, val); }; QuestionSelectBase.prototype.rendredValueFromData = function (val) { if (this.getStoreOthersAsComment()) return val; return this.renderedValueFromDataCore(val); }; QuestionSelectBase.prototype.rendredValueToData = function (val) { if (this.getStoreOthersAsComment()) return val; return this.rendredValueToDataCore(val); }; QuestionSelectBase.prototype.renderedValueFromDataCore = function (val) { if (!this.hasUnknownValue(val, true, false)) return this.valueFromData(val); this.comment = val; return this.otherItem.value; }; QuestionSelectBase.prototype.rendredValueToDataCore = function (val) { if (val == this.otherItem.value && this.getQuestionComment()) { val = this.getQuestionComment(); } return val; }; QuestionSelectBase.prototype.hasUnknownValue = function (val, includeOther, isFilteredChoices, checkEmptyValue) { if (includeOther === void 0) { includeOther = false; } if (isFilteredChoices === void 0) { isFilteredChoices = true; } if (checkEmptyValue === void 0) { checkEmptyValue = false; } if (!checkEmptyValue && this.isValueEmpty(val)) return false; if (includeOther && val == this.otherItem.value) return false; if (this.hasNone && val == this.noneItem.value) return false; var choices = isFilteredChoices ? this.getFilteredChoices() : this.activeChoices; return _itemvalue__WEBPACK_IMPORTED_MODULE_3__["ItemValue"].getItemByValue(choices, val) == null; }; QuestionSelectBase.prototype.isValueDisabled = function (val) { var itemValue = _itemvalue__WEBPACK_IMPORTED_MODULE_3__["ItemValue"].getItemByValue(this.getFilteredChoices(), val); return !!itemValue && !itemValue.isEnabled; }; Object.defineProperty(QuestionSelectBase.prototype, "choicesByUrl", { /** * Use this property to fill the choices from a RESTful service. * @see choices * @see ChoicesRestful * @see [Example: RESTful Dropdown](https://surveyjs.io/Examples/Library/?id=questiontype-dropdownrestfull) * @see [Docs: Fill Choices from a RESTful Service](https://surveyjs.io/Documentation/Library/?id=LibraryOverview#fill-the-choices-from-a-restful-service) */ get: function () { return this.getPropertyValue("choicesByUrl"); }, set: function (val) { if (!val) return; this.setNewRestfulProperty(); this.choicesByUrl.fromJSON(val.toJSON()); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionSelectBase.prototype, "choices", { /** * The list of items. Every item has value and text. If text is empty, the value is rendered. The item text supports markdown. * @see choicesByUrl * @see choicesFromQuestion */ get: function () { return this.getPropertyValue("choices"); }, set: function (newValue) { this.setPropertyValue("choices", newValue); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionSelectBase.prototype, "choicesFromQuestion", { /** * Set this property to get choices from the specified question instead of defining them in the current question. This avoids duplication of choices declaration in your survey definition. * By setting this property, the "choices", "choicesVisibleIf", "choicesEnableIf" and "choicesOrder" properties become invisible, because these question characteristics depend on actions in another (specified) question. * Use the `choicesFromQuestionMode` property to filter choices obtained from the specified question. * @see choices * @see choicesFromQuestionMode */ get: function () { return this.getPropertyValue("choicesFromQuestion"); }, set: function (val) { var question = this.getQuestionWithChoices(); if (!!question) { question.removeFromDependedQuestion(this); } this.setPropertyValue("choicesFromQuestion", val); }, enumerable: false, configurable: true }); QuestionSelectBase.prototype.addIntoDependedQuestion = function (question) { if (!question || question.dependedQuestions.indexOf(this) > -1) return; question.dependedQuestions.push(this); }; QuestionSelectBase.prototype.removeFromDependedQuestion = function (question) { if (!question) return; var index = question.dependedQuestions.indexOf(this); if (index > -1) { question.dependedQuestions.splice(index, 1); } }; Object.defineProperty(QuestionSelectBase.prototype, "choicesFromQuestionMode", { /** * This property becomes visible when the `choicesFromQuestion` property is selected. The default value is "all" (all visible choices from another question are displayed as they are). * You can set this property to "selected" or "unselected" to display only selected or unselected choices from the specified question. * @see choicesFromQuestion */ get: function () { return this.getPropertyValue("choicesFromQuestionMode"); }, set: function (val) { this.setPropertyValue("choicesFromQuestionMode", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionSelectBase.prototype, "hideIfChoicesEmpty", { /** * Set this property to true to hide the question if there is no visible choices. */ get: function () { return this.getPropertyValue("hideIfChoicesEmpty", false); }, set: function (val) { this.setPropertyValue("hideIfChoicesEmpty", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionSelectBase.prototype, "keepIncorrectValues", { get: function () { return this.getPropertyValue("keepIncorrectValues", false); }, set: function (val) { this.setPropertyValue("keepIncorrectValues", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionSelectBase.prototype, "storeOthersAsComment", { /** * Please use survey.storeOthersAsComment to change the behavior on the survey level. This property is depricated and invisible in Survey Creator. * By default the entered text in the others input in the checkbox/radiogroup/dropdown are stored as "question name " + "-Comment". The value itself is "question name": "others". Set this property to false, to store the entered text directly in the "question name" key. * Possible values are: "default", true, false * @see SurveyModel.storeOthersAsComment */ get: function () { return this.getPropertyValue("storeOthersAsComment"); }, set: function (val) { this.setPropertyValue("storeOthersAsComment", val); }, enumerable: false, configurable: true }); QuestionSelectBase.prototype.hasOtherChanged = function () { this.onVisibleChoicesChanged(); }; Object.defineProperty(QuestionSelectBase.prototype, "choicesOrder", { /** * Use this property to render items in a specific order: "asc", "desc", "random". Default value is "none". */ get: function () { return this.getPropertyValue("choicesOrder"); }, set: function (val) { val = val.toLowerCase(); if (val == this.choicesOrder) return; this.setPropertyValue("choicesOrder", val); this.onVisibleChoicesChanged(); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionSelectBase.prototype, "otherText", { /** * Use this property to set the different text for other item. */ get: function () { return this.getLocalizableStringText("otherText", _surveyStrings__WEBPACK_IMPORTED_MODULE_4__["surveyLocalization"].getString("otherItemText")); }, set: function (val) { this.setLocalizableStringText("otherText", val); this.onVisibleChoicesChanged(); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionSelectBase.prototype, "locOtherText", { get: function () { return this.getLocalizableString("otherText"); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionSelectBase.prototype, "otherPlaceHolder", { /** * Use this property to set the place holder text for other or comment field . */ get: function () { return this.getLocalizableStringText("otherPlaceHolder"); }, set: function (val) { this.setLocalizableStringText("otherPlaceHolder", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionSelectBase.prototype, "locOtherPlaceHolder", { get: function () { return this.getLocalizableString("otherPlaceHolder"); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionSelectBase.prototype, "otherErrorText", { /** * The text that shows when the other item is choosed by the other input is empty. */ get: function () { return this.getLocalizableStringText("otherErrorText", _surveyStrings__WEBPACK_IMPORTED_MODULE_4__["surveyLocalization"].getString("otherRequiredError")); }, set: function (val) { this.setLocalizableStringText("otherErrorText", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionSelectBase.prototype, "locOtherErrorText", { get: function () { return this.getLocalizableString("otherErrorText"); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionSelectBase.prototype, "visibleChoices", { /** * The list of items as they will be rendered. If needed items are sorted and the other item is added. * @see hasOther * @see choicesOrder * @see enabledChoices */ get: function () { return this.getPropertyValue("visibleChoices"); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionSelectBase.prototype, "enabledChoices", { /** * The list of enabled items as they will be rendered. The disabled items are not included * @see hasOther * @see choicesOrder * @see visibleChoices */ get: function () { var res = []; var items = this.visibleChoices; for (var i = 0; i < items.length; i++) { if (items[i].isEnabled) res.push(items[i]); } return res; }, enumerable: false, configurable: true }); QuestionSelectBase.prototype.updateVisibleChoices = function () { if (this.isLoadingFromJson) return; var newValue = new Array(); var calcValue = this.calcVisibleChoices(); if (!calcValue) calcValue = []; for (var i = 0; i < calcValue.length; i++) { newValue.push(calcValue[i]); } this.setPropertyValue("visibleChoices", newValue); }; QuestionSelectBase.prototype.calcVisibleChoices = function () { if (this.canUseFilteredChoices()) return this.getFilteredChoices(); var res = this.sortVisibleChoices(this.getFilteredChoices().slice()); this.addToVisibleChoices(res, this.isAddDefaultItems); return res; }; QuestionSelectBase.prototype.canUseFilteredChoices = function () { return (!this.isAddDefaultItems && !this.hasNone && !this.hasOther && this.choicesOrder == "none"); }; QuestionSelectBase.prototype.setCanShowOptionItemCallback = function (func) { this.canShowOptionItemCallback = func; if (!!func) { this.onVisibleChoicesChanged(); } }; QuestionSelectBase.prototype.addToVisibleChoices = function (items, isAddAll) { if (isAddAll) { if (!this.newItemValue) { this.newItemValue = new _itemvalue__WEBPACK_IMPORTED_MODULE_3__["ItemValue"]("newitem"); //TODO } if (this.canShowOptionItem(this.newItemValue)) { items.push(this.newItemValue); } } if (this.supportOther() && ((isAddAll && this.canShowOptionItem(this.otherItem)) || this.hasOther)) { items.push(this.otherItem); } if (this.supportNone() && ((isAddAll && this.canShowOptionItem(this.noneItem)) || this.hasNone)) { items.push(this.noneItem); } }; QuestionSelectBase.prototype.canShowOptionItem = function (item) { if (!this.canShowOptionItemCallback) return true; return this.canShowOptionItemCallback(item); }; /** * For internal use in SurveyJS Creator V2. */ QuestionSelectBase.prototype.isItemInList = function (item) { if (item === this.otherItem) return this.hasOther; if (item === this.noneItem) return this.hasNone; if (item === this.newItemValue) return false; return true; }; Object.defineProperty(QuestionSelectBase.prototype, "isAddDefaultItems", { get: function () { return (_settings__WEBPACK_IMPORTED_MODULE_9__["settings"].supportCreatorV2 && this.isDesignMode && !this.parentQuestion); }, enumerable: false, configurable: true }); QuestionSelectBase.prototype.getPlainData = function (options) { var _this = this; if (options === void 0) { options = { includeEmpty: true, includeQuestionTypes: false, }; } var questionPlainData = _super.prototype.getPlainData.call(this, options); if (!!questionPlainData) { var values = Array.isArray(this.value) ? this.value : [this.value]; questionPlainData.isNode = true; questionPlainData.data = (questionPlainData.data || []).concat(values.map(function (dataValue, index) { var choice = _itemvalue__WEBPACK_IMPORTED_MODULE_3__["ItemValue"].getItemByValue(_this.visibleChoices, dataValue); var choiceDataItem = { name: index, title: "Choice", value: dataValue, displayValue: _this.getChoicesDisplayValue(_this.visibleChoices, dataValue), getString: function (val) { return typeof val === "object" ? JSON.stringify(val) : val; }, isNode: false, }; if (!!choice) { (options.calculations || []).forEach(function (calculation) { choiceDataItem[calculation.propertyName] = choice[calculation.propertyName]; }); } if (_this.isOtherSelected && _this.otherItemValue === choice) { choiceDataItem.isOther = true; choiceDataItem.displayValue = _this.comment; } return choiceDataItem; })); } return questionPlainData; }; /** * Returns the text for the current value. If the value is null then returns empty string. If 'other' is selected then returns the text for other value. */ QuestionSelectBase.prototype.getDisplayValueCore = function (keysAsText, value) { return this.getChoicesDisplayValue(this.visibleChoices, value); }; QuestionSelectBase.prototype.getDisplayValueEmpty = function () { return _itemvalue__WEBPACK_IMPORTED_MODULE_3__["ItemValue"].getTextOrHtmlByValue(this.visibleChoices, undefined); }; QuestionSelectBase.prototype.getChoicesDisplayValue = function (items, val) { if (val == this.otherItemValue.value) return this.comment ? this.comment : this.locOtherText.textOrHtml; var str = _itemvalue__WEBPACK_IMPORTED_MODULE_3__["ItemValue"].getTextOrHtmlByValue(items, val); return str == "" && val ? val : str; }; QuestionSelectBase.prototype.getFilteredChoices = function () { return this.filteredChoicesValue ? this.filteredChoicesValue : this.activeChoices; }; Object.defineProperty(QuestionSelectBase.prototype, "activeChoices", { get: function () { var question = this.getQuestionWithChoices(); if (!!question) { this.addIntoDependedQuestion(question); return this.getChoicesFromQuestion(question); } return this.choicesFromUrl ? this.choicesFromUrl : this.getChoices(); }, enumerable: false, configurable: true }); QuestionSelectBase.prototype.getQuestionWithChoices = function () { if (!this.choicesFromQuestion || !this.survey) return null; var res = this.survey.getQuestionByName(this.choicesFromQuestion); return !!res && !!res.visibleChoices && res !== this ? res : null; }; QuestionSelectBase.prototype.getChoicesFromQuestion = function (question) { var res = []; var isSelected = this.choicesFromQuestionMode == "selected" ? true : this.choicesFromQuestionMode == "unselected" ? false : undefined; var choices = question.visibleChoices; for (var i = 0; i < choices.length; i++) { if (this.isBuiltInChoice(choices[i], question)) continue; if (isSelected === undefined) { res.push(choices[i]); continue; } var itemsSelected = question.isItemSelected(choices[i]); if ((itemsSelected && isSelected) || (!itemsSelected && !isSelected)) { res.push(choices[i]); } } return res; }; Object.defineProperty(QuestionSelectBase.prototype, "hasActiveChoices", { get: function () { var choices = this.visibleChoices; if (!choices || choices.length == 0) { this.onVisibleChoicesChanged(); choices = this.visibleChoices; } for (var i = 0; i < choices.length; i++) { if (!this.isBuiltInChoice(choices[i], this)) return true; } return false; }, enumerable: false, configurable: true }); QuestionSelectBase.prototype.isBuiltInChoice = function (item, question) { return (item === question.noneItem || item === question.otherItem || item === question.newItemValue); }; QuestionSelectBase.prototype.getChoices = function () { return this.choices; }; QuestionSelectBase.prototype.supportComment = function () { return true; }; QuestionSelectBase.prototype.supportOther = function () { return this.isSupportProperty("hasOther"); }; QuestionSelectBase.prototype.supportNone = function () { return this.isSupportProperty("hasNone"); }; QuestionSelectBase.prototype.isSupportProperty = function (propName) { return (!this.isDesignMode || _jsonobject__WEBPACK_IMPORTED_MODULE_0__["Serializer"].findProperty(this.getType(), propName).visible); }; QuestionSelectBase.prototype.onCheckForErrors = function (errors, isOnValueChanged) { _super.prototype.onCheckForErrors.call(this, errors, isOnValueChanged); if (!this.hasOther || !this.isOtherSelected || this.comment) return; errors.push(new _error__WEBPACK_IMPORTED_MODULE_5__["OtherEmptyError"](this.otherErrorText, this)); }; QuestionSelectBase.prototype.setSurveyImpl = function (value) { _super.prototype.setSurveyImpl.call(this, value); this.runChoicesByUrl(); if (this.isAddDefaultItems) { this.updateVisibleChoices(); } }; QuestionSelectBase.prototype.setSurveyCore = function (value) { _super.prototype.setSurveyCore.call(this, value); if (!!value && !!this.choicesFromQuestion) { this.onVisibleChoicesChanged(); } }; QuestionSelectBase.prototype.getStoreOthersAsComment = function () { if (this.isSettingDefaultValue) return false; return (this.storeOthersAsComment === true || (this.storeOthersAsComment == "default" && (this.survey != null ? this.survey.storeOthersAsComment : true)) || (!this.choicesByUrl.isEmpty && !this.choicesFromUrl)); }; QuestionSelectBase.prototype.onSurveyLoad = function () { this.runChoicesByUrl(); this.onVisibleChoicesChanged(); _super.prototype.onSurveyLoad.call(this); }; QuestionSelectBase.prototype.onAnyValueChanged = function (name) { _super.prototype.onAnyValueChanged.call(this, name); if (name != this.getValueName()) { this.runChoicesByUrl(); } if (!!name && name == this.choicesFromQuestion) { this.onVisibleChoicesChanged(); } }; QuestionSelectBase.prototype.updateValueFromSurvey = function (newValue) { var newComment = ""; if (this.hasOther && !this.isRunningChoices && !this.choicesByUrl.isRunning && this.getStoreOthersAsComment()) { if (this.hasUnknownValue(newValue) && !this.getHasOther(newValue)) { newComment = this.getCommentFromValue(newValue); newValue = this.setOtherValueIntoValue(newValue); } else { newComment = this.data.getComment(this.getValueName()); } } _super.prototype.updateValueFromSurvey.call(this, newValue); if (!!newComment) { this.setNewComment(newComment); } }; QuestionSelectBase.prototype.getCommentFromValue = function (newValue) { return newValue; }; QuestionSelectBase.prototype.setOtherValueIntoValue = function (newValue) { return this.otherItem.value; }; QuestionSelectBase.prototype.runChoicesByUrl = function () { if (!this.choicesByUrl || this.isLoadingFromJson || this.isRunningChoices) return; var processor = this.surveyImpl ? this.surveyImpl.getTextProcessor() : this.textProcessor; if (!processor) processor = this.survey; if (!processor) return; this.isReadyValue = this.isChoicesLoaded || this.choicesByUrl.isEmpty; this.isRunningChoices = true; this.choicesByUrl.run(processor); this.isRunningChoices = false; }; QuestionSelectBase.prototype.onBeforeSendRequest = function () { if (_settings__WEBPACK_IMPORTED_MODULE_9__["settings"].disableOnGettingChoicesFromWeb === true && !this.isReadOnly) { this.enableOnLoadingChoices = true; this.readOnly = true; } }; QuestionSelectBase.prototype.onLoadChoicesFromUrl = function (array) { if (this.enableOnLoadingChoices) { this.readOnly = false; } if (!this.isReadOnly) { var errors = []; if (this.choicesByUrl && this.choicesByUrl.error) { errors.push(this.choicesByUrl.error); } this.errors = errors; } var newChoices = null; var checkCachedValuesOnExisting = true; if (this.isFirstLoadChoicesFromUrl && !this.cachedValueForUrlRequests && this.defaultValue) { this.cachedValueForUrlRequests = this.defaultValue; checkCachedValuesOnExisting = false; } if (this.isValueEmpty(this.cachedValueForUrlRequests)) { this.cachedValueForUrlRequests = this.value; } this.isFirstLoadChoicesFromUrl = false; var cachedValues = this.createCachedValueForUrlRequests(this.cachedValueForUrlRequests, checkCachedValuesOnExisting); if (array && (array.length > 0 || this.choicesByUrl.allowEmptyResponse)) { newChoices = new Array(); _itemvalue__WEBPACK_IMPORTED_MODULE_3__["ItemValue"].setData(newChoices, array); } if (!!newChoices) { for (var i = 0; i < newChoices.length; i++) { newChoices[i].locOwner = this; } } this.choicesFromUrl = newChoices; this.filterItems(); this.onVisibleChoicesChanged(); if (newChoices) { var newValue = this.updateCachedValueForUrlRequests(cachedValues, newChoices); if (!!newValue && !this.isReadOnly) { var hasChanged = !this.isTwoValueEquals(this.value, newValue.value); try { if (!this.isValueEmpty(newValue.value)) { this.allowNotifyValueChanged = false; this.setQuestionValue(undefined, true, false); } this.allowNotifyValueChanged = hasChanged; if (hasChanged) { this.value = newValue.value; } else { this.setQuestionValue(newValue.value); } } finally { this.allowNotifyValueChanged = true; } } } this.choicesLoaded(); }; QuestionSelectBase.prototype.createCachedValueForUrlRequests = function (val, checkOnExisting) { if (this.isValueEmpty(val)) return null; if (Array.isArray(val)) { var res = []; for (var i = 0; i < val.length; i++) { res.push(this.createCachedValueForUrlRequests(val[i], true)); } return res; } var isExists = checkOnExisting ? !this.hasUnknownValue(val) : true; return { value: val, isExists: isExists }; }; QuestionSelectBase.prototype.updateCachedValueForUrlRequests = function (val, newChoices) { if (this.isValueEmpty(val)) return null; if (Array.isArray(val)) { var res = []; for (var i = 0; i < val.length; i++) { var updatedValue = this.updateCachedValueForUrlRequests(val[i], newChoices); if (updatedValue && !this.isValueEmpty(updatedValue.value)) { var newValue = updatedValue.value; var item = _itemvalue__WEBPACK_IMPORTED_MODULE_3__["ItemValue"].getItemByValue(newChoices, updatedValue.value); if (!!item) { newValue = item.value; } res.push(newValue); } } return { value: res }; } var value = val.isExists && this.hasUnknownValue(val.value) ? null : val.value; var item = _itemvalue__WEBPACK_IMPORTED_MODULE_3__["ItemValue"].getItemByValue(newChoices, value); if (!!item) { value = item.value; } return { value: value }; }; QuestionSelectBase.prototype.updateChoicesDependedQuestions = function () { if (this.isUpdatingChoicesDependedQuestions) return; this.isUpdatingChoicesDependedQuestions = true; for (var i = 0; i < this.dependedQuestions.length; i++) { this.dependedQuestions[i].onVisibleChoicesChanged(); this.dependedQuestions[i].updateChoicesDependedQuestions(); } this.isUpdatingChoicesDependedQuestions = false; }; QuestionSelectBase.prototype.onSurveyValueChanged = function (newValue) { _super.prototype.onSurveyValueChanged.call(this, newValue); if (this.isLoadingFromJson) return; this.updateChoicesDependedQuestions(); }; QuestionSelectBase.prototype.onVisibleChoicesChanged = function () { if (this.isLoadingFromJson) return; this.updateVisibleChoices(); this.updateVisibilityBasedOnChoices(); if (!!this.visibleChoicesChangedCallback) { this.visibleChoicesChangedCallback(); } this.updateChoicesDependedQuestions(); }; QuestionSelectBase.prototype.updateVisibilityBasedOnChoices = function () { if (this.hideIfChoicesEmpty) { var filteredChoices = this.getFilteredChoices(); this.visible = !filteredChoices || filteredChoices.length > 0; } }; QuestionSelectBase.prototype.sortVisibleChoices = function (array) { var order = this.choicesOrder.toLowerCase(); if (order == "asc") return this.sortArray(array, 1); if (order == "desc") return this.sortArray(array, -1); if (order == "random") return this.randomizeArray(array); return array; }; QuestionSelectBase.prototype.sortArray = function (array, mult) { return array.sort(function (a, b) { if (a.calculatedText < b.calculatedText) return -1 * mult; if (a.calculatedText > b.calculatedText) return 1 * mult; return 0; }); }; QuestionSelectBase.prototype.randomizeArray = function (array) { return _helpers__WEBPACK_IMPORTED_MODULE_8__["Helpers"].randomizeArray(array); }; QuestionSelectBase.prototype.clearIncorrectValues = function () { if (this.keepIncorrectValues || this.isEmpty()) return; if (!!this.survey && this.survey.questionCountByValueName(this.getValueName()) > 1) return; if (!!this.choicesByUrl && !this.choicesByUrl.isEmpty && (!this.choicesFromUrl || this.choicesFromUrl.length == 0)) return; if (this.clearIncorrectValuesCallback) { this.clearIncorrectValuesCallback(); } else { this.clearIncorrectValuesCore(); } }; QuestionSelectBase.prototype.clearValueIfInvisible = function () { _super.prototype.clearValueIfInvisible.call(this); this.clearIncorrectValues(); }; /** * Returns true if item is selected * @param item checkbox or radio item value */ QuestionSelectBase.prototype.isItemSelected = function (item) { return item.value === this.value; }; QuestionSelectBase.prototype.clearDisabledValues = function () { if (!this.survey || !this.survey.clearValueOnDisableItems) return; this.clearDisabledValuesCore(); }; QuestionSelectBase.prototype.clearIncorrectValuesCore = function () { var val = this.value; if (this.canClearValueAnUnknow(val)) { this.clearValue(); } }; QuestionSelectBase.prototype.canClearValueAnUnknow = function (val) { if (!this.getStoreOthersAsComment() && this.isOtherSelected) return false; return this.hasUnknownValue(val, true, true, true); }; QuestionSelectBase.prototype.clearDisabledValuesCore = function () { if (this.isValueDisabled(this.value)) { this.clearValue(); } }; QuestionSelectBase.prototype.clearUnusedValues = function () { _super.prototype.clearUnusedValues.call(this); if (!this.isOtherSelected && !this.hasComment) { this.comment = ""; } }; QuestionSelectBase.prototype.getColumnClass = function () { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_10__["CssClassBuilder"]() .append(this.cssClasses.column) .append("sv-q-column-" + this.colCount, this.hasColumns) .toString(); }; QuestionSelectBase.prototype.getItemIndex = function (item) { return this.visibleChoices.indexOf(item); }; QuestionSelectBase.prototype.getItemClass = function (item) { var options = { item: item }; var res = this.getItemClassCore(item, options); options.css = res; if (!!this.survey) { this.survey.updateChoiceItemCss(this, options); } return options.css; }; QuestionSelectBase.prototype.getItemClassCore = function (item, options) { var builder = new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_10__["CssClassBuilder"]() .append(this.cssClasses.item) .append(this.cssClasses.itemInline, !this.hasColumns && this.colCount === 0) .append("sv-q-col-" + this.colCount, !this.hasColumns && this.colCount !== 0); var isDisabled = this.isReadOnly || !item.isEnabled; var isChecked = this.isItemSelected(item) || (this.isOtherSelected && this.otherItem.value === item.value); var allowHover = !isDisabled && !isChecked && !(!!this.survey && this.survey.isDesignMode); var isNone = item === this.noneItem; options.isDisabled = isDisabled; options.isChecked = isChecked; options.isNone = isNone; return builder.append(this.cssClasses.itemDisabled, isDisabled) .append(this.cssClasses.itemChecked, isChecked) .append(this.cssClasses.itemHover, allowHover) .append(this.cssClasses.itemNone, isNone) .toString(); }; QuestionSelectBase.prototype.getLabelClass = function (item) { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_10__["CssClassBuilder"]() .append(this.cssClasses.label) .append(this.cssClasses.labelChecked, this.isItemSelected(item)) .toString(); }; QuestionSelectBase.prototype.getControlLabelClass = function (item) { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_10__["CssClassBuilder"]() .append(this.cssClasses.controlLabel) .append(this.cssClasses.controlLabelChecked, this.isItemSelected(item)) .toString(); }; Object.defineProperty(QuestionSelectBase.prototype, "columns", { get: function () { var columns = []; var colCount = this.colCount; if (this.hasColumns && this.visibleChoices.length > 0) { if (_settings__WEBPACK_IMPORTED_MODULE_9__["settings"].showItemsInOrder == "column") { var prevIndex = 0; var leftElementsCount = this.visibleChoices.length % colCount; for (var i = 0; i < colCount; i++) { var column = []; for (var j = prevIndex; j < prevIndex + Math.floor(this.visibleChoices.length / colCount); j++) { column.push(this.visibleChoices[j]); } if (leftElementsCount > 0) { leftElementsCount--; column.push(this.visibleChoices[j]); j++; } prevIndex = j; columns.push(column); } } else { for (var i = 0; i < colCount; i++) { var column = []; for (var j = i; j < this.visibleChoices.length; j += colCount) { column.push(this.visibleChoices[j]); } columns.push(column); } } } return columns; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionSelectBase.prototype, "hasColumns", { get: function () { return this.colCount > 1; }, enumerable: false, configurable: true }); QuestionSelectBase.prototype.choicesLoaded = function () { this.isChoicesLoaded = true; var oldIsReady = this.isReadyValue; this.isReadyValue = true; this.onReadyChanged && this.onReadyChanged.fire(this, { question: this, isReady: true, oldIsReady: oldIsReady, }); if (this.survey) { this.survey.loadedChoicesFromServer(this); } }; QuestionSelectBase.prototype.getItemValueWrapperComponentName = function (item) { var survey = this.survey; if (survey) { return survey.getItemValueWrapperComponentName(item, this); } return _survey__WEBPACK_IMPORTED_MODULE_1__["SurveyModel"].TemplateRendererComponentName; }; QuestionSelectBase.prototype.getItemValueWrapperComponentData = function (item) { var survey = this.survey; if (survey) { return survey.getItemValueWrapperComponentData(item, this); } return item; }; return QuestionSelectBase; }(_question__WEBPACK_IMPORTED_MODULE_2__["Question"])); /** * A base class for checkbox and radiogroup questions. It introduced a colCount property. */ var QuestionCheckboxBase = /** @class */ (function (_super) { __extends(QuestionCheckboxBase, _super); function QuestionCheckboxBase(name) { return _super.call(this, name) || this; } Object.defineProperty(QuestionCheckboxBase.prototype, "colCount", { /** * The number of columns for radiogroup and checkbox questions. Items are rendred in one line if the value is 0. */ get: function () { return this.getPropertyValue("colCount", this.isFlowLayout ? 0 : 1); }, set: function (value) { if (value < 0 || value > 5 || this.isFlowLayout) return; this.setPropertyValue("colCount", value); this.fireCallback(this.colCountChangedCallback); }, enumerable: false, configurable: true }); QuestionCheckboxBase.prototype.onParentChanged = function () { _super.prototype.onParentChanged.call(this); if (this.isFlowLayout) { this.setPropertyValue("colCount", null); } }; QuestionCheckboxBase.prototype.onParentQuestionChanged = function () { this.onVisibleChoicesChanged(); }; QuestionCheckboxBase.prototype.getSearchableItemValueKeys = function (keys) { keys.push("choices"); }; QuestionCheckboxBase.prototype.getItemEnabled = function (item) { return !this.isInputReadOnly && item.isEnabled; }; QuestionCheckboxBase.prototype.isOtherItem = function (item) { return this.hasOther && item.value == this.otherItem.value; }; return QuestionCheckboxBase; }(QuestionSelectBase)); _jsonobject__WEBPACK_IMPORTED_MODULE_0__["Serializer"].addClass("selectbase", [ { name: "hasComment:switch", layout: "row" }, { name: "commentText", dependsOn: "hasComment", visibleIf: function (obj) { return obj.hasComment; }, serializationProperty: "locCommentText", layout: "row", }, "choicesFromQuestion:question_selectbase", { name: "choices:itemvalue[]", baseValue: function () { return _surveyStrings__WEBPACK_IMPORTED_MODULE_4__["surveyLocalization"].getString("choices_Item"); }, dependsOn: "choicesFromQuestion", visibleIf: function (obj) { return !obj.choicesFromQuestion; }, }, { name: "choicesFromQuestionMode", default: "all", choices: ["all", "selected", "unselected"], dependsOn: "choicesFromQuestion", visibleIf: function (obj) { return !!obj.choicesFromQuestion; }, }, { name: "choicesOrder", default: "none", choices: ["none", "asc", "desc", "random"], dependsOn: "choicesFromQuestion", visibleIf: function (obj) { return !obj.choicesFromQuestion; }, }, { name: "choicesByUrl:restfull", className: "ChoicesRestful", onGetValue: function (obj) { return obj.choicesByUrl.getData(); }, onSetValue: function (obj, value) { obj.choicesByUrl.setData(value); }, }, "hideIfChoicesEmpty:boolean", { name: "choicesVisibleIf:condition", dependsOn: "choicesFromQuestion", visibleIf: function (obj) { return !obj.choicesFromQuestion; }, }, { name: "choicesEnableIf:condition", dependsOn: "choicesFromQuestion", visibleIf: function (obj) { return !obj.choicesFromQuestion; }, }, "hasOther:boolean", "hasNone:boolean", { name: "otherPlaceHolder", serializationProperty: "locOtherPlaceHolder", dependsOn: "hasOther", visibleIf: function (obj) { return obj.hasOther; }, }, { name: "noneText", serializationProperty: "locNoneText", dependsOn: "hasNone", visibleIf: function (obj) { return obj.hasNone; }, }, { name: "otherText", serializationProperty: "locOtherText", dependsOn: "hasOther", visibleIf: function (obj) { return obj.hasOther; }, }, { name: "otherErrorText", serializationProperty: "locOtherErrorText", dependsOn: "hasOther", visibleIf: function (obj) { return obj.hasOther; }, }, { name: "storeOthersAsComment", default: "default", choices: ["default", true, false], visible: false, }, ], null, "question"); _jsonobject__WEBPACK_IMPORTED_MODULE_0__["Serializer"].addClass("checkboxbase", [ { name: "colCount:number", default: 1, choices: [0, 1, 2, 3, 4, 5], layout: "row", }, ], null, "selectbase"); /***/ }), /***/ "./src/question_boolean.ts": /*!*********************************!*\ !*** ./src/question_boolean.ts ***! \*********************************/ /*! exports provided: QuestionBooleanModel */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionBooleanModel", function() { return QuestionBooleanModel; }); /* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./questionfactory */ "./src/questionfactory.ts"); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _question__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./question */ "./src/question.ts"); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./surveyStrings */ "./src/surveyStrings.ts"); /* harmony import */ var _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils/cssClassBuilder */ "./src/utils/cssClassBuilder.ts"); /* harmony import */ var _utils_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils/utils */ "./src/utils/utils.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; /** * A Model for a boolean question. */ var QuestionBooleanModel = /** @class */ (function (_super) { __extends(QuestionBooleanModel, _super); function QuestionBooleanModel(name) { var _this = _super.call(this, name) || this; _this.createLocalizableString("labelFalse", _this, true); _this.createLocalizableString("labelTrue", _this, true); _this.locLabelFalse.onGetTextCallback = function (text) { return !!text ? text : _surveyStrings__WEBPACK_IMPORTED_MODULE_3__["surveyLocalization"].getString("booleanUncheckedLabel"); }; _this.locLabelTrue.onGetTextCallback = function (text) { return !!text ? text : _surveyStrings__WEBPACK_IMPORTED_MODULE_3__["surveyLocalization"].getString("booleanCheckedLabel"); }; return _this; } QuestionBooleanModel.prototype.getType = function () { return "boolean"; }; QuestionBooleanModel.prototype.isLayoutTypeSupported = function (layoutType) { return true; }; QuestionBooleanModel.prototype.supportGoNextPageAutomatic = function () { return this.renderAs !== "checkbox"; }; Object.defineProperty(QuestionBooleanModel.prototype, "isIndeterminate", { /** * Returns true if the question check will be rendered in indeterminate mode. value is empty. */ get: function () { return this.isEmpty(); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionBooleanModel.prototype, "hasTitle", { get: function () { return true; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionBooleanModel.prototype, "checkedValue", { /** * Get/set question value in 3 modes: indeterminate (value is empty), true (check is set) and false (check is unset). * @see valueTrue * @see valueFalse */ get: function () { if (this.isEmpty()) return null; return this.value == this.getValueTrue(); }, set: function (val) { if (this.isReadOnly) { return; } this.setCheckedValue(val); }, enumerable: false, configurable: true }); QuestionBooleanModel.prototype.setCheckedValue = function (val) { if (this.isValueEmpty(val)) { this.value = null; } else { this.value = val == true ? this.getValueTrue() : this.getValueFalse(); } }; Object.defineProperty(QuestionBooleanModel.prototype, "defaultValue", { /** * Set the default state of the check: "indeterminate" - default (value is empty/null), "true" - value equals valueTrue or true, "false" - value equals valueFalse or false. */ get: function () { return this.getPropertyValue("defaultValue"); }, set: function (val) { if (val === true) val = "true"; if (val === false) val = "false"; this.setPropertyValue("defaultValue", val); this.updateValueWithDefaults(); }, enumerable: false, configurable: true }); QuestionBooleanModel.prototype.getDefaultValue = function () { if (this.defaultValue == "indeterminate") return null; if (this.defaultValue === undefined) return null; return this.defaultValue == "true" ? this.getValueTrue() : this.getValueFalse(); }; Object.defineProperty(QuestionBooleanModel.prototype, "locTitle", { get: function () { return this.showTitle || this.isValueEmpty(this.locLabel.text) ? this.getLocalizableString("title") : this.locLabel; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionBooleanModel.prototype, "locDisplayLabel", { get: function () { if (this.locLabel.text) return this.locLabel; return this.showTitle ? this.locLabel : this.locTitle; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionBooleanModel.prototype, "labelTrue", { /** * Set this property, if you want to have a different label for state when check is set. */ get: function () { return this.getLocalizableStringText("labelTrue"); }, set: function (val) { this.setLocalizableStringText("labelTrue", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionBooleanModel.prototype, "locLabelTrue", { get: function () { return this.getLocalizableString("labelTrue"); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionBooleanModel.prototype, "labelFalse", { /** * Set this property, if you want to have a different label for state when check is unset. */ get: function () { return this.getLocalizableStringText("labelFalse"); }, set: function (val) { this.setLocalizableStringText("labelFalse", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionBooleanModel.prototype, "locLabelFalse", { get: function () { return this.getLocalizableString("labelFalse"); }, enumerable: false, configurable: true }); QuestionBooleanModel.prototype.getValueTrue = function () { return this.valueTrue ? this.valueTrue : true; }; QuestionBooleanModel.prototype.getValueFalse = function () { return this.valueFalse ? this.valueFalse : false; }; QuestionBooleanModel.prototype.setDefaultValue = function () { if (this.defaultValue == "true") this.setCheckedValue(true); if (this.defaultValue == "false") this.setCheckedValue(false); if (this.defaultValue == "indeterminate") this.setCheckedValue(null); }; QuestionBooleanModel.prototype.getDisplayValueCore = function (keysAsText, value) { if (value == this.getValueTrue()) return this.locLabelTrue.textOrHtml; return this.locLabelFalse.textOrHtml; }; QuestionBooleanModel.prototype.getItemCss = function () { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_4__["CssClassBuilder"]() .append(this.cssClasses.item) .append(this.cssClasses.itemDisabled, this.isReadOnly) .append(this.cssClasses.itemChecked, !!this.checkedValue) .append(this.cssClasses.itemIndeterminate, this.checkedValue === null) .toString(); }; QuestionBooleanModel.prototype.getLabelCss = function (checked) { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_4__["CssClassBuilder"]() .append(this.cssClasses.label) .append(this.cssClasses.disabledLabel, this.checkedValue === !checked || this.isReadOnly) .toString(); }; Object.defineProperty(QuestionBooleanModel.prototype, "allowClick", { get: function () { return this.isIndeterminate && !this.isInputReadOnly; }, enumerable: false, configurable: true }); /* #region web-based methods */ QuestionBooleanModel.prototype.onLabelClick = function (event, value) { if (this.allowClick) { Object(_utils_utils__WEBPACK_IMPORTED_MODULE_5__["preventDefaults"])(event); this.checkedValue = value; } return true; }; QuestionBooleanModel.prototype.onSwitchClickModel = function (event) { if (this.allowClick) { Object(_utils_utils__WEBPACK_IMPORTED_MODULE_5__["preventDefaults"])(event); var isRightClick = event.offsetX / event.target.offsetWidth > 0.5; var isRtl = document.defaultView.getComputedStyle(event.target).direction == "rtl"; this.checkedValue = isRtl ? !isRightClick : isRightClick; return; } return true; }; __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__["property"])({ localizable: true }) ], QuestionBooleanModel.prototype, "label", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__["property"])() ], QuestionBooleanModel.prototype, "showTitle", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__["property"])() ], QuestionBooleanModel.prototype, "valueTrue", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__["property"])() ], QuestionBooleanModel.prototype, "valueFalse", void 0); return QuestionBooleanModel; }(_question__WEBPACK_IMPORTED_MODULE_2__["Question"])); _jsonobject__WEBPACK_IMPORTED_MODULE_1__["Serializer"].addClass("boolean", [ { name: "label:text", serializationProperty: "locLabel" }, { name: "labelTrue:text", serializationProperty: "locLabelTrue", }, { name: "labelFalse:text", serializationProperty: "locLabelFalse", }, "showTitle:boolean", "valueTrue", "valueFalse", { name: "renderAs", default: "default", visible: false }, ], function () { return new QuestionBooleanModel(""); }, "question"); _questionfactory__WEBPACK_IMPORTED_MODULE_0__["QuestionFactory"].Instance.registerQuestion("boolean", function (name) { return new QuestionBooleanModel(name); }); /***/ }), /***/ "./src/question_buttongroup.ts": /*!*************************************!*\ !*** ./src/question_buttongroup.ts ***! \*************************************/ /*! exports provided: ButtonGroupItemValue, QuestionButtonGroupModel, ButtonGroupItemModel */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ButtonGroupItemValue", function() { return ButtonGroupItemValue; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionButtonGroupModel", function() { return QuestionButtonGroupModel; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ButtonGroupItemModel", function() { return ButtonGroupItemModel; }); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _itemvalue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./itemvalue */ "./src/itemvalue.ts"); /* harmony import */ var _question_baseselect__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./question_baseselect */ "./src/question_baseselect.ts"); /* harmony import */ var _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils/cssClassBuilder */ "./src/utils/cssClassBuilder.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var ButtonGroupItemValue = /** @class */ (function (_super) { __extends(ButtonGroupItemValue, _super); function ButtonGroupItemValue(value, text, typeName) { if (text === void 0) { text = null; } if (typeName === void 0) { typeName = "buttongroupitemvalue"; } var _this = _super.call(this, value, text, typeName) || this; _this.typeName = typeName; return _this; } ButtonGroupItemValue.prototype.getType = function () { return !!this.typeName ? this.typeName : "buttongroupitemvalue"; }; __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_0__["property"])() ], ButtonGroupItemValue.prototype, "iconName", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_0__["property"])() ], ButtonGroupItemValue.prototype, "iconSize", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_0__["property"])() ], ButtonGroupItemValue.prototype, "showCaption", void 0); return ButtonGroupItemValue; }(_itemvalue__WEBPACK_IMPORTED_MODULE_1__["ItemValue"])); /** * A Model for a button group question. */ var QuestionButtonGroupModel = /** @class */ (function (_super) { __extends(QuestionButtonGroupModel, _super); function QuestionButtonGroupModel(name) { return _super.call(this, name) || this; } QuestionButtonGroupModel.prototype.getType = function () { return "buttongroup"; }; QuestionButtonGroupModel.prototype.getItemValueType = function () { return "buttongroupitemvalue"; }; QuestionButtonGroupModel.prototype.supportOther = function () { return false; }; return QuestionButtonGroupModel; }(_question_baseselect__WEBPACK_IMPORTED_MODULE_2__["QuestionCheckboxBase"])); _jsonobject__WEBPACK_IMPORTED_MODULE_0__["Serializer"].addClass("buttongroup", [ { name: "choices:buttongroupitemvalue[]", }, ], function () { return new QuestionButtonGroupModel(""); }, "checkboxbase"); _jsonobject__WEBPACK_IMPORTED_MODULE_0__["Serializer"].addClass("buttongroupitemvalue", [ { name: "showCaption:boolean", default: true }, { name: "iconName:text" }, { name: "iconSize:number" }, ], function (value) { return new ButtonGroupItemValue(value); }, "itemvalue"); // QuestionFactory.Instance.registerQuestion("buttongroup", name => { // var q = new QuestionButtonGroupModel(name); // q.choices = QuestionFactory.DefaultChoices; // return q; // }); var ButtonGroupItemModel = /** @class */ (function () { function ButtonGroupItemModel(question, item, index) { this.question = question; this.item = item; this.index = index; } Object.defineProperty(ButtonGroupItemModel.prototype, "value", { get: function () { return this.item.value; }, enumerable: false, configurable: true }); Object.defineProperty(ButtonGroupItemModel.prototype, "iconName", { get: function () { return this.item.iconName; }, enumerable: false, configurable: true }); Object.defineProperty(ButtonGroupItemModel.prototype, "iconSize", { get: function () { return this.item.iconSize || 24; }, enumerable: false, configurable: true }); Object.defineProperty(ButtonGroupItemModel.prototype, "caption", { get: function () { return this.item.locText; }, enumerable: false, configurable: true }); Object.defineProperty(ButtonGroupItemModel.prototype, "showCaption", { get: function () { return this.item.showCaption || this.item.showCaption === undefined; }, enumerable: false, configurable: true }); Object.defineProperty(ButtonGroupItemModel.prototype, "isRequired", { get: function () { return this.question.isRequired; }, enumerable: false, configurable: true }); Object.defineProperty(ButtonGroupItemModel.prototype, "selected", { get: function () { return this.question.isItemSelected(this.item); }, enumerable: false, configurable: true }); Object.defineProperty(ButtonGroupItemModel.prototype, "readOnly", { get: function () { return this.question.isInputReadOnly || !this.item.isEnabled; }, enumerable: false, configurable: true }); Object.defineProperty(ButtonGroupItemModel.prototype, "name", { get: function () { return this.question.name + "_" + this.question.id; }, enumerable: false, configurable: true }); Object.defineProperty(ButtonGroupItemModel.prototype, "id", { get: function () { return this.question.inputId + "_" + this.index; }, enumerable: false, configurable: true }); Object.defineProperty(ButtonGroupItemModel.prototype, "hasErrors", { get: function () { return this.question.errors.length > 0; }, enumerable: false, configurable: true }); Object.defineProperty(ButtonGroupItemModel.prototype, "describedBy", { get: function () { return this.question.errors.length > 0 ? this.question.id + "_errors" : null; }, enumerable: false, configurable: true }); Object.defineProperty(ButtonGroupItemModel.prototype, "labelClass", { get: function () { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_3__["CssClassBuilder"]() .append(this.question.cssClasses.item) .append(this.question.cssClasses.itemSelected, this.selected) .append(this.question.cssClasses.itemHover, !this.readOnly && !this.selected) .append(this.question.cssClasses.itemDisabled, this.question.isReadOnly || !this.item.isEnabled) .toString(); }, enumerable: false, configurable: true }); Object.defineProperty(ButtonGroupItemModel.prototype, "css", { get: function () { return { label: this.labelClass, icon: this.question.cssClasses.itemIcon, control: this.question.cssClasses.itemControl, caption: this.question.cssClasses.itemCaption, decorator: this.question.cssClasses.itemDecorator, }; }, enumerable: false, configurable: true }); ButtonGroupItemModel.prototype.onChange = function () { this.question.renderedValue = this.item.value; }; return ButtonGroupItemModel; }()); /***/ }), /***/ "./src/question_checkbox.ts": /*!**********************************!*\ !*** ./src/question_checkbox.ts ***! \**********************************/ /*! exports provided: QuestionCheckboxModel */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionCheckboxModel", function() { return QuestionCheckboxModel; }); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./questionfactory */ "./src/questionfactory.ts"); /* harmony import */ var _question_baseselect__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./question_baseselect */ "./src/question_baseselect.ts"); /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ "./src/helpers.ts"); /* harmony import */ var _itemvalue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./itemvalue */ "./src/itemvalue.ts"); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./surveyStrings */ "./src/surveyStrings.ts"); /* harmony import */ var _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/cssClassBuilder */ "./src/utils/cssClassBuilder.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); /** * A Model for a checkbox question */ var QuestionCheckboxModel = /** @class */ (function (_super) { __extends(QuestionCheckboxModel, _super); function QuestionCheckboxModel(name) { var _this = _super.call(this, name) || this; _this.selectAllItemValue = new _itemvalue__WEBPACK_IMPORTED_MODULE_4__["ItemValue"]("selectall"); _this.invisibleOldValues = {}; _this.isChangingValueOnClearIncorrect = false; var selectAllItemText = _this.createLocalizableString("selectAllText", _this, true); selectAllItemText.onGetTextCallback = function (text) { return !!text ? text : _surveyStrings__WEBPACK_IMPORTED_MODULE_5__["surveyLocalization"].getString("selectAllItemText"); }; _this.selectAllItem.locOwner = _this; _this.selectAllItem.setLocText(selectAllItemText); _this.registerFunctionOnPropertiesValueChanged(["hasSelectAll", "selectAllText"], function () { _this.onVisibleChoicesChanged(); }); return _this; } Object.defineProperty(QuestionCheckboxModel.prototype, "ariaRole", { get: function () { return "group"; }, enumerable: false, configurable: true }); QuestionCheckboxModel.prototype.getType = function () { return "checkbox"; }; QuestionCheckboxModel.prototype.onCreating = function () { _super.prototype.onCreating.call(this); this.createNewArray("renderedValue"); this.createNewArray("value"); }; QuestionCheckboxModel.prototype.getFirstInputElementId = function () { return this.inputId + "_0"; }; Object.defineProperty(QuestionCheckboxModel.prototype, "selectAllItem", { /** * Returns the select all item. By using this property, you may change programmatically it's value and text. * @see hasSelectAll */ get: function () { return this.selectAllItemValue; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionCheckboxModel.prototype, "selectAllText", { /** * Use this property to set the different text for Select All item. */ get: function () { return this.getLocalizableStringText("selectAllText", _surveyStrings__WEBPACK_IMPORTED_MODULE_5__["surveyLocalization"].getString("selectAllItemText")); }, set: function (val) { this.setLocalizableStringText("selectAllText", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionCheckboxModel.prototype, "locSelectAllText", { get: function () { return this.getLocalizableString("selectAllText"); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionCheckboxModel.prototype, "hasSelectAll", { /** * Set this property to true, to show the "Select All" item on the top. If end-user checks this item, then all items are checked. */ get: function () { return this.getPropertyValue("hasSelectAll", false); }, set: function (val) { this.setPropertyValue("hasSelectAll", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionCheckboxModel.prototype, "isAllSelected", { /** * Returns true if all items are selected * @see toggleSelectAll */ get: function () { var val = this.value; if (!val || !Array.isArray(val)) return false; if (this.isItemSelected(this.noneItem)) return false; var allItemCount = this.visibleChoices.length; if (this.hasOther) allItemCount--; if (this.hasNone) allItemCount--; if (this.hasSelectAll) allItemCount--; var selectedCount = val.length; if (this.isItemSelected(this.otherItem)) selectedCount--; return selectedCount === allItemCount; }, set: function (val) { if (val) { this.selectAll(); } else { this.clearValue(); } }, enumerable: false, configurable: true }); /** * It will select all items, except other and none. If all items have been already selected then it will clear the value * @see isAllSelected * @see selectAll */ QuestionCheckboxModel.prototype.toggleSelectAll = function () { this.isAllSelected = !this.isAllSelected; }; /** * Select all items, except other and none. */ QuestionCheckboxModel.prototype.selectAll = function () { var val = []; for (var i = 0; i < this.visibleChoices.length; i++) { var item = this.visibleChoices[i]; if (item === this.noneItem || item === this.otherItem || item === this.selectAllItem) continue; val.push(item.value); } this.value = val; }; /** * Returns true if item is checked * @param item checkbox item value */ QuestionCheckboxModel.prototype.isItemSelected = function (item) { if (item === this.selectAllItem) return this.isAllSelected; var val = this.renderedValue; if (!val || !Array.isArray(val)) return false; for (var i = 0; i < val.length; i++) { if (this.isTwoValueEquals(val[i], item.value)) return true; } return false; }; Object.defineProperty(QuestionCheckboxModel.prototype, "maxSelectedChoices", { /** * Set this property different to 0 to limit the number of selected choices in the checkbox. */ get: function () { return this.getPropertyValue("maxSelectedChoices"); }, set: function (val) { if (val < 0) val = 0; this.setPropertyValue("maxSelectedChoices", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionCheckboxModel.prototype, "selectedItems", { /** * Return the selected items in the checkbox. Returns empty array if the value is empty */ get: function () { if (this.isEmpty()) return []; var val = this.value; var res = []; for (var i = 0; i < val.length; i++) { res.push(_itemvalue__WEBPACK_IMPORTED_MODULE_4__["ItemValue"].getItemByValue(this.visibleChoices, val[i])); } return res; }, enumerable: false, configurable: true }); QuestionCheckboxModel.prototype.onEnableItemCallBack = function (item) { if (!this.shouldCheckMaxSelectedChoices()) return true; return this.isItemSelected(item); }; QuestionCheckboxModel.prototype.onAfterRunItemsEnableCondition = function () { if (this.maxSelectedChoices < 1) return; if (this.hasSelectAll) { this.selectAllItem.setIsEnabled(this.maxSelectedChoices >= this.activeChoices.length); } if (this.hasOther) { this.otherItem.setIsEnabled(!this.shouldCheckMaxSelectedChoices() || this.isOtherSelected); } }; QuestionCheckboxModel.prototype.shouldCheckMaxSelectedChoices = function () { if (this.maxSelectedChoices < 1) return false; var val = this.value; var len = !Array.isArray(val) ? 0 : val.length; return len >= this.maxSelectedChoices; }; QuestionCheckboxModel.prototype.getItemClassCore = function (item, options) { var __dummy_value = this.value; //trigger dependencies from koValue for knockout options.isSelectAllItem = item === this.selectAllItem; return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_6__["CssClassBuilder"]() .append(_super.prototype.getItemClassCore.call(this, item, options)) .append(this.cssClasses.itemSelectAll, options.isSelectAllItem) .toString(); }; QuestionCheckboxModel.prototype.setNewValue = function (newValue) { if (!this.isChangingValueOnClearIncorrect) { this.invisibleOldValues = []; } newValue = this.valueFromData(newValue); var value = this.value; if (!newValue) newValue = []; if (!value) value = []; if (this.isTwoValueEquals(value, newValue)) return; if (this.hasNone) { var prevNoneIndex = this.noneIndexInArray(value); var newNoneIndex = this.noneIndexInArray(newValue); if (prevNoneIndex > -1) { if (newNoneIndex > -1 && newValue.length > 1) { newValue.splice(newNoneIndex, 1); } } else { if (newNoneIndex > -1) { newValue.splice(0, newValue.length); newValue.push(this.noneItem.value); } } } _super.prototype.setNewValue.call(this, this.rendredValueToData(newValue)); }; QuestionCheckboxModel.prototype.getIsMultipleValue = function () { return true; }; QuestionCheckboxModel.prototype.getCommentFromValue = function (newValue) { var ind = this.getFirstUnknownIndex(newValue); if (ind < 0) return ""; return newValue[ind]; }; QuestionCheckboxModel.prototype.setOtherValueIntoValue = function (newValue) { var ind = this.getFirstUnknownIndex(newValue); if (ind < 0) return newValue; newValue.splice(ind, 1, this.otherItem.value); return newValue; }; QuestionCheckboxModel.prototype.getFirstUnknownIndex = function (newValue) { if (!Array.isArray(newValue)) return -1; for (var i = 0; i < newValue.length; i++) { if (this.hasUnknownValue(newValue[i])) return i; } return -1; }; QuestionCheckboxModel.prototype.noneIndexInArray = function (val) { if (!val || !Array.isArray(val)) return -1; var noneValue = this.noneItem.value; for (var i = 0; i < val.length; i++) { if (val[i] == noneValue) return i; } return -1; }; QuestionCheckboxModel.prototype.canUseFilteredChoices = function () { return !this.hasSelectAll && _super.prototype.canUseFilteredChoices.call(this); }; QuestionCheckboxModel.prototype.supportSelectAll = function () { return this.isSupportProperty("hasSelectAll"); }; QuestionCheckboxModel.prototype.addToVisibleChoices = function (items, isAddAll) { if (this.supportSelectAll() && ((isAddAll && this.canShowOptionItem(this.selectAllItem)) || this.hasSelectAll)) { items.unshift(this.selectAllItem); } _super.prototype.addToVisibleChoices.call(this, items, isAddAll); }; QuestionCheckboxModel.prototype.isBuiltInChoice = function (item, question) { return (item === question.selectAllItem || _super.prototype.isBuiltInChoice.call(this, item, question)); }; /** * For internal use in SurveyJS Creator V2. */ QuestionCheckboxModel.prototype.isItemInList = function (item) { if (item == this.selectAllItem) return this.hasSelectAll; return _super.prototype.isItemInList.call(this, item); }; QuestionCheckboxModel.prototype.getDisplayValueCore = function (keysAsText, value) { if (!Array.isArray(value)) return _super.prototype.getDisplayValueCore.call(this, keysAsText, value); var items = this.visibleChoices; var str = ""; for (var i = 0; i < value.length; i++) { var valStr = this.getChoicesDisplayValue(items, value[i]); if (valStr) { if (str) str += ", "; str += valStr; } } return str; }; QuestionCheckboxModel.prototype.clearIncorrectValuesCore = function () { this.clearIncorrectAndDisabledValues(false); }; QuestionCheckboxModel.prototype.clearDisabledValuesCore = function () { this.clearIncorrectAndDisabledValues(true); }; QuestionCheckboxModel.prototype.clearIncorrectAndDisabledValues = function (clearDisabled) { var val = this.value; var hasChanged = false; var restoredValues = this.restoreValuesFromInvisible(); if (!val && restoredValues.length == 0) return; if (!Array.isArray(val) || val.length == 0) { this.isChangingValueOnClearIncorrect = true; if (!clearDisabled) { if (this.hasComment) { this.value = null; } else { this.clearValue(); } } this.isChangingValueOnClearIncorrect = false; if (restoredValues.length == 0) return; val = []; } var newValue = []; for (var i = 0; i < val.length; i++) { var isUnkown = this.canClearValueAnUnknow(val[i]); if ((!clearDisabled && !isUnkown) || (clearDisabled && !this.isValueDisabled(val[i]))) { newValue.push(val[i]); } else { hasChanged = true; if (isUnkown) { this.invisibleOldValues[val[i]] = true; } } } for (var i = 0; i < restoredValues.length; i++) { newValue.push(restoredValues[i]); hasChanged = true; } if (!hasChanged) return; this.isChangingValueOnClearIncorrect = true; if (newValue.length == 0) { this.clearValue(); } else { this.value = newValue; } this.isChangingValueOnClearIncorrect = false; }; QuestionCheckboxModel.prototype.restoreValuesFromInvisible = function () { var res = []; var visItems = this.visibleChoices; for (var i = 0; i < visItems.length; i++) { var val = visItems[i].value; if (this.invisibleOldValues[val]) { res.push(val); delete this.invisibleOldValues[val]; } } return res; }; QuestionCheckboxModel.prototype.getConditionJson = function (operator, path) { if (operator === void 0) { operator = null; } if (path === void 0) { path = null; } var json = _super.prototype.getConditionJson.call(this); if (operator == "contains" || operator == "notcontains") { json["type"] = "radiogroup"; } return json; }; QuestionCheckboxModel.prototype.isAnswerCorrect = function () { return _helpers__WEBPACK_IMPORTED_MODULE_3__["Helpers"].isArrayContainsEqual(this.value, this.correctAnswer); }; QuestionCheckboxModel.prototype.setDefaultValueWithOthers = function () { this.value = this.renderedValueFromDataCore(this.defaultValue); }; QuestionCheckboxModel.prototype.getHasOther = function (val) { if (!val || !Array.isArray(val)) return false; return val.indexOf(this.otherItem.value) >= 0; }; QuestionCheckboxModel.prototype.valueFromData = function (val) { if (!val) return val; if (!Array.isArray(val)) return [_super.prototype.valueFromData.call(this, val)]; var value = []; for (var i = 0; i < val.length; i++) { var choiceitem = _itemvalue__WEBPACK_IMPORTED_MODULE_4__["ItemValue"].getItemByValue(this.activeChoices, val[i]); if (!!choiceitem) { value.push(choiceitem.value); } else { value.push(val[i]); } } return value; }; QuestionCheckboxModel.prototype.renderedValueFromDataCore = function (val) { if (!val || !Array.isArray(val)) val = []; if (!this.hasActiveChoices) return val; for (var i = 0; i < val.length; i++) { if (val[i] == this.otherItem.value) return val; if (this.hasUnknownValue(val[i], true, false)) { this.comment = val[i]; var newVal = val.slice(); newVal[i] = this.otherItem.value; return newVal; } } return val; }; QuestionCheckboxModel.prototype.rendredValueToDataCore = function (val) { if (!val || !val.length) return val; for (var i = 0; i < val.length; i++) { if (val[i] == this.otherItem.value) { if (this.getQuestionComment()) { var newVal = val.slice(); newVal[i] = this.getQuestionComment(); return newVal; } } } return val; }; Object.defineProperty(QuestionCheckboxModel.prototype, "checkBoxSvgPath", { get: function () { return "M5,13l2-2l3,3l7-7l2,2l-9,9L5,13z"; }, enumerable: false, configurable: true }); QuestionCheckboxModel.prototype.getItemId = function (item) { return this.inputId + "_" + this.getItemIndex(item); }; return QuestionCheckboxModel; }(_question_baseselect__WEBPACK_IMPORTED_MODULE_2__["QuestionCheckboxBase"])); _jsonobject__WEBPACK_IMPORTED_MODULE_0__["Serializer"].addClass("checkbox", [ "hasSelectAll:boolean", { name: "maxSelectedChoices:number", default: 0 }, { name: "selectAllText", serializationProperty: "locSelectAllText", dependsOn: "hasSelectAll", visibleIf: function (obj) { return obj.hasSelectAll; } } ], function () { return new QuestionCheckboxModel(""); }, "checkboxbase"); _questionfactory__WEBPACK_IMPORTED_MODULE_1__["QuestionFactory"].Instance.registerQuestion("checkbox", function (name) { var q = new QuestionCheckboxModel(name); q.choices = _questionfactory__WEBPACK_IMPORTED_MODULE_1__["QuestionFactory"].DefaultChoices; return q; }); /***/ }), /***/ "./src/question_comment.ts": /*!*********************************!*\ !*** ./src/question_comment.ts ***! \*********************************/ /*! exports provided: QuestionCommentModel */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionCommentModel", function() { return QuestionCommentModel; }); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./questionfactory */ "./src/questionfactory.ts"); /* harmony import */ var _question_textbase__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./question_textbase */ "./src/question_textbase.ts"); /* harmony import */ var _utils_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils/utils */ "./src/utils/utils.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); /** * A Model for a comment question */ var QuestionCommentModel = /** @class */ (function (_super) { __extends(QuestionCommentModel, _super); function QuestionCommentModel() { return _super !== null && _super.apply(this, arguments) || this; } Object.defineProperty(QuestionCommentModel.prototype, "rows", { /** * The html rows attribute. */ get: function () { return this.getPropertyValue("rows"); }, set: function (val) { this.setPropertyValue("rows", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionCommentModel.prototype, "cols", { /** * The html cols attribute. */ get: function () { return this.getPropertyValue("cols"); }, set: function (val) { this.setPropertyValue("cols", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionCommentModel.prototype, "multiLine", { /** * Returns or sets a boolean that specifies whether a question can accept and display multiple lines of text. */ get: function () { return this.getPropertyValue("multiLine"); }, set: function (val) { this.setPropertyValue("multiLine", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionCommentModel.prototype, "autoGrow", { /** * Specifies whether the question's text area automatically expands its height to avoid the vertical scrollbar and to display the entire multi-line contents entered by respondents. * Default value is false. * @see SurveyModel.autoGrowComment */ get: function () { return this.getPropertyValue("autoGrow") || (this.survey && this.survey.autoGrowComment); }, set: function (val) { this.setPropertyValue("autoGrow", val); }, enumerable: false, configurable: true }); QuestionCommentModel.prototype.getType = function () { return "comment"; }; QuestionCommentModel.prototype.afterRenderQuestionElement = function (el) { this.element = document.getElementById(this.inputId) || el; this.updateElement(); _super.prototype.afterRenderQuestionElement.call(this, el); }; QuestionCommentModel.prototype.updateElement = function () { var _this = this; if (this.element && this.autoGrow) { setTimeout(function () { return Object(_utils_utils__WEBPACK_IMPORTED_MODULE_3__["increaseHeightByContent"])(_this.element); }, 1); } }; QuestionCommentModel.prototype.onInput = function (event) { if (this.isInputTextUpdate) this.value = event.target.value; else this.updateElement(); }; QuestionCommentModel.prototype.onKeyDown = function (event) { if (!this.multiLine && (event.key === "Enter" || event.keyCode === 13)) { event.preventDefault(); event.stopPropagation(); } }; QuestionCommentModel.prototype.onValueChanged = function () { _super.prototype.onValueChanged.call(this); this.updateElement(); }; QuestionCommentModel.prototype.setNewValue = function (newValue) { if (!this.multiLine) { // eslint-disable-next-line no-control-regex newValue = newValue.replace(new RegExp("(\r\n|\n|\r)", "gm"), ""); } _super.prototype.setNewValue.call(this, newValue); }; return QuestionCommentModel; }(_question_textbase__WEBPACK_IMPORTED_MODULE_2__["QuestionTextBase"])); _jsonobject__WEBPACK_IMPORTED_MODULE_0__["Serializer"].addClass("comment", [ { name: "maxLength:number", default: -1 }, { name: "cols:number", default: 50 }, { name: "rows:number", default: 4 }, { name: "placeHolder", serializationProperty: "locPlaceHolder" }, { name: "textUpdateMode", default: "default", choices: ["default", "onBlur", "onTyping"], }, { name: "autoGrow:boolean" }, { name: "multiLine:boolean", default: true } ], function () { return new QuestionCommentModel(""); }, "textbase"); _questionfactory__WEBPACK_IMPORTED_MODULE_1__["QuestionFactory"].Instance.registerQuestion("comment", function (name) { return new QuestionCommentModel(name); }); /***/ }), /***/ "./src/question_custom.ts": /*!********************************!*\ !*** ./src/question_custom.ts ***! \********************************/ /*! exports provided: ComponentQuestionJSON, ComponentCollection, QuestionCustomModelBase, QuestionCustomModel, QuestionCompositeModel */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ComponentQuestionJSON", function() { return ComponentQuestionJSON; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ComponentCollection", function() { return ComponentCollection; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionCustomModelBase", function() { return QuestionCustomModelBase; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionCustomModel", function() { return QuestionCustomModel; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionCompositeModel", function() { return QuestionCompositeModel; }); /* harmony import */ var _question__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./question */ "./src/question.ts"); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _survey_element__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./survey-element */ "./src/survey-element.ts"); /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ "./src/helpers.ts"); /* harmony import */ var _textPreProcessor__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./textPreProcessor */ "./src/textPreProcessor.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var ComponentQuestionJSON = /** @class */ (function () { function ComponentQuestionJSON(name, json) { this.name = name; this.json = json; var self = this; _jsonobject__WEBPACK_IMPORTED_MODULE_1__["Serializer"].addClass(name, [], function (json) { return ComponentCollection.Instance.createQuestion(!!json ? json.name : "", self); }, "question"); this.onInit(); } ComponentQuestionJSON.prototype.onInit = function () { if (!this.json.onInit) return; this.json.onInit(); }; ComponentQuestionJSON.prototype.onCreated = function (question) { if (!this.json.onCreated) return; this.json.onCreated(question); }; ComponentQuestionJSON.prototype.onLoaded = function (question) { if (!this.json.onLoaded) return; this.json.onLoaded(question); }; ComponentQuestionJSON.prototype.onAfterRender = function (question, htmlElement) { if (!this.json.onAfterRender) return; this.json.onAfterRender(question, htmlElement); }; ComponentQuestionJSON.prototype.onAfterRenderContentElement = function (question, element, htmlElement) { if (!this.json.onAfterRenderContentElement) return; this.json.onAfterRenderContentElement(question, element, htmlElement); }; ComponentQuestionJSON.prototype.onPropertyChanged = function (question, propertyName, newValue) { if (!this.json.onPropertyChanged) return; this.json.onPropertyChanged(question, propertyName, newValue); }; ComponentQuestionJSON.prototype.onValueChanged = function (question, name, newValue) { if (!this.json.onValueChanged) return; this.json.onValueChanged(question, name, newValue); }; ComponentQuestionJSON.prototype.onItemValuePropertyChanged = function (question, item, propertyName, name, newValue) { if (!this.json.onItemValuePropertyChanged) return; this.json.onItemValuePropertyChanged(question, { obj: item, propertyName: propertyName, name: name, newValue: newValue, }); }; ComponentQuestionJSON.prototype.getDisplayValue = function (keyAsText, value, question) { if (!this.json.getDisplayValue) return question.getDisplayValue(keyAsText, value); return this.json.getDisplayValue(question); }; Object.defineProperty(ComponentQuestionJSON.prototype, "isComposite", { get: function () { return !!this.json.elementsJSON || !!this.json.createElements; }, enumerable: false, configurable: true }); return ComponentQuestionJSON; }()); var ComponentCollection = /** @class */ (function () { function ComponentCollection() { this.customQuestionValues = []; } ComponentCollection.prototype.add = function (json) { if (!json) return; var name = json.name; if (!name) { throw "Attribute name is missed"; } name = name.toLowerCase(); if (!!this.getCustomQuestionByName(name)) { throw "There is already registered custom question with name '" + name + "'"; } if (!!_jsonobject__WEBPACK_IMPORTED_MODULE_1__["Serializer"].findClass(name)) { throw "There is already class with name '" + name + "'"; } var customQuestion = new ComponentQuestionJSON(name, json); if (!!this.onAddingJson) this.onAddingJson(name, customQuestion.isComposite); this.customQuestionValues.push(customQuestion); }; Object.defineProperty(ComponentCollection.prototype, "items", { get: function () { return this.customQuestionValues; }, enumerable: false, configurable: true }); ComponentCollection.prototype.getCustomQuestionByName = function (name) { for (var i = 0; i < this.customQuestionValues.length; i++) { if (this.customQuestionValues[i].name == name) return this.customQuestionValues[i]; } return null; }; ComponentCollection.prototype.clear = function () { for (var i = 0; i < this.customQuestionValues.length; i++) { _jsonobject__WEBPACK_IMPORTED_MODULE_1__["Serializer"].removeClass(this.customQuestionValues[i].name); } this.customQuestionValues = []; }; ComponentCollection.prototype.createQuestion = function (name, questionJSON) { if (!!questionJSON.isComposite) return this.createCompositeModel(name, questionJSON); return this.createCustomModel(name, questionJSON); }; ComponentCollection.prototype.createCompositeModel = function (name, questionJSON) { if (!!this.onCreateComposite) return this.onCreateComposite(name, questionJSON); return new QuestionCompositeModel(name, questionJSON); }; ComponentCollection.prototype.createCustomModel = function (name, questionJSON) { if (!!this.onCreateCustom) return this.onCreateCustom(name, questionJSON); return new QuestionCustomModel(name, questionJSON); }; ComponentCollection.Instance = new ComponentCollection(); return ComponentCollection; }()); var QuestionCustomModelBase = /** @class */ (function (_super) { __extends(QuestionCustomModelBase, _super); function QuestionCustomModelBase(name, customQuestion) { var _this = _super.call(this, name) || this; _this.customQuestion = customQuestion; _jsonobject__WEBPACK_IMPORTED_MODULE_1__["CustomPropertiesCollection"].createProperties(_this); _survey_element__WEBPACK_IMPORTED_MODULE_2__["SurveyElement"].CreateDisabledDesignElements = true; _this.createWrapper(); _survey_element__WEBPACK_IMPORTED_MODULE_2__["SurveyElement"].CreateDisabledDesignElements = false; if (!!_this.customQuestion) { _this.customQuestion.onCreated(_this); } return _this; } QuestionCustomModelBase.prototype.getType = function () { return !!this.customQuestion ? this.customQuestion.name : "custom"; }; QuestionCustomModelBase.prototype.locStrsChanged = function () { _super.prototype.locStrsChanged.call(this); if (!!this.getElement()) { this.getElement().locStrsChanged(); } }; QuestionCustomModelBase.prototype.createWrapper = function () { }; QuestionCustomModelBase.prototype.onPropertyValueChanged = function (name, oldValue, newValue) { _super.prototype.onPropertyValueChanged.call(this, name, oldValue, newValue); if (!!this.customQuestion && !this.isLoadingFromJson) { this.customQuestion.onPropertyChanged(this, name, newValue); } }; QuestionCustomModelBase.prototype.itemValuePropertyChanged = function (item, name, oldValue, newValue) { _super.prototype.itemValuePropertyChanged.call(this, item, name, oldValue, newValue); if (!!this.customQuestion && !this.isLoadingFromJson) { this.customQuestion.onItemValuePropertyChanged(this, item, item.ownerPropertyName, name, newValue); } }; QuestionCustomModelBase.prototype.onFirstRendering = function () { var el = this.getElement(); if (!!el) { el.onFirstRendering(); } _super.prototype.onFirstRendering.call(this); }; QuestionCustomModelBase.prototype.initElement = function (el) { if (!el) return; el.setSurveyImpl(this); el.disableDesignActions = true; }; QuestionCustomModelBase.prototype.setSurveyImpl = function (value) { _super.prototype.setSurveyImpl.call(this, value); this.initElement(this.getElement()); }; QuestionCustomModelBase.prototype.onSurveyLoad = function () { _super.prototype.onSurveyLoad.call(this); if (!!this.getElement()) { this.getElement().onSurveyLoad(); this.customQuestion.onLoaded(this); } }; QuestionCustomModelBase.prototype.afterRenderQuestionElement = function (el) { //Do nothing }; QuestionCustomModelBase.prototype.afterRender = function (el) { _super.prototype.afterRender.call(this, el); if (!!this.customQuestion) { this.customQuestion.onAfterRender(this, el); } }; QuestionCustomModelBase.prototype.setQuestionValue = function (newValue, updateIsAnswered) { if (updateIsAnswered === void 0) { updateIsAnswered = true; } _super.prototype.setQuestionValue.call(this, newValue, updateIsAnswered); this.updateElementCss(); }; QuestionCustomModelBase.prototype.setNewValue = function (newValue) { _super.prototype.setNewValue.call(this, newValue); this.updateElementCss(); }; //ISurveyImpl QuestionCustomModelBase.prototype.getSurveyData = function () { return this; }; // getSurvey(): ISurvey { // return this.survey; // } QuestionCustomModelBase.prototype.getTextProcessor = function () { return this.textProcessor; }; //ISurveyData QuestionCustomModelBase.prototype.getValue = function (name) { return this.value; }; QuestionCustomModelBase.prototype.setValue = function (name, newValue, locNotification, allowNotifyValueChanged) { if (!this.data) return; var newName = this.convertDataName(name); this.data.setValue(newName, this.convertDataValue(name, newValue), locNotification, allowNotifyValueChanged); this.updateIsAnswered(); this.updateElementCss(); if (!!this.customQuestion) { this.customQuestion.onValueChanged(this, name, newValue); } }; QuestionCustomModelBase.prototype.convertDataName = function (name) { return this.getValueName(); }; QuestionCustomModelBase.prototype.convertDataValue = function (name, newValue) { return newValue; }; QuestionCustomModelBase.prototype.getVariable = function (name) { return !!this.data ? this.data.getVariable(name) : null; }; QuestionCustomModelBase.prototype.setVariable = function (name, newValue) { if (!this.data) return; this.data.setVariable(name, newValue); }; QuestionCustomModelBase.prototype.getComment = function (name) { return !!this.data ? this.data.getComment(this.getValueName()) : ""; }; QuestionCustomModelBase.prototype.setComment = function (name, newValue, locNotification) { if (!this.data) return; this.data.setComment(this.getValueName(), newValue, locNotification); }; QuestionCustomModelBase.prototype.getAllValues = function () { return !!this.data ? this.data.getAllValues() : {}; }; QuestionCustomModelBase.prototype.getFilteredValues = function () { return !!this.data ? this.data.getFilteredValues() : {}; }; QuestionCustomModelBase.prototype.getFilteredProperties = function () { return !!this.data ? this.data.getFilteredProperties() : {}; }; //IPanel QuestionCustomModelBase.prototype.addElement = function (element, index) { }; QuestionCustomModelBase.prototype.removeElement = function (element) { return false; }; QuestionCustomModelBase.prototype.getQuestionTitleLocation = function () { return "left"; }; QuestionCustomModelBase.prototype.getQuestionStartIndex = function () { return this.getStartIndex(); }; QuestionCustomModelBase.prototype.getChildrenLayoutType = function () { return "row"; }; QuestionCustomModelBase.prototype.elementWidthChanged = function (el) { }; Object.defineProperty(QuestionCustomModelBase.prototype, "elements", { get: function () { return []; }, enumerable: false, configurable: true }); QuestionCustomModelBase.prototype.indexOf = function (el) { return -1; }; QuestionCustomModelBase.prototype.ensureRowsVisibility = function () { // do nothing }; QuestionCustomModelBase.prototype.getContentDisplayValueCore = function (keyAsText, value, question) { if (!question) return _super.prototype.getDisplayValueCore.call(this, keyAsText, value); return this.customQuestion.getDisplayValue(keyAsText, value, question); }; return QuestionCustomModelBase; }(_question__WEBPACK_IMPORTED_MODULE_0__["Question"])); var QuestionCustomModel = /** @class */ (function (_super) { __extends(QuestionCustomModel, _super); function QuestionCustomModel() { return _super !== null && _super.apply(this, arguments) || this; } QuestionCustomModel.prototype.getTemplate = function () { return "custom"; }; QuestionCustomModel.prototype.createWrapper = function () { this.questionWrapper = this.createQuestion(); }; QuestionCustomModel.prototype.getElement = function () { return this.contentQuestion; }; QuestionCustomModel.prototype.onAnyValueChanged = function (name) { _super.prototype.onAnyValueChanged.call(this, name); if (!!this.contentQuestion) { this.contentQuestion.onAnyValueChanged(name); } }; QuestionCustomModel.prototype.hasErrors = function (fireCallback, rec) { if (fireCallback === void 0) { fireCallback = true; } if (rec === void 0) { rec = null; } if (!this.contentQuestion) return false; var res = this.contentQuestion.hasErrors(fireCallback, rec); this.errors = []; for (var i = 0; i < this.contentQuestion.errors.length; i++) { this.errors.push(this.contentQuestion.errors[i]); } if (!res) { res = _super.prototype.hasErrors.call(this, fireCallback, rec); } this.updateElementCss(); return res; }; QuestionCustomModel.prototype.focus = function (onError) { if (onError === void 0) { onError = false; } if (!!this.contentQuestion) { this.contentQuestion.focus(onError); } else { _super.prototype.focus.call(this, onError); } }; Object.defineProperty(QuestionCustomModel.prototype, "contentQuestion", { get: function () { return this.questionWrapper; }, enumerable: false, configurable: true }); QuestionCustomModel.prototype.createQuestion = function () { var json = this.customQuestion.json; var res = null; if (!!json.questionJSON) { var qType = json.questionJSON.type; if (!qType || !_jsonobject__WEBPACK_IMPORTED_MODULE_1__["Serializer"].findClass(qType)) throw "type attribute in questionJSON is empty or incorrect"; res = _jsonobject__WEBPACK_IMPORTED_MODULE_1__["Serializer"].createClass(qType); this.initElement(res); res.fromJSON(json.questionJSON); } else { if (!!json.createQuestion) { res = json.createQuestion(); this.initElement(res); } } if (!!res && !res.name) { res.name = "question"; } return res; }; QuestionCustomModel.prototype.onSurveyLoad = function () { _super.prototype.onSurveyLoad.call(this); if (!this.contentQuestion) return; if (this.isEmpty() && !this.contentQuestion.isEmpty()) { this.value = this.contentQuestion.value; } }; QuestionCustomModel.prototype.runCondition = function (values, properties) { _super.prototype.runCondition.call(this, values, properties); if (!!this.contentQuestion) { this.contentQuestion.runCondition(values, properties); } }; QuestionCustomModel.prototype.convertDataName = function (name) { if (!this.contentQuestion) return _super.prototype.convertDataName.call(this, name); var newName = name.replace(this.contentQuestion.getValueName(), this.getValueName()); return newName.indexOf(this.getValueName()) == 0 ? newName : _super.prototype.convertDataName.call(this, name); }; QuestionCustomModel.prototype.convertDataValue = function (name, newValue) { return this.convertDataName(name) == _super.prototype.convertDataName.call(this, name) ? this.contentQuestion.value : newValue; }; QuestionCustomModel.prototype.setQuestionValue = function (newValue, updateIsAnswered) { if (updateIsAnswered === void 0) { updateIsAnswered = true; } _super.prototype.setQuestionValue.call(this, newValue, updateIsAnswered); if (!!this.contentQuestion && !this.isTwoValueEquals(this.contentQuestion.value, newValue)) { this.contentQuestion.value = this.getUnbindValue(newValue); } }; QuestionCustomModel.prototype.onSurveyValueChanged = function (newValue) { _super.prototype.onSurveyValueChanged.call(this, newValue); if (!!this.contentQuestion) { this.contentQuestion.onSurveyValueChanged(newValue); } }; QuestionCustomModel.prototype.getValueCore = function () { if (!!this.contentQuestion) return this.contentQuestion.value; return _super.prototype.getValueCore.call(this); }; QuestionCustomModel.prototype.initElement = function (el) { var _this = this; _super.prototype.initElement.call(this, el); if (!!el) { el.parent = this; el.afterRenderQuestionCallback = function (question, element) { if (!!_this.customQuestion) { _this.customQuestion.onAfterRenderContentElement(_this, question, element); } }; } }; QuestionCustomModel.prototype.updateElementCssCore = function (cssClasses) { if (!!this.contentQuestion) { cssClasses = this.contentQuestion.cssClasses; } _super.prototype.updateElementCssCore.call(this, cssClasses); }; QuestionCustomModel.prototype.getDisplayValueCore = function (keyAsText, value) { return _super.prototype.getContentDisplayValueCore.call(this, keyAsText, value, this.contentQuestion); }; return QuestionCustomModel; }(QuestionCustomModelBase)); var QuestionCompositeTextProcessor = /** @class */ (function (_super) { __extends(QuestionCompositeTextProcessor, _super); function QuestionCompositeTextProcessor(composite, variableName) { var _this = _super.call(this, variableName) || this; _this.composite = composite; _this.variableName = variableName; return _this; } Object.defineProperty(QuestionCompositeTextProcessor.prototype, "survey", { get: function () { return this.composite.survey; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionCompositeTextProcessor.prototype, "panel", { get: function () { return this.composite.contentPanel; }, enumerable: false, configurable: true }); return QuestionCompositeTextProcessor; }(_textPreProcessor__WEBPACK_IMPORTED_MODULE_4__["QuestionTextProcessor"])); var QuestionCompositeModel = /** @class */ (function (_super) { __extends(QuestionCompositeModel, _super); function QuestionCompositeModel(name, customQuestion) { var _this = _super.call(this, name, customQuestion) || this; _this.customQuestion = customQuestion; _this.settingNewValue = false; _this.textProcessing = new QuestionCompositeTextProcessor(_this, QuestionCompositeModel.ItemVariableName); return _this; } QuestionCompositeModel.prototype.createWrapper = function () { this.panelWrapper = this.createPanel(); }; QuestionCompositeModel.prototype.getTemplate = function () { return "composite"; }; QuestionCompositeModel.prototype.getCssType = function () { return "composite"; }; QuestionCompositeModel.prototype.getElement = function () { return this.contentPanel; }; Object.defineProperty(QuestionCompositeModel.prototype, "contentPanel", { get: function () { return this.panelWrapper; }, enumerable: false, configurable: true }); QuestionCompositeModel.prototype.hasErrors = function (fireCallback, rec) { if (fireCallback === void 0) { fireCallback = true; } if (rec === void 0) { rec = null; } var res = _super.prototype.hasErrors.call(this, fireCallback, rec); if (!this.contentPanel) return res; return this.contentPanel.hasErrors(fireCallback, false, rec) || res; }; QuestionCompositeModel.prototype.updateElementCss = function (reNew) { _super.prototype.updateElementCss.call(this, reNew); if (this.contentPanel) { this.contentPanel.updateElementCss(reNew); } }; QuestionCompositeModel.prototype.getTextProcessor = function () { return this.textProcessing; }; QuestionCompositeModel.prototype.clearValueIfInvisible = function () { _super.prototype.clearValueIfInvisible.call(this); var questions = this.contentPanel.questions; for (var i = 0; i < questions.length; i++) { questions[i].clearValueIfInvisible(); } }; QuestionCompositeModel.prototype.onAnyValueChanged = function (name) { _super.prototype.onAnyValueChanged.call(this, name); var questions = this.contentPanel.questions; for (var i = 0; i < questions.length; i++) { questions[i].onAnyValueChanged(name); } }; QuestionCompositeModel.prototype.createPanel = function () { var res = _jsonobject__WEBPACK_IMPORTED_MODULE_1__["Serializer"].createClass("panel"); res.showQuestionNumbers = "off"; res.renderWidth = "100%"; var json = this.customQuestion.json; if (!!json.elementsJSON) { res.fromJSON({ elements: json.elementsJSON }); } if (!!json.createElements) { json.createElements(res, this); } this.initElement(res); res.readOnly = this.isReadOnly; this.setAfterRenderCallbacks(res); return res; }; QuestionCompositeModel.prototype.onReadOnlyChanged = function () { if (!!this.contentPanel) { this.contentPanel.readOnly = this.isReadOnly; } _super.prototype.onReadOnlyChanged.call(this); }; QuestionCompositeModel.prototype.onSurveyLoad = function () { if (!!this.contentPanel) { this.contentPanel.readOnly = this.isReadOnly; this.setIsContentElement(this.contentPanel); } _super.prototype.onSurveyLoad.call(this); if (!!this.contentPanel) { var val = this.contentPanel.getValue(); if (!_helpers__WEBPACK_IMPORTED_MODULE_3__["Helpers"].isValueEmpty(val)) { this.value = val; } } }; QuestionCompositeModel.prototype.setIsContentElement = function (panel) { panel.isContentElement = true; var elements = panel.elements; for (var i = 0; i < elements.length; i++) { var el = elements[i]; if (el.isPanel) { this.setIsContentElement(el); } else { el.isContentElement = true; } } }; QuestionCompositeModel.prototype.setVisibleIndex = function (val) { var res = _super.prototype.setVisibleIndex.call(this, val); if (this.isVisible && !!this.contentPanel) { res += this.contentPanel.setVisibleIndex(val); } return res; }; QuestionCompositeModel.prototype.runCondition = function (values, properties) { _super.prototype.runCondition.call(this, values, properties); if (!!this.contentPanel) { var oldComposite = values[QuestionCompositeModel.ItemVariableName]; values[QuestionCompositeModel.ItemVariableName] = this.contentPanel.getValue(); this.contentPanel.runCondition(values, properties); delete values[QuestionCompositeModel.ItemVariableName]; if (!!oldComposite) { values[QuestionCompositeModel.ItemVariableName] = oldComposite; } } }; QuestionCompositeModel.prototype.getValue = function (name) { var val = this.value; return !!val ? val[name] : null; }; QuestionCompositeModel.prototype.setValue = function (name, newValue, locNotification, allowNotifyValueChanged) { if (this.settingNewValue) return; _super.prototype.setValue.call(this, name, newValue, locNotification, allowNotifyValueChanged); if (!this.contentPanel) return; var q = this.contentPanel.getQuestionByName(name); if (!!q && !this.isTwoValueEquals(newValue, q.value)) { this.settingNewValue = true; q.value = newValue; this.settingNewValue = false; } }; QuestionCompositeModel.prototype.addConditionObjectsByContext = function (objects, context) { if (!this.contentPanel) return; var questions = this.contentPanel.questions; var prefixName = this.name; var prefixText = this.title; for (var i = 0; i < questions.length; i++) { objects.push({ name: prefixName + "." + questions[i].name, text: prefixText + "." + questions[i].title, question: questions[i], }); } }; QuestionCompositeModel.prototype.convertDataValue = function (name, newValue) { var val = this.value; if (!val) val = {}; if (this.isValueEmpty(newValue) && !this.isEditingSurveyElement) { delete val[name]; } else { val[name] = newValue; } return val; }; QuestionCompositeModel.prototype.setQuestionValue = function (newValue, updateIsAnswered) { if (updateIsAnswered === void 0) { updateIsAnswered = true; } _super.prototype.setQuestionValue.call(this, newValue, updateIsAnswered); this.settingNewValue = true; var questions = this.contentPanel.questions; for (var i = 0; i < questions.length; i++) { var key = questions[i].getValueName(); questions[i].value = !!newValue ? newValue[key] : undefined; } this.settingNewValue = false; }; QuestionCompositeModel.prototype.getDisplayValueCore = function (keyAsText, value) { return _super.prototype.getContentDisplayValueCore.call(this, keyAsText, value, this.contentPanel); }; QuestionCompositeModel.prototype.setAfterRenderCallbacks = function (panel) { var _this = this; if (!panel || !this.customQuestion) return; var questions = panel.questions; for (var i = 0; i < questions.length; i++) { questions[i].afterRenderQuestionCallback = function (question, element) { _this.customQuestion.onAfterRenderContentElement(_this, question, element); }; } }; QuestionCompositeModel.ItemVariableName = "composite"; return QuestionCompositeModel; }(QuestionCustomModelBase)); /***/ }), /***/ "./src/question_dropdown.ts": /*!**********************************!*\ !*** ./src/question_dropdown.ts ***! \**********************************/ /*! exports provided: QuestionDropdownModel */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionDropdownModel", function() { return QuestionDropdownModel; }); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./questionfactory */ "./src/questionfactory.ts"); /* harmony import */ var _question_baseselect__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./question_baseselect */ "./src/question_baseselect.ts"); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./surveyStrings */ "./src/surveyStrings.ts"); /* harmony import */ var _itemvalue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./itemvalue */ "./src/itemvalue.ts"); /* harmony import */ var _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils/cssClassBuilder */ "./src/utils/cssClassBuilder.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); /** * A Model for a dropdown question */ var QuestionDropdownModel = /** @class */ (function (_super) { __extends(QuestionDropdownModel, _super); function QuestionDropdownModel(name) { var _this = _super.call(this, name) || this; _this.minMaxChoices = []; _this.createLocalizableString("optionsCaption", _this); var self = _this; _this.registerFunctionOnPropertiesValueChanged(["choicesMin", "choicesMax", "choicesStep"], function () { self.onVisibleChoicesChanged(); }); return _this; } Object.defineProperty(QuestionDropdownModel.prototype, "showOptionsCaption", { /** * This flag controls whether to show options caption item ('Choose...'). */ get: function () { return this.getPropertyValue("showOptionsCaption"); }, set: function (val) { this.setPropertyValue("showOptionsCaption", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionDropdownModel.prototype, "optionsCaption", { /** * Use this property to set the options caption different from the default value. The default value is taken from localization strings. */ get: function () { return this.getLocalizableStringText("optionsCaption", _surveyStrings__WEBPACK_IMPORTED_MODULE_3__["surveyLocalization"].getString("optionsCaption")); }, set: function (val) { this.setLocalizableStringText("optionsCaption", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionDropdownModel.prototype, "locOptionsCaption", { get: function () { return this.getLocalizableString("optionsCaption"); }, enumerable: false, configurable: true }); QuestionDropdownModel.prototype.getType = function () { return "dropdown"; }; Object.defineProperty(QuestionDropdownModel.prototype, "selectedItem", { get: function () { if (this.isEmpty()) return null; return _itemvalue__WEBPACK_IMPORTED_MODULE_4__["ItemValue"].getItemByValue(this.visibleChoices, this.value); }, enumerable: false, configurable: true }); QuestionDropdownModel.prototype.supportGoNextPageAutomatic = function () { return true; }; QuestionDropdownModel.prototype.getChoices = function () { var items = _super.prototype.getChoices.call(this); if (this.choicesMax <= this.choicesMin) return items; var res = []; for (var i = 0; i < items.length; i++) { res.push(items[i]); } if (this.minMaxChoices.length === 0 || this.minMaxChoices.length !== (this.choicesMax - this.choicesMin) / this.choicesStep + 1) { this.minMaxChoices = []; for (var i = this.choicesMin; i <= this.choicesMax; i += this.choicesStep) { this.minMaxChoices.push(new _itemvalue__WEBPACK_IMPORTED_MODULE_4__["ItemValue"](i)); } } res = res.concat(this.minMaxChoices); return res; }; Object.defineProperty(QuestionDropdownModel.prototype, "choicesMin", { /** * Use this and choicesMax property to automatically add choices. For example choicesMin = 1 and choicesMax = 10 will generate ten additional choices from 1 to 10. * @see choicesMax * @see choicesStep */ get: function () { return this.getPropertyValue("choicesMin"); }, set: function (val) { this.setPropertyValue("choicesMin", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionDropdownModel.prototype, "choicesMax", { /** * Use this and choicesMax property to automatically add choices. For example choicesMin = 1 and choicesMax = 10 will generate ten additional choices from 1 to 10. * @see choicesMin * @see choicesStep */ get: function () { return this.getPropertyValue("choicesMax"); }, set: function (val) { this.setPropertyValue("choicesMax", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionDropdownModel.prototype, "choicesStep", { /** * The default value is 1. It tells the value of the iterator between choicesMin and choicesMax properties. * If choicesMin = 10, choicesMax = 30 and choicesStep = 10 then you will have only three additional choices: [10, 20, 30]. * @see choicesMin * @see choicesMax */ get: function () { return this.getPropertyValue("choicesStep"); }, set: function (val) { if (val < 1) val = 1; this.setPropertyValue("choicesStep", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionDropdownModel.prototype, "autoComplete", { /** * Dropdown auto complete */ get: function () { return this.getPropertyValue("autoComplete", ""); }, set: function (val) { this.setPropertyValue("autoComplete", val); }, enumerable: false, configurable: true }); QuestionDropdownModel.prototype.getControlClass = function () { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_5__["CssClassBuilder"]() .append(this.cssClasses.control) .append(this.cssClasses.onError, this.errors.length > 0) .append(this.cssClasses.controlDisabled, this.isReadOnly) .toString(); }; return QuestionDropdownModel; }(_question_baseselect__WEBPACK_IMPORTED_MODULE_2__["QuestionSelectBase"])); _jsonobject__WEBPACK_IMPORTED_MODULE_0__["Serializer"].addClass("dropdown", [ { name: "optionsCaption", serializationProperty: "locOptionsCaption" }, { name: "showOptionsCaption:boolean", default: true }, { name: "choicesMin:number", default: 0 }, { name: "choicesMax:number", default: 0 }, { name: "choicesStep:number", default: 1, minValue: 1 }, { name: "autoComplete", dataList: [ "name", "honorific-prefix", "given-name", "additional-name", "family-name", "honorific-suffix", "nickname", "organization-title", "username", "new-password", "current-password", "organization", "street-address", "address-line1", "address-line2", "address-line3", "address-level4", "address-level3", "address-level2", "address-level1", "country", "country-name", "postal-code", "cc-name", "cc-given-name", "cc-additional-name", "cc-family-name", "cc-number", "cc-exp", "cc-exp-month", "cc-exp-year", "cc-csc", "cc-type", "transaction-currency", "transaction-amount", "language", "bday", "bday-day", "bday-month", "bday-year", "sex", "url", "photo", "tel", "tel-country-code", "tel-national", "tel-area-code", "tel-local", "tel-local-prefix", "tel-local-suffix", "tel-extension", "email", "impp", ], }, ], function () { return new QuestionDropdownModel(""); }, "selectbase"); _questionfactory__WEBPACK_IMPORTED_MODULE_1__["QuestionFactory"].Instance.registerQuestion("dropdown", function (name) { var q = new QuestionDropdownModel(name); q.choices = _questionfactory__WEBPACK_IMPORTED_MODULE_1__["QuestionFactory"].DefaultChoices; return q; }); /***/ }), /***/ "./src/question_empty.ts": /*!*******************************!*\ !*** ./src/question_empty.ts ***! \*******************************/ /*! exports provided: QuestionEmptyModel */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionEmptyModel", function() { return QuestionEmptyModel; }); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _question__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./question */ "./src/question.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); /** * A Model for an question that renders empty "div" tag. It used as a base class for some custom widgets */ var QuestionEmptyModel = /** @class */ (function (_super) { __extends(QuestionEmptyModel, _super); function QuestionEmptyModel(name) { return _super.call(this, name) || this; } QuestionEmptyModel.prototype.getType = function () { return "empty"; }; return QuestionEmptyModel; }(_question__WEBPACK_IMPORTED_MODULE_1__["Question"])); _jsonobject__WEBPACK_IMPORTED_MODULE_0__["Serializer"].addClass("empty", [], function () { return new QuestionEmptyModel(""); }, "question"); /***/ }), /***/ "./src/question_expression.ts": /*!************************************!*\ !*** ./src/question_expression.ts ***! \************************************/ /*! exports provided: QuestionExpressionModel, getCurrecyCodes */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionExpressionModel", function() { return QuestionExpressionModel; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getCurrecyCodes", function() { return getCurrecyCodes; }); /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers */ "./src/helpers.ts"); /* harmony import */ var _question__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./question */ "./src/question.ts"); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./questionfactory */ "./src/questionfactory.ts"); /* harmony import */ var _conditions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./conditions */ "./src/conditions.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); /** * A Model for expression question. It is a read-only question. It calculates value based on epxression property. */ var QuestionExpressionModel = /** @class */ (function (_super) { __extends(QuestionExpressionModel, _super); function QuestionExpressionModel(name) { var _this = _super.call(this, name) || this; _this.createLocalizableString("format", _this); var self = _this; _this.registerFunctionOnPropertyValueChanged("expression", function () { if (self.expressionRunner) { self.expressionRunner = new _conditions__WEBPACK_IMPORTED_MODULE_4__["ExpressionRunner"](self.expression); } }); return _this; } QuestionExpressionModel.prototype.getType = function () { return "expression"; }; Object.defineProperty(QuestionExpressionModel.prototype, "hasInput", { get: function () { return false; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionExpressionModel.prototype, "format", { /** * Use this property to display the value in your own format. Make sure you have "{0}" substring in your string, to display the actual value. */ get: function () { return this.getLocalizableStringText("format", ""); }, set: function (val) { this.setLocalizableStringText("format", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionExpressionModel.prototype, "locFormat", { get: function () { return this.getLocalizableString("format"); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionExpressionModel.prototype, "expression", { /** * The Expression that used to calculate the question value. You may use standard operators like +, -, * and /, squares (). Here is the example of accessing the question value {questionname}. *
Example: "({quantity} * {price}) * (100 - {discount}) / 100" */ get: function () { return this.getPropertyValue("expression", ""); }, set: function (val) { this.setPropertyValue("expression", val); }, enumerable: false, configurable: true }); QuestionExpressionModel.prototype.locCalculation = function () { this.expressionIsRunning = true; }; QuestionExpressionModel.prototype.unlocCalculation = function () { this.expressionIsRunning = false; }; QuestionExpressionModel.prototype.runCondition = function (values, properties) { var _this = this; _super.prototype.runCondition.call(this, values, properties); if (!this.expression || this.expressionIsRunning || (!this.runIfReadOnly && this.isReadOnly)) return; this.locCalculation(); if (!this.expressionRunner) { this.expressionRunner = new _conditions__WEBPACK_IMPORTED_MODULE_4__["ExpressionRunner"](this.expression); } this.expressionRunner.onRunComplete = function (newValue) { if (!_helpers__WEBPACK_IMPORTED_MODULE_0__["Helpers"].isTwoValueEquals(newValue, _this.value)) { _this.value = newValue; } _this.unlocCalculation(); }; this.expressionRunner.run(values, properties); }; QuestionExpressionModel.prototype.canCollectErrors = function () { return true; }; QuestionExpressionModel.prototype.hasRequiredError = function () { return false; }; Object.defineProperty(QuestionExpressionModel.prototype, "maximumFractionDigits", { /** * The maximum number of fraction digits to use if displayStyle is not "none". Possible values are from 0 to 20. The default value is -1 and it means that this property is not used. */ get: function () { return this.getPropertyValue("maximumFractionDigits"); }, set: function (val) { if (val < -1 || val > 20) return; this.setPropertyValue("maximumFractionDigits", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionExpressionModel.prototype, "minimumFractionDigits", { /** * The minimum number of fraction digits to use if displayStyle is not "none". Possible values are from 0 to 20. The default value is -1 and it means that this property is not used. */ get: function () { return this.getPropertyValue("minimumFractionDigits"); }, set: function (val) { if (val < -1 || val > 20) return; this.setPropertyValue("minimumFractionDigits", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionExpressionModel.prototype, "runIfReadOnly", { get: function () { return this.runIfReadOnlyValue === true; }, set: function (val) { this.runIfReadOnlyValue = val; }, enumerable: false, configurable: true }); QuestionExpressionModel.prototype.getDisplayValueCore = function (keysAsText, value) { var val = this.isValueEmpty(value) ? this.defaultValue : value; var res = ""; if (!this.isValueEmpty(val)) { var str = this.getValueAsStr(val); res = !this.format ? str : this.format["format"](str); } if (!!this.survey) { res = this.survey.getExpressionDisplayValue(this, val, res); } return res; }; Object.defineProperty(QuestionExpressionModel.prototype, "displayStyle", { /** * You may set this property to "decimal", "currency", "percent" or "date". If you set it to "currency", you may use the currency property to display the value in currency different from USD. * @see currency */ get: function () { return this.getPropertyValue("displayStyle"); }, set: function (val) { this.setPropertyValue("displayStyle", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionExpressionModel.prototype, "currency", { /** * Use it to display the value in the currency differen from USD. The displayStype should be set to "currency". * @see displayStyle */ get: function () { return this.getPropertyValue("currency"); }, set: function (val) { if (getCurrecyCodes().indexOf(val) < 0) return; this.setPropertyValue("currency", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionExpressionModel.prototype, "useGrouping", { /** * Determines whether to display grouping separators. The default value is true. */ get: function () { return this.getPropertyValue("useGrouping"); }, set: function (val) { this.setPropertyValue("useGrouping", val); }, enumerable: false, configurable: true }); QuestionExpressionModel.prototype.getValueAsStr = function (val) { if (this.displayStyle == "date") { var d = new Date(val); if (!!d && !!d.toLocaleDateString) return d.toLocaleDateString(); } if (this.displayStyle != "none" && _helpers__WEBPACK_IMPORTED_MODULE_0__["Helpers"].isNumber(val)) { var locale = this.getLocale(); if (!locale) locale = "en"; var options = { style: this.displayStyle, currency: this.currency, useGrouping: this.useGrouping, }; if (this.maximumFractionDigits > -1) { options["maximumFractionDigits"] = this.maximumFractionDigits; } if (this.minimumFractionDigits > -1) { options["minimumFractionDigits"] = this.minimumFractionDigits; } return val.toLocaleString(locale, options); } return val.toString(); }; return QuestionExpressionModel; }(_question__WEBPACK_IMPORTED_MODULE_1__["Question"])); function getCurrecyCodes() { return [ "AED", "AFN", "ALL", "AMD", "ANG", "AOA", "ARS", "AUD", "AWG", "AZN", "BAM", "BBD", "BDT", "BGN", "BHD", "BIF", "BMD", "BND", "BOB", "BOV", "BRL", "BSD", "BTN", "BWP", "BYN", "BZD", "CAD", "CDF", "CHE", "CHF", "CHW", "CLF", "CLP", "CNY", "COP", "COU", "CRC", "CUC", "CUP", "CVE", "CZK", "DJF", "DKK", "DOP", "DZD", "EGP", "ERN", "ETB", "EUR", "FJD", "FKP", "GBP", "GEL", "GHS", "GIP", "GMD", "GNF", "GTQ", "GYD", "HKD", "HNL", "HRK", "HTG", "HUF", "IDR", "ILS", "INR", "IQD", "IRR", "ISK", "JMD", "JOD", "JPY", "KES", "KGS", "KHR", "KMF", "KPW", "KRW", "KWD", "KYD", "KZT", "LAK", "LBP", "LKR", "LRD", "LSL", "LYD", "MAD", "MDL", "MGA", "MKD", "MMK", "MNT", "MOP", "MRO", "MUR", "MVR", "MWK", "MXN", "MXV", "MYR", "MZN", "NAD", "NGN", "NIO", "NOK", "NPR", "NZD", "OMR", "PAB", "PEN", "PGK", "PHP", "PKR", "PLN", "PYG", "QAR", "RON", "RSD", "RUB", "RWF", "SAR", "SBD", "SCR", "SDG", "SEK", "SGD", "SHP", "SLL", "SOS", "SRD", "SSP", "STD", "SVC", "SYP", "SZL", "THB", "TJS", "TMT", "TND", "TOP", "TRY", "TTD", "TWD", "TZS", "UAH", "UGX", "USD", "USN", "UYI", "UYU", "UZS", "VEF", "VND", "VUV", "WST", "XAF", "XAG", "XAU", "XBA", "XBB", "XBC", "XBD", "XCD", "XDR", "XOF", "XPD", "XPF", "XPT", "XSU", "XTS", "XUA", "XXX", "YER", "ZAR", "ZMW", "ZWL", ]; } _jsonobject__WEBPACK_IMPORTED_MODULE_2__["Serializer"].addClass("expression", [ "expression:expression", { name: "format", serializationProperty: "locFormat" }, { name: "displayStyle", default: "none", choices: ["none", "decimal", "currency", "percent", "date"], }, { name: "currency", choices: function () { return getCurrecyCodes(); }, default: "USD", }, { name: "maximumFractionDigits:number", default: -1 }, { name: "minimumFractionDigits:number", default: -1 }, { name: "useGrouping:boolean", default: true }, { name: "enableIf", visible: false }, { name: "isRequired", visible: false }, { name: "readOnly", visible: false }, { name: "requiredErrorText", visible: false }, { name: "defaultValueExpression", visible: false }, { name: "defaultValue", visible: false }, { name: "correctAnswer", visible: false }, { name: "requiredIf", visible: false }, ], function () { return new QuestionExpressionModel(""); }, "question"); _questionfactory__WEBPACK_IMPORTED_MODULE_3__["QuestionFactory"].Instance.registerQuestion("expression", function (name) { return new QuestionExpressionModel(name); }); /***/ }), /***/ "./src/question_file.ts": /*!******************************!*\ !*** ./src/question_file.ts ***! \******************************/ /*! exports provided: QuestionFileModel */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionFileModel", function() { return QuestionFileModel; }); /* harmony import */ var _question__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./question */ "./src/question.ts"); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./questionfactory */ "./src/questionfactory.ts"); /* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./error */ "./src/error.ts"); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./surveyStrings */ "./src/surveyStrings.ts"); /* harmony import */ var _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils/cssClassBuilder */ "./src/utils/cssClassBuilder.ts"); /* harmony import */ var _utils_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/utils */ "./src/utils/utils.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; /** * A Model for a file question */ var QuestionFileModel = /** @class */ (function (_super) { __extends(QuestionFileModel, _super); function QuestionFileModel(name) { var _this = _super.call(this, name) || this; _this.isUploading = false; _this.isDragging = false; /** * The event is fired after question state has been changed. *
sender the question object that fires the event *
options.state new question state value. */ _this.onStateChanged = _this.addEvent(); _this.previewValue = []; //#region // web-based methods _this.onDragOver = function (event) { if (_this.isInputReadOnly) { event.returnValue = false; return false; } _this.isDragging = true; event.dataTransfer.dropEffect = "copy"; event.preventDefault(); }; _this.onDrop = function (event) { if (!_this.isInputReadOnly) { _this.isDragging = false; event.preventDefault(); var src = event.dataTransfer; _this.onChange(src); } }; _this.onDragLeave = function (event) { if (!_this.isInputReadOnly) { _this.isDragging = false; } }; _this.doChange = function (event) { var src = event.target || event.srcElement; _this.onChange(src); }; _this.doClean = function (event) { var src = event.target || event.srcElement; if (_this.needConfirmRemoveFile) { var isConfirmed = Object(_utils_utils__WEBPACK_IMPORTED_MODULE_6__["confirmAction"])(_this.confirmRemoveAllMessage); if (!isConfirmed) return; } src.parentElement.querySelectorAll("input")[0].value = ""; _this.clear(); }; _this.doDownloadFile = function (event, data) { if (Object(_utils_utils__WEBPACK_IMPORTED_MODULE_6__["detectIEOrEdge"])()) { event.preventDefault(); Object(_utils_utils__WEBPACK_IMPORTED_MODULE_6__["loadFileFromBase64"])(data.content, data.name); } }; return _this; } QuestionFileModel.prototype.getType = function () { return "file"; }; QuestionFileModel.prototype.clearOnDeletingContainer = function () { if (!this.survey) return; this.survey.clearFiles(this, this.name, this.value, null, function () { }); }; Object.defineProperty(QuestionFileModel.prototype, "showPreview", { /** * Set it to true, to show the preview for the image files. */ get: function () { return this.getPropertyValue("showPreview"); }, set: function (val) { this.setPropertyValue("showPreview", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionFileModel.prototype, "allowMultiple", { /** * Set it to true, to allow select multiple files. */ get: function () { return this.getPropertyValue("allowMultiple", false); }, set: function (val) { this.setPropertyValue("allowMultiple", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionFileModel.prototype, "imageHeight", { /** * The image height. */ get: function () { return this.getPropertyValue("imageHeight"); }, set: function (val) { this.setPropertyValue("imageHeight", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionFileModel.prototype, "imageWidth", { /** * The image width. */ get: function () { return this.getPropertyValue("imageWidth"); }, set: function (val) { this.setPropertyValue("imageWidth", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionFileModel.prototype, "acceptedTypes", { /** * Accepted file types. Passed to the 'accept' attribute of the file input tag. See https://www.w3schools.com/tags/att_input_accept.asp for more details. */ get: function () { return this.getPropertyValue("acceptedTypes"); }, set: function (val) { this.setPropertyValue("acceptedTypes", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionFileModel.prototype, "storeDataAsText", { /** * Set it to false if you do not want to serialize file content as text in the survey.data. * In this case, you have to write the code onUploadFiles event to store the file content. * @see SurveyModel.onUploadFiles */ get: function () { return this.getPropertyValue("storeDataAsText"); }, set: function (val) { this.setPropertyValue("storeDataAsText", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionFileModel.prototype, "waitForUpload", { /** * Set it to true if you want to wait until files will be uploaded to your server. */ get: function () { return this.getPropertyValue("waitForUpload"); }, set: function (val) { this.setPropertyValue("waitForUpload", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionFileModel.prototype, "allowImagesPreview", { /** * Set it to false if you want to disable images preview. */ get: function () { return this.getPropertyValue("allowImagesPreview"); }, set: function (val) { this.setPropertyValue("allowImagesPreview", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionFileModel.prototype, "maxSize", { /** * Use this property to setup the maximum allowed file size. */ get: function () { return this.getPropertyValue("maxSize"); }, set: function (val) { this.setPropertyValue("maxSize", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionFileModel.prototype, "needConfirmRemoveFile", { /** * Use this property to setup confirmation to remove file. */ get: function () { return this.getPropertyValue("needConfirmRemoveFile"); }, set: function (val) { this.setPropertyValue("needConfirmRemoveFile", val); }, enumerable: false, configurable: true }); /** * The remove file confirmation message. */ QuestionFileModel.prototype.getConfirmRemoveMessage = function (fileName) { return this.confirmRemoveMessage.format(fileName); }; Object.defineProperty(QuestionFileModel.prototype, "inputTitle", { /** * The input title value. */ get: function () { if (this.isUploading) return this.loadingFileTitle; if (this.isEmpty()) return this.chooseFileTitle; return " "; }, enumerable: false, configurable: true }); /** * Clear value programmatically. */ QuestionFileModel.prototype.clear = function (doneCallback) { var _this = this; if (!this.survey) return; this.survey.clearFiles(this, this.name, this.value, null, function (status, data) { if (status === "success") { _this.value = undefined; _this.errors = []; !!doneCallback && doneCallback(); } }); }; /** * Remove file item programmatically. */ QuestionFileModel.prototype.removeFile = function (content) { var _this = this; if (!this.survey) return; this.survey.clearFiles(this, this.name, this.value, content.name, function (status, data) { if (status === "success") { var oldValue = _this.value; if (Array.isArray(oldValue)) { _this.value = oldValue.filter(function (f) { return f.name !== content.name; }); } else { _this.value = undefined; } } }); }; /** * Load multiple files programmatically. * @param files */ QuestionFileModel.prototype.loadFiles = function (files) { var _this = this; if (!this.survey) { return; } this.errors = []; if (!this.allFilesOk(files)) { return; } this.stateChanged("loading"); var loadFilesProc = function () { var content = []; if (_this.storeDataAsText) { files.forEach(function (file) { var fileReader = new FileReader(); fileReader.onload = function (e) { content = content.concat([ { name: file.name, type: file.type, content: fileReader.result }, ]); if (content.length === files.length) { _this.value = (_this.value || []).concat(content); } }; fileReader.readAsDataURL(file); }); } else { if (_this.survey) { _this.survey.uploadFiles(_this, _this.name, files, function (status, data) { if (status === "error") { _this.stateChanged("error"); } if (status === "success") { _this.value = (_this.value || []).concat(data.map(function (r) { return { name: r.file.name, type: r.file.type, content: r.content, }; })); } }); } } }; if (this.allowMultiple) { loadFilesProc(); } else { this.clear(loadFilesProc); } }; QuestionFileModel.prototype.canPreviewImage = function (fileItem) { return this.allowImagesPreview && !!fileItem && this.isFileImage(fileItem); }; QuestionFileModel.prototype.setQuestionValue = function (newValue, updateIsAnswered) { var _this = this; if (updateIsAnswered === void 0) { updateIsAnswered = true; } _super.prototype.setQuestionValue.call(this, newValue, updateIsAnswered); this.previewValue = []; var state = (!Array.isArray(newValue) && !!newValue) || (Array.isArray(newValue) && newValue.length > 0) ? this.showPreview ? "loading" : "loaded" : "empty"; this.stateChanged(state); if (!this.showPreview || !newValue) return; var newValues = Array.isArray(newValue) ? newValue : !!newValue ? [newValue] : []; if (this.storeDataAsText) { newValues.forEach(function (value) { var content = value.content || value; _this.previewValue = _this.previewValue.concat([ { name: value.name, type: value.type, content: content, }, ]); }); if (state === "loading") this.stateChanged("loaded"); } else { newValues.forEach(function (value) { var content = value.content || value; if (_this.survey) { _this.survey.downloadFile(_this.name, value, function (status, data) { if (status === "success") { _this.previewValue = _this.previewValue.concat([ { content: data, name: value.name, type: value.type, }, ]); if (_this.previewValue.length === newValues.length) { _this.stateChanged("loaded"); } } else { _this.stateChanged("error"); } }); } }); } }; QuestionFileModel.prototype.onCheckForErrors = function (errors, isOnValueChanged) { _super.prototype.onCheckForErrors.call(this, errors, isOnValueChanged); if (this.isUploading && this.waitForUpload) { errors.push(new _error__WEBPACK_IMPORTED_MODULE_3__["UploadingFileError"](_surveyStrings__WEBPACK_IMPORTED_MODULE_4__["surveyLocalization"].getString("uploadingFile"), this)); } }; QuestionFileModel.prototype.stateChanged = function (state) { if (state === "loading") { this.isUploading = true; } if (state === "loaded") { this.isUploading = false; } if (state === "error") { this.isUploading = false; } this.currentState = state; this.onStateChanged.fire(this, { state: state }); }; QuestionFileModel.prototype.allFilesOk = function (files) { var _this = this; var errorLength = this.errors ? this.errors.length : 0; (files || []).forEach(function (file) { if (_this.maxSize > 0 && file.size > _this.maxSize) { _this.errors.push(new _error__WEBPACK_IMPORTED_MODULE_3__["ExceedSizeError"](_this.maxSize, _this)); } }); return errorLength === this.errors.length; }; QuestionFileModel.prototype.isFileImage = function (file) { if (!file) return false; var imagePrefix = "data:image"; var subStr = file.content && file.content.substr(0, imagePrefix.length); subStr = subStr && subStr.toLowerCase(); var result = subStr === imagePrefix || (!!file.type && file.type.toLowerCase().indexOf("image/") === 0); return result; }; QuestionFileModel.prototype.getPlainData = function (options) { if (options === void 0) { options = { includeEmpty: true, }; } var questionPlainData = _super.prototype.getPlainData.call(this, options); if (!!questionPlainData && !this.isEmpty()) { questionPlainData.isNode = false; var values = Array.isArray(this.value) ? this.value : [this.value]; questionPlainData.data = values.map(function (dataValue, index) { return { name: index, title: "File", value: (dataValue.content && dataValue.content) || dataValue, displayValue: (dataValue.name && dataValue.name) || dataValue, getString: function (val) { return typeof val === "object" ? JSON.stringify(val) : val; }, isNode: false, }; }); } return questionPlainData; }; QuestionFileModel.prototype.supportComment = function () { return true; }; QuestionFileModel.prototype.getChooseFileCss = function () { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_5__["CssClassBuilder"]() .append(this.cssClasses.chooseFile) .append(this.cssClasses.controlDisabled, this.isReadOnly) .toString(); }; QuestionFileModel.prototype.getReadOnlyFileCss = function () { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_5__["CssClassBuilder"]() .append("form-control") .append(this.cssClasses.placeholderInput) .toString(); }; QuestionFileModel.prototype.getFileDecoratorCss = function () { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_5__["CssClassBuilder"]() .append(this.cssClasses.fileDecorator) .append(this.cssClasses.fileDecoratorDrag, this.isDragging) .toString(); }; QuestionFileModel.prototype.onChange = function (src) { if (!window["FileReader"]) return; if (!src || !src.files || src.files.length < 1) return; var files = []; var allowCount = this.allowMultiple ? src.files.length : 1; for (var i = 0; i < allowCount; i++) { files.push(src.files[i]); } src.value = ""; this.loadFiles(files); }; QuestionFileModel.prototype.doRemoveFile = function (data) { if (this.needConfirmRemoveFile) { var isConfirmed = Object(_utils_utils__WEBPACK_IMPORTED_MODULE_6__["confirmAction"])(this.getConfirmRemoveMessage(data.name)); if (!isConfirmed) return; } this.removeFile(data); }; __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__["property"])() ], QuestionFileModel.prototype, "isDragging", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__["property"])({ defaultValue: "empty" }) ], QuestionFileModel.prototype, "currentState", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__["property"])({ defaultValue: _surveyStrings__WEBPACK_IMPORTED_MODULE_4__["surveyLocalization"].getString("confirmRemoveFile") }) ], QuestionFileModel.prototype, "confirmRemoveMessage", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__["property"])({ defaultValue: _surveyStrings__WEBPACK_IMPORTED_MODULE_4__["surveyLocalization"].getString("confirmRemoveAllFiles") }) ], QuestionFileModel.prototype, "confirmRemoveAllMessage", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__["property"])({ defaultValue: _surveyStrings__WEBPACK_IMPORTED_MODULE_4__["surveyLocalization"].getString("noFileChosen") }) ], QuestionFileModel.prototype, "noFileChosenCaption", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__["property"])({ defaultValue: _surveyStrings__WEBPACK_IMPORTED_MODULE_4__["surveyLocalization"].getString("chooseFileCaption") }) ], QuestionFileModel.prototype, "chooseButtonCaption", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__["property"])({ defaultValue: _surveyStrings__WEBPACK_IMPORTED_MODULE_4__["surveyLocalization"].getString("cleanCaption") }) ], QuestionFileModel.prototype, "cleanButtonCaption", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__["property"])({ defaultValue: _surveyStrings__WEBPACK_IMPORTED_MODULE_4__["surveyLocalization"].getString("removeFileCaption") }) ], QuestionFileModel.prototype, "removeFileCaption", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__["property"])({ defaultValue: _surveyStrings__WEBPACK_IMPORTED_MODULE_4__["surveyLocalization"].getString("loadingFile") }) ], QuestionFileModel.prototype, "loadingFileTitle", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__["property"])({ defaultValue: _surveyStrings__WEBPACK_IMPORTED_MODULE_4__["surveyLocalization"].getString("chooseFile") }) ], QuestionFileModel.prototype, "chooseFileTitle", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__["property"])({ defaultValue: _surveyStrings__WEBPACK_IMPORTED_MODULE_4__["surveyLocalization"].getString("fileDragAreaPlaceholder") }) ], QuestionFileModel.prototype, "dragAreaPlaceholder", void 0); return QuestionFileModel; }(_question__WEBPACK_IMPORTED_MODULE_0__["Question"])); _jsonobject__WEBPACK_IMPORTED_MODULE_1__["Serializer"].addClass("file", [ { name: "hasComment:switch", layout: "row" }, { name: "commentText", dependsOn: "hasComment", visibleIf: function (obj) { return obj.hasComment; }, serializationProperty: "locCommentText", layout: "row", }, { name: "showPreview:boolean", default: true }, "allowMultiple:boolean", { name: "allowImagesPreview:boolean", default: true }, "imageHeight", "imageWidth", "acceptedTypes", { name: "storeDataAsText:boolean", default: true }, { name: "waitForUpload:boolean", default: false }, { name: "maxSize:number", default: 0 }, { name: "defaultValue", visible: false }, { name: "correctAnswer", visible: false }, { name: "validators", visible: false }, { name: "needConfirmRemoveFile:boolean" }, ], function () { return new QuestionFileModel(""); }, "question"); _questionfactory__WEBPACK_IMPORTED_MODULE_2__["QuestionFactory"].Instance.registerQuestion("file", function (name) { return new QuestionFileModel(name); }); /***/ }), /***/ "./src/question_html.ts": /*!******************************!*\ !*** ./src/question_html.ts ***! \******************************/ /*! exports provided: QuestionHtmlModel */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionHtmlModel", function() { return QuestionHtmlModel; }); /* harmony import */ var _questionnonvalue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./questionnonvalue */ "./src/questionnonvalue.ts"); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./questionfactory */ "./src/questionfactory.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); /** * A Model for html question. Unlike other questions it doesn't have value and title. */ var QuestionHtmlModel = /** @class */ (function (_super) { __extends(QuestionHtmlModel, _super); function QuestionHtmlModel(name) { var _this = _super.call(this, name) || this; var locHtml = _this.createLocalizableString("html", _this); locHtml.onGetTextCallback = function (str) { return !!_this.survey && !_this.ignoreHtmlProgressing ? _this.survey.processHtml(str) : str; }; return _this; } QuestionHtmlModel.prototype.getType = function () { return "html"; }; Object.defineProperty(QuestionHtmlModel.prototype, "isCompositeQuestion", { get: function () { return true; }, enumerable: false, configurable: true }); QuestionHtmlModel.prototype.getProcessedText = function (text) { if (this.ignoreHtmlProgressing) return text; return _super.prototype.getProcessedText.call(this, text); }; Object.defineProperty(QuestionHtmlModel.prototype, "html", { /** * Set html to display it */ get: function () { return this.getLocalizableStringText("html", ""); }, set: function (val) { this.setLocalizableStringText("html", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionHtmlModel.prototype, "locHtml", { get: function () { return this.getLocalizableString("html"); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionHtmlModel.prototype, "processedHtml", { get: function () { return this.survey ? this.survey.processHtml(this.html) : this.html; }, enumerable: false, configurable: true }); return QuestionHtmlModel; }(_questionnonvalue__WEBPACK_IMPORTED_MODULE_0__["QuestionNonValue"])); _jsonobject__WEBPACK_IMPORTED_MODULE_1__["Serializer"].addClass("html", [{ name: "html:html", serializationProperty: "locHtml" }], function () { return new QuestionHtmlModel(""); }, "nonvalue"); _questionfactory__WEBPACK_IMPORTED_MODULE_2__["QuestionFactory"].Instance.registerQuestion("html", function (name) { return new QuestionHtmlModel(name); }); /***/ }), /***/ "./src/question_image.ts": /*!*******************************!*\ !*** ./src/question_image.ts ***! \*******************************/ /*! exports provided: QuestionImageModel */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionImageModel", function() { return QuestionImageModel; }); /* harmony import */ var _questionnonvalue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./questionnonvalue */ "./src/questionnonvalue.ts"); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./questionfactory */ "./src/questionfactory.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); /** * A Model for image question. This question hasn't any functionality and can be used to improve the appearance of the survey. */ var QuestionImageModel = /** @class */ (function (_super) { __extends(QuestionImageModel, _super); function QuestionImageModel(name) { var _this = _super.call(this, name) || this; _this.createLocalizableString("imageLink", _this, false); _this.createLocalizableString("text", _this, false); return _this; } QuestionImageModel.prototype.getType = function () { return "image"; }; Object.defineProperty(QuestionImageModel.prototype, "isCompositeQuestion", { get: function () { return false; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionImageModel.prototype, "imageLink", { /** * The image URL. */ get: function () { return this.getLocalizableStringText("imageLink"); }, set: function (val) { this.setLocalizableStringText("imageLink", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionImageModel.prototype, "locImageLink", { get: function () { return this.getLocalizableString("imageLink"); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionImageModel.prototype, "text", { /** * The image alt text. */ get: function () { return this.getLocalizableStringText("text"); }, set: function (val) { this.setLocalizableStringText("text", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionImageModel.prototype, "locText", { get: function () { return this.getLocalizableString("text"); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionImageModel.prototype, "imageHeight", { /** * The image height. */ get: function () { return this.getPropertyValue("imageHeight"); }, set: function (val) { this.setPropertyValue("imageHeight", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionImageModel.prototype, "imageWidth", { /** * The image width. */ get: function () { return this.getPropertyValue("imageWidth"); }, set: function (val) { this.setPropertyValue("imageWidth", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionImageModel.prototype, "imageFit", { /** * The image fit mode. */ get: function () { return this.getPropertyValue("imageFit"); }, set: function (val) { this.setPropertyValue("imageFit", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionImageModel.prototype, "contentMode", { /** * The content mode. */ get: function () { return this.getPropertyValue("contentMode"); }, set: function (val) { this.setPropertyValue("contentMode", val); if (val === "video") { this.showLabel = true; } }, enumerable: false, configurable: true }); return QuestionImageModel; }(_questionnonvalue__WEBPACK_IMPORTED_MODULE_0__["QuestionNonValue"])); _jsonobject__WEBPACK_IMPORTED_MODULE_1__["Serializer"].addClass("image", [ { name: "imageLink", serializationProperty: "locImageLink" }, { name: "text", serializationProperty: "locText" }, { name: "contentMode", default: "image", choices: ["image", "video"], }, { name: "imageFit", default: "contain", choices: ["none", "contain", "cover", "fill"], }, { name: "imageHeight:number", default: 150, minValue: 0 }, { name: "imageWidth:number", default: 200, minValue: 0 }, ], function () { return new QuestionImageModel(""); }, "nonvalue"); _questionfactory__WEBPACK_IMPORTED_MODULE_2__["QuestionFactory"].Instance.registerQuestion("image", function (name) { return new QuestionImageModel(name); }); /***/ }), /***/ "./src/question_imagepicker.ts": /*!*************************************!*\ !*** ./src/question_imagepicker.ts ***! \*************************************/ /*! exports provided: ImageItemValue, QuestionImagePickerModel */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ImageItemValue", function() { return ImageItemValue; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionImagePickerModel", function() { return QuestionImagePickerModel; }); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./questionfactory */ "./src/questionfactory.ts"); /* harmony import */ var _question_baseselect__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./question_baseselect */ "./src/question_baseselect.ts"); /* harmony import */ var _itemvalue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./itemvalue */ "./src/itemvalue.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var ImageItemValue = /** @class */ (function (_super) { __extends(ImageItemValue, _super); function ImageItemValue(value, text, typeName) { if (text === void 0) { text = null; } if (typeName === void 0) { typeName = "imageitemvalue"; } var _this = _super.call(this, value, text, typeName) || this; _this.typeName = typeName; _this.createLocalizableString("imageLink", _this, false); return _this; } ImageItemValue.prototype.getType = function () { return !!this.typeName ? this.typeName : "itemvalue"; }; Object.defineProperty(ImageItemValue.prototype, "imageLink", { /** * The image or video link property. */ get: function () { return this.getLocalizableStringText("imageLink"); }, set: function (val) { this.setLocalizableStringText("imageLink", val); }, enumerable: false, configurable: true }); Object.defineProperty(ImageItemValue.prototype, "locImageLink", { get: function () { return this.getLocalizableString("imageLink"); }, enumerable: false, configurable: true }); ImageItemValue.prototype.getLocale = function () { return !!this.locOwner ? this.locOwner.getLocale() : ""; }; ImageItemValue.prototype.getMarkdownHtml = function (text, name) { return !!this.locOwner ? this.locOwner.getMarkdownHtml(text, name) : text; }; ImageItemValue.prototype.getRenderer = function (name) { return !!this.locOwner ? this.locOwner.getRenderer(name) : null; }; ImageItemValue.prototype.getRendererContext = function (locStr) { return !!this.locOwner ? this.locOwner.getRendererContext(locStr) : locStr; }; ImageItemValue.prototype.getProcessedText = function (text) { return !!this.locOwner ? this.locOwner.getProcessedText(text) : text; }; return ImageItemValue; }(_itemvalue__WEBPACK_IMPORTED_MODULE_3__["ItemValue"])); /** * A Model for a select image question. */ var QuestionImagePickerModel = /** @class */ (function (_super) { __extends(QuestionImagePickerModel, _super); function QuestionImagePickerModel(name) { var _this = _super.call(this, name) || this; _this.colCount = 0; return _this; } QuestionImagePickerModel.prototype.getType = function () { return "imagepicker"; }; QuestionImagePickerModel.prototype.supportGoNextPageAutomatic = function () { return true; }; Object.defineProperty(QuestionImagePickerModel.prototype, "hasSingleInput", { get: function () { return false; }, enumerable: false, configurable: true }); QuestionImagePickerModel.prototype.getItemValueType = function () { return "imageitemvalue"; }; Object.defineProperty(QuestionImagePickerModel.prototype, "isCompositeQuestion", { get: function () { return true; }, enumerable: false, configurable: true }); QuestionImagePickerModel.prototype.supportOther = function () { return false; }; QuestionImagePickerModel.prototype.supportNone = function () { return false; }; Object.defineProperty(QuestionImagePickerModel.prototype, "multiSelect", { /** * Multi select option. If set to true, then allows to select multiple images. */ get: function () { return this.getPropertyValue("multiSelect"); }, set: function (newValue) { this.setPropertyValue("multiSelect", newValue); }, enumerable: false, configurable: true }); /** * Returns true if item is checked * @param item image picker item value */ QuestionImagePickerModel.prototype.isItemSelected = function (item) { var val = this.value; if (this.isValueEmpty(val)) return false; if (!this.multiSelect) return this.isTwoValueEquals(val, item.value); if (!Array.isArray(val)) return false; for (var i = 0; i < val.length; i++) { if (this.isTwoValueEquals(val[i], item.value)) return true; } return false; }; QuestionImagePickerModel.prototype.clearIncorrectValues = function () { if (this.multiSelect) { var val = this.value; if (!val) return; if (!Array.isArray(val) || val.length == 0) { this.clearValue(); return; } var newValue = []; for (var i = 0; i < val.length; i++) { if (!this.hasUnknownValue(val[i], true)) { newValue.push(val[i]); } } if (newValue.length == val.length) return; if (newValue.length == 0) { this.clearValue(); } else { this.value = newValue; } } else { _super.prototype.clearIncorrectValues.call(this); } }; Object.defineProperty(QuestionImagePickerModel.prototype, "showLabel", { /** * Show label under the image. */ get: function () { return this.getPropertyValue("showLabel"); }, set: function (newValue) { this.setPropertyValue("showLabel", newValue); }, enumerable: false, configurable: true }); QuestionImagePickerModel.prototype.endLoadingFromJson = function () { _super.prototype.endLoadingFromJson.call(this); if (!this.isDesignMode && this.multiSelect) { this.createNewArray("renderedValue"); this.createNewArray("value"); } }; QuestionImagePickerModel.prototype.getValueCore = function () { var value = _super.prototype.getValueCore.call(this); if (value !== undefined) { return value; } if (this.multiSelect) { return []; } return value; }; QuestionImagePickerModel.prototype.convertValToArrayForMultSelect = function (val) { if (!this.multiSelect) return val; if (this.isValueEmpty(val) || Array.isArray(val)) return val; return [val]; }; QuestionImagePickerModel.prototype.renderedValueFromDataCore = function (val) { return this.convertValToArrayForMultSelect(val); }; QuestionImagePickerModel.prototype.rendredValueToDataCore = function (val) { return this.convertValToArrayForMultSelect(val); }; Object.defineProperty(QuestionImagePickerModel.prototype, "imageHeight", { /** * The image height. */ get: function () { return this.getPropertyValue("imageHeight"); }, set: function (val) { this.setPropertyValue("imageHeight", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionImagePickerModel.prototype, "imageWidth", { /** * The image width. */ get: function () { return this.getPropertyValue("imageWidth"); }, set: function (val) { this.setPropertyValue("imageWidth", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionImagePickerModel.prototype, "imageFit", { /** * The image fit mode. */ get: function () { return this.getPropertyValue("imageFit"); }, set: function (val) { this.setPropertyValue("imageFit", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionImagePickerModel.prototype, "contentMode", { /** * The content mode. */ get: function () { return this.getPropertyValue("contentMode"); }, set: function (val) { this.setPropertyValue("contentMode", val); if (val === "video") { this.showLabel = true; } }, enumerable: false, configurable: true }); QuestionImagePickerModel.prototype.convertDefaultValue = function (val) { return val; }; Object.defineProperty(QuestionImagePickerModel.prototype, "hasColumns", { get: function () { return false; }, enumerable: false, configurable: true }); return QuestionImagePickerModel; }(_question_baseselect__WEBPACK_IMPORTED_MODULE_2__["QuestionCheckboxBase"])); _jsonobject__WEBPACK_IMPORTED_MODULE_0__["Serializer"].addClass("imageitemvalue", [], function (value) { return new ImageItemValue(value); }, "itemvalue"); _jsonobject__WEBPACK_IMPORTED_MODULE_0__["Serializer"].addProperty("imageitemvalue", { name: "imageLink", serializationProperty: "locImageLink", }); _jsonobject__WEBPACK_IMPORTED_MODULE_0__["Serializer"].addClass("imagepicker", [ { name: "hasOther", visible: false }, { name: "otherText", visible: false }, { name: "hasNone", visible: false }, { name: "noneText", visible: false }, { name: "optionsCaption", visible: false }, { name: "otherErrorText", visible: false }, { name: "storeOthersAsComment", visible: false }, { name: "contentMode", default: "image", choices: ["image", "video"], }, { name: "imageFit", default: "contain", choices: ["none", "contain", "cover", "fill"], }, { name: "imageHeight:number", default: 150, minValue: 0 }, { name: "imageWidth:number", default: 200, minValue: 0 }, ], function () { return new QuestionImagePickerModel(""); }, "checkboxbase"); _jsonobject__WEBPACK_IMPORTED_MODULE_0__["Serializer"].addProperty("imagepicker", { name: "showLabel:boolean", default: false, }); _jsonobject__WEBPACK_IMPORTED_MODULE_0__["Serializer"].addProperty("imagepicker", { name: "colCount:number", default: 0, choices: [0, 1, 2, 3, 4, 5], }); _jsonobject__WEBPACK_IMPORTED_MODULE_0__["Serializer"].addProperty("imagepicker", { name: "multiSelect:boolean", default: false, }); _jsonobject__WEBPACK_IMPORTED_MODULE_0__["Serializer"].addProperty("imagepicker", { name: "choices:imageitemvalue[]", }); _questionfactory__WEBPACK_IMPORTED_MODULE_1__["QuestionFactory"].Instance.registerQuestion("imagepicker", function (name) { var q = new QuestionImagePickerModel(name); //q.choices = QuestionFactory.DefaultChoices; return q; }); /***/ }), /***/ "./src/question_matrix.ts": /*!********************************!*\ !*** ./src/question_matrix.ts ***! \********************************/ /*! exports provided: MatrixRowModel, MatrixCells, QuestionMatrixModel */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatrixRowModel", function() { return MatrixRowModel; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatrixCells", function() { return MatrixCells; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixModel", function() { return QuestionMatrixModel; }); /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers */ "./src/helpers.ts"); /* harmony import */ var _itemvalue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./itemvalue */ "./src/itemvalue.ts"); /* harmony import */ var _martixBase__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./martixBase */ "./src/martixBase.ts"); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./base */ "./src/base.ts"); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./surveyStrings */ "./src/surveyStrings.ts"); /* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./error */ "./src/error.ts"); /* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./questionfactory */ "./src/questionfactory.ts"); /* harmony import */ var _localizablestring__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./localizablestring */ "./src/localizablestring.ts"); /* harmony import */ var _question_dropdown__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./question_dropdown */ "./src/question_dropdown.ts"); /* harmony import */ var _settings__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./settings */ "./src/settings.ts"); /* harmony import */ var _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./utils/cssClassBuilder */ "./src/utils/cssClassBuilder.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var MatrixRowModel = /** @class */ (function (_super) { __extends(MatrixRowModel, _super); function MatrixRowModel(item, fullName, data, value) { var _this = _super.call(this) || this; _this.fullName = fullName; _this.item = item; _this.data = data; _this.value = value; _this.cellClick = function (column) { _this.value = column.value; }; _this.registerFunctionOnPropertyValueChanged("value", function () { if (_this.data) _this.data.onMatrixRowChanged(_this); }); return _this; } Object.defineProperty(MatrixRowModel.prototype, "name", { get: function () { return this.item.value; }, enumerable: false, configurable: true }); Object.defineProperty(MatrixRowModel.prototype, "text", { get: function () { return this.item.text; }, enumerable: false, configurable: true }); Object.defineProperty(MatrixRowModel.prototype, "locText", { get: function () { return this.item.locText; }, enumerable: false, configurable: true }); Object.defineProperty(MatrixRowModel.prototype, "value", { get: function () { return this.getPropertyValue("value"); }, set: function (newValue) { newValue = this.data.getCorrectedRowValue(newValue); this.setPropertyValue("value", newValue); }, enumerable: false, configurable: true }); Object.defineProperty(MatrixRowModel.prototype, "rowClasses", { get: function () { var cssClasses = this.data.cssClasses; var hasError = !!this.data.getErrorByType("requiredinallrowserror"); return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_11__["CssClassBuilder"]().append(cssClasses.row) .append(cssClasses.rowError, hasError && this.isValueEmpty(this.value)) .toString(); }, enumerable: false, configurable: true }); return MatrixRowModel; }(_base__WEBPACK_IMPORTED_MODULE_4__["Base"])); var MatrixCells = /** @class */ (function () { function MatrixCells(cellsOwner) { this.cellsOwner = cellsOwner; this.values = {}; } Object.defineProperty(MatrixCells.prototype, "isEmpty", { get: function () { return Object.keys(this.values).length == 0; }, enumerable: false, configurable: true }); MatrixCells.prototype.setCellText = function (row, column, val) { row = this.getCellRowColumnValue(row, this.rows); column = this.getCellRowColumnValue(column, this.columns); if (!row || !column) return; if (val) { if (!this.values[row]) this.values[row] = {}; if (!this.values[row][column]) this.values[row][column] = this.createString(); this.values[row][column].text = val; } else { if (this.values[row] && this.values[row][column]) { var loc = this.values[row][column]; loc.text = ""; if (loc.isEmpty) { delete this.values[row][column]; if (Object.keys(this.values[row]).length == 0) { delete this.values[row]; } } } } }; MatrixCells.prototype.setDefaultCellText = function (column, val) { this.setCellText(_settings__WEBPACK_IMPORTED_MODULE_10__["settings"].matrixDefaultRowName, column, val); }; MatrixCells.prototype.getCellLocText = function (row, column) { row = this.getCellRowColumnValue(row, this.rows); column = this.getCellRowColumnValue(column, this.columns); if (!row || !column) return null; if (!this.values[row]) return null; if (!this.values[row][column]) return null; return this.values[row][column]; }; MatrixCells.prototype.getDefaultCellLocText = function (column, val) { return this.getCellLocText(_settings__WEBPACK_IMPORTED_MODULE_10__["settings"].matrixDefaultRowName, column); }; MatrixCells.prototype.getCellDisplayLocText = function (row, column) { var cellText = this.getCellLocText(row, column); if (cellText && !cellText.isEmpty) return cellText; cellText = this.getCellLocText(_settings__WEBPACK_IMPORTED_MODULE_10__["settings"].matrixDefaultRowName, column); if (cellText && !cellText.isEmpty) return cellText; if (typeof column == "number") { column = column >= 0 && column < this.columns.length ? this.columns[column] : null; } if (column && column.locText) return column.locText; return null; }; MatrixCells.prototype.getCellText = function (row, column) { var loc = this.getCellLocText(row, column); return loc ? loc.calculatedText : null; }; MatrixCells.prototype.getDefaultCellText = function (column) { var loc = this.getCellLocText(_settings__WEBPACK_IMPORTED_MODULE_10__["settings"].matrixDefaultRowName, column); return loc ? loc.calculatedText : null; }; MatrixCells.prototype.getCellDisplayText = function (row, column) { var loc = this.getCellDisplayLocText(row, column); return loc ? loc.calculatedText : null; }; Object.defineProperty(MatrixCells.prototype, "rows", { get: function () { return this.cellsOwner ? this.cellsOwner.getRows() : []; }, enumerable: false, configurable: true }); Object.defineProperty(MatrixCells.prototype, "columns", { get: function () { return this.cellsOwner ? this.cellsOwner.getColumns() : []; }, enumerable: false, configurable: true }); MatrixCells.prototype.getCellRowColumnValue = function (val, values) { if (val === null || val === undefined) return null; if (typeof val == "number") { if (val < 0 || val >= values.length) return null; val = values[val].value; } if (val.value) return val.value; return val; }; MatrixCells.prototype.getJson = function () { if (this.isEmpty) return null; var res = {}; for (var row in this.values) { var resRow = {}; var rowValues = this.values[row]; for (var col in rowValues) { resRow[col] = rowValues[col].getJson(); } res[row] = resRow; } return res; }; MatrixCells.prototype.setJson = function (value) { this.values = {}; if (!value) return; for (var row in value) { if (row == "pos") continue; var rowValues = value[row]; this.values[row] = {}; for (var col in rowValues) { if (col == "pos") continue; var loc = this.createString(); loc.setJson(rowValues[col]); this.values[row][col] = loc; } } }; MatrixCells.prototype.createString = function () { return new _localizablestring__WEBPACK_IMPORTED_MODULE_8__["LocalizableString"](this.cellsOwner, true); }; return MatrixCells; }()); /** * A Model for a simple matrix question. */ var QuestionMatrixModel = /** @class */ (function (_super) { __extends(QuestionMatrixModel, _super); function QuestionMatrixModel(name) { var _this = _super.call(this, name) || this; _this.isRowChanging = false; _this.emptyLocalizableString = new _localizablestring__WEBPACK_IMPORTED_MODULE_8__["LocalizableString"](_this); _this.cellsValue = new MatrixCells(_this); var self = _this; _this.registerFunctionOnPropertyValueChanged("columns", function () { self.onColumnsChanged(); }); _this.registerFunctionOnPropertyValueChanged("rows", function () { if (!self.filterItems()) { self.onRowsChanged(); } }); _this.registerFunctionOnPropertyValueChanged("hideIfRowsEmpty", function () { self.updateVisibilityBasedOnRows(); }); return _this; } QuestionMatrixModel.prototype.getType = function () { return "matrix"; }; Object.defineProperty(QuestionMatrixModel.prototype, "hasSingleInput", { get: function () { return false; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixModel.prototype, "isAllRowRequired", { /** * Set this property to true, if you want a user to answer all rows. */ get: function () { return this.getPropertyValue("isAllRowRequired", false); }, set: function (val) { this.setPropertyValue("isAllRowRequired", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixModel.prototype, "hasRows", { /** * Returns true, if there is at least one row. */ get: function () { return this.rows.length > 0; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixModel.prototype, "rowsOrder", { /** * Use this property to render items in a specific order: "random" or "initial". Default is "initial". */ get: function () { return this.getPropertyValue("rowsOrder"); }, set: function (val) { val = val.toLowerCase(); if (val == this.rowsOrder) return; this.setPropertyValue("rowsOrder", val); this.onRowsChanged(); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixModel.prototype, "hideIfRowsEmpty", { /** * Set this property to true to hide the question if there is no visible rows in the matrix. */ get: function () { return this.getPropertyValue("hideIfRowsEmpty", false); }, set: function (val) { this.setPropertyValue("hideIfRowsEmpty", val); }, enumerable: false, configurable: true }); QuestionMatrixModel.prototype.getRows = function () { return this.rows; }; QuestionMatrixModel.prototype.getColumns = function () { return this.visibleColumns; }; QuestionMatrixModel.prototype.addColumn = function (value, text) { var col = new _itemvalue__WEBPACK_IMPORTED_MODULE_1__["ItemValue"](value, text); this.columns.push(col); return col; }; QuestionMatrixModel.prototype.getItemClass = function (row, column) { var isChecked = row.value == column.value; var isDisabled = this.isReadOnly; var allowHover = !isChecked && !isDisabled; return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_11__["CssClassBuilder"]() .append(this.cssClasses.cell, this.hasCellText) .append(this.hasCellText ? this.cssClasses.cellText : this.cssClasses.label) .append(this.hasCellText ? this.cssClasses.cellTextSelected : this.cssClasses.itemChecked, isChecked) .append(this.hasCellText ? this.cssClasses.cellTextDisabled : this.cssClasses.itemDisabled, isDisabled) .append(this.cssClasses.itemHover, allowHover && !this.hasCellText) .toString(); }; QuestionMatrixModel.prototype.getQuizQuestionCount = function () { var res = 0; for (var i = 0; i < this.rows.length; i++) { if (!this.isValueEmpty(this.correctAnswer[this.rows[i].value])) res++; } return res; }; QuestionMatrixModel.prototype.getCorrectAnswerCount = function () { var res = 0; var value = this.value; for (var i = 0; i < this.rows.length; i++) { var row = this.rows[i].value; if (!this.isValueEmpty(value[row]) && this.isTwoValueEquals(this.correctAnswer[row], value[row])) res++; } return res; }; QuestionMatrixModel.prototype.getVisibleRows = function () { var result = new Array(); var val = this.value; if (!val) val = {}; var rows = !!this.filteredRows ? this.filteredRows : this.rows; for (var i = 0; i < rows.length; i++) { var row = rows[i]; if (this.isValueEmpty(row.value)) continue; result.push(this.createMatrixRow(row, this.id + "_" + row.value.toString().replace(/\s/g, "_"), val[row.value])); } if (result.length == 0 && !this.filteredRows) { result.push(this.createMatrixRow(new _itemvalue__WEBPACK_IMPORTED_MODULE_1__["ItemValue"](null), this.name.replace(/\s/g, "_"), val)); } this.generatedVisibleRows = result; return result; }; QuestionMatrixModel.prototype.sortVisibleRows = function (array) { var order = this.rowsOrder.toLowerCase(); if (order === "random") return _helpers__WEBPACK_IMPORTED_MODULE_0__["Helpers"].randomizeArray(array); return array; }; QuestionMatrixModel.prototype.endLoadingFromJson = function () { _super.prototype.endLoadingFromJson.call(this); this.rows = this.sortVisibleRows(this.rows); this.updateVisibilityBasedOnRows(); }; QuestionMatrixModel.prototype.processRowsOnSet = function (newRows) { return this.sortVisibleRows(newRows); }; Object.defineProperty(QuestionMatrixModel.prototype, "visibleRows", { /** * Returns the list of visible rows as model objects. * @see rowsVisibleIf */ get: function () { return this.getVisibleRows(); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixModel.prototype, "cells", { get: function () { return this.cellsValue; }, set: function (value) { this.cells.setJson(value && value.getJson ? value.getJson() : null); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixModel.prototype, "hasCellText", { get: function () { return !this.cells.isEmpty; }, enumerable: false, configurable: true }); QuestionMatrixModel.prototype.setCellText = function (row, column, val) { this.cells.setCellText(row, column, val); }; QuestionMatrixModel.prototype.getCellText = function (row, column) { return this.cells.getCellText(row, column); }; QuestionMatrixModel.prototype.setDefaultCellText = function (column, val) { this.cells.setDefaultCellText(column, val); }; QuestionMatrixModel.prototype.getDefaultCellText = function (column) { return this.cells.getDefaultCellText(column); }; QuestionMatrixModel.prototype.getCellDisplayText = function (row, column) { return this.cells.getCellDisplayText(row, column); }; QuestionMatrixModel.prototype.getCellDisplayLocText = function (row, column) { var loc = this.cells.getCellDisplayLocText(row, column); return loc ? loc : this.emptyLocalizableString; }; QuestionMatrixModel.prototype.supportGoNextPageAutomatic = function () { return this.hasValuesInAllRows(); }; QuestionMatrixModel.prototype.onCheckForErrors = function (errors, isOnValueChanged) { _super.prototype.onCheckForErrors.call(this, errors, isOnValueChanged); if ((!isOnValueChanged || this.errors.length > 0) && this.hasErrorInRows()) { errors.push(new _error__WEBPACK_IMPORTED_MODULE_6__["RequiredInAllRowsError"](null, this)); } }; QuestionMatrixModel.prototype.hasErrorInRows = function () { if (!this.isAllRowRequired) return false; return !this.hasValuesInAllRows(); }; QuestionMatrixModel.prototype.hasValuesInAllRows = function () { var rows = this.generatedVisibleRows; if (!rows) rows = this.visibleRows; if (!rows) return true; for (var i = 0; i < rows.length; i++) { if (this.isValueEmpty(rows[i].value)) return false; } return true; }; QuestionMatrixModel.prototype.getIsAnswered = function () { return _super.prototype.getIsAnswered.call(this) && this.hasValuesInAllRows(); }; QuestionMatrixModel.prototype.createMatrixRow = function (item, fullName, value) { var row = new MatrixRowModel(item, fullName, this, value); this.onMatrixRowCreated(row); return row; }; QuestionMatrixModel.prototype.onMatrixRowCreated = function (row) { }; QuestionMatrixModel.prototype.setQuestionValue = function (newValue, updateIsAnswered) { if (updateIsAnswered === void 0) { updateIsAnswered = true; } _super.prototype.setQuestionValue.call(this, newValue, this.isRowChanging || updateIsAnswered); if (!this.generatedVisibleRows || this.generatedVisibleRows.length == 0) return; this.isRowChanging = true; var val = this.value; if (!val) val = {}; if (this.rows.length == 0) { this.generatedVisibleRows[0].value = val; } else { for (var i = 0; i < this.generatedVisibleRows.length; i++) { var row = this.generatedVisibleRows[i]; var rowVal = val[row.name]; if (this.isValueEmpty(rowVal)) rowVal = null; this.generatedVisibleRows[i].value = rowVal; } } this.updateIsAnswered(); this.isRowChanging = false; }; QuestionMatrixModel.prototype.getDisplayValueCore = function (keysAsText, value) { var res = {}; for (var key in value) { var newKey = keysAsText ? _itemvalue__WEBPACK_IMPORTED_MODULE_1__["ItemValue"].getTextOrHtmlByValue(this.rows, key) : key; if (!newKey) newKey = key; var newValue = _itemvalue__WEBPACK_IMPORTED_MODULE_1__["ItemValue"].getTextOrHtmlByValue(this.columns, value[key]); if (!newValue) newValue = value[key]; res[newKey] = newValue; } return res; }; QuestionMatrixModel.prototype.getPlainData = function (options) { var _this = this; if (options === void 0) { options = { includeEmpty: true, }; } var questionPlainData = _super.prototype.getPlainData.call(this, options); if (!!questionPlainData) { var values = this.createValueCopy(); questionPlainData.isNode = true; questionPlainData.data = Object.keys(values || {}).map(function (rowName) { var row = _this.rows.filter(function (r) { return r.value === rowName; })[0]; var rowDataItem = { name: rowName, title: !!row ? row.text : "row", value: values[rowName], displayValue: _itemvalue__WEBPACK_IMPORTED_MODULE_1__["ItemValue"].getTextOrHtmlByValue(_this.visibleColumns, values[rowName]), getString: function (val) { return typeof val === "object" ? JSON.stringify(val) : val; }, isNode: false, }; var item = _itemvalue__WEBPACK_IMPORTED_MODULE_1__["ItemValue"].getItemByValue(_this.visibleColumns, values[rowName]); if (!!item) { (options.calculations || []).forEach(function (calculation) { rowDataItem[calculation.propertyName] = item[calculation.propertyName]; }); } return rowDataItem; }); } return questionPlainData; }; QuestionMatrixModel.prototype.addConditionObjectsByContext = function (objects, context) { for (var i = 0; i < this.rows.length; i++) { var row = this.rows[i]; if (!!row.value) { objects.push({ name: this.getValueName() + "." + row.value, text: this.processedTitle + "." + row.calculatedText, question: this, }); } } }; QuestionMatrixModel.prototype.getConditionJson = function (operator, path) { if (operator === void 0) { operator = null; } if (path === void 0) { path = null; } if (!path) return _super.prototype.getConditionJson.call(this); var question = new _question_dropdown__WEBPACK_IMPORTED_MODULE_9__["QuestionDropdownModel"](path); question.choices = this.columns; var json = new _jsonobject__WEBPACK_IMPORTED_MODULE_3__["JsonObject"]().toJsonObject(question); json["type"] = question.getType(); return json; }; QuestionMatrixModel.prototype.clearValueIfInvisible = function () { _super.prototype.clearValueIfInvisible.call(this); if (this.hasRows) { this.clearInvisibleValuesInRows(); } }; QuestionMatrixModel.prototype.getFirstInputElementId = function () { var rows = this.generatedVisibleRows; if (!rows) rows = this.visibleRows; if (rows.length > 0 && this.visibleColumns.length > 0) { return this.inputId + "_" + rows[0].name + "_" + 0; } return _super.prototype.getFirstInputElementId.call(this); }; QuestionMatrixModel.prototype.onRowsChanged = function () { this.updateVisibilityBasedOnRows(); _super.prototype.onRowsChanged.call(this); }; QuestionMatrixModel.prototype.updateVisibilityBasedOnRows = function () { if (this.hideIfRowsEmpty) { this.visible = this.rows.length > 0 && (!this.filteredRows || this.filteredRows.length > 0); } }; //IMatrixData QuestionMatrixModel.prototype.onMatrixRowChanged = function (row) { if (this.isRowChanging) return; this.isRowChanging = true; if (!this.hasRows) { this.setNewValue(row.value); } else { var newValue = this.value; if (!newValue) { newValue = {}; } newValue[row.name] = row.value; this.setNewValue(newValue); } this.isRowChanging = false; }; QuestionMatrixModel.prototype.getCorrectedRowValue = function (value) { for (var i = 0; i < this.columns.length; i++) { if (value === this.columns[i].value) return value; } for (var i = 0; i < this.columns.length; i++) { if (this.isTwoValueEquals(value, this.columns[i].value)) return this.columns[i].value; } return value; }; QuestionMatrixModel.prototype.getSearchableItemValueKeys = function (keys) { keys.push("columns"); keys.push("rows"); }; Object.defineProperty(QuestionMatrixModel.prototype, "SurveyModel", { get: function () { return this.survey; }, enumerable: false, configurable: true }); QuestionMatrixModel.prototype.getColumnHeaderWrapperComponentName = function (cell) { return this.SurveyModel.getElementWrapperComponentName({ column: cell }, "column-header"); }; QuestionMatrixModel.prototype.getColumnHeaderWrapperComponentData = function (cell) { return this.SurveyModel.getElementWrapperComponentData({ column: cell }, "column-header"); }; QuestionMatrixModel.prototype.getRowHeaderWrapperComponentName = function (cell) { return this.SurveyModel.getElementWrapperComponentName({ row: cell }, "row-header"); }; QuestionMatrixModel.prototype.getRowHeaderWrapperComponentData = function (cell) { return this.SurveyModel.getElementWrapperComponentData({ row: cell }, "row-header"); }; return QuestionMatrixModel; }(_martixBase__WEBPACK_IMPORTED_MODULE_2__["QuestionMatrixBaseModel"])); _jsonobject__WEBPACK_IMPORTED_MODULE_3__["Serializer"].addClass("matrix", [ { name: "columns:itemvalue[]", baseValue: function () { return _surveyStrings__WEBPACK_IMPORTED_MODULE_5__["surveyLocalization"].getString("matrix_column"); }, }, { name: "rows:itemvalue[]", baseValue: function () { return _surveyStrings__WEBPACK_IMPORTED_MODULE_5__["surveyLocalization"].getString("matrix_row"); }, }, { name: "cells:cells", serializationProperty: "cells" }, { name: "rowsOrder", default: "initial", choices: ["initial", "random"], }, "isAllRowRequired:boolean", "hideIfRowsEmpty:boolean", ], function () { return new QuestionMatrixModel(""); }, "matrixbase"); _questionfactory__WEBPACK_IMPORTED_MODULE_7__["QuestionFactory"].Instance.registerQuestion("matrix", function (name) { var q = new QuestionMatrixModel(name); q.rows = _questionfactory__WEBPACK_IMPORTED_MODULE_7__["QuestionFactory"].DefaultRows; q.columns = _questionfactory__WEBPACK_IMPORTED_MODULE_7__["QuestionFactory"].DefaultColums; return q; }); /***/ }), /***/ "./src/question_matrixdropdown.ts": /*!****************************************!*\ !*** ./src/question_matrixdropdown.ts ***! \****************************************/ /*! exports provided: MatrixDropdownRowModel, QuestionMatrixDropdownModel */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatrixDropdownRowModel", function() { return MatrixDropdownRowModel; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixDropdownModel", function() { return QuestionMatrixDropdownModel; }); /* harmony import */ var _question_matrixdropdownbase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./question_matrixdropdownbase */ "./src/question_matrixdropdownbase.ts"); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _itemvalue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./itemvalue */ "./src/itemvalue.ts"); /* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./questionfactory */ "./src/questionfactory.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var MatrixDropdownRowModel = /** @class */ (function (_super) { __extends(MatrixDropdownRowModel, _super); function MatrixDropdownRowModel(name, item, data, value) { var _this = _super.call(this, data, value) || this; _this.name = name; _this.item = item; _this.buildCells(value); return _this; } Object.defineProperty(MatrixDropdownRowModel.prototype, "rowName", { get: function () { return this.name; }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownRowModel.prototype, "text", { get: function () { return this.item.text; }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownRowModel.prototype, "locText", { get: function () { return this.item.locText; }, enumerable: false, configurable: true }); return MatrixDropdownRowModel; }(_question_matrixdropdownbase__WEBPACK_IMPORTED_MODULE_0__["MatrixDropdownRowModelBase"])); /** * A Model for a matrix dropdown question. You may use a dropdown, checkbox, radiogroup, text and comment questions as a cell editors. */ var QuestionMatrixDropdownModel = /** @class */ (function (_super) { __extends(QuestionMatrixDropdownModel, _super); function QuestionMatrixDropdownModel(name) { var _this = _super.call(this, name) || this; _this.createLocalizableString("totalText", _this, true); var self = _this; _this.registerFunctionOnPropertyValueChanged("rows", function () { self.clearGeneratedRows(); self.resetRenderedTable(); self.filterItems(); }); return _this; } QuestionMatrixDropdownModel.prototype.getType = function () { return "matrixdropdown"; }; Object.defineProperty(QuestionMatrixDropdownModel.prototype, "totalText", { /** * Set this property to show it on the first column for the total row. */ get: function () { return this.getLocalizableStringText("totalText", ""); }, set: function (val) { this.setLocalizableStringText("totalText", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDropdownModel.prototype, "locTotalText", { get: function () { return this.getLocalizableString("totalText"); }, enumerable: false, configurable: true }); QuestionMatrixDropdownModel.prototype.getFooterText = function () { return this.locTotalText; }; Object.defineProperty(QuestionMatrixDropdownModel.prototype, "rowTitleWidth", { /** * The column width for the first column, row title column. */ get: function () { return this.getPropertyValue("rowTitleWidth", ""); }, set: function (val) { this.setPropertyValue("rowTitleWidth", val); }, enumerable: false, configurable: true }); QuestionMatrixDropdownModel.prototype.getRowTitleWidth = function () { return this.rowTitleWidth; }; QuestionMatrixDropdownModel.prototype.getDisplayValueCore = function (keysAsText, value) { if (!value) return value; var rows = this.visibleRows; var res = {}; if (!rows) return res; for (var i = 0; i < rows.length; i++) { var rowValue = rows[i].rowName; var val = value[rowValue]; if (!val) continue; if (keysAsText) { var displayRowValue = _itemvalue__WEBPACK_IMPORTED_MODULE_2__["ItemValue"].getTextOrHtmlByValue(this.rows, rowValue); if (!!displayRowValue) { rowValue = displayRowValue; } } res[rowValue] = this.getRowDisplayValue(keysAsText, rows[i], val); } return res; }; QuestionMatrixDropdownModel.prototype.addConditionObjectsByContext = function (objects, context) { var hasContext = !!context ? this.columns.indexOf(context) > -1 : false; for (var i = 0; i < this.rows.length; i++) { var row = this.rows[i]; if (!row.value) continue; var prefixName = this.getValueName() + "." + row.value + "."; var prefixTitle = this.processedTitle + "." + row.calculatedText + "."; for (var j = 0; j < this.columns.length; j++) { var column = this.columns[j]; objects.push({ name: prefixName + column.name, text: prefixTitle + column.fullTitle, question: this, }); } } if (hasContext) { for (var i = 0; i < this.columns.length; i++) { var column = this.columns[i]; if (column == context) continue; objects.push({ name: "row." + column.name, text: "row." + column.fullTitle, question: this, }); } } }; QuestionMatrixDropdownModel.prototype.clearIncorrectValues = function () { var val = this.value; if (!val) return; var newVal = null; var isChanged = false; var rows = !!this.filteredRows ? this.filteredRows : this.rows; for (var key in val) { if (_itemvalue__WEBPACK_IMPORTED_MODULE_2__["ItemValue"].getItemByValue(rows, key)) { if (newVal == null) newVal = {}; newVal[key] = val[key]; } else { isChanged = true; } } if (isChanged) { this.value = newVal; } _super.prototype.clearIncorrectValues.call(this); }; QuestionMatrixDropdownModel.prototype.clearValueIfInvisible = function () { _super.prototype.clearValueIfInvisible.call(this); this.clearInvisibleValuesInRows(); }; QuestionMatrixDropdownModel.prototype.generateRows = function () { var result = new Array(); var rows = !!this.filteredRows ? this.filteredRows : this.rows; if (!rows || rows.length === 0) return result; var val = this.value; if (!val) val = {}; for (var i = 0; i < rows.length; i++) { if (!rows[i].value) continue; result.push(this.createMatrixRow(rows[i], val[rows[i].value])); } return result; }; QuestionMatrixDropdownModel.prototype.createMatrixRow = function (item, value) { return new MatrixDropdownRowModel(item.value, item, this, value); }; QuestionMatrixDropdownModel.prototype.getSearchableItemValueKeys = function (keys) { keys.push("rows"); }; return QuestionMatrixDropdownModel; }(_question_matrixdropdownbase__WEBPACK_IMPORTED_MODULE_0__["QuestionMatrixDropdownModelBase"])); _jsonobject__WEBPACK_IMPORTED_MODULE_1__["Serializer"].addClass("matrixdropdown", [ { name: "rows:itemvalue[]", }, "rowsVisibleIf:condition", "rowTitleWidth", { name: "totalText", serializationProperty: "locTotalText" }, ], function () { return new QuestionMatrixDropdownModel(""); }, "matrixdropdownbase"); _questionfactory__WEBPACK_IMPORTED_MODULE_3__["QuestionFactory"].Instance.registerQuestion("matrixdropdown", function (name) { var q = new QuestionMatrixDropdownModel(name); q.choices = [1, 2, 3, 4, 5]; q.rows = _questionfactory__WEBPACK_IMPORTED_MODULE_3__["QuestionFactory"].DefaultRows; _question_matrixdropdownbase__WEBPACK_IMPORTED_MODULE_0__["QuestionMatrixDropdownModelBase"].addDefaultColumns(q); return q; }); /***/ }), /***/ "./src/question_matrixdropdownbase.ts": /*!********************************************!*\ !*** ./src/question_matrixdropdownbase.ts ***! \********************************************/ /*! exports provided: MatrixDropdownCell, MatrixDropdownTotalCell, MatrixDropdownRowModelBase, MatrixDropdownTotalRowModel, QuestionMatrixDropdownModelBase */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatrixDropdownCell", function() { return MatrixDropdownCell; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatrixDropdownTotalCell", function() { return MatrixDropdownTotalCell; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatrixDropdownRowModelBase", function() { return MatrixDropdownRowModelBase; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatrixDropdownTotalRowModel", function() { return MatrixDropdownTotalRowModel; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixDropdownModelBase", function() { return QuestionMatrixDropdownModelBase; }); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _martixBase__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./martixBase */ "./src/martixBase.ts"); /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ "./src/helpers.ts"); /* harmony import */ var _survey_element__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./survey-element */ "./src/survey-element.ts"); /* harmony import */ var _textPreProcessor__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./textPreProcessor */ "./src/textPreProcessor.ts"); /* harmony import */ var _itemvalue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./itemvalue */ "./src/itemvalue.ts"); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./surveyStrings */ "./src/surveyStrings.ts"); /* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./questionfactory */ "./src/questionfactory.ts"); /* harmony import */ var _functionsfactory__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./functionsfactory */ "./src/functionsfactory.ts"); /* harmony import */ var _settings__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./settings */ "./src/settings.ts"); /* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./error */ "./src/error.ts"); /* harmony import */ var _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./utils/cssClassBuilder */ "./src/utils/cssClassBuilder.ts"); /* harmony import */ var _question_matrixdropdowncolumn__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./question_matrixdropdowncolumn */ "./src/question_matrixdropdowncolumn.ts"); /* harmony import */ var _question_matrixdropdownrendered__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./question_matrixdropdownrendered */ "./src/question_matrixdropdownrendered.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var MatrixDropdownCell = /** @class */ (function () { function MatrixDropdownCell(column, row, data) { this.column = column; this.row = row; this.data = data; this.questionValue = this.createQuestion(column, row, data); this.questionValue.updateCustomWidget(); } MatrixDropdownCell.prototype.locStrsChanged = function () { this.question.locStrsChanged(); }; MatrixDropdownCell.prototype.createQuestion = function (column, row, data) { var res = data.createQuestion(this.row, this.column); res.validateValueCallback = function () { return data.validateCell(row, column.name, row.value); }; _jsonobject__WEBPACK_IMPORTED_MODULE_0__["CustomPropertiesCollection"].getProperties(column.getType()).forEach(function (property) { var propertyName = property.name; if (column[propertyName] !== undefined) { res[propertyName] = column[propertyName]; } }); return res; }; Object.defineProperty(MatrixDropdownCell.prototype, "question", { get: function () { return this.questionValue; }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownCell.prototype, "value", { get: function () { return this.question.value; }, set: function (value) { this.question.value = value; }, enumerable: false, configurable: true }); MatrixDropdownCell.prototype.runCondition = function (values, properties) { this.question.runCondition(values, properties); }; return MatrixDropdownCell; }()); var MatrixDropdownTotalCell = /** @class */ (function (_super) { __extends(MatrixDropdownTotalCell, _super); function MatrixDropdownTotalCell(column, row, data) { var _this = _super.call(this, column, row, data) || this; _this.column = column; _this.row = row; _this.data = data; _this.updateCellQuestion(); return _this; } MatrixDropdownTotalCell.prototype.createQuestion = function (column, row, data) { var res = _jsonobject__WEBPACK_IMPORTED_MODULE_0__["Serializer"].createClass("expression"); res.setSurveyImpl(row); return res; }; MatrixDropdownTotalCell.prototype.locStrsChanged = function () { this.updateCellQuestion(); _super.prototype.locStrsChanged.call(this); }; MatrixDropdownTotalCell.prototype.updateCellQuestion = function () { this.question.locCalculation(); this.column.updateCellQuestion(this.question, null, function (json) { delete json["defaultValue"]; }); this.question.expression = this.getTotalExpression(); this.question.format = this.column.totalFormat; this.question.currency = this.column.totalCurrency; this.question.displayStyle = this.column.totalDisplayStyle; this.question.maximumFractionDigits = this.column.totalMaximumFractionDigits; this.question.minimumFractionDigits = this.column.totalMinimumFractionDigits; this.question.unlocCalculation(); this.question.runIfReadOnly = true; }; MatrixDropdownTotalCell.prototype.getTotalExpression = function () { if (!!this.column.totalExpression) return this.column.totalExpression; if (this.column.totalType == "none") return ""; var funName = this.column.totalType + "InArray"; if (!_functionsfactory__WEBPACK_IMPORTED_MODULE_8__["FunctionFactory"].Instance.hasFunction(funName)) return ""; return funName + "({self}, '" + this.column.name + "')"; }; return MatrixDropdownTotalCell; }(MatrixDropdownCell)); var MatrixDropdownRowTextProcessor = /** @class */ (function (_super) { __extends(MatrixDropdownRowTextProcessor, _super); function MatrixDropdownRowTextProcessor(row, variableName) { var _this = _super.call(this, variableName) || this; _this.row = row; _this.variableName = variableName; return _this; } Object.defineProperty(MatrixDropdownRowTextProcessor.prototype, "survey", { get: function () { return this.row.getSurvey(); }, enumerable: false, configurable: true }); MatrixDropdownRowTextProcessor.prototype.getValues = function () { return this.row.value; }; MatrixDropdownRowTextProcessor.prototype.getQuestionByName = function (name) { return this.row.getQuestionByName(name); }; MatrixDropdownRowTextProcessor.prototype.onCustomProcessText = function (textValue) { if (textValue.name == MatrixDropdownRowModelBase.IndexVariableName) { textValue.isExists = true; textValue.value = this.row.rowIndex; return true; } if (textValue.name == MatrixDropdownRowModelBase.RowValueVariableName) { textValue.isExists = true; textValue.value = this.row.rowName; return true; } return false; }; return MatrixDropdownRowTextProcessor; }(_textPreProcessor__WEBPACK_IMPORTED_MODULE_4__["QuestionTextProcessor"])); var MatrixDropdownRowModelBase = /** @class */ (function () { function MatrixDropdownRowModelBase(data, value) { var _this = this; this.isSettingValue = false; this.detailPanelValue = null; this.cells = []; this.isCreatingDetailPanel = false; this.data = data; this.subscribeToChanges(value); this.textPreProcessor = new MatrixDropdownRowTextProcessor(this, MatrixDropdownRowModelBase.RowVariableName); this.showHideDetailPanelClick = function () { _this.showHideDetailPanel(); }; this.idValue = MatrixDropdownRowModelBase.getId(); } MatrixDropdownRowModelBase.getId = function () { return "srow_" + MatrixDropdownRowModelBase.idCounter++; }; Object.defineProperty(MatrixDropdownRowModelBase.prototype, "id", { get: function () { return this.idValue; }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownRowModelBase.prototype, "rowName", { get: function () { return null; }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownRowModelBase.prototype, "text", { get: function () { return this.rowName; }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownRowModelBase.prototype, "value", { get: function () { var result = {}; var questions = this.questions; for (var i = 0; i < questions.length; i++) { var question = questions[i]; if (!question.isEmpty()) { result[question.getValueName()] = question.value; } if (!!question.comment && !!this.getSurvey() && this.getSurvey().storeOthersAsComment) { result[question.getValueName() + _settings__WEBPACK_IMPORTED_MODULE_9__["settings"].commentPrefix] = question.comment; } } return result; }, set: function (value) { this.isSettingValue = true; this.subscribeToChanges(value); var questions = this.questions; for (var i = 0; i < questions.length; i++) { var question = questions[i]; var val = this.getCellValue(value, question.getValueName()); var oldComment = question.comment; var comment = !!value ? value[question.getValueName() + _settings__WEBPACK_IMPORTED_MODULE_9__["settings"].commentPrefix] : ""; if (comment == undefined) comment = ""; question.updateValueFromSurvey(val); if (!!comment || this.isTwoValueEquals(oldComment, question.comment)) { question.updateCommentFromSurvey(comment); } question.onSurveyValueChanged(val); } this.isSettingValue = false; }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownRowModelBase.prototype, "locText", { get: function () { return null; }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownRowModelBase.prototype, "hasPanel", { get: function () { if (!this.data) return false; return this.data.hasDetailPanel(this); }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownRowModelBase.prototype, "detailPanel", { get: function () { return this.detailPanelValue; }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownRowModelBase.prototype, "detailPanelId", { get: function () { return !!this.detailPanel ? this.detailPanel.id : ""; }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownRowModelBase.prototype, "isDetailPanelShowing", { get: function () { return !!this.data ? this.data.getIsDetailPanelShowing(this) : false; }, enumerable: false, configurable: true }); MatrixDropdownRowModelBase.prototype.setIsDetailPanelShowing = function (val) { if (!!this.data) { this.data.setIsDetailPanelShowing(this, val); } if (!!this.onDetailPanelShowingChanged) { this.onDetailPanelShowingChanged(); } }; MatrixDropdownRowModelBase.prototype.showHideDetailPanel = function () { if (this.isDetailPanelShowing) { this.hideDetailPanel(); } else { this.showDetailPanel(); } }; MatrixDropdownRowModelBase.prototype.showDetailPanel = function () { this.ensureDetailPanel(); if (!this.detailPanelValue) return; this.setIsDetailPanelShowing(true); }; MatrixDropdownRowModelBase.prototype.hideDetailPanel = function (destroyPanel) { if (destroyPanel === void 0) { destroyPanel = false; } this.setIsDetailPanelShowing(false); if (destroyPanel) { this.detailPanelValue = null; } }; MatrixDropdownRowModelBase.prototype.ensureDetailPanel = function () { if (this.isCreatingDetailPanel) return; if (!!this.detailPanelValue || !this.hasPanel || !this.data) return; this.isCreatingDetailPanel = true; this.detailPanelValue = this.data.createRowDetailPanel(this); var questions = this.detailPanelValue.questions; var value = this.data.getRowValue(this.data.getRowIndex(this)); if (!_helpers__WEBPACK_IMPORTED_MODULE_2__["Helpers"].isValueEmpty(value)) { for (var i = 0; i < questions.length; i++) { var key = questions[i].getValueName(); if (!_helpers__WEBPACK_IMPORTED_MODULE_2__["Helpers"].isValueEmpty(value[key])) { questions[i].value = value[key]; } } } this.detailPanelValue.setSurveyImpl(this); this.isCreatingDetailPanel = false; }; MatrixDropdownRowModelBase.prototype.getAllValues = function () { return this.value; }; MatrixDropdownRowModelBase.prototype.getFilteredValues = function () { var allValues = this.getAllValues(); var values = { row: allValues }; for (var key in allValues) { values[key] = allValues[key]; } return values; }; MatrixDropdownRowModelBase.prototype.getFilteredProperties = function () { return { survey: this.getSurvey(), row: this }; }; MatrixDropdownRowModelBase.prototype.runCondition = function (values, properties) { if (!!this.data) { values[MatrixDropdownRowModelBase.OwnerVariableName] = this.data.value; } values[MatrixDropdownRowModelBase.IndexVariableName] = this.rowIndex; values[MatrixDropdownRowModelBase.RowValueVariableName] = this.rowName; if (!properties) properties = {}; properties[MatrixDropdownRowModelBase.RowVariableName] = this; for (var i = 0; i < this.cells.length; i++) { values[MatrixDropdownRowModelBase.RowVariableName] = this.value; this.cells[i].runCondition(values, properties); } if (!!this.detailPanel) { this.detailPanel.runCondition(values, properties); } }; MatrixDropdownRowModelBase.prototype.clearValue = function () { var questions = this.questions; for (var i = 0; i < questions.length; i++) { questions[i].clearValue(); } }; MatrixDropdownRowModelBase.prototype.onAnyValueChanged = function (name) { var questions = this.questions; for (var i = 0; i < questions.length; i++) { questions[i].onAnyValueChanged(name); } }; MatrixDropdownRowModelBase.prototype.getDataValueCore = function (valuesHash, key) { var survey = this.getSurvey(); if (!!survey) { return survey.getDataValueCore(valuesHash, key); } else { return valuesHash[key]; } }; MatrixDropdownRowModelBase.prototype.getValue = function (name) { var question = this.getQuestionByName(name); return !!question ? question.value : null; }; MatrixDropdownRowModelBase.prototype.setValue = function (name, newColumnValue) { this.setValueCore(name, newColumnValue, false); }; MatrixDropdownRowModelBase.prototype.getVariable = function (name) { return undefined; }; MatrixDropdownRowModelBase.prototype.setVariable = function (name, newValue) { }; MatrixDropdownRowModelBase.prototype.getComment = function (name) { var question = this.getQuestionByName(name); return !!question ? question.comment : ""; }; MatrixDropdownRowModelBase.prototype.setComment = function (name, newValue, locNotification) { this.setValueCore(name, newValue, true); }; MatrixDropdownRowModelBase.prototype.setValueCore = function (name, newColumnValue, isComment) { if (this.isSettingValue) return; this.updateQuestionsValue(name, newColumnValue, isComment); var newValue = this.value; var changedName = isComment ? name + _settings__WEBPACK_IMPORTED_MODULE_9__["settings"].commentPrefix : name; var changedValue = isComment ? this.getComment(name) : this.getValue(name); var changedQuestion = this.getQuestionByName(name); var changingValue = this.data.onRowChanging(this, changedName, newValue); if (!!changedQuestion && !this.isTwoValueEquals(changingValue, changedValue)) { if (isComment) { changedQuestion.comment = changingValue; } else { changedQuestion.value = changingValue; } } else { if (this.data.isValidateOnValueChanging && this.hasQuestonError(changedQuestion)) return; this.data.onRowChanged(this, changedName, newValue, newColumnValue == null && !changedQuestion); this.onAnyValueChanged(MatrixDropdownRowModelBase.RowVariableName); } }; MatrixDropdownRowModelBase.prototype.updateQuestionsValue = function (name, newColumnValue, isComment) { if (!this.detailPanel) return; var colQuestion = this.getQuestionByColumnName(name); var detailQuestion = this.detailPanel.getQuestionByName(name); if (!colQuestion || !detailQuestion) return; var isColQuestion = this.isTwoValueEquals(newColumnValue, isComment ? colQuestion.comment : colQuestion.value); var question = isColQuestion ? detailQuestion : colQuestion; this.isSettingValue = true; if (!isComment) { question.value = newColumnValue; } else { question.comment = newColumnValue; } this.isSettingValue = false; }; MatrixDropdownRowModelBase.prototype.hasQuestonError = function (question) { if (!question) return false; if (question.hasErrors(true, { isOnValueChanged: !this.data.isValidateOnValueChanging, })) return true; if (question.isEmpty()) return false; var cell = this.getCellByColumnName(question.name); if (!cell || !cell.column || !cell.column.isUnique) return false; return this.data.checkIfValueInRowDuplicated(this, question); }; Object.defineProperty(MatrixDropdownRowModelBase.prototype, "isEmpty", { get: function () { var val = this.value; if (_helpers__WEBPACK_IMPORTED_MODULE_2__["Helpers"].isValueEmpty(val)) return true; for (var key in val) { if (val[key] !== undefined && val[key] !== null) return false; } return true; }, enumerable: false, configurable: true }); MatrixDropdownRowModelBase.prototype.getQuestionByColumn = function (column) { var cell = this.getCellByColumn(column); return !!cell ? cell.question : null; }; MatrixDropdownRowModelBase.prototype.getCellByColumn = function (column) { for (var i = 0; i < this.cells.length; i++) { if (this.cells[i].column == column) return this.cells[i]; } return null; }; MatrixDropdownRowModelBase.prototype.getCellByColumnName = function (columnName) { for (var i = 0; i < this.cells.length; i++) { if (this.cells[i].column.name == columnName) return this.cells[i]; } return null; }; MatrixDropdownRowModelBase.prototype.getQuestionByColumnName = function (columnName) { var cell = this.getCellByColumnName(columnName); return !!cell ? cell.question : null; }; Object.defineProperty(MatrixDropdownRowModelBase.prototype, "questions", { get: function () { var res = []; for (var i = 0; i < this.cells.length; i++) { res.push(this.cells[i].question); } var detailQuestions = !!this.detailPanel ? this.detailPanel.questions : []; for (var i = 0; i < detailQuestions.length; i++) { res.push(detailQuestions[i]); } return res; }, enumerable: false, configurable: true }); MatrixDropdownRowModelBase.prototype.getQuestionByName = function (name) { var res = this.getQuestionByColumnName(name); if (!!res) return res; return !!this.detailPanel ? this.detailPanel.getQuestionByName(name) : null; }; MatrixDropdownRowModelBase.prototype.getQuestionsByName = function (name) { var res = []; var q = this.getQuestionByColumnName(name); if (!!q) res.push(q); if (!!this.detailPanel) { q = this.detailPanel.getQuestionByName(name); if (!!q) res.push(q); } return res; }; MatrixDropdownRowModelBase.prototype.getSharedQuestionByName = function (columnName) { return !!this.data ? this.data.getSharedQuestionByName(columnName, this) : null; }; MatrixDropdownRowModelBase.prototype.clearIncorrectValues = function (val) { for (var key in val) { var question = this.getQuestionByName(key); if (question) { var qVal = question.value; question.clearIncorrectValues(); if (!this.isTwoValueEquals(qVal, question.value)) { this.setValue(key, question.value); } } else { if (!this.getSharedQuestionByName(key) && key.indexOf(_settings__WEBPACK_IMPORTED_MODULE_9__["settings"].matrixTotalValuePostFix) < 0) { this.setValue(key, null); } } } }; MatrixDropdownRowModelBase.prototype.getLocale = function () { return this.data ? this.data.getLocale() : ""; }; MatrixDropdownRowModelBase.prototype.getMarkdownHtml = function (text, name) { return this.data ? this.data.getMarkdownHtml(text, name) : null; }; MatrixDropdownRowModelBase.prototype.getRenderer = function (name) { return this.data ? this.data.getRenderer(name) : null; }; MatrixDropdownRowModelBase.prototype.getRendererContext = function (locStr) { return this.data ? this.data.getRendererContext(locStr) : locStr; }; MatrixDropdownRowModelBase.prototype.getProcessedText = function (text) { return this.data ? this.data.getProcessedText(text) : text; }; MatrixDropdownRowModelBase.prototype.locStrsChanged = function () { for (var i = 0; i < this.cells.length; i++) { this.cells[i].locStrsChanged(); } if (!!this.detailPanel) { this.detailPanel.locStrsChanged(); } }; MatrixDropdownRowModelBase.prototype.updateCellQuestionOnColumnChanged = function (column, name, newValue) { var cell = this.getCellByColumn(column); if (!cell) return; this.updateCellOnColumnChanged(cell, name, newValue); }; MatrixDropdownRowModelBase.prototype.updateCellQuestionOnColumnItemValueChanged = function (column, propertyName, obj, name, newValue, oldValue) { var cell = this.getCellByColumn(column); if (!cell) return; this.updateCellOnColumnItemValueChanged(cell, propertyName, obj, name, newValue, oldValue); }; MatrixDropdownRowModelBase.prototype.onQuestionReadOnlyChanged = function (parentIsReadOnly) { var questions = this.questions; for (var i = 0; i < questions.length; i++) { questions[i].readOnly = parentIsReadOnly; } if (!!this.detailPanel) { this.detailPanel.readOnly = parentIsReadOnly; } }; MatrixDropdownRowModelBase.prototype.hasErrors = function (fireCallback, rec, raiseOnCompletedAsyncValidators) { var res = false; var cells = this.cells; if (!cells) return res; for (var colIndex = 0; colIndex < cells.length; colIndex++) { if (!cells[colIndex]) continue; var question = cells[colIndex].question; if (!question || !question.visible) continue; question.onCompletedAsyncValidators = function (hasErrors) { raiseOnCompletedAsyncValidators(); }; if (!!rec && rec.isOnValueChanged === true && question.isEmpty()) continue; res = question.hasErrors(fireCallback, rec) || res; } if (this.hasPanel) { this.ensureDetailPanel(); var panelHasError = this.detailPanel.hasErrors(fireCallback, false, rec); if (!rec.hideErroredPanel && panelHasError && fireCallback) { if (rec.isSingleDetailPanel) { rec.hideErroredPanel = true; } this.showDetailPanel(); } res = panelHasError || res; } return res; }; MatrixDropdownRowModelBase.prototype.updateCellOnColumnChanged = function (cell, name, newValue) { cell.question[name] = newValue; }; MatrixDropdownRowModelBase.prototype.updateCellOnColumnItemValueChanged = function (cell, propertyName, obj, name, newValue, oldValue) { var items = cell.question[propertyName]; if (!Array.isArray(items)) return; var val = name === "value" ? oldValue : obj["value"]; var item = _itemvalue__WEBPACK_IMPORTED_MODULE_5__["ItemValue"].getItemByValue(items, val); if (!item) return; item[name] = newValue; }; MatrixDropdownRowModelBase.prototype.buildCells = function (value) { this.isSettingValue = true; var columns = this.data.columns; for (var i = 0; i < columns.length; i++) { var column = columns[i]; if (!column.isVisible) continue; var cell = this.createCell(column); this.cells.push(cell); var cellValue = this.getCellValue(value, column.name); if (!_helpers__WEBPACK_IMPORTED_MODULE_2__["Helpers"].isValueEmpty(cellValue)) { cell.question.value = cellValue; var commentKey = column.name + _settings__WEBPACK_IMPORTED_MODULE_9__["settings"].commentPrefix; if (!!value && !_helpers__WEBPACK_IMPORTED_MODULE_2__["Helpers"].isValueEmpty(value[commentKey])) { cell.question.comment = value[commentKey]; } } } this.isSettingValue = false; }; MatrixDropdownRowModelBase.prototype.isTwoValueEquals = function (val1, val2) { return _helpers__WEBPACK_IMPORTED_MODULE_2__["Helpers"].isTwoValueEquals(val1, val2, false, true, false); }; MatrixDropdownRowModelBase.prototype.getCellValue = function (value, name) { if (!!this.editingObj) return _jsonobject__WEBPACK_IMPORTED_MODULE_0__["Serializer"].getObjPropertyValue(this.editingObj, name); return !!value ? value[name] : undefined; }; MatrixDropdownRowModelBase.prototype.createCell = function (column) { return new MatrixDropdownCell(column, this, this.data); }; MatrixDropdownRowModelBase.prototype.getSurveyData = function () { return this; }; MatrixDropdownRowModelBase.prototype.getSurvey = function () { return this.data ? this.data.getSurvey() : null; }; MatrixDropdownRowModelBase.prototype.getTextProcessor = function () { return this.textPreProcessor; }; Object.defineProperty(MatrixDropdownRowModelBase.prototype, "rowIndex", { get: function () { return !!this.data ? this.data.getRowIndex(this) + 1 : -1; }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownRowModelBase.prototype, "editingObj", { get: function () { return this.editingObjValue; }, enumerable: false, configurable: true }); MatrixDropdownRowModelBase.prototype.dispose = function () { if (!!this.editingObj) { this.editingObj.onPropertyChanged.remove(this.onEditingObjPropertyChanged); this.editingObjValue = null; } }; MatrixDropdownRowModelBase.prototype.subscribeToChanges = function (value) { var _this = this; if (!value || !value.getType || !value.onPropertyChanged) return; if (value === this.editingObj) return; this.editingObjValue = value; this.onEditingObjPropertyChanged = function (sender, options) { _this.updateOnSetValue(options.name, options.newValue); }; this.editingObj.onPropertyChanged.add(this.onEditingObjPropertyChanged); }; MatrixDropdownRowModelBase.prototype.updateOnSetValue = function (name, newValue) { this.isSettingValue = true; var questions = this.getQuestionsByName(name); for (var i = 0; i < questions.length; i++) { questions[i].value = newValue; } this.isSettingValue = false; }; MatrixDropdownRowModelBase.RowVariableName = "row"; MatrixDropdownRowModelBase.OwnerVariableName = "self"; MatrixDropdownRowModelBase.IndexVariableName = "rowIndex"; MatrixDropdownRowModelBase.RowValueVariableName = "rowValue"; MatrixDropdownRowModelBase.idCounter = 1; return MatrixDropdownRowModelBase; }()); var MatrixDropdownTotalRowModel = /** @class */ (function (_super) { __extends(MatrixDropdownTotalRowModel, _super); function MatrixDropdownTotalRowModel(data) { var _this = _super.call(this, data, null) || this; _this.buildCells(null); return _this; } MatrixDropdownTotalRowModel.prototype.createCell = function (column) { return new MatrixDropdownTotalCell(column, this, this.data); }; MatrixDropdownTotalRowModel.prototype.setValue = function (name, newValue) { if (!!this.data && !this.isSettingValue) { this.data.onTotalValueChanged(); } }; MatrixDropdownTotalRowModel.prototype.runCondition = function (values, properties) { var counter = 0; var prevValue; do { prevValue = _helpers__WEBPACK_IMPORTED_MODULE_2__["Helpers"].getUnbindValue(this.value); _super.prototype.runCondition.call(this, values, properties); counter++; } while (!_helpers__WEBPACK_IMPORTED_MODULE_2__["Helpers"].isTwoValueEquals(prevValue, this.value) && counter < 3); }; MatrixDropdownTotalRowModel.prototype.updateCellOnColumnChanged = function (cell, name, newValue) { cell.updateCellQuestion(); }; return MatrixDropdownTotalRowModel; }(MatrixDropdownRowModelBase)); /** * A base class for matrix dropdown and matrix dynamic questions. */ var QuestionMatrixDropdownModelBase = /** @class */ (function (_super) { __extends(QuestionMatrixDropdownModelBase, _super); function QuestionMatrixDropdownModelBase(name) { var _this = _super.call(this, name) || this; _this.isRowChanging = false; _this.lockResetRenderedTable = false; _this.isDoingonAnyValueChanged = false; _this.createItemValues("choices"); _this.createLocalizableString("optionsCaption", _this); _this.createLocalizableString("keyDuplicationError", _this); _this.detailPanelValue = _this.createNewDetailPanel(); _this.detailPanel.selectedElementInDesign = _this; _this.detailPanel.renderWidth = "100%"; _this.registerFunctionOnPropertyValueChanged("columns", function (newColumns) { _this.updateColumnsIndexes(newColumns); _this.generatedTotalRow = null; _this.clearRowsAndResetRenderedTable(); }); _this.registerFunctionOnPropertyValueChanged("cellType", function () { _this.updateColumnsCellType(); _this.clearRowsAndResetRenderedTable(); }); _this.registerFunctionOnPropertiesValueChanged(["optionsCaption", "columnColCount", "rowTitleWidth", "choices"], function () { _this.clearRowsAndResetRenderedTable(); }); _this.registerFunctionOnPropertiesValueChanged([ "columnLayout", "addRowLocation", "hideColumnsIfEmpty", "showHeader", "minRowCount", "isReadOnly", "rowCount", "hasFooter", "detailPanelMode", ], function () { _this.resetRenderedTable(); }); return _this; } Object.defineProperty(QuestionMatrixDropdownModelBase, "defaultCellType", { get: function () { return _settings__WEBPACK_IMPORTED_MODULE_9__["settings"].matrixDefaultCellType; }, set: function (val) { _settings__WEBPACK_IMPORTED_MODULE_9__["settings"].matrixDefaultCellType = val; }, enumerable: false, configurable: true }); QuestionMatrixDropdownModelBase.addDefaultColumns = function (matrix) { var colNames = _questionfactory__WEBPACK_IMPORTED_MODULE_7__["QuestionFactory"].DefaultColums; for (var i = 0; i < colNames.length; i++) matrix.addColumn(colNames[i]); }; QuestionMatrixDropdownModelBase.prototype.createColumnValues = function () { var _this = this; return this.createNewArray("columns", function (item) { item.colOwner = _this; }, function (item) { item.colOwner = null; }); }; QuestionMatrixDropdownModelBase.prototype.getType = function () { return "matrixdropdownbase"; }; QuestionMatrixDropdownModelBase.prototype.dispose = function () { _super.prototype.dispose.call(this); this.clearGeneratedRows(); }; Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "hasSingleInput", { get: function () { return false; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "isRowsDynamic", { get: function () { return false; }, enumerable: false, configurable: true }); QuestionMatrixDropdownModelBase.prototype.itemValuePropertyChanged = function (item, name, oldValue, newValue) { _super.prototype.itemValuePropertyChanged.call(this, item, name, oldValue, newValue); if (item.ownerPropertyName === "choices") { this.clearRowsAndResetRenderedTable(); } }; Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "columnLayout", { /** * Set columnLayout to 'vertical' to place columns vertically and rows horizontally. It makes sense when we have many columns and few rows. * @see columns * @see rowCount */ get: function () { return this.getPropertyValue("columnLayout"); }, set: function (val) { this.setPropertyValue("columnLayout", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "columnsLocation", { get: function () { return this.columnLayout; }, set: function (val) { this.columnLayout = val; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "isColumnLayoutHorizontal", { /** * Returns true if columns are located horizontally * @see columnLayout */ get: function () { return this.columnLayout != "vertical"; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "detailPanelMode", { /** * Set the value to "underRow" to show the detailPanel under the row. */ get: function () { return this.getPropertyValue("detailPanelMode"); }, set: function (val) { this.setPropertyValue("detailPanelMode", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "detailPanel", { /** * The detail template Panel. This panel is used as a template on creating detail panel for a row. * @see detailElements * @see detailPanelMode */ get: function () { return this.detailPanelValue; }, enumerable: false, configurable: true }); QuestionMatrixDropdownModelBase.prototype.getPanel = function () { return this.detailPanel; }; Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "detailElements", { /** * The template Panel elements, questions and panels. * @see detailPanel * @see detailPanelMode */ get: function () { return this.detailPanel.elements; }, enumerable: false, configurable: true }); QuestionMatrixDropdownModelBase.prototype.createNewDetailPanel = function () { return _jsonobject__WEBPACK_IMPORTED_MODULE_0__["Serializer"].createClass("panel"); }; Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "hasRowText", { get: function () { return true; }, enumerable: false, configurable: true }); QuestionMatrixDropdownModelBase.prototype.getFooterText = function () { return null; }; Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "canAddRow", { get: function () { return false; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "canRemoveRows", { get: function () { return false; }, enumerable: false, configurable: true }); QuestionMatrixDropdownModelBase.prototype.canRemoveRow = function (row) { return true; }; QuestionMatrixDropdownModelBase.prototype.onRowsChanged = function () { this.resetRenderedTable(); _super.prototype.onRowsChanged.call(this); }; QuestionMatrixDropdownModelBase.prototype.onStartRowAddingRemoving = function () { this.lockResetRenderedTable = true; }; QuestionMatrixDropdownModelBase.prototype.onEndRowAdding = function () { this.lockResetRenderedTable = false; if (!this.renderedTable) return; if (this.renderedTable.isRequireReset()) { this.resetRenderedTable(); } else { this.renderedTable.onAddedRow(); } }; QuestionMatrixDropdownModelBase.prototype.onEndRowRemoving = function (row) { this.lockResetRenderedTable = false; if (this.renderedTable.isRequireReset()) { this.resetRenderedTable(); } else { if (!!row) { this.renderedTable.onRemovedRow(row); } } }; Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "renderedTableValue", { get: function () { return this.getPropertyValue("renderedTable", null); }, set: function (val) { this.setPropertyValue("renderedTable", val); }, enumerable: false, configurable: true }); QuestionMatrixDropdownModelBase.prototype.clearRowsAndResetRenderedTable = function () { this.clearGeneratedRows(); this.resetRenderedTable(); this.fireCallback(this.columnsChangedCallback); }; QuestionMatrixDropdownModelBase.prototype.resetRenderedTable = function () { if (this.lockResetRenderedTable || this.isLoadingFromJson) return; this.renderedTableValue = null; this.fireCallback(this.onRenderedTableResetCallback); }; QuestionMatrixDropdownModelBase.prototype.clearGeneratedRows = function () { if (!this.generatedVisibleRows) return; for (var i = 0; i < this.generatedVisibleRows.length; i++) { this.generatedVisibleRows[i].dispose(); } _super.prototype.clearGeneratedRows.call(this); }; Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "renderedTable", { get: function () { if (!this.renderedTableValue) { this.renderedTableValue = this.createRenderedTable(); if (!!this.onRenderedTableCreatedCallback) { this.onRenderedTableCreatedCallback(this.renderedTableValue); } } return this.renderedTableValue; }, enumerable: false, configurable: true }); QuestionMatrixDropdownModelBase.prototype.createRenderedTable = function () { return new _question_matrixdropdownrendered__WEBPACK_IMPORTED_MODULE_13__["QuestionMatrixDropdownRenderedTable"](this); }; QuestionMatrixDropdownModelBase.prototype.onMatrixRowCreated = function (row) { if (!this.survey) return; var options = { rowValue: row.value, row: row, column: null, columnName: null, cell: null, cellQuestion: null, value: null, }; for (var i = 0; i < this.visibleColumns.length; i++) { options.column = this.visibleColumns[i]; options.columnName = options.column.name; var cell = row.cells[i]; options.cell = cell; options.cellQuestion = cell.question; options.value = cell.value; if (!!this.onCellCreatedCallback) { this.onCellCreatedCallback(options); } this.survey.matrixCellCreated(this, options); } }; Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "cellType", { /** * Use this property to change the default cell type. */ get: function () { return this.getPropertyValue("cellType", _settings__WEBPACK_IMPORTED_MODULE_9__["settings"].matrixDefaultCellType); }, set: function (val) { val = val.toLowerCase(); this.setPropertyValue("cellType", val); }, enumerable: false, configurable: true }); QuestionMatrixDropdownModelBase.prototype.updateColumnsCellType = function () { for (var i = 0; i < this.columns.length; i++) { this.columns[i].defaultCellTypeChanged(); } }; QuestionMatrixDropdownModelBase.prototype.updateColumnsIndexes = function (cols) { for (var i = 0; i < cols.length; i++) { cols[i].setIndex(i); } }; Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "columnColCount", { /** * The default column count for radiogroup and checkbox cell types. */ get: function () { return this.getPropertyValue("columnColCount"); }, set: function (value) { if (value < 0 || value > 4) return; this.setPropertyValue("columnColCount", value); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "columnMinWidth", { /** * Use this property to set the minimum column width. */ get: function () { return this.getPropertyValue("columnMinWidth", ""); }, set: function (val) { this.setPropertyValue("columnMinWidth", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "horizontalScroll", { /** * Set this property to true to show the horizontal scroll. */ get: function () { return this.getPropertyValue("horizontalScroll", false); }, set: function (val) { this.setPropertyValue("horizontalScroll", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "allowAdaptiveActions", { /** * The Matrix toolbar and inner panel toolbars get adaptive if the property is set to true. */ get: function () { return this.getPropertyValue("allowAdaptiveActions"); }, set: function (val) { this.setPropertyValue("allowAdaptiveActions", val); if (!!this.detailPanel) { this.detailPanel.allowAdaptiveActions = val; } }, enumerable: false, configurable: true }); QuestionMatrixDropdownModelBase.prototype.getRequiredText = function () { return this.survey ? this.survey.requiredText : ""; }; QuestionMatrixDropdownModelBase.prototype.onColumnPropertyChanged = function (column, name, newValue) { this.updateHasFooter(); if (!this.generatedVisibleRows) return; for (var i = 0; i < this.generatedVisibleRows.length; i++) { this.generatedVisibleRows[i].updateCellQuestionOnColumnChanged(column, name, newValue); } if (!!this.generatedTotalRow) { this.generatedTotalRow.updateCellQuestionOnColumnChanged(column, name, newValue); } this.onColumnsChanged(); if (name == "isRequired") { this.resetRenderedTable(); } if (column.isShowInMultipleColumns) { this.onShowInMultipleColumnsChanged(column); } }; QuestionMatrixDropdownModelBase.prototype.onColumnItemValuePropertyChanged = function (column, propertyName, obj, name, newValue, oldValue) { if (!this.generatedVisibleRows) return; for (var i = 0; i < this.generatedVisibleRows.length; i++) { this.generatedVisibleRows[i].updateCellQuestionOnColumnItemValueChanged(column, propertyName, obj, name, newValue, oldValue); } }; QuestionMatrixDropdownModelBase.prototype.onShowInMultipleColumnsChanged = function (column) { this.clearGeneratedRows(); this.resetRenderedTable(); }; QuestionMatrixDropdownModelBase.prototype.onColumnCellTypeChanged = function (column) { this.clearGeneratedRows(); this.resetRenderedTable(); }; QuestionMatrixDropdownModelBase.prototype.getRowTitleWidth = function () { return ""; }; Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "hasFooter", { get: function () { return this.getPropertyValue("hasFooter", false); }, enumerable: false, configurable: true }); QuestionMatrixDropdownModelBase.prototype.getAddRowLocation = function () { return "default"; }; QuestionMatrixDropdownModelBase.prototype.getShowColumnsIfEmpty = function () { return false; }; QuestionMatrixDropdownModelBase.prototype.updateShowTableAndAddRow = function () { if (!!this.renderedTable) { this.renderedTable.updateShowTableAndAddRow(); } }; QuestionMatrixDropdownModelBase.prototype.updateHasFooter = function () { this.setPropertyValue("hasFooter", this.hasTotal); }; Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "hasTotal", { get: function () { for (var i = 0; i < this.columns.length; i++) { if (this.columns[i].hasTotal) return true; } return false; }, enumerable: false, configurable: true }); QuestionMatrixDropdownModelBase.prototype.getCellType = function () { return this.cellType; }; QuestionMatrixDropdownModelBase.prototype.getCustomCellType = function (column, row, cellType) { if (!this.survey) return cellType; var options = { rowValue: row.value, row: row, column: column, columnName: column.name, cellType: cellType }; this.survey.matrixCellCreating(this, options); return options.cellType; }; QuestionMatrixDropdownModelBase.prototype.getConditionJson = function (operator, path) { if (operator === void 0) { operator = null; } if (path === void 0) { path = null; } if (!path) return _super.prototype.getConditionJson.call(this); var columnName = ""; for (var i = path.length - 1; i >= 0; i--) { if (path[i] == ".") break; columnName = path[i] + columnName; } var column = this.getColumnByName(columnName); if (!column) return null; var question = column.createCellQuestion(null); if (!question) return null; return question.getConditionJson(operator); }; QuestionMatrixDropdownModelBase.prototype.clearIncorrectValues = function () { var rows = this.visibleRows; if (!rows) return; for (var i = 0; i < rows.length; i++) { rows[i].clearIncorrectValues(this.getRowValue(i)); } }; QuestionMatrixDropdownModelBase.prototype.clearErrors = function () { _super.prototype.clearErrors.call(this); if (!!this.generatedVisibleRows) { for (var i = 0; i < this.generatedVisibleRows.length; i++) { var row = this.generatedVisibleRows[i]; for (var j = 0; j < row.cells.length; j++) { row.cells[j].question.clearErrors(); } } } }; QuestionMatrixDropdownModelBase.prototype.runCondition = function (values, properties) { _super.prototype.runCondition.call(this, values, properties); var counter = 0; var prevTotalValue; do { prevTotalValue = _helpers__WEBPACK_IMPORTED_MODULE_2__["Helpers"].getUnbindValue(this.totalValue); this.runCellsCondition(values, properties); this.runTotalsCondition(values, properties); counter++; } while (!_helpers__WEBPACK_IMPORTED_MODULE_2__["Helpers"].isTwoValueEquals(prevTotalValue, this.totalValue) && counter < 3); }; QuestionMatrixDropdownModelBase.prototype.shouldRunColumnExpression = function () { return false; }; QuestionMatrixDropdownModelBase.prototype.runCellsCondition = function (values, properties) { if (!this.generatedVisibleRows) return; var newValues = this.getRowConditionValues(values); var rows = this.generatedVisibleRows; for (var i = 0; i < rows.length; i++) { rows[i].runCondition(newValues, properties); } this.checkColumnsVisibility(); }; QuestionMatrixDropdownModelBase.prototype.checkColumnsVisibility = function () { var hasChanged = false; for (var i = 0; i < this.visibleColumns.length; i++) { if (!this.visibleColumns[i].visibleIf) continue; hasChanged = this.isColumnVisibilityChanged(this.visibleColumns[i]) || hasChanged; } if (hasChanged) { this.resetRenderedTable(); } }; QuestionMatrixDropdownModelBase.prototype.isColumnVisibilityChanged = function (column) { var curVis = column.hasVisibleCell; var hasVisCell = false; var rows = this.generatedVisibleRows; for (var i = 0; i < rows.length; i++) { var cell = rows[i].cells[column.index]; if (!!cell && !!cell.question && cell.question.isVisible) { hasVisCell = true; break; } } if (curVis != hasVisCell) { column.hasVisibleCell = hasVisCell; } return curVis != hasVisCell; }; QuestionMatrixDropdownModelBase.prototype.runTotalsCondition = function (values, properties) { if (!this.generatedTotalRow) return; this.generatedTotalRow.runCondition(this.getRowConditionValues(values), properties); }; QuestionMatrixDropdownModelBase.prototype.getRowConditionValues = function (values) { var newValues = values; if (!newValues) newValues = {}; /* var newValues: { [index: string]: any } = {}; if (values && values instanceof Object) { newValues = JSON.parse(JSON.stringify(values)); } */ var totalRow = {}; if (!this.isValueEmpty(this.totalValue)) { totalRow = JSON.parse(JSON.stringify(this.totalValue)); } newValues["row"] = {}; newValues["totalRow"] = totalRow; return newValues; }; QuestionMatrixDropdownModelBase.prototype.locStrsChanged = function () { _super.prototype.locStrsChanged.call(this); var columns = this.columns; for (var i = 0; i < columns.length; i++) { columns[i].locStrsChanged(); } var rows = this.generatedVisibleRows; if (!rows) return; for (var i = 0; i < rows.length; i++) { rows[i].locStrsChanged(); } if (!!this.generatedTotalRow) { this.generatedTotalRow.locStrsChanged(); } }; /** * Returns the column by it's name. Returns null if a column with this name doesn't exist. * @param column */ QuestionMatrixDropdownModelBase.prototype.getColumnByName = function (columnName) { for (var i = 0; i < this.columns.length; i++) { if (this.columns[i].name == columnName) return this.columns[i]; } return null; }; QuestionMatrixDropdownModelBase.prototype.getColumnName = function (columnName) { return this.getColumnByName(columnName); }; /** * Returns the column width. * @param column */ QuestionMatrixDropdownModelBase.prototype.getColumnWidth = function (column) { return column.minWidth ? column.minWidth : this.columnMinWidth; }; Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "choices", { /** * The default choices for dropdown, checkbox and radiogroup cell types. */ get: function () { return this.getPropertyValue("choices"); }, set: function (val) { this.setPropertyValue("choices", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "optionsCaption", { /** * The default options caption for dropdown cell type. */ get: function () { return this.getLocalizableStringText("optionsCaption", _surveyStrings__WEBPACK_IMPORTED_MODULE_6__["surveyLocalization"].getString("optionsCaption")); }, set: function (val) { this.setLocalizableStringText("optionsCaption", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "locOptionsCaption", { get: function () { return this.getLocalizableString("optionsCaption"); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "keyDuplicationError", { /** * The duplication value error text. Set it to show the text different from the default. * @see MatrixDropdownColumn.isUnique */ get: function () { return this.getLocalizableStringText("keyDuplicationError", _surveyStrings__WEBPACK_IMPORTED_MODULE_6__["surveyLocalization"].getString("keyDuplicationError")); }, set: function (val) { this.setLocalizableStringText("keyDuplicationError", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "locKeyDuplicationError", { get: function () { return this.getLocalizableString("keyDuplicationError"); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "storeOthersAsComment", { get: function () { return !!this.survey ? this.survey.storeOthersAsComment : false; }, enumerable: false, configurable: true }); QuestionMatrixDropdownModelBase.prototype.addColumn = function (name, title) { if (title === void 0) { title = null; } var column = new _question_matrixdropdowncolumn__WEBPACK_IMPORTED_MODULE_12__["MatrixDropdownColumn"](name, title); this.columns.push(column); return column; }; QuestionMatrixDropdownModelBase.prototype.getVisibleRows = function () { var _this = this; if (this.isLoadingFromJson) return null; if (!this.generatedVisibleRows) { this.generatedVisibleRows = this.generateRows(); this.generatedVisibleRows.forEach(function (row) { return _this.onMatrixRowCreated(row); }); if (this.data) { this.runCellsCondition(this.data.getFilteredValues(), this.data.getFilteredProperties()); } this.updateValueOnRowsGeneration(this.generatedVisibleRows); this.updateIsAnswered(); } return this.generatedVisibleRows; }; QuestionMatrixDropdownModelBase.prototype.updateValueOnRowsGeneration = function (rows) { var oldValue = this.createNewValue(true); var newValue = this.createNewValue(); for (var i = 0; i < rows.length; i++) { var row = rows[i]; if (!!row.editingObj) continue; var rowValue = this.getRowValue(i); var rValue = row.value; if (this.isTwoValueEquals(rowValue, rValue)) continue; newValue = this.getNewValueOnRowChanged(row, "", rValue, false, newValue) .value; } if (this.isTwoValueEquals(oldValue, newValue)) return; this.isRowChanging = true; this.setNewValue(newValue); this.isRowChanging = false; }; Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "totalValue", { get: function () { if (!this.hasTotal || !this.visibleTotalRow) return {}; return this.visibleTotalRow.value; }, enumerable: false, configurable: true }); QuestionMatrixDropdownModelBase.prototype.getVisibleTotalRow = function () { if (this.isLoadingFromJson) return null; if (this.hasTotal) { if (!this.generatedTotalRow) { this.generatedTotalRow = this.generateTotalRow(); if (this.data) { var properties = { survey: this.survey }; this.runTotalsCondition(this.data.getAllValues(), properties); } } } else { this.generatedTotalRow = null; } return this.generatedTotalRow; }; Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "visibleTotalRow", { get: function () { return this.getVisibleTotalRow(); }, enumerable: false, configurable: true }); QuestionMatrixDropdownModelBase.prototype.onSurveyLoad = function () { _super.prototype.onSurveyLoad.call(this); this.updateColumnsIndexes(this.columns); this.clearGeneratedRows(); this.generatedTotalRow = null; this.updateHasFooter(); }; /** * Returns the row value. If the row value is empty, the object is empty: {}. * @param rowIndex row index from 0 to visible row count - 1. */ QuestionMatrixDropdownModelBase.prototype.getRowValue = function (rowIndex) { if (rowIndex < 0) return null; var visRows = this.visibleRows; if (rowIndex >= visRows.length) return null; var newValue = this.createNewValue(); return this.getRowValueCore(visRows[rowIndex], newValue); }; QuestionMatrixDropdownModelBase.prototype.checkIfValueInRowDuplicated = function (checkedRow, cellQuestion) { if (!this.generatedVisibleRows) return false; var res = false; for (var i = 0; i < this.generatedVisibleRows.length; i++) { var row = this.generatedVisibleRows[i]; if (checkedRow === row) continue; if (row.getValue(cellQuestion.name) == cellQuestion.value) { res = true; break; } } if (res) { this.addDuplicationError(cellQuestion); } else { cellQuestion.clearErrors(); } return res; }; /** * Set the row value. * @param rowIndex row index from 0 to visible row count - 1. * @param rowValue an object {"column name": columnValue,... } */ QuestionMatrixDropdownModelBase.prototype.setRowValue = function (rowIndex, rowValue) { if (rowIndex < 0) return null; var visRows = this.visibleRows; if (rowIndex >= visRows.length) return null; visRows[rowIndex].value = rowValue; this.onRowChanged(visRows[rowIndex], "", rowValue, false); }; QuestionMatrixDropdownModelBase.prototype.generateRows = function () { return null; }; QuestionMatrixDropdownModelBase.prototype.generateTotalRow = function () { return new MatrixDropdownTotalRowModel(this); }; QuestionMatrixDropdownModelBase.prototype.createNewValue = function (nullOnEmpty) { if (nullOnEmpty === void 0) { nullOnEmpty = false; } var res = !this.value ? {} : this.createValueCopy(); if (nullOnEmpty && this.isMatrixValueEmpty(res)) return null; return res; }; QuestionMatrixDropdownModelBase.prototype.getRowValueCore = function (row, questionValue, create) { if (create === void 0) { create = false; } var result = !!questionValue && !!questionValue[row.rowName] ? questionValue[row.rowName] : null; if (!result && create) { result = {}; if (!!questionValue) { questionValue[row.rowName] = result; } } return result; }; QuestionMatrixDropdownModelBase.prototype.getRowObj = function (row) { var obj = this.getRowValueCore(row, this.value); return !!obj && !!obj.getType ? obj : null; }; QuestionMatrixDropdownModelBase.prototype.getRowDisplayValue = function (keysAsText, row, rowValue) { if (!rowValue) return rowValue; if (!!row.editingObj) return rowValue; var keys = Object.keys(rowValue); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var question = row.getQuestionByName(key); if (!question) { question = this.getSharedQuestionByName(key, row); } if (!!question) { var displayvalue = question.getDisplayValue(keysAsText, rowValue[key]); if (keysAsText && !!question.title && question.title !== key) { rowValue[question.title] = displayvalue; delete rowValue[key]; } else { rowValue[key] = displayvalue; } } } return rowValue; }; QuestionMatrixDropdownModelBase.prototype.getPlainData = function (options) { var _this = this; if (options === void 0) { options = { includeEmpty: true, }; } var questionPlainData = _super.prototype.getPlainData.call(this, options); if (!!questionPlainData) { questionPlainData.isNode = true; questionPlainData.data = this.visibleRows.map(function (row) { var rowDataItem = { name: row.rowName, title: row.text, value: row.value, displayValue: _this.getRowDisplayValue(false, row, row.value), getString: function (val) { return typeof val === "object" ? JSON.stringify(val) : val; }, isNode: true, data: row.cells .map(function (cell) { return cell.question.getPlainData(options); }) .filter(function (d) { return !!d; }), }; (options.calculations || []).forEach(function (calculation) { rowDataItem[calculation.propertyName] = row[calculation.propertyName]; }); return rowDataItem; }); } return questionPlainData; }; QuestionMatrixDropdownModelBase.prototype.getProgressInfo = function () { return _survey_element__WEBPACK_IMPORTED_MODULE_3__["SurveyElement"].getProgressInfoByElements(this.getCellQuestions(), this.isRequired); }; QuestionMatrixDropdownModelBase.prototype.getCellQuestions = function () { var rows = this.visibleRows; if (!rows) return []; var questions = []; for (var i = 0; i < rows.length; i++) { var row = rows[i]; for (var j = 0; j < row.cells.length; j++) { questions.push(row.cells[j].question); } } return questions; }; QuestionMatrixDropdownModelBase.prototype.onBeforeValueChanged = function (val) { }; QuestionMatrixDropdownModelBase.prototype.onSetQuestionValue = function () { if (this.isRowChanging) return; this.onBeforeValueChanged(this.value); if (!this.generatedVisibleRows || this.generatedVisibleRows.length == 0) return; this.isRowChanging = true; var val = this.createNewValue(); for (var i = 0; i < this.generatedVisibleRows.length; i++) { var row = this.generatedVisibleRows[i]; this.generatedVisibleRows[i].value = this.getRowValueCore(row, val); } this.isRowChanging = false; }; QuestionMatrixDropdownModelBase.prototype.setQuestionValue = function (newValue) { _super.prototype.setQuestionValue.call(this, newValue, false); this.onSetQuestionValue(); this.updateIsAnswered(); }; QuestionMatrixDropdownModelBase.prototype.supportGoNextPageAutomatic = function () { var rows = this.generatedVisibleRows; if (!rows) rows = this.visibleRows; if (!rows) return true; for (var i = 0; i < rows.length; i++) { var cells = this.generatedVisibleRows[i].cells; if (!cells) continue; for (var colIndex = 0; colIndex < cells.length; colIndex++) { var question = cells[colIndex].question; if (question && (!question.supportGoNextPageAutomatic() || !question.value)) return false; } } return true; }; QuestionMatrixDropdownModelBase.prototype.getContainsErrors = function () { return (_super.prototype.getContainsErrors.call(this) || this.checkForAnswersOrErrors(function (question) { return question.containsErrors; }, false)); }; QuestionMatrixDropdownModelBase.prototype.getIsAnswered = function () { return (_super.prototype.getIsAnswered.call(this) && this.checkForAnswersOrErrors(function (question) { return question.isAnswered; }, true)); }; QuestionMatrixDropdownModelBase.prototype.checkForAnswersOrErrors = function (predicate, every) { if (every === void 0) { every = false; } var rows = this.generatedVisibleRows; if (!rows) return false; for (var i = 0; i < rows.length; i++) { var cells = rows[i].cells; if (!cells) continue; for (var colIndex = 0; colIndex < cells.length; colIndex++) { if (!cells[colIndex]) continue; var question = cells[colIndex].question; if (question && question.isVisible) if (predicate(question)) { if (!every) return true; } else { if (every) return false; } } } return every ? true : false; }; QuestionMatrixDropdownModelBase.prototype.hasErrors = function (fireCallback, rec) { if (fireCallback === void 0) { fireCallback = true; } if (rec === void 0) { rec = null; } var errosInRows = this.hasErrorInRows(fireCallback, rec); var isDuplicated = this.isValueDuplicated(); return _super.prototype.hasErrors.call(this, fireCallback, rec) || errosInRows || isDuplicated; }; QuestionMatrixDropdownModelBase.prototype.getIsRunningValidators = function () { if (_super.prototype.getIsRunningValidators.call(this)) return true; if (!this.generatedVisibleRows) return false; for (var i = 0; i < this.generatedVisibleRows.length; i++) { var cells = this.generatedVisibleRows[i].cells; if (!cells) continue; for (var colIndex = 0; colIndex < cells.length; colIndex++) { if (!cells[colIndex]) continue; var question = cells[colIndex].question; if (!!question && question.isRunningValidators) return true; } } return false; }; QuestionMatrixDropdownModelBase.prototype.getAllErrors = function () { var result = _super.prototype.getAllErrors.call(this); var rows = this.generatedVisibleRows; if (rows === null) return result; for (var i = 0; i < rows.length; i++) { var row = rows[i]; for (var j = 0; j < row.cells.length; j++) { var errors = row.cells[j].question.getAllErrors(); if (errors && errors.length > 0) { result = result.concat(errors); } } } return result; }; QuestionMatrixDropdownModelBase.prototype.hasErrorInRows = function (fireCallback, rec) { var _this = this; if (!this.generatedVisibleRows) return false; var res = false; if (!rec) rec = {}; rec.isSingleDetailPanel = this.detailPanelMode === "underRowSingle"; for (var i = 0; i < this.generatedVisibleRows.length; i++) { res = this.generatedVisibleRows[i].hasErrors(fireCallback, rec, function () { _this.raiseOnCompletedAsyncValidators(); }) || res; } return res; }; QuestionMatrixDropdownModelBase.prototype.isValueDuplicated = function () { if (!this.generatedVisibleRows) return false; var columns = this.getUniqueColumns(); var res = false; for (var i = 0; i < columns.length; i++) { res = this.isValueInColumnDuplicated(columns[i]) || res; } return res; }; QuestionMatrixDropdownModelBase.prototype.isValueInColumnDuplicated = function (column) { var keyValues = []; var res = false; for (var i = 0; i < this.generatedVisibleRows.length; i++) { res = this.isValueDuplicatedInRow(this.generatedVisibleRows[i], column, keyValues) || res; } return res; }; QuestionMatrixDropdownModelBase.prototype.getUniqueColumns = function () { var res = new Array(); for (var i = 0; i < this.columns.length; i++) { if (this.columns[i].isUnique) { res.push(this.columns[i]); } } return res; }; QuestionMatrixDropdownModelBase.prototype.isValueDuplicatedInRow = function (row, column, keyValues) { var question = row.getQuestionByColumn(column); if (!question || question.isEmpty()) return false; var value = question.value; for (var i = 0; i < keyValues.length; i++) { if (value == keyValues[i]) { this.addDuplicationError(question); return true; } } keyValues.push(value); return false; }; QuestionMatrixDropdownModelBase.prototype.addDuplicationError = function (question) { question.addError(new _error__WEBPACK_IMPORTED_MODULE_10__["KeyDuplicationError"](this.keyDuplicationError, this)); }; QuestionMatrixDropdownModelBase.prototype.getFirstInputElementId = function () { var question = this.getFirstCellQuestion(false); return question ? question.inputId : _super.prototype.getFirstInputElementId.call(this); }; QuestionMatrixDropdownModelBase.prototype.getFirstErrorInputElementId = function () { var question = this.getFirstCellQuestion(true); return question ? question.inputId : _super.prototype.getFirstErrorInputElementId.call(this); }; QuestionMatrixDropdownModelBase.prototype.getFirstCellQuestion = function (onError) { if (!this.generatedVisibleRows) return null; for (var i = 0; i < this.generatedVisibleRows.length; i++) { var cells = this.generatedVisibleRows[i].cells; for (var colIndex = 0; colIndex < cells.length; colIndex++) { if (!onError) return cells[colIndex].question; if (cells[colIndex].question.currentErrorCount > 0) return cells[colIndex].question; } } return null; }; QuestionMatrixDropdownModelBase.prototype.onReadOnlyChanged = function () { _super.prototype.onReadOnlyChanged.call(this); if (!this.generateRows) return; for (var i = 0; i < this.visibleRows.length; i++) { this.visibleRows[i].onQuestionReadOnlyChanged(this.isReadOnly); } }; //IMatrixDropdownData QuestionMatrixDropdownModelBase.prototype.createQuestion = function (row, column) { return this.createQuestionCore(row, column); }; QuestionMatrixDropdownModelBase.prototype.createQuestionCore = function (row, column) { var question = column.createCellQuestion(row); if (this.isReadOnly) { question.readOnly = true; } question.setSurveyImpl(row); question.setParentQuestion(this); return question; }; QuestionMatrixDropdownModelBase.prototype.deleteRowValue = function (newValue, row) { if (!newValue) return newValue; delete newValue[row.rowName]; return this.isObject(newValue) && Object.keys(newValue).length == 0 ? null : newValue; }; QuestionMatrixDropdownModelBase.prototype.onAnyValueChanged = function (name) { if (this.isLoadingFromJson || this.isDoingonAnyValueChanged || !this.generatedVisibleRows) return; this.isDoingonAnyValueChanged = true; var rows = this.visibleRows; for (var i = 0; i < rows.length; i++) { rows[i].onAnyValueChanged(name); } var totalRow = this.visibleTotalRow; if (!!totalRow) { totalRow.onAnyValueChanged(name); } this.isDoingonAnyValueChanged = false; }; QuestionMatrixDropdownModelBase.prototype.isObject = function (value) { return value !== null && typeof value === "object"; }; QuestionMatrixDropdownModelBase.prototype.getOnCellValueChangedOptions = function (row, columnName, rowValue) { var getQuestion = function (colName) { for (var i = 0; i < row.cells.length; i++) { var col = row.cells[i].column; if (!!col && col.name === colName) { return row.cells[i].question; } } return null; }; return { row: row, columnName: columnName, rowValue: rowValue, value: !!rowValue ? rowValue[columnName] : null, getCellQuestion: getQuestion, }; }; QuestionMatrixDropdownModelBase.prototype.onCellValueChanged = function (row, columnName, rowValue) { if (!this.survey) return; var options = this.getOnCellValueChangedOptions(row, columnName, rowValue); if (!!this.onCellValueChangedCallback) { this.onCellValueChangedCallback(options); } this.survey.matrixCellValueChanged(this, options); }; QuestionMatrixDropdownModelBase.prototype.validateCell = function (row, columnName, rowValue) { if (!this.survey) return; var options = this.getOnCellValueChangedOptions(row, columnName, rowValue); return this.survey.matrixCellValidate(this, options); }; Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "isValidateOnValueChanging", { get: function () { return !!this.survey ? this.survey.isValidateOnValueChanging : false; }, enumerable: false, configurable: true }); QuestionMatrixDropdownModelBase.prototype.onRowChanging = function (row, columnName, rowValue) { if (!this.survey) return !!rowValue ? rowValue[columnName] : null; var options = this.getOnCellValueChangedOptions(row, columnName, rowValue); var oldRowValue = this.getRowValueCore(row, this.createNewValue(), true); options.oldValue = !!oldRowValue ? oldRowValue[columnName] : null; this.survey.matrixCellValueChanging(this, options); return options.value; }; QuestionMatrixDropdownModelBase.prototype.onRowChanged = function (row, columnName, newRowValue, isDeletingValue) { var rowObj = !!columnName ? this.getRowObj(row) : null; if (!!rowObj) { var columnValue = null; if (!!newRowValue && !isDeletingValue) { columnValue = newRowValue[columnName]; } this.isRowChanging = true; rowObj[columnName] = columnValue; this.isRowChanging = false; this.onCellValueChanged(row, columnName, rowObj); } else { var oldValue = this.createNewValue(true); var combine = this.getNewValueOnRowChanged(row, columnName, newRowValue, isDeletingValue, this.createNewValue()); if (this.isTwoValueEquals(oldValue, combine.value)) return; this.isRowChanging = true; this.setNewValue(combine.value); this.isRowChanging = false; if (columnName) { this.onCellValueChanged(row, columnName, combine.rowValue); } } }; QuestionMatrixDropdownModelBase.prototype.getNewValueOnRowChanged = function (row, columnName, newRowValue, isDeletingValue, newValue) { var rowValue = this.getRowValueCore(row, newValue, true); if (isDeletingValue) { delete rowValue[columnName]; } for (var i = 0; i < row.cells.length; i++) { var key = row.cells[i].question.getValueName(); delete rowValue[key]; } if (newRowValue) { newRowValue = JSON.parse(JSON.stringify(newRowValue)); for (var key in newRowValue) { if (!this.isValueEmpty(newRowValue[key])) { rowValue[key] = newRowValue[key]; } } } if (this.isObject(rowValue) && Object.keys(rowValue).length === 0) { newValue = this.deleteRowValue(newValue, row); } return { value: newValue, rowValue: rowValue }; }; QuestionMatrixDropdownModelBase.prototype.getRowIndex = function (row) { if (!this.generatedVisibleRows) return -1; return this.visibleRows.indexOf(row); }; QuestionMatrixDropdownModelBase.prototype.getElementsInDesign = function (includeHidden) { if (includeHidden === void 0) { includeHidden = false; } if (this.detailPanelMode == "none") return _super.prototype.getElementsInDesign.call(this, includeHidden); return includeHidden ? [this.detailPanel] : this.detailElements; }; QuestionMatrixDropdownModelBase.prototype.hasDetailPanel = function (row) { if (this.detailPanelMode == "none") return false; if (this.isDesignMode) return true; if (!!this.onHasDetailPanelCallback) return this.onHasDetailPanelCallback(row); return this.detailElements.length > 0; }; QuestionMatrixDropdownModelBase.prototype.getIsDetailPanelShowing = function (row) { if (this.detailPanelMode == "none") return false; if (this.isDesignMode) { var res = this.visibleRows.indexOf(row) == 0; if (res) { if (!row.detailPanel) { row.showDetailPanel(); } } return res; } return this.getPropertyValue("isRowShowing" + row.id, false); }; QuestionMatrixDropdownModelBase.prototype.setIsDetailPanelShowing = function (row, val) { if (val == this.getIsDetailPanelShowing(row)) return; this.setPropertyValue("isRowShowing" + row.id, val); this.updateDetailPanelButtonCss(row); if (!!this.renderedTable) { this.renderedTable.onDetailPanelChangeVisibility(row, val); } if (val && this.detailPanelMode === "underRowSingle") { var rows = this.visibleRows; for (var i = 0; i < rows.length; i++) { if (rows[i].id !== row.id && rows[i].isDetailPanelShowing) { rows[i].hideDetailPanel(); } } } }; QuestionMatrixDropdownModelBase.prototype.getDetailPanelButtonCss = function (row) { var builder = new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_11__["CssClassBuilder"]().append(this.getPropertyValue("detailButtonCss" + row.id)); return builder.append(this.cssClasses.detailButton, builder.toString() === "").toString(); }; QuestionMatrixDropdownModelBase.prototype.getDetailPanelIconCss = function (row) { var builder = new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_11__["CssClassBuilder"]().append(this.getPropertyValue("detailIconCss" + row.id)); return builder.append(this.cssClasses.detailIcon, builder.toString() === "").toString(); }; QuestionMatrixDropdownModelBase.prototype.updateDetailPanelButtonCss = function (row) { var classes = this.cssClasses; var isPanelShowing = this.getIsDetailPanelShowing(row); var iconBuilder = new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_11__["CssClassBuilder"]().append(classes.detailIcon) .append(classes.detailIconExpanded, isPanelShowing); this.setPropertyValue("detailIconCss" + row.id, iconBuilder.toString()); var buttonBuilder = new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_11__["CssClassBuilder"]().append(classes.detailButton) .append(classes.detailButtonExpanded, isPanelShowing); this.setPropertyValue("detailButtonCss" + row.id, buttonBuilder.toString()); }; QuestionMatrixDropdownModelBase.prototype.createRowDetailPanel = function (row) { if (this.isDesignMode) return this.detailPanel; var panel = this.createNewDetailPanel(); panel.readOnly = this.isReadOnly; var json = this.detailPanel.toJSON(); new _jsonobject__WEBPACK_IMPORTED_MODULE_0__["JsonObject"]().toObject(json, panel); panel.renderWidth = "100%"; panel.updateCustomWidgets(); if (!!this.onCreateDetailPanelCallback) { this.onCreateDetailPanelCallback(row, panel); } return panel; }; QuestionMatrixDropdownModelBase.prototype.getSharedQuestionByName = function (columnName, row) { if (!this.survey || !this.valueName) return null; var index = this.getRowIndex(row); if (index < 0) return null; return (this.survey.getQuestionByValueNameFromArray(this.valueName, columnName, index)); }; QuestionMatrixDropdownModelBase.prototype.onTotalValueChanged = function () { if (!!this.data && !!this.visibleTotalRow && !this.isLoadingFromJson && !this.isSett && !this.isReadOnly) { this.data.setValue(this.getValueName() + _settings__WEBPACK_IMPORTED_MODULE_9__["settings"].matrixTotalValuePostFix, this.totalValue, false); } }; QuestionMatrixDropdownModelBase.prototype.getQuestionFromArray = function (name, index) { if (index >= this.visibleRows.length) return null; return this.visibleRows[index].getQuestionByName(name); }; QuestionMatrixDropdownModelBase.prototype.isMatrixValueEmpty = function (val) { if (!val) return; if (Array.isArray(val)) { for (var i = 0; i < val.length; i++) { if (this.isObject(val[i]) && Object.keys(val[i]).length > 0) return false; } return true; } return Object.keys(val).length == 0; }; Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "SurveyModel", { get: function () { return this.survey; }, enumerable: false, configurable: true }); QuestionMatrixDropdownModelBase.prototype.getCellTemplateData = function (cell) { // return cell.cell.column.templateQuestion; return this.SurveyModel.getMatrixCellTemplateData(cell); }; QuestionMatrixDropdownModelBase.prototype.getCellWrapperComponentName = function (cell) { return this.SurveyModel.getElementWrapperComponentName(cell, "cell"); }; QuestionMatrixDropdownModelBase.prototype.getCellWrapperComponentData = function (cell) { return this.SurveyModel.getElementWrapperComponentData(cell, "cell"); }; QuestionMatrixDropdownModelBase.prototype.getColumnHeaderWrapperComponentName = function (cell) { return this.SurveyModel.getElementWrapperComponentName(cell, "column-header"); }; QuestionMatrixDropdownModelBase.prototype.getColumnHeaderWrapperComponentData = function (cell) { return this.SurveyModel.getElementWrapperComponentData(cell, "column-header"); }; QuestionMatrixDropdownModelBase.prototype.getRowHeaderWrapperComponentName = function (cell) { return this.SurveyModel.getElementWrapperComponentName(cell, "row-header"); }; QuestionMatrixDropdownModelBase.prototype.getRowHeaderWrapperComponentData = function (cell) { return this.SurveyModel.getElementWrapperComponentData(cell, "row-header"); }; return QuestionMatrixDropdownModelBase; }(_martixBase__WEBPACK_IMPORTED_MODULE_1__["QuestionMatrixBaseModel"])); _jsonobject__WEBPACK_IMPORTED_MODULE_0__["Serializer"].addClass("matrixdropdownbase", [ { name: "columns:matrixdropdowncolumns", className: "matrixdropdowncolumn", }, { name: "columnLayout", alternativeName: "columnsLocation", default: "horizontal", choices: ["horizontal", "vertical"], }, { name: "detailElements", visible: false, isLightSerializable: false, }, { name: "detailPanelMode", choices: ["none", "underRow", "underRowSingle"], default: "none", }, "horizontalScroll:boolean", { name: "choices:itemvalue[]", }, { name: "optionsCaption", serializationProperty: "locOptionsCaption" }, { name: "keyDuplicationError", serializationProperty: "locKeyDuplicationError", }, { name: "cellType", default: "dropdown", choices: function () { return _question_matrixdropdowncolumn__WEBPACK_IMPORTED_MODULE_12__["MatrixDropdownColumn"].getColumnTypes(); }, }, { name: "columnColCount", default: 0, choices: [0, 1, 2, 3, 4] }, "columnMinWidth", { name: "allowAdaptiveActions:boolean", default: true, visible: false }, ], function () { return new QuestionMatrixDropdownModelBase(""); }, "matrixbase"); /***/ }), /***/ "./src/question_matrixdropdowncolumn.ts": /*!**********************************************!*\ !*** ./src/question_matrixdropdowncolumn.ts ***! \**********************************************/ /*! exports provided: matrixDropdownColumnTypes, MatrixDropdownColumn */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "matrixDropdownColumnTypes", function() { return matrixDropdownColumnTypes; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatrixDropdownColumn", function() { return MatrixDropdownColumn; }); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./base */ "./src/base.ts"); /* harmony import */ var _question_expression__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./question_expression */ "./src/question_expression.ts"); /* harmony import */ var _settings__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./settings */ "./src/settings.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); function onUpdateSelectBaseCellQuestion(cellQuestion, column, question, data) { cellQuestion.storeOthersAsComment = !!question ? question.storeOthersAsComment : false; if ((!cellQuestion.choices || cellQuestion.choices.length == 0) && cellQuestion.choicesByUrl.isEmpty) { cellQuestion.choices = question.choices; } if (!cellQuestion.choicesByUrl.isEmpty) { cellQuestion.choicesByUrl.run(data.getTextProcessor()); } } var matrixDropdownColumnTypes = { dropdown: { properties: [ "choices", "choicesOrder", "choicesByUrl", "optionsCaption", "otherText", "choicesVisibleIf", ], onCellQuestionUpdate: function (cellQuestion, column, question, data) { onUpdateSelectBaseCellQuestion(cellQuestion, column, question, data); if (!!cellQuestion.locOptionsCaption && cellQuestion.locOptionsCaption.isEmpty && !question.locOptionsCaption.isEmpty) { cellQuestion.optionsCaption = question.optionsCaption; } }, }, checkbox: { properties: [ "choices", "choicesOrder", "choicesByUrl", "otherText", "choicesVisibleIf", "hasSelectAll", "hasNone", ], onCellQuestionUpdate: function (cellQuestion, column, question, data) { onUpdateSelectBaseCellQuestion(cellQuestion, column, question, data); cellQuestion.colCount = column.colCount > -1 ? column.colCount : question.columnColCount; }, }, radiogroup: { properties: [ "choices", "choicesOrder", "choicesByUrl", "otherText", "choicesVisibleIf", ], onCellQuestionUpdate: function (cellQuestion, column, question, data) { onUpdateSelectBaseCellQuestion(cellQuestion, column, question, data); cellQuestion.colCount = column.colCount > -1 ? column.colCount : question.columnColCount; }, }, text: { properties: ["placeHolder", "inputType", "maxLength", "min", "max", "step"], onCellQuestionUpdate: function (cellQuestion, column, question, data) { }, }, comment: { properties: ["placeHolder", "rows", "maxLength"], onCellQuestionUpdate: function (cellQuestion, column, question, data) { }, }, boolean: { properties: ["renderAs", "defaultValue"], onCellQuestionUpdate: function (cellQuestion, column, question, data) { cellQuestion.showTitle = true; cellQuestion.renderAs = column.renderAs; }, }, expression: { properties: ["expression", "displayStyle", "currency"], onCellQuestionUpdate: function (cellQuestion, column, question, data) { }, }, rating: { properties: ["rateValues"], }, }; var MatrixDropdownColumn = /** @class */ (function (_super) { __extends(MatrixDropdownColumn, _super); function MatrixDropdownColumn(name, title) { if (title === void 0) { title = null; } var _this = _super.call(this) || this; _this.colOwnerValue = null; _this.indexValue = -1; _this._isVisible = true; _this._hasVisibleCell = true; var self = _this; _this.createLocalizableString("totalFormat", _this); _this.registerFunctionOnPropertyValueChanged("showInMultipleColumns", function () { self.doShowInMultipleColumnsChanged(); }); _this.updateTemplateQuestion(); _this.name = name; if (title) { _this.title = title; } else { _this.templateQuestion.locTitle.strChanged(); } return _this; } MatrixDropdownColumn.getColumnTypes = function () { var res = []; for (var key in matrixDropdownColumnTypes) { res.push(key); } return res; }; MatrixDropdownColumn.prototype.getOriginalObj = function () { return this.templateQuestion; }; MatrixDropdownColumn.prototype.getClassNameProperty = function () { return "cellType"; }; MatrixDropdownColumn.prototype.getSurvey = function (live) { if (live === void 0) { live = false; } return !!this.colOwner ? this.colOwner.survey : null; }; MatrixDropdownColumn.prototype.endLoadingFromJson = function () { var _this = this; _super.prototype.endLoadingFromJson.call(this); this.templateQuestion.endLoadingFromJson(); this.templateQuestion.onGetSurvey = function () { return _this.getSurvey(); }; }; MatrixDropdownColumn.prototype.getDynamicPropertyName = function () { return "cellType"; }; MatrixDropdownColumn.prototype.getDynamicType = function () { return this.calcCellQuestionType(null); }; Object.defineProperty(MatrixDropdownColumn.prototype, "colOwner", { get: function () { return this.colOwnerValue; }, set: function (value) { this.colOwnerValue = value; if (!!value) { this.updateTemplateQuestion(); } }, enumerable: false, configurable: true }); MatrixDropdownColumn.prototype.locStrsChanged = function () { _super.prototype.locStrsChanged.call(this); this.locTitle.strChanged(); }; MatrixDropdownColumn.prototype.addUsedLocales = function (locales) { _super.prototype.addUsedLocales.call(this, locales); this.templateQuestion.addUsedLocales(locales); }; Object.defineProperty(MatrixDropdownColumn.prototype, "index", { get: function () { return this.indexValue; }, enumerable: false, configurable: true }); MatrixDropdownColumn.prototype.setIndex = function (val) { this.indexValue = val; }; MatrixDropdownColumn.prototype.getType = function () { return "matrixdropdowncolumn"; }; Object.defineProperty(MatrixDropdownColumn.prototype, "cellType", { get: function () { return this.getPropertyValue("cellType"); }, set: function (val) { val = val.toLocaleLowerCase(); this.setPropertyValue("cellType", val); this.updateTemplateQuestion(); if (!!this.colOwner) { this.colOwner.onColumnCellTypeChanged(this); } }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "templateQuestion", { get: function () { return this.templateQuestionValue; }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "value", { get: function () { return this.templateQuestion.name; }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "isVisible", { get: function () { return this._isVisible; }, enumerable: false, configurable: true }); MatrixDropdownColumn.prototype.setIsVisible = function (newVal) { this._isVisible = newVal; }; Object.defineProperty(MatrixDropdownColumn.prototype, "hasVisibleCell", { get: function () { return this._hasVisibleCell; }, set: function (newVal) { this._hasVisibleCell = newVal; }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "name", { get: function () { return this.templateQuestion.name; }, set: function (val) { this.templateQuestion.name = val; }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "title", { get: function () { return this.templateQuestion.title; }, set: function (val) { this.templateQuestion.title = val; }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "locTitle", { get: function () { return this.templateQuestion.locTitle; }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "fullTitle", { get: function () { return this.locTitle.textOrHtml; }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "isRequired", { get: function () { return this.templateQuestion.isRequired; }, set: function (val) { this.templateQuestion.isRequired = val; }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "requiredText", { get: function () { return this.templateQuestion.requiredText; }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "requiredErrorText", { get: function () { return this.templateQuestion.requiredErrorText; }, set: function (val) { this.templateQuestion.requiredErrorText = val; }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "locRequiredErrorText", { get: function () { return this.templateQuestion.locRequiredErrorText; }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "readOnly", { get: function () { return this.templateQuestion.readOnly; }, set: function (val) { this.templateQuestion.readOnly = val; }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "hasOther", { get: function () { return this.templateQuestion.hasOther; }, set: function (val) { this.templateQuestion.hasOther = val; }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "visibleIf", { get: function () { return this.templateQuestion.visibleIf; }, set: function (val) { this.templateQuestion.visibleIf = val; }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "enableIf", { get: function () { return this.templateQuestion.enableIf; }, set: function (val) { this.templateQuestion.enableIf = val; }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "requiredIf", { get: function () { return this.templateQuestion.requiredIf; }, set: function (val) { this.templateQuestion.requiredIf = val; }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "isUnique", { get: function () { return this.getPropertyValue("isUnique"); }, set: function (val) { this.setPropertyValue("isUnique", val); }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "showInMultipleColumns", { get: function () { return this.getPropertyValue("showInMultipleColumns", false); }, set: function (val) { this.setPropertyValue("showInMultipleColumns", val); }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "isSupportMultipleColumns", { get: function () { return ["checkbox", "radiogroup"].indexOf(this.cellType) > -1; }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "isShowInMultipleColumns", { get: function () { return this.showInMultipleColumns && this.isSupportMultipleColumns; }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "validators", { get: function () { return this.templateQuestion.validators; }, set: function (val) { this.templateQuestion.validators = val; }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "totalType", { get: function () { return this.getPropertyValue("totalType"); }, set: function (val) { this.setPropertyValue("totalType", val); }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "totalExpression", { get: function () { return this.getPropertyValue("totalExpression"); }, set: function (val) { this.setPropertyValue("totalExpression", val); }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "hasTotal", { get: function () { return this.totalType != "none" || !!this.totalExpression; }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "totalFormat", { get: function () { return this.getLocalizableStringText("totalFormat", ""); }, set: function (val) { this.setLocalizableStringText("totalFormat", val); }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "locTotalFormat", { get: function () { return this.getLocalizableString("totalFormat"); }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "renderAs", { get: function () { return this.getPropertyValue("renderAs"); }, set: function (val) { this.setPropertyValue("renderAs", val); }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "totalMaximumFractionDigits", { get: function () { return this.getPropertyValue("totalMaximumFractionDigits"); }, set: function (val) { if (val < -1 || val > 20) return; this.setPropertyValue("totalMaximumFractionDigits", val); }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "totalMinimumFractionDigits", { get: function () { return this.getPropertyValue("totalMinimumFractionDigits"); }, set: function (val) { if (val < -1 || val > 20) return; this.setPropertyValue("totalMinimumFractionDigits", val); }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "totalDisplayStyle", { get: function () { return this.getPropertyValue("totalDisplayStyle"); }, set: function (val) { this.setPropertyValue("totalDisplayStyle", val); }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "totalCurrency", { get: function () { return this.getPropertyValue("totalCurrency"); }, set: function (val) { if (Object(_question_expression__WEBPACK_IMPORTED_MODULE_2__["getCurrecyCodes"])().indexOf(val) < 0) return; this.setPropertyValue("totalCurrency", val); }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "minWidth", { get: function () { return this.getPropertyValue("minWidth", ""); }, set: function (val) { this.setPropertyValue("minWidth", val); }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "width", { get: function () { return this.getPropertyValue("width", ""); }, set: function (val) { this.setPropertyValue("width", val); }, enumerable: false, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "colCount", { get: function () { return this.getPropertyValue("colCount"); }, set: function (val) { if (val < -1 || val > 4) return; this.setPropertyValue("colCount", val); }, enumerable: false, configurable: true }); MatrixDropdownColumn.prototype.getLocale = function () { return this.colOwner ? this.colOwner.getLocale() : ""; }; MatrixDropdownColumn.prototype.getMarkdownHtml = function (text, name) { return this.colOwner ? this.colOwner.getMarkdownHtml(text, name) : null; }; MatrixDropdownColumn.prototype.getRenderer = function (name) { return !!this.colOwner ? this.colOwner.getRenderer(name) : null; }; MatrixDropdownColumn.prototype.getRendererContext = function (locStr) { return !!this.colOwner ? this.colOwner.getRendererContext(locStr) : locStr; }; MatrixDropdownColumn.prototype.getProcessedText = function (text) { return this.colOwner ? this.colOwner.getProcessedText(text) : text; }; MatrixDropdownColumn.prototype.createCellQuestion = function (row) { var qType = this.calcCellQuestionType(row); var cellQuestion = this.createNewQuestion(qType); this.callOnCellQuestionUpdate(cellQuestion, row); return cellQuestion; }; MatrixDropdownColumn.prototype.updateCellQuestion = function (cellQuestion, data, onUpdateJson) { if (onUpdateJson === void 0) { onUpdateJson = null; } this.setQuestionProperties(cellQuestion, onUpdateJson); this.callOnCellQuestionUpdate(cellQuestion, data); }; MatrixDropdownColumn.prototype.callOnCellQuestionUpdate = function (cellQuestion, data) { var qType = cellQuestion.getType(); var qDefinition = matrixDropdownColumnTypes[qType]; if (qDefinition && qDefinition["onCellQuestionUpdate"]) { qDefinition["onCellQuestionUpdate"](cellQuestion, this, this.colOwner, data); } }; MatrixDropdownColumn.prototype.defaultCellTypeChanged = function () { this.updateTemplateQuestion(); }; MatrixDropdownColumn.prototype.calcCellQuestionType = function (row) { var cellType = this.getDefaultCellQuestionType(); if (!!row && !!this.colOwner) { cellType = this.colOwner.getCustomCellType(this, row, cellType); } return cellType; }; MatrixDropdownColumn.prototype.getDefaultCellQuestionType = function () { if (this.cellType !== "default") return this.cellType; if (this.colOwner) return this.colOwner.getCellType(); return _settings__WEBPACK_IMPORTED_MODULE_3__["settings"].matrixDefaultCellType; }; MatrixDropdownColumn.prototype.updateTemplateQuestion = function () { var _this = this; var prevCellType = this.templateQuestion ? this.templateQuestion.getType() : ""; var curCellType = this.calcCellQuestionType(null); if (curCellType === prevCellType) return; if (this.templateQuestion) { this.removeProperties(prevCellType); } this.templateQuestionValue = this.createNewQuestion(curCellType); this.templateQuestion.locOwner = this; this.addProperties(curCellType); this.templateQuestion.onPropertyChanged.add(function (sender, options) { _this.propertyValueChanged(options.name, options.oldValue, options.newValue); }); this.templateQuestion.onItemValuePropertyChanged.add(function (sender, options) { _this.doItemValuePropertyChanged(options.propertyName, options.obj, options.name, options.newValue, options.oldValue); }); this.templateQuestion.isContentElement = true; if (!this.isLoadingFromJson) { this.templateQuestion.onGetSurvey = function () { return _this.getSurvey(); }; } this.templateQuestion.locTitle.strChanged(); }; MatrixDropdownColumn.prototype.createNewQuestion = function (cellType) { var question = _jsonobject__WEBPACK_IMPORTED_MODULE_0__["Serializer"].createClass(cellType); if (!question) { question = _jsonobject__WEBPACK_IMPORTED_MODULE_0__["Serializer"].createClass("text"); } question.loadingOwner = this; question.isEditableTemplateElement = true; this.setQuestionProperties(question); return question; }; MatrixDropdownColumn.prototype.setQuestionProperties = function (question, onUpdateJson) { if (onUpdateJson === void 0) { onUpdateJson = null; } if (this.templateQuestion) { var json = new _jsonobject__WEBPACK_IMPORTED_MODULE_0__["JsonObject"]().toJsonObject(this.templateQuestion, true); if (onUpdateJson) { onUpdateJson(json); } json.type = question.getType(); new _jsonobject__WEBPACK_IMPORTED_MODULE_0__["JsonObject"]().toObject(json, question); } }; MatrixDropdownColumn.prototype.propertyValueChanged = function (name, oldValue, newValue) { _super.prototype.propertyValueChanged.call(this, name, oldValue, newValue); if (!_jsonobject__WEBPACK_IMPORTED_MODULE_0__["Serializer"].hasOriginalProperty(this, name)) return; if (this.colOwner != null && !this.isLoadingFromJson) { this.colOwner.onColumnPropertyChanged(this, name, newValue); } }; MatrixDropdownColumn.prototype.doItemValuePropertyChanged = function (propertyName, obj, name, newValue, oldValue) { if (!_jsonobject__WEBPACK_IMPORTED_MODULE_0__["Serializer"].hasOriginalProperty(obj, name)) return; if (this.colOwner != null && !this.isLoadingFromJson) { this.colOwner.onColumnItemValuePropertyChanged(this, propertyName, obj, name, newValue, oldValue); } }; MatrixDropdownColumn.prototype.doShowInMultipleColumnsChanged = function () { if (this.colOwner != null && !this.isLoadingFromJson) { this.colOwner.onShowInMultipleColumnsChanged(this); } }; MatrixDropdownColumn.prototype.getProperties = function (curCellType) { return _jsonobject__WEBPACK_IMPORTED_MODULE_0__["Serializer"].getDynamicPropertiesByObj(this, curCellType); }; MatrixDropdownColumn.prototype.removeProperties = function (curCellType) { var properties = this.getProperties(curCellType); for (var i = 0; i < properties.length; i++) { var prop = properties[i]; delete this[prop.name]; if (prop.serializationProperty) { delete this[prop.serializationProperty]; } } }; MatrixDropdownColumn.prototype.addProperties = function (curCellType) { var question = this.templateQuestion; var properties = this.getProperties(curCellType); for (var i = 0; i < properties.length; i++) { var prop = properties[i]; this.addProperty(question, prop.name, false); if (prop.serializationProperty) { this.addProperty(question, prop.serializationProperty, true); } } }; MatrixDropdownColumn.prototype.addProperty = function (question, propName, isReadOnly) { var desc = { configurable: true, get: function () { return question[propName]; }, }; if (!isReadOnly) { desc["set"] = function (v) { question[propName] = v; }; } Object.defineProperty(this, propName, desc); }; return MatrixDropdownColumn; }(_base__WEBPACK_IMPORTED_MODULE_1__["Base"])); _jsonobject__WEBPACK_IMPORTED_MODULE_0__["Serializer"].addClass("matrixdropdowncolumn", [ { name: "!name", isUnique: true }, { name: "title", serializationProperty: "locTitle" }, { name: "cellType", default: "default", choices: function () { var res = MatrixDropdownColumn.getColumnTypes(); res.splice(0, 0, "default"); return res; }, }, { name: "colCount", default: -1, choices: [-1, 0, 1, 2, 3, 4] }, "isRequired:boolean", "isUnique:boolean", { name: "requiredErrorText:text", serializationProperty: "locRequiredErrorText", }, "readOnly:boolean", "minWidth", "width", "visibleIf:condition", "enableIf:condition", "requiredIf:condition", { name: "showInMultipleColumns:boolean", dependsOn: "cellType", visibleIf: function (obj) { if (!obj) return false; return obj.isSupportMultipleColumns; }, }, { name: "validators:validators", baseClassName: "surveyvalidator", classNamePart: "validator", }, { name: "totalType", default: "none", choices: ["none", "sum", "count", "min", "max", "avg"], }, "totalExpression:expression", { name: "totalFormat", serializationProperty: "locTotalFormat" }, { name: "totalDisplayStyle", default: "none", choices: ["none", "decimal", "currency", "percent"], }, { name: "totalCurrency", choices: function () { return Object(_question_expression__WEBPACK_IMPORTED_MODULE_2__["getCurrecyCodes"])(); }, default: "USD", }, { name: "totalMaximumFractionDigits:number", default: -1 }, { name: "totalMinimumFractionDigits:number", default: -1 }, { name: "renderAs", default: "default", visible: false }, ], function () { return new MatrixDropdownColumn(""); }); /***/ }), /***/ "./src/question_matrixdropdownrendered.ts": /*!************************************************!*\ !*** ./src/question_matrixdropdownrendered.ts ***! \************************************************/ /*! exports provided: QuestionMatrixDropdownRenderedCell, QuestionMatrixDropdownRenderedRow, QuestionMatrixDropdownRenderedTable */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixDropdownRenderedCell", function() { return QuestionMatrixDropdownRenderedCell; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixDropdownRenderedRow", function() { return QuestionMatrixDropdownRenderedRow; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixDropdownRenderedTable", function() { return QuestionMatrixDropdownRenderedTable; }); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./base */ "./src/base.ts"); /* harmony import */ var _itemvalue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./itemvalue */ "./src/itemvalue.ts"); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./surveyStrings */ "./src/surveyStrings.ts"); /* harmony import */ var _actions_action__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./actions/action */ "./src/actions/action.ts"); /* harmony import */ var _actions_adaptive_container__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./actions/adaptive-container */ "./src/actions/adaptive-container.ts"); /* harmony import */ var _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/cssClassBuilder */ "./src/utils/cssClassBuilder.ts"); /* harmony import */ var _actions_container__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./actions/container */ "./src/actions/container.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var QuestionMatrixDropdownRenderedCell = /** @class */ (function () { function QuestionMatrixDropdownRenderedCell() { this.minWidth = ""; this.width = ""; this.colSpans = 1; this.isActionsCell = false; this.className = ""; this.isDragHandlerCell = false; this.idValue = QuestionMatrixDropdownRenderedCell.counter++; } Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, "hasQuestion", { get: function () { return !!this.question; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, "hasTitle", { get: function () { return !!this.locTitle; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, "hasPanel", { get: function () { return !!this.panel; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, "id", { get: function () { return this.idValue; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, "showErrorOnTop", { get: function () { return this.showErrorOnCore("top"); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, "showErrorOnBottom", { get: function () { return this.showErrorOnCore("bottom"); }, enumerable: false, configurable: true }); QuestionMatrixDropdownRenderedCell.prototype.showErrorOnCore = function (location) { return (this.getShowErrorLocation() == location && (!this.isChoice || this.isFirstChoice)); }; QuestionMatrixDropdownRenderedCell.prototype.getShowErrorLocation = function () { return this.hasQuestion ? this.question.survey.questionErrorLocation : ""; }; Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, "item", { get: function () { return this.itemValue; }, set: function (val) { this.itemValue = val; if (!!val) { val.hideCaption = true; } }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, "isChoice", { get: function () { return !!this.item; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, "choiceValue", { get: function () { return this.isChoice ? this.item.value : null; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, "isCheckbox", { get: function () { return this.isChoice && this.question.getType() == "checkbox"; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, "isFirstChoice", { get: function () { return this.choiceIndex === 0; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, "css", { get: function () { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_6__["CssClassBuilder"]() .append(this.className) .append(this.question.cssError, this.question.errors.length > 0) .toString(); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, "headers", { get: function () { if (this.cell && this.cell.column && this.cell.column.isShowInMultipleColumns) { return this.item.locText.renderedHtml; } if (this.question && this.question.isVisible) { return this.question.locTitle.renderedHtml; } if (this.hasTitle) { return this.locTitle.renderedHtml || ""; } return ""; }, enumerable: false, configurable: true }); QuestionMatrixDropdownRenderedCell.prototype.calculateFinalClassName = function (matrixCssClasses) { var questionCss = this.cell.question.cssClasses; // 'text-align': $data.isChoice ? 'center': var builder = new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_6__["CssClassBuilder"]() .append(questionCss.itemValue, !!questionCss) .append(questionCss.asCell, !!questionCss); return builder.append(matrixCssClasses.cell, builder.isEmpty() && !!matrixCssClasses) .append(questionCss.hasError, this.question.errors.length > 0) .append(matrixCssClasses.choiceCell, this.isChoice) .toString(); }; QuestionMatrixDropdownRenderedCell.counter = 1; return QuestionMatrixDropdownRenderedCell; }()); var QuestionMatrixDropdownRenderedRow = /** @class */ (function (_super) { __extends(QuestionMatrixDropdownRenderedRow, _super); function QuestionMatrixDropdownRenderedRow(cssClasses, isDetailRow) { if (isDetailRow === void 0) { isDetailRow = false; } var _this = _super.call(this) || this; _this.cssClasses = cssClasses; _this.isDetailRow = isDetailRow; _this.cells = []; _this.onCreating(); _this.idValue = QuestionMatrixDropdownRenderedRow.counter++; return _this; } QuestionMatrixDropdownRenderedRow.prototype.onCreating = function () { }; // need for knockout binding see QuestionMatrixDropdownRenderedRow.prototype["onCreating"] Object.defineProperty(QuestionMatrixDropdownRenderedRow.prototype, "id", { get: function () { return this.idValue; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDropdownRenderedRow.prototype, "attributes", { get: function () { if (!this.row) return {}; return { "data-sv-drop-target-matrix-row": this.row.id }; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDropdownRenderedRow.prototype, "className", { get: function () { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_6__["CssClassBuilder"]() .append(this.cssClasses.row) .append(this.cssClasses.detailRow, this.isDetailRow) .append(this.cssClasses.dragDropGhostPositionTop, this.ghostPosition === "top") .append(this.cssClasses.dragDropGhostPositionBottom, this.ghostPosition === "bottom") .append(this.cssClasses.rowAdditional, this.isAdditionalClasses) .toString(); }, enumerable: false, configurable: true }); QuestionMatrixDropdownRenderedRow.counter = 1; __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_0__["property"])({ defaultValue: null }) ], QuestionMatrixDropdownRenderedRow.prototype, "ghostPosition", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_0__["property"])({ defaultValue: false }) ], QuestionMatrixDropdownRenderedRow.prototype, "isAdditionalClasses", void 0); return QuestionMatrixDropdownRenderedRow; }(_base__WEBPACK_IMPORTED_MODULE_1__["Base"])); var QuestionMatrixDropdownRenderedTable = /** @class */ (function (_super) { __extends(QuestionMatrixDropdownRenderedTable, _super); function QuestionMatrixDropdownRenderedTable(matrix) { var _this = _super.call(this) || this; _this.matrix = matrix; _this.hasActionCellInRowsValues = {}; _this.createNewArray("rows"); _this.build(); return _this; } Object.defineProperty(QuestionMatrixDropdownRenderedTable.prototype, "showTable", { get: function () { return this.getPropertyValue("showTable", true); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDropdownRenderedTable.prototype, "showHeader", { get: function () { return this.getPropertyValue("showHeader"); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDropdownRenderedTable.prototype, "showAddRowOnTop", { get: function () { return this.getPropertyValue("showAddRowOnTop", false); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDropdownRenderedTable.prototype, "showAddRowOnBottom", { get: function () { return this.getPropertyValue("showAddRowOnBottom", false); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDropdownRenderedTable.prototype, "showFooter", { get: function () { return this.matrix.hasFooter && this.matrix.isColumnLayoutHorizontal; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDropdownRenderedTable.prototype, "hasFooter", { get: function () { return !!this.footerRow; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDropdownRenderedTable.prototype, "hasRemoveRows", { get: function () { return this.hasRemoveRowsValue; }, enumerable: false, configurable: true }); QuestionMatrixDropdownRenderedTable.prototype.isRequireReset = function () { return (this.hasRemoveRows != this.matrix.canRemoveRows || !this.matrix.isColumnLayoutHorizontal); }; Object.defineProperty(QuestionMatrixDropdownRenderedTable.prototype, "headerRow", { get: function () { return this.headerRowValue; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDropdownRenderedTable.prototype, "footerRow", { get: function () { return this.footerRowValue; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDropdownRenderedTable.prototype, "rows", { get: function () { return this.getPropertyValue("rows"); }, enumerable: false, configurable: true }); QuestionMatrixDropdownRenderedTable.prototype.build = function () { this.hasRemoveRowsValue = this.matrix.canRemoveRows; //build rows now var rows = this.matrix.visibleRows; this.cssClasses = this.matrix.cssClasses; this.buildRowsActions(); this.buildHeader(); this.buildRows(); this.buildFooter(); this.updateShowTableAndAddRow(); }; QuestionMatrixDropdownRenderedTable.prototype.updateShowTableAndAddRow = function () { var showTable = this.rows.length > 0 || this.matrix.isDesignMode || !this.matrix.getShowColumnsIfEmpty(); this.setPropertyValue("showTable", showTable); var showAddRow = this.matrix.canAddRow && showTable; var showAddRowOnTop = showAddRow; var showAddRowOnBottom = showAddRow; if (showAddRowOnTop) { if (this.matrix.getAddRowLocation() === "default") { showAddRowOnTop = this.matrix.columnLayout === "vertical"; } else { showAddRowOnTop = this.matrix.getAddRowLocation() !== "bottom"; } } if (showAddRowOnBottom && this.matrix.getAddRowLocation() !== "topBottom") { showAddRowOnBottom = !showAddRowOnTop; } this.setPropertyValue("showAddRowOnTop", showAddRowOnTop); this.setPropertyValue("showAddRowOnBottom", showAddRowOnBottom); }; QuestionMatrixDropdownRenderedTable.prototype.onAddedRow = function () { if (this.getRenderedDataRowCount() >= this.matrix.visibleRows.length) return; var row = this.matrix.visibleRows[this.matrix.visibleRows.length - 1]; this.rowsActions.push(this.buildRowActions(row)); this.addHorizontalRow(this.rows, row, this.matrix.visibleRows.length == 1 && !this.matrix.showHeader); this.updateShowTableAndAddRow(); }; QuestionMatrixDropdownRenderedTable.prototype.getRenderedDataRowCount = function () { var res = 0; for (var i = 0; i < this.rows.length; i++) { if (!this.rows[i].isDetailRow) res++; } return res; }; QuestionMatrixDropdownRenderedTable.prototype.onRemovedRow = function (row) { var rowIndex = this.getRenderedRowIndex(row); if (rowIndex < 0) return; this.rowsActions.splice(rowIndex, 1); var removeCount = 1; if (rowIndex < this.rows.length - 1 && this.rows[rowIndex + 1].isDetailRow) { removeCount++; } this.rows.splice(rowIndex, removeCount); this.updateShowTableAndAddRow(); }; QuestionMatrixDropdownRenderedTable.prototype.onDetailPanelChangeVisibility = function (row, isShowing) { var rowIndex = this.getRenderedRowIndex(row); if (rowIndex < 0) return; var panelRowIndex = rowIndex < this.rows.length - 1 && this.rows[rowIndex + 1].isDetailRow ? rowIndex + 1 : -1; if ((isShowing && panelRowIndex > -1) || (!isShowing && panelRowIndex < 0)) return; if (isShowing) { var detailRow = this.createDetailPanelRow(row, this.rows[rowIndex]); this.rows.splice(rowIndex + 1, 0, detailRow); } else { this.rows.splice(panelRowIndex, 1); } }; QuestionMatrixDropdownRenderedTable.prototype.getRenderedRowIndex = function (row) { for (var i = 0; i < this.rows.length; i++) { if (this.rows[i].row == row) return i; } return -1; }; QuestionMatrixDropdownRenderedTable.prototype.buildRowsActions = function () { this.rowsActions = []; var rows = this.matrix.visibleRows; for (var i = 0; i < rows.length; i++) { this.rowsActions.push(this.buildRowActions(rows[i])); } }; QuestionMatrixDropdownRenderedTable.prototype.buildHeader = function () { var colHeaders = this.matrix.isColumnLayoutHorizontal && this.matrix.showHeader; var isShown = colHeaders || (this.matrix.hasRowText && !this.matrix.isColumnLayoutHorizontal); this.setPropertyValue("showHeader", isShown); if (!isShown) return; this.headerRowValue = new QuestionMatrixDropdownRenderedRow(this.cssClasses); if (this.matrix.allowRowsDragAndDrop) { this.headerRow.cells.push(this.createHeaderCell(null)); } if (this.hasActionCellInRows("start")) { this.headerRow.cells.push(this.createHeaderCell(null)); } if (this.matrix.hasRowText && this.matrix.showHeader) { this.headerRow.cells.push(this.createHeaderCell(null)); } if (this.matrix.isColumnLayoutHorizontal) { for (var i = 0; i < this.matrix.visibleColumns.length; i++) { var column = this.matrix.visibleColumns[i]; if (!column.hasVisibleCell) continue; if (column.isShowInMultipleColumns) { this.createMutlipleColumnsHeader(column); } else { this.headerRow.cells.push(this.createHeaderCell(column)); } } } else { var rows = this.matrix.visibleRows; for (var i = 0; i < rows.length; i++) { this.headerRow.cells.push(this.createTextCell(rows[i].locText)); } if (this.matrix.hasFooter) { this.headerRow.cells.push(this.createTextCell(this.matrix.getFooterText())); } } if (this.hasActionCellInRows("end")) { this.headerRow.cells.push(this.createHeaderCell(null)); } }; QuestionMatrixDropdownRenderedTable.prototype.buildFooter = function () { if (!this.showFooter) return; this.footerRowValue = new QuestionMatrixDropdownRenderedRow(this.cssClasses); if (this.matrix.allowRowsDragAndDrop) { this.footerRow.cells.push(this.createHeaderCell(null)); } if (this.hasActionCellInRows("start")) { this.footerRow.cells.push(this.createHeaderCell(null)); } if (this.matrix.hasRowText) { this.footerRow.cells.push(this.createTextCell(this.matrix.getFooterText())); } var cells = this.matrix.visibleTotalRow.cells; for (var i = 0; i < cells.length; i++) { var cell = cells[i]; if (!cell.column.hasVisibleCell) continue; if (cell.column.isShowInMultipleColumns) { this.createMutlipleColumnsFooter(this.footerRow, cell); } else { this.footerRow.cells.push(this.createEditCell(cell)); } } if (this.hasActionCellInRows("end")) { this.footerRow.cells.push(this.createHeaderCell(null)); } }; QuestionMatrixDropdownRenderedTable.prototype.buildRows = function () { var rows = this.matrix.isColumnLayoutHorizontal ? this.buildHorizontalRows() : this.buildVerticalRows(); this.setPropertyValue("rows", rows); }; QuestionMatrixDropdownRenderedTable.prototype.hasActionCellInRows = function (location) { if (this.hasActionCellInRowsValues[location] === undefined) { var rows = this.matrix.visibleRows; this.hasActionCellInRowsValues[location] = false; for (var i = 0; i < rows.length; i++) { if (!this.isValueEmpty(this.getRowActions(i, location))) { this.hasActionCellInRowsValues[location] = true; break; } } } return this.hasActionCellInRowsValues[location]; }; QuestionMatrixDropdownRenderedTable.prototype.canRemoveRow = function (row) { return this.matrix.canRemoveRow(row); }; QuestionMatrixDropdownRenderedTable.prototype.buildHorizontalRows = function () { var rows = this.matrix.visibleRows; var renderedRows = []; for (var i = 0; i < rows.length; i++) { this.addHorizontalRow(renderedRows, rows[i], i == 0 && !this.matrix.showHeader); } return renderedRows; }; QuestionMatrixDropdownRenderedTable.prototype.addHorizontalRow = function (renderedRows, row, useAsHeader) { var renderedRow = this.createHorizontalRow(row, useAsHeader); renderedRow.row = row; renderedRows.push(renderedRow); if (row.isDetailPanelShowing) { renderedRows.push(this.createDetailPanelRow(row, renderedRow)); } }; QuestionMatrixDropdownRenderedTable.prototype.getRowDragCell = function (rowIndex) { var cell = new QuestionMatrixDropdownRenderedCell(); cell.isDragHandlerCell = true; cell.className = this.cssClasses.actionsCell; cell.row = this.matrix.visibleRows[rowIndex]; return cell; }; QuestionMatrixDropdownRenderedTable.prototype.getRowActionsCell = function (rowIndex, location) { var rowActions = this.getRowActions(rowIndex, location); if (!this.isValueEmpty(rowActions)) { var cell = new QuestionMatrixDropdownRenderedCell(); var actionContainer = this.matrix.allowAdaptiveActions ? new _actions_adaptive_container__WEBPACK_IMPORTED_MODULE_5__["AdaptiveActionContainer"]() : new _actions_container__WEBPACK_IMPORTED_MODULE_7__["ActionContainer"](); actionContainer.setItems(rowActions); var itemValue = new _itemvalue__WEBPACK_IMPORTED_MODULE_2__["ItemValue"](actionContainer); cell.item = itemValue; cell.isActionsCell = true; cell.className = this.cssClasses.actionsCell; cell.row = this.matrix.visibleRows[rowIndex]; return cell; } return null; }; QuestionMatrixDropdownRenderedTable.prototype.getRowActions = function (rowIndex, location) { var actions = this.rowsActions[rowIndex]; if (!Array.isArray(actions)) return []; return actions.filter(function (action) { if (!action.location) { action.location = "start"; } return action.location === location; }); }; QuestionMatrixDropdownRenderedTable.prototype.buildRowActions = function (row) { var actions = []; this.setDefaultRowActions(row, actions); if (!!this.matrix.survey) { actions = this.matrix.survey.getUpdatedMatrixRowActions(this.matrix, row, actions); } return actions; }; QuestionMatrixDropdownRenderedTable.prototype.setDefaultRowActions = function (row, actions) { if (this.hasRemoveRows && this.canRemoveRow(row)) { actions.push(new _actions_action__WEBPACK_IMPORTED_MODULE_4__["Action"]({ id: "remove-row", location: "end", enabled: !this.matrix.isInputReadOnly, component: "sv-matrix-remove-button", data: { row: row, question: this.matrix }, })); } if (row.hasPanel) { actions.push(new _actions_action__WEBPACK_IMPORTED_MODULE_4__["Action"]({ id: "show-detail", title: _surveyStrings__WEBPACK_IMPORTED_MODULE_3__["surveyLocalization"].getString("editText"), showTitle: false, location: "start", component: "sv-matrix-detail-button", data: { row: row, question: this.matrix }, })); } }; QuestionMatrixDropdownRenderedTable.prototype.createHorizontalRow = function (row, useAsHeader) { var res = new QuestionMatrixDropdownRenderedRow(this.cssClasses); if (this.matrix.allowRowsDragAndDrop) { var rowIndex = this.matrix.visibleRows.indexOf(row); res.cells.push(this.getRowDragCell(rowIndex)); } this.addRowActionsCell(row, res, "start"); if (this.matrix.hasRowText) { var renderedCell = this.createTextCell(row.locText); renderedCell.row = row; res.cells.push(renderedCell); if (useAsHeader) { this.setHeaderCellWidth(null, renderedCell); } renderedCell.className = new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_6__["CssClassBuilder"]() .append(renderedCell.className) .append(this.cssClasses.detailRowText, row.hasPanel) .toString(); } for (var i = 0; i < row.cells.length; i++) { var cell = row.cells[i]; if (!cell.column.hasVisibleCell) continue; if (cell.column.isShowInMultipleColumns) { this.createMutlipleEditCells(res, cell); } else { var renderedCell = this.createEditCell(cell); res.cells.push(renderedCell); if (useAsHeader) { this.setHeaderCellWidth(cell.column, renderedCell); } } } this.addRowActionsCell(row, res, "end"); return res; }; QuestionMatrixDropdownRenderedTable.prototype.addRowActionsCell = function (row, renderedRow, location) { var rowIndex = this.matrix.visibleRows.indexOf(row); if (this.hasActionCellInRows(location)) { var actions = this.getRowActionsCell(rowIndex, location); if (!!actions) { renderedRow.cells.push(actions); } else { var cell = new QuestionMatrixDropdownRenderedCell(); cell.isEmpty = true; renderedRow.cells.push(cell); } } }; QuestionMatrixDropdownRenderedTable.prototype.createDetailPanelRow = function (row, renderedRow) { var res = new QuestionMatrixDropdownRenderedRow(this.cssClasses, true); res.row = row; var buttonCell = new QuestionMatrixDropdownRenderedCell(); if (this.matrix.hasRowText) { buttonCell.colSpans = 2; } buttonCell.isEmpty = true; res.cells.push(buttonCell); var actionsCell = null; if (this.hasActionCellInRows("end")) { actionsCell = new QuestionMatrixDropdownRenderedCell(); actionsCell.isEmpty = true; } var cell = new QuestionMatrixDropdownRenderedCell(); cell.panel = row.detailPanel; cell.colSpans = renderedRow.cells.length - buttonCell.colSpans - (!!actionsCell ? actionsCell.colSpans : 0); cell.className = this.cssClasses.detailPanelCell; res.cells.push(cell); if (!!actionsCell) { res.cells.push(actionsCell); } if (typeof this.matrix.onCreateDetailPanelRenderedRowCallback === "function") { this.matrix.onCreateDetailPanelRenderedRowCallback(res); } return res; }; QuestionMatrixDropdownRenderedTable.prototype.buildVerticalRows = function () { var columns = this.matrix.columns; var renderedRows = []; for (var i = 0; i < columns.length; i++) { var col = columns[i]; if (col.isVisible && col.hasVisibleCell) { if (col.isShowInMultipleColumns) { this.createMutlipleVerticalRows(renderedRows, col, i); } else { renderedRows.push(this.createVerticalRow(col, i)); } } } if (this.hasActionCellInRows("end")) { renderedRows.push(this.createEndVerticalActionRow()); } return renderedRows; }; QuestionMatrixDropdownRenderedTable.prototype.createMutlipleVerticalRows = function (renderedRows, column, index) { var choices = this.getMultipleColumnChoices(column); if (!choices) return; for (var i = 0; i < choices.length; i++) { renderedRows.push(this.createVerticalRow(column, index, choices[i], i)); } }; QuestionMatrixDropdownRenderedTable.prototype.createVerticalRow = function (column, index, choice, choiceIndex) { if (choice === void 0) { choice = null; } if (choiceIndex === void 0) { choiceIndex = -1; } var res = new QuestionMatrixDropdownRenderedRow(this.cssClasses); if (this.matrix.showHeader) { var lTitle = !!choice ? choice.locText : column.locTitle; var hCell = this.createTextCell(lTitle); hCell.column = column; if (!choice) { this.setRequriedToHeaderCell(column, hCell); } res.cells.push(hCell); } var rows = this.matrix.visibleRows; for (var i = 0; i < rows.length; i++) { var rChoice = choice; var rChoiceIndex = choiceIndex >= 0 ? choiceIndex : i; var cell = rows[i].cells[index]; var visChoices = !!choice ? cell.question.visibleChoices : undefined; if (!!visChoices && rChoiceIndex < visChoices.length) { rChoice = visChoices[rChoiceIndex]; } var rCell = this.createEditCell(cell, rChoice); rCell.item = rChoice; rCell.choiceIndex = rChoiceIndex; res.cells.push(rCell); } if (this.matrix.hasTotal) { res.cells.push(this.createEditCell(this.matrix.visibleTotalRow.cells[index])); } return res; }; QuestionMatrixDropdownRenderedTable.prototype.createEndVerticalActionRow = function () { var res = new QuestionMatrixDropdownRenderedRow(this.cssClasses); if (this.matrix.showHeader) { res.cells.push(this.createEmptyCell()); } var rows = this.matrix.visibleRows; for (var i = 0; i < rows.length; i++) { res.cells.push(this.getRowActionsCell(i, "end")); } if (this.matrix.hasTotal) { res.cells.push(this.createEmptyCell()); } return res; }; QuestionMatrixDropdownRenderedTable.prototype.createMutlipleEditCells = function (rRow, cell, isFooter) { if (isFooter === void 0) { isFooter = false; } var choices = isFooter ? this.getMultipleColumnChoices(cell.column) : cell.question.visibleChoices; if (!choices) return; for (var i = 0; i < choices.length; i++) { var rCell = this.createEditCell(cell, !isFooter ? choices[i] : undefined); if (!isFooter) { //rCell.item = choices[i]; rCell.choiceIndex = i; } rRow.cells.push(rCell); } }; QuestionMatrixDropdownRenderedTable.prototype.createEditCell = function (cell, choiceItem) { if (choiceItem === void 0) { choiceItem = undefined; } var res = new QuestionMatrixDropdownRenderedCell(); res.cell = cell; res.row = cell.row; res.question = cell.question; res.matrix = this.matrix; res.item = choiceItem; res.className = res.calculateFinalClassName(this.cssClasses); //res.css = res.calcCss(this.cssClasses.cell); // var questionCss = cell.question.cssClasses; // var className = ""; // if (!!questionCss) { // className = ""; // if (!!questionCss.itemValue) { // className += " " + questionCss.itemValue; // } // if (!!questionCss.asCell) { // if (!!className) className += ""; // className += questionCss.asCell; // } // } // if (!className && !!this.cssClasses.cell) { // className = this.cssClasses.cell; // } //res.className = className; return res; }; QuestionMatrixDropdownRenderedTable.prototype.createMutlipleColumnsFooter = function (rRow, cell) { this.createMutlipleEditCells(rRow, cell, true); }; QuestionMatrixDropdownRenderedTable.prototype.createMutlipleColumnsHeader = function (column) { var choices = this.getMultipleColumnChoices(column); if (!choices) return; for (var i = 0; i < choices.length; i++) { var cell = this.createTextCell(choices[i].locText); this.setHeaderCell(column, cell); this.headerRow.cells.push(cell); } }; QuestionMatrixDropdownRenderedTable.prototype.getMultipleColumnChoices = function (column) { var choices = column.templateQuestion.choices; if (!!choices && Array.isArray(choices) && choices.length == 0) return this.matrix.choices; choices = column.templateQuestion.visibleChoices; if (!choices || !Array.isArray(choices)) return null; return choices; }; QuestionMatrixDropdownRenderedTable.prototype.createHeaderCell = function (column) { var cell = this.createTextCell(!!column ? column.locTitle : null); cell.column = column; this.setHeaderCell(column, cell); if (this.cssClasses.headerCell) { cell.className = this.cssClasses.headerCell; } return cell; }; QuestionMatrixDropdownRenderedTable.prototype.setHeaderCell = function (column, cell) { this.setHeaderCellWidth(column, cell); this.setRequriedToHeaderCell(column, cell); }; QuestionMatrixDropdownRenderedTable.prototype.setHeaderCellWidth = function (column, cell) { cell.minWidth = column != null ? this.matrix.getColumnWidth(column) : ""; cell.width = column != null ? column.width : this.matrix.getRowTitleWidth(); }; QuestionMatrixDropdownRenderedTable.prototype.setRequriedToHeaderCell = function (column, cell) { if (!!column && column.isRequired && this.matrix.survey) { cell.requiredText = this.matrix.survey.requiredText; } }; QuestionMatrixDropdownRenderedTable.prototype.createRemoveRowCell = function (row) { var res = new QuestionMatrixDropdownRenderedCell(); res.row = row; res.isRemoveRow = this.canRemoveRow(row); if (!!this.cssClasses.cell) { res.className = this.cssClasses.cell; } return res; }; QuestionMatrixDropdownRenderedTable.prototype.createTextCell = function (locTitle) { var cell = new QuestionMatrixDropdownRenderedCell(); cell.locTitle = locTitle; if (!!this.cssClasses.cell) { cell.className = this.cssClasses.cell; } return cell; }; QuestionMatrixDropdownRenderedTable.prototype.createEmptyCell = function () { var res = this.createTextCell(null); res.isEmpty = true; return res; }; return QuestionMatrixDropdownRenderedTable; }(_base__WEBPACK_IMPORTED_MODULE_1__["Base"])); /***/ }), /***/ "./src/question_matrixdynamic.ts": /*!***************************************!*\ !*** ./src/question_matrixdynamic.ts ***! \***************************************/ /*! exports provided: MatrixDynamicRowModel, QuestionMatrixDynamicModel */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatrixDynamicRowModel", function() { return MatrixDynamicRowModel; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixDynamicModel", function() { return QuestionMatrixDynamicModel; }); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./questionfactory */ "./src/questionfactory.ts"); /* harmony import */ var _question_matrixdropdownbase__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./question_matrixdropdownbase */ "./src/question_matrixdropdownbase.ts"); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./surveyStrings */ "./src/surveyStrings.ts"); /* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./error */ "./src/error.ts"); /* harmony import */ var _settings__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./settings */ "./src/settings.ts"); /* harmony import */ var _utils_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/utils */ "./src/utils/utils.ts"); /* harmony import */ var _dragdrop_matrix_rows__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./dragdrop/matrix-rows */ "./src/dragdrop/matrix-rows.ts"); /* harmony import */ var _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utils/cssClassBuilder */ "./src/utils/cssClassBuilder.ts"); /* harmony import */ var _question_matrixdropdownrendered__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./question_matrixdropdownrendered */ "./src/question_matrixdropdownrendered.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var MatrixDynamicRowModel = /** @class */ (function (_super) { __extends(MatrixDynamicRowModel, _super); function MatrixDynamicRowModel(index, data, value) { var _this = _super.call(this, data, value) || this; _this.index = index; _this.buildCells(value); return _this; } Object.defineProperty(MatrixDynamicRowModel.prototype, "rowName", { get: function () { return this.id; }, enumerable: false, configurable: true }); return MatrixDynamicRowModel; }(_question_matrixdropdownbase__WEBPACK_IMPORTED_MODULE_2__["MatrixDropdownRowModelBase"])); /** * A Model for a matrix dymanic question. You may use a dropdown, checkbox, radiogroup, text and comment questions as a cell editors. * An end-user may dynamically add/remove rows, unlike in matrix dropdown question. */ var QuestionMatrixDynamicModel = /** @class */ (function (_super) { __extends(QuestionMatrixDynamicModel, _super); function QuestionMatrixDynamicModel(name) { var _this = _super.call(this, name) || this; _this.rowCounter = 0; _this.initialRowCount = 2; _this.setRowCountValueFromData = false; _this.moveRowByIndex = function (fromIndex, toIndex) { var value = _this.createNewValue(); if (!value) return; var movableRow = value[fromIndex]; if (!movableRow) return; value.splice(fromIndex, 1); value.splice(toIndex, 0, movableRow); _this.value = value; }; void (_this.createLocalizableString("confirmDeleteText", _this)); var locAddRowText = _this.createLocalizableString("addRowText", _this); locAddRowText.onGetTextCallback = function (text) { return !!text ? text : _this.defaultAddRowText; }; var locRemoveRowText = _this.createLocalizableString("removeRowText", _this); locRemoveRowText.onGetTextCallback = function (text) { return !!text ? text : _surveyStrings__WEBPACK_IMPORTED_MODULE_3__["surveyLocalization"].getString("removeRow"); }; var locEmptyRowsText = (_this.createLocalizableString("emptyRowsText", _this)); locEmptyRowsText.onGetTextCallback = function (text) { return !!text ? text : _surveyStrings__WEBPACK_IMPORTED_MODULE_3__["surveyLocalization"].getString("emptyRowsText"); }; _this.registerFunctionOnPropertiesValueChanged(["hideColumnsIfEmpty", "allowAddRows"], function () { _this.updateShowTableAndAddRow(); }); _this.registerFunctionOnPropertyValueChanged("allowRowsDragAndDrop", function () { _this.clearRowsAndResetRenderedTable(); }); return _this; } QuestionMatrixDynamicModel.prototype.setSurveyImpl = function (value) { _super.prototype.setSurveyImpl.call(this, value); this.dragDropMatrixRows = new _dragdrop_matrix_rows__WEBPACK_IMPORTED_MODULE_7__["DragDropMatrixRows"](this.survey); }; QuestionMatrixDynamicModel.prototype.startDragMatrixRow = function (event, row) { this.dragDropMatrixRows.startDrag(event, row, this); }; QuestionMatrixDynamicModel.prototype.getType = function () { return "matrixdynamic"; }; Object.defineProperty(QuestionMatrixDynamicModel.prototype, "isRowsDynamic", { get: function () { return true; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDynamicModel.prototype, "confirmDelete", { /** * Set it to true, to show a confirmation dialog on removing a row * @see ConfirmDeleteText */ get: function () { return this.getPropertyValue("confirmDelete", false); }, set: function (val) { this.setPropertyValue("confirmDelete", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDynamicModel.prototype, "keyName", { /** * Set it to a column name and the library shows duplication error, if there are same values in different rows in the column. * @see keyDuplicationError */ get: function () { return this.getPropertyValue("keyName", ""); }, set: function (val) { this.setPropertyValue("keyName", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDynamicModel.prototype, "defaultRowValue", { /** * If it is not empty, then this value is set to every new row, including rows created initially, unless the defaultValue is not empty * @see defaultValue * @see defaultValueFromLastRow */ get: function () { return this.getPropertyValue("defaultRowValue"); }, set: function (val) { this.setPropertyValue("defaultRowValue", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDynamicModel.prototype, "defaultValueFromLastRow", { /** * Set it to true to copy the value into new added row from the last row. If defaultRowValue is set and this property equals to true, * then the value for new added row is merging. * @see defaultValue * @see defaultRowValue */ get: function () { return this.getPropertyValue("defaultValueFromLastRow", false); }, set: function (val) { this.setPropertyValue("defaultValueFromLastRow", val); }, enumerable: false, configurable: true }); QuestionMatrixDynamicModel.prototype.isDefaultValueEmpty = function () { return (_super.prototype.isDefaultValueEmpty.call(this) && this.isValueEmpty(this.defaultRowValue)); }; QuestionMatrixDynamicModel.prototype.valueFromData = function (val) { if (this.minRowCount < 1) return _super.prototype.valueFromData.call(this, val); if (!Array.isArray(val)) val = []; for (var i = val.length; i < this.minRowCount; i++) val.push({}); return val; }; QuestionMatrixDynamicModel.prototype.setDefaultValue = function () { if (this.isValueEmpty(this.defaultRowValue) || !this.isValueEmpty(this.defaultValue)) { _super.prototype.setDefaultValue.call(this); return; } if (!this.isEmpty() || this.rowCount == 0) return; var newValue = []; for (var i = 0; i < this.rowCount; i++) { newValue.push(this.defaultRowValue); } this.value = newValue; }; Object.defineProperty(QuestionMatrixDynamicModel.prototype, "rowCount", { /** * The number of rows in the matrix. * @see minRowCount * @see maxRowCount */ get: function () { return this.rowCountValue; }, set: function (val) { if (val < 0 || val > _settings__WEBPACK_IMPORTED_MODULE_5__["settings"].matrixMaximumRowCount) return; this.setRowCountValueFromData = false; var prevValue = this.rowCountValue; this.rowCountValue = val; if (this.value && this.value.length > val) { var qVal = this.value; qVal.splice(val); this.value = qVal; } if (this.isLoadingFromJson) { this.initialRowCount = val; return; } if (this.generatedVisibleRows || prevValue == 0) { if (!this.generatedVisibleRows) { this.generatedVisibleRows = []; } this.generatedVisibleRows.splice(val); for (var i = prevValue; i < val; i++) { var newRow = this.createMatrixRow(this.getValueForNewRow()); this.generatedVisibleRows.push(newRow); this.onMatrixRowCreated(newRow); } } this.onRowsChanged(); }, enumerable: false, configurable: true }); QuestionMatrixDynamicModel.prototype.getValueForNewRow = function () { var res = null; if (!!this.onGetValueForNewRowCallBack) { res = this.onGetValueForNewRowCallBack(this); } return res; }; Object.defineProperty(QuestionMatrixDynamicModel.prototype, "allowRowsDragAndDrop", { /** * Set this property to true, to allow rows drag and drop. */ get: function () { return this.getPropertyValue("allowRowsDragAndDrop"); }, set: function (val) { this.setPropertyValue("allowRowsDragAndDrop", val); }, enumerable: false, configurable: true }); QuestionMatrixDynamicModel.prototype.createRenderedTable = function () { return new QuestionMatrixDynamicRenderedTable(this); }; Object.defineProperty(QuestionMatrixDynamicModel.prototype, "rowCountValue", { get: function () { return this.getPropertyValue("rowCount"); }, set: function (val) { this.setPropertyValue("rowCount", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDynamicModel.prototype, "minRowCount", { /** * The minimum row count. A user could not delete a row if the rowCount equals to minRowCount * @see rowCount * @see maxRowCount * @see allowAddRows */ get: function () { return this.getPropertyValue("minRowCount"); }, set: function (val) { if (val < 0) val = 0; this.setPropertyValue("minRowCount", val); if (val > this.maxRowCount) this.maxRowCount = val; if (this.rowCount < val) this.rowCount = val; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDynamicModel.prototype, "maxRowCount", { /** * The maximum row count. A user could not add a row if the rowCount equals to maxRowCount * @see rowCount * @see minRowCount * @see allowAddRows */ get: function () { return this.getPropertyValue("maxRowCount"); }, set: function (val) { if (val <= 0) return; if (val > _settings__WEBPACK_IMPORTED_MODULE_5__["settings"].matrixMaximumRowCount) val = _settings__WEBPACK_IMPORTED_MODULE_5__["settings"].matrixMaximumRowCount; if (val == this.maxRowCount) return; this.setPropertyValue("maxRowCount", val); if (val < this.minRowCount) this.minRowCount = val; if (this.rowCount > val) this.rowCount = val; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDynamicModel.prototype, "allowAddRows", { /** * Set this property to false to disable ability to add new rows. "Add new Row" button becomes invsible in UI * @see canAddRow * @see allowRemoveRows */ get: function () { return this.getPropertyValue("allowAddRows"); }, set: function (val) { this.setPropertyValue("allowAddRows", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDynamicModel.prototype, "allowRemoveRows", { /** * Set this property to false to disable ability to remove rows. "Remove" row buttons become invsible in UI * @see canRemoveRows * @see allowAddRows */ get: function () { return this.getPropertyValue("allowRemoveRows"); }, set: function (val) { this.setPropertyValue("allowRemoveRows", val); if (!this.isLoadingFromJson) { this.resetRenderedTable(); } }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDynamicModel.prototype, "canAddRow", { /** * Returns true, if a new row can be added. * @see allowAddRows * @see maxRowCount * @see canRemoveRows * @see rowCount */ get: function () { return (this.allowAddRows && !this.isReadOnly && this.rowCount < this.maxRowCount); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDynamicModel.prototype, "canRemoveRows", { /** * Returns true, if row can be removed. * @see minRowCount * @see canAddRow * @see rowCount */ get: function () { var res = this.allowRemoveRows && !this.isReadOnly && this.rowCount > this.minRowCount; return !!this.canRemoveRowsCallback ? this.canRemoveRowsCallback(res) : res; }, enumerable: false, configurable: true }); QuestionMatrixDynamicModel.prototype.canRemoveRow = function (row) { if (!this.survey) return true; return this.survey.matrixAllowRemoveRow(this, row.index, row); }; /** * Creates and add a new row and focus the cell in the first column. */ QuestionMatrixDynamicModel.prototype.addRowUI = function () { var oldRowCount = this.rowCount; this.addRow(); if (oldRowCount === this.rowCount) return; var q = this.getQuestionToFocusOnAddingRow(); if (!!q) { q.focus(); } }; QuestionMatrixDynamicModel.prototype.getQuestionToFocusOnAddingRow = function () { var row = this.visibleRows[this.visibleRows.length - 1]; for (var i = 0; i < row.cells.length; i++) { var q = row.cells[i].question; if (!!q && q.isVisible && !q.isReadOnly) { return q; } } return null; }; /** * Creates and add a new row. */ QuestionMatrixDynamicModel.prototype.addRow = function () { var options = { question: this, canAddRow: this.canAddRow }; if (!!this.survey) { this.survey.matrixBeforeRowAdded(options); } if (!options.canAddRow) return; this.onStartRowAddingRemoving(); this.addRowCore(); this.onEndRowAdding(); if (this.detailPanelShowOnAdding && this.visibleRows.length > 0) { this.visibleRows[this.visibleRows.length - 1].showDetailPanel(); } }; Object.defineProperty(QuestionMatrixDynamicModel.prototype, "detailPanelShowOnAdding", { /** * Set this property to true to show detail panel immediately on adding a new row. * @see detailPanelMode */ get: function () { return this.getPropertyValue("detailPanelShowOnAdding"); }, set: function (val) { this.setPropertyValue("detailPanelShowOnAdding", val); }, enumerable: false, configurable: true }); QuestionMatrixDynamicModel.prototype.hasRowsAsItems = function () { return false; }; QuestionMatrixDynamicModel.prototype.unbindValue = function () { this.clearGeneratedRows(); this.clearPropertyValue("value"); this.rowCountValue = 0; _super.prototype.unbindValue.call(this); }; QuestionMatrixDynamicModel.prototype.isValueSurveyElement = function (val) { return this.isEditingSurveyElement || _super.prototype.isValueSurveyElement.call(this, val); }; QuestionMatrixDynamicModel.prototype.addRowCore = function () { var prevRowCount = this.rowCount; this.rowCount = this.rowCount + 1; var defaultValue = this.getDefaultRowValue(true); var newValue = null; if (!this.isValueEmpty(defaultValue)) { newValue = this.createNewValue(); if (newValue.length == this.rowCount) { newValue[newValue.length - 1] = defaultValue; this.value = newValue; } } if (this.data) { this.runCellsCondition(this.getDataFilteredValues(), this.getDataFilteredProperties()); var row = this.visibleRows[this.rowCount - 1]; if (!this.isValueEmpty(row.value)) { if (!newValue) { newValue = this.createNewValue(); } if (!this.isValueSurveyElement(newValue) && !this.isTwoValueEquals(newValue[newValue.length - 1], row.value)) { newValue[newValue.length - 1] = row.value; this.value = newValue; } } } if (this.survey) { if (prevRowCount + 1 == this.rowCount) { this.survey.matrixRowAdded(this, this.visibleRows[this.visibleRows.length - 1]); this.onRowsChanged(); } } }; QuestionMatrixDynamicModel.prototype.getDefaultRowValue = function (isRowAdded) { var res = null; for (var i = 0; i < this.columns.length; i++) { var q = this.columns[i].templateQuestion; if (!!q && !this.isValueEmpty(q.getDefaultValue())) { res = res || {}; res[this.columns[i].name] = q.getDefaultValue(); } } if (!this.isValueEmpty(this.defaultRowValue)) { for (var key in this.defaultRowValue) { res = res || {}; res[key] = this.defaultRowValue[key]; } } if (isRowAdded && this.defaultValueFromLastRow) { var val = this.value; if (!!val && Array.isArray(val) && val.length >= this.rowCount - 1) { var rowValue = val[this.rowCount - 2]; for (var key in rowValue) { res = res || {}; res[key] = rowValue[key]; } } } return res; }; /** * Removes a row by it's index. If confirmDelete is true, show a confirmation dialog * @param index a row index, from 0 to rowCount - 1 * @see removeRow * @see confirmDelete */ QuestionMatrixDynamicModel.prototype.removeRowUI = function (value) { if (!!value && !!value.rowName) { var index = this.visibleRows.indexOf(value); if (index < 0) return; value = index; } if (!this.isRequireConfirmOnRowDelete(value) || Object(_utils_utils__WEBPACK_IMPORTED_MODULE_6__["confirmAction"])(this.confirmDeleteText)) { this.removeRow(value); } }; QuestionMatrixDynamicModel.prototype.isRequireConfirmOnRowDelete = function (index) { if (!this.confirmDelete) return false; if (index < 0 || index >= this.rowCount) return false; var value = this.createNewValue(); if (this.isValueEmpty(value) || !Array.isArray(value)) return false; if (index >= value.length) return false; return !this.isValueEmpty(value[index]); }; /** * Removes a row by it's index. * @param index a row index, from 0 to rowCount - 1 */ QuestionMatrixDynamicModel.prototype.removeRow = function (index) { if (!this.canRemoveRows) return; if (index < 0 || index >= this.rowCount) return; var row = !!this.visibleRows && index < this.visibleRows.length ? this.visibleRows[index] : null; if (!!row && !!this.survey && !this.survey.matrixRowRemoving(this, index, row)) return; this.onStartRowAddingRemoving(); this.removeRowCore(index); this.onEndRowRemoving(row); }; QuestionMatrixDynamicModel.prototype.removeRowCore = function (index) { var row = this.generatedVisibleRows ? this.generatedVisibleRows[index] : null; if (this.generatedVisibleRows && index < this.generatedVisibleRows.length) { this.generatedVisibleRows.splice(index, 1); } this.rowCountValue--; if (this.value) { var val = []; if (Array.isArray(this.value) && index < this.value.length) { val = this.createValueCopy(); } else { val = this.createNewValue(); } val.splice(index, 1); val = this.deleteRowValue(val, null); this.isRowChanging = true; this.value = val; this.isRowChanging = false; } this.onRowsChanged(); if (this.survey) { this.survey.matrixRowRemoved(this, index, row); } }; Object.defineProperty(QuestionMatrixDynamicModel.prototype, "confirmDeleteText", { /** * Use this property to change the default text showing in the confirmation delete dialog on removing a row. */ get: function () { return this.getLocalizableStringText("confirmDeleteText", _surveyStrings__WEBPACK_IMPORTED_MODULE_3__["surveyLocalization"].getString("confirmDelete")); }, set: function (val) { this.setLocalizableStringText("confirmDeleteText", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDynamicModel.prototype, "locConfirmDeleteText", { get: function () { return this.getLocalizableString("confirmDeleteText"); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDynamicModel.prototype, "addRowText", { /** * Use this property to change the default value of add row button text. */ get: function () { return this.getLocalizableStringText("addRowText", this.defaultAddRowText); }, set: function (val) { this.setLocalizableStringText("addRowText", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDynamicModel.prototype, "locAddRowText", { get: function () { return this.getLocalizableString("addRowText"); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDynamicModel.prototype, "defaultAddRowText", { get: function () { return _surveyStrings__WEBPACK_IMPORTED_MODULE_3__["surveyLocalization"].getString(this.isColumnLayoutHorizontal ? "addRow" : "addColumn"); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDynamicModel.prototype, "addRowLocation", { /** * By default the 'Add Row' button is shown on bottom if columnLayout is horizontal and on top if columnLayout is vertical.
* You may set it to "top", "bottom" or "topBottom" (to show on top and bottom). * @see columnLayout */ get: function () { return this.getPropertyValue("addRowLocation"); }, set: function (val) { this.setPropertyValue("addRowLocation", val); }, enumerable: false, configurable: true }); QuestionMatrixDynamicModel.prototype.getAddRowLocation = function () { return this.addRowLocation; }; Object.defineProperty(QuestionMatrixDynamicModel.prototype, "hideColumnsIfEmpty", { /** * Set this property to true to hide matrix columns when there is no any row. */ get: function () { return this.getPropertyValue("hideColumnsIfEmpty"); }, set: function (val) { this.setPropertyValue("hideColumnsIfEmpty", val); }, enumerable: false, configurable: true }); QuestionMatrixDynamicModel.prototype.getShowColumnsIfEmpty = function () { return this.hideColumnsIfEmpty; }; Object.defineProperty(QuestionMatrixDynamicModel.prototype, "removeRowText", { /** * Use this property to change the default value of remove row button text. */ get: function () { return this.getLocalizableStringText("removeRowText", _surveyStrings__WEBPACK_IMPORTED_MODULE_3__["surveyLocalization"].getString("removeRow")); }, set: function (val) { this.setLocalizableStringText("removeRowText", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDynamicModel.prototype, "locRemoveRowText", { get: function () { return this.getLocalizableString("removeRowText"); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDynamicModel.prototype, "emptyRowsText", { /** * Use this property to change the default value of remove row button text. */ get: function () { return this.getLocalizableStringText("emptyRowsText", _surveyStrings__WEBPACK_IMPORTED_MODULE_3__["surveyLocalization"].getString("emptyRowsText")); }, set: function (val) { this.setLocalizableStringText("emptyRowsText", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMatrixDynamicModel.prototype, "locEmptyRowsText", { get: function () { return this.getLocalizableString("emptyRowsText"); }, enumerable: false, configurable: true }); QuestionMatrixDynamicModel.prototype.getDisplayValueCore = function (keysAsText, value) { if (!value || !Array.isArray(value)) return value; var values = this.getUnbindValue(value); var rows = this.visibleRows; for (var i = 0; i < rows.length && i < values.length; i++) { var val = values[i]; if (!val) continue; values[i] = this.getRowDisplayValue(keysAsText, rows[i], val); } return values; }; QuestionMatrixDynamicModel.prototype.addConditionObjectsByContext = function (objects, context) { var hasContext = !!context ? this.columns.indexOf(context) > -1 : false; for (var i = 0; i < this.columns.length; i++) { var column = this.columns[i]; this.addColumnIntoaddConditionObjectsByContext(objects, 0, column); if (hasContext && column != context) { this.addColumnIntoaddConditionObjectsByContext(objects, -1, column); } for (var j = 1; j < Math.min(_settings__WEBPACK_IMPORTED_MODULE_5__["settings"].matrixMaxRowCountInCondition, this.rowCount); j++) { this.addColumnIntoaddConditionObjectsByContext(objects, j, column); } } }; QuestionMatrixDynamicModel.prototype.addColumnIntoaddConditionObjectsByContext = function (objects, rowIndex, column) { var rowName = rowIndex > -1 ? "[" + rowIndex.toString() + "]." : "row."; objects.push({ name: (rowIndex > -1 ? this.getValueName() + rowName : rowName) + column.name, text: (rowIndex > -1 ? this.processedTitle + rowName : rowName) + column.fullTitle, question: this, }); }; QuestionMatrixDynamicModel.prototype.supportGoNextPageAutomatic = function () { return false; }; Object.defineProperty(QuestionMatrixDynamicModel.prototype, "hasRowText", { get: function () { return false; }, enumerable: false, configurable: true }); QuestionMatrixDynamicModel.prototype.onCheckForErrors = function (errors, isOnValueChanged) { _super.prototype.onCheckForErrors.call(this, errors, isOnValueChanged); if (!isOnValueChanged && this.hasErrorInMinRows()) { errors.push(new _error__WEBPACK_IMPORTED_MODULE_4__["MinRowCountError"](this.minRowCount, this)); } }; QuestionMatrixDynamicModel.prototype.hasErrorInMinRows = function () { if (this.minRowCount <= 0 || !this.isRequired || !this.generatedVisibleRows) return false; var setRowCount = 0; for (var rowIndex = 0; rowIndex < this.generatedVisibleRows.length; rowIndex++) { var row = this.generatedVisibleRows[rowIndex]; if (!row.isEmpty) setRowCount++; } return setRowCount < this.minRowCount; }; QuestionMatrixDynamicModel.prototype.getUniqueColumns = function () { var res = _super.prototype.getUniqueColumns.call(this); if (!!this.keyName) { var column = this.getColumnByName(this.keyName); if (!!column && res.indexOf(column) < 0) { res.push(column); } } return res; }; QuestionMatrixDynamicModel.prototype.generateRows = function () { var result = new Array(); if (this.rowCount === 0) return result; var val = this.createNewValue(); for (var i = 0; i < this.rowCount; i++) { result.push(this.createMatrixRow(this.getRowValueByIndex(val, i))); } if (!this.isValueEmpty(this.getDefaultRowValue(false))) { this.value = val; } return result; }; QuestionMatrixDynamicModel.prototype.createMatrixRow = function (value) { return new MatrixDynamicRowModel(this.rowCounter++, this, value); }; QuestionMatrixDynamicModel.prototype.onBeforeValueChanged = function (val) { if (!val || !Array.isArray(val)) return; var newRowCount = val.length; if (newRowCount == this.rowCount) return; if (!this.setRowCountValueFromData && newRowCount < this.initialRowCount) return; this.setRowCountValueFromData = true; this.rowCountValue = newRowCount; if (this.generatedVisibleRows) { this.clearGeneratedRows(); this.generatedVisibleRows = this.visibleRows; this.onRowsChanged(); } }; QuestionMatrixDynamicModel.prototype.createNewValue = function () { var result = this.createValueCopy(); if (!result || !Array.isArray(result)) result = []; if (result.length > this.rowCount) result.splice(this.rowCount); var rowValue = this.getDefaultRowValue(false); rowValue = rowValue || {}; for (var i = result.length; i < this.rowCount; i++) { result.push(this.getUnbindValue(rowValue)); } return result; }; QuestionMatrixDynamicModel.prototype.deleteRowValue = function (newValue, row) { var isEmpty = true; for (var i = 0; i < newValue.length; i++) { if (this.isObject(newValue[i]) && Object.keys(newValue[i]).length > 0) { isEmpty = false; break; } } return isEmpty ? null : newValue; }; QuestionMatrixDynamicModel.prototype.getRowValueByIndex = function (questionValue, index) { return Array.isArray(questionValue) && index >= 0 && index < questionValue.length ? questionValue[index] : null; }; QuestionMatrixDynamicModel.prototype.getRowValueCore = function (row, questionValue, create) { if (create === void 0) { create = false; } if (!this.generatedVisibleRows) return {}; var res = this.getRowValueByIndex(questionValue, this.generatedVisibleRows.indexOf(row)); if (!res && create) res = {}; return res; }; QuestionMatrixDynamicModel.prototype.getAddRowButtonCss = function (isEmptySection) { if (isEmptySection === void 0) { isEmptySection = false; } return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_8__["CssClassBuilder"]() .append(this.cssClasses.button) .append(this.cssClasses.buttonAdd) .append(this.cssClasses.emptyRowsButton, isEmptySection) .toString(); }; QuestionMatrixDynamicModel.prototype.getRemoveRowButtonCss = function () { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_8__["CssClassBuilder"]() .append(this.cssClasses.button) .append(this.cssClasses.buttonRemove) .toString(); }; return QuestionMatrixDynamicModel; }(_question_matrixdropdownbase__WEBPACK_IMPORTED_MODULE_2__["QuestionMatrixDropdownModelBase"])); var QuestionMatrixDynamicRenderedTable = /** @class */ (function (_super) { __extends(QuestionMatrixDynamicRenderedTable, _super); function QuestionMatrixDynamicRenderedTable() { return _super !== null && _super.apply(this, arguments) || this; } QuestionMatrixDynamicRenderedTable.prototype.setDefaultRowActions = function (row, actions) { _super.prototype.setDefaultRowActions.call(this, row, actions); }; return QuestionMatrixDynamicRenderedTable; }(_question_matrixdropdownrendered__WEBPACK_IMPORTED_MODULE_9__["QuestionMatrixDropdownRenderedTable"])); _jsonobject__WEBPACK_IMPORTED_MODULE_0__["Serializer"].addClass("matrixdynamic", [ { name: "rowsVisibleIf:condition", visible: false }, { name: "allowAddRows:boolean", default: true }, { name: "allowRemoveRows:boolean", default: true }, { name: "rowCount:number", default: 2, minValue: 0, isBindable: true }, { name: "minRowCount:number", default: 0, minValue: 0 }, { name: "maxRowCount:number", default: _settings__WEBPACK_IMPORTED_MODULE_5__["settings"].matrixMaximumRowCount, }, { name: "keyName" }, "defaultRowValue:rowvalue", "defaultValueFromLastRow:boolean", { name: "confirmDelete:boolean" }, { name: "confirmDeleteText", dependsOn: "confirmDelete", visibleIf: function (obj) { return !obj || obj.confirmDelete; }, serializationProperty: "locConfirmDeleteText", }, { name: "addRowLocation", default: "default", choices: ["default", "top", "bottom", "topBottom"], }, { name: "addRowText", serializationProperty: "locAddRowText" }, { name: "removeRowText", serializationProperty: "locRemoveRowText" }, "hideColumnsIfEmpty:boolean", { name: "emptyRowsText:text", serializationProperty: "locEmptyRowsText", dependsOn: "hideColumnsIfEmpty", visibleIf: function (obj) { return !obj || obj.hideColumnsIfEmpty; }, }, { name: "detailPanelShowOnAdding:boolean", dependsOn: "detailPanelMode", visibleIf: function (obj) { return obj.detailPanelMode !== "none"; }, }, "allowRowsDragAndDrop:switch" ], function () { return new QuestionMatrixDynamicModel(""); }, "matrixdropdownbase"); _questionfactory__WEBPACK_IMPORTED_MODULE_1__["QuestionFactory"].Instance.registerQuestion("matrixdynamic", function (name) { var q = new QuestionMatrixDynamicModel(name); q.choices = [1, 2, 3, 4, 5]; _question_matrixdropdownbase__WEBPACK_IMPORTED_MODULE_2__["QuestionMatrixDropdownModelBase"].addDefaultColumns(q); return q; }); /***/ }), /***/ "./src/question_multipletext.ts": /*!**************************************!*\ !*** ./src/question_multipletext.ts ***! \**************************************/ /*! exports provided: MultipleTextItemModel, QuestionMultipleTextModel */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MultipleTextItemModel", function() { return MultipleTextItemModel; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionMultipleTextModel", function() { return QuestionMultipleTextModel; }); /* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base */ "./src/base.ts"); /* harmony import */ var _survey_element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./survey-element */ "./src/survey-element.ts"); /* harmony import */ var _question__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./question */ "./src/question.ts"); /* harmony import */ var _question_text__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./question_text */ "./src/question_text.ts"); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./questionfactory */ "./src/questionfactory.ts"); /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./helpers */ "./src/helpers.ts"); /* harmony import */ var _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils/cssClassBuilder */ "./src/utils/cssClassBuilder.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var MultipleTextItemModel = /** @class */ (function (_super) { __extends(MultipleTextItemModel, _super); function MultipleTextItemModel(name, title) { if (name === void 0) { name = null; } if (title === void 0) { title = null; } var _this = _super.call(this) || this; _this.editorValue = _this.createEditor(name); _this.editor.questionTitleTemplateCallback = function () { return ""; }; _this.editor.titleLocation = "left"; if (title) { _this.title = title; } return _this; } MultipleTextItemModel.prototype.getType = function () { return "multipletextitem"; }; Object.defineProperty(MultipleTextItemModel.prototype, "id", { get: function () { return this.editor.id; }, enumerable: false, configurable: true }); MultipleTextItemModel.prototype.getOriginalObj = function () { return this.editor; }; Object.defineProperty(MultipleTextItemModel.prototype, "name", { /** * The item name. */ get: function () { return this.editor.name; }, set: function (val) { this.editor.name = val; }, enumerable: false, configurable: true }); Object.defineProperty(MultipleTextItemModel.prototype, "question", { get: function () { return this.data; }, enumerable: false, configurable: true }); Object.defineProperty(MultipleTextItemModel.prototype, "editor", { get: function () { return this.editorValue; }, enumerable: false, configurable: true }); MultipleTextItemModel.prototype.createEditor = function (name) { return new _question_text__WEBPACK_IMPORTED_MODULE_3__["QuestionTextModel"](name); }; MultipleTextItemModel.prototype.addUsedLocales = function (locales) { _super.prototype.addUsedLocales.call(this, locales); this.editor.addUsedLocales(locales); }; MultipleTextItemModel.prototype.locStrsChanged = function () { _super.prototype.locStrsChanged.call(this); this.editor.locStrsChanged(); }; MultipleTextItemModel.prototype.setData = function (data) { this.data = data; if (!!data) { this.editor.defaultValue = data.getItemDefaultValue(this.name); this.editor.setSurveyImpl(this); this.editor.parent = data; } }; Object.defineProperty(MultipleTextItemModel.prototype, "isRequired", { /** * Set this property to true, to make the item a required. If a user doesn't fill the item then a validation error will be generated. */ get: function () { return this.editor.isRequired; }, set: function (val) { this.editor.isRequired = val; }, enumerable: false, configurable: true }); Object.defineProperty(MultipleTextItemModel.prototype, "inputType", { /** * Use this property to change the default input type. */ get: function () { return this.editor.inputType; }, set: function (val) { this.editor.inputType = val; }, enumerable: false, configurable: true }); Object.defineProperty(MultipleTextItemModel.prototype, "title", { /** * Item title. If it is empty, the item name is rendered as title. This property supports markdown. * @see name */ get: function () { return this.editor.title; }, set: function (val) { this.editor.title = val; }, enumerable: false, configurable: true }); Object.defineProperty(MultipleTextItemModel.prototype, "locTitle", { get: function () { return this.editor.locTitle; }, enumerable: false, configurable: true }); Object.defineProperty(MultipleTextItemModel.prototype, "fullTitle", { /** * Returns the text or html for rendering the title. */ get: function () { return this.editor.fullTitle; }, enumerable: false, configurable: true }); Object.defineProperty(MultipleTextItemModel.prototype, "maxLength", { /** * The maximum text length. If it is -1, defaul value, then the survey maxTextLength property will be used. * If it is 0, then the value is unlimited * @see SurveyModel.maxTextLength */ get: function () { return this.editor.maxLength; }, set: function (val) { this.editor.maxLength = val; }, enumerable: false, configurable: true }); MultipleTextItemModel.prototype.getMaxLength = function () { var survey = this.getSurvey(); return _helpers__WEBPACK_IMPORTED_MODULE_6__["Helpers"].getMaxLength(this.maxLength, survey ? survey.maxTextLength : -1); }; Object.defineProperty(MultipleTextItemModel.prototype, "placeHolder", { /** * The input place holder. */ get: function () { return this.editor.placeHolder; }, set: function (val) { this.editor.placeHolder = val; }, enumerable: false, configurable: true }); Object.defineProperty(MultipleTextItemModel.prototype, "locPlaceHolder", { get: function () { return this.editor.locPlaceHolder; }, enumerable: false, configurable: true }); Object.defineProperty(MultipleTextItemModel.prototype, "requiredErrorText", { /** * The custom text that will be shown on required error. Use this property, if you do not want to show the default text. */ get: function () { return this.editor.requiredErrorText; }, set: function (val) { this.editor.requiredErrorText = val; }, enumerable: false, configurable: true }); Object.defineProperty(MultipleTextItemModel.prototype, "locRequiredErrorText", { get: function () { return this.editor.locRequiredErrorText; }, enumerable: false, configurable: true }); Object.defineProperty(MultipleTextItemModel.prototype, "size", { /** * The input size. */ get: function () { return this.editor.size; }, set: function (val) { this.editor.size = val; }, enumerable: false, configurable: true }); Object.defineProperty(MultipleTextItemModel.prototype, "validators", { /** * The list of question validators. */ get: function () { return this.editor.validators; }, set: function (val) { this.editor.validators = val; }, enumerable: false, configurable: true }); MultipleTextItemModel.prototype.getValidators = function () { return this.validators; }; Object.defineProperty(MultipleTextItemModel.prototype, "value", { /** * The item value. */ get: function () { return this.data ? this.data.getMultipleTextValue(this.name) : null; }, set: function (value) { if (this.data != null) { this.data.setMultipleTextValue(this.name, value); } }, enumerable: false, configurable: true }); MultipleTextItemModel.prototype.isEmpty = function () { return this.editor.isEmpty(); }; MultipleTextItemModel.prototype.onValueChanged = function (newValue) { if (this.valueChangedCallback) this.valueChangedCallback(newValue); }; //ISurveyImpl MultipleTextItemModel.prototype.getSurveyData = function () { return this; }; MultipleTextItemModel.prototype.getSurvey = function () { return this.data ? this.data.getSurvey() : null; }; MultipleTextItemModel.prototype.getTextProcessor = function () { return this.data ? this.data.getTextProcessor() : null; }; //ISurveyData MultipleTextItemModel.prototype.getValue = function (name) { if (!this.data) return null; return this.data.getMultipleTextValue(name); }; MultipleTextItemModel.prototype.setValue = function (name, value) { if (this.data) { this.data.setMultipleTextValue(name, value); } }; MultipleTextItemModel.prototype.getVariable = function (name) { return undefined; }; MultipleTextItemModel.prototype.setVariable = function (name, newValue) { }; MultipleTextItemModel.prototype.getComment = function (name) { return null; }; MultipleTextItemModel.prototype.setComment = function (name, newValue) { }; MultipleTextItemModel.prototype.getAllValues = function () { if (this.data) return this.data.getAllValues(); return this.value; }; MultipleTextItemModel.prototype.getFilteredValues = function () { return this.getAllValues(); }; MultipleTextItemModel.prototype.getFilteredProperties = function () { return { survey: this.getSurvey() }; }; //IValidatorOwner MultipleTextItemModel.prototype.getValidatorTitle = function () { return this.title; }; Object.defineProperty(MultipleTextItemModel.prototype, "validatedValue", { get: function () { return this.value; }, set: function (val) { this.value = val; }, enumerable: false, configurable: true }); MultipleTextItemModel.prototype.getDataFilteredValues = function () { return this.getFilteredValues(); }; MultipleTextItemModel.prototype.getDataFilteredProperties = function () { return this.getFilteredProperties(); }; return MultipleTextItemModel; }(_base__WEBPACK_IMPORTED_MODULE_0__["Base"])); /** * A Model for a multiple text question. */ var QuestionMultipleTextModel = /** @class */ (function (_super) { __extends(QuestionMultipleTextModel, _super); function QuestionMultipleTextModel(name) { var _this = _super.call(this, name) || this; _this.isMultipleItemValueChanging = false; _this.createNewArray("items", function (item) { item.setData(_this); }); _this.registerFunctionOnPropertyValueChanged("items", function () { _this.fireCallback(_this.colCountChangedCallback); }); _this.registerFunctionOnPropertyValueChanged("colCount", function () { _this.fireCallback(_this.colCountChangedCallback); }); _this.registerFunctionOnPropertyValueChanged("itemSize", function () { _this.updateItemsSize(); }); return _this; } QuestionMultipleTextModel.addDefaultItems = function (question) { var names = _questionfactory__WEBPACK_IMPORTED_MODULE_5__["QuestionFactory"].DefaultMutlipleTextItems; for (var i = 0; i < names.length; i++) question.addItem(names[i]); }; QuestionMultipleTextModel.prototype.getType = function () { return "multipletext"; }; QuestionMultipleTextModel.prototype.setSurveyImpl = function (value) { _super.prototype.setSurveyImpl.call(this, value); for (var i = 0; i < this.items.length; i++) { this.items[i].setData(this); } }; Object.defineProperty(QuestionMultipleTextModel.prototype, "isAllowTitleLeft", { get: function () { return false; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMultipleTextModel.prototype, "hasSingleInput", { get: function () { return false; }, enumerable: false, configurable: true }); QuestionMultipleTextModel.prototype.onSurveyLoad = function () { this.editorsOnSurveyLoad(); _super.prototype.onSurveyLoad.call(this); this.fireCallback(this.colCountChangedCallback); }; QuestionMultipleTextModel.prototype.setQuestionValue = function (newValue, updateIsAnswered) { if (updateIsAnswered === void 0) { updateIsAnswered = true; } _super.prototype.setQuestionValue.call(this, newValue, updateIsAnswered); this.performForEveryEditor(function (item) { item.editor.updateValueFromSurvey(item.value); }); this.updateIsAnswered(); }; QuestionMultipleTextModel.prototype.onSurveyValueChanged = function (newValue) { _super.prototype.onSurveyValueChanged.call(this, newValue); this.performForEveryEditor(function (item) { item.editor.onSurveyValueChanged(item.value); }); }; QuestionMultipleTextModel.prototype.updateItemsSize = function () { this.performForEveryEditor(function (item) { item.editor.updateInputSize(); }); }; QuestionMultipleTextModel.prototype.editorsOnSurveyLoad = function () { this.performForEveryEditor(function (item) { item.editor.onSurveyLoad(); }); }; QuestionMultipleTextModel.prototype.performForEveryEditor = function (func) { for (var i = 0; i < this.items.length; i++) { var item = this.items[i]; if (item.editor) { func(item); } } }; Object.defineProperty(QuestionMultipleTextModel.prototype, "items", { /** * The list of input items. */ get: function () { return this.getPropertyValue("items"); }, set: function (val) { this.setPropertyValue("items", val); }, enumerable: false, configurable: true }); /** * Add a new text item. * @param name a item name * @param title a item title (optional) */ QuestionMultipleTextModel.prototype.addItem = function (name, title) { if (title === void 0) { title = null; } var item = this.createTextItem(name, title); this.items.push(item); return item; }; QuestionMultipleTextModel.prototype.getItemByName = function (name) { for (var i = 0; i < this.items.length; i++) { if (this.items[i].name == name) return this.items[i]; } return null; }; QuestionMultipleTextModel.prototype.addConditionObjectsByContext = function (objects, context) { for (var i = 0; i < this.items.length; i++) { var item = this.items[i]; objects.push({ name: this.getValueName() + "." + item.name, text: this.processedTitle + "." + item.fullTitle, question: this, }); } }; QuestionMultipleTextModel.prototype.getConditionJson = function (operator, path) { if (operator === void 0) { operator = null; } if (path === void 0) { path = null; } if (!path) return _super.prototype.getConditionJson.call(this); var item = this.getItemByName(path); if (!item) return null; var json = new _jsonobject__WEBPACK_IMPORTED_MODULE_4__["JsonObject"]().toJsonObject(item); json["type"] = "text"; return json; }; QuestionMultipleTextModel.prototype.locStrsChanged = function () { _super.prototype.locStrsChanged.call(this); for (var i = 0; i < this.items.length; i++) { this.items[i].locStrsChanged(); } }; QuestionMultipleTextModel.prototype.supportGoNextPageAutomatic = function () { for (var i = 0; i < this.items.length; i++) { if (this.items[i].isEmpty()) return false; } return true; }; Object.defineProperty(QuestionMultipleTextModel.prototype, "colCount", { /** * The number of columns. Items are rendred in one line if the value is 0. */ get: function () { return this.getPropertyValue("colCount"); }, set: function (val) { if (val < 1 || val > 5) return; this.setPropertyValue("colCount", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionMultipleTextModel.prototype, "itemSize", { /** * The default text input size. */ get: function () { return this.getPropertyValue("itemSize"); }, set: function (val) { this.setPropertyValue("itemSize", val); }, enumerable: false, configurable: true }); /** * Returns the list of rendered rows. */ QuestionMultipleTextModel.prototype.getRows = function () { var colCount = this.colCount; var items = this.items; var rows = []; var index = 0; for (var i = 0; i < items.length; i++) { if (index == 0) { rows.push([]); } rows[rows.length - 1].push(items[i]); index++; if (index >= colCount) { index = 0; } } return rows; }; QuestionMultipleTextModel.prototype.onValueChanged = function () { _super.prototype.onValueChanged.call(this); this.onItemValueChanged(); }; QuestionMultipleTextModel.prototype.createTextItem = function (name, title) { return new MultipleTextItemModel(name, title); }; QuestionMultipleTextModel.prototype.onItemValueChanged = function () { if (this.isMultipleItemValueChanging) return; for (var i = 0; i < this.items.length; i++) { var itemValue = null; if (this.value && this.items[i].name in this.value) { itemValue = this.value[this.items[i].name]; } this.items[i].onValueChanged(itemValue); } }; QuestionMultipleTextModel.prototype.getIsRunningValidators = function () { if (_super.prototype.getIsRunningValidators.call(this)) return true; for (var i = 0; i < this.items.length; i++) { if (this.items[i].editor.isRunningValidators) return true; } return false; }; QuestionMultipleTextModel.prototype.hasErrors = function (fireCallback, rec) { var _this = this; if (fireCallback === void 0) { fireCallback = true; } if (rec === void 0) { rec = null; } var res = false; for (var i = 0; i < this.items.length; i++) { this.items[i].editor.onCompletedAsyncValidators = function (hasErrors) { _this.raiseOnCompletedAsyncValidators(); }; if (!!rec && rec.isOnValueChanged === true && this.items[i].editor.isEmpty()) continue; res = this.items[i].editor.hasErrors(fireCallback, rec) || res; } return _super.prototype.hasErrors.call(this, fireCallback) || res; }; QuestionMultipleTextModel.prototype.getAllErrors = function () { var result = _super.prototype.getAllErrors.call(this); for (var i = 0; i < this.items.length; i++) { var errors = this.items[i].editor.getAllErrors(); if (errors && errors.length > 0) { result = result.concat(errors); } } return result; }; QuestionMultipleTextModel.prototype.clearErrors = function () { _super.prototype.clearErrors.call(this); for (var i = 0; i < this.items.length; i++) { this.items[i].editor.clearErrors(); } }; QuestionMultipleTextModel.prototype.getContainsErrors = function () { var res = _super.prototype.getContainsErrors.call(this); if (res) return res; var items = this.items; for (var i = 0; i < items.length; i++) { if (items[i].editor.containsErrors) return true; } return false; }; QuestionMultipleTextModel.prototype.getIsAnswered = function () { if (!_super.prototype.getIsAnswered.call(this)) return false; for (var i = 0; i < this.items.length; i++) { var editor = this.items[i].editor; if (editor.isVisible && !editor.isAnswered) return false; } return true; }; QuestionMultipleTextModel.prototype.getProgressInfo = function () { var elements = []; for (var i = 0; i < this.items.length; i++) { elements.push(this.items[i].editor); } return _survey_element__WEBPACK_IMPORTED_MODULE_1__["SurveyElement"].getProgressInfoByElements(elements, this.isRequired); }; QuestionMultipleTextModel.prototype.getDisplayValueCore = function (keysAsText, value) { if (!value) return value; var res = {}; for (var i = 0; i < this.items.length; i++) { var item = this.items[i]; var val = value[item.name]; if (_helpers__WEBPACK_IMPORTED_MODULE_6__["Helpers"].isValueEmpty(val)) continue; var itemName = item.name; if (keysAsText && !!item.title) { itemName = item.title; } res[itemName] = item.editor.getDisplayValue(keysAsText, val); } return res; }; //IMultipleTextData QuestionMultipleTextModel.prototype.getMultipleTextValue = function (name) { if (!this.value) return null; return this.value[name]; }; QuestionMultipleTextModel.prototype.setMultipleTextValue = function (name, value) { this.isMultipleItemValueChanging = true; if (this.isValueEmpty(value)) { value = undefined; } var newValue = this.value; if (!newValue) { newValue = {}; } newValue[name] = value; this.setNewValue(newValue); this.isMultipleItemValueChanging = false; }; QuestionMultipleTextModel.prototype.getItemDefaultValue = function (name) { return !!this.defaultValue ? this.defaultValue[name] : null; }; QuestionMultipleTextModel.prototype.getTextProcessor = function () { return this.textProcessor; }; QuestionMultipleTextModel.prototype.getAllValues = function () { return this.data ? this.data.getAllValues() : null; }; QuestionMultipleTextModel.prototype.getIsRequiredText = function () { return this.survey ? this.survey.requiredText : ""; }; //IPanel QuestionMultipleTextModel.prototype.addElement = function (element, index) { }; QuestionMultipleTextModel.prototype.removeElement = function (element) { return false; }; QuestionMultipleTextModel.prototype.getQuestionTitleLocation = function () { return "left"; }; QuestionMultipleTextModel.prototype.getQuestionStartIndex = function () { return this.getStartIndex(); }; QuestionMultipleTextModel.prototype.getChildrenLayoutType = function () { return "row"; }; QuestionMultipleTextModel.prototype.elementWidthChanged = function (el) { }; Object.defineProperty(QuestionMultipleTextModel.prototype, "elements", { get: function () { return []; }, enumerable: false, configurable: true }); QuestionMultipleTextModel.prototype.indexOf = function (el) { return -1; }; QuestionMultipleTextModel.prototype.ensureRowsVisibility = function () { // do nothing }; QuestionMultipleTextModel.prototype.getItemCss = function () { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_7__["CssClassBuilder"]().append(this.cssClasses.item) .append(this.cssClasses.cell).toString(); }; QuestionMultipleTextModel.prototype.getItemTitleCss = function () { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_7__["CssClassBuilder"]().append(this.cssClasses.itemTitle) .append(this.cssClasses.cell).toString(); }; return QuestionMultipleTextModel; }(_question__WEBPACK_IMPORTED_MODULE_2__["Question"])); _jsonobject__WEBPACK_IMPORTED_MODULE_4__["Serializer"].addClass("multipletextitem", [ "name", "isRequired:boolean", { name: "placeHolder", serializationProperty: "locPlaceHolder" }, { name: "inputType", default: "text", choices: [ "color", "date", "datetime", "datetime-local", "email", "month", "number", "password", "range", "tel", "text", "time", "url", "week", ], }, { name: "title", serializationProperty: "locTitle" }, { name: "maxLength:number", default: -1 }, { name: "size:number", minValue: 0 }, { name: "requiredErrorText:text", serializationProperty: "locRequiredErrorText", }, { name: "validators:validators", baseClassName: "surveyvalidator", classNamePart: "validator", }, ], function () { return new MultipleTextItemModel(""); }); _jsonobject__WEBPACK_IMPORTED_MODULE_4__["Serializer"].addClass("multipletext", [ { name: "!items:textitems", className: "multipletextitem" }, { name: "itemSize:number", minValue: 0 }, { name: "colCount:number", default: 1, choices: [1, 2, 3, 4, 5] }, ], function () { return new QuestionMultipleTextModel(""); }, "question"); _questionfactory__WEBPACK_IMPORTED_MODULE_5__["QuestionFactory"].Instance.registerQuestion("multipletext", function (name) { var q = new QuestionMultipleTextModel(name); QuestionMultipleTextModel.addDefaultItems(q); return q; }); /***/ }), /***/ "./src/question_paneldynamic.ts": /*!**************************************!*\ !*** ./src/question_paneldynamic.ts ***! \**************************************/ /*! exports provided: QuestionPanelDynamicItem, QuestionPanelDynamicTemplateSurveyImpl, QuestionPanelDynamicModel */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionPanelDynamicItem", function() { return QuestionPanelDynamicItem; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionPanelDynamicTemplateSurveyImpl", function() { return QuestionPanelDynamicTemplateSurveyImpl; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionPanelDynamicModel", function() { return QuestionPanelDynamicModel; }); /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers */ "./src/helpers.ts"); /* harmony import */ var _survey_element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./survey-element */ "./src/survey-element.ts"); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./surveyStrings */ "./src/surveyStrings.ts"); /* harmony import */ var _textPreProcessor__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./textPreProcessor */ "./src/textPreProcessor.ts"); /* harmony import */ var _question__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./question */ "./src/question.ts"); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./questionfactory */ "./src/questionfactory.ts"); /* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./error */ "./src/error.ts"); /* harmony import */ var _settings__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./settings */ "./src/settings.ts"); /* harmony import */ var _utils_utils__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./utils/utils */ "./src/utils/utils.ts"); /* harmony import */ var _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./utils/cssClassBuilder */ "./src/utils/cssClassBuilder.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __spreadArray = (undefined && undefined.__spreadArray) || function (to, from, pack) { if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { if (ar || !(i in from)) { if (!ar) ar = Array.prototype.slice.call(from, 0, i); ar[i] = from[i]; } } return to.concat(ar || Array.prototype.slice.call(from)); }; var QuestionPanelDynamicItemTextProcessor = /** @class */ (function (_super) { __extends(QuestionPanelDynamicItemTextProcessor, _super); function QuestionPanelDynamicItemTextProcessor(data, panelItem, variableName) { var _this = _super.call(this, variableName) || this; _this.data = data; _this.panelItem = panelItem; _this.variableName = variableName; return _this; } Object.defineProperty(QuestionPanelDynamicItemTextProcessor.prototype, "survey", { get: function () { return this.panelItem.getSurvey(); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicItemTextProcessor.prototype, "panel", { get: function () { return this.panelItem.panel; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicItemTextProcessor.prototype, "panelIndex", { get: function () { return !!this.data ? this.data.getItemIndex(this.panelItem) : -1; }, enumerable: false, configurable: true }); QuestionPanelDynamicItemTextProcessor.prototype.getValues = function () { return this.panelItem.getAllValues(); }; QuestionPanelDynamicItemTextProcessor.prototype.getQuestionByName = function (name) { var res = _super.prototype.getQuestionByName.call(this, name); if (!!res) return res; var index = this.panelIndex; return index > -1 ? this.data.getSharedQuestionFromArray(name, index) : null; }; QuestionPanelDynamicItemTextProcessor.prototype.onCustomProcessText = function (textValue) { if (textValue.name == QuestionPanelDynamicItem.IndexVariableName) { var index = this.panelIndex; if (index > -1) { textValue.isExists = true; textValue.value = index + 1; return true; } } if (textValue.name.indexOf(QuestionPanelDynamicItem.ParentItemVariableName + ".") == 0) { var q = this.data; if (!!q && !!q.parentQuestion && !!q.parent) { var data = q.parent.data; var processor = new QuestionPanelDynamicItemTextProcessor(q.parentQuestion, data, QuestionPanelDynamicItem.ItemVariableName); var text = textValue.name.replace(QuestionPanelDynamicItem.ParentItemVariableName, QuestionPanelDynamicItem.ItemVariableName); var res = processor.processValue(text, textValue.returnDisplayValue); textValue.isExists = res.isExists; textValue.value = res.value; } return true; } return false; }; return QuestionPanelDynamicItemTextProcessor; }(_textPreProcessor__WEBPACK_IMPORTED_MODULE_3__["QuestionTextProcessor"])); var QuestionPanelDynamicItem = /** @class */ (function () { function QuestionPanelDynamicItem(data, panel) { this.data = data; this.panelValue = panel; this.textPreProcessor = new QuestionPanelDynamicItemTextProcessor(data, this, QuestionPanelDynamicItem.ItemVariableName); this.setSurveyImpl(); } Object.defineProperty(QuestionPanelDynamicItem.prototype, "panel", { get: function () { return this.panelValue; }, enumerable: false, configurable: true }); QuestionPanelDynamicItem.prototype.setSurveyImpl = function () { this.panel.setSurveyImpl(this); }; QuestionPanelDynamicItem.prototype.getValue = function (name) { var values = this.getAllValues(); return values[name]; }; QuestionPanelDynamicItem.prototype.setValue = function (name, newValue) { this.data.setPanelItemData(this, name, newValue); }; QuestionPanelDynamicItem.prototype.getVariable = function (name) { return undefined; }; QuestionPanelDynamicItem.prototype.setVariable = function (name, newValue) { }; QuestionPanelDynamicItem.prototype.getComment = function (name) { var result = this.getValue(name + _settings__WEBPACK_IMPORTED_MODULE_8__["settings"].commentPrefix); return result ? result : ""; }; QuestionPanelDynamicItem.prototype.setComment = function (name, newValue, locNotification) { this.setValue(name + _settings__WEBPACK_IMPORTED_MODULE_8__["settings"].commentPrefix, newValue); }; QuestionPanelDynamicItem.prototype.getAllValues = function () { return this.data.getPanelItemData(this); }; QuestionPanelDynamicItem.prototype.getFilteredValues = function () { var values = {}; var surveyValues = !!this.data && !!this.data.getRootData() ? this.data.getRootData().getFilteredValues() : {}; for (var key in surveyValues) { values[key] = surveyValues[key]; } values[QuestionPanelDynamicItem.ItemVariableName] = this.getAllValues(); if (!!this.data) { values[QuestionPanelDynamicItem.IndexVariableName.toLowerCase()] = this.data.getItemIndex(this); } return values; }; QuestionPanelDynamicItem.prototype.getFilteredProperties = function () { if (!!this.data && !!this.data.getRootData()) return this.data.getRootData().getFilteredProperties(); return { survey: this.getSurvey() }; }; QuestionPanelDynamicItem.prototype.getSurveyData = function () { return this; }; QuestionPanelDynamicItem.prototype.getSurvey = function () { return this.data ? this.data.getSurvey() : null; }; QuestionPanelDynamicItem.prototype.getTextProcessor = function () { return this.textPreProcessor; }; QuestionPanelDynamicItem.ItemVariableName = "panel"; QuestionPanelDynamicItem.ParentItemVariableName = "parentPanel"; QuestionPanelDynamicItem.IndexVariableName = "panelIndex"; return QuestionPanelDynamicItem; }()); var QuestionPanelDynamicTemplateSurveyImpl = /** @class */ (function () { function QuestionPanelDynamicTemplateSurveyImpl(data) { this.data = data; } QuestionPanelDynamicTemplateSurveyImpl.prototype.getSurveyData = function () { return null; }; QuestionPanelDynamicTemplateSurveyImpl.prototype.getSurvey = function () { return this.data.getSurvey(); }; QuestionPanelDynamicTemplateSurveyImpl.prototype.getTextProcessor = function () { return null; }; return QuestionPanelDynamicTemplateSurveyImpl; }()); /** * A Model for a panel dymanic question. You setup the template panel, but adding elements (any question or a panel) and assign a text to it's title, and this panel will be used as a template on creating dynamic panels. The number of panels is defined by panelCount property. * An end-user may dynamically add/remove panels, unless you forbidden this. */ var QuestionPanelDynamicModel = /** @class */ (function (_super) { __extends(QuestionPanelDynamicModel, _super); function QuestionPanelDynamicModel(name) { var _this = _super.call(this, name) || this; _this.loadingPanelCount = 0; _this.currentIndexValue = -1; _this.isAddingNewPanels = false; _this.createNewArray("panels"); _this.templateValue = _this.createAndSetupNewPanelObject(); _this.template.renderWidth = "100%"; _this.template.selectedElementInDesign = _this; var self = _this; _this.template.addElementCallback = function (element) { self.addOnPropertyChangedCallback(element); self.rebuildPanels(); }; _this.template.removeElementCallback = function (element) { self.rebuildPanels(); }; _this.createLocalizableString("confirmDeleteText", _this); _this.createLocalizableString("keyDuplicationError", _this); _this.createLocalizableString("panelAddText", _this); _this.createLocalizableString("panelRemoveText", _this); _this.createLocalizableString("panelPrevText", _this); _this.createLocalizableString("panelNextText", _this); _this.registerFunctionOnPropertyValueChanged("panelsState", function () { self.setPanelsState(); }); return _this; } Object.defineProperty(QuestionPanelDynamicModel.prototype, "hasSingleInput", { get: function () { return false; }, enumerable: false, configurable: true }); QuestionPanelDynamicModel.prototype.setSurveyImpl = function (value) { _super.prototype.setSurveyImpl.call(this, value); this.setTemplatePanelSurveyImpl(); this.setPanelsSurveyImpl(); }; QuestionPanelDynamicModel.prototype.assignOnPropertyChangedToTemplate = function () { var elements = this.template.elements; for (var i = 0; i < elements.length; i++) { this.addOnPropertyChangedCallback(elements[i]); } }; QuestionPanelDynamicModel.prototype.addOnPropertyChangedCallback = function (element) { var self = this; element.onPropertyChanged.add(function (element, options) { self.onTemplateElementPropertyChanged(element, options); }); if (element.isPanel) { element.addElementCallback = function (element) { self.addOnPropertyChangedCallback(element); }; } }; QuestionPanelDynamicModel.prototype.onTemplateElementPropertyChanged = function (element, options) { if (this.isLoadingFromJson || this.isDesignMode || this.panels.length == 0) return; var property = _jsonobject__WEBPACK_IMPORTED_MODULE_5__["Serializer"].findProperty(element.getType(), options.name); if (!property) return; var panels = this.panels; for (var i = 0; i < panels.length; i++) { var question = panels[i].getQuestionByName(element.name); if (!!question && question[options.name] !== options.newValue) { question[options.name] = options.newValue; } } }; QuestionPanelDynamicModel.prototype.getType = function () { return "paneldynamic"; }; Object.defineProperty(QuestionPanelDynamicModel.prototype, "isCompositeQuestion", { get: function () { return true; }, enumerable: false, configurable: true }); QuestionPanelDynamicModel.prototype.clearOnDeletingContainer = function () { this.panels.forEach(function (panel) { panel.clearOnDeletingContainer(); }); }; Object.defineProperty(QuestionPanelDynamicModel.prototype, "isAllowTitleLeft", { get: function () { return false; }, enumerable: false, configurable: true }); QuestionPanelDynamicModel.prototype.removeElement = function (element) { return this.template.removeElement(element); }; Object.defineProperty(QuestionPanelDynamicModel.prototype, "template", { /** * The template Panel. This panel is used as a template on creatign dynamic panels * @see templateElements * @see templateTitle * @see panelCount */ get: function () { return this.templateValue; }, enumerable: false, configurable: true }); QuestionPanelDynamicModel.prototype.getPanel = function () { return this.template; }; Object.defineProperty(QuestionPanelDynamicModel.prototype, "templateElements", { /** * The template Panel elements, questions and panels. * @see templateElements * @see template * @see panelCount */ get: function () { return this.template.elements; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "templateTitle", { /** * The template Panel title property. * @see templateElements * @see template * @see panelCount */ get: function () { return this.template.title; }, set: function (newValue) { this.template.title = newValue; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "locTemplateTitle", { get: function () { return this.template.locTitle; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "templateDescription", { /** * The template Panel description property. * @see templateElements * @see template * @see panelCount * @see templateTitle */ get: function () { return this.template.description; }, set: function (newValue) { this.template.description = newValue; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "locTemplateDescription", { get: function () { return this.template.locDescription; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "items", { get: function () { var res = []; for (var i = 0; i < this.panels.length; i++) { res.push(this.panels[i].data); } return res; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "panels", { /** * The array of dynamic panels created based on panel template * @see template * @see panelCount */ get: function () { return this.getPropertyValue("panels"); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "currentIndex", { /** * The index of current active dynamical panel when the renderMode is not "list". If there is no dymamic panel (panelCount = 0) or renderMode equals "list" it returns -1, otherwise it returns a value from 0 to panelCount - 1. * @see currentPanel * @see panels * @see panelCount * @see renderMode */ get: function () { if (this.isRenderModeList) return -1; if (this.isDesignMode) return 0; if (this.currentIndexValue < 0 && this.panelCount > 0) { this.currentIndexValue = 0; } if (this.currentIndexValue >= this.panelCount) { this.currentIndexValue = this.panelCount - 1; } return this.currentIndexValue; }, set: function (val) { if (this.currentIndexValue !== val) { if (val >= this.panelCount) val = this.panelCount - 1; this.currentIndexValue = val; this.fireCallback(this.currentIndexChangedCallback); } }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "currentPanel", { /** * The current active dynamical panel when the renderMode is not "list". If there is no dymamic panel (panelCount = 0) or renderMode equals "list" it returns null. * @see currenIndex * @see panels * @see panelCount * @see renderMode */ get: function () { var index = this.currentIndex; if (index < 0 || index >= this.panels.length) return null; return this.panels[index]; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "confirmDelete", { /** * Set it to true, to show a confirmation dialog on removing a panel * @see ConfirmDeleteText */ get: function () { return this.getPropertyValue("confirmDelete", false); }, set: function (val) { this.setPropertyValue("confirmDelete", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "keyName", { /** * Set it to a question name used in the template panel and the library shows duplication error, if there are same values in different panels of this question. * @see keyDuplicationError */ get: function () { return this.getPropertyValue("keyName", ""); }, set: function (val) { this.setPropertyValue("keyName", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "confirmDeleteText", { /** * Use this property to change the default text showing in the confirmation delete dialog on removing a panel. */ get: function () { return this.getLocalizableStringText("confirmDeleteText", _surveyStrings__WEBPACK_IMPORTED_MODULE_2__["surveyLocalization"].getString("confirmDelete")); }, set: function (val) { this.setLocalizableStringText("confirmDeleteText", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "locConfirmDeleteText", { get: function () { return this.getLocalizableString("confirmDeleteText"); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "keyDuplicationError", { /** * The duplication value error text. Set it to show the text different from the default. * @see keyName */ get: function () { return this.getLocalizableStringText("keyDuplicationError", _surveyStrings__WEBPACK_IMPORTED_MODULE_2__["surveyLocalization"].getString("keyDuplicationError")); }, set: function (val) { this.setLocalizableStringText("keyDuplicationError", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "locKeyDuplicationError", { get: function () { return this.getLocalizableString("keyDuplicationError"); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "panelPrevText", { /** * Use this property to change the default previous button text. Previous button shows the previous panel, change the currentPanel, when the renderMode doesn't equal to "list". * @see currentPanel * @see currentIndex * @see renderMode */ get: function () { return this.getLocalizableStringText("panelPrevText", _surveyStrings__WEBPACK_IMPORTED_MODULE_2__["surveyLocalization"].getString("pagePrevText")); }, set: function (val) { this.setLocalizableStringText("panelPrevText", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "locPanelPrevText", { get: function () { return this.getLocalizableString("panelPrevText"); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "panelNextText", { /** * Use this property to change the default next button text. Next button shows the next panel, change the currentPanel, when the renderMode doesn't equal to "list". * @see currentPanel * @see currentIndex * @see renderMode */ get: function () { return this.getLocalizableStringText("panelNextText", _surveyStrings__WEBPACK_IMPORTED_MODULE_2__["surveyLocalization"].getString("pageNextText")); }, set: function (val) { this.setLocalizableStringText("panelNextText", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "locPanelNextText", { get: function () { return this.getLocalizableString("panelNextText"); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "panelAddText", { /** * Use this property to change the default value of add panel button text. */ get: function () { return this.getLocalizableStringText("panelAddText", _surveyStrings__WEBPACK_IMPORTED_MODULE_2__["surveyLocalization"].getString("addPanel")); }, set: function (value) { this.setLocalizableStringText("panelAddText", value); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "locPanelAddText", { get: function () { return this.getLocalizableString("panelAddText"); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "panelRemoveText", { /** * Use this property to change the default value of remove panel button text. */ get: function () { return this.getLocalizableStringText("panelRemoveText", _surveyStrings__WEBPACK_IMPORTED_MODULE_2__["surveyLocalization"].getString("removePanel")); }, set: function (val) { this.setLocalizableStringText("panelRemoveText", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "locPanelRemoveText", { get: function () { return this.getLocalizableString("panelRemoveText"); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "isProgressTopShowing", { /** * Returns true when the renderMode equals to "progressTop" or "progressTopBottom" */ get: function () { return this.renderMode === "progressTop" || this.renderMode === "progressTopBottom"; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "isProgressBottomShowing", { /** * Returns true when the renderMode equals to "progressBottom" or "progressTopBottom" */ get: function () { return this.renderMode === "progressBottom" || this.renderMode === "progressTopBottom"; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "isPrevButtonShowing", { /** * Returns true when currentIndex is more than 0. * @see currenIndex * @see currenPanel */ get: function () { return this.currentIndex > 0; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "isNextButtonShowing", { /** * Returns true when currentIndex is more than or equal 0 and less than panelCount - 1. * @see currenIndex * @see currenPanel * @see panelCount */ get: function () { return this.currentIndex >= 0 && this.currentIndex < this.panelCount - 1; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "isRangeShowing", { /** * Returns true when showRangeInProgress equals to true, renderMode doesn't equal to "list" and panelCount is >= 2. */ get: function () { return (this.showRangeInProgress && this.currentIndex >= 0 && this.panelCount > 1); }, enumerable: false, configurable: true }); QuestionPanelDynamicModel.prototype.getElementsInDesign = function (includeHidden) { if (includeHidden === void 0) { includeHidden = false; } return includeHidden ? [this.template] : this.templateElements; }; QuestionPanelDynamicModel.prototype.prepareValueForPanelCreating = function () { this.addingNewPanelsValue = this.value; this.isAddingNewPanels = true; this.isNewPanelsValueChanged = false; }; QuestionPanelDynamicModel.prototype.setValueAfterPanelsCreating = function () { this.isAddingNewPanels = false; if (this.isNewPanelsValueChanged) { this.isValueChangingInternally = true; this.value = this.addingNewPanelsValue; this.isValueChangingInternally = false; } }; QuestionPanelDynamicModel.prototype.getValueCore = function () { return this.isAddingNewPanels ? this.addingNewPanelsValue : _super.prototype.getValueCore.call(this); }; QuestionPanelDynamicModel.prototype.setValueCore = function (newValue) { if (this.isAddingNewPanels) { this.isNewPanelsValueChanged = true; this.addingNewPanelsValue = newValue; } else { _super.prototype.setValueCore.call(this, newValue); } }; Object.defineProperty(QuestionPanelDynamicModel.prototype, "panelCount", { /** * Use this property to get/set the number of dynamic panels. * @see template * @see minPanelCount * @see maxPanelCount * @see addPanel * @see removePanel * @see removePanelUI */ get: function () { return this.isLoadingFromJson || this.isDesignMode ? this.loadingPanelCount : this.panels.length; }, set: function (val) { if (val < 0) return; if (this.isLoadingFromJson || this.isDesignMode) { this.loadingPanelCount = val; return; } if (val == this.panels.length || this.isDesignMode) return; this.updateBindings("panelCount", val); this.prepareValueForPanelCreating(); for (var i = this.panelCount; i < val; i++) { var panel = this.createNewPanel(); this.panels.push(panel); if (this.renderMode == "list" && this.panelsState != "default") { if (this.panelsState === "expand") { panel.expand(); } else { if (!!panel.title) { panel.collapse(); } } } } if (val < this.panelCount) this.panels.splice(val, this.panelCount - val); this.setValueAfterPanelsCreating(); this.setValueBasedOnPanelCount(); this.reRunCondition(); this.fireCallback(this.panelCountChangedCallback); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "panelsState", { /** * Use this property to allow the end-user to collapse/expand the panels. It works only if the renderMode property equals to "list" and templateTitle property is not empty. The following values are available: *
default - the default value. User can't collapse/expand panels *
expanded - User can collapse/expand panels and all panels are expanded by default *
collapsed - User can collapse/expand panels and all panels are collapsed by default *
firstExpanded - User can collapse/expand panels. The first panel is expanded and others are collapsed * @see renderMode * @see templateTitle */ get: function () { return this.getPropertyValue("panelsState"); }, set: function (val) { this.setPropertyValue("panelsState", val); }, enumerable: false, configurable: true }); QuestionPanelDynamicModel.prototype.setTemplatePanelSurveyImpl = function () { this.template.setSurveyImpl(this.isDesignMode ? this.surveyImpl : new QuestionPanelDynamicTemplateSurveyImpl(this)); }; QuestionPanelDynamicModel.prototype.setPanelsSurveyImpl = function () { for (var i = 0; i < this.panels.length; i++) { var panel = this.panels[i]; if (panel == this.template) continue; panel.setSurveyImpl(panel.data); } }; QuestionPanelDynamicModel.prototype.setPanelsState = function () { if (this.isDesignMode || this.renderMode != "list" || !this.templateTitle) return; for (var i = 0; i < this.panels.length; i++) { var state = this.panelsState; if (state === "firstExpanded") { state = i === 0 ? "expanded" : "collapsed"; } this.panels[i].state = state; } }; QuestionPanelDynamicModel.prototype.setValueBasedOnPanelCount = function () { var value = this.value; if (!value || !Array.isArray(value)) value = []; if (value.length == this.panelCount) return; for (var i = value.length; i < this.panelCount; i++) value.push({}); if (value.length > this.panelCount) { value.splice(this.panelCount, value.length - this.panelCount); } this.isValueChangingInternally = true; this.value = value; this.isValueChangingInternally = false; }; Object.defineProperty(QuestionPanelDynamicModel.prototype, "minPanelCount", { /** * The minimum panel count. A user could not delete a panel if the panelCount equals to minPanelCount * @see panelCount * @see maxPanelCount */ get: function () { return this.getPropertyValue("minPanelCount"); }, set: function (val) { if (val < 0) val = 0; if (val == this.minPanelCount) return; this.setPropertyValue("minPanelCount", val); if (val > this.maxPanelCount) this.maxPanelCount = val; if (this.panelCount < val) this.panelCount = val; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "maxPanelCount", { /** * The maximum panel count. A user could not add a panel if the panelCount equals to maxPanelCount * @see panelCount * @see minPanelCount */ get: function () { return this.getPropertyValue("maxPanelCount"); }, set: function (val) { if (val <= 0) return; if (val > _settings__WEBPACK_IMPORTED_MODULE_8__["settings"].panelMaximumPanelCount) val = _settings__WEBPACK_IMPORTED_MODULE_8__["settings"].panelMaximumPanelCount; if (val == this.maxPanelCount) return; this.setPropertyValue("maxPanelCount", val); if (val < this.minPanelCount) this.minPanelCount = val; if (this.panelCount > val) this.panelCount = val; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "allowAddPanel", { /** * Set this property to false to hide the 'Add New' button * @see allowRemovePanel */ get: function () { return this.getPropertyValue("allowAddPanel"); }, set: function (val) { this.setPropertyValue("allowAddPanel", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "allowRemovePanel", { /** * Set this property to false to hide the 'Remove' button * @see allowAddPanel */ get: function () { return this.getPropertyValue("allowRemovePanel"); }, set: function (val) { this.setPropertyValue("allowRemovePanel", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "templateTitleLocation", { /** * Set this property different from "default" to set the specific question title location for the template questions. * @see SurveyModel.questionTitleLocation * @see PanelModelBase.questionTitleLocation */ get: function () { return this.getPropertyValue("templateTitleLocation"); }, set: function (value) { this.setPropertyValue("templateTitleLocation", value.toLowerCase()); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "showQuestionNumbers", { /** * Use this property to show/hide the numbers in titles in questions inside a dynamic panel. * By default the value is "off". You may set it to "onPanel" and the first question inside a dynamic panel will start with 1 or "onSurvey" to include nested questions in dymamic panels into global survey question numbering. */ get: function () { return this.getPropertyValue("showQuestionNumbers"); }, set: function (val) { this.setPropertyValue("showQuestionNumbers", val); if (!this.isLoadingFromJson && this.survey) { this.survey.questionVisibilityChanged(this, this.visible); } }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "panelRemoveButtonLocation", { /** * Use this property to change the location of the remove button relative to the panel. * By default the value is "bottom". You may set it to "right" and remove button will appear to the right of the panel. */ get: function () { return this.getPropertyValue("panelRemoveButtonLocation"); }, set: function (val) { this.setPropertyValue("panelRemoveButtonLocation", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "showRangeInProgress", { /** * Shows the range from 1 to panelCount when renderMode doesn't equal to "list". Set to false to hide this element. * @see panelCount * @see renderMode */ get: function () { return this.getPropertyValue("showRangeInProgress"); }, set: function (val) { this.setPropertyValue("showRangeInProgress", val); this.fireCallback(this.currentIndexChangedCallback); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "renderMode", { /** * By default the property equals to "list" and all dynamic panels are rendered one by one on the page. You may change it to: "progressTop", "progressBottom" or "progressTopBottom" to render only one dynamic panel at once. The progress and navigation elements can be rendred on top, bottom or both. */ get: function () { return this.getPropertyValue("renderMode"); }, set: function (val) { this.setPropertyValue("renderMode", val); this.fireCallback(this.renderModeChangedCallback); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "isRenderModeList", { /** * Returns true when renderMode equals to "list". * @see renderMode */ get: function () { return this.renderMode === "list"; }, enumerable: false, configurable: true }); QuestionPanelDynamicModel.prototype.setVisibleIndex = function (value) { if (!this.isVisible) return 0; var startIndex = this.showQuestionNumbers == "onSurvey" ? value : 0; for (var i = 0; i < this.panels.length; i++) { var counter = this.setPanelVisibleIndex(this.panels[i], startIndex, this.showQuestionNumbers != "off"); if (this.showQuestionNumbers == "onSurvey") { startIndex += counter; } } _super.prototype.setVisibleIndex.call(this, this.showQuestionNumbers != "onSurvey" ? value : -1); return this.showQuestionNumbers != "onSurvey" ? 1 : startIndex - value; }; QuestionPanelDynamicModel.prototype.setPanelVisibleIndex = function (panel, index, showIndex) { if (!showIndex) { panel.setVisibleIndex(-1); return 0; } return panel.setVisibleIndex(index); }; Object.defineProperty(QuestionPanelDynamicModel.prototype, "canAddPanel", { /** * Returns true when an end user may add a new panel. The question is not read only and panelCount less than maxPanelCount * @see isReadOnly * @see panelCount * @see maxPanelCount */ get: function () { if (this.survey && this.survey.isDesignMode) return false; return (this.allowAddPanel && !this.isReadOnly && this.panelCount < this.maxPanelCount); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "canRemovePanel", { /** * Returns true when an end user may remove a panel. The question is not read only and panelCount is more than minPanelCount * @see isReadOnly * @see panelCount * @see minPanelCount */ get: function () { if (this.survey && this.survey.isDesignMode) return false; return (this.allowRemovePanel && !this.isReadOnly && this.panelCount > this.minPanelCount); }, enumerable: false, configurable: true }); QuestionPanelDynamicModel.prototype.rebuildPanels = function () { var _a; if (this.isLoadingFromJson) return; this.prepareValueForPanelCreating(); var panels = []; if (this.isDesignMode) { new QuestionPanelDynamicItem(this, this.template); panels.push(this.template); } else { for (var i = 0; i < this.panelCount; i++) { panels.push(this.createNewPanel()); } } (_a = this.panels).splice.apply(_a, __spreadArray([0, this.panels.length], panels, false)); this.setValueAfterPanelsCreating(); this.setPanelsState(); this.reRunCondition(); this.fireCallback(this.panelCountChangedCallback); }; Object.defineProperty(QuestionPanelDynamicModel.prototype, "defaultPanelValue", { /** * If it is not empty, then this value is set to every new panel, including panels created initially, unless the defaultValue is not empty * @see defaultValue * @see defaultValueFromLastRow */ get: function () { return this.getPropertyValue("defaultPanelValue"); }, set: function (val) { this.setPropertyValue("defaultPanelValue", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "defaultValueFromLastPanel", { /** * Set it to true to copy the value into new added panel from the last panel. If defaultPanelValue is set and this property equals to true, * then the value for new added panel is merging. * @see defaultValue * @see defaultPanelValue */ get: function () { return this.getPropertyValue("defaultValueFromLastPanel", false); }, set: function (val) { this.setPropertyValue("defaultValueFromLastPanel", val); }, enumerable: false, configurable: true }); QuestionPanelDynamicModel.prototype.isDefaultValueEmpty = function () { return (_super.prototype.isDefaultValueEmpty.call(this) && this.isValueEmpty(this.defaultPanelValue)); }; QuestionPanelDynamicModel.prototype.setDefaultValue = function () { if (this.isValueEmpty(this.defaultPanelValue) || !this.isValueEmpty(this.defaultValue)) { _super.prototype.setDefaultValue.call(this); return; } if (!this.isEmpty() || this.panelCount == 0) return; var newValue = []; for (var i = 0; i < this.panelCount; i++) { newValue.push(this.defaultPanelValue); } this.value = newValue; }; QuestionPanelDynamicModel.prototype.isEmpty = function () { var val = this.value; if (!val || !Array.isArray(val)) return true; for (var i = 0; i < val.length; i++) { if (!this.isRowEmpty(val[i])) return false; } return true; }; QuestionPanelDynamicModel.prototype.getProgressInfo = function () { return _survey_element__WEBPACK_IMPORTED_MODULE_1__["SurveyElement"].getProgressInfoByElements(this.panels, this.isRequired); }; QuestionPanelDynamicModel.prototype.isRowEmpty = function (val) { for (var prop in val) { if (val.hasOwnProperty(prop)) return false; } return true; }; /** * Add a new dynamic panel based on the template Panel. It checks if canAddPanel returns true and then calls addPanel method. * @see template * @see panelCount * @see panels * @see canAddPanel */ QuestionPanelDynamicModel.prototype.addPanelUI = function () { if (!this.canAddPanel) return null; var newPanel = this.addPanel(); if (this.renderMode === "list" && this.panelsState !== "default") { newPanel.expand(); } return newPanel; }; /** * Add a new dynamic panel based on the template Panel. * @see template * @see panelCount * @see panels */ QuestionPanelDynamicModel.prototype.addPanel = function () { this.panelCount++; if (!this.isRenderModeList) { this.currentIndex = this.panelCount - 1; } var newValue = this.value; var hasModified = false; if (!this.isValueEmpty(this.defaultPanelValue)) { if (!!newValue && Array.isArray(newValue) && newValue.length == this.panelCount) { hasModified = true; this.copyValue(newValue[newValue.length - 1], this.defaultPanelValue); } } if (this.defaultValueFromLastPanel && !!newValue && Array.isArray(newValue) && newValue.length > 1 && newValue.length == this.panelCount) { hasModified = true; this.copyValue(newValue[newValue.length - 1], newValue[newValue.length - 2]); } if (hasModified) { this.value = newValue; } if (this.survey) this.survey.dynamicPanelAdded(this); return this.panels[this.panelCount - 1]; }; QuestionPanelDynamicModel.prototype.copyValue = function (src, dest) { for (var key in dest) { src[key] = dest[key]; } }; /** * Call removePanel function. Do nothing is canRemovePanel returns false. If confirmDelete set to true, it shows the confirmation dialog first. * @param value a panel or panel index * @see removePanel * @see confirmDelete * @see confirmDeleteText * @see canRemovePanel * */ QuestionPanelDynamicModel.prototype.removePanelUI = function (value) { if (!this.canRemovePanel) return; if (!this.confirmDelete || Object(_utils_utils__WEBPACK_IMPORTED_MODULE_9__["confirmAction"])(this.confirmDeleteText)) { this.removePanel(value); } }; /** * Goes to the next panel in the PanelDynamic * */ QuestionPanelDynamicModel.prototype.goToNextPanel = function () { if (this.renderMode !== "list" && this.currentPanel.hasErrors()) return; this.currentIndex++; }; /** * Goes to the previous panel in the PanelDynamic * */ QuestionPanelDynamicModel.prototype.goToPrevPanel = function () { this.currentIndex--; }; /** * Removes a dynamic panel from the panels array. * @param value a panel or panel index * @see panels * @see template */ QuestionPanelDynamicModel.prototype.removePanel = function (value) { var index = this.getPanelIndex(value); if (index < 0 || index >= this.panelCount) return; var panel = this.panels[index]; this.panels.splice(index, 1); this.updateBindings("panelCount", this.panelCount); var value = this.value; if (!value || !Array.isArray(value) || index >= value.length) return; this.isValueChangingInternally = true; value.splice(index, 1); this.value = value; this.fireCallback(this.panelCountChangedCallback); if (this.survey) this.survey.dynamicPanelRemoved(this, index, panel); this.isValueChangingInternally = false; }; QuestionPanelDynamicModel.prototype.getPanelIndex = function (val) { if (_helpers__WEBPACK_IMPORTED_MODULE_0__["Helpers"].isNumber(val)) return val; var items = this.items; for (var i = 0; i < this.panels.length; i++) { if (this.panels[i] === val || items[i] === val) return i; } return -1; }; QuestionPanelDynamicModel.prototype.locStrsChanged = function () { _super.prototype.locStrsChanged.call(this); var panels = this.panels; for (var i = 0; i < panels.length; i++) { panels[i].locStrsChanged(); } }; QuestionPanelDynamicModel.prototype.clearIncorrectValues = function () { for (var i = 0; i < this.panels.length; i++) { this.clearIncorrectValuesInPanel(i); } }; QuestionPanelDynamicModel.prototype.clearErrors = function () { _super.prototype.clearErrors.call(this); for (var i = 0; i < this.panels.length; i++) { this.panels[i].clearErrors(); } }; QuestionPanelDynamicModel.prototype.getQuestionFromArray = function (name, index) { if (index >= this.panelCount) return null; return this.panels[index].getQuestionByName(name); }; QuestionPanelDynamicModel.prototype.clearIncorrectValuesInPanel = function (index) { var panel = this.panels[index]; panel.clearIncorrectValues(); var val = this.value; var values = !!val && index < val.length ? val[index] : null; if (!values) return; var isChanged = false; for (var key in values) { if (this.getSharedQuestionFromArray(key, index)) continue; var q = panel.getQuestionByName(key); if (!!q) continue; if (this.iscorrectValueWithPostPrefix(panel, key, _settings__WEBPACK_IMPORTED_MODULE_8__["settings"].commentPrefix) || this.iscorrectValueWithPostPrefix(panel, key, _settings__WEBPACK_IMPORTED_MODULE_8__["settings"].matrixTotalValuePostFix)) continue; delete values[key]; isChanged = true; } if (isChanged) { val[index] = values; this.value = val; } }; QuestionPanelDynamicModel.prototype.iscorrectValueWithPostPrefix = function (panel, key, postPrefix) { if (key.indexOf(postPrefix) !== key.length - postPrefix.length) return false; return !!panel.getQuestionByName(key.substr(0, key.indexOf(postPrefix))); }; QuestionPanelDynamicModel.prototype.getSharedQuestionFromArray = function (name, panelIndex) { return !!this.survey && !!this.valueName ? (this.survey.getQuestionByValueNameFromArray(this.valueName, name, panelIndex)) : null; }; QuestionPanelDynamicModel.prototype.addConditionObjectsByContext = function (objects, context) { var hasContext = !!context ? this.template.questions.indexOf(context) > -1 : false; var prefixName = this.getValueName() + "[0]."; var prefixText = this.processedTitle + "[0]."; var panelObjs = new Array(); var questions = this.template.questions; for (var i = 0; i < questions.length; i++) { questions[i].addConditionObjectsByContext(panelObjs, context); } for (var i = 0; i < panelObjs.length; i++) { objects.push({ name: prefixName + panelObjs[i].name, text: prefixText + panelObjs[i].text, question: panelObjs[i].question, }); } if (hasContext) { for (var i = 0; i < panelObjs.length; i++) { if (panelObjs[i].question == context) continue; objects.push({ name: "panel." + panelObjs[i].name, text: "panel." + panelObjs[i].text, question: panelObjs[i].question, }); } } }; QuestionPanelDynamicModel.prototype.getConditionJson = function (operator, path) { if (operator === void 0) { operator = null; } if (path === void 0) { path = null; } if (!path) return _super.prototype.getConditionJson.call(this, operator, path); var questionName = path; var pos = path.indexOf("."); if (pos > -1) { questionName = path.substr(0, pos); path = path.substr(pos + 1); } var question = this.template.getQuestionByName(questionName); if (!question) return null; return question.getConditionJson(operator, path); }; QuestionPanelDynamicModel.prototype.onReadOnlyChanged = function () { var readOnly = this.isReadOnly; this.template.readOnly = readOnly; for (var i = 0; i < this.panels.length; i++) { this.panels[i].readOnly = readOnly; } _super.prototype.onReadOnlyChanged.call(this); }; QuestionPanelDynamicModel.prototype.onSurveyLoad = function () { this.template.readOnly = this.isReadOnly; this.template.onSurveyLoad(); if (this.loadingPanelCount > 0) { this.panelCount = this.loadingPanelCount; } if (this.isDesignMode) { this.rebuildPanels(); } this.setPanelsSurveyImpl(); this.setPanelsState(); this.assignOnPropertyChangedToTemplate(); _super.prototype.onSurveyLoad.call(this); }; QuestionPanelDynamicModel.prototype.onFirstRendering = function () { this.template.onFirstRendering(); for (var i = 0; i < this.panels.length; i++) { this.panels[i].onFirstRendering(); } _super.prototype.onFirstRendering.call(this); }; QuestionPanelDynamicModel.prototype.runCondition = function (values, properties) { _super.prototype.runCondition.call(this, values, properties); this.runPanelsCondition(values, properties); }; QuestionPanelDynamicModel.prototype.reRunCondition = function () { if (!this.data) return; this.runCondition(this.getDataFilteredValues(), this.getDataFilteredProperties()); }; QuestionPanelDynamicModel.prototype.runPanelsCondition = function (values, properties) { var cachedValues = {}; if (values && values instanceof Object) { cachedValues = JSON.parse(JSON.stringify(values)); } for (var i = 0; i < this.panels.length; i++) { var panelValues = this.getPanelItemData(this.panels[i].data); //Should be unique for every panel due async expression support var newValues = _helpers__WEBPACK_IMPORTED_MODULE_0__["Helpers"].createCopy(cachedValues); newValues[QuestionPanelDynamicItem.ItemVariableName.toLowerCase()] = panelValues; newValues[QuestionPanelDynamicItem.IndexVariableName.toLowerCase()] = i; this.panels[i].runCondition(newValues, properties); } }; QuestionPanelDynamicModel.prototype.onAnyValueChanged = function (name) { _super.prototype.onAnyValueChanged.call(this, name); for (var i = 0; i < this.panels.length; i++) { this.panels[i].onAnyValueChanged(name); this.panels[i].onAnyValueChanged(QuestionPanelDynamicItem.ItemVariableName); } }; QuestionPanelDynamicModel.prototype.hasKeysDuplicated = function (fireCallback, rec) { if (rec === void 0) { rec = null; } var keyValues = []; var res; for (var i = 0; i < this.panels.length; i++) { res = this.isValueDuplicated(this.panels[i], keyValues, rec, fireCallback) || res; } return res; }; QuestionPanelDynamicModel.prototype.updatePanelsContainsErrors = function () { var question = this.changingValueQuestion; var parent = question.parent; while (!!parent) { parent.updateContainsErrors(); parent = parent.parent; } this.updateContainsErrors(); }; QuestionPanelDynamicModel.prototype.hasErrors = function (fireCallback, rec) { if (fireCallback === void 0) { fireCallback = true; } if (rec === void 0) { rec = null; } if (this.isValueChangingInternally) return false; var res = false; if (!!this.changingValueQuestion) { var res = this.changingValueQuestion.hasErrors(fireCallback, rec); res = this.hasKeysDuplicated(fireCallback, rec) || res; this.updatePanelsContainsErrors(); return res; } else { var errosInPanels = this.hasErrorInPanels(fireCallback, rec); return _super.prototype.hasErrors.call(this, fireCallback) || errosInPanels; } }; QuestionPanelDynamicModel.prototype.getContainsErrors = function () { var res = _super.prototype.getContainsErrors.call(this); if (res) return res; var panels = this.panels; for (var i = 0; i < panels.length; i++) { if (panels[i].containsErrors) return true; } return false; }; QuestionPanelDynamicModel.prototype.getIsAnswered = function () { if (!_super.prototype.getIsAnswered.call(this)) return false; var panels = this.panels; for (var i = 0; i < panels.length; i++) { var visibleQuestions = []; panels[i].addQuestionsToList(visibleQuestions, true); for (var j = 0; j < visibleQuestions.length; j++) { if (!visibleQuestions[j].isAnswered) return false; } } return true; }; QuestionPanelDynamicModel.prototype.clearValueIfInvisible = function () { for (var i = 0; i < this.panels.length; i++) { var questions = this.panels[i].questions; for (var j = 0; j < questions.length; j++) { questions[j].clearValueIfInvisible(); } } _super.prototype.clearValueIfInvisible.call(this); }; QuestionPanelDynamicModel.prototype.getIsRunningValidators = function () { if (_super.prototype.getIsRunningValidators.call(this)) return true; for (var i = 0; i < this.panels.length; i++) { var questions = this.panels[i].questions; for (var j = 0; j < questions.length; j++) { if (questions[j].isRunningValidators) return true; } } return false; }; QuestionPanelDynamicModel.prototype.getAllErrors = function () { var result = _super.prototype.getAllErrors.call(this); for (var i = 0; i < this.panels.length; i++) { var questions = this.panels[i].questions; for (var j = 0; j < questions.length; j++) { var errors = questions[j].getAllErrors(); if (errors && errors.length > 0) { result = result.concat(errors); } } } return result; }; QuestionPanelDynamicModel.prototype.getDisplayValueCore = function (keysAsText, value) { var values = this.getUnbindValue(value); if (!values || !Array.isArray(values)) return values; for (var i = 0; i < this.panels.length && i < values.length; i++) { var val = values[i]; if (!val) continue; values[i] = this.getPanelDisplayValue(i, val, keysAsText); } return values; }; QuestionPanelDynamicModel.prototype.getPanelDisplayValue = function (panelIndex, val, keysAsText) { if (!val) return val; var panel = this.panels[panelIndex]; var keys = Object.keys(val); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var question = panel.getQuestionByValueName(key); if (!question) { question = this.getSharedQuestionFromArray(key, panelIndex); } if (!!question) { var qValue = question.getDisplayValue(keysAsText, val[key]); val[key] = qValue; if (keysAsText && !!question.title && question.title !== key) { val[question.title] = qValue; delete val[key]; } } } return val; }; QuestionPanelDynamicModel.prototype.hasErrorInPanels = function (fireCallback, rec) { var res = false; var panels = this.panels; var keyValues = []; for (var i = 0; i < panels.length; i++) { this.setOnCompleteAsyncInPanel(panels[i]); } for (var i = 0; i < panels.length; i++) { var pnlError = panels[i].hasErrors(fireCallback, !!rec && rec.focuseOnFirstError, rec); pnlError = this.isValueDuplicated(panels[i], keyValues, rec) || pnlError; if (!this.isRenderModeList && pnlError && !res) { this.currentIndex = i; } res = pnlError || res; } return res; }; QuestionPanelDynamicModel.prototype.setOnCompleteAsyncInPanel = function (panel) { var _this = this; var questions = panel.questions; for (var i = 0; i < questions.length; i++) { questions[i].onCompletedAsyncValidators = function (hasErrors) { _this.raiseOnCompletedAsyncValidators(); }; } }; QuestionPanelDynamicModel.prototype.isValueDuplicated = function (panel, keyValues, rec, fireCallback) { if (!this.keyName) return false; var question = panel.getQuestionByValueName(this.keyName); if (!question || question.isEmpty()) return false; var value = question.value; if (!!this.changingValueQuestion && question != this.changingValueQuestion) { question.hasErrors(fireCallback, rec); } for (var i = 0; i < keyValues.length; i++) { if (value == keyValues[i]) { question.addError(new _error__WEBPACK_IMPORTED_MODULE_7__["KeyDuplicationError"](this.keyDuplicationError, this)); if (!!rec && !rec.firstErrorQuestion) { rec.firstErrorQuestion = question; } return true; } } keyValues.push(value); return false; }; QuestionPanelDynamicModel.prototype.createNewPanel = function () { var panel = this.createAndSetupNewPanelObject(); var json = this.template.toJSON(); new _jsonobject__WEBPACK_IMPORTED_MODULE_5__["JsonObject"]().toObject(json, panel); panel.renderWidth = "100%"; panel.updateCustomWidgets(); new QuestionPanelDynamicItem(this, panel); panel.onFirstRendering(); var questions = panel.questions; for (var i = 0; i < questions.length; i++) { questions[i].setParentQuestion(this); } panel.locStrsChanged(); return panel; }; QuestionPanelDynamicModel.prototype.createAndSetupNewPanelObject = function () { var panel = this.createNewPanelObject(); panel.isInteractiveDesignElement = false; var self = this; panel.onGetQuestionTitleLocation = function () { return self.getTemplateQuestionTitleLocation(); }; return panel; }; QuestionPanelDynamicModel.prototype.getTemplateQuestionTitleLocation = function () { return this.templateTitleLocation != "default" ? this.templateTitleLocation : this.getTitleLocationCore(); }; QuestionPanelDynamicModel.prototype.createNewPanelObject = function () { return _jsonobject__WEBPACK_IMPORTED_MODULE_5__["Serializer"].createClass("panel"); }; QuestionPanelDynamicModel.prototype.setPanelCountBasedOnValue = function () { if (this.isValueChangingInternally || this.isDesignMode) return; var val = this.value; var newPanelCount = val && Array.isArray(val) ? val.length : 0; if (newPanelCount == 0 && this.loadingPanelCount > 0) { newPanelCount = this.loadingPanelCount; } this.panelCount = newPanelCount; }; QuestionPanelDynamicModel.prototype.setQuestionValue = function (newValue) { _super.prototype.setQuestionValue.call(this, newValue, false); this.setPanelCountBasedOnValue(); for (var i = 0; i < this.panels.length; i++) { this.panelUpdateValueFromSurvey(this.panels[i]); } this.updateIsAnswered(); }; QuestionPanelDynamicModel.prototype.onSurveyValueChanged = function (newValue) { _super.prototype.onSurveyValueChanged.call(this, newValue); for (var i = 0; i < this.panels.length; i++) { this.panelSurveyValueChanged(this.panels[i]); } if (newValue === undefined) { this.setValueBasedOnPanelCount(); } }; QuestionPanelDynamicModel.prototype.panelUpdateValueFromSurvey = function (panel) { var questions = panel.questions; var values = this.getPanelItemData(panel.data); for (var i = 0; i < questions.length; i++) { var q = questions[i]; q.updateValueFromSurvey(values[q.getValueName()]); q.updateCommentFromSurvey(values[q.getValueName() + _settings__WEBPACK_IMPORTED_MODULE_8__["settings"].commentPrefix]); } }; QuestionPanelDynamicModel.prototype.panelSurveyValueChanged = function (panel) { var questions = panel.questions; var values = this.getPanelItemData(panel.data); for (var i = 0; i < questions.length; i++) { var q = questions[i]; q.onSurveyValueChanged(values[q.getValueName()]); } }; QuestionPanelDynamicModel.prototype.onSetData = function () { _super.prototype.onSetData.call(this); if (this.isDesignMode) { this.setTemplatePanelSurveyImpl(); this.rebuildPanels(); } }; //IQuestionPanelDynamicData QuestionPanelDynamicModel.prototype.getItemIndex = function (item) { var res = this.items.indexOf(item); return res > -1 ? res : this.items.length; }; QuestionPanelDynamicModel.prototype.getPanelItemData = function (item) { var items = this.items; var index = items.indexOf(item); var qValue = this.value; if (index < 0 && Array.isArray(qValue) && qValue.length > items.length) { index = items.length; } if (index < 0) return {}; if (!qValue || !Array.isArray(qValue) || qValue.length <= index) return {}; return qValue[index]; }; QuestionPanelDynamicModel.prototype.setPanelItemData = function (item, name, val) { if (this.isSetPanelItemData && this.isSetPanelItemData.indexOf(name) > -1) return; if (!this.isSetPanelItemData) this.isSetPanelItemData = []; this.isSetPanelItemData.push(name); var items = this.items; var index = items.indexOf(item); if (index < 0) index = items.length; var qValue = this.getUnbindValue(this.value); if (!qValue || !Array.isArray(qValue)) { qValue = []; } if (qValue.length <= index) { for (var i = qValue.length; i <= index; i++) { qValue.push({}); } } if (!qValue[index]) qValue[index] = {}; if (!this.isValueEmpty(val)) { qValue[index][name] = val; } else { delete qValue[index][name]; } if (index >= 0 && index < this.panels.length) { this.changingValueQuestion = this.panels[index].getQuestionByValueName(name); } this.value = qValue; this.changingValueQuestion = null; if (this.survey) { var options = { question: this, panel: item.panel, name: name, itemIndex: index, itemValue: qValue[index], value: val, }; this.survey.dynamicPanelItemValueChanged(this, options); } var index = this.isSetPanelItemData.indexOf(name); if (index > -1) { this.isSetPanelItemData.splice(index, 1); } }; QuestionPanelDynamicModel.prototype.getRootData = function () { return this.data; }; QuestionPanelDynamicModel.prototype.getPlainData = function (options) { if (options === void 0) { options = { includeEmpty: true, }; } var questionPlainData = _super.prototype.getPlainData.call(this, options); if (!!questionPlainData) { questionPlainData.isNode = true; questionPlainData.data = this.panels.map(function (panel, index) { var panelDataItem = { name: panel.name || index, title: panel.title || "Panel", value: panel.getValue(), displayValue: panel.getValue(), getString: function (val) { return typeof val === "object" ? JSON.stringify(val) : val; }, isNode: true, data: panel.questions .map(function (question) { return question.getPlainData(options); }) .filter(function (d) { return !!d; }), }; (options.calculations || []).forEach(function (calculation) { panelDataItem[calculation.propertyName] = panel[calculation.propertyName]; }); return panelDataItem; }); } return questionPlainData; }; QuestionPanelDynamicModel.prototype.updateElementCss = function (reNew) { _super.prototype.updateElementCss.call(this, reNew); for (var i = 0; i < this.panels.length; i++) { var el = this.panels[i]; el.updateElementCss(reNew); } }; Object.defineProperty(QuestionPanelDynamicModel.prototype, "progressText", { get: function () { var rangeMax = this.panelCount; return _surveyStrings__WEBPACK_IMPORTED_MODULE_2__["surveyLocalization"] .getString("panelDynamicProgressText")["format"](this.currentIndex + 1, rangeMax); }, enumerable: false, configurable: true }); QuestionPanelDynamicModel.prototype.getPanelWrapperCss = function () { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_10__["CssClassBuilder"]() .append(this.cssClasses.panelWrapper) .append(this.cssClasses.panelWrapperInRow, this.panelRemoveButtonLocation === "right") .toString(); }; QuestionPanelDynamicModel.prototype.getPanelRemoveButtonCss = function () { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_10__["CssClassBuilder"]() .append(this.cssClasses.button) .append(this.cssClasses.buttonRemove) .append(this.cssClasses.buttonRemoveRight, this.panelRemoveButtonLocation === "right") .toString(); }; QuestionPanelDynamicModel.prototype.getAddButtonCss = function () { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_10__["CssClassBuilder"]() .append(this.cssClasses.button) .append(this.cssClasses.buttonAdd) .append(this.cssClasses.buttonAdd + "--list-mode", this.renderMode === "list") .toString(); }; QuestionPanelDynamicModel.prototype.getPrevButtonCss = function () { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_10__["CssClassBuilder"]() .append(this.cssClasses.buttonPrev) .append(this.cssClasses.buttonPrev + "--disabled", !this.isPrevButtonShowing) .toString(); }; QuestionPanelDynamicModel.prototype.getNextButtonCss = function () { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_10__["CssClassBuilder"]() .append(this.cssClasses.buttonNext) .append(this.cssClasses.buttonNext + "--disabled", !this.isNextButtonShowing) .toString(); }; return QuestionPanelDynamicModel; }(_question__WEBPACK_IMPORTED_MODULE_4__["Question"])); _jsonobject__WEBPACK_IMPORTED_MODULE_5__["Serializer"].addClass("paneldynamic", [ { name: "templateElements", alternativeName: "questions", visible: false, isLightSerializable: false, }, { name: "templateTitle:text", serializationProperty: "locTemplateTitle" }, { name: "templateDescription:text", serializationProperty: "locTemplateDescription", }, { name: "allowAddPanel:boolean", default: true }, { name: "allowRemovePanel:boolean", default: true }, { name: "panelCount:number", isBindable: true, default: 0, choices: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], }, { name: "minPanelCount:number", default: 0, minValue: 0 }, { name: "maxPanelCount:number", default: _settings__WEBPACK_IMPORTED_MODULE_8__["settings"].panelMaximumPanelCount, }, "defaultPanelValue:panelvalue", "defaultValueFromLastPanel:boolean", { name: "panelsState", default: "default", choices: ["default", "collapsed", "expanded", "firstExpanded"], }, { name: "keyName" }, { name: "keyDuplicationError", serializationProperty: "locKeyDuplicationError", }, { name: "confirmDelete:boolean" }, { name: "confirmDeleteText", serializationProperty: "locConfirmDeleteText", }, { name: "panelAddText", serializationProperty: "locPanelAddText" }, { name: "panelRemoveText", serializationProperty: "locPanelRemoveText" }, { name: "panelPrevText", serializationProperty: "locPanelPrevText" }, { name: "panelNextText", serializationProperty: "locPanelNextText" }, { name: "showQuestionNumbers", default: "off", choices: ["off", "onPanel", "onSurvey"], }, { name: "showRangeInProgress:boolean", default: true }, { name: "renderMode", default: "list", choices: ["list", "progressTop", "progressBottom", "progressTopBottom"], }, { name: "templateTitleLocation", default: "default", choices: ["default", "top", "bottom", "left"], }, { name: "panelRemoveButtonLocation", default: "bottom", choices: ["bottom", "right"], }, ], function () { return new QuestionPanelDynamicModel(""); }, "question"); _questionfactory__WEBPACK_IMPORTED_MODULE_6__["QuestionFactory"].Instance.registerQuestion("paneldynamic", function (name) { return new QuestionPanelDynamicModel(name); }); /***/ }), /***/ "./src/question_radiogroup.ts": /*!************************************!*\ !*** ./src/question_radiogroup.ts ***! \************************************/ /*! exports provided: QuestionRadiogroupModel */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionRadiogroupModel", function() { return QuestionRadiogroupModel; }); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./questionfactory */ "./src/questionfactory.ts"); /* harmony import */ var _question_baseselect__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./question_baseselect */ "./src/question_baseselect.ts"); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./surveyStrings */ "./src/surveyStrings.ts"); /* harmony import */ var _itemvalue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./itemvalue */ "./src/itemvalue.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); /** * A Model for a radiogroup question. */ var QuestionRadiogroupModel = /** @class */ (function (_super) { __extends(QuestionRadiogroupModel, _super); function QuestionRadiogroupModel(name) { return _super.call(this, name) || this; } QuestionRadiogroupModel.prototype.getType = function () { return "radiogroup"; }; QuestionRadiogroupModel.prototype.getFirstInputElementId = function () { return this.inputId + "_0"; }; Object.defineProperty(QuestionRadiogroupModel.prototype, "selectedItem", { /** * Return the selected item in the radio group. Returns null if the value is empty */ get: function () { if (this.isEmpty()) return null; return _itemvalue__WEBPACK_IMPORTED_MODULE_4__["ItemValue"].getItemByValue(this.visibleChoices, this.value); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionRadiogroupModel.prototype, "showClearButton", { /** * Show "clear button" flag. */ get: function () { return this.getPropertyValue("showClearButton"); }, set: function (val) { this.setPropertyValue("showClearButton", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionRadiogroupModel.prototype, "canShowClearButton", { get: function () { return this.showClearButton && !this.isReadOnly; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionRadiogroupModel.prototype, "clearButtonCaption", { get: function () { return _surveyStrings__WEBPACK_IMPORTED_MODULE_3__["surveyLocalization"].getString("clearCaption"); }, enumerable: false, configurable: true }); QuestionRadiogroupModel.prototype.supportGoNextPageAutomatic = function () { return true; }; Object.defineProperty(QuestionRadiogroupModel.prototype, "ariaRole", { get: function () { return "radiogroup"; }, enumerable: false, configurable: true }); return QuestionRadiogroupModel; }(_question_baseselect__WEBPACK_IMPORTED_MODULE_2__["QuestionCheckboxBase"])); _jsonobject__WEBPACK_IMPORTED_MODULE_0__["Serializer"].addClass("radiogroup", [{ name: "showClearButton:boolean", default: false }], function () { return new QuestionRadiogroupModel(""); }, "checkboxbase"); _questionfactory__WEBPACK_IMPORTED_MODULE_1__["QuestionFactory"].Instance.registerQuestion("radiogroup", function (name) { var q = new QuestionRadiogroupModel(name); q.choices = _questionfactory__WEBPACK_IMPORTED_MODULE_1__["QuestionFactory"].DefaultChoices; return q; }); /***/ }), /***/ "./src/question_ranking.ts": /*!*********************************!*\ !*** ./src/question_ranking.ts ***! \*********************************/ /*! exports provided: QuestionRankingModel */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionRankingModel", function() { return QuestionRankingModel; }); /* harmony import */ var sortablejs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! sortablejs */ "./node_modules/sortablejs/modular/sortable.esm.js"); /* harmony import */ var _dragdrop_ranking_choices__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./dragdrop/ranking-choices */ "./src/dragdrop/ranking-choices.ts"); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./questionfactory */ "./src/questionfactory.ts"); /* harmony import */ var _question_checkbox__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./question_checkbox */ "./src/question_checkbox.ts"); /* harmony import */ var _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils/cssClassBuilder */ "./src/utils/cssClassBuilder.ts"); /* harmony import */ var _utils_is_mobile__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/is-mobile */ "./src/utils/is-mobile.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var Sortable = sortablejs__WEBPACK_IMPORTED_MODULE_0__["default"]; /** * A Model for a ranking question */ var QuestionRankingModel = /** @class */ (function (_super) { __extends(QuestionRankingModel, _super); function QuestionRankingModel(name) { var _this = _super.call(this, name) || this; _this.domNode = null; _this.sortableInst = null; _this.setSurveyImpl = function (value) { _super.prototype.setSurveyImpl.call(_this, value); _this.updateRankingChoices(); }; _this.onVisibleChoicesChanged = function () { _super.prototype.onVisibleChoicesChanged.call(_this); // ranking question with only one choice doesn't make sense if (_this.visibleChoices.length === 1) { _this.value = []; _this.updateRankingChoices(); return; } if (_this.isEmpty()) { _this.updateRankingChoices(); return; } if (_this.visibleChoices.length > _this.value.length) _this.addToValueByVisibleChoices(); if (_this.visibleChoices.length < _this.value.length) _this.removeFromValueByVisibleChoices(); _this.updateRankingChoices(); }; _this.localeChanged = function () { _super.prototype.localeChanged.call(_this); _this.updateRankingChoices(); }; _this.handlePointerDown = function (event, choice, node) { if (!_this.fallbackToSortableJS && !_this.survey.isDesignMode) { _this.dragDropRankingChoices.startDrag(event, choice, _this, node); } }; _this.handleKeydown = function (event, choice) { var key = event.key; var index = _this.rankingChoices.indexOf(choice); if (key === "ArrowUp" && index) { _this.handleArrowUp(index, choice); } if (key === "ArrowDown" && index !== _this.rankingChoices.length - 1) { _this.handleArrowDown(index, choice); } }; _this.handleArrowUp = function (index, choice) { var choices = _this.rankingChoices; choices.splice(index, 1); choices.splice(index - 1, 0, choice); _this.setValue(); setTimeout(function () { _this.focusItem(index - 1); }, 1); }; _this.handleArrowDown = function (index, choice) { var choices = _this.rankingChoices; choices.splice(index, 1); choices.splice(index + 1, 0, choice); _this.setValue(); setTimeout(function () { _this.focusItem(index + 1); }, 1); }; _this.focusItem = function (index) { var itemsNodes = _this.domNode.querySelectorAll("." + _this.cssClasses.item); itemsNodes[index].focus(); }; _this.setValue = function () { var value = []; _this.rankingChoices.forEach(function (choice) { value.push(choice.value); }); _this.value = value; }; _this.setValueFromUI = function () { var value = []; var textNodes = _this.domNode.querySelectorAll("." + _this.cssClasses.controlLabel); textNodes.forEach(function (textNode, index) { var innerText = textNode.innerText; _this.visibleChoices.forEach(function (visibleChoice) { if (innerText === visibleChoice.text) { value.push(visibleChoice.value); } }); }); _this.value = value; }; _this.syncNumbers = function () { if (!_this.domNode) return; var selector = "." + _this.cssClasses.item + ":not(." + _this.cssClasses.itemDragMod + ")" + " ." + _this.cssClasses.itemIndex; var indexNodes = _this.domNode.querySelectorAll(selector); indexNodes.forEach(function (indexNode, index) { indexNode.innerText = _this.getNumberByIndex(index); }); }; _this.setGhostText = function (text) { var indexNodes = _this.domNode.querySelectorAll("." + _this.cssClasses.itemIndex); var ghostNode = indexNodes[indexNodes.length - 1]; ghostNode.innerText = text; }; _this.createNewArray("rankingChoices"); return _this; } QuestionRankingModel.prototype.getType = function () { return "ranking"; }; Object.defineProperty(QuestionRankingModel.prototype, "rootClass", { get: function () { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_5__["CssClassBuilder"]() .append(this.cssClasses.root) .append(this.cssClasses.rootMobileMod, _utils_is_mobile__WEBPACK_IMPORTED_MODULE_6__["IsMobile"]) .toString(); }, enumerable: false, configurable: true }); QuestionRankingModel.prototype.getItemClassCore = function (item, options) { var itemIndex = this.rankingChoices.indexOf(item); var dropTargetIndex = this.rankingChoices.indexOf(this.currentDropTarget); return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_5__["CssClassBuilder"]() .append(_super.prototype.getItemClassCore.call(this, item, options)) .append(this.cssClasses.itemGhostMod, this.currentDropTarget === item) .append("sv-dragdrop-movedown", itemIndex === dropTargetIndex + 1 && this.dropTargetNodeMove === "down") .append("sv-dragdrop-moveup", itemIndex === dropTargetIndex - 1 && this.dropTargetNodeMove === "up") .toString(); }; QuestionRankingModel.prototype.isItemCurrentDropTarget = function (item) { if (this.fallbackToSortableJS) return false; return this.dragDropRankingChoices.dropTarget === item; }; Object.defineProperty(QuestionRankingModel.prototype, "ghostPositionCssClass", { get: function () { if (this.ghostPosition === "top") return this.cssClasses.dragDropGhostPositionTop; if (this.ghostPosition === "bottom") return this.cssClasses.dragDropGhostPositionBottom; return ""; }, enumerable: false, configurable: true }); QuestionRankingModel.prototype.getNumberByIndex = function (index) { return this.isEmpty() ? "\u2013" : index + 1 + ""; }; QuestionRankingModel.prototype.onSurveyValueChanged = function (newValue) { _super.prototype.onSurveyValueChanged.call(this, newValue); if (this.isLoadingFromJson) return; this.updateRankingChoices(); }; QuestionRankingModel.prototype.addToValueByVisibleChoices = function () { var newValue = this.value.slice(); this.visibleChoices.forEach(function (choice) { if (newValue.indexOf(choice.value) === -1) { newValue.push(choice.value); } }); this.value = newValue; }; QuestionRankingModel.prototype.removeFromValueByVisibleChoices = function () { var _this = this; var newValue = this.value.slice(); this.value.forEach(function (valueItem, index) { var isValueItemToRemove = true; _this.visibleChoices.forEach(function (choice) { if (choice.value === valueItem) isValueItemToRemove = false; }); isValueItemToRemove && newValue.splice(index, 1); }); this.value = newValue; }; Object.defineProperty(QuestionRankingModel.prototype, "rankingChoices", { get: function () { return this.getPropertyValue("rankingChoices", []); }, enumerable: false, configurable: true }); QuestionRankingModel.prototype.updateRankingChoices = function () { var _this = this; var newRankingChoices = []; // ranking question with only one choice doesn't make sense if (this.visibleChoices.length === 1) { this.setPropertyValue("rankingChoices", newRankingChoices); return; } if (this.isEmpty()) { this.setPropertyValue("rankingChoices", this.visibleChoices); return; } this.value.forEach(function (valueItem) { _this.visibleChoices.forEach(function (choice) { if (choice.value === valueItem) newRankingChoices.push(choice); }); }); this.setPropertyValue("rankingChoices", newRankingChoices); }; QuestionRankingModel.prototype.endLoadingFromJson = function () { _super.prototype.endLoadingFromJson.call(this); if (!this.fallbackToSortableJS) { this.dragDropRankingChoices = new _dragdrop_ranking_choices__WEBPACK_IMPORTED_MODULE_1__["DragDropRankingChoices"](this.survey); } }; //cross framework initialization QuestionRankingModel.prototype.afterRenderQuestionElement = function (el) { this.domNode = el; if (!!el && this.fallbackToSortableJS) { this.initSortable(el); } _super.prototype.afterRenderQuestionElement.call(this, el); }; //cross framework destroy QuestionRankingModel.prototype.beforeDestroyQuestionElement = function (el) { if (this.sortableInst) this.sortableInst.destroy(); _super.prototype.beforeDestroyQuestionElement.call(this, el); }; QuestionRankingModel.prototype.supportSelectAll = function () { return false; }; QuestionRankingModel.prototype.supportOther = function () { return false; }; QuestionRankingModel.prototype.supportNone = function () { return false; }; QuestionRankingModel.prototype.initSortable = function (domNode) { if (!domNode) return; var self = this; if (this.isReadOnly) return; if (this.isDesignMode) return; self.sortableInst = new Sortable(domNode, { animation: 100, forceFallback: true, delay: 200, delayOnTouchOnly: true, handle: _utils_is_mobile__WEBPACK_IMPORTED_MODULE_6__["IsMobile"] ? "." + self.cssClasses.itemIconContainer : "." + self.cssClasses.itemContent, ghostClass: self.cssClasses.itemGhostMod, dragClass: self.cssClasses.itemDragMod, onStart: function (evt) { Sortable.ghost.style.opacity = 1; domNode.className += " " + self.cssClasses.rootDragMod; if (self.isEmpty()) { self.setGhostText(evt.oldIndex + 1); } }, onEnd: function () { domNode.className = domNode.className.replace(" " + self.cssClasses.rootDragMod, ""); self.setValueFromUI(); }, onChange: function (evt) { if (!self.isEmpty()) self.syncNumbers(); self.setGhostText(evt.newIndex + 1); }, }); }; Object.defineProperty(QuestionRankingModel.prototype, "fallbackToSortableJS", { get: function () { return this.getPropertyValue("fallbackToSortableJS"); }, set: function (val) { this.setPropertyValue("fallbackToSortableJS", val); }, enumerable: false, configurable: true }); QuestionRankingModel.prototype.getIconHoverCss = function () { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_5__["CssClassBuilder"]() .append(this.cssClasses.itemIcon) .append(this.cssClasses.itemIconHoverMod) .toString(); }; QuestionRankingModel.prototype.getIconFocusCss = function () { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_5__["CssClassBuilder"]() .append(this.cssClasses.itemIcon) .append(this.cssClasses.itemIconFocusMod) .toString(); }; __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_2__["property"])({ defaultValue: null }) ], QuestionRankingModel.prototype, "currentDropTarget", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_2__["property"])({ defaultValue: null }) ], QuestionRankingModel.prototype, "dropTargetNodeMove", void 0); return QuestionRankingModel; }(_question_checkbox__WEBPACK_IMPORTED_MODULE_4__["QuestionCheckboxModel"])); _jsonobject__WEBPACK_IMPORTED_MODULE_2__["Serializer"].addClass("ranking", [ { name: "hasOther", visible: false, isSerializable: false }, { name: "otherText", visible: false, isSerializable: false }, { name: "otherErrorText", visible: false, isSerializable: false }, { name: "storeOthersAsComment", visible: false, isSerializable: false }, { name: "hasNone", visible: false, isSerializable: false }, { name: "noneText", visible: false, isSerializable: false }, { name: "hasSelectAll", visible: false, isSerializable: false }, { name: "selectAllText", visible: false, isSerializable: false }, { name: "colCount:number", visible: false, isSerializable: false }, { name: "maxSelectedChoices", visible: false, isSerializable: false }, { name: "fallbackToSortableJS", default: false, visible: false, isSerializable: false, }, ], function () { return new QuestionRankingModel(""); }, "checkbox"); _questionfactory__WEBPACK_IMPORTED_MODULE_3__["QuestionFactory"].Instance.registerQuestion("ranking", function (name) { var q = new QuestionRankingModel(name); q.choices = _questionfactory__WEBPACK_IMPORTED_MODULE_3__["QuestionFactory"].DefaultChoices; return q; }); /***/ }), /***/ "./src/question_rating.ts": /*!********************************!*\ !*** ./src/question_rating.ts ***! \********************************/ /*! exports provided: QuestionRatingModel */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionRatingModel", function() { return QuestionRatingModel; }); /* harmony import */ var _itemvalue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./itemvalue */ "./src/itemvalue.ts"); /* harmony import */ var _question__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./question */ "./src/question.ts"); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./questionfactory */ "./src/questionfactory.ts"); /* harmony import */ var _settings__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./settings */ "./src/settings.ts"); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./surveyStrings */ "./src/surveyStrings.ts"); /* harmony import */ var _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/cssClassBuilder */ "./src/utils/cssClassBuilder.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); /** * A Model for a rating question. */ var QuestionRatingModel = /** @class */ (function (_super) { __extends(QuestionRatingModel, _super); function QuestionRatingModel(name) { var _this = _super.call(this, name) || this; _this.createItemValues("rateValues"); var self = _this; _this.registerFunctionOnPropertyValueChanged("rateValues", function () { self.fireCallback(self.rateValuesChangedCallback); }); _this.onPropertyChanged.add(function (sender, options) { if (options.name == "rateMin" || options.name == "rateMax" || options.name == "rateStep") { self.fireCallback(self.rateValuesChangedCallback); } }); var locMinRateDescriptionValue = _this.createLocalizableString("minRateDescription", _this, true); var locMaxRateDescriptionValue = _this.createLocalizableString("maxRateDescription", _this, true); locMinRateDescriptionValue.onGetTextCallback = function (text) { return text ? text + " " : text; }; locMaxRateDescriptionValue.onGetTextCallback = function (text) { return text ? " " + text : text; }; return _this; } QuestionRatingModel.prototype.onSurveyLoad = function () { _super.prototype.onSurveyLoad.call(this); this.fireCallback(this.rateValuesChangedCallback); }; Object.defineProperty(QuestionRatingModel.prototype, "rateValues", { /** * The list of rate items. Every item has value and text. If text is empty, the value is rendered. The item text supports markdown. If it is empty the array is generated by using rateMin, rateMax and rateStep properties. * @see rateMin * @see rateMax * @see rateStep */ get: function () { return this.getPropertyValue("rateValues"); }, set: function (val) { this.setPropertyValue("rateValues", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionRatingModel.prototype, "rateMin", { /** * This property is used to generate rate values if rateValues array is empty. It is the first value in the rating. The default value is 1. * @see rateValues * @see rateMax * @see rateStep */ get: function () { return this.getPropertyValue("rateMin"); }, set: function (val) { if (!this.isLoadingFromJson && val > this.rateMax - this.rateStep) val = this.rateMax - this.rateStep; this.setPropertyValue("rateMin", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionRatingModel.prototype, "rateMax", { /** * This property is used to generate rate values if rateValues array is empty. It is the last value in the rating. The default value is 5. * @see rateValues * @see rateMin * @see rateStep */ get: function () { return this.getPropertyValue("rateMax"); }, set: function (val) { if (!this.isLoadingFromJson && val < this.rateMin + this.rateStep) val = this.rateMin + this.rateStep; this.setPropertyValue("rateMax", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionRatingModel.prototype, "rateStep", { /** * This property is used to generate rate values if rateValues array is empty. It is the step value. The number of rate values are (rateMax - rateMin) / rateStep. The default value is 1. * @see rateValues * @see rateMin * @see rateMax */ get: function () { return this.getPropertyValue("rateStep"); }, set: function (val) { if (val <= 0) val = 1; if (!this.isLoadingFromJson && val > this.rateMax - this.rateMin) val = this.rateMax - this.rateMin; this.setPropertyValue("rateStep", val); }, enumerable: false, configurable: true }); QuestionRatingModel.prototype.getDisplayValueCore = function (keysAsText, value) { var res = _itemvalue__WEBPACK_IMPORTED_MODULE_0__["ItemValue"].getTextOrHtmlByValue(this.visibleRateValues, value); return !!res ? res : value; }; Object.defineProperty(QuestionRatingModel.prototype, "visibleRateValues", { get: function () { if (this.rateValues.length > 0) return this.rateValues; var res = []; var value = this.rateMin; var step = this.rateStep; while (value <= this.rateMax && res.length < _settings__WEBPACK_IMPORTED_MODULE_4__["settings"].ratingMaximumRateValueCount) { res.push(new _itemvalue__WEBPACK_IMPORTED_MODULE_0__["ItemValue"](value)); value = this.correctValue(value + step, step); } return res; }, enumerable: false, configurable: true }); QuestionRatingModel.prototype.correctValue = function (value, step) { if (!value) return value; if (Math.round(value) == value) return value; var fr = 0; while (Math.round(step) != step) { step *= 10; fr++; } return parseFloat(value.toFixed(fr)); }; QuestionRatingModel.prototype.getType = function () { return "rating"; }; QuestionRatingModel.prototype.getFirstInputElementId = function () { return this.inputId + "_0"; }; QuestionRatingModel.prototype.supportGoNextPageAutomatic = function () { return true; }; QuestionRatingModel.prototype.supportComment = function () { return true; }; QuestionRatingModel.prototype.supportOther = function () { return true; }; Object.defineProperty(QuestionRatingModel.prototype, "minRateDescription", { /** * The description of minimum (first) item. */ get: function () { return this.getLocalizableStringText("minRateDescription"); }, set: function (val) { this.setLocalizableStringText("minRateDescription", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionRatingModel.prototype, "locMinRateDescription", { get: function () { return this.getLocalizableString("minRateDescription"); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionRatingModel.prototype, "maxRateDescription", { /** * The description of maximum (last) item. */ get: function () { return this.getLocalizableStringText("maxRateDescription"); }, set: function (val) { this.setLocalizableStringText("maxRateDescription", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionRatingModel.prototype, "locMaxRateDescription", { get: function () { return this.getLocalizableString("maxRateDescription"); }, enumerable: false, configurable: true }); QuestionRatingModel.prototype.valueToData = function (val) { if (this.rateValues.length > 0) { var item = _itemvalue__WEBPACK_IMPORTED_MODULE_0__["ItemValue"].getItemByValue(this.rateValues, val); return !!item ? item.value : val; } return !isNaN(val) ? parseFloat(val) : val; }; /** * Click value again to clear. */ QuestionRatingModel.prototype.setValueFromClick = function (value) { if (this.value === parseFloat(value)) { this.clearValue(); } else { this.value = value; } }; QuestionRatingModel.prototype.getItemClass = function (item) { var isSelected = this.value == item.value; var isDisabled = this.isReadOnly && !item.isEnabled; var allowHover = !isDisabled && !isSelected && !(!!this.survey && this.survey.isDesignMode); return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_6__["CssClassBuilder"]() .append(this.cssClasses.item) .append(this.cssClasses.selected, this.value == item.value) .append(this.cssClasses.itemDisabled, this.isReadOnly) .append(this.cssClasses.itemHover, allowHover) .toString(); }; return QuestionRatingModel; }(_question__WEBPACK_IMPORTED_MODULE_1__["Question"])); _jsonobject__WEBPACK_IMPORTED_MODULE_2__["Serializer"].addClass("rating", [ { name: "hasComment:switch", layout: "row" }, { name: "commentText", dependsOn: "hasComment", visibleIf: function (obj) { return obj.hasComment; }, serializationProperty: "locCommentText", layout: "row", }, { name: "rateValues:itemvalue[]", baseValue: function () { return _surveyStrings__WEBPACK_IMPORTED_MODULE_5__["surveyLocalization"].getString("choices_Item"); }, }, { name: "rateMin:number", default: 1 }, { name: "rateMax:number", default: 5 }, { name: "rateStep:number", default: 1, minValue: 0.1 }, { name: "minRateDescription", alternativeName: "mininumRateDescription", serializationProperty: "locMinRateDescription", }, { name: "maxRateDescription", alternativeName: "maximumRateDescription", serializationProperty: "locMaxRateDescription", }, ], function () { return new QuestionRatingModel(""); }, "question"); _questionfactory__WEBPACK_IMPORTED_MODULE_3__["QuestionFactory"].Instance.registerQuestion("rating", function (name) { return new QuestionRatingModel(name); }); /***/ }), /***/ "./src/question_signaturepad.ts": /*!**************************************!*\ !*** ./src/question_signaturepad.ts ***! \**************************************/ /*! exports provided: QuestionSignaturePadModel */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionSignaturePadModel", function() { return QuestionSignaturePadModel; }); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./surveyStrings */ "./src/surveyStrings.ts"); /* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./questionfactory */ "./src/questionfactory.ts"); /* harmony import */ var _question__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./question */ "./src/question.ts"); /* harmony import */ var signature_pad__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! signature_pad */ "./node_modules/signature_pad/dist/signature_pad.mjs"); /* harmony import */ var _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils/cssClassBuilder */ "./src/utils/cssClassBuilder.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var defaultWidth = 300; var defaultHeight = 200; function resizeCanvas(canvas) { var context = canvas.getContext("2d"); var devicePixelRatio = window.devicePixelRatio || 1; var backingStoreRatio = context.webkitBackingStorePixelRatio || context.mozBackingStorePixelRatio || context.msBackingStorePixelRatio || context.oBackingStorePixelRatio || context.backingStorePixelRatio || 1; var ratio = devicePixelRatio / backingStoreRatio; var oldWidth = canvas.width; var oldHeight = canvas.height; canvas.width = oldWidth * ratio; canvas.height = oldHeight * ratio; canvas.style.width = oldWidth + "px"; canvas.style.height = oldHeight + "px"; context.scale(ratio, ratio); } /** * A Model for signature pad question. */ var QuestionSignaturePadModel = /** @class */ (function (_super) { __extends(QuestionSignaturePadModel, _super); function QuestionSignaturePadModel(name) { return _super.call(this, name) || this; } QuestionSignaturePadModel.prototype.getCssRoot = function (cssClasses) { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_5__["CssClassBuilder"]() .append(_super.prototype.getCssRoot.call(this, cssClasses)) .append(cssClasses.small, this.width.toString() === "300") .toString(); }; QuestionSignaturePadModel.prototype.updateValue = function () { if (this.signaturePad) { var data = this.signaturePad.toDataURL(this.dataFormat); this.value = data; } }; QuestionSignaturePadModel.prototype.getType = function () { return "signaturepad"; }; QuestionSignaturePadModel.prototype.afterRenderQuestionElement = function (el) { if (!!el) { this.initSignaturePad(el); } _super.prototype.afterRenderQuestionElement.call(this, el); }; QuestionSignaturePadModel.prototype.beforeDestroyQuestionElement = function (el) { if (!!el) { this.destroySignaturePad(el); } }; QuestionSignaturePadModel.prototype.initSignaturePad = function (el) { var _this = this; var canvas = el.getElementsByTagName("canvas")[0]; var buttonEl = el.getElementsByTagName("button")[0]; var signaturePad = new signature_pad__WEBPACK_IMPORTED_MODULE_4__["default"](canvas, { backgroundColor: "#ffffff" }); if (this.isInputReadOnly) { signaturePad.off(); } buttonEl.onclick = function () { _this.value = undefined; }; this.readOnlyChangedCallback = function () { if (!_this.allowClear || _this.isInputReadOnly) { signaturePad.off(); buttonEl.style.display = "none"; } else { signaturePad.on(); buttonEl.style.display = "block"; } }; signaturePad.penColor = this.penColor; signaturePad.backgroundColor = this.backgroundColor; signaturePad.onBegin = function () { _this.isDrawingValue = true; canvas.focus(); }; signaturePad.onEnd = function () { _this.isDrawingValue = false; _this.updateValue(); }; var updateValueHandler = function () { var data = _this.value; canvas.width = _this.width || defaultWidth; canvas.height = _this.height || defaultHeight; resizeCanvas(canvas); if (!data) { signaturePad.clear(); } else { signaturePad.fromDataURL(data); } }; updateValueHandler(); this.readOnlyChangedCallback(); this.signaturePad = signaturePad; var propertyChangedHandler = function (sender, options) { if (options.name === "width" || options.name === "height") { updateValueHandler(); } if (options.name === "value") { updateValueHandler(); } }; this.onPropertyChanged.add(propertyChangedHandler); this.signaturePad.propertyChangedHandler = propertyChangedHandler; }; QuestionSignaturePadModel.prototype.destroySignaturePad = function (el) { if (this.signaturePad) { this.onPropertyChanged.remove(this.signaturePad.propertyChangedHandler); this.signaturePad.off(); } this.readOnlyChangedCallback = null; this.signaturePad = null; }; Object.defineProperty(QuestionSignaturePadModel.prototype, "width", { /** * Use it to set the specific width for the signature pad. */ get: function () { return this.getPropertyValue("width"); }, set: function (val) { this.setPropertyValue("width", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionSignaturePadModel.prototype, "height", { /** * Use it to set the specific height for the signature pad. */ get: function () { return this.getPropertyValue("height"); }, set: function (val) { this.setPropertyValue("height", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionSignaturePadModel.prototype, "allowClear", { /** * Use it to clear content of the signature pad. */ get: function () { return this.getPropertyValue("allowClear"); }, set: function (val) { this.setPropertyValue("allowClear", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionSignaturePadModel.prototype, "penColor", { /** * Use it to set pen color for the signature pad. */ get: function () { return this.getPropertyValue("penColor"); }, set: function (val) { this.setPropertyValue("penColor", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionSignaturePadModel.prototype, "backgroundColor", { /** * Use it to set background color for the signature pad. */ get: function () { return this.getPropertyValue("backgroundColor"); }, set: function (val) { this.setPropertyValue("backgroundColor", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionSignaturePadModel.prototype, "clearButtonCaption", { /** * The clear signature button caption. */ get: function () { return _surveyStrings__WEBPACK_IMPORTED_MODULE_1__["surveyLocalization"].getString("clearCaption"); }, enumerable: false, configurable: true }); QuestionSignaturePadModel.prototype.needShowPlaceholder = function () { return !this.isDrawingValue && this.isEmpty(); }; Object.defineProperty(QuestionSignaturePadModel.prototype, "placeHolderText", { get: function () { return _surveyStrings__WEBPACK_IMPORTED_MODULE_1__["surveyLocalization"].getString("signaturePlaceHolder"); }, enumerable: false, configurable: true }); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_0__["property"])({ defaultValue: false }) ], QuestionSignaturePadModel.prototype, "isDrawingValue", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_0__["property"])({ defaultValue: "" }) ], QuestionSignaturePadModel.prototype, "dataFormat", void 0); return QuestionSignaturePadModel; }(_question__WEBPACK_IMPORTED_MODULE_3__["Question"])); _jsonobject__WEBPACK_IMPORTED_MODULE_0__["Serializer"].addClass("signaturepad", [ { name: "width:number", category: "general", default: 300, }, { name: "height:number", category: "general", default: 200, }, { name: "allowClear:boolean", category: "general", default: true, }, { name: "penColor:color", category: "general", default: "#1ab394", }, { name: "backgroundColor:color", category: "general", default: "#ffffff", }, { name: "dataFormat", category: "general", default: "", choices: [ { value: "", text: "PNG" }, { value: "image/jpeg", text: "JPEG" }, { value: "image/svg+xml", text: "SVG" }, ], }, { name: "defaultValue", visible: false }, { name: "correctAnswer", visible: false }, ], function () { return new QuestionSignaturePadModel(""); }, "question"); _questionfactory__WEBPACK_IMPORTED_MODULE_2__["QuestionFactory"].Instance.registerQuestion("signaturepad", function (name) { return new QuestionSignaturePadModel(name); }); /***/ }), /***/ "./src/question_text.ts": /*!******************************!*\ !*** ./src/question_text.ts ***! \******************************/ /*! exports provided: QuestionTextModel */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionTextModel", function() { return QuestionTextModel; }); /* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./questionfactory */ "./src/questionfactory.ts"); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _localizablestring__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./localizablestring */ "./src/localizablestring.ts"); /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ "./src/helpers.ts"); /* harmony import */ var _validator__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./validator */ "./src/validator.ts"); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./surveyStrings */ "./src/surveyStrings.ts"); /* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./error */ "./src/error.ts"); /* harmony import */ var _settings__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./settings */ "./src/settings.ts"); /* harmony import */ var _question_textbase__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./question_textbase */ "./src/question_textbase.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); /** * A Model for an input text question. */ var QuestionTextModel = /** @class */ (function (_super) { __extends(QuestionTextModel, _super); function QuestionTextModel(name) { var _this = _super.call(this, name) || this; _this.createLocalizableString("minErrorText", _this, true); _this.createLocalizableString("maxErrorText", _this, true); _this.locDataListValue = new _localizablestring__WEBPACK_IMPORTED_MODULE_2__["LocalizableStrings"](_this); _this.locDataListValue.onValueChanged = function (oldValue, newValue) { _this.propertyValueChanged("dataList", oldValue, newValue); }; _this.registerFunctionOnPropertiesValueChanged(["min", "max", "inputType", "minValueExpression", "maxValueExpression"], function () { _this.setRenderedMinMax(); }); _this.registerFunctionOnPropertiesValueChanged(["inputType", "size"], function () { _this.updateInputSize(); _this.calcRenderedPlaceHolder(); }); return _this; } QuestionTextModel.prototype.isTextValue = function () { return ["text", "number", "password"].indexOf(this.inputType) > -1; }; QuestionTextModel.prototype.getType = function () { return "text"; }; QuestionTextModel.prototype.onSurveyLoad = function () { _super.prototype.onSurveyLoad.call(this); this.setRenderedMinMax(); this.updateInputSize(); }; Object.defineProperty(QuestionTextModel.prototype, "inputType", { /** * Use this property to change the default input type. */ get: function () { return this.getPropertyValue("inputType"); }, set: function (val) { val = val.toLowerCase(); if (val == "datetime_local") val = "datetime-local"; this.setPropertyValue("inputType", val.toLowerCase()); if (!this.isLoadingFromJson) { this.min = undefined; this.max = undefined; this.step = undefined; } }, enumerable: false, configurable: true }); QuestionTextModel.prototype.runCondition = function (values, properties) { _super.prototype.runCondition.call(this, values, properties); if (!!this.minValueExpression || !!this.maxValueExpression) { this.setRenderedMinMax(values, properties); } }; QuestionTextModel.prototype.getValidators = function () { var validators = _super.prototype.getValidators.call(this); if (this.inputType === "email" && !this.validators.some(function (v) { return v.getType() === "emailvalidator"; })) { validators.push(new _validator__WEBPACK_IMPORTED_MODULE_4__["EmailValidator"]()); } return validators; }; QuestionTextModel.prototype.isLayoutTypeSupported = function (layoutType) { return true; }; Object.defineProperty(QuestionTextModel.prototype, "size", { /** * The text input size */ get: function () { return this.getPropertyValue("size"); }, set: function (val) { this.setPropertyValue("size", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionTextModel.prototype, "isTextInput", { get: function () { return (["text", "search", "tel", "url", "email", "password"].indexOf(this.inputType) > -1); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionTextModel.prototype, "inputSize", { get: function () { return this.getPropertyValue("inputSize", 0); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionTextModel.prototype, "inputWidth", { get: function () { return this.getPropertyValue("inputWidth"); }, enumerable: false, configurable: true }); QuestionTextModel.prototype.updateInputSize = function () { var size = this.isTextInput && this.size > 0 ? this.size : 0; if (this.isTextInput && size < 1 && this.parent && !!this.parent["itemSize"]) { size = this.parent["itemSize"]; } this.setPropertyValue("inputSize", size); this.setPropertyValue("inputWidth", size > 0 ? "auto" : ""); }; Object.defineProperty(QuestionTextModel.prototype, "autoComplete", { /** * Text auto complete */ get: function () { return this.getPropertyValue("autoComplete", ""); }, set: function (val) { this.setPropertyValue("autoComplete", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionTextModel.prototype, "min", { /** * The minimum value */ get: function () { return this.getPropertyValue("min"); }, set: function (val) { if (this.isValueExpression(val)) { this.minValueExpression = val.substr(1); return; } this.setPropertyValue("min", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionTextModel.prototype, "max", { /** * The maximum value */ get: function () { return this.getPropertyValue("max"); }, set: function (val) { if (this.isValueExpression(val)) { this.maxValueExpression = val.substr(1); return; } this.setPropertyValue("max", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionTextModel.prototype, "minValueExpression", { /** * The minimum value that you can setup as expression, for example today(-1) = yesterday; */ get: function () { return this.getPropertyValue("minValueExpression", ""); }, set: function (val) { this.setPropertyValue("minValueExpression", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionTextModel.prototype, "maxValueExpression", { /** * The maximum value that you can setup as expression, for example today(1) = tomorrow; */ get: function () { return this.getPropertyValue("maxValueExpression", ""); }, set: function (val) { this.setPropertyValue("maxValueExpression", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionTextModel.prototype, "renderedMin", { get: function () { return this.getPropertyValue("renderedMin"); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionTextModel.prototype, "renderedMax", { get: function () { return this.getPropertyValue("renderedMax"); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionTextModel.prototype, "minErrorText", { /** * The text that shows when value is less than min property. * @see min * @see maxErrorText */ get: function () { return this.getLocalizableStringText("minErrorText", _surveyStrings__WEBPACK_IMPORTED_MODULE_5__["surveyLocalization"].getString("minError")); }, set: function (val) { this.setLocalizableStringText("minErrorText", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionTextModel.prototype, "locMinErrorText", { get: function () { return this.getLocalizableString("minErrorText"); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionTextModel.prototype, "maxErrorText", { /** * The text that shows when value is greater than man property. * @see max * @see minErrorText */ get: function () { return this.getLocalizableStringText("maxErrorText", _surveyStrings__WEBPACK_IMPORTED_MODULE_5__["surveyLocalization"].getString("maxError")); }, set: function (val) { this.setLocalizableStringText("maxErrorText", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionTextModel.prototype, "locMaxErrorText", { get: function () { return this.getLocalizableString("maxErrorText"); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionTextModel.prototype, "isMinMaxType", { /** * Readonly property that returns true if the current inputType allows to set min and max properties * @see inputType * @see min * @see max */ get: function () { return minMaxTypes.indexOf(this.inputType) > -1; }, enumerable: false, configurable: true }); QuestionTextModel.prototype.onCheckForErrors = function (errors, isOnValueChanged) { _super.prototype.onCheckForErrors.call(this, errors, isOnValueChanged); if (isOnValueChanged || this.canSetValueToSurvey()) return; if (this.isValueLessMin) { errors.push(new _error__WEBPACK_IMPORTED_MODULE_6__["CustomError"](this.getMinMaxErrorText(this.minErrorText, this.getCalculatedMinMax(this.renderedMin)), this)); } if (this.isValueGreaterMax) { errors.push(new _error__WEBPACK_IMPORTED_MODULE_6__["CustomError"](this.getMinMaxErrorText(this.maxErrorText, this.getCalculatedMinMax(this.renderedMax)), this)); } }; QuestionTextModel.prototype.canSetValueToSurvey = function () { if (!this.isMinMaxType) return true; if (this.isValueLessMin) return false; if (this.isValueGreaterMax) return false; return true; }; QuestionTextModel.prototype.getMinMaxErrorText = function (errorText, value) { if (!value) return errorText; return errorText.replace("{0}", value.toString()); }; Object.defineProperty(QuestionTextModel.prototype, "isValueLessMin", { get: function () { return (!this.isValueEmpty(this.renderedMin) && this.getCalculatedMinMax(this.value) < this.getCalculatedMinMax(this.renderedMin)); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionTextModel.prototype, "isValueGreaterMax", { get: function () { return (!this.isValueEmpty(this.renderedMax) && this.getCalculatedMinMax(this.value) > this.getCalculatedMinMax(this.renderedMax)); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionTextModel.prototype, "isDateInputType", { get: function () { return this.inputType === "date" || this.inputType === "datetime-local"; }, enumerable: false, configurable: true }); QuestionTextModel.prototype.getCalculatedMinMax = function (minMax) { if (this.isValueEmpty(minMax)) return minMax; return this.isDateInputType ? new Date(minMax) : minMax; }; QuestionTextModel.prototype.setRenderedMinMax = function (values, properties) { var _this = this; if (values === void 0) { values = null; } if (properties === void 0) { properties = null; } this.setValueAndRunExpression(this.minValueExpression, this.min, function (val) { if (!val && _this.isDateInputType && !!_settings__WEBPACK_IMPORTED_MODULE_7__["settings"].minDate) { val = _settings__WEBPACK_IMPORTED_MODULE_7__["settings"].minDate; } _this.setPropertyValue("renderedMin", val); }, values, properties); this.setValueAndRunExpression(this.maxValueExpression, this.max, function (val) { if (!val && _this.isDateInputType) { val = !!_settings__WEBPACK_IMPORTED_MODULE_7__["settings"].maxDate ? _settings__WEBPACK_IMPORTED_MODULE_7__["settings"].maxDate : "2999-12-31"; } _this.setPropertyValue("renderedMax", val); }, values, properties); }; Object.defineProperty(QuestionTextModel.prototype, "step", { /** * The step value */ get: function () { return this.getPropertyValue("step"); }, set: function (val) { this.setPropertyValue("step", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionTextModel.prototype, "renderedStep", { get: function () { return this.isValueEmpty(this.step) ? "any" : this.step; }, enumerable: false, configurable: true }); QuestionTextModel.prototype.supportGoNextPageAutomatic = function () { return ["date", "datetime", "datetime-local"].indexOf(this.inputType) < 0; }; QuestionTextModel.prototype.supportGoNextPageError = function () { return ["date", "datetime", "datetime-local"].indexOf(this.inputType) < 0; }; Object.defineProperty(QuestionTextModel.prototype, "dataList", { /** * The list of recommended options available to choose. */ get: function () { return this.locDataList.value; }, set: function (val) { this.locDataList.value = val; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionTextModel.prototype, "locDataList", { get: function () { return this.locDataListValue; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionTextModel.prototype, "dataListId", { get: function () { return this.locDataList.hasValue() ? this.id + "_datalist" : ""; }, enumerable: false, configurable: true }); QuestionTextModel.prototype.canRunValidators = function (isOnValueChanged) { return (this.errors.length > 0 || !isOnValueChanged || this.supportGoNextPageError()); }; QuestionTextModel.prototype.setNewValue = function (newValue) { newValue = this.correctValueType(newValue); _super.prototype.setNewValue.call(this, newValue); }; QuestionTextModel.prototype.correctValueType = function (newValue) { if (!newValue) return newValue; if (this.inputType == "number" || this.inputType == "range") { return _helpers__WEBPACK_IMPORTED_MODULE_3__["Helpers"].isNumber(newValue) ? parseFloat(newValue) : ""; } return newValue; }; QuestionTextModel.prototype.hasPlaceHolder = function () { return !this.isReadOnly && this.inputType !== "range"; }; Object.defineProperty(QuestionTextModel.prototype, "inputStyle", { get: function () { var style = {}; if (!!this.inputWidth) { style.width = this.inputWidth; } return style; }, enumerable: false, configurable: true }); return QuestionTextModel; }(_question_textbase__WEBPACK_IMPORTED_MODULE_8__["QuestionTextBase"])); var minMaxTypes = [ "number", "range", "date", "datetime-local", "month", "time", "week", ]; _jsonobject__WEBPACK_IMPORTED_MODULE_1__["Serializer"].addClass("text", [ { name: "inputType", default: "text", choices: [ "color", "date", "datetime", "datetime-local", "email", "month", "number", "password", "range", "tel", "text", "time", "url", "week", ], }, { name: "size:number", minValue: 0, dependsOn: "inputType", visibleIf: function (obj) { if (!obj) return false; return obj.isTextInput; }, }, { name: "textUpdateMode", default: "default", choices: ["default", "onBlur", "onTyping"], dependsOn: "inputType", visibleIf: function (obj) { if (!obj) return false; return obj.isTextInput; }, }, { name: "autoComplete", dataList: [ "name", "honorific-prefix", "given-name", "additional-name", "family-name", "honorific-suffix", "nickname", "organization-title", "username", "new-password", "current-password", "organization", "street-address", "address-line1", "address-line2", "address-line3", "address-level4", "address-level3", "address-level2", "address-level1", "country", "country-name", "postal-code", "cc-name", "cc-given-name", "cc-additional-name", "cc-family-name", "cc-number", "cc-exp", "cc-exp-month", "cc-exp-year", "cc-csc", "cc-type", "transaction-currency", "transaction-amount", "language", "bday", "bday-day", "bday-month", "bday-year", "sex", "url", "photo", "tel", "tel-country-code", "tel-national", "tel-area-code", "tel-local", "tel-local-prefix", "tel-local-suffix", "tel-extension", "email", "impp", ], }, { name: "min", dependsOn: "inputType", visibleIf: function (obj) { return !!obj && obj.isMinMaxType; }, onPropertyEditorUpdate: function (obj, propertyEditor) { propertyEditor.inputType = obj.inputType; }, }, { name: "max", dependsOn: "inputType", visibleIf: function (obj) { return !!obj && obj.isMinMaxType; }, onPropertyEditorUpdate: function (obj, propertyEditor) { propertyEditor.inputType = obj.inputType; }, }, { name: "minValueExpression:expression", category: "logic", dependsOn: "inputType", visibleIf: function (obj) { return !!obj && obj.isMinMaxType; }, }, { name: "maxValueExpression:expression", category: "logic", dependsOn: "inputType", visibleIf: function (obj) { return !!obj && obj.isMinMaxType; }, }, { name: "minErrorText", serializationProperty: "locMinErrorText", dependsOn: "inputType", visibleIf: function (obj) { return !!obj && obj.isMinMaxType; }, }, { name: "maxErrorText", serializationProperty: "locMaxErrorText", dependsOn: "inputType", visibleIf: function (obj) { return !!obj && obj.isMinMaxType; }, }, { name: "step:number", dependsOn: "inputType", visibleIf: function (obj) { if (!obj) return false; return obj.inputType === "number"; }, }, { name: "maxLength:number", default: -1, dependsOn: "inputType", visibleIf: function (obj) { if (!obj) return false; return obj.isTextInput; }, }, { name: "placeHolder", serializationProperty: "locPlaceHolder", dependsOn: "inputType", visibleIf: function (obj) { if (!obj) return false; return obj.isTextInput; }, }, { name: "dataList:string[]", serializationProperty: "locDataList", dependsOn: "inputType", visibleIf: function (obj) { if (!obj) return false; return obj.inputType === "text"; }, }, ], function () { return new QuestionTextModel(""); }, "textbase"); _questionfactory__WEBPACK_IMPORTED_MODULE_0__["QuestionFactory"].Instance.registerQuestion("text", function (name) { return new QuestionTextModel(name); }); /***/ }), /***/ "./src/question_textbase.ts": /*!**********************************!*\ !*** ./src/question_textbase.ts ***! \**********************************/ /*! exports provided: QuestionTextBase */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionTextBase", function() { return QuestionTextBase; }); /* harmony import */ var _question__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./question */ "./src/question.ts"); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ "./src/helpers.ts"); /* harmony import */ var _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils/cssClassBuilder */ "./src/utils/cssClassBuilder.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); /** * A Base Model for a comment and text questions */ var QuestionTextBase = /** @class */ (function (_super) { __extends(QuestionTextBase, _super); function QuestionTextBase(name) { var _this = _super.call(this, name) || this; _this.createLocalizableString("placeHolder", _this); return _this; } QuestionTextBase.prototype.isTextValue = function () { return true; }; Object.defineProperty(QuestionTextBase.prototype, "maxLength", { /** * The maximum text length. If it is -1, defaul value, then the survey maxTextLength property will be used. * If it is 0, then the value is unlimited * @see SurveyModel.maxTextLength */ get: function () { return this.getPropertyValue("maxLength"); }, set: function (val) { this.setPropertyValue("maxLength", val); }, enumerable: false, configurable: true }); QuestionTextBase.prototype.getMaxLength = function () { return _helpers__WEBPACK_IMPORTED_MODULE_2__["Helpers"].getMaxLength(this.maxLength, this.survey ? this.survey.maxTextLength : -1); }; Object.defineProperty(QuestionTextBase.prototype, "placeHolder", { /** * Use this property to set the input place holder. */ get: function () { return this.getLocalizableStringText("placeHolder"); }, set: function (val) { this.setLocalizableStringText("placeHolder", val); this.calcRenderedPlaceHolder(); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionTextBase.prototype, "locPlaceHolder", { get: function () { return this.getLocalizableString("placeHolder"); }, enumerable: false, configurable: true }); QuestionTextBase.prototype.getType = function () { return "textbase"; }; QuestionTextBase.prototype.isEmpty = function () { return _super.prototype.isEmpty.call(this) || this.value === ""; }; Object.defineProperty(QuestionTextBase.prototype, "textUpdateMode", { /** * Gets or sets a value that specifies how the question updates it's value. * * The following options are available: * - `default` - get the value from survey.textUpdateMode * - `onBlur` - the value is updated after an input loses the focus. * - `onTyping` - update the value of text questions, "text" and "comment", on every key press. * * Note, that setting to "onTyping" may lead to a performance degradation, in case you have many expressions in the survey. * @see survey.textUpdateMode */ get: function () { return this.getPropertyValue("textUpdateMode"); }, set: function (val) { this.setPropertyValue("textUpdateMode", val); }, enumerable: false, configurable: true }); Object.defineProperty(QuestionTextBase.prototype, "isSurveyInputTextUpdate", { get: function () { if (this.textUpdateMode == "default") return !!this.survey ? this.survey.isUpdateValueTextOnTyping : false; return this.textUpdateMode == "onTyping"; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionTextBase.prototype, "renderedPlaceHolder", { get: function () { return this.getPropertyValue("renderedPlaceHolder"); }, enumerable: false, configurable: true }); QuestionTextBase.prototype.setRenderedPlaceHolder = function (val) { this.setPropertyValue("renderedPlaceHolder", val); }; QuestionTextBase.prototype.onReadOnlyChanged = function () { _super.prototype.onReadOnlyChanged.call(this); this.calcRenderedPlaceHolder(); }; QuestionTextBase.prototype.onSurveyLoad = function () { this.calcRenderedPlaceHolder(); _super.prototype.onSurveyLoad.call(this); }; QuestionTextBase.prototype.localeChanged = function () { _super.prototype.localeChanged.call(this); this.calcRenderedPlaceHolder(); }; QuestionTextBase.prototype.calcRenderedPlaceHolder = function () { var res = this.placeHolder; if (!!res && !this.hasPlaceHolder()) { res = undefined; } this.setRenderedPlaceHolder(res); }; QuestionTextBase.prototype.hasPlaceHolder = function () { return !this.isReadOnly; }; QuestionTextBase.prototype.getControlClass = function () { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_3__["CssClassBuilder"]() .append(this.cssClasses.root) .append(this.cssClasses.onError, this.errors.length > 0) .append(this.cssClasses.controlDisabled, this.isReadOnly) .toString(); }; return QuestionTextBase; }(_question__WEBPACK_IMPORTED_MODULE_0__["Question"])); _jsonobject__WEBPACK_IMPORTED_MODULE_1__["Serializer"].addClass("textbase", [], function () { return new QuestionTextBase(""); }, "question"); /***/ }), /***/ "./src/questionfactory.ts": /*!********************************!*\ !*** ./src/questionfactory.ts ***! \********************************/ /*! exports provided: QuestionFactory, ElementFactory */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionFactory", function() { return QuestionFactory; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ElementFactory", function() { return ElementFactory; }); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./surveyStrings */ "./src/surveyStrings.ts"); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); //TODO replace completely with ElementFactory var QuestionFactory = /** @class */ (function () { function QuestionFactory() { this.creatorHash = {}; } Object.defineProperty(QuestionFactory, "DefaultChoices", { get: function () { return [ _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].getString("choices_Item") + "1", _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].getString("choices_Item") + "2", _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].getString("choices_Item") + "3", ]; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionFactory, "DefaultColums", { get: function () { var colName = _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].getString("matrix_column") + " "; return [colName + "1", colName + "2", colName + "3"]; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionFactory, "DefaultRows", { get: function () { var rowName = _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].getString("matrix_row") + " "; return [rowName + "1", rowName + "2"]; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionFactory, "DefaultMutlipleTextItems", { get: function () { var itemName = _surveyStrings__WEBPACK_IMPORTED_MODULE_0__["surveyLocalization"].getString("multipletext_itemname"); return [itemName + "1", itemName + "2"]; }, enumerable: false, configurable: true }); QuestionFactory.prototype.registerQuestion = function (questionType, questionCreator) { this.creatorHash[questionType] = questionCreator; }; QuestionFactory.prototype.unregisterElement = function (elementType) { delete this.creatorHash[elementType]; }; QuestionFactory.prototype.clear = function () { this.creatorHash = {}; }; QuestionFactory.prototype.getAllTypes = function () { var result = new Array(); for (var key in this.creatorHash) { result.push(key); } return result.sort(); }; QuestionFactory.prototype.createQuestion = function (questionType, name) { var creator = this.creatorHash[questionType]; if (creator == null) return null; return creator(name); }; QuestionFactory.Instance = new QuestionFactory(); return QuestionFactory; }()); var ElementFactory = /** @class */ (function () { function ElementFactory() { this.creatorHash = {}; } ElementFactory.prototype.registerElement = function (elementType, elementCreator) { this.creatorHash[elementType] = elementCreator; }; ElementFactory.prototype.clear = function () { this.creatorHash = {}; }; ElementFactory.prototype.unregisterElement = function (elementType, removeFromSerializer) { if (removeFromSerializer === void 0) { removeFromSerializer = false; } delete this.creatorHash[elementType]; QuestionFactory.Instance.unregisterElement(elementType); if (removeFromSerializer) { _jsonobject__WEBPACK_IMPORTED_MODULE_1__["Serializer"].removeClass(elementType); } }; ElementFactory.prototype.getAllTypes = function () { var result = QuestionFactory.Instance.getAllTypes(); for (var key in this.creatorHash) { result.push(key); } return result.sort(); }; ElementFactory.prototype.createElement = function (elementType, name) { var creator = this.creatorHash[elementType]; if (creator == null) return QuestionFactory.Instance.createQuestion(elementType, name); return creator(name); }; ElementFactory.Instance = new ElementFactory(); return ElementFactory; }()); /***/ }), /***/ "./src/questionnonvalue.ts": /*!*********************************!*\ !*** ./src/questionnonvalue.ts ***! \*********************************/ /*! exports provided: QuestionNonValue */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionNonValue", function() { return QuestionNonValue; }); /* harmony import */ var _question__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./question */ "./src/question.ts"); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); /** * A Model for non value question. This question doesn't add any new functionality. It hides some properties, including the value. */ var QuestionNonValue = /** @class */ (function (_super) { __extends(QuestionNonValue, _super); function QuestionNonValue(name) { return _super.call(this, name) || this; } QuestionNonValue.prototype.getType = function () { return "nonvalue"; }; Object.defineProperty(QuestionNonValue.prototype, "hasInput", { get: function () { return false; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionNonValue.prototype, "hasTitle", { get: function () { return false; }, enumerable: false, configurable: true }); QuestionNonValue.prototype.getTitleLocation = function () { return ""; }; Object.defineProperty(QuestionNonValue.prototype, "hasComment", { get: function () { return false; }, enumerable: false, configurable: true }); QuestionNonValue.prototype.hasErrors = function (fireCallback, rec) { if (fireCallback === void 0) { fireCallback = true; } if (rec === void 0) { rec = null; } return false; }; QuestionNonValue.prototype.getAllErrors = function () { return []; }; QuestionNonValue.prototype.supportGoNextPageAutomatic = function () { return false; }; QuestionNonValue.prototype.addConditionObjectsByContext = function (objects, context) { }; QuestionNonValue.prototype.getConditionJson = function (operator, path) { if (operator === void 0) { operator = null; } if (path === void 0) { path = null; } return null; }; return QuestionNonValue; }(_question__WEBPACK_IMPORTED_MODULE_0__["Question"])); _jsonobject__WEBPACK_IMPORTED_MODULE_1__["Serializer"].addClass("nonvalue", [ { name: "title", visible: false }, { name: "description", visible: false }, { name: "valueName", visible: false }, { name: "enableIf", visible: false }, { name: "defaultValue", visible: false }, { name: "correctAnswer", visible: false }, { name: "isRequired", visible: false, isSerializable: false }, { name: "requiredErrorText", visible: false }, { name: "readOnly", visible: false }, { name: "requiredIf", visible: false }, { name: "validators", visible: false }, { name: "titleLocation", visible: false }, { name: "useDisplayValuesInTitle", visible: false }, ], function () { return new QuestionNonValue(""); }, "question"); /***/ }), /***/ "./src/rendererFactory.ts": /*!********************************!*\ !*** ./src/rendererFactory.ts ***! \********************************/ /*! exports provided: RendererFactory */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RendererFactory", function() { return RendererFactory; }); var RendererFactory = /** @class */ (function () { function RendererFactory() { this.renderersHash = {}; } RendererFactory.prototype.unregisterRenderer = function (questionType, rendererAs) { delete this.renderersHash[questionType][rendererAs]; }; RendererFactory.prototype.registerRenderer = function (questionType, renderAs, renderer) { if (!this.renderersHash[questionType]) { this.renderersHash[questionType] = {}; } this.renderersHash[questionType][renderAs] = renderer; }; RendererFactory.prototype.getRenderer = function (questionType, renderAs) { return ((this.renderersHash[questionType] && this.renderersHash[questionType][renderAs]) || "default"); }; RendererFactory.prototype.getRendererByQuestion = function (question) { return this.getRenderer(question.getType(), question.renderAs); }; RendererFactory.prototype.clear = function () { this.renderersHash = {}; }; RendererFactory.Instance = new RendererFactory(); return RendererFactory; }()); /***/ }), /***/ "./src/settings.ts": /*!*************************!*\ !*** ./src/settings.ts ***! \*************************/ /*! exports provided: settings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "settings", function() { return settings; }); /** * Global survey settings */ var settings = { /** * Options for SurveyJS comparator. By default we trim strings and compare them as case insensitive. To change the behavior you can use following code: * settings.comparator.trimStrings = false; //"abc " will not equal to "abc". They are equal by default. * settings.comparator.caseSensitive = true; //"abc " will not equal to "Abc". They are equal by default. */ comparator: { trimStrings: true, caseSensitive: false }, /** * The prefix that uses to store the question comment, as {questionName} + {commentPrefix}. * The default */ commentPrefix: "-Comment", /** * Encode parameter on calling restful web API */ webserviceEncodeParameters: true, /** * Cache the result for choices getting from web services. Set this property to false, to disable the caching. */ useCachingForChoicesRestful: true, get useCachingForChoicesRestfull() { return settings.useCachingForChoicesRestful; }, set useCachingForChoicesRestfull(val) { settings.useCachingForChoicesRestful = val; }, /** * SurveyJS web service API url */ surveyServiceUrl: "https://api.surveyjs.io/public/v1/Survey", /** * separator that can allow to set value and text of ItemValue object in one string as: "value|text" */ itemValueSeparator: "|", /** * default locale name for localizable strings that uses during serialization, {"default": "My text", "de": "Mein Text"} */ defaultLocaleName: "default", /** * Default row name for matrix (single choice) */ matrixDefaultRowName: "default", /** * Default cell type for dropdown and dynamic matrices */ matrixDefaultCellType: "dropdown", /** * Total value postfix for dropdown and dynamic matrices. The total value stores as: {matrixName} + {postfix} */ matrixTotalValuePostFix: "-total", /** * Maximum row count in dynamic matrix */ matrixMaximumRowCount: 1000, /** * Maximum rowCount that returns in addConditionObjectsByContext function */ matrixMaxRowCountInCondition: 1, /** * Maximum panel count in dynamic panel */ panelMaximumPanelCount: 100, /** * Maximum rate value count in rating question */ ratingMaximumRateValueCount: 20, /** * Disable the question while choices are getting from the web service */ disableOnGettingChoicesFromWeb: false, /** * Set to true to always serialize the localization string as object even if there is only one value for default locale. Instead of string "MyStr" serialize as {default: "MyStr"} */ serializeLocalizableStringAsObject: false, /** * Set to false to hide empty page title and description in design mode */ allowShowEmptyTitleInDesignMode: true, /** * Set to false to hide empty page description in design mode */ allowShowEmptyDescriptionInDesignMode: true, /** * Set this property to true to execute the complete trigger on value change instead of on next page. */ executeCompleteTriggerOnValueChanged: false, /** * Set this property to false to execute the skip trigger on next page instead of on value change. */ executeSkipTriggerOnValueChanged: true, /** * Set this property to change readOnlyCommentRenderMode: "textarea" (default) or (div) */ readOnlyCommentRenderMode: "textarea", /** * Override this function, set your function, if you want to show your own dialog confirm window instead of standard browser window. * @param message */ confirmActionFunc: function (message) { return confirm(message); }, /** * Set this property to change the default value of the minWidth constraint */ minWidth: "300px", /** * Set this property to change the default value of the minWidth constraint */ maxWidth: "initial", /** * This property tells how many times survey re-run expressions on value changes during condition running. We need it to avoid recursions in the expressions */ maximumConditionRunCountOnValueChanged: 10, /** * By default visibleIndex for question with titleLocation = "hidden" is -1, and survey doesn't count these questions when set questions numbers. * Set it true, and a question next to a question with hidden title will increase it's number. */ setQuestionVisibleIndexForHiddenTitle: false, /** * By default visibleIndex for question with hideNumber = true is -1, and survey doesn't count these questions when set questions numbers. * Set it true, and a question next to a question with hidden title number will increase it's number. */ setQuestionVisibleIndexForHiddenNumber: false, /** * By default all rows are rendered no matters whwther they are visible. * Set it true, and survey markup rows will be rendered only if they are visible in viewport. * This feature is experimantal and might do not support all the use cases. */ lazyRowsRendering: false, lazyRowsRenderingStartRow: 3, /** * By default checkbox and radiogroup items are ordered in rows. * Set it "column", and items will be ordered in columns. */ showItemsInOrder: "default", /** * Supported validators by question types. You can modify this variable to add validators for new question types or add/remove for existing question types. */ supportedValidators: { question: ["expression"], comment: ["text", "regex"], text: ["numeric", "text", "regex", "email"], checkbox: ["answercount"], }, /** * Set the value as string "yyyy-mm-dd". text questions with inputType "date" will not allow to set to survey date that less than this value */ minDate: "", /** * Set the value as string "yyyy-mm-dd". text questions with inputType "date" will not allow to set to survey date that greater than this value */ maxDate: "", showModal: undefined, supportCreatorV2: false, /** * Specifies a list of custom icons. * Use this property to replace SurveyJS default icons (displayed in UI elements of SurveyJS Library or Creator) with your custom icons. * For every default icon to replace, add a key/value object with the default icon's name as a key and the name of your custom icon as a value. * For example: Survey.settings.customIcons["icon-redo"] = "my-own-redo-icon" */ customIcons: {}, titleTags: { survey: "h3", page: "h4", panel: "h4", question: "h5", } }; /***/ }), /***/ "./src/stylesmanager.ts": /*!******************************!*\ !*** ./src/stylesmanager.ts ***! \******************************/ /*! exports provided: StylesManager */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "StylesManager", function() { return StylesManager; }); /* harmony import */ var _defaultCss_cssstandard__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./defaultCss/cssstandard */ "./src/defaultCss/cssstandard.ts"); var StylesManager = /** @class */ (function () { function StylesManager() { this.sheet = null; if (StylesManager.Enabled) { this.sheet = StylesManager.findSheet(StylesManager.SurveyJSStylesSheetId); if (!this.sheet) { this.sheet = StylesManager.createSheet(StylesManager.SurveyJSStylesSheetId); this.initializeStyles(this.sheet); } } } StylesManager.findSheet = function (styleSheetId) { if (typeof document === "undefined") return null; for (var i = 0; i < document.styleSheets.length; i++) { if (!!document.styleSheets[i].ownerNode && document.styleSheets[i].ownerNode["id"] === styleSheetId) { return document.styleSheets[i]; } } return null; }; StylesManager.createSheet = function (styleSheetId) { var style = document.createElement("style"); style.id = styleSheetId; // Add a media (and/or media query) here if you'd like! // style.setAttribute("media", "screen") // style.setAttribute("media", "only screen and (max-width : 1024px)") style.appendChild(document.createTextNode("")); document.head.appendChild(style); return style.sheet; }; StylesManager.applyTheme = function (themeName, themeSelector) { if (themeName === void 0) { themeName = "default"; } if (themeSelector === void 0) { themeSelector = ".sv_main"; } var ThemeCss; if (themeName === "modern") themeSelector = ".sv-root-modern "; if (["bootstrap", "bootstrapmaterial", "modern"].indexOf(themeName) !== -1) { ThemeCss = StylesManager[themeName + "ThemeCss"]; _defaultCss_cssstandard__WEBPACK_IMPORTED_MODULE_0__["surveyCss"].currentType = themeName; } else { ThemeCss = StylesManager.ThemeCss; _defaultCss_cssstandard__WEBPACK_IMPORTED_MODULE_0__["surveyCss"].currentType = "standard"; } if (StylesManager.Enabled) { var sheet_1 = StylesManager.findSheet(themeName + themeSelector); if (!sheet_1) { sheet_1 = StylesManager.createSheet(themeName + themeSelector); var theme_1 = StylesManager.ThemeColors[themeName] || StylesManager.ThemeColors["default"]; Object.keys(ThemeCss).forEach(function (selector) { var cssRuleText = ThemeCss[selector]; Object.keys(theme_1).forEach(function (colorVariableName) { return (cssRuleText = cssRuleText.replace(new RegExp("\\" + colorVariableName, "g"), theme_1[colorVariableName])); }); try { sheet_1.insertRule(themeSelector + selector + " { " + cssRuleText + " }", 0); } catch (e) { } }); } } }; StylesManager.prototype.initializeStyles = function (sheet) { if (StylesManager.Enabled) { Object.keys(StylesManager.Styles).forEach(function (selector) { try { sheet.insertRule(selector + " { " + StylesManager.Styles[selector] + " }", 0); } catch (e) { } }); Object.keys(StylesManager.Media).forEach(function (selector) { try { sheet.insertRule(StylesManager.Media[selector].media + " { " + selector + " { " + StylesManager.Media[selector].style + " } }", 0); } catch (e) { } }); } }; StylesManager.SurveyJSStylesSheetId = "surveyjs-styles"; StylesManager.Styles = { // ".sv_bootstrap_css": // "position: relative; width: 100%; background-color: #f4f4f4", // ".sv_bootstrap_css .sv_custom_header": // "position: absolute; width: 100%; height: 275px; background-color: #e7e7e7;", // ".sv_bootstrap_css .sv_container": // "max-width: 80%; margin: auto; position: relative; color: #6d7072; padding: 0 1em;", // ".sv_bootstrap_css .panel-body": // "background-color: white; padding: 1em 1em 5em 1em; border-top: 2px solid lightgray;", ".sv_main span": "word-break: break-word;", ".sv_main legend": "border: none; margin: 0;", ".sv_bootstrap_css .sv_qstn": "padding: 0.5em 1em 1.5em 1em;", ".sv_bootstrap_css .sv_qcbc input[type=checkbox], .sv_bootstrap_css .sv_qcbc input[type=radio]": "vertical-align: middle; margin-top: -1px", ".sv_bootstrap_css .sv_qstn fieldset": "display: block;", ".sv_bootstrap_css .sv_qstn .sv_q_checkbox_inline, .sv_bootstrap_css .sv_qstn .sv_q_radiogroup_inline": "display: inline-block;", ".sv_bootstrap_css .sv-paneldynamic__progress-container ": "position: relative; margin-right: 250px; margin-left: 40px; margin-top: 10px;", ".sv_main.sv_bootstrapmaterial_css .sv_q_radiogroup_control_label": "display: inline; position: static;", ".sv_main.sv_bootstrapmaterial_css .checkbox": "margin-top:10px;margin-bottom:10px;", ".sv_row": "clear: both; min-width:300px;", ".sv_row .sv_qstn": "float: left", ".sv_row .sv_qstn:last-child": "float: none", ".sv_qstn": "display: vertical-align: top; overflow: auto; min-width:300px;", ".sv_p_container": "display: vertical-align: top; min-width:300px;", ".sv_q_title .sv_question_icon": "float: right; margin-right: 1em;", ".sv_q_title .sv_question_icon::before": "content: ''; background-repeat: no-repeat; background-position: center; padding: 0.5em; display: inline-block; background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMi4wLjEsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiDQoJIHZpZXdCb3g9IjAgMCAxMCAxMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMTAgMTA7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoJLnN0MHtmaWxsOiM2RDcwNzI7fQ0KPC9zdHlsZT4NCjxwb2x5Z29uIGNsYXNzPSJzdDAiIHBvaW50cz0iMiwyIDAsNCA1LDkgMTAsNCA4LDIgNSw1ICIvPg0KPC9zdmc+DQo=);", ".sv_q_title .sv_question_icon.sv_expanded::before": "transform: rotate(180deg);", ".sv_qbln .checkbox-material": "margin-right: 3px;", ".sv_qcbx .checkbox-material": "margin-right: 5px;", ".sv_qcbx .checkbox label": "justify-content: left; display: inline-block;", ".sv_qstn .radio label": "justify-content: left; display: inline-block;", ".sv_qstn .sv_q_imgsel > label img": "pointer-events: none;", ".sv_qstn .sv_q_imgsel.sv_q_imagepicker_inline": "display: inline-block;", ".sv_qstn label.sv_q_m_label": "position: absolute; margin: 0; display: block; width: 100%;", ".sv_qstn td": "position: relative;", ".sv_q_mt_item_value": "float: left;", '[dir="rtl"] .sv_q_mt_item_value': "float: right;", ".sv_qstn.sv_qstn_left": "margin-top: 0.75em;", ".sv_qstn .title-left": "float: left; margin-right: 1em;", '[dir="rtl"] .sv_qstn .title-left': "float: right; margin-left: 1em;", ".sv_qstn .content-left": "overflow: hidden", ".sv_q_radiogroup_inline .sv_q_radiogroup_other": "display: inline-block;", ".sv_q_checkbox_inline .sv_q_checkbox_other": "display: inline-block;", ".sv_q_checkbox_inline, .sv_q_radiogroup_inline, .sv_q_imagepicker_inline": "line-height: 2.5em;", ".form-inline .sv_q_checkbox_inline:not(:last-child)": "margin-right: 1em;", ".form-inline .sv_q_radiogroup_inline:not(:last-child)": "margin-right: 1em;", ".sv_imgsel .sv_q_imagepicker_inline:not(:last-child)": "margin-right: 1em;", ".sv_qstn fieldset": "border: none; margin: 0; padding: 0;", ".sv_qstn .sv_q_file_placeholder": "display:none", ".sv_p_title": "padding-left: 1em; padding-bottom: 0.3em;", ".sv_p_title_expandable": "cursor: pointer;", ".sv_q_title_expandable": "cursor: pointer;", ".sv_p_title .sv_panel_icon": "float: right; margin-right: 1em;", ".sv_p_title .sv_panel_icon::before": "content: ''; background-repeat: no-repeat; background-position: center; padding: 0.5em; display: inline-block; background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMi4wLjEsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiDQoJIHZpZXdCb3g9IjAgMCAxMCAxMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMTAgMTA7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoJLnN0MHtmaWxsOiM2RDcwNzI7fQ0KPC9zdHlsZT4NCjxwb2x5Z29uIGNsYXNzPSJzdDAiIHBvaW50cz0iMiwyIDAsNCA1LDkgMTAsNCA4LDIgNSw1ICIvPg0KPC9zdmc+DQo=);", ".sv_p_title .sv_panel_icon.sv_expanded::before": "transform: rotate(180deg);", ".sv_p_footer": "padding-left: 1em; padding-bottom: 1em;padding-top: 1em;", ".sv_matrix_cell_detail_button": "position: relative", ".sv_detail_panel_icon": "display: block; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); width: 14px; height: 14px;", ".sv_detail_panel_icon::before": "content: ''; background-repeat: no-repeat; background-position: center; width: 14px; height: 14px; display: block; transform: rotate(270deg); background-image: url(\"data:image/svg+xml,%3C%3Fxml version='1.0' encoding='utf-8'%3F%3E%3C!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --%3E%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 15 15' style='enable-background:new 0 0 15 15;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%23FFFFFF;%7D%0A%3C/style%3E%3Cpolygon class='st0' points='14,5.5 12.6,4.1 7.5,9.1 2.4,4.1 1,5.5 7.5,12 '/%3E%3C/svg%3E%0A\");", ".sv_detail_panel_icon.sv_detail_expanded::before": "transform: rotate(0deg)", ".sv_matrix_empty_rows_section": "text-align: center; vertical-align: middle;", ".sv_matrix_empty_rows_text": "padding:20px", ".sv_q_file > input[type=file], .sv_q_file > button": "display: inline-block;", ".sv_q_file_preview": "display: inline-block; vertical-align: top; border: 1px solid lightgray; padding: 5px; margin-top: 10px;", ".sv_q_file_preview > a": "display: block; overflow: hidden; vertical-align: top; white-space: nowrap; text-overflow: ellipsis;", ".sv_q_file_remove_button": "line-height: normal;", ".sv_q_file_remove": "display: block; cursor: pointer;", ".sv_q_m_cell_text": "cursor: pointer;", ".sv_q_dd_other": "margin-top: 1em;", ".sv_q_dd_other input": "width: 100%;", ".sv_qstn .sv-q-col-1, .sv-question .sv-q-col-1": "width: 100%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;", ".sv_qstn .sv-q-col-2, .sv-question .sv-q-col-2": "width: calc(50% - 1em); display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;", ".sv_qstn .sv-q-col-3, .sv-question .sv-q-col-3": "width: calc(33.33333% - 1em); display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;", ".sv_qstn .sv-q-col-4, .sv-question .sv-q-col-4": "width: calc(25% - 1em); display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;", ".sv_qstn .sv-q-col-5, .sv-question .sv-q-col-5": "width: calc(20% - 1em); display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;", ".sv_qstn .sv-q-column-1, .sv-question .sv-q-column-1": "width: 100%; max-width: 100%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;", ".sv_qstn .sv-q-column-2, .sv-question .sv-q-column-2": "max-width: 50%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;", ".sv_qstn .sv-q-column-3, .sv-question .sv-q-column-3": "max-width: 33.33333%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;", ".sv_qstn .sv-q-column-4, .sv-question .sv-q-column-4": "max-width: 25%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;", ".sv_qstn .sv-q-column-5, .sv-question .sv-q-column-5": "max-width: 20%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;", ".sv_qstn .sv_q_file_input": "color: transparent;", ".sv_qstn .sv_q_imgsel label > div": "overflow: hidden; white-space: nowrap; text-overflow: ellipsis; padding: 4px; border: 1px solid lightgray; border-radius: 4px;", ".sv_qstn .sv_q_imgsel label > div > img, .sv_qstn .sv_q_imgsel label > div > embed": "display: block;", ".sv_qstn table tr td .sv_q_m_cell_label": "position: absolute; left: 0; right: 0; top: 0; bottom: 0;", "f-panel": "padding: 0.5em 1em; display: inline-block; line-height: 2em;", ".sv_progress_bar > span": "white-space: nowrap;", //progress buttons ".sv_progress-buttons__container-center": "text-align: center;", ".sv_progress-buttons__container": "display: inline-block; font-size: 0; width: 100%; max-width: 1100px; white-space: nowrap; overflow: hidden;", ".sv_progress-buttons__image-button-left": "display: inline-block; vertical-align: top; margin-top: 22px; font-size: 14px; width: 16px; height: 16px; cursor: pointer; background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMi4wLjEsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiDQoJIHZpZXdCb3g9IjAgMCAxNiAxNiIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMTYgMTY7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwb2x5Z29uIHBvaW50cz0iMTEsMTIgOSwxNCAzLDggOSwyIDExLDQgNyw4ICIvPg0KPC9zdmc+DQo=);", ".sv_progress-buttons__image-button-right": "display: inline-block; vertical-align: top; margin-top: 22px; font-size: 14px; width: 16px; height: 16px; cursor: pointer; background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMi4wLjEsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiDQoJIHZpZXdCb3g9IjAgMCAxNiAxNiIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMTYgMTY7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwb2x5Z29uIHBvaW50cz0iNSw0IDcsMiAxMyw4IDcsMTQgNSwxMiA5LDggIi8+DQo8L3N2Zz4NCg==);", ".sv_progress-buttons__image-button--hidden": "visibility: hidden;", ".sv_progress-buttons__list-container": "max-width: calc(100% - 36px); display: inline-block; overflow: hidden;", ".sv_progress-buttons__list": "display: inline-block; width: max-content; padding-left: 28px; padding-right: 28px; margin-top: 14px; margin-bottom: 14px;", ".sv_progress-buttons__list li": "width: 138px; font-size: 14px; font-family: 'Segoe UI', 'Helvetica Neue', Helvetica, Arial, sans-serif; position: relative; text-align: center; vertical-align: top; display: inline-block;", ".sv_progress-buttons__list li:before": "width: 24px; height: 24px; content: ''; line-height: 30px; display: block; margin: 0 auto 10px auto; border: 3px solid; border-radius: 50%; box-sizing: content-box; cursor: pointer;", ".sv_progress-buttons__list li:after": "width: 73%; height: 3px; content: ''; position: absolute; top: 15px; left: -36.5%;", ".sv_progress-buttons__list li:first-child:after": "content: none;", ".sv_progress-buttons__list .sv_progress-buttons__page-title": "width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: bold;", ".sv_progress-buttons__list .sv_progress-buttons__page-description": "width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;", ".sv_progress-buttons__list li.sv_progress-buttons__list-element--nonclickable:before": "cursor: not-allowed;", // ranking ".sv-ranking": "outline: none; user-select: none; touch-action: none;", ".sv-ranking-item": "cursor: pointer; margin-bottom: 5px;position: relative;", ".sv-ranking-item:focus .sv-ranking-item__icon--hover": "visibility: hidden;", ".sv-ranking-item:hover .sv-ranking-item__icon--hover": "visibility: visible;", ".sv-question--disabled .sv-ranking-item:hover .sv-ranking-item__icon--hover": "visibility: hidden;", ".sv-ranking-item:focus": "outline: none;", ".sv-ranking-item:focus .sv-ranking-item__icon--focus": "visibility: visible; top: 15px;", ".sv-ranking-item:focus .sv-ranking-item__index": "background: white; border: 2px solid #19b394;", ".sv-ranking-item__content": "display: inline-block;background-color: white;padding-top: 5px;padding-bottom: 5px;padding-left: 35px;padding-right: 10px; border-radius: 100px;", ".sv-ranking-item__icon-container": "position: absolute;left: 0;top: 0;bottom: 0;width: 35px;", ".sv-ranking-item__icon": "visibility: hidden;left:10px;top:20px;fill:#19b394;position: absolute;", ".sv-ranking-item__index": "display: inline-block;padding: 10px 16px;background: rgba(25, 179, 148, 0.1);border-radius: 100px;border: 2px solid transparent; margin-right: 10px;", ".sv-ranking-item__text": "display: inline-block;", ".sv-ranking-item__ghost": "display: none;background: #f3f3f3;border-radius: 100px;width: 200px;height: 55px;z-index: 1;position: absolute;left: 35px;", ".sv-ranking-item--ghost .sv-ranking-item__ghost": "display: block;", ".sv-ranking-item--ghost .sv-ranking-item__content": "visibility: hidden;", ".sv-ranking-item--drag .sv-ranking-item__content": "box-shadow: 0px 8px 16px rgba(0, 0, 0, 0.1);border-radius: 100px;", ".sv-ranking--drag .sv-ranking-item:hover .sv-ranking-item__icon": "visibility: hidden;", ".sv-ranking-item--drag .sv-ranking-item__icon--hover": "visibility: visible;", ".sv-ranking--mobile .sv-ranking-item__icon--hover": "visibility:visible; fill:#9f9f9f;", ".sv-ranking--mobile.sv-ranking--drag .sv-ranking-item--ghost .sv-ranking-item__icon.sv-ranking-item__icon--hover": "visibility:hidden;", ".sv_qstn .sv_q_select_column": "display: inline-block; vertical-align: top; min-width: 10%;", ".sv_qstn .sv_q_select_column > *:not(.sv_technical)": "display: block;", ".sv_main .sv_container .sv_body .sv_p_root .sv_qstn .sv_q_select_column textarea": "margin-left: 0; padding-left: 0; line-height: initial;", ".sv_main .sv-hidden": "display: none !important;", ".sv_main .sv-visuallyhidden": "position: absolute; height: 1px !important; width: 1px !important; overflow: hidden; clip: rect(1px 1px 1px 1px); clip: rect(1px, 1px, 1px, 1px);", // paneldynamic progress ".sv_main .sv-progress": "height: 0.19em; background-color: $header-background-color; position: relative;", ".sv_main .sv-progress__bar": "background-color: $main-color; height: 100%; position: relative;", // EO paneldynamic progress // paneldynamic ".sv_main .sv-paneldynamic__progress-container": "position: relative; display: inline-block; width: calc(100% - 250px); margin-top: 20px;", ".sv_main .sv-paneldynamic__add-btn": "float: right;", ".sv_main .sv-paneldynamic__add-btn--list-mode": "float: none; margin-top: 0;", ".sv_main .sv-paneldynamic__remove-btn": "margin-top: 1.25em;", ".sv_main .sv-paneldynamic__remove-btn--right": "margin-top: 0; margin-left: 1.25em;", ".sv_main .sv-paneldynamic__prev-btn, .sv_main .sv-paneldynamic__next-btn": "box-sizing: border-box; display: inline-block; cursor: pointer; width: 0.7em; top: -0.28em; position: absolute;", ".sv_main .sv-paneldynamic__prev-btn": "left: -1.3em; transform: rotate(90deg);", ".sv_main .sv-paneldynamic__next-btn ": "right: -1.3em; transform: rotate(270deg);", ".sv_main .sv-paneldynamic__prev-btn.sv-paneldynamic__prev-btn--disabled, .sv_main .sv-paneldynamic__next-btn.sv-paneldynamic__next-btn--disabled": "cursor: auto;", ".sv_main .sv-paneldynamic__progress-text": "font-weight: bold; font-size: 0.87em; margin-top: 0.69em; margin-left: 4em", // EO paneldynamic //boolean ".sv_main .sv-boolean__switch": "display: inline-block; box-sizing: border-box; width: 63px; height: 24px; margin-right: 17px; margin-left: 21px; padding: 2px 3px; vertical-align: middle; border-radius: 12px; cursor: pointer;", ".sv_main .sv-boolean__slider": "display: inline-block; width: 20px; height: 20px; transition-duration: .4s; transition-property: margin-left; border: none; border-radius: 100%;", ".sv_main .sv-boolean__label": "vertical-align: middle; cursor: pointer;", ".sv_main .sv-boolean--indeterminate .sv-boolean__slider": "margin-left: calc(50% - 10px);", ".sv_main .sv-boolean--checked .sv-boolean__slider": "margin-left: calc(100% - 20px);", "[dir='rtl'] .sv-boolean__label ": "float: right;", "[dir='rtl'] .sv-boolean--indeterminate .sv-boolean__slider": "margin-right: calc(50% - 0.625em);", "[dir='rtl'] .sv-boolean--checked .sv-boolean__slider": "margin-right: calc(100% - 1.25em);", "[dir='rtl'] .sv-boolean__switch": "float: right;", "[style*='direction:rtl'] .sv-boolean__label ": "float: right;", "[style*='direction:rtl'] .sv-boolean--indeterminate .sv-boolean__slider": "margin-right: calc(50% - 0.625em);", "[style*='direction:rtl'] .sv-boolean--checked .sv-boolean__slider": "margin-right: calc(100% - 1.25em);", "[style*='direction:rtl'] .sv-boolean__switch": "float: right;", // EO boolean ".sv_main .sv_q_num": "", ".sv_main .sv_q_num + span": "", // SignaturePad ".sv_main .sjs_sp_container": "position: relative; box-sizing: content-box;", ".sv_main .sjs_sp_controls": "position: absolute; left: 0; bottom: 0;", ".sv_main .sjs_sp_controls > button": "user-select: none;", ".sv_main .sjs_sp_container>div>canvas:focus": "outline: none;", ".sv_main .sjs_sp_placeholder": "display: flex; align-items: center; justify-content: center; position: absolute; z-index: 0; user-select: none; pointer-events: none; width: 100%; height: 100%;", // logo // ".sv_main .sv_header": "white-space: nowrap;", ".sv_main .sv_logo": "", ".sv_main .sv-logo--left": "display: inline-block; vertical-align: top; margin-right: 2em;", ".sv_main .sv-logo--right": "display: inline-block; vertical-align: top; margin-left: 2em; float: right;", ".sv_main .sv-logo--right+.sv-logo--right-tail": "clear: both;", ".sv_main .sv-logo--top": "display: block; width: 100%; text-align: center;", ".sv_main .sv-logo--bottom": "display: block; width: 100%; text-align: center;", ".sv_main .sv_header__text": "display: inline-block; vertical-align: top; max-width: 100%", ".sv_main .sv-expand-action:before": "content: \"\"; display: inline-block; background-image: url(\"data:image/svg+xml,%3C%3Fxml version='1.0' encoding='utf-8'%3F%3E%3C!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --%3E%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 10 10' style='enable-background:new 0 0 10 10;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%23404040;%7D%0A%3C/style%3E%3Cpolygon class='st0' points='2,2 0,4 5,9 10,4 8,2 5,5 '/%3E%3C/svg%3E%0A\"); background-repeat: no-repeat; background-position: center center; height: 10px; width: 12px; margin: auto 8px;", ".sv_main .sv-expand-action--expanded:before": "transform: rotate(180deg);", ".sv_main .sv-action-bar": "display: flex; position: relative; align-items: center; margin-left: auto; padding: 0 0 0 16px; overflow: hidden; white-space: nowrap;", ".sv_main .sv-action-bar-separator": "display: inline-block; width: 1px; height: 24px; vertical-align: middle; margin-right: 16px; background-color: #d6d6d6;", ".sv_main .sv-action-bar-item": "-webkit-appearance: none; -moz-appearance: none; appearance: none; display: flex; height: 40px; padding: 8px; box-sizing: border-box; margin-right: 16px; border: none; border-radius: 2px; background-color: transparent; cursor: pointer; line-height: 24px; font-size: 16px; overflow-x: hidden; white-space: nowrap; min-width: auto; font-weight: normal", ".sv_main .sv-action-bar-item__title": "vertical-align: middle; white-space: nowrap;", ".sv_main .sv-action-bar-item__title--with-icon": "margin-left: 8px;", ".sv_main .sv-action__content": "display: flex; flex-direction: row; align-items: center;", ".sv_main .sv-action__content > *": "flex: 0 0 auto;", ".sv_main .sv-action--hidden": "width: 0px; height: 0px; overflow: hidden;", ".sv_main .sv-action-bar-item__icon svg": "display: block;", ".sv_main .sv-action-bar-item:active": "opacity: 0.5;", ".sv_main .sv-action-bar-item:focus": "outline: none;", ".sv_main .sv-title-actions": "display: flex;align-items: center;", ".sv_main .sv-title-actions__title": "flex-wrap: wrap; max-width: 90%; min-width: 50%;", ".sv_main .sv-title-actions__bar": "min-width: 56px;", ".sv_main .sv_matrix_cell_actions .sv-action-bar": "margin-left: 0; padding-left: 0;", ".sv_main .sv_p_wrapper_in_row": "display: flex; flex-direction: row; align-items: center;", ".sv_main .sv_p_remove_btn_right": "margin-left: 1em;", //button-group ".sv_main .sv-button-group": "display: flex; align-items: center; flex-direction: row; font-size: 16px; height: 48px; overflow: auto;", ".sv_main .sv-button-group__item": "display: flex; box-sizing: border-box; flex-direction: row; justify-content: center; align-items: center; width: 100%; padding: 11px 16px; line-height: 24px; border-width: 1px; border-style: solid; outline: none; font-size: 16px; font-weight: 400; cursor: pointer; overflow: hidden;", ".sv_main .sv-button-group__item:not(:first-of-type)": "margin-left: -1px;", ".sv_main .sv-button-group__item-icon": "display: block; height: 24px;", ".sv_main .sv-button-group__item--selected": "font-weight: 600;", ".sv_main .sv-button-group__item-decorator": "display: flex; align-items: center; max-width: 100%;", ".sv_main .sv-button-group__item-icon + .sv-button-group__item-caption": "margin-left: 8px", ".sv_main .sv-button-group__item-caption": "display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;", ".sv_main .sv-button-group__item--disabled": "color: cursor: default;", //eo button-group //popup "sv-popup": "display: block; position: absolute; z-index: -1;", ".sv-popup": "position: fixed; left: 0; top: 0; z-index: 1000; width: 100vw; height: 100vh; outline: none;", ".sv-popup--modal": "display: flex; align-items: center; justify-content: center;", ".sv-popup--modal .sv-popup__container": "position: static; filter: none; padding: calc(4 * 8px);", ".sv-popup__container": "position: absolute; filter: drop-shadow(0px calc(1 * 8px) calc(2 * 8px) rgba(0, 0, 0, 0.1)); padding: calc(1 * 8px) 0; background: white; border-radius: 4px; display: flex; flex-direction: column; max-height: 90vh; max-width: 90vw; box-sizing: border-box;", ".sv-popup__scrolling-content": "overflow: auto;", ".sv-popup__scrolling-content::-webkit-scrollbar": "height: 6px; width: 6px; background-color: #f3f3f3;", ".sv-popup__scrolling-content::-webkit-scrollbar-thumb": "background: rgba(25, 179, 148, 0.1);", ".sv-popup__content": "min-width: 100%;", ".sv-popup--show-pointer.sv-popup--top": "transform: translateY(calc(-1 * 8px));", ".sv-popup--show-pointer.sv-popup--top .sv-popup__pointer": "transform: translate(calc(-1 * 8px)) rotate(180deg);", ".sv-popup--show-pointer.sv-popup--bottom": "transform: translateY(calc(1 * 8px));", ".sv-popup--show-pointer.sv-popup--bottom .sv-popup__pointer": "transform: translate(calc(-1 * 8px), calc(-1 * 8px));", ".sv-popup--show-pointer.sv-popup--right": "transform: translate(calc(1 * 8px));", ".sv-popup--show-pointer.sv-popup--right .sv-popup__pointer": "transform: translate(-12px, -4px) rotate(-90deg);", ".sv-popup--show-pointer.sv-popup--left": "transform: translate(calc(-1 * 8px));", ".sv-popup--show-pointer.sv-popup--left .sv-popup__pointer": "transform: translate(-4px, -4px) rotate(90deg);", ".sv-popup__pointer": "display: block; position: absolute;", ".sv-popup__pointer:after": "content: ' '; display: block; width: 0; height: 0; border-left: calc(1 * 8px) solid transparent; border-right: calc(1 * 8px) solid transparent; border-bottom: calc(1 * 8px) solid white; align-self: center;", ".sv-popup__header": "font-family: Open Sans; font-size: calc(3 * 8px); line-height: calc(4 * 8px); font-style: normal; font-weight: 700; margin-bottom: calc(2 * 8px); color: rgb(22, 22, 22)", ".sv-popup__footer": "display: flex; margin-top: calc(4 * 8px);", ".sv-popup__footer-item:first-child": "margin-left: auto;", ".sv-popup__footer-item + .sv-popup__footer-item": "margin-left: calc(1 * 8px);", ".sv-popup__button": "padding: calc(2 * 8px) calc(6 * 8px); background: #fff; box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.15); border-radius: 4px; cursor: pointer; margin: 2px; font-family: 'Segoe UI', 'Helvetica Neue', Helvetica, Arial, sans-serif; font-style: normal; font-weight: 600; font-size: calc(2 * 8px); line-height: calc(3 * 8px); text-align: center; color: #19b394; border: none; outline: none;", ".sv-popup__button:hover": "box-shadow: 0 0 0 2px #19b394;", ".sv-popup__button:disabled": "color: rgba(22, 22, 22, 0.16); cursor: default;", ".sv-popup__button:disabled:hover": "box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.15);", ".sv-popup__button.sv-popup__button--apply": "background-color: #19b394; color: #fff;", ".sv-popup__button.sv-popup__button--apply:disabled": "background-color: #f3f3f3;", //eo popup //list ".sv-list": "display: flex; flex-direction: column; align-items: flex-start; padding: 0; margin: 0; background: #ffffff; font-family: 'Open Sans'; list-style-type: none;", ".sv-list__item": "width: 100%; display: flex; align-items: center; box-sizing: border-box; padding: calc(1 * 8px) calc(2 * 8px); cursor: pointer;", ".sv-list__item-icon": "float: left; width: calc(3 * 8px); height: calc(3 * 8px); margin-right: calc(2 * 8px);", ".sv-list__item-icon svg": "display: block;", ".sv-list__item-icon use": "fill: #909090;", ".sv-list__item:not(.sv-list__item--selected):hover": "background-color: #f3f3f3;", ".sv-list__item--selected": "background-color: #19b394; color: #fff;", ".sv-list__item--selected .sv-list__item-icon use": "fill: #fff;", ".sv-list__item--disabled": "color: rgba(22, 22, 22, 0.16); cursor: default; pointer-events: none;", ".sv-list__item span": "white-space: nowrap;", //eo list ".sv-skeleton-element": "min-height: 50px;", }; StylesManager.Media = { ".sv_qstn fieldset .sv-q-col-1": { style: "width: 100%;", media: "@media only screen and (max-width: 480px)", }, ".sv_qstn fieldset .sv-q-col-2": { style: "width: 100%;", media: "@media only screen and (max-width: 480px)", }, ".sv_qstn fieldset .sv-q-col-3": { style: "width: 100%;", media: "@media only screen and (max-width: 480px)", }, ".sv_qstn fieldset .sv-q-col-4": { style: "width: 100%;", media: "@media only screen and (max-width: 480px)", }, ".sv_qstn fieldset .sv-q-col-5": { style: "width: 100%;", media: "@media only screen and (max-width: 480px)", }, ".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn": { style: "display: block; width: 100% !important;", media: "@media (max-width: 600px)", }, ".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn .title-left": { style: "float: none;", media: "@media (max-width: 600px)", }, ".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn .sv_q_radiogroup_inline, .sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn .sv_q_checkbox_inline, .sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn .sv_q_imagepicker_inline": { style: "display: block;", media: "@media (max-width: 600px)", }, ".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn table.table": { style: "display: block;", media: "@media (max-width: 600px)", }, ".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn table.table thead": { style: "display: none;", media: "@media (max-width: 600px)", }, ".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn table.table tbody, .sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn table.table tr, .sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn table.table td": { style: "display: block;", media: "@media (max-width: 600px)", }, ".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn table.table:not(.sv_q_matrix) td:before": { style: "content: attr(title);", media: "@media (max-width: 600px)", }, ".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn table.sv_q_matrix td:after": { style: "content: attr(title); padding-left: 1em", media: "@media (max-width: 600px)", }, ".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn .radio label, .sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn .checkbox label": { style: "line-height: 12px; vertical-align: top;", media: "@media (max-width: 600px)", }, ".sv_qstn label.sv_q_m_label": { style: "display: inline;", media: "@media (max-width: 600px)", }, ".sv_main .sv_custom_header": { style: "display: none;", media: "@media (max-width: 1300px)", }, ".sv_main .sv_container .sv_header h3": { style: "font-size: 1.5em;", media: "@media (max-width: 1300px)", }, ".sv_main .sv_container .sv_header h3 span": { style: "font-size: 0.75em;", media: "@media (max-width: 700px)", }, ".sv_main.sv_bootstrap_css .sv-progress__text": { style: "margin-left: 8em;", media: "@media (min-width: 768px)", }, ".sv_row": { style: " display: flex; flex-wrap: wrap;", media: "@supports (display: flex)", }, ".sv-vue-row-additional-div": { style: " display: flex; flex-wrap: wrap; flex-basis: 100%; width: 100%;", media: "@supports (display: flex)", }, ".sv-row > .sv-row__panel, .sv-row__question:not(:last-child)": { style: "float: left;", media: "@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none)", }, "[dir='rtl'],[style*='direction:rtl'] .sv-row__question:not(:last-child)": { style: "float: right;", media: "@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none)", }, ".sv-row > .sv-row__panel, .sv-row__question": { style: "width: 100% !important; padding-right: 0 !important;", media: "@media only screen and (max-width: 600px)", }, }; StylesManager.ThemeColors = { default: { "$header-background-color": "#e7e7e7", "$body-container-background-color": "#f4f4f4", "$main-color": "#1ab394", "$main-hover-color": "#0aa384", "$body-background-color": "white", "$inputs-background-color": "white", "$text-color": "#6d7072", "$text-input-color": "#6d7072", "$header-color": "#6d7072", "$border-color": "#e7e7e7", "$error-color": "#ed5565", "$error-background-color": "#fd6575", "$progress-text-color": "#9d9d9d", "$disable-color": "#dbdbdb", "$disabled-label-color": "rgba(64, 64, 64, 0.5)", "$slider-color": "white", "$disabled-switch-color": "#9f9f9f", "$disabled-slider-color": "#cfcfcf", "$foreground-light": "#909090", "$foreground-disabled": "#161616", "$background-dim": "#f3f3f3", "$progress-buttons-color": "#8dd9ca", "$progress-buttons-line-color": "#d4d4d4" }, orange: { "$header-background-color": "#4a4a4a", "$body-container-background-color": "#f8f8f8", "$main-color": "#f78119", "$main-hover-color": "#e77109", "$body-background-color": "white", "$inputs-background-color": "white", "$text-color": "#4a4a4a", "$text-input-color": "#4a4a4a", "$header-color": "#f78119", "$border-color": "#e7e7e7", "$error-color": "#ed5565", "$error-background-color": "#fd6575", "$progress-text-color": "#9d9d9d", "$disable-color": "#dbdbdb", "$disabled-label-color": "rgba(64, 64, 64, 0.5)", "$slider-color": "white", "$disabled-switch-color": "#9f9f9f", "$disabled-slider-color": "#cfcfcf", "$foreground-light": "#909090", "$foreground-disabled": "#161616", "$background-dim": "#f3f3f3", "$progress-buttons-color": "#f7b781", "$progress-buttons-line-color": "#d4d4d4" }, darkblue: { "$header-background-color": "#d9d8dd", "$body-container-background-color": "#f6f7f2", "$main-color": "#3c4f6d", "$main-hover-color": "#2c3f5d", "$body-background-color": "white", "$inputs-background-color": "white", "$text-color": "#4a4a4a", "$text-input-color": "#4a4a4a", "$header-color": "#6d7072", "$border-color": "#e7e7e7", "$error-color": "#ed5565", "$error-background-color": "#fd6575", "$progress-text-color": "#9d9d9d", "$disable-color": "#dbdbdb", "$disabled-label-color": "rgba(64, 64, 64, 0.5)", "$slider-color": "white", "$disabled-switch-color": "#9f9f9f", "$disabled-slider-color": "#cfcfcf", "$foreground-light": "#909090", "$foreground-disabled": "#161616", "$background-dim": "#f3f3f3", "$progress-buttons-color": "#839ec9", "$progress-buttons-line-color": "#d4d4d4" }, darkrose: { "$header-background-color": "#ddd2ce", "$body-container-background-color": "#f7efed", "$main-color": "#68656e", "$main-hover-color": "#58555e", "$body-background-color": "white", "$inputs-background-color": "white", "$text-color": "#4a4a4a", "$text-input-color": "#4a4a4a", "$header-color": "#6d7072", "$border-color": "#e7e7e7", "$error-color": "#ed5565", "$error-background-color": "#fd6575", "$progress-text-color": "#9d9d9d", "$disable-color": "#dbdbdb", "$disabled-label-color": "rgba(64, 64, 64, 0.5)", "$slider-color": "white", "$disabled-switch-color": "#9f9f9f", "$disabled-slider-color": "#cfcfcf", "$foreground-light": "#909090", "$foreground-disabled": "#161616", "$background-dim": "#f3f3f3", "$progress-buttons-color": "#c6bed4", "$progress-buttons-line-color": "#d4d4d4" }, stone: { "$header-background-color": "#cdccd2", "$body-container-background-color": "#efedf4", "$main-color": "#0f0f33", "$main-hover-color": "#191955", "$body-background-color": "white", "$inputs-background-color": "white", "$text-color": "#0f0f33", "$text-input-color": "#0f0f33", "$header-color": "#0f0f33", "$border-color": "#e7e7e7", "$error-color": "#ed5565", "$error-background-color": "#fd6575", "$progress-text-color": "#9d9d9d", "$disable-color": "#dbdbdb", "$disabled-label-color": "rgba(64, 64, 64, 0.5)", "$slider-color": "white", "$disabled-switch-color": "#9f9f9f", "$disabled-slider-color": "#cfcfcf", "$foreground-light": "#909090", "$foreground-disabled": "#161616", "$background-dim": "#f3f3f3", "$progress-buttons-color": "#747491", "$progress-buttons-line-color": "#d4d4d4" }, winter: { "$header-background-color": "#82b8da", "$body-container-background-color": "#dae1e7", "$main-color": "#3c3b40", "$main-hover-color": "#1e1d20", "$body-background-color": "white", "$inputs-background-color": "white", "$text-color": "#000", "$text-input-color": "#000", "$header-color": "#000", "$border-color": "#e7e7e7", "$error-color": "#ed5565", "$error-background-color": "#fd6575", "$disable-color": "#dbdbdb", "$progress-text-color": "#9d9d9d", "$disabled-label-color": "rgba(64, 64, 64, 0.5)", "$slider-color": "white", "$disabled-switch-color": "#9f9f9f", "$disabled-slider-color": "#cfcfcf", "$foreground-light": "#909090", "$foreground-disabled": "#161616", "$background-dim": "#f3f3f3", "$progress-buttons-color": "#d1c9f5", "$progress-buttons-line-color": "#d4d4d4" }, winterstone: { "$header-background-color": "#323232", "$body-container-background-color": "#f8f8f8", "$main-color": "#5ac8fa", "$main-hover-color": "#06a1e7", "$body-background-color": "white", "$inputs-background-color": "white", "$text-color": "#000", "$text-input-color": "#000", "$header-color": "#fff", "$border-color": "#e7e7e7", "$error-color": "#ed5565", "$error-background-color": "#fd6575", "$disable-color": "#dbdbdb", "$progress-text-color": "#9d9d9d", "$disabled-label-color": "rgba(64, 64, 64, 0.5)", "$slider-color": "white", "$disabled-switch-color": "#9f9f9f", "$disabled-slider-color": "#cfcfcf", "$foreground-light": "#909090", "$foreground-disabled": "#161616", "$background-dim": "#f3f3f3", "$progress-buttons-color": "#acdcf2", "$progress-buttons-line-color": "#d4d4d4" }, modern: { "$main-color": "#1ab394", "$add-button-color": "#1948b3", "$remove-button-color": "#ff1800", "$disable-color": "#dbdbdb", "$progress-text-color": "#9d9d9d", "$disabled-label-color": "rgba(64, 64, 64, 0.5)", "$slider-color": "white", "$disabled-switch-color": "#9f9f9f", "$disabled-slider-color": "#cfcfcf", "$error-color": "#d52901", "$text-color": "#404040", "$light-text-color": "#fff", "$button-text-color": "#fff", "$checkmark-color": "#fff", "$matrix-text-checked-color": "#fff", "$progress-buttons-color": "#8dd9ca", "$progress-buttons-line-color": "#d4d4d4", "$text-input-color": "#404040", "$inputs-background-color": "transparent", "$main-hover-color": "#9f9f9f", "$body-container-background-color": "#f4f4f4", "$text-border-color": "#d4d4d4", "$disabled-text-color": "rgba(64, 64, 64, 0.5)", "$border-color": "rgb(64, 64, 64, 0.5)", "$dropdown-border-color": "#d4d4d4", "$header-background-color": "#e7e7e7", "$answer-background-color": "rgba(26, 179, 148, 0.2)", "$error-background-color": "rgba(213, 41, 1, 0.2)", "$radio-checked-color": "#404040", "$clean-button-color": "#1948b3", "$body-background-color": "#ffffff", "$foreground-light": "#909090", "$foreground-disabled": "#161616", "$background-dim": "#f3f3f3", }, bootstrap: { "$main-color": "#18a689", "$text-color": "#404040;", "$text-input-color": "#404040;", "$progress-text-color": "#9d9d9d", "$disable-color": "#dbdbdb", "$header-background-color": "#e7e7e7", "$disabled-label-color": "rgba(64, 64, 64, 0.5)", "$slider-color": "white", "$disabled-switch-color": "#9f9f9f", "$disabled-slider-color": "#cfcfcf", "$foreground-light": "#909090", "$foreground-disabled": "#161616", "$background-dim": "#f3f3f3", "$progress-buttons-color": "#8dd6c7", "$progress-buttons-line-color": "#d4d4d4", }, bootstrapmaterial: { "$main-color": "#18a689", "$text-color": "#404040;", "$text-input-color": "#404040;", "$progress-text-color": "#9d9d9d", "$disable-color": "#dbdbdb", "$header-background-color": "#e7e7e7", "$disabled-label-color": "rgba(64, 64, 64, 0.5)", "$slider-color": "white", "$disabled-switch-color": "#9f9f9f", "$disabled-slider-color": "#cfcfcf", "$body-background-color": "#ffffff", "$foreground-light": "#909090", "$foreground-disabled": "#161616", "$background-dim": "#f3f3f3", "$progress-buttons-color": "#8dd6c7", "$progress-buttons-line-color": "#d4d4d4", }, }; StylesManager.ThemeCss = { ".sv_default_css": "background-color: $body-container-background-color;", ".sv_default_css hr": "border-color: $border-color;", ".sv_default_css input[type='button'], .sv_default_css button": "color: $body-background-color; background-color: $main-color;", ".sv_default_css input[type='button']:hover, .sv_default_css button:hover": "background-color: $main-hover-color;", ".sv_default_css .sv_header": "color: $header-color;", ".sv_default_css .sv_custom_header": "background-color: $header-background-color;", ".sv_default_css .sv_container": "color: $text-color;", ".sv_default_css .sv_body": "background-color: $body-background-color; border-color: $main-color;", ".sv_default_css .sv_progress": "background-color: $border-color;", ".sv_default_css .sv_progress_bar": "background-color: $main-color;", ".sv_default_css .sv_progress-buttons__list li:before": "border-color: $progress-buttons-color; background-color: $progress-buttons-color;", ".sv_default_css .sv_progress-buttons__list li:after": "background-color: $progress-buttons-line-color;", ".sv_default_css .sv_progress-buttons__list .sv_progress-buttons__page-title": " color: $text-color;", ".sv_default_css .sv_progress-buttons__list .sv_progress-buttons__page-description": " color: $text-color;", ".sv_default_css .sv_progress-buttons__list li.sv_progress-buttons__list-element--passed:before": "border-color: $main-color; background-color: $main-color;", ".sv_default_css .sv_progress-buttons__list li.sv_progress-buttons__list-element--passed + li:after": "background-color: $progress-buttons-color", ".sv_default_css .sv_progress-buttons__list li.sv_progress-buttons__list-element--current:before": "border-color: $main-color; background-color: white;", ".sv_default_css .sv_progress-buttons__list li.sv_progress-buttons__list-element--passed.sv_progress-buttons__list-element--current:before": "border-color: $main-color; background-color: white;", ".sv_default_css .sv_p_root > .sv_row": "border-color: $border-color;", ".sv_default_css .sv_p_root > .sv_row:nth-child(odd)": "background-color: $body-background-color;", ".sv_default_css .sv_p_root > .sv_row:nth-child(even)": "background-color: $body-container-background-color;", ".sv_default_css .sv_q_other input": "color: $text-color; -webkit-text-fill-color: $text-color; border-color: $border-color; background-color: $inputs-background-color;", ".sv_default_css .sv_q_text_root": "color: $text-color; -webkit-text-fill-color: $text-color; border-color: $border-color; background-color: $inputs-background-color;", ".sv_default_css .sv_q_dropdown_control": "color: $text-input-color; border-color: $border-color; background-color: $inputs-background-color;", ".sv_default_css input[type='text']": "color: $text-color; -webkit-text-fill-color: $text-color; border-color: $border-color; background-color: $inputs-background-color;", ".sv_default_css select": "color: $text-color; border-color: $border-color; background-color: $inputs-background-color;", ".sv_default_css textarea": "color: $text-input-color; -webkit-text-fill-color: $text-input-color; border-color: $border-color; background-color: $inputs-background-color;", ".sv_default_css input:not([type='button']):not([type='reset']):not([type='submit']):not([type='image']):not([type='checkbox']):not([type='radio'])": "border: 1px solid $border-color; background-color: $inputs-background-color;color: $text-input-color; -webkit-text-fill-color: $text-input-color;", ".sv_default_css input:not([type='button']):not([type='reset']):not([type='submit']):not([type='image']):not([type='checkbox']):not([type='radio']):focus": "border: 1px solid $main-color;", ".sv_default_css .sv_container .sv_body .sv_p_root .sv_q .sv_select_wrapper .sv_q_dropdown_control ": "background-color: $inputs-background-color;", ".sv_default_css .sv_q_other input:focus": "border-color: $main-color;", ".sv_default_css .sv_q_text_root:focus": "border-color: $main-color;", ".sv_default_css .sv_q_dropdown_control:focus": "border-color: $main-color;", ".sv_default_css input[type='text']:focus": "border-color: $main-color;", '.sv_default_css .sv_container .sv_body .sv_p_root .sv_q input[type="radio"]:focus, .sv_default_css .sv_container .sv_body .sv_p_root .sv_q input[type="checkbox"]:focus': "outline: 1px dotted $main-color;", ".sv_default_css select:focus": "border-color: $main-color;", ".sv_default_css textarea:focus": "border-color: $main-color;", ".sv_default_css .sv_select_wrapper": "background-color: $body-background-color;", ".sv_default_css .sv_select_wrapper::before": "background-color: $main-color;", ".sv_default_css .sv_q_rating_item.active .sv_q_rating_item_text": "background-color: $main-hover-color; border-color: $main-hover-color; color: $body-background-color;", ".sv_default_css .sv_q_rating_item .sv_q_rating_item_text": "border-color: $border-color;", ".sv_default_css .sv_q_rating_item .sv_q_rating_item_text:hover": "border-color: $main-hover-color;", ".sv_default_css table.sv_q_matrix tr": "border-color: $border-color;", ".sv_default_css table.sv_q_matrix_dropdown tr": "border-color: $border-color;", ".sv_default_css table.sv_q_matrix_dynamic tr": "border-color: $border-color;", ".sv_default_css .sv_q_m_cell_selected": "color: $body-background-color; background-color: $main-hover-color;", ".sv_main .sv_q_file_remove:hover": "color: $main-color;", ".sv_main .sv_q_file_choose_button": "color: $body-background-color; background-color: $main-color;", ".sv_main .sv_q_file_choose_button:hover": "background-color: $main-hover-color;", ".sv_main .sv_q_imgsel.checked label>div": "background-color: $main-color", ".sv_default_css .sv_p_description": "padding-left: 1.29em;", //progress bar ".sv_main .sv-progress": "background-color: $header-background-color;", ".sv_main .sv-progress__bar": "background-color: $main-color;", //paneldynamic ".sv_main .sv-paneldynamic__prev-btn.sv-paneldynamic__prev-btn--disabled, .sv_main .sv-paneldynamic__next-btn.sv-paneldynamic__next-btn--disabled": "fill: $disable-color;", ".sv_main .sv-paneldynamic__progress-text": "color: $progress-text-color;", ".sv_main .sv-paneldynamic__prev-btn, .sv_main .sv-paneldynamic__next-btn": "fill: $text-color", //boolean ".sv_main .sv-boolean__switch": "background-color: $main-color;", ".sv_main .sv-boolean__slider": "background-color: $slider-color;", ".sv_main .sv-boolean__label--disabled": "color: $disabled-label-color;", ".sv_main .sv-boolean--disabled .sv-boolean__switch": "background-color: $disabled-switch-color;", ".sv_main .sv-boolean--disabled .sv-boolean__slider": "background-color: $disabled-slider-color;", //eo boolean //signature pad ".sv_main .sjs_sp_container": "border: 1px dashed $disable-color;", ".sv_main .sjs_sp_placeholder": "color: $foreground-light;", ".sv_main .sv_matrix_detail_row": "background-color: #ededed; border-top: 1px solid $header-background-color; border-bottom: 1px solid $header-background-color;", //action-bar ".sv_main .sv-action-bar-item": "color: $text-color;", ".sv_main .sv-action-bar-item__icon use": "fill: $foreground-light;", ".sv_main .sv-action-bar-item:hover": "background-color: $background-dim;", //eo action-bar //button-group ".sv_main .sv-button-group__item--hover:hover": "background-color: $background-dim;", ".sv_main .sv-button-group__item-icon use": "fill: $foreground-light;", ".sv_main .sv-button-group__item--selected": "color: $main-color;", ".sv_main .sv-button-group__item--selected .sv-button-group__item-icon use": "fill: $main-color;", ".sv_main .sv-button-group__item--disabled": "color: $foreground-disabled;", ".sv_main .sv-button-group__item--disabled .sv-button-group__item-icon use": "fill: $foreground-disabled;", ".sv_main .sv-button-group__item": "background: $body-background-color; border-color: $border-color;", //eo button-group ".sv_main .sv_qstn textarea": "max-width: 100%", //drag-drop ".sv_main .sv-matrixdynamic__drag-icon": "padding-top:14px", ".sv_main .sv-matrixdynamic__drag-icon:after": "content: ' '; display: block; height: 6px; width: 20px; border: 1px solid $border-color; box-sizing: border-box; border-radius: 10px; cursor: move; margin-top: 12px;", ".sv_main .sv-matrix__drag-drop-ghost-position-top, .sv_main .sv-matrix__drag-drop-ghost-position-bottom": "position: relative;", ".sv_main .sv-matrix__drag-drop-ghost-position-top::after, .sv_main .sv-matrix__drag-drop-ghost-position-bottom::after": "content: ''; width: 100%; height: 4px; background-color: var(--primary, #19b394); position: absolute; left: 0;", ".sv_main .sv-matrix__drag-drop-ghost-position-top::after": "top: 0;", ".sv_main .sv-matrix__drag-drop-ghost-position-bottom::after": "bottom: 0;", //eo drag-drop ".sv-skeleton-element": "background-color: $background-dim;", }; StylesManager.modernThemeCss = { // ".sv-paneldynamic__add-btn": "background-color: $add-button-color;", // ".sv-paneldynamic__remove-btn": "background-color: $remove-button-color;", ".sv-boolean__switch": "background-color: $main-color;", ".sv-boolean__slider": "background-color: $slider-color;", ".sv-boolean__label--disabled": "color: $disabled-label-color;", ".sv-boolean--disabled .sv-boolean__switch": "background-color: $disabled-switch-color;", ".sv-boolean--disabled .sv-boolean__slider": "background-color: $disabled-slider-color;", ".sv-btn": "color: $button-text-color;", ".sv-checkbox__svg": "border-color: $border-color; fill: transparent;", ".sv-checkbox--allowhover:hover .sv-checkbox__svg": "background-color: $main-hover-color; fill: $checkmark-color;", ".sv-checkbox--checked .sv-checkbox__svg": "background-color: $main-color; fill: $checkmark-color;", ".sv-checkbox--checked.sv-checkbox--disabled .sv-checkbox__svg": "background-color: $disable-color; fill: $checkmark-color;", ".sv-checkbox--disabled .sv-checkbox__svg": "border-color: $disable-color;", ".sv-comment": "border-color: $text-border-color; max-width: 100%;", ".sv-comment:focus": "border-color: $main-color;", ".sv-completedpage": "color: $text-color; background-color: $body-container-background-color;", ".sv-container-modern": "color: $text-color;", ".sv-container-modern__title": "color: $main-color;", ".sv-description": "color: $disabled-text-color;", ".sv-dropdown": "border-bottom: 0.06em solid $text-border-color;", ".sv-dropdown:focus": "border-color: $dropdown-border-color;", ".sv-dropdown--error": "border-color: $error-color; color: $error-color;", ".sv-dropdown--error::placeholder": "color: $error-color;", ".sv-dropdown--error::-ms-input-placeholder": "color: $error-color;", ".sv-file__decorator": "background-color: $body-container-background-color;", ".sv-file__clean-btn": "background-color: $remove-button-color;", ".sv-file__choose-btn:not(.sv-file__choose-btn--disabled)": "background-color: $add-button-color;", ".sv-file__choose-btn--disabled": "background-color: $disable-color;", ".sv-file__remove-svg": "fill: #ff1800;", ".sv-file__sign a": "color: $text-color;", ".sv-footer__complete-btn": "background-color: $main-color;", ".sv-footer__next-btn": "background-color: $main-color;", ".sv-footer__prev-btn": "background-color: $main-color;", ".sv-footer__start-btn": "background-color: $main-color;", ".sv-footer__preview-btn": "background-color: $main-color;", ".sv-footer__edit-btn": "background-color: $main-color;", ".sv-imagepicker__item--allowhover:hover .sv-imagepicker__image": "background-color: $main-hover-color; border-color: $main-hover-color;", ".sv-imagepicker__item--checked .sv-imagepicker__image": "background-color: $main-color; border-color: $main-color;", ".sv-imagepicker__item--disabled.sv-imagepicker__item--checked .sv-imagepicker__image": "background-color: $disable-color; border-color: $disable-color;", ".sv-item__control:focus + .sv-item__decorator": "border-color: $main-color;", ".sv-matrix__text--checked": "color: $matrix-text-checked-color; background-color: $main-color;", ".sv-matrix__text--disabled.sv-matrix__text--checked": "background-color: $disable-color;", ".sv-matrixdynamic__add-btn": "background-color: $add-button-color;", ".sv-matrixdynamic__remove-btn": "background-color: $remove-button-color;", ".sv-paneldynamic__add-btn": "background-color: $add-button-color;", ".sv-paneldynamic__remove-btn": "background-color: $remove-button-color;", ".sv-paneldynamic__prev-btn, .sv-paneldynamic__next-btn": "fill: $text-color;", ".sv-paneldynamic__prev-btn--disabled, .sv-paneldynamic__next-btn--disabled": "fill: $disable-color;", ".sv-paneldynamic__progress-text": "color: $progress-text-color;", ".sv-progress": "background-color: $header-background-color;", ".sv-progress__bar": "background-color: $main-color;", ".sv-progress__text": "color: $progress-text-color;", ".sv_progress-buttons__list li:before": "border-color: $progress-buttons-color; background-color: $progress-buttons-color;", ".sv_progress-buttons__list li:after": "background-color: $progress-buttons-line-color;", ".sv_progress-buttons__list .sv_progress-buttons__page-title": " color: $text-color;", ".sv_progress-buttons__list .sv_progress-buttons__page-description": " color: $text-color;", ".sv_progress-buttons__list li.sv_progress-buttons__list-element--passed:before": "border-color: $main-color; background-color: $main-color;", ".sv_progress-buttons__list li.sv_progress-buttons__list-element--passed + li:after": "background-color: $progress-buttons-color", ".sv_progress-buttons__list li.sv_progress-buttons__list-element--current:before": "border-color: $main-color; background-color: white;", ".sv_progress-buttons__list li.sv_progress-buttons__list-element--passed.sv_progress-buttons__list-element--current:before": "border-color: $main-color; background-color: white;", ".sv-question__erbox": "color: $error-color;", ".sv-question__title--answer": "background-color: $answer-background-color;", ".sv-question__title--error": "background-color: $error-background-color;", ".sv-panel__title--error": "background-color: $error-background-color;", ".sv-radio__svg": "border-color: $border-color; fill: transparent;", ".sv-radio--allowhover:hover .sv-radio__svg": "fill: $border-color;", ".sv-radio--checked .sv-radio__svg": "border-color: $radio-checked-color; fill: $radio-checked-color;", ".sv-radio--disabled .sv-radio__svg": "border-color: $disable-color;", ".sv-radio--disabled.sv-radio--checked .sv-radio__svg": "fill: $disable-color;", ".sv-rating": "color: $text-color;", ".sv-rating input:focus + .sv-rating__min-text + .sv-rating__item-text, .sv-rating input:focus + .sv-rating__item-text": "outline-color: $main-color;", ".sv-rating__item-text": "color: $main-hover-color; border: solid 0.1875em $main-hover-color;", ".sv-rating__item-text:hover": "background-color: $main-hover-color; color: $body-background-color;", ".sv-rating__item--selected .sv-rating__item-text": "background-color: $main-color; color: $body-background-color; border-color: $main-color;", ".sv-rating--disabled .sv-rating__item-text": "color: $disable-color; border-color: $disable-color;", ".sv-rating--disabled .sv-rating__item-text:hover": "background-color: transparent;", ".sv-rating--disabled .sv-rating__item-text:hover .sv-rating__item--selected .sv-rating__item-text": "background-color: $disable-color; color: $body-background-color;", "::-webkit-scrollbar": "background-color: $main-hover-color;", "::-webkit-scrollbar-thumb": "background: $main-color;", ".sv-selectbase__clear-btn": "background-color: $clean-button-color;", ".sv-table": "background-color: rgba($main-hover-color, 0.1);", ".sv-text:focus": "border-color: $main-color;", '.sv-text[type="date"]::-webkit-calendar-picker-indicator': "color: transparent; background: transparent;", ".sv-text--error": "color: $error-color; border-color: $error-color;", ".sv-text--error::placeholder": "color: $error-color;", ".sv-text--error::-ms-placeholder": "color: $error-color;", ".sv-text--error:-ms-placeholder": "color: $error-color;", "input.sv-text, textarea.sv-comment, select.sv-dropdown": "color: $text-input-color; background-color: $inputs-background-color;", ".sv-text::placeholder": "color: $text-input-color;", ".sv-text::-ms-placeholder": "color: $text-input-color;", ".sv-text:-ms-placeholder": "color: $text-input-color;", ".sv-table__row--detail": "background-color: $header-background-color;", //signature pad ".sjs_sp_container": "border: 1px dashed $disable-color;", ".sjs_sp_placeholder": "color: $foreground-light;", //drag-drop ".sv-matrixdynamic__drag-icon": "padding-top:16px", ".sv-matrixdynamic__drag-icon:after": "content: ' '; display: block; height: 6px; width: 20px; border: 1px solid $border-color; box-sizing: border-box; border-radius: 10px; cursor: move; margin-top: 12px;", ".sv-matrix__drag-drop-ghost-position-top, .sv-matrix__drag-drop-ghost-position-bottom": "position: relative;", ".sv-matrix__drag-drop-ghost-position-top::after, .sv-matrix__drag-drop-ghost-position-bottom::after": "content: ''; width: 100%; height: 4px; background-color: var(--primary, #19b394); position: absolute; left: 0;", ".sv-matrix__drag-drop-ghost-position-top::after": "top: 0;", ".sv-matrix__drag-drop-ghost-position-bottom::after": "bottom: 0;", //eo drag-drop ".sv-skeleton-element": "background-color: $background-dim;", }; StylesManager.bootstrapThemeCss = { ".sv_main .sv_q_imgsel.checked label>div": "background-color: $main-color", ".sv_main .sv_p_description": "padding-left: 1.66em;", ".sv_main .sv_qstn_error_bottom": "margin-top: 20px; margin-bottom: 0;", ".sv_main .progress": "width: 60%;", ".sv_main .progress-bar": "width: auto; margin-left: 2px; margin-right: 2px;", ".sv_main .table>tbody>tr>td": "min-width: 90px;", ".sv_main f-panel .sv_qstn": "padding: 0; vertical-align: middle;", ".sv_main .sv_q_image": "display: inline-block;", ".sv_main .sv_row .sv_qstn:first-child:last-child": "flex: none !important;", ".sv_main .sv_row .sv_p_container:first-child:last-child": "flex: none !important;", //progress bar ".sv_main .sv-progress": "background-color: $header-background-color;", ".sv_main .sv-progress__bar": "background-color: $main-color;", //progress buttons ".sv_main .sv_progress-buttons__list li:before": "border-color: $progress-buttons-color; background-color: $progress-buttons-color;", ".sv_main .sv_progress-buttons__list li:after": "background-color: $progress-buttons-line-color;", ".sv_main .sv_progress-buttons__list .sv_progress-buttons__page-title": " color: $text-color;", ".sv_main .sv_progress-buttons__list .sv_progress-buttons__page-description": " color: $text-color;", ".sv_main .sv_progress-buttons__list li.sv_progress-buttons__list-element--passed:before": "border-color: $main-color; background-color: $main-color;", ".sv_main .sv_progress-buttons__list li.sv_progress-buttons__list-element--passed + li:after": "background-color: $progress-buttons-color", ".sv_main .sv_progress-buttons__list li.sv_progress-buttons__list-element--current:before": "border-color: $main-color; background-color: white;", ".sv_main .sv_progress-buttons__list li.sv_progress-buttons__list-element--passed.sv_progress-buttons__list-element--current:before": "border-color: $main-color; background-color: white;", //paneldynamic ".sv_main .sv-paneldynamic__prev-btn.sv-paneldynamic__prev-btn--disabled, .sv_main .sv-paneldynamic__next-btn.sv-paneldynamic__next-btn--disabled": "fill: $disable-color;", ".sv_main .sv-paneldynamic__progress-text": "color: $progress-text-color;", ".sv_main .sv-paneldynamic__prev-btn, .sv_main .sv-paneldynamic__next-btn": "fill: $text-color", //boolean ".sv_main .sv-boolean__switch": "background-color: $main-color;", ".sv_main .sv-boolean__slider": "background-color: $slider-color;", ".sv_main .sv-boolean__label--disabled": "color: $disabled-label-color;", ".sv_main .sv-boolean--disabled .sv-boolean__switch": "background-color: $disabled-switch-color;", ".sv_main .sv-boolean--disabled .sv-boolean__slider": "background-color: $disabled-slider-color;", //eo boolean //signature pad ".sv_main .sjs_sp_container": "border: 1px dashed $disable-color;", ".sv_main .sjs_sp_placeholder": "color: $foreground-light;", ".sv_main .sv_matrix_detail_row": "background-color: #ededed; border-top: 1px solid $header-background-color; border-bottom: 1px solid $header-background-color;", ".sv_main .sv-action-bar-item": "color: $text-color;", ".sv_main .sv-action-bar-item__icon use": "fill: $foreground-light;", ".sv_main .sv-action-bar-item:hover": "background-color: $background-dim;", ".sv-skeleton-element": "background-color: $background-dim;", }; StylesManager.bootstrapmaterialThemeCss = { ".sv_main.sv_bootstrapmaterial_css .form-group.is-focused .form-control": "linear-gradient(0deg, $main-color 2px, $main-color 0),linear-gradient(0deg, #D2D2D2 1px, transparent 0);", ".sv_main.sv_bootstrapmaterial_css .sv_qstn": "margin-bottom: 1rem;", ".sv_main.sv_bootstrapmaterial_css .sv_qstn label.sv_q_m_label": "height: 100%;", ".sv_main.sv_bootstrapmaterial_css .sv_q_image": "display: inline-block;", ".sv_main .sv_row .sv_qstn:first-child:last-child": "flex: none !important;", ".sv_main .sv_row .sv_p_container:first-child:last-child": "flex: none !important;", ".sv_main.sv_bootstrapmaterial_css .checkbox input[type=checkbox]:checked + .checkbox-material .check": "border-color: $main-color;", ".sv_main.sv_bootstrapmaterial_css label.checkbox-inline input[type=checkbox]:checked + .checkbox-material .check": "border-color: $main-color;", ".sv_main.sv_bootstrapmaterial_css .checkbox input[type=checkbox]:checked + .checkbox-material .check:before": "color: $main-color;", ".sv_main.sv_bootstrapmaterial_css label.checkbox-inline input[type=checkbox]:checked + .checkbox-material .check:before": "color: $main-color;", ".sv_main.sv_bootstrapmaterial_css .radio input[type=radio]:checked ~ .circle": "border-color: $main-color;", ".sv_main.sv_bootstrapmaterial_css label.radio-inline input[type=radio]:checked ~ .circle": "border-color: $main-color;", ".sv_main.sv_bootstrapmaterial_css .radio input[type=radio]:checked ~ .check": "background-color: $main-color;", ".sv_main.sv_bootstrapmaterial_css label.radio-inline input[type=radio]:checked ~ .check": "background-color: $main-color;", ".sv_main.sv_bootstrapmaterial_css .btn-default.active": "background-color: $main-color; color: $body-background-color;", ".sv_main.sv_bootstrapmaterial_css .btn-default:active": "background-color: $main-color; color: $body-background-color;", ".sv_main.sv_bootstrapmaterial_css .btn-secondary.active": "background-color: $main-color; color: $body-background-color;", ".sv_main.sv_bootstrapmaterial_css .btn-secondary:active": "background-color: $main-color; color: $body-background-color;", ".sv_main.sv_bootstrapmaterial_css .open>.dropdown-toggle.btn-default": "background-color: $main-color; color: $body-background-color;", ".sv_main.sv_bootstrapmaterial_css input[type='button'].btn-primary, .sv_main.sv_bootstrapmaterial_css button.btn-primary": "color: $body-background-color; background-color: $main-color;", ".sv_main.sv_bootstrapmaterial_css input[type='button'].btn-primary:hover, .sv_main.sv_bootstrapmaterial_css button.btn-primary:hover": "background-color: $main-hover-color;", ".sv_main .sv_q_imgsel.checked label>div": "background-color: $main-color;", ".sv_main.sv_bootstrapmaterial_css .sv_q_file_remove:hover": "color: $main-color;", ".sv_main.sv_bootstrapmaterial_css .form-group input[type=file]": "position: relative; opacity: 1;", ".sv_main.sv_bootstrapmaterial_css .progress": "width: 60%; height: 1.5em;", ".sv_main.sv_bootstrapmaterial_css .progress-bar": "width: auto; margin-left: 2px; margin-right: 2px;", //progress bar ".sv_main .sv-progress": "background-color: $header-background-color;", ".sv_main .sv-progress__bar": "background-color: $main-color;", //progress buttons ".sv_main.sv_bootstrapmaterial_css .sv_progress-buttons__list li:before": "border-color: $progress-buttons-color; background-color: $progress-buttons-color;", ".sv_main.sv_bootstrapmaterial_css .sv_progress-buttons__list li:after": "background-color: $progress-buttons-line-color;", ".sv_main.sv_bootstrapmaterial_css .sv_progress-buttons__list .sv_progress-buttons__page-title": " color: $text-color;", ".sv_main.sv_bootstrapmaterial_css .sv_progress-buttons__list .sv_progress-buttons__page-description": " color: $text-color;", ".sv_main.sv_bootstrapmaterial_css .sv_progress-buttons__list li.sv_progress-buttons__list-element--passed:before": "border-color: $main-color; background-color: $main-color;", ".sv_main.sv_bootstrapmaterial_css .sv_progress-buttons__list li.sv_progress-buttons__list-element--passed + li:after": "background-color: $progress-buttons-color", ".sv_main.sv_bootstrapmaterial_css .sv_progress-buttons__list li.sv_progress-buttons__list-element--current:before": "border-color: $main-color; background-color: white;", ".sv_main.sv_bootstrapmaterial_css .sv_progress-buttons__list li.sv_progress-buttons__list-element--passed.sv_progress-buttons__list-element--current:before": "border-color: $main-color; background-color: white;", //paneldynamic ".sv_main .sv-paneldynamic__prev-btn.sv-paneldynamic__prev-btn--disabled, .sv_main .sv-paneldynamic__next-btn.sv-paneldynamic__next-btn--disabled": "fill: $disable-color;", ".sv_main .sv-paneldynamic__progress-text": "color: $progress-text-color;", ".sv_main .sv-paneldynamic__prev-btn, .sv_main .sv-paneldynamic__next-btn": "fill: $text-color", //boolean ".sv_main .sv-boolean .checkbox-decorator": "display: none;", ".sv_main .sv-boolean__switch": "background-color: $main-color;", ".sv_main .sv-boolean__slider": "background-color: $slider-color;", ".sv_main .sv-boolean__label.sv-boolean__label--disabled": "color: $disabled-label-color;", ".sv_main .sv-boolean__label": "color: $text-color;", ".sv_main .sv-boolean--disabled .sv-boolean__switch": "background-color: $disabled-switch-color;", ".sv_main .sv-boolean--disabled .sv-boolean__slider": "background-color: $disabled-slider-color;", //eo boolean ".sv_main .sv_matrix_detail_row": "background-color: #ededed; border-top: 1px solid $header-background-color; border-bottom: 1px solid $header-background-color;", //signature pad ".sv_main .sjs_sp_container": "border: 1px dashed $disable-color;", ".sv_main .sjs_sp_placeholder": "color: $foreground-light;", ".sv_main .sv-action-bar-item": "color: $text-color;", ".sv_main .sv-action-bar-item__icon use": "fill: $foreground-light;", ".sv_main .sv-action-bar-item:hover": "background-color: $background-dim;", ".sv-skeleton-element": "background-color: $background-dim;", }; StylesManager.Enabled = true; return StylesManager; }()); /***/ }), /***/ "./src/survey-element.ts": /*!*******************************!*\ !*** ./src/survey-element.ts ***! \*******************************/ /*! exports provided: SurveyElementCore, SurveyElement */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyElementCore", function() { return SurveyElementCore; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyElement", function() { return SurveyElement; }); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _rendererFactory__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./rendererFactory */ "./src/rendererFactory.ts"); /* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./base */ "./src/base.ts"); /* harmony import */ var _actions_action__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./actions/action */ "./src/actions/action.ts"); /* harmony import */ var _actions_adaptive_container__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./actions/adaptive-container */ "./src/actions/adaptive-container.ts"); /* harmony import */ var _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils/cssClassBuilder */ "./src/utils/cssClassBuilder.ts"); /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./helpers */ "./src/helpers.ts"); /* harmony import */ var _settings__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./settings */ "./src/settings.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; /** * Base class of SurveyJS Elements and Survey. */ var SurveyElementCore = /** @class */ (function (_super) { __extends(SurveyElementCore, _super); function SurveyElementCore() { var _this = _super.call(this) || this; _this.createLocTitleProperty(); _this.createLocalizableString("description", _this, true); return _this; } SurveyElementCore.prototype.createLocTitleProperty = function () { return this.createLocalizableString("title", this, true); }; Object.defineProperty(SurveyElementCore.prototype, "title", { /** * Question, Panel, Page and Survey title. If page and panel is empty then they are not rendered. * Question renders question name if the title is empty. Use survey questionTitleTemplate property to change the title question rendering. * @see SurveyModel.questionTitleTemplate */ get: function () { return this.getLocalizableStringText("title", this.getDefaultTitleValue()); }, set: function (val) { this.setLocalizableStringText("title", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyElementCore.prototype, "locTitle", { get: function () { return this.getLocalizableString("title"); }, enumerable: false, configurable: true }); SurveyElementCore.prototype.getDefaultTitleValue = function () { return undefined; }; Object.defineProperty(SurveyElementCore.prototype, "description", { /** * Question, Panel and Page description. It renders under element title by using smaller font. Unlike the question title, description can be empty. * Please note, this property is hidden for questions without input, for example html question. * @see title */ get: function () { return this.getLocalizableStringText("description"); }, set: function (val) { this.setLocalizableStringText("description", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyElementCore.prototype, "locDescription", { get: function () { return this.getLocalizableString("description"); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyElementCore.prototype, "titleTagName", { get: function () { var titleTagName = this.getDefaultTitleTagName(); var survey = this.getSurvey(); return !!survey ? survey.getElementTitleTagName(this, titleTagName) : titleTagName; }, enumerable: false, configurable: true }); SurveyElementCore.prototype.getDefaultTitleTagName = function () { return _settings__WEBPACK_IMPORTED_MODULE_7__["settings"].titleTags[this.getType()]; }; Object.defineProperty(SurveyElementCore.prototype, "hasTitle", { get: function () { return this.title.length > 0; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyElementCore.prototype, "hasTitleActions", { get: function () { return false; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyElementCore.prototype, "hasTitleEvents", { get: function () { return this.hasTitleActions; }, enumerable: false, configurable: true }); SurveyElementCore.prototype.getTitleToolbar = function () { return null; }; SurveyElementCore.prototype.getTitleOwner = function () { return undefined; }; Object.defineProperty(SurveyElementCore.prototype, "isTitleOwner", { get: function () { return !!this.getTitleOwner(); }, enumerable: false, configurable: true }); SurveyElementCore.prototype.toggleState = function () { return undefined; }; Object.defineProperty(SurveyElementCore.prototype, "cssClasses", { get: function () { return {}; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyElementCore.prototype, "cssTitle", { get: function () { return ""; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyElementCore.prototype, "ariaTitleId", { get: function () { return undefined; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyElementCore.prototype, "titleTabIndex", { get: function () { return undefined; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyElementCore.prototype, "titleAriaExpanded", { get: function () { return undefined; }, enumerable: false, configurable: true }); return SurveyElementCore; }(_base__WEBPACK_IMPORTED_MODULE_2__["Base"])); /** * Base class of SurveyJS Elements. */ var SurveyElement = /** @class */ (function (_super) { __extends(SurveyElement, _super); function SurveyElement(name) { var _this = _super.call(this) || this; _this.selectedElementInDesignValue = _this; _this.disableDesignActions = SurveyElement.CreateDisabledDesignElements; _this.isContentElement = false; _this.isEditableTemplateElement = false; _this.isInteractiveDesignElement = true; _this.name = name; _this.createNewArray("errors"); _this.createNewArray("titleActions"); _this.registerFunctionOnPropertyValueChanged("isReadOnly", function () { _this.onReadOnlyChanged(); }); _this.registerFunctionOnPropertyValueChanged("errors", function () { _this.updateVisibleErrors(); }); return _this; } SurveyElement.getProgressInfoByElements = function (children, isRequired) { var info = _base__WEBPACK_IMPORTED_MODULE_2__["Base"].createProgressInfo(); for (var i = 0; i < children.length; i++) { if (!children[i].isVisible) continue; var childInfo = children[i].getProgressInfo(); info.questionCount += childInfo.questionCount; info.answeredQuestionCount += childInfo.answeredQuestionCount; info.requiredQuestionCount += childInfo.requiredQuestionCount; info.requiredAnsweredQuestionCount += childInfo.requiredAnsweredQuestionCount; } if (isRequired && info.questionCount > 0) { if (info.requiredQuestionCount == 0) info.requiredQuestionCount = 1; if (info.answeredQuestionCount > 0) info.requiredAnsweredQuestionCount = 1; } return info; }; SurveyElement.ScrollElementToTop = function (elementId) { if (!elementId || typeof document === "undefined") return false; var el = document.getElementById(elementId); if (!el || !el.scrollIntoView) return false; var elemTop = el.getBoundingClientRect().top; if (elemTop < 0) el.scrollIntoView(); return elemTop < 0; }; SurveyElement.GetFirstNonTextElement = function (elements, removeSpaces) { if (removeSpaces === void 0) { removeSpaces = false; } if (!elements || !elements.length || elements.length == 0) return null; if (removeSpaces) { var tEl = elements[0]; if (tEl.nodeName === "#text") tEl.data = ""; tEl = elements[elements.length - 1]; if (tEl.nodeName === "#text") tEl.data = ""; } for (var i = 0; i < elements.length; i++) { if (elements[i].nodeName != "#text" && elements[i].nodeName != "#comment") return elements[i]; } return null; }; SurveyElement.FocusElement = function (elementId) { if (!elementId || typeof document === "undefined") return false; var res = SurveyElement.focusElementCore(elementId); if (!res) { setTimeout(function () { SurveyElement.focusElementCore(elementId); }, 10); } return res; }; SurveyElement.focusElementCore = function (elementId) { var el = document.getElementById(elementId); if (el) { el.focus(); return true; } return false; }; SurveyElement.prototype.onPropertyValueChanged = function (name, oldValue, newValue) { _super.prototype.onPropertyValueChanged.call(this, name, oldValue, newValue); if (name === "state") { if (oldValue === "default" || newValue === "default") { this.updateTitleActions(); } else { this.updateExpandAction(); } if (this.stateChangedCallback) this.stateChangedCallback(); } }; SurveyElement.prototype.getSkeletonComponentNameCore = function () { if (this.survey) { return this.survey.getSkeletonComponentName(this); } return ""; }; Object.defineProperty(SurveyElement.prototype, "skeletonComponentName", { get: function () { return this.getSkeletonComponentNameCore(); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyElement.prototype, "state", { /** * Set this property to "collapsed" to render only Panel title and expanded button and to "expanded" to render the collapsed button in the Panel caption */ get: function () { return this.getPropertyValue("state"); }, set: function (val) { this.setPropertyValue("state", val); this.notifyStateChanged(); }, enumerable: false, configurable: true }); SurveyElement.prototype.notifyStateChanged = function () { if (this.survey) { this.survey.elementContentVisibilityChanged(this); } }; Object.defineProperty(SurveyElement.prototype, "isCollapsed", { /** * Returns true if the Element is in the collapsed state * @see state * @see collapse * @see isExpanded */ get: function () { if (this.isDesignMode) return; return this.state === "collapsed"; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyElement.prototype, "isExpanded", { /** * Returns true if the Element is in the expanded state * @see state * @see expand * @see isCollapsed */ get: function () { return this.state === "expanded"; }, enumerable: false, configurable: true }); /** * Collapse the Element * @see state */ SurveyElement.prototype.collapse = function () { if (this.isDesignMode) return; this.state = "collapsed"; }; /** * Expand the Element * @see state */ SurveyElement.prototype.expand = function () { this.state = "expanded"; }; /** * Toggle element's state * @see state */ SurveyElement.prototype.toggleState = function () { if (this.isCollapsed) { this.expand(); return true; } if (this.isExpanded) { this.collapse(); return false; } return true; }; Object.defineProperty(SurveyElement.prototype, "hasStateButton", { get: function () { return this.isExpanded || this.isCollapsed; }, enumerable: false, configurable: true }); SurveyElement.prototype.getTitleToolbar = function () { if (!this.titleToolbarValue) { this.titleToolbarValue = new _actions_adaptive_container__WEBPACK_IMPORTED_MODULE_4__["AdaptiveActionContainer"](); this.titleToolbarValue.setItems(this.getTitleActions()); } return this.titleToolbarValue; }; SurveyElement.prototype.updateExpandAction = function () { if (!!this.expandAction) { this.expandAction.visible = this.isExpanded || this.isCollapsed; this.expandAction.innerCss = new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_5__["CssClassBuilder"]() .append("sv-expand-action").append("sv-expand-action--expanded", this.isExpanded).toString(); } }; Object.defineProperty(SurveyElement.prototype, "titleActions", { get: function () { return this.getPropertyValue("titleActions"); }, enumerable: false, configurable: true }); SurveyElement.prototype.getTitleActions = function () { if (!this.isTitleActionRequested) { this.updateTitleActions(); this.isTitleActionRequested = true; } return this.titleActions; }; SurveyElement.prototype.updateTitleActions = function () { var _this = this; var actions = []; if (this.hasStateButton && !this.expandAction) { this.expandAction = new _actions_action__WEBPACK_IMPORTED_MODULE_3__["Action"]({ id: "expand-collapse-action", title: "", disableTabStop: true, action: function () { _this.toggleState(); }, }); } if (!!this.expandAction) { actions.push(this.expandAction); } if (!!this.survey) { actions = this.survey.getUpdatedElementTitleActions(this, actions); } this.updateExpandAction(); this.setPropertyValue("titleActions", actions); }; Object.defineProperty(SurveyElement.prototype, "hasTitleActions", { get: function () { return this.getTitleActions().length > 0; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyElement.prototype, "hasTitleEvents", { get: function () { return this.hasTitleActions || this.state !== "default"; }, enumerable: false, configurable: true }); SurveyElement.prototype.getTitleComponentName = function () { var componentName = _rendererFactory__WEBPACK_IMPORTED_MODULE_1__["RendererFactory"].Instance.getRenderer("element", "title-actions"); if (componentName == "default") { return "sv-default-title"; } return componentName; }; Object.defineProperty(SurveyElement.prototype, "titleTabIndex", { get: function () { return !this.isPage && this.state !== "default" ? 0 : undefined; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyElement.prototype, "titleAriaExpanded", { get: function () { if (this.isPage || this.state === "default") return undefined; return this.state === "expanded"; }, enumerable: false, configurable: true }); SurveyElement.prototype.setSurveyImpl = function (value) { this.surveyImplValue = value; if (!this.surveyImplValue) { this.setSurveyCore(null); } else { this.surveyDataValue = this.surveyImplValue.getSurveyData(); this.setSurveyCore(this.surveyImplValue.getSurvey()); this.textProcessorValue = this.surveyImplValue.getTextProcessor(); this.onSetData(); } }; Object.defineProperty(SurveyElement.prototype, "surveyImpl", { get: function () { return this.surveyImplValue; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyElement.prototype, "data", { get: function () { return this.surveyDataValue; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyElement.prototype, "survey", { /** * Returns the survey object. */ get: function () { return this.getSurvey(); }, enumerable: false, configurable: true }); SurveyElement.prototype.getSurvey = function (live) { if (live === void 0) { live = false; } if (!!this.surveyValue) return this.surveyValue; if (!!this.surveyImplValue) { this.setSurveyCore(this.surveyImplValue.getSurvey()); } return this.surveyValue; }; SurveyElement.prototype.setSurveyCore = function (value) { this.surveyValue = value; if (!!this.surveyChangedCallback) { this.surveyChangedCallback(); } }; Object.defineProperty(SurveyElement.prototype, "isDesignMode", { /** * Returns true if the question in design mode right now. */ get: function () { return !!this.survey && this.survey.isDesignMode; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyElement.prototype, "isInternal", { get: function () { return this.isContentElement; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyElement.prototype, "areInvisibleElementsShowing", { get: function () { return (!!this.survey && this.survey.areInvisibleElementsShowing && !this.isContentElement); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyElement.prototype, "isVisible", { get: function () { return true; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyElement.prototype, "isReadOnly", { get: function () { return false; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyElement.prototype, "readOnly", { /** * Set it to true to make an element question/panel/page readonly. * Please note, this property is hidden for question without input, for example html question. * @see enableIf * @see isReadOnly */ get: function () { return this.getPropertyValue("readOnly", false); }, set: function (val) { if (this.readOnly == val) return; this.setPropertyValue("readOnly", val); if (!this.isLoadingFromJson) { this.setPropertyValue("isReadOnly", this.isReadOnly); } }, enumerable: false, configurable: true }); SurveyElement.prototype.onReadOnlyChanged = function () { if (!!this.readOnlyChangedCallback) { this.readOnlyChangedCallback(); } }; Object.defineProperty(SurveyElement.prototype, "css", { get: function () { return !!this.survey ? this.survey.getCss() : {}; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyElement.prototype, "cssClasses", { /** * Returns all css classes that used for rendering the question, panel or page. * You can use survey.onUpdateQuestionCssClasses event to override css classes for a question, survey.onUpdatePanelCssClasses event for a panel and survey.onUpdatePageCssClasses for a page. * @see SurveyModel.updateQuestionCssClasses * @see SurveyModel.updatePanelCssClasses * @see SurveyModel.updatePageCssClasses */ get: function () { if (!this.survey) return this.calcCssClasses(this.css); if (!this.cssClassesValue) { this.cssClassesValue = this.calcCssClasses(this.css); this.updateElementCssCore(this.cssClassesValue); } return this.cssClassesValue; }, enumerable: false, configurable: true }); SurveyElement.prototype.calcCssClasses = function (css) { return undefined; }; SurveyElement.prototype.updateElementCssCore = function (cssClasses) { }; Object.defineProperty(SurveyElement.prototype, "cssError", { get: function () { return ""; }, enumerable: false, configurable: true }); SurveyElement.prototype.updateElementCss = function (reNew) { this.cssClassesValue = undefined; }; SurveyElement.prototype.getIsLoadingFromJson = function () { if (_super.prototype.getIsLoadingFromJson.call(this)) return true; return this.survey ? this.survey.isLoadingFromJson : false; }; Object.defineProperty(SurveyElement.prototype, "name", { /** * This is the identifier of a survey element - question or panel. * @see valueName */ get: function () { return this.getPropertyValue("name", ""); }, set: function (val) { var oldValue = this.name; this.setPropertyValue("name", this.getValidName(val)); if (!this.isLoadingFromJson && !!oldValue) { this.onNameChanged(oldValue); } }, enumerable: false, configurable: true }); SurveyElement.prototype.getValidName = function (name) { return name; }; SurveyElement.prototype.onNameChanged = function (oldValue) { }; SurveyElement.prototype.updateBindingValue = function (valueName, value) { if (!!this.data && !this.isTwoValueEquals(value, this.data.getValue(valueName))) { this.data.setValue(valueName, value, false); } }; Object.defineProperty(SurveyElement.prototype, "errors", { /** * The list of errors. It is created by callig hasErrors functions * @see hasErrors */ get: function () { return this.getPropertyValue("errors"); }, set: function (val) { this.setPropertyValue("errors", val); }, enumerable: false, configurable: true }); SurveyElement.prototype.updateVisibleErrors = function () { var counter = 0; for (var i = 0; i < this.errors.length; i++) { if (this.errors[i].visible) counter++; } this.hasVisibleErrors = counter > 0; }; Object.defineProperty(SurveyElement.prototype, "containsErrors", { /** * Returns true if a question or a container (panel/page) or their chidren have an error. * The value can be out of date. hasErrors function should be called to get the correct value. */ get: function () { return this.getPropertyValue("containsErrors", false); }, enumerable: false, configurable: true }); SurveyElement.prototype.updateContainsErrors = function () { this.setPropertyValue("containsErrors", this.getContainsErrors()); }; SurveyElement.prototype.getContainsErrors = function () { return this.errors.length > 0; }; SurveyElement.prototype.getElementsInDesign = function (includeHidden) { if (includeHidden === void 0) { includeHidden = false; } return []; }; Object.defineProperty(SurveyElement.prototype, "selectedElementInDesign", { get: function () { return this.selectedElementInDesignValue; }, set: function (val) { this.selectedElementInDesignValue = val; }, enumerable: false, configurable: true }); SurveyElement.prototype.updateCustomWidgets = function () { }; SurveyElement.prototype.onSurveyLoad = function () { }; SurveyElement.prototype.onFirstRendering = function () { }; SurveyElement.prototype.endLoadingFromJson = function () { _super.prototype.endLoadingFromJson.call(this); if (!this.survey) { this.onSurveyLoad(); } }; SurveyElement.prototype.setVisibleIndex = function (index) { return 0; }; Object.defineProperty(SurveyElement.prototype, "isPage", { /** * Returns true if it is a page. */ get: function () { return false; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyElement.prototype, "isPanel", { /** * Returns true if it is a panel. */ get: function () { return false; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyElement.prototype, "isQuestion", { /** * Returns true if it is a question. */ get: function () { return false; }, enumerable: false, configurable: true }); SurveyElement.prototype.delete = function () { }; /** * Returns the current survey locale * @see SurveyModel.locale */ SurveyElement.prototype.getLocale = function () { return this.survey ? this.survey.getLocale() : this.locOwner ? this.locOwner.getLocale() : ""; }; SurveyElement.prototype.getMarkdownHtml = function (text, name) { return this.survey ? this.survey.getSurveyMarkdownHtml(this, text, name) : this.locOwner ? this.locOwner.getMarkdownHtml(text, name) : null; }; SurveyElement.prototype.getRenderer = function (name) { return this.survey && typeof this.survey.getRendererForString === "function" ? this.survey.getRendererForString(this, name) : this.locOwner && typeof this.locOwner.getRenderer === "function" ? this.locOwner.getRenderer(name) : null; }; SurveyElement.prototype.getRendererContext = function (locStr) { return this.survey && typeof this.survey.getRendererContextForString === "function" ? this.survey.getRendererContextForString(this, locStr) : this.locOwner && typeof this.locOwner.getRendererContext === "function" ? this.locOwner.getRendererContext(locStr) : locStr; }; SurveyElement.prototype.getProcessedText = function (text) { if (this.isLoadingFromJson) return text; if (this.textProcessor) return this.textProcessor.processText(text, this.getUseDisplayValuesInTitle()); if (this.locOwner) return this.locOwner.getProcessedText(text); return text; }; SurveyElement.prototype.getUseDisplayValuesInTitle = function () { return true; }; SurveyElement.prototype.removeSelfFromList = function (list) { if (!list || !Array.isArray(list)) return; var index = list.indexOf(this); if (index > -1) { list.splice(index, 1); } }; Object.defineProperty(SurveyElement.prototype, "textProcessor", { get: function () { return this.textProcessorValue; }, enumerable: false, configurable: true }); SurveyElement.prototype.getProcessedHtml = function (html) { if (!html || !this.textProcessor) return html; return this.textProcessor.processText(html, true); }; SurveyElement.prototype.onSetData = function () { }; Object.defineProperty(SurveyElement.prototype, "parent", { get: function () { return this.getPropertyValue("parent", null); }, set: function (val) { this.setPropertyValue("parent", val); }, enumerable: false, configurable: true }); SurveyElement.prototype.getPage = function (parent) { while (parent && parent.parent) parent = parent.parent; if (parent && parent.getType() == "page") return parent; return null; }; SurveyElement.prototype.moveToBase = function (parent, container, insertBefore) { if (insertBefore === void 0) { insertBefore = null; } if (!container) return false; parent.removeElement(this); var index = -1; if (_helpers__WEBPACK_IMPORTED_MODULE_6__["Helpers"].isNumber(insertBefore)) { index = parseInt(insertBefore); } if (index == -1 && !!insertBefore && !!insertBefore.getType) { index = container.indexOf(insertBefore); } container.addElement(this, index); return true; }; SurveyElement.prototype.setPage = function (parent, newPage) { var oldPage = this.getPage(parent); //fix for the creator v1: https://github.com/surveyjs/survey-creator/issues/1744 if (typeof newPage === "string") { var survey = this.getSurvey(); survey.pages.forEach(function (page) { if (newPage === page.name) newPage = page; }); } if (oldPage === newPage) return; if (parent) parent.removeElement(this); if (newPage) { newPage.addElement(this, -1); } }; SurveyElement.prototype.getSearchableLocKeys = function (keys) { keys.push("title"); keys.push("description"); }; SurveyElement.CreateDisabledDesignElements = false; __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_0__["property"])({ defaultValue: false }) ], SurveyElement.prototype, "isDragOverMe", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_0__["property"])() ], SurveyElement.prototype, "cssClassesValue", void 0); __decorate([ Object(_jsonobject__WEBPACK_IMPORTED_MODULE_0__["property"])({ defaultValue: false }) ], SurveyElement.prototype, "hasVisibleErrors", void 0); return SurveyElement; }(SurveyElementCore)); /***/ }), /***/ "./src/survey-error.ts": /*!*****************************!*\ !*** ./src/survey-error.ts ***! \*****************************/ /*! exports provided: SurveyError */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyError", function() { return SurveyError; }); /* harmony import */ var _localizablestring__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./localizablestring */ "./src/localizablestring.ts"); var SurveyError = /** @class */ (function () { function SurveyError(text, errorOwner) { if (text === void 0) { text = null; } if (errorOwner === void 0) { errorOwner = null; } this.text = text; this.errorOwner = errorOwner; this.visible = true; } Object.defineProperty(SurveyError.prototype, "locText", { get: function () { if (!this.locTextValue) { this.locTextValue = new _localizablestring__WEBPACK_IMPORTED_MODULE_0__["LocalizableString"](this.errorOwner, true); this.locTextValue.text = this.getText(); } return this.locTextValue; }, enumerable: false, configurable: true }); SurveyError.prototype.getText = function () { var res = this.text; if (!res) res = this.getDefaultText(); if (!!this.errorOwner) { res = this.errorOwner.getErrorCustomText(res, this); } return res; }; SurveyError.prototype.getErrorType = function () { return "base"; }; SurveyError.prototype.getDefaultText = function () { return ""; }; return SurveyError; }()); /***/ }), /***/ "./src/survey.ts": /*!***********************!*\ !*** ./src/survey.ts ***! \***********************/ /*! exports provided: SurveyModel */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyModel", function() { return SurveyModel; }); /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers */ "./src/helpers.ts"); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _survey_element__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./survey-element */ "./src/survey-element.ts"); /* harmony import */ var _defaultCss_cssstandard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./defaultCss/cssstandard */ "./src/defaultCss/cssstandard.ts"); /* harmony import */ var _page__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./page */ "./src/page.ts"); /* harmony import */ var _textPreProcessor__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./textPreProcessor */ "./src/textPreProcessor.ts"); /* harmony import */ var _conditionProcessValue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./conditionProcessValue */ "./src/conditionProcessValue.ts"); /* harmony import */ var _dxSurveyService__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./dxSurveyService */ "./src/dxSurveyService.ts"); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./surveyStrings */ "./src/surveyStrings.ts"); /* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./error */ "./src/error.ts"); /* harmony import */ var _localizablestring__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./localizablestring */ "./src/localizablestring.ts"); /* harmony import */ var _stylesmanager__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./stylesmanager */ "./src/stylesmanager.ts"); /* harmony import */ var _surveytimer__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./surveytimer */ "./src/surveytimer.ts"); /* harmony import */ var _conditions__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./conditions */ "./src/conditions.ts"); /* harmony import */ var _settings__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./settings */ "./src/settings.ts"); /* harmony import */ var _utils_utils__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./utils/utils */ "./src/utils/utils.ts"); /* harmony import */ var _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./utils/cssClassBuilder */ "./src/utils/cssClassBuilder.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); /** * The `Survey` object contains information about the survey, Pages, Questions, flow logic and etc. */ var SurveyModel = /** @class */ (function (_super) { __extends(SurveyModel, _super); //#endregion function SurveyModel(jsonObj) { if (jsonObj === void 0) { jsonObj = null; } var _this = _super.call(this) || this; _this.valuesHash = {}; _this.variablesHash = {}; _this.localeValue = ""; _this.completedStateValue = ""; _this.completedStateTextValue = ""; _this.isTimerStarted = false; //#region Event declarations /** * The event is fired before the survey is completed and the `onComplete` event is fired. You can prevent the survey from completing by setting `options.allowComplete` to `false` *
`sender` - the survey object that fires the event. *
`options.allowComplete` - Specifies whether a user can complete a survey. Set this property to `false` to prevent the survey from completing. The default value is `true`. *
`options.isCompleteOnTrigger` - returns true if the survey is completing on "complete" trigger. * @see onComplete */ _this.onCompleting = _this.addEvent(); /** * The event is fired after a user clicks the 'Complete' button and finishes a survey. Use this event to send the survey data to your web server. *
`sender` - the survey object that fires the event. *
`options.showDataSaving(text)` - call this method to show that the survey is saving survey data on your server. The `text` is an optional parameter to show a custom message instead of default. *
`options.showDataSavingError(text)` - call this method to show that an error occurred while saving the data on your server. If you want to show a custom error, use an optional `text` parameter. *
`options.showDataSavingSuccess(text)` - call this method to show that the data was successfully saved on the server. *
`options.showDataSavingClear` - call this method to hide the text about the saving progress. *
`options.isCompleteOnTrigger` - returns true if the survey is completed on "complete" trigger. * @see data * @see clearInvisibleValues * @see completeLastPage * @see surveyPostId */ _this.onComplete = _this.addEvent(); /** * The event is fired before the survey is going to preview mode, state equals to `preview`. It happens when a user click on "Preview" button. It shows when "showPreviewBeforeComplete" proeprty equals to "showAllQuestions" or "showAnsweredQuestions". * You can prevent showing it by setting allowShowPreview to `false`. *
`sender` - the survey object that fires the event. *
`options.allowShowPreview` - Specifies whether a user can see a preview. Set this property to `false` to prevent from showing the preview. The default value is `true`. * @see showPreviewBeforeComplete */ _this.onShowingPreview = _this.addEvent(); /** * The event is fired after a user clicks the 'Complete' button. The event allows you to specify the URL opened after completing a survey. * Specify the `navigateToUrl` property to make survey navigate to another url. *
`sender` - the survey object that fires the event. *
`options.url` - Specifies a URL opened after completing a survey. Set this property to an empty string to cancel the navigation and show the completed survey page. * @see navigateToUrl * @see navigateToUrlOnCondition */ _this.onNavigateToUrl = _this.addEvent(); /** * The event is fired after the survey changed it's state from "starting" to "running". The "starting" state means that survey shows the started page. * The `firstPageIsStarted` property should be set to `true`, if you want to display a start page in your survey. In this case, an end user should click the "Start" button to start the survey. * @see firstPageIsStarted */ _this.onStarted = _this.addEvent(); /** * The event is fired on clicking the 'Next' button if the `sendResultOnPageNext` is set to `true`. You can use it to save the intermediate results, for example, if your survey is large enough. *
`sender` - the survey object that fires the event. * @see sendResultOnPageNext */ _this.onPartialSend = _this.addEvent(); /** * The event is fired before the current page changes to another page. Typically it happens when a user click the 'Next' or 'Prev' buttons. *
`sender` - the survey object that fires the event. *
`option.oldCurrentPage` - the previous current/active page. *
`option.newCurrentPage` - a new current/active page. *
`option.allowChanging` - set it to `false` to disable the current page changing. It is `true` by default. *
`option.isNextPage` - commonly means, that end-user press the next page button. In general, it means that options.newCurrentPage is the next page after options.oldCurrentPage *
`option.isPrevPage` - commonly means, that end-user press the previous page button. In general, it means that options.newCurrentPage is the previous page before options.oldCurrentPage * @see currentPage * @see currentPageNo * @see nextPage * @see prevPage * @see completeLastPage * @see onCurrentPageChanged **/ _this.onCurrentPageChanging = _this.addEvent(); /** * The event is fired when the current page has been changed to another page. Typically it happens when a user click on 'Next' or 'Prev' buttons. *
`sender` - the survey object that fires the event. *
`option.oldCurrentPage` - a previous current/active page. *
`option.newCurrentPage` - a new current/active page. *
`option.isNextPage` - commonly means, that end-user press the next page button. In general, it means that options.newCurrentPage is the next page after options.oldCurrentPage *
`option.isPrevPage` - commonly means, that end-user press the previous page button. In general, it means that options.newCurrentPage is the previous page before options.oldCurrentPage * @see currentPage * @see currentPageNo * @see nextPage * @see prevPage * @see completeLastPage * @see onCurrentPageChanging */ _this.onCurrentPageChanged = _this.addEvent(); /** * The event is fired before the question value (answer) is changed. It can be done via UI by a user or programmatically on calling the `setValue` method. *
`sender` - the survey object that fires the event. *
`options.name` - the value name that has being changed. *
`options.question` - a question which `question.name` equals to the value name. If there are several questions with the same name, the first question is used. If there is no such questions, the `options.question` is null. *
`options.oldValue` - an old, previous value. *
`options.value` - a new value. You can change it. * @see setValue * @see onValueChanged */ _this.onValueChanging = _this.addEvent(); /** * The event is fired when the question value (i.e., answer) has been changed. The question value can be changed in UI (by a user) or programmatically (on calling `setValue` method). * Use the `onDynamicPanelItemValueChanged` and `onMatrixCellValueChanged` events to handle changes in a question in the Panel Dynamic and a cell question in matrices. *
`sender` - the survey object that fires the event. *
`options.name` - the value name that has been changed. *
`options.question` - a question which `question.name` equals to the value name. If there are several questions with the same name, the first question is used. If there is no such questions, the `options.question` is `null`. *
`options.value` - a new value. * @see setValue * @see onValueChanging * @see onDynamicPanelItemValueChanged * @see onMatrixCellValueChanged */ _this.onValueChanged = _this.addEvent(); /** * The event is fired when setVariable function is called. It can be called on changing a calculated value. *
`sender` - the survey object that fires the event. *
`options.name` - the variable name that has been changed. *
`options.value` - a new value. * @see setVariable * @see onValueChanged * @see calculatedValues */ _this.onVariableChanged = _this.addEvent(); /** * The event is fired when a question visibility has been changed. *
`sender` - the survey object that fires the event. *
`options.question` - a question which visibility has been changed. *
`options.name` - a question name. *
`options.visible` - a question `visible` boolean value. * @see Question.visibile * @see Question.visibileIf */ _this.onVisibleChanged = _this.addEvent(); /** * The event is fired on changing a page visibility. *
`sender` - the survey object that fires the event. *
`options.page` - a page which visibility has been changed. *
`options.visible` - a page `visible` boolean value. * @see PageModel.visibile * @see PageModel.visibileIf */ _this.onPageVisibleChanged = _this.addEvent(); /** * The event is fired on changing a panel visibility. *
`sender` - the survey object that fires the event. *
`options.panel` - a panel which visibility has been changed. *
`options.visible` - a panel `visible` boolean value. * @see PanelModel.visibile * @see PanelModel.visibileIf */ _this.onPanelVisibleChanged = _this.addEvent(); /** * The event is fired on creating a new question. * Unlike the onQuestionAdded event, this event calls for all question created in survey including inside: a page, panel, matrix cell, dynamic panel and multiple text. * or inside a matrix cell or it can be a text question in multiple text items or inside a panel of a panel dynamic. * You can use this event to set up properties to a question based on it's type for all questions, regardless where they are located, on the page or inside a matrix cell. * Please note: If you want to use this event for questions loaded from JSON then you have to create survey with empty/null JSON parameter, assign the event and call survey.fromJSON(yourJSON) function. *
`sender` - the survey object that fires the event. *
`options.question` - a newly created question object. * @see Question * @see onQuestionAdded */ _this.onQuestionCreated = _this.addEvent(); /** * The event is fired on adding a new question into survey. *
`sender` - the survey object that fires the event. *
`options.question` - a newly added question object. *
`options.name` - a question name. *
`options.index` - an index of the question in the container (page or panel). *
`options.parentPanel` - a container where a new question is located. It can be a page or panel. *
`options.rootPanel` - typically, it is a page. * @see Question * @see onQuestionCreated */ _this.onQuestionAdded = _this.addEvent(); /** * The event is fired on removing a question from survey. *
`sender` - the survey object that fires the event. *
`options.question` - a removed question object. *
`options.name` - a question name. * @see Question */ _this.onQuestionRemoved = _this.addEvent(); /** * The event is fired on adding a panel into survey. *
`sender` - the survey object that fires the event. *
`options.panel` - a newly added panel object. *
`options.name` - a panel name. *
`options.index` - an index of the panel in the container (a page or panel). *
`options.parentPanel` - a container (a page or panel) where a new panel is located. *
`options.rootPanel` - a root container, typically it is a page. * @see PanelModel */ _this.onPanelAdded = _this.addEvent(); /** * The event is fired on removing a panel from survey. *
`sender` - the survey object that fires the event. *
`options.panel` - a removed panel object. *
`options.name` - a panel name. * @see PanelModel */ _this.onPanelRemoved = _this.addEvent(); /** * The event is fired on adding a page into survey. *
`sender` - the survey object that fires the event. *
`options.page` - a newly added `panel` object. * @see PanelModel */ _this.onPageAdded = _this.addEvent(); /** * The event is fired on validating value in a question. You can specify a custom error message using `options.error`. The survey blocks completing the survey or going to the next page when the error messages are displayed. *
`sender` - the survey object that fires the event. *
`options.question` - a validated question. *
`options.name` - a question name. *
`options.value` - the current question value (answer). *
`options.error` - an error string. It is empty by default. * @see onServerValidateQuestions * @see onSettingQuestionErrors */ _this.onValidateQuestion = _this.addEvent(); /** * The event is fired before errors are assigned to a question. You may add/remove/modify errors for a question. *
`sender` - the survey object that fires the event. *
`options.question` - a validated question. *
`options.errors` - the list of errors. The list is empty by default and remains empty if a validated question has no errors. * @see onValidateQuestion */ _this.onSettingQuestionErrors = _this.addEvent(); /** * Use this event to validate data on your server. *
`sender` - the survey object that fires the event. *
`options.data` - the values of all non-empty questions on the current page. You can get a question value as `options.data["myQuestionName"]`. *
`options.errors` - set your errors to this object as: `options.errors["myQuestionName"] = "Error text";`. It will be shown as a question error. *
`options.complete()` - call this function to tell survey that your server callback has been processed. * @see onValidateQuestion * @see onValidatePanel */ _this.onServerValidateQuestions = _this.addEvent(); /** * Use this event to modify the HTML before rendering, for example HTML on a completed page. *
`sender` - the survey object that fires the event. *
`options.html` - an HTML that you may change before text processing and then rendering. * @see completedHtml * @see loadingHtml * @see QuestionHtmlModel.html */ /** * The event is fired on validating a panel. Set your error to `options.error` and survey will show the error for the panel and block completing the survey or going to the next page. *
`sender` - the survey object that fires the event. *
`options.name` - a panel name. *
`options.error` - an error string. It is empty by default. * @see onValidateQuestion */ _this.onValidatePanel = _this.addEvent(); /** * Use the event to change the default error text. *
`sender` - the survey object that fires the event. *
`options.text` - an error text. *
`options.error` - an instance of the `SurveyError` object. *
`options.name` - the error name. The following error names are available: * required, requireoneanswer, requirenumeric, exceedsize, webrequest, webrequestempty, otherempty, * uploadingfile, requiredinallrowserror, minrowcounterror, keyduplicationerror, custom */ _this.onErrorCustomText = _this.addEvent(); /** * Use the this event to be notified when the survey finished validate questions on the current page. It commonly happens when a user try to go to the next page or complete the survey * options.questions - the list of questions that have errors * options.errors - the list of errors * options.page - the page where question(s) are located */ _this.onValidatedErrorsOnCurrentPage = _this.addEvent(); /** * Use this event to modify the HTML content before rendering, for example `completeHtml` or `loadingHtml`. * `options.html` - specifies the modified HTML content. * @see completedHtml * @see loadingHtml */ _this.onProcessHtml = _this.addEvent(); /** * Use this event to change the question title in code. If you want to remove question numbering then set showQuestionNumbers to "off". *
`sender` - the survey object that fires the event. *
`options.title` - a calculated question title, based on question `title`, `name`. *
`options.question` - a question object. * @see showQuestionNumbers * @see requiredText */ _this.onGetQuestionTitle = _this.addEvent(); /** * Use this event to change the element title tag name that renders by default. *
`sender` - the survey object that fires the event. *
`options.element` - an element (question, panel, page and survey) that SurveyJS is going to render. *
`options.tagName` - an element title tagName that are used to render a title. You can change it from the default value. * @see showQuestionNumbers * @see requiredText */ _this.onGetTitleTagName = _this.addEvent(); /** * Use this event to change the question no in code. If you want to remove question numbering then set showQuestionNumbers to "off". *
`sender` - the survey object that fires the event. *
`options.no` - a calculated question no, based on question `visibleIndex`, survey `.questionStartIndex` properties. You can change it. *
`options.question` - a question object. * @see showQuestionNumbers * @see questionStartIndex */ _this.onGetQuestionNo = _this.addEvent(); /** * Use this event to change the progress text in code. *
`sender` - the survey object that fires the event. *
`options.text` - a progress text, that SurveyJS will render in progress bar. *
`options.questionCount` - a number of questions that have input(s). We do not count html or expression questions *
`options.answeredQuestionCount` - a number of questions that have input(s) and an user has answered. *
`options.requiredQuestionCount` - a number of required questions that have input(s). We do not count html or expression questions *
`options.requiredAnsweredQuestionCount` - a number of required questions that have input(s) and an user has answered. * @see progressBarType */ _this.onProgressText = _this.addEvent(); /** * Use this event to process the markdown text. *
`sender` - the survey object that fires the event. *
`options.element` - SurveyJS element (a question, panel, page, or survey) where the string is going to be rendered. *
`options.name` - a property name is going to be rendered. *
`options.text` - a text that is going to be rendered. *
`options.html` - an HTML content. It is `null` by default. Use this property to specify the HTML content rendered instead of `options.text`. */ _this.onTextMarkdown = _this.addEvent(); /** * Use this event to specity render component name used for text rendering. *
`sender` - the survey object that fires the event. *
`options.element` - SurveyJS element (a question, panel, page, or survey) where the string is going to be rendered. *
`options.name` - a property name is going to be rendered. *
`options.renderAs` - a component name used for text rendering. */ _this.onTextRenderAs = _this.addEvent(); /** * The event fires when it gets response from the [api.surveyjs.io](https://api.surveyjs.io) service on saving survey results. Use it to find out if the results have been saved successfully. *
`sender` - the survey object that fires the event. *
`options.success` - it is `true` if the results has been sent to the service successfully. *
`options.response` - a response from the service. */ _this.onSendResult = _this.addEvent(); /** * Use it to get results after calling the `getResult` method. It returns a simple analytics from [api.surveyjs.io](https://api.surveyjs.io) service. *
`sender` - the survey object that fires the event. *
`options.success` - it is `true` if the results were got from the service successfully. *
`options.data` - the object `{AnswersCount, QuestionResult : {} }`. `AnswersCount` is the number of posted survey results. `QuestionResult` is an object with all possible unique answers to the question and number of these answers. *
`options.dataList` - an array of objects `{name, value}`, where `name` is a unique value/answer to the question and `value` is a number/count of such answers. *
`options.response` - the server response. * @see getResult */ _this.onGetResult = _this.addEvent(); /** * The event is fired on uploading the file in QuestionFile when `storeDataAsText` is set to `false`. Use this event to change the uploaded file name or to prevent a particular file from being uploaded. *
`sender` - the survey object that fires the event. *
`options.question` - the file question instance. *
`options.name` - the question name. *
`options.files` - the Javascript File objects array to upload. *
`options.callback` - a callback function to get the file upload status and the updloaded file content. * @see uploadFiles * @see QuestionFileModel.storeDataAsText * @see onDownloadFile * @see onClearFiles * @see [View Examples](https://www.google.com/search?q=site%3Ahttps%3A%2F%2Fsurveyjs.io%2FExamples%2F+%22onUploadFiles%22) */ _this.onUploadFiles = _this.addEvent(); /** * The event is fired on downloading a file in QuestionFile. Use this event to pass the file to a preview. *
`sender` - the survey object that fires the event. *
`options.name` - the question name. *
`options.content` - the file content. *
`options.fileValue` - single file question value. *
`options.callback` - a callback function to get the file downloading status and the downloaded file content. * @see downloadFile * @see onClearFiles * @see onUploadFiles * @see [View Examples](https://www.google.com/search?q=site%3Ahttps%3A%2F%2Fsurveyjs.io%2FExamples%2F+%22onDownloadFile%22) */ _this.onDownloadFile = _this.addEvent(); /** * This event is fired on clearing the value in a QuestionFile. Use this event to remove files stored on your server. *
`sender` - the survey object that fires the event. *
`question` - the question instance. *
`options.name` - the question name. *
`options.value` - the question value. *
`options.fileName` - a removed file's name, set it to `null` to clear all files. *
`options.callback` - a callback function to get the operation status. * @see clearFiles * @see onDownloadFile * @see onUploadFiles * @see [View Examples](https://www.google.com/search?q=site%3Ahttps%3A%2F%2Fsurveyjs.io%2FExamples%2F+%22onClearFiles%22) */ _this.onClearFiles = _this.addEvent(); /** * The event is fired after choices for radiogroup, checkbox, and dropdown has been loaded from a RESTful service and before they are assigned to a question. * You may change the choices, before they are assigned or disable/enabled make visible/invisible question, based on loaded results. *
`sender` - the survey object that fires the event. *
`question` - the question where loaded choices are going to be assigned. *
`choices` - the loaded choices. You can change the loaded choices to before they are assigned to question. *
`serverResult` - a result that comes from the server as it is. */ _this.onLoadChoicesFromServer = _this.addEvent(); /** * The event is fired after survey is loaded from api.surveyjs.io service. * You can use this event to perform manipulation with the survey model after it was loaded from the web service. *
`sender` - the survey object that fires the event. * @see surveyId * @see loadSurveyFromService */ _this.onLoadedSurveyFromService = _this.addEvent(); /** * The event is fired on processing the text when it finds a text in brackets: `{somevalue}`. By default, it uses the value of survey question values and variables. * For example, you may use the text processing in loading choices from the web. If your `choicesByUrl.url` equals to "UrlToServiceToGetAllCities/{country}/{state}", * you may set on this event `options.value` to "all" or empty string when the "state" value/question is non selected by a user. *
`sender` - the survey object that fires the event. *
`options.name` - the name of the processing value, for example, "state" in our example. *
`options.value` - the value of the processing text. *
`options.isExists` - a boolean value. Set it to `true` if you want to use the value and set it to `false` if you don't. */ _this.onProcessTextValue = _this.addEvent(); /** * The event is fired before rendering a question. Use it to override the default question CSS classes. *
`sender` - the survey object that fires the event. *
`options.question` - a question for which you can change the CSS classes. *
`options.cssClasses` - an object with CSS classes. For example `{root: "table", button: "button"}`. You can change them to your own CSS classes. */ _this.onUpdateQuestionCssClasses = _this.addEvent(); /** * The event is fired before rendering a panel. Use it to override the default panel CSS classes. *
`sender` - the survey object that fires the event. *
`options.panel` - a panel for which you can change the CSS classes. *
`options.cssClasses` - an object with CSS classes. For example `{title: "sv_p_title", description: "small"}`. You can change them to your own CSS classes. */ _this.onUpdatePanelCssClasses = _this.addEvent(); /** * The event is fired before rendering a page. Use it to override the default page CSS classes. *
`sender` - the survey object that fires the event. *
`options.page` - a page for which you can change the CSS classes. *
`options.cssClasses` - an object with CSS classes. For example `{title: "sv_p_title", description: "small"}`. You can change them to your own CSS classes. */ _this.onUpdatePageCssClasses = _this.addEvent(); /** * The event is fired before rendering a choice item in radiogroup, checkbox or dropdown questions. Use it to override the default choice item css. *
`sender` - the survey object that fires the event. *
`options.question` - a question where choice item is rendered. *
`options.item` - a choice item of ItemValue type. You can get value or text choice properties as options.item.value or options.choice.text *
`options.css` - a string with css classes divided by space. You can change it. */ _this.onUpdateChoiceItemCss = _this.addEvent(); /** * The event is fired right after survey is rendered in DOM. *
`sender` - the survey object that fires the event. *
`options.htmlElement` - a root HTML element bound to the survey object. */ _this.onAfterRenderSurvey = _this.addEvent(); /** * The event is fired right after a page is rendered in DOM. Use it to modify HTML elements. *
`sender` - the survey object that fires the event. *
`options.htmlElement` - an HTML element bound to the survey header object. */ _this.onAfterRenderHeader = _this.addEvent(); /** * The event is fired right after a page is rendered in DOM. Use it to modify HTML elements. *
`sender` - the survey object that fires the event. *
`options.page` - a page object for which the event is fired. Typically the current/active page. *
`options.htmlElement` - an HTML element bound to the page object. */ _this.onAfterRenderPage = _this.addEvent(); /** * The event is fired right after a question is rendered in DOM. Use it to modify HTML elements. *
`sender` - the survey object that fires the event. *
`options.question` - a question object for which the event is fired. *
`options.htmlElement` - an HTML element bound to the question object. */ _this.onAfterRenderQuestion = _this.addEvent(); /** * The event is fired right after a non-composite question (text, comment, dropdown, radiogroup, checkbox) is rendered in DOM. Use it to modify HTML elements. * This event is not fired for matrices, panels, multiple text and image picker. *
`sender` - the survey object that fires the event. *
`options.question` - a question object for which the event is fired. *
`options.htmlElement` - an HTML element bound to the question object. */ _this.onAfterRenderQuestionInput = _this.addEvent(); /** * The event is fired right after a panel is rendered in DOM. Use it to modify HTML elements. *
`sender` - the survey object that fires the event *
`options.panel` - a panel object for which the event is fired *
`options.htmlElement` - an HTML element bound to the panel object */ _this.onAfterRenderPanel = _this.addEvent(); /** * The event is fired on adding a new row in Matrix Dynamic question. *
`sender` - the survey object that fires the event *
`options.question` - a matrix question. *
`options.row` - a new added row. * @see QuestionMatrixDynamicModel * @see QuestionMatrixDynamicModel.visibleRows */ _this.onMatrixRowAdded = _this.addEvent(); /** * The event is fired before adding a new row in Matrix Dynamic question. *
`sender` - the survey object that fires the event *
`options.question` - a matrix question. *
`options.canAddRow` - specifies whether a new row can be added * @see QuestionMatrixDynamicModel * @see QuestionMatrixDynamicModel.visibleRows */ _this.onMatrixBeforeRowAdded = _this.addEvent(); /** * The event is fired before removing a row from Matrix Dynamic question. You can disable removing and clear the data instead. *
`sender` - the survey object that fires the event *
`options.question` - a matrix question. *
`options.rowIndex` - a row index. *
`options.row` - a row object. *
`options.allow` - a boolean property. Set it to `false` to disable the row removing. * @see QuestionMatrixDynamicModel * @see onMatrixRowRemoved * @see onMatrixAllowRemoveRow */ _this.onMatrixRowRemoving = _this.addEvent(); /** * The event is fired on removing a row from Matrix Dynamic question. *
`sender` - the survey object that fires the event *
`options.question` - a matrix question *
`options.rowIndex` - a removed row index *
`options.row` - a removed row object * @see QuestionMatrixDynamicModel * @see QuestionMatrixDynamicModel.visibleRows * @see onMatrixRowRemoving * @see onMatrixAllowRemoveRow */ _this.onMatrixRowRemoved = _this.addEvent(); /** * The event is fired before rendering "Remove" button for removing a row from Matrix Dynamic question. *
`sender` - the survey object that fires the event *
`options.question` - a matrix question. *
`options.rowIndex` - a row index. *
`options.row` - a row object. *
`options.allow` - a boolean property. Set it to `false` to disable the row removing. * @see QuestionMatrixDynamicModel * @see onMatrixRowRemoving * @see onMatrixRowRemoved */ _this.onMatrixAllowRemoveRow = _this.addEvent(); /** * The event is fired before creating cell question in the matrix. You can change the cell question type by setting different options.cellType. *
`sender` - the survey object that fires the event. *
`options.question` - the matrix question. *
`options.cellType` - the cell question type. You can change it. *
`options.rowValue` - the value of the current row. To access a particular column's value within the current row, use: `options.rowValue["columnValue"]`. *
`options.column` - the matrix column object. *
`options.columnName` - the matrix column name. *
`options.row` - the matrix row object. * @see onMatrixBeforeRowAdded * @see onMatrixCellCreated * @see QuestionMatrixDynamicModel * @see QuestionMatrixDropdownModel */ _this.onMatrixCellCreating = _this.addEvent(); /** * The event is fired for every cell created in Matrix Dynamic and Matrix Dropdown questions. *
`sender` - the survey object that fires the event. *
`options.question` - the matrix question. *
`options.cell` - the matrix cell. *
`options.cellQuestion` - the question/editor in the cell. You may customize it, change it's properties, like choices or visible. *
`options.rowValue` - the value of the current row. To access a particular column's value within the current row, use: `options.rowValue["columnValue"]`. *
`options.column` - the matrix column object. *
`options.columnName` - the matrix column name. *
`options.row` - the matrix row object. * @see onMatrixBeforeRowAdded * @see onMatrixCellCreating * @see onMatrixRowAdded * @see QuestionMatrixDynamicModel * @see QuestionMatrixDropdownModel */ _this.onMatrixCellCreated = _this.addEvent(); /** * The event is fired for every cell after is has been rendered in DOM. *
`sender` - the survey object that fires the event. *
`options.question` - the matrix question. *
`options.cell` - the matrix cell. *
`options.cellQuestion` - the question/editor in the cell. *
`options.htmlElement` - an HTML element bound to the `cellQuestion` object. *
`options.column` - the matrix column object. *
`options.row` - the matrix row object. * @see onMatrixCellCreated * @see QuestionMatrixDynamicModel * @see QuestionMatrixDropdownModel */ _this.onMatrixAfterCellRender = _this.addEvent(); /** * The event is fired when cell value is changed in Matrix Dynamic and Matrix Dropdown questions. *
`sender` - the survey object that fires the event. *
`options.question` - the matrix question. *
`options.columnName` - the matrix column name. *
`options.value` - a new value. *
`options.row` - the matrix row object. *
`options.getCellQuestion(columnName)` - the function that returns the cell question by column name. * @see onMatrixCellValueChanging * @see onMatrixBeforeRowAdded * @see onMatrixRowAdded * @see QuestionMatrixDynamicModel * @see QuestionMatrixDropdownModel */ _this.onMatrixCellValueChanged = _this.addEvent(); /** * The event is fired on changing cell value in Matrix Dynamic and Matrix Dropdown questions. You may change the `options.value` property to change a cell value. *
`sender` - the survey object that fires the event. *
`options.question` - the matrix question. *
`options.columnName` - the matrix column name. *
`options.value` - a new value. *
`options.oldValue` - the old value. *
`options.row` - the matrix row object. *
`options.getCellQuestion(columnName)` - the function that returns a cell question by column name. * @see onMatrixCellValueChanged * @see onMatrixBeforeRowAdded * @see onMatrixRowAdded * @see QuestionMatrixDynamicModel * @see QuestionMatrixDropdownModel */ _this.onMatrixCellValueChanging = _this.addEvent(); /** * The event is fired when Matrix Dynamic and Matrix Dropdown questions validate the cell value. *
`sender` - the survey object that fires the event. *
`options.error` - an error string. It is empty by default. *
`options.question` - the matrix question. *
`options.columnName` - the matrix column name. *
`options.value` - a cell value. *
`options.row` - the matrix row object. *
`options.getCellQuestion(columnName)` - the function that returns the cell question by column name. * @see onMatrixBeforeRowAdded * @see onMatrixRowAdded * @see QuestionMatrixDynamicModel * @see QuestionMatrixDropdownModel */ _this.onMatrixCellValidate = _this.addEvent(); /** * The event is fired on adding a new panel in Panel Dynamic question. *
`sender` - the survey object that fires the event. *
`options.question` - a panel question. *
`options.panel` - an added panel. * @see QuestionPanelDynamicModel * @see QuestionPanelDynamicModel.panels */ _this.onDynamicPanelAdded = _this.addEvent(); /** * The event is fired on removing a panel from Panel Dynamic question. *
`sender` - the survey object that fires the event. *
`options.question` - a panel question. *
`options.panelIndex` - a removed panel index. *
`options.panel` - a removed panel. * @see QuestionPanelDynamicModel * @see QuestionPanelDynamicModel.panels */ _this.onDynamicPanelRemoved = _this.addEvent(); /** * The event is fired every second if the method `startTimer` has been called. * @see startTimer * @see timeSpent * @see Page.timeSpent */ _this.onTimer = _this.addEvent(); /** * The event is fired before displaying a new information in the Timer Panel. Use it to change the default text. *
`sender` - the survey object that fires the event. *
`options.text` - the timer panel info text. */ _this.onTimerPanelInfoText = _this.addEvent(); /** * The event is fired when item value is changed in Panel Dynamic question. *
`sender` - the survey object that fires the event. *
`options.question` - the panel question. *
`options.panel` - the dynamic panel item. *
`options.name` - the item name. *
`options.value` - a new value. *
`options.itemIndex` - the panel item index. *
`options.itemValue` - the panel item object. * @see onDynamicPanelAdded * @see QuestionPanelDynamicModel */ _this.onDynamicPanelItemValueChanged = _this.addEvent(); /** * Use this event to define, whether an answer to a question is correct or not. *
`sender` - the survey object that fires the event. *
`options.question` - a question on which you have to decide if the answer is correct or not. *
`options.result` - returns `true`, if an answer is correct, or `false`, if the answer is not correct. Use questions' `value` and `correctAnswer` properties to return the correct value. *
`options.correctAnswers` - you may change the default number of correct or incorrect answers in the question, for example for matrix, where each row is a quiz question. * @see Question.value * @see Question.correctAnswer */ _this.onIsAnswerCorrect = _this.addEvent(); /** * Use this event to control drag&drop operations during design mode. *
`sender` - the survey object that fires the event. *
`options.allow` - set it to `false` to disable dragging. *
`options.target` - a target element that is dragged. *
`options.source` - a source element. It can be `null`, if it is a new element, dragging from toolbox. *
`options.parent` - a page or panel where target element is dragging. *
`options.insertBefore` - an element before the target element is dragging. It can be `null` if parent container (page or panel) is empty or dragging an element after the last element in a container. *
`options.insertAfter` - an element after the target element is dragging. It can be `null` if parent container (page or panel) is empty or dragging element to the first position within the parent container. * @see setDesignMode * @see isDesignMode */ _this.onDragDropAllow = _this.addEvent(); /** * Use this event to control scrolling element to top. You can cancel the default behavior by setting options.cancel property to true. *
`sender` - the survey object that fires the event. *
`options.element` - an element that is going to be scrolled on top. *
`options.question` - a question that is going to be scrolled on top. It can be null if options.page is not null. *
`options.page` - a page that is going to be scrolled on top. It can be null if options.question is not null. *
`options.elementId` - the unique element DOM Id. *
`options.cancel` - set this property to true to cancel the default scrolling. */ _this.onScrollingElementToTop = _this.addEvent(); _this.onLocaleChangedEvent = _this.addEvent(); /** * Use this event to create/customize actions to be displayed in a question's title. *
`sender` - A [Survey](https://surveyjs.io/Documentation/Library?id=SurveyModel) object that fires the event. *
`options.question` - A [Question](https://surveyjs.io/Documentation/Library?id=Question) object for which the event is fired. *
`options.titleActions` - A list of actions ([IAction](https://surveyjs.io/Documentation/Library?id=IAction) objects) associated with the processed question. * @see IAction * @see Question */ _this.onGetQuestionTitleActions = _this.addEvent(); /** * Use this event to create/customize actions to be displayed in a panel's title. *
`sender` - A survey object that fires the event. *
`options.panel` - A panel ([PanelModel](https://surveyjs.io/Documentation/Library?id=panelmodel) object) for which the event is fired. *
`options.titleActions` - A list of actions ([IAction](https://surveyjs.io/Documentation/Library?id=IAction) objects) associated with the processed panel. * @see IAction * @see PanelModel */ _this.onGetPanelTitleActions = _this.addEvent(); /** * Use this event to create/customize actions to be displayed in a page's title. *
`sender` - A survey object that fires the event. *
`options.page` - A page ([PageModel](https://surveyjs.io/Documentation/Library?id=pagemodel) object) for which the event is fired. *
`options.titleActions` - A list of actions ([IAction](https://surveyjs.io/Documentation/Library?id=IAction) objects) associated with the processed page. * @see IAction * @see PageModel */ _this.onGetPageTitleActions = _this.addEvent(); /** * Use this event to create/customize actions to be displayed in a matrix question's row. *
`sender` - A survey object that fires the event. *
`options.question` - A matrix question ([QuestionMatrixBaseModel](https://surveyjs.io/Documentation/Library?id=questionmatrixbasemodel) object) for which the event is fired. *
`options.row` - A matrix row for which the event is fired. *
`options.actions` - A list of actions ([IAction](https://surveyjs.io/Documentation/Library?id=IAction) objects) associated with the processed matrix question and row. * @see IAction * @see QuestionMatrixDropdownModelBase */ _this.onGetMatrixRowActions = _this.addEvent(); /** * The event is fired after the survey element content was collapsed or expanded. *
`sender` - the survey object that fires the event. *
`options.element` - Specifies which survey element content was collapsed or expanded. * @see onElementContentVisibilityChanged */ _this.onElementContentVisibilityChanged = _this.addEvent(); /** * The event is fired before expression question convert it's value into display value for rendering. *
`sender` - the survey object that fires the event. *
`options.question` - The expression question. *
`options.value` - The question value. *
`options.displayValue` - the display value that you can change before rendering. */ _this.onGetExpressionDisplayValue = _this.addEvent(); /** * The list of errors on loading survey JSON. If the list is empty after loading a JSON, then the JSON is correct and has no errors. * @see JsonError */ _this.jsonErrors = null; _this.cssValue = null; /** * Gets or sets whether to hide all required errors. */ _this.hideRequiredErrors = false; //#endregion _this._isMobile = false; _this._isDesignMode = false; /** * Gets or sets whether the survey must ignore validation like required questions and others, on `nextPage` and `completeLastPage` function calls. The default is `false`. * @see nextPage * @see completeLastPage * @see mode */ _this.ignoreValidation = false; _this.isNavigationButtonPressed = false; _this.isCalculatingProgressText = false; _this.isTriggerIsRunning = false; _this.triggerValues = null; _this.triggerKeys = null; _this.conditionValues = null; _this.isValueChangedOnRunningCondition = false; _this.conditionRunnerCounter = 0; _this.conditionUpdateVisibleIndexes = false; _this.conditionNotifyElementsOnAnyValueOrVariableChanged = false; _this.isEndLoadingFromJson = null; _this.questionHashes = { names: {}, namesInsensitive: {}, valueNames: {}, valueNamesInsensitive: {}, }; _this.timerFunc = null; /** * Returns the time in seconds an end user spends on the survey * @see startTimer * @see PageModel.timeSpent */ _this.timeSpent = 0; _this.skeletonComponentName = "sv-skeleton"; if (typeof document !== "undefined") { SurveyModel.stylesManager = new _stylesmanager__WEBPACK_IMPORTED_MODULE_11__["StylesManager"](); } _this.createLocalizableString("logo", _this, false); _this.createLocalizableString("completedHtml", _this); _this.createLocalizableString("completedBeforeHtml", _this); _this.createLocalizableString("loadingHtml", _this); _this.createLocalizableString("startSurveyText", _this, false, true); _this.createLocalizableString("pagePrevText", _this, false, true); _this.createLocalizableString("pageNextText", _this, false, true); _this.createLocalizableString("completeText", _this, false, true); _this.createLocalizableString("previewText", _this, false, true); _this.createLocalizableString("editText", _this, false, true); _this.createLocalizableString("questionTitleTemplate", _this, true); _this.textPreProcessor = new _textPreProcessor__WEBPACK_IMPORTED_MODULE_5__["TextPreProcessor"](); _this.textPreProcessor.onProcess = function (textValue) { _this.getProcessedTextValue(textValue); }; _this.createNewArray("pages", function (value) { _this.doOnPageAdded(value); }, function (value) { _this.doOnPageRemoved(value); }); _this.createNewArray("triggers", function (value) { value.setOwner(_this); }); _this.createNewArray("calculatedValues", function (value) { value.setOwner(_this); }); _this.createNewArray("completedHtmlOnCondition", function (value) { value.locOwner = _this; }); _this.createNewArray("navigateToUrlOnCondition", function (value) { value.locOwner = _this; }); _this.registerFunctionOnPropertyValueChanged("firstPageIsStarted", function () { _this.onFirstPageIsStartedChanged(); }); _this.registerFunctionOnPropertyValueChanged("mode", function () { _this.onModeChanged(); }); _this.registerFunctionOnPropertyValueChanged("progressBarType", function () { _this.updateProgressText(); }); _this.registerFunctionOnPropertiesValueChanged(["questionStartIndex", "requiredText", "questionTitlePattern"], function () { _this.resetVisibleIndexes(); }); _this.onGetQuestionNo.onCallbacksChanged = function () { _this.resetVisibleIndexes(); }; _this.onProgressText.onCallbacksChanged = function () { _this.updateProgressText(); }; _this.onTextMarkdown.onCallbacksChanged = function () { _this.locStrsChanged(); }; _this.onGetQuestionTitle.onCallbacksChanged = function () { _this.locStrsChanged(); }; _this.onBeforeCreating(); if (jsonObj) { if (typeof jsonObj === "string" || jsonObj instanceof String) { jsonObj = JSON.parse(jsonObj); } if (jsonObj && jsonObj.clientId) { _this.clientId = jsonObj.clientId; } _this.fromJSON(jsonObj); if (_this.surveyId) { _this.loadSurveyFromService(_this.surveyId, _this.clientId); } } _this.onCreating(); return _this; } Object.defineProperty(SurveyModel.prototype, "platformName", { get: function () { return SurveyModel.platform; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "commentPrefix", { /** * You can display an additional field (comment field) for the most of questions; users can enter additional comments to their response. * The comment field input is saved as `'question name' + 'commentPrefix'`. * @see data * @see Question.hasComment */ get: function () { return _settings__WEBPACK_IMPORTED_MODULE_14__["settings"].commentPrefix; }, set: function (val) { _settings__WEBPACK_IMPORTED_MODULE_14__["settings"].commentPrefix = val; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "currentPageValue", { get: function () { return this.getPropertyValue("currentPageValue", null); }, set: function (val) { this.setPropertyValue("currentPageValue", val); }, enumerable: false, configurable: true }); SurveyModel.prototype.getType = function () { return "survey"; }; SurveyModel.prototype.onPropertyValueChanged = function (name, oldValue, newValue) { if (name === "questionsOnPageMode") { this.onQuestionsOnPageModeChanged(oldValue); } }; Object.defineProperty(SurveyModel.prototype, "pages", { /** * Returns a list of all pages in the survey, including invisible pages. * @see PageModel * @see visiblePages */ get: function () { return this.getPropertyValue("pages"); }, enumerable: false, configurable: true }); SurveyModel.prototype.getCss = function () { return this.css; }; Object.defineProperty(SurveyModel.prototype, "css", { get: function () { if (!this.cssValue) { this.cssValue = {}; this.copyCssClasses(this.cssValue, _defaultCss_cssstandard__WEBPACK_IMPORTED_MODULE_3__["surveyCss"].getCss()); } return this.cssValue; }, set: function (value) { this.updateElementCss(false); this.mergeValues(value, this.css); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "cssTitle", { get: function () { return this.css.title; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "cssNavigationComplete", { get: function () { return this.getNavigationCss(this.css.navigationButton, this.css.navigation.complete); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "cssNavigationPreview", { get: function () { return this.getNavigationCss(this.css.navigationButton, this.css.navigation.preview); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "cssNavigationEdit", { get: function () { return this.getNavigationCss(this.css.navigationButton, this.css.navigation.edit); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "cssNavigationPrev", { get: function () { return this.getNavigationCss(this.css.navigationButton, this.css.navigation.prev); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "cssNavigationStart", { get: function () { return this.getNavigationCss(this.css.navigationButton, this.css.navigation.start); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "cssNavigationNext", { get: function () { return this.getNavigationCss(this.css.navigationButton, this.css.navigation.next); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "completedCss", { get: function () { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_16__["CssClassBuilder"]().append(this.css.body) .append(this.css.completedPage).toString(); }, enumerable: false, configurable: true }); SurveyModel.prototype.getNavigationCss = function (main, btn) { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_16__["CssClassBuilder"]().append(main) .append(btn).toString(); }; Object.defineProperty(SurveyModel.prototype, "lazyRendering", { /** * By default all rows are rendered no matters if they are visible or not. * Set it true, and survey markup rows will be rendered only if they are visible in viewport. * This feature is experimantal and might do not support all the use cases. */ get: function () { return this.lazyRenderingValue === true; }, set: function (val) { this.lazyRenderingValue = val; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "isLazyRendering", { get: function () { return this.lazyRendering || _settings__WEBPACK_IMPORTED_MODULE_14__["settings"].lazyRowsRendering; }, enumerable: false, configurable: true }); SurveyModel.prototype.updateLazyRenderingRowsOnRemovingElements = function () { if (!this.isLazyRendering) return; var page = this.currentPage; if (!!page) { Object(_utils_utils__WEBPACK_IMPORTED_MODULE_15__["scrollElementByChildId"])(page.id); } }; Object.defineProperty(SurveyModel.prototype, "triggers", { /** * Gets or sets a list of triggers in the survey. * @see SurveyTrigger */ get: function () { return this.getPropertyValue("triggers"); }, set: function (val) { this.setPropertyValue("triggers", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "calculatedValues", { /** * Gets or sets a list of calculated values in the survey. * @see CalculatedValue */ get: function () { return this.getPropertyValue("calculatedValues"); }, set: function (val) { this.setPropertyValue("calculatedValues", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "surveyId", { /** * Gets or sets an identifier of a survey model loaded from the [api.surveyjs.io](https://api.surveyjs.io) service. When specified, the survey JSON is automatically loaded from [api.surveyjs.io](https://api.surveyjs.io) service. * @see loadSurveyFromService * @see onLoadedSurveyFromService */ get: function () { return this.getPropertyValue("surveyId", ""); }, set: function (val) { this.setPropertyValue("surveyId", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "surveyPostId", { /** * Gets or sets an identifier of a survey model saved to the [api.surveyjs.io](https://api.surveyjs.io) service. When specified, the survey data is automatically saved to the [api.surveyjs.io](https://api.surveyjs.io) service. * @see onComplete * @see surveyShowDataSaving */ get: function () { return this.getPropertyValue("surveyPostId", ""); }, set: function (val) { this.setPropertyValue("surveyPostId", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "clientId", { /** * Gets or sets user's identifier (e.g., e-mail or unique customer id) in your web application. * If you load survey or post survey results from/to [api.surveyjs.io](https://api.surveyjs.io) service, then the library do not allow users to run the same survey the second time. * On the second run, the user will see the survey complete page. */ get: function () { return this.getPropertyValue("clientId", ""); }, set: function (val) { this.setPropertyValue("clientId", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "cookieName", { /** * Gets or sets a cookie name used to save information about completing the survey. * If the property is not empty, before starting the survey, the Survey library checks if the cookie with this name exists. * If it is `true`, the survey goes to complete mode and a user sees the survey complete page. On completing the survey the cookie with this name is created. */ get: function () { return this.getPropertyValue("cookieName", ""); }, set: function (val) { this.setPropertyValue("cookieName", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "sendResultOnPageNext", { /** * Gets or sets whether to save survey results on completing every page. If the property value is set to `true`, the `onPartialSend` event is fired. * @see onPartialSend * @see clientId */ get: function () { return this.getPropertyValue("sendResultOnPageNext", false); }, set: function (val) { this.setPropertyValue("sendResultOnPageNext", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "surveyShowDataSaving", { /** * Gets or sets whether to show the progress on saving/sending data into the [api.surveyjs.io](https://api.surveyjs.io) service. * @see surveyPostId */ get: function () { return this.getPropertyValue("surveyShowDataSaving", false); }, set: function (val) { this.setPropertyValue("surveyShowDataSaving", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "focusFirstQuestionAutomatic", { /** * Gets or sets whether the first input is focused on showing a next or a previous page. */ get: function () { return this.getPropertyValue("focusFirstQuestionAutomatic"); }, set: function (val) { this.setPropertyValue("focusFirstQuestionAutomatic", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "focusOnFirstError", { /** * Gets or sets whether the first input is focused if the current page has errors. * Set this property to `false` (the default value is `true`) if you do not want to bring the focus to the first question that has error on the page. */ get: function () { return this.getPropertyValue("focusOnFirstError"); }, set: function (val) { this.setPropertyValue("focusOnFirstError", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "showNavigationButtons", { /** * Gets or sets the navigation buttons position. * Possible values: 'bottom' (default), 'top', 'both' and 'none'. Set it to 'none' to hide 'Prev', 'Next' and 'Complete' buttons. * It makes sense if you are going to create a custom navigation, have only a single page, or the `goNextPageAutomatic` property is set to `true`. * @see goNextPageAutomatic * @see showPrevButton */ get: function () { return this.getPropertyValue("showNavigationButtons"); }, set: function (val) { if (val === true || val === undefined) { val = "bottom"; } if (val === false) { val = "none"; } this.setPropertyValue("showNavigationButtons", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "showPrevButton", { /** * Gets or sets whether the Survey displays "Prev" button in its pages. Set it to `false` to prevent end-users from going back to their answers. * @see showNavigationButtons */ get: function () { return this.getPropertyValue("showPrevButton"); }, set: function (val) { this.setPropertyValue("showPrevButton", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "showTitle", { /** * Gets or sets whether the Survey displays survey title in its pages. Set it to `false` to hide a survey title. * @see title */ get: function () { return this.getPropertyValue("showTitle"); }, set: function (val) { this.setPropertyValue("showTitle", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "showPageTitles", { /** * Gets or sets whether the Survey displays page titles. Set it to `false` to hide page titles. * @see PageModel.title */ get: function () { return this.getPropertyValue("showPageTitles"); }, set: function (val) { this.setPropertyValue("showPageTitles", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "showCompletedPage", { /** * On finishing the survey the complete page is shown. Set the property to `false`, to hide the complete page. * @see data * @see onComplete * @see navigateToUrl */ get: function () { return this.getPropertyValue("showCompletedPage"); }, set: function (val) { this.setPropertyValue("showCompletedPage", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "navigateToUrl", { /** * Set this property to a url you want to navigate after a user completing the survey. * By default it uses after calling onComplete event. In case calling options.showDataSaving callback in onComplete event, navigateToUrl will be used on calling options.showDataSavingSuccess callback. */ get: function () { return this.getPropertyValue("navigateToUrl"); }, set: function (val) { this.setPropertyValue("navigateToUrl", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "navigateToUrlOnCondition", { /** * Gets or sets a list of URL condition items. If the expression of this item returns `true`, then survey will navigate to the item URL. * @see UrlConditionItem * @see navigateToUrl */ get: function () { return this.getPropertyValue("navigateToUrlOnCondition"); }, set: function (val) { this.setPropertyValue("navigateToUrlOnCondition", val); }, enumerable: false, configurable: true }); SurveyModel.prototype.getNavigateToUrl = function () { var item = this.getExpressionItemOnRunCondition(this.navigateToUrlOnCondition); var url = !!item ? item.url : this.navigateToUrl; if (!!url) { url = this.processText(url, true); } return url; }; SurveyModel.prototype.navigateTo = function () { var url = this.getNavigateToUrl(); var options = { url: url }; this.onNavigateToUrl.fire(this, options); if (!options.url || typeof window === "undefined" || !window.location) return; window.location.href = options.url; }; Object.defineProperty(SurveyModel.prototype, "requiredText", { /** * Gets or sets the required question mark. The required question mark is a char or string that is rendered in the required questions' titles. * @see Question.title */ get: function () { return this.getPropertyValue("requiredText", "*"); }, set: function (val) { this.setPropertyValue("requiredText", val); }, enumerable: false, configurable: true }); SurveyModel.prototype.beforeSettingQuestionErrors = function (question, errors) { this.maakeRequiredErrorsInvisibgle(errors); this.onSettingQuestionErrors.fire(this, { question: question, errors: errors, }); }; SurveyModel.prototype.beforeSettingPanelErrors = function (question, errors) { this.maakeRequiredErrorsInvisibgle(errors); }; SurveyModel.prototype.maakeRequiredErrorsInvisibgle = function (errors) { if (!this.hideRequiredErrors) return; for (var i = 0; i < errors.length; i++) { var erType = errors[i].getErrorType(); if (erType == "required" || erType == "requireoneanswer") { errors[i].visible = false; } } }; Object.defineProperty(SurveyModel.prototype, "questionStartIndex", { /** * Gets or sets the first question index. The first question index is '1' by default. You may start it from '100' or from 'A', by setting '100' or 'A' to this property. * You can set the start index to "(1)" or "# A)" or "a)" to render question number as (1), # A) and a) accordingly. * @see Question.title * @see requiredText */ get: function () { return this.getPropertyValue("questionStartIndex", ""); }, set: function (val) { this.setPropertyValue("questionStartIndex", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "storeOthersAsComment", { /** * Gets or sets whether the "Others" option text is stored as question comment. * * By default the entered text in the "Others" input in the checkbox/radiogroup/dropdown is stored as `"question name " + "-Comment"`. The value itself is `"question name": "others"`. * Set this property to `false`, to store the entered text directly in the `"question name"` key. * @see commentPrefix */ get: function () { return this.getPropertyValue("storeOthersAsComment"); }, set: function (val) { this.setPropertyValue("storeOthersAsComment", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "maxTextLength", { /** * Specifies the default maximum length for questions like text and comment, including matrix cell questions. * * The default value is `0`, that means that the text and comment have the same max length as the standard HTML input - 524288 characters: https://www.w3schools.com/tags/att_input_maxlength.asp. * @see maxOthersLength */ get: function () { return this.getPropertyValue("maxTextLength"); }, set: function (val) { this.setPropertyValue("maxTextLength", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "maxOthersLength", { /** * Gets or sets the default maximum length for question comments and others * * The default value is `0`, that means that the question comments have the same max length as the standard HTML input - 524288 characters: https://www.w3schools.com/tags/att_input_maxlength.asp. * @see Question.hasComment * @see Question.hasOther * @see maxTextLength */ get: function () { return this.getPropertyValue("maxOthersLength"); }, set: function (val) { this.setPropertyValue("maxOthersLength", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "goNextPageAutomatic", { /** * Gets or ses whether a user can navigate the next page automatically after answering all the questions on a page without pressing the "Next" button. * The available options: * * - `true` - navigate the next page and submit survey data automatically. * - `autogonext` - navigate the next page automatically but do not submit survey data. * - `false` - do not navigate the next page and do not submit survey data automatically. * @see showNavigationButtons */ get: function () { return this.getPropertyValue("goNextPageAutomatic", false); }, set: function (val) { this.setPropertyValue("goNextPageAutomatic", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "allowCompleteSurveyAutomatic", { /** * Gets or sets whether a survey is automatically completed when `goNextPageAutomatic = true`. Set it to `false` if you do not want to submit survey automatically on completing the last survey page. * @see goNextPageAutomatic */ get: function () { return this.getPropertyValue("allowCompleteSurveyAutomatic", true); }, set: function (val) { this.setPropertyValue("allowCompleteSurveyAutomatic", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "checkErrorsMode", { /** * Gets or sets a value that specifies how the survey validates the question answers. * * The following options are available: * * - `onNextPage` (default) - check errors on navigating to the next page or on completing the survey. * - `onValueChanged` - check errors on every question value (i.e., answer) changing. * - `onValueChanging` - check errors before setting value into survey. If there is an error, then survey data is not changed, but question value will be keeped. * - `onComplete` - to validate all visible questions on complete button click. If there are errors on previous pages, then the page with the first error becomes the current. */ get: function () { return this.getPropertyValue("checkErrorsMode"); }, set: function (val) { this.setPropertyValue("checkErrorsMode", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "autoGrowComment", { /** * Specifies whether the text area of [comment](https://surveyjs.io/Documentation/Library?id=questioncommentmodel) questions/elements automatically expands its height to avoid the vertical scrollbar and to display the entire multi-line contents entered by respondents. * Default value is false. * @see QuestionCommentModel.autoGrow */ get: function () { return this.getPropertyValue("autoGrowComment"); }, set: function (val) { this.setPropertyValue("autoGrowComment", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "textUpdateMode", { /** * Gets or sets a value that specifies how the survey updates its questions' text values. * * The following options are available: * * - `onBlur` (default) - the value is updated after an input loses the focus. * - `onTyping` - update the value of text questions, "text" and "comment", on every key press. * * Note, that setting to "onTyping" may lead to a performance degradation, in case you have many expressions in the survey. */ get: function () { return this.getPropertyValue("textUpdateMode"); }, set: function (val) { this.setPropertyValue("textUpdateMode", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "clearInvisibleValues", { /** * Gets or sets a value that specifies how the invisible data is included in survey data. * * The following options are available: * * - `none` - include the invisible values into the survey data. * - `onHidden` - clear the question value when it becomes invisible. If a question has value and it was invisible initially then survey clears the value on completing. * - `onHiddenContainer` - clear the question value when it or its parent (page or panel) becomes invisible. If a question has value and it was invisible initially then survey clears the value on completing. * - `onComplete` (default) - clear invisible question values on survey complete. In this case, the invisible questions will not be stored on the server. * @see Question.visible * @see onComplete */ get: function () { return this.getPropertyValue("clearInvisibleValues"); }, set: function (val) { if (val === true) val = "onComplete"; if (val === false) val = "none"; this.setPropertyValue("clearInvisibleValues", val); }, enumerable: false, configurable: true }); /** * Call this function to remove all question values from the survey, that end-user will not be able to enter. * For example the value that doesn't exists in a radiogroup/dropdown/checkbox choices or matrix rows/columns. * Please note, this function doesn't clear values for invisible questions or values that doesn't associated with questions. * In fact this function just call clearIncorrectValues function of all questions in the survey * @param removeNonExisingRootKeys - set this parameter to true to remove keys from survey.data that doesn't have corresponded questions and calculated values * @see Question.clearIncorrectValues * @see Page.clearIncorrectValues * @see Panel.clearIncorrectValues */ SurveyModel.prototype.clearIncorrectValues = function (removeNonExisingRootKeys) { if (removeNonExisingRootKeys === void 0) { removeNonExisingRootKeys = false; } for (var i = 0; i < this.pages.length; i++) { this.pages[i].clearIncorrectValues(); } if (!removeNonExisingRootKeys) return; var data = this.data; var hasChanges = false; for (var key in data) { if (!!this.getQuestionByValueName(key)) continue; if (this.iscorrectValueWithPostPrefix(key, _settings__WEBPACK_IMPORTED_MODULE_14__["settings"].commentPrefix) || this.iscorrectValueWithPostPrefix(key, _settings__WEBPACK_IMPORTED_MODULE_14__["settings"].matrixTotalValuePostFix)) continue; var calcValue = this.getCalculatedValueByName(key); if (!!calcValue && calcValue.includeIntoResult) continue; hasChanges = true; delete data[key]; } if (hasChanges) { this.data = data; } }; SurveyModel.prototype.iscorrectValueWithPostPrefix = function (key, postPrefix) { if (key.indexOf(postPrefix) !== key.length - postPrefix.length) return false; return !!this.getQuestionByValueName(key.substr(0, key.indexOf(postPrefix))); }; Object.defineProperty(SurveyModel.prototype, "locale", { /** * Gets or sets the survey locale. The default value it is empty, this means the 'en' locale is used. * You can set it to 'de' - German, 'fr' - French and so on. The library has built-in localization for several languages. The library has a multi-language support as well. */ get: function () { return this.localeValue; }, set: function (value) { _surveyStrings__WEBPACK_IMPORTED_MODULE_8__["surveyLocalization"].currentLocale = value; this.localeValue = _surveyStrings__WEBPACK_IMPORTED_MODULE_8__["surveyLocalization"].currentLocale; this.setPropertyValue("locale", this.localeValue); if (this.isLoadingFromJson) return; this.locStrsChanged(); this.localeChanged(); this.onLocaleChangedEvent.fire(this, value); }, enumerable: false, configurable: true }); /** * Returns an array of locales that are used in the survey's translation. */ SurveyModel.prototype.getUsedLocales = function () { var locs = new Array(); this.addUsedLocales(locs); //Replace the default locale with the real one var index = locs.indexOf("default"); if (index > -1) { var defaultLoc = _surveyStrings__WEBPACK_IMPORTED_MODULE_8__["surveyLocalization"].defaultLocale; //Remove the defaultLoc var defIndex = locs.indexOf(defaultLoc); if (defIndex > -1) { locs.splice(defIndex, 1); } index = locs.indexOf("default"); locs[index] = defaultLoc; } return locs; }; SurveyModel.prototype.localeChanged = function () { for (var i = 0; i < this.pages.length; i++) { this.pages[i].localeChanged(); } }; //ILocalizableOwner SurveyModel.prototype.getLocale = function () { return this.locale; }; SurveyModel.prototype.locStrsChanged = function () { _super.prototype.locStrsChanged.call(this); //Do not set current page if it is not set yet. //At first we do not need this, at second it creates issues with Vue CLI projects //More information here: https://github.com/surveyjs/survey-library/issues/2599 if (!this.currentPageValue) return; this.updateProgressText(); var page = this.activePage; if (!!page) { page.locStrsChanged(); } }; SurveyModel.prototype.getMarkdownHtml = function (text, name) { return this.getSurveyMarkdownHtml(this, text, name); }; SurveyModel.prototype.getRenderer = function (name) { return this.getRendererForString(this, name); }; SurveyModel.prototype.getRendererContext = function (locStr) { return this.getRendererContextForString(this, locStr); }; SurveyModel.prototype.getRendererForString = function (element, name) { var renderAs = this.getBuiltInRendererForString(element, name); var options = { element: element, name: name, renderAs: renderAs }; this.onTextRenderAs.fire(this, options); return options.renderAs; }; SurveyModel.prototype.getRendererContextForString = function (element, locStr) { return locStr; }; SurveyModel.prototype.getExpressionDisplayValue = function (question, value, displayValue) { var options = { question: question, value: value, displayValue: displayValue, }; this.onGetExpressionDisplayValue.fire(this, options); return options.displayValue; }; SurveyModel.prototype.getBuiltInRendererForString = function (element, name) { if (this.isDesignMode) return _localizablestring__WEBPACK_IMPORTED_MODULE_10__["LocalizableString"].editableRenderer; return undefined; }; SurveyModel.prototype.getProcessedText = function (text) { return this.processText(text, true); }; SurveyModel.prototype.getLocString = function (str) { return _surveyStrings__WEBPACK_IMPORTED_MODULE_8__["surveyLocalization"].getString(str); }; //ISurveyErrorOwner SurveyModel.prototype.getErrorCustomText = function (text, error) { var options = { text: text, name: error.getErrorType(), error: error, }; this.onErrorCustomText.fire(this, options); return options.text; }; Object.defineProperty(SurveyModel.prototype, "emptySurveyText", { /** * Returns the text that is displayed when there are no any visible pages and questiona. */ get: function () { return this.getLocString("emptySurvey"); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "logo", { //#region Title/Header options /** * Gets or sets a survey logo. * @see title */ get: function () { return this.getLocalizableStringText("logo"); }, set: function (value) { this.setLocalizableStringText("logo", value); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "locLogo", { get: function () { return this.getLocalizableString("logo"); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "logoWidth", { /** * Gets or sets a survey logo width. * @see logo */ get: function () { var width = this.getPropertyValue("logoWidth"); return Object(_utils_utils__WEBPACK_IMPORTED_MODULE_15__["getSize"])(width); }, set: function (value) { this.setPropertyValue("logoWidth", value); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "logoHeight", { /** * Gets or sets a survey logo height. * @see logo */ get: function () { var height = this.getPropertyValue("logoHeight"); return Object(_utils_utils__WEBPACK_IMPORTED_MODULE_15__["getSize"])(height); }, set: function (value) { this.setPropertyValue("logoHeight", value); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "logoPosition", { /** * Gets or sets a survey logo position. * @see logo */ get: function () { return this.getPropertyValue("logoPosition"); }, set: function (value) { this.setPropertyValue("logoPosition", value); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "hasLogo", { get: function () { return !!this.logo && this.logoPosition !== "none"; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "isLogoBefore", { get: function () { if (this.isDesignMode) return false; return (this.renderedHasLogo && (this.logoPosition === "left" || this.logoPosition === "top")); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "isLogoAfter", { get: function () { if (this.isDesignMode) return this.renderedHasLogo; return (this.renderedHasLogo && (this.logoPosition === "right" || this.logoPosition === "bottom")); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "logoClassNames", { get: function () { var logoClasses = { left: "sv-logo--left", right: "sv-logo--right", top: "sv-logo--top", bottom: "sv-logo--bottom", }; return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_16__["CssClassBuilder"]().append(this.css.logo) .append(logoClasses[this.logoPosition]).toString(); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "renderedHasTitle", { get: function () { if (this.isDesignMode) return this.isPropertyVisible("title"); return !this.locTitle.isEmpty && this.showTitle; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "hasTitle", { get: function () { return this.renderedHasTitle; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "renderedHasLogo", { get: function () { if (this.isDesignMode) return this.isPropertyVisible("logo"); return this.hasLogo; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "renderedHasHeader", { get: function () { return this.renderedHasTitle || this.renderedHasLogo; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "logoFit", { /** * The logo fit mode. * @see logo */ get: function () { return this.getPropertyValue("logoFit"); }, set: function (val) { this.setPropertyValue("logoFit", val); }, enumerable: false, configurable: true }); SurveyModel.prototype.setIsMobile = function (newVal) { if (newVal === void 0) { newVal = true; } this._isMobile = newVal; }; Object.defineProperty(SurveyModel.prototype, "isMobile", { get: function () { return Object(_utils_utils__WEBPACK_IMPORTED_MODULE_15__["isMobile"])() || this._isMobile; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "titleMaxWidth", { get: function () { if (!this.isMobile && !this.isValueEmpty(this.logo) && !_settings__WEBPACK_IMPORTED_MODULE_14__["settings"].supportCreatorV2) { var logoWidth = this.logoWidth; if (this.logoPosition === "left" || this.logoPosition === "right") { return "calc(100% - 5px - 2em - " + logoWidth + ")"; } } return ""; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "completedHtml", { /** * Gets or sets the HTML content displayed on the complete page. Use this property to change the default complete page text. * @see showCompletedPage * @see completedHtmlOnCondition * @see locale */ get: function () { return this.getLocalizableStringText("completedHtml"); }, set: function (value) { this.setLocalizableStringText("completedHtml", value); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "locCompletedHtml", { get: function () { return this.getLocalizableString("completedHtml"); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "completedHtmlOnCondition", { /** * The list of HTML condition items. If the expression of this item returns `true`, then a survey will use this item HTML instead of `completedHtml`. * @see HtmlConditionItem * @see completeHtml */ get: function () { return this.getPropertyValue("completedHtmlOnCondition"); }, set: function (val) { this.setPropertyValue("completedHtmlOnCondition", val); }, enumerable: false, configurable: true }); /** * Calculates a given expression and returns a result value. * @param expression */ SurveyModel.prototype.runExpression = function (expression) { if (!expression) return null; var values = this.getFilteredValues(); var properties = this.getFilteredProperties(); return new _conditions__WEBPACK_IMPORTED_MODULE_13__["ExpressionRunner"](expression).run(values, properties); }; /** * Calculates a given expression and returns `true` or `false`. * @param expression */ SurveyModel.prototype.runCondition = function (expression) { if (!expression) return false; var values = this.getFilteredValues(); var properties = this.getFilteredProperties(); return new _conditions__WEBPACK_IMPORTED_MODULE_13__["ConditionRunner"](expression).run(values, properties); }; /** * Run all triggers that performs on value changed and not on moving to the next page. */ SurveyModel.prototype.runTriggers = function () { this.checkTriggers(this.getFilteredValues(), false); }; Object.defineProperty(SurveyModel.prototype, "renderedCompletedHtml", { get: function () { var item = this.getExpressionItemOnRunCondition(this.completedHtmlOnCondition); return !!item ? item.html : this.completedHtml; }, enumerable: false, configurable: true }); SurveyModel.prototype.getExpressionItemOnRunCondition = function (items) { if (items.length == 0) return null; var values = this.getFilteredValues(); var properties = this.getFilteredProperties(); for (var i = 0; i < items.length; i++) { if (items[i].runCondition(values, properties)) { return items[i]; } } return null; }; Object.defineProperty(SurveyModel.prototype, "completedBeforeHtml", { /** * The HTML content displayed to an end user that has already completed the survey. * @see clientId * @see locale */ get: function () { return this.getLocalizableStringText("completedBeforeHtml"); }, set: function (value) { this.setLocalizableStringText("completedBeforeHtml", value); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "locCompletedBeforeHtml", { get: function () { return this.getLocalizableString("completedBeforeHtml"); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "loadingHtml", { /** * The HTML that shows on loading survey Json from the [api.surveyjs.io](https://api.surveyjs.io) service. * @see surveyId * @see locale */ get: function () { return this.getLocalizableStringText("loadingHtml"); }, set: function (value) { this.setLocalizableStringText("loadingHtml", value); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "locLoadingHtml", { get: function () { return this.getLocalizableString("loadingHtml"); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "startSurveyText", { /** * Gets or sets the 'Start' button caption. * The 'Start' button is shown on the started page. Set the `firstPageIsStarted` property to `true`, to display the started page. * @see firstPageIsStarted * @see locale */ get: function () { return this.getLocalizableStringText("startSurveyText"); }, set: function (newValue) { this.setLocalizableStringText("startSurveyText", newValue); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "locStartSurveyText", { get: function () { return this.getLocalizableString("startSurveyText"); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "pagePrevText", { /** * Gets or sets the 'Prev' button caption. * @see locale */ get: function () { return this.getLocalizableStringText("pagePrevText"); }, set: function (newValue) { this.setLocalizableStringText("pagePrevText", newValue); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "locPagePrevText", { get: function () { return this.getLocalizableString("pagePrevText"); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "pageNextText", { /** * Gets or sets the 'Next' button caption. * @see locale */ get: function () { return this.getLocalizableStringText("pageNextText"); }, set: function (newValue) { this.setLocalizableStringText("pageNextText", newValue); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "locPageNextText", { get: function () { return this.getLocalizableString("pageNextText"); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "completeText", { /** * Gets or sets the 'Complete' button caption. * @see locale */ get: function () { return this.getLocalizableStringText("completeText"); }, set: function (newValue) { this.setLocalizableStringText("completeText", newValue); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "locCompleteText", { get: function () { return this.getLocalizableString("completeText"); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "previewText", { /** * Gets or sets the 'Preview' button caption. * @see locale * @see showPreviewBeforeComplete * @see editText * @see showPreview */ get: function () { return this.getLocalizableStringText("previewText"); }, set: function (newValue) { this.setLocalizableStringText("previewText", newValue); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "locPreviewText", { get: function () { return this.getLocalizableString("previewText"); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "editText", { /** * Gets or sets the 'Edit' button caption. * @see locale * @see showPreviewBeforeComplete * @see previewText * @see cancelPreview */ get: function () { return this.getLocalizableStringText("editText"); }, set: function (newValue) { this.setLocalizableStringText("editText", newValue); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "locEditText", { get: function () { return this.getLocalizableString("editText"); }, enumerable: false, configurable: true }); SurveyModel.prototype.getElementTitleTagName = function (element, tagName) { if (this.onGetTitleTagName.isEmpty) return tagName; var options = { element: element, tagName: tagName }; this.onGetTitleTagName.fire(this, options); return options.tagName; }; Object.defineProperty(SurveyModel.prototype, "questionTitlePattern", { /** * Set the pattern for question title. Default is "numTitleRequire", 1. What is your name? *, * You can set it to numRequireTitle: 1. * What is your name? * You can set it to requireNumTitle: * 1. What is your name? * You can set it to numTitle (remove require symbol completely): 1. What is your name? * @see QuestionModel.title */ get: function () { return this.getPropertyValue("questionTitlePattern", "numTitleRequire"); }, set: function (val) { if (val !== "numRequireTitle" && val !== "requireNumTitle" && val != "numTitle") { val = "numTitleRequire"; } this.setPropertyValue("questionTitlePattern", val); }, enumerable: false, configurable: true }); SurveyModel.prototype.getQuestionTitlePatternOptions = function () { var res = new Array(); var title = this.getLocString("questionTitlePatternText"); var num = !!this.questionStartIndex ? this.questionStartIndex : "1."; res.push({ value: "numTitleRequire", text: num + " " + title + " " + this.requiredText }); res.push({ value: "numRequireTitle", text: num + " " + this.requiredText + " " + title }); res.push({ value: "requireNumTitle", text: this.requiredText + " " + num + " " + title }); res.push({ value: "numTitle", text: num + " " + title }); return res; }; Object.defineProperty(SurveyModel.prototype, "questionTitleTemplate", { /** * Gets or sets a question title template. Obsolete, please use questionTitlePattern * @see QuestionModel.title * @see questionTitlePattern */ get: function () { return this.getLocalizableStringText("questionTitleTemplate"); }, set: function (value) { this.setLocalizableStringText("questionTitleTemplate", value); this.questionTitlePattern = this.getNewTitlePattern(value); this.questionStartIndex = this.getNewQuestionTitleElement(value, "no", this.questionStartIndex, "1"); this.requiredText = this.getNewQuestionTitleElement(value, "require", this.requiredText, "*"); }, enumerable: false, configurable: true }); SurveyModel.prototype.getNewTitlePattern = function (template) { if (!!template) { var strs = []; while (template.indexOf("{") > -1) { template = template.substr(template.indexOf("{") + 1); var ind = template.indexOf("}"); if (ind < 0) break; strs.push(template.substr(0, ind)); template = template.substr(ind + 1); } if (strs.length > 1) { if (strs[0] == "require") return "requireNumTitle"; if (strs[1] == "require" && strs.length == 3) return "numRequireTitle"; if (strs.indexOf("require") < 0) return "numTitle"; } if (strs.length == 1 && strs[0] == "title") { return "numTitle"; } } return "numTitleRequire"; }; SurveyModel.prototype.getNewQuestionTitleElement = function (template, name, currentValue, defaultValue) { name = "{" + name + "}"; if (!template || template.indexOf(name) < 0) return currentValue; var ind = template.indexOf(name); var prefix = ""; var postfix = ""; var i = ind - 1; for (; i >= 0; i--) { if (template[i] == "}") break; } if (i < ind - 1) { prefix = template.substr(i + 1, ind - i - 1); } ind += name.length; i = ind; for (; i < template.length; i++) { if (template[i] == "{") break; } if (i > ind) { postfix = template.substr(ind, i - ind); } i = 0; while (i < prefix.length && prefix.charCodeAt(i) < 33) i++; prefix = prefix.substr(i); i = postfix.length - 1; while (i >= 0 && postfix.charCodeAt(i) < 33) i--; postfix = postfix.substr(0, i + 1); if (!prefix && !postfix) return currentValue; var value = !!currentValue ? currentValue : defaultValue; return prefix + value + postfix; }; Object.defineProperty(SurveyModel.prototype, "locQuestionTitleTemplate", { get: function () { return this.getLocalizableString("questionTitleTemplate"); }, enumerable: false, configurable: true }); SurveyModel.prototype.getUpdatedQuestionTitle = function (question, title) { if (this.onGetQuestionTitle.isEmpty) return title; var options = { question: question, title: title }; this.onGetQuestionTitle.fire(this, options); return options.title; }; SurveyModel.prototype.getUpdatedQuestionNo = function (question, no) { if (this.onGetQuestionNo.isEmpty) return no; var options = { question: question, no: no }; this.onGetQuestionNo.fire(this, options); return options.no; }; Object.defineProperty(SurveyModel.prototype, "showPageNumbers", { /** * Gets or sets whether the survey displays page numbers on pages titles. */ get: function () { return this.getPropertyValue("showPageNumbers", false); }, set: function (value) { if (value === this.showPageNumbers) return; this.setPropertyValue("showPageNumbers", value); this.updateVisibleIndexes(); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "showQuestionNumbers", { /** * Gets or sets a value that specifies how the question numbers are displayed. * * The following options are available: * * - `on` - display question numbers * - `onpage` - display question numbers, start numbering on every page * - `off` - turn off the numbering for questions titles */ get: function () { return this.getPropertyValue("showQuestionNumbers"); }, set: function (value) { value = value.toLowerCase(); value = value === "onpage" ? "onPage" : value; if (value === this.showQuestionNumbers) return; this.setPropertyValue("showQuestionNumbers", value); this.updateVisibleIndexes(); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "showProgressBar", { /** * Gets or sets the survey progress bar position. * * The following options are available: * * - `off` (default) - don't show progress bar * - `top` - show progress bar in the top * - `bottom` - show progress bar in the bottom * - `both` - show progress bar in both sides: top and bottom. */ get: function () { return this.getPropertyValue("showProgressBar"); }, set: function (newValue) { this.setPropertyValue("showProgressBar", newValue.toLowerCase()); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "progressBarType", { /** * Gets or sets the type of info in the progress bar. * * The following options are available: * * - `pages` (default), * - `questions`, * - `requiredQuestions`, * - `correctQuestions`, * - `buttons` */ get: function () { return this.getPropertyValue("progressBarType"); }, set: function (newValue) { if (newValue === "correctquestion") newValue = "correctQuestion"; if (newValue === "requiredquestion") newValue = "requiredQuestion"; this.setPropertyValue("progressBarType", newValue); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "isShowProgressBarOnTop", { get: function () { if (!this.canShowProresBar()) return false; return this.showProgressBar === "top" || this.showProgressBar === "both"; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "isShowProgressBarOnBottom", { get: function () { if (!this.canShowProresBar()) return false; return this.showProgressBar === "bottom" || this.showProgressBar === "both"; }, enumerable: false, configurable: true }); SurveyModel.prototype.canShowProresBar = function () { return (!this.isShowingPreview || this.showPreviewBeforeComplete != "showAllQuestions"); }; Object.defineProperty(SurveyModel.prototype, "processedTitle", { /** * Returns the text/HTML that is rendered as a survey title. */ get: function () { return this.locTitle.renderedHtml; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "questionTitleLocation", { /** * Gets or sets the question title location. * * The following options are available: * * - `bottom` - show a question title to bottom * - `left` - show a question title to left * - `top` - show a question title to top. * * > Some questions, for example matrixes, do not support 'left' value. The title for them will be displayed to the top. */ get: function () { return this.getPropertyValue("questionTitleLocation"); }, set: function (value) { this.setPropertyValue("questionTitleLocation", value.toLowerCase()); if (!this.isLoadingFromJson) { this.updateElementCss(true); } }, enumerable: false, configurable: true }); SurveyModel.prototype.updateElementCss = function (reNew) { var pages = this.visiblePages; for (var i = 0; i < pages.length; i++) { pages[i].updateElementCss(reNew); } }; Object.defineProperty(SurveyModel.prototype, "questionErrorLocation", { /** * Gets or sets the error message position. * * The following options are available: * * - `top` - to show question error(s) over the question, * - `bottom` - to show question error(s) under the question. */ get: function () { return this.getPropertyValue("questionErrorLocation"); }, set: function (value) { this.setPropertyValue("questionErrorLocation", value.toLowerCase()); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "questionDescriptionLocation", { /** * Gets or sets the question description position. The default value is `underTitle`. * * The following options are available: * * - `underTitle` - show question description under the question title, * - `underInput` - show question description under the question input instead of question title. */ get: function () { return this.getPropertyValue("questionDescriptionLocation"); }, set: function (value) { this.setPropertyValue("questionDescriptionLocation", value); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "mode", { /** * Gets or sets the survey edit mode. * * The following options are available: * * - `edit` (default) - make a survey editable, * - `display` - make a survey read-only. */ get: function () { return this.getPropertyValue("mode"); }, set: function (value) { value = value.toLowerCase(); if (value == this.mode) return; if (value != "edit" && value != "display") return; this.setPropertyValue("mode", value); }, enumerable: false, configurable: true }); SurveyModel.prototype.onModeChanged = function () { for (var i = 0; i < this.pages.length; i++) { var page = this.pages[i]; page.setPropertyValue("isReadOnly", page.isReadOnly); } }; Object.defineProperty(SurveyModel.prototype, "data", { /** * Gets or sets an object that stores the survey results/data. You can set it directly as `{ 'question name': questionValue, ... }` * * > If you set the `data` property after creating the survey, you may need to set the `currentPageNo` to `0`, if you are using `visibleIf` properties for questions/pages/panels to ensure that you are starting from the first page. * @see setValue * @see getValue * @see mergeData * @see currentPageNo */ get: function () { var result = {}; var keys = this.getValuesKeys(); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var dataValue = this.getDataValueCore(this.valuesHash, key); if (dataValue !== undefined) { result[key] = dataValue; } } this.setCalcuatedValuesIntoResult(result); return result; }, set: function (data) { this.valuesHash = {}; this.setDataCore(data); }, enumerable: false, configurable: true }); /** * Merge the values into survey.data. It works as survey.data, except it doesn't clean the existing data, but overrides them. * @param data data to merge. It should be an object {keyValue: Value, ...} * @see data * @see setValue */ SurveyModel.prototype.mergeData = function (data) { if (!data) return; this.setDataCore(data); }; SurveyModel.prototype.setDataCore = function (data) { if (data) { for (var key in data) { this.setDataValueCore(this.valuesHash, key, data[key]); } } this.updateAllQuestionsValue(); this.notifyAllQuestionsOnValueChanged(); this.notifyElementsOnAnyValueOrVariableChanged(""); this.runConditions(); }; Object.defineProperty(SurveyModel.prototype, "editingObj", { get: function () { return this.editingObjValue; }, set: function (val) { var _this = this; if (this.editingObj == val) return; if (!!this.editingObj) { this.editingObj.onPropertyChanged.remove(this.onEditingObjPropertyChanged); } this.editingObjValue = val; if (this.isDisposed) return; if (!val) { var questions = this.getAllQuestions(); for (var i = 0; i < questions.length; i++) { questions[i].unbindValue(); } } if (!!this.editingObj) { this.setDataCore({}); this.onEditingObjPropertyChanged = function (sender, options) { if (!_jsonobject__WEBPACK_IMPORTED_MODULE_1__["Serializer"].hasOriginalProperty(_this.editingObj, options.name)) return; _this.updateOnSetValue(options.name, _this.editingObj[options.name], options.oldValue); }; this.editingObj.onPropertyChanged.add(this.onEditingObjPropertyChanged); } }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "isEditingSurveyElement", { get: function () { return !!this.editingObj; }, enumerable: false, configurable: true }); SurveyModel.prototype.setCalcuatedValuesIntoResult = function (result) { for (var i = 0; i < this.calculatedValues.length; i++) { var calValue = this.calculatedValues[i]; if (calValue.includeIntoResult && !!calValue.name && this.getVariable(calValue.name) !== undefined) { result[calValue.name] = this.getVariable(calValue.name); } } }; SurveyModel.prototype.getAllValues = function () { return this.data; }; /** * Returns survey result data as an array of plain objects: with question `title`, `name`, `value`, and `displayValue`. * * For complex questions (like matrix, etc.) `isNode` flag is set to `true` and data contains array of nested objects (rows). * * Set `options.includeEmpty` to `false` if you want to skip empty answers. */ SurveyModel.prototype.getPlainData = function (options) { if (options === void 0) { options = { includeEmpty: true, includeQuestionTypes: false, }; } var result = []; this.getAllQuestions().forEach(function (question) { var resultItem = question.getPlainData(options); if (!!resultItem) { result.push(resultItem); } }); return result; }; SurveyModel.prototype.getFilteredValues = function () { var values = {}; for (var key in this.variablesHash) values[key] = this.variablesHash[key]; this.addCalculatedValuesIntoFilteredValues(values); var keys = this.getValuesKeys(); for (var i = 0; i < keys.length; i++) { var key = keys[i]; values[key] = this.getDataValueCore(this.valuesHash, key); } return values; }; SurveyModel.prototype.addCalculatedValuesIntoFilteredValues = function (values) { var caclValues = this.calculatedValues; for (var i = 0; i < caclValues.length; i++) values[caclValues[i].name] = caclValues[i].value; }; SurveyModel.prototype.getFilteredProperties = function () { return { survey: this }; }; SurveyModel.prototype.getValuesKeys = function () { if (!this.editingObj) return Object.keys(this.valuesHash); var props = _jsonobject__WEBPACK_IMPORTED_MODULE_1__["Serializer"].getPropertiesByObj(this.editingObj); var res = []; for (var i = 0; i < props.length; i++) { res.push(props[i].name); } return res; }; SurveyModel.prototype.getDataValueCore = function (valuesHash, key) { if (!!this.editingObj) return _jsonobject__WEBPACK_IMPORTED_MODULE_1__["Serializer"].getObjPropertyValue(this.editingObj, key); return valuesHash[key]; }; SurveyModel.prototype.setDataValueCore = function (valuesHash, key, value) { if (!!this.editingObj) { _jsonobject__WEBPACK_IMPORTED_MODULE_1__["Serializer"].setObjPropertyValue(this.editingObj, key, value); } else { valuesHash[key] = value; } }; SurveyModel.prototype.deleteDataValueCore = function (valuesHash, key) { if (!!this.editingObj) { this.editingObj[key] = null; } else { delete valuesHash[key]; } }; Object.defineProperty(SurveyModel.prototype, "comments", { /** * Returns all comments from the data. * @see data */ get: function () { var result = {}; var keys = this.getValuesKeys(); for (var i = 0; i < keys.length; i++) { var key = keys[i]; if (key.indexOf(this.commentPrefix) > 0) { result[key] = this.getDataValueCore(this.valuesHash, key); } } return result; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "visiblePages", { /** * Returns a list of visible pages. If all pages are visible, then this property returns the same list as the `pages` property. * @see pages * @see PageModel.visible * @see PageModel.visibleIf */ get: function () { if (this.isDesignMode) return this.pages; var result = new Array(); for (var i = 0; i < this.pages.length; i++) { if (this.pages[i].isVisible && !this.pages[i].isStarted) { result.push(this.pages[i]); } } return result; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "isEmpty", { /** * Returns `true` if the survey contains no pages. The survey is empty. */ get: function () { return this.pages.length == 0; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "PageCount", { /** * Deprecated. Use the `pageCount` property instead. */ get: function () { return this.pageCount; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "pageCount", { /** * Returns the survey page count. * @see visiblePageCount * @see pages */ get: function () { return this.pages.length; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "visiblePageCount", { /** * Returns a number of visible pages within the survey. * @see pageCount * @see visiblePages */ get: function () { return this.visiblePages.length; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "startedPage", { /** * Returns the started page. This property works if the `firstPageIsStarted` property is set to `true`. * @see firstPageIsStarted */ get: function () { var page = this.firstPageIsStarted && this.pages.length > 0 ? this.pages[0] : null; if (!!page) { page.onFirstRendering(); page.setWasShown(true); } return page; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "currentPage", { /** * Gets or sets the current survey page. If a survey is rendered, then this property returns a page that a user can see/edit. */ get: function () { var vPages = this.visiblePages; if (this.currentPageValue != null) { if (vPages.indexOf(this.currentPageValue) < 0) { if (!this.onContainsPageCallback || !this.onContainsPageCallback(this.currentPageValue)) { this.currentPage = null; } } } if (this.currentPageValue == null && vPages.length > 0) { this.currentPage = vPages[0]; } return this.currentPageValue; }, set: function (value) { if (this.isLoadingFromJson) return; var newPage = this.getPageByObject(value); if (!!value && !newPage) return; var vPages = this.visiblePages; if (newPage != null && vPages.indexOf(newPage) < 0) return; if (newPage == this.currentPageValue) return; var oldValue = this.currentPageValue; if (!this.currentPageChanging(newPage, oldValue)) return; this.currentPageValue = newPage; if (!!newPage) { newPage.onFirstRendering(); newPage.updateCustomWidgets(); newPage.setWasShown(true); } this.locStrsChanged(); this.currentPageChanged(newPage, oldValue); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "activePage", { /** * Returns the currentPage, unless the started page is showing. In this case returns the started page. * @see currentPage * @see firstPageIsStarted * @see startedPage */ get: function () { return this.isStartedState && this.startedPage ? this.startedPage : this.currentPage; }, enumerable: false, configurable: true }); SurveyModel.prototype.getPageByObject = function (value) { if (!value) return null; if (value.getType && value.getType() == "page") return value; if (typeof value === "string" || value instanceof String) return this.getPageByName(String(value)); if (!isNaN(value)) { var index = Number(value); var vPages = this.visiblePages; if (value < 0 || value >= vPages.length) return null; return vPages[index]; } return value; }; Object.defineProperty(SurveyModel.prototype, "currentPageNo", { /** * The zero-based index of the current page in the visible pages array. */ get: function () { return this.visiblePages.indexOf(this.currentPage); }, set: function (value) { var vPages = this.visiblePages; if (value < 0 || value >= vPages.length) return; this.currentPage = vPages[value]; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "questionsOrder", { /** * Gets or sets the question display order. Use this property to randomize questions. You can randomize questions on a specific page. * * The following options are available: * * - `random` - randomize questions * - `initial` - keep questions in the same order, as in a survey model. * @see SurveyPage.questionsOrder */ get: function () { return this.getPropertyValue("questionsOrder"); }, set: function (val) { this.setPropertyValue("questionsOrder", val); }, enumerable: false, configurable: true }); /** * Sets the input focus to the first question with the input field. */ SurveyModel.prototype.focusFirstQuestion = function () { if (this.isFocusingQuestion) return; var page = this.activePage; if (page) { page.scrollToTop(); page.focusFirstQuestion(); } }; SurveyModel.prototype.scrollToTopOnPageChange = function () { var page = this.activePage; if (!page) return; page.scrollToTop(); if (this.focusFirstQuestionAutomatic && !this.isFocusingQuestion) { page.focusFirstQuestion(); } }; Object.defineProperty(SurveyModel.prototype, "state", { /** * Returns the current survey state: * * - `loading` - the survey is being loaded from JSON, * - `empty` - there is nothing to display in the current survey, * - `starting` - the survey's start page is displayed, * - `running` - a respondent is answering survey questions right now, * - `preview` - a respondent is previewing answered questions before submitting the survey (see [example](https://surveyjs.io/Examples/Library?id=survey-showpreview)), * - `completed` - a respondent has completed the survey and submitted the results. * * Details: [Preview State](https://surveyjs.io/Documentation/Library#states) */ get: function () { if (this.isLoading) return "loading"; if (this.isCompleted) return "completed"; if (this.isCompletedBefore) return "completedbefore"; if (!this.isDesignMode && this.isEditMode && this.isStartedState && this.startedPage) return "starting"; if (this.isShowingPreview) return this.currentPage ? "preview" : "empty"; return this.currentPage ? "running" : "empty"; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "isCompleted", { get: function () { return this.getPropertyValue("isCompleted", false); }, set: function (val) { this.setPropertyValue("isCompleted", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "isShowingPreview", { get: function () { return this.getPropertyValue("isShowingPreview", false); }, set: function (val) { if (this.isShowingPreview == val) return; this.setPropertyValue("isShowingPreview", val); this.onShowingPreviewChanged(); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "isStartedState", { get: function () { return this.getPropertyValue("isStartedState", false); }, set: function (val) { this.setPropertyValue("isStartedState", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "isCompletedBefore", { get: function () { return this.getPropertyValue("isCompletedBefore", false); }, set: function (val) { this.setPropertyValue("isCompletedBefore", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "isLoading", { get: function () { return this.getPropertyValue("isLoading", false); }, set: function (val) { this.setPropertyValue("isLoading", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "completedState", { get: function () { return this.completedStateValue; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "completedStateText", { get: function () { return this.completedStateTextValue; }, enumerable: false, configurable: true }); SurveyModel.prototype.setCompletedState = function (value, text) { this.completedStateValue = value; if (!text) { if (value == "saving") text = this.getLocString("savingData"); if (value == "error") text = this.getLocString("savingDataError"); if (value == "success") text = this.getLocString("savingDataSuccess"); } this.completedStateTextValue = text; }; /** * Clears the survey data and state. If the survey has a `completed` state, it will get a `running` state. * @param clearData clear the data * @param gotoFirstPage make the first page as a current page. * @see data * @see state * @see currentPage */ SurveyModel.prototype.clear = function (clearData, gotoFirstPage) { if (clearData === void 0) { clearData = true; } if (gotoFirstPage === void 0) { gotoFirstPage = true; } if (clearData) { this.data = null; this.variablesHash = {}; } this.timeSpent = 0; for (var i = 0; i < this.pages.length; i++) { this.pages[i].timeSpent = 0; this.pages[i].setWasShown(false); this.pages[i].passed = false; } this.isCompleted = false; this.isCompletedBefore = false; this.isLoading = false; this.isStartedState = this.firstPageIsStarted; if (gotoFirstPage && this.visiblePageCount > 0) { this.currentPage = this.visiblePages[0]; } if (clearData) { this.updateValuesWithDefaults(); } }; SurveyModel.prototype.mergeValues = function (src, dest) { if (!dest || !src) return; if (typeof dest !== "object") return; for (var key in src) { var value = src[key]; if (value && typeof value === "object") { if (!dest[key]) dest[key] = {}; this.mergeValues(value, dest[key]); } else { dest[key] = value; } } }; SurveyModel.prototype.updateValuesWithDefaults = function () { if (this.isDesignMode || this.isLoading) return; for (var i = 0; i < this.pages.length; i++) { var questions = this.pages[i].questions; for (var j = 0; j < questions.length; j++) { questions[j].updateValueWithDefaults(); } } }; SurveyModel.prototype.updateCustomWidgets = function (page) { if (!page) return; page.updateCustomWidgets(); }; SurveyModel.prototype.currentPageChanging = function (newValue, oldValue) { var options = { oldCurrentPage: oldValue, newCurrentPage: newValue, allowChanging: true, isNextPage: this.isNextPage(newValue, oldValue), isPrevPage: this.isPrevPage(newValue, oldValue), }; this.onCurrentPageChanging.fire(this, options); return options.allowChanging; }; SurveyModel.prototype.currentPageChanged = function (newValue, oldValue) { var isNextPage = this.isNextPage(newValue, oldValue); if (isNextPage) { oldValue.passed = true; } this.onCurrentPageChanged.fire(this, { oldCurrentPage: oldValue, newCurrentPage: newValue, isNextPage: isNextPage, isPrevPage: this.isPrevPage(newValue, oldValue), }); }; SurveyModel.prototype.isNextPage = function (newValue, oldValue) { if (!newValue || !oldValue) return false; return newValue.visibleIndex == oldValue.visibleIndex + 1; }; SurveyModel.prototype.isPrevPage = function (newValue, oldValue) { if (!newValue || !oldValue) return false; return newValue.visibleIndex + 1 == oldValue.visibleIndex; }; /** * Returns the progress that a user made while going through the survey. * It depends from progressBarType property * @see progressBarType * @see progressValue */ SurveyModel.prototype.getProgress = function () { if (this.currentPage == null) return 0; if (this.progressBarType !== "pages") { var info = this.getProgressInfo(); if (this.progressBarType === "requiredQuestions") { return info.requiredQuestionCount > 1 ? Math.ceil((info.requiredAnsweredQuestionCount * 100) / info.requiredQuestionCount) : 100; } return info.questionCount > 1 ? Math.ceil((info.answeredQuestionCount * 100) / info.questionCount) : 100; } var index = this.visiblePages.indexOf(this.currentPage) + 1; return Math.ceil((index * 100) / this.visiblePageCount); }; Object.defineProperty(SurveyModel.prototype, "progressValue", { /** * Returns the progress that a user made while going through the survey. * It depends from progressBarType property * @see progressBarType */ get: function () { return this.getPropertyValue("progressValue", 0); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "isNavigationButtonsShowing", { /** * Returns the navigation buttons (i.e., 'Prev', 'Next', or 'Complete' and 'Preview') position. */ get: function () { if (this.isDesignMode) return "none"; var page = this.currentPage; if (!page) return "none"; if (page.navigationButtonsVisibility === "show") { return "bottom"; } if (page.navigationButtonsVisibility === "hide") { return "none"; } return this.showNavigationButtons; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "isNavigationButtonsShowingOnTop", { /** * Returns true if the navigation buttons (i.e., 'Prev', 'Next', or 'Complete' and 'Preview') are shows on top. */ get: function () { return this.getIsNavigationButtonsShowingOn("top"); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "isNavigationButtonsShowingOnBottom", { /** * Returns true if the navigation buttons (i.e., 'Prev', 'Next', or 'Complete' and 'Preview') are shows on bottom. */ get: function () { return this.getIsNavigationButtonsShowingOn("bottom"); }, enumerable: false, configurable: true }); SurveyModel.prototype.getIsNavigationButtonsShowingOn = function (buttonPosition) { var res = this.isNavigationButtonsShowing; return res == "both" || res == buttonPosition; }; Object.defineProperty(SurveyModel.prototype, "isEditMode", { /** * Returns `true` if the survey is in edit mode. * @see mode */ get: function () { return this.mode == "edit"; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "isCompleteButtonVisible", { get: function () { return (this.isEditMode && (!this.isShowPreviewBeforeComplete || this.state == "preview")); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "isPreviewButtonVisible", { get: function () { return (this.isEditMode && this.isShowPreviewBeforeComplete && this.state == "running"); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "isCancelPreviewButtonVisible", { get: function () { return (this.isEditMode && this.isShowPreviewBeforeComplete && this.state == "preview"); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "isDisplayMode", { /** * Returns `true` if the survey is in display mode or in preview mode. * @see mode * @see showPreviewBeforeComplete */ get: function () { return this.mode == "display" || this.state == "preview"; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "isUpdateValueTextOnTyping", { get: function () { return this.textUpdateMode == "onTyping"; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "isDesignMode", { /** * Returns `true` if the survey is in design mode. It is used by SurveyJS Editor. * @see setDesignMode */ get: function () { return this._isDesignMode; }, enumerable: false, configurable: true }); /** * Sets the survey into design mode. * @param value use true to set the survey into the design mode. */ SurveyModel.prototype.setDesignMode = function (value) { this._isDesignMode = value; this.onQuestionsOnPageModeChanged("standard"); }; Object.defineProperty(SurveyModel.prototype, "showInvisibleElements", { /** * Gets or sets whether to show all elements in the survey, regardless their visibility. The default value is `false`. */ get: function () { return this.getPropertyValue("showInvisibleElements", false); }, set: function (val) { var visPages = this.visiblePages; this.setPropertyValue("showInvisibleElements", val); if (this.isLoadingFromJson) return; this.runConditions(); this.updateAllElementsVisibility(visPages); }, enumerable: false, configurable: true }); SurveyModel.prototype.updateAllElementsVisibility = function (visPages) { for (var i = 0; i < this.pages.length; i++) { var page = this.pages[i]; page.updateElementVisibility(); if (visPages.indexOf(page) > -1 != page.isVisible) { this.onPageVisibleChanged.fire(this, { page: page, visible: page.isVisible, }); } } }; Object.defineProperty(SurveyModel.prototype, "areInvisibleElementsShowing", { get: function () { return this.isDesignMode || this.showInvisibleElements; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "areEmptyElementsHidden", { get: function () { return (this.isShowingPreview && this.showPreviewBeforeComplete == "showAnsweredQuestions"); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "hasCookie", { /** * Returns `true`, if a user has already completed the survey in this browser and there is a cookie about it. Survey goes to `completed` state if the function returns `true`. * @see cookieName * @see setCookie * @see deleteCookie * @see state */ get: function () { if (!this.cookieName || typeof document === "undefined") return false; var cookies = document.cookie; return cookies && cookies.indexOf(this.cookieName + "=true") > -1; }, enumerable: false, configurable: true }); /** * Set the cookie with `cookieName` in user's browser. It is done automatically on survey complete if the `cookieName` property value is not empty. * @see cookieName * @see hasCookie * @see deleteCookie */ SurveyModel.prototype.setCookie = function () { if (!this.cookieName || typeof document === "undefined") return; document.cookie = this.cookieName + "=true; expires=Fri, 31 Dec 9999 0:0:0 GMT"; }; /** * Deletes the cookie with `cookieName` from the browser. * @see cookieName * @see hasCookie * @see setCookie */ SurveyModel.prototype.deleteCookie = function () { if (!this.cookieName) return; document.cookie = this.cookieName + "=;"; }; /** * Navigates user to the next page. * * Returns `false` in the following cases: * * - if the current page is the last page. * - if the current page contains errors (for example, a required question is empty). * @see isCurrentPageHasErrors * @see prevPage * @see completeLastPage */ SurveyModel.prototype.nextPage = function () { if (this.isLastPage) return false; return this.doCurrentPageComplete(false); }; SurveyModel.prototype.hasErrorsOnNavigate = function (doComplete) { var _this = this; if (this.ignoreValidation || !this.isEditMode) return false; var func = function (hasErrors) { if (!hasErrors) { _this.doCurrentPageCompleteCore(doComplete); } }; if (this.checkErrorsMode === "onComplete") { if (!this.isLastPage) return false; return this.hasErrors(true, true, func) !== false; } return this.hasCurrentPageErrors(func) !== false; }; SurveyModel.prototype.checkForAsyncQuestionValidation = function (questions, func) { var _this = this; this.clearAsyncValidationQuesitons(); var _loop_1 = function () { if (questions[i].isRunningValidators) { var q_1 = questions[i]; q_1.onCompletedAsyncValidators = function (hasErrors) { _this.onCompletedAsyncQuestionValidators(q_1, func, hasErrors); }; this_1.asyncValidationQuesitons.push(questions[i]); } }; var this_1 = this; for (var i = 0; i < questions.length; i++) { _loop_1(); } return this.asyncValidationQuesitons.length > 0; }; SurveyModel.prototype.clearAsyncValidationQuesitons = function () { if (!!this.asyncValidationQuesitons) { var asynQuestions = this.asyncValidationQuesitons; for (var i = 0; i < asynQuestions.length; i++) { asynQuestions[i].onCompletedAsyncValidators = null; } } this.asyncValidationQuesitons = []; }; SurveyModel.prototype.onCompletedAsyncQuestionValidators = function (question, func, hasErrors) { if (hasErrors) { this.clearAsyncValidationQuesitons(); func(true); if (this.focusOnFirstError && !!question && !!question.page && question.page === this.currentPage) { var questions = this.currentPage.questions; for (var i_1 = 0; i_1 < questions.length; i_1++) { if (questions[i_1] !== question && questions[i_1].errors.length > 0) return; } question.focus(true); } return; } var asynQuestions = this.asyncValidationQuesitons; for (var i = 0; i < asynQuestions.length; i++) { if (asynQuestions[i].isRunningValidators) return; } func(false); }; Object.defineProperty(SurveyModel.prototype, "isCurrentPageHasErrors", { /** * Returns `true`, if the current page contains errors, for example, the required question is empty or a question validation is failed. * @see nextPage */ get: function () { return this.checkIsCurrentPageHasErrors(); }, enumerable: false, configurable: true }); /** * Returns `true`, if the current page contains any error. If there is an async function in an expression, then the function will return `undefined` value. * In this case, you should use `onAsyncValidation` parameter, which is a callback function: (hasErrors: boolean) => void * @param onAsyncValidation use this parameter if you use async functions in your expressions. This callback function will be called with hasErrors value equals to `true` or `false`. * @see hasPageErrors * @see hasErrors * @see currentPage */ SurveyModel.prototype.hasCurrentPageErrors = function (onAsyncValidation) { return this.hasPageErrors(undefined, onAsyncValidation); }; /** * Returns `true`, if a page contains an error. If there is an async function in an expression, then the function will return `undefined` value. * In this case, you should use the second `onAsyncValidation` parameter, which is a callback function: (hasErrors: boolean) => void * @param page the page that you want to validate. If the parameter is undefined then the `activePage` is using * @param onAsyncValidation use this parameter if you use async functions in your expressions. This callback function will be called with hasErrors value equals to `true` or `false`. * @see hasCurrentPageErrors * @see hasErrors * @see activePage * @see currentPage */ SurveyModel.prototype.hasPageErrors = function (page, onAsyncValidation) { if (!page) { page = this.activePage; } if (!page) return false; if (this.checkIsPageHasErrors(page)) return true; if (!onAsyncValidation) return false; return this.checkForAsyncQuestionValidation(page.questions, function (hasErrors) { return onAsyncValidation(hasErrors); }) ? undefined : false; }; /** * Returns `true`, if any of the survey pages contains errors. If there is an async function in an expression, then the function will return `undefined` value. * In this case, you should use the third `onAsyncValidation` parameter, which is a callback function: (hasErrors: boolean) => void * @param fireCallback set it to `true`, to show errors in UI. * @param focusOnFirstError set it to `true` to focus on the first question that doesn't pass the validation and make the page, where the question is located, the current. * @param onAsyncValidation use this parameter if you use async functions in your expressions. This callback function will be called with hasErrors value equals to `true` or `false`. * @see hasCurrentPageErrors * @see hasPageErrors */ SurveyModel.prototype.hasErrors = function (fireCallback, focusOnFirstError, onAsyncValidation) { if (fireCallback === void 0) { fireCallback = true; } if (focusOnFirstError === void 0) { focusOnFirstError = false; } if (!!onAsyncValidation) { fireCallback = true; } var visPages = this.visiblePages; var firstErrorPage = null; var res = false; for (var i = 0; i < visPages.length; i++) { if (visPages[i].hasErrors(fireCallback, false)) { if (!firstErrorPage) firstErrorPage = visPages[i]; res = true; } } if (focusOnFirstError && !!firstErrorPage) { this.currentPage = firstErrorPage; var questions = firstErrorPage.questions; for (var i = 0; i < questions.length; i++) { if (questions[i].errors.length > 0) { questions[i].focus(true); break; } } } if (res || !onAsyncValidation) return res; return this.checkForAsyncQuestionValidation(this.getAllQuestions(), function (hasErrors) { return onAsyncValidation(hasErrors); }) ? undefined : false; }; /** * Checks whether survey elements (pages, panels, and questions) have unique question names. * You can check for unique names for individual page and panel (and all their elements) or a question. * If the parameter is not specified, then a survey checks that all its elements have unique names. * @param element page, panel or question, it is `null` by default, that means all survey elements will be checked */ SurveyModel.prototype.ensureUniqueNames = function (element) { if (element === void 0) { element = null; } if (element == null) { for (var i = 0; i < this.pages.length; i++) { this.ensureUniqueName(this.pages[i]); } } else { this.ensureUniqueName(element); } }; SurveyModel.prototype.ensureUniqueName = function (element) { if (element.isPage) { this.ensureUniquePageName(element); } if (element.isPanel) { this.ensureUniquePanelName(element); } if (element.isPage || element.isPanel) { var elements = element.elements; for (var i = 0; i < elements.length; i++) { this.ensureUniqueNames(elements[i]); } } else { this.ensureUniqueQuestionName(element); } }; SurveyModel.prototype.ensureUniquePageName = function (element) { var _this = this; return this.ensureUniqueElementName(element, function (name) { return _this.getPageByName(name); }); }; SurveyModel.prototype.ensureUniquePanelName = function (element) { var _this = this; return this.ensureUniqueElementName(element, function (name) { return _this.getPanelByName(name); }); }; SurveyModel.prototype.ensureUniqueQuestionName = function (element) { var _this = this; return this.ensureUniqueElementName(element, function (name) { return _this.getQuestionByName(name); }); }; SurveyModel.prototype.ensureUniqueElementName = function (element, getElementByName) { var existingElement = getElementByName(element.name); if (!existingElement || existingElement == element) return; var newName = this.getNewName(element.name); while (!!getElementByName(newName)) { var newName = this.getNewName(element.name); } element.name = newName; }; SurveyModel.prototype.getNewName = function (name) { var pos = name.length; while (pos > 0 && name[pos - 1] >= "0" && name[pos - 1] <= "9") { pos--; } var base = name.substr(0, pos); var num = 0; if (pos < name.length) { num = parseInt(name.substr(pos)); } num++; return base + num; }; SurveyModel.prototype.checkIsCurrentPageHasErrors = function (isFocuseOnFirstError) { if (isFocuseOnFirstError === void 0) { isFocuseOnFirstError = undefined; } return this.checkIsPageHasErrors(this.activePage, isFocuseOnFirstError); }; SurveyModel.prototype.checkIsPageHasErrors = function (page, isFocuseOnFirstError) { if (isFocuseOnFirstError === void 0) { isFocuseOnFirstError = undefined; } if (isFocuseOnFirstError === undefined) { isFocuseOnFirstError = this.focusOnFirstError; } if (!page) return true; var res = page.hasErrors(true, isFocuseOnFirstError); this.fireValidatedErrorsOnPage(page); return res; }; SurveyModel.prototype.fireValidatedErrorsOnPage = function (page) { if (this.onValidatedErrorsOnCurrentPage.isEmpty || !page) return; var questionsOnPage = page.questions; var questions = new Array(); var errors = new Array(); for (var i = 0; i < questionsOnPage.length; i++) { var q = questionsOnPage[i]; if (q.errors.length > 0) { questions.push(q); for (var j = 0; j < q.errors.length; j++) { errors.push(q.errors[j]); } } } this.onValidatedErrorsOnCurrentPage.fire(this, { questions: questions, errors: errors, page: page, }); }; /** * Navigates user to a previous page. If the current page is the first page, `prevPage` returns `false`. `prevPage` does not perform any checks, required questions can be empty. * @see isFirstPage */ SurveyModel.prototype.prevPage = function () { if (this.isFirstPage) return false; this.resetNavigationButton(); var vPages = this.visiblePages; var index = vPages.indexOf(this.currentPage); this.currentPage = vPages[index - 1]; return true; }; /** * Completes the survey, if the current page is the last one. It returns `false` if the last page has errors. * If the last page has no errors, `completeLastPage` calls `doComplete` and returns `true`. * @see isCurrentPageHasErrors * @see nextPage * @see doComplete */ SurveyModel.prototype.completeLastPage = function () { var res = this.doCurrentPageComplete(true); if (res) { this.cancelPreview(); } return res; }; SurveyModel.prototype.navigationMouseDown = function () { this.isNavigationButtonPressed = true; return true; }; SurveyModel.prototype.resetNavigationButton = function () { this.isNavigationButtonPressed = false; }; /** * Shows preview for the survey. Switches the survey to the "preview" state. * * Details: [Preview State](https://surveyjs.io/Documentation/Library#states-preview) * @see showPreviewBeforeComplete * @see cancelPreview * @see state * @see previewText * @see editText */ SurveyModel.prototype.showPreview = function () { this.resetNavigationButton(); if (this.hasErrorsOnNavigate(true)) return false; if (this.doServerValidation(true, true)) return false; var options = { allowShowPreview: true }; this.onShowingPreview.fire(this, options); this.isShowingPreview = options.allowShowPreview; return true; }; /** * Cancels preview and switches back to the "running" state. * * Details: [Preview State](https://surveyjs.io/Documentation/Library#states-preview) * @param curPage - A new current page. If the parameter is undefined then the last page becomes the current. * @see showPreviewBeforeComplete * @see showPreview * @see state */ SurveyModel.prototype.cancelPreview = function (curPage) { if (curPage === void 0) { curPage = null; } if (!this.isShowingPreview) return; this.isShowingPreview = false; if (_helpers__WEBPACK_IMPORTED_MODULE_0__["Helpers"].isValueEmpty(curPage) && this.visiblePageCount > 0) { curPage = this.visiblePageCount - 1; } if (curPage !== null) { this.currentPage = curPage; } }; SurveyModel.prototype.cancelPreviewByPage = function (panel) { this.cancelPreview(panel["originalPage"]); }; SurveyModel.prototype.doCurrentPageComplete = function (doComplete) { if (this.isValidatingOnServer) return false; this.resetNavigationButton(); if (this.hasErrorsOnNavigate(doComplete)) return false; return this.doCurrentPageCompleteCore(doComplete); }; SurveyModel.prototype.doCurrentPageCompleteCore = function (doComplete) { if (this.doServerValidation(doComplete)) return false; if (doComplete) { this.currentPage.passed = true; return this.doComplete(); } this.doNextPage(); return true; }; Object.defineProperty(SurveyModel.prototype, "isSinglePage", { /** * Obsolete. Use the `questionsOnPageMode` property instead. * @see questionsOnPageMode */ get: function () { return this.questionsOnPageMode == "singlePage"; }, set: function (val) { this.questionsOnPageMode = val ? "singlePage" : "standard"; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "questionsOnPageMode", { /** * Gets or sets a value that specifies how the survey combines questions, panels, and pages. * * The following options are available: * * - `singlePage` - combine all survey pages in a single page. Pages will be converted to panels. * - `questionPerPage` - show one question per page. Survey will create a separate page for every question. */ get: function () { return this.getPropertyValue("questionsOnPageMode"); }, set: function (val) { this.setPropertyValue("questionsOnPageMode", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "firstPageIsStarted", { /** * Gets or sets whether the first survey page is a start page. Set this property to `true`, to make the first page a starting page. * An end user cannot navigate to the start page and the start page does not affect a survey progress. */ get: function () { return this.getPropertyValue("firstPageIsStarted", false); }, set: function (val) { this.setPropertyValue("firstPageIsStarted", val); }, enumerable: false, configurable: true }); SurveyModel.prototype.isPageStarted = function (page) { return (this.firstPageIsStarted && this.pages.length > 0 && this.pages[0] === page); }; Object.defineProperty(SurveyModel.prototype, "showPreviewBeforeComplete", { /** * Set this property to "showAllQuestions" or "showAnsweredQuestions" to allow respondents to preview answers before submitting the survey results. * * Details: [Preview State](https://surveyjs.io/Documentation/Library#states-preview) * Example: [Show Preview Before Complete](https://surveyjs.io/Examples/Library?id=survey-showpreview) * @see showPreview * @see cancelPreview * @see state * @see previewText * @see editText */ get: function () { return this.getPropertyValue("showPreviewBeforeComplete"); }, set: function (val) { this.setPropertyValue("showPreviewBeforeComplete", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "isShowPreviewBeforeComplete", { get: function () { var preview = this.showPreviewBeforeComplete; return preview == "showAllQuestions" || preview == "showAnsweredQuestions"; }, enumerable: false, configurable: true }); SurveyModel.prototype.onFirstPageIsStartedChanged = function () { if (this.pages.length == 0) return; this.isStartedState = this.firstPageIsStarted; this.pageVisibilityChanged(this.pages[0], !this.firstPageIsStarted); }; SurveyModel.prototype.onShowingPreviewChanged = function () { if (this.isDesignMode) return; if (this.isShowingPreview) { this.runningPages = this.pages.slice(0, this.pages.length); this.setupPagesForPageModes(true); } else { if (this.runningPages) { this.restoreOrigionalPages(this.runningPages); } this.runningPages = undefined; } this.runConditions(); this.updateAllElementsVisibility(this.pages); this.updateVisibleIndexes(); this.currentPageNo = 0; }; SurveyModel.prototype.onQuestionsOnPageModeChanged = function (oldValue) { if (this.isShowingPreview) return; if (this.questionsOnPageMode == "standard" || this.isDesignMode) { if (this.origionalPages) { this.restoreOrigionalPages(this.origionalPages); } this.origionalPages = undefined; } else { if (!oldValue || oldValue == "standard") { this.origionalPages = this.pages.slice(0, this.pages.length); } this.setupPagesForPageModes(this.isSinglePage); } this.runConditions(); this.updateVisibleIndexes(); }; SurveyModel.prototype.restoreOrigionalPages = function (originalPages) { this.questionHashesClear(); this.pages.splice(0, this.pages.length); for (var i = 0; i < originalPages.length; i++) { this.pages.push(originalPages[i]); } }; SurveyModel.prototype.setupPagesForPageModes = function (isSinglePage) { this.questionHashesClear(); var startIndex = this.firstPageIsStarted ? 1 : 0; _super.prototype.startLoadingFromJson.call(this); var newPages = this.createPagesForQuestionOnPageMode(isSinglePage, startIndex); var deletedLen = this.pages.length - startIndex; this.pages.splice(startIndex, deletedLen); for (var i = 0; i < newPages.length; i++) { this.pages.push(newPages[i]); } _super.prototype.endLoadingFromJson.call(this); for (var i = 0; i < newPages.length; i++) { newPages[i].endLoadingFromJson(); newPages[i].setSurveyImpl(this); } this.doElementsOnLoad(); }; SurveyModel.prototype.createPagesForQuestionOnPageMode = function (isSinglePage, startIndex) { if (isSinglePage) { return [this.createSinglePage(startIndex)]; } return this.createPagesForEveryQuestion(startIndex); }; SurveyModel.prototype.createSinglePage = function (startIndex) { var single = this.createNewPage("all"); single.setSurveyImpl(this); for (var i = startIndex; i < this.pages.length; i++) { var page = this.pages[i]; var panel = _jsonobject__WEBPACK_IMPORTED_MODULE_1__["Serializer"].createClass("panel"); panel.originalPage = page; single.addPanel(panel); var json = new _jsonobject__WEBPACK_IMPORTED_MODULE_1__["JsonObject"]().toJsonObject(page); new _jsonobject__WEBPACK_IMPORTED_MODULE_1__["JsonObject"]().toObject(json, panel); if (!this.showPageTitles) { panel.title = ""; } } return single; }; SurveyModel.prototype.createPagesForEveryQuestion = function (startIndex) { var res = []; for (var i = startIndex; i < this.pages.length; i++) { var originalPage = this.pages[i]; // Initialize randomization originalPage.setWasShown(true); for (var j = 0; j < originalPage.elements.length; j++) { var originalElement = originalPage.elements[j]; var element = _jsonobject__WEBPACK_IMPORTED_MODULE_1__["Serializer"].createClass(originalElement.getType()); if (!element) continue; var jsonObj = new _jsonobject__WEBPACK_IMPORTED_MODULE_1__["JsonObject"](); //Deserialize page properties only, excluding elements jsonObj.lightSerializing = true; var pageJson = jsonObj.toJsonObject(originalPage); var page = _jsonobject__WEBPACK_IMPORTED_MODULE_1__["Serializer"].createClass(originalPage.getType()); page.fromJSON(pageJson); page.name = "page" + (res.length + 1); page.setSurveyImpl(this); res.push(page); var json = new _jsonobject__WEBPACK_IMPORTED_MODULE_1__["JsonObject"]().toJsonObject(originalElement); new _jsonobject__WEBPACK_IMPORTED_MODULE_1__["JsonObject"]().toObject(json, element); page.addElement(element); for (var k = 0; k < page.questions.length; k++) { this.questionHashesAdded(page.questions[k]); } } } return res; }; Object.defineProperty(SurveyModel.prototype, "isFirstPage", { /** * Gets whether the current page is the first one. */ get: function () { if (this.currentPage == null) return true; return this.visiblePages.indexOf(this.currentPage) == 0; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "isShowPrevButton", { get: function () { if (this.isFirstPage || !this.showPrevButton) return false; var page = this.visiblePages[this.currentPageNo - 1]; return this.getPageMaxTimeToFinish(page) <= 0; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "isLastPage", { /** * Gets whether the current page is the last one. */ get: function () { if (this.currentPage == null) return true; var vPages = this.visiblePages; return vPages.indexOf(this.currentPage) == vPages.length - 1; }, enumerable: false, configurable: true }); /** * Completes the survey. * * Calling this function performs the following tasks: * * - writes cookie if the `cookieName` property is not empty * - sets the survey into `completed` state * - fires the `onComplete` event * - calls `sendResult` function. * * Calling the `doComplete` function does not perform any validation, unlike the `completeLastPage` function. * The function can return false, if you set options.allowComplete to false in onCompleting event. Otherwise it returns true. * It calls `navigateToUrl` after calling `onComplete` event. * In case calling `options.showDataSaving` callback in the `onComplete` event, `navigateToUrl` is used on calling `options.showDataSavingSuccess` callback. * @see completeLastPage * @see onCompleting * @see cookieName * @see state * @see onComplete * @see surveyPostId * @see completeLastPage * @see navigateToUrl * @see navigateToUrlOnCondition */ SurveyModel.prototype.doComplete = function (isCompleteOnTrigger) { if (isCompleteOnTrigger === void 0) { isCompleteOnTrigger = false; } var onCompletingOptions = { allowComplete: true, isCompleteOnTrigger: isCompleteOnTrigger, }; this.onCompleting.fire(this, onCompletingOptions); if (!onCompletingOptions.allowComplete) { this.isCompleted = false; return false; } var previousCookie = this.hasCookie; this.stopTimer(); this.setCompleted(); this.clearUnusedValues(); this.setCookie(); var self = this; var savingDataStarted = false; var onCompleteOptions = { isCompleteOnTrigger: isCompleteOnTrigger, showDataSaving: function (text) { savingDataStarted = true; self.setCompletedState("saving", text); }, showDataSavingError: function (text) { self.setCompletedState("error", text); }, showDataSavingSuccess: function (text) { self.setCompletedState("success", text); self.navigateTo(); }, showDataSavingClear: function (text) { self.setCompletedState("", ""); }, }; this.onComplete.fire(this, onCompleteOptions); if (!previousCookie && this.surveyPostId) { this.sendResult(); } if (!savingDataStarted) { this.navigateTo(); } return true; }; /** * Starts the survey. Changes the survey mode from "starting" to "running". Call this function if your survey has a start page, otherwise this function does nothing. * @see firstPageIsStarted */ SurveyModel.prototype.start = function () { if (!this.firstPageIsStarted) return false; if (this.checkIsPageHasErrors(this.startedPage, true)) return false; this.isStartedState = false; this.startTimerFromUI(); this.onStarted.fire(this, {}); if (!!this.currentPage) { this.currentPage.locStrsChanged(); } return true; }; Object.defineProperty(SurveyModel.prototype, "isValidatingOnServer", { /** * Gets whether the question values on the current page are validating on the server at the current moment. * @see onServerValidateQuestions */ get: function () { return this.getPropertyValue("isValidatingOnServer", false); }, enumerable: false, configurable: true }); SurveyModel.prototype.setIsValidatingOnServer = function (val) { if (val == this.isValidatingOnServer) return; this.setPropertyValue("isValidatingOnServer", val); this.onIsValidatingOnServerChanged(); }; SurveyModel.prototype.onIsValidatingOnServerChanged = function () { }; SurveyModel.prototype.doServerValidation = function (doComplete, isPreview) { if (isPreview === void 0) { isPreview = false; } if (!this.onServerValidateQuestions || this.onServerValidateQuestions.isEmpty) return false; if (!doComplete && this.checkErrorsMode === "onComplete") return false; var self = this; var options = { data: {}, errors: {}, survey: this, complete: function () { self.completeServerValidation(options, isPreview); }, }; if (doComplete && this.checkErrorsMode === "onComplete") { options.data = this.data; } else { var questions = this.activePage.questions; for (var i = 0; i < questions.length; i++) { var question = questions[i]; if (!question.visible) continue; var value = this.getValue(question.getValueName()); if (!this.isValueEmpty(value)) options.data[question.getValueName()] = value; } } this.setIsValidatingOnServer(true); if (typeof this.onServerValidateQuestions === "function") { this.onServerValidateQuestions(this, options); } else { this.onServerValidateQuestions.fire(this, options); } return true; }; SurveyModel.prototype.completeServerValidation = function (options, isPreview) { this.setIsValidatingOnServer(false); if (!options && !options.survey) return; var self = options.survey; var hasErrors = false; if (options.errors) { var hasToFocus = this.focusOnFirstError; for (var name in options.errors) { var question = self.getQuestionByName(name); if (question && question["errors"]) { hasErrors = true; question.addError(new _error__WEBPACK_IMPORTED_MODULE_9__["CustomError"](options.errors[name], this)); if (hasToFocus) { hasToFocus = false; if (!!question.page) { this.currentPage = question.page; } question.focus(true); } } } this.fireValidatedErrorsOnPage(this.currentPage); } if (!hasErrors) { if (isPreview) { this.isShowingPreview = true; } else { if (self.isLastPage) self.doComplete(); else self.doNextPage(); } } }; SurveyModel.prototype.doNextPage = function () { var curPage = this.currentPage; this.checkOnPageTriggers(); if (!this.isCompleted) { if (this.sendResultOnPageNext) { this.sendResult(this.surveyPostId, this.clientId, true); } if (curPage === this.currentPage) { var vPages = this.visiblePages; var index = vPages.indexOf(this.currentPage); this.currentPage = vPages[index + 1]; } } else { this.doComplete(true); } }; SurveyModel.prototype.setCompleted = function () { this.isCompleted = true; }; Object.defineProperty(SurveyModel.prototype, "processedCompletedHtml", { /** * Returns the HTML content for the complete page. * @see completedHtml */ get: function () { var html = this.renderedCompletedHtml; if (html) { return this.processHtml(html); } return "

" + this.getLocString("completingSurvey") + "

"; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "processedCompletedBeforeHtml", { /** * Returns the HTML content, that is shown to a user that had completed the survey before. * @see completedHtml * @see cookieName */ get: function () { if (this.completedBeforeHtml) { return this.processHtml(this.completedBeforeHtml); } return "

" + this.getLocString("completingSurveyBefore") + "

"; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "processedLoadingHtml", { /** * Returns the HTML content, that is shows when a survey loads the survey JSON. */ get: function () { if (this.loadingHtml) { return this.processHtml(this.loadingHtml); } return "

" + this.getLocString("loadingSurvey") + "

"; }, enumerable: false, configurable: true }); SurveyModel.prototype.getProgressInfo = function () { var pages = this.isDesignMode ? this.pages : this.visiblePages; return _survey_element__WEBPACK_IMPORTED_MODULE_2__["SurveyElement"].getProgressInfoByElements(pages, false); }; Object.defineProperty(SurveyModel.prototype, "progressText", { /** * Returns the text for the current progress. */ get: function () { var res = this.getPropertyValue("progressText", ""); if (!res) { this.updateProgressText(); res = this.getPropertyValue("progressText", ""); } return res; }, enumerable: false, configurable: true }); SurveyModel.prototype.updateProgressText = function (onValueChanged) { if (onValueChanged === void 0) { onValueChanged = false; } if (this.isCalculatingProgressText) return; if (onValueChanged && this.progressBarType == "pages" && this.onProgressText.isEmpty) return; this.isCalculatingProgressText = true; this.setPropertyValue("progressText", this.getProgressText()); this.setPropertyValue("progressValue", this.getProgress()); this.isCalculatingProgressText = false; }; SurveyModel.prototype.getProgressText = function () { if (!this.isDesignMode && this.currentPage == null) return ""; var options = { questionCount: 0, answeredQuestionCount: 0, requiredQuestionCount: 0, requiredAnsweredQuestionCount: 0, text: "", }; var type = this.progressBarType.toLowerCase(); if (type === "questions" || type === "requiredquestions" || type === "correctquestions" || !this.onProgressText.isEmpty) { var info = this.getProgressInfo(); options.questionCount = info.questionCount; options.answeredQuestionCount = info.answeredQuestionCount; options.requiredQuestionCount = info.requiredQuestionCount; options.requiredAnsweredQuestionCount = info.requiredAnsweredQuestionCount; } options.text = this.getProgressTextCore(options); this.onProgressText.fire(this, options); return options.text; }; SurveyModel.prototype.getProgressTextCore = function (info) { var type = this.progressBarType.toLowerCase(); if (type === "questions") { return this.getLocString("questionsProgressText")["format"](info.answeredQuestionCount, info.questionCount); } if (type === "requiredquestions") { return this.getLocString("questionsProgressText")["format"](info.requiredAnsweredQuestionCount, info.requiredQuestionCount); } if (type === "correctquestions") { var correctAnswersCount = this.getCorrectedAnswerCount(); return this.getLocString("questionsProgressText")["format"](correctAnswersCount, info.questionCount); } var vPages = this.isDesignMode ? this.pages : this.visiblePages; var index = this.isDesignMode ? 1 : vPages.indexOf(this.currentPage) + 1; return this.getLocString("progressText")["format"](index, vPages.length); }; SurveyModel.prototype.afterRenderSurvey = function (htmlElement) { this.onAfterRenderSurvey.fire(this, { survey: this, htmlElement: htmlElement, }); }; SurveyModel.prototype.updateQuestionCssClasses = function (question, cssClasses) { this.onUpdateQuestionCssClasses.fire(this, { question: question, cssClasses: cssClasses, }); }; SurveyModel.prototype.updatePanelCssClasses = function (panel, cssClasses) { this.onUpdatePanelCssClasses.fire(this, { panel: panel, cssClasses: cssClasses, }); }; SurveyModel.prototype.updatePageCssClasses = function (page, cssClasses) { this.onUpdatePageCssClasses.fire(this, { page: page, cssClasses: cssClasses, }); }; SurveyModel.prototype.updateChoiceItemCss = function (question, options) { options.question = question; this.onUpdateChoiceItemCss.fire(this, options); }; SurveyModel.prototype.afterRenderPage = function (htmlElement) { if (this.onAfterRenderPage.isEmpty) return; this.onAfterRenderPage.fire(this, { page: this.activePage, htmlElement: htmlElement, }); }; SurveyModel.prototype.afterRenderHeader = function (htmlElement) { if (this.onAfterRenderHeader.isEmpty) return; this.onAfterRenderHeader.fire(this, { htmlElement: htmlElement, }); }; SurveyModel.prototype.afterRenderQuestion = function (question, htmlElement) { this.onAfterRenderQuestion.fire(this, { question: question, htmlElement: htmlElement, }); }; SurveyModel.prototype.afterRenderQuestionInput = function (question, htmlElement) { if (this.onAfterRenderQuestionInput.isEmpty) return; var id = question.inputId; if (!!id && htmlElement.id !== id && typeof document !== "undefined") { var el = document.getElementById(id); if (!!el) { htmlElement = el; } } this.onAfterRenderQuestionInput.fire(this, { question: question, htmlElement: htmlElement, }); }; SurveyModel.prototype.afterRenderPanel = function (panel, htmlElement) { this.onAfterRenderPanel.fire(this, { panel: panel, htmlElement: htmlElement, }); }; SurveyModel.prototype.matrixBeforeRowAdded = function (options) { this.onMatrixBeforeRowAdded.fire(this, options); }; SurveyModel.prototype.matrixRowAdded = function (question, row) { this.onMatrixRowAdded.fire(this, { question: question, row: row }); }; SurveyModel.prototype.getQuestionByValueNameFromArray = function (valueName, name, index) { var questions = this.getQuestionsByValueName(valueName); if (!questions) return; for (var i = 0; i < questions.length; i++) { var res = questions[i].getQuestionFromArray(name, index); if (!!res) return res; } return null; }; SurveyModel.prototype.matrixRowRemoved = function (question, rowIndex, row) { this.onMatrixRowRemoved.fire(this, { question: question, rowIndex: rowIndex, row: row, }); }; SurveyModel.prototype.matrixRowRemoving = function (question, rowIndex, row) { var options = { question: question, rowIndex: rowIndex, row: row, allow: true, }; this.onMatrixRowRemoving.fire(this, options); return options.allow; }; SurveyModel.prototype.matrixAllowRemoveRow = function (question, rowIndex, row) { var options = { question: question, rowIndex: rowIndex, row: row, allow: true, }; this.onMatrixAllowRemoveRow.fire(this, options); return options.allow; }; SurveyModel.prototype.matrixCellCreating = function (question, options) { options.question = question; this.onMatrixCellCreating.fire(this, options); }; SurveyModel.prototype.matrixCellCreated = function (question, options) { options.question = question; this.onMatrixCellCreated.fire(this, options); }; SurveyModel.prototype.matrixAfterCellRender = function (question, options) { options.question = question; this.onMatrixAfterCellRender.fire(this, options); }; SurveyModel.prototype.matrixCellValueChanged = function (question, options) { options.question = question; this.onMatrixCellValueChanged.fire(this, options); }; SurveyModel.prototype.matrixCellValueChanging = function (question, options) { options.question = question; this.onMatrixCellValueChanging.fire(this, options); }; Object.defineProperty(SurveyModel.prototype, "isValidateOnValueChanging", { get: function () { return this.checkErrorsMode === "onValueChanging"; }, enumerable: false, configurable: true }); SurveyModel.prototype.matrixCellValidate = function (question, options) { options.question = question; this.onMatrixCellValidate.fire(this, options); return options.error ? new _error__WEBPACK_IMPORTED_MODULE_9__["CustomError"](options.error, this) : null; }; SurveyModel.prototype.dynamicPanelAdded = function (question) { if (this.onDynamicPanelAdded.isEmpty) return; var panels = question.panels; var panel = panels[panels.length - 1]; this.onDynamicPanelAdded.fire(this, { question: question, panel: panel }); }; SurveyModel.prototype.dynamicPanelRemoved = function (question, panelIndex, panel) { var questions = !!panel ? panel.questions : []; for (var i = 0; i < questions.length; i++) { questions[i].clearOnDeletingContainer(); } this.onDynamicPanelRemoved.fire(this, { question: question, panelIndex: panelIndex, panel: panel, }); }; SurveyModel.prototype.dynamicPanelItemValueChanged = function (question, options) { options.question = question; this.onDynamicPanelItemValueChanged.fire(this, options); }; SurveyModel.prototype.dragAndDropAllow = function (options) { options.allow = true; this.onDragDropAllow.fire(this, options); return options.allow; }; SurveyModel.prototype.elementContentVisibilityChanged = function (element) { if (this.currentPageValue) { this.currentPageValue.ensureRowsVisibility(); } this.onElementContentVisibilityChanged.fire(this, { element: element }); }; SurveyModel.prototype.getUpdatedElementTitleActions = function (element, titleActions) { if (element.isPage) return this.getUpdatedPageTitleActions(element, titleActions); if (element.isPanel) return this.getUpdatedPanelTitleActions(element, titleActions); return this.getUpdatedQuestionTitleActions(element, titleActions); }; SurveyModel.prototype.getUpdatedQuestionTitleActions = function (question, titleActions) { var options = { question: question, titleActions: titleActions, }; this.onGetQuestionTitleActions.fire(this, options); return options.titleActions; }; SurveyModel.prototype.getUpdatedPanelTitleActions = function (panel, titleActions) { var options = { panel: panel, titleActions: titleActions, }; this.onGetPanelTitleActions.fire(this, options); return options.titleActions; }; SurveyModel.prototype.getUpdatedPageTitleActions = function (page, titleActions) { var options = { page: page, titleActions: titleActions, }; this.onGetPageTitleActions.fire(this, options); return options.titleActions; }; SurveyModel.prototype.getUpdatedMatrixRowActions = function (question, row, actions) { var options = { question: question, actions: actions, row: row, }; this.onGetMatrixRowActions.fire(this, options); return options.actions; }; SurveyModel.prototype.scrollElementToTop = function (element, question, page, id) { var options = { element: element, question: question, page: page, elementId: id, cancel: false, }; this.onScrollingElementToTop.fire(this, options); if (!options.cancel) { _survey_element__WEBPACK_IMPORTED_MODULE_2__["SurveyElement"].ScrollElementToTop(options.elementId); } }; /** * Uploads a file to server. * @param question a file question object * @param name a question name * @param files files to upload * @param uploadingCallback a call back function to get the status on uploading the files */ SurveyModel.prototype.uploadFiles = function (question, name, files, uploadingCallback) { if (this.onUploadFiles.isEmpty) { uploadingCallback("error", files); } else { this.onUploadFiles.fire(this, { question: question, name: name, files: files || [], callback: uploadingCallback, }); } if (this.surveyPostId) { this.uploadFilesCore(name, files, uploadingCallback); } }; /** * Downloads a file from server * @param name a question name * @param fileValue a single file question value * @param callback a call back function to get the status on downloading the file and the downloaded file content */ SurveyModel.prototype.downloadFile = function (questionName, fileValue, callback) { if (this.onDownloadFile.isEmpty) { !!callback && callback("success", fileValue.content || fileValue); } this.onDownloadFile.fire(this, { name: questionName, content: fileValue.content || fileValue, fileValue: fileValue, callback: callback, }); }; /** * Clears files from server. * @param question question * @param name question name * @param value file question value * @param callback call back function to get the status of the clearing operation */ SurveyModel.prototype.clearFiles = function (question, name, value, fileName, callback) { if (this.onClearFiles.isEmpty) { !!callback && callback("success", value); } this.onClearFiles.fire(this, { question: question, name: name, value: value, fileName: fileName, callback: callback, }); }; SurveyModel.prototype.updateChoicesFromServer = function (question, choices, serverResult) { var options = { question: question, choices: choices, serverResult: serverResult, }; this.onLoadChoicesFromServer.fire(this, options); return options.choices; }; SurveyModel.prototype.loadedChoicesFromServer = function (question) { this.locStrsChanged(); }; SurveyModel.prototype.createSurveyService = function () { return new _dxSurveyService__WEBPACK_IMPORTED_MODULE_7__["dxSurveyService"](); }; SurveyModel.prototype.uploadFilesCore = function (name, files, uploadingCallback) { var _this = this; var responses = []; files.forEach(function (file) { if (uploadingCallback) uploadingCallback("uploading", file); _this.createSurveyService().sendFile(_this.surveyPostId, file, function (success, response) { if (success) { responses.push({ content: response, file: file }); if (responses.length === files.length) { if (uploadingCallback) uploadingCallback("success", responses); } } else { if (uploadingCallback) uploadingCallback("error", { response: response, file: file, }); } }); }); }; SurveyModel.prototype.getPage = function (index) { return this.pages[index]; }; /** * Adds an existing page to the survey. * @param page a newly added page * @param index - a page index to where insert a page. It is -1 by default and the page will be added into the end. * @see addNewPage */ SurveyModel.prototype.addPage = function (page, index) { if (index === void 0) { index = -1; } if (page == null) return; if (index < 0 || index >= this.pages.length) { this.pages.push(page); } else { this.pages.splice(index, 0, page); } }; /** * Creates a new page and adds it to a survey. Generates a new name if the `name` parameter is not specified. * @param name a page name * @param index - a page index to where insert a new page. It is -1 by default and the page will be added into the end. * @see addPage */ SurveyModel.prototype.addNewPage = function (name, index) { if (name === void 0) { name = null; } if (index === void 0) { index = -1; } var page = this.createNewPage(name); this.addPage(page, index); return page; }; /** * Removes a page from a survey. * @param page */ SurveyModel.prototype.removePage = function (page) { var index = this.pages.indexOf(page); if (index < 0) return; this.pages.splice(index, 1); if (this.currentPageValue == page) { this.currentPage = this.pages.length > 0 ? this.pages[0] : null; } }; /** * Returns a question by its name. * @param name a question name * @param caseInsensitive * @see getQuestionByValueName */ SurveyModel.prototype.getQuestionByName = function (name, caseInsensitive) { if (caseInsensitive === void 0) { caseInsensitive = false; } if (!name) return null; if (caseInsensitive) { name = name.toLowerCase(); } var hash = !!caseInsensitive ? this.questionHashes.namesInsensitive : this.questionHashes.names; var res = hash[name]; if (!res) return null; return res[0]; }; /** * Returns a question by its value name * @param valueName a question name * @param caseInsensitive * @see getQuestionByName * @see getQuestionsByValueName * @see Question.valueName */ SurveyModel.prototype.getQuestionByValueName = function (valueName, caseInsensitive) { if (caseInsensitive === void 0) { caseInsensitive = false; } var res = this.getQuestionsByValueName(valueName, caseInsensitive); return !!res ? res[0] : null; }; /** * Returns all questions by their valueName. name property is used if valueName property is empty. * @param valueName a question name * @param caseInsensitive * @see getQuestionByName * @see getQuestionByValueName * @see Question.valueName */ SurveyModel.prototype.getQuestionsByValueName = function (valueName, caseInsensitive) { if (caseInsensitive === void 0) { caseInsensitive = false; } var hash = !!caseInsensitive ? this.questionHashes.valueNamesInsensitive : this.questionHashes.valueNames; var res = hash[valueName]; if (!res) return null; return res; }; SurveyModel.prototype.getCalculatedValueByName = function (name) { for (var i = 0; i < this.calculatedValues.length; i++) { if (name == this.calculatedValues[i].name) return this.calculatedValues[i]; } return null; }; /** * Gets a list of questions by their names. * @param names an array of question names * @param caseInsensitive */ SurveyModel.prototype.getQuestionsByNames = function (names, caseInsensitive) { if (caseInsensitive === void 0) { caseInsensitive = false; } var result = []; if (!names) return result; for (var i = 0; i < names.length; i++) { if (!names[i]) continue; var question = this.getQuestionByName(names[i], caseInsensitive); if (question) result.push(question); } return result; }; /** * Returns a page on which an element (question or panel) is placed. * @param element Question or Panel */ SurveyModel.prototype.getPageByElement = function (element) { for (var i = 0; i < this.pages.length; i++) { var page = this.pages[i]; if (page.containsElement(element)) return page; } return null; }; /** * Returns a page on which a question is located. * @param question */ SurveyModel.prototype.getPageByQuestion = function (question) { return this.getPageByElement(question); }; /** * Returns a page by it's name. * @param name */ SurveyModel.prototype.getPageByName = function (name) { for (var i = 0; i < this.pages.length; i++) { if (this.pages[i].name == name) return this.pages[i]; } return null; }; /** * Returns a list of pages by their names. * @param names a list of page names */ SurveyModel.prototype.getPagesByNames = function (names) { var result = []; if (!names) return result; for (var i = 0; i < names.length; i++) { if (!names[i]) continue; var page = this.getPageByName(names[i]); if (page) result.push(page); } return result; }; /** * Returns a list of all questions in a survey. * @param visibleOnly set it `true`, if you want to get only visible questions */ SurveyModel.prototype.getAllQuestions = function (visibleOnly, includingDesignTime) { if (visibleOnly === void 0) { visibleOnly = false; } if (includingDesignTime === void 0) { includingDesignTime = false; } var result = new Array(); for (var i = 0; i < this.pages.length; i++) { this.pages[i].addQuestionsToList(result, visibleOnly, includingDesignTime); } return result; }; /** * Returns quiz questions. All visible questions that has input(s) widgets. * @see getQuizQuestionCount */ SurveyModel.prototype.getQuizQuestions = function () { var result = new Array(); var startIndex = this.firstPageIsStarted ? 1 : 0; for (var i = startIndex; i < this.pages.length; i++) { if (!this.pages[i].isVisible) continue; var questions = this.pages[i].questions; for (var j = 0; j < questions.length; j++) { var q = questions[j]; if (q.quizQuestionCount > 0) { result.push(q); } } } return result; }; /** * Returns a panel by its name. * @param name a panel name * @param caseInsensitive * @see getQuestionByName */ SurveyModel.prototype.getPanelByName = function (name, caseInsensitive) { if (caseInsensitive === void 0) { caseInsensitive = false; } var panels = this.getAllPanels(); if (caseInsensitive) name = name.toLowerCase(); for (var i = 0; i < panels.length; i++) { var panelName = panels[i].name; if (caseInsensitive) panelName = panelName.toLowerCase(); if (panelName == name) return panels[i]; } return null; }; /** * Returns a list of all survey's panels. */ SurveyModel.prototype.getAllPanels = function (visibleOnly, includingDesignTime) { if (visibleOnly === void 0) { visibleOnly = false; } if (includingDesignTime === void 0) { includingDesignTime = false; } var result = new Array(); for (var i = 0; i < this.pages.length; i++) { this.pages[i].addPanelsIntoList(result, visibleOnly, includingDesignTime); } return result; }; /** * Creates and returns a new page, but do not add it into the survey. * You can use addPage(page) function to add it into survey later. * @see addPage * @see addNewPage */ SurveyModel.prototype.createNewPage = function (name) { return new _page__WEBPACK_IMPORTED_MODULE_4__["PageModel"](name); }; SurveyModel.prototype.questionOnValueChanging = function (valueName, newValue) { if (this.onValueChanging.isEmpty) return newValue; var options = { name: valueName, question: this.getQuestionByValueName(valueName), value: this.getUnbindValue(newValue), oldValue: this.getValue(valueName), }; this.onValueChanging.fire(this, options); return options.value; }; SurveyModel.prototype.updateQuestionValue = function (valueName, newValue) { if (this.isLoadingFromJson) return; var questions = this.getQuestionsByValueName(valueName); if (!!questions) { for (var i = 0; i < questions.length; i++) { var qValue = questions[i].value; if ((qValue === newValue && Array.isArray(qValue) && !!this.editingObj) || !this.isTwoValueEquals(qValue, newValue)) { questions[i].updateValueFromSurvey(newValue); } } } }; SurveyModel.prototype.checkQuestionErrorOnValueChanged = function (question) { if (!this.isNavigationButtonPressed && (this.checkErrorsMode === "onValueChanged" || question.getAllErrors().length > 0)) { this.checkQuestionErrorOnValueChangedCore(question); } }; SurveyModel.prototype.checkQuestionErrorOnValueChangedCore = function (question) { var oldErrorCount = question.getAllErrors().length; var res = question.hasErrors(true, { isOnValueChanged: !this.isValidateOnValueChanging, }); if (!!question.page && (oldErrorCount > 0 || question.getAllErrors().length > 0)) { this.fireValidatedErrorsOnPage(question.page); } return res; }; SurveyModel.prototype.checkErrorsOnValueChanging = function (valueName, newValue) { if (this.isLoadingFromJson) return false; var questions = this.getQuestionsByValueName(valueName); if (!questions) return false; var res = false; for (var i = 0; i < questions.length; i++) { var q = questions[i]; if (!this.isTwoValueEquals(q.valueForSurvey, newValue)) { q.value = newValue; } if (this.checkQuestionErrorOnValueChangedCore(q)) res = true; res = res || q.errors.length > 0; } return res; }; SurveyModel.prototype.notifyQuestionOnValueChanged = function (valueName, newValue) { if (this.isLoadingFromJson) return; var questions = this.getQuestionsByValueName(valueName); if (!!questions) { for (var i = 0; i < questions.length; i++) { var question = questions[i]; this.checkQuestionErrorOnValueChanged(question); question.onSurveyValueChanged(newValue); this.onValueChanged.fire(this, { name: valueName, question: question, value: newValue, }); } } else { this.onValueChanged.fire(this, { name: valueName, question: null, value: newValue, }); } if (this.isDisposed) return; for (var i = 0; i < this.pages.length; i++) { this.pages[i].checkBindings(valueName, newValue); } this.notifyElementsOnAnyValueOrVariableChanged(valueName); }; SurveyModel.prototype.notifyElementsOnAnyValueOrVariableChanged = function (name) { if (this.isEndLoadingFromJson === "processing") return; if (this.isRunningConditions) { this.conditionNotifyElementsOnAnyValueOrVariableChanged = true; return; } for (var i = 0; i < this.pages.length; i++) { this.pages[i].onAnyValueChanged(name); } if (!this.isEndLoadingFromJson) { this.locStrsChanged(); } }; SurveyModel.prototype.updateAllQuestionsValue = function () { var questions = this.getAllQuestions(); for (var i = 0; i < questions.length; i++) { var q = questions[i]; var valName = q.getValueName(); q.updateValueFromSurvey(this.getValue(valName)); if (q.requireUpdateCommentValue) { q.updateCommentFromSurvey(this.getComment(valName)); } } }; SurveyModel.prototype.notifyAllQuestionsOnValueChanged = function () { var questions = this.getAllQuestions(); for (var i = 0; i < questions.length; i++) { questions[i].onSurveyValueChanged(this.getValue(questions[i].getValueName())); } }; SurveyModel.prototype.checkOnPageTriggers = function () { var questions = this.getCurrentPageQuestions(true); var values = {}; for (var i = 0; i < questions.length; i++) { var question = questions[i]; var name = question.getValueName(); values[name] = this.getValue(name); } this.addCalculatedValuesIntoFilteredValues(values); this.checkTriggers(values, true); }; SurveyModel.prototype.getCurrentPageQuestions = function (includeInvsible) { if (includeInvsible === void 0) { includeInvsible = false; } var result = []; var page = this.currentPage; if (!page) return result; for (var i = 0; i < page.questions.length; i++) { var question = page.questions[i]; if ((!includeInvsible && !question.visible) || !question.name) continue; result.push(question); } return result; }; SurveyModel.prototype.checkTriggers = function (key, isOnNextPage) { if (this.isCompleted || this.triggers.length == 0 || this.isDisplayMode) return; if (this.isTriggerIsRunning) { this.triggerValues = this.getFilteredValues(); for (var k in key) { this.triggerKeys[k] = key[k]; } return; } this.isTriggerIsRunning = true; this.triggerKeys = key; this.triggerValues = this.getFilteredValues(); var properties = this.getFilteredProperties(); for (var i = 0; i < this.triggers.length; i++) { var trigger = this.triggers[i]; if (trigger.isOnNextPage == isOnNextPage) { trigger.checkExpression(this.triggerKeys, this.triggerValues, properties); } } this.isTriggerIsRunning = false; }; SurveyModel.prototype.doElementsOnLoad = function () { for (var i = 0; i < this.pages.length; i++) { this.pages[i].onSurveyLoad(); } }; Object.defineProperty(SurveyModel.prototype, "isRunningConditions", { get: function () { return !!this.conditionValues; }, enumerable: false, configurable: true }); SurveyModel.prototype.runConditions = function () { if (this.isCompleted || this.isEndLoadingFromJson === "processing" || this.isRunningConditions) return; this.conditionValues = this.getFilteredValues(); var properties = this.getFilteredProperties(); var oldCurrentPageIndex = this.pages.indexOf(this.currentPageValue); this.runConditionsCore(properties); this.checkIfNewPagesBecomeVisible(oldCurrentPageIndex); this.conditionValues = null; if (this.isValueChangedOnRunningCondition && this.conditionRunnerCounter < _settings__WEBPACK_IMPORTED_MODULE_14__["settings"].maximumConditionRunCountOnValueChanged) { this.isValueChangedOnRunningCondition = false; this.conditionRunnerCounter++; this.runConditions(); } else { this.isValueChangedOnRunningCondition = false; this.conditionRunnerCounter = 0; if (this.conditionUpdateVisibleIndexes) { this.conditionUpdateVisibleIndexes = false; this.updateVisibleIndexes(); } if (this.conditionNotifyElementsOnAnyValueOrVariableChanged) { this.conditionNotifyElementsOnAnyValueOrVariableChanged = false; this.notifyElementsOnAnyValueOrVariableChanged(""); } } }; SurveyModel.prototype.runConditionOnValueChanged = function (name, value) { if (this.isRunningConditions) { this.conditionValues[name] = value; this.isValueChangedOnRunningCondition = true; } else { this.runConditions(); } }; SurveyModel.prototype.runConditionsCore = function (properties) { var pages = this.pages; for (var i = 0; i < this.calculatedValues.length; i++) { this.calculatedValues[i].resetCalculation(); } for (var i = 0; i < this.calculatedValues.length; i++) { this.calculatedValues[i].doCalculation(this.calculatedValues, this.conditionValues, properties); } for (var i = 0; i < pages.length; i++) { pages[i].runCondition(this.conditionValues, properties); } }; SurveyModel.prototype.checkIfNewPagesBecomeVisible = function (oldCurrentPageIndex) { var newCurrentPageIndex = this.pages.indexOf(this.currentPageValue); if (newCurrentPageIndex <= oldCurrentPageIndex + 1) return; for (var i = oldCurrentPageIndex + 1; i < newCurrentPageIndex; i++) { if (this.pages[i].isVisible) { this.currentPage = this.pages[i]; break; } } }; /** * Sends a survey result to the [api.surveyjs.io](https://api.surveyjs.io) service. * @param postId [api.surveyjs.io](https://api.surveyjs.io) service postId * @param clientId Typically a customer e-mail or an identifier * @param isPartialCompleted Set it to `true` if the survey is not completed yet and the results are intermediate * @see surveyPostId * @see clientId */ SurveyModel.prototype.sendResult = function (postId, clientId, isPartialCompleted) { if (postId === void 0) { postId = null; } if (clientId === void 0) { clientId = null; } if (isPartialCompleted === void 0) { isPartialCompleted = false; } if (!this.isEditMode) return; if (isPartialCompleted && this.onPartialSend) { this.onPartialSend.fire(this, null); } if (!postId && this.surveyPostId) { postId = this.surveyPostId; } if (!postId) return; if (clientId) { this.clientId = clientId; } if (isPartialCompleted && !this.clientId) return; var self = this; if (this.surveyShowDataSaving) { this.setCompletedState("saving", ""); } this.createSurveyService().sendResult(postId, this.data, function (success, response, request) { if (self.surveyShowDataSaving) { if (success) { self.setCompletedState("success", ""); } else { self.setCompletedState("error", response); } } self.onSendResult.fire(self, { success: success, response: response, request: request, }); }, this.clientId, isPartialCompleted); }; /** * Calls the [api.surveyjs.io](https://api.surveyjs.io) service and, on callback, fires the `onGetResult` event with all answers that your users made for a question. * @param resultId [api.surveyjs.io](https://api.surveyjs.io) service resultId * @param name The question name * @see onGetResult */ SurveyModel.prototype.getResult = function (resultId, name) { var self = this; this.createSurveyService().getResult(resultId, name, function (success, data, dataList, response) { self.onGetResult.fire(self, { success: success, data: data, dataList: dataList, response: response, }); }); }; /** * Loads the survey JSON from the [api.surveyjs.io](https://api.surveyjs.io) service. * If `clientId` is not `null` and a user had completed a survey before, the survey switches to `completedbefore` state. * @param surveyId [api.surveyjs.io](https://api.surveyjs.io) service surveyId * @param clientId users' indentifier, for example an e-mail or a unique customer id in your web application. * @see state * @see onLoadedSurveyFromService */ SurveyModel.prototype.loadSurveyFromService = function (surveyId, cliendId) { if (surveyId === void 0) { surveyId = null; } if (cliendId === void 0) { cliendId = null; } if (surveyId) { this.surveyId = surveyId; } if (cliendId) { this.clientId = cliendId; } var self = this; this.isLoading = true; this.onLoadingSurveyFromService(); if (cliendId) { this.createSurveyService().getSurveyJsonAndIsCompleted(this.surveyId, this.clientId, function (success, json, isCompleted, response) { self.isLoading = false; if (success) { self.isCompletedBefore = isCompleted == "completed"; self.loadSurveyFromServiceJson(json); } }); } else { this.createSurveyService().loadSurvey(this.surveyId, function (success, result, response) { self.isLoading = false; if (success) { self.loadSurveyFromServiceJson(result); } }); } }; SurveyModel.prototype.loadSurveyFromServiceJson = function (json) { if (!json) return; this.fromJSON(json); this.notifyAllQuestionsOnValueChanged(); this.onLoadSurveyFromService(); this.onLoadedSurveyFromService.fire(this, {}); }; SurveyModel.prototype.onLoadingSurveyFromService = function () { }; SurveyModel.prototype.onLoadSurveyFromService = function () { }; SurveyModel.prototype.resetVisibleIndexes = function () { var questions = this.getAllQuestions(true); for (var i = 0; i < questions.length; i++) { questions[i].setVisibleIndex(-1); } this.updateVisibleIndexes(); }; SurveyModel.prototype.updateVisibleIndexes = function () { if (this.isLoadingFromJson || !!this.isEndLoadingFromJson) return; if (this.isRunningConditions && this.onVisibleChanged.isEmpty && this.onPageVisibleChanged.isEmpty) { //Run update visible index only one time on finishing running conditions this.conditionUpdateVisibleIndexes = true; return; } this.updatePageVisibleIndexes(this.showPageNumbers); if (this.showQuestionNumbers == "onPage") { var visPages = this.visiblePages; for (var i = 0; i < visPages.length; i++) { visPages[i].setVisibleIndex(0); } } else { var index = this.showQuestionNumbers == "on" ? 0 : -1; for (var i = 0; i < this.pages.length; i++) { index += this.pages[i].setVisibleIndex(index); } } this.updateProgressText(true); }; SurveyModel.prototype.updatePageVisibleIndexes = function (showIndex) { var index = 0; for (var i = 0; i < this.pages.length; i++) { var isPageVisible = this.pages[i].isVisible; this.pages[i].visibleIndex = isPageVisible ? index++ : -1; this.pages[i].num = showIndex && isPageVisible ? this.pages[i].visibleIndex + 1 : -1; } }; SurveyModel.prototype.fromJSON = function (json) { if (!json) return; this.questionHashesClear(); this.jsonErrors = null; var jsonConverter = new _jsonobject__WEBPACK_IMPORTED_MODULE_1__["JsonObject"](); jsonConverter.toObject(json, this); if (jsonConverter.errors.length > 0) { this.jsonErrors = jsonConverter.errors; } }; SurveyModel.prototype.setJsonObject = function (jsonObj) { this.fromJSON(jsonObj); }; SurveyModel.prototype.endLoadingFromJson = function () { this.isEndLoadingFromJson = "processing"; this.isStartedState = this.firstPageIsStarted; this.onQuestionsOnPageModeChanged("standard"); _super.prototype.endLoadingFromJson.call(this); if (this.hasCookie) { this.doComplete(); } this.doElementsOnLoad(); this.isEndLoadingFromJson = "conditions"; this.runConditions(); this.notifyElementsOnAnyValueOrVariableChanged(""); this.isEndLoadingFromJson = null; this.updateVisibleIndexes(); }; SurveyModel.prototype.onBeforeCreating = function () { }; SurveyModel.prototype.onCreating = function () { }; SurveyModel.prototype.getProcessedTextValue = function (textValue) { this.getProcessedTextValueCore(textValue); if (!this.onProcessTextValue.isEmpty) { var wasEmpty = this.isValueEmpty(textValue.value); this.onProcessTextValue.fire(this, textValue); textValue.isExists = textValue.isExists || (wasEmpty && !this.isValueEmpty(textValue.value)); } }; SurveyModel.prototype.getProcessedTextValueCore = function (textValue) { var name = textValue.name.toLocaleLowerCase(); if (["no", "require", "title"].indexOf(name) !== -1) { return; } if (name === "pageno") { textValue.isExists = true; var page = this.currentPage; textValue.value = page != null ? this.visiblePages.indexOf(page) + 1 : 0; return; } if (name === "pagecount") { textValue.isExists = true; textValue.value = this.visiblePageCount; return; } if (name === "locale") { textValue.isExists = true; textValue.value = !!this.locale ? this.locale : _surveyStrings__WEBPACK_IMPORTED_MODULE_8__["surveyLocalization"].defaultLocale; return; } if (name === "correctedanswers" || name === "correctedanswercount") { textValue.isExists = true; textValue.value = this.getCorrectedAnswerCount(); return; } if (name === "incorrectedanswers" || name === "incorrectedanswercount") { textValue.isExists = true; textValue.value = this.getInCorrectedAnswerCount(); return; } if (name === "questioncount") { textValue.isExists = true; textValue.value = this.getQuizQuestionCount(); return; } var variable = this.getVariable(name); if (variable !== undefined) { textValue.isExists = true; textValue.value = variable; return; } var question = this.getFirstName(name); if (question) { textValue.isExists = true; var firstName = question.getValueName().toLowerCase(); name = firstName + name.substr(firstName.length); name = name.toLocaleLowerCase(); var values = {}; values[firstName] = textValue.returnDisplayValue ? question.getDisplayValue(false, undefined) : question.value; textValue.value = new _conditionProcessValue__WEBPACK_IMPORTED_MODULE_6__["ProcessValue"]().getValue(name, values); return; } var value = this.getValue(textValue.name); if (value !== undefined) { textValue.isExists = true; textValue.value = value; } }; SurveyModel.prototype.getFirstName = function (name) { name = name.toLowerCase(); var question; do { question = this.getQuestionByValueName(name, true); name = this.reduceFirstName(name); } while (!question && !!name); return question; }; SurveyModel.prototype.reduceFirstName = function (name) { var pos1 = name.lastIndexOf("."); var pos2 = name.lastIndexOf("["); if (pos1 < 0 && pos2 < 0) return ""; var pos = Math.max(pos1, pos2); return name.substr(0, pos); }; SurveyModel.prototype.clearUnusedValues = function () { var questions = this.getAllQuestions(); for (var i = 0; i < questions.length; i++) { questions[i].clearUnusedValues(); } if (this.clearInvisibleValues != "none") { this.clearInvisibleQuestionValues(); } }; SurveyModel.prototype.hasVisibleQuestionByValueName = function (valueName) { var questions = this.getQuestionsByValueName(valueName); if (!questions) return false; for (var i = 0; i < questions.length; i++) { if (questions[i].isVisible) return true; } return false; }; SurveyModel.prototype.questionCountByValueName = function (valueName) { var questions = this.getQuestionsByValueName(valueName); return !!questions ? questions.length : 0; }; SurveyModel.prototype.clearInvisibleQuestionValues = function () { var questions = this.getAllQuestions(); for (var i = 0; i < questions.length; i++) { questions[i].clearValueIfInvisible(); } }; /** * Returns a variable value. Variable, unlike values, are not stored in the survey results. * @param name A variable name * @see SetVariable */ SurveyModel.prototype.getVariable = function (name) { if (!name) return null; name = name.toLowerCase(); var res = this.variablesHash[name]; if (!this.isValueEmpty(res)) return res; if (name.indexOf(".") > -1 || name.indexOf("[") > -1) { if (new _conditionProcessValue__WEBPACK_IMPORTED_MODULE_6__["ProcessValue"]().hasValue(name, this.variablesHash)) return new _conditionProcessValue__WEBPACK_IMPORTED_MODULE_6__["ProcessValue"]().getValue(name, this.variablesHash); } return res; }; /** * Sets a variable value. Variable, unlike values, are not stored in the survey results. * @param name A variable name * @param newValue A variable new value * @see GetVariable */ SurveyModel.prototype.setVariable = function (name, newValue) { if (!name) return; name = name.toLowerCase(); this.variablesHash[name] = newValue; this.notifyElementsOnAnyValueOrVariableChanged(name); this.runConditionOnValueChanged(name, newValue); this.onVariableChanged.fire(this, { name: name, value: newValue }); }; /** * Returns all variables in the survey. Use setVariable function to create a new variable. * @see getVariable * @see setVariable */ SurveyModel.prototype.getVariableNames = function () { var res = []; for (var key in this.variablesHash) { res.push(key); } return res; }; //ISurvey data SurveyModel.prototype.getUnbindValue = function (value) { if (!!this.editingObj) return value; return _helpers__WEBPACK_IMPORTED_MODULE_0__["Helpers"].getUnbindValue(value); }; /** * Returns a question value (answer) by a question's name. * @param name A question name * @see data * @see setValue */ SurveyModel.prototype.getValue = function (name) { if (!name || name.length == 0) return null; var value = this.getDataValueCore(this.valuesHash, name); return this.getUnbindValue(value); }; /** * Sets a question value (answer). It runs all triggers and conditions (`visibleIf` properties). * * Goes to the next page if `goNextPageAutomatic` is `true` and all questions on the current page are answered correctly. * @param name A question name * @param newValue A new question value * @see data * @see getValue * @see PageModel.visibleIf * @see Question.visibleIf * @see goNextPageAutomatic */ SurveyModel.prototype.setValue = function (name, newQuestionValue, locNotification, allowNotifyValueChanged) { if (locNotification === void 0) { locNotification = false; } if (allowNotifyValueChanged === void 0) { allowNotifyValueChanged = true; } var newValue = newQuestionValue; if (allowNotifyValueChanged) { newValue = this.questionOnValueChanging(name, newQuestionValue); } if (this.isValidateOnValueChanging && this.checkErrorsOnValueChanging(name, newValue)) return; if (!this.editingObj && this.isValueEqual(name, newValue) && this.isTwoValueEquals(newValue, newQuestionValue)) return; var oldValue = this.getValue(name); if (this.isValueEmpty(newValue)) { this.deleteDataValueCore(this.valuesHash, name); } else { newValue = this.getUnbindValue(newValue); this.setDataValueCore(this.valuesHash, name, newValue); } this.updateOnSetValue(name, newValue, oldValue, locNotification, allowNotifyValueChanged); }; SurveyModel.prototype.updateOnSetValue = function (name, newValue, oldValue, locNotification, allowNotifyValueChanged) { if (locNotification === void 0) { locNotification = false; } if (allowNotifyValueChanged === void 0) { allowNotifyValueChanged = true; } this.updateQuestionValue(name, newValue); if (locNotification === true || this.isDisposed) return; var triggerKeys = {}; triggerKeys[name] = { newValue: newValue, oldValue: oldValue }; this.runConditionOnValueChanged(name, newValue); this.checkTriggers(triggerKeys, false); if (allowNotifyValueChanged) this.notifyQuestionOnValueChanged(name, newValue); if (locNotification !== "text") { this.tryGoNextPageAutomatic(name); } this.updateProgressText(true); }; SurveyModel.prototype.isValueEqual = function (name, newValue) { if (newValue === "" || newValue === undefined) newValue = null; var oldValue = this.getValue(name); if (oldValue === "" || oldValue === undefined) oldValue = null; if (newValue === null || oldValue === null) return newValue === oldValue; return this.isTwoValueEquals(newValue, oldValue); }; SurveyModel.prototype.doOnPageAdded = function (page) { page.setSurveyImpl(this); if (!page.name) page.name = this.generateNewName(this.pages, "page"); this.questionHashesPanelAdded(page); this.updateVisibleIndexes(); if (this.isDesignMode) { this.updateProgressText(); } var options = { page: page }; this.onPageAdded.fire(this, options); }; SurveyModel.prototype.doOnPageRemoved = function (page) { page.setSurveyImpl(null); this.updateVisibleIndexes(); if (this.isDesignMode) { this.updateProgressText(); } this.updateLazyRenderingRowsOnRemovingElements(); }; SurveyModel.prototype.generateNewName = function (elements, baseName) { var keys = {}; for (var i = 0; i < elements.length; i++) keys[elements[i]["name"]] = true; var index = 1; while (keys[baseName + index]) index++; return baseName + index; }; SurveyModel.prototype.tryGoNextPageAutomatic = function (name) { if (!!this.isEndLoadingFromJson || !this.goNextPageAutomatic || !this.currentPage) return; var question = this.getQuestionByValueName(name); if (!question || (!!question && (!question.visible || !question.supportGoNextPageAutomatic()))) return; if (question.hasErrors(false) && !question.supportGoNextPageError()) return; var questions = this.getCurrentPageQuestions(); if (questions.indexOf(question) < 0) return; for (var i = 0; i < questions.length; i++) { if (questions[i].hasInput && questions[i].isEmpty()) return; } if (!this.checkIsCurrentPageHasErrors(false)) { if (!this.isLastPage) { this.nextPage(); } else { if (this.goNextPageAutomatic === true && this.allowCompleteSurveyAutomatic) { if (this.isShowPreviewBeforeComplete) { this.showPreview(); } else { this.completeLastPage(); } } } } }; /** * Returns the comment value. * @param name A comment's name. * @see setComment */ SurveyModel.prototype.getComment = function (name) { var result = this.data[name + this.commentPrefix]; if (result == null) result = ""; return result; }; /** * Sets a comment value. * @param name A comment name. * @param newValue A new comment value. * @see getComment */ SurveyModel.prototype.setComment = function (name, newValue, locNotification) { if (locNotification === void 0) { locNotification = false; } if (!newValue) newValue = ""; if (this.isTwoValueEquals(newValue, this.getComment(name))) return; var commentName = name + this.commentPrefix; if (this.isValueEmpty(newValue)) { this.deleteDataValueCore(this.valuesHash, commentName); } else { this.setDataValueCore(this.valuesHash, commentName, newValue); } var questions = this.getQuestionsByValueName(name); if (!!questions) { for (var i = 0; i < questions.length; i++) { questions[i].updateCommentFromSurvey(newValue); this.checkQuestionErrorOnValueChanged(questions[i]); } } if (locNotification !== "text") { this.tryGoNextPageAutomatic(name); } var question = this.getQuestionByName(name); if (question) { this.onValueChanged.fire(this, { name: commentName, question: question, value: newValue, }); } }; /** * Removes a value from the survey results. * @param {string} name The name of the value. Typically it is a question name. */ SurveyModel.prototype.clearValue = function (name) { this.setValue(name, null); this.setComment(name, null); }; Object.defineProperty(SurveyModel.prototype, "clearValueOnDisableItems", { /** * Gets or sets whether to clear value on disable items in checkbox, dropdown and radiogroup questions. * By default, values are not cleared on disabled the corresponded items. This property is not persisted in survey JSON and you have to set it in code. */ get: function () { return this.getPropertyValue("clearValueOnDisableItems", false); }, set: function (val) { this.setPropertyValue("clearValueOnDisableItems", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "isClearValueOnHidden", { get: function () { return (this.clearInvisibleValues == "onHidden" || this.isClearValueOnHiddenContainer); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "isClearValueOnHiddenContainer", { get: function () { return (this.clearInvisibleValues == "onHiddenContainer" && !this.isShowingPreview && !this.runningPages); }, enumerable: false, configurable: true }); SurveyModel.prototype.questionVisibilityChanged = function (question, newValue) { this.updateVisibleIndexes(); this.onVisibleChanged.fire(this, { question: question, name: question.name, visible: newValue, }); }; SurveyModel.prototype.pageVisibilityChanged = function (page, newValue) { if (this.isLoadingFromJson) return; if (newValue && !this.currentPageValue) { this.currentPageValue = this.currentPage; } this.updateVisibleIndexes(); this.onPageVisibleChanged.fire(this, { page: page, visible: newValue, }); }; SurveyModel.prototype.panelVisibilityChanged = function (panel, newValue) { this.updateVisibleIndexes(); this.onPanelVisibleChanged.fire(this, { panel: panel, visible: newValue, }); }; SurveyModel.prototype.questionCreated = function (question) { this.onQuestionCreated.fire(this, { question: question }); }; SurveyModel.prototype.questionAdded = function (question, index, parentPanel, rootPanel) { if (!question.name) { question.name = this.generateNewName(this.getAllQuestions(false, true), "question"); } if (!!question.page) { this.questionHashesAdded(question); } this.updateVisibleIndexes(); this.onQuestionAdded.fire(this, { question: question, name: question.name, index: index, parentPanel: parentPanel, rootPanel: rootPanel, }); }; SurveyModel.prototype.questionRemoved = function (question) { this.questionHashesRemoved(question, question.name, question.getValueName()); this.updateVisibleIndexes(); this.onQuestionRemoved.fire(this, { question: question, name: question.name, }); this.updateLazyRenderingRowsOnRemovingElements(); }; SurveyModel.prototype.questionRenamed = function (question, oldName, oldValueName) { this.questionHashesRemoved(question, oldName, oldValueName); this.questionHashesAdded(question); }; SurveyModel.prototype.questionHashesClear = function () { this.questionHashes.names = {}; this.questionHashes.namesInsensitive = {}; this.questionHashes.valueNames = {}; this.questionHashes.valueNamesInsensitive = {}; }; SurveyModel.prototype.questionHashesPanelAdded = function (panel) { if (this.isLoadingFromJson) return; var questions = panel.questions; for (var i = 0; i < questions.length; i++) { this.questionHashesAdded(questions[i]); } }; SurveyModel.prototype.questionHashesAdded = function (question) { this.questionHashAddedCore(this.questionHashes.names, question, question.name); this.questionHashAddedCore(this.questionHashes.namesInsensitive, question, question.name.toLowerCase()); this.questionHashAddedCore(this.questionHashes.valueNames, question, question.getValueName()); this.questionHashAddedCore(this.questionHashes.valueNamesInsensitive, question, question.getValueName().toLowerCase()); }; SurveyModel.prototype.questionHashesRemoved = function (question, name, valueName) { if (!!name) { this.questionHashRemovedCore(this.questionHashes.names, question, name); this.questionHashRemovedCore(this.questionHashes.namesInsensitive, question, name.toLowerCase()); } if (!!valueName) { this.questionHashRemovedCore(this.questionHashes.valueNames, question, valueName); this.questionHashRemovedCore(this.questionHashes.valueNamesInsensitive, question, valueName.toLowerCase()); } }; SurveyModel.prototype.questionHashAddedCore = function (hash, question, name) { var res = hash[name]; if (!!res) { var res = hash[name]; if (res.indexOf(question) < 0) { res.push(question); } } else { hash[name] = [question]; } }; SurveyModel.prototype.questionHashRemovedCore = function (hash, question, name) { var res = hash[name]; if (!res) return; var index = res.indexOf(question); if (index > -1) { res.splice(index, 1); } if (res.length == 0) { delete hash[name]; } }; SurveyModel.prototype.panelAdded = function (panel, index, parentPanel, rootPanel) { if (!panel.name) { panel.name = this.generateNewName(this.getAllPanels(false, true), "panel"); } this.questionHashesPanelAdded(panel); this.updateVisibleIndexes(); this.onPanelAdded.fire(this, { panel: panel, name: panel.name, index: index, parentPanel: parentPanel, rootPanel: rootPanel, }); }; SurveyModel.prototype.panelRemoved = function (panel) { this.updateVisibleIndexes(); this.onPanelRemoved.fire(this, { panel: panel, name: panel.name }); this.updateLazyRenderingRowsOnRemovingElements(); }; SurveyModel.prototype.validateQuestion = function (question) { if (this.onValidateQuestion.isEmpty) return null; var options = { name: question.name, question: question, value: question.value, error: null, }; this.onValidateQuestion.fire(this, options); return options.error ? new _error__WEBPACK_IMPORTED_MODULE_9__["CustomError"](options.error, this) : null; }; SurveyModel.prototype.validatePanel = function (panel) { if (this.onValidatePanel.isEmpty) return null; var options = { name: panel.name, panel: panel, error: null, }; this.onValidatePanel.fire(this, options); return options.error ? new _error__WEBPACK_IMPORTED_MODULE_9__["CustomError"](options.error, this) : null; }; SurveyModel.prototype.processHtml = function (html) { var options = { html: html }; this.onProcessHtml.fire(this, options); return this.processText(options.html, true); }; SurveyModel.prototype.processText = function (text, returnDisplayValue) { return this.processTextEx(text, returnDisplayValue, false).text; }; SurveyModel.prototype.processTextEx = function (text, returnDisplayValue, doEncoding) { var res = { text: this.processTextCore(text, returnDisplayValue, doEncoding), hasAllValuesOnLastRun: true, }; res.hasAllValuesOnLastRun = this.textPreProcessor.hasAllValuesOnLastRun; return res; }; SurveyModel.prototype.processTextCore = function (text, returnDisplayValue, doEncoding) { if (doEncoding === void 0) { doEncoding = false; } if (this.isDesignMode) return text; return this.textPreProcessor.process(text, returnDisplayValue, doEncoding); }; SurveyModel.prototype.getSurveyMarkdownHtml = function (element, text, name) { var options = { element: element, text: text, name: name, html: null, }; this.onTextMarkdown.fire(this, options); return options.html; }; /** * Returns an amount of corrected quiz answers. */ SurveyModel.prototype.getCorrectedAnswerCount = function () { return this.getCorrectedAnswerCountCore(true); }; /** * Returns quiz question number. It may be different from `getQuizQuestions.length` because some widgets like matrix may have several questions. * @see getQuizQuestions */ SurveyModel.prototype.getQuizQuestionCount = function () { var questions = this.getQuizQuestions(); var res = 0; for (var i = 0; i < questions.length; i++) { res += questions[i].quizQuestionCount; } return res; }; /** * Returns an amount of incorrect quiz answers. */ SurveyModel.prototype.getInCorrectedAnswerCount = function () { return this.getCorrectedAnswerCountCore(false); }; SurveyModel.prototype.getCorrectedAnswerCountCore = function (isCorrect) { var questions = this.getQuizQuestions(); var counter = 0; var options = { question: null, result: false, correctAnswers: 0, incorrectAnswers: 0, }; for (var i = 0; i < questions.length; i++) { var q = questions[i]; var quizQuestionCount = q.quizQuestionCount; options.question = q; options.correctAnswers = q.correctAnswerCount; options.incorrectAnswers = quizQuestionCount - options.correctAnswers; options.result = options.question.isAnswerCorrect(); this.onIsAnswerCorrect.fire(this, options); if (isCorrect) { if (options.result || options.correctAnswers < quizQuestionCount) { var addCount = options.correctAnswers; if (addCount == 0 && options.result) addCount = 1; counter += addCount; } } else { if (!options.result || options.incorrectAnswers < quizQuestionCount) { counter += options.incorrectAnswers; } } } return counter; }; SurveyModel.prototype.getCorrectedAnswers = function () { return this.getCorrectedAnswerCount(); }; SurveyModel.prototype.getInCorrectedAnswers = function () { return this.getInCorrectedAnswerCount(); }; Object.defineProperty(SurveyModel.prototype, "showTimerPanel", { /** * Gets or sets a timer panel position. The timer panel displays information about how much time an end user spends on a survey/page. * * The available options: * - `top` - display timer panel in the top. * - `bottom` - display timer panel in the bottom. * - `none` - do not display a timer panel. * * If the value is not equal to 'none', the survey calls the `startTimer()` method on survey rendering. * @see showTimerPanelMode * @see startTimer * @see stopTimer */ get: function () { return this.getPropertyValue("showTimerPanel"); }, set: function (val) { this.setPropertyValue("showTimerPanel", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "isTimerPanelShowingOnTop", { get: function () { return this.isTimerStarted && this.showTimerPanel == "top"; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "isTimerPanelShowingOnBottom", { get: function () { return this.isTimerStarted && this.showTimerPanel == "bottom"; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "showTimerPanelMode", { /** * Gets or set a value that specifies whether the timer displays information for the page or for the entire survey. * * The available options: * * - `page` - show timer information for page * - `survey` - show timer information for survey * * Use the `onTimerPanelInfoText` event to change the default text. * @see showTimerPanel * @see onTimerPanelInfoText */ get: function () { return this.getPropertyValue("showTimerPanelMode"); }, set: function (val) { this.setPropertyValue("showTimerPanelMode", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "timerInfoText", { get: function () { var options = { text: this.getTimerInfoText() }; this.onTimerPanelInfoText.fire(this, options); var loc = new _localizablestring__WEBPACK_IMPORTED_MODULE_10__["LocalizableString"](this, true); loc.text = options.text; return loc.textOrHtml; }, enumerable: false, configurable: true }); SurveyModel.prototype.getTimerInfoText = function () { var page = this.currentPage; if (!page) return ""; var pageSpent = this.getDisplayTime(page.timeSpent); var surveySpent = this.getDisplayTime(this.timeSpent); var pageLimitSec = this.getPageMaxTimeToFinish(page); var pageLimit = this.getDisplayTime(pageLimitSec); var surveyLimit = this.getDisplayTime(this.maxTimeToFinish); if (this.showTimerPanelMode == "page") return this.getTimerInfoPageText(page, pageSpent, pageLimit); if (this.showTimerPanelMode == "survey") return this.getTimerInfoSurveyText(surveySpent, surveyLimit); if (this.showTimerPanelMode == "all") { if (pageLimitSec <= 0 && this.maxTimeToFinish <= 0) { return this.getLocString("timerSpentAll")["format"](pageSpent, surveySpent); } if (pageLimitSec > 0 && this.maxTimeToFinish > 0) { return this.getLocString("timerLimitAll")["format"](pageSpent, pageLimit, surveySpent, surveyLimit); } var pageText = this.getTimerInfoPageText(page, pageSpent, pageLimit); var surveyText = this.getTimerInfoSurveyText(surveySpent, surveyLimit); return pageText + " " + surveyText; } return ""; }; SurveyModel.prototype.getTimerInfoPageText = function (page, pageSpent, pageLimit) { return this.getPageMaxTimeToFinish(page) > 0 ? this.getLocString("timerLimitPage")["format"](pageSpent, pageLimit) : this.getLocString("timerSpentPage")["format"](pageSpent, pageLimit); }; SurveyModel.prototype.getTimerInfoSurveyText = function (surveySpent, surveyLimit) { return this.maxTimeToFinish > 0 ? this.getLocString("timerLimitSurvey")["format"](surveySpent, surveyLimit) : this.getLocString("timerSpentSurvey")["format"](surveySpent, surveyLimit); }; SurveyModel.prototype.getDisplayTime = function (val) { var min = Math.floor(val / 60); var sec = val % 60; var res = ""; if (min > 0) { res += min + " " + this.getLocString("timerMin"); } if (res && sec == 0) return res; if (res) res += " "; return res + sec + " " + this.getLocString("timerSec"); }; /** * Starts a timer that will calculate how much time end-user spends on the survey or on pages. * @see stopTimer * @see timeSpent */ SurveyModel.prototype.startTimer = function () { if (this.isTimerStarted || this.isDesignMode) return; var self = this; this.timerFunc = function () { self.doTimer(); }; this.isTimerStarted = true; _surveytimer__WEBPACK_IMPORTED_MODULE_12__["SurveyTimer"].instance.start(this.timerFunc); }; SurveyModel.prototype.startTimerFromUI = function () { if (this.showTimerPanel != "none" && this.state === "running") { this.startTimer(); } }; /** * Stops the timer. * @see startTimer * @see timeSpent */ SurveyModel.prototype.stopTimer = function () { if (!this.isTimerStarted) return; this.isTimerStarted = false; _surveytimer__WEBPACK_IMPORTED_MODULE_12__["SurveyTimer"].instance.stop(this.timerFunc); }; Object.defineProperty(SurveyModel.prototype, "maxTimeToFinish", { /** * Gets or sets the maximum time in seconds that end user has to complete a survey. If the value is 0 or less, an end user has no time limit to finish a survey. * @see startTimer * @see maxTimeToFinishPage */ get: function () { return this.getPropertyValue("maxTimeToFinish", 0); }, set: function (val) { this.setPropertyValue("maxTimeToFinish", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyModel.prototype, "maxTimeToFinishPage", { /** * Gets or sets the maximum time in seconds that end user has to complete a page in the survey. If the value is 0 or less, an end user has no time limit. * * You may override this value for every page. * @see startTimer * @see maxTimeToFinish * @see PageModel.maxTimeToFinish */ get: function () { return this.getPropertyValue("maxTimeToFinishPage", 0); }, set: function (val) { this.setPropertyValue("maxTimeToFinishPage", val); }, enumerable: false, configurable: true }); SurveyModel.prototype.getPageMaxTimeToFinish = function (page) { if (!page || page.maxTimeToFinish < 0) return 0; return page.maxTimeToFinish > 0 ? page.maxTimeToFinish : this.maxTimeToFinishPage; }; SurveyModel.prototype.doTimer = function () { var page = this.currentPage; if (page) { page.timeSpent = page.timeSpent + 1; } this.timeSpent = this.timeSpent + 1; this.onTimer.fire(this, {}); if (this.maxTimeToFinish > 0 && this.maxTimeToFinish == this.timeSpent) { this.completeLastPage(); } if (page) { var pageLimit = this.getPageMaxTimeToFinish(page); if (pageLimit > 0 && pageLimit == page.timeSpent) { if (this.isLastPage) { this.completeLastPage(); } else { this.nextPage(); } } } }; Object.defineProperty(SurveyModel.prototype, "inSurvey", { get: function () { return true; }, enumerable: false, configurable: true }); //ISurveyImplementor SurveyModel.prototype.getSurveyData = function () { return this; }; SurveyModel.prototype.getSurvey = function () { return this; }; SurveyModel.prototype.getTextProcessor = function () { return this; }; //ISurveyTriggerOwner SurveyModel.prototype.getObjects = function (pages, questions) { var result = []; Array.prototype.push.apply(result, this.getPagesByNames(pages)); Array.prototype.push.apply(result, this.getQuestionsByNames(questions)); return result; }; SurveyModel.prototype.setTriggerValue = function (name, value, isVariable) { if (!name) return; if (isVariable) { this.setVariable(name, value); } else { var question = this.getQuestionByName(name); if (!!question) { question.value = value; } else { var processor = new _conditionProcessValue__WEBPACK_IMPORTED_MODULE_6__["ProcessValue"](); var firstName = processor.getFirstName(name); if (firstName == name) { this.setValue(name, value); } else { if (!this.getQuestionByName(firstName)) return; var data = this.getUnbindValue(this.getFilteredValues()); processor.setValue(data, name, value); this.setValue(firstName, data[firstName]); } } } }; SurveyModel.prototype.copyTriggerValue = function (name, fromName) { if (!name || !fromName) return; var processor = new _conditionProcessValue__WEBPACK_IMPORTED_MODULE_6__["ProcessValue"](); var value = processor.getValue(fromName, this.getFilteredValues()); this.setTriggerValue(name, value, false); }; SurveyModel.prototype.focusQuestion = function (name) { var question = this.getQuestionByName(name, true); if (!question || !question.isVisible || !question.page) return false; this.isFocusingQuestion = true; this.currentPage = question.page; question.focus(); this.isFocusingQuestion = false; return true; }; SurveyModel.prototype.getElementWrapperComponentName = function (element, reason) { if (reason === "logo-image") { return "sv-logo-image"; } return SurveyModel.TemplateRendererComponentName; }; SurveyModel.prototype.getRowWrapperComponentName = function (row) { return SurveyModel.TemplateRendererComponentName; }; SurveyModel.prototype.getElementWrapperComponentData = function (element, reason) { return element; }; SurveyModel.prototype.getRowWrapperComponentData = function (row) { return row; }; SurveyModel.prototype.getItemValueWrapperComponentName = function (item, question) { return SurveyModel.TemplateRendererComponentName; }; SurveyModel.prototype.getItemValueWrapperComponentData = function (item, question) { return item; }; SurveyModel.prototype.getMatrixCellTemplateData = function (cell) { return cell.question; }; SurveyModel.prototype.searchText = function (text) { if (!!text) text = text.toLowerCase(); var res = []; for (var i = 0; i < this.pages.length; i++) { this.pages[i].searchText(text, res); } return res; }; SurveyModel.prototype.getSkeletonComponentName = function (element) { return this.skeletonComponentName; }; /** * Use this method to dispose survey model properly. */ SurveyModel.prototype.dispose = function () { this.currentPage = null; _super.prototype.dispose.call(this); this.editingObj = null; if (!this.pages) return; for (var i = 0; i < this.pages.length; i++) { this.pages[i].dispose(); } this.pages.splice(0, this.pages.length); }; SurveyModel.TemplateRendererComponentName = "sv-template-renderer"; SurveyModel.stylesManager = null; SurveyModel.platform = "unknown"; return SurveyModel; }(_survey_element__WEBPACK_IMPORTED_MODULE_2__["SurveyElementCore"])); _jsonobject__WEBPACK_IMPORTED_MODULE_1__["Serializer"].addClass("survey", [ { name: "locale", choices: function () { return _surveyStrings__WEBPACK_IMPORTED_MODULE_8__["surveyLocalization"].getLocales(true); }, onGetValue: function (obj) { return obj.locale == _surveyStrings__WEBPACK_IMPORTED_MODULE_8__["surveyLocalization"].defaultLocale ? null : obj.locale; }, }, { name: "title", serializationProperty: "locTitle", dependsOn: "locale" }, { name: "description:text", serializationProperty: "locDescription", dependsOn: "locale", }, { name: "logo", serializationProperty: "locLogo" }, { name: "logoWidth", default: "300px", minValue: 0 }, { name: "logoHeight", default: "200px", minValue: 0 }, { name: "logoFit", default: "contain", choices: ["none", "contain", "cover", "fill"], }, { name: "logoPosition", default: "left", choices: ["none", "left", "right", "top", "bottom"], }, { name: "focusFirstQuestionAutomatic:boolean", default: true }, { name: "focusOnFirstError:boolean", default: true }, { name: "completedHtml:html", serializationProperty: "locCompletedHtml" }, { name: "completedBeforeHtml:html", serializationProperty: "locCompletedBeforeHtml", }, { name: "completedHtmlOnCondition:htmlconditions", className: "htmlconditionitem", }, { name: "loadingHtml:html", serializationProperty: "locLoadingHtml" }, { name: "pages:surveypages", className: "page" }, { name: "questions", alternativeName: "elements", baseClassName: "question", visible: false, isLightSerializable: false, onGetValue: function (obj) { return null; }, onSetValue: function (obj, value, jsonConverter) { obj.pages.splice(0, obj.pages.length); var page = obj.addNewPage(""); jsonConverter.toObject({ questions: value }, page); }, }, { name: "triggers:triggers", baseClassName: "surveytrigger", classNamePart: "trigger", }, { name: "calculatedValues:calculatedvalues", className: "calculatedvalue", }, { name: "surveyId", visible: false }, { name: "surveyPostId", visible: false }, { name: "surveyShowDataSaving:boolean", visible: false }, "cookieName", "sendResultOnPageNext:boolean", { name: "showNavigationButtons", default: "bottom", choices: ["none", "top", "bottom", "both"], }, { name: "showPrevButton:boolean", default: true }, { name: "showTitle:boolean", default: true }, { name: "showPageTitles:boolean", default: true }, { name: "showCompletedPage:boolean", default: true }, "navigateToUrl", { name: "navigateToUrlOnCondition:urlconditions", className: "urlconditionitem", }, { name: "questionsOrder", default: "initial", choices: ["initial", "random"], }, "showPageNumbers:boolean", { name: "showQuestionNumbers", default: "on", choices: ["on", "onPage", "off"], }, { name: "questionTitleLocation", default: "top", choices: ["top", "bottom", "left"], }, { name: "questionDescriptionLocation", default: "underTitle", choices: ["underInput", "underTitle"], }, { name: "questionErrorLocation", default: "top", choices: ["top", "bottom"] }, { name: "showProgressBar", default: "off", choices: ["off", "top", "bottom", "both"], }, { name: "progressBarType", default: "pages", choices: [ "pages", "questions", "requiredQuestions", "correctQuestions", "buttons", ], }, { name: "mode", default: "edit", choices: ["edit", "display"] }, { name: "storeOthersAsComment:boolean", default: true }, { name: "maxTextLength:number", default: 0, minValue: 0 }, { name: "maxOthersLength:number", default: 0, minValue: 0 }, "goNextPageAutomatic:boolean", { name: "clearInvisibleValues", default: "onComplete", choices: ["none", "onComplete", "onHidden", "onHiddenContainer"], }, { name: "checkErrorsMode", default: "onNextPage", choices: ["onNextPage", "onValueChanged", "onValueChanging", "onComplete"], }, { name: "textUpdateMode", default: "onBlur", choices: ["onBlur", "onTyping"], }, { name: "autoGrowComment:boolean", default: false }, { name: "startSurveyText", serializationProperty: "locStartSurveyText" }, { name: "pagePrevText", serializationProperty: "locPagePrevText" }, { name: "pageNextText", serializationProperty: "locPageNextText" }, { name: "completeText", serializationProperty: "locCompleteText" }, { name: "previewText", serializationProperty: "locPreviewText" }, { name: "editText", serializationProperty: "locEditText" }, { name: "requiredText", default: "*" }, { name: "questionStartIndex", dependsOn: ["showQuestionNumbers"], visibleIf: function (survey) { return !survey || survey.showQuestionNumbers !== "off"; }, }, { name: "questionTitlePattern", default: "numTitleRequire", dependsOn: ["questionStartIndex", "requiredText"], choices: function (obj) { if (!obj) return []; return obj.getQuestionTitlePatternOptions(); }, }, { name: "questionTitleTemplate", visible: false, isSerializable: false, serializationProperty: "locQuestionTitleTemplate", }, { name: "firstPageIsStarted:boolean", default: false }, { name: "isSinglePage:boolean", default: false, visible: false, isSerializable: false, }, { name: "questionsOnPageMode", default: "standard", choices: ["singlePage", "standard", "questionPerPage"], }, { name: "showPreviewBeforeComplete", default: "noPreview", choices: ["noPreview", "showAllQuestions", "showAnsweredQuestions"], }, { name: "maxTimeToFinish:number", default: 0, minValue: 0 }, { name: "maxTimeToFinishPage:number", default: 0, minValue: 0 }, { name: "showTimerPanel", default: "none", choices: ["none", "top", "bottom"], }, { name: "showTimerPanelMode", default: "all", choices: ["all", "page", "survey"], }, ]); /***/ }), /***/ "./src/surveyProgress.ts": /*!*******************************!*\ !*** ./src/surveyProgress.ts ***! \*******************************/ /*! exports provided: SurveyProgressModel */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyProgressModel", function() { return SurveyProgressModel; }); /* harmony import */ var _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils/cssClassBuilder */ "./src/utils/cssClassBuilder.ts"); var SurveyProgressModel = /** @class */ (function () { function SurveyProgressModel() { } SurveyProgressModel.getProgressTextInBarCss = function (css) { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_0__["CssClassBuilder"]() .append(css.progressText) .append(css.progressTextInBar) .toString(); }; SurveyProgressModel.getProgressTextUnderBarCss = function (css) { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_0__["CssClassBuilder"]() .append(css.progressText) .append(css.progressTextUnderBar) .toString(); }; return SurveyProgressModel; }()); /***/ }), /***/ "./src/surveyProgressButtons.ts": /*!**************************************!*\ !*** ./src/surveyProgressButtons.ts ***! \**************************************/ /*! exports provided: SurveyProgressButtonsModel */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyProgressButtonsModel", function() { return SurveyProgressButtonsModel; }); /* harmony import */ var _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils/cssClassBuilder */ "./src/utils/cssClassBuilder.ts"); var SurveyProgressButtonsModel = /** @class */ (function () { function SurveyProgressButtonsModel(survey) { this.survey = survey; } SurveyProgressButtonsModel.prototype.isListElementClickable = function (index) { if (!this.survey.onServerValidateQuestions || this.survey.onServerValidateQuestions.isEmpty || this.survey.checkErrorsMode === "onComplete") { return true; } return index <= this.survey.currentPageNo + 1; }; SurveyProgressButtonsModel.prototype.getListElementCss = function (index) { if (index >= this.survey.visiblePages.length) return; return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_0__["CssClassBuilder"]() .append(this.survey.css.progressButtonsListElementPassed, this.survey.visiblePages[index].passed) .append(this.survey.css.progressButtonsListElementCurrent, this.survey.currentPageNo === index) .append(this.survey.css.progressButtonsListElementNonClickable, !this.isListElementClickable(index)) .toString(); }; SurveyProgressButtonsModel.prototype.getScrollButtonCss = function (hasScroller, isLeftScroll) { return new _utils_cssClassBuilder__WEBPACK_IMPORTED_MODULE_0__["CssClassBuilder"]() .append(this.survey.css.progressButtonsImageButtonLeft, isLeftScroll) .append(this.survey.css.progressButtonsImageButtonRight, !isLeftScroll) .append(this.survey.css.progressButtonsImageButtonHidden, !hasScroller) .toString(); }; SurveyProgressButtonsModel.prototype.clickListElement = function (index) { if (this.survey.isDesignMode) return; if (index < this.survey.currentPageNo) { this.survey.currentPageNo = index; } else if (index > this.survey.currentPageNo) { for (var i = this.survey.currentPageNo; i < index; i++) { if (!this.survey.nextPage()) break; } } }; return SurveyProgressButtonsModel; }()); /***/ }), /***/ "./src/surveyStrings.ts": /*!******************************!*\ !*** ./src/surveyStrings.ts ***! \******************************/ /*! exports provided: surveyLocalization, surveyStrings */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "surveyLocalization", function() { return surveyLocalization; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "surveyStrings", function() { return surveyStrings; }); /* harmony import */ var _localization_english__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./localization/english */ "./src/localization/english.ts"); var surveyLocalization = { currentLocaleValue: "", defaultLocaleValue: "en", locales: {}, localeNames: {}, supportedLocales: [], get currentLocale() { return this.currentLocaleValue === this.defaultLocaleValue ? "" : this.currentLocaleValue; }, set currentLocale(val) { if (val === "cz") val = "cs"; this.currentLocaleValue = val; }, get defaultLocale() { return this.defaultLocaleValue; }, set defaultLocale(val) { if (val === "cz") val = "cs"; this.defaultLocaleValue = val; }, getLocaleStrings: function (loc) { return this.locales[loc]; }, getCurrentStrings: function () { var loc = this.currentLocale ? this.locales[this.currentLocale] : this.locales[this.defaultLocale]; if (!loc) loc = this.locales[this.defaultLocale]; return loc; }, getString: function (strName) { var loc = this.getCurrentStrings(); if (!loc[strName]) loc = this.locales[this.defaultLocale]; var result = loc[strName]; if (result === undefined) { result = this.locales["en"][strName]; } return result; }, getLocales: function (removeDefaultLoc) { if (removeDefaultLoc === void 0) { removeDefaultLoc = false; } var res = []; res.push(""); var locs = this.locales; if (this.supportedLocales && this.supportedLocales.length > 0) { locs = {}; for (var i = 0; i < this.supportedLocales.length; i++) { locs[this.supportedLocales[i]] = true; } } for (var key in locs) { if (removeDefaultLoc && key == this.defaultLocale) continue; res.push(key); } var locName = function (loc) { if (!loc) return ""; var res = surveyLocalization.localeNames[loc]; if (!res) res = loc; return res.toLowerCase(); }; res.sort(function (a, b) { var str1 = locName(a); var str2 = locName(b); if (str1 === str2) return 0; return str1 < str2 ? -1 : 1; }); return res; }, }; var surveyStrings = _localization_english__WEBPACK_IMPORTED_MODULE_0__["englishStrings"]; surveyLocalization.locales["en"] = _localization_english__WEBPACK_IMPORTED_MODULE_0__["englishStrings"]; surveyLocalization.localeNames["en"] = "english"; /***/ }), /***/ "./src/surveyWindow.ts": /*!*****************************!*\ !*** ./src/surveyWindow.ts ***! \*****************************/ /*! exports provided: SurveyWindowModel */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyWindowModel", function() { return SurveyWindowModel; }); /* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base */ "./src/base.ts"); /* harmony import */ var _survey__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./survey */ "./src/survey.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); /** * A Model for a survey running in the Window. */ var SurveyWindowModel = /** @class */ (function (_super) { __extends(SurveyWindowModel, _super); function SurveyWindowModel(jsonObj, initialModel) { if (initialModel === void 0) { initialModel = null; } var _this = _super.call(this) || this; /** * Set this value to negative value, for example -1, to avoid closing the window on completing the survey. Leave it equals to 0 (default value) to close the window immediately, or set it to 3, 5, 10, ... to close the window in 3, 5, 10 seconds. */ _this.closeOnCompleteTimeout = 0; if (initialModel) { _this.surveyValue = initialModel; } else { _this.surveyValue = _this.createSurvey(jsonObj); } _this.surveyValue.showTitle = false; if ("undefined" !== typeof document) { _this.windowElement = document.createElement("div"); } var self = _this; _this.survey.onComplete.add(function (survey, options) { self.onSurveyComplete(); }); return _this; } SurveyWindowModel.prototype.getType = function () { return "window"; }; Object.defineProperty(SurveyWindowModel.prototype, "survey", { /** * A survey object. * @see SurveyModel */ get: function () { return this.surveyValue; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyWindowModel.prototype, "isShowing", { /** * Returns true if the window is currently showing. Set it to true to show the window and false to hide it. * @see show * @see hide */ get: function () { return this.getPropertyValue("isShowing", false); }, set: function (val) { if (this.isShowing == val) return; this.setPropertyValue("isShowing", val); if (this.showingChangedCallback) this.showingChangedCallback(); }, enumerable: false, configurable: true }); /** * Show the window * @see hide * @see isShowing */ SurveyWindowModel.prototype.show = function () { this.isShowing = true; }; /** * Hide the window * @see show * @see isShowing */ SurveyWindowModel.prototype.hide = function () { this.isShowing = false; }; Object.defineProperty(SurveyWindowModel.prototype, "isExpanded", { /** * Returns true if the window is expanded. Set it to true to expand the window or false to collapse it. * @see expand * @see collapse */ get: function () { return this.getPropertyValue("isExpanded", false); }, set: function (val) { this.setPropertyValue("isExpanded", val); if (!this.isLoadingFromJson && this.expandedChangedCallback) this.expandedChangedCallback(); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyWindowModel.prototype, "title", { /** * The window and survey title. */ get: function () { return this.survey.title; }, set: function (value) { this.survey.title = value; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyWindowModel.prototype, "locTitle", { get: function () { return this.survey.locTitle; }, enumerable: false, configurable: true }); /** * Expand the window to show the survey. */ SurveyWindowModel.prototype.expand = function () { this.expandcollapse(true); }; /** * Collapse the window and show survey title only. */ SurveyWindowModel.prototype.collapse = function () { this.expandcollapse(false); }; SurveyWindowModel.prototype.createSurvey = function (jsonObj) { return new _survey__WEBPACK_IMPORTED_MODULE_1__["SurveyModel"](jsonObj); }; SurveyWindowModel.prototype.expandcollapse = function (value) { this.isExpanded = value; }; SurveyWindowModel.prototype.onSurveyComplete = function () { if (this.closeOnCompleteTimeout < 0) return; if (this.closeOnCompleteTimeout == 0) { this.closeWindowOnComplete(); } else { var self = this; var timerId = null; var func = function () { self.closeWindowOnComplete(); if (typeof window !== "undefined") { window.clearInterval(timerId); } }; timerId = typeof window !== "undefined" ? window.setInterval(func, this.closeOnCompleteTimeout * 1000) : 0; } }; SurveyWindowModel.prototype.closeWindowOnComplete = function () { if (!!this.closeWindowOnCompleteCallback) { this.closeWindowOnCompleteCallback(); } }; SurveyWindowModel.surveyElementName = "windowSurveyJS"; return SurveyWindowModel; }(_base__WEBPACK_IMPORTED_MODULE_0__["Base"])); /***/ }), /***/ "./src/surveytimer.ts": /*!****************************!*\ !*** ./src/surveytimer.ts ***! \****************************/ /*! exports provided: surveyTimerFunctions, SurveyTimer */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "surveyTimerFunctions", function() { return surveyTimerFunctions; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyTimer", function() { return SurveyTimer; }); /* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base */ "./src/base.ts"); var surveyTimerFunctions = { setTimeout: function (func) { if (typeof window === "undefined") return 0; return window.setTimeout(func, 1000); }, clearTimeout: function (timerId) { if (typeof window === "undefined") return; window.clearTimeout(timerId); }, }; var SurveyTimer = /** @class */ (function () { function SurveyTimer() { this.listenerCounter = 0; this.timerId = -1; this.onTimer = new _base__WEBPACK_IMPORTED_MODULE_0__["Event"](); } Object.defineProperty(SurveyTimer, "instance", { get: function () { if (!SurveyTimer.instanceValue) { SurveyTimer.instanceValue = new SurveyTimer(); } return SurveyTimer.instanceValue; }, enumerable: false, configurable: true }); SurveyTimer.prototype.start = function (func) { var _this = this; if (func === void 0) { func = null; } if (func) { this.onTimer.add(func); } if (this.timerId < 0) { this.timerId = surveyTimerFunctions.setTimeout(function () { _this.doTimer(); }); } this.listenerCounter++; }; SurveyTimer.prototype.stop = function (func) { if (func === void 0) { func = null; } if (func) { this.onTimer.remove(func); } this.listenerCounter--; if (this.listenerCounter == 0 && this.timerId > -1) { surveyTimerFunctions.clearTimeout(this.timerId); this.timerId = -1; } }; SurveyTimer.prototype.doTimer = function () { var _this = this; if (this.timerId < 0) return; this.onTimer.fire(this, {}); this.timerId = surveyTimerFunctions.setTimeout(function () { _this.doTimer(); }); }; SurveyTimer.instanceValue = null; return SurveyTimer; }()); /***/ }), /***/ "./src/template-renderer.ts": /*!**********************************!*\ !*** ./src/template-renderer.ts ***! \**********************************/ /*! no exports provided */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /***/ }), /***/ "./src/textPreProcessor.ts": /*!*********************************!*\ !*** ./src/textPreProcessor.ts ***! \*********************************/ /*! exports provided: TextPreProcessorItem, TextPreProcessorValue, TextPreProcessor, QuestionTextProcessor */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TextPreProcessorItem", function() { return TextPreProcessorItem; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TextPreProcessorValue", function() { return TextPreProcessorValue; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TextPreProcessor", function() { return TextPreProcessor; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionTextProcessor", function() { return QuestionTextProcessor; }); /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers */ "./src/helpers.ts"); /* harmony import */ var _conditionProcessValue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./conditionProcessValue */ "./src/conditionProcessValue.ts"); var TextPreProcessorItem = /** @class */ (function () { function TextPreProcessorItem() { } return TextPreProcessorItem; }()); var TextPreProcessorValue = /** @class */ (function () { function TextPreProcessorValue(name, returnDisplayValue) { this.name = name; this.returnDisplayValue = returnDisplayValue; this.isExists = false; this.canProcess = true; } return TextPreProcessorValue; }()); var TextPreProcessor = /** @class */ (function () { function TextPreProcessor() { } TextPreProcessor.prototype.process = function (text, returnDisplayValue, doEncoding) { if (returnDisplayValue === void 0) { returnDisplayValue = false; } if (doEncoding === void 0) { doEncoding = false; } this.hasAllValuesOnLastRunValue = true; if (!text) return text; if (!this.onProcess) return text; var items = this.getItems(text); for (var i = items.length - 1; i >= 0; i--) { var item = items[i]; var name = this.getName(text.substring(item.start + 1, item.end)); if (!name) continue; var textValue = new TextPreProcessorValue(name, returnDisplayValue); this.onProcess(textValue); if (!textValue.isExists) { if (textValue.canProcess) { this.hasAllValuesOnLastRunValue = false; } continue; } if (_helpers__WEBPACK_IMPORTED_MODULE_0__["Helpers"].isValueEmpty(textValue.value)) { this.hasAllValuesOnLastRunValue = false; } var replacedValue = !_helpers__WEBPACK_IMPORTED_MODULE_0__["Helpers"].isValueEmpty(textValue.value) ? textValue.value : ""; if (doEncoding) { replacedValue = encodeURIComponent(replacedValue); } text = text.substr(0, item.start) + replacedValue + text.substr(item.end + 1); } return text; }; TextPreProcessor.prototype.processValue = function (name, returnDisplayValue) { var textValue = new TextPreProcessorValue(name, returnDisplayValue); if (!!this.onProcess) { this.onProcess(textValue); } return textValue; }; Object.defineProperty(TextPreProcessor.prototype, "hasAllValuesOnLastRun", { get: function () { return !!this.hasAllValuesOnLastRunValue; }, enumerable: false, configurable: true }); TextPreProcessor.prototype.getItems = function (text) { var items = []; var length = text.length; var start = -1; var ch = ""; for (var i = 0; i < length; i++) { ch = text[i]; if (ch == "{") start = i; if (ch == "}") { if (start > -1) { var item = new TextPreProcessorItem(); item.start = start; item.end = i; items.push(item); } start = -1; } } return items; }; TextPreProcessor.prototype.getName = function (name) { if (!name) return; return name.trim(); }; return TextPreProcessor; }()); var QuestionTextProcessor = /** @class */ (function () { function QuestionTextProcessor(variableName) { var _this = this; this.variableName = variableName; this.textPreProcessor = new TextPreProcessor(); this.textPreProcessor.onProcess = function (textValue) { _this.getProcessedTextValue(textValue); }; } QuestionTextProcessor.prototype.processValue = function (name, returnDisplayValue) { return this.textPreProcessor.processValue(name, returnDisplayValue); }; Object.defineProperty(QuestionTextProcessor.prototype, "survey", { get: function () { return null; }, enumerable: false, configurable: true }); Object.defineProperty(QuestionTextProcessor.prototype, "panel", { get: function () { return null; }, enumerable: false, configurable: true }); QuestionTextProcessor.prototype.getValues = function () { return !!this.panel ? this.panel.getValue() : null; }; QuestionTextProcessor.prototype.getQuestionByName = function (name) { return !!this.panel ? this.panel.getQuestionByValueName(name) : null; }; QuestionTextProcessor.prototype.onCustomProcessText = function (textValue) { return false; }; //ITextProcessor QuestionTextProcessor.prototype.getProcessedTextValue = function (textValue) { if (!textValue) return; if (this.onCustomProcessText(textValue)) return; var firstName = new _conditionProcessValue__WEBPACK_IMPORTED_MODULE_1__["ProcessValue"]().getFirstName(textValue.name); textValue.isExists = firstName == this.variableName; textValue.canProcess = textValue.isExists; if (!textValue.canProcess) return; //name should start with the variable name textValue.name = textValue.name.replace(this.variableName + ".", ""); var firstName = new _conditionProcessValue__WEBPACK_IMPORTED_MODULE_1__["ProcessValue"]().getFirstName(textValue.name); var question = this.getQuestionByName(firstName); var values = {}; if (question) { values[firstName] = textValue.returnDisplayValue ? question.displayValue : question.value; } else { var allValues = !!this.panel ? this.getValues() : null; if (allValues) { values[firstName] = allValues[firstName]; } } textValue.value = new _conditionProcessValue__WEBPACK_IMPORTED_MODULE_1__["ProcessValue"]().getValue(textValue.name, values); }; QuestionTextProcessor.prototype.processText = function (text, returnDisplayValue) { text = this.textPreProcessor.process(text, returnDisplayValue); var survey = this.survey; return survey ? survey.processText(text, returnDisplayValue) : text; }; QuestionTextProcessor.prototype.processTextEx = function (text, returnDisplayValue) { text = this.processText(text, returnDisplayValue); var hasAllValuesOnLastRun = this.textPreProcessor.hasAllValuesOnLastRun; var res = { hasAllValuesOnLastRun: true, text: text }; if (this.survey) { res = this.survey.processTextEx(text, returnDisplayValue, false); } res.hasAllValuesOnLastRun = res.hasAllValuesOnLastRun && hasAllValuesOnLastRun; return res; }; return QuestionTextProcessor; }()); /***/ }), /***/ "./src/trigger.ts": /*!************************!*\ !*** ./src/trigger.ts ***! \************************/ /*! exports provided: Trigger, SurveyTrigger, SurveyTriggerVisible, SurveyTriggerComplete, SurveyTriggerSetValue, SurveyTriggerSkip, SurveyTriggerRunExpression, SurveyTriggerCopyValue */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Trigger", function() { return Trigger; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyTrigger", function() { return SurveyTrigger; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyTriggerVisible", function() { return SurveyTriggerVisible; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyTriggerComplete", function() { return SurveyTriggerComplete; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyTriggerSetValue", function() { return SurveyTriggerSetValue; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyTriggerSkip", function() { return SurveyTriggerSkip; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyTriggerRunExpression", function() { return SurveyTriggerRunExpression; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyTriggerCopyValue", function() { return SurveyTriggerCopyValue; }); /* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base */ "./src/base.ts"); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _conditions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./conditions */ "./src/conditions.ts"); /* harmony import */ var _expressions_expressions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./expressions/expressions */ "./src/expressions/expressions.ts"); /* harmony import */ var _conditionProcessValue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./conditionProcessValue */ "./src/conditionProcessValue.ts"); /* harmony import */ var _settings__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./settings */ "./src/settings.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); /** * A base class for all triggers. * A trigger calls a method when the expression change the result: from false to true or from true to false. * Please note, it runs only one changing the expression result. */ var Trigger = /** @class */ (function (_super) { __extends(Trigger, _super); function Trigger() { var _this = _super.call(this) || this; _this.usedNames = []; var self = _this; _this.registerFunctionOnPropertiesValueChanged(["operator", "value", "name"], function () { self.oldPropertiesChanged(); }); _this.registerFunctionOnPropertyValueChanged("expression", function () { self.onExpressionChanged(); }); return _this; } Object.defineProperty(Trigger, "operators", { get: function () { if (Trigger.operatorsValue != null) return Trigger.operatorsValue; Trigger.operatorsValue = { empty: function (value, expectedValue) { return !value; }, notempty: function (value, expectedValue) { return !!value; }, equal: function (value, expectedValue) { return value == expectedValue; }, notequal: function (value, expectedValue) { return value != expectedValue; }, contains: function (value, expectedValue) { return value && value["indexOf"] && value.indexOf(expectedValue) > -1; }, notcontains: function (value, expectedValue) { return (!value || !value["indexOf"] || value.indexOf(expectedValue) == -1); }, greater: function (value, expectedValue) { return value > expectedValue; }, less: function (value, expectedValue) { return value < expectedValue; }, greaterorequal: function (value, expectedValue) { return value >= expectedValue; }, lessorequal: function (value, expectedValue) { return value <= expectedValue; }, }; return Trigger.operatorsValue; }, enumerable: false, configurable: true }); Trigger.prototype.getType = function () { return "triggerbase"; }; Trigger.prototype.toString = function () { var res = this.getType().replace("trigger", ""); var exp = !!this.expression ? this.expression : this.buildExpression(); if (exp) { res += ", " + exp; } return res; }; Object.defineProperty(Trigger.prototype, "operator", { get: function () { return this.getPropertyValue("operator", "equal"); }, set: function (value) { if (!value) return; value = value.toLowerCase(); if (!Trigger.operators[value]) return; this.setPropertyValue("operator", value); }, enumerable: false, configurable: true }); Object.defineProperty(Trigger.prototype, "value", { get: function () { return this.getPropertyValue("value", null); }, set: function (val) { this.setPropertyValue("value", val); }, enumerable: false, configurable: true }); Object.defineProperty(Trigger.prototype, "name", { get: function () { return this.getPropertyValue("name", ""); }, set: function (val) { this.setPropertyValue("name", val); }, enumerable: false, configurable: true }); Object.defineProperty(Trigger.prototype, "expression", { get: function () { return this.getPropertyValue("expression", ""); }, set: function (val) { this.setPropertyValue("expression", val); }, enumerable: false, configurable: true }); Trigger.prototype.checkExpression = function (keys, values, properties) { if (properties === void 0) { properties = null; } if (!this.isCheckRequired(keys)) return; if (!!this.conditionRunner) { this.perform(values, properties); } }; Trigger.prototype.check = function (value) { var triggerResult = Trigger.operators[this.operator](value, this.value); if (triggerResult) { this.onSuccess({}, null); } else { this.onFailure(); } }; Trigger.prototype.perform = function (values, properties) { var _this = this; this.conditionRunner.onRunComplete = function (res) { _this.triggerResult(res, values, properties); }; this.conditionRunner.run(values, properties); }; Trigger.prototype.triggerResult = function (res, values, properties) { if (res) { this.onSuccess(values, properties); } else { this.onFailure(); } }; Trigger.prototype.onSuccess = function (values, properties) { }; Trigger.prototype.onFailure = function () { }; Trigger.prototype.endLoadingFromJson = function () { _super.prototype.endLoadingFromJson.call(this); this.oldPropertiesChanged(); }; Trigger.prototype.oldPropertiesChanged = function () { this.onExpressionChanged(); }; Trigger.prototype.onExpressionChanged = function () { this.usedNames = []; this.hasFunction = false; this.conditionRunner = null; }; Trigger.prototype.buildExpression = function () { if (!this.name) return ""; if (this.isValueEmpty(this.value) && this.isRequireValue) return ""; return ("{" + this.name + "} " + this.operator + " " + _expressions_expressions__WEBPACK_IMPORTED_MODULE_3__["OperandMaker"].toOperandString(this.value)); }; Trigger.prototype.isCheckRequired = function (keys) { if (!keys) return false; this.buildUsedNames(); if (this.hasFunction === true) return true; var processValue = new _conditionProcessValue__WEBPACK_IMPORTED_MODULE_4__["ProcessValue"](); for (var i = 0; i < this.usedNames.length; i++) { var name = this.usedNames[i]; if (keys.hasOwnProperty(name)) return true; var firstName = processValue.getFirstName(name); if (!keys.hasOwnProperty(firstName)) continue; if (name == firstName) return true; var keyValue = keys[firstName]; if (keyValue == undefined) continue; if (!keyValue.hasOwnProperty("oldValue") || !keyValue.hasOwnProperty("newValue")) return true; var v = {}; v[firstName] = keyValue["oldValue"]; var oldValue = processValue.getValue(name, v); v[firstName] = keyValue["newValue"]; var newValue = processValue.getValue(name, v); return !this.isTwoValueEquals(oldValue, newValue); } return false; }; Trigger.prototype.buildUsedNames = function () { if (!!this.conditionRunner) return; var expression = this.expression; if (!expression) { expression = this.buildExpression(); } if (!expression) return; this.conditionRunner = new _conditions__WEBPACK_IMPORTED_MODULE_2__["ConditionRunner"](expression); this.hasFunction = this.conditionRunner.hasFunction(); this.usedNames = this.conditionRunner.getVariables(); }; Object.defineProperty(Trigger.prototype, "isRequireValue", { get: function () { return this.operator !== "empty" && this.operator != "notempty"; }, enumerable: false, configurable: true }); Trigger.operatorsValue = null; return Trigger; }(_base__WEBPACK_IMPORTED_MODULE_0__["Base"])); /** * It extends the Trigger base class and add properties required for SurveyJS classes. */ var SurveyTrigger = /** @class */ (function (_super) { __extends(SurveyTrigger, _super); function SurveyTrigger() { var _this = _super.call(this) || this; _this.ownerValue = null; return _this; } Object.defineProperty(SurveyTrigger.prototype, "owner", { get: function () { return this.ownerValue; }, enumerable: false, configurable: true }); SurveyTrigger.prototype.setOwner = function (owner) { this.ownerValue = owner; }; SurveyTrigger.prototype.getSurvey = function (live) { if (live === void 0) { live = false; } return !!this.owner && !!this.owner["getSurvey"] ? this.owner.getSurvey() : null; }; Object.defineProperty(SurveyTrigger.prototype, "isOnNextPage", { get: function () { return false; }, enumerable: false, configurable: true }); return SurveyTrigger; }(Trigger)); /** * If expression returns true, it makes questions/pages visible. * Ohterwise it makes them invisible. */ var SurveyTriggerVisible = /** @class */ (function (_super) { __extends(SurveyTriggerVisible, _super); function SurveyTriggerVisible() { var _this = _super.call(this) || this; _this.pages = []; _this.questions = []; return _this; } SurveyTriggerVisible.prototype.getType = function () { return "visibletrigger"; }; SurveyTriggerVisible.prototype.onSuccess = function (values, properties) { this.onTrigger(this.onItemSuccess); }; SurveyTriggerVisible.prototype.onFailure = function () { this.onTrigger(this.onItemFailure); }; SurveyTriggerVisible.prototype.onTrigger = function (func) { if (!this.owner) return; var objects = this.owner.getObjects(this.pages, this.questions); for (var i = 0; i < objects.length; i++) { func(objects[i]); } }; SurveyTriggerVisible.prototype.onItemSuccess = function (item) { item.visible = true; }; SurveyTriggerVisible.prototype.onItemFailure = function (item) { item.visible = false; }; return SurveyTriggerVisible; }(SurveyTrigger)); /** * If expression returns true, it completes the survey. */ var SurveyTriggerComplete = /** @class */ (function (_super) { __extends(SurveyTriggerComplete, _super); function SurveyTriggerComplete() { return _super.call(this) || this; } SurveyTriggerComplete.prototype.getType = function () { return "completetrigger"; }; Object.defineProperty(SurveyTriggerComplete.prototype, "isOnNextPage", { get: function () { return !_settings__WEBPACK_IMPORTED_MODULE_5__["settings"].executeCompleteTriggerOnValueChanged; }, enumerable: false, configurable: true }); SurveyTriggerComplete.prototype.onSuccess = function (values, properties) { if (this.owner) this.owner.setCompleted(); }; return SurveyTriggerComplete; }(SurveyTrigger)); /** * If expression returns true, the value from property **setValue** will be set to **setToName** */ var SurveyTriggerSetValue = /** @class */ (function (_super) { __extends(SurveyTriggerSetValue, _super); function SurveyTriggerSetValue() { return _super.call(this) || this; } SurveyTriggerSetValue.prototype.getType = function () { return "setvaluetrigger"; }; SurveyTriggerSetValue.prototype.onPropertyValueChanged = function (name, oldValue, newValue) { _super.prototype.onPropertyValueChanged.call(this, name, oldValue, newValue); if (name !== "setToName") return; var survey = this.getSurvey(); if (survey && !survey.isLoadingFromJson && survey.isDesignMode) { this.setValue = undefined; } }; Object.defineProperty(SurveyTriggerSetValue.prototype, "setToName", { get: function () { return this.getPropertyValue("setToName", ""); }, set: function (val) { this.setPropertyValue("setToName", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyTriggerSetValue.prototype, "setValue", { get: function () { return this.getPropertyValue("setValue"); }, set: function (val) { this.setPropertyValue("setValue", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyTriggerSetValue.prototype, "isVariable", { get: function () { return this.getPropertyValue("isVariable", false); }, set: function (val) { this.setPropertyValue("isVariable", val); }, enumerable: false, configurable: true }); SurveyTriggerSetValue.prototype.onSuccess = function (values, properties) { if (!this.setToName || !this.owner) return; this.owner.setTriggerValue(this.setToName, this.setValue, this.isVariable); }; return SurveyTriggerSetValue; }(SurveyTrigger)); /** * If expression returns true, the survey go to question **gotoName** and focus it. */ var SurveyTriggerSkip = /** @class */ (function (_super) { __extends(SurveyTriggerSkip, _super); function SurveyTriggerSkip() { return _super.call(this) || this; } SurveyTriggerSkip.prototype.getType = function () { return "skiptrigger"; }; Object.defineProperty(SurveyTriggerSkip.prototype, "gotoName", { get: function () { return this.getPropertyValue("gotoName", ""); }, set: function (val) { this.setPropertyValue("gotoName", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyTriggerSkip.prototype, "isOnNextPage", { get: function () { return !_settings__WEBPACK_IMPORTED_MODULE_5__["settings"].executeSkipTriggerOnValueChanged; }, enumerable: false, configurable: true }); SurveyTriggerSkip.prototype.onSuccess = function (values, properties) { if (!this.gotoName || !this.owner) return; this.owner.focusQuestion(this.gotoName); }; return SurveyTriggerSkip; }(SurveyTrigger)); /** * If expression returns true, the **runExpression** will be run. If **setToName** property is not empty then the result of **runExpression** will be set to it. */ var SurveyTriggerRunExpression = /** @class */ (function (_super) { __extends(SurveyTriggerRunExpression, _super); function SurveyTriggerRunExpression() { return _super.call(this) || this; } SurveyTriggerRunExpression.prototype.getType = function () { return "runexpressiontrigger"; }; Object.defineProperty(SurveyTriggerRunExpression.prototype, "setToName", { get: function () { return this.getPropertyValue("setToName", ""); }, set: function (val) { this.setPropertyValue("setToName", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyTriggerRunExpression.prototype, "runExpression", { get: function () { return this.getPropertyValue("runExpression", ""); }, set: function (val) { this.setPropertyValue("runExpression", val); }, enumerable: false, configurable: true }); SurveyTriggerRunExpression.prototype.onSuccess = function (values, properties) { var _this = this; if (!this.owner || !this.runExpression) return; var expression = new _conditions__WEBPACK_IMPORTED_MODULE_2__["ExpressionRunner"](this.runExpression); if (expression.canRun) { expression.onRunComplete = function (res) { _this.onCompleteRunExpression(res); }; expression.run(values, properties); } }; SurveyTriggerRunExpression.prototype.onCompleteRunExpression = function (newValue) { if (!!this.setToName && newValue !== undefined) { this.owner.setTriggerValue(this.setToName, newValue, false); } }; return SurveyTriggerRunExpression; }(SurveyTrigger)); /** * If expression returns true, the value from question **fromName** will be set into **setToName**. */ var SurveyTriggerCopyValue = /** @class */ (function (_super) { __extends(SurveyTriggerCopyValue, _super); function SurveyTriggerCopyValue() { return _super.call(this) || this; } Object.defineProperty(SurveyTriggerCopyValue.prototype, "setToName", { get: function () { return this.getPropertyValue("setToName", ""); }, set: function (val) { this.setPropertyValue("setToName", val); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyTriggerCopyValue.prototype, "fromName", { get: function () { return this.getPropertyValue("fromName", ""); }, set: function (val) { this.setPropertyValue("fromName", val); }, enumerable: false, configurable: true }); SurveyTriggerCopyValue.prototype.getType = function () { return "copyvaluetrigger"; }; SurveyTriggerCopyValue.prototype.onSuccess = function (values, properties) { if (!this.setToName || !this.owner) return; this.owner.copyTriggerValue(this.setToName, this.fromName); }; return SurveyTriggerCopyValue; }(SurveyTrigger)); _jsonobject__WEBPACK_IMPORTED_MODULE_1__["Serializer"].addClass("trigger", [ { name: "operator", default: "equal", visible: false }, { name: "value", visible: false }, "expression:condition", ]); _jsonobject__WEBPACK_IMPORTED_MODULE_1__["Serializer"].addClass("surveytrigger", [{ name: "name", visible: false }], null, "trigger"); _jsonobject__WEBPACK_IMPORTED_MODULE_1__["Serializer"].addClass("visibletrigger", ["pages:pages", "questions:questions"], function () { return new SurveyTriggerVisible(); }, "surveytrigger"); _jsonobject__WEBPACK_IMPORTED_MODULE_1__["Serializer"].addClass("completetrigger", [], function () { return new SurveyTriggerComplete(); }, "surveytrigger"); _jsonobject__WEBPACK_IMPORTED_MODULE_1__["Serializer"].addClass("setvaluetrigger", [ { name: "!setToName:questionvalue" }, { name: "setValue:triggervalue", dependsOn: "setToName", visibleIf: function (obj) { return !!obj && !!obj["setToName"]; }, }, { name: "isVariable:boolean", visible: false }, ], function () { return new SurveyTriggerSetValue(); }, "surveytrigger"); _jsonobject__WEBPACK_IMPORTED_MODULE_1__["Serializer"].addClass("copyvaluetrigger", [{ name: "!fromName:questionvalue" }, { name: "!setToName:questionvalue" }], function () { return new SurveyTriggerCopyValue(); }, "surveytrigger"); _jsonobject__WEBPACK_IMPORTED_MODULE_1__["Serializer"].addClass("skiptrigger", [{ name: "!gotoName:question" }], function () { return new SurveyTriggerSkip(); }, "surveytrigger"); _jsonobject__WEBPACK_IMPORTED_MODULE_1__["Serializer"].addClass("runexpressiontrigger", [{ name: "setToName:questionvalue" }, "runExpression:expression"], function () { return new SurveyTriggerRunExpression(); }, "surveytrigger"); /***/ }), /***/ "./src/utils/cssClassBuilder.ts": /*!**************************************!*\ !*** ./src/utils/cssClassBuilder.ts ***! \**************************************/ /*! exports provided: CssClassBuilder */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CssClassBuilder", function() { return CssClassBuilder; }); var CssClassBuilder = /** @class */ (function () { function CssClassBuilder() { this.classes = []; } CssClassBuilder.prototype.isEmpty = function () { return this.toString() === ""; }; CssClassBuilder.prototype.append = function (value, condition) { if (condition === void 0) { condition = true; } if (!!value && condition) this.classes.push(value); return this; }; CssClassBuilder.prototype.toString = function () { return this.classes.join(" "); }; return CssClassBuilder; }()); /***/ }), /***/ "./src/utils/is-mobile.ts": /*!********************************!*\ !*** ./src/utils/is-mobile.ts ***! \********************************/ /*! exports provided: IsMobile */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "IsMobile", function() { return IsMobile; }); var _isMobile = false; var vendor = null; if (typeof navigator !== "undefined" && typeof window !== "undefined" && navigator && window) { vendor = navigator.userAgent || navigator.vendor || window.opera; } (function (a) { if (!a) return; if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) _isMobile = true; })(vendor); var IsMobile = _isMobile; /***/ }), /***/ "./src/utils/popup.ts": /*!****************************!*\ !*** ./src/utils/popup.ts ***! \****************************/ /*! exports provided: PopupUtils */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PopupUtils", function() { return PopupUtils; }); var PopupUtils = /** @class */ (function () { function PopupUtils() { } PopupUtils.calculatePosition = function (targetRect, height, width, verticalPosition, horizontalPosition, showPointer) { if (horizontalPosition == "center") var left = (targetRect.left + targetRect.right - width) / 2; else if (horizontalPosition == "left") left = targetRect.left - width; else left = targetRect.right; if (verticalPosition == "middle") var top = (targetRect.top + targetRect.bottom - height) / 2; else if (verticalPosition == "top") top = targetRect.top - height; else top = targetRect.bottom; if (showPointer) { if (horizontalPosition != "center" && verticalPosition != "middle") { if (verticalPosition == "top") { top = top + targetRect.height; } else { top = top - targetRect.height; } } } return { left: Math.round(left), top: Math.round(top) }; }; PopupUtils.updateVerticalDimensions = function (top, height, windowHeight) { var result; if (top < 0) { result = { height: height + top, top: 0 }; } else if (height + top > windowHeight) { var newHeight = Math.min(height, windowHeight - top); result = { height: newHeight, top: top }; } return result; }; PopupUtils.updateVerticalPosition = function (targetRect, height, verticalPosition, showPointer, windowHeight) { var deltaTop = height - (targetRect.top + (showPointer ? targetRect.height : 0)); var deltaBottom = height + targetRect.bottom - (showPointer ? targetRect.height : 0) - windowHeight; if (deltaTop > 0 && deltaBottom <= 0 && verticalPosition == "top") { verticalPosition = "bottom"; } else if (deltaBottom > 0 && deltaTop <= 0 && verticalPosition == "bottom") { verticalPosition = "top"; } else if (deltaBottom > 0 && deltaTop > 0) { verticalPosition = deltaTop < deltaBottom ? "top" : "bottom"; } return verticalPosition; }; PopupUtils.calculatePopupDirection = function (verticalPosition, horizontalPosition) { var popupDirection; if (horizontalPosition == "center" && verticalPosition != "middle") { popupDirection = verticalPosition; } else if (horizontalPosition != "center") { popupDirection = horizontalPosition; } return popupDirection; }; //called when showPointer is true PopupUtils.calculatePointerTarget = function (targetRect, top, left, verticalPosition, horizontalPosition) { var targetPos = {}; if (horizontalPosition != "center") { targetPos.top = targetRect.top + targetRect.height / 2; targetPos.left = targetRect[horizontalPosition]; } else if (verticalPosition != "middle") { targetPos.top = targetRect[verticalPosition]; targetPos.left = targetRect.left + targetRect.width / 2; } targetPos.left = Math.round(targetPos.left - left); targetPos.top = Math.round(targetPos.top - top); return targetPos; }; return PopupUtils; }()); /***/ }), /***/ "./src/utils/responsivity-manager.ts": /*!*******************************************!*\ !*** ./src/utils/responsivity-manager.ts ***! \*******************************************/ /*! exports provided: ResponsivityManager, VerticalResponsivityManager */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ResponsivityManager", function() { return ResponsivityManager; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VerticalResponsivityManager", function() { return VerticalResponsivityManager; }); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var ResponsivityManager = /** @class */ (function () { function ResponsivityManager(container, model, itemsSelector, dotsItemSize) { var _this = this; if (dotsItemSize === void 0) { dotsItemSize = 48; } this.container = container; this.model = model; this.itemsSelector = itemsSelector; this.dotsItemSize = dotsItemSize; this.resizeObserver = undefined; this.isInitialized = false; this.minDimensionConst = 56; this.separatorSize = 17; this.getComputedStyle = window.getComputedStyle.bind(window); this.model.updateCallback = function (isResetInitialized) { if (isResetInitialized) _this.isInitialized = false; else _this.process(); }; if (typeof ResizeObserver !== "undefined") { this.resizeObserver = new ResizeObserver(function (_) { return _this.process(); }); this.resizeObserver.observe(this.container.parentElement); } } ResponsivityManager.prototype.getDimensions = function (element) { return { scroll: element.scrollWidth, offset: element.offsetWidth, }; }; ResponsivityManager.prototype.getAvailableSpace = function () { var style = this.getComputedStyle(this.container); var space = this.container.offsetWidth; if (style.boxSizing === "border-box") { space -= parseFloat(style.paddingLeft) + parseFloat(style.paddingRight); } return space; }; ResponsivityManager.prototype.calcItemSize = function (item) { return item.offsetWidth; }; ResponsivityManager.prototype.calcItemsSizes = function () { var _this = this; var actions = this.model.actions; this.container .querySelectorAll(this.itemsSelector) .forEach(function (item, index) { var currentAction = actions[index]; currentAction.maxDimension = _this.calcItemSize(item); currentAction.minDimension = currentAction.canShrink ? _this.minDimensionConst + (currentAction.needSeparator ? _this.separatorSize : 0) : currentAction.maxDimension; }); }; Object.defineProperty(ResponsivityManager.prototype, "isContainerVisible", { get: function () { return !!(this.container.offsetWidth || this.container.offsetHeight || this.container.getClientRects().length); }, enumerable: false, configurable: true }); ResponsivityManager.prototype.process = function () { if (this.isContainerVisible) { if (!this.isInitialized) { this.model.actions.forEach(function (action) { return (action.mode = "large"); }); this.calcItemsSizes(); this.isInitialized = true; } this.model.fit(this.getAvailableSpace(), this.dotsItemSize); } }; ResponsivityManager.prototype.dispose = function () { this.model.updateCallback = undefined; if (!!this.resizeObserver) { this.resizeObserver.disconnect(); } }; return ResponsivityManager; }()); var VerticalResponsivityManager = /** @class */ (function (_super) { __extends(VerticalResponsivityManager, _super); function VerticalResponsivityManager(container, model, itemsSelector, dotsItemSize) { var _this = _super.call(this, container, model, itemsSelector, dotsItemSize) || this; _this.minDimensionConst = 40; return _this; } VerticalResponsivityManager.prototype.getDimensions = function () { return { scroll: this.container.scrollHeight, offset: this.container.offsetHeight, }; }; VerticalResponsivityManager.prototype.getAvailableSpace = function () { var style = this.getComputedStyle(this.container); var space = this.container.offsetHeight; if (style.boxSizing === "border-box") { space -= parseFloat(style.paddingTop) + parseFloat(style.paddingBottom); } return space; }; VerticalResponsivityManager.prototype.calcItemSize = function (item) { return item.offsetHeight; }; return VerticalResponsivityManager; }(ResponsivityManager)); /***/ }), /***/ "./src/utils/utils.ts": /*!****************************!*\ !*** ./src/utils/utils.ts ***! \****************************/ /*! exports provided: unwrap, getSize, compareVersions, confirmAction, detectIEOrEdge, detectIEBrowser, loadFileFromBase64, isMobile, isElementVisible, findScrollableParent, scrollElementByChildId, createSvg, doKey2ClickUp, doKey2ClickDown, getIconNameFromProxy, increaseHeightByContent, getOriginalEvent, preventDefaults */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "unwrap", function() { return unwrap; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getSize", function() { return getSize; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "compareVersions", function() { return compareVersions; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "confirmAction", function() { return confirmAction; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "detectIEOrEdge", function() { return detectIEOrEdge; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "detectIEBrowser", function() { return detectIEBrowser; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "loadFileFromBase64", function() { return loadFileFromBase64; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isMobile", function() { return isMobile; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isElementVisible", function() { return isElementVisible; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "findScrollableParent", function() { return findScrollableParent; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scrollElementByChildId", function() { return scrollElementByChildId; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createSvg", function() { return createSvg; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "doKey2ClickUp", function() { return doKey2ClickUp; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "doKey2ClickDown", function() { return doKey2ClickDown; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getIconNameFromProxy", function() { return getIconNameFromProxy; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "increaseHeightByContent", function() { return increaseHeightByContent; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getOriginalEvent", function() { return getOriginalEvent; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "preventDefaults", function() { return preventDefaults; }); /* harmony import */ var _settings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../settings */ "./src/settings.ts"); function compareVersions(a, b) { var regExStrip0 = /(\.0+)+$/; var segmentsA = a.replace(regExStrip0, "").split("."); var segmentsB = b.replace(regExStrip0, "").split("."); var len = Math.min(segmentsA.length, segmentsB.length); for (var i = 0; i < len; i++) { var diff = parseInt(segmentsA[i], 10) - parseInt(segmentsB[i], 10); if (diff) { return diff; } } return segmentsA.length - segmentsB.length; } function confirmAction(message) { if (!!_settings__WEBPACK_IMPORTED_MODULE_0__["settings"] && !!_settings__WEBPACK_IMPORTED_MODULE_0__["settings"].confirmActionFunc) return _settings__WEBPACK_IMPORTED_MODULE_0__["settings"].confirmActionFunc(message); return confirm(message); } function detectIEBrowser() { if (typeof window === "undefined") return false; var ua = window.navigator.userAgent; var oldIe = ua.indexOf("MSIE "); var elevenIe = ua.indexOf("Trident/"); return oldIe > -1 || elevenIe > -1; } function detectIEOrEdge() { if (typeof window === "undefined") return false; if (typeof detectIEOrEdge.isIEOrEdge === "undefined") { var ua = window.navigator.userAgent; var msie = ua.indexOf("MSIE "); var trident = ua.indexOf("Trident/"); var edge = ua.indexOf("Edge/"); detectIEOrEdge.isIEOrEdge = edge > 0 || trident > 0 || msie > 0; } return detectIEOrEdge.isIEOrEdge; } function loadFileFromBase64(b64Data, fileName) { try { var byteString = atob(b64Data.split(",")[1]); // separate out the mime component var mimeString = b64Data .split(",")[0] .split(":")[1] .split(";")[0]; // write the bytes of the string to an ArrayBuffer var ab = new ArrayBuffer(byteString.length); var ia = new Uint8Array(ab); for (var i = 0; i < byteString.length; i++) { ia[i] = byteString.charCodeAt(i); } // write the ArrayBuffer to a blob, and you're done var bb = new Blob([ab], { type: mimeString }); if (typeof window !== "undefined" && window.navigator && window.navigator["msSaveBlob"]) { window.navigator["msSaveOrOpenBlob"](bb, fileName); } } catch (err) { } } function isMobile() { return (typeof window !== "undefined" && typeof window.orientation !== "undefined"); } function isElementVisible(element, threshold) { if (threshold === void 0) { threshold = 0; } if (typeof document === "undefined") { return false; } var elementRect = element.getBoundingClientRect(); var viewHeight = Math.max(document.documentElement.clientHeight, window.innerHeight); var topWin = -threshold; var bottomWin = viewHeight + threshold; var topEl = elementRect.top; var bottomEl = elementRect.bottom; var maxTop = Math.max(topWin, topEl); var minBottom = Math.min(bottomWin, bottomEl); return maxTop <= minBottom; } function findScrollableParent(element) { if (!element) { return document.documentElement; } if (element.scrollHeight > element.clientHeight && (getComputedStyle(element).overflowY === "scroll" || getComputedStyle(element).overflowY === "auto")) { return element; } else { return findScrollableParent(element.parentElement); } } function scrollElementByChildId(id) { if (!document) return; var el = document.getElementById(id); if (!el) return; var scrollableEl = findScrollableParent(el); if (!!scrollableEl) { scrollableEl.dispatchEvent(new CustomEvent("scroll")); } } function getIconNameFromProxy(iconName) { if (!iconName) return iconName; var proxyName = _settings__WEBPACK_IMPORTED_MODULE_0__["settings"].customIcons[iconName]; return !!proxyName ? proxyName : iconName; } function createSvg(size, width, height, iconName, svgElem) { svgElem.style.width = (size || width || 16) + "px"; svgElem.style.height = (size || height || 16) + "px"; var node = svgElem.childNodes[0]; var realIconName = getIconNameFromProxy(iconName); node.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:href", "#" + realIconName); } function unwrap(value) { if (typeof value !== "function") { return value; } else { return value(); } } function getSize(value) { if (typeof value === "number") { return "" + value + "px"; } if (!!value && typeof value === "string" && value.length > 0) { var lastSymbol = value[value.length - 1]; if ((lastSymbol >= "0" && lastSymbol <= "9") || lastSymbol == ".") { try { var num = parseFloat(value); return "" + num + "px"; } catch (_a) { } } } return value; } function doKey2ClickUp(evt, options) { if (options === void 0) { options = { processEsc: true }; } if (!!evt.target && evt.target["contentEditable"] === "true") { return; } var element = evt.target; if (!element) return; var char = evt.which || evt.keyCode; if (char === 13 || char === 32) { if (element.click) element.click(); } else if (options.processEsc && char === 27) { if (element.blur) element.blur(); } } function doKey2ClickDown(evt, options) { if (options === void 0) { options = { processEsc: true }; } if (!!evt.target && evt.target["contentEditable"] === "true") { return; } var char = evt.which || evt.keyCode; var supportedCodes = [13, 32]; if (options.processEsc) { supportedCodes.push(27); } if (supportedCodes.indexOf(char) !== -1) { evt.preventDefault(); } } function increaseHeightByContent(element, getComputedStyle) { if (!element) return; if (!getComputedStyle) getComputedStyle = function (elt) { return window.getComputedStyle(elt); }; var style = getComputedStyle(element); element.style.height = "auto"; element.style.height = (element.scrollHeight + parseFloat(style.borderTopWidth) + parseFloat(style.borderBottomWidth)) + "px"; } function getOriginalEvent(event) { return event.originalEvent || event; } function preventDefaults(event) { event.preventDefault(); event.stopPropagation(); } /***/ }), /***/ "./src/validator.ts": /*!**************************!*\ !*** ./src/validator.ts ***! \**************************/ /*! exports provided: ValidatorResult, SurveyValidator, ValidatorRunner, NumericValidator, TextValidator, AnswerCountValidator, RegexValidator, EmailValidator, ExpressionValidator */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ValidatorResult", function() { return ValidatorResult; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyValidator", function() { return SurveyValidator; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ValidatorRunner", function() { return ValidatorRunner; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NumericValidator", function() { return NumericValidator; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TextValidator", function() { return TextValidator; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AnswerCountValidator", function() { return AnswerCountValidator; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RegexValidator", function() { return RegexValidator; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EmailValidator", function() { return EmailValidator; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ExpressionValidator", function() { return ExpressionValidator; }); /* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base */ "./src/base.ts"); /* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./error */ "./src/error.ts"); /* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./surveyStrings */ "./src/surveyStrings.ts"); /* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./jsonobject */ "./src/jsonobject.ts"); /* harmony import */ var _conditions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./conditions */ "./src/conditions.ts"); /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./helpers */ "./src/helpers.ts"); var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var ValidatorResult = /** @class */ (function () { function ValidatorResult(value, error) { if (error === void 0) { error = null; } this.value = value; this.error = error; } return ValidatorResult; }()); /** * Base SurveyJS validator class. */ var SurveyValidator = /** @class */ (function (_super) { __extends(SurveyValidator, _super); function SurveyValidator() { var _this = _super.call(this) || this; _this.createLocalizableString("text", _this, true); return _this; } SurveyValidator.prototype.getSurvey = function (live) { if (live === void 0) { live = false; } return !!this.errorOwner && !!this.errorOwner["getSurvey"] ? this.errorOwner.getSurvey() : null; }; Object.defineProperty(SurveyValidator.prototype, "text", { get: function () { return this.getLocalizableStringText("text"); }, set: function (value) { this.setLocalizableStringText("text", value); }, enumerable: false, configurable: true }); Object.defineProperty(SurveyValidator.prototype, "isValidateAllValues", { get: function () { return false; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyValidator.prototype, "locText", { get: function () { return this.getLocalizableString("text"); }, enumerable: false, configurable: true }); SurveyValidator.prototype.getErrorText = function (name) { if (this.text) return this.text; return this.getDefaultErrorText(name); }; SurveyValidator.prototype.getDefaultErrorText = function (name) { return ""; }; SurveyValidator.prototype.validate = function (value, name, values, properties) { if (name === void 0) { name = null; } if (values === void 0) { values = null; } if (properties === void 0) { properties = null; } return null; }; Object.defineProperty(SurveyValidator.prototype, "isRunning", { get: function () { return false; }, enumerable: false, configurable: true }); Object.defineProperty(SurveyValidator.prototype, "isAsync", { get: function () { return false; }, enumerable: false, configurable: true }); SurveyValidator.prototype.getLocale = function () { return !!this.errorOwner ? this.errorOwner.getLocale() : ""; }; SurveyValidator.prototype.getMarkdownHtml = function (text, name) { return !!this.errorOwner ? this.errorOwner.getMarkdownHtml(text, name) : null; }; SurveyValidator.prototype.getRenderer = function (name) { return !!this.errorOwner ? this.errorOwner.getRenderer(name) : null; }; SurveyValidator.prototype.getRendererContext = function (locStr) { return !!this.errorOwner ? this.errorOwner.getRendererContext(locStr) : locStr; }; SurveyValidator.prototype.getProcessedText = function (text) { return !!this.errorOwner ? this.errorOwner.getProcessedText(text) : text; }; SurveyValidator.prototype.createCustomError = function (name) { return new _error__WEBPACK_IMPORTED_MODULE_1__["CustomError"](this.getErrorText(name), this.errorOwner); }; SurveyValidator.prototype.toString = function () { var res = this.getType().replace("validator", ""); if (!!this.text) { res += ", " + this.text; } return res; }; return SurveyValidator; }(_base__WEBPACK_IMPORTED_MODULE_0__["Base"])); var ValidatorRunner = /** @class */ (function () { function ValidatorRunner() { } ValidatorRunner.prototype.run = function (owner) { var _this = this; var res = []; var values = null; var properties = null; this.prepareAsyncValidators(); var asyncResults = []; var validators = owner.getValidators(); for (var i = 0; i < validators.length; i++) { var validator = validators[i]; if (!values && validator.isValidateAllValues) { values = owner.getDataFilteredValues(); properties = owner.getDataFilteredProperties(); } if (validator.isAsync) { this.asyncValidators.push(validator); validator.onAsyncCompleted = function (result) { if (!!result && !!result.error) asyncResults.push(result.error); if (!_this.onAsyncCompleted) return; for (var i = 0; i < _this.asyncValidators.length; i++) { if (_this.asyncValidators[i].isRunning) return; } _this.onAsyncCompleted(asyncResults); }; } } validators = owner.getValidators(); for (var i = 0; i < validators.length; i++) { var validator = validators[i]; var validatorResult = validator.validate(owner.validatedValue, owner.getValidatorTitle(), values, properties); if (!!validatorResult && !!validatorResult.error) { res.push(validatorResult.error); } } if (this.asyncValidators.length == 0 && !!this.onAsyncCompleted) this.onAsyncCompleted([]); return res; }; ValidatorRunner.prototype.prepareAsyncValidators = function () { if (!!this.asyncValidators) { for (var i = 0; i < this.asyncValidators.length; i++) { this.asyncValidators[i].onAsyncCompleted = null; } } this.asyncValidators = []; }; return ValidatorRunner; }()); /** * Validate numeric values. */ var NumericValidator = /** @class */ (function (_super) { __extends(NumericValidator, _super); function NumericValidator(minValue, maxValue) { if (minValue === void 0) { minValue = null; } if (maxValue === void 0) { maxValue = null; } var _this = _super.call(this) || this; _this.minValue = minValue; _this.maxValue = maxValue; return _this; } NumericValidator.prototype.getType = function () { return "numericvalidator"; }; NumericValidator.prototype.validate = function (value, name, values, properties) { if (name === void 0) { name = null; } if (values === void 0) { values = null; } if (properties === void 0) { properties = null; } if (this.isValueEmpty(value)) return null; if (!_helpers__WEBPACK_IMPORTED_MODULE_5__["Helpers"].isNumber(value)) { return new ValidatorResult(null, new _error__WEBPACK_IMPORTED_MODULE_1__["RequreNumericError"](null, this.errorOwner)); } var result = new ValidatorResult(parseFloat(value)); if (this.minValue !== null && this.minValue > result.value) { result.error = this.createCustomError(name); return result; } if (this.maxValue !== null && this.maxValue < result.value) { result.error = this.createCustomError(name); return result; } return typeof value === "number" ? null : result; }; NumericValidator.prototype.getDefaultErrorText = function (name) { var vName = name ? name : _surveyStrings__WEBPACK_IMPORTED_MODULE_2__["surveyLocalization"].getString("value"); if (this.minValue !== null && this.maxValue !== null) { return _surveyStrings__WEBPACK_IMPORTED_MODULE_2__["surveyLocalization"] .getString("numericMinMax")["format"](vName, this.minValue, this.maxValue); } else { if (this.minValue !== null) { return _surveyStrings__WEBPACK_IMPORTED_MODULE_2__["surveyLocalization"] .getString("numericMin")["format"](vName, this.minValue); } return _surveyStrings__WEBPACK_IMPORTED_MODULE_2__["surveyLocalization"] .getString("numericMax")["format"](vName, this.maxValue); } }; Object.defineProperty(NumericValidator.prototype, "minValue", { /** * The minValue property. */ get: function () { return this.getPropertyValue("minValue"); }, set: function (val) { this.setPropertyValue("minValue", val); }, enumerable: false, configurable: true }); Object.defineProperty(NumericValidator.prototype, "maxValue", { /** * The maxValue property. */ get: function () { return this.getPropertyValue("maxValue"); }, set: function (val) { this.setPropertyValue("maxValue", val); }, enumerable: false, configurable: true }); return NumericValidator; }(SurveyValidator)); /** * Validate text values. */ var TextValidator = /** @class */ (function (_super) { __extends(TextValidator, _super); function TextValidator(minLength, maxLength, allowDigits) { if (minLength === void 0) { minLength = 0; } if (maxLength === void 0) { maxLength = 0; } if (allowDigits === void 0) { allowDigits = true; } var _this = _super.call(this) || this; _this.minLength = minLength; _this.maxLength = maxLength; _this.allowDigits = allowDigits; return _this; } TextValidator.prototype.getType = function () { return "textvalidator"; }; TextValidator.prototype.validate = function (value, name, values, properties) { if (name === void 0) { name = null; } if (values === void 0) { values = null; } if (properties === void 0) { properties = null; } if (this.isValueEmpty(value)) return null; if (!this.allowDigits) { var reg = /^[A-Za-z\s]*$/; if (!reg.test(value)) { return new ValidatorResult(null, this.createCustomError(name)); } } if (this.minLength > 0 && value.length < this.minLength) { return new ValidatorResult(null, this.createCustomError(name)); } if (this.maxLength > 0 && value.length > this.maxLength) { return new ValidatorResult(null, this.createCustomError(name)); } return null; }; TextValidator.prototype.getDefaultErrorText = function (name) { if (this.minLength > 0 && this.maxLength > 0) return _surveyStrings__WEBPACK_IMPORTED_MODULE_2__["surveyLocalization"] .getString("textMinMaxLength")["format"](this.minLength, this.maxLength); if (this.minLength > 0) return _surveyStrings__WEBPACK_IMPORTED_MODULE_2__["surveyLocalization"] .getString("textMinLength")["format"](this.minLength); return _surveyStrings__WEBPACK_IMPORTED_MODULE_2__["surveyLocalization"] .getString("textMaxLength")["format"](this.maxLength); }; Object.defineProperty(TextValidator.prototype, "minLength", { /** * The minLength property. */ get: function () { return this.getPropertyValue("minLength"); }, set: function (val) { this.setPropertyValue("minLength", val); }, enumerable: false, configurable: true }); Object.defineProperty(TextValidator.prototype, "maxLength", { /** * The maxLength property. */ get: function () { return this.getPropertyValue("maxLength"); }, set: function (val) { this.setPropertyValue("maxLength", val); }, enumerable: false, configurable: true }); Object.defineProperty(TextValidator.prototype, "allowDigits", { /** * The allowDigits property. */ get: function () { return this.getPropertyValue("allowDigits", true); }, set: function (val) { this.setPropertyValue("allowDigits", val); }, enumerable: false, configurable: true }); return TextValidator; }(SurveyValidator)); var AnswerCountValidator = /** @class */ (function (_super) { __extends(AnswerCountValidator, _super); function AnswerCountValidator(minCount, maxCount) { if (minCount === void 0) { minCount = null; } if (maxCount === void 0) { maxCount = null; } var _this = _super.call(this) || this; _this.minCount = minCount; _this.maxCount = maxCount; return _this; } AnswerCountValidator.prototype.getType = function () { return "answercountvalidator"; }; AnswerCountValidator.prototype.validate = function (value, name, values, properties) { if (name === void 0) { name = null; } if (values === void 0) { values = null; } if (properties === void 0) { properties = null; } if (value == null || value.constructor != Array) return null; var count = value.length; if (count == 0) return null; if (this.minCount && count < this.minCount) { return new ValidatorResult(null, this.createCustomError(_surveyStrings__WEBPACK_IMPORTED_MODULE_2__["surveyLocalization"] .getString("minSelectError")["format"](this.minCount))); } if (this.maxCount && count > this.maxCount) { return new ValidatorResult(null, this.createCustomError(_surveyStrings__WEBPACK_IMPORTED_MODULE_2__["surveyLocalization"] .getString("maxSelectError")["format"](this.maxCount))); } return null; }; AnswerCountValidator.prototype.getDefaultErrorText = function (name) { return name; }; Object.defineProperty(AnswerCountValidator.prototype, "minCount", { /** * The minCount property. */ get: function () { return this.getPropertyValue("minCount"); }, set: function (val) { this.setPropertyValue("minCount", val); }, enumerable: false, configurable: true }); Object.defineProperty(AnswerCountValidator.prototype, "maxCount", { /** * The maxCount property. */ get: function () { return this.getPropertyValue("maxCount"); }, set: function (val) { this.setPropertyValue("maxCount", val); }, enumerable: false, configurable: true }); return AnswerCountValidator; }(SurveyValidator)); /** * Use it to validate the text by regular expressions. */ var RegexValidator = /** @class */ (function (_super) { __extends(RegexValidator, _super); function RegexValidator(regex) { if (regex === void 0) { regex = null; } var _this = _super.call(this) || this; _this.regex = regex; return _this; } RegexValidator.prototype.getType = function () { return "regexvalidator"; }; RegexValidator.prototype.validate = function (value, name, values, properties) { if (name === void 0) { name = null; } if (values === void 0) { values = null; } if (properties === void 0) { properties = null; } if (!this.regex || this.isValueEmpty(value)) return null; var re = new RegExp(this.regex); if (Array.isArray(value)) { for (var i = 0; i < value.length; i++) { var res = this.hasError(re, value[i], name); if (res) return res; } } return this.hasError(re, value, name); }; RegexValidator.prototype.hasError = function (re, value, name) { if (re.test(value)) return null; return new ValidatorResult(value, this.createCustomError(name)); }; Object.defineProperty(RegexValidator.prototype, "regex", { /** * The regex property. */ get: function () { return this.getPropertyValue("regex"); }, set: function (val) { this.setPropertyValue("regex", val); }, enumerable: false, configurable: true }); return RegexValidator; }(SurveyValidator)); /** * Validate e-mail address in the text input */ var EmailValidator = /** @class */ (function (_super) { __extends(EmailValidator, _super); function EmailValidator() { var _this = _super.call(this) || this; _this.re = /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()=[\]\.,;:\s@\"]+\.)+[^<>()=[\]\.,;:\s@\"]{2,})$/i; return _this; } EmailValidator.prototype.getType = function () { return "emailvalidator"; }; EmailValidator.prototype.validate = function (value, name, values, properties) { if (name === void 0) { name = null; } if (values === void 0) { values = null; } if (properties === void 0) { properties = null; } if (!value) return null; if (this.re.test(value)) return null; return new ValidatorResult(value, this.createCustomError(name)); }; EmailValidator.prototype.getDefaultErrorText = function (name) { return _surveyStrings__WEBPACK_IMPORTED_MODULE_2__["surveyLocalization"].getString("invalidEmail"); }; return EmailValidator; }(SurveyValidator)); /** * Show error if expression returns false */ var ExpressionValidator = /** @class */ (function (_super) { __extends(ExpressionValidator, _super); function ExpressionValidator(expression) { if (expression === void 0) { expression = null; } var _this = _super.call(this) || this; _this.conditionRunner = null; _this.isRunningValue = false; _this.expression = expression; return _this; } ExpressionValidator.prototype.getType = function () { return "expressionvalidator"; }; Object.defineProperty(ExpressionValidator.prototype, "isValidateAllValues", { get: function () { return true; }, enumerable: false, configurable: true }); Object.defineProperty(ExpressionValidator.prototype, "isAsync", { get: function () { if (!this.ensureConditionRunner()) return false; return this.conditionRunner.isAsync; }, enumerable: false, configurable: true }); Object.defineProperty(ExpressionValidator.prototype, "isRunning", { get: function () { return this.isRunningValue; }, enumerable: false, configurable: true }); ExpressionValidator.prototype.validate = function (value, name, values, properties) { var _this = this; if (name === void 0) { name = null; } if (values === void 0) { values = null; } if (properties === void 0) { properties = null; } if (!this.ensureConditionRunner()) return null; this.conditionRunner.onRunComplete = function (res) { _this.isRunningValue = false; if (!!_this.onAsyncCompleted) { _this.onAsyncCompleted(_this.generateError(res, value, name)); } }; this.isRunningValue = true; var res = this.conditionRunner.run(values, properties); if (this.conditionRunner.isAsync) return null; this.isRunningValue = false; return this.generateError(res, value, name); }; ExpressionValidator.prototype.generateError = function (res, value, name) { if (!res) { return new ValidatorResult(value, this.createCustomError(name)); } return null; }; ExpressionValidator.prototype.getDefaultErrorText = function (name) { return _surveyStrings__WEBPACK_IMPORTED_MODULE_2__["surveyLocalization"] .getString("invalidExpression")["format"](this.expression); }; ExpressionValidator.prototype.ensureConditionRunner = function () { if (!!this.conditionRunner) { this.conditionRunner.expression = this.expression; return true; } if (!this.expression) return false; this.conditionRunner = new _conditions__WEBPACK_IMPORTED_MODULE_4__["ConditionRunner"](this.expression); return true; }; Object.defineProperty(ExpressionValidator.prototype, "expression", { /** * The expression property. */ get: function () { return this.getPropertyValue("expression"); }, set: function (val) { this.setPropertyValue("expression", val); }, enumerable: false, configurable: true }); return ExpressionValidator; }(SurveyValidator)); _jsonobject__WEBPACK_IMPORTED_MODULE_3__["Serializer"].addClass("surveyvalidator", [ { name: "text", serializationProperty: "locText" }, ]); _jsonobject__WEBPACK_IMPORTED_MODULE_3__["Serializer"].addClass("numericvalidator", ["minValue:number", "maxValue:number"], function () { return new NumericValidator(); }, "surveyvalidator"); _jsonobject__WEBPACK_IMPORTED_MODULE_3__["Serializer"].addClass("textvalidator", ["minLength:number", "maxLength:number", "allowDigits:boolean"], function () { return new TextValidator(); }, "surveyvalidator"); _jsonobject__WEBPACK_IMPORTED_MODULE_3__["Serializer"].addClass("answercountvalidator", ["minCount:number", "maxCount:number"], function () { return new AnswerCountValidator(); }, "surveyvalidator"); _jsonobject__WEBPACK_IMPORTED_MODULE_3__["Serializer"].addClass("regexvalidator", ["regex"], function () { return new RegexValidator(); }, "surveyvalidator"); _jsonobject__WEBPACK_IMPORTED_MODULE_3__["Serializer"].addClass("emailvalidator", [], function () { return new EmailValidator(); }, "surveyvalidator"); _jsonobject__WEBPACK_IMPORTED_MODULE_3__["Serializer"].addClass("expressionvalidator", ["expression:condition"], function () { return new ExpressionValidator(); }, "surveyvalidator"); /***/ }), /***/ "jquery": /*!******************************************************************************************!*\ !*** external {"root":"jQuery","commonjs2":"jquery","commonjs":"jquery","amd":"jquery"} ***! \******************************************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = __WEBPACK_EXTERNAL_MODULE_jquery__; /***/ }) /******/ }); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9TdXJ2ZXkvd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL1N1cnZleS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvY29tcG9uZW50cy9wYW5lbC9wYW5lbC5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9jb21wb25lbnRzL3BvcHVwL3BvcHVwLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2NvbXBvbmVudHMvcHJvZ3Jlc3MvYnV0dG9ucy5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9jb21wb25lbnRzL3Byb2dyZXNzL3Byb2dyZXNzLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9lbnRyeS5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvd2luZG93L3dpbmRvdy5odG1sIiwid2VicGFjazovL1N1cnZleS8uL25vZGVfbW9kdWxlcy9rbm9ja291dC9idWlsZC9vdXRwdXQva25vY2tvdXQtbGF0ZXN0LmpzIiwid2VicGFjazovL1N1cnZleS8uL25vZGVfbW9kdWxlcy9zaWduYXR1cmVfcGFkL2Rpc3Qvc2lnbmF0dXJlX3BhZC5tanMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vbm9kZV9tb2R1bGVzL3NvcnRhYmxlanMvbW9kdWxhci9zb3J0YWJsZS5lc20uanMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2FjdGlvbnMvYWN0aW9uLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9hY3Rpb25zL2FkYXB0aXZlLWNvbnRhaW5lci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvYWN0aW9ucy9jb250YWluZXIudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2Jhc2UudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2NhbGN1bGF0ZWRWYWx1ZS50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvY2hvaWNlc1Jlc3RmdWwudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2NvbmRpdGlvblByb2Nlc3NWYWx1ZS50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvY29uZGl0aW9ucy50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvY29uZGl0aW9uc1BhcnNlci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvZGVmYXVsdENzcy9jc3Nib290c3RyYXAudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2RlZmF1bHRDc3MvY3NzYm9vdHN0cmFwbWF0ZXJpYWwudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2RlZmF1bHRDc3MvY3NzbW9kZXJuLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9kZWZhdWx0Q3NzL2Nzc3N0YW5kYXJkLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9kZWZhdWx0VGl0bGUudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2RyYWdkcm9wL2Nob2ljZXMudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2RyYWdkcm9wL2NvcmUudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2RyYWdkcm9wL21hdHJpeC1yb3dzLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9kcmFnZHJvcC9yYW5raW5nLWNob2ljZXMudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2RyYWdkcm9wL3N1cnZleS1lbGVtZW50cy50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvZHhTdXJ2ZXlTZXJ2aWNlLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9lbnRyaWVzL2NodW5rcy9sb2NhbGl6YXRpb24udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2VudHJpZXMvY2h1bmtzL21vZGVsLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9lbnRyaWVzL2NvcmUudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2VudHJpZXMvanF1ZXJ5LnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9lbnRyaWVzL2tub2Nrb3V0LXVpLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9lbnRyaWVzL2tub2Nrb3V0LnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9lcnJvci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvZXhwcmVzc2lvbkl0ZW1zLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9leHByZXNzaW9ucy9leHByZXNzaW9uUGFyc2VyLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9leHByZXNzaW9ucy9leHByZXNzaW9ucy50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvZmxvd3BhbmVsLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9mdW5jdGlvbnNmYWN0b3J5LnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9oZWxwZXJzLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9pdGVtdmFsdWUudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2pzb25vYmplY3QudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2NvbXBvbmVudHMvYWN0aW9uLWJhci9hY3Rpb24tYmFyLWl0ZW0tZHJvcGRvd24uaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvY29tcG9uZW50cy9hY3Rpb24tYmFyL2FjdGlvbi1iYXItaXRlbS1kcm9wZG93bi50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvY29tcG9uZW50cy9hY3Rpb24tYmFyL2FjdGlvbi1iYXItaXRlbS5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9jb21wb25lbnRzL2FjdGlvbi1iYXIvYWN0aW9uLWJhci1pdGVtLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9jb21wb25lbnRzL2FjdGlvbi1iYXIvYWN0aW9uLWJhci1zZXBhcmF0b3IuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvY29tcG9uZW50cy9hY3Rpb24tYmFyL2FjdGlvbi1iYXItc2VwYXJhdG9yLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9jb21wb25lbnRzL2FjdGlvbi1iYXIvYWN0aW9uLWJhci5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9jb21wb25lbnRzL2FjdGlvbi1iYXIvYWN0aW9uLWJhci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvY29tcG9uZW50cy9hY3Rpb24tYmFyL2FjdGlvbi5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9jb21wb25lbnRzL2FjdGlvbi1iYXIvYWN0aW9uLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9jb21wb25lbnRzL2Jvb2xlYW4tY2hlY2tib3gvYm9vbGVhbi1jaGVja2JveC5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9jb21wb25lbnRzL2Jvb2xlYW4tY2hlY2tib3gvYm9vbGVhbi1jaGVja2JveC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvY29tcG9uZW50cy9idXR0b24tZ3JvdXAvYnV0dG9uLWdyb3VwLWl0ZW0uaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvY29tcG9uZW50cy9idXR0b24tZ3JvdXAvYnV0dG9uLWdyb3VwLWl0ZW0udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2NvbXBvbmVudHMvbGlzdC9saXN0Lmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2NvbXBvbmVudHMvbGlzdC9saXN0LnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9jb21wb25lbnRzL2xvZ28taW1hZ2UvbG9nby1pbWFnZS5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9jb21wb25lbnRzL2xvZ28taW1hZ2UvbG9nby1pbWFnZS50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvY29tcG9uZW50cy9tYXRyaXgtYWN0aW9ucy9kZXRhaWwtYnV0dG9uL2RldGFpbC1idXR0b24uaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvY29tcG9uZW50cy9tYXRyaXgtYWN0aW9ucy9kZXRhaWwtYnV0dG9uL2RldGFpbC1idXR0b24udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2NvbXBvbmVudHMvbWF0cml4LWFjdGlvbnMvZHJhZy1kcm9wLWljb24vZHJhZy1kcm9wLWljb24uaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvY29tcG9uZW50cy9tYXRyaXgtYWN0aW9ucy9kcmFnLWRyb3AtaWNvbi9kcmFnLWRyb3AtaWNvbi50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvY29tcG9uZW50cy9tYXRyaXgtYWN0aW9ucy9yZW1vdmUtYnV0dG9uL3JlbW92ZS1idXR0b24uaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvY29tcG9uZW50cy9tYXRyaXgtYWN0aW9ucy9yZW1vdmUtYnV0dG9uL3JlbW92ZS1idXR0b24udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2NvbXBvbmVudHMvcGFuZWwvcGFuZWwudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2NvbXBvbmVudHMvcG9wdXAvcG9wdXAudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2NvbXBvbmVudHMvcHJvZ3Jlc3MvYnV0dG9ucy50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvY29tcG9uZW50cy9wcm9ncmVzcy9wcm9ncmVzcy50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvY29tcG9uZW50cy9za2VsZXRvbi9za2VsZXRvbi5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9jb21wb25lbnRzL3NrZWxldG9uL3NrZWxldG9uLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9jb21wb25lbnRzL3N0cmluZy1lZGl0b3Ivc3RyaW5nLWVkaXRvci5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9jb21wb25lbnRzL3N0cmluZy1lZGl0b3Ivc3RyaW5nLWVkaXRvci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvY29tcG9uZW50cy9zdHJpbmctdmlld2VyL3N0cmluZy12aWV3ZXIuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvY29tcG9uZW50cy9zdHJpbmctdmlld2VyL3N0cmluZy12aWV3ZXIudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2NvbXBvbmVudHMvc3ZnLWljb24vc3ZnLWljb24uaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvY29tcG9uZW50cy9zdmctaWNvbi9zdmctaWNvbi50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvY29tcG9uZW50cy90ZW1wbGF0ZS1yZW5kZXJlci90ZW1wbGF0ZS1yZW5kZXJlci5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9jb21wb25lbnRzL3RlbXBsYXRlLXJlbmRlcmVyL3RlbXBsYXRlLXJlbmRlcmVyLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9jb21wb25lbnRzL3RpdGxlL2RlZmF1bHQtdGl0bGUuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvY29tcG9uZW50cy90aXRsZS9kZWZhdWx0LXRpdGxlLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9jb21wb25lbnRzL3RpdGxlL3RpdGxlLWFjdGlvbnMuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvY29tcG9uZW50cy90aXRsZS90aXRsZS1hY3Rpb25zLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9jb21wb25lbnRzL3RpdGxlL3RpdGxlLWNvbnRlbnQuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvY29tcG9uZW50cy90aXRsZS90aXRsZS1jb250ZW50LnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9jb21wb25lbnRzL3RpdGxlL3RpdGxlLWVsZW1lbnQudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2tvU3VydmV5V2luZG93LnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9rb2Jhc2UudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2tvZmxvd3BhbmVsLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9rb3BhZ2UudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb24udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fYmFzZXNlbGVjdC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9ib29sZWFuLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX2J1dHRvbmdyb3VwLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX2NoZWNrYm94LnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX2NvbW1lbnQudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fY3VzdG9tLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX2Ryb3Bkb3duLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX2VtcHR5LnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX2V4cHJlc3Npb24udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fZmlsZS50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9odG1sLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX2ltYWdlLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX2ltYWdlcGlja2VyLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX21hdHJpeC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9tYXRyaXhkcm9wZG93bi50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9tYXRyaXhkeW5hbWljLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX211bHRpcGxldGV4dC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9wYW5lbGR5bmFtaWMudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fcmFkaW9ncm91cC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9yYW5raW5nLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX3JhdGluZy50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9zaWduYXR1cmVwYWQudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fdGV4dC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQva29zdXJ2ZXkudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlVGV4dC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL2NvbW1lbnQuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL2Zsb3dwYW5lbC5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvaGVhZGVyLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9pbmRleC5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcGFnZS5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcGFuZWwuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLWJvb2xlYW4uaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLWJ1dHRvbmdyb3VwLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1jaGVja2JveC5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tY29tbWVudC5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tY29tcG9zaXRlLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1jdXN0b20uaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLWRyb3Bkb3duLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1lbXB0eS5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tZXJyb3JzLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1leHByZXNzaW9uLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1maWxlLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1odG1sLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1pbWFnZS5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24taW1hZ2VwaWNrZXIuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLW1hdHJpeC5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tbWF0cml4ZHluYW1pYy5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tbXVsdGlwbGV0ZXh0Lmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1wYW5lbGR5bmFtaWMtbmF2aWdhdG9yLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1wYW5lbGR5bmFtaWMuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLXJhZGlvZ3JvdXAuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLXJhbmtpbmcuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLXJhdGluZy5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tc2lnbmF0dXJlcGFkLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi10ZXh0Lmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb250aXRsZS5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcm93Lmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9yb3dzLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9zdHJpbmcuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3RpbWVycGFuZWwuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvbGlzdC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvbG9jYWxpemFibGVzdHJpbmcudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi9hcmFiaWMudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi9iYXNxdWUudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi9idWxnYXJpYW4udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi9jYXRhbGFuLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9sb2NhbGl6YXRpb24vY3JvYXRpYW4udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi9jemVjaC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvbG9jYWxpemF0aW9uL2RhbmlzaC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvbG9jYWxpemF0aW9uL2R1dGNoLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9sb2NhbGl6YXRpb24vZW5nbGlzaC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvbG9jYWxpemF0aW9uL2VzdG9uaWFuLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9sb2NhbGl6YXRpb24vZmlubmlzaC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvbG9jYWxpemF0aW9uL2ZyZW5jaC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvbG9jYWxpemF0aW9uL2dlb3JnaWFuLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9sb2NhbGl6YXRpb24vZ2VybWFuLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9sb2NhbGl6YXRpb24vZ3JlZWsudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi9oZWJyZXcudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi9oaW5kaS50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvbG9jYWxpemF0aW9uL2h1bmdhcmlhbi50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvbG9jYWxpemF0aW9uL2ljZWxhbmRpYy50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvbG9jYWxpemF0aW9uL2luZG9uZXNpYW4udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi9pdGFsaWFuLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9sb2NhbGl6YXRpb24vamFwYW5lc2UudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi9rYXpha2gudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi9rb3JlYW4udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi9sYXR2aWFuLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9sb2NhbGl6YXRpb24vbGl0aHVhbmlhbi50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvbG9jYWxpemF0aW9uL21hY2Vkb25pYW4udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi9ub3J3ZWdpYW4udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi9wZXJzaWFuLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9sb2NhbGl6YXRpb24vcG9saXNoLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9sb2NhbGl6YXRpb24vcG9ydHVndWVzZS1ici50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvbG9jYWxpemF0aW9uL3BvcnR1Z3Vlc2UudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi9yb21hbmlhbi50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvbG9jYWxpemF0aW9uL3J1c3NpYW4udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi9zZXJiaWFuLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9sb2NhbGl6YXRpb24vc2ltcGxpZmllZC1jaGluZXNlLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9sb2NhbGl6YXRpb24vc3BhbmlzaC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvbG9jYWxpemF0aW9uL3N3YWhpbGkudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi9zd2VkaXNoLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9sb2NhbGl6YXRpb24vdGFqaWsudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi90aGFpLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9sb2NhbGl6YXRpb24vdHJhZGl0aW9uYWwtY2hpbmVzZS50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvbG9jYWxpemF0aW9uL3R1cmtpc2gudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi91a3JhaW5pYW4udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi92aWV0bmFtZXNlLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9sb2NhbGl6YXRpb24vd2Vsc2gudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL21haW4uc2Nzcz8zYmMwIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9tYXJ0aXhCYXNlLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9wYWdlLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9wYW5lbC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvcG9wdXAudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3F1ZXN0aW9uLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9xdWVzdGlvbkN1c3RvbVdpZGdldHMudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3F1ZXN0aW9uX2Jhc2VzZWxlY3QudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3F1ZXN0aW9uX2Jvb2xlYW4udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3F1ZXN0aW9uX2J1dHRvbmdyb3VwLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9xdWVzdGlvbl9jaGVja2JveC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvcXVlc3Rpb25fY29tbWVudC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvcXVlc3Rpb25fY3VzdG9tLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9xdWVzdGlvbl9kcm9wZG93bi50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvcXVlc3Rpb25fZW1wdHkudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3F1ZXN0aW9uX2V4cHJlc3Npb24udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3F1ZXN0aW9uX2ZpbGUudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3F1ZXN0aW9uX2h0bWwudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3F1ZXN0aW9uX2ltYWdlLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9xdWVzdGlvbl9pbWFnZXBpY2tlci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvcXVlc3Rpb25fbWF0cml4LnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9xdWVzdGlvbl9tYXRyaXhkcm9wZG93bi50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvcXVlc3Rpb25fbWF0cml4ZHJvcGRvd25iYXNlLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9xdWVzdGlvbl9tYXRyaXhkcm9wZG93bmNvbHVtbi50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvcXVlc3Rpb25fbWF0cml4ZHJvcGRvd25yZW5kZXJlZC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvcXVlc3Rpb25fbWF0cml4ZHluYW1pYy50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvcXVlc3Rpb25fbXVsdGlwbGV0ZXh0LnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9xdWVzdGlvbl9wYW5lbGR5bmFtaWMudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3F1ZXN0aW9uX3JhZGlvZ3JvdXAudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3F1ZXN0aW9uX3JhbmtpbmcudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3F1ZXN0aW9uX3JhdGluZy50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvcXVlc3Rpb25fc2lnbmF0dXJlcGFkLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9xdWVzdGlvbl90ZXh0LnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9xdWVzdGlvbl90ZXh0YmFzZS50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvcXVlc3Rpb25mYWN0b3J5LnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9xdWVzdGlvbm5vbnZhbHVlLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9yZW5kZXJlckZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3NldHRpbmdzLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9zdHlsZXNtYW5hZ2VyLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9zdXJ2ZXktZWxlbWVudC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvc3VydmV5LWVycm9yLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9zdXJ2ZXkudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3N1cnZleVByb2dyZXNzLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9zdXJ2ZXlQcm9ncmVzc0J1dHRvbnMudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3N1cnZleVN0cmluZ3MudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3N1cnZleVdpbmRvdy50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvc3VydmV5dGltZXIudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3RleHRQcmVQcm9jZXNzb3IudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3RyaWdnZXIudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3V0aWxzL2Nzc0NsYXNzQnVpbGRlci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvdXRpbHMvaXMtbW9iaWxlLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy91dGlscy9wb3B1cC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvdXRpbHMvcmVzcG9uc2l2aXR5LW1hbmFnZXIudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3V0aWxzL3V0aWxzLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy92YWxpZGF0b3IudHMiLCJ3ZWJwYWNrOi8vU3VydmV5L2V4dGVybmFsIHtcInJvb3RcIjpcImpRdWVyeVwiLFwiY29tbW9uanMyXCI6XCJqcXVlcnlcIixcImNvbW1vbmpzXCI6XCJqcXVlcnlcIixcImFtZFwiOlwianF1ZXJ5XCJ9Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELE87UUNWQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7O1FBR0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDBDQUEwQyxnQ0FBZ0M7UUFDMUU7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSx3REFBd0Qsa0JBQWtCO1FBQzFFO1FBQ0EsaURBQWlELGNBQWM7UUFDL0Q7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLHlDQUF5QyxpQ0FBaUM7UUFDMUUsZ0hBQWdILG1CQUFtQixFQUFFO1FBQ3JJO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMkJBQTJCLDBCQUEwQixFQUFFO1FBQ3ZELGlDQUFpQyxlQUFlO1FBQ2hEO1FBQ0E7UUFDQTs7UUFFQTtRQUNBLHNEQUFzRCwrREFBK0Q7O1FBRXJIO1FBQ0E7OztRQUdBO1FBQ0E7Ozs7Ozs7Ozs7OztBQ2xGQSxxQ0FBcUMsaUdBQWlHLGtCOzs7Ozs7Ozs7OztBQ0F0SSw2SUFBNkksaUNBQWlDLGtCQUFrQixhQUFhLEVBQUUsRUFBRSxtRUFBbUUsdUNBQXVDLHNCQUFzQixhQUFhLEVBQUUseUZBQXlGLGtEQUFrRCx5U0FBeVMsMkRBQTJELHVkOzs7Ozs7Ozs7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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMERBQTBEO0FBQzFEOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJGQUEyRixhQUFhO0FBQ3hHO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFD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QUFzQjtBQUN2QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxhQUFhLHVCQUF1QjtBQUNwQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQSxlQUFlLDZCQUE2QjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlEQUFpRCxnQkFBZ0I7O0FBRWpFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVksT0FBTztBQUNuQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxZQUFZO0FBQ3hCLFlBQVksVUFBVTtBQUN0QixZQUFZLFVBQVU7QUFDdEIsWUFBWSxVQUFVO0FBQ3RCLFlBQVksY0FBYztBQUMxQixZQUFZLE9BQU87QUFDbkI7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwyQ0FBMkM7QUFDM0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFOztBQUVoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxZQUFZO0FBQ3hCLFlBQVksT0FBTztBQUNuQixZQUFZLE9BQU87QUFDbkIsWUFBWSxZQUFZO0FBQ3hCOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFlBQVk7QUFDeEIsWUFBWSxPQUFPO0FBQ25CLFlBQVksT0FBTztBQUNuQixZQUFZLFlBQVk7QUFDeEI7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxZQUFZO0FBQ3hCLFlBQVksU0FBUztBQUNyQixZQUFZLFlBQVk7QUFDeEI7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFlBQVk7QUFDeEIsWUFBWSxTQUFTO0FBQ3JCLFlBQVk7QUFDWjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxZQUFZO0FBQ3hCLFlBQVksTUFBTTtBQUNsQjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLE1BQU07QUFDbEIsWUFBWSxPQUFPO0FBQ25CLFlBQVksT0FBTztBQUNuQjs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVULHVDQUF1QyxvREFBb0Q7OztBQUczRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQzs7QUFFL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwrQ0FBK0M7O0FBRS9DO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7O0FBRXpDO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0M7O0FBRS9DO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvRUFBb0U7O0FBRXBFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMkNBQTJDOztBQUUzQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUZBQW1GO0FBQ25GO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCOztBQUU5QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQSxZQUFZLE9BQU87QUFDbkIsWUFBWSxPQUFPO0FBQ25CLFlBQVksWUFBWTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7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QUNBO0FBQ0EsZ01BQWdNOztBQUVoTTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7O0FBRWpDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7O0FBRXJDO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTCw4REFBOEQ7O0FBRTlEO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQ0FBa0M7O0FBRWxDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsT0FBTztBQUNQLEtBQUs7OztBQUdMO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7OztBQUdUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTtBQUNBLE9BQU87OztBQUdQO0FBQ0EsZ0VBQWdFOzs7QUFHaEU7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBCQUEwQjs7QUFFMUI7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7O0FBRXhCO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtB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O0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseUNBQXlDOztBQUV6QztBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksWUFBWTtBQUN4QixZQUFZLE9BQU87QUFDbkI7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxZQUFZO0FBQ3pCLGFBQWE7QUFDYjtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksWUFBWTtBQUN4QixZQUFZLG1CQUFtQjtBQUMvQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxtQ0FBbUM7QUFDL0M7OztBQUdBO0FBQ0Esd0VBQXdFLGFBQWE7QUFDckY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxRkFBcUY7QUFDckY7O0FBRUEsdURBQXVEO0FBQ3ZEO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLFdBQVcsWUFBWTtBQUN2QixXQUFXLE9BQU87QUFDbEI7OztBQUdBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNEQUFzRDs7QUFFdEQ7O0FBRUE7QUFDQSwwRUFBMEU7O0FBRTFFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjs7QUFFckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHFCQUFxQixnQkFBZ0I7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQ7O0FBRXJEOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7QUFFSCxpQ0FBaUM7QUFDakMsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUJBQXFCLDhCQUE4QjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTyxFQUFFOztBQUVUO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTOzs7QUFHVDtBQUNBO0FB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QUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pELENBQUMsQ0FBQztRQUNGLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNiLENBQUM7SUFDSCxzQkFBQztBQUFELENBQUM7Ozs7Ozs7Ozs7Ozs7O0FDOUlEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW1DO0FBQ0E7QUFDRztBQUNGO0FBQ0M7QUFDSDtBQUNDO0FBQ0Q7QUFDRztBQUNEO0FBQ0Q7QUFDRTtBQUNGO0FBQ0Q7QUFDQztBQUNEO0FBQ0k7QUFDQTtBQUNDO0FBQ0g7QUFDQztBQUNGO0FBQ0E7QUFDQztBQUNHO0FBQ0E7QUFDRDtBQUNGO0FBQ0Q7QUFDSTtBQUNHO0FBQ0w7QUFDRDtBQUNBO0FBQ1c7QUFDWDtBQUNBO0FBQ0E7QUFDRjtBQUNEO0FBQ2U7QUFDWjtBQUNFO0FBQ0M7QUFDTDs7Ozs7Ozs7Ozs7OztBQzVDbEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtB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O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFFBQVE7QUFDdUI7QUFFL0IsZUFBZTtBQUNnQjtBQUUvQix1QkFBdUI7QUFDd0M7QUFDL0Qsd0JBQXdCO0FBQ3lDO0FBQ2pFLG1DQUFtQztBQUM4QztBQUNqRixxQkFBcUI7QUFDK0I7QUFFcEQsUUFBUTtBQUMyQjtBQUNXO0FBQ047QUFDTjtBQUNZO0FBQ1Q7Ozs7Ozs7Ozs7Ozs7QUNyQnJDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQStCO0FBQ0g7QUFFTDtBQUN2Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBa0JFO0FBQ0YsSUFBTSxPQUFPLEdBQVEscUNBQUUsQ0FBQztBQUNDO0FBQ3lCO0FBQ3ZCO0FBRWE7QUFDc0I7QUFFOUQsNkNBQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDbEIsTUFBTSxFQUFFLFVBQVUsS0FBVTtRQUMxQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDZixJQUFJLEtBQUssR0FBVyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ2hDLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxZQUFZLEVBQUUsVUFBVSxLQUFVO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztZQUNmLElBQUksS0FBSyxHQUFXLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDaEMsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQixJQUFJLE1BQU0sR0FBRyxJQUFJLHNEQUFZLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzNDLElBQUksS0FBSyxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUU7Z0JBQ2hDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQzthQUNwQztZQUNELElBQUksS0FBSyxDQUFDLFVBQVUsS0FBSyxTQUFTLEVBQUU7Z0JBQ2xDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQzthQUN0QztZQUNELElBQUksS0FBSyxDQUFDLHNCQUFzQixLQUFLLFNBQVMsRUFBRTtnQkFDOUMsTUFBTSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQzthQUM5RDtZQUNELE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRixDQUFDLENBQUM7QUFFSCxtREFBVyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7QUFFaEMsaUZBQXNCLENBQUMscUNBQUUsRUFBRSxtREFBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7O0FDN0RqRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBaUJFO0FBQ0YsV0FBVztBQUNtQztBQUNTO0FBQ0Y7QUFDUztBQUNWO0FBQ1M7QUFDcUI7QUFDRTtBQUNqQjtBQUNGO0FBQ0E7QUFDRTtBQUNSO0FBQ0E7QUFDSTtBQUNnQjtBQUlqQztBQUM2QjtBQUk5QjtBQUMwQjtBQUloQztBQUNvQjtBQUNNO0FBQ0o7QUFDVTtBQUNFO0FBQ2Y7QUFDSTtBQUNEO0FBQ2M7QUFDWjtBQUNVO0FBRVo7QUFDWTtBQUN0QjtBQUNBO0FBQ0s7QUFDQztBQUNrQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNRO0FBQ0E7QUFDTjtBQUNKO0FBRVI7QUFDUTtBQUNtRTtBQUNQO0FBQ1M7QUFDN0I7QUFDakcsZ0RBQWdEO0FBQ2hELDBDQUEwQztBQUMxQyxnREFBZ0Q7QUFDaEQsbUVBQW1FO0FBRXBDO0FBQ1c7QUFDb0I7QUFDOUQsaUZBQXNCLENBQUMsc0NBQUUsRUFBRSx3REFBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7O0FDM0ZqRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FB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S0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0ws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QVEsQ0FDakIsZ0JBQWdCLEVBQ2hCLEVBQUUsRUFDRjtJQUNFLE9BQU8sSUFBSSxjQUFjLEVBQUUsQ0FBQztBQUM5QixDQUFDLEVBQ0QsaUJBQWlCLENBQ2xCLENBQUM7QUFFRixzREFBVSxDQUFDLFFBQVEsQ0FDakIscUJBQXFCLEVBQ3JCLENBQUMsc0JBQXNCLENBQUMsRUFDeEI7SUFDRSxPQUFPLElBQUksbUJBQW1CLEVBQUUsQ0FBQztBQUNuQyxDQUFDLEVBQ0QsaUJBQWlCLENBQ2xCLENBQUM7Ozs7Ozs7Ozs7OztBQzVpQkYsb0QiLCJmaWxlIjoic3VydmV5LmpxdWVyeS5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcImpxdWVyeVwiKSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcInN1cnZleS1qcXVlcnlcIiwgW1wianF1ZXJ5XCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcInN1cnZleS1qcXVlcnlcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJqcXVlcnlcIikpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIlN1cnZleVwiXSA9IGZhY3Rvcnkocm9vdFtcImpRdWVyeVwiXSk7XG59KSh0aGlzLCBmdW5jdGlvbihfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX2pxdWVyeV9fKSB7XG5yZXR1cm4gIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvZW50cmllcy9qcXVlcnkudHNcIik7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXBhbmVsJywgZGF0YTogcXVlc3Rpb24sIGFzOiAncXVlc3Rpb24nLCBhZnRlclJlbmRlcjogcXVlc3Rpb24ua29QYW5lbEFmdGVyUmVuZGVyIH0gLS0+PCEtLSAva28gLS0+XCI7IiwibW9kdWxlLmV4cG9ydHMgPSBcIjxkaXYgY2xhc3M9XFxcInN2LXBvcHVwXFxcIiB0YWJpbmRleD1cXFwiLTFcXFwiXFxuICBkYXRhLWJpbmQ9XFxcInZpc2libGU6IGlzVmlzaWJsZSwgY2xpY2s6IGNsaWNrT3V0c2lkZSwgY2xhc3M6IHN0eWxlQ2xhc3MsIGV2ZW50OiB7IGtleWRvd246IGZ1bmN0aW9uKGRhdGEsIGV2ZW50KSB7IG9uS2V5RG93bihldmVudCk7IHJldHVybiB0cnVlOyB9IH1cXFwiPlxcbiAgPGRpdiBjbGFzcz1cXFwic3YtcG9wdXBfX2NvbnRhaW5lclxcXCJcXG4gICAgZGF0YS1iaW5kPVxcXCJzdHlsZTogeyBsZWZ0OiBsZWZ0LCB0b3A6IHRvcCwgaGVpZ2h0OiBoZWlnaHQgfSwgIGNsaWNrOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH0sIGNsaWNrQnViYmxlOiBmYWxzZVxcXCI+XFxuICAgIDwhLS0ga28gaWY6IHNob3dQb2ludGVyICAtLT5cXG4gICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJzdHlsZToge2xlZnQ6IHBvaW50ZXJUYXJnZXQubGVmdCwgdG9wOiBwb2ludGVyVGFyZ2V0LnRvcCB9XFxcIiBjbGFzcz1cXFwic3YtcG9wdXBfX3BvaW50ZXJcXFwiPjwvc3Bhbj5cXG4gICAgPCEtLSAva28gLS0+XFxuICAgIDwhLS0ga28gaWY6ICEhdGl0bGUgIC0tPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJzdi1wb3B1cF9faGVhZGVyXFxcIiBkYXRhLWJpbmQ9XFxcInRleHQ6IHRpdGxlXFxcIj48L2Rpdj5cXG4gICAgPCEtLSAva28gLS0+XFxuICAgIDxkaXYgY2xhc3M9XFxcInN2LXBvcHVwX19zY3JvbGxpbmctY29udGVudFxcXCI+XFxuICAgICAgPGRpdiBjbGFzcz1cXFwic3YtcG9wdXBfX2NvbnRlbnRcXFwiXFxuICAgICAgICBkYXRhLWJpbmQ9XFxcImNvbXBvbmVudDogeyBuYW1lOiBjb250ZW50Q29tcG9uZW50TmFtZSwgcGFyYW1zOiBjb250ZW50Q29tcG9uZW50RGF0YSB9XFxcIj48L2Rpdj5cXG4gICAgPC9kaXY+XFxuICAgIDwhLS0ga28gaWY6IGlzTW9kYWwgIC0tPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJzdi1wb3B1cF9fZm9vdGVyXFxcIj5cXG4gICAgICA8YnV0dG9uIGNsYXNzPVxcXCJzdi1wb3B1cF9fZm9vdGVyLWl0ZW0gc3YtcG9wdXBfX2J1dHRvbiBzdi1wb3B1cF9fYnV0dG9uLS1jYW5jZWxcXFwiXFxuICAgICAgICBkYXRhLWJpbmQ9XFxcImNsaWNrOiBjYW5jZWwsIHRleHQ6IGNhbmNlbEJ1dHRvblRleHRcXFwiPiBDYW5jZWwgPC9idXR0b24+XFxuICAgICAgPGJ1dHRvbiBjbGFzcz1cXFwic3YtcG9wdXBfX2Zvb3Rlci1pdGVtIHN2LXBvcHVwX19idXR0b24gc3YtcG9wdXBfX2J1dHRvbi0tYXBwbHlcXFwiXFxuICAgICAgICBkYXRhLWJpbmQ9XFxcImNsaWNrOiBhcHBseSwgdGV4dDogYXBwbHlCdXR0b25UZXh0XFxcIj4gQXBwbHkgPC9idXR0b24+XFxuICAgIDwvZGl2PlxcbiAgICA8IS0tIC9rbyAtLT5cXG4gIDwvZGl2PlxcbjwvZGl2PlwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBzdXJ2ZXkuY3NzLnByb2dyZXNzQnV0dG9uc0NvbnRhaW5lckNlbnRlclxcXCI+XFxuICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHN1cnZleS5jc3MucHJvZ3Jlc3NCdXR0b25zQ29udGFpbmVyXFxcIj5cXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IGdldFNjcm9sbEJ1dHRvbkNzcyh0cnVlKSwgY2xpY2s6IGNsaWNrU2Nyb2xsQnV0dG9uLmJpbmQoJGRhdGEsICRlbGVtZW50Lm5leHRFbGVtZW50U2libGluZywgdHJ1ZSlcXFwiIHJvbGU9XFxcImJ1dHRvblxcXCI+PC9kaXY+XFxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBzdXJ2ZXkuY3NzLnByb2dyZXNzQnV0dG9uc0xpc3RDb250YWluZXJcXFwiPlxcbiAgICAgICAgICAgIDx1bCBkYXRhLWJpbmQ9XFxcImZvcmVhY2g6IHN1cnZleS52aXNpYmxlUGFnZXMsIGNzczogc3VydmV5LmNzcy5wcm9ncmVzc0J1dHRvbnNMaXN0XFxcIj5cXG4gICAgICAgICAgICAgICAgPGxpIGRhdGEtYmluZD1cXFwiY3NzOiAkcGFyZW50LmdldExpc3RFbGVtZW50Q3NzKCRpbmRleCksIGNsaWNrOiAkcGFyZW50LmlzTGlzdEVsZW1lbnRDbGlja2FibGUoJGluZGV4KSA/ICRwYXJlbnQuY2xpY2tMaXN0RWxlbWVudC5iaW5kKCRwYXJlbnQsICRpbmRleCkgOiBudWxsXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IGNzcy5wcm9ncmVzc0J1dHRvbnNQYWdlVGl0bGUsIHRleHQ6IGxvY05hdmlnYXRpb25UaXRsZS5rb1JlbmRlcmVkSHRtbCgpIHx8IG5hbWUsIGF0dHI6IHsgdGl0bGU6IGxvY05hdmlnYXRpb25UaXRsZS5rb1JlbmRlcmVkSHRtbCgpIHx8IG5hbWUgfVxcXCI+PC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBjc3MucHJvZ3Jlc3NCdXR0b25zUGFnZURlc2NyaXB0aW9uLCB0ZXh0OiBsb2NOYXZpZ2F0aW9uRGVzY3JpcHRpb24ua29SZW5kZXJlZEh0bWwoKSwgYXR0cjogeyB0aXRsZTogbG9jTmF2aWdhdGlvbkRlc2NyaXB0aW9uLmtvUmVuZGVyZWRIdG1sKCkgfVxcXCI+PC9kaXY+XFxuICAgICAgICAgICAgICAgIDwvbGk+XFxuICAgICAgICAgICAgPC91bD5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogZ2V0U2Nyb2xsQnV0dG9uQ3NzKGZhbHNlKSwgY2xpY2s6IGNsaWNrU2Nyb2xsQnV0dG9uLmJpbmQoJGRhdGEsICRlbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcsIGZhbHNlKVxcXCIgcm9sZT1cXFwiYnV0dG9uXFxcIj48L2Rpdj5cXG4gICAgPC9kaXY+XFxuPC9kaXY+XCI7IiwibW9kdWxlLmV4cG9ydHMgPSBcIjxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IG1vZGVsLmNzcy5wcm9ncmVzc1xcXCI+XFxuICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IG1vZGVsLmNzcy5wcm9ncmVzc0Jhciwgc3R5bGU6IHsgd2lkdGg6IG1vZGVsLnByb2dyZXNzVmFsdWUgKyAnJScgfVxcXCJcXG4gICAgICAgIHJvbGU9XFxcInByb2dyZXNzYmFyXFxcIiBhcmlhLXZhbHVlbWluPVxcXCIwXFxcIiBhcmlhLXZhbHVlbWF4PVxcXCIxMDBcXFwiPlxcbiAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJ0ZXh0OiBtb2RlbC5wcm9ncmVzc1RleHQsIGNzczogZ2V0UHJvZ3Jlc3NUZXh0SW5CYXJDc3MobW9kZWwuY3NzKVxcXCI+PC9zcGFuPlxcbiAgICA8L2Rpdj5cXG4gICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJ0ZXh0OiBtb2RlbC5wcm9ncmVzc1RleHQsIGNzczogZ2V0UHJvZ3Jlc3NUZXh0VW5kZXJCYXJDc3MobW9kZWwuY3NzKVxcXCI+PC9zcGFuPlxcbjwvZGl2PlwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCJcIiArIHJlcXVpcmUoJy4vY29tbWVudC5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9mbG93cGFuZWwuaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vaGVhZGVyLmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL2luZGV4Lmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL3BhZ2UuaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcGFuZWwuaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcm93cy5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9yb3cuaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vc3RyaW5nLmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL3RpbWVycGFuZWwuaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24uaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcXVlc3Rpb250aXRsZS5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9xdWVzdGlvbi1ib29sZWFuLmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL3F1ZXN0aW9uLWNoZWNrYm94Lmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL3F1ZXN0aW9uLXJhbmtpbmcuaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24tY29tbWVudC5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9xdWVzdGlvbi1jb21wb3NpdGUuaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24tY3VzdG9tLmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL3F1ZXN0aW9uLWRyb3Bkb3duLmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL3F1ZXN0aW9uLWVtcHR5Lmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL3F1ZXN0aW9uLWVycm9ycy5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9xdWVzdGlvbi1leHByZXNzaW9uLmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL3F1ZXN0aW9uLWZpbGUuaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24taHRtbC5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9xdWVzdGlvbi1pbWFnZS5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9xdWVzdGlvbi1pbWFnZXBpY2tlci5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9xdWVzdGlvbi1tYXRyaXguaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24tbWF0cml4ZHluYW1pYy5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9xdWVzdGlvbi1tdWx0aXBsZXRleHQuaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24tcGFuZWxkeW5hbWljLmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL3F1ZXN0aW9uLXBhbmVsZHluYW1pYy1uYXZpZ2F0b3IuaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24tcmFkaW9ncm91cC5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9xdWVzdGlvbi1yYXRpbmcuaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24tc2lnbmF0dXJlcGFkLmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL3F1ZXN0aW9uLXRleHQuaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24tYnV0dG9uZ3JvdXAuaHRtbCcpICsgXCJcIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdiBzdHlsZT1cXFwicG9zaXRpb246IGZpeGVkOyBib3R0b206IDNweDsgcmlnaHQ6IDEwcHg7IG1heC13aWR0aDogNjAlO1xcXCIgZGF0YS1iaW5kPVxcXCJjc3M6IGNzcy53aW5kb3cucm9vdFxcXCI+XFxuICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IGNzcy53aW5kb3cuaGVhZGVyLnJvb3RcXFwiPlxcbiAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJjbGljazpkb0V4cGFuZFxcXCIgc3R5bGU9XFxcIndpZHRoOiAxMDAlOyBjdXJzb3I6IHBvaW50ZXI7XFxcIj5cXG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cXFwicGFkZGluZy1yaWdodDoxMHB4XFxcIiBkYXRhLWJpbmQ9XFxcImNzczogY3NzLndpbmRvdy5oZWFkZXIudGl0bGUsIHRleHQ6IGxvY1RpdGxlLmtvUmVuZGVyZWRIdG1sXFxcIj48L3NwYW4+XFxuICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XFxcInRydWVcXFwiIGRhdGEtYmluZD1cXFwiY3NzOiBrb0V4cGFuZGVkQ3NzXFxcIj48L3NwYW4+XFxuICAgICAgICA8L3NwYW4+XFxuICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcInZpc2libGU6a29FeHBhbmRlZCwgY2xpY2s6ZG9FeHBhbmRcXFwiIHN0eWxlPVxcXCJmbG9hdDogcmlnaHQ7IGN1cnNvcjogcG9pbnRlcjtcXFwiPlxcbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVxcXCJwYWRkaW5nLXJpZ2h0OjEwcHhcXFwiIGRhdGEtYmluZD1cXFwiY3NzOiBjc3Mud2luZG93LmhlYWRlci50aXRsZVxcXCI+WDwvc3Bhbj5cXG4gICAgICAgIDwvc3Bhbj5cXG4gICAgPC9kaXY+XFxuICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOmtvRXhwYW5kZWQsIGNzczogY3NzLndpbmRvdy5ib2R5XFxcIj5cXG4gICAgICAgIDxkaXYgaWQ9XFxcIndpbmRvd1N1cnZleUpTXFxcIj48L2Rpdj5cXG4gICAgPC9kaXY+XFxuPC9kaXY+XCI7IiwiLyohXG4gKiBLbm9ja291dCBKYXZhU2NyaXB0IGxpYnJhcnkgdjMuNS4xXG4gKiAoYykgVGhlIEtub2Nrb3V0LmpzIHRlYW0gLSBodHRwOi8va25vY2tvdXRqcy5jb20vXG4gKiBMaWNlbnNlOiBNSVQgKGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwKVxuICovXG5cbihmdW5jdGlvbigpIHsoZnVuY3Rpb24obil7dmFyIEE9dGhpc3x8KDAsZXZhbCkoXCJ0aGlzXCIpLHc9QS5kb2N1bWVudCxSPUEubmF2aWdhdG9yLHY9QS5qUXVlcnksSD1BLkpTT047dnx8XCJ1bmRlZmluZWRcIj09PXR5cGVvZiBqUXVlcnl8fCh2PWpRdWVyeSk7KGZ1bmN0aW9uKG4pe1wiZnVuY3Rpb25cIj09PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFtcImV4cG9ydHNcIixcInJlcXVpcmVcIl0sbik6XCJvYmplY3RcIj09PXR5cGVvZiBleHBvcnRzJiZcIm9iamVjdFwiPT09dHlwZW9mIG1vZHVsZT9uKG1vZHVsZS5leHBvcnRzfHxleHBvcnRzKTpuKEEua289e30pfSkoZnVuY3Rpb24oUyxUKXtmdW5jdGlvbiBLKGEsYyl7cmV0dXJuIG51bGw9PT1hfHx0eXBlb2YgYSBpbiBXP2E9PT1jOiExfWZ1bmN0aW9uIFgoYixjKXt2YXIgZDtyZXR1cm4gZnVuY3Rpb24oKXtkfHwoZD1hLmEuc2V0VGltZW91dChmdW5jdGlvbigpe2Q9bjtiKCl9LGMpKX19ZnVuY3Rpb24gWShiLGMpe3ZhciBkO3JldHVybiBmdW5jdGlvbigpe2NsZWFyVGltZW91dChkKTtcbmQ9YS5hLnNldFRpbWVvdXQoYixjKX19ZnVuY3Rpb24gWihhLGMpe2MmJlwiY2hhbmdlXCIhPT1jP1wiYmVmb3JlQ2hhbmdlXCI9PT1jP3RoaXMucGMoYSk6dGhpcy5nYihhLGMpOnRoaXMucWMoYSl9ZnVuY3Rpb24gYWEoYSxjKXtudWxsIT09YyYmYy5zJiZjLnMoKX1mdW5jdGlvbiBiYShhLGMpe3ZhciBkPXRoaXMucWQsZT1kW3JdO2UucmF8fCh0aGlzLlFiJiZ0aGlzLm1iW2NdPyhkLnVjKGMsYSx0aGlzLm1iW2NdKSx0aGlzLm1iW2NdPW51bGwsLS10aGlzLlFiKTplLklbY118fGQudWMoYyxhLGUuSj97ZGE6YX06ZC4kYyhhKSksYS5KYSYmYS5nZCgpKX12YXIgYT1cInVuZGVmaW5lZFwiIT09dHlwZW9mIFM/Uzp7fTthLmI9ZnVuY3Rpb24oYixjKXtmb3IodmFyIGQ9Yi5zcGxpdChcIi5cIiksZT1hLGY9MDtmPGQubGVuZ3RoLTE7ZisrKWU9ZVtkW2ZdXTtlW2RbZC5sZW5ndGgtMV1dPWN9O2EuTD1mdW5jdGlvbihhLGMsZCl7YVtjXT1kfTthLnZlcnNpb249XCIzLjUuMVwiO2EuYihcInZlcnNpb25cIixcbmEudmVyc2lvbik7YS5vcHRpb25zPXtkZWZlclVwZGF0ZXM6ITEsdXNlT25seU5hdGl2ZUV2ZW50czohMSxmb3JlYWNoSGlkZXNEZXN0cm95ZWQ6ITF9O2EuYT1mdW5jdGlvbigpe2Z1bmN0aW9uIGIoYSxiKXtmb3IodmFyIGMgaW4gYSlmLmNhbGwoYSxjKSYmYihjLGFbY10pfWZ1bmN0aW9uIGMoYSxiKXtpZihiKWZvcih2YXIgYyBpbiBiKWYuY2FsbChiLGMpJiYoYVtjXT1iW2NdKTtyZXR1cm4gYX1mdW5jdGlvbiBkKGEsYil7YS5fX3Byb3RvX189YjtyZXR1cm4gYX1mdW5jdGlvbiBlKGIsYyxkLGUpe3ZhciBsPWJbY10ubWF0Y2gocSl8fFtdO2EuYS5EKGQubWF0Y2gocSksZnVuY3Rpb24oYil7YS5hLk5hKGwsYixlKX0pO2JbY109bC5qb2luKFwiIFwiKX12YXIgZj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LGc9e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5LGg9XCJmdW5jdGlvblwiPT09dHlwZW9mIFN5bWJvbCxtPXt9LGs9e307bVtSJiYvRmlyZWZveFxcLzIvaS50ZXN0KFIudXNlckFnZW50KT9cblwiS2V5Ym9hcmRFdmVudFwiOlwiVUlFdmVudHNcIl09W1wia2V5dXBcIixcImtleWRvd25cIixcImtleXByZXNzXCJdO20uTW91c2VFdmVudHM9XCJjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZVwiLnNwbGl0KFwiIFwiKTtiKG0sZnVuY3Rpb24oYSxiKXtpZihiLmxlbmd0aClmb3IodmFyIGM9MCxkPWIubGVuZ3RoO2M8ZDtjKyspa1tiW2NdXT1hfSk7dmFyIGw9e3Byb3BlcnR5Y2hhbmdlOiEwfSxwPXcmJmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTMsYj13LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaVwiKTtiLmlubmVySFRNTD1cIlxceDNjIS0tW2lmIGd0IElFIFwiKyArK2ErXCJdPjxpPjwvaT48IVtlbmRpZl0tLVxceDNlXCIsY1swXTspO3JldHVybiA0PGE/YTpufSgpLHE9L1xcUysvZyx0O3JldHVybntKYzpbXCJhdXRoZW50aWNpdHlfdG9rZW5cIiwvXl9fUmVxdWVzdFZlcmlmaWNhdGlvblRva2VuKF8uKik/JC9dLFxuRDpmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPTAsZT1hLmxlbmd0aDtkPGU7ZCsrKWIuY2FsbChjLGFbZF0sZCxhKX0sQTpcImZ1bmN0aW9uXCI9PXR5cGVvZiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYil9OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTAsZD1hLmxlbmd0aDtjPGQ7YysrKWlmKGFbY109PT1iKXJldHVybiBjO3JldHVybi0xfSxMYjpmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPTAsZT1hLmxlbmd0aDtkPGU7ZCsrKWlmKGIuY2FsbChjLGFbZF0sZCxhKSlyZXR1cm4gYVtkXTtyZXR1cm4gbn0sUGE6ZnVuY3Rpb24oYixjKXt2YXIgZD1hLmEuQShiLGMpOzA8ZD9iLnNwbGljZShkLDEpOjA9PT1kJiZiLnNoaWZ0KCl9LHdjOmZ1bmN0aW9uKGIpe3ZhciBjPVtdO2ImJmEuYS5EKGIsZnVuY3Rpb24oYil7MD5hLmEuQShjLGIpJiZjLnB1c2goYil9KTtyZXR1cm4gY30sTWI6ZnVuY3Rpb24oYSxcbmIsYyl7dmFyIGQ9W107aWYoYSlmb3IodmFyIGU9MCxsPWEubGVuZ3RoO2U8bDtlKyspZC5wdXNoKGIuY2FsbChjLGFbZV0sZSkpO3JldHVybiBkfSxqYjpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9W107aWYoYSlmb3IodmFyIGU9MCxsPWEubGVuZ3RoO2U8bDtlKyspYi5jYWxsKGMsYVtlXSxlKSYmZC5wdXNoKGFbZV0pO3JldHVybiBkfSxOYjpmdW5jdGlvbihhLGIpe2lmKGIgaW5zdGFuY2VvZiBBcnJheSlhLnB1c2guYXBwbHkoYSxiKTtlbHNlIGZvcih2YXIgYz0wLGQ9Yi5sZW5ndGg7YzxkO2MrKylhLnB1c2goYltjXSk7cmV0dXJuIGF9LE5hOmZ1bmN0aW9uKGIsYyxkKXt2YXIgZT1hLmEuQShhLmEuYmMoYiksYyk7MD5lP2QmJmIucHVzaChjKTpkfHxiLnNwbGljZShlLDEpfSxCYTpnLGV4dGVuZDpjLHNldFByb3RvdHlwZU9mOmQsQWI6Zz9kOmMsUDpiLEdhOmZ1bmN0aW9uKGEsYixjKXtpZighYSlyZXR1cm4gYTt2YXIgZD17fSxlO2ZvcihlIGluIGEpZi5jYWxsKGEsZSkmJihkW2VdPVxuYi5jYWxsKGMsYVtlXSxlLGEpKTtyZXR1cm4gZH0sVGI6ZnVuY3Rpb24oYil7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlTm9kZShiLmZpcnN0Q2hpbGQpfSxZYjpmdW5jdGlvbihiKXtiPWEuYS5sYShiKTtmb3IodmFyIGM9KGJbMF0mJmJbMF0ub3duZXJEb2N1bWVudHx8dykuY3JlYXRlRWxlbWVudChcImRpdlwiKSxkPTAsZT1iLmxlbmd0aDtkPGU7ZCsrKWMuYXBwZW5kQ2hpbGQoYS5vYShiW2RdKSk7cmV0dXJuIGN9LENhOmZ1bmN0aW9uKGIsYyl7Zm9yKHZhciBkPTAsZT1iLmxlbmd0aCxsPVtdO2Q8ZTtkKyspe3ZhciBrPWJbZF0uY2xvbmVOb2RlKCEwKTtsLnB1c2goYz9hLm9hKGspOmspfXJldHVybiBsfSx2YTpmdW5jdGlvbihiLGMpe2EuYS5UYihiKTtpZihjKWZvcih2YXIgZD0wLGU9Yy5sZW5ndGg7ZDxlO2QrKyliLmFwcGVuZENoaWxkKGNbZF0pfSxYYzpmdW5jdGlvbihiLGMpe3ZhciBkPWIubm9kZVR5cGU/W2JdOmI7aWYoMDxkLmxlbmd0aCl7Zm9yKHZhciBlPWRbMF0sXG5sPWUucGFyZW50Tm9kZSxrPTAsZj1jLmxlbmd0aDtrPGY7aysrKWwuaW5zZXJ0QmVmb3JlKGNba10sZSk7az0wO2ZvcihmPWQubGVuZ3RoO2s8ZjtrKyspYS5yZW1vdmVOb2RlKGRba10pfX0sVWE6ZnVuY3Rpb24oYSxiKXtpZihhLmxlbmd0aCl7Zm9yKGI9OD09PWIubm9kZVR5cGUmJmIucGFyZW50Tm9kZXx8YjthLmxlbmd0aCYmYVswXS5wYXJlbnROb2RlIT09YjspYS5zcGxpY2UoMCwxKTtmb3IoOzE8YS5sZW5ndGgmJmFbYS5sZW5ndGgtMV0ucGFyZW50Tm9kZSE9PWI7KWEubGVuZ3RoLS07aWYoMTxhLmxlbmd0aCl7dmFyIGM9YVswXSxkPWFbYS5sZW5ndGgtMV07Zm9yKGEubGVuZ3RoPTA7YyE9PWQ7KWEucHVzaChjKSxjPWMubmV4dFNpYmxpbmc7YS5wdXNoKGQpfX1yZXR1cm4gYX0sWmM6ZnVuY3Rpb24oYSxiKXs3PnA/YS5zZXRBdHRyaWJ1dGUoXCJzZWxlY3RlZFwiLGIpOmEuc2VsZWN0ZWQ9Yn0sRGI6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PT1hfHxhPT09bj9cIlwiOmEudHJpbT9cbmEudHJpbSgpOmEudG9TdHJpbmcoKS5yZXBsYWNlKC9eW1xcc1xceGEwXSt8W1xcc1xceGEwXSskL2csXCJcIil9LFVkOmZ1bmN0aW9uKGEsYil7YT1hfHxcIlwiO3JldHVybiBiLmxlbmd0aD5hLmxlbmd0aD8hMTphLnN1YnN0cmluZygwLGIubGVuZ3RoKT09PWJ9LHZkOmZ1bmN0aW9uKGEsYil7aWYoYT09PWIpcmV0dXJuITA7aWYoMTE9PT1hLm5vZGVUeXBlKXJldHVybiExO2lmKGIuY29udGFpbnMpcmV0dXJuIGIuY29udGFpbnMoMSE9PWEubm9kZVR5cGU/YS5wYXJlbnROb2RlOmEpO2lmKGIuY29tcGFyZURvY3VtZW50UG9zaXRpb24pcmV0dXJuIDE2PT0oYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihhKSYxNik7Zm9yKDthJiZhIT1iOylhPWEucGFyZW50Tm9kZTtyZXR1cm4hIWF9LFNiOmZ1bmN0aW9uKGIpe3JldHVybiBhLmEudmQoYixiLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KX0sa2Q6ZnVuY3Rpb24oYil7cmV0dXJuISFhLmEuTGIoYixhLmEuU2IpfSxSOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZcbmEudGFnTmFtZSYmYS50YWdOYW1lLnRvTG93ZXJDYXNlKCl9LEFjOmZ1bmN0aW9uKGIpe3JldHVybiBhLm9uRXJyb3I/ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIGIuYXBwbHkodGhpcyxhcmd1bWVudHMpfWNhdGNoKGMpe3Rocm93IGEub25FcnJvciYmYS5vbkVycm9yKGMpLGM7fX06Yn0sc2V0VGltZW91dDpmdW5jdGlvbihiLGMpe3JldHVybiBzZXRUaW1lb3V0KGEuYS5BYyhiKSxjKX0sR2M6ZnVuY3Rpb24oYil7c2V0VGltZW91dChmdW5jdGlvbigpe2Eub25FcnJvciYmYS5vbkVycm9yKGIpO3Rocm93IGI7fSwwKX0sQjpmdW5jdGlvbihiLGMsZCl7dmFyIGU9YS5hLkFjKGQpO2Q9bFtjXTtpZihhLm9wdGlvbnMudXNlT25seU5hdGl2ZUV2ZW50c3x8ZHx8IXYpaWYoZHx8XCJmdW5jdGlvblwiIT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyKWlmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiBiLmF0dGFjaEV2ZW50KXt2YXIgaz1mdW5jdGlvbihhKXtlLmNhbGwoYixhKX0sZj1cIm9uXCIrYztiLmF0dGFjaEV2ZW50KGYsXG5rKTthLmEuSy56YShiLGZ1bmN0aW9uKCl7Yi5kZXRhY2hFdmVudChmLGspfSl9ZWxzZSB0aHJvdyBFcnJvcihcIkJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IGFkZEV2ZW50TGlzdGVuZXIgb3IgYXR0YWNoRXZlbnRcIik7ZWxzZSBiLmFkZEV2ZW50TGlzdGVuZXIoYyxlLCExKTtlbHNlIHR8fCh0PVwiZnVuY3Rpb25cIj09dHlwZW9mIHYoYikub24/XCJvblwiOlwiYmluZFwiKSx2KGIpW3RdKGMsZSl9LEZiOmZ1bmN0aW9uKGIsYyl7aWYoIWJ8fCFiLm5vZGVUeXBlKXRocm93IEVycm9yKFwiZWxlbWVudCBtdXN0IGJlIGEgRE9NIG5vZGUgd2hlbiBjYWxsaW5nIHRyaWdnZXJFdmVudFwiKTt2YXIgZDtcImlucHV0XCI9PT1hLmEuUihiKSYmYi50eXBlJiZcImNsaWNrXCI9PWMudG9Mb3dlckNhc2UoKT8oZD1iLnR5cGUsZD1cImNoZWNrYm94XCI9PWR8fFwicmFkaW9cIj09ZCk6ZD0hMTtpZihhLm9wdGlvbnMudXNlT25seU5hdGl2ZUV2ZW50c3x8IXZ8fGQpaWYoXCJmdW5jdGlvblwiPT10eXBlb2Ygdy5jcmVhdGVFdmVudClpZihcImZ1bmN0aW9uXCI9PVxudHlwZW9mIGIuZGlzcGF0Y2hFdmVudClkPXcuY3JlYXRlRXZlbnQoa1tjXXx8XCJIVE1MRXZlbnRzXCIpLGQuaW5pdEV2ZW50KGMsITAsITAsQSwwLDAsMCwwLDAsITEsITEsITEsITEsMCxiKSxiLmRpc3BhdGNoRXZlbnQoZCk7ZWxzZSB0aHJvdyBFcnJvcihcIlRoZSBzdXBwbGllZCBlbGVtZW50IGRvZXNuJ3Qgc3VwcG9ydCBkaXNwYXRjaEV2ZW50XCIpO2Vsc2UgaWYoZCYmYi5jbGljayliLmNsaWNrKCk7ZWxzZSBpZihcInVuZGVmaW5lZFwiIT10eXBlb2YgYi5maXJlRXZlbnQpYi5maXJlRXZlbnQoXCJvblwiK2MpO2Vsc2UgdGhyb3cgRXJyb3IoXCJCcm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCB0cmlnZ2VyaW5nIGV2ZW50c1wiKTtlbHNlIHYoYikudHJpZ2dlcihjKX0sZjpmdW5jdGlvbihiKXtyZXR1cm4gYS5PKGIpP2IoKTpifSxiYzpmdW5jdGlvbihiKXtyZXR1cm4gYS5PKGIpP2IudigpOmJ9LEViOmZ1bmN0aW9uKGIsYyxkKXt2YXIgbDtjJiYoXCJvYmplY3RcIj09PXR5cGVvZiBiLmNsYXNzTGlzdD9cbihsPWIuY2xhc3NMaXN0W2Q/XCJhZGRcIjpcInJlbW92ZVwiXSxhLmEuRChjLm1hdGNoKHEpLGZ1bmN0aW9uKGEpe2wuY2FsbChiLmNsYXNzTGlzdCxhKX0pKTpcInN0cmluZ1wiPT09dHlwZW9mIGIuY2xhc3NOYW1lLmJhc2VWYWw/ZShiLmNsYXNzTmFtZSxcImJhc2VWYWxcIixjLGQpOmUoYixcImNsYXNzTmFtZVwiLGMsZCkpfSxCYjpmdW5jdGlvbihiLGMpe3ZhciBkPWEuYS5mKGMpO2lmKG51bGw9PT1kfHxkPT09bilkPVwiXCI7dmFyIGU9YS5oLmZpcnN0Q2hpbGQoYik7IWV8fDMhPWUubm9kZVR5cGV8fGEuaC5uZXh0U2libGluZyhlKT9hLmgudmEoYixbYi5vd25lckRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGQpXSk6ZS5kYXRhPWQ7YS5hLkFkKGIpfSxZYzpmdW5jdGlvbihhLGIpe2EubmFtZT1iO2lmKDc+PXApdHJ5e3ZhciBjPWEubmFtZS5yZXBsYWNlKC9bJjw+J1wiXS9nLGZ1bmN0aW9uKGEpe3JldHVyblwiJiNcIithLmNoYXJDb2RlQXQoMCkrXCI7XCJ9KTthLm1lcmdlQXR0cmlidXRlcyh3LmNyZWF0ZUVsZW1lbnQoXCI8aW5wdXQgbmFtZT0nXCIrXG5jK1wiJy8+XCIpLCExKX1jYXRjaChkKXt9fSxBZDpmdW5jdGlvbihhKXs5PD1wJiYoYT0xPT1hLm5vZGVUeXBlP2E6YS5wYXJlbnROb2RlLGEuc3R5bGUmJihhLnN0eWxlLnpvb209YS5zdHlsZS56b29tKSl9LHdkOmZ1bmN0aW9uKGEpe2lmKHApe3ZhciBiPWEuc3R5bGUud2lkdGg7YS5zdHlsZS53aWR0aD0wO2Euc3R5bGUud2lkdGg9Yn19LFBkOmZ1bmN0aW9uKGIsYyl7Yj1hLmEuZihiKTtjPWEuYS5mKGMpO2Zvcih2YXIgZD1bXSxlPWI7ZTw9YztlKyspZC5wdXNoKGUpO3JldHVybiBkfSxsYTpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wLGQ9YS5sZW5ndGg7YzxkO2MrKyliLnB1c2goYVtjXSk7cmV0dXJuIGJ9LERhOmZ1bmN0aW9uKGEpe3JldHVybiBoP1N5bWJvbChhKTphfSxaZDo2PT09cCwkZDo3PT09cCxXOnAsTGM6ZnVuY3Rpb24oYixjKXtmb3IodmFyIGQ9YS5hLmxhKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJpbnB1dFwiKSkuY29uY2F0KGEuYS5sYShiLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGV4dGFyZWFcIikpKSxcbmU9XCJzdHJpbmdcIj09dHlwZW9mIGM/ZnVuY3Rpb24oYSl7cmV0dXJuIGEubmFtZT09PWN9OmZ1bmN0aW9uKGEpe3JldHVybiBjLnRlc3QoYS5uYW1lKX0sbD1bXSxrPWQubGVuZ3RoLTE7MDw9aztrLS0pZShkW2tdKSYmbC5wdXNoKGRba10pO3JldHVybiBsfSxOZDpmdW5jdGlvbihiKXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgYiYmKGI9YS5hLkRiKGIpKT9IJiZILnBhcnNlP0gucGFyc2UoYik6KG5ldyBGdW5jdGlvbihcInJldHVybiBcIitiKSkoKTpudWxsfSxoYzpmdW5jdGlvbihiLGMsZCl7aWYoIUh8fCFILnN0cmluZ2lmeSl0aHJvdyBFcnJvcihcIkNhbm5vdCBmaW5kIEpTT04uc3RyaW5naWZ5KCkuIFNvbWUgYnJvd3NlcnMgKGUuZy4sIElFIDwgOCkgZG9uJ3Qgc3VwcG9ydCBpdCBuYXRpdmVseSwgYnV0IHlvdSBjYW4gb3ZlcmNvbWUgdGhpcyBieSBhZGRpbmcgYSBzY3JpcHQgcmVmZXJlbmNlIHRvIGpzb24yLmpzLCBkb3dubG9hZGFibGUgZnJvbSBodHRwOi8vd3d3Lmpzb24ub3JnL2pzb24yLmpzXCIpO1xucmV0dXJuIEguc3RyaW5naWZ5KGEuYS5mKGIpLGMsZCl9LE9kOmZ1bmN0aW9uKGMsZCxlKXtlPWV8fHt9O3ZhciBsPWUucGFyYW1zfHx7fSxrPWUuaW5jbHVkZUZpZWxkc3x8dGhpcy5KYyxmPWM7aWYoXCJvYmplY3RcIj09dHlwZW9mIGMmJlwiZm9ybVwiPT09YS5hLlIoYykpZm9yKHZhciBmPWMuYWN0aW9uLGg9ay5sZW5ndGgtMTswPD1oO2gtLSlmb3IodmFyIGc9YS5hLkxjKGMsa1toXSksbT1nLmxlbmd0aC0xOzA8PW07bS0tKWxbZ1ttXS5uYW1lXT1nW21dLnZhbHVlO2Q9YS5hLmYoZCk7dmFyIHA9dy5jcmVhdGVFbGVtZW50KFwiZm9ybVwiKTtwLnN0eWxlLmRpc3BsYXk9XCJub25lXCI7cC5hY3Rpb249ZjtwLm1ldGhvZD1cInBvc3RcIjtmb3IodmFyIHEgaW4gZCljPXcuY3JlYXRlRWxlbWVudChcImlucHV0XCIpLGMudHlwZT1cImhpZGRlblwiLGMubmFtZT1xLGMudmFsdWU9YS5hLmhjKGEuYS5mKGRbcV0pKSxwLmFwcGVuZENoaWxkKGMpO2IobCxmdW5jdGlvbihhLGIpe3ZhciBjPXcuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuYy50eXBlPVwiaGlkZGVuXCI7Yy5uYW1lPWE7Yy52YWx1ZT1iO3AuYXBwZW5kQ2hpbGQoYyl9KTt3LmJvZHkuYXBwZW5kQ2hpbGQocCk7ZS5zdWJtaXR0ZXI/ZS5zdWJtaXR0ZXIocCk6cC5zdWJtaXQoKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHApfSwwKX19fSgpO2EuYihcInV0aWxzXCIsYS5hKTthLmIoXCJ1dGlscy5hcnJheUZvckVhY2hcIixhLmEuRCk7YS5iKFwidXRpbHMuYXJyYXlGaXJzdFwiLGEuYS5MYik7YS5iKFwidXRpbHMuYXJyYXlGaWx0ZXJcIixhLmEuamIpO2EuYihcInV0aWxzLmFycmF5R2V0RGlzdGluY3RWYWx1ZXNcIixhLmEud2MpO2EuYihcInV0aWxzLmFycmF5SW5kZXhPZlwiLGEuYS5BKTthLmIoXCJ1dGlscy5hcnJheU1hcFwiLGEuYS5NYik7YS5iKFwidXRpbHMuYXJyYXlQdXNoQWxsXCIsYS5hLk5iKTthLmIoXCJ1dGlscy5hcnJheVJlbW92ZUl0ZW1cIixhLmEuUGEpO2EuYihcInV0aWxzLmNsb25lTm9kZXNcIixhLmEuQ2EpO2EuYihcInV0aWxzLmNyZWF0ZVN5bWJvbE9yU3RyaW5nXCIsXG5hLmEuRGEpO2EuYihcInV0aWxzLmV4dGVuZFwiLGEuYS5leHRlbmQpO2EuYihcInV0aWxzLmZpZWxkc0luY2x1ZGVkV2l0aEpzb25Qb3N0XCIsYS5hLkpjKTthLmIoXCJ1dGlscy5nZXRGb3JtRmllbGRzXCIsYS5hLkxjKTthLmIoXCJ1dGlscy5vYmplY3RNYXBcIixhLmEuR2EpO2EuYihcInV0aWxzLnBlZWtPYnNlcnZhYmxlXCIsYS5hLmJjKTthLmIoXCJ1dGlscy5wb3N0SnNvblwiLGEuYS5PZCk7YS5iKFwidXRpbHMucGFyc2VKc29uXCIsYS5hLk5kKTthLmIoXCJ1dGlscy5yZWdpc3RlckV2ZW50SGFuZGxlclwiLGEuYS5CKTthLmIoXCJ1dGlscy5zdHJpbmdpZnlKc29uXCIsYS5hLmhjKTthLmIoXCJ1dGlscy5yYW5nZVwiLGEuYS5QZCk7YS5iKFwidXRpbHMudG9nZ2xlRG9tTm9kZUNzc0NsYXNzXCIsYS5hLkViKTthLmIoXCJ1dGlscy50cmlnZ2VyRXZlbnRcIixhLmEuRmIpO2EuYihcInV0aWxzLnVud3JhcE9ic2VydmFibGVcIixhLmEuZik7YS5iKFwidXRpbHMub2JqZWN0Rm9yRWFjaFwiLGEuYS5QKTthLmIoXCJ1dGlscy5hZGRPclJlbW92ZUl0ZW1cIixcbmEuYS5OYSk7YS5iKFwidXRpbHMuc2V0VGV4dENvbnRlbnRcIixhLmEuQmIpO2EuYihcInVud3JhcFwiLGEuYS5mKTtGdW5jdGlvbi5wcm90b3R5cGUuYmluZHx8KEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXM7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGMuYXBwbHkoYSxhcmd1bWVudHMpfTt2YXIgZD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9ZC5zbGljZSgwKTtlLnB1c2guYXBwbHkoZSxhcmd1bWVudHMpO3JldHVybiBjLmFwcGx5KGEsZSl9fSk7YS5hLmc9bmV3IGZ1bmN0aW9uKCl7dmFyIGI9MCxjPVwiX19rb19fXCIrKG5ldyBEYXRlKS5nZXRUaW1lKCksZD17fSxlLGY7YS5hLlc/KGU9ZnVuY3Rpb24oYSxlKXt2YXIgZj1hW2NdO2lmKCFmfHxcIm51bGxcIj09PWZ8fCFkW2ZdKXtpZighZSlyZXR1cm4gbjtmPWFbY109XCJrb1wiK2IrKztkW2ZdPVxue319cmV0dXJuIGRbZl19LGY9ZnVuY3Rpb24oYSl7dmFyIGI9YVtjXTtyZXR1cm4gYj8oZGVsZXRlIGRbYl0sYVtjXT1udWxsLCEwKTohMX0pOihlPWZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtjXTshZCYmYiYmKGQ9YVtjXT17fSk7cmV0dXJuIGR9LGY9ZnVuY3Rpb24oYSl7cmV0dXJuIGFbY10/KGRlbGV0ZSBhW2NdLCEwKTohMX0pO3JldHVybntnZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz1lKGEsITEpO3JldHVybiBjJiZjW2JdfSxzZXQ6ZnVuY3Rpb24oYSxiLGMpeyhhPWUoYSxjIT09bikpJiYoYVtiXT1jKX0sVWI6ZnVuY3Rpb24oYSxiLGMpe2E9ZShhLCEwKTtyZXR1cm4gYVtiXXx8KGFbYl09Yyl9LGNsZWFyOmYsWjpmdW5jdGlvbigpe3JldHVybiBiKysgK2N9fX07YS5iKFwidXRpbHMuZG9tRGF0YVwiLGEuYS5nKTthLmIoXCJ1dGlscy5kb21EYXRhLmNsZWFyXCIsYS5hLmcuY2xlYXIpO2EuYS5LPW5ldyBmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixjKXt2YXIgZD1hLmEuZy5nZXQoYixlKTtcbmQ9PT1uJiZjJiYoZD1bXSxhLmEuZy5zZXQoYixlLGQpKTtyZXR1cm4gZH1mdW5jdGlvbiBjKGMpe3ZhciBlPWIoYywhMSk7aWYoZSlmb3IodmFyIGU9ZS5zbGljZSgwKSxrPTA7azxlLmxlbmd0aDtrKyspZVtrXShjKTthLmEuZy5jbGVhcihjKTthLmEuSy5jbGVhbkV4dGVybmFsRGF0YShjKTtnW2Mubm9kZVR5cGVdJiZkKGMuY2hpbGROb2RlcywhMCl9ZnVuY3Rpb24gZChiLGQpe2Zvcih2YXIgZT1bXSxsLGY9MDtmPGIubGVuZ3RoO2YrKylpZighZHx8OD09PWJbZl0ubm9kZVR5cGUpaWYoYyhlW2UubGVuZ3RoXT1sPWJbZl0pLGJbZl0hPT1sKWZvcig7Zi0tJiYtMT09YS5hLkEoZSxiW2ZdKTspO312YXIgZT1hLmEuZy5aKCksZj17MTohMCw4OiEwLDk6ITB9LGc9ezE6ITAsOTohMH07cmV0dXJue3phOmZ1bmN0aW9uKGEsYyl7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgYyl0aHJvdyBFcnJvcihcIkNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvblwiKTtiKGEsITApLnB1c2goYyl9LHliOmZ1bmN0aW9uKGMsXG5kKXt2YXIgZj1iKGMsITEpO2YmJihhLmEuUGEoZixkKSwwPT1mLmxlbmd0aCYmYS5hLmcuc2V0KGMsZSxuKSl9LG9hOmZ1bmN0aW9uKGIpe2EudS5HKGZ1bmN0aW9uKCl7ZltiLm5vZGVUeXBlXSYmKGMoYiksZ1tiLm5vZGVUeXBlXSYmZChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiKlwiKSkpfSk7cmV0dXJuIGJ9LHJlbW92ZU5vZGU6ZnVuY3Rpb24oYil7YS5vYShiKTtiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKX0sY2xlYW5FeHRlcm5hbERhdGE6ZnVuY3Rpb24oYSl7diYmXCJmdW5jdGlvblwiPT10eXBlb2Ygdi5jbGVhbkRhdGEmJnYuY2xlYW5EYXRhKFthXSl9fX07YS5vYT1hLmEuSy5vYTthLnJlbW92ZU5vZGU9YS5hLksucmVtb3ZlTm9kZTthLmIoXCJjbGVhbk5vZGVcIixhLm9hKTthLmIoXCJyZW1vdmVOb2RlXCIsYS5yZW1vdmVOb2RlKTthLmIoXCJ1dGlscy5kb21Ob2RlRGlzcG9zYWxcIixhLmEuSyk7YS5iKFwidXRpbHMuZG9tTm9kZURpc3Bvc2FsLmFkZERpc3Bvc2VDYWxsYmFja1wiLFxuYS5hLksuemEpO2EuYihcInV0aWxzLmRvbU5vZGVEaXNwb3NhbC5yZW1vdmVEaXNwb3NlQ2FsbGJhY2tcIixhLmEuSy55Yik7KGZ1bmN0aW9uKCl7dmFyIGI9WzAsXCJcIixcIlwiXSxjPVsxLFwiPHRhYmxlPlwiLFwiPC90YWJsZT5cIl0sZD1bMyxcIjx0YWJsZT48dGJvZHk+PHRyPlwiLFwiPC90cj48L3Rib2R5PjwvdGFibGU+XCJdLGU9WzEsXCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+XCIsXCI8L3NlbGVjdD5cIl0sZj17dGhlYWQ6Yyx0Ym9keTpjLHRmb290OmMsdHI6WzIsXCI8dGFibGU+PHRib2R5PlwiLFwiPC90Ym9keT48L3RhYmxlPlwiXSx0ZDpkLHRoOmQsb3B0aW9uOmUsb3B0Z3JvdXA6ZX0sZz04Pj1hLmEuVzthLmEudWE9ZnVuY3Rpb24oYyxkKXt2YXIgZTtpZih2KWlmKHYucGFyc2VIVE1MKWU9di5wYXJzZUhUTUwoYyxkKXx8W107ZWxzZXtpZigoZT12LmNsZWFuKFtjXSxkKSkmJmVbMF0pe2Zvcih2YXIgbD1lWzBdO2wucGFyZW50Tm9kZSYmMTEhPT1sLnBhcmVudE5vZGUubm9kZVR5cGU7KWw9bC5wYXJlbnROb2RlO1xubC5wYXJlbnROb2RlJiZsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobCl9fWVsc2V7KGU9ZCl8fChlPXcpO3ZhciBsPWUucGFyZW50V2luZG93fHxlLmRlZmF1bHRWaWV3fHxBLHA9YS5hLkRiKGMpLnRvTG93ZXJDYXNlKCkscT1lLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdDt0PShwPXAubWF0Y2goL14oPzpcXHgzYyEtLS4qPy0tXFx4M2VcXHMqPykqPzwoW2Etel0rKVtcXHM+XS8pKSYmZltwWzFdXXx8YjtwPXRbMF07dD1cImlnbm9yZWQ8ZGl2PlwiK3RbMV0rYyt0WzJdK1wiPC9kaXY+XCI7XCJmdW5jdGlvblwiPT10eXBlb2YgbC5pbm5lclNoaXY/cS5hcHBlbmRDaGlsZChsLmlubmVyU2hpdih0KSk6KGcmJmUuYm9keS5hcHBlbmRDaGlsZChxKSxxLmlubmVySFRNTD10LGcmJnEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChxKSk7Zm9yKDtwLS07KXE9cS5sYXN0Q2hpbGQ7ZT1hLmEubGEocS5sYXN0Q2hpbGQuY2hpbGROb2Rlcyl9cmV0dXJuIGV9O2EuYS5NZD1mdW5jdGlvbihiLGMpe3ZhciBkPWEuYS51YShiLFxuYyk7cmV0dXJuIGQubGVuZ3RoJiZkWzBdLnBhcmVudEVsZW1lbnR8fGEuYS5ZYihkKX07YS5hLmZjPWZ1bmN0aW9uKGIsYyl7YS5hLlRiKGIpO2M9YS5hLmYoYyk7aWYobnVsbCE9PWMmJmMhPT1uKWlmKFwic3RyaW5nXCIhPXR5cGVvZiBjJiYoYz1jLnRvU3RyaW5nKCkpLHYpdihiKS5odG1sKGMpO2Vsc2UgZm9yKHZhciBkPWEuYS51YShjLGIub3duZXJEb2N1bWVudCksZT0wO2U8ZC5sZW5ndGg7ZSsrKWIuYXBwZW5kQ2hpbGQoZFtlXSl9fSkoKTthLmIoXCJ1dGlscy5wYXJzZUh0bWxGcmFnbWVudFwiLGEuYS51YSk7YS5iKFwidXRpbHMuc2V0SHRtbFwiLGEuYS5mYyk7YS5hYT1mdW5jdGlvbigpe2Z1bmN0aW9uIGIoYyxlKXtpZihjKWlmKDg9PWMubm9kZVR5cGUpe3ZhciBmPWEuYWEuVWMoYy5ub2RlVmFsdWUpO251bGwhPWYmJmUucHVzaCh7dWQ6YyxLZDpmfSl9ZWxzZSBpZigxPT1jLm5vZGVUeXBlKWZvcih2YXIgZj0wLGc9Yy5jaGlsZE5vZGVzLGg9Zy5sZW5ndGg7ZjxoO2YrKyliKGdbZl0sXG5lKX12YXIgYz17fTtyZXR1cm57WGI6ZnVuY3Rpb24oYSl7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgYSl0aHJvdyBFcnJvcihcIllvdSBjYW4gb25seSBwYXNzIGEgZnVuY3Rpb24gdG8ga28ubWVtb2l6YXRpb24ubWVtb2l6ZSgpXCIpO3ZhciBiPSg0Mjk0OTY3Mjk2KigxK01hdGgucmFuZG9tKCkpfDApLnRvU3RyaW5nKDE2KS5zdWJzdHJpbmcoMSkrKDQyOTQ5NjcyOTYqKDErTWF0aC5yYW5kb20oKSl8MCkudG9TdHJpbmcoMTYpLnN1YnN0cmluZygxKTtjW2JdPWE7cmV0dXJuXCJcXHgzYyEtLVtrb19tZW1vOlwiK2IrXCJdLS1cXHgzZVwifSxiZDpmdW5jdGlvbihhLGIpe3ZhciBmPWNbYV07aWYoZj09PW4pdGhyb3cgRXJyb3IoXCJDb3VsZG4ndCBmaW5kIGFueSBtZW1vIHdpdGggSUQgXCIrYStcIi4gUGVyaGFwcyBpdCdzIGFscmVhZHkgYmVlbiB1bm1lbW9pemVkLlwiKTt0cnl7cmV0dXJuIGYuYXBwbHkobnVsbCxifHxbXSksITB9ZmluYWxseXtkZWxldGUgY1thXX19LGNkOmZ1bmN0aW9uKGMsZSl7dmFyIGY9XG5bXTtiKGMsZik7Zm9yKHZhciBnPTAsaD1mLmxlbmd0aDtnPGg7ZysrKXt2YXIgbT1mW2ddLnVkLGs9W21dO2UmJmEuYS5OYihrLGUpO2EuYWEuYmQoZltnXS5LZCxrKTttLm5vZGVWYWx1ZT1cIlwiO20ucGFyZW50Tm9kZSYmbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG0pfX0sVWM6ZnVuY3Rpb24oYSl7cmV0dXJuKGE9YS5tYXRjaCgvXlxcW2tvX21lbW9cXDooLio/KVxcXSQvKSk/YVsxXTpudWxsfX19KCk7YS5iKFwibWVtb2l6YXRpb25cIixhLmFhKTthLmIoXCJtZW1vaXphdGlvbi5tZW1vaXplXCIsYS5hYS5YYik7YS5iKFwibWVtb2l6YXRpb24udW5tZW1vaXplXCIsYS5hYS5iZCk7YS5iKFwibWVtb2l6YXRpb24ucGFyc2VNZW1vVGV4dFwiLGEuYWEuVWMpO2EuYihcIm1lbW9pemF0aW9uLnVubWVtb2l6ZURvbU5vZGVBbmREZXNjZW5kYW50c1wiLGEuYWEuY2QpO2EubmE9ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7aWYoZilmb3IodmFyIGI9ZixjPTAsZDtoPGY7KWlmKGQ9ZVtoKytdKXtpZihoPmIpe2lmKDVFMzw9XG4rK2Mpe2g9ZjthLmEuR2MoRXJyb3IoXCInVG9vIG11Y2ggcmVjdXJzaW9uJyBhZnRlciBwcm9jZXNzaW5nIFwiK2MrXCIgdGFzayBncm91cHMuXCIpKTticmVha31iPWZ9dHJ5e2QoKX1jYXRjaChwKXthLmEuR2MocCl9fX1mdW5jdGlvbiBjKCl7YigpO2g9Zj1lLmxlbmd0aD0wfXZhciBkLGU9W10sZj0wLGc9MSxoPTA7QS5NdXRhdGlvbk9ic2VydmVyP2Q9ZnVuY3Rpb24oYSl7dmFyIGI9dy5jcmVhdGVFbGVtZW50KFwiZGl2XCIpOyhuZXcgTXV0YXRpb25PYnNlcnZlcihhKSkub2JzZXJ2ZShiLHthdHRyaWJ1dGVzOiEwfSk7cmV0dXJuIGZ1bmN0aW9uKCl7Yi5jbGFzc0xpc3QudG9nZ2xlKFwiZm9vXCIpfX0oYyk6ZD13JiZcIm9ucmVhZHlzdGF0ZWNoYW5nZVwiaW4gdy5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpP2Z1bmN0aW9uKGEpe3ZhciBiPXcuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtiLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2Iub25yZWFkeXN0YXRlY2hhbmdlPW51bGw7dy5kb2N1bWVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYik7XG5iPW51bGw7YSgpfTt3LmRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZChiKX06ZnVuY3Rpb24oYSl7c2V0VGltZW91dChhLDApfTtyZXR1cm57c2NoZWR1bGVyOmQsemI6ZnVuY3Rpb24oYil7Znx8YS5uYS5zY2hlZHVsZXIoYyk7ZVtmKytdPWI7cmV0dXJuIGcrK30sY2FuY2VsOmZ1bmN0aW9uKGEpe2E9YS0oZy1mKTthPj1oJiZhPGYmJihlW2FdPW51bGwpfSxyZXNldEZvclRlc3Rpbmc6ZnVuY3Rpb24oKXt2YXIgYT1mLWg7aD1mPWUubGVuZ3RoPTA7cmV0dXJuIGF9LFNkOmJ9fSgpO2EuYihcInRhc2tzXCIsYS5uYSk7YS5iKFwidGFza3Muc2NoZWR1bGVcIixhLm5hLnpiKTthLmIoXCJ0YXNrcy5ydW5FYXJseVwiLGEubmEuU2QpO2EuVGE9e3Rocm90dGxlOmZ1bmN0aW9uKGIsYyl7Yi50aHJvdHRsZUV2YWx1YXRpb249Yzt2YXIgZD1udWxsO3JldHVybiBhLiQoe3JlYWQ6Yix3cml0ZTpmdW5jdGlvbihlKXtjbGVhclRpbWVvdXQoZCk7ZD1hLmEuc2V0VGltZW91dChmdW5jdGlvbigpe2IoZSl9LFxuYyl9fSl9LHJhdGVMaW1pdDpmdW5jdGlvbihhLGMpe3ZhciBkLGUsZjtcIm51bWJlclwiPT10eXBlb2YgYz9kPWM6KGQ9Yy50aW1lb3V0LGU9Yy5tZXRob2QpO2EuSGI9ITE7Zj1cImZ1bmN0aW9uXCI9PXR5cGVvZiBlP2U6XCJub3RpZnlXaGVuQ2hhbmdlc1N0b3BcIj09ZT9ZOlg7YS51YihmdW5jdGlvbihhKXtyZXR1cm4gZihhLGQsYyl9KX0sZGVmZXJyZWQ6ZnVuY3Rpb24oYixjKXtpZighMCE9PWMpdGhyb3cgRXJyb3IoXCJUaGUgJ2RlZmVycmVkJyBleHRlbmRlciBvbmx5IGFjY2VwdHMgdGhlIHZhbHVlICd0cnVlJywgYmVjYXVzZSBpdCBpcyBub3Qgc3VwcG9ydGVkIHRvIHR1cm4gZGVmZXJyYWwgb2ZmIG9uY2UgZW5hYmxlZC5cIik7Yi5IYnx8KGIuSGI9ITAsYi51YihmdW5jdGlvbihjKXt2YXIgZSxmPSExO3JldHVybiBmdW5jdGlvbigpe2lmKCFmKXthLm5hLmNhbmNlbChlKTtlPWEubmEuemIoYyk7dHJ5e2Y9ITAsYi5ub3RpZnlTdWJzY3JpYmVycyhuLFwiZGlydHlcIil9ZmluYWxseXtmPVxuITF9fX19KSl9LG5vdGlmeTpmdW5jdGlvbihhLGMpe2EuZXF1YWxpdHlDb21wYXJlcj1cImFsd2F5c1wiPT1jP251bGw6S319O3ZhciBXPXt1bmRlZmluZWQ6MSxcImJvb2xlYW5cIjoxLG51bWJlcjoxLHN0cmluZzoxfTthLmIoXCJleHRlbmRlcnNcIixhLlRhKTthLmljPWZ1bmN0aW9uKGIsYyxkKXt0aGlzLmRhPWI7dGhpcy5sYz1jO3RoaXMubWM9ZDt0aGlzLkliPSExO3RoaXMuZmI9dGhpcy5KYj1udWxsO2EuTCh0aGlzLFwiZGlzcG9zZVwiLHRoaXMucyk7YS5MKHRoaXMsXCJkaXNwb3NlV2hlbk5vZGVJc1JlbW92ZWRcIix0aGlzLmwpfTthLmljLnByb3RvdHlwZS5zPWZ1bmN0aW9uKCl7dGhpcy5JYnx8KHRoaXMuZmImJmEuYS5LLnliKHRoaXMuSmIsdGhpcy5mYiksdGhpcy5JYj0hMCx0aGlzLm1jKCksdGhpcy5kYT10aGlzLmxjPXRoaXMubWM9dGhpcy5KYj10aGlzLmZiPW51bGwpfTthLmljLnByb3RvdHlwZS5sPWZ1bmN0aW9uKGIpe3RoaXMuSmI9YjthLmEuSy56YShiLHRoaXMuZmI9dGhpcy5zLmJpbmQodGhpcykpfTtcbmEuVD1mdW5jdGlvbigpe2EuYS5BYih0aGlzLEQpO0QucWIodGhpcyl9O3ZhciBEPXtxYjpmdW5jdGlvbihhKXthLlU9e2NoYW5nZTpbXX07YS5zYz0xfSxzdWJzY3JpYmU6ZnVuY3Rpb24oYixjLGQpe3ZhciBlPXRoaXM7ZD1kfHxcImNoYW5nZVwiO3ZhciBmPW5ldyBhLmljKGUsYz9iLmJpbmQoYyk6YixmdW5jdGlvbigpe2EuYS5QYShlLlVbZF0sZik7ZS5oYiYmZS5oYihkKX0pO2UuUWEmJmUuUWEoZCk7ZS5VW2RdfHwoZS5VW2RdPVtdKTtlLlVbZF0ucHVzaChmKTtyZXR1cm4gZn0sbm90aWZ5U3Vic2NyaWJlcnM6ZnVuY3Rpb24oYixjKXtjPWN8fFwiY2hhbmdlXCI7XCJjaGFuZ2VcIj09PWMmJnRoaXMuR2IoKTtpZih0aGlzLldhKGMpKXt2YXIgZD1cImNoYW5nZVwiPT09YyYmdGhpcy5lZHx8dGhpcy5VW2NdLnNsaWNlKDApO3RyeXthLnUueGMoKTtmb3IodmFyIGU9MCxmO2Y9ZFtlXTsrK2UpZi5JYnx8Zi5sYyhiKX1maW5hbGx5e2EudS5lbmQoKX19fSxvYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNjfSxcbkRkOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm9iKCkhPT1hfSxHYjpmdW5jdGlvbigpeysrdGhpcy5zY30sdWI6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcyxkPWEuTyhjKSxlLGYsZyxoLG07Yy5nYnx8KGMuZ2I9Yy5ub3RpZnlTdWJzY3JpYmVycyxjLm5vdGlmeVN1YnNjcmliZXJzPVopO3ZhciBrPWIoZnVuY3Rpb24oKXtjLkphPSExO2QmJmg9PT1jJiYoaD1jLm5jP2MubmMoKTpjKCkpO3ZhciBhPWZ8fG0mJmMuc2IoZyxoKTttPWY9ZT0hMTthJiZjLmdiKGc9aCl9KTtjLnFjPWZ1bmN0aW9uKGEsYil7YiYmYy5KYXx8KG09IWIpO2MuZWQ9Yy5VLmNoYW5nZS5zbGljZSgwKTtjLkphPWU9ITA7aD1hO2soKX07Yy5wYz1mdW5jdGlvbihhKXtlfHwoZz1hLGMuZ2IoYSxcImJlZm9yZUNoYW5nZVwiKSl9O2MucmM9ZnVuY3Rpb24oKXttPSEwfTtjLmdkPWZ1bmN0aW9uKCl7Yy5zYihnLGMudighMCkpJiYoZj0hMCl9fSxXYTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5VW2FdJiZ0aGlzLlVbYV0ubGVuZ3RofSxcbkJkOmZ1bmN0aW9uKGIpe2lmKGIpcmV0dXJuIHRoaXMuVVtiXSYmdGhpcy5VW2JdLmxlbmd0aHx8MDt2YXIgYz0wO2EuYS5QKHRoaXMuVSxmdW5jdGlvbihhLGIpe1wiZGlydHlcIiE9PWEmJihjKz1iLmxlbmd0aCl9KTtyZXR1cm4gY30sc2I6ZnVuY3Rpb24oYSxjKXtyZXR1cm4hdGhpcy5lcXVhbGl0eUNvbXBhcmVyfHwhdGhpcy5lcXVhbGl0eUNvbXBhcmVyKGEsYyl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuXCJbb2JqZWN0IE9iamVjdF1cIn0sZXh0ZW5kOmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXM7YiYmYS5hLlAoYixmdW5jdGlvbihiLGUpe3ZhciBmPWEuVGFbYl07XCJmdW5jdGlvblwiPT10eXBlb2YgZiYmKGM9ZihjLGUpfHxjKX0pO3JldHVybiBjfX07YS5MKEQsXCJpbml0XCIsRC5xYik7YS5MKEQsXCJzdWJzY3JpYmVcIixELnN1YnNjcmliZSk7YS5MKEQsXCJleHRlbmRcIixELmV4dGVuZCk7YS5MKEQsXCJnZXRTdWJzY3JpcHRpb25zQ291bnRcIixELkJkKTthLmEuQmEmJmEuYS5zZXRQcm90b3R5cGVPZihELFxuRnVuY3Rpb24ucHJvdG90eXBlKTthLlQuZm49RDthLlFjPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBhLnN1YnNjcmliZSYmXCJmdW5jdGlvblwiPT10eXBlb2YgYS5ub3RpZnlTdWJzY3JpYmVyc307YS5iKFwic3Vic2NyaWJhYmxlXCIsYS5UKTthLmIoXCJpc1N1YnNjcmliYWJsZVwiLGEuUWMpO2EuUz1hLnU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGEpe2QucHVzaChlKTtlPWF9ZnVuY3Rpb24gYygpe2U9ZC5wb3AoKX12YXIgZD1bXSxlLGY9MDtyZXR1cm57eGM6YixlbmQ6YyxjYzpmdW5jdGlvbihiKXtpZihlKXtpZighYS5RYyhiKSl0aHJvdyBFcnJvcihcIk9ubHkgc3Vic2NyaWJhYmxlIHRoaW5ncyBjYW4gYWN0IGFzIGRlcGVuZGVuY2llc1wiKTtlLm9kLmNhbGwoZS5wZCxiLGIuZmR8fChiLmZkPSsrZikpfX0sRzpmdW5jdGlvbihhLGQsZSl7dHJ5e3JldHVybiBiKCksYS5hcHBseShkLGV8fFtdKX1maW5hbGx5e2MoKX19LHFhOmZ1bmN0aW9uKCl7aWYoZSlyZXR1cm4gZS5vLnFhKCl9LFxuVmE6ZnVuY3Rpb24oKXtpZihlKXJldHVybiBlLm8uVmEoKX0sWWE6ZnVuY3Rpb24oKXtpZihlKXJldHVybiBlLllhfSxvOmZ1bmN0aW9uKCl7aWYoZSlyZXR1cm4gZS5vfX19KCk7YS5iKFwiY29tcHV0ZWRDb250ZXh0XCIsYS5TKTthLmIoXCJjb21wdXRlZENvbnRleHQuZ2V0RGVwZW5kZW5jaWVzQ291bnRcIixhLlMucWEpO2EuYihcImNvbXB1dGVkQ29udGV4dC5nZXREZXBlbmRlbmNpZXNcIixhLlMuVmEpO2EuYihcImNvbXB1dGVkQ29udGV4dC5pc0luaXRpYWxcIixhLlMuWWEpO2EuYihcImNvbXB1dGVkQ29udGV4dC5yZWdpc3RlckRlcGVuZGVuY3lcIixhLlMuY2MpO2EuYihcImlnbm9yZURlcGVuZGVuY2llc1wiLGEuWWQ9YS51LkcpO3ZhciBJPWEuYS5EYShcIl9sYXRlc3RWYWx1ZVwiKTthLnRhPWZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGMoKXtpZigwPGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGMuc2IoY1tJXSxhcmd1bWVudHNbMF0pJiYoYy55YSgpLGNbSV09YXJndW1lbnRzWzBdLGMueGEoKSksdGhpcztcbmEudS5jYyhjKTtyZXR1cm4gY1tJXX1jW0ldPWI7YS5hLkJhfHxhLmEuZXh0ZW5kKGMsYS5ULmZuKTthLlQuZm4ucWIoYyk7YS5hLkFiKGMsRik7YS5vcHRpb25zLmRlZmVyVXBkYXRlcyYmYS5UYS5kZWZlcnJlZChjLCEwKTtyZXR1cm4gY307dmFyIEY9e2VxdWFsaXR5Q29tcGFyZXI6Syx2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbSV19LHhhOmZ1bmN0aW9uKCl7dGhpcy5ub3RpZnlTdWJzY3JpYmVycyh0aGlzW0ldLFwic3BlY3RhdGVcIik7dGhpcy5ub3RpZnlTdWJzY3JpYmVycyh0aGlzW0ldKX0seWE6ZnVuY3Rpb24oKXt0aGlzLm5vdGlmeVN1YnNjcmliZXJzKHRoaXNbSV0sXCJiZWZvcmVDaGFuZ2VcIil9fTthLmEuQmEmJmEuYS5zZXRQcm90b3R5cGVPZihGLGEuVC5mbik7dmFyIEc9YS50YS5NYT1cIl9fa29fcHJvdG9fX1wiO0ZbR109YS50YTthLk89ZnVuY3Rpb24oYil7aWYoKGI9XCJmdW5jdGlvblwiPT10eXBlb2YgYiYmYltHXSkmJmIhPT1GW0ddJiZiIT09YS5vLmZuW0ddKXRocm93IEVycm9yKFwiSW52YWxpZCBvYmplY3QgdGhhdCBsb29rcyBsaWtlIGFuIG9ic2VydmFibGU7IHBvc3NpYmx5IGZyb20gYW5vdGhlciBLbm9ja291dCBpbnN0YW5jZVwiKTtcbnJldHVybiEhYn07YS5aYT1mdW5jdGlvbihiKXtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiBiJiYoYltHXT09PUZbR118fGJbR109PT1hLm8uZm5bR10mJmIuTmMpfTthLmIoXCJvYnNlcnZhYmxlXCIsYS50YSk7YS5iKFwiaXNPYnNlcnZhYmxlXCIsYS5PKTthLmIoXCJpc1dyaXRlYWJsZU9ic2VydmFibGVcIixhLlphKTthLmIoXCJpc1dyaXRhYmxlT2JzZXJ2YWJsZVwiLGEuWmEpO2EuYihcIm9ic2VydmFibGUuZm5cIixGKTthLkwoRixcInBlZWtcIixGLnYpO2EuTChGLFwidmFsdWVIYXNNdXRhdGVkXCIsRi54YSk7YS5MKEYsXCJ2YWx1ZVdpbGxNdXRhdGVcIixGLnlhKTthLkhhPWZ1bmN0aW9uKGIpe2I9Ynx8W107aWYoXCJvYmplY3RcIiE9dHlwZW9mIGJ8fCEoXCJsZW5ndGhcImluIGIpKXRocm93IEVycm9yKFwiVGhlIGFyZ3VtZW50IHBhc3NlZCB3aGVuIGluaXRpYWxpemluZyBhbiBvYnNlcnZhYmxlIGFycmF5IG11c3QgYmUgYW4gYXJyYXksIG9yIG51bGwsIG9yIHVuZGVmaW5lZC5cIik7Yj1hLnRhKGIpO2EuYS5BYihiLFxuYS5IYS5mbik7cmV0dXJuIGIuZXh0ZW5kKHt0cmFja0FycmF5Q2hhbmdlczohMH0pfTthLkhhLmZuPXtyZW1vdmU6ZnVuY3Rpb24oYil7Zm9yKHZhciBjPXRoaXMudigpLGQ9W10sZT1cImZ1bmN0aW9uXCIhPXR5cGVvZiBifHxhLk8oYik/ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1ifTpiLGY9MDtmPGMubGVuZ3RoO2YrKyl7dmFyIGc9Y1tmXTtpZihlKGcpKXswPT09ZC5sZW5ndGgmJnRoaXMueWEoKTtpZihjW2ZdIT09Zyl0aHJvdyBFcnJvcihcIkFycmF5IG1vZGlmaWVkIGR1cmluZyByZW1vdmU7IGNhbm5vdCByZW1vdmUgaXRlbVwiKTtkLnB1c2goZyk7Yy5zcGxpY2UoZiwxKTtmLS19fWQubGVuZ3RoJiZ0aGlzLnhhKCk7cmV0dXJuIGR9LHJlbW92ZUFsbDpmdW5jdGlvbihiKXtpZihiPT09bil7dmFyIGM9dGhpcy52KCksZD1jLnNsaWNlKDApO3RoaXMueWEoKTtjLnNwbGljZSgwLGMubGVuZ3RoKTt0aGlzLnhhKCk7cmV0dXJuIGR9cmV0dXJuIGI/dGhpcy5yZW1vdmUoZnVuY3Rpb24oYyl7cmV0dXJuIDA8PVxuYS5hLkEoYixjKX0pOltdfSxkZXN0cm95OmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMudigpLGQ9XCJmdW5jdGlvblwiIT10eXBlb2YgYnx8YS5PKGIpP2Z1bmN0aW9uKGEpe3JldHVybiBhPT09Yn06Yjt0aGlzLnlhKCk7Zm9yKHZhciBlPWMubGVuZ3RoLTE7MDw9ZTtlLS0pe3ZhciBmPWNbZV07ZChmKSYmKGYuX2Rlc3Ryb3k9ITApfXRoaXMueGEoKX0sZGVzdHJveUFsbDpmdW5jdGlvbihiKXtyZXR1cm4gYj09PW4/dGhpcy5kZXN0cm95KGZ1bmN0aW9uKCl7cmV0dXJuITB9KTpiP3RoaXMuZGVzdHJveShmdW5jdGlvbihjKXtyZXR1cm4gMDw9YS5hLkEoYixjKX0pOltdfSxpbmRleE9mOmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMoKTtyZXR1cm4gYS5hLkEoYyxiKX0scmVwbGFjZTpmdW5jdGlvbihhLGMpe3ZhciBkPXRoaXMuaW5kZXhPZihhKTswPD1kJiYodGhpcy55YSgpLHRoaXMudigpW2RdPWMsdGhpcy54YSgpKX0sc29ydGVkOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMoKS5zbGljZSgwKTtcbnJldHVybiBhP2Muc29ydChhKTpjLnNvcnQoKX0scmV2ZXJzZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcygpLnNsaWNlKDApLnJldmVyc2UoKX19O2EuYS5CYSYmYS5hLnNldFByb3RvdHlwZU9mKGEuSGEuZm4sYS50YS5mbik7YS5hLkQoXCJwb3AgcHVzaCByZXZlcnNlIHNoaWZ0IHNvcnQgc3BsaWNlIHVuc2hpZnRcIi5zcGxpdChcIiBcIiksZnVuY3Rpb24oYil7YS5IYS5mbltiXT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudigpO3RoaXMueWEoKTt0aGlzLnpjKGEsYixhcmd1bWVudHMpO3ZhciBkPWFbYl0uYXBwbHkoYSxhcmd1bWVudHMpO3RoaXMueGEoKTtyZXR1cm4gZD09PWE/dGhpczpkfX0pO2EuYS5EKFtcInNsaWNlXCJdLGZ1bmN0aW9uKGIpe2EuSGEuZm5bYl09ZnVuY3Rpb24oKXt2YXIgYT10aGlzKCk7cmV0dXJuIGFbYl0uYXBwbHkoYSxhcmd1bWVudHMpfX0pO2EuUGM9ZnVuY3Rpb24oYil7cmV0dXJuIGEuTyhiKSYmXCJmdW5jdGlvblwiPT10eXBlb2YgYi5yZW1vdmUmJlwiZnVuY3Rpb25cIj09XG50eXBlb2YgYi5wdXNofTthLmIoXCJvYnNlcnZhYmxlQXJyYXlcIixhLkhhKTthLmIoXCJpc09ic2VydmFibGVBcnJheVwiLGEuUGMpO2EuVGEudHJhY2tBcnJheUNoYW5nZXM9ZnVuY3Rpb24oYixjKXtmdW5jdGlvbiBkKCl7ZnVuY3Rpb24gYygpe2lmKG0pe3ZhciBkPVtdLmNvbmNhdChiLnYoKXx8W10pLGU7aWYoYi5XYShcImFycmF5Q2hhbmdlXCIpKXtpZighZnx8MTxtKWY9YS5hLlBiKGssZCxiLk9iKTtlPWZ9az1kO2Y9bnVsbDttPTA7ZSYmZS5sZW5ndGgmJmIubm90aWZ5U3Vic2NyaWJlcnMoZSxcImFycmF5Q2hhbmdlXCIpfX1lP2MoKTooZT0hMCxoPWIuc3Vic2NyaWJlKGZ1bmN0aW9uKCl7KyttfSxudWxsLFwic3BlY3RhdGVcIiksaz1bXS5jb25jYXQoYi52KCl8fFtdKSxmPW51bGwsZz1iLnN1YnNjcmliZShjKSl9Yi5PYj17fTtjJiZcIm9iamVjdFwiPT10eXBlb2YgYyYmYS5hLmV4dGVuZChiLk9iLGMpO2IuT2Iuc3BhcnNlPSEwO2lmKCFiLnpjKXt2YXIgZT0hMSxmPW51bGwsZyxoLG09MCxcbmssbD1iLlFhLHA9Yi5oYjtiLlFhPWZ1bmN0aW9uKGEpe2wmJmwuY2FsbChiLGEpO1wiYXJyYXlDaGFuZ2VcIj09PWEmJmQoKX07Yi5oYj1mdW5jdGlvbihhKXtwJiZwLmNhbGwoYixhKTtcImFycmF5Q2hhbmdlXCIhPT1hfHxiLldhKFwiYXJyYXlDaGFuZ2VcIil8fChnJiZnLnMoKSxoJiZoLnMoKSxoPWc9bnVsbCxlPSExLGs9bil9O2IuemM9ZnVuY3Rpb24oYixjLGQpe2Z1bmN0aW9uIGwoYSxiLGMpe3JldHVybiBrW2subGVuZ3RoXT17c3RhdHVzOmEsdmFsdWU6YixpbmRleDpjfX1pZihlJiYhbSl7dmFyIGs9W10scD1iLmxlbmd0aCxnPWQubGVuZ3RoLGg9MDtzd2l0Y2goYyl7Y2FzZSBcInB1c2hcIjpoPXA7Y2FzZSBcInVuc2hpZnRcIjpmb3IoYz0wO2M8ZztjKyspbChcImFkZGVkXCIsZFtjXSxoK2MpO2JyZWFrO2Nhc2UgXCJwb3BcIjpoPXAtMTtjYXNlIFwic2hpZnRcIjpwJiZsKFwiZGVsZXRlZFwiLGJbaF0saCk7YnJlYWs7Y2FzZSBcInNwbGljZVwiOmM9TWF0aC5taW4oTWF0aC5tYXgoMCwwPmRbMF0/cCtkWzBdOlxuZFswXSkscCk7Zm9yKHZhciBwPTE9PT1nP3A6TWF0aC5taW4oYysoZFsxXXx8MCkscCksZz1jK2ctMixoPU1hdGgubWF4KHAsZyksVT1bXSxMPVtdLG49MjtjPGg7KytjLCsrbiljPHAmJkwucHVzaChsKFwiZGVsZXRlZFwiLGJbY10sYykpLGM8ZyYmVS5wdXNoKGwoXCJhZGRlZFwiLGRbbl0sYykpO2EuYS5LYyhMLFUpO2JyZWFrO2RlZmF1bHQ6cmV0dXJufWY9a319fX07dmFyIHI9YS5hLkRhKFwiX3N0YXRlXCIpO2Eubz1hLiQ9ZnVuY3Rpb24oYixjLGQpe2Z1bmN0aW9uIGUoKXtpZigwPGFyZ3VtZW50cy5sZW5ndGgpe2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBmKWYuYXBwbHkoZy5uYixhcmd1bWVudHMpO2Vsc2UgdGhyb3cgRXJyb3IoXCJDYW5ub3Qgd3JpdGUgYSB2YWx1ZSB0byBhIGtvLmNvbXB1dGVkIHVubGVzcyB5b3Ugc3BlY2lmeSBhICd3cml0ZScgb3B0aW9uLiBJZiB5b3Ugd2lzaCB0byByZWFkIHRoZSBjdXJyZW50IHZhbHVlLCBkb24ndCBwYXNzIGFueSBwYXJhbWV0ZXJzLlwiKTtyZXR1cm4gdGhpc31nLnJhfHxcbmEudS5jYyhlKTsoZy5rYXx8Zy5KJiZlLlhhKCkpJiZlLmhhKCk7cmV0dXJuIGcuWH1cIm9iamVjdFwiPT09dHlwZW9mIGI/ZD1iOihkPWR8fHt9LGImJihkLnJlYWQ9YikpO2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIGQucmVhZCl0aHJvdyBFcnJvcihcIlBhc3MgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBrby5jb21wdXRlZFwiKTt2YXIgZj1kLndyaXRlLGc9e1g6bixzYTohMCxrYTohMCxyYjohMSxqYzohMSxyYTohMSx3YjohMSxKOiExLFdjOmQucmVhZCxuYjpjfHxkLm93bmVyLGw6ZC5kaXNwb3NlV2hlbk5vZGVJc1JlbW92ZWR8fGQubHx8bnVsbCxTYTpkLmRpc3Bvc2VXaGVufHxkLlNhLFJiOm51bGwsSTp7fSxWOjAsSWM6bnVsbH07ZVtyXT1nO2UuTmM9XCJmdW5jdGlvblwiPT09dHlwZW9mIGY7YS5hLkJhfHxhLmEuZXh0ZW5kKGUsYS5ULmZuKTthLlQuZm4ucWIoZSk7YS5hLkFiKGUsQyk7ZC5wdXJlPyhnLndiPSEwLGcuSj0hMCxhLmEuZXh0ZW5kKGUsZGEpKTpcbmQuZGVmZXJFdmFsdWF0aW9uJiZhLmEuZXh0ZW5kKGUsZWEpO2Eub3B0aW9ucy5kZWZlclVwZGF0ZXMmJmEuVGEuZGVmZXJyZWQoZSwhMCk7Zy5sJiYoZy5qYz0hMCxnLmwubm9kZVR5cGV8fChnLmw9bnVsbCkpO2cuSnx8ZC5kZWZlckV2YWx1YXRpb258fGUuaGEoKTtnLmwmJmUuamEoKSYmYS5hLksuemEoZy5sLGcuUmI9ZnVuY3Rpb24oKXtlLnMoKX0pO3JldHVybiBlfTt2YXIgQz17ZXF1YWxpdHlDb21wYXJlcjpLLHFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbcl0uVn0sVmE6ZnVuY3Rpb24oKXt2YXIgYj1bXTthLmEuUCh0aGlzW3JdLkksZnVuY3Rpb24oYSxkKXtiW2QuS2FdPWQuZGF9KTtyZXR1cm4gYn0sVmI6ZnVuY3Rpb24oYil7aWYoIXRoaXNbcl0uVilyZXR1cm4hMTt2YXIgYz10aGlzLlZhKCk7cmV0dXJuLTEhPT1hLmEuQShjLGIpPyEwOiEhYS5hLkxiKGMsZnVuY3Rpb24oYSl7cmV0dXJuIGEuVmImJmEuVmIoYil9KX0sdWM6ZnVuY3Rpb24oYSxjLGQpe2lmKHRoaXNbcl0ud2ImJlxuYz09PXRoaXMpdGhyb3cgRXJyb3IoXCJBICdwdXJlJyBjb21wdXRlZCBtdXN0IG5vdCBiZSBjYWxsZWQgcmVjdXJzaXZlbHlcIik7dGhpc1tyXS5JW2FdPWQ7ZC5LYT10aGlzW3JdLlYrKztkLkxhPWMub2IoKX0sWGE6ZnVuY3Rpb24oKXt2YXIgYSxjLGQ9dGhpc1tyXS5JO2ZvcihhIGluIGQpaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGQsYSkmJihjPWRbYV0sdGhpcy5JYSYmYy5kYS5KYXx8Yy5kYS5EZChjLkxhKSkpcmV0dXJuITB9LEpkOmZ1bmN0aW9uKCl7dGhpcy5JYSYmIXRoaXNbcl0ucmImJnRoaXMuSWEoITEpfSxqYTpmdW5jdGlvbigpe3ZhciBhPXRoaXNbcl07cmV0dXJuIGEua2F8fDA8YS5WfSxSZDpmdW5jdGlvbigpe3RoaXMuSmE/dGhpc1tyXS5rYSYmKHRoaXNbcl0uc2E9ITApOnRoaXMuSGMoKX0sJGM6ZnVuY3Rpb24oYSl7aWYoYS5IYil7dmFyIGM9YS5zdWJzY3JpYmUodGhpcy5KZCx0aGlzLFwiZGlydHlcIiksZD1hLnN1YnNjcmliZSh0aGlzLlJkLFxudGhpcyk7cmV0dXJue2RhOmEsczpmdW5jdGlvbigpe2MucygpO2QucygpfX19cmV0dXJuIGEuc3Vic2NyaWJlKHRoaXMuSGMsdGhpcyl9LEhjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcyxjPWIudGhyb3R0bGVFdmFsdWF0aW9uO2MmJjA8PWM/KGNsZWFyVGltZW91dCh0aGlzW3JdLkljKSx0aGlzW3JdLkljPWEuYS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yi5oYSghMCl9LGMpKTpiLklhP2IuSWEoITApOmIuaGEoITApfSxoYTpmdW5jdGlvbihiKXt2YXIgYz10aGlzW3JdLGQ9Yy5TYSxlPSExO2lmKCFjLnJiJiYhYy5yYSl7aWYoYy5sJiYhYS5hLlNiKGMubCl8fGQmJmQoKSl7aWYoIWMuamMpe3RoaXMucygpO3JldHVybn19ZWxzZSBjLmpjPSExO2MucmI9ITA7dHJ5e2U9dGhpcy56ZChiKX1maW5hbGx5e2MucmI9ITF9cmV0dXJuIGV9fSx6ZDpmdW5jdGlvbihiKXt2YXIgYz10aGlzW3JdLGQ9ITEsZT1jLndiP246IWMuVixkPXtxZDp0aGlzLG1iOmMuSSxRYjpjLlZ9O2EudS54Yyh7cGQ6ZCxcbm9kOmJhLG86dGhpcyxZYTplfSk7Yy5JPXt9O2MuVj0wO3ZhciBmPXRoaXMueWQoYyxkKTtjLlY/ZD10aGlzLnNiKGMuWCxmKToodGhpcy5zKCksZD0hMCk7ZCYmKGMuSj90aGlzLkdiKCk6dGhpcy5ub3RpZnlTdWJzY3JpYmVycyhjLlgsXCJiZWZvcmVDaGFuZ2VcIiksYy5YPWYsdGhpcy5ub3RpZnlTdWJzY3JpYmVycyhjLlgsXCJzcGVjdGF0ZVwiKSwhYy5KJiZiJiZ0aGlzLm5vdGlmeVN1YnNjcmliZXJzKGMuWCksdGhpcy5yYyYmdGhpcy5yYygpKTtlJiZ0aGlzLm5vdGlmeVN1YnNjcmliZXJzKGMuWCxcImF3YWtlXCIpO3JldHVybiBkfSx5ZDpmdW5jdGlvbihiLGMpe3RyeXt2YXIgZD1iLldjO3JldHVybiBiLm5iP2QuY2FsbChiLm5iKTpkKCl9ZmluYWxseXthLnUuZW5kKCksYy5RYiYmIWIuSiYmYS5hLlAoYy5tYixhYSksYi5zYT1iLmthPSExfX0sdjpmdW5jdGlvbihhKXt2YXIgYz10aGlzW3JdOyhjLmthJiYoYXx8IWMuVil8fGMuSiYmdGhpcy5YYSgpKSYmdGhpcy5oYSgpO3JldHVybiBjLlh9LFxudWI6ZnVuY3Rpb24oYil7YS5ULmZuLnViLmNhbGwodGhpcyxiKTt0aGlzLm5jPWZ1bmN0aW9uKCl7dGhpc1tyXS5KfHwodGhpc1tyXS5zYT90aGlzLmhhKCk6dGhpc1tyXS5rYT0hMSk7cmV0dXJuIHRoaXNbcl0uWH07dGhpcy5JYT1mdW5jdGlvbihhKXt0aGlzLnBjKHRoaXNbcl0uWCk7dGhpc1tyXS5rYT0hMDthJiYodGhpc1tyXS5zYT0hMCk7dGhpcy5xYyh0aGlzLCFhKX19LHM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzW3JdOyFiLkomJmIuSSYmYS5hLlAoYi5JLGZ1bmN0aW9uKGEsYil7Yi5zJiZiLnMoKX0pO2IubCYmYi5SYiYmYS5hLksueWIoYi5sLGIuUmIpO2IuST1uO2IuVj0wO2IucmE9ITA7Yi5zYT0hMTtiLmthPSExO2IuSj0hMTtiLmw9bjtiLlNhPW47Yi5XYz1uO3RoaXMuTmN8fChiLm5iPW4pfX0sZGE9e1FhOmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMsZD1jW3JdO2lmKCFkLnJhJiZkLkomJlwiY2hhbmdlXCI9PWIpe2QuSj0hMTtpZihkLnNhfHxjLlhhKCkpZC5JPW51bGwsZC5WPVxuMCxjLmhhKCkmJmMuR2IoKTtlbHNle3ZhciBlPVtdO2EuYS5QKGQuSSxmdW5jdGlvbihhLGIpe2VbYi5LYV09YX0pO2EuYS5EKGUsZnVuY3Rpb24oYSxiKXt2YXIgZT1kLklbYV0sbT1jLiRjKGUuZGEpO20uS2E9YjttLkxhPWUuTGE7ZC5JW2FdPW19KTtjLlhhKCkmJmMuaGEoKSYmYy5HYigpfWQucmF8fGMubm90aWZ5U3Vic2NyaWJlcnMoZC5YLFwiYXdha2VcIil9fSxoYjpmdW5jdGlvbihiKXt2YXIgYz10aGlzW3JdO2MucmF8fFwiY2hhbmdlXCIhPWJ8fHRoaXMuV2EoXCJjaGFuZ2VcIil8fChhLmEuUChjLkksZnVuY3Rpb24oYSxiKXtiLnMmJihjLklbYV09e2RhOmIuZGEsS2E6Yi5LYSxMYTpiLkxhfSxiLnMoKSl9KSxjLko9ITAsdGhpcy5ub3RpZnlTdWJzY3JpYmVycyhuLFwiYXNsZWVwXCIpKX0sb2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzW3JdO2IuSiYmKGIuc2F8fHRoaXMuWGEoKSkmJnRoaXMuaGEoKTtyZXR1cm4gYS5ULmZuLm9iLmNhbGwodGhpcyl9fSxlYT17UWE6ZnVuY3Rpb24oYSl7XCJjaGFuZ2VcIiE9XG5hJiZcImJlZm9yZUNoYW5nZVwiIT1hfHx0aGlzLnYoKX19O2EuYS5CYSYmYS5hLnNldFByb3RvdHlwZU9mKEMsYS5ULmZuKTt2YXIgTj1hLnRhLk1hO0NbTl09YS5vO2EuT2M9ZnVuY3Rpb24oYSl7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgYSYmYVtOXT09PUNbTl19O2EuRmQ9ZnVuY3Rpb24oYil7cmV0dXJuIGEuT2MoYikmJmJbcl0mJmJbcl0ud2J9O2EuYihcImNvbXB1dGVkXCIsYS5vKTthLmIoXCJkZXBlbmRlbnRPYnNlcnZhYmxlXCIsYS5vKTthLmIoXCJpc0NvbXB1dGVkXCIsYS5PYyk7YS5iKFwiaXNQdXJlQ29tcHV0ZWRcIixhLkZkKTthLmIoXCJjb21wdXRlZC5mblwiLEMpO2EuTChDLFwicGVla1wiLEMudik7YS5MKEMsXCJkaXNwb3NlXCIsQy5zKTthLkwoQyxcImlzQWN0aXZlXCIsQy5qYSk7YS5MKEMsXCJnZXREZXBlbmRlbmNpZXNDb3VudFwiLEMucWEpO2EuTChDLFwiZ2V0RGVwZW5kZW5jaWVzXCIsQy5WYSk7YS54Yj1mdW5jdGlvbihiLGMpe2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBiKXJldHVybiBhLm8oYixcbmMse3B1cmU6ITB9KTtiPWEuYS5leHRlbmQoe30sYik7Yi5wdXJlPSEwO3JldHVybiBhLm8oYixjKX07YS5iKFwicHVyZUNvbXB1dGVkXCIsYS54Yik7KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihhLGYsZyl7Zz1nfHxuZXcgZDthPWYoYSk7aWYoXCJvYmplY3RcIiE9dHlwZW9mIGF8fG51bGw9PT1hfHxhPT09bnx8YSBpbnN0YW5jZW9mIFJlZ0V4cHx8YSBpbnN0YW5jZW9mIERhdGV8fGEgaW5zdGFuY2VvZiBTdHJpbmd8fGEgaW5zdGFuY2VvZiBOdW1iZXJ8fGEgaW5zdGFuY2VvZiBCb29sZWFuKXJldHVybiBhO3ZhciBoPWEgaW5zdGFuY2VvZiBBcnJheT9bXTp7fTtnLnNhdmUoYSxoKTtjKGEsZnVuY3Rpb24oYyl7dmFyIGQ9ZihhW2NdKTtzd2l0Y2godHlwZW9mIGQpe2Nhc2UgXCJib29sZWFuXCI6Y2FzZSBcIm51bWJlclwiOmNhc2UgXCJzdHJpbmdcIjpjYXNlIFwiZnVuY3Rpb25cIjpoW2NdPWQ7YnJlYWs7Y2FzZSBcIm9iamVjdFwiOmNhc2UgXCJ1bmRlZmluZWRcIjp2YXIgbD1nLmdldChkKTtoW2NdPWwhPT1cbm4/bDpiKGQsZixnKX19KTtyZXR1cm4gaH1mdW5jdGlvbiBjKGEsYil7aWYoYSBpbnN0YW5jZW9mIEFycmF5KXtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliKGMpO1wiZnVuY3Rpb25cIj09dHlwZW9mIGEudG9KU09OJiZiKFwidG9KU09OXCIpfWVsc2UgZm9yKGMgaW4gYSliKGMpfWZ1bmN0aW9uIGQoKXt0aGlzLmtleXM9W107dGhpcy52YWx1ZXM9W119YS5hZD1mdW5jdGlvbihjKXtpZigwPT1hcmd1bWVudHMubGVuZ3RoKXRocm93IEVycm9yKFwiV2hlbiBjYWxsaW5nIGtvLnRvSlMsIHBhc3MgdGhlIG9iamVjdCB5b3Ugd2FudCB0byBjb252ZXJ0LlwiKTtyZXR1cm4gYihjLGZ1bmN0aW9uKGIpe2Zvcih2YXIgYz0wO2EuTyhiKSYmMTA+YztjKyspYj1iKCk7cmV0dXJuIGJ9KX07YS50b0pTT049ZnVuY3Rpb24oYixjLGQpe2I9YS5hZChiKTtyZXR1cm4gYS5hLmhjKGIsYyxkKX07ZC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmQsc2F2ZTpmdW5jdGlvbihiLGMpe3ZhciBkPWEuYS5BKHRoaXMua2V5cyxcbmIpOzA8PWQ/dGhpcy52YWx1ZXNbZF09YzoodGhpcy5rZXlzLnB1c2goYiksdGhpcy52YWx1ZXMucHVzaChjKSl9LGdldDpmdW5jdGlvbihiKXtiPWEuYS5BKHRoaXMua2V5cyxiKTtyZXR1cm4gMDw9Yj90aGlzLnZhbHVlc1tiXTpufX19KSgpO2EuYihcInRvSlNcIixhLmFkKTthLmIoXCJ0b0pTT05cIixhLnRvSlNPTik7YS5XZD1mdW5jdGlvbihiLGMsZCl7ZnVuY3Rpb24gZShjKXt2YXIgZT1hLnhiKGIsZCkuZXh0ZW5kKHttYTpcImFsd2F5c1wifSksaD1lLnN1YnNjcmliZShmdW5jdGlvbihhKXthJiYoaC5zKCksYyhhKSl9KTtlLm5vdGlmeVN1YnNjcmliZXJzKGUudigpKTtyZXR1cm4gaH1yZXR1cm5cImZ1bmN0aW9uXCIhPT10eXBlb2YgUHJvbWlzZXx8Yz9lKGMuYmluZChkKSk6bmV3IFByb21pc2UoZSl9O2EuYihcIndoZW5cIixhLldkKTsoZnVuY3Rpb24oKXthLnc9e006ZnVuY3Rpb24oYil7c3dpdGNoKGEuYS5SKGIpKXtjYXNlIFwib3B0aW9uXCI6cmV0dXJuITA9PT1iLl9fa29fX2hhc0RvbURhdGFPcHRpb25WYWx1ZV9fP1xuYS5hLmcuZ2V0KGIsYS5jLm9wdGlvbnMuJGIpOjc+PWEuYS5XP2IuZ2V0QXR0cmlidXRlTm9kZShcInZhbHVlXCIpJiZiLmdldEF0dHJpYnV0ZU5vZGUoXCJ2YWx1ZVwiKS5zcGVjaWZpZWQ/Yi52YWx1ZTpiLnRleHQ6Yi52YWx1ZTtjYXNlIFwic2VsZWN0XCI6cmV0dXJuIDA8PWIuc2VsZWN0ZWRJbmRleD9hLncuTShiLm9wdGlvbnNbYi5zZWxlY3RlZEluZGV4XSk6bjtkZWZhdWx0OnJldHVybiBiLnZhbHVlfX0sY2I6ZnVuY3Rpb24oYixjLGQpe3N3aXRjaChhLmEuUihiKSl7Y2FzZSBcIm9wdGlvblwiOlwic3RyaW5nXCI9PT10eXBlb2YgYz8oYS5hLmcuc2V0KGIsYS5jLm9wdGlvbnMuJGIsbiksXCJfX2tvX19oYXNEb21EYXRhT3B0aW9uVmFsdWVfX1wiaW4gYiYmZGVsZXRlIGIuX19rb19faGFzRG9tRGF0YU9wdGlvblZhbHVlX18sYi52YWx1ZT1jKTooYS5hLmcuc2V0KGIsYS5jLm9wdGlvbnMuJGIsYyksYi5fX2tvX19oYXNEb21EYXRhT3B0aW9uVmFsdWVfXz0hMCxiLnZhbHVlPVwibnVtYmVyXCI9PT1cbnR5cGVvZiBjP2M6XCJcIik7YnJlYWs7Y2FzZSBcInNlbGVjdFwiOmlmKFwiXCI9PT1jfHxudWxsPT09YyljPW47Zm9yKHZhciBlPS0xLGY9MCxnPWIub3B0aW9ucy5sZW5ndGgsaDtmPGc7KytmKWlmKGg9YS53Lk0oYi5vcHRpb25zW2ZdKSxoPT1jfHxcIlwiPT09aCYmYz09PW4pe2U9ZjticmVha31pZihkfHwwPD1lfHxjPT09biYmMTxiLnNpemUpYi5zZWxlY3RlZEluZGV4PWUsNj09PWEuYS5XJiZhLmEuc2V0VGltZW91dChmdW5jdGlvbigpe2Iuc2VsZWN0ZWRJbmRleD1lfSwwKTticmVhaztkZWZhdWx0OmlmKG51bGw9PT1jfHxjPT09biljPVwiXCI7Yi52YWx1ZT1jfX19fSkoKTthLmIoXCJzZWxlY3RFeHRlbnNpb25zXCIsYS53KTthLmIoXCJzZWxlY3RFeHRlbnNpb25zLnJlYWRWYWx1ZVwiLGEudy5NKTthLmIoXCJzZWxlY3RFeHRlbnNpb25zLndyaXRlVmFsdWVcIixhLncuY2IpO2EubT1mdW5jdGlvbigpe2Z1bmN0aW9uIGIoYil7Yj1hLmEuRGIoYik7MTIzPT09Yi5jaGFyQ29kZUF0KDApJiYoYj1iLnNsaWNlKDEsXG4tMSkpO2IrPVwiXFxuLFwiO3ZhciBjPVtdLGQ9Yi5tYXRjaChlKSxwLHE9W10saD0wO2lmKDE8ZC5sZW5ndGgpe2Zvcih2YXIgeD0wLEI7Qj1kW3hdOysreCl7dmFyIHU9Qi5jaGFyQ29kZUF0KDApO2lmKDQ0PT09dSl7aWYoMD49aCl7Yy5wdXNoKHAmJnEubGVuZ3RoP3trZXk6cCx2YWx1ZTpxLmpvaW4oXCJcIil9Ont1bmtub3duOnB8fHEuam9pbihcIlwiKX0pO3A9aD0wO3E9W107Y29udGludWV9fWVsc2UgaWYoNTg9PT11KXtpZighaCYmIXAmJjE9PT1xLmxlbmd0aCl7cD1xLnBvcCgpO2NvbnRpbnVlfX1lbHNlIGlmKDQ3PT09dSYmMTxCLmxlbmd0aCYmKDQ3PT09Qi5jaGFyQ29kZUF0KDEpfHw0Mj09PUIuY2hhckNvZGVBdCgxKSkpY29udGludWU7ZWxzZSA0Nz09PXUmJngmJjE8Qi5sZW5ndGg/KHU9ZFt4LTFdLm1hdGNoKGYpKSYmIWdbdVswXV0mJihiPWIuc3Vic3RyKGIuaW5kZXhPZihCKSsxKSxkPWIubWF0Y2goZSkseD0tMSxCPVwiL1wiKTo0MD09PXV8fDEyMz09PXV8fDkxPT09dT8rK2g6XG40MT09PXV8fDEyNT09PXV8fDkzPT09dT8tLWg6cHx8cS5sZW5ndGh8fDM0IT09dSYmMzkhPT11fHwoQj1CLnNsaWNlKDEsLTEpKTtxLnB1c2goQil9aWYoMDxoKXRocm93IEVycm9yKFwiVW5iYWxhbmNlZCBwYXJlbnRoZXNlcywgYnJhY2VzLCBvciBicmFja2V0c1wiKTt9cmV0dXJuIGN9dmFyIGM9W1widHJ1ZVwiLFwiZmFsc2VcIixcIm51bGxcIixcInVuZGVmaW5lZFwiXSxkPS9eKD86WyRfYS16XVskXFx3XSp8KC4rKShcXC5cXHMqWyRfYS16XVskXFx3XSp8XFxbLitcXF0pKSQvaSxlPVJlZ0V4cChcIlxcXCIoPzpcXFxcXFxcXC58W15cXFwiXSkqXFxcInwnKD86XFxcXFxcXFwufFteJ10pKid8YCg/OlxcXFxcXFxcLnxbXmBdKSpgfC9cXFxcKig/OlteKl18XFxcXCorW14qL10pKlxcXFwqKy98Ly8uKlxcbnwvKD86XFxcXFxcXFwufFteL10pKy93KnxbXlxcXFxzOiwvXVteLFxcXCInYHt9KCkvOltcXFxcXV0qW15cXFxccyxcXFwiJ2B7fSgpLzpbXFxcXF1dfFteXFxcXHNdXCIsXCJnXCIpLGY9L1tcXF0pXCInQS1aYS16MC05XyRdKyQvLGc9e1wiaW5cIjoxLFwicmV0dXJuXCI6MSxcInR5cGVvZlwiOjF9LFxuaD17fTtyZXR1cm57UmE6W10sd2E6aCxhYzpiLHZiOmZ1bmN0aW9uKGUsZil7ZnVuY3Rpb24gbChiLGUpe3ZhciBmO2lmKCF4KXt2YXIgaz1hLmdldEJpbmRpbmdIYW5kbGVyKGIpO2lmKGsmJmsucHJlcHJvY2VzcyYmIShlPWsucHJlcHJvY2VzcyhlLGIsbCkpKXJldHVybjtpZihrPWhbYl0pZj1lLDA8PWEuYS5BKGMsZik/Zj0hMTooaz1mLm1hdGNoKGQpLGY9bnVsbD09PWs/ITE6a1sxXT9cIk9iamVjdChcIitrWzFdK1wiKVwiK2tbMl06Ziksaz1mO2smJnEucHVzaChcIidcIisoXCJzdHJpbmdcIj09dHlwZW9mIGhbYl0/aFtiXTpiKStcIic6ZnVuY3Rpb24oX3ope1wiK2YrXCI9X3p9XCIpfWcmJihlPVwiZnVuY3Rpb24oKXtyZXR1cm4gXCIrZStcIiB9XCIpO3AucHVzaChcIidcIitiK1wiJzpcIitlKX1mPWZ8fHt9O3ZhciBwPVtdLHE9W10sZz1mLnZhbHVlQWNjZXNzb3JzLHg9Zi5iaW5kaW5nUGFyYW1zLEI9XCJzdHJpbmdcIj09PXR5cGVvZiBlP2IoZSk6ZTthLmEuRChCLGZ1bmN0aW9uKGEpe2woYS5rZXl8fGEudW5rbm93bixcbmEudmFsdWUpfSk7cS5sZW5ndGgmJmwoXCJfa29fcHJvcGVydHlfd3JpdGVyc1wiLFwie1wiK3Euam9pbihcIixcIikrXCIgfVwiKTtyZXR1cm4gcC5qb2luKFwiLFwiKX0sSWQ6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylpZihhW2NdLmtleT09YilyZXR1cm4hMDtyZXR1cm4hMX0sZWI6ZnVuY3Rpb24oYixjLGQsZSxmKXtpZihiJiZhLk8oYikpIWEuWmEoYil8fGYmJmIudigpPT09ZXx8YihlKTtlbHNlIGlmKChiPWMuZ2V0KFwiX2tvX3Byb3BlcnR5X3dyaXRlcnNcIikpJiZiW2RdKWJbZF0oZSl9fX0oKTthLmIoXCJleHByZXNzaW9uUmV3cml0aW5nXCIsYS5tKTthLmIoXCJleHByZXNzaW9uUmV3cml0aW5nLmJpbmRpbmdSZXdyaXRlVmFsaWRhdG9yc1wiLGEubS5SYSk7YS5iKFwiZXhwcmVzc2lvblJld3JpdGluZy5wYXJzZU9iamVjdExpdGVyYWxcIixhLm0uYWMpO2EuYihcImV4cHJlc3Npb25SZXdyaXRpbmcucHJlUHJvY2Vzc0JpbmRpbmdzXCIsYS5tLnZiKTthLmIoXCJleHByZXNzaW9uUmV3cml0aW5nLl90d29XYXlCaW5kaW5nc1wiLFxuYS5tLndhKTthLmIoXCJqc29uRXhwcmVzc2lvblJld3JpdGluZ1wiLGEubSk7YS5iKFwianNvbkV4cHJlc3Npb25SZXdyaXRpbmcuaW5zZXJ0UHJvcGVydHlBY2Nlc3NvcnNJbnRvSnNvblwiLGEubS52Yik7KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihhKXtyZXR1cm4gOD09YS5ub2RlVHlwZSYmZy50ZXN0KGY/YS50ZXh0OmEubm9kZVZhbHVlKX1mdW5jdGlvbiBjKGEpe3JldHVybiA4PT1hLm5vZGVUeXBlJiZoLnRlc3QoZj9hLnRleHQ6YS5ub2RlVmFsdWUpfWZ1bmN0aW9uIGQoZCxlKXtmb3IodmFyIGY9ZCxoPTEsZz1bXTtmPWYubmV4dFNpYmxpbmc7KXtpZihjKGYpJiYoYS5hLmcuc2V0KGYsaywhMCksaC0tLDA9PT1oKSlyZXR1cm4gZztnLnB1c2goZik7YihmKSYmaCsrfWlmKCFlKXRocm93IEVycm9yKFwiQ2Fubm90IGZpbmQgY2xvc2luZyBjb21tZW50IHRhZyB0byBtYXRjaDogXCIrZC5ub2RlVmFsdWUpO3JldHVybiBudWxsfWZ1bmN0aW9uIGUoYSxiKXt2YXIgYz1kKGEsYik7cmV0dXJuIGM/XG4wPGMubGVuZ3RoP2NbYy5sZW5ndGgtMV0ubmV4dFNpYmxpbmc6YS5uZXh0U2libGluZzpudWxsfXZhciBmPXcmJlwiXFx4M2MhLS10ZXN0LS1cXHgzZVwiPT09dy5jcmVhdGVDb21tZW50KFwidGVzdFwiKS50ZXh0LGc9Zj8vXlxceDNjIS0tXFxzKmtvKD86XFxzKyhbXFxzXFxTXSspKT9cXHMqLS1cXHgzZSQvOi9eXFxzKmtvKD86XFxzKyhbXFxzXFxTXSspKT9cXHMqJC8saD1mPy9eXFx4M2MhLS1cXHMqXFwva29cXHMqLS1cXHgzZSQvOi9eXFxzKlxcL2tvXFxzKiQvLG09e3VsOiEwLG9sOiEwfSxrPVwiX19rb19tYXRjaGVkRW5kQ29tbWVudF9fXCI7YS5oPXtlYTp7fSxjaGlsZE5vZGVzOmZ1bmN0aW9uKGEpe3JldHVybiBiKGEpP2QoYSk6YS5jaGlsZE5vZGVzfSxFYTpmdW5jdGlvbihjKXtpZihiKGMpKXtjPWEuaC5jaGlsZE5vZGVzKGMpO2Zvcih2YXIgZD0wLGU9Yy5sZW5ndGg7ZDxlO2QrKylhLnJlbW92ZU5vZGUoY1tkXSl9ZWxzZSBhLmEuVGIoYyl9LHZhOmZ1bmN0aW9uKGMsZCl7aWYoYihjKSl7YS5oLkVhKGMpO2Zvcih2YXIgZT1cbmMubmV4dFNpYmxpbmcsZj0wLGs9ZC5sZW5ndGg7ZjxrO2YrKyllLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRbZl0sZSl9ZWxzZSBhLmEudmEoYyxkKX0sVmM6ZnVuY3Rpb24oYSxjKXt2YXIgZDtiKGEpPyhkPWEubmV4dFNpYmxpbmcsYT1hLnBhcmVudE5vZGUpOmQ9YS5maXJzdENoaWxkO2Q/YyE9PWQmJmEuaW5zZXJ0QmVmb3JlKGMsZCk6YS5hcHBlbmRDaGlsZChjKX0sV2I6ZnVuY3Rpb24oYyxkLGUpe2U/KGU9ZS5uZXh0U2libGluZyxiKGMpJiYoYz1jLnBhcmVudE5vZGUpLGU/ZCE9PWUmJmMuaW5zZXJ0QmVmb3JlKGQsZSk6Yy5hcHBlbmRDaGlsZChkKSk6YS5oLlZjKGMsZCl9LGZpcnN0Q2hpbGQ6ZnVuY3Rpb24oYSl7aWYoYihhKSlyZXR1cm4hYS5uZXh0U2libGluZ3x8YyhhLm5leHRTaWJsaW5nKT9udWxsOmEubmV4dFNpYmxpbmc7aWYoYS5maXJzdENoaWxkJiZjKGEuZmlyc3RDaGlsZCkpdGhyb3cgRXJyb3IoXCJGb3VuZCBpbnZhbGlkIGVuZCBjb21tZW50LCBhcyB0aGUgZmlyc3QgY2hpbGQgb2YgXCIrXG5hKTtyZXR1cm4gYS5maXJzdENoaWxkfSxuZXh0U2libGluZzpmdW5jdGlvbihkKXtiKGQpJiYoZD1lKGQpKTtpZihkLm5leHRTaWJsaW5nJiZjKGQubmV4dFNpYmxpbmcpKXt2YXIgZj1kLm5leHRTaWJsaW5nO2lmKGMoZikmJiFhLmEuZy5nZXQoZixrKSl0aHJvdyBFcnJvcihcIkZvdW5kIGVuZCBjb21tZW50IHdpdGhvdXQgYSBtYXRjaGluZyBvcGVuaW5nIGNvbW1lbnQsIGFzIGNoaWxkIG9mIFwiK2QpO3JldHVybiBudWxsfXJldHVybiBkLm5leHRTaWJsaW5nfSxDZDpiLFZkOmZ1bmN0aW9uKGEpe3JldHVybihhPShmP2EudGV4dDphLm5vZGVWYWx1ZSkubWF0Y2goZykpP2FbMV06bnVsbH0sU2M6ZnVuY3Rpb24oZCl7aWYobVthLmEuUihkKV0pe3ZhciBmPWQuZmlyc3RDaGlsZDtpZihmKXtkbyBpZigxPT09Zi5ub2RlVHlwZSl7dmFyIGs7az1mLmZpcnN0Q2hpbGQ7dmFyIGg9bnVsbDtpZihrKXtkbyBpZihoKWgucHVzaChrKTtlbHNlIGlmKGIoaykpe3ZhciBnPWUoaywhMCk7Zz9rPVxuZzpoPVtrXX1lbHNlIGMoaykmJihoPVtrXSk7d2hpbGUoaz1rLm5leHRTaWJsaW5nKX1pZihrPWgpZm9yKGg9Zi5uZXh0U2libGluZyxnPTA7ZzxrLmxlbmd0aDtnKyspaD9kLmluc2VydEJlZm9yZShrW2ddLGgpOmQuYXBwZW5kQ2hpbGQoa1tnXSl9d2hpbGUoZj1mLm5leHRTaWJsaW5nKX19fX19KSgpO2EuYihcInZpcnR1YWxFbGVtZW50c1wiLGEuaCk7YS5iKFwidmlydHVhbEVsZW1lbnRzLmFsbG93ZWRCaW5kaW5nc1wiLGEuaC5lYSk7YS5iKFwidmlydHVhbEVsZW1lbnRzLmVtcHR5Tm9kZVwiLGEuaC5FYSk7YS5iKFwidmlydHVhbEVsZW1lbnRzLmluc2VydEFmdGVyXCIsYS5oLldiKTthLmIoXCJ2aXJ0dWFsRWxlbWVudHMucHJlcGVuZFwiLGEuaC5WYyk7YS5iKFwidmlydHVhbEVsZW1lbnRzLnNldERvbU5vZGVDaGlsZHJlblwiLGEuaC52YSk7KGZ1bmN0aW9uKCl7YS5nYT1mdW5jdGlvbigpe3RoaXMubmQ9e319O2EuYS5leHRlbmQoYS5nYS5wcm90b3R5cGUse25vZGVIYXNCaW5kaW5nczpmdW5jdGlvbihiKXtzd2l0Y2goYi5ub2RlVHlwZSl7Y2FzZSAxOnJldHVybiBudWxsIT1cbmIuZ2V0QXR0cmlidXRlKFwiZGF0YS1iaW5kXCIpfHxhLmouZ2V0Q29tcG9uZW50TmFtZUZvck5vZGUoYik7Y2FzZSA4OnJldHVybiBhLmguQ2QoYik7ZGVmYXVsdDpyZXR1cm4hMX19LGdldEJpbmRpbmdzOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9dGhpcy5nZXRCaW5kaW5nc1N0cmluZyhiLGMpLGQ9ZD90aGlzLnBhcnNlQmluZGluZ3NTdHJpbmcoZCxjLGIpOm51bGw7cmV0dXJuIGEuai50YyhkLGIsYywhMSl9LGdldEJpbmRpbmdBY2Nlc3NvcnM6ZnVuY3Rpb24oYixjKXt2YXIgZD10aGlzLmdldEJpbmRpbmdzU3RyaW5nKGIsYyksZD1kP3RoaXMucGFyc2VCaW5kaW5nc1N0cmluZyhkLGMsYix7dmFsdWVBY2Nlc3NvcnM6ITB9KTpudWxsO3JldHVybiBhLmoudGMoZCxiLGMsITApfSxnZXRCaW5kaW5nc1N0cmluZzpmdW5jdGlvbihiKXtzd2l0Y2goYi5ub2RlVHlwZSl7Y2FzZSAxOnJldHVybiBiLmdldEF0dHJpYnV0ZShcImRhdGEtYmluZFwiKTtjYXNlIDg6cmV0dXJuIGEuaC5WZChiKTtkZWZhdWx0OnJldHVybiBudWxsfX0sXG5wYXJzZUJpbmRpbmdzU3RyaW5nOmZ1bmN0aW9uKGIsYyxkLGUpe3RyeXt2YXIgZj10aGlzLm5kLGc9YisoZSYmZS52YWx1ZUFjY2Vzc29yc3x8XCJcIiksaDtpZighKGg9ZltnXSkpe3ZhciBtLGs9XCJ3aXRoKCRjb250ZXh0KXt3aXRoKCRkYXRhfHx7fSl7cmV0dXJue1wiK2EubS52YihiLGUpK1wifX19XCI7bT1uZXcgRnVuY3Rpb24oXCIkY29udGV4dFwiLFwiJGVsZW1lbnRcIixrKTtoPWZbZ109bX1yZXR1cm4gaChjLGQpfWNhdGNoKGwpe3Rocm93IGwubWVzc2FnZT1cIlVuYWJsZSB0byBwYXJzZSBiaW5kaW5ncy5cXG5CaW5kaW5ncyB2YWx1ZTogXCIrYitcIlxcbk1lc3NhZ2U6IFwiK2wubWVzc2FnZSxsO319fSk7YS5nYS5pbnN0YW5jZT1uZXcgYS5nYX0pKCk7YS5iKFwiYmluZGluZ1Byb3ZpZGVyXCIsYS5nYSk7KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiKXt2YXIgYz0oYj1hLmEuZy5nZXQoYix6KSkmJmIuTjtjJiYoYi5OPW51bGwsYy5UYygpKX1mdW5jdGlvbiBjKGMsZCxlKXt0aGlzLm5vZGU9Yzt0aGlzLnljPVxuZDt0aGlzLmtiPVtdO3RoaXMuSD0hMTtkLk58fGEuYS5LLnphKGMsYik7ZSYmZS5OJiYoZS5OLmtiLnB1c2goYyksdGhpcy5LYj1lKX1mdW5jdGlvbiBkKGEpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBhfX1mdW5jdGlvbiBlKGEpe3JldHVybiBhKCl9ZnVuY3Rpb24gZihiKXtyZXR1cm4gYS5hLkdhKGEudS5HKGIpLGZ1bmN0aW9uKGEsYyl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGIoKVtjXX19KX1mdW5jdGlvbiBnKGIsYyxlKXtyZXR1cm5cImZ1bmN0aW9uXCI9PT10eXBlb2YgYj9mKGIuYmluZChudWxsLGMsZSkpOmEuYS5HYShiLGQpfWZ1bmN0aW9uIGgoYSxiKXtyZXR1cm4gZih0aGlzLmdldEJpbmRpbmdzLmJpbmQodGhpcyxhLGIpKX1mdW5jdGlvbiBtKGIsYyl7dmFyIGQ9YS5oLmZpcnN0Q2hpbGQoYyk7aWYoZCl7dmFyIGUsZj1hLmdhLmluc3RhbmNlLGw9Zi5wcmVwcm9jZXNzTm9kZTtpZihsKXtmb3IoO2U9ZDspZD1hLmgubmV4dFNpYmxpbmcoZSksbC5jYWxsKGYsZSk7XG5kPWEuaC5maXJzdENoaWxkKGMpfWZvcig7ZT1kOylkPWEuaC5uZXh0U2libGluZyhlKSxrKGIsZSl9YS5pLm1hKGMsYS5pLkgpfWZ1bmN0aW9uIGsoYixjKXt2YXIgZD1iLGU9MT09PWMubm9kZVR5cGU7ZSYmYS5oLlNjKGMpO2lmKGV8fGEuZ2EuaW5zdGFuY2Uubm9kZUhhc0JpbmRpbmdzKGMpKWQ9cChjLG51bGwsYikuYmluZGluZ0NvbnRleHRGb3JEZXNjZW5kYW50cztkJiYhdVthLmEuUihjKV0mJm0oZCxjKX1mdW5jdGlvbiBsKGIpe3ZhciBjPVtdLGQ9e30sZT1bXTthLmEuUChiLGZ1bmN0aW9uIGNhKGYpe2lmKCFkW2ZdKXt2YXIgaz1hLmdldEJpbmRpbmdIYW5kbGVyKGYpO2smJihrLmFmdGVyJiYoZS5wdXNoKGYpLGEuYS5EKGsuYWZ0ZXIsZnVuY3Rpb24oYyl7aWYoYltjXSl7aWYoLTEhPT1hLmEuQShlLGMpKXRocm93IEVycm9yKFwiQ2Fubm90IGNvbWJpbmUgdGhlIGZvbGxvd2luZyBiaW5kaW5ncywgYmVjYXVzZSB0aGV5IGhhdmUgYSBjeWNsaWMgZGVwZW5kZW5jeTogXCIrZS5qb2luKFwiLCBcIikpO1xuY2EoYyl9fSksZS5sZW5ndGgtLSksYy5wdXNoKHtrZXk6ZixNYzprfSkpO2RbZl09ITB9fSk7cmV0dXJuIGN9ZnVuY3Rpb24gcChiLGMsZCl7dmFyIGY9YS5hLmcuVWIoYix6LHt9KSxrPWYuaGQ7aWYoIWMpe2lmKGspdGhyb3cgRXJyb3IoXCJZb3UgY2Fubm90IGFwcGx5IGJpbmRpbmdzIG11bHRpcGxlIHRpbWVzIHRvIHRoZSBzYW1lIGVsZW1lbnQuXCIpO2YuaGQ9ITB9a3x8KGYuY29udGV4dD1kKTtmLlpifHwoZi5aYj17fSk7dmFyIGc7aWYoYyYmXCJmdW5jdGlvblwiIT09dHlwZW9mIGMpZz1jO2Vsc2V7dmFyIHA9YS5nYS5pbnN0YW5jZSxxPXAuZ2V0QmluZGluZ0FjY2Vzc29yc3x8aCxtPWEuJChmdW5jdGlvbigpe2lmKGc9Yz9jKGQsYik6cS5jYWxsKHAsYixkKSl7aWYoZFt0XSlkW3RdKCk7aWYoZFtCXSlkW0JdKCl9cmV0dXJuIGd9LG51bGwse2w6Yn0pO2cmJm0uamEoKXx8KG09bnVsbCl9dmFyIHg9ZCx1O2lmKGcpe3ZhciBKPWZ1bmN0aW9uKCl7cmV0dXJuIGEuYS5HYShtP20oKTpcbmcsZSl9LHI9bT9mdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZShtKClbYV0pfX06ZnVuY3Rpb24oYSl7cmV0dXJuIGdbYV19O0ouZ2V0PWZ1bmN0aW9uKGEpe3JldHVybiBnW2FdJiZlKHIoYSkpfTtKLmhhcz1mdW5jdGlvbihhKXtyZXR1cm4gYSBpbiBnfTthLmkuSCBpbiBnJiZhLmkuc3Vic2NyaWJlKGIsYS5pLkgsZnVuY3Rpb24oKXt2YXIgYz0oMCxnW2EuaS5IXSkoKTtpZihjKXt2YXIgZD1hLmguY2hpbGROb2RlcyhiKTtkLmxlbmd0aCYmYyhkLGEuRWMoZFswXSkpfX0pO2EuaS5wYSBpbiBnJiYoeD1hLmkuQ2IoYixkKSxhLmkuc3Vic2NyaWJlKGIsYS5pLnBhLGZ1bmN0aW9uKCl7dmFyIGM9KDAsZ1thLmkucGFdKSgpO2MmJmEuaC5maXJzdENoaWxkKGIpJiZjKGIpfSkpO2Y9bChnKTthLmEuRChmLGZ1bmN0aW9uKGMpe3ZhciBkPWMuTWMuaW5pdCxlPWMuTWMudXBkYXRlLGY9Yy5rZXk7aWYoOD09PWIubm9kZVR5cGUmJiFhLmguZWFbZl0pdGhyb3cgRXJyb3IoXCJUaGUgYmluZGluZyAnXCIrXG5mK1wiJyBjYW5ub3QgYmUgdXNlZCB3aXRoIHZpcnR1YWwgZWxlbWVudHNcIik7dHJ5e1wiZnVuY3Rpb25cIj09dHlwZW9mIGQmJmEudS5HKGZ1bmN0aW9uKCl7dmFyIGE9ZChiLHIoZiksSix4LiRkYXRhLHgpO2lmKGEmJmEuY29udHJvbHNEZXNjZW5kYW50QmluZGluZ3Mpe2lmKHUhPT1uKXRocm93IEVycm9yKFwiTXVsdGlwbGUgYmluZGluZ3MgKFwiK3UrXCIgYW5kIFwiK2YrXCIpIGFyZSB0cnlpbmcgdG8gY29udHJvbCBkZXNjZW5kYW50IGJpbmRpbmdzIG9mIHRoZSBzYW1lIGVsZW1lbnQuIFlvdSBjYW5ub3QgdXNlIHRoZXNlIGJpbmRpbmdzIHRvZ2V0aGVyIG9uIHRoZSBzYW1lIGVsZW1lbnQuXCIpO3U9Zn19KSxcImZ1bmN0aW9uXCI9PXR5cGVvZiBlJiZhLiQoZnVuY3Rpb24oKXtlKGIscihmKSxKLHguJGRhdGEseCl9LG51bGwse2w6Yn0pfWNhdGNoKGspe3Rocm93IGsubWVzc2FnZT0nVW5hYmxlIHRvIHByb2Nlc3MgYmluZGluZyBcIicrZitcIjogXCIrZ1tmXSsnXCJcXG5NZXNzYWdlOiAnK2subWVzc2FnZSxcbms7fX0pfWY9dT09PW47cmV0dXJue3Nob3VsZEJpbmREZXNjZW5kYW50czpmLGJpbmRpbmdDb250ZXh0Rm9yRGVzY2VuZGFudHM6ZiYmeH19ZnVuY3Rpb24gcShiLGMpe3JldHVybiBiJiZiIGluc3RhbmNlb2YgYS5mYT9iOm5ldyBhLmZhKGIsbixuLGMpfXZhciB0PWEuYS5EYShcIl9zdWJzY3JpYmFibGVcIikseD1hLmEuRGEoXCJfYW5jZXN0b3JCaW5kaW5nSW5mb1wiKSxCPWEuYS5EYShcIl9kYXRhRGVwZW5kZW5jeVwiKTthLmM9e307dmFyIHU9e3NjcmlwdDohMCx0ZXh0YXJlYTohMCx0ZW1wbGF0ZTohMH07YS5nZXRCaW5kaW5nSGFuZGxlcj1mdW5jdGlvbihiKXtyZXR1cm4gYS5jW2JdfTt2YXIgSj17fTthLmZhPWZ1bmN0aW9uKGIsYyxkLGUsZil7ZnVuY3Rpb24gaygpe3ZhciBiPXA/aCgpOmgsZj1hLmEuZihiKTtjPyhhLmEuZXh0ZW5kKGwsYykseCBpbiBjJiYobFt4XT1jW3hdKSk6KGwuJHBhcmVudHM9W10sbC4kcm9vdD1mLGwua289YSk7bFt0XT1xO2c/Zj1sLiRkYXRhOihsLiRyYXdEYXRhPVxuYixsLiRkYXRhPWYpO2QmJihsW2RdPWYpO2UmJmUobCxjLGYpO2lmKGMmJmNbdF0mJiFhLlMubygpLlZiKGNbdF0pKWNbdF0oKTttJiYobFtCXT1tKTtyZXR1cm4gbC4kZGF0YX12YXIgbD10aGlzLGc9Yj09PUosaD1nP246YixwPVwiZnVuY3Rpb25cIj09dHlwZW9mIGgmJiFhLk8oaCkscSxtPWYmJmYuZGF0YURlcGVuZGVuY3k7ZiYmZi5leHBvcnREZXBlbmRlbmNpZXM/aygpOihxPWEueGIoaykscS52KCkscS5qYSgpP3EuZXF1YWxpdHlDb21wYXJlcj1udWxsOmxbdF09bil9O2EuZmEucHJvdG90eXBlLmNyZWF0ZUNoaWxkQ29udGV4dD1mdW5jdGlvbihiLGMsZCxlKXshZSYmYyYmXCJvYmplY3RcIj09dHlwZW9mIGMmJihlPWMsYz1lLmFzLGQ9ZS5leHRlbmQpO2lmKGMmJmUmJmUubm9DaGlsZENvbnRleHQpe3ZhciBmPVwiZnVuY3Rpb25cIj09dHlwZW9mIGImJiFhLk8oYik7cmV0dXJuIG5ldyBhLmZhKEosdGhpcyxudWxsLGZ1bmN0aW9uKGEpe2QmJmQoYSk7YVtjXT1mP2IoKTpifSxlKX1yZXR1cm4gbmV3IGEuZmEoYixcbnRoaXMsYyxmdW5jdGlvbihhLGIpe2EuJHBhcmVudENvbnRleHQ9YjthLiRwYXJlbnQ9Yi4kZGF0YTthLiRwYXJlbnRzPShiLiRwYXJlbnRzfHxbXSkuc2xpY2UoMCk7YS4kcGFyZW50cy51bnNoaWZ0KGEuJHBhcmVudCk7ZCYmZChhKX0sZSl9O2EuZmEucHJvdG90eXBlLmV4dGVuZD1mdW5jdGlvbihiLGMpe3JldHVybiBuZXcgYS5mYShKLHRoaXMsbnVsbCxmdW5jdGlvbihjKXthLmEuZXh0ZW5kKGMsXCJmdW5jdGlvblwiPT10eXBlb2YgYj9iKGMpOmIpfSxjKX07dmFyIHo9YS5hLmcuWigpO2MucHJvdG90eXBlLlRjPWZ1bmN0aW9uKCl7dGhpcy5LYiYmdGhpcy5LYi5OJiZ0aGlzLktiLk4uc2QodGhpcy5ub2RlKX07Yy5wcm90b3R5cGUuc2Q9ZnVuY3Rpb24oYil7YS5hLlBhKHRoaXMua2IsYik7IXRoaXMua2IubGVuZ3RoJiZ0aGlzLkgmJnRoaXMuQ2MoKX07Yy5wcm90b3R5cGUuQ2M9ZnVuY3Rpb24oKXt0aGlzLkg9ITA7dGhpcy55Yy5OJiYhdGhpcy5rYi5sZW5ndGgmJih0aGlzLnljLk49XG5udWxsLGEuYS5LLnliKHRoaXMubm9kZSxiKSxhLmkubWEodGhpcy5ub2RlLGEuaS5wYSksdGhpcy5UYygpKX07YS5pPXtIOlwiY2hpbGRyZW5Db21wbGV0ZVwiLHBhOlwiZGVzY2VuZGFudHNDb21wbGV0ZVwiLHN1YnNjcmliZTpmdW5jdGlvbihiLGMsZCxlLGYpe3ZhciBrPWEuYS5nLlViKGIseix7fSk7ay5GYXx8KGsuRmE9bmV3IGEuVCk7ZiYmZi5ub3RpZnlJbW1lZGlhdGVseSYmay5aYltjXSYmYS51LkcoZCxlLFtiXSk7cmV0dXJuIGsuRmEuc3Vic2NyaWJlKGQsZSxjKX0sbWE6ZnVuY3Rpb24oYixjKXt2YXIgZD1hLmEuZy5nZXQoYix6KTtpZihkJiYoZC5aYltjXT0hMCxkLkZhJiZkLkZhLm5vdGlmeVN1YnNjcmliZXJzKGIsYyksYz09YS5pLkgpKWlmKGQuTilkLk4uQ2MoKTtlbHNlIGlmKGQuTj09PW4mJmQuRmEmJmQuRmEuV2EoYS5pLnBhKSl0aHJvdyBFcnJvcihcImRlc2NlbmRhbnRzQ29tcGxldGUgZXZlbnQgbm90IHN1cHBvcnRlZCBmb3IgYmluZGluZ3Mgb24gdGhpcyBub2RlXCIpO1xufSxDYjpmdW5jdGlvbihiLGQpe3ZhciBlPWEuYS5nLlViKGIseix7fSk7ZS5OfHwoZS5OPW5ldyBjKGIsZSxkW3hdKSk7cmV0dXJuIGRbeF09PWU/ZDpkLmV4dGVuZChmdW5jdGlvbihhKXthW3hdPWV9KX19O2EuVGQ9ZnVuY3Rpb24oYil7cmV0dXJuKGI9YS5hLmcuZ2V0KGIseikpJiZiLmNvbnRleHR9O2EuaWI9ZnVuY3Rpb24oYixjLGQpezE9PT1iLm5vZGVUeXBlJiZhLmguU2MoYik7cmV0dXJuIHAoYixjLHEoZCkpfTthLmxkPWZ1bmN0aW9uKGIsYyxkKXtkPXEoZCk7cmV0dXJuIGEuaWIoYixnKGMsZCxiKSxkKX07YS5PYT1mdW5jdGlvbihhLGIpezEhPT1iLm5vZGVUeXBlJiY4IT09Yi5ub2RlVHlwZXx8bShxKGEpLGIpfTthLnZjPWZ1bmN0aW9uKGEsYixjKXshdiYmQS5qUXVlcnkmJih2PUEualF1ZXJ5KTtpZigyPmFyZ3VtZW50cy5sZW5ndGgpe2lmKGI9dy5ib2R5LCFiKXRocm93IEVycm9yKFwia28uYXBwbHlCaW5kaW5nczogY291bGQgbm90IGZpbmQgZG9jdW1lbnQuYm9keTsgaGFzIHRoZSBkb2N1bWVudCBiZWVuIGxvYWRlZD9cIik7XG59ZWxzZSBpZighYnx8MSE9PWIubm9kZVR5cGUmJjghPT1iLm5vZGVUeXBlKXRocm93IEVycm9yKFwia28uYXBwbHlCaW5kaW5nczogZmlyc3QgcGFyYW1ldGVyIHNob3VsZCBiZSB5b3VyIHZpZXcgbW9kZWw7IHNlY29uZCBwYXJhbWV0ZXIgc2hvdWxkIGJlIGEgRE9NIG5vZGVcIik7ayhxKGEsYyksYil9O2EuRGM9ZnVuY3Rpb24oYil7cmV0dXJuIWJ8fDEhPT1iLm5vZGVUeXBlJiY4IT09Yi5ub2RlVHlwZT9uOmEuVGQoYil9O2EuRWM9ZnVuY3Rpb24oYil7cmV0dXJuKGI9YS5EYyhiKSk/Yi4kZGF0YTpufTthLmIoXCJiaW5kaW5nSGFuZGxlcnNcIixhLmMpO2EuYihcImJpbmRpbmdFdmVudFwiLGEuaSk7YS5iKFwiYmluZGluZ0V2ZW50LnN1YnNjcmliZVwiLGEuaS5zdWJzY3JpYmUpO2EuYihcImJpbmRpbmdFdmVudC5zdGFydFBvc3NpYmx5QXN5bmNDb250ZW50QmluZGluZ1wiLGEuaS5DYik7YS5iKFwiYXBwbHlCaW5kaW5nc1wiLGEudmMpO2EuYihcImFwcGx5QmluZGluZ3NUb0Rlc2NlbmRhbnRzXCIsYS5PYSk7XG5hLmIoXCJhcHBseUJpbmRpbmdBY2Nlc3NvcnNUb05vZGVcIixhLmliKTthLmIoXCJhcHBseUJpbmRpbmdzVG9Ob2RlXCIsYS5sZCk7YS5iKFwiY29udGV4dEZvclwiLGEuRGMpO2EuYihcImRhdGFGb3JcIixhLkVjKX0pKCk7KGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGMoYyxlKXt2YXIgaz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZixjKT9mW2NdOmIsbDtrP2suc3Vic2NyaWJlKGUpOihrPWZbY109bmV3IGEuVCxrLnN1YnNjcmliZShlKSxkKGMsZnVuY3Rpb24oYixkKXt2YXIgZT0hKCFkfHwhZC5zeW5jaHJvbm91cyk7Z1tjXT17ZGVmaW5pdGlvbjpiLEdkOmV9O2RlbGV0ZSBmW2NdO2x8fGU/ay5ub3RpZnlTdWJzY3JpYmVycyhiKTphLm5hLnpiKGZ1bmN0aW9uKCl7ay5ub3RpZnlTdWJzY3JpYmVycyhiKX0pfSksbD0hMCl9ZnVuY3Rpb24gZChhLGIpe2UoXCJnZXRDb25maWdcIixbYV0sZnVuY3Rpb24oYyl7Yz9lKFwibG9hZENvbXBvbmVudFwiLFthLGNdLGZ1bmN0aW9uKGEpe2IoYSxcbmMpfSk6YihudWxsLG51bGwpfSl9ZnVuY3Rpb24gZShjLGQsZixsKXtsfHwobD1hLmoubG9hZGVycy5zbGljZSgwKSk7dmFyIGc9bC5zaGlmdCgpO2lmKGcpe3ZhciBxPWdbY107aWYocSl7dmFyIHQ9ITE7aWYocS5hcHBseShnLGQuY29uY2F0KGZ1bmN0aW9uKGEpe3Q/ZihudWxsKTpudWxsIT09YT9mKGEpOmUoYyxkLGYsbCl9KSkhPT1iJiYodD0hMCwhZy5zdXBwcmVzc0xvYWRlckV4Y2VwdGlvbnMpKXRocm93IEVycm9yKFwiQ29tcG9uZW50IGxvYWRlcnMgbXVzdCBzdXBwbHkgdmFsdWVzIGJ5IGludm9raW5nIHRoZSBjYWxsYmFjaywgbm90IGJ5IHJldHVybmluZyB2YWx1ZXMgc3luY2hyb25vdXNseS5cIik7fWVsc2UgZShjLGQsZixsKX1lbHNlIGYobnVsbCl9dmFyIGY9e30sZz17fTthLmo9e2dldDpmdW5jdGlvbihkLGUpe3ZhciBmPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChnLGQpP2dbZF06YjtmP2YuR2Q/YS51LkcoZnVuY3Rpb24oKXtlKGYuZGVmaW5pdGlvbil9KTpcbmEubmEuemIoZnVuY3Rpb24oKXtlKGYuZGVmaW5pdGlvbil9KTpjKGQsZSl9LEJjOmZ1bmN0aW9uKGEpe2RlbGV0ZSBnW2FdfSxvYzplfTthLmoubG9hZGVycz1bXTthLmIoXCJjb21wb25lbnRzXCIsYS5qKTthLmIoXCJjb21wb25lbnRzLmdldFwiLGEuai5nZXQpO2EuYihcImNvbXBvbmVudHMuY2xlYXJDYWNoZWREZWZpbml0aW9uXCIsYS5qLkJjKX0pKCk7KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiLGMsZCxlKXtmdW5jdGlvbiBnKCl7MD09PS0tQiYmZShoKX12YXIgaD17fSxCPTIsdT1kLnRlbXBsYXRlO2Q9ZC52aWV3TW9kZWw7dT9mKGMsdSxmdW5jdGlvbihjKXthLmoub2MoXCJsb2FkVGVtcGxhdGVcIixbYixjXSxmdW5jdGlvbihhKXtoLnRlbXBsYXRlPWE7ZygpfSl9KTpnKCk7ZD9mKGMsZCxmdW5jdGlvbihjKXthLmoub2MoXCJsb2FkVmlld01vZGVsXCIsW2IsY10sZnVuY3Rpb24oYSl7aFttXT1hO2coKX0pfSk6ZygpfWZ1bmN0aW9uIGMoYSxiLGQpe2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBiKWQoZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBiKGEpfSk7XG5lbHNlIGlmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBiW21dKWQoYlttXSk7ZWxzZSBpZihcImluc3RhbmNlXCJpbiBiKXt2YXIgZT1iLmluc3RhbmNlO2QoZnVuY3Rpb24oKXtyZXR1cm4gZX0pfWVsc2VcInZpZXdNb2RlbFwiaW4gYj9jKGEsYi52aWV3TW9kZWwsZCk6YShcIlVua25vd24gdmlld01vZGVsIHZhbHVlOiBcIitiKX1mdW5jdGlvbiBkKGIpe3N3aXRjaChhLmEuUihiKSl7Y2FzZSBcInNjcmlwdFwiOnJldHVybiBhLmEudWEoYi50ZXh0KTtjYXNlIFwidGV4dGFyZWFcIjpyZXR1cm4gYS5hLnVhKGIudmFsdWUpO2Nhc2UgXCJ0ZW1wbGF0ZVwiOmlmKGUoYi5jb250ZW50KSlyZXR1cm4gYS5hLkNhKGIuY29udGVudC5jaGlsZE5vZGVzKX1yZXR1cm4gYS5hLkNhKGIuY2hpbGROb2Rlcyl9ZnVuY3Rpb24gZShhKXtyZXR1cm4gQS5Eb2N1bWVudEZyYWdtZW50P2EgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50OmEmJjExPT09YS5ub2RlVHlwZX1mdW5jdGlvbiBmKGEsYixjKXtcInN0cmluZ1wiPT09dHlwZW9mIGIucmVxdWlyZT9cblR8fEEucmVxdWlyZT8oVHx8QS5yZXF1aXJlKShbYi5yZXF1aXJlXSxmdW5jdGlvbihhKXthJiZcIm9iamVjdFwiPT09dHlwZW9mIGEmJmEuWGQmJmFbXCJkZWZhdWx0XCJdJiYoYT1hW1wiZGVmYXVsdFwiXSk7YyhhKX0pOmEoXCJVc2VzIHJlcXVpcmUsIGJ1dCBubyBBTUQgbG9hZGVyIGlzIHByZXNlbnRcIik6YyhiKX1mdW5jdGlvbiBnKGEpe3JldHVybiBmdW5jdGlvbihiKXt0aHJvdyBFcnJvcihcIkNvbXBvbmVudCAnXCIrYStcIic6IFwiK2IpO319dmFyIGg9e307YS5qLnJlZ2lzdGVyPWZ1bmN0aW9uKGIsYyl7aWYoIWMpdGhyb3cgRXJyb3IoXCJJbnZhbGlkIGNvbmZpZ3VyYXRpb24gZm9yIFwiK2IpO2lmKGEuai50YihiKSl0aHJvdyBFcnJvcihcIkNvbXBvbmVudCBcIitiK1wiIGlzIGFscmVhZHkgcmVnaXN0ZXJlZFwiKTtoW2JdPWN9O2Euai50Yj1mdW5jdGlvbihhKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGgsYSl9O2Euai51bnJlZ2lzdGVyPWZ1bmN0aW9uKGIpe2RlbGV0ZSBoW2JdO1xuYS5qLkJjKGIpfTthLmouRmM9e2dldENvbmZpZzpmdW5jdGlvbihiLGMpe2MoYS5qLnRiKGIpP2hbYl06bnVsbCl9LGxvYWRDb21wb25lbnQ6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPWcoYSk7ZihlLGMsZnVuY3Rpb24oYyl7YihhLGUsYyxkKX0pfSxsb2FkVGVtcGxhdGU6ZnVuY3Rpb24oYixjLGYpe2I9ZyhiKTtpZihcInN0cmluZ1wiPT09dHlwZW9mIGMpZihhLmEudWEoYykpO2Vsc2UgaWYoYyBpbnN0YW5jZW9mIEFycmF5KWYoYyk7ZWxzZSBpZihlKGMpKWYoYS5hLmxhKGMuY2hpbGROb2RlcykpO2Vsc2UgaWYoYy5lbGVtZW50KWlmKGM9Yy5lbGVtZW50LEEuSFRNTEVsZW1lbnQ/YyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50OmMmJmMudGFnTmFtZSYmMT09PWMubm9kZVR5cGUpZihkKGMpKTtlbHNlIGlmKFwic3RyaW5nXCI9PT10eXBlb2YgYyl7dmFyIGg9dy5nZXRFbGVtZW50QnlJZChjKTtoP2YoZChoKSk6YihcIkNhbm5vdCBmaW5kIGVsZW1lbnQgd2l0aCBJRCBcIitjKX1lbHNlIGIoXCJVbmtub3duIGVsZW1lbnQgdHlwZTogXCIrXG5jKTtlbHNlIGIoXCJVbmtub3duIHRlbXBsYXRlIHZhbHVlOiBcIitjKX0sbG9hZFZpZXdNb2RlbDpmdW5jdGlvbihhLGIsZCl7YyhnKGEpLGIsZCl9fTt2YXIgbT1cImNyZWF0ZVZpZXdNb2RlbFwiO2EuYihcImNvbXBvbmVudHMucmVnaXN0ZXJcIixhLmoucmVnaXN0ZXIpO2EuYihcImNvbXBvbmVudHMuaXNSZWdpc3RlcmVkXCIsYS5qLnRiKTthLmIoXCJjb21wb25lbnRzLnVucmVnaXN0ZXJcIixhLmoudW5yZWdpc3Rlcik7YS5iKFwiY29tcG9uZW50cy5kZWZhdWx0TG9hZGVyXCIsYS5qLkZjKTthLmoubG9hZGVycy5wdXNoKGEuai5GYyk7YS5qLmRkPWh9KSgpOyhmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixlKXt2YXIgZj1iLmdldEF0dHJpYnV0ZShcInBhcmFtc1wiKTtpZihmKXt2YXIgZj1jLnBhcnNlQmluZGluZ3NTdHJpbmcoZixlLGIse3ZhbHVlQWNjZXNzb3JzOiEwLGJpbmRpbmdQYXJhbXM6ITB9KSxmPWEuYS5HYShmLGZ1bmN0aW9uKGMpe3JldHVybiBhLm8oYyxudWxsLHtsOmJ9KX0pLGc9YS5hLkdhKGYsXG5mdW5jdGlvbihjKXt2YXIgZT1jLnYoKTtyZXR1cm4gYy5qYSgpP2Eubyh7cmVhZDpmdW5jdGlvbigpe3JldHVybiBhLmEuZihjKCkpfSx3cml0ZTphLlphKGUpJiZmdW5jdGlvbihhKXtjKCkoYSl9LGw6Yn0pOmV9KTtPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZyxcIiRyYXdcIil8fChnLiRyYXc9Zik7cmV0dXJuIGd9cmV0dXJueyRyYXc6e319fWEuai5nZXRDb21wb25lbnROYW1lRm9yTm9kZT1mdW5jdGlvbihiKXt2YXIgYz1hLmEuUihiKTtpZihhLmoudGIoYykmJigtMSE9Yy5pbmRleE9mKFwiLVwiKXx8XCJbb2JqZWN0IEhUTUxVbmtub3duRWxlbWVudF1cIj09XCJcIitifHw4Pj1hLmEuVyYmYi50YWdOYW1lPT09YykpcmV0dXJuIGN9O2Euai50Yz1mdW5jdGlvbihjLGUsZixnKXtpZigxPT09ZS5ub2RlVHlwZSl7dmFyIGg9YS5qLmdldENvbXBvbmVudE5hbWVGb3JOb2RlKGUpO2lmKGgpe2M9Y3x8e307aWYoYy5jb21wb25lbnQpdGhyb3cgRXJyb3IoJ0Nhbm5vdCB1c2UgdGhlIFwiY29tcG9uZW50XCIgYmluZGluZyBvbiBhIGN1c3RvbSBlbGVtZW50IG1hdGNoaW5nIGEgY29tcG9uZW50Jyk7XG52YXIgbT17bmFtZTpoLHBhcmFtczpiKGUsZil9O2MuY29tcG9uZW50PWc/ZnVuY3Rpb24oKXtyZXR1cm4gbX06bX19cmV0dXJuIGN9O3ZhciBjPW5ldyBhLmdhOzk+YS5hLlcmJihhLmoucmVnaXN0ZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybiBhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KGEuai5yZWdpc3Rlciksdy5jcmVhdGVEb2N1bWVudEZyYWdtZW50PWZ1bmN0aW9uKGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBjPWIoKSxmPWEuai5kZCxnO2ZvcihnIGluIGYpO3JldHVybiBjfX0ody5jcmVhdGVEb2N1bWVudEZyYWdtZW50KSl9KSgpOyhmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixjLGQpe2M9Yy50ZW1wbGF0ZTtpZighYyl0aHJvdyBFcnJvcihcIkNvbXBvbmVudCAnXCIrYitcIicgaGFzIG5vIHRlbXBsYXRlXCIpO2I9YS5hLkNhKGMpO2EuaC52YShkLGIpfWZ1bmN0aW9uIGMoYSxiLGMpe3ZhciBkPWEuY3JlYXRlVmlld01vZGVsO3JldHVybiBkP2QuY2FsbChhLFxuYixjKTpifXZhciBkPTA7YS5jLmNvbXBvbmVudD17aW5pdDpmdW5jdGlvbihlLGYsZyxoLG0pe2Z1bmN0aW9uIGsoKXt2YXIgYT1sJiZsLmRpc3Bvc2U7XCJmdW5jdGlvblwiPT09dHlwZW9mIGEmJmEuY2FsbChsKTtxJiZxLnMoKTtwPWw9cT1udWxsfXZhciBsLHAscSx0PWEuYS5sYShhLmguY2hpbGROb2RlcyhlKSk7YS5oLkVhKGUpO2EuYS5LLnphKGUsayk7YS5vKGZ1bmN0aW9uKCl7dmFyIGc9YS5hLmYoZigpKSxoLHU7XCJzdHJpbmdcIj09PXR5cGVvZiBnP2g9ZzooaD1hLmEuZihnLm5hbWUpLHU9YS5hLmYoZy5wYXJhbXMpKTtpZighaCl0aHJvdyBFcnJvcihcIk5vIGNvbXBvbmVudCBuYW1lIHNwZWNpZmllZFwiKTt2YXIgbj1hLmkuQ2IoZSxtKSx6PXA9KytkO2Euai5nZXQoaCxmdW5jdGlvbihkKXtpZihwPT09eil7aygpO2lmKCFkKXRocm93IEVycm9yKFwiVW5rbm93biBjb21wb25lbnQgJ1wiK2grXCInXCIpO2IoaCxkLGUpO3ZhciBmPWMoZCx1LHtlbGVtZW50OmUsdGVtcGxhdGVOb2Rlczp0fSk7XG5kPW4uY3JlYXRlQ2hpbGRDb250ZXh0KGYse2V4dGVuZDpmdW5jdGlvbihhKXthLiRjb21wb25lbnQ9ZjthLiRjb21wb25lbnRUZW1wbGF0ZU5vZGVzPXR9fSk7ZiYmZi5rb0Rlc2NlbmRhbnRzQ29tcGxldGUmJihxPWEuaS5zdWJzY3JpYmUoZSxhLmkucGEsZi5rb0Rlc2NlbmRhbnRzQ29tcGxldGUsZikpO2w9ZjthLk9hKGQsZSl9fSl9LG51bGwse2w6ZX0pO3JldHVybntjb250cm9sc0Rlc2NlbmRhbnRCaW5kaW5nczohMH19fTthLmguZWEuY29tcG9uZW50PSEwfSkoKTt2YXIgVj17XCJjbGFzc1wiOlwiY2xhc3NOYW1lXCIsXCJmb3JcIjpcImh0bWxGb3JcIn07YS5jLmF0dHI9e3VwZGF0ZTpmdW5jdGlvbihiLGMpe3ZhciBkPWEuYS5mKGMoKSl8fHt9O2EuYS5QKGQsZnVuY3Rpb24oYyxkKXtkPWEuYS5mKGQpO3ZhciBnPWMuaW5kZXhPZihcIjpcIiksZz1cImxvb2t1cE5hbWVzcGFjZVVSSVwiaW4gYiYmMDxnJiZiLmxvb2t1cE5hbWVzcGFjZVVSSShjLnN1YnN0cigwLGcpKSxoPSExPT09ZHx8bnVsbD09PVxuZHx8ZD09PW47aD9nP2IucmVtb3ZlQXR0cmlidXRlTlMoZyxjKTpiLnJlbW92ZUF0dHJpYnV0ZShjKTpkPWQudG9TdHJpbmcoKTs4Pj1hLmEuVyYmYyBpbiBWPyhjPVZbY10saD9iLnJlbW92ZUF0dHJpYnV0ZShjKTpiW2NdPWQpOmh8fChnP2Iuc2V0QXR0cmlidXRlTlMoZyxjLGQpOmIuc2V0QXR0cmlidXRlKGMsZCkpO1wibmFtZVwiPT09YyYmYS5hLlljKGIsaD9cIlwiOmQpfSl9fTsoZnVuY3Rpb24oKXthLmMuY2hlY2tlZD17YWZ0ZXI6W1widmFsdWVcIixcImF0dHJcIl0saW5pdDpmdW5jdGlvbihiLGMsZCl7ZnVuY3Rpb24gZSgpe3ZhciBlPWIuY2hlY2tlZCxmPWcoKTtpZighYS5TLllhKCkmJihlfHwhbSYmIWEuUy5xYSgpKSl7dmFyIGs9YS51LkcoYyk7aWYobCl7dmFyIHE9cD9rLnYoKTprLHo9dDt0PWY7eiE9PWY/ZSYmKGEuYS5OYShxLGYsITApLGEuYS5OYShxLHosITEpKTphLmEuTmEocSxmLGUpO3AmJmEuWmEoaykmJmsocSl9ZWxzZSBoJiYoZj09PW4/Zj1lOmV8fChmPW4pKSxhLm0uZWIoayxcbmQsXCJjaGVja2VkXCIsZiwhMCl9fWZ1bmN0aW9uIGYoKXt2YXIgZD1hLmEuZihjKCkpLGU9ZygpO2w/KGIuY2hlY2tlZD0wPD1hLmEuQShkLGUpLHQ9ZSk6Yi5jaGVja2VkPWgmJmU9PT1uPyEhZDpnKCk9PT1kfXZhciBnPWEueGIoZnVuY3Rpb24oKXtpZihkLmhhcyhcImNoZWNrZWRWYWx1ZVwiKSlyZXR1cm4gYS5hLmYoZC5nZXQoXCJjaGVja2VkVmFsdWVcIikpO2lmKHEpcmV0dXJuIGQuaGFzKFwidmFsdWVcIik/YS5hLmYoZC5nZXQoXCJ2YWx1ZVwiKSk6Yi52YWx1ZX0pLGg9XCJjaGVja2JveFwiPT1iLnR5cGUsbT1cInJhZGlvXCI9PWIudHlwZTtpZihofHxtKXt2YXIgaz1jKCksbD1oJiZhLmEuZihrKWluc3RhbmNlb2YgQXJyYXkscD0hKGwmJmsucHVzaCYmay5zcGxpY2UpLHE9bXx8bCx0PWw/ZygpOm47bSYmIWIubmFtZSYmYS5jLnVuaXF1ZU5hbWUuaW5pdChiLGZ1bmN0aW9uKCl7cmV0dXJuITB9KTthLm8oZSxudWxsLHtsOmJ9KTthLmEuQihiLFwiY2xpY2tcIixlKTthLm8oZixudWxsLHtsOmJ9KTtcbms9bn19fTthLm0ud2EuY2hlY2tlZD0hMDthLmMuY2hlY2tlZFZhbHVlPXt1cGRhdGU6ZnVuY3Rpb24oYixjKXtiLnZhbHVlPWEuYS5mKGMoKSl9fX0pKCk7YS5jW1wiY2xhc3NcIl09e3VwZGF0ZTpmdW5jdGlvbihiLGMpe3ZhciBkPWEuYS5EYihhLmEuZihjKCkpKTthLmEuRWIoYixiLl9fa29fX2Nzc1ZhbHVlLCExKTtiLl9fa29fX2Nzc1ZhbHVlPWQ7YS5hLkViKGIsZCwhMCl9fTthLmMuY3NzPXt1cGRhdGU6ZnVuY3Rpb24oYixjKXt2YXIgZD1hLmEuZihjKCkpO251bGwhPT1kJiZcIm9iamVjdFwiPT10eXBlb2YgZD9hLmEuUChkLGZ1bmN0aW9uKGMsZCl7ZD1hLmEuZihkKTthLmEuRWIoYixjLGQpfSk6YS5jW1wiY2xhc3NcIl0udXBkYXRlKGIsYyl9fTthLmMuZW5hYmxlPXt1cGRhdGU6ZnVuY3Rpb24oYixjKXt2YXIgZD1hLmEuZihjKCkpO2QmJmIuZGlzYWJsZWQ/Yi5yZW1vdmVBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKTpkfHxiLmRpc2FibGVkfHwoYi5kaXNhYmxlZD0hMCl9fTthLmMuZGlzYWJsZT1cbnt1cGRhdGU6ZnVuY3Rpb24oYixjKXthLmMuZW5hYmxlLnVwZGF0ZShiLGZ1bmN0aW9uKCl7cmV0dXJuIWEuYS5mKGMoKSl9KX19O2EuYy5ldmVudD17aW5pdDpmdW5jdGlvbihiLGMsZCxlLGYpe3ZhciBnPWMoKXx8e307YS5hLlAoZyxmdW5jdGlvbihnKXtcInN0cmluZ1wiPT10eXBlb2YgZyYmYS5hLkIoYixnLGZ1bmN0aW9uKGIpe3ZhciBrLGw9YygpW2ddO2lmKGwpe3RyeXt2YXIgcD1hLmEubGEoYXJndW1lbnRzKTtlPWYuJGRhdGE7cC51bnNoaWZ0KGUpO2s9bC5hcHBseShlLHApfWZpbmFsbHl7ITAhPT1rJiYoYi5wcmV2ZW50RGVmYXVsdD9iLnByZXZlbnREZWZhdWx0KCk6Yi5yZXR1cm5WYWx1ZT0hMSl9ITE9PT1kLmdldChnK1wiQnViYmxlXCIpJiYoYi5jYW5jZWxCdWJibGU9ITAsYi5zdG9wUHJvcGFnYXRpb24mJmIuc3RvcFByb3BhZ2F0aW9uKCkpfX0pfSl9fTthLmMuZm9yZWFjaD17UmM6ZnVuY3Rpb24oYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGM9YigpLGQ9YS5hLmJjKGMpO1xuaWYoIWR8fFwibnVtYmVyXCI9PXR5cGVvZiBkLmxlbmd0aClyZXR1cm57Zm9yZWFjaDpjLHRlbXBsYXRlRW5naW5lOmEuYmEuTWF9O2EuYS5mKGMpO3JldHVybntmb3JlYWNoOmQuZGF0YSxhczpkLmFzLG5vQ2hpbGRDb250ZXh0OmQubm9DaGlsZENvbnRleHQsaW5jbHVkZURlc3Ryb3llZDpkLmluY2x1ZGVEZXN0cm95ZWQsYWZ0ZXJBZGQ6ZC5hZnRlckFkZCxiZWZvcmVSZW1vdmU6ZC5iZWZvcmVSZW1vdmUsYWZ0ZXJSZW5kZXI6ZC5hZnRlclJlbmRlcixiZWZvcmVNb3ZlOmQuYmVmb3JlTW92ZSxhZnRlck1vdmU6ZC5hZnRlck1vdmUsdGVtcGxhdGVFbmdpbmU6YS5iYS5NYX19fSxpbml0OmZ1bmN0aW9uKGIsYyl7cmV0dXJuIGEuYy50ZW1wbGF0ZS5pbml0KGIsYS5jLmZvcmVhY2guUmMoYykpfSx1cGRhdGU6ZnVuY3Rpb24oYixjLGQsZSxmKXtyZXR1cm4gYS5jLnRlbXBsYXRlLnVwZGF0ZShiLGEuYy5mb3JlYWNoLlJjKGMpLGQsZSxmKX19O2EubS5SYS5mb3JlYWNoPSExO2EuaC5lYS5mb3JlYWNoPVxuITA7YS5jLmhhc2ZvY3VzPXtpbml0OmZ1bmN0aW9uKGIsYyxkKXtmdW5jdGlvbiBlKGUpe2IuX19rb19oYXNmb2N1c1VwZGF0aW5nPSEwO3ZhciBmPWIub3duZXJEb2N1bWVudDtpZihcImFjdGl2ZUVsZW1lbnRcImluIGYpe3ZhciBnO3RyeXtnPWYuYWN0aXZlRWxlbWVudH1jYXRjaChsKXtnPWYuYm9keX1lPWc9PT1ifWY9YygpO2EubS5lYihmLGQsXCJoYXNmb2N1c1wiLGUsITApO2IuX19rb19oYXNmb2N1c0xhc3RWYWx1ZT1lO2IuX19rb19oYXNmb2N1c1VwZGF0aW5nPSExfXZhciBmPWUuYmluZChudWxsLCEwKSxnPWUuYmluZChudWxsLCExKTthLmEuQihiLFwiZm9jdXNcIixmKTthLmEuQihiLFwiZm9jdXNpblwiLGYpO2EuYS5CKGIsXCJibHVyXCIsZyk7YS5hLkIoYixcImZvY3Vzb3V0XCIsZyk7Yi5fX2tvX2hhc2ZvY3VzTGFzdFZhbHVlPSExfSx1cGRhdGU6ZnVuY3Rpb24oYixjKXt2YXIgZD0hIWEuYS5mKGMoKSk7Yi5fX2tvX2hhc2ZvY3VzVXBkYXRpbmd8fGIuX19rb19oYXNmb2N1c0xhc3RWYWx1ZT09PVxuZHx8KGQ/Yi5mb2N1cygpOmIuYmx1cigpLCFkJiZiLl9fa29faGFzZm9jdXNMYXN0VmFsdWUmJmIub3duZXJEb2N1bWVudC5ib2R5LmZvY3VzKCksYS51LkcoYS5hLkZiLG51bGwsW2IsZD9cImZvY3VzaW5cIjpcImZvY3Vzb3V0XCJdKSl9fTthLm0ud2EuaGFzZm9jdXM9ITA7YS5jLmhhc0ZvY3VzPWEuYy5oYXNmb2N1czthLm0ud2EuaGFzRm9jdXM9XCJoYXNmb2N1c1wiO2EuYy5odG1sPXtpbml0OmZ1bmN0aW9uKCl7cmV0dXJue2NvbnRyb2xzRGVzY2VuZGFudEJpbmRpbmdzOiEwfX0sdXBkYXRlOmZ1bmN0aW9uKGIsYyl7YS5hLmZjKGIsYygpKX19OyhmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixkLGUpe2EuY1tiXT17aW5pdDpmdW5jdGlvbihiLGMsaCxtLGspe3ZhciBsLHAscT17fSx0LHgsbjtpZihkKXttPWguZ2V0KFwiYXNcIik7dmFyIHU9aC5nZXQoXCJub0NoaWxkQ29udGV4dFwiKTtuPSEobSYmdSk7cT17YXM6bSxub0NoaWxkQ29udGV4dDp1LGV4cG9ydERlcGVuZGVuY2llczpufX14PSh0PVxuXCJyZW5kZXJcIj09aC5nZXQoXCJjb21wbGV0ZU9uXCIpKXx8aC5oYXMoYS5pLnBhKTthLm8oZnVuY3Rpb24oKXt2YXIgaD1hLmEuZihjKCkpLG09IWUhPT0haCx1PSFwLHI7aWYobnx8bSE9PWwpe3gmJihrPWEuaS5DYihiLGspKTtpZihtKXtpZighZHx8bilxLmRhdGFEZXBlbmRlbmN5PWEuUy5vKCk7cj1kP2suY3JlYXRlQ2hpbGRDb250ZXh0KFwiZnVuY3Rpb25cIj09dHlwZW9mIGg/aDpjLHEpOmEuUy5xYSgpP2suZXh0ZW5kKG51bGwscSk6a311JiZhLlMucWEoKSYmKHA9YS5hLkNhKGEuaC5jaGlsZE5vZGVzKGIpLCEwKSk7bT8odXx8YS5oLnZhKGIsYS5hLkNhKHApKSxhLk9hKHIsYikpOihhLmguRWEoYiksdHx8YS5pLm1hKGIsYS5pLkgpKTtsPW19fSxudWxsLHtsOmJ9KTtyZXR1cm57Y29udHJvbHNEZXNjZW5kYW50QmluZGluZ3M6ITB9fX07YS5tLlJhW2JdPSExO2EuaC5lYVtiXT0hMH1iKFwiaWZcIik7YihcImlmbm90XCIsITEsITApO2IoXCJ3aXRoXCIsITApfSkoKTthLmMubGV0PXtpbml0OmZ1bmN0aW9uKGIsXG5jLGQsZSxmKXtjPWYuZXh0ZW5kKGMpO2EuT2EoYyxiKTtyZXR1cm57Y29udHJvbHNEZXNjZW5kYW50QmluZGluZ3M6ITB9fX07YS5oLmVhLmxldD0hMDt2YXIgUT17fTthLmMub3B0aW9ucz17aW5pdDpmdW5jdGlvbihiKXtpZihcInNlbGVjdFwiIT09YS5hLlIoYikpdGhyb3cgRXJyb3IoXCJvcHRpb25zIGJpbmRpbmcgYXBwbGllcyBvbmx5IHRvIFNFTEVDVCBlbGVtZW50c1wiKTtmb3IoOzA8Yi5sZW5ndGg7KWIucmVtb3ZlKDApO3JldHVybntjb250cm9sc0Rlc2NlbmRhbnRCaW5kaW5nczohMH19LHVwZGF0ZTpmdW5jdGlvbihiLGMsZCl7ZnVuY3Rpb24gZSgpe3JldHVybiBhLmEuamIoYi5vcHRpb25zLGZ1bmN0aW9uKGEpe3JldHVybiBhLnNlbGVjdGVkfSl9ZnVuY3Rpb24gZihhLGIsYyl7dmFyIGQ9dHlwZW9mIGI7cmV0dXJuXCJmdW5jdGlvblwiPT1kP2IoYSk6XCJzdHJpbmdcIj09ZD9hW2JdOmN9ZnVuY3Rpb24gZyhjLGQpe2lmKHgmJmwpYS5pLm1hKGIsYS5pLkgpO2Vsc2UgaWYodC5sZW5ndGgpe3ZhciBlPVxuMDw9YS5hLkEodCxhLncuTShkWzBdKSk7YS5hLlpjKGRbMF0sZSk7eCYmIWUmJmEudS5HKGEuYS5GYixudWxsLFtiLFwiY2hhbmdlXCJdKX19dmFyIGg9Yi5tdWx0aXBsZSxtPTAhPWIubGVuZ3RoJiZoP2Iuc2Nyb2xsVG9wOm51bGwsaz1hLmEuZihjKCkpLGw9ZC5nZXQoXCJ2YWx1ZUFsbG93VW5zZXRcIikmJmQuaGFzKFwidmFsdWVcIikscD1kLmdldChcIm9wdGlvbnNJbmNsdWRlRGVzdHJveWVkXCIpO2M9e307dmFyIHEsdD1bXTtsfHwoaD90PWEuYS5NYihlKCksYS53Lk0pOjA8PWIuc2VsZWN0ZWRJbmRleCYmdC5wdXNoKGEudy5NKGIub3B0aW9uc1tiLnNlbGVjdGVkSW5kZXhdKSkpO2smJihcInVuZGVmaW5lZFwiPT10eXBlb2Ygay5sZW5ndGgmJihrPVtrXSkscT1hLmEuamIoayxmdW5jdGlvbihiKXtyZXR1cm4gcHx8Yj09PW58fG51bGw9PT1ifHwhYS5hLmYoYi5fZGVzdHJveSl9KSxkLmhhcyhcIm9wdGlvbnNDYXB0aW9uXCIpJiYoaz1hLmEuZihkLmdldChcIm9wdGlvbnNDYXB0aW9uXCIpKSxudWxsIT09XG5rJiZrIT09biYmcS51bnNoaWZ0KFEpKSk7dmFyIHg9ITE7Yy5iZWZvcmVSZW1vdmU9ZnVuY3Rpb24oYSl7Yi5yZW1vdmVDaGlsZChhKX07az1nO2QuaGFzKFwib3B0aW9uc0FmdGVyUmVuZGVyXCIpJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBkLmdldChcIm9wdGlvbnNBZnRlclJlbmRlclwiKSYmKGs9ZnVuY3Rpb24oYixjKXtnKDAsYyk7YS51LkcoZC5nZXQoXCJvcHRpb25zQWZ0ZXJSZW5kZXJcIiksbnVsbCxbY1swXSxiIT09UT9iOm5dKX0pO2EuYS5lYyhiLHEsZnVuY3Rpb24oYyxlLGcpe2cubGVuZ3RoJiYodD0hbCYmZ1swXS5zZWxlY3RlZD9bYS53Lk0oZ1swXSldOltdLHg9ITApO2U9Yi5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJvcHRpb25cIik7Yz09PVE/KGEuYS5CYihlLGQuZ2V0KFwib3B0aW9uc0NhcHRpb25cIikpLGEudy5jYihlLG4pKTooZz1mKGMsZC5nZXQoXCJvcHRpb25zVmFsdWVcIiksYyksYS53LmNiKGUsYS5hLmYoZykpLGM9ZihjLGQuZ2V0KFwib3B0aW9uc1RleHRcIiksZyksXG5hLmEuQmIoZSxjKSk7cmV0dXJuW2VdfSxjLGspO2lmKCFsKXt2YXIgQjtoP0I9dC5sZW5ndGgmJmUoKS5sZW5ndGg8dC5sZW5ndGg6Qj10Lmxlbmd0aCYmMDw9Yi5zZWxlY3RlZEluZGV4P2Eudy5NKGIub3B0aW9uc1tiLnNlbGVjdGVkSW5kZXhdKSE9PXRbMF06dC5sZW5ndGh8fDA8PWIuc2VsZWN0ZWRJbmRleDtCJiZhLnUuRyhhLmEuRmIsbnVsbCxbYixcImNoYW5nZVwiXSl9KGx8fGEuUy5ZYSgpKSYmYS5pLm1hKGIsYS5pLkgpO2EuYS53ZChiKTttJiYyMDxNYXRoLmFicyhtLWIuc2Nyb2xsVG9wKSYmKGIuc2Nyb2xsVG9wPW0pfX07YS5jLm9wdGlvbnMuJGI9YS5hLmcuWigpO2EuYy5zZWxlY3RlZE9wdGlvbnM9e2luaXQ6ZnVuY3Rpb24oYixjLGQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1jKCksZj1bXTthLmEuRChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwib3B0aW9uXCIpLGZ1bmN0aW9uKGIpe2Iuc2VsZWN0ZWQmJmYucHVzaChhLncuTShiKSl9KTthLm0uZWIoZSxkLFwic2VsZWN0ZWRPcHRpb25zXCIsXG5mKX1mdW5jdGlvbiBmKCl7dmFyIGQ9YS5hLmYoYygpKSxlPWIuc2Nyb2xsVG9wO2QmJlwibnVtYmVyXCI9PXR5cGVvZiBkLmxlbmd0aCYmYS5hLkQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShcIm9wdGlvblwiKSxmdW5jdGlvbihiKXt2YXIgYz0wPD1hLmEuQShkLGEudy5NKGIpKTtiLnNlbGVjdGVkIT1jJiZhLmEuWmMoYixjKX0pO2Iuc2Nyb2xsVG9wPWV9aWYoXCJzZWxlY3RcIiE9YS5hLlIoYikpdGhyb3cgRXJyb3IoXCJzZWxlY3RlZE9wdGlvbnMgYmluZGluZyBhcHBsaWVzIG9ubHkgdG8gU0VMRUNUIGVsZW1lbnRzXCIpO3ZhciBnO2EuaS5zdWJzY3JpYmUoYixhLmkuSCxmdW5jdGlvbigpe2c/ZSgpOihhLmEuQihiLFwiY2hhbmdlXCIsZSksZz1hLm8oZixudWxsLHtsOmJ9KSl9LG51bGwse25vdGlmeUltbWVkaWF0ZWx5OiEwfSl9LHVwZGF0ZTpmdW5jdGlvbigpe319O2EubS53YS5zZWxlY3RlZE9wdGlvbnM9ITA7YS5jLnN0eWxlPXt1cGRhdGU6ZnVuY3Rpb24oYixjKXt2YXIgZD1hLmEuZihjKCl8fFxue30pO2EuYS5QKGQsZnVuY3Rpb24oYyxkKXtkPWEuYS5mKGQpO2lmKG51bGw9PT1kfHxkPT09bnx8ITE9PT1kKWQ9XCJcIjtpZih2KXYoYikuY3NzKGMsZCk7ZWxzZSBpZigvXi0tLy50ZXN0KGMpKWIuc3R5bGUuc2V0UHJvcGVydHkoYyxkKTtlbHNle2M9Yy5yZXBsYWNlKC8tKFxcdykvZyxmdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9KTt2YXIgZz1iLnN0eWxlW2NdO2Iuc3R5bGVbY109ZDtkPT09Z3x8Yi5zdHlsZVtjXSE9Z3x8aXNOYU4oZCl8fChiLnN0eWxlW2NdPWQrXCJweFwiKX19KX19O2EuYy5zdWJtaXQ9e2luaXQ6ZnVuY3Rpb24oYixjLGQsZSxmKXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBjKCkpdGhyb3cgRXJyb3IoXCJUaGUgdmFsdWUgZm9yIGEgc3VibWl0IGJpbmRpbmcgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO2EuYS5CKGIsXCJzdWJtaXRcIixmdW5jdGlvbihhKXt2YXIgZCxlPWMoKTt0cnl7ZD1lLmNhbGwoZi4kZGF0YSxiKX1maW5hbGx5eyEwIT09ZCYmKGEucHJldmVudERlZmF1bHQ/XG5hLnByZXZlbnREZWZhdWx0KCk6YS5yZXR1cm5WYWx1ZT0hMSl9fSl9fTthLmMudGV4dD17aW5pdDpmdW5jdGlvbigpe3JldHVybntjb250cm9sc0Rlc2NlbmRhbnRCaW5kaW5nczohMH19LHVwZGF0ZTpmdW5jdGlvbihiLGMpe2EuYS5CYihiLGMoKSl9fTthLmguZWEudGV4dD0hMDsoZnVuY3Rpb24oKXtpZihBJiZBLm5hdmlnYXRvcil7dmFyIGI9ZnVuY3Rpb24oYSl7aWYoYSlyZXR1cm4gcGFyc2VGbG9hdChhWzFdKX0sYz1BLm5hdmlnYXRvci51c2VyQWdlbnQsZCxlLGYsZyxoOyhkPUEub3BlcmEmJkEub3BlcmEudmVyc2lvbiYmcGFyc2VJbnQoQS5vcGVyYS52ZXJzaW9uKCkpKXx8KGg9YihjLm1hdGNoKC9FZGdlXFwvKFteIF0rKSQvKSkpfHxiKGMubWF0Y2goL0Nocm9tZVxcLyhbXiBdKykvKSl8fChlPWIoYy5tYXRjaCgvVmVyc2lvblxcLyhbXiBdKykgU2FmYXJpLykpKXx8KGY9YihjLm1hdGNoKC9GaXJlZm94XFwvKFteIF0rKS8pKSl8fChnPWEuYS5XfHxiKGMubWF0Y2goL01TSUUgKFteIF0rKS8pKSl8fFxuKGc9YihjLm1hdGNoKC9ydjooW14gKV0rKS8pKSl9aWYoODw9ZyYmMTA+Zyl2YXIgbT1hLmEuZy5aKCksaz1hLmEuZy5aKCksbD1mdW5jdGlvbihiKXt2YXIgYz10aGlzLmFjdGl2ZUVsZW1lbnQ7KGM9YyYmYS5hLmcuZ2V0KGMsaykpJiZjKGIpfSxwPWZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yi5vd25lckRvY3VtZW50O2EuYS5nLmdldChkLG0pfHwoYS5hLmcuc2V0KGQsbSwhMCksYS5hLkIoZCxcInNlbGVjdGlvbmNoYW5nZVwiLGwpKTthLmEuZy5zZXQoYixrLGMpfTthLmMudGV4dElucHV0PXtpbml0OmZ1bmN0aW9uKGIsYyxrKXtmdW5jdGlvbiBsKGMsZCl7YS5hLkIoYixjLGQpfWZ1bmN0aW9uIG0oKXt2YXIgZD1hLmEuZihjKCkpO2lmKG51bGw9PT1kfHxkPT09bilkPVwiXCI7TCE9PW4mJmQ9PT1MP2EuYS5zZXRUaW1lb3V0KG0sNCk6Yi52YWx1ZSE9PWQmJih5PSEwLGIudmFsdWU9ZCx5PSExLHY9Yi52YWx1ZSl9ZnVuY3Rpb24gcigpe3d8fChMPWIudmFsdWUsdz1hLmEuc2V0VGltZW91dCh6LFxuNCkpfWZ1bmN0aW9uIHooKXtjbGVhclRpbWVvdXQodyk7TD13PW47dmFyIGQ9Yi52YWx1ZTt2IT09ZCYmKHY9ZCxhLm0uZWIoYygpLGssXCJ0ZXh0SW5wdXRcIixkKSl9dmFyIHY9Yi52YWx1ZSx3LEwsQT05PT1hLmEuVz9yOnoseT0hMTtnJiZsKFwia2V5cHJlc3NcIix6KTsxMT5nJiZsKFwicHJvcGVydHljaGFuZ2VcIixmdW5jdGlvbihhKXt5fHxcInZhbHVlXCIhPT1hLnByb3BlcnR5TmFtZXx8QShhKX0pOzg9PWcmJihsKFwia2V5dXBcIix6KSxsKFwia2V5ZG93blwiLHopKTtwJiYocChiLEEpLGwoXCJkcmFnZW5kXCIscikpOyghZ3x8OTw9ZykmJmwoXCJpbnB1dFwiLEEpOzU+ZSYmXCJ0ZXh0YXJlYVwiPT09YS5hLlIoYik/KGwoXCJrZXlkb3duXCIsciksbChcInBhc3RlXCIsciksbChcImN1dFwiLHIpKToxMT5kP2woXCJrZXlkb3duXCIscik6ND5mPyhsKFwiRE9NQXV0b0NvbXBsZXRlXCIseiksbChcImRyYWdkcm9wXCIseiksbChcImRyb3BcIix6KSk6aCYmXCJudW1iZXJcIj09PWIudHlwZSYmbChcImtleWRvd25cIixyKTtsKFwiY2hhbmdlXCIsXG56KTtsKFwiYmx1clwiLHopO2EubyhtLG51bGwse2w6Yn0pfX07YS5tLndhLnRleHRJbnB1dD0hMDthLmMudGV4dGlucHV0PXtwcmVwcm9jZXNzOmZ1bmN0aW9uKGEsYixjKXtjKFwidGV4dElucHV0XCIsYSl9fX0pKCk7YS5jLnVuaXF1ZU5hbWU9e2luaXQ6ZnVuY3Rpb24oYixjKXtpZihjKCkpe3ZhciBkPVwia29fdW5pcXVlX1wiKyArK2EuYy51bmlxdWVOYW1lLnJkO2EuYS5ZYyhiLGQpfX19O2EuYy51bmlxdWVOYW1lLnJkPTA7YS5jLnVzaW5nPXtpbml0OmZ1bmN0aW9uKGIsYyxkLGUsZil7dmFyIGc7ZC5oYXMoXCJhc1wiKSYmKGc9e2FzOmQuZ2V0KFwiYXNcIiksbm9DaGlsZENvbnRleHQ6ZC5nZXQoXCJub0NoaWxkQ29udGV4dFwiKX0pO2M9Zi5jcmVhdGVDaGlsZENvbnRleHQoYyxnKTthLk9hKGMsYik7cmV0dXJue2NvbnRyb2xzRGVzY2VuZGFudEJpbmRpbmdzOiEwfX19O2EuaC5lYS51c2luZz0hMDthLmMudmFsdWU9e2luaXQ6ZnVuY3Rpb24oYixjLGQpe3ZhciBlPWEuYS5SKGIpLGY9XCJpbnB1dFwiPT1cbmU7aWYoIWZ8fFwiY2hlY2tib3hcIiE9Yi50eXBlJiZcInJhZGlvXCIhPWIudHlwZSl7dmFyIGc9W10saD1kLmdldChcInZhbHVlVXBkYXRlXCIpLG09ITEsaz1udWxsO2gmJihcInN0cmluZ1wiPT10eXBlb2YgaD9nPVtoXTpnPWEuYS53YyhoKSxhLmEuUGEoZyxcImNoYW5nZVwiKSk7dmFyIGw9ZnVuY3Rpb24oKXtrPW51bGw7bT0hMTt2YXIgZT1jKCksZj1hLncuTShiKTthLm0uZWIoZSxkLFwidmFsdWVcIixmKX07IWEuYS5XfHwhZnx8XCJ0ZXh0XCIhPWIudHlwZXx8XCJvZmZcIj09Yi5hdXRvY29tcGxldGV8fGIuZm9ybSYmXCJvZmZcIj09Yi5mb3JtLmF1dG9jb21wbGV0ZXx8LTEhPWEuYS5BKGcsXCJwcm9wZXJ0eWNoYW5nZVwiKXx8KGEuYS5CKGIsXCJwcm9wZXJ0eWNoYW5nZVwiLGZ1bmN0aW9uKCl7bT0hMH0pLGEuYS5CKGIsXCJmb2N1c1wiLGZ1bmN0aW9uKCl7bT0hMX0pLGEuYS5CKGIsXCJibHVyXCIsZnVuY3Rpb24oKXttJiZsKCl9KSk7YS5hLkQoZyxmdW5jdGlvbihjKXt2YXIgZD1sO2EuYS5VZChjLFwiYWZ0ZXJcIikmJlxuKGQ9ZnVuY3Rpb24oKXtrPWEudy5NKGIpO2EuYS5zZXRUaW1lb3V0KGwsMCl9LGM9Yy5zdWJzdHJpbmcoNSkpO2EuYS5CKGIsYyxkKX0pO3ZhciBwO3A9ZiYmXCJmaWxlXCI9PWIudHlwZT9mdW5jdGlvbigpe3ZhciBkPWEuYS5mKGMoKSk7bnVsbD09PWR8fGQ9PT1ufHxcIlwiPT09ZD9iLnZhbHVlPVwiXCI6YS51LkcobCl9OmZ1bmN0aW9uKCl7dmFyIGY9YS5hLmYoYygpKSxnPWEudy5NKGIpO2lmKG51bGwhPT1rJiZmPT09aylhLmEuc2V0VGltZW91dChwLDApO2Vsc2UgaWYoZiE9PWd8fGc9PT1uKVwic2VsZWN0XCI9PT1lPyhnPWQuZ2V0KFwidmFsdWVBbGxvd1Vuc2V0XCIpLGEudy5jYihiLGYsZyksZ3x8Zj09PWEudy5NKGIpfHxhLnUuRyhsKSk6YS53LmNiKGIsZil9O2lmKFwic2VsZWN0XCI9PT1lKXt2YXIgcTthLmkuc3Vic2NyaWJlKGIsYS5pLkgsZnVuY3Rpb24oKXtxP2QuZ2V0KFwidmFsdWVBbGxvd1Vuc2V0XCIpP3AoKTpsKCk6KGEuYS5CKGIsXCJjaGFuZ2VcIixsKSxxPWEubyhwLG51bGwse2w6Yn0pKX0sXG5udWxsLHtub3RpZnlJbW1lZGlhdGVseTohMH0pfWVsc2UgYS5hLkIoYixcImNoYW5nZVwiLGwpLGEubyhwLG51bGwse2w6Yn0pfWVsc2UgYS5pYihiLHtjaGVja2VkVmFsdWU6Y30pfSx1cGRhdGU6ZnVuY3Rpb24oKXt9fTthLm0ud2EudmFsdWU9ITA7YS5jLnZpc2libGU9e3VwZGF0ZTpmdW5jdGlvbihiLGMpe3ZhciBkPWEuYS5mKGMoKSksZT1cIm5vbmVcIiE9Yi5zdHlsZS5kaXNwbGF5O2QmJiFlP2Iuc3R5bGUuZGlzcGxheT1cIlwiOiFkJiZlJiYoYi5zdHlsZS5kaXNwbGF5PVwibm9uZVwiKX19O2EuYy5oaWRkZW49e3VwZGF0ZTpmdW5jdGlvbihiLGMpe2EuYy52aXNpYmxlLnVwZGF0ZShiLGZ1bmN0aW9uKCl7cmV0dXJuIWEuYS5mKGMoKSl9KX19OyhmdW5jdGlvbihiKXthLmNbYl09e2luaXQ6ZnVuY3Rpb24oYyxkLGUsZixnKXtyZXR1cm4gYS5jLmV2ZW50LmluaXQuY2FsbCh0aGlzLGMsZnVuY3Rpb24oKXt2YXIgYT17fTthW2JdPWQoKTtyZXR1cm4gYX0sZSxmLGcpfX19KShcImNsaWNrXCIpO1xuYS5jYT1mdW5jdGlvbigpe307YS5jYS5wcm90b3R5cGUucmVuZGVyVGVtcGxhdGVTb3VyY2U9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcihcIk92ZXJyaWRlIHJlbmRlclRlbXBsYXRlU291cmNlXCIpO307YS5jYS5wcm90b3R5cGUuY3JlYXRlSmF2YVNjcmlwdEV2YWx1YXRvckJsb2NrPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoXCJPdmVycmlkZSBjcmVhdGVKYXZhU2NyaXB0RXZhbHVhdG9yQmxvY2tcIik7fTthLmNhLnByb3RvdHlwZS5tYWtlVGVtcGxhdGVTb3VyY2U9ZnVuY3Rpb24oYixjKXtpZihcInN0cmluZ1wiPT10eXBlb2YgYil7Yz1jfHx3O3ZhciBkPWMuZ2V0RWxlbWVudEJ5SWQoYik7aWYoIWQpdGhyb3cgRXJyb3IoXCJDYW5ub3QgZmluZCB0ZW1wbGF0ZSB3aXRoIElEIFwiK2IpO3JldHVybiBuZXcgYS5DLkYoZCl9aWYoMT09Yi5ub2RlVHlwZXx8OD09Yi5ub2RlVHlwZSlyZXR1cm4gbmV3IGEuQy5pYShiKTt0aHJvdyBFcnJvcihcIlVua25vd24gdGVtcGxhdGUgdHlwZTogXCIrYik7fTthLmNhLnByb3RvdHlwZS5yZW5kZXJUZW1wbGF0ZT1cbmZ1bmN0aW9uKGEsYyxkLGUpe2E9dGhpcy5tYWtlVGVtcGxhdGVTb3VyY2UoYSxlKTtyZXR1cm4gdGhpcy5yZW5kZXJUZW1wbGF0ZVNvdXJjZShhLGMsZCxlKX07YS5jYS5wcm90b3R5cGUuaXNUZW1wbGF0ZVJld3JpdHRlbj1mdW5jdGlvbihhLGMpe3JldHVybiExPT09dGhpcy5hbGxvd1RlbXBsYXRlUmV3cml0aW5nPyEwOnRoaXMubWFrZVRlbXBsYXRlU291cmNlKGEsYykuZGF0YShcImlzUmV3cml0dGVuXCIpfTthLmNhLnByb3RvdHlwZS5yZXdyaXRlVGVtcGxhdGU9ZnVuY3Rpb24oYSxjLGQpe2E9dGhpcy5tYWtlVGVtcGxhdGVTb3VyY2UoYSxkKTtjPWMoYS50ZXh0KCkpO2EudGV4dChjKTthLmRhdGEoXCJpc1Jld3JpdHRlblwiLCEwKX07YS5iKFwidGVtcGxhdGVFbmdpbmVcIixhLmNhKTthLmtjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiLGMsZCxoKXtiPWEubS5hYyhiKTtmb3IodmFyIG09YS5tLlJhLGs9MDtrPGIubGVuZ3RoO2srKyl7dmFyIGw9YltrXS5rZXk7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG0sXG5sKSl7dmFyIHA9bVtsXTtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgcCl7aWYobD1wKGJba10udmFsdWUpKXRocm93IEVycm9yKGwpO31lbHNlIGlmKCFwKXRocm93IEVycm9yKFwiVGhpcyB0ZW1wbGF0ZSBlbmdpbmUgZG9lcyBub3Qgc3VwcG9ydCB0aGUgJ1wiK2wrXCInIGJpbmRpbmcgd2l0aGluIGl0cyB0ZW1wbGF0ZXNcIik7fX1kPVwia28uX190cl9hbWJ0bnMoZnVuY3Rpb24oJGNvbnRleHQsJGVsZW1lbnQpe3JldHVybihmdW5jdGlvbigpe3JldHVybnsgXCIrYS5tLnZiKGIse3ZhbHVlQWNjZXNzb3JzOiEwfSkrXCIgfSB9KSgpfSwnXCIrZC50b0xvd2VyQ2FzZSgpK1wiJylcIjtyZXR1cm4gaC5jcmVhdGVKYXZhU2NyaXB0RXZhbHVhdG9yQmxvY2soZCkrY312YXIgYz0vKDwoW2Etel0rXFxkKikoPzpcXHMrKD8hZGF0YS1iaW5kXFxzKj1cXHMqKVthLXowLTlcXC1dKyg/Oj0oPzpcXFwiW15cXFwiXSpcXFwifFxcJ1teXFwnXSpcXCd8W14+XSopKT8pKlxccyspZGF0YS1iaW5kXFxzKj1cXHMqKFtcIiddKShbXFxzXFxTXSo/KVxcMy9naSxcbmQ9L1xceDNjIS0tXFxzKmtvXFxiXFxzKihbXFxzXFxTXSo/KVxccyotLVxceDNlL2c7cmV0dXJue3hkOmZ1bmN0aW9uKGIsYyxkKXtjLmlzVGVtcGxhdGVSZXdyaXR0ZW4oYixkKXx8Yy5yZXdyaXRlVGVtcGxhdGUoYixmdW5jdGlvbihiKXtyZXR1cm4gYS5rYy5MZChiLGMpfSxkKX0sTGQ6ZnVuY3Rpb24oYSxmKXtyZXR1cm4gYS5yZXBsYWNlKGMsZnVuY3Rpb24oYSxjLGQsZSxsKXtyZXR1cm4gYihsLGMsZCxmKX0pLnJlcGxhY2UoZCxmdW5jdGlvbihhLGMpe3JldHVybiBiKGMsXCJcXHgzYyEtLSBrbyAtLVxceDNlXCIsXCIjY29tbWVudFwiLGYpfSl9LG1kOmZ1bmN0aW9uKGIsYyl7cmV0dXJuIGEuYWEuWGIoZnVuY3Rpb24oZCxoKXt2YXIgbT1kLm5leHRTaWJsaW5nO20mJm0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWMmJmEuaWIobSxiLGgpfSl9fX0oKTthLmIoXCJfX3RyX2FtYnRuc1wiLGEua2MubWQpOyhmdW5jdGlvbigpe2EuQz17fTthLkMuRj1mdW5jdGlvbihiKXtpZih0aGlzLkY9Yil7dmFyIGM9XG5hLmEuUihiKTt0aGlzLmFiPVwic2NyaXB0XCI9PT1jPzE6XCJ0ZXh0YXJlYVwiPT09Yz8yOlwidGVtcGxhdGVcIj09YyYmYi5jb250ZW50JiYxMT09PWIuY29udGVudC5ub2RlVHlwZT8zOjR9fTthLkMuRi5wcm90b3R5cGUudGV4dD1mdW5jdGlvbigpe3ZhciBiPTE9PT10aGlzLmFiP1widGV4dFwiOjI9PT10aGlzLmFiP1widmFsdWVcIjpcImlubmVySFRNTFwiO2lmKDA9PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuRltiXTt2YXIgYz1hcmd1bWVudHNbMF07XCJpbm5lckhUTUxcIj09PWI/YS5hLmZjKHRoaXMuRixjKTp0aGlzLkZbYl09Y307dmFyIGI9YS5hLmcuWigpK1wiX1wiO2EuQy5GLnByb3RvdHlwZS5kYXRhPWZ1bmN0aW9uKGMpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBhLmEuZy5nZXQodGhpcy5GLGIrYyk7YS5hLmcuc2V0KHRoaXMuRixiK2MsYXJndW1lbnRzWzFdKX07dmFyIGM9YS5hLmcuWigpO2EuQy5GLnByb3RvdHlwZS5ub2Rlcz1mdW5jdGlvbigpe3ZhciBiPXRoaXMuRjtcbmlmKDA9PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWEuYS5nLmdldChiLGMpfHx7fSxmPWUubGJ8fCgzPT09dGhpcy5hYj9iLmNvbnRlbnQ6ND09PXRoaXMuYWI/YjpuKTtpZighZnx8ZS5qZCl7dmFyIGc9dGhpcy50ZXh0KCk7ZyYmZyE9PWUuYmImJihmPWEuYS5NZChnLGIub3duZXJEb2N1bWVudCksYS5hLmcuc2V0KGIsYyx7bGI6ZixiYjpnLGpkOiEwfSkpfXJldHVybiBmfWU9YXJndW1lbnRzWzBdO3RoaXMuYWIhPT1uJiZ0aGlzLnRleHQoXCJcIik7YS5hLmcuc2V0KGIsYyx7bGI6ZX0pfTthLkMuaWE9ZnVuY3Rpb24oYSl7dGhpcy5GPWF9O2EuQy5pYS5wcm90b3R5cGU9bmV3IGEuQy5GO2EuQy5pYS5wcm90b3R5cGUuY29uc3RydWN0b3I9YS5DLmlhO2EuQy5pYS5wcm90b3R5cGUudGV4dD1mdW5jdGlvbigpe2lmKDA9PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBiPWEuYS5nLmdldCh0aGlzLkYsYyl8fHt9O2IuYmI9PT1uJiZiLmxiJiYoYi5iYj1iLmxiLmlubmVySFRNTCk7cmV0dXJuIGIuYmJ9YS5hLmcuc2V0KHRoaXMuRixcbmMse2JiOmFyZ3VtZW50c1swXX0pfTthLmIoXCJ0ZW1wbGF0ZVNvdXJjZXNcIixhLkMpO2EuYihcInRlbXBsYXRlU291cmNlcy5kb21FbGVtZW50XCIsYS5DLkYpO2EuYihcInRlbXBsYXRlU291cmNlcy5hbm9ueW1vdXNUZW1wbGF0ZVwiLGEuQy5pYSl9KSgpOyhmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixjLGQpe3ZhciBlO2ZvcihjPWEuaC5uZXh0U2libGluZyhjKTtiJiYoZT1iKSE9PWM7KWI9YS5oLm5leHRTaWJsaW5nKGUpLGQoZSxiKX1mdW5jdGlvbiBjKGMsZCl7aWYoYy5sZW5ndGgpe3ZhciBlPWNbMF0sZj1jW2MubGVuZ3RoLTFdLGc9ZS5wYXJlbnROb2RlLGg9YS5nYS5pbnN0YW5jZSxtPWgucHJlcHJvY2Vzc05vZGU7aWYobSl7YihlLGYsZnVuY3Rpb24oYSxiKXt2YXIgYz1hLnByZXZpb3VzU2libGluZyxkPW0uY2FsbChoLGEpO2QmJihhPT09ZSYmKGU9ZFswXXx8YiksYT09PWYmJihmPWRbZC5sZW5ndGgtMV18fGMpKX0pO2MubGVuZ3RoPTA7aWYoIWUpcmV0dXJuO2U9PT1mP2MucHVzaChlKTpcbihjLnB1c2goZSxmKSxhLmEuVWEoYyxnKSl9YihlLGYsZnVuY3Rpb24oYil7MSE9PWIubm9kZVR5cGUmJjghPT1iLm5vZGVUeXBlfHxhLnZjKGQsYil9KTtiKGUsZixmdW5jdGlvbihiKXsxIT09Yi5ub2RlVHlwZSYmOCE9PWIubm9kZVR5cGV8fGEuYWEuY2QoYixbZF0pfSk7YS5hLlVhKGMsZyl9fWZ1bmN0aW9uIGQoYSl7cmV0dXJuIGEubm9kZVR5cGU/YTowPGEubGVuZ3RoP2FbMF06bnVsbH1mdW5jdGlvbiBlKGIsZSxmLGgsbSl7bT1tfHx7fTt2YXIgbj0oYiYmZChiKXx8Znx8e30pLm93bmVyRG9jdW1lbnQsQj1tLnRlbXBsYXRlRW5naW5lfHxnO2Eua2MueGQoZixCLG4pO2Y9Qi5yZW5kZXJUZW1wbGF0ZShmLGgsbSxuKTtpZihcIm51bWJlclwiIT10eXBlb2YgZi5sZW5ndGh8fDA8Zi5sZW5ndGgmJlwibnVtYmVyXCIhPXR5cGVvZiBmWzBdLm5vZGVUeXBlKXRocm93IEVycm9yKFwiVGVtcGxhdGUgZW5naW5lIG11c3QgcmV0dXJuIGFuIGFycmF5IG9mIERPTSBub2Rlc1wiKTtuPSExO3N3aXRjaChlKXtjYXNlIFwicmVwbGFjZUNoaWxkcmVuXCI6YS5oLnZhKGIsXG5mKTtuPSEwO2JyZWFrO2Nhc2UgXCJyZXBsYWNlTm9kZVwiOmEuYS5YYyhiLGYpO249ITA7YnJlYWs7Y2FzZSBcImlnbm9yZVRhcmdldE5vZGVcIjpicmVhaztkZWZhdWx0OnRocm93IEVycm9yKFwiVW5rbm93biByZW5kZXJNb2RlOiBcIitlKTt9biYmKGMoZixoKSxtLmFmdGVyUmVuZGVyJiZhLnUuRyhtLmFmdGVyUmVuZGVyLG51bGwsW2YsaFttLmFzfHxcIiRkYXRhXCJdXSksXCJyZXBsYWNlQ2hpbGRyZW5cIj09ZSYmYS5pLm1hKGIsYS5pLkgpKTtyZXR1cm4gZn1mdW5jdGlvbiBmKGIsYyxkKXtyZXR1cm4gYS5PKGIpP2IoKTpcImZ1bmN0aW9uXCI9PT10eXBlb2YgYj9iKGMsZCk6Yn12YXIgZzthLmdjPWZ1bmN0aW9uKGIpe2lmKGIhPW4mJiEoYiBpbnN0YW5jZW9mIGEuY2EpKXRocm93IEVycm9yKFwidGVtcGxhdGVFbmdpbmUgbXVzdCBpbmhlcml0IGZyb20ga28udGVtcGxhdGVFbmdpbmVcIik7Zz1ifTthLmRjPWZ1bmN0aW9uKGIsYyxoLG0sdCl7aD1ofHx7fTtpZigoaC50ZW1wbGF0ZUVuZ2luZXx8Zyk9PVxubil0aHJvdyBFcnJvcihcIlNldCBhIHRlbXBsYXRlIGVuZ2luZSBiZWZvcmUgY2FsbGluZyByZW5kZXJUZW1wbGF0ZVwiKTt0PXR8fFwicmVwbGFjZUNoaWxkcmVuXCI7aWYobSl7dmFyIHg9ZChtKTtyZXR1cm4gYS4kKGZ1bmN0aW9uKCl7dmFyIGc9YyYmYyBpbnN0YW5jZW9mIGEuZmE/YzpuZXcgYS5mYShjLG51bGwsbnVsbCxudWxsLHtleHBvcnREZXBlbmRlbmNpZXM6ITB9KSxuPWYoYixnLiRkYXRhLGcpLGc9ZShtLHQsbixnLGgpO1wicmVwbGFjZU5vZGVcIj09dCYmKG09Zyx4PWQobSkpfSxudWxsLHtTYTpmdW5jdGlvbigpe3JldHVybiF4fHwhYS5hLlNiKHgpfSxsOngmJlwicmVwbGFjZU5vZGVcIj09dD94LnBhcmVudE5vZGU6eH0pfXJldHVybiBhLmFhLlhiKGZ1bmN0aW9uKGQpe2EuZGMoYixjLGgsZCxcInJlcGxhY2VOb2RlXCIpfSl9O2EuUWQ9ZnVuY3Rpb24oYixkLGcsaCxtKXtmdW5jdGlvbiB4KGIsYyl7YS51LkcoYS5hLmVjLG51bGwsW2gsYix1LGcscixjXSk7YS5pLm1hKGgsYS5pLkgpfVxuZnVuY3Rpb24gcihhLGIpe2MoYix2KTtnLmFmdGVyUmVuZGVyJiZnLmFmdGVyUmVuZGVyKGIsYSk7dj1udWxsfWZ1bmN0aW9uIHUoYSxjKXt2PW0uY3JlYXRlQ2hpbGRDb250ZXh0KGEse2FzOnosbm9DaGlsZENvbnRleHQ6Zy5ub0NoaWxkQ29udGV4dCxleHRlbmQ6ZnVuY3Rpb24oYSl7YS4kaW5kZXg9Yzt6JiYoYVt6K1wiSW5kZXhcIl09Yyl9fSk7dmFyIGQ9ZihiLGEsdik7cmV0dXJuIGUoaCxcImlnbm9yZVRhcmdldE5vZGVcIixkLHYsZyl9dmFyIHYsej1nLmFzLHc9ITE9PT1nLmluY2x1ZGVEZXN0cm95ZWR8fGEub3B0aW9ucy5mb3JlYWNoSGlkZXNEZXN0cm95ZWQmJiFnLmluY2x1ZGVEZXN0cm95ZWQ7aWYod3x8Zy5iZWZvcmVSZW1vdmV8fCFhLlBjKGQpKXJldHVybiBhLiQoZnVuY3Rpb24oKXt2YXIgYj1hLmEuZihkKXx8W107XCJ1bmRlZmluZWRcIj09dHlwZW9mIGIubGVuZ3RoJiYoYj1bYl0pO3cmJihiPWEuYS5qYihiLGZ1bmN0aW9uKGIpe3JldHVybiBiPT09bnx8bnVsbD09PWJ8fFxuIWEuYS5mKGIuX2Rlc3Ryb3kpfSkpO3goYil9LG51bGwse2w6aH0pO3goZC52KCkpO3ZhciBBPWQuc3Vic2NyaWJlKGZ1bmN0aW9uKGEpe3goZCgpLGEpfSxudWxsLFwiYXJyYXlDaGFuZ2VcIik7QS5sKGgpO3JldHVybiBBfTt2YXIgaD1hLmEuZy5aKCksbT1hLmEuZy5aKCk7YS5jLnRlbXBsYXRlPXtpbml0OmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YS5hLmYoYygpKTtpZihcInN0cmluZ1wiPT10eXBlb2YgZHx8XCJuYW1lXCJpbiBkKWEuaC5FYShiKTtlbHNlIGlmKFwibm9kZXNcImluIGQpe2Q9ZC5ub2Rlc3x8W107aWYoYS5PKGQpKXRocm93IEVycm9yKCdUaGUgXCJub2Rlc1wiIG9wdGlvbiBtdXN0IGJlIGEgcGxhaW4sIG5vbi1vYnNlcnZhYmxlIGFycmF5LicpO3ZhciBlPWRbMF0mJmRbMF0ucGFyZW50Tm9kZTtlJiZhLmEuZy5nZXQoZSxtKXx8KGU9YS5hLlliKGQpLGEuYS5nLnNldChlLG0sITApKTsobmV3IGEuQy5pYShiKSkubm9kZXMoZSl9ZWxzZSBpZihkPWEuaC5jaGlsZE5vZGVzKGIpLDA8ZC5sZW5ndGgpZT1cbmEuYS5ZYihkKSwobmV3IGEuQy5pYShiKSkubm9kZXMoZSk7ZWxzZSB0aHJvdyBFcnJvcihcIkFub255bW91cyB0ZW1wbGF0ZSBkZWZpbmVkLCBidXQgbm8gdGVtcGxhdGUgY29udGVudCB3YXMgcHJvdmlkZWRcIik7cmV0dXJue2NvbnRyb2xzRGVzY2VuZGFudEJpbmRpbmdzOiEwfX0sdXBkYXRlOmZ1bmN0aW9uKGIsYyxkLGUsZil7dmFyIGc9YygpO2M9YS5hLmYoZyk7ZD0hMDtlPW51bGw7XCJzdHJpbmdcIj09dHlwZW9mIGM/Yz17fTooZz1cIm5hbWVcImluIGM/Yy5uYW1lOmIsXCJpZlwiaW4gYyYmKGQ9YS5hLmYoY1tcImlmXCJdKSksZCYmXCJpZm5vdFwiaW4gYyYmKGQ9IWEuYS5mKGMuaWZub3QpKSxkJiYhZyYmKGQ9ITEpKTtcImZvcmVhY2hcImluIGM/ZT1hLlFkKGcsZCYmYy5mb3JlYWNofHxbXSxjLGIsZik6ZD8oZD1mLFwiZGF0YVwiaW4gYyYmKGQ9Zi5jcmVhdGVDaGlsZENvbnRleHQoYy5kYXRhLHthczpjLmFzLG5vQ2hpbGRDb250ZXh0OmMubm9DaGlsZENvbnRleHQsZXhwb3J0RGVwZW5kZW5jaWVzOiEwfSkpLFxuZT1hLmRjKGcsZCxjLGIpKTphLmguRWEoYik7Zj1lOyhjPWEuYS5nLmdldChiLGgpKSYmXCJmdW5jdGlvblwiPT10eXBlb2YgYy5zJiZjLnMoKTthLmEuZy5zZXQoYixoLCFmfHxmLmphJiYhZi5qYSgpP246Zil9fTthLm0uUmEudGVtcGxhdGU9ZnVuY3Rpb24oYil7Yj1hLm0uYWMoYik7cmV0dXJuIDE9PWIubGVuZ3RoJiZiWzBdLnVua25vd258fGEubS5JZChiLFwibmFtZVwiKT9udWxsOlwiVGhpcyB0ZW1wbGF0ZSBlbmdpbmUgZG9lcyBub3Qgc3VwcG9ydCBhbm9ueW1vdXMgdGVtcGxhdGVzIG5lc3RlZCB3aXRoaW4gaXRzIHRlbXBsYXRlc1wifTthLmguZWEudGVtcGxhdGU9ITB9KSgpO2EuYihcInNldFRlbXBsYXRlRW5naW5lXCIsYS5nYyk7YS5iKFwicmVuZGVyVGVtcGxhdGVcIixhLmRjKTthLmEuS2M9ZnVuY3Rpb24oYSxjLGQpe2lmKGEubGVuZ3RoJiZjLmxlbmd0aCl7dmFyIGUsZixnLGgsbTtmb3IoZT1mPTA7KCFkfHxlPGQpJiYoaD1hW2ZdKTsrK2Ype2ZvcihnPTA7bT1jW2ddOysrZylpZihoLnZhbHVlPT09XG5tLnZhbHVlKXtoLm1vdmVkPW0uaW5kZXg7bS5tb3ZlZD1oLmluZGV4O2Muc3BsaWNlKGcsMSk7ZT1nPTA7YnJlYWt9ZSs9Z319fTthLmEuUGI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsZCxlLGYsZyl7dmFyIGg9TWF0aC5taW4sbT1NYXRoLm1heCxrPVtdLGwscD1iLmxlbmd0aCxxLG49ZC5sZW5ndGgscj1uLXB8fDEsdj1wK24rMSx1LHcsejtmb3IobD0wO2w8PXA7bCsrKWZvcih3PXUsay5wdXNoKHU9W10pLHo9aChuLGwrcikscT1tKDAsbC0xKTtxPD16O3ErKyl1W3FdPXE/bD9iW2wtMV09PT1kW3EtMV0/d1txLTFdOmgod1txXXx8dix1W3EtMV18fHYpKzE6cSsxOmwrMTtoPVtdO209W107cj1bXTtsPXA7Zm9yKHE9bjtsfHxxOyluPWtbbF1bcV0tMSxxJiZuPT09a1tsXVtxLTFdP20ucHVzaChoW2gubGVuZ3RoXT17c3RhdHVzOmUsdmFsdWU6ZFstLXFdLGluZGV4OnF9KTpsJiZuPT09a1tsLTFdW3FdP3IucHVzaChoW2gubGVuZ3RoXT17c3RhdHVzOmYsdmFsdWU6YlstLWxdLGluZGV4Omx9KTpcbigtLXEsLS1sLGcuc3BhcnNlfHxoLnB1c2goe3N0YXR1czpcInJldGFpbmVkXCIsdmFsdWU6ZFtxXX0pKTthLmEuS2MocixtLCFnLmRvbnRMaW1pdE1vdmVzJiYxMCpwKTtyZXR1cm4gaC5yZXZlcnNlKCl9cmV0dXJuIGZ1bmN0aW9uKGEsZCxlKXtlPVwiYm9vbGVhblwiPT09dHlwZW9mIGU/e2RvbnRMaW1pdE1vdmVzOmV9OmV8fHt9O2E9YXx8W107ZD1kfHxbXTtyZXR1cm4gYS5sZW5ndGg8ZC5sZW5ndGg/YihhLGQsXCJhZGRlZFwiLFwiZGVsZXRlZFwiLGUpOmIoZCxhLFwiZGVsZXRlZFwiLFwiYWRkZWRcIixlKX19KCk7YS5iKFwidXRpbHMuY29tcGFyZUFycmF5c1wiLGEuYS5QYik7KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiLGMsZCxoLG0pe3ZhciBrPVtdLGw9YS4kKGZ1bmN0aW9uKCl7dmFyIGw9YyhkLG0sYS5hLlVhKGssYikpfHxbXTswPGsubGVuZ3RoJiYoYS5hLlhjKGssbCksaCYmYS51LkcoaCxudWxsLFtkLGwsbV0pKTtrLmxlbmd0aD0wO2EuYS5OYihrLGwpfSxudWxsLHtsOmIsU2E6ZnVuY3Rpb24oKXtyZXR1cm4hYS5hLmtkKGspfX0pO1xucmV0dXJue1k6aywkOmwuamEoKT9sOm59fXZhciBjPWEuYS5nLlooKSxkPWEuYS5nLlooKTthLmEuZWM9ZnVuY3Rpb24oZSxmLGcsaCxtLGspe2Z1bmN0aW9uIGwoYil7eT17QWE6YixwYjphLnRhKHcrKyl9O3YucHVzaCh5KTtyfHxGLnB1c2goeSl9ZnVuY3Rpb24gcChiKXt5PXRbYl07dyE9PXkucGIudigpJiZELnB1c2goeSk7eS5wYih3KyspO2EuYS5VYSh5LlksZSk7di5wdXNoKHkpfWZ1bmN0aW9uIHEoYixjKXtpZihiKWZvcih2YXIgZD0wLGU9Yy5sZW5ndGg7ZDxlO2QrKylhLmEuRChjW2RdLlksZnVuY3Rpb24oYSl7YihhLGQsY1tkXS5BYSl9KX1mPWZ8fFtdO1widW5kZWZpbmVkXCI9PXR5cGVvZiBmLmxlbmd0aCYmKGY9W2ZdKTtoPWh8fHt9O3ZhciB0PWEuYS5nLmdldChlLGMpLHI9IXQsdj1bXSx1PTAsdz0wLHo9W10sQT1bXSxDPVtdLEQ9W10sRj1bXSx5LEk9MDtpZihyKWEuYS5EKGYsbCk7ZWxzZXtpZigha3x8dCYmdC5fY291bnRXYWl0aW5nRm9yUmVtb3ZlKXt2YXIgRT1cbmEuYS5NYih0LGZ1bmN0aW9uKGEpe3JldHVybiBhLkFhfSk7az1hLmEuUGIoRSxmLHtkb250TGltaXRNb3ZlczpoLmRvbnRMaW1pdE1vdmVzLHNwYXJzZTohMH0pfWZvcih2YXIgRT0wLEcsSCxLO0c9a1tFXTtFKyspc3dpdGNoKEg9Ry5tb3ZlZCxLPUcuaW5kZXgsRy5zdGF0dXMpe2Nhc2UgXCJkZWxldGVkXCI6Zm9yKDt1PEs7KXAodSsrKTtIPT09biYmKHk9dFt1XSx5LiQmJih5LiQucygpLHkuJD1uKSxhLmEuVWEoeS5ZLGUpLmxlbmd0aCYmKGguYmVmb3JlUmVtb3ZlJiYodi5wdXNoKHkpLEkrKyx5LkFhPT09ZD95PW51bGw6Qy5wdXNoKHkpKSx5JiZ6LnB1c2guYXBwbHkoeix5LlkpKSk7dSsrO2JyZWFrO2Nhc2UgXCJhZGRlZFwiOmZvcig7dzxLOylwKHUrKyk7SCE9PW4/KEEucHVzaCh2Lmxlbmd0aCkscChIKSk6bChHLnZhbHVlKX1mb3IoO3c8Zi5sZW5ndGg7KXAodSsrKTt2Ll9jb3VudFdhaXRpbmdGb3JSZW1vdmU9SX1hLmEuZy5zZXQoZSxjLHYpO3EoaC5iZWZvcmVNb3ZlLEQpO2EuYS5EKHosXG5oLmJlZm9yZVJlbW92ZT9hLm9hOmEucmVtb3ZlTm9kZSk7dmFyIE0sTyxQO3RyeXtQPWUub3duZXJEb2N1bWVudC5hY3RpdmVFbGVtZW50fWNhdGNoKE4pe31pZihBLmxlbmd0aClmb3IoOyhFPUEuc2hpZnQoKSkhPW47KXt5PXZbRV07Zm9yKE09bjtFOylpZigoTz12Wy0tRV0uWSkmJk8ubGVuZ3RoKXtNPU9bTy5sZW5ndGgtMV07YnJlYWt9Zm9yKGY9MDt1PXkuWVtmXTtNPXUsZisrKWEuaC5XYihlLHUsTSl9Zm9yKEU9MDt5PXZbRV07RSsrKXt5Lll8fGEuYS5leHRlbmQoeSxiKGUsZyx5LkFhLG0seS5wYikpO2ZvcihmPTA7dT15LllbZl07TT11LGYrKylhLmguV2IoZSx1LE0pOyF5LkVkJiZtJiYobSh5LkFhLHkuWSx5LnBiKSx5LkVkPSEwLE09eS5ZW3kuWS5sZW5ndGgtMV0pfVAmJmUub3duZXJEb2N1bWVudC5hY3RpdmVFbGVtZW50IT1QJiZQLmZvY3VzKCk7cShoLmJlZm9yZVJlbW92ZSxDKTtmb3IoRT0wO0U8Qy5sZW5ndGg7KytFKUNbRV0uQWE9ZDtxKGguYWZ0ZXJNb3ZlLEQpO1xucShoLmFmdGVyQWRkLEYpfX0pKCk7YS5iKFwidXRpbHMuc2V0RG9tTm9kZUNoaWxkcmVuRnJvbUFycmF5TWFwcGluZ1wiLGEuYS5lYyk7YS5iYT1mdW5jdGlvbigpe3RoaXMuYWxsb3dUZW1wbGF0ZVJld3JpdGluZz0hMX07YS5iYS5wcm90b3R5cGU9bmV3IGEuY2E7YS5iYS5wcm90b3R5cGUuY29uc3RydWN0b3I9YS5iYTthLmJhLnByb3RvdHlwZS5yZW5kZXJUZW1wbGF0ZVNvdXJjZT1mdW5jdGlvbihiLGMsZCxlKXtpZihjPSg5PmEuYS5XPzA6Yi5ub2Rlcyk/Yi5ub2RlcygpOm51bGwpcmV0dXJuIGEuYS5sYShjLmNsb25lTm9kZSghMCkuY2hpbGROb2Rlcyk7Yj1iLnRleHQoKTtyZXR1cm4gYS5hLnVhKGIsZSl9O2EuYmEuTWE9bmV3IGEuYmE7YS5nYyhhLmJhLk1hKTthLmIoXCJuYXRpdmVUZW1wbGF0ZUVuZ2luZVwiLGEuYmEpOyhmdW5jdGlvbigpe2EuJGE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhkPWZ1bmN0aW9uKCl7aWYoIXZ8fCF2LnRtcGwpcmV0dXJuIDA7dHJ5e2lmKDA8PXYudG1wbC50YWcudG1wbC5vcGVuLnRvU3RyaW5nKCkuaW5kZXhPZihcIl9fXCIpKXJldHVybiAyfWNhdGNoKGEpe31yZXR1cm4gMX0oKTtcbnRoaXMucmVuZGVyVGVtcGxhdGVTb3VyY2U9ZnVuY3Rpb24oYixlLGYsZyl7Zz1nfHx3O2Y9Znx8e307aWYoMj5hKXRocm93IEVycm9yKFwiWW91ciB2ZXJzaW9uIG9mIGpRdWVyeS50bXBsIGlzIHRvbyBvbGQuIFBsZWFzZSB1cGdyYWRlIHRvIGpRdWVyeS50bXBsIDEuMC4wcHJlIG9yIGxhdGVyLlwiKTt2YXIgaD1iLmRhdGEoXCJwcmVjb21waWxlZFwiKTtofHwoaD1iLnRleHQoKXx8XCJcIixoPXYudGVtcGxhdGUobnVsbCxcInt7a29fd2l0aCAkaXRlbS5rb0JpbmRpbmdDb250ZXh0fX1cIitoK1wie3sva29fd2l0aH19XCIpLGIuZGF0YShcInByZWNvbXBpbGVkXCIsaCkpO2I9W2UuJGRhdGFdO2U9di5leHRlbmQoe2tvQmluZGluZ0NvbnRleHQ6ZX0sZi50ZW1wbGF0ZU9wdGlvbnMpO2U9di50bXBsKGgsYixlKTtlLmFwcGVuZFRvKGcuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7di5mcmFnbWVudHM9e307cmV0dXJuIGV9O3RoaXMuY3JlYXRlSmF2YVNjcmlwdEV2YWx1YXRvckJsb2NrPWZ1bmN0aW9uKGEpe3JldHVyblwie3trb19jb2RlICgoZnVuY3Rpb24oKSB7IHJldHVybiBcIitcbmErXCIgfSkoKSkgfX1cIn07dGhpcy5hZGRUZW1wbGF0ZT1mdW5jdGlvbihhLGIpe3cud3JpdGUoXCI8c2NyaXB0IHR5cGU9J3RleHQvaHRtbCcgaWQ9J1wiK2ErXCInPlwiK2IrXCJcXHgzYy9zY3JpcHQ+XCIpfTswPGEmJih2LnRtcGwudGFnLmtvX2NvZGU9e29wZW46XCJfXy5wdXNoKCQxIHx8ICcnKTtcIn0sdi50bXBsLnRhZy5rb193aXRoPXtvcGVuOlwid2l0aCgkMSkge1wiLGNsb3NlOlwifSBcIn0pfTthLiRhLnByb3RvdHlwZT1uZXcgYS5jYTthLiRhLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hLiRhO3ZhciBiPW5ldyBhLiRhOzA8Yi5IZCYmYS5nYyhiKTthLmIoXCJqcXVlcnlUbXBsVGVtcGxhdGVFbmdpbmVcIixhLiRhKX0pKCl9KX0pKCk7fSkoKTtcbiIsIi8qIVxuICogU2lnbmF0dXJlIFBhZCB2Mi4zLjJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zemltZWsvc2lnbmF0dXJlX3BhZFxuICpcbiAqIENvcHlyaWdodCAyMDE3IFN6eW1vbiBOb3dha1xuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKlxuICogVGhlIG1haW4gaWRlYSBhbmQgc29tZSBwYXJ0cyBvZiB0aGUgY29kZSAoZS5nLiBkcmF3aW5nIHZhcmlhYmxlIHdpZHRoIELDqXppZXIgY3VydmUpIGFyZSB0YWtlbiBmcm9tOlxuICogaHR0cDovL2Nvcm5lci5zcXVhcmV1cC5jb20vMjAxMi8wNy9zbW9vdGhlci1zaWduYXR1cmVzLmh0bWxcbiAqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiBpbnRlcnBvbGF0aW9uIHVzaW5nIGN1YmljIELDqXppZXIgY3VydmVzIGlzIHRha2VuIGZyb206XG4gKiBodHRwOi8vYmVua25vd3Njb2RlLndvcmRwcmVzcy5jb20vMjAxMi8wOS8xNC9wYXRoLWludGVycG9sYXRpb24tdXNpbmctY3ViaWMtYmV6aWVyLWFuZC1jb250cm9sLXBvaW50LWVzdGltYXRpb24taW4tamF2YXNjcmlwdFxuICpcbiAqIEFsZ29yaXRobSBmb3IgYXBwcm94aW1hdGVkIGxlbmd0aCBvZiBhIELDqXppZXIgY3VydmUgaXMgdGFrZW4gZnJvbTpcbiAqIGh0dHA6Ly93d3cubGVtb2RhLm5ldC9tYXRocy9iZXppZXItbGVuZ3RoL2luZGV4Lmh0bWxcbiAqXG4gKi9cblxuZnVuY3Rpb24gUG9pbnQoeCwgeSwgdGltZSkge1xuICB0aGlzLnggPSB4O1xuICB0aGlzLnkgPSB5O1xuICB0aGlzLnRpbWUgPSB0aW1lIHx8IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xufVxuXG5Qb2ludC5wcm90b3R5cGUudmVsb2NpdHlGcm9tID0gZnVuY3Rpb24gKHN0YXJ0KSB7XG4gIHJldHVybiB0aGlzLnRpbWUgIT09IHN0YXJ0LnRpbWUgPyB0aGlzLmRpc3RhbmNlVG8oc3RhcnQpIC8gKHRoaXMudGltZSAtIHN0YXJ0LnRpbWUpIDogMTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5kaXN0YW5jZVRvID0gZnVuY3Rpb24gKHN0YXJ0KSB7XG4gIHJldHVybiBNYXRoLnNxcnQoTWF0aC5wb3codGhpcy54IC0gc3RhcnQueCwgMikgKyBNYXRoLnBvdyh0aGlzLnkgLSBzdGFydC55LCAyKSk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gKG90aGVyKSB7XG4gIHJldHVybiB0aGlzLnggPT09IG90aGVyLnggJiYgdGhpcy55ID09PSBvdGhlci55ICYmIHRoaXMudGltZSA9PT0gb3RoZXIudGltZTtcbn07XG5cbmZ1bmN0aW9uIEJlemllcihzdGFydFBvaW50LCBjb250cm9sMSwgY29udHJvbDIsIGVuZFBvaW50KSB7XG4gIHRoaXMuc3RhcnRQb2ludCA9IHN0YXJ0UG9pbnQ7XG4gIHRoaXMuY29udHJvbDEgPSBjb250cm9sMTtcbiAgdGhpcy5jb250cm9sMiA9IGNvbnRyb2wyO1xuICB0aGlzLmVuZFBvaW50ID0gZW5kUG9pbnQ7XG59XG5cbi8vIFJldHVybnMgYXBwcm94aW1hdGVkIGxlbmd0aC5cbkJlemllci5wcm90b3R5cGUubGVuZ3RoID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RlcHMgPSAxMDtcbiAgdmFyIGxlbmd0aCA9IDA7XG4gIHZhciBweCA9IHZvaWQgMDtcbiAgdmFyIHB5ID0gdm9pZCAwO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDw9IHN0ZXBzOyBpICs9IDEpIHtcbiAgICB2YXIgdCA9IGkgLyBzdGVwcztcbiAgICB2YXIgY3ggPSB0aGlzLl9wb2ludCh0LCB0aGlzLnN0YXJ0UG9pbnQueCwgdGhpcy5jb250cm9sMS54LCB0aGlzLmNvbnRyb2wyLngsIHRoaXMuZW5kUG9pbnQueCk7XG4gICAgdmFyIGN5ID0gdGhpcy5fcG9pbnQodCwgdGhpcy5zdGFydFBvaW50LnksIHRoaXMuY29udHJvbDEueSwgdGhpcy5jb250cm9sMi55LCB0aGlzLmVuZFBvaW50LnkpO1xuICAgIGlmIChpID4gMCkge1xuICAgICAgdmFyIHhkaWZmID0gY3ggLSBweDtcbiAgICAgIHZhciB5ZGlmZiA9IGN5IC0gcHk7XG4gICAgICBsZW5ndGggKz0gTWF0aC5zcXJ0KHhkaWZmICogeGRpZmYgKyB5ZGlmZiAqIHlkaWZmKTtcbiAgICB9XG4gICAgcHggPSBjeDtcbiAgICBweSA9IGN5O1xuICB9XG5cbiAgcmV0dXJuIGxlbmd0aDtcbn07XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLW11bHRpLXNwYWNlcywgc3BhY2UtaW4tcGFyZW5zICovXG5CZXppZXIucHJvdG90eXBlLl9wb2ludCA9IGZ1bmN0aW9uICh0LCBzdGFydCwgYzEsIGMyLCBlbmQpIHtcbiAgcmV0dXJuIHN0YXJ0ICogKDEuMCAtIHQpICogKDEuMCAtIHQpICogKDEuMCAtIHQpICsgMy4wICogYzEgKiAoMS4wIC0gdCkgKiAoMS4wIC0gdCkgKiB0ICsgMy4wICogYzIgKiAoMS4wIC0gdCkgKiB0ICogdCArIGVuZCAqIHQgKiB0ICogdDtcbn07XG5cbi8qIGVzbGludC1kaXNhYmxlICovXG5cbi8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzI3MDc4NDAxLzgxNTUwN1xuZnVuY3Rpb24gdGhyb3R0bGUoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICB2YXIgY29udGV4dCwgYXJncywgcmVzdWx0O1xuICB2YXIgdGltZW91dCA9IG51bGw7XG4gIHZhciBwcmV2aW91cyA9IDA7XG4gIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9O1xuICB2YXIgbGF0ZXIgPSBmdW5jdGlvbiBsYXRlcigpIHtcbiAgICBwcmV2aW91cyA9IG9wdGlvbnMubGVhZGluZyA9PT0gZmFsc2UgPyAwIDogRGF0ZS5ub3coKTtcbiAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICByZXN1bHQgPSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgIGlmICghdGltZW91dCkgY29udGV4dCA9IGFyZ3MgPSBudWxsO1xuICB9O1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBub3cgPSBEYXRlLm5vdygpO1xuICAgIGlmICghcHJldmlvdXMgJiYgb3B0aW9ucy5sZWFkaW5nID09PSBmYWxzZSkgcHJldmlvdXMgPSBub3c7XG4gICAgdmFyIHJlbWFpbmluZyA9IHdhaXQgLSAobm93IC0gcHJldmlvdXMpO1xuICAgIGNvbnRleHQgPSB0aGlzO1xuICAgIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgaWYgKHJlbWFpbmluZyA8PSAwIHx8IHJlbWFpbmluZyA+IHdhaXQpIHtcbiAgICAgIGlmICh0aW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgICB9XG4gICAgICBwcmV2aW91cyA9IG5vdztcbiAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICBpZiAoIXRpbWVvdXQpIGNvbnRleHQgPSBhcmdzID0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKCF0aW1lb3V0ICYmIG9wdGlvbnMudHJhaWxpbmcgIT09IGZhbHNlKSB7XG4gICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgcmVtYWluaW5nKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxuZnVuY3Rpb24gU2lnbmF0dXJlUGFkKGNhbnZhcywgb3B0aW9ucykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBvcHRzID0gb3B0aW9ucyB8fCB7fTtcblxuICB0aGlzLnZlbG9jaXR5RmlsdGVyV2VpZ2h0ID0gb3B0cy52ZWxvY2l0eUZpbHRlcldlaWdodCB8fCAwLjc7XG4gIHRoaXMubWluV2lkdGggPSBvcHRzLm1pbldpZHRoIHx8IDAuNTtcbiAgdGhpcy5tYXhXaWR0aCA9IG9wdHMubWF4V2lkdGggfHwgMi41O1xuICB0aGlzLnRocm90dGxlID0gJ3Rocm90dGxlJyBpbiBvcHRzID8gb3B0cy50aHJvdHRsZSA6IDE2OyAvLyBpbiBtaWxpc2Vjb25kc1xuICB0aGlzLm1pbkRpc3RhbmNlID0gJ21pbkRpc3RhbmNlJyBpbiBvcHRzID8gb3B0cy5taW5EaXN0YW5jZSA6IDU7XG5cbiAgaWYgKHRoaXMudGhyb3R0bGUpIHtcbiAgICB0aGlzLl9zdHJva2VNb3ZlVXBkYXRlID0gdGhyb3R0bGUoU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5fc3Ryb2tlVXBkYXRlLCB0aGlzLnRocm90dGxlKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9zdHJva2VNb3ZlVXBkYXRlID0gU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5fc3Ryb2tlVXBkYXRlO1xuICB9XG5cbiAgdGhpcy5kb3RTaXplID0gb3B0cy5kb3RTaXplIHx8IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gKHRoaXMubWluV2lkdGggKyB0aGlzLm1heFdpZHRoKSAvIDI7XG4gIH07XG4gIHRoaXMucGVuQ29sb3IgPSBvcHRzLnBlbkNvbG9yIHx8ICdibGFjayc7XG4gIHRoaXMuYmFja2dyb3VuZENvbG9yID0gb3B0cy5iYWNrZ3JvdW5kQ29sb3IgfHwgJ3JnYmEoMCwwLDAsMCknO1xuICB0aGlzLm9uQmVnaW4gPSBvcHRzLm9uQmVnaW47XG4gIHRoaXMub25FbmQgPSBvcHRzLm9uRW5kO1xuXG4gIHRoaXMuX2NhbnZhcyA9IGNhbnZhcztcbiAgdGhpcy5fY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gIHRoaXMuY2xlYXIoKTtcblxuICAvLyBXZSBuZWVkIGFkZCB0aGVzZSBpbmxpbmUgc28gdGhleSBhcmUgYXZhaWxhYmxlIHRvIHVuYmluZCB3aGlsZSBzdGlsbCBoYXZpbmdcbiAgLy8gYWNjZXNzIHRvICdzZWxmJyB3ZSBjb3VsZCB1c2UgXy5iaW5kIGJ1dCBpdCdzIG5vdCB3b3J0aCBhZGRpbmcgYSBkZXBlbmRlbmN5LlxuICB0aGlzLl9oYW5kbGVNb3VzZURvd24gPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQud2hpY2ggPT09IDEpIHtcbiAgICAgIHNlbGYuX21vdXNlQnV0dG9uRG93biA9IHRydWU7XG4gICAgICBzZWxmLl9zdHJva2VCZWdpbihldmVudCk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuX2hhbmRsZU1vdXNlTW92ZSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmIChzZWxmLl9tb3VzZUJ1dHRvbkRvd24pIHtcbiAgICAgIHNlbGYuX3N0cm9rZU1vdmVVcGRhdGUoZXZlbnQpO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLl9oYW5kbGVNb3VzZVVwID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LndoaWNoID09PSAxICYmIHNlbGYuX21vdXNlQnV0dG9uRG93bikge1xuICAgICAgc2VsZi5fbW91c2VCdXR0b25Eb3duID0gZmFsc2U7XG4gICAgICBzZWxmLl9zdHJva2VFbmQoZXZlbnQpO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLl9oYW5kbGVUb3VjaFN0YXJ0ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnRhcmdldFRvdWNoZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICB2YXIgdG91Y2ggPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXTtcbiAgICAgIHNlbGYuX3N0cm9rZUJlZ2luKHRvdWNoKTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5faGFuZGxlVG91Y2hNb3ZlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gUHJldmVudCBzY3JvbGxpbmcuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIHZhciB0b3VjaCA9IGV2ZW50LnRhcmdldFRvdWNoZXNbMF07XG4gICAgc2VsZi5fc3Ryb2tlTW92ZVVwZGF0ZSh0b3VjaCk7XG4gIH07XG5cbiAgdGhpcy5faGFuZGxlVG91Y2hFbmQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICB2YXIgd2FzQ2FudmFzVG91Y2hlZCA9IGV2ZW50LnRhcmdldCA9PT0gc2VsZi5fY2FudmFzO1xuICAgIGlmICh3YXNDYW52YXNUb3VjaGVkKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc2VsZi5fc3Ryb2tlRW5kKGV2ZW50KTtcbiAgICB9XG4gIH07XG5cbiAgLy8gRW5hYmxlIG1vdXNlIGFuZCB0b3VjaCBldmVudCBoYW5kbGVyc1xuICB0aGlzLm9uKCk7XG59XG5cbi8vIFB1YmxpYyBtZXRob2RzXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICB2YXIgY3R4ID0gdGhpcy5fY3R4O1xuICB2YXIgY2FudmFzID0gdGhpcy5fY2FudmFzO1xuXG4gIGN0eC5maWxsU3R5bGUgPSB0aGlzLmJhY2tncm91bmRDb2xvcjtcbiAgY3R4LmNsZWFyUmVjdCgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xuICBjdHguZmlsbFJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcblxuICB0aGlzLl9kYXRhID0gW107XG4gIHRoaXMuX3Jlc2V0KCk7XG4gIHRoaXMuX2lzRW1wdHkgPSB0cnVlO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5mcm9tRGF0YVVSTCA9IGZ1bmN0aW9uIChkYXRhVXJsKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gIHZhciBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuICB2YXIgcmF0aW8gPSBvcHRpb25zLnJhdGlvIHx8IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG4gIHZhciB3aWR0aCA9IG9wdGlvbnMud2lkdGggfHwgdGhpcy5fY2FudmFzLndpZHRoIC8gcmF0aW87XG4gIHZhciBoZWlnaHQgPSBvcHRpb25zLmhlaWdodCB8fCB0aGlzLl9jYW52YXMuaGVpZ2h0IC8gcmF0aW87XG5cbiAgdGhpcy5fcmVzZXQoKTtcbiAgaW1hZ2Uuc3JjID0gZGF0YVVybDtcbiAgaW1hZ2Uub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgIF90aGlzLl9jdHguZHJhd0ltYWdlKGltYWdlLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgfTtcbiAgdGhpcy5faXNFbXB0eSA9IGZhbHNlO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS50b0RhdGFVUkwgPSBmdW5jdGlvbiAodHlwZSkge1xuICB2YXIgX2NhbnZhcztcblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdpbWFnZS9zdmcreG1sJzpcbiAgICAgIHJldHVybiB0aGlzLl90b1NWRygpO1xuICAgIGRlZmF1bHQ6XG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgb3B0aW9ucyA9IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgb3B0aW9uc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAoX2NhbnZhcyA9IHRoaXMuX2NhbnZhcykudG9EYXRhVVJMLmFwcGx5KF9jYW52YXMsIFt0eXBlXS5jb25jYXQob3B0aW9ucykpO1xuICB9XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl9oYW5kbGVNb3VzZUV2ZW50cygpO1xuICB0aGlzLl9oYW5kbGVUb3VjaEV2ZW50cygpO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5vZmYgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX2NhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9oYW5kbGVNb3VzZURvd24pO1xuICB0aGlzLl9jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5faGFuZGxlTW91c2VNb3ZlKTtcbiAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX2hhbmRsZU1vdXNlVXApO1xuXG4gIHRoaXMuX2NhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5faGFuZGxlVG91Y2hTdGFydCk7XG4gIHRoaXMuX2NhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLl9oYW5kbGVUb3VjaE1vdmUpO1xuICB0aGlzLl9jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLl9oYW5kbGVUb3VjaEVuZCk7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9pc0VtcHR5O1xufTtcblxuLy8gUHJpdmF0ZSBtZXRob2RzXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9zdHJva2VCZWdpbiA9IGZ1bmN0aW9uIChldmVudCkge1xuICB0aGlzLl9kYXRhLnB1c2goW10pO1xuICB0aGlzLl9yZXNldCgpO1xuICB0aGlzLl9zdHJva2VVcGRhdGUoZXZlbnQpO1xuXG4gIGlmICh0eXBlb2YgdGhpcy5vbkJlZ2luID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhpcy5vbkJlZ2luKGV2ZW50KTtcbiAgfVxufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5fc3Ryb2tlVXBkYXRlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gIHZhciB4ID0gZXZlbnQuY2xpZW50WDtcbiAgdmFyIHkgPSBldmVudC5jbGllbnRZO1xuXG4gIHZhciBwb2ludCA9IHRoaXMuX2NyZWF0ZVBvaW50KHgsIHkpO1xuICB2YXIgbGFzdFBvaW50R3JvdXAgPSB0aGlzLl9kYXRhW3RoaXMuX2RhdGEubGVuZ3RoIC0gMV07XG4gIHZhciBsYXN0UG9pbnQgPSBsYXN0UG9pbnRHcm91cCAmJiBsYXN0UG9pbnRHcm91cFtsYXN0UG9pbnRHcm91cC5sZW5ndGggLSAxXTtcbiAgdmFyIGlzTGFzdFBvaW50VG9vQ2xvc2UgPSBsYXN0UG9pbnQgJiYgcG9pbnQuZGlzdGFuY2VUbyhsYXN0UG9pbnQpIDwgdGhpcy5taW5EaXN0YW5jZTtcblxuICAvLyBTa2lwIHRoaXMgcG9pbnQgaWYgaXQncyB0b28gY2xvc2UgdG8gdGhlIHByZXZpb3VzIG9uZVxuICBpZiAoIShsYXN0UG9pbnQgJiYgaXNMYXN0UG9pbnRUb29DbG9zZSkpIHtcbiAgICB2YXIgX2FkZFBvaW50ID0gdGhpcy5fYWRkUG9pbnQocG9pbnQpLFxuICAgICAgICBjdXJ2ZSA9IF9hZGRQb2ludC5jdXJ2ZSxcbiAgICAgICAgd2lkdGhzID0gX2FkZFBvaW50LndpZHRocztcblxuICAgIGlmIChjdXJ2ZSAmJiB3aWR0aHMpIHtcbiAgICAgIHRoaXMuX2RyYXdDdXJ2ZShjdXJ2ZSwgd2lkdGhzLnN0YXJ0LCB3aWR0aHMuZW5kKTtcbiAgICB9XG5cbiAgICB0aGlzLl9kYXRhW3RoaXMuX2RhdGEubGVuZ3RoIC0gMV0ucHVzaCh7XG4gICAgICB4OiBwb2ludC54LFxuICAgICAgeTogcG9pbnQueSxcbiAgICAgIHRpbWU6IHBvaW50LnRpbWUsXG4gICAgICBjb2xvcjogdGhpcy5wZW5Db2xvclxuICAgIH0pO1xuICB9XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9zdHJva2VFbmQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgdmFyIGNhbkRyYXdDdXJ2ZSA9IHRoaXMucG9pbnRzLmxlbmd0aCA+IDI7XG4gIHZhciBwb2ludCA9IHRoaXMucG9pbnRzWzBdOyAvLyBQb2ludCBpbnN0YW5jZVxuXG4gIGlmICghY2FuRHJhd0N1cnZlICYmIHBvaW50KSB7XG4gICAgdGhpcy5fZHJhd0RvdChwb2ludCk7XG4gIH1cblxuICBpZiAocG9pbnQpIHtcbiAgICB2YXIgbGFzdFBvaW50R3JvdXAgPSB0aGlzLl9kYXRhW3RoaXMuX2RhdGEubGVuZ3RoIC0gMV07XG4gICAgdmFyIGxhc3RQb2ludCA9IGxhc3RQb2ludEdyb3VwW2xhc3RQb2ludEdyb3VwLmxlbmd0aCAtIDFdOyAvLyBwbGFpbiBvYmplY3RcblxuICAgIC8vIFdoZW4gZHJhd2luZyBhIGRvdCwgdGhlcmUncyBvbmx5IG9uZSBwb2ludCBpbiBhIGdyb3VwLCBzbyB3aXRob3V0IHRoaXMgY2hlY2tcbiAgICAvLyBzdWNoIGdyb3VwIHdvdWxkIGVuZCB1cCB3aXRoIGV4YWN0bHkgdGhlIHNhbWUgMiBwb2ludHMuXG4gICAgaWYgKCFwb2ludC5lcXVhbHMobGFzdFBvaW50KSkge1xuICAgICAgbGFzdFBvaW50R3JvdXAucHVzaCh7XG4gICAgICAgIHg6IHBvaW50LngsXG4gICAgICAgIHk6IHBvaW50LnksXG4gICAgICAgIHRpbWU6IHBvaW50LnRpbWUsXG4gICAgICAgIGNvbG9yOiB0aGlzLnBlbkNvbG9yXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHRoaXMub25FbmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0aGlzLm9uRW5kKGV2ZW50KTtcbiAgfVxufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5faGFuZGxlTW91c2VFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX21vdXNlQnV0dG9uRG93biA9IGZhbHNlO1xuXG4gIHRoaXMuX2NhbnZhcy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9oYW5kbGVNb3VzZURvd24pO1xuICB0aGlzLl9jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5faGFuZGxlTW91c2VNb3ZlKTtcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX2hhbmRsZU1vdXNlVXApO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5faGFuZGxlVG91Y2hFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIFBhc3MgdG91Y2ggZXZlbnRzIHRvIGNhbnZhcyBlbGVtZW50IG9uIG1vYmlsZSBJRTExIGFuZCBFZGdlLlxuICB0aGlzLl9jYW52YXMuc3R5bGUubXNUb3VjaEFjdGlvbiA9ICdub25lJztcbiAgdGhpcy5fY2FudmFzLnN0eWxlLnRvdWNoQWN0aW9uID0gJ25vbmUnO1xuXG4gIHRoaXMuX2NhbnZhcy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5faGFuZGxlVG91Y2hTdGFydCk7XG4gIHRoaXMuX2NhbnZhcy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLl9oYW5kbGVUb3VjaE1vdmUpO1xuICB0aGlzLl9jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLl9oYW5kbGVUb3VjaEVuZCk7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5wb2ludHMgPSBbXTtcbiAgdGhpcy5fbGFzdFZlbG9jaXR5ID0gMDtcbiAgdGhpcy5fbGFzdFdpZHRoID0gKHRoaXMubWluV2lkdGggKyB0aGlzLm1heFdpZHRoKSAvIDI7XG4gIHRoaXMuX2N0eC5maWxsU3R5bGUgPSB0aGlzLnBlbkNvbG9yO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5fY3JlYXRlUG9pbnQgPSBmdW5jdGlvbiAoeCwgeSwgdGltZSkge1xuICB2YXIgcmVjdCA9IHRoaXMuX2NhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICByZXR1cm4gbmV3IFBvaW50KHggLSByZWN0LmxlZnQsIHkgLSByZWN0LnRvcCwgdGltZSB8fCBuZXcgRGF0ZSgpLmdldFRpbWUoKSk7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9hZGRQb2ludCA9IGZ1bmN0aW9uIChwb2ludCkge1xuICB2YXIgcG9pbnRzID0gdGhpcy5wb2ludHM7XG4gIHZhciB0bXAgPSB2b2lkIDA7XG5cbiAgcG9pbnRzLnB1c2gocG9pbnQpO1xuXG4gIGlmIChwb2ludHMubGVuZ3RoID4gMikge1xuICAgIC8vIFRvIHJlZHVjZSB0aGUgaW5pdGlhbCBsYWcgbWFrZSBpdCB3b3JrIHdpdGggMyBwb2ludHNcbiAgICAvLyBieSBjb3B5aW5nIHRoZSBmaXJzdCBwb2ludCB0byB0aGUgYmVnaW5uaW5nLlxuICAgIGlmIChwb2ludHMubGVuZ3RoID09PSAzKSBwb2ludHMudW5zaGlmdChwb2ludHNbMF0pO1xuXG4gICAgdG1wID0gdGhpcy5fY2FsY3VsYXRlQ3VydmVDb250cm9sUG9pbnRzKHBvaW50c1swXSwgcG9pbnRzWzFdLCBwb2ludHNbMl0pO1xuICAgIHZhciBjMiA9IHRtcC5jMjtcbiAgICB0bXAgPSB0aGlzLl9jYWxjdWxhdGVDdXJ2ZUNvbnRyb2xQb2ludHMocG9pbnRzWzFdLCBwb2ludHNbMl0sIHBvaW50c1szXSk7XG4gICAgdmFyIGMzID0gdG1wLmMxO1xuICAgIHZhciBjdXJ2ZSA9IG5ldyBCZXppZXIocG9pbnRzWzFdLCBjMiwgYzMsIHBvaW50c1syXSk7XG4gICAgdmFyIHdpZHRocyA9IHRoaXMuX2NhbGN1bGF0ZUN1cnZlV2lkdGhzKGN1cnZlKTtcblxuICAgIC8vIFJlbW92ZSB0aGUgZmlyc3QgZWxlbWVudCBmcm9tIHRoZSBsaXN0LFxuICAgIC8vIHNvIHRoYXQgd2UgYWx3YXlzIGhhdmUgbm8gbW9yZSB0aGFuIDQgcG9pbnRzIGluIHBvaW50cyBhcnJheS5cbiAgICBwb2ludHMuc2hpZnQoKTtcblxuICAgIHJldHVybiB7IGN1cnZlOiBjdXJ2ZSwgd2lkdGhzOiB3aWR0aHMgfTtcbiAgfVxuXG4gIHJldHVybiB7fTtcbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX2NhbGN1bGF0ZUN1cnZlQ29udHJvbFBvaW50cyA9IGZ1bmN0aW9uIChzMSwgczIsIHMzKSB7XG4gIHZhciBkeDEgPSBzMS54IC0gczIueDtcbiAgdmFyIGR5MSA9IHMxLnkgLSBzMi55O1xuICB2YXIgZHgyID0gczIueCAtIHMzLng7XG4gIHZhciBkeTIgPSBzMi55IC0gczMueTtcblxuICB2YXIgbTEgPSB7IHg6IChzMS54ICsgczIueCkgLyAyLjAsIHk6IChzMS55ICsgczIueSkgLyAyLjAgfTtcbiAgdmFyIG0yID0geyB4OiAoczIueCArIHMzLngpIC8gMi4wLCB5OiAoczIueSArIHMzLnkpIC8gMi4wIH07XG5cbiAgdmFyIGwxID0gTWF0aC5zcXJ0KGR4MSAqIGR4MSArIGR5MSAqIGR5MSk7XG4gIHZhciBsMiA9IE1hdGguc3FydChkeDIgKiBkeDIgKyBkeTIgKiBkeTIpO1xuXG4gIHZhciBkeG0gPSBtMS54IC0gbTIueDtcbiAgdmFyIGR5bSA9IG0xLnkgLSBtMi55O1xuXG4gIHZhciBrID0gbDIgLyAobDEgKyBsMik7XG4gIHZhciBjbSA9IHsgeDogbTIueCArIGR4bSAqIGssIHk6IG0yLnkgKyBkeW0gKiBrIH07XG5cbiAgdmFyIHR4ID0gczIueCAtIGNtLng7XG4gIHZhciB0eSA9IHMyLnkgLSBjbS55O1xuXG4gIHJldHVybiB7XG4gICAgYzE6IG5ldyBQb2ludChtMS54ICsgdHgsIG0xLnkgKyB0eSksXG4gICAgYzI6IG5ldyBQb2ludChtMi54ICsgdHgsIG0yLnkgKyB0eSlcbiAgfTtcbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX2NhbGN1bGF0ZUN1cnZlV2lkdGhzID0gZnVuY3Rpb24gKGN1cnZlKSB7XG4gIHZhciBzdGFydFBvaW50ID0gY3VydmUuc3RhcnRQb2ludDtcbiAgdmFyIGVuZFBvaW50ID0gY3VydmUuZW5kUG9pbnQ7XG4gIHZhciB3aWR0aHMgPSB7IHN0YXJ0OiBudWxsLCBlbmQ6IG51bGwgfTtcblxuICB2YXIgdmVsb2NpdHkgPSB0aGlzLnZlbG9jaXR5RmlsdGVyV2VpZ2h0ICogZW5kUG9pbnQudmVsb2NpdHlGcm9tKHN0YXJ0UG9pbnQpICsgKDEgLSB0aGlzLnZlbG9jaXR5RmlsdGVyV2VpZ2h0KSAqIHRoaXMuX2xhc3RWZWxvY2l0eTtcblxuICB2YXIgbmV3V2lkdGggPSB0aGlzLl9zdHJva2VXaWR0aCh2ZWxvY2l0eSk7XG5cbiAgd2lkdGhzLnN0YXJ0ID0gdGhpcy5fbGFzdFdpZHRoO1xuICB3aWR0aHMuZW5kID0gbmV3V2lkdGg7XG5cbiAgdGhpcy5fbGFzdFZlbG9jaXR5ID0gdmVsb2NpdHk7XG4gIHRoaXMuX2xhc3RXaWR0aCA9IG5ld1dpZHRoO1xuXG4gIHJldHVybiB3aWR0aHM7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9zdHJva2VXaWR0aCA9IGZ1bmN0aW9uICh2ZWxvY2l0eSkge1xuICByZXR1cm4gTWF0aC5tYXgodGhpcy5tYXhXaWR0aCAvICh2ZWxvY2l0eSArIDEpLCB0aGlzLm1pbldpZHRoKTtcbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX2RyYXdQb2ludCA9IGZ1bmN0aW9uICh4LCB5LCBzaXplKSB7XG4gIHZhciBjdHggPSB0aGlzLl9jdHg7XG5cbiAgY3R4Lm1vdmVUbyh4LCB5KTtcbiAgY3R4LmFyYyh4LCB5LCBzaXplLCAwLCAyICogTWF0aC5QSSwgZmFsc2UpO1xuICB0aGlzLl9pc0VtcHR5ID0gZmFsc2U7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9kcmF3Q3VydmUgPSBmdW5jdGlvbiAoY3VydmUsIHN0YXJ0V2lkdGgsIGVuZFdpZHRoKSB7XG4gIHZhciBjdHggPSB0aGlzLl9jdHg7XG4gIHZhciB3aWR0aERlbHRhID0gZW5kV2lkdGggLSBzdGFydFdpZHRoO1xuICB2YXIgZHJhd1N0ZXBzID0gTWF0aC5mbG9vcihjdXJ2ZS5sZW5ndGgoKSk7XG5cbiAgY3R4LmJlZ2luUGF0aCgpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZHJhd1N0ZXBzOyBpICs9IDEpIHtcbiAgICAvLyBDYWxjdWxhdGUgdGhlIEJlemllciAoeCwgeSkgY29vcmRpbmF0ZSBmb3IgdGhpcyBzdGVwLlxuICAgIHZhciB0ID0gaSAvIGRyYXdTdGVwcztcbiAgICB2YXIgdHQgPSB0ICogdDtcbiAgICB2YXIgdHR0ID0gdHQgKiB0O1xuICAgIHZhciB1ID0gMSAtIHQ7XG4gICAgdmFyIHV1ID0gdSAqIHU7XG4gICAgdmFyIHV1dSA9IHV1ICogdTtcblxuICAgIHZhciB4ID0gdXV1ICogY3VydmUuc3RhcnRQb2ludC54O1xuICAgIHggKz0gMyAqIHV1ICogdCAqIGN1cnZlLmNvbnRyb2wxLng7XG4gICAgeCArPSAzICogdSAqIHR0ICogY3VydmUuY29udHJvbDIueDtcbiAgICB4ICs9IHR0dCAqIGN1cnZlLmVuZFBvaW50Lng7XG5cbiAgICB2YXIgeSA9IHV1dSAqIGN1cnZlLnN0YXJ0UG9pbnQueTtcbiAgICB5ICs9IDMgKiB1dSAqIHQgKiBjdXJ2ZS5jb250cm9sMS55O1xuICAgIHkgKz0gMyAqIHUgKiB0dCAqIGN1cnZlLmNvbnRyb2wyLnk7XG4gICAgeSArPSB0dHQgKiBjdXJ2ZS5lbmRQb2ludC55O1xuXG4gICAgdmFyIHdpZHRoID0gc3RhcnRXaWR0aCArIHR0dCAqIHdpZHRoRGVsdGE7XG4gICAgdGhpcy5fZHJhd1BvaW50KHgsIHksIHdpZHRoKTtcbiAgfVxuXG4gIGN0eC5jbG9zZVBhdGgoKTtcbiAgY3R4LmZpbGwoKTtcbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX2RyYXdEb3QgPSBmdW5jdGlvbiAocG9pbnQpIHtcbiAgdmFyIGN0eCA9IHRoaXMuX2N0eDtcbiAgdmFyIHdpZHRoID0gdHlwZW9mIHRoaXMuZG90U2l6ZSA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMuZG90U2l6ZSgpIDogdGhpcy5kb3RTaXplO1xuXG4gIGN0eC5iZWdpblBhdGgoKTtcbiAgdGhpcy5fZHJhd1BvaW50KHBvaW50LngsIHBvaW50LnksIHdpZHRoKTtcbiAgY3R4LmNsb3NlUGF0aCgpO1xuICBjdHguZmlsbCgpO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5fZnJvbURhdGEgPSBmdW5jdGlvbiAocG9pbnRHcm91cHMsIGRyYXdDdXJ2ZSwgZHJhd0RvdCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50R3JvdXBzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgdmFyIGdyb3VwID0gcG9pbnRHcm91cHNbaV07XG5cbiAgICBpZiAoZ3JvdXAubGVuZ3RoID4gMSkge1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBncm91cC5sZW5ndGg7IGogKz0gMSkge1xuICAgICAgICB2YXIgcmF3UG9pbnQgPSBncm91cFtqXTtcbiAgICAgICAgdmFyIHBvaW50ID0gbmV3IFBvaW50KHJhd1BvaW50LngsIHJhd1BvaW50LnksIHJhd1BvaW50LnRpbWUpO1xuICAgICAgICB2YXIgY29sb3IgPSByYXdQb2ludC5jb2xvcjtcblxuICAgICAgICBpZiAoaiA9PT0gMCkge1xuICAgICAgICAgIC8vIEZpcnN0IHBvaW50IGluIGEgZ3JvdXAuIE5vdGhpbmcgdG8gZHJhdyB5ZXQuXG5cbiAgICAgICAgICAvLyBBbGwgcG9pbnRzIGluIHRoZSBncm91cCBoYXZlIHRoZSBzYW1lIGNvbG9yLCBzbyBpdCdzIGVub3VnaCB0byBzZXRcbiAgICAgICAgICAvLyBwZW5Db2xvciBqdXN0IGF0IHRoZSBiZWdpbm5pbmcuXG4gICAgICAgICAgdGhpcy5wZW5Db2xvciA9IGNvbG9yO1xuICAgICAgICAgIHRoaXMuX3Jlc2V0KCk7XG5cbiAgICAgICAgICB0aGlzLl9hZGRQb2ludChwb2ludCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaiAhPT0gZ3JvdXAubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIC8vIE1pZGRsZSBwb2ludCBpbiBhIGdyb3VwLlxuICAgICAgICAgIHZhciBfYWRkUG9pbnQyID0gdGhpcy5fYWRkUG9pbnQocG9pbnQpLFxuICAgICAgICAgICAgICBjdXJ2ZSA9IF9hZGRQb2ludDIuY3VydmUsXG4gICAgICAgICAgICAgIHdpZHRocyA9IF9hZGRQb2ludDIud2lkdGhzO1xuXG4gICAgICAgICAgaWYgKGN1cnZlICYmIHdpZHRocykge1xuICAgICAgICAgICAgZHJhd0N1cnZlKGN1cnZlLCB3aWR0aHMsIGNvbG9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTGFzdCBwb2ludCBpbiBhIGdyb3VwLiBEbyBub3RoaW5nLlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3Jlc2V0KCk7XG4gICAgICB2YXIgX3Jhd1BvaW50ID0gZ3JvdXBbMF07XG4gICAgICBkcmF3RG90KF9yYXdQb2ludCk7XG4gICAgfVxuICB9XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl90b1NWRyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgdmFyIHBvaW50R3JvdXBzID0gdGhpcy5fZGF0YTtcbiAgdmFyIGNhbnZhcyA9IHRoaXMuX2NhbnZhcztcbiAgdmFyIHJhdGlvID0gTWF0aC5tYXgod2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMSwgMSk7XG4gIHZhciBtaW5YID0gMDtcbiAgdmFyIG1pblkgPSAwO1xuICB2YXIgbWF4WCA9IGNhbnZhcy53aWR0aCAvIHJhdGlvO1xuICB2YXIgbWF4WSA9IGNhbnZhcy5oZWlnaHQgLyByYXRpbztcbiAgdmFyIHN2ZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnc3ZnJyk7XG5cbiAgc3ZnLnNldEF0dHJpYnV0ZU5TKG51bGwsICd3aWR0aCcsIGNhbnZhcy53aWR0aCk7XG4gIHN2Zy5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnaGVpZ2h0JywgY2FudmFzLmhlaWdodCk7XG5cbiAgdGhpcy5fZnJvbURhdGEocG9pbnRHcm91cHMsIGZ1bmN0aW9uIChjdXJ2ZSwgd2lkdGhzLCBjb2xvcikge1xuICAgIHZhciBwYXRoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncGF0aCcpO1xuXG4gICAgLy8gTmVlZCB0byBjaGVjayBjdXJ2ZSBmb3IgTmFOIHZhbHVlcywgdGhlc2UgcG9wIHVwIHdoZW4gZHJhd2luZ1xuICAgIC8vIGxpbmVzIG9uIHRoZSBjYW52YXMgdGhhdCBhcmUgbm90IGNvbnRpbnVvdXMuIEUuZy4gU2hhcnAgY29ybmVyc1xuICAgIC8vIG9yIHN0b3BwaW5nIG1pZC1zdHJva2UgYW5kIHRoYW4gY29udGludWluZyB3aXRob3V0IGxpZnRpbmcgbW91c2UuXG4gICAgaWYgKCFpc05hTihjdXJ2ZS5jb250cm9sMS54KSAmJiAhaXNOYU4oY3VydmUuY29udHJvbDEueSkgJiYgIWlzTmFOKGN1cnZlLmNvbnRyb2wyLngpICYmICFpc05hTihjdXJ2ZS5jb250cm9sMi55KSkge1xuICAgICAgdmFyIGF0dHIgPSAnTSAnICsgY3VydmUuc3RhcnRQb2ludC54LnRvRml4ZWQoMykgKyAnLCcgKyBjdXJ2ZS5zdGFydFBvaW50LnkudG9GaXhlZCgzKSArICcgJyArICgnQyAnICsgY3VydmUuY29udHJvbDEueC50b0ZpeGVkKDMpICsgJywnICsgY3VydmUuY29udHJvbDEueS50b0ZpeGVkKDMpICsgJyAnKSArIChjdXJ2ZS5jb250cm9sMi54LnRvRml4ZWQoMykgKyAnLCcgKyBjdXJ2ZS5jb250cm9sMi55LnRvRml4ZWQoMykgKyAnICcpICsgKGN1cnZlLmVuZFBvaW50LngudG9GaXhlZCgzKSArICcsJyArIGN1cnZlLmVuZFBvaW50LnkudG9GaXhlZCgzKSk7XG5cbiAgICAgIHBhdGguc2V0QXR0cmlidXRlKCdkJywgYXR0cik7XG4gICAgICBwYXRoLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJywgKHdpZHRocy5lbmQgKiAyLjI1KS50b0ZpeGVkKDMpKTtcbiAgICAgIHBhdGguc2V0QXR0cmlidXRlKCdzdHJva2UnLCBjb2xvcik7XG4gICAgICBwYXRoLnNldEF0dHJpYnV0ZSgnZmlsbCcsICdub25lJyk7XG4gICAgICBwYXRoLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLWxpbmVjYXAnLCAncm91bmQnKTtcblxuICAgICAgc3ZnLmFwcGVuZENoaWxkKHBhdGgpO1xuICAgIH1cbiAgfSwgZnVuY3Rpb24gKHJhd1BvaW50KSB7XG4gICAgdmFyIGNpcmNsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NpcmNsZScpO1xuICAgIHZhciBkb3RTaXplID0gdHlwZW9mIF90aGlzMi5kb3RTaXplID09PSAnZnVuY3Rpb24nID8gX3RoaXMyLmRvdFNpemUoKSA6IF90aGlzMi5kb3RTaXplO1xuICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoJ3InLCBkb3RTaXplKTtcbiAgICBjaXJjbGUuc2V0QXR0cmlidXRlKCdjeCcsIHJhd1BvaW50LngpO1xuICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoJ2N5JywgcmF3UG9pbnQueSk7XG4gICAgY2lyY2xlLnNldEF0dHJpYnV0ZSgnZmlsbCcsIHJhd1BvaW50LmNvbG9yKTtcblxuICAgIHN2Zy5hcHBlbmRDaGlsZChjaXJjbGUpO1xuICB9KTtcblxuICB2YXIgcHJlZml4ID0gJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsJztcbiAgdmFyIGhlYWRlciA9ICc8c3ZnJyArICcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiJyArICcgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCInICsgKCcgdmlld0JveD1cIicgKyBtaW5YICsgJyAnICsgbWluWSArICcgJyArIG1heFggKyAnICcgKyBtYXhZICsgJ1wiJykgKyAoJyB3aWR0aD1cIicgKyBtYXhYICsgJ1wiJykgKyAoJyBoZWlnaHQ9XCInICsgbWF4WSArICdcIicpICsgJz4nO1xuICB2YXIgYm9keSA9IHN2Zy5pbm5lckhUTUw7XG5cbiAgLy8gSUUgaGFjayBmb3IgbWlzc2luZyBpbm5lckhUTUwgcHJvcGVydHkgb24gU1ZHRWxlbWVudFxuICBpZiAoYm9keSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIGR1bW15ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZHVtbXknKTtcbiAgICB2YXIgbm9kZXMgPSBzdmcuY2hpbGROb2RlcztcbiAgICBkdW1teS5pbm5lckhUTUwgPSAnJztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGR1bW15LmFwcGVuZENoaWxkKG5vZGVzW2ldLmNsb25lTm9kZSh0cnVlKSk7XG4gICAgfVxuXG4gICAgYm9keSA9IGR1bW15LmlubmVySFRNTDtcbiAgfVxuXG4gIHZhciBmb290ZXIgPSAnPC9zdmc+JztcbiAgdmFyIGRhdGEgPSBoZWFkZXIgKyBib2R5ICsgZm9vdGVyO1xuXG4gIHJldHVybiBwcmVmaXggKyBidG9hKGRhdGEpO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5mcm9tRGF0YSA9IGZ1bmN0aW9uIChwb2ludEdyb3Vwcykge1xuICB2YXIgX3RoaXMzID0gdGhpcztcblxuICB0aGlzLmNsZWFyKCk7XG5cbiAgdGhpcy5fZnJvbURhdGEocG9pbnRHcm91cHMsIGZ1bmN0aW9uIChjdXJ2ZSwgd2lkdGhzKSB7XG4gICAgcmV0dXJuIF90aGlzMy5fZHJhd0N1cnZlKGN1cnZlLCB3aWR0aHMuc3RhcnQsIHdpZHRocy5lbmQpO1xuICB9LCBmdW5jdGlvbiAocmF3UG9pbnQpIHtcbiAgICByZXR1cm4gX3RoaXMzLl9kcmF3RG90KHJhd1BvaW50KTtcbiAgfSk7XG5cbiAgdGhpcy5fZGF0YSA9IHBvaW50R3JvdXBzO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS50b0RhdGEgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9kYXRhO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgU2lnbmF0dXJlUGFkO1xuIiwiLyoqIVxuICogU29ydGFibGUgMS4xMy4wXG4gKiBAYXV0aG9yXHRSdWJhWGEgICA8dHJhc2hAcnViYXhhLm9yZz5cbiAqIEBhdXRob3JcdG93ZW5tICAgIDxvd2VuMjMzNTVAZ21haWwuY29tPlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikge1xuICAgIF90eXBlb2YgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIG9iajtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIF90eXBlb2YgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIF90eXBlb2Yob2JqKTtcbn1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbmZ1bmN0aW9uIF9leHRlbmRzKCkge1xuICBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG5cbiAgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG4gICAgdmFyIG93bktleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuXG4gICAgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBvd25LZXlzID0gb3duS2V5cy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwgc3ltKS5lbnVtZXJhYmxlO1xuICAgICAgfSkpO1xuICAgIH1cblxuICAgIG93bktleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHtcbiAgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307XG4gIHZhciB0YXJnZXQgPSB7fTtcbiAgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICB2YXIga2V5LCBpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAga2V5ID0gc291cmNlS2V5c1tpXTtcbiAgICBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlO1xuICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoc291cmNlLCBleGNsdWRlZCkge1xuICBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTtcblxuICB2YXIgdGFyZ2V0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCk7XG5cbiAgdmFyIGtleSwgaTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzb3VyY2VTeW1ib2xLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGtleSA9IHNvdXJjZVN5bWJvbEtleXNbaV07XG4gICAgICBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlO1xuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTtcbiAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikge1xuICByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpO1xufVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFycikpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShhcnIubGVuZ3RoKTsgaSA8IGFyci5sZW5ndGg7IGkrKykgYXJyMltpXSA9IGFycltpXTtcblxuICAgIHJldHVybiBhcnIyO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikge1xuICBpZiAoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChpdGVyKSB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaXRlcikgPT09IFwiW29iamVjdCBBcmd1bWVudHNdXCIpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpO1xufVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTtcbn1cblxudmFyIHZlcnNpb24gPSBcIjEuMTMuMFwiO1xuXG5mdW5jdGlvbiB1c2VyQWdlbnQocGF0dGVybikge1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lm5hdmlnYXRvcikge1xuICAgIHJldHVybiAhIVxuICAgIC8qQF9fUFVSRV9fKi9cbiAgICBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKHBhdHRlcm4pO1xuICB9XG59XG5cbnZhciBJRTExT3JMZXNzID0gdXNlckFnZW50KC8oPzpUcmlkZW50LipydlsgOl0/MTFcXC58bXNpZXxpZW1vYmlsZXxXaW5kb3dzIFBob25lKS9pKTtcbnZhciBFZGdlID0gdXNlckFnZW50KC9FZGdlL2kpO1xudmFyIEZpcmVGb3ggPSB1c2VyQWdlbnQoL2ZpcmVmb3gvaSk7XG52YXIgU2FmYXJpID0gdXNlckFnZW50KC9zYWZhcmkvaSkgJiYgIXVzZXJBZ2VudCgvY2hyb21lL2kpICYmICF1c2VyQWdlbnQoL2FuZHJvaWQvaSk7XG52YXIgSU9TID0gdXNlckFnZW50KC9pUChhZHxvZHxob25lKS9pKTtcbnZhciBDaHJvbWVGb3JBbmRyb2lkID0gdXNlckFnZW50KC9jaHJvbWUvaSkgJiYgdXNlckFnZW50KC9hbmRyb2lkL2kpO1xuXG52YXIgY2FwdHVyZU1vZGUgPSB7XG4gIGNhcHR1cmU6IGZhbHNlLFxuICBwYXNzaXZlOiBmYWxzZVxufTtcblxuZnVuY3Rpb24gb24oZWwsIGV2ZW50LCBmbikge1xuICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBmbiwgIUlFMTFPckxlc3MgJiYgY2FwdHVyZU1vZGUpO1xufVxuXG5mdW5jdGlvbiBvZmYoZWwsIGV2ZW50LCBmbikge1xuICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBmbiwgIUlFMTFPckxlc3MgJiYgY2FwdHVyZU1vZGUpO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVzKFxuLyoqSFRNTEVsZW1lbnQqL1xuZWwsXG4vKipTdHJpbmcqL1xuc2VsZWN0b3IpIHtcbiAgaWYgKCFzZWxlY3RvcikgcmV0dXJuO1xuICBzZWxlY3RvclswXSA9PT0gJz4nICYmIChzZWxlY3RvciA9IHNlbGVjdG9yLnN1YnN0cmluZygxKSk7XG5cbiAgaWYgKGVsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChlbC5tYXRjaGVzKSB7XG4gICAgICAgIHJldHVybiBlbC5tYXRjaGVzKHNlbGVjdG9yKTtcbiAgICAgIH0gZWxzZSBpZiAoZWwubXNNYXRjaGVzU2VsZWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIGVsLm1zTWF0Y2hlc1NlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgIH0gZWxzZSBpZiAoZWwud2Via2l0TWF0Y2hlc1NlbGVjdG9yKSB7XG4gICAgICAgIHJldHVybiBlbC53ZWJraXRNYXRjaGVzU2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldFBhcmVudE9ySG9zdChlbCkge1xuICByZXR1cm4gZWwuaG9zdCAmJiBlbCAhPT0gZG9jdW1lbnQgJiYgZWwuaG9zdC5ub2RlVHlwZSA/IGVsLmhvc3QgOiBlbC5wYXJlbnROb2RlO1xufVxuXG5mdW5jdGlvbiBjbG9zZXN0KFxuLyoqSFRNTEVsZW1lbnQqL1xuZWwsXG4vKipTdHJpbmcqL1xuc2VsZWN0b3IsXG4vKipIVE1MRWxlbWVudCovXG5jdHgsIGluY2x1ZGVDVFgpIHtcbiAgaWYgKGVsKSB7XG4gICAgY3R4ID0gY3R4IHx8IGRvY3VtZW50O1xuXG4gICAgZG8ge1xuICAgICAgaWYgKHNlbGVjdG9yICE9IG51bGwgJiYgKHNlbGVjdG9yWzBdID09PSAnPicgPyBlbC5wYXJlbnROb2RlID09PSBjdHggJiYgbWF0Y2hlcyhlbCwgc2VsZWN0b3IpIDogbWF0Y2hlcyhlbCwgc2VsZWN0b3IpKSB8fCBpbmNsdWRlQ1RYICYmIGVsID09PSBjdHgpIHtcbiAgICAgICAgcmV0dXJuIGVsO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWwgPT09IGN0eCkgYnJlYWs7XG4gICAgICAvKiBqc2hpbnQgYm9zczp0cnVlICovXG4gICAgfSB3aGlsZSAoZWwgPSBnZXRQYXJlbnRPckhvc3QoZWwpKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgUl9TUEFDRSA9IC9cXHMrL2c7XG5cbmZ1bmN0aW9uIHRvZ2dsZUNsYXNzKGVsLCBuYW1lLCBzdGF0ZSkge1xuICBpZiAoZWwgJiYgbmFtZSkge1xuICAgIGlmIChlbC5jbGFzc0xpc3QpIHtcbiAgICAgIGVsLmNsYXNzTGlzdFtzdGF0ZSA/ICdhZGQnIDogJ3JlbW92ZSddKG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgY2xhc3NOYW1lID0gKCcgJyArIGVsLmNsYXNzTmFtZSArICcgJykucmVwbGFjZShSX1NQQUNFLCAnICcpLnJlcGxhY2UoJyAnICsgbmFtZSArICcgJywgJyAnKTtcbiAgICAgIGVsLmNsYXNzTmFtZSA9IChjbGFzc05hbWUgKyAoc3RhdGUgPyAnICcgKyBuYW1lIDogJycpKS5yZXBsYWNlKFJfU1BBQ0UsICcgJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNzcyhlbCwgcHJvcCwgdmFsKSB7XG4gIHZhciBzdHlsZSA9IGVsICYmIGVsLnN0eWxlO1xuXG4gIGlmIChzdHlsZSkge1xuICAgIGlmICh2YWwgPT09IHZvaWQgMCkge1xuICAgICAgaWYgKGRvY3VtZW50LmRlZmF1bHRWaWV3ICYmIGRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUpIHtcbiAgICAgICAgdmFsID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbCwgJycpO1xuICAgICAgfSBlbHNlIGlmIChlbC5jdXJyZW50U3R5bGUpIHtcbiAgICAgICAgdmFsID0gZWwuY3VycmVudFN0eWxlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJvcCA9PT0gdm9pZCAwID8gdmFsIDogdmFsW3Byb3BdO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIShwcm9wIGluIHN0eWxlKSAmJiBwcm9wLmluZGV4T2YoJ3dlYmtpdCcpID09PSAtMSkge1xuICAgICAgICBwcm9wID0gJy13ZWJraXQtJyArIHByb3A7XG4gICAgICB9XG5cbiAgICAgIHN0eWxlW3Byb3BdID0gdmFsICsgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnID8gJycgOiAncHgnKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbWF0cml4KGVsLCBzZWxmT25seSkge1xuICB2YXIgYXBwbGllZFRyYW5zZm9ybXMgPSAnJztcblxuICBpZiAodHlwZW9mIGVsID09PSAnc3RyaW5nJykge1xuICAgIGFwcGxpZWRUcmFuc2Zvcm1zID0gZWw7XG4gIH0gZWxzZSB7XG4gICAgZG8ge1xuICAgICAgdmFyIHRyYW5zZm9ybSA9IGNzcyhlbCwgJ3RyYW5zZm9ybScpO1xuXG4gICAgICBpZiAodHJhbnNmb3JtICYmIHRyYW5zZm9ybSAhPT0gJ25vbmUnKSB7XG4gICAgICAgIGFwcGxpZWRUcmFuc2Zvcm1zID0gdHJhbnNmb3JtICsgJyAnICsgYXBwbGllZFRyYW5zZm9ybXM7XG4gICAgICB9XG4gICAgICAvKiBqc2hpbnQgYm9zczp0cnVlICovXG5cbiAgICB9IHdoaWxlICghc2VsZk9ubHkgJiYgKGVsID0gZWwucGFyZW50Tm9kZSkpO1xuICB9XG5cbiAgdmFyIG1hdHJpeEZuID0gd2luZG93LkRPTU1hdHJpeCB8fCB3aW5kb3cuV2ViS2l0Q1NTTWF0cml4IHx8IHdpbmRvdy5DU1NNYXRyaXggfHwgd2luZG93Lk1TQ1NTTWF0cml4O1xuICAvKmpzaGludCAtVzA1NiAqL1xuXG4gIHJldHVybiBtYXRyaXhGbiAmJiBuZXcgbWF0cml4Rm4oYXBwbGllZFRyYW5zZm9ybXMpO1xufVxuXG5mdW5jdGlvbiBmaW5kKGN0eCwgdGFnTmFtZSwgaXRlcmF0b3IpIHtcbiAgaWYgKGN0eCkge1xuICAgIHZhciBsaXN0ID0gY3R4LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpLFxuICAgICAgICBpID0gMCxcbiAgICAgICAgbiA9IGxpc3QubGVuZ3RoO1xuXG4gICAgaWYgKGl0ZXJhdG9yKSB7XG4gICAgICBmb3IgKDsgaSA8IG47IGkrKykge1xuICAgICAgICBpdGVyYXRvcihsaXN0W2ldLCBpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGlzdDtcbiAgfVxuXG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpIHtcbiAgdmFyIHNjcm9sbGluZ0VsZW1lbnQgPSBkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50O1xuXG4gIGlmIChzY3JvbGxpbmdFbGVtZW50KSB7XG4gICAgcmV0dXJuIHNjcm9sbGluZ0VsZW1lbnQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgfVxufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBcImJvdW5kaW5nIGNsaWVudCByZWN0XCIgb2YgZ2l2ZW4gZWxlbWVudFxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsICAgICAgICAgICAgICAgICAgICAgICBUaGUgZWxlbWVudCB3aG9zZSBib3VuZGluZ0NsaWVudFJlY3QgaXMgd2FudGVkXG4gKiBAcGFyYW0gIHtbQm9vbGVhbl19IHJlbGF0aXZlVG9Db250YWluaW5nQmxvY2sgIFdoZXRoZXIgdGhlIHJlY3Qgc2hvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZSBjb250YWluaW5nIGJsb2NrIG9mIChpbmNsdWRpbmcpIHRoZSBjb250YWluZXJcbiAqIEBwYXJhbSAge1tCb29sZWFuXX0gcmVsYXRpdmVUb05vblN0YXRpY1BhcmVudCAgV2hldGhlciB0aGUgcmVjdCBzaG91bGQgYmUgcmVsYXRpdmUgdG8gdGhlIHJlbGF0aXZlIHBhcmVudCBvZiAoaW5jbHVkaW5nKSB0aGUgY29udGFpZW5yXG4gKiBAcGFyYW0gIHtbQm9vbGVhbl19IHVuZG9TY2FsZSAgICAgICAgICAgICAgICAgIFdoZXRoZXIgdGhlIGNvbnRhaW5lcidzIHNjYWxlKCkgc2hvdWxkIGJlIHVuZG9uZVxuICogQHBhcmFtICB7W0hUTUxFbGVtZW50XX0gY29udGFpbmVyICAgICAgICAgICAgICBUaGUgcGFyZW50IHRoZSBlbGVtZW50IHdpbGwgYmUgcGxhY2VkIGluXG4gKiBAcmV0dXJuIHtPYmplY3R9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBib3VuZGluZ0NsaWVudFJlY3Qgb2YgZWwsIHdpdGggc3BlY2lmaWVkIGFkanVzdG1lbnRzXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRSZWN0KGVsLCByZWxhdGl2ZVRvQ29udGFpbmluZ0Jsb2NrLCByZWxhdGl2ZVRvTm9uU3RhdGljUGFyZW50LCB1bmRvU2NhbGUsIGNvbnRhaW5lcikge1xuICBpZiAoIWVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCAmJiBlbCAhPT0gd2luZG93KSByZXR1cm47XG4gIHZhciBlbFJlY3QsIHRvcCwgbGVmdCwgYm90dG9tLCByaWdodCwgaGVpZ2h0LCB3aWR0aDtcblxuICBpZiAoZWwgIT09IHdpbmRvdyAmJiBlbC5wYXJlbnROb2RlICYmIGVsICE9PSBnZXRXaW5kb3dTY3JvbGxpbmdFbGVtZW50KCkpIHtcbiAgICBlbFJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB0b3AgPSBlbFJlY3QudG9wO1xuICAgIGxlZnQgPSBlbFJlY3QubGVmdDtcbiAgICBib3R0b20gPSBlbFJlY3QuYm90dG9tO1xuICAgIHJpZ2h0ID0gZWxSZWN0LnJpZ2h0O1xuICAgIGhlaWdodCA9IGVsUmVjdC5oZWlnaHQ7XG4gICAgd2lkdGggPSBlbFJlY3Qud2lkdGg7XG4gIH0gZWxzZSB7XG4gICAgdG9wID0gMDtcbiAgICBsZWZ0ID0gMDtcbiAgICBib3R0b20gPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG4gICAgcmlnaHQgPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICBoZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG4gICAgd2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgfVxuXG4gIGlmICgocmVsYXRpdmVUb0NvbnRhaW5pbmdCbG9jayB8fCByZWxhdGl2ZVRvTm9uU3RhdGljUGFyZW50KSAmJiBlbCAhPT0gd2luZG93KSB7XG4gICAgLy8gQWRqdXN0IGZvciB0cmFuc2xhdGUoKVxuICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lciB8fCBlbC5wYXJlbnROb2RlOyAvLyBzb2x2ZXMgIzExMjMgKHNlZTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM3OTUzODA2LzYwODgzMTIpXG4gICAgLy8gTm90IG5lZWRlZCBvbiA8PSBJRTExXG5cbiAgICBpZiAoIUlFMTFPckxlc3MpIHtcbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKGNvbnRhaW5lciAmJiBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ICYmIChjc3MoY29udGFpbmVyLCAndHJhbnNmb3JtJykgIT09ICdub25lJyB8fCByZWxhdGl2ZVRvTm9uU3RhdGljUGFyZW50ICYmIGNzcyhjb250YWluZXIsICdwb3NpdGlvbicpICE9PSAnc3RhdGljJykpIHtcbiAgICAgICAgICB2YXIgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsgLy8gU2V0IHJlbGF0aXZlIHRvIGVkZ2VzIG9mIHBhZGRpbmcgYm94IG9mIGNvbnRhaW5lclxuXG4gICAgICAgICAgdG9wIC09IGNvbnRhaW5lclJlY3QudG9wICsgcGFyc2VJbnQoY3NzKGNvbnRhaW5lciwgJ2JvcmRlci10b3Atd2lkdGgnKSk7XG4gICAgICAgICAgbGVmdCAtPSBjb250YWluZXJSZWN0LmxlZnQgKyBwYXJzZUludChjc3MoY29udGFpbmVyLCAnYm9yZGVyLWxlZnQtd2lkdGgnKSk7XG4gICAgICAgICAgYm90dG9tID0gdG9wICsgZWxSZWN0LmhlaWdodDtcbiAgICAgICAgICByaWdodCA9IGxlZnQgKyBlbFJlY3Qud2lkdGg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLyoganNoaW50IGJvc3M6dHJ1ZSAqL1xuXG4gICAgICB9IHdoaWxlIChjb250YWluZXIgPSBjb250YWluZXIucGFyZW50Tm9kZSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHVuZG9TY2FsZSAmJiBlbCAhPT0gd2luZG93KSB7XG4gICAgLy8gQWRqdXN0IGZvciBzY2FsZSgpXG4gICAgdmFyIGVsTWF0cml4ID0gbWF0cml4KGNvbnRhaW5lciB8fCBlbCksXG4gICAgICAgIHNjYWxlWCA9IGVsTWF0cml4ICYmIGVsTWF0cml4LmEsXG4gICAgICAgIHNjYWxlWSA9IGVsTWF0cml4ICYmIGVsTWF0cml4LmQ7XG5cbiAgICBpZiAoZWxNYXRyaXgpIHtcbiAgICAgIHRvcCAvPSBzY2FsZVk7XG4gICAgICBsZWZ0IC89IHNjYWxlWDtcbiAgICAgIHdpZHRoIC89IHNjYWxlWDtcbiAgICAgIGhlaWdodCAvPSBzY2FsZVk7XG4gICAgICBib3R0b20gPSB0b3AgKyBoZWlnaHQ7XG4gICAgICByaWdodCA9IGxlZnQgKyB3aWR0aDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHRvcDogdG9wLFxuICAgIGxlZnQ6IGxlZnQsXG4gICAgYm90dG9tOiBib3R0b20sXG4gICAgcmlnaHQ6IHJpZ2h0LFxuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodFxuICB9O1xufVxuLyoqXG4gKiBDaGVja3MgaWYgYSBzaWRlIG9mIGFuIGVsZW1lbnQgaXMgc2Nyb2xsZWQgcGFzdCBhIHNpZGUgb2YgaXRzIHBhcmVudHNcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSAgZWwgICAgICAgICAgIFRoZSBlbGVtZW50IHdobydzIHNpZGUgYmVpbmcgc2Nyb2xsZWQgb3V0IG9mIHZpZXcgaXMgaW4gcXVlc3Rpb25cbiAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgZWxTaWRlICAgICAgIFNpZGUgb2YgdGhlIGVsZW1lbnQgaW4gcXVlc3Rpb24gKCd0b3AnLCAnbGVmdCcsICdyaWdodCcsICdib3R0b20nKVxuICogQHBhcmFtICB7U3RyaW5nfSAgICAgICBwYXJlbnRTaWRlICAgU2lkZSBvZiB0aGUgcGFyZW50IGluIHF1ZXN0aW9uICgndG9wJywgJ2xlZnQnLCAncmlnaHQnLCAnYm90dG9tJylcbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fSAgICAgICAgICAgICAgIFRoZSBwYXJlbnQgc2Nyb2xsIGVsZW1lbnQgdGhhdCB0aGUgZWwncyBzaWRlIGlzIHNjcm9sbGVkIHBhc3QsIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gc3VjaCBlbGVtZW50XG4gKi9cblxuXG5mdW5jdGlvbiBpc1Njcm9sbGVkUGFzdChlbCwgZWxTaWRlLCBwYXJlbnRTaWRlKSB7XG4gIHZhciBwYXJlbnQgPSBnZXRQYXJlbnRBdXRvU2Nyb2xsRWxlbWVudChlbCwgdHJ1ZSksXG4gICAgICBlbFNpZGVWYWwgPSBnZXRSZWN0KGVsKVtlbFNpZGVdO1xuICAvKiBqc2hpbnQgYm9zczp0cnVlICovXG5cbiAgd2hpbGUgKHBhcmVudCkge1xuICAgIHZhciBwYXJlbnRTaWRlVmFsID0gZ2V0UmVjdChwYXJlbnQpW3BhcmVudFNpZGVdLFxuICAgICAgICB2aXNpYmxlID0gdm9pZCAwO1xuXG4gICAgaWYgKHBhcmVudFNpZGUgPT09ICd0b3AnIHx8IHBhcmVudFNpZGUgPT09ICdsZWZ0Jykge1xuICAgICAgdmlzaWJsZSA9IGVsU2lkZVZhbCA+PSBwYXJlbnRTaWRlVmFsO1xuICAgIH0gZWxzZSB7XG4gICAgICB2aXNpYmxlID0gZWxTaWRlVmFsIDw9IHBhcmVudFNpZGVWYWw7XG4gICAgfVxuXG4gICAgaWYgKCF2aXNpYmxlKSByZXR1cm4gcGFyZW50O1xuICAgIGlmIChwYXJlbnQgPT09IGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKSkgYnJlYWs7XG4gICAgcGFyZW50ID0gZ2V0UGFyZW50QXV0b1Njcm9sbEVsZW1lbnQocGFyZW50LCBmYWxzZSk7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG4vKipcbiAqIEdldHMgbnRoIGNoaWxkIG9mIGVsLCBpZ25vcmluZyBoaWRkZW4gY2hpbGRyZW4sIHNvcnRhYmxlJ3MgZWxlbWVudHMgKGRvZXMgbm90IGlnbm9yZSBjbG9uZSBpZiBpdCdzIHZpc2libGUpXG4gKiBhbmQgbm9uLWRyYWdnYWJsZSBlbGVtZW50c1xuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsICAgICAgIFRoZSBwYXJlbnQgZWxlbWVudFxuICogQHBhcmFtICB7TnVtYmVyfSBjaGlsZE51bSAgICAgIFRoZSBpbmRleCBvZiB0aGUgY2hpbGRcbiAqIEBwYXJhbSAge09iamVjdH0gb3B0aW9ucyAgICAgICBQYXJlbnQgU29ydGFibGUncyBvcHRpb25zXG4gKiBAcmV0dXJuIHtIVE1MRWxlbWVudH0gICAgICAgICAgVGhlIGNoaWxkIGF0IGluZGV4IGNoaWxkTnVtLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICovXG5cblxuZnVuY3Rpb24gZ2V0Q2hpbGQoZWwsIGNoaWxkTnVtLCBvcHRpb25zKSB7XG4gIHZhciBjdXJyZW50Q2hpbGQgPSAwLFxuICAgICAgaSA9IDAsXG4gICAgICBjaGlsZHJlbiA9IGVsLmNoaWxkcmVuO1xuXG4gIHdoaWxlIChpIDwgY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgaWYgKGNoaWxkcmVuW2ldLnN0eWxlLmRpc3BsYXkgIT09ICdub25lJyAmJiBjaGlsZHJlbltpXSAhPT0gU29ydGFibGUuZ2hvc3QgJiYgY2hpbGRyZW5baV0gIT09IFNvcnRhYmxlLmRyYWdnZWQgJiYgY2xvc2VzdChjaGlsZHJlbltpXSwgb3B0aW9ucy5kcmFnZ2FibGUsIGVsLCBmYWxzZSkpIHtcbiAgICAgIGlmIChjdXJyZW50Q2hpbGQgPT09IGNoaWxkTnVtKSB7XG4gICAgICAgIHJldHVybiBjaGlsZHJlbltpXTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudENoaWxkKys7XG4gICAgfVxuXG4gICAgaSsrO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIEdldHMgdGhlIGxhc3QgY2hpbGQgaW4gdGhlIGVsLCBpZ25vcmluZyBnaG9zdEVsIG9yIGludmlzaWJsZSBlbGVtZW50cyAoY2xvbmVzKVxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsICAgICAgIFBhcmVudCBlbGVtZW50XG4gKiBAcGFyYW0gIHtzZWxlY3Rvcn0gc2VsZWN0b3IgICAgQW55IG90aGVyIGVsZW1lbnRzIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWRcbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fSAgICAgICAgICBUaGUgbGFzdCBjaGlsZCwgaWdub3JpbmcgZ2hvc3RFbFxuICovXG5cblxuZnVuY3Rpb24gbGFzdENoaWxkKGVsLCBzZWxlY3Rvcikge1xuICB2YXIgbGFzdCA9IGVsLmxhc3RFbGVtZW50Q2hpbGQ7XG5cbiAgd2hpbGUgKGxhc3QgJiYgKGxhc3QgPT09IFNvcnRhYmxlLmdob3N0IHx8IGNzcyhsYXN0LCAnZGlzcGxheScpID09PSAnbm9uZScgfHwgc2VsZWN0b3IgJiYgIW1hdGNoZXMobGFzdCwgc2VsZWN0b3IpKSkge1xuICAgIGxhc3QgPSBsYXN0LnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gIH1cblxuICByZXR1cm4gbGFzdCB8fCBudWxsO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbmRleCBvZiBhbiBlbGVtZW50IHdpdGhpbiBpdHMgcGFyZW50IGZvciBhIHNlbGVjdGVkIHNldCBvZlxuICogZWxlbWVudHNcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBlbFxuICogQHBhcmFtICB7c2VsZWN0b3J9IHNlbGVjdG9yXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cblxuXG5mdW5jdGlvbiBpbmRleChlbCwgc2VsZWN0b3IpIHtcbiAgdmFyIGluZGV4ID0gMDtcblxuICBpZiAoIWVsIHx8ICFlbC5wYXJlbnROb2RlKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIC8qIGpzaGludCBib3NzOnRydWUgKi9cblxuXG4gIHdoaWxlIChlbCA9IGVsLnByZXZpb3VzRWxlbWVudFNpYmxpbmcpIHtcbiAgICBpZiAoZWwubm9kZU5hbWUudG9VcHBlckNhc2UoKSAhPT0gJ1RFTVBMQVRFJyAmJiBlbCAhPT0gU29ydGFibGUuY2xvbmUgJiYgKCFzZWxlY3RvciB8fCBtYXRjaGVzKGVsLCBzZWxlY3RvcikpKSB7XG4gICAgICBpbmRleCsrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpbmRleDtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgc2Nyb2xsIG9mZnNldCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCwgYWRkZWQgd2l0aCBhbGwgdGhlIHNjcm9sbCBvZmZzZXRzIG9mIHBhcmVudCBlbGVtZW50cy5cbiAqIFRoZSB2YWx1ZSBpcyByZXR1cm5lZCBpbiByZWFsIHBpeGVscy5cbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBlbFxuICogQHJldHVybiB7QXJyYXl9ICAgICAgICAgICAgIE9mZnNldHMgaW4gdGhlIGZvcm1hdCBvZiBbbGVmdCwgdG9wXVxuICovXG5cblxuZnVuY3Rpb24gZ2V0UmVsYXRpdmVTY3JvbGxPZmZzZXQoZWwpIHtcbiAgdmFyIG9mZnNldExlZnQgPSAwLFxuICAgICAgb2Zmc2V0VG9wID0gMCxcbiAgICAgIHdpblNjcm9sbGVyID0gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpO1xuXG4gIGlmIChlbCkge1xuICAgIGRvIHtcbiAgICAgIHZhciBlbE1hdHJpeCA9IG1hdHJpeChlbCksXG4gICAgICAgICAgc2NhbGVYID0gZWxNYXRyaXguYSxcbiAgICAgICAgICBzY2FsZVkgPSBlbE1hdHJpeC5kO1xuICAgICAgb2Zmc2V0TGVmdCArPSBlbC5zY3JvbGxMZWZ0ICogc2NhbGVYO1xuICAgICAgb2Zmc2V0VG9wICs9IGVsLnNjcm9sbFRvcCAqIHNjYWxlWTtcbiAgICB9IHdoaWxlIChlbCAhPT0gd2luU2Nyb2xsZXIgJiYgKGVsID0gZWwucGFyZW50Tm9kZSkpO1xuICB9XG5cbiAgcmV0dXJuIFtvZmZzZXRMZWZ0LCBvZmZzZXRUb3BdO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgb2JqZWN0IHdpdGhpbiB0aGUgZ2l2ZW4gYXJyYXlcbiAqIEBwYXJhbSAge0FycmF5fSBhcnIgICBBcnJheSB0aGF0IG1heSBvciBtYXkgbm90IGhvbGQgdGhlIG9iamVjdFxuICogQHBhcmFtICB7T2JqZWN0fSBvYmogIEFuIG9iamVjdCB0aGF0IGhhcyBhIGtleS12YWx1ZSBwYWlyIHVuaXF1ZSB0byBhbmQgaWRlbnRpY2FsIHRvIGEga2V5LXZhbHVlIHBhaXIgaW4gdGhlIG9iamVjdCB5b3Ugd2FudCB0byBmaW5kXG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICAgVGhlIGluZGV4IG9mIHRoZSBvYmplY3QgaW4gdGhlIGFycmF5LCBvciAtMVxuICovXG5cblxuZnVuY3Rpb24gaW5kZXhPZk9iamVjdChhcnIsIG9iaikge1xuICBmb3IgKHZhciBpIGluIGFycikge1xuICAgIGlmICghYXJyLmhhc093blByb3BlcnR5KGkpKSBjb250aW51ZTtcblxuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSAmJiBvYmpba2V5XSA9PT0gYXJyW2ldW2tleV0pIHJldHVybiBOdW1iZXIoaSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xO1xufVxuXG5mdW5jdGlvbiBnZXRQYXJlbnRBdXRvU2Nyb2xsRWxlbWVudChlbCwgaW5jbHVkZVNlbGYpIHtcbiAgLy8gc2tpcCB0byB3aW5kb3dcbiAgaWYgKCFlbCB8fCAhZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KSByZXR1cm4gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpO1xuICB2YXIgZWxlbSA9IGVsO1xuICB2YXIgZ290U2VsZiA9IGZhbHNlO1xuXG4gIGRvIHtcbiAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIGdldCBlbGVtIGNzcyBpZiBpdCBpc24ndCBldmVuIG92ZXJmbG93aW5nIGluIHRoZSBmaXJzdCBwbGFjZSAocGVyZm9ybWFuY2UpXG4gICAgaWYgKGVsZW0uY2xpZW50V2lkdGggPCBlbGVtLnNjcm9sbFdpZHRoIHx8IGVsZW0uY2xpZW50SGVpZ2h0IDwgZWxlbS5zY3JvbGxIZWlnaHQpIHtcbiAgICAgIHZhciBlbGVtQ1NTID0gY3NzKGVsZW0pO1xuXG4gICAgICBpZiAoZWxlbS5jbGllbnRXaWR0aCA8IGVsZW0uc2Nyb2xsV2lkdGggJiYgKGVsZW1DU1Mub3ZlcmZsb3dYID09ICdhdXRvJyB8fCBlbGVtQ1NTLm92ZXJmbG93WCA9PSAnc2Nyb2xsJykgfHwgZWxlbS5jbGllbnRIZWlnaHQgPCBlbGVtLnNjcm9sbEhlaWdodCAmJiAoZWxlbUNTUy5vdmVyZmxvd1kgPT0gJ2F1dG8nIHx8IGVsZW1DU1Mub3ZlcmZsb3dZID09ICdzY3JvbGwnKSkge1xuICAgICAgICBpZiAoIWVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0IHx8IGVsZW0gPT09IGRvY3VtZW50LmJvZHkpIHJldHVybiBnZXRXaW5kb3dTY3JvbGxpbmdFbGVtZW50KCk7XG4gICAgICAgIGlmIChnb3RTZWxmIHx8IGluY2x1ZGVTZWxmKSByZXR1cm4gZWxlbTtcbiAgICAgICAgZ290U2VsZiA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIC8qIGpzaGludCBib3NzOnRydWUgKi9cblxuICB9IHdoaWxlIChlbGVtID0gZWxlbS5wYXJlbnROb2RlKTtcblxuICByZXR1cm4gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpO1xufVxuXG5mdW5jdGlvbiBleHRlbmQoZHN0LCBzcmMpIHtcbiAgaWYgKGRzdCAmJiBzcmMpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgICBpZiAoc3JjLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgZHN0W2tleV0gPSBzcmNba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZHN0O1xufVxuXG5mdW5jdGlvbiBpc1JlY3RFcXVhbChyZWN0MSwgcmVjdDIpIHtcbiAgcmV0dXJuIE1hdGgucm91bmQocmVjdDEudG9wKSA9PT0gTWF0aC5yb3VuZChyZWN0Mi50b3ApICYmIE1hdGgucm91bmQocmVjdDEubGVmdCkgPT09IE1hdGgucm91bmQocmVjdDIubGVmdCkgJiYgTWF0aC5yb3VuZChyZWN0MS5oZWlnaHQpID09PSBNYXRoLnJvdW5kKHJlY3QyLmhlaWdodCkgJiYgTWF0aC5yb3VuZChyZWN0MS53aWR0aCkgPT09IE1hdGgucm91bmQocmVjdDIud2lkdGgpO1xufVxuXG52YXIgX3Rocm90dGxlVGltZW91dDtcblxuZnVuY3Rpb24gdGhyb3R0bGUoY2FsbGJhY2ssIG1zKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFfdGhyb3R0bGVUaW1lb3V0KSB7XG4gICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjYWxsYmFjay5jYWxsKF90aGlzLCBhcmdzWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrLmFwcGx5KF90aGlzLCBhcmdzKTtcbiAgICAgIH1cblxuICAgICAgX3Rocm90dGxlVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhyb3R0bGVUaW1lb3V0ID0gdm9pZCAwO1xuICAgICAgfSwgbXMpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gY2FuY2VsVGhyb3R0bGUoKSB7XG4gIGNsZWFyVGltZW91dChfdGhyb3R0bGVUaW1lb3V0KTtcbiAgX3Rocm90dGxlVGltZW91dCA9IHZvaWQgMDtcbn1cblxuZnVuY3Rpb24gc2Nyb2xsQnkoZWwsIHgsIHkpIHtcbiAgZWwuc2Nyb2xsTGVmdCArPSB4O1xuICBlbC5zY3JvbGxUb3AgKz0geTtcbn1cblxuZnVuY3Rpb24gY2xvbmUoZWwpIHtcbiAgdmFyIFBvbHltZXIgPSB3aW5kb3cuUG9seW1lcjtcbiAgdmFyICQgPSB3aW5kb3cualF1ZXJ5IHx8IHdpbmRvdy5aZXB0bztcblxuICBpZiAoUG9seW1lciAmJiBQb2x5bWVyLmRvbSkge1xuICAgIHJldHVybiBQb2x5bWVyLmRvbShlbCkuY2xvbmVOb2RlKHRydWUpO1xuICB9IGVsc2UgaWYgKCQpIHtcbiAgICByZXR1cm4gJChlbCkuY2xvbmUodHJ1ZSlbMF07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGVsLmNsb25lTm9kZSh0cnVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRSZWN0KGVsLCByZWN0KSB7XG4gIGNzcyhlbCwgJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJyk7XG4gIGNzcyhlbCwgJ3RvcCcsIHJlY3QudG9wKTtcbiAgY3NzKGVsLCAnbGVmdCcsIHJlY3QubGVmdCk7XG4gIGNzcyhlbCwgJ3dpZHRoJywgcmVjdC53aWR0aCk7XG4gIGNzcyhlbCwgJ2hlaWdodCcsIHJlY3QuaGVpZ2h0KTtcbn1cblxuZnVuY3Rpb24gdW5zZXRSZWN0KGVsKSB7XG4gIGNzcyhlbCwgJ3Bvc2l0aW9uJywgJycpO1xuICBjc3MoZWwsICd0b3AnLCAnJyk7XG4gIGNzcyhlbCwgJ2xlZnQnLCAnJyk7XG4gIGNzcyhlbCwgJ3dpZHRoJywgJycpO1xuICBjc3MoZWwsICdoZWlnaHQnLCAnJyk7XG59XG5cbnZhciBleHBhbmRvID0gJ1NvcnRhYmxlJyArIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuXG5mdW5jdGlvbiBBbmltYXRpb25TdGF0ZU1hbmFnZXIoKSB7XG4gIHZhciBhbmltYXRpb25TdGF0ZXMgPSBbXSxcbiAgICAgIGFuaW1hdGlvbkNhbGxiYWNrSWQ7XG4gIHJldHVybiB7XG4gICAgY2FwdHVyZUFuaW1hdGlvblN0YXRlOiBmdW5jdGlvbiBjYXB0dXJlQW5pbWF0aW9uU3RhdGUoKSB7XG4gICAgICBhbmltYXRpb25TdGF0ZXMgPSBbXTtcbiAgICAgIGlmICghdGhpcy5vcHRpb25zLmFuaW1hdGlvbikgcmV0dXJuO1xuICAgICAgdmFyIGNoaWxkcmVuID0gW10uc2xpY2UuY2FsbCh0aGlzLmVsLmNoaWxkcmVuKTtcbiAgICAgIGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIGlmIChjc3MoY2hpbGQsICdkaXNwbGF5JykgPT09ICdub25lJyB8fCBjaGlsZCA9PT0gU29ydGFibGUuZ2hvc3QpIHJldHVybjtcbiAgICAgICAgYW5pbWF0aW9uU3RhdGVzLnB1c2goe1xuICAgICAgICAgIHRhcmdldDogY2hpbGQsXG4gICAgICAgICAgcmVjdDogZ2V0UmVjdChjaGlsZClcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIGZyb21SZWN0ID0gX29iamVjdFNwcmVhZCh7fSwgYW5pbWF0aW9uU3RhdGVzW2FuaW1hdGlvblN0YXRlcy5sZW5ndGggLSAxXS5yZWN0KTsgLy8gSWYgYW5pbWF0aW5nOiBjb21wZW5zYXRlIGZvciBjdXJyZW50IGFuaW1hdGlvblxuXG5cbiAgICAgICAgaWYgKGNoaWxkLnRoaXNBbmltYXRpb25EdXJhdGlvbikge1xuICAgICAgICAgIHZhciBjaGlsZE1hdHJpeCA9IG1hdHJpeChjaGlsZCwgdHJ1ZSk7XG5cbiAgICAgICAgICBpZiAoY2hpbGRNYXRyaXgpIHtcbiAgICAgICAgICAgIGZyb21SZWN0LnRvcCAtPSBjaGlsZE1hdHJpeC5mO1xuICAgICAgICAgICAgZnJvbVJlY3QubGVmdCAtPSBjaGlsZE1hdHJpeC5lO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkLmZyb21SZWN0ID0gZnJvbVJlY3Q7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGFkZEFuaW1hdGlvblN0YXRlOiBmdW5jdGlvbiBhZGRBbmltYXRpb25TdGF0ZShzdGF0ZSkge1xuICAgICAgYW5pbWF0aW9uU3RhdGVzLnB1c2goc3RhdGUpO1xuICAgIH0sXG4gICAgcmVtb3ZlQW5pbWF0aW9uU3RhdGU6IGZ1bmN0aW9uIHJlbW92ZUFuaW1hdGlvblN0YXRlKHRhcmdldCkge1xuICAgICAgYW5pbWF0aW9uU3RhdGVzLnNwbGljZShpbmRleE9mT2JqZWN0KGFuaW1hdGlvblN0YXRlcywge1xuICAgICAgICB0YXJnZXQ6IHRhcmdldFxuICAgICAgfSksIDEpO1xuICAgIH0sXG4gICAgYW5pbWF0ZUFsbDogZnVuY3Rpb24gYW5pbWF0ZUFsbChjYWxsYmFjaykge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYW5pbWF0aW9uKSB7XG4gICAgICAgIGNsZWFyVGltZW91dChhbmltYXRpb25DYWxsYmFja0lkKTtcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykgY2FsbGJhY2soKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgYW5pbWF0aW5nID0gZmFsc2UsXG4gICAgICAgICAgYW5pbWF0aW9uVGltZSA9IDA7XG4gICAgICBhbmltYXRpb25TdGF0ZXMuZm9yRWFjaChmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgdmFyIHRpbWUgPSAwLFxuICAgICAgICAgICAgdGFyZ2V0ID0gc3RhdGUudGFyZ2V0LFxuICAgICAgICAgICAgZnJvbVJlY3QgPSB0YXJnZXQuZnJvbVJlY3QsXG4gICAgICAgICAgICB0b1JlY3QgPSBnZXRSZWN0KHRhcmdldCksXG4gICAgICAgICAgICBwcmV2RnJvbVJlY3QgPSB0YXJnZXQucHJldkZyb21SZWN0LFxuICAgICAgICAgICAgcHJldlRvUmVjdCA9IHRhcmdldC5wcmV2VG9SZWN0LFxuICAgICAgICAgICAgYW5pbWF0aW5nUmVjdCA9IHN0YXRlLnJlY3QsXG4gICAgICAgICAgICB0YXJnZXRNYXRyaXggPSBtYXRyaXgodGFyZ2V0LCB0cnVlKTtcblxuICAgICAgICBpZiAodGFyZ2V0TWF0cml4KSB7XG4gICAgICAgICAgLy8gQ29tcGVuc2F0ZSBmb3IgY3VycmVudCBhbmltYXRpb25cbiAgICAgICAgICB0b1JlY3QudG9wIC09IHRhcmdldE1hdHJpeC5mO1xuICAgICAgICAgIHRvUmVjdC5sZWZ0IC09IHRhcmdldE1hdHJpeC5lO1xuICAgICAgICB9XG5cbiAgICAgICAgdGFyZ2V0LnRvUmVjdCA9IHRvUmVjdDtcblxuICAgICAgICBpZiAodGFyZ2V0LnRoaXNBbmltYXRpb25EdXJhdGlvbikge1xuICAgICAgICAgIC8vIENvdWxkIGFsc28gY2hlY2sgaWYgYW5pbWF0aW5nUmVjdCBpcyBiZXR3ZWVuIGZyb21SZWN0IGFuZCB0b1JlY3RcbiAgICAgICAgICBpZiAoaXNSZWN0RXF1YWwocHJldkZyb21SZWN0LCB0b1JlY3QpICYmICFpc1JlY3RFcXVhbChmcm9tUmVjdCwgdG9SZWN0KSAmJiAvLyBNYWtlIHN1cmUgYW5pbWF0aW5nUmVjdCBpcyBvbiBsaW5lIGJldHdlZW4gdG9SZWN0ICYgZnJvbVJlY3RcbiAgICAgICAgICAoYW5pbWF0aW5nUmVjdC50b3AgLSB0b1JlY3QudG9wKSAvIChhbmltYXRpbmdSZWN0LmxlZnQgLSB0b1JlY3QubGVmdCkgPT09IChmcm9tUmVjdC50b3AgLSB0b1JlY3QudG9wKSAvIChmcm9tUmVjdC5sZWZ0IC0gdG9SZWN0LmxlZnQpKSB7XG4gICAgICAgICAgICAvLyBJZiByZXR1cm5pbmcgdG8gc2FtZSBwbGFjZSBhcyBzdGFydGVkIGZyb20gYW5pbWF0aW9uIGFuZCBvbiBzYW1lIGF4aXNcbiAgICAgICAgICAgIHRpbWUgPSBjYWxjdWxhdGVSZWFsVGltZShhbmltYXRpbmdSZWN0LCBwcmV2RnJvbVJlY3QsIHByZXZUb1JlY3QsIF90aGlzLm9wdGlvbnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBpZiBmcm9tUmVjdCAhPSB0b1JlY3Q6IGFuaW1hdGVcblxuXG4gICAgICAgIGlmICghaXNSZWN0RXF1YWwodG9SZWN0LCBmcm9tUmVjdCkpIHtcbiAgICAgICAgICB0YXJnZXQucHJldkZyb21SZWN0ID0gZnJvbVJlY3Q7XG4gICAgICAgICAgdGFyZ2V0LnByZXZUb1JlY3QgPSB0b1JlY3Q7XG5cbiAgICAgICAgICBpZiAoIXRpbWUpIHtcbiAgICAgICAgICAgIHRpbWUgPSBfdGhpcy5vcHRpb25zLmFuaW1hdGlvbjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfdGhpcy5hbmltYXRlKHRhcmdldCwgYW5pbWF0aW5nUmVjdCwgdG9SZWN0LCB0aW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aW1lKSB7XG4gICAgICAgICAgYW5pbWF0aW5nID0gdHJ1ZTtcbiAgICAgICAgICBhbmltYXRpb25UaW1lID0gTWF0aC5tYXgoYW5pbWF0aW9uVGltZSwgdGltZSk7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRhcmdldC5hbmltYXRpb25SZXNldFRpbWVyKTtcbiAgICAgICAgICB0YXJnZXQuYW5pbWF0aW9uUmVzZXRUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGFyZ2V0LmFuaW1hdGlvblRpbWUgPSAwO1xuICAgICAgICAgICAgdGFyZ2V0LnByZXZGcm9tUmVjdCA9IG51bGw7XG4gICAgICAgICAgICB0YXJnZXQuZnJvbVJlY3QgPSBudWxsO1xuICAgICAgICAgICAgdGFyZ2V0LnByZXZUb1JlY3QgPSBudWxsO1xuICAgICAgICAgICAgdGFyZ2V0LnRoaXNBbmltYXRpb25EdXJhdGlvbiA9IG51bGw7XG4gICAgICAgICAgfSwgdGltZSk7XG4gICAgICAgICAgdGFyZ2V0LnRoaXNBbmltYXRpb25EdXJhdGlvbiA9IHRpbWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY2xlYXJUaW1lb3V0KGFuaW1hdGlvbkNhbGxiYWNrSWQpO1xuXG4gICAgICBpZiAoIWFuaW1hdGluZykge1xuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSBjYWxsYmFjaygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYW5pbWF0aW9uQ2FsbGJhY2tJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIGNhbGxiYWNrKCk7XG4gICAgICAgIH0sIGFuaW1hdGlvblRpbWUpO1xuICAgICAgfVxuXG4gICAgICBhbmltYXRpb25TdGF0ZXMgPSBbXTtcbiAgICB9LFxuICAgIGFuaW1hdGU6IGZ1bmN0aW9uIGFuaW1hdGUodGFyZ2V0LCBjdXJyZW50UmVjdCwgdG9SZWN0LCBkdXJhdGlvbikge1xuICAgICAgaWYgKGR1cmF0aW9uKSB7XG4gICAgICAgIGNzcyh0YXJnZXQsICd0cmFuc2l0aW9uJywgJycpO1xuICAgICAgICBjc3ModGFyZ2V0LCAndHJhbnNmb3JtJywgJycpO1xuICAgICAgICB2YXIgZWxNYXRyaXggPSBtYXRyaXgodGhpcy5lbCksXG4gICAgICAgICAgICBzY2FsZVggPSBlbE1hdHJpeCAmJiBlbE1hdHJpeC5hLFxuICAgICAgICAgICAgc2NhbGVZID0gZWxNYXRyaXggJiYgZWxNYXRyaXguZCxcbiAgICAgICAgICAgIHRyYW5zbGF0ZVggPSAoY3VycmVudFJlY3QubGVmdCAtIHRvUmVjdC5sZWZ0KSAvIChzY2FsZVggfHwgMSksXG4gICAgICAgICAgICB0cmFuc2xhdGVZID0gKGN1cnJlbnRSZWN0LnRvcCAtIHRvUmVjdC50b3ApIC8gKHNjYWxlWSB8fCAxKTtcbiAgICAgICAgdGFyZ2V0LmFuaW1hdGluZ1ggPSAhIXRyYW5zbGF0ZVg7XG4gICAgICAgIHRhcmdldC5hbmltYXRpbmdZID0gISF0cmFuc2xhdGVZO1xuICAgICAgICBjc3ModGFyZ2V0LCAndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZTNkKCcgKyB0cmFuc2xhdGVYICsgJ3B4LCcgKyB0cmFuc2xhdGVZICsgJ3B4LDApJyk7XG4gICAgICAgIHRoaXMuZm9yUmVwYWludER1bW15ID0gcmVwYWludCh0YXJnZXQpOyAvLyByZXBhaW50XG5cbiAgICAgICAgY3NzKHRhcmdldCwgJ3RyYW5zaXRpb24nLCAndHJhbnNmb3JtICcgKyBkdXJhdGlvbiArICdtcycgKyAodGhpcy5vcHRpb25zLmVhc2luZyA/ICcgJyArIHRoaXMub3B0aW9ucy5lYXNpbmcgOiAnJykpO1xuICAgICAgICBjc3ModGFyZ2V0LCAndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZTNkKDAsMCwwKScpO1xuICAgICAgICB0eXBlb2YgdGFyZ2V0LmFuaW1hdGVkID09PSAnbnVtYmVyJyAmJiBjbGVhclRpbWVvdXQodGFyZ2V0LmFuaW1hdGVkKTtcbiAgICAgICAgdGFyZ2V0LmFuaW1hdGVkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY3NzKHRhcmdldCwgJ3RyYW5zaXRpb24nLCAnJyk7XG4gICAgICAgICAgY3NzKHRhcmdldCwgJ3RyYW5zZm9ybScsICcnKTtcbiAgICAgICAgICB0YXJnZXQuYW5pbWF0ZWQgPSBmYWxzZTtcbiAgICAgICAgICB0YXJnZXQuYW5pbWF0aW5nWCA9IGZhbHNlO1xuICAgICAgICAgIHRhcmdldC5hbmltYXRpbmdZID0gZmFsc2U7XG4gICAgICAgIH0sIGR1cmF0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlcGFpbnQodGFyZ2V0KSB7XG4gIHJldHVybiB0YXJnZXQub2Zmc2V0V2lkdGg7XG59XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZVJlYWxUaW1lKGFuaW1hdGluZ1JlY3QsIGZyb21SZWN0LCB0b1JlY3QsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyhmcm9tUmVjdC50b3AgLSBhbmltYXRpbmdSZWN0LnRvcCwgMikgKyBNYXRoLnBvdyhmcm9tUmVjdC5sZWZ0IC0gYW5pbWF0aW5nUmVjdC5sZWZ0LCAyKSkgLyBNYXRoLnNxcnQoTWF0aC5wb3coZnJvbVJlY3QudG9wIC0gdG9SZWN0LnRvcCwgMikgKyBNYXRoLnBvdyhmcm9tUmVjdC5sZWZ0IC0gdG9SZWN0LmxlZnQsIDIpKSAqIG9wdGlvbnMuYW5pbWF0aW9uO1xufVxuXG52YXIgcGx1Z2lucyA9IFtdO1xudmFyIGRlZmF1bHRzID0ge1xuICBpbml0aWFsaXplQnlEZWZhdWx0OiB0cnVlXG59O1xudmFyIFBsdWdpbk1hbmFnZXIgPSB7XG4gIG1vdW50OiBmdW5jdGlvbiBtb3VudChwbHVnaW4pIHtcbiAgICAvLyBTZXQgZGVmYXVsdCBzdGF0aWMgcHJvcGVydGllc1xuICAgIGZvciAodmFyIG9wdGlvbiBpbiBkZWZhdWx0cykge1xuICAgICAgaWYgKGRlZmF1bHRzLmhhc093blByb3BlcnR5KG9wdGlvbikgJiYgIShvcHRpb24gaW4gcGx1Z2luKSkge1xuICAgICAgICBwbHVnaW5bb3B0aW9uXSA9IGRlZmF1bHRzW29wdGlvbl07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGx1Z2lucy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICBpZiAocC5wbHVnaW5OYW1lID09PSBwbHVnaW4ucGx1Z2luTmFtZSkge1xuICAgICAgICB0aHJvdyBcIlNvcnRhYmxlOiBDYW5ub3QgbW91bnQgcGx1Z2luIFwiLmNvbmNhdChwbHVnaW4ucGx1Z2luTmFtZSwgXCIgbW9yZSB0aGFuIG9uY2VcIik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcGx1Z2lucy5wdXNoKHBsdWdpbik7XG4gIH0sXG4gIHBsdWdpbkV2ZW50OiBmdW5jdGlvbiBwbHVnaW5FdmVudChldmVudE5hbWUsIHNvcnRhYmxlLCBldnQpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdGhpcy5ldmVudENhbmNlbGVkID0gZmFsc2U7XG5cbiAgICBldnQuY2FuY2VsID0gZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMuZXZlbnRDYW5jZWxlZCA9IHRydWU7XG4gICAgfTtcblxuICAgIHZhciBldmVudE5hbWVHbG9iYWwgPSBldmVudE5hbWUgKyAnR2xvYmFsJztcbiAgICBwbHVnaW5zLmZvckVhY2goZnVuY3Rpb24gKHBsdWdpbikge1xuICAgICAgaWYgKCFzb3J0YWJsZVtwbHVnaW4ucGx1Z2luTmFtZV0pIHJldHVybjsgLy8gRmlyZSBnbG9iYWwgZXZlbnRzIGlmIGl0IGV4aXN0cyBpbiB0aGlzIHNvcnRhYmxlXG5cbiAgICAgIGlmIChzb3J0YWJsZVtwbHVnaW4ucGx1Z2luTmFtZV1bZXZlbnROYW1lR2xvYmFsXSkge1xuICAgICAgICBzb3J0YWJsZVtwbHVnaW4ucGx1Z2luTmFtZV1bZXZlbnROYW1lR2xvYmFsXShfb2JqZWN0U3ByZWFkKHtcbiAgICAgICAgICBzb3J0YWJsZTogc29ydGFibGVcbiAgICAgICAgfSwgZXZ0KSk7XG4gICAgICB9IC8vIE9ubHkgZmlyZSBwbHVnaW4gZXZlbnQgaWYgcGx1Z2luIGlzIGVuYWJsZWQgaW4gdGhpcyBzb3J0YWJsZSxcbiAgICAgIC8vIGFuZCBwbHVnaW4gaGFzIGV2ZW50IGRlZmluZWRcblxuXG4gICAgICBpZiAoc29ydGFibGUub3B0aW9uc1twbHVnaW4ucGx1Z2luTmFtZV0gJiYgc29ydGFibGVbcGx1Z2luLnBsdWdpbk5hbWVdW2V2ZW50TmFtZV0pIHtcbiAgICAgICAgc29ydGFibGVbcGx1Z2luLnBsdWdpbk5hbWVdW2V2ZW50TmFtZV0oX29iamVjdFNwcmVhZCh7XG4gICAgICAgICAgc29ydGFibGU6IHNvcnRhYmxlXG4gICAgICAgIH0sIGV2dCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuICBpbml0aWFsaXplUGx1Z2luczogZnVuY3Rpb24gaW5pdGlhbGl6ZVBsdWdpbnMoc29ydGFibGUsIGVsLCBkZWZhdWx0cywgb3B0aW9ucykge1xuICAgIHBsdWdpbnMuZm9yRWFjaChmdW5jdGlvbiAocGx1Z2luKSB7XG4gICAgICB2YXIgcGx1Z2luTmFtZSA9IHBsdWdpbi5wbHVnaW5OYW1lO1xuICAgICAgaWYgKCFzb3J0YWJsZS5vcHRpb25zW3BsdWdpbk5hbWVdICYmICFwbHVnaW4uaW5pdGlhbGl6ZUJ5RGVmYXVsdCkgcmV0dXJuO1xuICAgICAgdmFyIGluaXRpYWxpemVkID0gbmV3IHBsdWdpbihzb3J0YWJsZSwgZWwsIHNvcnRhYmxlLm9wdGlvbnMpO1xuICAgICAgaW5pdGlhbGl6ZWQuc29ydGFibGUgPSBzb3J0YWJsZTtcbiAgICAgIGluaXRpYWxpemVkLm9wdGlvbnMgPSBzb3J0YWJsZS5vcHRpb25zO1xuICAgICAgc29ydGFibGVbcGx1Z2luTmFtZV0gPSBpbml0aWFsaXplZDsgLy8gQWRkIGRlZmF1bHQgb3B0aW9ucyBmcm9tIHBsdWdpblxuXG4gICAgICBfZXh0ZW5kcyhkZWZhdWx0cywgaW5pdGlhbGl6ZWQuZGVmYXVsdHMpO1xuICAgIH0pO1xuXG4gICAgZm9yICh2YXIgb3B0aW9uIGluIHNvcnRhYmxlLm9wdGlvbnMpIHtcbiAgICAgIGlmICghc29ydGFibGUub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShvcHRpb24pKSBjb250aW51ZTtcbiAgICAgIHZhciBtb2RpZmllZCA9IHRoaXMubW9kaWZ5T3B0aW9uKHNvcnRhYmxlLCBvcHRpb24sIHNvcnRhYmxlLm9wdGlvbnNbb3B0aW9uXSk7XG5cbiAgICAgIGlmICh0eXBlb2YgbW9kaWZpZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHNvcnRhYmxlLm9wdGlvbnNbb3B0aW9uXSA9IG1vZGlmaWVkO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgZ2V0RXZlbnRQcm9wZXJ0aWVzOiBmdW5jdGlvbiBnZXRFdmVudFByb3BlcnRpZXMobmFtZSwgc29ydGFibGUpIHtcbiAgICB2YXIgZXZlbnRQcm9wZXJ0aWVzID0ge307XG4gICAgcGx1Z2lucy5mb3JFYWNoKGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICAgIGlmICh0eXBlb2YgcGx1Z2luLmV2ZW50UHJvcGVydGllcyAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuO1xuXG4gICAgICBfZXh0ZW5kcyhldmVudFByb3BlcnRpZXMsIHBsdWdpbi5ldmVudFByb3BlcnRpZXMuY2FsbChzb3J0YWJsZVtwbHVnaW4ucGx1Z2luTmFtZV0sIG5hbWUpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZXZlbnRQcm9wZXJ0aWVzO1xuICB9LFxuICBtb2RpZnlPcHRpb246IGZ1bmN0aW9uIG1vZGlmeU9wdGlvbihzb3J0YWJsZSwgbmFtZSwgdmFsdWUpIHtcbiAgICB2YXIgbW9kaWZpZWRWYWx1ZTtcbiAgICBwbHVnaW5zLmZvckVhY2goZnVuY3Rpb24gKHBsdWdpbikge1xuICAgICAgLy8gUGx1Z2luIG11c3QgZXhpc3Qgb24gdGhlIFNvcnRhYmxlXG4gICAgICBpZiAoIXNvcnRhYmxlW3BsdWdpbi5wbHVnaW5OYW1lXSkgcmV0dXJuOyAvLyBJZiBzdGF0aWMgb3B0aW9uIGxpc3RlbmVyIGV4aXN0cyBmb3IgdGhpcyBvcHRpb24sIGNhbGwgaW4gdGhlIGNvbnRleHQgb2YgdGhlIFNvcnRhYmxlJ3MgaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW5cblxuICAgICAgaWYgKHBsdWdpbi5vcHRpb25MaXN0ZW5lcnMgJiYgdHlwZW9mIHBsdWdpbi5vcHRpb25MaXN0ZW5lcnNbbmFtZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgbW9kaWZpZWRWYWx1ZSA9IHBsdWdpbi5vcHRpb25MaXN0ZW5lcnNbbmFtZV0uY2FsbChzb3J0YWJsZVtwbHVnaW4ucGx1Z2luTmFtZV0sIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gbW9kaWZpZWRWYWx1ZTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZGlzcGF0Y2hFdmVudChfcmVmKSB7XG4gIHZhciBzb3J0YWJsZSA9IF9yZWYuc29ydGFibGUsXG4gICAgICByb290RWwgPSBfcmVmLnJvb3RFbCxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWUsXG4gICAgICB0YXJnZXRFbCA9IF9yZWYudGFyZ2V0RWwsXG4gICAgICBjbG9uZUVsID0gX3JlZi5jbG9uZUVsLFxuICAgICAgdG9FbCA9IF9yZWYudG9FbCxcbiAgICAgIGZyb21FbCA9IF9yZWYuZnJvbUVsLFxuICAgICAgb2xkSW5kZXggPSBfcmVmLm9sZEluZGV4LFxuICAgICAgbmV3SW5kZXggPSBfcmVmLm5ld0luZGV4LFxuICAgICAgb2xkRHJhZ2dhYmxlSW5kZXggPSBfcmVmLm9sZERyYWdnYWJsZUluZGV4LFxuICAgICAgbmV3RHJhZ2dhYmxlSW5kZXggPSBfcmVmLm5ld0RyYWdnYWJsZUluZGV4LFxuICAgICAgb3JpZ2luYWxFdmVudCA9IF9yZWYub3JpZ2luYWxFdmVudCxcbiAgICAgIHB1dFNvcnRhYmxlID0gX3JlZi5wdXRTb3J0YWJsZSxcbiAgICAgIGV4dHJhRXZlbnRQcm9wZXJ0aWVzID0gX3JlZi5leHRyYUV2ZW50UHJvcGVydGllcztcbiAgc29ydGFibGUgPSBzb3J0YWJsZSB8fCByb290RWwgJiYgcm9vdEVsW2V4cGFuZG9dO1xuICBpZiAoIXNvcnRhYmxlKSByZXR1cm47XG4gIHZhciBldnQsXG4gICAgICBvcHRpb25zID0gc29ydGFibGUub3B0aW9ucyxcbiAgICAgIG9uTmFtZSA9ICdvbicgKyBuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zdWJzdHIoMSk7IC8vIFN1cHBvcnQgZm9yIG5ldyBDdXN0b21FdmVudCBmZWF0dXJlXG5cbiAgaWYgKHdpbmRvdy5DdXN0b21FdmVudCAmJiAhSUUxMU9yTGVzcyAmJiAhRWRnZSkge1xuICAgIGV2dCA9IG5ldyBDdXN0b21FdmVudChuYW1lLCB7XG4gICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgY2FuY2VsYWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgIGV2dC5pbml0RXZlbnQobmFtZSwgdHJ1ZSwgdHJ1ZSk7XG4gIH1cblxuICBldnQudG8gPSB0b0VsIHx8IHJvb3RFbDtcbiAgZXZ0LmZyb20gPSBmcm9tRWwgfHwgcm9vdEVsO1xuICBldnQuaXRlbSA9IHRhcmdldEVsIHx8IHJvb3RFbDtcbiAgZXZ0LmNsb25lID0gY2xvbmVFbDtcbiAgZXZ0Lm9sZEluZGV4ID0gb2xkSW5kZXg7XG4gIGV2dC5uZXdJbmRleCA9IG5ld0luZGV4O1xuICBldnQub2xkRHJhZ2dhYmxlSW5kZXggPSBvbGREcmFnZ2FibGVJbmRleDtcbiAgZXZ0Lm5ld0RyYWdnYWJsZUluZGV4ID0gbmV3RHJhZ2dhYmxlSW5kZXg7XG4gIGV2dC5vcmlnaW5hbEV2ZW50ID0gb3JpZ2luYWxFdmVudDtcbiAgZXZ0LnB1bGxNb2RlID0gcHV0U29ydGFibGUgPyBwdXRTb3J0YWJsZS5sYXN0UHV0TW9kZSA6IHVuZGVmaW5lZDtcblxuICB2YXIgYWxsRXZlbnRQcm9wZXJ0aWVzID0gX29iamVjdFNwcmVhZCh7fSwgZXh0cmFFdmVudFByb3BlcnRpZXMsIFBsdWdpbk1hbmFnZXIuZ2V0RXZlbnRQcm9wZXJ0aWVzKG5hbWUsIHNvcnRhYmxlKSk7XG5cbiAgZm9yICh2YXIgb3B0aW9uIGluIGFsbEV2ZW50UHJvcGVydGllcykge1xuICAgIGV2dFtvcHRpb25dID0gYWxsRXZlbnRQcm9wZXJ0aWVzW29wdGlvbl07XG4gIH1cblxuICBpZiAocm9vdEVsKSB7XG4gICAgcm9vdEVsLmRpc3BhdGNoRXZlbnQoZXZ0KTtcbiAgfVxuXG4gIGlmIChvcHRpb25zW29uTmFtZV0pIHtcbiAgICBvcHRpb25zW29uTmFtZV0uY2FsbChzb3J0YWJsZSwgZXZ0KTtcbiAgfVxufVxuXG52YXIgcGx1Z2luRXZlbnQgPSBmdW5jdGlvbiBwbHVnaW5FdmVudChldmVudE5hbWUsIHNvcnRhYmxlKSB7XG4gIHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fSxcbiAgICAgIG9yaWdpbmFsRXZlbnQgPSBfcmVmLmV2dCxcbiAgICAgIGRhdGEgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiwgW1wiZXZ0XCJdKTtcblxuICBQbHVnaW5NYW5hZ2VyLnBsdWdpbkV2ZW50LmJpbmQoU29ydGFibGUpKGV2ZW50TmFtZSwgc29ydGFibGUsIF9vYmplY3RTcHJlYWQoe1xuICAgIGRyYWdFbDogZHJhZ0VsLFxuICAgIHBhcmVudEVsOiBwYXJlbnRFbCxcbiAgICBnaG9zdEVsOiBnaG9zdEVsLFxuICAgIHJvb3RFbDogcm9vdEVsLFxuICAgIG5leHRFbDogbmV4dEVsLFxuICAgIGxhc3REb3duRWw6IGxhc3REb3duRWwsXG4gICAgY2xvbmVFbDogY2xvbmVFbCxcbiAgICBjbG9uZUhpZGRlbjogY2xvbmVIaWRkZW4sXG4gICAgZHJhZ1N0YXJ0ZWQ6IG1vdmVkLFxuICAgIHB1dFNvcnRhYmxlOiBwdXRTb3J0YWJsZSxcbiAgICBhY3RpdmVTb3J0YWJsZTogU29ydGFibGUuYWN0aXZlLFxuICAgIG9yaWdpbmFsRXZlbnQ6IG9yaWdpbmFsRXZlbnQsXG4gICAgb2xkSW5kZXg6IG9sZEluZGV4LFxuICAgIG9sZERyYWdnYWJsZUluZGV4OiBvbGREcmFnZ2FibGVJbmRleCxcbiAgICBuZXdJbmRleDogbmV3SW5kZXgsXG4gICAgbmV3RHJhZ2dhYmxlSW5kZXg6IG5ld0RyYWdnYWJsZUluZGV4LFxuICAgIGhpZGVHaG9zdEZvclRhcmdldDogX2hpZGVHaG9zdEZvclRhcmdldCxcbiAgICB1bmhpZGVHaG9zdEZvclRhcmdldDogX3VuaGlkZUdob3N0Rm9yVGFyZ2V0LFxuICAgIGNsb25lTm93SGlkZGVuOiBmdW5jdGlvbiBjbG9uZU5vd0hpZGRlbigpIHtcbiAgICAgIGNsb25lSGlkZGVuID0gdHJ1ZTtcbiAgICB9LFxuICAgIGNsb25lTm93U2hvd246IGZ1bmN0aW9uIGNsb25lTm93U2hvd24oKSB7XG4gICAgICBjbG9uZUhpZGRlbiA9IGZhbHNlO1xuICAgIH0sXG4gICAgZGlzcGF0Y2hTb3J0YWJsZUV2ZW50OiBmdW5jdGlvbiBkaXNwYXRjaFNvcnRhYmxlRXZlbnQobmFtZSkge1xuICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICBzb3J0YWJsZTogc29ydGFibGUsXG4gICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IG9yaWdpbmFsRXZlbnRcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgZGF0YSkpO1xufTtcblxuZnVuY3Rpb24gX2Rpc3BhdGNoRXZlbnQoaW5mbykge1xuICBkaXNwYXRjaEV2ZW50KF9vYmplY3RTcHJlYWQoe1xuICAgIHB1dFNvcnRhYmxlOiBwdXRTb3J0YWJsZSxcbiAgICBjbG9uZUVsOiBjbG9uZUVsLFxuICAgIHRhcmdldEVsOiBkcmFnRWwsXG4gICAgcm9vdEVsOiByb290RWwsXG4gICAgb2xkSW5kZXg6IG9sZEluZGV4LFxuICAgIG9sZERyYWdnYWJsZUluZGV4OiBvbGREcmFnZ2FibGVJbmRleCxcbiAgICBuZXdJbmRleDogbmV3SW5kZXgsXG4gICAgbmV3RHJhZ2dhYmxlSW5kZXg6IG5ld0RyYWdnYWJsZUluZGV4XG4gIH0sIGluZm8pKTtcbn1cblxudmFyIGRyYWdFbCxcbiAgICBwYXJlbnRFbCxcbiAgICBnaG9zdEVsLFxuICAgIHJvb3RFbCxcbiAgICBuZXh0RWwsXG4gICAgbGFzdERvd25FbCxcbiAgICBjbG9uZUVsLFxuICAgIGNsb25lSGlkZGVuLFxuICAgIG9sZEluZGV4LFxuICAgIG5ld0luZGV4LFxuICAgIG9sZERyYWdnYWJsZUluZGV4LFxuICAgIG5ld0RyYWdnYWJsZUluZGV4LFxuICAgIGFjdGl2ZUdyb3VwLFxuICAgIHB1dFNvcnRhYmxlLFxuICAgIGF3YWl0aW5nRHJhZ1N0YXJ0ZWQgPSBmYWxzZSxcbiAgICBpZ25vcmVOZXh0Q2xpY2sgPSBmYWxzZSxcbiAgICBzb3J0YWJsZXMgPSBbXSxcbiAgICB0YXBFdnQsXG4gICAgdG91Y2hFdnQsXG4gICAgbGFzdER4LFxuICAgIGxhc3REeSxcbiAgICB0YXBEaXN0YW5jZUxlZnQsXG4gICAgdGFwRGlzdGFuY2VUb3AsXG4gICAgbW92ZWQsXG4gICAgbGFzdFRhcmdldCxcbiAgICBsYXN0RGlyZWN0aW9uLFxuICAgIHBhc3RGaXJzdEludmVydFRocmVzaCA9IGZhbHNlLFxuICAgIGlzQ2lyY3Vtc3RhbnRpYWxJbnZlcnQgPSBmYWxzZSxcbiAgICB0YXJnZXRNb3ZlRGlzdGFuY2UsXG4gICAgLy8gRm9yIHBvc2l0aW9uaW5nIGdob3N0IGFic29sdXRlbHlcbmdob3N0UmVsYXRpdmVQYXJlbnQsXG4gICAgZ2hvc3RSZWxhdGl2ZVBhcmVudEluaXRpYWxTY3JvbGwgPSBbXSxcbiAgICAvLyAobGVmdCwgdG9wKVxuX3NpbGVudCA9IGZhbHNlLFxuICAgIHNhdmVkSW5wdXRDaGVja2VkID0gW107XG4vKiogQGNvbnN0ICovXG5cbnZhciBkb2N1bWVudEV4aXN0cyA9IHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcsXG4gICAgUG9zaXRpb25HaG9zdEFic29sdXRlbHkgPSBJT1MsXG4gICAgQ1NTRmxvYXRQcm9wZXJ0eSA9IEVkZ2UgfHwgSUUxMU9yTGVzcyA/ICdjc3NGbG9hdCcgOiAnZmxvYXQnLFxuICAgIC8vIFRoaXMgd2lsbCBub3QgcGFzcyBmb3IgSUU5LCBiZWNhdXNlIElFOSBEbkQgb25seSB3b3JrcyBvbiBhbmNob3JzXG5zdXBwb3J0RHJhZ2dhYmxlID0gZG9jdW1lbnRFeGlzdHMgJiYgIUNocm9tZUZvckFuZHJvaWQgJiYgIUlPUyAmJiAnZHJhZ2dhYmxlJyBpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSxcbiAgICBzdXBwb3J0Q3NzUG9pbnRlckV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCFkb2N1bWVudEV4aXN0cykgcmV0dXJuOyAvLyBmYWxzZSB3aGVuIDw9IElFMTFcblxuICBpZiAoSUUxMU9yTGVzcykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3gnKTtcbiAgZWwuc3R5bGUuY3NzVGV4dCA9ICdwb2ludGVyLWV2ZW50czphdXRvJztcbiAgcmV0dXJuIGVsLnN0eWxlLnBvaW50ZXJFdmVudHMgPT09ICdhdXRvJztcbn0oKSxcbiAgICBfZGV0ZWN0RGlyZWN0aW9uID0gZnVuY3Rpb24gX2RldGVjdERpcmVjdGlvbihlbCwgb3B0aW9ucykge1xuICB2YXIgZWxDU1MgPSBjc3MoZWwpLFxuICAgICAgZWxXaWR0aCA9IHBhcnNlSW50KGVsQ1NTLndpZHRoKSAtIHBhcnNlSW50KGVsQ1NTLnBhZGRpbmdMZWZ0KSAtIHBhcnNlSW50KGVsQ1NTLnBhZGRpbmdSaWdodCkgLSBwYXJzZUludChlbENTUy5ib3JkZXJMZWZ0V2lkdGgpIC0gcGFyc2VJbnQoZWxDU1MuYm9yZGVyUmlnaHRXaWR0aCksXG4gICAgICBjaGlsZDEgPSBnZXRDaGlsZChlbCwgMCwgb3B0aW9ucyksXG4gICAgICBjaGlsZDIgPSBnZXRDaGlsZChlbCwgMSwgb3B0aW9ucyksXG4gICAgICBmaXJzdENoaWxkQ1NTID0gY2hpbGQxICYmIGNzcyhjaGlsZDEpLFxuICAgICAgc2Vjb25kQ2hpbGRDU1MgPSBjaGlsZDIgJiYgY3NzKGNoaWxkMiksXG4gICAgICBmaXJzdENoaWxkV2lkdGggPSBmaXJzdENoaWxkQ1NTICYmIHBhcnNlSW50KGZpcnN0Q2hpbGRDU1MubWFyZ2luTGVmdCkgKyBwYXJzZUludChmaXJzdENoaWxkQ1NTLm1hcmdpblJpZ2h0KSArIGdldFJlY3QoY2hpbGQxKS53aWR0aCxcbiAgICAgIHNlY29uZENoaWxkV2lkdGggPSBzZWNvbmRDaGlsZENTUyAmJiBwYXJzZUludChzZWNvbmRDaGlsZENTUy5tYXJnaW5MZWZ0KSArIHBhcnNlSW50KHNlY29uZENoaWxkQ1NTLm1hcmdpblJpZ2h0KSArIGdldFJlY3QoY2hpbGQyKS53aWR0aDtcblxuICBpZiAoZWxDU1MuZGlzcGxheSA9PT0gJ2ZsZXgnKSB7XG4gICAgcmV0dXJuIGVsQ1NTLmZsZXhEaXJlY3Rpb24gPT09ICdjb2x1bW4nIHx8IGVsQ1NTLmZsZXhEaXJlY3Rpb24gPT09ICdjb2x1bW4tcmV2ZXJzZScgPyAndmVydGljYWwnIDogJ2hvcml6b250YWwnO1xuICB9XG5cbiAgaWYgKGVsQ1NTLmRpc3BsYXkgPT09ICdncmlkJykge1xuICAgIHJldHVybiBlbENTUy5ncmlkVGVtcGxhdGVDb2x1bW5zLnNwbGl0KCcgJykubGVuZ3RoIDw9IDEgPyAndmVydGljYWwnIDogJ2hvcml6b250YWwnO1xuICB9XG5cbiAgaWYgKGNoaWxkMSAmJiBmaXJzdENoaWxkQ1NTW1wiZmxvYXRcIl0gJiYgZmlyc3RDaGlsZENTU1tcImZsb2F0XCJdICE9PSAnbm9uZScpIHtcbiAgICB2YXIgdG91Y2hpbmdTaWRlQ2hpbGQyID0gZmlyc3RDaGlsZENTU1tcImZsb2F0XCJdID09PSAnbGVmdCcgPyAnbGVmdCcgOiAncmlnaHQnO1xuICAgIHJldHVybiBjaGlsZDIgJiYgKHNlY29uZENoaWxkQ1NTLmNsZWFyID09PSAnYm90aCcgfHwgc2Vjb25kQ2hpbGRDU1MuY2xlYXIgPT09IHRvdWNoaW5nU2lkZUNoaWxkMikgPyAndmVydGljYWwnIDogJ2hvcml6b250YWwnO1xuICB9XG5cbiAgcmV0dXJuIGNoaWxkMSAmJiAoZmlyc3RDaGlsZENTUy5kaXNwbGF5ID09PSAnYmxvY2snIHx8IGZpcnN0Q2hpbGRDU1MuZGlzcGxheSA9PT0gJ2ZsZXgnIHx8IGZpcnN0Q2hpbGRDU1MuZGlzcGxheSA9PT0gJ3RhYmxlJyB8fCBmaXJzdENoaWxkQ1NTLmRpc3BsYXkgPT09ICdncmlkJyB8fCBmaXJzdENoaWxkV2lkdGggPj0gZWxXaWR0aCAmJiBlbENTU1tDU1NGbG9hdFByb3BlcnR5XSA9PT0gJ25vbmUnIHx8IGNoaWxkMiAmJiBlbENTU1tDU1NGbG9hdFByb3BlcnR5XSA9PT0gJ25vbmUnICYmIGZpcnN0Q2hpbGRXaWR0aCArIHNlY29uZENoaWxkV2lkdGggPiBlbFdpZHRoKSA/ICd2ZXJ0aWNhbCcgOiAnaG9yaXpvbnRhbCc7XG59LFxuICAgIF9kcmFnRWxJblJvd0NvbHVtbiA9IGZ1bmN0aW9uIF9kcmFnRWxJblJvd0NvbHVtbihkcmFnUmVjdCwgdGFyZ2V0UmVjdCwgdmVydGljYWwpIHtcbiAgdmFyIGRyYWdFbFMxT3BwID0gdmVydGljYWwgPyBkcmFnUmVjdC5sZWZ0IDogZHJhZ1JlY3QudG9wLFxuICAgICAgZHJhZ0VsUzJPcHAgPSB2ZXJ0aWNhbCA/IGRyYWdSZWN0LnJpZ2h0IDogZHJhZ1JlY3QuYm90dG9tLFxuICAgICAgZHJhZ0VsT3BwTGVuZ3RoID0gdmVydGljYWwgPyBkcmFnUmVjdC53aWR0aCA6IGRyYWdSZWN0LmhlaWdodCxcbiAgICAgIHRhcmdldFMxT3BwID0gdmVydGljYWwgPyB0YXJnZXRSZWN0LmxlZnQgOiB0YXJnZXRSZWN0LnRvcCxcbiAgICAgIHRhcmdldFMyT3BwID0gdmVydGljYWwgPyB0YXJnZXRSZWN0LnJpZ2h0IDogdGFyZ2V0UmVjdC5ib3R0b20sXG4gICAgICB0YXJnZXRPcHBMZW5ndGggPSB2ZXJ0aWNhbCA/IHRhcmdldFJlY3Qud2lkdGggOiB0YXJnZXRSZWN0LmhlaWdodDtcbiAgcmV0dXJuIGRyYWdFbFMxT3BwID09PSB0YXJnZXRTMU9wcCB8fCBkcmFnRWxTMk9wcCA9PT0gdGFyZ2V0UzJPcHAgfHwgZHJhZ0VsUzFPcHAgKyBkcmFnRWxPcHBMZW5ndGggLyAyID09PSB0YXJnZXRTMU9wcCArIHRhcmdldE9wcExlbmd0aCAvIDI7XG59LFxuXG4vKipcbiAqIERldGVjdHMgZmlyc3QgbmVhcmVzdCBlbXB0eSBzb3J0YWJsZSB0byBYIGFuZCBZIHBvc2l0aW9uIHVzaW5nIGVtcHR5SW5zZXJ0VGhyZXNob2xkLlxuICogQHBhcmFtICB7TnVtYmVyfSB4ICAgICAgWCBwb3NpdGlvblxuICogQHBhcmFtICB7TnVtYmVyfSB5ICAgICAgWSBwb3NpdGlvblxuICogQHJldHVybiB7SFRNTEVsZW1lbnR9ICAgRWxlbWVudCBvZiB0aGUgZmlyc3QgZm91bmQgbmVhcmVzdCBTb3J0YWJsZVxuICovXG5fZGV0ZWN0TmVhcmVzdEVtcHR5U29ydGFibGUgPSBmdW5jdGlvbiBfZGV0ZWN0TmVhcmVzdEVtcHR5U29ydGFibGUoeCwgeSkge1xuICB2YXIgcmV0O1xuICBzb3J0YWJsZXMuc29tZShmdW5jdGlvbiAoc29ydGFibGUpIHtcbiAgICBpZiAobGFzdENoaWxkKHNvcnRhYmxlKSkgcmV0dXJuO1xuICAgIHZhciByZWN0ID0gZ2V0UmVjdChzb3J0YWJsZSksXG4gICAgICAgIHRocmVzaG9sZCA9IHNvcnRhYmxlW2V4cGFuZG9dLm9wdGlvbnMuZW1wdHlJbnNlcnRUaHJlc2hvbGQsXG4gICAgICAgIGluc2lkZUhvcml6b250YWxseSA9IHggPj0gcmVjdC5sZWZ0IC0gdGhyZXNob2xkICYmIHggPD0gcmVjdC5yaWdodCArIHRocmVzaG9sZCxcbiAgICAgICAgaW5zaWRlVmVydGljYWxseSA9IHkgPj0gcmVjdC50b3AgLSB0aHJlc2hvbGQgJiYgeSA8PSByZWN0LmJvdHRvbSArIHRocmVzaG9sZDtcblxuICAgIGlmICh0aHJlc2hvbGQgJiYgaW5zaWRlSG9yaXpvbnRhbGx5ICYmIGluc2lkZVZlcnRpY2FsbHkpIHtcbiAgICAgIHJldHVybiByZXQgPSBzb3J0YWJsZTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmV0O1xufSxcbiAgICBfcHJlcGFyZUdyb3VwID0gZnVuY3Rpb24gX3ByZXBhcmVHcm91cChvcHRpb25zKSB7XG4gIGZ1bmN0aW9uIHRvRm4odmFsdWUsIHB1bGwpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRvLCBmcm9tLCBkcmFnRWwsIGV2dCkge1xuICAgICAgdmFyIHNhbWVHcm91cCA9IHRvLm9wdGlvbnMuZ3JvdXAubmFtZSAmJiBmcm9tLm9wdGlvbnMuZ3JvdXAubmFtZSAmJiB0by5vcHRpb25zLmdyb3VwLm5hbWUgPT09IGZyb20ub3B0aW9ucy5ncm91cC5uYW1lO1xuXG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCAmJiAocHVsbCB8fCBzYW1lR3JvdXApKSB7XG4gICAgICAgIC8vIERlZmF1bHQgcHVsbCB2YWx1ZVxuICAgICAgICAvLyBEZWZhdWx0IHB1bGwgYW5kIHB1dCB2YWx1ZSBpZiBzYW1lIGdyb3VwXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKHB1bGwgJiYgdmFsdWUgPT09ICdjbG9uZScpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHRvRm4odmFsdWUodG8sIGZyb20sIGRyYWdFbCwgZXZ0KSwgcHVsbCkodG8sIGZyb20sIGRyYWdFbCwgZXZ0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBvdGhlckdyb3VwID0gKHB1bGwgPyB0byA6IGZyb20pLm9wdGlvbnMuZ3JvdXAubmFtZTtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUgPT09IG90aGVyR3JvdXAgfHwgdmFsdWUuam9pbiAmJiB2YWx1ZS5pbmRleE9mKG90aGVyR3JvdXApID4gLTE7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHZhciBncm91cCA9IHt9O1xuICB2YXIgb3JpZ2luYWxHcm91cCA9IG9wdGlvbnMuZ3JvdXA7XG5cbiAgaWYgKCFvcmlnaW5hbEdyb3VwIHx8IF90eXBlb2Yob3JpZ2luYWxHcm91cCkgIT0gJ29iamVjdCcpIHtcbiAgICBvcmlnaW5hbEdyb3VwID0ge1xuICAgICAgbmFtZTogb3JpZ2luYWxHcm91cFxuICAgIH07XG4gIH1cblxuICBncm91cC5uYW1lID0gb3JpZ2luYWxHcm91cC5uYW1lO1xuICBncm91cC5jaGVja1B1bGwgPSB0b0ZuKG9yaWdpbmFsR3JvdXAucHVsbCwgdHJ1ZSk7XG4gIGdyb3VwLmNoZWNrUHV0ID0gdG9GbihvcmlnaW5hbEdyb3VwLnB1dCk7XG4gIGdyb3VwLnJldmVydENsb25lID0gb3JpZ2luYWxHcm91cC5yZXZlcnRDbG9uZTtcbiAgb3B0aW9ucy5ncm91cCA9IGdyb3VwO1xufSxcbiAgICBfaGlkZUdob3N0Rm9yVGFyZ2V0ID0gZnVuY3Rpb24gX2hpZGVHaG9zdEZvclRhcmdldCgpIHtcbiAgaWYgKCFzdXBwb3J0Q3NzUG9pbnRlckV2ZW50cyAmJiBnaG9zdEVsKSB7XG4gICAgY3NzKGdob3N0RWwsICdkaXNwbGF5JywgJ25vbmUnKTtcbiAgfVxufSxcbiAgICBfdW5oaWRlR2hvc3RGb3JUYXJnZXQgPSBmdW5jdGlvbiBfdW5oaWRlR2hvc3RGb3JUYXJnZXQoKSB7XG4gIGlmICghc3VwcG9ydENzc1BvaW50ZXJFdmVudHMgJiYgZ2hvc3RFbCkge1xuICAgIGNzcyhnaG9zdEVsLCAnZGlzcGxheScsICcnKTtcbiAgfVxufTsgLy8gIzExODQgZml4IC0gUHJldmVudCBjbGljayBldmVudCBvbiBmYWxsYmFjayBpZiBkcmFnZ2VkIGJ1dCBpdGVtIG5vdCBjaGFuZ2VkIHBvc2l0aW9uXG5cblxuaWYgKGRvY3VtZW50RXhpc3RzKSB7XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGV2dCkge1xuICAgIGlmIChpZ25vcmVOZXh0Q2xpY2spIHtcbiAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbiAmJiBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBldnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uICYmIGV2dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgIGlnbm9yZU5leHRDbGljayA9IGZhbHNlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSwgdHJ1ZSk7XG59XG5cbnZhciBuZWFyZXN0RW1wdHlJbnNlcnREZXRlY3RFdmVudCA9IGZ1bmN0aW9uIG5lYXJlc3RFbXB0eUluc2VydERldGVjdEV2ZW50KGV2dCkge1xuICBpZiAoZHJhZ0VsKSB7XG4gICAgZXZ0ID0gZXZ0LnRvdWNoZXMgPyBldnQudG91Y2hlc1swXSA6IGV2dDtcblxuICAgIHZhciBuZWFyZXN0ID0gX2RldGVjdE5lYXJlc3RFbXB0eVNvcnRhYmxlKGV2dC5jbGllbnRYLCBldnQuY2xpZW50WSk7XG5cbiAgICBpZiAobmVhcmVzdCkge1xuICAgICAgLy8gQ3JlYXRlIGltaXRhdGlvbiBldmVudFxuICAgICAgdmFyIGV2ZW50ID0ge307XG5cbiAgICAgIGZvciAodmFyIGkgaW4gZXZ0KSB7XG4gICAgICAgIGlmIChldnQuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICBldmVudFtpXSA9IGV2dFtpXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBldmVudC50YXJnZXQgPSBldmVudC5yb290RWwgPSBuZWFyZXN0O1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQgPSB2b2lkIDA7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24gPSB2b2lkIDA7XG5cbiAgICAgIG5lYXJlc3RbZXhwYW5kb10uX29uRHJhZ092ZXIoZXZlbnQpO1xuICAgIH1cbiAgfVxufTtcblxudmFyIF9jaGVja091dHNpZGVUYXJnZXRFbCA9IGZ1bmN0aW9uIF9jaGVja091dHNpZGVUYXJnZXRFbChldnQpIHtcbiAgaWYgKGRyYWdFbCkge1xuICAgIGRyYWdFbC5wYXJlbnROb2RlW2V4cGFuZG9dLl9pc091dHNpZGVUaGlzRWwoZXZ0LnRhcmdldCk7XG4gIH1cbn07XG4vKipcbiAqIEBjbGFzcyAgU29ydGFibGVcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSAgZWxcbiAqIEBwYXJhbSAge09iamVjdH0gICAgICAgW29wdGlvbnNdXG4gKi9cblxuXG5mdW5jdGlvbiBTb3J0YWJsZShlbCwgb3B0aW9ucykge1xuICBpZiAoIShlbCAmJiBlbC5ub2RlVHlwZSAmJiBlbC5ub2RlVHlwZSA9PT0gMSkpIHtcbiAgICB0aHJvdyBcIlNvcnRhYmxlOiBgZWxgIG11c3QgYmUgYW4gSFRNTEVsZW1lbnQsIG5vdCBcIi5jb25jYXQoe30udG9TdHJpbmcuY2FsbChlbCkpO1xuICB9XG5cbiAgdGhpcy5lbCA9IGVsOyAvLyByb290IGVsZW1lbnRcblxuICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zID0gX2V4dGVuZHMoe30sIG9wdGlvbnMpOyAvLyBFeHBvcnQgaW5zdGFuY2VcblxuICBlbFtleHBhbmRvXSA9IHRoaXM7XG4gIHZhciBkZWZhdWx0cyA9IHtcbiAgICBncm91cDogbnVsbCxcbiAgICBzb3J0OiB0cnVlLFxuICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICBzdG9yZTogbnVsbCxcbiAgICBoYW5kbGU6IG51bGwsXG4gICAgZHJhZ2dhYmxlOiAvXlt1b11sJC9pLnRlc3QoZWwubm9kZU5hbWUpID8gJz5saScgOiAnPionLFxuICAgIHN3YXBUaHJlc2hvbGQ6IDEsXG4gICAgLy8gcGVyY2VudGFnZTsgMCA8PSB4IDw9IDFcbiAgICBpbnZlcnRTd2FwOiBmYWxzZSxcbiAgICAvLyBpbnZlcnQgYWx3YXlzXG4gICAgaW52ZXJ0ZWRTd2FwVGhyZXNob2xkOiBudWxsLFxuICAgIC8vIHdpbGwgYmUgc2V0IHRvIHNhbWUgYXMgc3dhcFRocmVzaG9sZCBpZiBkZWZhdWx0XG4gICAgcmVtb3ZlQ2xvbmVPbkhpZGU6IHRydWUsXG4gICAgZGlyZWN0aW9uOiBmdW5jdGlvbiBkaXJlY3Rpb24oKSB7XG4gICAgICByZXR1cm4gX2RldGVjdERpcmVjdGlvbihlbCwgdGhpcy5vcHRpb25zKTtcbiAgICB9LFxuICAgIGdob3N0Q2xhc3M6ICdzb3J0YWJsZS1naG9zdCcsXG4gICAgY2hvc2VuQ2xhc3M6ICdzb3J0YWJsZS1jaG9zZW4nLFxuICAgIGRyYWdDbGFzczogJ3NvcnRhYmxlLWRyYWcnLFxuICAgIGlnbm9yZTogJ2EsIGltZycsXG4gICAgZmlsdGVyOiBudWxsLFxuICAgIHByZXZlbnRPbkZpbHRlcjogdHJ1ZSxcbiAgICBhbmltYXRpb246IDAsXG4gICAgZWFzaW5nOiBudWxsLFxuICAgIHNldERhdGE6IGZ1bmN0aW9uIHNldERhdGEoZGF0YVRyYW5zZmVyLCBkcmFnRWwpIHtcbiAgICAgIGRhdGFUcmFuc2Zlci5zZXREYXRhKCdUZXh0JywgZHJhZ0VsLnRleHRDb250ZW50KTtcbiAgICB9LFxuICAgIGRyb3BCdWJibGU6IGZhbHNlLFxuICAgIGRyYWdvdmVyQnViYmxlOiBmYWxzZSxcbiAgICBkYXRhSWRBdHRyOiAnZGF0YS1pZCcsXG4gICAgZGVsYXk6IDAsXG4gICAgZGVsYXlPblRvdWNoT25seTogZmFsc2UsXG4gICAgdG91Y2hTdGFydFRocmVzaG9sZDogKE51bWJlci5wYXJzZUludCA/IE51bWJlciA6IHdpbmRvdykucGFyc2VJbnQod2luZG93LmRldmljZVBpeGVsUmF0aW8sIDEwKSB8fCAxLFxuICAgIGZvcmNlRmFsbGJhY2s6IGZhbHNlLFxuICAgIGZhbGxiYWNrQ2xhc3M6ICdzb3J0YWJsZS1mYWxsYmFjaycsXG4gICAgZmFsbGJhY2tPbkJvZHk6IGZhbHNlLFxuICAgIGZhbGxiYWNrVG9sZXJhbmNlOiAwLFxuICAgIGZhbGxiYWNrT2Zmc2V0OiB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMFxuICAgIH0sXG4gICAgc3VwcG9ydFBvaW50ZXI6IFNvcnRhYmxlLnN1cHBvcnRQb2ludGVyICE9PSBmYWxzZSAmJiAnUG9pbnRlckV2ZW50JyBpbiB3aW5kb3cgJiYgIVNhZmFyaSxcbiAgICBlbXB0eUluc2VydFRocmVzaG9sZDogNVxuICB9O1xuICBQbHVnaW5NYW5hZ2VyLmluaXRpYWxpemVQbHVnaW5zKHRoaXMsIGVsLCBkZWZhdWx0cyk7IC8vIFNldCBkZWZhdWx0IG9wdGlvbnNcblxuICBmb3IgKHZhciBuYW1lIGluIGRlZmF1bHRzKSB7XG4gICAgIShuYW1lIGluIG9wdGlvbnMpICYmIChvcHRpb25zW25hbWVdID0gZGVmYXVsdHNbbmFtZV0pO1xuICB9XG5cbiAgX3ByZXBhcmVHcm91cChvcHRpb25zKTsgLy8gQmluZCBhbGwgcHJpdmF0ZSBtZXRob2RzXG5cblxuICBmb3IgKHZhciBmbiBpbiB0aGlzKSB7XG4gICAgaWYgKGZuLmNoYXJBdCgwKSA9PT0gJ18nICYmIHR5cGVvZiB0aGlzW2ZuXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1tmbl0gPSB0aGlzW2ZuXS5iaW5kKHRoaXMpO1xuICAgIH1cbiAgfSAvLyBTZXR1cCBkcmFnIG1vZGVcblxuXG4gIHRoaXMubmF0aXZlRHJhZ2dhYmxlID0gb3B0aW9ucy5mb3JjZUZhbGxiYWNrID8gZmFsc2UgOiBzdXBwb3J0RHJhZ2dhYmxlO1xuXG4gIGlmICh0aGlzLm5hdGl2ZURyYWdnYWJsZSkge1xuICAgIC8vIFRvdWNoIHN0YXJ0IHRocmVzaG9sZCBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBuYXRpdmUgZHJhZ3N0YXJ0IHRocmVzaG9sZFxuICAgIHRoaXMub3B0aW9ucy50b3VjaFN0YXJ0VGhyZXNob2xkID0gMTtcbiAgfSAvLyBCaW5kIGV2ZW50c1xuXG5cbiAgaWYgKG9wdGlvbnMuc3VwcG9ydFBvaW50ZXIpIHtcbiAgICBvbihlbCwgJ3BvaW50ZXJkb3duJywgdGhpcy5fb25UYXBTdGFydCk7XG4gIH0gZWxzZSB7XG4gICAgb24oZWwsICdtb3VzZWRvd24nLCB0aGlzLl9vblRhcFN0YXJ0KTtcbiAgICBvbihlbCwgJ3RvdWNoc3RhcnQnLCB0aGlzLl9vblRhcFN0YXJ0KTtcbiAgfVxuXG4gIGlmICh0aGlzLm5hdGl2ZURyYWdnYWJsZSkge1xuICAgIG9uKGVsLCAnZHJhZ292ZXInLCB0aGlzKTtcbiAgICBvbihlbCwgJ2RyYWdlbnRlcicsIHRoaXMpO1xuICB9XG5cbiAgc29ydGFibGVzLnB1c2godGhpcy5lbCk7IC8vIFJlc3RvcmUgc29ydGluZ1xuXG4gIG9wdGlvbnMuc3RvcmUgJiYgb3B0aW9ucy5zdG9yZS5nZXQgJiYgdGhpcy5zb3J0KG9wdGlvbnMuc3RvcmUuZ2V0KHRoaXMpIHx8IFtdKTsgLy8gQWRkIGFuaW1hdGlvbiBzdGF0ZSBtYW5hZ2VyXG5cbiAgX2V4dGVuZHModGhpcywgQW5pbWF0aW9uU3RhdGVNYW5hZ2VyKCkpO1xufVxuXG5Tb3J0YWJsZS5wcm90b3R5cGUgPVxuLyoqIEBsZW5kcyBTb3J0YWJsZS5wcm90b3R5cGUgKi9cbntcbiAgY29uc3RydWN0b3I6IFNvcnRhYmxlLFxuICBfaXNPdXRzaWRlVGhpc0VsOiBmdW5jdGlvbiBfaXNPdXRzaWRlVGhpc0VsKHRhcmdldCkge1xuICAgIGlmICghdGhpcy5lbC5jb250YWlucyh0YXJnZXQpICYmIHRhcmdldCAhPT0gdGhpcy5lbCkge1xuICAgICAgbGFzdFRhcmdldCA9IG51bGw7XG4gICAgfVxuICB9LFxuICBfZ2V0RGlyZWN0aW9uOiBmdW5jdGlvbiBfZ2V0RGlyZWN0aW9uKGV2dCwgdGFyZ2V0KSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzLm9wdGlvbnMuZGlyZWN0aW9uID09PSAnZnVuY3Rpb24nID8gdGhpcy5vcHRpb25zLmRpcmVjdGlvbi5jYWxsKHRoaXMsIGV2dCwgdGFyZ2V0LCBkcmFnRWwpIDogdGhpcy5vcHRpb25zLmRpcmVjdGlvbjtcbiAgfSxcbiAgX29uVGFwU3RhcnQ6IGZ1bmN0aW9uIF9vblRhcFN0YXJ0KFxuICAvKiogRXZlbnR8VG91Y2hFdmVudCAqL1xuICBldnQpIHtcbiAgICBpZiAoIWV2dC5jYW5jZWxhYmxlKSByZXR1cm47XG5cbiAgICB2YXIgX3RoaXMgPSB0aGlzLFxuICAgICAgICBlbCA9IHRoaXMuZWwsXG4gICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsXG4gICAgICAgIHByZXZlbnRPbkZpbHRlciA9IG9wdGlvbnMucHJldmVudE9uRmlsdGVyLFxuICAgICAgICB0eXBlID0gZXZ0LnR5cGUsXG4gICAgICAgIHRvdWNoID0gZXZ0LnRvdWNoZXMgJiYgZXZ0LnRvdWNoZXNbMF0gfHwgZXZ0LnBvaW50ZXJUeXBlICYmIGV2dC5wb2ludGVyVHlwZSA9PT0gJ3RvdWNoJyAmJiBldnQsXG4gICAgICAgIHRhcmdldCA9ICh0b3VjaCB8fCBldnQpLnRhcmdldCxcbiAgICAgICAgb3JpZ2luYWxUYXJnZXQgPSBldnQudGFyZ2V0LnNoYWRvd1Jvb3QgJiYgKGV2dC5wYXRoICYmIGV2dC5wYXRoWzBdIHx8IGV2dC5jb21wb3NlZFBhdGggJiYgZXZ0LmNvbXBvc2VkUGF0aCgpWzBdKSB8fCB0YXJnZXQsXG4gICAgICAgIGZpbHRlciA9IG9wdGlvbnMuZmlsdGVyO1xuXG4gICAgX3NhdmVJbnB1dENoZWNrZWRTdGF0ZShlbCk7IC8vIERvbid0IHRyaWdnZXIgc3RhcnQgZXZlbnQgd2hlbiBhbiBlbGVtZW50IGlzIGJlZW4gZHJhZ2dlZCwgb3RoZXJ3aXNlIHRoZSBldnQub2xkaW5kZXggYWx3YXlzIHdyb25nIHdoZW4gc2V0IG9wdGlvbi5ncm91cC5cblxuXG4gICAgaWYgKGRyYWdFbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICgvbW91c2Vkb3dufHBvaW50ZXJkb3duLy50ZXN0KHR5cGUpICYmIGV2dC5idXR0b24gIT09IDAgfHwgb3B0aW9ucy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuOyAvLyBvbmx5IGxlZnQgYnV0dG9uIGFuZCBlbmFibGVkXG4gICAgfSAvLyBjYW5jZWwgZG5kIGlmIG9yaWdpbmFsIHRhcmdldCBpcyBjb250ZW50IGVkaXRhYmxlXG5cblxuICAgIGlmIChvcmlnaW5hbFRhcmdldC5pc0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gU2FmYXJpIGlnbm9yZXMgZnVydGhlciBldmVudCBoYW5kbGluZyBhZnRlciBtb3VzZWRvd25cblxuXG4gICAgaWYgKCF0aGlzLm5hdGl2ZURyYWdnYWJsZSAmJiBTYWZhcmkgJiYgdGFyZ2V0ICYmIHRhcmdldC50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdTRUxFQ1QnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGFyZ2V0ID0gY2xvc2VzdCh0YXJnZXQsIG9wdGlvbnMuZHJhZ2dhYmxlLCBlbCwgZmFsc2UpO1xuXG4gICAgaWYgKHRhcmdldCAmJiB0YXJnZXQuYW5pbWF0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobGFzdERvd25FbCA9PT0gdGFyZ2V0KSB7XG4gICAgICAvLyBJZ25vcmluZyBkdXBsaWNhdGUgYGRvd25gXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBHZXQgdGhlIGluZGV4IG9mIHRoZSBkcmFnZ2VkIGVsZW1lbnQgd2l0aGluIGl0cyBwYXJlbnRcblxuXG4gICAgb2xkSW5kZXggPSBpbmRleCh0YXJnZXQpO1xuICAgIG9sZERyYWdnYWJsZUluZGV4ID0gaW5kZXgodGFyZ2V0LCBvcHRpb25zLmRyYWdnYWJsZSk7IC8vIENoZWNrIGZpbHRlclxuXG4gICAgaWYgKHR5cGVvZiBmaWx0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChmaWx0ZXIuY2FsbCh0aGlzLCBldnQsIHRhcmdldCwgdGhpcykpIHtcbiAgICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgIHNvcnRhYmxlOiBfdGhpcyxcbiAgICAgICAgICByb290RWw6IG9yaWdpbmFsVGFyZ2V0LFxuICAgICAgICAgIG5hbWU6ICdmaWx0ZXInLFxuICAgICAgICAgIHRhcmdldEVsOiB0YXJnZXQsXG4gICAgICAgICAgdG9FbDogZWwsXG4gICAgICAgICAgZnJvbUVsOiBlbFxuICAgICAgICB9KTtcblxuICAgICAgICBwbHVnaW5FdmVudCgnZmlsdGVyJywgX3RoaXMsIHtcbiAgICAgICAgICBldnQ6IGV2dFxuICAgICAgICB9KTtcbiAgICAgICAgcHJldmVudE9uRmlsdGVyICYmIGV2dC5jYW5jZWxhYmxlICYmIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXR1cm47IC8vIGNhbmNlbCBkbmRcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZpbHRlcikge1xuICAgICAgZmlsdGVyID0gZmlsdGVyLnNwbGl0KCcsJykuc29tZShmdW5jdGlvbiAoY3JpdGVyaWEpIHtcbiAgICAgICAgY3JpdGVyaWEgPSBjbG9zZXN0KG9yaWdpbmFsVGFyZ2V0LCBjcml0ZXJpYS50cmltKCksIGVsLCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKGNyaXRlcmlhKSB7XG4gICAgICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgICAgc29ydGFibGU6IF90aGlzLFxuICAgICAgICAgICAgcm9vdEVsOiBjcml0ZXJpYSxcbiAgICAgICAgICAgIG5hbWU6ICdmaWx0ZXInLFxuICAgICAgICAgICAgdGFyZ2V0RWw6IHRhcmdldCxcbiAgICAgICAgICAgIGZyb21FbDogZWwsXG4gICAgICAgICAgICB0b0VsOiBlbFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcGx1Z2luRXZlbnQoJ2ZpbHRlcicsIF90aGlzLCB7XG4gICAgICAgICAgICBldnQ6IGV2dFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICBwcmV2ZW50T25GaWx0ZXIgJiYgZXZ0LmNhbmNlbGFibGUgJiYgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybjsgLy8gY2FuY2VsIGRuZFxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmhhbmRsZSAmJiAhY2xvc2VzdChvcmlnaW5hbFRhcmdldCwgb3B0aW9ucy5oYW5kbGUsIGVsLCBmYWxzZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFByZXBhcmUgYGRyYWdzdGFydGBcblxuXG4gICAgdGhpcy5fcHJlcGFyZURyYWdTdGFydChldnQsIHRvdWNoLCB0YXJnZXQpO1xuICB9LFxuICBfcHJlcGFyZURyYWdTdGFydDogZnVuY3Rpb24gX3ByZXBhcmVEcmFnU3RhcnQoXG4gIC8qKiBFdmVudCAqL1xuICBldnQsXG4gIC8qKiBUb3VjaCAqL1xuICB0b3VjaCxcbiAgLyoqIEhUTUxFbGVtZW50ICovXG4gIHRhcmdldCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXMsXG4gICAgICAgIGVsID0gX3RoaXMuZWwsXG4gICAgICAgIG9wdGlvbnMgPSBfdGhpcy5vcHRpb25zLFxuICAgICAgICBvd25lckRvY3VtZW50ID0gZWwub3duZXJEb2N1bWVudCxcbiAgICAgICAgZHJhZ1N0YXJ0Rm47XG5cbiAgICBpZiAodGFyZ2V0ICYmICFkcmFnRWwgJiYgdGFyZ2V0LnBhcmVudE5vZGUgPT09IGVsKSB7XG4gICAgICB2YXIgZHJhZ1JlY3QgPSBnZXRSZWN0KHRhcmdldCk7XG4gICAgICByb290RWwgPSBlbDtcbiAgICAgIGRyYWdFbCA9IHRhcmdldDtcbiAgICAgIHBhcmVudEVsID0gZHJhZ0VsLnBhcmVudE5vZGU7XG4gICAgICBuZXh0RWwgPSBkcmFnRWwubmV4dFNpYmxpbmc7XG4gICAgICBsYXN0RG93bkVsID0gdGFyZ2V0O1xuICAgICAgYWN0aXZlR3JvdXAgPSBvcHRpb25zLmdyb3VwO1xuICAgICAgU29ydGFibGUuZHJhZ2dlZCA9IGRyYWdFbDtcbiAgICAgIHRhcEV2dCA9IHtcbiAgICAgICAgdGFyZ2V0OiBkcmFnRWwsXG4gICAgICAgIGNsaWVudFg6ICh0b3VjaCB8fCBldnQpLmNsaWVudFgsXG4gICAgICAgIGNsaWVudFk6ICh0b3VjaCB8fCBldnQpLmNsaWVudFlcbiAgICAgIH07XG4gICAgICB0YXBEaXN0YW5jZUxlZnQgPSB0YXBFdnQuY2xpZW50WCAtIGRyYWdSZWN0LmxlZnQ7XG4gICAgICB0YXBEaXN0YW5jZVRvcCA9IHRhcEV2dC5jbGllbnRZIC0gZHJhZ1JlY3QudG9wO1xuICAgICAgdGhpcy5fbGFzdFggPSAodG91Y2ggfHwgZXZ0KS5jbGllbnRYO1xuICAgICAgdGhpcy5fbGFzdFkgPSAodG91Y2ggfHwgZXZ0KS5jbGllbnRZO1xuICAgICAgZHJhZ0VsLnN0eWxlWyd3aWxsLWNoYW5nZSddID0gJ2FsbCc7XG5cbiAgICAgIGRyYWdTdGFydEZuID0gZnVuY3Rpb24gZHJhZ1N0YXJ0Rm4oKSB7XG4gICAgICAgIHBsdWdpbkV2ZW50KCdkZWxheUVuZGVkJywgX3RoaXMsIHtcbiAgICAgICAgICBldnQ6IGV2dFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoU29ydGFibGUuZXZlbnRDYW5jZWxlZCkge1xuICAgICAgICAgIF90aGlzLl9vbkRyb3AoKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyBEZWxheWVkIGRyYWcgaGFzIGJlZW4gdHJpZ2dlcmVkXG4gICAgICAgIC8vIHdlIGNhbiByZS1lbmFibGUgdGhlIGV2ZW50czogdG91Y2htb3ZlL21vdXNlbW92ZVxuXG5cbiAgICAgICAgX3RoaXMuX2Rpc2FibGVEZWxheWVkRHJhZ0V2ZW50cygpO1xuXG4gICAgICAgIGlmICghRmlyZUZveCAmJiBfdGhpcy5uYXRpdmVEcmFnZ2FibGUpIHtcbiAgICAgICAgICBkcmFnRWwuZHJhZ2dhYmxlID0gdHJ1ZTtcbiAgICAgICAgfSAvLyBCaW5kIHRoZSBldmVudHM6IGRyYWdzdGFydC9kcmFnZW5kXG5cblxuICAgICAgICBfdGhpcy5fdHJpZ2dlckRyYWdTdGFydChldnQsIHRvdWNoKTsgLy8gRHJhZyBzdGFydCBldmVudFxuXG5cbiAgICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgIHNvcnRhYmxlOiBfdGhpcyxcbiAgICAgICAgICBuYW1lOiAnY2hvb3NlJyxcbiAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgICAgfSk7IC8vIENob3NlbiBpdGVtXG5cblxuICAgICAgICB0b2dnbGVDbGFzcyhkcmFnRWwsIG9wdGlvbnMuY2hvc2VuQ2xhc3MsIHRydWUpO1xuICAgICAgfTsgLy8gRGlzYWJsZSBcImRyYWdnYWJsZVwiXG5cblxuICAgICAgb3B0aW9ucy5pZ25vcmUuc3BsaXQoJywnKS5mb3JFYWNoKGZ1bmN0aW9uIChjcml0ZXJpYSkge1xuICAgICAgICBmaW5kKGRyYWdFbCwgY3JpdGVyaWEudHJpbSgpLCBfZGlzYWJsZURyYWdnYWJsZSk7XG4gICAgICB9KTtcbiAgICAgIG9uKG93bmVyRG9jdW1lbnQsICdkcmFnb3ZlcicsIG5lYXJlc3RFbXB0eUluc2VydERldGVjdEV2ZW50KTtcbiAgICAgIG9uKG93bmVyRG9jdW1lbnQsICdtb3VzZW1vdmUnLCBuZWFyZXN0RW1wdHlJbnNlcnREZXRlY3RFdmVudCk7XG4gICAgICBvbihvd25lckRvY3VtZW50LCAndG91Y2htb3ZlJywgbmVhcmVzdEVtcHR5SW5zZXJ0RGV0ZWN0RXZlbnQpO1xuICAgICAgb24ob3duZXJEb2N1bWVudCwgJ21vdXNldXAnLCBfdGhpcy5fb25Ecm9wKTtcbiAgICAgIG9uKG93bmVyRG9jdW1lbnQsICd0b3VjaGVuZCcsIF90aGlzLl9vbkRyb3ApO1xuICAgICAgb24ob3duZXJEb2N1bWVudCwgJ3RvdWNoY2FuY2VsJywgX3RoaXMuX29uRHJvcCk7IC8vIE1ha2UgZHJhZ0VsIGRyYWdnYWJsZSAobXVzdCBiZSBiZWZvcmUgZGVsYXkgZm9yIEZpcmVGb3gpXG5cbiAgICAgIGlmIChGaXJlRm94ICYmIHRoaXMubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy50b3VjaFN0YXJ0VGhyZXNob2xkID0gNDtcbiAgICAgICAgZHJhZ0VsLmRyYWdnYWJsZSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHBsdWdpbkV2ZW50KCdkZWxheVN0YXJ0JywgdGhpcywge1xuICAgICAgICBldnQ6IGV2dFxuICAgICAgfSk7IC8vIERlbGF5IGlzIGltcG9zc2libGUgZm9yIG5hdGl2ZSBEbkQgaW4gRWRnZSBvciBJRVxuXG4gICAgICBpZiAob3B0aW9ucy5kZWxheSAmJiAoIW9wdGlvbnMuZGVsYXlPblRvdWNoT25seSB8fCB0b3VjaCkgJiYgKCF0aGlzLm5hdGl2ZURyYWdnYWJsZSB8fCAhKEVkZ2UgfHwgSUUxMU9yTGVzcykpKSB7XG4gICAgICAgIGlmIChTb3J0YWJsZS5ldmVudENhbmNlbGVkKSB7XG4gICAgICAgICAgdGhpcy5fb25Ecm9wKCk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gLy8gSWYgdGhlIHVzZXIgbW92ZXMgdGhlIHBvaW50ZXIgb3IgbGV0IGdvIHRoZSBjbGljayBvciB0b3VjaFxuICAgICAgICAvLyBiZWZvcmUgdGhlIGRlbGF5IGhhcyBiZWVuIHJlYWNoZWQ6XG4gICAgICAgIC8vIGRpc2FibGUgdGhlIGRlbGF5ZWQgZHJhZ1xuXG5cbiAgICAgICAgb24ob3duZXJEb2N1bWVudCwgJ21vdXNldXAnLCBfdGhpcy5fZGlzYWJsZURlbGF5ZWREcmFnKTtcbiAgICAgICAgb24ob3duZXJEb2N1bWVudCwgJ3RvdWNoZW5kJywgX3RoaXMuX2Rpc2FibGVEZWxheWVkRHJhZyk7XG4gICAgICAgIG9uKG93bmVyRG9jdW1lbnQsICd0b3VjaGNhbmNlbCcsIF90aGlzLl9kaXNhYmxlRGVsYXllZERyYWcpO1xuICAgICAgICBvbihvd25lckRvY3VtZW50LCAnbW91c2Vtb3ZlJywgX3RoaXMuX2RlbGF5ZWREcmFnVG91Y2hNb3ZlSGFuZGxlcik7XG4gICAgICAgIG9uKG93bmVyRG9jdW1lbnQsICd0b3VjaG1vdmUnLCBfdGhpcy5fZGVsYXllZERyYWdUb3VjaE1vdmVIYW5kbGVyKTtcbiAgICAgICAgb3B0aW9ucy5zdXBwb3J0UG9pbnRlciAmJiBvbihvd25lckRvY3VtZW50LCAncG9pbnRlcm1vdmUnLCBfdGhpcy5fZGVsYXllZERyYWdUb3VjaE1vdmVIYW5kbGVyKTtcbiAgICAgICAgX3RoaXMuX2RyYWdTdGFydFRpbWVyID0gc2V0VGltZW91dChkcmFnU3RhcnRGbiwgb3B0aW9ucy5kZWxheSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkcmFnU3RhcnRGbigpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgX2RlbGF5ZWREcmFnVG91Y2hNb3ZlSGFuZGxlcjogZnVuY3Rpb24gX2RlbGF5ZWREcmFnVG91Y2hNb3ZlSGFuZGxlcihcbiAgLyoqIFRvdWNoRXZlbnR8UG9pbnRlckV2ZW50ICoqL1xuICBlKSB7XG4gICAgdmFyIHRvdWNoID0gZS50b3VjaGVzID8gZS50b3VjaGVzWzBdIDogZTtcblxuICAgIGlmIChNYXRoLm1heChNYXRoLmFicyh0b3VjaC5jbGllbnRYIC0gdGhpcy5fbGFzdFgpLCBNYXRoLmFicyh0b3VjaC5jbGllbnRZIC0gdGhpcy5fbGFzdFkpKSA+PSBNYXRoLmZsb29yKHRoaXMub3B0aW9ucy50b3VjaFN0YXJ0VGhyZXNob2xkIC8gKHRoaXMubmF0aXZlRHJhZ2dhYmxlICYmIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDEpKSkge1xuICAgICAgdGhpcy5fZGlzYWJsZURlbGF5ZWREcmFnKCk7XG4gICAgfVxuICB9LFxuICBfZGlzYWJsZURlbGF5ZWREcmFnOiBmdW5jdGlvbiBfZGlzYWJsZURlbGF5ZWREcmFnKCkge1xuICAgIGRyYWdFbCAmJiBfZGlzYWJsZURyYWdnYWJsZShkcmFnRWwpO1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl9kcmFnU3RhcnRUaW1lcik7XG5cbiAgICB0aGlzLl9kaXNhYmxlRGVsYXllZERyYWdFdmVudHMoKTtcbiAgfSxcbiAgX2Rpc2FibGVEZWxheWVkRHJhZ0V2ZW50czogZnVuY3Rpb24gX2Rpc2FibGVEZWxheWVkRHJhZ0V2ZW50cygpIHtcbiAgICB2YXIgb3duZXJEb2N1bWVudCA9IHRoaXMuZWwub3duZXJEb2N1bWVudDtcbiAgICBvZmYob3duZXJEb2N1bWVudCwgJ21vdXNldXAnLCB0aGlzLl9kaXNhYmxlRGVsYXllZERyYWcpO1xuICAgIG9mZihvd25lckRvY3VtZW50LCAndG91Y2hlbmQnLCB0aGlzLl9kaXNhYmxlRGVsYXllZERyYWcpO1xuICAgIG9mZihvd25lckRvY3VtZW50LCAndG91Y2hjYW5jZWwnLCB0aGlzLl9kaXNhYmxlRGVsYXllZERyYWcpO1xuICAgIG9mZihvd25lckRvY3VtZW50LCAnbW91c2Vtb3ZlJywgdGhpcy5fZGVsYXllZERyYWdUb3VjaE1vdmVIYW5kbGVyKTtcbiAgICBvZmYob3duZXJEb2N1bWVudCwgJ3RvdWNobW92ZScsIHRoaXMuX2RlbGF5ZWREcmFnVG91Y2hNb3ZlSGFuZGxlcik7XG4gICAgb2ZmKG93bmVyRG9jdW1lbnQsICdwb2ludGVybW92ZScsIHRoaXMuX2RlbGF5ZWREcmFnVG91Y2hNb3ZlSGFuZGxlcik7XG4gIH0sXG4gIF90cmlnZ2VyRHJhZ1N0YXJ0OiBmdW5jdGlvbiBfdHJpZ2dlckRyYWdTdGFydChcbiAgLyoqIEV2ZW50ICovXG4gIGV2dCxcbiAgLyoqIFRvdWNoICovXG4gIHRvdWNoKSB7XG4gICAgdG91Y2ggPSB0b3VjaCB8fCBldnQucG9pbnRlclR5cGUgPT0gJ3RvdWNoJyAmJiBldnQ7XG5cbiAgICBpZiAoIXRoaXMubmF0aXZlRHJhZ2dhYmxlIHx8IHRvdWNoKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLnN1cHBvcnRQb2ludGVyKSB7XG4gICAgICAgIG9uKGRvY3VtZW50LCAncG9pbnRlcm1vdmUnLCB0aGlzLl9vblRvdWNoTW92ZSk7XG4gICAgICB9IGVsc2UgaWYgKHRvdWNoKSB7XG4gICAgICAgIG9uKGRvY3VtZW50LCAndG91Y2htb3ZlJywgdGhpcy5fb25Ub3VjaE1vdmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb24oZG9jdW1lbnQsICdtb3VzZW1vdmUnLCB0aGlzLl9vblRvdWNoTW92ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG9uKGRyYWdFbCwgJ2RyYWdlbmQnLCB0aGlzKTtcbiAgICAgIG9uKHJvb3RFbCwgJ2RyYWdzdGFydCcsIHRoaXMuX29uRHJhZ1N0YXJ0KTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgaWYgKGRvY3VtZW50LnNlbGVjdGlvbikge1xuICAgICAgICAvLyBUaW1lb3V0IG5lY2Nlc3NhcnkgZm9yIElFOVxuICAgICAgICBfbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGRvY3VtZW50LnNlbGVjdGlvbi5lbXB0eSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHt9XG4gIH0sXG4gIF9kcmFnU3RhcnRlZDogZnVuY3Rpb24gX2RyYWdTdGFydGVkKGZhbGxiYWNrLCBldnQpIHtcblxuICAgIGF3YWl0aW5nRHJhZ1N0YXJ0ZWQgPSBmYWxzZTtcblxuICAgIGlmIChyb290RWwgJiYgZHJhZ0VsKSB7XG4gICAgICBwbHVnaW5FdmVudCgnZHJhZ1N0YXJ0ZWQnLCB0aGlzLCB7XG4gICAgICAgIGV2dDogZXZ0XG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoaXMubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgICAgIG9uKGRvY3VtZW50LCAnZHJhZ292ZXInLCBfY2hlY2tPdXRzaWRlVGFyZ2V0RWwpO1xuICAgICAgfVxuXG4gICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsgLy8gQXBwbHkgZWZmZWN0XG5cbiAgICAgICFmYWxsYmFjayAmJiB0b2dnbGVDbGFzcyhkcmFnRWwsIG9wdGlvbnMuZHJhZ0NsYXNzLCBmYWxzZSk7XG4gICAgICB0b2dnbGVDbGFzcyhkcmFnRWwsIG9wdGlvbnMuZ2hvc3RDbGFzcywgdHJ1ZSk7XG4gICAgICBTb3J0YWJsZS5hY3RpdmUgPSB0aGlzO1xuICAgICAgZmFsbGJhY2sgJiYgdGhpcy5fYXBwZW5kR2hvc3QoKTsgLy8gRHJhZyBzdGFydCBldmVudFxuXG4gICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgIHNvcnRhYmxlOiB0aGlzLFxuICAgICAgICBuYW1lOiAnc3RhcnQnLFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9udWxsaW5nKCk7XG4gICAgfVxuICB9LFxuICBfZW11bGF0ZURyYWdPdmVyOiBmdW5jdGlvbiBfZW11bGF0ZURyYWdPdmVyKCkge1xuICAgIGlmICh0b3VjaEV2dCkge1xuICAgICAgdGhpcy5fbGFzdFggPSB0b3VjaEV2dC5jbGllbnRYO1xuICAgICAgdGhpcy5fbGFzdFkgPSB0b3VjaEV2dC5jbGllbnRZO1xuXG4gICAgICBfaGlkZUdob3N0Rm9yVGFyZ2V0KCk7XG5cbiAgICAgIHZhciB0YXJnZXQgPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KHRvdWNoRXZ0LmNsaWVudFgsIHRvdWNoRXZ0LmNsaWVudFkpO1xuICAgICAgdmFyIHBhcmVudCA9IHRhcmdldDtcblxuICAgICAgd2hpbGUgKHRhcmdldCAmJiB0YXJnZXQuc2hhZG93Um9vdCkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQuc2hhZG93Um9vdC5lbGVtZW50RnJvbVBvaW50KHRvdWNoRXZ0LmNsaWVudFgsIHRvdWNoRXZ0LmNsaWVudFkpO1xuICAgICAgICBpZiAodGFyZ2V0ID09PSBwYXJlbnQpIGJyZWFrO1xuICAgICAgICBwYXJlbnQgPSB0YXJnZXQ7XG4gICAgICB9XG5cbiAgICAgIGRyYWdFbC5wYXJlbnROb2RlW2V4cGFuZG9dLl9pc091dHNpZGVUaGlzRWwodGFyZ2V0KTtcblxuICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICBkbyB7XG4gICAgICAgICAgaWYgKHBhcmVudFtleHBhbmRvXSkge1xuICAgICAgICAgICAgdmFyIGluc2VydGVkID0gdm9pZCAwO1xuICAgICAgICAgICAgaW5zZXJ0ZWQgPSBwYXJlbnRbZXhwYW5kb10uX29uRHJhZ092ZXIoe1xuICAgICAgICAgICAgICBjbGllbnRYOiB0b3VjaEV2dC5jbGllbnRYLFxuICAgICAgICAgICAgICBjbGllbnRZOiB0b3VjaEV2dC5jbGllbnRZLFxuICAgICAgICAgICAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICAgICAgICAgICAgcm9vdEVsOiBwYXJlbnRcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoaW5zZXJ0ZWQgJiYgIXRoaXMub3B0aW9ucy5kcmFnb3ZlckJ1YmJsZSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0YXJnZXQgPSBwYXJlbnQ7IC8vIHN0b3JlIGxhc3QgZWxlbWVudFxuICAgICAgICB9XG4gICAgICAgIC8qIGpzaGludCBib3NzOnRydWUgKi9cbiAgICAgICAgd2hpbGUgKHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlKTtcbiAgICAgIH1cblxuICAgICAgX3VuaGlkZUdob3N0Rm9yVGFyZ2V0KCk7XG4gICAgfVxuICB9LFxuICBfb25Ub3VjaE1vdmU6IGZ1bmN0aW9uIF9vblRvdWNoTW92ZShcbiAgLyoqVG91Y2hFdmVudCovXG4gIGV2dCkge1xuICAgIGlmICh0YXBFdnQpIHtcbiAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICAgIGZhbGxiYWNrVG9sZXJhbmNlID0gb3B0aW9ucy5mYWxsYmFja1RvbGVyYW5jZSxcbiAgICAgICAgICBmYWxsYmFja09mZnNldCA9IG9wdGlvbnMuZmFsbGJhY2tPZmZzZXQsXG4gICAgICAgICAgdG91Y2ggPSBldnQudG91Y2hlcyA/IGV2dC50b3VjaGVzWzBdIDogZXZ0LFxuICAgICAgICAgIGdob3N0TWF0cml4ID0gZ2hvc3RFbCAmJiBtYXRyaXgoZ2hvc3RFbCwgdHJ1ZSksXG4gICAgICAgICAgc2NhbGVYID0gZ2hvc3RFbCAmJiBnaG9zdE1hdHJpeCAmJiBnaG9zdE1hdHJpeC5hLFxuICAgICAgICAgIHNjYWxlWSA9IGdob3N0RWwgJiYgZ2hvc3RNYXRyaXggJiYgZ2hvc3RNYXRyaXguZCxcbiAgICAgICAgICByZWxhdGl2ZVNjcm9sbE9mZnNldCA9IFBvc2l0aW9uR2hvc3RBYnNvbHV0ZWx5ICYmIGdob3N0UmVsYXRpdmVQYXJlbnQgJiYgZ2V0UmVsYXRpdmVTY3JvbGxPZmZzZXQoZ2hvc3RSZWxhdGl2ZVBhcmVudCksXG4gICAgICAgICAgZHggPSAodG91Y2guY2xpZW50WCAtIHRhcEV2dC5jbGllbnRYICsgZmFsbGJhY2tPZmZzZXQueCkgLyAoc2NhbGVYIHx8IDEpICsgKHJlbGF0aXZlU2Nyb2xsT2Zmc2V0ID8gcmVsYXRpdmVTY3JvbGxPZmZzZXRbMF0gLSBnaG9zdFJlbGF0aXZlUGFyZW50SW5pdGlhbFNjcm9sbFswXSA6IDApIC8gKHNjYWxlWCB8fCAxKSxcbiAgICAgICAgICBkeSA9ICh0b3VjaC5jbGllbnRZIC0gdGFwRXZ0LmNsaWVudFkgKyBmYWxsYmFja09mZnNldC55KSAvIChzY2FsZVkgfHwgMSkgKyAocmVsYXRpdmVTY3JvbGxPZmZzZXQgPyByZWxhdGl2ZVNjcm9sbE9mZnNldFsxXSAtIGdob3N0UmVsYXRpdmVQYXJlbnRJbml0aWFsU2Nyb2xsWzFdIDogMCkgLyAoc2NhbGVZIHx8IDEpOyAvLyBvbmx5IHNldCB0aGUgc3RhdHVzIHRvIGRyYWdnaW5nLCB3aGVuIHdlIGFyZSBhY3R1YWxseSBkcmFnZ2luZ1xuXG4gICAgICBpZiAoIVNvcnRhYmxlLmFjdGl2ZSAmJiAhYXdhaXRpbmdEcmFnU3RhcnRlZCkge1xuICAgICAgICBpZiAoZmFsbGJhY2tUb2xlcmFuY2UgJiYgTWF0aC5tYXgoTWF0aC5hYnModG91Y2guY2xpZW50WCAtIHRoaXMuX2xhc3RYKSwgTWF0aC5hYnModG91Y2guY2xpZW50WSAtIHRoaXMuX2xhc3RZKSkgPCBmYWxsYmFja1RvbGVyYW5jZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX29uRHJhZ1N0YXJ0KGV2dCwgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChnaG9zdEVsKSB7XG4gICAgICAgIGlmIChnaG9zdE1hdHJpeCkge1xuICAgICAgICAgIGdob3N0TWF0cml4LmUgKz0gZHggLSAobGFzdER4IHx8IDApO1xuICAgICAgICAgIGdob3N0TWF0cml4LmYgKz0gZHkgLSAobGFzdER5IHx8IDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdob3N0TWF0cml4ID0ge1xuICAgICAgICAgICAgYTogMSxcbiAgICAgICAgICAgIGI6IDAsXG4gICAgICAgICAgICBjOiAwLFxuICAgICAgICAgICAgZDogMSxcbiAgICAgICAgICAgIGU6IGR4LFxuICAgICAgICAgICAgZjogZHlcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNzc01hdHJpeCA9IFwibWF0cml4KFwiLmNvbmNhdChnaG9zdE1hdHJpeC5hLCBcIixcIikuY29uY2F0KGdob3N0TWF0cml4LmIsIFwiLFwiKS5jb25jYXQoZ2hvc3RNYXRyaXguYywgXCIsXCIpLmNvbmNhdChnaG9zdE1hdHJpeC5kLCBcIixcIikuY29uY2F0KGdob3N0TWF0cml4LmUsIFwiLFwiKS5jb25jYXQoZ2hvc3RNYXRyaXguZiwgXCIpXCIpO1xuICAgICAgICBjc3MoZ2hvc3RFbCwgJ3dlYmtpdFRyYW5zZm9ybScsIGNzc01hdHJpeCk7XG4gICAgICAgIGNzcyhnaG9zdEVsLCAnbW96VHJhbnNmb3JtJywgY3NzTWF0cml4KTtcbiAgICAgICAgY3NzKGdob3N0RWwsICdtc1RyYW5zZm9ybScsIGNzc01hdHJpeCk7XG4gICAgICAgIGNzcyhnaG9zdEVsLCAndHJhbnNmb3JtJywgY3NzTWF0cml4KTtcbiAgICAgICAgbGFzdER4ID0gZHg7XG4gICAgICAgIGxhc3REeSA9IGR5O1xuICAgICAgICB0b3VjaEV2dCA9IHRvdWNoO1xuICAgICAgfVxuXG4gICAgICBldnQuY2FuY2VsYWJsZSAmJiBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH0sXG4gIF9hcHBlbmRHaG9zdDogZnVuY3Rpb24gX2FwcGVuZEdob3N0KCkge1xuICAgIC8vIEJ1ZyBpZiB1c2luZyBzY2FsZSgpOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yNjM3MDU4XG4gICAgLy8gTm90IGJlaW5nIGFkanVzdGVkIGZvclxuICAgIGlmICghZ2hvc3RFbCkge1xuICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMub3B0aW9ucy5mYWxsYmFja09uQm9keSA/IGRvY3VtZW50LmJvZHkgOiByb290RWwsXG4gICAgICAgICAgcmVjdCA9IGdldFJlY3QoZHJhZ0VsLCB0cnVlLCBQb3NpdGlvbkdob3N0QWJzb2x1dGVseSwgdHJ1ZSwgY29udGFpbmVyKSxcbiAgICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zOyAvLyBQb3NpdGlvbiBhYnNvbHV0ZWx5XG5cbiAgICAgIGlmIChQb3NpdGlvbkdob3N0QWJzb2x1dGVseSkge1xuICAgICAgICAvLyBHZXQgcmVsYXRpdmVseSBwb3NpdGlvbmVkIHBhcmVudFxuICAgICAgICBnaG9zdFJlbGF0aXZlUGFyZW50ID0gY29udGFpbmVyO1xuXG4gICAgICAgIHdoaWxlIChjc3MoZ2hvc3RSZWxhdGl2ZVBhcmVudCwgJ3Bvc2l0aW9uJykgPT09ICdzdGF0aWMnICYmIGNzcyhnaG9zdFJlbGF0aXZlUGFyZW50LCAndHJhbnNmb3JtJykgPT09ICdub25lJyAmJiBnaG9zdFJlbGF0aXZlUGFyZW50ICE9PSBkb2N1bWVudCkge1xuICAgICAgICAgIGdob3N0UmVsYXRpdmVQYXJlbnQgPSBnaG9zdFJlbGF0aXZlUGFyZW50LnBhcmVudE5vZGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZ2hvc3RSZWxhdGl2ZVBhcmVudCAhPT0gZG9jdW1lbnQuYm9keSAmJiBnaG9zdFJlbGF0aXZlUGFyZW50ICE9PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgICAgICBpZiAoZ2hvc3RSZWxhdGl2ZVBhcmVudCA9PT0gZG9jdW1lbnQpIGdob3N0UmVsYXRpdmVQYXJlbnQgPSBnZXRXaW5kb3dTY3JvbGxpbmdFbGVtZW50KCk7XG4gICAgICAgICAgcmVjdC50b3AgKz0gZ2hvc3RSZWxhdGl2ZVBhcmVudC5zY3JvbGxUb3A7XG4gICAgICAgICAgcmVjdC5sZWZ0ICs9IGdob3N0UmVsYXRpdmVQYXJlbnQuc2Nyb2xsTGVmdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBnaG9zdFJlbGF0aXZlUGFyZW50ID0gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2hvc3RSZWxhdGl2ZVBhcmVudEluaXRpYWxTY3JvbGwgPSBnZXRSZWxhdGl2ZVNjcm9sbE9mZnNldChnaG9zdFJlbGF0aXZlUGFyZW50KTtcbiAgICAgIH1cblxuICAgICAgZ2hvc3RFbCA9IGRyYWdFbC5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICB0b2dnbGVDbGFzcyhnaG9zdEVsLCBvcHRpb25zLmdob3N0Q2xhc3MsIGZhbHNlKTtcbiAgICAgIHRvZ2dsZUNsYXNzKGdob3N0RWwsIG9wdGlvbnMuZmFsbGJhY2tDbGFzcywgdHJ1ZSk7XG4gICAgICB0b2dnbGVDbGFzcyhnaG9zdEVsLCBvcHRpb25zLmRyYWdDbGFzcywgdHJ1ZSk7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ3RyYW5zaXRpb24nLCAnJyk7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ3RyYW5zZm9ybScsICcnKTtcbiAgICAgIGNzcyhnaG9zdEVsLCAnYm94LXNpemluZycsICdib3JkZXItYm94Jyk7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ21hcmdpbicsIDApO1xuICAgICAgY3NzKGdob3N0RWwsICd0b3AnLCByZWN0LnRvcCk7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ2xlZnQnLCByZWN0LmxlZnQpO1xuICAgICAgY3NzKGdob3N0RWwsICd3aWR0aCcsIHJlY3Qud2lkdGgpO1xuICAgICAgY3NzKGdob3N0RWwsICdoZWlnaHQnLCByZWN0LmhlaWdodCk7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ29wYWNpdHknLCAnMC44Jyk7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ3Bvc2l0aW9uJywgUG9zaXRpb25HaG9zdEFic29sdXRlbHkgPyAnYWJzb2x1dGUnIDogJ2ZpeGVkJyk7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ3pJbmRleCcsICcxMDAwMDAnKTtcbiAgICAgIGNzcyhnaG9zdEVsLCAncG9pbnRlckV2ZW50cycsICdub25lJyk7XG4gICAgICBTb3J0YWJsZS5naG9zdCA9IGdob3N0RWw7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZ2hvc3RFbCk7IC8vIFNldCB0cmFuc2Zvcm0tb3JpZ2luXG5cbiAgICAgIGNzcyhnaG9zdEVsLCAndHJhbnNmb3JtLW9yaWdpbicsIHRhcERpc3RhbmNlTGVmdCAvIHBhcnNlSW50KGdob3N0RWwuc3R5bGUud2lkdGgpICogMTAwICsgJyUgJyArIHRhcERpc3RhbmNlVG9wIC8gcGFyc2VJbnQoZ2hvc3RFbC5zdHlsZS5oZWlnaHQpICogMTAwICsgJyUnKTtcbiAgICB9XG4gIH0sXG4gIF9vbkRyYWdTdGFydDogZnVuY3Rpb24gX29uRHJhZ1N0YXJ0KFxuICAvKipFdmVudCovXG4gIGV2dCxcbiAgLyoqYm9vbGVhbiovXG4gIGZhbGxiYWNrKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBkYXRhVHJhbnNmZXIgPSBldnQuZGF0YVRyYW5zZmVyO1xuICAgIHZhciBvcHRpb25zID0gX3RoaXMub3B0aW9ucztcbiAgICBwbHVnaW5FdmVudCgnZHJhZ1N0YXJ0JywgdGhpcywge1xuICAgICAgZXZ0OiBldnRcbiAgICB9KTtcblxuICAgIGlmIChTb3J0YWJsZS5ldmVudENhbmNlbGVkKSB7XG4gICAgICB0aGlzLl9vbkRyb3AoKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHBsdWdpbkV2ZW50KCdzZXR1cENsb25lJywgdGhpcyk7XG5cbiAgICBpZiAoIVNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHtcbiAgICAgIGNsb25lRWwgPSBjbG9uZShkcmFnRWwpO1xuICAgICAgY2xvbmVFbC5kcmFnZ2FibGUgPSBmYWxzZTtcbiAgICAgIGNsb25lRWwuc3R5bGVbJ3dpbGwtY2hhbmdlJ10gPSAnJztcblxuICAgICAgdGhpcy5faGlkZUNsb25lKCk7XG5cbiAgICAgIHRvZ2dsZUNsYXNzKGNsb25lRWwsIHRoaXMub3B0aW9ucy5jaG9zZW5DbGFzcywgZmFsc2UpO1xuICAgICAgU29ydGFibGUuY2xvbmUgPSBjbG9uZUVsO1xuICAgIH0gLy8gIzExNDM6IElGcmFtZSBzdXBwb3J0IHdvcmthcm91bmRcblxuXG4gICAgX3RoaXMuY2xvbmVJZCA9IF9uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICBwbHVnaW5FdmVudCgnY2xvbmUnLCBfdGhpcyk7XG4gICAgICBpZiAoU29ydGFibGUuZXZlbnRDYW5jZWxlZCkgcmV0dXJuO1xuXG4gICAgICBpZiAoIV90aGlzLm9wdGlvbnMucmVtb3ZlQ2xvbmVPbkhpZGUpIHtcbiAgICAgICAgcm9vdEVsLmluc2VydEJlZm9yZShjbG9uZUVsLCBkcmFnRWwpO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5faGlkZUNsb25lKCk7XG5cbiAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgc29ydGFibGU6IF90aGlzLFxuICAgICAgICBuYW1lOiAnY2xvbmUnXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICAhZmFsbGJhY2sgJiYgdG9nZ2xlQ2xhc3MoZHJhZ0VsLCBvcHRpb25zLmRyYWdDbGFzcywgdHJ1ZSk7IC8vIFNldCBwcm9wZXIgZHJvcCBldmVudHNcblxuICAgIGlmIChmYWxsYmFjaykge1xuICAgICAgaWdub3JlTmV4dENsaWNrID0gdHJ1ZTtcbiAgICAgIF90aGlzLl9sb29wSWQgPSBzZXRJbnRlcnZhbChfdGhpcy5fZW11bGF0ZURyYWdPdmVyLCA1MCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFVuZG8gd2hhdCB3YXMgc2V0IGluIF9wcmVwYXJlRHJhZ1N0YXJ0IGJlZm9yZSBkcmFnIHN0YXJ0ZWRcbiAgICAgIG9mZihkb2N1bWVudCwgJ21vdXNldXAnLCBfdGhpcy5fb25Ecm9wKTtcbiAgICAgIG9mZihkb2N1bWVudCwgJ3RvdWNoZW5kJywgX3RoaXMuX29uRHJvcCk7XG4gICAgICBvZmYoZG9jdW1lbnQsICd0b3VjaGNhbmNlbCcsIF90aGlzLl9vbkRyb3ApO1xuXG4gICAgICBpZiAoZGF0YVRyYW5zZmVyKSB7XG4gICAgICAgIGRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gJ21vdmUnO1xuICAgICAgICBvcHRpb25zLnNldERhdGEgJiYgb3B0aW9ucy5zZXREYXRhLmNhbGwoX3RoaXMsIGRhdGFUcmFuc2ZlciwgZHJhZ0VsKTtcbiAgICAgIH1cblxuICAgICAgb24oZG9jdW1lbnQsICdkcm9wJywgX3RoaXMpOyAvLyAjMTI3NiBmaXg6XG5cbiAgICAgIGNzcyhkcmFnRWwsICd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlWigwKScpO1xuICAgIH1cblxuICAgIGF3YWl0aW5nRHJhZ1N0YXJ0ZWQgPSB0cnVlO1xuICAgIF90aGlzLl9kcmFnU3RhcnRJZCA9IF9uZXh0VGljayhfdGhpcy5fZHJhZ1N0YXJ0ZWQuYmluZChfdGhpcywgZmFsbGJhY2ssIGV2dCkpO1xuICAgIG9uKGRvY3VtZW50LCAnc2VsZWN0c3RhcnQnLCBfdGhpcyk7XG4gICAgbW92ZWQgPSB0cnVlO1xuXG4gICAgaWYgKFNhZmFyaSkge1xuICAgICAgY3NzKGRvY3VtZW50LmJvZHksICd1c2VyLXNlbGVjdCcsICdub25lJyk7XG4gICAgfVxuICB9LFxuICAvLyBSZXR1cm5zIHRydWUgLSBpZiBubyBmdXJ0aGVyIGFjdGlvbiBpcyBuZWVkZWQgKGVpdGhlciBpbnNlcnRlZCBvciBhbm90aGVyIGNvbmRpdGlvbilcbiAgX29uRHJhZ092ZXI6IGZ1bmN0aW9uIF9vbkRyYWdPdmVyKFxuICAvKipFdmVudCovXG4gIGV2dCkge1xuICAgIHZhciBlbCA9IHRoaXMuZWwsXG4gICAgICAgIHRhcmdldCA9IGV2dC50YXJnZXQsXG4gICAgICAgIGRyYWdSZWN0LFxuICAgICAgICB0YXJnZXRSZWN0LFxuICAgICAgICByZXZlcnQsXG4gICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsXG4gICAgICAgIGdyb3VwID0gb3B0aW9ucy5ncm91cCxcbiAgICAgICAgYWN0aXZlU29ydGFibGUgPSBTb3J0YWJsZS5hY3RpdmUsXG4gICAgICAgIGlzT3duZXIgPSBhY3RpdmVHcm91cCA9PT0gZ3JvdXAsXG4gICAgICAgIGNhblNvcnQgPSBvcHRpb25zLnNvcnQsXG4gICAgICAgIGZyb21Tb3J0YWJsZSA9IHB1dFNvcnRhYmxlIHx8IGFjdGl2ZVNvcnRhYmxlLFxuICAgICAgICB2ZXJ0aWNhbCxcbiAgICAgICAgX3RoaXMgPSB0aGlzLFxuICAgICAgICBjb21wbGV0ZWRGaXJlZCA9IGZhbHNlO1xuXG4gICAgaWYgKF9zaWxlbnQpIHJldHVybjtcblxuICAgIGZ1bmN0aW9uIGRyYWdPdmVyRXZlbnQobmFtZSwgZXh0cmEpIHtcbiAgICAgIHBsdWdpbkV2ZW50KG5hbWUsIF90aGlzLCBfb2JqZWN0U3ByZWFkKHtcbiAgICAgICAgZXZ0OiBldnQsXG4gICAgICAgIGlzT3duZXI6IGlzT3duZXIsXG4gICAgICAgIGF4aXM6IHZlcnRpY2FsID8gJ3ZlcnRpY2FsJyA6ICdob3Jpem9udGFsJyxcbiAgICAgICAgcmV2ZXJ0OiByZXZlcnQsXG4gICAgICAgIGRyYWdSZWN0OiBkcmFnUmVjdCxcbiAgICAgICAgdGFyZ2V0UmVjdDogdGFyZ2V0UmVjdCxcbiAgICAgICAgY2FuU29ydDogY2FuU29ydCxcbiAgICAgICAgZnJvbVNvcnRhYmxlOiBmcm9tU29ydGFibGUsXG4gICAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgICBjb21wbGV0ZWQ6IGNvbXBsZXRlZCxcbiAgICAgICAgb25Nb3ZlOiBmdW5jdGlvbiBvbk1vdmUodGFyZ2V0LCBhZnRlcikge1xuICAgICAgICAgIHJldHVybiBfb25Nb3ZlKHJvb3RFbCwgZWwsIGRyYWdFbCwgZHJhZ1JlY3QsIHRhcmdldCwgZ2V0UmVjdCh0YXJnZXQpLCBldnQsIGFmdGVyKTtcbiAgICAgICAgfSxcbiAgICAgICAgY2hhbmdlZDogY2hhbmdlZFxuICAgICAgfSwgZXh0cmEpKTtcbiAgICB9IC8vIENhcHR1cmUgYW5pbWF0aW9uIHN0YXRlXG5cblxuICAgIGZ1bmN0aW9uIGNhcHR1cmUoKSB7XG4gICAgICBkcmFnT3ZlckV2ZW50KCdkcmFnT3ZlckFuaW1hdGlvbkNhcHR1cmUnKTtcblxuICAgICAgX3RoaXMuY2FwdHVyZUFuaW1hdGlvblN0YXRlKCk7XG5cbiAgICAgIGlmIChfdGhpcyAhPT0gZnJvbVNvcnRhYmxlKSB7XG4gICAgICAgIGZyb21Tb3J0YWJsZS5jYXB0dXJlQW5pbWF0aW9uU3RhdGUoKTtcbiAgICAgIH1cbiAgICB9IC8vIFJldHVybiBpbnZvY2F0aW9uIHdoZW4gZHJhZ0VsIGlzIGluc2VydGVkIChvciBjb21wbGV0ZWQpXG5cblxuICAgIGZ1bmN0aW9uIGNvbXBsZXRlZChpbnNlcnRpb24pIHtcbiAgICAgIGRyYWdPdmVyRXZlbnQoJ2RyYWdPdmVyQ29tcGxldGVkJywge1xuICAgICAgICBpbnNlcnRpb246IGluc2VydGlvblxuICAgICAgfSk7XG5cbiAgICAgIGlmIChpbnNlcnRpb24pIHtcbiAgICAgICAgLy8gQ2xvbmVzIG11c3QgYmUgaGlkZGVuIGJlZm9yZSBmb2xkaW5nIGFuaW1hdGlvbiB0byBjYXB0dXJlIGRyYWdSZWN0QWJzb2x1dGUgcHJvcGVybHlcbiAgICAgICAgaWYgKGlzT3duZXIpIHtcbiAgICAgICAgICBhY3RpdmVTb3J0YWJsZS5faGlkZUNsb25lKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWN0aXZlU29ydGFibGUuX3Nob3dDbG9uZShfdGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX3RoaXMgIT09IGZyb21Tb3J0YWJsZSkge1xuICAgICAgICAgIC8vIFNldCBnaG9zdCBjbGFzcyB0byBuZXcgc29ydGFibGUncyBnaG9zdCBjbGFzc1xuICAgICAgICAgIHRvZ2dsZUNsYXNzKGRyYWdFbCwgcHV0U29ydGFibGUgPyBwdXRTb3J0YWJsZS5vcHRpb25zLmdob3N0Q2xhc3MgOiBhY3RpdmVTb3J0YWJsZS5vcHRpb25zLmdob3N0Q2xhc3MsIGZhbHNlKTtcbiAgICAgICAgICB0b2dnbGVDbGFzcyhkcmFnRWwsIG9wdGlvbnMuZ2hvc3RDbGFzcywgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHV0U29ydGFibGUgIT09IF90aGlzICYmIF90aGlzICE9PSBTb3J0YWJsZS5hY3RpdmUpIHtcbiAgICAgICAgICBwdXRTb3J0YWJsZSA9IF90aGlzO1xuICAgICAgICB9IGVsc2UgaWYgKF90aGlzID09PSBTb3J0YWJsZS5hY3RpdmUgJiYgcHV0U29ydGFibGUpIHtcbiAgICAgICAgICBwdXRTb3J0YWJsZSA9IG51bGw7XG4gICAgICAgIH0gLy8gQW5pbWF0aW9uXG5cblxuICAgICAgICBpZiAoZnJvbVNvcnRhYmxlID09PSBfdGhpcykge1xuICAgICAgICAgIF90aGlzLl9pZ25vcmVXaGlsZUFuaW1hdGluZyA9IHRhcmdldDtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzLmFuaW1hdGVBbGwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGRyYWdPdmVyRXZlbnQoJ2RyYWdPdmVyQW5pbWF0aW9uQ29tcGxldGUnKTtcbiAgICAgICAgICBfdGhpcy5faWdub3JlV2hpbGVBbmltYXRpbmcgPSBudWxsO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoX3RoaXMgIT09IGZyb21Tb3J0YWJsZSkge1xuICAgICAgICAgIGZyb21Tb3J0YWJsZS5hbmltYXRlQWxsKCk7XG4gICAgICAgICAgZnJvbVNvcnRhYmxlLl9pZ25vcmVXaGlsZUFuaW1hdGluZyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gTnVsbCBsYXN0VGFyZ2V0IGlmIGl0IGlzIG5vdCBpbnNpZGUgYSBwcmV2aW91c2x5IHN3YXBwZWQgZWxlbWVudFxuXG5cbiAgICAgIGlmICh0YXJnZXQgPT09IGRyYWdFbCAmJiAhZHJhZ0VsLmFuaW1hdGVkIHx8IHRhcmdldCA9PT0gZWwgJiYgIXRhcmdldC5hbmltYXRlZCkge1xuICAgICAgICBsYXN0VGFyZ2V0ID0gbnVsbDtcbiAgICAgIH0gLy8gbm8gYnViYmxpbmcgYW5kIG5vdCBmYWxsYmFja1xuXG5cbiAgICAgIGlmICghb3B0aW9ucy5kcmFnb3ZlckJ1YmJsZSAmJiAhZXZ0LnJvb3RFbCAmJiB0YXJnZXQgIT09IGRvY3VtZW50KSB7XG4gICAgICAgIGRyYWdFbC5wYXJlbnROb2RlW2V4cGFuZG9dLl9pc091dHNpZGVUaGlzRWwoZXZ0LnRhcmdldCk7IC8vIERvIG5vdCBkZXRlY3QgZm9yIGVtcHR5IGluc2VydCBpZiBhbHJlYWR5IGluc2VydGVkXG5cblxuICAgICAgICAhaW5zZXJ0aW9uICYmIG5lYXJlc3RFbXB0eUluc2VydERldGVjdEV2ZW50KGV2dCk7XG4gICAgICB9XG5cbiAgICAgICFvcHRpb25zLmRyYWdvdmVyQnViYmxlICYmIGV2dC5zdG9wUHJvcGFnYXRpb24gJiYgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgcmV0dXJuIGNvbXBsZXRlZEZpcmVkID0gdHJ1ZTtcbiAgICB9IC8vIENhbGwgd2hlbiBkcmFnRWwgaGFzIGJlZW4gaW5zZXJ0ZWRcblxuXG4gICAgZnVuY3Rpb24gY2hhbmdlZCgpIHtcbiAgICAgIG5ld0luZGV4ID0gaW5kZXgoZHJhZ0VsKTtcbiAgICAgIG5ld0RyYWdnYWJsZUluZGV4ID0gaW5kZXgoZHJhZ0VsLCBvcHRpb25zLmRyYWdnYWJsZSk7XG5cbiAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgc29ydGFibGU6IF90aGlzLFxuICAgICAgICBuYW1lOiAnY2hhbmdlJyxcbiAgICAgICAgdG9FbDogZWwsXG4gICAgICAgIG5ld0luZGV4OiBuZXdJbmRleCxcbiAgICAgICAgbmV3RHJhZ2dhYmxlSW5kZXg6IG5ld0RyYWdnYWJsZUluZGV4LFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChldnQucHJldmVudERlZmF1bHQgIT09IHZvaWQgMCkge1xuICAgICAgZXZ0LmNhbmNlbGFibGUgJiYgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgdGFyZ2V0ID0gY2xvc2VzdCh0YXJnZXQsIG9wdGlvbnMuZHJhZ2dhYmxlLCBlbCwgdHJ1ZSk7XG4gICAgZHJhZ092ZXJFdmVudCgnZHJhZ092ZXInKTtcbiAgICBpZiAoU29ydGFibGUuZXZlbnRDYW5jZWxlZCkgcmV0dXJuIGNvbXBsZXRlZEZpcmVkO1xuXG4gICAgaWYgKGRyYWdFbC5jb250YWlucyhldnQudGFyZ2V0KSB8fCB0YXJnZXQuYW5pbWF0ZWQgJiYgdGFyZ2V0LmFuaW1hdGluZ1ggJiYgdGFyZ2V0LmFuaW1hdGluZ1kgfHwgX3RoaXMuX2lnbm9yZVdoaWxlQW5pbWF0aW5nID09PSB0YXJnZXQpIHtcbiAgICAgIHJldHVybiBjb21wbGV0ZWQoZmFsc2UpO1xuICAgIH1cblxuICAgIGlnbm9yZU5leHRDbGljayA9IGZhbHNlO1xuXG4gICAgaWYgKGFjdGl2ZVNvcnRhYmxlICYmICFvcHRpb25zLmRpc2FibGVkICYmIChpc093bmVyID8gY2FuU29ydCB8fCAocmV2ZXJ0ID0gIXJvb3RFbC5jb250YWlucyhkcmFnRWwpKSAvLyBSZXZlcnRpbmcgaXRlbSBpbnRvIHRoZSBvcmlnaW5hbCBsaXN0XG4gICAgOiBwdXRTb3J0YWJsZSA9PT0gdGhpcyB8fCAodGhpcy5sYXN0UHV0TW9kZSA9IGFjdGl2ZUdyb3VwLmNoZWNrUHVsbCh0aGlzLCBhY3RpdmVTb3J0YWJsZSwgZHJhZ0VsLCBldnQpKSAmJiBncm91cC5jaGVja1B1dCh0aGlzLCBhY3RpdmVTb3J0YWJsZSwgZHJhZ0VsLCBldnQpKSkge1xuICAgICAgdmVydGljYWwgPSB0aGlzLl9nZXREaXJlY3Rpb24oZXZ0LCB0YXJnZXQpID09PSAndmVydGljYWwnO1xuICAgICAgZHJhZ1JlY3QgPSBnZXRSZWN0KGRyYWdFbCk7XG4gICAgICBkcmFnT3ZlckV2ZW50KCdkcmFnT3ZlclZhbGlkJyk7XG4gICAgICBpZiAoU29ydGFibGUuZXZlbnRDYW5jZWxlZCkgcmV0dXJuIGNvbXBsZXRlZEZpcmVkO1xuXG4gICAgICBpZiAocmV2ZXJ0KSB7XG4gICAgICAgIHBhcmVudEVsID0gcm9vdEVsOyAvLyBhY3R1YWxpemF0aW9uXG5cbiAgICAgICAgY2FwdHVyZSgpO1xuXG4gICAgICAgIHRoaXMuX2hpZGVDbG9uZSgpO1xuXG4gICAgICAgIGRyYWdPdmVyRXZlbnQoJ3JldmVydCcpO1xuXG4gICAgICAgIGlmICghU29ydGFibGUuZXZlbnRDYW5jZWxlZCkge1xuICAgICAgICAgIGlmIChuZXh0RWwpIHtcbiAgICAgICAgICAgIHJvb3RFbC5pbnNlcnRCZWZvcmUoZHJhZ0VsLCBuZXh0RWwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByb290RWwuYXBwZW5kQ2hpbGQoZHJhZ0VsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29tcGxldGVkKHRydWUpO1xuICAgICAgfVxuXG4gICAgICB2YXIgZWxMYXN0Q2hpbGQgPSBsYXN0Q2hpbGQoZWwsIG9wdGlvbnMuZHJhZ2dhYmxlKTtcblxuICAgICAgaWYgKCFlbExhc3RDaGlsZCB8fCBfZ2hvc3RJc0xhc3QoZXZ0LCB2ZXJ0aWNhbCwgdGhpcykgJiYgIWVsTGFzdENoaWxkLmFuaW1hdGVkKSB7XG4gICAgICAgIC8vIElmIGFscmVhZHkgYXQgZW5kIG9mIGxpc3Q6IERvIG5vdCBpbnNlcnRcbiAgICAgICAgaWYgKGVsTGFzdENoaWxkID09PSBkcmFnRWwpIHtcbiAgICAgICAgICByZXR1cm4gY29tcGxldGVkKGZhbHNlKTtcbiAgICAgICAgfSAvLyBhc3NpZ24gdGFyZ2V0IG9ubHkgaWYgY29uZGl0aW9uIGlzIHRydWVcblxuXG4gICAgICAgIGlmIChlbExhc3RDaGlsZCAmJiBlbCA9PT0gZXZ0LnRhcmdldCkge1xuICAgICAgICAgIHRhcmdldCA9IGVsTGFzdENoaWxkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgIHRhcmdldFJlY3QgPSBnZXRSZWN0KHRhcmdldCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX29uTW92ZShyb290RWwsIGVsLCBkcmFnRWwsIGRyYWdSZWN0LCB0YXJnZXQsIHRhcmdldFJlY3QsIGV2dCwgISF0YXJnZXQpICE9PSBmYWxzZSkge1xuICAgICAgICAgIGNhcHR1cmUoKTtcbiAgICAgICAgICBlbC5hcHBlbmRDaGlsZChkcmFnRWwpO1xuICAgICAgICAgIHBhcmVudEVsID0gZWw7IC8vIGFjdHVhbGl6YXRpb25cblxuICAgICAgICAgIGNoYW5nZWQoKTtcbiAgICAgICAgICByZXR1cm4gY29tcGxldGVkKHRydWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRhcmdldC5wYXJlbnROb2RlID09PSBlbCkge1xuICAgICAgICB0YXJnZXRSZWN0ID0gZ2V0UmVjdCh0YXJnZXQpO1xuICAgICAgICB2YXIgZGlyZWN0aW9uID0gMCxcbiAgICAgICAgICAgIHRhcmdldEJlZm9yZUZpcnN0U3dhcCxcbiAgICAgICAgICAgIGRpZmZlcmVudExldmVsID0gZHJhZ0VsLnBhcmVudE5vZGUgIT09IGVsLFxuICAgICAgICAgICAgZGlmZmVyZW50Um93Q29sID0gIV9kcmFnRWxJblJvd0NvbHVtbihkcmFnRWwuYW5pbWF0ZWQgJiYgZHJhZ0VsLnRvUmVjdCB8fCBkcmFnUmVjdCwgdGFyZ2V0LmFuaW1hdGVkICYmIHRhcmdldC50b1JlY3QgfHwgdGFyZ2V0UmVjdCwgdmVydGljYWwpLFxuICAgICAgICAgICAgc2lkZTEgPSB2ZXJ0aWNhbCA/ICd0b3AnIDogJ2xlZnQnLFxuICAgICAgICAgICAgc2Nyb2xsZWRQYXN0VG9wID0gaXNTY3JvbGxlZFBhc3QodGFyZ2V0LCAndG9wJywgJ3RvcCcpIHx8IGlzU2Nyb2xsZWRQYXN0KGRyYWdFbCwgJ3RvcCcsICd0b3AnKSxcbiAgICAgICAgICAgIHNjcm9sbEJlZm9yZSA9IHNjcm9sbGVkUGFzdFRvcCA/IHNjcm9sbGVkUGFzdFRvcC5zY3JvbGxUb3AgOiB2b2lkIDA7XG5cbiAgICAgICAgaWYgKGxhc3RUYXJnZXQgIT09IHRhcmdldCkge1xuICAgICAgICAgIHRhcmdldEJlZm9yZUZpcnN0U3dhcCA9IHRhcmdldFJlY3Rbc2lkZTFdO1xuICAgICAgICAgIHBhc3RGaXJzdEludmVydFRocmVzaCA9IGZhbHNlO1xuICAgICAgICAgIGlzQ2lyY3Vtc3RhbnRpYWxJbnZlcnQgPSAhZGlmZmVyZW50Um93Q29sICYmIG9wdGlvbnMuaW52ZXJ0U3dhcCB8fCBkaWZmZXJlbnRMZXZlbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRpcmVjdGlvbiA9IF9nZXRTd2FwRGlyZWN0aW9uKGV2dCwgdGFyZ2V0LCB0YXJnZXRSZWN0LCB2ZXJ0aWNhbCwgZGlmZmVyZW50Um93Q29sID8gMSA6IG9wdGlvbnMuc3dhcFRocmVzaG9sZCwgb3B0aW9ucy5pbnZlcnRlZFN3YXBUaHJlc2hvbGQgPT0gbnVsbCA/IG9wdGlvbnMuc3dhcFRocmVzaG9sZCA6IG9wdGlvbnMuaW52ZXJ0ZWRTd2FwVGhyZXNob2xkLCBpc0NpcmN1bXN0YW50aWFsSW52ZXJ0LCBsYXN0VGFyZ2V0ID09PSB0YXJnZXQpO1xuICAgICAgICB2YXIgc2libGluZztcblxuICAgICAgICBpZiAoZGlyZWN0aW9uICE9PSAwKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGFyZ2V0IGlzIGJlc2lkZSBkcmFnRWwgaW4gcmVzcGVjdGl2ZSBkaXJlY3Rpb24gKGlnbm9yaW5nIGhpZGRlbiBlbGVtZW50cylcbiAgICAgICAgICB2YXIgZHJhZ0luZGV4ID0gaW5kZXgoZHJhZ0VsKTtcblxuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIGRyYWdJbmRleCAtPSBkaXJlY3Rpb247XG4gICAgICAgICAgICBzaWJsaW5nID0gcGFyZW50RWwuY2hpbGRyZW5bZHJhZ0luZGV4XTtcbiAgICAgICAgICB9IHdoaWxlIChzaWJsaW5nICYmIChjc3Moc2libGluZywgJ2Rpc3BsYXknKSA9PT0gJ25vbmUnIHx8IHNpYmxpbmcgPT09IGdob3N0RWwpKTtcbiAgICAgICAgfSAvLyBJZiBkcmFnRWwgaXMgYWxyZWFkeSBiZXNpZGUgdGFyZ2V0OiBEbyBub3QgaW5zZXJ0XG5cblxuICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAwIHx8IHNpYmxpbmcgPT09IHRhcmdldCkge1xuICAgICAgICAgIHJldHVybiBjb21wbGV0ZWQoZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGFzdFRhcmdldCA9IHRhcmdldDtcbiAgICAgICAgbGFzdERpcmVjdGlvbiA9IGRpcmVjdGlvbjtcbiAgICAgICAgdmFyIG5leHRTaWJsaW5nID0gdGFyZ2V0Lm5leHRFbGVtZW50U2libGluZyxcbiAgICAgICAgICAgIGFmdGVyID0gZmFsc2U7XG4gICAgICAgIGFmdGVyID0gZGlyZWN0aW9uID09PSAxO1xuXG4gICAgICAgIHZhciBtb3ZlVmVjdG9yID0gX29uTW92ZShyb290RWwsIGVsLCBkcmFnRWwsIGRyYWdSZWN0LCB0YXJnZXQsIHRhcmdldFJlY3QsIGV2dCwgYWZ0ZXIpO1xuXG4gICAgICAgIGlmIChtb3ZlVmVjdG9yICE9PSBmYWxzZSkge1xuICAgICAgICAgIGlmIChtb3ZlVmVjdG9yID09PSAxIHx8IG1vdmVWZWN0b3IgPT09IC0xKSB7XG4gICAgICAgICAgICBhZnRlciA9IG1vdmVWZWN0b3IgPT09IDE7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3NpbGVudCA9IHRydWU7XG4gICAgICAgICAgc2V0VGltZW91dChfdW5zaWxlbnQsIDMwKTtcbiAgICAgICAgICBjYXB0dXJlKCk7XG5cbiAgICAgICAgICBpZiAoYWZ0ZXIgJiYgIW5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICBlbC5hcHBlbmRDaGlsZChkcmFnRWwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZHJhZ0VsLCBhZnRlciA/IG5leHRTaWJsaW5nIDogdGFyZ2V0KTtcbiAgICAgICAgICB9IC8vIFVuZG8gY2hyb21lJ3Mgc2Nyb2xsIGFkanVzdG1lbnQgKGhhcyBubyBlZmZlY3Qgb24gb3RoZXIgYnJvd3NlcnMpXG5cblxuICAgICAgICAgIGlmIChzY3JvbGxlZFBhc3RUb3ApIHtcbiAgICAgICAgICAgIHNjcm9sbEJ5KHNjcm9sbGVkUGFzdFRvcCwgMCwgc2Nyb2xsQmVmb3JlIC0gc2Nyb2xsZWRQYXN0VG9wLnNjcm9sbFRvcCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcGFyZW50RWwgPSBkcmFnRWwucGFyZW50Tm9kZTsgLy8gYWN0dWFsaXphdGlvblxuICAgICAgICAgIC8vIG11c3QgYmUgZG9uZSBiZWZvcmUgYW5pbWF0aW9uXG5cbiAgICAgICAgICBpZiAodGFyZ2V0QmVmb3JlRmlyc3RTd2FwICE9PSB1bmRlZmluZWQgJiYgIWlzQ2lyY3Vtc3RhbnRpYWxJbnZlcnQpIHtcbiAgICAgICAgICAgIHRhcmdldE1vdmVEaXN0YW5jZSA9IE1hdGguYWJzKHRhcmdldEJlZm9yZUZpcnN0U3dhcCAtIGdldFJlY3QodGFyZ2V0KVtzaWRlMV0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNoYW5nZWQoKTtcbiAgICAgICAgICByZXR1cm4gY29tcGxldGVkKHRydWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChlbC5jb250YWlucyhkcmFnRWwpKSB7XG4gICAgICAgIHJldHVybiBjb21wbGV0ZWQoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgX2lnbm9yZVdoaWxlQW5pbWF0aW5nOiBudWxsLFxuICBfb2ZmTW92ZUV2ZW50czogZnVuY3Rpb24gX29mZk1vdmVFdmVudHMoKSB7XG4gICAgb2ZmKGRvY3VtZW50LCAnbW91c2Vtb3ZlJywgdGhpcy5fb25Ub3VjaE1vdmUpO1xuICAgIG9mZihkb2N1bWVudCwgJ3RvdWNobW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlKTtcbiAgICBvZmYoZG9jdW1lbnQsICdwb2ludGVybW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlKTtcbiAgICBvZmYoZG9jdW1lbnQsICdkcmFnb3ZlcicsIG5lYXJlc3RFbXB0eUluc2VydERldGVjdEV2ZW50KTtcbiAgICBvZmYoZG9jdW1lbnQsICdtb3VzZW1vdmUnLCBuZWFyZXN0RW1wdHlJbnNlcnREZXRlY3RFdmVudCk7XG4gICAgb2ZmKGRvY3VtZW50LCAndG91Y2htb3ZlJywgbmVhcmVzdEVtcHR5SW5zZXJ0RGV0ZWN0RXZlbnQpO1xuICB9LFxuICBfb2ZmVXBFdmVudHM6IGZ1bmN0aW9uIF9vZmZVcEV2ZW50cygpIHtcbiAgICB2YXIgb3duZXJEb2N1bWVudCA9IHRoaXMuZWwub3duZXJEb2N1bWVudDtcbiAgICBvZmYob3duZXJEb2N1bWVudCwgJ21vdXNldXAnLCB0aGlzLl9vbkRyb3ApO1xuICAgIG9mZihvd25lckRvY3VtZW50LCAndG91Y2hlbmQnLCB0aGlzLl9vbkRyb3ApO1xuICAgIG9mZihvd25lckRvY3VtZW50LCAncG9pbnRlcnVwJywgdGhpcy5fb25Ecm9wKTtcbiAgICBvZmYob3duZXJEb2N1bWVudCwgJ3RvdWNoY2FuY2VsJywgdGhpcy5fb25Ecm9wKTtcbiAgICBvZmYoZG9jdW1lbnQsICdzZWxlY3RzdGFydCcsIHRoaXMpO1xuICB9LFxuICBfb25Ecm9wOiBmdW5jdGlvbiBfb25Ecm9wKFxuICAvKipFdmVudCovXG4gIGV2dCkge1xuICAgIHZhciBlbCA9IHRoaXMuZWwsXG4gICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7IC8vIEdldCB0aGUgaW5kZXggb2YgdGhlIGRyYWdnZWQgZWxlbWVudCB3aXRoaW4gaXRzIHBhcmVudFxuXG4gICAgbmV3SW5kZXggPSBpbmRleChkcmFnRWwpO1xuICAgIG5ld0RyYWdnYWJsZUluZGV4ID0gaW5kZXgoZHJhZ0VsLCBvcHRpb25zLmRyYWdnYWJsZSk7XG4gICAgcGx1Z2luRXZlbnQoJ2Ryb3AnLCB0aGlzLCB7XG4gICAgICBldnQ6IGV2dFxuICAgIH0pO1xuICAgIHBhcmVudEVsID0gZHJhZ0VsICYmIGRyYWdFbC5wYXJlbnROb2RlOyAvLyBHZXQgYWdhaW4gYWZ0ZXIgcGx1Z2luIGV2ZW50XG5cbiAgICBuZXdJbmRleCA9IGluZGV4KGRyYWdFbCk7XG4gICAgbmV3RHJhZ2dhYmxlSW5kZXggPSBpbmRleChkcmFnRWwsIG9wdGlvbnMuZHJhZ2dhYmxlKTtcblxuICAgIGlmIChTb3J0YWJsZS5ldmVudENhbmNlbGVkKSB7XG4gICAgICB0aGlzLl9udWxsaW5nKCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdGluZ0RyYWdTdGFydGVkID0gZmFsc2U7XG4gICAgaXNDaXJjdW1zdGFudGlhbEludmVydCA9IGZhbHNlO1xuICAgIHBhc3RGaXJzdEludmVydFRocmVzaCA9IGZhbHNlO1xuICAgIGNsZWFySW50ZXJ2YWwodGhpcy5fbG9vcElkKTtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fZHJhZ1N0YXJ0VGltZXIpO1xuXG4gICAgX2NhbmNlbE5leHRUaWNrKHRoaXMuY2xvbmVJZCk7XG5cbiAgICBfY2FuY2VsTmV4dFRpY2sodGhpcy5fZHJhZ1N0YXJ0SWQpOyAvLyBVbmJpbmQgZXZlbnRzXG5cblxuICAgIGlmICh0aGlzLm5hdGl2ZURyYWdnYWJsZSkge1xuICAgICAgb2ZmKGRvY3VtZW50LCAnZHJvcCcsIHRoaXMpO1xuICAgICAgb2ZmKGVsLCAnZHJhZ3N0YXJ0JywgdGhpcy5fb25EcmFnU3RhcnQpO1xuICAgIH1cblxuICAgIHRoaXMuX29mZk1vdmVFdmVudHMoKTtcblxuICAgIHRoaXMuX29mZlVwRXZlbnRzKCk7XG5cbiAgICBpZiAoU2FmYXJpKSB7XG4gICAgICBjc3MoZG9jdW1lbnQuYm9keSwgJ3VzZXItc2VsZWN0JywgJycpO1xuICAgIH1cblxuICAgIGNzcyhkcmFnRWwsICd0cmFuc2Zvcm0nLCAnJyk7XG5cbiAgICBpZiAoZXZ0KSB7XG4gICAgICBpZiAobW92ZWQpIHtcbiAgICAgICAgZXZ0LmNhbmNlbGFibGUgJiYgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICFvcHRpb25zLmRyb3BCdWJibGUgJiYgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfVxuXG4gICAgICBnaG9zdEVsICYmIGdob3N0RWwucGFyZW50Tm9kZSAmJiBnaG9zdEVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZ2hvc3RFbCk7XG5cbiAgICAgIGlmIChyb290RWwgPT09IHBhcmVudEVsIHx8IHB1dFNvcnRhYmxlICYmIHB1dFNvcnRhYmxlLmxhc3RQdXRNb2RlICE9PSAnY2xvbmUnKSB7XG4gICAgICAgIC8vIFJlbW92ZSBjbG9uZShzKVxuICAgICAgICBjbG9uZUVsICYmIGNsb25lRWwucGFyZW50Tm9kZSAmJiBjbG9uZUVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2xvbmVFbCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChkcmFnRWwpIHtcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgICAgICAgb2ZmKGRyYWdFbCwgJ2RyYWdlbmQnLCB0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF9kaXNhYmxlRHJhZ2dhYmxlKGRyYWdFbCk7XG5cbiAgICAgICAgZHJhZ0VsLnN0eWxlWyd3aWxsLWNoYW5nZSddID0gJyc7IC8vIFJlbW92ZSBjbGFzc2VzXG4gICAgICAgIC8vIGdob3N0Q2xhc3MgaXMgYWRkZWQgaW4gZHJhZ1N0YXJ0ZWRcblxuICAgICAgICBpZiAobW92ZWQgJiYgIWF3YWl0aW5nRHJhZ1N0YXJ0ZWQpIHtcbiAgICAgICAgICB0b2dnbGVDbGFzcyhkcmFnRWwsIHB1dFNvcnRhYmxlID8gcHV0U29ydGFibGUub3B0aW9ucy5naG9zdENsYXNzIDogdGhpcy5vcHRpb25zLmdob3N0Q2xhc3MsIGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRvZ2dsZUNsYXNzKGRyYWdFbCwgdGhpcy5vcHRpb25zLmNob3NlbkNsYXNzLCBmYWxzZSk7IC8vIERyYWcgc3RvcCBldmVudFxuXG4gICAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICBzb3J0YWJsZTogdGhpcyxcbiAgICAgICAgICBuYW1lOiAndW5jaG9vc2UnLFxuICAgICAgICAgIHRvRWw6IHBhcmVudEVsLFxuICAgICAgICAgIG5ld0luZGV4OiBudWxsLFxuICAgICAgICAgIG5ld0RyYWdnYWJsZUluZGV4OiBudWxsLFxuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocm9vdEVsICE9PSBwYXJlbnRFbCkge1xuICAgICAgICAgIGlmIChuZXdJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAvLyBBZGQgZXZlbnRcbiAgICAgICAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgICAgcm9vdEVsOiBwYXJlbnRFbCxcbiAgICAgICAgICAgICAgbmFtZTogJ2FkZCcsXG4gICAgICAgICAgICAgIHRvRWw6IHBhcmVudEVsLFxuICAgICAgICAgICAgICBmcm9tRWw6IHJvb3RFbCxcbiAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICAgICAgICB9KTsgLy8gUmVtb3ZlIGV2ZW50XG5cblxuICAgICAgICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgICAgICBzb3J0YWJsZTogdGhpcyxcbiAgICAgICAgICAgICAgbmFtZTogJ3JlbW92ZScsXG4gICAgICAgICAgICAgIHRvRWw6IHBhcmVudEVsLFxuICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgICAgICAgIH0pOyAvLyBkcmFnIGZyb20gb25lIGxpc3QgYW5kIGRyb3AgaW50byBhbm90aGVyXG5cblxuICAgICAgICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgICAgICByb290RWw6IHBhcmVudEVsLFxuICAgICAgICAgICAgICBuYW1lOiAnc29ydCcsXG4gICAgICAgICAgICAgIHRvRWw6IHBhcmVudEVsLFxuICAgICAgICAgICAgICBmcm9tRWw6IHJvb3RFbCxcbiAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgICAgICBzb3J0YWJsZTogdGhpcyxcbiAgICAgICAgICAgICAgbmFtZTogJ3NvcnQnLFxuICAgICAgICAgICAgICB0b0VsOiBwYXJlbnRFbCxcbiAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwdXRTb3J0YWJsZSAmJiBwdXRTb3J0YWJsZS5zYXZlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKG5ld0luZGV4ICE9PSBvbGRJbmRleCkge1xuICAgICAgICAgICAgaWYgKG5ld0luZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgLy8gZHJhZyAmIGRyb3Agd2l0aGluIHRoZSBzYW1lIGxpc3RcbiAgICAgICAgICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgICAgICAgIHNvcnRhYmxlOiB0aGlzLFxuICAgICAgICAgICAgICAgIG5hbWU6ICd1cGRhdGUnLFxuICAgICAgICAgICAgICAgIHRvRWw6IHBhcmVudEVsLFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICAgICAgc29ydGFibGU6IHRoaXMsXG4gICAgICAgICAgICAgICAgbmFtZTogJ3NvcnQnLFxuICAgICAgICAgICAgICAgIHRvRWw6IHBhcmVudEVsLFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoU29ydGFibGUuYWN0aXZlKSB7XG4gICAgICAgICAgLyoganNoaW50IGVxbnVsbDp0cnVlICovXG4gICAgICAgICAgaWYgKG5ld0luZGV4ID09IG51bGwgfHwgbmV3SW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICBuZXdJbmRleCA9IG9sZEluZGV4O1xuICAgICAgICAgICAgbmV3RHJhZ2dhYmxlSW5kZXggPSBvbGREcmFnZ2FibGVJbmRleDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICBzb3J0YWJsZTogdGhpcyxcbiAgICAgICAgICAgIG5hbWU6ICdlbmQnLFxuICAgICAgICAgICAgdG9FbDogcGFyZW50RWwsXG4gICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgICAgICB9KTsgLy8gU2F2ZSBzb3J0aW5nXG5cblxuICAgICAgICAgIHRoaXMuc2F2ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fbnVsbGluZygpO1xuICB9LFxuICBfbnVsbGluZzogZnVuY3Rpb24gX251bGxpbmcoKSB7XG4gICAgcGx1Z2luRXZlbnQoJ251bGxpbmcnLCB0aGlzKTtcbiAgICByb290RWwgPSBkcmFnRWwgPSBwYXJlbnRFbCA9IGdob3N0RWwgPSBuZXh0RWwgPSBjbG9uZUVsID0gbGFzdERvd25FbCA9IGNsb25lSGlkZGVuID0gdGFwRXZ0ID0gdG91Y2hFdnQgPSBtb3ZlZCA9IG5ld0luZGV4ID0gbmV3RHJhZ2dhYmxlSW5kZXggPSBvbGRJbmRleCA9IG9sZERyYWdnYWJsZUluZGV4ID0gbGFzdFRhcmdldCA9IGxhc3REaXJlY3Rpb24gPSBwdXRTb3J0YWJsZSA9IGFjdGl2ZUdyb3VwID0gU29ydGFibGUuZHJhZ2dlZCA9IFNvcnRhYmxlLmdob3N0ID0gU29ydGFibGUuY2xvbmUgPSBTb3J0YWJsZS5hY3RpdmUgPSBudWxsO1xuICAgIHNhdmVkSW5wdXRDaGVja2VkLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7XG4gICAgICBlbC5jaGVja2VkID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBzYXZlZElucHV0Q2hlY2tlZC5sZW5ndGggPSBsYXN0RHggPSBsYXN0RHkgPSAwO1xuICB9LFxuICBoYW5kbGVFdmVudDogZnVuY3Rpb24gaGFuZGxlRXZlbnQoXG4gIC8qKkV2ZW50Ki9cbiAgZXZ0KSB7XG4gICAgc3dpdGNoIChldnQudHlwZSkge1xuICAgICAgY2FzZSAnZHJvcCc6XG4gICAgICBjYXNlICdkcmFnZW5kJzpcbiAgICAgICAgdGhpcy5fb25Ecm9wKGV2dCk7XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgICBjYXNlICdkcmFnb3Zlcic6XG4gICAgICAgIGlmIChkcmFnRWwpIHtcbiAgICAgICAgICB0aGlzLl9vbkRyYWdPdmVyKGV2dCk7XG5cbiAgICAgICAgICBfZ2xvYmFsRHJhZ092ZXIoZXZ0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdzZWxlY3RzdGFydCc6XG4gICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgdGhlIGl0ZW0gaW50byBhbiBhcnJheSBvZiBzdHJpbmcuXG4gICAqIEByZXR1cm5zIHtTdHJpbmdbXX1cbiAgICovXG4gIHRvQXJyYXk6IGZ1bmN0aW9uIHRvQXJyYXkoKSB7XG4gICAgdmFyIG9yZGVyID0gW10sXG4gICAgICAgIGVsLFxuICAgICAgICBjaGlsZHJlbiA9IHRoaXMuZWwuY2hpbGRyZW4sXG4gICAgICAgIGkgPSAwLFxuICAgICAgICBuID0gY2hpbGRyZW4ubGVuZ3RoLFxuICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuXG4gICAgZm9yICg7IGkgPCBuOyBpKyspIHtcbiAgICAgIGVsID0gY2hpbGRyZW5baV07XG5cbiAgICAgIGlmIChjbG9zZXN0KGVsLCBvcHRpb25zLmRyYWdnYWJsZSwgdGhpcy5lbCwgZmFsc2UpKSB7XG4gICAgICAgIG9yZGVyLnB1c2goZWwuZ2V0QXR0cmlidXRlKG9wdGlvbnMuZGF0YUlkQXR0cikgfHwgX2dlbmVyYXRlSWQoZWwpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb3JkZXI7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNvcnRzIHRoZSBlbGVtZW50cyBhY2NvcmRpbmcgdG8gdGhlIGFycmF5LlxuICAgKiBAcGFyYW0gIHtTdHJpbmdbXX0gIG9yZGVyICBvcmRlciBvZiB0aGUgaXRlbXNcbiAgICovXG4gIHNvcnQ6IGZ1bmN0aW9uIHNvcnQob3JkZXIsIHVzZUFuaW1hdGlvbikge1xuICAgIHZhciBpdGVtcyA9IHt9LFxuICAgICAgICByb290RWwgPSB0aGlzLmVsO1xuICAgIHRoaXMudG9BcnJheSgpLmZvckVhY2goZnVuY3Rpb24gKGlkLCBpKSB7XG4gICAgICB2YXIgZWwgPSByb290RWwuY2hpbGRyZW5baV07XG5cbiAgICAgIGlmIChjbG9zZXN0KGVsLCB0aGlzLm9wdGlvbnMuZHJhZ2dhYmxlLCByb290RWwsIGZhbHNlKSkge1xuICAgICAgICBpdGVtc1tpZF0gPSBlbDtcbiAgICAgIH1cbiAgICB9LCB0aGlzKTtcbiAgICB1c2VBbmltYXRpb24gJiYgdGhpcy5jYXB0dXJlQW5pbWF0aW9uU3RhdGUoKTtcbiAgICBvcmRlci5mb3JFYWNoKGZ1bmN0aW9uIChpZCkge1xuICAgICAgaWYgKGl0ZW1zW2lkXSkge1xuICAgICAgICByb290RWwucmVtb3ZlQ2hpbGQoaXRlbXNbaWRdKTtcbiAgICAgICAgcm9vdEVsLmFwcGVuZENoaWxkKGl0ZW1zW2lkXSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdXNlQW5pbWF0aW9uICYmIHRoaXMuYW5pbWF0ZUFsbCgpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBTYXZlIHRoZSBjdXJyZW50IHNvcnRpbmdcbiAgICovXG4gIHNhdmU6IGZ1bmN0aW9uIHNhdmUoKSB7XG4gICAgdmFyIHN0b3JlID0gdGhpcy5vcHRpb25zLnN0b3JlO1xuICAgIHN0b3JlICYmIHN0b3JlLnNldCAmJiBzdG9yZS5zZXQodGhpcyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIHNldCwgZ2V0IHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IgYnkgdGVzdGluZyB0aGUgZWxlbWVudCBpdHNlbGYgYW5kIHRyYXZlcnNpbmcgdXAgdGhyb3VnaCBpdHMgYW5jZXN0b3JzIGluIHRoZSBET00gdHJlZS5cbiAgICogQHBhcmFtICAge0hUTUxFbGVtZW50fSAgZWxcbiAgICogQHBhcmFtICAge1N0cmluZ30gICAgICAgW3NlbGVjdG9yXSAgZGVmYXVsdDogYG9wdGlvbnMuZHJhZ2dhYmxlYFxuICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR8bnVsbH1cbiAgICovXG4gIGNsb3Nlc3Q6IGZ1bmN0aW9uIGNsb3Nlc3QkMShlbCwgc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gY2xvc2VzdChlbCwgc2VsZWN0b3IgfHwgdGhpcy5vcHRpb25zLmRyYWdnYWJsZSwgdGhpcy5lbCwgZmFsc2UpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBTZXQvZ2V0IG9wdGlvblxuICAgKiBAcGFyYW0gICB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSAgIHsqfSAgICAgIFt2YWx1ZV1cbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBvcHRpb246IGZ1bmN0aW9uIG9wdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuXG4gICAgaWYgKHZhbHVlID09PSB2b2lkIDApIHtcbiAgICAgIHJldHVybiBvcHRpb25zW25hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbW9kaWZpZWRWYWx1ZSA9IFBsdWdpbk1hbmFnZXIubW9kaWZ5T3B0aW9uKHRoaXMsIG5hbWUsIHZhbHVlKTtcblxuICAgICAgaWYgKHR5cGVvZiBtb2RpZmllZFZhbHVlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBvcHRpb25zW25hbWVdID0gbW9kaWZpZWRWYWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wdGlvbnNbbmFtZV0gPSB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5hbWUgPT09ICdncm91cCcpIHtcbiAgICAgICAgX3ByZXBhcmVHcm91cChvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIERlc3Ryb3lcbiAgICovXG4gIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgcGx1Z2luRXZlbnQoJ2Rlc3Ryb3knLCB0aGlzKTtcbiAgICB2YXIgZWwgPSB0aGlzLmVsO1xuICAgIGVsW2V4cGFuZG9dID0gbnVsbDtcbiAgICBvZmYoZWwsICdtb3VzZWRvd24nLCB0aGlzLl9vblRhcFN0YXJ0KTtcbiAgICBvZmYoZWwsICd0b3VjaHN0YXJ0JywgdGhpcy5fb25UYXBTdGFydCk7XG4gICAgb2ZmKGVsLCAncG9pbnRlcmRvd24nLCB0aGlzLl9vblRhcFN0YXJ0KTtcblxuICAgIGlmICh0aGlzLm5hdGl2ZURyYWdnYWJsZSkge1xuICAgICAgb2ZmKGVsLCAnZHJhZ292ZXInLCB0aGlzKTtcbiAgICAgIG9mZihlbCwgJ2RyYWdlbnRlcicsIHRoaXMpO1xuICAgIH0gLy8gUmVtb3ZlIGRyYWdnYWJsZSBhdHRyaWJ1dGVzXG5cblxuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZWwucXVlcnlTZWxlY3RvckFsbCgnW2RyYWdnYWJsZV0nKSwgZnVuY3Rpb24gKGVsKSB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2RyYWdnYWJsZScpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fb25Ecm9wKCk7XG5cbiAgICB0aGlzLl9kaXNhYmxlRGVsYXllZERyYWdFdmVudHMoKTtcblxuICAgIHNvcnRhYmxlcy5zcGxpY2Uoc29ydGFibGVzLmluZGV4T2YodGhpcy5lbCksIDEpO1xuICAgIHRoaXMuZWwgPSBlbCA9IG51bGw7XG4gIH0sXG4gIF9oaWRlQ2xvbmU6IGZ1bmN0aW9uIF9oaWRlQ2xvbmUoKSB7XG4gICAgaWYgKCFjbG9uZUhpZGRlbikge1xuICAgICAgcGx1Z2luRXZlbnQoJ2hpZGVDbG9uZScsIHRoaXMpO1xuICAgICAgaWYgKFNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHJldHVybjtcbiAgICAgIGNzcyhjbG9uZUVsLCAnZGlzcGxheScsICdub25lJyk7XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVtb3ZlQ2xvbmVPbkhpZGUgJiYgY2xvbmVFbC5wYXJlbnROb2RlKSB7XG4gICAgICAgIGNsb25lRWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjbG9uZUVsKTtcbiAgICAgIH1cblxuICAgICAgY2xvbmVIaWRkZW4gPSB0cnVlO1xuICAgIH1cbiAgfSxcbiAgX3Nob3dDbG9uZTogZnVuY3Rpb24gX3Nob3dDbG9uZShwdXRTb3J0YWJsZSkge1xuICAgIGlmIChwdXRTb3J0YWJsZS5sYXN0UHV0TW9kZSAhPT0gJ2Nsb25lJykge1xuICAgICAgdGhpcy5faGlkZUNsb25lKCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY2xvbmVIaWRkZW4pIHtcbiAgICAgIHBsdWdpbkV2ZW50KCdzaG93Q2xvbmUnLCB0aGlzKTtcbiAgICAgIGlmIChTb3J0YWJsZS5ldmVudENhbmNlbGVkKSByZXR1cm47IC8vIHNob3cgY2xvbmUgYXQgZHJhZ0VsIG9yIG9yaWdpbmFsIHBvc2l0aW9uXG5cbiAgICAgIGlmIChkcmFnRWwucGFyZW50Tm9kZSA9PSByb290RWwgJiYgIXRoaXMub3B0aW9ucy5ncm91cC5yZXZlcnRDbG9uZSkge1xuICAgICAgICByb290RWwuaW5zZXJ0QmVmb3JlKGNsb25lRWwsIGRyYWdFbCk7XG4gICAgICB9IGVsc2UgaWYgKG5leHRFbCkge1xuICAgICAgICByb290RWwuaW5zZXJ0QmVmb3JlKGNsb25lRWwsIG5leHRFbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByb290RWwuYXBwZW5kQ2hpbGQoY2xvbmVFbCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZ3JvdXAucmV2ZXJ0Q2xvbmUpIHtcbiAgICAgICAgdGhpcy5hbmltYXRlKGRyYWdFbCwgY2xvbmVFbCk7XG4gICAgICB9XG5cbiAgICAgIGNzcyhjbG9uZUVsLCAnZGlzcGxheScsICcnKTtcbiAgICAgIGNsb25lSGlkZGVuID0gZmFsc2U7XG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiBfZ2xvYmFsRHJhZ092ZXIoXG4vKipFdmVudCovXG5ldnQpIHtcbiAgaWYgKGV2dC5kYXRhVHJhbnNmZXIpIHtcbiAgICBldnQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnbW92ZSc7XG4gIH1cblxuICBldnQuY2FuY2VsYWJsZSAmJiBldnQucHJldmVudERlZmF1bHQoKTtcbn1cblxuZnVuY3Rpb24gX29uTW92ZShmcm9tRWwsIHRvRWwsIGRyYWdFbCwgZHJhZ1JlY3QsIHRhcmdldEVsLCB0YXJnZXRSZWN0LCBvcmlnaW5hbEV2ZW50LCB3aWxsSW5zZXJ0QWZ0ZXIpIHtcbiAgdmFyIGV2dCxcbiAgICAgIHNvcnRhYmxlID0gZnJvbUVsW2V4cGFuZG9dLFxuICAgICAgb25Nb3ZlRm4gPSBzb3J0YWJsZS5vcHRpb25zLm9uTW92ZSxcbiAgICAgIHJldFZhbDsgLy8gU3VwcG9ydCBmb3IgbmV3IEN1c3RvbUV2ZW50IGZlYXR1cmVcblxuICBpZiAod2luZG93LkN1c3RvbUV2ZW50ICYmICFJRTExT3JMZXNzICYmICFFZGdlKSB7XG4gICAgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCdtb3ZlJywge1xuICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcbiAgICBldnQuaW5pdEV2ZW50KCdtb3ZlJywgdHJ1ZSwgdHJ1ZSk7XG4gIH1cblxuICBldnQudG8gPSB0b0VsO1xuICBldnQuZnJvbSA9IGZyb21FbDtcbiAgZXZ0LmRyYWdnZWQgPSBkcmFnRWw7XG4gIGV2dC5kcmFnZ2VkUmVjdCA9IGRyYWdSZWN0O1xuICBldnQucmVsYXRlZCA9IHRhcmdldEVsIHx8IHRvRWw7XG4gIGV2dC5yZWxhdGVkUmVjdCA9IHRhcmdldFJlY3QgfHwgZ2V0UmVjdCh0b0VsKTtcbiAgZXZ0LndpbGxJbnNlcnRBZnRlciA9IHdpbGxJbnNlcnRBZnRlcjtcbiAgZXZ0Lm9yaWdpbmFsRXZlbnQgPSBvcmlnaW5hbEV2ZW50O1xuICBmcm9tRWwuZGlzcGF0Y2hFdmVudChldnQpO1xuXG4gIGlmIChvbk1vdmVGbikge1xuICAgIHJldFZhbCA9IG9uTW92ZUZuLmNhbGwoc29ydGFibGUsIGV2dCwgb3JpZ2luYWxFdmVudCk7XG4gIH1cblxuICByZXR1cm4gcmV0VmFsO1xufVxuXG5mdW5jdGlvbiBfZGlzYWJsZURyYWdnYWJsZShlbCkge1xuICBlbC5kcmFnZ2FibGUgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gX3Vuc2lsZW50KCkge1xuICBfc2lsZW50ID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIF9naG9zdElzTGFzdChldnQsIHZlcnRpY2FsLCBzb3J0YWJsZSkge1xuICB2YXIgcmVjdCA9IGdldFJlY3QobGFzdENoaWxkKHNvcnRhYmxlLmVsLCBzb3J0YWJsZS5vcHRpb25zLmRyYWdnYWJsZSkpO1xuICB2YXIgc3BhY2VyID0gMTA7XG4gIHJldHVybiB2ZXJ0aWNhbCA/IGV2dC5jbGllbnRYID4gcmVjdC5yaWdodCArIHNwYWNlciB8fCBldnQuY2xpZW50WCA8PSByZWN0LnJpZ2h0ICYmIGV2dC5jbGllbnRZID4gcmVjdC5ib3R0b20gJiYgZXZ0LmNsaWVudFggPj0gcmVjdC5sZWZ0IDogZXZ0LmNsaWVudFggPiByZWN0LnJpZ2h0ICYmIGV2dC5jbGllbnRZID4gcmVjdC50b3AgfHwgZXZ0LmNsaWVudFggPD0gcmVjdC5yaWdodCAmJiBldnQuY2xpZW50WSA+IHJlY3QuYm90dG9tICsgc3BhY2VyO1xufVxuXG5mdW5jdGlvbiBfZ2V0U3dhcERpcmVjdGlvbihldnQsIHRhcmdldCwgdGFyZ2V0UmVjdCwgdmVydGljYWwsIHN3YXBUaHJlc2hvbGQsIGludmVydGVkU3dhcFRocmVzaG9sZCwgaW52ZXJ0U3dhcCwgaXNMYXN0VGFyZ2V0KSB7XG4gIHZhciBtb3VzZU9uQXhpcyA9IHZlcnRpY2FsID8gZXZ0LmNsaWVudFkgOiBldnQuY2xpZW50WCxcbiAgICAgIHRhcmdldExlbmd0aCA9IHZlcnRpY2FsID8gdGFyZ2V0UmVjdC5oZWlnaHQgOiB0YXJnZXRSZWN0LndpZHRoLFxuICAgICAgdGFyZ2V0UzEgPSB2ZXJ0aWNhbCA/IHRhcmdldFJlY3QudG9wIDogdGFyZ2V0UmVjdC5sZWZ0LFxuICAgICAgdGFyZ2V0UzIgPSB2ZXJ0aWNhbCA/IHRhcmdldFJlY3QuYm90dG9tIDogdGFyZ2V0UmVjdC5yaWdodCxcbiAgICAgIGludmVydCA9IGZhbHNlO1xuXG4gIGlmICghaW52ZXJ0U3dhcCkge1xuICAgIC8vIE5ldmVyIGludmVydCBvciBjcmVhdGUgZHJhZ0VsIHNoYWRvdyB3aGVuIHRhcmdldCBtb3ZlbWVuZXQgY2F1c2VzIG1vdXNlIHRvIG1vdmUgcGFzdCB0aGUgZW5kIG9mIHJlZ3VsYXIgc3dhcFRocmVzaG9sZFxuICAgIGlmIChpc0xhc3RUYXJnZXQgJiYgdGFyZ2V0TW92ZURpc3RhbmNlIDwgdGFyZ2V0TGVuZ3RoICogc3dhcFRocmVzaG9sZCkge1xuICAgICAgLy8gbXVsdGlwbGllZCBvbmx5IGJ5IHN3YXBUaHJlc2hvbGQgYmVjYXVzZSBtb3VzZSB3aWxsIGFscmVhZHkgYmUgaW5zaWRlIHRhcmdldCBieSAoMSAtIHRocmVzaG9sZCkgKiB0YXJnZXRMZW5ndGggLyAyXG4gICAgICAvLyBjaGVjayBpZiBwYXN0IGZpcnN0IGludmVydCB0aHJlc2hvbGQgb24gc2lkZSBvcHBvc2l0ZSBvZiBsYXN0RGlyZWN0aW9uXG4gICAgICBpZiAoIXBhc3RGaXJzdEludmVydFRocmVzaCAmJiAobGFzdERpcmVjdGlvbiA9PT0gMSA/IG1vdXNlT25BeGlzID4gdGFyZ2V0UzEgKyB0YXJnZXRMZW5ndGggKiBpbnZlcnRlZFN3YXBUaHJlc2hvbGQgLyAyIDogbW91c2VPbkF4aXMgPCB0YXJnZXRTMiAtIHRhcmdldExlbmd0aCAqIGludmVydGVkU3dhcFRocmVzaG9sZCAvIDIpKSB7XG4gICAgICAgIC8vIHBhc3QgZmlyc3QgaW52ZXJ0IHRocmVzaG9sZCwgZG8gbm90IHJlc3RyaWN0IGludmVydGVkIHRocmVzaG9sZCB0byBkcmFnRWwgc2hhZG93XG4gICAgICAgIHBhc3RGaXJzdEludmVydFRocmVzaCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghcGFzdEZpcnN0SW52ZXJ0VGhyZXNoKSB7XG4gICAgICAgIC8vIGRyYWdFbCBzaGFkb3cgKHRhcmdldCBtb3ZlIGRpc3RhbmNlIHNoYWRvdylcbiAgICAgICAgaWYgKGxhc3REaXJlY3Rpb24gPT09IDEgPyBtb3VzZU9uQXhpcyA8IHRhcmdldFMxICsgdGFyZ2V0TW92ZURpc3RhbmNlIC8vIG92ZXIgZHJhZ0VsIHNoYWRvd1xuICAgICAgICA6IG1vdXNlT25BeGlzID4gdGFyZ2V0UzIgLSB0YXJnZXRNb3ZlRGlzdGFuY2UpIHtcbiAgICAgICAgICByZXR1cm4gLWxhc3REaXJlY3Rpb247XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGludmVydCA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlZ3VsYXJcbiAgICAgIGlmIChtb3VzZU9uQXhpcyA+IHRhcmdldFMxICsgdGFyZ2V0TGVuZ3RoICogKDEgLSBzd2FwVGhyZXNob2xkKSAvIDIgJiYgbW91c2VPbkF4aXMgPCB0YXJnZXRTMiAtIHRhcmdldExlbmd0aCAqICgxIC0gc3dhcFRocmVzaG9sZCkgLyAyKSB7XG4gICAgICAgIHJldHVybiBfZ2V0SW5zZXJ0RGlyZWN0aW9uKHRhcmdldCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaW52ZXJ0ID0gaW52ZXJ0IHx8IGludmVydFN3YXA7XG5cbiAgaWYgKGludmVydCkge1xuICAgIC8vIEludmVydCBvZiByZWd1bGFyXG4gICAgaWYgKG1vdXNlT25BeGlzIDwgdGFyZ2V0UzEgKyB0YXJnZXRMZW5ndGggKiBpbnZlcnRlZFN3YXBUaHJlc2hvbGQgLyAyIHx8IG1vdXNlT25BeGlzID4gdGFyZ2V0UzIgLSB0YXJnZXRMZW5ndGggKiBpbnZlcnRlZFN3YXBUaHJlc2hvbGQgLyAyKSB7XG4gICAgICByZXR1cm4gbW91c2VPbkF4aXMgPiB0YXJnZXRTMSArIHRhcmdldExlbmd0aCAvIDIgPyAxIDogLTE7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIDA7XG59XG4vKipcbiAqIEdldHMgdGhlIGRpcmVjdGlvbiBkcmFnRWwgbXVzdCBiZSBzd2FwcGVkIHJlbGF0aXZlIHRvIHRhcmdldCBpbiBvcmRlciB0byBtYWtlIGl0XG4gKiBzZWVtIHRoYXQgZHJhZ0VsIGhhcyBiZWVuIFwiaW5zZXJ0ZWRcIiBpbnRvIHRoYXQgZWxlbWVudCdzIHBvc2l0aW9uXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gdGFyZ2V0ICAgICAgIFRoZSB0YXJnZXQgd2hvc2UgcG9zaXRpb24gZHJhZ0VsIGlzIGJlaW5nIGluc2VydGVkIGF0XG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICAgICAgICAgICAgICAgIERpcmVjdGlvbiBkcmFnRWwgbXVzdCBiZSBzd2FwcGVkXG4gKi9cblxuXG5mdW5jdGlvbiBfZ2V0SW5zZXJ0RGlyZWN0aW9uKHRhcmdldCkge1xuICBpZiAoaW5kZXgoZHJhZ0VsKSA8IGluZGV4KHRhcmdldCkpIHtcbiAgICByZXR1cm4gMTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cbn1cbi8qKlxuICogR2VuZXJhdGUgaWRcbiAqIEBwYXJhbSAgIHtIVE1MRWxlbWVudH0gZWxcbiAqIEByZXR1cm5zIHtTdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cblxuZnVuY3Rpb24gX2dlbmVyYXRlSWQoZWwpIHtcbiAgdmFyIHN0ciA9IGVsLnRhZ05hbWUgKyBlbC5jbGFzc05hbWUgKyBlbC5zcmMgKyBlbC5ocmVmICsgZWwudGV4dENvbnRlbnQsXG4gICAgICBpID0gc3RyLmxlbmd0aCxcbiAgICAgIHN1bSA9IDA7XG5cbiAgd2hpbGUgKGktLSkge1xuICAgIHN1bSArPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgfVxuXG4gIHJldHVybiBzdW0udG9TdHJpbmcoMzYpO1xufVxuXG5mdW5jdGlvbiBfc2F2ZUlucHV0Q2hlY2tlZFN0YXRlKHJvb3QpIHtcbiAgc2F2ZWRJbnB1dENoZWNrZWQubGVuZ3RoID0gMDtcbiAgdmFyIGlucHV0cyA9IHJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0Jyk7XG4gIHZhciBpZHggPSBpbnB1dHMubGVuZ3RoO1xuXG4gIHdoaWxlIChpZHgtLSkge1xuICAgIHZhciBlbCA9IGlucHV0c1tpZHhdO1xuICAgIGVsLmNoZWNrZWQgJiYgc2F2ZWRJbnB1dENoZWNrZWQucHVzaChlbCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX25leHRUaWNrKGZuKSB7XG4gIHJldHVybiBzZXRUaW1lb3V0KGZuLCAwKTtcbn1cblxuZnVuY3Rpb24gX2NhbmNlbE5leHRUaWNrKGlkKSB7XG4gIHJldHVybiBjbGVhclRpbWVvdXQoaWQpO1xufSAvLyBGaXhlZCAjOTczOlxuXG5cbmlmIChkb2N1bWVudEV4aXN0cykge1xuICBvbihkb2N1bWVudCwgJ3RvdWNobW92ZScsIGZ1bmN0aW9uIChldnQpIHtcbiAgICBpZiAoKFNvcnRhYmxlLmFjdGl2ZSB8fCBhd2FpdGluZ0RyYWdTdGFydGVkKSAmJiBldnQuY2FuY2VsYWJsZSkge1xuICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9KTtcbn0gLy8gRXhwb3J0IHV0aWxzXG5cblxuU29ydGFibGUudXRpbHMgPSB7XG4gIG9uOiBvbixcbiAgb2ZmOiBvZmYsXG4gIGNzczogY3NzLFxuICBmaW5kOiBmaW5kLFxuICBpczogZnVuY3Rpb24gaXMoZWwsIHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuICEhY2xvc2VzdChlbCwgc2VsZWN0b3IsIGVsLCBmYWxzZSk7XG4gIH0sXG4gIGV4dGVuZDogZXh0ZW5kLFxuICB0aHJvdHRsZTogdGhyb3R0bGUsXG4gIGNsb3Nlc3Q6IGNsb3Nlc3QsXG4gIHRvZ2dsZUNsYXNzOiB0b2dnbGVDbGFzcyxcbiAgY2xvbmU6IGNsb25lLFxuICBpbmRleDogaW5kZXgsXG4gIG5leHRUaWNrOiBfbmV4dFRpY2ssXG4gIGNhbmNlbE5leHRUaWNrOiBfY2FuY2VsTmV4dFRpY2ssXG4gIGRldGVjdERpcmVjdGlvbjogX2RldGVjdERpcmVjdGlvbixcbiAgZ2V0Q2hpbGQ6IGdldENoaWxkXG59O1xuLyoqXG4gKiBHZXQgdGhlIFNvcnRhYmxlIGluc3RhbmNlIG9mIGFuIGVsZW1lbnRcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBlbGVtZW50IFRoZSBlbGVtZW50XG4gKiBAcmV0dXJuIHtTb3J0YWJsZXx1bmRlZmluZWR9ICAgICAgICAgVGhlIGluc3RhbmNlIG9mIFNvcnRhYmxlXG4gKi9cblxuU29ydGFibGUuZ2V0ID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGVsZW1lbnRbZXhwYW5kb107XG59O1xuLyoqXG4gKiBNb3VudCBhIHBsdWdpbiB0byBTb3J0YWJsZVxuICogQHBhcmFtICB7Li4uU29ydGFibGVQbHVnaW58U29ydGFibGVQbHVnaW5bXX0gcGx1Z2lucyAgICAgICBQbHVnaW5zIGJlaW5nIG1vdW50ZWRcbiAqL1xuXG5cblNvcnRhYmxlLm1vdW50ID0gZnVuY3Rpb24gKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgcGx1Z2lucyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBwbHVnaW5zW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgaWYgKHBsdWdpbnNbMF0uY29uc3RydWN0b3IgPT09IEFycmF5KSBwbHVnaW5zID0gcGx1Z2luc1swXTtcbiAgcGx1Z2lucy5mb3JFYWNoKGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICBpZiAoIXBsdWdpbi5wcm90b3R5cGUgfHwgIXBsdWdpbi5wcm90b3R5cGUuY29uc3RydWN0b3IpIHtcbiAgICAgIHRocm93IFwiU29ydGFibGU6IE1vdW50ZWQgcGx1Z2luIG11c3QgYmUgYSBjb25zdHJ1Y3RvciBmdW5jdGlvbiwgbm90IFwiLmNvbmNhdCh7fS50b1N0cmluZy5jYWxsKHBsdWdpbikpO1xuICAgIH1cblxuICAgIGlmIChwbHVnaW4udXRpbHMpIFNvcnRhYmxlLnV0aWxzID0gX29iamVjdFNwcmVhZCh7fSwgU29ydGFibGUudXRpbHMsIHBsdWdpbi51dGlscyk7XG4gICAgUGx1Z2luTWFuYWdlci5tb3VudChwbHVnaW4pO1xuICB9KTtcbn07XG4vKipcbiAqIENyZWF0ZSBzb3J0YWJsZSBpbnN0YW5jZVxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gIGVsXG4gKiBAcGFyYW0ge09iamVjdH0gICAgICBbb3B0aW9uc11cbiAqL1xuXG5cblNvcnRhYmxlLmNyZWF0ZSA9IGZ1bmN0aW9uIChlbCwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IFNvcnRhYmxlKGVsLCBvcHRpb25zKTtcbn07IC8vIEV4cG9ydFxuXG5cblNvcnRhYmxlLnZlcnNpb24gPSB2ZXJzaW9uO1xuXG52YXIgYXV0b1Njcm9sbHMgPSBbXSxcbiAgICBzY3JvbGxFbCxcbiAgICBzY3JvbGxSb290RWwsXG4gICAgc2Nyb2xsaW5nID0gZmFsc2UsXG4gICAgbGFzdEF1dG9TY3JvbGxYLFxuICAgIGxhc3RBdXRvU2Nyb2xsWSxcbiAgICB0b3VjaEV2dCQxLFxuICAgIHBvaW50ZXJFbGVtQ2hhbmdlZEludGVydmFsO1xuXG5mdW5jdGlvbiBBdXRvU2Nyb2xsUGx1Z2luKCkge1xuICBmdW5jdGlvbiBBdXRvU2Nyb2xsKCkge1xuICAgIHRoaXMuZGVmYXVsdHMgPSB7XG4gICAgICBzY3JvbGw6IHRydWUsXG4gICAgICBzY3JvbGxTZW5zaXRpdml0eTogMzAsXG4gICAgICBzY3JvbGxTcGVlZDogMTAsXG4gICAgICBidWJibGVTY3JvbGw6IHRydWVcbiAgICB9OyAvLyBCaW5kIGFsbCBwcml2YXRlIG1ldGhvZHNcblxuICAgIGZvciAodmFyIGZuIGluIHRoaXMpIHtcbiAgICAgIGlmIChmbi5jaGFyQXQoMCkgPT09ICdfJyAmJiB0eXBlb2YgdGhpc1tmbl0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpc1tmbl0gPSB0aGlzW2ZuXS5iaW5kKHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEF1dG9TY3JvbGwucHJvdG90eXBlID0ge1xuICAgIGRyYWdTdGFydGVkOiBmdW5jdGlvbiBkcmFnU3RhcnRlZChfcmVmKSB7XG4gICAgICB2YXIgb3JpZ2luYWxFdmVudCA9IF9yZWYub3JpZ2luYWxFdmVudDtcblxuICAgICAgaWYgKHRoaXMuc29ydGFibGUubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgICAgIG9uKGRvY3VtZW50LCAnZHJhZ292ZXInLCB0aGlzLl9oYW5kbGVBdXRvU2Nyb2xsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3VwcG9ydFBvaW50ZXIpIHtcbiAgICAgICAgICBvbihkb2N1bWVudCwgJ3BvaW50ZXJtb3ZlJywgdGhpcy5faGFuZGxlRmFsbGJhY2tBdXRvU2Nyb2xsKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcmlnaW5hbEV2ZW50LnRvdWNoZXMpIHtcbiAgICAgICAgICBvbihkb2N1bWVudCwgJ3RvdWNobW92ZScsIHRoaXMuX2hhbmRsZUZhbGxiYWNrQXV0b1Njcm9sbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb24oZG9jdW1lbnQsICdtb3VzZW1vdmUnLCB0aGlzLl9oYW5kbGVGYWxsYmFja0F1dG9TY3JvbGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBkcmFnT3ZlckNvbXBsZXRlZDogZnVuY3Rpb24gZHJhZ092ZXJDb21wbGV0ZWQoX3JlZjIpIHtcbiAgICAgIHZhciBvcmlnaW5hbEV2ZW50ID0gX3JlZjIub3JpZ2luYWxFdmVudDtcblxuICAgICAgLy8gRm9yIHdoZW4gYnViYmxpbmcgaXMgY2FuY2VsZWQgYW5kIHVzaW5nIGZhbGxiYWNrIChmYWxsYmFjayAndG91Y2htb3ZlJyBhbHdheXMgcmVhY2hlZClcbiAgICAgIGlmICghdGhpcy5vcHRpb25zLmRyYWdPdmVyQnViYmxlICYmICFvcmlnaW5hbEV2ZW50LnJvb3RFbCkge1xuICAgICAgICB0aGlzLl9oYW5kbGVBdXRvU2Nyb2xsKG9yaWdpbmFsRXZlbnQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZHJvcDogZnVuY3Rpb24gZHJvcCgpIHtcbiAgICAgIGlmICh0aGlzLnNvcnRhYmxlLm5hdGl2ZURyYWdnYWJsZSkge1xuICAgICAgICBvZmYoZG9jdW1lbnQsICdkcmFnb3ZlcicsIHRoaXMuX2hhbmRsZUF1dG9TY3JvbGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2ZmKGRvY3VtZW50LCAncG9pbnRlcm1vdmUnLCB0aGlzLl9oYW5kbGVGYWxsYmFja0F1dG9TY3JvbGwpO1xuICAgICAgICBvZmYoZG9jdW1lbnQsICd0b3VjaG1vdmUnLCB0aGlzLl9oYW5kbGVGYWxsYmFja0F1dG9TY3JvbGwpO1xuICAgICAgICBvZmYoZG9jdW1lbnQsICdtb3VzZW1vdmUnLCB0aGlzLl9oYW5kbGVGYWxsYmFja0F1dG9TY3JvbGwpO1xuICAgICAgfVxuXG4gICAgICBjbGVhclBvaW50ZXJFbGVtQ2hhbmdlZEludGVydmFsKCk7XG4gICAgICBjbGVhckF1dG9TY3JvbGxzKCk7XG4gICAgICBjYW5jZWxUaHJvdHRsZSgpO1xuICAgIH0sXG4gICAgbnVsbGluZzogZnVuY3Rpb24gbnVsbGluZygpIHtcbiAgICAgIHRvdWNoRXZ0JDEgPSBzY3JvbGxSb290RWwgPSBzY3JvbGxFbCA9IHNjcm9sbGluZyA9IHBvaW50ZXJFbGVtQ2hhbmdlZEludGVydmFsID0gbGFzdEF1dG9TY3JvbGxYID0gbGFzdEF1dG9TY3JvbGxZID0gbnVsbDtcbiAgICAgIGF1dG9TY3JvbGxzLmxlbmd0aCA9IDA7XG4gICAgfSxcbiAgICBfaGFuZGxlRmFsbGJhY2tBdXRvU2Nyb2xsOiBmdW5jdGlvbiBfaGFuZGxlRmFsbGJhY2tBdXRvU2Nyb2xsKGV2dCkge1xuICAgICAgdGhpcy5faGFuZGxlQXV0b1Njcm9sbChldnQsIHRydWUpO1xuICAgIH0sXG4gICAgX2hhbmRsZUF1dG9TY3JvbGw6IGZ1bmN0aW9uIF9oYW5kbGVBdXRvU2Nyb2xsKGV2dCwgZmFsbGJhY2spIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciB4ID0gKGV2dC50b3VjaGVzID8gZXZ0LnRvdWNoZXNbMF0gOiBldnQpLmNsaWVudFgsXG4gICAgICAgICAgeSA9IChldnQudG91Y2hlcyA/IGV2dC50b3VjaGVzWzBdIDogZXZ0KS5jbGllbnRZLFxuICAgICAgICAgIGVsZW0gPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KHgsIHkpO1xuICAgICAgdG91Y2hFdnQkMSA9IGV2dDsgLy8gSUUgZG9lcyBub3Qgc2VlbSB0byBoYXZlIG5hdGl2ZSBhdXRvc2Nyb2xsLFxuICAgICAgLy8gRWRnZSdzIGF1dG9zY3JvbGwgc2VlbXMgdG9vIGNvbmRpdGlvbmFsLFxuICAgICAgLy8gTUFDT1MgU2FmYXJpIGRvZXMgbm90IGhhdmUgYXV0b3Njcm9sbCxcbiAgICAgIC8vIEZpcmVmb3ggYW5kIENocm9tZSBhcmUgZ29vZFxuXG4gICAgICBpZiAoZmFsbGJhY2sgfHwgRWRnZSB8fCBJRTExT3JMZXNzIHx8IFNhZmFyaSkge1xuICAgICAgICBhdXRvU2Nyb2xsKGV2dCwgdGhpcy5vcHRpb25zLCBlbGVtLCBmYWxsYmFjayk7IC8vIExpc3RlbmVyIGZvciBwb2ludGVyIGVsZW1lbnQgY2hhbmdlXG5cbiAgICAgICAgdmFyIG9nRWxlbVNjcm9sbGVyID0gZ2V0UGFyZW50QXV0b1Njcm9sbEVsZW1lbnQoZWxlbSwgdHJ1ZSk7XG5cbiAgICAgICAgaWYgKHNjcm9sbGluZyAmJiAoIXBvaW50ZXJFbGVtQ2hhbmdlZEludGVydmFsIHx8IHggIT09IGxhc3RBdXRvU2Nyb2xsWCB8fCB5ICE9PSBsYXN0QXV0b1Njcm9sbFkpKSB7XG4gICAgICAgICAgcG9pbnRlckVsZW1DaGFuZ2VkSW50ZXJ2YWwgJiYgY2xlYXJQb2ludGVyRWxlbUNoYW5nZWRJbnRlcnZhbCgpOyAvLyBEZXRlY3QgZm9yIHBvaW50ZXIgZWxlbSBjaGFuZ2UsIGVtdWxhdGluZyBuYXRpdmUgRG5EIGJlaGF2aW91clxuXG4gICAgICAgICAgcG9pbnRlckVsZW1DaGFuZ2VkSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbmV3RWxlbSA9IGdldFBhcmVudEF1dG9TY3JvbGxFbGVtZW50KGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoeCwgeSksIHRydWUpO1xuXG4gICAgICAgICAgICBpZiAobmV3RWxlbSAhPT0gb2dFbGVtU2Nyb2xsZXIpIHtcbiAgICAgICAgICAgICAgb2dFbGVtU2Nyb2xsZXIgPSBuZXdFbGVtO1xuICAgICAgICAgICAgICBjbGVhckF1dG9TY3JvbGxzKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGF1dG9TY3JvbGwoZXZ0LCBfdGhpcy5vcHRpb25zLCBuZXdFbGVtLCBmYWxsYmFjayk7XG4gICAgICAgICAgfSwgMTApO1xuICAgICAgICAgIGxhc3RBdXRvU2Nyb2xsWCA9IHg7XG4gICAgICAgICAgbGFzdEF1dG9TY3JvbGxZID0geTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWYgRG5EIGlzIGVuYWJsZWQgKGFuZCBicm93c2VyIGhhcyBnb29kIGF1dG9zY3JvbGxpbmcpLCBmaXJzdCBhdXRvc2Nyb2xsIHdpbGwgYWxyZWFkeSBzY3JvbGwsIHNvIGdldCBwYXJlbnQgYXV0b3Njcm9sbCBvZiBmaXJzdCBhdXRvc2Nyb2xsXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1YmJsZVNjcm9sbCB8fCBnZXRQYXJlbnRBdXRvU2Nyb2xsRWxlbWVudChlbGVtLCB0cnVlKSA9PT0gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpKSB7XG4gICAgICAgICAgY2xlYXJBdXRvU2Nyb2xscygpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGF1dG9TY3JvbGwoZXZ0LCB0aGlzLm9wdGlvbnMsIGdldFBhcmVudEF1dG9TY3JvbGxFbGVtZW50KGVsZW0sIGZhbHNlKSwgZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgcmV0dXJuIF9leHRlbmRzKEF1dG9TY3JvbGwsIHtcbiAgICBwbHVnaW5OYW1lOiAnc2Nyb2xsJyxcbiAgICBpbml0aWFsaXplQnlEZWZhdWx0OiB0cnVlXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjbGVhckF1dG9TY3JvbGxzKCkge1xuICBhdXRvU2Nyb2xscy5mb3JFYWNoKGZ1bmN0aW9uIChhdXRvU2Nyb2xsKSB7XG4gICAgY2xlYXJJbnRlcnZhbChhdXRvU2Nyb2xsLnBpZCk7XG4gIH0pO1xuICBhdXRvU2Nyb2xscyA9IFtdO1xufVxuXG5mdW5jdGlvbiBjbGVhclBvaW50ZXJFbGVtQ2hhbmdlZEludGVydmFsKCkge1xuICBjbGVhckludGVydmFsKHBvaW50ZXJFbGVtQ2hhbmdlZEludGVydmFsKTtcbn1cblxudmFyIGF1dG9TY3JvbGwgPSB0aHJvdHRsZShmdW5jdGlvbiAoZXZ0LCBvcHRpb25zLCByb290RWwsIGlzRmFsbGJhY2spIHtcbiAgLy8gQnVnOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD01MDU1MjFcbiAgaWYgKCFvcHRpb25zLnNjcm9sbCkgcmV0dXJuO1xuICB2YXIgeCA9IChldnQudG91Y2hlcyA/IGV2dC50b3VjaGVzWzBdIDogZXZ0KS5jbGllbnRYLFxuICAgICAgeSA9IChldnQudG91Y2hlcyA/IGV2dC50b3VjaGVzWzBdIDogZXZ0KS5jbGllbnRZLFxuICAgICAgc2VucyA9IG9wdGlvbnMuc2Nyb2xsU2Vuc2l0aXZpdHksXG4gICAgICBzcGVlZCA9IG9wdGlvbnMuc2Nyb2xsU3BlZWQsXG4gICAgICB3aW5TY3JvbGxlciA9IGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKTtcbiAgdmFyIHNjcm9sbFRoaXNJbnN0YW5jZSA9IGZhbHNlLFxuICAgICAgc2Nyb2xsQ3VzdG9tRm47IC8vIE5ldyBzY3JvbGwgcm9vdCwgc2V0IHNjcm9sbEVsXG5cbiAgaWYgKHNjcm9sbFJvb3RFbCAhPT0gcm9vdEVsKSB7XG4gICAgc2Nyb2xsUm9vdEVsID0gcm9vdEVsO1xuICAgIGNsZWFyQXV0b1Njcm9sbHMoKTtcbiAgICBzY3JvbGxFbCA9IG9wdGlvbnMuc2Nyb2xsO1xuICAgIHNjcm9sbEN1c3RvbUZuID0gb3B0aW9ucy5zY3JvbGxGbjtcblxuICAgIGlmIChzY3JvbGxFbCA9PT0gdHJ1ZSkge1xuICAgICAgc2Nyb2xsRWwgPSBnZXRQYXJlbnRBdXRvU2Nyb2xsRWxlbWVudChyb290RWwsIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBsYXllcnNPdXQgPSAwO1xuICB2YXIgY3VycmVudFBhcmVudCA9IHNjcm9sbEVsO1xuXG4gIGRvIHtcbiAgICB2YXIgZWwgPSBjdXJyZW50UGFyZW50LFxuICAgICAgICByZWN0ID0gZ2V0UmVjdChlbCksXG4gICAgICAgIHRvcCA9IHJlY3QudG9wLFxuICAgICAgICBib3R0b20gPSByZWN0LmJvdHRvbSxcbiAgICAgICAgbGVmdCA9IHJlY3QubGVmdCxcbiAgICAgICAgcmlnaHQgPSByZWN0LnJpZ2h0LFxuICAgICAgICB3aWR0aCA9IHJlY3Qud2lkdGgsXG4gICAgICAgIGhlaWdodCA9IHJlY3QuaGVpZ2h0LFxuICAgICAgICBjYW5TY3JvbGxYID0gdm9pZCAwLFxuICAgICAgICBjYW5TY3JvbGxZID0gdm9pZCAwLFxuICAgICAgICBzY3JvbGxXaWR0aCA9IGVsLnNjcm9sbFdpZHRoLFxuICAgICAgICBzY3JvbGxIZWlnaHQgPSBlbC5zY3JvbGxIZWlnaHQsXG4gICAgICAgIGVsQ1NTID0gY3NzKGVsKSxcbiAgICAgICAgc2Nyb2xsUG9zWCA9IGVsLnNjcm9sbExlZnQsXG4gICAgICAgIHNjcm9sbFBvc1kgPSBlbC5zY3JvbGxUb3A7XG5cbiAgICBpZiAoZWwgPT09IHdpblNjcm9sbGVyKSB7XG4gICAgICBjYW5TY3JvbGxYID0gd2lkdGggPCBzY3JvbGxXaWR0aCAmJiAoZWxDU1Mub3ZlcmZsb3dYID09PSAnYXV0bycgfHwgZWxDU1Mub3ZlcmZsb3dYID09PSAnc2Nyb2xsJyB8fCBlbENTUy5vdmVyZmxvd1ggPT09ICd2aXNpYmxlJyk7XG4gICAgICBjYW5TY3JvbGxZID0gaGVpZ2h0IDwgc2Nyb2xsSGVpZ2h0ICYmIChlbENTUy5vdmVyZmxvd1kgPT09ICdhdXRvJyB8fCBlbENTUy5vdmVyZmxvd1kgPT09ICdzY3JvbGwnIHx8IGVsQ1NTLm92ZXJmbG93WSA9PT0gJ3Zpc2libGUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FuU2Nyb2xsWCA9IHdpZHRoIDwgc2Nyb2xsV2lkdGggJiYgKGVsQ1NTLm92ZXJmbG93WCA9PT0gJ2F1dG8nIHx8IGVsQ1NTLm92ZXJmbG93WCA9PT0gJ3Njcm9sbCcpO1xuICAgICAgY2FuU2Nyb2xsWSA9IGhlaWdodCA8IHNjcm9sbEhlaWdodCAmJiAoZWxDU1Mub3ZlcmZsb3dZID09PSAnYXV0bycgfHwgZWxDU1Mub3ZlcmZsb3dZID09PSAnc2Nyb2xsJyk7XG4gICAgfVxuXG4gICAgdmFyIHZ4ID0gY2FuU2Nyb2xsWCAmJiAoTWF0aC5hYnMocmlnaHQgLSB4KSA8PSBzZW5zICYmIHNjcm9sbFBvc1ggKyB3aWR0aCA8IHNjcm9sbFdpZHRoKSAtIChNYXRoLmFicyhsZWZ0IC0geCkgPD0gc2VucyAmJiAhIXNjcm9sbFBvc1gpO1xuICAgIHZhciB2eSA9IGNhblNjcm9sbFkgJiYgKE1hdGguYWJzKGJvdHRvbSAtIHkpIDw9IHNlbnMgJiYgc2Nyb2xsUG9zWSArIGhlaWdodCA8IHNjcm9sbEhlaWdodCkgLSAoTWF0aC5hYnModG9wIC0geSkgPD0gc2VucyAmJiAhIXNjcm9sbFBvc1kpO1xuXG4gICAgaWYgKCFhdXRvU2Nyb2xsc1tsYXllcnNPdXRdKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBsYXllcnNPdXQ7IGkrKykge1xuICAgICAgICBpZiAoIWF1dG9TY3JvbGxzW2ldKSB7XG4gICAgICAgICAgYXV0b1Njcm9sbHNbaV0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhdXRvU2Nyb2xsc1tsYXllcnNPdXRdLnZ4ICE9IHZ4IHx8IGF1dG9TY3JvbGxzW2xheWVyc091dF0udnkgIT0gdnkgfHwgYXV0b1Njcm9sbHNbbGF5ZXJzT3V0XS5lbCAhPT0gZWwpIHtcbiAgICAgIGF1dG9TY3JvbGxzW2xheWVyc091dF0uZWwgPSBlbDtcbiAgICAgIGF1dG9TY3JvbGxzW2xheWVyc091dF0udnggPSB2eDtcbiAgICAgIGF1dG9TY3JvbGxzW2xheWVyc091dF0udnkgPSB2eTtcbiAgICAgIGNsZWFySW50ZXJ2YWwoYXV0b1Njcm9sbHNbbGF5ZXJzT3V0XS5waWQpO1xuXG4gICAgICBpZiAodnggIT0gMCB8fCB2eSAhPSAwKSB7XG4gICAgICAgIHNjcm9sbFRoaXNJbnN0YW5jZSA9IHRydWU7XG4gICAgICAgIC8qIGpzaGludCBsb29wZnVuYzp0cnVlICovXG5cbiAgICAgICAgYXV0b1Njcm9sbHNbbGF5ZXJzT3V0XS5waWQgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gZW11bGF0ZSBkcmFnIG92ZXIgZHVyaW5nIGF1dG9zY3JvbGwgKGZhbGxiYWNrKSwgZW11bGF0aW5nIG5hdGl2ZSBEbkQgYmVoYXZpb3VyXG4gICAgICAgICAgaWYgKGlzRmFsbGJhY2sgJiYgdGhpcy5sYXllciA9PT0gMCkge1xuICAgICAgICAgICAgU29ydGFibGUuYWN0aXZlLl9vblRvdWNoTW92ZSh0b3VjaEV2dCQxKTsgLy8gVG8gbW92ZSBnaG9zdCBpZiBpdCBpcyBwb3NpdGlvbmVkIGFic29sdXRlbHlcblxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBzY3JvbGxPZmZzZXRZID0gYXV0b1Njcm9sbHNbdGhpcy5sYXllcl0udnkgPyBhdXRvU2Nyb2xsc1t0aGlzLmxheWVyXS52eSAqIHNwZWVkIDogMDtcbiAgICAgICAgICB2YXIgc2Nyb2xsT2Zmc2V0WCA9IGF1dG9TY3JvbGxzW3RoaXMubGF5ZXJdLnZ4ID8gYXV0b1Njcm9sbHNbdGhpcy5sYXllcl0udnggKiBzcGVlZCA6IDA7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIHNjcm9sbEN1c3RvbUZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBpZiAoc2Nyb2xsQ3VzdG9tRm4uY2FsbChTb3J0YWJsZS5kcmFnZ2VkLnBhcmVudE5vZGVbZXhwYW5kb10sIHNjcm9sbE9mZnNldFgsIHNjcm9sbE9mZnNldFksIGV2dCwgdG91Y2hFdnQkMSwgYXV0b1Njcm9sbHNbdGhpcy5sYXllcl0uZWwpICE9PSAnY29udGludWUnKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzY3JvbGxCeShhdXRvU2Nyb2xsc1t0aGlzLmxheWVyXS5lbCwgc2Nyb2xsT2Zmc2V0WCwgc2Nyb2xsT2Zmc2V0WSk7XG4gICAgICAgIH0uYmluZCh7XG4gICAgICAgICAgbGF5ZXI6IGxheWVyc091dFxuICAgICAgICB9KSwgMjQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxheWVyc091dCsrO1xuICB9IHdoaWxlIChvcHRpb25zLmJ1YmJsZVNjcm9sbCAmJiBjdXJyZW50UGFyZW50ICE9PSB3aW5TY3JvbGxlciAmJiAoY3VycmVudFBhcmVudCA9IGdldFBhcmVudEF1dG9TY3JvbGxFbGVtZW50KGN1cnJlbnRQYXJlbnQsIGZhbHNlKSkpO1xuXG4gIHNjcm9sbGluZyA9IHNjcm9sbFRoaXNJbnN0YW5jZTsgLy8gaW4gY2FzZSBhbm90aGVyIGZ1bmN0aW9uIGNhdGNoZXMgc2Nyb2xsaW5nIGFzIGZhbHNlIGluIGJldHdlZW4gd2hlbiBpdCBpcyBub3Rcbn0sIDMwKTtcblxudmFyIGRyb3AgPSBmdW5jdGlvbiBkcm9wKF9yZWYpIHtcbiAgdmFyIG9yaWdpbmFsRXZlbnQgPSBfcmVmLm9yaWdpbmFsRXZlbnQsXG4gICAgICBwdXRTb3J0YWJsZSA9IF9yZWYucHV0U29ydGFibGUsXG4gICAgICBkcmFnRWwgPSBfcmVmLmRyYWdFbCxcbiAgICAgIGFjdGl2ZVNvcnRhYmxlID0gX3JlZi5hY3RpdmVTb3J0YWJsZSxcbiAgICAgIGRpc3BhdGNoU29ydGFibGVFdmVudCA9IF9yZWYuZGlzcGF0Y2hTb3J0YWJsZUV2ZW50LFxuICAgICAgaGlkZUdob3N0Rm9yVGFyZ2V0ID0gX3JlZi5oaWRlR2hvc3RGb3JUYXJnZXQsXG4gICAgICB1bmhpZGVHaG9zdEZvclRhcmdldCA9IF9yZWYudW5oaWRlR2hvc3RGb3JUYXJnZXQ7XG4gIGlmICghb3JpZ2luYWxFdmVudCkgcmV0dXJuO1xuICB2YXIgdG9Tb3J0YWJsZSA9IHB1dFNvcnRhYmxlIHx8IGFjdGl2ZVNvcnRhYmxlO1xuICBoaWRlR2hvc3RGb3JUYXJnZXQoKTtcbiAgdmFyIHRvdWNoID0gb3JpZ2luYWxFdmVudC5jaGFuZ2VkVG91Y2hlcyAmJiBvcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aCA/IG9yaWdpbmFsRXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0gOiBvcmlnaW5hbEV2ZW50O1xuICB2YXIgdGFyZ2V0ID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCh0b3VjaC5jbGllbnRYLCB0b3VjaC5jbGllbnRZKTtcbiAgdW5oaWRlR2hvc3RGb3JUYXJnZXQoKTtcblxuICBpZiAodG9Tb3J0YWJsZSAmJiAhdG9Tb3J0YWJsZS5lbC5jb250YWlucyh0YXJnZXQpKSB7XG4gICAgZGlzcGF0Y2hTb3J0YWJsZUV2ZW50KCdzcGlsbCcpO1xuICAgIHRoaXMub25TcGlsbCh7XG4gICAgICBkcmFnRWw6IGRyYWdFbCxcbiAgICAgIHB1dFNvcnRhYmxlOiBwdXRTb3J0YWJsZVxuICAgIH0pO1xuICB9XG59O1xuXG5mdW5jdGlvbiBSZXZlcnQoKSB7fVxuXG5SZXZlcnQucHJvdG90eXBlID0ge1xuICBzdGFydEluZGV4OiBudWxsLFxuICBkcmFnU3RhcnQ6IGZ1bmN0aW9uIGRyYWdTdGFydChfcmVmMikge1xuICAgIHZhciBvbGREcmFnZ2FibGVJbmRleCA9IF9yZWYyLm9sZERyYWdnYWJsZUluZGV4O1xuICAgIHRoaXMuc3RhcnRJbmRleCA9IG9sZERyYWdnYWJsZUluZGV4O1xuICB9LFxuICBvblNwaWxsOiBmdW5jdGlvbiBvblNwaWxsKF9yZWYzKSB7XG4gICAgdmFyIGRyYWdFbCA9IF9yZWYzLmRyYWdFbCxcbiAgICAgICAgcHV0U29ydGFibGUgPSBfcmVmMy5wdXRTb3J0YWJsZTtcbiAgICB0aGlzLnNvcnRhYmxlLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuXG4gICAgaWYgKHB1dFNvcnRhYmxlKSB7XG4gICAgICBwdXRTb3J0YWJsZS5jYXB0dXJlQW5pbWF0aW9uU3RhdGUoKTtcbiAgICB9XG5cbiAgICB2YXIgbmV4dFNpYmxpbmcgPSBnZXRDaGlsZCh0aGlzLnNvcnRhYmxlLmVsLCB0aGlzLnN0YXJ0SW5kZXgsIHRoaXMub3B0aW9ucyk7XG5cbiAgICBpZiAobmV4dFNpYmxpbmcpIHtcbiAgICAgIHRoaXMuc29ydGFibGUuZWwuaW5zZXJ0QmVmb3JlKGRyYWdFbCwgbmV4dFNpYmxpbmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNvcnRhYmxlLmVsLmFwcGVuZENoaWxkKGRyYWdFbCk7XG4gICAgfVxuXG4gICAgdGhpcy5zb3J0YWJsZS5hbmltYXRlQWxsKCk7XG5cbiAgICBpZiAocHV0U29ydGFibGUpIHtcbiAgICAgIHB1dFNvcnRhYmxlLmFuaW1hdGVBbGwoKTtcbiAgICB9XG4gIH0sXG4gIGRyb3A6IGRyb3Bcbn07XG5cbl9leHRlbmRzKFJldmVydCwge1xuICBwbHVnaW5OYW1lOiAncmV2ZXJ0T25TcGlsbCdcbn0pO1xuXG5mdW5jdGlvbiBSZW1vdmUoKSB7fVxuXG5SZW1vdmUucHJvdG90eXBlID0ge1xuICBvblNwaWxsOiBmdW5jdGlvbiBvblNwaWxsKF9yZWY0KSB7XG4gICAgdmFyIGRyYWdFbCA9IF9yZWY0LmRyYWdFbCxcbiAgICAgICAgcHV0U29ydGFibGUgPSBfcmVmNC5wdXRTb3J0YWJsZTtcbiAgICB2YXIgcGFyZW50U29ydGFibGUgPSBwdXRTb3J0YWJsZSB8fCB0aGlzLnNvcnRhYmxlO1xuICAgIHBhcmVudFNvcnRhYmxlLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuICAgIGRyYWdFbC5wYXJlbnROb2RlICYmIGRyYWdFbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGRyYWdFbCk7XG4gICAgcGFyZW50U29ydGFibGUuYW5pbWF0ZUFsbCgpO1xuICB9LFxuICBkcm9wOiBkcm9wXG59O1xuXG5fZXh0ZW5kcyhSZW1vdmUsIHtcbiAgcGx1Z2luTmFtZTogJ3JlbW92ZU9uU3BpbGwnXG59KTtcblxudmFyIGxhc3RTd2FwRWw7XG5cbmZ1bmN0aW9uIFN3YXBQbHVnaW4oKSB7XG4gIGZ1bmN0aW9uIFN3YXAoKSB7XG4gICAgdGhpcy5kZWZhdWx0cyA9IHtcbiAgICAgIHN3YXBDbGFzczogJ3NvcnRhYmxlLXN3YXAtaGlnaGxpZ2h0J1xuICAgIH07XG4gIH1cblxuICBTd2FwLnByb3RvdHlwZSA9IHtcbiAgICBkcmFnU3RhcnQ6IGZ1bmN0aW9uIGRyYWdTdGFydChfcmVmKSB7XG4gICAgICB2YXIgZHJhZ0VsID0gX3JlZi5kcmFnRWw7XG4gICAgICBsYXN0U3dhcEVsID0gZHJhZ0VsO1xuICAgIH0sXG4gICAgZHJhZ092ZXJWYWxpZDogZnVuY3Rpb24gZHJhZ092ZXJWYWxpZChfcmVmMikge1xuICAgICAgdmFyIGNvbXBsZXRlZCA9IF9yZWYyLmNvbXBsZXRlZCxcbiAgICAgICAgICB0YXJnZXQgPSBfcmVmMi50YXJnZXQsXG4gICAgICAgICAgb25Nb3ZlID0gX3JlZjIub25Nb3ZlLFxuICAgICAgICAgIGFjdGl2ZVNvcnRhYmxlID0gX3JlZjIuYWN0aXZlU29ydGFibGUsXG4gICAgICAgICAgY2hhbmdlZCA9IF9yZWYyLmNoYW5nZWQsXG4gICAgICAgICAgY2FuY2VsID0gX3JlZjIuY2FuY2VsO1xuICAgICAgaWYgKCFhY3RpdmVTb3J0YWJsZS5vcHRpb25zLnN3YXApIHJldHVybjtcbiAgICAgIHZhciBlbCA9IHRoaXMuc29ydGFibGUuZWwsXG4gICAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcblxuICAgICAgaWYgKHRhcmdldCAmJiB0YXJnZXQgIT09IGVsKSB7XG4gICAgICAgIHZhciBwcmV2U3dhcEVsID0gbGFzdFN3YXBFbDtcblxuICAgICAgICBpZiAob25Nb3ZlKHRhcmdldCkgIT09IGZhbHNlKSB7XG4gICAgICAgICAgdG9nZ2xlQ2xhc3ModGFyZ2V0LCBvcHRpb25zLnN3YXBDbGFzcywgdHJ1ZSk7XG4gICAgICAgICAgbGFzdFN3YXBFbCA9IHRhcmdldDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsYXN0U3dhcEVsID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcmV2U3dhcEVsICYmIHByZXZTd2FwRWwgIT09IGxhc3RTd2FwRWwpIHtcbiAgICAgICAgICB0b2dnbGVDbGFzcyhwcmV2U3dhcEVsLCBvcHRpb25zLnN3YXBDbGFzcywgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNoYW5nZWQoKTtcbiAgICAgIGNvbXBsZXRlZCh0cnVlKTtcbiAgICAgIGNhbmNlbCgpO1xuICAgIH0sXG4gICAgZHJvcDogZnVuY3Rpb24gZHJvcChfcmVmMykge1xuICAgICAgdmFyIGFjdGl2ZVNvcnRhYmxlID0gX3JlZjMuYWN0aXZlU29ydGFibGUsXG4gICAgICAgICAgcHV0U29ydGFibGUgPSBfcmVmMy5wdXRTb3J0YWJsZSxcbiAgICAgICAgICBkcmFnRWwgPSBfcmVmMy5kcmFnRWw7XG4gICAgICB2YXIgdG9Tb3J0YWJsZSA9IHB1dFNvcnRhYmxlIHx8IHRoaXMuc29ydGFibGU7XG4gICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgIGxhc3RTd2FwRWwgJiYgdG9nZ2xlQ2xhc3MobGFzdFN3YXBFbCwgb3B0aW9ucy5zd2FwQ2xhc3MsIGZhbHNlKTtcblxuICAgICAgaWYgKGxhc3RTd2FwRWwgJiYgKG9wdGlvbnMuc3dhcCB8fCBwdXRTb3J0YWJsZSAmJiBwdXRTb3J0YWJsZS5vcHRpb25zLnN3YXApKSB7XG4gICAgICAgIGlmIChkcmFnRWwgIT09IGxhc3RTd2FwRWwpIHtcbiAgICAgICAgICB0b1NvcnRhYmxlLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuICAgICAgICAgIGlmICh0b1NvcnRhYmxlICE9PSBhY3RpdmVTb3J0YWJsZSkgYWN0aXZlU29ydGFibGUuY2FwdHVyZUFuaW1hdGlvblN0YXRlKCk7XG4gICAgICAgICAgc3dhcE5vZGVzKGRyYWdFbCwgbGFzdFN3YXBFbCk7XG4gICAgICAgICAgdG9Tb3J0YWJsZS5hbmltYXRlQWxsKCk7XG4gICAgICAgICAgaWYgKHRvU29ydGFibGUgIT09IGFjdGl2ZVNvcnRhYmxlKSBhY3RpdmVTb3J0YWJsZS5hbmltYXRlQWxsKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIG51bGxpbmc6IGZ1bmN0aW9uIG51bGxpbmcoKSB7XG4gICAgICBsYXN0U3dhcEVsID0gbnVsbDtcbiAgICB9XG4gIH07XG4gIHJldHVybiBfZXh0ZW5kcyhTd2FwLCB7XG4gICAgcGx1Z2luTmFtZTogJ3N3YXAnLFxuICAgIGV2ZW50UHJvcGVydGllczogZnVuY3Rpb24gZXZlbnRQcm9wZXJ0aWVzKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3dhcEl0ZW06IGxhc3RTd2FwRWxcbiAgICAgIH07XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gc3dhcE5vZGVzKG4xLCBuMikge1xuICB2YXIgcDEgPSBuMS5wYXJlbnROb2RlLFxuICAgICAgcDIgPSBuMi5wYXJlbnROb2RlLFxuICAgICAgaTEsXG4gICAgICBpMjtcbiAgaWYgKCFwMSB8fCAhcDIgfHwgcDEuaXNFcXVhbE5vZGUobjIpIHx8IHAyLmlzRXF1YWxOb2RlKG4xKSkgcmV0dXJuO1xuICBpMSA9IGluZGV4KG4xKTtcbiAgaTIgPSBpbmRleChuMik7XG5cbiAgaWYgKHAxLmlzRXF1YWxOb2RlKHAyKSAmJiBpMSA8IGkyKSB7XG4gICAgaTIrKztcbiAgfVxuXG4gIHAxLmluc2VydEJlZm9yZShuMiwgcDEuY2hpbGRyZW5baTFdKTtcbiAgcDIuaW5zZXJ0QmVmb3JlKG4xLCBwMi5jaGlsZHJlbltpMl0pO1xufVxuXG52YXIgbXVsdGlEcmFnRWxlbWVudHMgPSBbXSxcbiAgICBtdWx0aURyYWdDbG9uZXMgPSBbXSxcbiAgICBsYXN0TXVsdGlEcmFnU2VsZWN0LFxuICAgIC8vIGZvciBzZWxlY3Rpb24gd2l0aCBtb2RpZmllciBrZXkgZG93biAoU0hJRlQpXG5tdWx0aURyYWdTb3J0YWJsZSxcbiAgICBpbml0aWFsRm9sZGluZyA9IGZhbHNlLFxuICAgIC8vIEluaXRpYWwgbXVsdGktZHJhZyBmb2xkIHdoZW4gZHJhZyBzdGFydGVkXG5mb2xkaW5nID0gZmFsc2UsXG4gICAgLy8gRm9sZGluZyBhbnkgb3RoZXIgdGltZVxuZHJhZ1N0YXJ0ZWQgPSBmYWxzZSxcbiAgICBkcmFnRWwkMSxcbiAgICBjbG9uZXNGcm9tUmVjdCxcbiAgICBjbG9uZXNIaWRkZW47XG5cbmZ1bmN0aW9uIE11bHRpRHJhZ1BsdWdpbigpIHtcbiAgZnVuY3Rpb24gTXVsdGlEcmFnKHNvcnRhYmxlKSB7XG4gICAgLy8gQmluZCBhbGwgcHJpdmF0ZSBtZXRob2RzXG4gICAgZm9yICh2YXIgZm4gaW4gdGhpcykge1xuICAgICAgaWYgKGZuLmNoYXJBdCgwKSA9PT0gJ18nICYmIHR5cGVvZiB0aGlzW2ZuXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzW2ZuXSA9IHRoaXNbZm5dLmJpbmQodGhpcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNvcnRhYmxlLm9wdGlvbnMuc3VwcG9ydFBvaW50ZXIpIHtcbiAgICAgIG9uKGRvY3VtZW50LCAncG9pbnRlcnVwJywgdGhpcy5fZGVzZWxlY3RNdWx0aURyYWcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvbihkb2N1bWVudCwgJ21vdXNldXAnLCB0aGlzLl9kZXNlbGVjdE11bHRpRHJhZyk7XG4gICAgICBvbihkb2N1bWVudCwgJ3RvdWNoZW5kJywgdGhpcy5fZGVzZWxlY3RNdWx0aURyYWcpO1xuICAgIH1cblxuICAgIG9uKGRvY3VtZW50LCAna2V5ZG93bicsIHRoaXMuX2NoZWNrS2V5RG93bik7XG4gICAgb24oZG9jdW1lbnQsICdrZXl1cCcsIHRoaXMuX2NoZWNrS2V5VXApO1xuICAgIHRoaXMuZGVmYXVsdHMgPSB7XG4gICAgICBzZWxlY3RlZENsYXNzOiAnc29ydGFibGUtc2VsZWN0ZWQnLFxuICAgICAgbXVsdGlEcmFnS2V5OiBudWxsLFxuICAgICAgc2V0RGF0YTogZnVuY3Rpb24gc2V0RGF0YShkYXRhVHJhbnNmZXIsIGRyYWdFbCkge1xuICAgICAgICB2YXIgZGF0YSA9ICcnO1xuXG4gICAgICAgIGlmIChtdWx0aURyYWdFbGVtZW50cy5sZW5ndGggJiYgbXVsdGlEcmFnU29ydGFibGUgPT09IHNvcnRhYmxlKSB7XG4gICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCwgaSkge1xuICAgICAgICAgICAgZGF0YSArPSAoIWkgPyAnJyA6ICcsICcpICsgbXVsdGlEcmFnRWxlbWVudC50ZXh0Q29udGVudDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkYXRhID0gZHJhZ0VsLnRleHRDb250ZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgZGF0YVRyYW5zZmVyLnNldERhdGEoJ1RleHQnLCBkYXRhKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgTXVsdGlEcmFnLnByb3RvdHlwZSA9IHtcbiAgICBtdWx0aURyYWdLZXlEb3duOiBmYWxzZSxcbiAgICBpc011bHRpRHJhZzogZmFsc2UsXG4gICAgZGVsYXlTdGFydEdsb2JhbDogZnVuY3Rpb24gZGVsYXlTdGFydEdsb2JhbChfcmVmKSB7XG4gICAgICB2YXIgZHJhZ2dlZCA9IF9yZWYuZHJhZ0VsO1xuICAgICAgZHJhZ0VsJDEgPSBkcmFnZ2VkO1xuICAgIH0sXG4gICAgZGVsYXlFbmRlZDogZnVuY3Rpb24gZGVsYXlFbmRlZCgpIHtcbiAgICAgIHRoaXMuaXNNdWx0aURyYWcgPSB+bXVsdGlEcmFnRWxlbWVudHMuaW5kZXhPZihkcmFnRWwkMSk7XG4gICAgfSxcbiAgICBzZXR1cENsb25lOiBmdW5jdGlvbiBzZXR1cENsb25lKF9yZWYyKSB7XG4gICAgICB2YXIgc29ydGFibGUgPSBfcmVmMi5zb3J0YWJsZSxcbiAgICAgICAgICBjYW5jZWwgPSBfcmVmMi5jYW5jZWw7XG4gICAgICBpZiAoIXRoaXMuaXNNdWx0aURyYWcpIHJldHVybjtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtdWx0aURyYWdFbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBtdWx0aURyYWdDbG9uZXMucHVzaChjbG9uZShtdWx0aURyYWdFbGVtZW50c1tpXSkpO1xuICAgICAgICBtdWx0aURyYWdDbG9uZXNbaV0uc29ydGFibGVJbmRleCA9IG11bHRpRHJhZ0VsZW1lbnRzW2ldLnNvcnRhYmxlSW5kZXg7XG4gICAgICAgIG11bHRpRHJhZ0Nsb25lc1tpXS5kcmFnZ2FibGUgPSBmYWxzZTtcbiAgICAgICAgbXVsdGlEcmFnQ2xvbmVzW2ldLnN0eWxlWyd3aWxsLWNoYW5nZSddID0gJyc7XG4gICAgICAgIHRvZ2dsZUNsYXNzKG11bHRpRHJhZ0Nsb25lc1tpXSwgdGhpcy5vcHRpb25zLnNlbGVjdGVkQ2xhc3MsIGZhbHNlKTtcbiAgICAgICAgbXVsdGlEcmFnRWxlbWVudHNbaV0gPT09IGRyYWdFbCQxICYmIHRvZ2dsZUNsYXNzKG11bHRpRHJhZ0Nsb25lc1tpXSwgdGhpcy5vcHRpb25zLmNob3NlbkNsYXNzLCBmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIHNvcnRhYmxlLl9oaWRlQ2xvbmUoKTtcblxuICAgICAgY2FuY2VsKCk7XG4gICAgfSxcbiAgICBjbG9uZTogZnVuY3Rpb24gY2xvbmUoX3JlZjMpIHtcbiAgICAgIHZhciBzb3J0YWJsZSA9IF9yZWYzLnNvcnRhYmxlLFxuICAgICAgICAgIHJvb3RFbCA9IF9yZWYzLnJvb3RFbCxcbiAgICAgICAgICBkaXNwYXRjaFNvcnRhYmxlRXZlbnQgPSBfcmVmMy5kaXNwYXRjaFNvcnRhYmxlRXZlbnQsXG4gICAgICAgICAgY2FuY2VsID0gX3JlZjMuY2FuY2VsO1xuICAgICAgaWYgKCF0aGlzLmlzTXVsdGlEcmFnKSByZXR1cm47XG5cbiAgICAgIGlmICghdGhpcy5vcHRpb25zLnJlbW92ZUNsb25lT25IaWRlKSB7XG4gICAgICAgIGlmIChtdWx0aURyYWdFbGVtZW50cy5sZW5ndGggJiYgbXVsdGlEcmFnU29ydGFibGUgPT09IHNvcnRhYmxlKSB7XG4gICAgICAgICAgaW5zZXJ0TXVsdGlEcmFnQ2xvbmVzKHRydWUsIHJvb3RFbCk7XG4gICAgICAgICAgZGlzcGF0Y2hTb3J0YWJsZUV2ZW50KCdjbG9uZScpO1xuICAgICAgICAgIGNhbmNlbCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBzaG93Q2xvbmU6IGZ1bmN0aW9uIHNob3dDbG9uZShfcmVmNCkge1xuICAgICAgdmFyIGNsb25lTm93U2hvd24gPSBfcmVmNC5jbG9uZU5vd1Nob3duLFxuICAgICAgICAgIHJvb3RFbCA9IF9yZWY0LnJvb3RFbCxcbiAgICAgICAgICBjYW5jZWwgPSBfcmVmNC5jYW5jZWw7XG4gICAgICBpZiAoIXRoaXMuaXNNdWx0aURyYWcpIHJldHVybjtcbiAgICAgIGluc2VydE11bHRpRHJhZ0Nsb25lcyhmYWxzZSwgcm9vdEVsKTtcbiAgICAgIG11bHRpRHJhZ0Nsb25lcy5mb3JFYWNoKGZ1bmN0aW9uIChjbG9uZSkge1xuICAgICAgICBjc3MoY2xvbmUsICdkaXNwbGF5JywgJycpO1xuICAgICAgfSk7XG4gICAgICBjbG9uZU5vd1Nob3duKCk7XG4gICAgICBjbG9uZXNIaWRkZW4gPSBmYWxzZTtcbiAgICAgIGNhbmNlbCgpO1xuICAgIH0sXG4gICAgaGlkZUNsb25lOiBmdW5jdGlvbiBoaWRlQ2xvbmUoX3JlZjUpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciBzb3J0YWJsZSA9IF9yZWY1LnNvcnRhYmxlLFxuICAgICAgICAgIGNsb25lTm93SGlkZGVuID0gX3JlZjUuY2xvbmVOb3dIaWRkZW4sXG4gICAgICAgICAgY2FuY2VsID0gX3JlZjUuY2FuY2VsO1xuICAgICAgaWYgKCF0aGlzLmlzTXVsdGlEcmFnKSByZXR1cm47XG4gICAgICBtdWx0aURyYWdDbG9uZXMuZm9yRWFjaChmdW5jdGlvbiAoY2xvbmUpIHtcbiAgICAgICAgY3NzKGNsb25lLCAnZGlzcGxheScsICdub25lJyk7XG5cbiAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMucmVtb3ZlQ2xvbmVPbkhpZGUgJiYgY2xvbmUucGFyZW50Tm9kZSkge1xuICAgICAgICAgIGNsb25lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2xvbmUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNsb25lTm93SGlkZGVuKCk7XG4gICAgICBjbG9uZXNIaWRkZW4gPSB0cnVlO1xuICAgICAgY2FuY2VsKCk7XG4gICAgfSxcbiAgICBkcmFnU3RhcnRHbG9iYWw6IGZ1bmN0aW9uIGRyYWdTdGFydEdsb2JhbChfcmVmNikge1xuICAgICAgdmFyIHNvcnRhYmxlID0gX3JlZjYuc29ydGFibGU7XG5cbiAgICAgIGlmICghdGhpcy5pc011bHRpRHJhZyAmJiBtdWx0aURyYWdTb3J0YWJsZSkge1xuICAgICAgICBtdWx0aURyYWdTb3J0YWJsZS5tdWx0aURyYWcuX2Rlc2VsZWN0TXVsdGlEcmFnKCk7XG4gICAgICB9XG5cbiAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgbXVsdGlEcmFnRWxlbWVudC5zb3J0YWJsZUluZGV4ID0gaW5kZXgobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgICB9KTsgLy8gU29ydCBtdWx0aS1kcmFnIGVsZW1lbnRzXG5cbiAgICAgIG11bHRpRHJhZ0VsZW1lbnRzID0gbXVsdGlEcmFnRWxlbWVudHMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICByZXR1cm4gYS5zb3J0YWJsZUluZGV4IC0gYi5zb3J0YWJsZUluZGV4O1xuICAgICAgfSk7XG4gICAgICBkcmFnU3RhcnRlZCA9IHRydWU7XG4gICAgfSxcbiAgICBkcmFnU3RhcnRlZDogZnVuY3Rpb24gZHJhZ1N0YXJ0ZWQoX3JlZjcpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgc29ydGFibGUgPSBfcmVmNy5zb3J0YWJsZTtcbiAgICAgIGlmICghdGhpcy5pc011bHRpRHJhZykgcmV0dXJuO1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnNvcnQpIHtcbiAgICAgICAgLy8gQ2FwdHVyZSByZWN0cyxcbiAgICAgICAgLy8gaGlkZSBtdWx0aSBkcmFnIGVsZW1lbnRzIChieSBwb3NpdGlvbmluZyB0aGVtIGFic29sdXRlKSxcbiAgICAgICAgLy8gc2V0IG11bHRpIGRyYWcgZWxlbWVudHMgcmVjdHMgdG8gZHJhZ1JlY3QsXG4gICAgICAgIC8vIHNob3cgbXVsdGkgZHJhZyBlbGVtZW50cyxcbiAgICAgICAgLy8gYW5pbWF0ZSB0byByZWN0cyxcbiAgICAgICAgLy8gdW5zZXQgcmVjdHMgJiByZW1vdmUgZnJvbSBET01cbiAgICAgICAgc29ydGFibGUuY2FwdHVyZUFuaW1hdGlvblN0YXRlKCk7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hbmltYXRpb24pIHtcbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50KSB7XG4gICAgICAgICAgICBpZiAobXVsdGlEcmFnRWxlbWVudCA9PT0gZHJhZ0VsJDEpIHJldHVybjtcbiAgICAgICAgICAgIGNzcyhtdWx0aURyYWdFbGVtZW50LCAncG9zaXRpb24nLCAnYWJzb2x1dGUnKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB2YXIgZHJhZ1JlY3QgPSBnZXRSZWN0KGRyYWdFbCQxLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICAgICAgaWYgKG11bHRpRHJhZ0VsZW1lbnQgPT09IGRyYWdFbCQxKSByZXR1cm47XG4gICAgICAgICAgICBzZXRSZWN0KG11bHRpRHJhZ0VsZW1lbnQsIGRyYWdSZWN0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBmb2xkaW5nID0gdHJ1ZTtcbiAgICAgICAgICBpbml0aWFsRm9sZGluZyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc29ydGFibGUuYW5pbWF0ZUFsbChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvbGRpbmcgPSBmYWxzZTtcbiAgICAgICAgaW5pdGlhbEZvbGRpbmcgPSBmYWxzZTtcblxuICAgICAgICBpZiAoX3RoaXMyLm9wdGlvbnMuYW5pbWF0aW9uKSB7XG4gICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICAgICAgdW5zZXRSZWN0KG11bHRpRHJhZ0VsZW1lbnQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IC8vIFJlbW92ZSBhbGwgYXV4aWxpYXJ5IG11bHRpZHJhZyBpdGVtcyBmcm9tIGVsLCBpZiBzb3J0aW5nIGVuYWJsZWRcblxuXG4gICAgICAgIGlmIChfdGhpczIub3B0aW9ucy5zb3J0KSB7XG4gICAgICAgICAgcmVtb3ZlTXVsdGlEcmFnRWxlbWVudHMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICBkcmFnT3ZlcjogZnVuY3Rpb24gZHJhZ092ZXIoX3JlZjgpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBfcmVmOC50YXJnZXQsXG4gICAgICAgICAgY29tcGxldGVkID0gX3JlZjguY29tcGxldGVkLFxuICAgICAgICAgIGNhbmNlbCA9IF9yZWY4LmNhbmNlbDtcblxuICAgICAgaWYgKGZvbGRpbmcgJiYgfm11bHRpRHJhZ0VsZW1lbnRzLmluZGV4T2YodGFyZ2V0KSkge1xuICAgICAgICBjb21wbGV0ZWQoZmFsc2UpO1xuICAgICAgICBjYW5jZWwoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHJldmVydDogZnVuY3Rpb24gcmV2ZXJ0KF9yZWY5KSB7XG4gICAgICB2YXIgZnJvbVNvcnRhYmxlID0gX3JlZjkuZnJvbVNvcnRhYmxlLFxuICAgICAgICAgIHJvb3RFbCA9IF9yZWY5LnJvb3RFbCxcbiAgICAgICAgICBzb3J0YWJsZSA9IF9yZWY5LnNvcnRhYmxlLFxuICAgICAgICAgIGRyYWdSZWN0ID0gX3JlZjkuZHJhZ1JlY3Q7XG5cbiAgICAgIGlmIChtdWx0aURyYWdFbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIC8vIFNldHVwIHVuZm9sZCBhbmltYXRpb25cbiAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICAgIHNvcnRhYmxlLmFkZEFuaW1hdGlvblN0YXRlKHtcbiAgICAgICAgICAgIHRhcmdldDogbXVsdGlEcmFnRWxlbWVudCxcbiAgICAgICAgICAgIHJlY3Q6IGZvbGRpbmcgPyBnZXRSZWN0KG11bHRpRHJhZ0VsZW1lbnQpIDogZHJhZ1JlY3RcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB1bnNldFJlY3QobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgICAgICAgbXVsdGlEcmFnRWxlbWVudC5mcm9tUmVjdCA9IGRyYWdSZWN0O1xuICAgICAgICAgIGZyb21Tb3J0YWJsZS5yZW1vdmVBbmltYXRpb25TdGF0ZShtdWx0aURyYWdFbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZvbGRpbmcgPSBmYWxzZTtcbiAgICAgICAgaW5zZXJ0TXVsdGlEcmFnRWxlbWVudHMoIXRoaXMub3B0aW9ucy5yZW1vdmVDbG9uZU9uSGlkZSwgcm9vdEVsKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRyYWdPdmVyQ29tcGxldGVkOiBmdW5jdGlvbiBkcmFnT3ZlckNvbXBsZXRlZChfcmVmMTApIHtcbiAgICAgIHZhciBzb3J0YWJsZSA9IF9yZWYxMC5zb3J0YWJsZSxcbiAgICAgICAgICBpc093bmVyID0gX3JlZjEwLmlzT3duZXIsXG4gICAgICAgICAgaW5zZXJ0aW9uID0gX3JlZjEwLmluc2VydGlvbixcbiAgICAgICAgICBhY3RpdmVTb3J0YWJsZSA9IF9yZWYxMC5hY3RpdmVTb3J0YWJsZSxcbiAgICAgICAgICBwYXJlbnRFbCA9IF9yZWYxMC5wYXJlbnRFbCxcbiAgICAgICAgICBwdXRTb3J0YWJsZSA9IF9yZWYxMC5wdXRTb3J0YWJsZTtcbiAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuXG4gICAgICBpZiAoaW5zZXJ0aW9uKSB7XG4gICAgICAgIC8vIENsb25lcyBtdXN0IGJlIGhpZGRlbiBiZWZvcmUgZm9sZGluZyBhbmltYXRpb24gdG8gY2FwdHVyZSBkcmFnUmVjdEFic29sdXRlIHByb3Blcmx5XG4gICAgICAgIGlmIChpc093bmVyKSB7XG4gICAgICAgICAgYWN0aXZlU29ydGFibGUuX2hpZGVDbG9uZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5pdGlhbEZvbGRpbmcgPSBmYWxzZTsgLy8gSWYgbGVhdmluZyBzb3J0OmZhbHNlIHJvb3QsIG9yIGFscmVhZHkgZm9sZGluZyAtIEZvbGQgdG8gbmV3IGxvY2F0aW9uXG5cbiAgICAgICAgaWYgKG9wdGlvbnMuYW5pbWF0aW9uICYmIG11bHRpRHJhZ0VsZW1lbnRzLmxlbmd0aCA+IDEgJiYgKGZvbGRpbmcgfHwgIWlzT3duZXIgJiYgIWFjdGl2ZVNvcnRhYmxlLm9wdGlvbnMuc29ydCAmJiAhcHV0U29ydGFibGUpKSB7XG4gICAgICAgICAgLy8gRm9sZDogU2V0IGFsbCBtdWx0aSBkcmFnIGVsZW1lbnRzJ3MgcmVjdHMgdG8gZHJhZ0VsJ3MgcmVjdCB3aGVuIG11bHRpLWRyYWcgZWxlbWVudHMgYXJlIGludmlzaWJsZVxuICAgICAgICAgIHZhciBkcmFnUmVjdEFic29sdXRlID0gZ2V0UmVjdChkcmFnRWwkMSwgZmFsc2UsIHRydWUsIHRydWUpO1xuICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgICAgIGlmIChtdWx0aURyYWdFbGVtZW50ID09PSBkcmFnRWwkMSkgcmV0dXJuO1xuICAgICAgICAgICAgc2V0UmVjdChtdWx0aURyYWdFbGVtZW50LCBkcmFnUmVjdEFic29sdXRlKTsgLy8gTW92ZSBlbGVtZW50KHMpIHRvIGVuZCBvZiBwYXJlbnRFbCBzbyB0aGF0IGl0IGRvZXMgbm90IGludGVyZmVyZSB3aXRoIG11bHRpLWRyYWcgY2xvbmVzIGluc2VydGlvbiBpZiB0aGV5IGFyZSBpbnNlcnRlZFxuICAgICAgICAgICAgLy8gd2hpbGUgZm9sZGluZywgYW5kIHNvIHRoYXQgd2UgY2FuIGNhcHR1cmUgdGhlbSBhZ2FpbiBiZWNhdXNlIG9sZCBzb3J0YWJsZSB3aWxsIG5vIGxvbmdlciBiZSBmcm9tU29ydGFibGVcblxuICAgICAgICAgICAgcGFyZW50RWwuYXBwZW5kQ2hpbGQobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZm9sZGluZyA9IHRydWU7XG4gICAgICAgIH0gLy8gQ2xvbmVzIG11c3QgYmUgc2hvd24gKGFuZCBjaGVjayB0byByZW1vdmUgbXVsdGkgZHJhZ3MpIGFmdGVyIGZvbGRpbmcgd2hlbiBpbnRlcmZlcmluZyBtdWx0aURyYWdFbGVtZW50cyBhcmUgbW92ZWQgb3V0XG5cblxuICAgICAgICBpZiAoIWlzT3duZXIpIHtcbiAgICAgICAgICAvLyBPbmx5IHJlbW92ZSBpZiBub3QgZm9sZGluZyAoZm9sZGluZyB3aWxsIHJlbW92ZSB0aGVtIGFueXdheXMpXG4gICAgICAgICAgaWYgKCFmb2xkaW5nKSB7XG4gICAgICAgICAgICByZW1vdmVNdWx0aURyYWdFbGVtZW50cygpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChtdWx0aURyYWdFbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB2YXIgY2xvbmVzSGlkZGVuQmVmb3JlID0gY2xvbmVzSGlkZGVuO1xuXG4gICAgICAgICAgICBhY3RpdmVTb3J0YWJsZS5fc2hvd0Nsb25lKHNvcnRhYmxlKTsgLy8gVW5mb2xkIGFuaW1hdGlvbiBmb3IgY2xvbmVzIGlmIHNob3dpbmcgZnJvbSBoaWRkZW5cblxuXG4gICAgICAgICAgICBpZiAoYWN0aXZlU29ydGFibGUub3B0aW9ucy5hbmltYXRpb24gJiYgIWNsb25lc0hpZGRlbiAmJiBjbG9uZXNIaWRkZW5CZWZvcmUpIHtcbiAgICAgICAgICAgICAgbXVsdGlEcmFnQ2xvbmVzLmZvckVhY2goZnVuY3Rpb24gKGNsb25lKSB7XG4gICAgICAgICAgICAgICAgYWN0aXZlU29ydGFibGUuYWRkQW5pbWF0aW9uU3RhdGUoe1xuICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBjbG9uZSxcbiAgICAgICAgICAgICAgICAgIHJlY3Q6IGNsb25lc0Zyb21SZWN0XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY2xvbmUuZnJvbVJlY3QgPSBjbG9uZXNGcm9tUmVjdDtcbiAgICAgICAgICAgICAgICBjbG9uZS50aGlzQW5pbWF0aW9uRHVyYXRpb24gPSBudWxsO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWN0aXZlU29ydGFibGUuX3Nob3dDbG9uZShzb3J0YWJsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBkcmFnT3ZlckFuaW1hdGlvbkNhcHR1cmU6IGZ1bmN0aW9uIGRyYWdPdmVyQW5pbWF0aW9uQ2FwdHVyZShfcmVmMTEpIHtcbiAgICAgIHZhciBkcmFnUmVjdCA9IF9yZWYxMS5kcmFnUmVjdCxcbiAgICAgICAgICBpc093bmVyID0gX3JlZjExLmlzT3duZXIsXG4gICAgICAgICAgYWN0aXZlU29ydGFibGUgPSBfcmVmMTEuYWN0aXZlU29ydGFibGU7XG4gICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50KSB7XG4gICAgICAgIG11bHRpRHJhZ0VsZW1lbnQudGhpc0FuaW1hdGlvbkR1cmF0aW9uID0gbnVsbDtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoYWN0aXZlU29ydGFibGUub3B0aW9ucy5hbmltYXRpb24gJiYgIWlzT3duZXIgJiYgYWN0aXZlU29ydGFibGUubXVsdGlEcmFnLmlzTXVsdGlEcmFnKSB7XG4gICAgICAgIGNsb25lc0Zyb21SZWN0ID0gX2V4dGVuZHMoe30sIGRyYWdSZWN0KTtcbiAgICAgICAgdmFyIGRyYWdNYXRyaXggPSBtYXRyaXgoZHJhZ0VsJDEsIHRydWUpO1xuICAgICAgICBjbG9uZXNGcm9tUmVjdC50b3AgLT0gZHJhZ01hdHJpeC5mO1xuICAgICAgICBjbG9uZXNGcm9tUmVjdC5sZWZ0IC09IGRyYWdNYXRyaXguZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRyYWdPdmVyQW5pbWF0aW9uQ29tcGxldGU6IGZ1bmN0aW9uIGRyYWdPdmVyQW5pbWF0aW9uQ29tcGxldGUoKSB7XG4gICAgICBpZiAoZm9sZGluZykge1xuICAgICAgICBmb2xkaW5nID0gZmFsc2U7XG4gICAgICAgIHJlbW92ZU11bHRpRHJhZ0VsZW1lbnRzKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBkcm9wOiBmdW5jdGlvbiBkcm9wKF9yZWYxMikge1xuICAgICAgdmFyIGV2dCA9IF9yZWYxMi5vcmlnaW5hbEV2ZW50LFxuICAgICAgICAgIHJvb3RFbCA9IF9yZWYxMi5yb290RWwsXG4gICAgICAgICAgcGFyZW50RWwgPSBfcmVmMTIucGFyZW50RWwsXG4gICAgICAgICAgc29ydGFibGUgPSBfcmVmMTIuc29ydGFibGUsXG4gICAgICAgICAgZGlzcGF0Y2hTb3J0YWJsZUV2ZW50ID0gX3JlZjEyLmRpc3BhdGNoU29ydGFibGVFdmVudCxcbiAgICAgICAgICBvbGRJbmRleCA9IF9yZWYxMi5vbGRJbmRleCxcbiAgICAgICAgICBwdXRTb3J0YWJsZSA9IF9yZWYxMi5wdXRTb3J0YWJsZTtcbiAgICAgIHZhciB0b1NvcnRhYmxlID0gcHV0U29ydGFibGUgfHwgdGhpcy5zb3J0YWJsZTtcbiAgICAgIGlmICghZXZ0KSByZXR1cm47XG4gICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICBjaGlsZHJlbiA9IHBhcmVudEVsLmNoaWxkcmVuOyAvLyBNdWx0aS1kcmFnIHNlbGVjdGlvblxuXG4gICAgICBpZiAoIWRyYWdTdGFydGVkKSB7XG4gICAgICAgIGlmIChvcHRpb25zLm11bHRpRHJhZ0tleSAmJiAhdGhpcy5tdWx0aURyYWdLZXlEb3duKSB7XG4gICAgICAgICAgdGhpcy5fZGVzZWxlY3RNdWx0aURyYWcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRvZ2dsZUNsYXNzKGRyYWdFbCQxLCBvcHRpb25zLnNlbGVjdGVkQ2xhc3MsICF+bXVsdGlEcmFnRWxlbWVudHMuaW5kZXhPZihkcmFnRWwkMSkpO1xuXG4gICAgICAgIGlmICghfm11bHRpRHJhZ0VsZW1lbnRzLmluZGV4T2YoZHJhZ0VsJDEpKSB7XG4gICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMucHVzaChkcmFnRWwkMSk7XG4gICAgICAgICAgZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICBzb3J0YWJsZTogc29ydGFibGUsXG4gICAgICAgICAgICByb290RWw6IHJvb3RFbCxcbiAgICAgICAgICAgIG5hbWU6ICdzZWxlY3QnLFxuICAgICAgICAgICAgdGFyZ2V0RWw6IGRyYWdFbCQxLFxuICAgICAgICAgICAgb3JpZ2luYWxFdnQ6IGV2dFxuICAgICAgICAgIH0pOyAvLyBNb2RpZmllciBhY3RpdmF0ZWQsIHNlbGVjdCBmcm9tIGxhc3QgdG8gZHJhZ0VsXG5cbiAgICAgICAgICBpZiAoZXZ0LnNoaWZ0S2V5ICYmIGxhc3RNdWx0aURyYWdTZWxlY3QgJiYgc29ydGFibGUuZWwuY29udGFpbnMobGFzdE11bHRpRHJhZ1NlbGVjdCkpIHtcbiAgICAgICAgICAgIHZhciBsYXN0SW5kZXggPSBpbmRleChsYXN0TXVsdGlEcmFnU2VsZWN0KSxcbiAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBpbmRleChkcmFnRWwkMSk7XG5cbiAgICAgICAgICAgIGlmICh+bGFzdEluZGV4ICYmIH5jdXJyZW50SW5kZXggJiYgbGFzdEluZGV4ICE9PSBjdXJyZW50SW5kZXgpIHtcbiAgICAgICAgICAgICAgLy8gTXVzdCBpbmNsdWRlIGxhc3RNdWx0aURyYWdTZWxlY3QgKHNlbGVjdCBpdCksIGluIGNhc2UgbW9kaWZpZWQgc2VsZWN0aW9uIGZyb20gbm8gc2VsZWN0aW9uXG4gICAgICAgICAgICAgIC8vIChidXQgcHJldmlvdXMgc2VsZWN0aW9uIGV4aXN0ZWQpXG4gICAgICAgICAgICAgIHZhciBuLCBpO1xuXG4gICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPiBsYXN0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICBpID0gbGFzdEluZGV4O1xuICAgICAgICAgICAgICAgIG4gPSBjdXJyZW50SW5kZXg7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaSA9IGN1cnJlbnRJbmRleDtcbiAgICAgICAgICAgICAgICBuID0gbGFzdEluZGV4ICsgMTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGZvciAoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKH5tdWx0aURyYWdFbGVtZW50cy5pbmRleE9mKGNoaWxkcmVuW2ldKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgdG9nZ2xlQ2xhc3MoY2hpbGRyZW5baV0sIG9wdGlvbnMuc2VsZWN0ZWRDbGFzcywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMucHVzaChjaGlsZHJlbltpXSk7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICAgICAgICBzb3J0YWJsZTogc29ydGFibGUsXG4gICAgICAgICAgICAgICAgICByb290RWw6IHJvb3RFbCxcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdzZWxlY3QnLFxuICAgICAgICAgICAgICAgICAgdGFyZ2V0RWw6IGNoaWxkcmVuW2ldLFxuICAgICAgICAgICAgICAgICAgb3JpZ2luYWxFdnQ6IGV2dFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxhc3RNdWx0aURyYWdTZWxlY3QgPSBkcmFnRWwkMTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBtdWx0aURyYWdTb3J0YWJsZSA9IHRvU29ydGFibGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuc3BsaWNlKG11bHRpRHJhZ0VsZW1lbnRzLmluZGV4T2YoZHJhZ0VsJDEpLCAxKTtcbiAgICAgICAgICBsYXN0TXVsdGlEcmFnU2VsZWN0ID0gbnVsbDtcbiAgICAgICAgICBkaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgIHNvcnRhYmxlOiBzb3J0YWJsZSxcbiAgICAgICAgICAgIHJvb3RFbDogcm9vdEVsLFxuICAgICAgICAgICAgbmFtZTogJ2Rlc2VsZWN0JyxcbiAgICAgICAgICAgIHRhcmdldEVsOiBkcmFnRWwkMSxcbiAgICAgICAgICAgIG9yaWdpbmFsRXZ0OiBldnRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBNdWx0aS1kcmFnIGRyb3BcblxuXG4gICAgICBpZiAoZHJhZ1N0YXJ0ZWQgJiYgdGhpcy5pc011bHRpRHJhZykge1xuICAgICAgICAvLyBEbyBub3QgXCJ1bmZvbGRcIiBhZnRlciBhcm91bmQgZHJhZ0VsIGlmIHJldmVydGVkXG4gICAgICAgIGlmICgocGFyZW50RWxbZXhwYW5kb10ub3B0aW9ucy5zb3J0IHx8IHBhcmVudEVsICE9PSByb290RWwpICYmIG11bHRpRHJhZ0VsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICB2YXIgZHJhZ1JlY3QgPSBnZXRSZWN0KGRyYWdFbCQxKSxcbiAgICAgICAgICAgICAgbXVsdGlEcmFnSW5kZXggPSBpbmRleChkcmFnRWwkMSwgJzpub3QoLicgKyB0aGlzLm9wdGlvbnMuc2VsZWN0ZWRDbGFzcyArICcpJyk7XG4gICAgICAgICAgaWYgKCFpbml0aWFsRm9sZGluZyAmJiBvcHRpb25zLmFuaW1hdGlvbikgZHJhZ0VsJDEudGhpc0FuaW1hdGlvbkR1cmF0aW9uID0gbnVsbDtcbiAgICAgICAgICB0b1NvcnRhYmxlLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuXG4gICAgICAgICAgaWYgKCFpbml0aWFsRm9sZGluZykge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuYW5pbWF0aW9uKSB7XG4gICAgICAgICAgICAgIGRyYWdFbCQxLmZyb21SZWN0ID0gZHJhZ1JlY3Q7XG4gICAgICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBtdWx0aURyYWdFbGVtZW50LnRoaXNBbmltYXRpb25EdXJhdGlvbiA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICBpZiAobXVsdGlEcmFnRWxlbWVudCAhPT0gZHJhZ0VsJDEpIHtcbiAgICAgICAgICAgICAgICAgIHZhciByZWN0ID0gZm9sZGluZyA/IGdldFJlY3QobXVsdGlEcmFnRWxlbWVudCkgOiBkcmFnUmVjdDtcbiAgICAgICAgICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnQuZnJvbVJlY3QgPSByZWN0OyAvLyBQcmVwYXJlIHVuZm9sZCBhbmltYXRpb25cblxuICAgICAgICAgICAgICAgICAgdG9Tb3J0YWJsZS5hZGRBbmltYXRpb25TdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldDogbXVsdGlEcmFnRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgcmVjdDogcmVjdFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gLy8gTXVsdGkgZHJhZyBlbGVtZW50cyBhcmUgbm90IG5lY2Vzc2FyaWx5IHJlbW92ZWQgZnJvbSB0aGUgRE9NIG9uIGRyb3AsIHNvIHRvIHJlaW5zZXJ0XG4gICAgICAgICAgICAvLyBwcm9wZXJseSB0aGV5IG11c3QgYWxsIGJlIHJlbW92ZWRcblxuXG4gICAgICAgICAgICByZW1vdmVNdWx0aURyYWdFbGVtZW50cygpO1xuICAgICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICAgICAgICBpZiAoY2hpbGRyZW5bbXVsdGlEcmFnSW5kZXhdKSB7XG4gICAgICAgICAgICAgICAgcGFyZW50RWwuaW5zZXJ0QmVmb3JlKG11bHRpRHJhZ0VsZW1lbnQsIGNoaWxkcmVuW211bHRpRHJhZ0luZGV4XSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFyZW50RWwuYXBwZW5kQ2hpbGQobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBtdWx0aURyYWdJbmRleCsrO1xuICAgICAgICAgICAgfSk7IC8vIElmIGluaXRpYWwgZm9sZGluZyBpcyBkb25lLCB0aGUgZWxlbWVudHMgbWF5IGhhdmUgY2hhbmdlZCBwb3NpdGlvbiBiZWNhdXNlIHRoZXkgYXJlIG5vd1xuICAgICAgICAgICAgLy8gdW5mb2xkaW5nIGFyb3VuZCBkcmFnRWwsIGV2ZW4gdGhvdWdoIGRyYWdFbCBtYXkgbm90IGhhdmUgaGlzIGluZGV4IGNoYW5nZWQsIHNvIHVwZGF0ZSBldmVudFxuICAgICAgICAgICAgLy8gbXVzdCBiZSBmaXJlZCBoZXJlIGFzIFNvcnRhYmxlIHdpbGwgbm90LlxuXG4gICAgICAgICAgICBpZiAob2xkSW5kZXggPT09IGluZGV4KGRyYWdFbCQxKSkge1xuICAgICAgICAgICAgICB2YXIgdXBkYXRlID0gZmFsc2U7XG4gICAgICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAobXVsdGlEcmFnRWxlbWVudC5zb3J0YWJsZUluZGV4ICE9PSBpbmRleChtdWx0aURyYWdFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgdXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGlmICh1cGRhdGUpIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaFNvcnRhYmxlRXZlbnQoJ3VwZGF0ZScpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSAvLyBNdXN0IGJlIGRvbmUgYWZ0ZXIgY2FwdHVyaW5nIGluZGl2aWR1YWwgcmVjdHMgKHNjcm9sbCBiYXIpXG5cblxuICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgICAgIHVuc2V0UmVjdChtdWx0aURyYWdFbGVtZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0b1NvcnRhYmxlLmFuaW1hdGVBbGwoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG11bHRpRHJhZ1NvcnRhYmxlID0gdG9Tb3J0YWJsZTtcbiAgICAgIH0gLy8gUmVtb3ZlIGNsb25lcyBpZiBuZWNlc3NhcnlcblxuXG4gICAgICBpZiAocm9vdEVsID09PSBwYXJlbnRFbCB8fCBwdXRTb3J0YWJsZSAmJiBwdXRTb3J0YWJsZS5sYXN0UHV0TW9kZSAhPT0gJ2Nsb25lJykge1xuICAgICAgICBtdWx0aURyYWdDbG9uZXMuZm9yRWFjaChmdW5jdGlvbiAoY2xvbmUpIHtcbiAgICAgICAgICBjbG9uZS5wYXJlbnROb2RlICYmIGNsb25lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2xvbmUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG51bGxpbmdHbG9iYWw6IGZ1bmN0aW9uIG51bGxpbmdHbG9iYWwoKSB7XG4gICAgICB0aGlzLmlzTXVsdGlEcmFnID0gZHJhZ1N0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgIG11bHRpRHJhZ0Nsb25lcy5sZW5ndGggPSAwO1xuICAgIH0sXG4gICAgZGVzdHJveUdsb2JhbDogZnVuY3Rpb24gZGVzdHJveUdsb2JhbCgpIHtcbiAgICAgIHRoaXMuX2Rlc2VsZWN0TXVsdGlEcmFnKCk7XG5cbiAgICAgIG9mZihkb2N1bWVudCwgJ3BvaW50ZXJ1cCcsIHRoaXMuX2Rlc2VsZWN0TXVsdGlEcmFnKTtcbiAgICAgIG9mZihkb2N1bWVudCwgJ21vdXNldXAnLCB0aGlzLl9kZXNlbGVjdE11bHRpRHJhZyk7XG4gICAgICBvZmYoZG9jdW1lbnQsICd0b3VjaGVuZCcsIHRoaXMuX2Rlc2VsZWN0TXVsdGlEcmFnKTtcbiAgICAgIG9mZihkb2N1bWVudCwgJ2tleWRvd24nLCB0aGlzLl9jaGVja0tleURvd24pO1xuICAgICAgb2ZmKGRvY3VtZW50LCAna2V5dXAnLCB0aGlzLl9jaGVja0tleVVwKTtcbiAgICB9LFxuICAgIF9kZXNlbGVjdE11bHRpRHJhZzogZnVuY3Rpb24gX2Rlc2VsZWN0TXVsdGlEcmFnKGV2dCkge1xuICAgICAgaWYgKHR5cGVvZiBkcmFnU3RhcnRlZCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkcmFnU3RhcnRlZCkgcmV0dXJuOyAvLyBPbmx5IGRlc2VsZWN0IGlmIHNlbGVjdGlvbiBpcyBpbiB0aGlzIHNvcnRhYmxlXG5cbiAgICAgIGlmIChtdWx0aURyYWdTb3J0YWJsZSAhPT0gdGhpcy5zb3J0YWJsZSkgcmV0dXJuOyAvLyBPbmx5IGRlc2VsZWN0IGlmIHRhcmdldCBpcyBub3QgaXRlbSBpbiB0aGlzIHNvcnRhYmxlXG5cbiAgICAgIGlmIChldnQgJiYgY2xvc2VzdChldnQudGFyZ2V0LCB0aGlzLm9wdGlvbnMuZHJhZ2dhYmxlLCB0aGlzLnNvcnRhYmxlLmVsLCBmYWxzZSkpIHJldHVybjsgLy8gT25seSBkZXNlbGVjdCBpZiBsZWZ0IGNsaWNrXG5cbiAgICAgIGlmIChldnQgJiYgZXZ0LmJ1dHRvbiAhPT0gMCkgcmV0dXJuO1xuXG4gICAgICB3aGlsZSAobXVsdGlEcmFnRWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBlbCA9IG11bHRpRHJhZ0VsZW1lbnRzWzBdO1xuICAgICAgICB0b2dnbGVDbGFzcyhlbCwgdGhpcy5vcHRpb25zLnNlbGVjdGVkQ2xhc3MsIGZhbHNlKTtcbiAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuc2hpZnQoKTtcbiAgICAgICAgZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgc29ydGFibGU6IHRoaXMuc29ydGFibGUsXG4gICAgICAgICAgcm9vdEVsOiB0aGlzLnNvcnRhYmxlLmVsLFxuICAgICAgICAgIG5hbWU6ICdkZXNlbGVjdCcsXG4gICAgICAgICAgdGFyZ2V0RWw6IGVsLFxuICAgICAgICAgIG9yaWdpbmFsRXZ0OiBldnRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBfY2hlY2tLZXlEb3duOiBmdW5jdGlvbiBfY2hlY2tLZXlEb3duKGV2dCkge1xuICAgICAgaWYgKGV2dC5rZXkgPT09IHRoaXMub3B0aW9ucy5tdWx0aURyYWdLZXkpIHtcbiAgICAgICAgdGhpcy5tdWx0aURyYWdLZXlEb3duID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIF9jaGVja0tleVVwOiBmdW5jdGlvbiBfY2hlY2tLZXlVcChldnQpIHtcbiAgICAgIGlmIChldnQua2V5ID09PSB0aGlzLm9wdGlvbnMubXVsdGlEcmFnS2V5KSB7XG4gICAgICAgIHRoaXMubXVsdGlEcmFnS2V5RG93biA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgcmV0dXJuIF9leHRlbmRzKE11bHRpRHJhZywge1xuICAgIC8vIFN0YXRpYyBtZXRob2RzICYgcHJvcGVydGllc1xuICAgIHBsdWdpbk5hbWU6ICdtdWx0aURyYWcnLFxuICAgIHV0aWxzOiB7XG4gICAgICAvKipcclxuICAgICAgICogU2VsZWN0cyB0aGUgcHJvdmlkZWQgbXVsdGktZHJhZyBpdGVtXHJcbiAgICAgICAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBlbCAgICBUaGUgZWxlbWVudCB0byBiZSBzZWxlY3RlZFxyXG4gICAgICAgKi9cbiAgICAgIHNlbGVjdDogZnVuY3Rpb24gc2VsZWN0KGVsKSB7XG4gICAgICAgIHZhciBzb3J0YWJsZSA9IGVsLnBhcmVudE5vZGVbZXhwYW5kb107XG4gICAgICAgIGlmICghc29ydGFibGUgfHwgIXNvcnRhYmxlLm9wdGlvbnMubXVsdGlEcmFnIHx8IH5tdWx0aURyYWdFbGVtZW50cy5pbmRleE9mKGVsKSkgcmV0dXJuO1xuXG4gICAgICAgIGlmIChtdWx0aURyYWdTb3J0YWJsZSAmJiBtdWx0aURyYWdTb3J0YWJsZSAhPT0gc29ydGFibGUpIHtcbiAgICAgICAgICBtdWx0aURyYWdTb3J0YWJsZS5tdWx0aURyYWcuX2Rlc2VsZWN0TXVsdGlEcmFnKCk7XG5cbiAgICAgICAgICBtdWx0aURyYWdTb3J0YWJsZSA9IHNvcnRhYmxlO1xuICAgICAgICB9XG5cbiAgICAgICAgdG9nZ2xlQ2xhc3MoZWwsIHNvcnRhYmxlLm9wdGlvbnMuc2VsZWN0ZWRDbGFzcywgdHJ1ZSk7XG4gICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLnB1c2goZWwpO1xuICAgICAgfSxcblxuICAgICAgLyoqXHJcbiAgICAgICAqIERlc2VsZWN0cyB0aGUgcHJvdmlkZWQgbXVsdGktZHJhZyBpdGVtXHJcbiAgICAgICAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBlbCAgICBUaGUgZWxlbWVudCB0byBiZSBkZXNlbGVjdGVkXHJcbiAgICAgICAqL1xuICAgICAgZGVzZWxlY3Q6IGZ1bmN0aW9uIGRlc2VsZWN0KGVsKSB7XG4gICAgICAgIHZhciBzb3J0YWJsZSA9IGVsLnBhcmVudE5vZGVbZXhwYW5kb10sXG4gICAgICAgICAgICBpbmRleCA9IG11bHRpRHJhZ0VsZW1lbnRzLmluZGV4T2YoZWwpO1xuICAgICAgICBpZiAoIXNvcnRhYmxlIHx8ICFzb3J0YWJsZS5vcHRpb25zLm11bHRpRHJhZyB8fCAhfmluZGV4KSByZXR1cm47XG4gICAgICAgIHRvZ2dsZUNsYXNzKGVsLCBzb3J0YWJsZS5vcHRpb25zLnNlbGVjdGVkQ2xhc3MsIGZhbHNlKTtcbiAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGV2ZW50UHJvcGVydGllczogZnVuY3Rpb24gZXZlbnRQcm9wZXJ0aWVzKCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHZhciBvbGRJbmRpY2llcyA9IFtdLFxuICAgICAgICAgIG5ld0luZGljaWVzID0gW107XG4gICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50KSB7XG4gICAgICAgIG9sZEluZGljaWVzLnB1c2goe1xuICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnQ6IG11bHRpRHJhZ0VsZW1lbnQsXG4gICAgICAgICAgaW5kZXg6IG11bHRpRHJhZ0VsZW1lbnQuc29ydGFibGVJbmRleFxuICAgICAgICB9KTsgLy8gbXVsdGlEcmFnRWxlbWVudHMgd2lsbCBhbHJlYWR5IGJlIHNvcnRlZCBpZiBmb2xkaW5nXG5cbiAgICAgICAgdmFyIG5ld0luZGV4O1xuXG4gICAgICAgIGlmIChmb2xkaW5nICYmIG11bHRpRHJhZ0VsZW1lbnQgIT09IGRyYWdFbCQxKSB7XG4gICAgICAgICAgbmV3SW5kZXggPSAtMTtcbiAgICAgICAgfSBlbHNlIGlmIChmb2xkaW5nKSB7XG4gICAgICAgICAgbmV3SW5kZXggPSBpbmRleChtdWx0aURyYWdFbGVtZW50LCAnOm5vdCguJyArIF90aGlzMy5vcHRpb25zLnNlbGVjdGVkQ2xhc3MgKyAnKScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0luZGV4ID0gaW5kZXgobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBuZXdJbmRpY2llcy5wdXNoKHtcbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50OiBtdWx0aURyYWdFbGVtZW50LFxuICAgICAgICAgIGluZGV4OiBuZXdJbmRleFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXRlbXM6IF90b0NvbnN1bWFibGVBcnJheShtdWx0aURyYWdFbGVtZW50cyksXG4gICAgICAgIGNsb25lczogW10uY29uY2F0KG11bHRpRHJhZ0Nsb25lcyksXG4gICAgICAgIG9sZEluZGljaWVzOiBvbGRJbmRpY2llcyxcbiAgICAgICAgbmV3SW5kaWNpZXM6IG5ld0luZGljaWVzXG4gICAgICB9O1xuICAgIH0sXG4gICAgb3B0aW9uTGlzdGVuZXJzOiB7XG4gICAgICBtdWx0aURyYWdLZXk6IGZ1bmN0aW9uIG11bHRpRHJhZ0tleShrZXkpIHtcbiAgICAgICAga2V5ID0ga2V5LnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgaWYgKGtleSA9PT0gJ2N0cmwnKSB7XG4gICAgICAgICAga2V5ID0gJ0NvbnRyb2wnO1xuICAgICAgICB9IGVsc2UgaWYgKGtleS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAga2V5ID0ga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnN1YnN0cigxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBrZXk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gaW5zZXJ0TXVsdGlEcmFnRWxlbWVudHMoY2xvbmVzSW5zZXJ0ZWQsIHJvb3RFbCkge1xuICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50LCBpKSB7XG4gICAgdmFyIHRhcmdldCA9IHJvb3RFbC5jaGlsZHJlblttdWx0aURyYWdFbGVtZW50LnNvcnRhYmxlSW5kZXggKyAoY2xvbmVzSW5zZXJ0ZWQgPyBOdW1iZXIoaSkgOiAwKV07XG5cbiAgICBpZiAodGFyZ2V0KSB7XG4gICAgICByb290RWwuaW5zZXJ0QmVmb3JlKG11bHRpRHJhZ0VsZW1lbnQsIHRhcmdldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJvb3RFbC5hcHBlbmRDaGlsZChtdWx0aURyYWdFbGVtZW50KTtcbiAgICB9XG4gIH0pO1xufVxuLyoqXHJcbiAqIEluc2VydCBtdWx0aS1kcmFnIGNsb25lc1xyXG4gKiBAcGFyYW0gIHtbQm9vbGVhbl19IGVsZW1lbnRzSW5zZXJ0ZWQgIFdoZXRoZXIgdGhlIG11bHRpLWRyYWcgZWxlbWVudHMgYXJlIGluc2VydGVkXHJcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSByb290RWxcclxuICovXG5cblxuZnVuY3Rpb24gaW5zZXJ0TXVsdGlEcmFnQ2xvbmVzKGVsZW1lbnRzSW5zZXJ0ZWQsIHJvb3RFbCkge1xuICBtdWx0aURyYWdDbG9uZXMuZm9yRWFjaChmdW5jdGlvbiAoY2xvbmUsIGkpIHtcbiAgICB2YXIgdGFyZ2V0ID0gcm9vdEVsLmNoaWxkcmVuW2Nsb25lLnNvcnRhYmxlSW5kZXggKyAoZWxlbWVudHNJbnNlcnRlZCA/IE51bWJlcihpKSA6IDApXTtcblxuICAgIGlmICh0YXJnZXQpIHtcbiAgICAgIHJvb3RFbC5pbnNlcnRCZWZvcmUoY2xvbmUsIHRhcmdldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJvb3RFbC5hcHBlbmRDaGlsZChjbG9uZSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlTXVsdGlEcmFnRWxlbWVudHMoKSB7XG4gIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICBpZiAobXVsdGlEcmFnRWxlbWVudCA9PT0gZHJhZ0VsJDEpIHJldHVybjtcbiAgICBtdWx0aURyYWdFbGVtZW50LnBhcmVudE5vZGUgJiYgbXVsdGlEcmFnRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG11bHRpRHJhZ0VsZW1lbnQpO1xuICB9KTtcbn1cblxuU29ydGFibGUubW91bnQobmV3IEF1dG9TY3JvbGxQbHVnaW4oKSk7XG5Tb3J0YWJsZS5tb3VudChSZW1vdmUsIFJldmVydCk7XG5cbmV4cG9ydCBkZWZhdWx0IFNvcnRhYmxlO1xuZXhwb3J0IHsgTXVsdGlEcmFnUGx1Z2luIGFzIE11bHRpRHJhZywgU29ydGFibGUsIFN3YXBQbHVnaW4gYXMgU3dhcCB9O1xuIiwiaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuLi9iYXNlXCI7XHJcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSBcIi4uL2pzb25vYmplY3RcIjtcclxuaW1wb3J0IHsgQ3NzQ2xhc3NCdWlsZGVyIH0gZnJvbSBcIi4uL3V0aWxzL2Nzc0NsYXNzQnVpbGRlclwiO1xyXG5cclxuLyoqXHJcbiAqIERlZmluZXMgYW4gaW5kaXZpZHVhbCBhY3Rpb24uIEFjdGlvbiBpdGVtcyBjYW4gYmUgZGlzcGxheWVkIGluIGNlcnRhaW4gc3VydmV5IGVsZW1lbnRzIC0gaW4gVG9vbGJhciAob3IgYWN0aW9uIGJhciksIGluIHRpdGxlcyAob2YgcGFnZXMsIHBhbmVscywgcXVlc3Rpb25zKSwgaW4gbWF0cml4IHJvd3MgKGFzICdleHBhbmQgZGV0YWlscycgb3IgJ3JlbW92ZSByb3cnIGJ1dHRvbnMpLCBhbmQgZXRjLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBJQWN0aW9uIHtcclxuICAvKipcclxuICAgKiBVbmlxdWUgc3RyaW5nIGlkXHJcbiAgICovXHJcbiAgaWQ6IHN0cmluZztcclxuICAvKipcclxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZSB0byBtYWtlIHRoZSB0b29sYmFyIGl0ZW0gaW52aXNpYmxlLlxyXG4gICAqL1xyXG4gIHZpc2libGU/OiBib29sZWFuO1xyXG4gIC8qKlxyXG4gICAqIFRvb2xiYXIgaXRlbSB0aXRsZVxyXG4gICAqL1xyXG4gIHRpdGxlPzogc3RyaW5nO1xyXG4gIC8qKlxyXG4gICAqIFRvb2xiYXIgaXRlbSB0b29sdGlwXHJcbiAgICovXHJcbiAgdG9vbHRpcD86IHN0cmluZztcclxuICAvKipcclxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZSB0byBkaXNhYmxlIHRoZSB0b29sYmFyIGl0ZW0uXHJcbiAgICovXHJcbiAgZW5hYmxlZD86IGJvb2xlYW47XHJcbiAgLyoqXHJcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gZmFsc2UgdG8gaGlkZSB0aGUgdG9vbGJhciBpdGVtIHRpdGxlLlxyXG4gICAqL1xyXG4gIHNob3dUaXRsZT86IGJvb2xlYW47XHJcbiAgLyoqXHJcbiAgICogQSBjYWxsYmFjayB0aGF0IGNhbGxzIG9uIHRvb2xiYXIgaXRlbSBjbGljay5cclxuICAgKi9cclxuICBhY3Rpb24/OiAoY29udGV4dD86IGFueSkgPT4gdm9pZDtcclxuICAvKipcclxuICAgKiBUb29sYmFyIGl0ZW0gY3NzIGNsYXNzXHJcbiAgICovXHJcbiAgY3NzPzogc3RyaW5nO1xyXG4gIC8qKlxyXG4gICAqIFRvb2xiYXIgaW5uZXIgZWxlbWVudCBjc3MgY2xhc3NcclxuICAgKi9cclxuICBpbm5lckNzcz86IHN0cmluZztcclxuICAvKipcclxuICAgKiBUb29sYmFyIGl0ZW0gZGF0YSBvYmplY3QuIFVzZWQgYXMgZGF0YSBmb3IgY3VzdG9tIHRlbXBsYXRlIG9yIGNvbXBvbmVudCByZW5kZXJpbmdcclxuICAgKi9cclxuICBkYXRhPzogYW55O1xyXG4gIHBvcHVwTW9kZWw/OiBhbnk7IC8vVE9ETzogdGVtcCwgdXNlIGRhdGEgaW5zdGVhZFxyXG4gIG5lZWRTZXBhcmF0b3I/OiBib29sZWFuOyAvL1RPRE86IHRlbXBcclxuICAvKipcclxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlIHRvIGFjdGl2YXRlIHRoZSB0b29sYmFyIGl0ZW0gKHBhZ2UpXHJcbiAgICovXHJcbiAgYWN0aXZlPzogYm9vbGVhbjtcclxuICAvKipcclxuICAgKiBUb29sYmFyIGl0ZW0gdGVtcGxhdGUgbmFtZVxyXG4gICAqL1xyXG4gIHRlbXBsYXRlPzogc3RyaW5nO1xyXG4gIC8qKlxyXG4gICAqIFRvb2xiYXIgaXRlbSBjb21wb25lbnQgbmFtZVxyXG4gICAqL1xyXG4gIGNvbXBvbmVudD86IHN0cmluZztcclxuICAvKipcclxuICAgKiBUb29sYmFyIGl0ZW0gaWNvbiBuYW1lXHJcbiAgICovXHJcbiAgaWNvbk5hbWU/OiBzdHJpbmc7XHJcbiAgLyoqXHJcbiAgICogVG9vbGJhciBpdGVtIGljb24gc2l6ZVxyXG4gICAqL1xyXG4gIGljb25TaXplPzogbnVtYmVyO1xyXG4gIC8qKlxyXG4gICAqIFRvb2xiYXIgaXRlbSBjaGlsZCBpdGVtcy4gQ2FuIGJlIHVzZWQgYXMgY29udGlhbmVyIGZvciBvcHRpb25zXHJcbiAgICovXHJcbiAgaXRlbXM/OiBhbnk7XHJcbiAgLyoqXHJcbiAgICogR2V0cyBvciBzZXRzIGFuIGFjdGlvbidzIGxvY2F0aW9uIGluIGEgbWF0cml4IHF1ZXN0aW9uJ3Mgcm93LlxyXG4gICAqXHJcbiAgICogVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGU6XHJcbiAgICpcclxuICAgKiAtIGBzdGFydGAgLSBBbiBhY3Rpb24gaXMgbG9jYXRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgcm93LlxyXG4gICAqIC0gYGVuZGAgLSBBbiBhY3Rpb24gaXMgbG9jYXRlZCBhdCB0aGUgZW5kIG9mIGEgcm93LlxyXG4gICAqL1xyXG4gIGxvY2F0aW9uPzogc3RyaW5nO1xyXG4gIC8qKlxyXG4gICAqIFNldCBpdCB0byB0cnVlIHRvIG1ha2UgdGhlIHRhYkluZGV4IC0xIHRvIGRpc2FibGUga2V5Ym9hcmQgbmF2aWdhdGlvbiB0byB0aGlzIGl0ZW1cclxuICAgKi9cclxuICBkaXNhYmxlVGFiU3RvcD86IGJvb2xlYW47XHJcbiAgLyoqXHJcbiAgICogQWN0aW9uIGJ1dHRvbiBkaXNwbGF5IG1vZGVcclxuICAgKi9cclxuICBtb2RlPzogXCJsYXJnZVwiIHwgXCJzbWFsbFwiIHwgXCJwb3B1cFwiO1xyXG4gIHZpc2libGVJbmRleD86IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEFjdGlvbiBleHRlbmRzIEJhc2UgaW1wbGVtZW50cyBJQWN0aW9uIHtcclxuICBwdWJsaWMgdXBkYXRlQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XHJcbiAgcHJpdmF0ZSByYWlzZVVwZGF0ZSgpIHtcclxuICAgIHRoaXMudXBkYXRlQ2FsbGJhY2sgJiYgdGhpcy51cGRhdGVDYWxsYmFjaygpO1xyXG4gIH1cclxuICBjb25zdHJ1Y3RvcihpdGVtOiBJQWN0aW9uKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgLy9PYmplY3QuYXNzaWduKHRoaXMsIGl0ZW0pIHRvIHN1cHBvcnQgSUUxMVxyXG4gICAgaWYgKCEhaXRlbSkge1xyXG4gICAgICBmb3IgKHZhciBrZXkgaW4gaXRlbSkge1xyXG4gICAgICAgICg8YW55PnRoaXMpW2tleV0gPSAoPGFueT5pdGVtKVtrZXldO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIGxvY2F0aW9uPzogc3RyaW5nO1xyXG4gIEBwcm9wZXJ0eSgpIGlkOiBzdHJpbmc7XHJcbiAgQHByb3BlcnR5KCkgaWNvbk5hbWU6IHN0cmluZztcclxuICBAcHJvcGVydHkoKSBpY29uU2l6ZTogbnVtYmVyID0gMjQ7XHJcbiAgQHByb3BlcnR5KHtcclxuICAgIGRlZmF1bHRWYWx1ZTogdHJ1ZSwgb25TZXQ6IChfLCB0YXJnZXQ6IEFjdGlvbikgPT4ge1xyXG4gICAgICB0YXJnZXQucmFpc2VVcGRhdGUoKTtcclxuICAgIH1cclxuICB9KSB2aXNpYmxlOiBib29sZWFuO1xyXG4gIEBwcm9wZXJ0eSgpIHRpdGxlOiBzdHJpbmc7XHJcbiAgQHByb3BlcnR5KCkgdG9vbHRpcDogc3RyaW5nO1xyXG4gIEBwcm9wZXJ0eSgpIGVuYWJsZWQ6IGJvb2xlYW47XHJcbiAgQHByb3BlcnR5KCkgc2hvd1RpdGxlOiBib29sZWFuO1xyXG4gIEBwcm9wZXJ0eSgpIGFjdGlvbjogKGNvbnRleHQ/OiBhbnkpID0+IHZvaWQ7XHJcbiAgQHByb3BlcnR5KCkgY3NzOiBzdHJpbmc7XHJcbiAgQHByb3BlcnR5KCkgaW5uZXJDc3M6IHN0cmluZztcclxuICBAcHJvcGVydHkoKSBkYXRhOiBhbnk7XHJcbiAgQHByb3BlcnR5KCkgcG9wdXBNb2RlbDogYW55O1xyXG4gIEBwcm9wZXJ0eSgpIG5lZWRTZXBhcmF0b3I6IGJvb2xlYW47XHJcbiAgQHByb3BlcnR5KCkgYWN0aXZlOiBib29sZWFuO1xyXG4gIEBwcm9wZXJ0eSgpIHRlbXBsYXRlOiBzdHJpbmc7XHJcbiAgQHByb3BlcnR5KCkgY29tcG9uZW50OiBzdHJpbmc7XHJcbiAgQHByb3BlcnR5KCkgaXRlbXM6IGFueTtcclxuICBAcHJvcGVydHkoKSB2aXNpYmxlSW5kZXg6IG51bWJlcjtcclxuICBAcHJvcGVydHkoeyBkZWZhdWx0VmFsdWU6IFwibGFyZ2VcIiB9KSBtb2RlOiBcImxhcmdlXCIgfCBcInNtYWxsXCIgfCBcInBvcHVwXCI7XHJcbiAgQHByb3BlcnR5KCkgZGlzYWJsZVRhYlN0b3A6IGJvb2xlYW47XHJcblxyXG4gIHB1YmxpYyBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5lbmFibGVkICE9PSB1bmRlZmluZWQgJiYgIXRoaXMuZW5hYmxlZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgaGFzVGl0bGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICAoKHRoaXMubW9kZSAhPSBcInNtYWxsXCIgJiZcclxuICAgICAgICAodGhpcy5zaG93VGl0bGUgfHwgdGhpcy5zaG93VGl0bGUgPT09IHVuZGVmaW5lZCkpIHx8XHJcbiAgICAgICAgIXRoaXMuaWNvbk5hbWUpICYmXHJcbiAgICAgICEhdGhpcy50aXRsZVxyXG4gICAgKTtcclxuICB9XHJcbiAgcHVibGljIGdldCBpc1Zpc2libGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlICYmIHRoaXMubW9kZSAhPT0gXCJwb3B1cFwiO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IGNhblNocmluaygpIHtcclxuICAgIHJldHVybiAhIXRoaXMuaWNvbk5hbWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0QWN0aW9uUm9vdENzcygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIG5ldyBDc3NDbGFzc0J1aWxkZXIoKVxyXG4gICAgICAuYXBwZW5kKFwic3YtYWN0aW9uXCIpXHJcbiAgICAgIC5hcHBlbmQodGhpcy5jc3MpXHJcbiAgICAgIC5hcHBlbmQoXCJzdi1hY3Rpb24tLWhpZGRlblwiLCAhdGhpcy5pc1Zpc2libGUpXHJcbiAgICAgIC50b1N0cmluZygpO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0QWN0aW9uQmFySXRlbUNzcygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIG5ldyBDc3NDbGFzc0J1aWxkZXIoKVxyXG4gICAgICAuYXBwZW5kKFwic3YtYWN0aW9uLWJhci1pdGVtX190aXRsZVwiKVxyXG4gICAgICAuYXBwZW5kKFwic3YtYWN0aW9uLWJhci1pdGVtX190aXRsZS0td2l0aC1pY29uXCIsICEhdGhpcy5pY29uTmFtZSlcclxuICAgICAgLnRvU3RyaW5nKCk7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXRBY3Rpb25CYXJJdGVtQWN0aXZlQ3NzKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gbmV3IENzc0NsYXNzQnVpbGRlcigpXHJcbiAgICAgIC5hcHBlbmQoXCJzdi1hY3Rpb24tYmFyLWl0ZW1cIilcclxuICAgICAgLmFwcGVuZChcInN2LWFjdGlvbi1iYXItaXRlbS0tYWN0aXZlXCIsICEhdGhpcy5hY3RpdmUpXHJcbiAgICAgIC5hcHBlbmQodGhpcy5pbm5lckNzcylcclxuICAgICAgLnRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICBtaW5EaW1lbnNpb246IG51bWJlcjtcclxuICBtYXhEaW1lbnNpb246IG51bWJlcjtcclxufVxyXG4iLCJpbXBvcnQgeyBSZXNwb25zaXZpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL3Jlc3BvbnNpdml0eS1tYW5hZ2VyXCI7XHJcbmltcG9ydCB7IExpc3RNb2RlbCB9IGZyb20gXCIuLi9saXN0XCI7XHJcbmltcG9ydCB7IFBvcHVwTW9kZWwgfSBmcm9tIFwiLi4vcG9wdXBcIjtcclxuaW1wb3J0IHsgQWN0aW9uIH0gZnJvbSBcIi4vYWN0aW9uXCI7XHJcbmltcG9ydCB7IEFjdGlvbkNvbnRhaW5lciB9IGZyb20gXCIuL2NvbnRhaW5lclwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEFkYXB0aXZlQWN0aW9uQ29udGFpbmVyPFQgZXh0ZW5kcyBBY3Rpb24gPSBBY3Rpb24+IGV4dGVuZHMgQWN0aW9uQ29udGFpbmVyPFQ+IHtcclxuICBwcm90ZWN0ZWQgZG90c0l0ZW06IEFjdGlvbjtcclxuICBwcm90ZWN0ZWQgZG90c0l0ZW1Qb3B1cE1vZGVsOiBQb3B1cE1vZGVsO1xyXG4gIHByaXZhdGUgcmVzcG9uc2l2aXR5TWFuYWdlcjogUmVzcG9uc2l2aXR5TWFuYWdlcjtcclxuXHJcbiAgcHJpdmF0ZSBpbnZpc2libGVJdGVtc0xpc3RNb2RlbDogTGlzdE1vZGVsID0gbmV3IExpc3RNb2RlbChcclxuICAgIFtdLFxyXG4gICAgKGl0ZW06IFQpID0+IHtcclxuICAgICAgdGhpcy5pbnZpc2libGVJdGVtU2VsZWN0ZWQoaXRlbSk7XHJcbiAgICAgIHRoaXMuZG90c0l0ZW1Qb3B1cE1vZGVsLnRvZ2dsZVZpc2liaWxpdHkoKTtcclxuICAgIH0sXHJcbiAgICBmYWxzZVxyXG4gICk7XHJcblxyXG4gIHByaXZhdGUgaW52aXNpYmxlSXRlbVNlbGVjdGVkKGl0ZW06IFQpOiB2b2lkIHtcclxuICAgIGlmICghIWl0ZW0gJiYgdHlwZW9mIGl0ZW0uYWN0aW9uID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgaXRlbS5hY3Rpb24oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGlkZUl0ZW1zR3JlYXRlck4odmlzaWJsZUl0ZW1zQ291bnQ6IG51bWJlcikge1xyXG4gICAgY29uc3QgaW52aXNpYmxlSXRlbXM6IEFjdGlvbltdID0gW107XHJcbiAgICB0aGlzLnZpc2libGVBY3Rpb25zLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaWYgKHZpc2libGVJdGVtc0NvdW50IDw9IDApIHtcclxuICAgICAgICBpdGVtLm1vZGUgPSBcInBvcHVwXCI7XHJcbiAgICAgICAgaW52aXNpYmxlSXRlbXMucHVzaChpdGVtKTtcclxuICAgICAgfVxyXG4gICAgICB2aXNpYmxlSXRlbXNDb3VudC0tO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmludmlzaWJsZUl0ZW1zTGlzdE1vZGVsLml0ZW1zID0gaW52aXNpYmxlSXRlbXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFZpc2libGVJdGVtc0NvdW50KGF2YWlsYWJsZVNpemU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBjb25zdCBpdGVtc1NpemVzOiBudW1iZXJbXSA9IHRoaXMudmlzaWJsZUFjdGlvbnMubWFwKChpdGVtKSA9PiBpdGVtLm1pbkRpbWVuc2lvbik7XHJcbiAgICBsZXQgY3VyclNpemU6IG51bWJlciA9IDA7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zU2l6ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY3VyclNpemUgKz0gaXRlbXNTaXplc1tpXTtcclxuICAgICAgaWYgKGN1cnJTaXplID4gYXZhaWxhYmxlU2l6ZSkgcmV0dXJuIGk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlSXRlbU1vZGUoYXZhaWxhYmxlU2l6ZTogbnVtYmVyLCBpdGVtc1NpemU6IG51bWJlcikge1xyXG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLnZpc2libGVBY3Rpb25zO1xyXG4gICAgZm9yIChsZXQgaW5kZXggPSBpdGVtcy5sZW5ndGggLSAxOyBpbmRleCA+PSAwOyBpbmRleC0tKSB7XHJcbiAgICAgIGlmIChpdGVtc1NpemUgPiBhdmFpbGFibGVTaXplKSB7XHJcbiAgICAgICAgaXRlbXNTaXplIC09IGl0ZW1zW2luZGV4XS5tYXhEaW1lbnNpb24gLSBpdGVtc1tpbmRleF0ubWluRGltZW5zaW9uO1xyXG4gICAgICAgIGl0ZW1zW2luZGV4XS5tb2RlID0gXCJzbWFsbFwiO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGl0ZW1zW2luZGV4XS5tb2RlID0gXCJsYXJnZVwiO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICB0aGlzLmRvdHNJdGVtUG9wdXBNb2RlbCA9IG5ldyBQb3B1cE1vZGVsKFwic3YtbGlzdFwiLCB7XHJcbiAgICAgIG1vZGVsOiB0aGlzLmludmlzaWJsZUl0ZW1zTGlzdE1vZGVsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuZG90c0l0ZW0gPSBuZXcgQWN0aW9uKHtcclxuICAgICAgaWQ6IFwiZG90c0l0ZW0taWRcIixcclxuICAgICAgY29tcG9uZW50OiBcInN2LWFjdGlvbi1iYXItaXRlbS1kcm9wZG93blwiLFxyXG4gICAgICBjc3M6IFwic3YtZG90c1wiLFxyXG4gICAgICBpbm5lckNzczogXCJzdi1kb3RzX19pdGVtXCIsXHJcbiAgICAgIGljb25OYW1lOiBcImljb24tZG90c1wiLFxyXG4gICAgICB2aXNpYmxlOiBmYWxzZSxcclxuICAgICAgYWN0aW9uOiAoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5kb3RzSXRlbVBvcHVwTW9kZWwudG9nZ2xlVmlzaWJpbGl0eSgpO1xyXG4gICAgICB9LFxyXG4gICAgICBwb3B1cE1vZGVsOiB0aGlzLmRvdHNJdGVtUG9wdXBNb2RlbFxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHByb3RlY3RlZCBvblNldCgpIHtcclxuICAgIHRoaXMuYWN0aW9ucy5mb3JFYWNoKGFjdGlvbiA9PiBhY3Rpb24udXBkYXRlQ2FsbGJhY2sgPSAoKSA9PiB0aGlzLnJhaXNlVXBkYXRlKGZhbHNlKSk7XHJcbiAgICBzdXBlci5vblNldCgpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uUHVzaChpdGVtOiBUKSB7XHJcbiAgICBpdGVtLnVwZGF0ZUNhbGxiYWNrID0gKCkgPT4gdGhpcy5yYWlzZVVwZGF0ZShmYWxzZSk7XHJcbiAgICBzdXBlci5vblB1c2goaXRlbSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0UmVuZGVyZWRBY3Rpb25zKCk6IEFycmF5PFQ+IHtcclxuICAgIHJldHVybiB0aGlzLmFjdGlvbnMuY29uY2F0KFs8VD50aGlzLmRvdHNJdGVtXSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZml0KGRpbWVuc2lvbjogbnVtYmVyLCBkb3RzSXRlbVNpemU6IG51bWJlcikge1xyXG4gICAgaWYgKGRpbWVuc2lvbiA8PSAwKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5kb3RzSXRlbS52aXNpYmxlID0gZmFsc2U7XHJcbiAgICBsZXQgbWluU2l6ZSA9IDA7XHJcbiAgICBsZXQgbWF4U2l6ZSA9IDA7XHJcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMudmlzaWJsZUFjdGlvbnM7XHJcblxyXG4gICAgaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBtaW5TaXplICs9IGl0ZW0ubWluRGltZW5zaW9uO1xyXG4gICAgICBtYXhTaXplICs9IGl0ZW0ubWF4RGltZW5zaW9uO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGRpbWVuc2lvbiA+PSBtYXhTaXplKSB7XHJcbiAgICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IChpdGVtLm1vZGUgPSBcImxhcmdlXCIpKTtcclxuICAgIH0gZWxzZSBpZiAoZGltZW5zaW9uIDwgbWluU2l6ZSkge1xyXG4gICAgICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiAoaXRlbS5tb2RlID0gXCJzbWFsbFwiKSk7XHJcbiAgICAgIHRoaXMuaGlkZUl0ZW1zR3JlYXRlck4odGhpcy5nZXRWaXNpYmxlSXRlbXNDb3VudChkaW1lbnNpb24gLSBkb3RzSXRlbVNpemUpKTtcclxuICAgICAgdGhpcy5kb3RzSXRlbS52aXNpYmxlID0gdHJ1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudXBkYXRlSXRlbU1vZGUoZGltZW5zaW9uLCBtYXhTaXplKTtcclxuICAgIH1cclxuICB9XHJcbiAgcHVibGljIGluaXRSZXNwb25zaXZpdHlNYW5hZ2VyKGNvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQpOiB2b2lkIHtcclxuICAgIHRoaXMucmVzcG9uc2l2aXR5TWFuYWdlciA9IG5ldyBSZXNwb25zaXZpdHlNYW5hZ2VyKFxyXG4gICAgICBjb250YWluZXIsIHRoaXMsXHJcbiAgICAgIFwiLnN2LWFjdGlvbjpub3QoLnN2LWRvdHMpPi5zdi1hY3Rpb25fX2NvbnRlbnRcIlxyXG4gICAgKTtcclxuICB9XHJcbiAgcHVibGljIHJlc2V0UmVzcG9uc2l2aXR5TWFuYWdlcigpOiB2b2lkIHtcclxuICAgIGlmKCEhdGhpcy5yZXNwb25zaXZpdHlNYW5hZ2VyKSB7XHJcbiAgICAgIHRoaXMucmVzcG9uc2l2aXR5TWFuYWdlci5kaXNwb3NlKCk7XHJcbiAgICAgIHRoaXMucmVzcG9uc2l2aXR5TWFuYWdlciA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICB9XHJcbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XHJcbiAgICBzdXBlci5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLnJlc2V0UmVzcG9uc2l2aXR5TWFuYWdlcigpO1xyXG4gIH1cclxufSIsImltcG9ydCB7IHByb3BlcnR5QXJyYXkgfSBmcm9tIFwiLi4vanNvbm9iamVjdFwiO1xyXG5pbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4uL2Jhc2VcIjtcclxuaW1wb3J0IHsgSUFjdGlvbiwgQWN0aW9uIH0gZnJvbSBcIi4vYWN0aW9uXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQWN0aW9uQ29udGFpbmVyPFQgZXh0ZW5kcyBBY3Rpb24gPSBBY3Rpb24+IGV4dGVuZHMgQmFzZSB7XHJcbiAgICBAcHJvcGVydHlBcnJheSh7XHJcbiAgICAgIG9uU2V0OiAoXzogYW55LCB0YXJnZXQ6IEFjdGlvbkNvbnRhaW5lcjxBY3Rpb24+KSA9PiB7XHJcbiAgICAgICAgdGFyZ2V0Lm9uU2V0KCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uUHVzaDogKGl0ZW06IGFueSwgaTogbnVtYmVyLCB0YXJnZXQ6IEFjdGlvbkNvbnRhaW5lcjxBY3Rpb24+KSA9PiB7XHJcbiAgICAgICAgdGFyZ2V0Lm9uUHVzaChpdGVtKTtcclxuICAgICAgfSxcclxuICAgICAgb25SZW1vdmU6IChpdGVtOiBhbnksIGk6IG51bWJlciwgdGFyZ2V0OiBBY3Rpb25Db250YWluZXI8QWN0aW9uPikgPT4ge1xyXG4gICAgICAgIHRhcmdldC5vblJlbW92ZShpdGVtKTtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIGFjdGlvbnM6IEFycmF5PFQ+O1xyXG5cclxuICAgIHByb3RlY3RlZCBnZXRSZW5kZXJlZEFjdGlvbnMoKTogQXJyYXk8VD4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5hY3Rpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVDYWxsYmFjazogKGlzUmVzZXRJbml0aWFsaXplZDogYm9vbGVhbikgPT4gdm9pZDtcclxuICAgIHB1YmxpYyBjb250YWluZXJDc3M6IHN0cmluZztcclxuXHJcbiAgICBwcm90ZWN0ZWQgcmFpc2VVcGRhdGUoaXNSZXNldEluaXRpYWxpemVkOiBib29sZWFuKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlQ2FsbGJhY2sgJiYgdGhpcy51cGRhdGVDYWxsYmFjayhpc1Jlc2V0SW5pdGlhbGl6ZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvblNldCgpIHtcclxuICAgICAgdGhpcy5yYWlzZVVwZGF0ZSh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgb25QdXNoKGl0ZW06IFQpIHtcclxuICAgICAgdGhpcy5yYWlzZVVwZGF0ZSh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgb25SZW1vdmUoaXRlbTogVCkge1xyXG4gICAgICB0aGlzLnJhaXNlVXBkYXRlKHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgaGFzQWN0aW9ucygpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuICh0aGlzLmFjdGlvbnMgfHwgW10pLmxlbmd0aCA+IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCByZW5kZXJlZEFjdGlvbnMoKTogQXJyYXk8VD4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRSZW5kZXJlZEFjdGlvbnMoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgdmlzaWJsZUFjdGlvbnMoKTogQXJyYXk8VD4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5hY3Rpb25zLmZpbHRlcigoYWN0aW9uKSA9PiBhY3Rpb24udmlzaWJsZSAhPT0gZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBjc3MoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIFwic3YtYWN0aW9uLWJhclwiICsgKCEhdGhpcy5jb250YWluZXJDc3MgPyBcIiBcIiArIHRoaXMuY29udGFpbmVyQ3NzIDogXCJcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzb3J0SXRlbXMoaXRlbXM6IEFycmF5PFQ+KSB7XHJcbiAgICAgIHJldHVybiBbXVxyXG4gICAgICAgIC5jb25jYXQoaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnZpc2libGVJbmRleCA+PSAwIHx8IGl0ZW0udmlzaWJsZUluZGV4ID09PSB1bmRlZmluZWQpKVxyXG4gICAgICAgIC5zb3J0KChmaXJzdEl0ZW0sIHNlY29uZEl0ZW0pID0+IHtcclxuICAgICAgICAgIHJldHVybiBmaXJzdEl0ZW0udmlzaWJsZUluZGV4IC0gc2Vjb25kSXRlbS52aXNpYmxlSW5kZXg7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldEl0ZW1zKGl0ZW1zOiBBcnJheTxJQWN0aW9uPiwgc29ydEJ5VmlzaWJsZUluZGV4ID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgICBjb25zdCBhY3Rpb25zOiBBcnJheTxUPiA9IDxhbnk+aXRlbXMubWFwKChpdGVtKSA9PiAoaXRlbSBpbnN0YW5jZW9mIEFjdGlvbiA/IGl0ZW0gOiBuZXcgQWN0aW9uKGl0ZW0pKSk7XHJcbiAgICAgIGlmIChzb3J0QnlWaXNpYmxlSW5kZXgpIHtcclxuICAgICAgICB0aGlzLmFjdGlvbnMgPSB0aGlzLnNvcnRJdGVtcyhhY3Rpb25zKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmFjdGlvbnMgPSBhY3Rpb25zO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgaW5pdFJlc3BvbnNpdml0eU1hbmFnZXIoY29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCk6IHZvaWQge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgcmVzZXRSZXNwb25zaXZpdHlNYW5hZ2VyKCk6IHZvaWQge31cclxufVxyXG4iLCJpbXBvcnQgeyBJTG9jYWxpemFibGVPd25lciwgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7XG4gIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLFxuICBKc29uT2JqZWN0LFxuICBKc29uT2JqZWN0UHJvcGVydHksXG4gIFNlcmlhbGl6ZXIsXG59IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IHNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3NcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgSUZpbmRFbGVtZW50LCBJUHJvZ3Jlc3NJbmZvLCBJU3VydmV5IH0gZnJvbSBcIi4vYmFzZS1pbnRlcmZhY2VzXCI7XG5cbmV4cG9ydCBjbGFzcyBCaW5kaW5ncyB7XG4gIHByaXZhdGUgcHJvcGVydGllczogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PiA9IG51bGw7XG4gIHByaXZhdGUgdmFsdWVzOiBhbnkgPSBudWxsO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG9iajogQmFzZSkgeyB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiYmluZGluZ3NcIjtcbiAgfVxuICBwdWJsaWMgZ2V0TmFtZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIHJlczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIHRoaXMuZmlsbFByb3BlcnRpZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMucHJvcGVydGllc1tpXS5pc1Zpc2libGUoXCJcIiwgdGhpcy5vYmopKSB7XG4gICAgICAgIHJlcy5wdXNoKHRoaXMucHJvcGVydGllc1tpXS5uYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgZ2V0UHJvcGVydGllcygpOiBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+IHtcbiAgICB2YXIgcmVzOiBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+ID0gW107XG4gICAgdGhpcy5maWxsUHJvcGVydGllcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXMucHVzaCh0aGlzLnByb3BlcnRpZXNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBzZXRCaW5kaW5nKHByb3BlcnR5TmFtZTogc3RyaW5nLCB2YWx1ZU5hbWU6IHN0cmluZykge1xuICAgIGlmICghdGhpcy52YWx1ZXMpIHRoaXMudmFsdWVzID0ge307XG4gICAgaWYgKCEhdmFsdWVOYW1lKSB7XG4gICAgICB0aGlzLnZhbHVlc1twcm9wZXJ0eU5hbWVdID0gdmFsdWVOYW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdGhpcy52YWx1ZXNbcHJvcGVydHlOYW1lXTtcbiAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnZhbHVlcykubGVuZ3RoID09IDApIHtcbiAgICAgICAgdGhpcy52YWx1ZXMgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgY2xlYXJCaW5kaW5nKHByb3BlcnR5TmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRCaW5kaW5nKHByb3BlcnR5TmFtZSwgXCJcIik7XG4gIH1cbiAgcHVibGljIGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnZhbHVlcztcbiAgfVxuICBwdWJsaWMgZ2V0VmFsdWVOYW1lQnlQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy52YWx1ZXMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzW3Byb3BlcnR5TmFtZV07XG4gIH1cbiAgcHVibGljIGdldFByb3BlcnRpZXNCeVZhbHVlTmFtZSh2YWx1ZU5hbWU6IHN0cmluZyk6IEFycmF5PHN0cmluZz4ge1xuICAgIGlmICghdGhpcy52YWx1ZXMpIHJldHVybiBbXTtcbiAgICB2YXIgcmVzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMudmFsdWVzKSB7XG4gICAgICBpZiAodGhpcy52YWx1ZXNba2V5XSA9PSB2YWx1ZU5hbWUpIHtcbiAgICAgICAgcmVzLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgZ2V0SnNvbigpOiBhbnkge1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIHJlczogYW55ID0ge307XG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMudmFsdWVzKSB7XG4gICAgICByZXNba2V5XSA9IHRoaXMudmFsdWVzW2tleV07XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIHNldEpzb24odmFsdWU6IGFueSkge1xuICAgIHRoaXMudmFsdWVzID0gbnVsbDtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm47XG4gICAgdGhpcy52YWx1ZXMgPSB7fTtcbiAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICAgIHRoaXMudmFsdWVzW2tleV0gPSB2YWx1ZVtrZXldO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGZpbGxQcm9wZXJ0aWVzKCkge1xuICAgIGlmICh0aGlzLnByb3BlcnRpZXMgIT09IG51bGwpIHJldHVybjtcbiAgICB0aGlzLnByb3BlcnRpZXMgPSBbXTtcbiAgICB2YXIgb2JqUHJvcGVydGllcyA9IFNlcmlhbGl6ZXIuZ2V0UHJvcGVydGllc0J5T2JqKHRoaXMub2JqKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9ialByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChvYmpQcm9wZXJ0aWVzW2ldLmlzQmluZGFibGUpIHtcbiAgICAgICAgdGhpcy5wcm9wZXJ0aWVzLnB1c2gob2JqUHJvcGVydGllc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEZXBlbmRlbmNpZXMge1xuICBwcml2YXRlIHN0YXRpYyBEZXBlbmRlbmNpZXNDb3VudCA9IDA7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBjdXJyZW50RGVwZW5kZW5jeTogKCkgPT4gdm9pZCwgcHVibGljIHRhcmdldDogQmFzZSwgcHVibGljIHByb3BlcnR5OiBzdHJpbmcpIHtcbiAgfVxuICBkZXBlbmRlbmNpZXM6IEFycmF5PHsgb2JqOiBCYXNlLCBwcm9wOiBzdHJpbmcsIGlkOiBzdHJpbmcgfT4gPSBbXTtcbiAgaWQ6IHN0cmluZyA9IFwiXCIgKyAoKytEZXBlbmRlbmNpZXMuRGVwZW5kZW5jaWVzQ291bnQpO1xuICBhZGREZXBlbmRlbmN5KHRhcmdldDogQmFzZSwgcHJvcGVydHk6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRhcmdldCA9PT0gdGFyZ2V0ICYmIHRoaXMucHJvcGVydHkgPT09IHByb3BlcnR5KVxuICAgICAgcmV0dXJuO1xuICAgIGlmICh0aGlzLmRlcGVuZGVuY2llcy5zb21lKGRlcGVuZGVuY3kgPT4gZGVwZW5kZW5jeS5vYmogPT09IHRhcmdldCAmJiBkZXBlbmRlbmN5LnByb3AgPT09IHByb3BlcnR5KSlcbiAgICAgIHJldHVybjtcblxuICAgIHRoaXMuZGVwZW5kZW5jaWVzLnB1c2goe1xuICAgICAgb2JqOiB0YXJnZXQsXG4gICAgICBwcm9wOiBwcm9wZXJ0eSxcbiAgICAgIGlkOiB0aGlzLmlkXG4gICAgfSk7XG4gICAgdGFyZ2V0LnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoW3Byb3BlcnR5XSwgdGhpcy5jdXJyZW50RGVwZW5kZW5jeSwgdGhpcy5pZCk7XG5cbiAgfVxuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuZGVwZW5kZW5jaWVzLmZvckVhY2goZGVwZW5kZW5jeSA9PiB7XG4gICAgICBkZXBlbmRlbmN5Lm9iai51blJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoW2RlcGVuZGVuY3kucHJvcF0sIGRlcGVuZGVuY3kuaWQpO1xuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb21wdXRlZFVwZGF0ZXI8VCA9IGFueT4ge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IENvbXB1dGVkVXBkYXRlclR5cGUgPSBcIl9fZGVwZW5kZW5jeV9jb21wdXRlZFwiO1xuICBwcml2YXRlIGRlcGVuZGVuY2llczogRGVwZW5kZW5jaWVzID0gdW5kZWZpbmVkO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF91cGRhdGVyOiAoKSA9PiBUKSB7XG4gIH1cbiAgcmVhZG9ubHkgdHlwZSA9IENvbXB1dGVkVXBkYXRlci5Db21wdXRlZFVwZGF0ZXJUeXBlO1xuICBwdWJsaWMgZ2V0IHVwZGF0ZXIoKTogKCkgPT4gVCB7XG4gICAgcmV0dXJuIHRoaXMuX3VwZGF0ZXI7XG4gIH1cbiAgcHVibGljIHNldERlcGVuZGVuY2llcyhkZXBlbmRlbmNpZXM6IERlcGVuZGVuY2llcyk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJEZXBlbmRlbmNpZXMoKTtcbiAgICB0aGlzLmRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcztcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGVwZW5kZW5jaWVzKCk6IERlcGVuZGVuY2llcyB7XG4gICAgcmV0dXJuIHRoaXMuZGVwZW5kZW5jaWVzO1xuICB9XG4gIHByaXZhdGUgY2xlYXJEZXBlbmRlbmNpZXMoKSB7XG4gICAgaWYgKHRoaXMuZGVwZW5kZW5jaWVzKSB7XG4gICAgICB0aGlzLmRlcGVuZGVuY2llcy5kaXNwb3NlKCk7XG4gICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbiAgZGlzcG9zZSgpOiBhbnkge1xuICAgIHRoaXMuY2xlYXJEZXBlbmRlbmNpZXMoKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBiYXNlIGNsYXNzIGZvciBTdXJ2ZXlKUyBvYmplY3RzLlxuICovXG5leHBvcnQgY2xhc3MgQmFzZSB7XG4gIHByaXZhdGUgc3RhdGljIGN1cnJlbnREZXBlbmRlbmNpczogRGVwZW5kZW5jaWVzID0gdW5kZWZpbmVkO1xuICBwdWJsaWMgc3RhdGljIGZpbmlzaENvbGxlY3REZXBlbmRlbmNpZXMoKTogRGVwZW5kZW5jaWVzIHtcbiAgICBjb25zdCBkZXBzID0gQmFzZS5jdXJyZW50RGVwZW5kZW5jaXM7XG4gICAgQmFzZS5jdXJyZW50RGVwZW5kZW5jaXMgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGRlcHM7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBzdGFydENvbGxlY3REZXBlbmRlbmNpZXModXBkYXRlcjogKCkgPT4gdm9pZCwgdGFyZ2V0OiBCYXNlLCBwcm9wZXJ0eTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKEJhc2UuY3VycmVudERlcGVuZGVuY2lzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkF0dGVtcHQgdG8gY29sbGVjdCBuZXN0ZWQgZGVwZW5kZW5jaWVzLiBOZXN0ZWQgZGVwZW5kZW5jaWVzIGFyZSBub3Qgc3VwcG9ydGVkLlwiKTtcbiAgICB9XG4gICAgQmFzZS5jdXJyZW50RGVwZW5kZW5jaXMgPSBuZXcgRGVwZW5kZW5jaWVzKHVwZGF0ZXIsIHRhcmdldCwgcHJvcGVydHkpO1xuICB9XG4gIHByaXZhdGUgc3RhdGljIGNvbGxlY3REZXBlbmRlbmN5KHRhcmdldDogQmFzZSwgcHJvcGVydHk6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChCYXNlLmN1cnJlbnREZXBlbmRlbmNpcyA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgQmFzZS5jdXJyZW50RGVwZW5kZW5jaXMuYWRkRGVwZW5kZW5jeSh0YXJnZXQsIHByb3BlcnR5KTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGdldCBjb21tZW50UHJlZml4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHNldHRpbmdzLmNvbW1lbnRQcmVmaXg7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBzZXQgY29tbWVudFByZWZpeCh2YWw6IHN0cmluZykge1xuICAgIHNldHRpbmdzLmNvbW1lbnRQcmVmaXggPSB2YWw7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBjcmVhdGVJdGVtVmFsdWU6IChpdGVtOiBhbnksIHR5cGU/OiBzdHJpbmcpID0+IGFueTtcbiAgcHVibGljIHN0YXRpYyBpdGVtVmFsdWVMb2NTdHJDaGFuZ2VkOiAoYXJyOiBBcnJheTxhbnk+KSA9PiB2b2lkO1xuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGEgdmFsdWUgdW5kZWZpbmVkLCBudWxsLCBlbXB0eSBzdHJpbmcgb3IgZW1wdHkgYXJyYXkuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKiBAcGFyYW0gdHJpbVN0cmluZyBhIGJvb2xlYW4gcGFyYW1ldGVyLCBkZWZhdWx0IHZhbHVlIHRydWUuIElmIHRydWUgdGhlbiBpdCB0cmltcyB0aGUgc3RyaW5nIGFuZCBmdW5jdGlvbnMgcmV0dXJucyB0cnVlIGZvciBhIHN0cmluZyB0aGF0IGNvbnRhaW5zIHdoaXRlIHNwYWNlcyBvbmx5LlxuICAgKi9cbiAgcHVibGljIGlzVmFsdWVFbXB0eSh2YWx1ZTogYW55LCB0cmltU3RyaW5nOiBib29sZWFuID0gdHJ1ZSk6IGJvb2xlYW4ge1xuICAgIGlmICh0cmltU3RyaW5nKSB7XG4gICAgICB2YWx1ZSA9IHRoaXMudHJpbVZhbHVlKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIEhlbHBlcnMuaXNWYWx1ZUVtcHR5KHZhbHVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgdHJpbVZhbHVlKHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGlmICghIXZhbHVlICYmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpKVxuICAgICAgcmV0dXJuIHZhbHVlLnRyaW0oKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIElzUHJvcGVydHlFbXB0eSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSBcIlwiICYmIHRoaXMuaXNWYWx1ZUVtcHR5KHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvcGVydHlIYXNoOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgcHJpdmF0ZSBsb2NhbGl6YWJsZVN0cmluZ3M6IHsgW2luZGV4OiBzdHJpbmddOiBMb2NhbGl6YWJsZVN0cmluZyB9O1xuICBwcml2YXRlIGFycmF5c0luZm86IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfTtcbiAgcHJpdmF0ZSBldmVudExpc3Q6IEFycmF5PEV2ZW50QmFzZTxhbnk+PiA9IFtdO1xuICBwcml2YXRlIGJpbmRpbmdzVmFsdWU6IEJpbmRpbmdzO1xuICBwcml2YXRlIGlzRGlzcG9zZWRWYWx1ZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBvblByb3BDaGFuZ2VGdW5jdGlvbnM6IEFycmF5PHtcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZnVuYzogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkLFxuICAgIGtleTogc3RyaW5nLFxuICB9PjtcbiAgcHJvdGVjdGVkIGlzTG9hZGluZ0Zyb21Kc29uVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGxvYWRpbmdPd25lcjogQmFzZSA9IG51bGw7XG4gIC8qKlxuICAgKiBFdmVudCB0aGF0IHJhaXNlIG9uIHByb3BlcnR5IGNoYW5nZSBvZiB0aGUgc2VuZGVyIG9iamVjdFxuICAgKiBzZW5kZXIgLSB0aGUgb2JqZWN0IHRoYXQgb3ducyB0aGUgcHJvcGVydHlcbiAgICogb3B0aW9ucy5uYW1lIC0gdGhlIHByb3BlcnR5IG5hbWUgdGhhdCBoYXMgYmVlbiBjaGFuZ2VkXG4gICAqIG9wdGlvbnMub2xkVmFsdWUgLSBvbGQgdmFsdWUuIFBsZWFzZSBub3RlLCBpdCBlcXVhbHMgdG8gb3B0aW9ucy5uZXdWYWx1ZSBpZiBwcm9wZXJ0eSBpcyBhbiBhcnJheVxuICAgKiBvcHRpb25zLm5ld1ZhbHVlIC0gbmV3IHZhbHVlLlxuICAgKi9cbiAgcHVibGljIG9uUHJvcGVydHlDaGFuZ2VkOiBFdmVudEJhc2U8QmFzZT4gPSB0aGlzLmFkZEV2ZW50PEJhc2U+KCk7XG4gIC8qKlxuICAgKiBFdmVudCB0aGF0IHJhaXNlZCBvbiBjaGFuZ2luZyBwcm9wZXJ0eSBvZiB0aGUgSXRlbVZhbHVlIG9iamVjdC5cbiAgICogc2VuZGVyIC0gdGhlIG9iamVjdCB0aGF0IG93bnMgdGhlIHByb3BlcnR5XG4gICAqIG9wdGlvbnMucHJvcGVydHlOYW1lIC0gdGhlIHByb3BlcnR5IG5hbWUgdG8gd2hpY2ggSXRlbVZhbHVlIGFycmF5IGlzIGJlbG9uZy4gSXQgY2FuIGJlIFwiY2hvaWNlc1wiIGZvciBkcm9wZG93biBxdWVzdGlvblxuICAgKiBvcHRpb25zLm9iaiAtIHRoZSBpbnN0YW5jZSBvZiBJdGVtVmFsdWUgb2JqZWN0IHdoaWNoIHByb3BlcnR5IGhhcyBiZWVuIGNoYW5nZWRcbiAgICogb3B0aW9ucy5uYW1lIC0gdGhlIHByb3BlcnR5IG9mIEl0ZW1PYmplY3QgdGhhdCBoYXMgYmVlbiBjaGFuZ2VkXG4gICAqIG9wdGlvbnMub2xkVmFsdWUgLSBvbGQgdmFsdWVcbiAgICogb3B0aW9ucy5uZXdWYWx1ZSAtIG5ldyB2YWx1ZVxuICAgKi9cbiAgcHVibGljIG9uSXRlbVZhbHVlUHJvcGVydHlDaGFuZ2VkOiBFdmVudDxcbiAgICAoc2VuZGVyOiBCYXNlLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IHRoaXMuYWRkRXZlbnQ8QmFzZT4oKTtcblxuICBnZXRQcm9wZXJ0eVZhbHVlQ29yZUhhbmRsZXI6IChwcm9wZXJ0aWVzSGFzaDogYW55LCBuYW1lOiBzdHJpbmcpID0+IGFueTtcblxuICBzZXRQcm9wZXJ0eVZhbHVlQ29yZUhhbmRsZXI6IChcbiAgICBwcm9wZXJ0aWVzSGFzaDogYW55LFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YWw6IGFueVxuICApID0+IHZvaWQ7XG4gIGNyZWF0ZUFycmF5Q29yZUhhbmRsZXI6IChwcm9wZXJ0aWVzSGFzaDogYW55LCBuYW1lOiBzdHJpbmcpID0+IEFycmF5PGFueT47XG4gIHN1cnZleUNoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcblxuICBwcml2YXRlIGlzQ3JlYXRpbmcgPSB0cnVlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmJpbmRpbmdzVmFsdWUgPSBuZXcgQmluZGluZ3ModGhpcyk7XG4gICAgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24uY3JlYXRlUHJvcGVydGllcyh0aGlzKTtcbiAgICB0aGlzLm9uQmFzZUNyZWF0aW5nKCk7XG4gICAgdGhpcy5pc0NyZWF0aW5nID0gZmFsc2U7XG4gIH1cbiAgcHVibGljIGRpc3Bvc2UoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmV2ZW50TGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5ldmVudExpc3RbaV0uY2xlYXIoKTtcbiAgICB9XG4gICAgdGhpcy5vblByb3BlcnR5VmFsdWVDaGFuZ2VkQ2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5pc0Rpc3Bvc2VkVmFsdWUgPSB0cnVlO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNEaXNwb3NlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc0Rpc3Bvc2VkVmFsdWUgPT09IHRydWU7XG4gIH1cbiAgcHJvdGVjdGVkIGFkZEV2ZW50PFQ+KCk6IEV2ZW50QmFzZTxUPiB7XG4gICAgdmFyIHJlcyA9IG5ldyBFdmVudEJhc2U8VD4oKTtcbiAgICB0aGlzLmV2ZW50TGlzdC5wdXNoKHJlcyk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcm90ZWN0ZWQgb25CYXNlQ3JlYXRpbmcoKSB7IH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCBhcyBhIHN0cmluZyBhcyBpdCByZXByZXNlbnRzIGluIHRoZSBqc29uLiBJdCBzaG91bGQgYmUgaW4gbG93Y2FzZS5cbiAgICovXG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiYmFzZVwiO1xuICB9XG4gIHB1YmxpYyBnZXRTdXJ2ZXkoaXNMaXZlOiBib29sZWFuID0gZmFsc2UpOiBJU3VydmV5IHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgaW5sdWRlZCBpbnRvIHN1cnZleSwgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGluU3VydmV5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZ2V0U3VydmV5KHRydWUpO1xuICB9XG4gIHB1YmxpYyBnZXQgYmluZGluZ3MoKTogQmluZGluZ3Mge1xuICAgIHJldHVybiB0aGlzLmJpbmRpbmdzVmFsdWU7XG4gIH1cbiAgY2hlY2tCaW5kaW5ncyh2YWx1ZU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkgeyB9XG4gIHByb3RlY3RlZCB1cGRhdGVCaW5kaW5ncyhwcm9wZXJ0eU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIHZhciB2YWx1ZU5hbWUgPSB0aGlzLmJpbmRpbmdzLmdldFZhbHVlTmFtZUJ5UHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZSk7XG4gICAgaWYgKCEhdmFsdWVOYW1lKSB7XG4gICAgICB0aGlzLnVwZGF0ZUJpbmRpbmdWYWx1ZSh2YWx1ZU5hbWUsIHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZUJpbmRpbmdWYWx1ZSh2YWx1ZU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkgeyB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBlbGVtZW50IHRlbXBsYXRlIG5hbWUgd2l0aG91dCBwcmVmaXguIFR5cGljYWxseSBpdCBlcXVhbHMgdG8gZ2V0VHlwZSgpLlxuICAgKiBAc2VlIGdldFR5cGVcbiAgICovXG4gIHB1YmxpYyBnZXRUZW1wbGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFR5cGUoKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgbG9hZGluZyBmcm9tIEpzb24gYXQgdGhlIGN1cnJlbnQgbW9tZW50LlxuICAgKi9cbiAgcHVibGljIGdldCBpc0xvYWRpbmdGcm9tSnNvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJc0xvYWRpbmdGcm9tSnNvbigpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRJc0xvYWRpbmdGcm9tSnNvbigpOiBib29sZWFuIHtcbiAgICBpZiAoISF0aGlzLmxvYWRpbmdPd25lciAmJiB0aGlzLmxvYWRpbmdPd25lci5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIHRoaXMuaXNMb2FkaW5nRnJvbUpzb25WYWx1ZTtcbiAgfVxuXG4gIHN0YXJ0TG9hZGluZ0Zyb21Kc29uKCkge1xuICAgIHRoaXMuaXNMb2FkaW5nRnJvbUpzb25WYWx1ZSA9IHRydWU7XG4gIH1cbiAgZW5kTG9hZGluZ0Zyb21Kc29uKCkge1xuICAgIHRoaXMuaXNMb2FkaW5nRnJvbUpzb25WYWx1ZSA9IGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZWQgdGhlIGN1cnJlbnQgb2JqZWN0IGludG8gSlNPTlxuICAgKiBAc2VlIGZyb21KU09OXG4gICAqL1xuICBwdWJsaWMgdG9KU09OKCk6IGFueSB7XG4gICAgcmV0dXJuIG5ldyBKc29uT2JqZWN0KCkudG9Kc29uT2JqZWN0KHRoaXMpO1xuICB9XG4gIC8qKlxuICAgKiBMb2FkIG9iamVjdCBwcm9wZXJ0aWVzIGFuZCBlbGVtZW50cy4gSXQgZG9lc24ndCByZXNldCBwcm9wZXJ0aWVzIHRoYXQgd2FzIGNoYW5nZWQgYmVmb3JlIGFuZCB0aGV5IGFyZSBub3QgZGVmaW5lZCBpbiB0aGUganNvbiBwYXJhbWV0ZXIuXG4gICAqIEBwYXJhbSBqc29uIHRoZSBvYmplY3QgSlNPTiBkZWZpbml0aW9uXG4gICAqIEBzZWUgdG9KU09OXG4gICAqL1xuICBwdWJsaWMgZnJvbUpTT04oanNvbjogYW55KTogdm9pZCB7XG4gICAgbmV3IEpzb25PYmplY3QoKS50b09iamVjdChqc29uLCB0aGlzKTtcbiAgICB0aGlzLm9uU3VydmV5TG9hZCgpO1xuICB9XG4gIHB1YmxpYyBvblN1cnZleUxvYWQoKSB7IH1cbiAgLyoqXG4gICAqIE1ha2UgYSBjbG9uZSBvZiB0aGUgZXhpc3Rpbmcgb2JqZWN0LiBDcmVhdGUgYSBuZXcgb2JqZWN0IG9mIHRoZSBzYW1lIHR5cGUgYW5kIGxvYWQgYWxsIHByb3BlcnRpZXMgaW50byBpdC5cbiAgICovXG4gIHB1YmxpYyBjbG9uZSgpOiBCYXNlIHtcbiAgICB2YXIgY2xvbmVkT2JqID0gPEJhc2U+U2VyaWFsaXplci5jcmVhdGVDbGFzcyh0aGlzLmdldFR5cGUoKSk7XG4gICAgY2xvbmVkT2JqLmZyb21KU09OKHRoaXMudG9KU09OKCkpO1xuICAgIHJldHVybiBjbG9uZWRPYmo7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNlcmlhbGl6YWJsZSBwcm9wZXJ0eSB0aGF0IGJlbG9uZ3MgdG8gdGhpcyBpbnN0YW5jZSBieSBwcm9wZXJ0eSBuYW1lLiBJdCByZXR1cm5zIG51bGwgaWYgdGhlIHByb3BlcnR5IGlzIG5vdCBleGlzdHMuXG4gICAqIEBwYXJhbSBwcm9wTmFtZSBwcm9wZXJ0eSBuYW1lXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwdWJsaWMgZ2V0UHJvcGVydHlCeU5hbWUocHJvcE5hbWU6IHN0cmluZyk6IEpzb25PYmplY3RQcm9wZXJ0eSB7XG4gICAgcmV0dXJuIFNlcmlhbGl6ZXIuZmluZFByb3BlcnR5KHRoaXMuZ2V0VHlwZSgpLCBwcm9wTmFtZSk7XG4gIH1cbiAgcHVibGljIGlzUHJvcGVydHlWaXNpYmxlKHByb3BOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBwcm9wID0gdGhpcy5nZXRQcm9wZXJ0eUJ5TmFtZShwcm9wTmFtZSk7XG4gICAgcmV0dXJuICEhcHJvcCA/IHByb3AuaXNWaXNpYmxlKFwiXCIsIHRoaXMpIDogZmFsc2U7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBjcmVhdGVQcm9ncmVzc0luZm8oKTogSVByb2dyZXNzSW5mbyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHF1ZXN0aW9uQ291bnQ6IDAsXG4gICAgICBhbnN3ZXJlZFF1ZXN0aW9uQ291bnQ6IDAsXG4gICAgICByZXF1aXJlZFF1ZXN0aW9uQ291bnQ6IDAsXG4gICAgICByZXF1aXJlZEFuc3dlcmVkUXVlc3Rpb25Db3VudDogMCxcbiAgICB9O1xuICB9XG4gIHB1YmxpYyBnZXRQcm9ncmVzc0luZm8oKTogSVByb2dyZXNzSW5mbyB7XG4gICAgcmV0dXJuIEJhc2UuY3JlYXRlUHJvZ3Jlc3NJbmZvKCk7XG4gIH1cbiAgcHVibGljIGxvY2FsZUNoYW5nZWQoKSB7IH1cbiAgcHVibGljIGxvY1N0cnNDaGFuZ2VkKCkge1xuICAgIGlmICghIXRoaXMuYXJyYXlzSW5mbykge1xuICAgICAgZm9yIChsZXQga2V5IGluIHRoaXMuYXJyYXlzSW5mbykge1xuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuYXJyYXlzSW5mb1trZXldO1xuICAgICAgICBpZiAoaXRlbSAmJiBpdGVtLmlzSXRlbVZhbHVlcykge1xuICAgICAgICAgIHZhciBhcnIgPSB0aGlzLmdldFByb3BlcnR5VmFsdWUoa2V5KTtcbiAgICAgICAgICBpZiAoYXJyICYmICEhQmFzZS5pdGVtVmFsdWVMb2NTdHJDaGFuZ2VkKVxuICAgICAgICAgICAgQmFzZS5pdGVtVmFsdWVMb2NTdHJDaGFuZ2VkKGFycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEhdGhpcy5sb2NhbGl6YWJsZVN0cmluZ3MpIHtcbiAgICAgIGZvciAobGV0IGtleSBpbiB0aGlzLmxvY2FsaXphYmxlU3RyaW5ncykge1xuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoa2V5KTtcbiAgICAgICAgaWYgKGl0ZW0pIGl0ZW0uc3RyQ2hhbmdlZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUgYnkgbmFtZVxuICAgKiBAcGFyYW0gbmFtZSBwcm9wZXJ0eSBuYW1lXG4gICAqL1xuICBwdWJsaWMgZ2V0UHJvcGVydHlWYWx1ZShuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogYW55ID0gbnVsbCk6IGFueSB7XG4gICAgY29uc3QgcmVzID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlQ29yZSh0aGlzLnByb3BlcnR5SGFzaCwgbmFtZSk7XG4gICAgaWYgKHRoaXMuSXNQcm9wZXJ0eUVtcHR5KHJlcykpIHtcbiAgICAgIGlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICAgIGNvbnN0IHByb3AgPSBTZXJpYWxpemVyLmZpbmRQcm9wZXJ0eSh0aGlzLmdldFR5cGUoKSwgbmFtZSk7XG4gICAgICBpZiAoISFwcm9wICYmICghcHJvcC5pc0N1c3RvbSB8fCAhdGhpcy5pc0NyZWF0aW5nKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIXRoaXMuSXNQcm9wZXJ0eUVtcHR5KHByb3AuZGVmYXVsdFZhbHVlKSAmJlxuICAgICAgICAgICFBcnJheS5pc0FycmF5KHByb3AuZGVmYXVsdFZhbHVlKVxuICAgICAgICApXG4gICAgICAgICAgcmV0dXJuIHByb3AuZGVmYXVsdFZhbHVlO1xuICAgICAgICBpZiAocHJvcC50eXBlID09IFwiYm9vbGVhblwiIHx8IHByb3AudHlwZSA9PSBcInN3aXRjaFwiKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChwcm9wLmlzQ3VzdG9tICYmICEhcHJvcC5vbkdldFZhbHVlKSByZXR1cm4gcHJvcC5vbkdldFZhbHVlKHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByb3RlY3RlZCBnZXRQcm9wZXJ0eVZhbHVlQ29yZShwcm9wZXJ0aWVzSGFzaDogYW55LCBuYW1lOiBzdHJpbmcpIHtcbiAgICBCYXNlLmNvbGxlY3REZXBlbmRlbmN5KHRoaXMsIG5hbWUpO1xuICAgIGlmICh0aGlzLmdldFByb3BlcnR5VmFsdWVDb3JlSGFuZGxlcilcbiAgICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWVDb3JlSGFuZGxlcihwcm9wZXJ0aWVzSGFzaCwgbmFtZSk7XG4gICAgZWxzZSByZXR1cm4gcHJvcGVydGllc0hhc2hbbmFtZV07XG4gIH1cbiAgcHVibGljIGdlVmFsdWVGcm9tSGFzaCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnByb3BlcnR5SGFzaFtcInZhbHVlXCJdO1xuICB9XG4gIHByb3RlY3RlZCBzZXRQcm9wZXJ0eVZhbHVlQ29yZShwcm9wZXJ0aWVzSGFzaDogYW55LCBuYW1lOiBzdHJpbmcsIHZhbDogYW55KSB7XG4gICAgaWYgKHRoaXMuc2V0UHJvcGVydHlWYWx1ZUNvcmVIYW5kbGVyKSB7XG4gICAgICBpZiAoIXRoaXMuaXNEaXNwb3NlZFZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZUNvcmVIYW5kbGVyKHByb3BlcnRpZXNIYXNoLCBuYW1lLCB2YWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS53YXJuKFwiQXR0ZW1wdCB0byBzZXQgcHJvcGVydHkgJ1wiICsgbmFtZSArIFwiJyBvZiBhIGRpc3Bvc2VkIG9iamVjdCAnXCIgKyB0aGlzLmdldFR5cGUoKSArIFwiJ1wiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBwcm9wZXJ0aWVzSGFzaFtuYW1lXSA9IHZhbDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IGlzRWRpdGluZ1N1cnZleUVsZW1lbnQoKTogYm9vbGVhbiB7XG4gICAgdmFyIHN1cnZleSA9IHRoaXMuZ2V0U3VydmV5KCk7XG4gICAgcmV0dXJuICEhc3VydmV5ICYmIHN1cnZleS5pc0VkaXRpbmdTdXJ2ZXlFbGVtZW50O1xuICB9XG4gIHB1YmxpYyBpdGVyYXRlUHJvcGVydGllc0hhc2goZnVuYzogKGhhc2g6IGFueSwga2V5OiBhbnkpID0+IHZvaWQpIHtcbiAgICB2YXIga2V5czogYW55W10gPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5wcm9wZXJ0eUhhc2gpIHtcbiAgICAgIGlmIChcbiAgICAgICAga2V5ID09PSBcInZhbHVlXCIgJiZcbiAgICAgICAgdGhpcy5pc0VkaXRpbmdTdXJ2ZXlFbGVtZW50ICYmXG4gICAgICAgIEFycmF5LmlzQXJyYXkoKDxhbnk+dGhpcykudmFsdWUpXG4gICAgICApXG4gICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICB9XG4gICAga2V5cy5mb3JFYWNoKChrZXkpID0+IGZ1bmModGhpcy5wcm9wZXJ0eUhhc2gsIGtleSkpO1xuICB9XG4gIC8qKlxuICAgKiBzZXQgcHJvcGVydHkgdmFsdWVcbiAgICogQHBhcmFtIG5hbWUgcHJvcGVydHkgbmFtZVxuICAgKiBAcGFyYW0gdmFsIG5ldyBwcm9wZXJ0eSB2YWx1ZVxuICAgKi9cbiAgcHVibGljIHNldFByb3BlcnR5VmFsdWUobmFtZTogc3RyaW5nLCB2YWw6IGFueSkge1xuICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKTtcbiAgICBpZiAoXG4gICAgICBvbGRWYWx1ZSAmJlxuICAgICAgQXJyYXkuaXNBcnJheShvbGRWYWx1ZSkgJiZcbiAgICAgICEhdGhpcy5hcnJheXNJbmZvICYmXG4gICAgICAoIXZhbCB8fCBBcnJheS5pc0FycmF5KHZhbCkpXG4gICAgKSB7XG4gICAgICBpZiAodGhpcy5pc1R3b1ZhbHVlRXF1YWxzKG9sZFZhbHVlLCB2YWwpKSByZXR1cm47XG4gICAgICB2YXIgYXJyYXlJbmZvID0gdGhpcy5hcnJheXNJbmZvW25hbWVdO1xuICAgICAgdGhpcy5zZXRBcnJheShcbiAgICAgICAgbmFtZSxcbiAgICAgICAgb2xkVmFsdWUsXG4gICAgICAgIHZhbCxcbiAgICAgICAgYXJyYXlJbmZvID8gYXJyYXlJbmZvLmlzSXRlbVZhbHVlcyA6IGZhbHNlLFxuICAgICAgICBhcnJheUluZm8gPyBhcnJheUluZm8ub25QdXNoIDogbnVsbFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlRGlyZWN0bHkobmFtZSwgdmFsKTtcbiAgICAgIGlmICghdGhpcy5pc0Rpc3Bvc2VkVmFsdWUgJiYgIXRoaXMuaXNUd29WYWx1ZUVxdWFscyhvbGRWYWx1ZSwgdmFsKSkge1xuICAgICAgICB0aGlzLnByb3BlcnR5VmFsdWVDaGFuZ2VkKG5hbWUsIG9sZFZhbHVlLCB2YWwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgc2V0UHJvcGVydHlWYWx1ZURpcmVjdGx5KG5hbWU6IHN0cmluZywgdmFsOiBhbnkpIDogdm9pZCB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlQ29yZSh0aGlzLnByb3BlcnR5SGFzaCwgbmFtZSwgdmFsKTtcbiAgfVxuICBwcm90ZWN0ZWQgY2xlYXJQcm9wZXJ0eVZhbHVlKG5hbWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZUNvcmUodGhpcy5wcm9wZXJ0eUhhc2gsIG5hbWUsIG51bGwpO1xuICAgIGRlbGV0ZSB0aGlzLnByb3BlcnR5SGFzaFtuYW1lXTtcbiAgfVxuICBwdWJsaWMgb25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZENhbGxiYWNrKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBvbGRWYWx1ZTogYW55LFxuICAgIG5ld1ZhbHVlOiBhbnksXG4gICAgc2VuZGVyOiBCYXNlLFxuICAgIGFycmF5Q2hhbmdlczogQXJyYXlDaGFuZ2VzXG4gICkgeyB9XG4gIHB1YmxpYyBpdGVtVmFsdWVQcm9wZXJ0eUNoYW5nZWQoXG4gICAgaXRlbTogSXRlbVZhbHVlLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBvbGRWYWx1ZTogYW55LFxuICAgIG5ld1ZhbHVlOiBhbnlcbiAgKSB7XG4gICAgdGhpcy5vbkl0ZW1WYWx1ZVByb3BlcnR5Q2hhbmdlZC5maXJlKHRoaXMsIHtcbiAgICAgIG9iajogaXRlbSxcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICBvbGRWYWx1ZTogb2xkVmFsdWUsXG4gICAgICBuZXdWYWx1ZTogbmV3VmFsdWUsXG4gICAgICBwcm9wZXJ0eU5hbWU6IGl0ZW0ub3duZXJQcm9wZXJ0eU5hbWUsXG4gICAgfSk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG9sZFZhbHVlOiBhbnksXG4gICAgbmV3VmFsdWU6IGFueVxuICApIHsgfVxuICBwcm90ZWN0ZWQgcHJvcGVydHlWYWx1ZUNoYW5nZWQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG9sZFZhbHVlOiBhbnksXG4gICAgbmV3VmFsdWU6IGFueSxcbiAgICBhcnJheUNoYW5nZXM/OiBBcnJheUNoYW5nZXMsXG4gICAgdGFyZ2V0PzogQmFzZVxuICApIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuO1xuICAgIHRoaXMudXBkYXRlQmluZGluZ3MobmFtZSwgbmV3VmFsdWUpO1xuICAgIHRoaXMub25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICAgIHRoaXMub25Qcm9wZXJ0eUNoYW5nZWQuZmlyZSh0aGlzLCB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgb2xkVmFsdWU6IG9sZFZhbHVlLFxuICAgICAgbmV3VmFsdWU6IG5ld1ZhbHVlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5kb1Byb3BlcnR5VmFsdWVDaGFuZ2VkQ2FsbGJhY2soXG4gICAgICBuYW1lLFxuICAgICAgb2xkVmFsdWUsXG4gICAgICBuZXdWYWx1ZSxcbiAgICAgIGFycmF5Q2hhbmdlcyxcbiAgICAgIHRoaXNcbiAgICApO1xuXG4gICAgaWYgKCF0aGlzLm9uUHJvcENoYW5nZUZ1bmN0aW9ucykgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vblByb3BDaGFuZ2VGdW5jdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLm9uUHJvcENoYW5nZUZ1bmN0aW9uc1tpXS5uYW1lID09IG5hbWUpXG4gICAgICAgIHRoaXMub25Qcm9wQ2hhbmdlRnVuY3Rpb25zW2ldLmZ1bmMobmV3VmFsdWUpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IGlzSW50ZXJuYWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByaXZhdGUgZG9Qcm9wZXJ0eVZhbHVlQ2hhbmdlZENhbGxiYWNrKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBvbGRWYWx1ZTogYW55LFxuICAgIG5ld1ZhbHVlOiBhbnksXG4gICAgYXJyYXlDaGFuZ2VzPzogQXJyYXlDaGFuZ2VzLFxuICAgIHRhcmdldD86IEJhc2VcbiAgKSB7XG4gICAgaWYgKHRoaXMuaXNJbnRlcm5hbCkgcmV0dXJuO1xuICAgIGlmICghdGFyZ2V0KSB0YXJnZXQgPSB0aGlzO1xuICAgIHZhciBub3RpZmllcjogYW55ID0gdGhpcy5nZXRTdXJ2ZXkoKTtcbiAgICBpZiAoIW5vdGlmaWVyKSBub3RpZmllciA9IHRoaXM7XG4gICAgaWYgKCEhbm90aWZpZXIub25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZENhbGxiYWNrKSB7XG4gICAgICBub3RpZmllci5vblByb3BlcnR5VmFsdWVDaGFuZ2VkQ2FsbGJhY2soXG4gICAgICAgIG5hbWUsXG4gICAgICAgIG9sZFZhbHVlLFxuICAgICAgICBuZXdWYWx1ZSxcbiAgICAgICAgdGFyZ2V0LFxuICAgICAgICBhcnJheUNoYW5nZXNcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChub3RpZmllciAhPT0gdGhpcyAmJiAhIXRoaXMub25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZENhbGxiYWNrKSB7XG4gICAgICB0aGlzLm9uUHJvcGVydHlWYWx1ZUNoYW5nZWRDYWxsYmFjayhcbiAgICAgICAgbmFtZSxcbiAgICAgICAgb2xkVmFsdWUsXG4gICAgICAgIG5ld1ZhbHVlLFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIGFycmF5Q2hhbmdlc1xuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBhIHByb3BlcnR5IHZhbHVlIGNoYW5nZWQuXG4gICAqIEBwYXJhbSBuYW1lIHRoZSBwcm9wZXJ0eSBuYW1lXG4gICAqIEBwYXJhbSBmdW5jIHRoZSBmdW5jdGlvbiB3aXRoIG5vIHBhcmFtZXRlcnMgdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBwcm9wZXJ0eSBjaGFuZ2VkLlxuICAgKiBAcGFyYW0ga2V5IGFuIG9wdGlvbmFsIHBhcmFtZXRlci4gSWYgdGhlcmUgaXMgYWxyZWFkeSBhIHJlZ2lzdGVyZWQgZnVuY3Rpb24gZm9yIHRoaXMgcHJvcGVydHkgd2l0aCB0aGUgc2FtZSBrZXksIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4uXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGZ1bmM6IGFueSxcbiAgICBrZXk6IHN0cmluZyA9IG51bGxcbiAgKSB7XG4gICAgaWYgKCF0aGlzLm9uUHJvcENoYW5nZUZ1bmN0aW9ucykge1xuICAgICAgdGhpcy5vblByb3BDaGFuZ2VGdW5jdGlvbnMgPSBbXTtcbiAgICB9XG4gICAgaWYgKGtleSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9uUHJvcENoYW5nZUZ1bmN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgaXRlbSA9IHRoaXMub25Qcm9wQ2hhbmdlRnVuY3Rpb25zW2ldO1xuICAgICAgICBpZiAoaXRlbS5uYW1lID09IG5hbWUgJiYgaXRlbS5rZXkgPT0ga2V5KSB7XG4gICAgICAgICAgaXRlbS5mdW5jID0gZnVuYztcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5vblByb3BDaGFuZ2VGdW5jdGlvbnMucHVzaCh7IG5hbWU6IG5hbWUsIGZ1bmM6IGZ1bmMsIGtleToga2V5IH0pO1xuICB9XG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gYSBwcm9wZXJ0eSB2YWx1ZSBjaGFuZ2VkIGZyb20gdGhlIG5hbWVzIGxpc3QuXG4gICAqIEBwYXJhbSBuYW1lcyB0aGUgbGlzdCBvZiBwcm9wZXJ0aWVzIG5hbWVzXG4gICAqIEBwYXJhbSBmdW5jIHRoZSBmdW5jdGlvbiB3aXRoIG5vIHBhcmFtZXRlcnMgdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBwcm9wZXJ0eSBjaGFuZ2VkLlxuICAgKiBAcGFyYW0ga2V5IGFuIG9wdGlvbmFsIHBhcmFtZXRlci4gSWYgdGhlcmUgaXMgYWxyZWFkeSBhIHJlZ2lzdGVyZWQgZnVuY3Rpb24gZm9yIHRoaXMgcHJvcGVydHkgd2l0aCB0aGUgc2FtZSBrZXksIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4uXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydGllc1ZhbHVlQ2hhbmdlZChcbiAgICBuYW1lczogQXJyYXk8c3RyaW5nPixcbiAgICBmdW5jOiBhbnksXG4gICAga2V5OiBzdHJpbmcgPSBudWxsXG4gICkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZXNbaV0sIGZ1bmMsIGtleSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVyIG5vdGlmaWNhdGlvbiBvbiBwcm9wZXJ0eSB2YWx1ZSBjaGFuZ2VkXG4gICAqIEBwYXJhbSBuYW1lIHRoZSBwcm9wZXJ0eSBuYW1lXG4gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB3aXRoIHdoaWNoIHlvdSBoYXZlIHJlZ2lzdGVyZWQgdGhlIG5vdGlmaWNhdGlvbiBmb3IgdGhpcyBwcm9wZXJ0eS4gSXQgY2FuIGJlIG51bGwuXG4gICAqL1xuICBwdWJsaWMgdW5SZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAga2V5OiBzdHJpbmcgPSBudWxsXG4gICkge1xuICAgIGlmICghdGhpcy5vblByb3BDaGFuZ2VGdW5jdGlvbnMpIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub25Qcm9wQ2hhbmdlRnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXRlbSA9IHRoaXMub25Qcm9wQ2hhbmdlRnVuY3Rpb25zW2ldO1xuICAgICAgaWYgKGl0ZW0ubmFtZSA9PSBuYW1lICYmIGl0ZW0ua2V5ID09IGtleSkge1xuICAgICAgICB0aGlzLm9uUHJvcENoYW5nZUZ1bmN0aW9ucy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXIgbm90aWZpY2F0aW9uIG9uIHByb3BlcnR5IHZhbHVlIGNoYW5nZWQgZm9yIGFsbCBwcm9wZXJ0aWVzIGluIHRoZSBuYW1lcyBsaXN0LlxuICAgKiBAcGFyYW0gbmFtZXMgdGhlIGxpc3Qgb2YgcHJvcGVydGllcyBuYW1lc1xuICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgd2l0aCB3aGljaCB5b3UgaGF2ZSByZWdpc3RlcmVkIHRoZSBub3RpZmljYXRpb24gZm9yIHRoaXMgcHJvcGVydHkuIEl0IGNhbiBiZSBudWxsLlxuICAgKi9cbiAgcHVibGljIHVuUmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydGllc1ZhbHVlQ2hhbmdlZChcbiAgICBuYW1lczogQXJyYXk8c3RyaW5nPixcbiAgICBrZXk6IHN0cmluZyA9IG51bGxcbiAgKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy51blJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKG5hbWVzW2ldLCBrZXkpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgY3JlYXRlQ3VzdG9tTG9jYWxpemFibGVPYmoobmFtZTogc3RyaW5nKSB7XG4gICAgdmFyIGxvY1N0ciA9IHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcobmFtZSk7XG4gICAgaWYgKGxvY1N0ciB8fCAhKDxhbnk+dGhpcykuZ2V0TG9jYWxlKSByZXR1cm47XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhuYW1lLCA8SUxvY2FsaXphYmxlT3duZXI+KDxhbnk+dGhpcykpO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgb3duZXI6IElMb2NhbGl6YWJsZU93bmVyLFxuICAgIHVzZU1hcmtEb3duOiBib29sZWFuID0gZmFsc2UsXG4gICAgaGFzRGVmYXVsdFZhbHVlOiBib29sZWFuID0gZmFsc2VcbiAgKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHZhciBsb2NTdHIgPSBuZXcgTG9jYWxpemFibGVTdHJpbmcob3duZXIsIHVzZU1hcmtEb3duLCBuYW1lKTtcbiAgICBpZiAoaGFzRGVmYXVsdFZhbHVlKSB7XG4gICAgICBsb2NTdHIubG9jYWxpemF0aW9uTmFtZSA9IG5hbWU7XG4gICAgfVxuICAgIGxvY1N0ci5vblN0ckNoYW5nZWQgPSAob2xkVmFsdWU6IHN0cmluZywgbmV3VmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgdGhpcy5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICAgIH07XG4gICAgaWYgKCF0aGlzLmxvY2FsaXphYmxlU3RyaW5ncykge1xuICAgICAgdGhpcy5sb2NhbGl6YWJsZVN0cmluZ3MgPSB7fTtcbiAgICB9XG4gICAgdGhpcy5sb2NhbGl6YWJsZVN0cmluZ3NbbmFtZV0gPSBsb2NTdHI7XG4gICAgcmV0dXJuIGxvY1N0cjtcbiAgfVxuICBwdWJsaWMgZ2V0TG9jYWxpemFibGVTdHJpbmcobmFtZTogc3RyaW5nKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiAhIXRoaXMubG9jYWxpemFibGVTdHJpbmdzID8gdGhpcy5sb2NhbGl6YWJsZVN0cmluZ3NbbmFtZV0gOiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGRlZmF1bHRTdHI6IHN0cmluZyA9IFwiXCJcbiAgKTogc3RyaW5nIHtcbiAgICB2YXIgbG9jU3RyID0gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhuYW1lKTtcbiAgICBpZiAoIWxvY1N0cikgcmV0dXJuIFwiXCI7XG4gICAgdmFyIHJlcyA9IGxvY1N0ci50ZXh0O1xuICAgIHJldHVybiByZXMgPyByZXMgOiBkZWZhdWx0U3RyO1xuICB9XG4gIHB1YmxpYyBzZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgdmFyIGxvY1N0ciA9IHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcobmFtZSk7XG4gICAgaWYgKCFsb2NTdHIpIHJldHVybjtcbiAgICBsb2NTdHIudGV4dCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyBhZGRVc2VkTG9jYWxlcyhsb2NhbGVzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgaWYgKCEhdGhpcy5sb2NhbGl6YWJsZVN0cmluZ3MpIHtcbiAgICAgIGZvciAobGV0IGtleSBpbiB0aGlzLmxvY2FsaXphYmxlU3RyaW5ncykge1xuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoa2V5KTtcbiAgICAgICAgaWYgKGl0ZW0pIHRoaXMuQWRkTG9jU3RyaW5nVG9Vc2VkTG9jYWxlcyhpdGVtLCBsb2NhbGVzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEhdGhpcy5hcnJheXNJbmZvKSB7XG4gICAgICBmb3IgKGxldCBrZXkgaW4gdGhpcy5hcnJheXNJbmZvKSB7XG4gICAgICAgIGxldCBpdGVtcyA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShrZXkpO1xuICAgICAgICBpZiAoIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGgpIGNvbnRpbnVlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgbGV0IGl0ZW0gPSBpdGVtc1tpXTtcbiAgICAgICAgICBpZiAoaXRlbSAmJiBpdGVtLmFkZFVzZWRMb2NhbGVzKSB7XG4gICAgICAgICAgICBpdGVtLmFkZFVzZWRMb2NhbGVzKGxvY2FsZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgc2VhcmNoVGV4dCh0ZXh0OiBzdHJpbmcsIGZvdW5kZWQ6IEFycmF5PElGaW5kRWxlbWVudD4pIHtcbiAgICB2YXIgc3RyczogQXJyYXk8TG9jYWxpemFibGVTdHJpbmc+ID0gW107XG4gICAgdGhpcy5nZXRTZWFyY2hhYmxlTG9jYWxpemVkU3RyaW5ncyhzdHJzKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChzdHJzW2ldLnNldEZpbmRUZXh0KHRleHQpKSB7XG4gICAgICAgIGZvdW5kZWQucHVzaCh7IGVsZW1lbnQ6IHRoaXMsIHN0cjogc3Ryc1tpXSB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXRTZWFyY2hhYmxlTG9jYWxpemVkU3RyaW5ncyhhcnI6IEFycmF5PExvY2FsaXphYmxlU3RyaW5nPikge1xuICAgIGlmICghIXRoaXMubG9jYWxpemFibGVTdHJpbmdzKSB7XG4gICAgICBsZXQga2V5czogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgICAgdGhpcy5nZXRTZWFyY2hhYmxlTG9jS2V5cyhrZXlzKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoa2V5c1tpXSk7XG4gICAgICAgIGlmIChpdGVtKSBhcnIucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCF0aGlzLmFycmF5c0luZm8pIHJldHVybjtcbiAgICBsZXQga2V5czogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIHRoaXMuZ2V0U2VhcmNoYWJsZUl0ZW1WYWx1ZUtleXMoa2V5cyk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXRlbXMgPSB0aGlzLmdldFByb3BlcnR5VmFsdWUoa2V5c1tpXSk7XG4gICAgICBpZiAoIWl0ZW1zKSBjb250aW51ZTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgaXRlbXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgYXJyLnB1c2goaXRlbXNbal0ubG9jVGV4dCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBnZXRTZWFyY2hhYmxlTG9jS2V5cyhrZXlzOiBBcnJheTxzdHJpbmc+KSB7IH1cbiAgcHJvdGVjdGVkIGdldFNlYXJjaGFibGVJdGVtVmFsdWVLZXlzKGtleXM6IEFycmF5PHN0cmluZz4pIHsgfVxuICBwcm90ZWN0ZWQgQWRkTG9jU3RyaW5nVG9Vc2VkTG9jYWxlcyhcbiAgICBsb2NTdHI6IExvY2FsaXphYmxlU3RyaW5nLFxuICAgIGxvY2FsZXM6IEFycmF5PHN0cmluZz5cbiAgKSB7XG4gICAgdmFyIGxvY3MgPSBsb2NTdHIuZ2V0TG9jYWxlcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9jcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGxvY2FsZXMuaW5kZXhPZihsb2NzW2ldKSA8IDApIHtcbiAgICAgICAgbG9jYWxlcy5wdXNoKGxvY3NbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlSXRlbVZhbHVlcyhuYW1lOiBzdHJpbmcpOiBBcnJheTxhbnk+IHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuY3JlYXRlTmV3QXJyYXkobmFtZSwgZnVuY3Rpb24gKGl0ZW06IGFueSkge1xuICAgICAgaXRlbS5sb2NPd25lciA9IHNlbGY7XG4gICAgICBpdGVtLm93bmVyUHJvcGVydHlOYW1lID0gbmFtZTtcbiAgICB9KTtcbiAgICB0aGlzLmFycmF5c0luZm9bbmFtZV0uaXNJdGVtVmFsdWVzID0gdHJ1ZTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByaXZhdGUgbm90aWZ5QXJyYXlDaGFuZ2VkKGFyOiBhbnksIGFycmF5Q2hhbmdlczogQXJyYXlDaGFuZ2VzKSB7XG4gICAgISFhci5vbkFycmF5Q2hhbmdlZCAmJiBhci5vbkFycmF5Q2hhbmdlZChhcnJheUNoYW5nZXMpO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVOZXdBcnJheUNvcmUobmFtZTogc3RyaW5nKTogQXJyYXk8YW55PiB7XG4gICAgdmFyIHJlcyA9IG51bGw7XG4gICAgaWYgKCEhdGhpcy5jcmVhdGVBcnJheUNvcmVIYW5kbGVyKSB7XG4gICAgICByZXMgPSB0aGlzLmNyZWF0ZUFycmF5Q29yZUhhbmRsZXIodGhpcy5wcm9wZXJ0eUhhc2gsIG5hbWUpO1xuICAgIH1cbiAgICBpZiAoIXJlcykge1xuICAgICAgcmVzID0gbmV3IEFycmF5PGFueT4oKTtcbiAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZUNvcmUodGhpcy5wcm9wZXJ0eUhhc2gsIG5hbWUsIHJlcyk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJvdGVjdGVkIGVuc3VyZUFycmF5KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBvblB1c2g6IGFueSA9IG51bGwsXG4gICAgb25SZW1vdmU6IGFueSA9IG51bGxcbiAgKSB7XG4gICAgaWYgKHRoaXMuYXJyYXlzSW5mbyAmJiB0aGlzLmFycmF5c0luZm9bbmFtZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jcmVhdGVOZXdBcnJheShuYW1lLCBvblB1c2gsIG9uUmVtb3ZlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVOZXdBcnJheShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgb25QdXNoOiBhbnkgPSBudWxsLFxuICAgIG9uUmVtb3ZlOiBhbnkgPSBudWxsXG4gICk6IEFycmF5PGFueT4ge1xuICAgIHZhciBuZXdBcnJheSA9IHRoaXMuY3JlYXRlTmV3QXJyYXlDb3JlKG5hbWUpO1xuICAgIGlmICghdGhpcy5hcnJheXNJbmZvKSB7XG4gICAgICB0aGlzLmFycmF5c0luZm8gPSB7fTtcbiAgICB9XG4gICAgdGhpcy5hcnJheXNJbmZvW25hbWVdID0geyBvblB1c2g6IG9uUHVzaCwgaXNJdGVtVmFsdWVzOiBmYWxzZSB9O1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBuZXdBcnJheS5wdXNoID0gZnVuY3Rpb24gKHZhbHVlKTogbnVtYmVyIHtcbiAgICAgIHZhciByZXN1bHQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3QXJyYXkpLnB1c2guY2FsbChuZXdBcnJheSwgdmFsdWUpO1xuICAgICAgaWYgKCFzZWxmLmlzRGlzcG9zZWRWYWx1ZSkge1xuICAgICAgICBpZiAob25QdXNoKSBvblB1c2godmFsdWUsIG5ld0FycmF5Lmxlbmd0aCAtIDEpO1xuICAgICAgICBjb25zdCBhcnJheUNoYW5nZXMgPSBuZXcgQXJyYXlDaGFuZ2VzKFxuICAgICAgICAgIG5ld0FycmF5Lmxlbmd0aCAtIDEsXG4gICAgICAgICAgMCxcbiAgICAgICAgICBbdmFsdWVdLFxuICAgICAgICAgIFtdXG4gICAgICAgICk7XG4gICAgICAgIHNlbGYucHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZSwgbmV3QXJyYXksIG5ld0FycmF5LCBhcnJheUNoYW5nZXMpO1xuICAgICAgICBzZWxmLm5vdGlmeUFycmF5Q2hhbmdlZChuZXdBcnJheSwgYXJyYXlDaGFuZ2VzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBuZXdBcnJheS51bnNoaWZ0ID0gZnVuY3Rpb24gKHZhbHVlKTogbnVtYmVyIHtcbiAgICAgIHZhciByZXN1bHQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3QXJyYXkpLnVuc2hpZnQuY2FsbChcbiAgICAgICAgbmV3QXJyYXksXG4gICAgICAgIHZhbHVlXG4gICAgICApO1xuICAgICAgaWYgKCFzZWxmLmlzRGlzcG9zZWRWYWx1ZSkge1xuICAgICAgICBpZiAob25QdXNoKSBvblB1c2godmFsdWUsIG5ld0FycmF5Lmxlbmd0aCAtIDEpO1xuICAgICAgICBjb25zdCBhcnJheUNoYW5nZXMgPSBuZXcgQXJyYXlDaGFuZ2VzKDAsIDAsIFt2YWx1ZV0sIFtdKTtcbiAgICAgICAgc2VsZi5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lLCBuZXdBcnJheSwgbmV3QXJyYXksIGFycmF5Q2hhbmdlcyk7XG4gICAgICAgIHNlbGYubm90aWZ5QXJyYXlDaGFuZ2VkKG5ld0FycmF5LCBhcnJheUNoYW5nZXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIG5ld0FycmF5LnBvcCA9IGZ1bmN0aW9uICgpOiBudW1iZXIge1xuICAgICAgdmFyIHJlc3VsdCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihuZXdBcnJheSkucG9wLmNhbGwobmV3QXJyYXkpO1xuICAgICAgaWYgKCFzZWxmLmlzRGlzcG9zZWRWYWx1ZSkge1xuICAgICAgICBpZiAob25SZW1vdmUpIG9uUmVtb3ZlKHJlc3VsdCk7XG4gICAgICAgIGNvbnN0IGFycmF5Q2hhbmdlcyA9IG5ldyBBcnJheUNoYW5nZXMobmV3QXJyYXkubGVuZ3RoIC0gMSwgMSwgW10sIFtdKTtcbiAgICAgICAgc2VsZi5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lLCBuZXdBcnJheSwgbmV3QXJyYXksIGFycmF5Q2hhbmdlcyk7XG4gICAgICAgIHNlbGYubm90aWZ5QXJyYXlDaGFuZ2VkKG5ld0FycmF5LCBhcnJheUNoYW5nZXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIG5ld0FycmF5LnNwbGljZSA9IGZ1bmN0aW9uIChcbiAgICAgIHN0YXJ0PzogbnVtYmVyLFxuICAgICAgZGVsZXRlQ291bnQ/OiBudW1iZXIsXG4gICAgICAuLi5pdGVtczogYW55W11cbiAgICApOiBhbnlbXSB7XG4gICAgICBpZiAoIXN0YXJ0KSBzdGFydCA9IDA7XG4gICAgICBpZiAoIWRlbGV0ZUNvdW50KSBkZWxldGVDb3VudCA9IDA7XG4gICAgICB2YXIgcmVzdWx0ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ld0FycmF5KS5zcGxpY2UuY2FsbChcbiAgICAgICAgbmV3QXJyYXksXG4gICAgICAgIHN0YXJ0LFxuICAgICAgICBkZWxldGVDb3VudCxcbiAgICAgICAgLi4uaXRlbXNcbiAgICAgICk7XG4gICAgICBpZiAoIWl0ZW1zKSBpdGVtcyA9IFtdO1xuICAgICAgaWYgKCFzZWxmLmlzRGlzcG9zZWRWYWx1ZSkge1xuICAgICAgICBpZiAob25SZW1vdmUgJiYgcmVzdWx0KSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG9uUmVtb3ZlKHJlc3VsdFtpXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChvblB1c2gpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBvblB1c2goaXRlbXNbaV0sIHN0YXJ0ICsgaSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFycmF5Q2hhbmdlcyA9IG5ldyBBcnJheUNoYW5nZXMoXG4gICAgICAgICAgc3RhcnQsXG4gICAgICAgICAgZGVsZXRlQ291bnQsXG4gICAgICAgICAgaXRlbXMsXG4gICAgICAgICAgcmVzdWx0XG4gICAgICAgICk7XG4gICAgICAgIHNlbGYucHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZSwgbmV3QXJyYXksIG5ld0FycmF5LCBhcnJheUNoYW5nZXMpO1xuICAgICAgICBzZWxmLm5vdGlmeUFycmF5Q2hhbmdlZChuZXdBcnJheSwgYXJyYXlDaGFuZ2VzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIHJldHVybiBuZXdBcnJheTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0SXRlbVZhbHVlVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcHJvdGVjdGVkIHNldEFycmF5KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBzcmM6IGFueVtdLFxuICAgIGRlc3Q6IGFueVtdLFxuICAgIGlzSXRlbVZhbHVlczogYm9vbGVhbixcbiAgICBvblB1c2g6IGFueVxuICApIHtcbiAgICB2YXIgZGVsZXRlZEl0ZW1zID0gW10uY29uY2F0KHNyYyk7XG4gICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKHNyYykuc3BsaWNlLmNhbGwoc3JjLCAwLCBzcmMubGVuZ3RoKTtcbiAgICBpZiAoISFkZXN0KSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBkZXN0W2ldO1xuICAgICAgICBpZiAoaXNJdGVtVmFsdWVzKSB7XG4gICAgICAgICAgaWYgKCEhQmFzZS5jcmVhdGVJdGVtVmFsdWUpIHtcbiAgICAgICAgICAgIGl0ZW0gPSBCYXNlLmNyZWF0ZUl0ZW1WYWx1ZShpdGVtLCB0aGlzLmdldEl0ZW1WYWx1ZVR5cGUoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZihzcmMpLnB1c2guY2FsbChzcmMsIGl0ZW0pO1xuICAgICAgICBpZiAob25QdXNoKSBvblB1c2goc3JjW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgYXJyYXlDaGFuZ2VzID0gbmV3IEFycmF5Q2hhbmdlcyhcbiAgICAgIDAsXG4gICAgICBkZWxldGVkSXRlbXMubGVuZ3RoLFxuICAgICAgc3JjLFxuICAgICAgZGVsZXRlZEl0ZW1zXG4gICAgKTtcbiAgICB0aGlzLnByb3BlcnR5VmFsdWVDaGFuZ2VkKG5hbWUsIGRlbGV0ZWRJdGVtcywgc3JjLCBhcnJheUNoYW5nZXMpO1xuICAgIHRoaXMubm90aWZ5QXJyYXlDaGFuZ2VkKHNyYywgYXJyYXlDaGFuZ2VzKTtcbiAgfVxuICBwcm90ZWN0ZWQgaXNUd29WYWx1ZUVxdWFscyhcbiAgICB4OiBhbnksXG4gICAgeTogYW55LFxuICAgIGNhc2VJblNlbnNpdGl2ZTogYm9vbGVhbiA9IGZhbHNlLFxuICAgIHRyaW1TdHJpbmc6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gSGVscGVycy5pc1R3b1ZhbHVlRXF1YWxzKHgsIHksIGZhbHNlLCAhY2FzZUluU2Vuc2l0aXZlLCB0cmltU3RyaW5nKTtcbiAgfVxuICBwcml2YXRlIHN0YXRpYyBjb3B5T2JqZWN0KGRzdDogYW55LCBzcmM6IGFueSkge1xuICAgIGZvciAodmFyIGtleSBpbiBzcmMpIHtcbiAgICAgIHZhciBzb3VyY2UgPSBzcmNba2V5XTtcbiAgICAgIGlmICh0eXBlb2Ygc291cmNlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHNvdXJjZSA9IHt9O1xuICAgICAgICB0aGlzLmNvcHlPYmplY3Qoc291cmNlLCBzcmNba2V5XSk7XG4gICAgICB9XG4gICAgICBkc3Rba2V5XSA9IHNvdXJjZTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGNvcHlDc3NDbGFzc2VzKGRlc3Q6IGFueSwgc291cmNlOiBhbnkpIHtcbiAgICBpZiAoIXNvdXJjZSkgcmV0dXJuO1xuICAgIGlmICh0eXBlb2Ygc291cmNlID09PSBcInN0cmluZ1wiIHx8IHNvdXJjZSBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgICAgZGVzdFtcInJvb3RcIl0gPSBzb3VyY2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIEJhc2UuY29weU9iamVjdChkZXN0LCBzb3VyY2UpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldFZhbHVlSW5Mb3dDYXNlKHZhbDogYW55KTogYW55IHtcbiAgICBpZiAoISF2YWwgJiYgdHlwZW9mIHZhbCA9PSBcInN0cmluZ1wiKSByZXR1cm4gdmFsLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXJyYXlDaGFuZ2VzIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGluZGV4OiBudW1iZXIsXG4gICAgcHVibGljIGRlbGV0ZUNvdW50OiBudW1iZXIsXG4gICAgcHVibGljIGl0ZW1zVG9BZGQ6IGFueVtdLFxuICAgIHB1YmxpYyBkZWxldGVkSXRlbXM6IGFueVtdXG4gICkgeyB9XG59XG5cbmV4cG9ydCBjbGFzcyBFdmVudDxUIGV4dGVuZHMgRnVuY3Rpb24sIE9wdGlvbnM+IHtcbiAgcHVibGljIG9uQ2FsbGJhY2tzQ2hhbmdlZDogKCkgPT4gdm9pZDtcbiAgcHJvdGVjdGVkIGNhbGxiYWNrczogQXJyYXk8VD47XG4gIHB1YmxpYyBnZXQgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuY2FsbGJhY2tzIHx8IHRoaXMuY2FsbGJhY2tzLmxlbmd0aCA9PSAwO1xuICB9XG4gIHB1YmxpYyBmaXJlKHNlbmRlcjogYW55LCBvcHRpb25zOiBPcHRpb25zKSB7XG4gICAgaWYgKCF0aGlzLmNhbGxiYWNrcykgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuY2FsbGJhY2tzW2ldKHNlbmRlciwgb3B0aW9ucyk7XG4gICAgICBpZiAoIXRoaXMuY2FsbGJhY2tzKSByZXR1cm47XG4gICAgfVxuICB9XG4gIHB1YmxpYyBjbGVhcigpIHtcbiAgICB0aGlzLmNhbGxiYWNrcyA9IHVuZGVmaW5lZDtcbiAgfVxuICBwdWJsaWMgYWRkKGZ1bmM6IFQpIHtcbiAgICBpZiAodGhpcy5oYXNGdW5jKGZ1bmMpKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmNhbGxiYWNrcykge1xuICAgICAgdGhpcy5jYWxsYmFja3MgPSBuZXcgQXJyYXk8VD4oKTtcbiAgICB9XG4gICAgdGhpcy5jYWxsYmFja3MucHVzaChmdW5jKTtcbiAgICB0aGlzLmZpcmVDYWxsYmFja0NoYW5nZWQoKTtcbiAgfVxuICBwdWJsaWMgcmVtb3ZlKGZ1bmM6IFQpIHtcbiAgICBpZiAodGhpcy5oYXNGdW5jKGZ1bmMpKSB7XG4gICAgICB2YXIgaW5kZXggPSB0aGlzLmNhbGxiYWNrcy5pbmRleE9mKGZ1bmMsIDApO1xuICAgICAgdGhpcy5jYWxsYmFja3Muc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIHRoaXMuZmlyZUNhbGxiYWNrQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgaGFzRnVuYyhmdW5jOiBUKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY2FsbGJhY2tzID09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5jYWxsYmFja3MuaW5kZXhPZihmdW5jLCAwKSA+IC0xO1xuICB9XG4gIHByaXZhdGUgZmlyZUNhbGxiYWNrQ2hhbmdlZCgpIHtcbiAgICBpZiAoISF0aGlzLm9uQ2FsbGJhY2tzQ2hhbmdlZCkge1xuICAgICAgdGhpcy5vbkNhbGxiYWNrc0NoYW5nZWQoKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50QmFzZTxUPiBleHRlbmRzIEV2ZW50PFxuICAoc2VuZGVyOiBULCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgYW55XG4+IHsgfVxuIiwiaW1wb3J0IHsgSGFzaFRhYmxlLCBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IElTdXJ2ZXksIElTdXJ2ZXlEYXRhIH0gZnJvbSBcIi4vYmFzZS1pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBFeHByZXNzaW9uUnVubmVyIH0gZnJvbSBcIi4vY29uZGl0aW9uc1wiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcblxuLyoqXG4gKiBUaGUgY2FsY3VsYXRlZCB2YWx1ZSBpcyBhIHdheSB0byBkZWZpbmUgdGhlIHZhcmlhYmxlIGluIFN1cnZleSBDcmVhdG9yLlxuICogSXQgaGFzIHR3byBtYWluIHByb3BlcnRpZXM6IG5hbWUgYW5kIGV4cHJlc3Npb24uIEJhc2VkIG9uIGV4cHJlc3Npb24gdGhlIHZhbHVlIHJlYWQtb25seSBwcm9wZXJ0eSBpcyBhdXRvbWF0aWNhbGx5IGNhbGN1bGF0ZWQuXG4gKiBUaGUgbmFtZSBwcm9wZXJ0eSBzaG91bGQgYmUgdW5pcXVlIHRob3VnaCBhbGwgY2FsY3VsYXRlZCB2YWx1ZXMuXG4gKiBJdCB1c2VzIHN1cnZleS5nZXRWYXJpYWJsZS9zZXJ1dmV5LnNldFZhcmlhYmxlIGZ1bmN0aW9ucyB0byBnZXQvc2V0IGl0cyB2YWx1ZS4gVGhlIGNsYXNzIGRvIG5vdCBzdG9yZSBpdHMgdmFsdWUgaW50ZXJuYWxseS5cbiAqIFlvdSBtYXkgc2V0IGluY2x1ZGVJbnRvUmVzdWx0IHByb3BlcnR5IHRvIHRydWUgdG8gc3RvcmUgdGhpcyBjYWxjdWxhdGVkIHZhbHVlIGludG8gc3VydmV5IHJlc3VsdC5cbiAqL1xuZXhwb3J0IGNsYXNzIENhbGN1bGF0ZWRWYWx1ZSBleHRlbmRzIEJhc2Uge1xuICBwcml2YXRlIGRhdGE6IElTdXJ2ZXlEYXRhO1xuICBwcml2YXRlIGV4cHJlc3Npb25Jc1J1bm5pbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBleHByZXNzaW9uUnVubmVyOiBFeHByZXNzaW9uUnVubmVyO1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcgPSBudWxsLCBleHByZXNzaW9uOiBzdHJpbmcgPSBudWxsKSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAoISFuYW1lKSB7XG4gICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIH1cbiAgICBpZiAoISFleHByZXNzaW9uKSB7XG4gICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgc2V0T3duZXIoZGF0YTogSVN1cnZleURhdGEpIHtcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIHRoaXMucmVydW5FeHByZXNzaW9uKCk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJjYWxjdWxhdGVkdmFsdWVcIjtcbiAgfVxuICBwdWJsaWMgZ2V0U3VydmV5KGxpdmU6IGJvb2xlYW4gPSBmYWxzZSk6IElTdXJ2ZXkge1xuICAgIHJldHVybiAhIXRoaXMuZGF0YSAmJiAhISg8YW55PnRoaXMuZGF0YSlbXCJnZXRTdXJ2ZXlcIl1cbiAgICAgID8gKDxhbnk+dGhpcy5kYXRhKS5nZXRTdXJ2ZXkoKVxuICAgICAgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXQgb3duZXIoKTogSVN1cnZleURhdGEge1xuICAgIHJldHVybiB0aGlzLmRhdGE7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBjYWxjdWxhdGVkIHZhbHVlIG5hbWUuIEl0IHNob3VsZCBiZSBub24gZW1wdHkgYW5kIHVuaXF1ZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJuYW1lXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbmFtZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm5hbWVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSB0byBpbmNsdWRlIHRoZSBub24tZW1wdHkgY2FsY3VsYXRlZCB2YWx1ZSBpbnRvIHN1cnZleSByZXN1bHQsIHN1cnZleS5kYXRhIHByb3BlcnR5LlxuICAgKi9cbiAgcHVibGljIGdldCBpbmNsdWRlSW50b1Jlc3VsdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaW5jbHVkZUludG9SZXN1bHRcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgaW5jbHVkZUludG9SZXN1bHQodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaW5jbHVkZUludG9SZXN1bHRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIEV4cHJlc3Npb24gdGhhdCB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgdmFsdWUuIFlvdSBtYXkgdXNlIHN0YW5kYXJkIG9wZXJhdG9ycyBsaWtlICssIC0sICogYW5kIC8sIHNxdWFyZXMgKCkuIEhlcmUgaXMgdGhlIGV4YW1wbGUgb2YgYWNjZXNzaW5nIHRoZSBxdWVzdGlvbiB2YWx1ZSB7cXVlc3Rpb25uYW1lfS5cbiAgICogPGJyLz5FeGFtcGxlOiBcIih7cXVhbnRpdHl9ICoge3ByaWNlfSkgKiAoMTAwIC0ge2Rpc2NvdW50fSkgLyAxMDBcIlxuICAgKi9cbiAgcHVibGljIGdldCBleHByZXNzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImV4cHJlc3Npb25cIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBleHByZXNzaW9uKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZXhwcmVzc2lvblwiLCB2YWwpO1xuICAgIHRoaXMucmVydW5FeHByZXNzaW9uKCk7XG4gIH1cbiAgcHVibGljIGxvY0NhbGN1bGF0aW9uKCkge1xuICAgIHRoaXMuZXhwcmVzc2lvbklzUnVubmluZyA9IHRydWU7XG4gIH1cbiAgcHVibGljIHVubG9jQ2FsY3VsYXRpb24oKSB7XG4gICAgdGhpcy5leHByZXNzaW9uSXNSdW5uaW5nID0gZmFsc2U7XG4gIH1cbiAgcHJpdmF0ZSBpc0NhbGN1bGF0ZWQgPSBmYWxzZTtcbiAgcHVibGljIHJlc2V0Q2FsY3VsYXRpb24oKSB7XG4gICAgdGhpcy5pc0NhbGN1bGF0ZWQgPSBmYWxzZTtcbiAgfVxuICBwdWJsaWMgZG9DYWxjdWxhdGlvbihcbiAgICBjYWxjdWxhdGVkVmFsdWVzOiBBcnJheTxDYWxjdWxhdGVkVmFsdWU+LFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT5cbiAgKSB7XG4gICAgaWYgKHRoaXMuaXNDYWxjdWxhdGVkKSByZXR1cm47XG4gICAgdGhpcy5ydW5FeHByZXNzaW9uQ29yZShjYWxjdWxhdGVkVmFsdWVzLCB2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIHRoaXMuaXNDYWxjdWxhdGVkID0gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgcnVuRXhwcmVzc2lvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIHRoaXMucnVuRXhwcmVzc2lvbkNvcmUobnVsbCwgdmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHZhbHVlKCk6IGFueSB7XG4gICAgaWYgKCF0aGlzLmRhdGEpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5nZXRWYXJpYWJsZSh0aGlzLm5hbWUpO1xuICB9XG4gIHByb3RlY3RlZCBzZXRWYWx1ZSh2YWw6IGFueSkge1xuICAgIGlmICghdGhpcy5kYXRhKSByZXR1cm47XG4gICAgdGhpcy5kYXRhLnNldFZhcmlhYmxlKHRoaXMubmFtZSwgdmFsKTtcbiAgfVxuICBwcml2YXRlIGdldCBjYW5SdW5FeHByZXNzaW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAhIXRoaXMuZGF0YSAmJlxuICAgICAgIXRoaXMuaXNMb2FkaW5nRnJvbUpzb24gJiZcbiAgICAgICEhdGhpcy5leHByZXNzaW9uICYmXG4gICAgICAhdGhpcy5leHByZXNzaW9uSXNSdW5uaW5nICYmXG4gICAgICAhIXRoaXMubmFtZVxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSByZXJ1bkV4cHJlc3Npb24oKSB7XG4gICAgaWYgKCF0aGlzLmNhblJ1bkV4cHJlc3Npb24pIHJldHVybjtcbiAgICB0aGlzLnJ1bkV4cHJlc3Npb24oXG4gICAgICB0aGlzLmRhdGEuZ2V0RmlsdGVyZWRWYWx1ZXMoKSxcbiAgICAgIHRoaXMuZGF0YS5nZXRGaWx0ZXJlZFByb3BlcnRpZXMoKVxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBydW5FeHByZXNzaW9uQ29yZShcbiAgICBjYWxjdWxhdGVkVmFsdWVzOiBBcnJheTxDYWxjdWxhdGVkVmFsdWU+LFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT5cbiAgKSB7XG4gICAgaWYgKCF0aGlzLmNhblJ1bkV4cHJlc3Npb24pIHJldHVybjtcbiAgICB0aGlzLmVuc3VyZUV4cHJlc3Npb24odmFsdWVzKTtcbiAgICB0aGlzLmxvY0NhbGN1bGF0aW9uKCk7XG4gICAgaWYgKCEhY2FsY3VsYXRlZFZhbHVlcykge1xuICAgICAgdGhpcy5ydW5EZXBlbmRlbnRFeHByZXNzaW9ucyhjYWxjdWxhdGVkVmFsdWVzLCB2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIH1cbiAgICB0aGlzLmV4cHJlc3Npb25SdW5uZXIucnVuKHZhbHVlcywgcHJvcGVydGllcyk7XG4gIH1cbiAgcHJpdmF0ZSBydW5EZXBlbmRlbnRFeHByZXNzaW9ucyhcbiAgICBjYWxjdWxhdGVkVmFsdWVzOiBBcnJheTxDYWxjdWxhdGVkVmFsdWU+LFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT5cbiAgKSB7XG4gICAgdmFyIHZhcmlhYmxlcyA9IHRoaXMuZXhwcmVzc2lvblJ1bm5lci5nZXRWYXJpYWJsZXMoKTtcbiAgICBpZiAoIXZhcmlhYmxlcykgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2FsY3VsYXRlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNhbGNJdGVtID0gY2FsY3VsYXRlZFZhbHVlc1tpXTtcbiAgICAgIGlmIChjYWxjSXRlbSA9PT0gdGhpcyB8fCB2YXJpYWJsZXMuaW5kZXhPZihjYWxjSXRlbS5uYW1lKSA8IDApIGNvbnRpbnVlO1xuICAgICAgY2FsY0l0ZW0uZG9DYWxjdWxhdGlvbihjYWxjdWxhdGVkVmFsdWVzLCB2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgICAgdmFsdWVzW2NhbGNJdGVtLm5hbWVdID0gY2FsY0l0ZW0udmFsdWU7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZW5zdXJlRXhwcmVzc2lvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgaWYgKCEhdGhpcy5leHByZXNzaW9uUnVubmVyKSByZXR1cm47XG4gICAgdGhpcy5leHByZXNzaW9uUnVubmVyID0gbmV3IEV4cHJlc3Npb25SdW5uZXIodGhpcy5leHByZXNzaW9uKTtcbiAgICB0aGlzLmV4cHJlc3Npb25SdW5uZXIub25SdW5Db21wbGV0ZSA9IG5ld1ZhbHVlID0+IHtcbiAgICAgIGlmICghSGVscGVycy5pc1R3b1ZhbHVlRXF1YWxzKG5ld1ZhbHVlLCB0aGlzLnZhbHVlKSkge1xuICAgICAgICB0aGlzLnNldFZhbHVlKG5ld1ZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudW5sb2NDYWxjdWxhdGlvbigpO1xuICAgIH07XG4gIH1cbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJjYWxjdWxhdGVkdmFsdWVcIixcbiAgW1xuICAgIHsgbmFtZTogXCIhbmFtZVwiLCBpc1VuaXF1ZTogdHJ1ZSB9LFxuICAgIFwiZXhwcmVzc2lvbjpleHByZXNzaW9uXCIsXG4gICAgXCJpbmNsdWRlSW50b1Jlc3VsdDpib29sZWFuXCIsXG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgQ2FsY3VsYXRlZFZhbHVlKCk7XG4gIH0sXG4gIFwiYmFzZVwiXG4pO1xuIiwiaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IElUZXh0UHJvY2Vzc29yLCBJUXVlc3Rpb24sIElTdXJ2ZXkgfSBmcm9tIFwiLi9iYXNlLWludGVyZmFjZXNcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciwgSnNvbk9iamVjdFByb3BlcnR5IH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgV2ViUmVxdWVzdEVycm9yLCBXZWJSZXF1ZXN0RW1wdHlFcnJvciB9IGZyb20gXCIuL2Vycm9yXCI7XG5pbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzXCI7XG5pbXBvcnQgeyBTdXJ2ZXlFcnJvciB9IGZyb20gXCIuL3N1cnZleS1lcnJvclwiO1xuXG5jbGFzcyBYbWxQYXJzZXIge1xuICBwcml2YXRlIHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgcHVibGljIGFzc2lnblZhbHVlKHRhcmdldDogYW55LCBuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXRbbmFtZV0pKSB7XG4gICAgICB0YXJnZXRbbmFtZV0ucHVzaCh2YWx1ZSk7XG4gICAgfSBlbHNlIGlmICh0YXJnZXRbbmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGFyZ2V0W25hbWVdID0gW3RhcmdldFtuYW1lXV0uY29uY2F0KHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAxICYmXG4gICAgICBPYmplY3Qua2V5cyh2YWx1ZSlbMF0gPT09IG5hbWVcbiAgICApIHtcbiAgICAgIHRhcmdldFtuYW1lXSA9IHZhbHVlW25hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXRbbmFtZV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHhtbDJKc29uKHhtbE5vZGU6IGFueSwgcmVzdWx0OiBhbnkpIHtcbiAgICBpZiAoeG1sTm9kZS5jaGlsZHJlbiAmJiB4bWxOb2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeG1sTm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgY2hpbGROb2RlID0geG1sTm9kZS5jaGlsZHJlbltpXTtcbiAgICAgICAgbGV0IGNoaWxkT2JqZWN0ID0ge307XG4gICAgICAgIHRoaXMueG1sMkpzb24oY2hpbGROb2RlLCBjaGlsZE9iamVjdCk7XG4gICAgICAgIHRoaXMuYXNzaWduVmFsdWUocmVzdWx0LCBjaGlsZE5vZGUubm9kZU5hbWUsIGNoaWxkT2JqZWN0KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hc3NpZ25WYWx1ZShyZXN1bHQsIHhtbE5vZGUubm9kZU5hbWUsIHhtbE5vZGUudGV4dENvbnRlbnQpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgcGFyc2VYbWxTdHJpbmcoeG1sU3RyaW5nOiBzdHJpbmcpIHtcbiAgICBsZXQgeG1sUm9vdCA9IHRoaXMucGFyc2VyLnBhcnNlRnJvbVN0cmluZyh4bWxTdHJpbmcsIFwidGV4dC94bWxcIik7XG4gICAgbGV0IGpzb24gPSB7fTtcbiAgICB0aGlzLnhtbDJKc29uKHhtbFJvb3QsIGpzb24pO1xuICAgIHJldHVybiBqc29uO1xuICB9XG59XG5cbi8qKlxuICogQSBkZWZpbml0aW9uIGZvciBmaWxsaW5nIGNob2ljZXMgZm9yIGNoZWNrYm94LCBkcm9wZG93biBhbmQgcmFkaW9ncm91cCBxdWVzdGlvbnMgZnJvbSByZXNmdWxsIHNlcnZpY2VzLlxuICogVGhlIHJ1biBtZXRob2QgY2FsbCBhIHJlc3RmdWwgc2VydmljZSBhbmQgcmVzdWx0cyBjYW4gYmUgZ2V0IG9uIGdldFJlc3VsdENhbGxiYWNrLlxuICovXG5leHBvcnQgY2xhc3MgQ2hvaWNlc1Jlc3RmdWwgZXh0ZW5kcyBCYXNlIHtcbiAgcHJpdmF0ZSBzdGF0aWMgY2FjaGVUZXh0ID0gXCJ7Q0FDSEV9XCI7XG4gIHByaXZhdGUgc3RhdGljIG5vQ2FjaGVUZXh0ID0gXCJ7Tk9DQUNIRX1cIjtcbiAgcHVibGljIHN0YXRpYyBnZXQgRW5jb2RlUGFyYW1ldGVycygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc2V0dGluZ3Mud2Vic2VydmljZUVuY29kZVBhcmFtZXRlcnM7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBzZXQgRW5jb2RlUGFyYW1ldGVycyh2YWw6IGJvb2xlYW4pIHtcbiAgICBzZXR0aW5ncy53ZWJzZXJ2aWNlRW5jb2RlUGFyYW1ldGVycyA9IHZhbDtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGNsZWFyQ2FjaGUoKSB7XG4gICAgQ2hvaWNlc1Jlc3RmdWwuaXRlbXNSZXN1bHQgPSB7fTtcbiAgICBDaG9pY2VzUmVzdGZ1bC5zZW5kaW5nU2FtZVJlcXVlc3RzID0ge307XG4gIH1cbiAgcHJpdmF0ZSBzdGF0aWMgaXRlbXNSZXN1bHQ6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICBwcml2YXRlIHN0YXRpYyBzZW5kaW5nU2FtZVJlcXVlc3RzOiB7XG4gICAgW2luZGV4OiBzdHJpbmddOiBBcnJheTxDaG9pY2VzUmVzdGZ1bD4sXG4gIH0gPSB7fTtcbiAgcHJpdmF0ZSBzdGF0aWMgYWRkU2FtZVJlcXVlc3Qob2JqOiBDaG9pY2VzUmVzdGZ1bCk6IGJvb2xlYW4ge1xuICAgIGlmICghb2JqLmlzVXNpbmdDYWNoZSkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBoYXNoID0gb2JqLm9iakhhc2g7XG4gICAgdmFyIHJlcyA9IENob2ljZXNSZXN0ZnVsLnNlbmRpbmdTYW1lUmVxdWVzdHNbaGFzaF07XG4gICAgaWYgKCFyZXMpIHtcbiAgICAgIENob2ljZXNSZXN0ZnVsLnNlbmRpbmdTYW1lUmVxdWVzdHNbb2JqLm9iakhhc2hdID0gW107XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJlcy5wdXNoKG9iaik7XG4gICAgb2JqLmlzUnVubmluZ1ZhbHVlID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcml2YXRlIHN0YXRpYyB1bnJlZ2lzdGVyU2FtZVJlcXVlc3RzKG9iajogQ2hvaWNlc1Jlc3RmdWwsIGl0ZW1zOiBhbnkpIHtcbiAgICBpZiAoIW9iai5pc1VzaW5nQ2FjaGUpIHJldHVybjtcbiAgICB2YXIgcmVzID0gQ2hvaWNlc1Jlc3RmdWwuc2VuZGluZ1NhbWVSZXF1ZXN0c1tvYmoub2JqSGFzaF07XG4gICAgZGVsZXRlIENob2ljZXNSZXN0ZnVsLnNlbmRpbmdTYW1lUmVxdWVzdHNbb2JqLm9iakhhc2hdO1xuICAgIGlmICghcmVzKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc1tpXS5pc1J1bm5pbmdWYWx1ZSA9IGZhbHNlO1xuICAgICAgaWYgKCEhcmVzW2ldLmdldFJlc3VsdENhbGxiYWNrKSB7XG4gICAgICAgIHJlc1tpXS5nZXRSZXN1bHRDYWxsYmFjayhpdGVtcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBzdGF0aWMgb25CZWZvcmVTZW5kUmVxdWVzdDogKFxuICAgIHNlbmRlcjogQ2hvaWNlc1Jlc3RmdWwsXG4gICAgb3B0aW9uczogeyByZXF1ZXN0OiBYTUxIdHRwUmVxdWVzdCB9XG4gICkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0Q2FjaGVkSXRlbXNSZXN1bHQob2JqOiBDaG9pY2VzUmVzdGZ1bCk6IGJvb2xlYW4ge1xuICAgIHZhciBoYXNoID0gb2JqLm9iakhhc2g7XG4gICAgdmFyIHJlcyA9IENob2ljZXNSZXN0ZnVsLml0ZW1zUmVzdWx0W2hhc2hdO1xuICAgIGlmICghcmVzKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKG9iai5nZXRSZXN1bHRDYWxsYmFjaykge1xuICAgICAgb2JqLmdldFJlc3VsdENhbGxiYWNrKHJlcyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByaXZhdGUgbGFzdE9iakhhc2g6IHN0cmluZyA9IFwiXCI7XG4gIHByaXZhdGUgaXNSdW5uaW5nVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHByb2Nlc3NlZFVybDogc3RyaW5nID0gXCJcIjtcbiAgcHJvdGVjdGVkIHByb2Nlc3NlZFBhdGg6IHN0cmluZyA9IFwiXCI7XG4gIHByaXZhdGUgaXNVc2luZ0NhY2hlRnJvbVVybDogYm9vbGVhbiA9IHVuZGVmaW5lZDtcbiAgcHVibGljIG9uUHJvY2Vzc2VkVXJsQ2FsbGJhY2s6ICh1cmw6IHN0cmluZywgcGF0aDogc3RyaW5nKSA9PiB2b2lkO1xuICBwdWJsaWMgZ2V0UmVzdWx0Q2FsbGJhY2s6IChpdGVtczogQXJyYXk8SXRlbVZhbHVlPikgPT4gdm9pZDtcbiAgcHVibGljIGJlZm9yZVNlbmRSZXF1ZXN0Q2FsbGJhY2s6ICgpID0+IHZvaWQ7XG4gIHB1YmxpYyB1cGRhdGVSZXN1bHRDYWxsYmFjazogKFxuICAgIGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LFxuICAgIHNlcnZlclJlc3VsdDogYW55XG4gICkgPT4gQXJyYXk8SXRlbVZhbHVlPjtcbiAgcHVibGljIGdldEl0ZW1WYWx1ZUNhbGxiYWNrOiAoaXRlbTogYW55KSA9PiBhbnk7XG4gIHB1YmxpYyBlcnJvcjogU3VydmV5RXJyb3IgPSBudWxsO1xuICBwdWJsaWMgb3duZXI6IElRdWVzdGlvbjtcbiAgcHVibGljIGNyZWF0ZUl0ZW1WYWx1ZSA9ICh2YWx1ZTogYW55KTogSXRlbVZhbHVlID0+IHtcbiAgICByZXR1cm4gbmV3IEl0ZW1WYWx1ZSh2YWx1ZSk7XG4gIH07XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHVibGljIGdldFN1cnZleShsaXZlOiBib29sZWFuID0gZmFsc2UpOiBJU3VydmV5IHtcbiAgICByZXR1cm4gISF0aGlzLm93bmVyID8gdGhpcy5vd25lci5zdXJ2ZXkgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBydW4odGV4dFByb2Nlc3NvcjogSVRleHRQcm9jZXNzb3IgPSBudWxsKSB7XG4gICAgaWYgKCF0aGlzLnVybCB8fCAhdGhpcy5nZXRSZXN1bHRDYWxsYmFjaykgcmV0dXJuO1xuICAgIHRoaXMucHJvY2Vzc2VkVGV4dCh0ZXh0UHJvY2Vzc29yKTtcbiAgICBpZiAoIXRoaXMucHJvY2Vzc2VkVXJsKSB7XG4gICAgICB0aGlzLmRvRW1wdHlSZXN1bHRDYWxsYmFjayh7fSk7XG4gICAgICB0aGlzLmxhc3RPYmpIYXNoID0gdGhpcy5vYmpIYXNoO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5sYXN0T2JqSGFzaCA9PT0gdGhpcy5vYmpIYXNoKSByZXR1cm47XG4gICAgdGhpcy5sYXN0T2JqSGFzaCA9IHRoaXMub2JqSGFzaDtcbiAgICB0aGlzLmVycm9yID0gbnVsbDtcbiAgICBpZiAodGhpcy51c2VDaGFuZ2VkSXRlbXNSZXN1bHRzKCkpIHJldHVybjtcbiAgICBpZiAoQ2hvaWNlc1Jlc3RmdWwuYWRkU2FtZVJlcXVlc3QodGhpcykpIHJldHVybjtcbiAgICB0aGlzLnNlbmRSZXF1ZXN0KCk7XG4gIH1cbiAgcHVibGljIGdldCBpc1VzaW5nQ2FjaGUoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNVc2luZ0NhY2hlRnJvbVVybCA9PT0gdHJ1ZSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKHRoaXMuaXNVc2luZ0NhY2hlRnJvbVVybCA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gc2V0dGluZ3MudXNlQ2FjaGluZ0ZvckNob2ljZXNSZXN0ZnVsO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNSdW5uaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldElzUnVubmluZygpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRJc1J1bm5pbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNSdW5uaW5nVmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzV2FpdGluZ0ZvclBhcmFtZXRlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudXJsICYmICF0aGlzLnByb2Nlc3NlZFVybDtcbiAgfVxuICBwcm90ZWN0ZWQgdXNlQ2hhbmdlZEl0ZW1zUmVzdWx0cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gQ2hvaWNlc1Jlc3RmdWwuZ2V0Q2FjaGVkSXRlbXNSZXN1bHQodGhpcyk7XG4gIH1cbiAgcHJpdmF0ZSBkb0VtcHR5UmVzdWx0Q2FsbGJhY2soc2VydmVyUmVzdWx0OiBhbnkpIHtcbiAgICB2YXIgaXRlbXM6IEFycmF5PGFueT4gPSBbXTtcbiAgICBpZiAodGhpcy51cGRhdGVSZXN1bHRDYWxsYmFjaykge1xuICAgICAgaXRlbXMgPSB0aGlzLnVwZGF0ZVJlc3VsdENhbGxiYWNrKGl0ZW1zLCBzZXJ2ZXJSZXN1bHQpO1xuICAgIH1cbiAgICB0aGlzLmdldFJlc3VsdENhbGxiYWNrKGl0ZW1zKTtcbiAgfVxuICBwcml2YXRlIHByb2Nlc3NlZFRleHQodGV4dFByb2Nlc3NvcjogSVRleHRQcm9jZXNzb3IpIHtcbiAgICB2YXIgdXJsVGV4dCA9IHRoaXMudXJsO1xuICAgIGlmICghIXVybFRleHQpIHtcbiAgICAgIHVybFRleHQgPSB1cmxUZXh0XG4gICAgICAgIC5yZXBsYWNlKENob2ljZXNSZXN0ZnVsLmNhY2hlVGV4dCwgXCJcIilcbiAgICAgICAgLnJlcGxhY2UoQ2hvaWNlc1Jlc3RmdWwubm9DYWNoZVRleHQsIFwiXCIpO1xuICAgIH1cbiAgICBpZiAodGV4dFByb2Nlc3Nvcikge1xuICAgICAgdmFyIHBVcmwgPSB0ZXh0UHJvY2Vzc29yLnByb2Nlc3NUZXh0RXgoXG4gICAgICAgIHVybFRleHQsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBzZXR0aW5ncy53ZWJzZXJ2aWNlRW5jb2RlUGFyYW1ldGVyc1xuICAgICAgKTtcbiAgICAgIHZhciBwUGF0aCA9IHRleHRQcm9jZXNzb3IucHJvY2Vzc1RleHRFeChcbiAgICAgICAgdGhpcy5wYXRoLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgc2V0dGluZ3Mud2Vic2VydmljZUVuY29kZVBhcmFtZXRlcnNcbiAgICAgICk7XG4gICAgICBpZiAoIXBVcmwuaGFzQWxsVmFsdWVzT25MYXN0UnVuIHx8ICFwUGF0aC5oYXNBbGxWYWx1ZXNPbkxhc3RSdW4pIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzZWRVcmwgPSBcIlwiO1xuICAgICAgICB0aGlzLnByb2Nlc3NlZFBhdGggPSBcIlwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzZWRVcmwgPSBwVXJsLnRleHQ7XG4gICAgICAgIHRoaXMucHJvY2Vzc2VkUGF0aCA9IHBQYXRoLnRleHQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJvY2Vzc2VkVXJsID0gdXJsVGV4dDtcbiAgICAgIHRoaXMucHJvY2Vzc2VkUGF0aCA9IHRoaXMucGF0aDtcbiAgICB9XG4gICAgaWYgKHRoaXMub25Qcm9jZXNzZWRVcmxDYWxsYmFjaykge1xuICAgICAgdGhpcy5vblByb2Nlc3NlZFVybENhbGxiYWNrKHRoaXMucHJvY2Vzc2VkVXJsLCB0aGlzLnByb2Nlc3NlZFBhdGgpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgcGFyc2VSZXNwb25zZShyZXNwb25zZTogYW55KSB7XG4gICAgbGV0IHBhcnNlZFJlc3BvbnNlO1xuICAgIGlmIChcbiAgICAgICEhcmVzcG9uc2UgJiZcbiAgICAgIHR5cGVvZiByZXNwb25zZS5pbmRleE9mID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgIHJlc3BvbnNlLmluZGV4T2YoXCI8XCIpID09PSAwXG4gICAgKSB7XG4gICAgICB2YXIgcGFyc2VyID0gbmV3IFhtbFBhcnNlcigpO1xuICAgICAgcGFyc2VkUmVzcG9uc2UgPSBwYXJzZXIucGFyc2VYbWxTdHJpbmcocmVzcG9uc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICBwYXJzZWRSZXNwb25zZSA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHBhcnNlZFJlc3BvbnNlID0gKHJlc3BvbnNlIHx8IFwiXCIpXG4gICAgICAgICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgICAgICAgLm1hcCgoczogYW55KSA9PiBzLnRyaW0oXCIgXCIpKVxuICAgICAgICAgIC5maWx0ZXIoKHM6IGFueSkgPT4gISFzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlZFJlc3BvbnNlO1xuICB9XG4gIHByb3RlY3RlZCBzZW5kUmVxdWVzdCgpIHtcbiAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgeGhyLm9wZW4oXCJHRVRcIiwgdGhpcy5wcm9jZXNzZWRVcmwpO1xuICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgbG9hZGluZ09iakhhc2ggPSB0aGlzLm9iakhhc2g7XG4gICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5iZWZvcmVMb2FkUmVxdWVzdCgpO1xuICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICBzZWxmLm9uTG9hZChzZWxmLnBhcnNlUmVzcG9uc2UoeGhyLnJlc3BvbnNlKSwgbG9hZGluZ09iakhhc2gpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZi5vbkVycm9yKHhoci5zdGF0dXNUZXh0LCB4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciBvcHRpb25zID0geyByZXF1ZXN0OiB4aHIgfTtcbiAgICBpZiAoISFDaG9pY2VzUmVzdGZ1bC5vbkJlZm9yZVNlbmRSZXF1ZXN0KSB7XG4gICAgICBDaG9pY2VzUmVzdGZ1bC5vbkJlZm9yZVNlbmRSZXF1ZXN0KHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cbiAgICB0aGlzLmJlZm9yZVNlbmRSZXF1ZXN0KCk7XG4gICAgb3B0aW9ucy5yZXF1ZXN0LnNlbmQoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImNob2ljZXNCeVVybFwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgIXRoaXMudXJsICYmXG4gICAgICAhdGhpcy5wYXRoICYmXG4gICAgICAhdGhpcy52YWx1ZU5hbWUgJiZcbiAgICAgICF0aGlzLnRpdGxlTmFtZSAmJlxuICAgICAgIXRoaXMuaW1hZ2VMaW5rTmFtZVxuICAgICk7XG4gIH1cbiAgcHVibGljIGdldEN1c3RvbVByb3BlcnRpZXNOYW1lcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0Q3VzdG9tUHJvcGVydGllcygpO1xuICAgIHZhciByZXMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzLnB1c2godGhpcy5nZXRDdXN0b21Qcm9wZXJ0eU5hbWUocHJvcGVydGllc1tpXS5uYW1lKSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBnZXRDdXN0b21Qcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBwcm9wZXJ0eU5hbWUgKyBcIk5hbWVcIjtcbiAgfVxuICBwcml2YXRlIGdldEN1c3RvbVByb3BlcnRpZXMoKTogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PiB7XG4gICAgdmFyIHByb3BlcnRpZXMgPSBTZXJpYWxpemVyLmdldFByb3BlcnRpZXModGhpcy5pdGVtVmFsdWVUeXBlKTtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHByb3BlcnRpZXNbaV0ubmFtZSA9PT0gXCJ2YWx1ZVwiIHx8XG4gICAgICAgIHByb3BlcnRpZXNbaV0ubmFtZSA9PT0gXCJ0ZXh0XCIgfHxcbiAgICAgICAgcHJvcGVydGllc1tpXS5uYW1lID09PSBcInZpc2libGVJZlwiIHx8XG4gICAgICAgIHByb3BlcnRpZXNbaV0ubmFtZSA9PT0gXCJlbmFibGVJZlwiXG4gICAgICApXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgcmVzLnB1c2gocHJvcGVydGllc1tpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIHNldERhdGEoanNvbjogYW55KSB7XG4gICAgdGhpcy5jbGVhcigpO1xuICAgIGlmIChqc29uLnVybCkgdGhpcy51cmwgPSBqc29uLnVybDtcbiAgICBpZiAoanNvbi5wYXRoKSB0aGlzLnBhdGggPSBqc29uLnBhdGg7XG4gICAgaWYgKGpzb24udmFsdWVOYW1lKSB0aGlzLnZhbHVlTmFtZSA9IGpzb24udmFsdWVOYW1lO1xuICAgIGlmIChqc29uLnRpdGxlTmFtZSkgdGhpcy50aXRsZU5hbWUgPSBqc29uLnRpdGxlTmFtZTtcbiAgICBpZiAoanNvbi5pbWFnZUxpbmtOYW1lKSB0aGlzLmltYWdlTGlua05hbWUgPSBqc29uLmltYWdlTGlua05hbWU7XG4gICAgaWYgKGpzb24uYWxsb3dFbXB0eVJlc3BvbnNlICE9PSB1bmRlZmluZWQpXG4gICAgICB0aGlzLmFsbG93RW1wdHlSZXNwb25zZSA9IGpzb24uYWxsb3dFbXB0eVJlc3BvbnNlO1xuICAgIGlmIChqc29uLmF0dGFjaE9yaWdpbmFsSXRlbXMgIT09IHVuZGVmaW5lZClcbiAgICAgIHRoaXMuYXR0YWNoT3JpZ2luYWxJdGVtcyA9IGpzb24uYXR0YWNoT3JpZ2luYWxJdGVtcztcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0Q3VzdG9tUHJvcGVydGllc05hbWVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoanNvbltwcm9wZXJ0aWVzW2ldXSkgKDxhbnk+dGhpcylbcHJvcGVydGllc1tpXV0gPSBqc29uW3Byb3BlcnRpZXNbaV1dO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0RGF0YSgpOiBhbnkge1xuICAgIGlmICh0aGlzLmlzRW1wdHkpIHJldHVybiBudWxsO1xuICAgIHZhciByZXM6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLnVybCkgcmVzW1widXJsXCJdID0gdGhpcy51cmw7XG4gICAgaWYgKHRoaXMucGF0aCkgcmVzW1wicGF0aFwiXSA9IHRoaXMucGF0aDtcbiAgICBpZiAodGhpcy52YWx1ZU5hbWUpIHJlc1tcInZhbHVlTmFtZVwiXSA9IHRoaXMudmFsdWVOYW1lO1xuICAgIGlmICh0aGlzLnRpdGxlTmFtZSkgcmVzW1widGl0bGVOYW1lXCJdID0gdGhpcy50aXRsZU5hbWU7XG4gICAgaWYgKHRoaXMuaW1hZ2VMaW5rTmFtZSkgcmVzW1wiaW1hZ2VMaW5rTmFtZVwiXSA9IHRoaXMuaW1hZ2VMaW5rTmFtZTtcbiAgICBpZiAodGhpcy5hbGxvd0VtcHR5UmVzcG9uc2UpXG4gICAgICByZXNbXCJhbGxvd0VtcHR5UmVzcG9uc2VcIl0gPSB0aGlzLmFsbG93RW1wdHlSZXNwb25zZTtcbiAgICBpZiAodGhpcy5hdHRhY2hPcmlnaW5hbEl0ZW1zKVxuICAgICAgcmVzW1wiYXR0YWNoT3JpZ2luYWxJdGVtc1wiXSA9IHRoaXMuYXR0YWNoT3JpZ2luYWxJdGVtcztcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0Q3VzdG9tUHJvcGVydGllc05hbWVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoKDxhbnk+dGhpcylbcHJvcGVydGllc1tpXV0pXG4gICAgICAgIHJlc1twcm9wZXJ0aWVzW2ldXSA9ICg8YW55PnRoaXMpW3Byb3BlcnRpZXNbaV1dO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgYSBsaW5rIHRvIGEgd2ViIHNlcnZpY2UuIFlvdSBjYW4gdXNlIHRleHQgcHJlcHJvY2Vzc2luZyBoZXJlLlxuICAgKiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyB1cmw6IF9odHRwczovL3N1cnZleWpzLmlvL2FwaS9Db3VudHJpZXNFeGFtcGxlP3JlZ2lvbj17cmVnaW9ufV8gaXMgY2hhbmdlZCBiYXNlZCBvbiB0aGUgX3JlZ2lvbl8gcXVlc3Rpb24ncyB2YWx1ZS5cbiAgICogU3VydmV5SlMgYXV0b21hdGljYWxseSBnZXRzIGRhdGEgZnJvbSB0aGUgd2ViIHNlcnZpY2Ugd2hlbiB0aGUgdmFsdWUgb2YgdGhlIF9yZWdpb25fIHF1ZXN0aW9uIGNoYW5nZXMuXG4gICAqIEBzZWUgcGF0aFxuICAgKiBAc2VlIHZhbHVlTmFtZVxuICAgKiBAc2VlIHRpdGxlTmFtZVxuICAgKiBAc2VlIFtFeGFtcGxlOiBSRVNUZnVsIERyb3Bkb3duXShodHRwczovL3N1cnZleWpzLmlvL0V4YW1wbGVzL0xpYnJhcnkvP2lkPXF1ZXN0aW9udHlwZS1kcm9wZG93bnJlc3RmdWxsKVxuICAgKiBAc2VlIFtEb2NzOiBGaWxsIENob2ljZXMgZnJvbSBhIFJFU1RmdWwgU2VydmljZV0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9Eb2N1bWVudGF0aW9uL0xpYnJhcnkvP2lkPUxpYnJhcnlPdmVydmlldyNmaWxsLXRoZS1jaG9pY2VzLWZyb20tYS1yZXN0ZnVsLXNlcnZpY2UpXG4gICAqL1xuICBwdWJsaWMgZ2V0IHVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ1cmxcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCB1cmwodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ1cmxcIiwgdmFsKTtcbiAgICB0aGlzLmlzVXNpbmdDYWNoZUZyb21VcmwgPSB1bmRlZmluZWQ7XG4gICAgaWYgKCF2YWwpIHJldHVybjtcbiAgICBpZiAodmFsLmluZGV4T2YoQ2hvaWNlc1Jlc3RmdWwuY2FjaGVUZXh0KSA+IC0xKSB7XG4gICAgICB0aGlzLmlzVXNpbmdDYWNoZUZyb21VcmwgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodmFsLmluZGV4T2YoQ2hvaWNlc1Jlc3RmdWwubm9DYWNoZVRleHQpID4gLTEpIHtcbiAgICAgICAgdGhpcy5pc1VzaW5nQ2FjaGVGcm9tVXJsID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSwgaWYgYSB3ZWIgc2VydmljZSByZXR1cm5zIGEgbG90IG9mIGluZm9ybWF0aW9uIGFuZCB5b3UgbmVlZCBvbmx5IGEgcGFydCBvZiBpdC5cbiAgICogRm9yIGV4YW1wbGUsIGEgd2ViIHNlcnZpY2UgcmV0dXJucyBhIGxpc3Qgb2YgY291bnRyaWVzIGFuZCBhIGxpc3Qgb2YgY2FwaXRhbHMuXG4gICAqIElmIHlvdSBuZWVkIGEgbGlzdCBvZiBjb3VudHJpZXMsIHNldCBhIGNvcnJlY3QgcGF0aCBmcm9tIHdoaWNoIFN1cnZleUpTIG9idGFpbnMgdGhlIGRhdGEsIGxpa2U6IF9EYXRhTGlzdDFcXERhdGFMaXN0Ml9cbiAgICogQHNlZSB1cmxcbiAgICogQHNlZSB2YWx1ZU5hbWVcbiAgICogQHNlZSB0aXRsZU5hbWVcbiAgICogQHNlZSBbRXhhbXBsZTogUkVTVGZ1bCBEcm9wZG93bl0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9FeGFtcGxlcy9MaWJyYXJ5Lz9pZD1xdWVzdGlvbnR5cGUtZHJvcGRvd25yZXN0ZnVsbClcbiAgICogQHNlZSBbRG9jczogRmlsbCBDaG9pY2VzIGZyb20gYSBSRVNUZnVsIFNlcnZpY2VdKGh0dHBzOi8vc3VydmV5anMuaW8vRG9jdW1lbnRhdGlvbi9MaWJyYXJ5Lz9pZD1MaWJyYXJ5T3ZlcnZpZXcjZmlsbC10aGUtY2hvaWNlcy1mcm9tLWEtcmVzdGZ1bC1zZXJ2aWNlKVxuICAgKi9cblxuICBwdWJsaWMgZ2V0IHBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicGF0aFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBhdGgodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJwYXRoXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgbmFtZSBvZiBhIHByb3BlcnR5IChpbiB0aGUgb2J0YWluZWQgZGF0YSBvYmplY3QpIHRvIHdoaWNoIFN1cnZleUpTIGJpbmRzIHRvIHByb3ZpZGUgdmFsdWVzIGZvciBjaG9pY2UgaXRlbXMuXG4gICAqIEBzZWUgdXJsXG4gICAqIEBzZWUgcGF0aFxuICAgKiBAc2VlIHRpdGxlTmFtZVxuICAgKiBAc2VlIFtFeGFtcGxlOiBSRVNUZnVsIERyb3Bkb3duXShodHRwczovL3N1cnZleWpzLmlvL0V4YW1wbGVzL0xpYnJhcnkvP2lkPXF1ZXN0aW9udHlwZS1kcm9wZG93bnJlc3RmdWxsKVxuICAgKiBAc2VlIFtEb2NzOiBGaWxsIENob2ljZXMgZnJvbSBhIFJFU1RmdWwgU2VydmljZV0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9Eb2N1bWVudGF0aW9uL0xpYnJhcnkvP2lkPUxpYnJhcnlPdmVydmlldyNmaWxsLXRoZS1jaG9pY2VzLWZyb20tYS1yZXN0ZnVsLXNlcnZpY2UpXG4gICAqL1xuXG4gIHB1YmxpYyBnZXQgdmFsdWVOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZhbHVlTmFtZVwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZhbHVlTmFtZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZhbHVlTmFtZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSAoaW4gdGhlIG9idGFpbmVkIGRhdGEgb2JqZWN0KSB0byB3aGljaCBTdXJ2ZXlKUyBiaW5kcyB0byBwcm92aWRlIGRpc3BsYXkgdGV4dHMgZm9yIGNob2ljZSBpdGVtcy5cbiAgICogQHNlZSB1cmxcbiAgICogQHNlZSBwYXRoXG4gICAqIEBzZWUgdmFsdWVlTmFtZVxuICAgKiBAc2VlIFtFeGFtcGxlOiBSRVNUZnVsIERyb3Bkb3duXShodHRwczovL3N1cnZleWpzLmlvL0V4YW1wbGVzL0xpYnJhcnkvP2lkPXF1ZXN0aW9udHlwZS1kcm9wZG93bnJlc3RmdWxsKVxuICAgKiBAc2VlIFtEb2NzOiBGaWxsIENob2ljZXMgZnJvbSBhIFJFU1RmdWwgU2VydmljZV0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9Eb2N1bWVudGF0aW9uL0xpYnJhcnkvP2lkPUxpYnJhcnlPdmVydmlldyNmaWxsLXRoZS1jaG9pY2VzLWZyb20tYS1yZXN0ZnVsLXNlcnZpY2UpXG4gICAqL1xuXG4gIHB1YmxpYyBnZXQgdGl0bGVOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInRpdGxlTmFtZVwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRpdGxlTmFtZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInRpdGxlTmFtZVwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgaW1hZ2VMaW5rTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpbWFnZUxpbmtOYW1lXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaW1hZ2VMaW5rTmFtZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImltYWdlTGlua05hbWVcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGFsbG93RW1wdHlSZXNwb25zZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dFbXB0eVJlc3BvbnNlXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGFsbG93RW1wdHlSZXNwb25zZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJhbGxvd0VtcHR5UmVzcG9uc2VcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGF0dGFjaE9yaWdpbmFsSXRlbXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImF0dGFjaE9yaWdpbmFsSXRlbXNcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgYXR0YWNoT3JpZ2luYWxJdGVtcyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJhdHRhY2hPcmlnaW5hbEl0ZW1zXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBpdGVtVmFsdWVUeXBlKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLm93bmVyKSByZXR1cm4gXCJpdGVtdmFsdWVcIjtcbiAgICB2YXIgcHJvcCA9IFNlcmlhbGl6ZXIuZmluZFByb3BlcnR5KHRoaXMub3duZXIuZ2V0VHlwZSgpLCBcImNob2ljZXNcIik7XG4gICAgaWYgKCFwcm9wKSByZXR1cm4gXCJpdGVtdmFsdWVcIjtcbiAgICBpZiAocHJvcC50eXBlID09IFwiaXRlbXZhbHVlW11cIikgcmV0dXJuIFwiaXRlbXZhbHVlXCI7XG4gICAgcmV0dXJuIHByb3AudHlwZTtcbiAgfVxuICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgdGhpcy51cmwgPSBcIlwiO1xuICAgIHRoaXMucGF0aCA9IFwiXCI7XG4gICAgdGhpcy52YWx1ZU5hbWUgPSBcIlwiO1xuICAgIHRoaXMudGl0bGVOYW1lID0gXCJcIjtcbiAgICB0aGlzLmltYWdlTGlua05hbWUgPSBcIlwiO1xuICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5nZXRDdXN0b21Qcm9wZXJ0aWVzTmFtZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICgoPGFueT50aGlzKVtwcm9wZXJ0aWVzW2ldXSkgKDxhbnk+dGhpcylbcHJvcGVydGllc1tpXV0gPSBcIlwiO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgYmVmb3JlU2VuZFJlcXVlc3QoKSB7XG4gICAgdGhpcy5pc1J1bm5pbmdWYWx1ZSA9IHRydWU7XG4gICAgaWYgKCEhdGhpcy5iZWZvcmVTZW5kUmVxdWVzdENhbGxiYWNrKSB7XG4gICAgICB0aGlzLmJlZm9yZVNlbmRSZXF1ZXN0Q2FsbGJhY2soKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGJlZm9yZUxvYWRSZXF1ZXN0KCkge1xuICAgIHRoaXMuaXNSdW5uaW5nVmFsdWUgPSBmYWxzZTtcbiAgfVxuICBwcm90ZWN0ZWQgb25Mb2FkKHJlc3VsdDogYW55LCBsb2FkaW5nT2JqSGFzaDogc3RyaW5nID0gbnVsbCkge1xuICAgIGlmICghbG9hZGluZ09iakhhc2gpIHtcbiAgICAgIGxvYWRpbmdPYmpIYXNoID0gdGhpcy5vYmpIYXNoO1xuICAgIH1cbiAgICB2YXIgaXRlbXMgPSBuZXcgQXJyYXk8SXRlbVZhbHVlPigpO1xuICAgIHZhciB1cGRhdGVkUmVzdWx0ID0gdGhpcy5nZXRSZXN1bHRBZnRlclBhdGgocmVzdWx0KTtcbiAgICBpZiAodXBkYXRlZFJlc3VsdCAmJiB1cGRhdGVkUmVzdWx0W1wibGVuZ3RoXCJdKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHVwZGF0ZWRSZXN1bHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGl0ZW1WYWx1ZSA9IHVwZGF0ZWRSZXN1bHRbaV07XG4gICAgICAgIGlmICghaXRlbVZhbHVlKSBjb250aW51ZTtcbiAgICAgICAgdmFyIHZhbHVlID0gISF0aGlzLmdldEl0ZW1WYWx1ZUNhbGxiYWNrXG4gICAgICAgICAgPyB0aGlzLmdldEl0ZW1WYWx1ZUNhbGxiYWNrKGl0ZW1WYWx1ZSlcbiAgICAgICAgICA6IHRoaXMuZ2V0VmFsdWUoaXRlbVZhbHVlKTtcbiAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLmNyZWF0ZUl0ZW1WYWx1ZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMuc2V0VGl0bGUoaXRlbSwgaXRlbVZhbHVlKTtcbiAgICAgICAgdGhpcy5zZXRDdXN0b21Qcm9wZXJ0aWVzKGl0ZW0sIGl0ZW1WYWx1ZSk7XG4gICAgICAgIGlmICh0aGlzLmF0dGFjaE9yaWdpbmFsSXRlbXMpIHtcbiAgICAgICAgICBpdGVtLm9yaWdpbmFsSXRlbSA9IGl0ZW1WYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaW1hZ2VMaW5rID0gdGhpcy5nZXRJbWFnZUxpbmsoaXRlbVZhbHVlKTtcbiAgICAgICAgaWYgKCEhaW1hZ2VMaW5rKSB7XG4gICAgICAgICAgaXRlbS5pbWFnZUxpbmsgPSBpbWFnZUxpbms7XG4gICAgICAgIH1cbiAgICAgICAgaXRlbXMucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCF0aGlzLmFsbG93RW1wdHlSZXNwb25zZSkge1xuICAgICAgICB0aGlzLmVycm9yID0gbmV3IFdlYlJlcXVlc3RFbXB0eUVycm9yKG51bGwsIHRoaXMub3duZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy51cGRhdGVSZXN1bHRDYWxsYmFjaykge1xuICAgICAgaXRlbXMgPSB0aGlzLnVwZGF0ZVJlc3VsdENhbGxiYWNrKGl0ZW1zLCByZXN1bHQpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1VzaW5nQ2FjaGUpIHtcbiAgICAgIENob2ljZXNSZXN0ZnVsLml0ZW1zUmVzdWx0W2xvYWRpbmdPYmpIYXNoXSA9IGl0ZW1zO1xuICAgIH1cbiAgICB0aGlzLmNhbGxSZXN1bHRDYWxsYmFjayhpdGVtcywgbG9hZGluZ09iakhhc2gpO1xuICAgIENob2ljZXNSZXN0ZnVsLnVucmVnaXN0ZXJTYW1lUmVxdWVzdHModGhpcywgaXRlbXMpO1xuICB9XG4gIHByb3RlY3RlZCBjYWxsUmVzdWx0Q2FsbGJhY2soXG4gICAgaXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4sXG4gICAgbG9hZGluZ09iakhhc2g6IHN0cmluZ1xuICApIHtcbiAgICBpZiAobG9hZGluZ09iakhhc2ggIT0gdGhpcy5vYmpIYXNoKSByZXR1cm47XG4gICAgdGhpcy5nZXRSZXN1bHRDYWxsYmFjayhpdGVtcyk7XG4gIH1cbiAgcHJpdmF0ZSBzZXRDdXN0b21Qcm9wZXJ0aWVzKGl0ZW06IEl0ZW1WYWx1ZSwgaXRlbVZhbHVlOiBhbnkpIHtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0Q3VzdG9tUHJvcGVydGllcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByb3AgPSBwcm9wZXJ0aWVzW2ldO1xuICAgICAgdmFyIHZhbCA9IHRoaXMuZ2V0VmFsdWVDb3JlKFxuICAgICAgICBpdGVtVmFsdWUsXG4gICAgICAgIHRoaXMuZ2V0UHJvcGVydHlCaW5kaW5nKHByb3AubmFtZSlcbiAgICAgICk7XG4gICAgICBpZiAoIXRoaXMuaXNWYWx1ZUVtcHR5KHZhbCkpIHtcbiAgICAgICAgKDxhbnk+aXRlbSlbcHJvcC5uYW1lXSA9IHZhbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXRQcm9wZXJ0eUJpbmRpbmcocHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoKDxhbnk+dGhpcylbdGhpcy5nZXRDdXN0b21Qcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKV0pXG4gICAgICByZXR1cm4gKDxhbnk+dGhpcylbdGhpcy5nZXRDdXN0b21Qcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKV07XG4gICAgaWYgKCg8YW55PnRoaXMpW3Byb3BlcnR5TmFtZV0pIHJldHVybiAoPGFueT50aGlzKVtwcm9wZXJ0eU5hbWVdO1xuICAgIHJldHVybiBwcm9wZXJ0eU5hbWU7XG4gIH1cbiAgcHJpdmF0ZSBvbkVycm9yKHN0YXR1czogc3RyaW5nLCByZXNwb25zZTogc3RyaW5nKSB7XG4gICAgdGhpcy5lcnJvciA9IG5ldyBXZWJSZXF1ZXN0RXJyb3Ioc3RhdHVzLCByZXNwb25zZSwgdGhpcy5vd25lcik7XG4gICAgdGhpcy5kb0VtcHR5UmVzdWx0Q2FsbGJhY2socmVzcG9uc2UpO1xuICAgIENob2ljZXNSZXN0ZnVsLnVucmVnaXN0ZXJTYW1lUmVxdWVzdHModGhpcywgW10pO1xuICB9XG4gIHByaXZhdGUgZ2V0UmVzdWx0QWZ0ZXJQYXRoKHJlc3VsdDogYW55KSB7XG4gICAgaWYgKCFyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgaWYgKCF0aGlzLnByb2Nlc3NlZFBhdGgpIHJldHVybiByZXN1bHQ7XG4gICAgdmFyIHBhdGhlcyA9IHRoaXMuZ2V0UGF0aGVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdFtwYXRoZXNbaV1dO1xuICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByaXZhdGUgZ2V0UGF0aGVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHZhciBwYXRoZXMgPSBbXTtcbiAgICBpZiAodGhpcy5wcm9jZXNzZWRQYXRoLmluZGV4T2YoXCI7XCIpID4gLTEpIHtcbiAgICAgIHBhdGhlcyA9IHRoaXMucGF0aC5zcGxpdChcIjtcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdGhlcyA9IHRoaXMucHJvY2Vzc2VkUGF0aC5zcGxpdChcIixcIik7XG4gICAgfVxuICAgIGlmIChwYXRoZXMubGVuZ3RoID09IDApIHBhdGhlcy5wdXNoKHRoaXMucHJvY2Vzc2VkUGF0aCk7XG4gICAgcmV0dXJuIHBhdGhlcztcbiAgfVxuICBwcml2YXRlIGdldFZhbHVlKGl0ZW06IGFueSk6IGFueSB7XG4gICAgaWYgKCFpdGVtKSByZXR1cm4gbnVsbDtcbiAgICBpZiAodGhpcy52YWx1ZU5hbWUpIHJldHVybiB0aGlzLmdldFZhbHVlQ29yZShpdGVtLCB0aGlzLnZhbHVlTmFtZSk7XG4gICAgaWYgKCEoaXRlbSBpbnN0YW5jZW9mIE9iamVjdCkpIHJldHVybiBpdGVtO1xuICAgIHZhciBsZW4gPSBPYmplY3Qua2V5cyhpdGVtKS5sZW5ndGg7XG4gICAgaWYgKGxlbiA8IDEpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBpdGVtW09iamVjdC5rZXlzKGl0ZW0pWzBdXTtcbiAgfVxuICBwcml2YXRlIHNldFRpdGxlKGl0ZW06IEl0ZW1WYWx1ZSwgaXRlbVZhbHVlOiBhbnkpOiBhbnkge1xuICAgIHZhciB0aXRsZSA9IHRoaXMudGl0bGVOYW1lID8gdGhpcy50aXRsZU5hbWUgOiBcInRpdGxlXCI7XG4gICAgdmFyIHZhbCA9IHRoaXMuZ2V0VmFsdWVDb3JlKGl0ZW1WYWx1ZSwgdGl0bGUpO1xuICAgIGlmICghdmFsKSByZXR1cm47XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGl0ZW0udGV4dCA9IHZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlbS5sb2NUZXh0LnNldEpzb24odmFsKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXRJbWFnZUxpbmsoaXRlbTogYW55KTogYW55IHtcbiAgICB2YXIgaW1hZ2VMaW5rID0gdGhpcy5pbWFnZUxpbmtOYW1lID8gdGhpcy5pbWFnZUxpbmtOYW1lIDogXCJpbWFnZUxpbmtcIjtcbiAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZUNvcmUoaXRlbSwgaW1hZ2VMaW5rKTtcbiAgfVxuICBwcml2YXRlIGdldFZhbHVlQ29yZShpdGVtOiBhbnksIHByb3BlcnR5OiBzdHJpbmcpOiBhbnkge1xuICAgIGlmICghaXRlbSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHByb3BlcnR5LmluZGV4T2YoXCIuXCIpIDwgMCkgcmV0dXJuIGl0ZW1bcHJvcGVydHldO1xuICAgIHZhciBwcm9wZXJ0aWVzID0gcHJvcGVydHkuc3BsaXQoXCIuXCIpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgaXRlbSA9IGl0ZW1bcHJvcGVydGllc1tpXV07XG4gICAgICBpZiAoIWl0ZW0pIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gaXRlbTtcbiAgfVxuICBwcml2YXRlIGdldCBvYmpIYXNoKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnByb2Nlc3NlZFVybCArXG4gICAgICBcIjtcIiArXG4gICAgICB0aGlzLnByb2Nlc3NlZFBhdGggK1xuICAgICAgXCI7XCIgK1xuICAgICAgdGhpcy52YWx1ZU5hbWUgK1xuICAgICAgXCI7XCIgK1xuICAgICAgdGhpcy50aXRsZU5hbWUgK1xuICAgICAgXCI7XCIgK1xuICAgICAgdGhpcy5pbWFnZUxpbmtOYW1lXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIE9ic29sZXRlLCBwbGVhc2UgdXNlIENob2ljZXNSZXN0ZnVsXG4gKi9cbmV4cG9ydCBjbGFzcyBDaG9pY2VzUmVzdGZ1bGwgZXh0ZW5kcyBDaG9pY2VzUmVzdGZ1bCB7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IEVuY29kZVBhcmFtZXRlcnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIENob2ljZXNSZXN0ZnVsLkVuY29kZVBhcmFtZXRlcnM7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBzZXQgRW5jb2RlUGFyYW1ldGVycyh2YWw6IGJvb2xlYW4pIHtcbiAgICBDaG9pY2VzUmVzdGZ1bC5FbmNvZGVQYXJhbWV0ZXJzID0gdmFsO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgY2xlYXJDYWNoZSgpIHtcbiAgICBDaG9pY2VzUmVzdGZ1bC5jbGVhckNhY2hlKCk7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBnZXQgb25CZWZvcmVTZW5kUmVxdWVzdCgpOiAoXG4gICAgc2VuZGVyOiBDaG9pY2VzUmVzdGZ1bCxcbiAgICBvcHRpb25zOiB7IHJlcXVlc3Q6IFhNTEh0dHBSZXF1ZXN0IH1cbiAgKSA9PiB2b2lkIHtcbiAgICByZXR1cm4gQ2hvaWNlc1Jlc3RmdWwub25CZWZvcmVTZW5kUmVxdWVzdDtcbiAgfVxuICBwdWJsaWMgc3RhdGljIHNldCBvbkJlZm9yZVNlbmRSZXF1ZXN0KFxuICAgIHZhbDogKHNlbmRlcjogQ2hvaWNlc1Jlc3RmdWwsIG9wdGlvbnM6IHsgcmVxdWVzdDogWE1MSHR0cFJlcXVlc3QgfSkgPT4gdm9pZFxuICApIHtcbiAgICBDaG9pY2VzUmVzdGZ1bC5vbkJlZm9yZVNlbmRSZXF1ZXN0ID0gdmFsO1xuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwiY2hvaWNlc0J5VXJsXCIsXG4gIFtcbiAgICBcInVybFwiLFxuICAgIFwicGF0aFwiLFxuICAgIFwidmFsdWVOYW1lXCIsXG4gICAgXCJ0aXRsZU5hbWVcIixcbiAgICB7XG4gICAgICBuYW1lOiBcImltYWdlTGlua05hbWVcIixcbiAgICAgIHZpc2libGVJZjogZnVuY3Rpb24ob2JqOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuICEhb2JqICYmICEhb2JqLm93bmVyICYmIG9iai5vd25lci5nZXRUeXBlKCkgPT0gXCJpbWFnZXBpY2tlclwiO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHsgbmFtZTogXCJhbGxvd0VtcHR5UmVzcG9uc2U6Ym9vbGVhblwiLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJhdHRhY2hPcmlnaW5hbEl0ZW1zOmJvb2xlYW5cIiwgZGVmYXVsdDogZmFsc2UsIHZpc2libGU6IGZhbHNlIH0sXG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgQ2hvaWNlc1Jlc3RmdWwoKTtcbiAgfVxuKTtcbiIsImltcG9ydCB7IEhlbHBlcnMsIEhhc2hUYWJsZSB9IGZyb20gXCIuL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIFByb2Nlc3NWYWx1ZSB7XG4gIHB1YmxpYyB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+ID0gbnVsbDtcbiAgcHVibGljIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+ID0gbnVsbDtcbiAgY29uc3RydWN0b3IoKSB7fVxuICBwdWJsaWMgZ2V0Rmlyc3ROYW1lKHRleHQ6IHN0cmluZywgb2JqOiBhbnkgPSBudWxsKTogc3RyaW5nIHtcbiAgICBpZiAoIXRleHQpIHJldHVybiB0ZXh0O1xuICAgIHZhciByZXMgPSBcIlwiO1xuICAgIGlmICghIW9iaikge1xuICAgICAgcmVzID0gdGhpcy5nZXRGaXJzdFByb3BlcnR5TmFtZSh0ZXh0LCBvYmopO1xuICAgICAgaWYgKCEhcmVzKSByZXR1cm4gcmVzO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaCA9IHRleHRbaV07XG4gICAgICBpZiAoY2ggPT0gXCIuXCIgfHwgY2ggPT0gXCJbXCIpIGJyZWFrO1xuICAgICAgcmVzICs9IGNoO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBoYXNWYWx1ZSh0ZXh0OiBzdHJpbmcsIHZhbHVlczogSGFzaFRhYmxlPGFueT4gPSBudWxsKTogYm9vbGVhbiB7XG4gICAgaWYgKCF2YWx1ZXMpIHZhbHVlcyA9IHRoaXMudmFsdWVzO1xuICAgIHZhciByZXMgPSB0aGlzLmdldFZhbHVlQ29yZSh0ZXh0LCB2YWx1ZXMpO1xuICAgIHJldHVybiByZXMuaGFzVmFsdWU7XG4gIH1cbiAgcHVibGljIGdldFZhbHVlKHRleHQ6IHN0cmluZywgdmFsdWVzOiBIYXNoVGFibGU8YW55PiA9IG51bGwpOiBhbnkge1xuICAgIGlmICghdmFsdWVzKSB2YWx1ZXMgPSB0aGlzLnZhbHVlcztcbiAgICB2YXIgcmVzID0gdGhpcy5nZXRWYWx1ZUNvcmUodGV4dCwgdmFsdWVzKTtcbiAgICByZXR1cm4gcmVzLnZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXRWYWx1ZShvYmo6IGFueSwgdGV4dDogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm47XG4gICAgdmFyIG5vbk5lc3RlZE9iaiA9IHRoaXMuZ2V0Tm9uTmVzdGVkT2JqZWN0KG9iaiwgdGV4dCwgdHJ1ZSk7XG4gICAgaWYgKCFub25OZXN0ZWRPYmopIHJldHVybjtcbiAgICBvYmogPSBub25OZXN0ZWRPYmoudmFsdWU7XG4gICAgdGV4dCA9IG5vbk5lc3RlZE9iai50ZXh0O1xuICAgIGlmICghIW9iaiAmJiAhIXRleHQpIHtcbiAgICAgIG9ialt0ZXh0XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0VmFsdWVJbmZvKHZhbHVlSW5mbzogYW55KSB7XG4gICAgaWYgKCEhdmFsdWVJbmZvLnBhdGgpIHtcbiAgICAgIHZhbHVlSW5mby52YWx1ZSA9IHRoaXMuZ2V0VmFsdWVGcm9tUGF0aCh2YWx1ZUluZm8ucGF0aCwgdGhpcy52YWx1ZXMpO1xuICAgICAgdmFsdWVJbmZvLmhhc1ZhbHVlID1cbiAgICAgICAgdmFsdWVJbmZvLnZhbHVlICE9PSBudWxsICYmICFIZWxwZXJzLmlzVmFsdWVFbXB0eSh2YWx1ZUluZm8udmFsdWUpO1xuICAgICAgaWYgKFxuICAgICAgICAhdmFsdWVJbmZvLmhhc1ZhbHVlICYmXG4gICAgICAgIHZhbHVlSW5mby5wYXRoLmxlbmd0aCA+IDEgJiZcbiAgICAgICAgdmFsdWVJbmZvLnBhdGhbdmFsdWVJbmZvLnBhdGgubGVuZ3RoIC0gMV0gPT0gXCJsZW5ndGhcIlxuICAgICAgKSB7XG4gICAgICAgIHZhbHVlSW5mby5oYXNWYWx1ZSA9IHRydWU7XG4gICAgICAgIHZhbHVlSW5mby52YWx1ZSA9IDA7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciByZXMgPSB0aGlzLmdldFZhbHVlQ29yZSh2YWx1ZUluZm8ubmFtZSwgdGhpcy52YWx1ZXMpO1xuICAgIHZhbHVlSW5mby52YWx1ZSA9IHJlcy52YWx1ZTtcbiAgICB2YWx1ZUluZm8uaGFzVmFsdWUgPSByZXMuaGFzVmFsdWU7XG4gICAgdmFsdWVJbmZvLnBhdGggPSByZXMuaGFzVmFsdWUgPyByZXMucGF0aCA6IG51bGw7XG4gIH1cbiAgcHJpdmF0ZSBnZXRWYWx1ZUZyb21QYXRoKHBhdGg6IEFycmF5PHN0cmluZyB8IG51bWJlcj4sIHZhbHVlczogYW55KTogYW55IHtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHdoaWxlICghIXZhbHVlcyAmJiBpbmRleCA8IHBhdGgubGVuZ3RoKSB7XG4gICAgICB2YXIgaW5kX25hbWUgPSBwYXRoW2luZGV4XTtcbiAgICAgIGlmIChcbiAgICAgICAgSGVscGVycy5pc051bWJlcihpbmRfbmFtZSkgJiZcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZXMpICYmXG4gICAgICAgIGluZF9uYW1lID49IHZhbHVlcy5sZW5ndGhcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB2YWx1ZXMgPSB2YWx1ZXNbaW5kX25hbWVdO1xuICAgICAgaW5kZXgrKztcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuICBwcml2YXRlIGdldFZhbHVlQ29yZSh0ZXh0OiBzdHJpbmcsIHZhbHVlczogYW55KTogYW55IHtcbiAgICB2YXIgcmVzOiBhbnkgPSB7IGhhc1ZhbHVlOiBmYWxzZSwgdmFsdWU6IG51bGwsIHBhdGg6IG51bGwgfTtcbiAgICB2YXIgY3VyVmFsdWUgPSB2YWx1ZXM7XG4gICAgaWYgKCFjdXJWYWx1ZSAmJiBjdXJWYWx1ZSAhPT0gMCAmJiBjdXJWYWx1ZSAhPT0gZmFsc2UpIHJldHVybiByZXM7XG4gICAgaWYgKFxuICAgICAgdGV4dCAmJlxuICAgICAgdGV4dC5sYXN0SW5kZXhPZihcIi5sZW5ndGhcIikgPiAtMSAmJlxuICAgICAgdGV4dC5sYXN0SW5kZXhPZihcIi5sZW5ndGhcIikgPT09IHRleHQubGVuZ3RoIC0gXCIubGVuZ3RoXCIubGVuZ3RoXG4gICAgKSB7XG4gICAgICByZXMudmFsdWUgPSAwO1xuICAgICAgcmVzLmhhc1ZhbHVlID0gdHJ1ZTtcbiAgICB9XG4gICAgdmFyIG5vbk5lc3RlZE9iaiA9IHRoaXMuZ2V0Tm9uTmVzdGVkT2JqZWN0KGN1clZhbHVlLCB0ZXh0LCBmYWxzZSk7XG4gICAgaWYgKCFub25OZXN0ZWRPYmopIHJldHVybiByZXM7XG4gICAgcmVzLnBhdGggPSBub25OZXN0ZWRPYmoucGF0aDtcbiAgICByZXMudmFsdWUgPSAhIW5vbk5lc3RlZE9iai50ZXh0XG4gICAgICA/IHRoaXMuZ2V0T2JqZWN0VmFsdWUobm9uTmVzdGVkT2JqLnZhbHVlLCBub25OZXN0ZWRPYmoudGV4dClcbiAgICAgIDogbm9uTmVzdGVkT2JqLnZhbHVlO1xuICAgIHJlcy5oYXNWYWx1ZSA9ICFIZWxwZXJzLmlzVmFsdWVFbXB0eShyZXMudmFsdWUpO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBnZXROb25OZXN0ZWRPYmplY3Qob2JqOiBhbnksIHRleHQ6IHN0cmluZywgY3JlYXRlUGF0aDogYm9vbGVhbik6IGFueSB7XG4gICAgdmFyIGN1ck5hbWUgPSB0aGlzLmdldEZpcnN0UHJvcGVydHlOYW1lKHRleHQsIG9iaiwgY3JlYXRlUGF0aCk7XG4gICAgdmFyIHBhdGggPSAhIWN1ck5hbWUgPyBbY3VyTmFtZV0gOiBudWxsO1xuICAgIHdoaWxlICh0ZXh0ICE9IGN1ck5hbWUgJiYgISFvYmopIHtcbiAgICAgIHZhciBpc0FycmF5ID0gdGV4dFswXSA9PSBcIltcIjtcbiAgICAgIGlmICghaXNBcnJheSkge1xuICAgICAgICBpZiAoIWN1ck5hbWUgJiYgdGV4dCA9PSB0aGlzLmdldEZpcnN0TmFtZSh0ZXh0KSlcbiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogb2JqLCB0ZXh0OiB0ZXh0LCBwYXRoOiBwYXRoIH07XG4gICAgICAgIG9iaiA9IHRoaXMuZ2V0T2JqZWN0VmFsdWUob2JqLCBjdXJOYW1lKTtcbiAgICAgICAgaWYgKEhlbHBlcnMuaXNWYWx1ZUVtcHR5KG9iaikgJiYgIWNyZWF0ZVBhdGgpIHJldHVybiBudWxsO1xuICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHIoY3VyTmFtZS5sZW5ndGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG9iakluQXJyYXkgPSB0aGlzLmdldE9iakluQXJyYXkob2JqLCB0ZXh0KTtcbiAgICAgICAgaWYgKCFvYmpJbkFycmF5KSByZXR1cm4gbnVsbDtcbiAgICAgICAgb2JqID0gb2JqSW5BcnJheS52YWx1ZTtcbiAgICAgICAgdGV4dCA9IG9iakluQXJyYXkudGV4dDtcbiAgICAgICAgcGF0aC5wdXNoKG9iakluQXJyYXkuaW5kZXgpO1xuICAgICAgfVxuICAgICAgaWYgKCEhdGV4dCAmJiB0ZXh0WzBdID09IFwiLlwiKSB7XG4gICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cigxKTtcbiAgICAgIH1cbiAgICAgIGN1ck5hbWUgPSB0aGlzLmdldEZpcnN0UHJvcGVydHlOYW1lKHRleHQsIG9iaiwgY3JlYXRlUGF0aCk7XG4gICAgICBpZiAoISFjdXJOYW1lKSB7XG4gICAgICAgIHBhdGgucHVzaChjdXJOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgdmFsdWU6IG9iaiwgdGV4dDogdGV4dCwgcGF0aDogcGF0aCB9O1xuICB9XG4gIHByaXZhdGUgZ2V0T2JqSW5BcnJheShjdXJWYWx1ZTogYW55LCB0ZXh0OiBzdHJpbmcpOiBhbnkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShjdXJWYWx1ZSkpIHJldHVybiBudWxsO1xuICAgIHZhciBpbmRleCA9IDE7XG4gICAgdmFyIHN0ciA9IFwiXCI7XG4gICAgd2hpbGUgKGluZGV4IDwgdGV4dC5sZW5ndGggJiYgdGV4dFtpbmRleF0gIT0gXCJdXCIpIHtcbiAgICAgIHN0ciArPSB0ZXh0W2luZGV4XTtcbiAgICAgIGluZGV4Kys7XG4gICAgfVxuICAgIHRleHQgPSBpbmRleCA8IHRleHQubGVuZ3RoID8gdGV4dC5zdWJzdHIoaW5kZXggKyAxKSA6IFwiXCI7XG4gICAgaW5kZXggPSB0aGlzLmdldEludFZhbHVlKHN0cik7XG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBjdXJWYWx1ZS5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB7IHZhbHVlOiBjdXJWYWx1ZVtpbmRleF0sIHRleHQ6IHRleHQsIGluZGV4OiBpbmRleCB9O1xuICB9XG4gIHByaXZhdGUgZ2V0Rmlyc3RQcm9wZXJ0eU5hbWUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG9iajogYW55LFxuICAgIGNyZWF0ZVByb3A6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBzdHJpbmcge1xuICAgIGlmICghbmFtZSkgcmV0dXJuIG5hbWU7XG4gICAgaWYgKCFvYmopIG9iaiA9IHt9O1xuICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkobmFtZSkpIHJldHVybiBuYW1lO1xuICAgIHZhciBuYW1lSW5Mb3cgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIEEgPSBuYW1lSW5Mb3dbMF07XG4gICAgdmFyIGEgPSBBLnRvVXBwZXJDYXNlKCk7XG4gICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgICAgdmFyIGZpcnN0ID0ga2V5WzBdO1xuICAgICAgaWYgKGZpcnN0ID09PSBhIHx8IGZpcnN0ID09PSBBKSB7XG4gICAgICAgIHZhciBrZXlOYW1lID0ga2V5LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChrZXlOYW1lID09IG5hbWVJbkxvdykgcmV0dXJuIGtleTtcbiAgICAgICAgaWYgKG5hbWVJbkxvdy5sZW5ndGggPD0ga2V5TmFtZS5sZW5ndGgpIGNvbnRpbnVlO1xuICAgICAgICB2YXIgY2ggPSBuYW1lSW5Mb3dba2V5TmFtZS5sZW5ndGhdO1xuICAgICAgICBpZiAoY2ggIT0gXCIuXCIgJiYgY2ggIT0gXCJbXCIpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoa2V5TmFtZSA9PSBuYW1lSW5Mb3cuc3Vic3RyKDAsIGtleU5hbWUubGVuZ3RoKSkgcmV0dXJuIGtleTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNyZWF0ZVByb3AgJiYgbmFtZVswXSAhPT0gXCJbXCIpIHtcbiAgICAgIHZhciBpbmQgPSBuYW1lLmluZGV4T2YoXCIuXCIpO1xuICAgICAgaWYgKGluZCA+IC0xKSB7XG4gICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cigwLCBpbmQpO1xuICAgICAgICBvYmpbbmFtZV0gPSB7fTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuYW1lO1xuICAgIH1cbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICBwcml2YXRlIGdldE9iamVjdFZhbHVlKG9iajogYW55LCBuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIGlmICghbmFtZSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIG9ialtuYW1lXTtcbiAgfVxuICBwcml2YXRlIGdldEludFZhbHVlKHN0cjogYW55KSB7XG4gICAgaWYgKHN0ciA9PSBcIjBcIiB8fCAoKHN0ciB8IDApID4gMCAmJiBzdHIgJSAxID09IDApKSByZXR1cm4gTnVtYmVyKHN0cik7XG4gICAgcmV0dXJuIC0xO1xuICB9XG59XG4iLCJpbXBvcnQgeyBIYXNoVGFibGUgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBQcm9jZXNzVmFsdWUgfSBmcm9tIFwiLi9jb25kaXRpb25Qcm9jZXNzVmFsdWVcIjtcblxuaW1wb3J0IHsgT3BlcmFuZCwgRnVuY3Rpb25PcGVyYW5kIH0gZnJvbSBcIi4vZXhwcmVzc2lvbnMvZXhwcmVzc2lvbnNcIjtcbmltcG9ydCB7IENvbmRpdGlvbnNQYXJzZXIgfSBmcm9tIFwiLi9jb25kaXRpb25zUGFyc2VyXCI7XG5cbmV4cG9ydCBjbGFzcyBFeHByZXNzaW9uUnVubmVyQmFzZSB7XG4gIHByaXZhdGUgZXhwcmVzc2lvblZhbHVlOiBzdHJpbmc7XG4gIHByaXZhdGUgb3BlcmFuZDogT3BlcmFuZDtcbiAgcHJpdmF0ZSBwcm9jZXNzVmFsdWUgPSBuZXcgUHJvY2Vzc1ZhbHVlKCk7XG4gIHByaXZhdGUgcGFyc2VyID0gbmV3IENvbmRpdGlvbnNQYXJzZXIoKTtcbiAgcHJpdmF0ZSBpc0FzeW5jVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBoYXNGdW5jdGlvblZhbHVlOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgYXN5bmNGdW5jTGlzdDogQXJyYXk8RnVuY3Rpb25PcGVyYW5kPjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoZXhwcmVzc2lvbjogc3RyaW5nKSB7XG4gICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXhwcmVzc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb25WYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgZXhwcmVzc2lvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuZXhwcmVzc2lvbiA9PT0gdmFsdWUpIHJldHVybjtcbiAgICB0aGlzLmV4cHJlc3Npb25WYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMub3BlcmFuZCA9IHRoaXMucGFyc2VyLnBhcnNlRXhwcmVzc2lvbih2YWx1ZSk7XG4gICAgdGhpcy5oYXNGdW5jdGlvblZhbHVlID0gdGhpcy5jYW5SdW4oKSA/IHRoaXMub3BlcmFuZC5oYXNGdW5jdGlvbigpIDogZmFsc2U7XG4gICAgdGhpcy5pc0FzeW5jVmFsdWUgPSB0aGlzLmhhc0Z1bmN0aW9uKClcbiAgICAgID8gdGhpcy5vcGVyYW5kLmhhc0FzeW5jRnVuY3Rpb24oKVxuICAgICAgOiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWYXJpYWJsZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgaWYgKCF0aGlzLm9wZXJhbmQpIHJldHVybiBbXTtcblxuICAgIHZhciB2YXJpYWJsZXM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICB0aGlzLm9wZXJhbmQuc2V0VmFyaWFibGVzKHZhcmlhYmxlcyk7XG4gICAgcmV0dXJuIHZhcmlhYmxlcztcbiAgfVxuXG4gIHB1YmxpYyBoYXNGdW5jdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNGdW5jdGlvblZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNBc3luYygpIHtcbiAgICByZXR1cm4gdGhpcy5pc0FzeW5jVmFsdWU7XG4gIH1cblxuICBwdWJsaWMgY2FuUnVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMub3BlcmFuZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBydW5Db3JlKFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4gPSBudWxsXG4gICk6IGFueSB7XG4gICAgaWYgKCF0aGlzLm9wZXJhbmQpIHJldHVybiBudWxsO1xuXG4gICAgdGhpcy5wcm9jZXNzVmFsdWUudmFsdWVzID0gdmFsdWVzO1xuICAgIHRoaXMucHJvY2Vzc1ZhbHVlLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzO1xuICAgIGlmICghdGhpcy5pc0FzeW5jKSByZXR1cm4gdGhpcy5ydW5WYWx1ZXMoKTtcbiAgICB0aGlzLmFzeW5jRnVuY0xpc3QgPSBbXTtcbiAgICB0aGlzLm9wZXJhbmQuYWRkVG9Bc3luY0xpc3QodGhpcy5hc3luY0Z1bmNMaXN0KTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYXN5bmNGdW5jTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5hc3luY0Z1bmNMaXN0W2ldLm9uQXN5bmNSZWFkeSA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5kb0FzeW5jRnVuY3Rpb25SZWFkeSgpO1xuICAgICAgfTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmFzeW5jRnVuY0xpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuYXN5bmNGdW5jTGlzdFtpXS5ldmFsdWF0ZUFzeW5jKHRoaXMucHJvY2Vzc1ZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByaXZhdGUgZG9Bc3luY0Z1bmN0aW9uUmVhZHkoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmFzeW5jRnVuY0xpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghdGhpcy5hc3luY0Z1bmNMaXN0W2ldLmlzUmVhZHkpIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5ydW5WYWx1ZXMoKTtcbiAgfVxuICBwcml2YXRlIHJ1blZhbHVlcygpOiBhbnkge1xuICAgIHZhciByZXMgPSB0aGlzLm9wZXJhbmQuZXZhbHVhdGUodGhpcy5wcm9jZXNzVmFsdWUpO1xuICAgIHRoaXMuZG9PbkNvbXBsZXRlKHJlcyk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcm90ZWN0ZWQgZG9PbkNvbXBsZXRlKHJlczogYW55KSB7fVxufVxuXG5leHBvcnQgY2xhc3MgQ29uZGl0aW9uUnVubmVyIGV4dGVuZHMgRXhwcmVzc2lvblJ1bm5lckJhc2Uge1xuICBwdWJsaWMgb25SdW5Db21wbGV0ZTogKHJlc3VsdDogYm9vbGVhbikgPT4gdm9pZDtcbiAgcHVibGljIHJ1bihcbiAgICB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+ID0gbnVsbFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5ydW5Db3JlKHZhbHVlcywgcHJvcGVydGllcykgPT0gdHJ1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgZG9PbkNvbXBsZXRlKHJlczogYW55KSB7XG4gICAgaWYgKCEhdGhpcy5vblJ1bkNvbXBsZXRlKSB0aGlzLm9uUnVuQ29tcGxldGUocmVzID09IHRydWUpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFeHByZXNzaW9uUnVubmVyIGV4dGVuZHMgRXhwcmVzc2lvblJ1bm5lckJhc2Uge1xuICBwdWJsaWMgb25SdW5Db21wbGV0ZTogKHJlc3VsdDogYW55KSA9PiB2b2lkO1xuICBwdWJsaWMgcnVuKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+ID0gbnVsbCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMucnVuQ29yZSh2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIHByb3RlY3RlZCBkb09uQ29tcGxldGUocmVzOiBhbnkpIHtcbiAgICBpZiAoISF0aGlzLm9uUnVuQ29tcGxldGUpIHRoaXMub25SdW5Db21wbGV0ZShyZXMpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBPcGVyYW5kLCBDb25zdCB9IGZyb20gXCIuL2V4cHJlc3Npb25zL2V4cHJlc3Npb25zXCI7XG5pbXBvcnQgeyBTeW50YXhFcnJvciwgcGFyc2UgfSBmcm9tIFwiLi9leHByZXNzaW9ucy9leHByZXNzaW9uUGFyc2VyXCI7XG5cbmV4cG9ydCBjbGFzcyBDb25kaXRpb25zUGFyc2VyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgYXQ6IG51bWJlciwgcHVibGljIGNvZGU6IHN0cmluZykge31cbn1cblxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbnNQYXJzZXIge1xuICBwcml2YXRlIGNvbmRpdGlvbkVycm9yOiBDb25kaXRpb25zUGFyc2VyRXJyb3I7XG4gIHByaXZhdGUgc3RhdGljIHBhcnNlckNhY2hlOiB7IFtpbmRleDogc3RyaW5nXTogT3BlcmFuZCB9ID0ge307XG5cbiAgcHJpdmF0ZSBwYXRjaEV4cHJlc3Npb24odGV4dDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRleHRcbiAgICAgIC5yZXBsYWNlKC89Pi9nLCBcIj49XCIpXG4gICAgICAucmVwbGFjZSgvPTwvZywgXCI8PVwiKVxuICAgICAgLnJlcGxhY2UoLzw+L2csIFwiIT1cIilcbiAgICAgIC5yZXBsYWNlKC89PS9nLCBcIj0gXCIpXG4gICAgICAucmVwbGFjZSgvZXF1YWxzL2csIFwiZXF1YWwgXCIpXG4gICAgICAucmVwbGFjZSgvbm90ZXF1YWxzL2csIFwibm90ZXF1YWwgXCIpO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZUNvbmRpdGlvbih0ZXh0OiBzdHJpbmcpOiBPcGVyYW5kIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZUV4cHJlc3Npb24odGV4dCk7XG4gIH1cblxuICBwdWJsaWMgcGFyc2VFeHByZXNzaW9uKHRleHQ6IHN0cmluZyk6IE9wZXJhbmQge1xuICAgIHRyeSB7XG4gICAgICB2YXIgcmVzdWx0ID0gQ29uZGl0aW9uc1BhcnNlci5wYXJzZXJDYWNoZVt0ZXh0XTtcbiAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXN1bHQgPSBwYXJzZSh0aGlzLnBhdGNoRXhwcmVzc2lvbih0ZXh0KSk7XG4gICAgICAgIGlmICghcmVzdWx0Lmhhc0FzeW5jRnVuY3Rpb24oKSkge1xuICAgICAgICAgIENvbmRpdGlvbnNQYXJzZXIucGFyc2VyQ2FjaGVbdGV4dF0gPSByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTeW50YXhFcnJvcikge1xuICAgICAgICB0aGlzLmNvbmRpdGlvbkVycm9yID0gbmV3IENvbmRpdGlvbnNQYXJzZXJFcnJvcihcbiAgICAgICAgICBlLmxvY2F0aW9uLnN0YXJ0Lm9mZnNldCxcbiAgICAgICAgICBlLm1lc3NhZ2VcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVycm9yKCk6IENvbmRpdGlvbnNQYXJzZXJFcnJvciB7XG4gICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uRXJyb3I7XG4gIH1cbn1cbiIsImltcG9ydCB7IHN1cnZleUNzcyB9IGZyb20gXCIuL2Nzc3N0YW5kYXJkXCI7XG5cbmV4cG9ydCB2YXIgZGVmYXVsdEJvb3RzdHJhcENzcyA9IHtcbiAgcm9vdDogXCJzdl9tYWluIHN2X2Jvb3RzdHJhcF9jc3NcIixcbiAgY29udGFpbmVyOiBcInN2X2NvbnRhaW5lclwiLFxuICBoZWFkZXI6IFwicGFuZWwtaGVhZGluZyBjYXJkLWhlYWRlclwiLFxuICBib2R5OiBcInBhbmVsLWJvZHkgY2FyZC1ibG9jayBtdC00XCIsXG4gIGJvZHlFbXB0eTogXCJwYW5lbC1ib2R5IGNhcmQtYmxvY2sgbXQtNCBzdl9ib2R5X2VtcHR5XCIsXG4gIGZvb3RlcjogXCJwYW5lbC1mb290ZXIgY2FyZC1mb290ZXJcIixcbiAgdGl0bGU6IFwiXCIsXG4gIGRlc2NyaXB0aW9uOiBcIlwiLFxuICBsb2dvOiBcInN2X2xvZ29cIixcbiAgbG9nb0ltYWdlOiBcInN2X2xvZ29fX2ltYWdlXCIsXG4gIGhlYWRlclRleHQ6IFwic3ZfaGVhZGVyX190ZXh0XCIsXG4gIG5hdmlnYXRpb25CdXR0b246IFwiXCIsXG4gIGNvbXBsZXRlZFBhZ2U6IFwiXCIsXG4gIG5hdmlnYXRpb246IHtcbiAgICBjb21wbGV0ZTogXCJidG4gc3ZfY29tcGxldGVfYnRuXCIsXG4gICAgcHJldjogXCJidG4gc3ZfcHJldl9idG5cIixcbiAgICBuZXh0OiBcImJ0biBzdl9uZXh0X2J0blwiLFxuICAgIHN0YXJ0OiBcImJ0biBzdl9zdGFydF9idG5cIixcbiAgICBwcmV2aWV3OiBcImJ0biBzdl9wcmV2aWV3X2J0blwiLFxuICAgIGVkaXQ6IFwiYnRuIHN2X2VkaXRfYnRuXCIsXG4gIH0sXG4gIHByb2dyZXNzOiBcInByb2dyZXNzIGNlbnRlci1ibG9jayBteC1hdXRvIG1iLTRcIixcbiAgcHJvZ3Jlc3NCYXI6IFwicHJvZ3Jlc3MtYmFyXCIsXG4gIHByb2dyZXNzVGV4dFVuZGVyQmFyOiBcInN2LWhpZGRlblwiLFxuICBwcm9ncmVzc0J1dHRvbnNDb250YWluZXJDZW50ZXI6IFwic3ZfcHJvZ3Jlc3MtYnV0dG9uc19fY29udGFpbmVyLWNlbnRlclwiLFxuICBwcm9ncmVzc0J1dHRvbnNDb250YWluZXI6IFwic3ZfcHJvZ3Jlc3MtYnV0dG9uc19fY29udGFpbmVyXCIsXG4gIHByb2dyZXNzQnV0dG9uc0ltYWdlQnV0dG9uTGVmdDogXCJzdl9wcm9ncmVzcy1idXR0b25zX19pbWFnZS1idXR0b24tbGVmdFwiLFxuICBwcm9ncmVzc0J1dHRvbnNJbWFnZUJ1dHRvblJpZ2h0OiBcInN2X3Byb2dyZXNzLWJ1dHRvbnNfX2ltYWdlLWJ1dHRvbi1yaWdodFwiLFxuICBwcm9ncmVzc0J1dHRvbnNJbWFnZUJ1dHRvbkhpZGRlbjogXCJzdl9wcm9ncmVzcy1idXR0b25zX19pbWFnZS1idXR0b24tLWhpZGRlblwiLFxuICBwcm9ncmVzc0J1dHRvbnNMaXN0Q29udGFpbmVyOiBcInN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QtY29udGFpbmVyXCIsXG4gIHByb2dyZXNzQnV0dG9uc0xpc3Q6IFwic3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdFwiLFxuICBwcm9ncmVzc0J1dHRvbnNMaXN0RWxlbWVudFBhc3NlZDogXCJzdl9wcm9ncmVzcy1idXR0b25zX19saXN0LWVsZW1lbnQtLXBhc3NlZFwiLFxuICBwcm9ncmVzc0J1dHRvbnNMaXN0RWxlbWVudEN1cnJlbnQ6XG4gICAgXCJzdl9wcm9ncmVzcy1idXR0b25zX19saXN0LWVsZW1lbnQtLWN1cnJlbnRcIixcbiAgcHJvZ3Jlc3NCdXR0b25zTGlzdEVsZW1lbnROb25DbGlja2FibGU6XG4gICAgXCJzdl9wcm9ncmVzcy1idXR0b25zX19saXN0LWVsZW1lbnQtLW5vbmNsaWNrYWJsZVwiLFxuICBwcm9ncmVzc0J1dHRvbnNQYWdlVGl0bGU6IFwic3ZfcHJvZ3Jlc3MtYnV0dG9uc19fcGFnZS10aXRsZVwiLFxuICBwcm9ncmVzc0J1dHRvbnNQYWdlRGVzY3JpcHRpb246IFwic3ZfcHJvZ3Jlc3MtYnV0dG9uc19fcGFnZS1kZXNjcmlwdGlvblwiLFxuICBwYWdlOiB7XG4gICAgcm9vdDogXCJcIixcbiAgICB0aXRsZTogXCJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJzbWFsbFwiLFxuICB9LFxuICBwYWdlVGl0bGU6IFwiXCIsXG4gIHBhZ2VEZXNjcmlwdGlvbjogXCJzbWFsbFwiLFxuICByb3c6IFwic3Zfcm93XCIsXG4gIHF1ZXN0aW9uOiB7XG4gICAgbWFpblJvb3Q6IFwic3ZfcXN0blwiLFxuICAgIGZsb3dSb290OiBcInN2X3FfZmxvdyBzdl9xc3RuXCIsXG4gICAgaGVhZGVyOiBcIlwiLFxuICAgIGhlYWRlckxlZnQ6IFwidGl0bGUtbGVmdFwiLFxuICAgIGNvbnRlbnQ6IFwiXCIsXG4gICAgY29udGVudExlZnQ6IFwiY29udGVudC1sZWZ0XCIsXG4gICAgdGl0bGVMZWZ0Um9vdDogXCJzdl9xc3RuX2xlZnRcIixcbiAgICB0aXRsZTogXCJcIixcbiAgICB0aXRsZUV4cGFuZGFibGU6IFwic3ZfcV90aXRsZV9leHBhbmRhYmxlXCIsXG4gICAgbnVtYmVyOiBcInN2X3FfbnVtXCIsXG4gICAgZGVzY3JpcHRpb246IFwic21hbGxcIixcbiAgICBkZXNjcmlwdGlvblVuZGVySW5wdXQ6IFwic21hbGxcIixcbiAgICByZXF1aXJlZFRleHQ6IFwic3ZfcV9yZXF1aXJlZF90ZXh0XCIsXG4gICAgY29tbWVudDogXCJmb3JtLWNvbnRyb2xcIixcbiAgICByZXF1aXJlZDogXCJcIixcbiAgICB0aXRsZVJlcXVpcmVkOiBcIlwiLFxuICAgIGhhc0Vycm9yOiBcImhhcy1lcnJvclwiLFxuICAgIGluZGVudDogMjAsXG4gICAgZm9ybUdyb3VwOiBcImZvcm0tZ3JvdXBcIixcbiAgfSxcbiAgcGFuZWw6IHtcbiAgICB0aXRsZTogXCJzdl9wX3RpdGxlXCIsXG4gICAgdGl0bGVFeHBhbmRhYmxlOiBcInN2X3BfdGl0bGVfZXhwYW5kYWJsZVwiLFxuICAgIHRpdGxlT25FcnJvcjogXCJcIixcbiAgICBpY29uOiBcInN2X3BhbmVsX2ljb25cIixcbiAgICBpY29uRXhwYW5kZWQ6IFwic3ZfZXhwYW5kZWRcIixcbiAgICBkZXNjcmlwdGlvbjogXCJzbWFsbCBzdl9wX2Rlc2NyaXB0aW9uXCIsXG4gICAgY29udGFpbmVyOiBcInN2X3BfY29udGFpbmVyXCIsXG4gICAgZm9vdGVyOiBcInN2X3BfZm9vdGVyXCIsXG4gICAgbnVtYmVyOiBcInN2X3FfbnVtXCIsXG4gICAgcmVxdWlyZWRUZXh0OiBcInN2X3FfcmVxdWlyZWRfdGV4dFwiLFxuICB9LFxuICBlcnJvcjoge1xuICAgIHJvb3Q6IFwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIsXG4gICAgaWNvbjogXCJnbHlwaGljb24gZ2x5cGhpY29uLWV4Y2xhbWF0aW9uLXNpZ25cIixcbiAgICBpdGVtOiBcIlwiLFxuICAgIGxvY2F0aW9uVG9wOiBcInN2X3FzdG5fZXJyb3JfdG9wXCIsXG4gICAgbG9jYXRpb25Cb3R0b206IFwic3ZfcXN0bl9lcnJvcl9ib3R0b21cIixcbiAgfSxcbiAgYm9vbGVhbjoge1xuICAgIHJvb3Q6IFwic3ZfcWJsbiBmb3JtLWlubGluZSBjaGVja2JveFwiLFxuICAgIGl0ZW06IFwic3YtYm9vbGVhblwiLFxuICAgIGNvbnRyb2w6IFwic3YtdmlzdWFsbHloaWRkZW5cIixcbiAgICBpdGVtQ2hlY2tlZDogXCJzdi1ib29sZWFuLS1jaGVja2VkIGNoZWNrZWRcIixcbiAgICBpdGVtSW5kZXRlcm1pbmF0ZTogXCJzdi1ib29sZWFuLS1pbmRldGVybWluYXRlXCIsXG4gICAgaXRlbURpc2FibGVkOiBcInN2LWJvb2xlYW4tLWRpc2FibGVkXCIsXG4gICAgc3dpdGNoOiBcInN2LWJvb2xlYW5fX3N3aXRjaFwiLFxuICAgIHNsaWRlcjogXCJzdi1ib29sZWFuX19zbGlkZXJcIixcbiAgICBzbGlkZXJUZXh0OiBcInN2LWhpZGRlblwiLFxuICAgIGxhYmVsOiBcInN2LWJvb2xlYW5fX2xhYmVsIFwiLFxuICAgIGRpc2FibGVkTGFiZWw6IFwic3YtYm9vbGVhbl9fbGFiZWwtLWRpc2FibGVkXCIsXG4gICAgbWF0ZXJpYWxEZWNvcmF0b3I6IFwic3YtaXRlbV9fZGVjb3JhdG9yIHN2LWJvb2xlYW5fX2RlY29yYXRvciBcIixcbiAgICBpdGVtRGVjb3JhdG9yOiBcInN2LWl0ZW1fX3N2ZyAgc3YtYm9vbGVhbl9fc3ZnXCIsXG4gICAgY2hlY2tlZFBhdGg6IFwic3YtYm9vbGVhbl9fY2hlY2tlZC1wYXRoXCIsXG4gICAgdW5jaGVja2VkUGF0aDogXCJzdi1ib29sZWFuX191bmNoZWNrZWQtcGF0aFwiLFxuICAgIGluZGV0ZXJtaW5hdGVQYXRoOiBcInN2LWJvb2xlYW5fX2luZGV0ZXJtaW5hdGUtcGF0aFwiLFxuICB9LFxuICBjaGVja2JveDoge1xuICAgIHJvb3Q6IFwic3ZfcWNiYyBzdl9xY2J4IGZvcm0taW5saW5lXCIsXG4gICAgaXRlbTogXCJjaGVja2JveFwiLFxuICAgIGl0ZW1DaGVja2VkOiBcImNoZWNrZWRcIixcbiAgICBpdGVtU2VsZWN0QWxsOiBcInN2X3FfY2hlY2tib3hfc2VsZWN0YWxsXCIsXG4gICAgaXRlbU5vbmU6IFwic3ZfcV9jaGVja2JveF9ub25lXCIsXG4gICAgaXRlbUlubGluZTogXCJzdl9xX2NoZWNrYm94X2lubGluZVwiLFxuICAgIGl0ZW1Db250cm9sOiBcIlwiLFxuICAgIGl0ZW1EZWNvcmF0b3I6IFwic3YtaGlkZGVuXCIsXG4gICAgbGFiZWw6IFwiXCIsXG4gICAgbGFiZWxDaGVja2VkOiBcIlwiLFxuICAgIGNvbnRyb2xMYWJlbDogXCJcIixcbiAgICBtYXRlcmlhbERlY29yYXRvcjogXCJjaGVja2JveC1tYXRlcmlhbFwiLFxuICAgIG90aGVyOiBcInN2X3FfY2hlY2tib3hfb3RoZXIgZm9ybS1jb250cm9sXCIsXG4gICAgY29sdW1uOiBcInN2X3Ffc2VsZWN0X2NvbHVtblwiLFxuICB9LFxuICByYW5raW5nOiB7XG4gICAgcm9vdDogXCJzdi1yYW5raW5nXCIsXG4gICAgcm9vdE1vYmlsZU1vZDogXCJzdi1yYW5raW5nLS1tb2JpbGVcIixcbiAgICByb290RHJhZ01vZDogXCJzdi1yYW5raW5nLS1kcmFnXCIsXG4gICAgaXRlbTogXCJzdi1yYW5raW5nLWl0ZW1cIixcbiAgICBpdGVtQ29udGVudDogXCJzdi1yYW5raW5nLWl0ZW1fX2NvbnRlbnRcIixcbiAgICBpdGVtSW5kZXg6IFwic3YtcmFua2luZy1pdGVtX19pbmRleFwiLFxuICAgIC8vIGl0ZW1UZXh0OiBcInN2LXJhbmtpbmctaXRlbV9fdGV4dFwiLFxuICAgIGNvbnRyb2xMYWJlbDogXCJzdi1yYW5raW5nLWl0ZW1fX3RleHRcIixcbiAgICBpdGVtR2hvc3ROb2RlOiBcInN2LXJhbmtpbmctaXRlbV9fZ2hvc3RcIixcbiAgICBpdGVtSWNvbkNvbnRhaW5lcjogXCJzdi1yYW5raW5nLWl0ZW1fX2ljb24tY29udGFpbmVyXCIsXG4gICAgaXRlbUljb246IFwic3YtcmFua2luZy1pdGVtX19pY29uXCIsXG4gICAgaXRlbUljb25Ib3Zlck1vZDogXCJzdi1yYW5raW5nLWl0ZW1fX2ljb24tLWhvdmVyXCIsXG4gICAgaXRlbUljb25Gb2N1c01vZDogXCJzdi1yYW5raW5nLWl0ZW1fX2ljb24tLWZvY3VzXCIsXG4gICAgaXRlbUdob3N0TW9kOiBcInN2LXJhbmtpbmctaXRlbS0tZ2hvc3RcIixcbiAgICBpdGVtRHJhZ01vZDogXCJzdi1yYW5raW5nLWl0ZW0tLWRyYWdcIixcbiAgfSxcbiAgY29tbWVudDogXCJmb3JtLWNvbnRyb2xcIixcbiAgZHJvcGRvd246IHtcbiAgICByb290OiBcIlwiLFxuICAgIGNvbnRyb2w6IFwiZm9ybS1jb250cm9sXCIsXG4gICAgb3RoZXI6IFwic3ZfcV9kZF9vdGhlciBmb3JtLWNvbnRyb2xcIixcbiAgfSxcbiAgaHRtbDogeyByb290OiBcIlwiIH0sXG4gIGltYWdlOiB7IHJvb3Q6IFwic3ZfcV9pbWFnZVwiLCBpbWFnZTogXCJzdl9pbWFnZV9pbWFnZVwiIH0sXG4gIG1hdHJpeDoge1xuICAgIHJvb3Q6IFwidGFibGUgc3ZfcV9tYXRyaXhcIixcbiAgICBsYWJlbDogXCJzdl9xX21fbGFiZWxcIixcbiAgICBpdGVtQ2hlY2tlZDogXCJjaGVja2VkXCIsXG4gICAgaXRlbURlY29yYXRvcjogXCJzdi1oaWRkZW5cIixcbiAgICBjZWxsVGV4dDogXCJzdl9xX21fY2VsbF90ZXh0XCIsXG4gICAgY2VsbFRleHRTZWxlY3RlZDogXCJzdl9xX21fY2VsbF9zZWxlY3RlZCBiZy1wcmltYXJ5XCIsXG4gICAgY2VsbExhYmVsOiBcInN2X3FfbV9jZWxsX2xhYmVsXCIsXG4gIH0sXG4gIG1hdHJpeGRyb3Bkb3duOiB7XG4gICAgcm9vdDogXCJ0YWJsZVwiLFxuICAgIGNlbGw6IFwic3ZfbWF0cml4X2NlbGxcIixcbiAgICBoZWFkZXJDZWxsOiBcInN2X21hdHJpeF9jZWxsX2hlYWRlclwiLFxuICAgIHJvdzogXCJzdl9tYXRyaXhfcm93XCIsXG4gICAgcm93QWRkaXRpb25hbDogXCJzdi1tYXRyaXhfX3Jvdy0tYWRkaXRpb25hbFwiLFxuICAgIGRldGFpbFJvdzogXCJzdl9tYXRyaXhfZGV0YWlsX3Jvd1wiLFxuICAgIGRldGFpbFJvd1RleHQ6IFwic3ZfbWF0cml4X2NlbGxfZGV0YWlsX3Jvd3RleHRcIixcbiAgICBkZXRhaWxDZWxsOiBcInN2X21hdHJpeF9jZWxsX2RldGFpbFwiLFxuICAgIGRldGFpbEJ1dHRvbjogXCJzdl9tYXRyaXhfY2VsbF9kZXRhaWxfYnV0dG9uXCIsXG4gICAgZGV0YWlsQnV0dG9uRXhwYW5kZWQ6IFwic3ZfbWF0cml4X2NlbGxfZGV0YWlsX2J1dHRvbl9leHBhbmRlZFwiLFxuICAgIGRldGFpbEljb246IFwic3ZfZGV0YWlsX3BhbmVsX2ljb25cIixcbiAgICBkZXRhaWxJY29uRXhwYW5kZWQ6IFwic3ZfZGV0YWlsX2V4cGFuZGVkXCIsXG4gICAgZGV0YWlsUGFuZWxDZWxsOiBcInN2X21hdHJpeF9jZWxsX2RldGFpbF9wYW5lbFwiLFxuICAgIGFjdGlvbnNDZWxsOiBcInN2X21hdHJpeF9jZWxsIHN2X21hdHJpeF9jZWxsX2FjdGlvbnNcIixcbiAgfSxcbiAgbWF0cml4ZHluYW1pYzoge1xuICAgIHJvb3Q6IFwidGFibGVcIixcbiAgICBidXR0b246IFwiYnV0dG9uXCIsXG4gICAgYnV0dG9uQWRkOiBcIlwiLFxuICAgIGJ1dHRvblJlbW92ZTogXCJcIixcbiAgICBpY29uQWRkOiBcIlwiLFxuICAgIGljb25SZW1vdmU6IFwiXCIsXG4gICAgaWNvbkRyYWc6IFwic3YtbWF0cml4ZHluYW1pY19fZHJhZy1pY29uXCIsXG4gICAgaGVhZGVyQ2VsbDogXCJzdl9tYXRyaXhfY2VsbF9oZWFkZXJcIixcbiAgICByb3c6IFwic3ZfbWF0cml4X3Jvd1wiLFxuICAgIGRldGFpbFJvdzogXCJzdl9tYXRyaXhfZGV0YWlsX3Jvd1wiLFxuICAgIGRldGFpbENlbGw6IFwic3ZfbWF0cml4X2NlbGxfZGV0YWlsXCIsXG4gICAgZGV0YWlsQnV0dG9uOiBcInN2X21hdHJpeF9jZWxsX2RldGFpbF9idXR0b25cIixcbiAgICBkZXRhaWxCdXR0b25FeHBhbmRlZDogXCJzdl9tYXRyaXhfY2VsbF9kZXRhaWxfYnV0dG9uX2V4cGFuZGVkXCIsXG4gICAgZGV0YWlsSWNvbjogXCJzdl9kZXRhaWxfcGFuZWxfaWNvblwiLFxuICAgIGRldGFpbEljb25FeHBhbmRlZDogXCJzdl9kZXRhaWxfZXhwYW5kZWRcIixcbiAgICBkZXRhaWxQYW5lbENlbGw6IFwic3ZfbWF0cml4X2NlbGxfZGV0YWlsX3BhbmVsXCIsXG4gICAgYWN0aW9uc0NlbGw6IFwic3ZfbWF0cml4X2NlbGwgc3ZfbWF0cml4X2NlbGxfYWN0aW9uc1wiLFxuICAgIGVtcHR5Um93c1NlY3Rpb246IFwic3ZfbWF0cml4X2VtcHR5X3Jvd3Nfc2VjdGlvblwiLFxuICAgIGVtcHR5Um93c1RleHQ6IFwic3ZfbWF0cml4X2VtcHR5X3Jvd3NfdGV4dFwiLFxuICAgIGVtcHR5Um93c0J1dHRvbjogXCJcIixcbiAgICBkcmFnRHJvcEdob3N0UG9zaXRpb25Ub3A6IFwic3YtbWF0cml4X19kcmFnLWRyb3AtZ2hvc3QtcG9zaXRpb24tdG9wXCIsXG4gICAgZHJhZ0Ryb3BHaG9zdFBvc2l0aW9uQm90dG9tOiBcInN2LW1hdHJpeF9fZHJhZy1kcm9wLWdob3N0LXBvc2l0aW9uLWJvdHRvbVwiLFxuICB9LFxuICBwYW5lbGR5bmFtaWM6IHtcbiAgICByb290OiBcIlwiLFxuICAgIG5hdmlnYXRpb246IFwic3YtcGFuZWxkeW5hbWljX19uYXZpZ2F0aW9uXCIsXG4gICAgcHJvZ3Jlc3NUb3A6IFwic3YtcGFuZWxkeW5hbWljX19wcm9ncmVzcyBzdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzLS10b3BcIixcbiAgICBwcm9ncmVzc0JvdHRvbTpcbiAgICAgIFwic3YtcGFuZWxkeW5hbWljX19wcm9ncmVzcyBzdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzLS1ib3R0b21cIixcbiAgICB0aXRsZTogXCJzdi10aXRsZSBzdi1xdWVzdGlvbl9fdGl0bGVcIixcbiAgICBidXR0b246IFwiYnV0dG9uXCIsXG4gICAgYnV0dG9uQWRkOiBcImJ1dHRvbiBzdi1wYW5lbGR5bmFtaWNfX2FkZC1idG5cIixcbiAgICBidXR0b25SZW1vdmU6IFwic3ZfcF9yZW1vdmVfYnRuXCIsXG4gICAgYnV0dG9uUmVtb3ZlUmlnaHQ6IFwiYnV0dG9uIHN2LXBhbmVsZHluYW1pY19fcmVtb3ZlLWJ0bi0tcmlnaHRcIixcbiAgICBidXR0b25QcmV2OiBcInN2LXBhbmVsZHluYW1pY19fcHJldi1idG5cIixcbiAgICBidXR0b25OZXh0OiBcInN2LXBhbmVsZHluYW1pY19fbmV4dC1idG5cIixcbiAgICBwcm9ncmVzc0NvbnRhaW5lcjogXCJzdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzLWNvbnRhaW5lclwiLFxuICAgIHByb2dyZXNzOiBcInN2LXByb2dyZXNzXCIsXG4gICAgcHJvZ3Jlc3NCYXI6IFwic3YtcHJvZ3Jlc3NfX2JhclwiLFxuICAgIHByb2dyZXNzVGV4dDogXCJzdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzLXRleHRcIixcbiAgICBwYW5lbFdyYXBwZXI6IFwic3ZfcF93cmFwcGVyXCIsXG4gICAgcGFuZWxXcmFwcGVySW5Sb3c6IFwic3ZfcF93cmFwcGVyX2luX3Jvd1wiLFxuICB9LFxuICBtdWx0aXBsZXRleHQ6IHtcbiAgICByb290OiBcInRhYmxlXCIsXG4gICAgaXRlbVRpdGxlOiBcIlwiLFxuICAgIGl0ZW1WYWx1ZTogXCJzdl9xX210X2l0ZW1fdmFsdWUgZm9ybS1jb250cm9sXCIsXG4gIH0sXG4gIHJhZGlvZ3JvdXA6IHtcbiAgICByb290OiBcInN2X3FjYmMgZm9ybS1pbmxpbmVcIixcbiAgICBpdGVtOiBcInJhZGlvXCIsXG4gICAgaXRlbUNoZWNrZWQ6IFwiY2hlY2tlZFwiLFxuICAgIGl0ZW1JbmxpbmU6IFwic3ZfcV9yYWRpb2dyb3VwX2lubGluZVwiLFxuICAgIGxhYmVsOiBcIlwiLFxuICAgIGxhYmVsQ2hlY2tlZDogXCJcIixcbiAgICBpdGVtQ29udHJvbDogXCJcIixcbiAgICBpdGVtRGVjb3JhdG9yOiBcInN2LWhpZGRlblwiLFxuICAgIGNvbnRyb2xMYWJlbDogXCJcIixcbiAgICBtYXRlcmlhbERlY29yYXRvcjogXCJjaXJjbGVcIixcbiAgICBvdGhlcjogXCJzdl9xX3JhZGlvZ3JvdXBfb3RoZXIgZm9ybS1jb250cm9sXCIsXG4gICAgY2xlYXJCdXR0b246IFwic3ZfcV9yYWRpb2dyb3VwX2NsZWFyIGJ1dHRvblwiLFxuICAgIGNvbHVtbjogXCJzdl9xX3NlbGVjdF9jb2x1bW5cIixcbiAgfSxcbiAgYnV0dG9uZ3JvdXA6IHtcbiAgICByb290OiBcInN2LWJ1dHRvbi1ncm91cFwiLFxuICAgIGl0ZW06IFwic3YtYnV0dG9uLWdyb3VwX19pdGVtXCIsXG4gICAgaXRlbUljb246IFwic3YtYnV0dG9uLWdyb3VwX19pdGVtLWljb25cIixcbiAgICBpdGVtRGVjb3JhdG9yOiBcInN2LWJ1dHRvbi1ncm91cF9faXRlbS1kZWNvcmF0b3JcIixcbiAgICBpdGVtQ2FwdGlvbjogXCJzdi1idXR0b24tZ3JvdXBfX2l0ZW0tY2FwdGlvblwiLFxuICAgIGl0ZW1Ib3ZlcjogXCJzdi1idXR0b24tZ3JvdXBfX2l0ZW0tLWhvdmVyXCIsXG4gICAgaXRlbVNlbGVjdGVkOiBcInN2LWJ1dHRvbi1ncm91cF9faXRlbS0tc2VsZWN0ZWRcIixcbiAgICBpdGVtRGlzYWJsZWQ6IFwic3YtYnV0dG9uLWdyb3VwX19pdGVtLS1kaXNhYmxlZFwiLFxuICAgIGl0ZW1Db250cm9sOiBcInN2LXZpc3VhbGx5aGlkZGVuXCIsXG4gIH0sXG4gIGltYWdlcGlja2VyOiB7XG4gICAgcm9vdDogXCJzdl9pbWdzZWxcIixcbiAgICBpdGVtOiBcInN2X3FfaW1nc2VsXCIsXG4gICAgaXRlbUNoZWNrZWQ6IFwiY2hlY2tlZFwiLFxuICAgIGl0ZW1JbmxpbmU6IFwic3ZfcV9pbWFnZXBpY2tlcl9pbmxpbmVcIixcbiAgICBsYWJlbDogXCJzdl9xX2ltZ3NlbF9sYWJlbFwiLFxuICAgIGl0ZW1Db250cm9sOiBcInN2X3FfaW1nc2VsX2NvbnRyb2xfaXRlbVwiLFxuICAgIGltYWdlOiBcInN2X3FfaW1nc2VsX2ltYWdlXCIsXG4gICAgaXRlbVRleHQ6IFwic3ZfcV9pbWdzZWxfdGV4dFwiLFxuICAgIGNsZWFyQnV0dG9uOiBcInN2X3FfcmFkaW9ncm91cF9jbGVhclwiLFxuICB9LFxuICByYXRpbmc6IHtcbiAgICByb290OiBcImJ0bi1ncm91cFwiLFxuICAgIGl0ZW06IFwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zZWNvbmRhcnlcIixcbiAgICBzZWxlY3RlZDogXCJhY3RpdmVcIixcbiAgICBtaW5UZXh0OiBcInN2X3FfcmF0aW5nX21pbl90ZXh0XCIsXG4gICAgaXRlbVRleHQ6IFwic3ZfcV9yYXRpbmdfaXRlbV90ZXh0XCIsXG4gICAgbWF4VGV4dDogXCJzdl9xX3JhdGluZ19tYXhfdGV4dFwiLFxuICAgIGRpc2FibGVkOiBcIlwiLFxuICB9LFxuICB0ZXh0OiBcImZvcm0tY29udHJvbFwiLFxuICBleHByZXNzaW9uOiBcImZvcm0tY29udHJvbFwiLFxuICBmaWxlOiB7XG4gICAgcm9vdDogXCJzdl9xX2ZpbGVcIixcbiAgICBwbGFjZWhvbGRlcklucHV0OiBcInN2X3FfZmlsZV9wbGFjZWhvbGRlclwiLFxuICAgIHByZXZpZXc6IFwic3ZfcV9maWxlX3ByZXZpZXdcIixcbiAgICByZW1vdmVCdXR0b246IFwic3ZfcV9maWxlX3JlbW92ZV9idXR0b25cIixcbiAgICBmaWxlSW5wdXQ6IFwic3ZfcV9maWxlX2lucHV0XCIsXG4gICAgcmVtb3ZlRmlsZTogXCJzdl9xX2ZpbGVfcmVtb3ZlXCIsXG4gICAgcmVtb3ZlRmlsZVN2ZzogXCJzdi1oaWRkZW5cIixcbiAgICBmaWxlRGVjb3JhdG9yOiBcInN2LWhpZGRlblwiLFxuICAgIGZpbGVTaWduQm90dG9tOiBcInN2LWhpZGRlblwiLFxuICAgIHJlbW92ZUJ1dHRvbkJvdHRvbTogXCJzdi1oaWRkZW5cIixcbiAgICBkcmFnQXJlYVBsYWNlaG9sZGVyOiBcInN2LWhpZGRlblwiLFxuICAgIGZpbGVMaXN0OiBcIlwiLFxuICAgIGRlZmF1bHRJbWFnZTogXCJzdi1oaWRkZW5cIlxuICB9LFxuICBzaWduYXR1cmVwYWQ6IHtcbiAgICByb290OiBcInN2X3Ffc2lnbmF0dXJlcGFkIHNqc19zcF9jb250YWluZXJcIixcbiAgICBjb250cm9sczogXCJzanNfc3BfY29udHJvbHNcIixcbiAgICBwbGFjZWhvbGRlcjogXCJzanNfc3BfcGxhY2Vob2xkZXJcIixcbiAgICBjbGVhckJ1dHRvbjogXCJzanNfc3BfY2xlYXJcIixcbiAgfSxcbiAgc2F2ZURhdGE6IHtcbiAgICByb290OiBcIlwiLFxuICAgIHNhdmluZzogXCJhbGVydCBhbGVydC1pbmZvXCIsXG4gICAgZXJyb3I6IFwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIsXG4gICAgc3VjY2VzczogXCJhbGVydCBhbGVydC1zdWNjZXNzXCIsXG4gICAgc2F2ZUFnYWluQnV0dG9uOiBcIlwiLFxuICB9LFxuICB3aW5kb3c6IHtcbiAgICByb290OiBcIm1vZGFsLWNvbnRlbnRcIixcbiAgICBib2R5OiBcIm1vZGFsLWJvZHlcIixcbiAgICBoZWFkZXI6IHtcbiAgICAgIHJvb3Q6IFwibW9kYWwtaGVhZGVyIHBhbmVsLXRpdGxlXCIsXG4gICAgICB0aXRsZTogXCJwdWxsLWxlZnRcIixcbiAgICAgIGJ1dHRvbjogXCJnbHlwaGljb24gcHVsbC1yaWdodFwiLFxuICAgICAgYnV0dG9uRXhwYW5kZWQ6IFwiZ2x5cGhpY29uIHB1bGwtcmlnaHQgZ2x5cGhpY29uLWNoZXZyb24tdXBcIixcbiAgICAgIGJ1dHRvbkNvbGxhcHNlZDogXCJnbHlwaGljb24gcHVsbC1yaWdodCBnbHlwaGljb24tY2hldnJvbi1kb3duXCIsXG4gICAgfSxcbiAgfSxcbn07XG4oPGFueT5zdXJ2ZXlDc3MpW1wiYm9vdHN0cmFwXCJdID0gZGVmYXVsdEJvb3RzdHJhcENzcztcbiIsImltcG9ydCB7IHN1cnZleUNzcyB9IGZyb20gXCIuL2Nzc3N0YW5kYXJkXCI7XG5cbmV4cG9ydCB2YXIgZGVmYXVsdEJvb3RzdHJhcE1hdGVyaWFsQ3NzID0ge1xuICByb290OiBcInN2X21haW4gc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzXCIsXG4gIGNvbnRhaW5lcjogXCJzdl9jb250YWluZXJcIixcbiAgaGVhZGVyOiBcImNhcmQtaGVhZGluZ1wiLFxuICBib2R5OiBcImNhcmQtYm9keVwiLFxuICBib2R5RW1wdHk6IFwiY2FyZC1ib2R5IHN2X2JvZHlfZW1wdHlcIixcbiAgZm9vdGVyOiBcImNhcmQtZm9vdGVyXCIsXG4gIHRpdGxlOiBcIlwiLFxuICBkZXNjcmlwdGlvbjogXCJcIixcbiAgbG9nbzogXCJzdl9sb2dvXCIsXG4gIGxvZ29JbWFnZTogXCJzdl9sb2dvX19pbWFnZVwiLFxuICBoZWFkZXJUZXh0OiBcInN2X2hlYWRlcl9fdGV4dFwiLFxuICBuYXZpZ2F0aW9uQnV0dG9uOiBcIlwiLFxuICBjb21wbGV0ZWRQYWdlOiBcIlwiLFxuICBuYXZpZ2F0aW9uOiB7XG4gICAgY29tcGxldGU6IFwiYnRuIHN2X2NvbXBsZXRlX2J0biBidG4tcHJpbWFyeVwiLFxuICAgIHByZXY6IFwiYnRuIHN2X3ByZXZfYnRuIGJ0bi1wcmltYXJ5XCIsXG4gICAgbmV4dDogXCJidG4gc3ZfbmV4dF9idG4gYnRuLXByaW1hcnlcIixcbiAgICBzdGFydDogXCJidG4gc3Zfc3RhcnRfYnRuIGJ0bi1wcmltYXJ5XCIsXG4gICAgcHJldmlldzogXCJidG4gc3ZfcHJldmlld19idG4gYnRuLXByaW1hcnlcIixcbiAgICBlZGl0OiBcImJ0biBzdl9lZGl0X2J0biBidG4tcHJpbWFyeVwiLFxuICB9LFxuICBwcm9ncmVzczogXCJwcm9ncmVzcyBjZW50ZXItYmxvY2sgbXgtYXV0byBtYi00XCIsXG4gIHByb2dyZXNzQmFyOiBcInByb2dyZXNzLWJhclwiLFxuICBwcm9ncmVzc1RleHRVbmRlckJhcjogXCJzdi1oaWRkZW5cIixcbiAgcHJvZ3Jlc3NCdXR0b25zQ29udGFpbmVyQ2VudGVyOiBcInN2X3Byb2dyZXNzLWJ1dHRvbnNfX2NvbnRhaW5lci1jZW50ZXJcIixcbiAgcHJvZ3Jlc3NCdXR0b25zQ29udGFpbmVyOiBcInN2X3Byb2dyZXNzLWJ1dHRvbnNfX2NvbnRhaW5lclwiLFxuICBwcm9ncmVzc0J1dHRvbnNJbWFnZUJ1dHRvbkxlZnQ6IFwic3ZfcHJvZ3Jlc3MtYnV0dG9uc19faW1hZ2UtYnV0dG9uLWxlZnRcIixcbiAgcHJvZ3Jlc3NCdXR0b25zSW1hZ2VCdXR0b25SaWdodDogXCJzdl9wcm9ncmVzcy1idXR0b25zX19pbWFnZS1idXR0b24tcmlnaHRcIixcbiAgcHJvZ3Jlc3NCdXR0b25zSW1hZ2VCdXR0b25IaWRkZW46IFwic3ZfcHJvZ3Jlc3MtYnV0dG9uc19faW1hZ2UtYnV0dG9uLS1oaWRkZW5cIixcbiAgcHJvZ3Jlc3NCdXR0b25zTGlzdENvbnRhaW5lcjogXCJzdl9wcm9ncmVzcy1idXR0b25zX19saXN0LWNvbnRhaW5lclwiLFxuICBwcm9ncmVzc0J1dHRvbnNMaXN0OiBcInN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3RcIixcbiAgcHJvZ3Jlc3NCdXR0b25zTGlzdEVsZW1lbnRQYXNzZWQ6IFwic3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdC1lbGVtZW50LS1wYXNzZWRcIixcbiAgcHJvZ3Jlc3NCdXR0b25zTGlzdEVsZW1lbnRDdXJyZW50OlxuICAgIFwic3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdC1lbGVtZW50LS1jdXJyZW50XCIsXG4gIHByb2dyZXNzQnV0dG9uc0xpc3RFbGVtZW50Tm9uQ2xpY2thYmxlOlxuICAgIFwic3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdC1lbGVtZW50LS1ub25jbGlja2FibGVcIixcbiAgcHJvZ3Jlc3NCdXR0b25zUGFnZVRpdGxlOiBcInN2X3Byb2dyZXNzLWJ1dHRvbnNfX3BhZ2UtdGl0bGVcIixcbiAgcHJvZ3Jlc3NCdXR0b25zUGFnZURlc2NyaXB0aW9uOiBcInN2X3Byb2dyZXNzLWJ1dHRvbnNfX3BhZ2UtZGVzY3JpcHRpb25cIixcbiAgcGFnZToge1xuICAgIHJvb3Q6IFwiXCIsXG4gICAgdGl0bGU6IFwiXCIsXG4gICAgZGVzY3JpcHRpb246IFwic21hbGxcIixcbiAgfSxcbiAgcGFnZVRpdGxlOiBcIlwiLFxuICBwYWdlRGVzY3JpcHRpb246IFwic21hbGxcIixcbiAgcm93OiBcInN2X3Jvd1wiLFxuICBxdWVzdGlvbjoge1xuICAgIG1haW5Sb290OiBcInN2X3FzdG4gZm9ybS1ncm91cCBibWQtZm9ybS1ncm91cFwiLFxuICAgIGZsb3dSb290OiBcInN2X3FfZmxvdyBmb3JtLWdyb3VwIGJtZC1mb3JtLWdyb3VwXCIsXG4gICAgaGVhZGVyOiBcIlwiLFxuICAgIGhlYWRlckxlZnQ6IFwidGl0bGUtbGVmdFwiLFxuICAgIGNvbnRlbnQ6IFwiXCIsXG4gICAgY29udGVudExlZnQ6IFwiY29udGVudC1sZWZ0XCIsXG4gICAgdGl0bGVMZWZ0Um9vdDogXCJzdl9xc3RuX2xlZnRcIixcbiAgICByZXF1aXJlZFRleHQ6IFwic3ZfcV9yZXF1aXJlZF90ZXh0XCIsXG4gICAgdGl0bGU6IFwiXCIsXG4gICAgdGl0bGVFeHBhbmRhYmxlOiBcInN2X3FfdGl0bGVfZXhwYW5kYWJsZVwiLFxuICAgIG51bWJlcjogXCJzdl9xX251bVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcInNtYWxsXCIsXG4gICAgZGVzY3JpcHRpb25VbmRlcklucHV0OiBcInNtYWxsXCIsXG4gICAgY29tbWVudDogXCJmb3JtLWNvbnRyb2xcIixcbiAgICByZXF1aXJlZDogXCJcIixcbiAgICB0aXRsZVJlcXVpcmVkOiBcIlwiLFxuICAgIGhhc0Vycm9yOiBcImhhcy1lcnJvclwiLFxuICAgIGluZGVudDogMjAsXG4gICAgZm9ybUdyb3VwOiBcImZvcm0tZ3JvdXAgYm1kLWZvcm0tZ3JvdXBcIixcbiAgfSxcbiAgcGFuZWw6IHtcbiAgICB0aXRsZTogXCJzdl9wX3RpdGxlXCIsXG4gICAgdGl0bGVFeHBhbmRhYmxlOiBcInN2X3BfdGl0bGVfZXhwYW5kYWJsZVwiLFxuICAgIHRpdGxlT25FcnJvcjogXCJcIixcbiAgICBpY29uOiBcInN2X3BhbmVsX2ljb25cIixcbiAgICBpY29uRXhwYW5kZWQ6IFwic3ZfZXhwYW5kZWRcIixcbiAgICBkZXNjcmlwdGlvbjogXCJzbWFsbCBzdl9wX2Rlc2NyaXB0aW9uXCIsXG4gICAgY29udGFpbmVyOiBcInN2X3BfY29udGFpbmVyXCIsXG4gICAgZm9vdGVyOiBcInN2X3BfZm9vdGVyXCIsXG4gICAgbnVtYmVyOiBcInN2X3FfbnVtXCIsXG4gICAgcmVxdWlyZWRUZXh0OiBcInN2X3FfcmVxdWlyZWRfdGV4dFwiLFxuICB9LFxuICBlcnJvcjoge1xuICAgIHJvb3Q6IFwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIsXG4gICAgaWNvbjogXCJnbHlwaGljb24gZ2x5cGhpY29uLWV4Y2xhbWF0aW9uLXNpZ25cIixcbiAgICBpdGVtOiBcIlwiLFxuICAgIGxvY2F0aW9uVG9wOiBcInN2X3FzdG5fZXJyb3JfdG9wXCIsXG4gICAgbG9jYXRpb25Cb3R0b206IFwic3ZfcXN0bl9lcnJvcl9ib3R0b21cIixcbiAgfSxcblxuICBib29sZWFuOiB7XG4gICAgcm9vdDogXCJzdl9xYmxuIGNoZWNrYm94XCIsXG4gICAgaXRlbTogXCJzdi1ib29sZWFuXCIsXG4gICAgY29udHJvbDogXCJzdi12aXN1YWxseWhpZGRlblwiLFxuICAgIGl0ZW1DaGVja2VkOiBcInN2LWJvb2xlYW4tLWNoZWNrZWQgY2hlY2tlZFwiLFxuICAgIGl0ZW1JbmRldGVybWluYXRlOiBcInN2LWJvb2xlYW4tLWluZGV0ZXJtaW5hdGVcIixcbiAgICBpdGVtRGlzYWJsZWQ6IFwic3YtYm9vbGVhbi0tZGlzYWJsZWRcIixcbiAgICBzd2l0Y2g6IFwic3YtYm9vbGVhbl9fc3dpdGNoXCIsXG4gICAgc2xpZGVyOiBcInN2LWJvb2xlYW5fX3NsaWRlclwiLFxuICAgIHNsaWRlclRleHQ6IFwic3YtaGlkZGVuXCIsXG4gICAgbGFiZWw6IFwic3YtYm9vbGVhbl9fbGFiZWwgXCIsXG4gICAgZGlzYWJsZWRMYWJlbDogXCJzdi1ib29sZWFuX19sYWJlbC0tZGlzYWJsZWRcIixcbiAgICBtYXRlcmlhbERlY29yYXRvcjogXCJzdi1pdGVtX19kZWNvcmF0b3Igc3YtYm9vbGVhbl9fZGVjb3JhdG9yIFwiLFxuICAgIGl0ZW1EZWNvcmF0b3I6IFwic3YtaXRlbV9fc3ZnICBzdi1ib29sZWFuX19zdmdcIixcbiAgICBjaGVja2VkUGF0aDogXCJzdi1ib29sZWFuX19jaGVja2VkLXBhdGhcIixcbiAgICB1bmNoZWNrZWRQYXRoOiBcInN2LWJvb2xlYW5fX3VuY2hlY2tlZC1wYXRoXCIsXG4gICAgaW5kZXRlcm1pbmF0ZVBhdGg6IFwic3YtYm9vbGVhbl9faW5kZXRlcm1pbmF0ZS1wYXRoXCIsXG4gIH0sXG4gIGNoZWNrYm94OiB7XG4gICAgcm9vdDogXCJzdl9xY2J4XCIsXG4gICAgaXRlbTogXCJjaGVja2JveFwiLFxuICAgIGl0ZW1DaGVja2VkOiBcImNoZWNrZWRcIixcbiAgICBpdGVtU2VsZWN0QWxsOiBcInN2X3FfY2hlY2tib3hfc2VsZWN0YWxsXCIsXG4gICAgaXRlbU5vbmU6IFwic3ZfcV9jaGVja2JveF9ub25lXCIsXG4gICAgaXRlbUlubGluZTogXCJzdl9xX2NoZWNrYm94X2lubGluZVwiLFxuICAgIGl0ZW1EZWNvcmF0b3I6IFwic3YtaGlkZGVuXCIsXG4gICAgaXRlbUNvbnRyb2w6IFwiXCIsXG4gICAgbGFiZWw6IFwiXCIsXG4gICAgbGFiZWxDaGVja2VkOiBcIlwiLFxuICAgIGNvbnRyb2xMYWJlbDogXCJcIixcbiAgICBtYXRlcmlhbERlY29yYXRvcjogXCJjaGVja2JveC1kZWNvcmF0b3JcIixcbiAgICBvdGhlcjogXCJzdl9xX2NoZWNrYm94X290aGVyIGZvcm0tY29udHJvbFwiLFxuICAgIGNvbHVtbjogXCJzdl9xX3NlbGVjdF9jb2x1bW5cIixcbiAgfSxcbiAgcmFua2luZzoge1xuICAgIHJvb3Q6IFwic3YtcmFua2luZ1wiLFxuICAgIHJvb3RNb2JpbGVNb2Q6IFwic3YtcmFua2luZy0tbW9iaWxlXCIsXG4gICAgcm9vdERyYWdNb2Q6IFwic3YtcmFua2luZy0tZHJhZ1wiLFxuICAgIGl0ZW06IFwic3YtcmFua2luZy1pdGVtXCIsXG4gICAgaXRlbUNvbnRlbnQ6IFwic3YtcmFua2luZy1pdGVtX19jb250ZW50XCIsXG4gICAgaXRlbUluZGV4OiBcInN2LXJhbmtpbmctaXRlbV9faW5kZXhcIixcbiAgICAvLyBpdGVtVGV4dDogXCJzdi1yYW5raW5nLWl0ZW1fX3RleHRcIixcbiAgICBjb250cm9sTGFiZWw6IFwic3YtcmFua2luZy1pdGVtX190ZXh0XCIsXG4gICAgaXRlbUdob3N0Tm9kZTogXCJzdi1yYW5raW5nLWl0ZW1fX2dob3N0XCIsXG4gICAgaXRlbUljb25Db250YWluZXI6IFwic3YtcmFua2luZy1pdGVtX19pY29uLWNvbnRhaW5lclwiLFxuICAgIGl0ZW1JY29uOiBcInN2LXJhbmtpbmctaXRlbV9faWNvblwiLFxuICAgIGl0ZW1JY29uSG92ZXJNb2Q6IFwic3YtcmFua2luZy1pdGVtX19pY29uLS1ob3ZlclwiLFxuICAgIGl0ZW1JY29uRm9jdXNNb2Q6IFwic3YtcmFua2luZy1pdGVtX19pY29uLS1mb2N1c1wiLFxuICAgIGl0ZW1HaG9zdE1vZDogXCJzdi1yYW5raW5nLWl0ZW0tLWdob3N0XCIsXG4gICAgaXRlbURyYWdNb2Q6IFwic3YtcmFua2luZy1pdGVtLS1kcmFnXCIsXG4gIH0sXG4gIGNvbW1lbnQ6IFwiZm9ybS1jb250cm9sXCIsXG4gIGRyb3Bkb3duOiB7XG4gICAgcm9vdDogXCJcIixcbiAgICBjb250cm9sOiBcImZvcm0tY29udHJvbFwiLFxuICAgIG90aGVyOiBcInN2X3FfZGRfb3RoZXIgZm9ybS1jb250cm9sXCIsXG4gIH0sXG4gIGh0bWw6IHsgcm9vdDogXCJcIiB9LFxuICBpbWFnZTogeyByb290OiBcInN2X3FfaW1hZ2VcIiwgaW1hZ2U6IFwic3ZfaW1hZ2VfaW1hZ2VcIiB9LFxuICBtYXRyaXg6IHtcbiAgICByb290OiBcInRhYmxlIHN2X3FfbWF0cml4XCIsXG4gICAgcm93OiBcImZvcm0tZ3JvdXAgYm1kLWZvcm0tZ3JvdXBcIixcbiAgICBsYWJlbDogXCJzdl9xX21fbGFiZWwgcmFkaW8taW5saW5lXCIsXG4gICAgY2VsbFRleHQ6IFwic3ZfcV9tX2NlbGxfdGV4dFwiLFxuICAgIGNlbGxUZXh0U2VsZWN0ZWQ6IFwic3ZfcV9tX2NlbGxfc2VsZWN0ZWQgYmctcHJpbWFyeVwiLFxuICAgIGNlbGxMYWJlbDogXCJzdl9xX21fY2VsbF9sYWJlbFwiLFxuICAgIGl0ZW1WYWx1ZTogXCJmb3JtLWNvbnRyb2xcIixcbiAgICBpdGVtQ2hlY2tlZDogXCJjaGVja2VkXCIsXG4gICAgaXRlbURlY29yYXRvcjogXCJzdi1oaWRkZW5cIixcbiAgICBtYXRlcmlhbERlY29yYXRvcjogXCJibWQtcmFkaW9cIixcbiAgfSxcbiAgbWF0cml4ZHJvcGRvd246IHtcbiAgICByb290OiBcInRhYmxlXCIsXG4gICAgaXRlbVZhbHVlOiBcImZvcm0tZ3JvdXAgYm1kLWZvcm0tZ3JvdXBcIixcbiAgICBoZWFkZXJDZWxsOiBcInN2X21hdHJpeF9jZWxsX2hlYWRlclwiLFxuICAgIHJvdzogXCJzdl9tYXRyaXhfcm93XCIsXG4gICAgcm93QWRkaXRpb25hbDogXCJzdi1tYXRyaXhfX3Jvdy0tYWRkaXRpb25hbFwiLFxuICAgIGRldGFpbFJvdzogXCJzdl9tYXRyaXhfZGV0YWlsX3Jvd1wiLFxuICAgIGRldGFpbFJvd1RleHQ6IFwic3ZfbWF0cml4X2NlbGxfZGV0YWlsX3Jvd3RleHRcIixcbiAgICBkZXRhaWxDZWxsOiBcInN2X21hdHJpeF9jZWxsX2RldGFpbFwiLFxuICAgIGRldGFpbEJ1dHRvbjogXCJzdl9tYXRyaXhfY2VsbF9kZXRhaWxfYnV0dG9uXCIsXG4gICAgZGV0YWlsQnV0dG9uRXhwYW5kZWQ6IFwic3ZfbWF0cml4X2NlbGxfZGV0YWlsX2J1dHRvbl9leHBhbmRlZFwiLFxuICAgIGRldGFpbEljb246IFwic3ZfZGV0YWlsX3BhbmVsX2ljb25cIixcbiAgICBkZXRhaWxJY29uRXhwYW5kZWQ6IFwic3ZfZGV0YWlsX2V4cGFuZGVkXCIsXG4gICAgZGV0YWlsUGFuZWxDZWxsOiBcInN2X21hdHJpeF9jZWxsX2RldGFpbF9wYW5lbFwiLFxuICAgIGFjdGlvbnNDZWxsOiBcInN2X21hdHJpeF9jZWxsIHN2X21hdHJpeF9jZWxsX2FjdGlvbnNcIixcbiAgfSxcbiAgbWF0cml4ZHluYW1pYzoge1xuICAgIG1haW5Sb290OiBcInN2X3FzdG5cIixcbiAgICBmbG93Um9vdDogXCJzdl9xX2Zsb3dcIixcbiAgICByb290OiBcInRhYmxlXCIsXG4gICAgYnV0dG9uOiBcImJ0biBidG4tcHJpbWFyeVwiLFxuICAgIGl0ZW1WYWx1ZTogXCJmb3JtLWdyb3VwIGJtZC1mb3JtLWdyb3VwXCIsXG4gICAgYnV0dG9uQWRkOiBcIlwiLFxuICAgIGJ1dHRvblJlbW92ZTogXCJcIixcbiAgICBpY29uQWRkOiBcIlwiLFxuICAgIGljb25SZW1vdmU6IFwiXCIsXG4gICAgaWNvbkRyYWc6IFwic3YtbWF0cml4ZHluYW1pY19fZHJhZy1pY29uXCIsXG4gICAgaGVhZGVyQ2VsbDogXCJzdl9tYXRyaXhfY2VsbF9oZWFkZXJcIixcbiAgICByb3c6IFwic3ZfbWF0cml4X3Jvd1wiLFxuICAgIGRldGFpbFJvdzogXCJzdl9tYXRyaXhfZGV0YWlsX3Jvd1wiLFxuICAgIGRldGFpbENlbGw6IFwic3ZfbWF0cml4X2NlbGxfZGV0YWlsXCIsXG4gICAgZGV0YWlsQnV0dG9uOiBcInN2X21hdHJpeF9jZWxsX2RldGFpbF9idXR0b25cIixcbiAgICBkZXRhaWxCdXR0b25FeHBhbmRlZDogXCJzdl9tYXRyaXhfY2VsbF9kZXRhaWxfYnV0dG9uX2V4cGFuZGVkXCIsXG4gICAgZGV0YWlsSWNvbjogXCJzdl9kZXRhaWxfcGFuZWxfaWNvblwiLFxuICAgIGRldGFpbEljb25FeHBhbmRlZDogXCJzdl9kZXRhaWxfZXhwYW5kZWRcIixcbiAgICBkZXRhaWxQYW5lbENlbGw6IFwic3ZfbWF0cml4X2NlbGxfZGV0YWlsX3BhbmVsXCIsXG4gICAgYWN0aW9uc0NlbGw6IFwic3ZfbWF0cml4X2NlbGwgc3ZfbWF0cml4X2NlbGxfYWN0aW9uc1wiLFxuICAgIGVtcHR5Um93c1NlY3Rpb246IFwic3ZfbWF0cml4X2VtcHR5X3Jvd3Nfc2VjdGlvblwiLFxuICAgIGVtcHR5Um93c1RleHQ6IFwic3ZfbWF0cml4X2VtcHR5X3Jvd3NfdGV4dFwiLFxuICAgIGVtcHR5Um93c0J1dHRvbjogXCJcIixcbiAgICBkcmFnRHJvcEdob3N0UG9zaXRpb25Ub3A6IFwic3YtbWF0cml4X19kcmFnLWRyb3AtZ2hvc3QtcG9zaXRpb24tdG9wXCIsXG4gICAgZHJhZ0Ryb3BHaG9zdFBvc2l0aW9uQm90dG9tOiBcInN2LW1hdHJpeF9fZHJhZy1kcm9wLWdob3N0LXBvc2l0aW9uLWJvdHRvbVwiLFxuICB9LFxuICBwYW5lbGR5bmFtaWM6IHtcbiAgICByb290OiBcIlwiLFxuICAgIG5hdmlnYXRpb246IFwic3YtcGFuZWxkeW5hbWljX19uYXZpZ2F0aW9uXCIsXG4gICAgcHJvZ3Jlc3NUb3A6IFwic3YtcGFuZWxkeW5hbWljX19wcm9ncmVzcyBzdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzLS10b3BcIixcbiAgICBwcm9ncmVzc0JvdHRvbTpcbiAgICAgIFwic3YtcGFuZWxkeW5hbWljX19wcm9ncmVzcyBzdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzLS1ib3R0b21cIixcbiAgICB0aXRsZTogXCJzdi10aXRsZSBzdi1xdWVzdGlvbl9fdGl0bGVcIixcbiAgICBidXR0b246IFwiYnV0dG9uXCIsXG4gICAgYnV0dG9uQWRkOiBcImJ1dHRvbiBzdi1wYW5lbGR5bmFtaWNfX2FkZC1idG4gYnRuIGJ0bi1wcmltYXJ5XCIsXG4gICAgYnV0dG9uUmVtb3ZlOiBcImJ1dHRvbiBzdi1wYW5lbGR5bmFtaWNfX3JlbW92ZS1idG4gYnRuIGJ0bi1wcmltYXJ5XCIsXG4gICAgYnV0dG9uUmVtb3ZlUmlnaHQ6IFwic3YtcGFuZWxkeW5hbWljX19yZW1vdmUtYnRuLS1yaWdodFwiLFxuICAgIGJ1dHRvblByZXY6IFwic3YtcGFuZWxkeW5hbWljX19wcmV2LWJ0blwiLFxuICAgIGJ1dHRvbk5leHQ6IFwic3YtcGFuZWxkeW5hbWljX19uZXh0LWJ0blwiLFxuICAgIHByb2dyZXNzQ29udGFpbmVyOiBcInN2LXBhbmVsZHluYW1pY19fcHJvZ3Jlc3MtY29udGFpbmVyXCIsXG4gICAgcHJvZ3Jlc3M6IFwic3YtcHJvZ3Jlc3NcIixcbiAgICBwcm9ncmVzc0JhcjogXCJzdi1wcm9ncmVzc19fYmFyXCIsXG4gICAgcHJvZ3Jlc3NUZXh0OiBcInN2LXBhbmVsZHluYW1pY19fcHJvZ3Jlc3MtdGV4dFwiLFxuICAgIHBhbmVsV3JhcHBlcjogXCJzdl9wX3dyYXBwZXJcIixcbiAgICBwYW5lbFdyYXBwZXJJblJvdzogXCJzdl9wX3dyYXBwZXJfaW5fcm93XCIsXG4gIH0sXG4gIG11bHRpcGxldGV4dDoge1xuICAgIHJvb3Q6IFwidGFibGVcIixcbiAgICBpdGVtVGl0bGU6IFwiXCIsXG4gICAgcm93OiBcImZvcm0tZ3JvdXAgYm1kLWZvcm0tZ3JvdXBcIixcbiAgICBpdGVtVmFsdWU6IFwic3ZfcV9tdF9pdGVtX3ZhbHVlIGZvcm0tY29udHJvbFwiLFxuICB9LFxuICByYWRpb2dyb3VwOiB7XG4gICAgcm9vdDogXCJcIixcbiAgICBpdGVtOiBcInJhZGlvXCIsXG4gICAgaXRlbUNoZWNrZWQ6IFwiY2hlY2tlZFwiLFxuICAgIGl0ZW1JbmxpbmU6IFwic3ZfcV9yYWRpb2dyb3VwX2lubGluZVwiLFxuICAgIGl0ZW1EZWNvcmF0b3I6IFwic3YtaGlkZGVuXCIsXG4gICAgbGFiZWw6IFwiXCIsXG4gICAgbGFiZWxDaGVja2VkOiBcIlwiLFxuICAgIGl0ZW1Db250cm9sOiBcIlwiLFxuICAgIGNvbnRyb2xMYWJlbDogXCJzdl9xX3JhZGlvZ3JvdXBfY29udHJvbF9sYWJlbFwiLFxuICAgIG1hdGVyaWFsRGVjb3JhdG9yOiBcImJtZC1yYWRpb1wiLFxuICAgIG90aGVyOiBcInN2X3FfcmFkaW9ncm91cF9vdGhlciBmb3JtLWNvbnRyb2xcIixcbiAgICBjbGVhckJ1dHRvbjogXCJzdl9xX3JhZGlvZ3JvdXBfY2xlYXIgYnV0dG9uIGJ0biBidG4tcHJpbWFyeVwiLFxuICAgIGNvbHVtbjogXCJzdl9xX3NlbGVjdF9jb2x1bW5cIixcbiAgfSxcbiAgYnV0dG9uZ3JvdXA6IHtcbiAgICByb290OiBcInN2LWJ1dHRvbi1ncm91cFwiLFxuICAgIGl0ZW06IFwic3YtYnV0dG9uLWdyb3VwX19pdGVtXCIsXG4gICAgaXRlbUljb246IFwic3YtYnV0dG9uLWdyb3VwX19pdGVtLWljb25cIixcbiAgICBpdGVtRGVjb3JhdG9yOiBcInN2LWJ1dHRvbi1ncm91cF9faXRlbS1kZWNvcmF0b3JcIixcbiAgICBpdGVtQ2FwdGlvbjogXCJzdi1idXR0b24tZ3JvdXBfX2l0ZW0tY2FwdGlvblwiLFxuICAgIGl0ZW1TZWxlY3RlZDogXCJzdi1idXR0b24tZ3JvdXBfX2l0ZW0tLXNlbGVjdGVkXCIsXG4gICAgaXRlbUhvdmVyOiBcInN2LWJ1dHRvbi1ncm91cF9faXRlbS0taG92ZXJcIixcbiAgICBpdGVtRGlzYWJsZWQ6IFwic3YtYnV0dG9uLWdyb3VwX19pdGVtLS1kaXNhYmxlZFwiLFxuICAgIGl0ZW1Db250cm9sOiBcInN2LXZpc3VhbGx5aGlkZGVuXCIsXG4gIH0sXG4gIGltYWdlcGlja2VyOiB7XG4gICAgcm9vdDogXCJzdl9pbWdzZWxcIixcbiAgICBpdGVtOiBcInN2X3FfaW1nc2VsXCIsXG4gICAgaXRlbUNoZWNrZWQ6IFwiY2hlY2tlZFwiLFxuICAgIGl0ZW1JbmxpbmU6IFwic3ZfcV9pbWFnZXBpY2tlcl9pbmxpbmVcIixcbiAgICBsYWJlbDogXCJzdl9xX2ltZ3NlbF9sYWJlbFwiLFxuICAgIGl0ZW1Db250cm9sOiBcInN2X3FfaW1nc2VsX2NvbnRyb2xfaXRlbVwiLFxuICAgIGltYWdlOiBcInN2X3FfaW1nc2VsX2ltYWdlXCIsXG4gICAgaXRlbVRleHQ6IFwic3ZfcV9pbWdzZWxfdGV4dFwiLFxuICAgIGNsZWFyQnV0dG9uOiBcInN2X3FfcmFkaW9ncm91cF9jbGVhclwiLFxuICB9LFxuICByYXRpbmc6IHtcbiAgICByb290OiBcImJ0bi1ncm91cFwiLFxuICAgIGl0ZW06IFwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zZWNvbmRhcnlcIixcbiAgICBzZWxlY3RlZDogXCJhY3RpdmVcIixcbiAgICBtaW5UZXh0OiBcInN2X3FfcmF0aW5nX21pbl90ZXh0XCIsXG4gICAgaXRlbVRleHQ6IFwic3ZfcV9yYXRpbmdfaXRlbV90ZXh0XCIsXG4gICAgbWF4VGV4dDogXCJzdl9xX3JhdGluZ19tYXhfdGV4dFwiLFxuICAgIGRpc2FibGVkOiBcIlwiLFxuICB9LFxuICB0ZXh0OiBcImZvcm0tY29udHJvbFwiLFxuICBleHByZXNzaW9uOiBcImZvcm0tY29udHJvbFwiLFxuICBmaWxlOiB7XG4gICAgcm9vdDogXCJmb3JtLWdyb3VwIGJtZC1mb3JtLWdyb3VwIGlzLWZpbGVpbnB1dCBzdl9xX2ZpbGVcIixcbiAgICBwbGFjZWhvbGRlcklucHV0OiBcIlwiLFxuICAgIHByZXZpZXc6IFwic3ZfcV9maWxlX3ByZXZpZXdcIixcbiAgICByZW1vdmVCdXR0b246IFwic3ZfcV9maWxlX3JlbW92ZV9idXR0b25cIixcbiAgICBmaWxlSW5wdXQ6IFwic3ZfcV9maWxlX2lucHV0XCIsXG4gICAgcmVtb3ZlRmlsZTogXCJzdl9xX2ZpbGVfcmVtb3ZlXCIsXG4gICAgcmVtb3ZlRmlsZVN2ZzogXCJzdi1oaWRkZW5cIixcbiAgICBmaWxlRGVjb3JhdG9yOiBcInN2LWhpZGRlblwiLFxuICAgIGZpbGVTaWduQm90dG9tOiBcInN2LWhpZGRlblwiLFxuICAgIHJlbW92ZUJ1dHRvbkJvdHRvbTogXCJzdi1oaWRkZW5cIixcbiAgICBkcmFnQXJlYVBsYWNlaG9sZGVyOiBcInN2LWhpZGRlblwiLFxuICAgIGZpbGVMaXN0OiBcIlwiLFxuICAgIGRlZmF1bHRJbWFnZTogXCJzdi1oaWRkZW5cIlxuICB9LFxuICBzaWduYXR1cmVwYWQ6IHtcbiAgICByb290OiBcInN2X3Ffc2lnbmF0dXJlcGFkIHNqc19zcF9jb250YWluZXJcIixcbiAgICBjb250cm9sczogXCJzanNfc3BfY29udHJvbHNcIixcbiAgICBwbGFjZWhvbGRlcjogXCJzanNfc3BfcGxhY2Vob2xkZXJcIixcbiAgICBjbGVhckJ1dHRvbjogXCJzanNfc3BfY2xlYXJcIixcbiAgfSxcbiAgc2F2ZURhdGE6IHtcbiAgICByb290OiBcIlwiLFxuICAgIHNhdmluZzogXCJhbGVydCBhbGVydC1pbmZvXCIsXG4gICAgZXJyb3I6IFwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIsXG4gICAgc3VjY2VzczogXCJhbGVydCBhbGVydC1zdWNjZXNzXCIsXG4gICAgc2F2ZUFnYWluQnV0dG9uOiBcIlwiLFxuICB9LFxuICB3aW5kb3c6IHtcbiAgICByb290OiBcIm1vZGFsLWNvbnRlbnRcIixcbiAgICBib2R5OiBcIm1vZGFsLWJvZHlcIixcbiAgICBoZWFkZXI6IHtcbiAgICAgIHJvb3Q6IFwibW9kYWwtaGVhZGVyIGNhcmQtdGl0bGVcIixcbiAgICAgIHRpdGxlOiBcInB1bGwtbGVmdFwiLFxuICAgICAgYnV0dG9uOiBcImdseXBoaWNvbiBwdWxsLXJpZ2h0XCIsXG4gICAgICBidXR0b25FeHBhbmRlZDogXCJnbHlwaGljb24gcHVsbC1yaWdodCBnbHlwaGljb24tY2hldnJvbi11cFwiLFxuICAgICAgYnV0dG9uQ29sbGFwc2VkOiBcImdseXBoaWNvbiBwdWxsLXJpZ2h0IGdseXBoaWNvbi1jaGV2cm9uLWRvd25cIixcbiAgICB9LFxuICB9LFxufTtcbig8YW55PnN1cnZleUNzcylbXCJib290c3RyYXBtYXRlcmlhbFwiXSA9IGRlZmF1bHRCb290c3RyYXBNYXRlcmlhbENzcztcbiIsImltcG9ydCB7IHN1cnZleUNzcyB9IGZyb20gXCIuL2Nzc3N0YW5kYXJkXCI7XG5leHBvcnQgdmFyIG1vZGVybkNzcyA9IHtcbiAgcm9vdDogXCJzdi1yb290LW1vZGVyblwiLFxuICBjb250YWluZXI6IFwic3YtY29udGFpbmVyLW1vZGVyblwiLFxuICBoZWFkZXI6IFwic3YtdGl0bGUgc3YtY29udGFpbmVyLW1vZGVybl9fdGl0bGVcIixcbiAgYm9keTogXCJzdi1ib2R5XCIsXG4gIGJvZHlFbXB0eTogXCJzdi1ib2R5IHN2LWJvZHktLWVtcHR5XCIsXG4gIGZvb3RlcjogXCJzdi1mb290ZXIgc3YtYm9keV9fZm9vdGVyIHN2LWNsZWFyZml4XCIsXG4gIHRpdGxlOiBcIlwiLFxuICBkZXNjcmlwdGlvbjogXCJcIixcbiAgbG9nbzogXCJzdi1sb2dvXCIsXG4gIGxvZ29JbWFnZTogXCJzdi1sb2dvX19pbWFnZVwiLFxuICBoZWFkZXJUZXh0OiBcInN2LWhlYWRlcl9fdGV4dFwiLFxuICBuYXZpZ2F0aW9uQnV0dG9uOiBcIlwiLFxuICBjb21wbGV0ZWRQYWdlOiBcInN2LWNvbXBsZXRlZHBhZ2VcIixcbiAgbmF2aWdhdGlvbjoge1xuICAgIGNvbXBsZXRlOiBcInN2LWJ0biBzdi1mb290ZXJfX2NvbXBsZXRlLWJ0blwiLFxuICAgIHByZXY6IFwic3YtYnRuIHN2LWZvb3Rlcl9fcHJldi1idG5cIixcbiAgICBuZXh0OiBcInN2LWJ0biBzdi1mb290ZXJfX25leHQtYnRuXCIsXG4gICAgc3RhcnQ6IFwic3YtYnRuIHN2LWZvb3Rlcl9fc3RhcnQtYnRuXCIsXG4gICAgcHJldmlldzogXCJzdi1idG4gc3YtZm9vdGVyX19wcmV2aWV3LWJ0blwiLFxuICAgIGVkaXQ6IFwic3YtYnRuIHN2LWZvb3Rlcl9fZWRpdC1idG5cIixcbiAgfSxcbiAgcGFuZWw6IHtcbiAgICB0aXRsZTogXCJzdi10aXRsZSBzdi1wYW5lbF9fdGl0bGVcIixcbiAgICB0aXRsZUV4cGFuZGFibGU6IFwic3YtcGFuZWxfX3RpdGxlLS1leHBhbmRhYmxlXCIsXG4gICAgdGl0bGVPbkVycm9yOiBcInN2LXBhbmVsX190aXRsZS0tZXJyb3JcIixcbiAgICBkZXNjcmlwdGlvbjogXCJzdi1kZXNjcmlwdGlvbiBzdi1wYW5lbF9fZGVzY3JpcHRpb25cIixcbiAgICBjb250YWluZXI6IFwic3YtcGFuZWwgc3Ytcm93X19wYW5lbFwiLFxuICAgIGNvbnRlbnQ6IFwic3YtcGFuZWxfX2NvbnRlbnRcIixcbiAgICBpY29uOiBcInN2LXBhbmVsX19pY29uXCIsXG4gICAgaWNvbkV4cGFuZGVkOiBcInN2LXBhbmVsX19pY29uLS1leHBhbmRlZFwiLFxuICAgIGZvb3RlcjogXCJzdi1wYW5lbF9fZm9vdGVyXCIsXG4gICAgcmVxdWlyZWRUZXh0OiBcInN2LXBhbmVsX19yZXF1aXJlZC10ZXh0XCIsXG4gICAgbnVtYmVyOiBcInN2LXF1ZXN0aW9uX19udW1cIixcbiAgfSxcbiAgcGFuZWxkeW5hbWljOiB7XG4gICAgcm9vdDogXCJzdi1wYW5lbGR5bmFtaWNcIixcbiAgICBuYXZpZ2F0aW9uOiBcInN2LXBhbmVsZHluYW1pY19fbmF2aWdhdGlvblwiLFxuICAgIHRpdGxlOiBcInN2LXRpdGxlIHN2LXF1ZXN0aW9uX190aXRsZVwiLFxuICAgIGJ1dHRvbjogXCJzdi1idG5cIixcbiAgICBidXR0b25SZW1vdmU6IFwic3YtcGFuZWxkeW5hbWljX19yZW1vdmUtYnRuXCIsXG4gICAgYnV0dG9uUmVtb3ZlUmlnaHQ6IFwic3YtcGFuZWxkeW5hbWljX19yZW1vdmUtYnRuLS1yaWdodFwiLFxuICAgIGJ1dHRvbkFkZDogXCJzdi1wYW5lbGR5bmFtaWNfX2FkZC1idG5cIixcbiAgICBwcm9ncmVzc1RvcDogXCJzdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzIHN2LXBhbmVsZHluYW1pY19fcHJvZ3Jlc3MtLXRvcFwiLFxuICAgIHByb2dyZXNzQm90dG9tOlxuICAgICAgXCJzdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzIHN2LXBhbmVsZHluYW1pY19fcHJvZ3Jlc3MtLWJvdHRvbVwiLFxuICAgIGJ1dHRvblByZXY6IFwic3YtcGFuZWxkeW5hbWljX19wcmV2LWJ0blwiLFxuICAgIGJ1dHRvbk5leHQ6IFwic3YtcGFuZWxkeW5hbWljX19uZXh0LWJ0blwiLFxuICAgIHByb2dyZXNzQ29udGFpbmVyOiBcInN2LXBhbmVsZHluYW1pY19fcHJvZ3Jlc3MtY29udGFpbmVyXCIsXG4gICAgcHJvZ3Jlc3M6IFwic3YtcHJvZ3Jlc3NcIixcbiAgICBwcm9ncmVzc0JhcjogXCJzdi1wcm9ncmVzc19fYmFyXCIsXG4gICAgcHJvZ3Jlc3NUZXh0OiBcInN2LXBhbmVsZHluYW1pY19fcHJvZ3Jlc3MtdGV4dFwiLFxuICAgIHNlcGFyYXRvcjogXCJzdi1wYW5lbGR5bmFtaWNfX3NlcGFyYXRvclwiLFxuICAgIHBhbmVsV3JhcHBlcjogXCJzdi1wYW5lbGR5bmFtaWNfX3BhbmVsLXdyYXBwZXJcIixcbiAgICBwYW5lbFdyYXBwZXJJblJvdzogXCJzdi1wYW5lbGR5bmFtaWNfX3BhbmVsLXdyYXBwZXItLWluLXJvd1wiLFxuICB9LFxuICBwcm9ncmVzczogXCJzdi1wcm9ncmVzcyBzdi1ib2R5X19wcm9ncmVzc1wiLFxuICBwcm9ncmVzc0JhcjogXCJzdi1wcm9ncmVzc19fYmFyXCIsXG4gIHByb2dyZXNzVGV4dDogXCJzdi1wcm9ncmVzc19fdGV4dFwiLFxuICBwcm9ncmVzc1RleHRJbkJhcjogXCJzdi1oaWRkZW5cIixcbiAgcHJvZ3Jlc3NCdXR0b25zQ29udGFpbmVyQ2VudGVyOiBcInN2X3Byb2dyZXNzLWJ1dHRvbnNfX2NvbnRhaW5lci1jZW50ZXJcIixcbiAgcHJvZ3Jlc3NCdXR0b25zQ29udGFpbmVyOiBcInN2X3Byb2dyZXNzLWJ1dHRvbnNfX2NvbnRhaW5lclwiLFxuICBwcm9ncmVzc0J1dHRvbnNJbWFnZUJ1dHRvbkxlZnQ6IFwic3ZfcHJvZ3Jlc3MtYnV0dG9uc19faW1hZ2UtYnV0dG9uLWxlZnRcIixcbiAgcHJvZ3Jlc3NCdXR0b25zSW1hZ2VCdXR0b25SaWdodDogXCJzdl9wcm9ncmVzcy1idXR0b25zX19pbWFnZS1idXR0b24tcmlnaHRcIixcbiAgcHJvZ3Jlc3NCdXR0b25zSW1hZ2VCdXR0b25IaWRkZW46IFwic3ZfcHJvZ3Jlc3MtYnV0dG9uc19faW1hZ2UtYnV0dG9uLS1oaWRkZW5cIixcbiAgcHJvZ3Jlc3NCdXR0b25zTGlzdENvbnRhaW5lcjogXCJzdl9wcm9ncmVzcy1idXR0b25zX19saXN0LWNvbnRhaW5lclwiLFxuICBwcm9ncmVzc0J1dHRvbnNMaXN0OiBcInN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3RcIixcbiAgcHJvZ3Jlc3NCdXR0b25zTGlzdEVsZW1lbnRQYXNzZWQ6IFwic3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdC1lbGVtZW50LS1wYXNzZWRcIixcbiAgcHJvZ3Jlc3NCdXR0b25zTGlzdEVsZW1lbnRDdXJyZW50OlxuICAgIFwic3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdC1lbGVtZW50LS1jdXJyZW50XCIsXG4gIHByb2dyZXNzQnV0dG9uc0xpc3RFbGVtZW50Tm9uQ2xpY2thYmxlOlxuICAgIFwic3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdC1lbGVtZW50LS1ub25jbGlja2FibGVcIixcbiAgcHJvZ3Jlc3NCdXR0b25zUGFnZVRpdGxlOiBcInN2X3Byb2dyZXNzLWJ1dHRvbnNfX3BhZ2UtdGl0bGVcIixcbiAgcHJvZ3Jlc3NCdXR0b25zUGFnZURlc2NyaXB0aW9uOiBcInN2X3Byb2dyZXNzLWJ1dHRvbnNfX3BhZ2UtZGVzY3JpcHRpb25cIixcbiAgcGFnZToge1xuICAgIHJvb3Q6IFwic3YtcGFnZSBzdi1ib2R5X19wYWdlXCIsXG4gICAgdGl0bGU6IFwic3YtdGl0bGUgc3YtcGFnZV9fdGl0bGVcIixcbiAgICBkZXNjcmlwdGlvbjogXCJzdi1kZXNjcmlwdGlvbiBzdi1wYWdlX19kZXNjcmlwdGlvblwiLFxuICB9LFxuICBwYWdlVGl0bGU6IFwic3YtdGl0bGUgc3YtcGFnZV9fdGl0bGVcIixcbiAgcGFnZURlc2NyaXB0aW9uOiBcInN2LWRlc2NyaXB0aW9uIHN2LXBhZ2VfX2Rlc2NyaXB0aW9uXCIsXG4gIHJvdzogXCJzdi1yb3cgc3YtY2xlYXJmaXhcIixcbiAgcXVlc3Rpb246IHtcbiAgICBtYWluUm9vdDogXCJzdi1xdWVzdGlvbiBzdi1yb3dfX3F1ZXN0aW9uXCIsXG4gICAgZmxvd1Jvb3Q6IFwic3YtcXVlc3Rpb24gc3Ytcm93X19xdWVzdGlvbiBzdi1yb3dfX3F1ZXN0aW9uLS1mbG93XCIsXG4gICAgYXNDZWxsOiBcInN2LXRhYmxlX19jZWxsXCIsXG4gICAgaGVhZGVyOiBcInN2LXF1ZXN0aW9uX19oZWFkZXJcIixcbiAgICBoZWFkZXJMZWZ0OiBcInN2LXF1ZXN0aW9uX19oZWFkZXItLWxvY2F0aW9uLS1sZWZ0XCIsXG4gICAgaGVhZGVyVG9wOiBcInN2LXF1ZXN0aW9uX19oZWFkZXItLWxvY2F0aW9uLS10b3BcIixcbiAgICBoZWFkZXJCb3R0b206IFwic3YtcXVlc3Rpb25fX2hlYWRlci0tbG9jYXRpb24tLWJvdHRvbVwiLFxuICAgIGNvbnRlbnQ6IFwic3YtcXVlc3Rpb25fX2NvbnRlbnRcIixcbiAgICBjb250ZW50TGVmdDogXCJzdi1xdWVzdGlvbl9fY29udGVudC0tbGVmdFwiLFxuICAgIHRpdGxlTGVmdFJvb3Q6IFwiXCIsXG4gICAgYW5zd2VyZWQ6IFwic3YtcXVlc3Rpb24tLWFuc3dlcmVkXCIsXG4gICAgdGl0bGVPbkFuc3dlcjogXCJzdi1xdWVzdGlvbl9fdGl0bGUtLWFuc3dlclwiLFxuICAgIHRpdGxlT25FcnJvcjogXCJzdi1xdWVzdGlvbl9fdGl0bGUtLWVycm9yXCIsXG4gICAgdGl0bGU6IFwic3YtdGl0bGUgc3YtcXVlc3Rpb25fX3RpdGxlXCIsXG4gICAgdGl0bGVFeHBhbmRhYmxlOiBcInN2LXF1ZXN0aW9uX190aXRsZS0tZXhwYW5kYWJsZVwiLFxuICAgIGljb246IFwic3YtcXVlc3Rpb25fX2ljb25cIixcbiAgICBpY29uRXhwYW5kZWQ6IFwic3YtcXVlc3Rpb25fX2ljb24tLWV4cGFuZGVkXCIsXG4gICAgcmVxdWlyZWRUZXh0OiBcInN2LXF1ZXN0aW9uX19yZXF1aXJlZC10ZXh0XCIsXG4gICAgbnVtYmVyOiBcInN2LXF1ZXN0aW9uX19udW1cIixcbiAgICBkZXNjcmlwdGlvbjogXCJzdi1kZXNjcmlwdGlvbiBzdi1xdWVzdGlvbl9fZGVzY3JpcHRpb25cIixcbiAgICBkZXNjcmlwdGlvblVuZGVySW5wdXQ6IFwic3YtZGVzY3JpcHRpb24gc3YtcXVlc3Rpb25fX2Rlc2NyaXB0aW9uXCIsXG4gICAgY29tbWVudDogXCJzdi1jb21tZW50XCIsXG4gICAgcmVxdWlyZWQ6IFwic3YtcXVlc3Rpb24tLXJlcXVpcmVkXCIsXG4gICAgdGl0bGVSZXF1aXJlZDogXCJzdi1xdWVzdGlvbl9fdGl0bGUtLXJlcXVpcmVkXCIsXG4gICAgaW5kZW50OiAyMCxcbiAgICBmb290ZXI6IFwic3YtcXVlc3Rpb25fX2Zvb3RlclwiLFxuICAgIGZvcm1Hcm91cDogXCJzdi1xdWVzdGlvbl9fZm9ybS1ncm91cFwiLFxuICAgIGhhc0Vycm9yOiBcIlwiLFxuICAgIGRpc2FibGVkOiBcInN2LXF1ZXN0aW9uLS1kaXNhYmxlZFwiLFxuICB9LFxuICBpbWFnZTogeyByb290OiBcInN2LWltYWdlXCIsIGltYWdlOiBcInN2X2ltYWdlX2ltYWdlXCIgfSxcbiAgZXJyb3I6IHtcbiAgICByb290OiBcInN2LXF1ZXN0aW9uX19lcmJveFwiLFxuICAgIGljb246IFwiXCIsXG4gICAgaXRlbTogXCJcIixcbiAgICBsb2NhdGlvblRvcDogXCJzdi1xdWVzdGlvbl9fZXJib3gtLWxvY2F0aW9uLS10b3BcIixcbiAgICBsb2NhdGlvbkJvdHRvbTogXCJzdi1xdWVzdGlvbl9fZXJib3gtLWxvY2F0aW9uLS1ib3R0b21cIixcbiAgfSxcbiAgY2hlY2tib3g6IHtcbiAgICByb290OiBcInN2LXNlbGVjdGJhc2VcIixcbiAgICBpdGVtOiBcInN2LWl0ZW0gc3YtY2hlY2tib3ggc3Ytc2VsZWN0YmFzZV9faXRlbVwiLFxuICAgIGl0ZW1TZWxlY3RBbGw6IFwic3YtY2hlY2tib3gtLXNlbGVjdGFsbFwiLFxuICAgIGl0ZW1Ob25lOiBcInN2LWNoZWNrYm94LS1ub25lXCIsXG4gICAgaXRlbURpc2FibGVkOiBcInN2LWl0ZW0tLWRpc2FibGVkIHN2LWNoZWNrYm94LS1kaXNhYmxlZFwiLFxuICAgIGl0ZW1DaGVja2VkOiBcInN2LWNoZWNrYm94LS1jaGVja2VkXCIsXG4gICAgaXRlbUhvdmVyOiBcInN2LWNoZWNrYm94LS1hbGxvd2hvdmVyXCIsXG4gICAgaXRlbUlubGluZTogXCJzdi1zZWxlY3RiYXNlX19pdGVtLS1pbmxpbmVcIixcbiAgICBsYWJlbDogXCJzdi1zZWxlY3RiYXNlX19sYWJlbFwiLFxuICAgIGxhYmVsQ2hlY2tlZDogXCJcIixcbiAgICBpdGVtQ29udHJvbDogXCJzdi12aXN1YWxseWhpZGRlbiBzdi1pdGVtX19jb250cm9sXCIsXG4gICAgaXRlbURlY29yYXRvcjogXCJzdi1pdGVtX19zdmcgc3YtY2hlY2tib3hfX3N2Z1wiLFxuICAgIGNvbnRyb2xMYWJlbDogXCJzdi1pdGVtX19jb250cm9sLWxhYmVsXCIsXG4gICAgbWF0ZXJpYWxEZWNvcmF0b3I6IFwic3YtaXRlbV9fZGVjb3JhdG9yIHN2LXNlbGVjdGJhc2VfX2RlY29yYXRvciBzdi1jaGVja2JveF9fZGVjb3JhdG9yXCIsXG4gICAgb3RoZXI6IFwic3YtY29tbWVudCBzdi1xdWVzdGlvbl9fb3RoZXJcIixcbiAgICBjb2x1bW46IFwic3Ytc2VsZWN0YmFzZV9fY29sdW1uXCIsXG4gIH0sXG4gIHJhbmtpbmc6IHtcbiAgICByb290OiBcInN2LXJhbmtpbmdcIixcbiAgICByb290TW9iaWxlTW9kOiBcInN2LXJhbmtpbmctLW1vYmlsZVwiLFxuICAgIHJvb3REcmFnTW9kOiBcInN2LXJhbmtpbmctLWRyYWdcIixcbiAgICBpdGVtOiBcInN2LXJhbmtpbmctaXRlbVwiLFxuICAgIGl0ZW1Db250ZW50OiBcInN2LXJhbmtpbmctaXRlbV9fY29udGVudFwiLFxuICAgIGl0ZW1JbmRleDogXCJzdi1yYW5raW5nLWl0ZW1fX2luZGV4XCIsXG4gICAgLy8gaXRlbVRleHQ6IFwic3YtcmFua2luZy1pdGVtX190ZXh0XCIsXG4gICAgY29udHJvbExhYmVsOiBcInN2LXJhbmtpbmctaXRlbV9fdGV4dFwiLFxuICAgIGl0ZW1HaG9zdE5vZGU6IFwic3YtcmFua2luZy1pdGVtX19naG9zdFwiLFxuICAgIGl0ZW1JY29uQ29udGFpbmVyOiBcInN2LXJhbmtpbmctaXRlbV9faWNvbi1jb250YWluZXJcIixcbiAgICBpdGVtSWNvbjogXCJzdi1yYW5raW5nLWl0ZW1fX2ljb25cIixcbiAgICBpdGVtSWNvbkhvdmVyTW9kOiBcInN2LXJhbmtpbmctaXRlbV9faWNvbi0taG92ZXJcIixcbiAgICBpdGVtSWNvbkZvY3VzTW9kOiBcInN2LXJhbmtpbmctaXRlbV9faWNvbi0tZm9jdXNcIixcbiAgICBpdGVtR2hvc3RNb2Q6IFwic3YtcmFua2luZy1pdGVtLS1naG9zdFwiLFxuICAgIGl0ZW1EcmFnTW9kOiBcInN2LXJhbmtpbmctaXRlbS0tZHJhZ1wiLFxuICB9LFxuICByYWRpb2dyb3VwOiB7XG4gICAgcm9vdDogXCJzdi1zZWxlY3RiYXNlXCIsXG4gICAgaXRlbTogXCJzdi1pdGVtIHN2LXJhZGlvIHN2LXNlbGVjdGJhc2VfX2l0ZW1cIixcbiAgICBpdGVtSW5saW5lOiBcInN2LXNlbGVjdGJhc2VfX2l0ZW0tLWlubGluZVwiLFxuICAgIGxhYmVsOiBcInN2LXNlbGVjdGJhc2VfX2xhYmVsXCIsXG4gICAgbGFiZWxDaGVja2VkOiBcIlwiLFxuICAgIGl0ZW1EaXNhYmxlZDogXCJzdi1pdGVtLS1kaXNhYmxlZCBzdi1yYWRpby0tZGlzYWJsZWRcIixcbiAgICBpdGVtQ2hlY2tlZDogXCJzdi1yYWRpby0tY2hlY2tlZFwiLFxuICAgIGl0ZW1Ib3ZlcjogXCJzdi1yYWRpby0tYWxsb3dob3ZlclwiLFxuICAgIGl0ZW1Db250cm9sOiBcInN2LXZpc3VhbGx5aGlkZGVuIHN2LWl0ZW1fX2NvbnRyb2xcIixcbiAgICBpdGVtRGVjb3JhdG9yOiBcInN2LWl0ZW1fX3N2ZyBzdi1yYWRpb19fc3ZnXCIsXG4gICAgY29udHJvbExhYmVsOiBcInN2LWl0ZW1fX2NvbnRyb2wtbGFiZWxcIixcbiAgICBtYXRlcmlhbERlY29yYXRvcjogXCJzdi1pdGVtX19kZWNvcmF0b3Igc3Ytc2VsZWN0YmFzZV9fZGVjb3JhdG9yIHN2LXJhZGlvX19kZWNvcmF0b3JcIixcbiAgICBvdGhlcjogXCJzdi1jb21tZW50IHN2LXF1ZXN0aW9uX19vdGhlclwiLFxuICAgIGNsZWFyQnV0dG9uOiBcInN2LWJ0biBzdi1zZWxlY3RiYXNlX19jbGVhci1idG5cIixcbiAgICBjb2x1bW46IFwic3Ytc2VsZWN0YmFzZV9fY29sdW1uXCIsXG4gIH0sXG4gIGJ1dHRvbmdyb3VwOiB7XG4gICAgcm9vdDogXCJzdi1idXR0b24tZ3JvdXBcIixcbiAgICBpdGVtOiBcInN2LWJ1dHRvbi1ncm91cF9faXRlbVwiLFxuICAgIGl0ZW1JY29uOiBcInN2LWJ1dHRvbi1ncm91cF9faXRlbS1pY29uXCIsXG4gICAgaXRlbURlY29yYXRvcjogXCJzdi1idXR0b24tZ3JvdXBfX2l0ZW0tZGVjb3JhdG9yXCIsXG4gICAgaXRlbUNhcHRpb246IFwic3YtYnV0dG9uLWdyb3VwX19pdGVtLWNhcHRpb25cIixcbiAgICBpdGVtU2VsZWN0ZWQ6IFwic3YtYnV0dG9uLWdyb3VwX19pdGVtLS1zZWxlY3RlZFwiLFxuICAgIGl0ZW1Ib3ZlcjogXCJzdi1idXR0b24tZ3JvdXBfX2l0ZW0tLWhvdmVyXCIsXG4gICAgaXRlbURpc2FibGVkOiBcInN2LWJ1dHRvbi1ncm91cF9faXRlbS0tZGlzYWJsZWRcIixcbiAgICBpdGVtQ29udHJvbDogXCJzdi12aXN1YWxseWhpZGRlblwiLFxuICB9LFxuICBib29sZWFuOiB7XG4gICAgcm9vdDogXCJzdl9xYmxuXCIsXG4gICAgc21hbGw6IFwic3Ytcm93X19xdWVzdGlvbi0tc21hbGxcIixcbiAgICBpdGVtOiBcInN2LWJvb2xlYW4gc3YtaXRlbVwiLFxuICAgIGNvbnRyb2w6IFwic3YtdmlzdWFsbHloaWRkZW5cIixcbiAgICBpdGVtQ2hlY2tlZDogXCJzdi1ib29sZWFuLS1jaGVja2VkXCIsXG4gICAgaXRlbUluZGV0ZXJtaW5hdGU6IFwic3YtYm9vbGVhbi0taW5kZXRlcm1pbmF0ZVwiLFxuICAgIGl0ZW1EaXNhYmxlZDogXCJzdi1pdGVtLS1kaXNhYmxlZCBzdi1ib29sZWFuLS1kaXNhYmxlZFwiLFxuICAgIHN3aXRjaDogXCJzdi1ib29sZWFuX19zd2l0Y2hcIixcbiAgICBzbGlkZXI6IFwic3YtYm9vbGVhbl9fc2xpZGVyXCIsXG4gICAgc2xpZGVyVGV4dDogXCJzdi1oaWRkZW5cIixcbiAgICBsYWJlbDogXCJzdi1ib29sZWFuX19sYWJlbCBcIixcbiAgICBkaXNhYmxlZExhYmVsOiBcInN2LWJvb2xlYW5fX2xhYmVsLS1kaXNhYmxlZFwiLFxuICAgIG1hdGVyaWFsRGVjb3JhdG9yOiBcInN2LWl0ZW1fX2RlY29yYXRvciBzdi1ib29sZWFuX19kZWNvcmF0b3IgXCIsXG4gICAgaXRlbURlY29yYXRvcjogXCJzdi1pdGVtX19zdmcgIHN2LWJvb2xlYW5fX3N2Z1wiLFxuICAgIGNoZWNrZWRQYXRoOiBcInN2LWJvb2xlYW5fX2NoZWNrZWQtcGF0aFwiLFxuICAgIHVuY2hlY2tlZFBhdGg6IFwic3YtYm9vbGVhbl9fdW5jaGVja2VkLXBhdGhcIixcbiAgICBpbmRldGVybWluYXRlUGF0aDogXCJzdi1ib29sZWFuX19pbmRldGVybWluYXRlLXBhdGhcIixcbiAgfSxcbiAgdGV4dDoge1xuICAgIHJvb3Q6IFwic3YtdGV4dFwiLFxuICAgIHNtYWxsOiBcInN2LXJvd19fcXVlc3Rpb24tLXNtYWxsXCIsXG4gICAgb25FcnJvcjogXCJzdi10ZXh0LS1lcnJvclwiLFxuICB9LFxuICBtdWx0aXBsZXRleHQ6IHtcbiAgICByb290OiBcInN2LW11bHRpcGxldGV4dFwiLFxuICAgIGl0ZW06IFwic3YtbXVsdGlwbGV0ZXh0X19pdGVtXCIsXG4gICAgaXRlbVRpdGxlOiBcInN2LW11bHRpcGxldGV4dF9faXRlbS10aXRsZVwiLFxuICAgIHJvdzogXCJzdi1tdWx0aXBsZXRleHRfX3Jvd1wiLFxuICAgIGNlbGw6IFwic3YtbXVsdGlwbGV0ZXh0X19jZWxsXCIsXG4gIH0sXG4gIGRyb3Bkb3duOiB7XG4gICAgcm9vdDogXCJcIixcbiAgICBzbWFsbDogXCJzdi1yb3dfX3F1ZXN0aW9uLS1zbWFsbFwiLFxuICAgIGNvbnRyb2w6IFwic3YtZHJvcGRvd25cIixcbiAgICBzZWxlY3RXcmFwcGVyOiBcIlwiLFxuICAgIG90aGVyOiBcInN2LWNvbW1lbnQgc3YtcXVlc3Rpb25fX290aGVyXCIsXG4gICAgb25FcnJvcjogXCJzdi1kcm9wZG93bi0tZXJyb3JcIixcbiAgfSxcbiAgaW1hZ2VwaWNrZXI6IHtcbiAgICByb290OiBcInN2LWltYWdlcGlja2VyXCIsXG4gICAgaXRlbTogXCJzdi1pbWFnZXBpY2tlcl9faXRlbVwiLFxuICAgIGl0ZW1JbmxpbmU6IFwic3YtaW1hZ2VwaWNrZXJfX2l0ZW0tLWlubGluZVwiLFxuICAgIGl0ZW1DaGVja2VkOiBcInN2LWltYWdlcGlja2VyX19pdGVtLS1jaGVja2VkXCIsXG4gICAgaXRlbURpc2FibGVkOiBcInN2LWltYWdlcGlja2VyX19pdGVtLS1kaXNhYmxlZFwiLFxuICAgIGl0ZW1Ib3ZlcjogXCJzdi1pbWFnZXBpY2tlcl9faXRlbS0tYWxsb3dob3ZlclwiLFxuICAgIGxhYmVsOiBcInN2LWltYWdlcGlja2VyX19sYWJlbFwiLFxuICAgIGl0ZW1Db250cm9sOiBcInN2LWltYWdlcGlja2VyX19jb250cm9sXCIsXG4gICAgaW1hZ2U6IFwic3YtaW1hZ2VwaWNrZXJfX2ltYWdlXCIsXG4gICAgaXRlbVRleHQ6IFwic3YtaW1hZ2VwaWNrZXJfX3RleHRcIixcbiAgICBjbGVhckJ1dHRvbjogXCJzdi1idG5cIixcbiAgICBvdGhlcjogXCJzdi1jb21tZW50IHN2LXF1ZXN0aW9uX19vdGhlclwiLFxuICB9LFxuICBtYXRyaXg6IHtcbiAgICB0YWJsZVdyYXBwZXI6IFwic3YtbWF0cml4XCIsXG4gICAgcm9vdDogXCJzdi10YWJsZSBzdi1tYXRyaXgtcm9vdFwiLFxuICAgIHJvd0Vycm9yOiBcInN2LW1hdHJpeF9fcm93LS1lcnJvclwiLFxuICAgIGNlbGw6IFwic3YtdGFibGVfX2NlbGwgc3YtbWF0cml4X19jZWxsXCIsXG4gICAgaGVhZGVyQ2VsbDogXCJzdi10YWJsZV9fY2VsbCBzdi10YWJsZV9fY2VsbC0taGVhZGVyXCIsXG4gICAgbGFiZWw6IFwic3YtaXRlbSBzdi1yYWRpbyBzdi1tYXRyaXhfX2xhYmVsXCIsXG4gICAgaXRlbVZhbHVlOiBcInN2LXZpc3VhbGx5aGlkZGVuIHN2LWl0ZW1fX2NvbnRyb2wgc3YtcmFkaW9fX2NvbnRyb2xcIixcbiAgICBpdGVtQ2hlY2tlZDogXCJzdi1yYWRpby0tY2hlY2tlZFwiLFxuICAgIGl0ZW1EaXNhYmxlZDogXCJzdi1pdGVtLS1kaXNhYmxlZCBzdi1yYWRpby0tZGlzYWJsZWRcIixcbiAgICBpdGVtSG92ZXI6IFwic3YtcmFkaW8tLWFsbG93aG92ZXJcIixcbiAgICBtYXRlcmlhbERlY29yYXRvcjogXCJzdi1pdGVtX19kZWNvcmF0b3Igc3YtcmFkaW9fX2RlY29yYXRvclwiLFxuICAgIGl0ZW1EZWNvcmF0b3I6IFwic3YtaXRlbV9fc3ZnIHN2LXJhZGlvX19zdmdcIixcbiAgICBjZWxsVGV4dDogXCJzdi1tYXRyaXhfX3RleHRcIixcbiAgICBjZWxsVGV4dFNlbGVjdGVkOiBcInN2LW1hdHJpeF9fdGV4dC0tY2hlY2tlZFwiLFxuICAgIGNlbGxUZXh0RGlzYWJsZWQ6IFwic3YtbWF0cml4X190ZXh0LS1kaXNhYmxlZFwiLFxuICB9LFxuICBtYXRyaXhkcm9wZG93bjoge1xuICAgIHJvb3Q6IFwic3YtdGFibGUgc3YtbWF0cml4ZHJvcGRvd25cIixcbiAgICBjZWxsOiBcInN2LXRhYmxlX19jZWxsXCIsXG4gICAgaGVhZGVyQ2VsbDogXCJzdi10YWJsZV9fY2VsbCBzdi10YWJsZV9fY2VsbC0taGVhZGVyXCIsXG4gICAgcm93OiBcInN2LXRhYmxlX19yb3dcIixcbiAgICByb3dBZGRpdGlvbmFsOiBcInN2LXRhYmxlX19yb3ctLWFkZGl0aW9uYWxcIixcbiAgICBkZXRhaWxSb3c6IFwic3YtdGFibGVfX3Jvdy0tZGV0YWlsXCIsXG4gICAgZGV0YWlsUm93VGV4dDogXCJzdi10YWJsZV9fY2VsbC0tZGV0YWlsLXJvd3RleHRcIixcbiAgICBkZXRhaWxDZWxsOiBcInN2LXRhYmxlX19jZWxsLS1kZXRhaWxcIixcbiAgICBjaG9pY2VDZWxsOiBcInN2LXRhYmxlX19jZWxsLS1jaG9pY2VcIixcbiAgICBkZXRhaWxCdXR0b246IFwic3YtdGFibGVfX2NlbGwtLWRldGFpbC1idXR0b25cIixcbiAgICBkZXRhaWxCdXR0b25FeHBhbmRlZDogXCJzdi10YWJsZV9fY2VsbC0tZGV0YWlsLWJ1dHRvbi0tZXhwYW5kZWRcIixcbiAgICBkZXRhaWxJY29uOiBcInN2LWRldGFpbC1wYW5lbF9faWNvblwiLFxuICAgIGRldGFpbEljb25FeHBhbmRlZDogXCJzdi1kZXRhaWwtcGFuZWxfX2ljb24tLWV4cGFuZGVkXCIsXG4gICAgZGV0YWlsUGFuZWxDZWxsOiBcInN2LXRhYmxlX19jZWxsLS1kZXRhaWwtcGFuZWxcIixcbiAgICBhY3Rpb25zQ2VsbDogXCJzdi10YWJsZV9fY2VsbCBzdi10YWJsZV9fY2VsbC0tYWN0aW9uc1wiLFxuICB9LFxuICBtYXRyaXhkeW5hbWljOiB7XG4gICAgcm9vdDogXCJzdi10YWJsZSBzdi1tYXRyaXhkeW5hbWljXCIsXG4gICAgY2VsbDogXCJzdi10YWJsZV9fY2VsbFwiLFxuICAgIGhlYWRlckNlbGw6IFwic3YtdGFibGVfX2NlbGwgc3YtdGFibGVfX2NlbGwtLWhlYWRlclwiLFxuICAgIGJ1dHRvbjogXCJzdi1idG5cIixcbiAgICBidXR0b25BZGQ6IFwic3YtbWF0cml4ZHluYW1pY19fYWRkLWJ0blwiLFxuICAgIGJ1dHRvblJlbW92ZTogXCJzdi1tYXRyaXhkeW5hbWljX19yZW1vdmUtYnRuXCIsXG4gICAgaWNvbkFkZDogXCJcIixcbiAgICBpY29uUmVtb3ZlOiBcIlwiLFxuICAgIGljb25EcmFnOiBcInN2LW1hdHJpeGR5bmFtaWNfX2RyYWctaWNvblwiLFxuICAgIHJvdzogXCJzdi10YWJsZV9fcm93XCIsXG4gICAgZGV0YWlsUm93OiBcInN2LXRhYmxlX19yb3ctLWRldGFpbFwiLFxuICAgIGRldGFpbENlbGw6IFwic3YtdGFibGVfX2NlbGwtLWRldGFpbFwiLFxuICAgIGNob2ljZUNlbGw6IFwic3YtdGFibGVfX2NlbGwtLWNob2ljZVwiLFxuICAgIGRldGFpbEJ1dHRvbjogXCJzdi10YWJsZV9fY2VsbC0tZGV0YWlsLWJ1dHRvblwiLFxuICAgIGRldGFpbEJ1dHRvbkV4cGFuZGVkOiBcInN2LXRhYmxlX19jZWxsLS1kZXRhaWwtYnV0dG9uLS1leHBhbmRlZFwiLFxuICAgIGRldGFpbEljb246IFwic3YtZGV0YWlsLXBhbmVsX19pY29uXCIsXG4gICAgZGV0YWlsSWNvbkV4cGFuZGVkOiBcInN2LWRldGFpbC1wYW5lbF9faWNvbi0tZXhwYW5kZWRcIixcbiAgICBkZXRhaWxQYW5lbENlbGw6IFwic3YtdGFibGVfX2NlbGwtLWRldGFpbC1wYW5lbFwiLFxuICAgIGFjdGlvbnNDZWxsOiBcInN2LXRhYmxlX19jZWxsIHN2LXRhYmxlX19jZWxsLS1hY3Rpb25zXCIsXG4gICAgZW1wdHlSb3dzU2VjdGlvbjogXCJzdi10YWJsZV9fZW1wdHktLXJvd3MtLXNlY3Rpb25cIixcbiAgICBlbXB0eVJvd3NUZXh0OiBcInN2LXRhYmxlX19lbXB0eS0tcm93cy0tdGV4dFwiLFxuICAgIGVtcHR5Um93c0J1dHRvbjogXCJcIixcbiAgICBkcmFnRHJvcEdob3N0UG9zaXRpb25Ub3A6IFwic3YtbWF0cml4X19kcmFnLWRyb3AtZ2hvc3QtcG9zaXRpb24tdG9wXCIsXG4gICAgZHJhZ0Ryb3BHaG9zdFBvc2l0aW9uQm90dG9tOiBcInN2LW1hdHJpeF9fZHJhZy1kcm9wLWdob3N0LXBvc2l0aW9uLWJvdHRvbVwiLFxuICB9LFxuICByYXRpbmc6IHtcbiAgICByb290OiBcInN2LXJhdGluZ1wiLFxuICAgIGl0ZW06IFwic3YtcmF0aW5nX19pdGVtXCIsXG4gICAgc2VsZWN0ZWQ6IFwic3YtcmF0aW5nX19pdGVtLS1zZWxlY3RlZFwiLFxuICAgIG1pblRleHQ6IFwic3YtcmF0aW5nX19taW4tdGV4dFwiLFxuICAgIGl0ZW1UZXh0OiBcInN2LXJhdGluZ19faXRlbS10ZXh0XCIsXG4gICAgbWF4VGV4dDogXCJzdi1yYXRpbmdfX21heC10ZXh0XCIsXG4gICAgaXRlbURpc2FibGVkOiBcInN2LXJhdGluZy0tZGlzYWJsZWRcIixcbiAgfSxcbiAgY29tbWVudDoge1xuICAgIHJvb3Q6IFwic3YtY29tbWVudFwiLFxuICAgIHNtYWxsOiBcInN2LXJvd19fcXVlc3Rpb24tLXNtYWxsXCIsXG4gIH0sXG4gIGV4cHJlc3Npb246IFwiXCIsXG4gIGZpbGU6IHtcbiAgICByb290OiBcInN2LWZpbGVcIixcbiAgICBvdGhlcjogXCJzdi1jb21tZW50IHN2LXF1ZXN0aW9uX19vdGhlclwiLFxuICAgIHBsYWNlaG9sZGVySW5wdXQ6IFwic3YtdmlzdWFsbHloaWRkZW5cIixcbiAgICBwcmV2aWV3OiBcInN2LWZpbGVfX3ByZXZpZXdcIixcbiAgICBmaWxlU2lnbjogXCJzdi1oaWRkZW5cIixcbiAgICBmaWxlU2lnbkJvdHRvbTogXCJzdi1maWxlX19zaWduXCIsXG4gICAgZmlsZURlY29yYXRvcjogXCJzdi1maWxlX19kZWNvcmF0b3JcIixcbiAgICBmaWxlSW5wdXQ6IFwic3YtdmlzdWFsbHloaWRkZW5cIixcbiAgICBub0ZpbGVDaG9zZW46IFwic3YtZGVzY3JpcHRpb24gc3YtZmlsZV9fbm8tZmlsZS1jaG9zZW5cIixcbiAgICBjaG9vc2VGaWxlOiBcInN2LWJ0biBzdi1maWxlX19jaG9vc2UtYnRuXCIsXG4gICAgY29udHJvbERpc2FibGVkOiBcInN2LWZpbGVfX2Nob29zZS1idG4tLWRpc2FibGVkXCIsXG4gICAgcmVtb3ZlQnV0dG9uOiBcInN2LWhpZGRlblwiLFxuICAgIHJlbW92ZUJ1dHRvbkJvdHRvbTogXCJzdi1idG4gc3YtZmlsZV9fY2xlYW4tYnRuXCIsXG4gICAgcmVtb3ZlRmlsZTogXCJzdi1oaWRkZW5cIixcbiAgICByZW1vdmVGaWxlU3ZnOiBcInN2LWZpbGVfX3JlbW92ZS1zdmdcIixcbiAgICB3cmFwcGVyOiBcInN2LWZpbGVfX3dyYXBwZXJcIixcbiAgICBkcmFnQXJlYVBsYWNlaG9sZGVyOiBcInN2LWhpZGRlblwiLFxuICAgIGZpbGVMaXN0OiBcIlwiLFxuICAgIGRlZmF1bHRJbWFnZTogXCJzdi1oaWRkZW5cIlxuICB9LFxuICBzaWduYXR1cmVwYWQ6IHtcbiAgICByb290OiBcInN2LXNpZ25hdHVyZXBhZCBzanNfc3BfY29udGFpbmVyXCIsXG4gICAgc21hbGw6IFwic3Ytcm93X19xdWVzdGlvbi0tc21hbGxcIixcbiAgICBjb250cm9sczogXCJzanNfc3BfY29udHJvbHNcIixcbiAgICBwbGFjZWhvbGRlcjogXCJzanNfc3BfcGxhY2Vob2xkZXJcIixcbiAgICBjbGVhckJ1dHRvbjogXCJzanNfc3BfY2xlYXJcIixcbiAgfSxcbiAgc2F2ZURhdGE6IHtcbiAgICByb290OiBcIlwiLFxuICAgIHNhdmluZzogXCJcIixcbiAgICBlcnJvcjogXCJcIixcbiAgICBzdWNjZXNzOiBcIlwiLFxuICAgIHNhdmVBZ2FpbkJ1dHRvbjogXCJcIixcbiAgfSxcbiAgd2luZG93OiB7XG4gICAgcm9vdDogXCJzdl93aW5kb3dcIixcbiAgICBib2R5OiBcInN2X3dpbmRvd19jb250ZW50XCIsXG4gICAgaGVhZGVyOiB7XG4gICAgICByb290OiBcInN2X3dpbmRvd190aXRsZVwiLFxuICAgICAgdGl0bGU6IFwiXCIsXG4gICAgICBidXR0b246IFwiXCIsXG4gICAgICBidXR0b25FeHBhbmRlZDogXCJcIixcbiAgICAgIGJ1dHRvbkNvbGxhcHNlZDogXCJcIixcbiAgICB9LFxuICB9LFxufTtcblxuc3VydmV5Q3NzW1wibW9kZXJuXCJdID0gbW9kZXJuQ3NzO1xuIiwiZXhwb3J0IHZhciBzdXJ2ZXlDc3M6IGFueSA9IHtcclxuICBjdXJyZW50VHlwZTogXCJcIixcclxuICBnZXRDc3M6IGZ1bmN0aW9uKCkge1xyXG4gICAgdmFyIGxvYyA9IHRoaXMuY3VycmVudFR5cGUgPyB0aGlzW3RoaXMuY3VycmVudFR5cGVdIDogZGVmYXVsdFN0YW5kYXJkQ3NzO1xyXG4gICAgaWYgKCFsb2MpIGxvYyA9IGRlZmF1bHRTdGFuZGFyZENzcztcclxuICAgIHJldHVybiBsb2M7XHJcbiAgfSxcclxufTtcclxuXHJcbmV4cG9ydCB2YXIgZGVmYXVsdFN0YW5kYXJkQ3NzID0ge1xyXG4gIHJvb3Q6IFwic3ZfbWFpbiBzdl9kZWZhdWx0X2Nzc1wiLFxyXG4gIGNvbnRhaW5lcjogXCJzdl9jb250YWluZXJcIixcclxuICBoZWFkZXI6IFwic3ZfaGVhZGVyXCIsXHJcbiAgYm9keTogXCJzdl9ib2R5XCIsXHJcbiAgYm9keUVtcHR5OiBcInN2X2JvZHkgc3ZfYm9keV9lbXB0eVwiLFxyXG4gIGZvb3RlcjogXCJzdl9uYXZcIixcclxuICB0aXRsZTogXCJcIixcclxuICBkZXNjcmlwdGlvbjogXCJcIixcclxuICBsb2dvOiBcInN2X2xvZ29cIixcclxuICBsb2dvSW1hZ2U6IFwic3ZfbG9nb19faW1hZ2VcIixcclxuICBoZWFkZXJUZXh0OiBcInN2X2hlYWRlcl9fdGV4dFwiLFxyXG4gIG5hdmlnYXRpb25CdXR0b246IFwiXCIsXHJcbiAgY29tcGxldGVkUGFnZTogXCJzdl9jb21wbGV0ZWRfcGFnZVwiLFxyXG4gIG5hdmlnYXRpb246IHtcclxuICAgIGNvbXBsZXRlOiBcInN2X2NvbXBsZXRlX2J0blwiLFxyXG4gICAgcHJldjogXCJzdl9wcmV2X2J0blwiLFxyXG4gICAgbmV4dDogXCJzdl9uZXh0X2J0blwiLFxyXG4gICAgc3RhcnQ6IFwic3Zfc3RhcnRfYnRuXCIsXHJcbiAgICBwcmV2aWV3OiBcInN2X3ByZXZpZXdfYnRuXCIsXHJcbiAgICBlZGl0OiBcInN2X2VkaXRfYnRuXCIsXHJcbiAgfSxcclxuICBwcm9ncmVzczogXCJzdl9wcm9ncmVzc1wiLFxyXG4gIHByb2dyZXNzQmFyOiBcInN2X3Byb2dyZXNzX2JhclwiLFxyXG4gIHByb2dyZXNzVGV4dEluQmFyOiBcInN2LWhpZGRlblwiLFxyXG4gIHByb2dyZXNzQnV0dG9uc0NvbnRhaW5lckNlbnRlcjogXCJzdl9wcm9ncmVzcy1idXR0b25zX19jb250YWluZXItY2VudGVyXCIsXHJcbiAgcHJvZ3Jlc3NCdXR0b25zQ29udGFpbmVyOiBcInN2X3Byb2dyZXNzLWJ1dHRvbnNfX2NvbnRhaW5lclwiLFxyXG4gIHByb2dyZXNzQnV0dG9uc0ltYWdlQnV0dG9uTGVmdDogXCJzdl9wcm9ncmVzcy1idXR0b25zX19pbWFnZS1idXR0b24tbGVmdFwiLFxyXG4gIHByb2dyZXNzQnV0dG9uc0ltYWdlQnV0dG9uUmlnaHQ6IFwic3ZfcHJvZ3Jlc3MtYnV0dG9uc19faW1hZ2UtYnV0dG9uLXJpZ2h0XCIsXHJcbiAgcHJvZ3Jlc3NCdXR0b25zSW1hZ2VCdXR0b25IaWRkZW46IFwic3ZfcHJvZ3Jlc3MtYnV0dG9uc19faW1hZ2UtYnV0dG9uLS1oaWRkZW5cIixcclxuICBwcm9ncmVzc0J1dHRvbnNMaXN0Q29udGFpbmVyOiBcInN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QtY29udGFpbmVyXCIsXHJcbiAgcHJvZ3Jlc3NCdXR0b25zTGlzdDogXCJzdl9wcm9ncmVzcy1idXR0b25zX19saXN0XCIsXHJcbiAgcHJvZ3Jlc3NCdXR0b25zTGlzdEVsZW1lbnRQYXNzZWQ6IFwic3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdC1lbGVtZW50LS1wYXNzZWRcIixcclxuICBwcm9ncmVzc0J1dHRvbnNMaXN0RWxlbWVudEN1cnJlbnQ6XHJcbiAgICBcInN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QtZWxlbWVudC0tY3VycmVudFwiLFxyXG4gIHByb2dyZXNzQnV0dG9uc0xpc3RFbGVtZW50Tm9uQ2xpY2thYmxlOlxyXG4gICAgXCJzdl9wcm9ncmVzcy1idXR0b25zX19saXN0LWVsZW1lbnQtLW5vbmNsaWNrYWJsZVwiLFxyXG4gIHByb2dyZXNzQnV0dG9uc1BhZ2VUaXRsZTogXCJzdl9wcm9ncmVzcy1idXR0b25zX19wYWdlLXRpdGxlXCIsXHJcbiAgcHJvZ3Jlc3NCdXR0b25zUGFnZURlc2NyaXB0aW9uOiBcInN2X3Byb2dyZXNzLWJ1dHRvbnNfX3BhZ2UtZGVzY3JpcHRpb25cIixcclxuICBwYWdlOiB7XHJcbiAgICByb290OiBcInN2X3Bfcm9vdFwiLFxyXG4gICAgdGl0bGU6IFwic3ZfcGFnZV90aXRsZVwiLFxyXG4gICAgZGVzY3JpcHRpb246IFwiXCIsXHJcbiAgfSxcclxuICAvLyBUT0RPOiBtb3ZlIHRvIHRoZSBwYWdlIG9iamVjdFxyXG4gIHBhZ2VUaXRsZTogXCJzdl9wYWdlX3RpdGxlXCIsXHJcbiAgcGFnZURlc2NyaXB0aW9uOiBcIlwiLFxyXG4gIHJvdzogXCJzdl9yb3dcIixcclxuICBxdWVzdGlvbjoge1xyXG4gICAgbWFpblJvb3Q6IFwic3ZfcSBzdl9xc3RuXCIsXHJcbiAgICBmbG93Um9vdDogXCJzdl9xX2Zsb3cgc3ZfcXN0blwiLFxyXG4gICAgaGVhZGVyOiBcIlwiLFxyXG4gICAgaGVhZGVyTGVmdDogXCJ0aXRsZS1sZWZ0XCIsXHJcbiAgICBjb250ZW50OiBcIlwiLFxyXG4gICAgY29udGVudExlZnQ6IFwiY29udGVudC1sZWZ0XCIsXHJcbiAgICB0aXRsZUxlZnRSb290OiBcInN2X3FzdG5fbGVmdFwiLFxyXG4gICAgcmVxdWlyZWRUZXh0OiBcInN2X3FfcmVxdWlyZWRfdGV4dFwiLFxyXG4gICAgdGl0bGU6IFwic3ZfcV90aXRsZVwiLFxyXG4gICAgdGl0bGVFeHBhbmRhYmxlOiBcInN2X3FfdGl0bGVfZXhwYW5kYWJsZVwiLFxyXG4gICAgbnVtYmVyOiBcInN2X3FfbnVtXCIsXHJcbiAgICBkZXNjcmlwdGlvbjogXCJzdl9xX2Rlc2NyaXB0aW9uXCIsXHJcbiAgICBjb21tZW50OiBcIlwiLFxyXG4gICAgcmVxdWlyZWQ6IFwiXCIsXHJcbiAgICB0aXRsZVJlcXVpcmVkOiBcIlwiLFxyXG4gICAgaGFzRXJyb3I6IFwiXCIsXHJcbiAgICBpbmRlbnQ6IDIwLFxyXG4gICAgZm9vdGVyOiBcInN2X3FfZm9vdGVyXCIsXHJcbiAgICBmb3JtR3JvdXA6IFwiZm9ybS1ncm91cFwiLFxyXG4gICAgYXNDZWxsOiBcInN2X21hdHJpeF9jZWxsXCIsXHJcbiAgICBpY29uOiBcInN2X3F1ZXN0aW9uX2ljb25cIixcclxuICAgIGljb25FeHBhbmRlZDogXCJzdl9leHBhbmRlZFwiLFxyXG4gICAgZGlzYWJsZWQ6IFwic3ZfcS0tZGlzYWJsZWRcIixcclxuICB9LFxyXG4gIHBhbmVsOiB7XHJcbiAgICB0aXRsZTogXCJzdl9wX3RpdGxlXCIsXHJcbiAgICB0aXRsZUV4cGFuZGFibGU6IFwic3ZfcF90aXRsZV9leHBhbmRhYmxlXCIsXHJcbiAgICB0aXRsZU9uRXJyb3I6IFwiXCIsXHJcbiAgICBpY29uOiBcInN2X3BhbmVsX2ljb25cIixcclxuICAgIGljb25FeHBhbmRlZDogXCJzdl9leHBhbmRlZFwiLFxyXG4gICAgZGVzY3JpcHRpb246IFwic3ZfcF9kZXNjcmlwdGlvblwiLFxyXG4gICAgY29udGFpbmVyOiBcInN2X3BfY29udGFpbmVyXCIsXHJcbiAgICBmb290ZXI6IFwic3ZfcF9mb290ZXJcIixcclxuICAgIG51bWJlcjogXCJzdl9xX251bVwiLFxyXG4gICAgcmVxdWlyZWRUZXh0OiBcInN2X3FfcmVxdWlyZWRfdGV4dFwiLFxyXG4gIH0sXHJcbiAgZXJyb3I6IHtcclxuICAgIHJvb3Q6IFwic3ZfcV9lcmJveFwiLFxyXG4gICAgaWNvbjogXCJcIixcclxuICAgIGl0ZW06IFwiXCIsXHJcbiAgICBsb2NhdGlvblRvcDogXCJzdl9xc3RuX2Vycm9yX3RvcFwiLFxyXG4gICAgbG9jYXRpb25Cb3R0b206IFwic3ZfcXN0bl9lcnJvcl9ib3R0b21cIixcclxuICB9LFxyXG5cclxuICBib29sZWFuOiB7XHJcbiAgICByb290OiBcInN2X3FjYmMgc3ZfcWJsblwiLFxyXG4gICAgaXRlbTogXCJzdi1ib29sZWFuXCIsXHJcbiAgICBjb250cm9sOiBcInN2LXZpc3VhbGx5aGlkZGVuXCIsXHJcbiAgICBpdGVtQ2hlY2tlZDogXCJzdi1ib29sZWFuLS1jaGVja2VkIGNoZWNrZWRcIixcclxuICAgIGl0ZW1JbmRldGVybWluYXRlOiBcInN2LWJvb2xlYW4tLWluZGV0ZXJtaW5hdGVcIixcclxuICAgIGl0ZW1EaXNhYmxlZDogXCJzdi1ib29sZWFuLS1kaXNhYmxlZFwiLFxyXG4gICAgc3dpdGNoOiBcInN2LWJvb2xlYW5fX3N3aXRjaFwiLFxyXG4gICAgc2xpZGVyOiBcInN2LWJvb2xlYW5fX3NsaWRlclwiLFxyXG4gICAgc2xpZGVyVGV4dDogXCJzdi1oaWRkZW5cIixcclxuICAgIGxhYmVsOiBcInN2LWJvb2xlYW5fX2xhYmVsIFwiLFxyXG4gICAgZGlzYWJsZWRMYWJlbDogXCJzdi1ib29sZWFuX19sYWJlbC0tZGlzYWJsZWRcIixcclxuICAgIG1hdGVyaWFsRGVjb3JhdG9yOiBcInN2LWl0ZW1fX2RlY29yYXRvciBzdi1ib29sZWFuX19kZWNvcmF0b3IgXCIsXHJcbiAgICBpdGVtRGVjb3JhdG9yOiBcInN2LWl0ZW1fX3N2ZyAgc3YtYm9vbGVhbl9fc3ZnXCIsXHJcbiAgICBjaGVja2VkUGF0aDogXCJzdi1ib29sZWFuX19jaGVja2VkLXBhdGhcIixcclxuICAgIHVuY2hlY2tlZFBhdGg6IFwic3YtYm9vbGVhbl9fdW5jaGVja2VkLXBhdGhcIixcclxuICAgIGluZGV0ZXJtaW5hdGVQYXRoOiBcInN2LWJvb2xlYW5fX2luZGV0ZXJtaW5hdGUtcGF0aFwiLFxyXG4gIH0sXHJcbiAgY2hlY2tib3g6IHtcclxuICAgIHJvb3Q6IFwic3ZfcWNiYyBzdl9xY2J4XCIsXHJcbiAgICBpdGVtOiBcInN2X3FfY2hlY2tib3hcIixcclxuICAgIGl0ZW1TZWxlY3RBbGw6IFwic3ZfcV9jaGVja2JveF9zZWxlY3RhbGxcIixcclxuICAgIGl0ZW1Ob25lOiBcInN2X3FfY2hlY2tib3hfbm9uZVwiLFxyXG4gICAgaXRlbUNoZWNrZWQ6IFwiY2hlY2tlZFwiLFxyXG4gICAgaXRlbUlubGluZTogXCJzdl9xX2NoZWNrYm94X2lubGluZVwiLFxyXG4gICAgbGFiZWw6IFwic3ZfcV9jaGVja2JveF9sYWJlbFwiLFxyXG4gICAgbGFiZWxDaGVja2VkOiBcIlwiLFxyXG4gICAgaXRlbUNvbnRyb2w6IFwic3ZfcV9jaGVja2JveF9jb250cm9sX2l0ZW1cIixcclxuICAgIGl0ZW1EZWNvcmF0b3I6IFwic3YtaGlkZGVuXCIsXHJcbiAgICBjb250cm9sTGFiZWw6IFwic3ZfcV9jaGVja2JveF9jb250cm9sX2xhYmVsXCIsXHJcbiAgICBtYXRlcmlhbERlY29yYXRvcjogXCJjaGVja2JveC1tYXRlcmlhbFwiLFxyXG4gICAgb3RoZXI6IFwic3ZfcV9vdGhlciBzdl9xX2NoZWNrYm94X290aGVyXCIsXHJcbiAgICBjb2x1bW46IFwic3ZfcV9zZWxlY3RfY29sdW1uXCIsXHJcbiAgfSxcclxuICByYW5raW5nOiB7XHJcbiAgICByb290OiBcInN2LXJhbmtpbmdcIixcclxuICAgIHJvb3RNb2JpbGVNb2Q6IFwic3YtcmFua2luZy0tbW9iaWxlXCIsXHJcbiAgICByb290RHJhZ01vZDogXCJzdi1yYW5raW5nLS1kcmFnXCIsXHJcbiAgICBpdGVtOiBcInN2LXJhbmtpbmctaXRlbVwiLFxyXG4gICAgaXRlbUNvbnRlbnQ6IFwic3YtcmFua2luZy1pdGVtX19jb250ZW50XCIsXHJcbiAgICBpdGVtSW5kZXg6IFwic3YtcmFua2luZy1pdGVtX19pbmRleFwiLFxyXG4gICAgLy8gaXRlbVRleHQ6IFwic3YtcmFua2luZy1pdGVtX190ZXh0XCIsXHJcbiAgICBjb250cm9sTGFiZWw6IFwic3YtcmFua2luZy1pdGVtX190ZXh0XCIsXHJcbiAgICBpdGVtR2hvc3ROb2RlOiBcInN2LXJhbmtpbmctaXRlbV9fZ2hvc3RcIixcclxuICAgIGl0ZW1JY29uQ29udGFpbmVyOiBcInN2LXJhbmtpbmctaXRlbV9faWNvbi1jb250YWluZXJcIixcclxuICAgIGl0ZW1JY29uOiBcInN2LXJhbmtpbmctaXRlbV9faWNvblwiLFxyXG4gICAgaXRlbUljb25Ib3Zlck1vZDogXCJzdi1yYW5raW5nLWl0ZW1fX2ljb24tLWhvdmVyXCIsXHJcbiAgICBpdGVtSWNvbkZvY3VzTW9kOiBcInN2LXJhbmtpbmctaXRlbV9faWNvbi0tZm9jdXNcIixcclxuICAgIGl0ZW1HaG9zdE1vZDogXCJzdi1yYW5raW5nLWl0ZW0tLWdob3N0XCIsXHJcbiAgICBpdGVtRHJhZ01vZDogXCJzdi1yYW5raW5nLWl0ZW0tLWRyYWdcIixcclxuICB9LFxyXG4gIGNvbW1lbnQ6IFwiXCIsXHJcbiAgZHJvcGRvd246IHtcclxuICAgIHJvb3Q6IFwiXCIsXHJcbiAgICBjb250cm9sOiBcInN2X3FfZHJvcGRvd25fY29udHJvbFwiLFxyXG4gICAgc2VsZWN0V3JhcHBlcjogXCJzdl9zZWxlY3Rfd3JhcHBlclwiLFxyXG4gICAgb3RoZXI6IFwic3ZfcV9kZF9vdGhlclwiLFxyXG4gIH0sXHJcbiAgaHRtbDogeyByb290OiBcIlwiIH0sXHJcbiAgaW1hZ2U6IHsgcm9vdDogXCJzdl9xX2ltYWdlXCIsIGltYWdlOiBcInN2X2ltYWdlX2ltYWdlXCIgfSxcclxuICBtYXRyaXg6IHtcclxuICAgIHJvb3Q6IFwic3ZfcV9tYXRyaXhcIixcclxuICAgIGxhYmVsOiBcInN2X3FfbV9sYWJlbFwiLFxyXG4gICAgaXRlbUNoZWNrZWQ6IFwiY2hlY2tlZFwiLFxyXG4gICAgaXRlbURlY29yYXRvcjogXCJzdi1oaWRkZW5cIixcclxuICAgIGNlbGw6IFwic3ZfcV9tX2NlbGxcIixcclxuICAgIGNlbGxUZXh0OiBcInN2X3FfbV9jZWxsX3RleHRcIixcclxuICAgIGNlbGxUZXh0U2VsZWN0ZWQ6IFwic3ZfcV9tX2NlbGxfc2VsZWN0ZWRcIixcclxuICAgIGNlbGxMYWJlbDogXCJzdl9xX21fY2VsbF9sYWJlbFwiLFxyXG4gIH0sXHJcbiAgbWF0cml4ZHJvcGRvd246IHtcclxuICAgIHJvb3Q6IFwic3ZfcV9tYXRyaXhfZHJvcGRvd25cIixcclxuICAgIGNlbGw6IFwic3ZfbWF0cml4X2NlbGxcIixcclxuICAgIGhlYWRlckNlbGw6IFwic3ZfbWF0cml4X2NlbGxfaGVhZGVyXCIsXHJcbiAgICByb3c6IFwic3ZfbWF0cml4X3Jvd1wiLFxyXG4gICAgcm93QWRkaXRpb25hbDogXCJzdi1tYXRyaXhfX3Jvdy0tYWRkaXRpb25hbFwiLFxyXG4gICAgZGV0YWlsUm93OiBcInN2X21hdHJpeF9kZXRhaWxfcm93XCIsXHJcbiAgICBkZXRhaWxSb3dUZXh0OiBcInN2X21hdHJpeF9jZWxsX2RldGFpbF9yb3d0ZXh0XCIsXHJcbiAgICBkZXRhaWxDZWxsOiBcInN2X21hdHJpeF9jZWxsX2RldGFpbFwiLFxyXG4gICAgY2hvaWNlQ2VsbDogXCJzdi10YWJsZV9fY2VsbC0tY2hvaWNlXCIsXHJcbiAgICBkZXRhaWxCdXR0b246IFwic3ZfbWF0cml4X2NlbGxfZGV0YWlsX2J1dHRvblwiLFxyXG4gICAgZGV0YWlsQnV0dG9uRXhwYW5kZWQ6IFwic3ZfbWF0cml4X2NlbGxfZGV0YWlsX2J1dHRvbl9leHBhbmRlZFwiLFxyXG4gICAgZGV0YWlsSWNvbjogXCJzdl9kZXRhaWxfcGFuZWxfaWNvblwiLFxyXG4gICAgZGV0YWlsSWNvbkV4cGFuZGVkOiBcInN2X2RldGFpbF9leHBhbmRlZFwiLFxyXG4gICAgZGV0YWlsUGFuZWxDZWxsOiBcInN2X21hdHJpeF9jZWxsX2RldGFpbF9wYW5lbFwiLFxyXG4gICAgYWN0aW9uc0NlbGw6IFwic3ZfbWF0cml4X2NlbGwgc3ZfbWF0cml4X2NlbGxfYWN0aW9uc1wiLFxyXG4gIH0sXHJcbiAgbWF0cml4ZHluYW1pYzoge1xyXG4gICAgcm9vdDogXCJzdl9xX21hdHJpeF9keW5hbWljXCIsXHJcbiAgICBidXR0b246IFwic3ZfbWF0cml4X2R5bmFtaWNfYnV0dG9uXCIsXHJcbiAgICBidXR0b25BZGQ6IFwiXCIsXHJcbiAgICBidXR0b25SZW1vdmU6IFwiXCIsXHJcbiAgICBpY29uQWRkOiBcIlwiLFxyXG4gICAgaWNvblJlbW92ZTogXCJcIixcclxuICAgIGljb25EcmFnOiBcInN2LW1hdHJpeGR5bmFtaWNfX2RyYWctaWNvblwiLFxyXG4gICAgY2VsbDogXCJzdl9tYXRyaXhfY2VsbFwiLFxyXG4gICAgaGVhZGVyQ2VsbDogXCJzdl9tYXRyaXhfY2VsbF9oZWFkZXJcIixcclxuICAgIHJvdzogXCJzdl9tYXRyaXhfcm93XCIsXHJcbiAgICBkZXRhaWxSb3c6IFwic3ZfbWF0cml4X2RldGFpbF9yb3dcIixcclxuICAgIGRldGFpbENlbGw6IFwic3ZfbWF0cml4X2NlbGxfZGV0YWlsXCIsXHJcbiAgICBjaG9pY2VDZWxsOiBcInN2LXRhYmxlX19jZWxsLS1jaG9pY2VcIixcclxuICAgIGRldGFpbEJ1dHRvbjogXCJzdl9tYXRyaXhfY2VsbF9kZXRhaWxfYnV0dG9uXCIsXHJcbiAgICBkZXRhaWxCdXR0b25FeHBhbmRlZDogXCJzdl9tYXRyaXhfY2VsbF9kZXRhaWxfYnV0dG9uX2V4cGFuZGVkXCIsXHJcbiAgICBkZXRhaWxJY29uOiBcInN2X2RldGFpbF9wYW5lbF9pY29uXCIsXHJcbiAgICBkZXRhaWxJY29uRXhwYW5kZWQ6IFwic3ZfZGV0YWlsX2V4cGFuZGVkXCIsXHJcbiAgICBkZXRhaWxQYW5lbENlbGw6IFwic3ZfbWF0cml4X2NlbGxfZGV0YWlsX3BhbmVsXCIsXHJcbiAgICBhY3Rpb25zQ2VsbDogXCJzdl9tYXRyaXhfY2VsbCBzdl9tYXRyaXhfY2VsbF9hY3Rpb25zXCIsXHJcbiAgICBlbXB0eVJvd3NTZWN0aW9uOiBcInN2X21hdHJpeF9lbXB0eV9yb3dzX3NlY3Rpb25cIixcclxuICAgIGVtcHR5Um93c1RleHQ6IFwic3ZfbWF0cml4X2VtcHR5X3Jvd3NfdGV4dFwiLFxyXG4gICAgZW1wdHlSb3dzQnV0dG9uOiBcIlwiLFxyXG4gICAgZHJhZ0Ryb3BHaG9zdFBvc2l0aW9uVG9wOiBcInN2LW1hdHJpeF9fZHJhZy1kcm9wLWdob3N0LXBvc2l0aW9uLXRvcFwiLFxyXG4gICAgZHJhZ0Ryb3BHaG9zdFBvc2l0aW9uQm90dG9tOiBcInN2LW1hdHJpeF9fZHJhZy1kcm9wLWdob3N0LXBvc2l0aW9uLWJvdHRvbVwiLFxyXG4gIH0sXHJcbiAgcGFuZWxkeW5hbWljOiB7XHJcbiAgICByb290OiBcInN2X3BhbmVsX2R5bmFtaWNcIixcclxuICAgIHRpdGxlOiBcInN2X3BfdGl0bGVcIixcclxuICAgIGJ1dHRvbjogXCJcIixcclxuICAgIGJ1dHRvbkFkZDogXCJzdi1wYW5lbGR5bmFtaWNfX2FkZC1idG5cIixcclxuICAgIGJ1dHRvblJlbW92ZTogXCJzdl9wX3JlbW92ZV9idG5cIixcclxuICAgIGJ1dHRvblJlbW92ZVJpZ2h0OiBcInN2X3BfcmVtb3ZlX2J0bl9yaWdodFwiLFxyXG4gICAgYnV0dG9uUHJldjogXCJzdi1wYW5lbGR5bmFtaWNfX3ByZXYtYnRuXCIsXHJcbiAgICBidXR0b25OZXh0OiBcInN2LXBhbmVsZHluYW1pY19fbmV4dC1idG5cIixcclxuICAgIHByb2dyZXNzQ29udGFpbmVyOiBcInN2LXBhbmVsZHluYW1pY19fcHJvZ3Jlc3MtY29udGFpbmVyXCIsXHJcbiAgICBwcm9ncmVzczogXCJzdi1wcm9ncmVzc1wiLFxyXG4gICAgcHJvZ3Jlc3NCYXI6IFwic3YtcHJvZ3Jlc3NfX2JhclwiLFxyXG4gICAgcHJvZ3Jlc3NUZXh0OiBcInN2LXBhbmVsZHluYW1pY19fcHJvZ3Jlc3MtdGV4dFwiLFxyXG4gICAgcGFuZWxXcmFwcGVyOiBcInN2X3Bfd3JhcHBlclwiLFxyXG4gICAgcGFuZWxXcmFwcGVySW5Sb3c6IFwic3ZfcF93cmFwcGVyX2luX3Jvd1wiLFxyXG4gIH0sXHJcbiAgbXVsdGlwbGV0ZXh0OiB7XHJcbiAgICByb290OiBcInN2X3FfbXRcIixcclxuICAgIGl0ZW1UaXRsZTogXCJzdl9xX210X3RpdGxlXCIsXHJcbiAgICByb3c6IFwic3ZfcV9tdF9yb3dcIixcclxuICAgIGl0ZW1WYWx1ZTogXCJzdl9xX210X2l0ZW1fdmFsdWUgc3ZfcV90ZXh0X3Jvb3RcIixcclxuICB9LFxyXG4gIHJhZGlvZ3JvdXA6IHtcclxuICAgIHJvb3Q6IFwic3ZfcWNiY1wiLFxyXG4gICAgaXRlbTogXCJzdl9xX3JhZGlvZ3JvdXBcIixcclxuICAgIGl0ZW1DaGVja2VkOiBcImNoZWNrZWRcIixcclxuICAgIGl0ZW1JbmxpbmU6IFwic3ZfcV9yYWRpb2dyb3VwX2lubGluZVwiLFxyXG4gICAgaXRlbURlY29yYXRvcjogXCJzdi1oaWRkZW5cIixcclxuICAgIGxhYmVsOiBcInN2X3FfcmFkaW9ncm91cF9sYWJlbFwiLFxyXG4gICAgbGFiZWxDaGVja2VkOiBcIlwiLFxyXG4gICAgaXRlbUNvbnRyb2w6IFwic3ZfcV9yYWRpb2dyb3VwX2NvbnRyb2xfaXRlbVwiLFxyXG4gICAgY29udHJvbExhYmVsOiBcIlwiLFxyXG4gICAgbWF0ZXJpYWxEZWNvcmF0b3I6IFwiY2lyY2xlXCIsXHJcbiAgICBvdGhlcjogXCJzdl9xX290aGVyIHN2X3FfcmFkaW9ncm91cF9vdGhlclwiLFxyXG4gICAgY2xlYXJCdXR0b246IFwic3ZfcV9yYWRpb2dyb3VwX2NsZWFyXCIsXHJcbiAgICBjb2x1bW46IFwic3ZfcV9zZWxlY3RfY29sdW1uXCIsXHJcbiAgfSxcclxuICBidXR0b25ncm91cDoge1xyXG4gICAgcm9vdDogXCJzdi1idXR0b24tZ3JvdXBcIixcclxuICAgIGl0ZW06IFwic3YtYnV0dG9uLWdyb3VwX19pdGVtXCIsXHJcbiAgICBpdGVtSWNvbjogXCJzdi1idXR0b24tZ3JvdXBfX2l0ZW0taWNvblwiLFxyXG4gICAgaXRlbURlY29yYXRvcjogXCJzdi1idXR0b24tZ3JvdXBfX2l0ZW0tZGVjb3JhdG9yXCIsXHJcbiAgICBpdGVtQ2FwdGlvbjogXCJzdi1idXR0b24tZ3JvdXBfX2l0ZW0tY2FwdGlvblwiLFxyXG4gICAgaXRlbUhvdmVyOiBcInN2LWJ1dHRvbi1ncm91cF9faXRlbS0taG92ZXJcIixcclxuICAgIGl0ZW1TZWxlY3RlZDogXCJzdi1idXR0b24tZ3JvdXBfX2l0ZW0tLXNlbGVjdGVkXCIsXHJcbiAgICBpdGVtRGlzYWJsZWQ6IFwic3YtYnV0dG9uLWdyb3VwX19pdGVtLS1kaXNhYmxlZFwiLFxyXG4gICAgaXRlbUNvbnRyb2w6IFwic3YtdmlzdWFsbHloaWRkZW5cIixcclxuICB9LFxyXG4gIGltYWdlcGlja2VyOiB7XHJcbiAgICByb290OiBcInN2X2ltZ3NlbFwiLFxyXG4gICAgaXRlbTogXCJzdl9xX2ltZ3NlbFwiLFxyXG4gICAgaXRlbUNoZWNrZWQ6IFwiY2hlY2tlZFwiLFxyXG4gICAgbGFiZWw6IFwic3ZfcV9pbWdzZWxfbGFiZWxcIixcclxuICAgIGl0ZW1Db250cm9sOiBcInN2X3FfaW1nc2VsX2NvbnRyb2xfaXRlbVwiLFxyXG4gICAgaW1hZ2U6IFwic3ZfcV9pbWdzZWxfaW1hZ2VcIixcclxuICAgIGl0ZW1JbmxpbmU6IFwic3ZfcV9pbWFnZXBpY2tlcl9pbmxpbmVcIixcclxuICAgIGl0ZW1UZXh0OiBcInN2X3FfaW1nc2VsX3RleHRcIixcclxuICAgIGNsZWFyQnV0dG9uOiBcInN2X3FfcmFkaW9ncm91cF9jbGVhclwiLFxyXG4gIH0sXHJcbiAgcmF0aW5nOiB7XHJcbiAgICByb290OiBcInN2X3FfcmF0aW5nXCIsXHJcbiAgICBpdGVtOiBcInN2X3FfcmF0aW5nX2l0ZW1cIixcclxuICAgIHNlbGVjdGVkOiBcImFjdGl2ZVwiLFxyXG4gICAgbWluVGV4dDogXCJzdl9xX3JhdGluZ19taW5fdGV4dFwiLFxyXG4gICAgaXRlbVRleHQ6IFwic3ZfcV9yYXRpbmdfaXRlbV90ZXh0XCIsXHJcbiAgICBtYXhUZXh0OiBcInN2X3FfcmF0aW5nX21heF90ZXh0XCIsXHJcbiAgfSxcclxuICB0ZXh0OiBcInN2X3FfdGV4dF9yb290XCIsXHJcbiAgZXhwcmVzc2lvbjogXCJcIixcclxuICBmaWxlOiB7XHJcbiAgICByb290OiBcInN2X3FfZmlsZVwiLFxyXG4gICAgcGxhY2Vob2xkZXJJbnB1dDogXCJzdi12aXN1YWxseWhpZGRlblwiLFxyXG4gICAgcHJldmlldzogXCJzdl9xX2ZpbGVfcHJldmlld1wiLFxyXG4gICAgcmVtb3ZlQnV0dG9uOiBcInN2X3FfZmlsZV9yZW1vdmVfYnV0dG9uXCIsXHJcbiAgICBmaWxlSW5wdXQ6IFwic3YtdmlzdWFsbHloaWRkZW5cIixcclxuICAgIHJlbW92ZUZpbGU6IFwic3ZfcV9maWxlX3JlbW92ZVwiLFxyXG4gICAgcmVtb3ZlRmlsZVN2ZzogXCJzdi1oaWRkZW5cIixcclxuICAgIGZpbGVEZWNvcmF0b3I6IFwic3YtZmlsZV9fZGVjb3JhdG9yXCIsXHJcbiAgICBmaWxlU2lnbkJvdHRvbTogXCJzdi1oaWRkZW5cIixcclxuICAgIHJlbW92ZUJ1dHRvbkJvdHRvbTogXCJzdi1oaWRkZW5cIixcclxuICAgIGNob29zZUZpbGU6IFwic3ZfcV9maWxlX2Nob29zZV9idXR0b25cIixcclxuICAgIG5vRmlsZUNob3NlbjogXCJzdl9xX2ZpbGVfcGxhY2Vob2xkZXJcIixcclxuICAgIGRyYWdBcmVhUGxhY2Vob2xkZXI6IFwic3YtaGlkZGVuXCIsXHJcbiAgICBmaWxlTGlzdDogXCJcIixcclxuICAgIGRlZmF1bHRJbWFnZTogXCJzdi1oaWRkZW5cIlxyXG4gIH0sXHJcbiAgc2lnbmF0dXJlcGFkOiB7XHJcbiAgICByb290OiBcInN2X3Ffc2lnbmF0dXJlcGFkIHNqc19zcF9jb250YWluZXJcIixcclxuICAgIGNvbnRyb2xzOiBcInNqc19zcF9jb250cm9sc1wiLFxyXG4gICAgcGxhY2Vob2xkZXI6IFwic2pzX3NwX3BsYWNlaG9sZGVyXCIsXHJcbiAgICBjbGVhckJ1dHRvbjogXCJzanNfc3BfY2xlYXJcIixcclxuICB9LFxyXG4gIHNhdmVEYXRhOiB7XHJcbiAgICByb290OiBcIlwiLFxyXG4gICAgc2F2aW5nOiBcIlwiLFxyXG4gICAgZXJyb3I6IFwiXCIsXHJcbiAgICBzdWNjZXNzOiBcIlwiLFxyXG4gICAgc2F2ZUFnYWluQnV0dG9uOiBcIlwiLFxyXG4gIH0sXHJcbiAgd2luZG93OiB7XHJcbiAgICByb290OiBcInN2X3dpbmRvd1wiLFxyXG4gICAgYm9keTogXCJzdl93aW5kb3dfY29udGVudFwiLFxyXG4gICAgaGVhZGVyOiB7XHJcbiAgICAgIHJvb3Q6IFwic3Zfd2luZG93X3RpdGxlXCIsXHJcbiAgICAgIHRpdGxlOiBcIlwiLFxyXG4gICAgICBidXR0b246IFwiXCIsXHJcbiAgICAgIGJ1dHRvbkV4cGFuZGVkOiBcIlwiLFxyXG4gICAgICBidXR0b25Db2xsYXBzZWQ6IFwiXCIsXHJcbiAgICB9LFxyXG4gIH0sXHJcbn07XHJcblxyXG5zdXJ2ZXlDc3NbXCJzdGFuZGFyZFwiXSA9IGRlZmF1bHRTdGFuZGFyZENzcztcclxuIiwiaW1wb3J0IHsgQ3NzQ2xhc3NCdWlsZGVyIH0gZnJvbSBcIi4vdXRpbHMvY3NzQ2xhc3NCdWlsZGVyXCI7XG5cbmV4cG9ydCBjbGFzcyBEZWZhdWx0VGl0bGVNb2RlbCB7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0SWNvbkNzcyhjc3NDbGFzc2VzOiBhbnksIGlzQ29sbGFwc2VkOiBib29sZWFuKSB7XG4gICAgcmV0dXJuIG5ldyBDc3NDbGFzc0J1aWxkZXIoKVxuICAgICAgLmFwcGVuZChjc3NDbGFzc2VzLmljb24pXG4gICAgICAuYXBwZW5kKGNzc0NsYXNzZXMuaWNvbkV4cGFuZGVkLCAhaXNDb2xsYXBzZWQpXG4gICAgICAudG9TdHJpbmcoKTtcbiAgfVxufSIsImltcG9ydCB7IFF1ZXN0aW9uUmFua2luZ01vZGVsIH0gZnJvbSBcInNyYy9xdWVzdGlvbl9yYW5raW5nXCI7XG5pbXBvcnQgeyBJdGVtVmFsdWUgfSBmcm9tIFwiLi4vaXRlbXZhbHVlXCI7XG5pbXBvcnQgeyBRdWVzdGlvblNlbGVjdEJhc2UgfSBmcm9tIFwiLi4vcXVlc3Rpb25fYmFzZXNlbGVjdFwiO1xuaW1wb3J0IHsgRHJhZ0Ryb3BDb3JlIH0gZnJvbSBcIi4vY29yZVwiO1xuXG5leHBvcnQgY2xhc3MgRHJhZ0Ryb3BDaG9pY2VzIGV4dGVuZHMgRHJhZ0Ryb3BDb3JlPFF1ZXN0aW9uU2VsZWN0QmFzZT4ge1xuICBwcm90ZWN0ZWQgZ2V0IGRyYWdnZWRFbGVtZW50VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIml0ZW0tdmFsdWVcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRTaG9ydGN1dFRleHQoZHJhZ2dlZEVsZW1lbnQ6IEl0ZW1WYWx1ZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRyYWdnZWRFbGVtZW50LnRleHQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlRHJhZ2dlZEVsZW1lbnRTaG9ydGN1dChcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgZHJhZ2dlZEVsZW1lbnROb2RlOiBIVE1MRWxlbWVudFxuICApOiBIVE1MRWxlbWVudCB7XG4gICAgaWYgKHRoaXMucGFyZW50RWxlbWVudC5nZXRUeXBlKCkgPT09IFwiaW1hZ2VwaWNrZXJcIikge1xuICAgICAgcmV0dXJuIHN1cGVyLmNyZWF0ZURyYWdnZWRFbGVtZW50U2hvcnRjdXQodGV4dCwgZHJhZ2dlZEVsZW1lbnROb2RlKTtcbiAgICB9XG4gICAgY29uc3QgZHJhZ2dlZEVsZW1lbnRTaG9ydGN1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgLy8gZHJhZ2dlZEVsZW1lbnRTaG9ydGN1dC5pbm5lclRleHQgPSB0ZXh0O1xuICAgIGRyYWdnZWRFbGVtZW50U2hvcnRjdXQuc3R5bGUuY3NzVGV4dCA9IGAgXG4gICAgICAgICAgY3Vyc29yOiBncmFiYmluZztcbiAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgei1pbmRleDogMTAwMDtcbiAgICAgICAgICBib3JkZXItcmFkaXVzOiAzNnB4O1xuICAgICAgICAgIG1pbi13aWR0aDogMTAwcHg7XG4gICAgICAgICAgYm94LXNoYWRvdzogMHB4IDhweCAxNnB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcbiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiAxNnB4O1xuICAgICAgICAgIHBhZGRpbmctbGVmdDogMjBweDtcbiAgICAgICAgICBmb250LWZhbWlseTogXCJPcGVuIFNhbnNcIjtcbiAgICAgICAgYDtcblxuICAgIGNvbnN0IGlzRGVlcENsb25lID0gdHJ1ZTtcbiAgICBjb25zdCBjbG9uZSA9IDxIVE1MRWxlbWVudD4oXG4gICAgICBkcmFnZ2VkRWxlbWVudE5vZGVcbiAgICAgICAgLmNsb3Nlc3QoXCJbZGF0YS1zdi1kcm9wLXRhcmdldC1pdGVtLXZhbHVlXVwiKVxuICAgICAgICAuY2xvbmVOb2RlKGlzRGVlcENsb25lKVxuICAgICk7XG4gICAgY29uc3QgY29udHJvbHNOb2RlOiBIVE1MRWxlbWVudCA9IGNsb25lLnF1ZXJ5U2VsZWN0b3IoXCIuc3ZjLWl0ZW0tdmFsdWUtY29udHJvbHNcIik7XG4gICAgY29udHJvbHNOb2RlLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG5cbiAgICBjbG9uZS5jbGFzc0xpc3QucmVtb3ZlKFwic3ZjLWl0ZW0tdmFsdWUtLW1vdmV1cFwiKTtcbiAgICBjbG9uZS5jbGFzc0xpc3QucmVtb3ZlKFwic3ZjLWl0ZW0tdmFsdWUtLW1vdmVkb3duXCIpO1xuICAgIHRoaXMuZHJhZ2dlZEVsZW1lbnQuaXNEcmFnRHJvcE1vdmVEb3duID0gZmFsc2U7XG4gICAgdGhpcy5kcmFnZ2VkRWxlbWVudC5pc0RyYWdEcm9wTW92ZVVwID0gZmFsc2U7XG5cbiAgICBkcmFnZ2VkRWxlbWVudFNob3J0Y3V0LmFwcGVuZENoaWxkKGNsb25lKTtcblxuICAgIHRoaXMuaXNCb3R0b20gPSBudWxsO1xuXG4gICAgcmV0dXJuIGRyYWdnZWRFbGVtZW50U2hvcnRjdXQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZmluZERyb3BUYXJnZXROb2RlQnlEcmFnT3Zlck5vZGUoXG4gICAgZHJhZ092ZXJOb2RlOiBIVE1MRWxlbWVudFxuICApOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgcmVzdWx0OiBIVE1MRWxlbWVudCA9IGRyYWdPdmVyTm9kZS5jbG9zZXN0KFxuICAgICAgdGhpcy5kcm9wVGFyZ2V0RGF0YUF0dHJpYnV0ZU5hbWVcbiAgICApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0RHJvcFRhcmdldEJ5RGF0YUF0dHJpYnV0ZVZhbHVlKFxuICAgIGRhdGFBdHRyaWJ1dGVWYWx1ZTogc3RyaW5nXG4gICk6IEl0ZW1WYWx1ZSB7XG4gICAgbGV0IGRyYWdPdmVyQ2hvaWNlO1xuXG4gICAgZHJhZ092ZXJDaG9pY2UgPSB0aGlzLnBhcmVudEVsZW1lbnQuY2hvaWNlcy5maWx0ZXIoXG4gICAgICAoY2hvaWNlOiBJdGVtVmFsdWUpID0+IFwiXCIgKyBjaG9pY2UudmFsdWUgPT0gZGF0YUF0dHJpYnV0ZVZhbHVlXG4gICAgKVswXTtcblxuICAgIHJldHVybiBkcmFnT3ZlckNob2ljZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmlzaWJsZUNob2ljZXMoKSB7XG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy5wYXJlbnRFbGVtZW50O1xuICAgIGlmIChwYXJlbnQuZ2V0VHlwZSgpID09PSBcInJhbmtpbmdcIikgcmV0dXJuIDxRdWVzdGlvblJhbmtpbmdNb2RlbD5wYXJlbnQucmFua2luZ0Nob2ljZXM7XG4gICAgcmV0dXJuIHBhcmVudC52aXNpYmxlQ2hvaWNlcztcbiAgfVxuXG4gIHByb3RlY3RlZCBpc0Ryb3BUYXJnZXRWYWxpZChcbiAgICBkcm9wVGFyZ2V0OiBJdGVtVmFsdWUsXG4gICAgaXNCb3R0b206IGJvb2xlYW4sXG4gICAgZHJvcFRhcmdldE5vZGU/OiBIVE1MRWxlbWVudFxuICApOiBib29sZWFuIHtcbiAgICBjb25zdCBjaG9pY2VzID0gdGhpcy5nZXRWaXNpYmxlQ2hvaWNlcygpO1xuXG4gICAgaWYgKHRoaXMucGFyZW50RWxlbWVudC5nZXRUeXBlKCkgIT09IFwiaW1hZ2VwaWNrZXJcIikge1xuICAgICAgY29uc3QgZHJvcFRhcmdldEluZGV4ID0gY2hvaWNlcy5pbmRleE9mKHRoaXMuZHJvcFRhcmdldCk7XG4gICAgICBjb25zdCBkcmFnZ2VkRWxlbWVudEluZGV4ID0gY2hvaWNlcy5pbmRleE9mKHRoaXMuZHJhZ2dlZEVsZW1lbnQpO1xuXG4gICAgICBpZiAoZHJhZ2dlZEVsZW1lbnRJbmRleCA+IGRyb3BUYXJnZXRJbmRleCAmJiB0aGlzLmRyb3BUYXJnZXQuaXNEcmFnRHJvcE1vdmVVcCkge1xuICAgICAgICB0aGlzLmRyb3BUYXJnZXQuaXNEcmFnRHJvcE1vdmVVcCA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChkcmFnZ2VkRWxlbWVudEluZGV4IDwgZHJvcFRhcmdldEluZGV4ICYmIHRoaXMuZHJvcFRhcmdldC5pc0RyYWdEcm9wTW92ZURvd24pIHtcbiAgICAgICAgdGhpcy5kcm9wVGFyZ2V0LmlzRHJhZ0Ryb3BNb3ZlRG93biA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2hvdWxkbid0IGFsbG93IHRvIGRyb3Agb24gXCJhZG9ybmVyc1wiIChzZWxlY3RhbGwsIG5vbmUsIG90aGVyKVxuICAgIGlmIChjaG9pY2VzLmluZGV4T2YoZHJvcFRhcmdldCkgPT09IC0xKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjYWxjdWxhdGVJc0JvdHRvbShjbGllbnRZOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBjaG9pY2VzID0gdGhpcy5nZXRWaXNpYmxlQ2hvaWNlcygpO1xuICAgIHJldHVybiAoXG4gICAgICBjaG9pY2VzLmluZGV4T2YodGhpcy5kcm9wVGFyZ2V0KSAtIGNob2ljZXMuaW5kZXhPZih0aGlzLmRyYWdnZWRFbGVtZW50KSA+XG4gICAgICAwXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhZnRlckRyYWdPdmVyKGRyb3BUYXJnZXROb2RlOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRHJvcFRhcmdldERvZXNudENoYW5nZWQodGhpcy5pc0JvdHRvbSkpIHJldHVybjtcbiAgICBpZiAodGhpcy5kcm9wVGFyZ2V0ID09PSB0aGlzLmRyYWdnZWRFbGVtZW50KSByZXR1cm47XG4gICAgaWYgKHRoaXMucGFyZW50RWxlbWVudC5nZXRUeXBlKCkgPT09IFwiaW1hZ2VwaWNrZXJcIikgcmV0dXJuO1xuXG4gICAgY29uc3QgY2hvaWNlcyA9IHRoaXMuZ2V0VmlzaWJsZUNob2ljZXMoKTtcbiAgICBjb25zdCBkcm9wVGFyZ2V0SW5kZXggPSBjaG9pY2VzLmluZGV4T2YodGhpcy5kcm9wVGFyZ2V0KTtcbiAgICBjb25zdCBkcmFnZ2VkRWxlbWVudEluZGV4ID0gY2hvaWNlcy5pbmRleE9mKHRoaXMuZHJhZ2dlZEVsZW1lbnQpO1xuXG4gICAgY2hvaWNlcy5zcGxpY2UoZHJhZ2dlZEVsZW1lbnRJbmRleCwgMSk7XG4gICAgY2hvaWNlcy5zcGxpY2UoZHJvcFRhcmdldEluZGV4LCAwLCB0aGlzLmRyYWdnZWRFbGVtZW50KTtcblxuICAgIGlmIChkcmFnZ2VkRWxlbWVudEluZGV4ICE9PSBkcm9wVGFyZ2V0SW5kZXgpIHtcbiAgICAgIGRyb3BUYXJnZXROb2RlLmNsYXNzTGlzdC5yZW1vdmUoXCJzdmMtaXRlbS12YWx1ZS0tbW92ZXVwXCIpO1xuICAgICAgZHJvcFRhcmdldE5vZGUuY2xhc3NMaXN0LnJlbW92ZShcInN2Yy1pdGVtLXZhbHVlLS1tb3ZlZG93blwiKTtcbiAgICAgIHRoaXMuZHJvcFRhcmdldC5pc0RyYWdEcm9wTW92ZURvd24gPSBmYWxzZTtcbiAgICAgIHRoaXMuZHJvcFRhcmdldC5pc0RyYWdEcm9wTW92ZVVwID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGRyYWdnZWRFbGVtZW50SW5kZXggPiBkcm9wVGFyZ2V0SW5kZXgpIHtcbiAgICAgIHRoaXMuZHJvcFRhcmdldC5pc0RyYWdEcm9wTW92ZURvd24gPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChkcmFnZ2VkRWxlbWVudEluZGV4IDwgZHJvcFRhcmdldEluZGV4KSB7XG4gICAgICB0aGlzLmRyb3BUYXJnZXQuaXNEcmFnRHJvcE1vdmVVcCA9IHRydWU7XG4gICAgfVxuICAgIHN1cGVyLmdob3N0UG9zaXRpb25DaGFuZ2VkKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZG9Ecm9wKCk6IGFueSB7XG4gICAgY29uc3QgY2hvaWNlcyA9IHRoaXMucGFyZW50RWxlbWVudC5jaG9pY2VzO1xuICAgIGNvbnN0IGZpbHRlcmVkQ2hvaWNlcyA9IHRoaXMuZ2V0VmlzaWJsZUNob2ljZXMoKS5maWx0ZXIoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIGNob2ljZXMuaW5kZXhPZihpdGVtKSAhPT0gLTE7XG4gICAgfSk7XG5cbiAgICBjb25zdCBvbGRJbmRleCA9IGNob2ljZXMuaW5kZXhPZih0aGlzLmRyYWdnZWRFbGVtZW50KTtcbiAgICBsZXQgbmV3SW5kZXggPSBmaWx0ZXJlZENob2ljZXMuaW5kZXhPZih0aGlzLmRyYWdnZWRFbGVtZW50KTtcblxuICAgIGNob2ljZXMuc3BsaWNlKG9sZEluZGV4LCAxKTtcbiAgICBjaG9pY2VzLnNwbGljZShuZXdJbmRleCwgMCwgdGhpcy5kcmFnZ2VkRWxlbWVudCk7XG5cbiAgICByZXR1cm4gdGhpcy5wYXJlbnRFbGVtZW50O1xuICB9XG5cbiAgcHJvdGVjdGVkIGRvQ2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlQ2hvaWNlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVWaXNpYmxlQ2hvaWNlcygpIHtcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnBhcmVudEVsZW1lbnQ7XG4gICAgdGhpcy5wYXJlbnRFbGVtZW50LmdldFR5cGUoKSA9PT0gXCJyYW5raW5nXCIgP1xuICAgICAgcGFyZW50LnVwZGF0ZVJhbmtpbmdDaG9pY2VzKCkgOlxuICAgICAgcGFyZW50W1widXBkYXRlVmlzaWJsZUNob2ljZXNcIl0oKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgU3VydmV5TW9kZWwgfSBmcm9tIFwiLi4vc3VydmV5XCI7XG5pbXBvcnQgeyBCYXNlLCBFdmVudEJhc2UgfSBmcm9tIFwiLi4vYmFzZVwiO1xuaW1wb3J0IHsgSVN1cnZleSB9IGZyb20gXCIuLi9iYXNlLWludGVyZmFjZXNcIjtcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSBcIi4uL2pzb25vYmplY3RcIjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERyYWdEcm9wQ29yZTxUPiBleHRlbmRzIEJhc2Uge1xuICBAcHJvcGVydHkoe1xuICAgIGRlZmF1bHRWYWx1ZTogbnVsbCxcbiAgICBvblNldDogKHZhbCwgdGFyZ2V0OiBEcmFnRHJvcENvcmU8VD4pID0+IHtcbiAgICAgIHRhcmdldC5naG9zdFBvc2l0aW9uQ2hhbmdlZCgpO1xuICAgIH0sXG4gIH0pXG4gIGlzQm90dG9tOiBib29sZWFuOyAvL1RPRE8gcmVuYW1lIGlzQm90dG9tIHRvIGlzU2hvd0dob3N0QXRCb3R0b21PZkRyb3BUYXJnZXRcbiAgcHVibGljIG9uR2hvc3RQb3NpdGlvbkNoYW5nZWQ6IEV2ZW50QmFzZTxCYXNlPiA9IG5ldyBFdmVudEJhc2U8QmFzZT4oKTtcbiAgcHJvdGVjdGVkIGdob3N0UG9zaXRpb25DaGFuZ2VkKCk6IHZvaWQge1xuICAgIHRoaXMub25HaG9zdFBvc2l0aW9uQ2hhbmdlZC5maXJlKHt9LCB7fSk7XG4gIH1cblxuICBwdWJsaWMgb25CZWZvcmVEcm9wOiBFdmVudEJhc2U8RHJhZ0Ryb3BDb3JlPFQ+PiA9IG5ldyBFdmVudEJhc2UoKTtcbiAgcHVibGljIG9uQWZ0ZXJEcm9wOiBFdmVudEJhc2U8RHJhZ0Ryb3BDb3JlPFQ+PiA9IG5ldyBFdmVudEJhc2UoKTtcblxuICBwdWJsaWMgZHJhZ2dlZEVsZW1lbnQ6IGFueSA9IG51bGw7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXQgZHJhZ2dlZEVsZW1lbnRUeXBlKCk6IHN0cmluZztcbiAgcHJvdGVjdGVkIHBhcmVudEVsZW1lbnQ6IFQ7XG4gIHB1YmxpYyBkcm9wVGFyZ2V0OiBhbnkgPSBudWxsO1xuICBwcm90ZWN0ZWQgZ2V0IGRyb3BUYXJnZXREYXRhQXR0cmlidXRlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgW2RhdGEtc3YtZHJvcC10YXJnZXQtJHt0aGlzLmRyYWdnZWRFbGVtZW50VHlwZX1dYDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IHN1cnZleSgpOiBTdXJ2ZXlNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5VmFsdWUgfHwgdGhpcy5jcmVhdG9yLnN1cnZleTtcbiAgfVxuXG4gIHB1YmxpYyBwcmV2RHJvcFRhcmdldDogYW55ID0gbnVsbDtcbiAgcHJvdGVjdGVkIGRyYWdnZWRFbGVtZW50U2hvcnRjdXQ6IEhUTUxFbGVtZW50ID0gbnVsbDtcbiAgcHJpdmF0ZSBzY3JvbGxJbnRlcnZhbElkOiBudW1iZXIgPSBudWxsO1xuICBwcml2YXRlIGFsbG93RHJvcEhlcmUgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHN1cnZleVZhbHVlPzogSVN1cnZleSwgcHJpdmF0ZSBjcmVhdG9yPzogYW55KSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGFydERyYWcoXG4gICAgZXZlbnQ6IFBvaW50ZXJFdmVudCxcbiAgICBkcmFnZ2VkRWxlbWVudDogYW55LFxuICAgIHBhcmVudEVsZW1lbnQ/OiBhbnksXG4gICAgZHJhZ2dlZEVsZW1lbnROb2RlPzogSFRNTEVsZW1lbnRcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5kcmFnZ2VkRWxlbWVudCA9IGRyYWdnZWRFbGVtZW50O1xuICAgIHRoaXMucGFyZW50RWxlbWVudCA9IHBhcmVudEVsZW1lbnQ7XG5cbiAgICB0aGlzLmRvU3RhcnREcmFnKCk7XG5cbiAgICBjb25zdCBzaG9ydGN1dFRleHQgPSB0aGlzLmdldFNob3J0Y3V0VGV4dCh0aGlzLmRyYWdnZWRFbGVtZW50KTtcbiAgICB0aGlzLmRyYWdnZWRFbGVtZW50U2hvcnRjdXQgPSB0aGlzLmNyZWF0ZURyYWdnZWRFbGVtZW50U2hvcnRjdXQoXG4gICAgICBzaG9ydGN1dFRleHQsXG4gICAgICBkcmFnZ2VkRWxlbWVudE5vZGVcbiAgICApO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKHRoaXMuZHJhZ2dlZEVsZW1lbnRTaG9ydGN1dCk7XG4gICAgdGhpcy5tb3ZlU2hvcnRjdXRFbGVtZW50KGV2ZW50KTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVybW92ZVwiLCB0aGlzLmRyYWdPdmVyKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmNhbmNlbFwiLCB0aGlzLmhhbmRsZVBvaW50ZXJDYW5jZWwpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuaGFuZGxlRXNjYXBlQnV0dG9uKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIHRoaXMuZHJvcCk7XG4gICAgdGhpcy5kcmFnZ2VkRWxlbWVudFNob3J0Y3V0LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgdGhpcy5kcm9wKTtcbiAgfVxuXG4gIHByaXZhdGUgZHJhZ092ZXIgPSAoZXZlbnQ6IFBvaW50ZXJFdmVudCkgPT4ge1xuICAgIHRoaXMubW92ZVNob3J0Y3V0RWxlbWVudChldmVudCk7XG4gICAgdGhpcy5kcmFnZ2VkRWxlbWVudFNob3J0Y3V0LnN0eWxlLmN1cnNvciA9IFwiZ3JhYmJpbmdcIjtcblxuICAgIGNvbnN0IGRyb3BUYXJnZXROb2RlID0gdGhpcy5maW5kRHJvcFRhcmdldE5vZGVGcm9tUG9pbnQoXG4gICAgICBldmVudC5jbGllbnRYLFxuICAgICAgZXZlbnQuY2xpZW50WVxuICAgICk7XG5cbiAgICBpZiAoIWRyb3BUYXJnZXROb2RlKSB7XG4gICAgICB0aGlzLmJhbkRyb3BIZXJlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kcm9wVGFyZ2V0ID0gdGhpcy5nZXREcm9wVGFyZ2V0QnlOb2RlKGRyb3BUYXJnZXROb2RlLCBldmVudCk7XG5cbiAgICBsZXQgaXNCb3R0b20gPSB0aGlzLmNhbGN1bGF0ZUlzQm90dG9tKGV2ZW50LmNsaWVudFksIGRyb3BUYXJnZXROb2RlKTtcblxuICAgIGNvbnN0IGlzRHJvcFRhcmdldFZhbGlkID0gdGhpcy5pc0Ryb3BUYXJnZXRWYWxpZCh0aGlzLmRyb3BUYXJnZXQsIGlzQm90dG9tLCBkcm9wVGFyZ2V0Tm9kZSk7XG5cbiAgICB0aGlzLmRvRHJhZ092ZXIoZHJvcFRhcmdldE5vZGUpO1xuXG4gICAgaWYgKCFpc0Ryb3BUYXJnZXRWYWxpZCkge1xuICAgICAgdGhpcy5iYW5Ecm9wSGVyZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYWxsb3dEcm9wSGVyZSA9IHRydWU7XG4gICAgaWYgKHRoaXMuaXNEcm9wVGFyZ2V0RG9lc250Q2hhbmdlZChpc0JvdHRvbSkpIHJldHVybjtcblxuICAgIHRoaXMuaXNCb3R0b20gPSBudWxsOyAvL1RPRE8gbmVlZCBmb3IgcHJvcGVydHkgY2hhbmdlIHRyaWdnZXIgd2l0aCBndWFyYW50ZWUgYnV0IGl0IHdvdWxkIGJlIGJldHRlciBub3QgdG8gd2F0Y2ggb24gaXNCb3R0b20gcHJvcGVydHkgYnV0IGhhdmUgc29tZSBldmVudCBsaWtlIG9uVmFsaWRUYXJnZXREcmFnT3ZlclxuICAgIHRoaXMuaXNCb3R0b20gPSBpc0JvdHRvbTtcbiAgICB0aGlzLmFmdGVyRHJhZ092ZXIoZHJvcFRhcmdldE5vZGUpO1xuICAgIHRoaXMucHJldkRyb3BUYXJnZXQgPSB0aGlzLmRyb3BUYXJnZXQ7XG4gIH07XG5cbiAgcHJpdmF0ZSBkcm9wID0gKCkgPT4ge1xuICAgIGlmICh0aGlzLmFsbG93RHJvcEhlcmUpIHtcbiAgICAgIHRoaXMub25CZWZvcmVEcm9wLmZpcmUodGhpcywgbnVsbCk7XG4gICAgICBjb25zdCBuZXdFbGVtZW50ID0gdGhpcy5kb0Ryb3AoKTtcbiAgICAgIHRoaXMub25BZnRlckRyb3AuZmlyZSh0aGlzLCB7IGRyYWdnZWRFbGVtZW50OiBuZXdFbGVtZW50IH0pO1xuICAgIH1cblxuICAgIHRoaXMuY2xlYXIoKTtcbiAgfTtcblxuICBwcm90ZWN0ZWQgaXNEcm9wVGFyZ2V0RG9lc250Q2hhbmdlZChuZXdJc0JvdHRvbTogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmRyb3BUYXJnZXQgPT09IHRoaXMucHJldkRyb3BUYXJnZXQgJiYgbmV3SXNCb3R0b20gPT09IHRoaXMuaXNCb3R0b21cbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRvU3RhcnREcmFnKCk6IHZvaWQgeyB9XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRTaG9ydGN1dFRleHQoZHJhZ2dlZEVsZW1lbnQ6IGFueSk6IHN0cmluZztcblxuICBwcm90ZWN0ZWQgY3JlYXRlRHJhZ2dlZEVsZW1lbnRTaG9ydGN1dCh0ZXh0OiBzdHJpbmcsIGRyYWdnZWRFbGVtZW50Tm9kZT86IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0IGRyYWdnZWRFbGVtZW50U2hvcnRjdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGRyYWdnZWRFbGVtZW50U2hvcnRjdXQuaW5uZXJUZXh0ID0gdGV4dDtcbiAgICBkcmFnZ2VkRWxlbWVudFNob3J0Y3V0LnN0eWxlLmNzc1RleHQgPVxuICAgICAgXCJoZWlnaHQ6IDI0cHg7IG1pbi13aWR0aDogMTAwcHg7IGJvcmRlci1yYWRpdXM6IDM2cHg7IGJhY2tncm91bmQtY29sb3I6IHdoaXRlOyBwYWRkaW5nOiAxNnB4OyBjdXJzb3I6IGdyYWJiaW5nOyBwb3NpdGlvbjogYWJzb2x1dGU7IHotaW5kZXg6IDEwMDA7IGJveC1zaGFkb3c6IDBweCA4cHggMTZweCByZ2JhKDAsIDAsIDAsIDAuMSk7IGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJzsgZm9udC1zaXplOiAxNnB4OyBwYWRkaW5nLWxlZnQ6IDIwcHg7IGxpbmUtaGVpZ2h0OiAyNHB4O1wiO1xuICAgIHJldHVybiBkcmFnZ2VkRWxlbWVudFNob3J0Y3V0O1xuICB9XG5cbiAgcHJvdGVjdGVkIGRvRHJhZ092ZXIoZHJvcFRhcmdldE5vZGU/OiBIVE1MRWxlbWVudCk6IHZvaWQgeyB9XG4gIHByb3RlY3RlZCBhZnRlckRyYWdPdmVyKGRyb3BUYXJnZXROb2RlPzogSFRNTEVsZW1lbnQpOiB2b2lkIHsgfVxuXG4gIHB1YmxpYyBnZXRHaG9zdFBvc2l0aW9uKGl0ZW06IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZHJvcFRhcmdldCAhPT0gaXRlbSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMuaXNCb3R0b20pIHJldHVybiBcImJvdHRvbVwiO1xuICAgIHJldHVybiBcInRvcFwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGlzRHJvcFRhcmdldFZhbGlkKFxuICAgIGRyb3BUYXJnZXQ6IGFueSxcbiAgICBpc0JvdHRvbTogYm9vbGVhbixcbiAgICBkcm9wVGFyZ2V0Tm9kZT86IEhUTUxFbGVtZW50XG4gICk6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBoYW5kbGVQb2ludGVyQ2FuY2VsID0gKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICB0aGlzLmNsZWFyKCk7XG4gIH07XG5cbiAgcHJvdGVjdGVkIGhhbmRsZUVzY2FwZUJ1dHRvbiA9IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgIGlmIChldmVudC5rZXlDb2RlID09IDI3KSB7XG4gICAgICB0aGlzLmNsZWFyKCk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgbW92ZVNob3J0Y3V0RWxlbWVudChldmVudDogUG9pbnRlckV2ZW50KSB7XG4gICAgdGhpcy5kb1Njcm9sbChldmVudC5jbGllbnRZLCBldmVudC5jbGllbnRYKTtcblxuICAgIGNvbnN0IHNob3J0Y3V0SGVpZ2h0ID0gdGhpcy5kcmFnZ2VkRWxlbWVudFNob3J0Y3V0Lm9mZnNldEhlaWdodDtcbiAgICBjb25zdCBzaG9ydGN1dFdpZHRoID0gdGhpcy5kcmFnZ2VkRWxlbWVudFNob3J0Y3V0Lm9mZnNldFdpZHRoO1xuICAgIGxldCBzaG9ydGN1dFhPZmZzZXQ7XG4gICAgbGV0IHNob3J0Y3V0WU9mZnNldDtcblxuICAgIGNvbnN0IGRyYWdnZWRJY29uID1cbiAgICAgIHRoaXMuZHJhZ2dlZEVsZW1lbnRTaG9ydGN1dC5xdWVyeVNlbGVjdG9yKFwiLnN2Yy1pdGVtLXZhbHVlLWNvbnRyb2xzX19kcmFnIC5zdi1zdmctaWNvblwiKVxuICAgICAgfHwgdGhpcy5kcmFnZ2VkRWxlbWVudFNob3J0Y3V0LnF1ZXJ5U2VsZWN0b3IoXCIuc3YtcmFua2luZy1pdGVtX19pY29uXCIpO1xuICAgIGlmIChkcmFnZ2VkSWNvbikge1xuICAgICAgY29uc3QgcmVjdE91dGVyID0gdGhpcy5kcmFnZ2VkRWxlbWVudFNob3J0Y3V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgcmVjdElubmVyID0gZHJhZ2dlZEljb24uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBzaG9ydGN1dFhPZmZzZXQgPSByZWN0SW5uZXIueCAtIHJlY3RPdXRlci54ICsgcmVjdElubmVyLndpZHRoIC8gMjtcbiAgICAgIHNob3J0Y3V0WU9mZnNldCA9IHJlY3RJbm5lci55IC0gcmVjdE91dGVyLnkgKyByZWN0SW5uZXIuaGVpZ2h0IC8gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvcnRjdXRYT2Zmc2V0ID0gc2hvcnRjdXRXaWR0aCAvIDI7XG4gICAgICBzaG9ydGN1dFlPZmZzZXQgPSBzaG9ydGN1dEhlaWdodCAvIDI7XG4gICAgfVxuXG4gICAgY29uc3QgZG9jdW1lbnRDbGllbnRIZWlnaHQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgIGNvbnN0IGRvY3VtZW50Q2xpZW50V2lkdGggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7XG5cbiAgICBpZiAoZXZlbnQuY2xpZW50WCArIHNob3J0Y3V0WE9mZnNldCA+PSBkb2N1bWVudENsaWVudFdpZHRoKSB7XG4gICAgICB0aGlzLmRyYWdnZWRFbGVtZW50U2hvcnRjdXQuc3R5bGUubGVmdCA9XG4gICAgICAgIGV2ZW50LnBhZ2VYIC1cbiAgICAgICAgZXZlbnQuY2xpZW50WCArXG4gICAgICAgIGRvY3VtZW50Q2xpZW50V2lkdGggLVxuICAgICAgICBzaG9ydGN1dFdpZHRoICtcbiAgICAgICAgXCJweFwiO1xuICAgICAgdGhpcy5kcmFnZ2VkRWxlbWVudFNob3J0Y3V0LnN0eWxlLnRvcCA9XG4gICAgICAgIGV2ZW50LnBhZ2VZIC0gc2hvcnRjdXRZT2Zmc2V0ICsgXCJweFwiO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudC5jbGllbnRYIC0gc2hvcnRjdXRYT2Zmc2V0IDw9IDApIHtcbiAgICAgIHRoaXMuZHJhZ2dlZEVsZW1lbnRTaG9ydGN1dC5zdHlsZS5sZWZ0ID1cbiAgICAgICAgZXZlbnQucGFnZVggLSBldmVudC5jbGllbnRYICsgXCJweFwiO1xuICAgICAgdGhpcy5kcmFnZ2VkRWxlbWVudFNob3J0Y3V0LnN0eWxlLnRvcCA9XG4gICAgICAgIGV2ZW50LnBhZ2VZIC0gc2hvcnRjdXRZT2Zmc2V0ICsgXCJweFwiO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudC5jbGllbnRZICsgc2hvcnRjdXRZT2Zmc2V0ID49IGRvY3VtZW50Q2xpZW50SGVpZ2h0KSB7XG4gICAgICB0aGlzLmRyYWdnZWRFbGVtZW50U2hvcnRjdXQuc3R5bGUubGVmdCA9XG4gICAgICAgIGV2ZW50LnBhZ2VYIC0gc2hvcnRjdXRYT2Zmc2V0ICsgXCJweFwiO1xuICAgICAgdGhpcy5kcmFnZ2VkRWxlbWVudFNob3J0Y3V0LnN0eWxlLnRvcCA9XG4gICAgICAgIGV2ZW50LnBhZ2VZIC1cbiAgICAgICAgZXZlbnQuY2xpZW50WSArXG4gICAgICAgIGRvY3VtZW50Q2xpZW50SGVpZ2h0IC1cbiAgICAgICAgc2hvcnRjdXRIZWlnaHQgK1xuICAgICAgICBcInB4XCI7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LmNsaWVudFkgLSBzaG9ydGN1dFlPZmZzZXQgPD0gMCkge1xuICAgICAgdGhpcy5kcmFnZ2VkRWxlbWVudFNob3J0Y3V0LnN0eWxlLmxlZnQgPVxuICAgICAgICBldmVudC5wYWdlWCAtIHNob3J0Y3V0WE9mZnNldCArIFwicHhcIjtcbiAgICAgIHRoaXMuZHJhZ2dlZEVsZW1lbnRTaG9ydGN1dC5zdHlsZS50b3AgPVxuICAgICAgICBldmVudC5wYWdlWSAtIGV2ZW50LmNsaWVudFkgKyBcInB4XCI7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kcmFnZ2VkRWxlbWVudFNob3J0Y3V0LnN0eWxlLmxlZnQgPVxuICAgICAgZXZlbnQucGFnZVggLSBzaG9ydGN1dFhPZmZzZXQgKyBcInB4XCI7XG4gICAgdGhpcy5kcmFnZ2VkRWxlbWVudFNob3J0Y3V0LnN0eWxlLnRvcCA9XG4gICAgICBldmVudC5wYWdlWSAtIHNob3J0Y3V0WU9mZnNldCArIFwicHhcIjtcbiAgfVxuXG4gIHByaXZhdGUgZG9TY3JvbGwoY2xpZW50WTogbnVtYmVyLCBjbGllbnRYOiBudW1iZXIpIHtcbiAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLnNjcm9sbEludGVydmFsSWQpO1xuICAgIGNvbnN0IHN0YXJ0U2Nyb2xsQm91bmRhcnkgPSA1MDtcblxuICAgIC8vIHRoaXMuZHJhZ2dlZEVsZW1lbnRTaG9ydGN1dC5oaWRkZW4gPSB0cnVlO1xuICAgIC8vIGxldCBkcmFnT3Zlck5vZGUgPSA8SFRNTEVsZW1lbnQ+ZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChjbGllbnRYLCBjbGllbnRZKTtcbiAgICAvLyB0aGlzLmRyYWdnZWRFbGVtZW50U2hvcnRjdXQuaGlkZGVuID0gZmFsc2U7XG5cbiAgICAvLyBmdW5jdGlvbiBnZXRTY3JvbGxhYmxlUGFyZW50KG5vZGU6SFRNTEVsZW1lbnQpOkhUTUxFbGVtZW50IHtcbiAgICAvLyAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAvLyAgICAgcmV0dXJuIG51bGw7XG4gICAgLy8gICB9XG4gICAgLy8gICBpZiAobm9kZS5zY3JvbGxIZWlnaHQgPiBub2RlLmNsaWVudEhlaWdodCkge1xuICAgIC8vICAgICByZXR1cm4gbm9kZTtcbiAgICAvLyAgIH0gZWxzZSB7XG4gICAgLy8gICAgIHJldHVybiBnZXRTY3JvbGxhYmxlUGFyZW50KDxIVE1MRWxlbWVudD5ub2RlLnBhcmVudE5vZGUpO1xuICAgIC8vICAgfVxuICAgIC8vIH1cbiAgICAvLyBsZXQgc2Nyb2xsYWJsZVBhcmVudE5vZGUgPSBnZXRTY3JvbGxhYmxlUGFyZW50KGRyYWdPdmVyTm9kZSk7XG4gICAgbGV0IHNjcm9sbGFibGVQYXJlbnROb2RlID1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuc2Qtcm93LS1tdWx0aXBsZVwiKSB8fFxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5zdmMtdGFiLWRlc2lnbmVyLnNkLXJvb3QtbW9kZXJuXCIpIHx8XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLnN2LXJvb3QtbW9kZXJuXCIpIHx8XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLnN2X2NvbnRhaW5lclwiKTtcblxuICAgIGxldCB0b3AgPSBzY3JvbGxhYmxlUGFyZW50Tm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7XG4gICAgbGV0IGJvdHRvbSA9IHNjcm9sbGFibGVQYXJlbnROb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbTtcbiAgICBsZXQgbGVmdCA9IHNjcm9sbGFibGVQYXJlbnROb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG4gICAgbGV0IHJpZ2h0ID0gc2Nyb2xsYWJsZVBhcmVudE5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQ7XG5cbiAgICBjb25zdCByZXBlYXQgPSAoKSA9PiB7XG4gICAgICBpZiAoY2xpZW50WSAtIHRvcCA8PSBzdGFydFNjcm9sbEJvdW5kYXJ5KSB7XG4gICAgICAgIHNjcm9sbGFibGVQYXJlbnROb2RlLnNjcm9sbFRvcCAtPSAxNTtcbiAgICAgIH0gZWxzZSBpZiAoYm90dG9tIC0gY2xpZW50WSA8PSBzdGFydFNjcm9sbEJvdW5kYXJ5KSB7XG4gICAgICAgIHNjcm9sbGFibGVQYXJlbnROb2RlLnNjcm9sbFRvcCArPSAxNTtcbiAgICAgIH0gZWxzZSBpZiAocmlnaHQgLSBjbGllbnRYIDw9IHN0YXJ0U2Nyb2xsQm91bmRhcnkpIHtcbiAgICAgICAgc2Nyb2xsYWJsZVBhcmVudE5vZGUuc2Nyb2xsTGVmdCArPSAxNTtcbiAgICAgIH0gZWxzZSBpZiAoY2xpZW50WCAtIGxlZnQgPD0gc3RhcnRTY3JvbGxCb3VuZGFyeSkge1xuICAgICAgICBzY3JvbGxhYmxlUGFyZW50Tm9kZS5zY3JvbGxMZWZ0IC09IDE1O1xuICAgICAgfVxuICAgICAgdGhpcy5zY3JvbGxJbnRlcnZhbElkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHJlcGVhdCk7XG4gICAgfTtcbiAgICB0aGlzLnNjcm9sbEludGVydmFsSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVwZWF0KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBiYW5Ecm9wSGVyZSA9ICgpOiB2b2lkID0+IHtcbiAgICB0aGlzLmRvQmFuRHJvcEhlcmUoKTtcbiAgICB0aGlzLmFsbG93RHJvcEhlcmUgPSBmYWxzZTtcbiAgICB0aGlzLmRyb3BUYXJnZXQgPSBudWxsO1xuICAgIHRoaXMuZHJhZ2dlZEVsZW1lbnRTaG9ydGN1dC5zdHlsZS5jdXJzb3IgPSBcIm5vdC1hbGxvd2VkXCI7XG4gICAgdGhpcy5pc0JvdHRvbSA9IG51bGw7XG4gIH07XG5cbiAgcHJvdGVjdGVkIGRvQmFuRHJvcEhlcmUgPSAoKTogdm9pZCA9PiB7IH07XG5cbiAgcHJvdGVjdGVkIGdldERhdGFBdHRyaWJ1dGVWYWx1ZUJ5Tm9kZShub2RlOiBIVE1MRWxlbWVudCkge1xuICAgIGxldCBkYXRhc2V0TmFtZSA9IFwic3ZEcm9wVGFyZ2V0XCI7XG4gICAgY29uc3Qgd29yZHMgPSB0aGlzLmRyYWdnZWRFbGVtZW50VHlwZS5zcGxpdChcIi1cIik7XG4gICAgd29yZHMuZm9yRWFjaCgod29yZCkgPT4ge1xuICAgICAgZGF0YXNldE5hbWUgKz0gdGhpcy5jYXBpdGFsaXplRmlyc3RMZXR0ZXIod29yZCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG5vZGUuZGF0YXNldFtkYXRhc2V0TmFtZV07XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0RHJvcFRhcmdldEJ5Tm9kZShcbiAgICBkcm9wVGFyZ2V0Tm9kZTogSFRNTEVsZW1lbnQsXG4gICAgZXZlbnQ6IFBvaW50ZXJFdmVudFxuICApOiBhbnkge1xuICAgIGxldCBkYXRhQXR0cmlidXRlVmFsdWUgPSB0aGlzLmdldERhdGFBdHRyaWJ1dGVWYWx1ZUJ5Tm9kZShkcm9wVGFyZ2V0Tm9kZSk7XG5cbiAgICByZXR1cm4gdGhpcy5nZXREcm9wVGFyZ2V0QnlEYXRhQXR0cmlidXRlVmFsdWUoXG4gICAgICBkYXRhQXR0cmlidXRlVmFsdWUsXG4gICAgICBkcm9wVGFyZ2V0Tm9kZSxcbiAgICAgIGV2ZW50XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKHN0cmluZzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0cmluZy5zbGljZSgxKTtcbiAgfVxuXG4gIC8vVE9ETyBhZGFuZG9uZSB1bnJlcXVpcmVkIHBhcmFtcyAoc3VydmV5LWVsZW1lbnRzKVxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0RHJvcFRhcmdldEJ5RGF0YUF0dHJpYnV0ZVZhbHVlKFxuICAgIGRhdGFBdHRyaWJ1dGVWYWx1ZTogc3RyaW5nLFxuICAgIGRyb3BUYXJnZXROb2RlPzogSFRNTEVsZW1lbnQsXG4gICAgZXZlbnQ/OiBQb2ludGVyRXZlbnRcbiAgKTogYW55O1xuXG4gIHByb3RlY3RlZCBjYWxjdWxhdGVNaWRkbGVPZkhUTUxFbGVtZW50KEhUTUxFbGVtZW50OiBIVE1MRWxlbWVudCk6IG51bWJlciB7XG4gICAgY29uc3QgcmVjdCA9IEhUTUxFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHJldHVybiByZWN0LnkgKyByZWN0LmhlaWdodCAvIDI7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2FsY3VsYXRlSXNCb3R0b20oXG4gICAgY2xpZW50WTogbnVtYmVyLFxuICAgIGRyb3BUYXJnZXROb2RlPzogSFRNTEVsZW1lbnRcbiAgKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbWlkZGxlID0gdGhpcy5jYWxjdWxhdGVNaWRkbGVPZkhUTUxFbGVtZW50KGRyb3BUYXJnZXROb2RlKTtcbiAgICByZXR1cm4gY2xpZW50WSA+PSBtaWRkbGU7XG4gIH1cblxuICBwcml2YXRlIGZpbmREcm9wVGFyZ2V0Tm9kZUZyb21Qb2ludChcbiAgICBjbGllbnRYOiBudW1iZXIsXG4gICAgY2xpZW50WTogbnVtYmVyXG4gICk6IEhUTUxFbGVtZW50IHtcbiAgICB0aGlzLmRyYWdnZWRFbGVtZW50U2hvcnRjdXQuaGlkZGVuID0gdHJ1ZTtcbiAgICBsZXQgZHJhZ092ZXJOb2RlID0gPEhUTUxFbGVtZW50PmRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoY2xpZW50WCwgY2xpZW50WSk7XG4gICAgdGhpcy5kcmFnZ2VkRWxlbWVudFNob3J0Y3V0LmhpZGRlbiA9IGZhbHNlO1xuXG4gICAgaWYgKCFkcmFnT3Zlck5vZGUpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHRoaXMuZmluZERyb3BUYXJnZXROb2RlQnlEcmFnT3Zlck5vZGUoZHJhZ092ZXJOb2RlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBmaW5kRHJvcFRhcmdldE5vZGVCeURyYWdPdmVyTm9kZShkcmFnT3Zlck5vZGU6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0IHJlc3VsdDogSFRNTEVsZW1lbnQgPVxuICAgICAgZHJhZ092ZXJOb2RlLnF1ZXJ5U2VsZWN0b3IodGhpcy5kcm9wVGFyZ2V0RGF0YUF0dHJpYnV0ZU5hbWUpIHx8XG4gICAgICBkcmFnT3Zlck5vZGUuY2xvc2VzdCh0aGlzLmRyb3BUYXJnZXREYXRhQXR0cmlidXRlTmFtZSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBkb0Ryb3AoKTogYW55O1xuXG4gIHByb3RlY3RlZCBjbGVhciA9ICgpID0+IHtcbiAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLnNjcm9sbEludGVydmFsSWQpO1xuXG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJtb3ZlXCIsIHRoaXMuZHJhZ092ZXIpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVyY2FuY2VsXCIsIHRoaXMuaGFuZGxlUG9pbnRlckNhbmNlbCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy5oYW5kbGVFc2NhcGVCdXR0b24pO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgdGhpcy5kcm9wKTtcbiAgICB0aGlzLmRyYWdnZWRFbGVtZW50U2hvcnRjdXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCB0aGlzLmRyb3ApO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGhpcy5kcmFnZ2VkRWxlbWVudFNob3J0Y3V0KTtcblxuICAgIHRoaXMuZG9DbGVhcigpO1xuXG4gICAgdGhpcy5kcm9wVGFyZ2V0ID0gbnVsbDtcblxuICAgIHRoaXMuZHJhZ2dlZEVsZW1lbnRTaG9ydGN1dCA9IG51bGw7XG4gICAgdGhpcy5kcmFnZ2VkRWxlbWVudCA9IG51bGw7XG4gICAgdGhpcy5pc0JvdHRvbSA9IG51bGw7XG4gICAgdGhpcy5wYXJlbnRFbGVtZW50ID0gbnVsbDtcbiAgICB0aGlzLnNjcm9sbEludGVydmFsSWQgPSBudWxsO1xuICB9O1xuXG4gIHByb3RlY3RlZCBkb0NsZWFyKCk6IHZvaWQgeyB9XG59XG4iLCJpbXBvcnQgeyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3cgfSBmcm9tIFwic3JjL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3ducmVuZGVyZWRcIjtcbmltcG9ydCB7IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlIH0gZnJvbSBcIi4uL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duYmFzZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWwgfSBmcm9tIFwiLi4vcXVlc3Rpb25fbWF0cml4ZHluYW1pY1wiO1xuaW1wb3J0IHsgRHJhZ0Ryb3BDb3JlIH0gZnJvbSBcIi4vY29yZVwiO1xuZXhwb3J0IGNsYXNzIERyYWdEcm9wTWF0cml4Um93cyBleHRlbmRzIERyYWdEcm9wQ29yZTxRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbD4ge1xuICBwcm90ZWN0ZWQgZ2V0IGRyYWdnZWRFbGVtZW50VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIm1hdHJpeC1yb3dcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBnaG9zdFBvc2l0aW9uQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudEVsZW1lbnQucmVuZGVyZWRUYWJsZS5yb3dzLmZvckVhY2goXG4gICAgICAocmVuZGVyZWRSb3c6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdykgPT4ge1xuICAgICAgICByZW5kZXJlZFJvdy5naG9zdFBvc2l0aW9uID0gdGhpcy5nZXRHaG9zdFBvc2l0aW9uKFxuICAgICAgICAgIHJlbmRlcmVkUm93LnJvd1xuICAgICAgICApO1xuICAgICAgfVxuICAgICk7XG4gICAgc3VwZXIuZ2hvc3RQb3NpdGlvbkNoYW5nZWQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRTaG9ydGN1dFRleHQoZHJhZ2dlZEVsZW1lbnQ6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgbWF0cml4ID0gdGhpcy5wYXJlbnRFbGVtZW50O1xuICAgIGNvbnN0IGluZGV4ID0gbWF0cml4LnZpc2libGVSb3dzLmluZGV4T2YoZHJhZ2dlZEVsZW1lbnQpICsgMTtcbiAgICByZXR1cm4gKFxuICAgICAgZHJhZ2dlZEVsZW1lbnQuY2VsbHNbMV0ucXVlc3Rpb25WYWx1ZS52YWx1ZSB8fFxuICAgICAgZHJhZ2dlZEVsZW1lbnQuY2VsbHNbMF0ucXVlc3Rpb25WYWx1ZS52YWx1ZSB8fFxuICAgICAgXCJcIiArIGluZGV4XG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXREcm9wVGFyZ2V0QnlEYXRhQXR0cmlidXRlVmFsdWUoXG4gICAgZGF0YUF0dHJpYnV0ZVZhbHVlOiBhbnlcbiAgKTogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2Uge1xuICAgIGNvbnN0IG1hdHJpeCA9IHRoaXMucGFyZW50RWxlbWVudDtcbiAgICBsZXQgZHJvcFRhcmdldFJvdztcblxuICAgIGRyb3BUYXJnZXRSb3cgPSBtYXRyaXgudmlzaWJsZVJvd3MuZmlsdGVyKFxuICAgICAgKHJvdzogYW55KSA9PiByb3cuaWQgPT09IGRhdGFBdHRyaWJ1dGVWYWx1ZVxuICAgIClbMF07XG5cbiAgICByZXR1cm4gZHJvcFRhcmdldFJvdztcbiAgfVxuXG4gIHByb3RlY3RlZCBpc0Ryb3BUYXJnZXRWYWxpZChkcm9wVGFyZ2V0OiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5kcm9wVGFyZ2V0ID09PSB0aGlzLmRyYWdnZWRFbGVtZW50KSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3Qgcm93cyA9IHRoaXMucGFyZW50RWxlbWVudC52aXNpYmxlUm93cztcbiAgICByZXR1cm4gcm93cy5pbmRleE9mKGRyb3BUYXJnZXQpICE9PSAtMTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjYWxjdWxhdGVJc0JvdHRvbShjbGllbnRZOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCByb3dzID0gdGhpcy5wYXJlbnRFbGVtZW50LnZpc2libGVSb3dzO1xuICAgIHJldHVybiAoXG4gICAgICByb3dzLmluZGV4T2YodGhpcy5kcm9wVGFyZ2V0KSAtIHJvd3MuaW5kZXhPZih0aGlzLmRyYWdnZWRFbGVtZW50KSA+IDBcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRvRHJvcCA9ICgpOiBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbCA9PiB7XG4gICAgY29uc3QgbWF0cml4ID0gdGhpcy5wYXJlbnRFbGVtZW50O1xuICAgIGNvbnN0IGZyb21JbmRleCA9IG1hdHJpeC52aXNpYmxlUm93cy5pbmRleE9mKHRoaXMuZHJhZ2dlZEVsZW1lbnQpO1xuICAgIGNvbnN0IHRvSW5kZXggPSBtYXRyaXgudmlzaWJsZVJvd3MuaW5kZXhPZih0aGlzLmRyb3BUYXJnZXQpO1xuICAgIG1hdHJpeC5tb3ZlUm93QnlJbmRleChmcm9tSW5kZXgsIHRvSW5kZXgpO1xuXG4gICAgcmV0dXJuIG1hdHJpeDtcbiAgfTtcbn1cbiIsImltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuLi9pdGVtdmFsdWVcIjtcbmltcG9ydCB7IERyYWdEcm9wQ2hvaWNlcyB9IGZyb20gXCIuL2Nob2ljZXNcIjtcbmV4cG9ydCBjbGFzcyBEcmFnRHJvcFJhbmtpbmdDaG9pY2VzIGV4dGVuZHMgRHJhZ0Ryb3BDaG9pY2VzIHtcbiAgcHJvdGVjdGVkIGdldCBkcmFnZ2VkRWxlbWVudFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJyYW5raW5nLWl0ZW1cIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVEcmFnZ2VkRWxlbWVudFNob3J0Y3V0KFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICBkcmFnZ2VkRWxlbWVudE5vZGU6IEhUTUxFbGVtZW50XG4gICk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBkcmFnZ2VkRWxlbWVudFNob3J0Y3V0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAvLyBkcmFnZ2VkRWxlbWVudFNob3J0Y3V0LmlubmVyVGV4dCA9IHRleHQ7XG4gICAgZHJhZ2dlZEVsZW1lbnRTaG9ydGN1dC5zdHlsZS5jc3NUZXh0ID0gYCBcbiAgICAgICAgICBjdXJzb3I6IGdyYWJiaW5nO1xuICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICB6LWluZGV4OiAxMDAwO1xuICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDM2cHg7XG4gICAgICAgICAgbWluLXdpZHRoOiAxMDBweDtcbiAgICAgICAgICBib3gtc2hhZG93OiAwcHggOHB4IDE2cHggcmdiYSgwLCAwLCAwLCAwLjEpO1xuICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICAgICAgICAgIHBhZGRpbmctcmlnaHQ6IDE2cHg7XG4gICAgICAgICAgcGFkZGluZy1sZWZ0OiAyMHB4O1xuICAgICAgICAgIGZvbnQtZmFtaWx5OiBcIk9wZW4gU2Fuc1wiO1xuICAgICAgICBgO1xuXG4gICAgY29uc3QgaXNEZWVwQ2xvbmUgPSB0cnVlO1xuICAgIGNvbnN0IGNsb25lID0gPEhUTUxFbGVtZW50PmRyYWdnZWRFbGVtZW50Tm9kZS5jbG9uZU5vZGUoaXNEZWVwQ2xvbmUpO1xuICAgIGRyYWdnZWRFbGVtZW50U2hvcnRjdXQuYXBwZW5kQ2hpbGQoY2xvbmUpO1xuXG4gICAgcmV0dXJuIGRyYWdnZWRFbGVtZW50U2hvcnRjdXQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0RHJvcFRhcmdldEJ5RGF0YUF0dHJpYnV0ZVZhbHVlKFxuICAgIGRhdGFBdHRyaWJ1dGVWYWx1ZTogc3RyaW5nXG4gICk6IEl0ZW1WYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50RWxlbWVudC5yYW5raW5nQ2hvaWNlc1tkYXRhQXR0cmlidXRlVmFsdWVdO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzRHJvcFRhcmdldFZhbGlkKFxuICAgIGRyb3BUYXJnZXQ6IEl0ZW1WYWx1ZSxcbiAgICBpc0JvdHRvbTogYm9vbGVhbixcbiAgICBkcm9wVGFyZ2V0Tm9kZT86IEhUTUxFbGVtZW50XG4gICk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNob2ljZXMgPSB0aGlzLnBhcmVudEVsZW1lbnQucmFua2luZ0Nob2ljZXM7XG5cbiAgICBpZiAoY2hvaWNlcy5pbmRleE9mKGRyb3BUYXJnZXQpID09PSAtMSlcbiAgICAgIC8vIHNob3VsZG4ndCBhbGxvdyB0byBkcm9wIG9uIFwiYWRvcm5lcnNcIiAoc2VsZWN0YWxsLCBub25lLCBvdGhlcilcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNhbGN1bGF0ZUlzQm90dG9tKGNsaWVudFk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNob2ljZXMgPSB0aGlzLnBhcmVudEVsZW1lbnQucmFua2luZ0Nob2ljZXM7XG4gICAgcmV0dXJuIChcbiAgICAgIGNob2ljZXMuaW5kZXhPZih0aGlzLmRyb3BUYXJnZXQpIC0gY2hvaWNlcy5pbmRleE9mKHRoaXMuZHJhZ2dlZEVsZW1lbnQpID5cbiAgICAgIDBcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFmdGVyRHJhZ092ZXIoZHJvcFRhcmdldE5vZGU6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3QgY2hvaWNlcyA9IHRoaXMucGFyZW50RWxlbWVudC5yYW5raW5nQ2hvaWNlcztcbiAgICBjb25zdCBkcm9wVGFyZ2V0SW5kZXggPSBjaG9pY2VzLmluZGV4T2YodGhpcy5kcm9wVGFyZ2V0KTtcbiAgICBjb25zdCBkcmFnZ2VkRWxlbWVudEluZGV4ID0gY2hvaWNlcy5pbmRleE9mKHRoaXMuZHJhZ2dlZEVsZW1lbnQpO1xuXG4gICAgY2hvaWNlcy5zcGxpY2UoZHJhZ2dlZEVsZW1lbnRJbmRleCwgMSk7XG4gICAgY2hvaWNlcy5zcGxpY2UoZHJvcFRhcmdldEluZGV4LCAwLCB0aGlzLmRyYWdnZWRFbGVtZW50KTtcbiAgICB0aGlzLnBhcmVudEVsZW1lbnQuc2V0UHJvcGVydHlWYWx1ZShcInJhbmtpbmdDaG9pY2VzXCIsIGNob2ljZXMpO1xuICAgIHRoaXMudXBkYXRlRHJhZ2dlZEVsZW1lbnRTaG9ydGN1dChkcm9wVGFyZ2V0SW5kZXggKyAxKTtcblxuICAgIGlmIChkcmFnZ2VkRWxlbWVudEluZGV4ICE9PSBkcm9wVGFyZ2V0SW5kZXgpIHtcbiAgICAgIGRyb3BUYXJnZXROb2RlLmNsYXNzTGlzdC5yZW1vdmUoXCJzdi1kcmFnZHJvcC1tb3ZldXBcIik7XG4gICAgICBkcm9wVGFyZ2V0Tm9kZS5jbGFzc0xpc3QucmVtb3ZlKFwic3YtZHJhZ2Ryb3AtbW92ZWRvd25cIik7XG4gICAgICB0aGlzLnBhcmVudEVsZW1lbnQuZHJvcFRhcmdldE5vZGVNb3ZlID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoZHJhZ2dlZEVsZW1lbnRJbmRleCA+IGRyb3BUYXJnZXRJbmRleCkge1xuICAgICAgdGhpcy5wYXJlbnRFbGVtZW50LmRyb3BUYXJnZXROb2RlTW92ZSA9IFwiZG93blwiO1xuICAgIH1cblxuICAgIGlmIChkcmFnZ2VkRWxlbWVudEluZGV4IDwgZHJvcFRhcmdldEluZGV4KSB7XG4gICAgICB0aGlzLnBhcmVudEVsZW1lbnQuZHJvcFRhcmdldE5vZGVNb3ZlID0gXCJ1cFwiO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRHJhZ2dlZEVsZW1lbnRTaG9ydGN1dChuZXdJbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgbmV3SW5kZXhUZXh0ID0gbmV3SW5kZXggKyBcIlwiO1xuICAgIC8vIFRPRE8gc2hvdWxkIGF2b2lkIGRpcmVjdCBET00gbWFuaXB1bGF0aW9uLCBkbyB0aHJvdWdoIHRoZSBmcmFtZXdvcmtzIGluc3RlYWRcbiAgICBjb25zdCBpbmRleE5vZGU6IEhUTUxFbGVtZW50ID0gdGhpcy5kcmFnZ2VkRWxlbWVudFNob3J0Y3V0LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICBcIi5zdi1yYW5raW5nLWl0ZW1fX2luZGV4XCJcbiAgICApO1xuICAgIGluZGV4Tm9kZS5pbm5lclRleHQgPSBuZXdJbmRleFRleHQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2hvc3RQb3NpdGlvbkNoYW5nZWQoKTogdm9pZCB7XG4gICAgdGhpcy5wYXJlbnRFbGVtZW50LmN1cnJlbnREcm9wVGFyZ2V0ID0gdGhpcy5kcmFnZ2VkRWxlbWVudDtcbiAgICBzdXBlci5naG9zdFBvc2l0aW9uQ2hhbmdlZCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRvRHJvcCA9ICgpOiBhbnkgPT4ge1xuICAgIHRoaXMucGFyZW50RWxlbWVudC5zZXRWYWx1ZSgpO1xuICAgIHJldHVybiB0aGlzLnBhcmVudEVsZW1lbnQ7XG4gIH07XG5cbiAgcHJvdGVjdGVkIGhhbmRsZUVzY2FwZUJ1dHRvbiA9IChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQgPT4ge1xuICAgIGlmIChldmVudC5rZXlDb2RlID09IDI3KSB7XG4gICAgICB0aGlzLnBhcmVudEVsZW1lbnQudXBkYXRlUmFua2luZ0Nob2ljZXMoKTtcbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICB9XG4gIH07XG5cbiAgcHJvdGVjdGVkIGRvQ2xlYXIgPSAoKTogdm9pZCA9PiB7XG4gICAgdGhpcy5wYXJlbnRFbGVtZW50LmRyb3BUYXJnZXROb2RlTW92ZSA9IG51bGw7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBTdXJ2ZXlFbGVtZW50IH0gZnJvbSBcIi4uL3N1cnZleS1lbGVtZW50XCI7XG5pbXBvcnQgeyBJRWxlbWVudCB9IGZyb20gXCIuLi9iYXNlLWludGVyZmFjZXNcIjtcbmltcG9ydCB7IEpzb25PYmplY3QsIFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUGFnZU1vZGVsIH0gZnJvbSBcIi4uL3BhZ2VcIjtcbmltcG9ydCB7IERyYWdEcm9wQ29yZSB9IGZyb20gXCIuL2NvcmVcIjtcblxuZXhwb3J0IGNsYXNzIERyYWdEcm9wU3VydmV5RWxlbWVudHMgZXh0ZW5kcyBEcmFnRHJvcENvcmU8YW55PiB7XG4gIHB1YmxpYyBzdGF0aWMgbmV3R2hvc3RQYWdlOiBQYWdlTW9kZWwgPSBudWxsO1xuICBwdWJsaWMgc3RhdGljIHJlc3RyaWN0RHJhZ1F1ZXN0aW9uQmV0d2VlblBhZ2VzOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBzdGF0aWMgZWRnZUhlaWdodDogbnVtYmVyID0gMzA7XG4gIHB1YmxpYyBzdGF0aWMgbmVzdGVkUGFuZWxEZXB0aDogbnVtYmVyID0gLTE7XG4gIHB1YmxpYyBzdGF0aWMgZ2hvc3RTdXJ2ZXlFbGVtZW50TmFtZSA9XG4gICAgXCJzdi1kcmFnLWRyb3AtZ2hvc3Qtc3VydmV5LWVsZW1lbnQtbmFtZVwiOyAvLyBiZWZvcmUgcmVuYW1pbmcgdXNlIGdsb2JhIHNlYXJjaCAod2UgaGF2ZSBhbHNvIGNzcyBzZWxlY3RvcnMpXG5cbiAgcHJvdGVjdGVkIGlzRWRnZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgcHJldklzRWRnZTogYW55ID0gbnVsbDtcbiAgcHJvdGVjdGVkIGdob3N0U3VydmV5RWxlbWVudDogSUVsZW1lbnQgPSBudWxsO1xuXG4gIHByb3RlY3RlZCBnZXQgZHJhZ2dlZEVsZW1lbnRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwic3VydmV5LWVsZW1lbnRcIjtcbiAgfVxuXG4gIHB1YmxpYyBzdGFydERyYWdUb29sYm94SXRlbShcbiAgICBldmVudDogUG9pbnRlckV2ZW50LFxuICAgIGRyYWdnZWRFbGVtZW50SnNvbjogSnNvbk9iamVjdFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBkcmFnZ2VkRWxlbWVudCA9IHRoaXMuY3JlYXRlRWxlbWVudEZyb21Kc29uKGRyYWdnZWRFbGVtZW50SnNvbik7XG4gICAgdGhpcy5zdGFydERyYWcoZXZlbnQsIGRyYWdnZWRFbGVtZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVFbGVtZW50RnJvbUpzb24oanNvbjogb2JqZWN0KTogSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0IGVsZW1lbnQ6IGFueSA9IHRoaXMuY3JlYXRlTmV3RWxlbWVudChqc29uKTtcbiAgICBpZiAoZWxlbWVudFtcInNldFN1cnZleUltcGxcIl0pIHtcbiAgICAgIGVsZW1lbnRbXCJzZXRTdXJ2ZXlJbXBsXCJdKHRoaXMuc3VydmV5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudFtcInNldERhdGFcIl0odGhpcy5zdXJ2ZXkpO1xuICAgIH1cbiAgICBlbGVtZW50LnJlbmRlcldpZHRoID0gXCIxMDAlXCI7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU5ld0VsZW1lbnQoanNvbjogYW55KTogSUVsZW1lbnQge1xuICAgIHZhciBuZXdFbGVtZW50ID0gU2VyaWFsaXplci5jcmVhdGVDbGFzcyhqc29uW1widHlwZVwiXSk7XG4gICAgbmV3IEpzb25PYmplY3QoKS50b09iamVjdChqc29uLCBuZXdFbGVtZW50KTtcbiAgICByZXR1cm4gbmV3RWxlbWVudDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRTaG9ydGN1dFRleHQoZHJhZ2dlZEVsZW1lbnQ6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRyYWdnZWRFbGVtZW50W1widGl0bGVcIl0gfHwgZHJhZ2dlZEVsZW1lbnRbXCJuYW1lXCJdO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldERyb3BUYXJnZXRCeURhdGFBdHRyaWJ1dGVWYWx1ZShcbiAgICBkYXRhQXR0cmlidXRlVmFsdWU6IHN0cmluZyxcbiAgICBkcm9wVGFyZ2V0Tm9kZTogSFRNTEVsZW1lbnQsXG4gICAgZXZlbnQ6IFBvaW50ZXJFdmVudFxuICApOiBhbnkge1xuICAgIHRoaXMuaXNFZGdlID0gdGhpcy5jYWxjdWxhdGVJc0VkZ2UoZHJvcFRhcmdldE5vZGUsIGV2ZW50LmNsaWVudFkpO1xuXG4gICAgaWYgKCFkYXRhQXR0cmlidXRlVmFsdWUpIHtcbiAgICAgIC8vIHBhbmVsIGR5bmFtaWNcbiAgICAgIGNvbnN0IG5lYXJlc3REcm9wVGFyZ2V0RWxlbWVudCA9IGRyb3BUYXJnZXROb2RlLnBhcmVudEVsZW1lbnQuY2xvc2VzdDxcbiAgICAgICAgSFRNTEVsZW1lbnRcbiAgICAgID4odGhpcy5kcm9wVGFyZ2V0RGF0YUF0dHJpYnV0ZU5hbWUpO1xuICAgICAgZGF0YUF0dHJpYnV0ZVZhbHVlID0gdGhpcy5nZXREYXRhQXR0cmlidXRlVmFsdWVCeU5vZGUobmVhcmVzdERyb3BUYXJnZXRFbGVtZW50KTtcbiAgICB9XG5cbiAgICBpZiAoIWRhdGFBdHRyaWJ1dGVWYWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgZmluZCBkcm9wIHRhcmdldCBzdXJ2ZXkgZWxlbWVudCBuYW1lXCIpO1xuICAgIH1cblxuICAgIGlmIChkYXRhQXR0cmlidXRlVmFsdWUgPT09IERyYWdEcm9wU3VydmV5RWxlbWVudHMuZ2hvc3RTdXJ2ZXlFbGVtZW50TmFtZSkge1xuICAgICAgcmV0dXJuIHRoaXMucHJldkRyb3BUYXJnZXQ7XG4gICAgfVxuXG4gICAgLy8gZHJvcCB0byBuZXcgcGFnZVxuICAgIGlmIChkYXRhQXR0cmlidXRlVmFsdWUgPT09IFwibmV3R2hvc3RQYWdlXCIpIHtcbiAgICAgIHJldHVybiBEcmFnRHJvcFN1cnZleUVsZW1lbnRzLm5ld0dob3N0UGFnZTtcbiAgICB9XG5cbiAgICAvLyBkcm9wIHRvIHBhZ2VcbiAgICBsZXQgcGFnZTogYW55ID0gdGhpcy5zdXJ2ZXkuZ2V0UGFnZUJ5TmFtZShkYXRhQXR0cmlidXRlVmFsdWUpO1xuICAgIGlmIChwYWdlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIC8vIFRPRE8gd2UgY2FuJ3QgZHJvcCBvbiBub3QgZW1wdHkgcGFnZSBkaXJlY3RseSBmb3Igbm93XG4gICAgICAgIHBhZ2UuZWxlbWVudHMubGVuZ3RoICE9PSAwXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBwYWdlLmVsZW1lbnRzO1xuICAgICAgICBwYWdlID0gdGhpcy5pc0JvdHRvbSA/IGVsZW1lbnRzW2VsZW1lbnRzLmxlbmd0aCAtIDFdIDogZWxlbWVudHNbMF07XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFnZTtcbiAgICB9XG5cbiAgICAvLyBkcm9wIHRvIHF1ZXN0aW9uIG9yIHBhbmVsXG4gICAgbGV0IGRyb3BUYXJnZXQ6IGFueTtcbiAgICBsZXQgcXVlc3Rpb247XG5cbiAgICB0aGlzLnN1cnZleS5wYWdlcy5mb3JFYWNoKChwYWdlOiBQYWdlTW9kZWwpID0+IHtcbiAgICAgIHF1ZXN0aW9uID0gcGFnZS5nZXRFbGVtZW50QnlOYW1lKGRhdGFBdHRyaWJ1dGVWYWx1ZSk7XG4gICAgICBpZiAocXVlc3Rpb24pIGRyb3BUYXJnZXQgPSBxdWVzdGlvbjtcbiAgICB9KTtcblxuICAgIC8vIGRyb3AgdG8gcGFuZWxkeW5hbWljXG4gICAgaWYgKGRyb3BUYXJnZXQuZ2V0VHlwZSgpID09PSBcInBhbmVsZHluYW1pY1wiICYmICF0aGlzLmlzRWRnZSkge1xuICAgICAgZHJvcFRhcmdldCA9ICg8YW55PmRyb3BUYXJnZXQpLnRlbXBsYXRlO1xuICAgIH1cbiAgICAvLyBkcm9wIHRvIHBhbmVsXG4gICAgZWxzZSBpZiAoZHJvcFRhcmdldC5pc1BhbmVsKSB7XG4gICAgICBjb25zdCBwYW5lbERyYWdJbmZvID0gdGhpcy5nZXRQYW5lbERyYWdJbmZvKFxuICAgICAgICBkcm9wVGFyZ2V0Tm9kZSxcbiAgICAgICAgZHJvcFRhcmdldCxcbiAgICAgICAgZXZlbnRcbiAgICAgICk7XG4gICAgICBkcm9wVGFyZ2V0ID0gcGFuZWxEcmFnSW5mby5kcm9wVGFyZ2V0O1xuICAgICAgdGhpcy5pc0VkZ2UgPSBwYW5lbERyYWdJbmZvLmlzRWRnZTtcbiAgICB9XG4gICAgLy8gZHJvcCB0byBxdWVzdGlvblxuXG4gICAgLy9xdWVzdGlvbiBpbnNpZGUgcGFuZWxkeW1hbmljXG4gICAgaWYgKCFkcm9wVGFyZ2V0LnBhZ2UpIHtcbiAgICAgIGNvbnN0IG5lYXJlc3REcm9wVGFyZ2V0RWxlbWVudCA9IGRyb3BUYXJnZXROb2RlLnBhcmVudEVsZW1lbnQuY2xvc2VzdDxcbiAgICAgICAgSFRNTEVsZW1lbnRcbiAgICAgID4oXCJbZGF0YS1zdi1kcm9wLXRhcmdldC1wYWdlXVwiKTtcbiAgICAgIGRhdGFBdHRyaWJ1dGVWYWx1ZSA9IG5lYXJlc3REcm9wVGFyZ2V0RWxlbWVudC5kYXRhc2V0LnN2RHJvcFRhcmdldFBhZ2U7XG4gICAgICBsZXQgcGFnZTogYW55ID0gdGhpcy5zdXJ2ZXkuZ2V0UGFnZUJ5TmFtZShkYXRhQXR0cmlidXRlVmFsdWUpO1xuICAgICAgZHJvcFRhcmdldC5fX3BhZ2UgPSBwYWdlO1xuICAgIH1cblxuICAgIHJldHVybiBkcm9wVGFyZ2V0O1xuICAgIC8vIEVPIGRyb3AgdG8gcXVlc3Rpb24gb3IgcGFuZWxcbiAgfVxuXG4gIHByb3RlY3RlZCBpc0Ryb3BUYXJnZXRWYWxpZChkcm9wVGFyZ2V0OiBTdXJ2ZXlFbGVtZW50LCBpc0JvdHRvbTogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIGlmICghZHJvcFRhcmdldCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLmRyb3BUYXJnZXQgPT09IHRoaXMuZHJhZ2dlZEVsZW1lbnQpIHJldHVybiBmYWxzZTtcblxuICAgIGlmIChcbiAgICAgIERyYWdEcm9wU3VydmV5RWxlbWVudHMucmVzdHJpY3REcmFnUXVlc3Rpb25CZXR3ZWVuUGFnZXMgJiZcbiAgICAgIHRoaXMuc2hvdWxkUmVzdHJpY0RyYWdRdWVzdGlvbkJldHdlZW5QYWdlcyhkcm9wVGFyZ2V0KVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzRHJvcFRhcmdldERvZXNudENoYW5nZWQobmV3SXNCb3R0b206IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5kcm9wVGFyZ2V0ID09PSB0aGlzLmdob3N0U3VydmV5RWxlbWVudCkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuZHJvcFRhcmdldCA9PT0gdGhpcy5wcmV2RHJvcFRhcmdldCAmJiBuZXdJc0JvdHRvbSA9PT0gdGhpcy5pc0JvdHRvbVxuICAgICAgLyomJnRoaXMuaXNFZGdlID09PSB0aGlzLnByZXZJc0VkZ2UqL1xuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNob3VsZFJlc3RyaWNEcmFnUXVlc3Rpb25CZXR3ZWVuUGFnZXMoZHJvcFRhcmdldDogYW55KTogYm9vbGVhbiB7XG4gICAgY29uc3Qgb2xkUGFnZSA9ICg8YW55PnRoaXMuZHJhZ2dlZEVsZW1lbnQpW1wicGFnZVwiXTtcbiAgICBjb25zdCBuZXdQYWdlID0gZHJvcFRhcmdldC5pc1BhZ2UgPyBkcm9wVGFyZ2V0IDogZHJvcFRhcmdldFtcInBhZ2VcIl07XG5cbiAgICAvLyBpZiBvbGRQYWdlID09PSBudWxsIHRoZW4gaXQgaXMgZHJvbSB0aGUgdG9vbGJveFxuICAgIHJldHVybiBvbGRQYWdlICYmIG9sZFBhZ2UgIT09IG5ld1BhZ2U7XG4gIH1cblxuICBwcml2YXRlIGdldFBhbmVsRHJhZ0luZm8oXG4gICAgSFRNTEVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIGRyb3BUYXJnZXQ6IGFueSxcbiAgICBldmVudDogUG9pbnRlckV2ZW50XG4gICkge1xuICAgIGxldCBpc0VkZ2UgPSB0aGlzLmlzRWRnZTtcblxuICAgIGlmICghaXNFZGdlICYmIGRyb3BUYXJnZXQucXVlc3Rpb25zLmxlbmd0aCAhPT0gMCkge1xuICAgICAgSFRNTEVsZW1lbnQgPSB0aGlzLmZpbmREZWVwZXN0RHJvcFRhcmdldENoaWxkKEhUTUxFbGVtZW50KTtcbiAgICAgIGRyb3BUYXJnZXQgPSB0aGlzLmdldERyb3BUYXJnZXRCeU5vZGUoSFRNTEVsZW1lbnQsIGV2ZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBkcm9wVGFyZ2V0LCBpc0VkZ2UgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBmaW5kRGVlcGVzdERyb3BUYXJnZXRDaGlsZChwYXJlbnQ6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0IHNlbGVjdG9yID0gdGhpcy5kcm9wVGFyZ2V0RGF0YUF0dHJpYnV0ZU5hbWU7XG5cbiAgICBsZXQgcmVzdWx0ID0gcGFyZW50O1xuICAgIHdoaWxlICghIXBhcmVudCkge1xuICAgICAgcmVzdWx0ID0gcGFyZW50O1xuICAgICAgcGFyZW50ID0gcGFyZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgIH1cblxuICAgIHJldHVybiA8SFRNTEVsZW1lbnQ+cmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVJc0VkZ2UoSFRNTEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjbGllbnRZOiBudW1iZXIpIHtcbiAgICBjb25zdCBtaWRkbGUgPSB0aGlzLmNhbGN1bGF0ZU1pZGRsZU9mSFRNTEVsZW1lbnQoSFRNTEVsZW1lbnQpO1xuICAgIHJldHVybiBNYXRoLmFicyhjbGllbnRZIC0gbWlkZGxlKSA+PSBEcmFnRHJvcFN1cnZleUVsZW1lbnRzLmVkZ2VIZWlnaHQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWZ0ZXJEcmFnT3ZlcigpOiB2b2lkIHtcbiAgICB0aGlzLnByZXZJc0VkZ2UgPSB0aGlzLmlzRWRnZTtcbiAgICB0aGlzLmluc2VydEdob3N0RWxlbWVudEludG9TdXJ2ZXkoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkb1N0YXJ0RHJhZygpOiB2b2lkIHtcbiAgICB0aGlzLmdob3N0U3VydmV5RWxlbWVudCA9IHRoaXMuY3JlYXRlR2hvc3RTdXJ2ZXlFbGVtZW50KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZG9CYW5Ecm9wSGVyZSA9ICgpOiB2b2lkID0+IHtcbiAgICB0aGlzLnJlbW92ZUdob3N0RWxlbWVudEZyb21TdXJ2ZXkoKTtcbiAgICB0aGlzLmlzRWRnZSA9IG51bGw7XG4gIH07XG5cbiAgcHJvdGVjdGVkIGRvRHJvcCA9ICgpOiBhbnkgPT4ge1xuICAgIGlmICh0aGlzLmRyb3BUYXJnZXQpIHtcbiAgICAgIHJldHVybiB0aGlzLmluc2VydFJlYWxFbGVtZW50SW50b1N1cnZleSgpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIHByb3RlY3RlZCBkb0NsZWFyID0gKCk6IHZvaWQgPT4ge1xuICAgIHRoaXMucmVtb3ZlR2hvc3RFbGVtZW50RnJvbVN1cnZleSgpO1xuICAgIHRoaXMuaXNFZGdlID0gbnVsbDtcbiAgICB0aGlzLmdob3N0U3VydmV5RWxlbWVudCA9IG51bGw7XG4gIH07XG5cbiAgcHJvdGVjdGVkIGluc2VydEdob3N0RWxlbWVudEludG9TdXJ2ZXkoKTogYm9vbGVhbiB7XG4gICAgdGhpcy5yZW1vdmVHaG9zdEVsZW1lbnRGcm9tU3VydmV5KCk7XG5cbiAgICB0aGlzLmdob3N0U3VydmV5RWxlbWVudC5uYW1lID1cbiAgICAgIERyYWdEcm9wU3VydmV5RWxlbWVudHMuZ2hvc3RTdXJ2ZXlFbGVtZW50TmFtZTsgLy8gVE9ETyB3aHkgZG8gd2UgbmVlZCBzZXR1cCBpdCBtYW51YWxseSBzZWUgY3JlYXRlR2hvc3RTdXJ2ZXlFbGVtZW50IG1ldGhvZFxuXG4gICAgdGhpcy5wYXJlbnRFbGVtZW50ID0gdGhpcy5kcm9wVGFyZ2V0LmlzUGFnZVxuICAgICAgPyB0aGlzLmRyb3BUYXJnZXRcbiAgICAgIDogKCg8YW55PnRoaXMuZHJvcFRhcmdldCkucGFnZSB8fCAoPGFueT50aGlzLmRyb3BUYXJnZXQpLl9fcGFnZSk7XG5cbiAgICBpZiAodGhpcy5pc0RyYWdPdmVySW5zaWRlRW1wdHlQYW5lbCgpKSB7XG4gICAgICB0aGlzLmRyb3BUYXJnZXQuaXNEcmFnT3Zlck1lID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnBhcmVudEVsZW1lbnQuZHJhZ0Ryb3BTdGFydChcbiAgICAgIHRoaXMuZHJhZ2dlZEVsZW1lbnQsXG4gICAgICB0aGlzLmdob3N0U3VydmV5RWxlbWVudCxcbiAgICAgIERyYWdEcm9wU3VydmV5RWxlbWVudHMubmVzdGVkUGFuZWxEZXB0aFxuICAgICk7XG5cbiAgICByZXR1cm4gdGhpcy5wYXJlbnRFbGVtZW50LmRyYWdEcm9wTW92ZVRvKFxuICAgICAgdGhpcy5kcm9wVGFyZ2V0LFxuICAgICAgdGhpcy5pc0JvdHRvbSxcbiAgICAgIHRoaXMuaXNFZGdlXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNEcmFnT3Zlckluc2lkZUVtcHR5UGFuZWwoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaXNFbXB0eVBhbmVsID0gdGhpcy5kcm9wVGFyZ2V0LmlzUGFuZWwgJiYgdGhpcy5kcm9wVGFyZ2V0LnF1ZXN0aW9ucy5sZW5ndGggPT09IDA7XG4gICAgY29uc3QgaXNEcmFnT3Zlckluc2lkZSA9ICF0aGlzLmlzRWRnZTtcbiAgICByZXR1cm4gaXNFbXB0eVBhbmVsICYmIGlzRHJhZ092ZXJJbnNpZGU7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVtb3ZlR2hvc3RFbGVtZW50RnJvbVN1cnZleSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wcmV2RHJvcFRhcmdldCkgdGhpcy5wcmV2RHJvcFRhcmdldC5pc0RyYWdPdmVyTWUgPSBmYWxzZTtcbiAgICBpZiAoISF0aGlzLnBhcmVudEVsZW1lbnQpIHRoaXMucGFyZW50RWxlbWVudC5kcmFnRHJvcEZpbmlzaCh0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5zZXJ0UmVhbEVsZW1lbnRJbnRvU3VydmV5KCkge1xuICAgIHRoaXMucmVtb3ZlR2hvc3RFbGVtZW50RnJvbVN1cnZleSgpO1xuXG4gICAgLy8gZ2hvc3QgbmV3IHBhZ2VcbiAgICBpZiAodGhpcy5kcm9wVGFyZ2V0LmlzUGFnZSAmJiAoPGFueT50aGlzLmRyb3BUYXJnZXQpW1wiX2lzR2hvc3RcIl0pIHtcbiAgICAgICg8YW55PnRoaXMuZHJvcFRhcmdldClbXCJfYWRkR2hvc3RQYWdlVmlld01vZGVsXCJdKCk7XG4gICAgfVxuICAgIC8vIEVPIGdob3N0IG5ldyBwYWdlXG5cbiAgICAvLyBmYWtlIHRhcmdldCBlbGVtZW50IChuZWVkIG9ubHkgZm9yIFwic3RhcnRXaXRoTmV3TGluZTpmYWxzZVwiIGZlYXR1cmUpXG4gICAgLy9UT0RPIG5lZWQgZm9yIGRyYWdEcm9wIGhlbHBlciBpbiBsaWJyYXJ5XG4gICAgY29uc3QganNvbiA9IG5ldyBKc29uT2JqZWN0KCkudG9Kc29uT2JqZWN0KHRoaXMuZHJhZ2dlZEVsZW1lbnQpO1xuICAgIGpzb25bXCJ0eXBlXCJdID0gdGhpcy5kcmFnZ2VkRWxlbWVudC5nZXRUeXBlKCk7XG4gICAgY29uc3QgZmFrZVRhcmdldEVsZW1lbnQgPSB0aGlzLmNyZWF0ZUZha2VUYXJnZXRFbGVtZW50KFxuICAgICAgdGhpcy5kcmFnZ2VkRWxlbWVudC5uYW1lLFxuICAgICAganNvblxuICAgICk7XG4gICAgLy8gRU8gZmFrZSB0YXJnZXQgZWxlbWVudFxuXG4gICAgdGhpcy5wYXJlbnRFbGVtZW50LmRyYWdEcm9wU3RhcnQoXG4gICAgICB0aGlzLmRyYWdnZWRFbGVtZW50LFxuICAgICAgZmFrZVRhcmdldEVsZW1lbnQsXG4gICAgICBEcmFnRHJvcFN1cnZleUVsZW1lbnRzLm5lc3RlZFBhbmVsRGVwdGhcbiAgICApO1xuXG4gICAgdGhpcy5wYXJlbnRFbGVtZW50LmRyYWdEcm9wTW92ZVRvKFxuICAgICAgdGhpcy5kcm9wVGFyZ2V0LFxuICAgICAgdGhpcy5pc0JvdHRvbSxcbiAgICAgIHRoaXMuaXNFZGdlXG4gICAgKTtcblxuICAgIGNvbnN0IG5ld0VsZW1lbnQgPSB0aGlzLnBhcmVudEVsZW1lbnQuZHJhZ0Ryb3BGaW5pc2goKTtcbiAgICByZXR1cm4gbmV3RWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRmFrZVRhcmdldEVsZW1lbnQoZWxlbWVudE5hbWU6IHN0cmluZywganNvbjogYW55KTogYW55IHtcbiAgICBpZiAoIWVsZW1lbnROYW1lIHx8ICFqc29uKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgdGFyZ2V0RWxlbWVudCA9IG51bGw7XG4gICAgdGFyZ2V0RWxlbWVudCA9IFNlcmlhbGl6ZXIuY3JlYXRlQ2xhc3MoanNvbltcInR5cGVcIl0pO1xuICAgIG5ldyBKc29uT2JqZWN0KCkudG9PYmplY3QoanNvbiwgdGFyZ2V0RWxlbWVudCk7XG4gICAgdGFyZ2V0RWxlbWVudC5uYW1lID0gZWxlbWVudE5hbWU7XG4gICAgaWYgKHRhcmdldEVsZW1lbnRbXCJzZXRTdXJ2ZXlJbXBsXCJdKSB7XG4gICAgICB0YXJnZXRFbGVtZW50W1wic2V0U3VydmV5SW1wbFwiXSh0aGlzLnN1cnZleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldEVsZW1lbnRbXCJzZXREYXRhXCJdKHRoaXMuc3VydmV5KTtcbiAgICB9XG4gICAgdGFyZ2V0RWxlbWVudC5yZW5kZXJXaWR0aCA9IFwiMTAwJVwiO1xuICAgIHJldHVybiB0YXJnZXRFbGVtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVHaG9zdFN1cnZleUVsZW1lbnQoKTogYW55IHtcbiAgICBjb25zdCBzdGFydFdpdGhOZXdMaW5lID0gdGhpcy5kcmFnZ2VkRWxlbWVudC5zdGFydFdpdGhOZXdMaW5lO1xuICAgIGxldCBjbGFzc05hbWUgPSBcInN2LWRyYWctZHJvcC1naG9zdFwiO1xuICAgIGxldCBtaW5XaWR0aCA9IFwiMzAwcHhcIjtcblxuICAgIGlmICghc3RhcnRXaXRoTmV3TGluZSkge1xuICAgICAgbWluV2lkdGggPSBcIjRweFwiO1xuICAgICAgY2xhc3NOYW1lICs9IFwiIHN2LWRyYWctZHJvcC1naG9zdC0tdmVydGljYWxcIjtcbiAgICB9XG5cbiAgICBjb25zdCBqc29uID0ge1xuICAgICAgdHlwZTogXCJodG1sXCIsXG4gICAgICBtaW5XaWR0aCxcbiAgICAgIG5hbWU6IERyYWdEcm9wU3VydmV5RWxlbWVudHMuZ2hvc3RTdXJ2ZXlFbGVtZW50TmFtZSxcbiAgICAgIGh0bWw6IGA8ZGl2IGNsYXNzPVwiJHtjbGFzc05hbWV9XCI+PC9kaXY+YCxcbiAgICB9O1xuXG4gICAgY29uc3QgZWxlbWVudCA9IDxhbnk+dGhpcy5jcmVhdGVFbGVtZW50RnJvbUpzb24oanNvbik7XG4gICAgZWxlbWVudC5zdGFydFdpdGhOZXdMaW5lID0gc3RhcnRXaXRoTmV3TGluZTtcblxuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG59XG4iLCJpbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzXCI7XG4vKipcbiAqIFRoZSBjbGFzcyBjb250YWlucyBtZXRob2RzIHRvIHdvcmsgd2l0aCBhcGkuc3VydmV5anMuaW8gc2VydmljZS5cbiAqL1xuZXhwb3J0IGNsYXNzIGR4U3VydmV5U2VydmljZSB7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IHNlcnZpY2VVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc2V0dGluZ3Muc3VydmV5U2VydmljZVVybDtcbiAgfVxuICBwdWJsaWMgc3RhdGljIHNldCBzZXJ2aWNlVXJsKHZhbDogc3RyaW5nKSB7XG4gICAgc2V0dGluZ3Muc3VydmV5U2VydmljZVVybCA9IHZhbDtcbiAgfVxuICBjb25zdHJ1Y3RvcigpIHt9XG4gIHB1YmxpYyBsb2FkU3VydmV5KFxuICAgIHN1cnZleUlkOiBzdHJpbmcsXG4gICAgb25Mb2FkOiAoc3VjY2VzczogYm9vbGVhbiwgcmVzdWx0OiBzdHJpbmcsIHJlc3BvbnNlOiBhbnkpID0+IHZvaWRcbiAgKSB7XG4gICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHhoci5vcGVuKFxuICAgICAgXCJHRVRcIixcbiAgICAgIGR4U3VydmV5U2VydmljZS5zZXJ2aWNlVXJsICsgXCIvZ2V0U3VydmV5P3N1cnZleUlkPVwiICsgc3VydmV5SWRcbiAgICApO1xuICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIpO1xuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gSlNPTi5wYXJzZSh4aHIucmVzcG9uc2UpO1xuICAgICAgb25Mb2FkKHhoci5zdGF0dXMgPT0gMjAwLCByZXN1bHQsIHhoci5yZXNwb25zZSk7XG4gICAgfTtcbiAgICB4aHIuc2VuZCgpO1xuICB9XG4gIHB1YmxpYyBnZXRTdXJ2ZXlKc29uQW5kSXNDb21wbGV0ZWQoXG4gICAgc3VydmV5SWQ6IHN0cmluZyxcbiAgICBjbGllbnRJZDogc3RyaW5nLFxuICAgIG9uTG9hZDogKFxuICAgICAgc3VjY2VzczogYm9vbGVhbixcbiAgICAgIHN1cnZleUpzb246IGFueSxcbiAgICAgIHJlc3VsdDogc3RyaW5nLFxuICAgICAgcmVzcG9uc2U6IGFueVxuICAgICkgPT4gdm9pZFxuICApIHtcbiAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgeGhyLm9wZW4oXG4gICAgICBcIkdFVFwiLFxuICAgICAgZHhTdXJ2ZXlTZXJ2aWNlLnNlcnZpY2VVcmwgK1xuICAgICAgICBcIi9nZXRTdXJ2ZXlBbmRJc0NvbXBsZXRlZD9zdXJ2ZXlJZD1cIiArXG4gICAgICAgIHN1cnZleUlkICtcbiAgICAgICAgXCImY2xpZW50SWQ9XCIgK1xuICAgICAgICBjbGllbnRJZFxuICAgICk7XG4gICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIik7XG4gICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciByZXN1bHQgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZSk7XG4gICAgICB2YXIgc3VydmV5SnNvbiA9IHJlc3VsdCA/IHJlc3VsdC5zdXJ2ZXkgOiBudWxsO1xuICAgICAgdmFyIGlzQ29tcGxldGVkID0gcmVzdWx0ID8gcmVzdWx0LmlzQ29tcGxldGVkIDogbnVsbDtcbiAgICAgIG9uTG9hZCh4aHIuc3RhdHVzID09IDIwMCwgc3VydmV5SnNvbiwgaXNDb21wbGV0ZWQsIHhoci5yZXNwb25zZSk7XG4gICAgfTtcbiAgICB4aHIuc2VuZCgpO1xuICB9XG4gIHB1YmxpYyBzZW5kUmVzdWx0KFxuICAgIHBvc3RJZDogc3RyaW5nLFxuICAgIHJlc3VsdDogSlNPTixcbiAgICBvblNlbmRSZXN1bHQ6IChzdWNjZXNzOiBib29sZWFuLCByZXNwb25zZTogYW55LCByZXF1ZXN0PzogYW55KSA9PiB2b2lkLFxuICAgIGNsaWVudElkOiBzdHJpbmcgPSBudWxsLFxuICAgIGlzUGFydGlhbENvbXBsZXRlZDogYm9vbGVhbiA9IGZhbHNlXG4gICkge1xuICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICB4aHIub3BlbihcIlBPU1RcIiwgZHhTdXJ2ZXlTZXJ2aWNlLnNlcnZpY2VVcmwgKyBcIi9wb3N0L1wiKTtcbiAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLThcIik7XG4gICAgdmFyIGRhdGEgPSB7IHBvc3RJZDogcG9zdElkLCBzdXJ2ZXlSZXN1bHQ6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCkgfTtcbiAgICBpZiAoY2xpZW50SWQpICg8YW55PmRhdGEpW1wiY2xpZW50SWRcIl0gPSBjbGllbnRJZDtcbiAgICBpZiAoaXNQYXJ0aWFsQ29tcGxldGVkKSAoPGFueT5kYXRhKVtcImlzUGFydGlhbENvbXBsZXRlZFwiXSA9IHRydWU7XG4gICAgdmFyIGRhdGFTdHJpbmdpZnk6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB4aHIub25sb2FkID0geGhyLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIW9uU2VuZFJlc3VsdCkgcmV0dXJuO1xuICAgICAgb25TZW5kUmVzdWx0KHhoci5zdGF0dXMgPT09IDIwMCwgeGhyLnJlc3BvbnNlLCB4aHIpO1xuICAgIH07XG4gICAgeGhyLnNlbmQoZGF0YVN0cmluZ2lmeSk7XG4gIH1cbiAgcHVibGljIHNlbmRGaWxlKFxuICAgIHBvc3RJZDogc3RyaW5nLFxuICAgIGZpbGU6IEZpbGUsXG4gICAgb25TZW5kRmlsZTogKHN1Y2Nlc3M6IGJvb2xlYW4sIHJlc3BvbnNlOiBhbnkpID0+IHZvaWRcbiAgKSB7XG4gICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHhoci5vbmxvYWQgPSB4aHIub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghb25TZW5kRmlsZSkgcmV0dXJuO1xuICAgICAgb25TZW5kRmlsZSh4aHIuc3RhdHVzID09IDIwMCwgSlNPTi5wYXJzZSh4aHIucmVzcG9uc2UpKTtcbiAgICB9O1xuICAgIHhoci5vcGVuKFwiUE9TVFwiLCBkeFN1cnZleVNlcnZpY2Uuc2VydmljZVVybCArIFwiL3VwbG9hZC9cIiwgdHJ1ZSk7XG4gICAgdmFyIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgZm9ybURhdGEuYXBwZW5kKFwiZmlsZVwiLCBmaWxlKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoXCJwb3N0SWRcIiwgcG9zdElkKTtcbiAgICB4aHIuc2VuZChmb3JtRGF0YSk7XG4gIH1cbiAgcHVibGljIGdldFJlc3VsdChcbiAgICByZXN1bHRJZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBvbkdldFJlc3VsdDogKFxuICAgICAgc3VjY2VzczogYm9vbGVhbixcbiAgICAgIGRhdGE6IGFueSxcbiAgICAgIGRhdGFMaXN0OiBBcnJheTxhbnk+LFxuICAgICAgcmVzcG9uc2U6IGFueVxuICAgICkgPT4gdm9pZFxuICApIHtcbiAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgdmFyIGRhdGEgPSBcInJlc3VsdElkPVwiICsgcmVzdWx0SWQgKyBcIiZuYW1lPVwiICsgbmFtZTtcbiAgICB4aHIub3BlbihcIkdFVFwiLCBkeFN1cnZleVNlcnZpY2Uuc2VydmljZVVybCArIFwiL2dldFJlc3VsdD9cIiArIGRhdGEpO1xuICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHJlc3VsdCA9IG51bGw7XG4gICAgICB2YXIgbGlzdCA9IG51bGw7XG4gICAgICBpZiAoeGhyLnN0YXR1cyA9PSAyMDApIHtcbiAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZSh4aHIucmVzcG9uc2UpO1xuICAgICAgICBsaXN0ID0gW107XG4gICAgICAgIGZvciAodmFyIGtleSBpbiByZXN1bHQuUXVlc3Rpb25SZXN1bHQpIHtcbiAgICAgICAgICB2YXIgZWwgPSB7IG5hbWU6IGtleSwgdmFsdWU6IHJlc3VsdC5RdWVzdGlvblJlc3VsdFtrZXldIH07XG4gICAgICAgICAgbGlzdC5wdXNoKGVsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgb25HZXRSZXN1bHQoeGhyLnN0YXR1cyA9PSAyMDAsIHJlc3VsdCwgbGlzdCwgeGhyLnJlc3BvbnNlKTtcbiAgICB9O1xuICAgIHhoci5zZW5kKCk7XG4gIH1cbiAgcHVibGljIGlzQ29tcGxldGVkKFxuICAgIHJlc3VsdElkOiBzdHJpbmcsXG4gICAgY2xpZW50SWQ6IHN0cmluZyxcbiAgICBvbklzQ29tcGxldGVkOiAoc3VjY2VzczogYm9vbGVhbiwgcmVzdWx0OiBzdHJpbmcsIHJlc3BvbnNlOiBhbnkpID0+IHZvaWRcbiAgKSB7XG4gICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHZhciBkYXRhID0gXCJyZXN1bHRJZD1cIiArIHJlc3VsdElkICsgXCImY2xpZW50SWQ9XCIgKyBjbGllbnRJZDtcbiAgICB4aHIub3BlbihcIkdFVFwiLCBkeFN1cnZleVNlcnZpY2Uuc2VydmljZVVybCArIFwiL2lzQ29tcGxldGVkP1wiICsgZGF0YSk7XG4gICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIik7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gbnVsbDtcbiAgICAgIGlmICh4aHIuc3RhdHVzID09IDIwMCkge1xuICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZSk7XG4gICAgICB9XG4gICAgICBvbklzQ29tcGxldGVkKHhoci5zdGF0dXMgPT0gMjAwLCByZXN1bHQsIHhoci5yZXNwb25zZSk7XG4gICAgfTtcbiAgICB4aHIuc2VuZCgpO1xuICB9XG59XG4iLCJpbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vYXJhYmljXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vYmFzcXVlXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vYnVsZ2FyaWFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vY2F0YWxhblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2Nyb2F0aWFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vY3plY2hcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9kYW5pc2hcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9kdXRjaFwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2VzdG9uaWFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vZmlubmlzaFwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2ZyZW5jaFwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2dlb3JnaWFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vZ2VybWFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vZ3JlZWtcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9oZWJyZXdcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9oaW5kaVwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2h1bmdhcmlhblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2ljZWxhbmRpY1wiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2luZG9uZXNpYW5cIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9pdGFsaWFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vamFwYW5lc2VcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9rYXpha2hcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9rb3JlYW5cIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9sYXR2aWFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vbGl0aHVhbmlhblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL21hY2Vkb25pYW5cIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9ub3J3ZWdpYW5cIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9wZXJzaWFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vcG9saXNoXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vcG9ydHVndWVzZVwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL3BvcnR1Z3Vlc2UtYnJcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9yb21hbmlhblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL3J1c3NpYW5cIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9zZXJiaWFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vc2ltcGxpZmllZC1jaGluZXNlXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vc3BhbmlzaFwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL3N3YWhpbGlcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9zd2VkaXNoXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vdGFqaWtcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi90aGFpXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vdHJhZGl0aW9uYWwtY2hpbmVzZVwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL3R1cmtpc2hcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi91a3JhaW5pYW5cIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi92aWV0bmFtZXNlXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vd2Vsc2hcIjtcbiIsIi8vIHN0eWxlc1xuaW1wb3J0IFwiLi4vLi4vbWFpbi5zY3NzXCI7XG4vL2ltcG9ydCBcIi4uLy4uL21vZGVybi5zY3NzXCI7XG5cbmV4cG9ydCB2YXIgVmVyc2lvbjogc3RyaW5nO1xuVmVyc2lvbiA9IGAke3Byb2Nlc3MuZW52LlZFUlNJT059YDtcblxuZXhwb3J0IHsgc2V0dGluZ3MgfSBmcm9tIFwiLi4vLi4vc2V0dGluZ3NcIjtcbmV4cG9ydCB7IEhlbHBlcnMsIEhhc2hUYWJsZSB9IGZyb20gXCIuLi8uLi9oZWxwZXJzXCI7XG5leHBvcnQge1xuICBBbnN3ZXJDb3VudFZhbGlkYXRvcixcbiAgRW1haWxWYWxpZGF0b3IsXG4gIE51bWVyaWNWYWxpZGF0b3IsXG4gIFJlZ2V4VmFsaWRhdG9yLFxuICBTdXJ2ZXlWYWxpZGF0b3IsXG4gIFRleHRWYWxpZGF0b3IsXG4gIFZhbGlkYXRvclJlc3VsdCxcbiAgRXhwcmVzc2lvblZhbGlkYXRvcixcbiAgVmFsaWRhdG9yUnVubmVyXG59IGZyb20gXCIuLi8uLi92YWxpZGF0b3JcIjtcbmV4cG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuLi8uLi9pdGVtdmFsdWVcIjtcbmV4cG9ydCB7IEJhc2UsIEV2ZW50LCBBcnJheUNoYW5nZXMsIENvbXB1dGVkVXBkYXRlciB9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5leHBvcnQge1xuICBJU3VydmV5LFxuICBJU3VydmV5RWxlbWVudCxcbiAgSUVsZW1lbnQsXG4gIElQYWdlLFxuICBJVGl0bGVPd25lclxufSBmcm9tIFwiLi4vLi4vYmFzZS1pbnRlcmZhY2VzXCI7XG5leHBvcnQgeyBTdXJ2ZXlFcnJvciB9IGZyb20gXCIuLi8uLi9zdXJ2ZXktZXJyb3JcIjtcbmV4cG9ydCB7IFN1cnZleUVsZW1lbnRDb3JlLCBTdXJ2ZXlFbGVtZW50IH0gZnJvbSBcIi4uLy4uL3N1cnZleS1lbGVtZW50XCI7XG5leHBvcnQgeyBDYWxjdWxhdGVkVmFsdWUgfSBmcm9tIFwiLi4vLi4vY2FsY3VsYXRlZFZhbHVlXCI7XG5leHBvcnQge1xuICBDdXN0b21FcnJvcixcbiAgQW5zd2VyUmVxdWlyZWRFcnJvcixcbiAgT25lQW5zd2VyUmVxdWlyZWRFcnJvcixcbiAgUmVxdXJlTnVtZXJpY0Vycm9yLFxuICBFeGNlZWRTaXplRXJyb3Jcbn0gZnJvbSBcIi4uLy4uL2Vycm9yXCI7XG5leHBvcnQge1xuICBJTG9jYWxpemFibGVPd25lcixcbiAgSUxvY2FsaXphYmxlU3RyaW5nLFxuICBMb2NhbGl6YWJsZVN0cmluZyxcbiAgTG9jYWxpemFibGVTdHJpbmdzXG59IGZyb20gXCIuLi8uLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuZXhwb3J0IHsgSHRtbENvbmRpdGlvbkl0ZW0sIFVybENvbmRpdGlvbkl0ZW0gfSBmcm9tIFwiLi4vLi4vZXhwcmVzc2lvbkl0ZW1zXCI7XG5leHBvcnQgeyBDaG9pY2VzUmVzdGZ1bCwgQ2hvaWNlc1Jlc3RmdWxsIH0gZnJvbSBcIi4uLy4uL2Nob2ljZXNSZXN0ZnVsXCI7XG5leHBvcnQgeyBGdW5jdGlvbkZhY3RvcnksIHJlZ2lzdGVyRnVuY3Rpb24gfSBmcm9tIFwiLi4vLi4vZnVuY3Rpb25zZmFjdG9yeVwiO1xuZXhwb3J0IHsgQ29uZGl0aW9uUnVubmVyLCBFeHByZXNzaW9uUnVubmVyIH0gZnJvbSBcIi4uLy4uL2NvbmRpdGlvbnNcIjtcbmV4cG9ydCB7XG4gIE9wZXJhbmQsXG4gIENvbnN0LFxuICBCaW5hcnlPcGVyYW5kLFxuICBWYXJpYWJsZSxcbiAgRnVuY3Rpb25PcGVyYW5kLFxuICBBcnJheU9wZXJhbmRcbn0gZnJvbSBcIi4uLy4uL2V4cHJlc3Npb25zL2V4cHJlc3Npb25zXCI7XG5leHBvcnQgeyBDb25kaXRpb25zUGFyc2VyIH0gZnJvbSBcIi4uLy4uL2NvbmRpdGlvbnNQYXJzZXJcIjtcbmV4cG9ydCB7IFByb2Nlc3NWYWx1ZSB9IGZyb20gXCIuLi8uLi9jb25kaXRpb25Qcm9jZXNzVmFsdWVcIjtcbmV4cG9ydCB7XG4gIEpzb25FcnJvcixcbiAgSnNvbkluY29ycmVjdFR5cGVFcnJvcixcbiAgSnNvbk1ldGFkYXRhLFxuICBKc29uTWV0YWRhdGFDbGFzcyxcbiAgSnNvbk1pc3NpbmdUeXBlRXJyb3IsXG4gIEpzb25NaXNzaW5nVHlwZUVycm9yQmFzZSxcbiAgSnNvbk9iamVjdCxcbiAgSnNvbk9iamVjdFByb3BlcnR5LFxuICBKc29uUmVxdWlyZWRQcm9wZXJ0eUVycm9yLFxuICBKc29uVW5rbm93blByb3BlcnR5RXJyb3IsXG4gIFNlcmlhbGl6ZXIsXG4gIHByb3BlcnR5LFxuICBwcm9wZXJ0eUFycmF5XG59IGZyb20gXCIuLi8uLi9qc29ub2JqZWN0XCI7XG5leHBvcnQge1xuICBNYXRyaXhEcm9wZG93bkNlbGwsXG4gIE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlXG59IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9tYXRyaXhkcm9wZG93bmJhc2VcIjtcbmV4cG9ydCB7IE1hdHJpeERyb3Bkb3duQ29sdW1uLCBtYXRyaXhEcm9wZG93bkNvbHVtblR5cGVzIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duY29sdW1uXCI7XG5leHBvcnQgeyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsLCBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3csIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFRhYmxlIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3ducmVuZGVyZWRcIjtcbmV4cG9ydCB7XG4gIE1hdHJpeERyb3Bkb3duUm93TW9kZWwsXG4gIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbFxufSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fbWF0cml4ZHJvcGRvd25cIjtcbmV4cG9ydCB7XG4gIE1hdHJpeER5bmFtaWNSb3dNb2RlbCxcbiAgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWxcbn0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX21hdHJpeGR5bmFtaWNcIjtcbmV4cG9ydCB7XG4gIE1hdHJpeFJvd01vZGVsLFxuICBNYXRyaXhDZWxscyxcbiAgUXVlc3Rpb25NYXRyaXhNb2RlbCxcbiAgSU1hdHJpeERhdGFcbn0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX21hdHJpeFwiO1xuZXhwb3J0IHtcbiAgTXVsdGlwbGVUZXh0SXRlbU1vZGVsLFxuICBRdWVzdGlvbk11bHRpcGxlVGV4dE1vZGVsXG59IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9tdWx0aXBsZXRleHRcIjtcbmV4cG9ydCB7IFBhbmVsTW9kZWwsIFBhbmVsTW9kZWxCYXNlLCBRdWVzdGlvblJvd01vZGVsIH0gZnJvbSBcIi4uLy4uL3BhbmVsXCI7XG5leHBvcnQgeyBGbG93UGFuZWxNb2RlbCB9IGZyb20gXCIuLi8uLi9mbG93cGFuZWxcIjtcbmV4cG9ydCB7IFBhZ2VNb2RlbCB9IGZyb20gXCIuLi8uLi9wYWdlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4vLi4vdGVtcGxhdGUtcmVuZGVyZXJcIjtcbmV4cG9ydCB7IERlZmF1bHRUaXRsZU1vZGVsIH0gZnJvbSBcIi4uLy4uL2RlZmF1bHRUaXRsZVwiO1xuZXhwb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25cIjtcbmV4cG9ydCB7IFF1ZXN0aW9uTm9uVmFsdWUgfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25ub252YWx1ZVwiO1xuZXhwb3J0IHsgUXVlc3Rpb25FbXB0eU1vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX2VtcHR5XCI7XG5leHBvcnQge1xuICBRdWVzdGlvbkNoZWNrYm94QmFzZSxcbiAgUXVlc3Rpb25TZWxlY3RCYXNlXG59IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9iYXNlc2VsZWN0XCI7XG5leHBvcnQgeyBRdWVzdGlvbkNoZWNrYm94TW9kZWwgfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fY2hlY2tib3hcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uUmFua2luZ01vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX3JhbmtpbmdcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uQ29tbWVudE1vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX2NvbW1lbnRcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uRHJvcGRvd25Nb2RlbCB9IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9kcm9wZG93blwiO1xuZXhwb3J0IHsgUXVlc3Rpb25GYWN0b3J5LCBFbGVtZW50RmFjdG9yeSB9IGZyb20gXCIuLi8uLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uRmlsZU1vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX2ZpbGVcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uSHRtbE1vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX2h0bWxcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX3JhZGlvZ3JvdXBcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uUmF0aW5nTW9kZWwgfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fcmF0aW5nXCI7XG5leHBvcnQgeyBRdWVzdGlvbkV4cHJlc3Npb25Nb2RlbCB9IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9leHByZXNzaW9uXCI7XG5leHBvcnQgeyBRdWVzdGlvblRleHRNb2RlbCB9IGZyb20gXCIuLi8uLi9xdWVzdGlvbl90ZXh0XCI7XG5leHBvcnQgeyBRdWVzdGlvbkJvb2xlYW5Nb2RlbCB9IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9ib29sZWFuXCI7XG5leHBvcnQge1xuICBRdWVzdGlvbkltYWdlUGlja2VyTW9kZWwsXG4gIEltYWdlSXRlbVZhbHVlXG59IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9pbWFnZXBpY2tlclwiO1xuZXhwb3J0IHsgUXVlc3Rpb25JbWFnZU1vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX2ltYWdlXCI7XG5leHBvcnQgeyBRdWVzdGlvblNpZ25hdHVyZVBhZE1vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX3NpZ25hdHVyZXBhZFwiO1xuZXhwb3J0IHtcbiAgUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbCxcbiAgUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtXG59IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9wYW5lbGR5bmFtaWNcIjtcbmV4cG9ydCB7IFN1cnZleVRpbWVyIH0gZnJvbSBcIi4uLy4uL3N1cnZleXRpbWVyXCI7XG5leHBvcnQgeyBTdXJ2ZXlQcm9ncmVzc01vZGVsIH0gZnJvbSBcIi4uLy4uL3N1cnZleVByb2dyZXNzXCI7XG5leHBvcnQgeyBTdXJ2ZXlQcm9ncmVzc0J1dHRvbnNNb2RlbCB9IGZyb20gXCIuLi8uLi9zdXJ2ZXlQcm9ncmVzc0J1dHRvbnNcIjtcbmV4cG9ydCB7IFN1cnZleU1vZGVsIH0gZnJvbSBcIi4uLy4uL3N1cnZleVwiO1xuZXhwb3J0IHtcbiAgU3VydmV5VHJpZ2dlcixcbiAgU3VydmV5VHJpZ2dlckNvbXBsZXRlLFxuICBTdXJ2ZXlUcmlnZ2VyU2V0VmFsdWUsXG4gIFN1cnZleVRyaWdnZXJWaXNpYmxlLFxuICBTdXJ2ZXlUcmlnZ2VyQ29weVZhbHVlLFxuICBTdXJ2ZXlUcmlnZ2VyUnVuRXhwcmVzc2lvbixcbiAgVHJpZ2dlclxufSBmcm9tIFwiLi4vLi4vdHJpZ2dlclwiO1xuZXhwb3J0IHsgU3VydmV5V2luZG93TW9kZWwgfSBmcm9tIFwiLi4vLi4vc3VydmV5V2luZG93XCI7XG5leHBvcnQgeyBUZXh0UHJlUHJvY2Vzc29yIH0gZnJvbSBcIi4uLy4uL3RleHRQcmVQcm9jZXNzb3JcIjtcblxuZXhwb3J0IHsgZHhTdXJ2ZXlTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL2R4U3VydmV5U2VydmljZVwiO1xuZXhwb3J0IHsgZW5nbGlzaFN0cmluZ3MgfSBmcm9tIFwiLi4vLi4vbG9jYWxpemF0aW9uL2VuZ2xpc2hcIjtcbmV4cG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiwgc3VydmV5U3RyaW5ncyB9IGZyb20gXCIuLi8uLi9zdXJ2ZXlTdHJpbmdzXCI7XG4vLyBleHBvcnQgeyBjdWx0dXJlSW5mbyB9IGZyb20gXCIuLi8uLi9jdWx0dXJlSW5mb1wiO1xuZXhwb3J0IHtcbiAgUXVlc3Rpb25DdXN0b21XaWRnZXQsXG4gIEN1c3RvbVdpZGdldENvbGxlY3Rpb24sXG59IGZyb20gXCIuLi8uLi9xdWVzdGlvbkN1c3RvbVdpZGdldHNcIjtcbmV4cG9ydCB7XG4gIFF1ZXN0aW9uQ3VzdG9tTW9kZWwsXG4gIFF1ZXN0aW9uQ29tcG9zaXRlTW9kZWwsXG4gIENvbXBvbmVudFF1ZXN0aW9uSlNPTixcbiAgQ29tcG9uZW50Q29sbGVjdGlvblxufSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fY3VzdG9tXCI7XG5cbmV4cG9ydCB7IFN0eWxlc01hbmFnZXIgfSBmcm9tIFwiLi4vLi4vc3R5bGVzbWFuYWdlclwiO1xuZXhwb3J0IHsgTGlzdE1vZGVsIH0gZnJvbSBcIi4uLy4uL2xpc3RcIjtcbmV4cG9ydCB7IFBvcHVwTW9kZWwsIFBvcHVwQmFzZVZpZXdNb2RlbCwgY3JlYXRlUG9wdXBNb2RhbFZpZXdNb2RlbCB9IGZyb20gXCIuLi8uLi9wb3B1cFwiO1xuZXhwb3J0IHtcbiAgUXVlc3Rpb25CdXR0b25Hcm91cE1vZGVsLFxuICBCdXR0b25Hcm91cEl0ZW1Nb2RlbCxcbiAgQnV0dG9uR3JvdXBJdGVtVmFsdWVcbn0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX2J1dHRvbmdyb3VwXCI7XG5leHBvcnQgeyBJc01vYmlsZSB9IGZyb20gXCIuLi8uLi91dGlscy9pcy1tb2JpbGVcIjtcbmV4cG9ydCB7XG4gIGNvbmZpcm1BY3Rpb24sXG4gIGRldGVjdElFT3JFZGdlLFxuICBkb0tleTJDbGlja1VwLFxuICBkb0tleTJDbGlja0Rvd24sXG4gIGxvYWRGaWxlRnJvbUJhc2U2NCxcbiAgaW5jcmVhc2VIZWlnaHRCeUNvbnRlbnQsXG4gIGNyZWF0ZVN2Z1xufSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi8uLi91dGlscy9jc3NDbGFzc0J1aWxkZXJcIjtcblxuZXhwb3J0IHsgc3VydmV5Q3NzIH0gZnJvbSBcIi4uLy4uL2RlZmF1bHRDc3MvY3Nzc3RhbmRhcmRcIjtcbi8vVW5jb21tZW50IHRvIGluY2x1ZGUgdGhlIFwiZGF0ZVwiIHF1ZXN0aW9uIHR5cGUuXG4vL2V4cG9ydCB7ZGVmYXVsdCBhcyBRdWVzdGlvbkRhdGVNb2RlbH0gZnJvbSBcIi4uLy4uL3BsdWdpbnMvcXVlc3Rpb25fZGF0ZVwiO1xuXG5leHBvcnQgeyBEcmFnRHJvcFN1cnZleUVsZW1lbnRzIH0gZnJvbSBcIi4uLy4uL2RyYWdkcm9wL3N1cnZleS1lbGVtZW50c1wiO1xuZXhwb3J0IHsgRHJhZ0Ryb3BDaG9pY2VzIH0gZnJvbSBcIi4uLy4uL2RyYWdkcm9wL2Nob2ljZXNcIjtcbiIsIi8vIG1vZGVsXG5leHBvcnQgKiBmcm9tIFwiLi9jaHVua3MvbW9kZWxcIjtcblxuLy8gbG9jYWxpemF0aW9uXG5pbXBvcnQgXCIuL2NodW5rcy9sb2NhbGl6YXRpb25cIjtcblxuLy8gY3NzIHN0YW5kYXJkIGNsYXNzZXNcbmV4cG9ydCB7IGRlZmF1bHRTdGFuZGFyZENzcyB9IGZyb20gXCIuLi9kZWZhdWx0Q3NzL2Nzc3N0YW5kYXJkXCI7XG4vLyBjc3MgYm9vdHN0cmFwIGNsYXNzZXNcbmV4cG9ydCB7IGRlZmF1bHRCb290c3RyYXBDc3MgfSBmcm9tIFwiLi4vZGVmYXVsdENzcy9jc3Nib290c3RyYXBcIjtcbi8vIGNzcyBib290c3RyYXAgKyBtYXRlcmlhbCBjbGFzc2VzXG5leHBvcnQgeyBkZWZhdWx0Qm9vdHN0cmFwTWF0ZXJpYWxDc3MgfSBmcm9tIFwiLi4vZGVmYXVsdENzcy9jc3Nib290c3RyYXBtYXRlcmlhbFwiO1xuLy8gY3NzIG1vZGVybiBjbGFzc2VzXG5leHBvcnQgeyBtb2Rlcm5Dc3MgfSBmcm9tIFwiLi4vZGVmYXVsdENzcy9jc3Ntb2Rlcm5cIjtcblxuLy8gdXRpbHNcbmV4cG9ydCAqIGZyb20gXCIuLi9yZW5kZXJlckZhY3RvcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi91dGlscy9yZXNwb25zaXZpdHktbWFuYWdlclwiO1xuZXhwb3J0IHsgdW53cmFwIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4vYWN0aW9ucy9hY3Rpb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuLi9hY3Rpb25zL2FkYXB0aXZlLWNvbnRhaW5lclwiO1xuZXhwb3J0ICogZnJvbSBcIi4uL2FjdGlvbnMvY29udGFpbmVyXCI7XG4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCBqUXVlcnkgZnJvbSBcImpxdWVyeVwiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9jb3JlXCI7XG4vKlxuLy8gbW9kZWxcbmV4cG9ydCAqIGZyb20gXCIuL2NodW5rcy9tb2RlbFwiO1xuLy9pbXBvcnQgXCIuLi9tb2Rlcm4uc2Nzc1wiO1xuXG4vLyBsb2NhbGl6YXRpb25cbmltcG9ydCBcIi4vY2h1bmtzL2xvY2FsaXphdGlvblwiO1xuXG4vLyBoZWxwZXJzXG5leHBvcnQgKiBmcm9tIFwiLi9jaHVua3MvaGVscGVyc1wiO1xuXG4vLyBjc3Mgc3RhbmRhcmRcbmV4cG9ydCB7IGRlZmF1bHRTdGFuZGFyZENzcyB9IGZyb20gXCIuLi9kZWZhdWx0Q3NzL2Nzc3N0YW5kYXJkXCI7XG4vLyBjc3MgYm9vdHN0cmFwXG5leHBvcnQgeyBkZWZhdWx0Qm9vdHN0cmFwQ3NzIH0gZnJvbSBcIi4uL2RlZmF1bHRDc3MvY3NzYm9vdHN0cmFwXCI7XG4vLyBjc3MgYm9vdHN0cmFwICsgbWF0ZXJpYWxcbmV4cG9ydCB7IGRlZmF1bHRCb290c3RyYXBNYXRlcmlhbENzcyB9IGZyb20gXCIuLi9kZWZhdWx0Q3NzL2Nzc2Jvb3RzdHJhcG1hdGVyaWFsXCI7XG5leHBvcnQgeyBtb2Rlcm5Dc3MgfSBmcm9tIFwiLi4vZGVmYXVsdENzcy9jc3Ntb2Rlcm5cIjtcbiovXG5jb25zdCBpbm5lcktvOiBhbnkgPSBrbztcbmV4cG9ydCB7IGlubmVyS28gYXMga28gfTtcbmltcG9ydCB7IFN1cnZleSwgU3VydmV5V2luZG93IH0gZnJvbSBcIi4va25vY2tvdXRcIjtcbmV4cG9ydCB7IFN1cnZleSBhcyBNb2RlbCB9O1xuXG5pbXBvcnQgeyBTdXJ2ZXlNb2RlbCB9IGZyb20gXCIuLi9zdXJ2ZXlcIjtcbmltcG9ydCB7IHJlZ2lzdGVyVGVtcGxhdGVFbmdpbmUgfSBmcm9tIFwiLi4va25vY2tvdXQva29zdXJ2ZXlcIjtcblxualF1ZXJ5W1wiZm5cIl0uZXh0ZW5kKHtcbiAgU3VydmV5OiBmdW5jdGlvbiAocHJvcHM6IGFueSkge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIG1vZGVsOiBTdXJ2ZXkgPSBwcm9wcy5tb2RlbDtcbiAgICAgIG1vZGVsLnVwZGF0ZVN1cnZleShwcm9wcyk7XG4gICAgICBtb2RlbC5yZW5kZXIodGhpcyk7XG4gICAgfSk7XG4gIH0sXG5cbiAgU3VydmV5V2luZG93OiBmdW5jdGlvbiAocHJvcHM6IGFueSkge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIG1vZGVsOiBTdXJ2ZXkgPSBwcm9wcy5tb2RlbDtcbiAgICAgIG1vZGVsLnVwZGF0ZVN1cnZleShwcm9wcyk7XG4gICAgICB2YXIgc3VydmV5ID0gbmV3IFN1cnZleVdpbmRvdyhudWxsLCBtb2RlbCk7XG4gICAgICBpZiAocHJvcHMuZXhwYW5kZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzdXJ2ZXkuaXNFeHBhbmRlZCA9IHByb3BzLmV4cGFuZGVkO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BzLmlzRXhwYW5kZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzdXJ2ZXkuaXNFeHBhbmRlZCA9IHByb3BzLmlzRXhwYW5kZWQ7XG4gICAgICB9XG4gICAgICBpZiAocHJvcHMuY2xvc2VPbkNvbXBsZXRlVGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHN1cnZleS5jbG9zZU9uQ29tcGxldGVUaW1lb3V0ID0gcHJvcHMuY2xvc2VPbkNvbXBsZXRlVGltZW91dDtcbiAgICAgIH1cbiAgICAgIHN1cnZleS5zaG93KCk7XG4gICAgfSk7XG4gIH0sXG59KTtcblxuU3VydmV5TW9kZWwucGxhdGZvcm0gPSBcImpxdWVyeVwiO1xuXG5yZWdpc3RlclRlbXBsYXRlRW5naW5lKGtvLCBTdXJ2ZXlNb2RlbC5wbGF0Zm9ybSk7XG4iLCIvKlxuLy8gbW9kZWxcbmV4cG9ydCAqIGZyb20gXCIuL2NodW5rcy9tb2RlbFwiO1xuXG4vLyBsb2NhbGl6YXRpb25cbmltcG9ydCBcIi4vY2h1bmtzL2xvY2FsaXphdGlvblwiO1xuXG4vLyBoZWxwZXJzXG5leHBvcnQgKiBmcm9tIFwiLi9jaHVua3MvaGVscGVyc1wiO1xuXG4vLyBjc3Mgc3RhbmRhcmRcbmV4cG9ydCB7IGRlZmF1bHRTdGFuZGFyZENzcyB9IGZyb20gXCIuLi9kZWZhdWx0Q3NzL2Nzc3N0YW5kYXJkXCI7XG4vLyBjc3MgYm9vdHN0cmFwXG5leHBvcnQgeyBkZWZhdWx0Qm9vdHN0cmFwQ3NzIH0gZnJvbSBcIi4uL2RlZmF1bHRDc3MvY3NzYm9vdHN0cmFwXCI7XG4vLyBjc3MgYm9vdHN0cmFwICsgbWF0ZXJpYWxcbmV4cG9ydCB7IGRlZmF1bHRCb290c3RyYXBNYXRlcmlhbENzcyB9IGZyb20gXCIuLi9kZWZhdWx0Q3NzL2Nzc2Jvb3RzdHJhcG1hdGVyaWFsXCI7XG5leHBvcnQgeyBtb2Rlcm5Dc3MgfSBmcm9tIFwiLi4vZGVmYXVsdENzcy9jc3Ntb2Rlcm5cIjtcbiovXG4vLyBrbm9ja291dFxuZXhwb3J0IHsgU3VydmV5IH0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvc3VydmV5XCI7XG5leHBvcnQgeyBTdXJ2ZXkgYXMgTW9kZWwgfSBmcm9tIFwiLi4va25vY2tvdXQva29zdXJ2ZXlcIjtcbmV4cG9ydCB7IEltcGxlbWVudG9yQmFzZSB9IGZyb20gXCIuLi9rbm9ja291dC9rb2Jhc2VcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uUm93LCBQYWdlLCBQYW5lbCB9IGZyb20gXCIuLi9rbm9ja291dC9rb3BhZ2VcIjtcbmV4cG9ydCB7IEZsb3dQYW5lbCB9IGZyb20gXCIuLi9rbm9ja291dC9rb2Zsb3dwYW5lbFwiO1xuZXhwb3J0IHsgUXVlc3Rpb25JbXBsZW1lbnRvciB9IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uXCI7XG5leHBvcnQgeyBRdWVzdGlvblNlbGVjdEJhc2VJbXBsZW1lbnRvciB9IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uX2Jhc2VzZWxlY3RcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uQ2hlY2tib3hCYXNlSW1wbGVtZW50b3IgfSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9iYXNlc2VsZWN0XCI7XG5leHBvcnQgeyBRdWVzdGlvbkNoZWNrYm94IH0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvcXVlc3Rpb25fY2hlY2tib3hcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uUmFua2luZyB9IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uX3JhbmtpbmdcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uQ29tbWVudCB9IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uX2NvbW1lbnRcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uRHJvcGRvd24gfSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9kcm9wZG93blwiO1xuZXhwb3J0IHsgUXVlc3Rpb25GaWxlIH0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvcXVlc3Rpb25fZmlsZVwiO1xuZXhwb3J0IHsgUXVlc3Rpb25IdG1sIH0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvcXVlc3Rpb25faHRtbFwiO1xuZXhwb3J0IHsgUXVlc3Rpb25NYXRyaXggfSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9tYXRyaXhcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uTWF0cml4RHJvcGRvd24gfSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9tYXRyaXhkcm9wZG93blwiO1xuZXhwb3J0IHtcbiAgUXVlc3Rpb25NYXRyaXhEeW5hbWljSW1wbGVtZW50b3IsXG4gIFF1ZXN0aW9uTWF0cml4RHluYW1pYyxcbn0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvcXVlc3Rpb25fbWF0cml4ZHluYW1pY1wiO1xuZXhwb3J0IHsgUXVlc3Rpb25QYW5lbER5bmFtaWMgfSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9wYW5lbGR5bmFtaWNcIjtcbmV4cG9ydCB7XG4gIE11bHRpcGxlVGV4dEl0ZW0sXG4gIFF1ZXN0aW9uTXVsdGlwbGVUZXh0LFxufSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9tdWx0aXBsZXRleHRcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uUmFkaW9ncm91cCB9IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uX3JhZGlvZ3JvdXBcIjtcbmV4cG9ydCB7XG4gIFF1ZXN0aW9uUmF0aW5nLFxuICBRdWVzdGlvblJhdGluZ0ltcGxlbWVudG9yLFxufSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9yYXRpbmdcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uVGV4dCB9IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uX3RleHRcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uQm9vbGVhbiB9IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uX2Jvb2xlYW5cIjtcbmV4cG9ydCB7IFF1ZXN0aW9uRW1wdHkgfSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9lbXB0eVwiO1xuZXhwb3J0IHsgUXVlc3Rpb25FeHByZXNzaW9uIH0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvcXVlc3Rpb25fZXhwcmVzc2lvblwiO1xuZXhwb3J0IHsgUXVlc3Rpb25JbWFnZVBpY2tlciB9IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uX2ltYWdlcGlja2VyXCI7XG5leHBvcnQgeyBTdXJ2ZXlXaW5kb3cgfSBmcm9tIFwiLi4va25vY2tvdXQva29TdXJ2ZXlXaW5kb3dcIjtcbmV4cG9ydCB7IFN1cnZleVRlbXBsYXRlVGV4dCB9IGZyb20gXCIuLi9rbm9ja291dC90ZW1wbGF0ZVRleHRcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uSW1hZ2UgfSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9pbWFnZVwiO1xuZXhwb3J0IHsgUXVlc3Rpb25TaWduYXR1cmVQYWQgfSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9zaWduYXR1cmVwYWRcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uQ3VzdG9tIH0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvcXVlc3Rpb25fY3VzdG9tXCI7XG5leHBvcnQgeyBRdWVzdGlvbkJ1dHRvbkdyb3VwIH0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvcXVlc3Rpb25fYnV0dG9uZ3JvdXBcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4uL2tub2Nrb3V0L2NvbXBvbmVudHMvYWN0aW9uLWJhci9hY3Rpb24tYmFyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4va25vY2tvdXQvY29tcG9uZW50cy9ib29sZWFuLWNoZWNrYm94L2Jvb2xlYW4tY2hlY2tib3hcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi9rbm9ja291dC9jb21wb25lbnRzL3BhbmVsL3BhbmVsXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4va25vY2tvdXQvY29tcG9uZW50cy9wb3B1cC9wb3B1cFwiO1xuZXhwb3J0ICogZnJvbSBcIi4uL2tub2Nrb3V0L2NvbXBvbmVudHMvcHJvZ3Jlc3MvYnV0dG9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4uL2tub2Nrb3V0L2NvbXBvbmVudHMvcHJvZ3Jlc3MvcHJvZ3Jlc3NcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi9rbm9ja291dC9jb21wb25lbnRzL3RlbXBsYXRlLXJlbmRlcmVyL3RlbXBsYXRlLXJlbmRlcmVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4va25vY2tvdXQvY29tcG9uZW50cy90aXRsZS90aXRsZS1lbGVtZW50XCI7XG5leHBvcnQgKiBmcm9tIFwiLi4va25vY2tvdXQvY29tcG9uZW50cy90aXRsZS90aXRsZS1jb250ZW50XCI7XG5leHBvcnQgKiBmcm9tIFwiLi4va25vY2tvdXQvY29tcG9uZW50cy90aXRsZS9kZWZhdWx0LXRpdGxlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4va25vY2tvdXQvY29tcG9uZW50cy90aXRsZS90aXRsZS1hY3Rpb25zXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4va25vY2tvdXQvY29tcG9uZW50cy9zdHJpbmctZWRpdG9yL3N0cmluZy1lZGl0b3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi9rbm9ja291dC9jb21wb25lbnRzL3N0cmluZy12aWV3ZXIvc3RyaW5nLXZpZXdlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4uL2tub2Nrb3V0L2NvbXBvbmVudHMvbG9nby1pbWFnZS9sb2dvLWltYWdlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4va25vY2tvdXQvY29tcG9uZW50cy9za2VsZXRvbi9za2VsZXRvblwiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi4va25vY2tvdXQvY29tcG9uZW50cy9saXN0L2xpc3RcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi9rbm9ja291dC9jb21wb25lbnRzL3N2Zy1pY29uL3N2Zy1pY29uXCI7XG5leHBvcnQgeyBTdXJ2ZXlRdWVzdGlvbk1hdHJpeER5bmFtaWNSZW1vdmVCdXR0b24gfSBmcm9tIFwiLi4va25vY2tvdXQvY29tcG9uZW50cy9tYXRyaXgtYWN0aW9ucy9yZW1vdmUtYnV0dG9uL3JlbW92ZS1idXR0b25cIjtcbmV4cG9ydCB7IFN1cnZleVF1ZXN0aW9uTWF0cml4RGV0YWlsQnV0dG9uIH0gZnJvbSBcIi4uL2tub2Nrb3V0L2NvbXBvbmVudHMvbWF0cml4LWFjdGlvbnMvZGV0YWlsLWJ1dHRvbi9kZXRhaWwtYnV0dG9uXCI7XG5leHBvcnQgeyBTdXJ2ZXlRdWVzdGlvbk1hdHJpeER5bmFtaWNEcmFnRHJvcEljb24gfSBmcm9tIFwiLi4va25vY2tvdXQvY29tcG9uZW50cy9tYXRyaXgtYWN0aW9ucy9kcmFnLWRyb3AtaWNvbi9kcmFnLWRyb3AtaWNvblwiO1xuZXhwb3J0IHsgQnV0dG9uR3JvdXBJdGVtVmlld01vZGVsIH0gZnJvbSBcIi4uL2tub2Nrb3V0L2NvbXBvbmVudHMvYnV0dG9uLWdyb3VwL2J1dHRvbi1ncm91cC1pdGVtXCI7XG4vL2V4cG9ydCAqIGZyb20gXCIuLi91dGlscy9yZXNvbnNpYmlsaXR5bWFuYWdlclwiO1xuLy9leHBvcnQgeyB1bndyYXAgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbi8vVW5jb21tZW50IHRvIGluY2x1ZGUgdGhlIFwiZGF0ZVwiIHF1ZXN0aW9uIHR5cGUuXG4vL2V4cG9ydCB7UXVlc3Rpb25EYXRlfSBmcm9tIFwiLi4vcGx1Z2lucy9rbm9ja291dC9rb3F1ZXN0aW9uX2RhdGVcIjtcblxuaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlNb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgcmVnaXN0ZXJUZW1wbGF0ZUVuZ2luZSB9IGZyb20gXCIuLi9rbm9ja291dC9rb3N1cnZleVwiO1xucmVnaXN0ZXJUZW1wbGF0ZUVuZ2luZShrbywgU3VydmV5TW9kZWwucGxhdGZvcm0pO1xuIiwiZXhwb3J0ICogZnJvbSBcIi4vY29yZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4va25vY2tvdXQtdWlcIjtcbiIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7IFN1cnZleUVycm9yIH0gZnJvbSBcIi4vc3VydmV5LWVycm9yXCI7XG5pbXBvcnQgeyBJU3VydmV5RXJyb3JPd25lciB9IGZyb20gXCIuL2Jhc2UtaW50ZXJmYWNlc1wiO1xuXG5leHBvcnQgY2xhc3MgQW5zd2VyUmVxdWlyZWRFcnJvciBleHRlbmRzIFN1cnZleUVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHRleHQ6IHN0cmluZyA9IG51bGwsXG4gICAgZXJyb3JPd25lcjogSVN1cnZleUVycm9yT3duZXIgPSBudWxsXG4gICkge1xuICAgIHN1cGVyKHRleHQsIGVycm9yT3duZXIpO1xuICB9XG4gIHB1YmxpYyBnZXRFcnJvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJyZXF1aXJlZFwiO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicmVxdWlyZWRFcnJvclwiKTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIE9uZUFuc3dlclJlcXVpcmVkRXJyb3IgZXh0ZW5kcyBTdXJ2ZXlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyB0ZXh0OiBzdHJpbmcgPSBudWxsLFxuICAgIGVycm9yT3duZXI6IElTdXJ2ZXlFcnJvck93bmVyID0gbnVsbFxuICApIHtcbiAgICBzdXBlcih0ZXh0LCBlcnJvck93bmVyKTtcbiAgfVxuICBwdWJsaWMgZ2V0RXJyb3JUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwicmVxdWlyZW9uZWFuc3dlclwiO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicmVxdWlyZWRFcnJvckluUGFuZWxcIik7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBSZXF1cmVOdW1lcmljRXJyb3IgZXh0ZW5kcyBTdXJ2ZXlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyB0ZXh0OiBzdHJpbmcgPSBudWxsLFxuICAgIGVycm9yT3duZXI6IElTdXJ2ZXlFcnJvck93bmVyID0gbnVsbFxuICApIHtcbiAgICBzdXBlcih0ZXh0LCBlcnJvck93bmVyKTtcbiAgfVxuICBwdWJsaWMgZ2V0RXJyb3JUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwicmVxdWlyZW51bWVyaWNcIjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGVmYXVsdFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm51bWVyaWNFcnJvclwiKTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIEV4Y2VlZFNpemVFcnJvciBleHRlbmRzIFN1cnZleUVycm9yIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtYXhTaXplOiBudW1iZXIsIGVycm9yT3duZXI6IElTdXJ2ZXlFcnJvck93bmVyID0gbnVsbCkge1xuICAgIHN1cGVyKG51bGwsIGVycm9yT3duZXIpO1xuICAgIHRoaXMubG9jVGV4dC50ZXh0ID0gdGhpcy5nZXRUZXh0KCk7XG4gIH1cbiAgcHVibGljIGdldEVycm9yVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImV4Y2VlZHNpemVcIjtcbiAgfVxuICBwdWJsaWMgZ2V0RGVmYXVsdFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uXG4gICAgICAuZ2V0U3RyaW5nKFwiZXhjZWVkTWF4U2l6ZVwiKVxuICAgICAgW1wiZm9ybWF0XCJdKHRoaXMuZ2V0VGV4dFNpemUoKSk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRUZXh0U2l6ZSgpIHtcbiAgICB2YXIgc2l6ZXMgPSBbXCJCeXRlc1wiLCBcIktCXCIsIFwiTUJcIiwgXCJHQlwiLCBcIlRCXCJdO1xuICAgIHZhciBmaXhlZCA9IFswLCAwLCAyLCAzLCAzXTtcbiAgICBpZiAodGhpcy5tYXhTaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gXCIwIEJ5dGVcIjtcbiAgICB9XG4gICAgdmFyIGkgPSBNYXRoLmZsb29yKE1hdGgubG9nKHRoaXMubWF4U2l6ZSkgLyBNYXRoLmxvZygxMDI0KSk7XG4gICAgdmFyIHZhbHVlID0gdGhpcy5tYXhTaXplIC8gTWF0aC5wb3coMTAyNCwgaSk7XG4gICAgcmV0dXJuIHZhbHVlLnRvRml4ZWQoZml4ZWRbaV0pICsgXCIgXCIgKyBzaXplc1tpXTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIFdlYlJlcXVlc3RFcnJvciBleHRlbmRzIFN1cnZleUVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHN0YXR1czogc3RyaW5nLFxuICAgIHB1YmxpYyByZXNwb25zZTogc3RyaW5nLFxuICAgIGVycm9yT3duZXI6IElTdXJ2ZXlFcnJvck93bmVyID0gbnVsbFxuICApIHtcbiAgICBzdXBlcihudWxsLCBlcnJvck93bmVyKTtcbiAgfVxuICBwdWJsaWMgZ2V0RXJyb3JUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwid2VicmVxdWVzdFwiO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb25cbiAgICAgIC5nZXRTdHJpbmcoXCJ1cmxSZXF1ZXN0RXJyb3JcIilcbiAgICAgIFtcImZvcm1hdFwiXSh0aGlzLnN0YXR1cywgdGhpcy5yZXNwb25zZSk7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBXZWJSZXF1ZXN0RW1wdHlFcnJvciBleHRlbmRzIFN1cnZleUVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHRleHQ6IHN0cmluZywgZXJyb3JPd25lcjogSVN1cnZleUVycm9yT3duZXIgPSBudWxsKSB7XG4gICAgc3VwZXIodGV4dCwgZXJyb3JPd25lcik7XG4gIH1cbiAgcHVibGljIGdldEVycm9yVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIndlYnJlcXVlc3RlbXB0eVwiO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwidXJsR2V0Q2hvaWNlc0Vycm9yXCIpO1xuICB9XG59XG5leHBvcnQgY2xhc3MgT3RoZXJFbXB0eUVycm9yIGV4dGVuZHMgU3VydmV5RXJyb3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdGV4dDogc3RyaW5nLCBlcnJvck93bmVyOiBJU3VydmV5RXJyb3JPd25lciA9IG51bGwpIHtcbiAgICBzdXBlcih0ZXh0LCBlcnJvck93bmVyKTtcbiAgfVxuICBwdWJsaWMgZ2V0RXJyb3JUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwib3RoZXJlbXB0eVwiO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwib3RoZXJSZXF1aXJlZEVycm9yXCIpO1xuICB9XG59XG5leHBvcnQgY2xhc3MgVXBsb2FkaW5nRmlsZUVycm9yIGV4dGVuZHMgU3VydmV5RXJyb3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdGV4dDogc3RyaW5nLCBlcnJvck93bmVyOiBJU3VydmV5RXJyb3JPd25lciA9IG51bGwpIHtcbiAgICBzdXBlcih0ZXh0LCBlcnJvck93bmVyKTtcbiAgfVxuICBwdWJsaWMgZ2V0RXJyb3JUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwidXBsb2FkaW5nZmlsZVwiO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwidXBsb2FkaW5nRmlsZVwiKTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIFJlcXVpcmVkSW5BbGxSb3dzRXJyb3IgZXh0ZW5kcyBTdXJ2ZXlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZXh0OiBzdHJpbmcsIGVycm9yT3duZXI6IElTdXJ2ZXlFcnJvck93bmVyID0gbnVsbCkge1xuICAgIHN1cGVyKHRleHQsIGVycm9yT3duZXIpO1xuICB9XG4gIHB1YmxpYyBnZXRFcnJvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJyZXF1aXJlZGluYWxscm93c2Vycm9yXCI7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJyZXF1aXJlZEluQWxsUm93c0Vycm9yXCIpO1xuICB9XG59XG5leHBvcnQgY2xhc3MgTWluUm93Q291bnRFcnJvciBleHRlbmRzIFN1cnZleUVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG1pblJvd0NvdW50OiBudW1iZXIsXG4gICAgZXJyb3JPd25lcjogSVN1cnZleUVycm9yT3duZXIgPSBudWxsXG4gICkge1xuICAgIHN1cGVyKG51bGwsIGVycm9yT3duZXIpO1xuICB9XG4gIHB1YmxpYyBnZXRFcnJvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJtaW5yb3djb3VudGVycm9yXCI7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgLmdldFN0cmluZyhcIm1pblJvd0NvdW50RXJyb3JcIilcbiAgICAgIFtcImZvcm1hdFwiXSh0aGlzLm1pblJvd0NvdW50KTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIEtleUR1cGxpY2F0aW9uRXJyb3IgZXh0ZW5kcyBTdXJ2ZXlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZXh0OiBzdHJpbmcsIGVycm9yT3duZXI6IElTdXJ2ZXlFcnJvck93bmVyID0gbnVsbCkge1xuICAgIHN1cGVyKHRleHQsIGVycm9yT3duZXIpO1xuICB9XG4gIHB1YmxpYyBnZXRFcnJvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJrZXlkdXBsaWNhdGlvbmVycm9yXCI7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIpO1xuICB9XG59XG5leHBvcnQgY2xhc3MgQ3VzdG9tRXJyb3IgZXh0ZW5kcyBTdXJ2ZXlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZXh0OiBzdHJpbmcsIGVycm9yT3duZXI6IElTdXJ2ZXlFcnJvck93bmVyID0gbnVsbCkge1xuICAgIHN1cGVyKHRleHQsIGVycm9yT3duZXIpO1xuICB9XG4gIHB1YmxpYyBnZXRFcnJvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJjdXN0b21cIjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBJTG9jYWxpemFibGVPd25lciwgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgQ29uZGl0aW9uUnVubmVyIH0gZnJvbSBcIi4vY29uZGl0aW9uc1wiO1xuXG5leHBvcnQgY2xhc3MgRXhwcmVzc2lvbkl0ZW0gZXh0ZW5kcyBCYXNlIGltcGxlbWVudHMgSUxvY2FsaXphYmxlT3duZXIge1xuICBwdWJsaWMgbG9jT3duZXI6IElMb2NhbGl6YWJsZU93bmVyO1xuICBjb25zdHJ1Y3RvcihleHByZXNzaW9uOiBzdHJpbmcgPSBudWxsKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwiaHRtbFwiLCB0aGlzKTtcbiAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZXhwcmVzc2lvbml0ZW1cIjtcbiAgfVxuICBwdWJsaWMgcnVuQ29uZGl0aW9uKHZhbHVlczogYW55LCBwcm9wZXJ0aWVzOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZXhwcmVzc2lvbikgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBuZXcgQ29uZGl0aW9uUnVubmVyKHRoaXMuZXhwcmVzc2lvbikucnVuKHZhbHVlcywgcHJvcGVydGllcyk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBleHByZXNzaW9uIHByb3BlcnR5LiBJZiB0aGlzIGV4cHJlc3Npb24gcmV0dXJucyB0cnVlLCB0aGVuIHN1cnZleSB3aWxsIHVzZSBodG1sIHByb3BlcnR5IHRvIHNob3cgb24gY29tcGxldGUgcGFnZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgZXhwcmVzc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJleHByZXNzaW9uXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZXhwcmVzc2lvbih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImV4cHJlc3Npb25cIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jSHRtbCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJodG1sXCIpO1xuICB9XG5cbiAgcHVibGljIGdldExvY2FsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAhIXRoaXMubG9jT3duZXIgPyB0aGlzLmxvY093bmVyLmdldExvY2FsZSgpIDogXCJcIjtcbiAgfVxuICBwdWJsaWMgZ2V0TWFya2Rvd25IdG1sKHRleHQ6IHN0cmluZywgbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gISF0aGlzLmxvY093bmVyID8gdGhpcy5sb2NPd25lci5nZXRNYXJrZG93bkh0bWwodGV4dCwgbmFtZSkgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXRSZW5kZXJlcihuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAhIXRoaXMubG9jT3duZXIgPyB0aGlzLmxvY093bmVyLmdldFJlbmRlcmVyKG5hbWUpIDogbnVsbDtcbiAgfVxuICBwdWJsaWMgZ2V0UmVuZGVyZXJDb250ZXh0KGxvY1N0cjogTG9jYWxpemFibGVTdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiAhIXRoaXMubG9jT3duZXIgPyB0aGlzLmxvY093bmVyLmdldFJlbmRlcmVyQ29udGV4dChsb2NTdHIpIDogbG9jU3RyO1xuICB9XG4gIHB1YmxpYyBnZXRQcm9jZXNzZWRUZXh0KHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubG9jT3duZXIgPyB0aGlzLmxvY093bmVyLmdldFByb2Nlc3NlZFRleHQodGV4dCkgOiB0ZXh0O1xuICB9XG59XG5cbi8qKlxuICogQSBjbGFzcyB0aGF0IGNvbnRhaW5zIGV4cHJlc3Npb24gYW5kIGh0bWwgcHJvcGV0aWVzLiBJdCB1c2VzIGluIHN1cnZleS5jb21wbGV0ZWRIdG1sT25Db25kaXRpb24gYXJyYXkuXG4gKiBJZiB0aGUgZXhwcmVzc2lvbiByZXR1cm5zIHRydWUgdGhlbiBodG1sIG9mIHRoaXMgaXRlbSB1c2VzIGluc3RlYWQgb2Ygc3VydmV5LmNvbXBsZXRlZEh0bWwgcHJvcGVydHlcbiAqIEBzZWUgU3VydmV5TW9kZWwuY29tcGxldGVkSHRtbE9uQ29uZGl0aW9uXG4gKiBAc2VlIFN1cnZleU1vZGVsLmNvbXBsZXRlZEh0bWxcbiAqL1xuZXhwb3J0IGNsYXNzIEh0bWxDb25kaXRpb25JdGVtIGV4dGVuZHMgRXhwcmVzc2lvbkl0ZW0ge1xuICBjb25zdHJ1Y3RvcihleHByZXNzaW9uOiBzdHJpbmcgPSBudWxsLCBodG1sOiBzdHJpbmcgPSBudWxsKSB7XG4gICAgc3VwZXIoZXhwcmVzc2lvbik7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImh0bWxcIiwgdGhpcyk7XG4gICAgdGhpcy5odG1sID0gaHRtbDtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImh0bWxjb25kaXRpb25pdGVtXCI7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBodG1sIHRoYXQgc2hvd3Mgb24gY29tcGxldGVkICgnVGhhbmsgeW91JykgcGFnZS4gVGhlIGV4cHJlc3Npb24gc2hvdWxkIHJldHVybiB0cnVlXG4gICAqIEBzZWUgZXhwcmVzc2lvblxuICAgKi9cbiAgcHVibGljIGdldCBodG1sKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiaHRtbFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGh0bWwodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiaHRtbFwiLCB2YWx1ZSk7XG4gIH1cbiAgZ2V0IGxvY0h0bWwoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiaHRtbFwiKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgY2xhc3MgdGhhdCBjb250YWlucyBleHByZXNzaW9uIGFuZCB1cmwgcHJvcGV0aWVzLiBJdCB1c2VzIGluIHN1cnZleS5uYXZpZ2F0ZVRvVXJsT25Db25kaXRpb24gYXJyYXkuXG4gKiBJZiB0aGUgZXhwcmVzc2lvbiByZXR1cm5zIHRydWUgdGhlbiB1cmwgb2YgdGhpcyBpdGVtIHVzZXMgaW5zdGVhZCBvZiBzdXJ2ZXkubmF2aWdhdGVUb1VybCBwcm9wZXJ0eVxuICogQHNlZSBTdXJ2ZXlNb2RlbC5uYXZpZ2F0ZVRvVXJsXG4gKi9cbmV4cG9ydCBjbGFzcyBVcmxDb25kaXRpb25JdGVtIGV4dGVuZHMgRXhwcmVzc2lvbkl0ZW0ge1xuICBjb25zdHJ1Y3RvcihleHByZXNzaW9uOiBzdHJpbmcgPSBudWxsLCB1cmw6IHN0cmluZyA9IG51bGwpIHtcbiAgICBzdXBlcihleHByZXNzaW9uKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwidXJsXCIsIHRoaXMpO1xuICAgIHRoaXMudXJsID0gdXJsO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwidXJsY29uZGl0aW9uaXRlbVwiO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgdXJsIHRoYXQgc3VydmV5IG5hdmlnYXRlcyB0byBvbiBjb21wbGV0aW5nIHRoZSBzdXJ2ZXkuIFRoZSBleHByZXNzaW9uIHNob3VsZCByZXR1cm4gdHJ1ZVxuICAgKiBAc2VlIGV4cHJlc3Npb25cbiAgICovXG4gIHB1YmxpYyBnZXQgdXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidXJsXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdXJsKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInVybFwiLCB2YWx1ZSk7XG4gIH1cbiAgZ2V0IGxvY1VybCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJ1cmxcIik7XG4gIH1cbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJleHByZXNzaW9uaXRlbVwiLFxuICBbXCJleHByZXNzaW9uOmNvbmRpdGlvblwiXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSXRlbSgpO1xuICB9LFxuICBcImJhc2VcIlxuKTtcblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJodG1sY29uZGl0aW9uaXRlbVwiLFxuICBbeyBuYW1lOiBcImh0bWw6aHRtbFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jSHRtbFwiIH1dLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IEh0bWxDb25kaXRpb25JdGVtKCk7XG4gIH0sXG4gIFwiZXhwcmVzc2lvbml0ZW1cIlxuKTtcblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJ1cmxjb25kaXRpb25pdGVtXCIsXG4gIFt7IG5hbWU6IFwidXJsOnN0cmluZ1wiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jVXJsXCIgfV0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgVXJsQ29uZGl0aW9uSXRlbSgpO1xuICB9LFxuICBcImV4cHJlc3Npb25pdGVtXCJcbik7XG4iLCJpbXBvcnQge1xuICBDb25zdCxcbiAgQmluYXJ5T3BlcmFuZCxcbiAgVmFyaWFibGUsXG4gIE9wZXJhbmQsXG4gIFVuYXJ5T3BlcmFuZCxcbiAgRnVuY3Rpb25PcGVyYW5kLFxuICBBcnJheU9wZXJhbmRcbn0gZnJvbSBcIi4vZXhwcmVzc2lvbnNcIjtcblxuLy8gR2VuZXJhdGVkIGJ5IFBFRy5qcyB2LiAwLjEwLjAgKHRzLXBlZ2pzIHBsdWdpbiB2LiAwLjMuMSApXG4vL1xuLy8gaHR0cHM6Ly9wZWdqcy5vcmcvICAgaHR0cHM6Ly9naXRodWIuY29tL21ldGFkZXZwcm8vdHMtcGVnanNcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUZpbGVQb3NpdGlvbiB7XG4gIG9mZnNldDogbnVtYmVyO1xuICBsaW5lOiBudW1iZXI7XG4gIGNvbHVtbjogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElGaWxlUmFuZ2Uge1xuICBzdGFydDogSUZpbGVQb3NpdGlvbjtcbiAgZW5kOiBJRmlsZVBvc2l0aW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElMaXRlcmFsRXhwZWN0YXRpb24ge1xuICB0eXBlOiBcImxpdGVyYWxcIjtcbiAgdGV4dDogc3RyaW5nO1xuICBpZ25vcmVDYXNlOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDbGFzc1BhcnRzIGV4dGVuZHMgQXJyYXk8c3RyaW5nIHwgSUNsYXNzUGFydHM+IHt9XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNsYXNzRXhwZWN0YXRpb24ge1xuICB0eXBlOiBcImNsYXNzXCI7XG4gIHBhcnRzOiBJQ2xhc3NQYXJ0cztcbiAgaW52ZXJ0ZWQ6IGJvb2xlYW47XG4gIGlnbm9yZUNhc2U6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFueUV4cGVjdGF0aW9uIHtcbiAgdHlwZTogXCJhbnlcIjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRW5kRXhwZWN0YXRpb24ge1xuICB0eXBlOiBcImVuZFwiO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElPdGhlckV4cGVjdGF0aW9uIHtcbiAgdHlwZTogXCJvdGhlclwiO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBFeHBlY3RhdGlvbiA9IElMaXRlcmFsRXhwZWN0YXRpb24gfCBJQ2xhc3NFeHBlY3RhdGlvbiB8IElBbnlFeHBlY3RhdGlvbiB8IElFbmRFeHBlY3RhdGlvbiB8IElPdGhlckV4cGVjdGF0aW9uO1xuXG5leHBvcnQgY2xhc3MgU3ludGF4RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHB1YmxpYyBzdGF0aWMgYnVpbGRNZXNzYWdlKGV4cGVjdGVkOiBFeHBlY3RhdGlvbltdLCBmb3VuZDogc3RyaW5nIHwgbnVsbCkge1xuICAgIGZ1bmN0aW9uIGhleChjaDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBjaC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpdGVyYWxFc2NhcGUoczogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBzXG4gICAgICAgIC5yZXBsYWNlKC9cXFxcL2csIFwiXFxcXFxcXFxcIilcbiAgICAgICAgLnJlcGxhY2UoL1wiL2csIFwiXFxcXFxcXCJcIilcbiAgICAgICAgLnJlcGxhY2UoL1xcMC9nLCBcIlxcXFwwXCIpXG4gICAgICAgIC5yZXBsYWNlKC9cXHQvZywgXCJcXFxcdFwiKVxuICAgICAgICAucmVwbGFjZSgvXFxuL2csIFwiXFxcXG5cIilcbiAgICAgICAgLnJlcGxhY2UoL1xcci9nLCBcIlxcXFxyXCIpXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4XG4gICAgICAgIC5yZXBsYWNlKC9bXFx4MDAtXFx4MEZdL2csIChjaCkgPT4gXCJcXFxceDBcIiArIGhleChjaCkpXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4XG4gICAgICAgIC5yZXBsYWNlKC9bXFx4MTAtXFx4MUZcXHg3Ri1cXHg5Rl0vZywgKGNoKSA9PiBcIlxcXFx4XCIgKyBoZXgoY2gpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGFzc0VzY2FwZShzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHNcbiAgICAgICAgLnJlcGxhY2UoL1xcXFwvZywgXCJcXFxcXFxcXFwiKVxuICAgICAgICAucmVwbGFjZSgvXFxdL2csIFwiXFxcXF1cIilcbiAgICAgICAgLnJlcGxhY2UoL1xcXi9nLCBcIlxcXFxeXCIpXG4gICAgICAgIC5yZXBsYWNlKC8tL2csIFwiXFxcXC1cIilcbiAgICAgICAgLnJlcGxhY2UoL1xcMC9nLCBcIlxcXFwwXCIpXG4gICAgICAgIC5yZXBsYWNlKC9cXHQvZywgXCJcXFxcdFwiKVxuICAgICAgICAucmVwbGFjZSgvXFxuL2csIFwiXFxcXG5cIilcbiAgICAgICAgLnJlcGxhY2UoL1xcci9nLCBcIlxcXFxyXCIpXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4XG4gICAgICAgIC5yZXBsYWNlKC9bXFx4MDAtXFx4MEZdL2csIChjaCkgPT4gXCJcXFxceDBcIiArIGhleChjaCkpXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4XG4gICAgICAgIC5yZXBsYWNlKC9bXFx4MTAtXFx4MUZcXHg3Ri1cXHg5Rl0vZywgKGNoKSA9PiBcIlxcXFx4XCIgKyBoZXgoY2gpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZXNjcmliZUV4cGVjdGF0aW9uKGV4cGVjdGF0aW9uOiBFeHBlY3RhdGlvbikge1xuICAgICAgc3dpdGNoIChleHBlY3RhdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgXCJsaXRlcmFsXCI6XG4gICAgICAgICAgcmV0dXJuIFwiXFxcIlwiICsgbGl0ZXJhbEVzY2FwZShleHBlY3RhdGlvbi50ZXh0KSArIFwiXFxcIlwiO1xuICAgICAgICBjYXNlIFwiY2xhc3NcIjpcbiAgICAgICAgICBjb25zdCBlc2NhcGVkUGFydHMgPSBleHBlY3RhdGlvbi5wYXJ0cy5tYXAoKHBhcnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHBhcnQpXG4gICAgICAgICAgICAgID8gY2xhc3NFc2NhcGUocGFydFswXSBhcyBzdHJpbmcpICsgXCItXCIgKyBjbGFzc0VzY2FwZShwYXJ0WzFdIGFzIHN0cmluZylcbiAgICAgICAgICAgICAgOiBjbGFzc0VzY2FwZShwYXJ0KTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiBcIltcIiArIChleHBlY3RhdGlvbi5pbnZlcnRlZCA/IFwiXlwiIDogXCJcIikgKyBlc2NhcGVkUGFydHMgKyBcIl1cIjtcbiAgICAgICAgY2FzZSBcImFueVwiOlxuICAgICAgICAgIHJldHVybiBcImFueSBjaGFyYWN0ZXJcIjtcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBcImVuZCBvZiBpbnB1dFwiO1xuICAgICAgICBjYXNlIFwib3RoZXJcIjpcbiAgICAgICAgICByZXR1cm4gZXhwZWN0YXRpb24uZGVzY3JpcHRpb247XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVzY3JpYmVFeHBlY3RlZChleHBlY3RlZDE6IEV4cGVjdGF0aW9uW10pIHtcbiAgICAgIGNvbnN0IGRlc2NyaXB0aW9ucyA9IGV4cGVjdGVkMS5tYXAoZGVzY3JpYmVFeHBlY3RhdGlvbik7XG4gICAgICBsZXQgaTogbnVtYmVyO1xuICAgICAgbGV0IGo6IG51bWJlcjtcblxuICAgICAgZGVzY3JpcHRpb25zLnNvcnQoKTtcblxuICAgICAgaWYgKGRlc2NyaXB0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAoaSA9IDEsIGogPSAxOyBpIDwgZGVzY3JpcHRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGRlc2NyaXB0aW9uc1tpIC0gMV0gIT09IGRlc2NyaXB0aW9uc1tpXSkge1xuICAgICAgICAgICAgZGVzY3JpcHRpb25zW2pdID0gZGVzY3JpcHRpb25zW2ldO1xuICAgICAgICAgICAgaisrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkZXNjcmlwdGlvbnMubGVuZ3RoID0gajtcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChkZXNjcmlwdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICByZXR1cm4gZGVzY3JpcHRpb25zWzBdO1xuXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICByZXR1cm4gZGVzY3JpcHRpb25zWzBdICsgXCIgb3IgXCIgKyBkZXNjcmlwdGlvbnNbMV07XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gZGVzY3JpcHRpb25zLnNsaWNlKDAsIC0xKS5qb2luKFwiLCBcIilcbiAgICAgICAgICAgICsgXCIsIG9yIFwiXG4gICAgICAgICAgICArIGRlc2NyaXB0aW9uc1tkZXNjcmlwdGlvbnMubGVuZ3RoIC0gMV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVzY3JpYmVGb3VuZChmb3VuZDE6IHN0cmluZyB8IG51bGwpIHtcbiAgICAgIHJldHVybiBmb3VuZDEgPyBcIlxcXCJcIiArIGxpdGVyYWxFc2NhcGUoZm91bmQxKSArIFwiXFxcIlwiIDogXCJlbmQgb2YgaW5wdXRcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gXCJFeHBlY3RlZCBcIiArIGRlc2NyaWJlRXhwZWN0ZWQoZXhwZWN0ZWQpICsgXCIgYnV0IFwiICsgZGVzY3JpYmVGb3VuZChmb3VuZCkgKyBcIiBmb3VuZC5cIjtcbiAgfVxuXG4gIHB1YmxpYyBtZXNzYWdlOiBzdHJpbmc7XG4gIHB1YmxpYyBleHBlY3RlZDogRXhwZWN0YXRpb25bXTtcbiAgcHVibGljIGZvdW5kOiBzdHJpbmcgfCBudWxsO1xuICBwdWJsaWMgbG9jYXRpb246IElGaWxlUmFuZ2U7XG4gIHB1YmxpYyBuYW1lOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBleHBlY3RlZDogRXhwZWN0YXRpb25bXSwgZm91bmQ6IHN0cmluZyB8IG51bGwsIGxvY2F0aW9uOiBJRmlsZVJhbmdlKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHRoaXMuZXhwZWN0ZWQgPSBleHBlY3RlZDtcbiAgICB0aGlzLmZvdW5kID0gZm91bmQ7XG4gICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uO1xuICAgIHRoaXMubmFtZSA9IFwiU3ludGF4RXJyb3JcIjtcblxuICAgIGlmICh0eXBlb2YgKEVycm9yIGFzIGFueSkuY2FwdHVyZVN0YWNrVHJhY2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgKEVycm9yIGFzIGFueSkuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgU3ludGF4RXJyb3IpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDYWNoZWQge1xuICBuZXh0UG9zOiBudW1iZXI7XG4gIHJlc3VsdDogYW55O1xufVxuXG5mdW5jdGlvbiBwZWckcGFyc2UoaW5wdXQ6IHN0cmluZywgb3B0aW9ucz86IElQYXJzZU9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMgOiB7fTtcblxuICBjb25zdCBwZWckRkFJTEVEOiBSZWFkb25seTxhbnk+ID0ge307XG5cbiAgY29uc3QgcGVnJHN0YXJ0UnVsZUZ1bmN0aW9uczoge1tpZDogc3RyaW5nXTogYW55fSA9IHsgRXhwcmVzc2lvbjogcGVnJHBhcnNlRXhwcmVzc2lvbiB9O1xuICBsZXQgcGVnJHN0YXJ0UnVsZUZ1bmN0aW9uOiAoKSA9PiBhbnkgPSBwZWckcGFyc2VFeHByZXNzaW9uO1xuXG4gIGNvbnN0IHBlZyRjMCA9IGZ1bmN0aW9uKGhlYWQ6IGFueSwgdGFpbDogYW55KTogYW55IHtcbiAgICByZXR1cm4gYnVpbGRCaW5hcnlPcGVyYW5kKGhlYWQsIHRhaWwsIHRydWUpO1xuICB9O1xuICBjb25zdCBwZWckYzEgPSBcInx8XCI7XG4gIGNvbnN0IHBlZyRjMiA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJ8fFwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMyA9IFwib3JcIjtcbiAgY29uc3QgcGVnJGM0ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIm9yXCIsIHRydWUpO1xuICBjb25zdCBwZWckYzUgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gXCJvclwiOyB9O1xuICBjb25zdCBwZWckYzYgPSBcIiYmXCI7XG4gIGNvbnN0IHBlZyRjNyA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCImJlwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjOCA9IFwiYW5kXCI7XG4gIGNvbnN0IHBlZyRjOSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJhbmRcIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjMTAgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gXCJhbmRcIjsgfTtcbiAgY29uc3QgcGVnJGMxMSA9IGZ1bmN0aW9uKGhlYWQ6IGFueSwgdGFpbDogYW55KTogYW55IHtcbiAgICByZXR1cm4gYnVpbGRCaW5hcnlPcGVyYW5kKGhlYWQsIHRhaWwpO1xuICB9O1xuICBjb25zdCBwZWckYzEyID0gXCI8PVwiO1xuICBjb25zdCBwZWckYzEzID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIjw9XCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxNCA9IFwibGVzc29yZXF1YWxcIjtcbiAgY29uc3QgcGVnJGMxNSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJsZXNzb3JlcXVhbFwiLCB0cnVlKTtcbiAgY29uc3QgcGVnJGMxNiA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBcImxlc3NvcmVxdWFsXCI7IH07XG4gIGNvbnN0IHBlZyRjMTcgPSBcIj49XCI7XG4gIGNvbnN0IHBlZyRjMTggPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiPj1cIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzE5ID0gXCJncmVhdGVyb3JlcXVhbFwiO1xuICBjb25zdCBwZWckYzIwID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcImdyZWF0ZXJvcmVxdWFsXCIsIHRydWUpO1xuICBjb25zdCBwZWckYzIxID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIFwiZ3JlYXRlcm9yZXF1YWxcIjsgfTtcbiAgY29uc3QgcGVnJGMyMiA9IFwiPVwiO1xuICBjb25zdCBwZWckYzIzID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIj1cIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzI0ID0gXCJlcXVhbFwiO1xuICBjb25zdCBwZWckYzI1ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcImVxdWFsXCIsIHRydWUpO1xuICBjb25zdCBwZWckYzI2ID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIFwiZXF1YWxcIjsgfTtcbiAgY29uc3QgcGVnJGMyNyA9IFwiIT1cIjtcbiAgY29uc3QgcGVnJGMyOCA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCIhPVwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMjkgPSBcIm5vdGVxdWFsXCI7XG4gIGNvbnN0IHBlZyRjMzAgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwibm90ZXF1YWxcIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjMzEgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gXCJub3RlcXVhbFwiOyB9O1xuICBjb25zdCBwZWckYzMyID0gXCI8XCI7XG4gIGNvbnN0IHBlZyRjMzMgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiPFwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMzQgPSBcImxlc3NcIjtcbiAgY29uc3QgcGVnJGMzNSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJsZXNzXCIsIHRydWUpO1xuICBjb25zdCBwZWckYzM2ID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIFwibGVzc1wiOyB9O1xuICBjb25zdCBwZWckYzM3ID0gXCI+XCI7XG4gIGNvbnN0IHBlZyRjMzggPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiPlwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMzkgPSBcImdyZWF0ZXJcIjtcbiAgY29uc3QgcGVnJGM0MCA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJncmVhdGVyXCIsIHRydWUpO1xuICBjb25zdCBwZWckYzQxID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIFwiZ3JlYXRlclwiOyB9O1xuICBjb25zdCBwZWckYzQyID0gXCIrXCI7XG4gIGNvbnN0IHBlZyRjNDMgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiK1wiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjNDQgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gXCJwbHVzXCI7IH07XG4gIGNvbnN0IHBlZyRjNDUgPSBcIi1cIjtcbiAgY29uc3QgcGVnJGM0NiA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCItXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGM0NyA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBcIm1pbnVzXCI7IH07XG4gIGNvbnN0IHBlZyRjNDggPSBcIipcIjtcbiAgY29uc3QgcGVnJGM0OSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCIqXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGM1MCA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBcIm11bFwiOyB9O1xuICBjb25zdCBwZWckYzUxID0gXCIvXCI7XG4gIGNvbnN0IHBlZyRjNTIgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiL1wiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjNTMgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gXCJkaXZcIjsgfTtcbiAgY29uc3QgcGVnJGM1NCA9IFwiJVwiO1xuICBjb25zdCBwZWckYzU1ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIiVcIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzU2ID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIFwibW9kXCI7IH07XG4gIGNvbnN0IHBlZyRjNTcgPSBcIl5cIjtcbiAgY29uc3QgcGVnJGM1OCA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJeXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGM1OSA9IFwicG93ZXJcIjtcbiAgY29uc3QgcGVnJGM2MCA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJwb3dlclwiLCB0cnVlKTtcbiAgY29uc3QgcGVnJGM2MSA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBcInBvd2VyXCI7IH07XG4gIGNvbnN0IHBlZyRjNjIgPSBcIio9XCI7XG4gIGNvbnN0IHBlZyRjNjMgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiKj1cIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzY0ID0gXCJjb250YWluc1wiO1xuICBjb25zdCBwZWckYzY1ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcImNvbnRhaW5zXCIsIHRydWUpO1xuICBjb25zdCBwZWckYzY2ID0gXCJjb250YWluXCI7XG4gIGNvbnN0IHBlZyRjNjcgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiY29udGFpblwiLCB0cnVlKTtcbiAgY29uc3QgcGVnJGM2OCA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBcImNvbnRhaW5zXCI7IH07XG4gIGNvbnN0IHBlZyRjNjkgPSBcIm5vdGNvbnRhaW5zXCI7XG4gIGNvbnN0IHBlZyRjNzAgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwibm90Y29udGFpbnNcIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjNzEgPSBcIm5vdGNvbnRhaW5cIjtcbiAgY29uc3QgcGVnJGM3MiA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJub3Rjb250YWluXCIsIHRydWUpO1xuICBjb25zdCBwZWckYzczID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIFwibm90Y29udGFpbnNcIjsgfTtcbiAgY29uc3QgcGVnJGM3NCA9IFwiYW55b2ZcIjtcbiAgY29uc3QgcGVnJGM3NSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJhbnlvZlwiLCB0cnVlKTtcbiAgY29uc3QgcGVnJGM3NiA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBcImFueW9mXCI7IH07XG4gIGNvbnN0IHBlZyRjNzcgPSBcImFsbG9mXCI7XG4gIGNvbnN0IHBlZyRjNzggPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiYWxsb2ZcIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjNzkgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gXCJhbGxvZlwiOyB9O1xuICBjb25zdCBwZWckYzgwID0gXCIoXCI7XG4gIGNvbnN0IHBlZyRjODEgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiKFwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjODIgPSBcIilcIjtcbiAgY29uc3QgcGVnJGM4MyA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCIpXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGM4NCA9IGZ1bmN0aW9uKGV4cHI6IGFueSk6IGFueSB7IHJldHVybiBleHByOyB9O1xuICBjb25zdCBwZWckYzg1ID0gZnVuY3Rpb24obmFtZTogYW55LCBwYXJhbXM6IGFueSk6IGFueSB7IHJldHVybiBuZXcgRnVuY3Rpb25PcGVyYW5kKG5hbWUsIHBhcmFtcyk7IH07XG4gIGNvbnN0IHBlZyRjODYgPSBcIiFcIjtcbiAgY29uc3QgcGVnJGM4NyA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCIhXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGM4OCA9IFwibmVnYXRlXCI7XG4gIGNvbnN0IHBlZyRjODkgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwibmVnYXRlXCIsIHRydWUpO1xuICBjb25zdCBwZWckYzkwID0gZnVuY3Rpb24oZXhwcjogYW55KTogYW55IHsgcmV0dXJuIG5ldyBVbmFyeU9wZXJhbmQoZXhwciwgXCJuZWdhdGVcIik7IH07XG4gIGNvbnN0IHBlZyRjOTEgPSBmdW5jdGlvbihleHByOiBhbnksIG9wOiBhbnkpOiBhbnkgeyByZXR1cm4gbmV3IFVuYXJ5T3BlcmFuZChleHByLCBvcCk7IH07XG4gIGNvbnN0IHBlZyRjOTIgPSBcImVtcHR5XCI7XG4gIGNvbnN0IHBlZyRjOTMgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiZW1wdHlcIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjOTQgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gXCJlbXB0eVwiOyB9O1xuICBjb25zdCBwZWckYzk1ID0gXCJub3RlbXB0eVwiO1xuICBjb25zdCBwZWckYzk2ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIm5vdGVtcHR5XCIsIHRydWUpO1xuICBjb25zdCBwZWckYzk3ID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIFwibm90ZW1wdHlcIjsgfTtcbiAgY29uc3QgcGVnJGM5OCA9IFwidW5kZWZpbmVkXCI7XG4gIGNvbnN0IHBlZyRjOTkgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwidW5kZWZpbmVkXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxMDAgPSBcIm51bGxcIjtcbiAgY29uc3QgcGVnJGMxMDEgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwibnVsbFwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMTAyID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIG51bGw7IH07XG4gIGNvbnN0IHBlZyRjMTAzID0gZnVuY3Rpb24odmFsdWU6IGFueSk6IGFueSB7IHJldHVybiBuZXcgQ29uc3QodmFsdWUpOyB9O1xuICBjb25zdCBwZWckYzEwNCA9IFwie1wiO1xuICBjb25zdCBwZWckYzEwNSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJ7XCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxMDYgPSBcIn1cIjtcbiAgY29uc3QgcGVnJGMxMDcgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwifVwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMTA4ID0gZnVuY3Rpb24odmFsdWU6IGFueSk6IGFueSB7IHJldHVybiBuZXcgVmFyaWFibGUodmFsdWUpOyB9O1xuICBjb25zdCBwZWckYzEwOSA9IGZ1bmN0aW9uKHZhbHVlOiBhbnkpOiBhbnkgeyByZXR1cm4gdmFsdWU7IH07XG4gIGNvbnN0IHBlZyRjMTEwID0gXCInJ1wiO1xuICBjb25zdCBwZWckYzExMSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCInJ1wiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMTEyID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIFwiXCI7IH07XG4gIGNvbnN0IHBlZyRjMTEzID0gXCJcXFwiXFxcIlwiO1xuICBjb25zdCBwZWckYzExNCA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJcXFwiXFxcIlwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMTE1ID0gXCInXCI7XG4gIGNvbnN0IHBlZyRjMTE2ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIidcIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzExNyA9IGZ1bmN0aW9uKHZhbHVlOiBhbnkpOiBhbnkgeyByZXR1cm4gXCInXCIgKyB2YWx1ZSArIFwiJ1wiOyB9O1xuICBjb25zdCBwZWckYzExOCA9IFwiXFxcIlwiO1xuICBjb25zdCBwZWckYzExOSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJcXFwiXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxMjAgPSBcIltcIjtcbiAgY29uc3QgcGVnJGMxMjEgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiW1wiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMTIyID0gXCJdXCI7XG4gIGNvbnN0IHBlZyRjMTIzID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIl1cIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzEyNCA9IGZ1bmN0aW9uKHNlcXVlbmNlOiBhbnkpOiBhbnkgeyByZXR1cm4gc2VxdWVuY2U7IH07XG4gIGNvbnN0IHBlZyRjMTI1ID0gXCIsXCI7XG4gIGNvbnN0IHBlZyRjMTI2ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIixcIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzEyNyA9IGZ1bmN0aW9uKGV4cHI6IGFueSwgdGFpbDogYW55KTogYW55IHtcbiAgICBpZiAoZXhwciA9PSBudWxsKVxuICAgICAgcmV0dXJuIG5ldyBBcnJheU9wZXJhbmQoW10pO1xuXG4gICAgdmFyIGFycmF5ID0gW2V4cHJdO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHRhaWwpKSB7XG4gICAgICB2YXIgZmxhdHRlbiA9IGZsYXR0ZW5BcnJheSh0YWlsKTtcbiAgICAgIGZvciAodmFyIGkgPSAzOyBpIDwgZmxhdHRlbi5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgICBhcnJheS5wdXNoKGZsYXR0ZW5baV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgQXJyYXlPcGVyYW5kKGFycmF5KTtcbiAgfTtcbiAgY29uc3QgcGVnJGMxMjggPSBcInRydWVcIjtcbiAgY29uc3QgcGVnJGMxMjkgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwidHJ1ZVwiLCB0cnVlKTtcbiAgY29uc3QgcGVnJGMxMzAgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gdHJ1ZTsgfTtcbiAgY29uc3QgcGVnJGMxMzEgPSBcImZhbHNlXCI7XG4gIGNvbnN0IHBlZyRjMTMyID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcImZhbHNlXCIsIHRydWUpO1xuICBjb25zdCBwZWckYzEzMyA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBmYWxzZTsgfTtcbiAgY29uc3QgcGVnJGMxMzQgPSBcIjB4XCI7XG4gIGNvbnN0IHBlZyRjMTM1ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIjB4XCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxMzYgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gcGFyc2VJbnQodGV4dCgpLCAxNik7IH07XG4gIGNvbnN0IHBlZyRjMTM3ID0gL15bXFwtXS87XG4gIGNvbnN0IHBlZyRjMTM4ID0gcGVnJGNsYXNzRXhwZWN0YXRpb24oW1wiLVwiXSwgZmFsc2UsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxMzkgPSBmdW5jdGlvbihzaWduOiBhbnksIG51bTogYW55KTogYW55IHsgcmV0dXJuIHNpZ24gPT0gbnVsbCA/IG51bSA6IC1udW07IH07XG4gIGNvbnN0IHBlZyRjMTQwID0gXCIuXCI7XG4gIGNvbnN0IHBlZyRjMTQxID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIi5cIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzE0MiA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBwYXJzZUZsb2F0KHRleHQoKSk7IH07XG4gIGNvbnN0IHBlZyRjMTQzID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIHBhcnNlSW50KHRleHQoKSwgMTApOyB9O1xuICBjb25zdCBwZWckYzE0NCA9IFwiMFwiO1xuICBjb25zdCBwZWckYzE0NSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCIwXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxNDYgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gMDsgfTtcbiAgY29uc3QgcGVnJGMxNDcgPSBmdW5jdGlvbihjaGFyczogYW55KTogYW55IHsgcmV0dXJuIGNoYXJzLmpvaW4oXCJcIik7IH07XG4gIGNvbnN0IHBlZyRjMTQ4ID0gXCJcXFxcJ1wiO1xuICBjb25zdCBwZWckYzE0OSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJcXFxcJ1wiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMTUwID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIFwiJ1wiOyB9O1xuICBjb25zdCBwZWckYzE1MSA9IFwiXFxcXFxcXCJcIjtcbiAgY29uc3QgcGVnJGMxNTIgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiXFxcXFxcXCJcIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzE1MyA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBcIlxcXCJcIjsgfTtcbiAgY29uc3QgcGVnJGMxNTQgPSAvXlteXCInXS87XG4gIGNvbnN0IHBlZyRjMTU1ID0gcGVnJGNsYXNzRXhwZWN0YXRpb24oW1wiXFxcIlwiLCBcIidcIl0sIHRydWUsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxNTYgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gdGV4dCgpOyB9O1xuICBjb25zdCBwZWckYzE1NyA9IC9eW157fV0vO1xuICBjb25zdCBwZWckYzE1OCA9IHBlZyRjbGFzc0V4cGVjdGF0aW9uKFtcIntcIiwgXCJ9XCJdLCB0cnVlLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMTU5ID0gL15bMC05XS87XG4gIGNvbnN0IHBlZyRjMTYwID0gcGVnJGNsYXNzRXhwZWN0YXRpb24oW1tcIjBcIiwgXCI5XCJdXSwgZmFsc2UsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxNjEgPSAvXlsxLTldLztcbiAgY29uc3QgcGVnJGMxNjIgPSBwZWckY2xhc3NFeHBlY3RhdGlvbihbW1wiMVwiLCBcIjlcIl1dLCBmYWxzZSwgZmFsc2UpO1xuICBjb25zdCBwZWckYzE2MyA9IC9eW2EtekEtWl0vO1xuICBjb25zdCBwZWckYzE2NCA9IHBlZyRjbGFzc0V4cGVjdGF0aW9uKFtbXCJhXCIsIFwielwiXSwgW1wiQVwiLCBcIlpcIl1dLCBmYWxzZSwgZmFsc2UpO1xuICBjb25zdCBwZWckYzE2NSA9IHBlZyRvdGhlckV4cGVjdGF0aW9uKFwid2hpdGVzcGFjZVwiKTtcbiAgY29uc3QgcGVnJGMxNjYgPSAvXlsgXFx0XFxuXFxyXS87XG4gIGNvbnN0IHBlZyRjMTY3ID0gcGVnJGNsYXNzRXhwZWN0YXRpb24oW1wiIFwiLCBcIlxcdFwiLCBcIlxcblwiLCBcIlxcclwiXSwgZmFsc2UsIGZhbHNlKTtcblxuICBsZXQgcGVnJGN1cnJQb3MgPSAwO1xuICBsZXQgcGVnJHNhdmVkUG9zID0gMDtcbiAgY29uc3QgcGVnJHBvc0RldGFpbHNDYWNoZSA9IFt7IGxpbmU6IDEsIGNvbHVtbjogMSB9XTtcbiAgbGV0IHBlZyRtYXhGYWlsUG9zID0gMDtcbiAgbGV0IHBlZyRtYXhGYWlsRXhwZWN0ZWQ6IEV4cGVjdGF0aW9uW10gPSBbXTtcbiAgbGV0IHBlZyRzaWxlbnRGYWlscyA9IDA7XG5cbiAgY29uc3QgcGVnJHJlc3VsdHNDYWNoZToge1tpZDogbnVtYmVyXTogSUNhY2hlZH0gPSB7fTtcblxuICBsZXQgcGVnJHJlc3VsdDtcblxuICBpZiAob3B0aW9ucy5zdGFydFJ1bGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICghKG9wdGlvbnMuc3RhcnRSdWxlIGluIHBlZyRzdGFydFJ1bGVGdW5jdGlvbnMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBzdGFydCBwYXJzaW5nIGZyb20gcnVsZSBcXFwiXCIgKyBvcHRpb25zLnN0YXJ0UnVsZSArIFwiXFxcIi5cIik7XG4gICAgfVxuXG4gICAgcGVnJHN0YXJ0UnVsZUZ1bmN0aW9uID0gcGVnJHN0YXJ0UnVsZUZ1bmN0aW9uc1tvcHRpb25zLnN0YXJ0UnVsZV07XG4gIH1cblxuICBmdW5jdGlvbiB0ZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGlucHV0LnN1YnN0cmluZyhwZWckc2F2ZWRQb3MsIHBlZyRjdXJyUG9zKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxvY2F0aW9uKCk6IElGaWxlUmFuZ2Uge1xuICAgIHJldHVybiBwZWckY29tcHV0ZUxvY2F0aW9uKHBlZyRzYXZlZFBvcywgcGVnJGN1cnJQb3MpO1xuICB9XG5cbiAgZnVuY3Rpb24gZXhwZWN0ZWQoZGVzY3JpcHRpb246IHN0cmluZywgbG9jYXRpb24xPzogSUZpbGVSYW5nZSkge1xuICAgIGxvY2F0aW9uMSA9IGxvY2F0aW9uMSAhPT0gdW5kZWZpbmVkXG4gICAgICA/IGxvY2F0aW9uMVxuICAgICAgOiBwZWckY29tcHV0ZUxvY2F0aW9uKHBlZyRzYXZlZFBvcywgcGVnJGN1cnJQb3MpO1xuXG4gICAgdGhyb3cgcGVnJGJ1aWxkU3RydWN0dXJlZEVycm9yKFxuICAgICAgW3BlZyRvdGhlckV4cGVjdGF0aW9uKGRlc2NyaXB0aW9uKV0sXG4gICAgICBpbnB1dC5zdWJzdHJpbmcocGVnJHNhdmVkUG9zLCBwZWckY3VyclBvcyksXG4gICAgICBsb2NhdGlvbjFcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gZXJyb3IobWVzc2FnZTogc3RyaW5nLCBsb2NhdGlvbjE/OiBJRmlsZVJhbmdlKSB7XG4gICAgbG9jYXRpb24xID0gbG9jYXRpb24xICE9PSB1bmRlZmluZWRcbiAgICAgID8gbG9jYXRpb24xXG4gICAgICA6IHBlZyRjb21wdXRlTG9jYXRpb24ocGVnJHNhdmVkUG9zLCBwZWckY3VyclBvcyk7XG5cbiAgICB0aHJvdyBwZWckYnVpbGRTaW1wbGVFcnJvcihtZXNzYWdlLCBsb2NhdGlvbjEpO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbih0ZXh0MTogc3RyaW5nLCBpZ25vcmVDYXNlOiBib29sZWFuKTogSUxpdGVyYWxFeHBlY3RhdGlvbiB7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJsaXRlcmFsXCIsIHRleHQ6IHRleHQxLCBpZ25vcmVDYXNlOiBpZ25vcmVDYXNlIH07XG4gIH1cblxuICBmdW5jdGlvbiBwZWckY2xhc3NFeHBlY3RhdGlvbihwYXJ0czogSUNsYXNzUGFydHMsIGludmVydGVkOiBib29sZWFuLCBpZ25vcmVDYXNlOiBib29sZWFuKTogSUNsYXNzRXhwZWN0YXRpb24ge1xuICAgIHJldHVybiB7IHR5cGU6IFwiY2xhc3NcIiwgcGFydHM6IHBhcnRzLCBpbnZlcnRlZDogaW52ZXJ0ZWQsIGlnbm9yZUNhc2U6IGlnbm9yZUNhc2UgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRhbnlFeHBlY3RhdGlvbigpOiBJQW55RXhwZWN0YXRpb24ge1xuICAgIHJldHVybiB7IHR5cGU6IFwiYW55XCIgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRlbmRFeHBlY3RhdGlvbigpOiBJRW5kRXhwZWN0YXRpb24ge1xuICAgIHJldHVybiB7IHR5cGU6IFwiZW5kXCIgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRvdGhlckV4cGVjdGF0aW9uKGRlc2NyaXB0aW9uOiBzdHJpbmcpOiBJT3RoZXJFeHBlY3RhdGlvbiB7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJvdGhlclwiLCBkZXNjcmlwdGlvbjogZGVzY3JpcHRpb24gfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRjb21wdXRlUG9zRGV0YWlscyhwb3M6IG51bWJlcikge1xuICAgIGxldCBkZXRhaWxzID0gcGVnJHBvc0RldGFpbHNDYWNoZVtwb3NdO1xuICAgIGxldCBwO1xuXG4gICAgaWYgKGRldGFpbHMpIHtcbiAgICAgIHJldHVybiBkZXRhaWxzO1xuICAgIH0gZWxzZSB7XG4gICAgICBwID0gcG9zIC0gMTtcbiAgICAgIHdoaWxlICghcGVnJHBvc0RldGFpbHNDYWNoZVtwXSkge1xuICAgICAgICBwLS07XG4gICAgICB9XG5cbiAgICAgIGRldGFpbHMgPSBwZWckcG9zRGV0YWlsc0NhY2hlW3BdO1xuICAgICAgZGV0YWlscyA9IHtcbiAgICAgICAgbGluZTogZGV0YWlscy5saW5lLFxuICAgICAgICBjb2x1bW46IGRldGFpbHMuY29sdW1uXG4gICAgICB9O1xuXG4gICAgICB3aGlsZSAocCA8IHBvcykge1xuICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwKSA9PT0gMTApIHtcbiAgICAgICAgICBkZXRhaWxzLmxpbmUrKztcbiAgICAgICAgICBkZXRhaWxzLmNvbHVtbiA9IDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGV0YWlscy5jb2x1bW4rKztcbiAgICAgICAgfVxuXG4gICAgICAgIHArKztcbiAgICAgIH1cblxuICAgICAgcGVnJHBvc0RldGFpbHNDYWNoZVtwb3NdID0gZGV0YWlscztcblxuICAgICAgcmV0dXJuIGRldGFpbHM7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcGVnJGNvbXB1dGVMb2NhdGlvbihzdGFydFBvczogbnVtYmVyLCBlbmRQb3M6IG51bWJlcik6IElGaWxlUmFuZ2Uge1xuICAgIGNvbnN0IHN0YXJ0UG9zRGV0YWlscyA9IHBlZyRjb21wdXRlUG9zRGV0YWlscyhzdGFydFBvcyk7XG4gICAgY29uc3QgZW5kUG9zRGV0YWlscyA9IHBlZyRjb21wdXRlUG9zRGV0YWlscyhlbmRQb3MpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXJ0OiB7XG4gICAgICAgIG9mZnNldDogc3RhcnRQb3MsXG4gICAgICAgIGxpbmU6IHN0YXJ0UG9zRGV0YWlscy5saW5lLFxuICAgICAgICBjb2x1bW46IHN0YXJ0UG9zRGV0YWlscy5jb2x1bW5cbiAgICAgIH0sXG4gICAgICBlbmQ6IHtcbiAgICAgICAgb2Zmc2V0OiBlbmRQb3MsXG4gICAgICAgIGxpbmU6IGVuZFBvc0RldGFpbHMubGluZSxcbiAgICAgICAgY29sdW1uOiBlbmRQb3NEZXRhaWxzLmNvbHVtblxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBwZWckZmFpbChleHBlY3RlZDE6IEV4cGVjdGF0aW9uKSB7XG4gICAgaWYgKHBlZyRjdXJyUG9zIDwgcGVnJG1heEZhaWxQb3MpIHsgcmV0dXJuOyB9XG5cbiAgICBpZiAocGVnJGN1cnJQb3MgPiBwZWckbWF4RmFpbFBvcykge1xuICAgICAgcGVnJG1heEZhaWxQb3MgPSBwZWckY3VyclBvcztcbiAgICAgIHBlZyRtYXhGYWlsRXhwZWN0ZWQgPSBbXTtcbiAgICB9XG5cbiAgICBwZWckbWF4RmFpbEV4cGVjdGVkLnB1c2goZXhwZWN0ZWQxKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRidWlsZFNpbXBsZUVycm9yKG1lc3NhZ2U6IHN0cmluZywgbG9jYXRpb24xOiBJRmlsZVJhbmdlKSB7XG4gICAgcmV0dXJuIG5ldyBTeW50YXhFcnJvcihtZXNzYWdlLCBbXSwgXCJcIiwgbG9jYXRpb24xKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRidWlsZFN0cnVjdHVyZWRFcnJvcihleHBlY3RlZDE6IEV4cGVjdGF0aW9uW10sIGZvdW5kOiBzdHJpbmcgfCBudWxsLCBsb2NhdGlvbjE6IElGaWxlUmFuZ2UpIHtcbiAgICByZXR1cm4gbmV3IFN5bnRheEVycm9yKFxuICAgICAgU3ludGF4RXJyb3IuYnVpbGRNZXNzYWdlKGV4cGVjdGVkMSwgZm91bmQpLFxuICAgICAgZXhwZWN0ZWQxLFxuICAgICAgZm91bmQsXG4gICAgICBsb2NhdGlvbjFcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlRXhwcmVzc2lvbigpOiBPcGVyYW5kIHtcbiAgICBsZXQgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3LCBzODtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAwO1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBwZWckcGFyc2VfKCk7XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMiA9IHBlZyRwYXJzZUxvZ2ljT3IoKTtcbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMyA9IFtdO1xuICAgICAgICBzNCA9IHBlZyRjdXJyUG9zO1xuICAgICAgICBzNSA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczYgPSBwZWckcGFyc2VPclNpZ24oKTtcbiAgICAgICAgICBpZiAoczYgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHM3ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgICAgaWYgKHM3ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHM4ID0gcGVnJHBhcnNlTG9naWNPcigpO1xuICAgICAgICAgICAgICBpZiAoczggIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBzNSA9IFtzNSwgczYsIHM3LCBzOF07XG4gICAgICAgICAgICAgICAgczQgPSBzNTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHM0O1xuICAgICAgICAgICAgICAgIHM0ID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzNDtcbiAgICAgICAgICAgICAgczQgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHM0O1xuICAgICAgICAgICAgczQgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHM0O1xuICAgICAgICAgIHM0ID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzMy5wdXNoKHM0KTtcbiAgICAgICAgICBzNCA9IHBlZyRjdXJyUG9zO1xuICAgICAgICAgIHM1ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczYgPSBwZWckcGFyc2VPclNpZ24oKTtcbiAgICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNyA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICAgICAgaWYgKHM3ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgczggPSBwZWckcGFyc2VMb2dpY09yKCk7XG4gICAgICAgICAgICAgICAgaWYgKHM4ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICBzNSA9IFtzNSwgczYsIHM3LCBzOF07XG4gICAgICAgICAgICAgICAgICBzNCA9IHM1O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHM0O1xuICAgICAgICAgICAgICAgICAgczQgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHM0O1xuICAgICAgICAgICAgICAgIHM0ID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzNDtcbiAgICAgICAgICAgICAgczQgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHM0O1xuICAgICAgICAgICAgczQgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNCA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgICAgczEgPSBwZWckYzAoczIsIHMzKTtcbiAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlT3JTaWduKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMTtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAxO1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMikgPT09IHBlZyRjMSkge1xuICAgICAgczEgPSBwZWckYzE7XG4gICAgICBwZWckY3VyclBvcyArPSAyO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMik7IH1cbiAgICB9XG4gICAgaWYgKHMxID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAyKS50b0xvd2VyQ2FzZSgpID09PSBwZWckYzMpIHtcbiAgICAgICAgczEgPSBpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDIpO1xuICAgICAgICBwZWckY3VyclBvcyArPSAyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNCk7IH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgIHMxID0gcGVnJGM1KCk7XG4gICAgfVxuICAgIHMwID0gczE7XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VMb2dpY09yKCk6IEJpbmFyeU9wZXJhbmQge1xuICAgIGxldCBzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNiwgczc7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMjtcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIHMxID0gcGVnJHBhcnNlTG9naWNBbmQoKTtcbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMyID0gW107XG4gICAgICBzMyA9IHBlZyRjdXJyUG9zO1xuICAgICAgczQgPSBwZWckcGFyc2VfKCk7XG4gICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczUgPSBwZWckcGFyc2VBbmRTaWduKCk7XG4gICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM2ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczcgPSBwZWckcGFyc2VMb2dpY0FuZCgpO1xuICAgICAgICAgICAgaWYgKHM3ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHM0ID0gW3M0LCBzNSwgczYsIHM3XTtcbiAgICAgICAgICAgICAgczMgPSBzNDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMi5wdXNoKHMzKTtcbiAgICAgICAgczMgPSBwZWckY3VyclBvcztcbiAgICAgICAgczQgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM1ID0gcGVnJHBhcnNlQW5kU2lnbigpO1xuICAgICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczYgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgICBpZiAoczYgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczcgPSBwZWckcGFyc2VMb2dpY0FuZCgpO1xuICAgICAgICAgICAgICBpZiAoczcgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBzNCA9IFtzNCwgczUsIHM2LCBzN107XG4gICAgICAgICAgICAgICAgczMgPSBzNDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICBzMSA9IHBlZyRjMChzMSwgczIpO1xuICAgICAgICBzMCA9IHMxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZUFuZFNpZ24oKTogYW55IHtcbiAgICBsZXQgczAsIHMxO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDM7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAyKSA9PT0gcGVnJGM2KSB7XG4gICAgICBzMSA9IHBlZyRjNjtcbiAgICAgIHBlZyRjdXJyUG9zICs9IDI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM3KTsgfVxuICAgIH1cbiAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDMpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjOCkge1xuICAgICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMyk7XG4gICAgICAgIHBlZyRjdXJyUG9zICs9IDM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM5KTsgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgczEgPSBwZWckYzEwKCk7XG4gICAgfVxuICAgIHMwID0gczE7XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VMb2dpY0FuZCgpOiBCaW5hcnlPcGVyYW5kIHtcbiAgICBsZXQgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3O1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDQ7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRwYXJzZUNvbXBPcHMoKTtcbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMyID0gW107XG4gICAgICBzMyA9IHBlZyRjdXJyUG9zO1xuICAgICAgczQgPSBwZWckcGFyc2VfKCk7XG4gICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczUgPSBwZWckcGFyc2VDb21wYXJhYmxlT3BlcmF0b3JzKCk7XG4gICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM2ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczcgPSBwZWckcGFyc2VDb21wT3BzKCk7XG4gICAgICAgICAgICBpZiAoczcgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczQgPSBbczQsIHM1LCBzNiwgczddO1xuICAgICAgICAgICAgICBzMyA9IHM0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgICAgd2hpbGUgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyLnB1c2goczMpO1xuICAgICAgICBzMyA9IHBlZyRjdXJyUG9zO1xuICAgICAgICBzNCA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczUgPSBwZWckcGFyc2VDb21wYXJhYmxlT3BlcmF0b3JzKCk7XG4gICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNiA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNyA9IHBlZyRwYXJzZUNvbXBPcHMoKTtcbiAgICAgICAgICAgICAgaWYgKHM3ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgczQgPSBbczQsIHM1LCBzNiwgczddO1xuICAgICAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzExKHMxLCBzMik7XG4gICAgICAgIHMwID0gczE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlQ29tcGFyYWJsZU9wZXJhdG9ycygpOiBhbnkge1xuICAgIGxldCBzMCwgczE7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgNTtcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDIpID09PSBwZWckYzEyKSB7XG4gICAgICBzMSA9IHBlZyRjMTI7XG4gICAgICBwZWckY3VyclBvcyArPSAyO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTMpOyB9XG4gICAgfVxuICAgIGlmIChzMSA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMTEpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjMTQpIHtcbiAgICAgICAgczEgPSBpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDExKTtcbiAgICAgICAgcGVnJGN1cnJQb3MgKz0gMTE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxNSk7IH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgIHMxID0gcGVnJGMxNigpO1xuICAgIH1cbiAgICBzMCA9IHMxO1xuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDIpID09PSBwZWckYzE3KSB7XG4gICAgICAgIHMxID0gcGVnJGMxNztcbiAgICAgICAgcGVnJGN1cnJQb3MgKz0gMjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzE4KTsgfVxuICAgICAgfVxuICAgICAgaWYgKHMxID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDE0KS50b0xvd2VyQ2FzZSgpID09PSBwZWckYzE5KSB7XG4gICAgICAgICAgczEgPSBpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDE0KTtcbiAgICAgICAgICBwZWckY3VyclBvcyArPSAxNDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzIwKTsgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgIHMxID0gcGVnJGMyMSgpO1xuICAgICAgfVxuICAgICAgczAgPSBzMTtcbiAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDYxKSB7XG4gICAgICAgICAgczEgPSBwZWckYzIyO1xuICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMyMyk7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA1KS50b0xvd2VyQ2FzZSgpID09PSBwZWckYzI0KSB7XG4gICAgICAgICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNSk7XG4gICAgICAgICAgICBwZWckY3VyclBvcyArPSA1O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMjUpOyB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgIHMxID0gcGVnJGMyNigpO1xuICAgICAgICB9XG4gICAgICAgIHMwID0gczE7XG4gICAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMikgPT09IHBlZyRjMjcpIHtcbiAgICAgICAgICAgIHMxID0gcGVnJGMyNztcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMyOCk7IH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHMxID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA4KS50b0xvd2VyQ2FzZSgpID09PSBwZWckYzI5KSB7XG4gICAgICAgICAgICAgIHMxID0gaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA4KTtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgKz0gODtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzMwKTsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgICAgczEgPSBwZWckYzMxKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA2MCkge1xuICAgICAgICAgICAgICBzMSA9IHBlZyRjMzI7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMzMyk7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzMSA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA0KS50b0xvd2VyQ2FzZSgpID09PSBwZWckYzM0KSB7XG4gICAgICAgICAgICAgICAgczEgPSBpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDQpO1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDQ7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMzNSk7IH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgICAgICBzMSA9IHBlZyRjMzYoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA2Mikge1xuICAgICAgICAgICAgICAgIHMxID0gcGVnJGMzNztcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMzgpOyB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHMxID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNykudG9Mb3dlckNhc2UoKSA9PT0gcGVnJGMzOSkge1xuICAgICAgICAgICAgICAgICAgczEgPSBpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDcpO1xuICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgKz0gNztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzQwKTsgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICBzMSA9IHBlZyRjNDEoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZUNvbXBPcHMoKTogQmluYXJ5T3BlcmFuZCB7XG4gICAgbGV0IHMwLCBzMSwgczIsIHMzLCBzNCwgczUsIHM2LCBzNztcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyA2O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBwZWckcGFyc2VQbHVzTWludXNPcHMoKTtcbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMyID0gW107XG4gICAgICBzMyA9IHBlZyRjdXJyUG9zO1xuICAgICAgczQgPSBwZWckcGFyc2VfKCk7XG4gICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczUgPSBwZWckcGFyc2VQbHVzTWludXNTaWducygpO1xuICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNiA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICBpZiAoczYgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHM3ID0gcGVnJHBhcnNlUGx1c01pbnVzT3BzKCk7XG4gICAgICAgICAgICBpZiAoczcgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczQgPSBbczQsIHM1LCBzNiwgczddO1xuICAgICAgICAgICAgICBzMyA9IHM0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgICAgd2hpbGUgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyLnB1c2goczMpO1xuICAgICAgICBzMyA9IHBlZyRjdXJyUG9zO1xuICAgICAgICBzNCA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczUgPSBwZWckcGFyc2VQbHVzTWludXNTaWducygpO1xuICAgICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczYgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgICBpZiAoczYgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczcgPSBwZWckcGFyc2VQbHVzTWludXNPcHMoKTtcbiAgICAgICAgICAgICAgaWYgKHM3ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgczQgPSBbczQsIHM1LCBzNiwgczddO1xuICAgICAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzAoczEsIHMyKTtcbiAgICAgICAgczAgPSBzMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VQbHVzTWludXNTaWducygpOiBhbnkge1xuICAgIGxldCBzMCwgczE7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgNztcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gNDMpIHtcbiAgICAgIHMxID0gcGVnJGM0MjtcbiAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM0Myk7IH1cbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgIHMxID0gcGVnJGM0NCgpO1xuICAgIH1cbiAgICBzMCA9IHMxO1xuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gNDUpIHtcbiAgICAgICAgczEgPSBwZWckYzQ1O1xuICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNDYpOyB9XG4gICAgICB9XG4gICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgIHMxID0gcGVnJGM0NygpO1xuICAgICAgfVxuICAgICAgczAgPSBzMTtcbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VQbHVzTWludXNPcHMoKTogQmluYXJ5T3BlcmFuZCB7XG4gICAgbGV0IHMwLCBzMSwgczIsIHMzLCBzNCwgczUsIHM2LCBzNztcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyA4O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBwZWckcGFyc2VNdWxEaXZPcHMoKTtcbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMyID0gW107XG4gICAgICBzMyA9IHBlZyRjdXJyUG9zO1xuICAgICAgczQgPSBwZWckcGFyc2VfKCk7XG4gICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczUgPSBwZWckcGFyc2VNdWxEaXZTaWducygpO1xuICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNiA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICBpZiAoczYgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHM3ID0gcGVnJHBhcnNlTXVsRGl2T3BzKCk7XG4gICAgICAgICAgICBpZiAoczcgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczQgPSBbczQsIHM1LCBzNiwgczddO1xuICAgICAgICAgICAgICBzMyA9IHM0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgICAgd2hpbGUgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyLnB1c2goczMpO1xuICAgICAgICBzMyA9IHBlZyRjdXJyUG9zO1xuICAgICAgICBzNCA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczUgPSBwZWckcGFyc2VNdWxEaXZTaWducygpO1xuICAgICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczYgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgICBpZiAoczYgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczcgPSBwZWckcGFyc2VNdWxEaXZPcHMoKTtcbiAgICAgICAgICAgICAgaWYgKHM3ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgczQgPSBbczQsIHM1LCBzNiwgczddO1xuICAgICAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzAoczEsIHMyKTtcbiAgICAgICAgczAgPSBzMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VNdWxEaXZTaWducygpOiBhbnkge1xuICAgIGxldCBzMCwgczE7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgOTtcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gNDIpIHtcbiAgICAgIHMxID0gcGVnJGM0ODtcbiAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM0OSk7IH1cbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgIHMxID0gcGVnJGM1MCgpO1xuICAgIH1cbiAgICBzMCA9IHMxO1xuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gNDcpIHtcbiAgICAgICAgczEgPSBwZWckYzUxO1xuICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNTIpOyB9XG4gICAgICB9XG4gICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgIHMxID0gcGVnJGM1MygpO1xuICAgICAgfVxuICAgICAgczAgPSBzMTtcbiAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDM3KSB7XG4gICAgICAgICAgczEgPSBwZWckYzU0O1xuICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM1NSk7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICBzMSA9IHBlZyRjNTYoKTtcbiAgICAgICAgfVxuICAgICAgICBzMCA9IHMxO1xuICAgICAgfVxuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZU11bERpdk9wcygpOiBCaW5hcnlPcGVyYW5kIHtcbiAgICBsZXQgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3O1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDEwO1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBwZWckcGFyc2VCaW5hcnlGdW5jT3AoKTtcbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMyID0gW107XG4gICAgICBzMyA9IHBlZyRjdXJyUG9zO1xuICAgICAgczQgPSBwZWckcGFyc2VfKCk7XG4gICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczUgPSBwZWckcGFyc2VQb3dlclNpZ25zKCk7XG4gICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM2ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczcgPSBwZWckcGFyc2VCaW5hcnlGdW5jT3AoKTtcbiAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNCA9IFtzNCwgczUsIHM2LCBzN107XG4gICAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIucHVzaChzMyk7XG4gICAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNSA9IHBlZyRwYXJzZVBvd2VyU2lnbnMoKTtcbiAgICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHM2ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgICAgaWYgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHM3ID0gcGVnJHBhcnNlQmluYXJ5RnVuY09wKCk7XG4gICAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHM0ID0gW3M0LCBzNSwgczYsIHM3XTtcbiAgICAgICAgICAgICAgICBzMyA9IHM0O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgIHMxID0gcGVnJGMwKHMxLCBzMik7XG4gICAgICAgIHMwID0gczE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlUG93ZXJTaWducygpOiBhbnkge1xuICAgIGxldCBzMCwgczE7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMTE7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDk0KSB7XG4gICAgICBzMSA9IHBlZyRjNTc7XG4gICAgICBwZWckY3VyclBvcysrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNTgpOyB9XG4gICAgfVxuICAgIGlmIChzMSA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNSkudG9Mb3dlckNhc2UoKSA9PT0gcGVnJGM1OSkge1xuICAgICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNSk7XG4gICAgICAgIHBlZyRjdXJyUG9zICs9IDU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM2MCk7IH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgIHMxID0gcGVnJGM2MSgpO1xuICAgIH1cbiAgICBzMCA9IHMxO1xuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlQmluYXJ5RnVuY09wKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMSwgczIsIHMzLCBzNCwgczUsIHM2LCBzNztcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAxMjtcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIHMxID0gcGVnJHBhcnNlRmFjdG9yKCk7XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMiA9IFtdO1xuICAgICAgczMgPSBwZWckY3VyclBvcztcbiAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHM1ID0gcGVnJHBhcnNlQmluRnVuY3Rpb25zKCk7XG4gICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM2ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczcgPSBwZWckcGFyc2VGYWN0b3IoKTtcbiAgICAgICAgICAgIGlmIChzNyA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNyA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoczcgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczQgPSBbczQsIHM1LCBzNiwgczddO1xuICAgICAgICAgICAgICBzMyA9IHM0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgICAgd2hpbGUgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyLnB1c2goczMpO1xuICAgICAgICBzMyA9IHBlZyRjdXJyUG9zO1xuICAgICAgICBzNCA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczUgPSBwZWckcGFyc2VCaW5GdW5jdGlvbnMoKTtcbiAgICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHM2ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgICAgaWYgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHM3ID0gcGVnJHBhcnNlRmFjdG9yKCk7XG4gICAgICAgICAgICAgIGlmIChzNyA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHM3ID0gbnVsbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoczcgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBzNCA9IFtzNCwgczUsIHM2LCBzN107XG4gICAgICAgICAgICAgICAgczMgPSBzNDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICBzMSA9IHBlZyRjMTEoczEsIHMyKTtcbiAgICAgICAgczAgPSBzMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VCaW5GdW5jdGlvbnMoKTogYW55IHtcbiAgICBsZXQgczAsIHMxO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDEzO1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMikgPT09IHBlZyRjNjIpIHtcbiAgICAgIHMxID0gcGVnJGM2MjtcbiAgICAgIHBlZyRjdXJyUG9zICs9IDI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM2Myk7IH1cbiAgICB9XG4gICAgaWYgKHMxID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA4KS50b0xvd2VyQ2FzZSgpID09PSBwZWckYzY0KSB7XG4gICAgICAgIHMxID0gaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA4KTtcbiAgICAgICAgcGVnJGN1cnJQb3MgKz0gODtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzY1KTsgfVxuICAgICAgfVxuICAgICAgaWYgKHMxID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDcpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjNjYpIHtcbiAgICAgICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNyk7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgKz0gNztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzY3KTsgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICBzMSA9IHBlZyRjNjgoKTtcbiAgICB9XG4gICAgczAgPSBzMTtcbiAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAxMSkudG9Mb3dlckNhc2UoKSA9PT0gcGVnJGM2OSkge1xuICAgICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMTEpO1xuICAgICAgICBwZWckY3VyclBvcyArPSAxMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzcwKTsgfVxuICAgICAgfVxuICAgICAgaWYgKHMxID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDEwKS50b0xvd2VyQ2FzZSgpID09PSBwZWckYzcxKSB7XG4gICAgICAgICAgczEgPSBpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDEwKTtcbiAgICAgICAgICBwZWckY3VyclBvcyArPSAxMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzcyKTsgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgIHMxID0gcGVnJGM3MygpO1xuICAgICAgfVxuICAgICAgczAgPSBzMTtcbiAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA1KS50b0xvd2VyQ2FzZSgpID09PSBwZWckYzc0KSB7XG4gICAgICAgICAgczEgPSBpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDUpO1xuICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM3NSk7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICBzMSA9IHBlZyRjNzYoKTtcbiAgICAgICAgfVxuICAgICAgICBzMCA9IHMxO1xuICAgICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDUpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjNzcpIHtcbiAgICAgICAgICAgIHMxID0gaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA1KTtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM3OCk7IH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICAgIHMxID0gcGVnJGM3OSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlRmFjdG9yKCk6IE9wZXJhbmQge1xuICAgIGxldCBzMCwgczEsIHMyLCBzMywgczQsIHM1O1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDE0O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0MCkge1xuICAgICAgczEgPSBwZWckYzgwO1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzgxKTsgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMyID0gcGVnJHBhcnNlXygpO1xuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMzID0gcGVnJHBhcnNlRXhwcmVzc2lvbigpO1xuICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNCA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gNDEpIHtcbiAgICAgICAgICAgICAgczUgPSBwZWckYzgyO1xuICAgICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgczUgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjODMpOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoczUgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczUgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgICAgICBzMSA9IHBlZyRjODQoczMpO1xuICAgICAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cbiAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMwID0gcGVnJHBhcnNlRnVuY3Rpb25PcCgpO1xuICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwID0gcGVnJHBhcnNlVW5hcnlGdW5jdGlvbk9wKCk7XG4gICAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMwID0gcGVnJHBhcnNlQXRvbSgpO1xuICAgICAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczAgPSBwZWckcGFyc2VBcnJheU9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlRnVuY3Rpb25PcCgpOiBhbnkge1xuICAgIGxldCBzMCwgczEsIHMyLCBzMywgczQ7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMTU7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRwYXJzZUxldHRlcnNBbmREaWdpdHMoKTtcbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gNDApIHtcbiAgICAgICAgczIgPSBwZWckYzgwO1xuICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczIgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjODEpOyB9XG4gICAgICB9XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczMgPSBwZWckcGFyc2VTZXF1ZW5jZSgpO1xuICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDQxKSB7XG4gICAgICAgICAgICBzNCA9IHBlZyRjODI7XG4gICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzNCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjODMpOyB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzNCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczQgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgICAgczEgPSBwZWckYzg1KHMxLCBzMyk7XG4gICAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZVVuYXJ5RnVuY3Rpb25PcCgpOiBhbnkge1xuICAgIGxldCBzMCwgczEsIHMyLCBzMztcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAxNjtcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gMzMpIHtcbiAgICAgIHMxID0gcGVnJGM4NjtcbiAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM4Nyk7IH1cbiAgICB9XG4gICAgaWYgKHMxID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA2KS50b0xvd2VyQ2FzZSgpID09PSBwZWckYzg4KSB7XG4gICAgICAgIHMxID0gaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA2KTtcbiAgICAgICAgcGVnJGN1cnJQb3MgKz0gNjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzg5KTsgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMyID0gcGVnJHBhcnNlXygpO1xuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMzID0gcGVnJHBhcnNlRXhwcmVzc2lvbigpO1xuICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICBzMSA9IHBlZyRjOTAoczMpO1xuICAgICAgICAgIHMwID0gczE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgczEgPSBwZWckcGFyc2VBdG9tKCk7XG4gICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMzID0gcGVnJHBhcnNlVW5GdW5jdGlvbnMoKTtcbiAgICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgICAgczEgPSBwZWckYzkxKHMxLCBzMyk7XG4gICAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZVVuRnVuY3Rpb25zKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMTtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAxNztcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDUpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjOTIpIHtcbiAgICAgIHMxID0gaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA1KTtcbiAgICAgIHBlZyRjdXJyUG9zICs9IDU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM5Myk7IH1cbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgIHMxID0gcGVnJGM5NCgpO1xuICAgIH1cbiAgICBzMCA9IHMxO1xuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDgpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjOTUpIHtcbiAgICAgICAgczEgPSBpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDgpO1xuICAgICAgICBwZWckY3VyclBvcyArPSA4O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjOTYpOyB9XG4gICAgICB9XG4gICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgIHMxID0gcGVnJGM5NygpO1xuICAgICAgfVxuICAgICAgczAgPSBzMTtcbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VBdG9tKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMSwgczIsIHMzLCBzNDtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAxODtcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIHMxID0gcGVnJHBhcnNlXygpO1xuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgOSkgPT09IHBlZyRjOTgpIHtcbiAgICAgICAgczIgPSBwZWckYzk4O1xuICAgICAgICBwZWckY3VyclBvcyArPSA5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczIgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjOTkpOyB9XG4gICAgICB9XG4gICAgICBpZiAoczIgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNCkgPT09IHBlZyRjMTAwKSB7XG4gICAgICAgICAgczIgPSBwZWckYzEwMDtcbiAgICAgICAgICBwZWckY3VyclBvcyArPSA0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMyID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTAxKTsgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgIHMxID0gcGVnJGMxMDIoKTtcbiAgICAgICAgczAgPSBzMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgczEgPSBwZWckcGFyc2VfKCk7XG4gICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIgPSBwZWckcGFyc2VDb25zdFZhbHVlKCk7XG4gICAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgIHMxID0gcGVnJGMxMDMoczIpO1xuICAgICAgICAgIHMwID0gczE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgICBzMSA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAxMjMpIHtcbiAgICAgICAgICAgIHMyID0gcGVnJGMxMDQ7XG4gICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzMiA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTA1KTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHMzID0gcGVnJHBhcnNlVmFsdWVJbnB1dCgpO1xuICAgICAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gMTI1KSB7XG4gICAgICAgICAgICAgICAgczQgPSBwZWckYzEwNjtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHM0ID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTA3KTsgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgICAgICAgIHMxID0gcGVnJGMxMDgoczMpO1xuICAgICAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VDb25zdFZhbHVlKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMSwgczIsIHMzO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDE5O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBwZWckcGFyc2VMb2dpY1ZhbHVlKCk7XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgIHMxID0gcGVnJGMxMDkoczEpO1xuICAgIH1cbiAgICBzMCA9IHMxO1xuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIHMxID0gcGVnJHBhcnNlQXJpdGhtZXRpY1ZhbHVlKCk7XG4gICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgIHMxID0gcGVnJGMxMDkoczEpO1xuICAgICAgfVxuICAgICAgczAgPSBzMTtcbiAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgICBzMSA9IHBlZyRwYXJzZUxldHRlcnNBbmREaWdpdHMoKTtcbiAgICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgczEgPSBwZWckYzEwOShzMSk7XG4gICAgICAgIH1cbiAgICAgICAgczAgPSBzMTtcbiAgICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAyKSA9PT0gcGVnJGMxMTApIHtcbiAgICAgICAgICAgIHMxID0gcGVnJGMxMTA7XG4gICAgICAgICAgICBwZWckY3VyclBvcyArPSAyO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTExKTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgICAgczEgPSBwZWckYzExMigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDIpID09PSBwZWckYzExMykge1xuICAgICAgICAgICAgICBzMSA9IHBlZyRjMTEzO1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyArPSAyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTE0KTsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgICAgICBzMSA9IHBlZyRjMTEyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gMzkpIHtcbiAgICAgICAgICAgICAgICBzMSA9IHBlZyRjMTE1O1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMTYpOyB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgczIgPSBwZWckcGFyc2VBbnlJbnB1dCgpO1xuICAgICAgICAgICAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAzOSkge1xuICAgICAgICAgICAgICAgICAgICBzMyA9IHBlZyRjMTE1O1xuICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTE2KTsgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgICBzMSA9IHBlZyRjMTE3KHMyKTtcbiAgICAgICAgICAgICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDM0KSB7XG4gICAgICAgICAgICAgICAgICBzMSA9IHBlZyRjMTE4O1xuICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzExOSk7IH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICBzMiA9IHBlZyRwYXJzZUFueUlucHV0KCk7XG4gICAgICAgICAgICAgICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAzNCkge1xuICAgICAgICAgICAgICAgICAgICAgIHMzID0gcGVnJGMxMTg7XG4gICAgICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzExOSk7IH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICAgICAgICBzMSA9IHBlZyRjMTE3KHMyKTtcbiAgICAgICAgICAgICAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlQXJyYXlPcCgpOiBhbnkge1xuICAgIGxldCBzMCwgczEsIHMyLCBzMztcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAyMDtcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gOTEpIHtcbiAgICAgIHMxID0gcGVnJGMxMjA7XG4gICAgICBwZWckY3VyclBvcysrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTIxKTsgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMyID0gcGVnJHBhcnNlU2VxdWVuY2UoKTtcbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDkzKSB7XG4gICAgICAgICAgczMgPSBwZWckYzEyMjtcbiAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTIzKTsgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgIHMxID0gcGVnJGMxMjQoczIpO1xuICAgICAgICAgIHMwID0gczE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VTZXF1ZW5jZSgpOiBBcnJheU9wZXJhbmQge1xuICAgIGxldCBzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNiwgczc7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMjE7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRwYXJzZUV4cHJlc3Npb24oKTtcbiAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMxID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMiA9IFtdO1xuICAgICAgczMgPSBwZWckY3VyclBvcztcbiAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gNDQpIHtcbiAgICAgICAgICBzNSA9IHBlZyRjMTI1O1xuICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgczUgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMjYpOyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczYgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgaWYgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNyA9IHBlZyRwYXJzZUV4cHJlc3Npb24oKTtcbiAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNCA9IFtzNCwgczUsIHM2LCBzN107XG4gICAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIucHVzaChzMyk7XG4gICAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDQ0KSB7XG4gICAgICAgICAgICBzNSA9IHBlZyRjMTI1O1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgczUgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzEyNik7IH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNiA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNyA9IHBlZyRwYXJzZUV4cHJlc3Npb24oKTtcbiAgICAgICAgICAgICAgaWYgKHM3ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgczQgPSBbczQsIHM1LCBzNiwgczddO1xuICAgICAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzEyNyhzMSwgczIpO1xuICAgICAgICBzMCA9IHMxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZUxvZ2ljVmFsdWUoKTogYW55IHtcbiAgICBsZXQgczAsIHMxO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDIyO1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNCkudG9Mb3dlckNhc2UoKSA9PT0gcGVnJGMxMjgpIHtcbiAgICAgIHMxID0gaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA0KTtcbiAgICAgIHBlZyRjdXJyUG9zICs9IDQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMjkpOyB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICBzMSA9IHBlZyRjMTMwKCk7XG4gICAgfVxuICAgIHMwID0gczE7XG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNSkudG9Mb3dlckNhc2UoKSA9PT0gcGVnJGMxMzEpIHtcbiAgICAgICAgczEgPSBpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDUpO1xuICAgICAgICBwZWckY3VyclBvcyArPSA1O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTMyKTsgfVxuICAgICAgfVxuICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICBzMSA9IHBlZyRjMTMzKCk7XG4gICAgICB9XG4gICAgICBzMCA9IHMxO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZUFyaXRobWV0aWNWYWx1ZSgpOiBhbnkge1xuICAgIGxldCBzMCwgczEsIHMyO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDIzO1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMikgPT09IHBlZyRjMTM0KSB7XG4gICAgICBzMSA9IHBlZyRjMTM0O1xuICAgICAgcGVnJGN1cnJQb3MgKz0gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzEzNSk7IH1cbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMiA9IHBlZyRwYXJzZURpZ2l0cygpO1xuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICBzMSA9IHBlZyRjMTM2KCk7XG4gICAgICAgIHMwID0gczE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIGlmIChwZWckYzEzNy50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICAgIHMxID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzEzOCk7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMSA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMSA9IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIgPSBwZWckcGFyc2VOdW1iZXIoKTtcbiAgICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgczEgPSBwZWckYzEzOShzMSwgczIpO1xuICAgICAgICAgIHMwID0gczE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VOdW1iZXIoKTogYW55IHtcbiAgICBsZXQgczAsIHMxLCBzMiwgczM7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMjQ7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRwYXJzZURpZ2l0cygpO1xuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0Nikge1xuICAgICAgICBzMiA9IHBlZyRjMTQwO1xuICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczIgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTQxKTsgfVxuICAgICAgfVxuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMzID0gcGVnJHBhcnNlRGlnaXRzKCk7XG4gICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgIHMxID0gcGVnJGMxNDIoKTtcbiAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIHMxID0gcGVnJHBhcnNlTm9uWmVyb0RpZ2l0cygpO1xuICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyID0gcGVnJHBhcnNlRGlnaXRzKCk7XG4gICAgICAgIGlmIChzMiA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICBzMSA9IHBlZyRjMTQzKCk7XG4gICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gNDgpIHtcbiAgICAgICAgICBzMSA9IHBlZyRjMTQ0O1xuICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxNDUpOyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgczEgPSBwZWckYzE0NigpO1xuICAgICAgICB9XG4gICAgICAgIHMwID0gczE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlVmFsdWVJbnB1dCgpOiBhbnkge1xuICAgIGxldCBzMCwgczEsIHMyO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDI1O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBbXTtcbiAgICBzMiA9IHBlZyRwYXJzZVZhbHVlQ2hhcmFjdGVycygpO1xuICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgd2hpbGUgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMxLnB1c2goczIpO1xuICAgICAgICBzMiA9IHBlZyRwYXJzZVZhbHVlQ2hhcmFjdGVycygpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICBzMSA9IHBlZyRjMTQ3KHMxKTtcbiAgICB9XG4gICAgczAgPSBzMTtcblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZUFueUlucHV0KCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMSwgczI7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMjY7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IFtdO1xuICAgIHMyID0gcGVnJHBhcnNlQW55Q2hhcmFjdGVycygpO1xuICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgd2hpbGUgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMxLnB1c2goczIpO1xuICAgICAgICBzMiA9IHBlZyRwYXJzZUFueUNoYXJhY3RlcnMoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgczEgPSBwZWckYzE0NyhzMSk7XG4gICAgfVxuICAgIHMwID0gczE7XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VBbnlDaGFyYWN0ZXJzKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMTtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAyNztcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDIpID09PSBwZWckYzE0OCkge1xuICAgICAgczEgPSBwZWckYzE0ODtcbiAgICAgIHBlZyRjdXJyUG9zICs9IDI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxNDkpOyB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICBzMSA9IHBlZyRjMTUwKCk7XG4gICAgfVxuICAgIHMwID0gczE7XG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMikgPT09IHBlZyRjMTUxKSB7XG4gICAgICAgIHMxID0gcGVnJGMxNTE7XG4gICAgICAgIHBlZyRjdXJyUG9zICs9IDI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxNTIpOyB9XG4gICAgICB9XG4gICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgIHMxID0gcGVnJGMxNTMoKTtcbiAgICAgIH1cbiAgICAgIHMwID0gczE7XG4gICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgICAgaWYgKHBlZyRjMTU0LnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgICAgICBzMSA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzE1NSk7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICBzMSA9IHBlZyRjMTU2KCk7XG4gICAgICAgIH1cbiAgICAgICAgczAgPSBzMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VWYWx1ZUNoYXJhY3RlcnMoKTogYW55IHtcbiAgICBsZXQgczAsIHMxO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDI4O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKHBlZyRjMTU3LnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgIHMxID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxNTgpOyB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICBzMSA9IHBlZyRjMTU2KCk7XG4gICAgfVxuICAgIHMwID0gczE7XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VMZXR0ZXJzQW5kRGlnaXRzKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMSwgczIsIHMzLCBzNCwgczUsIHM2O1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDI5O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBwZWckcGFyc2VMZXR0ZXJzKCk7XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMiA9IFtdO1xuICAgICAgczMgPSBwZWckY3VyclBvcztcbiAgICAgIHM0ID0gcGVnJHBhcnNlRGlnaXRzKCk7XG4gICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczUgPSBbXTtcbiAgICAgICAgczYgPSBwZWckcGFyc2VMZXR0ZXJzKCk7XG4gICAgICAgIHdoaWxlIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM1LnB1c2goczYpO1xuICAgICAgICAgIHM2ID0gcGVnJHBhcnNlTGV0dGVycygpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM0ID0gW3M0LCBzNV07XG4gICAgICAgICAgczMgPSBzNDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgICAgd2hpbGUgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyLnB1c2goczMpO1xuICAgICAgICBzMyA9IHBlZyRjdXJyUG9zO1xuICAgICAgICBzNCA9IHBlZyRwYXJzZURpZ2l0cygpO1xuICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNSA9IFtdO1xuICAgICAgICAgIHM2ID0gcGVnJHBhcnNlTGV0dGVycygpO1xuICAgICAgICAgIHdoaWxlIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczUucHVzaChzNik7XG4gICAgICAgICAgICBzNiA9IHBlZyRwYXJzZUxldHRlcnMoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNCA9IFtzNCwgczVdO1xuICAgICAgICAgICAgczMgPSBzNDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzE1NigpO1xuICAgICAgICBzMCA9IHMxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZURpZ2l0cygpOiBhbnkge1xuICAgIGxldCBzMCwgczE7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMzA7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBbXTtcbiAgICBpZiAocGVnJGMxNTkudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgczEgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzE2MCk7IH1cbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICB3aGlsZSAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczAucHVzaChzMSk7XG4gICAgICAgIGlmIChwZWckYzE1OS50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICAgICAgczEgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxNjApOyB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZU5vblplcm9EaWdpdHMoKTogYW55IHtcbiAgICBsZXQgczAsIHMxO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDMxO1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gW107XG4gICAgaWYgKHBlZyRjMTYxLnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgIHMxID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxNjIpOyB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgd2hpbGUgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwLnB1c2goczEpO1xuICAgICAgICBpZiAocGVnJGMxNjEudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgICAgIHMxID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTYyKTsgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VMZXR0ZXJzKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMTtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAzMjtcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IFtdO1xuICAgIGlmIChwZWckYzE2My50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICBzMSA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICBwZWckY3VyclBvcysrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTY0KTsgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHdoaWxlIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMC5wdXNoKHMxKTtcbiAgICAgICAgaWYgKHBlZyRjMTYzLnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgICAgICBzMSA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzE2NCk7IH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlXygpOiBhbnkge1xuICAgIGxldCBzMCwgczE7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMzM7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgcGVnJHNpbGVudEZhaWxzKys7XG4gICAgczAgPSBbXTtcbiAgICBpZiAocGVnJGMxNjYudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgczEgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzE2Nyk7IH1cbiAgICB9XG4gICAgd2hpbGUgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMC5wdXNoKHMxKTtcbiAgICAgIGlmIChwZWckYzE2Ni50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICAgIHMxID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzE2Nyk7IH1cbiAgICAgIH1cbiAgICB9XG4gICAgcGVnJHNpbGVudEZhaWxzLS07XG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTY1KTsgfVxuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJ1aWxkQmluYXJ5T3BlcmFuZChoZWFkOiBPcGVyYW5kLCB0YWlsOiBBcnJheTxhbnk+LCBpc0FyaXRobWV0aWNPcDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIHRhaWwucmVkdWNlKFxuICAgICAgZnVuY3Rpb24ocmVzdWx0LCBlbGVtZW50cykge1xuICAgICAgICByZXR1cm4gbmV3IEJpbmFyeU9wZXJhbmQoZWxlbWVudHNbMV0sIHJlc3VsdCwgZWxlbWVudHNbM10sIGlzQXJpdGhtZXRpY09wKTtcbiAgICAgIH0sXG4gICAgICBoZWFkKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZsYXR0ZW5BcnJheShhcnJheTogQXJyYXk8YW55Pik6IEFycmF5PGFueT4ge1xuICAgIHJldHVybiBbXS5jb25jYXQuYXBwbHkoW10sIGFycmF5KTtcbiAgfVxuXG4gIHBlZyRyZXN1bHQgPSBwZWckc3RhcnRSdWxlRnVuY3Rpb24oKTtcblxuICBpZiAocGVnJHJlc3VsdCAhPT0gcGVnJEZBSUxFRCAmJiBwZWckY3VyclBvcyA9PT0gaW5wdXQubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHBlZyRyZXN1bHQ7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHBlZyRyZXN1bHQgIT09IHBlZyRGQUlMRUQgJiYgcGVnJGN1cnJQb3MgPCBpbnB1dC5sZW5ndGgpIHtcbiAgICAgIHBlZyRmYWlsKHBlZyRlbmRFeHBlY3RhdGlvbigpKTtcbiAgICB9XG5cbiAgICB0aHJvdyBwZWckYnVpbGRTdHJ1Y3R1cmVkRXJyb3IoXG4gICAgICBwZWckbWF4RmFpbEV4cGVjdGVkLFxuICAgICAgcGVnJG1heEZhaWxQb3MgPCBpbnB1dC5sZW5ndGggPyBpbnB1dC5jaGFyQXQocGVnJG1heEZhaWxQb3MpIDogbnVsbCxcbiAgICAgIHBlZyRtYXhGYWlsUG9zIDwgaW5wdXQubGVuZ3RoXG4gICAgICAgID8gcGVnJGNvbXB1dGVMb2NhdGlvbihwZWckbWF4RmFpbFBvcywgcGVnJG1heEZhaWxQb3MgKyAxKVxuICAgICAgICA6IHBlZyRjb21wdXRlTG9jYXRpb24ocGVnJG1heEZhaWxQb3MsIHBlZyRtYXhGYWlsUG9zKVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUGFyc2VPcHRpb25zIHtcbiAgZmlsZW5hbWU/OiBzdHJpbmc7XG4gIHN0YXJ0UnVsZT86IHN0cmluZztcbiAgdHJhY2VyPzogYW55O1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5leHBvcnQgdHlwZSBQYXJzZUZ1bmN0aW9uID0gKGlucHV0OiBzdHJpbmcsIG9wdGlvbnM/OiBJUGFyc2VPcHRpb25zKSA9PiBhbnk7XG5leHBvcnQgY29uc3QgcGFyc2U6IFBhcnNlRnVuY3Rpb24gPSBwZWckcGFyc2U7XG5cbiIsImltcG9ydCB7IEhhc2hUYWJsZSwgSGVscGVycyB9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBGdW5jdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi4vZnVuY3Rpb25zZmFjdG9yeVwiO1xuaW1wb3J0IHsgUHJvY2Vzc1ZhbHVlIH0gZnJvbSBcIi4uL2NvbmRpdGlvblByb2Nlc3NWYWx1ZVwiO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgT3BlcmFuZCB7XG4gIHB1YmxpYyB0b1N0cmluZyhmdW5jOiAob3A6IE9wZXJhbmQpID0+IHN0cmluZyA9IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbiAgcHVibGljIGFic3RyYWN0IGdldFR5cGUoKTogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgZXZhbHVhdGUocHJvY2Vzc1ZhbHVlPzogUHJvY2Vzc1ZhbHVlKTogYW55O1xuICBwdWJsaWMgYWJzdHJhY3Qgc2V0VmFyaWFibGVzKHZhcmlhYmxlczogQXJyYXk8c3RyaW5nPik6IGFueTtcbiAgcHVibGljIGhhc0Z1bmN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgaGFzQXN5bmNGdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGFkZFRvQXN5bmNMaXN0KGxpc3Q6IEFycmF5PEZ1bmN0aW9uT3BlcmFuZD4pOiB2b2lkIHt9XG4gIHB1YmxpYyBpc0VxdWFsKG9wOiBPcGVyYW5kKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhb3AgJiYgb3AuZ2V0VHlwZSgpID09PSB0aGlzLmdldFR5cGUoKSAmJiB0aGlzLmlzQ29udGVudEVxdWFsKG9wKTtcbiAgfVxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgaXNDb250ZW50RXF1YWwob3A6IE9wZXJhbmQpOiBib29sZWFuO1xuICBwcm90ZWN0ZWQgYXJlT3BlcmF0b3JzRXF1YWxzKG9wMTogT3BlcmFuZCwgb3AyOiBPcGVyYW5kKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICFvcDEgJiYgIW9wMiB8fCAhIW9wMSAmJiBvcDEuaXNFcXVhbChvcDIpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCaW5hcnlPcGVyYW5kIGV4dGVuZHMgT3BlcmFuZCB7XG4gIHByaXZhdGUgY29uc3VtZXI6IEZ1bmN0aW9uO1xuICBwcml2YXRlIGlzQXJpdGhtZXRpY1ZhbHVlOiBib29sZWFuO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG9wZXJhdG9yTmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgbGVmdDogYW55ID0gbnVsbCxcbiAgICBwcml2YXRlIHJpZ2h0OiBhbnkgPSBudWxsLFxuICAgIGlzQXJpdGhtZXRpY09wOiBib29sZWFuID0gZmFsc2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmlzQXJpdGhtZXRpY1ZhbHVlID0gaXNBcml0aG1ldGljT3A7XG4gICAgaWYgKGlzQXJpdGhtZXRpY09wKSB7XG4gICAgICB0aGlzLmNvbnN1bWVyID0gT3BlcmFuZE1ha2VyLmJpbmFyeUZ1bmN0aW9uc1tcImFyaXRobWV0aWNPcFwiXShcbiAgICAgICAgb3BlcmF0b3JOYW1lXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbnN1bWVyID0gT3BlcmFuZE1ha2VyLmJpbmFyeUZ1bmN0aW9uc1tvcGVyYXRvck5hbWVdO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbnN1bWVyID09IG51bGwpIHtcbiAgICAgIE9wZXJhbmRNYWtlci50aHJvd0ludmFsaWRPcGVyYXRvckVycm9yKG9wZXJhdG9yTmFtZSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiYmluYXJ5XCI7XG4gIH1cbiAgcHVibGljIGdldCBpc0FyaXRobWV0aWMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNBcml0aG1ldGljVmFsdWU7XG4gIH1cbiAgcHVibGljIGdldCBpc0Nvbmp1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLm9wZXJhdG9yTmFtZSA9PSBcIm9yXCIgfHwgdGhpcy5vcGVyYXRvck5hbWUgPT0gXCJhbmRcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGNvbmp1bmN0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaXNDb25qdW5jdGlvbiA/IHRoaXMub3BlcmF0b3JOYW1lIDogXCJcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IG9wZXJhdG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMub3BlcmF0b3JOYW1lO1xuICB9XG4gIHB1YmxpYyBnZXQgbGVmdE9wZXJhbmQoKSB7XG4gICAgcmV0dXJuIHRoaXMubGVmdDtcbiAgfVxuICBwdWJsaWMgZ2V0IHJpZ2h0T3BlcmFuZCgpIHtcbiAgICByZXR1cm4gdGhpcy5yaWdodDtcbiAgfVxuICBwcm90ZWN0ZWQgaXNDb250ZW50RXF1YWwob3A6IE9wZXJhbmQpOiBib29sZWFuIHtcbiAgICBjb25zdCBiT3AgPSA8QmluYXJ5T3BlcmFuZD5vcDtcbiAgICByZXR1cm4gYk9wLm9wZXJhdG9yID09PSB0aGlzLm9wZXJhdG9yICYmXG4gICAgICB0aGlzLmFyZU9wZXJhdG9yc0VxdWFscyh0aGlzLmxlZnQsIGJPcC5sZWZ0KSAmJlxuICAgICAgdGhpcy5hcmVPcGVyYXRvcnNFcXVhbHModGhpcy5yaWdodCwgYk9wLnJpZ2h0KTtcbiAgfVxuICBwcml2YXRlIGV2YWx1YXRlUGFyYW0oeDogYW55LCBwcm9jZXNzVmFsdWU/OiBQcm9jZXNzVmFsdWUpOiBhbnkge1xuICAgIHJldHVybiB4ID09IG51bGwgPyBudWxsIDogeC5ldmFsdWF0ZShwcm9jZXNzVmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGV2YWx1YXRlKHByb2Nlc3NWYWx1ZT86IFByb2Nlc3NWYWx1ZSk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuY29uc3VtZXIuY2FsbChcbiAgICAgIHRoaXMsXG4gICAgICB0aGlzLmV2YWx1YXRlUGFyYW0odGhpcy5sZWZ0LCBwcm9jZXNzVmFsdWUpLFxuICAgICAgdGhpcy5ldmFsdWF0ZVBhcmFtKHRoaXMucmlnaHQsIHByb2Nlc3NWYWx1ZSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKGZ1bmM6IChvcDogT3BlcmFuZCkgPT4gc3RyaW5nID0gdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICBpZiAoISFmdW5jKSB7XG4gICAgICB2YXIgcmVzID0gZnVuYyh0aGlzKTtcbiAgICAgIGlmICghIXJlcykgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIFwiKFwiICtcbiAgICAgIE9wZXJhbmRNYWtlci5zYWZlVG9TdHJpbmcodGhpcy5sZWZ0LCBmdW5jKSArXG4gICAgICBcIiBcIiArXG4gICAgICBPcGVyYW5kTWFrZXIub3BlcmF0b3JUb1N0cmluZyh0aGlzLm9wZXJhdG9yTmFtZSkgK1xuICAgICAgXCIgXCIgK1xuICAgICAgT3BlcmFuZE1ha2VyLnNhZmVUb1N0cmluZyh0aGlzLnJpZ2h0LCBmdW5jKSArXG4gICAgICBcIilcIlxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgc2V0VmFyaWFibGVzKHZhcmlhYmxlczogQXJyYXk8c3RyaW5nPikge1xuICAgIGlmICh0aGlzLmxlZnQgIT0gbnVsbCkgdGhpcy5sZWZ0LnNldFZhcmlhYmxlcyh2YXJpYWJsZXMpO1xuICAgIGlmICh0aGlzLnJpZ2h0ICE9IG51bGwpIHRoaXMucmlnaHQuc2V0VmFyaWFibGVzKHZhcmlhYmxlcyk7XG4gIH1cblxuICBwdWJsaWMgaGFzRnVuY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICghIXRoaXMubGVmdCAmJiB0aGlzLmxlZnQuaGFzRnVuY3Rpb24oKSkgfHxcbiAgICAgICghIXRoaXMucmlnaHQgJiYgdGhpcy5yaWdodC5oYXNGdW5jdGlvbigpKVxuICAgICk7XG4gIH1cbiAgcHVibGljIGhhc0FzeW5jRnVuY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICghIXRoaXMubGVmdCAmJiB0aGlzLmxlZnQuaGFzQXN5bmNGdW5jdGlvbigpKSB8fFxuICAgICAgKCEhdGhpcy5yaWdodCAmJiB0aGlzLnJpZ2h0Lmhhc0FzeW5jRnVuY3Rpb24oKSlcbiAgICApO1xuICB9XG4gIHB1YmxpYyBhZGRUb0FzeW5jTGlzdChsaXN0OiBBcnJheTxGdW5jdGlvbk9wZXJhbmQ+KSB7XG4gICAgaWYgKCEhdGhpcy5sZWZ0KSB0aGlzLmxlZnQuYWRkVG9Bc3luY0xpc3QobGlzdCk7XG4gICAgaWYgKCEhdGhpcy5yaWdodCkgdGhpcy5yaWdodC5hZGRUb0FzeW5jTGlzdChsaXN0KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5hcnlPcGVyYW5kIGV4dGVuZHMgT3BlcmFuZCB7XG4gIHByaXZhdGUgY29uc3VtZXI6IEZ1bmN0aW9uO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGV4cHJlc3Npb25WYWx1ZTogT3BlcmFuZCwgcHJpdmF0ZSBvcGVyYXRvck5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5jb25zdW1lciA9IE9wZXJhbmRNYWtlci51bmFyeUZ1bmN0aW9uc1tvcGVyYXRvck5hbWVdO1xuICAgIGlmICh0aGlzLmNvbnN1bWVyID09IG51bGwpIHtcbiAgICAgIE9wZXJhbmRNYWtlci50aHJvd0ludmFsaWRPcGVyYXRvckVycm9yKG9wZXJhdG9yTmFtZSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgb3BlcmF0b3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5vcGVyYXRvck5hbWU7XG4gIH1cbiAgcHVibGljIGdldCBleHByZXNzaW9uKCk6IE9wZXJhbmQge1xuICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb25WYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInVuYXJ5XCI7XG4gIH1cbiAgcHVibGljIHRvU3RyaW5nKGZ1bmM6IChvcDogT3BlcmFuZCkgPT4gc3RyaW5nID0gdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICBpZiAoISFmdW5jKSB7XG4gICAgICB2YXIgcmVzID0gZnVuYyh0aGlzKTtcbiAgICAgIGlmICghIXJlcykgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIE9wZXJhbmRNYWtlci5vcGVyYXRvclRvU3RyaW5nKHRoaXMub3BlcmF0b3JOYW1lKSArXG4gICAgICBcIiBcIiArXG4gICAgICB0aGlzLmV4cHJlc3Npb24udG9TdHJpbmcoZnVuYylcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBpc0NvbnRlbnRFcXVhbChvcDogT3BlcmFuZCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHVPcCA9IDxVbmFyeU9wZXJhbmQ+b3A7XG4gICAgcmV0dXJuIHVPcC5vcGVyYXRvciA9PSB0aGlzLm9wZXJhdG9yICYmIHRoaXMuYXJlT3BlcmF0b3JzRXF1YWxzKHRoaXMuZXhwcmVzc2lvbiwgdU9wLmV4cHJlc3Npb24pO1xuICB9XG4gIHB1YmxpYyBldmFsdWF0ZShwcm9jZXNzVmFsdWU/OiBQcm9jZXNzVmFsdWUpOiBib29sZWFuIHtcbiAgICBsZXQgdmFsdWUgPSB0aGlzLmV4cHJlc3Npb24uZXZhbHVhdGUocHJvY2Vzc1ZhbHVlKTtcbiAgICByZXR1cm4gdGhpcy5jb25zdW1lci5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRWYXJpYWJsZXModmFyaWFibGVzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgdGhpcy5leHByZXNzaW9uLnNldFZhcmlhYmxlcyh2YXJpYWJsZXMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBcnJheU9wZXJhbmQgZXh0ZW5kcyBPcGVyYW5kIHtcbiAgY29uc3RydWN0b3IocHVibGljIHZhbHVlczogQXJyYXk8T3BlcmFuZD4pIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiYXJyYXlcIjtcbiAgfVxuICBwdWJsaWMgdG9TdHJpbmcoZnVuYzogKG9wOiBPcGVyYW5kKSA9PiBzdHJpbmcgPSB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGlmICghIWZ1bmMpIHtcbiAgICAgIHZhciByZXMgPSBmdW5jKHRoaXMpO1xuICAgICAgaWYgKCEhcmVzKSByZXR1cm4gcmVzO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgXCJbXCIgK1xuICAgICAgdGhpcy52YWx1ZXNcbiAgICAgICAgLm1hcChmdW5jdGlvbihlbDogT3BlcmFuZCkge1xuICAgICAgICAgIHJldHVybiBlbC50b1N0cmluZyhmdW5jKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oXCIsIFwiKSArXG4gICAgICBcIl1cIlxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZXZhbHVhdGUocHJvY2Vzc1ZhbHVlPzogUHJvY2Vzc1ZhbHVlKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzLm1hcChmdW5jdGlvbihlbDogT3BlcmFuZCkge1xuICAgICAgcmV0dXJuIGVsLmV2YWx1YXRlKHByb2Nlc3NWYWx1ZSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2V0VmFyaWFibGVzKHZhcmlhYmxlczogQXJyYXk8c3RyaW5nPikge1xuICAgIHRoaXMudmFsdWVzLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICBlbC5zZXRWYXJpYWJsZXModmFyaWFibGVzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBoYXNGdW5jdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZXMuc29tZSgob3BlcmFuZCkgPT4gb3BlcmFuZC5oYXNGdW5jdGlvbigpKTtcbiAgfVxuICBwdWJsaWMgaGFzQXN5bmNGdW5jdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZXMuc29tZSgob3BlcmFuZCkgPT4gb3BlcmFuZC5oYXNBc3luY0Z1bmN0aW9uKCkpO1xuICB9XG4gIHB1YmxpYyBhZGRUb0FzeW5jTGlzdChsaXN0OiBBcnJheTxGdW5jdGlvbk9wZXJhbmQ+KSB7XG4gICAgdGhpcy52YWx1ZXMuZm9yRWFjaCgob3BlcmFuZCkgPT4gb3BlcmFuZC5hZGRUb0FzeW5jTGlzdChsaXN0KSk7XG4gIH1cbiAgcHJvdGVjdGVkIGlzQ29udGVudEVxdWFsKG9wOiBPcGVyYW5kKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYU9wID0gPEFycmF5T3BlcmFuZD5vcDtcbiAgICBpZihhT3AudmFsdWVzLmxlbmd0aCAhPT0gdGhpcy52YWx1ZXMubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMudmFsdWVzLmxlbmd0aDsgaSArKykge1xuICAgICAgaWYoIWFPcC52YWx1ZXNbaV0uaXNFcXVhbCh0aGlzLnZhbHVlc1tpXSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbnN0IGV4dGVuZHMgT3BlcmFuZCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdmFsdWU6IGFueSkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJjb25zdFwiO1xuICB9XG4gIHB1YmxpYyB0b1N0cmluZyhmdW5jOiAob3A6IE9wZXJhbmQpID0+IHN0cmluZyA9IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKCEhZnVuYykge1xuICAgICAgdmFyIHJlcyA9IGZ1bmModGhpcyk7XG4gICAgICBpZiAoISFyZXMpIHJldHVybiByZXM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnZhbHVlLnRvU3RyaW5nKCk7XG4gIH1cbiAgcHVibGljIGdldCBjb3JyZWN0VmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb3JyZWN0VmFsdWUodGhpcy52YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgZXZhbHVhdGUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb3JyZWN0VmFsdWUodGhpcy52YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgc2V0VmFyaWFibGVzKHZhcmlhYmxlczogQXJyYXk8c3RyaW5nPikge31cbiAgcHJvdGVjdGVkIGdldENvcnJlY3RWYWx1ZSh2YWx1ZTogYW55KTogYW55IHtcbiAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPSBcInN0cmluZ1wiKSByZXR1cm4gdmFsdWU7XG4gICAgaWYgKHRoaXMuaXNCb29sZWFuVmFsdWUodmFsdWUpKSByZXR1cm4gdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gXCJ0cnVlXCI7XG4gICAgaWYgKFxuICAgICAgdmFsdWUubGVuZ3RoID4gMSAmJlxuICAgICAgdGhpcy5pc1F1b3RlKHZhbHVlWzBdKSAmJlxuICAgICAgdGhpcy5pc1F1b3RlKHZhbHVlW3ZhbHVlLmxlbmd0aCAtIDFdKVxuICAgIClcbiAgICAgIHJldHVybiB2YWx1ZS5zdWJzdHIoMSwgdmFsdWUubGVuZ3RoIC0gMik7XG4gICAgaWYgKE9wZXJhbmRNYWtlci5pc051bWVyaWModmFsdWUpKSB7XG4gICAgICBpZiAodmFsdWUuaW5kZXhPZihcIjB4XCIpID09IDApIHJldHVybiBwYXJzZUludCh2YWx1ZSk7XG4gICAgICBpZiAodmFsdWUubGVuZ3RoID4gMSAmJiB2YWx1ZVswXSA9PSBcIjBcIikgcmV0dXJuIHZhbHVlO1xuICAgICAgcmV0dXJuIHBhcnNlRmxvYXQodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIGlzQ29udGVudEVxdWFsKG9wOiBPcGVyYW5kKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY09wID0gPENvbnN0Pm9wO1xuICAgIHJldHVybiBjT3AudmFsdWUgPT0gdGhpcy52YWx1ZTtcbiAgfVxuICBwcml2YXRlIGlzUXVvdGUoY2g6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjaCA9PSBcIidcIiB8fCBjaCA9PSAnXCInO1xuICB9XG4gIHByaXZhdGUgaXNCb29sZWFuVmFsdWUodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB2YWx1ZSAmJlxuICAgICAgKHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiIHx8IHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09IFwiZmFsc2VcIilcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBWYXJpYWJsZSBleHRlbmRzIENvbnN0IHtcbiAgc3RhdGljIERpc2FibGVDb252ZXJzaW9uQ2hhciA9IFwiI1wiO1xuICBwcml2YXRlIHZhbHVlSW5mbzogYW55ID0ge307XG4gIHByaXZhdGUgdXNlVmFsdWVBc0l0SXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB2YXJpYWJsZU5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKFxuICAgICAgISF0aGlzLnZhcmlhYmxlTmFtZSAmJlxuICAgICAgdGhpcy52YXJpYWJsZU5hbWUubGVuZ3RoID4gMSAmJlxuICAgICAgdGhpcy52YXJpYWJsZU5hbWVbMF0gPT09IFZhcmlhYmxlLkRpc2FibGVDb252ZXJzaW9uQ2hhclxuICAgICkge1xuICAgICAgdGhpcy52YXJpYWJsZU5hbWUgPSB0aGlzLnZhcmlhYmxlTmFtZS5zdWJzdHIoMSk7XG4gICAgICB0aGlzLnVzZVZhbHVlQXNJdElzID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJ2YXJpYWJsZVwiO1xuICB9XG4gIHB1YmxpYyB0b1N0cmluZyhmdW5jOiAob3A6IE9wZXJhbmQpID0+IHN0cmluZyA9IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKCEhZnVuYykge1xuICAgICAgdmFyIHJlcyA9IGZ1bmModGhpcyk7XG4gICAgICBpZiAoISFyZXMpIHJldHVybiByZXM7XG4gICAgfVxuICAgIHZhciBwcmVmaXggPSB0aGlzLnVzZVZhbHVlQXNJdElzID8gVmFyaWFibGUuRGlzYWJsZUNvbnZlcnNpb25DaGFyIDogXCJcIjtcbiAgICByZXR1cm4gXCJ7XCIgKyBwcmVmaXggKyB0aGlzLnZhcmlhYmxlTmFtZSArIFwifVwiO1xuICB9XG4gIHB1YmxpYyBnZXQgdmFyaWFibGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy52YXJpYWJsZU5hbWU7XG4gIH1cbiAgcHVibGljIGV2YWx1YXRlKHByb2Nlc3NWYWx1ZT86IFByb2Nlc3NWYWx1ZSk6IGFueSB7XG4gICAgdGhpcy52YWx1ZUluZm8ubmFtZSA9IHRoaXMudmFyaWFibGVOYW1lO1xuICAgIHByb2Nlc3NWYWx1ZS5nZXRWYWx1ZUluZm8odGhpcy52YWx1ZUluZm8pO1xuICAgIHJldHVybiB0aGlzLnZhbHVlSW5mby5oYXNWYWx1ZVxuICAgICAgPyB0aGlzLmdldENvcnJlY3RWYWx1ZSh0aGlzLnZhbHVlSW5mby52YWx1ZSlcbiAgICAgIDogbnVsbDtcbiAgfVxuICBwdWJsaWMgc2V0VmFyaWFibGVzKHZhcmlhYmxlczogQXJyYXk8c3RyaW5nPikge1xuICAgIHZhcmlhYmxlcy5wdXNoKHRoaXMudmFyaWFibGVOYW1lKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Q29ycmVjdFZhbHVlKHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGlmICh0aGlzLnVzZVZhbHVlQXNJdElzKSByZXR1cm4gdmFsdWU7XG4gICAgcmV0dXJuIHN1cGVyLmdldENvcnJlY3RWYWx1ZSh2YWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGlzQ29udGVudEVxdWFsKG9wOiBPcGVyYW5kKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgdk9wID0gPFZhcmlhYmxlPm9wO1xuICAgIHJldHVybiB2T3AudmFyaWFibGUgPT0gdGhpcy52YXJpYWJsZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25PcGVyYW5kIGV4dGVuZHMgT3BlcmFuZCB7XG4gIHByaXZhdGUgaXNSZWFkeVZhbHVlOiBib29sZWFuO1xuICBwcml2YXRlIGFzeW5SZXN1bHQ6IGFueTtcbiAgcHVibGljIG9uQXN5bmNSZWFkeTogKCkgPT4gdm9pZDtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBvcmlnaW5hbFZhbHVlOiBzdHJpbmcsIHByaXZhdGUgcGFyYW1ldGVyczogQXJyYXlPcGVyYW5kKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmlzUmVhZHlWYWx1ZSA9IGZhbHNlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHBhcmFtZXRlcnMpICYmIHBhcmFtZXRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnBhcmFtZXRlcnMgPSBuZXcgQXJyYXlPcGVyYW5kKFtdKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmdW5jdGlvblwiO1xuICB9XG4gIHB1YmxpYyBldmFsdWF0ZUFzeW5jKHByb2Nlc3NWYWx1ZTogUHJvY2Vzc1ZhbHVlKSB7XG4gICAgdGhpcy5pc1JlYWR5VmFsdWUgPSBmYWxzZTtcbiAgICB2YXIgYXN5bmNQcm9jZXNzVmFsdWUgPSBuZXcgUHJvY2Vzc1ZhbHVlKCk7XG4gICAgYXN5bmNQcm9jZXNzVmFsdWUudmFsdWVzID0gSGVscGVycy5jcmVhdGVDb3B5KHByb2Nlc3NWYWx1ZS52YWx1ZXMpO1xuICAgIGFzeW5jUHJvY2Vzc1ZhbHVlLnByb3BlcnRpZXMgPSBIZWxwZXJzLmNyZWF0ZUNvcHkocHJvY2Vzc1ZhbHVlLnByb3BlcnRpZXMpO1xuICAgIGFzeW5jUHJvY2Vzc1ZhbHVlLnByb3BlcnRpZXMucmV0dXJuUmVzdWx0ID0gKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICB0aGlzLmFzeW5SZXN1bHQgPSByZXN1bHQ7XG4gICAgICB0aGlzLmlzUmVhZHlWYWx1ZSA9IHRydWU7XG4gICAgICB0aGlzLm9uQXN5bmNSZWFkeSgpO1xuICAgIH07XG4gICAgdGhpcy5ldmFsdWF0ZUNvcmUoYXN5bmNQcm9jZXNzVmFsdWUpO1xuICB9XG4gIHB1YmxpYyBldmFsdWF0ZShwcm9jZXNzVmFsdWU/OiBQcm9jZXNzVmFsdWUpOiBhbnkge1xuICAgIGlmICh0aGlzLmlzUmVhZHkpIHJldHVybiB0aGlzLmFzeW5SZXN1bHQ7XG4gICAgcmV0dXJuIHRoaXMuZXZhbHVhdGVDb3JlKHByb2Nlc3NWYWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBldmFsdWF0ZUNvcmUocHJvY2Vzc1ZhbHVlPzogUHJvY2Vzc1ZhbHVlKTogYW55IHtcbiAgICByZXR1cm4gRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJ1bihcbiAgICAgIHRoaXMub3JpZ2luYWxWYWx1ZSxcbiAgICAgIHRoaXMucGFyYW1ldGVycy5ldmFsdWF0ZShwcm9jZXNzVmFsdWUpLFxuICAgICAgcHJvY2Vzc1ZhbHVlLnByb3BlcnRpZXNcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKGZ1bmM6IChvcDogT3BlcmFuZCkgPT4gc3RyaW5nID0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKCEhZnVuYykge1xuICAgICAgdmFyIHJlcyA9IGZ1bmModGhpcyk7XG4gICAgICBpZiAoISFyZXMpIHJldHVybiByZXM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm9yaWdpbmFsVmFsdWUgKyBcIihcIiArIHRoaXMucGFyYW1ldGVycy50b1N0cmluZyhmdW5jKSArIFwiKVwiO1xuICB9XG5cbiAgcHVibGljIHNldFZhcmlhYmxlcyh2YXJpYWJsZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICB0aGlzLnBhcmFtZXRlcnMuc2V0VmFyaWFibGVzKHZhcmlhYmxlcyk7XG4gIH1cbiAgcHVibGljIGdldCBpc1JlYWR5KCkge1xuICAgIHJldHVybiB0aGlzLmlzUmVhZHlWYWx1ZTtcbiAgfVxuICBwdWJsaWMgaGFzRnVuY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIGhhc0FzeW5jRnVuY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5pc0FzeW5jRnVuY3Rpb24odGhpcy5vcmlnaW5hbFZhbHVlKTtcbiAgfVxuICBwdWJsaWMgYWRkVG9Bc3luY0xpc3QobGlzdDogQXJyYXk8RnVuY3Rpb25PcGVyYW5kPikge1xuICAgIGlmICh0aGlzLmhhc0FzeW5jRnVuY3Rpb24oKSkge1xuICAgICAgbGlzdC5wdXNoKHRoaXMpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgaXNDb250ZW50RXF1YWwob3A6IE9wZXJhbmQpOiBib29sZWFuIHtcbiAgICBjb25zdCBmT3AgPSA8RnVuY3Rpb25PcGVyYW5kPm9wO1xuICAgIHJldHVybiBmT3Aub3JpZ2luYWxWYWx1ZSA9PSB0aGlzLm9yaWdpbmFsVmFsdWUgJiYgdGhpcy5hcmVPcGVyYXRvcnNFcXVhbHMoZk9wLnBhcmFtZXRlcnMsIHRoaXMucGFyYW1ldGVycyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE9wZXJhbmRNYWtlciB7XG4gIHN0YXRpYyB0aHJvd0ludmFsaWRPcGVyYXRvckVycm9yKG9wOiBzdHJpbmcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIG9wZXJhdG9yOiAnXCIgKyBvcCArIFwiJ1wiKTtcbiAgfVxuXG4gIHN0YXRpYyBzYWZlVG9TdHJpbmcob3BlcmFuZDogT3BlcmFuZCwgZnVuYzogKG9wOiBPcGVyYW5kKSA9PiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBvcGVyYW5kID09IG51bGwgPyBcIlwiIDogb3BlcmFuZC50b1N0cmluZyhmdW5jKTtcbiAgfVxuXG4gIHN0YXRpYyB0b09wZXJhbmRTdHJpbmcodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKFxuICAgICAgISF2YWx1ZSAmJlxuICAgICAgIU9wZXJhbmRNYWtlci5pc051bWVyaWModmFsdWUpICYmXG4gICAgICAhT3BlcmFuZE1ha2VyLmlzQm9vbGVhblZhbHVlKHZhbHVlKVxuICAgIClcbiAgICAgIHZhbHVlID0gXCInXCIgKyB2YWx1ZSArIFwiJ1wiO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHN0YXRpYyBpc1NwYWNlU3RyaW5nKHN0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhc3RyICYmICFzdHIucmVwbGFjZShcIiBcIiwgXCJcIik7XG4gIH1cblxuICBzdGF0aWMgaXNOdW1lcmljKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoXG4gICAgICAhIXZhbHVlICYmXG4gICAgICAodmFsdWUuaW5kZXhPZihcIi1cIikgPiAtMSB8fFxuICAgICAgICB2YWx1ZS5pbmRleE9mKFwiK1wiKSA+IDEgfHxcbiAgICAgICAgdmFsdWUuaW5kZXhPZihcIipcIikgPiAtMSB8fFxuICAgICAgICB2YWx1ZS5pbmRleE9mKFwiXlwiKSA+IC0xIHx8XG4gICAgICAgIHZhbHVlLmluZGV4T2YoXCIvXCIpID4gLTEgfHxcbiAgICAgICAgdmFsdWUuaW5kZXhPZihcIiVcIikgPiAtMSlcbiAgICApXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKE9wZXJhbmRNYWtlci5pc1NwYWNlU3RyaW5nKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBIZWxwZXJzLmlzTnVtYmVyKHZhbHVlKTtcbiAgfVxuXG4gIHN0YXRpYyBpc0Jvb2xlYW5WYWx1ZSh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhdmFsdWUgJiZcbiAgICAgICh2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSBcInRydWVcIiB8fCB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSBcImZhbHNlXCIpXG4gICAgKTtcbiAgfVxuICBzdGF0aWMgY291bnREZWNpbWFscyh2YWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAoTWF0aC5mbG9vcih2YWx1ZSkgIT09IHZhbHVlKSB7XG4gICAgICBjb25zdCBzdHJzID0gdmFsdWUudG9TdHJpbmcoKS5zcGxpdChcIi5cIik7XG4gICAgICByZXR1cm4gc3Rycy5sZW5ndGggPiAxICYmIHN0cnNbMV0ubGVuZ3RoIHx8IDA7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG4gIHN0YXRpYyBwbHVzTWludXMoYTogbnVtYmVyLCBiOiBudW1iZXIsIHJlczogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBkaWdpdHNBID0gT3BlcmFuZE1ha2VyLmNvdW50RGVjaW1hbHMoYSk7XG4gICAgY29uc3QgZGlnaXRzQiA9IE9wZXJhbmRNYWtlci5jb3VudERlY2ltYWxzKGIpO1xuICAgIGlmKGRpZ2l0c0EgPiAwIHx8IGRpZ2l0c0IgPiAwKSB7XG4gICAgICBjb25zdCBkaWdpdHMgPSBNYXRoLm1heChkaWdpdHNBLCBkaWdpdHNCKTtcbiAgICAgIHJlcyA9IHBhcnNlRmxvYXQocmVzLnRvRml4ZWQoZGlnaXRzKSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuc3RhdGljIHVuYXJ5RnVuY3Rpb25zOiBIYXNoVGFibGU8RnVuY3Rpb24+ID0ge1xuICBlbXB0eTogZnVuY3Rpb24odmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBIZWxwZXJzLmlzVmFsdWVFbXB0eSh2YWx1ZSk7XG4gIH0sXG4gIG5vdGVtcHR5OiBmdW5jdGlvbih2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICFPcGVyYW5kTWFrZXIudW5hcnlGdW5jdGlvbnMuZW1wdHkodmFsdWUpO1xuICB9LFxuICBuZWdhdGU6IGZ1bmN0aW9uKHZhbHVlOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF2YWx1ZTtcbiAgfSxcbn07XG5cbiAgc3RhdGljIGJpbmFyeUZ1bmN0aW9uczogSGFzaFRhYmxlPEZ1bmN0aW9uPiA9IHtcbiAgICBhcml0aG1ldGljT3Aob3BlcmF0b3JOYW1lOiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihhOiBhbnksIGI6IGFueSk6IGFueSB7XG4gICAgICAgIGlmIChIZWxwZXJzLmlzVmFsdWVFbXB0eShhKSAmJiAhT3BlcmFuZE1ha2VyLmlzU3BhY2VTdHJpbmcoYSkpIHtcbiAgICAgICAgICBhID0gdHlwZW9mIGIgPT09IFwic3RyaW5nXCIgPyBcIlwiIDogMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSGVscGVycy5pc1ZhbHVlRW1wdHkoYikgJiYgIU9wZXJhbmRNYWtlci5pc1NwYWNlU3RyaW5nKGIpKSB7XG4gICAgICAgICAgYiA9IHR5cGVvZiBhID09PSBcInN0cmluZ1wiID8gXCJcIiA6IDA7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY29uc3VtZXIgPSBPcGVyYW5kTWFrZXIuYmluYXJ5RnVuY3Rpb25zW29wZXJhdG9yTmFtZV07XG4gICAgICAgIHJldHVybiBjb25zdW1lciA9PSBudWxsID8gbnVsbCA6IGNvbnN1bWVyLmNhbGwodGhpcywgYSwgYik7XG4gICAgICB9O1xuICAgIH0sXG4gICAgYW5kOiBmdW5jdGlvbihhOiBib29sZWFuLCBiOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gYSAmJiBiO1xuICAgIH0sXG4gICAgb3I6IGZ1bmN0aW9uKGE6IGJvb2xlYW4sIGI6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBhIHx8IGI7XG4gICAgfSxcbiAgICBwbHVzOiBmdW5jdGlvbihhOiBhbnksIGI6IGFueSk6IGFueSB7XG4gICAgICByZXR1cm4gT3BlcmFuZE1ha2VyLnBsdXNNaW51cyhhLCBiLCBhICsgYik7XG4gICAgfSxcbiAgICBtaW51czogZnVuY3Rpb24oYTogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIE9wZXJhbmRNYWtlci5wbHVzTWludXMoYSwgYiwgYSAtIGIpO1xuICAgIH0sXG4gICAgbXVsOiBmdW5jdGlvbihhOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlciB7XG4gICAgICBsZXQgcmVzID0gYSAqIGI7XG4gICAgICBjb25zdCBkaWdpdHMgPSBPcGVyYW5kTWFrZXIuY291bnREZWNpbWFscyhhKSArIE9wZXJhbmRNYWtlci5jb3VudERlY2ltYWxzKGIpO1xuICAgICAgaWYoZGlnaXRzID4gMCkge1xuICAgICAgICByZXMgPSBwYXJzZUZsb2F0KHJlcy50b0ZpeGVkKGRpZ2l0cykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9LFxuICAgIGRpdjogZnVuY3Rpb24oYTogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgaWYgKCFiKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiBhIC8gYjtcbiAgICB9LFxuICAgIG1vZDogZnVuY3Rpb24oYTogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgaWYgKCFiKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiBhICUgYjtcbiAgICB9LFxuICAgIHBvd2VyOiBmdW5jdGlvbihhOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlciB7XG4gICAgICByZXR1cm4gTWF0aC5wb3coYSwgYik7XG4gICAgfSxcbiAgICBncmVhdGVyOiBmdW5jdGlvbihsZWZ0OiBhbnksIHJpZ2h0OiBhbnkpOiBib29sZWFuIHtcbiAgICAgIGlmIChsZWZ0ID09IG51bGwgfHwgcmlnaHQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIGxlZnQgPiByaWdodDtcbiAgICB9LFxuICAgIGxlc3M6IGZ1bmN0aW9uKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgaWYgKGxlZnQgPT0gbnVsbCB8fCByaWdodCA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gbGVmdCA8IHJpZ2h0O1xuICAgIH0sXG4gICAgZ3JlYXRlcm9yZXF1YWw6IGZ1bmN0aW9uKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgaWYgKE9wZXJhbmRNYWtlci5iaW5hcnlGdW5jdGlvbnMuZXF1YWwobGVmdCwgcmlnaHQpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIHJldHVybiBPcGVyYW5kTWFrZXIuYmluYXJ5RnVuY3Rpb25zLmdyZWF0ZXIobGVmdCwgcmlnaHQpO1xuICAgIH0sXG4gICAgbGVzc29yZXF1YWw6IGZ1bmN0aW9uKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgaWYgKE9wZXJhbmRNYWtlci5iaW5hcnlGdW5jdGlvbnMuZXF1YWwobGVmdCwgcmlnaHQpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIHJldHVybiBPcGVyYW5kTWFrZXIuYmluYXJ5RnVuY3Rpb25zLmxlc3MobGVmdCwgcmlnaHQpO1xuICAgIH0sXG4gICAgZXF1YWw6IGZ1bmN0aW9uKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIE9wZXJhbmRNYWtlci5pc1R3b1ZhbHVlRXF1YWxzKGxlZnQsIHJpZ2h0KTtcbiAgICB9LFxuICAgIG5vdGVxdWFsOiBmdW5jdGlvbihsZWZ0OiBhbnksIHJpZ2h0OiBhbnkpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiAhT3BlcmFuZE1ha2VyLmJpbmFyeUZ1bmN0aW9ucy5lcXVhbChsZWZ0LCByaWdodCk7XG4gICAgfSxcbiAgICBjb250YWluczogZnVuY3Rpb24obGVmdDogYW55LCByaWdodDogYW55KTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gT3BlcmFuZE1ha2VyLmJpbmFyeUZ1bmN0aW9ucy5jb250YWluc0NvcmUobGVmdCwgcmlnaHQsIHRydWUpO1xuICAgIH0sXG4gICAgbm90Y29udGFpbnM6IGZ1bmN0aW9uKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgaWYgKCFsZWZ0ICYmICFIZWxwZXJzLmlzVmFsdWVFbXB0eShyaWdodCkpIHJldHVybiB0cnVlO1xuICAgICAgcmV0dXJuIE9wZXJhbmRNYWtlci5iaW5hcnlGdW5jdGlvbnMuY29udGFpbnNDb3JlKGxlZnQsIHJpZ2h0LCBmYWxzZSk7XG4gICAgfSxcbiAgICBhbnlvZjogZnVuY3Rpb24obGVmdDogYW55LCByaWdodDogYW55KTogYm9vbGVhbiB7XG4gICAgICBpZiAoSGVscGVycy5pc1ZhbHVlRW1wdHkobGVmdCkgJiYgSGVscGVycy5pc1ZhbHVlRW1wdHkocmlnaHQpKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChcbiAgICAgICAgSGVscGVycy5pc1ZhbHVlRW1wdHkobGVmdCkgfHxcbiAgICAgICAgKCFBcnJheS5pc0FycmF5KGxlZnQpICYmIGxlZnQubGVuZ3RoID09PSAwKVxuICAgICAgKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoSGVscGVycy5pc1ZhbHVlRW1wdHkocmlnaHQpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShsZWZ0KSlcbiAgICAgICAgcmV0dXJuIE9wZXJhbmRNYWtlci5iaW5hcnlGdW5jdGlvbnMuY29udGFpbnMocmlnaHQsIGxlZnQpO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJpZ2h0KSlcbiAgICAgICAgcmV0dXJuIE9wZXJhbmRNYWtlci5iaW5hcnlGdW5jdGlvbnMuY29udGFpbnMobGVmdCwgcmlnaHQpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByaWdodC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoT3BlcmFuZE1ha2VyLmJpbmFyeUZ1bmN0aW9ucy5jb250YWlucyhsZWZ0LCByaWdodFtpXSkpIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG4gICAgYWxsb2Y6IGZ1bmN0aW9uKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgaWYgKCFsZWZ0ICYmICFIZWxwZXJzLmlzVmFsdWVFbXB0eShyaWdodCkpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShyaWdodCkpXG4gICAgICAgIHJldHVybiBPcGVyYW5kTWFrZXIuYmluYXJ5RnVuY3Rpb25zLmNvbnRhaW5zKGxlZnQsIHJpZ2h0KTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmlnaHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCFPcGVyYW5kTWFrZXIuYmluYXJ5RnVuY3Rpb25zLmNvbnRhaW5zKGxlZnQsIHJpZ2h0W2ldKSlcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIGNvbnRhaW5zQ29yZTogZnVuY3Rpb24obGVmdDogYW55LCByaWdodDogYW55LCBpc0NvbnRhaW5zOiBhbnkpOiBib29sZWFuIHtcbiAgICAgIGlmICghbGVmdCAmJiBsZWZ0ICE9PSAwICYmIGxlZnQgIT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoIWxlZnQubGVuZ3RoKSB7XG4gICAgICAgIGxlZnQgPSBsZWZ0LnRvU3RyaW5nKCk7XG4gICAgICAgIGlmICh0eXBlb2YgcmlnaHQgPT09IFwic3RyaW5nXCIgfHwgcmlnaHQgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgICAgICBsZWZ0ID0gbGVmdC50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgIHJpZ2h0ID0gcmlnaHQudG9VcHBlckNhc2UoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBsZWZ0ID09PSBcInN0cmluZ1wiIHx8IGxlZnQgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgICAgaWYgKCFyaWdodCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByaWdodCA9IHJpZ2h0LnRvU3RyaW5nKCk7XG4gICAgICAgIHZhciBmb3VuZCA9IGxlZnQuaW5kZXhPZihyaWdodCkgPiAtMTtcbiAgICAgICAgcmV0dXJuIGlzQ29udGFpbnMgPyBmb3VuZCA6ICFmb3VuZDtcbiAgICAgIH1cbiAgICAgIHZhciByaWdodEFycmF5ID0gQXJyYXkuaXNBcnJheShyaWdodCkgPyByaWdodCA6IFtyaWdodF07XG4gICAgICBmb3IgKHZhciBySW5kZXggPSAwOyBySW5kZXggPCByaWdodEFycmF5Lmxlbmd0aDsgckluZGV4KyspIHtcbiAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICByaWdodCA9IHJpZ2h0QXJyYXlbckluZGV4XTtcbiAgICAgICAgZm9yICg7IGkgPCBsZWZ0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKE9wZXJhbmRNYWtlci5pc1R3b1ZhbHVlRXF1YWxzKGxlZnRbaV0sIHJpZ2h0KSkgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPT0gbGVmdC5sZW5ndGgpIHJldHVybiAhaXNDb250YWlucztcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc0NvbnRhaW5zO1xuICAgIH0sXG4gIH07XG5cbiAgc3RhdGljIGlzVHdvVmFsdWVFcXVhbHMoeDogYW55LCB5OiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoeCA9PT0gXCJ1bmRlZmluZWRcIikgeCA9IHVuZGVmaW5lZDtcbiAgICBpZiAoeSA9PT0gXCJ1bmRlZmluZWRcIikgeSA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gSGVscGVycy5pc1R3b1ZhbHVlRXF1YWxzKHgsIHksIHRydWUpO1xuICB9XG5cbiAgc3RhdGljIG9wZXJhdG9yVG9TdHJpbmcob3BlcmF0b3JOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBvcFN0ciA9IE9wZXJhbmRNYWtlci5zaWduc1tvcGVyYXRvck5hbWVdO1xuICAgIHJldHVybiBvcFN0ciA9PSBudWxsID8gb3BlcmF0b3JOYW1lIDogb3BTdHI7XG4gIH1cblxuICBzdGF0aWMgc2lnbnM6IEhhc2hUYWJsZTxzdHJpbmc+ID0ge1xuICAgIGxlc3M6IFwiPFwiLFxuICAgIGxlc3NvcmVxdWFsOiBcIjw9XCIsXG4gICAgZ3JlYXRlcjogXCI+XCIsXG4gICAgZ3JlYXRlcm9yZXF1YWw6IFwiPj1cIixcbiAgICBlcXVhbDogXCI9PVwiLFxuICAgIG5vdGVxdWFsOiBcIiE9XCIsXG4gICAgcGx1czogXCIrXCIsXG4gICAgbWludXM6IFwiLVwiLFxuICAgIG11bDogXCIqXCIsXG4gICAgZGl2OiBcIi9cIixcbiAgICBhbmQ6IFwiYW5kXCIsXG4gICAgb3I6IFwib3JcIixcbiAgICBwb3dlcjogXCJeXCIsXG4gICAgbW9kOiBcIiVcIixcbiAgICBuZWdhdGU6IFwiIVwiLFxuICB9O1xufVxuIiwiaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IElFbGVtZW50LCBJUXVlc3Rpb24gfSBmcm9tIFwiLi9iYXNlLWludGVyZmFjZXNcIjtcbmltcG9ydCB7IFBhbmVsTW9kZWwgfSBmcm9tIFwiLi9wYW5lbFwiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuXG4vKipcbiAqIFRoZSBmbG93IHBhbmVsIG9iamVjdC4gSXQgaXMgYSBjb250YWluZXIgd2l0aCBmbG93IGxheW91dCB3aGVyZSB5b3UgY2FuIG1peCBxdWVzdGlvbnMgd2l0aCBtYXJrZG93biB0ZXh0LlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIEZsb3dQYW5lbE1vZGVsIGV4dGVuZHMgUGFuZWxNb2RlbCB7XG4gIHN0YXRpYyBjb250ZW50RWxlbWVudE5hbWVQcmVmaXggPSBcImVsZW1lbnQ6XCI7XG4gIHB1YmxpYyBjb250ZW50Q2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBwdWJsaWMgb25HZXRIdG1sRm9yUXVlc3Rpb246IChxdWVzdGlvbjogUXVlc3Rpb24pID0+IHN0cmluZztcbiAgcHVibGljIG9uQ3VzdG9tSHRtbFByb2R1Y2luZzogKCkgPT4gc3RyaW5nO1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcgPSBcIlwiKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImNvbnRlbnRcIiwgdGhpcywgdHJ1ZSk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJjb250ZW50XCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYub25Db250ZW50Q2hhbmdlZCgpO1xuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZmxvd3BhbmVsXCI7XG4gIH1cbiAgZ2V0Q2hpbGRyZW5MYXlvdXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZmxvd1wiO1xuICB9XG4gIG9uU3VydmV5TG9hZCgpOiBhbnkge1xuICAgIHN1cGVyLm9uU3VydmV5TG9hZCgpO1xuICAgIHRoaXMub25Db250ZW50Q2hhbmdlZCgpO1xuICB9XG4gIHB1YmxpYyBnZXQgY29udGVudCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImNvbnRlbnRcIik7XG4gIH1cbiAgcHVibGljIHNldCBjb250ZW50KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb250ZW50XCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBsb2NDb250ZW50KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImNvbnRlbnRcIik7XG4gIH1cbiAgcHVibGljIGdldCBodG1sKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImh0bWxcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBodG1sKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaHRtbFwiLCB2YWwpO1xuICB9XG4gIHByb3RlY3RlZCBvbkNvbnRlbnRDaGFuZ2VkKCk6IGFueSB7XG4gICAgdmFyIGh0bWwgPSBcIlwiO1xuICAgIGlmICghIXRoaXMub25DdXN0b21IdG1sUHJvZHVjaW5nKSB7XG4gICAgICBodG1sID0gdGhpcy5vbkN1c3RvbUh0bWxQcm9kdWNpbmcoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaHRtbCA9IHRoaXMucHJvZHVjZUh0bWwoKTtcbiAgICB9XG4gICAgdGhpcy5odG1sID0gaHRtbDtcbiAgICBpZiAoISF0aGlzLmNvbnRlbnRDaGFuZ2VkQ2FsbGJhY2spIHRoaXMuY29udGVudENoYW5nZWRDYWxsYmFjaygpO1xuICB9XG4gIHB1YmxpYyBwcm9kdWNlSHRtbCgpOiBzdHJpbmcge1xuICAgIHZhciBodG1sID0gW107XG4gICAgLy9jb250ZW50RWxlbWVudE5hbWVQcmVmaXhcbiAgICB2YXIgcmVnRXggPSAveyguKj8oZWxlbWVudDopW14kXS4qPyl9L2c7XG4gICAgdmFyIHN0ciA9IHRoaXMuY29udGVudDtcbiAgICB2YXIgc3RhcnRJbmRleCA9IDA7XG4gICAgdmFyIHJlcyA9IG51bGw7XG4gICAgd2hpbGUgKChyZXMgPSByZWdFeC5leGVjKHN0cikpICE9PSBudWxsKSB7XG4gICAgICBpZiAocmVzLmluZGV4ID4gc3RhcnRJbmRleCkge1xuICAgICAgICBodG1sLnB1c2goc3RyLnN1YnN0cihzdGFydEluZGV4LCByZXMuaW5kZXggLSBzdGFydEluZGV4KSk7XG4gICAgICAgIHN0YXJ0SW5kZXggPSByZXMuaW5kZXg7XG4gICAgICB9XG4gICAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmdldFF1ZXN0aW9uRnJvbVRleHQocmVzWzBdKTtcbiAgICAgIGlmICghIXF1ZXN0aW9uKSB7XG4gICAgICAgIGh0bWwucHVzaCh0aGlzLmdldEh0bWxGb3JRdWVzdGlvbihxdWVzdGlvbikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaHRtbC5wdXNoKFxuICAgICAgICAgIHN0ci5zdWJzdHIoc3RhcnRJbmRleCwgcmVzLmluZGV4ICsgcmVzWzBdLmxlbmd0aCAtIHN0YXJ0SW5kZXgpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBzdGFydEluZGV4ID0gcmVzLmluZGV4ICsgcmVzWzBdLmxlbmd0aDtcbiAgICB9XG4gICAgaWYgKHN0YXJ0SW5kZXggPCBzdHIubGVuZ3RoKSB7XG4gICAgICBodG1sLnB1c2goc3RyLnN1YnN0cihzdGFydEluZGV4LCBzdHIubGVuZ3RoIC0gc3RhcnRJbmRleCkpO1xuICAgIH1cbiAgICByZXR1cm4gaHRtbC5qb2luKFwiXCIpLnJlcGxhY2UobmV3IFJlZ0V4cChcIjxicj5cIiwgXCJnXCIpLCBcIjxici8+XCIpO1xuICB9XG4gIHB1YmxpYyBnZXRRdWVzdGlvbkZyb21UZXh0KHN0cjogc3RyaW5nKTogUXVlc3Rpb24ge1xuICAgIHN0ciA9IHN0ci5zdWJzdHIoMSwgc3RyLmxlbmd0aCAtIDIpO1xuICAgIHN0ciA9IHN0ci5yZXBsYWNlKEZsb3dQYW5lbE1vZGVsLmNvbnRlbnRFbGVtZW50TmFtZVByZWZpeCwgXCJcIikudHJpbSgpO1xuICAgIHJldHVybiB0aGlzLmdldFF1ZXN0aW9uQnlOYW1lKHN0cik7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEh0bWxGb3JRdWVzdGlvbihxdWVzdGlvbjogUXVlc3Rpb24pOiBzdHJpbmcge1xuICAgIGlmICghIXRoaXMub25HZXRIdG1sRm9yUXVlc3Rpb24pIHJldHVybiB0aGlzLm9uR2V0SHRtbEZvclF1ZXN0aW9uKHF1ZXN0aW9uKTtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0UXVlc3Rpb25IdG1sSWQocXVlc3Rpb246IFF1ZXN0aW9uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lICsgXCJfXCIgKyBxdWVzdGlvbi5pZDtcbiAgfVxuICBwcm90ZWN0ZWQgb25BZGRFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50LCBpbmRleDogbnVtYmVyKSB7XG4gICAgc3VwZXIub25BZGRFbGVtZW50KGVsZW1lbnQsIGluZGV4KTtcbiAgICB0aGlzLmFkZEVsZW1lbnRUb0NvbnRlbnQoZWxlbWVudCk7XG4gICAgZWxlbWVudC5yZW5kZXJXaWR0aCA9IFwiXCI7XG4gIH1cbiAgcHJvdGVjdGVkIG9uUmVtb3ZlRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCkge1xuICAgIHZhciBzZWFyY2hTdHIgPSB0aGlzLmdldEVsZW1lbnRDb250ZW50VGV4dChlbGVtZW50KTtcbiAgICB0aGlzLmNvbnRlbnQgPSB0aGlzLmNvbnRlbnQucmVwbGFjZShzZWFyY2hTdHIsIFwiXCIpO1xuICAgIHN1cGVyLm9uUmVtb3ZlRWxlbWVudChlbGVtZW50KTtcbiAgfVxuICBkcmFnRHJvcE1vdmVFbGVtZW50KHNyYzogSUVsZW1lbnQsIHRhcmdldDogSUVsZW1lbnQsIHRhcmdldEluZGV4OiBudW1iZXIpIHt9XG4gIHByaXZhdGUgYWRkRWxlbWVudFRvQ29udGVudChlbGVtZW50OiBJRWxlbWVudCkge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdmFyIHRleHQgPSB0aGlzLmdldEVsZW1lbnRDb250ZW50VGV4dChlbGVtZW50KTtcbiAgICBpZiAoIXRoaXMuaW5zZXJ0VGV4dEF0Q3Vyc29yKHRleHQpKSB7XG4gICAgICB0aGlzLmNvbnRlbnQgPSB0aGlzLmNvbnRlbnQgKyB0ZXh0O1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGluc2VydFRleHRBdEN1cnNvcih0ZXh0OiBzdHJpbmcsIHByZXZOYW1lOiBzdHJpbmcgPSBudWxsKTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuaXNEZXNpZ25Nb2RlIHx8XG4gICAgICB0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgICF3aW5kb3cuZ2V0U2VsZWN0aW9uXG4gICAgKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgaWYgKHNlbC5nZXRSYW5nZUF0ICYmIHNlbC5yYW5nZUNvdW50KSB7XG4gICAgICBsZXQgcmFuZ2UgPSBzZWwuZ2V0UmFuZ2VBdCgwKTtcbiAgICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7XG4gICAgICByYW5nZS5pbnNlcnROb2RlKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpKTtcbiAgICAgIHZhciBzZWxmID0gPGFueT50aGlzO1xuICAgICAgaWYgKHNlbGYuZ2V0Q29udGVudCkge1xuICAgICAgICB2YXIgc3RyID0gc2VsZi5nZXRDb250ZW50KHByZXZOYW1lKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0gc3RyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgZ2V0RWxlbWVudENvbnRlbnRUZXh0KGVsZW1lbnQ6IElFbGVtZW50KSB7XG4gICAgcmV0dXJuIFwie1wiICsgRmxvd1BhbmVsTW9kZWwuY29udGVudEVsZW1lbnROYW1lUHJlZml4ICsgZWxlbWVudC5uYW1lICsgXCJ9XCI7XG4gIH1cbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJmbG93cGFuZWxcIixcbiAgW3sgbmFtZTogXCJjb250ZW50Omh0bWxcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0NvbnRlbnRcIiB9XSxcbiAgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgRmxvd1BhbmVsTW9kZWwoKTtcbiAgfSxcbiAgXCJwYW5lbFwiXG4pO1xuIiwiaW1wb3J0IHsgSGFzaFRhYmxlLCBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25GYWN0b3J5IHtcbiAgcHVibGljIHN0YXRpYyBJbnN0YW5jZTogRnVuY3Rpb25GYWN0b3J5ID0gbmV3IEZ1bmN0aW9uRmFjdG9yeSgpO1xuICBwcml2YXRlIGZ1bmN0aW9uSGFzaDogSGFzaFRhYmxlPChwYXJhbXM6IGFueVtdKSA9PiBhbnk+ID0ge307XG4gIHByaXZhdGUgaXNBc3luY0hhc2g6IEhhc2hUYWJsZTxib29sZWFuPiA9IHt9O1xuXG4gIHB1YmxpYyByZWdpc3RlcihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZnVuYzogKHBhcmFtczogYW55W10pID0+IGFueSxcbiAgICBpc0FzeW5jOiBib29sZWFuID0gZmFsc2VcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5mdW5jdGlvbkhhc2hbbmFtZV0gPSBmdW5jO1xuICAgIGlmIChpc0FzeW5jKSB0aGlzLmlzQXN5bmNIYXNoW25hbWVdID0gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgdW5yZWdpc3RlcihuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBkZWxldGUgdGhpcy5mdW5jdGlvbkhhc2hbbmFtZV07XG4gICAgZGVsZXRlIHRoaXMuaXNBc3luY0hhc2hbbmFtZV07XG4gIH1cbiAgcHVibGljIGhhc0Z1bmN0aW9uKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZnVuY3Rpb25IYXNoW25hbWVdO1xuICB9XG4gIHB1YmxpYyBpc0FzeW5jRnVuY3Rpb24obmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5pc0FzeW5jSGFzaFtuYW1lXTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmZ1bmN0aW9uSGFzaCA9IHt9O1xuICB9XG4gIHB1YmxpYyBnZXRBbGwoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmZ1bmN0aW9uSGFzaCkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdC5zb3J0KCk7XG4gIH1cbiAgcHVibGljIHJ1bihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBhbnlbXSxcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PiA9IG51bGxcbiAgKTogYW55IHtcbiAgICB2YXIgZnVuYyA9IHRoaXMuZnVuY3Rpb25IYXNoW25hbWVdO1xuICAgIGlmICghZnVuYykgcmV0dXJuIG51bGw7XG4gICAgbGV0IGNsYXNzUnVubmVyID0ge1xuICAgICAgZnVuYzogZnVuYyxcbiAgICB9O1xuXG4gICAgaWYgKHByb3BlcnRpZXMpIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiBwcm9wZXJ0aWVzKSB7XG4gICAgICAgICg8YW55PmNsYXNzUnVubmVyKVtrZXldID0gcHJvcGVydGllc1trZXldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2xhc3NSdW5uZXIuZnVuYyhwYXJhbXMpO1xuICB9XG59XG5cbmV4cG9ydCB2YXIgcmVnaXN0ZXJGdW5jdGlvbiA9IEZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlcjtcblxuZnVuY3Rpb24gZ2V0UGFyYW1zQXNBcnJheSh2YWx1ZTogYW55LCBhcnI6IGFueVtdKSB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSByZXR1cm47XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGdldFBhcmFtc0FzQXJyYXkodmFsdWVbaV0sIGFycik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChIZWxwZXJzLmlzTnVtYmVyKHZhbHVlKSkge1xuICAgICAgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICB9XG4gICAgYXJyLnB1c2godmFsdWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN1bShwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgdmFyIGFycjogYW55W10gPSBbXTtcbiAgZ2V0UGFyYW1zQXNBcnJheShwYXJhbXMsIGFycik7XG4gIHZhciByZXMgPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgIHJlcyArPSBhcnJbaV07XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbkZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlcihcInN1bVwiLCBzdW0pO1xuXG5mdW5jdGlvbiBtaW5fbWF4KHBhcmFtczogYW55W10sIGlzTWluOiBib29sZWFuKTogYW55IHtcbiAgdmFyIGFycjogYW55W10gPSBbXTtcbiAgZ2V0UGFyYW1zQXNBcnJheShwYXJhbXMsIGFycik7XG4gIHZhciByZXMgPSB1bmRlZmluZWQ7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHJlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXMgPSBhcnJbaV07XG4gICAgfVxuICAgIGlmIChpc01pbikge1xuICAgICAgaWYgKHJlcyA+IGFycltpXSkgcmVzID0gYXJyW2ldO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocmVzIDwgYXJyW2ldKSByZXMgPSBhcnJbaV07XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIG1pbihwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgcmV0dXJuIG1pbl9tYXgocGFyYW1zLCB0cnVlKTtcbn1cbkZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlcihcIm1pblwiLCBtaW4pO1xuXG5mdW5jdGlvbiBtYXgocGFyYW1zOiBhbnlbXSk6IGFueSB7XG4gIHJldHVybiBtaW5fbWF4KHBhcmFtcywgZmFsc2UpO1xufVxuRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyKFwibWF4XCIsIG1heCk7XG5cbmZ1bmN0aW9uIGNvdW50KHBhcmFtczogYW55W10pOiBhbnkge1xuICB2YXIgYXJyOiBhbnlbXSA9IFtdO1xuICBnZXRQYXJhbXNBc0FycmF5KHBhcmFtcywgYXJyKTtcbiAgcmV0dXJuIGFyci5sZW5ndGg7XG59XG5GdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXIoXCJjb3VudFwiLCBjb3VudCk7XG5cbmZ1bmN0aW9uIGF2ZyhwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgdmFyIGFycjogYW55W10gPSBbXTtcbiAgZ2V0UGFyYW1zQXNBcnJheShwYXJhbXMsIGFycik7XG4gIHZhciByZXMgPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgIHJlcyArPSBhcnJbaV07XG4gIH1cbiAgcmV0dXJuIGFyci5sZW5ndGggPiAwID8gcmVzIC8gYXJyLmxlbmd0aCA6IDA7XG59XG5GdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXIoXCJhdmdcIiwgYXZnKTtcblxuZnVuY3Rpb24gZ2V0SW5BcnJheVBhcmFtcyhwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgaWYgKHBhcmFtcy5sZW5ndGggIT0gMikgcmV0dXJuIG51bGw7XG4gIHZhciBhcnIgPSBwYXJhbXNbMF07XG4gIGlmICghYXJyKSByZXR1cm4gbnVsbDtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGFycikgJiYgIUFycmF5LmlzQXJyYXkoT2JqZWN0LmtleXMoYXJyKSkpIHJldHVybiBudWxsO1xuICB2YXIgbmFtZSA9IHBhcmFtc1sxXTtcbiAgaWYgKHR5cGVvZiBuYW1lICE9PSBcInN0cmluZ1wiICYmICEobmFtZSBpbnN0YW5jZW9mIFN0cmluZykpIHJldHVybiBudWxsO1xuICByZXR1cm4geyBkYXRhOiBhcnIsIG5hbWU6IG5hbWUgfTtcbn1cblxuZnVuY3Rpb24gY2FsY0luQXJyYXkoXG4gIHBhcmFtczogYW55W10sXG4gIGZ1bmM6IChyZXM6IG51bWJlciwgdmFsOiBudW1iZXIpID0+IG51bWJlclxuKTogYW55IHtcbiAgdmFyIHYgPSBnZXRJbkFycmF5UGFyYW1zKHBhcmFtcyk7XG4gIGlmICghdikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgdmFyIHJlcyA9IHVuZGVmaW5lZDtcbiAgaWYgKEFycmF5LmlzQXJyYXkodi5kYXRhKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdi5kYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXRlbSA9IHYuZGF0YVtpXTtcbiAgICAgIGlmICghIWl0ZW0gJiYgaXRlbVs8c3RyaW5nPnYubmFtZV0pIHtcbiAgICAgICAgcmVzID0gZnVuYyhyZXMsIGl0ZW1bPHN0cmluZz52Lm5hbWVdKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yICh2YXIga2V5IGluIHYuZGF0YSkge1xuICAgICAgdmFyIGl0ZW0gPSB2LmRhdGFba2V5XTtcbiAgICAgIGlmICghIWl0ZW0gJiYgaXRlbVs8c3RyaW5nPnYubmFtZV0pIHtcbiAgICAgICAgcmVzID0gZnVuYyhyZXMsIGl0ZW1bPHN0cmluZz52Lm5hbWVdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuZnVuY3Rpb24gc3VtSW5BcnJheShwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgdmFyIHJlcyA9IGNhbGNJbkFycmF5KHBhcmFtcywgZnVuY3Rpb24ocmVzOiBudW1iZXIsIHZhbDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAocmVzID09IHVuZGVmaW5lZCkgcmVzID0gMDtcbiAgICByZXR1cm4gK3JlcyArICt2YWw7XG4gIH0pO1xuICByZXR1cm4gcmVzICE9PSB1bmRlZmluZWQgPyByZXMgOiAwO1xufVxuRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyKFwic3VtSW5BcnJheVwiLCBzdW1JbkFycmF5KTtcblxuZnVuY3Rpb24gbWluSW5BcnJheShwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgcmV0dXJuIGNhbGNJbkFycmF5KHBhcmFtcywgZnVuY3Rpb24ocmVzOiBudW1iZXIsIHZhbDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAocmVzID09IHVuZGVmaW5lZCkgcmV0dXJuIHZhbDtcbiAgICByZXR1cm4gcmVzIDwgdmFsID8gcmVzIDogdmFsO1xuICB9KTtcbn1cbkZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlcihcIm1pbkluQXJyYXlcIiwgbWluSW5BcnJheSk7XG5cbmZ1bmN0aW9uIG1heEluQXJyYXkocGFyYW1zOiBhbnlbXSk6IGFueSB7XG4gIHJldHVybiBjYWxjSW5BcnJheShwYXJhbXMsIGZ1bmN0aW9uKHJlczogbnVtYmVyLCB2YWw6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHJlcyA9PSB1bmRlZmluZWQpIHJldHVybiB2YWw7XG4gICAgcmV0dXJuIHJlcyA+IHZhbCA/IHJlcyA6IHZhbDtcbiAgfSk7XG59XG5GdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXIoXCJtYXhJbkFycmF5XCIsIG1heEluQXJyYXkpO1xuXG5mdW5jdGlvbiBjb3VudEluQXJyYXkocGFyYW1zOiBhbnlbXSk6IGFueSB7XG4gIHZhciByZXMgPSBjYWxjSW5BcnJheShwYXJhbXMsIGZ1bmN0aW9uKHJlczogbnVtYmVyLCB2YWw6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHJlcyA9PSB1bmRlZmluZWQpIHJlcyA9IDA7XG4gICAgcmV0dXJuIHJlcyArIDE7XG4gIH0pO1xuICByZXR1cm4gcmVzICE9PSB1bmRlZmluZWQgPyByZXMgOiAwO1xufVxuRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyKFwiY291bnRJbkFycmF5XCIsIGNvdW50SW5BcnJheSk7XG5cbmZ1bmN0aW9uIGF2Z0luQXJyYXkocGFyYW1zOiBhbnlbXSk6IGFueSB7XG4gIHZhciBjb3VudCA9IGNvdW50SW5BcnJheShwYXJhbXMpO1xuICBpZiAoY291bnQgPT0gMCkgcmV0dXJuIDA7XG4gIHJldHVybiBzdW1JbkFycmF5KHBhcmFtcykgLyBjb3VudDtcbn1cbkZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlcihcImF2Z0luQXJyYXlcIiwgYXZnSW5BcnJheSk7XG5cbmZ1bmN0aW9uIGlpZihwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgaWYgKCFwYXJhbXMgJiYgcGFyYW1zLmxlbmd0aCAhPT0gMykgcmV0dXJuIFwiXCI7XG4gIHJldHVybiBwYXJhbXNbMF0gPyBwYXJhbXNbMV0gOiBwYXJhbXNbMl07XG59XG5GdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXIoXCJpaWZcIiwgaWlmKTtcblxuZnVuY3Rpb24gZ2V0RGF0ZShwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgaWYgKCFwYXJhbXMgJiYgcGFyYW1zLmxlbmd0aCA8IDEpIHJldHVybiBudWxsO1xuICBpZiAoIXBhcmFtc1swXSkgcmV0dXJuIG51bGw7XG4gIHJldHVybiBuZXcgRGF0ZShwYXJhbXNbMF0pO1xufVxuRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyKFwiZ2V0RGF0ZVwiLCBnZXREYXRlKTtcblxuZnVuY3Rpb24gYWdlKHBhcmFtczogYW55W10pOiBhbnkge1xuICBpZiAoIXBhcmFtcyAmJiBwYXJhbXMubGVuZ3RoIDwgMSkgcmV0dXJuIG51bGw7XG4gIGlmICghcGFyYW1zWzBdKSByZXR1cm4gbnVsbDtcbiAgdmFyIGJpcnRoRGF0ZSA9IG5ldyBEYXRlKHBhcmFtc1swXSk7XG4gIHZhciB0b2RheSA9IG5ldyBEYXRlKCk7XG4gIHZhciBhZ2UgPSB0b2RheS5nZXRGdWxsWWVhcigpIC0gYmlydGhEYXRlLmdldEZ1bGxZZWFyKCk7XG4gIHZhciBtID0gdG9kYXkuZ2V0TW9udGgoKSAtIGJpcnRoRGF0ZS5nZXRNb250aCgpO1xuICBpZiAobSA8IDAgfHwgKG0gPT09IDAgJiYgdG9kYXkuZ2V0RGF0ZSgpIDwgYmlydGhEYXRlLmdldERhdGUoKSkpIHtcbiAgICBhZ2UgLT0gYWdlID4gMCA/IDEgOiAwO1xuICB9XG4gIHJldHVybiBhZ2U7XG59XG5GdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXIoXCJhZ2VcIiwgYWdlKTtcblxuZnVuY3Rpb24gaXNDb250YWluZXJSZWFkeUNvcmUoY29udGFpbmVyOiBhbnkpOiBib29sZWFuIHtcbiAgaWYgKCFjb250YWluZXIpIHJldHVybiBmYWxzZTtcbiAgdmFyIHF1ZXN0aW9ucyA9IGNvbnRhaW5lci5xdWVzdGlvbnM7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHF1ZXN0aW9uc1tpXS5oYXNFcnJvcnMoZmFsc2UpKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBpc0NvbnRhaW5lclJlYWR5KHBhcmFtczogYW55W10pOiBhbnkge1xuICBpZiAoIXBhcmFtcyAmJiBwYXJhbXMubGVuZ3RoIDwgMSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIXBhcmFtc1swXSB8fCAhdGhpcy5zdXJ2ZXkpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgbmFtZSA9IHBhcmFtc1swXTtcbiAgbGV0IGNvbnRhaW5lciA9IHRoaXMuc3VydmV5LmdldFBhZ2VCeU5hbWUobmFtZSk7XG4gIGlmICghY29udGFpbmVyKSBjb250YWluZXIgPSB0aGlzLnN1cnZleS5nZXRQYW5lbEJ5TmFtZShuYW1lKTtcbiAgaWYoIWNvbnRhaW5lcikge1xuICAgIGNvbnN0IHF1ZXN0aW9uID0gdGhpcy5zdXJ2ZXkuZ2V0UXVlc3Rpb25CeU5hbWUobmFtZSk7XG4gICAgaWYoIXF1ZXN0aW9uIHx8ICFBcnJheS5pc0FycmF5KHF1ZXN0aW9uLnBhbmVscykpIHJldHVybiBmYWxzZTtcbiAgICBpZihwYXJhbXMubGVuZ3RoID4gMSkge1xuICAgICAgaWYocGFyYW1zWzFdIDwgcXVlc3Rpb24ucGFuZWxzLmxlbmd0aCkge1xuICAgICAgICBjb250YWluZXIgPSBxdWVzdGlvbi5wYW5lbHNbcGFyYW1zWzFdXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHF1ZXN0aW9uLnBhbmVscy5sZW5ndGg7IGkgKyspIHtcbiAgICAgICAgaWYoIWlzQ29udGFpbmVyUmVhZHlDb3JlKHF1ZXN0aW9uLnBhbmVsc1tpXSkpIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaXNDb250YWluZXJSZWFkeUNvcmUoY29udGFpbmVyKTtcbn1cbkZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlcihcImlzQ29udGFpbmVyUmVhZHlcIiwgaXNDb250YWluZXJSZWFkeSk7XG5cbmZ1bmN0aW9uIGlzRGlzcGxheU1vZGUoKSB7XG4gIHJldHVybiB0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5pc0Rpc3BsYXlNb2RlO1xufVxuRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyKFwiaXNEaXNwbGF5TW9kZVwiLCBpc0Rpc3BsYXlNb2RlKTtcblxuZnVuY3Rpb24gY3VycmVudERhdGUoKSB7XG4gIHJldHVybiBuZXcgRGF0ZSgpO1xufVxuRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyKFwiY3VycmVudERhdGVcIiwgY3VycmVudERhdGUpO1xuXG5mdW5jdGlvbiB0b2RheShwYXJhbXM6IGFueVtdKSB7XG4gIHZhciByZXMgPSBuZXcgRGF0ZSgpO1xuICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbXMpICYmIHBhcmFtcy5sZW5ndGggPT0gMSkge1xuICAgIHJlcy5zZXREYXRlKHJlcy5nZXREYXRlKCkgKyBwYXJhbXNbMF0pO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5GdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXIoXCJ0b2RheVwiLCB0b2RheSk7XG5cbmZ1bmN0aW9uIGdldFllYXIocGFyYW1zOiBhbnlbXSkge1xuICBpZihwYXJhbXMubGVuZ3RoICE9PSAxIHx8ICFwYXJhbXNbMF0pIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBuZXcgRGF0ZShwYXJhbXNbMF0pLmdldEZ1bGxZZWFyKCk7XG59XG5GdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXIoXCJnZXRZZWFyXCIsIGdldFllYXIpO1xuXG5mdW5jdGlvbiBjdXJyZW50WWVhcigpIHtcbiAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTtcbn1cbkZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlcihcImN1cnJlbnRZZWFyXCIsIGN1cnJlbnRZZWFyKTtcblxuZnVuY3Rpb24gZGlmZkRheXMocGFyYW1zOiBhbnlbXSkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkocGFyYW1zKSB8fCBwYXJhbXMubGVuZ3RoICE9PSAyKSByZXR1cm4gMDtcbiAgaWYgKCFwYXJhbXNbMF0gfHwgIXBhcmFtc1sxXSkgcmV0dXJuIDA7XG4gIGNvbnN0IGRhdGUxOiBhbnkgPSBuZXcgRGF0ZShwYXJhbXNbMF0pO1xuICBjb25zdCBkYXRlMjogYW55ID0gbmV3IERhdGUocGFyYW1zWzFdKTtcbiAgY29uc3QgZGlmZlRpbWUgPSBNYXRoLmFicyhkYXRlMiAtIGRhdGUxKTtcbiAgcmV0dXJuIE1hdGguY2VpbChkaWZmVGltZSAvICgxMDAwICogNjAgKiA2MCAqIDI0KSk7XG59XG5GdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXIoXCJkaWZmRGF5c1wiLCBkaWZmRGF5cyk7XG4iLCJpbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGFzaFRhYmxlPFQ+IHtcbiAgW2tleTogc3RyaW5nXTogVDtcbn1cblxuZXhwb3J0IGNsYXNzIEhlbHBlcnMge1xuICAvKipcbiAgICogQSBzdGF0aWMgbWV0aG9kcyB0aGF0IHJldHVybnMgdHJ1ZSBpZiBhIHZhbHVlIHVuZGVmaW5lZCwgbnVsbCwgZW1wdHkgc3RyaW5nIG9yIGVtcHR5IGFycmF5LlxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaXNWYWx1ZUVtcHR5KHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUuY29uc3RydWN0b3IgPT09IE9iamVjdCkge1xuICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICAgIGlmICghSGVscGVycy5pc1ZhbHVlRW1wdHkodmFsdWVba2V5XSkpIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gIXZhbHVlICYmIHZhbHVlICE9PSAwICYmIHZhbHVlICE9PSBmYWxzZTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGlzQXJyYXlDb250YWluc0VxdWFsKHg6IGFueSwgeTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHgpIHx8ICFBcnJheS5pc0FycmF5KHkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHgubGVuZ3RoICE9PSB5Lmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGogPSAwO1xuICAgICAgZm9yICg7IGogPCB5Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHMoeFtpXSwgeVtqXSkpIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGogPT09IHkubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgaXNBcnJheXNFcXVhbChcbiAgICB4OiBhbnksXG4gICAgeTogYW55LFxuICAgIGlnbm9yZU9yZGVyOiBib29sZWFuID0gZmFsc2UsXG4gICAgY2FzZVNlbnNpdGl2ZT86IGJvb2xlYW4sXG4gICAgdHJpbVN0cmluZ3M/IDogYm9vbGVhblxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoeCkgfHwgIUFycmF5LmlzQXJyYXkoeSkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoeC5sZW5ndGggIT09IHkubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGlnbm9yZU9yZGVyKSB7XG4gICAgICB2YXIgeFNvcnRlZCA9IFtdO1xuICAgICAgdmFyIHlTb3J0ZWQgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkrKykge1xuICAgICAgICB4U29ydGVkLnB1c2goeFtpXSk7XG4gICAgICAgIHlTb3J0ZWQucHVzaCh5W2ldKTtcbiAgICAgIH1cbiAgICAgIHhTb3J0ZWQuc29ydCgpO1xuICAgICAgeVNvcnRlZC5zb3J0KCk7XG4gICAgICB4ID0geFNvcnRlZDtcbiAgICAgIHkgPSB5U29ydGVkO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghSGVscGVycy5pc1R3b1ZhbHVlRXF1YWxzKHhbaV0sIHlbaV0sIGlnbm9yZU9yZGVyLCBjYXNlU2Vuc2l0aXZlLCB0cmltU3RyaW5ncykpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBpc1R3b1ZhbHVlRXF1YWxzKFxuICAgIHg6IGFueSxcbiAgICB5OiBhbnksXG4gICAgaWdub3JlT3JkZXI6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBjYXNlU2Vuc2l0aXZlPzogYm9vbGVhbixcbiAgICB0cmltU3RyaW5ncz8gOiBib29sZWFuXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICh4ID09PSB5KSByZXR1cm4gdHJ1ZTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHgpICYmIHgubGVuZ3RoID09PSAwICYmIHR5cGVvZiB5ID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoeSkgJiYgeS5sZW5ndGggPT09IDAgJiYgdHlwZW9mIHggPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoKHggPT09IHVuZGVmaW5lZCB8fCB4ID09PSBudWxsKSAmJiB5ID09PSBcIlwiKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoKHkgPT09IHVuZGVmaW5lZCB8fCB5ID09PSBudWxsKSAmJiB4ID09PSBcIlwiKSByZXR1cm4gdHJ1ZTtcbiAgICBpZih0cmltU3RyaW5ncyA9PT0gdW5kZWZpbmVkKSB0cmltU3RyaW5ncyA9IHNldHRpbmdzLmNvbXBhcmF0b3IudHJpbVN0cmluZ3M7XG4gICAgaWYoY2FzZVNlbnNpdGl2ZSA9PT0gdW5kZWZpbmVkKSBjYXNlU2Vuc2l0aXZlID0gc2V0dGluZ3MuY29tcGFyYXRvci5jYXNlU2Vuc2l0aXZlO1xuXG4gICAgaWYodHlwZW9mIHggPT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIHkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGlmKHRyaW1TdHJpbmdzKSB7XG4gICAgICAgIHggPSB4LnRyaW0oKTtcbiAgICAgICAgeSA9IHkudHJpbSgpO1xuICAgICAgfVxuICAgICAgaWYoIWNhc2VTZW5zaXRpdmUpIHtcbiAgICAgICAgeCA9IHgudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgeSA9IHkudG9Mb3dlckNhc2UoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB4ID09PSB5O1xuICAgIH1cblxuICAgIGlmIChIZWxwZXJzLmlzQ29udmVydGlibGVUb051bWJlcih4KSAmJiBIZWxwZXJzLmlzQ29udmVydGlibGVUb051bWJlcih5KSkge1xuICAgICAgaWYgKHBhcnNlSW50KHgpID09PSBwYXJzZUludCh5KSAmJiBwYXJzZUZsb2F0KHgpID09PSBwYXJzZUZsb2F0KHkpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgICghSGVscGVycy5pc1ZhbHVlRW1wdHkoeCkgJiYgSGVscGVycy5pc1ZhbHVlRW1wdHkoeSkpIHx8XG4gICAgICAoSGVscGVycy5pc1ZhbHVlRW1wdHkoeCkgJiYgIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHkpKVxuICAgIClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoKHggPT09IHRydWUgfHwgeCA9PT0gZmFsc2UpICYmIHR5cGVvZiB5ID09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB4LnRvU3RyaW5nKCkgPT09IHkudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICB9XG4gICAgaWYgKCh5ID09PSB0cnVlIHx8IHkgPT09IGZhbHNlKSAmJiB0eXBlb2YgeCA9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4geS50b1N0cmluZygpID09PSB4LnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIGlmICghKHggaW5zdGFuY2VvZiBPYmplY3QpICYmICEoeSBpbnN0YW5jZW9mIE9iamVjdCkpIHJldHVybiB4ID09IHk7XG4gICAgaWYgKCEoeCBpbnN0YW5jZW9mIE9iamVjdCkgfHwgISh5IGluc3RhbmNlb2YgT2JqZWN0KSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh4W1wiZXF1YWxzXCJdKSByZXR1cm4geC5lcXVhbHMoeSk7XG4gICAgaWYgKCEheC50b0pTT04gJiYgISF5LnRvSlNPTiAmJiAhIXguZ2V0VHlwZSAmJiAhIXkuZ2V0VHlwZSkge1xuICAgICAgaWYgKHguaXNEaXBvc2VkIHx8IHkuaXNEaXBvc2VkKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoeC5nZXRUeXBlKCkgIT09IHkuZ2V0VHlwZSgpKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoISF4Lm5hbWUgJiYgeC5uYW1lICE9PSB5Lm5hbWUpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0aGlzLmlzVHdvVmFsdWVFcXVhbHMoeC50b0pTT04oKSwgeS50b0pTT04oKSwgaWdub3JlT3JkZXIsIGNhc2VTZW5zaXRpdmUsIHRyaW1TdHJpbmdzKTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoeCkgJiYgQXJyYXkuaXNBcnJheSh5KSlcbiAgICAgIHJldHVybiBIZWxwZXJzLmlzQXJyYXlzRXF1YWwoeCwgeSwgaWdub3JlT3JkZXIsIGNhc2VTZW5zaXRpdmUsIHRyaW1TdHJpbmdzKTtcblxuICAgIGZvciAodmFyIHAgaW4geCkge1xuICAgICAgaWYgKCF4Lmhhc093blByb3BlcnR5KHApKSBjb250aW51ZTtcbiAgICAgIGlmICgheS5oYXNPd25Qcm9wZXJ0eShwKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHhbcF0gPT09IHlbcF0pIGNvbnRpbnVlO1xuICAgICAgaWYgKHR5cGVvZiB4W3BdICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoIXRoaXMuaXNUd29WYWx1ZUVxdWFscyh4W3BdLCB5W3BdKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKHAgaW4geSkge1xuICAgICAgaWYgKHkuaGFzT3duUHJvcGVydHkocCkgJiYgIXguaGFzT3duUHJvcGVydHkocCkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIHN0YXRpYyByYW5kb21pemVBcnJheTxUPihhcnJheTogQXJyYXk8VD4pOiBBcnJheTxUPiB7XG4gICAgZm9yICh2YXIgaSA9IGFycmF5Lmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHtcbiAgICAgIHZhciBqID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGkgKyAxKSk7XG4gICAgICB2YXIgdGVtcCA9IGFycmF5W2ldO1xuICAgICAgYXJyYXlbaV0gPSBhcnJheVtqXTtcbiAgICAgIGFycmF5W2pdID0gdGVtcDtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZ2V0VW5iaW5kVmFsdWUodmFsdWU6IGFueSk6IGFueSB7XG4gICAgaWYgKCEhdmFsdWUgJiYgdmFsdWUgaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgIC8vZG8gbm90IHJldHVybiB0aGUgc2FtZSBvYmplY3QgaW5zdGFuY2UhISFcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZUNvcHkob2JqOiBhbnkpIHtcbiAgICB2YXIgcmVzOiBhbnkgPSB7fTtcbiAgICBpZiAoIW9iaikgcmV0dXJuIHJlcztcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICByZXNba2V5XSA9IG9ialtrZXldO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgaXNDb252ZXJ0aWJsZVRvTnVtYmVyKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdmFsdWUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICAgICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJlxuICAgICAgIWlzTmFOKHZhbHVlKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBpc051bWJlcih2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHZhbHVlID09IFwic3RyaW5nXCIgJiZcbiAgICAgICEhdmFsdWUgJiZcbiAgICAgIHZhbHVlLmluZGV4T2YoXCIweFwiKSA9PSAwICYmXG4gICAgICB2YWx1ZS5sZW5ndGggPiAzMlxuICAgIClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gIWlzTmFOKHBhcnNlRmxvYXQodmFsdWUpKSAmJiBpc0Zpbml0ZSh2YWx1ZSk7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBnZXRNYXhMZW5ndGgobWF4TGVuZ3RoOiBudW1iZXIsIHN1cnZleUxlbmd0aDogbnVtYmVyKTogYW55IHtcbiAgICBpZiAobWF4TGVuZ3RoIDwgMCkge1xuICAgICAgbWF4TGVuZ3RoID0gc3VydmV5TGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gbWF4TGVuZ3RoID4gMCA/IG1heExlbmd0aCA6IG51bGw7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBnZXROdW1iZXJCeUluZGV4KGluZGV4OiBudW1iZXIsIHN0YXJ0SW5kZXhTdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGluZGV4IDwgMCkgcmV0dXJuIFwiXCI7XG4gICAgdmFyIHN0YXJ0SW5kZXggPSAxO1xuICAgIHZhciBwcmVmaXggPSBcIlwiO1xuICAgIHZhciBwb3N0Zml4ID0gXCIuXCI7XG4gICAgdmFyIGlzTnVtZXJpYyA9IHRydWU7XG4gICAgdmFyIHN0ckluZGV4ID0gXCJBXCI7XG4gICAgdmFyIHN0ciA9IFwiXCI7XG4gICAgaWYgKCEhc3RhcnRJbmRleFN0cikge1xuICAgICAgc3RyID0gc3RhcnRJbmRleFN0cjtcbiAgICAgIHZhciBpbmQgPSBzdHIubGVuZ3RoIC0gMTtcbiAgICAgIHZhciBoYXNEaWdpdCA9IGZhbHNlO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKEhlbHBlcnMuaXNDaGFyRGlnaXQoc3RyW2ldKSkge1xuICAgICAgICAgIGhhc0RpZ2l0ID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIGNoZWNrTGV0dGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgKGhhc0RpZ2l0ICYmICFIZWxwZXJzLmlzQ2hhckRpZ2l0KHN0cltpbmRdKSkgfHxcbiAgICAgICAgICBIZWxwZXJzLmlzQ2hhck5vdExldHRlckFuZERpZ2l0KHN0cltpbmRdKVxuICAgICAgICApO1xuICAgICAgfTtcbiAgICAgIHdoaWxlIChpbmQgPj0gMCAmJiBjaGVja0xldHRlcigpKSBpbmQtLTtcbiAgICAgIHZhciBuZXdQb3N0Zml4ID0gXCJcIjtcbiAgICAgIGlmIChpbmQgPCBzdHIubGVuZ3RoIC0gMSkge1xuICAgICAgICBuZXdQb3N0Zml4ID0gc3RyLnN1YnN0cihpbmQgKyAxKTtcbiAgICAgICAgc3RyID0gc3RyLnN1YnN0cigwLCBpbmQgKyAxKTtcbiAgICAgIH1cbiAgICAgIGluZCA9IHN0ci5sZW5ndGggLSAxO1xuICAgICAgd2hpbGUgKGluZCA+PSAwKSB7XG4gICAgICAgIGlmIChjaGVja0xldHRlcigpKSBicmVhaztcbiAgICAgICAgaW5kLS07XG4gICAgICAgIGlmICghaGFzRGlnaXQpIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3RySW5kZXggPSBzdHIuc3Vic3RyKGluZCArIDEpO1xuICAgICAgcHJlZml4ID0gc3RyLnN1YnN0cigwLCBpbmQgKyAxKTtcbiAgICAgIGlmIChwYXJzZUludChzdHJJbmRleCkpIHN0YXJ0SW5kZXggPSBwYXJzZUludChzdHJJbmRleCk7XG4gICAgICBlbHNlIGlmIChzdHJJbmRleC5sZW5ndGggPT0gMSkgaXNOdW1lcmljID0gZmFsc2U7XG4gICAgICBpZiAoISFuZXdQb3N0Zml4IHx8ICEhcHJlZml4KSB7XG4gICAgICAgIHBvc3RmaXggPSBuZXdQb3N0Zml4O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNOdW1lcmljKSByZXR1cm4gcHJlZml4ICsgKGluZGV4ICsgc3RhcnRJbmRleCkudG9TdHJpbmcoKSArIHBvc3RmaXg7XG4gICAgcmV0dXJuIChcbiAgICAgIHByZWZpeCArIFN0cmluZy5mcm9tQ2hhckNvZGUoc3RySW5kZXguY2hhckNvZGVBdCgwKSArIGluZGV4KSArIHBvc3RmaXhcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgaXNDaGFyTm90TGV0dGVyQW5kRGlnaXQoY2g6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjaC50b1VwcGVyQ2FzZSgpID09IGNoLnRvTG93ZXJDYXNlKCkgJiYgIUhlbHBlcnMuaXNDaGFyRGlnaXQoY2gpO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgaXNDaGFyRGlnaXQoY2g6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjaCA+PSBcIjBcIiAmJiBjaCA8PSBcIjlcIjtcbiAgfVxufVxuaWYgKCEoPGFueT5TdHJpbmcucHJvdG90eXBlKVtcImZvcm1hdFwiXSkge1xuICAoPGFueT5TdHJpbmcucHJvdG90eXBlKVtcImZvcm1hdFwiXSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgIHJldHVybiB0aGlzLnJlcGxhY2UoL3soXFxkKyl9L2csIGZ1bmN0aW9uKG1hdGNoOiBhbnksIG51bWJlcjogYW55KSB7XG4gICAgICByZXR1cm4gdHlwZW9mIGFyZ3NbbnVtYmVyXSAhPSBcInVuZGVmaW5lZFwiID8gYXJnc1tudW1iZXJdIDogbWF0Y2g7XG4gICAgfSk7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBJTG9jYWxpemFibGVPd25lciwgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHtcbiAgSnNvbk9iamVjdCxcbiAgSnNvbk9iamVjdFByb3BlcnR5LFxuICBTZXJpYWxpemVyLFxuICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbixcbn0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IENvbmRpdGlvblJ1bm5lciB9IGZyb20gXCIuL2NvbmRpdGlvbnNcIjtcbmltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBJU3VydmV5IH0gZnJvbSBcIi4vYmFzZS1pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzXCI7XG5cbi8qKlxuICogQXJyYXkgb2YgSXRlbVZhbHVlIGlzIHVzZWQgaW4gY2hlY2tveCwgZHJvcGRvd24gYW5kIHJhZGlvZ3JvdXAgY2hvaWNlcywgbWF0cml4IGNvbHVtbnMgYW5kIHJvd3MuXG4gKiBJdCBoYXMgdHdvIG1haW4gcHJvcGVydGllczogdmFsdWUgYW5kIHRleHQuIElmIHRleHQgaXMgZW1wdHksIHZhbHVlIGlzIHVzZWQgZm9yIGRpc3BsYXlpbmcuXG4gKiBUaGUgdGV4dCBwcm9wZXJ0eSBpcyBsb2NhbGl6YWJsZSBhbmQgc3VwcG9ydCBtYXJrZG93bi5cbiAqL1xuZXhwb3J0IGNsYXNzIEl0ZW1WYWx1ZSBleHRlbmRzIEJhc2Uge1xuICBbaW5kZXg6IHN0cmluZ106IGFueTtcbiAgcHVibGljIHN0YXRpYyBnZXQgU2VwYXJhdG9yKCkge1xuICAgIHJldHVybiBzZXR0aW5ncy5pdGVtVmFsdWVTZXBhcmF0b3I7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBzZXQgU2VwYXJhdG9yKHZhbDogc3RyaW5nKSB7XG4gICAgc2V0dGluZ3MuaXRlbVZhbHVlU2VwYXJhdG9yID0gdmFsO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlQXJyYXkobG9jT3duZXI6IElMb2NhbGl6YWJsZU93bmVyKTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgdmFyIGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+ID0gW107XG4gICAgSXRlbVZhbHVlLnNldHVwQXJyYXkoaXRlbXMsIGxvY093bmVyKTtcbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBzZXR1cEFycmF5KFxuICAgIGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LFxuICAgIGxvY093bmVyOiBJTG9jYWxpemFibGVPd25lclxuICApIHtcbiAgICBpdGVtcy5wdXNoID0gZnVuY3Rpb24odmFsdWUpOiBudW1iZXIge1xuICAgICAgdmFyIHJlc3VsdCA9IEFycmF5LnByb3RvdHlwZS5wdXNoLmNhbGwodGhpcywgdmFsdWUpO1xuICAgICAgdmFsdWUubG9jT3duZXIgPSBsb2NPd25lcjtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBpdGVtcy51bnNoaWZ0ID0gZnVuY3Rpb24odmFsdWUpOiBudW1iZXIge1xuICAgICAgdmFyIHJlc3VsdCA9IEFycmF5LnByb3RvdHlwZS51bnNoaWZ0LmNhbGwodGhpcywgdmFsdWUpO1xuICAgICAgdmFsdWUubG9jT3duZXIgPSBsb2NPd25lcjtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBpdGVtcy5zcGxpY2UgPSBmdW5jdGlvbihcbiAgICAgIHN0YXJ0PzogbnVtYmVyLFxuICAgICAgZGVsZXRlQ291bnQ/OiBudW1iZXIsXG4gICAgICAuLi5pdGVtczogSXRlbVZhbHVlW11cbiAgICApOiBJdGVtVmFsdWVbXSB7XG4gICAgICB2YXIgcmVzdWx0ID0gQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKFxuICAgICAgICB0aGlzLFxuICAgICAgICBzdGFydCxcbiAgICAgICAgZGVsZXRlQ291bnQsXG4gICAgICAgIC4uLml0ZW1zXG4gICAgICApO1xuICAgICAgaWYgKCFpdGVtcykgaXRlbXMgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaXRlbXNbaV0ubG9jT3duZXIgPSBsb2NPd25lcjtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIHNldERhdGEoaXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4sIHZhbHVlczogQXJyYXk8YW55Pikge1xuICAgIGl0ZW1zLmxlbmd0aCA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB2YWx1ZSA9IHZhbHVlc1tpXTtcbiAgICAgIHZhciBpdGVtOiBJdGVtVmFsdWU7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlLmdldFR5cGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBpdGVtID0gU2VyaWFsaXplci5jcmVhdGVDbGFzcyh2YWx1ZS5nZXRUeXBlKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlbSA9IG5ldyBJdGVtVmFsdWUobnVsbCk7XG4gICAgICB9XG4gICAgICBpdGVtLnNldERhdGEodmFsdWUpO1xuICAgICAgaWYgKCEhdmFsdWUub3JpZ2luYWxJdGVtKSB7XG4gICAgICAgIGl0ZW0ub3JpZ2luYWxJdGVtID0gdmFsdWUub3JpZ2luYWxJdGVtO1xuICAgICAgfVxuICAgICAgaXRlbXMucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHN0YXRpYyBnZXREYXRhKGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+KTogYW55IHtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzdWx0LnB1c2goaXRlbXNbaV0uZ2V0RGF0YSgpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGdldEl0ZW1CeVZhbHVlKGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LCB2YWw6IGFueSk6IEl0ZW1WYWx1ZSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGl0ZW1zKSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgdmFsSXNFbXB0eSA9IEhlbHBlcnMuaXNWYWx1ZUVtcHR5KHZhbCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZhbElzRW1wdHkgJiYgSGVscGVycy5pc1ZhbHVlRW1wdHkoaXRlbXNbaV0udmFsdWUpKSByZXR1cm4gaXRlbXNbaV07XG4gICAgICBpZiAoSGVscGVycy5pc1R3b1ZhbHVlRXF1YWxzKGl0ZW1zW2ldLnZhbHVlLCB2YWwsIGZhbHNlLCB0cnVlLCBmYWxzZSkpIHJldHVybiBpdGVtc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBnZXRUZXh0T3JIdG1sQnlWYWx1ZShcbiAgICBpdGVtczogQXJyYXk8SXRlbVZhbHVlPixcbiAgICB2YWw6IGFueVxuICApOiBzdHJpbmcge1xuICAgIHZhciBpdGVtID0gSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKGl0ZW1zLCB2YWwpO1xuICAgIHJldHVybiBpdGVtICE9PSBudWxsID8gaXRlbS5sb2NUZXh0LnRleHRPckh0bWwgOiBcIlwiO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgbG9jU3Ryc0NoYW5nZWQoaXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpdGVtc1tpXS5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgc3RhdGljIHJ1bkNvbmRpdGlvbnNGb3JJdGVtcyhcbiAgICBpdGVtczogQXJyYXk8SXRlbVZhbHVlPixcbiAgICBmaWx0ZXJlZEl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LFxuICAgIHJ1bm5lcjogQ29uZGl0aW9uUnVubmVyLFxuICAgIHZhbHVlczogYW55LFxuICAgIHByb3BlcnRpZXM6IGFueSxcbiAgICB1c2VJdGVtRXhwcmVzc2lvbjogYm9vbGVhbiA9IHRydWVcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEl0ZW1WYWx1ZS5ydW5Db25kaXRpb25zRm9ySXRlbXNDb3JlKFxuICAgICAgaXRlbXMsXG4gICAgICBmaWx0ZXJlZEl0ZW1zLFxuICAgICAgcnVubmVyLFxuICAgICAgdmFsdWVzLFxuICAgICAgcHJvcGVydGllcyxcbiAgICAgIHRydWUsXG4gICAgICB1c2VJdGVtRXhwcmVzc2lvblxuICAgICk7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBydW5FbmFibGVkQ29uZGl0aW9uc0Zvckl0ZW1zKFxuICAgIGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LFxuICAgIHJ1bm5lcjogQ29uZGl0aW9uUnVubmVyLFxuICAgIHZhbHVlczogYW55LFxuICAgIHByb3BlcnRpZXM6IGFueSxcbiAgICBvbkl0ZW1DYWxsQmFjaz86IChpdGVtOiBJdGVtVmFsdWUpID0+IGJvb2xlYW5cbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEl0ZW1WYWx1ZS5ydW5Db25kaXRpb25zRm9ySXRlbXNDb3JlKFxuICAgICAgaXRlbXMsXG4gICAgICBudWxsLFxuICAgICAgcnVubmVyLFxuICAgICAgdmFsdWVzLFxuICAgICAgcHJvcGVydGllcyxcbiAgICAgIGZhbHNlLFxuICAgICAgdHJ1ZSxcbiAgICAgIG9uSXRlbUNhbGxCYWNrXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIHN0YXRpYyBydW5Db25kaXRpb25zRm9ySXRlbXNDb3JlKFxuICAgIGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LFxuICAgIGZpbHRlcmVkSXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4sXG4gICAgcnVubmVyOiBDb25kaXRpb25SdW5uZXIsXG4gICAgdmFsdWVzOiBhbnksXG4gICAgcHJvcGVydGllczogYW55LFxuICAgIGlzVmlzaWJsZTogYm9vbGVhbixcbiAgICB1c2VJdGVtRXhwcmVzc2lvbjogYm9vbGVhbiA9IHRydWUsXG4gICAgb25JdGVtQ2FsbEJhY2s/OiAoaXRlbTogSXRlbVZhbHVlKSA9PiBib29sZWFuXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghdmFsdWVzKSB7XG4gICAgICB2YWx1ZXMgPSB7fTtcbiAgICB9XG4gICAgdmFyIGl0ZW1WYWx1ZSA9IHZhbHVlc1tcIml0ZW1cIl07XG4gICAgdmFyIGNob2ljZVZhbHVlID0gdmFsdWVzW1wiY2hvaWNlXCJdO1xuICAgIHZhciBoYXNDaGFuZGVkID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGl0ZW0gPSBpdGVtc1tpXTtcbiAgICAgIHZhbHVlc1tcIml0ZW1cIl0gPSBpdGVtLnZhbHVlO1xuICAgICAgdmFsdWVzW1wiY2hvaWNlXCJdID0gaXRlbS52YWx1ZTtcbiAgICAgIHZhciBpdGVtUnVubmVyID1cbiAgICAgICAgdXNlSXRlbUV4cHJlc3Npb24gJiYgISFpdGVtLmdldENvbmRpdGlvblJ1bm5lclxuICAgICAgICAgID8gaXRlbS5nZXRDb25kaXRpb25SdW5uZXIoaXNWaXNpYmxlKVxuICAgICAgICAgIDogZmFsc2U7XG4gICAgICBpZiAoIWl0ZW1SdW5uZXIpIHtcbiAgICAgICAgaXRlbVJ1bm5lciA9IHJ1bm5lcjtcbiAgICAgIH1cbiAgICAgIHZhciBuZXdWYWx1ZSA9IHRydWU7XG4gICAgICBpZiAoaXRlbVJ1bm5lcikge1xuICAgICAgICBuZXdWYWx1ZSA9IGl0ZW1SdW5uZXIucnVuKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgICB9XG4gICAgICBpZiAobmV3VmFsdWUgJiYgISFvbkl0ZW1DYWxsQmFjaykge1xuICAgICAgICBuZXdWYWx1ZSA9IG9uSXRlbUNhbGxCYWNrKGl0ZW0pO1xuICAgICAgfVxuICAgICAgaWYgKCEhZmlsdGVyZWRJdGVtcyAmJiBuZXdWYWx1ZSkge1xuICAgICAgICBmaWx0ZXJlZEl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgICB2YXIgb2xkVmFsdWUgPSBpc1Zpc2libGUgPyBpdGVtLmlzVmlzaWJsZSA6IGl0ZW0uaXNFbmFibGVkO1xuICAgICAgaWYgKG5ld1ZhbHVlICE9IG9sZFZhbHVlKSB7XG4gICAgICAgIGhhc0NoYW5kZWQgPSB0cnVlO1xuICAgICAgICBpZiAoaXNWaXNpYmxlKSB7XG4gICAgICAgICAgaWYgKCEhaXRlbS5zZXRJc1Zpc2libGUpIGl0ZW0uc2V0SXNWaXNpYmxlKG5ld1ZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoISFpdGVtLnNldElzRW5hYmxlZCkgaXRlbS5zZXRJc0VuYWJsZWQobmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpdGVtVmFsdWUpIHtcbiAgICAgIHZhbHVlc1tcIml0ZW1cIl0gPSBpdGVtVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSB2YWx1ZXNbXCJpdGVtXCJdO1xuICAgIH1cbiAgICBpZiAoY2hvaWNlVmFsdWUpIHtcbiAgICAgIHZhbHVlc1tcImNob2ljZVwiXSA9IGNob2ljZVZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdmFsdWVzW1wiY2hvaWNlXCJdO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQ2hhbmRlZDtcbiAgfVxuICBwdWJsaWMgb3duZXJQcm9wZXJ0eU5hbWU6IHN0cmluZyA9IFwiXCI7XG4gIC8vcHJpdmF0ZSBpdGVtVmFsdWU6IGFueTtcbiAgcHJpdmF0ZSBsb2NUZXh0VmFsdWU6IExvY2FsaXphYmxlU3RyaW5nO1xuICBwcml2YXRlIGlzVmlzaWJsZVZhbHVlOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJpdmF0ZSB2aXNpYmxlQ29uZGl0aW9uUnVubmVyOiBDb25kaXRpb25SdW5uZXI7XG4gIHByaXZhdGUgZW5hYmxlQ29uZGl0aW9uUnVubmVyOiBDb25kaXRpb25SdW5uZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgdmFsdWU6IGFueSxcbiAgICB0ZXh0OiBzdHJpbmcgPSBudWxsLFxuICAgIHByb3RlY3RlZCB0eXBlTmFtZSA9IFwiaXRlbXZhbHVlXCJcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmxvY1RleHRWYWx1ZSA9IG5ldyBMb2NhbGl6YWJsZVN0cmluZyhudWxsLCB0cnVlKTtcbiAgICB0aGlzLmxvY1RleHRWYWx1ZS5vblN0ckNoYW5nZWQgPSAob2xkVmFsdWU6IHN0cmluZywgbmV3VmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKG5ld1ZhbHVlID09IHRoaXMudmFsdWUpIHtcbiAgICAgICAgbmV3VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICB0aGlzLnByb3BlcnR5VmFsdWVDaGFuZ2VkKFwidGV4dFwiLCBvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICAgIH07XG4gICAgdGhpcy5sb2NUZXh0VmFsdWUub25HZXRUZXh0Q2FsbGJhY2sgPSAodHh0KSA9PiB7XG4gICAgICByZXR1cm4gdHh0XG4gICAgICAgID8gdHh0XG4gICAgICAgIDogIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHRoaXMudmFsdWUpXG4gICAgICAgICAgPyB0aGlzLnZhbHVlLnRvU3RyaW5nKClcbiAgICAgICAgICA6IG51bGw7XG4gICAgfTtcbiAgICBpZiAodGV4dCkgdGhpcy5sb2NUZXh0LnRleHQgPSB0ZXh0O1xuICAgIGlmICghIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgdGhpcy5zZXREYXRhKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5nZXRUeXBlKCkgIT0gXCJpdGVtdmFsdWVcIikge1xuICAgICAgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24uY3JlYXRlUHJvcGVydGllcyh0aGlzKTtcbiAgICB9XG4gICAgdGhpcy5vbkNyZWF0aW5nKCk7XG4gIH1cblxuICBwdWJsaWMgb25DcmVhdGluZygpOiBhbnkge31cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gISF0aGlzLnR5cGVOYW1lID8gdGhpcy50eXBlTmFtZSA6IFwiaXRlbXZhbHVlXCI7XG4gIH1cbiAgcHVibGljIGdldFN1cnZleShsaXZlOiBib29sZWFuID0gZmFsc2UpOiBJU3VydmV5IHtcbiAgICByZXR1cm4gISF0aGlzLmxvY093bmVyICYmICEhKDxhbnk+dGhpcy5sb2NPd25lcilbXCJnZXRTdXJ2ZXlcIl1cbiAgICAgID8gKDxhbnk+dGhpcy5sb2NPd25lcikuZ2V0U3VydmV5KClcbiAgICAgIDogbnVsbDtcbiAgfVxuICBwdWJsaWMgZ2V0TG9jYWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICh0aGlzLmxvY1RleHQgJiYgdGhpcy5sb2NUZXh0LmxvY2FsZSkgfHwgXCJcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGxvY1RleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvY1RleHRWYWx1ZTtcbiAgfVxuICBzZXRMb2NUZXh0KGxvY1RleHQ6IExvY2FsaXphYmxlU3RyaW5nKSB7XG4gICAgdGhpcy5sb2NUZXh0VmFsdWUgPSBsb2NUZXh0O1xuICB9XG4gIHB1YmxpYyBnZXQgbG9jT3duZXIoKTogSUxvY2FsaXphYmxlT3duZXIge1xuICAgIHJldHVybiB0aGlzLmxvY1RleHQub3duZXI7XG4gIH1cbiAgcHVibGljIHNldCBsb2NPd25lcih2YWx1ZTogSUxvY2FsaXphYmxlT3duZXIpIHtcbiAgICB0aGlzLmxvY1RleHQub3duZXIgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IHZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZhbHVlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgIHZhciB0ZXh0OiBzdHJpbmcgPSB1bmRlZmluZWQ7XG4gICAgaWYgKCFIZWxwZXJzLmlzVmFsdWVFbXB0eShuZXdWYWx1ZSkpIHtcbiAgICAgIHZhciBzdHI6IHN0cmluZyA9IG5ld1ZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICB2YXIgaW5kZXggPSBzdHIuaW5kZXhPZihzZXR0aW5ncy5pdGVtVmFsdWVTZXBhcmF0b3IpO1xuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgbmV3VmFsdWUgPSBzdHIuc2xpY2UoMCwgaW5kZXgpO1xuICAgICAgICB0ZXh0ID0gc3RyLnNsaWNlKGluZGV4ICsgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZhbHVlXCIsIG5ld1ZhbHVlKTtcbiAgICBpZiAoISF0ZXh0KSB7XG4gICAgICB0aGlzLnRleHQgPSB0ZXh0O1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0IGhhc1RleHQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubG9jVGV4dC5wdXJlVGV4dCA/IHRydWUgOiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgZ2V0IHB1cmVUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubG9jVGV4dC5wdXJlVGV4dDtcbiAgfVxuICBwdWJsaWMgc2V0IHB1cmVUZXh0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy50ZXh0ID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgdGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvY1RleHQuY2FsY3VsYXRlZFRleHQ7IC8vVE9ETzogaXQgd2lsbCBiZSBjb3JyZWN0IHRvIHVzZSB0aGlzLmxvY1RleHQudGV4dCwgaG93ZXZlciBpdCB3b3VsZCByZXF1aXJlIGEgbG90IG9mIHJld3JpdGluZyBpbiBDcmVhdG9yXG4gIH1cbiAgcHVibGljIHNldCB0ZXh0KG5ld1RleHQ6IHN0cmluZykge1xuICAgIHRoaXMubG9jVGV4dC50ZXh0ID0gbmV3VGV4dDtcbiAgfVxuICBwdWJsaWMgZ2V0IGNhbGN1bGF0ZWRUZXh0KCkge1xuICAgIHJldHVybiB0aGlzLmxvY1RleHQuY2FsY3VsYXRlZFRleHQ7XG4gIH1cbiAgcHVibGljIGdldERhdGEoKTogYW55IHtcbiAgICB2YXIganNvbiA9IHRoaXMudG9KU09OKCk7XG4gICAgaWYgKCEhanNvbltcInZhbHVlXCJdICYmICEhanNvbltcInZhbHVlXCJdW1wicG9zXCJdKSB7XG4gICAgICBkZWxldGUganNvbltcInZhbHVlXCJdW1wicG9zXCJdO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LmtleXMoanNvbikubGVuZ3RoID09IDEgJiYgIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KGpzb25bXCJ2YWx1ZVwiXSkpXG4gICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICByZXR1cm4ganNvbjtcbiAgfVxuICBwdWJsaWMgdG9KU09OKCk6IGFueSB7XG4gICAgdmFyIHJlcyA9IHt9O1xuICAgIHZhciBwcm9wZXJ0aWVzID0gU2VyaWFsaXplci5nZXRQcm9wZXJ0aWVzKHRoaXMuZ2V0VHlwZSgpKTtcbiAgICBpZiAoIXByb3BlcnRpZXMgfHwgcHJvcGVydGllcy5sZW5ndGggPT0gMCkge1xuICAgICAgcHJvcGVydGllcyA9IFNlcmlhbGl6ZXIuZ2V0UHJvcGVydGllcyhcIml0ZW12YWx1ZVwiKTtcbiAgICB9XG4gICAgdmFyIGpzb09iaiA9IG5ldyBKc29uT2JqZWN0KCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBqc29PYmoudmFsdWVUb0pzb24odGhpcywgcmVzLCBwcm9wZXJ0aWVzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgc2V0RGF0YSh2YWx1ZTogYW55KSB7XG4gICAgaWYgKEhlbHBlcnMuaXNWYWx1ZUVtcHR5KHZhbHVlKSkgcmV0dXJuO1xuICAgIGlmICh0eXBlb2YgdmFsdWUudmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHZhciBqc29uID0gdmFsdWU7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlLnRvSlNPTiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGpzb24gPSAoPEJhc2U+dmFsdWUpLnRvSlNPTigpO1xuICAgICAgfVxuICAgICAgbmV3IEpzb25PYmplY3QoKS50b09iamVjdChqc29uLCB0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICB0aGlzLmxvY1RleHQuc3RyQ2hhbmdlZCgpO1xuICB9XG4gIHB1YmxpYyBnZXQgdmlzaWJsZUlmKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVJZlwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZpc2libGVJZih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVJZlwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgZW5hYmxlSWYoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZW5hYmxlSWZcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBlbmFibGVJZih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImVuYWJsZUlmXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBpc1Zpc2libGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWaXNpYmxlVmFsdWU7XG4gIH1cbiAgcHVibGljIHNldElzVmlzaWJsZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzVmlzaWJsZVZhbHVlID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc0VuYWJsZWRcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldElzRW5hYmxlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc0VuYWJsZWRcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgYWRkVXNlZExvY2FsZXMobG9jYWxlczogQXJyYXk8c3RyaW5nPikge1xuICAgIHRoaXMuQWRkTG9jU3RyaW5nVG9Vc2VkTG9jYWxlcyh0aGlzLmxvY1RleHRWYWx1ZSwgbG9jYWxlcyk7XG4gIH1cbiAgcHVibGljIGxvY1N0cnNDaGFuZ2VkKCkge1xuICAgIHN1cGVyLmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgdGhpcy5sb2NUZXh0LnN0ckNoYW5nZWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lOiBzdHJpbmcsIG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBpZiAobmFtZSA9PT0gXCJ2YWx1ZVwiICYmICF0aGlzLmhhc1RleHQpIHtcbiAgICAgIHRoaXMubG9jVGV4dC5vbkNoYW5nZWQoKTtcbiAgICB9XG4gICAgdmFyIGZ1bmNOYW1lID0gXCJpdGVtVmFsdWVQcm9wZXJ0eUNoYW5nZWRcIjtcbiAgICBpZiAoIXRoaXMubG9jT3duZXIgfHwgISg8YW55PnRoaXMubG9jT3duZXIpW2Z1bmNOYW1lXSkgcmV0dXJuO1xuICAgICg8YW55PnRoaXMubG9jT3duZXIpW2Z1bmNOYW1lXSh0aGlzLCBuYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRDb25kaXRpb25SdW5uZXIoaXNWaXNpYmxlOiBib29sZWFuKSB7XG4gICAgaWYgKGlzVmlzaWJsZSkgcmV0dXJuIHRoaXMuZ2V0VmlzaWJsZUNvbmRpdGlvblJ1bm5lcigpO1xuICAgIHJldHVybiB0aGlzLmdldEVuYWJsZUNvbmRpdGlvblJ1bm5lcigpO1xuICB9XG4gIHByaXZhdGUgZ2V0VmlzaWJsZUNvbmRpdGlvblJ1bm5lcigpOiBDb25kaXRpb25SdW5uZXIge1xuICAgIGlmICghdGhpcy52aXNpYmxlSWYpIHJldHVybiBudWxsO1xuICAgIGlmICghdGhpcy52aXNpYmxlQ29uZGl0aW9uUnVubmVyKVxuICAgICAgdGhpcy52aXNpYmxlQ29uZGl0aW9uUnVubmVyID0gbmV3IENvbmRpdGlvblJ1bm5lcih0aGlzLnZpc2libGVJZik7XG4gICAgdGhpcy52aXNpYmxlQ29uZGl0aW9uUnVubmVyLmV4cHJlc3Npb24gPSB0aGlzLnZpc2libGVJZjtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlQ29uZGl0aW9uUnVubmVyO1xuICB9XG4gIHByaXZhdGUgZ2V0RW5hYmxlQ29uZGl0aW9uUnVubmVyKCk6IENvbmRpdGlvblJ1bm5lciB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZUlmKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIXRoaXMuZW5hYmxlQ29uZGl0aW9uUnVubmVyKVxuICAgICAgdGhpcy5lbmFibGVDb25kaXRpb25SdW5uZXIgPSBuZXcgQ29uZGl0aW9uUnVubmVyKHRoaXMuZW5hYmxlSWYpO1xuICAgIHRoaXMuZW5hYmxlQ29uZGl0aW9uUnVubmVyLmV4cHJlc3Npb24gPSB0aGlzLmVuYWJsZUlmO1xuICAgIHJldHVybiB0aGlzLmVuYWJsZUNvbmRpdGlvblJ1bm5lcjtcbiAgfVxuICBwdWJsaWMgb3JpZ2luYWxJdGVtOiBhbnk7XG59XG5cbkJhc2UuY3JlYXRlSXRlbVZhbHVlID0gZnVuY3Rpb24oc291cmNlOiBhbnksIHR5cGU/OiBzdHJpbmcpOiBhbnkge1xuICB2YXIgaXRlbSA9IG51bGw7XG4gIGlmICghIXR5cGUpIHtcbiAgICBpdGVtID0gSnNvbk9iamVjdC5tZXRhRGF0YS5jcmVhdGVDbGFzcyh0eXBlLCB7fSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHNvdXJjZS5nZXRUeXBlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBpdGVtID0gbmV3IEl0ZW1WYWx1ZShudWxsLCB1bmRlZmluZWQsIHNvdXJjZS5nZXRUeXBlKCkpO1xuICB9IGVsc2Uge1xuICAgIGl0ZW0gPSBuZXcgSXRlbVZhbHVlKG51bGwpO1xuICB9XG4gIGl0ZW0uc2V0RGF0YShzb3VyY2UpO1xuICByZXR1cm4gaXRlbTtcbn07XG5CYXNlLml0ZW1WYWx1ZUxvY1N0ckNoYW5nZWQgPSBmdW5jdGlvbihhcnI6IEFycmF5PGFueT4pOiB2b2lkIHtcbiAgSXRlbVZhbHVlLmxvY1N0cnNDaGFuZ2VkKGFycik7XG59O1xuSnNvbk9iamVjdFByb3BlcnR5LmdldEl0ZW1WYWx1ZXNEZWZhdWx0VmFsdWUgPSBmdW5jdGlvbih2YWw6IGFueSk6IGFueSB7XG4gIHZhciByZXMgPSBuZXcgQXJyYXk8SXRlbVZhbHVlPigpO1xuICBJdGVtVmFsdWUuc2V0RGF0YShyZXMsIHZhbCB8fCBbXSk7XG4gIHJldHVybiByZXM7XG59O1xuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcIml0ZW12YWx1ZVwiLFxuICBbXG4gICAgXCIhdmFsdWVcIixcbiAgICB7XG4gICAgICBuYW1lOiBcInRleHRcIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NUZXh0XCIsXG4gICAgfSxcbiAgICB7IG5hbWU6IFwidmlzaWJsZUlmOmNvbmRpdGlvblwiLCBzaG93TW9kZTogXCJmb3JtXCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImVuYWJsZUlmOmNvbmRpdGlvblwiLFxuICAgICAgc2hvd01vZGU6IFwiZm9ybVwiLFxuICAgICAgdmlzaWJsZUlmOiAob2JqOiBJdGVtVmFsdWUpOiBib29sZWFuID0+IHtcbiAgICAgICAgcmV0dXJuICFvYmogfHwgb2JqLm93bmVyUHJvcGVydHlOYW1lICE9PSBcInJhdGVWYWx1ZXNcIjtcbiAgICAgIH0sXG4gICAgfSxcbiAgXSxcbiAgKHZhbHVlOiBhbnkpID0+IG5ldyBJdGVtVmFsdWUodmFsdWUpXG4pO1xuIiwiaW1wb3J0IHsgQmFzZSwgQ29tcHV0ZWRVcGRhdGVyIH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgSGVscGVycywgSGFzaFRhYmxlIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wZXJ0eURlY29yYXRvck9wdGlvbnMge1xuICBkZWZhdWx0VmFsdWU/OiBhbnk7XG4gIGRlZmF1bHRTb3VyY2U/OiBzdHJpbmc7XG4gIGxvY2FsaXphYmxlPzpcbiAgfCB7IG5hbWU6IHN0cmluZywgb25HZXRUZXh0Q2FsbGJhY2s/OiAoc3RyOiBzdHJpbmcpID0+IHN0cmluZyB9XG4gIHwgYm9vbGVhbjtcbiAgb25TZXQ/OiAodmFsOiBhbnksIHRhcmdldDogYW55KSA9PiB2b2lkO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVMb2NTdHJpbmcoXG4gIHRhcmdldDogYW55LFxuICBvcHRpb25zOiBJUHJvcGVydHlEZWNvcmF0b3JPcHRpb25zLFxuICBrZXk6IHN0cmluZ1xuKSB7XG4gIGxldCBsb2NTdHJpbmcgPSB0YXJnZXQuZ2V0TG9jYWxpemFibGVTdHJpbmcoa2V5KTtcbiAgaWYgKCFsb2NTdHJpbmcpIHtcbiAgICBsb2NTdHJpbmcgPSB0YXJnZXQuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoa2V5LCB0YXJnZXQsIHRydWUpO1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBvcHRpb25zLmxvY2FsaXphYmxlID09PSBcIm9iamVjdFwiICYmXG4gICAgICB0eXBlb2Ygb3B0aW9ucy5sb2NhbGl6YWJsZS5vbkdldFRleHRDYWxsYmFjayA9PT0gXCJmdW5jdGlvblwiXG4gICAgKSB7XG4gICAgICBsb2NTdHJpbmcub25HZXRUZXh0Q2FsbGJhY2sgPSBvcHRpb25zLmxvY2FsaXphYmxlLm9uR2V0VGV4dENhbGxiYWNrO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvcGVydHkob3B0aW9ucz86IElQcm9wZXJ0eURlY29yYXRvck9wdGlvbnMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcpIHtcbiAgICBsZXQgcHJvY2Vzc0NvbXB1dGVkVXBkYXRlciA9IChvYmo6IGFueSwgdmFsOiBhbnkpID0+IHtcbiAgICAgIGlmICghIXZhbCAmJiB0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiICYmIHZhbC50eXBlID09PSBDb21wdXRlZFVwZGF0ZXIuQ29tcHV0ZWRVcGRhdGVyVHlwZSkge1xuICAgICAgICBCYXNlLnN0YXJ0Q29sbGVjdERlcGVuZGVuY2llcygoKSA9PiBvYmpba2V5XSA9IHZhbC51cGRhdGVyKCksIG9iaiwga2V5KTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdmFsLnVwZGF0ZXIoKTtcbiAgICAgICAgY29uc3QgZGVwZW5kZW5jaWVzID0gQmFzZS5maW5pc2hDb2xsZWN0RGVwZW5kZW5jaWVzKCk7XG4gICAgICAgIHZhbC5zZXREZXBlbmRlbmNpZXMoZGVwZW5kZW5jaWVzKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWw7XG4gICAgfTtcbiAgICBpZiAoIW9wdGlvbnMgfHwgIW9wdGlvbnMubG9jYWxpemFibGUpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShrZXkpO1xuICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghIW9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmRlZmF1bHRTb3VyY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpc1tvcHRpb25zLmRlZmF1bHRTb3VyY2VdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWw6IGFueSkge1xuICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gcHJvY2Vzc0NvbXB1dGVkVXBkYXRlcih0aGlzLCB2YWwpO1xuICAgICAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShrZXksIG5ld1ZhbHVlKTtcbiAgICAgICAgICBpZiAoISFvcHRpb25zICYmIG9wdGlvbnMub25TZXQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMub25TZXQobmV3VmFsdWUsIHRoaXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZW5zdXJlTG9jU3RyaW5nKHRoaXMsIG9wdGlvbnMsIGtleSk7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KGtleSkgfHxcbiAgICAgICAgICAgIG9wdGlvbnMuZGVmYXVsdFZhbHVlIHx8XG4gICAgICAgICAgICB0aGlzW29wdGlvbnMuZGVmYXVsdFNvdXJjZV1cbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWw6IGFueSkge1xuICAgICAgICAgIGVuc3VyZUxvY1N0cmluZyh0aGlzLCBvcHRpb25zLCBrZXkpO1xuICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gcHJvY2Vzc0NvbXB1dGVkVXBkYXRlcih0aGlzLCB2YWwpO1xuICAgICAgICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KGtleSwgbmV3VmFsdWUpO1xuICAgICAgICAgIGlmICghIW9wdGlvbnMgJiYgb3B0aW9ucy5vblNldCkge1xuICAgICAgICAgICAgb3B0aW9ucy5vblNldChuZXdWYWx1ZSwgdGhpcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICAgIHRhcmdldCxcbiAgICAgICAgb3B0aW9ucy5sb2NhbGl6YWJsZSA9PT0gdHJ1ZVxuICAgICAgICAgID8gXCJsb2NcIiArIGtleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGtleS5zbGljZSgxKVxuICAgICAgICAgIDogb3B0aW9ucy5sb2NhbGl6YWJsZS5uYW1lLFxuICAgICAgICB7XG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBlbnN1cmVMb2NTdHJpbmcodGhpcywgb3B0aW9ucywga2V5KTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKGtleSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFycmF5UHJvcGVydHlEZWNvcmF0b3JPcHRpb25zIHtcbiAgb25QdXNoPzogYW55O1xuICBvblJlbW92ZT86IGFueTtcbiAgb25TZXQ/OiAodmFsOiBhbnksIHRhcmdldDogYW55KSA9PiB2b2lkO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVBcnJheShcbiAgdGFyZ2V0OiBhbnksXG4gIG9wdGlvbnM6IElBcnJheVByb3BlcnR5RGVjb3JhdG9yT3B0aW9ucyxcbiAga2V5OiBzdHJpbmdcbikge1xuICB0YXJnZXQuZW5zdXJlQXJyYXkoXG4gICAga2V5LFxuICAgIChpdGVtOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSAhIW9wdGlvbnMgPyBvcHRpb25zLm9uUHVzaCA6IG51bGw7XG4gICAgICBoYW5kbGVyICYmIGhhbmRsZXIoaXRlbSwgaW5kZXgsIHRhcmdldCk7XG4gICAgfSxcbiAgICAoaXRlbTogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gISFvcHRpb25zID8gb3B0aW9ucy5vblJlbW92ZSA6IG51bGw7XG4gICAgICBoYW5kbGVyICYmIGhhbmRsZXIoaXRlbSwgaW5kZXgsIHRhcmdldCk7XG4gICAgfSxcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb3BlcnR5QXJyYXkob3B0aW9ucz86IElBcnJheVByb3BlcnR5RGVjb3JhdG9yT3B0aW9ucykge1xuICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogYW55LCBrZXk6IHN0cmluZykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGVuc3VyZUFycmF5KHRoaXMsIG9wdGlvbnMsIGtleSk7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoa2V5KTtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uICh2YWw6IGFueSkge1xuICAgICAgICBlbnN1cmVBcnJheSh0aGlzLCBvcHRpb25zLCBrZXkpO1xuICAgICAgICBjb25zdCBhcnIgPSB0aGlzLmdldFByb3BlcnR5VmFsdWUoa2V5KTtcbiAgICAgICAgaWYgKHZhbCA9PT0gYXJyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhcnIpIHtcbiAgICAgICAgICBhcnIuc3BsaWNlKDAsIGFyci5sZW5ndGgsIC4uLih2YWwgfHwgW10pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoa2V5LCB2YWwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghIW9wdGlvbnMgJiYgb3B0aW9ucy5vblNldCkge1xuICAgICAgICAgIG9wdGlvbnMub25TZXQodmFsLCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJT2JqZWN0IHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vKipcbiAqIENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgcHJvcGVydHkgb2YgYSBzdXJ2ZXkgZWxlbWVudCAocGFnZSwgcGFuZWwsIHF1ZXN0aW9ucywgYW5kIGV0YykuXG4gKiBAc2VlIGFkZFByb3BlcnR5XG4gKiBAc2VlIHJlbW92ZVByb3BlcnR5XG4gKiBAc2VlIFtBZGQgUHJvcGVydGllc10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9Eb2N1bWVudGF0aW9uL1N1cnZleS1DcmVhdG9yI2FkZHByb3BlcnRpZXMpXG4gKiBAc2VlIFtSZW1vdmUgUHJvcGVydGllc10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9Eb2N1bWVudGF0aW9uL1N1cnZleS1DcmVhdG9yI3JlbW92ZXByb3BlcnRpZXMpXG4gKi9cbmV4cG9ydCBjbGFzcyBKc29uT2JqZWN0UHJvcGVydHkgaW1wbGVtZW50cyBJT2JqZWN0IHtcbiAgcHVibGljIHN0YXRpYyBnZXRJdGVtVmFsdWVzRGVmYXVsdFZhbHVlOiAodmFsOiBhbnkpID0+IGFueTtcbiAgW2tleTogc3RyaW5nXTogYW55O1xuICBwcml2YXRlIHN0YXRpYyBJbmRleCA9IDE7XG4gIHByaXZhdGUgc3RhdGljIG1lcmdhYmxlVmFsdWVzID0gW1xuICAgIFwidHlwZVZhbHVlXCIsXG4gICAgXCJjaG9pY2VzVmFsdWVcIixcbiAgICBcImJhc2VWYWx1ZVwiLFxuICAgIFwicmVhZE9ubHlWYWx1ZVwiLFxuICAgIFwidmlzaWJsZVZhbHVlXCIsXG4gICAgXCJpc1NlcmlhbGl6YWJsZVwiLFxuICAgIFwiaXNMaWdodFNlcmlhbGl6YWJsZVwiLFxuICAgIFwiaXNDdXN0b21cIixcbiAgICBcImlzQmluZGFibGVcIixcbiAgICBcImlzVW5pcXVlXCIsXG4gICAgXCJpc0R5bmFtaWNDaG9pY2VzXCIsXG4gICAgXCJpc0xvY2FsaXphYmxlVmFsdWVcIixcbiAgICBcImNsYXNzTmFtZVwiLFxuICAgIFwiYWx0ZXJuYXRpdmVOYW1lXCIsXG4gICAgXCJsYXlvdXRcIixcbiAgICBcImNsYXNzTmFtZVBhcnRcIixcbiAgICBcImJhc2VDbGFzc05hbWVcIixcbiAgICBcImRlZmF1bHRWYWx1ZVwiLFxuICAgIFwic2VyaWFsaXphdGlvblByb3BlcnR5XCIsXG4gICAgXCJvbkdldFZhbHVlXCIsXG4gICAgXCJvblNldFZhbHVlXCIsXG4gICAgXCJkaXNwbGF5TmFtZVwiLFxuICAgIFwiY2F0ZWdvcnlcIixcbiAgICBcImNhdGVnb3J5SW5kZXhcIixcbiAgICBcInZpc2libGVJbmRleFwiLFxuICAgIFwibmV4dFRvUHJvcGVydHlcIixcbiAgICBcInNob3dNb2RlXCIsXG4gICAgXCJkZXBlbmRlZFByb3BlcnRpZXNcIixcbiAgICBcInZpc2libGVJZlwiLFxuICAgIFwib25Qcm9wZXJ0eUVkaXRvclVwZGF0ZVwiLFxuICAgIFwibWF4TGVuZ3RoXCIsXG4gICAgXCJtYXhWYWx1ZVwiLFxuICAgIFwibWluVmFsdWVcIixcbiAgICBcImRhdGFMaXN0VmFsdWVcIixcbiAgXTtcbiAgcHJpdmF0ZSBpZFZhbHVlOiBudW1iZXI7XG4gIHByaXZhdGUgY2xhc3NJbmZvVmFsdWU6IEpzb25NZXRhZGF0YUNsYXNzO1xuICBwcml2YXRlIHR5cGVWYWx1ZTogc3RyaW5nID0gbnVsbDtcbiAgcHJpdmF0ZSBjaG9pY2VzVmFsdWU6IEFycmF5PGFueT4gPSBudWxsO1xuICBwcml2YXRlIGJhc2VWYWx1ZTogYW55ID0gbnVsbDtcbiAgcHJpdmF0ZSBpc1JlcXVpcmVkVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBpc1VuaXF1ZVZhbHVlOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZE9ubHlWYWx1ZTogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHZpc2libGVWYWx1ZTogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGlzTG9jYWxpemFibGVWYWx1ZTogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNob2ljZXNmdW5jOiAob2JqOiBhbnksIGNob2ljZXNDYWxsYmFjazogYW55KSA9PiBBcnJheTxhbnk+ID0gbnVsbDtcbiAgcHJpdmF0ZSBkZXBlbmRlZFByb3BlcnRpZXM6IEFycmF5PHN0cmluZz4gPSBudWxsO1xuICBwdWJsaWMgaXNTZXJpYWxpemFibGU6IGJvb2xlYW4gPSB0cnVlO1xuICBwdWJsaWMgaXNMaWdodFNlcmlhbGl6YWJsZTogYm9vbGVhbiA9IHRydWU7XG4gIHB1YmxpYyBpc0N1c3RvbTogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgaXNEeW5hbWljQ2hvaWNlczogYm9vbGVhbiA9IGZhbHNlOyAvL1RPRE8gb2Jzb2xldGUsIHVzZSBkZXBlbmRzT24gYXR0cmlidXRlXG4gIHB1YmxpYyBpc0JpbmRhYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBjbGFzc05hbWU6IHN0cmluZyA9IG51bGw7XG4gIHB1YmxpYyBhbHRlcm5hdGl2ZU5hbWU6IHN0cmluZyA9IG51bGw7XG4gIHB1YmxpYyBjbGFzc05hbWVQYXJ0OiBzdHJpbmcgPSBudWxsO1xuICBwdWJsaWMgYmFzZUNsYXNzTmFtZTogc3RyaW5nID0gbnVsbDtcbiAgcHVibGljIGRlZmF1bHRWYWx1ZVZhbHVlOiBhbnkgPSBudWxsO1xuICBwdWJsaWMgc2VyaWFsaXphdGlvblByb3BlcnR5OiBzdHJpbmcgPSBudWxsO1xuICBwdWJsaWMgZGlzcGxheU5hbWU6IHN0cmluZyA9IG51bGw7XG4gIHB1YmxpYyBjYXRlZ29yeTogc3RyaW5nID0gXCJcIjtcbiAgcHVibGljIGNhdGVnb3J5SW5kZXg6IG51bWJlciA9IC0xO1xuICBwdWJsaWMgdmlzaWJsZUluZGV4OiBudW1iZXIgPSAtMTtcbiAgcHVibGljIG5leHRUb1Byb3BlcnR5OiBzdHJpbmcgPSBudWxsO1xuICBwdWJsaWMgc2hvd01vZGU6IHN0cmluZyA9IG51bGw7XG4gIHB1YmxpYyBtYXhMZW5ndGg6IG51bWJlciA9IC0xO1xuICBwdWJsaWMgbWF4VmFsdWU6IGFueTtcbiAgcHVibGljIG1pblZhbHVlOiBhbnk7XG4gIHByaXZhdGUgZGF0YUxpc3RWYWx1ZTogQXJyYXk8c3RyaW5nPjtcbiAgcHVibGljIGxheW91dDogc3RyaW5nID0gbnVsbDtcbiAgcHVibGljIG9uR2V0VmFsdWU6IChvYmo6IGFueSkgPT4gYW55ID0gbnVsbDtcbiAgcHVibGljIG9uU2V0VmFsdWU6IChvYmo6IGFueSwgdmFsdWU6IGFueSwganNvbkNvbnY6IEpzb25PYmplY3QpID0+IGFueSA9IG51bGw7XG4gIHB1YmxpYyB2aXNpYmxlSWY6IChvYmo6IGFueSkgPT4gYm9vbGVhbiA9IG51bGw7XG4gIHB1YmxpYyBvblByb3BlcnR5RWRpdG9yVXBkYXRlOiAob2JqOiBhbnksIHByb3BFZGl0b3I6IGFueSkgPT4gYW55O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNsYXNzSW5mbzogSnNvbk1ldGFkYXRhQ2xhc3MsXG4gICAgcHVibGljIG5hbWU6IHN0cmluZyxcbiAgICBpc1JlcXVpcmVkOiBib29sZWFuID0gZmFsc2VcbiAgKSB7XG4gICAgdGhpcy5jbGFzc0luZm9WYWx1ZSA9IGNsYXNzSW5mbztcbiAgICB0aGlzLmlzUmVxdWlyZWRWYWx1ZSA9IGlzUmVxdWlyZWQ7XG4gICAgdGhpcy5pZFZhbHVlID0gSnNvbk9iamVjdFByb3BlcnR5LkluZGV4Kys7XG4gIH1cbiAgcHVibGljIGdldCBpZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmlkVmFsdWU7XG4gIH1cbiAgcHVibGljIGdldCBjbGFzc0luZm8oKTogSnNvbk1ldGFkYXRhQ2xhc3Mge1xuICAgIHJldHVybiB0aGlzLmNsYXNzSW5mb1ZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnR5cGVWYWx1ZSA/IHRoaXMudHlwZVZhbHVlIDogXCJzdHJpbmdcIjtcbiAgfVxuICBwdWJsaWMgc2V0IHR5cGUodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh2YWx1ZSA9PT0gXCJpdGVtdmFsdWVzXCIpIHZhbHVlID0gXCJpdGVtdmFsdWVbXVwiO1xuICAgIHRoaXMudHlwZVZhbHVlID0gdmFsdWU7XG4gICAgaWYgKHRoaXMudHlwZVZhbHVlLmluZGV4T2YoXCJbXVwiKSA9PT0gdGhpcy50eXBlVmFsdWUubGVuZ3RoIC0gMikge1xuICAgICAgdGhpcy5pc0FycmF5ID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2xhc3NOYW1lID0gdGhpcy50eXBlVmFsdWUuc3Vic3RyKDAsIHRoaXMudHlwZVZhbHVlLmxlbmd0aCAtIDIpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgaXNBcnJheSA9IGZhbHNlO1xuICBwdWJsaWMgZ2V0IGlzUmVxdWlyZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNSZXF1aXJlZFZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNSZXF1aXJlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzUmVxdWlyZWRWYWx1ZSA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzVW5pcXVlKCkge1xuICAgIHJldHVybiB0aGlzLmlzVW5pcXVlVmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCBpc1VuaXF1ZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzVW5pcXVlVmFsdWUgPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldCBoYXNUb1VzZUdldFZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLm9uR2V0VmFsdWUgfHwgdGhpcy5zZXJpYWxpemF0aW9uUHJvcGVydHk7XG4gIH1cbiAgcHVibGljIGdldCBkZWZhdWx0VmFsdWUoKSB7XG4gICAgdmFyIHJlc3VsdDogYW55ID0gdGhpcy5kZWZhdWx0VmFsdWVWYWx1ZTtcbiAgICBpZiAoXG4gICAgICAhIUpzb25PYmplY3RQcm9wZXJ0eS5nZXRJdGVtVmFsdWVzRGVmYXVsdFZhbHVlICYmXG4gICAgICBKc29uT2JqZWN0Lm1ldGFEYXRhLmlzRGVzY2VuZGFudE9mKHRoaXMuY2xhc3NOYW1lLCBcIml0ZW12YWx1ZVwiKVxuICAgICkge1xuICAgICAgcmVzdWx0ID0gSnNvbk9iamVjdFByb3BlcnR5LmdldEl0ZW1WYWx1ZXNEZWZhdWx0VmFsdWUoXG4gICAgICAgIHRoaXMuZGVmYXVsdFZhbHVlVmFsdWUgfHwgW11cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHVibGljIHNldCBkZWZhdWx0VmFsdWUobmV3VmFsdWUpIHtcbiAgICB0aGlzLmRlZmF1bHRWYWx1ZVZhbHVlID0gbmV3VmFsdWU7XG4gIH1cbiAgcHVibGljIGlzRGVmYXVsdFZhbHVlKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHRoaXMuZGVmYXVsdFZhbHVlKSlcbiAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZSA9PSB2YWx1ZTtcbiAgICByZXR1cm4gKFxuICAgICAgKHZhbHVlID09PSBmYWxzZSAmJiAodGhpcy50eXBlID09IFwiYm9vbGVhblwiIHx8IHRoaXMudHlwZSA9PSBcInN3aXRjaFwiKSkgfHxcbiAgICAgIHZhbHVlID09PSBcIlwiIHx8XG4gICAgICBIZWxwZXJzLmlzVmFsdWVFbXB0eSh2YWx1ZSlcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXRWYWx1ZShvYmo6IGFueSk6IGFueSB7XG4gICAgaWYgKHRoaXMub25HZXRWYWx1ZSkgcmV0dXJuIHRoaXMub25HZXRWYWx1ZShvYmopO1xuICAgIGlmICh0aGlzLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eSAmJiAhIW9ialt0aGlzLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eV0pXG4gICAgICByZXR1cm4gb2JqW3RoaXMuc2VyaWFsaXphdGlvblByb3BlcnR5XS5nZXRKc29uKCk7XG4gICAgcmV0dXJuIG9ialt0aGlzLm5hbWVdO1xuICB9XG4gIHB1YmxpYyBnZXRQcm9wZXJ0eVZhbHVlKG9iajogYW55KTogYW55IHtcbiAgICBpZiAodGhpcy5pc0xvY2FsaXphYmxlKSB7XG4gICAgICByZXR1cm4gISFvYmpbdGhpcy5zZXJpYWxpemF0aW9uUHJvcGVydHldXG4gICAgICAgID8gb2JqW3RoaXMuc2VyaWFsaXphdGlvblByb3BlcnR5XS50ZXh0XG4gICAgICAgIDogbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWUob2JqKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc1RvVXNlU2V0VmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMub25TZXRWYWx1ZSB8fCB0aGlzLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eTtcbiAgfVxuICBwdWJsaWMgc2V0VmFsdWUob2JqOiBhbnksIHZhbHVlOiBhbnksIGpzb25Db252OiBKc29uT2JqZWN0KSB7XG4gICAgaWYgKHRoaXMub25TZXRWYWx1ZSkge1xuICAgICAgdGhpcy5vblNldFZhbHVlKG9iaiwgdmFsdWUsIGpzb25Db252KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuc2VyaWFsaXphdGlvblByb3BlcnR5ICYmICEhb2JqW3RoaXMuc2VyaWFsaXphdGlvblByb3BlcnR5XSlcbiAgICAgICAgb2JqW3RoaXMuc2VyaWFsaXphdGlvblByb3BlcnR5XS5zZXRKc29uKHZhbHVlKTtcbiAgICAgIGVsc2Uge1xuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgaWYgKHRoaXMudHlwZSA9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHBhcnNlSW50KHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMudHlwZSA9PSBcImJvb2xlYW5cIiB8fCB0aGlzLnR5cGUgPT0gXCJzd2l0Y2hcIikge1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSBcInRydWVcIjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgb2JqW3RoaXMubmFtZV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIGdldE9ialR5cGUob2JqVHlwZTogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLmNsYXNzTmFtZVBhcnQpIHJldHVybiBvYmpUeXBlO1xuICAgIHJldHVybiBvYmpUeXBlLnJlcGxhY2UodGhpcy5jbGFzc05hbWVQYXJ0LCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgZ2V0Q2xhc3NOYW1lKGNsYXNzTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoY2xhc3NOYW1lKSBjbGFzc05hbWUgPSBjbGFzc05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gdGhpcy5jbGFzc05hbWVQYXJ0ICYmIGNsYXNzTmFtZS5pbmRleE9mKHRoaXMuY2xhc3NOYW1lUGFydCkgPCAwXG4gICAgICA/IGNsYXNzTmFtZSArIHRoaXMuY2xhc3NOYW1lUGFydFxuICAgICAgOiBjbGFzc05hbWU7XG4gIH1cbiAgLyoqXG4gICAqIERlcHJpY2F0ZWQsIHBsZWFzZSB1c2UgZ2V0Q2hvaWNlc1xuICAgKi9cbiAgcHVibGljIGdldCBjaG9pY2VzKCk6IEFycmF5PGFueT4ge1xuICAgIHJldHVybiB0aGlzLmdldENob2ljZXMobnVsbCk7XG4gIH1cbiAgcHVibGljIGdldCBoYXNDaG9pY2VzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuY2hvaWNlc1ZhbHVlIHx8ICEhdGhpcy5jaG9pY2VzZnVuYztcbiAgfVxuICBwdWJsaWMgZ2V0Q2hvaWNlcyhvYmo6IGFueSwgY2hvaWNlc0NhbGxiYWNrOiBhbnkgPSBudWxsKTogQXJyYXk8YW55PiB7XG4gICAgaWYgKHRoaXMuY2hvaWNlc1ZhbHVlICE9IG51bGwpIHJldHVybiB0aGlzLmNob2ljZXNWYWx1ZTtcbiAgICBpZiAodGhpcy5jaG9pY2VzZnVuYyAhPSBudWxsKSByZXR1cm4gdGhpcy5jaG9pY2VzZnVuYyhvYmosIGNob2ljZXNDYWxsYmFjayk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIHNldENob2ljZXMoXG4gICAgdmFsdWU6IEFycmF5PGFueT4sXG4gICAgdmFsdWVGdW5jOiAob2JqOiBhbnkpID0+IEFycmF5PGFueT4gPSBudWxsXG4gICkge1xuICAgIHRoaXMuY2hvaWNlc1ZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5jaG9pY2VzZnVuYyA9IHZhbHVlRnVuYztcbiAgfVxuICBwdWJsaWMgZ2V0QmFzZVZhbHVlKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmJhc2VWYWx1ZSkgcmV0dXJuIFwiXCI7XG4gICAgaWYgKHR5cGVvZiB0aGlzLmJhc2VWYWx1ZSA9PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0aGlzLmJhc2VWYWx1ZSgpO1xuICAgIHJldHVybiB0aGlzLmJhc2VWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0QmFzZVZhbHVlKHZhbDogYW55KSB7XG4gICAgdGhpcy5iYXNlVmFsdWUgPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldCByZWFkT25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkT25seVZhbHVlICE9IG51bGwgPyB0aGlzLnJlYWRPbmx5VmFsdWUgOiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgc2V0IHJlYWRPbmx5KHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMucmVhZE9ubHlWYWx1ZSA9IHZhbDtcbiAgfVxuICBwdWJsaWMgaXNWaXNpYmxlKGxheW91dDogc3RyaW5nLCBvYmo6IGFueSA9IG51bGwpOiBib29sZWFuIHtcbiAgICBsZXQgaXNMYXlvdXQgPSAhdGhpcy5sYXlvdXQgfHwgdGhpcy5sYXlvdXQgPT0gbGF5b3V0O1xuICAgIGlmICghdGhpcy52aXNpYmxlIHx8ICFpc0xheW91dCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghIXRoaXMudmlzaWJsZUlmICYmICEhb2JqKSByZXR1cm4gdGhpcy52aXNpYmxlSWYob2JqKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IHZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZVZhbHVlICE9IG51bGwgPyB0aGlzLnZpc2libGVWYWx1ZSA6IHRydWU7XG4gIH1cbiAgcHVibGljIHNldCB2aXNpYmxlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMudmlzaWJsZVZhbHVlID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNMb2NhbGl6YWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0xvY2FsaXphYmxlVmFsdWUgIT0gbnVsbCA/IHRoaXMuaXNMb2NhbGl6YWJsZVZhbHVlIDogZmFsc2U7XG4gIH1cbiAgcHVibGljIHNldCBpc0xvY2FsaXphYmxlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuaXNMb2NhbGl6YWJsZVZhbHVlID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgZGF0YUxpc3QoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGhpcy5kYXRhTGlzdFZhbHVlKSA/IHRoaXMuZGF0YUxpc3RWYWx1ZSA6IFtdO1xuICB9XG4gIHB1YmxpYyBzZXQgZGF0YUxpc3QodmFsOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgdGhpcy5kYXRhTGlzdFZhbHVlID0gdmFsO1xuICB9XG4gIHB1YmxpYyBtZXJnZVdpdGgocHJvcDogSnNvbk9iamVjdFByb3BlcnR5KSB7XG4gICAgdmFyIHZhbHVlc05hbWVzID0gSnNvbk9iamVjdFByb3BlcnR5Lm1lcmdhYmxlVmFsdWVzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMubWVyZ2VWYWx1ZShwcm9wLCB2YWx1ZXNOYW1lc1tpXSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBhZGREZXBlbmRlZFByb3BlcnR5KG5hbWU6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5kZXBlbmRlZFByb3BlcnRpZXMpIHtcbiAgICAgIHRoaXMuZGVwZW5kZWRQcm9wZXJ0aWVzID0gW107XG4gICAgfVxuICAgIGlmICh0aGlzLmRlcGVuZGVkUHJvcGVydGllcy5pbmRleE9mKG5hbWUpIDwgMCkge1xuICAgICAgdGhpcy5kZXBlbmRlZFByb3BlcnRpZXMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldERlcGVuZGVkUHJvcGVydGllcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICByZXR1cm4gISF0aGlzLmRlcGVuZGVkUHJvcGVydGllcyA/IHRoaXMuZGVwZW5kZWRQcm9wZXJ0aWVzIDogW107XG4gIH1cbiAgcHVibGljIHNjaGVtYVR5cGUoKTogc3RyaW5nIHtcbiAgICBpZiAoISF0aGlzLmNsYXNzTmFtZSkgcmV0dXJuIFwiYXJyYXlcIjtcbiAgICBpZiAoISF0aGlzLmJhc2VDbGFzc05hbWUpIHJldHVybiBcImFycmF5XCI7XG4gICAgaWYgKHRoaXMudHlwZSA9PSBcImJvb2xlYW5cIiB8fCB0aGlzLnR5cGUgPT0gXCJudW1iZXJcIikgcmV0dXJuIHRoaXMudHlwZTtcbiAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgfVxuICBwcml2YXRlIG1lcmdlVmFsdWUocHJvcDogSnNvbk9iamVjdFByb3BlcnR5LCB2YWx1ZU5hbWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzW3ZhbHVlTmFtZV0gPT0gbnVsbCAmJiBwcm9wW3ZhbHVlTmFtZV0gIT0gbnVsbCkge1xuICAgICAgdGhpc1t2YWx1ZU5hbWVdID0gcHJvcFt2YWx1ZU5hbWVdO1xuICAgIH1cbiAgfVxufVxuZXhwb3J0IGNsYXNzIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcHJvcGVydGllczogSU9iamVjdCA9IHt9O1xuICBwcml2YXRlIHN0YXRpYyBwYXJlbnRDbGFzc2VzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG4gIHB1YmxpYyBzdGF0aWMgYWRkUHJvcGVydHkoY2xhc3NOYW1lOiBzdHJpbmcsIHByb3BlcnR5OiBhbnkpIHtcbiAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgcHJvcHMgPSBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5wcm9wZXJ0aWVzO1xuICAgIGlmICghcHJvcHNbY2xhc3NOYW1lXSkge1xuICAgICAgcHJvcHNbY2xhc3NOYW1lXSA9IFtdO1xuICAgIH1cbiAgICBwcm9wc1tjbGFzc05hbWVdLnB1c2gocHJvcGVydHkpO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgcmVtb3ZlUHJvcGVydHkoY2xhc3NOYW1lOiBzdHJpbmcsIHByb3BlcnR5TmFtZTogc3RyaW5nKSB7XG4gICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIHByb3BzID0gQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24ucHJvcGVydGllcztcbiAgICBpZiAoIXByb3BzW2NsYXNzTmFtZV0pIHJldHVybjtcbiAgICB2YXIgcHJvcGVydGllcyA9IHByb3BzW2NsYXNzTmFtZV07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocHJvcGVydGllc1tpXS5uYW1lID09IHByb3BlcnR5TmFtZSkge1xuICAgICAgICBwcm9wc1tjbGFzc05hbWVdLnNwbGljZShpLCAxKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBzdGF0aWMgYWRkQ2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcsIHBhcmVudENsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHBhcmVudENsYXNzTmFtZSkge1xuICAgICAgcGFyZW50Q2xhc3NOYW1lID0gcGFyZW50Q2xhc3NOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLnBhcmVudENsYXNzZXNbY2xhc3NOYW1lXSA9IHBhcmVudENsYXNzTmFtZTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGdldFByb3BlcnRpZXMoY2xhc3NOYW1lOiBzdHJpbmcpOiBBcnJheTxhbnk+IHtcbiAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgcmVzID0gW107XG4gICAgdmFyIHByb3BzID0gQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24ucHJvcGVydGllcztcbiAgICB3aGlsZSAoY2xhc3NOYW1lKSB7XG4gICAgICB2YXIgcHJvcGVydGllcyA9IHByb3BzW2NsYXNzTmFtZV07XG4gICAgICBpZiAocHJvcGVydGllcykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICByZXMucHVzaChwcm9wZXJ0aWVzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2xhc3NOYW1lID0gQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24ucGFyZW50Q2xhc3Nlc1tjbGFzc05hbWVdO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlUHJvcGVydGllcyhvYmo6IGFueSkge1xuICAgIGlmICghb2JqIHx8ICFvYmouZ2V0VHlwZSkgcmV0dXJuO1xuICAgIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLmNyZWF0ZVByb3BlcnRpZXNDb3JlKG9iaiwgb2JqLmdldFR5cGUoKSk7XG4gIH1cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlUHJvcGVydGllc0NvcmUob2JqOiBhbnksIGNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgdmFyIHByb3BzID0gQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24ucHJvcGVydGllcztcbiAgICBpZiAocHJvcHNbY2xhc3NOYW1lXSkge1xuICAgICAgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24uY3JlYXRlUHJvcGVydGllc0luT2JqKG9iaiwgcHJvcHNbY2xhc3NOYW1lXSk7XG4gICAgfVxuICAgIHZhciBwYXJlbnRDbGFzcyA9IEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLnBhcmVudENsYXNzZXNbY2xhc3NOYW1lXTtcbiAgICBpZiAocGFyZW50Q2xhc3MpIHtcbiAgICAgIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLmNyZWF0ZVByb3BlcnRpZXNDb3JlKG9iaiwgcGFyZW50Q2xhc3MpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVQcm9wZXJ0aWVzSW5PYmoob2JqOiBhbnksIHByb3BlcnRpZXM6IGFueVtdKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5jcmVhdGVQcm9wZXJ0eUluT2JqKG9iaiwgcHJvcGVydGllc1tpXSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZVByb3BlcnR5SW5PYmoob2JqOiBhbnksIHByb3A6IEpzb25PYmplY3RQcm9wZXJ0eSkge1xuICAgIGlmIChvYmpbcHJvcC5uYW1lXSB8fCBvYmouaGFzT3duUHJvcGVydHkocHJvcC5uYW1lKSkgcmV0dXJuO1xuICAgIGlmIChcbiAgICAgIHByb3AuaXNMb2NhbGl6YWJsZSAmJlxuICAgICAgcHJvcC5zZXJpYWxpemF0aW9uUHJvcGVydHkgJiZcbiAgICAgICFvYmpbcHJvcC5zZXJpYWxpemF0aW9uUHJvcGVydHldICYmXG4gICAgICBvYmouY3JlYXRlQ3VzdG9tTG9jYWxpemFibGVPYmpcbiAgICApIHtcbiAgICAgIG9iai5jcmVhdGVDdXN0b21Mb2NhbGl6YWJsZU9iaihwcm9wLm5hbWUpO1xuICAgICAgdmFyIGxvY0Rlc2MgPSB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBvYmouZ2V0TG9jYWxpemFibGVTdHJpbmcocHJvcC5uYW1lKTtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eSwgbG9jRGVzYyk7XG4gICAgICB2YXIgZGVzYyA9IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIG9iai5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQocHJvcC5uYW1lLCBwcm9wLmRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHY6IGFueSkge1xuICAgICAgICAgIG9iai5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQocHJvcC5uYW1lLCB2KTtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLm5hbWUsIGRlc2MpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZGVmYXVsdFZhbHVlID0gcHJvcC5kZWZhdWx0VmFsdWU7XG4gICAgICB2YXIgaXNBcnJheVByb3AgPSBmYWxzZTtcbiAgICAgIGlmICh0eXBlb2Ygb2JqLmNyZWF0ZU5ld0FycmF5ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgaWYgKEpzb25PYmplY3QubWV0YURhdGEuaXNEZXNjZW5kYW50T2YocHJvcC5jbGFzc05hbWUsIFwiaXRlbXZhbHVlXCIpKSB7XG4gICAgICAgICAgb2JqLmNyZWF0ZU5ld0FycmF5KHByb3AubmFtZSwgZnVuY3Rpb24gKGl0ZW06IGFueSkge1xuICAgICAgICAgICAgaXRlbS5sb2NPd25lciA9IG9iajtcbiAgICAgICAgICAgIGl0ZW0ub3duZXJQcm9wZXJ0eU5hbWUgPSBwcm9wLm5hbWU7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaXNBcnJheVByb3AgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vSXQgaXMgYSBzaW1wbGUgYXJyYXkgcHJvcGVydHlcbiAgICAgICAgaWYgKHByb3AudHlwZSA9PT0gXCJtdWx0aXBsZXZhbHVlc1wiKSB7XG4gICAgICAgICAgb2JqLmNyZWF0ZU5ld0FycmF5KHByb3AubmFtZSk7XG4gICAgICAgICAgaXNBcnJheVByb3AgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0FycmF5UHJvcCkge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRlZmF1bHRWYWx1ZSkpIHtcbiAgICAgICAgICAgIG9iai5zZXRQcm9wZXJ0eVZhbHVlKHByb3AubmFtZSwgZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdFZhbHVlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCEhb2JqLmdldFByb3BlcnR5VmFsdWUgJiYgISFvYmouc2V0UHJvcGVydHlWYWx1ZSkge1xuICAgICAgICB2YXIgZGVzYyA9IHtcbiAgICAgICAgICBnZXQ6ICgpID0+IHtcbiAgICAgICAgICAgIGlmICghIXByb3Aub25HZXRWYWx1ZSkge1xuICAgICAgICAgICAgICByZXR1cm4gcHJvcC5vbkdldFZhbHVlKG9iaik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb2JqLmdldFByb3BlcnR5VmFsdWUocHJvcC5uYW1lLCBkZWZhdWx0VmFsdWUpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgc2V0OiBmdW5jdGlvbiAodjogYW55KSB7XG4gICAgICAgICAgICBpZiAoISFwcm9wLm9uU2V0VmFsdWUpIHtcbiAgICAgICAgICAgICAgcHJvcC5vblNldFZhbHVlKG9iaiwgdiwgbnVsbCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvYmouc2V0UHJvcGVydHlWYWx1ZShwcm9wLm5hbWUsIHYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AubmFtZSwgZGVzYyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBKc29uTWV0YWRhdGFDbGFzcyB7XG4gIHN0YXRpYyByZXF1aXJlZFN5bWJvbCA9IFwiIVwiO1xuICBzdGF0aWMgdHlwZVN5bWJvbCA9IFwiOlwiO1xuICBwcm9wZXJ0aWVzOiBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+ID0gbnVsbDtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG5hbWU6IHN0cmluZyxcbiAgICBwcm9wZXJ0aWVzOiBBcnJheTxhbnk+LFxuICAgIHB1YmxpYyBjcmVhdG9yOiAoanNvbj86IGFueSkgPT4gYW55ID0gbnVsbCxcbiAgICBwdWJsaWMgcGFyZW50TmFtZTogc3RyaW5nID0gbnVsbFxuICApIHtcbiAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICh0aGlzLnBhcmVudE5hbWUpIHtcbiAgICAgIHRoaXMucGFyZW50TmFtZSA9IHRoaXMucGFyZW50TmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24uYWRkQ2xhc3MobmFtZSwgdGhpcy5wYXJlbnROYW1lKTtcbiAgICB9XG4gICAgdGhpcy5wcm9wZXJ0aWVzID0gbmV3IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4oKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwcm9wID0gdGhpcy5jcmVhdGVQcm9wZXJ0eShwcm9wZXJ0aWVzW2ldKTtcbiAgICAgIGlmIChwcm9wKSB7XG4gICAgICAgIHRoaXMucHJvcGVydGllcy5wdXNoKHByb3ApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgZmluZChuYW1lOiBzdHJpbmcpOiBKc29uT2JqZWN0UHJvcGVydHkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5wcm9wZXJ0aWVzW2ldLm5hbWUgPT0gbmFtZSkgcmV0dXJuIHRoaXMucHJvcGVydGllc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIGNyZWF0ZVByb3BlcnR5KHByb3BJbmZvOiBhbnkpOiBKc29uT2JqZWN0UHJvcGVydHkge1xuICAgIHZhciBwcm9wZXJ0eU5hbWUgPSB0eXBlb2YgcHJvcEluZm8gPT09IFwic3RyaW5nXCIgPyBwcm9wSW5mbyA6IHByb3BJbmZvLm5hbWU7XG4gICAgaWYgKCFwcm9wZXJ0eU5hbWUpIHJldHVybjtcbiAgICB2YXIgcHJvcGVydHlUeXBlID0gbnVsbDtcbiAgICB2YXIgdHlwZUluZGV4ID0gcHJvcGVydHlOYW1lLmluZGV4T2YoSnNvbk1ldGFkYXRhQ2xhc3MudHlwZVN5bWJvbCk7XG4gICAgaWYgKHR5cGVJbmRleCA+IC0xKSB7XG4gICAgICBwcm9wZXJ0eVR5cGUgPSBwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKHR5cGVJbmRleCArIDEpO1xuICAgICAgcHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lLnN1YnN0cmluZygwLCB0eXBlSW5kZXgpO1xuICAgIH1cbiAgICB2YXIgaXNSZXF1aXJlZCA9XG4gICAgICB0aGlzLmdldElzUHJvcGVydHlOYW1lUmVxdWlyZWQocHJvcGVydHlOYW1lKSB8fCAhIXByb3BJbmZvLmlzUmVxdWlyZWQ7XG4gICAgcHJvcGVydHlOYW1lID0gdGhpcy5nZXRQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKTtcbiAgICB2YXIgcHJvcCA9IG5ldyBKc29uT2JqZWN0UHJvcGVydHkodGhpcywgcHJvcGVydHlOYW1lLCBpc1JlcXVpcmVkKTtcbiAgICBpZiAocHJvcGVydHlUeXBlKSB7XG4gICAgICBwcm9wLnR5cGUgPSBwcm9wZXJ0eVR5cGU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcHJvcEluZm8gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGlmIChwcm9wSW5mby50eXBlKSB7XG4gICAgICAgIHByb3AudHlwZSA9IHByb3BJbmZvLnR5cGU7XG4gICAgICB9XG4gICAgICBpZiAoIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHByb3BJbmZvLmRlZmF1bHQpKSB7XG4gICAgICAgIHByb3AuZGVmYXVsdFZhbHVlID0gcHJvcEluZm8uZGVmYXVsdDtcbiAgICAgIH1cbiAgICAgIGlmICghSGVscGVycy5pc1ZhbHVlRW1wdHkocHJvcEluZm8uaXNTZXJpYWxpemFibGUpKSB7XG4gICAgICAgIHByb3AuaXNTZXJpYWxpemFibGUgPSBwcm9wSW5mby5pc1NlcmlhbGl6YWJsZTtcbiAgICAgIH1cbiAgICAgIGlmICghSGVscGVycy5pc1ZhbHVlRW1wdHkocHJvcEluZm8uaXNMaWdodFNlcmlhbGl6YWJsZSkpIHtcbiAgICAgICAgcHJvcC5pc0xpZ2h0U2VyaWFsaXphYmxlID0gcHJvcEluZm8uaXNMaWdodFNlcmlhbGl6YWJsZTtcbiAgICAgIH1cbiAgICAgIGlmICghSGVscGVycy5pc1ZhbHVlRW1wdHkocHJvcEluZm8ubWF4TGVuZ3RoKSkge1xuICAgICAgICBwcm9wLm1heExlbmd0aCA9IHByb3BJbmZvLm1heExlbmd0aDtcbiAgICAgIH1cbiAgICAgIGlmICghSGVscGVycy5pc1ZhbHVlRW1wdHkocHJvcEluZm8uZGlzcGxheU5hbWUpKSB7XG4gICAgICAgIHByb3AuZGlzcGxheU5hbWUgPSBwcm9wSW5mby5kaXNwbGF5TmFtZTtcbiAgICAgIH1cbiAgICAgIGlmICghSGVscGVycy5pc1ZhbHVlRW1wdHkocHJvcEluZm8uY2F0ZWdvcnkpKSB7XG4gICAgICAgIHByb3AuY2F0ZWdvcnkgPSBwcm9wSW5mby5jYXRlZ29yeTtcbiAgICAgIH1cbiAgICAgIGlmICghSGVscGVycy5pc1ZhbHVlRW1wdHkocHJvcEluZm8uY2F0ZWdvcnlJbmRleCkpIHtcbiAgICAgICAgcHJvcC5jYXRlZ29yeUluZGV4ID0gcHJvcEluZm8uY2F0ZWdvcnlJbmRleDtcbiAgICAgIH1cbiAgICAgIGlmICghSGVscGVycy5pc1ZhbHVlRW1wdHkocHJvcEluZm8ubmV4dFRvUHJvcGVydHkpKSB7XG4gICAgICAgIHByb3AubmV4dFRvUHJvcGVydHkgPSBwcm9wSW5mby5uZXh0VG9Qcm9wZXJ0eTtcbiAgICAgIH1cbiAgICAgIGlmICghSGVscGVycy5pc1ZhbHVlRW1wdHkocHJvcEluZm8udmlzaWJsZUluZGV4KSkge1xuICAgICAgICBwcm9wLnZpc2libGVJbmRleCA9IHByb3BJbmZvLnZpc2libGVJbmRleDtcbiAgICAgIH1cbiAgICAgIGlmICghSGVscGVycy5pc1ZhbHVlRW1wdHkocHJvcEluZm8uc2hvd01vZGUpKSB7XG4gICAgICAgIHByb3Auc2hvd01vZGUgPSBwcm9wSW5mby5zaG93TW9kZTtcbiAgICAgIH1cbiAgICAgIGlmICghSGVscGVycy5pc1ZhbHVlRW1wdHkocHJvcEluZm8ubWF4VmFsdWUpKSB7XG4gICAgICAgIHByb3AubWF4VmFsdWUgPSBwcm9wSW5mby5tYXhWYWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmICghSGVscGVycy5pc1ZhbHVlRW1wdHkocHJvcEluZm8ubWluVmFsdWUpKSB7XG4gICAgICAgIHByb3AubWluVmFsdWUgPSBwcm9wSW5mby5taW5WYWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmICghSGVscGVycy5pc1ZhbHVlRW1wdHkocHJvcEluZm8uZGF0YUxpc3QpKSB7XG4gICAgICAgIHByb3AuZGF0YUxpc3QgPSBwcm9wSW5mby5kYXRhTGlzdDtcbiAgICAgIH1cbiAgICAgIGlmICghSGVscGVycy5pc1ZhbHVlRW1wdHkocHJvcEluZm8uaXNEeW5hbWljQ2hvaWNlcykpIHtcbiAgICAgICAgcHJvcC5pc0R5bmFtaWNDaG9pY2VzID0gcHJvcEluZm8uaXNEeW5hbWljQ2hvaWNlcztcbiAgICAgIH1cbiAgICAgIGlmICghSGVscGVycy5pc1ZhbHVlRW1wdHkocHJvcEluZm8uaXNCaW5kYWJsZSkpIHtcbiAgICAgICAgcHJvcC5pc0JpbmRhYmxlID0gcHJvcEluZm8uaXNCaW5kYWJsZTtcbiAgICAgIH1cbiAgICAgIGlmICghSGVscGVycy5pc1ZhbHVlRW1wdHkocHJvcEluZm8uaXNVbmlxdWUpKSB7XG4gICAgICAgIHByb3AuaXNVbmlxdWUgPSBwcm9wSW5mby5pc1VuaXF1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wSW5mby52aXNpYmxlID09PSB0cnVlIHx8IHByb3BJbmZvLnZpc2libGUgPT09IGZhbHNlKSB7XG4gICAgICAgIHByb3AudmlzaWJsZSA9IHByb3BJbmZvLnZpc2libGU7XG4gICAgICB9XG4gICAgICBpZiAoISFwcm9wSW5mby52aXNpYmxlSWYpIHtcbiAgICAgICAgcHJvcC52aXNpYmxlSWYgPSBwcm9wSW5mby52aXNpYmxlSWY7XG4gICAgICB9XG4gICAgICBpZiAoISFwcm9wSW5mby5vblByb3BlcnR5RWRpdG9yVXBkYXRlKSB7XG4gICAgICAgIHByb3Aub25Qcm9wZXJ0eUVkaXRvclVwZGF0ZSA9IHByb3BJbmZvLm9uUHJvcGVydHlFZGl0b3JVcGRhdGU7XG4gICAgICB9XG4gICAgICBpZiAocHJvcEluZm8ucmVhZE9ubHkgPT09IHRydWUpIHtcbiAgICAgICAgcHJvcC5yZWFkT25seSA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAocHJvcEluZm8uY2hvaWNlcykge1xuICAgICAgICB2YXIgY2hvaWNlc0Z1bmMgPVxuICAgICAgICAgIHR5cGVvZiBwcm9wSW5mby5jaG9pY2VzID09PSBcImZ1bmN0aW9uXCIgPyBwcm9wSW5mby5jaG9pY2VzIDogbnVsbDtcbiAgICAgICAgdmFyIGNob2ljZXNWYWx1ZSA9XG4gICAgICAgICAgdHlwZW9mIHByb3BJbmZvLmNob2ljZXMgIT09IFwiZnVuY3Rpb25cIiA/IHByb3BJbmZvLmNob2ljZXMgOiBudWxsO1xuICAgICAgICBwcm9wLnNldENob2ljZXMoY2hvaWNlc1ZhbHVlLCBjaG9pY2VzRnVuYyk7XG4gICAgICB9XG4gICAgICBpZiAoISFwcm9wSW5mby5iYXNlVmFsdWUpIHtcbiAgICAgICAgcHJvcC5zZXRCYXNlVmFsdWUocHJvcEluZm8uYmFzZVZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wSW5mby5vbkdldFZhbHVlKSB7XG4gICAgICAgIHByb3Aub25HZXRWYWx1ZSA9IHByb3BJbmZvLm9uR2V0VmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAocHJvcEluZm8ub25TZXRWYWx1ZSkge1xuICAgICAgICBwcm9wLm9uU2V0VmFsdWUgPSBwcm9wSW5mby5vblNldFZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BJbmZvLmlzTG9jYWxpemFibGUpIHtcbiAgICAgICAgcHJvcEluZm8uc2VyaWFsaXphdGlvblByb3BlcnR5ID0gXCJsb2NcIiArIHByb3AubmFtZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wSW5mby5zZXJpYWxpemF0aW9uUHJvcGVydHkpIHtcbiAgICAgICAgcHJvcC5zZXJpYWxpemF0aW9uUHJvcGVydHkgPSBwcm9wSW5mby5zZXJpYWxpemF0aW9uUHJvcGVydHk7XG4gICAgICAgIHZhciBzOiBzdHJpbmc7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBwcm9wLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eSAmJlxuICAgICAgICAgIHByb3Auc2VyaWFsaXphdGlvblByb3BlcnR5LmluZGV4T2YoXCJsb2NcIikgPT0gMFxuICAgICAgICApIHtcbiAgICAgICAgICBwcm9wLmlzTG9jYWxpemFibGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocHJvcEluZm8uaXNMb2NhbGl6YWJsZSkge1xuICAgICAgICBwcm9wLmlzTG9jYWxpemFibGUgPSBwcm9wSW5mby5pc0xvY2FsaXphYmxlO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BJbmZvLmNsYXNzTmFtZSkge1xuICAgICAgICBwcm9wLmNsYXNzTmFtZSA9IHByb3BJbmZvLmNsYXNzTmFtZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wSW5mby5iYXNlQ2xhc3NOYW1lKSB7XG4gICAgICAgIHByb3AuYmFzZUNsYXNzTmFtZSA9IHByb3BJbmZvLmJhc2VDbGFzc05hbWU7XG4gICAgICB9XG4gICAgICBpZiAocHJvcEluZm8uY2xhc3NOYW1lUGFydCkge1xuICAgICAgICBwcm9wLmNsYXNzTmFtZVBhcnQgPSBwcm9wSW5mby5jbGFzc05hbWVQYXJ0O1xuICAgICAgfVxuICAgICAgaWYgKHByb3BJbmZvLmFsdGVybmF0aXZlTmFtZSkge1xuICAgICAgICBwcm9wLmFsdGVybmF0aXZlTmFtZSA9IHByb3BJbmZvLmFsdGVybmF0aXZlTmFtZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wSW5mby5sYXlvdXQpIHtcbiAgICAgICAgcHJvcC5sYXlvdXQgPSBwcm9wSW5mby5sYXlvdXQ7XG4gICAgICB9XG4gICAgICBpZiAocHJvcEluZm8uZGVwZW5kc09uKSB7XG4gICAgICAgIHRoaXMuYWRkRGVwZW5kc09uUHJvcGVydGllcyhwcm9wLCBwcm9wSW5mby5kZXBlbmRzT24pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJvcDtcbiAgfVxuICBwcml2YXRlIGFkZERlcGVuZHNPblByb3BlcnRpZXMocHJvcDogSnNvbk9iamVjdFByb3BlcnR5LCBkZXBlbmRzT246IGFueSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRlcGVuZHNPbikpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVwZW5kc09uLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuYWRkRGVwZW5kc09uUHJvcGVydHkocHJvcCwgZGVwZW5kc09uW2ldKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hZGREZXBlbmRzT25Qcm9wZXJ0eShwcm9wLCBkZXBlbmRzT24pO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGFkZERlcGVuZHNPblByb3BlcnR5KHByb3A6IEpzb25PYmplY3RQcm9wZXJ0eSwgZGVwZW5kc09uOiBzdHJpbmcpIHtcbiAgICB2YXIgcHJvcGVydHkgPSB0aGlzLmZpbmQoZGVwZW5kc09uKTtcbiAgICBpZiAoIXByb3BlcnR5KSB7XG4gICAgICBwcm9wZXJ0eSA9IFNlcmlhbGl6ZXIuZmluZFByb3BlcnR5KHRoaXMucGFyZW50TmFtZSwgZGVwZW5kc09uKTtcbiAgICB9XG4gICAgaWYgKCFwcm9wZXJ0eSkgcmV0dXJuO1xuICAgIHByb3BlcnR5LmFkZERlcGVuZGVkUHJvcGVydHkocHJvcC5uYW1lKTtcbiAgfVxuICBwcml2YXRlIGdldElzUHJvcGVydHlOYW1lUmVxdWlyZWQocHJvcGVydHlOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgcHJvcGVydHlOYW1lLmxlbmd0aCA+IDAgJiZcbiAgICAgIHByb3BlcnR5TmFtZVswXSA9PSBKc29uTWV0YWRhdGFDbGFzcy5yZXF1aXJlZFN5bWJvbFxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5nZXRJc1Byb3BlcnR5TmFtZVJlcXVpcmVkKHByb3BlcnR5TmFtZSkpIHJldHVybiBwcm9wZXJ0eU5hbWU7XG4gICAgcHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lLnNsaWNlKDEpO1xuICAgIHJldHVybiBwcm9wZXJ0eU5hbWU7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgbWV0YWRhdGEgb2JqZWN0LiBJdCBjb250YWlucyBvYmplY3QgcHJvcGVydGllcycgcnVudGltZSBpbmZvcm1hdGlvbiBhbmQgYWxsb3dzIHlvdSB0byBtb2RpZnkgaXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBKc29uTWV0YWRhdGEge1xuICBwcml2YXRlIGNsYXNzZXM6IEhhc2hUYWJsZTxKc29uTWV0YWRhdGFDbGFzcz4gPSB7fTtcbiAgcHJpdmF0ZSBhbHRlcm5hdGl2ZU5hbWVzOiBIYXNoVGFibGU8c3RyaW5nPiA9IHt9O1xuICBwcml2YXRlIGNoaWxkcmVuQ2xhc3NlczogSGFzaFRhYmxlPEFycmF5PEpzb25NZXRhZGF0YUNsYXNzPj4gPSB7fTtcbiAgcHJpdmF0ZSBjbGFzc1Byb3BlcnRpZXM6IEhhc2hUYWJsZTxBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+PiA9IHt9O1xuICBwcml2YXRlIGNsYXNzSGFzaFByb3BlcnRpZXM6IEhhc2hUYWJsZTxIYXNoVGFibGU8SnNvbk9iamVjdFByb3BlcnR5Pj4gPSB7fTtcbiAgcHVibGljIGdldE9ialByb3BlcnR5VmFsdWUob2JqOiBhbnksIG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKHRoaXMuaXNPYmpXcmFwcGVyKG9iaikpIHtcbiAgICAgIHZhciBvcmlnbmFsT2JqID0gb2JqLmdldE9yaWdpbmFsT2JqKCk7XG4gICAgICB2YXIgcHJvcCA9IFNlcmlhbGl6ZXIuZmluZFByb3BlcnR5KG9yaWduYWxPYmouZ2V0VHlwZSgpLCBuYW1lKTtcbiAgICAgIGlmICghIXByb3ApIHJldHVybiB0aGlzLmdldE9ialByb3BlcnR5VmFsdWVDb3JlKG9yaWduYWxPYmosIHByb3ApO1xuICAgIH1cbiAgICB2YXIgcHJvcCA9IFNlcmlhbGl6ZXIuZmluZFByb3BlcnR5KG9iai5nZXRUeXBlKCksIG5hbWUpO1xuICAgIGlmICghcHJvcCkgcmV0dXJuIG9ialtuYW1lXTtcbiAgICByZXR1cm4gdGhpcy5nZXRPYmpQcm9wZXJ0eVZhbHVlQ29yZShvYmosIHByb3ApO1xuICB9XG4gIHB1YmxpYyBzZXRPYmpQcm9wZXJ0eVZhbHVlKG9iajogYW55LCBuYW1lOiBzdHJpbmcsIHZhbDogYW55KSB7XG4gICAgaWYgKG9ialtuYW1lXSA9PT0gdmFsKSByZXR1cm47XG4gICAgaWYgKCEhb2JqW25hbWVdICYmICEhb2JqW25hbWVdLnNldEpzb24pIHtcbiAgICAgIG9ialtuYW1lXS5zZXRKc29uKHZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9ialtuYW1lXSA9IHZhbDtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXRPYmpQcm9wZXJ0eVZhbHVlQ29yZShvYmo6IGFueSwgcHJvcDogSnNvbk9iamVjdFByb3BlcnR5KTogYW55IHtcbiAgICBpZiAoIXByb3AuaXNTZXJpYWxpemFibGUpIHJldHVybiBvYmpbcHJvcC5uYW1lXTtcbiAgICBpZiAocHJvcC5pc0xvY2FsaXphYmxlKSB7XG4gICAgICBpZiAocHJvcC5pc0FycmF5KSByZXR1cm4gb2JqW3Byb3AubmFtZV07XG4gICAgICBpZiAoISFwcm9wLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eSlcbiAgICAgICAgcmV0dXJuIG9ialtwcm9wLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eV0udGV4dDtcbiAgICB9XG4gICAgcmV0dXJuIG9iai5nZXRQcm9wZXJ0eVZhbHVlKHByb3AubmFtZSk7XG4gIH1cbiAgcHJpdmF0ZSBpc09ialdyYXBwZXIob2JqOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFvYmouZ2V0T3JpZ2luYWxPYmogJiYgISFvYmouZ2V0T3JpZ2luYWxPYmooKTtcbiAgfVxuICBwdWJsaWMgYWRkQ2xhc3MoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHByb3BlcnRpZXM6IEFycmF5PGFueT4sXG4gICAgY3JlYXRvcjogKGpzb24/OiBhbnkpID0+IGFueSA9IG51bGwsXG4gICAgcGFyZW50TmFtZTogc3RyaW5nID0gbnVsbFxuICApOiBKc29uTWV0YWRhdGFDbGFzcyB7XG4gICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgbWV0YURhdGFDbGFzcyA9IG5ldyBKc29uTWV0YWRhdGFDbGFzcyhcbiAgICAgIG5hbWUsXG4gICAgICBwcm9wZXJ0aWVzLFxuICAgICAgY3JlYXRvcixcbiAgICAgIHBhcmVudE5hbWVcbiAgICApO1xuICAgIHRoaXMuY2xhc3Nlc1tuYW1lXSA9IG1ldGFEYXRhQ2xhc3M7XG4gICAgaWYgKHBhcmVudE5hbWUpIHtcbiAgICAgIHBhcmVudE5hbWUgPSBwYXJlbnROYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuQ2xhc3Nlc1twYXJlbnROYW1lXTtcbiAgICAgIGlmICghY2hpbGRyZW4pIHtcbiAgICAgICAgdGhpcy5jaGlsZHJlbkNsYXNzZXNbcGFyZW50TmFtZV0gPSBbXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hpbGRyZW5DbGFzc2VzW3BhcmVudE5hbWVdLnB1c2gobWV0YURhdGFDbGFzcyk7XG4gICAgfVxuICAgIHJldHVybiBtZXRhRGF0YUNsYXNzO1xuICB9XG4gIHB1YmxpYyByZW1vdmVDbGFzcyhuYW1lOiBzdHJpbmcpIHtcbiAgICB2YXIgbWV0YUNsYXNzID0gdGhpcy5maW5kQ2xhc3MobmFtZSk7XG4gICAgaWYgKCFtZXRhQ2xhc3MpIHJldHVybjtcbiAgICBkZWxldGUgdGhpcy5jbGFzc2VzW21ldGFDbGFzcy5uYW1lXTtcbiAgICBpZiAoISFtZXRhQ2xhc3MucGFyZW50TmFtZSkge1xuICAgICAgdmFyIGluZGV4ID0gdGhpcy5jaGlsZHJlbkNsYXNzZXNbbWV0YUNsYXNzLnBhcmVudE5hbWVdLmluZGV4T2YobWV0YUNsYXNzKTtcbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgIHRoaXMuY2hpbGRyZW5DbGFzc2VzW21ldGFDbGFzcy5wYXJlbnROYW1lXS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgb3ZlcnJpZGVDbGFzc0NyZWF0b3JlKG5hbWU6IHN0cmluZywgY3JlYXRvcjogKCkgPT4gYW55KSB7XG4gICAgdGhpcy5vdmVycmlkZUNsYXNzQ3JlYXRvcihuYW1lLCBjcmVhdG9yKTtcbiAgfVxuICBwdWJsaWMgb3ZlcnJpZGVDbGFzc0NyZWF0b3IobmFtZTogc3RyaW5nLCBjcmVhdG9yOiAoKSA9PiBhbnkpIHtcbiAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciBtZXRhRGF0YUNsYXNzID0gdGhpcy5maW5kQ2xhc3MobmFtZSk7XG4gICAgaWYgKG1ldGFEYXRhQ2xhc3MpIHtcbiAgICAgIG1ldGFEYXRhQ2xhc3MuY3JlYXRvciA9IGNyZWF0b3I7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRQcm9wZXJ0aWVzKGNsYXNzTmFtZTogc3RyaW5nKTogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PiB7XG4gICAgdmFyIG1ldGFDbGFzcyA9IHRoaXMuZmluZENsYXNzKGNsYXNzTmFtZSk7XG4gICAgaWYgKCFtZXRhQ2xhc3MpIHJldHVybiBbXTtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuY2xhc3NQcm9wZXJ0aWVzW21ldGFDbGFzcy5uYW1lXTtcbiAgICBpZiAoISFwcm9wZXJ0aWVzKSByZXR1cm4gcHJvcGVydGllcztcbiAgICB0aGlzLmZpbGxQcm9wZXJ0aWVzRm9yQ2xhc3MobWV0YUNsYXNzLm5hbWUpO1xuICAgIHJldHVybiB0aGlzLmNsYXNzUHJvcGVydGllc1ttZXRhQ2xhc3MubmFtZV07XG4gIH1cbiAgcHJpdmF0ZSBnZXRIYXNoUHJvcGVydGllcyhjbGFzc05hbWU6IHN0cmluZyk6IEhhc2hUYWJsZTxKc29uT2JqZWN0UHJvcGVydHk+IHtcbiAgICB2YXIgbWV0YUNsYXNzID0gdGhpcy5maW5kQ2xhc3MoY2xhc3NOYW1lKTtcbiAgICBpZiAoIW1ldGFDbGFzcykgcmV0dXJuIHt9O1xuICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5jbGFzc0hhc2hQcm9wZXJ0aWVzW21ldGFDbGFzcy5uYW1lXTtcbiAgICBpZiAoISFwcm9wZXJ0aWVzKSByZXR1cm4gcHJvcGVydGllcztcbiAgICB0aGlzLmZpbGxQcm9wZXJ0aWVzRm9yQ2xhc3MobWV0YUNsYXNzLm5hbWUpO1xuICAgIHJldHVybiB0aGlzLmNsYXNzSGFzaFByb3BlcnRpZXNbbWV0YUNsYXNzLm5hbWVdO1xuICB9XG4gIHByaXZhdGUgZmlsbFByb3BlcnRpZXNGb3JDbGFzcyhjbGFzc05hbWU6IHN0cmluZykge1xuICAgIHZhciBwcm9wZXJ0aWVzID0gbmV3IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4oKTtcbiAgICB2YXIgaGFzaFByb3BlcnRpZXMgPSB7fTtcbiAgICB0aGlzLmZpbGxQcm9wZXJ0aWVzKGNsYXNzTmFtZSwgcHJvcGVydGllcywgaGFzaFByb3BlcnRpZXMpO1xuICAgIHRoaXMuY2xhc3NQcm9wZXJ0aWVzW2NsYXNzTmFtZV0gPSBwcm9wZXJ0aWVzO1xuICAgIHRoaXMuY2xhc3NIYXNoUHJvcGVydGllc1tjbGFzc05hbWVdID0gaGFzaFByb3BlcnRpZXM7XG4gIH1cbiAgcHVibGljIGdldFByb3BlcnRpZXNCeU9iaihvYmo6IGFueSk6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4ge1xuICAgIGlmICghb2JqIHx8ICFvYmouZ2V0VHlwZSkgcmV0dXJuIFtdO1xuICAgIHZhciByZXM6IGFueSA9IHt9O1xuICAgIHZhciBwcm9wcyA9IHRoaXMuZ2V0UHJvcGVydGllcyhvYmouZ2V0VHlwZSgpKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXNbcHJvcHNbaV0ubmFtZV0gPSBwcm9wc1tpXTtcbiAgICB9XG4gICAgdmFyIGR5bmFtaWNQcm9wcyA9ICEhb2JqLmdldER5bmFtaWNUeXBlXG4gICAgICA/IHRoaXMuZ2V0UHJvcGVydGllcyhvYmouZ2V0RHluYW1pY1R5cGUoKSlcbiAgICAgIDogbnVsbDtcbiAgICBpZiAoZHluYW1pY1Byb3BzICYmIGR5bmFtaWNQcm9wcy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGR5bmFtaWNQcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgZFByb3AgPSBkeW5hbWljUHJvcHNbaV07XG4gICAgICAgIGlmICghIXJlc1tkUHJvcC5uYW1lXSkgY29udGludWU7XG4gICAgICAgIHJlc1tkUHJvcC5uYW1lXSA9IGRQcm9wO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmtleXMocmVzKS5tYXAoKGtleSkgPT4gcmVzW2tleV0pO1xuICB9XG4gIHB1YmxpYyBnZXREeW5hbWljUHJvcGVydGllc0J5T2JqKFxuICAgIG9iajogYW55LFxuICAgIGR5bmFtaWNUeXBlOiBzdHJpbmcgPSBudWxsXG4gICk6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4ge1xuICAgIGlmICghb2JqIHx8ICFvYmouZ2V0VHlwZSB8fCAoIW9iai5nZXREeW5hbWljVHlwZSAmJiAhZHluYW1pY1R5cGUpKVxuICAgICAgcmV0dXJuIFtdO1xuICAgIHZhciBkVHlwZSA9ICEhZHluYW1pY1R5cGUgPyBkeW5hbWljVHlwZSA6IG9iai5nZXREeW5hbWljVHlwZSgpO1xuICAgIGlmICghZFR5cGUpIHJldHVybiBbXTtcbiAgICB2YXIgZHluYW1pY1Byb3BzID0gdGhpcy5nZXRQcm9wZXJ0aWVzKGRUeXBlKTtcbiAgICBpZiAoIWR5bmFtaWNQcm9wcyB8fCBkeW5hbWljUHJvcHMubGVuZ3RoID09IDApIHJldHVybiBbXTtcbiAgICB2YXIgaGFzaDogYW55ID0ge307XG4gICAgdmFyIHByb3BzID0gdGhpcy5nZXRQcm9wZXJ0aWVzKG9iai5nZXRUeXBlKCkpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGhhc2hbcHJvcHNbaV0ubmFtZV0gPSBwcm9wc1tpXTtcbiAgICB9XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZHluYW1pY1Byb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgZFByb3AgPSBkeW5hbWljUHJvcHNbaV07XG4gICAgICBpZiAoIWhhc2hbZFByb3AubmFtZV0pIHtcbiAgICAgICAgcmVzLnB1c2goZFByb3ApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBoYXNPcmlnaW5hbFByb3BlcnR5KG9iajogQmFzZSwgcHJvcE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZ2V0T3JpZ2luYWxQcm9wZXJ0eShvYmosIHByb3BOYW1lKTtcbiAgfVxuICBwdWJsaWMgZ2V0T3JpZ2luYWxQcm9wZXJ0eShvYmo6IEJhc2UsIHByb3BOYW1lOiBzdHJpbmcpOiBKc29uT2JqZWN0UHJvcGVydHkge1xuICAgIHZhciByZXMgPSB0aGlzLmZpbmRQcm9wZXJ0eShvYmouZ2V0VHlwZSgpLCBwcm9wTmFtZSk7XG4gICAgaWYgKCEhcmVzKSByZXR1cm4gcmVzO1xuICAgIGlmICh0aGlzLmlzT2JqV3JhcHBlcihvYmopKVxuICAgICAgcmV0dXJuIHRoaXMuZmluZFByb3BlcnR5KCg8YW55Pm9iaikuZ2V0T3JpZ2luYWxPYmooKS5nZXRUeXBlKCksIHByb3BOYW1lKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgZ2V0UHJvcGVydHkoXG4gICAgY2xhc3NOYW1lOiBzdHJpbmcsXG4gICAgcHJvcGVydHlOYW1lOiBzdHJpbmdcbiAgKTogSnNvbk9iamVjdFByb3BlcnR5IHtcbiAgICBjb25zdCBwcm9wID0gdGhpcy5maW5kUHJvcGVydHkoY2xhc3NOYW1lLCBwcm9wZXJ0eU5hbWUpO1xuICAgIGlmICghcHJvcCkgcmV0dXJuIHByb3A7XG4gICAgY29uc3QgY2xhc3NJbmZvID0gdGhpcy5maW5kQ2xhc3MoY2xhc3NOYW1lKTtcbiAgICBpZiAocHJvcC5jbGFzc0luZm8gPT09IGNsYXNzSW5mbykgcmV0dXJuIHByb3A7XG4gICAgY29uc3QgbmV3UHJvcCA9IG5ldyBKc29uT2JqZWN0UHJvcGVydHkoY2xhc3NJbmZvLCBwcm9wZXJ0eU5hbWUsIHByb3AuaXNSZXF1aXJlZCk7XG4gICAgbmV3UHJvcC5tZXJnZVdpdGgocHJvcCk7XG4gICAgY2xhc3NJbmZvLnByb3BlcnRpZXMucHVzaChuZXdQcm9wKTtcbiAgICB0aGlzLmVtcHR5Q2xhc3NQcm9wZXJ0aWVzSGFzaChjbGFzc0luZm8pO1xuICAgIHJldHVybiBuZXdQcm9wO1xuICB9XG4gIHB1YmxpYyBmaW5kUHJvcGVydHkoXG4gICAgY2xhc3NOYW1lOiBzdHJpbmcsXG4gICAgcHJvcGVydHlOYW1lOiBzdHJpbmdcbiAgKTogSnNvbk9iamVjdFByb3BlcnR5IHtcbiAgICB2YXIgaGFzaCA9IHRoaXMuZ2V0SGFzaFByb3BlcnRpZXMoY2xhc3NOYW1lKTtcbiAgICB2YXIgcmVzID0gaGFzaFtwcm9wZXJ0eU5hbWVdO1xuICAgIHJldHVybiAhIXJlcyA/IHJlcyA6IG51bGw7XG4gIH1cbiAgcHVibGljIGZpbmRQcm9wZXJ0aWVzKFxuICAgIGNsYXNzTmFtZTogc3RyaW5nLFxuICAgIHByb3BlcnR5TmFtZXM6IEFycmF5PHN0cmluZz5cbiAgKTogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PiB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBoYXNoID0gdGhpcy5nZXRIYXNoUHJvcGVydGllcyhjbGFzc05hbWUpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydHlOYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByb3AgPSBoYXNoW3Byb3BlcnR5TmFtZXNbaV1dO1xuICAgICAgaWYgKHByb3ApIHtcbiAgICAgICAgcmVzdWx0LnB1c2gocHJvcCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHVibGljIGdldEFsbFByb3BlcnRpZXNCeU5hbWUoXG4gICAgcHJvcGVydHlOYW1lOiBzdHJpbmdcbiAgKTogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PiB7XG4gICAgdmFyIHJlcyA9IG5ldyBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+KCk7XG4gICAgdmFyIGNsYXNzZXMgPSB0aGlzLmdldEFsbENsYXNzZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjbGFzc0luZm8gPSB0aGlzLmZpbmRDbGFzcyhjbGFzc2VzW2ldKTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2xhc3NJbmZvLnByb3BlcnRpZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKGNsYXNzSW5mby5wcm9wZXJ0aWVzW2pdLm5hbWUgPT0gcHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgcmVzLnB1c2goY2xhc3NJbmZvLnByb3BlcnRpZXNbal0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGdldEFsbENsYXNzZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIHJlcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgZm9yICh2YXIgbmFtZSBpbiB0aGlzLmNsYXNzZXMpIHtcbiAgICAgIHJlcy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBjcmVhdGVDbGFzcyhuYW1lOiBzdHJpbmcsIGpzb246IGFueSA9IHVuZGVmaW5lZCk6IGFueSB7XG4gICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgbWV0YURhdGFDbGFzcyA9IHRoaXMuZmluZENsYXNzKG5hbWUpO1xuICAgIGlmICghbWV0YURhdGFDbGFzcykgcmV0dXJuIG51bGw7XG4gICAgaWYgKG1ldGFEYXRhQ2xhc3MuY3JlYXRvcikgcmV0dXJuIG1ldGFEYXRhQ2xhc3MuY3JlYXRvcihqc29uKTtcbiAgICB2YXIgcGFyZW50TmFtZSA9IG1ldGFEYXRhQ2xhc3MucGFyZW50TmFtZTtcbiAgICB3aGlsZSAocGFyZW50TmFtZSkge1xuICAgICAgbWV0YURhdGFDbGFzcyA9IHRoaXMuZmluZENsYXNzKHBhcmVudE5hbWUpO1xuICAgICAgaWYgKCFtZXRhRGF0YUNsYXNzKSByZXR1cm4gbnVsbDtcbiAgICAgIHBhcmVudE5hbWUgPSBtZXRhRGF0YUNsYXNzLnBhcmVudE5hbWU7XG4gICAgICBpZiAobWV0YURhdGFDbGFzcy5jcmVhdG9yKVxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVDdXN0b21UeXBlKG5hbWUsIG1ldGFEYXRhQ2xhc3MuY3JlYXRvciwganNvbik7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlQ3VzdG9tVHlwZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY3JlYXRvcjogYW55LFxuICAgIGpzb246IGFueSA9IHVuZGVmaW5lZFxuICApOiBhbnkge1xuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIHJlcyA9IGNyZWF0b3IoanNvbik7XG4gICAgdmFyIGN1c3RvbVR5cGVOYW1lID0gbmFtZTtcbiAgICB2YXIgY3VzdG9tVGVtcGxhdGVOYW1lID0gcmVzLmdldFRlbXBsYXRlXG4gICAgICA/IHJlcy5nZXRUZW1wbGF0ZSgpXG4gICAgICA6IHJlcy5nZXRUeXBlKCk7XG4gICAgcmVzLmdldFR5cGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gY3VzdG9tVHlwZU5hbWU7XG4gICAgfTtcbiAgICByZXMuZ2V0VGVtcGxhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gY3VzdG9tVGVtcGxhdGVOYW1lO1xuICAgIH07XG4gICAgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24uY3JlYXRlUHJvcGVydGllcyhyZXMpO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGdldENoaWxkcmVuQ2xhc3NlcyhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY2FuQmVDcmVhdGVkOiBib29sZWFuID0gZmFsc2VcbiAgKTogQXJyYXk8SnNvbk1ldGFkYXRhQ2xhc3M+IHtcbiAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciByZXN1bHQ6IEFycmF5PEpzb25NZXRhZGF0YUNsYXNzPiA9IFtdO1xuICAgIHRoaXMuZmlsbENoaWxkcmVuQ2xhc3NlcyhuYW1lLCBjYW5CZUNyZWF0ZWQsIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwdWJsaWMgZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzKG5hbWU6IHN0cmluZyk6IEFycmF5PHN0cmluZz4ge1xuICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5nZXRQcm9wZXJ0aWVzKG5hbWUpO1xuICAgIHZhciByZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChwcm9wZXJ0aWVzW2ldLmlzUmVxdWlyZWQpIHtcbiAgICAgICAgcmVzLnB1c2gocHJvcGVydGllc1tpXS5uYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgYWRkUHJvcGVydGllcyhjbGFzc05hbWU6IHN0cmluZywgcHJvcGVydGllc0luZm9zOiBBcnJheTxhbnk+KSB7XG4gICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIG1ldGFEYXRhQ2xhc3MgPSB0aGlzLmZpbmRDbGFzcyhjbGFzc05hbWUpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllc0luZm9zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmFkZEN1c3RvbVByb3BlcnR5Q29yZShtZXRhRGF0YUNsYXNzLCBwcm9wZXJ0aWVzSW5mb3NbaV0pO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgYWRkUHJvcGVydHkoY2xhc3NOYW1lOiBzdHJpbmcsIHByb3BlcnR5SW5mbzogYW55KTogSnNvbk9iamVjdFByb3BlcnR5IHtcbiAgICByZXR1cm4gdGhpcy5hZGRDdXN0b21Qcm9wZXJ0eUNvcmUodGhpcy5maW5kQ2xhc3MoY2xhc3NOYW1lKSwgcHJvcGVydHlJbmZvKTtcbiAgfVxuICBwcml2YXRlIGFkZEN1c3RvbVByb3BlcnR5Q29yZShcbiAgICBtZXRhRGF0YUNsYXNzOiBKc29uTWV0YWRhdGFDbGFzcyxcbiAgICBwcm9wZXJ0eUluZm86IGFueVxuICApOiBKc29uT2JqZWN0UHJvcGVydHkge1xuICAgIGlmICghbWV0YURhdGFDbGFzcykgcmV0dXJuIG51bGw7XG4gICAgdmFyIHByb3BlcnR5ID0gbWV0YURhdGFDbGFzcy5jcmVhdGVQcm9wZXJ0eShwcm9wZXJ0eUluZm8pO1xuICAgIGlmIChwcm9wZXJ0eSkge1xuICAgICAgcHJvcGVydHkuaXNDdXN0b20gPSB0cnVlO1xuICAgICAgdGhpcy5hZGRQcm9wZXJ0eVRvQ2xhc3MobWV0YURhdGFDbGFzcywgcHJvcGVydHkpO1xuICAgICAgdGhpcy5lbXB0eUNsYXNzUHJvcGVydGllc0hhc2gobWV0YURhdGFDbGFzcyk7XG4gICAgICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5hZGRQcm9wZXJ0eShtZXRhRGF0YUNsYXNzLm5hbWUsIHByb3BlcnR5KTtcbiAgICB9XG4gICAgcmV0dXJuIHByb3BlcnR5O1xuICB9XG4gIHB1YmxpYyByZW1vdmVQcm9wZXJ0eShjbGFzc05hbWU6IHN0cmluZywgcHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcbiAgICB2YXIgbWV0YURhdGFDbGFzcyA9IHRoaXMuZmluZENsYXNzKGNsYXNzTmFtZSk7XG4gICAgaWYgKCFtZXRhRGF0YUNsYXNzKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHByb3BlcnR5ID0gbWV0YURhdGFDbGFzcy5maW5kKHByb3BlcnR5TmFtZSk7XG4gICAgaWYgKHByb3BlcnR5KSB7XG4gICAgICB0aGlzLnJlbW92ZVByb3BlcnR5RnJvbUNsYXNzKG1ldGFEYXRhQ2xhc3MsIHByb3BlcnR5KTtcbiAgICAgIHRoaXMuZW1wdHlDbGFzc1Byb3BlcnRpZXNIYXNoKG1ldGFEYXRhQ2xhc3MpO1xuICAgICAgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24ucmVtb3ZlUHJvcGVydHkoXG4gICAgICAgIG1ldGFEYXRhQ2xhc3MubmFtZSxcbiAgICAgICAgcHJvcGVydHlOYW1lXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGFkZFByb3BlcnR5VG9DbGFzcyhcbiAgICBtZXRhRGF0YUNsYXNzOiBKc29uTWV0YWRhdGFDbGFzcyxcbiAgICBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5XG4gICkge1xuICAgIGlmIChtZXRhRGF0YUNsYXNzLmZpbmQocHJvcGVydHkubmFtZSkgIT0gbnVsbCkgcmV0dXJuO1xuICAgIG1ldGFEYXRhQ2xhc3MucHJvcGVydGllcy5wdXNoKHByb3BlcnR5KTtcbiAgfVxuICBwcml2YXRlIHJlbW92ZVByb3BlcnR5RnJvbUNsYXNzKFxuICAgIG1ldGFEYXRhQ2xhc3M6IEpzb25NZXRhZGF0YUNsYXNzLFxuICAgIHByb3BlcnR5OiBKc29uT2JqZWN0UHJvcGVydHlcbiAgKSB7XG4gICAgdmFyIGluZGV4ID0gbWV0YURhdGFDbGFzcy5wcm9wZXJ0aWVzLmluZGV4T2YocHJvcGVydHkpO1xuICAgIGlmIChpbmRleCA8IDApIHJldHVybjtcbiAgICBtZXRhRGF0YUNsYXNzLnByb3BlcnRpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxuICBwcml2YXRlIGVtcHR5Q2xhc3NQcm9wZXJ0aWVzSGFzaChtZXRhRGF0YUNsYXNzOiBKc29uTWV0YWRhdGFDbGFzcykge1xuICAgIHRoaXMuY2xhc3NQcm9wZXJ0aWVzW21ldGFEYXRhQ2xhc3MubmFtZV0gPSBudWxsO1xuICAgIHRoaXMuY2xhc3NIYXNoUHJvcGVydGllc1ttZXRhRGF0YUNsYXNzLm5hbWVdID0gbnVsbDtcbiAgICB2YXIgY2hpbGRDbGFzc2VzID0gdGhpcy5nZXRDaGlsZHJlbkNsYXNzZXMobWV0YURhdGFDbGFzcy5uYW1lKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkQ2xhc3Nlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5jbGFzc1Byb3BlcnRpZXNbY2hpbGRDbGFzc2VzW2ldLm5hbWVdID0gbnVsbDtcbiAgICAgIHRoaXMuY2xhc3NIYXNoUHJvcGVydGllc1tjaGlsZENsYXNzZXNbaV0ubmFtZV0gPSBudWxsO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGZpbGxDaGlsZHJlbkNsYXNzZXMoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNhbkJlQ3JlYXRlZDogYm9vbGVhbixcbiAgICByZXN1bHQ6IEFycmF5PEpzb25NZXRhZGF0YUNsYXNzPlxuICApIHtcbiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuQ2xhc3Nlc1tuYW1lXTtcbiAgICBpZiAoIWNoaWxkcmVuKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFjYW5CZUNyZWF0ZWQgfHwgY2hpbGRyZW5baV0uY3JlYXRvcikge1xuICAgICAgICByZXN1bHQucHVzaChjaGlsZHJlbltpXSk7XG4gICAgICB9XG4gICAgICB0aGlzLmZpbGxDaGlsZHJlbkNsYXNzZXMoY2hpbGRyZW5baV0ubmFtZSwgY2FuQmVDcmVhdGVkLCByZXN1bHQpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZmluZENsYXNzKG5hbWU6IHN0cmluZyk6IEpzb25NZXRhZGF0YUNsYXNzIHtcbiAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciByZXMgPSB0aGlzLmNsYXNzZXNbbmFtZV07XG4gICAgaWYgKCFyZXMpIHtcbiAgICAgIHZhciBuZXdOYW1lID0gdGhpcy5hbHRlcm5hdGl2ZU5hbWVzW25hbWVdO1xuICAgICAgaWYgKCEhbmV3TmFtZSAmJiBuZXdOYW1lICE9IG5hbWUpIHJldHVybiB0aGlzLmZpbmRDbGFzcyhuZXdOYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgaXNEZXNjZW5kYW50T2YoY2xhc3NOYW1lOiBzdHJpbmcsIGFuY2VzdG9yQ2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoIWNsYXNzTmFtZSB8fCAhYW5jZXN0b3JDbGFzc05hbWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgYW5jZXN0b3JDbGFzc05hbWUgPSBhbmNlc3RvckNsYXNzTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciBjbGFzc18gPSB0aGlzLmZpbmRDbGFzcyhjbGFzc05hbWUpO1xuICAgIGlmICghY2xhc3NfKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBwYXJlbnRDbGFzcyA9IGNsYXNzXztcbiAgICBkbyB7XG4gICAgICBpZiAocGFyZW50Q2xhc3MubmFtZSA9PT0gYW5jZXN0b3JDbGFzc05hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBwYXJlbnRDbGFzcyA9IHRoaXMuY2xhc3Nlc1twYXJlbnRDbGFzcy5wYXJlbnROYW1lXTtcbiAgICB9IHdoaWxlICghIXBhcmVudENsYXNzKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGFkZEFsdGVyTmF0aXZlQ2xhc3NOYW1lKG5hbWU6IHN0cmluZywgYWx0ZXJuYXRpdmVOYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLmFsdGVybmF0aXZlTmFtZXNbYWx0ZXJuYXRpdmVOYW1lLnRvTG93ZXJDYXNlKCldID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICB9XG4gIHB1YmxpYyBnZW5lcmF0ZVNjaGVtYShjbGFzc05hbWU6IHN0cmluZyA9IHVuZGVmaW5lZCk6IGFueSB7XG4gICAgaWYgKCFjbGFzc05hbWUpIGNsYXNzTmFtZSA9IFwic3VydmV5XCI7XG4gICAgdmFyIGNsYXNzSW5mbyA9IHRoaXMuZmluZENsYXNzKGNsYXNzTmFtZSk7XG4gICAgaWYgKCFjbGFzc0luZm8pIHJldHVybiBudWxsO1xuICAgIHZhciByZXMgPSB7XG4gICAgICAkc2NoZW1hOiBcImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDcvc2NoZW1hI1wiLFxuICAgICAgdGl0bGU6IFwiU3VydmV5SlMgTGlicmFyeSBqc29uIHNjaGVtYVwiLFxuICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgIHByb3BlcnRpZXM6IHt9LFxuICAgICAgZGVmaW5pdGlvbnM6IHt9LFxuICAgIH07XG4gICAgdGhpcy5nZW5lcmF0ZVNjaGVtYVByb3BlcnRpZXMoY2xhc3NJbmZvLCByZXMucHJvcGVydGllcywgcmVzLmRlZmluaXRpb25zKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgZ2VuZXJhdGVTY2hlbWFQcm9wZXJ0aWVzKFxuICAgIGNsYXNzSW5mbzogSnNvbk1ldGFkYXRhQ2xhc3MsXG4gICAgc2NoZW1hUHJvcGVydGllczogYW55LFxuICAgIHNjaGVtYURlZjogYW55XG4gICk6IHZvaWQge1xuICAgIGlmICghY2xhc3NJbmZvKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbGFzc0luZm8ucHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByb3AgPSBjbGFzc0luZm8ucHJvcGVydGllc1tpXTtcbiAgICAgIHNjaGVtYVByb3BlcnRpZXNbcHJvcC5uYW1lXSA9IHRoaXMuZ2VuZXJhdGVTY2hlbWFQcm9wZXJ0eShcbiAgICAgICAgcHJvcCxcbiAgICAgICAgc2NoZW1hRGVmXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGdlbmVyYXRlU2NoZW1hUHJvcGVydHkoXG4gICAgcHJvcDogSnNvbk9iamVjdFByb3BlcnR5LFxuICAgIHNjaGVtYURlZjogYW55XG4gICk6IGFueSB7XG4gICAgdmFyIHJlczogYW55ID0geyB0eXBlOiBwcm9wLnNjaGVtYVR5cGUoKSB9O1xuICAgIGlmIChwcm9wLmhhc0Nob2ljZXMpIHtcbiAgICAgIHJlcy5lbnVtID0gcHJvcC5nZXRDaG9pY2VzKG51bGwpO1xuICAgIH1cbiAgICBpZiAoISFwcm9wLmNsYXNzTmFtZSkge1xuICAgICAgcmVzLml0ZW1zID0geyAkcmVmOiBcIiNcIiArIHByb3AuY2xhc3NOYW1lIH07XG4gICAgICB0aGlzLmdlbmVyYXRlQ2hlbWFDbGFzcyhwcm9wLmNsYXNzTmFtZSwgc2NoZW1hRGVmKTtcbiAgICB9XG4gICAgaWYgKCEhcHJvcC5iYXNlQ2xhc3NOYW1lKSB7XG4gICAgICB2YXIgdXNlZENsYXNzZXMgPSB0aGlzLmdldENoaWxkcmVuQ2xhc3Nlcyhwcm9wLmJhc2VDbGFzc05hbWUsIHRydWUpO1xuICAgICAgaWYgKHByb3AuYmFzZUNsYXNzTmFtZSA9PSBcInF1ZXN0aW9uXCIpIHtcbiAgICAgICAgdXNlZENsYXNzZXMucHVzaCh0aGlzLmZpbmRDbGFzcyhcInBhbmVsXCIpKTtcbiAgICAgIH1cbiAgICAgIHJlcy5pdGVtcyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1c2VkQ2xhc3Nlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2xhc3NOYW1lID0gdXNlZENsYXNzZXNbaV0ubmFtZTtcbiAgICAgICAgcmVzLml0ZW1zLnB1c2goeyAkcmVmOiBcIiNcIiArIGNsYXNzTmFtZSB9KTtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZUNoZW1hQ2xhc3MoY2xhc3NOYW1lLCBzY2hlbWFEZWYpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgZ2VuZXJhdGVDaGVtYUNsYXNzKGNsYXNzTmFtZTogc3RyaW5nLCBzY2hlbWFEZWY6IGFueSkge1xuICAgIGlmICghIXNjaGVtYURlZltjbGFzc05hbWVdKSByZXR1cm47XG4gICAgdmFyIGNsYXNzSW5mbyA9IHRoaXMuZmluZENsYXNzKGNsYXNzTmFtZSk7XG4gICAgaWYgKCFjbGFzc0luZm8pIHJldHVybjtcbiAgICB2YXIgaGFzUGFyZW50ID0gISFjbGFzc0luZm8ucGFyZW50TmFtZSAmJiBjbGFzc0luZm8ucGFyZW50TmFtZSAhPSBcImJhc2VcIjtcbiAgICBpZiAoaGFzUGFyZW50KSB7XG4gICAgICB0aGlzLmdlbmVyYXRlQ2hlbWFDbGFzcyhjbGFzc0luZm8ucGFyZW50TmFtZSwgc2NoZW1hRGVmKTtcbiAgICB9XG4gICAgdmFyIHJlczogYW55ID0geyB0eXBlOiBcIm9iamVjdFwiLCAkaWQ6IFwiI1wiICsgY2xhc3NOYW1lIH07XG4gICAgc2NoZW1hRGVmW2NsYXNzTmFtZV0gPSByZXM7XG4gICAgdmFyIHByb3BzID0ge307XG4gICAgdGhpcy5nZW5lcmF0ZVNjaGVtYVByb3BlcnRpZXMoY2xhc3NJbmZvLCBwcm9wcywgc2NoZW1hRGVmKTtcbiAgICBpZiAoaGFzUGFyZW50KSB7XG4gICAgICByZXMuYWxsT2ZmID0gW1xuICAgICAgICB7ICRyZWY6IFwiI1wiICsgY2xhc3NJbmZvLnBhcmVudE5hbWUgfSxcbiAgICAgICAgeyBwcm9wZXJ0aWVzOiBwcm9wcyB9LFxuICAgICAgXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzLnByb3BlcnRpZXMgPSBwcm9wcztcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBmaWxsUHJvcGVydGllcyhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgbGlzdDogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PixcbiAgICBoYXNoOiBIYXNoVGFibGU8SnNvbk9iamVjdFByb3BlcnR5PlxuICApIHtcbiAgICB2YXIgbWV0YURhdGFDbGFzcyA9IHRoaXMuZmluZENsYXNzKG5hbWUpO1xuICAgIGlmICghbWV0YURhdGFDbGFzcykgcmV0dXJuO1xuICAgIGlmIChtZXRhRGF0YUNsYXNzLnBhcmVudE5hbWUpIHtcbiAgICAgIHRoaXMuZmlsbFByb3BlcnRpZXMobWV0YURhdGFDbGFzcy5wYXJlbnROYW1lLCBsaXN0LCBoYXNoKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZXRhRGF0YUNsYXNzLnByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwcm9wID0gbWV0YURhdGFDbGFzcy5wcm9wZXJ0aWVzW2ldO1xuICAgICAgdGhpcy5hZGRQcm9wZXJ0eUNvcmUocHJvcCwgbGlzdCwgaGFzaCk7XG4gICAgICBoYXNoW3Byb3AubmFtZV0gPSBwcm9wO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGFkZFByb3BlcnR5Q29yZShcbiAgICBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5LFxuICAgIGxpc3Q6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4sXG4gICAgaGFzaDogSGFzaFRhYmxlPEpzb25PYmplY3RQcm9wZXJ0eT5cbiAgKSB7XG4gICAgaWYgKCFoYXNoW3Byb3BlcnR5Lm5hbWVdKSB7XG4gICAgICBsaXN0LnB1c2gocHJvcGVydHkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgaW5kZXggPSAtMTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChsaXN0W2ldLm5hbWUgPT0gcHJvcGVydHkubmFtZSkge1xuICAgICAgICBpbmRleCA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBwcm9wZXJ0eS5tZXJnZVdpdGgobGlzdFtpbmRleF0pO1xuICAgIGxpc3RbaW5kZXhdID0gcHJvcGVydHk7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBKc29uRXJyb3Ige1xuICBwdWJsaWMgZGVzY3JpcHRpb246IHN0cmluZyA9IFwiXCI7XG4gIHB1YmxpYyBhdDogTnVtYmVyID0gLTE7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0eXBlOiBzdHJpbmcsIHB1YmxpYyBtZXNzYWdlOiBzdHJpbmcpIHsgfVxuICBwdWJsaWMgZ2V0RnVsbERlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZSArICh0aGlzLmRlc2NyaXB0aW9uID8gXCJcXG5cIiArIHRoaXMuZGVzY3JpcHRpb24gOiBcIlwiKTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIEpzb25Vbmtub3duUHJvcGVydHlFcnJvciBleHRlbmRzIEpzb25FcnJvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwcm9wZXJ0eU5hbWU6IHN0cmluZywgcHVibGljIGNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBcInVua25vd25wcm9wZXJ0eVwiLFxuICAgICAgXCJUaGUgcHJvcGVydHkgJ1wiICtcbiAgICAgIHByb3BlcnR5TmFtZSArXG4gICAgICBcIicgaW4gY2xhc3MgJ1wiICtcbiAgICAgIGNsYXNzTmFtZSArXG4gICAgICBcIicgaXMgdW5rbm93bi5cIlxuICAgICk7XG4gICAgdmFyIHByb3BlcnRpZXMgPSBKc29uT2JqZWN0Lm1ldGFEYXRhLmdldFByb3BlcnRpZXMoY2xhc3NOYW1lKTtcbiAgICBpZiAocHJvcGVydGllcykge1xuICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IFwiVGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHByb3BlcnRpZXMgYXJlOiBcIjtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaSA+IDApIHRoaXMuZGVzY3JpcHRpb24gKz0gXCIsIFwiO1xuICAgICAgICB0aGlzLmRlc2NyaXB0aW9uICs9IHByb3BlcnRpZXNbaV0ubmFtZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGVzY3JpcHRpb24gKz0gXCIuXCI7XG4gICAgfVxuICB9XG59XG5leHBvcnQgY2xhc3MgSnNvbk1pc3NpbmdUeXBlRXJyb3JCYXNlIGV4dGVuZHMgSnNvbkVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGJhc2VDbGFzc05hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgdHlwZTogc3RyaW5nLFxuICAgIHB1YmxpYyBtZXNzYWdlOiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIodHlwZSwgbWVzc2FnZSk7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IFwiVGhlIGZvbGxvd2luZyB0eXBlcyBhcmUgYXZhaWxhYmxlOiBcIjtcbiAgICB2YXIgdHlwZXMgPSBKc29uT2JqZWN0Lm1ldGFEYXRhLmdldENoaWxkcmVuQ2xhc3NlcyhiYXNlQ2xhc3NOYW1lLCB0cnVlKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaSA+IDApIHRoaXMuZGVzY3JpcHRpb24gKz0gXCIsIFwiO1xuICAgICAgdGhpcy5kZXNjcmlwdGlvbiArPSBcIidcIiArIHR5cGVzW2ldLm5hbWUgKyBcIidcIjtcbiAgICB9XG4gICAgdGhpcy5kZXNjcmlwdGlvbiArPSBcIi5cIjtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIEpzb25NaXNzaW5nVHlwZUVycm9yIGV4dGVuZHMgSnNvbk1pc3NpbmdUeXBlRXJyb3JCYXNlIHtcbiAgY29uc3RydWN0b3IocHVibGljIHByb3BlcnR5TmFtZTogc3RyaW5nLCBwdWJsaWMgYmFzZUNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBiYXNlQ2xhc3NOYW1lLFxuICAgICAgXCJtaXNzaW5ndHlwZXByb3BlcnR5XCIsXG4gICAgICBcIlRoZSBwcm9wZXJ0eSB0eXBlIGlzIG1pc3NpbmcgaW4gdGhlIG9iamVjdC4gUGxlYXNlIHRha2UgYSBsb29rIGF0IHByb3BlcnR5OiAnXCIgK1xuICAgICAgcHJvcGVydHlOYW1lICtcbiAgICAgIFwiJy5cIlxuICAgICk7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBKc29uSW5jb3JyZWN0VHlwZUVycm9yIGV4dGVuZHMgSnNvbk1pc3NpbmdUeXBlRXJyb3JCYXNlIHtcbiAgY29uc3RydWN0b3IocHVibGljIHByb3BlcnR5TmFtZTogc3RyaW5nLCBwdWJsaWMgYmFzZUNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBiYXNlQ2xhc3NOYW1lLFxuICAgICAgXCJpbmNvcnJlY3R0eXBlcHJvcGVydHlcIixcbiAgICAgIFwiVGhlIHByb3BlcnR5IHR5cGUgaXMgaW5jb3JyZWN0IGluIHRoZSBvYmplY3QuIFBsZWFzZSB0YWtlIGEgbG9vayBhdCBwcm9wZXJ0eTogJ1wiICtcbiAgICAgIHByb3BlcnR5TmFtZSArXG4gICAgICBcIicuXCJcbiAgICApO1xuICB9XG59XG5leHBvcnQgY2xhc3MgSnNvblJlcXVpcmVkUHJvcGVydHlFcnJvciBleHRlbmRzIEpzb25FcnJvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwcm9wZXJ0eU5hbWU6IHN0cmluZywgcHVibGljIGNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBcInJlcXVpcmVkcHJvcGVydHlcIixcbiAgICAgIFwiVGhlIHByb3BlcnR5ICdcIiArXG4gICAgICBwcm9wZXJ0eU5hbWUgK1xuICAgICAgXCInIGlzIHJlcXVpcmVkIGluIGNsYXNzICdcIiArXG4gICAgICBjbGFzc05hbWUgK1xuICAgICAgXCInLlwiXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSnNvbk9iamVjdCB7XG4gIHByaXZhdGUgc3RhdGljIHR5cGVQcm9wZXJ0eU5hbWUgPSBcInR5cGVcIjtcbiAgcHJpdmF0ZSBzdGF0aWMgcG9zaXRpb25Qcm9wZXJ0eU5hbWUgPSBcInBvc1wiO1xuICBwcml2YXRlIHN0YXRpYyBtZXRhRGF0YVZhbHVlID0gbmV3IEpzb25NZXRhZGF0YSgpO1xuICBwdWJsaWMgc3RhdGljIGdldCBtZXRhRGF0YSgpIHtcbiAgICByZXR1cm4gSnNvbk9iamVjdC5tZXRhRGF0YVZhbHVlO1xuICB9XG4gIHB1YmxpYyBlcnJvcnMgPSBuZXcgQXJyYXk8SnNvbkVycm9yPigpO1xuICBwdWJsaWMgbGlnaHRTZXJpYWxpemluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgdG9Kc29uT2JqZWN0KG9iajogYW55LCBzdG9yZURlZmF1bHRzID0gZmFsc2UpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnRvSnNvbk9iamVjdENvcmUob2JqLCBudWxsLCBzdG9yZURlZmF1bHRzKTtcbiAgfVxuICBwdWJsaWMgdG9PYmplY3QoanNvbk9iajogYW55LCBvYmo6IGFueSkge1xuICAgIHRoaXMudG9PYmplY3RDb3JlKGpzb25PYmosIG9iaik7XG4gICAgdmFyIGVycm9yID0gdGhpcy5nZXRSZXF1aXJlZEVycm9yKG9iaiwganNvbk9iaik7XG4gICAgaWYgKCEhZXJyb3IpIHtcbiAgICAgIHRoaXMuYWRkTmV3RXJyb3IoZXJyb3IsIGpzb25PYmopO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgdG9PYmplY3RDb3JlKGpzb25PYmo6IGFueSwgb2JqOiBhbnkpIHtcbiAgICBpZiAoIWpzb25PYmopIHJldHVybjtcbiAgICB2YXIgcHJvcGVydGllcyA9IG51bGw7XG4gICAgdmFyIG9ialR5cGUgPSB1bmRlZmluZWQ7XG4gICAgdmFyIG5lZWRBZGRFcnJvcnMgPSB0cnVlO1xuICAgIGlmIChvYmouZ2V0VHlwZSkge1xuICAgICAgb2JqVHlwZSA9IG9iai5nZXRUeXBlKCk7XG4gICAgICBwcm9wZXJ0aWVzID0gSnNvbk9iamVjdC5tZXRhRGF0YS5nZXRQcm9wZXJ0aWVzKG9ialR5cGUpO1xuICAgICAgbmVlZEFkZEVycm9ycyA9XG4gICAgICAgICEhb2JqVHlwZSAmJiAhSnNvbk9iamVjdC5tZXRhRGF0YS5pc0Rlc2NlbmRhbnRPZihvYmpUeXBlLCBcIml0ZW12YWx1ZVwiKTtcbiAgICB9XG4gICAgaWYgKCFwcm9wZXJ0aWVzKSByZXR1cm47XG4gICAgaWYgKG9iai5zdGFydExvYWRpbmdGcm9tSnNvbikge1xuICAgICAgb2JqLnN0YXJ0TG9hZGluZ0Zyb21Kc29uKCk7XG4gICAgfVxuICAgIHByb3BlcnRpZXMgPSB0aGlzLmFkZER5bmFtaWNQcm9wZXJ0aWVzKG9iaiwganNvbk9iaiwgcHJvcGVydGllcyk7XG4gICAgZm9yICh2YXIga2V5IGluIGpzb25PYmopIHtcbiAgICAgIGlmIChrZXkgPT09IEpzb25PYmplY3QudHlwZVByb3BlcnR5TmFtZSkgY29udGludWU7XG4gICAgICBpZiAoa2V5ID09PSBKc29uT2JqZWN0LnBvc2l0aW9uUHJvcGVydHlOYW1lKSB7XG4gICAgICAgIG9ialtrZXldID0ganNvbk9ialtrZXldO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBwcm9wZXJ0eSA9IHRoaXMuZmluZFByb3BlcnR5KHByb3BlcnRpZXMsIGtleSk7XG4gICAgICBpZiAoIXByb3BlcnR5KSB7XG4gICAgICAgIGlmIChuZWVkQWRkRXJyb3JzKSB7XG4gICAgICAgICAgdGhpcy5hZGROZXdFcnJvcihcbiAgICAgICAgICAgIG5ldyBKc29uVW5rbm93blByb3BlcnR5RXJyb3Ioa2V5LnRvU3RyaW5nKCksIG9ialR5cGUpLFxuICAgICAgICAgICAganNvbk9ialxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aGlzLnZhbHVlVG9PYmooanNvbk9ialtrZXldLCBvYmosIHByb3BlcnR5KTtcbiAgICB9XG4gICAgaWYgKG9iai5lbmRMb2FkaW5nRnJvbUpzb24pIHtcbiAgICAgIG9iai5lbmRMb2FkaW5nRnJvbUpzb24oKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHRvSnNvbk9iamVjdENvcmUoXG4gICAgb2JqOiBhbnksXG4gICAgcHJvcGVydHk6IEpzb25PYmplY3RQcm9wZXJ0eSxcbiAgICBzdG9yZURlZmF1bHRzID0gZmFsc2VcbiAgKTogYW55IHtcbiAgICBpZiAoIW9iaiB8fCAhb2JqLmdldFR5cGUpIHJldHVybiBvYmo7XG4gICAgaWYgKHR5cGVvZiBvYmouZ2V0RGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gb2JqLmdldERhdGEoKTtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKHByb3BlcnR5ICE9IG51bGwgJiYgIXByb3BlcnR5LmNsYXNzTmFtZSkge1xuICAgICAgKDxhbnk+cmVzdWx0KVtKc29uT2JqZWN0LnR5cGVQcm9wZXJ0eU5hbWVdID0gcHJvcGVydHkuZ2V0T2JqVHlwZShcbiAgICAgICAgb2JqLmdldFR5cGUoKVxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5wcm9wZXJ0aWVzVG9Kc29uKFxuICAgICAgb2JqLFxuICAgICAgSnNvbk9iamVjdC5tZXRhRGF0YS5nZXRQcm9wZXJ0aWVzKG9iai5nZXRUeXBlKCkpLFxuICAgICAgcmVzdWx0LFxuICAgICAgc3RvcmVEZWZhdWx0c1xuICAgICk7XG4gICAgdGhpcy5wcm9wZXJ0aWVzVG9Kc29uKFxuICAgICAgb2JqLFxuICAgICAgdGhpcy5nZXREeW5hbWljUHJvcGVydGllcyhvYmopLFxuICAgICAgcmVzdWx0LFxuICAgICAgc3RvcmVEZWZhdWx0c1xuICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwcml2YXRlIGdldER5bmFtaWNQcm9wZXJ0aWVzKG9iajogYW55KTogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PiB7XG4gICAgcmV0dXJuIFNlcmlhbGl6ZXIuZ2V0RHluYW1pY1Byb3BlcnRpZXNCeU9iaihvYmopO1xuICB9XG4gIHByaXZhdGUgYWRkRHluYW1pY1Byb3BlcnRpZXMoXG4gICAgb2JqOiBhbnksXG4gICAganNvbk9iajogYW55LFxuICAgIHByb3BlcnRpZXM6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT5cbiAgKTogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PiB7XG4gICAgaWYgKCFvYmouZ2V0RHluYW1pY1Byb3BlcnR5TmFtZSkgcmV0dXJuIHByb3BlcnRpZXM7XG4gICAgdmFyIGR5bmFtaWNQcm9wTmFtZSA9IG9iai5nZXREeW5hbWljUHJvcGVydHlOYW1lKCk7XG4gICAgaWYgKCFkeW5hbWljUHJvcE5hbWUpIHJldHVybiBwcm9wZXJ0aWVzO1xuICAgIGlmIChqc29uT2JqW2R5bmFtaWNQcm9wTmFtZV0pIHtcbiAgICAgIG9ialtkeW5hbWljUHJvcE5hbWVdID0ganNvbk9ialtkeW5hbWljUHJvcE5hbWVdO1xuICAgIH1cbiAgICB2YXIgZHluYW1pY1Byb3BlcnRpZXMgPSB0aGlzLmdldER5bmFtaWNQcm9wZXJ0aWVzKG9iaik7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzLnB1c2gocHJvcGVydGllc1tpXSk7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZHluYW1pY1Byb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlcy5wdXNoKGR5bmFtaWNQcm9wZXJ0aWVzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIHByb3BlcnRpZXNUb0pzb24oXG4gICAgb2JqOiBhbnksXG4gICAgcHJvcGVydGllczogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PixcbiAgICBqc29uOiBhbnksXG4gICAgc3RvcmVEZWZhdWx0cyA9IGZhbHNlXG4gICkge1xuICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnZhbHVlVG9Kc29uKG9iaiwganNvbiwgcHJvcGVydGllc1tpXSwgc3RvcmVEZWZhdWx0cyk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyB2YWx1ZVRvSnNvbihcbiAgICBvYmo6IGFueSxcbiAgICByZXN1bHQ6IGFueSxcbiAgICBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5LFxuICAgIHN0b3JlRGVmYXVsdHMgPSBmYWxzZVxuICApIHtcbiAgICBpZiAoXG4gICAgICBwcm9wZXJ0eS5pc1NlcmlhbGl6YWJsZSA9PT0gZmFsc2UgfHxcbiAgICAgIChwcm9wZXJ0eS5pc0xpZ2h0U2VyaWFsaXphYmxlID09PSBmYWxzZSAmJiB0aGlzLmxpZ2h0U2VyaWFsaXppbmcpXG4gICAgKVxuICAgICAgcmV0dXJuO1xuICAgIHZhciB2YWx1ZSA9IHByb3BlcnR5LmdldFZhbHVlKG9iaik7XG4gICAgaWYgKCFzdG9yZURlZmF1bHRzICYmIHByb3BlcnR5LmlzRGVmYXVsdFZhbHVlKHZhbHVlKSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmlzVmFsdWVBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHZhciBhcnJWYWx1ZSA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBhcnJWYWx1ZS5wdXNoKHRoaXMudG9Kc29uT2JqZWN0Q29yZSh2YWx1ZVtpXSwgcHJvcGVydHksIHN0b3JlRGVmYXVsdHMpKTtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gYXJyVmFsdWUubGVuZ3RoID4gMCA/IGFyclZhbHVlIDogbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgPSB0aGlzLnRvSnNvbk9iamVjdENvcmUodmFsdWUsIHByb3BlcnR5LCBzdG9yZURlZmF1bHRzKTtcbiAgICB9XG4gICAgdmFyIGhhc1ZhbHVlID1cbiAgICAgIHR5cGVvZiBvYmpbXCJnZXRQcm9wZXJ0eVZhbHVlXCJdID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgIG9ialtcImdldFByb3BlcnR5VmFsdWVcIl0ocHJvcGVydHkubmFtZSwgbnVsbCkgIT09IG51bGw7XG4gICAgaWYgKChzdG9yZURlZmF1bHRzICYmIGhhc1ZhbHVlKSB8fCAhcHJvcGVydHkuaXNEZWZhdWx0VmFsdWUodmFsdWUpKSB7XG4gICAgICByZXN1bHRbcHJvcGVydHkubmFtZV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHZhbHVlVG9PYmoodmFsdWU6IGFueSwgb2JqOiBhbnksIHByb3BlcnR5OiBKc29uT2JqZWN0UHJvcGVydHkpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuO1xuICAgIHRoaXMucmVtb3ZlUG9zKHByb3BlcnR5LCB2YWx1ZSk7XG4gICAgaWYgKHByb3BlcnR5ICE9IG51bGwgJiYgcHJvcGVydHkuaGFzVG9Vc2VTZXRWYWx1ZSkge1xuICAgICAgcHJvcGVydHkuc2V0VmFsdWUob2JqLCB2YWx1ZSwgdGhpcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmlzVmFsdWVBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMudmFsdWVUb0FycmF5KHZhbHVlLCBvYmosIHByb3BlcnR5Lm5hbWUsIHByb3BlcnR5KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG5ld09iaiA9IHRoaXMuY3JlYXRlTmV3T2JqKHZhbHVlLCBwcm9wZXJ0eSk7XG4gICAgaWYgKG5ld09iai5uZXdPYmopIHtcbiAgICAgIHRoaXMudG9PYmplY3RDb3JlKHZhbHVlLCBuZXdPYmoubmV3T2JqKTtcbiAgICAgIHZhbHVlID0gbmV3T2JqLm5ld09iajtcbiAgICB9XG4gICAgaWYgKCFuZXdPYmouZXJyb3IpIHtcbiAgICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsKSB7XG4gICAgICAgIHByb3BlcnR5LnNldFZhbHVlKG9iaiwgdmFsdWUsIHRoaXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JqW3Byb3BlcnR5Lm5hbWVdID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgcmVtb3ZlUG9zKHByb3BlcnR5OiBKc29uT2JqZWN0UHJvcGVydHksIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIXByb3BlcnR5IHx8ICFwcm9wZXJ0eS50eXBlIHx8IHByb3BlcnR5LnR5cGUuaW5kZXhPZihcInZhbHVlXCIpIDwgMClcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLnJlbW92ZVBvc0Zyb21PYmoodmFsdWUpO1xuICB9XG4gIHByaXZhdGUgcmVtb3ZlUG9zRnJvbU9iaihvYmo6IGFueSkge1xuICAgIGlmICghb2JqKSByZXR1cm47XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5yZW1vdmVQb3NGcm9tT2JqKG9ialtpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghIW9ialtKc29uT2JqZWN0LnBvc2l0aW9uUHJvcGVydHlOYW1lXSkge1xuICAgICAgZGVsZXRlIG9ialtKc29uT2JqZWN0LnBvc2l0aW9uUHJvcGVydHlOYW1lXTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBpc1ZhbHVlQXJyYXkodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWx1ZSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIGNyZWF0ZU5ld09iaih2YWx1ZTogYW55LCBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5KTogYW55IHtcbiAgICB2YXIgcmVzdWx0OiBhbnkgPSB7IG5ld09iajogbnVsbCwgZXJyb3I6IG51bGwgfTtcbiAgICB2YXIgY2xhc3NOYW1lID0gdmFsdWVbSnNvbk9iamVjdC50eXBlUHJvcGVydHlOYW1lXTtcbiAgICBpZiAoIWNsYXNzTmFtZSAmJiBwcm9wZXJ0eSAhPSBudWxsICYmIHByb3BlcnR5LmNsYXNzTmFtZSkge1xuICAgICAgY2xhc3NOYW1lID0gcHJvcGVydHkuY2xhc3NOYW1lO1xuICAgIH1cbiAgICBjbGFzc05hbWUgPSBwcm9wZXJ0eS5nZXRDbGFzc05hbWUoY2xhc3NOYW1lKTtcbiAgICByZXN1bHQubmV3T2JqID0gY2xhc3NOYW1lXG4gICAgICA/IEpzb25PYmplY3QubWV0YURhdGEuY3JlYXRlQ2xhc3MoY2xhc3NOYW1lLCB2YWx1ZSlcbiAgICAgIDogbnVsbDtcbiAgICByZXN1bHQuZXJyb3IgPSB0aGlzLmNoZWNrTmV3T2JqZWN0T25FcnJvcnMoXG4gICAgICByZXN1bHQubmV3T2JqLFxuICAgICAgdmFsdWUsXG4gICAgICBwcm9wZXJ0eSxcbiAgICAgIGNsYXNzTmFtZVxuICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwcml2YXRlIGNoZWNrTmV3T2JqZWN0T25FcnJvcnMoXG4gICAgbmV3T2JqOiBhbnksXG4gICAgdmFsdWU6IGFueSxcbiAgICBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5LFxuICAgIGNsYXNzTmFtZTogc3RyaW5nXG4gICk6IEpzb25FcnJvciB7XG4gICAgdmFyIGVycm9yID0gbnVsbDtcbiAgICBpZiAobmV3T2JqKSB7XG4gICAgICBlcnJvciA9IHRoaXMuZ2V0UmVxdWlyZWRFcnJvcihuZXdPYmosIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHByb3BlcnR5LmJhc2VDbGFzc05hbWUpIHtcbiAgICAgICAgaWYgKCFjbGFzc05hbWUpIHtcbiAgICAgICAgICBlcnJvciA9IG5ldyBKc29uTWlzc2luZ1R5cGVFcnJvcihcbiAgICAgICAgICAgIHByb3BlcnR5Lm5hbWUsXG4gICAgICAgICAgICBwcm9wZXJ0eS5iYXNlQ2xhc3NOYW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnJvciA9IG5ldyBKc29uSW5jb3JyZWN0VHlwZUVycm9yKFxuICAgICAgICAgICAgcHJvcGVydHkubmFtZSxcbiAgICAgICAgICAgIHByb3BlcnR5LmJhc2VDbGFzc05hbWVcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlcnJvcikge1xuICAgICAgdGhpcy5hZGROZXdFcnJvcihlcnJvciwgdmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gZXJyb3I7XG4gIH1cbiAgcHJpdmF0ZSBnZXRSZXF1aXJlZEVycm9yKG9iajogYW55LCBqc29uVmFsdWU6IGFueSk6IEpzb25FcnJvciB7XG4gICAgaWYgKCFvYmouZ2V0VHlwZSB8fCB0eXBlb2Ygb2JqLmdldERhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7XG4gICAgdmFyIGNsYXNzTmFtZSA9IG9iai5nZXRUeXBlKCk7XG4gICAgdmFyIHJlcXVpcmVkUHJvcGVydGllcyA9IEpzb25PYmplY3QubWV0YURhdGEuZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzKFxuICAgICAgY2xhc3NOYW1lXG4gICAgKTtcbiAgICBpZiAoIXJlcXVpcmVkUHJvcGVydGllcykgcmV0dXJuIG51bGw7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXF1aXJlZFByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghanNvblZhbHVlW3JlcXVpcmVkUHJvcGVydGllc1tpXV0pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBKc29uUmVxdWlyZWRQcm9wZXJ0eUVycm9yKHJlcXVpcmVkUHJvcGVydGllc1tpXSwgY2xhc3NOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHJpdmF0ZSBhZGROZXdFcnJvcihlcnJvcjogSnNvbkVycm9yLCBqc29uT2JqOiBhbnkpIHtcbiAgICBpZiAoanNvbk9iaiAmJiBqc29uT2JqW0pzb25PYmplY3QucG9zaXRpb25Qcm9wZXJ0eU5hbWVdKSB7XG4gICAgICBlcnJvci5hdCA9IGpzb25PYmpbSnNvbk9iamVjdC5wb3NpdGlvblByb3BlcnR5TmFtZV0uc3RhcnQ7XG4gICAgfVxuICAgIHRoaXMuZXJyb3JzLnB1c2goZXJyb3IpO1xuICB9XG4gIHByaXZhdGUgdmFsdWVUb0FycmF5KFxuICAgIHZhbHVlOiBBcnJheTxhbnk+LFxuICAgIG9iajogYW55LFxuICAgIGtleTogYW55LFxuICAgIHByb3BlcnR5OiBKc29uT2JqZWN0UHJvcGVydHlcbiAgKSB7XG4gICAgaWYgKG9ialtrZXldICYmIHZhbHVlLmxlbmd0aCA+IDApIG9ialtrZXldLnNwbGljZSgwLCBvYmpba2V5XS5sZW5ndGgpO1xuICAgIHZhciB2YWx1ZVJlcyA9IG9ialtrZXldID8gb2JqW2tleV0gOiBbXTtcbiAgICB0aGlzLmFkZFZhbHVlc0ludG9BcnJheSh2YWx1ZSwgdmFsdWVSZXMsIHByb3BlcnR5KTtcbiAgICBpZiAoIW9ialtrZXldKSBvYmpba2V5XSA9IHZhbHVlUmVzO1xuICB9XG4gIHByaXZhdGUgYWRkVmFsdWVzSW50b0FycmF5KFxuICAgIHZhbHVlOiBBcnJheTxhbnk+LFxuICAgIHJlc3VsdDogQXJyYXk8YW55PixcbiAgICBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5XG4gICkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMuY3JlYXRlTmV3T2JqKHZhbHVlW2ldLCBwcm9wZXJ0eSk7XG4gICAgICBpZiAobmV3VmFsdWUubmV3T2JqKSB7XG4gICAgICAgIGlmICghIXZhbHVlW2ldLm5hbWUpIHtcbiAgICAgICAgICBuZXdWYWx1ZS5uZXdPYmoubmFtZSA9IHZhbHVlW2ldLm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnB1c2gobmV3VmFsdWUubmV3T2JqKTtcbiAgICAgICAgdGhpcy50b09iamVjdENvcmUodmFsdWVbaV0sIG5ld1ZhbHVlLm5ld09iaik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIW5ld1ZhbHVlLmVycm9yKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWVbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZmluZFByb3BlcnR5KFxuICAgIHByb3BlcnRpZXM6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4sXG4gICAga2V5OiBhbnlcbiAgKTogSnNvbk9iamVjdFByb3BlcnR5IHtcbiAgICBpZiAoIXByb3BlcnRpZXMpIHJldHVybiBudWxsO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByb3AgPSBwcm9wZXJ0aWVzW2ldO1xuICAgICAgaWYgKHByb3AubmFtZSA9PSBrZXkgfHwgcHJvcC5hbHRlcm5hdGl2ZU5hbWUgPT0ga2V5KSByZXR1cm4gcHJvcDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBBbiBhbGlhcyBmb3IgdGhlIG1ldGFkYXRhIG9iamVjdC4gSXQgY29udGFpbnMgb2JqZWN0IHByb3BlcnRpZXMnIHJ1bnRpbWUgaW5mb3JtYXRpb24gYW5kIGFsbG93cyB5b3UgdG8gbW9kaWZ5IGl0LlxuICogQHNlZSBKc29uTWV0YWRhdGFcbiAqL1xuZXhwb3J0IHZhciBTZXJpYWxpemVyID0gSnNvbk9iamVjdC5tZXRhRGF0YTtcbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8IS0tIGtvIHdpdGg6ICRkYXRhLml0ZW0gLS0+XFxuPGJ1dHRvbiBjbGFzcz1cXFwic3YtYWN0aW9uLWJhci1pdGVtLWRyb3Bkb3duXFxcIlxcbiAgZGF0YS1iaW5kPVxcXCJjbGljazogYWN0aW9uLCBrZXkyY2xpY2s6IHsgcHJvY2Vzc0VzYzogZmFsc2UgfSwgY3NzOiBnZXRBY3Rpb25CYXJJdGVtQWN0aXZlQ3NzKCksIGF0dHI6IHsgZGlzYWJsZWQ6ICRkYXRhLmVuYWJsZWQgIT09IHVuZGVmaW5lZCAmJiAha28udW53cmFwKCRkYXRhLmVuYWJsZWQpLCB0aXRsZTogJGRhdGEudG9vbHRpcCB8fCAkZGF0YS50aXRsZSB9XFxcIj5cXG4gIDwhLS0ga28gaWY6ICRkYXRhLmljb25OYW1lIC0tPlxcbiAgPHN2LXN2Zy1pY29uIGNsYXNzPVxcXCJzdi1hY3Rpb24tYmFyLWl0ZW1fX2ljb25cXFwiIHBhcmFtcz1cXFwiaWNvbk5hbWU6IGljb25OYW1lLCBzaXplOiBpY29uU2l6ZVxcXCI+PC9zdi1zdmctaWNvbj5cXG4gIDwhLS0gL2tvIC0tPlxcbiAgPCEtLSBrbyBpZjogJGRhdGEuaGFzVGl0bGUgLS0+XFxuICA8c3BhbiBkYXRhLWJpbmQ9XFxcInRleHQ6IHRpdGxlLCBjc3M6IGdldEFjdGlvbkJhckl0ZW1Dc3MoKVxcXCI+PC9zcGFuPlxcbiAgPCEtLSAva28gLS0+XFxuICA8c3YtcG9wdXAgcGFyYW1zPVxcXCJtb2RlbDogcG9wdXBNb2RlbFxcXCI+PC9zdi1wb3B1cD5cXG48L2J1dHRvbj5cXG48IS0tIC9rbyAtLT5cIjsiLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmNvbnN0IHRlbXBsYXRlID0gcmVxdWlyZShcIi4vYWN0aW9uLWJhci1pdGVtLWRyb3Bkb3duLmh0bWxcIik7XG5leHBvcnQgbGV0IEFjdGlvbkJhckl0ZW1Ecm9wZG93blZpZXdNb2RlbDogYW55O1xuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3YtYWN0aW9uLWJhci1pdGVtLWRyb3Bkb3duXCIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiAocGFyYW1zOiBhbnkpID0+IHBhcmFtc1xuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGVcbn0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjwhLS0ga28gd2l0aDogJGRhdGEuaXRlbSAtLT5cXG48YnV0dG9uXFxuICB0eXBlPVxcXCJidXR0b25cXFwiXFxuICBkYXRhLWJpbmQ9XFxcImNsaWNrOiBhY3Rpb24sIGtleTJjbGljazogeyBwcm9jZXNzRXNjOiBmYWxzZSB9LCBkaXNhYmxlOiAkZGF0YS5kaXNhYmxlZCwgY3NzOiBnZXRBY3Rpb25CYXJJdGVtQWN0aXZlQ3NzKCksIGF0dHI6IHsgdGl0bGU6ICRkYXRhLnRvb2x0aXAgfHwgJGRhdGEudGl0bGUgfVxcXCJcXG4+XFxuICA8IS0tIGtvIGlmOiAkZGF0YS5pY29uTmFtZSAtLT5cXG4gIDxzdi1zdmctaWNvblxcbiAgICBjbGFzcz1cXFwic3YtYWN0aW9uLWJhci1pdGVtX19pY29uXFxcIlxcbiAgICBwYXJhbXM9XFxcImljb25OYW1lOiBpY29uTmFtZSwgc2l6ZTogaWNvblNpemVcXFwiXFxuICA+PC9zdi1zdmctaWNvbj5cXG4gIDwhLS0gL2tvIC0tPlxcblxcbiAgPCEtLSBrbyBpZjogJGRhdGEuaGFzVGl0bGUgLS0+XFxuICA8c3BhblxcbiAgICBkYXRhLWJpbmQ9XFxcInRleHQ6IHRpdGxlLCBjc3M6IGdldEFjdGlvbkJhckl0ZW1Dc3MoKVxcXCJcXG4gID48L3NwYW4+XFxuICA8IS0tIC9rbyAtLT5cXG48L2J1dHRvbj5cXG48IS0tIC9rbyAtLT5cIjsiLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmNvbnN0IHRlbXBsYXRlID0gcmVxdWlyZShcIi4vYWN0aW9uLWJhci1pdGVtLmh0bWxcIik7XG5leHBvcnQgbGV0IEFjdGlvbkJhckl0ZW1WaWV3TW9kZWw6IGFueTtcblxua28uY29tcG9uZW50cy5yZWdpc3RlcihcInN2LWFjdGlvbi1iYXItaXRlbVwiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtczogYW55KSA9PiB7XG4gICAgICByZXR1cm4gcGFyYW1zO1xuICAgIH0sXG4gIH0sXG4gIHRlbXBsYXRlOiB0ZW1wbGF0ZVxufSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdiBjbGFzcz1cXFwic3YtYWN0aW9uLWJhci1zZXBhcmF0b3JcXFwiIGRhdGEtYmluZD1cXFwiY3NzOiAkZGF0YS5jc3NcXFwiPjwvZGl2PlwiOyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuXG5jb25zdCB0ZW1wbGF0ZSA9IHJlcXVpcmUoXCIuL2FjdGlvbi1iYXItc2VwYXJhdG9yLmh0bWxcIik7XG5cbmV4cG9ydCB2YXIgQWN0aW9uQmFyU2VwYXJhdG9yVmlld01vZGVsOiBhbnk7XG5cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzdi1hY3Rpb24tYmFyLXNlcGFyYXRvclwiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtczogYW55LCBjb21wb25lbnRJbmZvOiBhbnkpID0+IHtcbiAgICAgIHZhciBpdGVtID0gcGFyYW1zLml0ZW07XG4gICAgICBpZiAoISFpdGVtKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY3NzOiBpdGVtLmlubmVyQ3NzLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHt9O1xuICAgIH0sXG4gIH0sXG4gIHRlbXBsYXRlOiB0ZW1wbGF0ZSxcbn0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjwhLS0ga28gaWY6IG1vZGVsLmhhc0FjdGlvbnMgLS0+XFxuPGRpdlxcbiAgZGF0YS1iaW5kPVxcXCJjc3M6IG1vZGVsLmNzcywgY2xpY2s6IGhhbmRsZUNsaWNrID8gZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlOyB9IDogdW5kZWZpbmVkLCBjbGlja0J1YmJsZTogaGFuZGxlQ2xpY2sgPyBmYWxzZSA6IHVuZGVmaW5lZFxcXCJcXG4+XFxuICA8IS0tIGtvIGZvcmVhY2g6IG1vZGVsLnJlbmRlcmVkQWN0aW9ucyAtLT5cXG4gIDwhLS0ga28gY29tcG9uZW50OiB7IG5hbWU6ICdzdi1hY3Rpb24nLCBwYXJhbXM6IHsgaXRlbTogJGRhdGEgfSB9IC0tPlxcbiAgPCEtLSAva28gLS0+XFxuICA8IS0tL2tvLS0+XFxuPC9kaXY+XFxuPCEtLS9rby0tPlxcblwiOyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgQWN0aW9uQ29udGFpbmVyIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBJbXBsZW1lbnRvckJhc2UgfSBmcm9tIFwiLi4vLi4va29iYXNlXCI7XG5cbmNvbnN0IHRlbXBsYXRlID0gcmVxdWlyZShcIi4vYWN0aW9uLWJhci5odG1sXCIpO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9hY3Rpb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2FjdGlvbi1iYXItaXRlbVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vYWN0aW9uLWJhci1pdGVtLWRyb3Bkb3duXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9hY3Rpb24tYmFyLXNlcGFyYXRvclwiO1xuXG5leHBvcnQgY2xhc3MgQWN0aW9uQmFyVmlld01vZGVsIGV4dGVuZHMgQWN0aW9uQ29udGFpbmVyIHtcbiAgcHJpdmF0ZSBfaW1wbGVtZW50b3I6IEltcGxlbWVudG9yQmFzZTtcbiAgY29uc3RydWN0b3IocHVibGljIG1vZGVsOiBBY3Rpb25Db250YWluZXIsIHB1YmxpYyBoYW5kbGVDbGljayA9IHRydWUpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2ltcGxlbWVudG9yID0gbmV3IEFjdGlvbkNvbnRhaW5lckltcGxlbWVudG9yKG1vZGVsKTtcbiAgfVxuXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgIHRoaXMuX2ltcGxlbWVudG9yLmRpc3Bvc2UoKTtcbiAgICB0aGlzLm1vZGVsLnJlc2V0UmVzcG9uc2l2aXR5TWFuYWdlcigpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25Db250YWluZXJJbXBsZW1lbnRvciBleHRlbmRzIEltcGxlbWVudG9yQmFzZSB7XG4gIHByaXZhdGUgaXRlbXNTdWJzY3JpcHRpb246IGFueTtcblxuICBjb25zdHJ1Y3Rvcihtb2RlbDogQWN0aW9uQ29udGFpbmVyKSB7XG4gICAgc3VwZXIobW9kZWwpO1xuXG4gICAgdGhpcy5pdGVtc1N1YnNjcmlwdGlvbiA9IGtvLmNvbXB1dGVkKCgpID0+IHtcbiAgICAgICgoPGFueT5tb2RlbCkucmVuZGVyZWRBY3Rpb25zIHx8ICg8YW55Pm1vZGVsKS5pdGVtcyB8fCAoPGFueT5tb2RlbCkuYWN0aW9ucykuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XG4gICAgICAgIGlmICghIWl0ZW0uc3RhdGVJdGVtKSB7XG4gICAgICAgICAgbmV3IEltcGxlbWVudG9yQmFzZShpdGVtLnN0YXRlSXRlbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3IEltcGxlbWVudG9yQmFzZShpdGVtKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBkaXNwb3NlKCkge1xuICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICB0aGlzLml0ZW1zU3Vic2NyaXB0aW9uLmRpc3Bvc2UoKTtcbiAgfVxufVxuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3YtYWN0aW9uLWJhclwiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtczogYW55LCBjb21wb25lbnRJbmZvOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGhhbmRsZUNsaWNrID0gcGFyYW1zLmhhbmRsZUNsaWNrICE9PSB1bmRlZmluZWQgPyBwYXJhbXMuaGFuZGxlQ2xpY2sgOiB0cnVlO1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJhbXMubW9kZWw7XG4gICAgICBjb25zdCBjb250YWluZXI6IEhUTUxEaXZFbGVtZW50ID0gY29tcG9uZW50SW5mby5lbGVtZW50Lm5leHRFbGVtZW50U2libGluZztcbiAgICAgIHBhcmFtcy5tb2RlbC5pbml0UmVzcG9uc2l2aXR5TWFuYWdlcihjb250YWluZXIpO1xuICAgICAgcmV0dXJuIG5ldyBBY3Rpb25CYXJWaWV3TW9kZWwobW9kZWwsIGhhbmRsZUNsaWNrKTtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGUsXG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8IS0tIGtvIHdpdGg6ICRkYXRhLml0ZW0gLS0+XFxyXFxuPGRpdiBkYXRhLWJpbmQ9XFxcImNsYXNzOiAkZGF0YS5nZXRBY3Rpb25Sb290Q3NzKCksIGF0dHI6IHsgaWQ6ICRkYXRhLmlkIH1cXFwiPlxcclxcbiAgICA8ZGl2IGNsYXNzPVxcXCJzdi1hY3Rpb25fX2NvbnRlbnRcXFwiPlxcclxcbiAgICAgICAgPCEtLSBrbyBpZjogJGRhdGEubmVlZFNlcGFyYXRvciAtLT5cXHJcXG4gICAgICAgIDxzdi1hY3Rpb24tYmFyLXNlcGFyYXRvcj48L3N2LWFjdGlvbi1iYXItc2VwYXJhdG9yPlxcclxcbiAgICAgICAgPCEtLSAva28gLS0+XFxyXFxuICAgICAgICA8IS0tIGtvIGlmbm90OiAkZGF0YS50ZW1wbGF0ZS0tPlxcclxcbiAgICAgICAgPCEtLSBrbyBjb21wb25lbnQ6IHsgbmFtZTogJGRhdGEuY29tcG9uZW50IHx8ICdzdi1hY3Rpb24tYmFyLWl0ZW0nLCBwYXJhbXM6IHsgaXRlbTogJGRhdGEgfSB9IC0tPlxcclxcbiAgICAgICAgPCEtLSAva28gLS0+XFxyXFxuICAgICAgICA8IS0tIC9rbyAtLT5cXHJcXG4gICAgICAgIDwhLS0ga28gaWY6ICRkYXRhLnRlbXBsYXRlICAtLT5cXHJcXG4gICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJGRhdGEudGVtcGxhdGUsIGRhdGE6ICRkYXRhLmRhdGEgfHwgJGRhdGEgfSAtLT5cXHJcXG4gICAgICAgIDwhLS0gL2tvIC0tPlxcclxcbiAgICAgICAgPCEtLSAva28gLS0+XFxyXFxuICAgIDwvZGl2PlxcclxcbjwvZGl2PlxcclxcbjwhLS0gL2tvIC0tPlwiOyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xyXG5pbXBvcnQgeyBBY3Rpb24gfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcclxuaW1wb3J0IHsgSW1wbGVtZW50b3JCYXNlIH0gZnJvbSBcIi4uLy4uL2tvYmFzZVwiO1xyXG5jb25zdCB0ZW1wbGF0ZSA9IHJlcXVpcmUoXCIuL2FjdGlvbi5odG1sXCIpO1xyXG5cclxua28uY29tcG9uZW50cy5yZWdpc3RlcihcInN2LWFjdGlvblwiLCB7XHJcbiAgdmlld01vZGVsOiB7XHJcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXM6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBpdGVtOiBBY3Rpb24gPSBwYXJhbXMuaXRlbTtcclxuICAgICAgbmV3IEltcGxlbWVudG9yQmFzZShpdGVtKTtcclxuICAgICAgcmV0dXJuIHBhcmFtcztcclxuICAgIH0sXHJcbiAgfSxcclxuICB0ZW1wbGF0ZTogdGVtcGxhdGVcclxufSk7XHJcbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLnJvb3RcXFwiPlxcbiAgPGxhYmVsIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5nZXRJdGVtQ3NzKClcXFwiPlxcbiAgICA8aW5wdXRcXG4gICAgICB0eXBlPVxcXCJjaGVja2JveFxcXCJcXG4gICAgICBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5jb250cm9sLCBhdHRyOiB7bmFtZTogcXVlc3Rpb24ubmFtZSwgaWQ6IHF1ZXN0aW9uLmlucHV0SWQsICdhcmlhLXJlcXVpcmVkJzogcXVlc3Rpb24uYXJpYVJlcXVpcmVkLCAnYXJpYS1sYWJlbCc6IHF1ZXN0aW9uLmFyaWFMYWJlbCwgJ2FyaWEtaW52YWxpZCc6IHF1ZXN0aW9uLmFyaWFJbnZhbGlkLCAnYXJpYS1kZXNjcmliZWRieSc6IHF1ZXN0aW9uLmFyaWFEZXNjcmliZWRCeX0sIGNoZWNrZWQ6IHF1ZXN0aW9uLmNoZWNrZWRWYWx1ZSwgc3VydmV5UHJvcDoge2luZGV0ZXJtaW5hdGU6IHF1ZXN0aW9uLmlzSW5kZXRlcm1pbmF0ZX0sIGVuYWJsZTogIXF1ZXN0aW9uLmlzSW5wdXRSZWFkT25seVxcXCJcXG4gICAgLz5cXG4gICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkubWF0ZXJpYWxEZWNvcmF0b3JcXFwiPlxcbiAgICAgIDxzdmcgdmlld0JveD1cXFwiMCAwIDI0IDI0XFxcIiBkYXRhLWJpbmQ9XFxcImNzczpxdWVzdGlvbi5rb0NzcygpLml0ZW1EZWNvcmF0b3JcXFwiPlxcbiAgICAgICAgPHJlY3RcXG4gICAgICAgICAgZGF0YS1iaW5kPVxcXCJjc3M6cXVlc3Rpb24ua29Dc3MoKS51bmNoZWNrZWRQYXRoXFxcIlxcbiAgICAgICAgICB4PVxcXCI1XFxcIlxcbiAgICAgICAgICB5PVxcXCIxMFxcXCJcXG4gICAgICAgICAgd2lkdGg9XFxcIjE0XFxcIlxcbiAgICAgICAgICBoZWlnaHQ9XFxcIjRcXFwiXFxuICAgICAgICAvPlxcbiAgICAgICAgPHBvbHlnb25cXG4gICAgICAgICAgZGF0YS1iaW5kPVxcXCJjc3M6cXVlc3Rpb24ua29Dc3MoKS5jaGVja2VkUGF0aFxcXCJcXG4gICAgICAgICAgcG9pbnRzPVxcXCIxOSwxMCAxNCwxMCAxNCw1IDEwLDUgMTAsMTAgNSwxMCA1LDE0IDEwLDE0IDEwLDE5IDE0LDE5IDE0LDE0IDE5LDE0IFxcXCJcXG4gICAgICAgIC8+XFxuICAgICAgICA8cGF0aFxcbiAgICAgICAgICBkYXRhLWJpbmQ9XFxcImNzczpxdWVzdGlvbi5rb0NzcygpLmluZGV0ZXJtaW5hdGVQYXRoXFxcIlxcbiAgICAgICAgICBkPVxcXCJNMjIsMEgyQzAuOSwwLDAsMC45LDAsMnYyMGMwLDEuMSwwLjksMiwyLDJoMjBjMS4xLDAsMi0wLjksMi0yVjJDMjQsMC45LDIzLjEsMCwyMiwweiBNMjEsMThMNiwzaDE1VjE4eiBNMyw2bDE1LDE1SDNWNnpcXFwiXFxuICAgICAgICAvPlxcbiAgICAgIDwvc3ZnPlxcbiAgICAgIDxzcGFuIGNsYXNzPVxcXCJjaGVja1xcXCI+PC9zcGFuPlxcbiAgICA8L3NwYW4+XFxuICAgIDxzcGFuXFxuICAgICAgZGF0YS1iaW5kPVxcXCJpZjogcXVlc3Rpb24udGl0bGVMb2NhdGlvbiA9PT0gJ2hpZGRlbicsIGNzczogcXVlc3Rpb24ua29Dc3MoKS5sYWJlbFxcXCJcXG4gICAgPlxcbiAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiBxdWVzdGlvbi5sb2NEaXNwbGF5TGFiZWwgfSAtLT5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gICAgPC9zcGFuPlxcbiAgPC9sYWJlbD5cXG48L2Rpdj5cXG5cIjsiLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFJlbmRlcmVyRmFjdG9yeSB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuXG5jb25zdCB0ZW1wbGF0ZSA9IHJlcXVpcmUoXCIuL2Jvb2xlYW4tY2hlY2tib3guaHRtbFwiKTtcblxuZXhwb3J0IHZhciBDaGVja2JveFZpZXdNb2RlbDogYW55O1xuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3YtYm9vbGVhbi1jaGVja2JveFwiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtczogYW55LCBjb21wb25lbnRJbmZvOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiB7IHF1ZXN0aW9uOiBwYXJhbXMucXVlc3Rpb24gfTtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGUsXG59KTtcblxuUmVuZGVyZXJGYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUmVuZGVyZXIoXG4gIFwiYm9vbGVhblwiLFxuICBcImNoZWNrYm94XCIsXG4gIFwic3YtYm9vbGVhbi1jaGVja2JveFwiXG4pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxsYWJlbCBkYXRhLWJpbmQ9XFxcImNzczogbW9kZWwuY3NzLmxhYmVsLCBhdHRyOiB7IHRpdGxlOiBtb2RlbC5jYXB0aW9uLmtvUmVuZGVyZWRIdG1sIH1cXFwiPlxcclxcbiAgPGlucHV0IHR5cGU9XFxcInJhZGlvXFxcIlxcclxcbiAgICBkYXRhLWJpbmQ9XFxcImF0dHI6IHsgbmFtZTogbW9kZWwubmFtZSwgaWQ6IG1vZGVsLmlkLCAnYXJpYS1yZXF1aXJlZCc6IG1vZGVsLmlzUmVxdWlyZWQsICdhcmlhLWxhYmVsJzogbW9kZWwuY2FwdGlvbi5rb1JlbmRlcmVkSHRtbCwgcm9sZTogJ3JhZGlvJywgJ2FyaWEtaW52YWxpZCc6IG1vZGVsLmhhc0Vycm9ycywgJ2FyaWEtZGVzY3JpYmVkYnknOiBtb2RlbC5kZXNjcmliZUJ5fSwgY2hlY2tlZFZhbHVlOiBtb2RlbC52YWx1ZSwgY2hlY2tlZDogbW9kZWwucXVlc3Rpb24ucmVuZGVyZWRWYWx1ZSwgZGlzYWJsZTogbW9kZWwucmVhZE9ubHksIGNzczogbW9kZWwuY3NzLmNvbnRyb2xcXFwiIC8+XFxyXFxuICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBtb2RlbC5jc3MuZGVjb3JhdG9yXFxcIj5cXHJcXG4gICAgPCEtLSBrbyBpZjogISFtb2RlbC5pY29uTmFtZS0tPlxcclxcbiAgICA8c3Ytc3ZnLWljb24gZGF0YS1iaW5kPVxcXCJjc3M6IG1vZGVsLmNzcy5pY29uXFxcIiBwYXJhbXM9XFxcImljb25OYW1lOiBtb2RlbC5pY29uTmFtZSwgc2l6ZTogbW9kZWwuaWNvblNpemVcXFwiPjwvc3Ytc3ZnLWljb24+XFxyXFxuICAgIDwhLS0gL2tvIC0tPlxcclxcbiAgICA8IS0tIGtvIGlmOiBtb2RlbC5zaG93Q2FwdGlvbiAtLT5cXHJcXG4gICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJjc3M6IG1vZGVsLmNzcy5jYXB0aW9uLCBhdHRyOiB7IHRpdGxlOiBtb2RlbC5jYXB0aW9uLmtvUmVuZGVyZWRIdG1sIH1cXFwiPlxcclxcbiAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiBtb2RlbC5jYXB0aW9uIH0gLS0+XFxyXFxuICAgICAgPCEtLSAva28gLS0+XFxyXFxuICAgIDwvc3Bhbj5cXHJcXG4gICAgPCEtLSAva28gLS0+XFxyXFxuICA8L2Rpdj5cXHJcXG48L2xhYmVsPlwiOyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xyXG5pbXBvcnQgeyBCdXR0b25Hcm91cEl0ZW1Nb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xyXG5jb25zdCB0ZW1wbGF0ZSA9IHJlcXVpcmUoXCIuL2J1dHRvbi1ncm91cC1pdGVtLmh0bWxcIik7XHJcblxyXG5leHBvcnQgY2xhc3MgQnV0dG9uR3JvdXBJdGVtVmlld01vZGVsIHtcclxuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIG1vZGVsOiBCdXR0b25Hcm91cEl0ZW1Nb2RlbCkge31cclxufVxyXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3YtYnV0dG9uLWdyb3VwLWl0ZW1cIiwge1xyXG4gIHZpZXdNb2RlbDoge1xyXG4gICAgY3JlYXRlVmlld01vZGVsOiAocGFyYW1zOiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgbW9kZWwgPSBuZXcgQnV0dG9uR3JvdXBJdGVtTW9kZWwoXHJcbiAgICAgICAgcGFyYW1zLnF1ZXN0aW9uLFxyXG4gICAgICAgIHBhcmFtcy5pdGVtLFxyXG4gICAgICAgIHBhcmFtcy5pbmRleCgpXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IHZpZXdNb2RlbCA9IG5ldyBCdXR0b25Hcm91cEl0ZW1WaWV3TW9kZWwobW9kZWwpO1xyXG4gICAgICByZXR1cm4gdmlld01vZGVsO1xyXG4gICAgfSxcclxuICB9LFxyXG4gIHRlbXBsYXRlOiB0ZW1wbGF0ZSxcclxufSk7XHJcbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8dWwgY2xhc3M9XFxcInN2LWxpc3RcXFwiIGRhdGEtYmluZD1cXFwiZXZlbnQ6IHsgbW91c2Vkb3duOiBmdW5jdGlvbiAoZGF0YSwgZSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IH0sIGtleWRvd246IGZ1bmN0aW9uKGRhdGEsIGUpIHsgJGRhdGEub25LZXlEb3duKGV2ZW50KTsgcmV0dXJuIHRydWU7IH0gfVxcXCI+XFxuICA8IS0ta28gZm9yZWFjaDogaXRlbXMtLT5cXG4gIDxsaSBjbGFzcz1cXFwic3YtbGlzdF9faXRlbVxcXCIgZGF0YS1iaW5kPVxcXCJzdHlsZTogeyBwYWRkaW5nTGVmdDogJHBhcmVudC5nZXRJdGVtSW5kZW50KCRkYXRhKSB9LCBjc3M6IHsgJ3N2LWxpc3RfX2l0ZW0tLWRpc2FibGVkJzogJHBhcmVudC5pc0l0ZW1EaXNhYmxlZCgkZGF0YSksICdzdi1saXN0X19pdGVtLS1zZWxlY3RlZCc6ICRwYXJlbnQuaXNJdGVtU2VsZWN0ZWQoJGRhdGEpIH0sIGNsaWNrOiAkcGFyZW50LnNlbGVjdEl0ZW0sIGtleTJjbGljaywgdmlzaWJsZTogJGRhdGEudmlzaWJsZSA9PT0gdW5kZWZpbmVkIHx8ICRkYXRhLnZpc2libGVcXFwiPlxcbiAgICA8IS0tIGtvIGlmbm90OiAkZGF0YS5jb21wb25lbnQgLS0+XFxuICAgIDwhLS0ga28gaWY6ICRkYXRhLmljb25OYW1lIC0tPlxcbiAgICA8c3Ytc3ZnLWljb24gY2xhc3M9XFxcInN2LWxpc3RfX2l0ZW0taWNvblxcXCIgcGFyYW1zPVxcXCJpY29uTmFtZTogaWNvbk5hbWUsIHNpemU6IDI0XFxcIj48L3N2LXN2Zy1pY29uPlxcbiAgICA8IS0tIC9rbyAtLT5cXG4gICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJ0ZXh0OiAkZGF0YS50aXRsZVxcXCI+PC9zcGFuPlxcbiAgICA8IS0tIC9rbyAtLT5cXG4gICAgPCEtLSBrbyBpZjogJGRhdGEuY29tcG9uZW50IC0tPlxcbiAgICA8IS0tIGtvIGNvbXBvbmVudDogeyBuYW1lOiAkZGF0YS5jb21wb25lbnQsIHBhcmFtczogeyBpdGVtOiAkZGF0YSB9IH0gLS0+XFxuICAgIDwhLS0gL2tvIC0tPlxcbiAgICA8IS0tIC9rbyAtLT5cXG4gIDwvbGk+XFxuICA8IS0tIC9rbyAtLT5cXG48L3VsPlwiOyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgTGlzdE1vZGVsIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBJbXBsZW1lbnRvckJhc2UgfSBmcm9tIFwiLi4vLi4va29iYXNlXCI7XG5cbmNvbnN0IHRlbXBsYXRlID0gcmVxdWlyZShcIi4vbGlzdC5odG1sXCIpO1xuXG5leHBvcnQgdmFyIExpc3RWaWV3Q29tcG9uZW50OiBhbnk7XG5cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzdi1saXN0XCIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiAocGFyYW1zOiBhbnksIGNvbXBvbmVudEluZm86IGFueSkgPT4ge1xuICAgICAgY29uc3QgbW9kZWw6IExpc3RNb2RlbCA9IHBhcmFtcy5tb2RlbDtcbiAgICAgIG5ldyBJbXBsZW1lbnRvckJhc2UobW9kZWwpO1xuICAgICAgcmV0dXJuIG1vZGVsO1xuICAgIH0sXG4gIH0sXG4gIHRlbXBsYXRlOiB0ZW1wbGF0ZSxcbn0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjwhLS0ga28gd2l0aDogc3VydmV5IC0tPlxcbjxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IGxvZ29DbGFzc05hbWVzXFxcIj5cXG4gIDxpbWcgZGF0YS1iaW5kPVxcXCJjc3M6IGNzcy5sb2dvSW1hZ2UsIGF0dHI6IHsgc3JjOiBsb2NMb2dvLmtvUmVuZGVyZWRIdG1sLCB3aWR0aDogbG9nb1dpZHRoID8gbG9nb1dpZHRoIDogdW5kZWZpbmVkLCBoZWlnaHQ6IGxvZ29IZWlnaHQgPyBsb2dvSGVpZ2h0IDogdW5kZWZpbmVkLCBhbHQ6IGxvY1RpdGxlLnJlbmRlcmVkSHRtbCB9LCBzdHlsZTogeyBvYmplY3RGaXQ6IGxvZ29GaXQgfVxcXCI+XFxuPC9kaXY+XFxuPCEtLSBrbyBpZjogaXNMb2dvQWZ0ZXIgLS0+XFxuPGRpdiBjbGFzcz1cXFwic3YtbG9nby0tcmlnaHQtdGFpbFxcXCI+PC9kaXY+XFxuPCEtLSAva28gLS0+XFxuPCEtLSAva28gLS0+XCI7IiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5jb25zdCB0ZW1wbGF0ZTogc3RyaW5nID0gcmVxdWlyZShcIi4vbG9nby1pbWFnZS5odG1sXCIpO1xuZXhwb3J0IGxldCBMb2dvSW1hZ2VWaWV3TW9kZWw6IGFueTtcblxua28uY29tcG9uZW50cy5yZWdpc3RlcihcInN2LWxvZ28taW1hZ2VcIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXM6IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIHsgc3VydmV5OiBwYXJhbXMgfTtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGVcbn0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxidXR0b25cXG50eXBlPVxcXCJidXR0b25cXFwiXFxuZGF0YS1iaW5kPVxcXCJjc3M6cXVlc3Rpb24uZ2V0RGV0YWlsUGFuZWxCdXR0b25Dc3Mocm93KSwgY2xpY2s6cm93LnNob3dIaWRlRGV0YWlsUGFuZWxDbGljaywgYXR0cjp7ICdhcmlhLWV4cGFuZGVkJzogcXVlc3Rpb24uZ2V0SXNEZXRhaWxQYW5lbFNob3dpbmcoJGRhdGEucm93KSA/ICd0cnVlJzogJ2ZhbHNlJywgJ2FyaWEtY29udHJvbHMnOiBxdWVzdGlvbi5nZXRJc0RldGFpbFBhbmVsU2hvd2luZygkZGF0YS5yb3cpID8gcm93LmRldGFpbFBhbmVsSWQ6IGZhbHNlfVxcXCJcXG4+XFxuPHNwYW5cXG4gIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5nZXREZXRhaWxQYW5lbEljb25Dc3Mocm93KVxcXCJcXG4+PC9zcGFuPlxcbjwvYnV0dG9uPlxcbjwhLS0ga28gaWY6IHF1ZXN0aW9uLmRldGFpbFBhbmVsTW9kZSA9PT0gXFxcInBvcHVwXFxcIiAmJiBxdWVzdGlvbi5nZXRLb1BvcHVwSXNWaXNpYmxlKHJvdykgLS0+XFxuPHN2LXBvcHVwXFxucGFyYW1zPVxcXCJjb250ZW50Q29tcG9uZW50TmFtZTogJ3N2LXBhbmVsJywgY29udGVudENvbXBvbmVudERhdGE6IHsgcXVlc3Rpb246IHJvdy5kZXRhaWxQYW5lbCwgb25JdGVtU2VsZWN0OiBmdW5jdGlvbigpe30gfSwgaXNWaXNpYmxlOiBxdWVzdGlvbi5nZXRLb1BvcHVwSXNWaXNpYmxlKHJvdyksIGlzTW9kYWw6IHRydWUsIG9uSGlkZTogZnVuY3Rpb24oKSB7IHJvdy5oaWRlRGV0YWlsUGFuZWwoKSB9LCB2ZXJ0aWNhbFBvc2l0aW9uOiAndG9wJywgaG9yaXpvbnRhbFBvc2l0aW9uOiAncmlnaHQnXFxcIlxcbj48L3N2LXBvcHVwPlxcbjwhLS0gL2tvIC0tPlwiOyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuXG5jb25zdCB0ZW1wbGF0ZSA9IHJlcXVpcmUoXCIuL2RldGFpbC1idXR0b24uaHRtbFwiKTtcblxuZXhwb3J0IHZhciBTdXJ2ZXlRdWVzdGlvbk1hdHJpeERldGFpbEJ1dHRvbjogYW55O1xuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3YtbWF0cml4LWRldGFpbC1idXR0b25cIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXM6IGFueSwgY29tcG9uZW50SW5mbzogYW55KSA9PiB7XG4gICAgICByZXR1cm4gcGFyYW1zLml0ZW0uZGF0YTtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGUsXG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8c3BhblxcbiAgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuaWNvbkRyYWcsIGV2ZW50OiB7IHBvaW50ZXJkb3duOiBmdW5jdGlvbiAobW9kZWwsIGV2ZW50KSB7IHF1ZXN0aW9uLnN0YXJ0RHJhZ01hdHJpeFJvdyhldmVudCwgcm93KTsgfSB9XFxcIlxcbj48L3NwYW4+XFxuXCI7IiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5cbmNvbnN0IHRlbXBsYXRlID0gcmVxdWlyZShcIi4vZHJhZy1kcm9wLWljb24uaHRtbFwiKTtcblxuZXhwb3J0IHZhciBTdXJ2ZXlRdWVzdGlvbk1hdHJpeER5bmFtaWNEcmFnRHJvcEljb246IGFueTtcblxua28uY29tcG9uZW50cy5yZWdpc3RlcihcInN2LW1hdHJpeC1kcmFnLWRyb3AtaWNvblwiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtczogYW55LCBjb21wb25lbnRJbmZvOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBwYXJhbXMuaXRlbS5kYXRhO1xuICAgIH0sXG4gIH0sXG4gIHRlbXBsYXRlOiB0ZW1wbGF0ZSxcbn0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxidXR0b25cXG4gIHR5cGU9XFxcImJ1dHRvblxcXCJcXG4gIGRhdGEtYmluZD1cXFwiY2xpY2s6IHF1ZXN0aW9uLmtvUmVtb3ZlUm93Q2xpY2ssIGRpc2FibGU6IHF1ZXN0aW9uLmlzSW5wdXRSZWFkT25seSwgY3NzOiBxdWVzdGlvbi5nZXRSZW1vdmVSb3dCdXR0b25Dc3MoKVxcXCJcXG4+XFxuICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogcXVlc3Rpb24ubG9jUmVtb3ZlUm93VGV4dCB9IC0tPjwhLS0gL2tvIC0tPlxcbiAgPHNwYW4gZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuaWNvblJlbW92ZVxcXCI+PC9zcGFuPlxcbjwvYnV0dG9uPlxcblwiOyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuY29uc3QgdGVtcGxhdGUgPSByZXF1aXJlKFwiLi9yZW1vdmUtYnV0dG9uLmh0bWxcIik7XG5leHBvcnQgbGV0IFN1cnZleVF1ZXN0aW9uTWF0cml4RHluYW1pY1JlbW92ZUJ1dHRvbjogYW55O1xuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3YtbWF0cml4LXJlbW92ZS1idXR0b25cIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXM6IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIHBhcmFtcy5pdGVtLmRhdGE7XG4gICAgfSxcbiAgfSxcbiAgdGVtcGxhdGU6IHRlbXBsYXRlXG59KTtcbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgUGFuZWxNb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuY29uc3QgdGVtcGxhdGUgPSByZXF1aXJlKFwiaHRtbC1sb2FkZXI/aW50ZXJwb2xhdGUhdmFsLWxvYWRlciEuL3BhbmVsLmh0bWxcIik7XG5cbmV4cG9ydCBjbGFzcyBQYW5lbFZpZXdNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBxdWVzdGlvbjogUGFuZWxNb2RlbCwgcHVibGljIHRhcmdldEVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7fVxufVxuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3YtcGFuZWxcIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXM6IGFueSwgY29tcG9uZW50SW5mbzogYW55KSA9PiB7XG4gICAgICBjb25zdCB2aWV3TW9kZWwgPSBuZXcgUGFuZWxWaWV3TW9kZWwoXG4gICAgICAgIHBhcmFtcy5xdWVzdGlvbixcbiAgICAgICAgY29tcG9uZW50SW5mby5lbGVtZW50LnBhcmVudEVsZW1lbnRcbiAgICAgICk7XG4gICAgICByZXR1cm4gdmlld01vZGVsO1xuICAgIH0sXG4gIH0sXG4gIHRlbXBsYXRlOiB0ZW1wbGF0ZSxcbn0pO1xuIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBjcmVhdGVQb3B1cE1vZGFsVmlld01vZGVsLCBQb3B1cEJhc2VWaWV3TW9kZWwgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IEltcGxlbWVudG9yQmFzZSB9IGZyb20gXCIuLi8uLi9rb2Jhc2VcIjtcbmltcG9ydCB7IHNldHRpbmdzIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5jb25zdCB0ZW1wbGF0ZSA9IHJlcXVpcmUoXCJodG1sLWxvYWRlcj9pbnRlcnBvbGF0ZSF2YWwtbG9hZGVyIS4vcG9wdXAuaHRtbFwiKTtcblxuZXhwb3J0IGNsYXNzIFBvcHVwVmlld01vZGVsIHtcbiAgY29uc3RydWN0b3IocHVibGljIHBvcHVwVmlld01vZGVsOiBQb3B1cEJhc2VWaWV3TW9kZWwpIHtcbiAgICBpZiAoIXBvcHVwVmlld01vZGVsLmNvbnRhaW5lcilcbiAgICAgIHBvcHVwVmlld01vZGVsLmluaXRpYWxpemVQb3B1cENvbnRhaW5lcigpO1xuICAgIG5ldyBJbXBsZW1lbnRvckJhc2UocG9wdXBWaWV3TW9kZWwubW9kZWwpO1xuICAgIG5ldyBJbXBsZW1lbnRvckJhc2UocG9wdXBWaWV3TW9kZWwpO1xuICAgIHBvcHVwVmlld01vZGVsLmNvbnRhaW5lci5pbm5lckhUTUwgPSB0ZW1wbGF0ZTtcbiAgICBwb3B1cFZpZXdNb2RlbC5tb2RlbC5vblZpc2liaWxpdHlDaGFuZ2VkID0gKGlzVmlzaWJsZTogYm9vbGVhbikgPT4ge1xuICAgICAgaWYgKGlzVmlzaWJsZSkge1xuICAgICAgICBrby50YXNrcy5ydW5FYXJseSgpO1xuICAgICAgICBwb3B1cFZpZXdNb2RlbC51cGRhdGVPblNob3dpbmcoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGtvLmFwcGx5QmluZGluZ3MocG9wdXBWaWV3TW9kZWwsIHBvcHVwVmlld01vZGVsLmNvbnRhaW5lcik7XG4gIH1cbiAgZGlzcG9zZSgpIHtcbiAgICBrby5jbGVhbk5vZGUodGhpcy5wb3B1cFZpZXdNb2RlbC5jb250YWluZXIpO1xuICAgIHRoaXMucG9wdXBWaWV3TW9kZWwuZGVzdHJveVBvcHVwQ29udGFpbmVyKCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3dNb2RhbChcbiAgY29tcG9uZW50TmFtZTogc3RyaW5nLFxuICBkYXRhOiBhbnksXG4gIG9uQXBwbHk6ICgpID0+IGJvb2xlYW4sXG4gIG9uQ2FuY2VsPzogKCkgPT4gdm9pZCxcbiAgY3NzQ2xhc3M/OiBzdHJpbmcsXG4gIHRpdGxlPzogc3RyaW5nXG4pIHtcbiAgY29uc3QgcG9wdXBWaWV3TW9kZWw6IFBvcHVwQmFzZVZpZXdNb2RlbCA9IGNyZWF0ZVBvcHVwTW9kYWxWaWV3TW9kZWwoY29tcG9uZW50TmFtZSwgZGF0YSwgb25BcHBseSwgb25DYW5jZWwsXG4gICAgKCkgPT4ge1xuICAgICAgdmlld01vZGVsLmRpc3Bvc2UoKTtcbiAgICB9LCB1bmRlZmluZWQsIGNzc0NsYXNzLCB0aXRsZSk7XG4gIHZhciB2aWV3TW9kZWwgPSBuZXcgUG9wdXBWaWV3TW9kZWwocG9wdXBWaWV3TW9kZWwpO1xuICBwb3B1cFZpZXdNb2RlbC5tb2RlbC5pc1Zpc2libGUgPSB0cnVlO1xufVxuXG5zZXR0aW5ncy5zaG93TW9kYWwgPSBzaG93TW9kYWw7XG5cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzdi1wb3B1cFwiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtczogYW55LCBjb21wb25lbnRJbmZvOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IHZpZXdNb2RlbCA9IG5ldyBQb3B1cEJhc2VWaWV3TW9kZWwoXG4gICAgICAgIGtvLnVud3JhcChwYXJhbXMubW9kZWwpLFxuICAgICAgICBjb21wb25lbnRJbmZvLmVsZW1lbnQucGFyZW50RWxlbWVudFxuICAgICAgKTtcbiAgICAgIHJldHVybiBuZXcgUG9wdXBWaWV3TW9kZWwodmlld01vZGVsKTtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogXCI8ZGl2PjwvZGl2PlwiLFxufSk7XG4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFN1cnZleU1vZGVsLCBTdXJ2ZXlQcm9ncmVzc0J1dHRvbnNNb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuY29uc3QgdGVtcGxhdGU6IGFueSA9IHJlcXVpcmUoXCJodG1sLWxvYWRlcj9pbnRlcnBvbGF0ZSF2YWwtbG9hZGVyIS4vYnV0dG9ucy5odG1sXCIpO1xuXG5leHBvcnQgY2xhc3MgUHJvZ3Jlc3NCdXR0b25zVmlld01vZGVsIHtcbiAgcHJpdmF0ZSBwcm9ncmVzc0J1dHRvbnNNb2RlbDogU3VydmV5UHJvZ3Jlc3NCdXR0b25zTW9kZWw7XG4gIHByaXZhdGUgc2Nyb2xsQnV0dG9uQ3NzS286IGFueSA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBoYXNTY3JvbGxlcjogYW55ID0ga28ub2JzZXJ2YWJsZShmYWxzZSk7XG4gIHByaXZhdGUgdXBkYXRlU2Nyb2xsZXI6IGFueSA9IHVuZGVmaW5lZDtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzdXJ2ZXk6IFN1cnZleU1vZGVsLCBlbGVtZW50OiBhbnkpIHtcbiAgICB0aGlzLnByb2dyZXNzQnV0dG9uc01vZGVsID0gbmV3IFN1cnZleVByb2dyZXNzQnV0dG9uc01vZGVsKHN1cnZleSk7XG4gICAgdGhpcy51cGRhdGVTY3JvbGxlciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIGNvbnN0IGxpc3RDb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudCA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgXCIuXCIgKyBzdXJ2ZXkuY3NzLnByb2dyZXNzQnV0dG9uc0xpc3RDb250YWluZXJcbiAgICAgICk7XG4gICAgICBpZiAoISFsaXN0Q29udGFpbmVyRWxlbWVudCkge1xuICAgICAgICB0aGlzLmhhc1Njcm9sbGVyKFxuICAgICAgICAgIGxpc3RDb250YWluZXJFbGVtZW50LnNjcm9sbFdpZHRoID4gbGlzdENvbnRhaW5lckVsZW1lbnQub2Zmc2V0V2lkdGhcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9LCAxMDApO1xuICB9XG4gIHB1YmxpYyBpc0xpc3RFbGVtZW50Q2xpY2thYmxlKGluZGV4OiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wcm9ncmVzc0J1dHRvbnNNb2RlbC5pc0xpc3RFbGVtZW50Q2xpY2thYmxlKGluZGV4KCkpO1xuICB9XG4gIHB1YmxpYyBnZXRMaXN0RWxlbWVudENzcyhpbmRleDogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9ncmVzc0J1dHRvbnNNb2RlbC5nZXRMaXN0RWxlbWVudENzcyhpbmRleCgpKTtcbiAgfVxuICBwdWJsaWMgY2xpY2tMaXN0RWxlbWVudChpbmRleDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5wcm9ncmVzc0J1dHRvbnNNb2RlbC5jbGlja0xpc3RFbGVtZW50KGluZGV4KCkpO1xuICB9XG4gIHB1YmxpYyBnZXRTY3JvbGxCdXR0b25Dc3MoaXNMZWZ0U2Nyb2xsOiBib29sZWFuKTogYW55IHtcbiAgICB0aGlzLnNjcm9sbEJ1dHRvbkNzc0tvID0ga28uY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMucHJvZ3Jlc3NCdXR0b25zTW9kZWwuZ2V0U2Nyb2xsQnV0dG9uQ3NzKHRoaXMuaGFzU2Nyb2xsZXIoKSwgaXNMZWZ0U2Nyb2xsKTtcbiAgICB9LCB0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5zY3JvbGxCdXR0b25Dc3NLbztcbiAgfVxuICBwdWJsaWMgY2xpY2tTY3JvbGxCdXR0b24oXG4gICAgbGlzdENvbnRhaW5lckVsZW1lbnQ6IEVsZW1lbnQsXG4gICAgaXNMZWZ0U2Nyb2xsOiBib29sZWFuXG4gICk6IHZvaWQge1xuICAgIGxpc3RDb250YWluZXJFbGVtZW50LnNjcm9sbExlZnQgKz0gKGlzTGVmdFNjcm9sbCA/IC0xIDogMSkgKiA3MDtcbiAgfVxuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodHlwZW9mIHRoaXMudXBkYXRlU2Nyb2xsZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy51cGRhdGVTY3JvbGxlcik7XG4gICAgICB0aGlzLnVwZGF0ZVNjcm9sbGVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHRoaXMuc2Nyb2xsQnV0dG9uQ3NzS28gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRoaXMuc2Nyb2xsQnV0dG9uQ3NzS28uZGlzcG9zZSgpO1xuICAgICAgdGhpcy5zY3JvbGxCdXR0b25Dc3NLbyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbn1cblxua28uY29tcG9uZW50cy5yZWdpc3RlcihcInN2LXByb2dyZXNzLWJ1dHRvbnNcIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXM6IGFueSwgY29tcG9uZW50SW5mbzogYW55KSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFByb2dyZXNzQnV0dG9uc1ZpZXdNb2RlbChcbiAgICAgICAgcGFyYW1zLm1vZGVsLFxuICAgICAgICBjb21wb25lbnRJbmZvLmVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nXG4gICAgICApO1xuICAgIH0sXG4gIH0sXG4gIHRlbXBsYXRlOiB0ZW1wbGF0ZVxufSk7XG4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFN1cnZleVByb2dyZXNzTW9kZWwgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmNvbnN0IHRlbXBsYXRlID0gcmVxdWlyZShcImh0bWwtbG9hZGVyP2ludGVycG9sYXRlIXZhbC1sb2FkZXIhLi9wcm9ncmVzcy5odG1sXCIpO1xuXG5leHBvcnQgY2xhc3MgUHJvZ3Jlc3NWaWV3TW9kZWwge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbW9kZWw6IGFueSkge31cblxuICBnZXRQcm9ncmVzc1RleHRJbkJhckNzcyhjc3M6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFN1cnZleVByb2dyZXNzTW9kZWwuZ2V0UHJvZ3Jlc3NUZXh0SW5CYXJDc3MoY3NzKTtcbiAgfVxuICBnZXRQcm9ncmVzc1RleHRVbmRlckJhckNzcyhjc3M6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFN1cnZleVByb2dyZXNzTW9kZWwuZ2V0UHJvZ3Jlc3NUZXh0VW5kZXJCYXJDc3MoY3NzKTtcbiAgfVxufVxuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3YtcHJvZ3Jlc3MtcHJvZ3Jlc3NcIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXM6IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9ncmVzc1ZpZXdNb2RlbChwYXJhbXMubW9kZWwpO1xuICAgIH1cbiAgfSxcbiAgdGVtcGxhdGU6IHRlbXBsYXRlXG59KTtcblxuY29uc3QgdGVtcGxhdGVCcmlkZ2UgPSBcIjwhLS0ga28gY29tcG9uZW50OiB7IG5hbWU6ICdzdi1wcm9ncmVzcy1wcm9ncmVzcycsIHBhcmFtczogJGRhdGEgfSAtLT48IS0tIC9rbyAtLT5cIjtcbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzdi1wcm9ncmVzcy1wYWdlc1wiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtczogYW55KSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFByb2dyZXNzVmlld01vZGVsKHBhcmFtcy5tb2RlbCk7XG4gICAgfVxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGVCcmlkZ2Vcbn0pO1xua28uY29tcG9uZW50cy5yZWdpc3RlcihcInN2LXByb2dyZXNzLXF1ZXN0aW9uc1wiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtczogYW55KSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFByb2dyZXNzVmlld01vZGVsKHBhcmFtcy5tb2RlbCk7XG4gICAgfVxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGVCcmlkZ2Vcbn0pO1xua28uY29tcG9uZW50cy5yZWdpc3RlcihcInN2LXByb2dyZXNzLWNvcnJlY3RRdWVzdGlvbnNcIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXM6IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9ncmVzc1ZpZXdNb2RlbChwYXJhbXMubW9kZWwpO1xuICAgIH1cbiAgfSxcbiAgdGVtcGxhdGU6IHRlbXBsYXRlQnJpZGdlXG59KTtcbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzdi1wcm9ncmVzcy1yZXF1aXJlZFF1ZXN0aW9uc1wiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtczogYW55KSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFByb2dyZXNzVmlld01vZGVsKHBhcmFtcy5tb2RlbCk7XG4gICAgfVxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGVCcmlkZ2Vcbn0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxkaXYgY2xhc3M9XFxcInN2LXNrZWxldG9uLWVsZW1lbnRcXFwiPlxcbjwvZGl2PlwiOyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgUmVuZGVyZXJGYWN0b3J5IH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5cbmNvbnN0IHRlbXBsYXRlID0gcmVxdWlyZShcIi4vc2tlbGV0b24uaHRtbFwiKTtcblxuZXhwb3J0IHZhciBTa2VsZXRvbjogYW55O1xuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3Ytc2tlbGV0b25cIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXM6IGFueSwgY29tcG9uZW50SW5mbzogYW55KSA9PiB7XG4gICAgICByZXR1cm4geyBxdWVzdGlvbjogcGFyYW1zLnF1ZXN0aW9uIH07XG4gICAgfSxcbiAgfSxcbiAgdGVtcGxhdGU6IHRlbXBsYXRlLFxufSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPCEtLSA8aW5wdXQgY2xhc3M9XFxcInN2LXN0cmluZy1lZGl0b3JcXFwiIGRhdGEtYmluZD1cXFwidmFsdWU6IGVkaXRWYWx1ZVxcXCIgLz4gLS0+XFxuXFxuPCEtLSBrbyBpZm5vdDoga29IYXNIdG1sIC0tPlxcbjxzcGFuIGNsYXNzPVxcXCJzdi1zdHJpbmctZWRpdG9yXFxcIiBzdHlsZT1cXFwicG9zaXRpb246IHN0YXRpYztcXFwiIGRhdGEtYmluZD1cXFwidGV4dDogZWRpdFZhbHVlLCBldmVudDogeyBibHVyOiBvbklucHV0LCBjbGljazogb25DbGljaywgY2xpY2tCdWJibGU6IGZhbHNlIH1cXFwiIGNvbnRlbnRlZGl0YWJsZT1cXFwidHJ1ZVxcXCI+PC9zcGFuPlxcbjwhLS0gL2tvIC0tPlxcbjwhLS0ga28gaWY6IGtvSGFzSHRtbCAtLT5cXG48c3BhbiBjbGFzcz1cXFwic3Ytc3RyaW5nLWVkaXRvclxcXCIgc3R5bGU9XFxcInBvc2l0aW9uOiBzdGF0aWM7XFxcIiBkYXRhLWJpbmQ9XFxcImh0bWw6IGVkaXRWYWx1ZSwgZXZlbnQ6IHsgYmx1cjogb25JbnB1dCwgY2xpY2s6IG9uQ2xpY2ssIGNsaWNrQnViYmxlOiBmYWxzZSB9XFxcIiBjb250ZW50ZWRpdGFibGU9XFxcInRydWVcXFwiPjwvc3Bhbj5cXG48IS0tIC9rbyAtLT5cIjsiLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5jb25zdCB0ZW1wbGF0ZSA9IHJlcXVpcmUoXCIuL3N0cmluZy1lZGl0b3IuaHRtbFwiKTtcblxuZXhwb3J0IGNsYXNzIFN0cmluZ0VkaXRvclZpZXdNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBsb2NTdHJpbmc6IGFueSkge31cbiAgZ2V0IGtvSGFzSHRtbCgpIHtcbiAgICByZXR1cm4gdGhpcy5sb2NTdHJpbmcua29IYXNIdG1sKCk7XG4gIH1cbiAgZ2V0IGVkaXRWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5sb2NTdHJpbmcua29SZW5kZXJlZEh0bWwoKTtcbiAgfVxuICBzZXQgZWRpdFZhbHVlKHZhbHVlKSB7XG4gICAgdGhpcy5sb2NTdHJpbmcuc2VhcmNoRWxlbWVudCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmxvY1N0cmluZy50ZXh0ID0gdmFsdWU7XG4gIH1cbiAgb25JbnB1dChzZW5kZXI6IFN0cmluZ0VkaXRvclZpZXdNb2RlbCwgZXZlbnQ6IGFueSkge1xuICAgIHNlbmRlci5lZGl0VmFsdWUgPSBldmVudC50YXJnZXQuaW5uZXJUZXh0O1xuICB9XG4gIG9uQ2xpY2soc2VuZGVyOiBTdHJpbmdFZGl0b3JWaWV3TW9kZWwsIGV2ZW50OiBhbnkpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuICBkaXNwb3NlKCkge1xuICAgIHRoaXMubG9jU3RyaW5nLm9uU2VhcmNoQ2hhbmdlZCA9IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRTZWFyY2hFbGVtZW50KGVsZW1lbnQ6IGFueSk6IGFueSB7XG4gIHdoaWxlICghIWVsZW1lbnQgJiYgZWxlbWVudC5ub2RlTmFtZSAhPT0gXCJTUEFOXCIpIHtcbiAgICB2YXIgZWxlbWVudHMgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcbiAgICAgIFwic3Ytc3RyaW5nLWVkaXRvclwiXG4gICAgKTtcbiAgICBlbGVtZW50ID0gZWxlbWVudHMubGVuZ3RoID4gMCA/IGVsZW1lbnRzWzBdIDogdW5kZWZpbmVkO1xuICB9XG4gIGlmICghIWVsZW1lbnQgJiYgZWxlbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHJldHVybiBlbGVtZW50O1xuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVzZXRMb2NhbGl6YXRpb25TcGFuKGVsZW1lbnQ6IGFueSwgbG9jU3RyOiBhbnkpIHtcbiAgd2hpbGUgKGVsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGggPiAxKSB7XG4gICAgZWxlbWVudC5yZW1vdmVDaGlsZChlbGVtZW50LmNoaWxkTm9kZXNbMV0pO1xuICB9XG4gIGVsZW1lbnQuY2hpbGROb2Rlc1swXS50ZXh0Q29udGVudCA9IGxvY1N0ci5yZW5kZXJlZEh0bWw7XG59XG5cbmZ1bmN0aW9uIGFwcGx5TG9jU3RyT25TZWFyY2hDaGFuZ2VkKGVsZW1lbnQ6IGFueSwgbG9jU3RyOiBhbnkpIHtcbiAgbG9jU3RyLm9uU2VhcmNoQ2hhbmdlZCA9ICgpID0+IHtcbiAgICBpZiAobG9jU3RyLnNlYXJjaEVsZW1lbnQgPT0gdW5kZWZpbmVkKSB7XG4gICAgICBsb2NTdHIuc2VhcmNoRWxlbWVudCA9IGdldFNlYXJjaEVsZW1lbnQoZWxlbWVudCk7XG4gICAgfVxuICAgIGlmIChsb2NTdHIuc2VhcmNoRWxlbWVudCA9PSBudWxsKSByZXR1cm47XG4gICAgY29uc3QgZWwgPSBsb2NTdHIuc2VhcmNoRWxlbWVudDtcbiAgICBpZiAoIWxvY1N0ci5oaWdobGlnaHREaXYpIHtcbiAgICAgIGxvY1N0ci5oaWdobGlnaHREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgIGxvY1N0ci5oaWdobGlnaHREaXYuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gXCJsaWdodGdyYXlcIjtcbiAgICB9XG4gICAgaWYgKGxvY1N0ci5zZWFyY2hJbmRleCAhPSB1bmRlZmluZWQpIHtcbiAgICAgIHJlc2V0TG9jYWxpemF0aW9uU3BhbihlbCwgbG9jU3RyKTtcbiAgICAgIGNvbnN0IHJuZzogUmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgcm5nLnNldFN0YXJ0KGVsLmNoaWxkTm9kZXNbMF0sIGxvY1N0ci5zZWFyY2hJbmRleCk7XG4gICAgICBybmcuc2V0RW5kKFxuICAgICAgICBlbC5jaGlsZE5vZGVzWzBdLFxuICAgICAgICBsb2NTdHIuc2VhcmNoSW5kZXggKyBsb2NTdHIuc2VhcmNoVGV4dC5sZW5ndGhcbiAgICAgICk7XG4gICAgICBybmcuc3Vycm91bmRDb250ZW50cyhsb2NTdHIuaGlnaGxpZ2h0RGl2KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzZXRMb2NhbGl6YXRpb25TcGFuKGVsLCBsb2NTdHIpO1xuICAgICAgbG9jU3RyLnNlYXJjaEVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9O1xufVxuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKExvY2FsaXphYmxlU3RyaW5nLmVkaXRhYmxlUmVuZGVyZXIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiAocGFyYW1zOiBhbnksIGNvbXBvbmVudEluZm86IGFueSkgPT4ge1xuICAgICAgY29uc3QgbG9jU3RyID0gcGFyYW1zLmxvY1N0cmluZztcbiAgICAgIGFwcGx5TG9jU3RyT25TZWFyY2hDaGFuZ2VkKGNvbXBvbmVudEluZm8uZWxlbWVudCwgbG9jU3RyKTtcbiAgICAgIHJldHVybiBuZXcgU3RyaW5nRWRpdG9yVmlld01vZGVsKGxvY1N0cik7XG4gICAgfSxcbiAgfSxcbiAgdGVtcGxhdGU6IHRlbXBsYXRlXG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8IS0tIGtvIGlmbm90OiBrb0hhc0h0bWwgLS0+XFxuPHNwYW4gY2xhc3M9XFxcInN2LXN0cmluZy12aWV3ZXJcXFwiIHN0eWxlPVxcXCJwb3NpdGlvbjogc3RhdGljO1xcXCIgZGF0YS1iaW5kPVxcXCJ0ZXh0OiBrb1JlbmRlcmVkSHRtbFxcXCI+PC9zcGFuPlxcbjwhLS0gL2tvIC0tPlxcbjwhLS0ga28gaWY6IGtvSGFzSHRtbCAtLT5cXG48c3BhbiBjbGFzcz1cXFwic3Ytc3RyaW5nLXZpZXdlclxcXCIgc3R5bGU9XFxcInBvc2l0aW9uOiBzdGF0aWM7XFxcIiBkYXRhLWJpbmQ9XFxcImh0bWw6IGtvUmVuZGVyZWRIdG1sXFxcIj48L3NwYW4+XFxuPCEtLSAva28gLS0+XCI7IiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5jb25zdCB0ZW1wbGF0ZSA9IHJlcXVpcmUoXCIuL3N0cmluZy12aWV3ZXIuaHRtbFwiKTtcbmV4cG9ydCB2YXIgU3RyaW5nVmlld2VyVmlld01vZGVsOiBhbnk7XG5cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzdi1zdHJpbmctdmlld2VyXCIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiAocGFyYW1zOiBhbnksIGNvbXBvbmVudEluZm86IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIHBhcmFtcy5sb2NTdHJpbmc7XG4gICAgfSxcbiAgfSxcbiAgdGVtcGxhdGU6IHRlbXBsYXRlXG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8c3ZnIGNsYXNzPVxcXCJzdi1zdmctaWNvblxcXCIgcm9sZT1cXFwiaW1nXFxcIj48dXNlPjwvdXNlPjwvc3ZnPlxcblwiOyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgY3JlYXRlU3ZnIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5jb25zdCB0ZW1wbGF0ZSA9IHJlcXVpcmUoXCIuL3N2Zy1pY29uLmh0bWxcIik7XG5cbmV4cG9ydCB2YXIgU3ZnSWNvblZpZXdNb2RlbDogYW55O1xuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3Ytc3ZnLWljb25cIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXM6IGFueSwgY29tcG9uZW50SW5mbzogYW55KSA9PiB7XG4gICAgICBrby5jb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNyZWF0ZVN2ZyhcbiAgICAgICAgICBrby51bndyYXAocGFyYW1zLnNpemUpLFxuICAgICAgICAgIGtvLnVud3JhcChwYXJhbXMud2lkdGgpLFxuICAgICAgICAgIGtvLnVud3JhcChwYXJhbXMuaGVpZ2h0KSxcbiAgICAgICAgICBrby51bndyYXAocGFyYW1zLmljb25OYW1lKSxcbiAgICAgICAgICBjb21wb25lbnRJbmZvLmVsZW1lbnQuY2hpbGROb2Rlc1swXVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSxcbiAgfSxcbiAgdGVtcGxhdGU6IHRlbXBsYXRlLFxufSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPCEtLSBrbyBpZjogdGVtcGxhdGVEYXRhLm5hbWUgLS0+XFxuICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6IHRlbXBsYXRlRGF0YS5uYW1lLCBkYXRhOiB0ZW1wbGF0ZURhdGEuZGF0YSwgYWZ0ZXJSZW5kZXI6IHRlbXBsYXRlRGF0YS5hZnRlclJlbmRlciB9IC0tPlxcbiAgPCEtLSAva28gLS0+XFxuPCEtLSAva28gLS0+XFxuPCEtLSBrbyBpZm5vdDogdGVtcGxhdGVEYXRhLm5hbWUgLS0+XFxuICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5vZGVzOiB0ZW1wbGF0ZURhdGEubm9kZXMgfHwgJGNvbXBvbmVudFRlbXBsYXRlTm9kZXMsIGRhdGE6IHRlbXBsYXRlRGF0YS5kYXRhLCBhZnRlclJlbmRlcjogdGVtcGxhdGVEYXRhLmFmdGVyUmVuZGVyIH0gLS0+XFxuICA8IS0tIC9rbyAtLT5cXG48IS0tIC9rbyAtLT5cXG5cIjsiLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFN1cnZleU1vZGVsIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBTdXJ2ZXlUZW1wbGF0ZVJlbmRlcmVyVmlld01vZGVsIH0gZnJvbSBcIi4uLy4uLy4uL3RlbXBsYXRlLXJlbmRlcmVyXCI7XG5cbmNvbnN0IHRlbXBsYXRlID0gcmVxdWlyZShcIi4vdGVtcGxhdGUtcmVuZGVyZXIuaHRtbFwiKTtcblxua28uY29tcG9uZW50cy5yZWdpc3RlcihTdXJ2ZXlNb2RlbC5UZW1wbGF0ZVJlbmRlcmVyQ29tcG9uZW50TmFtZSwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXM6IFN1cnZleVRlbXBsYXRlUmVuZGVyZXJWaWV3TW9kZWwpID0+IHtcbiAgICAgIHJldHVybiBwYXJhbXM7XG4gICAgfSxcbiAgfSxcbiAgdGVtcGxhdGU6IHRlbXBsYXRlLFxufSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPCEtLSBrbyBjb21wb25lbnQ6IHsgbmFtZTogJ3N1cnZleS1lbGVtZW50LXRpdGxlLWNvbnRlbnQnLCBwYXJhbXM6IHsgZWxlbWVudDogZWxlbWVudCB9IH0gLS0+PCEtLS9rby0tPlxcbjwhLS0ga28gaWY6IGVsZW1lbnQuaXNDb2xsYXBzZWQgfHwgZWxlbWVudC5pc0V4cGFuZGVkIC0tPlxcbjxzcGFuXFxuICAgIGRhdGEtYmluZD1cXFwiY3NzOiBnZXRJY29uQ3NzKCksIGF0dHI6IHsgJ2FyaWEtZXhwYW5kZWQnOiBlbGVtZW50LmlzQ29sbGFwc2VkID8gJ2ZhbHNlJyA6ICd0cnVlJyB9XFxcIlxcbiAgICB0YWJpbmRleD1cXFwiMFxcXCI+XFxuPC9zcGFuPlxcbjwhLS0gL2tvIC0tPlwiOyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgUmVuZGVyZXJGYWN0b3J5LCBEZWZhdWx0VGl0bGVNb2RlbCwgUXVlc3Rpb24gfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFBhbmVsIH0gZnJvbSBcIi4uLy4uL2tvcGFnZVwiO1xuXG5jb25zdCB0ZW1wbGF0ZSA9IHJlcXVpcmUoXCIuL2RlZmF1bHQtdGl0bGUuaHRtbFwiKTtcblxuZXhwb3J0IGNsYXNzIERlZmF1bHRUaXRsZVZpZXdNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OiBRdWVzdGlvbiB8IFBhbmVsKSB7fVxuXG4gIGdldEljb25Dc3MoKSB7XG4gICAgY29uc3QgY3NzQ2xhc3NlcyA9IHRoaXMuZWxlbWVudC5pc1BhbmVsID8gdGhpcy5lbGVtZW50LmNzc0NsYXNzZXMucGFuZWwgOiB0aGlzLmVsZW1lbnQuY3NzQ2xhc3NlcztcbiAgICByZXR1cm4gRGVmYXVsdFRpdGxlTW9kZWwuZ2V0SWNvbkNzcyhjc3NDbGFzc2VzLCB0aGlzLmVsZW1lbnQuaXNDb2xsYXBzZWQpO1xuICB9XG59XG5cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzdi1kZWZhdWx0LXRpdGxlXCIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiAocGFyYW1zOiBhbnksIGNvbXBvbmVudEluZm86IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0VGl0bGVWaWV3TW9kZWwocGFyYW1zLmVsZW1lbnQpO1xuICAgIH0sXG4gIH0sXG4gIHRlbXBsYXRlOiB0ZW1wbGF0ZVxufSk7XG5cblJlbmRlcmVyRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclJlbmRlcmVyKFxuICBcImVsZW1lbnRcIixcbiAgXCJkZWZhdWx0LXRpdGxlXCIsXG4gIFwic3YtZGVmYXVsdC10aXRsZVwiXG4pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjwhLS0ga28gaWZub3Q6IGVsZW1lbnQuaGFzVGl0bGVBY3Rpb25zIC0tPlxcbiAgPCEtLSBrbyBjb21wb25lbnQ6IHsgbmFtZTogJ3N1cnZleS1lbGVtZW50LXRpdGxlLWNvbnRlbnQnLCBwYXJhbXM6IHtlbGVtZW50OiBlbGVtZW50IH0gfSAtLT48IS0tIC9rbyAtLT5cXG48IS0tIC9rbyAtLT5cXG48IS0tIGtvIGlmOiBlbGVtZW50Lmhhc1RpdGxlQWN0aW9ucyAtLT5cXG48ZGl2IGNsYXNzPVxcXCJzdi10aXRsZS1hY3Rpb25zXFxcIj5cXG4gIDxzcGFuIGNsYXNzPVxcXCJzdi10aXRsZS1hY3Rpb25zX190aXRsZVxcXCI+XFxuICAgIDwhLS0ga28gY29tcG9uZW50OiB7IG5hbWU6ICdzdXJ2ZXktZWxlbWVudC10aXRsZS1jb250ZW50JywgcGFyYW1zOiB7ZWxlbWVudDogZWxlbWVudCB9IH0gLS0+PCEtLSAva28gLS0+XFxuICA8L3NwYW4+XFxuICA8IS0tIGtvIGNvbXBvbmVudDogeyBuYW1lOiAnc3YtYWN0aW9uLWJhcicsIHBhcmFtczogeyBtb2RlbDogdG9vbGJhciB9IH0gLS0+XFxuICA8IS0tIC9rbyAtLT5cXG48L2Rpdj5cXG48IS0tIC9rbyAtLT5cIjsiLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IElTdXJ2ZXlFbGVtZW50IH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBSZW5kZXJlckZhY3RvcnkgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcblxuY29uc3QgdGVtcGxhdGUgPSByZXF1aXJlKFwiLi90aXRsZS1hY3Rpb25zLmh0bWxcIik7XG5cbmV4cG9ydCB2YXIgVGl0bGVBY3Rpb25WaWV3TW9kZWw6IGFueTtcblxua28uY29tcG9uZW50cy5yZWdpc3RlcihcInN2LXRpdGxlLWFjdGlvbnNcIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXM6IGFueSwgY29tcG9uZW50SW5mbzogYW55KSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50OiBJU3VydmV5RWxlbWVudCA9IHBhcmFtcy5lbGVtZW50O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZWxlbWVudDogZWxlbWVudCxcbiAgICAgICAgdG9vbGJhcjogZWxlbWVudC5nZXRUaXRsZVRvb2xiYXIoKSxcbiAgICAgIH07XG4gICAgfSxcbiAgfSxcbiAgdGVtcGxhdGU6IHRlbXBsYXRlLFxufSk7XG5cblJlbmRlcmVyRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclJlbmRlcmVyKFxuICBcImVsZW1lbnRcIixcbiAgXCJ0aXRsZS1hY3Rpb25zXCIsXG4gIFwic3YtdGl0bGUtYWN0aW9uc1wiXG4pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjwhLS0ga28gaWZub3Q6IGVsZW1lbnQuaXNUaXRsZU93bmVyIC0tPlxcbiAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IGVsZW1lbnQubG9jVGl0bGUgfSAtLT48IS0tIC9rbyAtLT5cXG48IS0tIC9rbyAtLT5cXG48IS0tIGtvIGlmOiBlbGVtZW50LmlzVGl0bGVPd25lciAtLT5cXG4gIDwhLS0ga28gaWY6IGVsZW1lbnQuaXNSZXF1aXJlVGV4dE9uU3RhcnQgLS0+XFxuICA8c3BhblxcbiAgICBkYXRhLWJpbmQ9XFxcImNzczogZWxlbWVudC5rb0NzcygpLnJlcXVpcmVkVGV4dCB8fCAoZWxlbWVudC5rb0NzcygpLnBhbmVsICYmIGVsZW1lbnQua29Dc3MoKS5wYW5lbC5yZXF1aXJlZFRleHQpLCB0ZXh0OiBlbGVtZW50LnJlcXVpcmVkVGV4dCwgYXR0cjogeyAnYXJpYS1oaWRkZW4nOiB0cnVlIH1cXFwiXFxuICA+PC9zcGFuPlxcbiAgPCEtLSAva28gLS0+XFxuICA8IS0tIGtvIGlmOiBlbGVtZW50Lm5vIC0tPlxcbiAgPHNwYW5cXG4gICAgc3R5bGU9XFxcInBvc2l0aW9uOiBzdGF0aWM7XFxcIlxcbiAgICBkYXRhLWJpbmQ9XFxcImNzczogZWxlbWVudC5rb0NzcygpLm51bWJlciwgdGV4dDogZWxlbWVudC5ubywgYXR0cjogeyAnYXJpYS1oaWRkZW4nOiB0cnVlIH1cXFwiXFxuICA+PC9zcGFuPlxcbiAgPHNwYW4+Jm5ic3A8L3NwYW4+XFxuICA8IS0tIC9rbyAtLT5cXG4gIDwhLS0ga28gaWY6IGVsZW1lbnQuaXNSZXF1aXJlVGV4dEJlZm9yZVRpdGxlIC0tPlxcbiAgPHNwYW5cXG4gICAgZGF0YS1iaW5kPVxcXCJjc3M6IGVsZW1lbnQua29Dc3MoKS5yZXF1aXJlZFRleHQgfHwgKGVsZW1lbnQua29Dc3MoKS5wYW5lbCAmJiBlbGVtZW50LmtvQ3NzKCkucGFuZWwucmVxdWlyZWRUZXh0KSwgdGV4dDogZWxlbWVudC5yZXF1aXJlZFRleHQsIGF0dHI6IHsgJ2FyaWEtaGlkZGVuJzogdHJ1ZSB9XFxcIlxcbiAgPjwvc3Bhbj5cXG4gIDxzcGFuPiZuYnNwPC9zcGFuPlxcbiAgPCEtLSAva28gLS0+XFxuICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogZWxlbWVudC5sb2NUaXRsZSB9IC0tPjwhLS0gL2tvIC0tPlxcbiAgPCEtLSBrbyBpZjogZWxlbWVudC5pc1JlcXVpcmVUZXh0QWZ0ZXJUaXRsZSAtLT5cXG4gIDxzcGFuPiZuYnNwPC9zcGFuPlxcbiAgPHNwYW5cXG4gICAgZGF0YS1iaW5kPVxcXCJjc3M6IGVsZW1lbnQua29Dc3MoKS5yZXF1aXJlZFRleHQgfHwgKGVsZW1lbnQua29Dc3MoKS5wYW5lbCAmJiBlbGVtZW50LmtvQ3NzKCkucGFuZWwucmVxdWlyZWRUZXh0KSwgdGV4dDogZWxlbWVudC5yZXF1aXJlZFRleHQsIGF0dHI6IHsgJ2FyaWEtaGlkZGVuJzogdHJ1ZSB9XFxcIlxcbiAgPjwvc3Bhbj5cXG4gIDwhLS0gL2tvIC0tPlxcbjwhLS0gL2tvIC0tPlwiOyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgSVN1cnZleUVsZW1lbnQgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcblxuY29uc3QgdGVtcGxhdGUgPSByZXF1aXJlKFwiLi90aXRsZS1jb250ZW50Lmh0bWxcIik7XG5cbmV4cG9ydCB2YXIgVGl0bGVDb250ZW50Vmlld01vZGVsOiBhbnk7XG5cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzdXJ2ZXktZWxlbWVudC10aXRsZS1jb250ZW50XCIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiAocGFyYW1zOiBhbnksIGNvbXBvbmVudEluZm86IGFueSkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudDogSVN1cnZleUVsZW1lbnQgPSBwYXJhbXMuZWxlbWVudDtcbiAgICAgIHJldHVybiB7IGVsZW1lbnQ6IGVsZW1lbnQgfTtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGUsXG59KTtcblxuIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlFbGVtZW50Q29yZSB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuXG5leHBvcnQgdmFyIFRpdGxlRWxlbWVudFZpZXdNb2RlbDogYW55O1xuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3VydmV5LWVsZW1lbnQtdGl0bGVcIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXM6IGFueSwgY29tcG9uZW50SW5mbzogYW55KSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50OiBTdXJ2ZXlFbGVtZW50Q29yZSA9IHBhcmFtcy5lbGVtZW50O1xuICAgICAgY29uc3Qgcm9vdEVsID0gY29tcG9uZW50SW5mby5lbGVtZW50O1xuICAgICAgY29uc3QgdGl0bGVFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZWxlbWVudC50aXRsZVRhZ05hbWUpO1xuICAgICAgY29uc3QgYXJpYUxhYmVsQXR0ciA9IGVsZW1lbnQuZ2V0VHlwZSgpID09PSBcInJhZGlvZ3JvdXBcIiA/IFwiXCIgOiBcIidhcmlhLWxhYmVsJzogZWxlbWVudC5sb2NUaXRsZS5yZW5kZXJlZEh0bWwsXCI7XG4gICAgICB0aXRsZUVsLnNldEF0dHJpYnV0ZShcImRhdGEtYmluZFwiLCBgY3NzOiBlbGVtZW50LmNzc1RpdGxlLCBhdHRyOiB7ICR7YXJpYUxhYmVsQXR0cn0gaWQ6IGVsZW1lbnQuYXJpYVRpdGxlSWQsIHRhYmluZGV4OiBlbGVtZW50LnRpdGxlVGFiSW5kZXgsICdhcmlhLWV4cGFuZGVkJzogZWxlbWVudC50aXRsZUFyaWFFeHBhbmRlZCB9LCBjbGljazogZnVuY3Rpb24oKSB7IGVsZW1lbnQudG9nZ2xlU3RhdGUoKX0sIGtleTJjbGlja31gKTtcbiAgICAgIHRpdGxlRWwuaW5uZXJIVE1MID0gXCI8IS0tIGtvIGNvbXBvbmVudDogeyBuYW1lOiAnc3YtdGl0bGUtYWN0aW9ucycsIHBhcmFtczoge2VsZW1lbnQ6IGVsZW1lbnQgfSB9IC0tPjwhLS0gL2tvIC0tPlwiO1xuICAgICAgY29uc3QgZHVtbXlOb2RlID0gcm9vdEVsLm5leHRTaWJsaW5nO1xuICAgICAgcm9vdEVsLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoXCIga28gaWY6IGVsZW1lbnQuaGFzVGl0bGUgXCIpLCBkdW1teU5vZGUpO1xuICAgICAgcm9vdEVsLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRpdGxlRWwsIGR1bW15Tm9kZSk7XG4gICAgICByb290RWwucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZG9jdW1lbnQuY3JlYXRlQ29tbWVudChcIiAva28gXCIpLCBkdW1teU5vZGUpO1xuICAgICAgcm9vdEVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZHVtbXlOb2RlKTtcbiAgICAgIHJldHVybiB7IGVsZW1lbnQ6IGVsZW1lbnQgfTtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogXCI8c3Bhbj48L3NwYW4+XCIsXG59KTtcblxuIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlXaW5kb3dNb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgU3VydmV5TW9kZWwgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFN1cnZleSB9IGZyb20gXCIuL2tvc3VydmV5XCI7XG52YXIga29UZW1wbGF0ZSA9IHJlcXVpcmUoXCJodG1sLWxvYWRlcj9pbnRlcnBvbGF0ZSF2YWwtbG9hZGVyIS4vdGVtcGxhdGVzL3dpbmRvdy93aW5kb3cuaHRtbFwiKTtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVdpbmRvdyBleHRlbmRzIFN1cnZleVdpbmRvd01vZGVsIHtcbiAga29FeHBhbmRlZDogYW55O1xuICBrb0V4cGFuZGVkQ3NzOiBhbnk7XG4gIGRvRXhwYW5kOiBhbnk7XG4gIGNvbnN0cnVjdG9yKGpzb25PYmo6IGFueSA9IG51bGwsIGluaXRpYWxNb2RlbDogU3VydmV5TW9kZWwgPSBudWxsKSB7XG4gICAgc3VwZXIoanNvbk9iaiwgaW5pdGlhbE1vZGVsKTtcbiAgICB0aGlzLmtvRXhwYW5kZWQgPSBrby5vYnNlcnZhYmxlKGZhbHNlKTtcbiAgICB0aGlzLmtvRXhwYW5kZWRDc3MgPSBrby5vYnNlcnZhYmxlKHRoaXMuZ2V0QnV0dG9uQ3NzKCkpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmV4cGFuZGVkQ2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi5rb0V4cGFuZGVkKHNlbGYuaXNFeHBhbmRlZCk7XG4gICAgICBzZWxmLmtvRXhwYW5kZWRDc3Moc2VsZi5nZXRCdXR0b25Dc3MoKSk7XG4gICAgfTtcbiAgICB0aGlzLnNob3dpbmdDaGFuZ2VkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLmRvU2hvd2luZ0NoYW5nZWQoKTtcbiAgICB9O1xuICAgIHRoaXMuZG9FeHBhbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLmNoYW5nZUV4cGFuZGVkKCk7XG4gICAgfTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlU3VydmV5KGpzb25PYmo6IGFueSk6IFN1cnZleU1vZGVsIHtcbiAgICByZXR1cm4gbmV3IFN1cnZleShqc29uT2JqKTtcbiAgfVxuICBwcm90ZWN0ZWQgY2xvc2VXaW5kb3dPbkNvbXBsZXRlKCkge1xuICAgIHRoaXMuaGlkZSgpO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgdGVtcGxhdGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVZhbHVlID8gdGhpcy50ZW1wbGF0ZVZhbHVlIDogdGhpcy5nZXREZWZhdWx0VGVtcGxhdGUoKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0IHRlbXBsYXRlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnRlbXBsYXRlVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgZG9TaG93aW5nQ2hhbmdlZCgpIHtcbiAgICBpZiAodGhpcy5pc1Nob3dpbmcpIHtcbiAgICAgIHRoaXMud2luZG93RWxlbWVudC5pbm5lckhUTUwgPSB0aGlzLnRlbXBsYXRlO1xuICAgICAga28uY2xlYW5Ob2RlKHRoaXMud2luZG93RWxlbWVudCk7XG4gICAgICBrby5hcHBseUJpbmRpbmdzKHRoaXMsIHRoaXMud2luZG93RWxlbWVudCk7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMud2luZG93RWxlbWVudCk7XG4gICAgICAoPFN1cnZleT50aGlzLnN1cnZleSkucmVuZGVyKFN1cnZleVdpbmRvdy5zdXJ2ZXlFbGVtZW50TmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGhpcy53aW5kb3dFbGVtZW50KTtcbiAgICAgIHRoaXMud2luZG93RWxlbWVudC5pbm5lckhUTUwgPSBcIlwiO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGVmYXVsdFRlbXBsYXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGtvVGVtcGxhdGU7XG4gIH1cbiAgcHVibGljIGdldCBjc3MoKTogYW55IHtcbiAgICByZXR1cm4gKDxhbnk+dGhpcykuc3VydmV5W1wiY3NzXCJdO1xuICB9XG4gIHByaXZhdGUgY2hhbmdlRXhwYW5kZWQoKSB7XG4gICAgdGhpcy5leHBhbmRjb2xsYXBzZSghdGhpcy5pc0V4cGFuZGVkKTtcbiAgfVxuICBwcml2YXRlIGdldEJ1dHRvbkNzcygpIHtcbiAgICByZXR1cm4gdGhpcy5rb0V4cGFuZGVkKClcbiAgICAgID8gdGhpcy5jc3Mud2luZG93LmhlYWRlci5idXR0b25Db2xsYXBzZWRcbiAgICAgIDogdGhpcy5jc3Mud2luZG93LmhlYWRlci5idXR0b25FeHBhbmRlZDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBCYXNlIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5cbmV4cG9ydCBjbGFzcyBJbXBsZW1lbnRvckJhc2Uge1xuICBwcml2YXRlIHN0YXRpYyBkb0l0ZXJhdGVQcm9wZXJ0aWVzKGVsZW1lbnQ6IEJhc2UsIGhhc2g6IGFueSwga2V5OiBhbnkpOiBhbnkge1xuICAgIHZhciB2YWwgPSBoYXNoW2tleV07XG4gICAgaWYgKHZhbCA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm47XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgaGFzaFtrZXldID0ga28ub2JzZXJ2YWJsZUFycmF5KHZhbCk7XG4gICAgICAoPGFueT52YWwpW1wib25BcnJheUNoYW5nZWRcIl0gPSAoKSA9PiB7XG4gICAgICAgIGlmIChlbGVtZW50LmlzTG9hZGluZ0Zyb21Kc29uIHx8IGVsZW1lbnQuaXNEaXNwb3NlZCkgcmV0dXJuO1xuICAgICAgICBoYXNoW2tleV0ubm90aWZ5U3Vic2NyaWJlcnMoKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGhhc2hba2V5XSA9IGtvLm9ic2VydmFibGUodmFsKTtcbiAgICB9XG4gIH1cbiAgcmVhZG9ubHkgaW1wbGVtZW50ZWRNYXJrID0gXCJfX3N1cnZleUltcGxlbWVudGVkS29cIjtcbiAgY29uc3RydWN0b3IocHVibGljIGVsZW1lbnQ6IEJhc2UpIHtcbiAgICBpZiAoKDxhbnk+ZWxlbWVudClbdGhpcy5pbXBsZW1lbnRlZE1hcmtdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsZW1lbnQuaXRlcmF0ZVByb3BlcnRpZXNIYXNoKChoYXNoLCBrZXkpID0+IHtcbiAgICAgIEltcGxlbWVudG9yQmFzZS5kb0l0ZXJhdGVQcm9wZXJ0aWVzKGVsZW1lbnQsIGhhc2gsIGtleSk7XG4gICAgfSk7XG4gICAgZWxlbWVudC5jcmVhdGVBcnJheUNvcmVIYW5kbGVyID0gKGhhc2gsIGtleTogc3RyaW5nKTogQXJyYXk8YW55PiA9PiB7XG4gICAgICB2YXIgcmVzID0ga28ub2JzZXJ2YWJsZUFycmF5KCk7XG4gICAgICAoPGFueT5yZXMoKSlbXCJvbkFycmF5Q2hhbmdlZFwiXSA9ICgpID0+IHtcbiAgICAgICAgaWYgKGVsZW1lbnQuaXNMb2FkaW5nRnJvbUpzb24gfHwgZWxlbWVudC5pc0Rpc3Bvc2VkKSByZXR1cm47XG4gICAgICAgIHJlcy5ub3RpZnlTdWJzY3JpYmVycygpO1xuICAgICAgfTtcbiAgICAgIGhhc2hba2V5XSA9IHJlcztcblxuICAgICAgcmV0dXJuIHJlcygpO1xuICAgIH07XG4gICAgZWxlbWVudC5nZXRQcm9wZXJ0eVZhbHVlQ29yZUhhbmRsZXIgPSAoaGFzaCwga2V5KSA9PiB7XG4gICAgICBpZiAoaGFzaFtrZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGFzaFtrZXldID0ga28ub2JzZXJ2YWJsZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHR5cGVvZiBoYXNoW2tleV0gPT09IFwiZnVuY3Rpb25cIiA/IGhhc2hba2V5XSgpIDogaGFzaFtrZXldO1xuICAgIH07XG4gICAgZWxlbWVudC5zZXRQcm9wZXJ0eVZhbHVlQ29yZUhhbmRsZXIgPSAoaGFzaCwga2V5LCB2YWwpID0+IHtcbiAgICAgIGlmKGhhc2hba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmKGhhc2hba2V5XSgpID09PSB2YWwpIHtcbiAgICAgICAgICBoYXNoW2tleV0ubm90aWZ5U3Vic2NyaWJlcnMoKTtcbiAgICAgICAgfVxuICAgICAgICBoYXNoW2tleV0odmFsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIChoYXNoW2tleV0gPSBrby5vYnNlcnZhYmxlKHZhbCkpO1xuICAgICAgfVxuICAgIH07XG4gICAgKDxhbnk+ZWxlbWVudClbdGhpcy5pbXBsZW1lbnRlZE1hcmtdID0gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgZGlzcG9zZSgpIHtcbiAgICB0aGlzLmVsZW1lbnQuaXRlcmF0ZVByb3BlcnRpZXNIYXNoKChoYXNoLCBrZXkpID0+IHtcbiAgICAgIGhhc2hba2V5XSA9IGtvLnVud3JhcChoYXNoW2tleV0pO1xuICAgIH0pO1xuICAgIHRoaXMuZWxlbWVudC5jcmVhdGVBcnJheUNvcmVIYW5kbGVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZWxlbWVudC5nZXRQcm9wZXJ0eVZhbHVlQ29yZUhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5lbGVtZW50LnNldFByb3BlcnR5VmFsdWVDb3JlSGFuZGxlciA9IHVuZGVmaW5lZDtcbiAgICBkZWxldGUgKDxhbnk+dGhpcy5lbGVtZW50KVt0aGlzLmltcGxlbWVudGVkTWFya107XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgRmxvd1BhbmVsTW9kZWwgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBJbXBsZW1lbnRvckJhc2UgfSBmcm9tIFwiLi9rb2Jhc2VcIjtcbmltcG9ydCB7IFN1cnZleUVsZW1lbnQgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcblxuZXhwb3J0IGNsYXNzIEZsb3dQYW5lbCBleHRlbmRzIEZsb3dQYW5lbE1vZGVsIHtcbiAga29FbGVtZW50VHlwZTogYW55O1xuICBrb0VsZW1lbnRBZnRlclJlbmRlcjogYW55O1xuICBwbGFjZUhvbGRlcjogc3RyaW5nO1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcgPSBcIlwiKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5rb0VsZW1lbnRUeXBlID0ga28ub2JzZXJ2YWJsZShcInN1cnZleS1mbG93cGFuZWxcIik7XG4gICAgbmV3IEltcGxlbWVudG9yQmFzZSh0aGlzKTtcbiAgICB0aGlzLm9uQ3JlYXRpbmcoKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5rb0VsZW1lbnRBZnRlclJlbmRlciA9IGZ1bmN0aW9uIChlbDogYW55LCBjb246IGFueSkge1xuICAgICAgcmV0dXJuIHNlbGYuZWxlbWVudEFmdGVyUmVuZGVyKGVsLCBjb24pO1xuICAgIH07XG4gIH1cbiAgcHJvdGVjdGVkIG9uQ3JlYXRpbmcoKSB7fVxuICBwcm90ZWN0ZWQgZ2V0SHRtbEZvclF1ZXN0aW9uKHF1ZXN0aW9uOiBRdWVzdGlvbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIChcbiAgICAgICc8c3BhbiBxdWVzdGlvbj1cInRydWVcIiBjb250ZW50ZWRpdGFibGU9XCJmYWxzZVwiIGlkPVwiZmxvd3BhbmVsXycgK1xuICAgICAgcXVlc3Rpb24ubmFtZSArXG4gICAgICAnXCI+PCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiBcInN1cnZleS1mbG93cGFuZWwtcXVlc3Rpb25cIiwgZGF0YTogXCInICtcbiAgICAgIHF1ZXN0aW9uLm5hbWUgK1xuICAgICAgJ1wifSAtLT48IS0tIC9rbyAtLT48L3NwYW4+J1xuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBlbGVtZW50QWZ0ZXJSZW5kZXIoZWxlbWVudHM6IGFueSwgY29uOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuc3VydmV5KSByZXR1cm47XG4gICAgdmFyIGVsID0gU3VydmV5RWxlbWVudC5HZXRGaXJzdE5vblRleHRFbGVtZW50KGVsZW1lbnRzKTtcbiAgICBpZiAoISFlbCkge1xuICAgICAgdGhpcy5zdXJ2ZXkuYWZ0ZXJSZW5kZXJRdWVzdGlvbihjb24sIGVsKTtcbiAgICB9XG4gIH1cbn1cblxuU2VyaWFsaXplci5vdmVycmlkZUNsYXNzQ3JlYXRvcihcImZsb3dwYW5lbFwiLCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgRmxvd1BhbmVsKCk7XG59KTtcbi8qXG5FbGVtZW50RmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlckVsZW1lbnQoXCJmbG93cGFuZWxcIiwgbmFtZSA9PiB7XG4gIHJldHVybiBuZXcgRmxvd1BhbmVsKG5hbWUpO1xufSk7XG4qL1xua28uY29tcG9uZW50cy5yZWdpc3RlcihcImYtcGFuZWxcIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IGZ1bmN0aW9uIChwYXJhbXM6IGFueSwgY29tcG9uZW50SW5mbzogYW55KSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgcXVlc3Rpb24gPSBrby51bndyYXAocGFyYW1zLnF1ZXN0aW9uKTtcbiAgICAgIHNlbGYuZWxlbWVudCA9IGNvbXBvbmVudEluZm8uZWxlbWVudDtcbiAgICAgIHNlbGYuZWxlbWVudC5pbm5lckhUTUwgPSBxdWVzdGlvbi5odG1sO1xuICAgICAgc2VsZi5pc09uRm9jdXMgPSBmYWxzZTtcbiAgICAgIHNlbGYud2FzQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgc2VsZi5pc0NvbnRlbnRVcGRhdGluZyA9IGZhbHNlO1xuICAgICAgcXVlc3Rpb24uY29udGVudENoYW5nZWRDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHNlbGYuaXNDb250ZW50VXBkYXRpbmcpIHJldHVybjtcbiAgICAgICAga28uY2xlYW5Ob2RlKHNlbGYuZWxlbWVudCk7XG4gICAgICAgIHNlbGYuZWxlbWVudC5pbm5lckhUTUwgPSBxdWVzdGlvbi5odG1sO1xuICAgICAgICBrby5hcHBseUJpbmRpbmdzKHsgcXVlc3Rpb24gfSwgc2VsZi5lbGVtZW50KTtcbiAgICAgICAgISFrby50YXNrcyAmJiBrby50YXNrcy5ydW5FYXJseSgpO1xuICAgICAgfTtcbiAgICAgIHNlbGYuZWxlbWVudC5vbmZvY3VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLmlzT25Gb2N1cyA9IHRydWU7XG4gICAgICB9O1xuICAgICAgc2VsZi5lbGVtZW50Lm9uYmx1ciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHNlbGYud2FzQ2hhbmdlZCkgc2VsZi51cGRhdGVDb250ZW50KCk7XG4gICAgICAgIHNlbGYuaXNPbkZvY3VzID0gZmFsc2U7XG4gICAgICAgIHNlbGYud2FzQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgfTtcbiAgICAgIHNlbGYuZWxlbWVudC5vbmRyYWdlbmQgPSBmdW5jdGlvbiAoZXZlbnQ6IGFueSkge1xuICAgICAgICB2YXIgcmVnRXggPSAveyguKj8oZWxlbWVudDopW14kXS4qPyl9L2c7XG4gICAgICAgIHZhciBzdHIgPSBzZWxmLmVsZW1lbnQuaW5uZXJIVE1MO1xuICAgICAgICB2YXIgcmVzID0gcmVnRXguZXhlYyhzdHIpO1xuICAgICAgICBpZiAocmVzICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIHEgPSBxdWVzdGlvbi5nZXRRdWVzdGlvbkZyb21UZXh0KHJlc1swXSk7XG4gICAgICAgICAgaWYgKCEhcSkge1xuICAgICAgICAgICAgcXVlc3Rpb24uY29udGVudCA9IHNlbGYuZ2V0Q29udGVudChxLm5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHNlbGYudXBkYXRlQ29udGVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi5pc0NvbnRlbnRVcGRhdGluZyA9IHRydWU7XG4gICAgICAgIHF1ZXN0aW9uLmNvbnRlbnQgPSBzZWxmLmdldENvbnRlbnQoKTtcbiAgICAgICAgc2VsZi5pc0NvbnRlbnRVcGRhdGluZyA9IGZhbHNlO1xuICAgICAgfTtcbiAgICAgIHF1ZXN0aW9uLmdldENvbnRlbnQgPSBzZWxmLmdldENvbnRlbnQgPSBmdW5jdGlvbiAoZGVsZXRlZE5hbWU6IHN0cmluZykge1xuICAgICAgICB2YXIgY29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJESVZcIik7XG4gICAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gc2VsZi5lbGVtZW50LmlubmVySFRNTDtcbiAgICAgICAgdmFyIGNwcyA9IGNvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgnc3BhbltxdWVzdGlvbj1cInRydWVcIl0nKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgbmFtZSA9IGNwc1tpXS5pZC5yZXBsYWNlKFwiZmxvd3BhbmVsX1wiLCBcIlwiKTtcbiAgICAgICAgICB2YXIgaHRtbCA9IFwiXCI7XG4gICAgICAgICAgaWYgKG5hbWUgIT09IGRlbGV0ZWROYW1lKSB7XG4gICAgICAgICAgICB2YXIgZWwgPSBxdWVzdGlvbi5nZXRRdWVzdGlvbkJ5TmFtZShuYW1lKTtcbiAgICAgICAgICAgIGh0bWwgPSAhIWVsID8gcXVlc3Rpb24uZ2V0RWxlbWVudENvbnRlbnRUZXh0KGVsKSA6IFwiXCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNwc1tpXS5vdXRlckhUTUwgPSBodG1sO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250ZW50LmlubmVySFRNTDtcbiAgICAgIH07XG4gICAgICB2YXIgY29uZmlnID0ge1xuICAgICAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlLFxuICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgICAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgICAgIHN1YnRyZWU6IHRydWUsXG4gICAgICB9O1xuICAgICAgdmFyIGNhbGxiYWNrID0gZnVuY3Rpb24gKG11dGF0aW9uc0xpc3Q6IGFueSwgb2JzZXJ2ZXI6IGFueSkge1xuICAgICAgICBpZiAoIXNlbGYuaXNPbkZvY3VzKSByZXR1cm47XG4gICAgICAgIHNlbGYud2FzQ2hhbmdlZCA9IHRydWU7XG4gICAgICB9O1xuICAgICAgdmFyIG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spO1xuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShzZWxmLmVsZW1lbnQsIGNvbmZpZyk7XG4gICAgICByZXR1cm4geyBxdWVzdGlvbiB9O1xuICAgIH0sXG4gIH0sXG4gIHRlbXBsYXRlOiBcIjxkaXY+PC9kaXY+XCIsXG59KTtcbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgUGFnZU1vZGVsIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBQYW5lbE1vZGVsQmFzZSwgUGFuZWxNb2RlbCwgUXVlc3Rpb25Sb3dNb2RlbCwgUXVlc3Rpb24sIGRvS2V5MkNsaWNrVXAgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFN1cnZleUVsZW1lbnQsIElFbGVtZW50IH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBFbGVtZW50RmFjdG9yeSB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgSW1wbGVtZW50b3JCYXNlIH0gZnJvbSBcIi4va29iYXNlXCI7XG5pbXBvcnQgeyB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25Sb3cgZXh0ZW5kcyBRdWVzdGlvblJvd01vZGVsIHtcbiAga29FbGVtZW50QWZ0ZXJSZW5kZXI6IGFueTtcbiAgY29uc3RydWN0b3IocHVibGljIHBhbmVsOiBQYW5lbE1vZGVsQmFzZSkge1xuICAgIHN1cGVyKHBhbmVsKTtcbiAgICBuZXcgSW1wbGVtZW50b3JCYXNlKHRoaXMpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmtvRWxlbWVudEFmdGVyUmVuZGVyID0gZnVuY3Rpb24gKGVsOiBhbnksIGNvbjogYW55KSB7XG4gICAgICByZXR1cm4gc2VsZi5lbGVtZW50QWZ0ZXJSZW5kZXIoZWwsIGNvbik7XG4gICAgfTtcbiAgfVxuICBwdWJsaWMgZ2V0RWxlbWVudFR5cGUoZWw6IGFueSkge1xuICAgIHJldHVybiBlbC5pc1BhbmVsID8gXCJzdXJ2ZXktcGFuZWxcIiA6IFwic3VydmV5LXF1ZXN0aW9uXCI7XG4gIH1cbiAgcHVibGljIGtvQWZ0ZXJSZW5kZXIoZWw6IGFueSwgY29uOiBhbnkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdEVsID0gZWxbaV07XG4gICAgICB2YXIgbk5hbWUgPSB0RWwubm9kZU5hbWU7XG4gICAgICBpZiAobk5hbWUgPT0gXCIjdGV4dFwiKSB0RWwuZGF0YSA9IFwiXCI7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZWxlbWVudEFmdGVyUmVuZGVyKGVsZW1lbnRzOiBhbnksIGNvbjogYW55KSB7XG4gICAgaWYgKCF0aGlzLnBhbmVsIHx8ICF0aGlzLnBhbmVsLnN1cnZleSkgcmV0dXJuO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAhIWtvLnRhc2tzICYmIGtvLnRhc2tzLnJ1bkVhcmx5KCk7XG4gICAgICB2YXIgZWwgPSBTdXJ2ZXlFbGVtZW50LkdldEZpcnN0Tm9uVGV4dEVsZW1lbnQoZWxlbWVudHMpO1xuICAgICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgICAgdmFyIGVsZW1lbnQgPSA8SUVsZW1lbnQ+Y29uO1xuICAgICAgaWYgKGVsZW1lbnQuaXNQYW5lbCkge1xuICAgICAgICB0aGlzLnBhbmVsLnN1cnZleS5hZnRlclJlbmRlclBhbmVsKGNvbiwgZWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgKDxRdWVzdGlvbj5lbGVtZW50KS5hZnRlclJlbmRlcihlbCk7XG4gICAgICB9XG4gICAgfSwgMCk7XG4gIH1cblxuICByb3dBZnRlclJlbmRlcihlbGVtZW50czogSFRNTEVsZW1lbnRbXSwgbW9kZWw6IFF1ZXN0aW9uUm93KSB7XG4gICAgaWYgKCFtb2RlbC5pc05lZWRSZW5kZXIpIHtcbiAgICAgIHZhciByb3dDb250YWluZXJEaXYgPSBlbGVtZW50c1swXS5wYXJlbnRFbGVtZW50O1xuICAgICAgbW9kZWwuc3RhcnRMYXp5UmVuZGVyaW5nKHJvd0NvbnRhaW5lckRpdik7XG4gICAgICBrby51dGlscy5kb21Ob2RlRGlzcG9zYWwuYWRkRGlzcG9zZUNhbGxiYWNrKHJvd0NvbnRhaW5lckRpdiwgKCkgPT4ge1xuICAgICAgICBtb2RlbC5zdG9wTGF6eVJlbmRlcmluZygpO1xuICAgICAgICBtb2RlbC5pc05lZWRSZW5kZXIgPSAhbW9kZWwuaXNMYXp5UmVuZGVyaW5nKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGRpc3Bvc2UoKSB7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgIHRoaXMua29FbGVtZW50QWZ0ZXJSZW5kZXIgPSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBhbmVsSW1wbGVtZW50b3JCYXNlIGV4dGVuZHMgSW1wbGVtZW50b3JCYXNlIHtcbiAgY29uc3RydWN0b3IocHVibGljIHBhbmVsOiBQYW5lbE1vZGVsQmFzZSkge1xuICAgIHN1cGVyKHBhbmVsKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGFuZWwgZXh0ZW5kcyBQYW5lbE1vZGVsIHtcbiAgcHJpdmF0ZSBfaW1wbGVtZW50b3I6IEltcGxlbWVudG9yQmFzZTtcbiAga29FbGVtZW50VHlwZTogYW55O1xuICBrb0NzczogYW55O1xuICBrb0Vycm9yQ2xhc3M6IGFueTtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nID0gXCJcIikge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHRoaXMub25DcmVhdGluZygpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmtvRWxlbWVudFR5cGUgPSBrby5vYnNlcnZhYmxlKFwic3VydmV5LXBhbmVsXCIpO1xuICAgIHRoaXMua29Dc3MgPSBrby5wdXJlQ29tcHV0ZWQoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHNlbGYuY3NzQ2xhc3NlcztcbiAgICB9KTtcbiAgICB0aGlzLmtvRXJyb3JDbGFzcyA9IGtvLnB1cmVDb21wdXRlZChmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gc2VsZi5jc3NFcnJvcjtcbiAgICB9KTtcbiAgfVxuICBwcm90ZWN0ZWQgb25CYXNlQ3JlYXRpbmcoKSB7XG4gICAgc3VwZXIub25CYXNlQ3JlYXRpbmcoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvciA9IG5ldyBQYW5lbEltcGxlbWVudG9yQmFzZSh0aGlzKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlUm93KCk6IFF1ZXN0aW9uUm93TW9kZWwge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25Sb3codGhpcyk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQ3JlYXRpbmcoKSB7IH1cbiAgcHJvdGVjdGVkIG9uTnVtQ2hhbmdlZCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5sb2NUaXRsZS5vbkNoYW5nZWQoKTtcbiAgfVxuICBwdWJsaWMgZGlzcG9zZSgpIHtcbiAgICB0aGlzLmtvQ3NzLmRpc3Bvc2UoKTtcbiAgICB0aGlzLmtvRXJyb3JDbGFzcy5kaXNwb3NlKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IuZGlzcG9zZSgpO1xuICAgIHRoaXMuX2ltcGxlbWVudG9yID0gdW5kZWZpbmVkO1xuICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGFnZSBleHRlbmRzIFBhZ2VNb2RlbCB7XG4gIHByaXZhdGUgX2ltcGxlbWVudG9yOiBJbXBsZW1lbnRvckJhc2U7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZyA9IFwiXCIpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLm9uQ3JlYXRpbmcoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25CYXNlQ3JlYXRpbmcoKSB7XG4gICAgc3VwZXIub25CYXNlQ3JlYXRpbmcoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvciA9IG5ldyBJbXBsZW1lbnRvckJhc2UodGhpcyk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVJvdygpOiBRdWVzdGlvblJvd01vZGVsIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uUm93KHRoaXMpO1xuICB9XG4gIHByb3RlY3RlZCBvbkNyZWF0aW5nKCkgeyB9XG4gIHByb3RlY3RlZCBvbk51bUNoYW5nZWQodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMubG9jVGl0bGUub25DaGFuZ2VkKCk7XG4gIH1cbiAgcHVibGljIGRpc3Bvc2UoKSB7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgIHRoaXMuX2ltcGxlbWVudG9yLmRpc3Bvc2UoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvciA9IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5TZXJpYWxpemVyLm92ZXJyaWRlQ2xhc3NDcmVhdG9yKFwicGFuZWxcIiwgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV3IFBhbmVsKCk7XG59KTtcblNlcmlhbGl6ZXIub3ZlcnJpZGVDbGFzc0NyZWF0b3IoXCJwYWdlXCIsIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG5ldyBQYWdlKCk7XG59KTtcblxuRWxlbWVudEZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJFbGVtZW50KFwicGFuZWxcIiwgKG5hbWUpID0+IHtcbiAgcmV0dXJuIG5ldyBQYW5lbChuYW1lKTtcbn0pO1xuIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlFbGVtZW50LCBRdWVzdGlvbiwgSGVscGVycywgZG9LZXkyQ2xpY2tVcCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgSW1wbGVtZW50b3JCYXNlIH0gZnJvbSBcIi4va29iYXNlXCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkltcGxlbWVudG9yIGV4dGVuZHMgSW1wbGVtZW50b3JCYXNlIHtcbiAgcHJpdmF0ZSBkaXNwb3NlZE9iamVjdHM6IEFycmF5PHN0cmluZz47XG4gIHByaXZhdGUgY2FsbEJhY2tGdW5jdGlvbnM6IEFycmF5PHN0cmluZz47XG4gIHByaXZhdGUga29EdW1teTogYW55O1xuICBrb0VsZW1lbnRUeXBlOiBhbnk7XG4gIHByaXZhdGUgX2tvVmFsdWUgPSBrby5vYnNlcnZhYmxlQXJyYXk8YW55PigpO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcXVlc3Rpb246IFF1ZXN0aW9uKSB7XG4gICAgc3VwZXIocXVlc3Rpb24pO1xuICAgIHRoaXMuZGlzcG9zZWRPYmplY3RzID0gW107XG4gICAgdGhpcy5jYWxsQmFja0Z1bmN0aW9ucyA9IFtdO1xuICAgIHZhciBpc1N5bmNocm9uaXppbmcgPSBmYWxzZTtcbiAgICB0aGlzLl9rb1ZhbHVlLnN1YnNjcmliZSgobmV3VmFsdWUpID0+IHtcbiAgICAgIGlmICghaXNTeW5jaHJvbml6aW5nKSB7XG4gICAgICAgIHRoaXMucXVlc3Rpb24udmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLnF1ZXN0aW9uLCBcImtvVmFsdWVcIiwge1xuICAgICAgZ2V0OiAoKSA9PiB7XG4gICAgICAgIGlmICghSGVscGVycy5pc1R3b1ZhbHVlRXF1YWxzKHRoaXMuX2tvVmFsdWUoKSwgdGhpcy5nZXRLb1ZhbHVlKCksIGZhbHNlLCB0cnVlLCBmYWxzZSkpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaXNTeW5jaHJvbml6aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX2tvVmFsdWUodGhpcy5nZXRLb1ZhbHVlKCkpO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpc1N5bmNocm9uaXppbmcgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2tvVmFsdWU7XG4gICAgICB9LFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBxdWVzdGlvbi5zdXJ2ZXlMb2FkQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICB0aGlzLm9uU3VydmV5TG9hZCgpO1xuICAgIH07XG4gICAgdGhpcy5zZXRPYnNlcnZhbGVPYmooXG4gICAgICBcImtvVGVtcGxhdGVOYW1lXCIsXG4gICAgICBrby5wdXJlQ29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRUZW1wbGF0ZU5hbWUoKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnNldE9ic2VydmFsZU9iaihcImtvRWxlbWVudFR5cGVcIiwga28ub2JzZXJ2YWJsZShcInN1cnZleS1xdWVzdGlvblwiKSk7XG4gICAgdGhpcy5zZXRDYWxsYmFja0Z1bmMoXCJ1cGRhdGVRdWVzdGlvblwiLCAoKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZVF1ZXN0aW9uKCk7XG4gICAgfSk7XG4gICAgdGhpcy5zZXRPYnNlcnZhbGVPYmooXG4gICAgICBcImtvQ3NzXCIsXG4gICAgICBrby5wdXJlQ29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzO1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc2V0T2JzZXJ2YWxlT2JqKFxuICAgICAgXCJrb1Jvb3RDc3NcIixcbiAgICAgIGtvLnB1cmVDb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLmdldFJvb3RDc3MoKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnNldE9ic2VydmFsZU9iaihcbiAgICAgIFwia29FcnJvckNsYXNzXCIsXG4gICAgICBrby5wdXJlQ29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5jc3NFcnJvcjtcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLmtvRHVtbXkgPSBrby5vYnNlcnZhYmxlKDApO1xuICAgIHRoaXMuc2V0Q2FsbGJhY2tGdW5jKFwia29RdWVzdGlvbkFmdGVyUmVuZGVyXCIsIChlbDogYW55LCBjb246IGFueSkgPT4ge1xuICAgICAgdGhpcy5rb1F1ZXN0aW9uQWZ0ZXJSZW5kZXIoZWwsIGNvbik7XG4gICAgfSk7XG4gIH1cbiAgcHJvdGVjdGVkIHNldE9ic2VydmFsZU9iaihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgb2JqOiBhbnksXG4gICAgYWRkVG9RdWVzdGlvbjogYm9vbGVhbiA9IHRydWVcbiAgKSB7XG4gICAgdGhpcy5kaXNwb3NlZE9iamVjdHMucHVzaChuYW1lKTtcbiAgICBpZiAoYWRkVG9RdWVzdGlvbikge1xuICAgICAgdGhpcy5xdWVzdGlvbltuYW1lXSA9IG9iajtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0Q2FsbGJhY2tGdW5jKG5hbWU6IHN0cmluZywgZnVuYzogYW55KSB7XG4gICAgdGhpcy5jYWxsQmFja0Z1bmN0aW9ucy5wdXNoKG5hbWUpO1xuICAgIHRoaXMucXVlc3Rpb25bbmFtZV0gPSBmdW5jO1xuICB9XG4gIHByb3RlY3RlZCBnZXRLb1ZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLnZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCB1cGRhdGVRdWVzdGlvbigpIHtcbiAgICB0aGlzLnVwZGF0ZUtvRHVtbXkoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25TdXJ2ZXlMb2FkKCkge31cbiAgcHJvdGVjdGVkIGdldFF1ZXN0aW9uVGVtcGxhdGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5nZXRUZW1wbGF0ZSgpO1xuICB9XG4gIHByaXZhdGUgZ2V0VGVtcGxhdGVOYW1lKCk6IHN0cmluZyB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5xdWVzdGlvbi5jdXN0b21XaWRnZXQgJiZcbiAgICAgICF0aGlzLnF1ZXN0aW9uLmN1c3RvbVdpZGdldC53aWRnZXRKc29uLmlzRGVmYXVsdFJlbmRlclxuICAgIClcbiAgICAgIHJldHVybiBcInN1cnZleS13aWRnZXQtXCIgKyB0aGlzLnF1ZXN0aW9uLmN1c3RvbVdpZGdldC5uYW1lO1xuICAgIHJldHVybiBcInN1cnZleS1xdWVzdGlvbi1cIiArIHRoaXMuZ2V0UXVlc3Rpb25UZW1wbGF0ZSgpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRObygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLnZpc2libGVJbmRleCA+IC0xXG4gICAgICA/IHRoaXMucXVlc3Rpb24udmlzaWJsZUluZGV4ICsgMSArIFwiLiBcIlxuICAgICAgOiBcIlwiO1xuICB9XG4gIHByb3RlY3RlZCB1cGRhdGVLb0R1bW15KCkge1xuICAgIGlmICh0aGlzLnF1ZXN0aW9uLmlzRGlzcG9zZWQpIHJldHVybjtcbiAgICB0aGlzLmtvRHVtbXkodGhpcy5rb0R1bW15KCkgKyAxKTtcbiAgICB0aGlzLnF1ZXN0aW9uLmxvY1RpdGxlLm9uQ2hhbmdlZCgpO1xuICB9XG4gIHByb3RlY3RlZCBrb1F1ZXN0aW9uQWZ0ZXJSZW5kZXIoZWxlbWVudHM6IGFueSwgY29uOiBhbnkpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICEha28udGFza3MgJiYga28udGFza3MucnVuRWFybHkoKTtcbiAgICAgIHZhciBlbCA9IFN1cnZleUVsZW1lbnQuR2V0Rmlyc3ROb25UZXh0RWxlbWVudChlbGVtZW50cywgdHJ1ZSk7XG4gICAgICBpZiAoISFlbCkge1xuICAgICAgICB0aGlzLnF1ZXN0aW9uLmFmdGVyUmVuZGVyUXVlc3Rpb25FbGVtZW50KGVsKTtcbiAgICAgICAgaWYgKCEhdGhpcy5xdWVzdGlvbi5jdXN0b21XaWRnZXQpIHtcbiAgICAgICAgICB0aGlzLnF1ZXN0aW9uLmN1c3RvbVdpZGdldC5hZnRlclJlbmRlcih0aGlzLnF1ZXN0aW9uLCBlbCk7XG4gICAgICAgIH1cbiAgICAgICAga28udXRpbHMuZG9tTm9kZURpc3Bvc2FsLmFkZERpc3Bvc2VDYWxsYmFjayhlbCwgKCkgPT4ge1xuICAgICAgICAgIHRoaXMucXVlc3Rpb24uYmVmb3JlRGVzdHJveVF1ZXN0aW9uRWxlbWVudChlbCk7XG4gICAgICAgICAgaWYgKCEhdGhpcy5xdWVzdGlvbi5jdXN0b21XaWRnZXQpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24uY3VzdG9tV2lkZ2V0LndpbGxVbm1vdW50KHRoaXMucXVlc3Rpb24sIGVsKTtcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJDdXN0b20gd2lkZ2V0IHdpbGwgdW5tb3VudCBmYWlsZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LCAwKTtcbiAgfVxuICBwdWJsaWMgZGlzcG9zZSgpIHtcbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmRpc3Bvc2VkT2JqZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbmFtZSA9IHRoaXMuZGlzcG9zZWRPYmplY3RzW2ldO1xuICAgICAgY29uc3Qgb2JqID0gKDxhbnk+dGhpcylbbmFtZV0gfHwgdGhpcy5xdWVzdGlvbltuYW1lXTtcbiAgICAgIGlmICghb2JqKSBjb250aW51ZTtcbiAgICAgIGlmICgoPGFueT50aGlzKVtuYW1lXSkgKDxhbnk+dGhpcylbbmFtZV0gPSB1bmRlZmluZWQ7XG4gICAgICBpZiAodGhpcy5xdWVzdGlvbltuYW1lXSkgdGhpcy5xdWVzdGlvbltuYW1lXSA9IHVuZGVmaW5lZDtcbiAgICAgIGlmIChvYmpbXCJkaXNwb3NlXCJdKSBvYmouZGlzcG9zZSgpO1xuICAgIH1cbiAgICB0aGlzLmRpc3Bvc2VkT2JqZWN0cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jYWxsQmFja0Z1bmN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5xdWVzdGlvblt0aGlzLmNhbGxCYWNrRnVuY3Rpb25zW2ldXSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdGhpcy5jYWxsQmFja0Z1bmN0aW9ucyA9IFtdO1xuICAgIHRoaXMucXVlc3Rpb24udW5SZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcInZpc2libGVJbmRleFwiKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvblwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uU2VsZWN0QmFzZSB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25TZWxlY3RCYXNlSW1wbGVtZW50b3IgZXh0ZW5kcyBRdWVzdGlvbkltcGxlbWVudG9yIHtcbiAgcHJvdGVjdGVkIG9uQ3JlYXRlZCgpIHt9XG4gIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBRdWVzdGlvbikge1xuICAgIHN1cGVyKHF1ZXN0aW9uKTtcbiAgICB0aGlzLm9uQ3JlYXRlZCgpO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgaXNPdGhlclNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoPFF1ZXN0aW9uU2VsZWN0QmFzZT50aGlzLnF1ZXN0aW9uKS5pc090aGVyU2VsZWN0ZWQ7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkNoZWNrYm94QmFzZUltcGxlbWVudG9yIGV4dGVuZHMgUXVlc3Rpb25TZWxlY3RCYXNlSW1wbGVtZW50b3Ige1xuICBjb25zdHJ1Y3RvcihxdWVzdGlvbjogUXVlc3Rpb24pIHtcbiAgICBzdXBlcihxdWVzdGlvbik7XG4gICAgdGhpcy5zZXRDYWxsYmFja0Z1bmMoXCJrb0FmdGVyUmVuZGVyXCIsIHRoaXMua29BZnRlclJlbmRlcik7XG4gIH1cbiAgcHJpdmF0ZSBrb0FmdGVyUmVuZGVyKGVsOiBhbnksIGNvbjogYW55KSB7XG4gICAgdmFyIHRFbCA9IGVsWzBdO1xuICAgIGlmICh0RWwubm9kZU5hbWUgPT0gXCIjdGV4dFwiKSB0RWwuZGF0YSA9IFwiXCI7XG4gICAgdEVsID0gZWxbZWwubGVuZ3RoIC0gMV07XG4gICAgaWYgKHRFbC5ub2RlTmFtZSA9PSBcIiN0ZXh0XCIpIHRFbC5kYXRhID0gXCJcIjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgU2VyaWFsaXplciwgUXVlc3Rpb25GYWN0b3J5LCBRdWVzdGlvbkJvb2xlYW5Nb2RlbCwgQ3NzQ2xhc3NCdWlsZGVyIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvblwiO1xuaW1wb3J0IHsgZ2V0T3JpZ2luYWxFdmVudCB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uQm9vbGVhbiBleHRlbmRzIFF1ZXN0aW9uQm9vbGVhbk1vZGVsIHtcbiAgcHJpdmF0ZSBfaW1wbGVtZW50b3I6IFF1ZXN0aW9uSW1wbGVtZW50b3I7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICB9XG4gIHByb3RlY3RlZCBvbkJhc2VDcmVhdGluZygpIHtcbiAgICBzdXBlci5vbkJhc2VDcmVhdGluZygpO1xuICAgIHRoaXMuX2ltcGxlbWVudG9yID0gbmV3IFF1ZXN0aW9uSW1wbGVtZW50b3IodGhpcyk7XG4gIH1cbiAgcHVibGljIG9uU3dpdGNoQ2xpY2soZGF0YTogYW55LCBldmVudDogYW55KSB7XG4gICAgcmV0dXJuIHN1cGVyLm9uU3dpdGNoQ2xpY2tNb2RlbChnZXRPcmlnaW5hbEV2ZW50KGV2ZW50KSk7XG4gIH1cbiAgcHVibGljIG9uVHJ1ZUxhYmVsQ2xpY2soZGF0YTogYW55LCBldmVudDogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMub25MYWJlbENsaWNrKGV2ZW50LCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgb25GYWxzZUxhYmVsQ2xpY2soZGF0YTogYW55LCBldmVudDogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMub25MYWJlbENsaWNrKGV2ZW50LCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5faW1wbGVtZW50b3IuZGlzcG9zZSgpO1xuICAgIHRoaXMuX2ltcGxlbWVudG9yID0gdW5kZWZpbmVkO1xuICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgfVxufVxuU2VyaWFsaXplci5vdmVycmlkZUNsYXNzQ3JlYXRvcihcImJvb2xlYW5cIiwgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25Cb29sZWFuKFwiXCIpO1xufSk7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiYm9vbGVhblwiLCAobmFtZSkgPT4ge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uQm9vbGVhbihuYW1lKTtcbn0pO1xuIiwiaW1wb3J0IHsgUXVlc3Rpb25CdXR0b25Hcm91cE1vZGVsIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uQ2hlY2tib3hCYXNlSW1wbGVtZW50b3IgfSBmcm9tIFwiLi9rb3F1ZXN0aW9uX2Jhc2VzZWxlY3RcIjtcblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uQnV0dG9uR3JvdXAgZXh0ZW5kcyBRdWVzdGlvbkJ1dHRvbkdyb3VwTW9kZWwge1xuICBwcml2YXRlIF9pbXBsZW1lbnRvcjogUXVlc3Rpb25DaGVja2JveEJhc2VJbXBsZW1lbnRvcjtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQmFzZUNyZWF0aW5nKCkge1xuICAgIHN1cGVyLm9uQmFzZUNyZWF0aW5nKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSBuZXcgUXVlc3Rpb25DaGVja2JveEJhc2VJbXBsZW1lbnRvcih0aGlzKTtcbiAgfVxuICBwdWJsaWMgZGlzcG9zZSgpIHtcbiAgICB0aGlzLl9pbXBsZW1lbnRvci5kaXNwb3NlKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSB1bmRlZmluZWQ7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG59XG5cbi8vIFNlcmlhbGl6ZXIub3ZlcnJpZGVDbGFzc0NyZWF0b3IoXCJidXR0b25ncm91cFwiLCBmdW5jdGlvbigpIHtcbi8vICAgcmV0dXJuIG5ldyBRdWVzdGlvbkJ1dHRvbkdyb3VwKFwiXCIpO1xuLy8gfSk7XG5cbi8vIFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiYnV0dG9uZ3JvdXBcIiwgbmFtZSA9PiB7XG4vLyAgIHZhciBxID0gbmV3IFF1ZXN0aW9uQnV0dG9uR3JvdXAobmFtZSk7XG4vLyAgIHEuY2hvaWNlcyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Q2hvaWNlcztcbi8vICAgcmV0dXJuIHE7XG4vLyB9KTtcbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25DaGVja2JveEJhc2VJbXBsZW1lbnRvciB9IGZyb20gXCIuL2tvcXVlc3Rpb25fYmFzZXNlbGVjdFwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkNoZWNrYm94TW9kZWwgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkNoZWNrYm94SW1wbGVtZW50b3IgZXh0ZW5kcyBRdWVzdGlvbkNoZWNrYm94QmFzZUltcGxlbWVudG9yIHtcbiAgY29uc3RydWN0b3IocXVlc3Rpb246IFF1ZXN0aW9uKSB7XG4gICAgc3VwZXIocXVlc3Rpb24pO1xuICB9XG4gIHByb3RlY3RlZCBnZXRLb1ZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLnJlbmRlcmVkVmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uQ2hlY2tib3ggZXh0ZW5kcyBRdWVzdGlvbkNoZWNrYm94TW9kZWwge1xuICBrb0FsbFNlbGVjdGVkOiBhbnk7XG4gIHByaXZhdGUgaXNBbGxTZWxlY3RlZFVwZGF0aW5nID0gZmFsc2U7XG4gIHByaXZhdGUgX2ltcGxlbWVudG9yOiBRdWVzdGlvbkNoZWNrYm94SW1wbGVtZW50b3I7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHRoaXMua29BbGxTZWxlY3RlZCA9IGtvLm9ic2VydmFibGUodGhpcy5pc0FsbFNlbGVjdGVkKTtcbiAgICB0aGlzLmtvQWxsU2VsZWN0ZWQuc3Vic2NyaWJlKChuZXdWYWx1ZTogYW55KSA9PiB7XG4gICAgICBpZiAodGhpcy5pc0FsbFNlbGVjdGVkVXBkYXRpbmcpIHJldHVybjtcbiAgICAgIGlmIChuZXdWYWx1ZSkgdGhpcy5zZWxlY3RBbGwoKTtcbiAgICAgIGVsc2UgdGhpcy5jbGVhclZhbHVlKCk7XG4gICAgfSk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQmFzZUNyZWF0aW5nKCkge1xuICAgIHN1cGVyLm9uQmFzZUNyZWF0aW5nKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSBuZXcgUXVlc3Rpb25DaGVja2JveEltcGxlbWVudG9yKHRoaXMpO1xuICB9XG4gIHB1YmxpYyBvblN1cnZleVZhbHVlQ2hhbmdlZChuZXdWYWx1ZTogYW55KSB7XG4gICAgc3VwZXIub25TdXJ2ZXlWYWx1ZUNoYW5nZWQobmV3VmFsdWUpO1xuICAgIHRoaXMudXBkYXRlQWxsU2VsZWN0ZWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25WaXNpYmxlQ2hvaWNlc0NoYW5nZWQoKSB7XG4gICAgc3VwZXIub25WaXNpYmxlQ2hvaWNlc0NoYW5nZWQoKTtcbiAgICB0aGlzLnVwZGF0ZUFsbFNlbGVjdGVkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZUFsbFNlbGVjdGVkKCkge1xuICAgIHRoaXMuaXNBbGxTZWxlY3RlZFVwZGF0aW5nID0gdHJ1ZTtcbiAgICB0aGlzLmtvQWxsU2VsZWN0ZWQodGhpcy5pc0FsbFNlbGVjdGVkKTtcbiAgICB0aGlzLmlzQWxsU2VsZWN0ZWRVcGRhdGluZyA9IGZhbHNlO1xuICB9XG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIHRoaXMuX2ltcGxlbWVudG9yLmRpc3Bvc2UoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmtvQWxsU2VsZWN0ZWQgPSB1bmRlZmluZWQ7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG59XG5cblNlcmlhbGl6ZXIub3ZlcnJpZGVDbGFzc0NyZWF0b3IoXCJjaGVja2JveFwiLCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkNoZWNrYm94KFwiXCIpO1xufSk7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImNoZWNrYm94XCIsIG5hbWUgPT4ge1xuICB2YXIgcSA9IG5ldyBRdWVzdGlvbkNoZWNrYm94KG5hbWUpO1xuICBxLmNob2ljZXMgPSBRdWVzdGlvbkZhY3RvcnkuRGVmYXVsdENob2ljZXM7XG4gIHJldHVybiBxO1xufSk7XG4iLCJpbXBvcnQgeyB3cml0ZSB9IGZyb20gXCJmc1wiO1xuaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uQ29tbWVudE1vZGVsIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvblwiO1xuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25Db21tZW50IGV4dGVuZHMgUXVlc3Rpb25Db21tZW50TW9kZWwge1xuICBwcml2YXRlIF9pbXBsZW1lbnRvcjogUXVlc3Rpb25JbXBsZW1lbnRvcjtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQmFzZUNyZWF0aW5nKCk6IHZvaWQge1xuICAgIHN1cGVyLm9uQmFzZUNyZWF0aW5nKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSBuZXcgUXVlc3Rpb25JbXBsZW1lbnRvcih0aGlzKTtcbiAgfVxuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9pbXBsZW1lbnRvci5kaXNwb3NlKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSB1bmRlZmluZWQ7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG59XG5cblNlcmlhbGl6ZXIub3ZlcnJpZGVDbGFzc0NyZWF0b3IoXCJjb21tZW50XCIsIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkNvbW1lbnQoXCJcIik7XG59KTtcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiY29tbWVudFwiLCBuYW1lID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkNvbW1lbnQobmFtZSk7XG59KTtcbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHtcbiAgUXVlc3Rpb25DdXN0b21Nb2RlbCxcbiAgUXVlc3Rpb25Db21wb3NpdGVNb2RlbCxcbiAgQ29tcG9uZW50UXVlc3Rpb25KU09OLFxuICBDb21wb25lbnRDb2xsZWN0aW9uLFxufSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uSW1wbGVtZW50b3IgfSBmcm9tIFwiLi9rb3F1ZXN0aW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkN1c3RvbSBleHRlbmRzIFF1ZXN0aW9uQ3VzdG9tTW9kZWwge1xuICBwcml2YXRlIF9pbXBsZW1lbnRvcjogUXVlc3Rpb25JbXBsZW1lbnRvcjtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBxdWVzdGlvbkpTT046IENvbXBvbmVudFF1ZXN0aW9uSlNPTikge1xuICAgIHN1cGVyKG5hbWUsIHF1ZXN0aW9uSlNPTik7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQmFzZUNyZWF0aW5nKCkge1xuICAgIHN1cGVyLm9uQmFzZUNyZWF0aW5nKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSBuZXcgUXVlc3Rpb25JbXBsZW1lbnRvcih0aGlzKTtcbiAgfVxuICBwdWJsaWMgZGlzcG9zZSgpIHtcbiAgICB0aGlzLl9pbXBsZW1lbnRvci5kaXNwb3NlKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSB1bmRlZmluZWQ7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkNvbXBvc2l0ZSBleHRlbmRzIFF1ZXN0aW9uQ29tcG9zaXRlTW9kZWwge1xuICBwcml2YXRlIF9pbXBsZW1lbnRvcjogUXVlc3Rpb25JbXBsZW1lbnRvcjtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBxdWVzdGlvbkpTT046IENvbXBvbmVudFF1ZXN0aW9uSlNPTikge1xuICAgIHN1cGVyKG5hbWUsIHF1ZXN0aW9uSlNPTik7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQmFzZUNyZWF0aW5nKCkge1xuICAgIHN1cGVyLm9uQmFzZUNyZWF0aW5nKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSBuZXcgUXVlc3Rpb25JbXBsZW1lbnRvcih0aGlzKTtcbiAgfVxuICBwdWJsaWMgZGlzcG9zZSgpIHtcbiAgICB0aGlzLl9pbXBsZW1lbnRvci5kaXNwb3NlKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSB1bmRlZmluZWQ7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG59XG5cbkNvbXBvbmVudENvbGxlY3Rpb24uSW5zdGFuY2Uub25DcmVhdGVDdXN0b20gPSBmdW5jdGlvbihcbiAgbmFtZTogc3RyaW5nLFxuICBxdWVzdGlvbkpTT046IENvbXBvbmVudFF1ZXN0aW9uSlNPTlxuKSB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25DdXN0b20obmFtZSwgcXVlc3Rpb25KU09OKTtcbn07XG5cbkNvbXBvbmVudENvbGxlY3Rpb24uSW5zdGFuY2Uub25DcmVhdGVDb21wb3NpdGUgPSBmdW5jdGlvbihcbiAgbmFtZTogc3RyaW5nLFxuICBxdWVzdGlvbkpTT046IENvbXBvbmVudFF1ZXN0aW9uSlNPTlxuKSB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25Db21wb3NpdGUobmFtZSwgcXVlc3Rpb25KU09OKTtcbn07XG4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRHJvcGRvd25Nb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBRdWVzdGlvblNlbGVjdEJhc2VJbXBsZW1lbnRvciB9IGZyb20gXCIuL2tvcXVlc3Rpb25fYmFzZXNlbGVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcblxuY2xhc3MgUXVlc3Rpb25Ecm9wZG93bkltcGxlbWVudG9yIGV4dGVuZHMgUXVlc3Rpb25TZWxlY3RCYXNlSW1wbGVtZW50b3Ige1xuICBjb25zdHJ1Y3RvcihxdWVzdGlvbjogUXVlc3Rpb24pIHtcbiAgICBzdXBlcihxdWVzdGlvbik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uRHJvcGRvd24gZXh0ZW5kcyBRdWVzdGlvbkRyb3Bkb3duTW9kZWwge1xuICBwcml2YXRlIF9pbXBsZW1lbnRvcjogUXVlc3Rpb25Ecm9wZG93bkltcGxlbWVudG9yO1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25CYXNlQ3JlYXRpbmcoKSB7XG4gICAgc3VwZXIub25CYXNlQ3JlYXRpbmcoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvciA9IG5ldyBRdWVzdGlvbkRyb3Bkb3duSW1wbGVtZW50b3IodGhpcyk7XG4gIH1cbiAgcHVibGljIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5faW1wbGVtZW50b3IuZGlzcG9zZSgpO1xuICAgIHRoaXMuX2ltcGxlbWVudG9yID0gdW5kZWZpbmVkO1xuICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgfVxufVxuU2VyaWFsaXplci5vdmVycmlkZUNsYXNzQ3JlYXRvcihcImRyb3Bkb3duXCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uRHJvcGRvd24oXCJcIik7XG59KTtcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiZHJvcGRvd25cIiwgKG5hbWUpID0+IHtcbiAgdmFyIHEgPSBuZXcgUXVlc3Rpb25Ecm9wZG93bihuYW1lKTtcbiAgcS5jaG9pY2VzID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRDaG9pY2VzO1xuICByZXR1cm4gcTtcbn0pO1xuIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkVtcHR5TW9kZWwgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uSW1wbGVtZW50b3IgfSBmcm9tIFwiLi9rb3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25FbXB0eSBleHRlbmRzIFF1ZXN0aW9uRW1wdHlNb2RlbCB7XG4gIHByaXZhdGUgX2ltcGxlbWVudG9yOiBRdWVzdGlvbkltcGxlbWVudG9yO1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25CYXNlQ3JlYXRpbmcoKSB7XG4gICAgc3VwZXIub25CYXNlQ3JlYXRpbmcoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvciA9IG5ldyBRdWVzdGlvbkltcGxlbWVudG9yKHRoaXMpO1xuICB9XG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIHRoaXMuX2ltcGxlbWVudG9yLmRpc3Bvc2UoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvciA9IHVuZGVmaW5lZDtcbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gIH1cbn1cblxuU2VyaWFsaXplci5vdmVycmlkZUNsYXNzQ3JlYXRvcihcImVtcHR5XCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uRW1wdHkoXCJcIik7XG59KTtcbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25FeHByZXNzaW9uTW9kZWwgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25JbXBsZW1lbnRvciB9IGZyb20gXCIuL2tvcXVlc3Rpb25cIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkV4cHJlc3Npb24gZXh0ZW5kcyBRdWVzdGlvbkV4cHJlc3Npb25Nb2RlbCB7XG4gIHByaXZhdGUgX2ltcGxlbWVudG9yOiBRdWVzdGlvbkltcGxlbWVudG9yO1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25CYXNlQ3JlYXRpbmcoKSB7XG4gICAgc3VwZXIub25CYXNlQ3JlYXRpbmcoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvciA9IG5ldyBRdWVzdGlvbkltcGxlbWVudG9yKHRoaXMpO1xuICB9XG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIHRoaXMuX2ltcGxlbWVudG9yLmRpc3Bvc2UoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvciA9IHVuZGVmaW5lZDtcbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gIH1cbn1cblxuU2VyaWFsaXplci5vdmVycmlkZUNsYXNzQ3JlYXRvcihcImV4cHJlc3Npb25cIiwgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25FeHByZXNzaW9uKFwiXCIpO1xufSk7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImV4cHJlc3Npb25cIiwgbmFtZSA9PiB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25FeHByZXNzaW9uKG5hbWUpO1xufSk7XG4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIsXG4gIFF1ZXN0aW9uLFxuICBRdWVzdGlvbkZhY3RvcnksXG4gIFF1ZXN0aW9uRmlsZU1vZGVsLFxuICBjb25maXJtQWN0aW9uLFxuICBkZXRlY3RJRU9yRWRnZSxcbiAgbG9hZEZpbGVGcm9tQmFzZTY0XG59IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25JbXBsZW1lbnRvciB9IGZyb20gXCIuL2tvcXVlc3Rpb25cIjtcbmltcG9ydCB7IGdldE9yaWdpbmFsRXZlbnQgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcblxuY2xhc3MgUXVlc3Rpb25GaWxlSW1wbGVtZW50b3IgZXh0ZW5kcyBRdWVzdGlvbkltcGxlbWVudG9yIHtcbiAgY29uc3RydWN0b3IocXVlc3Rpb246IFF1ZXN0aW9uRmlsZSkge1xuICAgIHN1cGVyKHF1ZXN0aW9uKTtcbiAgICB0aGlzLnNldE9ic2VydmFsZU9iaihcImtvU3RhdGVcIiwga28ub2JzZXJ2YWJsZTxzdHJpbmc+KFwiZW1wdHlcIikpO1xuICAgIHRoaXMuc2V0T2JzZXJ2YWxlT2JqKFxuICAgICAgXCJrb0hhc1ZhbHVlXCIsXG4gICAgICBrby5jb21wdXRlZCgoKSA9PiB0aGlzLnF1ZXN0aW9uLmtvU3RhdGUoKSA9PT0gXCJsb2FkZWRcIilcbiAgICApO1xuICAgIHRoaXMuc2V0T2JzZXJ2YWxlT2JqKFxuICAgICAgXCJrb0RhdGFcIixcbiAgICAgIGtvLmNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24ua29IYXNWYWx1ZSgpKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucXVlc3Rpb24ucHJldmlld1ZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnNldE9ic2VydmFsZU9iaihcImtvSW5wdXRUaXRsZVwiLCBrby5vYnNlcnZhYmxlPHN0cmluZz4oKSk7XG4gICAgdGhpcy5zZXRPYnNlcnZhbGVPYmooXG4gICAgICBcImtvQ2hvb3NlRmlsZUNzc1wiLFxuICAgICAga28ucHVyZUNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlc3Rpb24uZ2V0Q2hvb3NlRmlsZUNzcygpO1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc2V0Q2FsbGJhY2tGdW5jKFwib25kcm9wXCIsIChkYXRhOiBhbnksIGV2ZW50OiBhbnkpID0+IHtcbiAgICAgIHRoaXMucXVlc3Rpb24ub25Ecm9wKGdldE9yaWdpbmFsRXZlbnQoZXZlbnQpKTtcbiAgICB9KTtcbiAgICB0aGlzLnNldENhbGxiYWNrRnVuYyhcIm9uZHJhZ292ZXJcIiwgKGRhdGE6IGFueSwgZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgdGhpcy5xdWVzdGlvbi5vbkRyYWdPdmVyKGdldE9yaWdpbmFsRXZlbnQoZXZlbnQpKTtcbiAgICB9KTtcbiAgICB0aGlzLnNldENhbGxiYWNrRnVuYyhcIm9uZHJhZ2xlYXZlXCIsIChkYXRhOiBhbnksIGV2ZW50OiBhbnkpID0+IHtcbiAgICAgIHRoaXMucXVlc3Rpb24ub25EcmFnTGVhdmUoZ2V0T3JpZ2luYWxFdmVudChldmVudCkpO1xuICAgIH0pO1xuICAgIHRoaXMuc2V0Q2FsbGJhY2tGdW5jKFwiZG9jaGFuZ2VcIiwgKGRhdGE6IGFueSwgZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgdGhpcy5xdWVzdGlvbi5kb0NoYW5nZShnZXRPcmlnaW5hbEV2ZW50KGV2ZW50KSk7XG4gICAgfSk7XG4gICAgdGhpcy5zZXRDYWxsYmFja0Z1bmMoXCJkb2NsZWFuXCIsIChkYXRhOiBhbnksIGV2ZW50OiBhbnkpID0+IHtcbiAgICAgIHRoaXMucXVlc3Rpb24uZG9DbGVhbihnZXRPcmlnaW5hbEV2ZW50KGV2ZW50KSk7XG4gICAgfSk7XG4gICAgdGhpcy5zZXRDYWxsYmFja0Z1bmMoXCJkb3JlbW92ZWZpbGVcIiwgKGRhdGE6IGFueSwgZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgdGhpcy5xdWVzdGlvbi5kb1JlbW92ZUZpbGUoZGF0YSk7XG4gICAgfSk7XG4gICAgdGhpcy5zZXRDYWxsYmFja0Z1bmMoXCJkb2Rvd25sb2FkXCIsIChkYXRhOiBhbnksIGV2ZW50OiBhbnkpID0+IHtcbiAgICAgIHRoaXMucXVlc3Rpb24uZG9Eb3dubG9hZEZpbGUoZ2V0T3JpZ2luYWxFdmVudChldmVudCksIGRhdGEpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uRmlsZSBleHRlbmRzIFF1ZXN0aW9uRmlsZU1vZGVsIHtcbiAgcHJpdmF0ZSBfaW1wbGVtZW50b3I6IFF1ZXN0aW9uRmlsZUltcGxlbWVudG9yO1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB2YXIgdXBkYXRlU3RhdGUgPSAoc3RhdGU6IGFueSkgPT4ge1xuICAgICAgdGhpcy5rb1N0YXRlKHN0YXRlKTtcbiAgICAgIHRoaXMua29JbnB1dFRpdGxlKHRoaXMuaW5wdXRUaXRsZSk7XG4gICAgfTtcbiAgICB0aGlzLm9uU3RhdGVDaGFuZ2VkLmFkZCgoc2VuZGVyLCBvcHRpb25zKSA9PiB7XG4gICAgICB1cGRhdGVTdGF0ZShvcHRpb25zLnN0YXRlKTtcbiAgICB9KTtcbiAgfVxuICBwcm90ZWN0ZWQgb25CYXNlQ3JlYXRpbmcoKSB7XG4gICAgc3VwZXIub25CYXNlQ3JlYXRpbmcoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvciA9IG5ldyBRdWVzdGlvbkZpbGVJbXBsZW1lbnRvcih0aGlzKTtcbiAgfVxuICBwdWJsaWMgZGlzcG9zZSgpIHtcbiAgICB0aGlzLl9pbXBsZW1lbnRvci5kaXNwb3NlKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSB1bmRlZmluZWQ7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG59XG5cblNlcmlhbGl6ZXIub3ZlcnJpZGVDbGFzc0NyZWF0b3IoXCJmaWxlXCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uRmlsZShcIlwiKTtcbn0pO1xuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJmaWxlXCIsIG5hbWUgPT4ge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uRmlsZShuYW1lKTtcbn0pO1xuIiwiaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvblwiO1xuaW1wb3J0IHsgUXVlc3Rpb25IdG1sTW9kZWwgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uSHRtbCBleHRlbmRzIFF1ZXN0aW9uSHRtbE1vZGVsIHtcbiAgcHJpdmF0ZSBfaW1wbGVtZW50b3I6IFF1ZXN0aW9uSW1wbGVtZW50b3I7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICB9XG4gIHByb3RlY3RlZCBvbkJhc2VDcmVhdGluZygpIHtcbiAgICBzdXBlci5vbkJhc2VDcmVhdGluZygpO1xuICAgIHRoaXMuX2ltcGxlbWVudG9yID0gbmV3IFF1ZXN0aW9uSW1wbGVtZW50b3IodGhpcyk7XG4gIH1cbiAgcHVibGljIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5faW1wbGVtZW50b3IuZGlzcG9zZSgpO1xuICAgIHRoaXMuX2ltcGxlbWVudG9yID0gdW5kZWZpbmVkO1xuICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgfVxufVxuXG5TZXJpYWxpemVyLm92ZXJyaWRlQ2xhc3NDcmVhdG9yKFwiaHRtbFwiLCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkh0bWwoXCJcIik7XG59KTtcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiaHRtbFwiLCBuYW1lID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkh0bWwobmFtZSk7XG59KTtcbiIsImltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25JbXBsZW1lbnRvciB9IGZyb20gXCIuL2tvcXVlc3Rpb25cIjtcbmltcG9ydCB7IFF1ZXN0aW9uSW1hZ2VNb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25JbWFnZSBleHRlbmRzIFF1ZXN0aW9uSW1hZ2VNb2RlbCB7XG4gIHByaXZhdGUgX2ltcGxlbWVudG9yOiBRdWVzdGlvbkltcGxlbWVudG9yO1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25CYXNlQ3JlYXRpbmcoKSB7XG4gICAgc3VwZXIub25CYXNlQ3JlYXRpbmcoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvciA9IG5ldyBRdWVzdGlvbkltcGxlbWVudG9yKHRoaXMpO1xuICB9XG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIHRoaXMuX2ltcGxlbWVudG9yLmRpc3Bvc2UoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvciA9IHVuZGVmaW5lZDtcbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gIH1cbn1cblxuU2VyaWFsaXplci5vdmVycmlkZUNsYXNzQ3JlYXRvcihcImltYWdlXCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uSW1hZ2UoXCJcIik7XG59KTtcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiaW1hZ2VcIiwgbmFtZSA9PiB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25JbWFnZShuYW1lKTtcbn0pO1xuIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkltYWdlUGlja2VyTW9kZWwgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25DaGVja2JveEJhc2VJbXBsZW1lbnRvciB9IGZyb20gXCIuL2tvcXVlc3Rpb25fYmFzZXNlbGVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcblxuY2xhc3MgUXVlc3Rpb25JbWFnZVBpY2tlckltcGxlbWVudG9yIGV4dGVuZHMgUXVlc3Rpb25DaGVja2JveEJhc2VJbXBsZW1lbnRvciB7XG4gIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBRdWVzdGlvbikge1xuICAgIHN1cGVyKHF1ZXN0aW9uKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0S29WYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5yZW5kZXJlZFZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkltYWdlUGlja2VyIGV4dGVuZHMgUXVlc3Rpb25JbWFnZVBpY2tlck1vZGVsIHtcbiAgcHJpdmF0ZSBfaW1wbGVtZW50b3I6IFF1ZXN0aW9uSW1hZ2VQaWNrZXJJbXBsZW1lbnRvcjtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQmFzZUNyZWF0aW5nKCkge1xuICAgIHN1cGVyLm9uQmFzZUNyZWF0aW5nKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSBuZXcgUXVlc3Rpb25JbWFnZVBpY2tlckltcGxlbWVudG9yKHRoaXMpO1xuICB9XG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIHRoaXMuX2ltcGxlbWVudG9yLmRpc3Bvc2UoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvciA9IHVuZGVmaW5lZDtcbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gIH1cbn1cblxuU2VyaWFsaXplci5vdmVycmlkZUNsYXNzQ3JlYXRvcihcImltYWdlcGlja2VyXCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uSW1hZ2VQaWNrZXIoXCJcIik7XG59KTtcblxuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJpbWFnZXBpY2tlclwiLCBuYW1lID0+IHtcbiAgdmFyIHEgPSBuZXcgUXVlc3Rpb25JbWFnZVBpY2tlcihuYW1lKTtcbiAgLy9xLmNob2ljZXMgPSBRdWVzdGlvbkZhY3RvcnkuRGVmYXVsdENob2ljZXM7XG4gIHJldHVybiBxO1xufSk7XG4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFF1ZXN0aW9uTWF0cml4TW9kZWwsIE1hdHJpeFJvd01vZGVsLCBJTWF0cml4RGF0YSB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25JbXBsZW1lbnRvciB9IGZyb20gXCIuL2tvcXVlc3Rpb25cIjtcbmltcG9ydCB7IEltcGxlbWVudG9yQmFzZSB9IGZyb20gXCIuL2tvYmFzZVwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbk1hdHJpeCBleHRlbmRzIFF1ZXN0aW9uTWF0cml4TW9kZWwge1xuICBwcml2YXRlIF9pbXBsZW1lbnRvcjogUXVlc3Rpb25JbXBsZW1lbnRvcjtcbiAga29WaXNpYmxlUm93czogYW55ID0gPGFueT5rby5vYnNlcnZhYmxlQXJyYXk8TWF0cml4Um93TW9kZWw+KCk7XG4gIGtvVmlzaWJsZUNvbHVtbnM6IGFueSA9IDxhbnk+a28ub2JzZXJ2YWJsZUFycmF5PGFueT4oKTtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5rb1Zpc2libGVSb3dzKHRoaXMudmlzaWJsZVJvd3MpO1xuICAgIHRoaXMua29WaXNpYmxlQ29sdW1ucyh0aGlzLnZpc2libGVDb2x1bW5zKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25CYXNlQ3JlYXRpbmcoKSB7XG4gICAgc3VwZXIub25CYXNlQ3JlYXRpbmcoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvciA9IG5ldyBRdWVzdGlvbkltcGxlbWVudG9yKHRoaXMpO1xuICB9XG4gIHByb3RlY3RlZCBvbkNvbHVtbnNDaGFuZ2VkKCkge1xuICAgIHN1cGVyLm9uQ29sdW1uc0NoYW5nZWQoKTtcbiAgICB0aGlzLmtvVmlzaWJsZUNvbHVtbnModGhpcy52aXNpYmxlQ29sdW1ucyk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uUm93c0NoYW5nZWQoKSB7XG4gICAgc3VwZXIub25Sb3dzQ2hhbmdlZCgpO1xuICAgIHRoaXMua29WaXNpYmxlUm93cyh0aGlzLnZpc2libGVSb3dzKTtcbiAgfVxuICBwdWJsaWMgb25TdXJ2ZXlMb2FkKCkge1xuICAgIHN1cGVyLm9uU3VydmV5TG9hZCgpO1xuICAgIHRoaXMub25Sb3dzQ2hhbmdlZCgpO1xuICB9XG4gIHByb3RlY3RlZCBvbk1hdHJpeFJvd0NyZWF0ZWQocm93OiBNYXRyaXhSb3dNb2RlbCkge1xuICAgIG5ldyBJbXBsZW1lbnRvckJhc2Uocm93KTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0VmlzaWJsZVJvd3MoKTogQXJyYXk8TWF0cml4Um93TW9kZWw+IHtcbiAgICB2YXIgcm93cyA9IHN1cGVyLmdldFZpc2libGVSb3dzKCk7XG4gICAgdGhpcy5rb1Zpc2libGVSb3dzKHJvd3MpO1xuICAgIHJldHVybiByb3dzO1xuICB9XG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIHRoaXMuX2ltcGxlbWVudG9yLmRpc3Bvc2UoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmtvVmlzaWJsZVJvd3MgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5rb1Zpc2libGVDb2x1bW5zID0gdW5kZWZpbmVkO1xuICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgfVxufVxuXG5TZXJpYWxpemVyLm92ZXJyaWRlQ2xhc3NDcmVhdG9yKFwibWF0cml4XCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uTWF0cml4KFwiXCIpO1xufSk7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcIm1hdHJpeFwiLCBuYW1lID0+IHtcbiAgdmFyIHEgPSBuZXcgUXVlc3Rpb25NYXRyaXgobmFtZSk7XG4gIHEucm93cyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Um93cztcbiAgcS5jb2x1bW5zID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRDb2x1bXM7XG4gIHJldHVybiBxO1xufSk7XG4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFN1cnZleUVsZW1lbnQgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHtcbiAgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZSxcbiAgTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFRhYmxlLFxuICBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsLFxufSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uSW1wbGVtZW50b3IgfSBmcm9tIFwiLi9rb3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBJbXBsZW1lbnRvckJhc2UgfSBmcm9tIFwiLi9rb2Jhc2VcIjtcbmltcG9ydCB7IFBhbmVsTW9kZWwgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFBhbmVsIH0gZnJvbSBcIi4va29wYWdlXCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbk1hdHJpeEJhc2VJbXBsZW1lbnRvciBleHRlbmRzIFF1ZXN0aW9uSW1wbGVtZW50b3Ige1xuICBwcml2YXRlIF90YWJsZUltcGxlbWVudG9yOiBJbXBsZW1lbnRvckJhc2U7XG4gIGtvUmVjYWxjOiBhbnk7XG4gIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBRdWVzdGlvbikge1xuICAgIHN1cGVyKHF1ZXN0aW9uKTtcbiAgICB0aGlzLmtvUmVjYWxjID0ga28ub2JzZXJ2YWJsZSgwKTtcbiAgICAoPFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbD4oXG4gICAgICB0aGlzLnF1ZXN0aW9uXG4gICAgKSkub25SZW5kZXJlZFRhYmxlQ3JlYXRlZENhbGxiYWNrID0gKFxuICAgICAgdGFibGU6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFRhYmxlXG4gICAgKSA9PiB7XG4gICAgICBpZiAoISF0aGlzLl90YWJsZUltcGxlbWVudG9yKSB7XG4gICAgICAgIHRoaXMuX3RhYmxlSW1wbGVtZW50b3IuZGlzcG9zZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5fdGFibGVJbXBsZW1lbnRvciA9IG5ldyBJbXBsZW1lbnRvckJhc2UodGFibGUpO1xuICAgIH07XG4gICAgKDxRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWw+KFxuICAgICAgdGhpcy5xdWVzdGlvblxuICAgICkpLm9uUmVuZGVyZWRUYWJsZVJlc2V0Q2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5xdWVzdGlvbi5pc0Rpc3Bvc2VkKSByZXR1cm47XG4gICAgICB0aGlzLmtvUmVjYWxjKHRoaXMua29SZWNhbGMoKSArIDEpO1xuICAgIH07XG4gICAgdGhpcy5zZXRPYnNlcnZhbGVPYmooXG4gICAgICBcImtvVGFibGVcIixcbiAgICAgIGtvLnB1cmVDb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHRoaXMua29SZWNhbGMoKTtcbiAgICAgICAgcmV0dXJuICg8UXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsPnRoaXMucXVlc3Rpb24pLnJlbmRlcmVkVGFibGU7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zZXRDYWxsYmFja0Z1bmMoXCJrb0NlbGxBZnRlclJlbmRlclwiLCAoZWw6IGFueSwgY29uOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNlbGxBZnRlclJlbmRlcihlbCwgY29uKTtcbiAgICB9KTtcbiAgICB0aGlzLnNldENhbGxiYWNrRnVuYyhcImtvQ2VsbFF1ZXN0aW9uQWZ0ZXJSZW5kZXJcIiwgKGVsOiBhbnksIGNvbjogYW55KSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5jZWxsUXVlc3Rpb25BZnRlclJlbmRlcihlbCwgY29uKTtcbiAgICB9KTtcbiAgICB0aGlzLnNldENhbGxiYWNrRnVuYyhcImtvQWRkUm93Q2xpY2tcIiwgKCkgPT4ge1xuICAgICAgdGhpcy5hZGRSb3coKTtcbiAgICB9KTtcbiAgICB0aGlzLnNldENhbGxiYWNrRnVuYyhcImtvUmVtb3ZlUm93Q2xpY2tcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgdGhpcy5yZW1vdmVSb3coZGF0YS5yb3cpO1xuICAgIH0pO1xuICAgIHRoaXMuc2V0Q2FsbGJhY2tGdW5jKFwia29QYW5lbEFmdGVyUmVuZGVyXCIsIChlbDogYW55LCBjb246IGFueSkgPT4ge1xuICAgICAgdGhpcy5wYW5lbEFmdGVyUmVuZGVyKGVsLCBjb24pO1xuICAgIH0pO1xuICB9XG4gIHByb3RlY3RlZCBnZXRRdWVzdGlvblRlbXBsYXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwibWF0cml4ZHluYW1pY1wiO1xuICB9XG4gIHByaXZhdGUgY2VsbEFmdGVyUmVuZGVyKGVsZW1lbnRzOiBhbnksIGNvbjogYW55KSB7XG4gICAgaWYgKCF0aGlzLnF1ZXN0aW9uLnN1cnZleSkgcmV0dXJuO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgISFrby50YXNrcyAmJiBrby50YXNrcy5ydW5FYXJseSgpO1xuICAgICAgdmFyIGVsID0gU3VydmV5RWxlbWVudC5HZXRGaXJzdE5vblRleHRFbGVtZW50KGVsZW1lbnRzKTtcbiAgICAgIGlmICghZWwpIHJldHVybjtcbiAgICAgIHZhciBjZWxsID0gPFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGw+Y29uO1xuICAgICAgaWYgKGNlbGwucXVlc3Rpb24uY3VzdG9tV2lkZ2V0KSB7XG4gICAgICAgIGNlbGwucXVlc3Rpb24uY3VzdG9tV2lkZ2V0LmFmdGVyUmVuZGVyKGNlbGwucXVlc3Rpb24sIGVsKTtcbiAgICAgICAga28udXRpbHMuZG9tTm9kZURpc3Bvc2FsLmFkZERpc3Bvc2VDYWxsYmFjayhlbCwgKCkgPT4ge1xuICAgICAgICAgIGNlbGwucXVlc3Rpb24uY3VzdG9tV2lkZ2V0LndpbGxVbm1vdW50KGNlbGwucXVlc3Rpb24sIGVsKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgY2VsbDogY2VsbC5jZWxsLFxuICAgICAgICBjZWxsUXVlc3Rpb246IGNlbGwucXVlc3Rpb24sXG4gICAgICAgIGh0bWxFbGVtZW50OiBlbCxcbiAgICAgICAgcm93OiBjZWxsLnJvdyxcbiAgICAgICAgY29sdW1uOiAhIWNlbGwuY2VsbCA/IGNlbGwuY2VsbC5jb2x1bW4gOiBudWxsLFxuICAgICAgfTtcbiAgICAgIHRoaXMucXVlc3Rpb24uc3VydmV5Lm1hdHJpeEFmdGVyQ2VsbFJlbmRlcih0aGlzLnF1ZXN0aW9uLCBvcHRpb25zKTtcbiAgICB9LCAwKTtcbiAgfVxuICBwcml2YXRlIGNlbGxRdWVzdGlvbkFmdGVyUmVuZGVyKGVsZW1lbnRzOiBhbnksIGNvbjogYW55KSB7XG4gICAgaWYgKCF0aGlzLnF1ZXN0aW9uLnN1cnZleSkgcmV0dXJuO1xuICAgIHZhciBlbCA9IFN1cnZleUVsZW1lbnQuR2V0Rmlyc3ROb25UZXh0RWxlbWVudChlbGVtZW50cyk7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIHZhciBjZWxsID0gPFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGw+Y29uO1xuICAgIGNlbGwucXVlc3Rpb24uYWZ0ZXJSZW5kZXJRdWVzdGlvbkVsZW1lbnQoZWwpO1xuICB9XG4gIHByb3RlY3RlZCBpc0FkZFJvd1RvcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJvdGVjdGVkIGlzQWRkUm93Qm90dG9tKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcm90ZWN0ZWQgYWRkUm93KCkge31cbiAgcHJvdGVjdGVkIHJlbW92ZVJvdyhyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlKSB7fVxuICBwcml2YXRlIHBhbmVsQWZ0ZXJSZW5kZXIoZWxlbWVudHM6IGFueSwgY29uOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMucXVlc3Rpb24gfHwgIXRoaXMucXVlc3Rpb24uc3VydmV5KSByZXR1cm47XG4gICAgdmFyIGVsID0gU3VydmV5RWxlbWVudC5HZXRGaXJzdE5vblRleHRFbGVtZW50KGVsZW1lbnRzKTtcbiAgICB0aGlzLnF1ZXN0aW9uLnN1cnZleS5hZnRlclJlbmRlclBhbmVsKGNvbiwgZWwpO1xuICB9XG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIGlmICghIXRoaXMuX3RhYmxlSW1wbGVtZW50b3IpIHtcbiAgICAgIHRoaXMuX3RhYmxlSW1wbGVtZW50b3IuZGlzcG9zZSgpO1xuICAgIH1cbiAgICAoPFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbD4oXG4gICAgICB0aGlzLnF1ZXN0aW9uXG4gICAgKSkub25SZW5kZXJlZFRhYmxlQ3JlYXRlZENhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgICg8UXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsPihcbiAgICAgIHRoaXMucXVlc3Rpb25cbiAgICApKS5vblJlbmRlcmVkVGFibGVSZXNldENhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NYXRyaXhEcm9wZG93biBleHRlbmRzIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbCB7XG4gIHByaXZhdGUgX2ltcGxlbWVudG9yOiBRdWVzdGlvbkltcGxlbWVudG9yO1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25CYXNlQ3JlYXRpbmcoKSB7XG4gICAgc3VwZXIub25CYXNlQ3JlYXRpbmcoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvciA9IG5ldyBRdWVzdGlvbk1hdHJpeEJhc2VJbXBsZW1lbnRvcih0aGlzKTtcbiAgfVxuICBwdWJsaWMgZGlzcG9zZSgpIHtcbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IuZGlzcG9zZSgpO1xuICAgIHRoaXMuX2ltcGxlbWVudG9yID0gdW5kZWZpbmVkO1xuICB9XG59XG5cblNlcmlhbGl6ZXIub3ZlcnJpZGVDbGFzc0NyZWF0b3IoXCJtYXRyaXhkcm9wZG93blwiLCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duKFwiXCIpO1xufSk7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwibWF0cml4ZHJvcGRvd25cIiwgKG5hbWUpID0+IHtcbiAgdmFyIHEgPSBuZXcgUXVlc3Rpb25NYXRyaXhEcm9wZG93bihuYW1lKTtcbiAgcS5jaG9pY2VzID0gWzEsIDIsIDMsIDQsIDVdO1xuICBxLnJvd3MgPSBRdWVzdGlvbkZhY3RvcnkuRGVmYXVsdFJvd3M7XG4gIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UuYWRkRGVmYXVsdENvbHVtbnMocSk7XG4gIHJldHVybiBxO1xufSk7XG4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdywgU2VyaWFsaXplciB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvblwiO1xuaW1wb3J0IHsgUXVlc3Rpb25NYXRyaXhCYXNlSW1wbGVtZW50b3IgfSBmcm9tIFwiLi9rb3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duXCI7XG5pbXBvcnQgeyBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7XG4gIE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlLFxufSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IE1hdHJpeER5bmFtaWNSb3dNb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgUGFuZWxNb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgUGFuZWwgfSBmcm9tIFwiLi9rb3BhZ2VcIjtcbmltcG9ydCB7IEltcGxlbWVudG9yQmFzZSB9IGZyb20gXCIuL2tvYmFzZVwiO1xuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NYXRyaXhEeW5hbWljSW1wbGVtZW50b3IgZXh0ZW5kcyBRdWVzdGlvbk1hdHJpeEJhc2VJbXBsZW1lbnRvciB7XG4gIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBRdWVzdGlvbikge1xuICAgIHN1cGVyKHF1ZXN0aW9uKTtcbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcImdldEtvUG9wdXBJc1Zpc2libGVcIl0gPSB0aGlzLmdldEtvUG9wdXBJc1Zpc2libGU7XG4gIH1cbiAgcHJvdGVjdGVkIGFkZFJvdygpIHtcbiAgICAoPFF1ZXN0aW9uTWF0cml4RHluYW1pYz50aGlzLnF1ZXN0aW9uKS5hZGRSb3dVSSgpO1xuICB9XG4gIHByb3RlY3RlZCByZW1vdmVSb3cocm93OiBNYXRyaXhEeW5hbWljUm93TW9kZWwpIHtcbiAgICAoPFF1ZXN0aW9uTWF0cml4RHluYW1pYz50aGlzLnF1ZXN0aW9uKS5yZW1vdmVSb3dVSShyb3cpO1xuICB9XG4gIHB1YmxpYyBnZXRLb1BvcHVwSXNWaXNpYmxlKHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UpIHtcbiAgICByZXR1cm4gPGFueT5rby5vYnNlcnZhYmxlKHJvdy5pc0RldGFpbFBhbmVsU2hvd2luZyk7XG4gIH1cbiAgcHVibGljIGRpc3Bvc2UoKSB7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICg8YW55PnRoaXMucXVlc3Rpb24pW1wiZ2V0S29Qb3B1cElzVmlzaWJsZVwiXSA9IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NYXRyaXhEeW5hbWljIGV4dGVuZHMgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWwge1xuICBwcml2YXRlIF9pbXBsZW1lbnRvcjogUXVlc3Rpb25NYXRyaXhEeW5hbWljSW1wbGVtZW50b3I7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICB9XG4gIHByb3RlY3RlZCBvbkJhc2VDcmVhdGluZygpIHtcbiAgICBzdXBlci5vbkJhc2VDcmVhdGluZygpO1xuICAgIHRoaXMuX2ltcGxlbWVudG9yID0gbmV3IFF1ZXN0aW9uTWF0cml4RHluYW1pY0ltcGxlbWVudG9yKHRoaXMpO1xuICB9XG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIHRoaXMuX2ltcGxlbWVudG9yLmRpc3Bvc2UoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvciA9IHVuZGVmaW5lZDtcbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gIH1cbn1cblxuU2VyaWFsaXplci5vdmVycmlkZUNsYXNzQ3JlYXRvcihcIm1hdHJpeGR5bmFtaWNcIiwgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25NYXRyaXhEeW5hbWljKFwiXCIpO1xufSk7XG5cblF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdy5wcm90b3R5cGVbXCJvbkNyZWF0aW5nXCJdID0gZnVuY3Rpb24oKSB7XG4gIG5ldyBJbXBsZW1lbnRvckJhc2UodGhpcyk7XG59O1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcIm1hdHJpeGR5bmFtaWNcIiwgKG5hbWUpID0+IHtcbiAgdmFyIHEgPSBuZXcgUXVlc3Rpb25NYXRyaXhEeW5hbWljKG5hbWUpO1xuICBxLmNob2ljZXMgPSBbMSwgMiwgMywgNCwgNV07XG4gIHEucm93Q291bnQgPSAyO1xuICBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlLmFkZERlZmF1bHRDb2x1bW5zKHEpO1xuICByZXR1cm4gcTtcbn0pOyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbCwgTXVsdGlwbGVUZXh0SXRlbU1vZGVsIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBRdWVzdGlvblRleHRNb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25JbXBsZW1lbnRvciB9IGZyb20gXCIuL2tvcXVlc3Rpb25cIjtcbmltcG9ydCB7IFF1ZXN0aW9uVGV4dCB9IGZyb20gXCIuL2tvcXVlc3Rpb25fdGV4dFwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuXG5leHBvcnQgY2xhc3MgTXVsdGlwbGVUZXh0SXRlbSBleHRlbmRzIE11bHRpcGxlVGV4dEl0ZW1Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IGFueSA9IG51bGwsIHRpdGxlOiBzdHJpbmcgPSBudWxsKSB7XG4gICAgc3VwZXIobmFtZSwgdGl0bGUpO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVFZGl0b3IobmFtZTogc3RyaW5nKTogUXVlc3Rpb25UZXh0TW9kZWwge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25UZXh0KG5hbWUpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbk11bHRpcGxlVGV4dEltcGxlbWVudG9yIGV4dGVuZHMgUXVlc3Rpb25JbXBsZW1lbnRvciB7XG4gICAga29SZWNhbGM6IGFueTtcbiAgICBjb25zdHJ1Y3RvcihxdWVzdGlvbjogUXVlc3Rpb25NdWx0aXBsZVRleHQpIHtcbiAgICAgIHN1cGVyKHF1ZXN0aW9uKTtcbiAgICAgIHRoaXMua29SZWNhbGMgPSBrby5vYnNlcnZhYmxlKDApO1xuICAgICAgdGhpcy5zZXRPYnNlcnZhbGVPYmooXG4gICAgICAgIFwia29JdGVtQ3NzXCIsXG4gICAgICAgIGtvLnB1cmVDb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5rb1JlY2FsYygpO1xuICAgICAgICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLmdldEl0ZW1Dc3MoKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLnNldE9ic2VydmFsZU9iaihcbiAgICAgICAgXCJrb0l0ZW1UaXRsZUNzc1wiLFxuICAgICAgICBrby5wdXJlQ29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMua29SZWNhbGMoKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5nZXRJdGVtVGl0bGVDc3MoKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NdWx0aXBsZVRleHQgZXh0ZW5kcyBRdWVzdGlvbk11bHRpcGxlVGV4dE1vZGVsIHtcbiAgcHJpdmF0ZSBfaW1wbGVtZW50b3I6IFF1ZXN0aW9uTXVsdGlwbGVUZXh0SW1wbGVtZW50b3I7XG4gIGtvUm93czogYW55O1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmtvUm93cyA9IGtvLm9ic2VydmFibGVBcnJheSh0aGlzLmdldFJvd3MoKSk7XG4gICAgdGhpcy5jb2xDb3VudENoYW5nZWRDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgIHRoaXMub25Db2xDb3VudENoYW5nZWQoKTtcbiAgICB9O1xuICAgIHRoaXMub25Db2xDb3VudENoYW5nZWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25CYXNlQ3JlYXRpbmcoKSB7XG4gICAgc3VwZXIub25CYXNlQ3JlYXRpbmcoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvciA9IG5ldyBRdWVzdGlvbk11bHRpcGxlVGV4dEltcGxlbWVudG9yKHRoaXMpO1xuICB9XG4gIHByb3RlY3RlZCBvbkNvbENvdW50Q2hhbmdlZCgpIHtcbiAgICB0aGlzLmtvUm93cyh0aGlzLmdldFJvd3MoKSk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVRleHRJdGVtKG5hbWU6IHN0cmluZywgdGl0bGU6IHN0cmluZyk6IE11bHRpcGxlVGV4dEl0ZW1Nb2RlbCB7XG4gICAgcmV0dXJuIG5ldyBNdWx0aXBsZVRleHRJdGVtKG5hbWUsIHRpdGxlKTtcbiAgfVxuICBwdWJsaWMgZGlzcG9zZSgpIHtcbiAgICB0aGlzLl9pbXBsZW1lbnRvci5kaXNwb3NlKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5rb1Jvd3MgPSB1bmRlZmluZWQ7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG59XG5cblNlcmlhbGl6ZXIub3ZlcnJpZGVDbGFzc0NyZWF0b3IoXCJtdWx0aXBsZXRleHRpdGVtXCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IE11bHRpcGxlVGV4dEl0ZW0oXCJcIik7XG59KTtcblxuU2VyaWFsaXplci5vdmVycmlkZUNsYXNzQ3JlYXRvcihcIm11bHRpcGxldGV4dFwiLCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbk11bHRpcGxlVGV4dChcIlwiKTtcbn0pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcIm11bHRpcGxldGV4dFwiLCBuYW1lID0+IHtcbiAgdmFyIHEgPSBuZXcgUXVlc3Rpb25NdWx0aXBsZVRleHQobmFtZSk7XG4gIFF1ZXN0aW9uTXVsdGlwbGVUZXh0TW9kZWwuYWRkRGVmYXVsdEl0ZW1zKHEpO1xuICByZXR1cm4gcTtcbn0pO1xuIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlFbGVtZW50LCBTZXJpYWxpemVyLCBRdWVzdGlvbkZhY3RvcnksXG4gIFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWwgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uSW1wbGVtZW50b3IgfSBmcm9tIFwiLi9rb3F1ZXN0aW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvblBhbmVsRHluYW1pY0ltcGxlbWVudG9yIGV4dGVuZHMgUXVlc3Rpb25JbXBsZW1lbnRvciB7XG4gIGtvUmVjYWxjOiBhbnk7XG4gIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBRdWVzdGlvblBhbmVsRHluYW1pYykge1xuICAgIHN1cGVyKHF1ZXN0aW9uKTtcbiAgICB0aGlzLmtvUmVjYWxjID0ga28ub2JzZXJ2YWJsZSgwKTtcbiAgICB0aGlzLnNldENhbGxiYWNrRnVuYyhcImtvQWRkUGFuZWxDbGlja1wiLCAoKSA9PiB7XG4gICAgICB0aGlzLmFkZFBhbmVsKCk7XG4gICAgfSk7XG4gICAgdGhpcy5zZXRDYWxsYmFja0Z1bmMoXCJrb1JlbW92ZVBhbmVsQ2xpY2tcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgdGhpcy5yZW1vdmVQYW5lbChkYXRhKTtcbiAgICB9KTtcbiAgICB0aGlzLnNldENhbGxiYWNrRnVuYyhcImtvUHJldlBhbmVsQ2xpY2tcIiwgKCkgPT4ge1xuICAgICAgdGhpcy5xdWVzdGlvbi5nb1RvUHJldlBhbmVsKCk7XG4gICAgfSk7XG4gICAgdGhpcy5zZXRDYWxsYmFja0Z1bmMoXCJrb05leHRQYW5lbENsaWNrXCIsICgpID0+IHtcbiAgICAgIHRoaXMucXVlc3Rpb24uZ29Ub05leHRQYW5lbCgpO1xuICAgIH0pO1xuICAgIHRoaXMuc2V0T2JzZXJ2YWxlT2JqKFxuICAgICAgXCJrb0NhbkFkZFBhbmVsXCIsXG4gICAgICBrby5wdXJlQ29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICB0aGlzLmtvUmVjYWxjKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLmNhbkFkZFBhbmVsO1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc2V0T2JzZXJ2YWxlT2JqKFxuICAgICAgXCJrb0NhblJlbW92ZVBhbmVsXCIsXG4gICAgICBrby5wdXJlQ29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICB0aGlzLmtvUmVjYWxjKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLmNhblJlbW92ZVBhbmVsO1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc2V0T2JzZXJ2YWxlT2JqKFxuICAgICAgXCJrb0lzUHJldkJ1dHRvblwiLFxuICAgICAga28ucHVyZUNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgdGhpcy5rb1JlY2FsYygpO1xuICAgICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5pc1ByZXZCdXR0b25TaG93aW5nO1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc2V0T2JzZXJ2YWxlT2JqKFxuICAgICAgXCJrb0lzTmV4dEJ1dHRvblwiLFxuICAgICAga28ucHVyZUNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgdGhpcy5rb1JlY2FsYygpO1xuICAgICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5pc05leHRCdXR0b25TaG93aW5nO1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc2V0T2JzZXJ2YWxlT2JqKFxuICAgICAgXCJrb0lzUmFuZ2VcIixcbiAgICAgIGtvLnB1cmVDb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHRoaXMua29SZWNhbGMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlc3Rpb24uaXNSYW5nZVNob3dpbmc7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zZXRPYnNlcnZhbGVPYmooXG4gICAgICBcImtvUGFuZWxcIixcbiAgICAgIGtvLnB1cmVDb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHRoaXMua29SZWNhbGMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlc3Rpb24uY3VycmVudFBhbmVsO1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc2V0T2JzZXJ2YWxlT2JqKFxuICAgICAgXCJrb0lzTGlzdFwiLFxuICAgICAga28ucHVyZUNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgdGhpcy5rb1JlY2FsYygpO1xuICAgICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5pc1JlbmRlck1vZGVMaXN0O1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc2V0T2JzZXJ2YWxlT2JqKFxuICAgICAgXCJrb0lzUHJvZ3Jlc3NUb3BcIixcbiAgICAgIGtvLnB1cmVDb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHRoaXMua29SZWNhbGMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlc3Rpb24uaXNQcm9ncmVzc1RvcFNob3dpbmc7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zZXRPYnNlcnZhbGVPYmooXG4gICAgICBcImtvSXNQcm9ncmVzc0JvdHRvbVwiLFxuICAgICAga28ucHVyZUNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgdGhpcy5rb1JlY2FsYygpO1xuICAgICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5pc1Byb2dyZXNzQm90dG9tU2hvd2luZztcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnN0IGtvUmFuZ2VWYWx1ZSA9IGtvLm9ic2VydmFibGUodGhpcy5xdWVzdGlvbi5jdXJyZW50SW5kZXgpO1xuICAgIGtvUmFuZ2VWYWx1ZS5zdWJzY3JpYmUoKG5ld1ZhbHVlOiBhbnkpID0+IHtcbiAgICAgIHRoaXMucXVlc3Rpb24uY3VycmVudEluZGV4ID0gbmV3VmFsdWU7XG4gICAgfSk7XG4gICAgdGhpcy5zZXRPYnNlcnZhbGVPYmooXCJrb1JhbmdlVmFsdWVcIiwga29SYW5nZVZhbHVlKTtcbiAgICB0aGlzLnNldE9ic2VydmFsZU9iaihcbiAgICAgIFwia29SYW5nZU1heFwiLFxuICAgICAga28ucHVyZUNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgdGhpcy5rb1JlY2FsYygpO1xuICAgICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5wYW5lbENvdW50IC0gMTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuc2V0T2JzZXJ2YWxlT2JqKFxuICAgICAgXCJrb0FkZEJ1dHRvbkNzc1wiLFxuICAgICAga28ucHVyZUNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgdGhpcy5rb1JlY2FsYygpO1xuICAgICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5nZXRBZGRCdXR0b25Dc3MoKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuc2V0T2JzZXJ2YWxlT2JqKFxuICAgICAgXCJrb1ByZXZCdXR0b25Dc3NcIixcbiAgICAgIGtvLnB1cmVDb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHRoaXMua29SZWNhbGMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlc3Rpb24uZ2V0UHJldkJ1dHRvbkNzcygpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5zZXRPYnNlcnZhbGVPYmooXG4gICAgICBcImtvTmV4dEJ1dHRvbkNzc1wiLFxuICAgICAga28ucHVyZUNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgdGhpcy5rb1JlY2FsYygpO1xuICAgICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5nZXROZXh0QnV0dG9uQ3NzKCk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLnNldE9ic2VydmFsZU9iaihcbiAgICAgIFwia29Qcm9ncmVzc1RleHRcIixcbiAgICAgIGtvLnB1cmVDb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHRoaXMua29SZWNhbGMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlc3Rpb24ucHJvZ3Jlc3NUZXh0O1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5zZXRPYnNlcnZhbGVPYmooXG4gICAgICBcImtvUHJvZ3Jlc3NcIixcbiAgICAgIGtvLnB1cmVDb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHRoaXMua29SZWNhbGMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvZ3Jlc3M7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zZXRDYWxsYmFja0Z1bmMoXCJrb1BhbmVsQWZ0ZXJSZW5kZXJcIiwgKGVsOiBhbnksIGNvbjogYW55KSA9PiB7XG4gICAgICB0aGlzLnBhbmVsQWZ0ZXJSZW5kZXIoZWwsIGNvbik7XG4gICAgfSk7XG4gICAgdGhpcy5xdWVzdGlvbi5wYW5lbENvdW50Q2hhbmdlZENhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgdGhpcy5vblBhbmVsQ291bnRDaGFuZ2VkKCk7XG4gICAgfTtcbiAgICB0aGlzLnF1ZXN0aW9uLnJlbmRlck1vZGVDaGFuZ2VkQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICB0aGlzLm9uUmVuZGVyTW9kZUNoYW5nZWQoKTtcbiAgICB9O1xuICAgIHRoaXMucXVlc3Rpb24uY3VycmVudEluZGV4Q2hhbmdlZENhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgdGhpcy5vbkN1cnJlbnRJbmRleENoYW5nZWQoKTtcbiAgICB9O1xuICB9XG4gIHByb3RlY3RlZCBvblBhbmVsQ291bnRDaGFuZ2VkKCkge1xuICAgIHRoaXMub25DdXJyZW50SW5kZXhDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uUmVuZGVyTW9kZUNoYW5nZWQoKSB7XG4gICAgdGhpcy5vbkN1cnJlbnRJbmRleENoYW5nZWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25DdXJyZW50SW5kZXhDaGFuZ2VkKCkge1xuICAgIGlmICh0aGlzLnF1ZXN0aW9uLmlzRGlzcG9zZWQpIHJldHVybjtcbiAgICB0aGlzLmtvUmVjYWxjKHRoaXMua29SZWNhbGMoKSArIDEpO1xuICAgIHRoaXMucXVlc3Rpb24ua29SYW5nZVZhbHVlKFxuICAgICAgdGhpcy5xdWVzdGlvbi5jdXJyZW50SW5kZXhcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBhZGRQYW5lbCgpIHtcbiAgICB0aGlzLnF1ZXN0aW9uLmFkZFBhbmVsVUkoKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVtb3ZlUGFuZWwodmFsOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMucXVlc3Rpb24uaXNSZW5kZXJNb2RlTGlzdCkge1xuICAgICAgdmFsID0gdGhpcy5xdWVzdGlvbi5jdXJyZW50UGFuZWw7XG4gICAgfVxuICAgIHRoaXMucXVlc3Rpb24ucmVtb3ZlUGFuZWxVSSh2YWwpO1xuICB9XG4gIHByaXZhdGUgcGFuZWxBZnRlclJlbmRlcihlbGVtZW50czogYW55LCBjb246IGFueSkge1xuICAgIGlmICghdGhpcy5xdWVzdGlvbiB8fCAhdGhpcy5xdWVzdGlvbi5zdXJ2ZXkpIHJldHVybjtcbiAgICBjb25zdCBlbCA9IFN1cnZleUVsZW1lbnQuR2V0Rmlyc3ROb25UZXh0RWxlbWVudChlbGVtZW50cyk7XG4gICAgdGhpcy5xdWVzdGlvbi5zdXJ2ZXkuYWZ0ZXJSZW5kZXJQYW5lbChjb24sIGVsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgcHJvZ3Jlc3MoKSB7XG4gICAgY29uc3QgcmFuZ2VNYXg6IG51bWJlciA9IHRoaXMucXVlc3Rpb24ucGFuZWxDb3VudCAtIDE7XG4gICAgcmV0dXJuICh0aGlzLnF1ZXN0aW9uLmN1cnJlbnRJbmRleCAvIHJhbmdlTWF4KSAqIDEwMCArIFwiJVwiO1xuICB9XG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIHRoaXMucXVlc3Rpb24ucGFuZWxDb3VudENoYW5nZWRDYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnF1ZXN0aW9uLnJlbmRlck1vZGVDaGFuZ2VkQ2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5xdWVzdGlvbi5jdXJyZW50SW5kZXhDaGFuZ2VkQ2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvblBhbmVsRHluYW1pYyBleHRlbmRzIFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWwge1xuICBwcml2YXRlIF9pbXBsZW1lbnRvcjogUXVlc3Rpb25QYW5lbER5bmFtaWNJbXBsZW1lbnRvcjtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQmFzZUNyZWF0aW5nKCkge1xuICAgIHN1cGVyLm9uQmFzZUNyZWF0aW5nKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSBuZXcgUXVlc3Rpb25QYW5lbER5bmFtaWNJbXBsZW1lbnRvcih0aGlzKTtcbiAgfVxuICBwdWJsaWMgZGlzcG9zZSgpIHtcbiAgICB0aGlzLl9pbXBsZW1lbnRvci5kaXNwb3NlKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSB1bmRlZmluZWQ7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG59XG5cblNlcmlhbGl6ZXIub3ZlcnJpZGVDbGFzc0NyZWF0b3IoXCJwYW5lbGR5bmFtaWNcIiwgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25QYW5lbER5bmFtaWMoXCJcIik7XG59KTtcblxuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJwYW5lbGR5bmFtaWNcIiwgKG5hbWUpID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvblBhbmVsRHluYW1pYyhuYW1lKTtcbn0pO1xuIiwiaW1wb3J0IHsgUXVlc3Rpb25SYWRpb2dyb3VwTW9kZWwgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25DaGVja2JveEJhc2VJbXBsZW1lbnRvciB9IGZyb20gXCIuL2tvcXVlc3Rpb25fYmFzZXNlbGVjdFwiO1xuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25SYWRpb2dyb3VwIGV4dGVuZHMgUXVlc3Rpb25SYWRpb2dyb3VwTW9kZWwge1xuICBwcml2YXRlIF9pbXBsZW1lbnRvcjogUXVlc3Rpb25DaGVja2JveEJhc2VJbXBsZW1lbnRvcjtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQmFzZUNyZWF0aW5nKCkge1xuICAgIHN1cGVyLm9uQmFzZUNyZWF0aW5nKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSBuZXcgUXVlc3Rpb25DaGVja2JveEJhc2VJbXBsZW1lbnRvcih0aGlzKTtcbiAgfVxuICBwdWJsaWMgZGlzcG9zZSgpIHtcbiAgICB0aGlzLl9pbXBsZW1lbnRvci5kaXNwb3NlKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSB1bmRlZmluZWQ7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG59XG5cblNlcmlhbGl6ZXIub3ZlcnJpZGVDbGFzc0NyZWF0b3IoXCJyYWRpb2dyb3VwXCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uUmFkaW9ncm91cChcIlwiKTtcbn0pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcInJhZGlvZ3JvdXBcIiwgbmFtZSA9PiB7XG4gIHZhciBxID0gbmV3IFF1ZXN0aW9uUmFkaW9ncm91cChuYW1lKTtcbiAgcS5jaG9pY2VzID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRDaG9pY2VzO1xuICByZXR1cm4gcTtcbn0pO1xuIiwiaW1wb3J0IHsgU2VyaWFsaXplciwgUXVlc3Rpb25GYWN0b3J5LCBRdWVzdGlvblJhbmtpbmdNb2RlbCwgSXRlbVZhbHVlIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvblwiO1xuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25SYW5raW5nIGV4dGVuZHMgUXVlc3Rpb25SYW5raW5nTW9kZWwge1xuICBwcml2YXRlIF9pbXBsZW1lbnRvcjogUXVlc3Rpb25JbXBsZW1lbnRvcjtcbiAgcHJvdGVjdGVkIG9uQmFzZUNyZWF0aW5nKCkge1xuICAgIHN1cGVyLm9uQmFzZUNyZWF0aW5nKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSBuZXcgUXVlc3Rpb25JbXBsZW1lbnRvcih0aGlzKTtcbiAgfVxuICBwdWJsaWMgZGlzcG9zZSgpIHtcbiAgICB0aGlzLl9pbXBsZW1lbnRvci5kaXNwb3NlKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSB1bmRlZmluZWQ7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG4gIHB1YmxpYyBrb0hhbmRsZUtleWRvd24gPSAoZGF0YTpJdGVtVmFsdWUsIGV2ZW50OktleWJvYXJkRXZlbnQpID0+IHtcbiAgICB0aGlzLmhhbmRsZUtleWRvd24oZXZlbnQsIGRhdGEpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBrb0hhbmRsZVBvaW50ZXJEb3duID0gKGRhdGE6SXRlbVZhbHVlLCBldmVudDpQb2ludGVyRXZlbnQpPT57XG4gICAgdGhpcy5oYW5kbGVQb2ludGVyRG93bihldmVudCwgZGF0YSwgPEhUTUxFbGVtZW50PmV2ZW50LmN1cnJlbnRUYXJnZXQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cblNlcmlhbGl6ZXIub3ZlcnJpZGVDbGFzc0NyZWF0b3IoXCJyYW5raW5nXCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uUmFua2luZyhcIlwiKTtcbn0pO1xuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJyYW5raW5nXCIsIG5hbWUgPT4ge1xuICBjb25zdCBxID0gbmV3IFF1ZXN0aW9uUmFua2luZyhuYW1lKTtcbiAgcS5jaG9pY2VzID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRDaG9pY2VzO1xuICByZXR1cm4gcTtcbn0pO1xuIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvblwiO1xuaW1wb3J0IHtcbiAgUXVlc3Rpb25SYXRpbmdNb2RlbCxcbiAgU2VyaWFsaXplcixcbiAgUXVlc3Rpb25GYWN0b3J5LFxuICBRdWVzdGlvbixcbn0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvblJhdGluZ0ltcGxlbWVudG9yIGV4dGVuZHMgUXVlc3Rpb25JbXBsZW1lbnRvciB7XG4gIGtvVmlzaWJsZVJhdGVWYWx1ZXM6IGFueTtcbiAgcHJvdGVjdGVkIG9uQ3JlYXRlZCgpIHt9XG4gIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBRdWVzdGlvbikge1xuICAgIHN1cGVyKHF1ZXN0aW9uKTtcbiAgICB0aGlzLm9uQ3JlYXRlZCgpO1xuICAgIHRoaXMua29WaXNpYmxlUmF0ZVZhbHVlcyA9IHRoaXMuc2V0T2JzZXJ2YWxlT2JqKFxuICAgICAgXCJrb1Zpc2libGVSYXRlVmFsdWVzXCIsXG4gICAgICBrby5vYnNlcnZhYmxlQXJyYXkoKVxuICAgICk7XG4gICAgKDxRdWVzdGlvblJhdGluZz50aGlzLnF1ZXN0aW9uKS5yYXRlVmFsdWVzQ2hhbmdlZENhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgdGhpcy5vblJhdGVWYWx1ZXNDaGFuZ2VkKCk7XG4gICAgfTtcbiAgfVxuICBwcm90ZWN0ZWQgb25SYXRlVmFsdWVzQ2hhbmdlZCgpIHtcbiAgICB0aGlzLmtvVmlzaWJsZVJhdGVWYWx1ZXModGhpcy5nZXRWYWx1ZXMoKSk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRWYWx1ZXMoKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuICg8UXVlc3Rpb25SYXRpbmc+dGhpcy5xdWVzdGlvbikudmlzaWJsZVJhdGVWYWx1ZXM7XG4gIH1cbiAgcHVibGljIGRpc3Bvc2UoKSB7XG4gICAgKDxRdWVzdGlvblJhdGluZz50aGlzLnF1ZXN0aW9uKS5yYXRlVmFsdWVzQ2hhbmdlZENhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25SYXRpbmcgZXh0ZW5kcyBRdWVzdGlvblJhdGluZ01vZGVsIHtcbiAgcHJpdmF0ZSBfaW1wbGVtZW50b3I6IFF1ZXN0aW9uUmF0aW5nSW1wbGVtZW50b3I7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICB9XG4gIHByb3RlY3RlZCBvbkJhc2VDcmVhdGluZygpIHtcbiAgICBzdXBlci5vbkJhc2VDcmVhdGluZygpO1xuICAgIHRoaXMuX2ltcGxlbWVudG9yID0gbmV3IFF1ZXN0aW9uUmF0aW5nSW1wbGVtZW50b3IodGhpcyk7XG4gIH1cbiAgcHVibGljIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5faW1wbGVtZW50b3IuZGlzcG9zZSgpO1xuICAgIHRoaXMuX2ltcGxlbWVudG9yID0gdW5kZWZpbmVkO1xuICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgfVxufVxuXG5TZXJpYWxpemVyLm92ZXJyaWRlQ2xhc3NDcmVhdG9yKFwicmF0aW5nXCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uUmF0aW5nKFwiXCIpO1xufSk7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwicmF0aW5nXCIsIChuYW1lKSA9PiB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25SYXRpbmcobmFtZSk7XG59KTtcbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5LCBRdWVzdGlvblNpZ25hdHVyZVBhZE1vZGVsIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvblwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uU2lnbmF0dXJlUGFkIGV4dGVuZHMgUXVlc3Rpb25TaWduYXR1cmVQYWRNb2RlbCB7XG4gIHByaXZhdGUgX2ltcGxlbWVudG9yOiBRdWVzdGlvbkltcGxlbWVudG9yO1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25CYXNlQ3JlYXRpbmcoKSB7XG4gICAgc3VwZXIub25CYXNlQ3JlYXRpbmcoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvciA9IG5ldyBRdWVzdGlvbkltcGxlbWVudG9yKHRoaXMpO1xuICB9XG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIHRoaXMuX2ltcGxlbWVudG9yLmRpc3Bvc2UoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvciA9IHVuZGVmaW5lZDtcbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gIH1cbn1cblxuU2VyaWFsaXplci5vdmVycmlkZUNsYXNzQ3JlYXRvcihcInNpZ25hdHVyZXBhZFwiLCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvblNpZ25hdHVyZVBhZChcIlwiKTtcbn0pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcInNpZ25hdHVyZXBhZFwiLCAobmFtZSkgPT4ge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uU2lnbmF0dXJlUGFkKG5hbWUpO1xufSk7XG4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFF1ZXN0aW9uVGV4dE1vZGVsIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uSW1wbGVtZW50b3IgfSBmcm9tIFwiLi9rb3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25UZXh0IGV4dGVuZHMgUXVlc3Rpb25UZXh0TW9kZWwge1xuICBwcml2YXRlIF9pbXBsZW1lbnRvcjogUXVlc3Rpb25JbXBsZW1lbnRvcjtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQmFzZUNyZWF0aW5nKCkge1xuICAgIHN1cGVyLm9uQmFzZUNyZWF0aW5nKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSBuZXcgUXVlc3Rpb25JbXBsZW1lbnRvcih0aGlzKTtcbiAgfVxuICBwdWJsaWMgZGlzcG9zZSgpIHtcbiAgICB0aGlzLl9pbXBsZW1lbnRvci5kaXNwb3NlKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSB1bmRlZmluZWQ7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG59XG5cblNlcmlhbGl6ZXIub3ZlcnJpZGVDbGFzc0NyZWF0b3IoXCJ0ZXh0XCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uVGV4dChcIlwiKTtcbn0pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcInRleHRcIiwgbmFtZSA9PiB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25UZXh0KG5hbWUpO1xufSk7XG4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFF1ZXN0aW9uLCBTdXJ2ZXlNb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgSVBhZ2UsIFN1cnZleUVsZW1lbnQgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFBhZ2UsIFBhbmVsIH0gZnJvbSBcIi4va29wYWdlXCI7XG5pbXBvcnQgeyBQYWdlTW9kZWwgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IHN1cnZleUNzcyB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsga29UZW1wbGF0ZSwgU3VydmV5VGVtcGxhdGVUZXh0IH0gZnJvbSBcIi4vdGVtcGxhdGVUZXh0XCI7XG5pbXBvcnQgeyBDdXN0b21XaWRnZXRDb2xsZWN0aW9uIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBJbXBsZW1lbnRvckJhc2UgfSBmcm9tIFwiLi9rb2Jhc2VcIjtcbmltcG9ydCB7IFN0eWxlc01hbmFnZXIgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IGRvS2V5MkNsaWNrRG93biwgZG9LZXkyQ2xpY2tVcCB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuXG5DdXN0b21XaWRnZXRDb2xsZWN0aW9uLkluc3RhbmNlLm9uQ3VzdG9tV2lkZ2V0QWRkZWQuYWRkKGN1c3RvbVdpZGdldCA9PiB7XG4gIGlmIChjdXN0b21XaWRnZXQud2lkZ2V0SnNvbi5pc0RlZmF1bHRSZW5kZXIpIHJldHVybjtcbiAgaWYgKCFjdXN0b21XaWRnZXQuaHRtbFRlbXBsYXRlKVxuICAgIGN1c3RvbVdpZGdldC5odG1sVGVtcGxhdGUgPVxuICAgICAgXCI8ZGl2PidodG1sVGVtcGxhdGUnIGF0dHJpYnV0ZSBpcyBtaXNzZWQuPC9kaXY+XCI7XG4gIG5ldyBTdXJ2ZXlUZW1wbGF0ZVRleHQoKS5yZXBsYWNlVGV4dChcbiAgICBjdXN0b21XaWRnZXQuaHRtbFRlbXBsYXRlLFxuICAgIFwid2lkZ2V0XCIsXG4gICAgY3VzdG9tV2lkZ2V0Lm5hbWVcbiAgKTtcbn0pO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5IGV4dGVuZHMgU3VydmV5TW9kZWwge1xuICBwdWJsaWMgc3RhdGljIGdldCBjc3NUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cnZleUNzcy5jdXJyZW50VHlwZTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIHNldCBjc3NUeXBlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBTdHlsZXNNYW5hZ2VyLmFwcGx5VGhlbWUodmFsdWUpO1xuICB9XG4gIHByaXZhdGUgcmVuZGVyZWRFbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBpc0ZpcnN0UmVuZGVyOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJpdmF0ZSBtb3VzZURvd25QYWdlOiBhbnkgPSBudWxsO1xuXG4gIGtvQ3VycmVudFBhZ2U6IGFueTtcbiAga29Jc0ZpcnN0UGFnZTogYW55O1xuICBrb0lzTGFzdFBhZ2U6IGFueTtcbiAgZHVtbXlPYnNlcnZhYmxlOiBhbnk7XG4gIGtvU3RhdGU6IGFueTtcbiAga29BZnRlclJlbmRlclBhZ2U6IGFueTtcbiAga29BZnRlclJlbmRlckhlYWRlcjogYW55O1xuICBrb0NvbXBsZXRlZFN0YXRlOiBhbnk7XG4gIGtvQ29tcGxldGVkU3RhdGVUZXh0OiBhbnk7XG4gIGtvQ29tcGxldGVkU3RhdGVDc3M6IGFueTtcbiAga29UaW1lckluZm9UZXh0OiBhbnk7XG4gIGtvVGl0bGVUZW1wbGF0ZTogYW55ID0gPGFueT5rby5vYnNlcnZhYmxlKFwic3VydmV5LWhlYWRlclwiKTtcblxuICBwdWJsaWMgZ2V0RGF0YVZhbHVlQ29yZSh2YWx1ZXNIYXNoOiBhbnksIGtleTogc3RyaW5nKSB7XG4gICAgaWYgKCEhdGhpcy5lZGl0aW5nT2JqKSByZXR1cm4gc3VwZXIuZ2V0RGF0YVZhbHVlQ29yZSh2YWx1ZXNIYXNoLCBrZXkpO1xuICAgIGlmICh2YWx1ZXNIYXNoW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsdWVzSGFzaFtrZXldID0ga28ub2JzZXJ2YWJsZSgpO1xuICAgIH1cbiAgICByZXR1cm4ga28udW53cmFwKHZhbHVlc0hhc2hba2V5XSk7XG4gIH1cbiAgcHVibGljIHNldERhdGFWYWx1ZUNvcmUodmFsdWVzSGFzaDogYW55LCBrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIGlmICghIXRoaXMuZWRpdGluZ09iaikge1xuICAgICAgc3VwZXIuc2V0RGF0YVZhbHVlQ29yZSh2YWx1ZXNIYXNoLCBrZXksIHZhbHVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGtvLmlzV3JpdGVhYmxlT2JzZXJ2YWJsZSh2YWx1ZXNIYXNoW2tleV0pKSB7XG4gICAgICB2YWx1ZXNIYXNoW2tleV0odmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZXNIYXNoW2tleV0gPSBrby5vYnNlcnZhYmxlKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGRlbGV0ZURhdGFWYWx1ZUNvcmUodmFsdWVzSGFzaDogYW55LCBrZXk6IHN0cmluZykge1xuICAgIGlmICghIXRoaXMuZWRpdGluZ09iaikge1xuICAgICAgc3VwZXIuZGVsZXRlRGF0YVZhbHVlQ29yZSh2YWx1ZXNIYXNoLCBrZXkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoa28uaXNXcml0ZWFibGVPYnNlcnZhYmxlKHZhbHVlc0hhc2hba2V5XSkpIHtcbiAgICAgIHZhbHVlc0hhc2hba2V5XSh1bmRlZmluZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdmFsdWVzSGFzaFtrZXldO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGpzb25PYmo6IGFueSA9IG51bGwsXG4gICAgcmVuZGVyZWRFbGVtZW50OiBhbnkgPSBudWxsLFxuICAgIGNzczogYW55ID0gbnVsbFxuICApIHtcbiAgICBzdXBlcihqc29uT2JqKTtcbiAgICBpZiAodHlwZW9mIGtvID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwia25vY2tvdXRqcyBsaWJyYXJ5IGlzIG5vdCBsb2FkZWQuXCIpO1xuXG4gICAgaWYgKGNzcykge1xuICAgICAgdGhpcy5jc3MgPSBjc3M7XG4gICAgfVxuICAgIGlmIChyZW5kZXJlZEVsZW1lbnQpIHtcbiAgICAgIHRoaXMucmVuZGVyZWRFbGVtZW50ID0gcmVuZGVyZWRFbGVtZW50O1xuICAgIH1cbiAgICB0aGlzLnJlbmRlcihyZW5kZXJlZEVsZW1lbnQpO1xuICB9XG4gIHByb3RlY3RlZCBvbkJhc2VDcmVhdGluZygpIHtcbiAgICBzdXBlci5vbkJhc2VDcmVhdGluZygpO1xuICAgIG5ldyBJbXBsZW1lbnRvckJhc2UodGhpcyk7XG4gIH1cbiAgcHVibGljIG5leHRQYWdlVUlDbGljaygpIHtcbiAgICBpZiAoISF0aGlzLm1vdXNlRG93blBhZ2UgJiYgdGhpcy5tb3VzZURvd25QYWdlICE9PSB0aGlzLmN1cnJlbnRQYWdlKSByZXR1cm47XG4gICAgdGhpcy5tb3VzZURvd25QYWdlID0gbnVsbDtcbiAgICB0aGlzLm5leHRQYWdlKCk7XG4gIH1cbiAgcHVibGljIG5leHRQYWdlTW91c2VEb3duKCkge1xuICAgIHRoaXMubW91c2VEb3duUGFnZSA9IHRoaXMuY3VycmVudFBhZ2U7XG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvbk1vdXNlRG93bigpO1xuICB9XG4gIHB1YmxpYyByZW5kZXIoZWxlbWVudDogYW55ID0gbnVsbCkge1xuICAgIHRoaXMudXBkYXRlS29DdXJyZW50UGFnZSgpO1xuICAgIHRoaXMudXBkYXRlQ3VzdG9tV2lkZ2V0cyh0aGlzLmN1cnJlbnRQYWdlKTtcbiAgICB0aGlzLnVwZGF0ZUVsZW1lbnRDc3MoZmFsc2UpO1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGlmIChlbGVtZW50ICYmIHR5cGVvZiBlbGVtZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudCk7XG4gICAgfVxuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICB0aGlzLnJlbmRlcmVkRWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgfVxuICAgIGVsZW1lbnQgPSB0aGlzLnJlbmRlcmVkRWxlbWVudDtcbiAgICBzZWxmLnN0YXJ0VGltZXJGcm9tVUkoKTtcbiAgICBpZiAoIWVsZW1lbnQpIHJldHVybjtcbiAgICBzZWxmLmFwcGx5QmluZGluZygpO1xuICB9XG4gIHB1YmxpYyBjbGVhcihjbGVhckRhdGE6IGJvb2xlYW4gPSB0cnVlLCBnb3RvRmlyc3RQYWdlOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIHN1cGVyLmNsZWFyKGNsZWFyRGF0YSwgZ290b0ZpcnN0UGFnZSk7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuICBwdWJsaWMgbG9jYWxlQ2hhbmdlZCgpIHtcbiAgICBzdXBlci5sb2NhbGVDaGFuZ2VkKCk7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuICBwdWJsaWMga29FdmVudEFmdGVyUmVuZGVyKGVsZW1lbnQ6IGFueSwgc3VydmV5OiBhbnkpIHtcbiAgICBzdXJ2ZXkuYWZ0ZXJSZW5kZXJTdXJ2ZXkoZWxlbWVudCk7XG4gIH1cbiAgcHVibGljIGxvYWRTdXJ2ZXlGcm9tU2VydmljZShcbiAgICBzdXJ2ZXlJZDogc3RyaW5nID0gbnVsbCxcbiAgICBjbGllbnRJZDogc3RyaW5nID0gbnVsbCxcbiAgICByZW5kZXJlZEVsZW1lbnQ6IGFueSA9IG51bGxcbiAgKSB7XG4gICAgaWYgKHJlbmRlcmVkRWxlbWVudCkge1xuICAgICAgdGhpcy5yZW5kZXJlZEVsZW1lbnQgPSByZW5kZXJlZEVsZW1lbnQ7XG4gICAgfVxuICAgIHN1cGVyLmxvYWRTdXJ2ZXlGcm9tU2VydmljZShzdXJ2ZXlJZCwgY2xpZW50SWQpO1xuICB9XG4gIHB1YmxpYyBzZXRDb21wbGV0ZWQoKSB7XG4gICAgc3VwZXIuc2V0Q29tcGxldGVkKCk7XG4gICAgdGhpcy51cGRhdGVLb0N1cnJlbnRQYWdlKCk7XG4gIH1cbiAgcHVibGljIHN0YXJ0KCk6IGJvb2xlYW4ge1xuICAgIHZhciByZXMgPSBzdXBlci5zdGFydCgpO1xuICAgIHRoaXMudXBkYXRlS29DdXJyZW50UGFnZSgpO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGNyZWF0ZU5ld1BhZ2UobmFtZTogc3RyaW5nKTogUGFnZU1vZGVsIHtcbiAgICByZXR1cm4gbmV3IFBhZ2UobmFtZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEh0bWxUZW1wbGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBrb1RlbXBsYXRlO1xuICB9XG4gIHByb3RlY3RlZCBvbkJlZm9yZUNyZWF0aW5nKCkge1xuICAgIHRoaXMuZHVtbXlPYnNlcnZhYmxlID0ga28ub2JzZXJ2YWJsZSgwKTtcbiAgICB0aGlzLmtvQ3VycmVudFBhZ2UgPSBrby5vYnNlcnZhYmxlKHRoaXMuY3VycmVudFBhZ2UpO1xuICAgIHRoaXMuaXNDdXJyZW50UGFnZUVtcHR5ID0ga28uY29tcHV0ZWQoXG4gICAgICAoKSA9PlxuICAgICAgICAhIXRoaXMua29DdXJyZW50UGFnZSgpICYmXG4gICAgICAgIHRoaXMuZ2V0Um93cyh0aGlzLmtvQ3VycmVudFBhZ2UoKSkubGVuZ3RoID09PSAwXG4gICAgKTtcbiAgICB0aGlzLmtvSXNGaXJzdFBhZ2UgPSBrby5jb21wdXRlZCgoKSA9PiB7XG4gICAgICB0aGlzLmR1bW15T2JzZXJ2YWJsZSgpO1xuICAgICAgcmV0dXJuIHRoaXMuaXNGaXJzdFBhZ2U7XG4gICAgfSk7XG4gICAgdGhpcy5rb0lzTGFzdFBhZ2UgPSBrby5jb21wdXRlZCgoKSA9PiB7XG4gICAgICB0aGlzLmR1bW15T2JzZXJ2YWJsZSgpO1xuICAgICAgcmV0dXJuIHRoaXMuaXNMYXN0UGFnZTtcbiAgICB9KTtcbiAgICB0aGlzLmtvU3RhdGUgPSBrby5vYnNlcnZhYmxlKHRoaXMuc3RhdGUpO1xuICAgIHRoaXMua29Db21wbGV0ZWRTdGF0ZSA9IGtvLm9ic2VydmFibGUoXCJcIik7XG4gICAgdGhpcy5rb0NvbXBsZXRlZFN0YXRlVGV4dCA9IGtvLm9ic2VydmFibGUoXCJcIik7XG4gICAgdGhpcy5rb0NvbXBsZXRlZFN0YXRlQ3NzID0ga28ub2JzZXJ2YWJsZShcIlwiKTtcbiAgICB0aGlzLmtvVGltZXJJbmZvVGV4dCA9IGtvLm9ic2VydmFibGUodGhpcy50aW1lckluZm9UZXh0KTtcbiAgICB0aGlzLmtvQWZ0ZXJSZW5kZXJQYWdlID0gKGVsZW1lbnRzOiBhbnksIGNvbjogYW55KSA9PiB7XG4gICAgICB2YXIgZWwgPSBTdXJ2ZXlFbGVtZW50LkdldEZpcnN0Tm9uVGV4dEVsZW1lbnQoZWxlbWVudHMpO1xuICAgICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICEha28udGFza3MgJiYga28udGFza3MucnVuRWFybHkoKTtcbiAgICAgICAgdGhpcy5hZnRlclJlbmRlclBhZ2UoZWwpO1xuICAgICAgfSwgMCk7XG4gICAgfTtcbiAgICB0aGlzLmtvQWZ0ZXJSZW5kZXJIZWFkZXIgPSAoZWxlbWVudHM6IGFueSwgY29uOiBhbnkpID0+IHtcbiAgICAgIHZhciBlbCA9IFN1cnZleUVsZW1lbnQuR2V0Rmlyc3ROb25UZXh0RWxlbWVudChlbGVtZW50cyk7XG4gICAgICBpZiAoZWwpIHRoaXMuYWZ0ZXJSZW5kZXJIZWFkZXIoZWwpO1xuICAgIH07XG4gIH1cbiAgcHJvdGVjdGVkIGN1cnJlbnRQYWdlQ2hhbmdlZChuZXdWYWx1ZTogUGFnZU1vZGVsLCBvbGRWYWx1ZTogUGFnZU1vZGVsKSB7XG4gICAgdGhpcy51cGRhdGVLb0N1cnJlbnRQYWdlKCk7XG4gICAgc3VwZXIuY3VycmVudFBhZ2VDaGFuZ2VkKG5ld1ZhbHVlLCBvbGRWYWx1ZSk7XG4gICAgaWYgKCF0aGlzLmlzRGVzaWduTW9kZSkgdGhpcy5zY3JvbGxUb1RvcE9uUGFnZUNoYW5nZSgpO1xuICB9XG4gIHBhZ2VWaXNpYmlsaXR5Q2hhbmdlZChwYWdlOiBJUGFnZSwgbmV3VmFsdWU6IGJvb2xlYW4pIHtcbiAgICBzdXBlci5wYWdlVmlzaWJpbGl0eUNoYW5nZWQocGFnZSwgbmV3VmFsdWUpO1xuICAgIHRoaXMudXBkYXRlS29DdXJyZW50UGFnZSgpO1xuICB9XG4gIHByb3RlY3RlZCBvbkxvYWRTdXJ2ZXlGcm9tU2VydmljZSgpIHtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG4gIHByb3RlY3RlZCBvbkxvYWRpbmdTdXJ2ZXlGcm9tU2VydmljZSgpIHtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG4gIHByb3RlY3RlZCBzZXRDb21wbGV0ZWRTdGF0ZSh2YWx1ZTogc3RyaW5nLCB0ZXh0OiBzdHJpbmcpIHtcbiAgICBzdXBlci5zZXRDb21wbGV0ZWRTdGF0ZSh2YWx1ZSwgdGV4dCk7XG4gICAgdGhpcy5rb0NvbXBsZXRlZFN0YXRlKHRoaXMuY29tcGxldGVkU3RhdGUpO1xuICAgIHRoaXMua29Db21wbGV0ZWRTdGF0ZVRleHQodGhpcy5jb21wbGV0ZWRTdGF0ZVRleHQpO1xuICAgIHRoaXMua29Db21wbGV0ZWRTdGF0ZUNzcyhcbiAgICAgIHRoaXMuY29tcGxldGVkU3RhdGUgIT09IFwiXCIgPyB0aGlzLmNzcy5zYXZlRGF0YVt0aGlzLmNvbXBsZXRlZFN0YXRlXSA6IFwiXCJcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBkb1RpbWVyKCkge1xuICAgIHN1cGVyLmRvVGltZXIoKTtcbiAgICB0aGlzLmtvVGltZXJJbmZvVGV4dCh0aGlzLnRpbWVySW5mb1RleHQpO1xuICB9XG4gIHByaXZhdGUgYXBwbHlCaW5kaW5nKCkge1xuICAgIGlmICghdGhpcy5yZW5kZXJlZEVsZW1lbnQpIHJldHVybjtcbiAgICB0aGlzLnVwZGF0ZUtvQ3VycmVudFBhZ2UoKTtcbiAgICBrby5jbGVhbk5vZGUodGhpcy5yZW5kZXJlZEVsZW1lbnQpO1xuICAgIGlmICghdGhpcy5pc0ZpcnN0UmVuZGVyKSB7XG4gICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRQYWdlUXVlc3Rpb25zKCk7XG4gICAgfVxuICAgIHRoaXMuaXNGaXJzdFJlbmRlciA9IGZhbHNlO1xuICAgIGtvLnJlbmRlclRlbXBsYXRlKFxuICAgICAgXCJzdXJ2ZXktY29udGVudFwiLFxuICAgICAgdGhpcyxcbiAgICAgIHsgYWZ0ZXJSZW5kZXI6IHRoaXMua29FdmVudEFmdGVyUmVuZGVyIH0sXG4gICAgICB0aGlzLnJlbmRlcmVkRWxlbWVudFxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVLb0N1cnJlbnRQYWdlKCkge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uIHx8IHRoaXMuaXNEaXNwb3NlZCkgcmV0dXJuO1xuICAgIHRoaXMuZHVtbXlPYnNlcnZhYmxlKHRoaXMuZHVtbXlPYnNlcnZhYmxlKCkgKyAxKTtcbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZSAhPT0gdGhpcy5rb0N1cnJlbnRQYWdlKCkpIHtcbiAgICAgIHRoaXMua29DdXJyZW50UGFnZSh0aGlzLmN1cnJlbnRQYWdlKTtcbiAgICB9XG4gICAgdGhpcy5rb1N0YXRlKHRoaXMuc3RhdGUpO1xuICB9XG4gIHByaXZhdGUgZ2V0Um93cyhwbmw6IGFueSk6IEFycmF5PGFueT4ge1xuICAgIHJldHVybiAhIXBubFtcImtvUm93c1wiXSA/IHBubFtcImtvUm93c1wiXSgpIDogcG5sLnJvd3M7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVDdXJyZW50UGFnZVF1ZXN0aW9ucygpIHtcbiAgICBpZiAodGhpcy5pc0Rpc3Bvc2VkKSByZXR1cm47XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuY3VycmVudFBhZ2UgPyB0aGlzLmN1cnJlbnRQYWdlLnF1ZXN0aW9ucyA6IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcSA9IHF1ZXN0aW9uc1tpXTtcbiAgICAgIGlmIChxLnZpc2libGUpIHFbXCJ1cGRhdGVRdWVzdGlvblwiXSgpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgdXBkYXRlU3VydmV5KG5ld1Byb3BzOiBhbnksIG9sZFByb3BzPzogYW55KSB7XG4gICAgZm9yICh2YXIga2V5IGluIG5ld1Byb3BzKSB7XG4gICAgICBpZiAoa2V5ID09IFwibW9kZWxcIiB8fCBrZXkgPT0gXCJjaGlsZHJlblwiKSBjb250aW51ZTtcbiAgICAgIGlmIChrZXkgPT0gXCJjc3NcIikge1xuICAgICAgICB0aGlzLm1lcmdlVmFsdWVzKG5ld1Byb3BzLmNzcywgdGhpcy5nZXRDc3MoKSk7XG4gICAgICAgIHRoaXMudXBkYXRlRWxlbWVudENzcygpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChrZXkuaW5kZXhPZihcIm9uXCIpID09IDAgJiYgdGhpc1trZXldICYmIHRoaXNba2V5XS5hZGQpIHtcbiAgICAgICAgbGV0IGZ1bmNCb2R5ID0gbmV3UHJvcHNba2V5XTtcbiAgICAgICAgbGV0IGZ1bmMgPSBmdW5jdGlvbiAoc2VuZGVyOiBhbnksIG9wdGlvbnM6IGFueSkge1xuICAgICAgICAgIGZ1bmNCb2R5KHNlbmRlciwgb3B0aW9ucyk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXNba2V5XS5hZGQoZnVuYyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzW2tleV0gPSBuZXdQcm9wc1trZXldO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChuZXdQcm9wcyAmJiBuZXdQcm9wcy5kYXRhKVxuICAgICAgdGhpcy5vblZhbHVlQ2hhbmdlZC5hZGQoKHNlbmRlciwgb3B0aW9ucykgPT4ge1xuICAgICAgICBuZXdQcm9wcy5kYXRhW29wdGlvbnMubmFtZV0gPSBvcHRpb25zLnZhbHVlO1xuICAgICAgfSk7XG4gIH1cbiAgcHVibGljIGRpc3Bvc2UoKSB7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgIGlmICghIXRoaXMucmVuZGVyZWRFbGVtZW50KSB7XG4gICAgICBrby5jbGVhbk5vZGUodGhpcy5yZW5kZXJlZEVsZW1lbnQpO1xuICAgICAgdGhpcy5yZW5kZXJlZEVsZW1lbnQuaW5uZXJIVE1MID0gXCJcIjtcbiAgICB9XG4gICAgdGhpcy5rb0FmdGVyUmVuZGVyUGFnZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmtvQWZ0ZXJSZW5kZXJIZWFkZXIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5pc0N1cnJlbnRQYWdlRW1wdHkuZGlzcG9zZSgpO1xuICAgIHRoaXMua29Jc0ZpcnN0UGFnZS5kaXNwb3NlKCk7XG4gICAgdGhpcy5rb0lzTGFzdFBhZ2UuZGlzcG9zZSgpO1xuICAgIHRoaXMuaXRlcmF0ZVByb3BlcnRpZXNIYXNoKChoYXNoLCBrZXkpID0+IHtcbiAgICAgIGRlbGV0ZSBoYXNoW2tleV07XG4gICAgfSk7XG4gICAgdGhpcy5rb0N1cnJlbnRQYWdlKHVuZGVmaW5lZCk7XG4gIH1cbn1cblxuTG9jYWxpemFibGVTdHJpbmcucHJvdG90eXBlW1wib25DcmVhdGluZ1wiXSA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gdmFyIHNlbGYgPSB0aGlzO1xuICAvLyB0aGlzLmtvUmVSZW5kZXIgPSBrby5vYnNlcnZhYmxlKDApO1xuICB0aGlzLmtvSGFzSHRtbCA9IGtvLm9ic2VydmFibGUodGhpcy5oYXNIdG1sKTtcbiAgdGhpcy5rb1JlbmRlcmVkSHRtbCA9IGtvLm9ic2VydmFibGUodGhpcy5yZW5kZXJlZEh0bWwpO1xuICAvLyBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZiwgXCJrb0hhc0h0bWxcIiwge1xuICAvLyAgIGdldDogKCkgPT4ge1xuICAvLyAgICAgc2VsZi5rb1JlUmVuZGVyKCk7XG4gIC8vICAgICByZXR1cm4gc2VsZi5oYXNIdG1sO1xuICAvLyAgIH0sXG4gIC8vIH0pO1xuICAvLyB0aGlzLmtvUmVuZGVyZWRIdG1sID0ga28ucHVyZUNvbXB1dGVkKGZ1bmN0aW9uKCkge1xuICAvLyAgIHNlbGYua29SZVJlbmRlcigpO1xuICAvLyAgIHJldHVybiBzZWxmLnJlbmRlcmVkSHRtbDtcbiAgLy8gfSk7XG59O1xuXG5JdGVtVmFsdWUucHJvdG90eXBlW1wib25DcmVhdGluZ1wiXSA9IGZ1bmN0aW9uICgpIHtcbiAgbmV3IEltcGxlbWVudG9yQmFzZSh0aGlzKTtcbn07XG5cbkxvY2FsaXphYmxlU3RyaW5nLnByb3RvdHlwZVtcIm9uQ2hhbmdlZFwiXSA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gdGhpcy5rb1JlUmVuZGVyKHRoaXMua29SZVJlbmRlcigpICsgMSk7XG4gIGNvbnN0IGhhc0h0bWwgPSB0aGlzLmhhc0h0bWw7XG4gIHRoaXMua29IYXNIdG1sKGhhc0h0bWwpO1xuICB0aGlzLmtvUmVuZGVyZWRIdG1sKGhhc0h0bWwgPyB0aGlzLmdldEh0bWxWYWx1ZSgpIDogdGhpcy5jYWxjdWxhdGVkVGV4dCk7XG59O1xuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3VydmV5XCIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiBmdW5jdGlvbiAocGFyYW1zOiBhbnksIGNvbXBvbmVudEluZm86IGFueSkge1xuICAgICAgdmFyIHN1cnZleTogU3VydmV5ID0ga28udW53cmFwKHBhcmFtcy5zdXJ2ZXkpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHZhciBzdXJ2ZXlSb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgY29tcG9uZW50SW5mby5lbGVtZW50LmFwcGVuZENoaWxkKHN1cnZleVJvb3QpO1xuICAgICAgICBzdXJ2ZXkucmVuZGVyKHN1cnZleVJvb3QpO1xuICAgICAgfSwgMSk7XG4gICAgICAvLyAhIWtvLnRhc2tzICYmIGtvLnRhc2tzLnJ1bkVhcmx5KCk7XG4gICAgICByZXR1cm4gcGFyYW1zLnN1cnZleTtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZToga29UZW1wbGF0ZSxcbn0pO1xuXG5rby5iaW5kaW5nSGFuZGxlcnNbXCJzdXJ2ZXlQcm9wXCJdID0ge1xuICB1cGRhdGU6IGZ1bmN0aW9uIChlbGVtZW50OiBhbnksIHZhbHVlQWNjZXNzb3I6IGFueSwgYWxsQmluZGluZ3NBY2Nlc3NvcjogYW55KSB7XG4gICAgdmFyIHZhbHVlID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2YWx1ZUFjY2Vzc29yKCkpIHx8IHt9O1xuICAgIGZvciAodmFyIHByb3BOYW1lIGluIHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3BOYW1lID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdmFyIHByb3BWYWx1ZSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWVbcHJvcE5hbWVdKTtcbiAgICAgICAgZWxlbWVudFtwcm9wTmFtZV0gPSBwcm9wVmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblN1cnZleU1vZGVsLnBsYXRmb3JtID0gXCJrbm9ja291dFwiO1xuXG5leHBvcnQgdmFyIHJlZ2lzdGVyVGVtcGxhdGVFbmdpbmUgPSAoa286IGFueSwgcGxhdGZvcm06IHN0cmluZykgPT4ge1xuICAoPGFueT5rbykuc3VydmV5VGVtcGxhdGVFbmdpbmUgPSBmdW5jdGlvbiAoKSB7IH07XG5cbiAgKDxhbnk+a28pLnN1cnZleVRlbXBsYXRlRW5naW5lLnByb3RvdHlwZSA9IG5ldyBrby5uYXRpdmVUZW1wbGF0ZUVuZ2luZSgpO1xuXG4gICg8YW55PmtvKS5zdXJ2ZXlUZW1wbGF0ZUVuZ2luZS5wcm90b3R5cGUubWFrZVRlbXBsYXRlU291cmNlID0gZnVuY3Rpb24gKFxuICAgIHRlbXBsYXRlOiBhbnksXG4gICAgdGVtcGxhdGVEb2N1bWVudDogYW55XG4gICkge1xuICAgIGlmICh0eXBlb2YgdGVtcGxhdGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRlbXBsYXRlRG9jdW1lbnQgPSB0ZW1wbGF0ZURvY3VtZW50IHx8IGRvY3VtZW50O1xuICAgICAgdmFyIHRlbXBsYXRlRWxlbWVudFJvb3QgPSB0ZW1wbGF0ZURvY3VtZW50LmdldEVsZW1lbnRCeUlkKFxuICAgICAgICBcInN1cnZleS1jb250ZW50LVwiICsgcGxhdGZvcm1cbiAgICAgICk7XG4gICAgICBpZiAoIXRlbXBsYXRlRWxlbWVudFJvb3QpIHtcbiAgICAgICAgdGVtcGxhdGVFbGVtZW50Um9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRlbXBsYXRlRWxlbWVudFJvb3QuaWQgPSBcInN1cnZleS1jb250ZW50LVwiICsgU3VydmV5TW9kZWwucGxhdGZvcm07XG4gICAgICAgIHRlbXBsYXRlRWxlbWVudFJvb3Quc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICB0ZW1wbGF0ZUVsZW1lbnRSb290LmlubmVySFRNTCA9IGtvVGVtcGxhdGU7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGVtcGxhdGVFbGVtZW50Um9vdCk7XG4gICAgICB9XG4gICAgICB2YXIgZWxlbTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGVtcGxhdGVFbGVtZW50Um9vdC5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAodGVtcGxhdGVFbGVtZW50Um9vdC5jaGlsZHJlbltpXS5pZCA9PT0gdGVtcGxhdGUpIHtcbiAgICAgICAgICBlbGVtID0gdGVtcGxhdGVFbGVtZW50Um9vdC5jaGlsZHJlbltpXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFlbGVtKSB7XG4gICAgICAgIGVsZW0gPSB0ZW1wbGF0ZURvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRlbXBsYXRlKTtcbiAgICAgIH1cbiAgICAgIGlmICghZWxlbSkge1xuICAgICAgICByZXR1cm4gbmV3IGtvLm5hdGl2ZVRlbXBsYXRlRW5naW5lKCkubWFrZVRlbXBsYXRlU291cmNlKFxuICAgICAgICAgIHRlbXBsYXRlLFxuICAgICAgICAgIHRlbXBsYXRlRG9jdW1lbnRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcga28udGVtcGxhdGVTb3VyY2VzLmRvbUVsZW1lbnQoZWxlbSk7XG4gICAgfSBlbHNlIGlmICh0ZW1wbGF0ZS5ub2RlVHlwZSA9PT0gMSB8fCB0ZW1wbGF0ZS5ub2RlVHlwZSA9PT0gOCkge1xuICAgICAgcmV0dXJuIG5ldyBrby50ZW1wbGF0ZVNvdXJjZXMuYW5vbnltb3VzVGVtcGxhdGUodGVtcGxhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHRlbXBsYXRlIHR5cGU6IFwiICsgdGVtcGxhdGUpO1xuICAgIH1cbiAgfTtcblxuICAvLyAoPGFueT5rbykuc3VydmV5VGVtcGxhdGVFbmdpbmUucHJvdG90eXBlLnJlbmRlclRlbXBsYXRlU291cmNlID0gZnVuY3Rpb24gKHRlbXBsYXRlU291cmNlOiBhbnksIGJpbmRpbmdDb250ZXh0OiBhbnksIG9wdGlvbnM6IGFueSwgdGVtcGxhdGVEb2N1bWVudDogYW55KSB7XG4gIC8vICAgdmFyIHVzZU5vZGVzSWZBdmFpbGFibGUgPSAhKCg8YW55PmtvLnV0aWxzKS5pZVZlcnNpb24gPCA5KSxcbiAgLy8gICAgIHRlbXBsYXRlTm9kZXNGdW5jID0gdXNlTm9kZXNJZkF2YWlsYWJsZSA/IHRlbXBsYXRlU291cmNlW1wibm9kZXNcIl0gOiBudWxsLFxuICAvLyAgICAgdGVtcGxhdGVOb2RlcyA9IHRlbXBsYXRlTm9kZXNGdW5jID8gdGVtcGxhdGVTb3VyY2VbXCJub2Rlc1wiXSgpIDogbnVsbDtcbiAgLy8gICBpZiAodGVtcGxhdGVOb2Rlcykge1xuICAvLyAgICAgcmV0dXJuICg8YW55PmtvLnV0aWxzKS5tYWtlQXJyYXkodGVtcGxhdGVOb2Rlcy5jbG9uZU5vZGUodHJ1ZSkuY2hpbGROb2Rlcyk7XG4gIC8vICAgfSBlbHNlIHtcbiAgLy8gICAgIHZhciB0ZW1wbGF0ZVRleHQgPSB0ZW1wbGF0ZVNvdXJjZVtcInRleHRcIl0oKTtcbiAgLy8gICAgIHJldHVybiAoPGFueT5rby51dGlscykucGFyc2VIdG1sRnJhZ21lbnQodGVtcGxhdGVUZXh0LCB0ZW1wbGF0ZURvY3VtZW50KTtcbiAgLy8gICB9XG4gIC8vIH07XG5cbiAgdmFyIHN1cnZleVRlbXBsYXRlRW5naW5lSW5zdGFuY2UgPSBuZXcgKDxhbnk+a28pLnN1cnZleVRlbXBsYXRlRW5naW5lKCk7XG4gIGtvLnNldFRlbXBsYXRlRW5naW5lKHN1cnZleVRlbXBsYXRlRW5naW5lSW5zdGFuY2UpO1xufTtcblxua28uYmluZGluZ0hhbmRsZXJzW1wia2V5MmNsaWNrXCJdID0ge1xuICBpbml0OiBmdW5jdGlvbiAoZWxlbWVudDogSFRNTEVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzQWNjZXNzb3IsIHZpZXdNb2RlbDogYW55KSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHZhbHVlQWNjZXNzb3IoKSB8fCB7XG4gICAgICBwcm9jZXNzRXNjOiB0cnVlXG4gICAgfTtcbiAgICBpZiAodmlld01vZGVsLmRpc2FibGVUYWJTdG9wKSB7XG4gICAgICBlbGVtZW50LnRhYkluZGV4ID0gLTE7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsZW1lbnQudGFiSW5kZXggPSAwO1xuICAgIGVsZW1lbnQub25rZXl1cCA9IChldnQ6IGFueSkgPT4ge1xuICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBkb0tleTJDbGlja1VwKGV2dCwgb3B0aW9ucyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICBlbGVtZW50Lm9ua2V5ZG93biA9IChldnQ6IGFueSkgPT4gZG9LZXkyQ2xpY2tEb3duKGV2dCwgb3B0aW9ucyk7XG4gIH0sXG59O1xuIiwiZXhwb3J0IHZhciBrb1RlbXBsYXRlID0gcmVxdWlyZShcImh0bWwtbG9hZGVyP2ludGVycG9sYXRlIXZhbC1sb2FkZXIhLi90ZW1wbGF0ZXMvZW50cnkuaHRtbFwiKTtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVRlbXBsYXRlVGV4dCB7XG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBwdWJsaWMgYWRkVGV4dChuZXdUZXh0OiBzdHJpbmcsIGlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZykge1xuICAgIGlkID0gdGhpcy5nZXRJZChpZCwgbmFtZSk7XG4gICAgdGhpcy50ZXh0ID1cbiAgICAgIHRoaXMudGV4dCArXG4gICAgICAnPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgJyArXG4gICAgICBpZCArXG4gICAgICBcIj5cIiArXG4gICAgICBuZXdUZXh0ICtcbiAgICAgIFwiPC9zY3JpcHQ+XCI7XG4gIH1cbiAgcHVibGljIHJlcGxhY2VUZXh0KFxuICAgIHJlcGxhY2VUZXh0OiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBxdWVzdGlvblR5cGU6IHN0cmluZyA9IG51bGxcbiAgKSB7XG4gICAgdmFyIHBvc0lkID0gdGhpcy5nZXRJZChpZCwgcXVlc3Rpb25UeXBlKTtcbiAgICB2YXIgcG9zID0gdGhpcy50ZXh0LmluZGV4T2YocG9zSWQpO1xuICAgIGlmIChwb3MgPCAwKSB7XG4gICAgICB0aGlzLmFkZFRleHQocmVwbGFjZVRleHQsIGlkLCBxdWVzdGlvblR5cGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwb3MgPSB0aGlzLnRleHQuaW5kZXhPZihcIj5cIiwgcG9zKTtcbiAgICBpZiAocG9zIDwgMCkgcmV0dXJuO1xuICAgIHZhciBzdGFydFBvcyA9IHBvcyArIDE7XG4gICAgdmFyIGVuZFN0cmluZyA9IFwiPC9zY3JpcHQ+XCI7XG4gICAgcG9zID0gdGhpcy50ZXh0LmluZGV4T2YoZW5kU3RyaW5nLCBzdGFydFBvcyk7XG4gICAgaWYgKHBvcyA8IDApIHJldHVybjtcbiAgICB0aGlzLnRleHQgPVxuICAgICAgdGhpcy50ZXh0LnN1YnN0cigwLCBzdGFydFBvcykgKyByZXBsYWNlVGV4dCArIHRoaXMudGV4dC5zdWJzdHIocG9zKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0SWQoaWQ6IHN0cmluZywgcXVlc3Rpb25UeXBlOiBzdHJpbmcpIHtcbiAgICB2YXIgcmVzdWx0ID0gJ2lkPVwic3VydmV5LScgKyBpZDtcbiAgICBpZiAocXVlc3Rpb25UeXBlKSB7XG4gICAgICByZXN1bHQgKz0gXCItXCIgKyBxdWVzdGlvblR5cGU7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQgKyAnXCInO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgdGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBrb1RlbXBsYXRlO1xuICB9XG4gIHByb3RlY3RlZCBzZXQgdGV4dCh2YWx1ZTogc3RyaW5nKSB7XG4gICAga29UZW1wbGF0ZSA9IHZhbHVlO1xuICB9XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktY29tbWVudFxcXCI+XFxuICA8IS0ta28gaWY6ICFxdWVzdGlvbi5pc1JlYWRPbmx5UmVuZGVyRGl2KCkgLS0+XFxuPHRleHRhcmVhIHR5cGU9XFxcInRleHRcXFwiIGRhdGEtYmluZD1cXFwiYXR0cjogeyBtYXhMZW5ndGg6IHF1ZXN0aW9uLmdldE90aGVyc01heExlbmd0aCgpLCAnYXJpYS1sYWJlbCc6ICEhcXVlc3Rpb24ubG9jVGl0bGUgJiYgcXVlc3Rpb24ubG9jVGl0bGUucmVuZGVyZWRIdG1sLCBwbGFjZWhvbGRlcjogcXVlc3Rpb24ub3RoZXJQbGFjZUhvbGRlciB9LCBcXG4gICAgICAgIGV2ZW50OiB7IGlucHV0OiAocywgZSkgPT4gJGRhdGEucXVlc3Rpb24ub25Db21tZW50SW5wdXQocywgZSkgfSwgXFxuICAgICAgICB2YWx1ZTogJGRhdGEucXVlc3Rpb24uY29tbWVudCwgXFxuICAgICAgICB2aXNpYmxlOiAkZGF0YS52aXNpYmxlLFxcbiAgICAgICAgZGlzYWJsZTogJGRhdGEucXVlc3Rpb24uaXNJbnB1dFJlYWRPbmx5LFxcbiAgICAgICAgc3R5bGU6IHsgcmVzaXplOiBxdWVzdGlvbi5hdXRvR3Jvd0NvbW1lbnQgPyAnbm9uZScgOiAnYm90aCd9LFxcbiAgICAgICAgY3NzOiAkZGF0YS5xdWVzdGlvbi5rb0NzcygpLm90aGVyXFxcIj48L3RleHRhcmVhPlxcbjwhLS0va28tLT5cXG5cXG48IS0ta28gaWY6IHF1ZXN0aW9uLmlzUmVhZE9ubHlSZW5kZXJEaXYoKSAtLT5cXG48ZGl2IGRhdGEtYmluZD1cXFwidGV4dDogcXVlc3Rpb24uY29tbWVudFxcXCI+PC9kaXY+XFxuPCEtLS9rby0tPlxcbjwvc2NyaXB0PlwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1mbG93cGFuZWxcXFwiPlxcbiAgPGRpdiBkYXRhLWJpbmQ9XFxcInN0eWxlOiB7IGZsZXhCYXNpczogcmVuZGVyV2lkdGgsIGZsZXhHcm93OiAxLCBmbGV4U2hyaW5rOiAxLCB3aWR0aDogcmVuZGVyV2lkdGgsIG1pbldpZHRoOiAkZGF0YS5taW5XaWR0aCwgbWF4V2lkdGg6ICRkYXRhLm1heFdpZHRoIH0sIGF0dHI6IHsgaWQ6IGlkIH0sIGNzczogY3NzQ2xhc3Nlcy5wYW5lbC5jb250YWluZXJcXFwiPlxcbiAgICAgIDxoNCBkYXRhLWJpbmQ9XFxcInZpc2libGU6IChwcm9jZXNzZWRUaXRsZS5sZW5ndGggPiAwKSwgY3NzOiBxdWVzdGlvbi5jc3NUaXRsZVxcXCI+XFxuICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiBsb2NUaXRsZSB9IC0tPlxcbiAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8L2g0PlxcbiAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IGNzc0NsYXNzZXMucGFuZWwuZGVzY3JpcHRpb25cXFwiPlxcbiAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogbG9jRGVzY3JpcHRpb24gfSAtLT5cXG4gICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgPC9kaXY+XFxuICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcInN0eWxlOiB7IHBhZGRpbmdMZWZ0OiBpbm5lclBhZGRpbmdMZWZ0IH1cXFwiPjwvZGl2PlxcbiAgICAgIDxmLXBhbmVsIHBhcmFtcz1cXFwicXVlc3Rpb246IHF1ZXN0aW9uXFxcIiBkYXRhLWJpbmQ9XFxcImF0dHI6IHsgY29udGVudGVkaXRhYmxlIDogcXVlc3Rpb24uaXNEZXNpZ25Nb2RlLCBwbGFjZUhvbGRlcjogcXVlc3Rpb24ucGxhY2VIb2xkZXIgfVxcXCI+PC9mLXBhbmVsPlxcbiAgPC9kaXY+XFxuPC9zY3JpcHQ+XFxuPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktZmxvd3BhbmVsLXF1ZXN0aW9uXFxcIj5cXG4gIDwhLS0ga28gd2l0aDogJHBhcmVudC5xdWVzdGlvbi5nZXRRdWVzdGlvbkJ5TmFtZSgkZGF0YSkgLS0+XFxuICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZToga29FbGVtZW50VHlwZSgpLCBkYXRhOiAkZGF0YSwgYXM6ICdxdWVzdGlvbicsIGFmdGVyUmVuZGVyOiBwYXJlbnQua29FbGVtZW50QWZ0ZXJSZW5kZXIgfSAtLT48IS0tIC9rbyAtLT5cXG4gIDwhLS0gL2tvIC0tPlxcbjwvc2NyaXB0PlxcblwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1oZWFkZXJcXFwiPlxcbiAgPCEtLSBrbyBpZjogcmVuZGVyZWRIYXNIZWFkZXIgLS0+XFxuICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBjc3MuaGVhZGVyXFxcIj5cXG4gICAgICA8IS0tIGtvIGlmOiBpc0xvZ29CZWZvcmUgLS0+XFxuICAgICAgPCEtLSBrbyBjb21wb25lbnQ6IHsgbmFtZTogZ2V0RWxlbWVudFdyYXBwZXJDb21wb25lbnROYW1lKCRkYXRhLCAnbG9nby1pbWFnZScpLCBwYXJhbXM6IGdldEVsZW1lbnRXcmFwcGVyQ29tcG9uZW50RGF0YSgkZGF0YSwgJ2xvZ28taW1hZ2UnKSB9IC0tPlxcbiAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgIDwhLS0gL2tvIC0tPlxcblxcbiAgICAgIDwhLS0ga28gaWY6IHJlbmRlcmVkSGFzVGl0bGUgLS0+XFxuICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogY3NzLmhlYWRlclRleHQsIHN0eWxlOiB7IG1heFdpZHRoOiB0aXRsZU1heFdpZHRoIH1cXFwiPlxcbiAgICAgICAgICA8IS0tIGtvIGNvbXBvbmVudDogeyBuYW1lOiAnc3VydmV5LWVsZW1lbnQtdGl0bGUnLCBwYXJhbXM6IHtlbGVtZW50OiAkZGF0YSB9IH0gLS0+PCEtLSAva28gLS0+XFxuICAgICAgICAgIDxoNSBkYXRhLWJpbmQ9XFxcImNzczogY3NzLmRlc2NyaXB0aW9uXFxcIj48IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogbG9jRGVzY3JpcHRpb24gfSAtLT48IS0tIC9rbyAtLT48L2g1PlxcbiAgICAgIDwvZGl2PlxcbiAgICAgIDwhLS0gL2tvIC0tPlxcblxcbiAgICAgIDwhLS0ga28gaWY6IGlzTG9nb0FmdGVyIC0tPlxcbiAgICAgIDwhLS0ga28gY29tcG9uZW50OiB7IG5hbWU6IGdldEVsZW1lbnRXcmFwcGVyQ29tcG9uZW50TmFtZSgkZGF0YSwgJ2xvZ28taW1hZ2UnKSwgcGFyYW1zOiBnZXRFbGVtZW50V3JhcHBlckNvbXBvbmVudERhdGEoJGRhdGEsICdsb2dvLWltYWdlJykgfSAtLT5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gIDwvZGl2PlxcbiAgPCEtLSAva28gLS0+XFxuPC9zY3JpcHQ+XFxuXCI7IiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LWNvbnRlbnRcXFwiPlxcbiAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogY3NzLnJvb3QsIGFmdGVyUmVuZGVyOiBrb0V2ZW50QWZ0ZXJSZW5kZXJcXFwiPlxcbiAgICAgIDxmb3JtIG9uc3VibWl0PVxcXCJyZXR1cm4gZmFsc2U7XFxcIj5cXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwic3ZfY3VzdG9tX2hlYWRlclxcXCIgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiAhaGFzTG9nb1xcXCI+PC9kaXY+XFxuICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IGNzcy5jb250YWluZXJcXFwiPlxcbiAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiBrb1RpdGxlVGVtcGxhdGUsIGFmdGVyUmVuZGVyOiBrb0FmdGVyUmVuZGVySGVhZGVyIH0gLS0+XFxuICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgIDwhLS0ga28gaWY6IGtvU3RhdGUoKSA9PSBcXFwic3RhcnRpbmdcXFwiIC0tPlxcbiAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogY3NzLmJvZHlcXFwiPlxcbiAgICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6IGlzTmF2aWdhdGlvbkJ1dHRvbnNTaG93aW5nT25Ub3AgLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LW5hdmlnYXRpb24tc3RhcnQnIH0gLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImF0dHI6IHsgaWQ6IHN0YXJ0ZWRQYWdlLmlkIH0sIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktcGFnZScsIGRhdGE6IHN0YXJ0ZWRQYWdlLCBhZnRlclJlbmRlcjoga29BZnRlclJlbmRlclBhZ2UgfVxcXCI+PC9kaXY+XFxuICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogaXNOYXZpZ2F0aW9uQnV0dG9uc1Nob3dpbmdPbkJvdHRvbSAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktbmF2aWdhdGlvbi1zdGFydCcgfSAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBrb1N0YXRlKCkgPT0gXFxcInJ1bm5pbmdcXFwiIHx8IGtvU3RhdGUoKSA9PSBcXFwicHJldmlld1xcXCIgLS0+XFxuICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBjc3MuYm9keVxcXCI+XFxuICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogaXNUaW1lclBhbmVsU2hvd2luZ09uVG9wIC0tPlxcbiAgICAgICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS10aW1lcnBhbmVsJyB9IC0tPlxcbiAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6IGlzU2hvd1Byb2dyZXNzQmFyT25Ub3AgLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSBrbyBjb21wb25lbnQ6IHsgbmFtZTogJ3N2LXByb2dyZXNzLScgKyBwcm9ncmVzc0JhclR5cGUsIHBhcmFtczogeyBtb2RlbDogJGRhdGEgfSB9IC0tPlxcbiAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6IGlzTmF2aWdhdGlvbkJ1dHRvbnNTaG93aW5nT25Ub3AgLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LW5hdmlnYXRpb24nIH0gLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjoga29DdXJyZW50UGFnZSAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJhdHRyOiB7IGlkOiBrb0N1cnJlbnRQYWdlKCkuaWQgfSwgdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1wYWdlJywgZGF0YToga29DdXJyZW50UGFnZSwgYWZ0ZXJSZW5kZXI6IGtvQWZ0ZXJSZW5kZXJQYWdlIH1cXFwiPjwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogaXNDdXJyZW50UGFnZUVtcHR5KCkgJiYgJGRhdGEuZW1wdHlQYWdlVGVtcGxhdGUgLS0+XFxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6IGVtcHR5UGFnZVRlbXBsYXRlLCBkYXRhOiAkZGF0YS5lbXB0eVBhZ2VUZW1wbGF0ZURhdGEgfHwgJGRhdGEgfSAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogaXNTaG93UHJvZ3Jlc3NCYXJPbkJvdHRvbSAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIGtvIGNvbXBvbmVudDogeyBuYW1lOiAnc3YtcHJvZ3Jlc3MtJyArIHByb2dyZXNzQmFyVHlwZSwgcGFyYW1zOiB7IG1vZGVsOiAkZGF0YSB9IH0gLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogaXNUaW1lclBhbmVsU2hvd2luZ09uQm90dG9tIC0tPlxcbiAgICAgICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS10aW1lcnBhbmVsJyB9IC0tPlxcbiAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6IGlzTmF2aWdhdGlvbkJ1dHRvbnNTaG93aW5nT25Cb3R0b20gLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LW5hdmlnYXRpb24nIH0gLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgPCEtLSBrbyBpZjoga29TdGF0ZSgpID09IFxcXCJjb21wbGV0ZWRcXFwiICYmIHNob3dDb21wbGV0ZWRQYWdlIC0tPlxcbiAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImh0bWw6IHByb2Nlc3NlZENvbXBsZXRlZEh0bWwsIGNzczogY29tcGxldGVkQ3NzXFxcIj48L2Rpdj5cXG4gICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiBrb0NvbXBsZXRlZFN0YXRlKCkgIT0gJycsIGNzczogY3NzLnNhdmVEYXRhLnJvb3RcXFwiPlxcbiAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IGtvQ29tcGxldGVkU3RhdGVDc3NcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcInRleHQ6a29Db21wbGV0ZWRTdGF0ZVRleHRcXFwiPjwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XFxcImJ1dHRvblxcXCIgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiBrb0NvbXBsZXRlZFN0YXRlKCkgPT0gJ2Vycm9yJywgdmFsdWU6IGdldExvY1N0cmluZygnc2F2ZUFnYWluQnV0dG9uJyksIGNsaWNrOiBkb0NvbXBsZXRlLCBjc3M6IGNzcy5zYXZlRGF0YS5zYXZlQWdhaW5CdXR0b25cXFwiLz5cXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBrb1N0YXRlKCkgPT0gXFxcImNvbXBsZXRlZGJlZm9yZVxcXCIgLS0+XFxuICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiaHRtbDogcHJvY2Vzc2VkQ29tcGxldGVkQmVmb3JlSHRtbCwgY3NzOiBjc3MuYm9keVxcXCI+PC9kaXY+XFxuICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgIDwhLS0ga28gaWY6IGtvU3RhdGUoKSA9PSBcXFwibG9hZGluZ1xcXCIgLS0+XFxuICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiaHRtbDogcHJvY2Vzc2VkTG9hZGluZ0h0bWwsIGNzczogY3NzLmJvZHlcXFwiPjwvZGl2PlxcbiAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBrb1N0YXRlKCkgPT0gXFxcImVtcHR5XFxcIiAtLT5cXG4gICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJ0ZXh0OmVtcHR5U3VydmV5VGV4dCwgY3NzOiBjc3MuYm9keUVtcHR5XFxcIj48L2Rpdj5cXG4gICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICA8L2Rpdj5cXG4gICAgICA8L2Zvcm0+XFxuICA8L2Rpdj5cXG48L3NjcmlwdD5cXG48c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1uYXZpZ2F0aW9uXFxcIj5cXG4gIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IGNzcy5mb290ZXJcXFwiPlxcbiAgICAgIDxpbnB1dCB0eXBlPVxcXCJidXR0b25cXFwiIGRhdGEtYmluZD1cXFwiZXZlbnQ6IHsgbW91c2Vkb3duOiBuYXZpZ2F0aW9uTW91c2VEb3duIH0sIHZhbHVlOiBsb2NQYWdlUHJldlRleHQua29SZW5kZXJlZEh0bWwsIGNsaWNrOiBwcmV2UGFnZSwgdmlzaWJsZTogIWtvSXNGaXJzdFBhZ2UoKSAmJiBpc1Nob3dQcmV2QnV0dG9uLCBjc3M6IGNzc05hdmlnYXRpb25QcmV2XFxcIiAvPlxcbiAgICAgIDxpbnB1dCB0eXBlPVxcXCJidXR0b25cXFwiIGRhdGEtYmluZD1cXFwiZXZlbnQ6IHsgbW91c2Vkb3duOiBuZXh0UGFnZU1vdXNlRG93biB9LCB2YWx1ZTogbG9jUGFnZU5leHRUZXh0LmtvUmVuZGVyZWRIdG1sLCBjbGljazogbmV4dFBhZ2VVSUNsaWNrLCB2aXNpYmxlOiAha29Jc0xhc3RQYWdlKCksIGNzczogY3NzTmF2aWdhdGlvbk5leHRcXFwiIC8+XFxuICAgICAgPGlucHV0IHR5cGU9XFxcImJ1dHRvblxcXCIgZGF0YS1iaW5kPVxcXCJldmVudDogeyBtb3VzZWRvd246IG5hdmlnYXRpb25Nb3VzZURvd24gfSwgdmFsdWU6IGxvY1ByZXZpZXdUZXh0LmtvUmVuZGVyZWRIdG1sLCBjbGljazogc2hvd1ByZXZpZXcsIHZpc2libGU6IGtvSXNMYXN0UGFnZSgpICYmIGlzUHJldmlld0J1dHRvblZpc2libGUsIGNzczogY3NzTmF2aWdhdGlvblByZXZpZXdcXFwiIC8+XFxuICAgICAgPGlucHV0IHR5cGU9XFxcImJ1dHRvblxcXCIgZGF0YS1iaW5kPVxcXCJldmVudDogeyBtb3VzZWRvd246IG5hdmlnYXRpb25Nb3VzZURvd24gfSwgdmFsdWU6IGxvY0NvbXBsZXRlVGV4dC5rb1JlbmRlcmVkSHRtbCwgY2xpY2s6IGNvbXBsZXRlTGFzdFBhZ2UsIHZpc2libGU6IGtvSXNMYXN0UGFnZSgpICYmIGlzQ29tcGxldGVCdXR0b25WaXNpYmxlLCBjc3M6IGNzc05hdmlnYXRpb25Db21wbGV0ZVxcXCIgLz5cXG4gIDwvZGl2Plxcbjwvc2NyaXB0PlxcbjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LW5hdmlnYXRpb24tc3RhcnRcXFwiPlxcbiAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogY3NzLmZvb3RlclxcXCI+XFxuICAgICAgPGlucHV0IHR5cGU9XFxcImJ1dHRvblxcXCIgZGF0YS1iaW5kPVxcXCJ2YWx1ZTogc3RhcnRTdXJ2ZXlUZXh0LCBjbGljazogc3RhcnQsIGNzczogY3NzTmF2aWdhdGlvblN0YXJ0XFxcIi8+XFxuICA8L2Rpdj5cXG48L3NjcmlwdD5cXG5cIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcGFnZVxcXCI+XFxuICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBjc3NDbGFzc2VzLnBhZ2Uucm9vdFxcXCI+XFxuICAgIDwhLS0ga28gY29tcG9uZW50OiB7IG5hbWU6ICdzdXJ2ZXktZWxlbWVudC10aXRsZScsIHBhcmFtczoge2VsZW1lbnQ6ICRkYXRhIH0gfSAtLT48IS0tIC9rbyAtLT5cXG4gICAgPCEtLSBrbyBpZjogX3Nob3dEZXNjcmlwdGlvbi0tPlxcbiAgICA8ZGl2XFxuICAgICAgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiBkYXRhLnNob3dQYWdlVGl0bGVzLCBjc3M6IGNzc0NsYXNzZXMucGFnZS5kZXNjcmlwdGlvblxcXCJcXG4gICAgPlxcbiAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiBsb2NEZXNjcmlwdGlvbiB9IC0tPlxcbiAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICA8L2Rpdj5cXG4gICAgPCEtLSAva28gLS0+XFxuICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1yb3dzJywgZGF0YTogJGRhdGF9IC0tPlxcbiAgICA8IS0tIC9rbyAtLT5cXG4gIDwvZGl2Plxcbjwvc2NyaXB0PlxcblwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1wYW5lbFxcXCI+XFxuICA8ZGl2XFxuICAgIGRhdGEtYmluZD1cXFwiYXR0cjogeyBpZDogaWQgfSwgY3NzOiBjc3NDbGFzc2VzLnBhbmVsLmNvbnRhaW5lclxcXCJcXG4gID5cXG4gICAgPCEtLSBrbyBjb21wb25lbnQ6IHsgbmFtZTogJ3N1cnZleS1lbGVtZW50LXRpdGxlJywgcGFyYW1zOiB7ZWxlbWVudDogJGRhdGEgfSB9IC0tPjwhLS0gL2tvIC0tPlxcbiAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBjc3NDbGFzc2VzLnBhbmVsLmRlc2NyaXB0aW9uXFxcIj5cXG4gICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogbG9jRGVzY3JpcHRpb24gfSAtLT5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gICAgPC9kaXY+XFxuICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1xdWVzdGlvbi1lcnJvcnMnLCBkYXRhOiAkZGF0YSB9IC0tPlxcbiAgICA8IS0tIC9rbyAtLT5cXG4gICAgPCEtLSBrbyBpZjogc3RhdGUgIT0gXFxcImNvbGxhcHNlZFxcXCIgLS0+XFxuICAgIDxkaXZcXG4gICAgICBkYXRhLWJpbmQ9XFxcInN0eWxlOiB7IHBhZGRpbmdMZWZ0OiBpbm5lclBhZGRpbmdMZWZ0IH0sIGNzczogY3NzQ2xhc3Nlcy5wYW5lbC5jb250ZW50LCBhdHRyOiB7aWQ6Y29udGVudElkfVxcXCJcXG4gICAgPlxcbiAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1yb3dzJywgZGF0YTogJGRhdGF9IC0tPlxcbiAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgIDwhLS0ga28gY29tcG9uZW50OiB7IG5hbWU6ICdzdi1hY3Rpb24tYmFyJywgcGFyYW1zOiB7IG1vZGVsOiBnZXRGb290ZXJUb29sYmFyKCkgfSB9IC0tPlxcbiAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICA8L2Rpdj5cXG4gICAgPCEtLSAva28gLS0+XFxuICA8L2Rpdj5cXG48L3NjcmlwdD5cXG5cIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcXVlc3Rpb24tYm9vbGVhblxcXCI+XFxuICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLnJvb3RcXFwiPlxcbiAgICA8bGFiZWwgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmdldEl0ZW1Dc3MoKVxcXCI+XFxuICAgICAgPGlucHV0XFxuICAgICAgICB0eXBlPVxcXCJjaGVja2JveFxcXCJcXG4gICAgICAgIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLmNvbnRyb2wsIGF0dHI6IHtuYW1lOiBxdWVzdGlvbi5uYW1lLCBpZDogcXVlc3Rpb24uaW5wdXRJZCwgJ2FyaWEtcmVxdWlyZWQnOiBxdWVzdGlvbi5hcmlhUmVxdWlyZWQsICdhcmlhLWxhYmVsJzogcXVlc3Rpb24uYXJpYUxhYmVsLCAnYXJpYS1pbnZhbGlkJzogcXVlc3Rpb24uYXJpYUludmFsaWQsICdhcmlhLWRlc2NyaWJlZGJ5JzogcXVlc3Rpb24uYXJpYURlc2NyaWJlZEJ5fSwgY2hlY2tlZDogcXVlc3Rpb24uY2hlY2tlZFZhbHVlLCBzdXJ2ZXlQcm9wOiB7aW5kZXRlcm1pbmF0ZTogcXVlc3Rpb24uaXNJbmRldGVybWluYXRlfSwgZW5hYmxlOiAhcXVlc3Rpb24uaXNJbnB1dFJlYWRPbmx5XFxcIlxcbiAgICAgIC8+XFxuICAgICAgPHNwYW5cXG4gICAgICAgIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5nZXRMYWJlbENzcyhmYWxzZSksIGNsaWNrOiBvbkZhbHNlTGFiZWxDbGlja1xcXCJcXG4gICAgICAgID48IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogbG9jTGFiZWxGYWxzZSB9IC0tPjwhLS0gL2tvIC0tPjwvc3BhblxcbiAgICAgID5cXG4gICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLnN3aXRjaCwgY2xpY2s6IG9uU3dpdGNoQ2xpY2tcXFwiPlxcbiAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuc2xpZGVyXFxcIj5cXG4gICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuc2xpZGVyVGV4dFxcXCI+XFxuICAgICAgICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24uY2hlY2tlZFZhbHVlID09PSBmYWxzZSAtLT5cXG4gICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiBsb2NMYWJlbEZhbHNlIH0gLS0+PCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24uY2hlY2tlZFZhbHVlID09PSB0cnVlIC0tPlxcbiAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IGxvY0xhYmVsVHJ1ZSB9IC0tPjwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICA8L3NwYW4+XFxuICAgICAgPC9kaXY+XFxuICAgICAgPHNwYW5cXG4gICAgICAgIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5nZXRMYWJlbENzcyh0cnVlKSwgY2xpY2s6IG9uVHJ1ZUxhYmVsQ2xpY2tcXFwiXFxuICAgICAgICA+PCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IGxvY0xhYmVsVHJ1ZSB9IC0tPjwhLS0gL2tvIC0tPjwvc3BhblxcbiAgICAgID5cXG4gICAgPC9sYWJlbD5cXG4gIDwvZGl2Plxcbjwvc2NyaXB0PlwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1idXR0b25ncm91cFxcXCI+XFxuICA8ZGl2IHJvbGU9XFxcImdyb3VwXFxcIiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5yb290XFxcIj5cXG4gICAgICA8IS0tIGtvIGZvcmVhY2g6IHF1ZXN0aW9uLnZpc2libGVDaG9pY2VzIC0tPlxcbiAgICAgICAgPCEtLSBrbyBjb21wb25lbnQ6IHsgbmFtZTogJ3N2LWJ1dHRvbi1ncm91cC1pdGVtJywgcGFyYW1zOiB7IHF1ZXN0aW9uOiBxdWVzdGlvbiwgaXRlbTogJGRhdGEsIGluZGV4OiAkaW5kZXggfSB9IC0tPlxcbiAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgPCEtLSAva28gLS0+XFxuICAgIDwvZGl2Plxcbjwvc2NyaXB0PlxcblwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1jaGVja2JveFxcXCI+XFxuICA8ZmllbGRzZXQgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkucm9vdFxcXCI+XFxuICAgICAgPGxlZ2VuZCBkYXRhLWJpbmQ9XFxcImF0dHI6IHsgJ2FyaWEtbGFiZWwnOiBxdWVzdGlvbi5hcmlhTGFiZWwgfVxcXCIgcm9sZT1cXFwiY2hlY2tib3hcXFwiPjwvbGVnZW5kPlxcbiAgICAgIDwhLS0ga28gaWZub3Q6IHF1ZXN0aW9uLmhhc0NvbHVtbnMgIC0tPlxcbiAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiB7IGRhdGE6IHF1ZXN0aW9uLnZpc2libGVDaG9pY2VzLCBhczogJ2l0ZW0nLCBhZnRlclJlbmRlcjogcXVlc3Rpb24ua29BZnRlclJlbmRlciB9ICAtLT5cXG4gICAgICAgICAgPCEtLSBrbyBjb21wb25lbnQ6IHsgbmFtZTogcXVlc3Rpb24uZ2V0SXRlbVZhbHVlV3JhcHBlckNvbXBvbmVudE5hbWUoaXRlbSksIHBhcmFtczogeyBjb21wb25lbnREYXRhOiAgcXVlc3Rpb24uZ2V0SXRlbVZhbHVlV3JhcHBlckNvbXBvbmVudERhdGEoaXRlbSksIHRlbXBsYXRlRGF0YTogeyBuYW1lOiAnc3VydmV5LWNoZWNrYm94LWl0ZW0nLCBkYXRhOiBpdGVtIH0gfSB9IC0tPlxcbiAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmhhc0NvbHVtbnMgIC0tPlxcbiAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiBxdWVzdGlvbi5jb2x1bW5zIC0tPlxcbiAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmdldENvbHVtbkNsYXNzKClcXFwiPlxcbiAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogeyBkYXRhOiAkZGF0YSwgYXM6ICdpdGVtJywgYWZ0ZXJSZW5kZXI6IHF1ZXN0aW9uLmtvQWZ0ZXJSZW5kZXIgfSAgLS0+XFxuICAgICAgICAgICAgICA8IS0tIGtvIGNvbXBvbmVudDogeyBuYW1lOiBxdWVzdGlvbi5nZXRJdGVtVmFsdWVXcmFwcGVyQ29tcG9uZW50TmFtZShpdGVtKSwgcGFyYW1zOiB7IGNvbXBvbmVudERhdGE6ICBxdWVzdGlvbi5nZXRJdGVtVmFsdWVXcmFwcGVyQ29tcG9uZW50RGF0YShpdGVtKSwgdGVtcGxhdGVEYXRhOiB7IG5hbWU6ICdzdXJ2ZXktY2hlY2tib3gtaXRlbScsIGRhdGE6IGl0ZW0gfSB9IH0gLS0+XFxuICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICA8L2ZpZWxkc2V0Plxcbjwvc2NyaXB0PlxcbjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LWNoZWNrYm94LWl0ZW1cXFwiPlxcbiAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24uZ2V0SXRlbUNsYXNzKGl0ZW0pXFxcIj5cXG4gICAgICA8bGFiZWwgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmdldExhYmVsQ2xhc3MoaXRlbSlcXFwiPlxcbiAgICAgICAgICA8IS0tIGtvIGlmOiBpdGVtID09IHF1ZXN0aW9uLnNlbGVjdEFsbEl0ZW0gLS0+XFxuICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJjaGVja2JveFxcXCIgZGF0YS1iaW5kPVxcXCJhdHRyOiB7bmFtZTogcXVlc3Rpb24ubmFtZSwgaWQ6IHF1ZXN0aW9uLmdldEl0ZW1JZChpdGVtKSwgJ2FyaWEtcmVxdWlyZWQnOiBxdWVzdGlvbi5hcmlhUmVxdWlyZWQsICdhcmlhLWxhYmVsJzogcXVlc3Rpb24uYXJpYUxhYmVsLCAnYXJpYS1pbnZhbGlkJzogcXVlc3Rpb24uYXJpYUludmFsaWQsICdhcmlhLWRlc2NyaWJlZGJ5JzogcXVlc3Rpb24uYXJpYURlc2NyaWJlZEJ5IH0sIGNoZWNrZWQ6IHF1ZXN0aW9uLmtvQWxsU2VsZWN0ZWQsIGVuYWJsZTogcXVlc3Rpb24uZ2V0SXRlbUVuYWJsZWQoaXRlbSksIGNzczogcXVlc3Rpb24ua29Dc3MoKS5pdGVtQ29udHJvbFxcXCIvPlxcbiAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgPCEtLSBrbyBpZjogaXRlbSAhPSBxdWVzdGlvbi5zZWxlY3RBbGxJdGVtIC0tPlxcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cXFwiY2hlY2tib3hcXFwiIGRhdGEtYmluZD1cXFwiYXR0cjoge25hbWU6IHF1ZXN0aW9uLm5hbWUsIGlkOiBxdWVzdGlvbi5nZXRJdGVtSWQoaXRlbSksICdhcmlhLXJlcXVpcmVkJzogcXVlc3Rpb24uYXJpYVJlcXVpcmVkLCAnYXJpYS1sYWJlbCc6IHF1ZXN0aW9uLmFyaWFMYWJlbCwgJ2FyaWEtaW52YWxpZCc6IHF1ZXN0aW9uLmFyaWFJbnZhbGlkLCAnYXJpYS1kZXNjcmliZWRieSc6IHF1ZXN0aW9uLmFyaWFEZXNjcmliZWRCeSB9LCBjaGVja2VkVmFsdWU6IGl0ZW0udmFsdWUsIGNoZWNrZWQ6IHF1ZXN0aW9uLmtvVmFsdWUsIGVuYWJsZTogcXVlc3Rpb24uZ2V0SXRlbUVuYWJsZWQoaXRlbSksIGNzczogcXVlc3Rpb24ua29Dc3MoKS5pdGVtQ29udHJvbFxcXCIvPlxcbiAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkubWF0ZXJpYWxEZWNvcmF0b3JcXFwiPlxcbiAgICAgICAgICAgIDxzdmcgdmlld0JveD1cXFwiMCAwIDI0IDI0XFxcIiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5pdGVtRGVjb3JhdG9yXFxcIj5cXG4gICAgICAgICAgICAgIDxwYXRoIGRhdGEtYmluZD1cXFwiYXR0cjoge2Q6IHF1ZXN0aW9uLmNoZWNrQm94U3ZnUGF0aH1cXFwiLz5cXG4gICAgICAgICAgICA8L3N2Zz5cXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiY2hlY2tcXFwiPjwvc3Bhbj5cXG4gICAgICAgICAgPC9zcGFuPlxcbiAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcInZpc2libGU6ICFpdGVtLmhpZGVDYXB0aW9uLCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuY29udHJvbExhYmVsLCBhdHRyOiB7IHRpdGxlOiBpdGVtLmxvY1RleHQua29SZW5kZXJlZEh0bWwgfVxcXCI+XFxuICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogaXRlbS5sb2NUZXh0IH0gLS0+XFxuICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgPC9zcGFuPlxcbiAgICAgIDwvbGFiZWw+XFxuICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24uaXNPdGhlckl0ZW0oaXRlbSkgLS0+XFxuICAgICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCIgZGF0YS1iaW5kPVxcXCJ0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LWNvbW1lbnQnLCBkYXRhOiB7J3F1ZXN0aW9uJzogcXVlc3Rpb24sICd2aXNpYmxlJzogcXVlc3Rpb24uaXNPdGhlclNlbGVjdGVkIH0gfVxcXCI+PC9kaXY+XFxuICAgICAgPCEtLSAva28gLS0+XFxuICA8L2Rpdj5cXG48L3NjcmlwdD5cXG5cIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcXVlc3Rpb24tY29tbWVudFxcXCI+XFxuICA8IS0ta28gaWY6ICFxdWVzdGlvbi5pc1JlYWRPbmx5UmVuZGVyRGl2KCkgLS0+XFxuPHRleHRhcmVhIHR5cGU9XFxcInRleHRcXFwiIGRhdGEtYmluZD1cXFwiYXR0cjogeydyZWFkb25seSc6IHF1ZXN0aW9uLmlzUmVhZE9ubHksICdkaXNhYmxlZCc6IHF1ZXN0aW9uLmlzSW5wdXRSZWFkT25seSwgbWF4TGVuZ3RoOiBxdWVzdGlvbi5nZXRNYXhMZW5ndGgoKSwgY29sczogcXVlc3Rpb24uY29scywgcm93czogcXVlc3Rpb24ucm93cywgaWQ6IHF1ZXN0aW9uLmlucHV0SWQsIHBsYWNlaG9sZGVyOiBxdWVzdGlvbi5yZW5kZXJlZFBsYWNlSG9sZGVyLCAnYXJpYS1yZXF1aXJlZCc6IHF1ZXN0aW9uLmFyaWFSZXF1aXJlZCwgJ2FyaWEtbGFiZWwnOiBxdWVzdGlvbi5hcmlhTGFiZWwsICdhcmlhLWludmFsaWQnOiBxdWVzdGlvbi5hcmlhSW52YWxpZCwgJ2FyaWEtZGVzY3JpYmVkYnknOiBxdWVzdGlvbi5hcmlhRGVzY3JpYmVkQnl9LCBcXG4gIGV2ZW50OiB7IGlucHV0OiAocywgZSkgPT4gcXVlc3Rpb24ub25JbnB1dChlKSwga2V5ZG93bjogKHMsIGUpID0+IHsgcXVlc3Rpb24ub25LZXlEb3duKGUpOyByZXR1cm4gdHJ1ZTsgfSB9LCBcXG4gIHZhbHVlOiBxdWVzdGlvbi52YWx1ZSwgXFxuICBzdHlsZTogeyByZXNpemU6IHF1ZXN0aW9uLmF1dG9Hcm93ID8gJ25vbmUnIDogJ2JvdGgnfSxcXG4gIGNzczogcXVlc3Rpb24uZ2V0Q29udHJvbENsYXNzKClcXFwiPjwvdGV4dGFyZWE+XFxuPCEtLS9rby0tPlxcblxcbjwhLS1rbyBpZjogcXVlc3Rpb24uaXNSZWFkT25seVJlbmRlckRpdigpIC0tPlxcbjxkaXYgZGF0YS1iaW5kPVxcXCJ0ZXh0OiBxdWVzdGlvbi52YWx1ZVxcXCI+PC9kaXY+XFxuPCEtLS9rby0tPlxcbjwvc2NyaXB0PlwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1jb21wb3NpdGVcXFwiPlxcbiAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXBhbmVsJywgZGF0YTogcXVlc3Rpb24uY29udGVudFBhbmVsLCBhczogJ3F1ZXN0aW9uJywgYWZ0ZXJSZW5kZXI6IHF1ZXN0aW9uLmNvbnRlbnRQYW5lbC5rb1BhbmVsQWZ0ZXJSZW5kZXIgfSAtLT5cXG4gIDwhLS0gL2tvIC0tPlxcbjwvc2NyaXB0PlxcblwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1jdXN0b21cXFwiPlxcbiAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiBxdWVzdGlvbi5jb250ZW50UXVlc3Rpb24ua29UZW1wbGF0ZU5hbWUoKSwgZGF0YTogcXVlc3Rpb24uY29udGVudFF1ZXN0aW9uLCBhczogJ3F1ZXN0aW9uJywgYWZ0ZXJSZW5kZXI6IHF1ZXN0aW9uLmNvbnRlbnRRdWVzdGlvbi5rb1F1ZXN0aW9uQWZ0ZXJSZW5kZXIgfSAtLT5cXG4gIDwhLS0gL2tvIC0tPlxcbjwvc2NyaXB0PlxcblwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1kcm9wZG93blxcXCI+XFxuICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLnNlbGVjdFdyYXBwZXJcXFwiPlxcbiAgICA8IS0tIGtvIGlmbm90OiBxdWVzdGlvbi5pc1JlYWRPbmx5IC0tPlxcbiAgICA8c2VsZWN0XFxuICAgICAgZGF0YS1iaW5kPVxcXCJpZjogdHJ1ZSwgYXR0cjoge2lkOiBxdWVzdGlvbi5pbnB1dElkLCBhdXRvQ29tcGxldGU6IHF1ZXN0aW9uLmF1dG9Db21wbGV0ZSwgcmVxdWlyZWQ6IHF1ZXN0aW9uLmlzUmVxdWlyZWQsICdhcmlhLXJlcXVpcmVkJzogcXVlc3Rpb24uYXJpYVJlcXVpcmVkLCAnYXJpYS1sYWJlbCc6IHF1ZXN0aW9uLmFyaWFMYWJlbCwgJ2FyaWEtaW52YWxpZCc6IHF1ZXN0aW9uLmFyaWFJbnZhbGlkLCAnYXJpYS1kZXNjcmliZWRieSc6IHF1ZXN0aW9uLmFyaWFEZXNjcmliZWRCeX0sIGRpc2FibGU6IHF1ZXN0aW9uLmlzSW5wdXRSZWFkT25seSwgdmFsdWU6IHF1ZXN0aW9uLnJlbmRlcmVkVmFsdWUsIHZhbHVlQWxsb3dVbnNldDogdHJ1ZSwgY3NzOiBxdWVzdGlvbi5nZXRDb250cm9sQ2xhc3MoKVxcXCI+XFxuICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24uc2hvd09wdGlvbnNDYXB0aW9uIC0tPlxcbiAgICAgIDxvcHRpb24gZGF0YS1iaW5kPVxcXCJ0ZXh0OnF1ZXN0aW9uLm9wdGlvbnNDYXB0aW9uLCB2YWx1ZTogbnVsbFxcXCI+PC9vcHRpb24+XFxuICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgPCEtLSBrbyBmb3JlYWNoOiBxdWVzdGlvbi52aXNpYmxlQ2hvaWNlcyAtLT5cXG4gICAgICA8b3B0aW9uIGRhdGEtYmluZD1cXFwidmFsdWU6ICRkYXRhLnZhbHVlLCB0ZXh0OiAkZGF0YS50ZXh0LCBhdHRyOiB7IGRpc2FibGVkOiAhJGRhdGEuaXNFbmFibGVkIH1cXFwiPjwvb3B0aW9uPlxcbiAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICA8L3NlbGVjdD5cXG4gICAgPCEtLSAva28gLS0+XFxuICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmlzUmVhZE9ubHkgLS0+XFxuICAgICAgPGRpdiBkaXNhYmxlZFxcbiAgICAgIGRhdGEtYmluZD1cXFwiYXR0cjoge2lkOiBxdWVzdGlvbi5pbnB1dElkfSwgdGV4dDogcXVlc3Rpb24uaGFzT3RoZXIgJiYgcXVlc3Rpb24uaXNPdGhlclNlbGVjdGVkID8gcXVlc3Rpb24ub3RoZXJUZXh0IDogcXVlc3Rpb24uZGlzcGxheVZhbHVlLCBjc3M6IHF1ZXN0aW9uLmdldENvbnRyb2xDbGFzcygpXFxcIj5cXG4gICAgICA8L2Rpdj5cXG4gICAgPCEtLSAva28gLS0+XFxuICA8L2Rpdj5cXG4gIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmhhc090aGVyIC0tPlxcbiAgPGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCJcXG4gICAgZGF0YS1iaW5kPVxcXCJ0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LWNvbW1lbnQnLCBkYXRhOiB7J3F1ZXN0aW9uJzogcXVlc3Rpb24sICd2aXNpYmxlJzogcXVlc3Rpb24uaXNPdGhlclNlbGVjdGVkIH0gfSwgc3R5bGU6IHtkaXNwbGF5OiBxdWVzdGlvbi5pc0Zsb3dMYXlvdXQgPyAnaW5saW5lJzogJyd9XFxcIj5cXG4gIDwvZGl2PlxcbiAgPCEtLSAva28gLS0+XFxuPC9zY3JpcHQ+XFxuXCI7IiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uLWVtcHR5XFxcIj5cXG4gICAgPGRpdj48L2Rpdj5cXG48L3NjcmlwdD5cXG5cIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcXVlc3Rpb24tZXJyb3JzXFxcIj5cXG4gICAgICAgIDxkaXYgcm9sZT1cXFwiYWxlcnRcXFwiIGFyaWEtbGl2ZT1cXFwicG9saXRlXFxcIiBkYXRhLWJpbmQ9XFxcInZpc2libGU6IGhhc1Zpc2libGVFcnJvcnMsIGZvcmVhY2g6IHsgZGF0YTogZXJyb3JzLCBhczogJ2Vycm9yJyB9LCBjc3M6IGtvRXJyb3JDbGFzcygpLCBhdHRyOiB7IGlkOiBxdWVzdGlvbi5pZCArICdfZXJyb3JzJyB9XFxcIj5cXG4gICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwidmlzaWJsZTogZXJyb3IudmlzaWJsZVxcXCI+ICAgXFxuICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5lcnJvci5pY29uXFxcIj48L3NwYW4+XFxuICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLmVycm9yLml0ZW1cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IGVycm9yLmxvY1RleHQgfSAtLT48IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuPC9zY3JpcHQ+XCI7IiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uLWV4cHJlc3Npb25cXFwiPlxcbiAgPGRpdiBkYXRhLWJpbmQ9XFxcInRleHQ6cXVlc3Rpb24uZGlzcGxheVZhbHVlLCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkucm9vdFxcXCI+PC9kaXY+XFxuPC9zY3JpcHQ+XFxuXCI7IiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uLWZpbGVcXFwiPlxcbiAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5yb290XFxcIj5cXG4gICAgICA8IS0tIGtvIGlmbm90OiBxdWVzdGlvbi5pc0lucHV0UmVhZE9ubHkgLS0+XFxuICAgICAgPGlucHV0IHR5cGU9XFxcImZpbGVcXFwiIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5jc3NDbGFzc2VzLmZpbGVJbnB1dCwgYXR0cjogeyBpZDogcXVlc3Rpb24uaW5wdXRJZCwgJ2FyaWEtcmVxdWlyZWQnOiBxdWVzdGlvbi5hcmlhUmVxdWlyZWQsICdhcmlhLWxhYmVsJzogcXVlc3Rpb24uYXJpYUxhYmVsLCAnYXJpYS1pbnZhbGlkJzogcXVlc3Rpb24uYXJpYUludmFsaWQsICdhcmlhLWRlc2NyaWJlZGJ5JzogcXVlc3Rpb24uYXJpYURlc2NyaWJlZEJ5LCBtdWx0aXBsZTogcXVlc3Rpb24uYWxsb3dNdWx0aXBsZSA/ICdtdWx0aXBsZScgOiB1bmRlZmluZWQsIHRpdGxlOiBrb0lucHV0VGl0bGUsIGFjY2VwdDogcXVlc3Rpb24uYWNjZXB0ZWRUeXBlcyB9LCBldmVudDogeyBjaGFuZ2U6IHF1ZXN0aW9uLmRvY2hhbmdlIH1cXFwiPlxcbiAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmlzUmVhZE9ubHkgLS0+XFxuICAgICAgPGlucHV0IHR5cGU9XFxcImZpbGVcXFwiIGRpc2FibGVkIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5nZXRSZWFkT25seUZpbGVDc3MoKSwgYXR0cjogeyBwbGFjZWhvbGRlcjogcXVlc3Rpb24udGl0bGUgfVxcXCIgc3R5bGU9XFxcImNvbG9yOiB0cmFuc3BhcmVudDtcXFwiLz5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5nZXRGaWxlRGVjb3JhdG9yQ3NzKCksIGV2ZW50OiB7IGRyYWdvdmVyOiBxdWVzdGlvbi5vbmRyYWdvdmVyLCBkcm9wOiBxdWVzdGlvbi5vbmRyb3AsIGRyYWdsZWF2ZTogcXVlc3Rpb24ub25kcmFnbGVhdmUgfVxcXCI+XFxuICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5kcmFnQXJlYVBsYWNlaG9sZGVyLCB0ZXh0OiBxdWVzdGlvbi5kcmFnQXJlYVBsYWNlaG9sZGVyXFxcIj48L3NwYW4+XFxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLndyYXBwZXJcXFwiPlxcbiAgICAgICAgICA8bGFiZWwgcm9sZT1cXFwiYnV0dG9uXFxcIiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29DaG9vc2VGaWxlQ3NzLCBhdHRyOiB7IGZvcjogcXVlc3Rpb24uaW5wdXRJZCwgJ2FyaWEtbGFiZWwnOiBxdWVzdGlvbi5jaG9vc2VCdXR0b25DYXB0aW9uIH0sIHRleHQ6IHF1ZXN0aW9uLmNob29zZUJ1dHRvbkNhcHRpb25cXFwiPjwvbGFiZWw+XFxuICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLm5vRmlsZUNob3NlbiwgdmlzaWJsZTogIXF1ZXN0aW9uLmtvSGFzVmFsdWUoKSwgdGV4dDogcXVlc3Rpb24ubm9GaWxlQ2hvc2VuQ2FwdGlvblxcXCI+PC9zcGFuPlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgPC9kaXY+XFxuICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24ua29IYXNWYWx1ZSgpICYmICFxdWVzdGlvbi5pc1JlYWRPbmx5IC0tPlxcbiAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24uY3NzQ2xhc3Nlcy5yZW1vdmVCdXR0b24sIGRpc2FibGVkOiBxdWVzdGlvbi5pc0lucHV0UmVhZE9ubHksIGNsaWNrOiBxdWVzdGlvbi5kb2NsZWFuLCB0ZXh0OiBxdWVzdGlvbi5jbGVhbkJ1dHRvbkNhcHRpb25cXFwiPjwvYnV0dG9uPlxcbiAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmNzc0NsYXNzZXMuZmlsZUxpc3QsIGZvcmVhY2g6IHF1ZXN0aW9uLmtvRGF0YSwgdmlzaWJsZTogcXVlc3Rpb24ua29IYXNWYWx1ZVxcXCI+XFxuICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwidmlzaWJsZTogcXVlc3Rpb24uc2hvd1ByZXZpZXcsIGNzczogcXVlc3Rpb24uY3NzQ2xhc3Nlcy5wcmV2aWV3XFxcIj5cXG4gICAgICAgICAgICAgIDwhLS0ga28gaWY6ICRkYXRhLm5hbWUgLS0+XFxuICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLmZpbGVTaWduXFxcIj5cXG4gICAgICAgICAgICAgIDxhIGRhdGEtYmluZD1cXFwic3R5bGU6IHsgd2lkdGg6IHF1ZXN0aW9uLmltYWdlV2lkdGggKyAncHgnIH0sIGNsaWNrOiBxdWVzdGlvbi5kb2Rvd25sb2FkLCB0ZXh0OiAkZGF0YS5uYW1lLFxcbiAgICAgICAgICAgICAgYXR0cjogeyBocmVmOiAkZGF0YS5jb250ZW50LCB0aXRsZTogJGRhdGEubmFtZSwgZG93bmxvYWQ6ICRkYXRhLm5hbWUgfVxcXCI+PC9hPlxcbiAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmNhblByZXZpZXdJbWFnZSgkZGF0YSkgLS0+XFxuICAgICAgICAgICAgICA8aW1nIGRhdGEtYmluZD1cXFwiYXR0cjogeyBzcmM6ICRkYXRhLmNvbnRlbnQsIGhlaWdodDogcXVlc3Rpb24uaW1hZ2VIZWlnaHQsIHdpZHRoOiBxdWVzdGlvbi5pbWFnZVdpZHRoIH1cXFwiIGFsdD1cXFwiRmlsZSBwcmV2aWV3XFxcIj5cXG4gICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgPCEtLSBrbyBpZm5vdDogcXVlc3Rpb24uY2FuUHJldmlld0ltYWdlKCRkYXRhKSAtLT5cXG4gICAgICAgICAgICAgIDxpbWcgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuZGVmYXVsdEltYWdlLCBhdHRyOiB7IGhlaWdodDogcXVlc3Rpb24uaW1hZ2VIZWlnaHQsIHdpZHRoOiBxdWVzdGlvbi5pbWFnZVdpZHRoIH1cXFwiPlxcbiAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICA8IS0tIGtvIGlmOiAkZGF0YS5uYW1lIC0tPlxcbiAgICAgICAgICAgICAgPCEtLSBrbyBpZm5vdDogcXVlc3Rpb24uaXNSZWFkT25seSAtLT5cXG4gICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjbGljazogcXVlc3Rpb24uZG9yZW1vdmVmaWxlLCBjc3M6IHF1ZXN0aW9uLmNzc0NsYXNzZXMucmVtb3ZlRmlsZUJ1dHRvblxcXCI+XFxuICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmNzc0NsYXNzZXMucmVtb3ZlRmlsZSwgdGV4dDogcXVlc3Rpb24ucmVtb3ZlRmlsZUNhcHRpb25cXFwiPjwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICA8c3ZnIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5jc3NDbGFzc2VzLnJlbW92ZUZpbGVTdmcsIHRpdGxlOiBxdWVzdGlvbi5yZW1vdmVGaWxlQ2FwdGlvbiwgY2xpY2s6IHF1ZXN0aW9uLmRvcmVtb3ZlZmlsZVxcXCIgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XFxcIk04LDJDNC43LDIsMiw0LjcsMiw4czIuNyw2LDYsNnM2LTIuNyw2LTZTMTEuMywyLDgsMnogTTExLDEwbC0xLDFMOCw5bC0yLDJsLTEtMWwyLTJMNSw2bDEtMWwyLDJsMi0ybDEsMUw5LDggTDExLDEwelxcXCIvPlxcbiAgICAgICAgICAgICAgICAgIDwvc3ZnPlxcbiAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgIDwhLS0ga28gaWY6ICRkYXRhLm5hbWUgLS0+XFxuICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLmZpbGVTaWduQm90dG9tXFxcIj5cXG4gICAgICAgICAgICAgICAgPGEgZGF0YS1iaW5kPVxcXCJzdHlsZTogeyB3aWR0aDogcXVlc3Rpb24uaW1hZ2VXaWR0aCArICdweCcgfSwgY2xpY2s6IHF1ZXN0aW9uLmRvZG93bmxvYWQsIHRleHQ6ICRkYXRhLm5hbWUsIGF0dHI6IHsgaHJlZjogJGRhdGEuY29udGVudCwgdGl0bGU6ICRkYXRhLm5hbWUsIGRvd25sb2FkOiAkZGF0YS5uYW1lIH1cXFwiPjwvYT5cXG4gICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgPC9zcGFuPlxcbiAgICAgIDwvZGl2PlxcbiAgICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmtvSGFzVmFsdWUoKSAmJiAhcXVlc3Rpb24uaXNSZWFkT25seSAtLT5cXG4gICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmNzc0NsYXNzZXMucmVtb3ZlQnV0dG9uQm90dG9tLCBkaXNhYmxlZDogcXVlc3Rpb24uaXNJbnB1dFJlYWRPbmx5LCBjbGljazogcXVlc3Rpb24uZG9jbGVhbiwgdGV4dDogcXVlc3Rpb24uY2xlYW5CdXR0b25DYXB0aW9uXFxcIj48L2J1dHRvbj5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gIDwvZGl2Plxcbjwvc2NyaXB0PlxcblwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1odG1sXFxcIj5cXG4gIDxkaXYgZGF0YS1iaW5kPVxcXCJodG1sOiBxdWVzdGlvbi5sb2NIdG1sLmtvUmVuZGVyZWRIdG1sLCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkucm9vdFxcXCI+PC9kaXY+XFxuPC9zY3JpcHQ+XFxuXCI7IiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uLWltYWdlXFxcIj5cXG4gIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkucm9vdFxcXCI+XFxuICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmNvbnRlbnRNb2RlID09PSBcXFwiaW1hZ2VcXFwiIC0tPlxcbiAgICA8aW1nIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLmltYWdlLCBhdHRyOiB7IHNyYzogJGRhdGEubG9jSW1hZ2VMaW5rLmtvUmVuZGVyZWRIdG1sKCksIHdpZHRoOiBxdWVzdGlvbi5pbWFnZVdpZHRoID8gcXVlc3Rpb24uaW1hZ2VXaWR0aCArICdweCcgOiB1bmRlZmluZWQsIGhlaWdodDogcXVlc3Rpb24uaW1hZ2VIZWlnaHQgPyBxdWVzdGlvbi5pbWFnZUhlaWdodCArICdweCcgOiB1bmRlZmluZWQsIGFsdDogcXVlc3Rpb24udGV4dCB8fCBxdWVzdGlvbi50aXRsZSB9LCBzdHlsZTogeyBvYmplY3RGaXQ6IHF1ZXN0aW9uLmltYWdlRml0IH1cXFwiLz5cXG4gICAgPCEtLSAva28gLS0+XFxuICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmNvbnRlbnRNb2RlID09PSBcXFwidmlkZW9cXFwiIC0tPlxcbiAgICA8ZW1iZWQgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuaW1hZ2UsIGF0dHI6IHsgc3JjOiAkZGF0YS5sb2NJbWFnZUxpbmsua29SZW5kZXJlZEh0bWwoKSwgd2lkdGg6IHF1ZXN0aW9uLmltYWdlV2lkdGggPyBxdWVzdGlvbi5pbWFnZVdpZHRoICsgJ3B4JyA6IHVuZGVmaW5lZCwgaGVpZ2h0OiBxdWVzdGlvbi5pbWFnZUhlaWdodCA/IHF1ZXN0aW9uLmltYWdlSGVpZ2h0ICsgJ3B4JyA6IHVuZGVmaW5lZCB9LCBzdHlsZTogeyBvYmplY3RGaXQ6IHF1ZXN0aW9uLmltYWdlRml0IH1cXFwiLz5cXG4gICAgPCEtLSAva28gLS0+XFxuICA8L2Rpdj5cXG48L3NjcmlwdD5cXG5cIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcXVlc3Rpb24taW1hZ2VwaWNrZXJcXFwiPlxcbiAgPGZpZWxkc2V0IGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLnJvb3RcXFwiPlxcbiAgICAgIDxsZWdlbmQgZGF0YS1iaW5kPVxcXCJhdHRyOiB7ICdhcmlhLWxhYmVsJzogcXVlc3Rpb24ubG9jVGl0bGUucmVuZGVyZWRIdG1sIH1cXFwiIHJvbGU9XFxcInJhZGlvXFxcIj48L2xlZ2VuZD5cXG4gICAgICA8IS0tIGtvIGZvcmVhY2g6IHsgZGF0YTogcXVlc3Rpb24udmlzaWJsZUNob2ljZXMsIGFzOiAnaXRlbScsIGFmdGVyUmVuZGVyOiBxdWVzdGlvbi5rb0FmdGVyUmVuZGVyfSAgLS0+XFxuICAgICAgICA8IS0tIGtvIGNvbXBvbmVudDogeyBuYW1lOiBxdWVzdGlvbi5nZXRJdGVtVmFsdWVXcmFwcGVyQ29tcG9uZW50TmFtZShpdGVtKSwgcGFyYW1zOiB7IGNvbXBvbmVudERhdGE6ICBxdWVzdGlvbi5nZXRJdGVtVmFsdWVXcmFwcGVyQ29tcG9uZW50RGF0YShpdGVtKSwgdGVtcGxhdGVEYXRhOiB7IG5hbWU6ICdzdXJ2ZXktaW1hZ2VwaWNrZXItaXRlbScsIGRhdGE6IGl0ZW0gfSB9IH0gLS0+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gIDwvZmllbGRzZXQ+XFxuPC9zY3JpcHQ+XFxuPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktaW1hZ2VwaWNrZXItaXRlbVxcXCI+XFxuICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmdldEl0ZW1DbGFzcyhpdGVtKVxcXCI+XFxuICAgICAgICA8bGFiZWwgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkubGFiZWxcXFwiPlxcbiAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cXFwiZGlzcGxheTogbm9uZTtcXFwiIGRhdGEtYmluZD1cXFwiYXR0cjoge3R5cGU6IHF1ZXN0aW9uLm11bHRpU2VsZWN0ID8gJ2NoZWNrYm94JyA6ICdyYWRpbycsIG5hbWU6IHF1ZXN0aW9uLm5hbWUgKyAnXycgKyBxdWVzdGlvbi5pZCwgdmFsdWU6IGl0ZW0udmFsdWUsIGlkOiBxdWVzdGlvbi5pbnB1dElkICsgJ18nICsgaXRlbS52YWx1ZSwgJ2FyaWEtcmVxdWlyZWQnOiBxdWVzdGlvbi5hcmlhUmVxdWlyZWQsICdhcmlhLWxhYmVsJzogcXVlc3Rpb24uYXJpYUxhYmVsLCAnYXJpYS1pbnZhbGlkJzogcXVlc3Rpb24uYXJpYUludmFsaWQsICdhcmlhLWRlc2NyaWJlZGJ5JzogcXVlc3Rpb24uYXJpYURlc2NyaWJlZEJ5fSwgY2hlY2tlZDogcXVlc3Rpb24ua29WYWx1ZSwgZW5hYmxlOiAhcXVlc3Rpb24uaXNJbnB1dFJlYWRPbmx5ICYmIGl0ZW0uaXNFbmFibGVkLCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuaXRlbUNvbnRyb2xcXFwiXFxuICAgICAgICAgICAgLz5cXG4gICAgICAgICAgICA8ZGl2PlxcbiAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5jb250ZW50TW9kZSA9PT0gXFxcImltYWdlXFxcIiAtLT5cXG4gICAgICAgICAgICAgICAgPGltZyBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5pbWFnZSwgYXR0cjogeyBzcmM6ICRkYXRhLmxvY0ltYWdlTGluay5rb1JlbmRlcmVkSHRtbCwgd2lkdGg6IHF1ZXN0aW9uLmltYWdlV2lkdGggPyBxdWVzdGlvbi5pbWFnZVdpZHRoICsgJ3B4JyA6IHVuZGVmaW5lZCwgaGVpZ2h0OiBxdWVzdGlvbi5pbWFnZUhlaWdodCA/IHF1ZXN0aW9uLmltYWdlSGVpZ2h0ICsgJ3B4JyA6IHVuZGVmaW5lZCwgYWx0OiBpdGVtLmxvY1RleHQua29SZW5kZXJlZEh0bWwgfSwgc3R5bGU6IHsgb2JqZWN0Rml0OiBxdWVzdGlvbi5pbWFnZUZpdCB9XFxcIi8+XFxuICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5jb250ZW50TW9kZSA9PT0gXFxcInZpZGVvXFxcIiAtLT5cXG4gICAgICAgICAgICAgICAgPGVtYmVkIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLmltYWdlLCBhdHRyOiB7IHNyYzogJGRhdGEubG9jSW1hZ2VMaW5rLmtvUmVuZGVyZWRIdG1sLCB3aWR0aDogcXVlc3Rpb24uaW1hZ2VXaWR0aCA/IHF1ZXN0aW9uLmltYWdlV2lkdGggKyAncHgnIDogdW5kZWZpbmVkLCBoZWlnaHQ6IHF1ZXN0aW9uLmltYWdlSGVpZ2h0ID8gcXVlc3Rpb24uaW1hZ2VIZWlnaHQgKyAncHgnIDogdW5kZWZpbmVkIH0sIHN0eWxlOiB7IG9iamVjdEZpdDogcXVlc3Rpb24uaW1hZ2VGaXQgfVxcXCIvPlxcbiAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24uc2hvd0xhYmVsIC0tPlxcbiAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5pdGVtVGV4dCwgYXR0cjogeyB0aXRsZTogaXRlbS5sb2NUZXh0LmtvUmVuZGVyZWRIdG1sIH1cXFwiPlxcbiAgICAgICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiBpdGVtLmxvY1RleHQgfSAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2xhYmVsPlxcbiAgICA8L2Rpdj5cXG48L3NjcmlwdD5cIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcXVlc3Rpb24tbWF0cml4XFxcIj5cXG4gIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkudGFibGVXcmFwcGVyXFxcIj5cXG4gICAgPGZpZWxkc2V0PlxcbiAgICAgIDxsZWdlbmRcXG4gICAgICAgIGRhdGEtYmluZD1cXFwiYXR0cjogeyAnYXJpYS1sYWJlbCc6IHF1ZXN0aW9uLmxvY1RpdGxlLnJlbmRlcmVkSHRtbCB9XFxcIlxcbiAgICAgID48L2xlZ2VuZD5cXG4gICAgICA8dGFibGUgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkucm9vdFxcXCI+XFxuICAgICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5zaG93SGVhZGVyIC0tPlxcbiAgICAgICAgPHRoZWFkPlxcbiAgICAgICAgICA8dHI+XFxuICAgICAgICAgICAgPHRkIGRhdGEtYmluZD1cXFwidmlzaWJsZTogcXVlc3Rpb24uaGFzUm93c1xcXCI+PC90ZD5cXG4gICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IHF1ZXN0aW9uLmtvVmlzaWJsZUNvbHVtbnMgLS0+XFxuICAgICAgICAgICAgPHRoIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLmhlYWRlckNlbGxcXFwiPlxcbiAgICAgICAgICAgICAgPCEtLSBrbyBjb21wb25lbnQ6IHsgbmFtZTogcXVlc3Rpb24uZ2V0Q29sdW1uSGVhZGVyV3JhcHBlckNvbXBvbmVudE5hbWUoJGRhdGEpLCBwYXJhbXM6IHsgY29tcG9uZW50RGF0YTogIHF1ZXN0aW9uLmdldENvbHVtbkhlYWRlcldyYXBwZXJDb21wb25lbnREYXRhKCRkYXRhKSwgdGVtcGxhdGVEYXRhOiB7IGRhdGE6ICRkYXRhIH0gfSB9IC0tPlxcbiAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogJGRhdGEubG9jVGV4dCB9IC0tPjwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPC90aD5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgPC90cj5cXG4gICAgICAgIDwvdGhlYWQ+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgIDx0Ym9keT5cXG4gICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiB7IGRhdGE6IHF1ZXN0aW9uLmtvVmlzaWJsZVJvd3MsIGFzOiAncm93JyB9IC0tPlxcbiAgICAgICAgICA8dHIgZGF0YS1iaW5kPVxcXCJjc3M6IHJvdy5yb3dDbGFzc2VzXFxcIj5cXG4gICAgICAgICAgICA8dGRcXG4gICAgICAgICAgICAgIGRhdGEtYmluZD1cXFwidmlzaWJsZTogcXVlc3Rpb24uaGFzUm93cywgY3NzOiBxdWVzdGlvbi5rb0NzcygpLmNlbGxcXFwiXFxuICAgICAgICAgICAgPlxcbiAgICAgICAgICAgICAgPCEtLSBrbyBjb21wb25lbnQ6IHsgbmFtZTogcXVlc3Rpb24uZ2V0Um93SGVhZGVyV3JhcHBlckNvbXBvbmVudE5hbWUoJGRhdGEpLCBwYXJhbXM6IHsgY29tcG9uZW50RGF0YTogIHF1ZXN0aW9uLmdldFJvd0hlYWRlcldyYXBwZXJDb21wb25lbnREYXRhKCRkYXRhKSwgdGVtcGxhdGVEYXRhOiB7IGRhdGE6ICRkYXRhIH0gfSB9IC0tPlxcbiAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogcm93LmxvY1RleHQgfSAtLT5cXG4gICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8L3RkPlxcbiAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogcXVlc3Rpb24ua29WaXNpYmxlQ29sdW1ucyAtLT5cXG4gICAgICAgICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5oYXNDZWxsVGV4dCAtLT5cXG4gICAgICAgICAgICA8dGRcXG4gICAgICAgICAgICAgIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5nZXRJdGVtQ2xhc3Mocm93LCAkZGF0YSksIGNsaWNrOiBmdW5jdGlvbigpIHsgaWYgKCFxdWVzdGlvbi5pc0lucHV0UmVhZE9ubHkpIHsgcm93LmNlbGxDbGljaygkZGF0YSk7IH0gfVxcXCJcXG4gICAgICAgICAgICA+XFxuICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogcXVlc3Rpb24uZ2V0Q2VsbERpc3BsYXlMb2NUZXh0KHJvdy5uYW1lLCAkZGF0YSkgfSAtLT5cXG4gICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwvdGQ+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPCEtLSBrbyBpZjogIXF1ZXN0aW9uLmhhc0NlbGxUZXh0IC0tPlxcbiAgICAgICAgICAgIDx0ZFxcbiAgICAgICAgICAgICAgZGF0YS1iaW5kPVxcXCJhdHRyOiB7IHRpdGxlOiAkZGF0YS5sb2NUZXh0LnJlbmRlcmVkSHRtbCB9LCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuY2VsbFxcXCJcXG4gICAgICAgICAgICA+XFxuICAgICAgICAgICAgICA8bGFiZWwgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmdldEl0ZW1DbGFzcyhyb3csICRkYXRhKVxcXCI+XFxuICAgICAgICAgICAgICAgIDxpbnB1dFxcbiAgICAgICAgICAgICAgICAgIHR5cGU9XFxcInJhZGlvXFxcIlxcbiAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLml0ZW1WYWx1ZSwgYXR0cjogeyBuYW1lOiByb3cuZnVsbE5hbWUsICdhcmlhLXJlcXVpcmVkJzogcXVlc3Rpb24uYXJpYVJlcXVpcmVkLCAnYXJpYS1sYWJlbCc6IHF1ZXN0aW9uLmFyaWFMYWJlbCwgJ2FyaWEtaW52YWxpZCc6IHF1ZXN0aW9uLmFyaWFJbnZhbGlkLCAnYXJpYS1kZXNjcmliZWRieSc6IHF1ZXN0aW9uLmFyaWFEZXNjcmliZWRCeSwgaWQ6IHF1ZXN0aW9uLmlucHV0SWQgKyAnXycgKyByb3cubmFtZSArICdfJyArICRpbmRleCgpIH0sIGNoZWNrZWRWYWx1ZTogJGRhdGEudmFsdWUsIGNoZWNrZWQ6IHJvdy52YWx1ZSwgZW5hYmxlOiAhcXVlc3Rpb24uaXNJbnB1dFJlYWRPbmx5XFxcIlxcbiAgICAgICAgICAgICAgICAvPlxcbiAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5tYXRlcmlhbERlY29yYXRvclxcXCI+XFxuICAgICAgICAgICAgICAgICAgPHN2Z1xcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVxcXCJjc3M6cXVlc3Rpb24ua29Dc3MoKS5pdGVtRGVjb3JhdG9yXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cXFwiLTEyIC0xMiAyNCAyNFxcXCJcXG4gICAgICAgICAgICAgICAgICA+XFxuICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIHI9XFxcIjZcXFwiIGN4PVxcXCIwXFxcIiBjeT1cXFwiMFxcXCIgLz5cXG4gICAgICAgICAgICAgICAgICA8L3N2Zz5cXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiY2lyY2xlXFxcIj48L3NwYW4+XFxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJjaGVja1xcXCI+PC9zcGFuPlxcbiAgICAgICAgICAgICAgICA8c3BhblxcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVxcXCJkaXNwbGF5OiBub25lXFxcIlxcbiAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cXFwidGV4dDogJGRhdGEubG9jVGV4dC50ZXh0XFxcIlxcbiAgICAgICAgICAgICAgICA+PC9zcGFuPlxcbiAgICAgICAgICAgICAgPC9sYWJlbD5cXG4gICAgICAgICAgICA8L3RkPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgIDwvdGJvZHk+XFxuICAgICAgPC90YWJsZT5cXG4gICAgPC9maWVsZHNldD5cXG4gIDwvZGl2Plxcbjwvc2NyaXB0PlxcbjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXRleHRcXFwiPlxcbiAgPHNwYW4gZGF0YS1iaW5kPVxcXCJ0ZXh0OiRkYXRhLnJlbmRlcmVkSHRtbFxcXCI+PC9zcGFuPlxcbjwvc2NyaXB0PlxcblwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCLvu788c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1tYXRyaXhkeW5hbWljXFxcIj5cXG4gICAgPGRpdj5cXG4gICAgPCEtLSBrbyBpZjogcXVlc3Rpb24ua29UYWJsZSgpLnNob3dBZGRSb3dPblRvcCAtLT5cXG4gICAgPGRpdlxcbiAgICAgIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLmZvb3RlclxcXCJcXG4gICAgPlxcbiAgICAgIDxidXR0b25cXG4gICAgICAgIHR5cGU9XFxcImJ1dHRvblxcXCJcXG4gICAgICAgIGRhdGEtYmluZD1cXFwiY2xpY2s6IHF1ZXN0aW9uLmlzRGVzaWduTW9kZSA/IHVuZGVmaW5lZCA6IHF1ZXN0aW9uLmtvQWRkUm93Q2xpY2ssIGNzczogcXVlc3Rpb24uZ2V0QWRkUm93QnV0dG9uQ3NzKCksIGRpc2FibGU6IHF1ZXN0aW9uLmlzSW5wdXRSZWFkT25seVxcXCJcXG4gICAgICA+XFxuICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogcXVlc3Rpb24ubG9jQWRkUm93VGV4dCB9IC0tPjwhLS0gL2tvIC0tPlxcbiAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuaWNvbkFkZFxcXCI+PC9zcGFuPlxcbiAgICAgIDwvYnV0dG9uPlxcbiAgICA8L2Rpdj5cXG4gICAgPCEtLSAva28gLS0+XFxuICAgIDxkaXZcXG4gICAgICBkYXRhLWJpbmQ9XFxcInZpc2libGU6IHF1ZXN0aW9uLmtvVGFibGUoKS5zaG93VGFibGUsIHN0eWxlOiB7IG92ZXJmbG93WDogcXVlc3Rpb24uaG9yaXpvbnRhbFNjcm9sbCA/ICdzY3JvbGwnOiAnJyB9XFxcIlxcbiAgICA+XFxuICAgICAgPHRhYmxlIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLnJvb3RcXFwiPlxcbiAgICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24ua29UYWJsZSgpLnNob3dIZWFkZXIgLS0+XFxuICAgICAgICA8dGhlYWQ+XFxuICAgICAgICAgIDx0cj5cXG4gICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IHF1ZXN0aW9uLmtvVGFibGUoKS5oZWFkZXJSb3cuY2VsbHMgLS0+XFxuICAgICAgICAgICAgPHRoXFxuICAgICAgICAgICAgICBkYXRhLWJpbmQ9XFxcInN0eWxlOiB7IG1pbldpZHRoOiAkZGF0YS5taW5XaWR0aCwgd2lkdGg6ICRkYXRhLndpZHRoIH0sIGNzczogcXVlc3Rpb24ua29Dc3MoKS5oZWFkZXJDZWxsXFxcIlxcbiAgICAgICAgICAgID5cXG4gICAgICAgICAgICAgIDwhLS0ga28gaWY6ICRkYXRhLmhhc1RpdGxlIC0tPlxcbiAgICAgICAgICAgICAgPCEtLSBrbyBjb21wb25lbnQ6IHsgbmFtZTogcXVlc3Rpb24uZ2V0Q29sdW1uSGVhZGVyV3JhcHBlckNvbXBvbmVudE5hbWUoJGRhdGEpLCBwYXJhbXM6IHsgY29tcG9uZW50RGF0YTogIHF1ZXN0aW9uLmdldENvbHVtbkhlYWRlcldyYXBwZXJDb21wb25lbnREYXRhKCRkYXRhKSwgdGVtcGxhdGVEYXRhOiB7IGRhdGE6ICRkYXRhIH0gfSB9IC0tPlxcbiAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogJGRhdGEubG9jVGl0bGUgfSAtLT48IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogJGRhdGEucmVxdWlyZWRUZXh0IC0tPlxcbiAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcInRleHQ6ICRkYXRhLnJlcXVpcmVkVGV4dFxcXCI+PC9zcGFuPlxcbiAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPC90aD5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgPC90cj5cXG4gICAgICAgIDwvdGhlYWQ+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgIDx0Ym9keT5cXG4gICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiBxdWVzdGlvbi5rb1RhYmxlKCkucm93cyAtLT5cXG4gICAgICAgICAgPCEtLSBrbyBpZm5vdDogJHBhcmVudC5kZXRhaWxQYW5lbE1vZGUgPT09IFxcXCJwb3B1cFxcXCIgJiYgJGRhdGEuaXNEZXRhaWxSb3cgLS0+XFxuICAgICAgICAgIDx0ciBkYXRhLWJpbmQ9XFxcImNzczogJGRhdGEuY2xhc3NOYW1lLCBhdHRyOiBhdHRyaWJ1dGVzXFxcIj5cXG4gICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6ICRkYXRhLmNlbGxzIC0tPlxcbiAgICAgICAgICAgIDwhLS0ga28gaWY6ICRkYXRhLmlzRHJhZ0hhbmRsZXJDZWxsIC0tPlxcbiAgICAgICAgICAgIDx0ZCBkYXRhLWJpbmQ9XFxcImNzczokZGF0YS5jbGFzc05hbWUsIGF0dHI6IHtjb2xzcGFuOiAkZGF0YS5jb2xTcGFuc31cXFwiPlxcbiAgICAgICAgICAgICAgPCEtLSBrbyBjb21wb25lbnQ6IHsgbmFtZTogJ3N2LW1hdHJpeC1kcmFnLWRyb3AtaWNvbicsIHBhcmFtczogeyBpdGVtOiB7IGRhdGE6IHsgcm93OiByb3csIHF1ZXN0aW9uOiBxdWVzdGlvbiB9IH0gfX0gLS0+XFxuICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8L3RkPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwhLS0ga28gaWY6ICRkYXRhLmlzQWN0aW9uc0NlbGwgLS0+XFxuICAgICAgICAgICAgPHRkIGRhdGEtYmluZD1cXFwiY3NzOiAkZGF0YS5jbGFzc05hbWUsIGF0dHI6IHsgY29sc3BhbjogJGRhdGEuY29sU3BhbnMgfVxcXCI+XFxuICAgICAgICAgICAgICA8IS0tIGtvIGNvbXBvbmVudDogeyBuYW1lOiAnc3YtYWN0aW9uLWJhcicsIHBhcmFtczogeyBtb2RlbDogJGRhdGEuaXRlbS5nZXREYXRhKCksIGhhbmRsZUNsaWNrOiBmYWxzZSB9IH0gLS0+XFxuICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8L3RkPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwhLS0ga28gaWY6ICRkYXRhLmlzRW1wdHkgLS0+XFxuICAgICAgICAgICAgPHRkIGRhdGEtYmluZD1cXFwiYXR0cjogeyBjb2xzcGFuOiAkZGF0YS5jb2xTcGFucyB9XFxcIj48L3RkPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwhLS0ga28gaWY6ICRkYXRhLmhhc1BhbmVsIC0tPlxcbiAgICAgICAgICAgIDx0ZCBkYXRhLWJpbmQ9XFxcImNzczogJGRhdGEuY2xhc3NOYW1lLCBhdHRyOiB7IGNvbHNwYW46ICRkYXRhLmNvbFNwYW5zIH1cXFwiPlxcbiAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAkZGF0YS5wYW5lbC5rb0VsZW1lbnRUeXBlLCBkYXRhOiAkZGF0YS5wYW5lbCwgYWZ0ZXJSZW5kZXI6IHF1ZXN0aW9uLmtvUGFuZWxBZnRlclJlbmRlciB9IC0tPlxcbiAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPC90ZD5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8IS0tIGtvIGlmOiAkZGF0YS5oYXNRdWVzdGlvbiAtLT5cXG4gICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktbWF0cml4Y2VsbCcsIGFmdGVyUmVuZGVyOiBmdW5jdGlvbihlbHMpIHsgJGRhdGEubWF0cml4LmtvQ2VsbEFmdGVyUmVuZGVyKGVscywgJGRhdGEpOyB9IH0gLS0+PCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPCEtLSBrbyBpZjogJGRhdGEuaGFzVGl0bGUgLS0+XFxuICAgICAgICAgICAgPHRkXFxuICAgICAgICAgICAgICBkYXRhLWJpbmQ9XFxcImNzczogJGRhdGEuY2xhc3NOYW1lLCBzdHlsZTogeyBtaW5XaWR0aDogJGRhdGEubWluV2lkdGgsIHdpZHRoOiAkZGF0YS53aWR0aCB9XFxcIlxcbiAgICAgICAgICAgID5cXG4gICAgICAgICAgICAgIDwhLS0ga28gY29tcG9uZW50OiB7IG5hbWU6IHF1ZXN0aW9uLmdldFJvd0hlYWRlcldyYXBwZXJDb21wb25lbnROYW1lKCRkYXRhKSwgcGFyYW1zOiB7IGNvbXBvbmVudERhdGE6ICBxdWVzdGlvbi5nZXRSb3dIZWFkZXJXcmFwcGVyQ29tcG9uZW50RGF0YSgkZGF0YSksIHRlbXBsYXRlRGF0YTogeyBkYXRhOiAkZGF0YSB9IH0gfSAtLT5cXG4gICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiAkZGF0YS5sb2NUaXRsZSB9IC0tPjwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgPCEtLSBrbyBpZjogJGRhdGEucmVxdWlyZWRUZXh0IC0tPlxcbiAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJ0ZXh0OiAkZGF0YS5yZXF1aXJlZFRleHRcXFwiPjwvc3Bhbj5cXG4gICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPC90ZD5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgPC90cj5cXG5cXG4gICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgPC90Ym9keT5cXG4gICAgICAgIDwhLS0ga28gaWY6cXVlc3Rpb24ua29UYWJsZSgpLmhhc0Zvb3RlciAtLT5cXG4gICAgICAgIDx0Zm9vdD5cXG4gICAgICAgICAgPHRyPlxcbiAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogcXVlc3Rpb24ua29UYWJsZSgpLmZvb3RlclJvdy5jZWxscyAtLT5cXG4gICAgICAgICAgICA8dGQ+XFxuICAgICAgICAgICAgICA8IS0tIGtvIGlmOiAkZGF0YS5oYXNRdWVzdGlvbiAtLT5cXG4gICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1tYXRyaXhjZWxsJywgYWZ0ZXJSZW5kZXI6IGZ1bmN0aW9uKGVscykgeyAkZGF0YS5tYXRyaXgua29DZWxsQWZ0ZXJSZW5kZXIoZWxzLCAkZGF0YSk7IH0gfSAtLT48IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgPCEtLSBrbyBpZjogJGRhdGEuaGFzVGl0bGUgLS0+PCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6ICRkYXRhLmxvY1RpdGxlIH0gLS0+PCEtLSAva28gLS0+PCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPC90ZD5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgPC90cj5cXG4gICAgICAgIDwvdGZvb3Q+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8L3RhYmxlPlxcbiAgICA8L2Rpdj5cXG4gICAgPCEtLSBrbyBpZm5vdDogcXVlc3Rpb24ua29UYWJsZSgpLnNob3dUYWJsZSAtLT5cXG4gICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5lbXB0eVJvd3NTZWN0aW9uXFxcIj5cXG4gICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLmVtcHR5Um93c1RleHRcXFwiPlxcbiAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IHF1ZXN0aW9uLmxvY0VtcHR5Um93c1RleHQgfSAtLT48IS0tIC9rbyAtLT5cXG4gICAgICA8L2Rpdj5cXG4gICAgICA8YnV0dG9uXFxuICAgICAgICB0eXBlPVxcXCJidXR0b25cXFwiXFxuICAgICAgICBkYXRhLWJpbmQ9XFxcImNsaWNrOnF1ZXN0aW9uLmtvQWRkUm93Q2xpY2ssIGNzczogcXVlc3Rpb24uZ2V0QWRkUm93QnV0dG9uQ3NzKHRydWUpLCBkaXNhYmxlOiBxdWVzdGlvbi5pc0lucHV0UmVhZE9ubHlcXFwiXFxuICAgICAgPlxcbiAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IHF1ZXN0aW9uLmxvY0FkZFJvd1RleHQgfSAtLT48IS0tIC9rbyAtLT5cXG4gICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLmljb25BZGRcXFwiPjwvc3Bhbj5cXG4gICAgICA8L2J1dHRvbj5cXG4gICAgPC9kaXY+XFxuICAgIDwhLS0gL2tvIC0tPlxcbiAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5rb1RhYmxlKCkuc2hvd0FkZFJvd09uQm90dG9tIC0tPlxcbiAgICA8ZGl2XFxuICAgICAgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuZm9vdGVyXFxcIlxcbiAgICA+XFxuICAgICAgPGJ1dHRvblxcbiAgICAgICAgdHlwZT1cXFwiYnV0dG9uXFxcIlxcbiAgICAgICAgZGF0YS1iaW5kPVxcXCJjbGljazogcXVlc3Rpb24ua29BZGRSb3dDbGljaywgY3NzOiBxdWVzdGlvbi5nZXRBZGRSb3dCdXR0b25Dc3MoKSwgZGlzYWJsZTogcXVlc3Rpb24uaXNJbnB1dFJlYWRPbmx5XFxcIlxcbiAgICAgID5cXG4gICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiBxdWVzdGlvbi5sb2NBZGRSb3dUZXh0IH0gLS0+PCEtLSAva28gLS0+XFxuICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5pY29uQWRkXFxcIj48L3NwYW4+XFxuICAgICAgPC9idXR0b24+XFxuICAgIDwvZGl2PlxcbiAgICA8IS0tIC9rbyAtLT5cXG4gIDwvZGl2Plxcbjwvc2NyaXB0PlxcbjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LW1hdHJpeGNlbGxcXFwiPlxcbiAgPHRkXFxuICAgIGRhdGEtYmluZD1cXFwiY3NzOiAkZGF0YS5jbGFzc05hbWUsIHN0eWxlOiB7IG1pbldpZHRoOiAkZGF0YS5taW5XaWR0aCwgd2lkdGg6ICRkYXRhLndpZHRoIH0sIGF0dHI6IHsgdGl0bGU6IGhlYWRlcnMgfVxcXCJcXG4gID5cXG4gICAgPGRpdiBkYXRhLWJpbmQ9XFxcInZpc2libGU6IHF1ZXN0aW9uLmlzVmlzaWJsZVxcXCI+XFxuICAgICAgPCEtLSBrbyBpZjogJGRhdGEuc2hvd0Vycm9yT25Ub3AgLS0+XFxuICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXF1ZXN0aW9uLWVycm9ycycsIGRhdGE6IHF1ZXN0aW9uLCBhczogJ3F1ZXN0aW9uJyB9IC0tPlxcbiAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgIDwhLS0ga28gaWY6ICRkYXRhLmlzQ2hvaWNlIC0tPlxcbiAgICAgIDwhLS0ga28gaWY6ICRkYXRhLmlzQ2hlY2tib3ggLS0+XFxuICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7bmFtZTogJ3N1cnZleS1jaGVja2JveC1pdGVtJywgdGVtcGxhdGVPcHRpb25zOiB7aGlkZUNhcHRpb246IHRydWV9IH0gIC0tPjwhLS0gL2tvIC0tPlxcbiAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgIDwhLS0ga28gaWZub3Q6ICRkYXRhLmlzQ2hlY2tib3ggLS0+XFxuICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7bmFtZTogJ3N1cnZleS1yYWRpb2dyb3VwLWl0ZW0nLCB0ZW1wbGF0ZU9wdGlvbnM6IHtoaWRlQ2FwdGlvbjogdHJ1ZX0gfSAgLS0+PCEtLSAva28gLS0+XFxuICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgPCEtLSBrbyBpZm5vdDogJGRhdGEuaXNDaG9pY2UgLS0+XFxuICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24uaXNEZWZhdWx0UmVuZGVyaW5nKCkgLS0+XFxuICAgICAgICA8IS0tIGtvIGxldDogeyBxdWVzdGlvbjogJGRhdGEubWF0cml4LmdldENlbGxUZW1wbGF0ZURhdGEoJGRhdGEpIH0gLS0+XFxuICAgICAgICA8IS0tIGtvIGNvbXBvbmVudDogeyBuYW1lOiAkZGF0YS5tYXRyaXguZ2V0Q2VsbFdyYXBwZXJDb21wb25lbnROYW1lKCRkYXRhKSwgcGFyYW1zOiB7IGNvbXBvbmVudERhdGE6ICAkZGF0YS5tYXRyaXguZ2V0Q2VsbFdyYXBwZXJDb21wb25lbnREYXRhKCRkYXRhKSwgdGVtcGxhdGVEYXRhOiB7IG5hbWU6IHF1ZXN0aW9uLmtvVGVtcGxhdGVOYW1lKCksIGRhdGE6IHF1ZXN0aW9uLCBhZnRlclJlbmRlcjogZnVuY3Rpb24oZWwpIHsgJGRhdGEubWF0cml4LmtvQ2VsbFF1ZXN0aW9uQWZ0ZXJSZW5kZXIoZWwsICRkYXRhKTsgfSB9IH0gfSAtLT5cXG4gICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgPCEtLSBrbyBpZm5vdDogcXVlc3Rpb24uaXNEZWZhdWx0UmVuZGVyaW5nKCkgLS0+XFxuICAgICAgICA8IS0tIGtvIGNvbXBvbmVudDogeyBuYW1lOiBxdWVzdGlvbi5nZXRDb21wb25lbnROYW1lKCksIHBhcmFtczogeyBxdWVzdGlvbjogcXVlc3Rpb24gfSB9IC0tPlxcbiAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgPCEtLSBrbyBpZjogJGRhdGEuc2hvd0Vycm9yT25Cb3R0b20gLS0+XFxuICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXF1ZXN0aW9uLWVycm9ycycsIGRhdGE6IHF1ZXN0aW9uLCBhczogJ3F1ZXN0aW9uJyB9IC0tPlxcbiAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICA8L2Rpdj5cXG4gIDwvdGQ+XFxuPC9zY3JpcHQ+XFxuXCI7IiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uLW11bHRpcGxldGV4dFxcXCI+XFxuICA8dGFibGUgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkucm9vdCwgZm9yZWFjaDogeyBkYXRhOiAgcXVlc3Rpb24ua29Sb3dzLCBhczogJ3JvdycgfVxcXCI+XFxuICAgICAgPHRyIGRhdGEtYmluZD1cXFwiZm9yZWFjaDogeyBkYXRhOiByb3csIGFzOiAnaXRlbScgfSwgY3NzOiBxdWVzdGlvbi5rb0NzcygpLnJvd1xcXCI+XFxuICAgICAgICAgIDx0ZCBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29JdGVtVGl0bGVDc3NcXFwiPlxcbiAgICAgICAgICAgIDwhLS0ga28gY29tcG9uZW50OiB7IG5hbWU6ICdzdXJ2ZXktZWxlbWVudC10aXRsZS1jb250ZW50JywgcGFyYW1zOiB7ZWxlbWVudDogaXRlbS5lZGl0b3J9IH0gLS0+PCEtLSAva28gLS0+XFxuICAgICAgICAgIDwvdGQ+XFxuICAgICAgICAgIDx0ZCBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29JdGVtQ3NzXFxcIj5cXG4gICAgICAgICAgICA8IS0tIGtvIGlmOiBpdGVtLmVkaXRvci5lcnJvckxvY2F0aW9uID09PSAndG9wJyAtLT5cXG4gICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLmVycm9yLmxvY2F0aW9uVG9wXFxcIj5cXG4gICAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXF1ZXN0aW9uLWVycm9ycycsIGRhdGE6IGl0ZW0uZWRpdG9yIH0gLS0+XFxuICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogaXRlbS5lZGl0b3Iua29UZW1wbGF0ZU5hbWUoKSwgZGF0YTogaXRlbS5lZGl0b3IsIGFzOiAncXVlc3Rpb24nLCBhZnRlclJlbmRlcjogaXRlbS5lZGl0b3Iua29RdWVzdGlvbkFmdGVyUmVuZGVyIH0gLS0+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPCEtLSBrbyBpZjogaXRlbS5lZGl0b3IuZXJyb3JMb2NhdGlvbiA9PT0gJ2JvdHRvbScgLS0+XFxuICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktcXVlc3Rpb24tZXJyb3JzJywgZGF0YTogaXRlbS5lZGl0b3IgfSAtLT5cXG4gICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgPC90ZD5cXG4gICAgICA8L3RyPlxcbiAgPC90YWJsZT5cXG48L3NjcmlwdD5cXG5cIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcXVlc3Rpb24tcGFuZWxkeW5hbWljLW5hdmlnYXRvclxcXCI+XFxuICA8ZGl2IHN0eWxlPVxcXCJjbGVhcjogYm90aDtcXFwiPlxcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5wcm9ncmVzc0NvbnRhaW5lclxcXCI+XFxuICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJ0aXRsZTogcXVlc3Rpb24ucGFuZWxQcmV2VGV4dCwgY2xpY2s6IHF1ZXN0aW9uLmtvUHJldlBhbmVsQ2xpY2tcXFwiPlxcbiAgICAgICAgICAgIDxzdmcgdmlld0JveD1cXFwiMCAwIDEwIDEwXFxcIiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29QcmV2QnV0dG9uQ3NzXFxcIj5cXG4gICAgICAgICAgICAgIDxwb2x5Z29uIHBvaW50cz1cXFwiMiwyIDAsNCA1LDkgMTAsNCA4LDIgNSw1IFxcXCIgLz5cXG4gICAgICAgICAgICA8L3N2Zz5cXG4gICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmtvSXNSYW5nZSAtLT5cXG4gICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5wcm9ncmVzc1xcXCI+XFxuICAgICAgICAgICAgPGRpdlxcbiAgICAgICAgICAgICAgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkucHJvZ3Jlc3NCYXIsIHN0eWxlOiB7IHdpZHRoOiBxdWVzdGlvbi5rb1Byb2dyZXNzIH1cXFwiXFxuICAgICAgICAgICAgICByb2xlPVxcXCJwcm9ncmVzc2JhclxcXCJcXG4gICAgICAgICAgICA+PC9kaXY+XFxuICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICA8IS0tIC9rbyAtLT5cXG5cXG4gICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcInRpdGxlOiBxdWVzdGlvbi5wYW5lbE5leHRUZXh0LCBjbGljazogcXVlc3Rpb24ua29OZXh0UGFuZWxDbGlja1xcXCI+XFxuICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVxcXCIwIDAgMTAgMTBcXFwiIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb05leHRCdXR0b25Dc3NcXFwiPlxcbiAgICAgICAgICAgICAgPHBvbHlnb24gcG9pbnRzPVxcXCIyLDIgMCw0IDUsOSAxMCw0IDgsMiA1LDUgXFxcIiAvPlxcbiAgICAgICAgICAgIDwvc3ZnPlxcbiAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24uY2FuQWRkUGFuZWwgLS0+XFxuICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgZGF0YS1iaW5kPVxcXCJjbGljazogcXVlc3Rpb24ua29BZGRQYW5lbENsaWNrLCBjc3M6IHF1ZXN0aW9uLmtvQWRkQnV0dG9uQ3NzXFxcIj5cXG4gICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuYnV0dG9uQWRkVGV4dCwgdGV4dDogcXVlc3Rpb24ucGFuZWxBZGRUZXh0XFxcIj48L3NwYW4+XFxuICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgIDwhLS0gL2tvIC0tPlxcblxcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcInRleHQ6IHF1ZXN0aW9uLmtvUHJvZ3Jlc3NUZXh0LCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkucHJvZ3Jlc3NUZXh0XFxcIj48L2Rpdj5cXG4gICAgICA8L2Rpdj5cXG48L3NjcmlwdD5cIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcXVlc3Rpb24tcGFuZWxkeW5hbWljXFxcIj5cXG4gIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkucm9vdFxcXCI+XFxuICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmtvSXNMaXN0KCkgLS0+XFxuICAgICAgPCEtLSBrbyBmb3JlYWNoOiB7IGRhdGE6IHF1ZXN0aW9uLnBhbmVscyB9IC0tPlxcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24uZ2V0UGFuZWxXcmFwcGVyQ3NzKClcXFwiPlxcbiAgICAgICAgICA8IS0tIGtvIGxldDogeyBxdWVzdGlvbjogJGRhdGEgfSAtLT5cXG4gICAgICAgICAgICA8IS0tIGtvIGNvbXBvbmVudDogeyBuYW1lOiBzdXJ2ZXkuZ2V0RWxlbWVudFdyYXBwZXJDb21wb25lbnROYW1lKHF1ZXN0aW9uKSwgcGFyYW1zOiB7IGNvbXBvbmVudERhdGE6ICBzdXJ2ZXkuZ2V0RWxlbWVudFdyYXBwZXJDb21wb25lbnREYXRhKHF1ZXN0aW9uKSwgdGVtcGxhdGVEYXRhOiB7IG5hbWU6IHF1ZXN0aW9uLmtvRWxlbWVudFR5cGUsIGRhdGE6IHF1ZXN0aW9uLCBhZnRlclJlbmRlcjogJHBhcmVudC5rb1BhbmVsQWZ0ZXJSZW5kZXIgfSB9IH0gLS0+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCJcXG4gICAgICAgICAgICBkYXRhLWJpbmQ9XFxcInZpc2libGU6IHF1ZXN0aW9uLmtvQ2FuUmVtb3ZlUGFuZWwoKSAmJiAkZGF0YS5zdGF0ZSAhPSAnY29sbGFwc2VkJywgY2xpY2s6cXVlc3Rpb24ua29SZW1vdmVQYW5lbENsaWNrLCBjc3M6IHF1ZXN0aW9uLmdldFBhbmVsUmVtb3ZlQnV0dG9uQ3NzKClcXFwiPlxcbiAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLmJ1dHRvblJlbW92ZVRleHQsIHRleHQ6IHF1ZXN0aW9uLnBhbmVsUmVtb3ZlVGV4dFxcXCI+PC9zcGFuPlxcbiAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLmljb25SZW1vdmVcXFwiPjwvc3Bhbj5cXG4gICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDxociBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5zZXBhcmF0b3JcXFwiLz5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiBxdWVzdGlvbi5rb0NhbkFkZFBhbmVsLCBjbGljazogcXVlc3Rpb24ua29BZGRQYW5lbENsaWNrLCBjc3M6IHF1ZXN0aW9uLmtvQWRkQnV0dG9uQ3NzXFxcIj5cXG4gICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLmJ1dHRvbkFkZFRleHQsIHRleHQ6IHF1ZXN0aW9uLnBhbmVsQWRkVGV4dFxcXCI+PC9zcGFuPlxcbiAgICAgIDwvYnV0dG9uPlxcbiAgICA8IS0tIC9rbyAtLT5cXG4gICAgPCEtLSBrbyBpZm5vdDogcXVlc3Rpb24ua29Jc0xpc3QoKSAgLS0+XFxuICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcInZpc2libGU6cXVlc3Rpb24ua29Jc1Byb2dyZXNzVG9wLCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkucHJvZ3Jlc3NUb3BcXFwiPlxcbiAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXF1ZXN0aW9uLXBhbmVsZHluYW1pYy1uYXZpZ2F0b3InLCBkYXRhOiBxdWVzdGlvbiwgYXM6ICdxdWVzdGlvbid9IC0tPlxcbiAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgPC9kaXY+XFxuICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24ua29QYW5lbCgpIC0tPlxcbiAgICAgICAgPCEtLSBrbyBsZXQ6IHsgcXVlc3Rpb246IHF1ZXN0aW9uLmtvUGFuZWwoKSB9IC0tPlxcbiAgICAgICAgPCEtLSBrbyBjb21wb25lbnQ6IHsgbmFtZTogcXVlc3Rpb24uc3VydmV5LmdldEVsZW1lbnRXcmFwcGVyQ29tcG9uZW50TmFtZShxdWVzdGlvbiksIHBhcmFtczogeyBjb21wb25lbnREYXRhOiAgcXVlc3Rpb24uc3VydmV5LmdldEVsZW1lbnRXcmFwcGVyQ29tcG9uZW50RGF0YShxdWVzdGlvbiksIHRlbXBsYXRlRGF0YTogeyBuYW1lOiBxdWVzdGlvbi5rb0VsZW1lbnRUeXBlLCBkYXRhOiBxdWVzdGlvbiwgYWZ0ZXJSZW5kZXI6ICRwYXJlbnQua29QYW5lbEFmdGVyUmVuZGVyIH0gfSB9IC0tPlxcbiAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCJcXG4gICAgICAgIGRhdGEtYmluZD1cXFwidmlzaWJsZTogcXVlc3Rpb24ua29DYW5SZW1vdmVQYW5lbCwgY2xpY2s6IHF1ZXN0aW9uLmtvUmVtb3ZlUGFuZWxDbGljaywgY3NzOiBxdWVzdGlvbi5nZXRQYW5lbFJlbW92ZUJ1dHRvbkNzcygpXFxcIj5cXG4gICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLmJ1dHRvblJlbW92ZVRleHQsIHRleHQ6IHF1ZXN0aW9uLnBhbmVsUmVtb3ZlVGV4dFxcXCI+PC9zcGFuPlxcbiAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuaWNvblJlbW92ZVxcXCI+PC9zcGFuPlxcbiAgICAgIDwvYnV0dG9uPlxcbiAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOnF1ZXN0aW9uLmtvSXNQcm9ncmVzc0JvdHRvbSwgIGNzczogcXVlc3Rpb24ua29Dc3MoKS5wcm9ncmVzc0JvdHRvbVxcXCI+XFxuICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktcXVlc3Rpb24tcGFuZWxkeW5hbWljLW5hdmlnYXRvcicsIGRhdGE6IHF1ZXN0aW9uLCBhczogJ3F1ZXN0aW9uJ30gLS0+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8L2Rpdj5cXG4gICAgPCEtLSAva28gLS0+XFxuICA8L2Rpdj5cXG48L3NjcmlwdD5cXG5cIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcXVlc3Rpb24tcmFkaW9ncm91cFxcXCI+XFxuXFxuICA8ZmllbGRzZXQgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkucm9vdFxcXCI+XFxuICAgIDwhLS0ga28gaWZub3Q6IHF1ZXN0aW9uLmhhc0NvbHVtbnMgLS0+XFxuICAgIDwhLS0ga28gZm9yZWFjaDogeyBkYXRhOiBxdWVzdGlvbi52aXNpYmxlQ2hvaWNlcywgYXM6ICdpdGVtJywgYWZ0ZXJSZW5kZXI6IHF1ZXN0aW9uLmtvQWZ0ZXJSZW5kZXIgfSAtLT5cXG4gICAgICA8IS0tIGtvIGNvbXBvbmVudDogeyBuYW1lOiBxdWVzdGlvbi5nZXRJdGVtVmFsdWVXcmFwcGVyQ29tcG9uZW50TmFtZShpdGVtKSwgcGFyYW1zOiB7IGNvbXBvbmVudERhdGE6ICBxdWVzdGlvbi5nZXRJdGVtVmFsdWVXcmFwcGVyQ29tcG9uZW50RGF0YShpdGVtKSwgdGVtcGxhdGVEYXRhOiB7IG5hbWU6ICdzdXJ2ZXktcmFkaW9ncm91cC1pdGVtJywgZGF0YTogaXRlbSB9IH0gfSAtLT5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gICAgPCEtLSAva28gLS0+XFxuICAgIDwhLS0gL2tvIC0tPlxcbiAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5oYXNDb2x1bW5zIC0tPlxcbiAgICA8IS0tIGtvIGZvcmVhY2g6IHF1ZXN0aW9uLmNvbHVtbnMgLS0+XFxuICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmdldENvbHVtbkNsYXNzKClcXFwiPlxcbiAgICAgIDwhLS0ga28gZm9yZWFjaDogeyBkYXRhOiAkZGF0YSwgYXM6ICdpdGVtJywgYWZ0ZXJSZW5kZXI6IHF1ZXN0aW9uLmtvQWZ0ZXJSZW5kZXIgfSAtLT5cXG4gICAgICAgIDwhLS0ga28gY29tcG9uZW50OiB7IG5hbWU6IHF1ZXN0aW9uLmdldEl0ZW1WYWx1ZVdyYXBwZXJDb21wb25lbnROYW1lKGl0ZW0pLCBwYXJhbXM6IHsgY29tcG9uZW50RGF0YTogIHF1ZXN0aW9uLmdldEl0ZW1WYWx1ZVdyYXBwZXJDb21wb25lbnREYXRhKGl0ZW0pLCB0ZW1wbGF0ZURhdGE6IHsgbmFtZTogJ3N1cnZleS1yYWRpb2dyb3VwLWl0ZW0nLCBkYXRhOiBpdGVtIH0gfSB9IC0tPlxcbiAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgPCEtLSAva28gLS0+XFxuICAgIDwvZGl2PlxcbiAgICA8IS0tIC9rbyAtLT5cXG4gICAgPCEtLSAva28gLS0+XFxuICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmNhblNob3dDbGVhckJ1dHRvbiAtLT5cXG4gICAgPGRpdj5cXG4gICAgICA8aW5wdXRcXG4gICAgICAgIHR5cGU9XFxcImJ1dHRvblxcXCJcXG4gICAgICAgIGRhdGEtYmluZD1cXFwiY2xpY2s6cXVlc3Rpb24uY2xlYXJWYWx1ZSwgY3NzOiBxdWVzdGlvbi5rb0NzcygpLmNsZWFyQnV0dG9uLCB2YWx1ZTogcXVlc3Rpb24uY2xlYXJCdXR0b25DYXB0aW9uXFxcIlxcbiAgICAgIC8+XFxuICAgIDwvZGl2PlxcbiAgICA8IS0tIC9rbyAtLT5cXG4gIDwvZmllbGRzZXQ+XFxuPC9zY3JpcHQ+XFxuPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcmFkaW9ncm91cC1pdGVtXFxcIj5cXG4gIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmdldEl0ZW1DbGFzcyhpdGVtKSwgYXR0cjogeyAnYXJpYS1jaGVja2VkJzogcXVlc3Rpb24ucmVuZGVyZWRWYWx1ZSA9PT0gaXRlbS52YWx1ZSA/ICd0cnVlJzogJ2ZhbHNlJywgJ2FyaWEtcmVxdWlyZWQnOiBxdWVzdGlvbi5hcmlhUmVxdWlyZWQsICdhcmlhLWludmFsaWQnOiBxdWVzdGlvbi5hcmlhSW52YWxpZCwgJ2FyaWEtZGVzY3JpYmVkYnknOiBxdWVzdGlvbi5hcmlhRGVzY3JpYmVkQnkgfVxcXCIgcm9sZT1cXFwicmFkaW9cXFwiPlxcbiAgICA8bGFiZWwgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmdldExhYmVsQ2xhc3MoaXRlbSksIGF0dHI6IHsgJ2FyaWEtbGFiZWwnOiBpdGVtLmxvY1RleHQucmVuZGVyZWRIdG1sIH1cXFwiPlxcbiAgICAgIDxpbnB1dFxcbiAgICAgICAgdHlwZT1cXFwicmFkaW9cXFwiXFxuICAgICAgICBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCJcXG4gICAgICAgIGRhdGEtYmluZD1cXFwiYXR0cjogeyBuYW1lOiBxdWVzdGlvbi5uYW1lICsgJ18nICsgcXVlc3Rpb24uaWQsIGlkOiBxdWVzdGlvbi5pbnB1dElkICsgJ18nICsgcXVlc3Rpb24uZ2V0SXRlbUluZGV4KGl0ZW0pfSwgY2hlY2tlZFZhbHVlOiBpdGVtLnZhbHVlLCBjaGVja2VkOiBxdWVzdGlvbi5yZW5kZXJlZFZhbHVlLCBlbmFibGU6ICFxdWVzdGlvbi5pc0lucHV0UmVhZE9ubHkgJiYgaXRlbS5pc0VuYWJsZWQsIGNzczogcXVlc3Rpb24ua29Dc3MoKS5pdGVtQ29udHJvbFxcXCJcXG4gICAgICAvPlxcbiAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLm1hdGVyaWFsRGVjb3JhdG9yXFxcIj5cXG4gICAgICAgIDxzdmdcXG4gICAgICAgICAgZGF0YS1iaW5kPVxcXCJjc3M6cXVlc3Rpb24ua29Dc3MoKS5pdGVtRGVjb3JhdG9yXFxcIlxcbiAgICAgICAgICB2aWV3Qm94PVxcXCItMTIgLTEyIDI0IDI0XFxcIlxcbiAgICAgICAgPlxcbiAgICAgICAgICA8Y2lyY2xlIHI9XFxcIjZcXFwiIGN4PVxcXCIwXFxcIiBjeT1cXFwiMFxcXCIgLz5cXG4gICAgICAgIDwvc3ZnPlxcbiAgICAgIDwvc3Bhbj5cXG4gICAgICA8c3BhbiBjbGFzcz1cXFwiY2hlY2tcXFwiPjwvc3Bhbj5cXG4gICAgICA8c3BhblxcbiAgICAgICAgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiAhaXRlbS5oaWRlQ2FwdGlvbiwgY3NzOiBxdWVzdGlvbi5nZXRDb250cm9sTGFiZWxDbGFzcyhpdGVtKSwgYXR0cjogeyB0aXRsZTogaXRlbS5sb2NUZXh0LmtvUmVuZGVyZWRIdG1sIH1cXFwiXFxuICAgICAgPlxcbiAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IGl0ZW0ubG9jVGV4dCB9IC0tPlxcbiAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgPC9zcGFuPlxcbiAgICA8L2xhYmVsPlxcbiAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5oYXNPdGhlciAmJiAoaXRlbS52YWx1ZSA9PSBxdWVzdGlvbi5vdGhlckl0ZW0udmFsdWUpIC0tPlxcbiAgICA8ZGl2XFxuICAgICAgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiXFxuICAgICAgZGF0YS1iaW5kPVxcXCJ0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LWNvbW1lbnQnLCBkYXRhOiB7J3F1ZXN0aW9uJzogcXVlc3Rpb24sICd2aXNpYmxlJzogcXVlc3Rpb24uaXNPdGhlclNlbGVjdGVkfX1cXFwiXFxuICAgID48L2Rpdj5cXG4gICAgPCEtLSAva28gLS0+XFxuICA8L2Rpdj5cXG48L3NjcmlwdD5cXG5cIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcXVlc3Rpb24tcmFua2luZ1xcXCI+XFxuICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5yb290Q2xhc3NcXFwiPlxcbiAgICA8IS0tIGtvIGZvcmVhY2g6IHsgZGF0YTogcXVlc3Rpb24ucmFua2luZ0Nob2ljZXMsIGFzOiAnaXRlbScsIGFmdGVyUmVuZGVyOiBxdWVzdGlvbi5rb0FmdGVyUmVuZGVyIH0gLS0+XFxuICAgICAgPCEtLSBrbyBjb21wb25lbnQ6IHsgbmFtZTogcXVlc3Rpb24uZ2V0SXRlbVZhbHVlV3JhcHBlckNvbXBvbmVudE5hbWUoaXRlbSksIHBhcmFtczogeyBjb21wb25lbnREYXRhOiAgcXVlc3Rpb24uZ2V0SXRlbVZhbHVlV3JhcHBlckNvbXBvbmVudERhdGEoaXRlbSksIHRlbXBsYXRlRGF0YTogeyBuYW1lOiAnc3VydmV5LXJhbmtpbmctaXRlbScsIGRhdGE6IGl0ZW0gfSB9IH0gLS0+XFxuICAgICAgPCEtLSAva28gLS0+XFxuICAgIDwhLS0gL2tvIC0tPlxcbiAgPC9kaXY+XFxuPC9zY3JpcHQ+XFxuXFxuPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcmFua2luZy1pdGVtXFxcIj5cXG4gIDxkaXZcXG4gICAgdGFiaW5kZXg9XFxcIjBcXFwiXFxuICAgIGRhdGEtYmluZD1cXFwiZXZlbnQ6IHsga2V5ZG93bjogcXVlc3Rpb24ua29IYW5kbGVLZXlkb3duLCBwb2ludGVyZG93bjogcXVlc3Rpb24ua29IYW5kbGVQb2ludGVyRG93bn0sIGNzczogcXVlc3Rpb24uZ2V0SXRlbUNsYXNzKCRkYXRhKSwgYXR0cjogeydkYXRhLXN2LWRyb3AtdGFyZ2V0LXJhbmtpbmctaXRlbSc6ICRpbmRleCgpIH1cXFwiXFxuICA+XFxuICAgIDxkaXYgdGFiaW5kZXg9XFxcIi0xXFxcIiBzdHlsZT1cXFwib3V0bGluZTogbm9uZTtcXFwiPlxcbiAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmNzc0NsYXNzZXMuaXRlbUdob3N0Tm9kZVxcXCI+PC9kaXY+XFxuICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24uY3NzQ2xhc3Nlcy5pdGVtQ29udGVudFxcXCI+XFxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5jc3NDbGFzc2VzLml0ZW1JY29uQ29udGFpbmVyXFxcIj5cXG4gICAgICAgICAgPHN2Z1xcbiAgICAgICAgICAgIHdpZHRoPVxcXCIxMFxcXCJcXG4gICAgICAgICAgICBoZWlnaHQ9XFxcIjE2XFxcIlxcbiAgICAgICAgICAgIHZpZXdCb3g9XFxcIjAgMCAxMCAxNlxcXCJcXG4gICAgICAgICAgICBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24uZ2V0SWNvbkhvdmVyQ3NzKClcXFwiXFxuICAgICAgICAgICAgeG1sbnM9XFxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXFxcIlxcbiAgICAgICAgICA+XFxuICAgICAgICAgICAgPHBhdGhcXG4gICAgICAgICAgICAgIGQ9XFxcIk02IDJDNiAwLjkgNi45IDAgOCAwQzkuMSAwIDEwIDAuOSAxMCAyQzEwIDMuMSA5LjEgNCA4IDRDNi45IDQgNiAzLjEgNiAyWk0yIDBDMC45IDAgMCAwLjkgMCAyQzAgMy4xIDAuOSA0IDIgNEMzLjEgNCA0IDMuMSA0IDJDNCAwLjkgMy4xIDAgMiAwWk04IDZDNi45IDYgNiA2LjkgNiA4QzYgOS4xIDYuOSAxMCA4IDEwQzkuMSAxMCAxMCA5LjEgMTAgOEMxMCA2LjkgOS4xIDYgOCA2Wk0yIDZDMC45IDYgMCA2LjkgMCA4QzAgOS4xIDAuOSAxMCAyIDEwQzMuMSAxMCA0IDkuMSA0IDhDNCA2LjkgMy4xIDYgMiA2Wk04IDEyQzYuOSAxMiA2IDEyLjkgNiAxNEM2IDE1LjEgNi45IDE2IDggMTZDOS4xIDE2IDEwIDE1LjEgMTAgMTRDMTAgMTIuOSA5LjEgMTIgOCAxMlpNMiAxMkMwLjkgMTIgMCAxMi45IDAgMTRDMCAxNS4xIDAuOSAxNiAyIDE2QzMuMSAxNiA0IDE1LjEgNCAxNEM0IDEyLjkgMy4xIDEyIDIgMTJaXFxcIlxcbiAgICAgICAgICAgIC8+XFxuICAgICAgICAgIDwvc3ZnPlxcbiAgICAgICAgICA8c3ZnXFxuICAgICAgICAgICAgd2lkdGg9XFxcIjEwXFxcIlxcbiAgICAgICAgICAgIGhlaWdodD1cXFwiMjRcXFwiXFxuICAgICAgICAgICAgdmlld0JveD1cXFwiMCAwIDEwIDI0XFxcIlxcbiAgICAgICAgICAgIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5nZXRJY29uRm9jdXNDc3MoKVxcXCJcXG4gICAgICAgICAgICB4bWxucz1cXFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcXFwiXFxuICAgICAgICAgID5cXG4gICAgICAgICAgICA8cGF0aCBkPVxcXCJNMTAgNUw1IDBMMCA1SDRWOUg2VjVIMTBaXFxcIiAvPlxcbiAgICAgICAgICAgIDxwYXRoIGQ9XFxcIk02IDE5VjE1SDRWMTlIMEw1IDI0TDEwIDE5SDZaXFxcIiAvPlxcbiAgICAgICAgICA8L3N2Zz5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgICAgPGRpdlxcbiAgICAgICAgICBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24uY3NzQ2xhc3Nlcy5pdGVtSW5kZXgsIHRleHQ6IHF1ZXN0aW9uLmdldE51bWJlckJ5SW5kZXgoJGluZGV4KCkpXFxcIlxcbiAgICAgICAgPjwvZGl2PlxcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24uY3NzQ2xhc3Nlcy5jb250cm9sTGFiZWxcXFwiPlxcbiAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogJGRhdGEubG9jVGV4dCB9IC0tPlxcbiAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG4gIDwvZGl2Plxcbjwvc2NyaXB0PlxcblwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1yYXRpbmdcXFwiPlxcbiAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLnJvb3RcXFwiPlxcbiAgICAgICAgPGZpZWxkc2V0IHJvbGU9XFxcInJhZGlvZ3JvdXBcXFwiPlxcbiAgICAgICAgICAgIDxsZWdlbmRcXG4gICAgICAgICAgICBkYXRhLWJpbmQ9XFxcImF0dHI6IHsgJ2FyaWEtbGFiZWwnOiBxdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWwgfVxcXCJcXG4gICAgICAgICAgICA+PC9sZWdlbmQ+XFxuICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiBxdWVzdGlvbi5rb1Zpc2libGVSYXRlVmFsdWVzIC0tPlxcbiAgICAgICAgICAgIDxsYWJlbCBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24uZ2V0SXRlbUNsYXNzKCRkYXRhKVxcXCI+XFxuICAgICAgICAgICAgICAgIDxpbnB1dFxcbiAgICAgICAgICAgICAgICB0eXBlPVxcXCJjaGVja2JveFxcXCJcXG4gICAgICAgICAgICAgICAgY2xhc3M9XFxcInN2LXZpc3VhbGx5aGlkZGVuXFxcIlxcbiAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XFxcImF0dHI6IHsgbmFtZTogcXVlc3Rpb24ubmFtZSwgaWQ6IHF1ZXN0aW9uLmlucHV0SWQgKyAnXycgKyAkaW5kZXgoKSwgdmFsdWU6ICRkYXRhLnZhbHVlLCAnYXJpYS1yZXF1aXJlZCc6IHF1ZXN0aW9uLmFyaWFSZXF1aXJlZCwgJ2FyaWEtbGFiZWwnOiBxdWVzdGlvbi5hcmlhTGFiZWwsICdhcmlhLWludmFsaWQnOiBxdWVzdGlvbi5hcmlhSW52YWxpZCwgJ2FyaWEtZGVzY3JpYmVkYnknOiBxdWVzdGlvbi5hcmlhRGVzY3JpYmVkQnkgfSwgY2hlY2tlZFZhbHVlOiAkZGF0YS52YWx1ZSwgY2hlY2tlZDogcXVlc3Rpb24udmFsdWUsIGVuYWJsZTogIXF1ZXN0aW9uLmlzSW5wdXRSZWFkT25seVxcXCJcXG4gICAgICAgICAgICAgICAgLz5cXG4gICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogJGluZGV4KCkgPT0gMCAtLT5cXG4gICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkubWluVGV4dFxcXCI+XFxuICAgICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiBxdWVzdGlvbi5sb2NNaW5SYXRlRGVzY3JpcHRpb24gfSAtLT5cXG4gICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuXFxuICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLml0ZW1UZXh0XFxcIj5cXG4gICAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6ICRkYXRhLmxvY1RleHQgfSAtLT5cXG4gICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG5cXG4gICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogJGluZGV4KCkgPT0gKHF1ZXN0aW9uLmtvVmlzaWJsZVJhdGVWYWx1ZXMoKS5sZW5ndGgtMSkgLS0+XFxuICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLm1heFRleHRcXFwiPlxcbiAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogcXVlc3Rpb24ubG9jTWF4UmF0ZURlc2NyaXB0aW9uIH0gLS0+XFxuICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwvbGFiZWw+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICA8L2ZpZWxkc2V0PlxcbiAgICA8L2Rpdj5cXG5cXG4gICAgPGRpdiBkYXRhLWJpbmQ9XFxcInZpc2libGU6IHF1ZXN0aW9uLmhhc090aGVyXFxcIj5cXG4gICAgICA8ZGl2XFxuICAgICAgICBkYXRhLWJpbmQ9XFxcInRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktY29tbWVudCcsIGRhdGE6IHsgJ3F1ZXN0aW9uJzogcXVlc3Rpb24gfSB9XFxcIlxcbiAgICAgID48L2Rpdj5cXG4gICAgPC9kaXY+XFxuICA8L2ZpZWxkc2V0Plxcbjwvc2NyaXB0PlxcblwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1zaWduYXR1cmVwYWRcXFwiPlxcbiAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLnJvb3QsIHN0eWxlOiB7IGhlaWdodDogaGVpZ2h0LCB3aWR0aDogd2lkdGggfVxcXCI+XFxuICAgICAgICA8ZGl2IFxcbiAgICAgICAgICAgIGRhdGEtYmluZD1cXFwidGV4dDogcGxhY2VIb2xkZXJUZXh0LCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkucGxhY2Vob2xkZXIsIHZpc2libGU6ICRkYXRhLm5lZWRTaG93UGxhY2Vob2xkZXIoKVxcXCI+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDxkaXY+XFxuICAgICAgICAgICAgPGNhbnZhcyB0YWJpbmRleD0nMCc+PC9jYW52YXM+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuY29udHJvbHMsIHZpc2libGU6ICFxdWVzdGlvbi5pc0lucHV0UmVhZE9ubHlcXFwiPlxcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT0nYnV0dG9uJ1xcbiAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5jbGVhckJ1dHRvbiwgYXR0cjogeyB0aXRsZTogcXVlc3Rpb24uY2xlYXJCdXR0b25DYXB0aW9uIH1cXFwiPuKcljwvYnV0dG9uPlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvZGl2Plxcbjwvc2NyaXB0PlwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi10ZXh0XFxcIj5cXG4gIDwhLS1rbyBpZjogIXF1ZXN0aW9uLmlzSW5wdXRUZXh0VXBkYXRlIC0tPlxcbiAgPGlucHV0XFxuICAgIGRhdGEtYmluZD1cXFwiZGlzYWJsZTogcXVlc3Rpb24uaXNJbnB1dFJlYWRPbmx5LCBzdHlsZTogcXVlc3Rpb24uaW5wdXRTdHlsZSwgYXR0cjoge3R5cGU6IHF1ZXN0aW9uLmlucHV0VHlwZSwgc2l6ZTogcXVlc3Rpb24uaW5wdXRTaXplLCBpZDogcXVlc3Rpb24uaW5wdXRJZCwgcGxhY2Vob2xkZXI6IHF1ZXN0aW9uLnJlbmRlcmVkUGxhY2VIb2xkZXIsIG1heExlbmd0aDogcXVlc3Rpb24uZ2V0TWF4TGVuZ3RoKCksIG1pbjogcXVlc3Rpb24ucmVuZGVyZWRNaW4sIG1heDogcXVlc3Rpb24ucmVuZGVyZWRNYXgsIHN0ZXA6IHF1ZXN0aW9uLnJlbmRlcmVkU3RlcCwgJ2FyaWEtcmVxdWlyZWQnOiBxdWVzdGlvbi5hcmlhUmVxdWlyZWQsICdhcmlhLWxhYmVsJzogcXVlc3Rpb24uYXJpYUxhYmVsLCAnYXJpYS1pbnZhbGlkJzogcXVlc3Rpb24uYXJpYUludmFsaWQsICdhcmlhLWRlc2NyaWJlZGJ5JzogcXVlc3Rpb24uYXJpYURlc2NyaWJlZEJ5LCBhdXRvQ29tcGxldGU6IHF1ZXN0aW9uLmF1dG9Db21wbGV0ZSwgbGlzdDpxdWVzdGlvbi5kYXRhTGlzdElkfSwgdmFsdWU6IHF1ZXN0aW9uLnZhbHVlLCBjc3M6IHF1ZXN0aW9uLmdldENvbnRyb2xDbGFzcygpXFxcIlxcbiAgLz5cXG4gIDwhLS0va28tLT5cXG4gIDwhLS1rbyBpZjogcXVlc3Rpb24uaXNJbnB1dFRleHRVcGRhdGUgLS0+XFxuICA8aW5wdXRcXG4gICAgZGF0YS1iaW5kPVxcXCJkaXNhYmxlOiBxdWVzdGlvbi5pc0lucHV0UmVhZE9ubHksIHN0eWxlOiBxdWVzdGlvbi5pbnB1dFN0eWxlLCBhdHRyOiB7dHlwZTogcXVlc3Rpb24uaW5wdXRUeXBlLCBzaXplOiBxdWVzdGlvbi5pbnB1dFNpemUsIGlkOiBxdWVzdGlvbi5pbnB1dElkLCBwbGFjZWhvbGRlcjogcXVlc3Rpb24ucmVuZGVyZWRQbGFjZUhvbGRlciwgbWF4TGVuZ3RoOiBxdWVzdGlvbi5nZXRNYXhMZW5ndGgoKSwgbWluOiBxdWVzdGlvbi5yZW5kZXJlZE1pbiwgbWF4OiBxdWVzdGlvbi5yZW5kZXJlZE1heCwgc3RlcDogcXVlc3Rpb24ucmVuZGVyZWRTdGVwLCAnYXJpYS1yZXF1aXJlZCc6IHF1ZXN0aW9uLmFyaWFSZXF1aXJlZCwgJ2FyaWEtbGFiZWwnOiBxdWVzdGlvbi5hcmlhTGFiZWwsICdhcmlhLWludmFsaWQnOiBxdWVzdGlvbi5hcmlhSW52YWxpZCwgJ2FyaWEtZGVzY3JpYmVkYnknOiBxdWVzdGlvbi5hcmlhRGVzY3JpYmVkQnksIGF1dG9Db21wbGV0ZTogcXVlc3Rpb24uYXV0b0NvbXBsZXRlLCBsaXN0OnF1ZXN0aW9uLmRhdGFMaXN0SWR9LCB0ZXh0SW5wdXQ6IHF1ZXN0aW9uLnZhbHVlLCBjc3M6IHF1ZXN0aW9uLmdldENvbnRyb2xDbGFzcygpXFxcIlxcbiAgLz5cXG4gIDwhLS0va28tLT5cXG4gIDwhLS1rbyBpZjogcXVlc3Rpb24uZGF0YUxpc3RJZCAtLT5cXG4gIDxkYXRhbGlzdCBkYXRhLWJpbmQ9XFxcImF0dHI6IHtpZDogcXVlc3Rpb24uZGF0YUxpc3RJZH1cXFwiPlxcbiAgICA8IS0tIGtvIGZvcmVhY2g6IHF1ZXN0aW9uLmRhdGFMaXN0IC0tPlxcbiAgICAgIDxvcHRpb24gZGF0YS1iaW5kPVxcXCJ2YWx1ZTokZGF0YVxcXCI+PC9vcHRpb24+XFxuICAgIDwhLS0va28tLT5cXG4gIDwvZGF0YWxpc3Q+XFxuICA8IS0tL2tvLS0+XFxuPC9zY3JpcHQ+XFxuXCI7IiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uXFxcIj5cXG4gIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvUm9vdENzcygpLCBzdHlsZTogeyBwYWRkaW5nTGVmdDogcXVlc3Rpb24ucGFkZGluZ0xlZnQsIHBhZGRpbmdSaWdodDogcXVlc3Rpb24ucGFkZGluZ1JpZ2h0IH0sIGF0dHI6IHsgaWQ6IHF1ZXN0aW9uLmlkLCBuYW1lOiBxdWVzdGlvbi5uYW1lLCByb2xlOiBxdWVzdGlvbi5hcmlhUm9sZSwgJ2FyaWEtbGFiZWxsZWRieSc6IHF1ZXN0aW9uLmhhc1RpdGxlID8gcXVlc3Rpb24uYXJpYVRpdGxlSWQgOiBudWxsfVxcXCI+XFxuICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24uaGFzVGl0bGVPbkxlZnRUb3AgLS0+XFxuICAgICAgPCEtLWtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktcXVlc3Rpb24tdGl0bGUnLCBkYXRhOiBxdWVzdGlvbiAgfSAtLT5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8ZGl2IGRhdGEtYmluZD1cXFwidmlzaWJsZTogIXF1ZXN0aW9uLmlzQ29sbGFwc2VkLCBjc3M6IHF1ZXN0aW9uLmNzc0NvbnRlbnRcXFwiID5cXG4gICAgICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24uZXJyb3JMb2NhdGlvbiA9PT0gJ3RvcCcgLS0+XFxuICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktcXVlc3Rpb24tZXJyb3JzJywgZGF0YTogcXVlc3Rpb24gfSAtLT5cXG4gICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24uaXNEZWZhdWx0UmVuZGVyaW5nKCkgLS0+XFxuICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiBxdWVzdGlvbi5rb1RlbXBsYXRlTmFtZSgpLCBkYXRhOiBxdWVzdGlvbiwgYWZ0ZXJSZW5kZXI6IHF1ZXN0aW9uLmtvUXVlc3Rpb25BZnRlclJlbmRlciB9IC0tPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgPCEtLSBrbyBpZm5vdDogcXVlc3Rpb24uaXNEZWZhdWx0UmVuZGVyaW5nKCkgLS0+XFxuICAgICAgICAgICAgPCEtLSBrbyBjb21wb25lbnQ6IHsgbmFtZTogZ2V0Q29tcG9uZW50TmFtZSgpLCBwYXJhbXM6IHsgcXVlc3Rpb246IHF1ZXN0aW9uIH0gfSAtLT5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmhhc0NvbW1lbnQgLS0+XFxuICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuZm9ybUdyb3VwXFxcIj5cXG4gICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogcXVlc3Rpb24ubG9jQ29tbWVudFRleHQgfSAtLT5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwidGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1jb21tZW50JywgZGF0YTogeydxdWVzdGlvbic6IHF1ZXN0aW9uLCAndmlzaWJsZSc6IHRydWUgfSB9XFxcIj48L2Rpdj5cXG4gICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5lcnJvckxvY2F0aW9uID09PSAnYm90dG9tJyAtLT5cXG4gICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1xdWVzdGlvbi1lcnJvcnMnLCBkYXRhOiBxdWVzdGlvbiB9IC0tPlxcbiAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwidmlzaWJsZTogcXVlc3Rpb24uaGFzRGVzY3JpcHRpb25VbmRlcklucHV0LCBjc3M6IGtvQ3NzKCkuZGVzY3JpcHRpb25VbmRlcklucHV0XFxcIj5cXG4gICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiBsb2NEZXNjcmlwdGlvbiB9IC0tPjwhLS0gL2tvIC0tPlxcbiAgICAgICAgICA8L2Rpdj5cXG4gICAgICA8L2Rpdj5cXG4gICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5oYXNUaXRsZU9uQm90dG9tIC0tPlxcbiAgICAgIDwhLS1rbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXF1ZXN0aW9uLXRpdGxlJywgZGF0YTogcXVlc3Rpb24gIH0gLS0+XFxuICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgPCEtLSAva28gLS0+XFxuICA8L2Rpdj5cXG48L3NjcmlwdD5cXG5cIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcXVlc3Rpb24tdGl0bGVcXFwiPlxcbiAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24uY3NzSGVhZGVyLCBjbGljazogcXVlc3Rpb24uY2xpY2tUaXRsZUZ1bmN0aW9uXFxcIj5cXG4gICAgPCEtLSBrbyBjb21wb25lbnQ6IHsgbmFtZTogJ3N1cnZleS1lbGVtZW50LXRpdGxlJywgcGFyYW1zOiB7ZWxlbWVudDogcXVlc3Rpb24gfSB9IC0tPjwhLS0gL2tvIC0tPlxcbiAgICA8ZGl2XFxuICAgICAgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiBxdWVzdGlvbi5oYXNEZXNjcmlwdGlvblVuZGVyVGl0bGUsIGNzczoga29Dc3MoKS5kZXNjcmlwdGlvblxcXCJcXG4gICAgPlxcbiAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiBsb2NEZXNjcmlwdGlvbiB9IC0tPjwhLS0gL2tvIC0tPlxcbiAgICA8L2Rpdj5cXG4gIDwvZGl2Plxcbjwvc2NyaXB0PlwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1yb3dcXFwiPlxcbiAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogcm93LmdldFJvd0NzcygpXFxcIj5cXG4gICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiBcXFwic3VydmV5LXJvdy1jb250ZW50XFxcIiwgYWZ0ZXJSZW5kZXI6IHJvdy5yb3dBZnRlclJlbmRlciB9IC0tPlxcbiAgICA8IS0tIC9rbyAtLT5cXG4gIDwvZGl2Plxcbjwvc2NyaXB0PlxcbjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXJvdy1jb250ZW50XFxcIj5cXG48IS0tIGtvIGlmOiByb3cuaXNOZWVkUmVuZGVyIC0tPlxcbjwhLS0ga28gZm9yZWFjaDogeyBkYXRhOiByb3cudmlzaWJsZUVsZW1lbnRzLCBhczogJ3F1ZXN0aW9uJywgYWZ0ZXJSZW5kZXI6IHJvdy5rb0FmdGVyUmVuZGVyIH0gLS0+XFxuPGRpdlxcbiAgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkucXVlc3Rpb25XcmFwcGVyLCBzdHlsZTogeyBmbGV4QmFzaXM6IHJlbmRlcldpZHRoLCBmbGV4R3JvdzogMSwgZmxleFNocmluazogMSwgd2lkdGg6IHJlbmRlcldpZHRoLCBtaW5XaWR0aDogJGRhdGEubWluV2lkdGgsIG1heFdpZHRoOiAkZGF0YS5tYXhXaWR0aCB9XFxcIj5cXG4gIDwhLS0ga28gY29tcG9uZW50OiB7IG5hbWU6IHJvdy5wYW5lbC5zdXJ2ZXkuZ2V0RWxlbWVudFdyYXBwZXJDb21wb25lbnROYW1lKHF1ZXN0aW9uKSwgcGFyYW1zOiB7IGNvbXBvbmVudERhdGE6ICByb3cucGFuZWwuc3VydmV5LmdldEVsZW1lbnRXcmFwcGVyQ29tcG9uZW50RGF0YShxdWVzdGlvbiksIHRlbXBsYXRlRGF0YTogeyBuYW1lOiBxdWVzdGlvbi5rb0VsZW1lbnRUeXBlLCBkYXRhOiBxdWVzdGlvbiwgYWZ0ZXJSZW5kZXI6ICRwYXJlbnQua29FbGVtZW50QWZ0ZXJSZW5kZXIgfSB9IH0gLS0+XFxuICA8IS0tIC9rbyAtLT5cXG48L2Rpdj5cXG48IS0tIC9rbyAtLT5cXG48IS0tIC9rbyAtLT5cXG5cXG48IS0tIGtvIGlmbm90OiByb3cuaXNOZWVkUmVuZGVyIC0tPlxcbjwhLS0ga28gZm9yZWFjaDogeyBkYXRhOiByb3cudmlzaWJsZUVsZW1lbnRzLCBhczogJ3F1ZXN0aW9uJyB9IC0tPlxcbjwhLS0ga28gaWY6IHF1ZXN0aW9uLnNrZWxldG9uQ29tcG9uZW50TmFtZSAtLT5cXG48ZGl2XFxuICBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5xdWVzdGlvbldyYXBwZXIsIHN0eWxlOiB7IGZsZXhCYXNpczogcmVuZGVyV2lkdGgsIGZsZXhHcm93OiAxLCBmbGV4U2hyaW5rOiAxLCB3aWR0aDogcmVuZGVyV2lkdGgsIG1pbldpZHRoOiAkZGF0YS5taW5XaWR0aCwgbWF4V2lkdGg6ICRkYXRhLm1heFdpZHRoIH1cXFwiPlxcbiAgPCEtLSBrbyBjb21wb25lbnQ6IHsgbmFtZTogcXVlc3Rpb24uc2tlbGV0b25Db21wb25lbnROYW1lLCBwYXJhbXM6IHsgZGF0YTogcXVlc3Rpb24gfSB9IC0tPlxcbiAgPCEtLSAva28gLS0+XFxuPC9kaXY+XFxuPCEtLSAva28gLS0+XFxuPCEtLSAva28gLS0+XFxuPCEtLSAva28gLS0+XFxuPC9zY3JpcHQ+XCI7IiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXJvd3NcXFwiPlxcbiAgPCEtLSBrbyBmb3JlYWNoOiB7IGRhdGE6IHJvd3MsIGFzOiAncm93J30gLS0+XFxuICAgIDwhLS0ga28gaWY6IHJvdy52aXNpYmxlIC0tPlxcbiAgICAgIDwhLS0ga28gY29tcG9uZW50OiB7IG5hbWU6ICRwYXJlbnQuc3VydmV5LmdldFJvd1dyYXBwZXJDb21wb25lbnROYW1lKHJvdyksIHBhcmFtczogeyBjb21wb25lbnREYXRhOiAgJHBhcmVudC5zdXJ2ZXkuZ2V0Um93V3JhcHBlckNvbXBvbmVudERhdGEocm93KSwgdGVtcGxhdGVEYXRhOiB7IG5hbWU6ICdzdXJ2ZXktcm93JywgZGF0YTogcm93IH0gfSB9IC0tPlxcbiAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICA8IS0tIC9rbyAtLT5cXG4gIDwhLS0gL2tvIC0tPlxcbjwvc2NyaXB0PlwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1zdHJpbmdcXFwiPlxcbiAgICA8IS0tIGtvIGNvbXBvbmVudDogeyBuYW1lOiByZW5kZXJBcywgcGFyYW1zOiB7IGxvY1N0cmluZzogcmVuZGVyQXNEYXRhIH0gfSAtLT5cXG4gICAgPCEtLSAva28gLS0+XFxuPC9zY3JpcHQ+XFxuXCI7IiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXRpbWVycGFuZWxcXFwiPlxcbiAgICA8ZGl2IGRhdGEtYmluZD1cXFwidGV4dDprb1RpbWVySW5mb1RleHRcXFwiPjwvZGl2Plxcbjwvc2NyaXB0PlxcblwiOyIsImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xyXG5pbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4vYmFzZVwiO1xyXG5pbXBvcnQgeyBJQWN0aW9uIH0gZnJvbSBcIi4vYWN0aW9ucy9hY3Rpb25cIjtcclxuaW1wb3J0IHsgQ3NzQ2xhc3NCdWlsZGVyIH0gZnJvbSBcIi4vdXRpbHMvY3NzQ2xhc3NCdWlsZGVyXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTGlzdE1vZGVsIGV4dGVuZHMgQmFzZSB7XHJcbiAgQHByb3BlcnR5KHsgZGVmYXVsdFZhbHVlOiBmYWxzZSB9KSBpc0V4cGFuZGVkOiBib29sZWFuO1xyXG4gIEBwcm9wZXJ0eSgpIHNlbGVjdGVkSXRlbTogSUFjdGlvbjtcclxuICBwdWJsaWMgc3RhdGljIElOREVOVDogbnVtYmVyID0gMTY7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGl0ZW1zOiBBcnJheTxJQWN0aW9uPiwgcHVibGljIG9uSXRlbVNlbGVjdDogKGl0ZW06IElBY3Rpb24pID0+IHZvaWQsIHB1YmxpYyBhbGxvd1NlbGVjdGlvbjogYm9vbGVhbiwgc2VsZWN0ZWRJdGVtPzogSUFjdGlvbikge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIHRoaXMuY3JlYXRlTmV3QXJyYXkoXCJpdGVtc1wiKTtcclxuICAgIHRoaXMuaXRlbXMgPSBpdGVtcztcclxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gc2VsZWN0ZWRJdGVtO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBpdGVtcygpOiBBcnJheTxJQWN0aW9uPiB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXRlbXNcIik7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgaXRlbXModmFsdWU6IEFycmF5PElBY3Rpb24+KSB7XHJcbiAgICB0aGlzLml0ZW1zLnNwbGljZSgwLCB0aGlzLml0ZW1zLmxlbmd0aCwgLi4uKHZhbHVlIHx8IFtdKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VsZWN0SXRlbSA9IChpdGVtVmFsdWU6IElBY3Rpb24pID0+IHtcclxuICAgIHRoaXMuaXNFeHBhbmRlZCA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuYWxsb3dTZWxlY3Rpb24pIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSBpdGVtVmFsdWU7XHJcbiAgICB9XHJcbiAgICBpZiAoISF0aGlzLm9uSXRlbVNlbGVjdCkge1xyXG4gICAgICB0aGlzLm9uSXRlbVNlbGVjdChpdGVtVmFsdWUpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIHB1YmxpYyBpc0l0ZW1EaXNhYmxlZCA9IChpdGVtVmFsdWU6IElBY3Rpb24pID0+IHtcclxuICAgIHJldHVybiBpdGVtVmFsdWUuZW5hYmxlZCAhPT0gdW5kZWZpbmVkICYmICFpdGVtVmFsdWUuZW5hYmxlZDtcclxuICB9O1xyXG5cclxuICBwdWJsaWMgaXNJdGVtU2VsZWN0ZWQgPSAoaXRlbVZhbHVlOiBJQWN0aW9uKSA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5hbGxvd1NlbGVjdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlbSA9PSBpdGVtVmFsdWU7XHJcbiAgfTtcclxuXHJcbiAgcHVibGljIGdldEl0ZW1DbGFzcyA9IChpdGVtVmFsdWU6IElBY3Rpb24pID0+IHtcclxuICAgIHJldHVybiBuZXcgQ3NzQ2xhc3NCdWlsZGVyKClcclxuICAgICAgLmFwcGVuZChcInN2LWxpc3RfX2l0ZW1cIilcclxuICAgICAgLmFwcGVuZChcInN2LWxpc3RfX2l0ZW0tLWRpc2FibGVkXCIsIHRoaXMuaXNJdGVtRGlzYWJsZWQoaXRlbVZhbHVlKSlcclxuICAgICAgLmFwcGVuZChcInN2LWxpc3RfX2l0ZW0tLXNlbGVjdGVkXCIsIHRoaXMuaXNJdGVtU2VsZWN0ZWQoaXRlbVZhbHVlKSlcclxuICAgICAgLnRvU3RyaW5nKCk7XHJcbiAgfTtcclxuXHJcbiAgcHVibGljIGdldEl0ZW1JbmRlbnQgPSAoaXRlbVZhbHVlOiBhbnkpID0+IHtcclxuICAgIGNvbnN0IGxldmVsOiBudW1iZXIgPSBpdGVtVmFsdWUubGV2ZWwgfHwgMDtcclxuICAgIHJldHVybiAobGV2ZWwgKyAxKSAqIExpc3RNb2RlbC5JTkRFTlQgKyBcInB4XCI7XHJcbiAgfTtcclxuXHJcbiAgcHVibGljIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgY29uc3QgY3VycmVudEVsZW1lbnQgPSA8RWxlbWVudD5ldmVudC50YXJnZXQ7XHJcbiAgICBpZiAoZXZlbnQua2V5ID09PSBcIkFycm93RG93blwiIHx8IGV2ZW50LmtleUNvZGUgPT09IDQwKSB7XHJcbiAgICAgIGlmICghIWN1cnJlbnRFbGVtZW50Lm5leHRFbGVtZW50U2libGluZykge1xyXG4gICAgICAgICg8SFRNTEVsZW1lbnQ+Y3VycmVudEVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nKS5mb2N1cygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQgJiYgKDxIVE1MRWxlbWVudD5jdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkKS5mb2N1cygpO1xyXG4gICAgICB9XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gXCJBcnJvd1VwXCIgfHwgZXZlbnQua2V5Q29kZSA9PT0gMzgpIHtcclxuICAgICAgaWYgKCEhY3VycmVudEVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZykge1xyXG4gICAgICAgICg8SFRNTEVsZW1lbnQ+Y3VycmVudEVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZykuZm9jdXMoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50Lmxhc3RFbGVtZW50Q2hpbGQgJiYgKDxIVE1MRWxlbWVudD5jdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50Lmxhc3RFbGVtZW50Q2hpbGQpLmZvY3VzKCk7XHJcbiAgICAgIH1cclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7IHNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3NcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJTG9jYWxpemFibGVPd25lciB7XG4gIGdldExvY2FsZSgpOiBzdHJpbmc7XG4gIGdldE1hcmtkb3duSHRtbCh0ZXh0OiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IHN0cmluZztcbiAgZ2V0UHJvY2Vzc2VkVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmc7XG4gIGdldFJlbmRlcmVyKG5hbWU6IHN0cmluZyk6IHN0cmluZztcbiAgZ2V0UmVuZGVyZXJDb250ZXh0KGxvY1N0cjogTG9jYWxpemFibGVTdHJpbmcpOiBhbnk7XG59XG5leHBvcnQgaW50ZXJmYWNlIElMb2NhbGl6YWJsZVN0cmluZyB7XG4gIGdldExvY2FsZVRleHQobG9jOiBzdHJpbmcpOiBzdHJpbmc7XG4gIHNldExvY2FsZVRleHQobG9jOiBzdHJpbmcsIG5ld1ZhbHVlOiBzdHJpbmcpOiBhbnk7XG4gIGdldEpzb24oKTogYW55O1xuICBnZXRMb2NhbGVzKCk6IEFycmF5PHN0cmluZz47XG4gIGdldElzTXVsdGlwbGUoKTogYm9vbGVhbjtcbn1cbi8qKlxuICogVGhlIGNsYXNzIHJlcHJlc2VudHMgdGhlIHN0cmluZyB0aGF0IHN1cHBvcnRzIG11bHRpLWxhbmd1YWdlcyBhbmQgbWFya2Rvd24uXG4gKiBJdCB1c2VzIGluIGFsbCBvYmplY3RzIHdoZXJlIHN1cHBvcnQgZm9yIG11bHRpLWxhbmd1YWdlcyBhbmQgbWFya2Rvd24gaXMgcmVxdWlyZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2NhbGl6YWJsZVN0cmluZyBpbXBsZW1lbnRzIElMb2NhbGl6YWJsZVN0cmluZyB7XG4gIHB1YmxpYyBzdGF0aWMgU2VyaWFsaXplQXNPYmplY3Q6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIHN0YXRpYyBnZXQgZGVmYXVsdExvY2FsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBzZXR0aW5ncy5kZWZhdWx0TG9jYWxlTmFtZTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIHNldCBkZWZhdWx0TG9jYWxlKHZhbDogc3RyaW5nKSB7XG4gICAgc2V0dGluZ3MuZGVmYXVsdExvY2FsZU5hbWUgPSB2YWw7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBkZWZhdWx0UmVuZGVyZXIgPSBcInN2LXN0cmluZy12aWV3ZXJcIjtcbiAgcHVibGljIHN0YXRpYyBlZGl0YWJsZVJlbmRlcmVyID0gXCJzdi1zdHJpbmctZWRpdG9yXCI7XG4gIHByaXZhdGUgdmFsdWVzID0ge307XG4gIHByaXZhdGUgaHRtbFZhbHVlcyA9IHt9O1xuICBwcml2YXRlIHJlbmRlcmVkVGV4dDogc3RyaW5nO1xuICBwcml2YXRlIGNhbGN1bGF0ZWRUZXh0VmFsdWU6IHN0cmluZztcbiAgcHVibGljIGxvY2FsaXphdGlvbk5hbWU6IHN0cmluZztcbiAgcHVibGljIG9uR2V0VGV4dENhbGxiYWNrOiAoc3RyOiBzdHJpbmcpID0+IHN0cmluZztcbiAgcHVibGljIG9uU3RyQ2hhbmdlZDogKG9sZFZhbHVlOiBzdHJpbmcsIG5ld1ZhbHVlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHB1YmxpYyBvblNlYXJjaENoYW5nZWQ6ICgpID0+IHZvaWQ7XG4gIHB1YmxpYyBzaGFyZWREYXRhOiBMb2NhbGl6YWJsZVN0cmluZztcbiAgcHVibGljIHNlYXJjaFRleHQ6IHN0cmluZztcbiAgcHVibGljIHNlYXJjaEluZGV4OiBudW1iZXI7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBvd25lcjogSUxvY2FsaXphYmxlT3duZXIsXG4gICAgcHVibGljIHVzZU1hcmtkb3duOiBib29sZWFuID0gZmFsc2UsXG4gICAgcHVibGljIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgdGhpcy5vbkNyZWF0aW5nKCk7XG4gIH1cbiAgcHVibGljIGdldElzTXVsdGlwbGUoKTogYm9vbGVhbiB7IHJldHVybiBmYWxzZTsgfVxuICBwdWJsaWMgZ2V0IGxvY2FsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5vd25lciAmJiB0aGlzLm93bmVyLmdldExvY2FsZSA/IHRoaXMub3duZXIuZ2V0TG9jYWxlKCkgOiBcIlwiO1xuICB9XG4gIHB1YmxpYyBzdHJDaGFuZ2VkKCkge1xuICAgIHRoaXMuc2VhcmNoYWJsZVRleHQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMucmVuZGVyZWRUZXh0ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICB0aGlzLmNhbGN1bGF0ZWRUZXh0VmFsdWUgPSB0aGlzLmNhbGNUZXh0KCk7XG4gICAgaWYgKHRoaXMucmVuZGVyZWRUZXh0ICE9PSB0aGlzLmNhbGN1bGF0ZWRUZXh0VmFsdWUpIHtcbiAgICAgIHRoaXMucmVuZGVyZWRUZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5jYWxjdWxhdGVkVGV4dFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0aGlzLm9uQ2hhbmdlZCgpO1xuICB9XG4gIHB1YmxpYyBnZXQgdGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnB1cmVUZXh0O1xuICB9XG4gIHB1YmxpYyBzZXQgdGV4dCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGVUZXh0KHRoaXMubG9jYWxlLCB2YWx1ZSk7XG4gIH1cbiAgcHVibGljIGdldCBjYWxjdWxhdGVkVGV4dCgpOiBzdHJpbmcge1xuICAgIHRoaXMucmVuZGVyZWRUZXh0ID1cbiAgICAgIHRoaXMuY2FsY3VsYXRlZFRleHRWYWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gdGhpcy5jYWxjdWxhdGVkVGV4dFZhbHVlXG4gICAgICAgIDogdGhpcy5jYWxjVGV4dCgpO1xuICAgIHRoaXMuY2FsY3VsYXRlZFRleHRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlZFRleHQ7XG4gIH1cbiAgcHJpdmF0ZSBjYWxjVGV4dCgpOiBzdHJpbmcge1xuICAgIHZhciByZXMgPSB0aGlzLnB1cmVUZXh0O1xuICAgIGlmIChcbiAgICAgIHJlcyAmJlxuICAgICAgdGhpcy5vd25lciAmJlxuICAgICAgdGhpcy5vd25lci5nZXRQcm9jZXNzZWRUZXh0ICYmXG4gICAgICByZXMuaW5kZXhPZihcIntcIikgPiAtMVxuICAgICkge1xuICAgICAgcmVzID0gdGhpcy5vd25lci5nZXRQcm9jZXNzZWRUZXh0KHJlcyk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9uR2V0VGV4dENhbGxiYWNrKSByZXMgPSB0aGlzLm9uR2V0VGV4dENhbGxiYWNrKHJlcyk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgZ2V0IHB1cmVUZXh0KCkge1xuICAgIHZhciBsb2MgPSB0aGlzLmxvY2FsZTtcbiAgICBpZiAoIWxvYykgbG9jID0gc2V0dGluZ3MuZGVmYXVsdExvY2FsZU5hbWU7XG4gICAgdmFyIHJlcyA9IHRoaXMuZ2V0VmFsdWUobG9jKTtcbiAgICBpZiAoIXJlcyAmJiBsb2MgPT0gc2V0dGluZ3MuZGVmYXVsdExvY2FsZU5hbWUpIHtcbiAgICAgIHJlcyA9IHRoaXMuZ2V0VmFsdWUoc3VydmV5TG9jYWxpemF0aW9uLmRlZmF1bHRMb2NhbGUpO1xuICAgIH1cbiAgICBpZiAoIXJlcyAmJiBsb2MgIT09IHNldHRpbmdzLmRlZmF1bHRMb2NhbGVOYW1lKSB7XG4gICAgICByZXMgPSB0aGlzLmdldFZhbHVlKHNldHRpbmdzLmRlZmF1bHRMb2NhbGVOYW1lKTtcbiAgICB9XG4gICAgaWYgKCFyZXMgJiYgISF0aGlzLmxvY2FsaXphdGlvbk5hbWUpIHtcbiAgICAgIHJlcyA9IHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcodGhpcy5sb2NhbGl6YXRpb25OYW1lKTtcbiAgICB9XG4gICAgaWYgKCFyZXMpIHJlcyA9IFwiXCI7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc0h0bWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzSHRtbFZhbHVlKCk7XG4gIH1cbiAgcHVibGljIGdldCBodG1sKCkge1xuICAgIGlmICghdGhpcy5oYXNIdG1sKSByZXR1cm4gXCJcIjtcbiAgICByZXR1cm4gdGhpcy5nZXRIdG1sVmFsdWUoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWVzS2V5cygpLmxlbmd0aCA9PSAwO1xuICB9XG4gIHB1YmxpYyBnZXQgdGV4dE9ySHRtbCgpIHtcbiAgICByZXR1cm4gdGhpcy5oYXNIdG1sID8gdGhpcy5nZXRIdG1sVmFsdWUoKSA6IHRoaXMuY2FsY3VsYXRlZFRleHQ7XG4gIH1cbiAgcHVibGljIGdldCByZW5kZXJlZEh0bWwoKSB7XG4gICAgcmV0dXJuIHRoaXMudGV4dE9ySHRtbDtcbiAgfVxuICBwdWJsaWMgZ2V0TG9jYWxlVGV4dChsb2M6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFsb2MpIGxvYyA9IHNldHRpbmdzLmRlZmF1bHRMb2NhbGVOYW1lO1xuICAgIHZhciByZXMgPSB0aGlzLmdldFZhbHVlKGxvYyk7XG4gICAgcmV0dXJuIHJlcyA/IHJlcyA6IFwiXCI7XG4gIH1cbiAgcHVibGljIHNldExvY2FsZVRleHQobG9jOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgPT0gdGhpcy5nZXRMb2NhbGVUZXh0KGxvYykpIHJldHVybjtcbiAgICBpZiAoXG4gICAgICB2YWx1ZSAmJlxuICAgICAgbG9jICYmXG4gICAgICBsb2MgIT0gc2V0dGluZ3MuZGVmYXVsdExvY2FsZU5hbWUgJiZcbiAgICAgICF0aGlzLmdldFZhbHVlKGxvYykgJiZcbiAgICAgIHZhbHVlID09IHRoaXMuZ2V0TG9jYWxlVGV4dChzZXR0aW5ncy5kZWZhdWx0TG9jYWxlTmFtZSlcbiAgICApXG4gICAgICByZXR1cm47XG4gICAgdmFyIGN1ckxvYyA9IHRoaXMubG9jYWxlO1xuICAgIGlmICghbG9jKSBsb2MgPSBzZXR0aW5ncy5kZWZhdWx0TG9jYWxlTmFtZTtcbiAgICBpZiAoIWN1ckxvYykgY3VyTG9jID0gc2V0dGluZ3MuZGVmYXVsdExvY2FsZU5hbWU7XG4gICAgdmFyIGhhc09uU3RyQ2hhbmdlZCA9IHRoaXMub25TdHJDaGFuZ2VkICYmIGxvYyA9PT0gY3VyTG9jO1xuICAgIHZhciBvbGRWYWx1ZSA9IGhhc09uU3RyQ2hhbmdlZCA/IHRoaXMucHVyZVRleHQgOiB1bmRlZmluZWQ7XG5cbiAgICBkZWxldGUgKDxhbnk+dGhpcykuaHRtbFZhbHVlc1tsb2NdO1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIGlmICh0aGlzLmdldFZhbHVlKGxvYykpIHRoaXMuZGVsZXRlVmFsdWUobG9jKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbG9jICE9IHNldHRpbmdzLmRlZmF1bHRMb2NhbGVOYW1lICYmXG4gICAgICAgICAgdmFsdWUgPT0gdGhpcy5nZXRMb2NhbGVUZXh0KHNldHRpbmdzLmRlZmF1bHRMb2NhbGVOYW1lKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLnNldExvY2FsZVRleHQobG9jLCBudWxsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNldFZhbHVlKGxvYywgdmFsdWUpO1xuICAgICAgICAgIGlmIChsb2MgPT0gc2V0dGluZ3MuZGVmYXVsdExvY2FsZU5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlVmFsdWVzRXF1YWxzVG9EZWZhdWx0KHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zdHJDaGFuZ2VkKCk7XG4gICAgaWYgKGhhc09uU3RyQ2hhbmdlZCkge1xuICAgICAgdGhpcy5vblN0ckNoYW5nZWQob2xkVmFsdWUsIHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGhhc05vbkRlZmF1bHRUZXh0KCk6IGJvb2xlYW4ge1xuICAgIHZhciBrZXlzID0gdGhpcy5nZXRWYWx1ZXNLZXlzKCk7XG4gICAgaWYgKGtleXMubGVuZ3RoID09IDApIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4ga2V5cy5sZW5ndGggPiAxIHx8IGtleXNbMF0gIT0gc2V0dGluZ3MuZGVmYXVsdExvY2FsZU5hbWU7XG4gIH1cbiAgcHVibGljIGdldExvY2FsZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIGtleXMgPSB0aGlzLmdldFZhbHVlc0tleXMoKTtcbiAgICBpZiAoa2V5cy5sZW5ndGggPT0gMCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBrZXlzO1xuICB9XG4gIHB1YmxpYyBnZXRKc29uKCk6IGFueSB7XG4gICAgaWYgKCEhdGhpcy5zaGFyZWREYXRhKSByZXR1cm4gdGhpcy5zaGFyZWREYXRhLmdldEpzb24oKTtcbiAgICB2YXIga2V5cyA9IHRoaXMuZ2V0VmFsdWVzS2V5cygpO1xuICAgIGlmIChrZXlzLmxlbmd0aCA9PSAwKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoXG4gICAgICBrZXlzLmxlbmd0aCA9PSAxICYmXG4gICAgICBrZXlzWzBdID09IHNldHRpbmdzLmRlZmF1bHRMb2NhbGVOYW1lICYmXG4gICAgICAhc2V0dGluZ3Muc2VyaWFsaXplTG9jYWxpemFibGVTdHJpbmdBc09iamVjdFxuICAgIClcbiAgICAgIHJldHVybiAoPGFueT50aGlzKS52YWx1ZXNba2V5c1swXV07XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzO1xuICB9XG4gIHB1YmxpYyBzZXRKc29uKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoISF0aGlzLnNoYXJlZERhdGEpIHtcbiAgICAgIHRoaXMuc2hhcmVkRGF0YS5zZXRKc29uKHZhbHVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy52YWx1ZXMgPSB7fTtcbiAgICB0aGlzLmh0bWxWYWx1ZXMgPSB7fTtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm47XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhpcy5zZXRMb2NhbGVUZXh0KG51bGwsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2V0TG9jYWxlVGV4dChrZXksIHZhbHVlW2tleV0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN0ckNoYW5nZWQoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHJlbmRlckFzKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLm93bmVyIHx8IHR5cGVvZiB0aGlzLm93bmVyLmdldFJlbmRlcmVyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiBMb2NhbGl6YWJsZVN0cmluZy5kZWZhdWx0UmVuZGVyZXI7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm93bmVyLmdldFJlbmRlcmVyKHRoaXMubmFtZSkgfHwgTG9jYWxpemFibGVTdHJpbmcuZGVmYXVsdFJlbmRlcmVyO1xuICB9XG4gIHB1YmxpYyBnZXQgcmVuZGVyQXNEYXRhKCk6IGFueSB7XG4gICAgaWYgKCF0aGlzLm93bmVyIHx8IHR5cGVvZiB0aGlzLm93bmVyLmdldFJlbmRlcmVyQ29udGV4dCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMub3duZXIuZ2V0UmVuZGVyZXJDb250ZXh0KHRoaXMpIHx8IHRoaXM7XG4gIH1cbiAgcHVibGljIGVxdWFscyhvYmo6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICghIXRoaXMuc2hhcmVkRGF0YSkgcmV0dXJuIHRoaXMuc2hhcmVkRGF0YS5lcXVhbHMob2JqKTtcbiAgICBpZiAoIW9iaiB8fCAhb2JqLnZhbHVlcykgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHModGhpcy52YWx1ZXMsIG9iai52YWx1ZXMsIGZhbHNlLCB0cnVlLCBmYWxzZSk7XG4gIH1cbiAgcHJpdmF0ZSBzZWFyY2hhYmxlVGV4dDogc3RyaW5nO1xuICBwdWJsaWMgc2V0RmluZFRleHQodGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuc2VhcmNoVGV4dCA9PSB0ZXh0KSByZXR1cm47XG4gICAgdGhpcy5zZWFyY2hUZXh0ID0gdGV4dDtcbiAgICBpZiAoIXRoaXMuc2VhcmNoYWJsZVRleHQpIHtcbiAgICAgIGxldCB0ZXh0T3JIdG1sID0gdGhpcy50ZXh0T3JIdG1sO1xuICAgICAgdGhpcy5zZWFyY2hhYmxlVGV4dCA9ICEhdGV4dE9ySHRtbCA/IHRleHRPckh0bWwudG9Mb3dlckNhc2UoKSA6IFwiXCI7XG4gICAgfVxuICAgIHZhciBzdHIgPSB0aGlzLnNlYXJjaGFibGVUZXh0O1xuICAgIHZhciBpbmRleCA9ICEhc3RyICYmICEhdGV4dCA/IHN0ci5pbmRleE9mKHRleHQpIDogdW5kZWZpbmVkO1xuICAgIGlmIChpbmRleCA8IDApIGluZGV4ID0gdW5kZWZpbmVkO1xuICAgIGlmIChpbmRleCAhPSB1bmRlZmluZWQgfHwgdGhpcy5zZWFyY2hJbmRleCAhPSBpbmRleCkge1xuICAgICAgdGhpcy5zZWFyY2hJbmRleCA9IGluZGV4O1xuICAgICAgaWYgKCEhdGhpcy5vblNlYXJjaENoYW5nZWQpIHtcbiAgICAgICAgdGhpcy5vblNlYXJjaENoYW5nZWQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2VhcmNoSW5kZXggIT0gdW5kZWZpbmVkO1xuICB9XG4gIHB1YmxpYyBvbkNoYW5nZWQoKSB7fVxuICBwcm90ZWN0ZWQgb25DcmVhdGluZygpIHt9XG4gIHByaXZhdGUgaGFzSHRtbFZhbHVlKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5vd25lciB8fCAhdGhpcy51c2VNYXJrZG93bikgcmV0dXJuIGZhbHNlO1xuICAgIHZhciByZW5kZXJlZFRleHQgPSB0aGlzLmNhbGN1bGF0ZWRUZXh0O1xuICAgIGlmICghcmVuZGVyZWRUZXh0KSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIGxvYyA9IHRoaXMubG9jYWxlO1xuICAgIGlmICghbG9jKSBsb2MgPSBzZXR0aW5ncy5kZWZhdWx0TG9jYWxlTmFtZTtcbiAgICAoPGFueT50aGlzKS5odG1sVmFsdWVzW2xvY10gPSB0aGlzLm93bmVyLmdldE1hcmtkb3duSHRtbChcbiAgICAgIHJlbmRlcmVkVGV4dCxcbiAgICAgIHRoaXMubmFtZVxuICAgICk7XG4gICAgcmV0dXJuICg8YW55PnRoaXMpLmh0bWxWYWx1ZXNbbG9jXSA/IHRydWUgOiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgZ2V0SHRtbFZhbHVlKCk6IHN0cmluZyB7XG4gICAgdmFyIGxvYyA9IHRoaXMubG9jYWxlO1xuICAgIGlmICghbG9jKSBsb2MgPSBzZXR0aW5ncy5kZWZhdWx0TG9jYWxlTmFtZTtcbiAgICByZXR1cm4gKDxhbnk+dGhpcykuaHRtbFZhbHVlc1tsb2NdO1xuICB9XG4gIHByaXZhdGUgZGVsZXRlVmFsdWVzRXF1YWxzVG9EZWZhdWx0KGRlZmF1bHRWYWx1ZTogc3RyaW5nKSB7XG4gICAgdmFyIGtleXMgPSB0aGlzLmdldFZhbHVlc0tleXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChrZXlzW2ldID09IHNldHRpbmdzLmRlZmF1bHRMb2NhbGVOYW1lKSBjb250aW51ZTtcbiAgICAgIGlmICh0aGlzLmdldFZhbHVlKGtleXNbaV0pID09IGRlZmF1bHRWYWx1ZSkge1xuICAgICAgICB0aGlzLmRlbGV0ZVZhbHVlKGtleXNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldFZhbHVlKGxvYzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoISF0aGlzLnNoYXJlZERhdGEpIHJldHVybiB0aGlzLnNoYXJlZERhdGEuZ2V0VmFsdWUobG9jKTtcbiAgICByZXR1cm4gKDxhbnk+dGhpcykudmFsdWVzW2xvY107XG4gIH1cbiAgcHJpdmF0ZSBzZXRWYWx1ZShsb2M6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgIGlmICghIXRoaXMuc2hhcmVkRGF0YSkgdGhpcy5zaGFyZWREYXRhLnNldFZhbHVlKGxvYywgdmFsdWUpO1xuICAgIGVsc2UgKDxhbnk+dGhpcykudmFsdWVzW2xvY10gPSB2YWx1ZTtcbiAgfVxuICBwcml2YXRlIGRlbGV0ZVZhbHVlKGxvYzogc3RyaW5nKSB7XG4gICAgaWYgKCEhdGhpcy5zaGFyZWREYXRhKSB0aGlzLnNoYXJlZERhdGEuZGVsZXRlVmFsdWUobG9jKTtcbiAgICBlbHNlIGRlbGV0ZSAoPGFueT50aGlzKS52YWx1ZXNbbG9jXTtcbiAgfVxuICBwcml2YXRlIGdldFZhbHVlc0tleXMoKTogc3RyaW5nW10ge1xuICAgIGlmICghIXRoaXMuc2hhcmVkRGF0YSkgcmV0dXJuIHRoaXMuc2hhcmVkRGF0YS5nZXRWYWx1ZXNLZXlzKCk7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMudmFsdWVzKTtcbiAgfVxufVxuLyoqXG4gKiBUaGUgY2xhc3MgcmVwcmVzZW50cyB0aGUgbGlzdCBvZiBzdHJpbmdzIHRoYXQgc3VwcG9ydHMgbXVsdGktbGFuZ3VhZ2VzLlxuICovXG5leHBvcnQgY2xhc3MgTG9jYWxpemFibGVTdHJpbmdzIGltcGxlbWVudHMgSUxvY2FsaXphYmxlU3RyaW5nIHtcbiAgcHJpdmF0ZSB2YWx1ZXM6IGFueSA9IHt9O1xuICBwdWJsaWMgb25WYWx1ZUNoYW5nZWQ6IChvbGRWYWx1ZTogYW55LCBuZXdWYWx1ZTogYW55KSA9PiB2b2lkO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgb3duZXI6IElMb2NhbGl6YWJsZU93bmVyKSB7fVxuICBwdWJsaWMgZ2V0SXNNdWx0aXBsZSgpOiBib29sZWFuIHsgcmV0dXJuIHRydWU7IH1cbiAgcHVibGljIGdldCBsb2NhbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMub3duZXIgJiYgdGhpcy5vd25lci5nZXRMb2NhbGUgPyB0aGlzLm93bmVyLmdldExvY2FsZSgpIDogXCJcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IHZhbHVlKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmdldFZhbHVlKFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdmFsdWUodmFsOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgdGhpcy5zZXRWYWx1ZShcIlwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgdGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpID8gdGhpcy52YWx1ZS5qb2luKFwiXFxuXCIpIDogXCJcIjtcbiAgfVxuICBwdWJsaWMgc2V0IHRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnZhbHVlID0gISF2YWwgPyB2YWwuc3BsaXQoXCJcXG5cIikgOiBbXTtcbiAgfVxuICBwdWJsaWMgZ2V0TG9jYWxlVGV4dChsb2M6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdmFyIHJlcyA9IHRoaXMuZ2V0VmFsdWVDb3JlKGxvYywgIWxvYyB8fCBsb2MgPT09IHRoaXMubG9jYWxlKTtcbiAgICBpZiAoIXJlcyB8fCAhQXJyYXkuaXNBcnJheShyZXMpIHx8IHJlcy5sZW5ndGggPT0gMCkgcmV0dXJuIFwiXCI7XG4gICAgcmV0dXJuIHJlcy5qb2luKFwiXFxuXCIpO1xuICB9XG4gIHB1YmxpYyBzZXRMb2NhbGVUZXh0KGxvYzogc3RyaW5nLCBuZXdWYWx1ZTogc3RyaW5nKTogYW55IHtcbiAgICB2YXIgdmFsID0gISFuZXdWYWx1ZSA/IG5ld1ZhbHVlLnNwbGl0KFwiXFxuXCIpIDogbnVsbDtcbiAgICB0aGlzLnNldFZhbHVlKGxvYywgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0VmFsdWUobG9jOiBzdHJpbmcpOiBBcnJheTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZUNvcmUobG9jKTtcbiAgfVxuICBwcml2YXRlIGdldFZhbHVlQ29yZShsb2M6IHN0cmluZywgdXNlRGVmYXVsdDogYm9vbGVhbiA9IHRydWUpOiBBcnJheTxzdHJpbmc+IHtcbiAgICBsb2MgPSB0aGlzLmdldExvY2FsZShsb2MpO1xuICAgIGlmICh0aGlzLnZhbHVlc1tsb2NdKSByZXR1cm4gdGhpcy52YWx1ZXNbbG9jXTtcbiAgICBpZiAodXNlRGVmYXVsdCkge1xuICAgICAgdmFyIGRlZkxvYyA9IHNldHRpbmdzLmRlZmF1bHRMb2NhbGVOYW1lO1xuICAgICAgaWYgKGxvYyAhPT0gZGVmTG9jICYmIHRoaXMudmFsdWVzW2RlZkxvY10pIHJldHVybiB0aGlzLnZhbHVlc1tkZWZMb2NdO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cbiAgcHVibGljIHNldFZhbHVlKGxvYzogc3RyaW5nLCB2YWw6IEFycmF5PHN0cmluZz4pIHtcbiAgICBsb2MgPSB0aGlzLmdldExvY2FsZShsb2MpO1xuICAgIGNvbnN0IG9sZFZhbHVlID0gSGVscGVycy5jcmVhdGVDb3B5KHRoaXMudmFsdWVzKTtcbiAgICBpZiAoIXZhbCB8fCB2YWwubGVuZ3RoID09IDApIHtcbiAgICAgIGRlbGV0ZSB0aGlzLnZhbHVlc1tsb2NdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlc1tsb2NdID0gdmFsO1xuICAgIH1cbiAgICBpZighIXRoaXMub25WYWx1ZUNoYW5nZWQpIHtcbiAgICAgIHRoaXMub25WYWx1ZUNoYW5nZWQob2xkVmFsdWUsIHRoaXMudmFsdWVzKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGhhc1ZhbHVlKGxvYzogc3RyaW5nID0gXCJcIik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5pc0VtcHR5ICYmIHRoaXMuZ2V0VmFsdWUobG9jKS5sZW5ndGggPiAwO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZXNLZXlzKCkubGVuZ3RoID09IDA7XG4gIH1cbiAgcHJpdmF0ZSBnZXRMb2NhbGUobG9jOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghIWxvYykgcmV0dXJuIGxvYztcbiAgICBsb2MgPSB0aGlzLmxvY2FsZTtcbiAgICByZXR1cm4gISFsb2MgPyBsb2MgOiBzZXR0aW5ncy5kZWZhdWx0TG9jYWxlTmFtZTtcbiAgfVxuICBwdWJsaWMgZ2V0TG9jYWxlcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIga2V5cyA9IHRoaXMuZ2V0VmFsdWVzS2V5cygpO1xuICAgIGlmIChrZXlzLmxlbmd0aCA9PSAwKSByZXR1cm4gW107XG4gICAgcmV0dXJuIGtleXM7XG4gIH1cbiAgcHVibGljIGdldEpzb24oKTogYW55IHtcbiAgICB2YXIga2V5cyA9IHRoaXMuZ2V0VmFsdWVzS2V5cygpO1xuICAgIGlmIChrZXlzLmxlbmd0aCA9PSAwKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoXG4gICAgICBrZXlzLmxlbmd0aCA9PSAxICYmXG4gICAgICBrZXlzWzBdID09IHNldHRpbmdzLmRlZmF1bHRMb2NhbGVOYW1lICYmXG4gICAgICAhc2V0dGluZ3Muc2VyaWFsaXplTG9jYWxpemFibGVTdHJpbmdBc09iamVjdFxuICAgICkgcmV0dXJuICg8YW55PnRoaXMpLnZhbHVlc1trZXlzWzBdXTtcbiAgICByZXR1cm4gSGVscGVycy5jcmVhdGVDb3B5KHRoaXMudmFsdWVzKTtcbiAgfVxuICBwdWJsaWMgc2V0SnNvbih2YWx1ZTogYW55KSB7XG4gICAgdGhpcy52YWx1ZXMgPSB7fTtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm47XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICB0aGlzLnNldFZhbHVlKG51bGwsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2V0VmFsdWUoa2V5LCB2YWx1ZVtrZXldKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXRWYWx1ZXNLZXlzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy52YWx1ZXMpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGFyYWJpY1N1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCLYp9mE2LPYp9io2YJcIixcbiAgcGFnZU5leHRUZXh0OiBcItin2YTYqtin2YTZilwiLFxuICBjb21wbGV0ZVRleHQ6IFwi2KXYsdiz2KfZhCDYp9mE2KjZitin2YbYp9iqXCIsXG4gIHByZXZpZXdUZXh0OiBcItmF2LnYp9mK2YbYqVwiLFxuICBlZGl0VGV4dDogXCLYqti52K/ZitmEXCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCLYqNiv2KfZitipXCIsXG4gIG90aGVySXRlbVRleHQ6IFwi2YbYtSDYotiu2LFcIixcbiAgbm9uZUl0ZW1UZXh0OiBcItmE2Kcg2LTZitihXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcItin2K7YqtixINin2YTZg9mEXCIsXG4gIHByb2dyZXNzVGV4dDogXCJ7MX0g2LXZgdit2KkgezB9INmF2YZcIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcItiz2KzZhCB7MH0g2YXZhiB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcItiq2YXYqiDYp9mE2KXYrNin2KjYqSDYudmE2Ykg2KPYs9im2YTYqSB7MH0gLyB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwi2YTYpyDYqtmI2KzYryDYtdmB2K3YqSDZhdix2KbZitipINij2Ygg2LPYpNin2YQg2YHZiiDYp9mE2YbZhdmI2LDYrFwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIti02YPYsdinINmE2YPZhSDZhNin2LPYqtmD2YXYp9mEINin2YTZhtmF2YjYsNisIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwi2KrYuNmH2LEg2LPYrNmE2KfYqtmG2Kcg2KPZhtmDINmC2K8g2KPZg9mF2YTYqiDZh9iw2Kcg2KfZhNin2LPYqti32YTYp9i5INio2KfZhNmB2LnZhC5cIixcbiAgbG9hZGluZ1N1cnZleTogXCIuLi7Zitiq2YUg2KrYrdmF2YrZhCDYp9mE2YbZhdmI2LDYrFwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCIuLi7Yp9iu2KrYsVwiLFxuICB2YWx1ZTogXCLYp9mE2YLZitmF2KlcIixcbiAgcmVxdWlyZWRFcnJvcjogXCIu2YrYsdis2Ykg2KfZhNil2KzYp9io2Kkg2LnZhNmJINin2YTYs9ik2KfZhFwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCLYp9mE2LHYrNin2KEg2KfZhNil2KzYp9io2Kkg2LnZhNmJINiz2KTYp9mEINmI2KfYrdivINi52YTZiSDYp9mE2KPZgtmELlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcItmK2LHYrNmJINin2YTYpdis2KfYqNipINi52YTZiSDYp9mE2KPYs9im2YTYqSDZgdmKINis2YXZiti5INin2YTYtdmB2YjZgVwiLFxuICBudW1lcmljRXJyb3I6IFwi2YrYrNioINij2YYg2KrZg9mI2YYg2KfZhNmC2YrZhdipINix2YLZhdmK2KkuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwi2KfZhNix2KzYp9ihINil2K/Yrtin2YQg2YXYpyDZhNinINmK2YLZhCDYudmGIHswfSDYrdix2YjZgVwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcItin2YTYsdis2KfYoSDYpdiv2K7Yp9mEINij2YLZhCDZhdmGIHswfSDYrdix2YjZgVwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcItmK2LHYrNmJINil2K/Yrtin2YQg2KPZg9ir2LEg2YXZhiB7MH0g2YjYo9mC2YQg2YXZhiB7MX0g2K3YsdmI2YFcIixcbiAgbWluUm93Q291bnRFcnJvcjogXCLZitix2KzZiSDZhdmE2KEg2YXYpyDZhNinINmK2YLZhCDYudmGIHswfSDYp9mE2LXZgdmI2YFcIixcbiAgbWluU2VsZWN0RXJyb3I6IFwi2YrYsdis2Ykg2KrYrdiv2YrYryDZhdinINmE2Kcg2YrZgtmEINi52YYgezB9INin2YTZhdiq2LrZitix2KfYqlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCLZitix2KzZiSDYqtit2K/ZitivINmF2Kcg2YTYpyDZitiy2YrYryDYudmGIHswfSDYp9mE2YXYqti62YrYsdin2KpcIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcItmIJ3swfScg2YrYrNioINij2YYg2KrZg9mI2YYg2YXYs9in2YjZitipINij2Ygg2KPZg9ir2LEg2YXZhiB7MX0g2YjYqtiz2KfZiNmKINij2Ygg2KPZgtmEINmF2YYgezJ92KdcIixcbiAgbnVtZXJpY01pbjogXCLZiCd7MH0nINmK2KzYqCDYo9mGINiq2YPZiNmGINmF2LPYp9mI2YrYqSDYo9mIINij2YPYq9ixINmF2YYgezF92KdcIixcbiAgbnVtZXJpY01heDogXCLZiCd7MH0nINmK2KzYqCDYo9mGINiq2YPZiNmGINmF2LPYp9mI2YrYqSDYo9mIINij2YLZhCDZhdmGIHsxfdinXCIsXG4gIGludmFsaWRFbWFpbDogXCLYp9mE2LHYrNin2KEg2KXYr9iu2KfZhCDYqNix2YrYryDYp9mE2YPYqtix2YjZhtmKINi12K3ZititXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcItmK2KzYqCDYo9mGINmK2LnYsdi2INin2YTYqti52KjZitixOiB7MH0gJ9i12YjYp9ioJy5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIti32YTYqCDYpdix2KzYp9i5INiu2LfYoyAnezB9Jy4gezF92KdcIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOiBcIti52KfYryDYt9mE2Kgg2KfZhNio2YrYp9mG2KfYqiDZgdin2LHYuiDYo9mIICfYp9mE2YXYs9in2LEnINi62YrYsSDYtdit2YrYrSBcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCLZitmG2KjYutmKINij2YTYpyDZitiq2KzYp9mI2LIg2K3YrNmFINin2YTZhdmE2YEgezB92KdcIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcItin2YTYsdis2KfYoSDYpdiv2K7Yp9mEINmC2YrZhdipINij2K7YsdmJXCIsXG4gIHVwbG9hZGluZ0ZpbGU6IFwi2KrYrdmF2YrZhCDYp9mE2YXZhNmBINin2YTYrtin2LUg2KjZgy4g2YrYsdis2Ykg2KfZhNin2YbYqti42KfYsSDYudiv2Kkg2KvZiNin2YYg2YjYp9mE2YXYrdin2YjZhNipINmE2KfYrdmC2YvYp1wiLFxuICBsb2FkaW5nRmlsZTogXCLYrNin2LEg2KfZhNiq2K3ZhdmK2YQuLi5cIixcbiAgY2hvb3NlRmlsZTogXCLYp9iu2KrYsSDYp9mE2YXZhNmB2KfYqi4uLlwiLFxuICBub0ZpbGVDaG9zZW46IFwi2YTZhSDYqtmC2YUg2KjYp9iu2KrZitin2LEg2YXZhNmBXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwi2YfZhCDYqtix2YrYryDYrdiw2YEg2KfZhNiz2KzZhNifXCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwi2YrYrNioINij2YYg2KrZg9mI2YYg2YfYsNmHINin2YTZgtmK2YXYqSDZgdix2YrYr9ipLlwiLFxuICBhZGRDb2x1bW46IFwi2KPYttmBINin2YTYudmF2YjYr1wiLFxuICBhZGRSb3c6IFwi2KfYttin2YHYqSDYtdmBXCIsXG4gIHJlbW92ZVJvdzogXCLYpdiy2KfZhNipINi12YFcIixcbiAgYWRkUGFuZWw6IFwi2KfYttmBINis2K/ZitivXCIsXG4gIHJlbW92ZVBhbmVsOiBcItil2LLYp9mE2KlcIixcbiAgY2hvaWNlc19JdGVtOiBcItio2YbYr1wiLFxuICBtYXRyaXhfY29sdW1uOiBcIti52YXZiNivXCIsXG4gIG1hdHJpeF9yb3c6IFwi2LXZgVwiLFxuICBzYXZpbmdEYXRhOiBcItmK2KrZhSDYrdmB2Lgg2KfZhNmG2KrYp9im2Kwg2LnZhNmJINin2YTYrtin2K/ZhSAuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcItit2K/YqyDYrti32KMg2YjZhNmFINmG2KrZhdmD2YYg2YXZhiDYrdmB2Lgg2KfZhNmG2KrYp9im2KwuXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcItiq2YUg2K3Zgdi4INin2YTZhtiq2KfYptisINio2YbYrNin2K0hXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCLYrdin2YjZhCDZhdis2K/Yr9inXCIsXG4gIHRpbWVyTWluOiBcItiv2YLZitmC2KlcIixcbiAgdGltZXJTZWM6IFwi2KvYp9mG2YrYqVwiLFxuICB0aW1lclNwZW50QWxsOiBcItmE2YLYryDYo9mG2YHZgtiqIHswfSDYudmE2Ykg2YfYsNmHINin2YTYtdmB2K3YqSDZiCB7MX0g2KXYrNmF2KfZhNin2YsuXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcItmE2YLYryDYo9mG2YHZgtiqIHswfSDYudmE2Ykg2YfYsNmHINin2YTYtdmB2K3YqS5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCLZhNmC2K8g2KPZhtmB2YLYqiB7MH0g2KXYrNmF2KfZhNin2YsuXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCLZhNmC2K8g2KPZhtmB2YLYqiB7MH0g2YXZhiB7MX0g2YHZiiDZh9iw2Ycg2KfZhNi12YHYrdipINmIIHsyfSDZhdmGINil2KzZhdin2YTZiiB7M30uXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcItmE2YLYryDYo9mG2YHZgtiqIHswfSDZhdmGIHsxfSDZgdmKINmH2LDZhyDYp9mE2LXZgdit2KkuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwi2YTZgtivINij2YbZgdmC2KogezB9INmF2YYg2KXYrNmF2KfZhNmKIHsxfS5cIixcbiAgY2xlYW5DYXB0aW9uOiBcItmG2LjZitmBXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCLZiNin2LbYrVwiLFxuICBjaG9vc2VGaWxlQ2FwdGlvbjogXCLYp9iu2KrYsSDZhdmE2YFcIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwi2YLZhSDYqNil2LLYp9mE2Kkg2YfYsNinINin2YTZhdmE2YFcIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCLZhti52YVcIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcItmE2KdcIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwi2YfZhCDYo9mG2Kog2YXYqtij2YPYryDYo9mG2YMg2KrYsdmK2K8g2KXYstin2YTYqSDZh9iw2Kcg2KfZhNmF2YTZgTogezB92J9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcItmH2YQg2KPZhtiqINmF2KrYo9mD2K8g2KPZhtmDINiq2LHZitivINil2LLYp9mE2Kkg2YPYp9mB2Kkg2KfZhNmF2YTZgdin2KrYn1wiLFxuICBxdWVzdGlvblRpdGxlUGF0dGVyblRleHQ6IFwi2LnZhtmI2KfZhiDYp9mE2LPYpNin2YRcIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiYXJcIl0gPSBhcmFiaWNTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiYXJcIl0gPSBcItin2YTYudix2KjZitipXCI7XG4iLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGJhc3F1ZVN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJBdXJyZWtvYVwiLFxuICBwYWdlTmV4dFRleHQ6IFwiSHVycmVuZ29hXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJCdWthdHVcIixcbiAgcHJldmlld1RleHQ6IFwiQXVycmViaXN0YVwiLFxuICBlZGl0VGV4dDogXCJFZGl0YXR1XCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCJIYXNpXCIsXG4gIG90aGVySXRlbVRleHQ6IFwiQmVzdGUgYmF0ICh6ZWhhenR1KVwiLFxuICBub25lSXRlbVRleHQ6IFwiQmF0IGVyZSBlelwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCJHdXp0aWEgaGF1dGF0dVwiLFxuICBwcm9ncmVzc1RleHQ6IFwiezF9LShlKXRpayB7MH0gb3JyaWFsZGVcIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcInswfSBlcnJpZ2lzdHJvIHsxfS0oZSl0aWtcIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcIkVyYW50enVuZGFrbyBnYWxkZXJhayB7MH0vezF9XCIsXG4gIGVtcHR5U3VydmV5OiBcIkV6IGRhZ28gb3JyaWFsZGUgYmlzdGFyYWdhcnJpcmlrIGVkbyBleiBkYWdvIGdhbGRlcmFyaWsuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiRXNrZXJyaWsgYXNrbyBnYWxkZXRlZ2lhIGVyYW50enV0ZWFnYXRpayFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTogXCJHdXJlIGRhdHVlayBkaW90ZSBkYWdvZW5la28gZ2FsZGV0ZWdpYSBlcmFudHp1biBkdXp1bGEuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiR2FsZGV0ZWdpYSBrYXJnYXR6ZW4uLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiSGF1dGF0dS4uLlwiLFxuICB2YWx1ZTogXCJiYWxpb2FcIixcbiAgcmVxdWlyZWRFcnJvcjogXCJNZXNlZGV6LCBnYWxkZXJhIGVyYW50enVuLlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJNZXNlZGV6LCBndXR4aWVuZXogZ2FsZGVyYSBiYXQgZXJhbnR6dW4uXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiTWVzZWRleiwgZXJyZW5rYWRha28gZ2FsZGVyYSBndXp0aWFrIGVyYW50enVuLlwiLFxuICBudW1lcmljRXJyb3I6IFwiRXN0aW1hemlvYSB6ZW5iYWtpemtvYSBpemFuIGJlaGFyIGR1LlwiLFxuICBtaW5FcnJvcjogXCJCYWxpb2EgZXogZGEgezB9IGJhaW5vIHR4aWtpYWdvYSBpemFuIGJlaGFyXCIsXG4gIG1heEVycm9yOiBcIkJhbGlvYSBleiBkYSB7MH0gYmFpbm8gaGFuZGlhZ29hIGl6YW4gYmVoYXJcIixcbiAgdGV4dE1pbkxlbmd0aDogXCJNZXNlZGV6LCBndXR4aWVuZXogezB9IGthcmFrdGVyZSBlcmFiaWxpIGJlaGFyIGRpcmEuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiTWVzZWRleiwgZ2VoaWVuZXogezB9IGthcmFrdGVyZSBlcmFiaWxpIGJlaGFyIGRpcmEuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiTWVzZWRleiwgZ2VoaWVuZXogezB9IGV0YSBndXR4aWVuZXogezF9IGthcmFrdGVyZSBlcmFiaWxpIGJlaGFyIGRpcmEuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiTWVzZWRleiwgZ3V0eGllbmV6IHswfSBlcnJlbmthZGEgYmV0ZS5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiTWVzZWRleiwgZ3V0eGllbmV6IHswfSBhdWtlcmEgaGF1dGF0dS5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiTWVzZWRleiwgezB9IGF1a2VyYSBiYWlubyBnZWhpYWdvIGV6IGhhdXRhdHUuXCIsXG4gIG51bWVyaWNNaW5NYXg6IFwiRWwgJ3swfScgZGViZSBkZSBzZXIgaWd1YWwgbyBtw6FzIGRlIHsxfSB5IGlndWFsIG8gbWVub3MgZGUgezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScgezF9IGJhaW5vIGhhbmRpYWdvYSBlZG8gYmVyZGluIGl6YW4gYmVoYXIgZGFcIixcbiAgbnVtZXJpY01heDogXCInezB9JyB7MX0gYmFpbm8gdHhpa2lhZ28gZWRvIGJlcmRpbiBpemFuIGJlaGFyIGRhXCIsXG4gIGludmFsaWRFbWFpbDogXCJNZXNlZGV6LCBiYWxpb3prbyBlbWFpbGEgaWRhdHogZXphenUuXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcInswfSBhZGllcmF6cGVuYWsgJ2VnaWF6a29hJyBpdHp1bGkgYmVoYXJrbyBsdWtlLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiRXNrYWVyYWsgJ3swfScgZXJyb3JlYSBpdHp1bGkgZHUuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6IFwiTGEgc29saWNpdHVkIHJlZ3Jlc8OzIHZhY8OtbyBkZSBkYXRhIG8gbGEgcHJvcGllZGFkICd0cmF5ZWN0b3JpYScgbm8gZXMgY29ycmVjdGFcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJGaXR4YXRlZ2lhcmVuIHRhbWFpbmEgZXogZGEgezB9IGJhaW5vIGhhbmRpYWdvYSBpemFuIGJlaGFyLlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiTWVzZWRleiwgYmVzdGUgZXN0aW1hemlvYSBnZWhpdHUuXCIsXG4gIHVwbG9hZGluZ0ZpbGU6IFwiWnVyZSBmaXR4YXRlZ2lhIGlnb3R6ZW4gYXJpIGRhLiBNZXNlZGV6LCBzZWd1bmRvIGJhdHp1ayBpdHhhcm9uIGV0YSBzYWlhdHUgYmVycmlyby5cIixcbiAgbG9hZGluZ0ZpbGU6IFwiS2FyZ2F0emVuLi4uXCIsXG4gIGNob29zZUZpbGU6IFwiRml0eGF0ZWdpYShrKSBoYXV0YXR1Li4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCJFeiBkYSBpbm9sYWtvIGZpdHhhdGVnaXJpayBoYXV0YXR1XCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiwr9FcnJlZ2lzdHJvYSBib3JyYXR1IG5haGkgYWwgZHV6dT9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJCYWxpbyBoYXUgYmFrYXJyYSBpemFuIGJlaGFyIGR1LlwiLFxuICBhZGRDb2x1bW46IFwiWnV0YWJlIGJhdCBnZWhpdHVcIixcbiAgYWRkUm93OiBcIkVycmVua2FkYSBiYXQgZ2VoaXR1XCIsXG4gIHJlbW92ZVJvdzogXCJFcnJlbmthZGEgYmF0IGtlbmR1XCIsXG4gIGVtcHR5Um93c1RleHQ6IFwiRXogZGFnbyBlcnJlbmthZGFyaWsuXCIsXG4gIGFkZFBhbmVsOiBcIkJlcnJpYSBnZWhpdHVcIixcbiAgcmVtb3ZlUGFuZWw6IFwiS2VuZHVcIixcbiAgY2hvaWNlc19JdGVtOiBcImFydGlrdWx1YVwiLFxuICBtYXRyaXhfY29sdW1uOiBcIlp1dGFiZWFcIixcbiAgbWF0cml4X3JvdzogXCJFcnJlbmthZGFcIixcbiAgbXVsdGlwbGV0ZXh0X2l0ZW1uYW1lOiBcInRlc3R1YVwiLFxuICBzYXZpbmdEYXRhOiBcIkVyYW50enVuYWsgemVyYml0emFyaWFuIGdvcmRldHplbiBhcmkgZGlyYS4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiRXJyb3JlcmVuIGJhdCBnZXJ0YXR1IGV0YSBlcmFudHp1bmFrIGV6IGRpcmEgemVyYml0emFyaWFuIGdvcmRlIGFoYWwgaXphbi5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiRXJhbnR6dW5hayBlZ29raSBnb3JkZSBkaXJhIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiQmVycmlybyBzYWlhdHUuXCIsXG4gIHRpbWVyTWluOiBcIm1pblwiLFxuICB0aW1lclNlYzogXCJzZWdcIixcbiAgdGltZXJTcGVudEFsbDogXCJ7MH0gZXJhYmlsaSBkdXp1IG9ycmlhbGRlIGhvbmV0YW4gZXRhIG9yb3RhcmEgezF9LlwiLFxuICB0aW1lclNwZW50UGFnZTogXCJadWsgezB9IGVyYWJpbGkgZHV6dS5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCJPcm90YXJhIGdhc3RhdHUgZHV6dS5cIixcbiAgdGltZXJMaW1pdEFsbDogXCJ7MH0gZ2FzdGF0dSBkdXp1IHsxfS0oZSl0aWsgb3JyaWFsZGUgaG9uZXRhbiBldGEgb3JvdGFyYSB7Mn0gezN9LShlKXRpay5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiezB9IGdhc3RhdHUgZHV6dSBvcnJpYWxkZSBob25ldGFuIHsxfS0oZSl0aWsuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiWnVrIG9yb3RhcmEgezB9IGdhc3RhdHUgZHV6dSB7MX0tKGUpdGlrLlwiLFxuICBjbGVhbkNhcHRpb246IFwiR2FyYml0dVwiLFxuICBjbGVhckNhcHRpb246IFwiSHVzdHVcIixcbiAgc2lnbmF0dXJlUGxhY2VIb2xkZXI6IFwiU2luYXR1IGhlbWVuXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcIkZpdHhhdGVnaWEgaGF1dGF0dVwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCJGaXR4YXRlZ2kgaGF1IGV6YWJhdHVcIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCJCYWlcIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcIkV6XCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcIlppdXIgemF1ZGUgaHVycmVuZ28gZml0eGF0ZWdpYSBlemFiYXR1IG5haGkgZHV6dWxhOiB7MH0/XCIsXG4gIGNvbmZpcm1SZW1vdmVBbGxGaWxlczogXCJaaXVyIGFsIHphdWRlIGZpdHhhdGVnaSBndXp0aWFrIGV6YWJhdHUgbmFoaSBkaXR1enVsYT9cIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcIkdhbGRlcmFyZW4gaXplbmJ1cnVhXCIsXG4gIG1vZGFsQ2FuY2VsQnV0dG9uVGV4dDogXCJFemV6dGF0dVwiLFxuICBtb2RhbEFwcGx5QnV0dG9uVGV4dDogXCJFemFycmlcIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiZXVcIl0gPSBiYXNxdWVTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiZXVcIl0gPSBcIkV1c2thcmFcIjtcbiIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgYnVsZ2FyaWFuU3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcItCd0LDQt9Cw0LRcIixcbiAgcGFnZU5leHRUZXh0OiBcItCd0LDQv9GA0LXQtFwiLFxuICBjb21wbGV0ZVRleHQ6IFwi0JrRgNCw0LlcIixcbiAgcHJldmlld1RleHQ6IFwi0JLQuNC30YPQsNC70LjQt9Cw0YbQuNGPXCIsXG4gIGVkaXRUZXh0OiBcItGA0LXQtNCw0LrRgtC40YDQsNC90LVcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcItCd0LDRh9Cw0LvQvlwiLFxuICBvdGhlckl0ZW1UZXh0OiBcItCU0YDRg9Cz0L4gKNC+0L/QuNGI0LXRgtC1KVwiLFxuICBub25lSXRlbVRleHQ6IFwi0J3QuNGC0L4g0LXQtNC40L1cIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwi0JLRgdC40YfQutC4XCIsXG4gIHByb2dyZXNzVGV4dDogXCLRgdGC0YAuIHswfSwg0L7QsdGJ0L4g0YHRgtGALiB7MX1cIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcItCX0LDQv9C40YEgezB9INC+0YIgezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCLQntGC0LPQvtCy0L7RgNC10L3QuCDQvdCwIHswfSAvIHsxfSDQstGK0L/RgNC+0YHQsFwiLFxuICBlbXB0eVN1cnZleTogXCLQkNC90LrQtdGC0LDRgtCwINC90LUg0YHRitC00YrRgNC20LAg0LLQuNC00LjQvNC4INGB0YLRgNCw0L3QuNGG0Lgg0LjQu9C4INCy0YrQv9GA0L7RgdC4LlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcItCR0LvQsNCz0L7QtNCw0YDQuNC8INCy0Lgg0LfQsCDRg9GH0LDRgdGC0LjQtdGC0L4g0LIg0LDQvdC60LXRgtCw0YLQsCFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTogXCLQmNC30LPQu9C10LbQtNCwLCDRh9C1INCy0LjQtSDQstC10YfQtSDRgdGC0LUg0L/QvtC/0YrQu9C90LjQu9C4INCw0L3QutC10YLQsNGC0LAuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwi0JfQsNGA0LXQttC00LDQvdC1INC90LAg0LDQvdC60LXRgtCw0YLQsC4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCLQmNC30LHQtdGA0LXRgtC1Li4uXCIsXG4gIHZhbHVlOiBcInZhbHVlXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwi0JzQvtC70Y8sINC+0YLQs9C+0LLQvtGA0LXRgtC1INC90LAg0YHQu9C10LTQvdC40Y8g0LLRitC/0YDQvtGBLlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCLQnNC+0LvRjywg0L7RgtCz0L7QstC+0YDQtdGC0LUg0L/QvtC90LUg0L3QsCDQtdC00LjQvSDQvtGCINCy0YrQv9GA0L7RgdC40YLQtS5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCLQnNC+0LvRjywg0L7RgtCz0L7QstC+0YDQtdGC0LUg0L3QsCDQstGK0L/RgNC+0YHQuNGC0LUg0L3QsCDQstGB0LjRh9C60Lgg0YDQtdC00L7QstC1LlwiLFxuICBudW1lcmljRXJyb3I6IFwi0KHRgtC+0LnQvdC+0YHRgtGC0LAg0YHQu9C10LTQstCwINC00LAg0LHRitC00LUg0YfQuNGB0LvQvi5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCLQnNC+0LvRjywg0LjQt9C/0L7Qu9C30LLQsNC50YLQtSDQv9C+0L3QtSB7MH0g0YHQuNC80LLQvtC70LAuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwi0JzQvtC70Y8sINC40LfQv9C+0LvQt9Cy0LDQudGC0LUg0L3QtSDQv9C+0LLQtdGH0LUg0L7RgiB7MH0g0YHQuNC80LLQvtC70LAuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6XG4gICAgXCLQnNC+0LvRjywg0LjQt9C/0L7Qu9C30LLQsNC50YLQtSDQv9C+0LLQtdGH0LUg0L7RgiB7MH0g0Lgg0L/Qvi3QvNCw0LvQutC+INC+0YIgezF9INGB0LjQvNCy0L7Qu9CwLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcItCc0L7Qu9GPLCDQv9C+0L/RitC70L3QtdGC0LUg0L/QvtC90LUgezB9INGA0LXQtNCwLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCLQnNC+0LvRjywg0LjQt9Cx0LXRgNC10YLQtSDQv9C+0L3QtSB7MH0g0LLQsNGA0LjQsNC90YLQsC5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwi0JzQvtC70Y8sINC40LfQsdC10YDQtdGC0LUg0L3QtSDQv9C+0LLQtdGH0LUg0L7RgiB7MH0g0LLQsNGA0LjQsNC90YLQsC5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcItCh0YLQvtC50L3QvtGB0YLRgtCwICd7MH0nINGB0LvQtdC00LLQsCDQtNCwINCx0YrQtNC1INGA0LDQstC90LAg0LjQu9C4INC/0L4t0LPQvtC70Y/QvNCwINC+0YIgezF9INC4INGA0LDQstC90LAg0LjQu9C4INC/0L4t0LzQsNC70LrQsCDQvtGCIHsyfVwiLFxuICBudW1lcmljTWluOiBcItCh0YLQvtC50L3QvtGB0YLRgtCwICd7MH0nINGB0LvQtdC00LLQsCDQtNCwINCx0YrQtNC1INGA0LDQstC90LAg0LjQu9C4INC/0L4t0LPQvtC70Y/QvNCwINC+0YIgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwi0KHRgtC+0LnQvdC+0YHRgtGC0LAgJ3swfScg0YHQu9C10LTQstCwINC00LAg0LHRitC00LUg0YDQsNCy0L3QsCDQuNC70Lgg0L/Qvi3QvNCw0LvQutCwINC+0YIgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCLQnNC+0LvRjywg0LLRitCy0LXQtNC10YLQtSDQstCw0LvQuNC00LXQvSDQsNC00YDQtdGBINC90LAg0LXQu9C10LrRgtGA0L7QvdC90LAg0L/QvtGJ0LAuXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcItCY0LfRgNCw0LfRitGCOiB7MH0g0YLRgNGP0LHQstCwINC00LAg0LTQsNCy0LAg0YDQtdC30YPQu9GC0LDRgiAndHJ1ZScgKNC40YHRgtC40L3QsCkuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCLQl9Cw0Y/QstC60LDRgtCwINCy0L7QtNC4INC00L4g0LPRgNC10YjQutCwICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwi0JfQsNGP0LLQutCw0YLQsCDQvdC1INCy0YDRitGJ0LAg0LTQsNC90L3QuCDQuNC70Lgg0YfQsNGB0YLRgtCwICdwYXRoJyAo0L/RitGCINC00L4g0YLRitGA0YHQtdC90LjRjyDRgNC10YHRg9GA0YEg0L3QsCDRgdGK0YDQstGK0YDQsCkg0LUg0L3QtdC/0YDQsNCy0LjQu9C90L4g0LfQsNC00LDQtNC10L3QsFwiLFxuICBleGNlZWRNYXhTaXplOiBcItCg0LDQt9C80LXRgNGK0YIg0L3QsCDRhNCw0LnQu9CwINGB0LvQtdC00LLQsCDQtNCwINC90LUg0L/RgNC10LLQuNGI0LDQstCwIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcItCc0L7Qu9GPLCDQstGK0LLQtdC00LXRgtC1INC00YDRg9Cz0LDRgtCwINGB0YLQvtC50L3QvtGB0YIuXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCLQktCw0YjQuNGCINGE0LDQudC7INGB0LUg0LfQsNGA0LXQttC00LAg0L3QsCDRgdGK0YDQstGK0YDQsC4g0JzQvtC70Y8sINC40LfRh9Cw0LrQsNC50YLQtSDQvdGP0LrQvtC70LrQviDRgdC10LrRg9C90LTQuCDQuCDRgtC+0LPQsNCy0LAg0L7Qv9C40YLQstCw0LnRgtC1INC+0YLQvdC+0LLQvi5cIixcbiAgbG9hZGluZ0ZpbGU6IFwi0JfQsNGA0LXQttC00LDQvdC1Li4uXCIsXG4gIGNob29zZUZpbGU6IFwi0JjQt9Cx0LXRgNC10YLQtSDRhNCw0LnQuyjQvtCy0LUpLi4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCLQndGP0LzQsCDQuNC30LHRgNCw0L0g0YTQsNC50LtcIixcbiAgY29uZmlybURlbGV0ZTogXCLQltC10LvQsNC10YLQtSDQu9C4INC00LAg0LjQt9GC0YDQuNC10YLQtSDQt9Cw0L/QuNGB0LA/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwi0KHRgtC+0LnQvdC+0YHRgtGC0LAg0YHQu9C10LTQstCwINC00LAg0LHRitC00LUg0YPQvdC40LrQsNC70L3QsC5cIixcbiAgYWRkQ29sdW1uOiBcItCU0L7QsdCw0LLRj9C90LUg0L3QsCDQutC+0LvQvtC90LBcIixcbiAgYWRkUm93OiBcItCU0L7QsdCw0LLRj9C90LUg0L3QsCDRgNC10LRcIixcbiAgcmVtb3ZlUm93OiBcItCf0YDQtdC80LDRhdCy0LDQvdC1INC90LAg0YDQtdC0XCIsXG4gIGFkZFBhbmVsOiBcItCU0L7QsdCw0LLRj9C90LUg0L3QsCDQv9Cw0L3QtdC7XCIsXG4gIHJlbW92ZVBhbmVsOiBcItCf0YDQtdC80LDRhdCy0LDQvdC1INC90LAg0L/QsNC90LXQu1wiLFxuICBjaG9pY2VzX0l0ZW06IFwi0LXQu9C10LzQtdC90YJcIixcbiAgbWF0cml4X2NvbHVtbjogXCLQmtC+0LvQvtC90LBcIixcbiAgbWF0cml4X3JvdzogXCLQoNC10LRcIixcbiAgc2F2aW5nRGF0YTogXCLQoNC10LfRg9C70YLQsNGC0LjRgtC1INGB0LUg0LfQsNC/0LDQt9Cy0LDRgiDQvdCwINGB0YrRgNCy0YrRgNCwLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjpcbiAgICBcItCf0L7RgNCw0LTQuCDQstGK0LfQvdC40LrQvdCw0LvQsCDQs9GA0LXRiNC60LAg0YDQtdC30YPQu9GC0LDRgtC40YLQtSDQvdC1INC80L7QttCw0YXQsCDQtNCwINCx0YrQtNCw0YIg0LfQsNC/0LDQt9C10L3QuC5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwi0KDQtdC30YPQu9GC0LDRgtC40YLQtSDQsdGP0YXQsCDQt9Cw0L/QsNC30LXQvdC4INGD0YHQv9C10YjQvdC+IVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwi0J3QvtCyINC+0L/QuNGCXCIsXG4gIHRpbWVyTWluOiBcItC80LjQvVwiLFxuICB0aW1lclNlYzogXCLRgdC10LpcIixcbiAgdGltZXJTcGVudEFsbDogXCLQktC40LUg0LjQt9C/0L7Qu9C30LLQsNGF0YLQtSB7MH0g0L3QsCDRgtCw0LfQuCDRgdGC0YDQsNC90LjRhtCwINC4INC+0LHRidC+IHsxfS5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwi0JLQuNC1INC40LfQv9C+0LvQt9Cy0LDRhdGC0LUgezB9INC90LAg0YLQsNC30Lgg0YHRgtGA0LDQvdC40YbQsC5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCLQktC40LUg0LjQt9C/0L7Qu9C30LLQsNGF0YLQtSDQvtCx0YnQviB7MH0uXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCLQktC40LUg0LjQt9C/0L7Qt9Cy0LDRhdGC0LUgezB9INC+0YIgezF9INC90LAg0YLQsNC30Lgg0YHRgtGA0LDQvdC40YbQsCDQuCDQvtCx0YnQviB7Mn0g0L7RgiB7M30uXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcItCS0LjQtSDQuNC30L/QvtC70LfQstCw0YXRgtC1IHswfSDQvtGCIHsxfSDQvdCwINGC0LDQt9C4INGB0YLRgNCw0L3QuNGG0LAuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwi0JLQuNC1INC40LfQv9C+0LvQt9Cy0LDRhdGC0LUg0L7QsdGJ0L4gezB9INC+0YIgezF9LlwiLFxuICBjbGVhbkNhcHRpb246IFwi0JjQt9GH0LjRgdGC0LLQsNC90LVcIixcbiAgY2xlYXJDYXB0aW9uOiBcItCd0LDRh9Cw0LvQvdC+INGB0YrRgdGC0L7Rj9C90LjQtVwiLFxuICBjaG9vc2VGaWxlQ2FwdGlvbjogXCLQmNC30LHQtdGA0LXRgtC1INGE0LDQudC7XCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcItCf0YDQtdC80LDRhdCy0LDQvdC1INC90LAg0YTQsNC50LvQsFwiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcItCU0LBcIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcItCd0LVcIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwi0J3QsNC40YHRgtC40L3QsCDQu9C4INC40YHQutCw0YLQtSDQtNCwINC/0YDQtdC80LDRhdC90LXRgtC1INGC0L7Qt9C4INGE0LDQudC7OiB7MH0/XCIsXG4gIGNvbmZpcm1SZW1vdmVBbGxGaWxlczogXCLQndCw0LjRgdGC0LjQvdCwINC70Lgg0LjRgdC60LDRgtC1INC00LAg0L/RgNC10LzQsNGF0L3QtdGC0LUg0LLRgdC40YfQutC4INGE0LDQudC70L7QstC1P1wiLFxuICBxdWVzdGlvblRpdGxlUGF0dGVyblRleHQ6IFwi0JfQsNCz0LvQsNCy0LjQtSDQvdCwINCy0YrQv9GA0L7RgdCwXCIsXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImJnXCJdID0gYnVsZ2FyaWFuU3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImJnXCJdID0gXCLQsdGK0LvQs9Cw0YDRgdC60LhcIjtcbiIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgY2F0YWxhblN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJBbnRlcmlvclwiLFxuICBwYWdlTmV4dFRleHQ6IFwiU2Vnw7xlbnRcIixcbiAgY29tcGxldGVUZXh0OiBcIkNvbXBsZXRcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJVbiBhbHRyZSAoZGVzY3JpZ3VpKVwiLFxuICBwcm9ncmVzc1RleHQ6IFwiUMOgZ2luYSB7MH0gZGUgezF9XCIsXG4gIGVtcHR5U3VydmV5OiBcIk5vIGhpIGhhIGNhcCBww6BnaW5hIHZpc2libGUgbyBwcmVndW50YSBhIGwnZW5xdWVzdGEuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiR3LDoGNpZXMgcGVyIGNvbXBsZXRhciBsJ2VucXVlc3RhIVwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkwnZW5xdWVzdGEgcydlc3TDoCBjYXJyZWdhbnQgLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIlNlbGVjY2lvbmEgLi4uXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiU2kgdXMgcGxhdSBjb250ZXN0aSBsYSBwcmVndW50YS5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJTaSB1cyBwbGF1IGNvbnRlc3RpIGxlcyBwcmVndW50ZXMgZGUgY2FkYSBmaWxlcmEuXCIsXG4gIG51bWVyaWNFcnJvcjogXCJMJ2VzdGltYWNpw7MgaGEgZGUgc2VyIG51bcOocmljYS5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJTaSB1cyBwbGF1IGVudHJlIGFsbWVueXMgezB9IHPDrW1ib2xzLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIlNpIHVzIHBsYXUgZW50cmUgbWVueXMgZGUgezB9IHPDrW1ib2xzLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIlNpIHVzIHBsYXUgZW50cmUgbcOpcyBkZSB7MH0gaSBtZW55cyBkZSB7MX0gc8OtbWJvbHMuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiU2kgdXMgcGxhdSBvbXBsaSBhbG1lbnlzIHswfSBmaWxlcmVzLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJTaSB1cyBwbGF1IHNlbGVjY2lvbmkgYWxtZW55cyB7MH0gdmFyaWFudHMuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIlNpIHVzIHBsYXUgc2VsZWNjaW9uaSBubyBtw6lzIGRlIHswfSB2YXJpYW50cy5cIixcbiAgbnVtZXJpY01pbk1heDogXCJFbCAnezB9JyBkZXUgc2VyIGlndWFsIG8gbcOpcyBkZSB7MX0gaSBpZ3VhbCBvIG1lbnlzIGRlIHsyfVwiLFxuICBudW1lcmljTWluOiBcIkVsICd7MH0nIGhhIGRlIHNlciBpZ3VhbCBvIG3DqXMgZGUgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiRWwgJ3swfScgaGEgZGUgc2VyIGlndWFsIG8gbWVueXMgZGUgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJTaSB1cyBwbGF1IGFmZWdpdSB1biBjb3JyZXUgZWxlY3Ryw7JuaWMgdsOgbGlkLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiTGEgc29swrdsaWNpdHVkIHZhIHRvcm5hciBlcnJvciAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcIkxhIHNvbMK3bGljaXR1ZCB2YSB0b3JuYXIgYnVpZGEgZGUgZGF0ZXMgbyBsYSBwcm9waWV0YXQgJ3RyYWplY3TDsnJpYScgbm8gw6lzIGNvcnJlY3RhXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiTGEgbWlkYSBkZSBsJ2FyeGl1IG5vIHBvdCBleGNlZGlyIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIlNpIHVzIHBsYXUgYWZlZ2l1IGwnYWx0cmEgZXN0aW1hY2nDsy5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIkVsIHNldSBhcnhpdSBzJ2VzdMOgIHB1amFudC4gU2kgdXMgcGxhdSBlc3BlcmkgdW5zIHNlZ29ucyBpIGludGVudGV1LWhvIGRlIG5vdS5cIixcbiAgYWRkUm93OiBcIkFmZWdpdSB1bmEgZmlsZXJhXCIsXG4gIHJlbW92ZVJvdzogXCJFbGltaW5hciB1bmEgZmlsZXJhXCIsXG4gIGNob2ljZXNfZmlyc3RJdGVtOiBcInByaW1lciBhcnRpY2xlXCIsXG4gIGNob2ljZXNfc2Vjb25kSXRlbTogXCJzZWdvbiBhcnRpY2xlXCIsXG4gIGNob2ljZXNfdGhpcmRJdGVtOiBcInRlcmNlciBhcnRpY2xlXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiQ29sdW1uYVwiLFxuICBtYXRyaXhfcm93OiBcIkZpbGVyYVwiXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImNhXCJdID0gY2F0YWxhblN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJjYVwiXSA9IFwiY2F0YWzDoFwiO1xuIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBjcm9hdGlhblN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJQcmV0aG9kbmlcIixcbiAgcGFnZU5leHRUZXh0OiBcIlNsamVkZcSHaVwiLFxuICBjb21wbGV0ZVRleHQ6IFwiS29tcGxldGFuXCIsXG4gIHByZXZpZXdUZXh0OiBcIlByZWdsZWRcIixcbiAgZWRpdFRleHQ6IFwiVXJlxJFpdmFuamVcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIlBvxI1ldGFrXCIsXG4gIG90aGVySXRlbVRleHQ6IFwiT3N0YWxpIChvcGlzKVwiLFxuICBub25lSXRlbVRleHQ6IFwiTml0a29cIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwiU2VsZWN0IEFsbFwiLFxuICBwcm9ncmVzc1RleHQ6IFwiU3RyYW5pY2EgezB9IG9kIHsxfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwiWmFwaXNhIHswfSBvZCB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcIk9kZ292b3JpbyBuYSB7MH0vezF9IHBpdGFuamFcIixcbiAgZW1wdHlTdXJ2ZXk6IFwiVSBhbmtldGkgbmVtYSB2aWRsaml2ZSBzdHJhbmljZSBpbGkgcGl0YW5qYS5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJIdmFsYSB2YW0gxaF0byBzdGUgemF2csWhaWxpIGFua2V0dSFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcIk5hxaFpIHphcGlzaSBwb2thenVqdSBkYSBzdGUgdmXEhyB6YXZyxaFpbGkgb3Z1IGFua2V0dS5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJBbmtldGEgbyB1xI1pdGF2YW5qZS4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJPZGFiZXJpdGUuLi5cIixcbiAgdmFsdWU6IFwidnJpamVkbm9zdFwiLFxuICByZXF1aXJlZEVycm9yOiBcIk1vbGltIHZhcyBvZGdvdm9yaXRlIG5hIHBpdGFuamUuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIk1vbGltIHZhcyBvZGdvdm9yaXRlIG5hIGJhcmVtIGplZG5vIHBpdGFuamUuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiT2Rnb3Zvcml0ZSBuYSBwaXRhbmphIHUgc3ZpbSByZWRvdmltYS5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIlZyaWplZG5vc3QgYmkgdHJlYmFsYSBiaXRpIGJyb2rEjWFuYS5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJVbmVzaXRlIG5ham1hbmplIHswfSB6bmFrKG92YSkuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiVW5lc2l0ZSBtYW5qZSBvZCB7MH0gem5hayhvdmEpLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIlVuZXNpdGUgdmnFoWUgb2QgezB9IGkgbWFuamUgb2QgezF9IHpuYWtvdmEuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiTW9saW1vIGlzcHVuaXRlIG5ham1hbmplIHswfSByZWRha2EuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIk9kYWJlcml0ZSBiYXJlbSB7MH0gdmFyaWphbnRlLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJPZGFiZXJpdGUgbmUgdmnFoWUgb2QgezB9IHZhcmlqYW50aS5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIid7MH0nYmkgdHJlYmFvIGJpdGkgamVkbmFrIGlsaSB2acWhZSBvZCB7MX0gaSBqZWRuYWsgaWxpIG1hbmppIG9kIHsyfS5cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyBiaSB0cmViYW8gYml0aSBqZWRuYWsgaWxpIHZpxaFlIG9kIHsxfS5cIixcbiAgbnVtZXJpY01heDogXCInezB9JyBiaSB0cmViYW8gYml0aSBqZWRuYWsgaWxpIG1hbmppIG9kIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiVW5lc2l0ZSB2YWxqYW51IGUtbWFpbCBhZHJlc3UuXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIkl6cmF6OiB7MH0gdHJlYmEgdnJhdGl0aSAndHJ1ZScuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCJaYWh0amV2IHZyYXRpbyBwb2dyZcWha3UgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCJaYWh0amV2IGplIHZyYXRpbyBwcmF6bmUgcG9kYXRrZSBpbGkgamUgJ3BhdGgnIHN2b2pzdHZvIG5ldG/EjW5hLlwiLFxuICBleGNlZWRNYXhTaXplOiBcIlZlbGnEjWluYSBkYXRvdGVrZSBuZSBzbWlqZSBwcmVsYXppdGkgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiVW5lc2l0ZSBkcnVndSB2cmlqZWRub3N0LlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiVmHFoWEgZGF0b3Rla2Egc2UgcHJlbm9zaS4gUHJpxI1la2FqdGUgbmVrb2xpa28gc2VrdW5kaSBpIHBva3XFoWFqdGUgcG9ub3Zuby5cIixcbiAgbG9hZGluZ0ZpbGU6IFwiVcSNaXRhdmFuamUuLi5cIixcbiAgY2hvb3NlRmlsZTogXCJPZGFiZXJpdGUgZGF0b3Rla3UuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcIk5pamUgb2RhYnJhbmEgZGF0b3Rla2FcIixcbiAgY29uZmlybURlbGV0ZTogXCLFvWVsaXRlIGxpIGl6YnJpc2F0aSB6YXBpcz9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJUYSBiaSB2cmlqZWRub3N0IHRyZWJhbGEgYml0aSBqZWRpbnN0dmVuYS5cIixcbiAgYWRkQ29sdW1uOiBcIkRvZGF2YW5qZSBzdHVwY2FcIixcbiAgYWRkUm93OiBcIkRvZGF2YW5qZSByZWRha2FcIixcbiAgcmVtb3ZlUm93OiBcIlVrbG9uaXRpXCIsXG4gIGFkZFBhbmVsOiBcIkRvZGF2YW5qZSBub3ZpaFwiLFxuICByZW1vdmVQYW5lbDogXCJVa2xvbml0aVwiLFxuICBjaG9pY2VzX0l0ZW06IFwic3Rhdmt1XCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiU3R1cGNhXCIsXG4gIG1hdHJpeF9yb3c6IFwiUmVkYWtcIixcbiAgc2F2aW5nRGF0YTogXCJSZXp1bHRhdGkgc2Ugc3ByZW1hanUgbmEgcG9zbHXFvml0ZWxqdS4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiRG/FoWxvIGplIGRvIHBvZ3JlxaFrZSBpIG5pc21vIG1vZ2xpIHNwcmVtaXRpIHJlenVsdGF0ZS5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiUmV6dWx0YXRpIHN1IHVzcGplxaFubyBzcHJlbWxqZW5pIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiUG9rdcWhYWogcG9ub3ZvXCIsXG4gIHRpbWVyTWluOiBcIm1pblwiLFxuICB0aW1lclNlYzogXCJzZWNcIixcbiAgdGltZXJTcGVudEFsbDogXCJWaSBzdGUgcHJvdmVsaSB7MH0gbmEgb3ZvaiBzdHJhbmljaSBpIHsxfSB1a3Vwbm8uXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIlBvdHJvxaFpbGkgc3RlIHswfSBuYSBvdnUgc3RyYW5pY3UuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwiWW91IGhhdmUgc3BlbnQgezB9IGluIHRvdGFsLiB7MH0uXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCJWaSBzdGUgcHJvdmVsaSB7MH0gb2QgezF9IG5hIG92b2ogc3RyYW5pY2kgaSB7Mn0gb2QgezN9IHVrdXBuby5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiUG90cm/FoWlvIHNpIHswfSBvZCB7MX0gbmEgb3ZvaiBzdHJhbmljaS5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCJVa3Vwbm8gc3RlIHBvdHJvxaFpbGkgezB9IG9kIHsxfS5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIk/EjWlzdGl0aVwiLFxuICBjbGVhckNhcHRpb246IFwiT8SNaXN0aXRpXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcIk9kYWJlcml0ZSBkYXRvdGVrdVwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCJVa2xvbml0ZSBvdnUgZGF0b3Rla3VcIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCJEYVwiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwiTmVcIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwiSmVzdGUgbGkgc2lndXJuaSBkYSDFvmVsaXRlIHVrbG9uaXRpIG92dSBkYXRvdGVrdTogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwiSmVzdGUgbGkgc2lndXJuaSBkYSDFvmVsaXRlIHVrbG9uaXRpIHN2ZSBkYXRvdGVrZT9cIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcIk5hc2xvdiBwaXRhbmphXCIsXG4gIG1vZGFsQ2FuY2VsQnV0dG9uVGV4dDogXCJPdGthemF0aVwiLFxuICBtb2RhbEFwcGx5QnV0dG9uVGV4dDogXCJQcmltaWplbml0aVwiLFxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJoclwiXSA9IGNyb2F0aWFuU3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImhyXCJdID0gXCJocnZhdHNraVwiO1xuIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBjemVjaFN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJQxZllZGNob3rDrVwiLFxuICBwYWdlTmV4dFRleHQ6IFwiRGFsxaHDrVwiLFxuICBjb21wbGV0ZVRleHQ6IFwiSG90b3ZvXCIsXG4gIHByZXZpZXdUZXh0OiBcIk7DoWhsZWRcIixcbiAgZWRpdFRleHQ6IFwiVXByYXZpdFwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwiU3RhcnRcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJKaW7DoSBvZHBvdsSbxI8gKG5hcGnFoXRlKVwiLFxuICBub25lSXRlbVRleHQ6IFwixb3DoWRuw71cIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwiVnlicmF0IHbFoWVcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlN0cmFuYSB7MH0geiB7MX1cIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcIlrDoXpuYW0gezB9IHogezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCJab2Rwb3bEm3plbsOpIG90w6F6a3k6IHswfSAvIHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCJQcsWvemt1bXUgbmVvYnNhaHVqZSDFvsOhZG7DqSBvdMOhemt5LlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIkTEm2t1amVtZSB6YSB2eXBsbsSbbsOtIHByxa96a3VtdSFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcIk5hxaFlIHrDoXpuYW15IHVrYXp1asOtLCDFvmUganN0ZSB0ZW50byBwcsWvemt1bSBqacW+IGRva29uxI1pbGkuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiUHJvYsOtaMOhIG5hxI3DrXTDoW7DrSBwcsWvemt1bXUuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiVnliZXIuLi5cIixcbiAgdmFsdWU6IFwiaG9kbm90YVwiLFxuICByZXF1aXJlZEVycm9yOiBcIk9kcG92xJt6dGUgcHJvc8OtbSBuYSBvdMOhemt1LlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJQbGVhc2UgYW5zd2VyIGF0IGxlYXN0IG9uZSBxdWVzdGlvbi5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJPZHBvdsSbenRlIHByb3PDrW0gbmEgdsWhZWNobnkgb3TDoXpreS5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIlYgdG9tdG8gcG9saSBsemUgemFkYXQgcG91emUgxI3DrXNsYS5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJaYWRlanRlIHByb3PDrW0gYWxlc3BvxYggezB9IHpuYWvFry5cIixcbiAgdGV4dE1heExlbmd0aDogXCJaYWRlanRlIHByb3PDrW0gbcOpbsSbIG5lxb4gezB9IHpuYWvFry5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCJaYWRlanRlIHByb3PDrW0gdsOtY2UgbmXFviB7MH0gYSBtw6luxJsgbmXFviB7MX0gem5ha8WvLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIlZ5cGzFiHRlIHByb3PDrW0gYWxlc3BvxYggezB9IMWZw6Fka8WvLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJWeWJlcnRlIHByb3PDrW0gYWxlc3BvxYggezB9IHZhcmlhbnR5LlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJOZXZ5YsOtcmVqdGUgcHJvc8OtbSB2w61jZSBuZcW+IHswfSB2YXJpYW50LlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiT2Rwb3bEm8SPICd7MH0nIGJ5IG3Em2xvIGLDvXQgdsSbdMWhw60gbmVibyByb3ZubyB7MX0gYSBtZW7FocOtIG5lYm8gcm92bm8gezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiT2Rwb3bEm8SPICd7MH0nIGJ5IG3Em2xvIGLDvXQgdsSbdMWhw60gbmVibyByb3ZubyB7MX1cIixcbiAgbnVtZXJpY01heDogXCJPZHBvdsSbxI8gJ3swfScgYnkgbcSbbG8gYsO9dCBtZW7FocOtIG5lYm8gcm92bm8gezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJaYWRlanRlIHByb3PDrW0gcGxhdG5vdSBlLW1haWxvdm91IGFkcmVzdS5cIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwiVsO9cmF6OiB7MH0gYnkgbcSbbCB2csOhdGl0IGhvZG5vdHUg4oCedHJ1ZeKAnC5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIlBvxb5hZGF2ZWsgdnLDoXRpbCBjaHlidSAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjogXCJQb8W+YWRhdmVrIG5ldnLDoXRpbCBkYXRhIG5lYm8gY2VzdGEgamUgbmVwbGF0bsOhXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiVmVsaWtvc3Qgc291Ym9ydSBieSBuZW3Em2xhIGLDvXQgdsSbdMWhw60gbmXFviB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJaYWRlanRlIHByb3PDrW0gamlub3UgaG9kbm90dS5cIixcbiAgdXBsb2FkaW5nRmlsZTogXCJWw6HFoSBzb3Vib3Igc2UgbmFocsOhdsOhLiBaa3VzdGUgdG8gcHJvc8OtbSB6YSBuxJtrb2xpayBzZWt1bmQuXCIsXG4gIGxvYWRpbmdGaWxlOiBcIk5hxI3DrXTDoW7DrS4uLlwiLFxuICBjaG9vc2VGaWxlOiBcIlZ5YmVydGUgc291Ym9yeSAuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcIk5lbsOtIHp2b2xlbsO9IMW+w6FkbsO9IHNvdWJvclwiLFxuICBjb25maXJtRGVsZXRlOiBcIkNoY2V0ZSBzbWF6YXQgesOhem5hbT9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJUYXRvIGhvZG5vdGEgYnkgbcSbbGEgYsO9dCBqZWRpbmXEjW7DoS5cIixcbiAgYWRkQ29sdW1uOiBcIlDFmWlkYXQgc2xvdXBlY1wiLFxuICBhZGRSb3c6IFwiUMWZaWRhdCDFmcOhZGVrXCIsXG4gIHJlbW92ZVJvdzogXCJPZHN0cmFuaXRcIixcbiAgYWRkUGFuZWw6IFwiUMWZaWRhdCBub3bDvVwiLFxuICByZW1vdmVQYW5lbDogXCJPZHN0cmFuaXRcIixcbiAgY2hvaWNlc19JdGVtOiBcInBvbG/FvmthXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiU2xvdXBlY1wiLFxuICBtYXRyaXhfcm93OiBcIsWYw6FkZWtcIixcbiAgc2F2aW5nRGF0YTogXCJWw71zbGVka3kgc2UgdWtsw6FkYWrDrSBuYSBzZXJ2ZXIgLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCJEb8WhbG8gayBjaHlixJsgYSB2w71zbGVka3kganNtZSBuZW1vaGxpIHVsb8W+aXQuXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIlbDvXNsZWRreSBieWx5IMO6c3DEm8WhbsSbIHVsb8W+ZW55IVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiWmt1cyB0byB6bm92dVwiLFxuICB0aW1lck1pbjogXCJtaW5cIixcbiAgdGltZXJTZWM6IFwic2VrXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwiTmEgdMOpdG8gc3Ryw6FuY2UganN0ZSB1dHJhdGlsaSBjZWxrZW0gezB9IGEgY2Vsa2VtIHsxfS5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiTmEgdMOpdG8gc3Ryw6FuY2UganN0ZSB1dHJhdGlsaSB7MH0uXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwiQ2Vsa2VtIGpzdGUgdXRyYXRpbGkgezB9LlwiLFxuICB0aW1lckxpbWl0QWxsOlxuICAgIFwiTmEgdMOpdG8gc3Ryw6FuY2UganN0ZSB1dHJhdGlsaSB7MH0geiB7MX0gYSBjZWxrZW0gezJ9IHogezN9LlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCJOYSB0w6l0byBzdHLDoW5jZSBqc3RlIHN0csOhdmlsaSB7MH0geiB7MX0uXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiQ2Vsa292xJsganN0ZSB1dHJhdGlsaSB7MH0geiB7MX0uXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCLEjGlzdMO9XCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJQcsWvaGxlZG7DoVwiLFxuICBjaG9vc2VGaWxlQ2FwdGlvbjogXCJWeWJlcnRlIHNvdWJvclwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCJPZGViZXJ0ZSB0ZW50byBzb3Vib3JcIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCJBbm9cIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcIk5lXCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcIk9wcmF2ZHUgY2hjZXRlIG9kZWJyYXQgdGVudG8gc291Ym9yOiB7MH0/XCIsXG4gIGNvbmZpcm1SZW1vdmVBbGxGaWxlczogXCJPcHJhdmR1IGNoY2V0ZSBvZHN0cmFuaXQgdsWhZWNobnkgc291Ym9yeT9cIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcIk7DoXpldiBvdMOhemt5XCIsXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImNzXCJdID0gY3plY2hTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiY3NcIl0gPSBcIsSNZcWhdGluYVwiO1xuIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBkYW5pc2hTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiVGlsYmFnZVwiLFxuICBwYWdlTmV4dFRleHQ6IFwiVmlkZXJlXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJGw6ZyZGlnXCIsXG4gIHByZXZpZXdUZXh0OiBcIkZvcnByZW1pZXJlXCIsXG4gIGVkaXRUZXh0OiBcIlJlZGlnw6lyXCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCJTdGFydFwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIlZhbGdmcml0IHN2YXIuLi5cIixcbiAgbm9uZUl0ZW1UZXh0OiBcIkluZ2VuXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIlbDpmxnIGFsbGVcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlNpZGUgezB9IGFmIHsxfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwiT3B0YWcgezB9IGFmIHsxfVwiLFxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwiQmVzdmFyZWRlIHswfSAvIHsxfSBzcMO4cmdzbcOlbFwiLFxuICBlbXB0eVN1cnZleTogXCJEZXIgZXIgaW5nZW4gc3lubGlnZSBzcMO4cmdzbcOlbC5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJNYW5nZSB0YWsgZm9yIGRpbiBiZXN2YXJlbHNlIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiVm9yZXMgZGF0YSB2aXNlciBhdCBkdSBhbGxlcmVkZSBoYXIgZ2VubmVtZsO4cnQgZGV0dGUgc3DDuHJnZXNrZW1hLlwiLFxuICBsb2FkaW5nU3VydmV5OiBcIlNww7hyZ2Vza2VtYWV0IGhlbnRlcyBmcmEgc2VydmVyZW4uLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiVsOmbGcuLi5cIixcbiAgdmFsdWU6IFwidsOmcmRpXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiQmVzdmFyIHZlbmxpZ3N0IHNww7hyZ3Ntw6VsZXQuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIkJlc3ZhciB2ZW5saWdzdCBtaW5kc3Qgw6l0IHNww7hyZ3Ntw6VsLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIkJlc3ZhciB2ZW5saWdzdCBzcMO4cmdzbcOlbCBpIGFsbGUgcsOma2tlci5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIkFuZ2l2IGV0IHRhbC5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJBbmdpdiBtaW5kc3QgezB9IHRlZ24uXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiUGxlYXNlIGVudGVyIGxlc3MgdGhhbiB7MH0gY2hhcmFjdGVycy5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCJBbmdpdiBtZXJlIGVuZCB7MH0gb2cgbWluZHJlIGVuZCB7MX0gdGVnbi5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJVZGZ5bGQgbWluZHN0IHswfSByw6Zra2VyLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJWw6ZsZyB2ZW5saWdzdCBtaW5kc3QgezB9IHN2YXJtdWxpZ2hlZChlcikuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIlbDpmxnIHZlbmxpZ3N0IGbDpnJyZSB7MH0gc3Zhcm11bGlnaGVkZXIoZXIpLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScgc2thbCB2w6ZyZSBsaWcgbWVkIGVsbGVyIHN0w7hycmUgZW5kIHsxfSBvZyBsaWcgbWVkIGVsbGVyIG1pbmRyZSBlbmQgezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScgc2thbCB2w6ZyZSBsaWcgbWVkIGVsbGVyIHN0w7hycmUgZW5kIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIid7MH0nIHNrYWwgdsOmcmUgbGlnIG1lZCBlbGxlciBtaW5kcmUgZW5kIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiQW5naXYgdmVubGlnc3QgZW4gZ3lsZGlnIGUtbWFpbCBhZHJlc3NlLlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCJVZHRyeWtrZXQ6IHswfSBza2FsIHJldHVybmVyZSAndHJ1ZScuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCJGb3Jlc3DDuHJnc2xlbiByZXR1cm5lcmVkZSBmZWpsZW4gJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCJGb3Jlc3DDuHJnc2xlbiByZXR1cm5lcmVkZSBpbmdlbiBkYXRhIGVsbGVyICdwYXRoJyBwYXJhbWV0ZXJlbiBlciBmb3JrZXJ0XCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiRmlsc3TDuHJyZWxzZW4gbcOlIGlra2Ugb3ZlcnN0aWdlIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIkFuZ2l2IGVuIHbDpnJkaSBmb3IgZGl0IHZhbGdmcmllIHN2YXIuXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCJEaW4gZmlsIGJsaXZlciB1cGxvYWRldC4gVmVudCBub2dsZSBzZWt1bmRlciBvZyBwcsO4diBldmVudHVlbHQgaWdlbi5cIixcbiAgbG9hZGluZ0ZpbGU6IFwiSW5kbMOmc2VyLi4uXCIsXG4gIGNob29zZUZpbGU6IFwiVsOmbGcgZmlsKGVyKS4uLlwiLFxuICBub0ZpbGVDaG9zZW46IFwiSW5nZW4gZmlsIGVyIHZhbGd0XCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiVmlsIGR1IGZqZXJuZSBkZW4/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwiRGVubmUgdsOmcmRpIHNrYWwgdsOmcmUgdW5pay5cIixcbiAgYWRkQ29sdW1uOiBcIlRpbGbDuGoga29sb25uZVwiLFxuICBhZGRSb3c6IFwiVGlsZsO4aiByw6Zra2VcIixcbiAgcmVtb3ZlUm93OiBcIkZqZXJuXCIsXG4gIGFkZFBhbmVsOiBcIlRpbGbDuGogbnlcIixcbiAgcmVtb3ZlUGFuZWw6IFwiRmplcm5cIixcbiAgY2hvaWNlc19JdGVtOiBcInZhbGdcIixcbiAgbWF0cml4X2NvbHVtbjogXCJLb2xvbm5lXCIsXG4gIG1hdHJpeF9yb3c6IFwiUsOma2tlXCIsXG4gIHNhdmluZ0RhdGE6IFwiUmVzdWx0YXRlcm5lIGJsaXZlciBnZW10IHDDpSBzZXJ2ZXJlbi4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiRGVyIG9wc3RvZCBlbiBmZWpsIG9nIHZpIGt1bm5lIGlra2UgZ2VtbWUgcmVzdWx0YXRldC5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiUmVzdWx0YXRldCBibGV2IGdlbXQhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJQcsO4diBpZ2VuXCIsXG4gIHRpbWVyTWluOiBcIm1pblwiLFxuICB0aW1lclNlYzogXCJzZWtcIixcbiAgdGltZXJTcGVudEFsbDogXCJEdSBoYXIgYnJ1Z3QgezB9IHDDpSBkZW5uZSBzaWRlIG9nIHsxfSBpIGFsdC5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiRHUgaGFyIGJydWd0IHswfSBww6UgZGVubmUgc2lkZS5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCJEdSBoYXIgYnJ1Z3QgezB9IGkgYWx0LlwiLFxuICB0aW1lckxpbWl0QWxsOlxuICAgIFwiRHUgaGFyIGJydWd0IHswfSBhZiB7MX0gcMOlIGRlbm5lIHNpZGUgb2cgezJ9IGFmIHszfSBpIGFsdC5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiRHUgaGFyIGJydWd0IHswfSBhZiB7MX0gcMOlIGRlbm5lIHNpZGUuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiRHUgaGFyIGJydWd0IHswfSBhZiB7MX0gaSBhbHQuXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCJSZW5zXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJGamVyblwiLFxuICBjaG9vc2VGaWxlQ2FwdGlvbjogXCJWw6ZsZyBmaWxcIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwiRmplcm4gZGVubmUgZmlsXCIsXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwiSmFcIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcIkluZ2VuXCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcIkVyIGR1IHNpa2tlciBww6UsIGF0IGR1IHZpbCBmamVybmUgZGVubmUgZmlsOiB7MH0/XCIsXG4gIGNvbmZpcm1SZW1vdmVBbGxGaWxlczogXCJFciBkdSBzaWtrZXIgcMOlLCBhdCBkdSB2aWwgZmplcm5lIGFsbGUgZmlsZXI/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCJTcMO4cmdzbcOlbHMgdGl0ZWxcIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiZGFcIl0gPSBkYW5pc2hTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiZGFcIl0gPSBcImRhbnNrXCI7XG4iLCIvL0NyZWF0ZWQgb24gYmVoYWxmIGh0dHBzOi8vZ2l0aHViLmNvbS9GcmFuazEzXG4vL01vZGlmaWVkIG9uIGJlaGFsZiBSb2VsYW5kIFZlcmJha2VsXG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGR1dGNoU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIlZvcmlnZVwiLFxuICBwYWdlTmV4dFRleHQ6IFwiVm9sZ2VuZGVcIixcbiAgY29tcGxldGVUZXh0OiBcIlZlcnplbmRlblwiLFxuICBwcmV2aWV3VGV4dDogXCJWb29yYmVlbGRcIixcbiAgZWRpdFRleHQ6IFwiQmV3ZXJrXCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCJCZWdpbiBtZXRcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJBbmRlcnMsIG5sLlwiLFxuICBub25lSXRlbVRleHQ6IFwiR2VlblwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCJTZWxlY3RlZXIgQWxsZXNcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlBhZ2luYSB7MH0gdmFuIHsxfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwiUmVjb3JkIHswfSBvZiB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcIkdlYW50d29vcmQgezB9L3sxfSB2cmFnZW5cIixcbiAgZW1wdHlTdXJ2ZXk6IFwiRXIgaXMgZ2VlbiB6aWNodGJhcmUgcGFnaW5hIG9mIHZyYWFnIGluIGRlemUgdnJhZ2VubGlqc3RcIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJCZWRhbmt0IHZvb3IgaGV0IGludnVsbGVuIHZhbiBkZSB2cmFnZW5saWpzdFwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgICAgXCJPbnplIGdlZ2V2ZW5zIHRvbmVuIGFhbiBkYXQgamUgZGV6ZSB2cmFnZW5saWpzdCByZWVkcyBiZWFudHdvb3JkIGhlYnQuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiRGUgdnJhZ2VubGlqc3QgaXMgYWFuIGhldCBsYWRlbi4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJLaWVzLi4uXCIsXG4gIHZhbHVlOiBcIndhYXJkZVwiLFxuICByZXF1aXJlZEVycm9yOiBcIkRpdCBpcyBlZW4gdmVyZWlzdGUgdnJhYWdcIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwiR2VsaWV2ZSB0ZW4gbWluc3RlIGVlbiB2cmFhZyB0ZSBiZWFudHdvb3JkZW4uXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiRGV6ZSB2cmFhZyB2ZXJlaXN0IMOpw6luIGFudHdvb3JkIHBlciByaWpcIixcbiAgbnVtZXJpY0Vycm9yOiBcIkhldCBhbnR3b29yZCBtb2V0IGVlbiBnZXRhbCB6aWpuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiVnVsIG1pbnN0ZW5zIHswfSBrYXJha3RlcnMgaW5cIixcbiAgdGV4dE1heExlbmd0aDogXCJHZWxpZXZlIG1pbmRlciBkYW4gezB9IGthcmFrdGVycyBpbiB0ZSB2dWxsZW4uXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiR2VsaWV2ZSBtZWVyIGRhbiB7MH0gZW4gbWluZGVyIGRhbiB7MX0ga2FyYWt0ZXJzIGluIHRlIHZ1bGxlbi5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJHZWxpZXZlIHRlbiBtaW5zdGUgezB9IHJpamVuIGluIHRlIHZ1bGxlbi5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiU2VsZWN0ZWVyIG1pbmltdW0gezB9IGFudHdvb3JkZW5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiU2VsZWN0ZWVyIG5pZXQgbWVlciBkYW4gezB9IGFudHdvb3JkZW5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICAgIFwiVXcgYW50d29vcmQgJ3swfScgbW9ldCBncm90ZXIgb2YgZ2VsaWprIHppam4gYWFuIHsxfSBlbiBrbGVpbmVyIG9mIGdlbGlqayBhYW4gezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiVXcgYW50d29vcmQgJ3swfScgbW9ldCBncm90ZXIgb2YgZ2VsaWprIHppam4gYWFuIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIlV3IGFudHdvb3JkICd7MH0nIG1vZXQgZ3JvdGVyIG9mIGdlbGlqayB6aWpuIGFhbiB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIlZ1bCBlZW4gZ2VsZGlnIGUtbWFpbGFkcmVzIGluXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIkRlIHVpdGRydWtraW5nOiB7MH0gbW9ldCAnd2FhcicgdGVydWdnZXZlbi5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIkRlIHZyYWFnIGtlZXJkZSBlZW4gZm91dCB0ZXJ1ZyAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICAgIFwiRGUgdnJhYWcgZ2FmIGVlbiBsZWVnIGFudHdvb3JkIHRlcnVnIG9mIGRlICdwYWQnIGVpZ2Vuc2NoYXAgaXMgbmlldCBjb3JyZWN0XCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiRGUgZ3Jvb3R0ZSB2YW4gaGV0IGJlc3RhbmQgbWFnIG5pZXQgZ3JvdGVyIHppam4gZGFuIHswfVwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiVnVsIGhldCB2ZWxkICdBbmRlcnMsIG5sLicgaW5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICAgIFwiVXcgYmVzdGFuZCB3b3JkdCBvcGdlbGFkZW4uIEdlbGlldmUgZW5rZWxlIHNlY29uZGVuIHRlIHdhY2h0ZW4gZW4gb3BuaWV1dyB0ZSBwcm9iZXJlbi5cIixcbiAgbG9hZGluZ0ZpbGU6IFwiT3BsYWRlbi4uLlwiLFxuICBjaG9vc2VGaWxlOiBcIktpZXMgdXcgYmVzdGFuZChlbikuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcIkdlZW4gYmVzdGFuZCBnZWtvemVuXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiV2lsIGplIGRlemUgZ2VnZXZlbnMgdmVyd2lqZGVyZW4/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwiRGV6ZSB3YWFyZGUgbW9ldCB1bmllayB6aWpuLlwiLFxuICBhZGRDb2x1bW46IFwiVm9lZyBrb2xvbSB0b2VcIixcbiAgYWRkUm93OiBcIlZvZWcgcmlqIHRvZVwiLFxuICByZW1vdmVSb3c6IFwiVmVyd2lqZGVyXCIsXG4gIGFkZFBhbmVsOiBcIk5pZXV3ZSB0b2V2b2VnZW5cIixcbiAgcmVtb3ZlUGFuZWw6IFwiVmVyd2lqZGVyXCIsXG4gIGNob2ljZXNfSXRlbTogXCJvbmRlcndlcnBcIixcbiAgbWF0cml4X2NvbHVtbjogXCJLb2xvbVwiLFxuICBtYXRyaXhfcm93OiBcIlJpalwiLFxuICBzYXZpbmdEYXRhOiBcIkRlIHJlc3VsdGF0ZW4gd29yZGVuIGJld2FhcmQgb3AgZGUgc2VydmVyLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCJFciB3YXMgZWVuIHByb2JsZWVtIGVuIHdlIGtvbmRlbiBkZSByZXN1bHRhdGVuIG5pZXQgYmV3YXJlbi5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiRGUgcmVzdWx0YXRlbiB3ZXJkZW4gc3VjY2Vzdm9sIGJld2FhcmQhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJQcm9iZWVyIG9wbmlldXdcIixcbiAgdGltZXJNaW46IFwibWluaW11bVwiLFxuICB0aW1lclNlYzogXCJzZWNcIixcbiAgdGltZXJTcGVudEFsbDogXCJVIGhlZWZ0IHswfSBnZXNwZW5kZWVyZCBvcCBkZXplIHBhZ2luYSBlbiB7MX0gaW4gdG90YWFsLlwiLFxuICB0aW1lclNwZW50UGFnZTogXCJVIGhlZWZ0IHswfSBvcCBkZXplIHBhZ2luYSBnZXNwZW5kZWVyZC5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCJVIGhlZWZ0IGluIHRvdGFhbCB7MH0gZ2VzcGVuZGVlcmQuXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgICBcIlUgaGVlZnQgezB9IHZhbiB7MX0gb3AgZGV6ZSBwYWdpbmEgZ2VzcGVuZGVlcmQgZW4gezJ9IHZhbiB7M30gaW4gdG90YWFsLlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCJVIGhlZWZ0IHswfSB2YW4gezF9IGdlc3BlbmRlZXJkIG9wIGRlemUgcGFnaW5hLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIlUgaGVlZnQgezB9IHZhbiB7MX0gaW4gaGV0IHRvdGFhbC5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIkt1aXMgb3BcIixcbiAgY2xlYXJDYXB0aW9uOiBcIkt1aXMgb3BcIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwiR2Vrb3plbiBiZXN0YW5kXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIlZlcndpamRlciBkZXplIGZpbGVcIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCJKYVwiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwiTmVlblwiLFxuICBjb25maXJtUmVtb3ZlRmlsZTogXCJCZW50IHUgemVrZXIgZGF0IHUgZGV6ZSBmaWxlIHdpbHQgdmVyd2lqZGVyZW46IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIkJlbnQgdSB6ZWtlciBkYXQgdSBhbCBkZXplIGZpbGVzIHdpbHQgdmVyd2lqZGVyZW4/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCJUaXRlbCB2YW4gZGUgdnJhYWdcIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wibmxcIl0gPSBkdXRjaFN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJubFwiXSA9IFwibmVkZXJsYW5kc1wiO1xuIiwiLy9VbmNvbW1lbnQgdGhpcyBsaW5lIG9uIGNyZWF0aW5nIGEgdHJhbnNsYXRpb24gZmlsZVxuLy9pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGVuZ2xpc2hTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiUHJldmlvdXNcIixcbiAgcGFnZU5leHRUZXh0OiBcIk5leHRcIixcbiAgY29tcGxldGVUZXh0OiBcIkNvbXBsZXRlXCIsXG4gIHByZXZpZXdUZXh0OiBcIlByZXZpZXdcIixcbiAgZWRpdFRleHQ6IFwiRWRpdFwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwiU3RhcnRcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJPdGhlciAoZGVzY3JpYmUpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCJOb25lXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIlNlbGVjdCBBbGxcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlBhZ2UgezB9IG9mIHsxfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwiUmVjb3JkIHswfSBvZiB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcIkFuc3dlcmVkIHswfS97MX0gcXVlc3Rpb25zXCIsXG4gIGVtcHR5U3VydmV5OiBcIlRoZXJlIGlzIG5vIHZpc2libGUgcGFnZSBvciBxdWVzdGlvbiBpbiB0aGUgc3VydmV5LlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIlRoYW5rIHlvdSBmb3IgY29tcGxldGluZyB0aGUgc3VydmV5IVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiT3VyIHJlY29yZHMgc2hvdyB0aGF0IHlvdSBoYXZlIGFscmVhZHkgY29tcGxldGVkIHRoaXMgc3VydmV5LlwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkxvYWRpbmcgU3VydmV5Li4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIkNob29zZS4uLlwiLFxuICB2YWx1ZTogXCJ2YWx1ZVwiLFxuICByZXF1aXJlZEVycm9yOiBcIlJlc3BvbnNlIHJlcXVpcmVkLlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJSZXNwb25zZSByZXF1aXJlZDogYW5zd2VyIGF0IGxlYXN0IG9uZSBxdWVzdGlvbi5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJSZXNwb25zZSByZXF1aXJlZDogYW5zd2VyIHF1ZXN0aW9ucyBpbiBhbGwgcm93cy5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIlRoZSB2YWx1ZSBzaG91bGQgYmUgbnVtZXJpYy5cIixcbiAgbWluRXJyb3I6IFwiVGhlIHZhbHVlIHNob3VsZCBub3QgYmUgbGVzcyB0aGFuIHswfVwiLFxuICBtYXhFcnJvcjogXCJUaGUgdmFsdWUgc2hvdWxkIG5vdCBiZSBncmVhdGVyIHRoYW4gezB9XCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiUGxlYXNlIGVudGVyIGF0IGxlYXN0IHswfSBjaGFyYWN0ZXIocykuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiUGxlYXNlIGVudGVyIG5vIG1vcmUgdGhhbiB7MH0gY2hhcmFjdGVyKHMpLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOlxuICAgIFwiUGxlYXNlIGVudGVyIGF0IGxlYXN0IHswfSBhbmQgbm8gbW9yZSB0aGFuIHsxfSBjaGFyYWN0ZXJzLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIlBsZWFzZSBmaWxsIGluIGF0IGxlYXN0IHswfSByb3cocykuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlBsZWFzZSBzZWxlY3QgYXQgbGVhc3QgezB9IHZhcmlhbnQocykuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIlBsZWFzZSBzZWxlY3Qgbm8gbW9yZSB0aGFuIHswfSB2YXJpYW50KHMpLlwiLFxuICBudW1lcmljTWluTWF4OiBcIlRoZSAnezB9JyBzaG91bGQgYmUgYXQgbGVhc3QgezF9IGFuZCBhdCBtb3N0IHsyfVwiLFxuICBudW1lcmljTWluOiBcIlRoZSAnezB9JyBzaG91bGQgYmUgYXQgbGVhc3QgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiVGhlICd7MH0nIHNob3VsZCBiZSBhdCBtb3N0IHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiUGxlYXNlIGVudGVyIGEgdmFsaWQgZS1tYWlsIGFkZHJlc3MuXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIlRoZSBleHByZXNzaW9uOiB7MH0gc2hvdWxkIHJldHVybiAndHJ1ZScuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCJUaGUgcmVxdWVzdCByZXR1cm5lZCBlcnJvciAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcIlRoZSByZXF1ZXN0IHJldHVybmVkIGVtcHR5IGRhdGEgb3IgdGhlICdwYXRoJyBwcm9wZXJ0eSBpcyBpbmNvcnJlY3RcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJUaGUgZmlsZSBzaXplIHNob3VsZCBub3QgZXhjZWVkIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIlJlc3BvbnNlIHJlcXVpcmVkOiBlbnRlciBhbm90aGVyIHZhbHVlLlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiWW91ciBmaWxlIGlzIHVwbG9hZGluZy4gUGxlYXNlIHdhaXQgc2V2ZXJhbCBzZWNvbmRzIGFuZCB0cnkgYWdhaW4uXCIsXG4gIGxvYWRpbmdGaWxlOiBcIkxvYWRpbmcuLi5cIixcbiAgY2hvb3NlRmlsZTogXCJDaG9vc2UgZmlsZShzKS4uLlwiLFxuICBub0ZpbGVDaG9zZW46IFwiTm8gZmlsZSBjaG9zZW5cIixcbiAgZmlsZURyYWdBcmVhUGxhY2Vob2xkZXI6IFwiRHJvcCBhIGZpbGUgaGVyZSBvciBjbGljayB0aGUgYnV0dG9uIGJlbG93IHRvIGxvYWQgdGhlIGZpbGUuXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiRG8geW91IHdhbnQgdG8gZGVsZXRlIHRoZSByZWNvcmQ/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwiVGhpcyB2YWx1ZSBzaG91bGQgYmUgdW5pcXVlLlwiLFxuICBhZGRDb2x1bW46IFwiQWRkIGNvbHVtblwiLFxuICBhZGRSb3c6IFwiQWRkIHJvd1wiLFxuICByZW1vdmVSb3c6IFwiUmVtb3ZlXCIsXG4gIGVtcHR5Um93c1RleHQ6IFwiVGhlcmUgYXJlIG5vIHJvd3MuXCIsXG4gIGFkZFBhbmVsOiBcIkFkZCBuZXdcIixcbiAgcmVtb3ZlUGFuZWw6IFwiUmVtb3ZlXCIsXG4gIGNob2ljZXNfSXRlbTogXCJpdGVtXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiQ29sdW1uXCIsXG4gIG1hdHJpeF9yb3c6IFwiUm93XCIsXG4gIG11bHRpcGxldGV4dF9pdGVtbmFtZTogXCJ0ZXh0XCIsXG4gIHNhdmluZ0RhdGE6IFwiVGhlIHJlc3VsdHMgYXJlIGJlaW5nIHNhdmVkIG9uIHRoZSBzZXJ2ZXIuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIkFuIGVycm9yIG9jY3VycmVkIGFuZCB3ZSBjb3VsZCBub3Qgc2F2ZSB0aGUgcmVzdWx0cy5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiVGhlIHJlc3VsdHMgd2VyZSBzYXZlZCBzdWNjZXNzZnVsbHkhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJUcnkgYWdhaW5cIixcbiAgdGltZXJNaW46IFwibWluXCIsXG4gIHRpbWVyU2VjOiBcInNlY1wiLFxuICB0aW1lclNwZW50QWxsOiBcIllvdSBoYXZlIHNwZW50IHswfSBvbiB0aGlzIHBhZ2UgYW5kIHsxfSBpbiB0b3RhbC5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiWW91IGhhdmUgc3BlbnQgezB9IG9uIHRoaXMgcGFnZS5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCJZb3UgaGF2ZSBzcGVudCB7MH0gaW4gdG90YWwuXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCJZb3UgaGF2ZSBzcGVudCB7MH0gb2YgezF9IG9uIHRoaXMgcGFnZSBhbmQgezJ9IG9mIHszfSBpbiB0b3RhbC5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiWW91IGhhdmUgc3BlbnQgezB9IG9mIHsxfSBvbiB0aGlzIHBhZ2UuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiWW91IGhhdmUgc3BlbnQgezB9IG9mIHsxfSBpbiB0b3RhbC5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIkNsZWFuXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJDbGVhclwiLFxuICBzaWduYXR1cmVQbGFjZUhvbGRlcjogXCJTaWduIGhlcmVcIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwiQ2hvb3NlIGZpbGVcIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwiUmVtb3ZlIHRoaXMgZmlsZVwiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIlllc1wiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwiTm9cIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwiQXJlIHlvdSBzdXJlIHRoYXQgeW91IHdhbnQgdG8gcmVtb3ZlIHRoaXMgZmlsZTogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwiQXJlIHlvdSBzdXJlIHRoYXQgeW91IHdhbnQgdG8gcmVtb3ZlIGFsbCBmaWxlcz9cIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcIlF1ZXN0aW9uIFRpdGxlXCIsXG4gIG1vZGFsQ2FuY2VsQnV0dG9uVGV4dDogXCJDYW5jZWxcIixcbiAgbW9kYWxBcHBseUJ1dHRvblRleHQ6IFwiQXBwbHlcIixcbn07XG5cbi8vVW5jb21tZW50IHRoZXNlIHR3byBsaW5lcyBvbiBjcmVhdGluZyBhIHRyYW5zbGF0aW9uIGZpbGUuIFlvdSBzaG91bGQgcmVwbGFjZSBcImVuXCIgYW5kIGVuU3RyaW5ncyB3aXRoIHlvdXIgbG9jYWxlIChcImZyXCIsIFwiZGVcIiBhbmQgc28gb24pIGFuZCB5b3VyIHZhcmlhYmxlLlxuLy9zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImVuXCJdID0gZW5nbGlzaFN0cmluZ3M7XG4vL3N1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImVuXCJdID0gXCJFbmdsaXNoXCI7XG4iLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGVzdG9uaWFuU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIlRhZ2FzaVwiLFxuICBwYWdlTmV4dFRleHQ6IFwiRWRhc2lcIixcbiAgY29tcGxldGVUZXh0OiBcIkzDtXBldGFcIixcbiAgcHJldmlld1RleHQ6IFwiRWVsdmFhZGVcIixcbiAgZWRpdFRleHQ6IFwiTXV1ZGFcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIkFsdXN0YVwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIk11dSAodMOkcHN1c3RhKVwiLFxuICBub25lSXRlbVRleHQ6IFwiTWl0dGUgbWlkYWdpXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIlZhbGkga8O1aWtcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIkxlaGVrw7xsZyB7MH0vezF9XCIsXG4gIHBhbmVsRHluYW1pY1Byb2dyZXNzVGV4dDogXCJLaXJqZSB7MH0vezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCJWYXN0YXR1ZCB7MH0ga8O8c2ltdXN0IHsxfS1zdFwiLFxuICBlbXB0eVN1cnZleTogXCJTZWxsZXMgdXVyaW5ndXMgZWkgb2xlIMO8aHRraSBuw6RodGF2YXQgbGVoZWvDvGxnZSB2w7VpIGvDvHNpbXVzdC5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJBaXTDpGgsIGV0IHZhc3Rhc2lkIGFua2VlZGlsZSFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcIk1laWUgYW5kbWV0ZWwgb2xlZCBzYSBzZWxsZWxlIGFua2VlZGlsZSBqdWJhIHZhc3RhbnVkLlwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkxhZW4gYW5rZWV0aS4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJWYWxpLi4uXCIsXG4gIHZhbHVlOiBcInbDpMOkcnR1c1wiLFxuICByZXF1aXJlZEVycm9yOiBcIlBhbHVuIHZhc3RhIGvDvHNpbXVzZWxlLlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJQYWx1biB2YXN0YSB2w6RoZW1hbHQgw7xoZWxlIGvDvHNpbXVzZWxlLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIlBhbHVuIGFubmEgdmFzdHVzIGlnYWwgcmVhbC5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIlNlZSBwZWFrcyBvbGVtYSBudW1icmlsaW5lIHbDpMOkcnR1cy5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJQYWx1biBzaXNlc3RhIHbDpGhlbWFsdCB7MH0gdMOkaGVtw6Rya2kuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiUGFsdW4gw6RyYSBzaXNlc3RhIHJvaGtlbSBrdWkgezB9IHTDpGhlbcOkcmtpLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIlNpc2VzdGEgcGFsdW4gezB9IC0gezF9IHTDpGhlbcOkcmtpLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIlNpc2VzdGEgcGxhdW4gdsOkaGVtYWx0IHswfSByaWRhLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJQYWx1biB2YWxpIHbDpGhlbWFsdCB7MH0gdmFyaWFudGkuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIlBhbHVuIHZhbGkga8O1aWdlIHJvaGtlbSB7MH0gdmFyaWFudGkuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCInezB9JyBwZWFrcyBvbGVtYSB2w7VyZG5lIHbDtWkgc3V1cmVtIGt1aSB7MX0gamEgdsO1cmRuZSB2w7VpIHbDpGlrc2VtIGt1aSB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyBwZWFrcyBvbGVtYSB2w7VyZG5lIHbDtWkgc3V1cmVtIGt1aSB7MX1cIixcbiAgbnVtZXJpY01heDogXCInezB9JyBwZWFrcyBvbGVtYSB2w7VybmRlIHbDtWkgdsOkaWtzZW0ga3VpIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiU2lzZXN0YSBwYWx1biBrb3JyZWt0bmUgZS1wb3N0aSBhYWRyZXNzLlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCJBdmFsZGlzOiB7MH0gcGVha3MgdGFnYXN0YW1hIHTDtWVzZS5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIlRhb3RsdXMgdGFnYXN0YXMgdmVhIOKAnnswfeKAnS4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcIlRhb3RsdXMgdGFnYXN0YXMgdMO8aGphZCBhbmRtZWQgdsO1aSBhdHJpYnV1dCAncGF0aCcgb24gdmFsZVwiLFxuICBleGNlZWRNYXhTaXplOiBcIkZhaWxpIHN1dXJ1cyBlaSB0b2hpIMO8bGV0YWRhIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIlNpc2VzdGEgcGFsdW4gbXV1IHZhc3R1cy5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIlNpbnUgZmFpbCBsYWViIMO8bGVzLiBQYWx1biBvb3RhIG3DtW5lZCBzZWt1bmRpZCBuaW5nIHByb292aSBzZWVqw6RyZWwgdXVlc3RpLlwiLFxuICBsb2FkaW5nRmlsZTogXCJMYWVuLi4uXCIsXG4gIGNob29zZUZpbGU6IFwiVmFsaSBmYWlsKGlkKS4uLlwiLFxuICBub0ZpbGVDaG9zZW46IFwiRmFpbGkgcG9sZSB2YWxpdHVkXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiS2FzIHRhaGFkIGtpcmplIGt1c3R1dGFkYT9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJTZWUgdsOkw6RydHVzIHBlYWIgb2xlbWEgdW5pa2FhbG5lLlwiLFxuICBhZGRDb2x1bW46IFwiTGlzYSB2ZWVyZ1wiLFxuICBhZGRSb3c6IFwiTGlzYSByaWRhXCIsXG4gIHJlbW92ZVJvdzogXCJFZW1hbGRhXCIsXG4gIGFkZFBhbmVsOiBcIkxpc2EgdXVzXCIsXG4gIHJlbW92ZVBhbmVsOiBcIkVlbWFsZGFcIixcbiAgY2hvaWNlc19JdGVtOiBcIsO8a3N1c1wiLFxuICBtYXRyaXhfY29sdW1uOiBcIlZlZXJnXCIsXG4gIG1hdHJpeF9yb3c6IFwiUmlkYVwiLFxuICBzYXZpbmdEYXRhOiBcIlNhbHZlc3RhbiBhbmRtZWQgc2VydmVyaXMuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIlRla2tpcyB2aWdhIG5pbmcgbWUgZWkgc2FhbnVkIHZhc3R1c2VpZCBzYWx2ZXN0YWRhLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJWYXN0dXN0ZSBzYWx2ZXN0YW1pbmUgw7VubmVzdHVzIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiUHJvb3ZpIHV1ZXN0aVwiLFxuICB0aW1lck1pbjogXCJtaW5cIixcbiAgdGltZXJTZWM6IFwic2VrXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwiT2xlZCB2ZWV0bnVkIHswfSBzZWxsZWwgbGVoZWwgbmluZyBrb2trdSB7MX0uXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIk9sZWQgdmVldG51ZCB7MH0gc2VsbGVsIGxlaGVsLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIk9sZWQgdmVldG51ZCB7MH0ga29ra3UuXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCJPbGVkIGt1bHV0YW51ZCB7MH0gdsO1aW1hbGlrdXN0IHsxfSBzZWxsZWwgbGVoZWwgbmluZyB7Mn0gdsO1aW1hbGlrdXN0IHszfSBrb2trdS5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiT2xlZCBrdWx1dGFudWQgezB9IHbDtWltYWxpa3VzdCB7MX0gc2VsbGVsIGxlaGVsLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIk9sZWQga3VsdXRhbnVkIHswfSB2w7VpbWFsaWt1c3QgezF9IGtvZ3VhamFzdC5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIlB1aGFzdGFcIixcbiAgY2xlYXJDYXB0aW9uOiBcIlB1aGFzdGFcIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwiVmFsaSBmYWlsXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIkVlbWFsZGEgc2VlIGZhaWxcIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCJKYWhcIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcIkVpXCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcIk9sZWQgc2Ega2luZGVsLCBldCBzb292aWQgc2VsbGUgZmFpbGkgZWVtYWxkYWRhOiB7MH0/XCIsXG4gIGNvbmZpcm1SZW1vdmVBbGxGaWxlczogXCJPbGVkIHNhIGtpbmRlbCwgZXQgc29vdmlkIGVlbWFsZGFkYSBrw7VpayBmYWlsaWQ/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCJLw7xzaW11c2UgcGVhbGtpcmlcIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiZXRcIl0gPSBlc3RvbmlhblN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJldFwiXSA9IFwiZWVzdGkga2VlbFwiO1xuIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBmaW5uaXNoU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIkVkZWxsaW5lblwiLFxuICBwYWdlTmV4dFRleHQ6IFwiU2V1cmFhdmFcIixcbiAgY29tcGxldGVUZXh0OiBcIlZhbG1pc1wiLFxuICBwcmV2aWV3VGV4dDogXCJFc2lrYXRzZWx1XCIsXG4gIGVkaXRUZXh0OiBcIk11b2trYWFcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIkFsb2l0YVwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIk11dSAodGFya2VubmEpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCJFaSBtaXTDpMOkblwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCJWYWxpdHNlIGthaWtraVwiLFxuICBwcm9ncmVzc1RleHQ6IFwiU2l2dSB7MH0gLyB7MX1cIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcIk9zaW8gezB9IC8gezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCJPbGV0IHZhc3Rhbm51dCB7MH0gLyB7MX0ga3lzeW15a3NlZW4uXCIsXG4gIGVtcHR5U3VydmV5OlxuICAgIFwiVMOkc3PDpCBreXNlbHlzc8OkIGVpIG9sZSB5aHTDpMOkbiBuw6RreXZpbGzDpCBvbGV2YWEgc2l2dWEgdGFpIGt5c3lteXN0w6QuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiS2lpdG9zIGt5c2VseXluIHZhc3RhYW1pc2VzdGEhXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgXCJUaWV0b2plbW1lIG11a2FhbiBvbGV0IGpvIHN1b3JpdHRhbnV0IHTDpG3DpG4ga3lzZWx5bi5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJLeXNlbHnDpCBsYWRhdGFhbiBwYWx2ZWxpbWVsdGEuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiVmFsaXRzZS4uLlwiLFxuICB2YWx1ZTogXCJhcnZvXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiVmFzdGFhIGt5c3lteWtzZWVuLCBraWl0b3MuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIlZhc3RhYSBhaW5ha2luIHlodGVlbiBreXN5bXlrc2Vlbi5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJWYXN0YWEga3lzeW15a3NpaW4ga2Fpa2lsbGEgcml2ZWlsbMOkLlwiLFxuICBudW1lcmljRXJyb3I6IFwiQXJ2b24gdHVsZWUgb2xsYSBudW1lZXJpbmVuLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIlN5w7Z0w6QgdsOkaGludMOkw6RuIHswfSBtZXJra2nDpC5cIixcbiAgdGV4dE1heExlbmd0aDogXCLDhGzDpCBzecO2dMOkIHlsaSB7MH0gbWVya2tpw6QuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiU3nDtnTDpCB2w6RoaW50w6TDpG4gezB9IGphIGVuaW50w6TDpG4gezF9IG1lcmtracOkLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIlTDpHl0w6QgdsOkaGludMOkw6RuIHswfSByaXZpw6QuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlZhbGl0c2UgdsOkaGludMOkw6RuIHswfSB2YWlodG9laHRvYS5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiVmFsaXRzZSBlbmludMOkw6RuIHswfSB2YWlodG9laHRvYS5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIkx1dnVuICd7MH0nIHR1bGVlIG9sbGEgdsOkaGludMOkw6RuIHsxfSBqYSBrb3JrZWludGFhbiB7Mn0uXCIsXG4gIG51bWVyaWNNaW46IFwiTHV2dW4gJ3swfScgdHVsZWUgb2xsYSB2w6RoaW50w6TDpG4gezF9LlwiLFxuICBudW1lcmljTWF4OiBcIkx1dnVuICd7MH0nIHR1bGVlIG9sbGEga29ya2VpbnRhYW4gezF9LlwiLFxuICBpbnZhbGlkRW1haWw6IFwiU3nDtnTDpCB2YWxpZGkgc8OkaGvDtnBvc3Rpb3NvaXRlLlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCJMYXVzZWtrZWVuOiB7MH0gcGl0w6Rpc2kgcGFsYXV0dGFhICd0cnVlJy5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIlB5eW50w7YgcGFsYXV0dGkgdmlyaGVlbiB7MH0uIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCJQeXludMO2IHBhbGF1dHRpIHR5aGrDpG4gdGllZG9zdG9uIHRhaSAncGF0aCctYXNldHVzIG9uIHbDpMOkcsOkXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiVGllZG9zdG9uIGtva28gZWkgc2FhIG9sbGEgc3V1cmVtcGkga3VpbiB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJUYXJrZW5uYSB2YXN0YXVzdGFzaSB0ZWtzdGlrZW50dMOkw6RuLlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiVGllZG9zdG9hIGzDpGhldGV0w6TDpG4uIE9kb3RhIG11dXRhbWEgc2VrdW50aSBqYSB5cml0w6QgdXVkZWxsZWVuLlwiLFxuICBsb2FkaW5nRmlsZTogXCJMYWRhdGFhbi4uLlwiLFxuICBjaG9vc2VGaWxlOiBcIlZhbGl0c2UgdGllZG9zdG8odCkuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcIkVpIHRpZWRvc3RvYSB2YWxpdHR1bmFcIixcbiAgY29uZmlybURlbGV0ZTogXCJIYWx1YXRrbyBwb2lzdGFhIG9zaW9uP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIlTDpG3DpCBhcnZvIG9uIGpvIGvDpHl0w7Zzc8OkLiBTecO2dMOkIHRvaW5lbiBhcnZvLlwiLFxuICBhZGRDb2x1bW46IFwiTGlzw6TDpCBzYXJha2VcIixcbiAgYWRkUm93OiBcIkxpc8Okw6Qgcml2aVwiLFxuICByZW1vdmVSb3c6IFwiUG9pc3RhXCIsXG4gIGVtcHR5Um93c1RleHQ6IFwiRWkgcml2ZWrDpFwiLFxuICBhZGRQYW5lbDogXCJMaXPDpMOkIHV1c2lcIixcbiAgcmVtb3ZlUGFuZWw6IFwiUG9pc3RhXCIsXG4gIGNob2ljZXNfSXRlbTogXCJrb2hkZVwiLFxuICBtYXRyaXhfY29sdW1uOiBcIlNhcmFrZVwiLFxuICBtYXRyaXhfcm93OiBcIlJpdmlcIixcbiAgc2F2aW5nRGF0YTogXCJUaWV0b2phIHRhbGxlbm5ldGFhbiBwYWx2ZWxpbWVsbGUuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIlRhcGFodHVpIHZpcmhlLCBlbW1la8OkIHZvaW5lZXQgdGFsbGVudGFhIGt5c2VseW4gdGlldG9qYS5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiVGllZG90IHRhbGxlbm5ldHRpaW4gb25uaXN0dW5lZXN0aSFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIllyaXTDpCB1dWRlbGxlZW5cIixcbiAgdGltZXJNaW46IFwibWluXCIsXG4gIHRpbWVyU2VjOiBcInNla1wiLFxuICB0aW1lclNwZW50QWxsOiBcIk9sZXQga8OkeXR0w6RueXQgezB9IHTDpGxsw6Qgc2l2dWxsYSBqYSB5aHRlZW5zw6QgezF9LlwiLFxuICB0aW1lclNwZW50UGFnZTogXCJPbGV0IGvDpHl0dMOkbnl0IHswfSB0w6RsbMOkIHNpdnVsbGEuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwiT2xldCBrw6R5dHTDpG55dCB5aHRlZW5zw6QgezB9LlwiLFxuICB0aW1lckxpbWl0QWxsOlxuICAgIFwiT2xldCBrw6R5dHTDpG55dCB0w6RsbMOkIHNpdnVsbGEgezB9IC8gezF9IGphIHlodGVlbnPDpCB7Mn0gLyB7M30uXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIk9sZXQga8OkeXR0w6RueXQgezB9IC8gezF9IHTDpGxsw6Qgc2l2dWxsYS5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCJPbGV0IGvDpHl0dMOkbnl0IHlodGVlbnPDpCB7MH0gLyB7MX0uXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCJQeXloaVwiLFxuICBjbGVhckNhcHRpb246IFwiVHloamVubsOkXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcIlZhbGl0c2UgdGllZG9zdG9cIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwiUG9pc3RhIHTDpG3DpCB0aWVkb3N0b1wiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIkt5bGzDpFwiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwiRWlcIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwiSGFsdWF0a28gdmFybWFzdGkgcG9pc3RhYSB0w6Rtw6RuIHRpZWRvc3RvbjogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwiSGFsdWF0a28gdmFybWFzdGkgcG9pc3RhYSBrYWlra2kgdGllZG9zdG90P1wiLFxuICBxdWVzdGlvblRpdGxlUGF0dGVyblRleHQ6IFwiS3lzeW15a3NlbiBvdHNpa2tvXCIsXG4gIG1vZGFsQ2FuY2VsQnV0dG9uVGV4dDogXCJQZXJ1dXRhXCIsXG4gIG1vZGFsQXBwbHlCdXR0b25UZXh0OiBcIkvDpHl0w6RcIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiZmlcIl0gPSBmaW5uaXNoU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImZpXCJdID0gXCJzdW9taVwiO1xuIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBmcmVuY2hTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiUHLDqWPDqWRlbnRcIixcbiAgcGFnZU5leHRUZXh0OiBcIlN1aXZhbnRcIixcbiAgY29tcGxldGVUZXh0OiBcIlRlcm1pbmVyXCIsXG4gIHByZXZpZXdUZXh0OiBcIkFwZXLDp3VcIixcbiAgZWRpdFRleHQ6IFwiTW9kaWZpZXJcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIkNvbW1lbmNlclwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIkF1dHJlIChwcsOpY2lzZXIpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCJBdWN1blwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCJUb3V0IHPDqWxlY3Rpb25uZXJcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlBhZ2UgezB9IHN1ciB7MX1cIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcIkVucmVnaXN0cmVtZW50IHswfSBzdXIgezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCJ7MH0vezF9IHF1ZXN0aW9uKHMpIHLDqXBvbmR1ZShzKVwiLFxuICBlbXB0eVN1cnZleTogXCJJbCBuJ3kgYSBuaSBwYWdlIHZpc2libGUgbmkgcXVlc3Rpb24gdmlzaWJsZSBkYW5zIGNlIHF1ZXN0aW9ubmFpcmVcIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJNZXJjaSBkJ2F2b2lyIHLDqXBvbmR1IGF1IHF1ZXN0aW9ubmFpcmUgIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOiBcIk5vcyBkb25uw6llcyBpbmRpcXVlbnQgcXVlIHZvdXMgYXZleiBkw6lqw6AgcmVtcGxpIGNlIHF1ZXN0aW9ubmFpcmUuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiTGUgcXVlc3Rpb25uYWlyZSBlc3QgZW4gY291cnMgZGUgY2hhcmdlbWVudC4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJDaG9pc2lzc2V6Li4uXCIsXG4gIHZhbHVlOiBcInZhbGV1clwiLFxuICByZXF1aXJlZEVycm9yOiBcIkxhIHLDqXBvbnNlIMOgIGNldHRlIHF1ZXN0aW9uIGVzdCBvYmxpZ2F0b2lyZS5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwiTWVyY2kgZGUgcsOpcG9uZHJlIGF1IG1vaW5zIMOgIHVuZSBxdWVzdGlvbi5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJUb3V0ZXMgbGVzIGxpZ25lcyBzb250IG9ibGlnYXRvaXJlc1wiLFxuICBudW1lcmljRXJyb3I6IFwiTGEgcsOpcG9uc2UgZG9pdCDDqnRyZSB1biBub21icmUuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiTWVyY2kgZGUgc2Fpc2lyIGF1IG1vaW5zIHswfSBjYXJhY3TDqHJlcy5cIixcbiAgdGV4dE1heExlbmd0aDogXCJNZXJjaSBkZSBzYWlzaXIgbW9pbnMgZGUgezB9IGNhcmFjdMOocmVzLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIk1lcmNpIGRlIHNhaXNpciBlbnRyZSB7MH0gZXQgezF9IGNhcmFjdMOocmVzLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIk1lcmNpIGRlIGNvbXBsw6l0ZXIgYXUgbW9pbnMgezB9IGxpZ25lcy5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiTWVyY2kgZGUgc8OpbGVjdGlvbm5lciBhdSBtaW5pbXVtIHswfSByw6lwb25zZXMuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIk1lcmNpIGRlIHPDqWxlY3Rpb25uZXIgYXUgbWF4aW11bSB7MH0gcsOpcG9uc2VzLlwiLFxuICBudW1lcmljTWluTWF4OiBcIlZvdHJlIHLDqXBvbnNlICd7MH0nIGRvaXQgw6p0cmUgc3Vww6lyaWV1cmUgb3Ugw6lnYWxlIMOgIHsxfSBldCBpbmbDqXJpZXVyZSBvdSDDqWdhbGUgw6AgezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiVm90cmUgcsOpcG9uc2UgJ3swfScgZG9pdCDDqnRyZSBzdXDDqXJpZXVyZSBvdSDDqWdhbGUgw6AgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiVm90cmUgcsOpcG9uc2UgJ3swfScgZG9pdCDDqnRyZSBpbmbDqXJpZXVyZSBvdSDDqWdhbGUgw6AgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJNZXJjaSBkJ2VudHJlciB1bmUgYWRyZXNzZSBtYWlsIHZhbGlkZS5cIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwiTCdleHByZXNzaW9uOiB7MH0gZG9pdCByZXRvdXJuZXIgJ3RydWUnLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiTGEgcmVxdcOqdGUgYSByZW52b3nDqSB1bmUgZXJyZXVyICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOiBcIkxhIHJlcXXDqnRlIGEgcmVudm95w6kgZGVzIGRvbm7DqWVzIHZpZGVzIG91IGxhIHByb3ByacOpdMOpICdwYXRoJyBlc3QgaW5jb3JyZWN0ZVwiLFxuICBleGNlZWRNYXhTaXplOiBcIkxhIHRhaWxsZSBkdSBmaWNoaWVyIG5lIGRvaXQgcGFzIGV4Y8OpZGVyIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIk1lcmNpIGRlIHByw6ljaXNlciBsZSBjaGFtcCAnQXV0cmUnLlwiLFxuICB1cGxvYWRpbmdGaWxlOiBcIlZvdHJlIGZpY2hpZXIgZXN0IGVuIGNvdXJzIGRlIGNoYXJnZW1lbnQuIE1lcmNpIGQnYXR0ZW5kcmUgcXVlbHF1ZXMgc2Vjb25kZXMgZXQgZGUgcsOpZXNzYXllci5cIixcbiAgbG9hZGluZ0ZpbGU6IFwiQ2hhcmdlbWVudC4uLlwiLFxuICBjaG9vc2VGaWxlOiBcIkFqb3V0ZXIgZGVzIGZpY2hpZXJzLi4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCJBdWN1biBmaWNoaWVyIGFqb3V0w6lcIixcbiAgY29uZmlybURlbGV0ZTogXCJWb3VsZXotdm91cyBzdXBwcmltZXIgY2V0IGVucmVnaXN0cmVtZW50ID9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJDZXR0ZSB2YWxldXIgZG9pdCDDqnRyZSB1bmlxdWUuXCIsXG4gIGFkZENvbHVtbjogXCJBam91dGVyIHVuZSBjb2xvbm5lXCIsXG4gIGFkZFJvdzogXCJBam91dGVyIHVuZSBsaWduZVwiLFxuICByZW1vdmVSb3c6IFwiU3VwcHJpbWVyXCIsXG4gIGFkZFBhbmVsOiBcIkFqb3V0ZXJcIixcbiAgcmVtb3ZlUGFuZWw6IFwiU3VwcHJpbWVyXCIsXG4gIGNob2ljZXNfSXRlbTogXCJpdGVtXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiQ29sb25uZVwiLFxuICBtYXRyaXhfcm93OiBcIkxpZ25lXCIsXG4gIHNhdmluZ0RhdGE6IFwiTGVzIHLDqXN1bHRhdHMgc29udCBlbiBjb3VycyBkZSBzYXV2ZWdhcmRlIHN1ciBsZSBzZXJ2ZXVyLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCJVbmUgZXJyZXVyIGVzdCBzdXJ2ZW51ZSBldCBhIGVtcMOqY2jDqSBsYSBzYXV2ZWdhcmRlIGRlcyByw6lzdWx0YXRzLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJMZXMgcsOpc3VsdGF0cyBvbnQgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqXMgIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiUsOpZXNzYXllclwiLFxuICB0aW1lck1pbjogXCJtaW5cIixcbiAgdGltZXJTZWM6IFwic2VjXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwiVm91cyBhdmV6IHBhc3PDqSB7MH0gc3VyIGNldHRlIHBhZ2UgZXQgezF9IGF1IHRvdGFsLlwiLFxuICB0aW1lclNwZW50UGFnZTogXCJWb3VzIGF2ZXogcGFzc8OpIHswfSBzdXIgY2V0dGUgcGFnZS5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCJWb3VzIGF2ZXogcGFzc8OpIHswfSBhdSB0b3RhbC5cIixcbiAgdGltZXJMaW1pdEFsbDogXCJWb3VzIGF2ZXogcGFzc8OpIHswfSBzdXIgezF9IHN1ciBjZXR0ZSBwYWdlIGV0IHsyfSBzdXIgezN9IGF1IHRvdGFsLlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCJWb3VzIGF2ZXogcGFzc8OpIHswfSBzdXIgezF9IHN1ciBjZXR0ZSBwYWdlLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIlZvdXMgYXZleiBwYXNzw6kgezB9IHN1ciB7MX0gYXUgdG90YWwuXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCJOZXR0b3llclwiLFxuICBjbGVhckNhcHRpb246IFwiVmlkZXJcIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwiQWpvdXRlciB1biBmaWNoaWVyXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIkVubGV2ZXIgY2UgZmljaGllclwiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIk91aVwiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwiTm9uXCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcIsOKdGVzLXZvdXMgY2VydGFpbnMgZGUgdm91bG9pciBzdXBwcmltZXIgY2UgZmljaGllciA6IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIsOKdGVzLXZvdXMgY2VydGFpbnMgZGUgdm91bG9pciBzdXBwcmltZXIgdG91cyBsZXMgZmljaGllcnM/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCJUaXRyZSBkZSBsYSBxdWVzdGlvblwiLFxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJmclwiXSA9IGZyZW5jaFN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJmclwiXSA9IFwiZnJhbsOnYWlzXCI7XG4iLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGdlb3JnaWFuU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIuGDo+GDmeGDkOGDnFwiLFxuICBwYWdlTmV4dFRleHQ6IFwi4YOo4YOU4YOb4YOT4YOU4YOSXCIsXG4gIGNvbXBsZXRlVGV4dDogXCLhg5Phg5Dhg6Hhg6Dhg6Phg5rhg5Thg5Hhg5BcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIuGDkuGDleGDlOGDoOGDk+GDmCB7MH0gLyB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwi4YOQ4YOg4YOq4YOU4YOg4YOX4YOYIOGDmeGDmOGDl+GDruGDleGDkCDhg5Dhg6Ag4YOQ4YOg4YOY4YOhLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIuGDkuGDm+GDkOGDk+GDmuGDneGDkeGDlyDhg5nhg5jhg5fhg67hg5Xhg5Dhg6Dhg5jhg6Eg4YOo4YOU4YOV4YOh4YOU4YOR4YOY4YOh4YOX4YOV4YOY4YOhIVwiLFxuICBsb2FkaW5nU3VydmV5OiBcIuGDqeGDkOGDouGDleGDmOGDoOGDl+GDleGDkCDhg6Hhg5Thg6Dhg5Xhg5Thg6Dhg5jhg5Phg5Dhg5wuLi5cIixcbiAgb3RoZXJJdGVtVGV4dDogXCLhg6Hhg67hg5Xhg5AgKOGDkuGDl+GDruGDneGDleGDlyDhg5vhg5jhg6Phg5fhg5jhg5fhg5Thg5cpXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIuGDkOGDoOGDqeGDlOGDleGDkC4uLlwiLFxuICByZXF1aXJlZEVycm9yOiBcIuGDkuGDl+GDruGDneGDleGDlyDhg6Phg57hg5Dhg6Hhg6Phg67hg5Thg5cg4YOZ4YOY4YOX4YOu4YOV4YOQ4YOhLlwiLFxuICBudW1lcmljRXJyb3I6IFwi4YOe4YOQ4YOh4YOj4YOu4YOYIOGDo+GDnOGDk+GDkCDhg5jhg6fhg53hg6Eg4YOg4YOY4YOq4YOu4YOV4YOYLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIuGDkuGDl+GDruGDneGDleGDlyDhg6jhg5Thg5jhg6fhg5Xhg5Dhg5zhg5Thg5cg4YOQ4YOg4YOQ4YOc4YOQ4YOZ4YOa4YOU4YORIHswfSDhg6Hhg5jhg5vhg5Hhg53hg5rhg50uXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIuGDkuGDl+GDruGDneGDleGDlyDhg5Dhg5jhg6Dhg6nhg5jhg5Thg5cg4YOQ4YOg4YOQ4YOc4YOQ4YOZ4YOa4YOU4YORIHswfSDhg5Xhg5Dhg6Dhg5jhg5Dhg5zhg6Lhg5guXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIuGDkuGDl+GDruGDneGDleGDlyDhg5Dhg5jhg6Dhg6nhg5jhg5Thg5cg4YOQ4YOg4YOQ4YOj4YOb4YOU4YOi4YOU4YOhIHswfSDhg5Xhg5Dhg6Dhg5jhg5Dhg5zhg6Lhg5guXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCInezB9JyDhg6Phg5zhg5Phg5Ag4YOY4YOn4YOd4YOhIOGDm+GDlOGDouGDmCDhg5Dhg5wg4YOi4YOd4YOa4YOYLCDhg5Xhg5jhg5Phg6Dhg5QgezF9LCDhg5Phg5Ag4YOc4YOQ4YOZ4YOa4YOU4YOR4YOYIOGDkOGDnCDhg6Lhg53hg5rhg5gg4YOV4YOY4YOT4YOg4YOUIHsyfVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nIOGDo+GDnOGDk+GDkCDhg5jhg6fhg53hg6Eg4YOb4YOU4YOi4YOYIOGDkOGDnCDhg6Lhg53hg5rhg5gg4YOV4YOY4YOT4YOg4YOUIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIid7MH0nIOGDo+GDnOGDk+GDkCDhg5jhg6fhg53hg6Eg4YOc4YOQ4YOZ4YOa4YOU4YOR4YOYIOGDkOGDnCDhg6Lhg53hg5rhg5gg4YOV4YOY4YOT4YOg4YOUIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwi4YOS4YOX4YOu4YOd4YOV4YOXIOGDqOGDlOGDmOGDp+GDleGDkOGDnOGDneGDlyDhg5Thg5ouIOGDpOGDneGDoeGDouGDmOGDoSDhg6Dhg5Thg5Dhg5rhg6Phg6Dhg5gg4YOb4YOY4YOh4YOQ4YOb4YOQ4YOg4YOX4YOYLlwiLFxuICBvdGhlclJlcXVpcmVkRXJvcjogXCLhg5Lhg5fhg67hg53hg5Xhg5cg4YOo4YOU4YOQ4YOV4YOh4YOU4YOXIOGDleGDlOGDmuGDmCAn4YOh4YOu4YOV4YOQJ1wiXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImthXCJdID0gZ2VvcmdpYW5TdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wia2FcIl0gPSBcIuGDpeGDkOGDoOGDl+GDo+GDmuGDmFwiO1xuIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBnZXJtYW5TdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiWnVyw7xja1wiLFxuICBwYWdlTmV4dFRleHQ6IFwiV2VpdGVyXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJBYnNjaGxpZcOfZW5cIixcbiAgcHJldmlld1RleHQ6IFwiVm9yc2NoYXVcIixcbiAgZWRpdFRleHQ6IFwiQmVhcmJlaXRlblwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwiU3RhcnRcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJTb25zdGlnZXMgKEJpdHRlIGFuZ2ViZW4pXCIsXG4gIG5vbmVJdGVtVGV4dDogXCJOaWNodHMgdHJpZmZ0IHp1XCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIkFsbGVzIGF1c3fDpGhsZW5cIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlNlaXRlIHswfSB2b24gezF9XCIsXG4gIHBhbmVsRHluYW1pY1Byb2dyZXNzVGV4dDogXCJFaW50cmFnIHswfSB2b24gezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCJ7MH0vezF9IEZyYWdlbiBiZWFudHdvcnRldFwiLFxuICBlbXB0eVN1cnZleTogXCJFcyBzaW5kIGtlaW5lIEZyYWdlbiB2b3JoYW5kZW4uXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiVmllbGVuIERhbmssIGRhc3MgU2llIGRpZSBVbWZyYWdlIGFiZ2VzY2hsb3NzZW4gaGFiZW4hXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgXCJXaXIgaGFiZW4gZmVzdGdlc3RlbGx0LCBkYXNzIFNpZSBkaWVzZSBVbWZyYWdlIGJlcmVpdHMgYWJnZXNjaGxvc3NlbiBoYWJlbi5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJVbWZyYWdlIHdpcmQgZ2VsYWRlbi4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJCaXR0ZSBhdXN3w6RobGVuLi4uXCIsXG4gIHZhbHVlOiBcIldlcnRcIixcbiAgcmVxdWlyZWRFcnJvcjogXCJCaXR0ZSBiZWFudHdvcnRlbiBTaWUgZGllc2UgRnJhZ2UuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIkJpdHRlIGJlYW50d29ydGVuIFNpZSBtaW5kZXN0ZW5zIGVpbmUgRnJhZ2UuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiQml0dGUgYmVhbnR3b3J0ZW4gU2llIGFsbGUgRnJhZ2VuLlwiLFxuICBudW1lcmljRXJyb3I6IFwiRGVyIFdlcnQgbXVzcyBlaW5lIFphaGwgc2Vpbi5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJCaXR0ZSBnZWJlbiBTaWUgbWluZGVzdGVucyB7MH0gWmVpY2hlbiBlaW4uXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiQml0dGUgZ2ViZW4gU2llIG5pY2h0IG1laHIgYWxzIHswfSBaZWljaGVuIGVpbi5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCJCaXR0ZSBnZWJlbiBTaWUgbWluZGVzdGVucyB7MH0gdW5kIG1heGltYWwgezF9IFplaWNoZW4gZWluLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIkJpdHRlIG1hY2hlbiBTaWUgaW4gbWluZGVzdGVucyB7MH0gWmVpbGVuIGVpbmUgRWluZ2FiZS5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiQml0dGUgd8OkaGxlbiBTaWUgbWluZGVzdGVucyB7MH0gQW50d29ydChlbikgYXVzLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJCaXR0ZSB3w6RobGVuIFNpZSBuaWNodCBtZWhyIGFscyB7MH0gQW50d29ydChlbikgYXVzLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScgbXVzcyBncsO2w59lciBvZGVyIGdsZWljaCB7MX0gdW5kIGtsZWluZXIgb2RlciBnbGVpY2ggezJ9IHNlaW5cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyBtdXNzIGdyw7bDn2VyIG9kZXIgZ2xlaWNoIHsxfSBzZWluXCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScgbXVzcyBrbGVpbmVyIG9kZXIgZ2xlaWNoIHsxfSBzZWluXCIsXG4gIGludmFsaWRFbWFpbDogXCJCaXR0ZSBnZWJlbiBTaWUgZWluZSBnw7xsdGlnZSBFLU1haWwtQWRyZXNzZSBlaW4uXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIkRlciBBdXNkcnVjazogezB9IG11c3MgZGVuIFdlcnQgJ3dhaHInIHp1csO8Y2tnZWJlbi5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIkVpbiBOZXR6d2Vya2RpZW5zdCBoYXQgZm9sZ2VuZGVuIEZlaGxlciB6dXLDvGNrZ2VnZWJlbiAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcIkVpbmUgTmV0endlcmtkaWVuc3QgaGF0IHVuZ8O8bHRpZ2UgRGF0ZW4genVyw7xja2dlZ2ViZW5cIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJEaWUgRGF0ZWkgZGFyZiBuaWNodCBncsO2w59lciBhbHMgezB9IHNlaW4uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJCaXR0ZSBnZWJlbiBTaWUgZWluZW4gV2VydCBhbi5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIkJpdHRlIHdhcnRlbiBTaWUgYmlzIGRlciBVcGxvYWQgSWhyZXIgRGF0ZWllbiBhYmdlc2NobG9zc2VuIGlzdC5cIixcbiAgbG9hZGluZ0ZpbGU6IFwiV2lyZCBob2NoZ2VsYWRlbi4uLlwiLFxuICBjaG9vc2VGaWxlOiBcIkRhdGVpKGVuKSBhdXN3w6RobGVuLi4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCJLZWluZSBEYXRlaSBhdXNnZXfDpGhsdFwiLFxuICBjb25maXJtRGVsZXRlOiBcIldvbGxlbiBTaWUgZGVuIEVpbnRyYWcgbMO2c2NoZW4/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwiRGllc2VyIFdlcnQgbXVzcyBlaW5tYWxpZyBzZWluLlwiLFxuICBhZGRDb2x1bW46IFwiU3BhbHRlIGhpbnp1ZsO8Z2VuXCIsXG4gIGFkZFJvdzogXCJaZWlsZSBoaW56dWbDvGdlblwiLFxuICByZW1vdmVSb3c6IFwiRW50ZmVybmVuXCIsXG4gIGFkZFBhbmVsOiBcIk5ldSBoaW56dWbDvGdlblwiLFxuICByZW1vdmVQYW5lbDogXCJFbnRmZXJuZW5cIixcbiAgY2hvaWNlc19JdGVtOiBcIkVsZW1lbnRcIixcbiAgbWF0cml4X2NvbHVtbjogXCJTcGFsdGVcIixcbiAgbWF0cml4X3JvdzogXCJaZWlsZVwiLFxuICBzYXZpbmdEYXRhOiBcIkRpZSBFcmdlYm5pc3NlIHdlcmRlbiBhdWYgZGVtIFNlcnZlciBnZXNwZWljaGVydC4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiRXMgaXN0IGVpbiBGZWhsZXIgYXVmZ2V0cmV0ZW4uIERpZSBFcmdlYm5pc3NlIGtvbm50ZW4gbmljaHQgZ2VzcGVpY2hlcnQgd2VyZGVuLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJEaWUgRXJnZWJuaXNzZSB3dXJkZW4gZ2VzcGVpY2hlcnQhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJFcm5ldXQgYWJzZW5kZW5cIixcbiAgdGltZXJNaW46IFwiTWluLlwiLFxuICB0aW1lclNlYzogXCJTZWsuXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwiU2llIHdhcmVuIHswfSBhdWYgZGllc2VyIFNlaXRlIHVuZCBicmF1Y2h0ZW4gaW5zZ2VzYW10IHsxfS5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiU2llIHdhcmVuIHswfSBhdWYgZGllc2VyIFNlaXRlLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIlNpZSBoYWJlbiBpbnNnZXNhbXQgezB9IGdlYnJhdWNodC5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcIlNpZSB3YXJlbiB7MH0gdm9uIHsxfSBhdWYgZGllc2VyIFNlaXRlIHVuZCBicmF1Y2h0ZW4gaW5zZ2VzYW10IHsyfSB2b24gezN9LlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCJTaWUgd2FyZW4gezB9IHZvbiB7MX0gYXVmIGRpZXNlciBTZWl0ZS5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCJTaWUgaGFiZW4gaW5zZ2VzYW10IHswfSB2b24gezF9IGdlYnJhdWNodC5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIkFsbGVzIGzDtnNjaGVuXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJBdXN3YWhsIGVudGZlcm5lblwiLFxuICBjaG9vc2VGaWxlQ2FwdGlvbjogXCJEYXRlaSBhdXN3w6RobGVuXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIkRhdGVpIGzDtnNjaGVuXCIsXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwiSmFcIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcIk5laW5cIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwiU2luZCBTaWUgc2ljaGVyLCBkYXNzIFNpZSBkaWVzZSBEYXRlaSBsw7ZzY2hlbiBtw7ZjaHRlbjogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwiU2luZCBTaWUgc2ljaGVyLCBkYXNzIFNpZSBhbGxlIERhdGVpZW4gbMO2c2NoZW4gbcO2Y2h0ZW4/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCJGcmFnZW50aXRlbFwiLFxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJkZVwiXSA9IGdlcm1hblN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJkZVwiXSA9IFwiZGV1dHNjaFwiO1xuIiwiLy9DcmVhdGVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9hZ2Vsb3NwYW5hZ2lvdGFraXNcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgZ3JlZWtTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwizqDPgc6/zrfOs86/z43OvM61zr3Ov1wiLFxuICBwYWdlTmV4dFRleHQ6IFwizpXPgM+MzrzOtc69zr9cIixcbiAgY29tcGxldGVUZXh0OiBcIs6fzrvOv866zrvOrs+Bz4nPg863XCIsXG4gIHByZXZpZXdUZXh0OiBcIs6gz4HOv861z4DOuc+DzrrPjM+AzrfPg863XCIsXG4gIGVkaXRUZXh0OiBcIs6Vz4DOtc6+zrXPgc6zzrHPg86vzrFcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIs6Rz4HPh86uXCIsXG4gIG90aGVySXRlbVRleHQ6IFwizobOu867zr8gKM+AzrHPgc6xzrrOsc67z44gzrTOuc61z4XOus+BzrnOvc6vz4PPhM61KVwiLFxuICBub25lSXRlbVRleHQ6IFwizprOsc69zq3Ovc6xz4JcIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwizpXPgM65zrvOv86zzq4gz4zOu8+Jzr1cIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIs6jzrXOu86vzrTOsSB7MH0gzrHPgM+MIHsxfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwizpXOs86zz4HOsc+Gzq4gezB9IM6xz4DPjCB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcIs6Rz4DOsc69z4TOrs64zrfOus6xzr0gezB9IC8gezF9IM61z4HPic+Ezq7Pg861zrnPglwiLFxuICBlbXB0eVN1cnZleTpcbiAgICBcIs6UzrXOvSDPhc+AzqzPgc+HzrXOuSDOus6xzrzOr86xIM6/z4HOsc+Ezq4gz4POtc67zq/OtM6xIM6uIM6/z4HOsc+Ezq4gzrXPgc+Oz4TOt8+Dzrcgz4POtSDOsc+Fz4TPjCDPhM6/IM61z4HPic+EzrfOvM6xz4TOv867z4zOs865zr8uXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6XG4gICAgXCLOlc+Fz4fOsc+BzrnPg8+Ezr/Pjc68zrUgzrPOuc6xIM+EzrfOvSDPg8+FzrzPgM67zq7Pgc+Jz4POtyDOsc+Fz4TOv8+NIM+Ezr/PhSDOtc+Bz4nPhM63zrzOsc+Ezr/Ou86/zrPOr86/z4UhXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgXCLOpM6xIM6xz4HPh861zq/OsSDOvM6xz4IgzrTOtc6vz4fOvc6/z4XOvSDPjM+Ezrkgzq3Ph861z4TOtSDOrs60zrcgzr/Ou86/zrrOu863z4HPjs+DzrXOuSDOsc+Fz4TOrs69IM+EzrfOvSDOrc+BzrXPhc69zrEuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwizqTOvyDOtc+Bz4nPhM63zrzOsc+Ezr/Ou8+MzrPOuc6/IM+Gzr/Pgc+Ez47Ovc61z4TOsc65IM6xz4DOvyDPhM6/IM60zrnOsc66zr/OvM65z4PPhM6uLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIs6Vz4DOuc67zq3Ovs+EzrUuLi5cIixcbiAgdmFsdWU6IFwizrHOvs6vzrFcIixcbiAgcmVxdWlyZWRFcnJvcjogXCLOoM6xz4HOsc66zrHOu8+OIM6xz4DOsc69z4TOrs+Dz4TOtSDPg8+EzrfOvSDOtc+Bz47PhM63z4POty5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwizpHPgM6xzr3PhM6uz4PPhM61IM+DzrUgz4TOv8+FzrvOrM+HzrnPg8+Ezr/OvSDOvM6vzrEgzrXPgc+Oz4TOt8+DzrcuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6XG4gICAgXCLOoM6xz4HOsc66zrHOu8+OIM6xz4DOsc69z4TOrs+Dz4TOtSDPg8+EzrnPgiDOtc+Bz4nPhM6uz4POtc65z4Igz4POtSDPjM67zrXPgiDPhM65z4IgzrPPgc6xzrzOvM6tz4IuXCIsXG4gIG51bWVyaWNFcnJvcjogXCLOlyDPhM65zrzOriDPgM+Bzq3PgM61zrkgzr3OsSDOtc6vzr3Osc65IM6xz4HOuc64zrzOt8+EzrnOus6uLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIs6gzrHPgc6xzrrOsc67z44gz4PPhc68z4DOu863z4HPjs+Dz4TOtSDPhM6/z4XOu86sz4fOuc+Dz4TOv869IHswfSDPg8+NzrzOss6/zrvOsS5cIixcbiAgdGV4dE1heExlbmd0aDogXCLOlc65z4POsc6zzqzOs861z4TOtSDOu865zrPPjM+EzrXPgc6/z4XPgiDOsc+Az4wgezB9IM+HzrHPgc6xzrrPhM6uz4HOtc+CLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIs6VzrnPg86xzrPOrM6zzrXPhM61IM+AzrXPgc65z4PPg8+Mz4TOtc+Bzr/Phc+CIM6xz4DPjCB7MH0gzrrOsc65IM67zrnOs8+Mz4TOtc+Bzr/Phc+CIM6xz4DPjCB7MX0gz4fOsc+BzrHOus+Ezq7Pgc61z4IuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwizqDOsc+BzrHOus6xzrvPjiDPg8+FzrzPgM67zrfPgc+Oz4PPhM61IM+Ezr/Phc67zqzPh865z4PPhM6/zr0gezB9IM6zz4HOsc68zrzOrc+CLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCLOoM6xz4HOsc66zrHOu8+OIM61z4DOuc67zq3Ovs+EzrUgz4TOv8+FzrvOrM+HzrnPg8+Ezr/OvSB7MH0gz4DOsc+BzrHOu867zrHOs86tz4IuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIs6gzrHPgc6xzrrOsc67z44gzrXPgM65zrvOrc6+z4TOtSDPjM+Hzrkgz4DOsc+BzrHPgM6szr3PiSDOsc+Azr8gezB9IM+AzrHPgc6xzrvOu86xzrPOrc+CLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwizqTOvyAnezB9JyDOuM6xIM+Az4HOrc+AzrXOuSDOvc6xIM61zq/Ovc6xzrkgzq/Pg86/IM6uIM68zrXOs86xzrvPjc+EzrXPgc6/IM6xz4DOvyDPhM6/IHsxfSDOus6xzrkgzq/Pg86/IM6uIM68zrnOus+Bz4zPhM61z4HOvyDOsc+Azr8gz4TOvyB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCLOpM6/ICd7MH0nIM+Az4HOrc+AzrXOuSDOvc6xIM61zq/Ovc6xzrkgzrzOtc6zzrHOu8+Nz4TOtc+Bzr8gzq4gzrnPg86/IM68zrUgz4TOvyB7MX1cIixcbiAgbnVtZXJpY01heDogXCLOpM6/ICd7MH0nIM+Az4HOrc+AzrXOuSDOvc6xIM61zq/Ovc6xzrkgzrzOuc66z4HPjM+EzrXPgc6/IM6uIM6vz4POvyDOsc+Azr8gz4TOvyB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIs6gzrHPgc6xzrrOsc67z44gzrTPjs+Dz4TOtSDOvM65zrEgzrHPgM6/zrTOtc66z4TOriDOtM65zrXPjc64z4XOvc+DzrcgZS1tYWlsLlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCLOlyDOrc66z4bPgc6xz4POtzogezB9IM64zrEgz4DPgc6tz4DOtc65IM69zrEgzrXPgM65z4PPhM+Bzq3PiM61zrkgJ3RydWUnLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwizpcgzrHOr8+EzrfPg863IM61z4DOrc+Dz4TPgc61z4jOtSDPg8+GzqzOu868zrEgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCLOlyDOsc6vz4TOt8+DzrcgzrXPgM6tz4PPhM+BzrXPiM61IM66zrXOvc6sIM60zrXOtM6/zrzOrc69zrEgzq4gzrcgzrnOtM65z4zPhM63z4TOsSAnzrzOv869zr/PgM6sz4TOuS9wYXRoJyDOtc6vzr3Osc65IM61z4PPhs6xzrvOvM6tzr3Ot1wiLFxuICBleGNlZWRNYXhTaXplOiBcIs6kzr8gzrzOrc6zzrXOuM6/z4IgzrTOtc69IM68z4DOv8+BzrXOryDOvc6xIM+Fz4DOtc+BzrLOsc6vzr3Otc65IM+EzrEgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwizqDOsc+BzrHOus6xzrvPjiDPg8+FzrzPgM67zrfPgc+Oz4PPhM61IM+EzrfOvSDPhM65zrzOriDOs865zrEgz4TOvyDPgM61zrTOr86/ICfOrM67zrvOvycuXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCLOpM6/IM6xz4HPh861zq/OvyDPg86xz4IgzrHOvc61zrLOsc6vzr3Otc65LiDOoM6xz4HOsc66zrHOu8+OIM+AzrXPgc65zrzOrc69zrXPhM61IM66zrHPgM6/zrnOsSDOtM61z4XPhM61z4HPjM67zrXPgM+EzrEgzrrOsc65IM60zr/Ous65zrzOrM+Dz4TOtSDOvs6xzr3OrC5cIixcbiAgbG9hZGluZ0ZpbGU6IFwizqbPjM+Bz4TPic+DzrcuLi5cIixcbiAgY2hvb3NlRmlsZTogXCLOlc+AzrnOu86/zrPOriDOsc+Bz4fOtc6vz4nOvSAuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcIs6UzrXOvSDOrc+HzrXOuSDOtc+AzrnOu861zrPOtc6vIM6xz4HPh861zq/Ov1wiLFxuICBjb25maXJtRGVsZXRlOiBcIs6Yzq3Ou861z4TOtSDOvc6xIM60zrnOsc6zz4HOrM+IzrXPhM61IM+EzrfOvSDOtc6zzrPPgc6xz4bOrjtcIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCLOkc+Fz4TOriDOtyDPhM65zrzOriDPgM+Bzq3PgM61zrkgzr3OsSDOtc6vzr3Osc65IM68zr/Ovc6xzrTOuc66zq4uXCIsXG4gIGFkZENvbHVtbjogXCLOoM+Bzr/Pg864zq7Ous63IM+Dz4TOrs67zrfPglwiLFxuICBhZGRSb3c6IFwizqDPgc6/z4POuM6uzrrOtyDOs8+BzrHOvM68zq7PglwiLFxuICByZW1vdmVSb3c6IFwizpHPhs6xzq/Pgc61z4POt1wiLFxuICBhZGRQYW5lbDogXCLOoM+Bzr/Pg864zrXPg861IM69zrXOv1wiLFxuICByZW1vdmVQYW5lbDogXCLOkc+GzrHOuc+Bz45cIixcbiAgY2hvaWNlc19JdGVtOiBcIs61zq/OtM6/z4JcIixcbiAgbWF0cml4X2NvbHVtbjogXCLOo8+Ezq7Ou863XCIsXG4gIG1hdHJpeF9yb3c6IFwizqPOtc65z4HOrFwiLFxuICBzYXZpbmdEYXRhOiBcIs6kzrEgzrHPgM6/z4TOtc67zq3Pg868zrHPhM6xIM6xz4DOv864zrfOus61z43Ov869z4TOsc65IM+Dz4TOv869IM60zrnOsc66zr/OvM65z4PPhM6uIC4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwizqDOsc+Bzr/Phc+DzrnOrM+Dz4TOt866zrUgz4PPhs6szrvOvM6xIM66zrHOuSDOtM61zr0gzq7PhM6xzr0gzrTPhc69zrHPhM6uIM63IM6xz4DOv864zq7Ous61z4XPg863IM+Ez4nOvSDOsc+Azr/PhM61zrvOtc+DzrzOrM+Ez4nOvS5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwizqTOsSDOsc+Azr/PhM61zrvOrc+DzrzOsc+EzrEgzrHPgM6/zrjOt866zrXPjc+EzrfOus6xzr0gzrzOtSDOtc+AzrnPhM+Fz4fOr86xIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwizqDPgc6/z4PPgM6szrjOt8+DzrUgzr7Osc69zqxcIixcbiAgdGltZXJNaW46IFwizrXOu86sz4dcIixcbiAgdGltZXJTZWM6IFwizrTOtc+Fz4RcIixcbiAgdGltZXJTcGVudEFsbDogXCLOiM+HzrXPhM61IM60zrHPgM6xzr3Ors+DzrXOuSB7MH0gz4POtSDOsc+Fz4TOrs69IM+Ezrcgz4POtc67zq/OtM6xIM66zrHOuSB7MX0gz4PPhc69zr/Ou865zrrOrC5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwizojPh861z4TOtSDOvs6/zrTOrc+IzrXOuSB7MH0gz4POtSDOsc+Fz4TOrs69IM+Ezrcgz4POtc67zq/OtM6xLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIs6Iz4fOtc+EzrUgzr7Ov860zq3PiM61zrkgz4PPhc69zr/Ou865zrrOrCB7MH0uXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCLOiM+HzrXPhM61IM60zrHPgM6xzr3Ors+DzrXOuSB7MH0gzrHPgM+MIHsxfSDPg861IM6xz4XPhM6uzr0gz4TOtyDPg861zrvOr860zrEgzrrOsc65IHsyfSDOsc+Az4wgezN9IM+Dz4XOvc6/zrvOuc66zqwuXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIs6Iz4fOtc+EzrUgzr7Ov860zq3PiM61zrkgezB9IM6xz4DPjCB7MX0gz4POtSDOsc+Fz4TOrs69IM+Ezrcgz4POtc67zq/OtM6xLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIs6Iz4fOtc+EzrUgzr7Ov860zq3PiM61zrkgezB9IM6xz4DPjCB7MX0gz4PPhc69zr/Ou865zrrOrC5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIs6azpHOmM6RzqHOl1wiLFxuICBjbGVhckNhcHRpb246IFwizqPOsc+Gzq5cIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwizpXPgM65zrvOrc6+z4TOtSDPhM6/IM6xz4HPh861zq/Ov1wiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCLOms6xz4TOsc+BzrPOrs+Dz4TOtSDOsc+Fz4TPjCDPhM6/IM6xz4HPh861zq/Ov1wiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIs6dzrHOr1wiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwizp/Ph865XCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcIs6Vzq/Pg8+EzrUgzrLOrc6yzrHOuc6/zrkgz4zPhM65IM64zq3Ou861z4TOtSDOvc6xIM66zrHPhM6xz4HOs86uz4POtc+EzrUgzrHPhc+Ez4wgz4TOvyDOsc+Bz4fOtc6vzr86IHswfTtcIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIs6Vzq/Pg8+EzrUgzrLOrc6yzrHOuc6/zrkgz4zPhM65IM64zq3Ou861z4TOtSDOvc6xIM66zrHPhM6xz4HOs86uz4POtc+EzrUgz4zOu86xIM+EzrEgzrHPgc+HzrXOr86xO1wiLFxuICBxdWVzdGlvblRpdGxlUGF0dGVyblRleHQ6IFwizqTOr8+EzrvOv8+CIM61z4HPjs+EzrfPg863z4JcIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiZ3JcIl0gPSBncmVla1N1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJnclwiXSA9IFwizrXOu867zrfOvc65zrrOrFwiO1xuIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBoZWJyZXdTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwi15DXl9eV16jXlFwiLFxuICBwYWdlTmV4dFRleHQ6IFwi16fXk9eZ157XlFwiLFxuICBjb21wbGV0ZVRleHQ6IFwi16HXmdeV151cIixcbiAgcHJldmlld1RleHQ6IFwi16rXpteV15LXlCDXnten15PXmdee15RcIixcbiAgZWRpdFRleHQ6IFwi15zWt9ei1rLXqNeV1rnXmlwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwi15TWt9eq15fWuNec1rjXlFwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIteQ15fXqCAo16DXkCDXnNeq15DXqClcIixcbiAgbm9uZUl0ZW1UZXh0OiBcIteQ16Mg15DXl9eTXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIteR15fXqCDXlNeb15xcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIteT16MgezF9INee16rXldeaIHswfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwi15TXp9ec15jXlCB7MH0g157XqteV15ogezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCLXoteg15Qg16LXnCDXqdeQ15zXldeqXCIsXG4gIGVtcHR5U3VydmV5OiBcIteQ15nXnyDXqdeQ15zXldeqXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwi16rXldeT15Qg16LXnCDXnteZ15zXldeZINeU16nXkNec15XXnyFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcIteU16jXqdeV157XldeqINep15zXoNeVINee16jXkNeV16og16nXm9eR16gg16HXmdeZ157XqiDXkNeqINeU16HXp9eoINeU15bXlC5cIixcbiAgbG9hZGluZ1N1cnZleTogXCLXmNei15nXoNeUINee15TXqdeo16ouLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwi15HXl9eoLi4uXCIsXG4gIHZhbHVlOiBcItei16jXmlwiLFxuICByZXF1aXJlZEVycm9yOiBcIteQ16DXkCDXlNep15Eg16LXnCDXlNep15DXnNeUXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIteQ16DXkCDXoteg15Qg15zXpNeX15XXqiDXotecINep15DXnNeUINeQ15fXqi5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCLXkNeg15Ag16LXoNeUINei15wg16nXkNec15XXqiDXkdeb15wg15TXqdeV16jXldeqLlwiLFxuICBudW1lcmljRXJyb3I6IFwi15TXqtep15XXkdeUINem16jXmdeb15Qg15zXlNeZ15XXqiDXnteh16TXqC5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCLXlNeW158g15zXpNeX15XXqiB7MH0g16rXldeV15nXnS5cIixcbiAgdGV4dE1heExlbmd0aDogXCLXlNeW158g16TXl9eV16og154tIHswfSDXqteV15XXmdedLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIteU15bXnyDXmdeV16rXqCDXni0gezB9INeV16TXl9eV16og154tIHsxfSDXqteV15XXmdedLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIteQ16DXkCDXntec15Ag15zXpNeX15XXqiB7MH0g16nXldeo15XXqi5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwi15HXl9eoINec16TXl9eV16ogezB9INeQ16TXqdeo15XXmdeV16ouXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIteR15fXqCDXoteTIHswfSDXkNek16nXqNeV15nXldeqLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScg15fXmdeZ15Eg15zXlNeZ15XXqiDXqdeV15XXlCDXkNeVINeS15PXldecINeeIHsxfSwg15XXqdeV15XXlCDXnC0gezJ9INeQ15Ug16TXl9eV16og154tIHt9fVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nINeX15nXmdeRINec15TXmdeV16og16nXldeV15Qg15DXlSDXkteT15XXnCDXniB7MX1cIixcbiAgbnVtZXJpY01heDogXCInezB9JyDXl9eZ15nXkSDXnNeU15nXldeqINep15XXldeUINeQ15Ug16fXmNefINeeIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6ICfXlNeW158g15vXqteV15HXqiDXk9eV15BcItecINeX15XXp9eZ16ouJyxcbiAgaW52YWxpZEV4cHJlc3Npb246IFwi15TXkdeZ15jXldeZOiB7MH0g16bXqNeZ15og15zXlNeX15bXmdeoICfXkNee16onLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwi15TXkden16nXlCDXlNeX15bXmdeo15Qg15DXqiDXlNep15LXmdeQ15QgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCLXlNeR16fXqdeUINeU15fXlteZ16jXlCDXoNeq15XXoNeZ150g16jXmden15nXnSDXkNeVINep15TXnteQ16TXmdeZ158gJ9eg16rXmdeRJyDXqdeS15XXmVwiLFxuICBleGNlZWRNYXhTaXplOiBcIteS15XXk9ecINeU16fXldeR16Ug15zXkCDXmdei15zXlCDXotecIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiAn16DXkCDXnNeU15bXmdefINeg16rXldeg15nXnSDXkdep15PXlCBcIteQ15fXqFwiJyxcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIteU16fXldeR16Ug16nXnNeaINeg15jXotefLiDXlNee16rXnyDXnteh16TXqCDXqdeg15nXldeqINeV16DXodeUINep15XXkS5cIixcbiAgbG9hZGluZ0ZpbGU6IFwi15jXldei158uLi5cIixcbiAgY2hvb3NlRmlsZTogXCLXnNeR15fXldeoINen15HXpteZ150uLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcItec15Ag16DXkdeX16gg16fXldeR16VcIixcbiAgY29uZmlybURlbGV0ZTogXCLXlNeQ150g15DXqteUINeo15XXpteUINec157Xl9eV16cg15DXqiDXlNeo16nXldee15Q/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwi16LXqNeaINeW15Qg16bXqNeZ15og15zXlNeZ15XXqiDXmdeZ15fXldeT15kuXCIsXG4gIGFkZENvbHVtbjogXCLXlNeV16HXoyDXotee15XXk9eUXCIsXG4gIGFkZFJvdzogXCLXnNeU15XXodeZ16Mg16nXldeo15RcIixcbiAgcmVtb3ZlUm93OiBcItec1rDXlNa316HWtNeZ16hcIixcbiAgYWRkUGFuZWw6IFwi15TXldeh16Mg15fXk9epXCIsXG4gIHJlbW92ZVBhbmVsOiBcItec1rDXlNa316HWtNeZ16hcIixcbiAgY2hvaWNlc19JdGVtOiBcItek16jXmdeYXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwi15jXldeoXCIsXG4gIG1hdHJpeF9yb3c6IFwi16nXgdeV1rzXqNa415RcIixcbiAgc2F2aW5nRGF0YTogXCLXlNeq15XXpteQ15XXqiDXoNep157XqNeV16og15HXqdeo16ogLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCLXkNeZ16jXoteUINep15LXmdeQ15Qg15XXnNeQINeU16bXnNeX16DXlSDXnNep157XldeoINeQ16og15TXqteV16bXkNeV16ouXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIteU16rXldem15DXldeqINeg16nXnteo15Ug15HXlNem15zXl9eUIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwi16DXodeUINep15XXkVwiLFxuICB0aW1lck1pbjogXCLXk9en15RcIixcbiAgdGltZXJTZWM6IFwi16nXoNeZ15XXqlwiLFxuICB0aW1lclNwZW50QWxsOiBcIteU15XXpteQ16ogezB9INeR15PXoyDXlteUINeV15HXodeaINeU15vXnCB7MX0uXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIteU15XXpteQ16ogezB9INeR15PXoyDXlteULlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIteU15XXpteQ16og16HXm9eV150g15vXldec15wg16nXnCB7MH0uXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCLXlNeV16bXkNeqIHswfSDXnteq15XXmiB7MX0g15HXk9ejINeW15Qg15UtIHsyfSDXnteq15XXmiB7M30g15HXodeaINeU15vXnC5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwi15TXldem15DXqiB7MH0g157XqteV15ogezF9INeR15PXoyDXlteULlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIteU15XXpteQ16og16HXm9eV150g15vXldec15wg16nXnCB7MH0g157XqteV15ogezF9LlwiLFxuICBjbGVhbkNhcHRpb246IFwi15zWsNeg1rfXp9eV1rnXqlwiLFxuICBjbGVhckNhcHRpb246IFwi15HXqNeV16hcIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwi15HXl9eoINen15XXkdelXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIteU16HXqCDXp9eV15HXpSDXlteUXCIsXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwi15vXn1wiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwi15zXkFwiLFxuICBjb25maXJtUmVtb3ZlRmlsZTogXCLXlNeQ150g15DXqteUINeR15jXldeXINep15HXqNem15XXoNeaINec15TXodeZ16gg16fXldeR16Ug15bXlDogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwi15TXkNedINeQ16rXlCDXkdeY15XXlyDXqdeR16jXpteV16DXmiDXnNeU16HXmdeoINeQ16og15vXnCDXlNen15HXpteZ150/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCLXm9eV16rXqNeqINep15DXnNeUXCIsXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImhlXCJdID0gaGVicmV3U3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImhlXCJdID0gXCLXoteR16jXmdeqXCI7XG4iLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGhpbmRpU3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIuCkquCkv+Ckm+CksuCkvlwiLFxuICBwYWdlTmV4dFRleHQ6IFwi4KSF4KSX4KSy4KS+XCIsXG4gIGNvbXBsZXRlVGV4dDogXCLgpKrgpYLgpLDgpL5cIixcbiAgcHJldmlld1RleHQ6IFwi4KSq4KWC4KSw4KWN4KS14KS44KSu4KWA4KSV4KWN4KS34KS+XCIsXG4gIGVkaXRUZXh0OiBcIuCkuOCkguCkquCkvuCkpuCkv+CkpFwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwi4KS24KWB4KSw4KWCXCIsXG4gIG90aGVySXRlbVRleHQ6IFwi4KSm4KWC4KS44KSw4KS+ICjgpLXgpLDgpY3gpKPgpKgg4KSV4KSw4KWH4KSCKVwiLFxuICBub25lSXRlbVRleDogXCLgpJXgpYvgpIgg4KSo4KS54KWA4KSCXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIuCkuOCkreClgCDgpJXgpL4g4KSa4KSv4KSoIOCkleCksOClh+CkglwiLFxuICBwcm9ncmVzc1RleHQ6IFwi4KSq4KWD4KS34KWN4KSgIDEg4KSu4KWH4KSCIOCkuOClhyAwXCIsXG4gIHBhbmVsRHluYW1pY1Byb2dyZXNzVGV4dDogXCIg4KSm4KS44KWN4KSk4KS+4KS14KWH4KScIHsxfSDgpJXgpYcgezB9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCJ7MX0g4KS44KS14KS+4KSy4KWL4KSCIOCkruClh+CkgiDgpLjgpYcgezB9IOCkleClhyDgpJzgpLXgpL7gpKwg4KSm4KS/4KSPXCIsXG4gIGVtcHR5U3VydmV5OiBcIuCkuOCksOCljeCkteClh+CkleCljeCkt+CkoyDgpK7gpYfgpIIg4KSV4KWL4KSIIOCkpuClg+CktuCljeCkr+CkruCkvuCkqCDgpKrgpYPgpLfgpY3gpKAg4KSv4KS+IOCkquCljeCksOCktuCljeCkqCDgpKjgpLngpYDgpIIg4KS54KWIXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwi4KS44KSw4KWN4KS14KWH4KSV4KWN4KS34KSjIOCkleCliyDgpKrgpYLgpLDgpL4g4KSV4KSw4KSo4KWHIOCkleClhyDgpLLgpL/gpI8g4KSn4KSo4KWN4KSv4KS14KS+4KSmXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6IFwiIOCkueCkruCkvuCksOClhyDgpLDgpL/gpJXgpYngpLDgpY3gpKEg4KSs4KSk4KS+4KSk4KWHIOCkueCliOCkgiDgpJXgpL8g4KSG4KSqIOCkquCkueCksuClhyDgpLngpYAg4KSH4KS4IOCkuOCksOCljeCkteClh+CkleCljeCkt+CkoyDgpJXgpYsg4KSq4KWC4KSw4KS+IOCkleCksCDgpJrgpYHgpJXgpYcg4KS54KWI4KSCXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwi4KS44KSw4KWN4KS14KWH4KSV4KWN4KS34KSjIOCkluClgeCksiDgpLDgpLngpL4g4KS54KWILuKAplwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCLgpJrgpYHgpKjgpYfgpIJcIixcbiAgdmFsdWU6IFwi4KSu4KWC4KSy4KWN4KSvXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwi4KSV4KWD4KSq4KSv4KS+IOCkquCljeCksOCktuCljeCkqCDgpJXgpL4g4KSJ4KSk4KWN4KSk4KSwIOCkpuClh+CkglwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCLgpJXgpYPgpKrgpK/gpL4g4KSV4KSuIOCkuOClhyDgpJXgpK4g4KSP4KSVIOCkquCljeCksOCktuCljeCkqCDgpJXgpL4g4KSJ4KSk4KWN4KSk4KSwIOCkpuClh+CkglwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIuCkleClg+CkquCkr+CkviDgpLjgpK3gpYAg4KSq4KSC4KSV4KWN4KSk4KS/4KSv4KWL4KSCIOCkruClh+CkgiDgpLjgpLXgpL7gpLLgpYvgpIIg4KSV4KWHIOCknOCkteCkvuCkrCDgpKbgpYfgpIJcIixcbiAgbnVtZXJpY0Vycm9yOiBcIuCkruClguCksuCljeCkryDgpLjgpILgpJbgpY3gpK/gpL7gpKTgpY3gpK7gpJUg4KS54KWL4KSo4KS+IOCkmuCkvuCkueCkv+Ckj1wiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIuCkleClg+CkquCkr+CkviDgpJXgpK4g4KS44KWHIOCkleCkriB7MH0g4KS14KSw4KWN4KSjIOCkpuCksOCljeCknCDgpJXgpLDgpYfgpIJcIixcbiAgdGV4dE1heExlbmd0aDogXCLgpJXgpYPgpKrgpK/gpL4gezB9IOCkuOClhyDgpJXgpK4g4KS14KSw4KWN4KSjIOCkpuCksOCljeCknCDgpJXgpLDgpYfgpIJcIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCLgpJXgpYPgpKrgpK/gpL4gezB9IOCkuOClhyDgpIXgpKfgpL/gpJUg4KSU4KSwIHsxfSDgpLjgpYcg4KSV4KSuIOCkquCkvuCkpOCljeCksOCli+CkgiDgpK7gpYfgpIIg4KSq4KWN4KSw4KS14KWH4KS2IOCkleCksOClh+CkglwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIuCkleClg+CkquCkr+CkviDgpJXgpK4g4KS44KWHIOCkleCkriB7MH0g4KSq4KSC4KSV4KWN4KSk4KS/4KSv4KWL4KSCIOCkleCliyDgpK3gpLDgpYfgpIJcIixcbiAgbWluU2VsZWN0RXJyb3I6IFwi4KSV4KWD4KSq4KSv4KS+IOCkleCkriDgpLjgpYcg4KSV4KSuIHswfSDgpLXgpL/gpJXgpLLgpY3gpKog4KSV4KS+IOCkmuCkr+CkqCDgpJXgpLDgpYfgpIJcIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwi4KSV4KWD4KSq4KSv4KS+IHswfSDgpLXgpL/gpJXgpLLgpY3gpKrgpYvgpIIg4KS44KWHIOCkheCkp+Ckv+CklSDgpKjgpLngpYDgpIIg4KSa4KWB4KSo4KWH4KSCXCIsXG4gIG51bWVyaWNNaW5NYXg6IFwiJ3swfScgezF9IOCkuOClhyDgpKzgpLDgpL7gpKzgpLAg4KSv4KS+IOCkheCkp+Ckv+CklSDgpJTgpLAgezJ9IOCkuOClhyDgpKzgpLDgpL7gpKzgpLAg4KSv4KS+IOCkleCkriDgpLngpYvgpKjgpL4g4KSa4KS+4KS54KS/4KSPXCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScgezF9IOCkuOClhyDgpKzgpLDgpL7gpKzgpLAg4KSv4KS+IOCkheCkp+Ckv+CklSDgpLngpYvgpKjgpL4g4KSa4KS+4KS54KS/4KSPXCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScgezF9IOCkuOClhyDgpKzgpLDgpL7gpKzgpLAg4KSv4KS+IOCkleCkriDgpLngpYvgpKjgpL4g4KSa4KS+4KS54KS/4KSPXCIsXG4gIGludmFsaWRFbWFpbDogXCLgpJXgpYPgpKrgpK/gpL4g4KSP4KSVIOCkteCliOCkpyDgpIjgpK7gpYfgpLIg4KSq4KSk4KS+IOCkpuCksOCljeCknCDgpJXgpLDgpYfgpIJcIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwi4KSF4KSt4KS/4KS14KWN4KSv4KSV4KWN4KSk4KS/OiB7MH0g4KSV4KWLICcg4KS44KSaICcg4KSy4KWM4KSf4KSo4KS+IOCkmuCkvuCkueCkv+Ckj1wiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwi4KSF4KSo4KWB4KSw4KWL4KSnIOCksuCljOCkn+CkvuCkr+CkviDgpKTgpY3gpLDgpYHgpJ/gpL8gJ3swfScgLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOiBcIuCkheCkqOClgeCksOCli+CkpyDgpKjgpYcg4KSW4KS+4KSy4KWAIOCkoeClh+Ckn+CkviDgpLXgpL7gpKrgpLgg4KSV4KSwIOCkpuCkv+Ckr+CkviDgpLngpYggXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwi4KSr4KS84KS+4KSH4KSyIOCkleCkviDgpIbgpJXgpL7gpLAgezB9IOCkuOClhyDgpIXgpKfgpL/gpJUg4KSo4KS54KWA4KSCIOCkueCli+CkqOCkviDgpJrgpL7gpLngpL/gpI8gIOCkr+CkviDgpKvgpL/gpLAgJ+CkquCkvuCkpScg4KSq4KWN4KSw4KWJ4KSq4KSw4KWN4KSf4KWAIOCkl+CksuCkpCDgpLngpYhcIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIuCkleClg+CkquCkr+CkviDgpKbgpYLgpLjgpLDgpL4g4KSu4KWC4KSy4KWN4KSvIOCkpuCksOCljeCknCDgpJXgpLDgpYfgpIJcIixcbiAgdXBsb2FkaW5nRmlsZTogXCLgpIbgpKrgpJXgpYAg4KSr4KS+4KSH4KSyIOCkheCkquCksuCli+CkoSDgpLngpYsg4KSw4KS54KWAIOCkueCliOClpCDgpJXgpYPgpKrgpK/gpL4g4KSV4KSIIOCkuOClh+CkleCkguCkoSDgpIfgpILgpKTgpJzgpL7gpLAg4KSV4KSw4KWH4KSCIOCklOCksCDgpKvgpL/gpLAg4KS44KWHIOCkquCljeCksOCkr+CkvuCkuCDgpJXgpLDgpYfgpILgpaRcIixcbiAgbG9hZGluZ0ZpbGU6IFwi4KSy4KWL4KSh4KS/4KSC4KSXXCIsXG4gIGNob29zZUZpbGU6IFwi4KSr4KS84KS+4KSH4KSyIOCkmuClgeCkqOClh+CkglwiLFxuICBub0ZpbGVDaG9zZW46IFwi4KSV4KWL4KSIIOCkq+CkvuCkh+CksiDgpKjgpLngpYDgpIIg4KSa4KWB4KSo4KWAIOCkl+CkiFwiLFxuICBjb25maXJtRGVsZXRlOiBcIuCkleCljeCkr+CkviDgpIbgpKog4KSw4KS/4KSV4KWJ4KSw4KWN4KShIOCkueCkn+CkvuCkqOCkviDgpJrgpL7gpLngpKTgpYcg4KS54KWI4KSCXCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwi4KSv4KS5IOCkruCkvuCkqCDgpIXgpKjgpYvgpJbgpL4g4KS54KWL4KSo4KS+IOCkmuCkvuCkueCkv+Ckj1wiLFxuICBhZGRDb2x1bW46IFwi4KSV4KWJ4KSy4KSuIOCknOCli+CkoeCkvOClh+CkglwiLFxuICBhZGRSb3c6IFwi4KSq4KSC4KSV4KWN4KSk4KS/IOCknOCli+CkoeCkvOClh+CkglwiLFxuICByZW1vdmVSb3c6IFwi4KS54KSf4KS+4KSPXCIsXG4gIGFkZFBhbmVsOiBcIuCkqOCkr+CkviDgpJzgpYvgpKHgpLzgpYfgpIJcIixcbiAgcmVtb3ZlUGFuZWw6IFwi4KS54KSf4KS+4KSPXCIsXG4gIGNob2ljZXNfSXRlbTogXCLgpK7gpKZcIixcbiAgbWF0cml4X2NvbHVtbjogXCLgpJXgpYngpLLgpK5cIixcbiAgbWF0cml4X3JvdzogXCLgpKrgpILgpJXgpY3gpKTgpL9cIixcbiAgc2F2aW5nRGF0YTogXCLgpKrgpLDgpL/gpKPgpL7gpK4g4KS44KSw4KWN4KS14KSwIOCkquCksCDgpLjgpYfgpLUg4KS54KWLIOCksOCkueClhyDgpLngpYjgpIJcIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIuCkj+CklSDgpKTgpY3gpLDgpYHgpJ/gpL8g4KS54KWB4KSIIOCklOCksCDgpLngpK4g4KSq4KSw4KS/4KSj4KS+4KSu4KWL4KSCIOCkleCliyDgpKjgpLngpYDgpIIg4KS44KWH4KS1IOCkleCksCDgpLjgpJXgpYdcIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwi4KSq4KSw4KS/4KSj4KS+4KSuIOCkuOCkq+CksuCkpOCkvuCkquClguCksOCljeCkteCklSDgpLjgpYfgpLUg4KS54KWLIOCkl+Ckj1wiLFxuICBzYXZlQWdhaW5CdXR0b246IFwi4KSr4KS/4KSwIOCkleCli+CktuCkv+CktiDgpJXgpLDgpYtcIixcbiAgdGltZXJNaW46IFwi4KSu4KS/4KSo4KSfXCIsXG4gIHRpbWVyU2VjOiBcIuCkuOClh+CkleCkguCkoVwiLFxuICB0aW1lclNwZW50QWxsOiBcIuCkhuCkquCkqOClhyDgpIfgpLgg4KSq4KWD4KS34KWN4KSgIOCkquCksCB7MH0g4KSW4KSw4KWN4KSaIOCkleCkv+CkjyDgpLngpYjgpIIg4KSU4KSwIOCkleClgeCksiB7MX1cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwi4KSG4KSq4KSo4KWHIOCkh+CkuCDgpKrgpYPgpLfgpY3gpKAg4KSq4KSwIHswfSDgpJbgpLDgpY3gpJog4KSV4KS/4KSv4KS+IOCkueCliFwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIuCkhuCkquCkqOClhyDgpJXgpYHgpLIgezB9IOCkluCksOCljeCkmiDgpJXgpL/gpK/gpL4g4KS54KWIXCIsXG4gIHRpbWVyTGltaXRBbGw6IFwi4KSG4KSq4KSo4KWHIOCkh+CkuCDgpKrgpYPgpLfgpY3gpKAg4KSq4KSwIHsxfSDgpJXgpYAgezB9IOCklOCksCDgpJXgpYHgpLIgezN9IOCkleClgCB7Mn0g4KSW4KSw4KWN4KSaIOCkleClgCDgpLngpYjgpaRcIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwi4KSG4KSq4KSo4KWHIOCkh+CkuCDgpKrgpYPgpLfgpY3gpKAg4KSq4KSwIHsxfSDgpJXgpL4gezB9IOCkluCksOCljeCkmiDgpJXgpL/gpK/gpL4g4KS54KWIXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwi4KSG4KSq4KSo4KWHIOCkleClgeCksiB7MX0g4KSV4KWAIHswfSDgpJbgpLDgpY3gpJog4KSV4KWAIOCkueCliFwiLFxuICBjbGVhbkNhcHRpb246IFwi4KS44KS+4KSrXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCLgpLjgpY3gpKrgpLfgpY3gpJ9cIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwi4KSr4KS84KS+4KSH4KSyIOCkmuClgeCkqOClh+CkglwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCLgpIfgpLgg4KSr4KS+4KSH4KSyIOCkleCliyDgpKjgpL/gpJXgpL7gpLLgpYfgpIJcIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCLgpLngpL7gpIFcIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcIuCkqOCkueClgOCkglwiLFxuICBjb25maXJtUmVtb3ZlRmlsZTogXCLgpJXgpY3gpK/gpL4g4KSG4KSqIOCkuOClgeCkqOCkv+CktuCljeCkmuCkv+CkpCDgpLngpYjgpIIg4KSV4KS/IOCkhuCkqiDgpIfgpLgg4KSr4KS84KS+4KSH4KSyIOCkleCliyDgpLngpJ/gpL7gpKjgpL4g4KSa4KS+4KS54KSk4KWHIOCkueCliOCkgjogezB9XCIsXG4gIGNvbmZpcm1SZW1vdmVBbGxGaWxlczogXCLgpJXgpY3gpK/gpL4g4KSG4KSqIOCkuOClgeCkqOCkv+CktuCljeCkmuCkv+CkpCDgpLngpYjgpIIg4KSV4KS/IOCkhuCkqiDgpLjgpK3gpYAg4KSr4KS84KS+4KSH4KSy4KWL4KSCIOCkleCliyDgpLngpJ/gpL7gpKjgpL4g4KSa4KS+4KS54KSk4KWHIOCkueCliOCkglwiLFxuICBxdWVzdGlvblRpdGxlUGF0dGVyblRleHQ6IFwi4KSq4KWN4KSw4KS24KWN4KSoIOCkleCkviDgpLbgpYDgpLDgpY3gpLfgpJVcIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiaGlcIl0gPSBoaW5kaVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJoaVwiXSA9IFwiaGluZGlcIjtcbiIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgaHVuZ2FyaWFuU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIlZpc3N6YVwiLFxuICBwYWdlTmV4dFRleHQ6IFwiVG92w6FiYlwiLFxuICBjb21wbGV0ZVRleHQ6IFwiS8Opc3pcIixcbiAgcHJldmlld1RleHQ6IFwiRWzFkW7DqXpldFwiLFxuICBlZGl0VGV4dDogXCJTemVya2VzenTDqXNcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIlJhanRcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJFZ3nDqWIgKGFkamEgbWVnKVwiLFxuICBub25lSXRlbVRleHQ6IFwiRWd5aWsgc2VtXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIk1pbmRldCBraXbDoWxhc3p0XCIsXG4gIHByb2dyZXNzVGV4dDogXCJ7MH0uL3sxfSBvbGRhbFwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwiezB9IC8gezF9IHJla29yZFwiLFxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwiVsOhbGFzem9sdCBrw6lyZMOpc2VrOiB7MH0gLyB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwiVGhlcmUgaXMgbm8gdmlzaWJsZSBwYWdlIG9yIHF1ZXN0aW9uIGluIHRoZSBzdXJ2ZXkuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiS8O2c3rDtm5qw7xrLCBob2d5IGtpdMO2bHTDtnR0ZSBmZWxtw6lyw6lzw7xua2V0IVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOiBcIk3DoXIga2l0w7ZsdMO2dHRlIGEgZmVsbcOpcsOpc3QuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiRmVsbcOpcsOpcyBiZXTDtmx0w6lzZS4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJWw6FsYXNzem9uLi4uXCIsXG4gIHZhbHVlOiBcIsOpcnTDqWtcIixcbiAgcmVxdWlyZWRFcnJvcjogXCJLw6lyasO8aywgdsOhbGFzem9samEgbWVnIGV6dCBhIGvDqXJkw6lzdCFcIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwiS8OpcmrDvGssIHbDoWxhc3pvbGpvbiBsZWdhbMOhYmIgZWd5IGvDqXJkw6lzcmUuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiS8OpcmrDvGsgYWRqb24gdsOhbGFzenQgbWluZGVuIHNvcmJhbiFcIixcbiAgbnVtZXJpY0Vycm9yOiBcIkF6IMOpcnTDqWsgc3rDoW0ga2VsbCwgaG9neSBsZWd5ZW4hXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiQWRqb24gbWVnIGxlZ2Fsw6FiYiB7MH0ga2FyYWt0ZXJ0IVwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIkxlZ2ZlbGplYmIgezB9IGthcmFrdGVydCBhZGpvbiBtZWchXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiQWRqb24gbWVnIGxlZ2Fsw6FiYiB7MH0sIGRlIGxlZ2ZlbGplYmIgezF9IGthcmFrdGVydCFcIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJUw7ZsdHPDtm4ga2kgbWluaW11bSB7MH0gc29ydCFcIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiVsOhbGFzc3pvbiBraSBsZWdhbMOhYmIgezB9IGxlaGV0xZFzw6lnZXQhXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIk5lIHbDoWxhc3N6b24gdMO2YmJldCwgbWludCB7MH0gbGVoZXTFkXPDqWchXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCInezB9JyBsZWd5ZW4gbmFneW9iYiwgdmFneSBlZ3llbmzFkSwgbWludCB7MX0gw6lzIGtpc2ViYiwgdmFneSBlZ3llbmzFkSwgbWludCB7Mn0hXCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScgbGVneWVuIGxlZ2Fsw6FiYiB7MX0hXCIsXG4gIG51bWVyaWNNYXg6IFwiVGhlICd7MH0nIG5lIGxlZ3llbiBuYWd5b2JiLCBtaW50IHsxfSFcIixcbiAgaW52YWxpZEVtYWlsOiBcIkFkam9uIG1lZyBlZ3kgdmFsw7NzIGVtYWlsIGPDrW1ldCFcIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwiQSBrw7Z2ZXRrZXrFkSBraWZlamV6w6lzOiB7MH0gdmlzc3phIGtlbGwgYWRuaWEgYXog4oCeaWdheuKAnSDDqXJ0w6lrZXQuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCJBIGxla8OpcmRlesOpcyBoaWLDoXZhbCB0w6lydCB2aXNzemE6ICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwiQSBsZWvDqXJkZXrDqXMgw7xyZXMgYWRhdHRhbCB0w6lydCB2aXNzemEsIHZhZ3kgYSAncGF0aCcgcGFyYW3DqXRlciBoZWx5dGVsZW4uXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiQSBtw6lyZXQgbmVtIGxlaGV0IG5hZ3lvYmIsIG1pbnQgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiQWRqYSBtZWcgYXogZWd5w6liIMOpcnTDqWtldCFcIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIkZlbHTDtmx0w6lzIGZvbHlhbWF0YmFuLiBWw6Fyam9uIHDDoXIgbcOhc29kcGVyY2V0LCBtYWpkIHByw7Niw6FsamEgw7pqcmEuXCIsXG4gIGxvYWRpbmdGaWxlOiBcIkJldMO2bHTDqXMuLi5cIixcbiAgY2hvb3NlRmlsZTogXCJGw6FqbG9rIGtpdsOhbGFzenTDoXNhIC4uLlwiLFxuICBub0ZpbGVDaG9zZW46IFwiTmluY3Mga2l2w6FsYXN6dHZhIGbDoWpsXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiVMO2cmxpIGV6dCBhIHJla29yZG90P1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIkF6IMOpcnTDqWtuZWsgZWd5ZWRpbmVrIGtlbGwgbGVubmllLlwiLFxuICBhZGRDb2x1bW46IFwiT3N6bG9wIGhvenrDoWFkw6FzYVwiLFxuICBhZGRSb3c6IFwiU29yIGhvenrDoWFkw6FzYVwiLFxuICByZW1vdmVSb3c6IFwiRWx0w6F2b2zDrXTDoXNcIixcbiAgYWRkUGFuZWw6IFwiw5pqIGhvenrDoWFkw6FzYVwiLFxuICByZW1vdmVQYW5lbDogXCJFbHTDoXZvbMOtdMOhc1wiLFxuICBjaG9pY2VzX0l0ZW06IFwiZWxlbVwiLFxuICBtYXRyaXhfY29sdW1uOiBcIk9zemxvcFwiLFxuICBtYXRyaXhfcm93OiBcIlNvclwiLFxuICBzYXZpbmdEYXRhOiBcIkVyZWRtw6lueSBtZW50w6lzZSBhIHN6ZXJ2ZXJyZS4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiRWd5IGhpYmEgZm9seXTDoW4gbmVtIHR1ZHR1ayBlbG1lbnRlbmkgYXogZXJlZG3DqW55dC5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiRXJlZG3DqW55IHNpa2VyZXNlbiBtZW50dmUhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJQcsOzYsOhbGphIMO6anJhXCIsXG4gIHRpbWVyTWluOiBcIm1pblwiLFxuICB0aW1lclNlYzogXCJzZWNcIixcbiAgdGltZXJTcGVudEFsbDogXCLDlm4gezB9IMO2c3N6ZWdldCBrw7ZsdMO2dHQgZXplbiBheiBvbGRhbG9uLCDDqXMgw7Zzc3plc2VuIHsxfS5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiezB9IMO2c3N6ZWdldCBrw7ZsdMO2dHQgZXplbiBheiBvbGRhbG9uLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIsOWc3N6ZXNlbiB7MH0ga8O2bHTDtnR0LlwiLFxuICB0aW1lckxpbWl0QWxsOlxuICAgIFwiw5ZuIHswfSAvIHsxfSDDtnNzemVnZXQga8O2bHTDtnR0IGV6ZW4gYXogb2xkYWxvbiwgw6lzIMO2c3N6ZXNlbiB7Mn0gLyB7M30uXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIsOWbiB7MH0gLyB7MX0gw7Zzc3plZ2V0IGvDtmx0w7Z0dCBlemVuIGF6IG9sZGFsb24uXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiw5Zzc3plc2VuIHswfSAvIHsxfSDDtnNzemVnZXQga8O2bHTDtnR0IGVsLlwiLFxuICBjbGVhbkNhcHRpb246IFwiVGlzenRhXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJFZ3nDqXJ0ZWxtxbFcIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwiVsOhbGFzc3ogZsOhamx0XCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIlTDoXZvbMOtdHNhIGVsIGV6dCBhIGbDoWpsdFwiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIklnZW5cIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcIk5lbVwiLFxuICBjb25maXJtUmVtb3ZlRmlsZTogXCJCaXp0b3NhbiBlbHTDoXZvbMOtdGphIGV6dCBhIGbDoWpsdDogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwiQml6dG9zYW4gZWwgYWthcmphIHTDoXZvbMOtdGFuaSBheiDDtnNzemVzIGbDoWpsdD9cIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcIkvDqXJkw6lzIGPDrW1lXCIsXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImh1XCJdID0gaHVuZ2FyaWFuU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImh1XCJdID0gXCJtYWd5YXJcIjtcbiIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgaWNlbGFuZGljU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIlRpbGJha2FcIixcbiAgcGFnZU5leHRUZXh0OiBcIsOBZnJhbVwiLFxuICBjb21wbGV0ZVRleHQ6IFwiTG9racOwXCIsXG4gIHByZXZpZXdUZXh0OiBcIkZvcnNrb8OwYVwiLFxuICBlZGl0VGV4dDogXCJCcmV5dGFcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIkJ5cmphw7B1XCIsXG4gIG90aGVySXRlbVRleHQ6IFwiSGlubiAoc2vDvXJpbmcpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCJFbmdpbm5cIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwiVmVsamEgYWxsdFwiLFxuICBwcm9ncmVzc1RleHQ6IFwiU8Otw7BhIHswfSBvZiB7MX1cIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcIlRha2EgdXBwIHswfSBhZiB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcIlN2YXJhw7AgezB9IC8gezF9IHNwdXJuaW5ndW1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwiw55hw7AgZXIgZW5naW5uIHPDrcOwYSBlw7BhIHNwdXJuaW5nYXIgw60gw75lc3Nhcmkga8O2bm51bi5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJUYWtrIGZ5cmlyIGHDsCBmeWxsamEgw7p0IMO+ZXNzYSBrw7ZubnVuIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiU2tyw6FyIG9ra2FyIHPDvW5hIGHDsCDDvsO6IGhlZnVyIMO+ZWdhciBsb2tpw7Agw75lc3Nhcmkga8O2bm51bi5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJLw7ZubnVuaW4gZXIgYcOwIGhsYcOwYS4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJWZWxkdS4uLlwiLFxuICB2YWx1ZTogXCJnaWxkaVwiLFxuICByZXF1aXJlZEVycm9yOiBcIlZpbnNhbWxlZ2FzdCBzdmFyacOwIHNwdXJuaW5ndW5uaS5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwiVmluc2FtbGVnYXN0IHN2YXJhw7B1IGHDsCBtaW5uc3RhIGtvc3RpIGVpbm5pIHNwdXJuaW5ndS5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJWaW5zYW1sZWdhc3Qgc3ZhcmnDsCBzcHVybmluZ3VtIMOtIMO2bGx1bSByw7bDsHVtLlwiLFxuICBudW1lcmljRXJyb3I6IFwiw55ldHRhIGdpbGRpIHZlcsOwdXIgYcOwIHZlcmEgdGFsYS5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCLDnmHDsCDDpnR0aSBhw7AgdmVyYSBtaW5uc3QgezB9IHTDoWtuLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIsOeYcOwIMOmdHRpIGHDsCB2ZXJhIG1lc3QgezB9IHTDoWtuLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIsOeYcOwIMOmdHRpIGHDsCB2ZXJhIGZsZWlyaSBlbiB7MH0gb2cgZsOmcnJpIGVuIHsxfSB0w6Frbi5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJWaW5zYW1sZWdhc3QgZnlsbGnDsCDDunIgYcOwIG1pbm5zdGEga29zdGkgezB9IHJhw7Bpci5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiVmluc2FtbGVnYXN0IHZlbGppw7AgYcOwIG1pbm5zdGEga29zdGkgezB9IG3Dtmd1bGVpa2EuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIlZpbnNhbWxlZ2FzdCB2ZWxqacOwIGVra2kgZmxlaXJpIGVuIHswfSBtw7ZndWxlaWthLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScgw6Z0dGkgYcOwIHZlcmEgbWVpcmEgZW4gZcOwYSBqYWZudCBvZyB7MX0gbWlubmEgZW4gZcOwYSBqYWZudCBvZyB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCJ7MH0nIMOmdHRpIGHDsCB2ZXJhIG1laXJhIGVuIGXDsGEgamFmbnQgb2cgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScgw6Z0dGkgYcOwIHZlcmEgbWlubmEgZW4gZcOwYSBqYWZudCBvZyB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIlZpbnNhbWxlZ2FzdCBzbMOhacOwIGlubiBnaWx0IG5ldGZhbmcuXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIlRqw6FuaW5naW46IHswfSDDpnR0aSBhw7Agc2tpbGEgJ3NhdHQnLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiQmVpw7BuaW5uIHNraWxhw7BpIGVmdGlyZmFyYW5hZGkgdmlsbHUgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6IFwiQmVpw7BuaW5uZyBza2lsYcOwaSBlbmd1bSBnw7ZnbnVtIGXDsGEgc2zDs8OwaW5uIHZhciByw7ZuZ1wiLFxuICBleGNlZWRNYXhTaXplOiBcIlNrcsOhaW5uIHNrYWwgZWtraSB2ZXJhIHN0w6ZycmkgZW4gezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiVmluYW1sZWdhc3QgZnlsbGnDsCDDunQgaGl0dCBnaWxkacOwLlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiU2tyw6Fpbm4gw77DrW4gdmFyIHNlbmQuIFZpbnNhbWxlZ2FzdCBiw63DsGnDsCDDrSBub2trcmFyIHNla8O6bmR1ciBvZyByZXluacOwIGFmdHVyLlwiLFxuICBsb2FkaW5nRmlsZTogXCJIbGXDsHVyIC4uLlwiLFxuICBjaG9vc2VGaWxlOiBcIlZlbGR1IHNrcsOhciAuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcIkVuZ2luIHNrcsOhIHZhbGluXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiVmlsdHUgZXnDsGEgc2tyw6Fubmk/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwiw55ldHRhIGdpbGRpIMOmdHRpIGHDsCB2ZXJhIGVpbnN0YWt0LlwiLFxuICBhZGRDb2x1bW46IFwiQsOmdGEgdmnDsCBkw6Fsa2lcIixcbiAgYWRkUm93OiBcIkLDpnRhIHZpw7AgcsO2w7BcIixcbiAgcmVtb3ZlUm93OiBcIkZqYXJsw6ZnamFcIixcbiAgYWRkUGFuZWw6IFwiQsOmdGEgdmnDsCBuw71qdVwiLFxuICByZW1vdmVQYW5lbDogXCJGamFybMOmZ8OwdVwiLFxuICBjaG9pY2VzX0l0ZW06IFwiaGx1dHVyXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiRMOhbGt1clwiLFxuICBtYXRyaXhfcm93OiBcIlLDtsOwXCIsXG5cbiAgc2F2aW5nRGF0YTogXCJOacOwdXJzdMO2w7B1cm5hciBlcnUgYcOwIHNwYXJhIMOhIG5ldMO+asOzbmludW0gLi4uIFwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiVmlsbGEga29tIHVwcCBvZyB2acOwIGfDoXR1bSBla2tpIHZpc3Rhw7AgbmnDsHVyc3TDtsOwdXJuYXIuXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIsOBcmFuZ3VyaW5uIHZhciB2aXN0YcOwdXIgbWXDsCBnw7PDsHVtIMOhcmFuZ3JpIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiUmV5bmR1IGFmdHVyXCIsXG4gIHRpbWVyTWluOiBcIm3DrW5cIixcbiAgdGltZXJTZWM6IFwic2VrXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwiw57DuiBoZWZ1ciBleXR0IHswfSDDoSDDvmVzc2FyaSBzw63DsHUgb2cgezF9IHNhbXRhbHMuXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIsOew7ogaGVmdXIgZXl0dCB7MH0gw6Egw75lc3Nhcmkgc8Otw7B1LlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIsOew7ogaGVmdXIgZXl0dCB7MH0gc2FtdGFscy5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcIsOew7ogaGVmdXIgZXl0dCB7MH0gYWYgezF9IMOhIMO+ZXNzYXJpIHPDrcOwdSBvZyB7Mn0gYWYgezN9IHNhbXRhbHMuXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIsOew7ogaGVmdXIgZXl0dCB7MH0gYWYgezF9IMOhIMO+ZXNzYXJpIHPDrcOwdS5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCLDnsO6IGhlZnVyIGV5dHQgezB9IGFmIHsxfSBzYW10YWxzLlwiLFxuICBjbGVhbkNhcHRpb246IFwiSHJlaW50XCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJIcmVpbnNhXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcIlZlbGR1IHNrcsOhXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIkZqYXJsw6Znw7B1IMO+ZXNzYSBza3LDoVwiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIkrDoVwiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwiTmVpXCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcIkVydHUgdmlzcyB1bSBhw7Agw77DuiB2aWxqaXIgZmphcmzDpmdqYSDDvmVzc2Egc2tyw6E6IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIkVydHUgdmlzcyB1bSBhw7Agw77DuiB2aWxqaXIgZmphcmzDpmdqYSBhbGxhciBza3LDoXI/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCJTcHVybmluZ2FydGl0aWxsXCIsXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImlzXCJdID0gaWNlbGFuZGljU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImlzXCJdID0gXCLDrXNsZW5za2FcIjtcbiIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgaW5kb25lc2lhblN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJTZWJlbHVtbnlhXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJTZWxhbmp1dG55YVwiLFxuICBjb21wbGV0ZVRleHQ6IFwiU2VsZXNhaVwiLFxuICBwcmV2aWV3VGV4dDogXCJQcmF0aW5qYXVcIixcbiAgZWRpdFRleHQ6IFwiU3VudGluZ1wiLFxuICBzdGFydFN1cnZleVRleHQ6IFwiTXVsYWlcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJMYWlubnlhIChqZWxhc2thbilcIixcbiAgbm9uZUl0ZW1UZXh0OiBcIlRpZGFrIEFkYVwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCJQaWxpaCBTZW11YVwiLFxuICBwcm9ncmVzc1RleHQ6IFwiSGFsYW1hbiB7MH0gZGFyaSB7MX1cIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcIlJla2FtIHswfSBkYXJpIHsxfVwiLFxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwiTWVuamF3YWIgcGVydGFueWFhbiB7MH0gLyB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwiVGlkYWsgYWRhIGhhbGFtYW4gYXRhdSBwZXJ0YW55YWFuIGRhbGFtIHN1cnZlaS5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJUZXJpbWEga2FzaWggdGVsYWggbWVueWVsZXNhaWthbiBzdXJ2ZWkhXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgXCJDYXRhdGFuIGthbWkgbWVudW5qdWtrYW4gYmFod2EgQW5kYSB0ZWxhaCBtZW55ZWxlc2Fpa2FuIHN1cnZlaSBpbmkuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiTWVtdWF0IHN1cnZlaS4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJQaWxpaC4uLlwiLFxuICB2YWx1ZTogXCJuaWxhaVwiLFxuICByZXF1aXJlZEVycm9yOiBcIlNpbGFoa2FuIGphd2FiIHBlcnRhbnlhYW4gYmVyaWt1dC5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwiU2lsYWhrYW4gamF3YWIgc2V0aWRha255YSBzYXR1IHBldGFueWFhbi5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJTaWxhaGthbiBqYXdhYiBwZXJ0YW55YWFuIHBhZGEgc2VtdWEgYmFyaXMuXCIsXG4gIG51bWVyaWNFcnJvcjogXCJOaWxhaSBoYXJ1cyBiZXJ1cGEgYW5na2EuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiU2lsYWhrYW4gbWFzdWtrYW4gc2V0aWRha255YSB7MH0ga2FyYWt0ZXIuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiU2lsYWhrYW4gbWFzdWtrYW4ga3VyYW5nIHswfSBrYXJha3Rlci5cIixcbiAgdGV4dE1pbk1heExlbmd0aDpcbiAgICBcIlBTaWxhaGthbiBtYXN1a2thbiBsZWJpaCBkYXJpIHswfSBkYW4ga3VyYW5nIGRhcmkgezF9IGthcmFrdGVyLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIlNpbGFoa2FuIGlzaSBzZXRpZGFrbnlhIHswfSBiYXJpcy5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiU2lsYWhrYW4gcGlsaWggc2V0aWRha255YSB7MH0gdmFyaWFuLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJTaWxhaGthbiBwaWxpaCB0aWRhayBsZWJpaCBkYXJpIHswfSB2YXJpYW4uXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCInezB9JyBoYXJ1cyBzYW1hIGRlbmdhbiBhdGF1IGxlYmloIGRhcmkgezF9IGRhbiBoYXJ1cyBzYW1hIGRlbmdhbiBhdGF1IGt1cmFuZyBkYXJpIHsyfVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nIGhhcnVzIHNhbWEgZGVuZ2FuIGF0YXUgbGViaWggZGFyaSB7MX1cIixcbiAgbnVtZXJpY01heDogXCInezB9JyBoYXJ1cyBzYW1hIGRlbmdhbiBhdGF1IGt1cmFuZyBkYXJpIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiU2lsYWhrYW4gbWFzdWtrYW4gZS1tYWlsIHlhbmcgYmVuYXIuXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIkVrc3ByZXNpOiB7MH0gaGFydXMgbWVuZ2VtYmFsaWthbiAnYmVuYXInLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiUGVybWludGFhbiBtZW5nZW1iYWxpa2FuIGtlc2FsYWhhbiAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcIlBlcm1pbnRhYW4gbWVuZ2VtYmFsaWthbiBkYXRhIGtvc29uZyBhdGF1IHByb3BlcnRpICdwYXRoJyBzYWxhaC5cIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJVa3VyYW4gYmVya2FzIHRpZGFrIGJvbGVoIG1lbGViaWhpIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIlNpbGFoa2FuIG1hc3Vra2FuIG5pbGFpIGxhaW5ubnlhLlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiQmVya2FzIEFuZGEgc2VkYW5nIGRpdW5nZ2FoLiBTaWxhaGthbiB0dW5nZ3UgYmViZXJhcGEgc2FhdCBhdGF1IGNvYmEgbGFnaS5cIixcbiAgbG9hZGluZ0ZpbGU6IFwiTWVtdWF0Li4uXCIsXG4gIGNob29zZUZpbGU6IFwiUGlsaWggYmVya2FzLi4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCJUaWRhayBhZGEgZmlsZSB5YW5nIGRpcGlsaWhcIixcbiAgY29uZmlybURlbGV0ZTogXCJBcGFrYWggQW5kYSBpbmdpbiBtZW5naGFwdXMgY2F0YXRhbj9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJOaWxhaSBoYXJ1cyB1bmlrLlwiLFxuICBhZGRDb2x1bW46IFwiVGFtYmFoIGtvbG9tXCIsXG4gIGFkZFJvdzogXCJUYW1iYWggYmFyaXNcIixcbiAgcmVtb3ZlUm93OiBcIkhhcHVzXCIsXG4gIGFkZFBhbmVsOiBcIlRhbWJhaCBiYXJ1XCIsXG4gIHJlbW92ZVBhbmVsOiBcIkhhcHVzXCIsXG4gIGNob2ljZXNfSXRlbTogXCJpdGVtXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiS29sb21cIixcbiAgbWF0cml4X3JvdzogXCJCYXJpc1wiLFxuICBzYXZpbmdEYXRhOiBcIkhhc2lsIHNlZGFuZyBkaXNpbXBhbiBwYWRhIHNlcnZlci4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiS2VzYWxhaGFuIHRlcmphZGkgZGFuIGthbWkgdGlkYWsgZGFwYXQgbWVueWltcGFuIGhhc2lsLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJIYXNpbCB0ZWxhaCBzdWtzZXMgZGlzaW1wYW4hXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJDb2JhIGxhZ2lcIixcbiAgdGltZXJNaW46IFwibWVuaXRcIixcbiAgdGltZXJTZWM6IFwiZGV0aWtcIixcbiAgdGltZXJTcGVudEFsbDpcbiAgICBcIkFuZGEgdGVsYWggbWVuZ2hhYmlza2FuIHswfSBwYWRhIGhhbGFtYW4gaW5pIGRhbiB7MX0gc2VjYXJhIGtlc2VsdXJ1aGFuLlwiLFxuICB0aW1lclNwZW50UGFnZTogXCJZQW5kYSB0ZWxhaCBtZW5naGFiaXNrYW4gezB9IHBhZGEgaGFsYW1hbiBpbmkuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwiQW5kYSB0ZWxhaCBtZW5naGFiaXNrYW4gezB9IHNlY2FyYSBrZXNlbHVydWhhbi5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcIkFuZGEgdGVsYWggbWVuZ2hhYmlza2FuIHswfSBkYXJpIHsxfSBwYWRhIGhhbGFtYW4gaW5pIGRhbiB7Mn0gZGFyaSB7M30gc2VjYXJhIGtlc2VsdXJ1aGFuLlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCJBbmRhIHRlbGFoIG1lbmdoYWJpc2thbiB7MH0gZGFyaSB7MX0gcGFkYSBoYWxhbWFuIGluaS5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCJBbmRhIHRlbGFoIG1lbmdoYWJpc2thbiB7MH0gZGFyaSB7MX0gc2VjYXJhIGtlc2VsdXJ1aGFuLlwiLFxuICBjbGVhbkNhcHRpb246IFwiQmVyc2loa2FuXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJCZXJzaWhrYW5cIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwiUGlsaWggRmlsZVwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCJIYXB1cyBiZXJrYXMgaW5pXCIsXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwiSXlhXCIsXG4gIGJvb2xlYW5VbmNoZWNrZWRMYWJlbDogXCJUaWRha1wiLFxuICBjb25maXJtUmVtb3ZlRmlsZTogXCJBbmRhIHlha2luIGluZ2luIG1lbmdoYXB1cyBmaWxlIGluaTogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwiQW5kYSB5YWtpbiBpbmdpbiBtZW5naGFwdXMgc2VtdWEgZmlsZT9cIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcIkp1ZHVsIHBlcnRhbnlhYW5cIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiaWRcIl0gPSBpbmRvbmVzaWFuU3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImlkXCJdID0gXCJiYWhhc2EgSW5kb25lc2lhXCI7XG4iLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGl0YWxpYW5TdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiUHJlY2VkZW50ZVwiLFxuICBwYWdlTmV4dFRleHQ6IFwiU3VjY2Vzc2l2b1wiLFxuICBjb21wbGV0ZVRleHQ6IFwiU2FsdmFcIixcbiAgcHJldmlld1RleHQ6IFwiQW50ZXByaW1hXCIsXG4gIGVkaXRUZXh0OiBcIk1vZGlmaWNhXCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCJJbml6aW9cIixcbiAgb3RoZXJJdGVtVGV4dDogXCJBbHRybyAoZGVzY3JpdmkpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCJOZXNzdW5vXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIlNlbGV6aW9uYSB0dXR0aVwiLFxuICBwcm9ncmVzc1RleHQ6IFwiUGFnaW5hIHswfSBkaSB7MX1cIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcIlJlY29yZCBkaSB7MH0gZGkgezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCJSaXNwb3N0ZSBhIHswfS97MX0gZG9tYW5kZVwiLFxuICBlbXB0eVN1cnZleTogXCJOb24gY2kgc29ubyBwYWdpbmUgbyBkb21hbmRlIHZpc2liaWxpIG5lbCBxdWVzdGlvbmFyaW8uXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiR3JhemllIHBlciBhdmVyIGNvbXBsZXRhdG8gaWwgcXVlc3Rpb25hcmlvIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiSSBub3N0cmkgcmVjb3JkcyBtb3N0cmFubyBjaGUgaGFpIGdpw6AgY29tcGxldGF0byBxdWVzdG8gcXVlc3Rpb25hcmlvLlwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkNhcmljYW1lbnRvIGRlbCBxdWVzdGlvbmFyaW8gaW4gY29yc28uLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiU2NlZ2xpLi4uXCIsXG4gIHZhbHVlOiBcInZhbG9yZVwiLFxuICByZXF1aXJlZEVycm9yOiBcIkNhbXBvIG9iYmxpZ2F0b3Jpb1wiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJQZXIgRmF2b3JlLCByaXNwb25kaSBhZCBhbG1lbm8gdW5hIGRvbWFuZGEuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiQ29tcGxldGFyZSB0dXR0ZSBsZSByaWdoZVwiLFxuICBudW1lcmljRXJyb3I6IFwiSWwgdmFsb3JlIGRldmUgZXNzZXJlIG51bWVyaWNvXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiSW5zZXJpcmUgYWxtZW5vIHswfSBjYXJhdHRlcmlcIixcbiAgdGV4dE1heExlbmd0aDogXCJMdW5naGV6emEgbWFzc2ltYSBjb25zZW50aXRhIHswfSBjYXJhdHRlcmlcIixcbiAgdGV4dE1pbk1heExlbmd0aDpcbiAgICBcIkluc2VyaXJlIHVuYSBzdHJpbmdhIGNvbiBtaW5pbW8gezB9IGUgbWFzc2ltbyB7MX0gY2FyYXR0ZXJpXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiQ29tcGxldGFyZSBhbG1lbm8gezB9IHJpZ2hlLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJTZWxlemlvbmFyZSBhbG1lbm8gezB9IHZhcmlhbnRpLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJTZWxlemlvbmFyZSBtYXNzaW1vIHswfSB2YXJpYW50aS5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIid7MH0nIGRldmUgZXNzZXJlIHVndWFsZSBvIHN1cGVyaW9yZSBhIHsxfSBlIHVndWFsZSBvIGluZmVyaW9yZSBhIHsyfVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nIGRldmUgZXNzZXJlIHVndWFsZSBvIHN1cGVyaW9yZSBhIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIid7MH0nIGRldmUgZXNzZXJlIHVndWFsZSBvIGluZmVyaW9yZSBhIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiSW5zZXJpcmUgaW5kaXJpenpvIG1haWwgdmFsaWRvXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIkwnZXNwcmVzc2lvbmU6IHswfSBkb3ZyZWJiZSB0b3JuYXJlICd2ZXJvJy5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIkxhIHJpY2hpZXN0YSBoYSByaXNwb3N0byBjb24gdW4gZXJyb3JlICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwiTGEgcmljaGllc3RhIGhhIHJpc3Bvc3RvIG51bGwgb3BwdXJlIGlsIHBlcmNvcnNvIG5vbiDDqCBjb3JyZXR0b1wiLFxuICBleGNlZWRNYXhTaXplOiBcIklsIGZpbGUgbm9uIHB1w7IgZWNjZWRlcmUgezB9XCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJJbnNlcmlyZSBpbCB2YWxvcmUgJ2FsdHJvJ1wiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiRmlsZSBpbiBjYXJpY2FtZW50by4gQXR0ZW5kaSBhbGN1bmkgc2Vjb25kaSBlIHJpcHJvdmFcIixcbiAgbG9hZGluZ0ZpbGU6IFwiQ2FyaWNhbWVudG8uLi5cIixcbiAgY2hvb3NlRmlsZTogXCJTZWxlemlvbmFyZSBmaWxlKHMpLi4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCJOZXNzdW4gZmlsZSBzZWxlemlvbmF0b1wiLFxuICBjb25maXJtRGVsZXRlOiBcIlNlaSBzaWN1cm8gZGkgdm9sZXIgZWxtaW5hcmUgaWwgcmVjb3JkP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIlF1ZXN0byB2YWxvcmUgZGV2ZSBlc3NlcmUgdW5pdm9jby5cIixcbiAgYWRkQ29sdW1uOiBcIkFnZ2l1bmdpIGNvbG9ubmFcIixcbiAgYWRkUm93OiBcIkFnZ2l1bmdpIHJpZ2FcIixcbiAgcmVtb3ZlUm93OiBcIlJpbXVvdmkgcmlnYVwiLFxuICBhZGRQYW5lbDogXCJBZ2dpdW5naSByaWdhXCIsXG4gIHJlbW92ZVBhbmVsOiBcIkVsaW1pbmFcIixcbiAgY2hvaWNlc19JdGVtOiBcIkVsZW1lbnRvXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiQ29sb25uYVwiLFxuICBtYXRyaXhfcm93OiBcIlJpZ2FcIixcbiAgc2F2aW5nRGF0YTogXCJTYWx2YXRhZ2dpbyBkYXRpIHN1bCBzZXJ2ZXIuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIlNpIMOoIHZlcmlmaWNhdG8gdW4gZXJyb3JlIGUgbm9uIMOoIHN0YXRvIHBvc3NpYmlsZSBzYWx2YXJlIGkgcmlzdWx0YXRpLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJJIHJpc3VsdGF0aSBzb25vIHN0YXRpIHNhbHZhdGkgY29uIHN1Y2Nlc3NvIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiUmlwcm92YVwiLFxuICB0aW1lck1pbjogXCJtaW5cIixcbiAgdGltZXJTZWM6IFwic2VjXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwiSGFpIGltcGllZ2F0byB7MH0gc3UgcXVlc3RhIHBhZ2luYSBlIHsxfSBpbiB0b3RhbGUuXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIkhhaSBpbXBpZWdhdG8gezB9IHN1IHF1ZXN0YSBwYWdpbmEuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwiSGFpIGltcGllZ2F0byB7MH0gaW4gdG90YWxlLlwiLFxuICB0aW1lckxpbWl0QWxsOlxuICAgIFwiSGFpIGltcGllZ2F0byB7MH0gZGkgezF9IHN1IHF1ZXN0YSBwYWdpbmEgZSB7Mn0gZGkgezN9IGluIHRvdGFsZS5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiSGFpIGltcGllZ2F0byB7MH0gZGkgezF9IHN1IHF1ZXN0YSBwYWdpbmEuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiSGFpIGltcGllZ2F0byB7MH0gZGkgezF9IGluIHRvdGFsZS5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIlB1bGlzY2lcIixcbiAgY2xlYXJDYXB0aW9uOiBcIkNhbmNlbGxhXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcIlNjZWdsaWVyZSBpbCBmaWxlXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIlJpbXVvdmVyZSBxdWVzdG8gZmlsZVwiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIlPDrFwiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwiTm9cIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwiU2VpIHNpY3VybyBkaSB2b2xlciBlbG1pbmFyZSBxdWVzdG8gZmlsZTogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwiU2VpIHNpY3VybyBkaSB2b2xlciBlbG1pbmFyZSB0dXR0aSBpIGZpbGVzP1wiLFxuICBxdWVzdGlvblRpdGxlUGF0dGVyblRleHQ6IFwiVGl0b2xvIGRlbGxhIGRvbWFuZGFcIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiaXRcIl0gPSBpdGFsaWFuU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcIml0XCJdID0gXCJpdGFsaWFub1wiO1xuIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcclxuXHJcbmV4cG9ydCB2YXIgamFwYW5lc2VTdXJ2ZXlTdHJpbmdzID0ge1xyXG4gIHBhZ2VQcmV2VGV4dDogXCLliY3jgbhcIixcclxuICBwYWdlTmV4dFRleHQ6IFwi5qyh44G4XCIsXHJcbiAgY29tcGxldGVUZXh0OiBcIuWujOS6hlwiLFxyXG4gIHByZXZpZXdUZXh0OiBcIuODl+ODrOODk+ODpeODvFwiLFxyXG4gIGVkaXRUZXh0OiBcIue3qOmbhlwiLFxyXG4gIHN0YXJ0U3VydmV5VGV4dDogXCLjgrnjgr/jg7zjg4hcIixcclxuICBvdGhlckl0ZW1UZXh0OiBcIuOBneOBruS7lu+8iOiqrOaYju+8iVwiLFxyXG4gIG5vbmVJdGVtVGV4dDogXCLjgarjgZdcIixcclxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCLjgZnjgbnjgabpgbjmip5cIixcclxuICBwcm9ncmVzc1RleHQ6IFwiezB9L3sxfemggVwiLFxyXG4gIHBhbmVsRHluYW1pY1Byb2dyZXNzVGV4dDogXCJ7MX3jga57MH3jgpLoqJjpjLLjgZnjgotcIixcclxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwiezB9L3sxfeOBruizquWVj+OBq+WbnuetlOOBl+OBvuOBl+OBn+OAglwiLFxyXG4gIGVtcHR5U3VydmV5OiBcIuOBk+OBruiqv+afu+OBq+ihqOekuuOBp+OBjeOCi+ODmuODvOOCuOOChOizquWVj+OBr+OBguOCiuOBvuOBm+OCk1wiLFxyXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwi6Kq/5p+744KS5a6M5LqG44GX44Gm44GP44KM44Gm44GC44KK44GM44Go44GG44GU44GW44GE44G+44GX44GfXCIsXHJcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcclxuICAgIFwi5b2T56S+44Gu6KiY6Yyy44Gr44KI44KL44Go44CB44GT44Gu6Kq/5p+744Gv44GZ44Gn44Gr5a6M5LqG44GX44Gm44GE44G+44GZ44CCXCIsXHJcbiAgbG9hZGluZ1N1cnZleTogXCLoqr/mn7vjgpLjg4Djgqbjg7Pjg63jg7zjg4nkuK1cIixcclxuICBvcHRpb25zQ2FwdGlvbjogXCLpgbjmip5cIixcclxuICB2YWx1ZTogXCLlgKTmiZPjgaFcIixcclxuICByZXF1aXJlZEVycm9yOiBcIuizquWVj+OBq+OBiuetlOOBiOS4i+OBleOBhFwiLFxyXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIuacgOS9juOBp+OCgjHjgaTjga7os6rllY/jgavnrZTjgYjjgabjgY/jgaDjgZXjgYTjgIJcIixcclxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIuizquWVj+OBq+OBr+WFqOWIl+OBp+WbnuetlOOBl+OBpuOBj+OBoOOBleOBhOOAglwiLFxyXG4gIG51bWVyaWNFcnJvcjogXCLmlbDlrZfjgafjgZToqJjlhaXkuIvjgZXjgYRcIixcclxuICB0ZXh0TWluTGVuZ3RoOiBcInswfSDmloflrZfku6XkuIrjgaflhaXlipvjgZfjgabkuIvjgZXjgYRcIixcclxuICB0ZXh0TWF4TGVuZ3RoOiBcInswfeaWh+Wtl+S7peS4i+OBp+WFpeWKm+OBl+OBpuOBj+OBoOOBleOBhOOAglwiLFxyXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiezB95Lul5LiKezF95pyq5rqA44Gu5paH5a2X44KS5YWl5Yqb44GX44Gm44GP44Gg44GV44GE44CCXCIsXHJcbiAgbWluUm93Q291bnRFcnJvcjogXCJ7MH3ooYzku6XkuIrjgaflhaXlipvjgZfjgabkuIvjgZXjgYRcIixcclxuICBtaW5TZWxlY3RFcnJvcjogXCJ7MH3nqK7poZ7ku6XkuIrjgpLpgbjmip7jgZfjgabkuIvjgZXjgYRcIixcclxuICBtYXhTZWxlY3RFcnJvcjogXCJ7MH3ku6XkuIrjga7jg5Djg6rjgqLjg7Pjg4jjgpLpgbjmip7jgZfjgarjgYTjgafjgY/jgaDjgZXjgYTjgIJcIixcclxuICBudW1lcmljTWluTWF4OlxyXG4gICAgXCJ7MH3jga97MX3ku6XkuIrjgafjgYLjgorjgIF7Mn3ku6XkuIvjgafjgYLjgovjgZPjgajjgYzmnJvjgb7jgZfjgYTjgIJcIixcclxuICBudW1lcmljTWluOiBcIid7MH0nIOOBr+WQjOetieOBi3sxfeOCiOOCiuWkp+OBjeOBj+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCk1wiLFxyXG4gIG51bWVyaWNNYXg6IFwiJ3swfScg44Gv5ZCM562J44GLezF944KI44KK5bCP44GV44GP44Gq44GR44KM44Gw44Gq44KK44G+44Gb44KTXCIsXHJcbiAgaW52YWxpZEVtYWlsOiBcIuacieWKueOBquODoeODvOODq+OCouODieODrOOCueOCkuOBlOiomOWFpeS4i+OBleOBhFwiLFxyXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIuW8j+OBryB7MH3jga8ndHJ1ZSfjgpLov5TjgZnjgbnjgY3jgafjgZnjgIJcIixcclxuICB1cmxSZXF1ZXN0RXJyb3I6IFwi44Oq44Kv44Ko44K544OI44Gv44Ko44Op44O8ICd7MH0nIOOCkui/lOOBl+OBvuOBl+OBn+OAgnsxfVwiLFxyXG4gIHVybEdldENob2ljZXNFcnJvcjpcclxuICAgIFwi44Oq44Kv44Ko44K544OI44GM56m644Gu44OH44O844K/44KS6L+U44GX44Gf44GL44CBJ3BhdGgnIOODl+ODreODkeODhuOCo+OBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCk+OAglwiLFxyXG4gIGV4Y2VlZE1heFNpemU6IFwi44OV44Kh44Kk44Or44Gu44K144Kk44K644GvezB944KS6LaF44GI44Gm44Gv44GE44GR44G+44Gb44KTXCIsXHJcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIuOBneOBruS7luOBruWApOOCkuWFpeWKm+OBl+OBpuOBj+OBoOOBleOBhOOAglwiLFxyXG4gIHVwbG9hZGluZ0ZpbGU6XHJcbiAgICBcIuODleOCoeOCpOODq+OCkuOCouODg+ODl+ODreODvOODieS4reOBp+OBmeOAguOBl+OBsOOCieOBj+OBl+OBpuOBi+OCieWGjeW6puOBiuippuOBl+S4i+OBleOBhFwiLFxyXG4gIGxvYWRpbmdGaWxlOiBcIuiqreOBv+i+vOOBv+S4rVwiLFxyXG4gIGNob29zZUZpbGU6IFwi44OV44Kh44Kk44Or44KS6YG45oqeXCIsXHJcbiAgbm9GaWxlQ2hvc2VuOiBcIumBuOaKnuOBleOCjOOBn+ODleOCoeOCpOODq+OBr+OBguOCiuOBvuOBm+OCk1wiLFxyXG4gIGNvbmZpcm1EZWxldGU6IFwi44Os44Kz44O844OJ44KS5YmK6Zmk44GX44G+44GZ44GL77yfXCIsXHJcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCLjgZPjga7lgKTjga/kuIDmhI/jgafjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpPjgIJcIixcclxuICBhZGRDb2x1bW46IFwi5YiX44Gu6L+95YqgXCIsXHJcbiAgYWRkUm93OiBcIui/veWKoOihjFwiLFxyXG4gIHJlbW92ZVJvdzogXCLpmaTljrtcIixcclxuICBhZGRQYW5lbDogXCLmlrDopo/ov73liqBcIixcclxuICByZW1vdmVQYW5lbDogXCLpmaTljrtcIixcclxuICBjaG9pY2VzX0l0ZW06IFwi5ZOB55uuXCIsXHJcbiAgbWF0cml4X2NvbHVtbjogXCLjgrPjg6njg6BcIixcclxuICBtYXRyaXhfcm93OiBcIuihjFwiLFxyXG4gIHNhdmluZ0RhdGE6IFwi57WQ5p6c44Gv44K144O844OQ44O844Gr5L+d5a2Y44GV44KM44Gm44GE44G+44GZLi4u44CCXCIsXHJcbiAgc2F2aW5nRGF0YUVycm9yOiBcIuOCqOODqeODvOOBjOeZuueUn+OBl+OAgee1kOaenOOCkuS/neWtmOOBp+OBjeOBvuOBm+OCk+OBp+OBl+OBn+OAglwiLFxyXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIue1kOaenOOBr+eEoeS6i+OBq+S/neWtmOOBleOCjOOBvuOBl+OBn1wiLFxyXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCLjgoLjgYbkuIDluqboqabjgZfjgabjgb/jgabjgY/jgaDjgZXjgYTjgIJcIixcclxuICB0aW1lck1pbjogXCLlg4XlsJFcIixcclxuICB0aW1lclNlYzogXCLjgrvjg4Pjgq9cIixcclxuICB0aW1lclNwZW50QWxsOiBcIuOBguOBquOBn+OBr+OBk+OBruODmuODvOOCuOOBq3swfeOCkuiyu+OChOOBl+OAgeWQiOioiOOBp3sxfeOCkuiyu+OChOOBl+OBvuOBl+OBn+OAglwiLFxyXG4gIHRpbWVyU3BlbnRQYWdlOiBcIuOBguOBquOBn+OBr+OBk+OBruODmuODvOOCuOOBq3swfeOCkuiyu+OChOOBl+OBvuOBl+OBn+OAglwiLFxyXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwi5ZCI6KiI44GnezB944KS5L2/44Gj44Gf44GT44Go44Gr44Gq44KK44G+44GZ44CCXCIsXHJcbiAgdGltZXJMaW1pdEFsbDpcclxuICAgIFwi44GT44Gu44Oa44O844K444GrezF944Gu44GG44GhezB944KS6LK744KE44GX44CBezN944Gu44GG44GhezJ944KS5ZCI6KiI44Gn6LK744KE44GX44G+44GX44Gf44CCXCIsXHJcbiAgdGltZXJMaW1pdFBhZ2U6IFwi44GT44Gu44Oa44O844K444GnezF944GuezB944KS5L2/44Gj44Gf44GT44Go44GM44GC44KK44G+44GZ44CCXCIsXHJcbiAgdGltZXJMaW1pdFN1cnZleTogXCLlkIjoqIjjgad7MX3jga57MH3jgpLkvb/jgaPjgZ/jgZPjgajjgYzjgYLjgorjgb7jgZnjgIJcIixcclxuICBjbGVhbkNhcHRpb246IFwi5YmK6ZmkXCIsXHJcbiAgY2xlYXJDYXB0aW9uOiBcIuepuueZvVwiLFxyXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcIuODleOCoeOCpOODq+OCkumBuOaKnlwiLFxyXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIuOBk+OBruODleOCoeOCpOODq+OCkuWJiumZpFwiLFxyXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwi5ZmrXCIsXHJcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcIuWQplwiLFxyXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcIuOBk+OBruODleOCoeOCpOODq+OCkuWJiumZpOOBl+OBpuOCguOCiOOCjeOBl+OBhOOBp+OBmeOBi++8n3swfT9cIixcclxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwi44GZ44G544Gm44Gu44OV44Kh44Kk44Or44KS5YmK6Zmk44GX44Gm44KC44KI44KN44GX44GE44Gn44GZ44GL77yfXCIsXHJcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcIuizquWVj+WQjVwiLFxyXG59O1xyXG5cclxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJqYVwiXSA9IGphcGFuZXNlU3VydmV5U3RyaW5ncztcclxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiamFcIl0gPSBcIuaXpeacrOiqnlwiO1xyXG4iLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGthemFraFN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCLQkNGA0YLSm9CwXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCLQmtC10LvQtdGB0ZZcIixcbiAgY29tcGxldGVUZXh0OiBcItCU0LDQudGL0L1cIixcbiAgcHJldmlld1RleHQ6IFwi0JDQu9C00YvQvSDQsNC70LAg0pvQsNGA0LDRg1wiLFxuICBlZGl0VGV4dDogXCLQoNC10LTQsNC60YbQuNGP0LvQsNGDXCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCLQkdCw0YHRgtCw0YNcIixcbiAgb3RoZXJJdGVtVGV4dDogXCLQkdCw0YHSm9CwICjTqdGC0ZbQvdC10LzRltC3LCDQttCw0LfRi9Kj0YvQtylcIixcbiAgbm9uZUl0ZW1UZXh0OiBcItCW0L7Sm1wiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCLQkdCw0YDQu9GL0pPRi9C9INGC0LDSo9C00LDRg1wiLFxuICBwcm9ncmVzc1RleHQ6IFwiezB9INC00LXQvSB7MX0g0LHQtdGCIFwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwiezB9INC00LXQvSB7MX0g0LbQsNC30LHQsFwiLFxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwiezB9L3sxfSDRgdKx0YDQsNKb0YLQsNGA0pPQsCDQttCw0YPQsNC/XCIsXG4gIGVtcHR5U3VydmV5OiBcItCR0ZbRgCDQtNC1INCx0ZbRgCDRgdKx0YDQsNKbINC20L7Smy5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCLQodCw0YPQsNC70L3QsNC80LDQvdGLINGC0L7Qu9GC0YvRgNKT0LDQvdGL0qPRi9C3INKv0YjRltC9INGA0LDRhdC80LXRgiFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTogXCLQodGW0Lcg0LHSsdC7INGB0LDRg9Cw0LvQvdCw0LzQsNC90Ysg06nRgtGW0L8g0pvQvtC50LTRi9Kj0YvQty5cIixcbiAgbG9hZGluZ1N1cnZleTogXCLQodC10YDQstC10YDQtNC10L0g0LbSr9C60YLQtdGDLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcItCi0LDSo9C00LDRgy4uLlwiLFxuICB2YWx1ZTogXCLQvNOZ0L3RllwiLFxuICByZXF1aXJlZEVycm9yOiBcItOo0YLRltC90LXQvNGW0LcsINGB0rHRgNCw0pvSm9CwINC20LDRg9Cw0L8g0LHQtdGA0ZbSo9GW0LcuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcItOo0YLRltC90LXQvNGW0LcsINC60LXQvCDQtNC10LPQtdC90LTQtSDQsdGW0YAg0YHSsdGA0LDSm9Kb0LAg0LbQsNGD0LDQvyDQsdC10YDRltKj0ZbQty5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCLTqNGC0ZbQvdC10LzRltC3LCDTmdGA0LHRltGAINC20L7Qu9C00YvSoyDRgdKx0YDQsNKT0LDQvdGLINC20LDRg9Cw0L8g0LHQtdGA0ZbSo9GW0LcuXCIsXG4gIG51bWVyaWNFcnJvcjogXCLQltCw0YPQsNC/INGB0LDQvSDRgtKv0YDRltC90LTQtSDQsdC+0LvRg9GLINC60LXRgNC10LouXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwi06jRgtGW0L3QtdC80ZbQtywgezB9INC00LXQvSDQutOp0L8g0YLQsNKj0LHQsCDQtdC90LPRltC30ZbSo9GW0LcuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwi06jRgtGW0L3QtdC80ZbQtywgezB9INC00LXQvSDQsNC3INGC0LDSo9Cx0LAg0LXQvdCz0ZbQt9GW0qPRltC3LlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcItOo0YLRltC90LXQvNGW0LcsIHswfSDQsNC3INC205nQvdC1IHsxfSDQutOp0L8g0YLQsNKj0LHQsCDQtdC90LPRltC30ZbSo9GW0LcuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwi06jRgtGW0L3QtdC80ZbQtywgezB9INC00LXQvSDQutC10Lwg0LXQvNC10YEg0LbQvtC7INGC0L7Qu9GC0YvRgNGL0qPRi9C3LlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCLTqNGC0ZbQvdC10LzRltC3LCDRgtGL0Lwg0LHQvtC70LzQsNGB0LAgezB9INC90rHRgdKb0LAg0YLQsNKj0LTQsNKj0YvQty5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwi06jRgtGW0L3QtdC80ZbQtywgezB9INC90rHRgdKb0LDQtNCw0L0g0LrTqdC/INGC0LDSo9C00LDQvNCw0qPRi9C3LlwiLFxuICBudW1lcmljTWluTWF4OiBcIid7MH0nIHsxfSDQtNC10L0g0LrQtdC8INC10LzQtdGBINC205nQvdC1IHsyfSDQtNC10L0g0LrTqdC/INC10LzQtdGBINCx0L7Qu9GDINC60LXRgNC10LpcIixcbiAgbnVtZXJpY01pbjogXCInezB9JyB7MX0g0LTQtdC9INC60LXQvCDQtdC80LXRgSDQsdC+0LvRgyDQutC10YDQtdC6XCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScgezF9INC00LXQvSDQutOp0L8g0LXQvNC10YEg0LHQvtC70YMg0LrQtdGA0LXQulwiLFxuICBpbnZhbGlkRW1haWw6IFwi06jRgtGW0L3QtdC80ZbQtywg0LbQsNGA0LDQvNC00Ysg0Y3Qu9C10LrRgtGA0L7QvdC00YvSmyDQv9C+0YjRgtCw0qPRi9C30LTRiyDQtdC90LPRltC30ZbSo9GW0LcuXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcInswfSDTqdGA0L3QtdCz0ZYgICd0cnVlJyDSm9Cw0LnRgtCw0YDRgyDQutC10YDQtdC6LlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwi0KHSsdGA0LDRgtGL0Lwg0pvQsNGC0LXQu9GW0LrRgtGWINKb0LDQudGC0LDRgNC00YsnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjogXCLQodKx0YDQsNGC0YvQvNKT0LAg0LbQsNGD0LDQvyDQsdC+0YEg0LrQtdC70LTRliDQvdC10LzQtdGB0LUgJ3BhdGgnINKb0LDRgdC40LXRgtGWINKb0LDRgtC1INC606nRgNGB0LXRgtGW0LvQs9C10L0gXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwi0KTQsNC50LvQtNGL0qMg0LzTqdC70YjQtdGA0ZYgezB9INCw0YHQv9Cw0YMg0LrQtdGA0LXQui5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcItOo0YLRltC90LXQvNGW0LcsIOKAnNCR0LDRgdKb0LDigJ0g0LbQvtC70YvQvdCwINC00LXRgNC10LrRgtGWINC10L3Qs9GW0LfRltKj0ZbQt1wiLFxuICB1cGxvYWRpbmdGaWxlOiBcItCh0ZbQt9C00ZbSoyDRhNCw0LnQu9GL0qPRi9C3INC20q/QutGC0LXQu9GW0L8g0LbQsNGC0YvRgC4g0JHRltGA0L3QtdGI0LUg0YHQtdC60YPQvdC0INGC0L7RgdGL0L8sINKb0LDQudGC0LDQtNCw0L0g0LHQsNC50pvQsNC/INC606nRgNGW0qPRltC3LlwiLFxuICBsb2FkaW5nRmlsZTogXCLQltKv0LrRgtC10YMuLi5cIixcbiAgY2hvb3NlRmlsZTogXCLQpNCw0LnQu9C00LDRgNC00Ysg0YLQsNKj0LTQsNKj0YvQty4uLlwiLFxuICBub0ZpbGVDaG9zZW46IFwi0KTQsNC50Lsg0YLQsNKj0LTQsNC70YvQvdCx0LDQtNGLXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwi0KHRltC3INC20LDQt9Cx0LDQvdGLINC20L7Rj9GC0YvQvdGL0qPRi9C30pPQsCDRgdC10L3RltC80LTRltGB0ZbQtyDQsdC1P1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcItCR0rHQuyDQvNOZ0L0g0LHRltGA0LXQs9C10Lkg0LHQvtC70YMg0LrQtdGA0LXQui5cIixcbiAgYWRkQ29sdW1uOiBcItCR0LDSk9Cw0L3QsCDSm9C+0YHRg1wiLFxuICBhZGRSb3c6IFwi0JbQvtC70LTRiyDSm9C+0YHRg1wiLFxuICByZW1vdmVSb3c6IFwi06jRiNGW0YDRg1wiLFxuICBhZGRQYW5lbDogXCLQltCw0qPQsCDSm9C+0YHRg1wiLFxuICByZW1vdmVQYW5lbDogXCLTqNGI0ZbRgNGDXCIsXG4gIGNob2ljZXNfSXRlbTogXCLQndKx0YHSm9CwXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwi0JHQsNKT0LDQvdCwXCIsXG4gIG1hdHJpeF9yb3c6IFwi0JbQvtC7XCIsXG4gIHNhdmluZ0RhdGE6IFwi0J3TmdGC0LjQttC10LvQtdGAINGB0LXRgNCy0LXRgNC00LUg0YHQsNKb0YLQsNC70LDQtNGLLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCLSmtCw0YLQtdC70ZbQuiDRgtGD0YvQvdC00LDQtNGLLCDQvdOZ0YLQuNC20LUg0YHQsNKb0YLQsNC70YvQvdCx0LDQtNGLLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCLQndOZ0YLQuNC20LUg0L7QudC00LDSk9GL0LTQsNC5INGB0LDSm9GC0LDQu9C00YshXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCLSmtCw0LnRgtCw0LTQsNC9INCx0LDQudKb0LDQvyDQutOp0YDRg1wiLFxuICB0aW1lck1pbjogXCLQvNC40L1cIixcbiAgdGltZXJTZWM6IFwi0YHQtdC6XCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwi0KHRltC3INCx0rHQuyDQsdC10YLRgtC1IHswfSDQutC10YLRltGA0LTRltKj0ZbQtyDQttOZ0L3QtSDQsdCw0YDQu9GL0pPRiyB7MX0uXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcItCh0ZbQtyDQsdKx0Lsg0LHQtdGC0YLQtSB7MH0g0LrQtdGC0ZbRgNC00ZbSo9GW0LcuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwi0KHRltC3INGB0LDRg9Cw0LvQvdCw0LzQsCDQutC10LfRltC90LTQtSB7MH0g0LrQtdGC0ZbRgNC00ZbSo9GW0LcuXCIsXG4gIHRpbWVyTGltaXRBbGw6IFwi0KHRltC3INCx0rHQuyDQsdC10YLRgtC1IHswfSDQtNC10L0gezF9INC60LXRgtGW0YDQtNGW0qPRltC3INC205nQvdC1IHsyfSDQtNC10L0gezN9INCx0q/QutGW0Lsg0YHQsNGD0LDQu9C90LDQvNCwINKv0YjRltC9LlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCLQodGW0Lcg0LHSsdC7INCx0LXRgtGC0LUgezB9INC00LXQvSB7MX0g0LrQtdGC0ZbRgNC00ZbSo9GW0LcuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwi0KHRltC3INCx0q/QutGW0Lsg0YHQsNGD0LDQu9C90LDQvNCwINKv0YjRltC9IHswfSDQtNC10L0gezF9INC60LXRgtGW0YDQtNGW0qPRltC3IFwiLFxuICBjbGVhbkNhcHRpb246IFwi0KLQsNC30LDQu9Cw0YNcIixcbiAgY2xlYXJDYXB0aW9uOiBcItCi0LDQt9Cw0LvQsNGDXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcItCk0LDQudC7INGC0LDSo9C00LDSo9GL0LdcIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwi0KTQsNC50LvQtNGLINC20L7QudGL0qPRi9C3XCIsXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwi0JjTmVwiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwi0JbQvtKbXCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcItCh0ZbQtyDQsdKx0Lsg0YTQsNC50LvQtNGLINC20L7Rj9GC0YvQvdGL0qPRi9C30pPQsCDRgdC10L3RltC80LTRltGB0ZbQtyDQsdC1OiB7MH0/XCIsXG4gIGNvbmZpcm1SZW1vdmVBbGxGaWxlczogXCLQodGW0Lcg0LHQsNGA0LvRi9KbINGE0LDQudC70LTQsNGA0LTRiyDQttC+0Y/RgtGL0L3Ri9Kj0YvQt9KT0LAg0YHQtdC90ZbQvNC00ZbRgdGW0Lcg0LHQtT9cIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcItCh0rHRgNCw0pvRgtGL0qMg0LDRgtCw0YPRi1wiLFxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJra1wiXSA9IGthemFraFN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJra1wiXSA9IFwiS2F6YWtoXCI7IiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBrb3JlYW5TdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwi7J207KCEXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCLri6TsnYxcIixcbiAgY29tcGxldGVUZXh0OiBcIuyZhOujjFwiLFxuICBwcmV2aWV3VGV4dDogXCLsi5zsgqxcIixcbiAgZWRpdFRleHQ6IFwi7Y647KeR7ZWY64ukXCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCLsi5zsnpFcIixcbiAgb3RoZXJJdGVtVGV4dDogXCLquLDtg4Ao7ISk66qFKVwiLFxuICBub25lSXRlbVRleHQ6IFwi7JeG7J2MXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIuuqqOuRkCDshKDtg51cIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIu2OmOydtOyngCB7MX0g7KSRIHswfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwiezB9IC8gezF9IOq4sOuhnVwiLFxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwiezB9IC8gezF9IOqwnOydmCDsp4jrrLjsl5Ag64u167OAIO2VqFwiLFxuICBlbXB0eVN1cnZleTogXCLshKTrrLjsp4Dsl5Ag67O07Jes7KeA64qUIO2OmOydtOyngOuCmCDsp4jrrLjsnbQg7JeG7Iq164uI64ukXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwi7ISk66y4IOyhsOyCrOulvCDsmYTro4ztlbQg7KO87IWU7IScIOqwkOyCrO2VqeuLiOuLpCFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTogXCLquLDroZ3sl5Ag65Sw66W066m0IOydtOuvuCDshKTrrLgg7KGw7IKs66W8IOuniOy5mOyFqOyKteuLiOuLpC5cIixcbiAgbG9hZGluZ1N1cnZleTogXCLshKTrrLjsobDsgqzqsIAg66Gc65Oc7KSR7J6F64uI64ukLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIuyEoO2Dne2VmOyLreyLnOyYpC4uLlwiLFxuICB2YWx1ZTogXCLqsJJcIixcbiAgcmVxdWlyZWRFcnJvcjogXCLsp4jrrLjsl5Ag64u17ZWY7Iuc7JikLlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCLtlZjrgpgg7J207IOB7J2YIOyniOusuOyXkCDri7XtlZjsi63si5zsmKQuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwi66qo65OgIO2WieyXkCDsnojripQg7KeI66y47JeQIOuLte2VmOyLreyLnOyYpC5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIuqwkuydgCDsiKvsnpDsl6zslbwg7ZWp64uI64ukLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIuuLteuzgOydmCDquLjsnbTripQg7LWc7IaMIHswfeyekOyXrOyVvCDsnoXri4jri6QuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwi64u167OA7J2YIOq4uOydtOuKlCB7MH3snpDrpbwg7LSI6rO8IO2VoCDsiJgg7JeG7Iq164uI64ukLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIuuLteuzgOydmCDquLjsnbTripQgezB9IC0gezF97J6QIOyCrOydtOyXrOyVvCDtlanri4jri6QuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwi7LWc7IaMIHswfeqwnOydmCDtlonsnYQg7LGE7Jqw7Iut7Iuc7JikXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIuy1nOyGjCB7MH3qsJzsnZgg67OA7IiY66W8IOyEoO2Dne2VmOyLreyLnOyYpC5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwi7LWc64yAIHswfeqwnOydmCDrs4DsiJjrpbwg7ISg7YOd7ZWY7Iut7Iuc7JikLlwiLFxuICBudW1lcmljTWluTWF4OiBcIid7MH0n7J2AIHsxfeuztOuLpCDtgazqsbDrgpgg6rCZ6rOgIHsyfeuztOuLpCDsnpHqsbDrgpgg6rCZ7JWE7JW87ZWp64uI64ukLlwiLFxuICBudW1lcmljTWluOiBcIid7MH0n7J2AIHsxfeuztOuLpCDtgazqsbDrgpgg6rCZ7JWE7JW87ZWp64uI64ukLlwiLFxuICBudW1lcmljTWF4OiBcIid7MH0n7J2AIHsxfeuztOuLpCDsnpHqsbDrgpgg6rCZ7JWE7JW87ZWp64uI64ukLlwiLFxuICBpbnZhbGlkRW1haWw6IFwi7Jis67CU66W4IOydtOuplOydvCDso7zshozrpbwg7J6F66Cl7ZWY7Iut7Iuc7JikLlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCLtkZztmITsi506IHswfeydgCAn7LC4J+ydtOyWtOyVvCDtlanri4jri6QuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCInezB9J+ycvOuhnCDsnpjrqrvrkJwg7JqU7LKt7J6F64uI64ukLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOiBcIuu5hOyWtOyeiOuKlCDrjbDsnbTthLDrpbwg7JqU7LKt7ZaI6rGw64KYIOyemOuqu+uQnCDsho3shLHsnZgg6rK966Gc7J6F64uI64ukLlwiLFxuICBleGNlZWRNYXhTaXplOiBcIu2MjOydvCDtgazquLDqsIAgezB97J2EIOy0iOqzvCDtlaAg7IiYIOyXhuyKteuLiOuLpC5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIuuLpOuluCDsp4jrrLjsnYQg7J6R7ISx7ZWY7Iut7Iuc7JikLlwiLFxuICB1cGxvYWRpbmdGaWxlOiBcIu2MjOydvCDsl4XroZzrk5wg7KSR7J6F64uI64ukLiDsnqDsi5wg7ZuEIOuLpOyLnCDsi5zrj4TtlZjsi63si5zsmKQuXCIsXG4gIGxvYWRpbmdGaWxlOiBcIuuhnOuTnCDspJEuLi5cIixcbiAgY2hvb3NlRmlsZTogXCLtjIzsnbwg7ISg7YOdLi4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCLshKDtg53rkJwg7YyM7J287J20IOyXhuyKteuLiOuLpFwiLFxuICBjb25maXJtRGVsZXRlOiBcIuq4sOuhneydhCDsgq3soJztlZjsi5zqsqDsirXri4jquYw/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwiIOydtCDqsJLsnYAg6rOg7Jyg7ZW07JW87ZWp64uI64ukLlwiLFxuICBhZGRDb2x1bW46IFwi7Je0IOy2lOqwgFwiLFxuICBhZGRSb3c6IFwi7ZaJIOy2lOqwgFwiLFxuICByZW1vdmVSb3c6IFwi7KCc6rGwXCIsXG4gIGFkZFBhbmVsOiBcIuyDiOuhreqyjCDstpTqsIBcIixcbiAgcmVtb3ZlUGFuZWw6IFwi7KCc6rGwXCIsXG4gIGNob2ljZXNfSXRlbTogXCLtla3rqqlcIixcbiAgbWF0cml4X2NvbHVtbjogXCLsl7RcIixcbiAgbWF0cml4X3JvdzogXCLtlolcIixcbiAgc2F2aW5nRGF0YTogXCLqsrDqs7zqsIAg7ISc67KE7JeQIOyggOyepSDspJHsnoXri4jri6QuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIuyYpOulmOqwgCDrsJzsg53tlZjsl6wg6rKw6rO866W8IOyggOyepe2VoCDsiJgg7JeG7Iq164uI64ukLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCLqsrDqs7zqsIAg7ISx6rO17KCB7Jy866GcIOyggOyepeuQmOyXiOyKteuLiOuLpCFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIuuLpOyLnCDsi5zrj4TtlZjsi63si5zsmKRcIixcbiAgdGltZXJNaW46IFwi67aEXCIsXG4gIHRpbWVyU2VjOiBcIuy0iFwiLFxuICB0aW1lclNwZW50QWxsOiBcIu2YhOyerCDtjpjsnbTsp4Dsl5DshJwgezB97J2EIOyGjOyalO2VtCDstJ0gezF97J20IOqxuOuguOyKteuLiOuLpC5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwi7ZiE7J6sIO2OmOydtOyngOyXkOyEnCB7MF3snbQg6rG466C47Iq164uI64ukXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwi7LSdIHswfeydtCDqsbjroLjsirXri4jri6QuXCIsXG4gIHRpbWVyTGltaXRBbGw6IFwi7ZiE7J6sIO2OmOydtOyngOyXkOyEnCB7MH0vezF97J2EIOyGjOyalO2VtCDstJ0gezJ9L3szfeydtCDqsbjroLjsirXri4jri6QuXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIu2YhOyerCDtjpjsnbTsp4Dsl5DshJwgezB9L3sxfeydtCDqsbjroLjsirXri4jri6QuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwi7LSdIHswfS97MX3snbQg6rG466C47Iq164uI64ukLlwiLFxuICBjbGVhbkNhcHRpb246IFwi64um6riwXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCLsp4DsmrDquLBcIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwi7YyM7J287J2EIOyEoO2DnVwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCLsnbQg7YyM7J28IOygnOqxsFwiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIuyYiFwiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwi7JWE64uIXCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcInswfSDtjIzsnbzsnYQg7KCc6rGwIO2VmOyLnOqyoOyKteuLiOq5jD9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIuuqqOuToCDtjIzsnbzsnYQg7KCc6rGwIO2VmOyLnOqyoOyKteuLiOq5jD9cIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcIuyniOusuCDsoJzrqqlcIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wia29cIl0gPSBrb3JlYW5TdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wia29cIl0gPSBcIu2VnOq1reyWtFwiO1xuIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBsYXR2aWFuU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIkF0cGFrYcS8XCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJUxIFsxIFrXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJQYWJlaWd0XCIsXG4gIHByZXZpZXdUZXh0OiBcIlByaWVrxaFza2F0xKtqdW1zXCIsXG4gIGVkaXRUZXh0OiBcIlJlZGnEo8STdFwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwiU8SBa3RcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJDaXRzIChsxatkenUsIGFwcmFrc3RpZXQhKVwiLFxuICBub25lSXRlbVRleHQ6IFwiTmF2XCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIkl6dsSTbMSTdGllcyB2aXN1c1wiLFxuICBwcm9ncmVzc1RleHQ6IFwiTGFwcHVzZSB7MH0gbm8gezF9XCIsXG4gIHBhbmVsRHluYW1pY1Byb2dyZXNzVGV4dDogXCJJZXJha3N0xKt0IHswfSBubyB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcIkF0YmlsZMSTamEgdXogamF1dMSBanVtaWVtIHswfSAvIHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCJOYXYgbmV2aWVuYSBqYXV0xIFqdW1hLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIlBhdGVpY2FtaWVzIEp1bXMgcGFyIGFua2V0YXMgYWl6cGlsZMSrxaFhbnUhXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgXCJNxatzdSBpZXJha3N0aSBsaWVjaW5hLCBrYSBqxatzIGphdSBlc2F0IGFpenBpbGTEq2ppcyDFoW8gYXB0YXVqdS5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJJZWzEgWRlIG5vIHNlcnZlcmEuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiSXp2xJNsxJN0aWVzLi4uXCIsXG4gIHZhbHVlOiBcInZhbHVlXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiTMWrZHp1LCBhdGJpbGRpZXQgdXogamF1dMSBanVtdSFcIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwiTMWrZHp1LCBhdGJpbGRpZXQgdXogdmlzbWF6IHZpZW51IGphdXTEgWp1bXUuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiTMWrZHp1LCBhdGJpbGRpZXQgdXogamF1dMSBanVtaWVtIHZpc8SBcyByaW5kxIFzLlwiLFxuICBudW1lcmljRXJyb3I6IFwiQXRiaWxkZWkgaXIgasSBYsWrdCBza2FpdGxpbS5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJMxatkenUsIGlldmFkaWV0IHZpc21heiB7MH0gc2ltYm9sdXMuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiTMWrZHp1LCBpZXZhZGlldCBtYXrEgWsgbmVrxIEgezB9IHJha3N0esSrbWVzLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIkzFq2R6dSwgaWV2YWRpZXQgdmFpcsSBayBuZWvEgSB7MH0gcmFrc3R6xKttZXMgdW4gbWF6xIFrIG5la8SBIHsxfSByYWtzdHrEq21lcy5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJMxatkenUsIGFpenBpbGRpZXQgdmlzbWF6IHswfSByaW5kYXMuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIkzFq2R6dSwgaXp2xJNsaWV0aWVzIHZpc21heiB7MH0gdmFyaWFudHUuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIkzFq2R6dSwgaXp2xJNsaWV0aWVzIG5lIHZhaXJhayBwYXIgezB9IHZhcmlhbnRpZW0uXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCInezB9JyBqxIFixat0IHZpZW7EgWRhbSB2YWkgbGllbMSBa2FtIG5la8SBIHsxfSwgdW4gdmllbsSBZGFtIHZhaSBtYXrEgWthbSwgbmVrxIEgezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScgasSBYsWrdCB2aWVuxIFkYW0gdmFpIGxpZWzEgWthbSB7MX1cIixcbiAgbnVtZXJpY01heDogXCInezB9JyBqxIFixat0IHZpZW7EgWRhbSB2YWkgbGllbMSBa2FtIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiTMWrZHp1LCBpZXZhZGlldCBwYXRpZXN1IGUtcGFzdGEgYWRyZXNpIVwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCJJenRlaWNpZW5hbTogezB9IGrEgWF0Z3JpZcW+IOKAnHRydWXigJ0uXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCJQaWVwcmFzxKtqdW3EgSB0aWthIGF0Z3JpZXp0YSBrxLzFq2RhIOKAnHswfeKAnS4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcIlBpZXByYXPEq2p1bXMgYXRncmllemEgdHVrxaF1cyBkYXR1cyB2YWkgcmVrdml6xKt0cyDigJxwYXRo4oCdIGlyIG5lcGFyZWl6c1wiLFxuICBleGNlZWRNYXhTaXplOiBcIkZhaWxhIGxpZWx1bXMgbmVkcsSra3N0IHDEgXJzbmllZ3QgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiTMWrZHp1LCBpZXZhZGlldCBkYXR1cyBsYXVrxIEgJ0NpdHMnXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCJKxatzdSBmYWlscyB0aWVrIGF1Z8WhdXBpZWzEgWTEk3RzLiBMxatkenUsIHV6Z2FpZGlldCB2YWlyxIFrYXMgc2VrdW5kZXMgdW4gbcSTxKNpbmlldCB2xJNscmVpei5cIixcbiAgbG9hZGluZ0ZpbGU6IFwiTm90aWVrIGllbMSBZGUgLi4uXCIsXG4gIGNob29zZUZpbGU6IFwiSXp2xJNsaWV0aWVzIGZhaWx1cyAuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcIk5hdiBpenbEk2zEk3RzIG5ldmllbnMgZmFpbHNcIixcbiAgY29uZmlybURlbGV0ZTogXCJWYWkgdsSTbGF0aWVzIGl6ZHrEk3N0IGllcmFrc3R1P1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIsWgYWkgdsSTcnTEq2JhaSBqxIFixat0IHVuaWvEgWxhaS5cIixcbiAgYWRkQ29sdW1uOiBcIlBpZXZpZW5vdCBrb2xvbm51XCIsXG4gIGFkZFJvdzogXCJQaWV2aWVub3QgcmluZHVcIixcbiAgcmVtb3ZlUm93OiBcIk5vxYZlbXRcIixcbiAgYWRkUGFuZWw6IFwiUGlldmllbm8gamF1bnVcIixcbiAgcmVtb3ZlUGFuZWw6IFwiTm/FhmVtdFwiLFxuICBjaG9pY2VzX0l0ZW06IFwibGlldGFcIixcbiAgbWF0cml4X2NvbHVtbjogXCJTbGVqYVwiLFxuICBtYXRyaXhfcm93OiBcIlJpbmRhXCIsXG4gIHNhdmluZ0RhdGE6IFwiUmV6dWx0xIF0aSB0aWVrIHNhZ2xhYsSBdGkgc2VydmVyxKsgLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCJSYWTEgXMga8S8xatkYSwgdW4gbcSTcyBuZXZhcsSTasSBbSBzYWdsYWLEgXQgcmV6dWx0xIF0dXMuXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIlJlenVsdMSBdGkgdGlrYSB2ZWlrc23Eq2dpIHNhZ2xhYsSBdGkhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJNxJPEo2luaSB2xJNscmVpelwiLFxuICB0aW1lck1pbjogXCJtaW5cIixcbiAgdGltZXJTZWM6IFwic2VrXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwixaBhasSBIGxhcMSBIGVzYXQgaXp0xJNyxJNqaXMgezB9IHVuIGtvcMSBIHsxfS5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwixaBhasSBIGxhcMSBIGVzYXQgaXp0xJNyxJNqaXMgezB9LlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIktvcMSBIGVzYXQgaXp0xJNyxJNqaXMgezB9LlwiLFxuICB0aW1lckxpbWl0QWxsOlxuICAgIFwixaBhasSBIGxhcMSBIGVzYXQgaXp0xJNyxJNqaXMgezB9IG5vIHsxfSB1biBrb3DEgSB7Mn0gbm8gezN9LlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCLFoGFqxIEgbGFwxIEgZXNhdCBpenTEk3LEk2ppcyB7MH0gbm8gezF9LlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIktvcMSBIGVzYXQgaXp0xJNyxJNqaXMgezB9IG5vIHsxfS5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIlTEq3JzXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJTa2FpZHJzXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcIkl6dsSTbMSTdGllcyBmYWlsdVwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCJOb8WGZW1pZXQgxaFvIGZhaWx1XCIsXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwiSsSBXCIsXG4gIGJvb2xlYW5VbmNoZWNrZWRMYWJlbDogXCJOxJNcIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwiVmFpIHRpZcWhxIFtIHbEk2xhdGllcyBub8WGZW10IMWhbyBmYWlsdTogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwiVmFpIHRpZcWhxIFtIHbEk2xhdGllcyBub8WGZW10IHZpc3VzIGZhaWx1cz9cIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcIkphdXTEgWp1bWEgbm9zYXVrdW1zXCIsXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImx2XCJdID0gbGF0dmlhblN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJsdlwiXSA9IFwibGF0dmllxaF1XCI7XG4iLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGxpdGh1YW5pYVN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJBdGdhbFwiLFxuICBwYWdlTmV4dFRleHQ6IFwiVG9saWF1XCIsXG4gIGNvbXBsZXRlVGV4dDogXCJCYWlndGlcIixcbiAgcHJldmlld1RleHQ6IFwiUGVyxb5pxatyYVwiLFxuICBlZGl0VGV4dDogXCJSZWRhZ3VvdGlcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIlByYWTEl3RpXCIsXG4gIG90aGVySXRlbVRleHQ6IFwiS2l0YSAoxK92ZXN0aSlcIixcbiAgbm9uZUl0ZW1UZXh0OiBcIk7El3JhXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIlBhc2lyaW5rdGkgdmlzdXNcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlB1c2xhcGlzIHswfSBpxaEgezF9XCIsXG4gIHBhbmVsRHluYW1pY1Byb2dyZXNzVGV4dDogXCLErnJhxaF5dGkgezB9IGnFoSB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcIkF0c2FrxJcgxK8gezB9IC8gezF9IGtsYXVzaW11c1wiLFxuICBlbXB0eVN1cnZleTogXCJBcGtsYXVzb2plIG7El3JhIG1hdG9tbyBwdXNsYXBpbyBhciBrbGF1c2ltby5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJExJdrb2phbWUgdcW+IGRhbHl2YXZpbcSFIGFwa2xhdXNvamUhXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6IFwiTcWrc8WzIMSvcmHFoWFpIHJvZG8sIGthZCBqYXUgYXRsaWtvdGUgxaFpxIUgYXBrbGF1c8SFLlwiLFxuICBsb2FkaW5nU3VydmV5OiBcIlByYcWhb21lIHBhbGF1a3RpLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIlBhc2lyaW5rdGkuLi5cIixcbiAgdmFsdWU6IFwicmVpa8WhbcSXXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiQsWrdGluYSBhdHNha3l0aSDEryDFocSvIGtsYXVzaW3EhS5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwiQsWrdGluYSBhdHNha3l0aSBiZW50IMSvIHZpZW7EhSBrbGF1c2ltxIUuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiUHJhxaFvbWUgYXRzYWt5dGkgxK8ga2xhdXNpbXVzIHZpc29zZSBlaWx1dMSXc2UuXCIsXG4gIG51bWVyaWNFcnJvcjogXCJUdXJpIGLFq3RpIHNrYWnEjWlhaS5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJQcmHFoW9tZSBzdXZlc3RpIGJlbnQgezB9IHNpbWJvbGl1cy5cIixcbiAgdGV4dE1heExlbmd0aDogXCJQcmHFoW9tZSBzdXZlc3RpIG1hxb5pYXUgbmVpIHswfSBzaW1ib2xpxbMuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6XG4gICAgXCJQcmHFoW9tZSBzdXZlc3RpIGRhdWdpYXUgbmVpIHswfSBpciBtYcW+aWF1IG5laSB7MX0gc2ltYm9sacWzLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIlByYcWhb21lIHN1dmVzdGkgbmUgbWHFvmlhdSBuZWkgezB9IGVpbHXEjWnFsy5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiUHJhxaFvbWUgcGFzaXJpbmt0aSBiZW50IHswfSB2YXJpYW50xbMuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIlBhc2lyaW5raXRlIG5lIGRhdWdpYXUga2FpcCB7MH0gdmFyaWFudHVzLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScgdHVyaSBixat0aSBseWd1cyBhcmJhIGRpZGVzbmlzIG5laSB7MX0gaXIgbHlndXMgYXJiYSBtYcW+ZXNuaXMgbmVpIHsyfVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nIHR1csSXdMWzIGLFq3RpIGx5Z3VzIGFyYmEgZGlkZXNuaXMgbmVpIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIid7MH0nIHR1csSXdMWzIGLFq3RpIGx5Z3VzIGFyIG1hxb5lc25pcyB1xb4gezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJQcmHFoW9tZSDEr3Zlc3RpIGdhbGlvamFudMSvIGVsZWt0cm9uaW5pbyBwYcWhdG8gYWRyZXPEhS5cIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwiUmVpa8WhbcSXOiB7MH0gdHVyaSBncsSFxb5pbnRpICd0cnVlJy5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIlXFvmtsYXVzYSBncsSFxb5pbm8ga2xhaWTEhSd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwiVcW+a2xhdXNhIGdyxIXFvmlubyB0dcWhxI1pdXMgZHVvbWVuaXMgYXJiYSAncGF0aCcgc2F2eWLElyB5cmEgbmV0ZWlzaW5nYVwiLFxuICBleGNlZWRNYXhTaXplOiBcIkZhaWxvIGR5ZGlzIG5ldHVyaSB2aXLFoXl0aSB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCLErnZlc2tpdGUga2l0xIUgcmVpa8WhbcSZLlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiSsWrc8WzIGZhaWxhcyB5cmEga2VsaWFtYXMuIFBhbGF1a2l0ZSBrZWxldMSFIHNla3VuZMW+acWzIGlyIGJhbmR5a2l0ZSBkYXIga2FydMSFLlwiLFxuICBsb2FkaW5nRmlsZTogXCJQcmHFoW9tZSBwYWxhdWt0aS4uLlwiLFxuICBjaG9vc2VGaWxlOiBcIlBhc2lyaW5rdGkgZmFpbMSFKHVzKS4uLlwiLFxuICBub0ZpbGVDaG9zZW46IFwiTmVwYXNpcmlua3RhcyBqb2tzIGZhaWxhc1wiLFxuICBjb25maXJtRGVsZXRlOiBcIkFyIG5vcml0ZSBpxaF0cmludGkgxK9yYcWhxIU/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwixaBpIHJlaWvFoW3ElyB0dXLEl3TFsyBixat0aSB1bmlrYWxpLlwiLFxuICBhZGRDb2x1bW46IFwiUHJpZMSXdGkgc3R1bHBlbMSvXCIsXG4gIGFkZFJvdzogXCJQcmlkxJd0aSBlaWx1dMSZXCIsXG4gIHJlbW92ZVJvdzogXCJJxaF0cmludGlcIixcbiAgYWRkUGFuZWw6IFwiUHJpZMSXdGkgbmF1asSFXCIsXG4gIHJlbW92ZVBhbmVsOiBcIknFoXRyaW50aVwiLFxuICBjaG9pY2VzX0l0ZW06IFwiZWxlbWVudGFzXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiU3R1bHBlbGlzXCIsXG4gIG1hdHJpeF9yb3c6IFwiRWlsdXTEl1wiLFxuICBzYXZpbmdEYXRhOiBcIlJlenVsdGF0YWkgc2F1Z29taSBzZXJ2ZXJ5amUuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIsSudnlrbyBrbGFpZGEgaXIgbWVzIG5lZ2FsxJdqb21lIGnFoXNhdWdvdGkgcmV6dWx0YXTFsy5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiUmV6dWx0YXRhaSBidXZvIGnFoXNhdWdvdGkgc8SXa21pbmdhaSFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIkJhbmR5dGkgZGFyIGthcnTEhVwiLFxuICB0aW1lck1pbjogXCJtaW5cIixcbiAgdGltZXJTZWM6IFwic2VrXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwiUHJhbGVpZG90ZSB7MH0gxaFpYW1lIHB1c2xhcHlqZSBpciB7MX0gacWhIHZpc28uXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIlByYWxlaWRvdGUgezB9IMWhaWFtZSBwdXNsYXB5amUuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwiUHJhbGVpZG90ZSB7MH0gacWhIHZpc28uXCIsXG4gIHRpbWVyTGltaXRBbGw6IFwiUHJhbGVpZG90ZSB7MH0gacWhIHsxfSDFoWlhbWUgcHVzbGFweWplIGlyIHsyfSBpxaEgezN9IGnFoSB2aXNvLlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCJQcmFsZWlkb3RlIHswfSBpxaEgezF9IMWhaWFtZSBwdXNsYXB5amUuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiUHJhbGVpZG90ZSB7MH0gacWhIHsxfSBpxaEgdmlzby5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIknFoXZhbHl0aVwiLFxuICBjbGVhckNhcHRpb246IFwiVmFseXRpXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcIlBhc2lyaW5rdGkgZmFpbMSFXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIknFoXRyaW50aSDFocSvIGZhaWzEhVwiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIlRhaXBcIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcIk5lXCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcIkFyIHRpa3JhaSBub3JpdGUgcGHFoWFsaW50aSDFocSvIGZhaWzEhTogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwiQXIgdGlrcmFpIG5vcml0ZSBwYcWhYWxpbnRpIHZpc3VzIGZhaWx1cz9cIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcIktsYXVzaW1vIHBhdmFkaW5pbWFzXCIsXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImx0XCJdID0gbGl0aHVhbmlhU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImx0XCJdID0gXCJsaWV0dXZpxbNcIjtcbiIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgbWFjZWRvbmlhblN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCLQn9GA0LXRgtGF0L7QtNC90LBcIixcbiAgcGFnZU5leHRUZXh0OiBcItCh0LvQtdC00L3QvlwiLFxuICBjb21wbGV0ZVRleHQ6IFwi0JfQsNCy0YDRiNC4XCIsXG4gIHByZXZpZXdUZXh0OiBcItCf0YDQtdCz0LvQtdC0XCIsXG4gIGVkaXRUZXh0OiBcItCj0YDQtdC00YPQstCw0ZrQtVwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwi0JfQsNC/0L7Rh9C90LXRgtC1XCIsXG4gIG90aGVySXRlbVRleHQ6IFwi0JTRgNGD0LPQviAo0L7Qv9C40YjQuClcIixcbiAgbm9uZUl0ZW1UZXh0OiBcItCd0LjRiNGC0L5cIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwi0KHQtdC70LXQutGC0LjRgNCw0Zgg0YHQtVwiLFxuICBwcm9ncmVzc1RleHQ6IFwi0KHRgtGA0LDQvdC40YbQsCB7MH0g0L7QtCB7MX1cIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcItCh0L3QuNC80LggezB9INC+0LQgezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCLQntC00LPQvtCy0L7RgNC10L3QuCDQvdCwIHswfSAvIHsxfSDQv9GA0LDRiNCw0ZrQsFwiLFxuICBlbXB0eVN1cnZleTogXCLQndC10LzQsCDQstC40LTQu9C40LLQsCDRgdGC0YDQsNC90LjRhtCwINC40LvQuCDQv9GA0LDRiNCw0ZrQtSDQstC+INC40YHRgtGA0LDQttGD0LLQsNGa0LXRgtC+LlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcItCS0Lgg0LHQu9Cw0LPQvtC00LDRgNC40LzQtSDRiNGC0L4g0LPQviDQt9Cw0LLRgNGI0LjQstGC0LUg0LjRgdGC0YDQsNC20YPQstCw0ZrQtdGC0L4hXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgXCLQndCw0YjQuNGC0LUg0LfQsNC/0LjRgdC4INC/0L7QutCw0LbRg9Cy0LDQsNGCINC00LXQutCwINCy0LXRnNC1INGB0YLQtSDQs9C+INC30LDQstGA0YjQuNC70LUg0L7QstCwINC40YHRgtGA0LDQttGD0LLQsNGa0LUuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwi0JDQvdC60LXRgtCw0YLQsCDRgdC1INCy0YfQuNGC0YPQstCwIC4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCLQmNC30LHQtdGA0LXRgtC1IC4uLlwiLFxuICB2YWx1ZTogXCLQstGA0LXQtNC90L7RgdGCXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwi0JLQtSDQvNC+0LvQsNC8LCDQvtC00LPQvtCy0L7RgNC10YLQtSDQvdCwINC/0YDQsNGI0LDRmtC10YLQvi5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwi0JLQtSDQvNC+0LvQsNC8LCDQvtC00LPQvtCy0L7RgNC10YLQtSDQsdCw0YDQtdC8INC90LAg0LXQtNC90L4g0L/RgNCw0YjQsNGa0LUuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwi0JLQtSDQvNC+0LvQuNC80LUsINC+0LTQs9C+0LLQvtGA0LXRgtC1INC90LAg0L/RgNCw0YjQsNGa0LAg0LLQviDRgdC40YLQtSDRgNC10LTQvtCy0LguXCIsXG4gIG51bWVyaWNFcnJvcjogXCLQktGA0LXQtNC90L7RgdGC0LAg0YLRgNC10LHQsCDQtNCwINCx0LjQtNC1INC90YPQvNC10YDQuNGH0LrQsC5cIixcbiAgbWluRXJyb3I6IFwi0JLRgNC10LTQvdC+0YHRgtCwINC90LUg0YLRgNC10LHQsCDQtNCwINCx0LjQtNC1INC/0L7QvNCw0LvQsCDQvtC0IHswfVwiLFxuICBtYXhFcnJvcjogXCLQktGA0LXQtNC90L7RgdGC0LAg0L3QtSDRgtGA0LXQsdCwINC00LAg0LHQuNC00LUg0L/QvtCz0L7Qu9C10LzQsCDQvtC0IHswfVwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcItCS0L3QtdGB0LXRgtC1INC90LDRmNC80LDQu9C60YMgezB9INC30L3QsNC6L9GG0LguXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwi0JLQvdC10YHQtdGC0LUg0L3QtSDQv9C+0LLQtdGc0LUg0L7QtCB7MH0g0LfQvdCw0Lov0YbQuC5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCLQktC90LXRgdC10YLQtSDQvdCw0ZjQvNCw0LvQutGDIHswfSDQuCDQvdC1INC/0L7QstC10ZzQtSDQvtC0IHsxfSDQt9C90LDRhtC4LlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcItCf0L7Qv9C+0LvQvdC10YLQtSDQvdCw0ZjQvNCw0LvQutGDIHswfSDRgNC10LQo0L7QstC4KS5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwi0JLQtSDQvNC+0LvQuNC80LUg0LjQt9Cx0LXRgNC10YLQtSDQvdCw0ZjQvNCw0LvQutGDIHswfSDQstCw0YDQuNGY0LDQvdGC0LAo0LgpLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCLQmNC30LHQtdGA0LXRgtC1INC90LUg0L/QvtCy0LXRnNC1INC+0LQgezB9INCy0LDRgNC40ZjQsNC90YLQsCjQuCkuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCInezB9JyDRgtGA0LXQsdCwINC00LAg0LHQuNC00LUg0L3QsNGY0LzQsNC70LrRgyB7MX0g0Lgg0L3QsNGY0LzQvdC+0LPRgyB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyDRgtGA0LXQsdCwINC00LAg0LHQuNC00LUg0L3QsNGY0LzQsNC70LrRgyB7MX1cIixcbiAgbnVtZXJpY01heDogXCInezB9JyDRgtGA0LXQsdCwINC00LAg0LHQuNC00LUg0L3QsNGY0LzQvdC+0LPRgyB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcItCS0LUg0LzQvtC70LjQvNC1INCy0L3QtdGB0LXRgtC1INCy0LDQu9C40LTQvdCwINC1LdC80LDQuNC7INCw0LTRgNC10YHQsC5cIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwi0JjQt9GA0LDQt9C+0YI6IHswfSDRgtGA0LXQsdCwINC00LAg0YHQtSDQstGA0LDRgtC4ICd0cnVlJy5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcItCR0LDRgNCw0ZrQtdGC0L4g0LLRgNCw0YLQuCDQs9GA0LXRiNC60LAgJ3swfScuIHsxfSBcIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwi0JHQsNGA0LDRmtC10YLQviDQstGA0LDRgtC4INC/0YDQsNC30L3QuCDQv9C+0LTQsNGC0L7RhtC4INC40LvQuCDRgdCy0L7RmNGB0YLQstC+0YLQviAncGF0aCcg0LUg0L3QtdGC0L7Rh9C90L5cIixcbiAgZXhjZWVkTWF4U2l6ZTogXCLQk9C+0LvQtdC80LjQvdCw0YLQsCDQvdCwINC00LDRgtC+0YLQtdC60LDRgtCwINC90LUg0YLRgNC10LHQsCDQtNCwINC90LDQtNC80LjQvdGD0LLQsCB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCLQktC90LXRgdC10YLQtSDRmNCwINC00YDRg9Cz0LDRgtCwINCy0YDQtdC00L3QvtGB0YIuXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCLQktCw0YjQsNGC0LAg0LTQsNGC0L7RgtC10LrQsCDRgdC1INC/0L7RgdGC0LDQstGD0LLQsC4g0JLQtSDQvNC+0LvQuNC80LUg0L/QvtGH0LXQutCw0ZjRgtC1INC90LXQutC+0LvQutGDINGB0LXQutGD0L3QtNC4INC4INC+0LHQuNC00LXRgtC1INGB0LUg0L/QvtCy0YLQvtGA0L3Qvi5cIixcbiAgbG9hZGluZ0ZpbGU6IFwi0KHQtSDQstGH0LjRgtGD0LLQsCAuLi5cIixcbiAgY2hvb3NlRmlsZTogXCLQmNC30LHQtdGA0LXRgtC1INC00LDRgtC+0YLQtdC60LAgKNC4KSAuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcItCd0LUg0YHQtSDQuNC30LHRgNCw0L3QuCDQtNCw0YLQvtGC0LXQutC4XCIsXG4gIGNvbmZpcm1EZWxldGU6IFwi0JTQsNC70Lgg0YHQsNC60LDRgtC1INC00LAg0LPQviDQuNC30LHRgNC40YjQtdGC0LUg0LfQsNC/0LjRgdC+0YI/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwi0J7QstCw0LAg0LLRgNC10LTQvdC+0YHRgiDRgtGA0LXQsdCwINC00LAg0LHQuNC00LUg0LXQtNC40L3RgdGC0LLQtdC90LAuXCIsXG4gIGFkZENvbHVtbjogXCLQlNC+0LTQsNGYINC60L7Qu9C+0L3QsFwiLFxuICBhZGRSb3c6IFwi0JTQvtC00LDQtNC4INGA0LXQtFwiLFxuICByZW1vdmVSb3c6IFwi0J7RgtGB0YLRgNCw0L3QuFwiLFxuICBlbXB0eVJvd3NUZXh0OiBcItCd0LXQvNCwINGA0LXQtNC+0LLQuC5cIixcbiAgYWRkUGFuZWw6IFwi0JTQvtC00LDQtNC4INC90L7QstC+XCIsXG4gIHJlbW92ZVBhbmVsOiBcItCe0YLRgdGC0YDQsNC90LhcIixcbiAgY2hvaWNlc19JdGVtOiBcItGB0YLQsNCy0LrQsFwiLFxuICBtYXRyaXhfY29sdW1uOiBcItCa0L7Qu9C+0L3QsFwiLFxuICBtYXRyaXhfcm93OiBcItCg0LXQtFwiLFxuICBzYXZpbmdEYXRhOiBcItCg0LXQt9GD0LvRgtCw0YLQuNGC0LUg0YHQtSDQt9Cw0YfRg9Cy0YPQstCw0LDRgiDQvdCwINGB0LXRgNCy0LXRgNC+0YIgLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCLQndCw0YHRgtCw0L3QsCDQs9GA0LXRiNC60LAg0Lgg0L3QtSDQvNC+0LbQtdCy0LzQtSDQtNCwINCz0Lgg0LfQsNGH0YPQstCw0LzQtSDRgNC10LfRg9C70YLQsNGC0LjRgtC1LlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCLQoNC10LfRg9C70YLQsNGC0LjRgtC1INCx0LXQsCDRg9GB0L/QtdGI0L3QviDQt9Cw0YfRg9Cy0LDQvdC4IVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwi0J7QsdC40LTQuCDRgdC1INC/0L7QstGC0L7RgNC90L5cIixcbiAgdGltZXJNaW46IFwi0LzQuNC9XCIsXG4gIHRpbWVyU2VjOiBcItGB0LXQulwiLFxuICB0aW1lclNwZW50QWxsOiBcItCf0L7QvNC40L3QsNCy0YLQtSB7MH0g0L3QsCDQvtCy0LDQsCDRgdGC0YDQsNC90LjRhtCwINC4INCy0LrRg9C/0L3QviB7MX0uXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcItCf0L7QvNC40L3QsNCy0YLQtSB7MH0g0L3QsCDQvtCy0LDQsCDRgdGC0YDQsNC90LjRhtCwLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcItCS0LjQtSDQv9C+0YLRgNC+0YjQuNCy0YLQtSDQstC60YPQv9C90L4gezB9LlwiLFxuICB0aW1lckxpbWl0QWxsOlxuICAgIFwi0J/QvtC80LjQvdCw0LLRgtC1IHswfSDQvtC0IHsxfSDQvdCwINC+0LLQsNCwINGB0YLRgNCw0L3QuNGG0LAg0LggezJ9INC+0LQgezN9INCy0LrRg9C/0L3Qvi5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwi0J/QvtC80LjQvdCw0LLRgtC1IHswfSDQvtC0IHsxfSDQvdCwINC+0LLQsNCwINGB0YLRgNCw0L3QuNGG0LAuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwi0JLQuNC1INC/0L7RgtGA0L7RiNC40LLRgtC1INCy0LrRg9C/0L3QviB7MH0g0L7QtCB7MX0uXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCLQp9C40YHRgtC4XCIsXG4gIGNsZWFyQ2FwdGlvbjogXCLQlNCwINGA0LDRgdGH0LjRgdGC0LhcIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwi0JjQt9Cx0LXRgNC10YLQtSDQtNCw0YLQvtGC0LXQutCwXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcItCe0YLRgdGC0YDQsNC90LXRgtC1INGY0LAg0L7QstCw0LAg0LTQsNGC0L7RgtC10LrQsFwiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcItCU0LBcIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcItCd0LVcIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwi0JTQsNC70Lgg0YHRgtC1INGB0LjQs9GD0YDQvdC4INC00LXQutCwINGB0LDQutCw0YLQtSDQtNCwINGY0LAg0L7RgtGB0YLRgNCw0L3QuNGC0LUg0L7QstCw0LAg0LTQsNGC0L7RgtC10LrQsDogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwi0JTQsNC70Lgg0YHRgtC1INGB0LjQs9GD0YDQvdC4INC00LXQutCwINGB0LDQutCw0YLQtSDQtNCwINCz0Lgg0L7RgtGB0YLRgNCw0L3QuNGC0LUg0YHQuNGC0LUg0LTQsNGC0L7RgtC10LrQuD9cIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcItCd0LDRgdC70L7QsiDQvdCwINC/0YDQsNGI0LDRmtC10YLQvlwiLFxuICBtb2RhbENhbmNlbEJ1dHRvblRleHQ6IFwi0J7RgtC60LDQttC4XCIsXG4gIG1vZGFsQXBwbHlCdXR0b25UZXh0OiBcItCQ0L/Qu9C40YbQuNGA0LDRmFwiLFxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJta1wiXSA9IG1hY2Vkb25pYW5TdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wibWtcIl0gPSBcItCc0LDQutC10LTQvtC90YHQutC4XCI7XG4iLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIG5vcndlZ2lhblN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJGb3JyaWdlXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJOZXN0ZVwiLFxuICBjb21wbGV0ZVRleHQ6IFwiRnVsbGbDuHJcIixcbiAgcHJldmlld1RleHQ6IFwiRm9yaMOlbmRzdmlzbmluZ1wiLFxuICBlZGl0VGV4dDogXCJSZWRpZ2VyZVwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwiU3RhcnRcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJBbm5ldCAoYmVza3JpdilcIixcbiAgbm9uZUl0ZW1UZXh0OiBcIkluZ2VuXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIlZlbGcgYWxsZVwiLFxuICBwcm9ncmVzc1RleHQ6IFwiU2lkZSB7MH0gYXYgezF9XCIsXG4gIHBhbmVsRHluYW1pY1Byb2dyZXNzVGV4dDogXCJUYSBvcHAgezB9IGF2IHsxfVwiLFxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwiQmVzdmFydGUgezB9IC8gezF9IHNww7hyc23DpWxcIixcbiAgZW1wdHlTdXJ2ZXk6IFwiRGV0IGVyIGluZ2VuIHN5bmxpZyBzaWRlIGVsbGVyIHNww7hyc23DpWwgaSB1bmRlcnPDuGtlbHNlbi5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJUYWtrIGZvciBhdCBkdSBmdWxsZsO4cnRlIHVuZGVyc8O4a2Vsc2VuIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiVsOlcmUgZGF0YSB2aXNlciBhdCBkdSBhbGxlcmVkZSBoYXIgZ2plbm5vbWbDuHJ0IGRlbm5lIHVuZGVyc8O4a2Vsc2VuLlwiLFxuICBsb2FkaW5nU3VydmV5OiBcIlVuZGVyc8O4a2Vsc2VuIGxhc3Rlci4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJWZWxnLi4uXCIsXG4gIHZhbHVlOiBcInZlcmRpXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiVmVubmxpZ3N0IHN2YXIgcMOlIHNww7hyc23DpWxldC5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwiVmVubmxpZ3N0IHN2YXIgcMOlIG1pbnN0IGV0dCBzcMO4cnNtw6VsLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIlZlbm5saWdzdCBzdmFyIHDDpSBzcMO4cnNtw6VsIGkgYWxsZSByYWRlci5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIlZlcmRpZW4gc2thbCB2w6ZyZSBudW1lcmlzay5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJWZW5ubGlnc3Qgc2tyaXYgaW5uIG1pbnN0IHswfSB0ZWduLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIlZlbm5saWdzdCBza3JpdiBpbm4gbWluZHJlIGVubiB7MH0gdGVnbi5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCJWZW5ubGlnc3Qgc2tyaXYgaW5uIG1lciBlbm4gezB9IG9nIG1pbmRyZSBlbm4gezF9IHRlZ24uXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiVmVubmxpZ3N0IGZ5bGwgaW5uIG1pbnN0IHswfSByYWRlci5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiVmVubmxpZ3N0IHZlbGcgbWluc3QgezB9IHZhcmlhbnRlci5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiVmVubmxpZ3N0IGlra2UgdmVsZyBtZXIgZW5uIHswfSB2YXJpYW50ZXIuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCInezB9JyBiw7hyIHbDpnJlIGxpayBlbGxlciBtZXIgZW5uIHsxfSBvZyBsaWsgZWxsZXIgbWluZHJlIGVubiB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyBiw7hyIHbDpnJlIGxpayBlbGxlciBtZXIgZW5uIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIid7MH0nIGLDuHIgdsOmcmUgbGlrIGVsbGVyIG1pbmRyZSBlbm4gezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJWZW5ubGlnc3Qgc2tyaXYgaW5uIGVuIGd5bGRpZyBlLXBvc3QgYWRyZXNzZS5cIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwiVXR0cnlra2V0OiB7MH0gc2thbCByZXR1cm5lcmUgJ3NhbnQnLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiRm9yZXNww7hyc2VsZW4gcmV0dXJuZXJ0ZSBmZWlsZW4gJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCJGb3Jlc3DDuHJzZWxlbiByZXR1cm5lcnRlIHRvbW1lIGRhdGEsIGVsbGVyICdzdGknIC1lZ2Vuc2thcGVuIGVyIGZlaWxcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJGaWxzdMO4cnJlbHNlbiBiw7hyIGlra2Ugb3ZlcnN0aWdlIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIlZlbm5saWdzdCBza3JpdiBpbm4gZGVuIGFuZHJlIHZlcmRpZW4uXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCJGaWxlbiBkaW4gbGFzdGVzIG9wcC4gVmVubmxpZ3N0IHZlbnQgbm9lbiBzZWt1bmRlciBvZyBwcsO4diBpZ2plbi5cIixcbiAgbG9hZGluZ0ZpbGU6IFwiTGFzdGVyIGlubiAuLi5cIixcbiAgY2hvb3NlRmlsZTogXCJWZWxnIGZpbCAoZXIpIC4uLlwiLFxuICBub0ZpbGVDaG9zZW46IFwiSW5nZW4gZmlsIHZhbGd0XCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiw5huc2tlciBkdSDDpSBzbGV0dGUgcG9zdGVuP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIkRlbm5lIHZlcmRpZW4gc2thbCB2w6ZyZSB1bmlrLlwiLFxuICBhZGRDb2x1bW46IFwiTGVnZyB0aWwga29sb25uZVwiLFxuICBhZGRSb3c6IFwiTGVnZyB0aWwgcmFkXCIsXG4gIHJlbW92ZVJvdzogXCJGamVyblwiLFxuICBhZGRQYW5lbDogXCJMZWdnIHRpbCBueVwiLFxuICByZW1vdmVQYW5lbDogXCJGamVybmVcIixcbiAgY2hvaWNlc19JdGVtOiBcImVsZW1lbnRcIixcbiAgbWF0cml4X2NvbHVtbjogXCJLb2xvbm5lXCIsXG4gIG1hdHJpeF9yb3c6IFwiUmFkXCIsXG4gIHNhdmluZ0RhdGE6IFwiUmVzdWx0YXRlbmUgbGFncmVzIHDDpSBzZXJ2ZXJlbiAuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIkRldCBvcHBzdG8gZW4gZmVpbCwgb2cgdmkga3VubmUgaWtrZSBsYWdyZSByZXN1bHRhdGVuZS5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiUmVzdWx0YXRlbmUgYmxlIGxhZ3JldCFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIlByw7h2IGlnamVuXCIsXG4gIHRpbWVyTWluOiBcIm1pblwiLFxuICB0aW1lclNlYzogXCJzZWtcIixcbiAgdGltZXJTcGVudEFsbDogXCJEdSBoYXIgdGlsYnJha3QgezB9IHDDpSBkZW5uZSBzaWRlbiBvZyB7MX0gdG90YWx0LlwiLFxuICB0aW1lclNwZW50UGFnZTogXCJEdSBoYXIgdGlsYnJha3QgezB9IHDDpSBkZW5uZSBzaWRlbi5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCJEdSBoYXIgdGlsYnJha3QgezB9IHRvdGFsdC5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcIkR1IGhhciB0aWxicmFrdCB7MH0gYXYgezF9IHDDpSBkZW5uZSBzaWRlbiBvZyB0b3RhbHQgezJ9IGF2IHszfS5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiRHUgaGFyIHRpbGJyYWt0IHswfSBhdiB7MX0gcMOlIGRlbm5lIHNpZGVuLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIkR1IGhhciB0aWxicmFrdCB7MH0gYXYgezF9IHRvdGFsdC5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIlJlbnNcIixcbiAgY2xlYXJDYXB0aW9uOiBcIktsYXJcIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwiVmVsZyBGaWxcIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwiRmplcm4gZGVubmUgZmlsZW5cIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCJKYVwiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwiTmVpXCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcIkVyIGR1IHNpa2tlciBww6UgYXQgZHUgdmlsIGZqZXJuZSBkZW5uZSBmaWxlbjogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwiRXIgZHUgc2lra2VyIHDDpSBhdCBkdSB2aWwgZmplcm5lIGFsbGUgZmlsZW5lP1wiLFxuICBxdWVzdGlvblRpdGxlUGF0dGVyblRleHQ6IFwiU3DDuHJzbcOlbHN0aXR0ZWxcIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wibm9cIl0gPSBub3J3ZWdpYW5TdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wibm9cIl0gPSBcIm5vcnNrXCI7XG4iLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIHBlcnNpYW5TdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwi2YLYqNmE24xcIixcbiAgcGFnZU5leHRUZXh0OiBcItio2LnYr9uMXCIsXG4gIGNvbXBsZXRlVGV4dDogXCLYqtqp2YXbjNmEXCIsXG4gIHByZXZpZXdUZXh0OiBcItm+24zYtCDZhtmF2KfbjNi0XCIsXG4gIGVkaXRUZXh0OiBcItmI24zYsdin24zYtFwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwi2LTYsdmI2LlcIixcbiAgb3RoZXJJdGVtVGV4dDogXCLYr9uM2q/YsSjYqtmI2LbbjNitKVwiLFxuICBub25lSXRlbVRleHQ6IFwi2YfbjNqGXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcItin2YbYqtiu2KfYqCDZh9mF2YdcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIti12YHYrdmHIHswfSDYp9iyIHsxfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwi2YXZiNix2K8gezB9INin2LIgezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCLYqti52K/Yp9ivINm+2KfYs9iuIHswfS97MX0g2LPZiNin2YRcIixcbiAgZW1wdHlTdXJ2ZXk6IFwi2LXZgdit2Ycg2KfbjCDbjNinINqv2LLbjNmG2Ycg2KfbjCDYqNix2KfbjCDYp9uM2YYg2b7Ysdiz2LTZhtin2YXZhyDZhdmI2KzZiNivINmG24zYs9iqLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcItin2LIg2LTZhdinINio2KfYqNiqINiq2qnZhduM2YQg2KfbjNmGINm+2LHYs9i02YbYp9mF2Ycg2YXYqti02qnYsduM2YVcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcItio2Ycg2YbYuNixINmF24wg2LHYs9ivINmH2YUg2YfZhSDYp9qp2YbZiNmGINm+2LHYs9i02YbYp9mF2Ycg2LHYpyDYqtqp2YXbjNmEINqp2LHYr9mHINin24zYry5cIixcbiAgbG9hZGluZ1N1cnZleTogXCLYr9ix2K3Yp9mEINin24zYrNin2K8g2b7Ysdiz2LTZhtin2YXZh1wiLFxuICBvcHRpb25zQ2FwdGlvbjogXCLYp9mG2KrYrtin2Kgg2qnZhtuM2K8uLi5cIixcbiAgdmFsdWU6IFwi2YXZgtiv2KfYsVwiLFxuICByZXF1aXJlZEVycm9yOiBcItmE2LfZgdinINio2Ycg2LPZiNin2YQg2b7Yp9iz2K4g2K/Zh9uM2K9cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwi2YTYt9mB2Kcg2K3Yr9in2YLZhCDYqNmHINuM2qkg2LPZiNin2YQg2b7Yp9iz2K4g2K/Zh9uM2K8uXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwi2YTYt9mB2Kcg2LPZiNin2YTYp9iqINiq2YXYp9mFINiz2LfYsdmH2Kcg2LHYpyDZvtin2LPYriDYr9mH24zYry5cIixcbiAgbnVtZXJpY0Vycm9yOiBcItmF2YLYr9in2LEg2KjYp9uM2K8g2LnYr9iv24wg2KjYp9i02K9cIixcbiAgdGV4dE1pbkxlbmd0aDogXCLZhNi32YHYpyDYrdiv2KfZgtmEICB7MH0g2K3YsdmBINmI2KfYsdivINqp2YbbjNivXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwi2YTYt9mB2Kcg2qnZhdiq2LEg2KfYsiAgezB9INit2LHZgSDZiNin2LHYryDaqdmG24zYry5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCLZhNi32YHYpyDYqNuM2LTYqtixINin2LIgIHswfSDYrdix2YEg2Ygg2qnZhdiq2LEg2KfYsiB7MX0g2K3YsdmBINmI2KfYsdivINqp2YbbjNivLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcItmE2LfZgdinINit2K/Yp9mC2YQgezB9INiz2LfYsSDZiNin2LHYryDaqdmG24zYry5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwi2K3Yr9in2YLZhCB7MH0g2KfZhtiq2K7Yp9ioINqp2YbbjNivLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCLZhNi32YHYpyDYqNuM2LTYqtixINin2LIgIHswfSDYp9mG2KrYrtin2Kgg2qnZhtuM2K8uXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICBcIid7MH0nINio2KfbjNivINio24zZhiB7MX0g2YggezJ9INio2KfYtNivXCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScg2KjYstix2q/YqtixINmF2LPYp9mI24wgezF9INio2KfYtNivXCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScg2KjYp9uM2K8g2qnZiNqG2qnYqtixINuM2Kcg2YXYs9in2YjbjCB7MX0g2KjYp9i02K9cIixcbiAgaW52YWxpZEVtYWlsOiBcItmE2LfZgdinINin24zZhduM2YQg2LXYrduM2K0g2K/YsdisINqp2YbbjNivXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIti52KjYp9ix2Ko6IHswfSDZvtin2LPYriDYqNin24zYryAndHJ1ZScg2KjYp9i02K8uXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCLYr9ix2K7ZiNin2LPYqiDYqNinINiu2LfYpyDYsdmI2KjYsdmIINi02K86ICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgXCLYr9ix2K7ZiNin2LPYqiDZhdiz24zYsduMINiu2KfZhNuMINio2KfYstqv2LTYqiDYr9in2K/ZhyDbjNinINmF2LPbjNixINiv2LHYs9iqINiq2YbYuNuM2YUg2YbYtNiv2YdcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCLYqNuM2LTYqtix24zZhiDYrdis2YUg2YXYrNin2LIg2YHYp9uM2YQ6IHswfVwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwi2YXZgtiv2KfYsSAn2K/bjNqv2LEnINix2Kcg2YjYp9ix2K8g2qnZhtuM2K9cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgIFwi2YHYp9uM2YQg2K/YsSDYrdin2YQg2KLbjNmE2YjYryDYp9iz2KouINmE2LfZgdinINi12KjYsSDaqdmG24zYry5cIixcbiAgbG9hZGluZ0ZpbGU6IFwi2KjYp9ix2q/bjNix24wuLi5cIixcbiAgY2hvb3NlRmlsZTogXCLYp9mG2KrYrtin2Kgg2YHYp9uM2YQo2YfYpykuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcItmH24zahiDZgdin24zZhNuMINin2YbYqtiu2KfYqCDZhti02K/Zh1wiLFxuICBjb25maXJtRGVsZXRlOiBcItii24zYpyDZhdin24zZhCDYqNmHINit2LDZgSDYp9uM2YYg2LHYr9uM2YEg2YfYs9iq24zYr9ifXCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwi2KfbjNmGINmF2YLYr9in2LEg2KjYp9uM2K8g2LrbjNixINiq2qnYsdin2LHbjCDYqNin2LTYr1wiLFxuICBhZGRDb2x1bW46IFwi2LPYqtmI2YYg2KzYr9uM2K9cIixcbiAgYWRkUm93OiBcItiz2LfYsSDYrNiv24zYr1wiLFxuICByZW1vdmVSb3c6IFwi2K3YsNmBXCIsXG4gIGFkZFBhbmVsOiBcItis2K/bjNivXCIsXG4gIHJlbW92ZVBhbmVsOiBcItit2LDZgVwiLFxuICBjaG9pY2VzX0l0ZW06IFwi2KLbjNiq2YVcIixcbiAgbWF0cml4X2NvbHVtbjogXCLYs9iq2YjZhlwiLFxuICBtYXRyaXhfcm93OiBcItiz2LfYsVwiLFxuICBzYXZpbmdEYXRhOiBcItmG2KrYp9uM2Kwg2K/YsSDYrdin2YQg2LDYrtuM2LHZhyDYs9in2LLbjCDYr9ixINiz2LHZiNixINin2LPYqlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwi2K7Yt9in24zbjCDYr9ixINiw2K7bjNix2Ycg2LPYp9iy24wg2YbYqtin24zYrCDYsdiuINiv2KfYr9mHINin2LPYqlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCLZhtiq2KfbjNisINio2Kcg2YXZiNmB2YLbjNiqINiw2K7bjNix2Ycg2LTYr1wiLFxuICBzYXZlQWdhaW5CdXR0b246IFwi2YXYrNiv2K8g2KrZhNin2LQg2qnZhtuM2K9cIixcbiAgdGltZXJNaW46IFwi2K/ZgtuM2YLZh1wiLFxuICB0aW1lclNlYzogXCLYq9in2YbbjNmHXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwi2LTZhdinINmF2K/YqiB7MH0g2K/YsSDYp9uM2YYg2LXZgdit2Ycg2Ygg2YXYr9iqIHsxfSDYsdinINiv2LEg2YXYrNmF2YjYuSDYs9m+2LHbjCDaqdix2K/ZhyDYp9uM2K8uXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIti02YXYpyDZhdiv2KogezB9INix2Kcg2K/YsSDYp9uM2YYg2LXZgdit2Ycg2LPZvtix24wg2qnYsdiv2Ycg2KfbjNivLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIti02YXYpyDZhdiv2KogezB9INix2Kcg2K/YsSDZhdis2YXZiNi5INiz2b7YsduMINqp2LHYr9mHINin24zYry5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcIti02YXYpyDZhdiv2KogezB9INin2LIgezF9INiv2LEg2KfbjNmGINi12YHYrdmHINmIINmF2K/YqiB7Mn0g2KfYsiB7M30g2LHYpyDYr9ixINmF2KzZhdmI2Lkg2LPZvtix24wg2qnYsdiv2Ycg2KfbjNivLlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCLYtNmF2Kcg2YXYr9iqIHswfSDYp9iyIHsxfSDYsdinINiv2LEg2KfbjNmGINi12YHYrdmHINiz2b7YsduMINqp2LHYr9mHINin24zYry5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCLYtNmF2Kcg2YXYr9iqIHswfSDYp9iyIHsxfSDYsdinINiv2LEg2YXYrNmF2YjYuSDYs9m+2LHbjCDaqdix2K/ZhyDYp9uM2K8uXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCLZvtin2qnYs9in2LLbjFwiLFxuICBjbGVhckNhcHRpb246IFwi2K7Yp9mE24wg2qnYsdiv2YZcIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwi2KfZhtiq2K7Yp9ioINmB2KfbjNmEXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcItit2LDZgSDYp9uM2YYg2YHYp9uM2YRcIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCLYqNmE2YdcIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcItiu24zYsVwiLFxuICBjb25maXJtUmVtb3ZlRmlsZTogXCLYotuM2Kcg2YXbjNiu2YjYp9mH24zYryDYp9uM2YYg2YHYp9uM2YQg2LHYpyDZvtin2qkg2qnZhtuM2K86IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcItii24zYpyDZhduM2K7ZiNin2YfbjNivINiq2YXYp9mFINmB2KfbjNmEINmH2Kcg2LHYpyDZvtin2qkg2qnZhtuM2K8/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCLYudmG2YjYp9mGINiz2YjYp9mEXCIsXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImZhXCJdID0gcGVyc2lhblN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJmYVwiXSA9IFwi2YHYp9ix2ZLYs9mQ2YlcIjtcbiIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgcG9saXNoU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIldzdGVjelwiLFxuICBwYWdlTmV4dFRleHQ6IFwiRGFsZWpcIixcbiAgY29tcGxldGVUZXh0OiBcIkdvdG93ZVwiLFxuICBwcmV2aWV3VGV4dDogXCJQcmVtaWVyYVwiLFxuICBlZGl0VGV4dDogXCJFZHljamFcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIlN0YXJ0XCIsXG4gIG90aGVySXRlbVRleHQ6IFwiSW5uYSBvZHBvd2llZMW6ICh3cGlzeilcIixcbiAgbm9uZUl0ZW1UZXh0OiBcIkJyYWtcIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwiV3liaWVyeiB3c3p5c3RraWVcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlN0cm9uYSB7MH0geiB7MX1cIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcIlphcGlzIHswfSB6IHsxfVwiLFxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwiT2Rwb3dpZWR6aSBuYSB7MH0vezF9IHB5dGFuaWFcIixcbiAgZW1wdHlTdXJ2ZXk6IFwiTmllIG1hIHdpZG9jem55Y2ggcHl0YcWELlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIkR6acSZa3VqZW15IHphIHd5cGXFgm5pZW5pZSBhbmtpZXR5IVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiWiBuYXN6eWNoIHphcGlzw7N3IHd5bmlrYSwgxbxlIHd5cGXFgm5pxYJlxZsganXFvCB0xJkgYW5raWV0xJkuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiVHJ3YSB3Y3p5dHl3YW5pZSBhbmtpZXR5Li4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIld5YmllcnouLi5cIixcbiAgdmFsdWU6IFwiV2FydG/Fm8SHXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiUHJvc3rEmSBvZHBvd2llZHppZcSHIG5hIHRvIHB5dGFuaWUuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIlByb3N6xJkgb2Rwb3dpZWR6aWXEhyBuYSBjbyBuYWptbmllaiBqZWRubyBweXRhbmllLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIlByb3N6xJkgb2Rwb3dpZWR6aWXEhyBuYSB3c3p5c3RraWUgcHl0YW5pYS5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIlcgdHltIHBvbHUgbW/FvG5hIHdwaXNhxIcgdHlsa28gbGljemJ5LlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIlByb3N6xJkgd3Bpc2HEhyBjbyBuYWptbmllaiB7MH0gem5ha8Ozdy5cIixcbiAgdGV4dE1heExlbmd0aDogXCJQcm9zesSZIHdwaXNhxIcgbW5pZWogbmnFvCB7MH0gem5ha8Ozdy5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCJQcm9zesSZIHdwaXNhxIcgd2nEmWNlaiBuacW8IHswfSBpIG1uaWVqIG5pxbwgezF9IHpuYWvDs3cuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiUHJvc3rEmSB1enVwZcWCbmnEhyBwcnp5bmFqbW5pZWogezB9IHdpZXJzenkuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlByb3N6xJkgd3licmHEhyBjbyBuYWptbmllaiB7MH0gcG96eWNqaS5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiUHJvc3rEmSB3eWJyYcSHIG5pZSB3acSZY2VqIG5pxbwgezB9IHBvenljamkuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCJPZHBvd2llZMW6ICd7MH0nIHBvd2lubmEgYnnEhyB3acSZa3N6YSBsdWIgcsOzd25hIHsxfSBvcmF6IG1uaWVqc3phIGx1YiByw7N3bmEgezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiT2Rwb3dpZWTFuiAnezB9JyBwb3dpbm5hIGJ5xIcgd2nEmWtzemEgbHViIHLDs3duYSB7MX1cIixcbiAgbnVtZXJpY01heDogXCJPZHBvd2llZMW6ICd7MH0nIHBvd2lubmEgYnnEhyBtbmllanN6YSBsdWIgcsOzd25hIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiUHJvc3rEmSBwb2RhxIcgcHJhd2lkxYJvd3kgYWRyZXMgZW1haWwuXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIld5cmHFvGVuaWU6IHswfSBwb3dpbm5vIHdyYWNhxIcgJ3ByYXdkeml3ZScuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCLFu8SFZGFuaWUgendyw7NjacWCbyBixYLEhWQgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCLFu8SFZGFuaWUgbmllIHp3csOzY2nFgm8gZGFueWNoIGFsYm8gxZtjaWXFvGthIGplc3QgbmllcHJhd2lkxYJvd2FcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJSb3ptaWFyIHByemVzxYJhbmVnbyBwbGlrdSBuaWUgbW/FvGUgcHJ6ZWtyYWN6YcSHIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIlByb3N6xJkgcG9kYcSHIGlubsSFIG9kcG93aWVkxbouXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCJUcndhIHByemVub3N6ZW5pZSBUd29qZWdvIHBsaWt1LCBwcm9zesSZIHNwcsOzYm93YcSHIHBvbm93bmllIHphIGtpbGthIHNla3VuZC5cIixcbiAgbG9hZGluZ0ZpbGU6IFwixYFhZG93YW5pZS4uLlwiLFxuICBjaG9vc2VGaWxlOiBcIld5YmllcnogcGxpayhpKS4uLlwiLFxuICBub0ZpbGVDaG9zZW46IFwiTmllIHd5YnJhbm8gxbxhZG5lZ28gcGxpa3VcIixcbiAgY29uZmlybURlbGV0ZTogXCJDaGNlc3ogc2thc293YcSHIG5hZ3JhbmllP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIlRhIHdhcnRvxZvEhyBwb3dpbm5hIGJ5xIcgd3lqxIV0a293YS5cIixcbiAgYWRkQ29sdW1uOiBcIkRvZGFqIGtvbHVtbsSZXCIsXG4gIGFkZFJvdzogXCJEb2RhaiB3aWVyc3pcIixcbiAgcmVtb3ZlUm93OiBcIlVzdcWEXCIsXG4gIGFkZFBhbmVsOiBcIkRvZGFqIHBhbmVsXCIsXG4gIHJlbW92ZVBhbmVsOiBcIlVzdcWEXCIsXG4gIGNob2ljZXNfSXRlbTogXCJlbGVtZW50XCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiS29sdW1uYVwiLFxuICBtYXRyaXhfcm93OiBcIldpZXJzelwiLFxuICBzYXZpbmdEYXRhOiBcIlphcGlzdWrEmSB3eW5pa2kgYW5raWV0eSBuYSBzZXJ3ZXJ6ZS4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiV3lzdMSFcGnFgiBixYLEhWQgaSB3eW5pa2kgbmllIG1vZ8WCeSB6b3N0YcSHIHphcGlzYW5lLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJXeW5pa2kgem9zdGHFgnkgcG9wcmF3bmllIHphcGlzYW5lIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiU3Byw7NidWogcG9ub3duaWVcIixcbiAgdGltZXJNaW46IFwibWluXCIsXG4gIHRpbWVyU2VjOiBcInNla1wiLFxuICB0aW1lclNwZW50QWxsOiBcIlNwxJlkemnFgmXFmyB7MH0gbmEgdGVqIHN0cm9uaWUgYSB3IHN1bWllIHsxfS5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiU3DEmWR6acWCZcWbIHswfSBuYSB0ZWogc3Ryb25pZS5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCJTcMSZZHppxYJlxZsgdyBzdW1pZSB7MH0uXCIsXG4gIHRpbWVyTGltaXRBbGw6IFwiU3DEmWR6acWCZcWbIHswfSB6IHsxfSBuYSB0ZWogc3Ryb25pZSBhIHcgc3VtaWUgezJ9IHogezN9LlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCJTcMSZZHppxYJlxZsgezB9IHogezF9IG5hIHRlaiBzdHJvbmllXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiU3DEmWR6acWCZcWbIHswfSB6IHsxfS5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIld5Y3p5xZvEh1wiLFxuICBjbGVhckNhcHRpb246IFwiSmFzbmVcIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwiV3liaWVyeiBwbGlrXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIlVzdcWEIHRlbiBwbGlrXCIsXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwiVGFrXCIsXG4gIGJvb2xlYW5VbmNoZWNrZWRMYWJlbDogXCJOaWVcIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwiSmVzdGXFmyBwZXdpZW4sIMW8ZSBjaGNlc3ogdXN1bsSFxIcgdGVuIHBsaWs6IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIkplc3RlxZsgcGV3aWVuLCDFvGUgY2hjZXN6IHVzdW7EhcSHIHdzenlzdGtpZSBwbGlraT9cIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcIlR5dHXFgiBweXRhbmlhXCIsXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcInBsXCJdID0gcG9saXNoU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcInBsXCJdID0gXCJwb2xza2lcIjtcbiIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgcG9ydHVndWVzZUJyU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIkFudGVyaW9yXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJQcsOzeGltb1wiLFxuICBjb21wbGV0ZVRleHQ6IFwiRmluYWxpemFyXCIsXG4gIHByZXZpZXdUZXh0OiBcIlByw6ktdmlzdWFsaXphw6fDo29cIixcbiAgZWRpdFRleHQ6IFwiRWRpdGFyXCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCJDb21lw6dhclwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIk91dHJvcyAoZGVzY3JldmVyKVwiLFxuICBub25lSXRlbVRleHQ6IFwiTmVuaHVtXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIlNlbGVjaW9uYXIgVG9kb3NcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlDDoWdpbmEgezB9IGRlIHsxfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwiUmVnaXN0cm8gezB9IGRlIHsxfVwiLFxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwiUmVzcG9zdGFzIHswfS97MX0gcGVyZ3VudGFzXCIsXG4gIGVtcHR5U3VydmV5OiBcIk7Do28gaMOhIHDDoWdpbmEgdmlzw612ZWwgb3UgcGVyZ3VudGEgbmEgcGVzcXVpc2EuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiT2JyaWdhZG8gcG9yIGZpbmFsaXphciBhIHBlc3F1aXNhIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiTm9zc29zIHJlZ2lzdHJvcyBtb3N0cmFtIHF1ZSB2b2PDqiBqw6EgZmluYWxpem91IGEgcGVzcXVpc2EuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiQSBwZXNxdWlzYSBlc3TDoSBjYXJyZWdhbmRvLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIlNlbGVjaW9uZS4uLlwiLFxuICB2YWx1ZTogXCJ2YWxvclwiLFxuICByZXF1aXJlZEVycm9yOiBcIlBvciBmYXZvciwgcmVzcG9uZGEgYSBwZXJndW50YS5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwiUG9yIGZhdm9yLCByZXNwb25kYSBwZWxvIG1lbm9zIHVtYSBwZXJndW50YS5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjpcbiAgICBcIlBvciBmYXZvciwgcmVzcG9uZGEgYXMgcGVyZ3VudGFzIGVtIHRvZGFzIGFzIGxpbmhhcy5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIk8gdmFsb3IgZGV2ZSBzZXIgbnVtw6lyaWNvLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIlBvciBmYXZvciwgaW5zaXJhIHBlbG8gbWVub3MgezB9IGNhcmFjdGVyZXMuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiUG9yIGZhdm9yLCBpbnNpcmEgbWVub3MgZGUgezB9IGNhcmFjdGVyZXMuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiUG9yIGZhdm9yLCBpbnNpcmEgbWFpcyBkZSB7MH0gZSBtZW5vcyBkZSB7MX0gY2FyYWN0ZXJlcy5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJQcmVlbmNoYSBwZWxvIG1lbm9zIHswfSBsaW5oYXMuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlNlbGVjaW9uZSBwZWxvIG1lbm9zIHswfSBvcMOnw7Vlcy5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiUG9yIGZhdm9yLCBzZWxlY2lvbmUgbsOjbyBtYWlzIGRvIHF1ZSB7MH0gb3DDp8O1ZXMuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCJPICd7MH0nIGRldmUgc2VyIGlndWFsIG91IHN1cGVyaW9yIGEgezF9IGUgaWd1YWwgb3UgbWVub3IgcXVlIHsyfVwiLFxuICBudW1lcmljTWluOiBcIk8gJ3swfScgZGV2ZSBzZXIgaWd1YWwgb3Ugc3VwZXJpb3IgYSB7MX1cIixcbiAgbnVtZXJpY01heDogXCJPICd7MH0nIGRldmUgc2VyIGlndWFsIG91IGluZmVyaW9yIGEgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJQb3IgZmF2b3IsIGluZm9ybWUgdW0gZS1tYWlsIHbDoWxpZG8uXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIkEgZXhwcmVzc8OjbzogezB9IGRldmUgcmV0b3JuYXIgJ3ZlcmRhZGVpcm8nLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiQSByZXF1aXNpw6fDo28gcmV0b3Jub3UgbyBlcnJvICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwiQSByZXF1aXNpw6fDo28gbsOjbyByZXRvcm5vdSBkYWRvcyBvdSBvICdjYW1pbmhvJyBkYSByZXF1aXNpw6fDo28gbsOjbyBlc3TDoSBjb3JyZXRvXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiTyB0YW1hbmhvIGRvIGFycXVpdm8gbsOjbyBkZXZlIGV4Y2VkZXIgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiUG9yIGZhdm9yLCBpbmZvcm1lIG8gb3V0cm8gdmFsb3IuXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCJTZXUgYXJxdWl2byBlc3TDoSBzZW5kbyBjYXJyZWdhZG8uIFBvciBmYXZvciwgYWd1YXJkZSBhbGd1bnMgc2VndW5kb3MgZSB0ZW50ZSBub3ZhbWVudGUuXCIsXG4gIGxvYWRpbmdGaWxlOiBcIkNhcnJlZ2FuZG8uLi5cIixcbiAgY2hvb3NlRmlsZTogXCJTZWxlY2lvbmUgbyhzKSBhcnF1aXZvKHMpLi4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCJOZW5odW0gYXJxdWl2byBlc2NvbGhpZG9cIixcbiAgY29uZmlybURlbGV0ZTogXCJUZW0gY2VydGV6YSBxdWUgZGVzZWphIGRlbGV0YXI/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwiRXNzZSB2YWxvciBkZXZlIHNlciDDum5pY28uXCIsXG4gIGFkZENvbHVtbjogXCJBZGljaW9uYXIgY29sdW5hXCIsXG4gIGFkZFJvdzogXCJBZGljaW9uYXIgbGluaGFcIixcbiAgcmVtb3ZlUm93OiBcIlJlbW92ZXIgbGluaGFcIixcbiAgYWRkUGFuZWw6IFwiQWRpY2lvbmFyIG5vdm9cIixcbiAgcmVtb3ZlUGFuZWw6IFwiUmVtb3ZlclwiLFxuICBjaG9pY2VzX0l0ZW06IFwiaXRlbVwiLFxuICBtYXRyaXhfY29sdW1uOiBcIkNvbHVuYVwiLFxuICBtYXRyaXhfcm93OiBcIkxpbmhhXCIsXG4gIHNhdmluZ0RhdGE6IFwiT3MgcmVzdWx0YWRvcyBlc3RvIHNlbmRvIHNhbHZvcyBubyBzZXJ2aWRvci4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiT2NvcnJldSB1bSBlcnJvIGUgbsOjbyBmb2kgcG9zc8OtdmVsIHNhbHZhciBvcyByZXN1bHRhZG9zLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJPcyByZXN1bHRhZG9zIGZvcmFtIHNhbHZvcyBjb20gc3VjZXNzbyFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIlRlbnRlIG5vdmFtZW50ZVwiLFxuICB0aW1lck1pbjogXCJtaW5cIixcbiAgdGltZXJTZWM6IFwic2VnXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwiVm9jw6ogZ2FzdG91IHswfSBuZXN0YSBww6FnaW5hIGUgezF9IG5vIHRvdGFsLlwiLFxuICB0aW1lclNwZW50UGFnZTogXCJWb2PDqiBnYXN0b3UgezB9IG5lc3RhIHDDoWdpbmEuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwiVm9jw6ogZ2FzdG91IHswfSBubyB0b3RhbC5cIixcbiAgdGltZXJMaW1pdEFsbDogXCJWb2PDqiBnYXN0b3UgezB9IGRlIHsxfSBuZXN0YSBww6FnaW5hIGUgezJ9IGRlIHszfSBubyB0b3RhbC5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiVm9jw6ogZ2FzdG91IHswfSBkZSB7MX0gbmVzdGEgcMOhZ2luYS5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCJWb2PDqiBnYXN0b3UgezB9IGRlIHsxfSBubyB0b3RhbC5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIkxpbXBhclwiLFxuICBjbGVhckNhcHRpb246IFwiTGltcGFyXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcIkVzY29saGVyIGFycXVpdm9cIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwiUmVtb3ZlciBlc3RlIGFycXVpdm9cIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCJTaW1cIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcIk7Do29cIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwiVGVtIGNlcnRlemEgcXVlIGRlc2VqYSByZW1vdmVyIGVzdGUgYXJxdWl2bzogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwiVGVtIGNlcnRlemEgcXVlIGRlc2VqYSByZW1vdmVyIHRvZG9zIG9zIGFycXVpdm9zP1wiLFxuICBxdWVzdGlvblRpdGxlUGF0dGVyblRleHQ6IFwiVMOtdHVsbyBkYSBxdWVzdMOjb1wiLFxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJwdC1iclwiXSA9IHBvcnR1Z3Vlc2VCclN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJwdC1iclwiXSA9IFwicG9ydHVndcOqcyBicmFzaWxlaXJvXCI7XG4iLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIHBvcnR1Z3Vlc2VTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiQW50ZXJpb3JcIixcbiAgcGFnZU5leHRUZXh0OiBcIlByw7N4aW1vXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJGaW5hbGl6YXJcIixcbiAgcHJldmlld1RleHQ6IFwiUHLDqS12aXN1YWxpemHDp8Ojb1wiLFxuICBlZGl0VGV4dDogXCJFZGl0YXJcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIkNvbWXDp2FyXCIsXG4gIG90aGVySXRlbVRleHQ6IFwiT3V0cm9zIChkZXNjcmV2ZXIpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCJOZW5odW1cIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwiU2VsZWNpb25hciBUb2Rvc1wiLFxuICBwcm9ncmVzc1RleHQ6IFwiUMOhZ2luYSB7MH0gZGUgezF9XCIsXG4gIHBhbmVsRHluYW1pY1Byb2dyZXNzVGV4dDogXCJSZWdpc3RvIHswfSBkZSB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcIlJlc3Bvc3RhcyB7MH0vezF9IHBlcmd1bnRhc1wiLFxuICBlbXB0eVN1cnZleTogXCJOw6NvIGjDoSBww6FnaW5hIHZpc8OtdmVsIG91IHBlcmd1bnRhIG5vIHF1ZXN0aW9uw6FyaW8uXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiT2JyaWdhZG8gcG9yIGZpbmFsaXphciBvIHF1ZXN0aW9uw6FyaW8hXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgXCJPcyBub3Nzb3MgcmVnaXN0b3MgbW9zdHJhbSBxdWUgasOhIGZpbmFsaXpvdSBvIHF1ZXN0aW9uw6FyaW8uXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiTyBxdWVzdGlvbsOhcmlvIGVzdMOhIGEgY2FycmVnYXIuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiU2VsZWNpb25lLi4uXCIsXG4gIHZhbHVlOiBcInZhbG9yXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiUG9yIGZhdm9yLCByZXNwb25kYSDDoCBwZXJndW50YS5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwiUG9yIGZhdm9yLCByZXNwb25kYSBwZWxvIG1lbm9zIGEgdW1hIHBlcmd1bnRhLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOlxuICAgIFwiUG9yIGZhdm9yLCByZXNwb25kYSDDoHMgcGVyZ3VudGFzIGVtIHRvZGFzIGFzIGxpbmhhcy5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIk8gdmFsb3IgZGV2ZSBzZXIgbnVtw6lyaWNvLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIlBvciBmYXZvciwgaW5zaXJhIHBlbG8gbWVub3MgezB9IGNhcmFjdGVyZXMuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiUG9yIGZhdm9yLCBpbnNpcmEgbWVub3MgZGUgezB9IGNhcmFjdGVyZXMuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiUG9yIGZhdm9yLCBpbnNpcmEgbWFpcyBkZSB7MH0gZSBtZW5vcyBkZSB7MX0gY2FyYWN0ZXJlcy5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJQcmVlbmNoYSBwZWxvIG1lbm9zIHswfSBsaW5oYXMuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlNlbGVjaW9uZSBwZWxvIG1lbm9zIHswfSBvcMOnw7Vlcy5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiUG9yIGZhdm9yLCBzZWxlY2lvbmUgbm8gbcOheGltbyB7MH0gb3DDp8O1ZXMuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCJPICd7MH0nIGRldmUgc2VyIGlndWFsIG91IHN1cGVyaW9yIGEgezF9IGUgaWd1YWwgb3UgbWVub3IgcXVlIHsyfVwiLFxuICBudW1lcmljTWluOiBcIk8gJ3swfScgZGV2ZSBzZXIgaWd1YWwgb3Ugc3VwZXJpb3IgYSB7MX1cIixcbiAgbnVtZXJpY01heDogXCJPICd7MH0nIGRldmUgc2VyIGlndWFsIG91IGluZmVyaW9yIGEgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJQb3IgZmF2b3IsIGluc2lyYSB1bSBlLW1haWwgdsOhbGlkby5cIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwiQSBleHByZXNzw6NvOiB7MH0gZGV2ZSByZXRvcm5hciAndmVyZGFkZWlybycuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCJPIHBlZGlkbyByZXRvcm5vdSBvIGVycm8gJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCJPIHBlZGlkbyBuw6NvIHJldG9ybm91IGRhZG9zIG91IG8gJ2NhbWluaG8nIGRvIHBlZGlkbyBuw6NvIGVzdMOhIGNvcnJldG9cIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJPIHRhbWFuaG8gZG8gYXJxdWl2byBuw6NvIGRldmUgZXhjZWRlciB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJQb3IgZmF2b3IsIGluc2lyYSBvIG91dHJvIHZhbG9yLlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiTyBzZXUgZmljaGVpcm8gZXN0w6EgYSBjYXJyZWdhci4gUG9yIGZhdm9yLCBhZ3VhcmRlIGFsZ3VucyBzZWd1bmRvcyBlIHRlbnRlIG5vdmFtZW50ZS5cIixcbiAgbG9hZGluZ0ZpbGU6IFwiQSBjYXJyZWdhci4uLlwiLFxuICBjaG9vc2VGaWxlOiBcIlNlbGVjaW9uZSBvKHMpIGFycXVpdm8ocykuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcIk5lbmh1bSBmaWNoZWlybyBlc2NvbGhpZG9cIixcbiAgY29uZmlybURlbGV0ZTogXCJUZW0gYSBjZXJ0ZXphIHF1ZSBkZXNlamEgYXBhZ2FyP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIkVzdGUgdmFsb3IgZGV2ZSBzZXIgw7puaWNvLlwiLFxuICBhZGRDb2x1bW46IFwiQWRpY2lvbmFyIGNvbHVuYVwiLFxuICBhZGRSb3c6IFwiQWRpY2lvbmFyIGxpbmhhXCIsXG4gIHJlbW92ZVJvdzogXCJSZW1vdmVyIGxpbmhhXCIsXG4gIGFkZFBhbmVsOiBcIkFkaWNpb25hciBub3ZvXCIsXG4gIHJlbW92ZVBhbmVsOiBcIlJlbW92ZXJcIixcbiAgY2hvaWNlc19JdGVtOiBcIml0ZW1cIixcbiAgbWF0cml4X2NvbHVtbjogXCJDb2x1bmFcIixcbiAgbWF0cml4X3JvdzogXCJMaW5oYVwiLFxuICBzYXZpbmdEYXRhOiBcIk9zIHJlc3VsdGFkb3MgZXN0w6NvIGEgc2VyIGd1YXJkYWRvcyBubyBzZXJ2aWRvci4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiT2NvcnJldSB1bSBlcnJvIGUgbsOjbyBmb2kgcG9zc8OtdmVsIGd1YXJkYXIgb3MgcmVzdWx0YWRvcy5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiT3MgcmVzdWx0YWRvcyBmb3JhbSBndWFyZGFkb3MgY29tIHN1Y2Vzc28hXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJUZW50ZSBub3ZhbWVudGVcIixcbiAgdGltZXJNaW46IFwibWluXCIsXG4gIHRpbWVyU2VjOiBcInNlZ1wiLFxuICB0aW1lclNwZW50QWxsOiBcIlZvY8OqIGdhc3RvdSB7MH0gbmVzdGEgcMOhZ2luYSBlIHsxfSBubyB0b3RhbC5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiVm9jw6ogZ2FzdG91IHswfSBuZXN0YSBww6FnaW5hLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIlZvY8OqIGdhc3RvdSB7MH0gbm8gdG90YWwuXCIsXG4gIHRpbWVyTGltaXRBbGw6IFwiVm9jw6ogZ2FzdG91IHswfSBkZSB7MX0gbmVzdGEgcMOhZ2luYSBlIHsyfSBkZSB7M30gbm8gdG90YWwuXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIlZvY8OqIGdhc3RvdSB7MH0gZGUgezF9IG5lc3RhIHDDoWdpbmEuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiVm9jw6ogZ2FzdG91IHswfSBkZSB7MX0gbm8gdG90YWwuXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCJMaW1wYXJcIixcbiAgY2xlYXJDYXB0aW9uOiBcIkxpbXBhclwiLFxuICBjaG9vc2VGaWxlQ2FwdGlvbjogXCJFc2NvbGhlciBmaWNoZWlyb1wiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCJSZW1vdmVyIGVzdGUgZmljaGVpcm9cIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCJTaW1cIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcIk7Do29cIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwiVGVtIGEgY2VydGV6YSBxdWUgZGVzZWphIHJlbW92ZXIgZXN0ZSBmaWNoZWlybzogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwiVGVtIGEgY2VydGV6YSBxdWUgZGVzZWphIHJlbW92ZXIgdG9kb3Mgb3MgZmljaGVpcm9zP1wiLFxuICBxdWVzdGlvblRpdGxlUGF0dGVyblRleHQ6IFwiVMOtdHVsbyBkYSBxdWVzdMOjb1wiLFxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJwdFwiXSA9IHBvcnR1Z3Vlc2VTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wicHRcIl0gPSBcInBvcnR1Z3XDqnNcIjtcbiIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgcm9tYW5pYW5TdXJ2ZXlTdHJpbmdzOiBhbnkgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJQcmVjZWRlbnRcIixcbiAgcGFnZU5leHRUZXh0OiBcIlVybcSDdG9yXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJGaW5hbGl6YXJlXCIsXG4gIHByZXZpZXdUZXh0OiBcInByZXZpenVhbGl6YXJlXCIsXG4gIGVkaXRUZXh0OiBcIkVkaXRhyJtpXCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCJzdGFydFwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIkFsdHVsKHByZWNpemHFo2kpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCJOaWNpIHVudWxcIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwiU2VsZWN0ZWF6xIMgdG90XCIsXG4gIHByb2dyZXNzVGV4dDogXCJQYWdpbmEgezB9IGRpbiB7MX1cIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcIsOObnJlZ2lzdHJhcmUgezB9IGRpbiB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcIlLEg3NwdW5zdXJpIGxhIHswfSAvIHsxfSDDrm50cmVixINyaVwiLFxuICBlbXB0eVN1cnZleTogXCJOdSBzdW50IMOubnRyZWLEg3JpIHBlbnRydSBhY2VzdCBjaGVzdGlvbmFyXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiVsSDIG11bMWjdW1pbSBwZW50cnUgdGltcHVsIGFjb3JkYXQhXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgXCJEaW4gw65ucmVnaXN0csSDcmlsZSBub2FzdHJlIHJlaWVzZSBjxIMgYcibaSBjb21wbGV0YXQgZGVqYSBhY2VzdCBjaGVzdGlvbmFyLlwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkNoZXN0aW9uYXJ1bCBzZSDDrm5jYXJjxIMuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiQWxlZ2XFo2kuLi5cIixcbiAgdmFsdWU6IFwidmFsb2FyZVwiLFxuICByZXF1aXJlZEVycm9yOiBcIlLEg3NwdW5zdWwgbGEgYWNlYXN0xIMgw65udHJlYmFyZSBlc3RlIG9ibGlnYXRvcml1LlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJWxIMgcnVnxINtIHPEgyByxINzcHVuZGXIm2kgbGEgY2VsIHB1yJtpbiBvIMOubnRyZWJhcmUuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiVG9hdGUgcsSDc3B1bnN1cmlsZSBzdW50IG9ibGlnYXRvcmlpXCIsXG4gIG51bWVyaWNFcnJvcjogXCJSxINzcHVuc3VsIHRyZWJ1aWUgc8SDIGZpZSBudW1lcmljLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIlRyZWJ1aWUgc8SDIGludHJvZHVjZcibaSBtaW5pbSB7MH0gY2FyYWN0ZXJlLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIlRyZWJ1aWUgc8SDIGludHJvZHVjZcibaSBtYXhpbSB7MH0gY2FyYWN0ZXJlLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOlxuICAgIFwiVHJlYnVpZSBzxIMgaW50cm9kdWNlyJtpIG1haSBtdWx0IGRlIHswfSDImWkgbWFpIHB1yJtpbiBkZSB7MX0gY2FyYWN0ZXJlLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIlRyZWJ1aWUgc8SDIGNvbXBsZXRhyJtpIG1pbmltIHswfSByw6JuZHVyaS5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiVHJlYnVpZSBzxIMgc2VsZWN0YcibaSBtaW5pbSB7MH0gb3DFo2l1bmkuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIlRyZWJ1aWUgc8SDIHNlbGVjdGHIm2kgbWF4aW0gezB9IG9wxaNpdW5pLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiUsSDc3B1bnN1bCAnezB9JyB0cmVidWllIHPEgyBmaWUgbWFpIG1hcmUgc2F1IGVnYWwgY2EgezF9IMWfw64gbWFpIG1pYyBzYXUgZWdhbCBjdSB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCJSxINzcHVuc3VsICd7MH0nIHRyZWJ1aWUgc8SDIGZpZSBtYWkgbWFyZSBzYXUgZWdhbCBjYSB7MX1cIixcbiAgbnVtZXJpY01heDogXCJSxINzcHVuc3VsICd7MH0nIHRyZWJ1aWUgc8SDIGZpZSBtYWkgbWljIHNhdSBlZ2FsIGNhIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiVHJlYnVpZSBzxIMgaW50cm9kdWNlxaNpIG8gYWRyZXNhIGRlIGVtYWlsIHZhbGlkxIMuXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIkV4cHJlc2lhOiB7MH0gYXIgdHJlYnVpIHPEgyByZXR1cm5lemUg4oCeYWRldsSDcmF04oCdLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiUmVxdWVzdC11bCBhIHJldHVybmF0IGVyb2FyZWEgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCJSZXF1ZXN0LXVsIG51IGEgcmV0dXJuYXQgZGF0ZSBzYXUgcHJvcHJpZXRhdGVhICdwYXRoJyBlc3RlIGluY29yZWN0xINcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJEaW1lbnNpdW5lYSBmacWfaWVydWx1aSBudSB0cmVidWllIHPEgyBkZXDEg8WfZWFzY8SDIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIlRyZWJ1aWUgc8SDIGNvbXBsZXRhyJtpIGPDom1wdWwgJ0FsdHVsJy5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIkZpyJlpZXJ1bCBkdW1uZWF2b2FzdHLEgyBlc3RlIMOubiBjdXJzIGRlIMOubmPEg3JjYXJlLiBWxIMgcnVnxINtIGHImXRlcHRhyJtpIGPDonRldmEgc2VjdW5kZSDImWkgcmV2ZW5pyJtpIGFwb2kuXCIsXG4gIGxvYWRpbmdGaWxlOiBcIlNlIMOubmNhcmPEgy4uLlwiLFxuICBjaG9vc2VGaWxlOiBcIkFsZWdlIGZpc2llcmVsZS4uLlwiLFxuICBub0ZpbGVDaG9zZW46IFwiTmljaXVuIGZpyJlpZXIgYWxlc1wiLFxuICBjb25maXJtRGVsZXRlOiBcIlN1bnRlyJtpIHNpZ3VyIGPEgyBkb3JpyJtpIHPEgyDImXRlcmdlyJtpIMOubnJlZ2lzdHJhcmVhP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIlZhbG9hcmVhIHRyZWJ1aWUgc8SDIGZpZSB1bmljxIMuXCIsXG4gIGFkZENvbHVtbjogXCJBZMSDdWdhyJtpIGNvbG9hbsSDXCIsXG4gIGFkZFJvdzogXCJBZMSDdWdhcmUgcsOibmRcIixcbiAgcmVtb3ZlUm93OiBcIsiYdGVyZ2VyZVwiLFxuICBhZGRQYW5lbDogXCJBZMSDdWdhcmVcIixcbiAgcmVtb3ZlUGFuZWw6IFwiyJh0ZXJnZXJlXCIsXG4gIGNob2ljZXNfSXRlbTogXCJvcMibaXVuZVwiLFxuICBtYXRyaXhfY29sdW1uOiBcIkNvbG9hbsSDXCIsXG4gIG1hdHJpeF9yb3c6IFwiUsOibmRcIixcbiAgc2F2aW5nRGF0YTogXCJSZXp1bHRhdGVsZSBzdW50IMOubiBjdXJzIGRlIHNhbHZhcmUuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIkEgaW50ZXJ2ZW5pdCBvIGVyb2FyZSwgcmV6dWx0YXRlbGUgbnUgYXUgcHV0dXQgZmkgc2FsdmF0ZS5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiUmV6dWx0YXRlbGUgYXUgZm9zdCBzYWx2YXRlIGN1IHN1Y2NlcyFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIsOObmNlcmNhyJtpIGRpbiBub3VcIixcbiAgdGltZXJNaW46IFwibWluXCIsXG4gIHRpbWVyU2VjOiBcInNlY1wiLFxuICB0aW1lclNwZW50QWxsOiBcIkHIm2kgcGV0cmVjdXQgezB9IHBlIGFjZWFzdMSDIHBhZ2luxIMgyJlpIHsxfSDDrm4gdG90YWwuXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIkHIm2kgcGV0cmVjdXQgezB9IHBlIGFjZWFzdMSDIHBhZ2luxIMuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwiQcibaSBwZXRyZWN1dCB7MH0gw65uIHRvdGFsLlwiLFxuICB0aW1lckxpbWl0QWxsOlxuICAgIFwiQcibaSBwZXRyZWN1dCB7MH0gZGluIHsxfSBwZSBhY2Vhc3TEgyBwYWdpbsSDIMiZaSB7Mn0gZGluIHszfSDDrm4gdG90YWwuXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIkHIm2kgcGV0cmVjdXQgezB9IGRpbiB7MX0gcGUgYWNlYXN0xIMgcGFnaW7Egy5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCJByJtpIHBldHJlY3V0IHswfSBkaW4gezF9IMOubiB0b3RhbC5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIkN1cmF0XCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJjbGFyXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcIkFsZWdlIGZpyJlpZXJ1bFwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCJFbGltaW5hyJtpIGFjZXN0IGZpyJlpZXJcIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCJkYVwiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwiTnVcIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwiU2lndXIgZG9yacibaSBzxIMgZWxpbWluYcibaSBhY2VzdCBmaciZaWVyOiB7MH0/XCIsXG4gIGNvbmZpcm1SZW1vdmVBbGxGaWxlczogXCJTaWd1ciBkb3JpyJtpIHPEgyBlbGltaW5hyJtpIHRvYXRlIGZpyJlpZXJlbGU/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCJUaXRsdWwgaW50cmViYXJpaVwiLFxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJyb1wiXSA9IHJvbWFuaWFuU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcInJvXCJdID0gXCJyb23Dom7Eg1wiO1xuIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBydXNzaWFuU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcItCd0LDQt9Cw0LRcIixcbiAgcGFnZU5leHRUZXh0OiBcItCU0LDQu9C10LVcIixcbiAgY29tcGxldGVUZXh0OiBcItCT0L7RgtC+0LLQvlwiLFxuICBwcmV2aWV3VGV4dDogXCLQn9GA0LXQtNCy0LDRgNC40YLQtdC70YzQvdGL0Lkg0L/RgNC+0YHQvNC+0YLRgFwiLFxuICBlZGl0VGV4dDogXCLQoNC10LTQsNC60YLQuNGA0L7QstCw0L3QuNC1XCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCLQndCw0YfQsNGC0YxcIixcbiAgb3RoZXJJdGVtVGV4dDogXCLQlNGA0YPQs9C+0LUgKNC/0L7QttCw0LvRg9C50YHRgtCwLCDQvtC/0LjRiNC40YLQtSlcIixcbiAgbm9uZUl0ZW1UZXh0OiBcItCd0LXRglwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCLQktGL0LHRgNCw0YLRjCDQstGB0ZFcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcItCh0YLRgNCw0L3QuNGG0LAgezB9INC40LcgezF9XCIsXG4gIHBhbmVsRHluYW1pY1Byb2dyZXNzVGV4dDogXCLQl9Cw0L/QuNGB0YwgezB9INC40LcgezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCLQntGC0LLQtdGC0Ysg0L3QsCB7MH0vezF90LLQvtC/0YDQvtGB0YtcIixcbiAgZW1wdHlTdXJ2ZXk6IFwi0J3QtdGCINC90Lgg0L7QtNC90L7Qs9C+INCy0L7Qv9GA0L7RgdCwLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcItCR0LvQsNCz0L7QtNCw0YDQuNC8INCS0LDRgSDQt9CwINC30LDQv9C+0LvQvdC10L3QuNC1INCw0L3QutC10YLRiyFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcItCS0Ysg0YPQttC1INC/0YDQvtGF0L7QtNC40LvQuCDRjdGC0L7RgiDQvtC/0YDQvtGBLlwiLFxuICBsb2FkaW5nU3VydmV5OiBcItCX0LDQs9GA0YPQt9C60LAg0YEg0YHQtdGA0LLQtdGA0LAuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwi0JLRi9Cx0YDQsNGC0YwuLi5cIixcbiAgdmFsdWU6IFwi0LfQvdCw0YfQtdC90LjQtVwiLFxuICByZXF1aXJlZEVycm9yOiBcItCf0L7QttCw0LvRg9C50YHRgtCwLCDQvtGC0LLQtdGC0YzRgtC1INC90LAg0LLQvtC/0YDQvtGBLlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCLQn9C+0LbQsNC70YPQudGB0YLQsCwg0L7RgtCy0LXRgtGM0YLQtSDQv9C+INC60YDQsNC50L3QtdC5INC80LXRgNC1INC90LAg0L7QtNC40L0g0LLQvtC/0YDQvtGBLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcItCf0L7QttCw0LvRg9C50YHRgtCwLCDQvtGC0LLQtdGC0YzRgtC1INC90LAg0LLQvtC/0YDQvtGB0Ysg0LIg0LrQsNC20LTQvtC5INGB0YLRgNC+0LrQtS5cIixcbiAgbnVtZXJpY0Vycm9yOiBcItCe0YLQstC10YIg0LTQvtC70LbQtdC9INCx0YvRgtGMINGH0LjRgdC70L7QvC5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCLQn9C+0LbQsNC70YPQudGB0YLQsCDQstCy0LXQtNC40YLQtSDQsdC+0LvRjNGI0LUgezB9INGB0LjQvNCy0L7Qu9C+0LIuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwi0J/QvtC20LDQu9GD0LnRgdGC0LAg0LLQstC10LTQuNGC0LUg0LzQtdC90YzRiNC1IHswfSDRgdC40LzQstC+0LvQvtCyLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcItCf0L7QttCw0LvRg9C50YHRgtCwINCy0LLQtdC00LjRgtC1INCx0L7Qu9GM0YjQtSB7MH0g0Lgg0LzQtdC90YzRiNC1IHsxfSDRgdC40LzQstC+0LvQvtCyLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcItCf0L7QttCw0LvRg9C50YHRgtCwLCDQt9Cw0L/QvtC70L3QuNGC0LUg0L3QtSDQvNC10L3RjNGI0LUgezB9INGB0YLRgNC+0LouXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcItCf0L7QttCw0LvRg9C50YHRgtCwLCDQstGL0LHQtdGA0LjRgtC1INGF0L7RgtGPINCx0YsgezB9INCy0LDRgNC40LDQvdGC0L7Qsi5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwi0J/QvtC20LDQu9GD0LnRgdGC0LAsINCy0YvQsdC10YDQuNGC0LUg0L3QtSDQsdC+0LvQtdC1IHswfSDQstCw0YDQuNCw0L3RgtC+0LIuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCInezB9JyDQtNC+0LvQttC90L4g0LHRi9GC0Ywg0L3QtSDQvNC10L3RjNGI0LUg0YfQtdC8IHsxfSwg0Lgg0L3QtSDQsdC+0LvRjNGI0LUg0YfQtdC8IHsyfVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nINC00L7Qu9C20L3QviDQsdGL0YLRjCDQvdC1INC80LXQvdGM0YjQtSDRh9C10LwgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScg0LTQvtC70LbQvdC+INCx0YvRgtGMINC90LUg0LHQvtC70YzRiNC1INGH0LXQvCB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcItCf0L7QttCw0LvRg9C50YHRgtCwLCDQstCy0LXQtNC40YLQtSDQtNC10LnRgdGC0LLQuNGC0LXQu9GM0L3Ri9C5INCw0LTRgNC10YEg0Y3Qu9C10LrRgtGA0L7QvdC90L7QuSDQv9C+0YfRgtGLLlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCLQktGL0YDQsNC20LXQvdC40LUgezB9INC00L7Qu9C20L3QviDQstC+0LfQstGA0LDRidCw0YLRjCAndHJ1ZScuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCLQl9Cw0L/RgNC+0YEg0LLQtdGA0L3Rg9C7INC+0YjQuNCx0LrRgyAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcItCe0YLQstC10YIg0L3QsCDQt9Cw0L/RgNC+0YEg0L/RgNC40YjQtdC7INC/0YPRgdGC0L7QuSDQuNC70Lgg0YHQstC+0LnRgdGC0LLQviAncGF0aCcg0YPQutCw0LfQsNC90L4g0L3QtdCy0LXRgNC90L5cIixcbiAgZXhjZWVkTWF4U2l6ZTogXCLQoNCw0LfQvNC10YAg0YTQsNC50LvQsCDQvdC1INC00L7Qu9C20LXQvSDQv9GA0LXQstGL0YjQsNGC0YwgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwi0J/QvtC20LDQu9GD0LnRgdGC0LAsINCy0LLQtdC00LjRgtC1INC00LDQvdC90YvQtSDQsiDQv9C+0LvQtSAn0JTRgNGD0LPQvtC1J1wiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwi0JLQsNGIINGE0LDQudC7INC30LDQs9GA0YPQttCw0LXRgtGB0Y8uINCf0L7QtNC+0LbQtNC40YLQtSDQvdC10YHQutC+0LvRjNC60L4g0YHQtdC60YPQvdC0INC4INC/0L7Qv9GA0L7QsdGD0LnRgtC1INGB0L3QvtCy0LAuXCIsXG4gIGxvYWRpbmdGaWxlOiBcItCX0LDQs9GA0YPQt9C60LAuLi5cIixcbiAgY2hvb3NlRmlsZTogXCLQktGL0LHQtdGA0LjRgtC1INGE0LDQudC7KNGLKS4uLlwiLFxuICBub0ZpbGVDaG9zZW46IFwi0KTQsNC50Lsg0L3QtSDQstGL0LHRgNCw0L1cIixcbiAgY29uZmlybURlbGV0ZTogXCLQktGLINGC0L7Rh9C90L4g0YXQvtGC0LjRgtC1INGD0LTQsNC70LjRgtGMINC30LDQv9C40YHRjD9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCLQrdGC0L4g0LfQvdCw0YfQtdC90LjQtSDQtNC+0LvQttC90L4g0LHRi9GC0Ywg0YPQvdC40LrQsNC70YzQvdGL0LwuXCIsXG4gIGFkZENvbHVtbjogXCLQlNC+0LHQsNCy0LjRgtGMINC60L7Qu9C+0L3QutGDXCIsXG4gIGFkZFJvdzogXCLQlNC+0LHQsNCy0LjRgtGMINGB0YLRgNC+0LrRg1wiLFxuICByZW1vdmVSb3c6IFwi0KPQtNCw0LvQuNGC0YxcIixcbiAgYWRkUGFuZWw6IFwi0JTQvtCx0LDQstC40YLRjCDQvdC+0LLRg9GOXCIsXG4gIHJlbW92ZVBhbmVsOiBcItCj0LTQsNC70LjRgtGMXCIsXG4gIGNob2ljZXNfSXRlbTogXCLQktCw0YDQuNCw0L3RglwiLFxuICBtYXRyaXhfY29sdW1uOiBcItCa0L7Qu9C+0L3QutCwXCIsXG4gIG1hdHJpeF9yb3c6IFwi0KHRgtGA0L7QutCwXCIsXG4gIHNhdmluZ0RhdGE6IFwi0KDQtdC30YPQu9GM0YLQsNGC0Ysg0YHQvtGF0YDQsNC90Y/RjtGC0YHRjyDQvdCwINGB0LXRgNCy0LXRgC4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwi0J/RgNC+0LjQt9C+0YjQu9CwINC+0YjQuNCx0LrQsCwg0YDQtdC30YPQu9GM0YLQsNGCINC90LUg0LHRi9C7INGB0L7RhdGA0LDQvdGR0L0uXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcItCg0LXQt9GD0LvRjNGC0LDRgiDRg9GB0L/QtdGI0L3QviDRgdC+0YXRgNCw0L3RkdC9IVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwi0J/QvtC/0YDQvtCx0L7QstCw0YLRjCDRgdC90L7QstCwXCIsXG4gIHRpbWVyTWluOiBcItC80LjQvVwiLFxuICB0aW1lclNlYzogXCLRgdC10LpcIixcbiAgdGltZXJTcGVudEFsbDogXCLQktGLINC/0L7RgtGA0LDRgtC40LvQuCB7MH0g0L3QsCDRjdGC0L7QuSDRgdGC0YDQsNC90LjRhtC1INC4IHsxfSDQstGB0LXQs9C+LlwiLFxuICB0aW1lclNwZW50UGFnZTogXCLQktGLINC/0L7RgtGA0LDRgtC40LvQuCB7MH0g0L3QsCDRjdGC0L7QuSDRgdGC0YDQsNC90LjRhtC1LlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcItCS0Ysg0L/QvtGC0YDQsNGC0LjQu9C4IHswfSDQsiDRgtC10YfQtdC90LjQtSDRgtC10YHRgtCwLlwiLFxuICB0aW1lckxpbWl0QWxsOlxuICAgIFwi0JLRiyDQv9C+0YLRgNCw0YLQuNC70LggezB9INC40LcgezF9INC90LAg0Y3RgtC+0Lkg0YHRgtGA0LDQvdC40YbQtSDQuCB7Mn0g0LjQtyB7M30g0LTQu9GPINCy0YHQtdCz0L4g0YLQtdGB0YLQsC5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwi0JLRiyDQv9C+0YLRgNCw0YLQuNC70LggezB9INC40LcgezF9INC90LAg0Y3RgtC+0Lkg0YHRgtGA0LDQvdC40YbQtS5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCLQktGLINC/0L7RgtGA0LDRgtC40LvQuCB7MH0g0LjQtyB7MX0g0LTQu9GPINCy0YHQtdCz0L4g0YLQtdGB0YLQsC5cIixcbiAgY2xlYW5DYXB0aW9uOiBcItCe0YfQuNGB0YLQuNGC0YxcIixcbiAgY2xlYXJDYXB0aW9uOiBcItCe0YfQuNGB0YLQuNGC0YxcIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwi0JLRi9Cx0LXRgNC40YLQtSDRhNCw0LnQu1wiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCLQo9C00LDQu9C40YLRjCDRhNCw0LnQu1wiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcItCU0LBcIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcItCd0LXRglwiLFxuICBjb25maXJtUmVtb3ZlRmlsZTogXCLQktGLINGD0LLQtdGA0LXQvdGLLCDRh9GC0L4g0YXQvtGC0LjRgtC1INGD0LTQsNC70LjRgtGMINGN0YLQvtGCINGE0LDQudC7OiB7MH0/XCIsXG4gIGNvbmZpcm1SZW1vdmVBbGxGaWxlczogXCLQktGLINGD0LLQtdGA0LXQvdGLLCDRh9GC0L4g0YXQvtGC0LjRgtC1INGD0LTQsNC70LjRgtGMINCy0YHQtSDRhNCw0LnQu9GLP1wiLFxuICBxdWVzdGlvblRpdGxlUGF0dGVyblRleHQ6IFwi0J3QsNC30LLQsNC90LjQtSDQstC+0L/RgNC+0YHQsFwiLFxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJydVwiXSA9IHJ1c3NpYW5TdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wicnVcIl0gPSBcItGA0YPRgdGB0LrQuNC5XCI7XG4iLCIvL1VuY29tbWVudCB0aGlzIGxpbmUgb24gY3JlYXRpbmcgYSB0cmFuc2xhdGlvbiBmaWxlXG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIHNlcmJpYW5TdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiTmF6YWRcIixcbiAgcGFnZU5leHRUZXh0OiBcIkRhbGplXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJaYXZyxaFpXCIsXG4gIHByZXZpZXdUZXh0OiBcIlByZWdsZWRhalwiLFxuICBlZGl0VGV4dDogXCJJem1lbmlcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIlphcG/EjW5pXCIsXG4gIG90aGVySXRlbVRleHQ6IFwiRHJ1Z28gKHVwacWhaSlcIixcbiAgbm9uZUl0ZW1UZXh0OiBcIk5pxaF0YVwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCJJemFiZXJpIHN2ZVwiLFxuICBwcm9ncmVzc1RleHQ6IFwiU3RyYW5pY2EgezB9IG9kIHsxfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwiVXBpcyB7MH0gb2QgezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCJPZGdvdm9yZW5vIG5hIHswfS97MX0gcGl0YW5qYVwiLFxuICBlbXB0eVN1cnZleTogXCJOZW1hIHZpZGxqaXZpaCBzdHJhbmljYSBpbGkgcGl0YW5qYSB1IGFua2V0aS5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJIdmFsYSBuYSBwb3B1bmphdmFuanUgYW5rZXRlIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgICAgXCJQcmVtYSBuYcWhaW0gcG9kYWNpbWEsIHZlxIcgc3RlIHBvcHVuaWxpIG92dSBhbmtldHUuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiVcSNaXRhdmFtIGFua2V0dS4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJJemFiZXJpLi4uXCIsXG4gIHZhbHVlOiBcInZyZWRub3N0XCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiTW9saW1vIG9kZ292b3JpdGUgbmEgb3ZvIHBpdGFuamUuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIk1vbGltbyBvZGdvdm9yaXRlIG5hIGJhciBqZWRubyBwaXRhbmplLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIk1vbGltbyBvZGdvdm9yaXRlIG5hIHBpdGFuamEgdSBzdmltIHJlZG92aW1hLlwiLFxuICBudW1lcmljRXJyb3I6IFwiVnJlZG5vc3QgYmkgdHJlYmFsbyBkYSBidWRlIG51bWVyacSNa2EuXCIsXG4gIG1pbkVycm9yOiBcIlZyZWRub3N0IG5lIGJpIHRyZWJhbG8gZGEgYnVkZSBtYW5qYSBvZCB7MH1cIixcbiAgbWF4RXJyb3I6IFwiVnJlZG5vc3QgbmUgYmkgdHJlYmFsbyBkYSBidWRlIHZlxIdhIG9kIHswfVwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIk1vbGltbyB1bmVzaXRlIGJhciB7MH0gem5hayhvdilhLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIk1vbGltbyB1bmVzaXRlIG5hanZpxaFlIHswfSB6bmFrKG92KWEuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6XG4gICAgICBcIk1vbGltbyB1bmVzaXRlIG5ham1hbmplIHswfSBpIG5lIHZpxaFlIG9kIHsxfSB6bmFrKG92KWEuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiTW9saW1vIHBvcHVuaXRlIG5ham1hbmplIHswfSByZWQob3ZhKS5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiTW9saW1vIGl6YWJlcml0ZSBuYWptYW5qZSB7MH0gb3BjaWphL2UuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIk1vbGltbyBpemFiZXJpdGUgbmFqdmnFoWUgezB9IG9wY2lqYS9lLlwiLFxuICBudW1lcmljTWluTWF4OiBcIid7MH0nIGJpIHRyZWJhbG8gZGEgYnVkZSBuYWptYW5qZSB7MX0gaSBuYWp2acWhZSB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyBiaSB0cmViYWxvIGRhIGJ1ZGUgbmFqbWFuamUgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScgYmkgdHJlYmFsbyBkYSBidWRlIG5hanZpxaFlIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiTW9saW1vIHVuZXNpdGUgaXNwcmF2bnUgZS1tYWlsIGFkcmVzdS5cIixcbiAgLy8gdnJhdGl0aSBcInRydWVcIiA/XG4gIGludmFsaWRFeHByZXNzaW9uOiBcIkl6cmF6OiB7MH0gYmkgdHJlYmFsbyBkYSBidWRlIHRhxI1hbi5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIlphaHRldiBqZSBuYWnFoWFvIG5hIGdyZcWha3UgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgICBcIlphaHRldiBuaWplIHByb25hxaFhbyBwb2RhdGtlLCBpbGkgamUgcHV0YW5qYSBuZXRhxI1uYVwiLFxuICBleGNlZWRNYXhTaXplOiBcIlZlbGnEjWluYSBmYWpsYSBuZSBiaSB0cmViYWxvIGRhIHByZWxhemkgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiTW9saW1vIHVuZXNpdGUgZHJ1Z3UgdnJlZG5vc3QuXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgICBcIkZhamwgc2UgxaFhbGplLiBNb2xpbW8gc2HEjWVrYWp0ZSBuZWtvIHZyZW1lIGkgcG9rdcWhYWp0ZSBwb25vdm8uXCIsXG4gIGxvYWRpbmdGaWxlOiBcIlXEjWl0YXZhbmplLi4uXCIsXG4gIGNob29zZUZpbGU6IFwiSXphYmVyaXRlIGZhamxvdmUuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcIk5pamUgaXphYnJhbiBuaWplZGFuIGZhamxcIixcbiAgY29uZmlybURlbGV0ZTogXCJEYSBsaSDFvmVsaXRlIGRhIGl6YnJpxaFldGUgdW5vcz9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJPdmEgdnJlZG5vc3QgdHJlYmEgZGEgYnVkZSBqZWRpbnN0dmVuYS5cIixcbiAgYWRkQ29sdW1uOiBcIkRvZGFqIGtvbG9udVwiLFxuICBhZGRSb3c6IFwiRG9kYWogcmVkXCIsXG4gIHJlbW92ZVJvdzogXCJVa2xvbmlcIixcbiAgZW1wdHlSb3dzVGV4dDogXCJOZW1hIHJlZG92YS5cIixcbiAgYWRkUGFuZWw6IFwiRG9kYWogbm92b1wiLFxuICByZW1vdmVQYW5lbDogXCJVa2xvbmlcIixcbiAgY2hvaWNlc19JdGVtOiBcInN0YXZrYVwiLFxuICBtYXRyaXhfY29sdW1uOiBcIktvbG9uYVwiLFxuICBtYXRyaXhfcm93OiBcIlJlZFwiLFxuICBtdWx0aXBsZXRleHRfaXRlbW5hbWU6IFwidGVrc3RcIixcbiAgc2F2aW5nRGF0YTogXCJVIHRva3UgamUgxI11dmFuamUgcG9kYXRha2EgbmEgc2VydmVydS4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiRG/FoWxvIGplIGRvIGdyZcWha2UgaSByZXp1bHRhdGkgbmlzdSBzYcSNdXZhbmkuXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIlJlenVsdGF0aSBzdSB1c3BlxaFubyBzYcSNdXZhbmkhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJQb2t1xaFhanRlIHBvbm92b1wiLFxuICB0aW1lck1pbjogXCJtaW5cIixcbiAgdGltZXJTZWM6IFwic2VrXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwiUHJvdmVsaSBzdGUgezB9IG5hIG92b2ogc3RyYW5pY2kgaSB7MX0gdWt1cG5vLlwiLFxuICB0aW1lclNwZW50UGFnZTogXCJQcm92ZWxpIHN0ZSB7MH0gbmEgb3ZvaiBzdHJhbmljaS5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCJQcm92ZWxpIHN0ZSB7MH0gdWt1cG5vLlwiLFxuICB0aW1lckxpbWl0QWxsOlxuICAgICAgXCJQcm92ZWxpIHN0ZSB7MH0gb2QgezF9IG5hIG92b2ogc3RyYW5pY2kgaSB7Mn0gb2QgezN9IHVrdXBuby5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiUHJvdmVsaSBzdGUgezB9IG9kIHsxfSBuYSBvdm9qIHN0cmFuaWNpLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIlByb3ZlbGkgc3RlIHswfSBvZCB7MX0gdWt1cG5vLlwiLFxuICBjbGVhbkNhcHRpb246IFwiT8SNaXN0aVwiLFxuICBjbGVhckNhcHRpb246IFwiUG9uacWhdGlcIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwiSXphYmVyaSBmYWpsXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIlVrbG9uaSBvdmFqIGZhamxcIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCJEYVwiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwiTmVcIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwiRGEgbGkgc3RlIHNpZ3VybmkgZGEgxb5lbGl0ZSBkYSB1a2xvbml0ZSBvdmFqIGZhamw6IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIkRhIGxpIHN0ZSBzaWd1cm5pIGRhIMW+ZWxpdGUgZGEgdWtsb25pdGUgc3ZlIGZhamxvdmU/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCJOYXNsb3YgcGl0YW5qYVwiLFxuICBtb2RhbENhbmNlbEJ1dHRvblRleHQ6IFwiT3RrYcW+aVwiLFxuICBtb2RhbEFwcGx5QnV0dG9uVGV4dDogXCJQcmltZW5pXCIsXG59O1xuXG4vL1VuY29tbWVudCB0aGVzZSB0d28gbGluZXMgb24gY3JlYXRpbmcgYSB0cmFuc2xhdGlvbiBmaWxlLiBZb3Ugc2hvdWxkIHJlcGxhY2UgXCJlblwiIGFuZCBlblN0cmluZ3Mgd2l0aCB5b3VyIGxvY2FsZSAoXCJmclwiLCBcImRlXCIgYW5kIHNvIG9uKSBhbmQgeW91ciB2YXJpYWJsZS5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wicnNcIl0gPSBzZXJiaWFuU3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcInJzXCJdID0gXCJTcnBza2lcIjtcbiIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgc2ltcGxpZmllZENoaW5lc2VTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwi5LiK5LiA6aG1XCIsXG4gIHBhZ2VOZXh0VGV4dDogXCLkuIvkuIDpobVcIixcbiAgY29tcGxldGVUZXh0OiBcIuaPkOS6pOmXruWNt1wiLFxuICBwcmV2aWV3VGV4dDogXCLpooTop4hcIixcbiAgZWRpdFRleHQ6IFwi57yW6L6RXCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCLlvIDlp4vpl67ljbdcIixcbiAgb3RoZXJJdGVtVGV4dDogXCLloavlhpnlhbbku5bnrZTmoYhcIixcbiAgbm9uZUl0ZW1UZXh0OiBcIuaXoFwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCLpgInmi6nlhajpg6hcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIuesrCB7MH0g6aG1LCDlhbEgezF9IOmhtVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwiezB9IG9mIHsxfVwiLFxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwi56ysIHswfS97MX0g6aKYXCIsXG4gIGVtcHR5U3VydmV5OiBcIumXruWNt+S4reayoeaciemXrumimOaIlumhtemdolwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIuaEn+iwouaCqOeahOWPguS4jiFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTogXCLkvaDlt7LlrozmiJDpl67ljbcuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwi6Zeu5Y235q2j5Zyo5Yqg6L295LitLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIuivt+mAieaLqS4uLlwiLFxuICB2YWx1ZTogXCLlgLxcIixcbiAgcmVxdWlyZWRFcnJvcjogXCLor7floavlhpnmraTpl67pophcIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwi6Iez5bCR5Zue562U5LiA6aKYLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIuivt+Whq+WGmeaJgOacieihjOS4remXrumimFwiLFxuICBudW1lcmljRXJyb3I6IFwi562U5qGI5b+F6aG75piv5Liq5pWw5a2XXCIsXG4gIG1pbkVycm9yOiBcIuivpeWAvOS4jeiDveWwj+S6jiB7MH1cIixcbiAgbWF4RXJyb3I6IFwi6K+l5YC85LiN6IO95aSn5LqOIHswfVwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIuetlOahiOmVv+W6puiHs+WwkSB7MH0g5Liq5a2X56ymXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwi562U5qGI6ZW/5bqm5LiN6IO96LaF6L+HIHswfSDkuKrlrZfnrKZcIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCLnrZTmoYjplb/luqblv4XpobvlnKggezB9IC0gezF9IOS4quWtl+espuS5i+mXtFwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIuacgOWwkemcgOimgeWhq+WGmSB7MH0g6KGM562U5qGIXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIuacgOWwkemcgOimgemAieaLqSB7MH0g6aG5562U5qGIXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIuacgOWkmuWPquiDvemAieaLqSB7MH0g6aG5562U5qGIXCIsXG4gIG51bWVyaWNNaW5NYXg6IFwi562U5qGIICd7MH0nIOW/hemhu+Wkp+S6juetieS6jiB7MX0g5LiU5bCP5LqO562J5LqOIHsyfVwiLFxuICBudW1lcmljTWluOiBcIuetlOahiCAnezB9JyDlv4XpobvlpKfkuo7nrYnkuo4gezF9XCIsXG4gIG51bWVyaWNNYXg6IFwi562U5qGIICd7MH0nIOW/hemhu+Wwj+S6juetieS6jiB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIuivt+i+k+WFpeacieaViOeahCBFbWFpbCDlnLDlnYBcIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwi5YWs5byPOiB7MH0g5peg5pWILlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwi6L295YWl6YCJ6aG55pe25Y+R55Sf6ZSZ6K+vICd7MH0nOiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOiBcIuacquiDvei9veWFpeacieaViOeahOmAiemhueaIluivt+axguWPguaVsOi3r+W+hOacieivr1wiLFxuICBleGNlZWRNYXhTaXplOiBcIuaWh+S7tuWkp+Wwj+S4jeiDvei2hei/hyB7MH1cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIuivt+WujOaIkOWFtuS7lumXrumimFwiLFxuICB1cGxvYWRpbmdGaWxlOiBcIuaWh+S7tuS4iuS8oOS4rS4uLiDor7fogJDlv4PnrYnlvoXlh6Dnp5LlkI7ph43or5VcIixcbiAgbG9hZGluZ0ZpbGU6IFwi5Yqg6L29Li4uXCIsXG4gIGNob29zZUZpbGU6IFwi6YCJ5oup5paH5Lu2Li4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCLmnKrpgInmi6nmlofku7ZcIixcbiAgY29uZmlybURlbGV0ZTogXCLliKDpmaTorrDlvZU/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwi5Li76ZSu5LiN6IO96YeN5aSNXCIsXG4gIGFkZENvbHVtbjogXCLmt7vliqDliJdcIixcbiAgYWRkUm93OiBcIua3u+WKoOihjFwiLFxuICByZW1vdmVSb3c6IFwi5Yig6Zmk562U5qGIXCIsXG4gIGVtcHR5Um93c1RleHQ6IFwi5peg5YaF5a65XCIsXG4gIGFkZFBhbmVsOiBcIuaWsOa3u1wiLFxuICByZW1vdmVQYW5lbDogXCLliKDpmaRcIixcbiAgY2hvaWNlc19JdGVtOiBcIumAiemhuVwiLFxuICBtYXRyaXhfY29sdW1uOiBcIuWIl1wiLFxuICBtYXRyaXhfcm93OiBcIuihjFwiLFxuICBtdWx0aXBsZXRleHRfaXRlbW5hbWU6IFwi5paH5pysXCIsXG4gIHNhdmluZ0RhdGE6IFwi5q2j5Zyo5bCG57uT5p6c5L+d5a2Y5Yiw5pyN5Yqh5ZmoLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCLlnKjkv53lrZjnu5Pmnpzov4fnqIvkuK3lj5HnlJ/kuobplJnor6/vvIznu5PmnpzmnKrog73kv53lrZhcIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwi57uT5p6c5L+d5a2Y5oiQ5YqfIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwi6K+36YeN6K+VXCIsXG4gIHRpbWVyTWluOiBcIuWIhlwiLFxuICB0aW1lclNlYzogXCLnp5JcIixcbiAgdGltZXJTcGVudEFsbDogXCLmnKzpobXnlKjml7YgezB9IOaAu+iuoeeUqOaXtnsxfSAuXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIuacrOmhteeUqOaXtnswfSAuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwi5oC76K6h55So5pe2IHswfSAuXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCLmnKzpobXnlKjml7YgezB9IOWFsSB7MX3vvIwg5oC76K6h55So5pe2IHsyfSDlhbEgezN9IC5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwi5pys6aG155So5pe2IHswfSDlhbEgezF9IC5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCLmgLvorqHnlKjml7YgezB9IOWFsSB7MX0uXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCLmuIXnkIZcIixcbiAgY2xlYXJDYXB0aW9uOiBcIua4hemZpFwiLFxuICBjaG9vc2VGaWxlQ2FwdGlvbjogXCLpgInmi6nmlofku7ZcIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwi56e76Zmk5paH5Lu2XCIsXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwi5pivXCIsXG4gIGJvb2xlYW5VbmNoZWNrZWRMYWJlbDogXCLlkKZcIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwi5Yig6Zmk5paH5Lu2OiB7MH0/XCIsXG4gIGNvbmZpcm1SZW1vdmVBbGxGaWxlczogXCLliKDpmaTmiYDmnInmlofku7Y/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCLmoIfpophcIixcbiAgbW9kYWxDYW5jZWxCdXR0b25UZXh0OiBcIuWPlua2iFwiLFxuICBtb2RhbEFwcGx5QnV0dG9uVGV4dDogXCLnoa7lrppcIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiemgtY25cIl0gPSBzaW1wbGlmaWVkQ2hpbmVzZVN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJ6aC1jblwiXSA9IFwi566A5L2T5Lit5paHXCI7XG4iLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIHNwYW5pc2hTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiQW50ZXJpb3JcIixcbiAgcGFnZU5leHRUZXh0OiBcIlNpZ3VpZW50ZVwiLFxuICBjb21wbGV0ZVRleHQ6IFwiQ29tcGxldGFyXCIsXG4gIHByZXZpZXdUZXh0OiBcIlZpc3RhIHByZXZpYVwiLFxuICBlZGl0VGV4dDogXCJFZGl0YVwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwiQ29taWVuemFcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJPdHJvIChkZXNjcmliYSlcIixcbiAgbm9uZUl0ZW1UZXh0OiBcIk5pbmd1bm9cIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwiU2VsZWNjaW9uYXIgdG9kb1wiLFxuICBwcm9ncmVzc1RleHQ6IFwiUMOhZ2luYSB7MH0gZGUgezF9XCIsXG4gIHBhbmVsRHluYW1pY1Byb2dyZXNzVGV4dDogXCJSZWdpc3RybyB7MH0gZGUgezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCJSZXNwb25kacOzIGEgezB9L3sxfSBwcmVndW50YXNcIixcbiAgZW1wdHlTdXJ2ZXk6IFwiTm8gaGF5IHDDoWdpbmEgdmlzaWJsZSBvIHByZWd1bnRhIGVuIGxhIGVuY3Vlc3RhLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIkdyYWNpYXMgcG9yIGNvbXBsZXRhciBsYSBlbmN1ZXN0YSFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcIk51ZXN0cm9zIHJlZ2lzdHJvcyBtdWVzdHJhbiBxdWUgeWEgaGEgY29tcGxldGFkbyBlc3RhIGVuY3Vlc3RhLlwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkxhIGVuY3Vlc3RhIGVzdMOhIGNhcmdhbmRvLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIlNlbGVjY2lvbmUuLi5cIixcbiAgdmFsdWU6IFwidmFsb3JcIixcbiAgcmVxdWlyZWRFcnJvcjogXCJQb3IgZmF2b3IgY29udGVzdGUgbGEgcHJlZ3VudGEuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIlBvciBmYXZvciwgcmVzcG9uZGEgYWwgbWVub3MgdW5hIHByZWd1bnRhLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIlBvciBmYXZvciBjb250ZXN0ZSBsYXMgcHJlZ3VudGFzIGVuIGNhZGEgaGlsZXJhLlwiLFxuICBudW1lcmljRXJyb3I6IFwiTGEgZXN0aW1hY2nDs24gZGViZSBzZXIgbnVtw6lyaWNhLlwiLFxuICBtaW5FcnJvcjogXCJMYSBlc3RpbWFjacOzbiBubyBkZWJlIHNlciBtZW5vciBxdWUgezB9XCIsXG4gIG1heEVycm9yOiBcIkxhIGVzdGltYWNpw7NuIG5vIGRlYmUgc2VyIG1heW9yIHF1ZSB7MH1cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJQb3IgZmF2b3IgZW50cmUgcG9yIGxvIG1lbm9zIHswfSBzw61tYm9sb3MuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiUG9yIGZhdm9yIGVudHJlIG1lbm9zIGRlIHswfSBzw61tYm9sb3MuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiUG9yIGZhdm9yIGVudHJlIG3DoXMgZGUgezB9IHkgbWVub3MgZGUgezF9IHPDrW1ib2xvcy5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJQb3IgZmF2b3IgbGxlbmUgcG9yIGxvIG1lbm9zIHswfSBoaWxlcmFzLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJQb3IgZmF2b3Igc2VsZWNjaW9uZSBwb3IgbG8gbWVub3MgezB9IHZhcmlhbnRlcy5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiUG9yIGZhdm9yIHNlbGVjY2lvbmUgbm8gbcOhcyBkZSB7MH0gdmFyaWFudGVzLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiRWwgJ3swfScgZGViZSBkZSBzZXIgaWd1YWwgbyBtw6FzIGRlIHsxfSB5IGlndWFsIG8gbWVub3MgZGUgezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiRWwgJ3swfScgZGViZSBzZXIgaWd1YWwgbyBtw6FzIGRlIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIkVsICd7MH0nIGRlYmUgc2VyIGlndWFsIG8gbWVub3MgZGUgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJQb3IgZmF2b3IgYWdyZWd1ZSB1biBjb3JyZW8gZWxlY3Ryw7NuaWNvIHbDoWxpZG8uXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIkxhIGV4cHJlc2nDs246IHswfSBkZWJlcsOtYSBkZXZvbHZlciAndmVyZGFkZXJvJy5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIkxhIHNvbGljaXR1ZCByZWdyZXPDsyBlcnJvciAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcIkxhIHNvbGljaXR1ZCByZWdyZXPDsyB2YWPDrW8gZGUgZGF0YSBvIGxhIHByb3BpZWRhZCAndHJheWVjdG9yaWEnIG5vIGVzIGNvcnJlY3RhXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiRWwgdGFtYcOxbyBkZWwgYXJjaGl2byBubyBkZWJlIGRlIGV4Y2VkZXIgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiUG9yIGZhdm9yIGFncmVndWUgbGEgb3RyYSBlc3RpbWFjacOzbi5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIlN1IGFyY2hpdm8gc2UgZXN0w6Egc3ViaWVuZG8uIFBvciBmYXZvciBlc3BlcmUgdW5vcyBzZWd1bmRvcyBlIGludGVudGUgZGUgbnVldm8uXCIsXG4gIGxvYWRpbmdGaWxlOiBcIkNhcmdhbmRvLi4uXCIsXG4gIGNob29zZUZpbGU6IFwiRWxpamEgYXJjaGl2byhzKS4uLlwiLFxuICBub0ZpbGVDaG9zZW46IFwiTm8gc2UgaGEgZWxlZ2lkbyBuaW5nw7puIGFyY2hpdm9cIixcbiAgY29uZmlybURlbGV0ZTogXCLCv1F1aWVyZXMgYm9ycmFyIGVsIHJlZ2lzdHJvP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIkVzdGUgdmFsb3IgZGViZSBzZXIgw7puaWNvLlwiLFxuICBhZGRDb2x1bW46IFwiQcOxYWRpciBjb2x1bW5hXCIsXG4gIGFkZFJvdzogXCJBZ3JlZ3VlIHVuYSBoaWxlcmFcIixcbiAgcmVtb3ZlUm93OiBcIkVsaW1pbmFyIHVuYSBoaWxlcmFcIixcbiAgZW1wdHlSb3dzVGV4dDogXCJObyBoYXkgaGlsZXJhcy5cIixcbiAgYWRkUGFuZWw6IFwiQcOxYWRpciBudWV2b1wiLFxuICByZW1vdmVQYW5lbDogXCJSZXRpcmVcIixcbiAgY2hvaWNlc19JdGVtOiBcImFydMOtY3Vsb1wiLFxuICBtYXRyaXhfY29sdW1uOiBcIkNvbHVtbmFcIixcbiAgbWF0cml4X3JvdzogXCJIaWxlcmFcIixcbiAgbXVsdGlwbGV0ZXh0X2l0ZW1uYW1lOiBcInRleHRvXCIsXG4gIHNhdmluZ0RhdGE6IFwiTG9zIHJlc3VsdGFkb3Mgc2UgZXN0w6FuIGd1YXJkYW5kbyBlbiBlbCBzZXJ2aWRvci4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiTG9zIHJlc3VsdGFkb3Mgc2UgZXN0w6FuIGd1YXJkYW5kbyBlbiBlbCBzZXJ2aWRvci4uLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCLCoUxvcyByZXN1bHRhZG9zIHNlIGd1YXJkYXJvbiBjb24gw6l4aXRvIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiSW50w6ludGFsbyBkZSBudWV2by5cIixcbiAgdGltZXJNaW46IFwibWluXCIsXG4gIHRpbWVyU2VjOiBcInNlY1wiLFxuICB0aW1lclNwZW50QWxsOiBcIkhhcyBnYXN0YWRvIHswfSBlbiBlc3RhIHDDoWdpbmEgeSB7MX0gZW4gdG90YWwuXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIlVzdGVkIGhhIHBhc2FkbyB7MH0gZW4gZXN0YSBww6FnaW5hLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIkhhcyBnYXN0YWRvIGVuIHRvdGFsLlwiLFxuICB0aW1lckxpbWl0QWxsOlxuICAgIFwiSGFzIGdhc3RhZG8gezB9IGRlIHsxfSBlbiBlc3RhIHDDoWdpbmEgeSB7Mn0gZGUgezN9IGVuIHRvdGFsLlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCJIYXMgZ2FzdGFkbyB7MH0gZGUgezF9IGVuIGVzdGEgcMOhZ2luYS5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCJVc3RlZCBoYSBnYXN0YWRvIHswfSBkZSB7MX0gZW4gdG90YWwuXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCJMaW1waWFcIixcbiAgY2xlYXJDYXB0aW9uOiBcIkRlc3BlamVuXCIsXG4gIHNpZ25hdHVyZVBsYWNlSG9sZGVyOiBcIkZpcm1hIGFxdWlcIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwiRWxpamEgZWwgYXJjaGl2b1wiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCJFbGltaW5hIGVzdGUgYXJjaGl2b1wiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIlPDrVwiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwiTm9cIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwiwr9Fc3TDoXMgc2VndXJvIGRlIHF1ZSBxdWllcmVzIGVsaW1pbmFyIGVzdGUgYXJjaGl2bzogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwiwr9Fc3TDoXMgc2VndXJvIGRlIHF1ZSBxdWllcmVzIGVsaW1pbmFyIHRvZG9zIGxvcyBhcmNoaXZvcz9cIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcIlTDrXR1bG8gZGUgbGEgcHJlZ3VudGFcIixcbiAgbW9kYWxDYW5jZWxCdXR0b25UZXh0OiBcIkFudWxhclwiLFxuICBtb2RhbEFwcGx5QnV0dG9uVGV4dDogXCJBcGxpY2FyXCIsXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImVzXCJdID0gc3BhbmlzaFN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJlc1wiXSA9IFwiZXNwYcOxb2xcIjtcbiIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgc3dhaGlsaVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJJbGl5b3Rhbmd1bGlhXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJJZnVhdGF5b1wiLFxuICBjb21wbGV0ZVRleHQ6IFwiS2FtaWxpXCIsXG4gIHByZXZpZXdUZXh0OiBcIkhha2lraVwiLFxuICBlZGl0VGV4dDogXCJIYXJpcmlcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIkFuemFcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJOeWluZ2luZSAoZWxlemEpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCJIYWt1bmFcIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwiQ2hhZ3VhIFpvdGVcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlVrdXJhc2EgezB9IHdhIHsxfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwiUmVrb2RpIHswfSB5YSB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcIllhbGl5b2ppYml3YSB7MH0vezF9IG1hc3dhbGlcIixcbiAgZW1wdHlTdXJ2ZXk6IFwiSGFrdW5hIHVrdXJhc2EgdW5hb29uZWthbmEgYXUgc3dhbGkga2F0aWthIHV0YWZpdGkuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiQXNhbnRpIGt3YSBrdWthbWlsaXNoYSB1dGFmaXRpIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiUmVjb2RpIHpldHUgemluYXR1b255ZXNoYSB0YXlhcmkgdW1la2FtaWxpc2hhIHV0YWZpdGkuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiVHVuYWFuZGFhIHV0YWZpdGkuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiQ2hhZ3VhLi4uXCIsXG4gIHZhbHVlOiBcInRoYW1hbmlcIixcbiAgcmVxdWlyZWRFcnJvcjogXCJUYWZhZGhhbGkgamlidSBoaWxpIHN3YWxpLlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJUYWZhZGhhbGkgamlidSBzd2FsaSBhbmdhbGF1IG1vamEuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiVGFmYWRoYWxpIGppYnUgbWFzd2FsaSBrYXRpa2Egc2FmdSB6b3RlLlwiLFxuICBudW1lcmljRXJyb3I6IFwiVGhhbWFuaSBpbmFwYXN3YSBrdXdhIHlhIG5hbWJhcmkuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiVGFmYWRoYWxpIGluZ2l6YSBhbmdhbGF1ezB9IGh1c2lrYS5cIixcbiAgdGV4dE1heExlbmd0aDogXCJUYWZhZGhhbGkgaW5naXphIGlzaW96aWRpIHswfSBodXNpa2EuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6XG4gICAgXCJUYWZhZGhhbGkgaW5naXphIGtpd2FuZ28gemFpZGkgeWEgezB9IG5hIGtpc2ljaG9wdW5ndWEgezF9IGh1c2lrYS5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJUYWZhZGhhbGkgamF6YSBpc2lvcHVuZ3VhIHswfSBzYWZ1LlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJUYWZhZGhhbGkgY2hhZ3VhIGFuZ2FsYXUgezB9IGxhaGFqYS5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiVGFmYWRoYWxpIGNoYW5ndWEgaXNpb3ppZGkgezB9IGxhaGFqYS5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIiAnezB9JyBpbmFwYXN3YSBrdXdhIHNhd2EgYXUgemFpZGkgeWEgezF9IG5hIHNhd2EgYXUgY2hpbmkgeWEgezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiICd7MH0naW5hcGFzd2Ega3V3YSBzYXdhIGF1IHphaWRpIHlhIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIiAnezB9J2luYXBhc3dhIGt1d2Egc2F3YSBhdSBjaGluaSB5YSB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIlRhZmFkaGFsaSBpbmdpemEgYW53YW5pIGhhbGFsaSB5YSBiYXJ1YS1wZXBlLlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCJVc2VtaTp7MH0gaW5hcGFzd2Ega3VydWRpICdrd2VsaScuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCJPbWJpIGxpbmEga29zYSAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcIk9tYmkgbGlsaXJ1ZGlzaGEgZGF0YSB0dXB1IGF1IHRoZSAncGF0aCcgbWFsaSB5YSBuamlhIHNpbyBzYWhpaGlcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJTYWl6aSB5YSBmYWlsaSBoYWlwYXN3aSBrdXppZGkgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiVGFmYWRoYWxpIGluZ2l6YSB0aGFtYW5pIG55aW5naW5lLlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiRmFpbGkgeWFrbyBpbmFwYWtpYS5UYWZhZGhhbGkgc3ViaXJpIHNla3VuZGUga2FkaGFhIG5hIHVqYXJpYnUgdGVuYS5cIixcbiAgbG9hZGluZ0ZpbGU6IFwiSW5hcGFraWEuLi5cIixcbiAgY2hvb3NlRmlsZTogXCJDaGFndWEgZmFpbGkuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcIkh1amFjaGFndWEgZmFpbGlcIixcbiAgY29uZmlybURlbGV0ZTogXCJKZSEgVW5hdGFrYSBrdWZ1dGEgcmVrb2RpP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIlRoYW1hbmkgaGlpIGluYXBhc3dhIGt1d2EgeWEga2lwZWtlZS5cIixcbiAgYWRkQ29sdW1uOiBcIk9uZ2V6YSBLb2xhbXVcIixcbiAgYWRkUm93OiBcIk9uZ2V6YSBzYWZ1XCIsXG4gIHJlbW92ZVJvdzogXCJUb2FcIixcbiAgYWRkUGFuZWw6IFwiT25nZXphIG1weWFcIixcbiAgcmVtb3ZlUGFuZWw6IFwiVG9hXCIsXG4gIGNob2ljZXNfSXRlbTogXCJraXR1XCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiS29sYW11XCIsXG4gIG1hdHJpeF9yb3c6IFwiU2FmdVwiLFxuICBzYXZpbmdEYXRhOiBcIk1hdG9rZW8geWFtZWhpZmFkaGl3YSBrd2Egc2V2YS4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiS29zYSBsaW1ldG9rZWEgbmEgaGF0dWt1d2V6YSBrdWhpZmFkaGkgbWF0b2tlby5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiTWF0b2tlbyB5YW1laGlmYWRoaXdhIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiSmFyaWJ1IHRlbmFcIixcbiAgdGltZXJNaW46IFwiZGFraWthXCIsXG4gIHRpbWVyU2VjOiBcInNla3VuZGVcIixcbiAgdGltZXJTcGVudEFsbDogXCJVbWV0dW1pYSB7MH0ga3dlbnllIHVrdXJhc2EgaHV1IG5hIHsxfSBrd2EganVtbGEuXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIlVtZXR1bWlhIHswfSBrd2VueWUgdWt1cmFzYSBodXUuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwiVW1ldHVtaWEgezB9IGt3YSBqdW1sYS5cIixcbiAgdGltZXJMaW1pdEFsbDogXCJVbWV0dW1pYSB7MH0geWEgezF9IGt3ZW55ZSB1a3VyYXNhIGh1dSB7Mn0gd2EgezN9IGt3YSBqdW1sYS5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiVW1ldHVtaWEgezB9IHlhIHsxfSBrd2VueWUgdWt1cmFzYSBodXUuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiVW1ldHVtaWEgezB9IHlhIHsxfSBrd2EganVtbGEuXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCJTYWZpc2hhXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJPbmRvYVwiLFxuICBjaG9vc2VGaWxlQ2FwdGlvbjogXCJDaGFndWEgZmFpbGlcIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwiT25kb2EgZmFpbGlcIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCJOZGlvXCIsXG4gIGJvb2xlYW5VbmNoZWNrZWRMYWJlbDogXCJIYXBhbmFcIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwiSmUhIFVuYSB1aGFraWthIGt1d2EgdW5hdGFrYSBrdW9uZG9hIGZhaWxpIGhpaTogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwiSmUhIFVuYSB1aGFraWthIGt1d2EgdW5hdGFrYSBrdW9uZG9hIGZhaWxpIHpvdGU/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCJLaWNod2EgY2hhIFN3YWxpXCIsXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcInN3XCJdID0gc3dhaGlsaVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJzd1wiXSA9IFwic3dhaGlsaVwiO1xuIiwiLy9DcmVhdGUgYnkgTWF0dGlhcyBBc3BsdW5kXG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIHN3ZWRpc2hTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiRsO2cmVnw6VlbmRlXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJOw6RzdGFcIixcbiAgY29tcGxldGVUZXh0OiBcIkbDpHJkaWdcIixcbiAgcHJldmlld1RleHQ6IFwiRsO2cmhhbmRzdmlzbmluZ1wiLFxuICBlZGl0VGV4dDogXCJSZWRpZ2VyYVwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwiU3RhcnRcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJBbm5hdCAoYmVza3JpdilcIixcbiAgbm9uZUl0ZW1UZXh0OiBcIkluZ2VuXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIlbDpGxqIGFsbGFcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlNpZGEgezB9IGF2IHsxfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwiU3BlbGEgaW4gezB9IGF2IHsxfVwiLFxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwiQmVzdmFyYWRlIHswfSAvIHsxfSBmcsOlZ29yXCIsXG4gIGVtcHR5U3VydmV5OiBcIkRldCBmaW5ucyBpbmdlbiBzeW5saWcgc2lkYSBlbGxlciBmcsOlZ2EgaSBlbmvDpHRlbi5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJUYWNrIGbDtnIgYXR0IGR1IGdlbm9tZsO2cnQgZW5rw6R0ZW4hIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiVsOlcmEgcmVnaXN0ZXIgdmlzYXIgYXR0IGR1IHJlZGFuIGhhciBzbHV0ZsO2cnQgZGVubmEgdW5kZXJzw7ZrbmluZy5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJFbmvDpHRlbiBsYWRkYXMuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiVsOkbGouLi5cIixcbiAgdmFsdWU6IFwidsOkcmRlXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiVmFyIHbDpG5saWcgYmVzdmFyYSBmcsOlZ2FuLlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJWw6RubGlnZW4gc3ZhcmEgcMOlIG1pbnN0IGVuIGZyw6VnYS5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJWYXIgdsOkbmxpZyBiZXN2YXJhIGZyw6Vnb3JuYSBww6UgYWxsYSByYWRlci5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIlbDpHJkZXQgc2thIHZhcmEgbnVtZXJpc2t0LlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIlZhciB2w6RubGlnIGFuZ2UgbWluc3QgezB9IHRlY2tlbi5cIixcbiAgdGV4dE1heExlbmd0aDogXCJBbmdlIGbDpHJyZSDDpG4gezB9IHRlY2tlbi5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCJBbmdlIG1lciDDpG4gezB9IG9jaCBmw6RycmUgw6RuIHsxfSB0ZWNrZW4uXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiVmFyIHbDpG5saWcgZnlsbCBpIG1pbnN0IHswfSByYWRlci5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiVmFyIHbDpG5saWcgdsOkbGogw6V0bWluc3RvbmUgezB9IHZhcmlhbnRlci5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiVmFyIHbDpG5saWcgdsOkbGogaW50ZSBmbGVyIMOkbiB7MH0gdmFyaWFudGVyLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScgc2thIHZhcmEgbGlrYSBtZWQgZWxsZXIgbWVyIMOkbiB7MX0gc2FtdCBsaWthIG1lZCBlbGxlciBtaW5kcmUgw6RuIHsyfVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nIHNrYSB2YXJhIGxpa2EgbWVkIGVsbGVyIG1lciDDpG4gezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScgc2thIHZhcmEgbGlrYSBtZWQgZWxsZXIgbWluZHJlIMOkbiB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIlZhciB2w6RubGlnIGFuZ2UgZW4ga29ycmVrdCBlLXBvc3RhZHJlc3MuXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIlV0dHJ5Y2tldDogezB9IHNrYSByZXR1cm5lcmEgJ3RydWUnLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiRsO2cmZyw6VnYW4gcmV0dXJuZXJhZGUgZmVsZXQgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCJBbnRpbmdlbiByZXR1cm5lcmFkZSBmw7ZyZnLDpWdhbiBpbmdlbiBkYXRhIGVsbGVyIHPDpSDDpHIgZWdlbnNrYXBlbiAncGF0aCcgaW50ZSBrb3JyZWt0XCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiRmlsc3Rvcmxla2VuIGbDpXIgZWogw7Z2ZXJzdGlnYSB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJWYXIgdsOkbmxpZyBhbmdlIGRldCBhbmRyYSB2w6RyZGV0LlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiRGluIGZpbCBsYWRkYXMgdXBwLiBWYXIgdsOkbmxpZyB2w6RudGEgbsOlZ3JhIHNla3VuZGVyIG9jaCBmw7Zyc8O2ayBzZWRhbiBpZ2VuLlwiLFxuICBsb2FkaW5nRmlsZTogXCJMw6RzZXIgaW4uLi5cIixcbiAgY2hvb3NlRmlsZTogXCJWw6RsaiBmaWwgKGVyKSAuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcIkluZ2VuIGZpbCB2YWxkXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiVmlsbCBkdSByYWRlcmEgcG9zdGVuP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIkRldHRhIHbDpHJkZSBza2EgdmFyYSB1bmlrdC5cIixcbiAgYWRkQ29sdW1uOiBcIkzDpGdnIHRpbGwga29sdW1uXCIsXG4gIGFkZFJvdzogXCJMw6RnZyB0aWxsIHJhZFwiLFxuICByZW1vdmVSb3c6IFwiVGEgYm9ydFwiLFxuICBhZGRQYW5lbDogXCJMw6RnZyB0aWxsIG55XCIsXG4gIHJlbW92ZVBhbmVsOiBcIlRhIGJvcnRcIixcbiAgY2hvaWNlc19JdGVtOiBcIkFydGlrZWxcIixcbiAgbWF0cml4X2NvbHVtbjogXCJLb2x1bW5cIixcbiAgbWF0cml4X3JvdzogXCJSYWRcIixcbiAgc2F2aW5nRGF0YTogXCJSZXN1bHRhdGVuIHNwYXJhcyBww6Ugc2VydmVybiAuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIkV0dCBmZWwgaW50csOkZmZhZGUgb2NoIHZpIGt1bmRlIGludGUgc3BhcmEgcmVzdWx0YXRlbi5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiUmVzdWx0YXRlbiBzcGFyYWRlcyBmcmFtZ8OlbmdzcmlrdCFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIkbDtnJzw7ZrIGlnZW5cIixcbiAgdGltZXJNaW46IFwibWluXCIsXG4gIHRpbWVyU2VjOiBcInNla1wiLFxuICB0aW1lclNwZW50QWxsOiBcIkR1IGhhciBzcGVuZGVyYXQgezB9IHDDpSBkZW4gaMOkciBzaWRhbiBvY2ggezF9IHRvdGFsdC5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiRHUgaGFyIHNwZW5kZXJhdCB7MH0gcMOlIGRlbiBow6RyIHNpZGFuLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIkR1IGhhciBzcGVuZGVyYXQgezB9IHRvdGFsdC5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcIkR1IGhhciBzcGVuZGVyYXQgezB9IGF2IHsxfSBww6UgZGVuIGjDpHIgc2lkYW4gb2NoIHsyfSBhdiB7M30gdG90YWx0LlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCJEdSBoYXIgc3BlbmRlcmF0IHswfSBhdiB7MX0gcMOlIGRlbiBow6RyIHNpZGFuLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIkR1IGhhciBzcGVuZGVyYXQgezB9IGF2IHsxfSB0b3RhbHQuXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCJSZW5hXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJLbGFyXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcIlbDpGxqIEZJTFwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCJUYSBib3J0IGRlbiBow6RyIGZpbGVuXCIsXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwiSmFcIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcIk5lalwiLFxuICBjb25maXJtUmVtb3ZlRmlsZTogXCLDhHIgZHUgc8Oka2VyIHDDpSBhdHQgZHUgdmlsbCB0YSBib3J0IGRlbiBow6RyIGZpbGVuOiB7MH0/XCIsXG4gIGNvbmZpcm1SZW1vdmVBbGxGaWxlczogXCLDhHIgZHUgc8Oka2VyIHDDpSBhdHQgZHUgdmlsbCB0YSBib3J0IGFsbGEgZmlsZXI/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCJGcsOlZ2V0aXRlbFwiLFxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJzdlwiXSA9IHN3ZWRpc2hTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wic3ZcIl0gPSBcInN2ZW5za2FcIjtcbiIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgdGFqaWtTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwi0JHQvtC30LPQsNGI0YJcIixcbiAgcGFnZU5leHRUZXh0OiBcItCe0Y/QvdC00LBcIixcbiAgY29tcGxldGVUZXh0OiBcItCY0rfRgNC+INGI0YPQtFwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwi0J7Sk9C+0LdcIixcbiAgb3RoZXJJdGVtVGV4dDogXCLQlNC40LPQsNGAICjQu9GD0YLRhNCw0L0g0YLQsNCy0YHQuNGEINC60YPQvdC10LQpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCLQndC1XCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcItKy0LDQvNCw0YDQviDQuNC90YLQuNGF0L7QsSDQutCw0YDQtNCw0L1cIixcbiAgcHJvZ3Jlc3NUZXh0OiBcItCh0LDSs9C40YTQsNC4IHswfSDQsNC3IHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCLQr9Cz0L7QvSDRgdCw0LLQvtC7INCy0YPSt9GD0LQg0L3QsNC00L7RgNCw0LQuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwi0KLQsNGI0LDQutC60YPRgCDQsdCw0YDQvtC4INC/0YPRgCDQutCw0YDQtNCw0L3QuCDRgdCw0LLQvtC70L3QvtC80LAhXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgXCLQqNGD0LzQviDQsNC70LvQsNC60LDQuSDQuNC9INC/0YPRgNGB0LjRiNGA0L4g0LDQvdK30L7QvCDQtNC+0LTQsNC10LQuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwi0JHQvtGA0LPQuNGA06Mg0LDQtyDRgdC10YDQstC10YAuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwi0JjQvdGC0LjRhdC+0LEg0LrQsNGA0LTQsNC9Li4uXCIsXG4gIHZhbHVlOiBcItKb0LjQvNC80LDRglwiLFxuICByZXF1aXJlZEVycm9yOiBcItCY0LvRgtC40LzQvtGBLCDQsdCwINGB0LDQstC+0Lsg0rfQsNCy0L7QsSDQtNC40rPQtdC0LlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCLQmNC70YLQuNC80L7RgSwg0LDSm9Cw0LvQsNC9INCx0LAg0Y/QuiDRgdCw0LLQvtC7INK30LDQstC+0LEg0LTQuNKz0LXQtC5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCLQmNC70YLQuNC80L7RgSwg0LHQsCDSs9Cw0LzQsNC4INGB0LDQstC+0LvSs9C+INC00LDRgCDSs9Cw0LzQsNC4INGB0LDRgtGA0rPQviDSt9Cw0LLQvtCxINC00LjSs9C10LQuXCIsXG4gIG51bWVyaWNFcnJvcjogXCLSttCw0LLQvtCxINCx0L7Rj9C0INGA0LDSm9Cw0Lwg0LHQvtGI0LDQtC5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCLQmNC70YLQuNC80L7RgSwg0LDQtyB7MH0g0LfQuNGR0LTRgtCw0YAg0YDQsNC80Lcg0LLQvtGA0LjQtCDQutGD0L3QtdC0LlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcItCY0LvRgtC40LzQvtGBLCDQsNC3IHswfSDQutCw0LzRgtCw0YAg0YDQsNC80Lcg0LLQvtGA0LjQtCDQutGD0L3QtdC0LlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcItCY0LvRgtC40LzQvtGBLCDQsNC3IHswfSDQt9C40ZHQtNGC0LDRgCDQstCwINCw0LcgezF9INC60LDQvNGC0LDRgCDRgNCw0LzQtyDQstC+0YDQuNC0INC60YPQvdC10LQuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwi0JjQu9GC0LjQvNC+0YEsINC90LAg0LrQsNC80YLQsNGAINCw0LcgezB9INGB0LDRgtGAINC/0YPRgCDQutGD0L3QtdC0LlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCLQmNC70YLQuNC80L7RgSwg0LDSm9Cw0LvQsNC9IHswfSDQstCw0YDQuNCw0L3RgiDQuNC90YLQuNGF0L7QsSDQutGD0L3QtdC0LlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCLQmNC70YLQuNC80L7RgSwg0L3QsCDQt9C40ZHQtNGC0LDRgCDQsNC3IHswfSDQstCw0YDQuNCw0L3RgiDQuNC90YLQuNGF0L7QsSDQutGD0L3QtdC0LlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScg0LHQvtGP0LQg0L3QsCDQutCw0Lwg0LDQtyB7MX0g0LLQsCDQvdCwINCx0LjRgdGR0YAg0LDQtyB7Mn0g0LHQvtGI0LDQtFwiLFxuICBudW1lcmljTWluOiBcIid7MH0nINCx0L7Rj9C0INC90LAg0LrQsNC8INCw0LcgezF9INCx0L7RiNCw0LRcIixcbiAgbnVtZXJpY01heDogXCInezB9JyDQsdC+0Y/QtCDQvdCwINC30LjRkdC0INCw0LcgezF9INCx0L7RiNCw0LRcIixcbiAgaW52YWxpZEVtYWlsOiBcItCY0LvRgtC40LzQvtGBLCDQv9C+0YfRgtCw0Lgg0Y3Qu9C10LrRgtGA0L7QvdC40Lgg0LLQvtKb0LXQuNGA0L4g0LLQvtGA0LjQtCDQutGD0L3QtdC0LlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCLQmNGE0L7QtNCw0LggezB9INCx0L7Rj9C0ICd0cnVlJyDQsdCw0YDQs9Cw0YDQtNC+0L3QsNC0LlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwi0JTQsNGA0YXQvtGB0YIg0YXQsNGC0L7Qs9OjINCx0L7Qt9Cz0LDRgNC00L7QvdC0ICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwi0rbQsNCy0L7QsSDQsdCwINC00LDRgNGF0L7RgdGCINGF0L7Qu9OjINC+0LzQsNC0INGRINGF0L7RgdC40Y/RgtC4ICdwYXRoJyDQvdC+0LTRg9GA0YPRgdGCINC80YPQsNC50Y/QvSDQutCw0YDQtNCwINGI0YPQtNCw0LDRgdGCXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwi0JDQvdC00L7Qt9Cw0Lgg0YTQsNC50Lsg0LHQvtGP0LQg0L3QsCDQutCw0LvQvtC9INCw0LcgezB9INCx0L7RiNCw0LQuXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCLQmNC70YLQuNC80L7RgSwg0LHQsCDQvNCw0LnQtNC+0L3QuCAn0JTQuNCz0LDRgCcg0LTQvtC00LDSs9C+0YDQviDQstC+0YDQuNC0INC60YPQvdC10LRcIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcItCk0LDQudC70Lgg0YjRg9C80L4g0LHQvtGAINGI0YPQtNCwINC40YHRgtC+0LTQsNCw0YHRgi4g0K/QutGH0LDQvdC0INGB0L7QvdC40Y8g0LjQvdGC0LjQt9C+0YAg0YjQsNCy0LXQtCDQstCwINCx0L7RgNC4INC00LjQs9Cw0YAg0LrTr9GI0LjRiCDQutGD0L3QtdC0LlwiLFxuICBsb2FkaW5nRmlsZTogXCLQkdC+0YDQutGD0L3Toy4uLlwiLFxuICBjaG9vc2VGaWxlOiBcItCk0LDQudC7KNKz0L4pLdGA0L4g0LjQvdGC0LjRhdC+0LEg0LrRg9C90LXQtC4uLlwiLFxuICBjb25maXJtRGVsZXRlOiBcItCo0YPQvNC+INC80YPRgtC80LDQuNC9INKz0LDRgdGC0LXQtCwg0LrQuCDQvNC10YXQvtKz0LXQtCDQstC+0YDQuNC00YDQviDRgtC+0LfQsCDQutGD0L3QtdC0P1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcItCY0L0g0LDRgNC30LjRiCDQsdC+0Y/QtCDQsdC10L3QsNC30LjRgCDQsdC+0YjQsNC0LlwiLFxuICBhZGRDb2x1bW46IFwi0JjQu9C+0LLQsNC4INGB0YPRgtGD0L1cIixcbiAgYWRkUm93OiBcItCY0LvQvtCy0LDQuCDRgdCw0YLRgFwiLFxuICByZW1vdmVSb3c6IFwi0J3QtdGB0YIg0LrQsNGA0LTQsNC9XCIsXG4gIGFkZFBhbmVsOiBcItCY0LvQvtCy0LAg0LrQsNGA0LTQsNC9XCIsXG4gIHJlbW92ZVBhbmVsOiBcItCd0LXRgdGCINC60LDRgNC00LDQvVwiLFxuICBjaG9pY2VzX0l0ZW06IFwi0JLQsNGA0LjQsNC90YJcIixcbiAgbWF0cml4X2NvbHVtbjogXCLQodGD0YLRg9C9XCIsXG4gIG1hdHJpeF9yb3c6IFwi0KHQsNGC0YBcIixcbiAgc2F2aW5nRGF0YTogXCLQndCw0YLQuNK30LAg0LHQsCDRgdC10YDQstC10YAg0YHQsNCx0YIg0YjRg9C00LAg0LjRgdGC0L7QtNCw0LDQvdC0Li4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCLQpdCw0YLQvtCz06Mg0LHQsCDQsNC80LDQuyDQvtC80LDQtCwg0L3QsNGC0LjSt9CwINGB0LDQsdGCINC90LDRiNGD0LQuXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcItCd0LDRgtC40rfQsCDQsdC+0LzRg9Cy0LDRhNGE0LDQutC40Y/RgiDRgdCw0LHRgiDRiNGD0LQhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCLQkdC+0YDQuCDQtNC40LPQsNGAINC606/RiNC40Ygg0LrQsNGA0LTQsNC90LRcIixcbiAgdGltZXJNaW46IFwi0LTQsNKbXCIsXG4gIHRpbWVyU2VjOiBcItGB0L7QvVwiLFxuICB0aW1lclNwZW50QWxsOiBcItCo0YPQvNC+IHswfSDQtNCw0YAg0LjQvSDRgdCw0rPQuNGE0LAg0LLQsCB7MX0g0LTQsNGAINGD0LzRg9C8INGB0LDRgNGEINC60LDRgNC00LXQtC5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwi0KjRg9C80L4gezB9INC00LDRgCDQuNC9INGB0LDSs9C40YTQsCDRgdCw0YDRhCDQutCw0YDQtNC10LQuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwi0KjRg9C80L4gezB9INC00LDRgCDQuNC9INGC0LXRgdGCINGB0LDRgNGEINC90LDQvNGD0LTQtdC0LlwiLFxuICB0aW1lckxpbWl0QWxsOlxuICAgIFwi0KjRg9C80L4gezB9INCw0LcgezF9INC00LDRgCDQuNC9INGB0LDSs9C40YTQsCDQstCwIHsyfSDQsNC3IHszfSDQtNCw0YAg0YPQvNGD0Lwg0YHQsNGA0YQg0LrQsNGA0LTQtdC0INC00LDRgCDQtNC+0YXQuNC70Lgg0LjQvSDRgtC10YHRgi5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwi0KjRg9C80L4gezB9INCw0LcgezF9INC00LDRgCDQuNC9INGB0LDSs9C40YTQsCDRgdCw0YDRhCDQutCw0YDQtNC10LQuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwi0KjRg9C80L4gezB9INCw0LcgezF9INC00LDRgCDSs9Cw0LzQsNC4INGC0LXRgdGCINGB0LDRgNGEINC60LDRgNC00LXQtC5cIixcbiAgY2xlYW5DYXB0aW9uOiBcItCi0L7Qt9CwINC60LDRgNC00LDQvVwiLFxuICBjbGVhckNhcHRpb246IFwi0KLQvtC30LAg0LrQsNGA0LTQsNC9XCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcItCk0LDQudC70YDQviDQvdC10YHRgiDQutCw0YDQtNCw0L1cIlxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJ0Z1wiXSA9IHRhamlrU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcInRnXCJdID0gXCLRgtC+0rfQuNC606NcIjtcbiIsIi8vQ3JlYXRlZCBieSBQYWRldCBUYXdlZWt1bmthblxuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciB0aGFpU3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIuC4geC5iOC4reC4meC4q+C4meC5ieC4slwiLFxuICBwYWdlTmV4dFRleHQ6IFwi4LiW4Lix4LiU4LmE4LibXCIsXG4gIGNvbXBsZXRlVGV4dDogXCLguKrguLPguYDguKPguYfguIhcIixcbiAgcHJldmlld1RleHQ6IFwi4LiU4Li54LiV4Lix4Lin4Lit4Lii4LmI4Liy4LiHXCIsXG4gIGVkaXRUZXh0OiBcIuC5geC4geC5ieC5hOC4glwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwi4LmA4Lij4Li04LmI4LihXCIsXG4gIG90aGVySXRlbVRleHQ6IFwi4Lit4Li34LmI4LiZ4LmGICjguYLguJvguKPguJTguKPguLDguJrguLgpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCLguYTguKHguYjguKHguLVcIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwi4LmA4Lil4Li34Lit4LiB4LiX4Lix4LmJ4LiH4Lir4Lih4LiUXCIsXG4gIHByb2dyZXNzVGV4dDogXCLguKvguJnguYnguLLguJfguLXguYggezB9IOC4iOC4suC4gSB7MX1cIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcIuC4o+C4suC4ouC4geC4suC4o+C4l+C4teC5iCB7MH0g4LiI4Liy4LiBIHsxfVwiLFxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwi4LiE4Liz4LiV4Lit4Lia4LiX4Li14LmIIHswfS97MX0g4LiI4Liz4LiZ4Lin4LiZ4LiE4Liz4LiW4Liy4LihXCIsXG4gIGVtcHR5U3VydmV5OiBcIuC5hOC4oeC5iOC4oeC4teC4q+C4meC5ieC4suC5gOC4nuC4iOC4l+C4teC5iOC4oeC4reC4h+C5gOC4q+C5h+C4mSDguKvguKPguLfguK0g4LiE4Liz4LiW4Liy4Lih4LmD4LiZIHN1cnZleSDguJnguLXguYlcIixcbiAgY29tcGxldGluZ1N1cnZleTogXCLguILguK3guJrguITguLjguJPguJfguLXguYjguJfguLMgc3VydmV5IOC4iOC4meC5gOC4quC4o+C5h+C4iFwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwi4Lij4Liy4Lii4LiB4Liy4Lij4LiC4Lit4LiH4LmA4Lij4Liy4LmB4Liq4LiU4LiH4Lin4LmI4Liy4LiE4Li44LiT4LmE4LiU4LmJ4LiX4LizIHN1cnZleSDguYDguKrguKPguYfguIjguYDguKPguLXguKLguJrguKPguYnguK3guKLguYHguKXguYnguKdcIixcbiAgbG9hZGluZ1N1cnZleTogXCLguIHguLPguKXguLHguIfguYLguKvguKXguJQgU3VydmV5Li4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIuC5gOC4peC4t+C4reC4gS4uLlwiLFxuICB2YWx1ZTogXCLguILguYnguK3guKHguLnguKVcIixcbiAgcmVxdWlyZWRFcnJvcjogXCLguIHguKPguLjguJPguLLguJXguK3guJrguITguLPguJbguLLguKFcIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwi4LiB4Lij4Li44LiT4Liy4LiV4Lit4Lia4LiC4Lix4LmJ4LiZ4LiV4LmI4Liz4Lir4LiZ4Li24LmI4LiH4LiE4Liz4LiW4Liy4LihXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwi4LiB4Lij4Li44LiT4Liy4LiV4Lit4Lia4LiE4Liz4LiW4Liy4Lih4LmD4LiZ4LiX4Li44LiB4LmG4LmB4LiW4LinXCIsXG4gIG51bWVyaWNFcnJvcjogXCLguILguYnguK3guKHguLnguKXguJfguLXguYjguYPguKrguYjguJXguYnguK3guIfguYDguJvguYfguJnguJXguLHguKfguYDguKXguIJcIixcbiAgdGV4dE1pbkxlbmd0aDogXCLguIHguKPguLjguJPguLLguYPguKrguYjguILguLHguYnguJnguJXguYjguLPguIjguLPguJnguKfguJkgezB9IOC4leC4seC4p+C4reC4seC4geC4qeC4o1wiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIuC4geC4o+C4uOC4k+C4suC5g+C4quC5iOC5hOC4oeC5iOC5gOC4geC4tOC4meC4iOC4s+C4meC4p+C4mSB7MH0g4LiV4Lix4Lin4Lit4Lix4LiB4Lip4LijXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwi4LiB4Lij4Li44LiT4Liy4LmD4Liq4LmI4LiC4Lix4LmJ4LiZ4LiV4LmI4Liz4LiI4Liz4LiZ4Lin4LiZIHswfSDguYHguKXguLDguYTguKHguYjguYDguIHguLTguJnguIjguLPguJnguKfguJkgezF9IOC4leC4seC4p+C4reC4seC4geC4qeC4o1wiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIuC4geC4o+C4uOC4k+C4suC5g+C4quC5iOC4guC4seC5ieC4meC4leC5iOC4s+C4iOC4s+C4meC4p+C4mSB7MH0g4LmB4LiW4LinXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIuC4geC4o+C4uOC4k+C4suC5gOC4peC4t+C4reC4geC4reC4ouC5iOC4suC4h+C4meC5ieC4reC4oiB7MH0g4Lij4Liy4Lii4LiB4Liy4LijXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIuC4geC4o+C4uOC4k+C4suC5gOC4peC4t+C4reC4geC5hOC4oeC5iOC5gOC4geC4tOC4mSB7MH0g4Lij4Liy4Lii4LiB4Liy4LijXCIsXG4gIG51bWVyaWNNaW5NYXg6IFwiJ3swfScg4LiV4LmJ4Lit4LiH4Lih4Liy4LiB4LiB4Lin4LmI4Liy4Lir4Lij4Li34Lit4LmA4LiX4LmI4Liy4LiB4Lix4LiaIHsxfSDguYHguKXguLDguJnguYnguK3guKLguIHguKfguYjguLLguKvguKPguLfguK3guYDguJfguYjguLLguIHguLHguJogezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScg4LiV4LmJ4Lit4LiH4Lih4Liy4LiB4LiB4Lin4LmI4Liy4Lir4Lij4Li34Lit4LmA4LiX4LmI4Liy4LiB4Lix4LiaIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIid7MH0nIOC4meC5ieC4reC4ouC4geC4p+C5iOC4suC4q+C4o+C4t+C4reC5gOC4l+C5iOC4suC4geC4seC4miB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIuC4geC4o+C4uOC4k+C4suC5g+C4quC5iOC4reC4teC5gOC4oeC4peC5jOC5geC4reC4lOC5gOC4lOC4o+C4quC4l+C4teC5iOC4luC4ueC4geC4leC5ieC4reC4h1wiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCJUaGUgZXhwcmVzc2lvbjogezB9IOC4leC5ieC4reC4h+C4o+C4teC5gOC4l+C4tOC4o+C5jOC4mSAndHJ1ZScuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCLguKPguLXguYDguITguKfguKrguKPguLXguYDguJfguLTguKPguYzguJkgZXJyb3IgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCLguKPguLXguYDguITguKfguKrguKPguLXguYDguJfguLTguKPguYzguJnguILguYnguK3guKHguLnguKXguKfguYjguLLguIfguYDguJvguKXguYjguLIg4Lir4Lij4Li34LitICdwYXRoJyBwcm9wZXJ0eSDguYTguKHguYjguJbguLnguIHguJXguYnguK3guIdcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCLguILguJnguLLguJTguYTguJ/guKXguYzguJXguYnguK3guIfguYTguKHguYjguYDguIHguLTguJkgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwi4LiB4Lij4Li44LiT4Liy4LmD4Liq4LmI4LiE4LmI4Liy4Lit4Li34LmI4LiZXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCLguYTguJ/guKXguYzguILguK3guIfguITguLjguJPguIHguLPguKXguLHguIfguK3guLHguJ7guYLguKvguKXguJTguK3guKLguLnguYguIOC4geC4o+C4uOC4k+C4suC4o+C4reC4quC4seC4geC4hOC4o+C4ueC5iOC5geC4peC5ieC4p+C4l+C4s+C4geC4suC4o+C4peC4reC4h+C4reC4teC4geC4hOC4o+C4seC5ieC4h1wiLFxuICBsb2FkaW5nRmlsZTogXCLguIHguLPguKXguLHguIfguYLguKvguKXguJQuLi5cIixcbiAgY2hvb3NlRmlsZTogXCLguYDguKXguLfguK3guIHguYTguJ/guKXguYwuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcIuC5hOC4oeC5iOC5hOC4n+C4peC5jOC4l+C4teC5iOC5gOC4peC4t+C4reC4gVwiLFxuICBjb25maXJtRGVsZXRlOiBcIuC4hOC4uOC4k+C4leC5ieC4reC4h+C4geC4suC4o+C4peC4muC4o+C4suC4ouC4geC4suC4o+C4meC4teC5ieC4iOC4o+C4tOC4h+C4q+C4o+C4t+C4reC5hOC4oeC5iD9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCLguILguYnguK3guKHguLnguKXguJnguLXguYnguJXguYnguK3guIfguYDguJvguYfguJkgdW5pcXVlLlwiLFxuICBhZGRDb2x1bW46IFwi4LmA4Lie4Li04LmI4Lih4LiE4Lit4Lil4Lix4Lih4LiZ4LmMXCIsXG4gIGFkZFJvdzogXCLguYDguJ7guLTguYjguKHguYHguJbguKdcIixcbiAgcmVtb3ZlUm93OiBcIuC4peC4mlwiLFxuICBhZGRQYW5lbDogXCLguYDguJ7guLTguYjguKFcIixcbiAgcmVtb3ZlUGFuZWw6IFwi4Lil4LiaXCIsXG4gIGNob2ljZXNfSXRlbTogXCLguIrguLTguYnguJlcIixcbiAgbWF0cml4X2NvbHVtbjogXCLguITguK3guKXguLHguKHguJnguYxcIixcbiAgbWF0cml4X3JvdzogXCLguYHguJbguKdcIixcbiAgc2F2aW5nRGF0YTogXCLguJzguKXguKXguLHguJ7guJfguYzguIHguLPguKXguLHguIfguJrguLHguJnguJfguLbguIHguKXguIfguJfguLXguYjguYDguIvguLTguKPguYzguJ/guYDguKfguK3guKPguYwuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIuC4oeC4teC4hOC4p+C4suC4oeC4nOC4tOC4lOC4nuC4peC4suC4lOC5gOC4geC4tOC4lOC4guC4tuC5ieC4meC4quC5iOC4h+C4nOC4peC5g+C4q+C5ieC5hOC4oeC5iOC4quC4suC4oeC4suC4o+C4luC4muC4seC4meC4l+C4tuC4geC4nOC4peC5hOC4lOC5iVwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCLguJrguLHguJnguJfguLbguIHguKrguLPguYDguKPguYfguIjguYHguKXguYnguKdcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIuC4o+C4muC4geC4p+C4meC4peC4reC4h+C4reC4teC4geC4hOC4o+C4seC5ieC4h1wiLFxuICB0aW1lck1pbjogXCLguJnguLLguJfguLVcIixcbiAgdGltZXJTZWM6IFwi4Lin4Li04LiZ4Liy4LiX4Li1XCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwi4LiE4Li44LiT4LmD4LiK4LmJ4LmA4Lin4Lil4LiyIHswfSDguJrguJnguKvguJnguYnguLLguJnguLXguYnguYHguKXguLAgezF9IOC4o+C4p+C4oeC4l+C4seC5ieC4h+C4q+C4oeC4lFwiLFxuICB0aW1lclNwZW50UGFnZTogXCLguITguLjguJPguYPguIrguYnguYDguKfguKXguLIgezB9IOC4muC4meC4q+C4meC5ieC4suC4meC4teC5iVwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIuC4hOC4uOC4k+C5g+C4iuC5ieC5gOC4p+C4peC4siB7MH0g4Lij4Lin4Lih4LiX4Lix4LmJ4LiH4Lir4Lih4LiUXCIsXG4gIHRpbWVyTGltaXRBbGw6IFwi4LiE4Li44LiT4LmD4LiK4LmJ4LmA4Lin4Lil4LiyIHswfSDguILguK3guIcgezF9IOC4muC4meC4q+C4meC5ieC4suC4meC4teC5ieC5geC4peC4sCB7Mn0g4LiC4Lit4LiHIHszfSDguKPguKfguKHguJfguLHguYnguIfguKvguKHguJRcIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwi4LiE4Li44LiT4LmD4LiK4LmJ4LmA4Lin4Lil4LiyIHswfSDguILguK3guIcgezF9IOC4muC4meC4q+C4meC5ieC4suC4meC4teC5iVwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIuC4hOC4uOC4k+C5g+C4iuC5ieC5gOC4p+C4peC4siB7MH0g4LiC4Lit4LiHIHsxfSDguKPguKfguKHguJfguLHguYnguIfguKvguKHguJRcIixcbiAgY2xlYW5DYXB0aW9uOiBcIuC4hOC4peC4teC4mVwiLFxuICBjbGVhckNhcHRpb246IFwi4LmA4LiE4Lil4Li14Lii4Lij4LmMXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcIuC5gOC4peC4t+C4reC4geC5hOC4n+C4peC5jFwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCLguJnguLPguYTguJ/guKXguYzguJnguLXguYnguK3guK3guIFcIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCLguYPguIrguYhcIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcIuC5hOC4oeC5iOC5g+C4iuC5iFwiLFxuICBjb25maXJtUmVtb3ZlRmlsZTogXCLguITguLjguJPguYHguJnguYjguYPguIjguJfguLXguYjguIjguLDguJnguLPguYTguJ/guKXguYzguJnguLXguYnguK3guK3guIHguYPguIrguYjguKvguKPguLfguK3guYTguKHguYg6IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIuC4hOC4uOC4k+C5geC4meC5iOC5g+C4iOC4l+C4teC5iOC4iOC4sOC4meC4s+C5hOC4n+C4peC5jOC4l+C4seC5ieC4h+C4q+C4oeC4lOC4reC4reC4geC5g+C4iuC5iOC4q+C4o+C4t+C4reC5hOC4oeC5iFwiLFxuICBxdWVzdGlvblRpdGxlUGF0dGVyblRleHQ6IFwi4LiK4Li34LmI4Lit4LiE4Liz4LiW4Liy4LihXCIsXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcInRoXCJdID0gdGhhaVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJ0aFwiXSA9IFwi4LmE4LiX4LiiXCI7XG4iLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIHRyYWRpdGlvbmFsQ2hpbmVzZVN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCLkuIrkuIDpoIFcIixcbiAgcGFnZU5leHRUZXh0OiBcIuS4i+S4gOmggVwiLFxuICBjb21wbGV0ZVRleHQ6IFwi5o+Q5Lqk5ZWP5Y23XCIsXG4gIG90aGVySXRlbVRleHQ6IFwi5aGr5a+r5YW25LuW562U5qGIXCIsXG4gIHByb2dyZXNzVGV4dDogXCLnrKwgezB9IOmggSwg5YWxIHsxfSDpoIFcIixcbiAgZW1wdHlTdXJ2ZXk6IFwi5ZWP5Y235Lit5rKS5pyJ5ZWP6aGM5oiW6aCB6Z2iXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwi5oSf6Kyd5oKo55qE5Y+D6IiHIVwiLFxuICBsb2FkaW5nU3VydmV5OiBcIuWVj+WNt+i8ieWFpeS4rS4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCLoq4vpgbjmk4cuLi5cIixcbiAgcmVxdWlyZWRFcnJvcjogXCLoq4vloavlr6vmraTllY/poYxcIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCLoq4vloavlr6vmiYDmnInooYzkuK3llY/poYxcIixcbiAgbnVtZXJpY0Vycm9yOiBcIuetlOahiOW/hemgiOaYr+WAi+aVuOWtl1wiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIuetlOahiOmVt+W6puiHs+WwkSB7MH0g5YCL5a2X5YWDXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwi562U5qGI6ZW35bqm5LiN6IO96LaF6YGOIHswfSDlgIvlrZflhYNcIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCLnrZTmoYjplbfluqblv4XpoIjlnKggezB9IC0gezF9IOWAi+Wtl+WFg+S5i+mWk1wiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIuacgOWwkemcgOimgeWhq+WvqyB7MH0g6KGM562U5qGIXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIuacgOWwkemcgOimgemBuOaThyB7MH0g6aCF562U5qGIXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIuacgOWkmuWPquiDvemBuOaThyB7MH0g6aCF562U5qGIXCIsXG4gIG51bWVyaWNNaW5NYXg6IFwi562U5qGIICd7MH0nIOW/hemgiOWkp+aWvOetieaWvCB7MX0g5LiU5bCP5pa8562J5pa8IHsyfVwiLFxuICBudW1lcmljTWluOiBcIuetlOahiCAnezB9JyDlv4XpoIjlpKfmlrznrYnmlrwgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwi562U5qGIICd7MH0nIOW/hemgiOWwj+aWvOetieaWvCB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIuiri+i8uOWFpeacieaViOeahCBFbWFpbCDlnLDlnYBcIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIui8ieWFpemBuOmgheaZgueZvOeUn+mMr+iqpCAnezB9JzogezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjogXCLmnKrog73ovInlhaXmnInmlYjnmoTpgbjpoIXmiJboq4vmsYLlj4Pmlbjot6/lvpHmnInoqqRcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCLmlofku7blpKflsI/kuI3og73otoXpgY4gezB9XCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCLoq4vlrozmiJDlhbbku5bllY/poYxcIixcbiAgdXBsb2FkaW5nRmlsZTogXCLmlofku7bkuIrlgrPkuK0uLi4g6KuL6ICQ5b+D562J5b6F5bm+56eS5b6M6YeN6KmmXCIsXG4gIGFkZFJvdzogXCLmt7vliqDnrZTmoYhcIixcbiAgcmVtb3ZlUm93OiBcIuWIqumZpOetlOahiFwiLFxuICBjaG9pY2VzX0l0ZW06IFwi6YG46aCFXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwi5YiXXCIsXG4gIG1hdHJpeF9yb3c6IFwi6KGMXCIsXG4gIHNhdmluZ0RhdGE6IFwi5q2j5Zyo5bCH57WQ5p6c5L+d5a2Y5Yiw5pyN5YuZ5ZmoLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCLlnKjkv53lrZjntZDmnpzpgY7nqIvkuK3nmbznlJ/kuobpjK/oqqTvvIzntZDmnpzmnKrog73kv53lrZhcIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwi57WQ5p6c5L+d5a2Y5oiQ5YqfIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwi6KuL6YeN6KmmXCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiemgtdHdcIl0gPSB0cmFkaXRpb25hbENoaW5lc2VTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiemgtdHdcIl0gPSBcIue5gemrlOS4reaWh1wiO1xuIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciB0dXJraXNoU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIkdlcmlcIixcbiAgcGFnZU5leHRUZXh0OiBcIsSwbGVyaVwiLFxuICBjb21wbGV0ZVRleHQ6IFwiQW5rZXRpIFRhbWFtbGFcIixcbiAgcHJldmlld1RleHQ6IFwiw5ZuIGl6bGVtZVwiLFxuICBlZGl0VGV4dDogXCJEw7x6ZW5sZVwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwiQmHFn2xhdFwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIkRpxJ9lciAoYcOnxLFrbGF5xLFuxLF6KVwiLFxuICBub25lSXRlbVRleHQ6IFwiWW9rXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIkhlcHNpbmkgc2XDp1wiLFxuICBwcm9ncmVzc1RleHQ6IFwiU2F5ZmEgezB9IC8gezF9XCIsXG4gIHBhbmVsRHluYW1pY1Byb2dyZXNzVGV4dDogXCJLYXnEsXQgezB9IC8gezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCJTb3J1bGFyxLEgY2V2YXBsYWTEsSB7MH0gLyB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwiQW5rZXR0ZSBnw7Zyw7xudMO8bGVuZWNlayBzYXlmYSB5YSBkYSBzb3J1IG1ldmN1dCBkZcSfaWwuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiQW5rZXRpbWl6aSB0YW1hbWxhZMSxxJ/EsW7EsXogacOnaW4gdGXFn2Vra8O8ciBlZGVyaXouXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgXCJLYXnEsXRsYXLEsW3EsXosIGJ1IGFua2V0aSB6YXRlbiB0YW1hbWxhZMSxxJ/EsW7EsXrEsSBnw7ZzdGVyaXlvci5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJBbmtldCBzdW51Y3VkYW4gecO8a2xlbml5b3IgLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIlNlw6dpbml6IC4uLlwiLFxuICB2YWx1ZTogXCJkZcSfZXJcIixcbiAgcmVxdWlyZWRFcnJvcjogXCJMw7x0ZmVuIHNvcnV5YSBjZXZhcCB2ZXJpbml6XCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIkzDvHRmZW4gZW4gYXogYmlyIHNvcnV5dSB5YW7EsXRsYXnEsW4uXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiTMO8dGZlbiB0w7xtIHNhdMSxcmxhcmRha2kgc29ydWxhcsSxIGNldmFwbGF5xLFuxLF6LlwiLFxuICBudW1lcmljRXJyb3I6IFwiR2lyaWxlbiBkZcSfZXIgbnVtZXJpayBvbG1hbMSxZMSxclwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIkVuIGF6IHswfSBzZW1ib2wgZ2lyaW5pei5cIixcbiAgdGV4dE1heExlbmd0aDogXCJMw7x0ZmVuIHswfSBrYXJha3RlcmRlbiBheiBnaXJpbi5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCJMw7x0ZmVuIHswfSDigJlkZW4gZmF6bGEgdmUgezF9IOKAmWRlbiBheiBrYXJha3RlciBnaXJpbi5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJMw7x0ZmVuIGVuIGF6IHswfSBzYXTEsXLEsSBkb2xkdXJ1bi5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiTMO8dGZlbiBlbiBheiB7MH0gc2XDp2VuZcSfaSBzZcOnaW5pei5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiTMO8dGZlbiB7MH0gYWRldHRlbiBmYXpsYSBzZcOnbWV5aW5pei5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIlRoZSAnezB9JyBzaG91bGQgYmUgZXF1YWwgb3IgbW9yZSB0aGFuIHsxfSBhbmQgZXF1YWwgb3IgbGVzcyB0aGFuIHsyfVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nIGRlxJ9lcmkgezF9IGRlxJ9lcmluZSBlxZ9pdCB2ZXlhIGLDvHnDvGsgb2xtYWzEsWTEsXJcIixcbiAgbnVtZXJpY01heDogXCInezB9JyBkZcSfZXJpIHsxfSBkZcSfZXJpbmUgZcWfaXQgeWEgZGEga8O8w6fDvGsgb2xtYWzEsWTEsXIuXCIsXG4gIGludmFsaWRFbWFpbDogXCJMw7x0ZmVuIGdlw6dlcmxpIGJpciBlcG9zdGEgYWRyZXNpIGdpcmluaXouXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIsSwZmFkZTogezB9ICd0cnVlJyBkw7ZuZMO8cm1lbGlkaXIuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCJUYWxlYmkgxZ91IGhhdGF5xLEgZMO2bmTDvCAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcIlRhbGVwIGhlcmhhbmdpIGJpciB2ZXJpIGTDtm5tZWRpIHlhIGRhICdwYXRoJyDDtnplbGxpxJ9pIGhhdGFsxLEuXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiRG9zeWEgYm95dXR1IHswfSBkZcSfZXJpbmkgZ2XDp2VtZXouXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJMw7x0ZmVuIGRpxJ9lciBkZcSfZXJsZXJpIGdpcmluaXouXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCJEb3N5YW7EsXogecO8a2xlbml5b3IuIEzDnHRmZW4gYmlya2HDpyBzYW5peWUgYmVrbGV5aW4gdmUgdGVrcmFyIGRlbmV5aW4uXCIsXG4gIGxvYWRpbmdGaWxlOiBcIlnDvGtsZW5peW9yLi4uXCIsXG4gIGNob29zZUZpbGU6IFwiRG9zeWFsYXLEsSBzZcOnaW4gLi4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCJEb3N5YSBzZcOnaWxpIGRlxJ9pbFwiLFxuICBjb25maXJtRGVsZXRlOiBcIktheWTEsSBzaWxtZWsgaXN0aXlvciBtdXN1bnV6P1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIkJ1IGRlxJ9lciBiZW56ZXJzaXogb2xtYWzEsWTEsXIuXCIsXG4gIGFkZENvbHVtbjogXCJTw7x0dW4gZWtsZXlpblwiLFxuICBhZGRSb3c6IFwiU2F0xLFyIEVrbGVcIixcbiAgcmVtb3ZlUm93OiBcIkthbGTEsXJcIixcbiAgYWRkUGFuZWw6IFwiWWVuaSBla2xlXCIsXG4gIHJlbW92ZVBhbmVsOiBcIkthbGTEsXJtYWtcIixcbiAgY2hvaWNlc19JdGVtOiBcImXFn3lhXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiU8O8dHVuXCIsXG4gIG1hdHJpeF9yb3c6IFwiS8O8cmVrIMOnZWttZWtcIixcbiAgc2F2aW5nRGF0YTogXCJTb251w6dsYXIgc3VudWN1eWEga2F5ZGVkaWxpeW9yIC4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiQmlyIGhhdGEgb2x1xZ90dSB2ZSBzb251w6dsYXLEsSBrYXlkZWRlbWVkaWsuXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIlNvbnXDp2xhciBiYcWfYXLEsXlsYSBrYXlkZWRpbGRpIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiVGVrcmFyIGRlbmV5aW5cIixcbiAgdGltZXJNaW46IFwibWluXCIsXG4gIHRpbWVyU2VjOiBcInNhbml5ZVwiLFxuICB0aW1lclNwZW50QWxsOiBcIkJ1IHNheWZhZGEgezB9IHZlIHRvcGxhbWRhIHsxfSBoYXJjYWTEsW7EsXouXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIkJ1IHNheWZheWEgezB9IGhhcmNhZMSxbsSxei5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCJUb3BsYW1kYSB7MH0gaGFyY2FkxLFuxLF6LlwiLFxuICB0aW1lckxpbWl0QWxsOlxuICAgIFwiQnUgc2F5ZmF5YSB7MH0gLyB7MX0gdmUgdG9wbGFtZGEgezJ9IC8gezN9IGhhcmNhZMSxbsSxei5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiQnUgc2F5ZmF5YSB7MH0gLyB7MX0gaGFyY2FkxLFuxLF6LlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIlRvcGxhbWRhIHswfSAvIHsxfSBoYXJjYWTEsW7EsXouXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCJUZW1pelwiLFxuICBjbGVhckNhcHRpb246IFwiQcOnxLFrXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcIkRvc3lhIHNlw6dpblwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCJCdSBkb3N5YXnEsSBrYWxkxLFyXCIsXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwiRXZldFwiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwiSGF5xLFyXCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcIkJ1IGRvc3lhecSxIGthbGTEsXJtYWsgaXN0ZWRpxJ9pbml6ZGVuIGVtaW4gbWlzaW5pejogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwiVMO8bSBkb3N5YWxhcsSxIGthbGTEsXJtYWsgaXN0ZWRpxJ9pbml6ZGVuIGVtaW4gbWlzaW5pej9cIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcIlNvcnUgYmHFn2zEscSfxLFcIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1widHJcIl0gPSB0dXJraXNoU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcInRyXCJdID0gXCJ0w7xya8OnZVwiO1xuIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciB1a3JhaW5pYW5TdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwi0J3QsNC30LDQtFwiLFxuICBwYWdlTmV4dFRleHQ6IFwi0JTQsNC70ZZcIixcbiAgY29tcGxldGVUZXh0OiBcItCX0LDQstC10YDRiNC40YLQuFwiLFxuICBwcmV2aWV3VGV4dDogXCLQn9C+0L/QtdGA0LXQtNC90ZbQuSDQv9C10YDQtdCz0LvRj9C0XCIsXG4gIGVkaXRUZXh0OiBcItCg0LXQtNCw0LPRg9Cy0LDRgtC4XCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCLQn9C+0YfQsNGC0LhcIixcbiAgb3RoZXJJdGVtVGV4dDogXCLQhtC90YjQtSAo0LHRg9C00Ywg0LvQsNGB0LrQsCwg0L7Qv9C40YjRltGC0YwpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCLQltC+0LTQtdC9XCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcItCS0LjQsdGA0LDRgtC4INCy0YHQtVwiLFxuICBwcm9ncmVzc1RleHQ6IFwi0KHRgtC+0YDRltC90LrQsCB7MH0g0LcgezF9XCIsXG4gIHBhbmVsRHluYW1pY1Byb2dyZXNzVGV4dDogXCLQl9Cw0L/QuNGBIHswfSDRltC3IHsxfVwiLFxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwi0JLRltC00L/QvtCy0ZbQu9C4INC90LAgezB9L3sxfSDQv9C40YLQsNC90YxcIixcbiAgZW1wdHlTdXJ2ZXk6IFwi0J3QtdC80LDRlCDQttC+0LTQvdC+0LPQviDQv9C40YLQsNC90L3Rjy5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCLQlNGP0LrRg9GU0LzQviDQktCw0Lwg0LfQsCDQt9Cw0L/QvtCy0L3QtdC90L3RjyDQsNC90LrQtdGC0LghXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgXCLQktC4INCy0LbQtSDQv9GA0L7RhdC+0LTQuNC70Lgg0YbQtSDQvtC/0LjRgtGD0LLQsNC90L3Rjy5cIixcbiAgbG9hZGluZ1N1cnZleTogXCLQl9Cw0LLQsNC90YLQsNC20LXQvdC90Y8g0L7Qv9C40YLRg9Cy0LDQvdC90Y8uLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwi0JLQuNCx0YDQsNGC0LguLi5cIixcbiAgdmFsdWU6IFwi0LfQvdCw0YfQtdC90L3Rj1wiLFxuICByZXF1aXJlZEVycm9yOiBcItCR0YPQtNGMINC70LDRgdC60LAsINC00LDQudGC0LUg0LLRltC00L/QvtCy0ZbQtNGMLlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCLQkdGD0LTRjCDQu9Cw0YHQutCwLCDQtNCw0LnRgtC1INCy0ZbQtNC/0L7QstGW0LTRjCDRhdC+0YfQsCDQsSDQvdCwINC+0LTQvdC1INC/0LjRgtCw0L3QvdGPLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcItCR0YPQtNGMINC70LDRgdC60LAsINC00LDQudGC0LUg0LLRltC00L/QvtCy0ZbQtNGMINC90LAg0L/QuNGC0LDQvdC90Y8g0LIg0LrQvtC20L3QvtC80YMg0YDRj9C00LrRgy5cIixcbiAgbnVtZXJpY0Vycm9yOiBcItCS0ZbQtNC/0L7QstGW0LTRjCDQv9C+0LLQuNC90L3QsCDQsdGD0YLQuCDRh9C40YHQu9C+0LwuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwi0JHRg9C00Ywg0LvQsNGB0LrQsCDQstCy0LXQtNGW0YLRjCDQsdGW0LvRjNGI0LUgezB9INGB0LjQvNCy0L7Qu9GW0LIuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwi0JHRg9C00Ywg0LvQsNGB0LrQsCDQstCy0LXQtNGW0YLRjCDQvNC10L3RiNC1IHswfSDRgdC40LzQstC+0LvRltCyLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcItCR0YPQtNGMINC70LDRgdC60LAg0LLQstC10LTRltGC0Ywg0LHRltC70YzRiNC1IHswfSDQuCDQvNC10L3RiNC1IHsxfSDRgdC40LzQstC+0LvRltCyLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcItCR0YPQtNGMINC70LDRgdC60LAsINC30LDQv9C+0LLQvdGW0YLRjCDQvdC1INC80LXQvdGI0LUgezB9INGA0Y/QtNC60ZbQsi5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwi0JHRg9C00Ywg0LvQsNGB0LrQsCwg0LLQuNCx0LXRgNGW0YLRjCDRhdC+0YfQsCDQsSB7MH0g0LLQsNGA0ZbQsNC90YLRltCyLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCLQkdGD0LTRjCDQu9Cw0YHQutCwLCDQstC40LHQtdGA0ZbRgtGMINC90LUg0LHRltC70YzRiNC1IHswfSDQstCw0YDRltCw0L3RgtGW0LIuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCInezB9JyDQv9C+0LLQuNC90L3QviDQsdGD0YLQuCDQvdC1INC80LXQvdGI0LUg0L3RltC2IHsxfSwg0ZYg0L3QtSDQsdGW0LvRjNGI0LUg0L3RltC2IHsyfVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nINC/0L7QstC40L3QvdC+INCx0YPRgtC4INC90LUg0LzQtdC90YjQtSDQvdGW0LYgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScg0L/QvtCy0LjQvdC90L4g0LHRg9GC0Lgg0L3QtSDQsdGW0LvRjNGI0LUg0L3RltC2IHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwi0JHRg9C00Ywg0LvQsNGB0LrQsCwg0LLQstC10LTRltGC0Ywg0LTRltC50YHQvdGDINCw0LTRgNC10YHRgyDQtdC70LXQutGC0YDQvtC90L3QvtGXINC/0L7RiNGC0LguXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcItCS0LjRgNCw0LcgezB9INC/0L7QstC40L3QtdC9INC/0L7QstC10YDRgtCw0YLQuCAndHJ1ZScuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCLQl9Cw0L/QuNGCINC/0L7QstC10YDQvdGD0LIg0L/QvtC80LjQu9C60YMgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCLQktGW0LTQv9C+0LLRltC00Ywg0L3QsCDQt9Cw0L/QuNGCINC/0L7QstC10YDQvdGD0LvQsNGB0Ywg0L/QvtGA0L7QttC90YzQvtGOINCw0LHQviDQstC70LDRgdGC0LjQstGW0YLRjCAncGF0aCcg0LLQutCw0LfQsNC90L4g0L3QtdCy0ZbRgNC90L5cIixcbiAgZXhjZWVkTWF4U2l6ZTogXCLQoNC+0LfQvNGW0YAg0YTQsNC50LvRgyDQvdC1INC/0L7QstC40L3QtdC9INC/0LXRgNC10LLQuNGJ0YPQstCw0YLQuCB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCLQkdGD0LTRjCDQu9Cw0YHQutCwLCDQstCy0LXQtNGW0YLRjCDQtNCw0L3RliDQsiDQv9C+0LvQtSAn0IbQvdGI0LUnXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCLQktCw0Ygg0YTQsNC50Lsg0LfQsNCy0LDQvdGC0LDQttGD0ZTRgtGM0YHRjy4g0JfQsNGH0LXQutCw0LnRgtC1INC00LXQutGW0LvRjNC60LAg0YHQtdC60YPQvdC0INGWINGB0L/RgNC+0LHRg9C50YLQtSDQt9C90L7QstGDLlwiLFxuICBsb2FkaW5nRmlsZTogXCLQl9Cw0LLQsNC90YLQsNC20LXQvdC90Y8uLi5cIixcbiAgY2hvb3NlRmlsZTogXCLQktC40LHQtdGA0ZbRgtGMINGE0LDQudC7KNC4KS4uLlwiLFxuICBub0ZpbGVDaG9zZW46IFwi0KTQsNC50Lsg0L3QtSDQstC40LHRgNCw0L3QvlwiLFxuICBjb25maXJtRGVsZXRlOiBcItCS0Lgg0YXQvtGH0LXRgtC1INCy0LjQtNCw0LvQuNGC0Lgg0LfQsNC/0LjRgT9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCLQptC1INC30L3QsNGH0LXQvdC90Y8g0L/QvtCy0LjQvdC90L4g0LHRg9GC0Lgg0YPQvdGW0LrQsNC70YzQvdC40LwuXCIsXG4gIGFkZENvbHVtbjogXCLQlNC+0LTQsNGC0Lgg0LrQvtC70L7QvdC60YNcIixcbiAgYWRkUm93OiBcItCU0L7QtNCw0YLQuCDRgNGP0LTQvtC6XCIsXG4gIHJlbW92ZVJvdzogXCLQktC40LTQsNC70LjRgtC4XCIsXG4gIGFkZFBhbmVsOiBcItCU0L7QtNCw0YLQuCDQvdC+0LLRg1wiLFxuICByZW1vdmVQYW5lbDogXCLQktC40LTQsNC70LjRgtC4XCIsXG4gIGNob2ljZXNfSXRlbTogXCLQktCw0YDRltCw0L3RglwiLFxuICBtYXRyaXhfY29sdW1uOiBcItCa0L7Qu9C+0L3QutCwXCIsXG4gIG1hdHJpeF9yb3c6IFwi0KDRj9C00L7QulwiLFxuICBzYXZpbmdEYXRhOiBcItCg0LXQt9GD0LvRjNGC0LDRgtC4INC30LHQtdGA0ZbQs9Cw0Y7RgtGM0YHRjyDQvdCwINGB0LXRgNCy0LXRgC4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwi0JLRltC00LHRg9C70LDRgdGPINC/0L7QvNC40LvQutCwLCDRgNC10LfRg9C70YzRgtCw0YIg0L3QtSDQsdGD0LIg0LfQsdC10YDQtdC20LXQvdC40LkuXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcItCg0LXQt9Cy0YPQu9GM0YLQsNGCINGD0YHQv9GW0YjQvdC+INC30LHQtdGA0LXQttC10L3QuNC5IVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwi0KHQv9GA0L7QsdGD0LLQsNGC0Lgg0LfQvdC+0LLRg1wiLFxuICB0aW1lck1pbjogXCLRhdCyXCIsXG4gIHRpbWVyU2VjOiBcItGB0LXQulwiLFxuICB0aW1lclNwZW50QWxsOiBcItCS0Lgg0LLQuNGC0YDQsNGC0LjQu9C4IHswfSDQvdCwINGG0ZbQuSDRgdGC0L7RgNGW0L3RhtGWINGWIHsxfSDQt9Cw0LPQsNC70L7QvC5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwi0JLQuCDQstC40YLRgNCw0YLQuNC70LggezB9INC90LAg0YbRltC5INGB0YLQvtGA0ZbQvdGG0ZYuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwi0JLQuCDQstC40YLRgNCw0YLQuNC70LggezB9INC/0YDQvtGC0Y/Qs9C+0Lwg0YLQtdGB0YLRgy5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcItCS0Lgg0LLQuNGC0YDQsNGC0LjQu9C4IHswfSDQtyB7MX0g0L3QsCDRhtGW0Lkg0YHRgtC+0YDRltC90YbRliDRliB7Mn0g0LcgezN9INC00LvRjyDQstGB0YzQvtCz0L4g0YLQtdGB0YLRgy5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwi0JLQuCDQstC40YLRgNCw0YLQuNC70LggezB9INC3IHsxfSDQvdCwINGG0ZbQuSDRgdGC0L7RgNGW0L3RhtGWLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcItCS0Lgg0LLQuNGC0YDQsNGC0LjQu9C4IHswfSDQtyB7MX0g0LTQu9GPINCy0YHRjNC+0LPQviDRgtC10YHRgtGDLlwiLFxuICBjbGVhbkNhcHRpb246IFwi0J7Rh9C40YHRgtC40YLQuFwiLFxuICBjbGVhckNhcHRpb246IFwi0J7Rh9C40YHRgtC40YLQuFwiLFxuICBjaG9vc2VGaWxlQ2FwdGlvbjogXCLQktC40LHQtdGA0ZbRgtGMINGE0LDQudC7XCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcItCS0LjQtNCw0LvQuNGC0Lgg0YTQsNC50LtcIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCLQotCw0LpcIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcItCd0ZZcIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwi0JLQuCDQstC/0LXQstC90LXQvdGWLCDRidC+INGF0L7Rh9C10YLQtSDQstC40LTQsNC70LjRgtC4INGG0LXQuSDRhNCw0LnQuzogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwi0JLQuCDQstC/0LXQstC90LXQvdGWLCDRidC+INGF0L7Rh9C10YLQtSDQstC40LTQsNC70LjRgtC4INCy0YHRliDRhNCw0LnQu9C4P1wiLFxuICBxdWVzdGlvblRpdGxlUGF0dGVyblRleHQ6IFwi0J3QsNC30LLQsCDQt9Cw0L/QuNGC0LDQvdC90Y9cIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1widWFcIl0gPSB1a3JhaW5pYW5TdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1widWFcIl0gPSBcItGD0LrRgNCw0ZfQvdGB0YzQutCwXCI7XG4iLCIvL1VuY29tbWVudCB0aGlzIGxpbmUgb24gY3JlYXRpbmcgYSB0cmFuc2xhdGlvbiBmaWxlXG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIHZpZXRuYW1lc2VTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiUHJldmlvdXNcIixcbiAgcGFnZU5leHRUZXh0OiBcIk5leHRcIixcbiAgY29tcGxldGVUZXh0OiBcIkNvbXBsZXRlXCIsXG4gIHByZXZpZXdUZXh0OiBcIlByZXZpZXdcIixcbiAgZWRpdFRleHQ6IFwiRWRpdFwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwiU3RhcnRcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJPdGhlciAoZGVzY3JpYmUpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCJOb25lXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIlNlbGVjdCBBbGxcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlBhZ2UgezB9IG9mIHsxfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwiUmVjb3JkIHswfSBvZiB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcIkFuc3dlcmVkIHswfS97MX0gcXVlc3Rpb25zXCIsXG4gIGVtcHR5U3VydmV5OiBcIlRoZXJlIGlzIG5vIHZpc2libGUgcGFnZSBvciBxdWVzdGlvbiBpbiB0aGUgc3VydmV5LlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIlRoYW5rIHlvdSBmb3IgY29tcGxldGluZyB0aGUgc3VydmV5IVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiT3VyIHJlY29yZHMgc2hvdyB0aGF0IHlvdSBoYXZlIGFscmVhZHkgY29tcGxldGVkIHRoaXMgc3VydmV5LlwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkxvYWRpbmcgU3VydmV5Li4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIkNo4buNbi4uLlwiLFxuICB2YWx1ZTogXCJ2YWx1ZVwiLFxuICByZXF1aXJlZEVycm9yOiBcIlBsZWFzZSBhbnN3ZXIgdGhlIHF1ZXN0aW9uLlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJQbGVhc2UgYW5zd2VyIGF0IGxlYXN0IG9uZSBxdWVzdGlvbi5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJQbGVhc2UgYW5zd2VyIHF1ZXN0aW9ucyBpbiBhbGwgcm93cy5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIlRoZSB2YWx1ZSBzaG91bGQgYmUgbnVtZXJpYy5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJQbGVhc2UgZW50ZXIgYXQgbGVhc3QgezB9IGNoYXJhY3RlcnMuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiUGxlYXNlIGVudGVyIGxlc3MgdGhhbiB7MH0gY2hhcmFjdGVycy5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCJQbGVhc2UgZW50ZXIgbW9yZSB0aGFuIHswfSBhbmQgbGVzcyB0aGFuIHsxfSBjaGFyYWN0ZXJzLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIlBsZWFzZSBmaWxsIGluIGF0IGxlYXN0IHswfSByb3dzLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJQbGVhc2Ugc2VsZWN0IGF0IGxlYXN0IHswfSB2YXJpYW50cy5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiUGxlYXNlIHNlbGVjdCBubyBtb3JlIHRoYW4gezB9IHZhcmlhbnRzLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiVGhlICd7MH0nIHNob3VsZCBiZSBlcXVhbCBvciBtb3JlIHRoYW4gezF9IGFuZCBlcXVhbCBvciBsZXNzIHRoYW4gezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiVGhlICd7MH0nIHNob3VsZCBiZSBlcXVhbCBvciBtb3JlIHRoYW4gezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiVGhlICd7MH0nIHNob3VsZCBiZSBlcXVhbCBvciBsZXNzIHRoYW4gezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBlLW1haWwgYWRkcmVzcy5cIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwiVGhlIGV4cHJlc3Npb246IHswfSBzaG91bGQgcmV0dXJuICd0cnVlJy5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIlRoZSByZXF1ZXN0IHJldHVybmVkIGVycm9yICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwiVGhlIHJlcXVlc3QgcmV0dXJuZWQgZW1wdHkgZGF0YSBvciB0aGUgJ3BhdGgnIHByb3BlcnR5IGlzIGluY29ycmVjdFwiLFxuICBleGNlZWRNYXhTaXplOiBcIlRoZSBmaWxlIHNpemUgc2hvdWxkIG5vdCBleGNlZWQgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiUGxlYXNlIGVudGVyIHRoZSBvdGhlciB2YWx1ZS5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIllvdXIgZmlsZSBpcyB1cGxvYWRpbmcuIFBsZWFzZSB3YWl0IHNldmVyYWwgc2Vjb25kcyBhbmQgdHJ5IGFnYWluLlwiLFxuICBsb2FkaW5nRmlsZTogXCJMb2FkaW5nLi4uXCIsXG4gIGNob29zZUZpbGU6IFwiQ2hvb3NlIGZpbGUocykuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcIk5vIGZpbGUgY2hvc2VuXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiRG8geW91IHdhbnQgdG8gZGVsZXRlIHRoZSByZWNvcmQ/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwiVGhpcyB2YWx1ZSBzaG91bGQgYmUgdW5pcXVlLlwiLFxuICBhZGRDb2x1bW46IFwiQWRkIGNvbHVtblwiLFxuICBhZGRSb3c6IFwiQWRkIHJvd1wiLFxuICByZW1vdmVSb3c6IFwiUmVtb3ZlXCIsXG4gIGFkZFBhbmVsOiBcIkFkZCBuZXdcIixcbiAgcmVtb3ZlUGFuZWw6IFwiUmVtb3ZlXCIsXG4gIGNob2ljZXNfSXRlbTogXCJpdGVtXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiQ29sdW1uXCIsXG4gIG1hdHJpeF9yb3c6IFwiUm93XCIsXG4gIHNhdmluZ0RhdGE6IFwiVGhlIHJlc3VsdHMgYXJlIHNhdmluZyBvbiB0aGUgc2VydmVyLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCJBbiBlcnJvciBvY2N1cnJlZCBhbmQgd2UgY291bGQgbm90IHNhdmUgdGhlIHJlc3VsdHMuXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIlRoZSByZXN1bHRzIHdlcmUgc2F2ZWQgc3VjY2Vzc2Z1bGx5IVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiVHJ5IGFnYWluXCIsXG4gIHRpbWVyTWluOiBcIm1pblwiLFxuICB0aW1lclNlYzogXCJzZWNcIixcbiAgdGltZXJTcGVudEFsbDogXCJZb3UgaGF2ZSBzcGVudCB7MH0gb24gdGhpcyBwYWdlIGFuZCB7MX0gaW4gdG90YWwuXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIllvdSBoYXZlIHNwZW50IHswfSBvbiB0aGlzIHBhZ2UuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwiWW91IGhhdmUgc3BlbnQgezB9IGluIHRvdGFsLlwiLFxuICB0aW1lckxpbWl0QWxsOlxuICAgIFwiWW91IGhhdmUgc3BlbnQgezB9IG9mIHsxfSBvbiB0aGlzIHBhZ2UgYW5kIHsyfSBvZiB7M30gaW4gdG90YWwuXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIllvdSBoYXZlIHNwZW50IHswfSBvZiB7MX0gb24gdGhpcyBwYWdlLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIllvdSBoYXZlIHNwZW50IHswfSBvZiB7MX0gaW4gdG90YWwuXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCJDbGVhblwiLFxuICBjbGVhckNhcHRpb246IFwiQ2xlYXJcIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwiQ2hvb3NlIGZpbGVcIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwiUmVtb3ZlIHRoaXMgZmlsZVwiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIlllc1wiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwiTm9cIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwiQXJlIHlvdSBzdXJlIHRoYXQgeW91IHdhbnQgdG8gcmVtb3ZlIHRoaXMgZmlsZTogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwiQXJlIHlvdSBzdXJlIHRoYXQgeW91IHdhbnQgdG8gcmVtb3ZlIGFsbCBmaWxlcz9cIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcIlF1ZXN0aW9uIFRpdGxlXCIsXG59O1xuXG4vL1VuY29tbWVudCB0aGVzZSB0d28gbGluZXMgb24gY3JlYXRpbmcgYSB0cmFuc2xhdGlvbiBmaWxlLiBZb3Ugc2hvdWxkIHJlcGxhY2UgXCJlblwiIGFuZCBlblN0cmluZ3Mgd2l0aCB5b3VyIGxvY2FsZSAoXCJmclwiLCBcImRlXCIgYW5kIHNvIG9uKSBhbmQgeW91ciB2YXJpYWJsZS5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1widmlcIl0gPSB2aWV0bmFtZXNlU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcInZpXCJdID0gXCJ2aWV0bmFtZXNlXCI7XG4iLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIHdlbHNoU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIkJsYWVub3JvbFwiLFxuICBwYWdlTmV4dFRleHQ6IFwiTmVzYWZcIixcbiAgY29tcGxldGVUZXh0OiBcIkN3YmxoYXVcIixcbiAgcHJldmlld1RleHQ6IFwiUmhhZ29sd2dcIixcbiAgZWRpdFRleHQ6IFwiR29seWd1XCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCJEZWNocmF1XCIsXG4gIG90aGVySXRlbVRleHQ6IFwiQXJhbGwgKGRpc2dyaWZpd2NoKVwiLFxuICBub25lSXRlbVRleHQ6IFwiRGltXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIkRld2lzIHkgQ3lmYW4gXCIsXG4gIHByb2dyZXNzVGV4dDogXCJUdWRhbGVuIHswfSBvIHsxfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwiQ29mbm9kIHswfSBvIHsxfVwiLFxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwiV2VkaSBhdGViIHswfS97MX0gY3dlc3Rpd25cIixcbiAgZW1wdHlTdXJ2ZXk6IFwiRG9lcyBkaW0gbW9kZCBnd2VsZCB0dWRhbGVuIG5hIGNod2VzdGl3biB5biB5ciBhcm9sd2cuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiRGlvbGNoIGFtIGxlbndp4oCZciBob2xpYWR1ciFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTogXCJSeWR5Y2ggY2hpIHdlZGkgbGxlbndp4oCZciBhcm9sd2cgaHduIHluIGJhcm9kIHluIMO0bCBlaW4gY29mbm9kaW9uLlwiLFxuICBsb2FkaW5nU3VydmV5OiBcIldydGhp4oCZbiBMbHd5dGhv4oCZciBBcm9sd2cuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiRGV3aXN3Y2guLi5cIixcbiAgdmFsdWU6IFwiZ3dlcnRoXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiQXRlYndjaCB5IGN3ZXN0aXduLlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJBdGVid2NoIG8gbGVpYWYgdW4gY3dlc3Rpd24uXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiQXRlYndjaCB5IGN3ZXN0aXluYXUgeW0gbWhvYiByaGVzLlwiLFxuICBudW1lcmljRXJyb3I6IFwiRHlsYWnigJlyIGd3ZXJ0aCBmb2QgeW4gcmhpZi5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJSaG93Y2ggbyBsZWlhZiB7MH0gbm9kLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIlJob3djaCBsYWkgbmEgezB9IG5vZC5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCJSaG93Y2ggbyBsZWlhZiB7MH0gbm9kIG9uZCBkaW0gbXd5IG5hIHsxfS5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJMbGVud2NoIG8gbGVpYWYgezB9IHJoZXMuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIkRld2lzd2NoIG8gbGVpYWYgezB9IGFtcnl3aW9seW4uXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIlBlaWRpd2NoIMOiIGRld2lzIG13eSBuYSB7MH0gYW1yeXdpb2x5bi5cIixcbiAgbnVtZXJpY01pbk1heDogXCJEeWxhaeKAmXIgJ3swfScgZm9kIHlyIHVuIGZhdGggw6IgezF9IG5ldeKAmW4gZnd5LCBh4oCZciBmYXRoIMOiIHsyfSBuZXXigJluIGxsYWlcIixcbiAgbnVtZXJpY01pbjogXCJEeWxhaeKAmXIgJ3swfScgZm9kIHlyIHVuIGZhdGggw6IgezF9IG5ldeKAmW4gZnd5XCIsXG4gIG51bWVyaWNNYXg6IFwiRHlsYWnigJlyICd7MH0nIGZvZCB5ciB1biBmYXRoIMOiIHsxfSBuZXXigJluIGxsYWlcIixcbiAgaW52YWxpZEVtYWlsOiBcIlJob3djaCBneWZlaXJpYWQgZS1ib3N0IGRpbHlzLlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCJEeWxhaeKAmXIgbXluZWdpYWQgezB9IGFyd2FpbiBhdCAndHJ1ZScuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCJSb2VkZCB5IGNhaXMgd2VkaSBhcndhaW4gYXQgeSBnd2FsbCAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjogXCJSb2VkZCB5IGNhaXMgd2VkaSBhcndhaW4gYXQgZGRhdGEgZ3dhZyBuZXUgbWFlIHByaW9kd2VkZCB5IOKAmHBhdGjigJkgeW4gYW5naHl3aXIgXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiRGR5bGFp4oCZciBmZmVpbCBkZGltIGJvZCB5biBmd3kgbmEgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiUmhvd2NoIHkgZ3dlcnRoIGFyYWxsLlwiLFxuICB1cGxvYWRpbmdGaWxlOiBcIk1hZSBlaWNoIGZmZWlsIHdydGhp4oCZbiBsbHd5dGhvIGkgZnlueS4gQXJob3N3Y2ggeWNoeWRpZyBvIGVpbGlhZGF1IGEgcmhvaSBjeW5uaWcgYXJhbGwgYXJuaS5cIixcbiAgbG9hZGluZ0ZpbGU6IFwiV3J0aGnigJluIGxsd3l0aG8uLi5cIixcbiAgY2hvb3NlRmlsZTogXCJEZXdpc3djaCBmZmVpbChpYXUpLi4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCJIZWIgZGRld2lzIGZmZWlsIFwiLFxuICBjb25maXJtRGVsZXRlOiBcIllkeWNoIGNoaSBhbSBkZGlsZXXigJlyIGNvZm5vZD9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJEeWxhaeKAmXIgZ3dlcnRoIGh3biBmb2QgeW4gdW5pZ3J5dy5cIixcbiAgYWRkQ29sdW1uOiBcIlljaHdhbmVndSBjb2xvZm4gXCIsXG4gIGFkZFJvdzogXCJZY2h3YW5lZ3Ugcmhlc1wiLFxuICByZW1vdmVSb3c6IFwiVHlubnVcIixcbiAgYWRkUGFuZWw6IFwiWWNod2FuZWd1IG/igJlyIG5ld3lkZFwiLFxuICByZW1vdmVQYW5lbDogXCJUeW5udVwiLFxuICBjaG9pY2VzX0l0ZW06IFwiZWl0ZW1cIixcbiAgbWF0cml4X2NvbHVtbjogXCJDb2xvZm5cIixcbiAgbWF0cml4X3JvdzogXCJSaGVzXCIsXG4gIHNhdmluZ0RhdGE6IFwiTWFl4oCZciBjYW5seW5pYWRhdeKAmW4gY2FlbCBldSBjYWR3IGFyIHkgZ3dlaW55ZGQuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIlJvZWRkIGd3YWxsIGEgZG9lZGQgZGltIG1vZGQgY2Fkd+KAmXIgY2FubHluaWFkYXUuXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIldlZGkgbGx3eWRkbyBpIGdhZHfigJlyIGNhbmx5bmlhZGF1IVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiUmhvd2NoIGd5bm5pZyBhcmFsbCBhcm5pXCIsXG4gIHRpbWVyTWluOiBcIm11blwiLFxuICB0aW1lclNlYzogXCJlaWxcIixcbiAgdGltZXJTcGVudEFsbDogXCJSeWR5Y2ggY2hpIHdlZGkgdHJldWxpbyB7MH0gYXIgeSBkdWRhbGVuIGhvbiBhIHsxfSBneWRh4oCZaSBnaWx5ZGQuXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIlJ5ZHljaCBjaGkgd2VkaSB0cmV1bGlvIHswfSBhciB5IGR1ZGFsZW4gaG9uLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIlJ5ZHljaCBjaGkgd2VkaSB0cmV1bGlvIHswfSBneWRh4oCZaSBnaWx5ZGQuXCIsXG4gIHRpbWVyTGltaXRBbGw6IFwiUnlkeWNoIGNoaSB3ZWRpIHRyZXVsaW8gezB9IG8gezF9IGFyIHkgZHVkYWxlbiBob24gYSB7Mn0gbyB7M30gZ3lkYeKAmWkgZ2lseWRkLlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCJSeWR5Y2ggY2hpIHdlZGkgdHJldWxpbyB7MH0gbyB7MX0gYXIgeSBkdWRhbGVuIGhvbi5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCJSeWR5Y2ggY2hpIHdlZGkgdHJldWxpbyB7MH0gbyB7MX0gZ3lkYeKAmWkgZ2lseWRkLlwiLFxuICBjbGVhbkNhcHRpb246IFwiR2xhbmhhdVwiLFxuICBjbGVhckNhcHRpb246IFwiQ2xpcmlvXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcIkRld2lzd2NoIGZmZWlsIFwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCJUeW5udeKAmXIgZmZlaWwgaG9uIFwiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIklhd25cIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcIk5hXCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcIllkeWNoIGNoaeKAmW4gc2nFtXIgZWljaCBib2QgYW0gZHlubnXigJlyIGZmZWlsIGhvbjogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwiWWR5Y2ggY2hp4oCZbiBzacW1ciBlaWNoIGJvZCBhbSBkeW5udSBwb2IgZmZlaWw/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCJUZWl0bCB5IEN3ZXN0aXduIFwiLFxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJjeVwiXSA9IHdlbHNoU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImN5XCJdID0gXCJjeW1yYWVnXCI7XG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCJpbXBvcnQgeyBIYXNoVGFibGUgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBJdGVtVmFsdWUgfSBmcm9tIFwiLi9pdGVtdmFsdWVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBDb25kaXRpb25SdW5uZXIgfSBmcm9tIFwiLi9jb25kaXRpb25zXCI7XG5pbXBvcnQgeyBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGEgbWF0cml4IGJhc2UgcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbk1hdHJpeEJhc2VNb2RlbDxUUm93LCBUQ29sdW1uPiBleHRlbmRzIFF1ZXN0aW9uIHtcbiAgcHJvdGVjdGVkIGZpbHRlcmVkQ29sdW1uczogQXJyYXk8VENvbHVtbj47XG4gIHByb3RlY3RlZCBmaWx0ZXJlZFJvd3M6IEFycmF5PEl0ZW1WYWx1ZT47XG4gIHByb3RlY3RlZCBnZW5lcmF0ZWRWaXNpYmxlUm93czogQXJyYXk8VFJvdz4gPSBudWxsO1xuICBwcm90ZWN0ZWQgZ2VuZXJhdGVkVG90YWxSb3c6IFRSb3cgPSBudWxsO1xuICBwdWJsaWMgdmlzaWJsZVJvd3NDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZUNvbHVtblZhbHVlcygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZUl0ZW1WYWx1ZXMoXCJjb2x1bW5zXCIpO1xuICB9XG5cbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5maWx0ZXJlZFJvd3MgPSBudWxsO1xuICAgIHRoaXMuZmlsdGVyZWRDb2x1bW5zID0gbnVsbDtcbiAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmNyZWF0ZUNvbHVtblZhbHVlcygpO1xuICAgIHRoaXMucm93cyA9IHRoaXMuY3JlYXRlSXRlbVZhbHVlcyhcInJvd3NcIik7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJtYXRyaXhiYXNlXCI7XG4gIH1cbiAgcHVibGljIGdldCBpc0NvbXBvc2l0ZVF1ZXN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZSwgdG8gaGlkZSB0YWJsZSBoZWFkZXIuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRydWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dIZWFkZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dIZWFkZXJcIik7XG4gIH1cbiAgcHVibGljIHNldCBzaG93SGVhZGVyKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dIZWFkZXJcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgY29sdW1ucy4gQSBjb2x1bW4gaGFzIGEgdmFsdWUgYW5kIGFuIG9wdGlvbmFsIHRleHRcbiAgICovXG4gIGdldCBjb2x1bW5zKCk6IEFycmF5PGFueT4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb2x1bW5zXCIpO1xuICB9XG4gIHNldCBjb2x1bW5zKG5ld1ZhbHVlOiBBcnJheTxhbnk+KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29sdW1uc1wiLCBuZXdWYWx1ZSk7XG4gIH1cbiAgcHVibGljIGdldCB2aXNpYmxlQ29sdW1ucygpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gISF0aGlzLmZpbHRlcmVkQ29sdW1ucyA/IHRoaXMuZmlsdGVyZWRDb2x1bW5zIDogdGhpcy5jb2x1bW5zO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiByb3dzLiBBIHJvdyBoYXMgYSB2YWx1ZSBhbmQgYW4gb3B0aW9uYWwgdGV4dFxuICAgKi9cbiAgZ2V0IHJvd3MoKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJvd3NcIik7XG4gIH1cbiAgc2V0IHJvd3MobmV3VmFsdWU6IEFycmF5PGFueT4pIHtcbiAgICB2YXIgbmV3Um93cyA9IHRoaXMucHJvY2Vzc1Jvd3NPblNldChuZXdWYWx1ZSk7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicm93c1wiLCBuZXdSb3dzKTtcbiAgICB0aGlzLmZpbHRlckl0ZW1zKCk7XG4gIH1cbiAgcHJvdGVjdGVkIHByb2Nlc3NSb3dzT25TZXQobmV3Um93czogQXJyYXk8YW55Pikge1xuICAgIHJldHVybiBuZXdSb3dzO1xuICB9XG4gIHByb3RlY3RlZCBnZXRWaXNpYmxlUm93cygpOiBBcnJheTxUUm93PiB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHZpc2libGUgcm93cyBhcyBtb2RlbCBvYmplY3RzLlxuICAgKiBAc2VlIHJvd3NWaXNpYmxlSWZcbiAgICovXG4gIHB1YmxpYyBnZXQgdmlzaWJsZVJvd3MoKTogQXJyYXk8VFJvdz4ge1xuICAgIHJldHVybiB0aGlzLmdldFZpc2libGVSb3dzKCk7XG4gIH1cblxuICAvKipcbiAgICogQW4gZXhwcmVzc2lvbiB0aGF0IHJldHVybnMgdHJ1ZSBvciBmYWxzZS4gSXQgcnVucyBhZ2FpbnN0IGVhY2ggcm93IGl0ZW0gYW5kIGlmIGZvciB0aGlzIGl0ZW0gaXQgcmV0dXJucyB0cnVlLCB0aGVuIHRoZSBpdGVtIGlzIHZpc2libGUgb3RoZXJ3aXNlIHRoZSBpdGVtIGJlY29tZXMgaW52aXNpYmxlLiBQbGVhc2UgdXNlIHtpdGVtfSB0byBnZXQgdGhlIGN1cnJlbnQgaXRlbSB2YWx1ZSBpbiB0aGUgZXhwcmVzc2lvbi5cbiAgICogQHNlZSB2aXNpYmxlSWZcbiAgICovXG4gIHB1YmxpYyBnZXQgcm93c1Zpc2libGVJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyb3dzVmlzaWJsZUlmXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcm93c1Zpc2libGVJZih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJvd3NWaXNpYmxlSWZcIiwgdmFsKTtcbiAgICB0aGlzLmZpbHRlckl0ZW1zKCk7XG4gIH1cbiAgLyoqXG4gICAqIEFuIGV4cHJlc3Npb24gdGhhdCByZXR1cm5zIHRydWUgb3IgZmFsc2UuIEl0IHJ1bnMgYWdhaW5zdCBlYWNoIGNvbHVtbiBpdGVtIGFuZCBpZiBmb3IgdGhpcyBpdGVtIGl0IHJldHVybnMgdHJ1ZSwgdGhlbiB0aGUgaXRlbSBpcyB2aXNpYmxlIG90aGVyd2lzZSB0aGUgaXRlbSBiZWNvbWVzIGludmlzaWJsZS4gUGxlYXNlIHVzZSB7aXRlbX0gdG8gZ2V0IHRoZSBjdXJyZW50IGl0ZW0gdmFsdWUgaW4gdGhlIGV4cHJlc3Npb24uXG4gICAqIEBzZWUgcm93c1Zpc2libGVJZlxuICAgKi9cbiAgcHVibGljIGdldCBjb2x1bW5zVmlzaWJsZUlmKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbHVtbnNWaXNpYmxlSWZcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBjb2x1bW5zVmlzaWJsZUlmKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29sdW1uc1Zpc2libGVJZlwiLCB2YWwpO1xuICAgIHRoaXMuZmlsdGVySXRlbXMoKTtcbiAgfVxuICBwdWJsaWMgcnVuQ29uZGl0aW9uKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgc3VwZXIucnVuQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgdGhpcy5ydW5JdGVtc0NvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIHByb3RlY3RlZCBmaWx0ZXJJdGVtcygpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5hcmVJbnZpc2libGVFbGVtZW50c1Nob3dpbmcpIHtcbiAgICAgIHRoaXMub25Sb3dzQ2hhbmdlZCgpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbiB8fCAhdGhpcy5kYXRhKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMucnVuSXRlbXNDb25kaXRpb24oXG4gICAgICB0aGlzLmdldERhdGFGaWx0ZXJlZFZhbHVlcygpLFxuICAgICAgdGhpcy5nZXREYXRhRmlsdGVyZWRQcm9wZXJ0aWVzKClcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBvbkNvbHVtbnNDaGFuZ2VkKCkge31cbiAgcHJvdGVjdGVkIG9uUm93c0NoYW5nZWQoKSB7XG4gICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy52aXNpYmxlUm93c0NoYW5nZWRDYWxsYmFjayk7XG4gIH1cbiAgcHJvdGVjdGVkIHNob3VsZFJ1bkNvbHVtbkV4cHJlc3Npb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnN1cnZleSB8fCAhdGhpcy5zdXJ2ZXkuYXJlSW52aXNpYmxlRWxlbWVudHNTaG93aW5nO1xuICB9XG4gIHByb3RlY3RlZCBoYXNSb3dzQXNJdGVtcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgcnVuSXRlbXNDb25kaXRpb24oXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApOiBib29sZWFuIHtcbiAgICB2YXIgb2xkVmlzaWJsZVJvd3MgPSBudWxsO1xuICAgIGlmICghIXRoaXMuZmlsdGVyZWRSb3dzICYmICFIZWxwZXJzLmlzVmFsdWVFbXB0eSh0aGlzLmRlZmF1bHRWYWx1ZSkpIHtcbiAgICAgIG9sZFZpc2libGVSb3dzID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZmlsdGVyZWRSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG9sZFZpc2libGVSb3dzLnB1c2godGhpcy5maWx0ZXJlZFJvd3NbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgaGFzQ2hhbmdlcyA9XG4gICAgICB0aGlzLmhhc1Jvd3NBc0l0ZW1zKCkgJiYgdGhpcy5ydW5Db25kaXRpb25zRm9yUm93cyh2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIHZhciBoYXNDb2x1bW5zQ2hhbmdlZCA9IHRoaXMucnVuQ29uZGl0aW9uc0ZvckNvbHVtbnModmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICBoYXNDaGFuZ2VzID0gaGFzQ29sdW1uc0NoYW5nZWQgfHwgaGFzQ2hhbmdlcztcbiAgICBpZiAoaGFzQ2hhbmdlcykge1xuICAgICAgaWYgKFxuICAgICAgICAhIXRoaXMuc3VydmV5ICYmXG4gICAgICAgIHRoaXMuc3VydmV5LmlzQ2xlYXJWYWx1ZU9uSGlkZGVuICYmXG4gICAgICAgICghIXRoaXMuZmlsdGVyZWRDb2x1bW5zIHx8ICEhdGhpcy5maWx0ZXJlZFJvd3MpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5jbGVhckluY29ycmVjdFZhbHVlcygpO1xuICAgICAgfVxuICAgICAgaWYgKCEhb2xkVmlzaWJsZVJvd3MpIHtcbiAgICAgICAgdGhpcy5yZXN0b3JlTmV3VmlzaWJsZVJvd3NWYWx1ZXMob2xkVmlzaWJsZVJvd3MpO1xuICAgICAgfVxuICAgICAgdGhpcy5jbGVhckdlbmVyYXRlZFJvd3MoKTtcbiAgICAgIGlmIChoYXNDb2x1bW5zQ2hhbmdlZCkge1xuICAgICAgICB0aGlzLm9uQ29sdW1uc0NoYW5nZWQoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMub25Sb3dzQ2hhbmdlZCgpO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQ2hhbmdlcztcbiAgfVxuICBwcm90ZWN0ZWQgY2xlYXJHZW5lcmF0ZWRSb3dzKCkge1xuICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MgPSBudWxsO1xuICB9XG4gIHByaXZhdGUgcnVuQ29uZGl0aW9uc0ZvclJvd3MoXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApOiBib29sZWFuIHtcbiAgICB2YXIgc2hvd0ludmlzaWJpbGUgPVxuICAgICAgISF0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5hcmVJbnZpc2libGVFbGVtZW50c1Nob3dpbmc7XG4gICAgdmFyIHJ1bm5lciA9XG4gICAgICAhc2hvd0ludmlzaWJpbGUgJiYgISF0aGlzLnJvd3NWaXNpYmxlSWZcbiAgICAgICAgPyBuZXcgQ29uZGl0aW9uUnVubmVyKHRoaXMucm93c1Zpc2libGVJZilcbiAgICAgICAgOiBudWxsO1xuICAgIHRoaXMuZmlsdGVyZWRSb3dzID0gW107XG4gICAgdmFyIGhhc0NoYW5nZWQgPSBJdGVtVmFsdWUucnVuQ29uZGl0aW9uc0Zvckl0ZW1zKFxuICAgICAgdGhpcy5yb3dzLFxuICAgICAgdGhpcy5maWx0ZXJlZFJvd3MsXG4gICAgICBydW5uZXIsXG4gICAgICB2YWx1ZXMsXG4gICAgICBwcm9wZXJ0aWVzLFxuICAgICAgIXNob3dJbnZpc2liaWxlXG4gICAgKTtcbiAgICBpZiAodGhpcy5maWx0ZXJlZFJvd3MubGVuZ3RoID09PSB0aGlzLnJvd3MubGVuZ3RoKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkUm93cyA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBoYXNDaGFuZ2VkO1xuICB9XG4gIHByaXZhdGUgcnVuQ29uZGl0aW9uc0ZvckNvbHVtbnMoXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApOiBib29sZWFuIHtcbiAgICB2YXIgdXNlQ29sdW1uc0V4cHJlc3Npb24gPVxuICAgICAgISF0aGlzLnN1cnZleSAmJiAhdGhpcy5zdXJ2ZXkuYXJlSW52aXNpYmxlRWxlbWVudHNTaG93aW5nO1xuICAgIHZhciBydW5uZXIgPVxuICAgICAgdXNlQ29sdW1uc0V4cHJlc3Npb24gJiYgISF0aGlzLmNvbHVtbnNWaXNpYmxlSWZcbiAgICAgICAgPyBuZXcgQ29uZGl0aW9uUnVubmVyKHRoaXMuY29sdW1uc1Zpc2libGVJZilcbiAgICAgICAgOiBudWxsO1xuICAgIHRoaXMuZmlsdGVyZWRDb2x1bW5zID0gW107XG4gICAgdmFyIGhhc0NoYW5nZWQgPSBJdGVtVmFsdWUucnVuQ29uZGl0aW9uc0Zvckl0ZW1zKFxuICAgICAgdGhpcy5jb2x1bW5zLFxuICAgICAgPGFueT50aGlzLmZpbHRlcmVkQ29sdW1ucyxcbiAgICAgIHJ1bm5lcixcbiAgICAgIHZhbHVlcyxcbiAgICAgIHByb3BlcnRpZXMsXG4gICAgICB0aGlzLnNob3VsZFJ1bkNvbHVtbkV4cHJlc3Npb24oKVxuICAgICk7XG4gICAgaWYgKHRoaXMuZmlsdGVyZWRDb2x1bW5zLmxlbmd0aCA9PT0gdGhpcy5jb2x1bW5zLmxlbmd0aCkge1xuICAgICAgdGhpcy5maWx0ZXJlZENvbHVtbnMgPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQ2hhbmdlZDtcbiAgfVxuICBwdWJsaWMgY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKSB7XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgaWYgKCF2YWwpIHJldHVybjtcbiAgICB2YXIgbmV3VmFsID0gbnVsbDtcbiAgICB2YXIgaXNDaGFuZ2VkID0gZmFsc2U7XG4gICAgdmFyIHJvd3MgPSAhIXRoaXMuZmlsdGVyZWRSb3dzID8gdGhpcy5maWx0ZXJlZFJvd3MgOiB0aGlzLnJvd3M7XG4gICAgdmFyIGNvbHVtbnMgPSAhIXRoaXMuZmlsdGVyZWRDb2x1bW5zID8gdGhpcy5maWx0ZXJlZENvbHVtbnMgOiB0aGlzLmNvbHVtbnM7XG4gICAgZm9yICh2YXIga2V5IGluIHZhbCkge1xuICAgICAgaWYgKFxuICAgICAgICBJdGVtVmFsdWUuZ2V0SXRlbUJ5VmFsdWUocm93cywga2V5KSAmJlxuICAgICAgICBJdGVtVmFsdWUuZ2V0SXRlbUJ5VmFsdWUoY29sdW1ucywgdmFsW2tleV0pXG4gICAgICApIHtcbiAgICAgICAgaWYgKG5ld1ZhbCA9PSBudWxsKSBuZXdWYWwgPSB7fTtcbiAgICAgICAgKDxhbnk+bmV3VmFsKVtrZXldID0gdmFsW2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNDaGFuZ2VkKSB7XG4gICAgICB0aGlzLnZhbHVlID0gbmV3VmFsO1xuICAgIH1cbiAgICBzdXBlci5jbGVhckluY29ycmVjdFZhbHVlcygpO1xuICB9XG4gIHByb3RlY3RlZCBjbGVhckludmlzaWJsZVZhbHVlc0luUm93cygpIHtcbiAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHJldHVybjtcbiAgICB2YXIgbmV3RGF0YSA9IHRoaXMuZ2V0VW5iaW5kVmFsdWUodGhpcy52YWx1ZSk7XG4gICAgdmFyIHJvd3MgPSB0aGlzLnJvd3M7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0gcm93c1tpXS52YWx1ZTtcbiAgICAgIGlmICghIW5ld0RhdGFba2V5XSAmJiAhcm93c1tpXS5pc1Zpc2libGUpIHtcbiAgICAgICAgZGVsZXRlIG5ld0RhdGFba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuaXNUd29WYWx1ZUVxdWFscyhuZXdEYXRhLCB0aGlzLnZhbHVlKSkgcmV0dXJuO1xuICAgIHRoaXMudmFsdWUgPSBuZXdEYXRhO1xuICB9XG4gIHByaXZhdGUgcmVzdG9yZU5ld1Zpc2libGVSb3dzVmFsdWVzKG9sZFZpc2libGVSb3dzOiBhbnkpIHtcbiAgICB2YXIgcm93cyA9ICEhdGhpcy5maWx0ZXJlZFJvd3MgPyB0aGlzLmZpbHRlcmVkUm93cyA6IHRoaXMucm93cztcbiAgICB2YXIgdmFsID0gdGhpcy5kZWZhdWx0VmFsdWU7XG4gICAgdmFyIG5ld1ZhbHVlID0gdGhpcy5nZXRVbmJpbmRWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICB2YXIgaXNDaGFuZ2VkID0gZmFsc2U7XG4gICAgZm9yICh2YXIga2V5IGluIHZhbCkge1xuICAgICAgaWYgKFxuICAgICAgICBJdGVtVmFsdWUuZ2V0SXRlbUJ5VmFsdWUocm93cywga2V5KSAmJlxuICAgICAgICAhSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKG9sZFZpc2libGVSb3dzLCBrZXkpXG4gICAgICApIHtcbiAgICAgICAgaWYgKG5ld1ZhbHVlID09IG51bGwpIG5ld1ZhbHVlID0ge307XG4gICAgICAgICg8YW55Pm5ld1ZhbHVlKVtrZXldID0gdmFsW2tleV07XG4gICAgICAgIGlzQ2hhbmdlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NoYW5nZWQpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB9XG4gIH1cbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJtYXRyaXhiYXNlXCIsXG4gIFtcbiAgICBcImNvbHVtbnNWaXNpYmxlSWY6Y29uZGl0aW9uXCIsXG4gICAgXCJyb3dzVmlzaWJsZUlmOmNvbmRpdGlvblwiLFxuICAgIHsgbmFtZTogXCJzaG93SGVhZGVyOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICBdLFxuICB1bmRlZmluZWQsXG4gIFwicXVlc3Rpb25cIlxuKTtcbiIsImltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHtcbiAgSVBhZ2UsXG4gIElQYW5lbCxcbiAgSUVsZW1lbnQsXG4gIElTdXJ2ZXlFbGVtZW50LFxuICBJUXVlc3Rpb24sXG59IGZyb20gXCIuL2Jhc2UtaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbmZvLCBQYW5lbE1vZGVsQmFzZSwgUXVlc3Rpb25Sb3dNb2RlbCB9IGZyb20gXCIuL3BhbmVsXCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBDc3NDbGFzc0J1aWxkZXIgfSBmcm9tIFwiLi91dGlscy9jc3NDbGFzc0J1aWxkZXJcIjtcblxuLyoqXG4gKiBUaGUgcGFnZSBvYmplY3QuIEl0IGhhcyBlbGVtZW50cyBjb2xsZWN0aW9uLCB0aGF0IGNvbnRhaW5zIHF1ZXN0aW9ucyBhbmQgcGFuZWxzLlxuICovXG5leHBvcnQgY2xhc3MgUGFnZU1vZGVsIGV4dGVuZHMgUGFuZWxNb2RlbEJhc2UgaW1wbGVtZW50cyBJUGFnZSB7XG4gIHByaXZhdGUgaGFzU2hvd25WYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcgPSBcIlwiKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMubG9jVGl0bGUub25HZXRUZXh0Q2FsbGJhY2sgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgICBpZiAoc2VsZi5udW0gPiAwKSByZXR1cm4gc2VsZi5udW0gKyBcIi4gXCIgKyB0ZXh0O1xuICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwibmF2aWdhdGlvblRpdGxlXCIsIHRoaXMsIHRydWUpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJuYXZpZ2F0aW9uRGVzY3JpcHRpb25cIiwgdGhpcywgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJwYWdlXCI7XG4gIH1cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzUGFnZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgY2FuU2hvd1RpdGxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoPGFueT50aGlzLnN1cnZleSkuc2hvd1BhZ2VUaXRsZXM7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIHNob3cgdGl0bGUgaW4gbmF2aWdhdGlvbiBidXR0b25zLiBJZiB0aGUgdmFsdWUgaXMgZW1wdHkgdGhlbiBwYWdlIG5hbWUgaXMgdXNlZC5cbiAgICogQHNlZSBzdXJ2ZXkucHJvZ3Jlc3NCYXJUeXBlXG4gICAqL1xuICBwdWJsaWMgZ2V0IG5hdmlnYXRpb25UaXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm5hdmlnYXRpb25UaXRsZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG5hdmlnYXRpb25UaXRsZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwibmF2aWdhdGlvblRpdGxlXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBsb2NOYXZpZ2F0aW9uVGl0bGUoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwibmF2aWdhdGlvblRpdGxlXCIpO1xuICB9XG4gIHB1YmxpYyBnZXQgbmF2aWdhdGlvbkRlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwibmF2aWdhdGlvbkRlc2NyaXB0aW9uXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbmF2aWdhdGlvbkRlc2NyaXB0aW9uKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJuYXZpZ2F0aW9uRGVzY3JpcHRpb25cIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGxvY05hdmlnYXRpb25EZXNjcmlwdGlvbigpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJuYXZpZ2F0aW9uRGVzY3JpcHRpb25cIik7XG4gIH1cbiAgcHVibGljIGdldCBwYXNzZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInBhc3NlZFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBwYXNzZWQodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicGFzc2VkXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGRlbGV0ZSgpIHtcbiAgICBpZiAoISF0aGlzLnN1cnZleSkge1xuICAgICAgdGhpcy5yZW1vdmVTZWxmRnJvbUxpc3QodGhpcy5zdXJ2ZXkucGFnZXMpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgb25GaXJzdFJlbmRlcmluZygpIHtcbiAgICBpZiAodGhpcy53YXNTaG93bikgcmV0dXJuO1xuICAgIHN1cGVyLm9uRmlyc3RSZW5kZXJpbmcoKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHZpc2libGUgaW5kZXggb2YgdGhlIHBhZ2UuIEl0IGhhcyB2YWx1ZXMgZnJvbSAwIHRvIHZpc2libGUgcGFnZSBjb3VudCAtIDEuXG4gICAqIEBzZWUgU3VydmV5TW9kZWwudmlzaWJsZVBhZ2VzXG4gICAqIEBzZWUgU3VydmV5TW9kZWwucGFnZXNcbiAgICovXG4gIHB1YmxpYyBnZXQgdmlzaWJsZUluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVJbmRleFwiLCAtMSk7XG4gIH1cbiAgcHVibGljIHNldCB2aXNpYmxlSW5kZXgodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlSW5kZXhcIiwgdmFsKTtcbiAgfVxuICBwcm90ZWN0ZWQgY2FuUmVuZGVyRmlyc3RSb3dzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5pc0Rlc2lnbk1vZGUgfHwgdGhpcy52aXNpYmxlSW5kZXggPT0gMDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlLCBpZiB0aGUgcGFnZSBpcyBzdGFydGVkIHBhZ2UgaW4gdGhlIHN1cnZleS4gSXQgY2FuIGJlIHNob3duIG9uIHRoZSBzdGFydCBvbmx5IGFuZCB0aGUgZW5kLXVzZXIgY291bGQgbm90IGNvbWViYWNrIHRvIGl0IGFmdGVyIGl0IHBhc3NlZCBpdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNTdGFydGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5pc1BhZ2VTdGFydGVkKHRoaXMpO1xuICB9XG4gIHByb3RlY3RlZCBjYWxjQ3NzQ2xhc3Nlcyhjc3M6IGFueSk6IGFueSB7XG4gICAgY29uc3QgY2xhc3NlcyA9IHsgcGFnZToge30sIHBhZ2VUaXRsZTogXCJcIiwgcGFnZURlc2NyaXB0aW9uOiBcIlwiLCByb3c6IFwiXCIsIHJvd011bHRpcGxlOiBcIlwiIH07XG4gICAgdGhpcy5jb3B5Q3NzQ2xhc3NlcyhjbGFzc2VzLnBhZ2UsIGNzcy5wYWdlKTtcbiAgICBpZiAoISFjc3MucGFnZVRpdGxlKSB7XG4gICAgICBjbGFzc2VzLnBhZ2VUaXRsZSA9IGNzcy5wYWdlVGl0bGU7XG4gICAgfVxuICAgIGlmICghIWNzcy5wYWdlRGVzY3JpcHRpb24pIHtcbiAgICAgIGNsYXNzZXMucGFnZURlc2NyaXB0aW9uID0gY3NzLnBhZ2VEZXNjcmlwdGlvbjtcbiAgICB9XG4gICAgaWYgKCEhY3NzLnJvdykge1xuICAgICAgY2xhc3Nlcy5yb3cgPSBjc3Mucm93O1xuICAgIH1cbiAgICBpZiAoISFjc3Mucm93TXVsdGlwbGUpIHtcbiAgICAgIGNsYXNzZXMucm93TXVsdGlwbGUgPSBjc3Mucm93TXVsdGlwbGU7XG4gICAgfVxuICAgIGlmICh0aGlzLnN1cnZleSkge1xuICAgICAgdGhpcy5zdXJ2ZXkudXBkYXRlUGFnZUNzc0NsYXNzZXModGhpcywgY2xhc3Nlcyk7XG4gICAgfVxuICAgIHJldHVybiBjbGFzc2VzO1xuICB9XG4gIHB1YmxpYyBnZXQgY3NzVGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmV3IENzc0NsYXNzQnVpbGRlcigpXG4gICAgICAuYXBwZW5kKHRoaXMuY3NzQ2xhc3Nlcy5wYWdlLnRpdGxlKVxuICAgICAgLnRvU3RyaW5nKCk7XG4gIH1cbiAgcHVibGljIGdldCBudW0oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibnVtXCIsIC0xKTtcbiAgfVxuICBwdWJsaWMgc2V0IG51bSh2YWw6IG51bWJlcikge1xuICAgIGlmICh0aGlzLm51bSA9PSB2YWwpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJudW1cIiwgdmFsKTtcbiAgICB0aGlzLm9uTnVtQ2hhbmdlZCh2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBcImhpZGVcIiB0byBtYWtlIFwiUHJldlwiLCBcIk5leHRcIiBhbmQgXCJDb21wbGV0ZVwiIGJ1dHRvbnMgYXJlIGludmlzaWJsZSBmb3IgdGhpcyBwYWdlLiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBcInNob3dcIiB0byBtYWtlIHRoZXNlIGJ1dHRvbnMgdmlzaWJsZSwgZXZlbiBpZiBzdXJ2ZXkgc2hvd05hdmlnYXRpb25CdXR0b25zIHByb3BlcnR5IGlzIGZhbHNlLlxuICAgKiBAc2VlIFN1cnZleU1vZGUuc2hvd05hdmlnYXRpb25CdXR0b25zXG4gICAqL1xuICBwdWJsaWMgZ2V0IG5hdmlnYXRpb25CdXR0b25zVmlzaWJpbGl0eSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJuYXZpZ2F0aW9uQnV0dG9uc1Zpc2liaWxpdHlcIik7XG4gIH1cbiAgcHVibGljIHNldCBuYXZpZ2F0aW9uQnV0dG9uc1Zpc2liaWxpdHkodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJuYXZpZ2F0aW9uQnV0dG9uc1Zpc2liaWxpdHlcIiwgdmFsLnRvTG93ZXJDYXNlKCkpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydHkgcmV0dXJucyB0cnVlLCBpZiB0aGUgcGFnZSBoYXMgYmVlbiBzaG93biB0byB0aGUgZW5kLXVzZXIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHdhc1Nob3duKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc1Nob3duVmFsdWU7XG4gIH1cbiAgZ2V0IGhhc1Nob3duKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLndhc1Nob3duO1xuICB9XG4gIHB1YmxpYyBzZXRXYXNTaG93bih2YWw6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsID09IHRoaXMuaGFzU2hvd25WYWx1ZSkgcmV0dXJuO1xuICAgIHRoaXMuaGFzU2hvd25WYWx1ZSA9IHZhbDtcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUgfHwgdmFsICE9PSB0cnVlKSByZXR1cm47XG4gICAgdmFyIGVscyA9IHRoaXMuZWxlbWVudHM7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGVscy5sZW5ndGg7IGkgKyspIHtcbiAgICAgIGlmKGVsc1tpXS5pc1BhbmVsKSB7XG4gICAgICAgICg8UGFuZWxNb2RlbEJhc2U+PGFueT5lbHNbaV0pLnJhbmRvbWl6ZUVsZW1lbnRzKHRoaXMuYXJlUXVlc3Rpb25zUmFuZG9taXplZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucmFuZG9taXplRWxlbWVudHModGhpcy5hcmVRdWVzdGlvbnNSYW5kb21pemVkKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHByb3BlcnR5IHJldHVybnMgdHJ1ZSwgaWYgdGhlIGVsZW1lbnRzIGFyZSByYW5kb21pemVkIG9uIHRoZSBwYWdlXG4gICAqIEBzZWUgaGFzU2hvd25cbiAgICogQHNlZSBxdWVzdGlvbnNPcmRlclxuICAgKiBAc2VlIFN1cnZleU1vZGVsLnF1ZXN0aW9uc09yZGVyXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFyZVF1ZXN0aW9uc1JhbmRvbWl6ZWQoKTogYm9vbGVhbiB7XG4gICAgdmFyIG9yZGVyID1cbiAgICAgIHRoaXMucXVlc3Rpb25zT3JkZXIgPT0gXCJkZWZhdWx0XCIgJiYgdGhpcy5zdXJ2ZXlcbiAgICAgICAgPyB0aGlzLnN1cnZleS5xdWVzdGlvbnNPcmRlclxuICAgICAgICA6IHRoaXMucXVlc3Rpb25zT3JkZXI7XG4gICAgcmV0dXJuIG9yZGVyID09IFwicmFuZG9tXCI7XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgaXQgdG8gc2Nyb2xsIHRvIHRoZSBwYWdlIHRvcC5cbiAgICovXG4gIHB1YmxpYyBzY3JvbGxUb1RvcCgpIHtcbiAgICBpZiAoISF0aGlzLnN1cnZleSkge1xuICAgICAgdGhpcy5zdXJ2ZXkuc2Nyb2xsRWxlbWVudFRvVG9wKHRoaXMsIG51bGwsIHRoaXMsIHRoaXMuaWQpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogVGltZSBpbiBzZWNvbmRzIGVuZC11c2VyIHNwZW50IG9uIHRoaXMgcGFnZVxuICAgKi9cbiAgcHVibGljIHRpbWVTcGVudCA9IDA7XG4gIC8vIHB1YmxpYyBnZXQgdGltZVNwZW50KCk6IG51bWJlciB7XG4gIC8vICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInRpbWVTcGVudFwiLCAwKTtcbiAgLy8gfVxuICAvLyBwdWJsaWMgc2V0IHRpbWVTcGVudCh2YWw6IG51bWJlcikge1xuICAvLyAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInRpbWVTcGVudFwiLCB2YWwpO1xuICAvLyB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGFsbCBwYW5lbHMgaW4gdGhlIHBhZ2VcbiAgICovXG4gIHB1YmxpYyBnZXRQYW5lbHMoXG4gICAgdmlzaWJsZU9ubHk6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBpbmNsdWRpbmdEZXNpZ25UaW1lOiBib29sZWFuID0gZmFsc2VcbiAgKTogQXJyYXk8SVBhbmVsPiB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxJUGFuZWw+KCk7XG4gICAgdGhpcy5hZGRQYW5lbHNJbnRvTGlzdChyZXN1bHQsIHZpc2libGVPbmx5LCBpbmNsdWRpbmdEZXNpZ25UaW1lKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSB0aW1lIGluIHNlY29uZHMgdGhhdCBlbmQtdXNlciBoYXMgdG8gY29tcGxldGUgdGhlIHBhZ2UuIElmIHRoZSB2YWx1ZSBpcyAwIG9yIGxlc3MsIHRoZSBlbmQtdXNlciBoYXMgdW5saW1pdGVkIG51bWJlciBvZiB0aW1lIHRvIGZpbmlzaCB0aGUgcGFnZS5cbiAgICogQHNlZSBzdGFydFRpbWVyXG4gICAqIEBzZWUgU3VydmV5TW9kZWwubWF4VGltZVRvRmluaXNoUGFnZVxuICAgKi9cbiAgcHVibGljIGdldCBtYXhUaW1lVG9GaW5pc2goKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWF4VGltZVRvRmluaXNoXCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4VGltZVRvRmluaXNoKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWF4VGltZVRvRmluaXNoXCIsIHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uTnVtQ2hhbmdlZCh2YWx1ZTogbnVtYmVyKSB7fVxuICBwcm90ZWN0ZWQgb25WaXNpYmxlQ2hhbmdlZCgpIHtcbiAgICBpZiAodGhpcy5pc1JhbmRvbWl6aW5nKSByZXR1cm47XG4gICAgc3VwZXIub25WaXNpYmxlQ2hhbmdlZCgpO1xuICAgIGlmICh0aGlzLnN1cnZleSAhPSBudWxsKSB7XG4gICAgICB0aGlzLnN1cnZleS5wYWdlVmlzaWJpbGl0eUNoYW5nZWQodGhpcywgdGhpcy5pc1Zpc2libGUpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGRyYWdEcm9wSW5mbzogRHJhZ0Ryb3BJbmZvO1xuICBwdWJsaWMgZHJhZ0Ryb3BTdGFydChcbiAgICBzcmM6IElFbGVtZW50LFxuICAgIHRhcmdldDogSUVsZW1lbnQsXG4gICAgbmVzdGVkUGFuZWxEZXB0aDogbnVtYmVyID0gLTFcbiAgKSB7XG4gICAgdGhpcy5kcmFnRHJvcEluZm8gPSBuZXcgRHJhZ0Ryb3BJbmZvKHNyYywgdGFyZ2V0LCBuZXN0ZWRQYW5lbERlcHRoKTtcbiAgfVxuICBwdWJsaWMgZHJhZ0Ryb3BNb3ZlVG8oXG4gICAgZGVzdGluYXRpb246IElTdXJ2ZXlFbGVtZW50LFxuICAgIGlzQm90dG9tOiBib29sZWFuID0gZmFsc2UsXG4gICAgaXNFZGdlOiBib29sZWFuID0gZmFsc2VcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmRyYWdEcm9wSW5mbykgcmV0dXJuIGZhbHNlO1xuICAgIHRoaXMuZHJhZ0Ryb3BJbmZvLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb247XG4gICAgdGhpcy5kcmFnRHJvcEluZm8uaXNCb3R0b20gPSBpc0JvdHRvbTtcbiAgICB0aGlzLmRyYWdEcm9wSW5mby5pc0VkZ2UgPSBpc0VkZ2U7XG4gICAgdGhpcy5jb3JyZWN0RHJhZ0Ryb3BJbmZvKHRoaXMuZHJhZ0Ryb3BJbmZvKTtcbiAgICBpZiAoIXRoaXMuZHJhZ0Ryb3BDYW5Ecm9wVGFnZXJ0KCkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIXRoaXMuZHJhZ0Ryb3BDYW5Ecm9wU291cmNlKCkgfHwgIXRoaXMuZHJhZ0Ryb3BBbGxvd0Zyb21TdXJ2ZXkoKSkge1xuICAgICAgaWYgKCEhdGhpcy5kcmFnRHJvcEluZm8uc291cmNlKSB7XG4gICAgICAgIHZhciByb3cgPSB0aGlzLmRyYWdEcm9wRmluZFJvdyh0aGlzLmRyYWdEcm9wSW5mby50YXJnZXQpO1xuICAgICAgICB0aGlzLnVwZGF0ZVJvd3NSZW1vdmVFbGVtZW50RnJvbVJvdyh0aGlzLmRyYWdEcm9wSW5mby50YXJnZXQsIHJvdyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuZHJhZ0Ryb3BBZGRUYXJnZXQodGhpcy5kcmFnRHJvcEluZm8pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByaXZhdGUgY29ycmVjdERyYWdEcm9wSW5mbyhkcmFnRHJvcEluZm86IERyYWdEcm9wSW5mbykge1xuICAgIGlmICghZHJhZ0Ryb3BJbmZvLmRlc3RpbmF0aW9uKSByZXR1cm47XG4gICAgdmFyIHBhbmVsID0gKDxJRWxlbWVudD5kcmFnRHJvcEluZm8uZGVzdGluYXRpb24pLmlzUGFuZWxcbiAgICAgID8gPElQYW5lbD4oPGFueT5kcmFnRHJvcEluZm8uZGVzdGluYXRpb24pXG4gICAgICA6IG51bGw7XG4gICAgaWYgKCFwYW5lbCkgcmV0dXJuO1xuICAgIGlmIChcbiAgICAgICFkcmFnRHJvcEluZm8udGFyZ2V0LmlzTGF5b3V0VHlwZVN1cHBvcnRlZChwYW5lbC5nZXRDaGlsZHJlbkxheW91dFR5cGUoKSlcbiAgICApIHtcbiAgICAgIGRyYWdEcm9wSW5mby5pc0VkZ2UgPSB0cnVlO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGRyYWdEcm9wQWxsb3dGcm9tU3VydmV5KCk6IGJvb2xlYW4ge1xuICAgIHZhciBkZXN0ID0gdGhpcy5kcmFnRHJvcEluZm8uZGVzdGluYXRpb247XG4gICAgaWYgKCFkZXN0IHx8ICF0aGlzLnN1cnZleSkgcmV0dXJuIHRydWU7XG4gICAgdmFyIGluc2VydEJlZm9yZTogSUVsZW1lbnQgPSBudWxsO1xuICAgIHZhciBpbnNlcnRBZnRlcjogSUVsZW1lbnQgPSBudWxsO1xuICAgIHZhciBwYXJlbnQgPVxuICAgICAgZGVzdC5pc1BhZ2UgfHwgKCF0aGlzLmRyYWdEcm9wSW5mby5pc0VkZ2UgJiYgKDxJRWxlbWVudD5kZXN0KS5pc1BhbmVsKVxuICAgICAgICA/IGRlc3RcbiAgICAgICAgOiAoPElFbGVtZW50PmRlc3QpLnBhcmVudDtcbiAgICBpZiAoIWRlc3QuaXNQYWdlKSB7XG4gICAgICB2YXIgY29udGFpbmVyID0gKDxJRWxlbWVudD5kZXN0KS5wYXJlbnQ7XG4gICAgICBpZiAoISFjb250YWluZXIpIHtcbiAgICAgICAgdmFyIGVsZW1lbnRzID0gKDxQYW5lbE1vZGVsQmFzZT5jb250YWluZXIpLmVsZW1lbnRzO1xuICAgICAgICB2YXIgaW5kZXggPSBlbGVtZW50cy5pbmRleE9mKDxJRWxlbWVudD5kZXN0KTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICBpbnNlcnRCZWZvcmUgPSA8SUVsZW1lbnQ+ZGVzdDtcbiAgICAgICAgICBpbnNlcnRBZnRlciA9IDxJRWxlbWVudD5kZXN0O1xuICAgICAgICAgIGlmICh0aGlzLmRyYWdEcm9wSW5mby5pc0JvdHRvbSkge1xuICAgICAgICAgICAgaW5zZXJ0QmVmb3JlID1cbiAgICAgICAgICAgICAgaW5kZXggPCBlbGVtZW50cy5sZW5ndGggLSAxID8gZWxlbWVudHNbaW5kZXggKyAxXSA6IG51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGluc2VydEFmdGVyID0gaW5kZXggPiAwID8gZWxlbWVudHNbaW5kZXggLSAxXSA6IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgdGFyZ2V0OiB0aGlzLmRyYWdEcm9wSW5mby50YXJnZXQsXG4gICAgICBzb3VyY2U6IHRoaXMuZHJhZ0Ryb3BJbmZvLnNvdXJjZSxcbiAgICAgIHBhcmVudDogcGFyZW50LFxuICAgICAgaW5zZXJ0QWZ0ZXI6IGluc2VydEFmdGVyLFxuICAgICAgaW5zZXJ0QmVmb3JlOiBpbnNlcnRCZWZvcmUsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkuZHJhZ0FuZERyb3BBbGxvdyhvcHRpb25zKTtcbiAgfVxuICBwdWJsaWMgZHJhZ0Ryb3BGaW5pc2goaXNDYW5jZWw6IGJvb2xlYW4gPSBmYWxzZSk6IElFbGVtZW50IHtcbiAgICBpZiAoIXRoaXMuZHJhZ0Ryb3BJbmZvKSByZXR1cm47XG4gICAgdmFyIHRhcmdldCA9IHRoaXMuZHJhZ0Ryb3BJbmZvLnRhcmdldDtcbiAgICB2YXIgcm93ID0gdGhpcy5kcmFnRHJvcEZpbmRSb3codGFyZ2V0KTtcbiAgICB2YXIgdGFyZ2V0SW5kZXggPSB0aGlzLmRyYWdEcm9wR2V0RWxlbWVudEluZGV4KHRhcmdldCwgcm93KTtcbiAgICB0aGlzLnVwZGF0ZVJvd3NSZW1vdmVFbGVtZW50RnJvbVJvdyh0YXJnZXQsIHJvdyk7XG4gICAgaWYgKCFpc0NhbmNlbCAmJiAhIXJvdykge1xuICAgICAgdmFyIHNyYyA9IHRoaXMuZHJhZ0Ryb3BJbmZvLnNvdXJjZTtcbiAgICAgIHZhciBpc1NhbWVQYW5lbCA9IGZhbHNlO1xuICAgICAgaWYgKCEhc3JjICYmICEhc3JjLnBhcmVudCkge1xuICAgICAgICBpc1NhbWVQYW5lbCA9IHJvdy5wYW5lbCA9PSBzcmMucGFyZW50O1xuICAgICAgICBpZiAoaXNTYW1lUGFuZWwpIHtcbiAgICAgICAgICByb3cucGFuZWwuZHJhZ0Ryb3BNb3ZlRWxlbWVudChzcmMsIHRhcmdldCwgdGFyZ2V0SW5kZXgpO1xuICAgICAgICAgIHRhcmdldEluZGV4ID0gLTE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3JjLnBhcmVudC5yZW1vdmVFbGVtZW50KHNyYyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0YXJnZXRJbmRleCA+IC0xKSB7XG4gICAgICAgIHJvdy5wYW5lbC5hZGRFbGVtZW50KHRhcmdldCwgdGFyZ2V0SW5kZXgpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmRyYWdEcm9wSW5mbyA9IG51bGw7XG4gICAgcmV0dXJuICFpc0NhbmNlbCA/IHRhcmdldCA6IG51bGw7XG4gIH1cbiAgcHJpdmF0ZSBkcmFnRHJvcEdldEVsZW1lbnRJbmRleChcbiAgICB0YXJnZXQ6IElFbGVtZW50LFxuICAgIHJvdzogUXVlc3Rpb25Sb3dNb2RlbFxuICApOiBudW1iZXIge1xuICAgIGlmICghcm93KSByZXR1cm4gLTE7XG4gICAgdmFyIGluZGV4ID0gcm93LmVsZW1lbnRzLmluZGV4T2YodGFyZ2V0KTtcbiAgICBpZiAocm93LmluZGV4ID09IDApIHJldHVybiBpbmRleDtcbiAgICB2YXIgcHJldlJvdyA9IHJvdy5wYW5lbC5yb3dzW3Jvdy5pbmRleCAtIDFdO1xuICAgIHZhciBwcmV2RWxlbWVudCA9IHByZXZSb3cuZWxlbWVudHNbcHJldlJvdy5lbGVtZW50cy5sZW5ndGggLSAxXTtcbiAgICByZXR1cm4gaW5kZXggKyByb3cucGFuZWwuZWxlbWVudHMuaW5kZXhPZihwcmV2RWxlbWVudCkgKyAxO1xuICB9XG4gIHByaXZhdGUgZHJhZ0Ryb3BDYW5Ecm9wVGFnZXJ0KCk6IGJvb2xlYW4ge1xuICAgIHZhciBkZXN0aW5hdGlvbiA9IHRoaXMuZHJhZ0Ryb3BJbmZvLmRlc3RpbmF0aW9uO1xuICAgIGlmICghZGVzdGluYXRpb24gfHwgZGVzdGluYXRpb24uaXNQYWdlKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5kcmFnRHJvcENhbkRyb3BDb3JlKFxuICAgICAgdGhpcy5kcmFnRHJvcEluZm8udGFyZ2V0LFxuICAgICAgPElFbGVtZW50PmRlc3RpbmF0aW9uXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGRyYWdEcm9wQ2FuRHJvcFNvdXJjZSgpOiBib29sZWFuIHtcbiAgICB2YXIgc291cmNlID0gdGhpcy5kcmFnRHJvcEluZm8uc291cmNlO1xuICAgIGlmICghc291cmNlKSByZXR1cm4gdHJ1ZTtcbiAgICB2YXIgZGVzdGluYXRpb24gPSA8SUVsZW1lbnQ+dGhpcy5kcmFnRHJvcEluZm8uZGVzdGluYXRpb247XG4gICAgaWYgKCF0aGlzLmRyYWdEcm9wQ2FuRHJvcENvcmUoc291cmNlLCBkZXN0aW5hdGlvbikpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5kcmFnRHJvcENhbkRyb3BOb3ROZXh0KFxuICAgICAgc291cmNlLFxuICAgICAgZGVzdGluYXRpb24sXG4gICAgICB0aGlzLmRyYWdEcm9wSW5mby5pc0VkZ2UsXG4gICAgICB0aGlzLmRyYWdEcm9wSW5mby5pc0JvdHRvbVxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBkcmFnRHJvcENhbkRyb3BDb3JlKFxuICAgIHRhcmdldDogSUVsZW1lbnQsXG4gICAgZGVzdGluYXRpb246IElFbGVtZW50XG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghZGVzdGluYXRpb24pIHJldHVybiB0cnVlO1xuICAgIGlmICh0aGlzLmRyYWdEcm9wSXNTYW1lRWxlbWVudChkZXN0aW5hdGlvbiwgdGFyZ2V0KSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0YXJnZXQuaXNQYW5lbCkge1xuICAgICAgdmFyIHBubCA9IDxQYW5lbE1vZGVsQmFzZT4oPGFueT50YXJnZXQpO1xuICAgICAgaWYgKFxuICAgICAgICBwbmwuY29udGFpbnNFbGVtZW50KGRlc3RpbmF0aW9uKSB8fFxuICAgICAgICAhIXBubC5nZXRFbGVtZW50QnlOYW1lKGRlc3RpbmF0aW9uLm5hbWUpXG4gICAgICApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJpdmF0ZSBkcmFnRHJvcENhbkRyb3BOb3ROZXh0KFxuICAgIHNvdXJjZTogSUVsZW1lbnQsXG4gICAgZGVzdGluYXRpb246IElFbGVtZW50LFxuICAgIGlzRWRnZTogYm9vbGVhbixcbiAgICBpc0JvdHRvbTogYm9vbGVhblxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIWRlc3RpbmF0aW9uIHx8IChkZXN0aW5hdGlvbi5pc1BhbmVsICYmICFpc0VkZ2UpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodHlwZW9mIHNvdXJjZS5wYXJlbnQgPT09IFwidW5kZWZpbmVkXCIgfHwgc291cmNlLnBhcmVudCAhPT0gZGVzdGluYXRpb24ucGFyZW50KSByZXR1cm4gdHJ1ZTtcbiAgICB2YXIgcG5sID0gPFBhbmVsTW9kZWxCYXNlPnNvdXJjZS5wYXJlbnQ7XG4gICAgdmFyIHNyY0luZGV4ID0gcG5sLmVsZW1lbnRzLmluZGV4T2Yoc291cmNlKTtcbiAgICB2YXIgZGVzdEluZGV4ID0gcG5sLmVsZW1lbnRzLmluZGV4T2YoZGVzdGluYXRpb24pO1xuICAgIGlmIChkZXN0SW5kZXggPCBzcmNJbmRleCAmJiAhaXNCb3R0b20pIGRlc3RJbmRleC0tO1xuICAgIGlmIChpc0JvdHRvbSkgZGVzdEluZGV4Kys7XG4gICAgcmV0dXJuIHNyY0luZGV4IDwgZGVzdEluZGV4XG4gICAgICA/IGRlc3RJbmRleCAtIHNyY0luZGV4ID4gMVxuICAgICAgOiBzcmNJbmRleCAtIGRlc3RJbmRleCA+IDA7XG4gIH1cblxuICBwcml2YXRlIGRyYWdEcm9wSXNTYW1lRWxlbWVudChlbDE6IElFbGVtZW50LCBlbDI6IElFbGVtZW50KSB7XG4gICAgcmV0dXJuIGVsMSA9PSBlbDIgfHwgZWwxLm5hbWUgPT0gZWwyLm5hbWU7XG4gIH1cbiAgcHVibGljIGVuc3VyZVJvd3NWaXNpYmlsaXR5KCkge1xuICAgIHN1cGVyLmVuc3VyZVJvd3NWaXNpYmlsaXR5KCk7XG4gICAgdGhpcy5nZXRQYW5lbHMoKS5mb3JFYWNoKChwYW5lbCkgPT4gcGFuZWwuZW5zdXJlUm93c1Zpc2liaWxpdHkoKSk7XG4gIH1cbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJwYWdlXCIsXG4gIFtcbiAgICB7XG4gICAgICBuYW1lOiBcIm5hdmlnYXRpb25CdXR0b25zVmlzaWJpbGl0eVwiLFxuICAgICAgZGVmYXVsdDogXCJpbmhlcml0XCIsXG4gICAgICBjaG9pY2VzOiBbXCJpbmhlcml0XCIsIFwic2hvd1wiLCBcImhpZGVcIl0sXG4gICAgfSxcbiAgICB7IG5hbWU6IFwibWF4VGltZVRvRmluaXNoOm51bWJlclwiLCBkZWZhdWx0OiAwLCBtaW5WYWx1ZTogMCB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwibmF2aWdhdGlvblRpdGxlXCIsXG4gICAgICB2aXNpYmxlSWY6IGZ1bmN0aW9uKG9iajogYW55KSB7XG4gICAgICAgIHJldHVybiAhIW9iai5zdXJ2ZXkgJiYgb2JqLnN1cnZleS5wcm9ncmVzc0JhclR5cGUgPT09IFwiYnV0dG9uc1wiO1xuICAgICAgfSxcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NOYXZpZ2F0aW9uVGl0bGVcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwibmF2aWdhdGlvbkRlc2NyaXB0aW9uXCIsXG4gICAgICB2aXNpYmxlSWY6IGZ1bmN0aW9uKG9iajogYW55KSB7XG4gICAgICAgIHJldHVybiAhIW9iai5zdXJ2ZXkgJiYgb2JqLnN1cnZleS5wcm9ncmVzc0JhclR5cGUgPT09IFwiYnV0dG9uc1wiO1xuICAgICAgfSxcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NOYXZpZ2F0aW9uRGVzY3JpcHRpb25cIixcbiAgICB9LFxuICAgIHsgbmFtZTogXCJ0aXRsZTp0ZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NUaXRsZVwiIH0sXG4gICAgeyBuYW1lOiBcImRlc2NyaXB0aW9uOnRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0Rlc2NyaXB0aW9uXCIgfSxcbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBQYWdlTW9kZWwoKTtcbiAgfSxcbiAgXCJwYW5lbGJhc2VcIlxuKTtcbiIsImltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBIYXNoVGFibGUsIEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHtcbiAgSVN1cnZleUltcGwsXG4gIElQYWdlLFxuICBJUGFuZWwsXG4gIElDb25kaXRpb25SdW5uZXIsXG4gIElFbGVtZW50LFxuICBJU3VydmV5RWxlbWVudCxcbiAgSVF1ZXN0aW9uLFxuICBJU3VydmV5RXJyb3JPd25lcixcbiAgSVRpdGxlT3duZXIsXG4gIElQcm9ncmVzc0luZm8sXG4gIElTdXJ2ZXksXG4gIElGaW5kRWxlbWVudFxufSBmcm9tIFwiLi9iYXNlLWludGVyZmFjZXNcIjtcbmltcG9ydCB7IFN1cnZleUVsZW1lbnQgfSBmcm9tIFwiLi9zdXJ2ZXktZWxlbWVudFwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgQ29uZGl0aW9uUnVubmVyIH0gZnJvbSBcIi4vY29uZGl0aW9uc1wiO1xuaW1wb3J0IHsgRWxlbWVudEZhY3RvcnksIFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgT25lQW5zd2VyUmVxdWlyZWRFcnJvciB9IGZyb20gXCIuL2Vycm9yXCI7XG5pbXBvcnQgeyBQYWdlTW9kZWwgfSBmcm9tIFwiLi9wYWdlXCI7XG5pbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzXCI7XG5pbXBvcnQgeyBmaW5kU2Nyb2xsYWJsZVBhcmVudCwgaXNFbGVtZW50VmlzaWJsZSB9IGZyb20gXCIuL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgeyBTdXJ2ZXlFcnJvciB9IGZyb20gXCIuL3N1cnZleS1lcnJvclwiO1xuaW1wb3J0IHsgQ3NzQ2xhc3NCdWlsZGVyIH0gZnJvbSBcIi4vdXRpbHMvY3NzQ2xhc3NCdWlsZGVyXCI7XG5pbXBvcnQgeyBJQWN0aW9uIH0gZnJvbSBcIi4vYWN0aW9ucy9hY3Rpb25cIjtcbmltcG9ydCB7IEFkYXB0aXZlQWN0aW9uQ29udGFpbmVyIH0gZnJvbSBcIi4vYWN0aW9ucy9hZGFwdGl2ZS1jb250YWluZXJcIjtcbmltcG9ydCB7IEFjdGlvbkNvbnRhaW5lciB9IGZyb20gXCIuL2FjdGlvbnMvY29udGFpbmVyXCI7XG5cbmV4cG9ydCBjbGFzcyBEcmFnRHJvcEluZm8ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgc291cmNlOiBJRWxlbWVudCxcbiAgICBwdWJsaWMgdGFyZ2V0OiBJRWxlbWVudCxcbiAgICBwdWJsaWMgbmVzdGVkUGFuZWxEZXB0aDogbnVtYmVyID0gLTFcbiAgKSB7IH1cbiAgcHVibGljIGRlc3RpbmF0aW9uOiBJU3VydmV5RWxlbWVudDtcbiAgcHVibGljIGlzQm90dG9tOiBib29sZWFuO1xuICBwdWJsaWMgaXNFZGdlOiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25Sb3dNb2RlbCBleHRlbmRzIEJhc2Uge1xuICBwcml2YXRlIHN0YXRpYyByb3dDb3VudGVyID0gMTAwO1xuICBwcml2YXRlIHN0YXRpYyBnZXRSb3dJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInByX1wiICsgUXVlc3Rpb25Sb3dNb2RlbC5yb3dDb3VudGVyKys7XG4gIH1cbiAgcHJvdGVjdGVkIF9zY3JvbGxhYmxlUGFyZW50OiBhbnkgPSB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBfdXBkYXRlVmlzaWJpbGl0eTogYW55ID0gdW5kZWZpbmVkO1xuICBwdWJsaWMgc3RhcnRMYXp5UmVuZGVyaW5nKFxuICAgIHJvd0NvbnRhaW5lckRpdjogSFRNTEVsZW1lbnQsXG4gICAgZmluZFNjcm9sbGFibGVDb250YWluZXIgPSBmaW5kU2Nyb2xsYWJsZVBhcmVudFxuICApIHtcbiAgICB0aGlzLl9zY3JvbGxhYmxlUGFyZW50ID0gZmluZFNjcm9sbGFibGVDb250YWluZXIocm93Q29udGFpbmVyRGl2KTtcbiAgICB0aGlzLmlzTmVlZFJlbmRlciA9ICEoXG4gICAgICB0aGlzLl9zY3JvbGxhYmxlUGFyZW50LnNjcm9sbEhlaWdodCA+IHRoaXMuX3Njcm9sbGFibGVQYXJlbnQuY2xpZW50SGVpZ2h0XG4gICAgKTtcbiAgICAvLyBpZiAgdGhpcy5fc2Nyb2xsYWJsZVBhcmVudCBpcyBodG1sIHRoZSBzY3JvbGwgZXZlbnQgaXNuJ3QgZmlyZWQsIHNvIHdlIHNob3VsZCB1c2Ugd2luZG93XG4gICAgaWYgKHRoaXMuX3Njcm9sbGFibGVQYXJlbnQgPT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgdGhpcy5fc2Nyb2xsYWJsZVBhcmVudCA9IHdpbmRvdztcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzTmVlZFJlbmRlcikge1xuICAgICAgdGhpcy5fdXBkYXRlVmlzaWJpbGl0eSA9ICgpID0+IHtcbiAgICAgICAgdmFyIGlzUm93Q29udGFpbmVyRGl2VmlzaWJsZSA9IGlzRWxlbWVudFZpc2libGUocm93Q29udGFpbmVyRGl2LCA1MCk7XG4gICAgICAgIGlmICghdGhpcy5pc05lZWRSZW5kZXIgJiYgaXNSb3dDb250YWluZXJEaXZWaXNpYmxlKSB7XG4gICAgICAgICAgdGhpcy5pc05lZWRSZW5kZXIgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuc3RvcExhenlSZW5kZXJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgISF0aGlzLl9zY3JvbGxhYmxlUGFyZW50ICYmXG4gICAgICAgICAgISF0aGlzLl9zY3JvbGxhYmxlUGFyZW50LmFkZEV2ZW50TGlzdGVuZXJcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5fc2Nyb2xsYWJsZVBhcmVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgXCJzY3JvbGxcIixcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVZpc2liaWxpdHlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW5zdXJlVmlzaWJpbGl0eSgpO1xuICAgICAgfSwgMTApO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZW5zdXJlVmlzaWJpbGl0eSgpIHtcbiAgICBpZiAoISF0aGlzLl91cGRhdGVWaXNpYmlsaXR5KSB7XG4gICAgICB0aGlzLl91cGRhdGVWaXNpYmlsaXR5KCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBzdG9wTGF6eVJlbmRlcmluZygpIHtcbiAgICBpZiAoXG4gICAgICAhIXRoaXMuX3Njcm9sbGFibGVQYXJlbnQgJiZcbiAgICAgICEhdGhpcy5fdXBkYXRlVmlzaWJpbGl0eSAmJlxuICAgICAgISF0aGlzLl9zY3JvbGxhYmxlUGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXJcbiAgICApIHtcbiAgICAgIHRoaXMuX3Njcm9sbGFibGVQYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgXCJzY3JvbGxcIixcbiAgICAgICAgdGhpcy5fdXBkYXRlVmlzaWJpbGl0eVxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5fc2Nyb2xsYWJsZVBhcmVudCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl91cGRhdGVWaXNpYmlsaXR5ID0gdW5kZWZpbmVkO1xuICB9XG4gIHByaXZhdGUgaWRWYWx1ZTogc3RyaW5nO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcGFuZWw6IFBhbmVsTW9kZWxCYXNlKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmlkVmFsdWUgPSBRdWVzdGlvblJvd01vZGVsLmdldFJvd0lkKCk7XG4gICAgdGhpcy52aXNpYmxlID0gcGFuZWwuYXJlSW52aXNpYmxlRWxlbWVudHNTaG93aW5nO1xuICAgIHRoaXMuY3JlYXRlTmV3QXJyYXkoXCJlbGVtZW50c1wiKTtcbiAgICB0aGlzLmNyZWF0ZU5ld0FycmF5KFwidmlzaWJsZUVsZW1lbnRzXCIpO1xuICB9XG4gIHByaXZhdGUgaXNMYXp5UmVuZGVyaW5nVmFsdWU6IGJvb2xlYW47XG4gIHB1YmxpYyBzZXRJc0xhenlSZW5kZXJpbmcodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5pc0xhenlSZW5kZXJpbmdWYWx1ZSA9IHZhbDtcbiAgICB0aGlzLmlzTmVlZFJlbmRlciA9ICF2YWw7XG4gIH1cbiAgcHVibGljIGlzTGF6eVJlbmRlcmluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0xhenlSZW5kZXJpbmdWYWx1ZSA9PT0gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaWRWYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGVsZW1lbnRzKCk6IEFycmF5PElFbGVtZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImVsZW1lbnRzXCIpO1xuICB9XG4gIHB1YmxpYyBnZXQgdmlzaWJsZUVsZW1lbnRzKCk6IEFycmF5PElFbGVtZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVFbGVtZW50c1wiKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCB2aXNpYmxlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzTmVlZFJlbmRlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNuZWVkcmVuZGVyXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNOZWVkUmVuZGVyKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzbmVlZHJlbmRlclwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyB1cGRhdGVWaXNpYmxlKCkge1xuICAgIHRoaXMudmlzaWJsZSA9IHRoaXMuY2FsY1Zpc2libGUoKTtcbiAgICB0aGlzLnNldFdpZHRoKCk7XG4gIH1cbiAgcHVibGljIGFkZEVsZW1lbnQocTogSUVsZW1lbnQpIHtcbiAgICB0aGlzLmVsZW1lbnRzLnB1c2gocSk7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlKCk7XG4gIH1cbiAgcHVibGljIGdldCBpbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhbmVsLnJvd3MuaW5kZXhPZih0aGlzKTtcbiAgfVxuICBwcml2YXRlIHNldFdpZHRoKCkge1xuICAgIHZhciB2aXNDb3VudCA9IHRoaXMudmlzaWJsZUVsZW1lbnRzLmxlbmd0aDtcbiAgICBpZiAodmlzQ291bnQgPT0gMCkgcmV0dXJuO1xuICAgIHZhciBjb3VudGVyID0gMDtcbiAgICB2YXIgcHJlU2V0V2lkdGhFbGVtZW50cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsID0gdGhpcy5lbGVtZW50c1tpXTtcbiAgICAgIHRoaXMuc2V0RWxlbWVudE1heE1pbldpZHRoKGVsKTtcblxuICAgICAgaWYgKGVsLmlzVmlzaWJsZSkge1xuICAgICAgICB2YXIgd2lkdGggPSB0aGlzLmdldEVsZW1lbnRXaWR0aChlbCk7XG4gICAgICAgIGlmICghIXdpZHRoKSB7XG4gICAgICAgICAgZWwucmVuZGVyV2lkdGggPSB0aGlzLmdldFJlbmRlcmVkV2lkdGhGcm9tV2lkdGgod2lkdGgpO1xuICAgICAgICAgIHByZVNldFdpZHRoRWxlbWVudHMucHVzaChlbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWwucmlnaHRJbmRlbnQgPSBjb3VudGVyIDwgdmlzQ291bnQgLSAxID8gMSA6IDA7XG4gICAgICAgIGNvdW50ZXIrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsLnJlbmRlcldpZHRoID0gXCJcIjtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWwgPSB0aGlzLmVsZW1lbnRzW2ldO1xuICAgICAgaWYgKCFlbC5pc1Zpc2libGUgfHwgcHJlU2V0V2lkdGhFbGVtZW50cy5pbmRleE9mKGVsKSA+IC0xKSBjb250aW51ZTtcbiAgICAgIGlmIChwcmVTZXRXaWR0aEVsZW1lbnRzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIGVsLnJlbmRlcldpZHRoID0gKDEwMCAvIHZpc0NvdW50KS50b0ZpeGVkKDYpICsgXCIlXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbC5yZW5kZXJXaWR0aCA9IHRoaXMuZ2V0UmVuZGVyZWRDYWxjV2lkdGgoXG4gICAgICAgICAgZWwsXG4gICAgICAgICAgcHJlU2V0V2lkdGhFbGVtZW50cyxcbiAgICAgICAgICB2aXNDb3VudFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgc2V0RWxlbWVudE1heE1pbldpZHRoKGVsOiBJRWxlbWVudCk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIGVsLndpZHRoICYmXG4gICAgICB0eXBlb2YgZWwud2lkdGggPT09IFwic3RyaW5nXCIgJiZcbiAgICAgIGVsLndpZHRoLmluZGV4T2YoXCIlXCIpID09PSAtMVxuICAgICkge1xuICAgICAgZWwubWluV2lkdGggPSBlbC53aWR0aDtcbiAgICAgIGVsLm1heFdpZHRoID0gZWwud2lkdGg7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRSZW5kZXJlZENhbGNXaWR0aChcbiAgICBlbDogSUVsZW1lbnQsXG4gICAgcHJlU2V0V2lkdGhFbGVtZW50czogQXJyYXk8SUVsZW1lbnQ+LFxuICAgIHZpc0NvdW50OiBudW1iZXJcbiAgKTogc3RyaW5nIHtcbiAgICB2YXIgZXhwcmVzc2lvbiA9IFwiMTAwJVwiO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJlU2V0V2lkdGhFbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgZXhwcmVzc2lvbiArPSBcIiAtIFwiICsgcHJlU2V0V2lkdGhFbGVtZW50c1tpXS5yZW5kZXJXaWR0aDtcbiAgICB9XG4gICAgdmFyIGNhbGNXaWR0aEVsID0gdmlzQ291bnQgLSBwcmVTZXRXaWR0aEVsZW1lbnRzLmxlbmd0aDtcbiAgICBpZiAoY2FsY1dpZHRoRWwgPiAxKSB7XG4gICAgICBleHByZXNzaW9uID0gXCIoXCIgKyBleHByZXNzaW9uICsgXCIpL1wiICsgY2FsY1dpZHRoRWwudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgcmV0dXJuIFwiY2FsYyhcIiArIGV4cHJlc3Npb24gKyBcIilcIjtcbiAgfVxuICBwcml2YXRlIGdldEVsZW1lbnRXaWR0aChlbDogSUVsZW1lbnQpOiBzdHJpbmcge1xuICAgIHZhciB3aWR0aCA9IGVsLndpZHRoO1xuICAgIGlmICghd2lkdGggfHwgdHlwZW9mIHdpZHRoICE9PSBcInN0cmluZ1wiKSByZXR1cm4gXCJcIjtcbiAgICByZXR1cm4gd2lkdGgudHJpbSgpO1xuICB9XG4gIHByaXZhdGUgZ2V0UmVuZGVyZWRXaWR0aEZyb21XaWR0aCh3aWR0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gSGVscGVycy5pc051bWJlcih3aWR0aCkgPyB3aWR0aCArIFwicHhcIiA6IHdpZHRoO1xuICB9XG4gIHByaXZhdGUgY2FsY1Zpc2libGUoKTogYm9vbGVhbiB7XG4gICAgdmFyIHZpc0VsZW1lbnRzOiBBcnJheTxJRWxlbWVudD4gPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmVsZW1lbnRzW2ldLmlzVmlzaWJsZSkge1xuICAgICAgICB2aXNFbGVtZW50cy5wdXNoKHRoaXMuZWxlbWVudHNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5uZWVkVG9VcGRhdGVWaXNpYmxlRWxlbWVudHModmlzRWxlbWVudHMpKSB7XG4gICAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlRWxlbWVudHNcIiwgdmlzRWxlbWVudHMpO1xuICAgIH1cbiAgICByZXR1cm4gdmlzRWxlbWVudHMubGVuZ3RoID4gMDtcbiAgfVxuICBwcml2YXRlIG5lZWRUb1VwZGF0ZVZpc2libGVFbGVtZW50cyh2aXNFbGVtZW50czogQXJyYXk8SUVsZW1lbnQ+KTogYm9vbGVhbiB7XG4gICAgaWYgKHZpc0VsZW1lbnRzLmxlbmd0aCAhPT0gdGhpcy52aXNpYmxlRWxlbWVudHMubGVuZ3RoKSByZXR1cm4gdHJ1ZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZpc0VsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodmlzRWxlbWVudHNbaV0gIT09IHRoaXMudmlzaWJsZUVsZW1lbnRzW2ldKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICB0aGlzLnN0b3BMYXp5UmVuZGVyaW5nKCk7XG4gIH1cbiAgcHVibGljIGdldFJvd0NzcygpIHtcbiAgICByZXR1cm4gbmV3IENzc0NsYXNzQnVpbGRlcigpXG4gICAgICAuYXBwZW5kKHRoaXMucGFuZWwuY3NzQ2xhc3Nlcy5yb3cpXG4gICAgICAuYXBwZW5kKHRoaXMucGFuZWwuY3NzQ2xhc3Nlcy5yb3dNdWx0aXBsZSwgdGhpcy52aXNpYmxlRWxlbWVudHMubGVuZ3RoID4gMSlcbiAgICAgIC50b1N0cmluZygpO1xuXG4gIH1cbn1cblxuLyoqXG4gKiBBIGJhc2UgY2xhc3MgZm9yIGEgUGFuZWwgYW5kIFBhZ2Ugb2JqZWN0cy5cbiAqL1xuZXhwb3J0IGNsYXNzIFBhbmVsTW9kZWxCYXNlIGV4dGVuZHMgU3VydmV5RWxlbWVudFxuICBpbXBsZW1lbnRzIElQYW5lbCwgSUNvbmRpdGlvblJ1bm5lciwgSVN1cnZleUVycm9yT3duZXIsIElUaXRsZU93bmVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcGFuZWxDb3VudGVyID0gMTAwO1xuICBwcml2YXRlIHN0YXRpYyBnZXRQYW5lbElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwic3BfXCIgKyBQYW5lbE1vZGVsQmFzZS5wYW5lbENvdW50ZXIrKztcbiAgfVxuXG4gIHByaXZhdGUgZWxlbWVudHNWYWx1ZTogQXJyYXk8SUVsZW1lbnQ+O1xuICBwcml2YXRlIGlzUXVlc3Rpb25zUmVhZHk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBxdWVzdGlvbnNWYWx1ZTogQXJyYXk8UXVlc3Rpb24+ID0gbmV3IEFycmF5PFF1ZXN0aW9uPigpO1xuICBhZGRFbGVtZW50Q2FsbGJhY2s6IChlbGVtZW50OiBJRWxlbWVudCkgPT4gdm9pZDtcbiAgcmVtb3ZlRWxlbWVudENhbGxiYWNrOiAoZWxlbWVudDogSUVsZW1lbnQpID0+IHZvaWQ7XG4gIG9uR2V0UXVlc3Rpb25UaXRsZUxvY2F0aW9uOiAoKSA9PiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nID0gXCJcIikge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHRoaXMuY3JlYXRlTmV3QXJyYXkoXCJyb3dzXCIpO1xuICAgIHRoaXMuZWxlbWVudHNWYWx1ZSA9IHRoaXMuY3JlYXRlTmV3QXJyYXkoXG4gICAgICBcImVsZW1lbnRzXCIsXG4gICAgICB0aGlzLm9uQWRkRWxlbWVudC5iaW5kKHRoaXMpLFxuICAgICAgdGhpcy5vblJlbW92ZUVsZW1lbnQuYmluZCh0aGlzKVxuICAgICk7XG4gICAgdGhpcy5pZCA9IFBhbmVsTW9kZWxCYXNlLmdldFBhbmVsSWQoKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwicmVxdWlyZWRFcnJvclRleHRcIiwgdGhpcyk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcInF1ZXN0aW9uVGl0bGVMb2NhdGlvblwiLCAoKSA9PiB7XG4gICAgICB0aGlzLm9uVmlzaWJsZUNoYW5nZWQuYmluZCh0aGlzKTtcbiAgICAgIHRoaXMudXBkYXRlRWxlbWVudENzcyh0cnVlKTtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoXG4gICAgICBbXCJxdWVzdGlvblN0YXJ0SW5kZXhcIiwgXCJzaG93UXVlc3Rpb25OdW1iZXJzXCJdLFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZVZpc2libGVJbmRleGVzKCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInBhbmVsYmFzZVwiO1xuICB9XG4gIHB1YmxpYyBzZXRTdXJ2ZXlJbXBsKHZhbHVlOiBJU3VydmV5SW1wbCkge1xuICAgIHN1cGVyLnNldFN1cnZleUltcGwodmFsdWUpO1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkgdGhpcy5vblZpc2libGVDaGFuZ2VkKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmVsZW1lbnRzW2ldLnNldFN1cnZleUltcGwodmFsdWUpO1xuICAgIH1cbiAgfVxuICBlbmRMb2FkaW5nRnJvbUpzb24oKSB7XG4gICAgc3VwZXIuZW5kTG9hZGluZ0Zyb21Kc29uKCk7XG4gICAgdGhpcy5tYXJrUXVlc3Rpb25MaXN0RGlydHkoKTtcbiAgICB0aGlzLm9uUm93c0NoYW5nZWQoKTtcbiAgfVxuICBnZXQgaGFzVGl0bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICh0aGlzLmNhblNob3dUaXRsZSgpICYmIHRoaXMudGl0bGUubGVuZ3RoID4gMCkgfHxcbiAgICAgICh0aGlzLmlzRGVzaWduTW9kZSAmJiBzZXR0aW5ncy5hbGxvd1Nob3dFbXB0eVRpdGxlSW5EZXNpZ25Nb2RlKVxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIGNhblNob3dUaXRsZSgpOiBib29sZWFuIHsgcmV0dXJuIHRydWU7IH1cbiAgZ2V0IF9zaG93RGVzY3JpcHRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICgoPGFueT50aGlzLnN1cnZleSkuc2hvd1BhZ2VUaXRsZXMgJiYgdGhpcy5kZXNjcmlwdGlvbi5sZW5ndGggPiAwKSB8fFxuICAgICAgKHRoaXMuaXNEZXNpZ25Nb2RlICYmXG4gICAgICAgIHNldHRpbmdzLmFsbG93U2hvd0VtcHR5VGl0bGVJbkRlc2lnbk1vZGUgJiZcbiAgICAgICAgc2V0dGluZ3MuYWxsb3dTaG93RW1wdHlEZXNjcmlwdGlvbkluRGVzaWduTW9kZSlcbiAgICApO1xuICB9XG4gIHB1YmxpYyBsb2NhbGVDaGFuZ2VkKCkge1xuICAgIHN1cGVyLmxvY2FsZUNoYW5nZWQoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICg8QmFzZT4oPGFueT50aGlzLmVsZW1lbnRzW2ldKSkubG9jYWxlQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgbG9jU3Ryc0NoYW5nZWQoKSB7XG4gICAgc3VwZXIubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuZWxlbWVudHNbaV0ubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNoYXIvc3RyaW5nIGZvciBhIHJlcXVpcmVkIHBhbmVsLlxuICAgKiBAc2VlIFN1cnZleU1vZGVsLnJlcXVpcmVkVGV4dFxuICAgKi9cbiAgcHVibGljIGdldCByZXF1aXJlZFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkgIT0gbnVsbCAmJiB0aGlzLmlzUmVxdWlyZWRcbiAgICAgID8gdGhpcy5zdXJ2ZXkucmVxdWlyZWRUZXh0XG4gICAgICA6IFwiXCI7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCB0aXRsZVBhdHRlcm4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gISF0aGlzLnN1cnZleSA/IHRoaXMuc3VydmV5LnF1ZXN0aW9uVGl0bGVQYXR0ZXJuIDogXCJudW1UaXRsZVJlcXVpcmVcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzUmVxdWlyZVRleHRPblN0YXJ0KCkge1xuICAgIHJldHVybiB0aGlzLmlzUmVxdWlyZWQgJiYgdGhpcy50aXRsZVBhdHRlcm4gPT0gXCJyZXF1aXJlTnVtVGl0bGVcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzUmVxdWlyZVRleHRCZWZvcmVUaXRsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1JlcXVpcmVkICYmIHRoaXMudGl0bGVQYXR0ZXJuID09IFwibnVtUmVxdWlyZVRpdGxlXCI7XG4gIH1cbiAgcHVibGljIGdldCBpc1JlcXVpcmVUZXh0QWZ0ZXJUaXRsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1JlcXVpcmVkICYmIHRoaXMudGl0bGVQYXR0ZXJuID09IFwibnVtVGl0bGVSZXF1aXJlXCI7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBjdXN0b20gdGV4dCB0aGF0IHdpbGwgYmUgc2hvd24gb24gcmVxdWlyZWQgZXJyb3IuIFVzZSB0aGlzIHByb3BlcnR5LCBpZiB5b3UgZG8gbm90IHdhbnQgdG8gc2hvdyB0aGUgZGVmYXVsdCB0ZXh0LlxuICAgKi9cbiAgcHVibGljIGdldCByZXF1aXJlZEVycm9yVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInJlcXVpcmVkRXJyb3JUZXh0XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcmVxdWlyZWRFcnJvclRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInJlcXVpcmVkRXJyb3JUZXh0XCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY1JlcXVpcmVkRXJyb3JUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInJlcXVpcmVkRXJyb3JUZXh0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byByYW5kb21pemUgcXVlc3Rpb25zLiBTZXQgaXQgdG8gJ3JhbmRvbScgdG8gcmFuZG9taXplIHF1ZXN0aW9ucywgJ2luaXRpYWwnIHRvIGtlZXAgdGhlbSBpbiB0aGUgc2FtZSBvcmRlciBvciAnZGVmYXVsdCcgdG8gdXNlIHRoZSBTdXJ2ZXkgcXVlc3Rpb25zT3JkZXIgcHJvcGVydHlcbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5xdWVzdGlvbnNPcmRlclxuICAgKiBAc2VlIGFyZVF1ZXN0aW9uc1JhbmRvbWl6ZWRcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlc3Rpb25zT3JkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25zT3JkZXJcIik7XG4gIH1cbiAgcHVibGljIHNldCBxdWVzdGlvbnNPcmRlcih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uc09yZGVyXCIsIHZhbCk7XG4gIH1cbiAgcHJpdmF0ZSBjYW5SYW5kb21pemUoaXNSYW5kb206IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNSYW5kb20gJiYgKHRoaXMucXVlc3Rpb25zT3JkZXIgIT09IFwiaW5pdGlhbFwiKSB8fCB0aGlzLnF1ZXN0aW9uc09yZGVyID09PSBcInJhbmRvbVwiO1xuICB9XG4gIHByb3RlY3RlZCBpc1JhbmRvbWl6aW5nID0gZmFsc2U7XG4gIHJhbmRvbWl6ZUVsZW1lbnRzKGlzUmFuZG9tOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNhblJhbmRvbWl6ZShpc1JhbmRvbSkgfHwgdGhpcy5pc1JhbmRvbWl6aW5nKSByZXR1cm47XG4gICAgdGhpcy5pc1JhbmRvbWl6aW5nID0gdHJ1ZTtcbiAgICB2YXIgb2xkRWxlbWVudHMgPSBbXTtcbiAgICB2YXIgZWxlbWVudHMgPSB0aGlzLmVsZW1lbnRzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG9sZEVsZW1lbnRzLnB1c2goZWxlbWVudHNbaV0pO1xuICAgIH1cbiAgICB2YXIgbmV3RWxlbWVudHMgPSBIZWxwZXJzLnJhbmRvbWl6ZUFycmF5PElFbGVtZW50PihvbGRFbGVtZW50cyk7XG4gICAgdGhpcy5lbGVtZW50cy5zcGxpY2UoMCwgdGhpcy5lbGVtZW50cy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3RWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuZWxlbWVudHMucHVzaChuZXdFbGVtZW50c1tpXSk7XG4gICAgfVxuICAgIHRoaXMuaXNSYW5kb21pemluZyA9IGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBBIHBhcmVudCBlbGVtZW50LiBJdCBpcyBhbHdheXMgbnVsbCBmb3IgdGhlIFBhZ2Ugb2JqZWN0IGFuZCBhbHdheXMgbm90IG51bGwgZm9yIHRoZSBQYW5lbCBvYmplY3QuIFBhbmVsIG9iamVjdCBtYXkgY29udGFpbiBRdWVzdGlvbnMgYW5kIG90aGVyIFBhbmVscy5cbiAgICovXG4gIHB1YmxpYyBnZXQgcGFyZW50KCk6IFBhbmVsTW9kZWxCYXNlIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicGFyZW50XCIsIG51bGwpO1xuICB9XG4gIHB1YmxpYyBzZXQgcGFyZW50KHZhbDogUGFuZWxNb2RlbEJhc2UpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJwYXJlbnRcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGRlcHRoKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMucGFyZW50ID09IG51bGwpIHJldHVybiAwO1xuICAgIHJldHVybiB0aGlzLnBhcmVudC5kZXB0aCArIDE7XG4gIH1cbiAgLyoqXG4gICAqIEFuIGV4cHJlc3Npb24gdGhhdCByZXR1cm5zIHRydWUgb3IgZmFsc2UuIElmIGl0IHJldHVybnMgdHJ1ZSB0aGUgUGFuZWwgYmVjb21lcyB2aXNpYmxlIGFuZCBpZiBpdCByZXR1cm5zIGZhbHNlIHRoZSBQYW5lbCBiZWNvbWVzIGludmlzaWJsZS4gVGhlIGxpYnJhcnkgcnVucyB0aGUgZXhwcmVzc2lvbiBvbiBzdXJ2ZXkgc3RhcnQgYW5kIG9uIGNoYW5naW5nIGEgcXVlc3Rpb24gdmFsdWUuIElmIHRoZSBwcm9wZXJ0eSBpcyBlbXB0eSB0aGVuIHZpc2libGUgcHJvcGVydHkgaXMgdXNlZC5cbiAgICogQHNlZSB2aXNpYmxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGVJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlSWZcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCB2aXNpYmxlSWYodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlSWZcIiwgdmFsKTtcbiAgfVxuICBwcm90ZWN0ZWQgY2FsY0Nzc0NsYXNzZXMoY3NzOiBhbnkpOiBhbnkge1xuICAgIHZhciBjbGFzc2VzID0geyBwYW5lbDoge30sIGVycm9yOiB7fSwgcm93OiBcIlwiLCByb3dNdWx0aXBsZTogXCJcIiB9O1xuICAgIHRoaXMuY29weUNzc0NsYXNzZXMoY2xhc3Nlcy5wYW5lbCwgY3NzLnBhbmVsKTtcbiAgICB0aGlzLmNvcHlDc3NDbGFzc2VzKGNsYXNzZXMuZXJyb3IsIGNzcy5lcnJvcik7XG4gICAgaWYgKCEhY3NzLnJvdykge1xuICAgICAgY2xhc3Nlcy5yb3cgPSBjc3Mucm93O1xuICAgIH1cbiAgICBpZiAoISFjc3Mucm93TXVsdGlwbGUpIHtcbiAgICAgIGNsYXNzZXMucm93TXVsdGlwbGUgPSBjc3Mucm93TXVsdGlwbGU7XG4gICAgfVxuICAgIGlmICh0aGlzLnN1cnZleSkge1xuICAgICAgdGhpcy5zdXJ2ZXkudXBkYXRlUGFuZWxDc3NDbGFzc2VzKHRoaXMsIGNsYXNzZXMpO1xuICAgIH1cbiAgICByZXR1cm4gY2xhc3NlcztcbiAgfVxuICAvKipcbiAgICogQSB1bmlxdWUgZWxlbWVudCBpZGVudGlmaWNhdG9yLiBJdCBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaWRcIik7XG4gIH1cbiAgcHVibGljIHNldCBpZCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlkXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBvYmplY3QgaXMgUGFuZWwuIFJldHVybnMgZmFsc2UgaWYgdGhlIGN1cnJlbnQgb2JqZWN0IGlzIFBhZ2UgKGEgcm9vdCBQYW5lbCkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzUGFuZWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBnZXRQYW5lbCgpOiBJUGFuZWwge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGdldExheW91dFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJyb3dcIjtcbiAgfVxuICBpc0xheW91dFR5cGVTdXBwb3J0ZWQobGF5b3V0VHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGxheW91dFR5cGUgIT09IFwiZmxvd1wiO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGFsbCBxdWVzdGlvbnMgbG9jYXRlZCBpbiB0aGUgUGFuZWwvUGFnZSwgaW5jbHVkaW5nIGluIHRoZSBuZXN0ZWQgUGFuZWxzLlxuICAgKiBAc2VlIFF1ZXN0aW9uXG4gICAqIEBzZWUgZWxlbWVudHNcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlc3Rpb25zKCk6IEFycmF5PFF1ZXN0aW9uPiB7XG4gICAgaWYgKCF0aGlzLmlzUXVlc3Rpb25zUmVhZHkpIHtcbiAgICAgIHRoaXMucXVlc3Rpb25zVmFsdWUgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWwgPSB0aGlzLmVsZW1lbnRzW2ldO1xuICAgICAgICBpZiAoZWwuaXNQYW5lbCkge1xuICAgICAgICAgIHZhciBxcyA9ICg8UGFuZWxNb2RlbD5lbCkucXVlc3Rpb25zO1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb25zVmFsdWUucHVzaChxc1tqXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucXVlc3Rpb25zVmFsdWUucHVzaCg8UXVlc3Rpb24+ZWwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmlzUXVlc3Rpb25zUmVhZHkgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uc1ZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCBnZXRWYWxpZE5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoISFuYW1lKSByZXR1cm4gbmFtZS50cmltKCk7XG4gICAgcmV0dXJuIG5hbWU7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHF1ZXN0aW9uIGJ5IGl0cyBuYW1lXG4gICAqIEBwYXJhbSBuYW1lIHRoZSBxdWVzdGlvbiBuYW1lXG4gICAqL1xuICBwdWJsaWMgZ2V0UXVlc3Rpb25CeU5hbWUobmFtZTogc3RyaW5nKTogUXVlc3Rpb24ge1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLnF1ZXN0aW9ucztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHF1ZXN0aW9uc1tpXS5uYW1lID09IG5hbWUpIHJldHVybiBxdWVzdGlvbnNbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBlbGVtZW50IGJ5IGl0cyBuYW1lLiBJdCB3b3JrcyByZWN1cnNpdmVseS5cbiAgICogQHBhcmFtIG5hbWUgdGhlIGVsZW1lbnQgbmFtZVxuICAgKi9cbiAgcHVibGljIGdldEVsZW1lbnRCeU5hbWUobmFtZTogc3RyaW5nKTogSUVsZW1lbnQge1xuICAgIHZhciBlbGVtZW50cyA9IHRoaXMuZWxlbWVudHM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsID0gZWxlbWVudHNbaV07XG4gICAgICBpZiAoZWwubmFtZSA9PSBuYW1lKSByZXR1cm4gZWw7XG4gICAgICB2YXIgcG5sID0gZWwuZ2V0UGFuZWwoKTtcbiAgICAgIGlmICghIXBubCkge1xuICAgICAgICB2YXIgcmVzID0gKDxQYW5lbE1vZGVsQmFzZT5wbmwpLmdldEVsZW1lbnRCeU5hbWUobmFtZSk7XG4gICAgICAgIGlmICghIXJlcykgcmV0dXJuIHJlcztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIGdldFF1ZXN0aW9uQnlWYWx1ZU5hbWUodmFsdWVOYW1lOiBzdHJpbmcpOiBRdWVzdGlvbiB7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMucXVlc3Rpb25zO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocXVlc3Rpb25zW2ldLmdldFZhbHVlTmFtZSgpID09IHZhbHVlTmFtZSkgcmV0dXJuIHF1ZXN0aW9uc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgcXVlc3Rpb24gdmFsdWVzIG9uIHRoZSBjdXJyZW50IHBhZ2VcbiAgICovXG4gIHB1YmxpYyBnZXRWYWx1ZSgpOiBhbnkge1xuICAgIHZhciBkYXRhOiBhbnkgPSB7fTtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5xdWVzdGlvbnM7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHEgPSBxdWVzdGlvbnNbaV07XG4gICAgICBpZiAocS5pc0VtcHR5KCkpIGNvbnRpbnVlO1xuICAgICAgdmFyIHZhbHVlTmFtZSA9IHEuZ2V0VmFsdWVOYW1lKCk7XG4gICAgICBkYXRhW3ZhbHVlTmFtZV0gPSBxLnZhbHVlO1xuICAgICAgaWYgKCEhdGhpcy5kYXRhKSB7XG4gICAgICAgIHZhciBjb21tZW50ID0gdGhpcy5kYXRhLmdldENvbW1lbnQodmFsdWVOYW1lKTtcbiAgICAgICAgaWYgKCEhY29tbWVudCkge1xuICAgICAgICAgIGRhdGFbdmFsdWVOYW1lICsgc2V0dGluZ3MuY29tbWVudFByZWZpeF0gPSBjb21tZW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gcXVlc3Rpb25zIHZhbHVlcyBhcyBhIEpTT04gb2JqZWN0IHdpdGggZGlzcGxheSB0ZXh0LiBGb3IgZXhhbXBsZSwgZm9yIGRyb3Bkb3duLCBpdCB3b3VsZCByZXR1cm4gdGhlIGl0ZW0gdGV4dCBpbnN0ZWFkIG9mIGl0ZW0gdmFsdWUuXG4gICAqIEBwYXJhbSBrZXlzQXNUZXh0IFNldCB0aGlzIHZhbHVlIHRvIHRydWUsIHRvIHJldHVybiBrZXkgKGluIG1hdHJpY2VzIHF1ZXN0aW9ucykgYXMgZGlzcGxheSB0ZXh0IGFzIHdlbGwuXG4gICAqL1xuICBwdWJsaWMgZ2V0RGlzcGxheVZhbHVlKGtleXNBc1RleHQ6IGJvb2xlYW4pOiBhbnkge1xuICAgIHZhciBkYXRhOiBhbnkgPSB7fTtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5xdWVzdGlvbnM7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHEgPSBxdWVzdGlvbnNbaV07XG4gICAgICBpZiAocS5pc0VtcHR5KCkpIGNvbnRpbnVlO1xuICAgICAgdmFyIHZhbHVlTmFtZSA9IGtleXNBc1RleHQgPyBxLnRpdGxlIDogcS5nZXRWYWx1ZU5hbWUoKTtcbiAgICAgIGRhdGFbdmFsdWVOYW1lXSA9IHEuZ2V0RGlzcGxheVZhbHVlKGtleXNBc1RleHQpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBxdWVzdGlvbiBjb21tZW50cyBvbiB0aGUgY3VycmVudCBwYWdlXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29tbWVudHMoKTogYW55IHtcbiAgICB2YXIgY29tbWVudHMgPSB7fTtcbiAgICBpZiAoIXRoaXMuZGF0YSkgcmV0dXJuIGNvbW1lbnRzO1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLnF1ZXN0aW9ucztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHEgPSBxdWVzdGlvbnNbaV07XG4gICAgICB2YXIgY29tbWVudCA9IHRoaXMuZGF0YS5nZXRDb21tZW50KHEuZ2V0VmFsdWVOYW1lKCkpO1xuICAgICAgaWYgKCEhY29tbWVudCkge1xuICAgICAgICAoPGFueT5jb21tZW50cylbcS5nZXRWYWx1ZU5hbWUoKV0gPSBjb21tZW50O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29tbWVudHM7XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgdGhpcyBmdW5jdGlvbiB0byByZW1vdmUgYWxsIHF1ZXN0aW9uIHZhbHVlcyBmcm9tIHRoZSBjdXJyZW50IHBhZ2UvcGFuZWwsIHRoYXQgZW5kLXVzZXIgd2lsbCBub3QgYmUgYWJsZSB0byBlbnRlci5cbiAgICogRm9yIGV4YW1wbGUgdGhlIHZhbHVlIHRoYXQgZG9lc24ndCBleGlzdHMgaW4gYSByYWRpZ3JvdXAvZHJvcGRvd24vY2hlY2tib3ggY2hvaWNlcyBvciBtYXRyaXggcm93cy9jb2x1bW5zLlxuICAgKiBQbGVhc2Ugbm90ZSwgdGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNsZWFyIHZhbHVlcyBmb3IgaW52aXNpYmxlIHF1ZXN0aW9ucyBvciB2YWx1ZXMgdGhhdCBkb2Vzbid0IGFzc29jaWF0ZWQgd2l0aCBxdWVzdGlvbnMuXG4gICAqIEBzZWUgUXVlc3Rpb24uY2xlYXJJbmNvcnJlY3RWYWx1ZXNcbiAgICovXG4gIHB1YmxpYyBjbGVhckluY29ycmVjdFZhbHVlcygpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuZWxlbWVudHNbaV0uY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgdGhpcyBmdW5jdGlvbiB0byBjbGVhciBhbGwgZXJyb3JzIGluIHRoZSBwYW5lbCAvIHBhZ2UgYW5kIGFsbCBpdHMgY2hpbGQgZWxlbWVudHMgKHBhbmVscyBhbmQgcXVlc3Rpb25zKVxuICAgKi9cbiAgcHVibGljIGNsZWFyRXJyb3JzKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5lbGVtZW50c1tpXS5jbGVhckVycm9ycygpO1xuICAgIH1cbiAgICB0aGlzLmVycm9ycyA9IFtdO1xuICB9XG4gIHByaXZhdGUgbWFya1F1ZXN0aW9uTGlzdERpcnR5KCkge1xuICAgIHRoaXMuaXNRdWVzdGlvbnNSZWFkeSA9IGZhbHNlO1xuICAgIGlmICh0aGlzLnBhcmVudCkgdGhpcy5wYXJlbnQubWFya1F1ZXN0aW9uTGlzdERpcnR5KCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBvYmplY3QsIFBhbmVsL1BhZ2UuIEVsZW1lbnRzIGNhbiBiZSBxdWVzdGlvbnMgb3IgcGFuZWxzLiBUaGUgZnVuY3Rpb24gZG9lc24ndCByZXR1cm4gZWxlbWVudHMgaW4gdGhlIG5lc3RlZCBQYW5lbHMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGVsZW1lbnRzKCk6IEFycmF5PElFbGVtZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudHNWYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0RWxlbWVudHNJbkRlc2lnbihpbmNsdWRlSGlkZGVuOiBib29sZWFuID0gZmFsc2UpOiBBcnJheTxJRWxlbWVudD4ge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRzO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgZWxlbWVudCBiZWxvbmdzIHRvIHRoZSBQYW5lbC9QYWdlLiBJdCBsb29rcyBpbiBuZXN0ZWQgUGFuZWxzIGFzIHdlbGwuXG4gICAqIEBwYXJhbSBlbGVtZW50XG4gICAqIEBzZWUgUGFuZWxNb2RlbFxuICAgKi9cbiAgcHVibGljIGNvbnRhaW5zRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsOiBhbnkgPSB0aGlzLmVsZW1lbnRzW2ldO1xuICAgICAgaWYgKGVsID09IGVsZW1lbnQpIHJldHVybiB0cnVlO1xuICAgICAgdmFyIHBubCA9IGVsLmdldFBhbmVsKCk7XG4gICAgICBpZiAoISFwbmwpIHtcbiAgICAgICAgaWYgKCg8UGFuZWxNb2RlbEJhc2U+cG5sKS5jb250YWluc0VsZW1lbnQoZWxlbWVudCkpIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUsIHRvIHJlcXVpcmUgdGhlIGFuc3dlciBhdCBsZWFzdCBpbiBvbmUgcXVlc3Rpb24gaW4gdGhlIHBhbmVsLlxuICAgKi9cbiAgcHVibGljIGdldCBpc1JlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc1JlcXVpcmVkXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGlzUmVxdWlyZWQodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNSZXF1aXJlZFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBBbiBleHByZXNzaW9uIHRoYXQgcmV0dXJucyB0cnVlIG9yIGZhbHNlLiBJZiBpdCByZXR1cm5zIHRydWUgdGhlIFBhbmVsL1BhZ2UgYmVjb21lcyByZXF1aXJlZC5cbiAgICogVGhlIGxpYnJhcnkgcnVucyB0aGUgZXhwcmVzc2lvbiBvbiBzdXJ2ZXkgc3RhcnQgYW5kIG9uIGNoYW5naW5nIGEgcXVlc3Rpb24gdmFsdWUuIElmIHRoZSBwcm9wZXJ0eSBpcyBlbXB0eSB0aGVuIGlzUmVxdWlyZWQgcHJvcGVydHkgaXMgdXNlZC5cbiAgICogQHNlZSBpc1JlcXVpcmVkXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlcXVpcmVkSWYoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmVxdWlyZWRJZlwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJlcXVpcmVkSWYodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyZXF1aXJlZElmXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIHNlYXJjaFRleHQodGV4dDogc3RyaW5nLCBmb3VuZGVkOiBBcnJheTxJRmluZEVsZW1lbnQ+KTogdm9pZCB7XG4gICAgc3VwZXIuc2VhcmNoVGV4dCh0ZXh0LCBmb3VuZGVkKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICg8QmFzZT4oPGFueT50aGlzLmVsZW1lbnRzW2ldKSkuc2VhcmNoVGV4dCh0ZXh0LCBmb3VuZGVkKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSwgaWYgdGhlcmUgaXMgYW4gZXJyb3Igb24gdGhpcyBQYWdlIG9yIGluc2lkZSB0aGUgY3VycmVudCBQYW5lbFxuICAgKiBAcGFyYW0gZmlyZUNhbGxiYWNrIHNldCBpdCB0byB0cnVlLCB0byBzaG93IGVycm9ycyBpbiBVSVxuICAgKiBAcGFyYW0gZm9jdXNPbkZpcnN0RXJyb3Igc2V0IGl0IHRvIHRydWUgdG8gZm9jdXMgb24gdGhlIGZpcnN0IHF1ZXN0aW9uIHRoYXQgZG9lc24ndCBwYXNzIHRoZSB2YWxpZGF0aW9uXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKFxuICAgIGZpcmVDYWxsYmFjazogYm9vbGVhbiA9IHRydWUsXG4gICAgZm9jdXNPbkZpcnN0RXJyb3I6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICByZWM6IGFueSA9IG51bGxcbiAgKTogYm9vbGVhbiB7XG4gICAgcmVjID0gISFyZWNcbiAgICAgID8gcmVjXG4gICAgICA6IHtcbiAgICAgICAgZmlyZUNhbGxiYWNrOiBmaXJlQ2FsbGJhY2ssXG4gICAgICAgIGZvY3VzZU9uRmlyc3RFcnJvcjogZm9jdXNPbkZpcnN0RXJyb3IsXG4gICAgICAgIGZpcnN0RXJyb3JRdWVzdGlvbjogPGFueT5udWxsLFxuICAgICAgICByZXN1bHQ6IGZhbHNlLFxuICAgICAgfTtcbiAgICB0aGlzLmhhc0Vycm9yc0NvcmUocmVjKTtcbiAgICBpZiAocmVjLmZpcnN0RXJyb3JRdWVzdGlvbikge1xuICAgICAgcmVjLmZpcnN0RXJyb3JRdWVzdGlvbi5mb2N1cyh0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlYy5yZXN1bHQ7XG4gIH1cbiAgcHJpdmF0ZSBoYXNFcnJvcnNJblBhbmVscyhyZWM6IGFueSkge1xuICAgIHZhciBlcnJvcnMgPSA8QXJyYXk8YW55Pj5bXTtcbiAgICB0aGlzLmhhc1JlcXVpcmVkRXJyb3IocmVjLCBlcnJvcnMpO1xuICAgIGlmICh0aGlzLnN1cnZleSkge1xuICAgICAgdmFyIGN1c3RvbUVycm9yID0gdGhpcy5zdXJ2ZXkudmFsaWRhdGVQYW5lbCh0aGlzKTtcbiAgICAgIGlmIChjdXN0b21FcnJvcikge1xuICAgICAgICBlcnJvcnMucHVzaChjdXN0b21FcnJvcik7XG4gICAgICAgIHJlYy5yZXN1bHQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoISFyZWMuZmlyZUNhbGxiYWNrKSB7XG4gICAgICBpZiAoISF0aGlzLnN1cnZleSkge1xuICAgICAgICB0aGlzLnN1cnZleS5iZWZvcmVTZXR0aW5nUGFuZWxFcnJvcnModGhpcywgZXJyb3JzKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzO1xuICAgIH1cbiAgfVxuICAvL0lTdXJ2ZXlFcnJvck93bmVyXG4gIGdldEVycm9yQ3VzdG9tVGV4dCh0ZXh0OiBzdHJpbmcsIGVycm9yOiBTdXJ2ZXlFcnJvcik6IHN0cmluZyB7XG4gICAgaWYgKCEhdGhpcy5zdXJ2ZXkpIHJldHVybiB0aGlzLnN1cnZleS5nZXRFcnJvckN1c3RvbVRleHQodGV4dCwgZXJyb3IpO1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNSZXF1aXJlZEVycm9yKHJlYzogYW55LCBlcnJvcnM6IEFycmF5PFN1cnZleUVycm9yPikge1xuICAgIGlmICghdGhpcy5pc1JlcXVpcmVkKSByZXR1cm47XG4gICAgdmFyIHZpc1F1ZXN0aW9ucyA9IDxBcnJheTxhbnk+PltdO1xuICAgIHRoaXMuYWRkUXVlc3Rpb25zVG9MaXN0KHZpc1F1ZXN0aW9ucywgdHJ1ZSk7XG4gICAgaWYgKHZpc1F1ZXN0aW9ucy5sZW5ndGggPT0gMCkgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmlzUXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXZpc1F1ZXN0aW9uc1tpXS5pc0VtcHR5KCkpIHJldHVybjtcbiAgICB9XG4gICAgcmVjLnJlc3VsdCA9IHRydWU7XG4gICAgZXJyb3JzLnB1c2gobmV3IE9uZUFuc3dlclJlcXVpcmVkRXJyb3IodGhpcy5yZXF1aXJlZEVycm9yVGV4dCwgdGhpcykpO1xuICAgIGlmIChyZWMuZm9jdXNlT25GaXJzdEVycm9yICYmICFyZWMuZmlyc3RFcnJvclF1ZXN0aW9uKSB7XG4gICAgICByZWMuZmlyc3RFcnJvclF1ZXN0aW9uID0gdmlzUXVlc3Rpb25zWzBdO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgaGFzRXJyb3JzQ29yZShyZWM6IGFueSkge1xuICAgIHZhciBlbGVtZW50cyA9IHRoaXMuZWxlbWVudHM7XG4gICAgdmFyIGVsZW1lbnQgPSBudWxsO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgZWxlbWVudCA9IGVsZW1lbnRzW2ldO1xuXG4gICAgICBpZiAoIWVsZW1lbnQuaXNWaXNpYmxlKSBjb250aW51ZTtcblxuICAgICAgaWYgKGVsZW1lbnQuaXNQYW5lbCkge1xuICAgICAgICAoPFBhbmVsTW9kZWxCYXNlPig8YW55PmVsZW1lbnQpKS5oYXNFcnJvcnNDb3JlKHJlYyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcXVlc3Rpb24gPSA8UXVlc3Rpb24+ZWxlbWVudDtcbiAgICAgICAgaWYgKHF1ZXN0aW9uLmlzUmVhZE9ubHkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAocXVlc3Rpb24uaGFzRXJyb3JzKHJlYy5maXJlQ2FsbGJhY2ssIHJlYykpIHtcbiAgICAgICAgICBpZiAocmVjLmZvY3VzZU9uRmlyc3RFcnJvciAmJiByZWMuZmlyc3RFcnJvclF1ZXN0aW9uID09IG51bGwpIHtcbiAgICAgICAgICAgIHJlYy5maXJzdEVycm9yUXVlc3Rpb24gPSBxdWVzdGlvbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVjLnJlc3VsdCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5oYXNFcnJvcnNJblBhbmVscyhyZWMpO1xuICAgIHRoaXMudXBkYXRlQ29udGFpbnNFcnJvcnMoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Q29udGFpbnNFcnJvcnMoKTogYm9vbGVhbiB7XG4gICAgdmFyIHJlcyA9IHN1cGVyLmdldENvbnRhaW5zRXJyb3JzKCk7XG4gICAgaWYgKHJlcykgcmV0dXJuIHJlcztcbiAgICB2YXIgZWxlbWVudHMgPSB0aGlzLmVsZW1lbnRzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChlbGVtZW50c1tpXS5jb250YWluc0Vycm9ycykgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB1cGRhdGVFbGVtZW50VmlzaWJpbGl0eSgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbCA9IHRoaXMuZWxlbWVudHNbaV07XG4gICAgICAoPEJhc2U+KDxhbnk+ZWwpKS5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNWaXNpYmxlXCIsIGVsLmlzVmlzaWJsZSk7XG4gICAgICBpZiAoZWwuaXNQYW5lbCkge1xuICAgICAgICAoPFBhbmVsTW9kZWxCYXNlPig8YW55PmVsKSkudXBkYXRlRWxlbWVudFZpc2liaWxpdHkoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZ2V0Rmlyc3RRdWVzdGlvblRvRm9jdXMod2l0aEVycm9yOiBib29sZWFuID0gZmFsc2UpOiBRdWVzdGlvbiB7XG4gICAgdmFyIGVsZW1lbnRzID0gdGhpcy5lbGVtZW50cztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWwgPSBlbGVtZW50c1tpXTtcbiAgICAgIGlmICghZWwuaXNWaXNpYmxlKSBjb250aW51ZTtcbiAgICAgIGlmIChlbC5pc1BhbmVsKSB7XG4gICAgICAgIHZhciByZXMgPSAoPFBhbmVsTW9kZWxCYXNlPig8YW55PmVsKSkuZ2V0Rmlyc3RRdWVzdGlvblRvRm9jdXMoXG4gICAgICAgICAgd2l0aEVycm9yXG4gICAgICAgICk7XG4gICAgICAgIGlmICghIXJlcykgcmV0dXJuIHJlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBxID0gPFF1ZXN0aW9uPmVsO1xuICAgICAgICBpZiAocS5oYXNJbnB1dCAmJiAoIXdpdGhFcnJvciB8fCBxLmN1cnJlbnRFcnJvckNvdW50ID4gMCkpIHJldHVybiBxO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogQ2FsbCBpdCB0byBmb2N1cyB0aGUgaW5wdXQgb24gdGhlIGZpcnN0IHF1ZXN0aW9uXG4gICAqL1xuICBwdWJsaWMgZm9jdXNGaXJzdFF1ZXN0aW9uKCkge1xuICAgIHZhciBxID0gdGhpcy5nZXRGaXJzdFF1ZXN0aW9uVG9Gb2N1cygpO1xuICAgIGlmICghIXEpIHtcbiAgICAgIHEuZm9jdXMoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgaXQgdG8gZm9jdXMgdGhlIGlucHV0IG9mIHRoZSBmaXJzdCBxdWVzdGlvbiB0aGF0IGhhcyBhbiBlcnJvci5cbiAgICovXG4gIHB1YmxpYyBmb2N1c0ZpcnN0RXJyb3JRdWVzdGlvbigpIHtcbiAgICB2YXIgcSA9IHRoaXMuZ2V0Rmlyc3RRdWVzdGlvblRvRm9jdXModHJ1ZSk7XG4gICAgaWYgKCEhcSkge1xuICAgICAgcS5mb2N1cygpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogRmlsbCBsaXN0IGFycmF5IHdpdGggdGhlIHF1ZXN0aW9ucy5cbiAgICogQHBhcmFtIGxpc3RcbiAgICogQHBhcmFtIHZpc2libGVPbmx5IHNldCBpdCB0byB0cnVlIHRvIGdldCB2aXNpYmxlIHF1ZXN0aW9ucyBvbmx5XG4gICAqL1xuICBwdWJsaWMgYWRkUXVlc3Rpb25zVG9MaXN0KFxuICAgIGxpc3Q6IEFycmF5PElRdWVzdGlvbj4sXG4gICAgdmlzaWJsZU9ubHk6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBpbmNsdWRpbmdEZXNpZ25UaW1lOiBib29sZWFuID0gZmFsc2VcbiAgKSB7XG4gICAgdGhpcy5hZGRFbGVtZW50c1RvTGlzdChsaXN0LCB2aXNpYmxlT25seSwgaW5jbHVkaW5nRGVzaWduVGltZSwgZmFsc2UpO1xuICB9XG4gIC8qKlxuICAgKiBGaWxsIGxpc3QgYXJyYXkgd2l0aCB0aGUgcGFuZWxzLlxuICAgKiBAcGFyYW0gbGlzdFxuICAgKi9cbiAgcHVibGljIGFkZFBhbmVsc0ludG9MaXN0KFxuICAgIGxpc3Q6IEFycmF5PElQYW5lbD4sXG4gICAgdmlzaWJsZU9ubHk6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBpbmNsdWRpbmdEZXNpZ25UaW1lOiBib29sZWFuID0gZmFsc2VcbiAgKSB7XG4gICAgdGhpcy5hZGRFbGVtZW50c1RvTGlzdChcbiAgICAgIDxBcnJheTxJRWxlbWVudD4+KDxBcnJheTxhbnk+Pmxpc3QpLFxuICAgICAgdmlzaWJsZU9ubHksXG4gICAgICBpbmNsdWRpbmdEZXNpZ25UaW1lLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBhZGRFbGVtZW50c1RvTGlzdChcbiAgICBsaXN0OiBBcnJheTxJRWxlbWVudD4sXG4gICAgdmlzaWJsZU9ubHk6IGJvb2xlYW4sXG4gICAgaW5jbHVkaW5nRGVzaWduVGltZTogYm9vbGVhbixcbiAgICBpc1BhbmVsOiBib29sZWFuXG4gICkge1xuICAgIGlmICh2aXNpYmxlT25seSAmJiAhdGhpcy52aXNpYmxlKSByZXR1cm47XG4gICAgdGhpcy5hZGRFbGVtZW50c1RvTGlzdENvcmUoXG4gICAgICBsaXN0LFxuICAgICAgdGhpcy5lbGVtZW50cyxcbiAgICAgIHZpc2libGVPbmx5LFxuICAgICAgaW5jbHVkaW5nRGVzaWduVGltZSxcbiAgICAgIGlzUGFuZWxcbiAgICApO1xuICB9XG4gIHByaXZhdGUgYWRkRWxlbWVudHNUb0xpc3RDb3JlKFxuICAgIGxpc3Q6IEFycmF5PElFbGVtZW50PixcbiAgICBlbGVtZW50czogQXJyYXk8SUVsZW1lbnQ+LFxuICAgIHZpc2libGVPbmx5OiBib29sZWFuLFxuICAgIGluY2x1ZGluZ0Rlc2lnblRpbWU6IGJvb2xlYW4sXG4gICAgaXNQYW5lbDogYm9vbGVhblxuICApIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWwgPSBlbGVtZW50c1tpXTtcbiAgICAgIGlmICh2aXNpYmxlT25seSAmJiAhZWwudmlzaWJsZSkgY29udGludWU7XG4gICAgICBpZiAoKGlzUGFuZWwgJiYgZWwuaXNQYW5lbCkgfHwgKCFpc1BhbmVsICYmICFlbC5pc1BhbmVsKSkge1xuICAgICAgICBsaXN0LnB1c2goZWwpO1xuICAgICAgfVxuICAgICAgaWYgKGVsLmlzUGFuZWwpIHtcbiAgICAgICAgKDxQYW5lbE1vZGVsPmVsKS5hZGRFbGVtZW50c1RvTGlzdENvcmUoXG4gICAgICAgICAgbGlzdCxcbiAgICAgICAgICAoPFBhbmVsTW9kZWw+ZWwpLmVsZW1lbnRzLFxuICAgICAgICAgIHZpc2libGVPbmx5LFxuICAgICAgICAgIGluY2x1ZGluZ0Rlc2lnblRpbWUsXG4gICAgICAgICAgaXNQYW5lbFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGluY2x1ZGluZ0Rlc2lnblRpbWUpIHtcbiAgICAgICAgICB0aGlzLmFkZEVsZW1lbnRzVG9MaXN0Q29yZShcbiAgICAgICAgICAgIGxpc3QsXG4gICAgICAgICAgICAoPFN1cnZleUVsZW1lbnQ+KDxhbnk+ZWwpKS5nZXRFbGVtZW50c0luRGVzaWduKGZhbHNlKSxcbiAgICAgICAgICAgIHZpc2libGVPbmx5LFxuICAgICAgICAgICAgaW5jbHVkaW5nRGVzaWduVGltZSxcbiAgICAgICAgICAgIGlzUGFuZWxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgb2JqZWN0IGlzIFBhZ2UgYW5kIGl0IGlzIHRoZSBjdXJyZW50IHBhZ2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5zdXJ2ZXkgfHwgPFBhZ2VNb2RlbD50aGlzLnN1cnZleS5jdXJyZW50UGFnZSA9PSB0aGlzLnJvb3Q7XG4gIH1cbiAgcHVibGljIHVwZGF0ZUN1c3RvbVdpZGdldHMoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmVsZW1lbnRzW2ldLnVwZGF0ZUN1c3RvbVdpZGdldHMoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IGRpZmZlcmVudCBmcm9tIFwiZGVmYXVsdFwiIHRvIHNldCB0aGUgc3BlY2lmaWMgcXVlc3Rpb24gdGl0bGUgbG9jYXRpb24gZm9yIHRoaXMgcGFuZWwvcGFnZS5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5xdWVzdGlvblRpdGxlTG9jYXRpb25cbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlc3Rpb25UaXRsZUxvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uVGl0bGVMb2NhdGlvblwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHF1ZXN0aW9uVGl0bGVMb2NhdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25UaXRsZUxvY2F0aW9uXCIsIHZhbHVlLnRvTG93ZXJDYXNlKCkpO1xuICB9XG4gIGdldFF1ZXN0aW9uVGl0bGVMb2NhdGlvbigpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLm9uR2V0UXVlc3Rpb25UaXRsZUxvY2F0aW9uKVxuICAgICAgcmV0dXJuIHRoaXMub25HZXRRdWVzdGlvblRpdGxlTG9jYXRpb24oKTtcbiAgICBpZiAodGhpcy5xdWVzdGlvblRpdGxlTG9jYXRpb24gIT0gXCJkZWZhdWx0XCIpXG4gICAgICByZXR1cm4gdGhpcy5xdWVzdGlvblRpdGxlTG9jYXRpb247XG4gICAgaWYgKHRoaXMucGFyZW50KSByZXR1cm4gdGhpcy5wYXJlbnQuZ2V0UXVlc3Rpb25UaXRsZUxvY2F0aW9uKCk7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5ID8gdGhpcy5zdXJ2ZXkucXVlc3Rpb25UaXRsZUxvY2F0aW9uIDogXCJ0b3BcIjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0U3RhcnRJbmRleCgpOiBzdHJpbmcge1xuICAgIGlmICghIXRoaXMucGFyZW50KSByZXR1cm4gdGhpcy5wYXJlbnQuZ2V0UXVlc3Rpb25TdGFydEluZGV4KCk7XG4gICAgaWYgKCEhdGhpcy5zdXJ2ZXkpIHJldHVybiB0aGlzLnN1cnZleS5xdWVzdGlvblN0YXJ0SW5kZXg7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbiAgZ2V0UXVlc3Rpb25TdGFydEluZGV4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RhcnRJbmRleCgpO1xuICB9XG4gIGdldENoaWxkcmVuTGF5b3V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInJvd1wiO1xuICB9XG4gIHB1YmxpYyBnZXRQcm9ncmVzc0luZm8oKTogSVByb2dyZXNzSW5mbyB7XG4gICAgcmV0dXJuIFN1cnZleUVsZW1lbnQuZ2V0UHJvZ3Jlc3NJbmZvQnlFbGVtZW50cyhcbiAgICAgIDxBcnJheTxTdXJ2ZXlFbGVtZW50Pj4oPGFueT50aGlzLmVsZW1lbnRzKSxcbiAgICAgIHRoaXMuaXNSZXF1aXJlZFxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCByb290KCk6IFBhbmVsTW9kZWxCYXNlIHtcbiAgICB2YXIgcmVzID0gPFBhbmVsTW9kZWxCYXNlPnRoaXM7XG4gICAgd2hpbGUgKHJlcy5wYXJlbnQpIHJlcyA9IHJlcy5wYXJlbnQ7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcm90ZWN0ZWQgY2hpbGRWaXNpYmlsaXR5Q2hhbmdlZCgpIHtcbiAgICB2YXIgbmV3SXNWaXNpYmxlVmFsdWUgPSB0aGlzLmdldElzUGFnZVZpc2libGUobnVsbCk7XG4gICAgdmFyIG9sZElzVmlzaWJsZVZhbHVlID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNWaXNpYmxlXCIsIHRydWUpO1xuICAgIGlmIChuZXdJc1Zpc2libGVWYWx1ZSAhPT0gb2xkSXNWaXNpYmxlVmFsdWUpIHtcbiAgICAgIHRoaXMub25WaXNpYmxlQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlUm93QW5kU2V0TGF6eShpbmRleDogbnVtYmVyKTogUXVlc3Rpb25Sb3dNb2RlbCB7XG4gICAgY29uc3Qgcm93ID0gdGhpcy5jcmVhdGVSb3coKTtcbiAgICByb3cuc2V0SXNMYXp5UmVuZGVyaW5nKHRoaXMuaXNMYXp5UmVuZGVySW5Sb3coaW5kZXgpKTtcbiAgICByZXR1cm4gcm93O1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVSb3coKTogUXVlc3Rpb25Sb3dNb2RlbCB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvblJvd01vZGVsKHRoaXMpO1xuICB9XG4gIHB1YmxpYyBvblN1cnZleUxvYWQoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmVsZW1lbnRzW2ldLm9uU3VydmV5TG9hZCgpO1xuICAgIH1cbiAgICB0aGlzLm9uRWxlbWVudFZpc2liaWxpdHlDaGFuZ2VkKHRoaXMpO1xuICB9XG4gIHB1YmxpYyBvbkZpcnN0UmVuZGVyaW5nKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5lbGVtZW50c1tpXS5vbkZpcnN0UmVuZGVyaW5nKCk7XG4gICAgfVxuICAgIHRoaXMub25Sb3dzQ2hhbmdlZCgpO1xuICB9XG4gIGdldCByb3dzKCk6IEFycmF5PFF1ZXN0aW9uUm93TW9kZWw+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicm93c1wiKTtcbiAgfVxuXG4gIHB1YmxpYyBlbnN1cmVSb3dzVmlzaWJpbGl0eSgpIHtcbiAgICB0aGlzLnJvd3MuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICByb3cuZW5zdXJlVmlzaWJpbGl0eSgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uUm93c0NoYW5nZWQoKSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyb3dzXCIsIHRoaXMuYnVpbGRSb3dzKCkpO1xuICB9XG4gIHByb3RlY3RlZCBvbkFkZEVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQsIGluZGV4OiBudW1iZXIpIHtcbiAgICBlbGVtZW50LnNldFN1cnZleUltcGwodGhpcy5zdXJ2ZXlJbXBsKTtcbiAgICBlbGVtZW50LnBhcmVudCA9IHRoaXM7XG4gICAgdGhpcy5tYXJrUXVlc3Rpb25MaXN0RGlydHkoKTtcbiAgICB0aGlzLnVwZGF0ZVJvd3NPbkVsZW1lbnRBZGRlZChlbGVtZW50LCBpbmRleCk7XG4gICAgaWYgKGVsZW1lbnQuaXNQYW5lbCkge1xuICAgICAgdmFyIHAgPSA8UGFuZWxNb2RlbD5lbGVtZW50O1xuICAgICAgaWYgKHRoaXMuc3VydmV5KSB7XG4gICAgICAgIHRoaXMuc3VydmV5LnBhbmVsQWRkZWQocCwgaW5kZXgsIHRoaXMsIHRoaXMucm9vdCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnN1cnZleSkge1xuICAgICAgICB2YXIgcSA9IDxRdWVzdGlvbj5lbGVtZW50O1xuICAgICAgICB0aGlzLnN1cnZleS5xdWVzdGlvbkFkZGVkKHEsIGluZGV4LCB0aGlzLCB0aGlzLnJvb3QpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoISF0aGlzLmFkZEVsZW1lbnRDYWxsYmFjaykgdGhpcy5hZGRFbGVtZW50Q2FsbGJhY2soZWxlbWVudCk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICg8QmFzZT4oPGFueT5lbGVtZW50KSkucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydGllc1ZhbHVlQ2hhbmdlZChcbiAgICAgIFtcInZpc2libGVcIiwgXCJpc1Zpc2libGVcIl0sXG4gICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYub25FbGVtZW50VmlzaWJpbGl0eUNoYW5nZWQoZWxlbWVudCk7XG4gICAgICB9LFxuICAgICAgdGhpcy5pZFxuICAgICk7XG4gICAgKDxCYXNlPig8YW55PmVsZW1lbnQpKS5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcbiAgICAgIFwic3RhcnRXaXRoTmV3TGluZVwiLFxuICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLm9uRWxlbWVudFN0YXJ0V2l0aE5ld0xpbmVDaGFuZ2VkKGVsZW1lbnQpO1xuICAgICAgfSxcbiAgICAgIHRoaXMuaWRcbiAgICApO1xuICAgIHRoaXMub25FbGVtZW50VmlzaWJpbGl0eUNoYW5nZWQodGhpcyk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uUmVtb3ZlRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCkge1xuICAgIGVsZW1lbnQucGFyZW50ID0gbnVsbDtcbiAgICB0aGlzLm1hcmtRdWVzdGlvbkxpc3REaXJ0eSgpO1xuICAgICg8QmFzZT4oPGFueT5lbGVtZW50KSkudW5SZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0aWVzVmFsdWVDaGFuZ2VkKFxuICAgICAgW1widmlzaWJsZVwiLCBcImlzVmlzaWJsZVwiLCBcInN0YXJ0V2l0aE5ld0xpbmVcIl0sXG4gICAgICB0aGlzLmlkXG4gICAgKTtcbiAgICB0aGlzLnVwZGF0ZVJvd3NPbkVsZW1lbnRSZW1vdmVkKGVsZW1lbnQpO1xuICAgIGlmICh0aGlzLmlzUmFuZG9taXppbmcpIHJldHVybjtcbiAgICBpZiAoIWVsZW1lbnQuaXNQYW5lbCkge1xuICAgICAgaWYgKHRoaXMuc3VydmV5KSB0aGlzLnN1cnZleS5xdWVzdGlvblJlbW92ZWQoPFF1ZXN0aW9uPmVsZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5zdXJ2ZXkpIHRoaXMuc3VydmV5LnBhbmVsUmVtb3ZlZChlbGVtZW50KTtcbiAgICB9XG4gICAgaWYgKCEhdGhpcy5yZW1vdmVFbGVtZW50Q2FsbGJhY2spIHRoaXMucmVtb3ZlRWxlbWVudENhbGxiYWNrKGVsZW1lbnQpO1xuICAgIHRoaXMub25FbGVtZW50VmlzaWJpbGl0eUNoYW5nZWQodGhpcyk7XG4gIH1cbiAgcHJpdmF0ZSBvbkVsZW1lbnRWaXNpYmlsaXR5Q2hhbmdlZChlbGVtZW50OiBhbnkpIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbiB8fCB0aGlzLmlzUmFuZG9taXppbmcpIHJldHVybjtcbiAgICB0aGlzLnVwZGF0ZVJvd3NWaXNpYmlsaXR5KGVsZW1lbnQpO1xuICAgIHRoaXMuY2hpbGRWaXNpYmlsaXR5Q2hhbmdlZCgpO1xuICAgIGlmICghIXRoaXMucGFyZW50KSB7XG4gICAgICB0aGlzLnBhcmVudC5vbkVsZW1lbnRWaXNpYmlsaXR5Q2hhbmdlZCh0aGlzKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBvbkVsZW1lbnRTdGFydFdpdGhOZXdMaW5lQ2hhbmdlZChlbGVtZW50OiBhbnkpIHtcbiAgICB0aGlzLm9uUm93c0NoYW5nZWQoKTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZVJvd3NWaXNpYmlsaXR5KGVsZW1lbnQ6IGFueSkge1xuICAgIHZhciByb3dzID0gdGhpcy5yb3dzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHJvdyA9IHJvd3NbaV07XG4gICAgICBpZiAocm93LmVsZW1lbnRzLmluZGV4T2YoZWxlbWVudCkgPiAtMSkge1xuICAgICAgICByb3cudXBkYXRlVmlzaWJsZSgpO1xuICAgICAgICBpZiAocm93LnZpc2libGUgJiYgIXJvdy5pc05lZWRSZW5kZXIpIHtcbiAgICAgICAgICByb3cuaXNOZWVkUmVuZGVyID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBjYW5CdWlsZFJvd3MoKSB7XG4gICAgcmV0dXJuICF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uICYmIHRoaXMuZ2V0Q2hpbGRyZW5MYXlvdXRUeXBlKCkgPT0gXCJyb3dcIjtcbiAgfVxuICBwcml2YXRlIGJ1aWxkUm93cygpOiBBcnJheTxRdWVzdGlvblJvd01vZGVsPiB7XG4gICAgaWYgKCF0aGlzLmNhbkJ1aWxkUm93cygpKSByZXR1cm4gW107XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxRdWVzdGlvblJvd01vZGVsPigpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsID0gdGhpcy5lbGVtZW50c1tpXTtcbiAgICAgIHZhciBpc05ld1JvdyA9IGkgPT0gMCB8fCBlbC5zdGFydFdpdGhOZXdMaW5lO1xuICAgICAgdmFyIHJvdyA9IGlzTmV3Um93ID8gdGhpcy5jcmVhdGVSb3dBbmRTZXRMYXp5KHJlc3VsdC5sZW5ndGgpIDogcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChpc05ld1JvdykgcmVzdWx0LnB1c2gocm93KTtcbiAgICAgIHJvdy5hZGRFbGVtZW50KGVsKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3VsdFtpXS51cGRhdGVWaXNpYmxlKCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHJpdmF0ZSBpc0xhenlSZW5kZXJJblJvdyhyb3dJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSB8fCAhdGhpcy5zdXJ2ZXkuaXNMYXp5UmVuZGVyaW5nKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIChcbiAgICAgIHJvd0luZGV4ID49IHNldHRpbmdzLmxhenlSb3dzUmVuZGVyaW5nU3RhcnRSb3cgfHxcbiAgICAgICF0aGlzLmNhblJlbmRlckZpcnN0Um93cygpXG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgY2FuUmVuZGVyRmlyc3RSb3dzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzUGFnZTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZVJvd3NPbkVsZW1lbnRBZGRlZChlbGVtZW50OiBJRWxlbWVudCwgaW5kZXg6IG51bWJlcikge1xuICAgIGlmICghdGhpcy5jYW5CdWlsZFJvd3MoKSkgcmV0dXJuO1xuICAgIHZhciBkcmFnRHJvcEluZm8gPSBuZXcgRHJhZ0Ryb3BJbmZvKG51bGwsIGVsZW1lbnQpO1xuICAgIGRyYWdEcm9wSW5mby50YXJnZXQgPSBlbGVtZW50O1xuICAgIGRyYWdEcm9wSW5mby5pc0VkZ2UgPSB0aGlzLmVsZW1lbnRzLmxlbmd0aCA+IDE7XG4gICAgaWYgKHRoaXMuZWxlbWVudHMubGVuZ3RoIDwgMikge1xuICAgICAgZHJhZ0Ryb3BJbmZvLmRlc3RpbmF0aW9uID0gdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgZHJhZ0Ryb3BJbmZvLmlzQm90dG9tID0gaW5kZXggPiAwO1xuICAgICAgaWYgKGluZGV4ID09IDApIHtcbiAgICAgICAgZHJhZ0Ryb3BJbmZvLmRlc3RpbmF0aW9uID0gdGhpcy5lbGVtZW50c1sxXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRyYWdEcm9wSW5mby5kZXN0aW5hdGlvbiA9IHRoaXMuZWxlbWVudHNbaW5kZXggLSAxXTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5kcmFnRHJvcEFkZFRhcmdldFRvUm93KGRyYWdEcm9wSW5mbywgbnVsbCk7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVSb3dzT25FbGVtZW50UmVtb3ZlZChlbGVtZW50OiBJRWxlbWVudCkge1xuICAgIGlmICghdGhpcy5jYW5CdWlsZFJvd3MoKSkgcmV0dXJuO1xuICAgIHRoaXMudXBkYXRlUm93c1JlbW92ZUVsZW1lbnRGcm9tUm93KFxuICAgICAgZWxlbWVudCxcbiAgICAgIHRoaXMuZmluZFJvd0J5RWxlbWVudChlbGVtZW50KVxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZVJvd3NSZW1vdmVFbGVtZW50RnJvbVJvdyhcbiAgICBlbGVtZW50OiBJRWxlbWVudCxcbiAgICByb3c6IFF1ZXN0aW9uUm93TW9kZWxcbiAgKSB7XG4gICAgaWYgKCFyb3cgfHwgIXJvdy5wYW5lbCkgcmV0dXJuO1xuICAgIHZhciBlbEluZGV4ID0gcm93LmVsZW1lbnRzLmluZGV4T2YoZWxlbWVudCk7XG4gICAgaWYgKGVsSW5kZXggPCAwKSByZXR1cm47XG4gICAgcm93LmVsZW1lbnRzLnNwbGljZShlbEluZGV4LCAxKTtcbiAgICBpZiAocm93LmVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJvdy51cGRhdGVWaXNpYmxlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyb3cuaW5kZXggPj0gMCkge1xuICAgICAgICByb3cucGFuZWwucm93cy5zcGxpY2Uocm93LmluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBmaW5kUm93QnlFbGVtZW50KGVsOiBJRWxlbWVudCk6IFF1ZXN0aW9uUm93TW9kZWwge1xuICAgIHZhciByb3dzID0gdGhpcy5yb3dzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHJvd3NbaV0uZWxlbWVudHMuaW5kZXhPZihlbCkgPiAtMSkgcmV0dXJuIHJvd3NbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGVsZW1lbnRXaWR0aENoYW5nZWQoZWw6IElFbGVtZW50KSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB2YXIgcm93ID0gdGhpcy5maW5kUm93QnlFbGVtZW50KGVsKTtcbiAgICBpZiAoISFyb3cpIHtcbiAgICAgIHJvdy51cGRhdGVWaXNpYmxlKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHJlbmRlcmVkIHRpdGxlIHRleHQgb3IgaHRtbC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcHJvY2Vzc2VkVGl0bGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UmVuZGVyZWRUaXRsZSh0aGlzLmxvY1RpdGxlLnRleHRPckh0bWwpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRSZW5kZXJlZFRpdGxlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50ZXh0UHJvY2Vzc29yICE9IG51bGxcbiAgICAgID8gdGhpcy50ZXh0UHJvY2Vzc29yLnByb2Nlc3NUZXh0KHN0ciwgdHJ1ZSlcbiAgICAgIDogc3RyO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgaXQgdG8gZ2V0L3NldCB0aGUgb2JqZWN0IHZpc2liaWxpdHkuXG4gICAqIEBzZWUgdmlzaWJsZUlmXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCB2aXNpYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbHVlID09PSB0aGlzLnZpc2libGUpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlXCIsIHZhbHVlKTtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1Zpc2libGVcIiwgdGhpcy5pc1Zpc2libGUpO1xuICAgIGlmICghdGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgdGhpcy5vblZpc2libGVDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uVmlzaWJsZUNoYW5nZWQoKSB7XG4gICAgaWYgKHRoaXMuaXNSYW5kb21pemluZykgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzVmlzaWJsZVwiLCB0aGlzLmlzVmlzaWJsZSk7XG4gICAgaWYgKFxuICAgICAgISF0aGlzLnN1cnZleSAmJlxuICAgICAgdGhpcy5zdXJ2ZXkuaXNDbGVhclZhbHVlT25IaWRkZW5Db250YWluZXIgJiZcbiAgICAgICF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uXG4gICAgKSB7XG4gICAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5xdWVzdGlvbnM7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIXRoaXMuaXNWaXNpYmxlKSB7XG4gICAgICAgICAgcXVlc3Rpb25zW2ldLmNsZWFyVmFsdWUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBxdWVzdGlvbnNbaV0udXBkYXRlVmFsdWVXaXRoRGVmYXVsdHMoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIG9iamVjdCBpcyB2aXNpYmxlIG9yIHN1cnZleSBpcyBpbiBkZXNpZ24gbW9kZSByaWdodCBub3cuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hcmVJbnZpc2libGVFbGVtZW50c1Nob3dpbmcgfHwgdGhpcy5nZXRJc1BhZ2VWaXNpYmxlKG51bGwpO1xuICB9XG4gIGdldElzUGFnZVZpc2libGUoZXhjZXB0aW9uUXVlc3Rpb246IElRdWVzdGlvbik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy52aXNpYmxlKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5lbGVtZW50c1tpXSA9PSBleGNlcHRpb25RdWVzdGlvbikgY29udGludWU7XG4gICAgICBpZiAodGhpcy5lbGVtZW50c1tpXS5pc1Zpc2libGUpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJpdmF0ZSBsYXN0VmlzaWJsZUluZGV4OiBudW1iZXI7XG4gIHB1YmxpYyBzZXRWaXNpYmxlSW5kZXgoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLmlzVmlzaWJsZSB8fCBpbmRleCA8IDApIHtcbiAgICAgIHRoaXMucmVzZXRWaXNpYmxlSW5kZXhlcygpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHRoaXMubGFzdFZpc2libGVJbmRleCA9IGluZGV4O1xuICAgIHZhciBzdGFydEluZGV4ID0gaW5kZXg7XG4gICAgaW5kZXggKz0gdGhpcy5iZWZvcmVTZXRWaXNpYmxlSW5kZXgoaW5kZXgpO1xuICAgIHZhciBwYW5lbFN0YXJ0SW5kZXggPSB0aGlzLmdldFBhbmVsU3RhcnRJbmRleChpbmRleCk7XG4gICAgdmFyIHBhbmVsSW5kZXggPSBwYW5lbFN0YXJ0SW5kZXg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBwYW5lbEluZGV4ICs9IHRoaXMuZWxlbWVudHNbaV0uc2V0VmlzaWJsZUluZGV4KHBhbmVsSW5kZXgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0NvbnRpbnVlTnVtYmVyaW5nKCkpIHtcbiAgICAgIGluZGV4ICs9IHBhbmVsSW5kZXggLSBwYW5lbFN0YXJ0SW5kZXg7XG4gICAgfVxuICAgIHJldHVybiBpbmRleCAtIHN0YXJ0SW5kZXg7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVWaXNpYmxlSW5kZXhlcygpIHtcbiAgICBpZiAodGhpcy5sYXN0VmlzaWJsZUluZGV4ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICB0aGlzLnJlc2V0VmlzaWJsZUluZGV4ZXMoKTtcbiAgICB0aGlzLnNldFZpc2libGVJbmRleCh0aGlzLmxhc3RWaXNpYmxlSW5kZXgpO1xuICB9XG4gIHByaXZhdGUgcmVzZXRWaXNpYmxlSW5kZXhlcygpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuZWxlbWVudHNbaV0uc2V0VmlzaWJsZUluZGV4KC0xKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGJlZm9yZVNldFZpc2libGVJbmRleChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0UGFuZWxTdGFydEluZGV4KGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuICBwcm90ZWN0ZWQgaXNDb250aW51ZU51bWJlcmluZygpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHJlYWRPbmx5IHByb3BlcnR5IGlzIHRydWUgb3Igc3VydmV5IGlzIGluIGRpc3BsYXkgbW9kZSBvciBwYXJlbnQgcGFuZWwvcGFnZSBpcyByZWFkT25seS5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5tb2RlbFxuICAgKiBAc2VlIHJlYWRPbmx5XG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzUmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgdmFyIGlzUGFyZW50UmVhZE9ubHkgPSAhIXRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LmlzUmVhZE9ubHk7XG4gICAgdmFyIGlzU3VydmV5UmVhZE9ubHkgPSAhIXRoaXMuc3VydmV5ICYmIHRoaXMuc3VydmV5LmlzRGlzcGxheU1vZGU7XG4gICAgcmV0dXJuIHRoaXMucmVhZE9ubHkgfHwgaXNQYXJlbnRSZWFkT25seSB8fCBpc1N1cnZleVJlYWRPbmx5O1xuICB9XG4gIHByb3RlY3RlZCBvblJlYWRPbmx5Q2hhbmdlZCgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbCA9IDxTdXJ2ZXlFbGVtZW50Pig8YW55PnRoaXMuZWxlbWVudHNbaV0pO1xuICAgICAgZWwuc2V0UHJvcGVydHlWYWx1ZShcImlzUmVhZE9ubHlcIiwgZWwuaXNSZWFkT25seSk7XG4gICAgfVxuICAgIHN1cGVyLm9uUmVhZE9ubHlDaGFuZ2VkKCk7XG4gIH1cbiAgcHVibGljIHVwZGF0ZUVsZW1lbnRDc3MocmVOZXc/OiBib29sZWFuKSB7XG4gICAgc3VwZXIudXBkYXRlRWxlbWVudENzcyhyZU5ldyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlbCA9IDxTdXJ2ZXlFbGVtZW50Pig8YW55PnRoaXMuZWxlbWVudHNbaV0pO1xuICAgICAgZWwudXBkYXRlRWxlbWVudENzcyhyZU5ldyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFuIGV4cHJlc3Npb24gdGhhdCByZXR1cm5zIHRydWUgb3IgZmFsc2UuIElmIGl0IHJldHVybnMgZmFsc2UgdGhlIFBhbmVsL1BhZ2UgYmVjb21lcyByZWFkIG9ubHkgYW5kIGFuIGVuZC11c2VyIHdpbGwgbm90IGFibGUgdG8gYW5zd2VyIG9uIHF1c3Rpb25zIGluc2lkZSBpdC5cbiAgICogVGhlIGxpYnJhcnkgcnVucyB0aGUgZXhwcmVzc2lvbiBvbiBzdXJ2ZXkgc3RhcnQgYW5kIG9uIGNoYW5naW5nIGEgcXVlc3Rpb24gdmFsdWUuIElmIHRoZSBwcm9wZXJ0eSBpcyBlbXB0eSB0aGVuIHJlYWRPbmx5IHByb3BlcnR5IGlzIHVzZWQuXG4gICAqIEBzZWUgcmVhZE9ubHlcbiAgICogQHNlZSBpc1JlYWRPbmx5XG4gICAqL1xuICBwdWJsaWMgZ2V0IGVuYWJsZUlmKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImVuYWJsZUlmXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZW5hYmxlSWYodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJlbmFibGVJZlwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBBZGQgYW4gZWxlbWVudCBpbnRvIFBhbmVsIG9yIFBhZ2UuIFJldHVybnMgdHJ1ZSBpZiB0aGUgZWxlbWVudCBhZGRlZCBzdWNjZXNzZnVsbHkuIE90aGVyd2lzZSByZXR1cm5zIGZhbHNlLlxuICAgKiBAcGFyYW0gZWxlbWVudFxuICAgKiBAcGFyYW0gaW5kZXggZWxlbWVudCBpbmRleCBpbiB0aGUgZWxlbWVudHMgYXJyYXlcbiAgICovXG4gIHB1YmxpYyBhZGRFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50LCBpbmRleDogbnVtYmVyID0gLTEpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuY2FuQWRkRWxlbWVudChlbGVtZW50KSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5lbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZWxlbWVudHMucHVzaChlbGVtZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbGVtZW50cy5zcGxpY2UoaW5kZXgsIDAsIGVsZW1lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBpbnNlcnRFbGVtZW50QWZ0ZXIoZWxlbWVudDogSUVsZW1lbnQsIGFmdGVyOiBJRWxlbWVudCkge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5lbGVtZW50cy5pbmRleE9mKGFmdGVyKTtcbiAgICBpZiAoaW5kZXggPj0gMCkgdGhpcy5hZGRFbGVtZW50KGVsZW1lbnQsIGluZGV4ICsgMSk7XG4gIH1cbiAgcHVibGljIGluc2VydEVsZW1lbnRCZWZvcmUoZWxlbWVudDogSUVsZW1lbnQsIGJlZm9yZTogSUVsZW1lbnQpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZWxlbWVudHMuaW5kZXhPZihiZWZvcmUpO1xuICAgIGlmIChpbmRleCA+PSAwKSB0aGlzLmFkZEVsZW1lbnQoZWxlbWVudCwgaW5kZXgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNhbkFkZEVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFlbGVtZW50ICYmIGVsZW1lbnQuaXNMYXlvdXRUeXBlU3VwcG9ydGVkKHRoaXMuZ2V0Q2hpbGRyZW5MYXlvdXRUeXBlKCkpXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogQWRkIGEgcXVlc3Rpb24gaW50byBQYW5lbCBvciBQYWdlLiBSZXR1cm5zIHRydWUgaWYgdGhlIHF1ZXN0aW9uIGFkZGVkIHN1Y2Nlc3NmdWxseS4gT3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuXG4gICAqIEBwYXJhbSBxdWVzdGlvblxuICAgKiBAcGFyYW0gaW5kZXggZWxlbWVudCBpbmRleCBpbiB0aGUgZWxlbWVudHMgYXJyYXlcbiAgICovXG4gIHB1YmxpYyBhZGRRdWVzdGlvbihxdWVzdGlvbjogUXVlc3Rpb24sIGluZGV4OiBudW1iZXIgPSAtMSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFkZEVsZW1lbnQocXVlc3Rpb24sIGluZGV4KTtcbiAgfVxuICAvKipcbiAgICogQWRkIGEgcGFuZWwgaW50byBQYW5lbCBvciBQYWdlLiAgUmV0dXJucyB0cnVlIGlmIHRoZSBwYW5lbCBhZGRlZCBzdWNjZXNzZnVsbHkuIE90aGVyd2lzZSByZXR1cm5zIGZhbHNlLlxuICAgKiBAcGFyYW0gcGFuZWxcbiAgICogQHBhcmFtIGluZGV4IGVsZW1lbnQgaW5kZXggaW4gdGhlIGVsZW1lbnRzIGFycmF5XG4gICAqL1xuICBwdWJsaWMgYWRkUGFuZWwocGFuZWw6IFBhbmVsTW9kZWwsIGluZGV4OiBudW1iZXIgPSAtMSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFkZEVsZW1lbnQocGFuZWwsIGluZGV4KTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBxdWVzdGlvbiBhbmQgYWRkcyBpdCBhdCBsb2NhdGlvbiBvZiBpbmRleCwgYnkgZGVmYXVsdCB0aGUgZW5kIG9mIHRoZSBlbGVtZW50cyBsaXN0LiBSZXR1cm5zIG51bGwsIGlmIHRoZSBxdWVzdGlvbiBjb3VsZCBub3QgYmUgY3JlYXRlZCBvciBjb3VsZCBub3QgYmUgYWRkZWQgaW50byBwYWdlIG9yIHBhbmVsLlxuICAgKiBAcGFyYW0gcXVlc3Rpb25UeXBlIHRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOiBcInRleHRcIiwgXCJjaGVja2JveFwiLCBcImRyb3Bkb3duXCIsIFwibWF0cml4XCIsIFwiaHRtbFwiLCBcIm1hdHJpeGR5bmFtaWNcIiwgXCJtYXRyaXhkcm9wZG93blwiIGFuZCBzbyBvbi5cbiAgICogQHBhcmFtIG5hbWUgYSBxdWVzdGlvbiBuYW1lXG4gICAqIEBwYXJhbSBpbmRleCBlbGVtZW50IGluZGV4IGluIHRoZSBlbGVtZW50cyBhcnJheVxuICAgKi9cbiAgcHVibGljIGFkZE5ld1F1ZXN0aW9uKFxuICAgIHF1ZXN0aW9uVHlwZTogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyA9IG51bGwsXG4gICAgaW5kZXg6IG51bWJlciA9IC0xXG4gICk6IFF1ZXN0aW9uIHtcbiAgICB2YXIgcXVlc3Rpb24gPSBRdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UuY3JlYXRlUXVlc3Rpb24ocXVlc3Rpb25UeXBlLCBuYW1lKTtcbiAgICBpZiAoIXRoaXMuYWRkUXVlc3Rpb24ocXVlc3Rpb24sIGluZGV4KSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHF1ZXN0aW9uO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHBhbmVsIGFuZCBhZGRzIGl0IGludG8gdGhlIGVuZCBvZiB0aGUgZWxlbWVudHMgbGlzdC4gUmV0dXJucyBudWxsLCBpZiB0aGUgcGFuZWwgY291bGQgbm90IGJlIGNyZWF0ZWQgb3IgY291bGQgbm90IGJlIGFkZGVkIGludG8gcGFnZSBvciBwYW5lbC5cbiAgICogQHBhcmFtIG5hbWUgYSBwYW5lbCBuYW1lXG4gICAqL1xuICBwdWJsaWMgYWRkTmV3UGFuZWwobmFtZTogc3RyaW5nID0gbnVsbCk6IFBhbmVsTW9kZWwge1xuICAgIHZhciBwYW5lbCA9IHRoaXMuY3JlYXRlTmV3UGFuZWwobmFtZSk7XG4gICAgaWYgKCF0aGlzLmFkZFBhbmVsKHBhbmVsKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHBhbmVsO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiBlbGVtZW50IHBhcmFtZXRlciBpbiB0aGUgZWxlbWVudHMgbGlzdC5cbiAgICogQHBhcmFtIGVsZW1lbnQgcXVlc3Rpb24gb3IgcGFuZWxcbiAgICovXG4gIHB1YmxpYyBpbmRleE9mKGVsZW1lbnQ6IElFbGVtZW50KTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50cy5pbmRleE9mKGVsZW1lbnQpO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVOZXdQYW5lbChuYW1lOiBzdHJpbmcpOiBQYW5lbE1vZGVsIHtcbiAgICB2YXIgcmVzID0gU2VyaWFsaXplci5jcmVhdGVDbGFzcyhcInBhbmVsXCIpO1xuICAgIHJlcy5uYW1lID0gbmFtZTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gZWxlbWVudCAoUGFuZWwgb3IgUXVlc3Rpb24pIGZyb20gdGhlIGVsZW1lbnRzIGxpc3QuXG4gICAqIEBwYXJhbSBlbGVtZW50XG4gICAqIEBzZWUgZWxlbWVudHNcbiAgICovXG4gIHB1YmxpYyByZW1vdmVFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5lbGVtZW50cy5pbmRleE9mKGVsZW1lbnQpO1xuICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50c1tpXS5yZW1vdmVFbGVtZW50KGVsZW1lbnQpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5lbGVtZW50cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBSZW1vdmUgcXVlc3Rpb24gIGZyb20gdGhlIGVsZW1lbnRzIGxpc3QuXG4gICAqIEBwYXJhbSBxdWVzdGlvblxuICAgKiBAc2VlIGVsZW1lbnRzXG4gICAqIEBzZWUgcmVtb3ZlRWxlbWVudFxuICAgKi9cbiAgcHVibGljIHJlbW92ZVF1ZXN0aW9uKHF1ZXN0aW9uOiBRdWVzdGlvbikge1xuICAgIHRoaXMucmVtb3ZlRWxlbWVudChxdWVzdGlvbik7XG4gIH1cbiAgcnVuQ29uZGl0aW9uKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlIHx8IHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB2YXIgZWxlbWVudHMgPSB0aGlzLmVsZW1lbnRzLnNsaWNlKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgZWxlbWVudHNbaV0ucnVuQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5hcmVJbnZpc2libGVFbGVtZW50c1Nob3dpbmcpIHtcbiAgICAgIHRoaXMucnVuVmlzaWJsZUNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIH1cbiAgICB0aGlzLnJ1bkVuYWJsZUNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIHRoaXMucnVuUmVxdWlyZWRDb25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICBwcml2YXRlIHJ1blZpc2libGVDb25kaXRpb24oXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApIHtcbiAgICBpZiAoIXRoaXMudmlzaWJsZUlmKSByZXR1cm47XG4gICAgdmFyIGNvbmRpdGlvblJ1bm5lciA9IG5ldyBDb25kaXRpb25SdW5uZXIodGhpcy52aXNpYmxlSWYpO1xuICAgIGNvbmRpdGlvblJ1bm5lci5vblJ1bkNvbXBsZXRlID0gKHJlczogYm9vbGVhbikgPT4ge1xuICAgICAgdGhpcy52aXNpYmxlID0gcmVzO1xuICAgIH07XG4gICAgY29uZGl0aW9uUnVubmVyLnJ1bih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIHByaXZhdGUgcnVuRW5hYmxlQ29uZGl0aW9uKFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT5cbiAgKSB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZUlmKSByZXR1cm47XG4gICAgdmFyIGNvbmRpdGlvblJ1bm5lciA9IG5ldyBDb25kaXRpb25SdW5uZXIodGhpcy5lbmFibGVJZik7XG4gICAgY29uZGl0aW9uUnVubmVyLm9uUnVuQ29tcGxldGUgPSAocmVzOiBib29sZWFuKSA9PiB7XG4gICAgICB0aGlzLnJlYWRPbmx5ID0gIXJlcztcbiAgICB9O1xuICAgIGNvbmRpdGlvblJ1bm5lci5ydW4odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICBwcml2YXRlIHJ1blJlcXVpcmVkQ29uZGl0aW9uKFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT5cbiAgKSB7XG4gICAgaWYgKCF0aGlzLnJlcXVpcmVkSWYpIHJldHVybjtcbiAgICB2YXIgY29uZGl0aW9uUnVubmVyID0gbmV3IENvbmRpdGlvblJ1bm5lcih0aGlzLnJlcXVpcmVkSWYpO1xuICAgIGNvbmRpdGlvblJ1bm5lci5vblJ1bkNvbXBsZXRlID0gKHJlczogYm9vbGVhbikgPT4ge1xuICAgICAgdGhpcy5pc1JlcXVpcmVkID0gcmVzO1xuICAgIH07XG4gICAgY29uZGl0aW9uUnVubmVyLnJ1bih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIG9uQW55VmFsdWVDaGFuZ2VkKG5hbWU6IHN0cmluZykge1xuICAgIHZhciBlbHMgPSB0aGlzLmVsZW1lbnRzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBlbHNbaV0ub25BbnlWYWx1ZUNoYW5nZWQobmFtZSk7XG4gICAgfVxuICB9XG4gIGNoZWNrQmluZGluZ3ModmFsdWVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICB2YXIgZWxzID0gdGhpcy5lbGVtZW50cztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVscy5sZW5ndGg7IGkrKykge1xuICAgICAgKDxCYXNlPig8YW55PmVsc1tpXSkpLmNoZWNrQmluZGluZ3ModmFsdWVOYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBkcmFnRHJvcEFkZFRhcmdldChkcmFnRHJvcEluZm86IERyYWdEcm9wSW5mbykge1xuICAgIHZhciBwcmV2Um93ID0gdGhpcy5kcmFnRHJvcEZpbmRSb3coZHJhZ0Ryb3BJbmZvLnRhcmdldCk7XG4gICAgaWYgKHRoaXMuZHJhZ0Ryb3BBZGRUYXJnZXRUb1JvdyhkcmFnRHJvcEluZm8sIHByZXZSb3cpKSB7XG4gICAgICB0aGlzLnVwZGF0ZVJvd3NSZW1vdmVFbGVtZW50RnJvbVJvdyhkcmFnRHJvcEluZm8udGFyZ2V0LCBwcmV2Um93KTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGRyYWdEcm9wRmluZFJvdyhmaW5kRWxlbWVudDogSVN1cnZleUVsZW1lbnQpOiBRdWVzdGlvblJvd01vZGVsIHtcbiAgICBpZiAoIWZpbmRFbGVtZW50IHx8IGZpbmRFbGVtZW50LmlzUGFnZSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIGVsZW1lbnQgPSA8SUVsZW1lbnQ+ZmluZEVsZW1lbnQ7XG4gICAgdmFyIHJvd3MgPSB0aGlzLnJvd3M7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocm93c1tpXS5lbGVtZW50cy5pbmRleE9mKGVsZW1lbnQpID4gLTEpIHJldHVybiByb3dzW2ldO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwbmwgPSB0aGlzLmVsZW1lbnRzW2ldLmdldFBhbmVsKCk7XG4gICAgICBpZiAoIXBubCkgY29udGludWU7XG4gICAgICB2YXIgcm93ID0gKDxQYW5lbE1vZGVsQmFzZT5wbmwpLmRyYWdEcm9wRmluZFJvdyhlbGVtZW50KTtcbiAgICAgIGlmICghIXJvdykgcmV0dXJuIHJvdztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHJpdmF0ZSBkcmFnRHJvcEFkZFRhcmdldFRvUm93KFxuICAgIGRyYWdEcm9wSW5mbzogRHJhZ0Ryb3BJbmZvLFxuICAgIHByZXZSb3c6IFF1ZXN0aW9uUm93TW9kZWxcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCFkcmFnRHJvcEluZm8uZGVzdGluYXRpb24pIHJldHVybiB0cnVlO1xuICAgIGlmICh0aGlzLmRyYWdEcm9wQWRkVGFyZ2V0VG9FbXB0eVBhbmVsKGRyYWdEcm9wSW5mbykpIHJldHVybiB0cnVlO1xuICAgIHZhciBkZXN0ID0gZHJhZ0Ryb3BJbmZvLmRlc3RpbmF0aW9uO1xuICAgIHZhciBkZXN0Um93ID0gdGhpcy5kcmFnRHJvcEZpbmRSb3coZGVzdCk7XG4gICAgaWYgKCFkZXN0Um93KSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIWRyYWdEcm9wSW5mby50YXJnZXQuc3RhcnRXaXRoTmV3TGluZSlcbiAgICAgIHJldHVybiB0aGlzLmRyYWdEcm9wQWRkVGFyZ2V0VG9FeGlzdGluZ1JvdyhcbiAgICAgICAgZHJhZ0Ryb3BJbmZvLFxuICAgICAgICBkZXN0Um93LFxuICAgICAgICBwcmV2Um93XG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLmRyYWdEcm9wQWRkVGFyZ2V0VG9OZXdSb3coZHJhZ0Ryb3BJbmZvLCBkZXN0Um93LCBwcmV2Um93KTtcbiAgfVxuICBwcml2YXRlIGRyYWdEcm9wQWRkVGFyZ2V0VG9FbXB0eVBhbmVsKGRyYWdEcm9wSW5mbzogRHJhZ0Ryb3BJbmZvKTogYm9vbGVhbiB7XG4gICAgaWYgKGRyYWdEcm9wSW5mby5kZXN0aW5hdGlvbi5pc1BhZ2UpIHtcbiAgICAgIHRoaXMuZHJhZ0Ryb3BBZGRUYXJnZXRUb0VtcHR5UGFuZWxDb3JlKFxuICAgICAgICB0aGlzLnJvb3QsXG4gICAgICAgIGRyYWdEcm9wSW5mby50YXJnZXQsXG4gICAgICAgIGRyYWdEcm9wSW5mby5pc0JvdHRvbVxuICAgICAgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB2YXIgZGVzdCA9IDxJRWxlbWVudD5kcmFnRHJvcEluZm8uZGVzdGluYXRpb247XG4gICAgaWYgKGRlc3QuaXNQYW5lbCAmJiAhZHJhZ0Ryb3BJbmZvLmlzRWRnZSkge1xuICAgICAgdmFyIHBhbmVsID0gPFBhbmVsTW9kZWxCYXNlPig8YW55PmRlc3QpO1xuICAgICAgaWYgKCg8YW55PmRyYWdEcm9wSW5mby50YXJnZXQpW1widGVtcGxhdGVcIl0gPT09IGRlc3QpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBkcmFnRHJvcEluZm8ubmVzdGVkUGFuZWxEZXB0aCA8IDAgfHxcbiAgICAgICAgZHJhZ0Ryb3BJbmZvLm5lc3RlZFBhbmVsRGVwdGggPj0gcGFuZWwuZGVwdGhcbiAgICAgICkge1xuICAgICAgICB0aGlzLmRyYWdEcm9wQWRkVGFyZ2V0VG9FbXB0eVBhbmVsQ29yZShcbiAgICAgICAgICA8UGFuZWxNb2RlbEJhc2U+KDxhbnk+ZGVzdCksXG4gICAgICAgICAgZHJhZ0Ryb3BJbmZvLnRhcmdldCxcbiAgICAgICAgICBkcmFnRHJvcEluZm8uaXNCb3R0b21cbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcml2YXRlIGRyYWdEcm9wQWRkVGFyZ2V0VG9FeGlzdGluZ1JvdyhcbiAgICBkcmFnRHJvcEluZm86IERyYWdEcm9wSW5mbyxcbiAgICBkZXN0Um93OiBRdWVzdGlvblJvd01vZGVsLFxuICAgIHByZXZSb3c6IFF1ZXN0aW9uUm93TW9kZWxcbiAgKTogYm9vbGVhbiB7XG4gICAgdmFyIGluZGV4ID0gZGVzdFJvdy5lbGVtZW50cy5pbmRleE9mKDxJRWxlbWVudD5kcmFnRHJvcEluZm8uZGVzdGluYXRpb24pO1xuICAgIGlmIChcbiAgICAgIGluZGV4ID09IDAgJiZcbiAgICAgICFkcmFnRHJvcEluZm8uaXNCb3R0b20gJiZcbiAgICAgIGRlc3RSb3cuZWxlbWVudHNbMF0uc3RhcnRXaXRoTmV3TGluZVxuICAgICkge1xuICAgICAgaWYgKGRlc3RSb3cuaW5kZXggPiAwKSB7XG4gICAgICAgIGRyYWdEcm9wSW5mby5pc0JvdHRvbSA9IHRydWU7XG4gICAgICAgIGRlc3RSb3cgPSBkZXN0Um93LnBhbmVsLnJvd3NbZGVzdFJvdy5pbmRleCAtIDFdO1xuICAgICAgICBkcmFnRHJvcEluZm8uZGVzdGluYXRpb24gPVxuICAgICAgICAgIGRlc3RSb3cuZWxlbWVudHNbZGVzdFJvdy5lbGVtZW50cy5sZW5ndGggLSAxXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJhZ0Ryb3BBZGRUYXJnZXRUb0V4aXN0aW5nUm93KFxuICAgICAgICAgIGRyYWdEcm9wSW5mbyxcbiAgICAgICAgICBkZXN0Um93LFxuICAgICAgICAgIHByZXZSb3dcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRyYWdEcm9wQWRkVGFyZ2V0VG9OZXdSb3coZHJhZ0Ryb3BJbmZvLCBkZXN0Um93LCBwcmV2Um93KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIHByZXZSb3dJbmRleCA9IC0xO1xuICAgIGlmIChwcmV2Um93ID09IGRlc3RSb3cpIHtcbiAgICAgIHByZXZSb3dJbmRleCA9IGRlc3RSb3cuZWxlbWVudHMuaW5kZXhPZihkcmFnRHJvcEluZm8udGFyZ2V0KTtcbiAgICB9XG4gICAgaWYgKGRyYWdEcm9wSW5mby5pc0JvdHRvbSkgaW5kZXgrKztcbiAgICB2YXIgc3JjUm93ID0gdGhpcy5maW5kUm93QnlFbGVtZW50KGRyYWdEcm9wSW5mby5zb3VyY2UpO1xuICAgIGlmIChcbiAgICAgIHNyY1JvdyA9PSBkZXN0Um93ICYmXG4gICAgICBzcmNSb3cuZWxlbWVudHMuaW5kZXhPZihkcmFnRHJvcEluZm8uc291cmNlKSA9PSBpbmRleFxuICAgIClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaW5kZXggPT0gcHJldlJvd0luZGV4KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHByZXZSb3dJbmRleCA+IC0xKSB7XG4gICAgICBkZXN0Um93LmVsZW1lbnRzLnNwbGljZShwcmV2Um93SW5kZXgsIDEpO1xuICAgICAgaWYgKHByZXZSb3dJbmRleCA8IGluZGV4KSBpbmRleC0tO1xuICAgIH1cbiAgICBkZXN0Um93LmVsZW1lbnRzLnNwbGljZShpbmRleCwgMCwgZHJhZ0Ryb3BJbmZvLnRhcmdldCk7XG4gICAgZGVzdFJvdy51cGRhdGVWaXNpYmxlKCk7XG4gICAgcmV0dXJuIHByZXZSb3dJbmRleCA8IDA7XG4gIH1cbiAgcHJpdmF0ZSBkcmFnRHJvcEFkZFRhcmdldFRvTmV3Um93KFxuICAgIGRyYWdEcm9wSW5mbzogRHJhZ0Ryb3BJbmZvLFxuICAgIGRlc3RSb3c6IFF1ZXN0aW9uUm93TW9kZWwsXG4gICAgcHJldlJvdzogUXVlc3Rpb25Sb3dNb2RlbFxuICApOiBib29sZWFuIHtcbiAgICB2YXIgdGFyZ2V0Um93ID0gZGVzdFJvdy5wYW5lbC5jcmVhdGVSb3dBbmRTZXRMYXp5KGRlc3RSb3cucGFuZWwucm93cy5sZW5ndGgpO1xuICAgIHRhcmdldFJvdy5hZGRFbGVtZW50KGRyYWdEcm9wSW5mby50YXJnZXQpO1xuICAgIHZhciBpbmRleCA9IGRlc3RSb3cuaW5kZXg7XG4gICAgaWYgKGRyYWdEcm9wSW5mby5pc0JvdHRvbSkge1xuICAgICAgaW5kZXgrKztcbiAgICB9XG4gICAgLy9zYW1lIHJvd1xuICAgIGlmICghIXByZXZSb3cgJiYgcHJldlJvdy5wYW5lbCA9PSB0YXJnZXRSb3cucGFuZWwgJiYgcHJldlJvdy5pbmRleCA9PSBpbmRleClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB2YXIgc3JjUm93ID0gdGhpcy5maW5kUm93QnlFbGVtZW50KGRyYWdEcm9wSW5mby5zb3VyY2UpO1xuICAgIGlmIChcbiAgICAgICEhc3JjUm93ICYmXG4gICAgICBzcmNSb3cucGFuZWwgPT0gdGFyZ2V0Um93LnBhbmVsICYmXG4gICAgICBzcmNSb3cuZWxlbWVudHMubGVuZ3RoID09IDEgJiZcbiAgICAgIHNyY1Jvdy5pbmRleCA9PSBpbmRleFxuICAgIClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBkZXN0Um93LnBhbmVsLnJvd3Muc3BsaWNlKGluZGV4LCAwLCB0YXJnZXRSb3cpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByaXZhdGUgZHJhZ0Ryb3BBZGRUYXJnZXRUb0VtcHR5UGFuZWxDb3JlKFxuICAgIHBhbmVsOiBQYW5lbE1vZGVsQmFzZSxcbiAgICB0YXJnZXQ6IElFbGVtZW50LFxuICAgIGlzQm90dG9tOiBib29sZWFuXG4gICkge1xuICAgIHZhciB0YXJnZXRSb3cgPSBwYW5lbC5jcmVhdGVSb3coKTtcbiAgICB0YXJnZXRSb3cuYWRkRWxlbWVudCh0YXJnZXQpO1xuICAgIGlmIChwYW5lbC5lbGVtZW50cy5sZW5ndGggPT0gMCB8fCBpc0JvdHRvbSkge1xuICAgICAgcGFuZWwucm93cy5wdXNoKHRhcmdldFJvdyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhbmVsLnJvd3Muc3BsaWNlKDAsIDAsIHRhcmdldFJvdyk7XG4gICAgfVxuICB9XG4gIGRyYWdEcm9wTW92ZUVsZW1lbnQoc3JjOiBJRWxlbWVudCwgdGFyZ2V0OiBJRWxlbWVudCwgdGFyZ2V0SW5kZXg6IG51bWJlcikge1xuICAgIHZhciBzcmNJbmRleCA9ICg8UGFuZWxNb2RlbEJhc2U+c3JjLnBhcmVudCkuZWxlbWVudHMuaW5kZXhPZihzcmMpO1xuICAgIGlmICh0YXJnZXRJbmRleCA+IHNyY0luZGV4KSB7XG4gICAgICB0YXJnZXRJbmRleC0tO1xuICAgIH1cbiAgICB0aGlzLnJlbW92ZUVsZW1lbnQoc3JjKTtcbiAgICB0aGlzLmFkZEVsZW1lbnQodGFyZ2V0LCB0YXJnZXRJbmRleCk7XG4gIH1cbiAgLy9JVGl0bGVPd25lclxuICBwdWJsaWMgZ2V0IG5vKCk6IHN0cmluZyB7IHJldHVybiBcIlwiOyB9XG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICBpZiAodGhpcy5yb3dzKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLnJvd3NbaV0uZGlzcG9zZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5yb3dzLnNwbGljZSgwLCB0aGlzLnJvd3MubGVuZ3RoKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmVsZW1lbnRzW2ldLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgdGhpcy5lbGVtZW50cy5zcGxpY2UoMCwgdGhpcy5lbGVtZW50cy5sZW5ndGgpO1xuICB9XG5cbn1cblxuLyoqXG4gKiBBIGNvbnRhaW5lciBlbGVtZW50LCBzaW1pbGFyIHRvIHRoZSBQYWdlIG9iamVjdHMuIEhvd2V2ZXIsIHVubGlrZSB0aGUgUGFnZSwgUGFuZWwgY2FuJ3QgYmUgYSByb290LlxuICogSXQgbWF5IGNvbnRhaW4gcXVlc3Rpb25zIGFuZCBvdGhlciBwYW5lbHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYW5lbE1vZGVsIGV4dGVuZHMgUGFuZWxNb2RlbEJhc2UgaW1wbGVtZW50cyBJRWxlbWVudCB7XG4gIHB1YmxpYyBtaW5XaWR0aD86IHN0cmluZztcbiAgcHVibGljIG1heFdpZHRoPzogc3RyaW5nO1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcgPSBcIlwiKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuY3JlYXRlTmV3QXJyYXkoXCJmb290ZXJBY3Rpb25zXCIpO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJ3aWR0aFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoISFzZWxmLnBhcmVudCkge1xuICAgICAgICBzZWxmLnBhcmVudC5lbGVtZW50V2lkdGhDaGFuZ2VkKHNlbGYpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydGllc1ZhbHVlQ2hhbmdlZChcbiAgICAgIFtcImluZGVudFwiLCBcImlubmVySW5kZW50XCIsIFwicmlnaHRJbmRlbnRcIl0sXG4gICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYub25JbmRlbnRDaGFuZ2VkKCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInBhbmVsXCI7XG4gIH1cbiAgcHVibGljIGdldCBjb250ZW50SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pZCArIFwiX2NvbnRlbnRcIjtcbiAgfVxuICBwdWJsaWMgZ2V0U3VydmV5KGxpdmU6IGJvb2xlYW4gPSBmYWxzZSk6IElTdXJ2ZXkge1xuICAgIGlmIChsaXZlKSB7XG4gICAgICByZXR1cm4gISF0aGlzLnBhcmVudCA/IHRoaXMucGFyZW50LmdldFN1cnZleShsaXZlKSA6IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5nZXRTdXJ2ZXkobGl2ZSk7XG4gIH1cbiAgb25TdXJ2ZXlMb2FkKCkge1xuICAgIHN1cGVyLm9uU3VydmV5TG9hZCgpO1xuICAgIHRoaXMub25JbmRlbnRDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uU2V0RGF0YSgpIHtcbiAgICBzdXBlci5vblNldERhdGEoKTtcbiAgICB0aGlzLm9uSW5kZW50Q2hhbmdlZCgpO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNQYW5lbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogR2V0L3NldCB0aGUgcGFnZSB3aGVyZSB0aGUgcGFuZWwgaXMgbG9jYXRlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcGFnZSgpOiBJUGFnZSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UGFnZSh0aGlzLnBhcmVudCk7XG4gIH1cbiAgcHVibGljIHNldCBwYWdlKHZhbDogSVBhZ2UpIHtcbiAgICB0aGlzLnNldFBhZ2UodGhpcy5wYXJlbnQsIHZhbCk7XG4gIH1cbiAgcHVibGljIGRlbGV0ZSgpIHtcbiAgICBpZiAoISF0aGlzLnBhcmVudCkge1xuICAgICAgdGhpcy5yZW1vdmVTZWxmRnJvbUxpc3QodGhpcy5wYXJlbnQuZWxlbWVudHMpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogTW92ZSBwYW5lbCB0byBhIG5ldyBjb250YWluZXIgUGFnZS9QYW5lbC4gQWRkIGFzIGEgbGFzdCBlbGVtZW50IGlmIGluc2VydEJlZm9yZSBwYXJhbWV0ZXIgaXMgbm90IHVzZWQgb3IgaW5zZXJ0ZWQgaW50byB0aGUgZ2l2ZW4gaW5kZXgsXG4gICAqIGlmIGluc2VydCBwYXJhbWV0ZXIgaXMgbnVtYmVyLCBvciBiZWZvcmUgdGhlIGdpdmVuIGVsZW1lbnQsIGlmIHRoZSBpbnNlcnRCZWZvcmUgcGFyYW1ldGVyIGlzIGEgcXVlc3Rpb24gb3IgcGFuZWxcbiAgICogQHBhcmFtIGNvbnRhaW5lciBQYWdlIG9yIFBhbmVsIHRvIHdoZXJlIGEgcXVlc3Rpb24gaXMgcmVsb2NhdGVkLlxuICAgKiBAcGFyYW0gaW5zZXJ0QmVmb3JlIFVzZSBpdCBpZiB5b3Ugd2FudCB0byBzZXQgdGhlIHBhbmVsIHRvIGEgc3BlY2lmaWMgcG9zaXRpb24uIFlvdSBtYXkgdXNlIGEgbnVtYmVyICh1c2UgMCB0byBpbnNlcnQgaW50IHRoZSBiZWdpbm5pbmcpIG9yIGVsZW1lbnQsIGlmIHlvdSB3YW50IHRvIGluc2VydCBiZWZvcmUgdGhpcyBlbGVtZW50LlxuICAgKi9cbiAgcHVibGljIG1vdmVUbyhjb250YWluZXI6IElQYW5lbCwgaW5zZXJ0QmVmb3JlOiBhbnkgPSBudWxsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubW92ZVRvQmFzZSh0aGlzLnBhcmVudCwgY29udGFpbmVyLCBpbnNlcnRCZWZvcmUpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB2aXNpYmxlIGluZGV4IG9mIHRoZSBwYW5lbCBpbiB0aGUgc3VydmV5LiBDb21tb25seSBpdCBpcyAtMSBhbmQgaXQgZG9lc24ndCBzaG93LlxuICAgKiBZb3UgaGF2ZSB0byBzZXQgc2hvd051bWJlciB0byB0cnVlIHRvIHNob3cgaW5kZXgvbnVtYmVyaW5nIGZvciB0aGUgUGFuZWxcbiAgICogQHNlZSBzaG93TnVtYmVyXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGVJbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlSW5kZXhcIiwgLTEpO1xuICB9XG4gIHB1YmxpYyBnZXRUaXRsZU93bmVyKCk6IElUaXRsZU93bmVyIHsgcmV0dXJuIHRoaXM7IH1cbiAgLyoqXG4gICAqIFNldCBzaG93TnVtYmVyIHRvIHRydWUgdG8gc3RhcnQgc2hvd2luZyB0aGUgbnVtYmVyIGZvciB0aGlzIHBhbmVsLlxuICAgKiBAc2VlIHZpc2libGVJbmRleFxuICAgKi9cbiAgcHVibGljIGdldCBzaG93TnVtYmVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93TnVtYmVyXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dOdW1iZXIodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd051bWJlclwiLCB2YWwpO1xuICAgIHRoaXMubm90aWZ5U3VydmV5T25WaXNpYmlsaXR5Q2hhbmdlZCgpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgYSB2YWx1ZSB0aGF0IHNwZWNpZmllcyBob3cgdGhlIGVsZW1lbnRzIG51bWJlcnMgaW5zaWRlIHBhbmVsIGFyZSBkaXNwbGF5ZWQuXG4gICAqXG4gICAqIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlOlxuICAgKlxuICAgKiAtIGBkZWZhdWx0YCAtIGRpc3BsYXkgcXVlc3Rpb25zIG51bWJlcnMgYXMgZGVmaW5lZCBpbiBwYXJlbnQgcGFuZWwgb3Igc3VydmV5XG4gICAqIC0gYG9ucGFuZWxgIC0gZGlzcGxheSBxdWVzdGlvbnMgbnVtYmVycywgc3RhcnQgbnVtYmVyaW5nIGZyb20gYmVnaW5uaW5nIG9mIHRoaXMgcGFnZVxuICAgKiAtIGBvZmZgIC0gdHVybiBvZmYgdGhlIG51bWJlcmluZyBmb3IgcXVlc3Rpb25zIHRpdGxlc1xuICAgKiBAc2VlIHNob3dOdW1iZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1F1ZXN0aW9uTnVtYmVycygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93UXVlc3Rpb25OdW1iZXJzXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd1F1ZXN0aW9uTnVtYmVycyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1F1ZXN0aW9uTnVtYmVyc1wiLCB2YWx1ZSk7XG4gICAgdGhpcy5ub3RpZnlTdXJ2ZXlPblZpc2liaWxpdHlDaGFuZ2VkKCk7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgZmlyc3QgcXVlc3Rpb24gaW5kZXggZm9yIGVsZW1lbnRzIGluc2lkZSB0aGUgcGFuZWwuIFRoZSBmaXJzdCBxdWVzdGlvbiBpbmRleCBpcyAnMS4nIGJ5IGRlZmF1bHQgYW5kIGl0IGlzIHRha2VuIGZyb20gc3VydmV5LnF1ZXN0aW9uU3RhcnRJbmRleCBwcm9wZXJ0eS5cbiAgICogWW91IG1heSBzdGFydCBpdCBmcm9tICcxMDAnIG9yIGZyb20gJ0EnLCBieSBzZXR0aW5nICcxMDAnIG9yICdBJyB0byB0aGlzIHByb3BlcnR5LlxuICAgKiBZb3UgY2FuIHNldCB0aGUgc3RhcnQgaW5kZXggdG8gXCIoMSlcIiBvciBcIiMgQSlcIiBvciBcImEpXCIgdG8gcmVuZGVyIHF1ZXN0aW9uIG51bWJlciBhcyAoMSksICMgQSkgYW5kIGEpIGFjY29yZGluZ2x5LlxuICAgKiBAc2VlIHN1cnZleS5xdWVzdGlvblN0YXJ0SW5kZXhcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlc3Rpb25TdGFydEluZGV4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uU3RhcnRJbmRleFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHF1ZXN0aW9uU3RhcnRJbmRleCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uU3RhcnRJbmRleFwiLCB2YWwpO1xuICB9XG4gIGdldFF1ZXN0aW9uU3RhcnRJbmRleCgpOiBzdHJpbmcge1xuICAgIGlmICghIXRoaXMucXVlc3Rpb25TdGFydEluZGV4KSByZXR1cm4gdGhpcy5xdWVzdGlvblN0YXJ0SW5kZXg7XG4gICAgcmV0dXJuIHN1cGVyLmdldFF1ZXN0aW9uU3RhcnRJbmRleCgpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydHkgcmV0dXJucyB0aGUgcXVlc3Rpb24gbnVtYmVyLiBJZiBxdWVzdGlvbiBpcyBpbnZpc2libGUgdGhlbiBpdCByZXR1cm5zIGVtcHR5IHN0cmluZy5cbiAgICogSWYgdmlzaWJsZUluZGV4IGlzIDEsIHRoZW4gbm8gaXMgMiwgb3IgJ0InIGlmIHN1cnZleS5xdWVzdGlvblN0YXJ0SW5kZXggaXMgJ0EnLlxuICAgKiBAc2VlIFN1cnZleU1vZGVsLnF1ZXN0aW9uU3RhcnRJbmRleFxuICAgKi9cbiAgcHVibGljIGdldCBubygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJub1wiLCBcIlwiKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0Tm8odmlzaWJsZUluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXG4gICAgICBcIm5vXCIsXG4gICAgICBIZWxwZXJzLmdldE51bWJlckJ5SW5kZXgodGhpcy52aXNpYmxlSW5kZXgsIHRoaXMuZ2V0U3RhcnRJbmRleCgpKVxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIGJlZm9yZVNldFZpc2libGVJbmRleChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBsZXQgdmlzaWJsZUluZGV4ID0gLTE7XG4gICAgaWYgKHRoaXMuc2hvd051bWJlciAmJiAodGhpcy5pc0Rlc2lnbk1vZGUgfHwgIXRoaXMubG9jVGl0bGUuaXNFbXB0eSkpIHtcbiAgICAgIHZpc2libGVJbmRleCA9IGluZGV4O1xuICAgIH1cbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlSW5kZXhcIiwgdmlzaWJsZUluZGV4KTtcbiAgICB0aGlzLnNldE5vKHZpc2libGVJbmRleCk7XG4gICAgcmV0dXJuIHZpc2libGVJbmRleCA8IDAgPyAwIDogMTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0UGFuZWxTdGFydEluZGV4KGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLnNob3dRdWVzdGlvbk51bWJlcnMgPT0gXCJvZmZcIikgcmV0dXJuIC0xO1xuICAgIGlmICh0aGlzLnNob3dRdWVzdGlvbk51bWJlcnMgPT0gXCJvbnBhbmVsXCIpIHJldHVybiAwO1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuICBwcm90ZWN0ZWQgaXNDb250aW51ZU51bWJlcmluZygpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5zaG93UXVlc3Rpb25OdW1iZXJzICE9IFwib2ZmXCIgJiYgdGhpcy5zaG93UXVlc3Rpb25OdW1iZXJzICE9IFwib25wYW5lbFwiXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIG5vdGlmeVN1cnZleU9uVmlzaWJpbGl0eUNoYW5nZWQoKSB7XG4gICAgaWYgKHRoaXMuc3VydmV5ICE9IG51bGwgJiYgIXRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHtcbiAgICAgIHRoaXMuc3VydmV5LnBhbmVsVmlzaWJpbGl0eUNoYW5nZWQodGhpcywgdGhpcy5pc1Zpc2libGUpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgaGFzRXJyb3JzQ29yZShyZWM6IGFueSkge1xuICAgIHN1cGVyLmhhc0Vycm9yc0NvcmUocmVjKTtcbiAgICBpZiAodGhpcy5pc0NvbGxhcHNlZCAmJiByZWMucmVzdWx0ICYmIHJlYy5maXJlQ2FsbGJhY2spIHtcbiAgICAgIHRoaXMuZXhwYW5kKCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBnZXRSZW5kZXJlZFRpdGxlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXN0cikge1xuICAgICAgaWYgKHRoaXMuaXNDb2xsYXBzZWQgfHwgdGhpcy5pc0V4cGFuZGVkKSByZXR1cm4gdGhpcy5uYW1lO1xuICAgICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSByZXR1cm4gXCJbXCIgKyB0aGlzLm5hbWUgKyBcIl1cIjtcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLmdldFJlbmRlcmVkVGl0bGUoc3RyKTtcbiAgfVxuICAvKipcbiAgICogVGhlIFBhbmVsIHdpZHRoLlxuICAgKi9cbiAgcHVibGljIGdldCB3aWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ3aWR0aFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHdpZHRoKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwid2lkdGhcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGxlZnQgaW5kZW50LiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBpbmNyZWFzZSB0aGUgcGFuZWwgbGVmdCBpbmRlbnQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGluZGVudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpbmRlbnRcIik7XG4gIH1cbiAgcHVibGljIHNldCBpbmRlbnQodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpbmRlbnRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGlubmVyIGluZGVudC4gU2V0IHRoaXMgcHJvcGVydHkgdG8gaW5jcmVhc2UgdGhlIHBhbmVsIGNvbnRlbnQgbWFyZ2luLlxuICAgKi9cbiAgcHVibGljIGdldCBpbm5lckluZGVudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpbm5lckluZGVudFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGlubmVySW5kZW50KHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaW5uZXJJbmRlbnRcIiwgdmFsKTtcbiAgfVxuICBnZXQgcmVuZGVyV2lkdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmVuZGVyV2lkdGhcIik7XG4gIH1cbiAgc2V0IHJlbmRlcldpZHRoKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmVuZGVyV2lkdGhcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIFBhbmVsIHJlbmRlcnMgb24gdGhlIG5ldyBsaW5lIGlmIHRoZSBwcm9wZXJ0eSBpcyB0cnVlLiBJZiB0aGUgcHJvcGVydHkgaXMgZmFsc2UsIHRoZSBwYW5lbCB0cmllcyB0byByZW5kZXIgb24gdGhlIHNhbWUgbGluZS9yb3cgd2l0aCBhIHByZXZpb3VzIHF1ZXN0aW9uL3BhbmVsLlxuICAgKi9cbiAgcHVibGljIGdldCBzdGFydFdpdGhOZXdMaW5lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzdGFydFdpdGhOZXdMaW5lXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc3RhcnRXaXRoTmV3TGluZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInN0YXJ0V2l0aE5ld0xpbmVcIiwgdmFsdWUpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgcmlnaHQgaW5kZW50IG9mIHRoZSBQYW5lbC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcmlnaHRJbmRlbnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmlnaHRJbmRlbnRcIiwgMCk7XG4gIH1cbiAgcHVibGljIHNldCByaWdodEluZGVudCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJpZ2h0SW5kZW50XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBQYW5lbCB0b29sYmFyIGdldHMgYWRhcHRpdmUgaWYgdGhlIHByb3BlcnR5IGlzIHNldCB0byB0cnVlLlxuICAgKi9cbiAgcHVibGljIGdldCBhbGxvd0FkYXB0aXZlQWN0aW9ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dBZGFwdGl2ZUFjdGlvbnNcIik7XG4gIH1cbiAgcHVibGljIHNldCBhbGxvd0FkYXB0aXZlQWN0aW9ucyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJhbGxvd0FkYXB0aXZlQWN0aW9uc1wiLCB2YWwpO1xuICB9XG4gIGdldCBwYWRkaW5nTGVmdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJwYWRkaW5nTGVmdFwiLCBcIlwiKTtcbiAgfVxuICBzZXQgcGFkZGluZ0xlZnQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJwYWRkaW5nTGVmdFwiLCB2YWwpO1xuICB9XG4gIGdldCBpbm5lclBhZGRpbmdMZWZ0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlubmVyUGFkZGluZ0xlZnRcIiwgXCJcIik7XG4gIH1cbiAgc2V0IGlubmVyUGFkZGluZ0xlZnQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpbm5lclBhZGRpbmdMZWZ0XCIsIHZhbCk7XG4gIH1cbiAgZ2V0IHBhZGRpbmdSaWdodCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJwYWRkaW5nUmlnaHRcIiwgXCJcIik7XG4gIH1cbiAgc2V0IHBhZGRpbmdSaWdodCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInBhZGRpbmdSaWdodFwiLCB2YWwpO1xuICB9XG4gIHByaXZhdGUgb25JbmRlbnRDaGFuZ2VkKCkge1xuICAgIGlmICghdGhpcy5nZXRTdXJ2ZXkoKSkgcmV0dXJuO1xuICAgIHRoaXMuaW5uZXJQYWRkaW5nTGVmdCA9IHRoaXMuZ2V0SW5kZW50U2l6ZSh0aGlzLmlubmVySW5kZW50KTtcbiAgICB0aGlzLnBhZGRpbmdMZWZ0ID0gdGhpcy5nZXRJbmRlbnRTaXplKHRoaXMuaW5kZW50KTtcbiAgICB0aGlzLnBhZGRpbmdSaWdodCA9IHRoaXMuZ2V0SW5kZW50U2l6ZSh0aGlzLnJpZ2h0SW5kZW50KTtcbiAgfVxuICBwcml2YXRlIGdldEluZGVudFNpemUoaW5kZW50OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmIChpbmRlbnQgPCAxKSByZXR1cm4gXCJcIjtcbiAgICB2YXIgY3NzID0gKDxhbnk+dGhpcykuc3VydmV5W1wiY3NzXCJdO1xuICAgIGlmICghY3NzKSByZXR1cm4gXCJcIjtcbiAgICByZXR1cm4gaW5kZW50ICogY3NzLnF1ZXN0aW9uLmluZGVudCArIFwicHhcIjtcbiAgfVxuICBwdWJsaWMgY2xlYXJPbkRlbGV0aW5nQ29udGFpbmVyKCkge1xuICAgIHRoaXMuZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBRdWVzdGlvbiB8fCBlbGVtZW50IGluc3RhbmNlb2YgUGFuZWxNb2RlbCkge1xuICAgICAgICBlbGVtZW50LmNsZWFyT25EZWxldGluZ0NvbnRhaW5lcigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBnZXQgZm9vdGVyQWN0aW9ucygpOiBBcnJheTxJQWN0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImZvb3RlckFjdGlvbnNcIik7XG4gIH1cbiAgcHJpdmF0ZSBmb290ZXJUb29sYmFyVmFsdWU6IEFjdGlvbkNvbnRhaW5lcjtcbiAgcHVibGljIGdldEZvb3RlclRvb2xiYXIoKTogQWN0aW9uQ29udGFpbmVyIHtcbiAgICBpZiAoIXRoaXMuZm9vdGVyVG9vbGJhclZhbHVlKSB7XG4gICAgICB2YXIgYWN0aW9ucyA9IHRoaXMuZm9vdGVyQWN0aW9ucztcbiAgICAgIGlmICh0aGlzLmhhc0VkaXRCdXR0b24pIHtcbiAgICAgICAgYWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICBpZDogXCJjYW5jZWwtcHJldmlld1wiLFxuICAgICAgICAgIHRpdGxlOiB0aGlzLnN1cnZleS5lZGl0VGV4dCxcbiAgICAgICAgICBpbm5lckNzczogdGhpcy5zdXJ2ZXkuY3NzTmF2aWdhdGlvbkVkaXQsXG4gICAgICAgICAgYWN0aW9uOiAoKSA9PiB7IHRoaXMuY2FuY2VsUHJldmlldygpOyB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5mb290ZXJUb29sYmFyVmFsdWUgPSB0aGlzLmFsbG93QWRhcHRpdmVBY3Rpb25zID8gbmV3IEFkYXB0aXZlQWN0aW9uQ29udGFpbmVyKCkgOiBuZXcgQWN0aW9uQ29udGFpbmVyKCk7XG4gICAgICBpZiAoISF0aGlzLmNzc0NsYXNzZXMucGFuZWwpIHtcbiAgICAgICAgdGhpcy5mb290ZXJUb29sYmFyVmFsdWUuY29udGFpbmVyQ3NzID0gdGhpcy5jc3NDbGFzc2VzLnBhbmVsLmZvb3RlcjtcbiAgICAgIH1cbiAgICAgIHRoaXMuZm9vdGVyVG9vbGJhclZhbHVlLnNldEl0ZW1zKGFjdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5mb290ZXJUb29sYmFyVmFsdWU7XG4gIH1cbiAgcHVibGljIGdldCBoYXNFZGl0QnV0dG9uKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5zdGF0ZSA9PT0gXCJwcmV2aWV3XCIpIHJldHVybiB0aGlzLmRlcHRoID09PSAxO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgY2FuY2VsUHJldmlldygpIHtcbiAgICBpZiAoIXRoaXMuaGFzRWRpdEJ1dHRvbikgcmV0dXJuO1xuICAgIHRoaXMuc3VydmV5LmNhbmNlbFByZXZpZXdCeVBhZ2UodGhpcyk7XG4gIH1cbiAgcHVibGljIGdldCBjc3NUaXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBuZXcgQ3NzQ2xhc3NCdWlsZGVyKClcbiAgICAgIC5hcHBlbmQodGhpcy5jc3NDbGFzc2VzLnBhbmVsLnRpdGxlKVxuICAgICAgLmFwcGVuZCh0aGlzLmNzc0NsYXNzZXMucGFuZWwudGl0bGVFeHBhbmRhYmxlLCB0aGlzLnN0YXRlICE9PSBcImRlZmF1bHRcIilcbiAgICAgIC5hcHBlbmQodGhpcy5jc3NDbGFzc2VzLnBhbmVsLnRpdGxlT25FcnJvciwgdGhpcy5jb250YWluc0Vycm9ycylcbiAgICAgIC50b1N0cmluZygpO1xuICB9XG4gIHB1YmxpYyBnZXQgY3NzRXJyb3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDc3NFcnJvcih0aGlzLmNzc0NsYXNzZXMpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRDc3NFcnJvcihjc3NDbGFzc2VzOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgQ3NzQ2xhc3NCdWlsZGVyKCkuYXBwZW5kKHRoaXMuY3NzQ2xhc3Nlcy5lcnJvci5yb290KTtcbiAgICByZXR1cm4gYnVpbGRlci5hcHBlbmQoXCJwYW5lbC1lcnJvci1yb290XCIsIGJ1aWxkZXIuaXNFbXB0eSgpKS50b1N0cmluZygpO1xuICB9XG4gIHByb3RlY3RlZCBvblZpc2libGVDaGFuZ2VkKCkge1xuICAgIHN1cGVyLm9uVmlzaWJsZUNoYW5nZWQoKTtcbiAgICB0aGlzLm5vdGlmeVN1cnZleU9uVmlzaWJpbGl0eUNoYW5nZWQoKTtcbiAgfVxufVxuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcInBhbmVsYmFzZVwiLFxuICBbXG4gICAgXCJuYW1lXCIsXG4gICAge1xuICAgICAgbmFtZTogXCJlbGVtZW50c1wiLFxuICAgICAgYWx0ZXJuYXRpdmVOYW1lOiBcInF1ZXN0aW9uc1wiLFxuICAgICAgYmFzZUNsYXNzTmFtZTogXCJxdWVzdGlvblwiLFxuICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICBpc0xpZ2h0U2VyaWFsaXphYmxlOiBmYWxzZSxcbiAgICB9LFxuICAgIHsgbmFtZTogXCJ2aXNpYmxlOnN3aXRjaFwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgXCJ2aXNpYmxlSWY6Y29uZGl0aW9uXCIsXG4gICAgXCJlbmFibGVJZjpjb25kaXRpb25cIixcbiAgICBcInJlcXVpcmVkSWY6Y29uZGl0aW9uXCIsXG4gICAgXCJyZWFkT25seTpib29sZWFuXCIsXG4gICAge1xuICAgICAgbmFtZTogXCJxdWVzdGlvblRpdGxlTG9jYXRpb25cIixcbiAgICAgIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLFxuICAgICAgY2hvaWNlczogW1wiZGVmYXVsdFwiLCBcInRvcFwiLCBcImJvdHRvbVwiLCBcImxlZnRcIiwgXCJoaWRkZW5cIl0sXG4gICAgfSxcbiAgICB7IG5hbWU6IFwidGl0bGU6dGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jVGl0bGVcIiB9LFxuICAgIHsgbmFtZTogXCJkZXNjcmlwdGlvbjp0ZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NEZXNjcmlwdGlvblwiIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJxdWVzdGlvbnNPcmRlclwiLFxuICAgICAgZGVmYXVsdDogXCJkZWZhdWx0XCIsXG4gICAgICBjaG9pY2VzOiBbXCJkZWZhdWx0XCIsIFwiaW5pdGlhbFwiLCBcInJhbmRvbVwiXSxcbiAgICB9LFxuXG4gIF0sXG4gIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IFBhbmVsTW9kZWxCYXNlKCk7XG4gIH1cbik7XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwicGFuZWxcIixcbiAgW1xuICAgIHtcbiAgICAgIG5hbWU6IFwic3RhdGVcIixcbiAgICAgIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLFxuICAgICAgY2hvaWNlczogW1wiZGVmYXVsdFwiLCBcImNvbGxhcHNlZFwiLCBcImV4cGFuZGVkXCJdLFxuICAgIH0sXG4gICAgXCJpc1JlcXVpcmVkOnN3aXRjaFwiLFxuICAgIHtcbiAgICAgIG5hbWU6IFwicmVxdWlyZWRFcnJvclRleHQ6dGV4dFwiLFxuICAgICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1JlcXVpcmVkRXJyb3JUZXh0XCIsXG4gICAgfSxcbiAgICB7IG5hbWU6IFwic3RhcnRXaXRoTmV3TGluZTpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgICBcIndpZHRoXCIsXG4gICAgeyBuYW1lOiBcImlubmVySW5kZW50Om51bWJlclwiLCBkZWZhdWx0OiAwLCBjaG9pY2VzOiBbMCwgMSwgMiwgM10gfSxcbiAgICB7IG5hbWU6IFwiaW5kZW50Om51bWJlclwiLCBkZWZhdWx0OiAwLCBjaG9pY2VzOiBbMCwgMSwgMiwgM10gfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInBhZ2VcIixcbiAgICAgIGlzU2VyaWFsaXphYmxlOiBmYWxzZSxcbiAgICAgIHZpc2libGVJZjogZnVuY3Rpb24gKG9iajogYW55KSB7XG4gICAgICAgIHZhciBzdXJ2ZXkgPSBvYmogPyBvYmouc3VydmV5IDogbnVsbDtcbiAgICAgICAgcmV0dXJuICFzdXJ2ZXkgfHwgc3VydmV5LnBhZ2VzLmxlbmd0aCA+IDE7XG4gICAgICB9LFxuICAgICAgY2hvaWNlczogZnVuY3Rpb24gKG9iajogYW55KSB7XG4gICAgICAgIHZhciBzdXJ2ZXkgPSBvYmogPyBvYmouc3VydmV5IDogbnVsbDtcbiAgICAgICAgcmV0dXJuIHN1cnZleVxuICAgICAgICAgID8gc3VydmV5LnBhZ2VzLm1hcCgocDogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogcC5uYW1lLCB0ZXh0OiBwLnRpdGxlIH07XG4gICAgICAgICAgfSlcbiAgICAgICAgICA6IFtdO1xuICAgICAgfSxcbiAgICB9LFxuICAgIFwic2hvd051bWJlcjpib29sZWFuXCIsXG4gICAge1xuICAgICAgbmFtZTogXCJzaG93UXVlc3Rpb25OdW1iZXJzXCIsXG4gICAgICBkZWZhdWx0OiBcImRlZmF1bHRcIixcbiAgICAgIGNob2ljZXM6IFtcImRlZmF1bHRcIiwgXCJvbnBhbmVsXCIsIFwib2ZmXCJdLFxuICAgIH0sXG4gICAgXCJxdWVzdGlvblN0YXJ0SW5kZXhcIixcbiAgICB7IG5hbWU6IFwiYWxsb3dBZGFwdGl2ZUFjdGlvbnM6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlLCB2aXNpYmxlOiBmYWxzZSB9LFxuICBdLFxuICBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBQYW5lbE1vZGVsKCk7XG4gIH0sXG4gIFwicGFuZWxiYXNlXCJcbik7XG5cbkVsZW1lbnRGYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyRWxlbWVudChcInBhbmVsXCIsIChuYW1lKSA9PiB7XG4gIHJldHVybiBuZXcgUGFuZWxNb2RlbChuYW1lKTtcbn0pO1xuIiwiaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuL2Jhc2VcIjtcclxuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XHJcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcclxuaW1wb3J0IHtcclxuICBQb3B1cFV0aWxzLFxyXG4gIFZlcnRpY2FsUG9zaXRpb24sXHJcbiAgSG9yaXpvbnRhbFBvc2l0aW9uLFxyXG4gIElQb3NpdGlvblxyXG59IGZyb20gXCIuL3V0aWxzL3BvcHVwXCI7XHJcbmltcG9ydCB7IENzc0NsYXNzQnVpbGRlciB9IGZyb20gXCIuL3V0aWxzL2Nzc0NsYXNzQnVpbGRlclwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFBvcHVwTW9kZWw8VCA9IGFueT4gZXh0ZW5kcyBCYXNlIHtcclxuICBAcHJvcGVydHkoKSBjb250ZW50Q29tcG9uZW50TmFtZTogc3RyaW5nO1xyXG4gIEBwcm9wZXJ0eSgpIGNvbnRlbnRDb21wb25lbnREYXRhOiBUO1xyXG4gIEBwcm9wZXJ0eSh7IGRlZmF1bHRWYWx1ZTogXCJib3R0b21cIiB9KSB2ZXJ0aWNhbFBvc2l0aW9uOiBWZXJ0aWNhbFBvc2l0aW9uO1xyXG4gIEBwcm9wZXJ0eSh7IGRlZmF1bHRWYWx1ZTogXCJsZWZ0XCIgfSkgaG9yaXpvbnRhbFBvc2l0aW9uOiBIb3Jpem9udGFsUG9zaXRpb247XHJcbiAgQHByb3BlcnR5KHsgZGVmYXVsdFZhbHVlOiBmYWxzZSB9KSBzaG93UG9pbnRlcjogYm9vbGVhbjtcclxuICBAcHJvcGVydHkoeyBkZWZhdWx0VmFsdWU6IGZhbHNlIH0pIGlzTW9kYWw6IGJvb2xlYW47XHJcbiAgQHByb3BlcnR5KHsgZGVmYXVsdFZhbHVlOiAoKSA9PiB7IH0gfSkgb25DYW5jZWw6ICgpID0+IHZvaWQ7XHJcbiAgQHByb3BlcnR5KHsgZGVmYXVsdFZhbHVlOiAoKSA9PiB7IHJldHVybiB0cnVlOyB9IH0pIG9uQXBwbHk6ICgpID0+IGJvb2xlYW47XHJcbiAgQHByb3BlcnR5KHsgZGVmYXVsdFZhbHVlOiAoKSA9PiB7IH0gfSkgb25IaWRlOiAoKSA9PiB2b2lkO1xyXG4gIEBwcm9wZXJ0eSh7IGRlZmF1bHRWYWx1ZTogKCkgPT4geyB9IH0pIG9uU2hvdzogKCkgPT4gdm9pZDtcclxuICBAcHJvcGVydHkoeyBkZWZhdWx0VmFsdWU6IFwiXCIgfSkgY3NzQ2xhc3M6IHN0cmluZztcclxuICBAcHJvcGVydHkoeyBkZWZhdWx0VmFsdWU6IFwiXCIgfSkgdGl0bGU6IHN0cmluZztcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIGNvbnRlbnRDb21wb25lbnROYW1lOiBzdHJpbmcsXHJcbiAgICBjb250ZW50Q29tcG9uZW50RGF0YTogVCxcclxuICAgIHZlcnRpY2FsUG9zaXRpb246IFZlcnRpY2FsUG9zaXRpb24gPSBcImJvdHRvbVwiLFxyXG4gICAgaG9yaXpvbnRhbFBvc2l0aW9uOiBIb3Jpem9udGFsUG9zaXRpb24gPSBcImxlZnRcIixcclxuICAgIHNob3dQb2ludGVyOiBib29sZWFuID0gdHJ1ZSxcclxuICAgIGlzTW9kYWw6IGJvb2xlYW4gPSBmYWxzZSxcclxuICAgIG9uQ2FuY2VsID0gKCkgPT4geyB9LFxyXG4gICAgb25BcHBseSA9ICgpID0+IHsgcmV0dXJuIHRydWU7IH0sXHJcbiAgICBvbkhpZGUgPSAoKSA9PiB7IH0sXHJcbiAgICBvblNob3cgPSAoKSA9PiB7IH0sXHJcbiAgICBjc3NDbGFzczogc3RyaW5nID0gXCJcIixcclxuICAgIHRpdGxlOiBzdHJpbmcgPSBcIlwiXHJcbiAgKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy5jb250ZW50Q29tcG9uZW50TmFtZSA9IGNvbnRlbnRDb21wb25lbnROYW1lO1xyXG4gICAgdGhpcy5jb250ZW50Q29tcG9uZW50RGF0YSA9IGNvbnRlbnRDb21wb25lbnREYXRhO1xyXG4gICAgdGhpcy52ZXJ0aWNhbFBvc2l0aW9uID0gdmVydGljYWxQb3NpdGlvbjtcclxuICAgIHRoaXMuaG9yaXpvbnRhbFBvc2l0aW9uID0gaG9yaXpvbnRhbFBvc2l0aW9uO1xyXG4gICAgdGhpcy5zaG93UG9pbnRlciA9IHNob3dQb2ludGVyO1xyXG4gICAgdGhpcy5pc01vZGFsID0gaXNNb2RhbDtcclxuICAgIHRoaXMub25DYW5jZWwgPSBvbkNhbmNlbDtcclxuICAgIHRoaXMub25BcHBseSA9IG9uQXBwbHk7XHJcbiAgICB0aGlzLm9uSGlkZSA9IG9uSGlkZTtcclxuICAgIHRoaXMub25TaG93ID0gb25TaG93O1xyXG4gICAgdGhpcy5jc3NDbGFzcyA9IGNzc0NsYXNzO1xyXG4gICAgdGhpcy50aXRsZSA9IHRpdGxlO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IGlzVmlzaWJsZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc1Zpc2libGVcIiwgZmFsc2UpO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IGlzVmlzaWJsZSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMuaXNWaXNpYmxlID09PSB2YWx1ZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1Zpc2libGVcIiwgdmFsdWUpO1xyXG4gICAgdGhpcy5vblZpc2liaWxpdHlDaGFuZ2VkICYmIHRoaXMub25WaXNpYmlsaXR5Q2hhbmdlZCh2YWx1ZSk7XHJcbiAgICBpZiAodGhpcy5pc1Zpc2libGUpIHtcclxuICAgICAgdGhpcy5vblNob3coKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMub25IaWRlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHB1YmxpYyB0b2dnbGVWaXNpYmlsaXR5KCkge1xyXG4gICAgdGhpcy5pc1Zpc2libGUgPSAhdGhpcy5pc1Zpc2libGU7XHJcbiAgfVxyXG4gIHB1YmxpYyBvblZpc2liaWxpdHlDaGFuZ2VkOiAoaXNWaXNpYmxlOiBib29sZWFuKSA9PiB2b2lkO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUG9wdXBNb2RhbFZpZXdNb2RlbChcclxuICBjb21wb25lbnROYW1lOiBzdHJpbmcsXHJcbiAgZGF0YTogYW55LFxyXG4gIG9uQXBwbHk6ICgpID0+IGJvb2xlYW4sXHJcbiAgb25DYW5jZWw/OiAoKSA9PiB2b2lkLFxyXG4gIG9uSGlkZSA9ICgpID0+IHsgfSxcclxuICBvblNob3cgPSAoKSA9PiB7IH0sXHJcbiAgY3NzQ2xhc3M/OiBzdHJpbmcsXHJcbiAgdGl0bGU/OiBzdHJpbmdcclxuKSB7XHJcbiAgY29uc3QgcG9wdXBNb2RlbCA9IG5ldyBQb3B1cE1vZGVsKFxyXG4gICAgY29tcG9uZW50TmFtZSxcclxuICAgIGRhdGEsXHJcbiAgICBcInRvcFwiLFxyXG4gICAgXCJsZWZ0XCIsXHJcbiAgICBmYWxzZSxcclxuICAgIHRydWUsXHJcbiAgICBvbkNhbmNlbCxcclxuICAgIG9uQXBwbHksXHJcbiAgICBvbkhpZGUsXHJcbiAgICBvblNob3csXHJcbiAgICBjc3NDbGFzcyxcclxuICAgIHRpdGxlXHJcbiAgKTtcclxuICBjb25zdCBwb3B1cFZpZXdNb2RlbDogUG9wdXBCYXNlVmlld01vZGVsID0gbmV3IFBvcHVwQmFzZVZpZXdNb2RlbChcclxuICAgIHBvcHVwTW9kZWwsXHJcbiAgICB1bmRlZmluZWRcclxuICApO1xyXG4gIHBvcHVwVmlld01vZGVsLmluaXRpYWxpemVQb3B1cENvbnRhaW5lcigpO1xyXG4gIHJldHVybiBwb3B1cFZpZXdNb2RlbDtcclxufVxyXG5cclxuY29uc3QgRk9DVVNfSU5QVVRfU0VMRUNUT1IgPSBcImlucHV0Om5vdCg6ZGlzYWJsZWQpOm5vdChbcmVhZG9ubHldKTpub3QoW3R5cGU9aGlkZGVuXSksc2VsZWN0Om5vdCg6ZGlzYWJsZWQpOm5vdChbcmVhZG9ubHldKSx0ZXh0YXJlYTpub3QoOmRpc2FibGVkKTpub3QoW3JlYWRvbmx5XSksIGJ1dHRvbjpub3QoOmRpc2FibGVkKTpub3QoW3JlYWRvbmx5XSksIFt0YWJpbmRleF06bm90KFt0YWJpbmRleF49XFxcIi1cXFwiXSlcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBQb3B1cEJhc2VWaWV3TW9kZWwgZXh0ZW5kcyBCYXNlIHtcclxuICBwcml2YXRlIHByZXZBY3RpdmVFbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICBwcml2YXRlIHNjcm9sbEV2ZW50Q2FsbEJhY2sgPSAoKSA9PiB0aGlzLmhpZGVQb3B1cCgpO1xyXG5cclxuICBAcHJvcGVydHkoeyBkZWZhdWx0VmFsdWU6IFwiMHB4XCIgfSkgdG9wOiBzdHJpbmc7XHJcbiAgQHByb3BlcnR5KHsgZGVmYXVsdFZhbHVlOiBcIjBweFwiIH0pIGxlZnQ6IHN0cmluZztcclxuICBAcHJvcGVydHkoeyBkZWZhdWx0VmFsdWU6IFwiYXV0b1wiIH0pIGhlaWdodDogc3RyaW5nO1xyXG4gIEBwcm9wZXJ0eSh7IGRlZmF1bHRWYWx1ZTogZmFsc2UgfSkgaXNWaXNpYmxlOiBib29sZWFuO1xyXG4gIEBwcm9wZXJ0eSh7IGRlZmF1bHRWYWx1ZTogXCJsZWZ0XCIgfSkgcG9wdXBEaXJlY3Rpb246IHN0cmluZztcclxuICBAcHJvcGVydHkoeyBkZWZhdWx0VmFsdWU6IHsgbGVmdDogXCIwcHhcIiwgdG9wOiBcIjBweFwiIH0gfSlcclxuICBwb2ludGVyVGFyZ2V0OiBJUG9zaXRpb247XHJcbiAgcHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcblxyXG4gIHByaXZhdGUgaGlkZVBvcHVwKCkge1xyXG4gICAgdGhpcy5tb2RlbC5pc1Zpc2libGUgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX21vZGVsOiBQb3B1cE1vZGVsO1xyXG4gIHB1YmxpYyBnZXQgbW9kZWwoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fbW9kZWw7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgbW9kZWwobW9kZWw6IFBvcHVwTW9kZWwpIHtcclxuICAgIGlmKCEhdGhpcy5tb2RlbCkge1xyXG4gICAgICB0aGlzLm1vZGVsLnVuUmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydGllc1ZhbHVlQ2hhbmdlZChbXCJpc1Zpc2libGVcIl0sIFwiUG9wdXBCYXNlVmlld01vZGVsXCIpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fbW9kZWwgPSBtb2RlbDtcclxuICAgIGNvbnN0IHVwZGF0ZXIgPSAoKSA9PiB7XHJcbiAgICAgIGlmICghbW9kZWwuaXNWaXNpYmxlKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVPbkhpZGluZygpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuaXNWaXNpYmxlID0gbW9kZWwuaXNWaXNpYmxlO1xyXG4gICAgfTtcclxuICAgIG1vZGVsLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwiaXNWaXNpYmxlXCIsIHVwZGF0ZXIsIFwiUG9wdXBCYXNlVmlld01vZGVsXCIpO1xyXG4gICAgdXBkYXRlcigpO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IobW9kZWw6IFBvcHVwTW9kZWwsIHB1YmxpYyB0YXJnZXRFbGVtZW50PzogSFRNTEVsZW1lbnQpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICB0aGlzLm1vZGVsID0gbW9kZWw7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgdGl0bGUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLm1vZGVsLnRpdGxlO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IGNvbnRlbnRDb21wb25lbnROYW1lKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5tb2RlbC5jb250ZW50Q29tcG9uZW50TmFtZTtcclxuICB9XHJcbiAgcHVibGljIGdldCBjb250ZW50Q29tcG9uZW50RGF0YSgpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMubW9kZWwuY29udGVudENvbXBvbmVudERhdGE7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgc2hvd1BvaW50ZXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5tb2RlbC5zaG93UG9pbnRlcjtcclxuICB9XHJcbiAgcHVibGljIGdldCBpc01vZGFsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMubW9kZWwuaXNNb2RhbDtcclxuICB9XHJcbiAgcHVibGljIGdldCBzdHlsZUNsYXNzKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gbmV3IENzc0NsYXNzQnVpbGRlcigpXHJcbiAgICAgIC5hcHBlbmQodGhpcy5tb2RlbC5jc3NDbGFzcylcclxuICAgICAgLmFwcGVuZChcInN2LXBvcHVwLS1tb2RhbFwiLCB0aGlzLmlzTW9kYWwpXHJcbiAgICAgIC5hcHBlbmQoXCJzdi1wb3B1cC0tc2hvdy1wb2ludGVyXCIsICF0aGlzLmlzTW9kYWwgJiYgdGhpcy5zaG93UG9pbnRlcilcclxuICAgICAgLmFwcGVuZChgc3YtcG9wdXAtLSR7dGhpcy5wb3B1cERpcmVjdGlvbn1gLCAhdGhpcy5pc01vZGFsICYmIHRoaXMuc2hvd1BvaW50ZXIpXHJcbiAgICAgIC50b1N0cmluZygpO1xyXG4gIH1cclxuICBwdWJsaWMgb25LZXlEb3duKGV2ZW50OiBhbnkpIHtcclxuICAgIGlmIChldmVudC5rZXkgPT09IFwiVGFiXCIgfHwgZXZlbnQua2V5Q29kZSA9PT0gOSkge1xyXG4gICAgICB0aGlzLnRyYXBGb2N1cyhldmVudCk7XHJcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gXCJFc2NhcGVcIiB8fCBldmVudC5rZXlDb2RlID09PSAyNykge1xyXG4gICAgICBpZiAodGhpcy5pc01vZGFsKSB7XHJcbiAgICAgICAgdGhpcy5tb2RlbC5vbkNhbmNlbCgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuaGlkZVBvcHVwKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHByaXZhdGUgdHJhcEZvY3VzKGV2ZW50OiBhbnkpIHtcclxuICAgIGNvbnN0IGZvY3VzYWJsZUVsZW1lbnRzID0gdGhpcy5jb250YWluZXIucXVlcnlTZWxlY3RvckFsbChGT0NVU19JTlBVVF9TRUxFQ1RPUik7XHJcbiAgICBjb25zdCBmaXJzdEZvY3VzYWJsZUVsZW1lbnQgPSBmb2N1c2FibGVFbGVtZW50c1swXTtcclxuICAgIGNvbnN0IGxhc3RGb2N1c2FibGVFbGVtZW50ID0gZm9jdXNhYmxlRWxlbWVudHNbZm9jdXNhYmxlRWxlbWVudHMubGVuZ3RoIC0gMV07XHJcbiAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcclxuICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IGZpcnN0Rm9jdXNhYmxlRWxlbWVudCkge1xyXG4gICAgICAgICg8SFRNTEVsZW1lbnQ+bGFzdEZvY3VzYWJsZUVsZW1lbnQpLmZvY3VzKCk7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IGxhc3RGb2N1c2FibGVFbGVtZW50KSB7XHJcbiAgICAgICAgKDxIVE1MRWxlbWVudD5maXJzdEZvY3VzYWJsZUVsZW1lbnQpLmZvY3VzKCk7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBwdWJsaWMgdXBkYXRlT25TaG93aW5nKCkge1xyXG4gICAgdGhpcy5wcmV2QWN0aXZlRWxlbWVudCA9IDxIVE1MRWxlbWVudD5kb2N1bWVudC5hY3RpdmVFbGVtZW50O1xyXG4gICAgaWYgKCF0aGlzLmlzTW9kYWwpIHtcclxuICAgICAgdGhpcy51cGRhdGVQb3NpdGlvbigpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5mb2N1c0ZpcnN0SW5wdXQoKTtcclxuICAgIGlmICghdGhpcy5pc01vZGFsKSB7XHJcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMuc2Nyb2xsRXZlbnRDYWxsQmFjayk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHB1YmxpYyB1cGRhdGVPbkhpZGluZygpIHtcclxuICAgIHRoaXMucHJldkFjdGl2ZUVsZW1lbnQgJiYgdGhpcy5wcmV2QWN0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgaWYgKCF0aGlzLmlzTW9kYWwpIHtcclxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5zY3JvbGxFdmVudENhbGxCYWNrKTtcclxuICAgIH1cclxuICB9XHJcbiAgcHJpdmF0ZSB1cGRhdGVQb3NpdGlvbigpIHtcclxuICAgIGNvbnN0IHJlY3QgPSB0aGlzLnRhcmdldEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBjb25zdCBiYWNrZ3JvdW5kID0gPEhUTUxFbGVtZW50PnRoaXMuY29udGFpbmVyLmNoaWxkcmVuWzBdO1xyXG4gICAgY29uc3QgcG9wdXBDb250YWluZXIgPSA8SFRNTEVsZW1lbnQ+YmFja2dyb3VuZC5jaGlsZHJlblswXTtcclxuICAgIGNvbnN0IHNjcm9sbENvbnRlbnQgPSA8SFRNTEVsZW1lbnQ+YmFja2dyb3VuZC5jaGlsZHJlblswXS5xdWVyeVNlbGVjdG9yKFwiLnN2LXBvcHVwX19zY3JvbGxpbmctY29udGVudFwiKTtcclxuICAgIGxldCBoZWlnaHQgPVxyXG4gICAgICBwb3B1cENvbnRhaW5lci5vZmZzZXRIZWlnaHQgLVxyXG4gICAgICBzY3JvbGxDb250ZW50Lm9mZnNldEhlaWdodCArXHJcbiAgICAgIHNjcm9sbENvbnRlbnQuc2Nyb2xsSGVpZ2h0O1xyXG4gICAgY29uc3Qgd2lkdGggPSBwb3B1cENvbnRhaW5lci5vZmZzZXRXaWR0aDtcclxuICAgIHRoaXMuaGVpZ2h0ID0gXCJhdXRvXCI7XHJcbiAgICBsZXQgdmVydGljYWxQb3NpdGlvbiA9IHRoaXMubW9kZWwudmVydGljYWxQb3NpdGlvbjtcclxuICAgIGlmICghIXdpbmRvdykge1xyXG4gICAgICBoZWlnaHQgPSBNYXRoLm1pbihoZWlnaHQsIHdpbmRvdy5pbm5lckhlaWdodCAqIDAuOSk7XHJcbiAgICAgIHZlcnRpY2FsUG9zaXRpb24gPSBQb3B1cFV0aWxzLnVwZGF0ZVZlcnRpY2FsUG9zaXRpb24oXHJcbiAgICAgICAgcmVjdCxcclxuICAgICAgICBoZWlnaHQsXHJcbiAgICAgICAgdGhpcy5tb2RlbC52ZXJ0aWNhbFBvc2l0aW9uLFxyXG4gICAgICAgIHRoaXMubW9kZWwuc2hvd1BvaW50ZXIsXHJcbiAgICAgICAgd2luZG93LmlubmVySGVpZ2h0XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnBvcHVwRGlyZWN0aW9uID0gUG9wdXBVdGlscy5jYWxjdWxhdGVQb3B1cERpcmVjdGlvbihcclxuICAgICAgdmVydGljYWxQb3NpdGlvbixcclxuICAgICAgdGhpcy5tb2RlbC5ob3Jpem9udGFsUG9zaXRpb25cclxuICAgICk7XHJcbiAgICBjb25zdCBwb3MgPSBQb3B1cFV0aWxzLmNhbGN1bGF0ZVBvc2l0aW9uKFxyXG4gICAgICByZWN0LFxyXG4gICAgICBoZWlnaHQsXHJcbiAgICAgIHdpZHRoLFxyXG4gICAgICB2ZXJ0aWNhbFBvc2l0aW9uLFxyXG4gICAgICB0aGlzLm1vZGVsLmhvcml6b250YWxQb3NpdGlvbixcclxuICAgICAgdGhpcy5zaG93UG9pbnRlclxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAoISF3aW5kb3cpIHtcclxuICAgICAgY29uc3QgbmV3VmVydGljYWxEaW1lbnNpb25zID0gUG9wdXBVdGlscy51cGRhdGVWZXJ0aWNhbERpbWVuc2lvbnMoXHJcbiAgICAgICAgcG9zLnRvcCxcclxuICAgICAgICBoZWlnaHQsXHJcbiAgICAgICAgd2luZG93LmlubmVySGVpZ2h0XHJcbiAgICAgICk7XHJcbiAgICAgIGlmICghIW5ld1ZlcnRpY2FsRGltZW5zaW9ucykge1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gbmV3VmVydGljYWxEaW1lbnNpb25zLmhlaWdodCArIFwicHhcIjtcclxuICAgICAgICBwb3MudG9wID0gbmV3VmVydGljYWxEaW1lbnNpb25zLnRvcDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5sZWZ0ID0gcG9zLmxlZnQgKyBcInB4XCI7XHJcbiAgICB0aGlzLnRvcCA9IHBvcy50b3AgKyBcInB4XCI7XHJcblxyXG4gICAgaWYgKHRoaXMuc2hvd1BvaW50ZXIpIHtcclxuICAgICAgdGhpcy5wb2ludGVyVGFyZ2V0ID0gUG9wdXBVdGlscy5jYWxjdWxhdGVQb2ludGVyVGFyZ2V0KFxyXG4gICAgICAgIHJlY3QsXHJcbiAgICAgICAgcG9zLnRvcCxcclxuICAgICAgICBwb3MubGVmdCxcclxuICAgICAgICB2ZXJ0aWNhbFBvc2l0aW9uLFxyXG4gICAgICAgIHRoaXMubW9kZWwuaG9yaXpvbnRhbFBvc2l0aW9uXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnBvaW50ZXJUYXJnZXQudG9wICs9IFwicHhcIjtcclxuICAgIHRoaXMucG9pbnRlclRhcmdldC5sZWZ0ICs9IFwicHhcIjtcclxuICB9XHJcbiAgcHJpdmF0ZSBmb2N1c0ZpcnN0SW5wdXQoKSB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdmFyIGVsID0gdGhpcy5jb250YWluZXIucXVlcnlTZWxlY3RvcihGT0NVU19JTlBVVF9TRUxFQ1RPUik7XHJcbiAgICAgIGlmICghIWVsKSAoPEhUTUxFbGVtZW50PmVsKS5mb2N1cygpO1xyXG4gICAgICBlbHNlICg8SFRNTEVsZW1lbnQ+dGhpcy5jb250YWluZXIuY2hpbGRyZW5bMF0pLmZvY3VzKCk7XHJcbiAgICB9LCAxMDApO1xyXG4gIH1cclxuICBwdWJsaWMgY2xpY2tPdXRzaWRlKCkge1xyXG4gICAgaWYgKHRoaXMuaXNNb2RhbCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmhpZGVQb3B1cCgpO1xyXG4gIH1cclxuICBwdWJsaWMgY2FuY2VsKCkge1xyXG4gICAgdGhpcy5tb2RlbC5vbkNhbmNlbCgpO1xyXG4gICAgdGhpcy5oaWRlUG9wdXAoKTtcclxuICB9XHJcbiAgcHVibGljIGFwcGx5KCkge1xyXG4gICAgaWYgKCEhdGhpcy5tb2RlbC5vbkFwcGx5ICYmICF0aGlzLm1vZGVsLm9uQXBwbHkoKSkgcmV0dXJuO1xyXG4gICAgdGhpcy5oaWRlUG9wdXAoKTtcclxuICB9XHJcbiAgcHVibGljIGdldCBjYW5jZWxCdXR0b25UZXh0KCkge1xyXG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJtb2RhbENhbmNlbEJ1dHRvblRleHRcIik7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgYXBwbHlCdXR0b25UZXh0KCkge1xyXG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJtb2RhbEFwcGx5QnV0dG9uVGV4dFwiKTtcclxuICB9XHJcbiAgcHVibGljIGRpc3Bvc2UoKSB7XHJcbiAgICBzdXBlci5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLm1vZGVsLm9uVmlzaWJpbGl0eUNoYW5nZWQgPSB1bmRlZmluZWQ7XHJcbiAgfVxyXG4gIHB1YmxpYyBjcmVhdGVQb3B1cENvbnRhaW5lcigpIHtcclxuICAgIGNvbnN0IGNvbnRhaW5lcjogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XHJcbiAgfVxyXG4gIHB1YmxpYyBtb3VudFBvcHVwQ29udGFpbmVyKCkge1xyXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmNvbnRhaW5lcik7XHJcbiAgfVxyXG4gIHB1YmxpYyBpbml0aWFsaXplUG9wdXBDb250YWluZXIoKSB7XHJcbiAgICB0aGlzLmNyZWF0ZVBvcHVwQ29udGFpbmVyKCk7XHJcbiAgICB0aGlzLm1vdW50UG9wdXBDb250YWluZXIoKTtcclxuICB9XHJcbiAgcHVibGljIGRlc3Ryb3lQb3B1cENvbnRhaW5lcigpIHtcclxuICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZSgpO1xyXG4gICAgdGhpcy5jb250YWluZXIgPSB1bmRlZmluZWQ7XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IEhhc2hUYWJsZSwgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IEpzb25PYmplY3QsIFNlcmlhbGl6ZXIsIHByb3BlcnR5IH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgQmFzZSwgRXZlbnRCYXNlIH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgSUVsZW1lbnQsIElRdWVzdGlvbiwgSVBhbmVsLCBJQ29uZGl0aW9uUnVubmVyLCBJU3VydmV5SW1wbCwgSVBhZ2UsIElUaXRsZU93bmVyLCBJUHJvZ3Jlc3NJbmZvLCBJU3VydmV5IH0gZnJvbSBcIi4vYmFzZS1pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBTdXJ2ZXlFbGVtZW50IH0gZnJvbSBcIi4vc3VydmV5LWVsZW1lbnRcIjtcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7IEFuc3dlclJlcXVpcmVkRXJyb3IsIEN1c3RvbUVycm9yIH0gZnJvbSBcIi4vZXJyb3JcIjtcbmltcG9ydCB7IFN1cnZleVZhbGlkYXRvciwgSVZhbGlkYXRvck93bmVyLCBWYWxpZGF0b3JSdW5uZXIgfSBmcm9tIFwiLi92YWxpZGF0b3JcIjtcbmltcG9ydCB7IFRleHRQcmVQcm9jZXNzb3IsIFRleHRQcmVQcm9jZXNzb3JWYWx1ZSB9IGZyb20gXCIuL3RleHRQcmVQcm9jZXNzb3JcIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IENvbmRpdGlvblJ1bm5lciwgRXhwcmVzc2lvblJ1bm5lciB9IGZyb20gXCIuL2NvbmRpdGlvbnNcIjtcbmltcG9ydCB7IFF1ZXN0aW9uQ3VzdG9tV2lkZ2V0IH0gZnJvbSBcIi4vcXVlc3Rpb25DdXN0b21XaWRnZXRzXCI7XG5pbXBvcnQgeyBDdXN0b21XaWRnZXRDb2xsZWN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25DdXN0b21XaWRnZXRzXCI7XG5pbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzXCI7XG5pbXBvcnQgeyBTdXJ2ZXlNb2RlbCB9IGZyb20gXCIuL3N1cnZleVwiO1xuaW1wb3J0IHsgUGFuZWxNb2RlbCB9IGZyb20gXCIuL3BhbmVsXCI7XG5pbXBvcnQgeyBSZW5kZXJlckZhY3RvcnkgfSBmcm9tIFwiLi9yZW5kZXJlckZhY3RvcnlcIjtcbmltcG9ydCB7IFN1cnZleUVycm9yIH0gZnJvbSBcIi4vc3VydmV5LWVycm9yXCI7XG5pbXBvcnQgeyBDc3NDbGFzc0J1aWxkZXIgfSBmcm9tIFwiLi91dGlscy9jc3NDbGFzc0J1aWxkZXJcIjtcbmltcG9ydCB7IGluY3JlYXNlSGVpZ2h0QnlDb250ZW50IH0gZnJvbSBcIi4vdXRpbHMvdXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJQ29uZGl0aW9uT2JqZWN0IHtcbiAgbmFtZTogc3RyaW5nO1xuICB0ZXh0OiBzdHJpbmc7XG4gIHF1ZXN0aW9uOiBRdWVzdGlvbjtcbn1cblxuLyoqXG4gKiBBIGJhc2UgY2xhc3MgZm9yIGFsbCBxdWVzdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbiBleHRlbmRzIFN1cnZleUVsZW1lbnRcbiAgaW1wbGVtZW50cyBJUXVlc3Rpb24sIElDb25kaXRpb25SdW5uZXIsIElWYWxpZGF0b3JPd25lciwgSVRpdGxlT3duZXIge1xuICBbaW5kZXg6IHN0cmluZ106IGFueTtcbiAgcHJpdmF0ZSBzdGF0aWMgVGV4dFByZXByb2Nlc3NvclZhbHVlc01hcCA9IHtcbiAgICB0aXRsZTogXCJwcm9jZXNzZWRUaXRsZVwiLFxuICAgIHJlcXVpcmU6IFwicmVxdWlyZWRUZXh0XCIsXG4gIH07XG4gIHByaXZhdGUgc3RhdGljIHF1ZXN0aW9uQ291bnRlciA9IDEwMDtcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0UXVlc3Rpb25JZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInNxX1wiICsgUXVlc3Rpb24ucXVlc3Rpb25Db3VudGVyKys7XG4gIH1cbiAgcHJpdmF0ZSBjb25kaXRpb25SdW5uZXI6IENvbmRpdGlvblJ1bm5lciA9IG51bGw7XG4gIHByaXZhdGUgaXNDdXN0b21XaWRnZXRSZXF1ZXN0ZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgY3VzdG9tV2lkZ2V0VmFsdWU6IFF1ZXN0aW9uQ3VzdG9tV2lkZ2V0O1xuICBjdXN0b21XaWRnZXREYXRhID0geyBpc05lZWRSZW5kZXI6IHRydWUgfTtcbiAgZm9jdXNDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgc3VydmV5TG9hZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBkaXNwbGF5VmFsdWVDYWxsYmFjazogKHRleHQ6IHN0cmluZykgPT4gc3RyaW5nO1xuXG4gIHByaXZhdGUgdGV4dFByZVByb2Nlc3NvcjogVGV4dFByZVByb2Nlc3NvcjtcbiAgcHJpdmF0ZSBjb25kaXRpb25FbmFiZWxSdW5uZXI6IENvbmRpdGlvblJ1bm5lcjtcbiAgcHJpdmF0ZSBjb25kaXRpb25SZXF1aXJlZFJ1bm5lcjogQ29uZGl0aW9uUnVubmVyO1xuICB2YWx1ZUNoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgY29tbWVudENoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgdmFsaWRhdGVWYWx1ZUNhbGxiYWNrOiAoKSA9PiBTdXJ2ZXlFcnJvcjtcbiAgcXVlc3Rpb25UaXRsZVRlbXBsYXRlQ2FsbGJhY2s6ICgpID0+IHN0cmluZztcbiAgYWZ0ZXJSZW5kZXJRdWVzdGlvbkNhbGxiYWNrOiAocXVlc3Rpb246IFF1ZXN0aW9uLCBlbGVtZW50OiBhbnkpID0+IGFueTtcbiAgdmFsdWVGcm9tRGF0YUNhbGxiYWNrOiAodmFsOiBhbnkpID0+IGFueTtcbiAgdmFsdWVUb0RhdGFDYWxsYmFjazogKHZhbDogYW55KSA9PiBhbnk7XG4gIG9uR2V0U3VydmV5OiAoKSA9PiBJU3VydmV5O1xuICBwcml2YXRlIGxvY1Byb2Nlc3NlZFRpdGxlOiBMb2NhbGl6YWJsZVN0cmluZztcbiAgcHJvdGVjdGVkIGlzUmVhZHlWYWx1ZTogYm9vbGVhbiA9IHRydWU7XG4gIHByaXZhdGUgY29tbWVudEVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgd2hlbiBpc1JlYWR5IHByb3BlcnR5IG9mIHF1ZXN0aW9uIGlzIGNoYW5nZWQuXG4gICAqIDxici8+IG9wdGlvbnMucXVlc3Rpb24gLSB0aGUgcXVlc3Rpb25cbiAgICogPGJyLz4gb3B0aW9ucy5pc1JlYWR5IC0gY3VycmVudCB2YWx1ZSBvZiBpc1JlYWR5XG4gICAqIDxici8+IG9wdGlvbnMub2xkSXNSZWFkeSAtIG9sZCB2YWx1ZSBvZiBpc1JlYWR5XG4gICAqL1xuICBwdWJsaWMgb25SZWFkeUNoYW5nZWQ6IEV2ZW50QmFzZTxRdWVzdGlvbj4gPSB0aGlzLmFkZEV2ZW50PFF1ZXN0aW9uPigpO1xuXG4gIHB1YmxpYyBpc1JlYWRPbmx5UmVuZGVyRGl2KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzUmVhZE9ubHkgJiYgc2V0dGluZ3MucmVhZE9ubHlDb21tZW50UmVuZGVyTW9kZSA9PT0gXCJkaXZcIjtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHRoaXMuaWQgPSBRdWVzdGlvbi5nZXRRdWVzdGlvbklkKCk7XG4gICAgdGhpcy5vbkNyZWF0aW5nKCk7XG4gICAgdGhpcy5jcmVhdGVOZXdBcnJheShcInZhbGlkYXRvcnNcIiwgKHZhbGlkYXRvcjogYW55KSA9PiB7XG4gICAgICB2YWxpZGF0b3IuZXJyb3JPd25lciA9IHRoaXM7XG4gICAgfSk7XG4gICAgdmFyIGxvY0NvbW1lbnRUZXh0ID0gdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcbiAgICAgIFwiY29tbWVudFRleHRcIixcbiAgICAgIHRoaXMsXG4gICAgICB0cnVlXG4gICAgKTtcbiAgICBsb2NDb21tZW50VGV4dC5vbkdldFRleHRDYWxsYmFjayA9ICh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgICAgcmV0dXJuICEhdGV4dCA/IHRleHQgOiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwib3RoZXJJdGVtVGV4dFwiKTtcbiAgICB9O1xuXG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInJlcXVpcmVkRXJyb3JUZXh0XCIsIHRoaXMpO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJ3aWR0aFwiLCAoKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZVF1ZXN0aW9uQ3NzKCk7XG4gICAgICBpZiAoISF0aGlzLnBhcmVudCkge1xuICAgICAgICB0aGlzLnBhcmVudC5lbGVtZW50V2lkdGhDaGFuZ2VkKHRoaXMpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJpc1JlcXVpcmVkXCIsICgpID0+IHtcbiAgICAgIHRoaXMubG9jVGl0bGUub25DaGFuZ2VkKCk7XG4gICAgICB0aGlzLmNzc0NsYXNzZXNWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoXG4gICAgICBbXCJpbmRlbnRcIiwgXCJyaWdodEluZGVudFwiXSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5vbkluZGVudENoYW5nZWQoKTtcbiAgICAgIH1cbiAgICApO1xuXG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0aWVzVmFsdWVDaGFuZ2VkKFxuICAgICAgW1wiaGFzQ29tbWVudFwiLCBcImhhc090aGVyXCJdLFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLmluaXRDb21tZW50RnJvbVN1cnZleSgpO1xuICAgICAgfVxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZUxvY1RpdGxlUHJvcGVydHkoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIGNvbnN0IGxvY1RpdGxlVmFsdWUgPSBzdXBlci5jcmVhdGVMb2NUaXRsZVByb3BlcnR5KCk7XG4gICAgbG9jVGl0bGVWYWx1ZS5vbkdldFRleHRDYWxsYmFjayA9ICh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgICAgaWYgKCF0ZXh0KSB7XG4gICAgICAgIHRleHQgPSB0aGlzLm5hbWU7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuc3VydmV5KSByZXR1cm4gdGV4dDtcbiAgICAgIHJldHVybiB0aGlzLnN1cnZleS5nZXRVcGRhdGVkUXVlc3Rpb25UaXRsZSh0aGlzLCB0ZXh0KTtcbiAgICB9O1xuICAgIHRoaXMubG9jUHJvY2Vzc2VkVGl0bGUgPSBuZXcgTG9jYWxpemFibGVTdHJpbmcodGhpcywgdHJ1ZSk7XG4gICAgdGhpcy5sb2NQcm9jZXNzZWRUaXRsZS5zaGFyZWREYXRhID0gbG9jVGl0bGVWYWx1ZTtcbiAgICByZXR1cm4gbG9jVGl0bGVWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdXJ2ZXkobGl2ZTogYm9vbGVhbiA9IGZhbHNlKTogSVN1cnZleSB7XG4gICAgaWYgKGxpdmUpIHtcbiAgICAgIHJldHVybiAhIXRoaXMucGFyZW50ID8gKDxCYXNlPig8YW55PnRoaXMucGFyZW50KSkuZ2V0U3VydmV5KGxpdmUpIDogbnVsbDtcbiAgICB9XG4gICAgaWYgKCEhdGhpcy5vbkdldFN1cnZleSkgcmV0dXJuIHRoaXMub25HZXRTdXJ2ZXkoKTtcbiAgICByZXR1cm4gc3VwZXIuZ2V0U3VydmV5KCk7XG4gIH1cbiAgcHVibGljIGdldFZhbHVlTmFtZSgpOiBzdHJpbmcge1xuICAgIGlmICghIXRoaXMudmFsdWVOYW1lKSByZXR1cm4gdGhpcy52YWx1ZU5hbWUudG9TdHJpbmcoKTtcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSBpZiB5b3Ugd2FudCB0byBzdG9yZSB0aGUgcXVlc3Rpb24gcmVzdWx0IGluIHRoZSBuYW1lIGRpZmZlcmVudCBmcm9tIHRoZSBxdWVzdGlvbiBuYW1lLlxuICAgKiBRdWVzdGlvbiBuYW1lIHNob3VsZCBiZSB1bmlxdWUgaW4gdGhlIHN1cnZleSBhbmQgdmFsdWVOYW1lIGNvdWxkIGJlIG5vdCB1bmlxdWUuIEl0IGFsbG93cyB0byBzaGFyZSBkYXRhIGJldHdlZW4gc2V2ZXJhbCBxdWVzdGlvbnMgd2l0aCB0aGUgc2FtZSB2YWx1ZU5hbWUuXG4gICAqIFRoZSBsaWJyYXJ5IHNldCB0aGUgdmFsdWUgYXV0b21hdGljYWxseSBpZiB0aGUgcXVlc3Rpb24ubmFtZSBwcm9wZXJ0eSBpcyBub3QgdmFsaWQuIEZvciBleGFtcGxlLCBpZiBpdCBjb250YWlucyB0aGUgcGVyaW9kICcuJyBzeW1ib2wuXG4gICAqIEluIHRoaXMgY2FzZSBpZiB5b3Ugc2V0IHRoZSBxdWVzdGlvbi5uYW1lIHByb3BlcnR5IHRvICd4LnknIHRoZW4gdGhlIHZhbHVlTmFtZSBiZWNvbWVzICd4IHknLlxuICAgKiBQbGVhc2Ugbm90ZSwgdGhpcyBwcm9wZXJ0eSBpcyBoaWRkZW4gZm9yIHF1ZXN0aW9ucyB3aXRob3V0IGlucHV0LCBmb3IgZXhhbXBsZSBodG1sIHF1ZXN0aW9uLlxuICAgKiBAc2VlIG5hbWVcbiAgICovXG4gIHB1YmxpYyBnZXQgdmFsdWVOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZhbHVlTmFtZVwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZhbHVlTmFtZSh2YWw6IHN0cmluZykge1xuICAgIHZhciBvbGRWYWx1ZU5hbWUgPSB0aGlzLmdldFZhbHVlTmFtZSgpO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZhbHVlTmFtZVwiLCB2YWwpO1xuICAgIHRoaXMub25WYWx1ZU5hbWVDaGFuZ2VkKG9sZFZhbHVlTmFtZSk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uVmFsdWVOYW1lQ2hhbmdlZChvbGRWYWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSkgcmV0dXJuO1xuICAgIHRoaXMuc3VydmV5LnF1ZXN0aW9uUmVuYW1lZChcbiAgICAgIHRoaXMsXG4gICAgICB0aGlzLm5hbWUsXG4gICAgICAhIW9sZFZhbHVlID8gb2xkVmFsdWUgOiB0aGlzLm5hbWVcbiAgICApO1xuICAgIHRoaXMuaW5pdERhdGFGcm9tU3VydmV5KCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uTmFtZUNoYW5nZWQob2xkVmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubG9jVGl0bGUub25DaGFuZ2VkKCk7XG4gICAgaWYgKCF0aGlzLnN1cnZleSkgcmV0dXJuO1xuICAgIHRoaXMuc3VydmV5LnF1ZXN0aW9uUmVuYW1lZChcbiAgICAgIHRoaXMsXG4gICAgICBvbGRWYWx1ZSxcbiAgICAgIHRoaXMudmFsdWVOYW1lID8gdGhpcy52YWx1ZU5hbWUgOiBvbGRWYWx1ZVxuICAgICk7XG4gIH1cbiAgcHVibGljIGdldCBpc1JlYWR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzUmVhZHlWYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBMTFZIHByb3BlcnRpZXNcbiAgICovXG4gIHB1YmxpYyBnZXQgYXJpYVJlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzUmVxdWlyZWQ7XG4gIH1cbiAgcHVibGljIGdldCBhcmlhTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5sb2NUaXRsZS5yZW5kZXJlZEh0bWw7XG4gIH1cbiAgcHVibGljIGdldCBhcmlhSW52YWxpZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5lcnJvcnMubGVuZ3RoID4gMDtcbiAgfVxuICBwdWJsaWMgZ2V0IGFyaWFEZXNjcmliZWRCeSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmVycm9ycy5sZW5ndGggPiAwID8gdGhpcy5pZCArIFwiX2Vycm9yc1wiIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgaXMgcXVlc3Rpb24gcmVhZHkgdG8gdXNlXG4gICAqL1xuICBwdWJsaWMgY2hvaWNlc0xvYWRlZCgpOiB2b2lkIHsgfVxuICAvKipcbiAgICogR2V0L3NldCB0aGUgcGFnZSB3aGVyZSB0aGUgcXVlc3Rpb24gaXMgbG9jYXRlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcGFnZSgpOiBJUGFnZSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UGFnZSh0aGlzLnBhcmVudCk7XG4gIH1cbiAgcHVibGljIHNldCBwYWdlKHZhbDogSVBhZ2UpIHtcbiAgICB0aGlzLnNldFBhZ2UodGhpcy5wYXJlbnQsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldFBhbmVsKCk6IElQYW5lbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIGRlbGV0ZSgpOiB2b2lkIHtcbiAgICBpZiAoISF0aGlzLnBhcmVudCkge1xuICAgICAgdGhpcy5yZW1vdmVTZWxmRnJvbUxpc3QodGhpcy5wYXJlbnQuZWxlbWVudHMpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0IGlzRmxvd0xheW91dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMYXlvdXRUeXBlKCkgPT09IFwiZmxvd1wiO1xuICB9XG4gIHB1YmxpYyBnZXRMYXlvdXRUeXBlKCk6IHN0cmluZyB7XG4gICAgaWYgKCEhdGhpcy5wYXJlbnQpIHJldHVybiB0aGlzLnBhcmVudC5nZXRDaGlsZHJlbkxheW91dFR5cGUoKTtcbiAgICByZXR1cm4gXCJyb3dcIjtcbiAgfVxuICBpc0xheW91dFR5cGVTdXBwb3J0ZWQobGF5b3V0VHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGxheW91dFR5cGUgIT09IFwiZmxvd1wiO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgaXQgdG8gZ2V0L3NldCB0aGUgcXVlc3Rpb24gdmlzaWJpbGl0eS5cbiAgICogQHNlZSB2aXNpYmxlSWZcbiAgICovXG4gIHB1YmxpYyBnZXQgdmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidmlzaWJsZVwiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZpc2libGUodmFsOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbCA9PSB0aGlzLnZpc2libGUpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlXCIsIHZhbCk7XG4gICAgdGhpcy5vblZpc2libGVDaGFuZ2VkKCk7XG4gICAgdGhpcy5ub3RpZnlTdXJ2ZXlWaXNpYmlsaXR5Q2hhbmdlZCgpO1xuICB9XG4gIHByb3RlY3RlZCBvblZpc2libGVDaGFuZ2VkKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzVmlzaWJsZVwiLCB0aGlzLmlzVmlzaWJsZSk7XG4gICAgaWYgKHRoaXMuaXNWaXNpYmxlICYmIHRoaXMuc3VydmV5ICYmIHRoaXMuc3VydmV5LmlzQ2xlYXJWYWx1ZU9uSGlkZGVuKSB7XG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlV2l0aERlZmF1bHRzKCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc1Zpc2libGUgJiYgdGhpcy5lcnJvcnMgJiYgdGhpcy5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFVzZSBpdCB0byBjaG9vc2UgaG93IG90aGVyIHF1ZXN0aW9uIHZhbHVlcyB3aWxsIGJlIHJlbmRlcmVkIGluIHRpdGxlIGlmIHJlZmVyZW5jZWQgaW4ge30uXG4gICAqIFBsZWFzZSBub3RlLCB0aGlzIHByb3BlcnR5IGlzIGhpZGRlbiBmb3IgcXVlc3Rpb24gd2l0aG91dCBpbnB1dCwgZm9yIGV4YW1wbGUgaHRtbCBxdWVzdGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgdXNlRGlzcGxheVZhbHVlc0luVGl0bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInVzZURpc3BsYXlWYWx1ZXNJblRpdGxlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdXNlRGlzcGxheVZhbHVlc0luVGl0bGUodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidXNlRGlzcGxheVZhbHVlc0luVGl0bGVcIiwgdmFsKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0VXNlRGlzcGxheVZhbHVlc0luVGl0bGUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLnVzZURpc3BsYXlWYWx1ZXNJblRpdGxlOyB9XG4gIC8qKlxuICAgKiBBbiBleHByZXNzaW9uIHRoYXQgcmV0dXJucyB0cnVlIG9yIGZhbHNlLiBJZiBpdCByZXR1cm5zIHRydWUgdGhlIFF1ZXN0aW9uIGJlY29tZXMgdmlzaWJsZSBhbmQgaWYgaXQgcmV0dXJucyBmYWxzZSB0aGUgUXVlc3Rpb24gYmVjb21lcyBpbnZpc2libGUuIFRoZSBsaWJyYXJ5IHJ1bnMgdGhlIGV4cHJlc3Npb24gb24gc3VydmV5IHN0YXJ0IGFuZCBvbiBjaGFuZ2luZyBhIHF1ZXN0aW9uIHZhbHVlLiBJZiB0aGUgcHJvcGVydHkgaXMgZW1wdHkgdGhlbiB2aXNpYmxlIHByb3BlcnR5IGlzIHVzZWQuXG4gICAqIEBzZWUgdmlzaWJsZVxuICAgKi9cbiAgcHVibGljIGdldCB2aXNpYmxlSWYoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidmlzaWJsZUlmXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdmlzaWJsZUlmKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidmlzaWJsZUlmXCIsIHZhbCk7XG4gICAgdGhpcy5ydW5Db25kaXRpb25zKCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcXVlc3Rpb24gaXMgdmlzaWJsZSBvciBzdXJ2ZXkgaXMgaW4gZGVzaWduIG1vZGUgcmlnaHQgbm93LlxuICAgKi9cbiAgcHVibGljIGdldCBpc1Zpc2libGUoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuc3VydmV5ICYmIHRoaXMuc3VydmV5LmFyZUVtcHR5RWxlbWVudHNIaWRkZW4gJiYgdGhpcy5pc0VtcHR5KCkpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZSB8fCB0aGlzLmFyZUludmlzaWJsZUVsZW1lbnRzU2hvd2luZztcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdmlzaWJsZSBpbmRleCBvZiB0aGUgcXVlc3Rpb24gaW4gdGhlIHN1cnZleS4gSXQgY2FuIGJlIGZyb20gMCB0byBhbGwgdmlzaWJsZSBxdWVzdGlvbnMgY291bnQgLSAxXG4gICAqIFRoZSB2aXNpYmxlSW5kZXggaXMgLTEgaWYgdGhlIHRpdGxlIGlzICdoaWRkZW4nIG9yIGhpZGVOdW1iZXIgaXMgdHJ1ZVxuICAgKiBAc2VlIHRpdGxlTG9jYXRpb25cbiAgICogQHNlZSBoaWRlTnVtYmVyXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGVJbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlSW5kZXhcIiwgLTEpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaGlkZU51bWJlciB0byB0cnVlIHRvIHN0b3Agc2hvd2luZyB0aGUgbnVtYmVyIGZvciB0aGlzIHF1ZXN0aW9uLiBUaGUgcXVlc3Rpb24gd2lsbCBub3QgYmUgY291bnRlclxuICAgKiBAc2VlIHZpc2libGVJbmRleFxuICAgKiBAc2VlIHRpdGxlTG9jYXRpb25cbiAgICovXG4gIHB1YmxpYyBnZXQgaGlkZU51bWJlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaGlkZU51bWJlclwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGhpZGVOdW1iZXIodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaGlkZU51bWJlclwiLCB2YWwpO1xuICAgIHRoaXMubm90aWZ5U3VydmV5VmlzaWJpbGl0eUNoYW5nZWQoKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBxdWVzdGlvbiBtYXkgaGF2ZSBhIHRpdGxlIGxvY2F0ZWQgb24gdGhlIGxlZnRcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNBbGxvd1RpdGxlTGVmdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IGFzIGEgc3RyaW5nIGFzIGl0IHJlcHJlc2VudHMgaW4gdGhlIGpzb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInF1ZXN0aW9uXCI7XG4gIH1cbiAgcHVibGljIGdldCBpc1F1ZXN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBNb3ZlIHF1ZXN0aW9uIHRvIGEgbmV3IGNvbnRhaW5lciBQYWdlL1BhbmVsLiBBZGQgYXMgYSBsYXN0IGVsZW1lbnQgaWYgaW5zZXJ0QmVmb3JlIHBhcmFtZXRlciBpcyBub3QgdXNlZCBvciBpbnNlcnRlZCBpbnRvIHRoZSBnaXZlbiBpbmRleCxcbiAgICogaWYgaW5zZXJ0IHBhcmFtZXRlciBpcyBudW1iZXIsIG9yIGJlZm9yZSB0aGUgZ2l2ZW4gZWxlbWVudCwgaWYgdGhlIGluc2VydEJlZm9yZSBwYXJhbWV0ZXIgaXMgYSBxdWVzdGlvbiBvciBwYW5lbFxuICAgKiBAcGFyYW0gY29udGFpbmVyIFBhZ2Ugb3IgUGFuZWwgdG8gd2hlcmUgYSBxdWVzdGlvbiBpcyByZWxvY2F0ZWQuXG4gICAqIEBwYXJhbSBpbnNlcnRCZWZvcmUgVXNlIGl0IGlmIHlvdSB3YW50IHRvIHNldCB0aGUgcXVlc3Rpb24gdG8gYSBzcGVjaWZpYyBwb3NpdGlvbi4gWW91IG1heSB1c2UgYSBudW1iZXIgKHVzZSAwIHRvIGluc2VydCBpbnQgdGhlIGJlZ2lubmluZykgb3IgZWxlbWVudCwgaWYgeW91IHdhbnQgdG8gaW5zZXJ0IGJlZm9yZSB0aGlzIGVsZW1lbnQuXG4gICAqL1xuICBwdWJsaWMgbW92ZVRvKGNvbnRhaW5lcjogSVBhbmVsLCBpbnNlcnRCZWZvcmU6IGFueSA9IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tb3ZlVG9CYXNlKHRoaXMucGFyZW50LCBjb250YWluZXIsIGluc2VydEJlZm9yZSk7XG4gIH1cbiAgcHVibGljIGdldFByb2dyZXNzSW5mbygpOiBJUHJvZ3Jlc3NJbmZvIHtcbiAgICBpZiAoIXRoaXMuaGFzSW5wdXQpIHJldHVybiBzdXBlci5nZXRQcm9ncmVzc0luZm8oKTtcbiAgICByZXR1cm4ge1xuICAgICAgcXVlc3Rpb25Db3VudDogMSxcbiAgICAgIGFuc3dlcmVkUXVlc3Rpb25Db3VudDogIXRoaXMuaXNFbXB0eSgpID8gMSA6IDAsXG4gICAgICByZXF1aXJlZFF1ZXN0aW9uQ291bnQ6IHRoaXMuaXNSZXF1aXJlZCA/IDEgOiAwLFxuICAgICAgcmVxdWlyZWRBbnN3ZXJlZFF1ZXN0aW9uQ291bnQ6ICF0aGlzLmlzRW1wdHkoKSAmJiB0aGlzLmlzUmVxdWlyZWQgPyAxIDogMCxcbiAgICB9O1xuICB9XG4gIHByaXZhdGUgcnVuQ29uZGl0aW9ucygpIHtcbiAgICBpZiAodGhpcy5kYXRhICYmICF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSB7XG4gICAgICBpZiAoIXRoaXMuaXNEZXNpZ25Nb2RlKSB7XG4gICAgICAgIHRoaXMucnVuQ29uZGl0aW9uKFxuICAgICAgICAgIHRoaXMuZ2V0RGF0YUZpbHRlcmVkVmFsdWVzKCksXG4gICAgICAgICAgdGhpcy5nZXREYXRhRmlsdGVyZWRQcm9wZXJ0aWVzKClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHNldFN1cnZleUltcGwodmFsdWU6IElTdXJ2ZXlJbXBsKTogdm9pZCB7XG4gICAgc3VwZXIuc2V0U3VydmV5SW1wbCh2YWx1ZSk7XG4gICAgaWYgKHRoaXMuc3VydmV5KSB7XG4gICAgICB0aGlzLnN1cnZleS5xdWVzdGlvbkNyZWF0ZWQodGhpcyk7XG4gICAgfVxuICAgIGlmICh0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5pc0Rlc2lnbk1vZGUgJiYgIXRoaXMuaXNEZXNpZ25Nb2RlKSB7XG4gICAgICB0aGlzLm9uVmlzaWJsZUNoYW5nZWQoKTtcbiAgICB9XG4gICAgdGhpcy5ydW5Db25kaXRpb25zKCk7XG4gIH1cbiAgcHVibGljIGdldERhdGFGaWx0ZXJlZFZhbHVlcygpOiBhbnkge1xuICAgIHJldHVybiAhIXRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRGaWx0ZXJlZFZhbHVlcygpIDogbnVsbDtcbiAgfVxuICBwdWJsaWMgZ2V0RGF0YUZpbHRlcmVkUHJvcGVydGllcygpOiBhbnkge1xuICAgIHZhciBwcm9wcyA9ICEhdGhpcy5kYXRhID8gdGhpcy5kYXRhLmdldEZpbHRlcmVkUHJvcGVydGllcygpIDoge307XG4gICAgcHJvcHMucXVlc3Rpb24gPSB0aGlzO1xuICAgIHJldHVybiBwcm9wcztcbiAgfVxuICAvKipcbiAgICogQSBwYXJlbnQgZWxlbWVudC4gSXQgY2FuIGJlIHBhbmVsIG9yIHBhZ2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhcmVudCgpOiBJUGFuZWwge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJwYXJlbnRcIiwgbnVsbCk7XG4gIH1cbiAgcHVibGljIHNldCBwYXJlbnQodmFsOiBJUGFuZWwpIHtcbiAgICBpZiAodGhpcy5wYXJlbnQgPT09IHZhbCkgcmV0dXJuO1xuICAgIHRoaXMuZGVsZXRlKCk7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicGFyZW50XCIsIHZhbCk7XG4gICAgdGhpcy51cGRhdGVRdWVzdGlvbkNzcygpO1xuICAgIHRoaXMub25QYXJlbnRDaGFuZ2VkKCk7XG4gIH1cbiAgcHJpdmF0ZSBwYXJlbnRRdWVzdGlvblZhbHVlOiBRdWVzdGlvbiA9IG51bGw7XG4gIC8qKlxuICAgKiBBIHBhcmVudCBxdWVzdGlvbi4gSXQgY2FuIGJlIGEgZHluYW1pYyBwYW5lbCBvciBkeW5hbWljL2Ryb3Bkb3duIG1hdHJpY2VzLiBJZiB0aGUgdmFsdWUgaXMgYSBtYXRyaXgsIGl0IG1lYW5zIHRoYXQgcXVlc3Rpb24gaXMgYSBjZWxsIHF1ZXN0aW9uLlxuICAgKiBUaGlzIHByb3BlcnR5IGlzIG51bGwgZm9yIGEgc3RhbmQgYWxvbmUgcXVlc3Rpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhcmVudFF1ZXN0aW9uKCk6IFF1ZXN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRRdWVzdGlvblZhbHVlO1xuICB9XG4gIHNldFBhcmVudFF1ZXN0aW9uKHZhbDogUXVlc3Rpb24pOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudFF1ZXN0aW9uVmFsdWUgPSB2YWw7XG4gICAgdGhpcy5vblBhcmVudFF1ZXN0aW9uQ2hhbmdlZCgpO1xuICB9XG4gIHByb3RlY3RlZCBvblBhcmVudFF1ZXN0aW9uQ2hhbmdlZCgpOiB2b2lkIHsgfVxuICBwcm90ZWN0ZWQgb25QYXJlbnRDaGFuZ2VkKCk6IHZvaWQgeyB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBxdWVzdGlvbiBkb2Vzbid0IGhhdmUgYSB0aXRsZSBwcm9wZXJ0eSwgZm9yIGV4YW1wbGU6IFF1ZXN0aW9uSHRtbE1vZGVsLCBvciB0aXRsZUxvY2F0aW9uIHByb3BlcnR5IGVxdWFscyB0byBcImhpZGRlblwiXG4gICAqIEBzZWUgdGl0bGVMb2NhdGlvblxuICAgKi9cbiAgcHVibGljIGdldCBoYXNUaXRsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRUaXRsZUxvY2F0aW9uKCkgIT09IFwiaGlkZGVuXCI7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IGRpZmZlcmVudCBmcm9tIFwiZGVmYXVsdFwiIHRvIHNldCB0aGUgc3BlY2lmaWMgcXVlc3Rpb24gdGl0bGUgbG9jYXRpb24gZm9yIHRoaXMgcGFuZWwvcGFnZS5cbiAgICogUGxlYXNlIG5vdGUsIHRoaXMgcHJvcGVydHkgaXMgaGlkZGVuIGZvciBxdWVzdGlvbnMgd2l0aG91dCBpbnB1dCwgZm9yIGV4YW1wbGUgaHRtbCBxdWVzdGlvbi5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5xdWVzdGlvblRpdGxlTG9jYXRpb25cbiAgICovXG4gIHB1YmxpYyBnZXQgdGl0bGVMb2NhdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ0aXRsZUxvY2F0aW9uXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGl0bGVMb2NhdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdmFyIGlzVmlzaWJpbGl0eUNoYW5nZWQgPVxuICAgICAgdGhpcy50aXRsZUxvY2F0aW9uID09IFwiaGlkZGVuXCIgfHwgdmFsdWUgPT0gXCJoaWRkZW5cIjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ0aXRsZUxvY2F0aW9uXCIsIHZhbHVlLnRvTG93ZXJDYXNlKCkpO1xuICAgIHRoaXMudXBkYXRlUXVlc3Rpb25Dc3MoKTtcbiAgICBpZiAoaXNWaXNpYmlsaXR5Q2hhbmdlZCkge1xuICAgICAgdGhpcy5ub3RpZnlTdXJ2ZXlWaXNpYmlsaXR5Q2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0VGl0bGVPd25lcigpOiBJVGl0bGVPd25lciB7IHJldHVybiB0aGlzOyB9XG4gIHByaXZhdGUgbm90aWZ5U3VydmV5VmlzaWJpbGl0eUNoYW5nZWQoKSB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSB8fCB0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdGhpcy5zdXJ2ZXkucXVlc3Rpb25WaXNpYmlsaXR5Q2hhbmdlZCh0aGlzLCB0aGlzLmlzVmlzaWJsZSk7XG4gICAgaWYgKHRoaXMuc3VydmV5LmlzQ2xlYXJWYWx1ZU9uSGlkZGVuICYmICF0aGlzLnZpc2libGUpIHtcbiAgICAgIHRoaXMuY2xlYXJWYWx1ZSgpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmV0dXJuIHRoZSB0aXRsZSBsb2NhdGlvbiBiYXNlZCBvbiBxdWVzdGlvbiB0aXRsZUxvY2F0aW9uIHByb3BlcnR5IGFuZCBRdWVzdGlvblRpdGxlTG9jYXRpb24gb2YgaXQncyBwYXJlbnRzXG4gICAqIEBzZWUgdGl0bGVMb2NhdGlvblxuICAgKiBAc2VlIFBhbmVsTW9kZWxCYXNlLlF1ZXN0aW9uVGl0bGVMb2NhdGlvblxuICAgKiBAc2VlIFN1cnZleU1vZGVsLlF1ZXN0aW9uVGl0bGVMb2NhdGlvblxuICAgKi9cbiAgcHVibGljIGdldFRpdGxlTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5pc0Zsb3dMYXlvdXQpIHJldHVybiBcImhpZGRlblwiO1xuICAgIHZhciBsb2NhdGlvbiA9IHRoaXMuZ2V0VGl0bGVMb2NhdGlvbkNvcmUoKTtcbiAgICBpZiAobG9jYXRpb24gPT09IFwibGVmdFwiICYmICF0aGlzLmlzQWxsb3dUaXRsZUxlZnQpIGxvY2F0aW9uID0gXCJ0b3BcIjtcbiAgICByZXR1cm4gbG9jYXRpb247XG4gIH1cbiAgcHJvdGVjdGVkIGdldFRpdGxlTG9jYXRpb25Db3JlKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMudGl0bGVMb2NhdGlvbiAhPT0gXCJkZWZhdWx0XCIpIHJldHVybiB0aGlzLnRpdGxlTG9jYXRpb247XG4gICAgaWYgKCEhdGhpcy5wYXJlbnQpIHJldHVybiB0aGlzLnBhcmVudC5nZXRRdWVzdGlvblRpdGxlTG9jYXRpb24oKTtcbiAgICBpZiAoISF0aGlzLnN1cnZleSkgcmV0dXJuIHRoaXMuc3VydmV5LnF1ZXN0aW9uVGl0bGVMb2NhdGlvbjtcbiAgICByZXR1cm4gXCJ0b3BcIjtcbiAgfVxuICBnZXQgaGFzVGl0bGVPbkxlZnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzVGl0bGUgJiYgdGhpcy5nZXRUaXRsZUxvY2F0aW9uKCkgPT09IFwibGVmdFwiO1xuICB9XG4gIGdldCBoYXNUaXRsZU9uVG9wKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc1RpdGxlICYmIHRoaXMuZ2V0VGl0bGVMb2NhdGlvbigpID09PSBcInRvcFwiO1xuICB9XG4gIGdldCBoYXNUaXRsZU9uQm90dG9tKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc1RpdGxlICYmIHRoaXMuZ2V0VGl0bGVMb2NhdGlvbigpID09PSBcImJvdHRvbVwiO1xuICB9XG4gIGdldCBoYXNUaXRsZU9uTGVmdFRvcCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuaGFzVGl0bGUpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBsb2NhdGlvbiA9IHRoaXMuZ2V0VGl0bGVMb2NhdGlvbigpO1xuICAgIHJldHVybiBsb2NhdGlvbiA9PT0gXCJsZWZ0XCIgfHwgbG9jYXRpb24gPT09IFwidG9wXCI7XG4gIH1cbiAgcHVibGljIGdldCBlcnJvckxvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5ID8gdGhpcy5zdXJ2ZXkucXVlc3Rpb25FcnJvckxvY2F0aW9uIDogXCJ0b3BcIjtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBmYWxzZSBpZiB0aGUgcXVlc3Rpb24gZG9lc24ndCBoYXZlIGFuIGlucHV0IGVsZW1lbnQsIGZvciBleGFtcGxlOiBRdWVzdGlvbkh0bWxNb2RlbFxuICAgKiBAc2VlIGhhc1NpbmdsZUlucHV0XG4gICAqL1xuICBwdWJsaWMgZ2V0IGhhc0lucHV0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBxdWVzdGlvbiBkb2Vzbid0IGhhdmUgYW4gaW5wdXQgZWxlbWVudCBvciBoYXZlIG11bHRpcGxlIGlucHV0czogbWF0cmljZXMgb3IgcGFuZWwgZHluYW1pY1xuICAgKiBAc2VlIGhhc0lucHV0XG4gICAqL1xuICBwdWJsaWMgZ2V0IGhhc1NpbmdsZUlucHV0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0lucHV0O1xuICB9XG4gIHB1YmxpYyBnZXQgaW5wdXRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlkICsgXCJpXCI7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRUaXRsZVZhbHVlKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLm5hbWU7IH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRUaXRsZVRhZ05hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc2V0dGluZ3MudGl0bGVUYWdzLnF1ZXN0aW9uO1xuICB9XG4gIC8qKlxuICAgKiBRdWVzdGlvbiBkZXNjcmlwdGlvbiBsb2NhdGlvbi4gQnkgZGVmYXVsdCwgdmFsdWUgaXMgXCJkZWZhdWx0XCIgYW5kIGl0IGRlcGVuZHMgb24gc3VydmV5IHF1ZXN0aW9uRGVzY3JpcHRpb25Mb2NhdGlvbiBwcm9wZXJ0eVxuICAgKiBZb3UgbWF5IGNoYW5nZSBpdCB0byBcInVuZGVySW5wdXRcIiB0byByZW5kZXIgaXQgdW5kZXIgcXVlc3Rpb24gaW5wdXQgb3IgXCJ1bmRlclRpdGxlXCIgdG8gcmVuZGVyZWQgaXQgdW5kZXIgdGl0bGUuXG4gICAqIEBzZWUgZGVzY3JpcHRpb25cbiAgICogQHNlZSBTdXJ2ZXkucXVlc3Rpb25EZXNjcmlwdGlvbkxvY2F0aW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGRlc2NyaXB0aW9uTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZGVzY3JpcHRpb25Mb2NhdGlvblwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRlc2NyaXB0aW9uTG9jYXRpb24odmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJkZXNjcmlwdGlvbkxvY2F0aW9uXCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGhhc0Rlc2NyaXB0aW9uVW5kZXJUaXRsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXREZXNjcmlwdGlvbkxvY2F0aW9uKCkgPT0gXCJ1bmRlclRpdGxlXCI7XG4gIH1cbiAgZ2V0IGhhc0Rlc2NyaXB0aW9uVW5kZXJJbnB1dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXREZXNjcmlwdGlvbkxvY2F0aW9uKCkgPT0gXCJ1bmRlcklucHV0XCI7XG4gIH1cbiAgcHJpdmF0ZSBnZXREZXNjcmlwdGlvbkxvY2F0aW9uKCkge1xuICAgIGlmICh0aGlzLmRlc2NyaXB0aW9uTG9jYXRpb24gIT09IFwiZGVmYXVsdFwiKSByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbkxvY2F0aW9uO1xuICAgIHJldHVybiAhIXRoaXMuc3VydmV5XG4gICAgICA/IHRoaXMuc3VydmV5LnF1ZXN0aW9uRGVzY3JpcHRpb25Mb2NhdGlvblxuICAgICAgOiBcInVuZGVyVGl0bGVcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGNsaWNrVGl0bGVGdW5jdGlvbigpOiBhbnkge1xuICAgIGlmICh0aGlzLmhhc0lucHV0KSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoc2VsZi5pc0NvbGxhcHNlZCkgcmV0dXJuO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBzZWxmLmZvY3VzKCk7XG4gICAgICAgIH0sIDEpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBjdXN0b20gdGV4dCB0aGF0IHdpbGwgYmUgc2hvd24gb24gcmVxdWlyZWQgZXJyb3IuIFVzZSB0aGlzIHByb3BlcnR5LCBpZiB5b3UgZG8gbm90IHdhbnQgdG8gc2hvdyB0aGUgZGVmYXVsdCB0ZXh0LlxuICAgKiBQbGVhc2Ugbm90ZSwgdGhpcyBwcm9wZXJ0eSBpcyBoaWRkZW4gZm9yIHF1ZXN0aW9uIHdpdGhvdXQgaW5wdXQsIGZvciBleGFtcGxlIGh0bWwgcXVlc3Rpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlcXVpcmVkRXJyb3JUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicmVxdWlyZWRFcnJvclRleHRcIik7XG4gIH1cbiAgcHVibGljIHNldCByZXF1aXJlZEVycm9yVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicmVxdWlyZWRFcnJvclRleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jUmVxdWlyZWRFcnJvclRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwicmVxdWlyZWRFcnJvclRleHRcIik7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSBpdCB0byBnZXQgb3Igc2V0IHRoZSBjb21tZW50IHZhbHVlLlxuICAgKi9cbiAgcHVibGljIGdldCBjb21tZW50VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwiY29tbWVudFRleHRcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJvdGhlckl0ZW1UZXh0XCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbW1lbnRUZXh0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb21tZW50VGV4dFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NDb21tZW50VGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJjb21tZW50VGV4dFwiKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIGNvcHkgb2YgcXVlc3Rpb24gZXJyb3JzIHN1cnZleS4gRm9yIHNvbWUgcXVlc3Rpb25zIGxpa2UgbWF0cml4IGFuZCBwYW5lbCBkeW5hbWljIGl0IGluY2x1ZGVzIHRoZSBlcnJvcnMgb2YgbmVzdGVkIHF1ZXN0aW9ucy5cbiAgICovXG4gIHB1YmxpYyBnZXRBbGxFcnJvcnMoKTogQXJyYXk8U3VydmV5RXJyb3I+IHtcbiAgICByZXR1cm4gdGhpcy5lcnJvcnMuc2xpY2UoKTtcbiAgfVxuICBwdWJsaWMgZ2V0RXJyb3JCeVR5cGUoZXJyb3JUeXBlOiBzdHJpbmcpOiBTdXJ2ZXlFcnJvciB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmVycm9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuZXJyb3JzW2ldLmdldEVycm9yVHlwZSgpID09PSBlcnJvclR5cGUpIHJldHVybiB0aGlzLmVycm9yc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsaW5rIHRvIHRoZSBjdXN0b20gd2lkZ2V0LlxuICAgKi9cbiAgcHVibGljIGdldCBjdXN0b21XaWRnZXQoKTogUXVlc3Rpb25DdXN0b21XaWRnZXQge1xuICAgIGlmICghdGhpcy5pc0N1c3RvbVdpZGdldFJlcXVlc3RlZCAmJiAhdGhpcy5jdXN0b21XaWRnZXRWYWx1ZSkge1xuICAgICAgdGhpcy5pc0N1c3RvbVdpZGdldFJlcXVlc3RlZCA9IHRydWU7XG4gICAgICB0aGlzLnVwZGF0ZUN1c3RvbVdpZGdldCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jdXN0b21XaWRnZXRWYWx1ZTtcbiAgfVxuICBwdWJsaWMgdXBkYXRlQ3VzdG9tV2lkZ2V0KCk6IHZvaWQge1xuICAgIHRoaXMuY3VzdG9tV2lkZ2V0VmFsdWUgPSBDdXN0b21XaWRnZXRDb2xsZWN0aW9uLkluc3RhbmNlLmdldEN1c3RvbVdpZGdldCh0aGlzKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzQ29tcG9zaXRlUXVlc3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyB1cGRhdGVDb21tZW50RWxlbWVudCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb21tZW50RWxlbWVudCAmJiB0aGlzLmF1dG9Hcm93Q29tbWVudCkgaW5jcmVhc2VIZWlnaHRCeUNvbnRlbnQodGhpcy5jb21tZW50RWxlbWVudCk7XG4gIH1cbiAgcHVibGljIG9uQ29tbWVudElucHV0KGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0lucHV0VGV4dFVwZGF0ZSlcbiAgICAgIHRoaXMuY29tbWVudCA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICBlbHNlXG4gICAgICB0aGlzLnVwZGF0ZUNvbW1lbnRFbGVtZW50KCk7XG4gIH1cbiAgcHVibGljIG9uQ29tbWVudENoYW5nZShldmVudDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5jb21tZW50ID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgIGlmKHRoaXMuY29tbWVudCAhPT0gZXZlbnQudGFyZ2V0LnZhbHVlKSB7XG4gICAgICBldmVudC50YXJnZXQudmFsdWUgPSB0aGlzLmNvbW1lbnQ7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBhZnRlclJlbmRlclF1ZXN0aW9uRWxlbWVudChlbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3VydmV5IHx8ICF0aGlzLmhhc1NpbmdsZUlucHV0KSByZXR1cm47XG4gICAgdGhpcy5zdXJ2ZXkuYWZ0ZXJSZW5kZXJRdWVzdGlvbklucHV0KHRoaXMsIGVsKTtcbiAgfVxuICBwdWJsaWMgYWZ0ZXJSZW5kZXIoZWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSkgcmV0dXJuO1xuICAgIHRoaXMuc3VydmV5LmFmdGVyUmVuZGVyUXVlc3Rpb24odGhpcywgZWwpO1xuICAgIGlmICghIXRoaXMuYWZ0ZXJSZW5kZXJRdWVzdGlvbkNhbGxiYWNrKSB7XG4gICAgICB0aGlzLmFmdGVyUmVuZGVyUXVlc3Rpb25DYWxsYmFjayh0aGlzLCBlbCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3VwcG9ydENvbW1lbnQoKSB8fCB0aGlzLnN1cHBvcnRPdGhlcigpKSB7XG4gICAgICB0aGlzLmNvbW1lbnRFbGVtZW50ID0gKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuaWQpICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuaWQpLnF1ZXJ5U2VsZWN0b3IoXCJ0ZXh0YXJlYVwiKSkgfHwgbnVsbDtcbiAgICAgIHRoaXMudXBkYXRlQ29tbWVudEVsZW1lbnQoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGJlZm9yZURlc3Ryb3lRdWVzdGlvbkVsZW1lbnQoZWw6IEhUTUxFbGVtZW50KTogdm9pZCB7IH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJlbmRyZWQgcXVlc3Rpb24gdGl0bGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHByb2Nlc3NlZFRpdGxlKCk6IHN0cmluZyB7XG4gICAgdmFyIHJlcyA9IHRoaXMubG9jUHJvY2Vzc2VkVGl0bGUudGV4dE9ySHRtbDtcbiAgICByZXR1cm4gcmVzID8gcmVzIDogdGhpcy5uYW1lO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0aXRsZSBhZnRlciBwcm9jZXNzaW5nIHRoZSBxdWVzdGlvbiB0ZW1wbGF0ZS5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5xdWVzdGlvblRpdGxlVGVtcGxhdGVcbiAgICovXG4gIHB1YmxpYyBnZXQgZnVsbFRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubG9jVGl0bGUucmVuZGVyZWRIdG1sO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgdGl0bGVQYXR0ZXJuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICEhdGhpcy5zdXJ2ZXkgPyB0aGlzLnN1cnZleS5xdWVzdGlvblRpdGxlUGF0dGVybiA6IFwibnVtVGl0bGVSZXF1aXJlXCI7XG4gIH1cbiAgcHVibGljIGdldCBpc1JlcXVpcmVUZXh0T25TdGFydCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1JlcXVpcmVkICYmIHRoaXMudGl0bGVQYXR0ZXJuID09IFwicmVxdWlyZU51bVRpdGxlXCI7XG4gIH1cbiAgcHVibGljIGdldCBpc1JlcXVpcmVUZXh0QmVmb3JlVGl0bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNSZXF1aXJlZCAmJiB0aGlzLnRpdGxlUGF0dGVybiA9PSBcIm51bVJlcXVpcmVUaXRsZVwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNSZXF1aXJlVGV4dEFmdGVyVGl0bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNSZXF1aXJlZCAmJiB0aGlzLnRpdGxlUGF0dGVybiA9PSBcIm51bVRpdGxlUmVxdWlyZVwiO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgUXVlc3Rpb24gcmVuZGVycyBvbiB0aGUgbmV3IGxpbmUgaWYgdGhlIHByb3BlcnR5IGlzIHRydWUuIElmIHRoZSBwcm9wZXJ0eSBpcyBmYWxzZSwgdGhlIHF1ZXN0aW9uIHRyaWVzIHRvIHJlbmRlciBvbiB0aGUgc2FtZSBsaW5lL3JvdyB3aXRoIGEgcHJldmlvdXMgcXVlc3Rpb24vcGFuZWwuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0YXJ0V2l0aE5ld0xpbmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInN0YXJ0V2l0aE5ld0xpbmVcIik7XG4gIH1cbiAgcHVibGljIHNldCBzdGFydFdpdGhOZXdMaW5lKHZhbDogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLnN0YXJ0V2l0aE5ld0xpbmUgPT0gdmFsKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic3RhcnRXaXRoTmV3TGluZVwiLCB2YWwpO1xuICB9XG4gIHByb3RlY3RlZCBjYWxjQ3NzQ2xhc3Nlcyhjc3M6IGFueSk6IGFueSB7XG4gICAgY29uc3QgY2xhc3NlcyA9IHsgZXJyb3I6IHt9IH07XG4gICAgdGhpcy5jb3B5Q3NzQ2xhc3NlcyhjbGFzc2VzLCBjc3MucXVlc3Rpb24pO1xuICAgIHRoaXMuY29weUNzc0NsYXNzZXMoY2xhc3Nlcy5lcnJvciwgY3NzLmVycm9yKTtcbiAgICB0aGlzLnVwZGF0ZUNzc0NsYXNzZXMoY2xhc3NlcywgY3NzKTtcbiAgICBpZiAodGhpcy5zdXJ2ZXkpIHtcbiAgICAgIHRoaXMuc3VydmV5LnVwZGF0ZVF1ZXN0aW9uQ3NzQ2xhc3Nlcyh0aGlzLCBjbGFzc2VzKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsYXNzZXM7XG4gIH1cbiAgcHVibGljIGdldCBjc3NSb290KCk6IHN0cmluZyB7XG4gICAgdGhpcy5lbnN1cmVFbGVtZW50Q3NzKCk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNzc1Jvb3RcIiwgXCJcIik7XG4gIH1cbiAgcHJvdGVjdGVkIHNldENzc1Jvb3QodmFsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjc3NSb290XCIsIHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldENzc1Jvb3QoY3NzQ2xhc3NlczogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmV3IENzc0NsYXNzQnVpbGRlcigpXG4gICAgICAuYXBwZW5kKHRoaXMuaXNGbG93TGF5b3V0ICYmICF0aGlzLmlzRGVzaWduTW9kZVxuICAgICAgICA/IGNzc0NsYXNzZXMuZmxvd1Jvb3RcbiAgICAgICAgOiBjc3NDbGFzc2VzLm1haW5Sb290KVxuICAgICAgLmFwcGVuZChjc3NDbGFzc2VzLnRpdGxlTGVmdFJvb3QsICF0aGlzLmlzRmxvd0xheW91dCAmJiB0aGlzLmhhc1RpdGxlT25MZWZ0KVxuICAgICAgLmFwcGVuZChjc3NDbGFzc2VzLmhhc0Vycm9yLCB0aGlzLmVycm9ycy5sZW5ndGggPiAwKVxuICAgICAgLmFwcGVuZChjc3NDbGFzc2VzLnNtYWxsLCAhdGhpcy53aWR0aClcbiAgICAgIC5hcHBlbmQoY3NzQ2xhc3Nlcy5hbnN3ZXJlZCwgdGhpcy5pc0Fuc3dlcmVkKVxuICAgICAgLnRvU3RyaW5nKCk7XG4gIH1cbiAgcHVibGljIGdldCBjc3NIZWFkZXIoKTogc3RyaW5nIHtcbiAgICB0aGlzLmVuc3VyZUVsZW1lbnRDc3MoKTtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY3NzSGVhZGVyXCIsIFwiXCIpO1xuICB9XG4gIHByb3RlY3RlZCBzZXRDc3NIZWFkZXIodmFsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjc3NIZWFkZXJcIiwgdmFsKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Q3NzSGVhZGVyKGNzc0NsYXNzZXM6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5ldyBDc3NDbGFzc0J1aWxkZXIoKVxuICAgICAgLmFwcGVuZChjc3NDbGFzc2VzLmhlYWRlcilcbiAgICAgIC5hcHBlbmQoY3NzQ2xhc3Nlcy5oZWFkZXJUb3AsIHRoaXMuaGFzVGl0bGVPblRvcClcbiAgICAgIC5hcHBlbmQoY3NzQ2xhc3Nlcy5oZWFkZXJMZWZ0LCB0aGlzLmhhc1RpdGxlT25MZWZ0KVxuICAgICAgLmFwcGVuZChjc3NDbGFzc2VzLmhlYWRlckJvdHRvbSwgdGhpcy5oYXNUaXRsZU9uQm90dG9tKVxuICAgICAgLnRvU3RyaW5nKCk7XG4gIH1cbiAgcHVibGljIGdldCBjc3NDb250ZW50KCk6IHN0cmluZyB7XG4gICAgdGhpcy5lbnN1cmVFbGVtZW50Q3NzKCk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNzc0NvbnRlbnRcIiwgXCJcIik7XG4gIH1cbiAgcHJvdGVjdGVkIHNldENzc0NvbnRlbnQodmFsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjc3NDb250ZW50XCIsIHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldENzc0NvbnRlbnQoY3NzQ2xhc3NlczogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmV3IENzc0NsYXNzQnVpbGRlcigpXG4gICAgICAuYXBwZW5kKGNzc0NsYXNzZXMuY29udGVudClcbiAgICAgIC5hcHBlbmQoY3NzQ2xhc3Nlcy5jb250ZW50TGVmdCwgdGhpcy5oYXNUaXRsZU9uTGVmdClcbiAgICAgIC50b1N0cmluZygpO1xuICB9XG4gIHB1YmxpYyBnZXQgY3NzVGl0bGUoKTogc3RyaW5nIHtcbiAgICB0aGlzLmVuc3VyZUVsZW1lbnRDc3MoKTtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY3NzVGl0bGVcIiwgXCJcIik7XG4gIH1cbiAgcHJvdGVjdGVkIHNldENzc1RpdGxlKHZhbDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY3NzVGl0bGVcIiwgdmFsKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Q3NzVGl0bGUoY3NzQ2xhc3NlczogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmV3IENzc0NsYXNzQnVpbGRlcigpXG4gICAgICAuYXBwZW5kKGNzc0NsYXNzZXMudGl0bGUpXG4gICAgICAuYXBwZW5kKGNzc0NsYXNzZXMudGl0bGVFeHBhbmRhYmxlLCB0aGlzLmlzQ29sbGFwc2VkIHx8IHRoaXMuaXNFeHBhbmRlZClcbiAgICAgIC5hcHBlbmQoY3NzQ2xhc3Nlcy50aXRsZU9uRXJyb3IsIHRoaXMuY29udGFpbnNFcnJvcnMpXG4gICAgICAuYXBwZW5kKGNzc0NsYXNzZXMudGl0bGVPbkFuc3dlciwgIXRoaXMuY29udGFpbnNFcnJvcnMgJiYgdGhpcy5pc0Fuc3dlcmVkKVxuICAgICAgLnRvU3RyaW5nKCk7XG4gIH1cbiAgcHVibGljIGdldCBjc3NFcnJvcigpOiBzdHJpbmcge1xuICAgIHRoaXMuZW5zdXJlRWxlbWVudENzcygpO1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjc3NFcnJvclwiLCBcIlwiKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0Q3NzRXJyb3IodmFsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjc3NFcnJvclwiLCB2YWwpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRDc3NFcnJvcihjc3NDbGFzc2VzOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiBuZXcgQ3NzQ2xhc3NCdWlsZGVyKClcbiAgICAgIC5hcHBlbmQoY3NzQ2xhc3Nlcy5lcnJvci5yb290KVxuICAgICAgLmFwcGVuZChjc3NDbGFzc2VzLmVycm9yLmxvY2F0aW9uVG9wLCB0aGlzLmVycm9yTG9jYXRpb24gPT09IFwidG9wXCIpXG4gICAgICAuYXBwZW5kKGNzc0NsYXNzZXMuZXJyb3IubG9jYXRpb25Cb3R0b20sIHRoaXMuZXJyb3JMb2NhdGlvbiA9PT0gXCJib3R0b21cIilcbiAgICAgIC50b1N0cmluZygpO1xuICB9XG4gIHB1YmxpYyBnZXRSb290Q3NzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5ldyBDc3NDbGFzc0J1aWxkZXIoKVxuICAgICAgLmFwcGVuZCh0aGlzLmNzc1Jvb3QpXG4gICAgICAuYXBwZW5kKHRoaXMuY3NzQ2xhc3Nlcy5kaXNhYmxlZCwgdGhpcy5pc1JlYWRPbmx5KVxuICAgICAgLnRvU3RyaW5nKCk7XG4gIH1cbiAgcHVibGljIHVwZGF0ZUVsZW1lbnRDc3MocmVOZXc/OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5jc3NDbGFzc2VzVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHJlTmV3KSB7XG4gICAgICB0aGlzLnVwZGF0ZVF1ZXN0aW9uQ3NzKHRydWUpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgdXBkYXRlUXVlc3Rpb25Dc3MocmVOZXc/OiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pc0xvYWRpbmdGcm9tSnNvbiB8fFxuICAgICAgIXRoaXMuc3VydmV5IHx8XG4gICAgICAocmVOZXcgIT09IHRydWUgJiYgIXRoaXMuY3NzQ2xhc3Nlc1ZhbHVlKVxuICAgIClcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLnVwZGF0ZUVsZW1lbnRDc3NDb3JlKHRoaXMuY3NzQ2xhc3Nlcyk7XG4gIH1cbiAgcHJpdmF0ZSBlbnN1cmVFbGVtZW50Q3NzKCkge1xuICAgIGlmICghdGhpcy5jc3NDbGFzc2VzVmFsdWUpIHtcbiAgICAgIHRoaXMudXBkYXRlUXVlc3Rpb25Dc3ModHJ1ZSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCB1cGRhdGVFbGVtZW50Q3NzQ29yZShjc3NDbGFzc2VzOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnNldENzc1Jvb3QodGhpcy5nZXRDc3NSb290KGNzc0NsYXNzZXMpKTtcbiAgICB0aGlzLnNldENzc0hlYWRlcih0aGlzLmdldENzc0hlYWRlcihjc3NDbGFzc2VzKSk7XG4gICAgdGhpcy5zZXRDc3NDb250ZW50KHRoaXMuZ2V0Q3NzQ29udGVudChjc3NDbGFzc2VzKSk7XG4gICAgdGhpcy5zZXRDc3NUaXRsZSh0aGlzLmdldENzc1RpdGxlKGNzc0NsYXNzZXMpKTtcbiAgICB0aGlzLnNldENzc0Vycm9yKHRoaXMuZ2V0Q3NzRXJyb3IoY3NzQ2xhc3NlcykpO1xuICB9XG4gIHByb3RlY3RlZCB1cGRhdGVDc3NDbGFzc2VzKHJlczogYW55LCBjc3M6IGFueSk6IHZvaWQge1xuICAgIGlmICghY3NzLnF1ZXN0aW9uKSByZXR1cm47XG4gICAgY29uc3Qgb2JqQ3NzID0gY3NzW3RoaXMuZ2V0Q3NzVHlwZSgpXTtcbiAgICBjb25zdCB0aXRsZUJ1aWxkZXIgPSBuZXcgQ3NzQ2xhc3NCdWlsZGVyKCkuYXBwZW5kKHJlcy50aXRsZSlcbiAgICAgIC5hcHBlbmQoY3NzLnF1ZXN0aW9uLnRpdGxlUmVxdWlyZWQsIHRoaXMuaXNSZXF1aXJlZCk7XG4gICAgcmVzLnRpdGxlID0gdGl0bGVCdWlsZGVyLnRvU3RyaW5nKCk7XG5cbiAgICBjb25zdCByb290QnVpbGRlciA9IG5ldyBDc3NDbGFzc0J1aWxkZXIoKS5hcHBlbmQocmVzLnJvb3QpXG4gICAgICAuYXBwZW5kKG9iakNzcywgdGhpcy5pc1JlcXVpcmVkICYmICEhY3NzLnF1ZXN0aW9uLnJlcXVpcmVkKTtcbiAgICBpZiAob2JqQ3NzID09PSB1bmRlZmluZWQgfHwgb2JqQ3NzID09PSBudWxsKSB7XG4gICAgICByZXMucm9vdCA9IHJvb3RCdWlsZGVyLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBvYmpDc3MgPT09IFwic3RyaW5nXCIgfHwgb2JqQ3NzIGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgICByZXMucm9vdCA9IHJvb3RCdWlsZGVyLmFwcGVuZChvYmpDc3MudG9TdHJpbmcoKSkudG9TdHJpbmcoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzLnJvb3QgPSByb290QnVpbGRlci50b1N0cmluZygpO1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqQ3NzKSB7XG4gICAgICAgIHJlc1trZXldID0gb2JqQ3NzW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBnZXRDc3NUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VHlwZSgpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgaXQgdG8gc2V0IHRoZSBzcGVjaWZpYyB3aWR0aCB0byB0aGUgcXVlc3Rpb24gbGlrZSBjc3Mgc3R5bGUgKCUsIHB4LCBlbSBldGMpLlxuICAgKi9cbiAgcHVibGljIGdldCB3aWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ3aWR0aFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHdpZHRoKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwid2lkdGhcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVXNlIGl0IHRvIHNldCB0aGUgc3BlY2lmaWMgbWluV2lkdGggY29uc3RyYWludCB0byB0aGUgcXVlc3Rpb24gbGlrZSBjc3Mgc3R5bGUgKCUsIHB4LCBlbSBldGMpLlxuICAgKi9cbiAgcHVibGljIGdldCBtaW5XaWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtaW5XaWR0aFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1pbldpZHRoKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWluV2lkdGhcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVXNlIGl0IHRvIHNldCB0aGUgc3BlY2lmaWMgbWF4V2lkdGggY29uc3RyYWludCB0byB0aGUgcXVlc3Rpb24gbGlrZSBjc3Mgc3R5bGUgKCUsIHB4LCBlbSBldGMpLlxuICAgKi9cbiAgcHVibGljIGdldCBtYXhXaWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhXaWR0aFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heFdpZHRoKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWF4V2lkdGhcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHJlbmRlcmVkIHdpZHRoIG9mIHRoZSBxdWVzdGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgcmVuZGVyV2lkdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmVuZGVyV2lkdGhcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCByZW5kZXJXaWR0aCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJlbmRlcldpZHRoXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCBkaWZmZXJlbnQgZnJvbSAwIHRvIGluY3JlYXNlIHRoZSBsZWZ0IHBhZGRpbmcuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGluZGVudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpbmRlbnRcIik7XG4gIH1cbiAgcHVibGljIHNldCBpbmRlbnQodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpbmRlbnRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IGRpZmZlcmVudCBmcm9tIDAgdG8gaW5jcmVhc2UgdGhlIHJpZ2h0IHBhZGRpbmcuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJpZ2h0SW5kZW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJpZ2h0SW5kZW50XCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgcmlnaHRJbmRlbnQodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyaWdodEluZGVudFwiLCB2YWwpO1xuICB9XG4gIGdldCBwYWRkaW5nTGVmdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJwYWRkaW50TGVmdFwiLCBcIlwiKTtcbiAgfVxuICBzZXQgcGFkZGluZ0xlZnQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJwYWRkaW50TGVmdFwiLCB2YWwpO1xuICB9XG4gIGdldCBwYWRkaW5nUmlnaHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicGFkZGluZ1JpZ2h0XCIsIFwiXCIpO1xuICB9XG4gIHNldCBwYWRkaW5nUmlnaHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJwYWRkaW5nUmlnaHRcIiwgdmFsKTtcbiAgfVxuICBwcml2YXRlIG9uSW5kZW50Q2hhbmdlZCgpIHtcbiAgICB0aGlzLnBhZGRpbmdMZWZ0ID0gdGhpcy5nZXRJbmRlbnRTaXplKHRoaXMuaW5kZW50KTtcbiAgICB0aGlzLnBhZGRpbmdSaWdodCA9IHRoaXMuZ2V0SW5kZW50U2l6ZSh0aGlzLnJpZ2h0SW5kZW50KTtcbiAgfVxuICBwcml2YXRlIGdldEluZGVudFNpemUoaW5kZW50OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmIChpbmRlbnQgPCAxIHx8ICF0aGlzLmdldFN1cnZleSgpIHx8ICF0aGlzLmNzc0NsYXNzZXMpIHJldHVybiBcIlwiO1xuICAgIHJldHVybiBpbmRlbnQgKiB0aGlzLmNzc0NsYXNzZXMuaW5kZW50ICsgXCJweFwiO1xuICB9XG4gIC8qKlxuICAgKiBNb3ZlIHRoZSBmb2N1cyB0byB0aGUgaW5wdXQgb2YgdGhpcyBxdWVzdGlvbi5cbiAgICogQHBhcmFtIG9uRXJyb3Igc2V0IHRoaXMgcGFyYW1ldGVyIHRvIHRydWUsIHRvIGZvY3VzIHRoZSBpbnB1dCB3aXRoIHRoZSBmaXJzdCBlcnJvciwgb3RoZXIgd2lzZSB0aGUgZmlyc3QgaW5wdXQgd2lsbCBiZSBmb2N1c2VkLlxuICAgKi9cbiAgcHVibGljIGZvY3VzKG9uRXJyb3I6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkgcmV0dXJuO1xuXG4gICAgaWYgKCEhdGhpcy5zdXJ2ZXkpIHtcbiAgICAgIHRoaXMuc3VydmV5LnNjcm9sbEVsZW1lbnRUb1RvcCh0aGlzLCB0aGlzLCBudWxsLCB0aGlzLmlkKTtcbiAgICB9XG4gICAgdmFyIGlkID0gIW9uRXJyb3JcbiAgICAgID8gdGhpcy5nZXRGaXJzdElucHV0RWxlbWVudElkKClcbiAgICAgIDogdGhpcy5nZXRGaXJzdEVycm9ySW5wdXRFbGVtZW50SWQoKTtcbiAgICBpZiAoU3VydmV5RWxlbWVudC5Gb2N1c0VsZW1lbnQoaWQpKSB7XG4gICAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLmZvY3VzQ2FsbGJhY2spO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgZmlyZUNhbGxiYWNrKGNhbGxiYWNrOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjaygpO1xuICB9XG4gIHB1YmxpYyBnZXRPdGhlcnNNYXhMZW5ndGgoKTogYW55IHtcbiAgICBpZiAoIXRoaXMuc3VydmV5KSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkubWF4T3RoZXJzTGVuZ3RoID4gMCA/IHRoaXMuc3VydmV5Lm1heE90aGVyc0xlbmd0aCA6IG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQ3JlYXRpbmcoKTogdm9pZCB7IH1cbiAgcHJvdGVjdGVkIGdldEZpcnN0SW5wdXRFbGVtZW50SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnB1dElkO1xuICB9XG4gIHByb3RlY3RlZCBnZXRGaXJzdEVycm9ySW5wdXRFbGVtZW50SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRGaXJzdElucHV0RWxlbWVudElkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFByb2Nlc3NlZFRleHRWYWx1ZSh0ZXh0VmFsdWU6IFRleHRQcmVQcm9jZXNzb3JWYWx1ZSk6IHZvaWQge1xuICAgIHZhciBuYW1lID0gdGV4dFZhbHVlLm5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICB0ZXh0VmFsdWUuaXNFeGlzdHMgPVxuICAgICAgT2JqZWN0LmtleXMoUXVlc3Rpb24uVGV4dFByZXByb2Nlc3NvclZhbHVlc01hcCkuaW5kZXhPZihuYW1lKSAhPT0gLTEgfHxcbiAgICAgICg8YW55PnRoaXMpW3RleHRWYWx1ZS5uYW1lXSAhPT0gdW5kZWZpbmVkO1xuICAgIHRleHRWYWx1ZS52YWx1ZSA9ICg8YW55PnRoaXMpW1xuICAgICAgKDxhbnk+UXVlc3Rpb24uVGV4dFByZXByb2Nlc3NvclZhbHVlc01hcClbbmFtZV0gfHwgdGV4dFZhbHVlLm5hbWVcbiAgICBdO1xuICB9XG4gIHB1YmxpYyBzdXBwb3J0Q29tbWVudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIHN1cHBvcnRPdGhlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUsIHRvIG1ha2UgdGhlIHF1ZXN0aW9uIGEgcmVxdWlyZWQuIElmIGEgdXNlciBkb2Vzbid0IGFuc3dlciB0aGUgcXVlc3Rpb24gdGhlbiBhIHZhbGlkYXRpb24gZXJyb3Igd2lsbCBiZSBnZW5lcmF0ZWQuXG4gICAqIFBsZWFzZSBub3RlLCB0aGlzIHByb3BlcnR5IGlzIGhpZGRlbiBmb3IgcXVlc3Rpb24gd2l0aG91dCBpbnB1dCwgZm9yIGV4YW1wbGUgaHRtbCBxdWVzdGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNSZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNSZXF1aXJlZFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBpc1JlcXVpcmVkKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzUmVxdWlyZWRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogQW4gZXhwcmVzc2lvbiB0aGF0IHJldHVybnMgdHJ1ZSBvciBmYWxzZS4gSWYgaXQgcmV0dXJucyB0cnVlIHRoZSBRdWVzdGlvbiBiZWNvbWVzIHJlcXVpcmVkIGFuZCBhbiBlbmQtdXNlciBoYXMgdG8gYW5zd2VyIGl0LlxuICAgKiBJZiBpdCByZXR1cm5zIGZhbHNlIHRoZSBRdWVzdGlvbiB0aGVuIGFuIGVuZC11c2VyIG1heSBub3QgYW5zd2VyIGl0IHRoZSBRdWVzdGlvbiBtYXliZSBlbXB0eS5cbiAgICogVGhlIGxpYnJhcnkgcnVucyB0aGUgZXhwcmVzc2lvbiBvbiBzdXJ2ZXkgc3RhcnQgYW5kIG9uIGNoYW5naW5nIGEgcXVlc3Rpb24gdmFsdWUuIElmIHRoZSBwcm9wZXJ0eSBpcyBlbXB0eSB0aGVuIGlzUmVxdWlyZWQgcHJvcGVydHkgaXMgdXNlZC5cbiAgICogUGxlYXNlIG5vdGUsIHRoaXMgcHJvcGVydHkgaXMgaGlkZGVuIGZvciBxdWVzdGlvbiB3aXRob3V0IGlucHV0LCBmb3IgZXhhbXBsZSBodG1sIHF1ZXN0aW9uLlxuICAgKiBAc2VlIGlzUmVxdWlyZWRcbiAgICovXG4gIHB1YmxpYyBnZXQgcmVxdWlyZWRJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyZXF1aXJlZElmXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcmVxdWlyZWRJZih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJlcXVpcmVkSWZcIiwgdmFsKTtcbiAgICB0aGlzLnJ1bkNvbmRpdGlvbnMoKTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIHRydWUsIHRvIGFkZCBhIGNvbW1lbnQgZm9yIHRoZSBxdWVzdGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgaGFzQ29tbWVudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaGFzQ29tbWVudFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBoYXNDb21tZW50KHZhbDogYm9vbGVhbikge1xuICAgIGlmICghdGhpcy5zdXBwb3J0Q29tbWVudCgpKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaGFzQ29tbWVudFwiLCB2YWwpO1xuICAgIGlmICh0aGlzLmhhc0NvbW1lbnQpIHRoaXMuaGFzT3RoZXIgPSBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWNhdG9yLiBJdCBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaWRcIik7XG4gIH1cbiAgcHVibGljIHNldCBpZCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlkXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBhcmlhVGl0bGVJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlkICsgXCJfYXJpYVRpdGxlXCI7XG4gIH1cbiAgcHVibGljIGdldCBhcmlhUm9sZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzT3RoZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImhhc090aGVyXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGhhc090aGVyKHZhbDogYm9vbGVhbikge1xuICAgIGlmICghdGhpcy5zdXBwb3J0T3RoZXIoKSB8fCB0aGlzLmhhc090aGVyID09IHZhbCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImhhc090aGVyXCIsIHZhbCk7XG4gICAgaWYgKHRoaXMuaGFzT3RoZXIpIHRoaXMuaGFzQ29tbWVudCA9IGZhbHNlO1xuICAgIHRoaXMuaGFzT3RoZXJDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGhhc090aGVyQ2hhbmdlZCgpOiB2b2lkIHsgfVxuICBwdWJsaWMgZ2V0IHJlcXVpcmVVcGRhdGVDb21tZW50VmFsdWUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzQ29tbWVudCB8fCB0aGlzLmhhc090aGVyO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgcmVhZE9ubHkgcHJvcGVydHkgaXMgdHJ1ZSBvciBzdXJ2ZXkgaXMgaW4gZGlzcGxheSBtb2RlIG9yIHBhcmVudCBwYW5lbC9wYWdlIGlzIHJlYWRPbmx5LlxuICAgKiBAc2VlIFN1cnZleU1vZGVsLm1vZGVsXG4gICAqIEBzZWUgcmVhZE9ubHlcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNSZWFkT25seSgpOiBib29sZWFuIHtcbiAgICB2YXIgaXNQYXJlbnRSZWFkT25seSA9ICEhdGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQuaXNSZWFkT25seTtcbiAgICB2YXIgaXNTdXJ2ZXlSZWFkT25seSA9ICEhdGhpcy5zdXJ2ZXkgJiYgdGhpcy5zdXJ2ZXkuaXNEaXNwbGF5TW9kZTtcbiAgICByZXR1cm4gdGhpcy5yZWFkT25seSB8fCBpc1BhcmVudFJlYWRPbmx5IHx8IGlzU3VydmV5UmVhZE9ubHk7XG4gIH1cbiAgcHVibGljIGdldCBpc0lucHV0UmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgdmFyIGlzRGVzaWduTW9kZVYyID0gc2V0dGluZ3Muc3VwcG9ydENyZWF0b3JWMiAmJiB0aGlzLmlzRGVzaWduTW9kZTtcbiAgICByZXR1cm4gdGhpcy5pc1JlYWRPbmx5IHx8IGlzRGVzaWduTW9kZVYyO1xuICB9XG4gIHByb3RlY3RlZCBvblJlYWRPbmx5Q2hhbmdlZCgpOiB2b2lkIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc0lucHV0UmVhZE9ubHlcIiwgdGhpcy5pc0lucHV0UmVhZE9ubHkpO1xuICAgIHN1cGVyLm9uUmVhZE9ubHlDaGFuZ2VkKCk7XG4gIH1cbiAgLyoqXG4gICAqIEFuIGV4cHJlc3Npb24gdGhhdCByZXR1cm5zIHRydWUgb3IgZmFsc2UuIElmIGl0IHJldHVybnMgZmFsc2UgdGhlIFF1ZXN0aW9uIGJlY29tZXMgcmVhZCBvbmx5IGFuZCBhbiBlbmQtdXNlciB3aWxsIG5vdCBhYmxlIHRvIGFuc3dlciBvbiB0aGUgcXVzdGlvbi4gVGhlIGxpYnJhcnkgcnVucyB0aGUgZXhwcmVzc2lvbiBvbiBzdXJ2ZXkgc3RhcnQgYW5kIG9uIGNoYW5naW5nIGEgcXVlc3Rpb24gdmFsdWUuIElmIHRoZSBwcm9wZXJ0eSBpcyBlbXB0eSB0aGVuIHJlYWRPbmx5IHByb3BlcnR5IGlzIHVzZWQuXG4gICAqIFBsZWFzZSBub3RlLCB0aGlzIHByb3BlcnR5IGlzIGhpZGRlbiBmb3IgcXVlc3Rpb24gd2l0aG91dCBpbnB1dCwgZm9yIGV4YW1wbGUgaHRtbCBxdWVzdGlvbi5cbiAgICogQHNlZSByZWFkT25seVxuICAgKiBAc2VlIGlzUmVhZE9ubHlcbiAgICovXG4gIHB1YmxpYyBnZXQgZW5hYmxlSWYoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZW5hYmxlSWZcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBlbmFibGVJZih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImVuYWJsZUlmXCIsIHZhbCk7XG4gICAgdGhpcy5ydW5Db25kaXRpb25zKCk7XG4gIH1cbiAgLyoqXG4gICAqIFJ1biB2aXNpYmxlSWYgYW5kIGVuYWJsZUlmIGV4cHJlc3Npb25zLiBJZiB2aXNpYmxlSWYgb3IvYW5kIGVuYWJsZWRJZiBhcmUgbm90IGVtcHR5LCB0aGVuIHRoZSByZXN1bHRzIG9mIHBlcmZvcm1pbmcgdGhlIGV4cHJlc3Npb24gKHRydWUgb3IgZmFsc2UpIHNldCB0byB0aGUgdmlzaWJsZS9yZWFkT25seSBwcm9wZXJ0aWVzLlxuICAgKiBAcGFyYW0gdmFsdWVzIFR5cGljYWxseSBzdXJ2ZXkgcmVzdWx0c1xuICAgKiBAc2VlIHZpc2libGVcbiAgICogQHNlZSB2aXNpYmxlSWZcbiAgICogQHNlZSByZWFkT25seVxuICAgKiBAc2VlIGVuYWJsZUlmXG4gICAqL1xuICBwdWJsaWMgcnVuQ29uZGl0aW9uKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSByZXR1cm47XG4gICAgaWYgKCFwcm9wZXJ0aWVzKSBwcm9wZXJ0aWVzID0ge307XG4gICAgcHJvcGVydGllc1tcInF1ZXN0aW9uXCJdID0gdGhpcztcbiAgICBpZiAoIXRoaXMuYXJlSW52aXNpYmxlRWxlbWVudHNTaG93aW5nKSB7XG4gICAgICB0aGlzLnJ1blZpc2libGVJZkNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIH1cbiAgICB0aGlzLnJ1bkVuYWJsZUlmQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgdGhpcy5ydW5SZXF1aXJlZElmQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gIH1cbiAgcHJpdmF0ZSBydW5WaXNpYmxlSWZDb25kaXRpb24oXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApIHtcbiAgICBpZiAoIXRoaXMudmlzaWJsZUlmKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmNvbmRpdGlvblJ1bm5lcilcbiAgICAgIHRoaXMuY29uZGl0aW9uUnVubmVyID0gbmV3IENvbmRpdGlvblJ1bm5lcih0aGlzLnZpc2libGVJZik7XG4gICAgdGhpcy5jb25kaXRpb25SdW5uZXIuZXhwcmVzc2lvbiA9IHRoaXMudmlzaWJsZUlmO1xuICAgIHRoaXMuY29uZGl0aW9uUnVubmVyLm9uUnVuQ29tcGxldGUgPSAocmVzOiBib29sZWFuKSA9PiB7XG4gICAgICB0aGlzLnZpc2libGUgPSByZXM7XG4gICAgfTtcbiAgICB0aGlzLmNvbmRpdGlvblJ1bm5lci5ydW4odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICBwcml2YXRlIHJ1bkVuYWJsZUlmQ29uZGl0aW9uKFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT5cbiAgKSB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZUlmKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmNvbmRpdGlvbkVuYWJlbFJ1bm5lcilcbiAgICAgIHRoaXMuY29uZGl0aW9uRW5hYmVsUnVubmVyID0gbmV3IENvbmRpdGlvblJ1bm5lcih0aGlzLmVuYWJsZUlmKTtcbiAgICB0aGlzLmNvbmRpdGlvbkVuYWJlbFJ1bm5lci5leHByZXNzaW9uID0gdGhpcy5lbmFibGVJZjtcbiAgICB0aGlzLmNvbmRpdGlvbkVuYWJlbFJ1bm5lci5vblJ1bkNvbXBsZXRlID0gKHJlczogYm9vbGVhbikgPT4ge1xuICAgICAgdGhpcy5yZWFkT25seSA9ICFyZXM7XG4gICAgfTtcbiAgICB0aGlzLmNvbmRpdGlvbkVuYWJlbFJ1bm5lci5ydW4odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICBwcml2YXRlIHJ1blJlcXVpcmVkSWZDb25kaXRpb24oXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApIHtcbiAgICBpZiAoIXRoaXMucmVxdWlyZWRJZikgcmV0dXJuO1xuICAgIGlmICghdGhpcy5jb25kaXRpb25SZXF1aXJlZFJ1bm5lcilcbiAgICAgIHRoaXMuY29uZGl0aW9uUmVxdWlyZWRSdW5uZXIgPSBuZXcgQ29uZGl0aW9uUnVubmVyKHRoaXMucmVxdWlyZWRJZik7XG4gICAgdGhpcy5jb25kaXRpb25SZXF1aXJlZFJ1bm5lci5leHByZXNzaW9uID0gdGhpcy5yZXF1aXJlZElmO1xuICAgIHRoaXMuY29uZGl0aW9uUmVxdWlyZWRSdW5uZXIub25SdW5Db21wbGV0ZSA9IChyZXM6IGJvb2xlYW4pID0+IHtcbiAgICAgIHRoaXMuaXNSZXF1aXJlZCA9IHJlcztcbiAgICB9O1xuICAgIHRoaXMuY29uZGl0aW9uUmVxdWlyZWRSdW5uZXIucnVuKHZhbHVlcywgcHJvcGVydGllcyk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0eSByZXR1cm5zIHRoZSBxdWVzdGlvbiBudW1iZXIuIElmIHF1ZXN0aW9uIGlzIGludmlzaWJsZSB0aGVuIGl0IHJldHVybnMgZW1wdHkgc3RyaW5nLlxuICAgKiBJZiB2aXNpYmxlSW5kZXggaXMgMSwgdGhlbiBubyBpcyAyLCBvciAnQicgaWYgc3VydmV5LnF1ZXN0aW9uU3RhcnRJbmRleCBpcyAnQScuXG4gICAqIEBzZWUgU3VydmV5TW9kZWwucXVlc3Rpb25TdGFydEluZGV4XG4gICAqL1xuICBwdWJsaWMgZ2V0IG5vKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm5vXCIpO1xuICB9XG4gIHByaXZhdGUgY2FsY05vKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmhhc1RpdGxlIHx8IHRoaXMuaGlkZU51bWJlcikgcmV0dXJuIFwiXCI7XG4gICAgdmFyIG5vID0gSGVscGVycy5nZXROdW1iZXJCeUluZGV4KHRoaXMudmlzaWJsZUluZGV4LCB0aGlzLmdldFN0YXJ0SW5kZXgoKSk7XG4gICAgaWYgKCEhdGhpcy5zdXJ2ZXkpIHtcbiAgICAgIG5vID0gdGhpcy5zdXJ2ZXkuZ2V0VXBkYXRlZFF1ZXN0aW9uTm8odGhpcywgbm8pO1xuICAgIH1cbiAgICByZXR1cm4gbm87XG4gIH1cbiAgcHJvdGVjdGVkIGdldFN0YXJ0SW5kZXgoKTogc3RyaW5nIHtcbiAgICBpZiAoISF0aGlzLnBhcmVudCkgcmV0dXJuIHRoaXMucGFyZW50LmdldFF1ZXN0aW9uU3RhcnRJbmRleCgpO1xuICAgIGlmICghIXRoaXMuc3VydmV5KSByZXR1cm4gdGhpcy5zdXJ2ZXkucXVlc3Rpb25TdGFydEluZGV4O1xuICAgIHJldHVybiBcIlwiO1xuICB9XG4gIHB1YmxpYyBvblN1cnZleUxvYWQoKTogdm9pZCB7XG4gICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5zdXJ2ZXlMb2FkQ2FsbGJhY2spO1xuICAgIHRoaXMudXBkYXRlVmFsdWVXaXRoRGVmYXVsdHMoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25TZXREYXRhKCk6IHZvaWQge1xuICAgIHN1cGVyLm9uU2V0RGF0YSgpO1xuICAgIGlmICghdGhpcy5zdXJ2ZXkpIHJldHVybjtcbiAgICB0aGlzLmluaXREYXRhRnJvbVN1cnZleSgpO1xuICAgIHRoaXMub25TdXJ2ZXlWYWx1ZUNoYW5nZWQodGhpcy52YWx1ZSk7XG4gICAgdGhpcy51cGRhdGVWYWx1ZVdpdGhEZWZhdWx0cygpO1xuICAgIHRoaXMub25JbmRlbnRDaGFuZ2VkKCk7XG4gICAgdGhpcy51cGRhdGVRdWVzdGlvbkNzcygpO1xuICAgIHRoaXMudXBkYXRlSXNBbnN3ZXJlZCgpO1xuICB9XG4gIHByb3RlY3RlZCBpbml0RGF0YUZyb21TdXJ2ZXkoKTogdm9pZCB7XG4gICAgaWYgKCEhdGhpcy5kYXRhKSB7XG4gICAgICBjb25zdCB2YWwgPSB0aGlzLmRhdGEuZ2V0VmFsdWUodGhpcy5nZXRWYWx1ZU5hbWUoKSk7XG4gICAgICBpZiAoIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHZhbCkgfHwgIXRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHtcbiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZUZyb21TdXJ2ZXkodmFsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaW5pdENvbW1lbnRGcm9tU3VydmV5KCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBpbml0Q29tbWVudEZyb21TdXJ2ZXkoKTogdm9pZCB7XG4gICAgaWYgKCEhdGhpcy5kYXRhICYmIHRoaXMucmVxdWlyZVVwZGF0ZUNvbW1lbnRWYWx1ZSkge1xuICAgICAgdGhpcy51cGRhdGVDb21tZW50RnJvbVN1cnZleSh0aGlzLmRhdGEuZ2V0Q29tbWVudCh0aGlzLmdldFZhbHVlTmFtZSgpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXBkYXRlQ29tbWVudEZyb21TdXJ2ZXkoXCJcIik7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBydW5FeHByZXNzaW9uKGV4cHJlc3Npb246IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSB8fCAhZXhwcmVzc2lvbikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkucnVuRXhwcmVzc2lvbihleHByZXNzaW9uKTtcbiAgfVxuICBwcml2YXRlIGdldCBhdXRvR3Jvd0NvbW1lbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5ICYmIHRoaXMuc3VydmV5LmF1dG9Hcm93Q29tbWVudDtcbiAgfVxuICBwcml2YXRlIGdldCBxdWVzdGlvblZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZhbHVlXCIpO1xuICB9XG4gIHByaXZhdGUgc2V0IHF1ZXN0aW9uVmFsdWUodmFsOiBhbnkpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2YWx1ZVwiLCB2YWwpO1xuICB9XG4gIHByaXZhdGUgZ2V0IHF1ZXN0aW9uQ29tbWVudCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb21tZW50XCIpO1xuICB9XG4gIHByaXZhdGUgc2V0IHF1ZXN0aW9uQ29tbWVudCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvbW1lbnRcIiwgdmFsKTtcbiAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLmNvbW1lbnRDaGFuZ2VkQ2FsbGJhY2spO1xuICB9XG4gIC8qKlxuICAgKiBHZXQvU2V0IHRoZSBxdWVzdGlvbiB2YWx1ZS5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlLnNldFZhbHVlXG4gICAqIEBzZWUgU3VydmV5TW9kZS5nZXRWYWx1ZVxuICAgKi9cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFZhbHVlQ29yZSgpO1xuICB9XG4gIHB1YmxpYyBzZXQgdmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgIHRoaXMuc2V0TmV3VmFsdWUobmV3VmFsdWUpO1xuICB9XG4gIHB1YmxpYyBnZXQgdmFsdWVGb3JTdXJ2ZXkoKTogYW55IHtcbiAgICBpZiAoISF0aGlzLnZhbHVlVG9EYXRhQ2FsbGJhY2spIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlVG9EYXRhQ2FsbGJhY2sodGhpcy52YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBDbGVhciB0aGUgcXVlc3Rpb24gdmFsdWUuIEl0IGNsZWFycyB0aGUgcXVlc3Rpb24gY29tbWVudCBhcyB3ZWxsLlxuICAgKi9cbiAgcHVibGljIGNsZWFyVmFsdWUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdGhpcy5jb21tZW50ID0gdW5kZWZpbmVkO1xuICB9XG4gIHB1YmxpYyB1bmJpbmRWYWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyVmFsdWUoKTtcbiAgfVxuICBwdWJsaWMgY3JlYXRlVmFsdWVDb3B5KCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VW5iaW5kVmFsdWUodGhpcy52YWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFVuYmluZFZhbHVlKHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGlmICh0aGlzLmlzVmFsdWVTdXJ2ZXlFbGVtZW50KHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICAgIHJldHVybiBIZWxwZXJzLmdldFVuYmluZFZhbHVlKHZhbHVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgaXNWYWx1ZVN1cnZleUVsZW1lbnQodmFsOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoIXZhbCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpXG4gICAgICByZXR1cm4gdmFsLmxlbmd0aCA+IDAgPyB0aGlzLmlzVmFsdWVTdXJ2ZXlFbGVtZW50KHZhbFswXSkgOiBmYWxzZTtcbiAgICByZXR1cm4gISF2YWwuZ2V0VHlwZSAmJiAhIXZhbC5vblByb3BlcnR5Q2hhbmdlZDtcbiAgfVxuICBwcml2YXRlIGNhbkNsZWFyVmFsdWVBc0ludmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc1Zpc2libGUgJiYgdGhpcy5pc1BhcmVudFZpc2libGUpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoISF0aGlzLnBhZ2UgJiYgdGhpcy5wYWdlLmlzU3RhcnRlZCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghdGhpcy5zdXJ2ZXkgfHwgIXRoaXMudmFsdWVOYW1lKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gIXRoaXMuc3VydmV5Lmhhc1Zpc2libGVRdWVzdGlvbkJ5VmFsdWVOYW1lKHRoaXMudmFsdWVOYW1lKTtcbiAgfVxuICBwcml2YXRlIGdldCBpc1BhcmVudFZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50O1xuICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgIGlmICghcGFyZW50LmlzVmlzaWJsZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIGNsZWFyVmFsdWVJZkludmlzaWJsZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jYW5DbGVhclZhbHVlQXNJbnZpc2libGUoKSkge1xuICAgICAgdGhpcy5jbGVhclZhbHVlKCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgZGlzcGxheVZhbHVlKCk6IGFueSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybiBcIlwiO1xuICAgIHJldHVybiB0aGlzLmdldERpc3BsYXlWYWx1ZSh0cnVlKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIHRoZSBxdWVzdGlvbiB2YWx1ZSBhcyBhIGRpc3BsYXkgdGV4dC4gRm9yIGV4YW1wbGUsIGZvciBkcm9wZG93biwgaXQgd291bGQgcmV0dXJuIHRoZSBpdGVtIHRleHQgaW5zdGVhZCBvZiBpdGVtIHZhbHVlLlxuICAgKiBAcGFyYW0ga2V5c0FzVGV4dCBTZXQgdGhpcyB2YWx1ZSB0byB0cnVlLCB0byByZXR1cm4ga2V5IChpbiBtYXRyaWNlcyBxdWVzdGlvbnMpIGFzIGRpc3BsYXkgdGV4dCBhcyB3ZWxsLlxuICAgKiBAcGFyYW0gdmFsdWUgdXNlIHRoaXMgcGFyYW1ldGVyLCBpZiB5b3Ugd2FudCB0byBnZXQgZGlzcGxheSB2YWx1ZSBmb3IgdGhpcyB2YWx1ZSBhbmQgbm90IHF1ZXN0aW9uLnZhbHVlLiBJdCBpcyB1bmRlZmluZWQgYnkgZGVmYXVsdC5cbiAgICovXG4gIHB1YmxpYyBnZXREaXNwbGF5VmFsdWUoa2V5c0FzVGV4dDogYm9vbGVhbiwgdmFsdWU6IGFueSA9IHVuZGVmaW5lZCk6IGFueSB7XG4gICAgdmFyIHJlcyA9IHRoaXMuY2FsY0Rpc3BsYXlWYWx1ZShrZXlzQXNUZXh0LCB2YWx1ZSk7XG4gICAgcmV0dXJuICEhdGhpcy5kaXNwbGF5VmFsdWVDYWxsYmFjayA/IHRoaXMuZGlzcGxheVZhbHVlQ2FsbGJhY2socmVzKSA6IHJlcztcbiAgfVxuICBwcml2YXRlIGNhbGNEaXNwbGF5VmFsdWUoa2V5c0FzVGV4dDogYm9vbGVhbiwgdmFsdWU6IGFueSA9IHVuZGVmaW5lZCk6IGFueSB7XG4gICAgaWYgKHRoaXMuY3VzdG9tV2lkZ2V0KSB7XG4gICAgICB2YXIgcmVzID0gdGhpcy5jdXN0b21XaWRnZXQuZ2V0RGlzcGxheVZhbHVlKHRoaXMsIHZhbHVlKTtcbiAgICAgIGlmIChyZXMpIHJldHVybiByZXM7XG4gICAgfVxuICAgIHZhbHVlID0gdmFsdWUgPT0gdW5kZWZpbmVkID8gdGhpcy5jcmVhdGVWYWx1ZUNvcHkoKSA6IHZhbHVlO1xuICAgIGlmICh0aGlzLmlzVmFsdWVFbXB0eSh2YWx1ZSkpIHJldHVybiB0aGlzLmdldERpc3BsYXlWYWx1ZUVtcHR5KCk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RGlzcGxheVZhbHVlQ29yZShrZXlzQXNUZXh0LCB2YWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERpc3BsYXlWYWx1ZUNvcmUoa2V5QXNUZXh0OiBib29sZWFuLCB2YWx1ZTogYW55KTogYW55IHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERpc3BsYXlWYWx1ZUVtcHR5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGUgZGVmYXVsdCB2YWx1ZSB0byB0aGUgcXVlc3Rpb24uIEl0IHdpbGwgYmUgYXNzaWduIHRvIHRoZSBxdWVzdGlvbiBvbiBsb2FkaW5nIHRoZSBzdXJ2ZXkgZnJvbSBKU09OIG9yIGFkZGluZyBhIHF1ZXN0aW9uIHRvIHRoZSBzdXJ2ZXkgb3Igb24gc2V0dGluZyB0aGlzIHByb3BlcnR5IG9mIHRoZSB2YWx1ZSBpcyBlbXB0eS5cbiAgICogUGxlYXNlIG5vdGUsIHRoaXMgcHJvcGVydHkgaXMgaGlkZGVuIGZvciBxdWVzdGlvbiB3aXRob3V0IGlucHV0LCBmb3IgZXhhbXBsZSBodG1sIHF1ZXN0aW9uLlxuICAgKi9cbiAgcHVibGljIGdldCBkZWZhdWx0VmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZGVmYXVsdFZhbHVlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZGVmYXVsdFZhbHVlKHZhbDogYW55KSB7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUV4cHJlc3Npb24odmFsKSkge1xuICAgICAgdGhpcy5kZWZhdWx0VmFsdWVFeHByZXNzaW9uID0gdmFsLnN1YnN0cigxKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZGVmYXVsdFZhbHVlXCIsIHRoaXMuY29udmVydERlZmF1bHRWYWx1ZSh2YWwpKTtcbiAgICB0aGlzLnVwZGF0ZVZhbHVlV2l0aERlZmF1bHRzKCk7XG4gIH1cbiAgcHVibGljIGdldCBkZWZhdWx0VmFsdWVFeHByZXNzaW9uKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImRlZmF1bHRWYWx1ZUV4cHJlc3Npb25cIik7XG4gIH1cbiAgcHVibGljIHNldCBkZWZhdWx0VmFsdWVFeHByZXNzaW9uKHZhbDogYW55KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZGVmYXVsdFZhbHVlRXhwcmVzc2lvblwiLCB2YWwpO1xuICAgIHRoaXMudXBkYXRlVmFsdWVXaXRoRGVmYXVsdHMoKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBxdWVzdGlvbiBhbnN3ZXIgZGF0YSBhcyBhIHBsYWluIG9iamVjdDogd2l0aCBxdWVzdGlvbiB0aXRsZSwgbmFtZSwgdmFsdWUgYW5kIGRpc3BsYXlWYWx1ZS5cbiAgICogRm9yIGNvbXBsZXggcXVlc3Rpb25zIChsaWtlIG1hdHJpeCwgZXRjLikgaXNOb2RlIGZsYWcgaXMgc2V0IHRvIHRydWUgYW5kIGRhdGEgY29udGFpbnMgYXJyYXkgb2YgbmVzdGVkIG9iamVjdHMgKHJvd3MpXG4gICAqIHNldCBvcHRpb25zLmluY2x1ZGVFbXB0eSB0byBmYWxzZSBpZiB5b3Ugd2FudCB0byBza2lwIGVtcHR5IGFuc3dlcnNcbiAgICovXG4gIHB1YmxpYyBnZXRQbGFpbkRhdGEoXG4gICAgb3B0aW9uczoge1xuICAgICAgaW5jbHVkZUVtcHR5PzogYm9vbGVhbixcbiAgICAgIGluY2x1ZGVRdWVzdGlvblR5cGVzPzogYm9vbGVhbixcbiAgICAgIGNhbGN1bGF0aW9ucz86IEFycmF5PHtcbiAgICAgICAgcHJvcGVydHlOYW1lOiBzdHJpbmcsXG4gICAgICB9PixcbiAgICB9ID0ge1xuICAgICAgaW5jbHVkZUVtcHR5OiB0cnVlLFxuICAgICAgaW5jbHVkZVF1ZXN0aW9uVHlwZXM6IGZhbHNlLFxuICAgIH1cbiAgKTogYW55IHtcbiAgICBpZiAob3B0aW9ucy5pbmNsdWRlRW1wdHkgfHwgIXRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICB2YXIgcXVlc3Rpb25QbGFpbkRhdGEgPSA8YW55PntcbiAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICB0aXRsZTogdGhpcy5sb2NUaXRsZS5yZW5kZXJlZEh0bWwsXG4gICAgICAgIHZhbHVlOiB0aGlzLnZhbHVlLFxuICAgICAgICBkaXNwbGF5VmFsdWU6IHRoaXMuZGlzcGxheVZhbHVlLFxuICAgICAgICBpc05vZGU6IGZhbHNlLFxuICAgICAgICBnZXRTdHJpbmc6ICh2YWw6IGFueSkgPT5cbiAgICAgICAgICB0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiID8gSlNPTi5zdHJpbmdpZnkodmFsKSA6IHZhbCxcbiAgICAgIH07XG4gICAgICBpZiAob3B0aW9ucy5pbmNsdWRlUXVlc3Rpb25UeXBlcyA9PT0gdHJ1ZSkge1xuICAgICAgICBxdWVzdGlvblBsYWluRGF0YS5xdWVzdGlvblR5cGUgPSB0aGlzLmdldFR5cGUoKTtcbiAgICAgIH1cbiAgICAgIChvcHRpb25zLmNhbGN1bGF0aW9ucyB8fCBbXSkuZm9yRWFjaCgoY2FsY3VsYXRpb24pID0+IHtcbiAgICAgICAgcXVlc3Rpb25QbGFpbkRhdGFbY2FsY3VsYXRpb24ucHJvcGVydHlOYW1lXSA9IHRoaXNbXG4gICAgICAgICAgY2FsY3VsYXRpb24ucHJvcGVydHlOYW1lXG4gICAgICAgIF07XG4gICAgICB9KTtcbiAgICAgIGlmICh0aGlzLmhhc0NvbW1lbnQpIHtcbiAgICAgICAgcXVlc3Rpb25QbGFpbkRhdGEuaXNOb2RlID0gdHJ1ZTtcbiAgICAgICAgcXVlc3Rpb25QbGFpbkRhdGEuZGF0YSA9IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAwLFxuICAgICAgICAgICAgaXNDb21tZW50OiB0cnVlLFxuICAgICAgICAgICAgdGl0bGU6IFwiQ29tbWVudFwiLFxuICAgICAgICAgICAgdmFsdWU6IHNldHRpbmdzLmNvbW1lbnRQcmVmaXgsXG4gICAgICAgICAgICBkaXNwbGF5VmFsdWU6IHRoaXMuY29tbWVudCxcbiAgICAgICAgICAgIGdldFN0cmluZzogKHZhbDogYW55KSA9PlxuICAgICAgICAgICAgICB0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiID8gSlNPTi5zdHJpbmdpZnkodmFsKSA6IHZhbCxcbiAgICAgICAgICAgIGlzTm9kZTogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBxdWVzdGlvblBsYWluRGF0YTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICAvKipcbiAgICogVGhlIGNvcnJlY3QgYW5zd2VyIG9uIHRoZSBxdWVzdGlvbi4gU2V0IHRoaXMgdmFsdWUgaWYgeW91IGFyZSBkb2luZyBhIHF1aXouXG4gICAqIFBsZWFzZSBub3RlLCB0aGlzIHByb3BlcnR5IGlzIGhpZGRlbiBmb3IgcXVlc3Rpb24gd2l0aG91dCBpbnB1dCwgZm9yIGV4YW1wbGUgaHRtbCBxdWVzdGlvbi5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5jb3JyZWN0QW5zd2Vyc1xuICAgKiBAc2VlIFN1cnZleU1vZGVsLmluQ29ycmVjdEFuc3dlcnNcbiAgICovXG4gIHB1YmxpYyBnZXQgY29ycmVjdEFuc3dlcigpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb3JyZWN0QW5zd2VyXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29ycmVjdEFuc3dlcih2YWw6IGFueSkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvcnJlY3RBbnN3ZXJcIiwgdGhpcy5jb252ZXJ0RGVmYXVsdFZhbHVlKHZhbCkpO1xuICB9XG4gIHByb3RlY3RlZCBjb252ZXJ0RGVmYXVsdFZhbHVlKHZhbDogYW55KTogYW55IHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHF1ZXN0aW9ucyBjb3VudDogMSBmb3IgdGhlIG5vbi1tYXRyaXggcXVlc3Rpb25zIGFuZCBhbGwgaW5uZXIgdmlzaWJsZSBxdWVzdGlvbnMgdGhhdCBoYXMgaW5wdXQocykgd2lkZ2V0cyBmb3IgcXVlc3Rpb24gb2YgbWF0cml4IHR5cGVzLlxuICAgKiBAc2VlIGdldFF1aXpRdWVzdGlvbnNcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVpelF1ZXN0aW9uQ291bnQoKTogbnVtYmVyIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmlzVmlzaWJsZSAmJlxuICAgICAgdGhpcy5oYXNJbnB1dCAmJlxuICAgICAgIXRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMuY29ycmVjdEFuc3dlcilcbiAgICApXG4gICAgICByZXR1cm4gdGhpcy5nZXRRdWl6UXVlc3Rpb25Db3VudCgpO1xuICAgIHJldHVybiAwO1xuICB9XG4gIHB1YmxpYyBnZXQgY29ycmVjdEFuc3dlckNvdW50KCk6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLmlzRW1wdHkoKSAmJiAhdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy5jb3JyZWN0QW5zd2VyKSlcbiAgICAgIHJldHVybiB0aGlzLmdldENvcnJlY3RBbnN3ZXJDb3VudCgpO1xuICAgIHJldHVybiAwO1xuICB9XG4gIHByb3RlY3RlZCBnZXRRdWl6UXVlc3Rpb25Db3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiAxO1xuICB9XG4gIHByb3RlY3RlZCBnZXRDb3JyZWN0QW5zd2VyQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5pc1R3b1ZhbHVlRXF1YWxzKHRoaXMudmFsdWUsIHRoaXMuY29ycmVjdEFuc3dlciwgdHJ1ZSwgdHJ1ZSlcbiAgICAgID8gMVxuICAgICAgOiAwO1xuICB9XG4gIHB1YmxpYyBpc0Fuc3dlckNvcnJlY3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29ycmVjdEFuc3dlckNvdW50ID09IHRoaXMucXVpelF1ZXN0aW9uQ291bnQ7XG4gIH1cbiAgcHVibGljIHVwZGF0ZVZhbHVlV2l0aERlZmF1bHRzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uIHx8ICghdGhpcy5pc0Rlc2lnbk1vZGUgJiYgdGhpcy5pc0RlZmF1bHRWYWx1ZUVtcHR5KCkpKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmlzRGVzaWduTW9kZSAmJiAhdGhpcy5pc0VtcHR5KCkpIHJldHVybjtcbiAgICBpZiAodGhpcy5pc0VtcHR5KCkgJiYgdGhpcy5pc0RlZmF1bHRWYWx1ZUVtcHR5KCkpIHJldHVybjtcbiAgICBpZiAoISF0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5pc0NsZWFyVmFsdWVPbkhpZGRlbiAmJiAhdGhpcy5pc1Zpc2libGUpIHJldHVybjtcbiAgICB0aGlzLnNldERlZmF1bHRWYWx1ZSgpO1xuICB9XG4gIGdldFF1ZXN0aW9uRnJvbUFycmF5KG5hbWU6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IElRdWVzdGlvbiB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIGdldERlZmF1bHRWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgaXNEZWZhdWx0VmFsdWVFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuZGVmYXVsdFZhbHVlRXhwcmVzc2lvbiAmJiB0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLmRlZmF1bHRWYWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIHNldERlZmF1bHRWYWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNldFZhbHVlQW5kUnVuRXhwcmVzc2lvbihcbiAgICAgIHRoaXMuZGVmYXVsdFZhbHVlRXhwcmVzc2lvbixcbiAgICAgIHRoaXMuZ2V0VW5iaW5kVmFsdWUodGhpcy5kZWZhdWx0VmFsdWUpLFxuICAgICAgKHZhbCkgPT4ge1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsO1xuICAgICAgfVxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIGlzVmFsdWVFeHByZXNzaW9uKHZhbDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdmFsICYmIHR5cGVvZiB2YWwgPT0gXCJzdHJpbmdcIiAmJiB2YWwubGVuZ3RoID4gMCAmJiB2YWxbMF0gPT0gXCI9XCI7XG4gIH1cbiAgcHJvdGVjdGVkIHNldFZhbHVlQW5kUnVuRXhwcmVzc2lvbihcbiAgICBleHByZXNzaW9uOiBzdHJpbmcsXG4gICAgZGVmYXVsdFZhbHVlOiBhbnksXG4gICAgc2V0RnVuYzogKHZhbDogYW55KSA9PiB2b2lkLFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4gPSBudWxsLFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+ID0gbnVsbFxuICApOiB2b2lkIHtcbiAgICB2YXIgZnVuYyA9ICh2YWw6IGFueSkgPT4ge1xuICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgdmFsID0gdmFsLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTApO1xuICAgICAgfVxuICAgICAgc2V0RnVuYyh2YWwpO1xuICAgIH07XG4gICAgaWYgKCEhZXhwcmVzc2lvbiAmJiAhIXRoaXMuZGF0YSkge1xuICAgICAgaWYgKCF2YWx1ZXMpIHZhbHVlcyA9IHRoaXMuZGF0YS5nZXRGaWx0ZXJlZFZhbHVlcygpO1xuICAgICAgaWYgKCFwcm9wZXJ0aWVzKSBwcm9wZXJ0aWVzID0gdGhpcy5kYXRhLmdldEZpbHRlcmVkUHJvcGVydGllcygpO1xuICAgICAgdmFyIHJ1bm5lciA9IG5ldyBFeHByZXNzaW9uUnVubmVyKGV4cHJlc3Npb24pO1xuICAgICAgaWYgKHJ1bm5lci5jYW5SdW4pIHtcbiAgICAgICAgcnVubmVyLm9uUnVuQ29tcGxldGUgPSAocmVzKSA9PiB7XG4gICAgICAgICAgaWYgKHJlcyA9PSB1bmRlZmluZWQpIHJlcyA9IHRoaXMuZGVmYXVsdFZhbHVlO1xuICAgICAgICAgIGZ1bmMocmVzKTtcbiAgICAgICAgfTtcbiAgICAgICAgcnVubmVyLnJ1bih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmdW5jKGRlZmF1bHRWYWx1ZSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBUaGUgcXVlc3Rpb24gY29tbWVudCB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgY29tbWVudCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFF1ZXN0aW9uQ29tbWVudCgpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29tbWVudChuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKCEhbmV3VmFsdWUpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWRWYWx1ZSA9IG5ld1ZhbHVlLnRvU3RyaW5nKCkudHJpbSgpO1xuICAgICAgaWYodHJpbW1lZFZhbHVlICE9PSBuZXdWYWx1ZSkge1xuICAgICAgICBuZXdWYWx1ZSA9IHRyaW1tZWRWYWx1ZTtcbiAgICAgICAgaWYobmV3VmFsdWUgPT09IHRoaXMuY29tbWVudCkge1xuICAgICAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZURpcmVjdGx5KFwiY29tbWVudFwiLCBuZXdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuY29tbWVudCA9PSBuZXdWYWx1ZSkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UXVlc3Rpb25Db21tZW50KG5ld1ZhbHVlKTtcbiAgICB0aGlzLnVwZGF0ZUNvbW1lbnRFbGVtZW50KCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFF1ZXN0aW9uQ29tbWVudCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uQ29tbWVudDtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0UXVlc3Rpb25Db21tZW50KG5ld1ZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNldE5ld0NvbW1lbnQobmV3VmFsdWUpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHF1ZXN0aW9uIHZhbHVlIGlzIGVtcHR5XG4gICAqL1xuICBwdWJsaWMgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy52YWx1ZSk7XG4gIH1cbiAgcHVibGljIGdldCBpc0Fuc3dlcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc0Fuc3dlcmVkXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNBbnN3ZXJlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc0Fuc3dlcmVkXCIsIHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZUlzQW5zd2VyZWQoKTogdm9pZCB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNBbnN3ZXJlZFwiLCB0aGlzLmdldElzQW5zd2VyZWQoKSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldElzQW5zd2VyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmlzRW1wdHkoKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgcXVlc3Rpb24gdmFsaWRhdG9ycy5cbiAgICogUGxlYXNlIG5vdGUsIHRoaXMgcHJvcGVydHkgaXMgaGlkZGVuIGZvciBxdWVzdGlvbiB3aXRob3V0IGlucHV0LCBmb3IgZXhhbXBsZSBodG1sIHF1ZXN0aW9uLlxuICAgKi9cbiAgcHVibGljIGdldCB2YWxpZGF0b3JzKCk6IEFycmF5PFN1cnZleVZhbGlkYXRvcj4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2YWxpZGF0b3JzXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdmFsaWRhdG9ycyh2YWw6IEFycmF5PFN1cnZleVZhbGlkYXRvcj4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2YWxpZGF0b3JzXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldFZhbGlkYXRvcnMoKTogQXJyYXk8U3VydmV5VmFsaWRhdG9yPiB7XG4gICAgcmV0dXJuIHRoaXMudmFsaWRhdG9ycztcbiAgfVxuICBwdWJsaWMgZ2V0U3VwcG9ydGVkVmFsaWRhdG9ycygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIgcmVzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgdmFyIGNsYXNzTmFtZSA9IHRoaXMuZ2V0VHlwZSgpO1xuICAgIHdoaWxlICghIWNsYXNzTmFtZSkge1xuICAgICAgdmFyIGNsYXNzVmFsaWRhdG9ycyA9ICg8YW55PnNldHRpbmdzLnN1cHBvcnRlZFZhbGlkYXRvcnMpW2NsYXNzTmFtZV07XG4gICAgICBpZiAoISFjbGFzc1ZhbGlkYXRvcnMpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IGNsYXNzVmFsaWRhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIHJlcy5zcGxpY2UoMCwgMCwgY2xhc3NWYWxpZGF0b3JzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIGNsYXNzSW5mbyA9IFNlcmlhbGl6ZXIuZmluZENsYXNzKGNsYXNzTmFtZSk7XG4gICAgICBjbGFzc05hbWUgPSBjbGFzc0luZm8ucGFyZW50TmFtZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIGFkZFN1cHBvcnRlZFZhbGlkYXRvcnMoXG4gICAgc3VwcG9ydGVkVmFsaWRhdG9yczogQXJyYXk8c3RyaW5nPixcbiAgICBjbGFzc1ZhbGlkYXRvcnM6IEFycmF5PHN0cmluZz5cbiAgKSB7IH1cbiAgcHVibGljIGFkZENvbmRpdGlvbk9iamVjdHNCeUNvbnRleHQob2JqZWN0czogQXJyYXk8SUNvbmRpdGlvbk9iamVjdD4sIGNvbnRleHQ6IGFueSk6IHZvaWQge1xuICAgIG9iamVjdHMucHVzaCh7XG4gICAgICBuYW1lOiB0aGlzLmdldFZhbHVlTmFtZSgpLFxuICAgICAgdGV4dDogdGhpcy5wcm9jZXNzZWRUaXRsZSxcbiAgICAgIHF1ZXN0aW9uOiB0aGlzLFxuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBnZXRDb25kaXRpb25Kc29uKG9wZXJhdG9yOiBzdHJpbmcgPSBudWxsLCBwYXRoOiBzdHJpbmcgPSBudWxsKTogYW55IHtcbiAgICB2YXIganNvbiA9IG5ldyBKc29uT2JqZWN0KCkudG9Kc29uT2JqZWN0KHRoaXMpO1xuICAgIGpzb25bXCJ0eXBlXCJdID0gdGhpcy5nZXRUeXBlKCk7XG4gICAgcmV0dXJuIGpzb247XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhIHZhbGlkYXRpb24gZXJyb3IocykgaW4gdGhlIHF1ZXN0aW9uLlxuICAgKiBAcGFyYW0gZmlyZUNhbGxiYWNrIHNldCBpdCB0byB0cnVlIHRvIHNob3cgYW4gZXJyb3IgaW4gVUkuXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKGZpcmVDYWxsYmFjazogYm9vbGVhbiA9IHRydWUsIHJlYzogYW55ID0gbnVsbCk6IGJvb2xlYW4ge1xuICAgIHZhciBvbGRIYXNFcnJvcnMgPSB0aGlzLmVycm9ycy5sZW5ndGggPiAwO1xuICAgIHZhciBlcnJvcnMgPSB0aGlzLmNoZWNrRm9yRXJyb3JzKCEhcmVjICYmIHJlYy5pc09uVmFsdWVDaGFuZ2VkID09PSB0cnVlKTtcbiAgICBpZiAoZmlyZUNhbGxiYWNrKSB7XG4gICAgICBpZiAoISF0aGlzLnN1cnZleSkge1xuICAgICAgICB0aGlzLnN1cnZleS5iZWZvcmVTZXR0aW5nUXVlc3Rpb25FcnJvcnModGhpcywgZXJyb3JzKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUNvbnRhaW5zRXJyb3JzKCk7XG4gICAgaWYgKG9sZEhhc0Vycm9ycyAhPSBlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy51cGRhdGVRdWVzdGlvbkNzcygpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0NvbGxhcHNlZCAmJiByZWMgJiYgZmlyZUNhbGxiYWNrICYmIGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmV4cGFuZCgpO1xuICAgIH1cbiAgICByZXR1cm4gZXJyb3JzLmxlbmd0aCA+IDA7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHZhbGlkYXRpb24gZXJyb3JzIGNvdW50LlxuICAgKi9cbiAgcHVibGljIGdldCBjdXJyZW50RXJyb3JDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmVycm9ycy5sZW5ndGg7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNoYXIvc3RyaW5nIGZvciBhIHJlcXVpcmVkIHF1ZXN0aW9uLlxuICAgKiBAc2VlIFN1cnZleU1vZGVsLnJlcXVpcmVkVGV4dFxuICAgKi9cbiAgcHVibGljIGdldCByZXF1aXJlZFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkgIT0gbnVsbCAmJiB0aGlzLmlzUmVxdWlyZWRcbiAgICAgID8gdGhpcy5zdXJ2ZXkucmVxdWlyZWRUZXh0XG4gICAgICA6IFwiXCI7XG4gIH1cbiAgLyoqXG4gICAqIEFkZCBlcnJvciBpbnRvIHRoZSBxdWVzdGlvbiBlcnJvciBsaXN0LlxuICAgKiBAcGFyYW0gZXJyb3JcbiAgICovXG4gIHB1YmxpYyBhZGRFcnJvcihlcnJvcjogU3VydmV5RXJyb3IgfCBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIWVycm9yKSByZXR1cm47XG4gICAgbGV0IG5ld0Vycm9yOiBTdXJ2ZXlFcnJvciA9IG51bGw7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gXCJzdHJpbmdcIiB8fCBlcnJvciBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgICAgbmV3RXJyb3IgPSBuZXcgQ3VzdG9tRXJyb3IoPHN0cmluZz5lcnJvciwgdGhpcy5zdXJ2ZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdFcnJvciA9IDxTdXJ2ZXlFcnJvcj5lcnJvcjtcbiAgICB9XG4gICAgdGhpcy5lcnJvcnMucHVzaChuZXdFcnJvcik7XG4gIH1cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHBhcnRpY3VsYXIgZXJyb3IgZnJvbSB0aGUgcXVlc3Rpb24gZXJyb3IgbGlzdC5cbiAgICogQHBhcmFtIGVycm9yXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlRXJyb3IoZXJyb3I6IFN1cnZleUVycm9yKTogdm9pZCB7XG4gICAgdmFyIGVycm9ycyA9IHRoaXMuZXJyb3JzO1xuICAgIHZhciBpbmRleCA9IGVycm9ycy5pbmRleE9mKGVycm9yKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSBlcnJvcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxuICBwcml2YXRlIGNoZWNrRm9yRXJyb3JzKGlzT25WYWx1ZUNoYW5nZWQ6IGJvb2xlYW4pOiBBcnJheTxTdXJ2ZXlFcnJvcj4ge1xuICAgIHZhciBxRXJyb3JzID0gbmV3IEFycmF5PFN1cnZleUVycm9yPigpO1xuICAgIGlmICh0aGlzLmlzVmlzaWJsZSAmJiB0aGlzLmNhbkNvbGxlY3RFcnJvcnMoKSkge1xuICAgICAgdGhpcy5jb2xsZWN0RXJyb3JzKHFFcnJvcnMsIGlzT25WYWx1ZUNoYW5nZWQpO1xuICAgIH1cbiAgICByZXR1cm4gcUVycm9ycztcbiAgfVxuICBwcm90ZWN0ZWQgY2FuQ29sbGVjdEVycm9ycygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXNSZWFkT25seTtcbiAgfVxuICBwcml2YXRlIGNvbGxlY3RFcnJvcnMoXG4gICAgcUVycm9yczogQXJyYXk8U3VydmV5RXJyb3I+LFxuICAgIGlzT25WYWx1ZUNoYW5nZWQ6IGJvb2xlYW5cbiAgKSB7XG4gICAgdGhpcy5vbkNoZWNrRm9yRXJyb3JzKHFFcnJvcnMsIGlzT25WYWx1ZUNoYW5nZWQpO1xuICAgIGlmIChxRXJyb3JzLmxlbmd0aCA+IDAgfHwgIXRoaXMuY2FuUnVuVmFsaWRhdG9ycyhpc09uVmFsdWVDaGFuZ2VkKSkgcmV0dXJuO1xuICAgIHZhciBlcnJvcnMgPSB0aGlzLnJ1blZhbGlkYXRvcnMoKTtcbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vdmFsaWRhdG9ycyBtYXkgY2hhbmdlIHRoZSBxdWVzdGlvbiB2YWx1ZS5cbiAgICAgIHFFcnJvcnMubGVuZ3RoID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXJyb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHFFcnJvcnMucHVzaChlcnJvcnNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5zdXJ2ZXkgJiYgcUVycm9ycy5sZW5ndGggPT0gMCkge1xuICAgICAgdmFyIGVycm9yID0gdGhpcy5maXJlU3VydmV5VmFsaWRhdGlvbigpO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHFFcnJvcnMucHVzaChlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBjYW5SdW5WYWxpZGF0b3JzKGlzT25WYWx1ZUNoYW5nZWQ6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcml2YXRlIGZpcmVTdXJ2ZXlWYWxpZGF0aW9uKCk6IFN1cnZleUVycm9yIHtcbiAgICBpZiAodGhpcy52YWxpZGF0ZVZhbHVlQ2FsbGJhY2spIHJldHVybiB0aGlzLnZhbGlkYXRlVmFsdWVDYWxsYmFjaygpO1xuICAgIHJldHVybiB0aGlzLnN1cnZleSA/IHRoaXMuc3VydmV5LnZhbGlkYXRlUXVlc3Rpb24odGhpcykgOiBudWxsO1xuICB9XG4gIHByb3RlY3RlZCBvbkNoZWNrRm9yRXJyb3JzKGVycm9yczogQXJyYXk8U3VydmV5RXJyb3I+LCBpc09uVmFsdWVDaGFuZ2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCFpc09uVmFsdWVDaGFuZ2VkICYmIHRoaXMuaGFzUmVxdWlyZWRFcnJvcigpKSB7XG4gICAgICBlcnJvcnMucHVzaChuZXcgQW5zd2VyUmVxdWlyZWRFcnJvcih0aGlzLnJlcXVpcmVkRXJyb3JUZXh0LCB0aGlzKSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBoYXNSZXF1aXJlZEVycm9yKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzUmVxdWlyZWQgJiYgdGhpcy5pc0VtcHR5KCk7XG4gIH1cbiAgcHJpdmF0ZSB2YWxpZGF0b3JSdW5uZXI6IFZhbGlkYXRvclJ1bm5lcjtcbiAgcHJpdmF0ZSBpc1J1bm5pbmdWYWxpZGF0b3JzVmFsdWUgPSBmYWxzZTtcbiAgcHVibGljIG9uQ29tcGxldGVkQXN5bmNWYWxpZGF0b3JzOiAoaGFzRXJyb3JzOiBib29sZWFuKSA9PiB2b2lkO1xuICBwdWJsaWMgZ2V0IGlzUnVubmluZ1ZhbGlkYXRvcnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SXNSdW5uaW5nVmFsaWRhdG9ycygpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRJc1J1bm5pbmdWYWxpZGF0b3JzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzUnVubmluZ1ZhbGlkYXRvcnNWYWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgcnVuVmFsaWRhdG9ycygpOiBBcnJheTxTdXJ2ZXlFcnJvcj4ge1xuICAgIGlmICghIXRoaXMudmFsaWRhdG9yUnVubmVyKSB7XG4gICAgICB0aGlzLnZhbGlkYXRvclJ1bm5lci5vbkFzeW5jQ29tcGxldGVkID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy52YWxpZGF0b3JSdW5uZXIgPSBuZXcgVmFsaWRhdG9yUnVubmVyKCk7XG4gICAgdGhpcy5pc1J1bm5pbmdWYWxpZGF0b3JzVmFsdWUgPSB0cnVlO1xuICAgIHRoaXMudmFsaWRhdG9yUnVubmVyLm9uQXN5bmNDb21wbGV0ZWQgPSAoZXJyb3JzOiBBcnJheTxTdXJ2ZXlFcnJvcj4pID0+IHtcbiAgICAgIHRoaXMuZG9PbkFzeW5jQ29tcGxldGVkKGVycm9ycyk7XG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy52YWxpZGF0b3JSdW5uZXIucnVuKHRoaXMpO1xuICB9XG4gIHByaXZhdGUgZG9PbkFzeW5jQ29tcGxldGVkKGVycm9yczogQXJyYXk8U3VydmV5RXJyb3I+KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlcnJvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuZXJyb3JzLnB1c2goZXJyb3JzW2ldKTtcbiAgICB9XG4gICAgdGhpcy5pc1J1bm5pbmdWYWxpZGF0b3JzVmFsdWUgPSBmYWxzZTtcbiAgICB0aGlzLnJhaXNlT25Db21wbGV0ZWRBc3luY1ZhbGlkYXRvcnMoKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmFpc2VPbkNvbXBsZXRlZEFzeW5jVmFsaWRhdG9ycygpOiB2b2lkIHtcbiAgICBpZiAoISF0aGlzLm9uQ29tcGxldGVkQXN5bmNWYWxpZGF0b3JzICYmICF0aGlzLmlzUnVubmluZ1ZhbGlkYXRvcnMpIHtcbiAgICAgIHRoaXMub25Db21wbGV0ZWRBc3luY1ZhbGlkYXRvcnModGhpcy5nZXRBbGxFcnJvcnMoKS5sZW5ndGggPiAwKTtcbiAgICAgIHRoaXMub25Db21wbGV0ZWRBc3luY1ZhbGlkYXRvcnMgPSBudWxsO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGlzVmFsdWVDaGFuZ2VkSW5TdXJ2ZXkgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGFsbG93Tm90aWZ5VmFsdWVDaGFuZ2VkID0gdHJ1ZTtcbiAgcHJvdGVjdGVkIHNldE5ld1ZhbHVlKG5ld1ZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB2YXIgb2xkQW5zd2VyZWQgPSB0aGlzLmlzQW5zd2VyZWQ7XG4gICAgdGhpcy5zZXROZXdWYWx1ZUluRGF0YShuZXdWYWx1ZSk7XG4gICAgdGhpcy5hbGxvd05vdGlmeVZhbHVlQ2hhbmdlZCAmJiB0aGlzLm9uVmFsdWVDaGFuZ2VkKCk7XG4gICAgaWYgKHRoaXMuaXNBbnN3ZXJlZCAhPSBvbGRBbnN3ZXJlZCkge1xuICAgICAgdGhpcy51cGRhdGVRdWVzdGlvbkNzcygpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgaXNUZXh0VmFsdWUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNTdXJ2ZXlJbnB1dFRleHRVcGRhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5zdXJ2ZXkgPyB0aGlzLnN1cnZleS5pc1VwZGF0ZVZhbHVlVGV4dE9uVHlwaW5nIDogZmFsc2U7XG4gIH1cbiAgcHJpdmF0ZSBnZXREYXRhTG9jTm90aWZpY2F0aW9uKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuaXNJbnB1dFRleHRVcGRhdGUgPyBcInRleHRcIiA6IGZhbHNlO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNJbnB1dFRleHRVcGRhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNTdXJ2ZXlJbnB1dFRleHRVcGRhdGUgJiYgdGhpcy5pc1RleHRWYWx1ZSgpO1xuICB9XG4gIHByb3RlY3RlZCBzZXROZXdWYWx1ZUluRGF0YShuZXdWYWx1ZTogYW55KTogdm9pZCB7XG4gICAgbmV3VmFsdWUgPSB0aGlzLnZhbHVlVG9EYXRhKG5ld1ZhbHVlKTtcbiAgICBpZiAoIXRoaXMuaXNWYWx1ZUNoYW5nZWRJblN1cnZleSkge1xuICAgICAgdGhpcy5zZXRWYWx1ZUNvcmUobmV3VmFsdWUpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgZ2V0VmFsdWVDb3JlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb25WYWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0VmFsdWVDb3JlKG5ld1ZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnNldFF1ZXN0aW9uVmFsdWUobmV3VmFsdWUpO1xuICAgIGlmICh0aGlzLmRhdGEgIT0gbnVsbCAmJiB0aGlzLmNhblNldFZhbHVlVG9TdXJ2ZXkoKSkge1xuICAgICAgbmV3VmFsdWUgPSB0aGlzLnZhbHVlRm9yU3VydmV5O1xuICAgICAgdGhpcy5kYXRhLnNldFZhbHVlKFxuICAgICAgICB0aGlzLmdldFZhbHVlTmFtZSgpLFxuICAgICAgICBuZXdWYWx1ZSxcbiAgICAgICAgdGhpcy5nZXREYXRhTG9jTm90aWZpY2F0aW9uKCksXG4gICAgICAgIHRoaXMuYWxsb3dOb3RpZnlWYWx1ZUNoYW5nZWRcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBjYW5TZXRWYWx1ZVRvU3VydmV5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByb3RlY3RlZCB2YWx1ZUZyb21EYXRhKHZhbDogYW55KTogYW55IHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIHByb3RlY3RlZCB2YWx1ZVRvRGF0YSh2YWw6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICBwcm90ZWN0ZWQgb25WYWx1ZUNoYW5nZWQoKTogdm9pZCB7IH1cbiAgcHJvdGVjdGVkIHNldE5ld0NvbW1lbnQobmV3VmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucXVlc3Rpb25Db21tZW50ID0gbmV3VmFsdWU7XG4gICAgaWYgKHRoaXMuZGF0YSAhPSBudWxsKSB7XG4gICAgICB0aGlzLmRhdGEuc2V0Q29tbWVudChcbiAgICAgICAgdGhpcy5nZXRWYWx1ZU5hbWUoKSxcbiAgICAgICAgbmV3VmFsdWUsXG4gICAgICAgIHRoaXMuaXNTdXJ2ZXlJbnB1dFRleHRVcGRhdGUgPyBcInRleHRcIiA6IGZhbHNlXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgZ2V0VmFsaWROYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFuYW1lKSByZXR1cm4gbmFtZTtcbiAgICByZXR1cm4gbmFtZS50cmltKCkucmVwbGFjZSgvW1xce1xcfV0rL2csIFwiXCIpO1xuICB9XG4gIC8vSVF1ZXN0aW9uXG4gIHVwZGF0ZVZhbHVlRnJvbVN1cnZleShuZXdWYWx1ZTogYW55KTogdm9pZCB7XG4gICAgbmV3VmFsdWUgPSB0aGlzLmdldFVuYmluZFZhbHVlKG5ld1ZhbHVlKTtcbiAgICBpZiAoISF0aGlzLnZhbHVlRnJvbURhdGFDYWxsYmFjaykge1xuICAgICAgbmV3VmFsdWUgPSB0aGlzLnZhbHVlRnJvbURhdGFDYWxsYmFjayhuZXdWYWx1ZSk7XG4gICAgfVxuICAgIHRoaXMuc2V0UXVlc3Rpb25WYWx1ZSh0aGlzLnZhbHVlRnJvbURhdGEobmV3VmFsdWUpKTtcbiAgfVxuICB1cGRhdGVDb21tZW50RnJvbVN1cnZleShuZXdWYWx1ZTogYW55KTogYW55IHtcbiAgICB0aGlzLnF1ZXN0aW9uQ29tbWVudCA9IG5ld1ZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCBzZXRRdWVzdGlvblZhbHVlKG5ld1ZhbHVlOiBhbnksIHVwZGF0ZUlzQW5zd2VyZWQ6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG4gICAgY29uc3QgaXNFcXVhbCA9IHRoaXMuaXNUd29WYWx1ZUVxdWFscyh0aGlzLnF1ZXN0aW9uVmFsdWUsIG5ld1ZhbHVlKTtcbiAgICB0aGlzLnF1ZXN0aW9uVmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAhaXNFcXVhbCAmJiB0aGlzLmFsbG93Tm90aWZ5VmFsdWVDaGFuZ2VkICYmXG4gICAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnZhbHVlQ2hhbmdlZENhbGxiYWNrKTtcbiAgICBpZiAodXBkYXRlSXNBbnN3ZXJlZCkgdGhpcy51cGRhdGVJc0Fuc3dlcmVkKCk7XG4gIH1cbiAgb25TdXJ2ZXlWYWx1ZUNoYW5nZWQobmV3VmFsdWU6IGFueSk6IHZvaWQgeyB9XG4gIHB1YmxpYyBzZXRWaXNpYmxlSW5kZXgodmFsOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmlzVmlzaWJsZSB8fFxuICAgICAgKCF0aGlzLmhhc1RpdGxlICYmICFzZXR0aW5ncy5zZXRRdWVzdGlvblZpc2libGVJbmRleEZvckhpZGRlblRpdGxlKSB8fFxuICAgICAgKHRoaXMuaGlkZU51bWJlciAmJiAhc2V0dGluZ3Muc2V0UXVlc3Rpb25WaXNpYmxlSW5kZXhGb3JIaWRkZW5OdW1iZXIpXG4gICAgKSB7XG4gICAgICB2YWwgPSAtMTtcbiAgICB9XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidmlzaWJsZUluZGV4XCIsIHZhbCk7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibm9cIiwgdGhpcy5jYWxjTm8oKSk7XG4gICAgcmV0dXJuIHZhbCA8IDAgPyAwIDogMTtcbiAgfVxuICBwdWJsaWMgcmVtb3ZlRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgc3VwcG9ydEdvTmV4dFBhZ2VBdXRvbWF0aWMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBzdXBwb3J0R29OZXh0UGFnZUVycm9yKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBDYWxsIHRoaXMgZnVuY3Rpb24gdG8gcmVtb3ZlIHZhbHVlcyBmcm9tIHRoZSBjdXJyZW50IHF1ZXN0aW9uLCB0aGF0IGVuZC11c2VyIHdpbGwgbm90IGJlIGFibGUgdG8gZW50ZXIuXG4gICAqIEZvciBleGFtcGxlIHRoZSB2YWx1ZSB0aGF0IGRvZXNuJ3QgZXhpc3RzIGluIGEgcmFkaWdyb3VwL2Ryb3Bkb3duL2NoZWNrYm94IGNob2ljZXMgb3IgbWF0cml4IHJvd3MvY29sdW1ucy5cbiAgICovXG4gIHB1YmxpYyBjbGVhckluY29ycmVjdFZhbHVlcygpOiB2b2lkIHsgfVxuICBwdWJsaWMgY2xlYXJPbkRlbGV0aW5nQ29udGFpbmVyKCk6IHZvaWQgeyB9XG4gIC8qKlxuICAgKiBDYWxsIHRoaXMgZnVuY3Rpb24gdG8gY2xlYXIgYWxsIGVycm9ycyBpbiB0aGUgcXVlc3Rpb25cbiAgICovXG4gIHB1YmxpYyBjbGVhckVycm9ycygpOiB2b2lkIHtcbiAgICB0aGlzLmVycm9ycyA9IFtdO1xuICB9XG4gIHB1YmxpYyBjbGVhclVudXNlZFZhbHVlcygpOiB2b2lkIHsgfVxuICBvbkFueVZhbHVlQ2hhbmdlZChuYW1lOiBzdHJpbmcpOiB2b2lkIHsgfVxuICBjaGVja0JpbmRpbmdzKHZhbHVlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYmluZGluZ3MuaXNFbXB0eSgpIHx8ICF0aGlzLmRhdGEpIHJldHVybjtcbiAgICB2YXIgcHJvcHMgPSB0aGlzLmJpbmRpbmdzLmdldFByb3BlcnRpZXNCeVZhbHVlTmFtZSh2YWx1ZU5hbWUpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXNbcHJvcHNbaV1dID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRDb21wb25lbnROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFJlbmRlcmVyRmFjdG9yeS5JbnN0YW5jZS5nZXRSZW5kZXJlckJ5UXVlc3Rpb24odGhpcyk7XG4gIH1cblxuICBwdWJsaWMgaXNEZWZhdWx0UmVuZGVyaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAhIXRoaXMuY3VzdG9tV2lkZ2V0IHx8XG4gICAgICB0aGlzLnJlbmRlckFzID09PSBcImRlZmF1bHRcIiB8fFxuICAgICAgdGhpcy5nZXRDb21wb25lbnROYW1lKCkgPT09IFwiZGVmYXVsdFwiXG4gICAgKTtcbiAgfVxuXG4gIEBwcm9wZXJ0eSh7IGRlZmF1bHRWYWx1ZTogXCJkZWZhdWx0XCIgfSlcbiAgcmVuZGVyQXM6IHN0cmluZztcblxuICAvL0lTdXJ2ZXlFcnJvck93bmVyXG4gIGdldEVycm9yQ3VzdG9tVGV4dCh0ZXh0OiBzdHJpbmcsIGVycm9yOiBTdXJ2ZXlFcnJvcik6IHN0cmluZyB7XG4gICAgaWYgKCEhdGhpcy5zdXJ2ZXkpIHJldHVybiB0aGlzLnN1cnZleS5nZXRFcnJvckN1c3RvbVRleHQodGV4dCwgZXJyb3IpO1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG4gIC8vSVZhbGlkYXRvck93bmVyXG4gIGdldFZhbGlkYXRvclRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZ2V0IHZhbGlkYXRlZFZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gIH1cbiAgc2V0IHZhbGlkYXRlZFZhbHVlKHZhbDogYW55KSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbDtcbiAgfVxuICBnZXRBbGxWYWx1ZXMoKTogYW55IHtcbiAgICByZXR1cm4gISF0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0QWxsVmFsdWVzKCkgOiBudWxsO1xuICB9XG59XG5TZXJpYWxpemVyLmFkZENsYXNzKFwicXVlc3Rpb25cIiwgW1xuICBcIiFuYW1lXCIsXG4gIHtcbiAgICBuYW1lOiBcInN0YXRlXCIsXG4gICAgZGVmYXVsdDogXCJkZWZhdWx0XCIsXG4gICAgY2hvaWNlczogW1wiZGVmYXVsdFwiLCBcImNvbGxhcHNlZFwiLCBcImV4cGFuZGVkXCJdLFxuICB9LFxuICB7IG5hbWU6IFwidmlzaWJsZTpzd2l0Y2hcIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICB7IG5hbWU6IFwidXNlRGlzcGxheVZhbHVlc0luVGl0bGU6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlLCBsYXlvdXQ6IFwicm93XCIgfSxcbiAgXCJ2aXNpYmxlSWY6Y29uZGl0aW9uXCIsXG4gIHsgbmFtZTogXCJ3aWR0aFwiIH0sXG4gIHsgbmFtZTogXCJtaW5XaWR0aFwiLCBkZWZhdWx0OiBzZXR0aW5ncy5taW5XaWR0aCB9LFxuICB7IG5hbWU6IFwibWF4V2lkdGhcIiwgZGVmYXVsdDogc2V0dGluZ3MubWF4V2lkdGggfSxcbiAgeyBuYW1lOiBcInN0YXJ0V2l0aE5ld0xpbmU6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlLCBsYXlvdXQ6IFwicm93XCIgfSxcbiAgeyBuYW1lOiBcImluZGVudDpudW1iZXJcIiwgZGVmYXVsdDogMCwgY2hvaWNlczogWzAsIDEsIDIsIDNdLCBsYXlvdXQ6IFwicm93XCIgfSxcbiAge1xuICAgIG5hbWU6IFwicGFnZVwiLFxuICAgIGlzU2VyaWFsaXphYmxlOiBmYWxzZSxcbiAgICB2aXNpYmxlSWY6IGZ1bmN0aW9uIChvYmo6IGFueSkge1xuICAgICAgdmFyIHN1cnZleSA9IG9iaiA/IG9iai5zdXJ2ZXkgOiBudWxsO1xuICAgICAgcmV0dXJuICFzdXJ2ZXkgfHwgc3VydmV5LnBhZ2VzLmxlbmd0aCA+IDE7XG4gICAgfSxcbiAgICBjaG9pY2VzOiBmdW5jdGlvbiAob2JqOiBhbnkpIHtcbiAgICAgIHZhciBzdXJ2ZXkgPSBvYmogPyBvYmouc3VydmV5IDogbnVsbDtcbiAgICAgIHJldHVybiBzdXJ2ZXlcbiAgICAgICAgPyBzdXJ2ZXkucGFnZXMubWFwKChwOiBhbnkpID0+IHtcbiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogcC5uYW1lLCB0ZXh0OiBwLnRpdGxlIH07XG4gICAgICAgIH0pXG4gICAgICAgIDogW107XG4gICAgfSxcbiAgfSxcbiAgeyBuYW1lOiBcInRpdGxlOnRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1RpdGxlXCIsIGxheW91dDogXCJyb3dcIiB9LFxuICB7XG4gICAgbmFtZTogXCJ0aXRsZUxvY2F0aW9uXCIsXG4gICAgZGVmYXVsdDogXCJkZWZhdWx0XCIsXG4gICAgY2hvaWNlczogW1wiZGVmYXVsdFwiLCBcInRvcFwiLCBcImJvdHRvbVwiLCBcImxlZnRcIiwgXCJoaWRkZW5cIl0sXG4gICAgbGF5b3V0OiBcInJvd1wiLFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJkZXNjcmlwdGlvbjp0ZXh0XCIsXG4gICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0Rlc2NyaXB0aW9uXCIsXG4gICAgbGF5b3V0OiBcInJvd1wiLFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJkZXNjcmlwdGlvbkxvY2F0aW9uXCIsXG4gICAgZGVmYXVsdDogXCJkZWZhdWx0XCIsXG4gICAgY2hvaWNlczogW1wiZGVmYXVsdFwiLCBcInVuZGVySW5wdXRcIiwgXCJ1bmRlclRpdGxlXCJdLFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJoaWRlTnVtYmVyOmJvb2xlYW5cIixcbiAgICBkZXBlbmRzT246IFwidGl0bGVMb2NhdGlvblwiLFxuICAgIHZpc2libGVJZjogZnVuY3Rpb24gKG9iajogYW55KSB7XG4gICAgICBpZiAoIW9iaikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICgoPFF1ZXN0aW9uPm9iaikudGl0bGVMb2NhdGlvbiA9PT0gXCJoaWRkZW5cIikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgcGFyZW50OiBQYW5lbE1vZGVsID0gb2JqID8gb2JqLnBhcmVudCA6IG51bGw7XG4gICAgICB2YXIgbnVtYmVyaW5nQWxsb3dlZEJ5UGFyZW50ID1cbiAgICAgICAgIXBhcmVudCB8fCBwYXJlbnQuc2hvd1F1ZXN0aW9uTnVtYmVycyAhPT0gXCJvZmZcIjtcbiAgICAgIGlmICghbnVtYmVyaW5nQWxsb3dlZEJ5UGFyZW50KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciBzdXJ2ZXk6IFN1cnZleU1vZGVsID0gb2JqID8gb2JqLnN1cnZleSA6IG51bGw7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAhc3VydmV5IHx8XG4gICAgICAgIHN1cnZleS5zaG93UXVlc3Rpb25OdW1iZXJzICE9PSBcIm9mZlwiIHx8XG4gICAgICAgICghIXBhcmVudCAmJiBwYXJlbnQuc2hvd1F1ZXN0aW9uTnVtYmVycyA9PT0gXCJvbnBhbmVsXCIpXG4gICAgICApO1xuICAgIH0sXG4gIH0sXG4gIFwidmFsdWVOYW1lXCIsXG4gIFwiZW5hYmxlSWY6Y29uZGl0aW9uXCIsXG4gIFwiZGVmYXVsdFZhbHVlOnZhbHVlXCIsXG4gIHtcbiAgICBuYW1lOiBcImRlZmF1bHRWYWx1ZUV4cHJlc3Npb246ZXhwcmVzc2lvblwiLFxuICAgIGNhdGVnb3J5OiBcImxvZ2ljXCIsXG4gIH0sXG4gIFwiY29ycmVjdEFuc3dlcjp2YWx1ZVwiLFxuICBcImlzUmVxdWlyZWQ6c3dpdGNoXCIsXG4gIFwicmVxdWlyZWRJZjpjb25kaXRpb25cIixcbiAge1xuICAgIG5hbWU6IFwicmVxdWlyZWRFcnJvclRleHQ6dGV4dFwiLFxuICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NSZXF1aXJlZEVycm9yVGV4dFwiLFxuICB9LFxuICBcInJlYWRPbmx5OnN3aXRjaFwiLFxuICB7XG4gICAgbmFtZTogXCJ2YWxpZGF0b3JzOnZhbGlkYXRvcnNcIixcbiAgICBiYXNlQ2xhc3NOYW1lOiBcInN1cnZleXZhbGlkYXRvclwiLFxuICAgIGNsYXNzTmFtZVBhcnQ6IFwidmFsaWRhdG9yXCIsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcImJpbmRpbmdzOmJpbmRpbmdzXCIsXG4gICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImJpbmRpbmdzXCIsXG4gICAgdmlzaWJsZUlmOiBmdW5jdGlvbiAob2JqOiBhbnkpIHtcbiAgICAgIHJldHVybiBvYmouYmluZGluZ3MuZ2V0TmFtZXMoKS5sZW5ndGggPiAwO1xuICAgIH0sXG4gIH0sXG4gIHsgbmFtZTogXCJyZW5kZXJBc1wiLCBkZWZhdWx0OiBcImRlZmF1bHRcIiwgdmlzaWJsZTogZmFsc2UgfSxcbl0pO1xuU2VyaWFsaXplci5hZGRBbHRlck5hdGl2ZUNsYXNzTmFtZShcInF1ZXN0aW9uXCIsIFwicXVlc3Rpb25iYXNlXCIpO1xuIiwiaW1wb3J0IHsgQmFzZSwgRXZlbnQgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBJUXVlc3Rpb24gfSBmcm9tIFwiLi9iYXNlLWludGVyZmFjZXNcIjtcblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uQ3VzdG9tV2lkZ2V0IHtcbiAgcHVibGljIGh0bWxUZW1wbGF0ZTogc3RyaW5nO1xuICBwdWJsaWMgaXNGaXJzdFJlbmRlcjogYm9vbGVhbiA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZywgcHVibGljIHdpZGdldEpzb246IGFueSkge1xuICAgIHRoaXMuaHRtbFRlbXBsYXRlID0gd2lkZ2V0SnNvbi5odG1sVGVtcGxhdGUgPyB3aWRnZXRKc29uLmh0bWxUZW1wbGF0ZSA6IFwiXCI7XG4gIH1cbiAgcHVibGljIGFmdGVyUmVuZGVyKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGVsOiBhbnkpIHtcbiAgICBpZiAodGhpcy5pc0ZpcnN0UmVuZGVyKSB7XG4gICAgICB0aGlzLmlzRmlyc3RSZW5kZXIgPSBmYWxzZTtcbiAgICAgIHF1ZXN0aW9uLnN1cnZleS5vbkxvY2FsZUNoYW5nZWRFdmVudC5hZGQoKCkgPT4ge1xuICAgICAgICB0aGlzLndpZGdldEpzb24ud2lsbFVubW91bnQocXVlc3Rpb24sIGVsKTtcbiAgICAgICAgdGhpcy53aWRnZXRKc29uLmFmdGVyUmVuZGVyKHF1ZXN0aW9uLCBlbCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy53aWRnZXRKc29uLmFmdGVyUmVuZGVyKSB0aGlzLndpZGdldEpzb24uYWZ0ZXJSZW5kZXIocXVlc3Rpb24sIGVsKTtcbiAgfVxuICBwdWJsaWMgd2lsbFVubW91bnQocXVlc3Rpb246IElRdWVzdGlvbiwgZWw6IGFueSkge1xuICAgIGlmICh0aGlzLndpZGdldEpzb24ud2lsbFVubW91bnQpIHRoaXMud2lkZ2V0SnNvbi53aWxsVW5tb3VudChxdWVzdGlvbiwgZWwpO1xuICB9XG4gIHB1YmxpYyBnZXREaXNwbGF5VmFsdWUocXVlc3Rpb246IElRdWVzdGlvbiwgdmFsdWU6IGFueSA9IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMud2lkZ2V0SnNvbi5nZXREaXNwbGF5VmFsdWUpXG4gICAgICByZXR1cm4gdGhpcy53aWRnZXRKc29uLmdldERpc3BsYXlWYWx1ZShxdWVzdGlvbiwgdmFsdWUpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBpc0ZpdChxdWVzdGlvbjogSVF1ZXN0aW9uKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNMaWJyYXJ5TG9hZGVkKCkgJiYgdGhpcy53aWRnZXRKc29uLmlzRml0KVxuICAgICAgcmV0dXJuIHRoaXMud2lkZ2V0SnNvbi5pc0ZpdChxdWVzdGlvbik7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBnZXQgY2FuU2hvd0luVG9vbGJveCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy53aWRnZXRKc29uLnNob3dJblRvb2xib3ggPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKFxuICAgICAgQ3VzdG9tV2lkZ2V0Q29sbGVjdGlvbi5JbnN0YW5jZS5nZXRBY3RpdmF0ZWRCeSh0aGlzLm5hbWUpICE9IFwiY3VzdG9tdHlwZVwiXG4gICAgKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAhdGhpcy53aWRnZXRKc29uLndpZGdldElzTG9hZGVkIHx8IHRoaXMud2lkZ2V0SnNvbi53aWRnZXRJc0xvYWRlZCgpO1xuICB9XG4gIHB1YmxpYyBnZXQgc2hvd0luVG9vbGJveCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy53aWRnZXRKc29uLnNob3dJblRvb2xib3ggIT09IGZhbHNlO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd0luVG9vbGJveCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLndpZGdldEpzb24uc2hvd0luVG9vbGJveCA9IHZhbDtcbiAgfVxuICBwdWJsaWMgaW5pdCgpIHtcbiAgICBpZiAodGhpcy53aWRnZXRKc29uLmluaXQpIHtcbiAgICAgIHRoaXMud2lkZ2V0SnNvbi5pbml0KCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBhY3RpdmF0ZWRCeUNoYW5nZWQoYWN0aXZhdGVkQnk6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmlzTGlicmFyeUxvYWRlZCgpICYmIHRoaXMud2lkZ2V0SnNvbi5hY3RpdmF0ZWRCeUNoYW5nZWQpIHtcbiAgICAgIHRoaXMud2lkZ2V0SnNvbi5hY3RpdmF0ZWRCeUNoYW5nZWQoYWN0aXZhdGVkQnkpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGlzTGlicmFyeUxvYWRlZCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy53aWRnZXRKc29uLndpZGdldElzTG9hZGVkKVxuICAgICAgcmV0dXJuIHRoaXMud2lkZ2V0SnNvbi53aWRnZXRJc0xvYWRlZCgpID09IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIGdldCBpc0RlZmF1bHRSZW5kZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMud2lkZ2V0SnNvbi5pc0RlZmF1bHRSZW5kZXI7XG4gIH1cbiAgcHVibGljIGdldCBwZGZRdWVzdGlvblR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy53aWRnZXRKc29uLnBkZlF1ZXN0aW9uVHlwZTtcbiAgfVxuICBwdWJsaWMgZ2V0IHBkZlJlbmRlcigpIHtcbiAgICByZXR1cm4gdGhpcy53aWRnZXRKc29uLnBkZlJlbmRlcjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ3VzdG9tV2lkZ2V0Q29sbGVjdGlvbiB7XG4gIHB1YmxpYyBzdGF0aWMgSW5zdGFuY2U6IEN1c3RvbVdpZGdldENvbGxlY3Rpb24gPSBuZXcgQ3VzdG9tV2lkZ2V0Q29sbGVjdGlvbigpO1xuICBwcml2YXRlIHdpZGdldHNWYWx1ZXM6IEFycmF5PFF1ZXN0aW9uQ3VzdG9tV2lkZ2V0PiA9IFtdO1xuICBwcml2YXRlIHdpZGdldHNBY3RpdmF0ZWRCeSA9IHt9O1xuXG4gIHB1YmxpYyBvbkN1c3RvbVdpZGdldEFkZGVkOiBFdmVudDxcbiAgICAoY3VzdG9tV2lkZ2V0OiBRdWVzdGlvbkN1c3RvbVdpZGdldCkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChjdXN0b21XaWRnZXQ6IFF1ZXN0aW9uQ3VzdG9tV2lkZ2V0KSA9PiBhbnksIGFueT4oKTtcblxuICBwdWJsaWMgZ2V0IHdpZGdldHMoKTogQXJyYXk8UXVlc3Rpb25DdXN0b21XaWRnZXQ+IHtcbiAgICByZXR1cm4gdGhpcy53aWRnZXRzVmFsdWVzO1xuICB9XG4gIHB1YmxpYyBhZGQod2lkZ2V0SnNvbjogYW55LCBhY3RpdmF0ZWRCeTogc3RyaW5nID0gXCJwcm9wZXJ0eVwiKSB7XG4gICAgdGhpcy5hZGRDdXN0b21XaWRnZXQod2lkZ2V0SnNvbiwgYWN0aXZhdGVkQnkpO1xuICB9XG4gIHB1YmxpYyBhZGRDdXN0b21XaWRnZXQoXG4gICAgd2lkZ2V0SnNvbjogYW55LFxuICAgIGFjdGl2YXRlZEJ5OiBzdHJpbmcgPSBcInByb3BlcnR5XCJcbiAgKTogUXVlc3Rpb25DdXN0b21XaWRnZXQge1xuICAgIHZhciBuYW1lID0gd2lkZ2V0SnNvbi5uYW1lO1xuICAgIGlmICghbmFtZSkge1xuICAgICAgbmFtZSA9IFwid2lkZ2V0X1wiICsgdGhpcy53aWRnZXRzLmxlbmd0aCArIDE7XG4gICAgfVxuICAgIHZhciBjdXN0b21XaWRnZXQgPSBuZXcgUXVlc3Rpb25DdXN0b21XaWRnZXQobmFtZSwgd2lkZ2V0SnNvbik7XG4gICAgdGhpcy53aWRnZXRzVmFsdWVzLnB1c2goY3VzdG9tV2lkZ2V0KTtcbiAgICBjdXN0b21XaWRnZXQuaW5pdCgpO1xuICAgICg8YW55PnRoaXMpLndpZGdldHNBY3RpdmF0ZWRCeVtuYW1lXSA9IGFjdGl2YXRlZEJ5O1xuICAgIGN1c3RvbVdpZGdldC5hY3RpdmF0ZWRCeUNoYW5nZWQoYWN0aXZhdGVkQnkpO1xuICAgIHRoaXMub25DdXN0b21XaWRnZXRBZGRlZC5maXJlKGN1c3RvbVdpZGdldCwgbnVsbCk7XG4gICAgcmV0dXJuIGN1c3RvbVdpZGdldDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgd2F5IHRoZSBjdXN0b20gd2lnZXQgaXMgYWN0aXZhdGVkLiBJdCBjYW4gYmUgYWN0aXZhdGVkIGJ5IGEgcHJvcGVydHkgKFwicHJvcGVydHlcIiksIHF1ZXN0aW9uIHR5cGUgKFwidHlwZVwiKSBvciBieSBuZXcvY3VzdG9tIHF1ZXN0aW9uIHR5cGUgKFwiY3VzdG9tdHlwZVwiKS5cbiAgICogQHBhcmFtIHdpZGdldE5hbWUgdGhlIGN1c3RvbSB3aWRnZXQgbmFtZVxuICAgKiBAc2VlIHNldEFjdGl2YXRlZEJ5XG4gICAqL1xuICBwdWJsaWMgZ2V0QWN0aXZhdGVkQnkod2lkZ2V0TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB2YXIgcmVzID0gKDxhbnk+dGhpcykud2lkZ2V0c0FjdGl2YXRlZEJ5W3dpZGdldE5hbWVdO1xuICAgIHJldHVybiByZXMgPyByZXMgOiBcInByb3BlcnR5XCI7XG4gIH1cbiAgLyoqXG4gICAqIFNldHMgdGhlIHdheSB0aGUgY3VzdG9tIHdpZ2V0IGlzIGFjdGl2YXRlZC4gVGhlIGFjdGl2YXRpb24gdHlwZXMgYXJlOiBwcm9wZXJ0eSAoXCJwcm9wZXJ0eVwiKSwgcXVlc3Rpb24gdHlwZSAoXCJ0eXBlXCIpIG9yIG5ldy9jdXN0b20gcXVlc3Rpb24gdHlwZSAoXCJjdXN0b210eXBlXCIpLiBBIGN1c3RvbSB3aWdldCBtYXkgc3VwcG9ydCBhbGwgb3Igb25seSBzb21lIG9mIHRoaXMgYWN0aXZhdGlvbiB0eXBlcy5cbiAgICogQHBhcmFtIHdpZGdldE5hbWVcbiAgICogQHBhcmFtIGFjdGl2YXRlZEJ5IHRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSB2YXJpYW50czogXCJwcm9wZXJ0eVwiLCBcInR5cGVcIiBhbmQgXCJjdXN0b210eXBlXCJcbiAgICovXG4gIHB1YmxpYyBzZXRBY3RpdmF0ZWRCeSh3aWRnZXROYW1lOiBzdHJpbmcsIGFjdGl2YXRlZEJ5OiBzdHJpbmcpIHtcbiAgICBpZiAoIXdpZGdldE5hbWUgfHwgIWFjdGl2YXRlZEJ5KSByZXR1cm47XG4gICAgdmFyIHdpZGdldCA9IHRoaXMuZ2V0Q3VzdG9tV2lkZ2V0QnlOYW1lKHdpZGdldE5hbWUpO1xuICAgIGlmICghd2lkZ2V0KSByZXR1cm47XG4gICAgKDxhbnk+dGhpcykud2lkZ2V0c0FjdGl2YXRlZEJ5W3dpZGdldE5hbWVdID0gYWN0aXZhdGVkQnk7XG4gICAgd2lkZ2V0LmFjdGl2YXRlZEJ5Q2hhbmdlZChhY3RpdmF0ZWRCeSk7XG4gIH1cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIHRoaXMud2lkZ2V0c1ZhbHVlcyA9IFtdO1xuICB9XG4gIHB1YmxpYyBnZXRDdXN0b21XaWRnZXRCeU5hbWUobmFtZTogc3RyaW5nKTogUXVlc3Rpb25DdXN0b21XaWRnZXQge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy53aWRnZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy53aWRnZXRzW2ldLm5hbWUgPT0gbmFtZSkgcmV0dXJuIHRoaXMud2lkZ2V0c1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIGdldEN1c3RvbVdpZGdldChxdWVzdGlvbjogSVF1ZXN0aW9uKTogUXVlc3Rpb25DdXN0b21XaWRnZXQge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy53aWRnZXRzVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy53aWRnZXRzVmFsdWVzW2ldLmlzRml0KHF1ZXN0aW9uKSkgcmV0dXJuIHRoaXMud2lkZ2V0c1ZhbHVlc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiIsImltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlFcnJvciB9IGZyb20gXCIuL3N1cnZleS1lcnJvclwiO1xuaW1wb3J0IHsgSVN1cnZleUltcGwsIElTdXJ2ZXkgfSBmcm9tIFwiLi9iYXNlLWludGVyZmFjZXNcIjtcbmltcG9ydCB7IFN1cnZleU1vZGVsIH0gZnJvbSBcIi4vc3VydmV5XCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBJdGVtVmFsdWUgfSBmcm9tIFwiLi9pdGVtdmFsdWVcIjtcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7IE90aGVyRW1wdHlFcnJvciB9IGZyb20gXCIuL2Vycm9yXCI7XG5pbXBvcnQgeyBDaG9pY2VzUmVzdGZ1bCB9IGZyb20gXCIuL2Nob2ljZXNSZXN0ZnVsXCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBDb25kaXRpb25SdW5uZXIgfSBmcm9tIFwiLi9jb25kaXRpb25zXCI7XG5pbXBvcnQgeyBIZWxwZXJzLCBIYXNoVGFibGUgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzXCI7XG5pbXBvcnQgeyBDc3NDbGFzc0J1aWxkZXIgfSBmcm9tIFwiLi91dGlscy9jc3NDbGFzc0J1aWxkZXJcIjtcblxuLyoqXG4gKiBJdCBpcyBhIGJhc2UgY2xhc3MgZm9yIGNoZWNrYm94LCBkcm9wZG93biBhbmQgcmFkaW9ncm91cCBxdWVzdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvblNlbGVjdEJhc2UgZXh0ZW5kcyBRdWVzdGlvbiB7XG4gIHB1YmxpYyB2aXNpYmxlQ2hvaWNlc0NoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBmaWx0ZXJlZENob2ljZXNWYWx1ZTogQXJyYXk8SXRlbVZhbHVlPjtcbiAgcHJpdmF0ZSBjb25kaXRpb25DaG9pY2VzVmlzaWJsZUlmUnVubmVyOiBDb25kaXRpb25SdW5uZXI7XG4gIHByaXZhdGUgY29uZGl0aW9uQ2hvaWNlc0VuYWJsZUlmUnVubmVyOiBDb25kaXRpb25SdW5uZXI7XG4gIHByaXZhdGUgY29tbWVudFZhbHVlOiBzdHJpbmc7XG4gIHByaXZhdGUgcHJldkNvbW1lbnRWYWx1ZTogc3RyaW5nO1xuICBwcml2YXRlIG90aGVySXRlbVZhbHVlOiBJdGVtVmFsdWUgPSBuZXcgSXRlbVZhbHVlKFwib3RoZXJcIik7XG4gIHByaXZhdGUgY2hvaWNlc0Zyb21Vcmw6IEFycmF5PEl0ZW1WYWx1ZT47XG4gIHByaXZhdGUgY2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0czogYW55O1xuICBwcml2YXRlIGlzQ2hvaWNlc0xvYWRlZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBlbmFibGVPbkxvYWRpbmdDaG9pY2VzOiBib29sZWFuO1xuICBwcml2YXRlIGRlcGVuZGVkUXVlc3Rpb25zOiBBcnJheTxRdWVzdGlvblNlbGVjdEJhc2U+ID0gW107XG4gIHByaXZhdGUgbm9uZUl0ZW1WYWx1ZTogSXRlbVZhbHVlID0gbmV3IEl0ZW1WYWx1ZShcIm5vbmVcIik7XG4gIHByaXZhdGUgbmV3SXRlbVZhbHVlOiBJdGVtVmFsdWU7XG4gIHByaXZhdGUgY2FuU2hvd09wdGlvbkl0ZW1DYWxsYmFjazogKGl0ZW06IEl0ZW1WYWx1ZSkgPT4gYm9vbGVhbjtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdmFyIG5vbmVJdGVtVGV4dCA9IHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJub25lVGV4dFwiLCB0aGlzLCB0cnVlKTtcbiAgICBub25lSXRlbVRleHQub25HZXRUZXh0Q2FsbGJhY2sgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgICByZXR1cm4gISF0ZXh0ID8gdGV4dCA6IHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJub25lSXRlbVRleHRcIik7XG4gICAgfTtcbiAgICB0aGlzLm5vbmVJdGVtVmFsdWUubG9jT3duZXIgPSB0aGlzO1xuICAgIHRoaXMubm9uZUl0ZW1WYWx1ZS5zZXRMb2NUZXh0KG5vbmVJdGVtVGV4dCk7XG5cbiAgICB0aGlzLmNyZWF0ZUl0ZW1WYWx1ZXMoXCJjaG9pY2VzXCIpO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJjaG9pY2VzXCIsICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5maWx0ZXJJdGVtcygpKSB7XG4gICAgICAgIHRoaXMub25WaXNpYmxlQ2hvaWNlc0NoYW5nZWQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoXG4gICAgICBbXCJjaG9pY2VzRnJvbVF1ZXN0aW9uXCIsIFwiY2hvaWNlc0Zyb21RdWVzdGlvbk1vZGVcIiwgXCJoYXNOb25lXCJdLFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwiaGlkZUlmQ2hvaWNlc0VtcHR5XCIsICgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlVmlzaWJpbGl0eUJhc2VkT25DaG9pY2VzKCk7XG4gICAgfSk7XG4gICAgdGhpcy5jcmVhdGVOZXdBcnJheShcInZpc2libGVDaG9pY2VzXCIpO1xuICAgIHRoaXMuc2V0TmV3UmVzdGZ1bFByb3BlcnR5KCk7XG4gICAgdmFyIGxvY090aGVyVGV4dCA9IHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJvdGhlclRleHRcIiwgdGhpcywgdHJ1ZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcIm90aGVyRXJyb3JUZXh0XCIsIHRoaXMsIHRydWUpO1xuICAgIHRoaXMub3RoZXJJdGVtVmFsdWUubG9jT3duZXIgPSB0aGlzO1xuICAgIHRoaXMub3RoZXJJdGVtVmFsdWUuc2V0TG9jVGV4dChsb2NPdGhlclRleHQpO1xuICAgIGxvY090aGVyVGV4dC5vbkdldFRleHRDYWxsYmFjayA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICAgIHJldHVybiAhIXRleHQgPyB0ZXh0IDogc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm90aGVySXRlbVRleHRcIik7XG4gICAgfTtcbiAgICB0aGlzLmNob2ljZXNCeVVybC5jcmVhdGVJdGVtVmFsdWUgPSAodmFsdWU6IGFueSk6IEl0ZW1WYWx1ZSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVJdGVtVmFsdWUodmFsdWUpO1xuICAgIH07XG4gICAgdGhpcy5jaG9pY2VzQnlVcmwuYmVmb3JlU2VuZFJlcXVlc3RDYWxsYmFjayA9ICgpOiB2b2lkID0+IHtcbiAgICAgIHRoaXMub25CZWZvcmVTZW5kUmVxdWVzdCgpO1xuICAgIH07XG4gICAgdGhpcy5jaG9pY2VzQnlVcmwuZ2V0UmVzdWx0Q2FsbGJhY2sgPSAoaXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4pOiB2b2lkID0+IHtcbiAgICAgIHRoaXMub25Mb2FkQ2hvaWNlc0Zyb21VcmwoaXRlbXMpO1xuICAgIH07XG4gICAgdGhpcy5jaG9pY2VzQnlVcmwudXBkYXRlUmVzdWx0Q2FsbGJhY2sgPSAoXG4gICAgICBpdGVtczogQXJyYXk8SXRlbVZhbHVlPixcbiAgICAgIHNlcnZlclJlc3VsdDogYW55XG4gICAgKTogQXJyYXk8SXRlbVZhbHVlPiA9PiB7XG4gICAgICBpZiAodGhpcy5zdXJ2ZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3VydmV5LnVwZGF0ZUNob2ljZXNGcm9tU2VydmVyKHRoaXMsIGl0ZW1zLCBzZXJ2ZXJSZXN1bHQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH07XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcIm90aGVyUGxhY2VIb2xkZXJcIiwgdGhpcyk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJzZWxlY3RiYXNlXCI7XG4gIH1cbiAgcHVibGljIGRpc3Bvc2UoKSB7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kZXBlbmRlZFF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5kZXBlbmRlZFF1ZXN0aW9uc1tpXS5jaG9pY2VzRnJvbVF1ZXN0aW9uID0gXCJcIjtcbiAgICB9XG4gICAgdGhpcy5yZW1vdmVGcm9tRGVwZW5kZWRRdWVzdGlvbih0aGlzLmdldFF1ZXN0aW9uV2l0aENob2ljZXMoKSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEl0ZW1WYWx1ZVR5cGUoKSB7XG4gICAgcmV0dXJuIFwiaXRlbXZhbHVlXCI7XG4gIH1cbiAgcHVibGljIGNyZWF0ZUl0ZW1WYWx1ZSh2YWx1ZTogYW55KTogSXRlbVZhbHVlIHtcbiAgICByZXR1cm4gU2VyaWFsaXplci5jcmVhdGVDbGFzcyh0aGlzLmdldEl0ZW1WYWx1ZVR5cGUoKSwgdmFsdWUpO1xuICB9XG4gIHB1YmxpYyBzdXBwb3J0R29OZXh0UGFnZUVycm9yKCkge1xuICAgIHJldHVybiAhdGhpcy5pc090aGVyU2VsZWN0ZWQgfHwgISF0aGlzLmNvbW1lbnQ7XG4gIH1cbiAgaXNMYXlvdXRUeXBlU3VwcG9ydGVkKGxheW91dFR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBsb2NhbGVDaGFuZ2VkKCkge1xuICAgIHN1cGVyLmxvY2FsZUNoYW5nZWQoKTtcbiAgICBpZiAodGhpcy5jaG9pY2VzT3JkZXIgIT09IFwibm9uZVwiKSB7XG4gICAgICB0aGlzLnVwZGF0ZVZpc2libGVDaG9pY2VzKCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBsb2NTdHJzQ2hhbmdlZCgpIHtcbiAgICBzdXBlci5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIGlmICghIXRoaXMuY2hvaWNlc0Zyb21VcmwpIHtcbiAgICAgIEl0ZW1WYWx1ZS5sb2NTdHJzQ2hhbmdlZCh0aGlzLmNob2ljZXNGcm9tVXJsKTtcbiAgICAgIEl0ZW1WYWx1ZS5sb2NTdHJzQ2hhbmdlZCh0aGlzLnZpc2libGVDaG9pY2VzKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG90aGVyIGl0ZW0uIEJ5IHVzaW5nIHRoaXMgcHJvcGVydHksIHlvdSBtYXkgY2hhbmdlIHByb2dyYW1tYXRpY2FsbHkgaXQncyB2YWx1ZSBhbmQgdGV4dC5cbiAgICogQHNlZSBoYXNPdGhlclxuICAgKi9cbiAgcHVibGljIGdldCBvdGhlckl0ZW0oKTogSXRlbVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5vdGhlckl0ZW1WYWx1ZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGEgdXNlciBzZWxlY3QgdGhlICdvdGhlcicgaXRlbS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNPdGhlclNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc090aGVyICYmIHRoaXMuZ2V0SGFzT3RoZXIodGhpcy5yZW5kZXJlZFZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSwgdG8gc2hvdyB0aGUgXCJOb25lXCIgaXRlbSBvbiB0aGUgYm90dG9tLiBJZiBlbmQtdXNlciBjaGVja3MgdGhpcyBpdGVtLCBhbGwgb3RoZXIgaXRlbXMgd291bGQgYmUgdW5jaGVja2VkLlxuICAgKi9cbiAgcHVibGljIGdldCBoYXNOb25lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJoYXNOb25lXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGhhc05vbmUodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaGFzTm9uZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBub25lIGl0ZW0uIEJ5IHVzaW5nIHRoaXMgcHJvcGVydHksIHlvdSBtYXkgY2hhbmdlIHByb2dyYW1tYXRpY2FsbHkgaXQncyB2YWx1ZSBhbmQgdGV4dC5cbiAgICogQHNlZSBoYXNOb25lXG4gICAqL1xuICBwdWJsaWMgZ2V0IG5vbmVJdGVtKCk6IEl0ZW1WYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMubm9uZUl0ZW1WYWx1ZTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gc2V0IHRoZSBkaWZmZXJlbnQgdGV4dCBmb3Igbm9uZSBpdGVtLlxuICAgKi9cbiAgcHVibGljIGdldCBub25lVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwibm9uZVRleHRcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJub25lSXRlbVRleHRcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgbm9uZVRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm5vbmVUZXh0XCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY05vbmVUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcIm5vbmVUZXh0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBBbiBleHByZXNzaW9uIHRoYXQgcmV0dXJucyB0cnVlIG9yIGZhbHNlLiBJdCBydW5zIGFnYWluc3QgZWFjaCBjaG9pY2VzIGl0ZW0gYW5kIGlmIGZvciB0aGlzIGl0ZW0gaXQgcmV0dXJucyB0cnVlLCB0aGVuIHRoZSBpdGVtIGlzIHZpc2libGUgb3RoZXJ3aXNlIHRoZSBpdGVtIGJlY29tZXMgaW52aXNpYmxlLiBQbGVhc2UgdXNlIHtpdGVtfSB0byBnZXQgdGhlIGN1cnJlbnQgaXRlbSB2YWx1ZSBpbiB0aGUgZXhwcmVzc2lvbi5cbiAgICogQHNlZSB2aXNpYmxlSWZcbiAgICogQHNlZSBjaG9pY2VzRW5hYmxlSWZcbiAgICovXG4gIHB1YmxpYyBnZXQgY2hvaWNlc1Zpc2libGVJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzVmlzaWJsZUlmXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY2hvaWNlc1Zpc2libGVJZih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNWaXNpYmxlSWZcIiwgdmFsKTtcbiAgICB0aGlzLmZpbHRlckl0ZW1zKCk7XG4gIH1cbiAgLyoqXG4gICAqIEFuIGV4cHJlc3Npb24gdGhhdCByZXR1cm5zIHRydWUgb3IgZmFsc2UuIEl0IHJ1bnMgYWdhaW5zdCBlYWNoIGNob2ljZXMgaXRlbSBhbmQgaWYgZm9yIHRoaXMgaXRlbSBpdCByZXR1cm5zIHRydWUsIHRoZW4gdGhlIGl0ZW0gaXMgZW5hYmxlZCBvdGhlcndpc2UgdGhlIGl0ZW0gYmVjb21lcyBkaXNhYmxlZC4gUGxlYXNlIHVzZSB7aXRlbX0gdG8gZ2V0IHRoZSBjdXJyZW50IGl0ZW0gdmFsdWUgaW4gdGhlIGV4cHJlc3Npb24uXG4gICAqIEBzZWUgY2hvaWNlc1Zpc2libGVJZlxuICAgKi9cbiAgcHVibGljIGdldCBjaG9pY2VzRW5hYmxlSWYoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY2hvaWNlc0VuYWJsZUlmXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY2hvaWNlc0VuYWJsZUlmKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY2hvaWNlc0VuYWJsZUlmXCIsIHZhbCk7XG4gICAgdGhpcy5maWx0ZXJJdGVtcygpO1xuICB9XG4gIHB1YmxpYyBydW5Db25kaXRpb24odmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICBzdXBlci5ydW5Db25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB0aGlzLnJ1bkl0ZW1zRW5hYmxlQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgdGhpcy5ydW5JdGVtc0NvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIHByb3RlY3RlZCBpc1RleHRWYWx1ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTsgLy9mb3IgY29tbWVudHMgYW5kIG90aGVyc1xuICB9XG4gIHByaXZhdGUgaXNTZXR0aW5nRGVmYXVsdFZhbHVlOiBib29sZWFuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBzZXREZWZhdWx0VmFsdWUoKSB7XG4gICAgdGhpcy5pc1NldHRpbmdEZWZhdWx0VmFsdWUgPVxuICAgICAgIXRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMuZGVmYXVsdFZhbHVlKSAmJlxuICAgICAgdGhpcy5oYXNVbmtub3duVmFsdWUodGhpcy5kZWZhdWx0VmFsdWUpO1xuICAgIHRoaXMucHJldkNvbW1lbnRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICBzdXBlci5zZXREZWZhdWx0VmFsdWUoKTtcbiAgICB0aGlzLmlzU2V0dGluZ0RlZmF1bHRWYWx1ZSA9IGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBnZXRJc011bHRpcGxlVmFsdWUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBjb252ZXJ0RGVmYXVsdFZhbHVlKHZhbDogYW55KTogYW55IHtcbiAgICBpZiAodmFsID09IG51bGwgfHwgdmFsID09IHVuZGVmaW5lZCkgcmV0dXJuIHZhbDtcbiAgICBpZiAodGhpcy5nZXRJc011bHRpcGxlVmFsdWUoKSkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbCkpIHJldHVybiBbdmFsXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSAmJiB2YWwubGVuZ3RoID4gMCkgcmV0dXJuIHZhbFswXTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICBwcm90ZWN0ZWQgZmlsdGVySXRlbXMoKTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pc0xvYWRpbmdGcm9tSnNvbiB8fFxuICAgICAgIXRoaXMuZGF0YSB8fFxuICAgICAgdGhpcy5hcmVJbnZpc2libGVFbGVtZW50c1Nob3dpbmdcbiAgICApXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHZhbHVlcyA9IHRoaXMuZ2V0RGF0YUZpbHRlcmVkVmFsdWVzKCk7XG4gICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmdldERhdGFGaWx0ZXJlZFByb3BlcnRpZXMoKTtcbiAgICB0aGlzLnJ1bkl0ZW1zRW5hYmxlQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgcmV0dXJuIHRoaXMucnVuSXRlbXNDb25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICBwcm90ZWN0ZWQgcnVuSXRlbXNDb25kaXRpb24oXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApOiBib29sZWFuIHtcbiAgICB0aGlzLnNldENvbmRpdGlvbmFsQ2hvaWNlc1J1bm5lcigpO1xuICAgIHZhciBoYXNDaGFuZ2VzID0gdGhpcy5ydW5Db25kaXRpb25zRm9ySXRlbXModmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICBpZiAoXG4gICAgICAhIXRoaXMuZmlsdGVyZWRDaG9pY2VzVmFsdWUgJiZcbiAgICAgIHRoaXMuZmlsdGVyZWRDaG9pY2VzVmFsdWUubGVuZ3RoID09PSB0aGlzLmFjdGl2ZUNob2ljZXMubGVuZ3RoXG4gICAgKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkQ2hvaWNlc1ZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoaGFzQ2hhbmdlcykge1xuICAgICAgdGhpcy5vblZpc2libGVDaG9pY2VzQ2hhbmdlZCgpO1xuICAgICAgdGhpcy5jbGVhckluY29ycmVjdFZhbHVlcygpO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQ2hhbmdlcztcbiAgfVxuICBwcm90ZWN0ZWQgcnVuSXRlbXNFbmFibGVDb25kaXRpb24oXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApOiBhbnkge1xuICAgIHRoaXMuc2V0Q29uZGl0aW9uYWxFbmFibGVDaG9pY2VzUnVubmVyKCk7XG4gICAgdmFyIGhhc0NoYW5nZWQgPSBJdGVtVmFsdWUucnVuRW5hYmxlZENvbmRpdGlvbnNGb3JJdGVtcyhcbiAgICAgIHRoaXMuYWN0aXZlQ2hvaWNlcyxcbiAgICAgIHRoaXMuY29uZGl0aW9uQ2hvaWNlc0VuYWJsZUlmUnVubmVyLFxuICAgICAgdmFsdWVzLFxuICAgICAgcHJvcGVydGllcyxcbiAgICAgIChpdGVtOiBJdGVtVmFsdWUpOiBib29sZWFuID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMub25FbmFibGVJdGVtQ2FsbEJhY2soaXRlbSk7XG4gICAgICB9XG4gICAgKTtcbiAgICBpZiAoaGFzQ2hhbmdlZCkge1xuICAgICAgdGhpcy5jbGVhckRpc2FibGVkVmFsdWVzKCk7XG4gICAgfVxuICAgIHRoaXMub25BZnRlclJ1bkl0ZW1zRW5hYmxlQ29uZGl0aW9uKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQWZ0ZXJSdW5JdGVtc0VuYWJsZUNvbmRpdGlvbigpIHt9XG4gIHByb3RlY3RlZCBvbkVuYWJsZUl0ZW1DYWxsQmFjayhpdGVtOiBJdGVtVmFsdWUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcml2YXRlIHNldENvbmRpdGlvbmFsQ2hvaWNlc1J1bm5lcigpIHtcbiAgICBpZiAodGhpcy5jaG9pY2VzVmlzaWJsZUlmKSB7XG4gICAgICBpZiAoIXRoaXMuY29uZGl0aW9uQ2hvaWNlc1Zpc2libGVJZlJ1bm5lcikge1xuICAgICAgICB0aGlzLmNvbmRpdGlvbkNob2ljZXNWaXNpYmxlSWZSdW5uZXIgPSBuZXcgQ29uZGl0aW9uUnVubmVyKFxuICAgICAgICAgIHRoaXMuY2hvaWNlc1Zpc2libGVJZlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5jb25kaXRpb25DaG9pY2VzVmlzaWJsZUlmUnVubmVyLmV4cHJlc3Npb24gPSB0aGlzLmNob2ljZXNWaXNpYmxlSWY7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29uZGl0aW9uQ2hvaWNlc1Zpc2libGVJZlJ1bm5lciA9IG51bGw7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgc2V0Q29uZGl0aW9uYWxFbmFibGVDaG9pY2VzUnVubmVyKCkge1xuICAgIGlmICh0aGlzLmNob2ljZXNFbmFibGVJZikge1xuICAgICAgaWYgKCF0aGlzLmNvbmRpdGlvbkNob2ljZXNFbmFibGVJZlJ1bm5lcikge1xuICAgICAgICB0aGlzLmNvbmRpdGlvbkNob2ljZXNFbmFibGVJZlJ1bm5lciA9IG5ldyBDb25kaXRpb25SdW5uZXIoXG4gICAgICAgICAgdGhpcy5jaG9pY2VzRW5hYmxlSWZcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29uZGl0aW9uQ2hvaWNlc0VuYWJsZUlmUnVubmVyLmV4cHJlc3Npb24gPSB0aGlzLmNob2ljZXNFbmFibGVJZjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25kaXRpb25DaG9pY2VzRW5hYmxlSWZSdW5uZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHJ1bkNvbmRpdGlvbnNGb3JJdGVtcyhcbiAgICB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+XG4gICk6IGJvb2xlYW4ge1xuICAgIHRoaXMuZmlsdGVyZWRDaG9pY2VzVmFsdWUgPSBbXTtcbiAgICByZXR1cm4gSXRlbVZhbHVlLnJ1bkNvbmRpdGlvbnNGb3JJdGVtcyhcbiAgICAgIHRoaXMuYWN0aXZlQ2hvaWNlcyxcbiAgICAgIHRoaXMuZ2V0RmlsdGVyZWRDaG9pY2VzKCksXG4gICAgICB0aGlzLmFyZUludmlzaWJsZUVsZW1lbnRzU2hvd2luZ1xuICAgICAgICA/IG51bGxcbiAgICAgICAgOiB0aGlzLmNvbmRpdGlvbkNob2ljZXNWaXNpYmxlSWZSdW5uZXIsXG4gICAgICB2YWx1ZXMsXG4gICAgICBwcm9wZXJ0aWVzLFxuICAgICAgIXRoaXMuc3VydmV5IHx8ICF0aGlzLnN1cnZleS5hcmVJbnZpc2libGVFbGVtZW50c1Nob3dpbmdcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBnZXRIYXNPdGhlcih2YWw6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWwgPT09IHRoaXMub3RoZXJJdGVtLnZhbHVlO1xuICB9XG4gIGdldCB2YWxpZGF0ZWRWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnJlbmRyZWRWYWx1ZVRvRGF0YUNvcmUodGhpcy52YWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVJlc3RmdWwoKTogQ2hvaWNlc1Jlc3RmdWwge1xuICAgIHJldHVybiBuZXcgQ2hvaWNlc1Jlc3RmdWwoKTtcbiAgfVxuICBwcml2YXRlIHNldE5ld1Jlc3RmdWxQcm9wZXJ0eSgpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzQnlVcmxcIiwgdGhpcy5jcmVhdGVSZXN0ZnVsKCkpO1xuICAgIHRoaXMuY2hvaWNlc0J5VXJsLm93bmVyID0gdGhpcztcbiAgICB0aGlzLmNob2ljZXNCeVVybC5sb2FkaW5nT3duZXIgPSB0aGlzO1xuICB9XG4gIHByb3RlY3RlZCBnZXRRdWVzdGlvbkNvbW1lbnQoKTogc3RyaW5nIHtcbiAgICBpZiAoISF0aGlzLmNvbW1lbnRWYWx1ZSkgcmV0dXJuIHRoaXMuY29tbWVudFZhbHVlO1xuICAgIGlmICh0aGlzLmhhc0NvbW1lbnQgfHwgdGhpcy5nZXRTdG9yZU90aGVyc0FzQ29tbWVudCgpKVxuICAgICAgcmV0dXJuIHN1cGVyLmdldFF1ZXN0aW9uQ29tbWVudCgpO1xuICAgIHJldHVybiB0aGlzLmNvbW1lbnRWYWx1ZTtcbiAgfVxuICBwcml2YXRlIGlzU2V0dGluZ0NvbW1lbnQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHNldFF1ZXN0aW9uQ29tbWVudChuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuaGFzQ29tbWVudCB8fCB0aGlzLmdldFN0b3JlT3RoZXJzQXNDb21tZW50KCkpXG4gICAgICBzdXBlci5zZXRRdWVzdGlvbkNvbW1lbnQobmV3VmFsdWUpO1xuICAgIGVsc2Uge1xuICAgICAgaWYgKCF0aGlzLmlzU2V0dGluZ0NvbW1lbnQgJiYgbmV3VmFsdWUgIT0gdGhpcy5jb21tZW50VmFsdWUpIHtcbiAgICAgICAgdGhpcy5pc1NldHRpbmdDb21tZW50ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jb21tZW50VmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgaWYgKHRoaXMuaXNPdGhlclNlbGVjdGVkICYmICF0aGlzLmlzUmVuZGVyZWRWYWx1ZVNldHRpbmcpIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5yZW5kcmVkVmFsdWVUb0RhdGEodGhpcy5yZW5kZXJlZFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzU2V0dGluZ0NvbW1lbnQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIGNsZWFyVmFsdWUoKSB7XG4gICAgc3VwZXIuY2xlYXJWYWx1ZSgpO1xuICAgIHRoaXMucHJldkNvbW1lbnRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICB1cGRhdGVDb21tZW50RnJvbVN1cnZleShuZXdWYWx1ZTogYW55KTogYW55IHtcbiAgICBzdXBlci51cGRhdGVDb21tZW50RnJvbVN1cnZleShuZXdWYWx1ZSk7XG4gICAgdGhpcy5wcmV2Q29tbWVudFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIHB1YmxpYyBnZXQgcmVuZGVyZWRWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyZW5kZXJlZFZhbHVlXCIsIG51bGwpO1xuICB9XG4gIHB1YmxpYyBzZXQgcmVuZGVyZWRWYWx1ZSh2YWw6IGFueSkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJlbmRlcmVkVmFsdWVcIiwgdmFsKTtcbiAgICB2YXIgdmFsID0gdGhpcy5yZW5kcmVkVmFsdWVUb0RhdGEodmFsKTtcbiAgICBpZiAoIXRoaXMuaXNUd29WYWx1ZUVxdWFscyh2YWwsIHRoaXMudmFsdWUpKSB7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgc2V0UXVlc3Rpb25WYWx1ZShcbiAgICBuZXdWYWx1ZTogYW55LFxuICAgIHVwZGF0ZUlzQW5zd2VyZWQ6IGJvb2xlYW4gPSB0cnVlLFxuICAgIHVwZGF0ZUNvbW1lbnQ6IGJvb2xlYW4gPSB0cnVlXG4gICkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuaXNMb2FkaW5nRnJvbUpzb24gfHxcbiAgICAgIHRoaXMuaXNUd29WYWx1ZUVxdWFscyh0aGlzLnZhbHVlLCBuZXdWYWx1ZSlcbiAgICApXG4gICAgICByZXR1cm47XG4gICAgc3VwZXIuc2V0UXVlc3Rpb25WYWx1ZShuZXdWYWx1ZSwgdXBkYXRlSXNBbnN3ZXJlZCk7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmVuZGVyZWRWYWx1ZVwiLCB0aGlzLnJlbmRyZWRWYWx1ZUZyb21EYXRhKG5ld1ZhbHVlKSk7XG4gICAgaWYgKHRoaXMuaGFzQ29tbWVudCB8fCAhdXBkYXRlQ29tbWVudCkgcmV0dXJuO1xuICAgIHZhciBpc090aGVyU2VsID0gdGhpcy5pc090aGVyU2VsZWN0ZWQ7XG4gICAgaWYgKGlzT3RoZXJTZWwgJiYgISF0aGlzLnByZXZDb21tZW50VmFsdWUpIHtcbiAgICAgIHZhciBvbGRDb21tZW50ID0gdGhpcy5wcmV2Q29tbWVudFZhbHVlO1xuICAgICAgdGhpcy5wcmV2Q29tbWVudFZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5jb21tZW50ID0gb2xkQ29tbWVudDtcbiAgICB9XG4gICAgaWYgKCFpc090aGVyU2VsICYmICEhdGhpcy5jb21tZW50KSB7XG4gICAgICBpZiAodGhpcy5nZXRTdG9yZU90aGVyc0FzQ29tbWVudCgpKSB7XG4gICAgICAgIHRoaXMucHJldkNvbW1lbnRWYWx1ZSA9IHRoaXMuY29tbWVudDtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29tbWVudCA9IFwiXCI7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBzZXROZXdWYWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgbmV3VmFsdWUgPSB0aGlzLnZhbHVlRnJvbURhdGEobmV3VmFsdWUpO1xuICAgIGlmIChcbiAgICAgICghdGhpcy5jaG9pY2VzQnlVcmwuaXNSdW5uaW5nICYmXG4gICAgICAgICF0aGlzLmNob2ljZXNCeVVybC5pc1dhaXRpbmdGb3JQYXJhbWV0ZXJzKSB8fFxuICAgICAgIXRoaXMuaXNWYWx1ZUVtcHR5KG5ld1ZhbHVlKVxuICAgICkge1xuICAgICAgdGhpcy5jYWNoZWRWYWx1ZUZvclVybFJlcXVlc3RzID0gbmV3VmFsdWU7XG4gICAgfVxuICAgIHN1cGVyLnNldE5ld1ZhbHVlKG5ld1ZhbHVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgdmFsdWVGcm9tRGF0YSh2YWw6IGFueSk6IGFueSB7XG4gICAgbGV0IGNob2ljZWl0ZW0gPSBJdGVtVmFsdWUuZ2V0SXRlbUJ5VmFsdWUodGhpcy5hY3RpdmVDaG9pY2VzLCB2YWwpO1xuICAgIGlmICghIWNob2ljZWl0ZW0pIHtcbiAgICAgIHJldHVybiBjaG9pY2VpdGVtLnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gc3VwZXIudmFsdWVGcm9tRGF0YSh2YWwpO1xuICB9XG4gIHByb3RlY3RlZCByZW5kcmVkVmFsdWVGcm9tRGF0YSh2YWw6IGFueSk6IGFueSB7XG4gICAgaWYgKHRoaXMuZ2V0U3RvcmVPdGhlcnNBc0NvbW1lbnQoKSkgcmV0dXJuIHZhbDtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlZFZhbHVlRnJvbURhdGFDb3JlKHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRyZWRWYWx1ZVRvRGF0YSh2YWw6IGFueSk6IGFueSB7XG4gICAgaWYgKHRoaXMuZ2V0U3RvcmVPdGhlcnNBc0NvbW1lbnQoKSkgcmV0dXJuIHZhbDtcbiAgICByZXR1cm4gdGhpcy5yZW5kcmVkVmFsdWVUb0RhdGFDb3JlKHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlcmVkVmFsdWVGcm9tRGF0YUNvcmUodmFsOiBhbnkpOiBhbnkge1xuICAgIGlmICghdGhpcy5oYXNVbmtub3duVmFsdWUodmFsLCB0cnVlLCBmYWxzZSkpIHJldHVybiB0aGlzLnZhbHVlRnJvbURhdGEodmFsKTtcbiAgICB0aGlzLmNvbW1lbnQgPSB2YWw7XG4gICAgcmV0dXJuIHRoaXMub3RoZXJJdGVtLnZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCByZW5kcmVkVmFsdWVUb0RhdGFDb3JlKHZhbDogYW55KTogYW55IHtcbiAgICBpZiAodmFsID09IHRoaXMub3RoZXJJdGVtLnZhbHVlICYmIHRoaXMuZ2V0UXVlc3Rpb25Db21tZW50KCkpIHtcbiAgICAgIHZhbCA9IHRoaXMuZ2V0UXVlc3Rpb25Db21tZW50KCk7XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgcHJvdGVjdGVkIGhhc1Vua25vd25WYWx1ZShcbiAgICB2YWw6IGFueSxcbiAgICBpbmNsdWRlT3RoZXI6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBpc0ZpbHRlcmVkQ2hvaWNlczogYm9vbGVhbiA9IHRydWUsXG4gICAgY2hlY2tFbXB0eVZhbHVlOiBib29sZWFuID0gZmFsc2VcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCFjaGVja0VtcHR5VmFsdWUgJiYgdGhpcy5pc1ZhbHVlRW1wdHkodmFsKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChpbmNsdWRlT3RoZXIgJiYgdmFsID09IHRoaXMub3RoZXJJdGVtLnZhbHVlKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMuaGFzTm9uZSAmJiB2YWwgPT0gdGhpcy5ub25lSXRlbS52YWx1ZSkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBjaG9pY2VzID0gaXNGaWx0ZXJlZENob2ljZXNcbiAgICAgID8gdGhpcy5nZXRGaWx0ZXJlZENob2ljZXMoKVxuICAgICAgOiB0aGlzLmFjdGl2ZUNob2ljZXM7XG4gICAgcmV0dXJuIEl0ZW1WYWx1ZS5nZXRJdGVtQnlWYWx1ZShjaG9pY2VzLCB2YWwpID09IG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIGlzVmFsdWVEaXNhYmxlZCh2YWw6IGFueSk6IGJvb2xlYW4ge1xuICAgIHZhciBpdGVtVmFsdWUgPSBJdGVtVmFsdWUuZ2V0SXRlbUJ5VmFsdWUodGhpcy5nZXRGaWx0ZXJlZENob2ljZXMoKSwgdmFsKTtcbiAgICByZXR1cm4gISFpdGVtVmFsdWUgJiYgIWl0ZW1WYWx1ZS5pc0VuYWJsZWQ7XG4gIH1cbiAgLyoqXG4gICAqIElmIHRoZSBjbGVhckluY29ycmVjdFZhbHVlc0NhbGxiYWNrIGlzIHNldCwgaXQgaXMgdXNlZCB0byBjbGVhciBpbmNvcnJlY3QgdmFsdWVzIGluc3RlYWQgb2YgZGVmYXVsdCBiZWhhdmlvdXIuXG4gICAqL1xuICBwdWJsaWMgY2xlYXJJbmNvcnJlY3RWYWx1ZXNDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGZpbGwgdGhlIGNob2ljZXMgZnJvbSBhIFJFU1RmdWwgc2VydmljZS5cbiAgICogQHNlZSBjaG9pY2VzXG4gICAqIEBzZWUgQ2hvaWNlc1Jlc3RmdWxcbiAgICogQHNlZSBbRXhhbXBsZTogUkVTVGZ1bCBEcm9wZG93bl0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9FeGFtcGxlcy9MaWJyYXJ5Lz9pZD1xdWVzdGlvbnR5cGUtZHJvcGRvd25yZXN0ZnVsbClcbiAgICogQHNlZSBbRG9jczogRmlsbCBDaG9pY2VzIGZyb20gYSBSRVNUZnVsIFNlcnZpY2VdKGh0dHBzOi8vc3VydmV5anMuaW8vRG9jdW1lbnRhdGlvbi9MaWJyYXJ5Lz9pZD1MaWJyYXJ5T3ZlcnZpZXcjZmlsbC10aGUtY2hvaWNlcy1mcm9tLWEtcmVzdGZ1bC1zZXJ2aWNlKVxuICAgKi9cbiAgcHVibGljIGdldCBjaG9pY2VzQnlVcmwoKTogQ2hvaWNlc1Jlc3RmdWwge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzQnlVcmxcIik7XG4gIH1cbiAgcHVibGljIHNldCBjaG9pY2VzQnlVcmwodmFsOiBDaG9pY2VzUmVzdGZ1bCkge1xuICAgIGlmICghdmFsKSByZXR1cm47XG4gICAgdGhpcy5zZXROZXdSZXN0ZnVsUHJvcGVydHkoKTtcbiAgICB0aGlzLmNob2ljZXNCeVVybC5mcm9tSlNPTih2YWwudG9KU09OKCkpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBpdGVtcy4gRXZlcnkgaXRlbSBoYXMgdmFsdWUgYW5kIHRleHQuIElmIHRleHQgaXMgZW1wdHksIHRoZSB2YWx1ZSBpcyByZW5kZXJlZC4gVGhlIGl0ZW0gdGV4dCBzdXBwb3J0cyBtYXJrZG93bi5cbiAgICogQHNlZSBjaG9pY2VzQnlVcmxcbiAgICogQHNlZSBjaG9pY2VzRnJvbVF1ZXN0aW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNob2ljZXMoKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNcIik7XG4gIH1cbiAgcHVibGljIHNldCBjaG9pY2VzKG5ld1ZhbHVlOiBBcnJheTxhbnk+KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY2hvaWNlc1wiLCBuZXdWYWx1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGdldCBjaG9pY2VzIGZyb20gdGhlIHNwZWNpZmllZCBxdWVzdGlvbiBpbnN0ZWFkIG9mIGRlZmluaW5nIHRoZW0gaW4gdGhlIGN1cnJlbnQgcXVlc3Rpb24uIFRoaXMgYXZvaWRzIGR1cGxpY2F0aW9uIG9mIGNob2ljZXMgZGVjbGFyYXRpb24gaW4geW91ciBzdXJ2ZXkgZGVmaW5pdGlvbi5cbiAgICogQnkgc2V0dGluZyB0aGlzIHByb3BlcnR5LCB0aGUgXCJjaG9pY2VzXCIsIFwiY2hvaWNlc1Zpc2libGVJZlwiLCBcImNob2ljZXNFbmFibGVJZlwiIGFuZCBcImNob2ljZXNPcmRlclwiIHByb3BlcnRpZXMgYmVjb21lIGludmlzaWJsZSwgYmVjYXVzZSB0aGVzZSBxdWVzdGlvbiBjaGFyYWN0ZXJpc3RpY3MgZGVwZW5kIG9uIGFjdGlvbnMgaW4gYW5vdGhlciAoc3BlY2lmaWVkKSBxdWVzdGlvbi5cbiAgICogVXNlIHRoZSBgY2hvaWNlc0Zyb21RdWVzdGlvbk1vZGVgIHByb3BlcnR5IHRvIGZpbHRlciBjaG9pY2VzIG9idGFpbmVkIGZyb20gdGhlIHNwZWNpZmllZCBxdWVzdGlvbi5cbiAgICogQHNlZSBjaG9pY2VzXG4gICAqIEBzZWUgY2hvaWNlc0Zyb21RdWVzdGlvbk1vZGVcbiAgICovXG4gIHB1YmxpYyBnZXQgY2hvaWNlc0Zyb21RdWVzdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzRnJvbVF1ZXN0aW9uXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY2hvaWNlc0Zyb21RdWVzdGlvbih2YWw6IHN0cmluZykge1xuICAgIHZhciBxdWVzdGlvbiA9IHRoaXMuZ2V0UXVlc3Rpb25XaXRoQ2hvaWNlcygpO1xuICAgIGlmICghIXF1ZXN0aW9uKSB7XG4gICAgICBxdWVzdGlvbi5yZW1vdmVGcm9tRGVwZW5kZWRRdWVzdGlvbih0aGlzKTtcbiAgICB9XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY2hvaWNlc0Zyb21RdWVzdGlvblwiLCB2YWwpO1xuICB9XG4gIHByaXZhdGUgYWRkSW50b0RlcGVuZGVkUXVlc3Rpb24ocXVlc3Rpb246IFF1ZXN0aW9uU2VsZWN0QmFzZSkge1xuICAgIGlmICghcXVlc3Rpb24gfHwgcXVlc3Rpb24uZGVwZW5kZWRRdWVzdGlvbnMuaW5kZXhPZih0aGlzKSA+IC0xKSByZXR1cm47XG4gICAgcXVlc3Rpb24uZGVwZW5kZWRRdWVzdGlvbnMucHVzaCh0aGlzKTtcbiAgfVxuICBwcml2YXRlIHJlbW92ZUZyb21EZXBlbmRlZFF1ZXN0aW9uKHF1ZXN0aW9uOiBRdWVzdGlvblNlbGVjdEJhc2UpIHtcbiAgICBpZiAoIXF1ZXN0aW9uKSByZXR1cm47XG4gICAgdmFyIGluZGV4ID0gcXVlc3Rpb24uZGVwZW5kZWRRdWVzdGlvbnMuaW5kZXhPZih0aGlzKTtcbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgcXVlc3Rpb24uZGVwZW5kZWRRdWVzdGlvbnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFRoaXMgcHJvcGVydHkgYmVjb21lcyB2aXNpYmxlIHdoZW4gdGhlIGBjaG9pY2VzRnJvbVF1ZXN0aW9uYCBwcm9wZXJ0eSBpcyBzZWxlY3RlZC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgXCJhbGxcIiAoYWxsIHZpc2libGUgY2hvaWNlcyBmcm9tIGFub3RoZXIgcXVlc3Rpb24gYXJlIGRpc3BsYXllZCBhcyB0aGV5IGFyZSkuXG4gICAqIFlvdSBjYW4gc2V0IHRoaXMgcHJvcGVydHkgdG8gXCJzZWxlY3RlZFwiIG9yIFwidW5zZWxlY3RlZFwiIHRvIGRpc3BsYXkgb25seSBzZWxlY3RlZCBvciB1bnNlbGVjdGVkIGNob2ljZXMgZnJvbSB0aGUgc3BlY2lmaWVkIHF1ZXN0aW9uLlxuICAgKiBAc2VlIGNob2ljZXNGcm9tUXVlc3Rpb25cbiAgICovXG4gIHB1YmxpYyBnZXQgY2hvaWNlc0Zyb21RdWVzdGlvbk1vZGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY2hvaWNlc0Zyb21RdWVzdGlvbk1vZGVcIik7XG4gIH1cbiAgcHVibGljIHNldCBjaG9pY2VzRnJvbVF1ZXN0aW9uTW9kZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNGcm9tUXVlc3Rpb25Nb2RlXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUgdG8gaGlkZSB0aGUgcXVlc3Rpb24gaWYgdGhlcmUgaXMgbm8gdmlzaWJsZSBjaG9pY2VzLlxuICAgKi9cbiAgcHVibGljIGdldCBoaWRlSWZDaG9pY2VzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImhpZGVJZkNob2ljZXNFbXB0eVwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBoaWRlSWZDaG9pY2VzRW1wdHkodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaGlkZUlmQ2hvaWNlc0VtcHR5XCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBrZWVwSW5jb3JyZWN0VmFsdWVzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJrZWVwSW5jb3JyZWN0VmFsdWVzXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGtlZXBJbmNvcnJlY3RWYWx1ZXModmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwia2VlcEluY29ycmVjdFZhbHVlc1wiLCB2YWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsZWFzZSB1c2Ugc3VydmV5LnN0b3JlT3RoZXJzQXNDb21tZW50IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb24gdGhlIHN1cnZleSBsZXZlbC4gVGhpcyBwcm9wZXJ0eSBpcyBkZXByaWNhdGVkIGFuZCBpbnZpc2libGUgaW4gU3VydmV5IENyZWF0b3IuXG4gICAqIEJ5IGRlZmF1bHQgdGhlIGVudGVyZWQgdGV4dCBpbiB0aGUgb3RoZXJzIGlucHV0IGluIHRoZSBjaGVja2JveC9yYWRpb2dyb3VwL2Ryb3Bkb3duIGFyZSBzdG9yZWQgYXMgXCJxdWVzdGlvbiBuYW1lIFwiICsgXCItQ29tbWVudFwiLiBUaGUgdmFsdWUgaXRzZWxmIGlzIFwicXVlc3Rpb24gbmFtZVwiOiBcIm90aGVyc1wiLiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZSwgdG8gc3RvcmUgdGhlIGVudGVyZWQgdGV4dCBkaXJlY3RseSBpbiB0aGUgXCJxdWVzdGlvbiBuYW1lXCIga2V5LlxuICAgKiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBcImRlZmF1bHRcIiwgdHJ1ZSwgZmFsc2VcbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5zdG9yZU90aGVyc0FzQ29tbWVudFxuICAgKi9cbiAgcHVibGljIGdldCBzdG9yZU90aGVyc0FzQ29tbWVudCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzdG9yZU90aGVyc0FzQ29tbWVudFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHN0b3JlT3RoZXJzQXNDb21tZW50KHZhbDogYW55KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic3RvcmVPdGhlcnNBc0NvbW1lbnRcIiwgdmFsKTtcbiAgfVxuICBwcm90ZWN0ZWQgaGFzT3RoZXJDaGFuZ2VkKCkge1xuICAgIHRoaXMub25WaXNpYmxlQ2hvaWNlc0NoYW5nZWQoKTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gcmVuZGVyIGl0ZW1zIGluIGEgc3BlY2lmaWMgb3JkZXI6IFwiYXNjXCIsIFwiZGVzY1wiLCBcInJhbmRvbVwiLiBEZWZhdWx0IHZhbHVlIGlzIFwibm9uZVwiLlxuICAgKi9cbiAgcHVibGljIGdldCBjaG9pY2VzT3JkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY2hvaWNlc09yZGVyXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY2hvaWNlc09yZGVyKHZhbDogc3RyaW5nKSB7XG4gICAgdmFsID0gdmFsLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHZhbCA9PSB0aGlzLmNob2ljZXNPcmRlcikgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNPcmRlclwiLCB2YWwpO1xuICAgIHRoaXMub25WaXNpYmxlQ2hvaWNlc0NoYW5nZWQoKTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gc2V0IHRoZSBkaWZmZXJlbnQgdGV4dCBmb3Igb3RoZXIgaXRlbS5cbiAgICovXG4gIHB1YmxpYyBnZXQgb3RoZXJUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJvdGhlclRleHRcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJvdGhlckl0ZW1UZXh0XCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IG90aGVyVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwib3RoZXJUZXh0XCIsIHZhbCk7XG4gICAgdGhpcy5vblZpc2libGVDaG9pY2VzQ2hhbmdlZCgpO1xuICB9XG4gIGdldCBsb2NPdGhlclRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwib3RoZXJUZXh0XCIpO1xuICB9XG4gIC8qKlxuICAgKiAgVXNlIHRoaXMgcHJvcGVydHkgdG8gc2V0IHRoZSBwbGFjZSBob2xkZXIgdGV4dCBmb3Igb3RoZXIgb3IgY29tbWVudCBmaWVsZCAgLlxuICAgKi9cbiAgcHVibGljIGdldCBvdGhlclBsYWNlSG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwib3RoZXJQbGFjZUhvbGRlclwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG90aGVyUGxhY2VIb2xkZXIodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm90aGVyUGxhY2VIb2xkZXJcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jT3RoZXJQbGFjZUhvbGRlcigpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJvdGhlclBsYWNlSG9sZGVyXCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgdGV4dCB0aGF0IHNob3dzIHdoZW4gdGhlIG90aGVyIGl0ZW0gaXMgY2hvb3NlZCBieSB0aGUgb3RoZXIgaW5wdXQgaXMgZW1wdHkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG90aGVyRXJyb3JUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJvdGhlckVycm9yVGV4dFwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm90aGVyUmVxdWlyZWRFcnJvclwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBvdGhlckVycm9yVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwib3RoZXJFcnJvclRleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jT3RoZXJFcnJvclRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwib3RoZXJFcnJvclRleHRcIik7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIGl0ZW1zIGFzIHRoZXkgd2lsbCBiZSByZW5kZXJlZC4gSWYgbmVlZGVkIGl0ZW1zIGFyZSBzb3J0ZWQgYW5kIHRoZSBvdGhlciBpdGVtIGlzIGFkZGVkLlxuICAgKiBAc2VlIGhhc090aGVyXG4gICAqIEBzZWUgY2hvaWNlc09yZGVyXG4gICAqIEBzZWUgZW5hYmxlZENob2ljZXNcbiAgICovXG4gIHB1YmxpYyBnZXQgdmlzaWJsZUNob2ljZXMoKTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVDaG9pY2VzXCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBlbmFibGVkIGl0ZW1zIGFzIHRoZXkgd2lsbCBiZSByZW5kZXJlZC4gVGhlIGRpc2FibGVkIGl0ZW1zIGFyZSBub3QgaW5jbHVkZWRcbiAgICogQHNlZSBoYXNPdGhlclxuICAgKiBAc2VlIGNob2ljZXNPcmRlclxuICAgKiBAc2VlIHZpc2libGVDaG9pY2VzXG4gICAqL1xuICBwdWJsaWMgZ2V0IGVuYWJsZWRDaG9pY2VzKCk6IEFycmF5PEl0ZW1WYWx1ZT4ge1xuICAgIHZhciByZXMgPSBbXTtcbiAgICB2YXIgaXRlbXMgPSB0aGlzLnZpc2libGVDaG9pY2VzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpdGVtc1tpXS5pc0VuYWJsZWQpIHJlcy5wdXNoKGl0ZW1zW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcm90ZWN0ZWQgdXBkYXRlVmlzaWJsZUNob2ljZXMoKSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB2YXIgbmV3VmFsdWUgPSBuZXcgQXJyYXk8SXRlbVZhbHVlPigpO1xuICAgIHZhciBjYWxjVmFsdWUgPSB0aGlzLmNhbGNWaXNpYmxlQ2hvaWNlcygpO1xuICAgIGlmICghY2FsY1ZhbHVlKSBjYWxjVmFsdWUgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhbGNWYWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgbmV3VmFsdWUucHVzaChjYWxjVmFsdWVbaV0pO1xuICAgIH1cbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlQ2hvaWNlc1wiLCBuZXdWYWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBjYWxjVmlzaWJsZUNob2ljZXMoKTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgaWYgKHRoaXMuY2FuVXNlRmlsdGVyZWRDaG9pY2VzKCkpIHJldHVybiB0aGlzLmdldEZpbHRlcmVkQ2hvaWNlcygpO1xuICAgIHZhciByZXMgPSB0aGlzLnNvcnRWaXNpYmxlQ2hvaWNlcyh0aGlzLmdldEZpbHRlcmVkQ2hvaWNlcygpLnNsaWNlKCkpO1xuICAgIHRoaXMuYWRkVG9WaXNpYmxlQ2hvaWNlcyhyZXMsIHRoaXMuaXNBZGREZWZhdWx0SXRlbXMpO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJvdGVjdGVkIGNhblVzZUZpbHRlcmVkQ2hvaWNlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgIXRoaXMuaXNBZGREZWZhdWx0SXRlbXMgJiZcbiAgICAgICF0aGlzLmhhc05vbmUgJiZcbiAgICAgICF0aGlzLmhhc090aGVyICYmXG4gICAgICB0aGlzLmNob2ljZXNPcmRlciA9PSBcIm5vbmVcIlxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldENhblNob3dPcHRpb25JdGVtQ2FsbGJhY2soZnVuYzogKGl0ZW06IEl0ZW1WYWx1ZSkgPT4gYm9vbGVhbikge1xuICAgIHRoaXMuY2FuU2hvd09wdGlvbkl0ZW1DYWxsYmFjayA9IGZ1bmM7XG4gICAgaWYgKCEhZnVuYykge1xuICAgICAgdGhpcy5vblZpc2libGVDaG9pY2VzQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgYWRkVG9WaXNpYmxlQ2hvaWNlcyhpdGVtczogQXJyYXk8SXRlbVZhbHVlPiwgaXNBZGRBbGw6IGJvb2xlYW4pIHtcbiAgICBpZiAoaXNBZGRBbGwpIHtcbiAgICAgIGlmICghdGhpcy5uZXdJdGVtVmFsdWUpIHtcbiAgICAgICAgdGhpcy5uZXdJdGVtVmFsdWUgPSBuZXcgSXRlbVZhbHVlKFwibmV3aXRlbVwiKTsgLy9UT0RPXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jYW5TaG93T3B0aW9uSXRlbSh0aGlzLm5ld0l0ZW1WYWx1ZSkpIHtcbiAgICAgICAgaXRlbXMucHVzaCh0aGlzLm5ld0l0ZW1WYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoaXMuc3VwcG9ydE90aGVyKCkgJiZcbiAgICAgICgoaXNBZGRBbGwgJiYgdGhpcy5jYW5TaG93T3B0aW9uSXRlbSh0aGlzLm90aGVySXRlbSkpIHx8IHRoaXMuaGFzT3RoZXIpXG4gICAgKSB7XG4gICAgICBpdGVtcy5wdXNoKHRoaXMub3RoZXJJdGVtKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdGhpcy5zdXBwb3J0Tm9uZSgpICYmXG4gICAgICAoKGlzQWRkQWxsICYmIHRoaXMuY2FuU2hvd09wdGlvbkl0ZW0odGhpcy5ub25lSXRlbSkpIHx8IHRoaXMuaGFzTm9uZSlcbiAgICApIHtcbiAgICAgIGl0ZW1zLnB1c2godGhpcy5ub25lSXRlbSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBjYW5TaG93T3B0aW9uSXRlbShpdGVtOiBJdGVtVmFsdWUpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuY2FuU2hvd09wdGlvbkl0ZW1DYWxsYmFjaykgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIHRoaXMuY2FuU2hvd09wdGlvbkl0ZW1DYWxsYmFjayhpdGVtKTtcbiAgfVxuICAvKipcbiAgICogRm9yIGludGVybmFsIHVzZSBpbiBTdXJ2ZXlKUyBDcmVhdG9yIFYyLlxuICAgKi9cbiAgcHVibGljIGlzSXRlbUluTGlzdChpdGVtOiBJdGVtVmFsdWUpOiBib29sZWFuIHtcbiAgICBpZiAoaXRlbSA9PT0gdGhpcy5vdGhlckl0ZW0pIHJldHVybiB0aGlzLmhhc090aGVyO1xuICAgIGlmIChpdGVtID09PSB0aGlzLm5vbmVJdGVtKSByZXR1cm4gdGhpcy5oYXNOb25lO1xuICAgIGlmIChpdGVtID09PSB0aGlzLm5ld0l0ZW1WYWx1ZSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgaXNBZGREZWZhdWx0SXRlbXMoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHNldHRpbmdzLnN1cHBvcnRDcmVhdG9yVjIgJiYgdGhpcy5pc0Rlc2lnbk1vZGUgJiYgIXRoaXMucGFyZW50UXVlc3Rpb25cbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXRQbGFpbkRhdGEoXG4gICAgb3B0aW9uczoge1xuICAgICAgaW5jbHVkZUVtcHR5PzogYm9vbGVhbixcbiAgICAgIGluY2x1ZGVRdWVzdGlvblR5cGVzPzogYm9vbGVhbixcbiAgICAgIGNhbGN1bGF0aW9ucz86IEFycmF5PHtcbiAgICAgICAgcHJvcGVydHlOYW1lOiBzdHJpbmcsXG4gICAgICB9PixcbiAgICB9ID0ge1xuICAgICAgaW5jbHVkZUVtcHR5OiB0cnVlLFxuICAgICAgaW5jbHVkZVF1ZXN0aW9uVHlwZXM6IGZhbHNlLFxuICAgIH1cbiAgKSB7XG4gICAgdmFyIHF1ZXN0aW9uUGxhaW5EYXRhID0gc3VwZXIuZ2V0UGxhaW5EYXRhKG9wdGlvbnMpO1xuICAgIGlmICghIXF1ZXN0aW9uUGxhaW5EYXRhKSB7XG4gICAgICB2YXIgdmFsdWVzID0gQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSA/IHRoaXMudmFsdWUgOiBbdGhpcy52YWx1ZV07XG4gICAgICBxdWVzdGlvblBsYWluRGF0YS5pc05vZGUgPSB0cnVlO1xuICAgICAgcXVlc3Rpb25QbGFpbkRhdGEuZGF0YSA9IChxdWVzdGlvblBsYWluRGF0YS5kYXRhIHx8IFtdKS5jb25jYXQoXG4gICAgICAgIHZhbHVlcy5tYXAoKGRhdGFWYWx1ZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICB2YXIgY2hvaWNlID0gSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKHRoaXMudmlzaWJsZUNob2ljZXMsIGRhdGFWYWx1ZSk7XG4gICAgICAgICAgdmFyIGNob2ljZURhdGFJdGVtID0gPGFueT57XG4gICAgICAgICAgICBuYW1lOiBpbmRleCxcbiAgICAgICAgICAgIHRpdGxlOiBcIkNob2ljZVwiLFxuICAgICAgICAgICAgdmFsdWU6IGRhdGFWYWx1ZSxcbiAgICAgICAgICAgIGRpc3BsYXlWYWx1ZTogdGhpcy5nZXRDaG9pY2VzRGlzcGxheVZhbHVlKFxuICAgICAgICAgICAgICB0aGlzLnZpc2libGVDaG9pY2VzLFxuICAgICAgICAgICAgICBkYXRhVmFsdWVcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBnZXRTdHJpbmc6ICh2YWw6IGFueSkgPT5cbiAgICAgICAgICAgICAgdHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIiA/IEpTT04uc3RyaW5naWZ5KHZhbCkgOiB2YWwsXG4gICAgICAgICAgICBpc05vZGU6IGZhbHNlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKCEhY2hvaWNlKSB7XG4gICAgICAgICAgICAob3B0aW9ucy5jYWxjdWxhdGlvbnMgfHwgW10pLmZvckVhY2goKGNhbGN1bGF0aW9uKSA9PiB7XG4gICAgICAgICAgICAgIGNob2ljZURhdGFJdGVtW2NhbGN1bGF0aW9uLnByb3BlcnR5TmFtZV0gPVxuICAgICAgICAgICAgICAgIGNob2ljZVtjYWxjdWxhdGlvbi5wcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLmlzT3RoZXJTZWxlY3RlZCAmJiB0aGlzLm90aGVySXRlbVZhbHVlID09PSBjaG9pY2UpIHtcbiAgICAgICAgICAgIGNob2ljZURhdGFJdGVtLmlzT3RoZXIgPSB0cnVlO1xuICAgICAgICAgICAgY2hvaWNlRGF0YUl0ZW0uZGlzcGxheVZhbHVlID0gdGhpcy5jb21tZW50O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gY2hvaWNlRGF0YUl0ZW07XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcXVlc3Rpb25QbGFpbkRhdGE7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGV4dCBmb3IgdGhlIGN1cnJlbnQgdmFsdWUuIElmIHRoZSB2YWx1ZSBpcyBudWxsIHRoZW4gcmV0dXJucyBlbXB0eSBzdHJpbmcuIElmICdvdGhlcicgaXMgc2VsZWN0ZWQgdGhlbiByZXR1cm5zIHRoZSB0ZXh0IGZvciBvdGhlciB2YWx1ZS5cbiAgICovXG4gIHByb3RlY3RlZCBnZXREaXNwbGF5VmFsdWVDb3JlKGtleXNBc1RleHQ6IGJvb2xlYW4sIHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldENob2ljZXNEaXNwbGF5VmFsdWUodGhpcy52aXNpYmxlQ2hvaWNlcywgdmFsdWUpO1xuICB9XG4gIHByb3RlY3RlZCBnZXREaXNwbGF5VmFsdWVFbXB0eSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBJdGVtVmFsdWUuZ2V0VGV4dE9ySHRtbEJ5VmFsdWUodGhpcy52aXNpYmxlQ2hvaWNlcywgdW5kZWZpbmVkKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Q2hvaWNlc0Rpc3BsYXlWYWx1ZShpdGVtczogSXRlbVZhbHVlW10sIHZhbDogYW55KTogYW55IHtcbiAgICBpZiAodmFsID09IHRoaXMub3RoZXJJdGVtVmFsdWUudmFsdWUpXG4gICAgICByZXR1cm4gdGhpcy5jb21tZW50ID8gdGhpcy5jb21tZW50IDogdGhpcy5sb2NPdGhlclRleHQudGV4dE9ySHRtbDtcbiAgICB2YXIgc3RyID0gSXRlbVZhbHVlLmdldFRleHRPckh0bWxCeVZhbHVlKGl0ZW1zLCB2YWwpO1xuICAgIHJldHVybiBzdHIgPT0gXCJcIiAmJiB2YWwgPyB2YWwgOiBzdHI7XG4gIH1cbiAgcHJpdmF0ZSBnZXRGaWx0ZXJlZENob2ljZXMoKTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRDaG9pY2VzVmFsdWVcbiAgICAgID8gdGhpcy5maWx0ZXJlZENob2ljZXNWYWx1ZVxuICAgICAgOiB0aGlzLmFjdGl2ZUNob2ljZXM7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBhY3RpdmVDaG9pY2VzKCk6IEFycmF5PEl0ZW1WYWx1ZT4ge1xuICAgIHZhciBxdWVzdGlvbiA9IHRoaXMuZ2V0UXVlc3Rpb25XaXRoQ2hvaWNlcygpO1xuICAgIGlmICghIXF1ZXN0aW9uKSB7XG4gICAgICB0aGlzLmFkZEludG9EZXBlbmRlZFF1ZXN0aW9uKHF1ZXN0aW9uKTtcbiAgICAgIHJldHVybiB0aGlzLmdldENob2ljZXNGcm9tUXVlc3Rpb24ocXVlc3Rpb24pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jaG9pY2VzRnJvbVVybCA/IHRoaXMuY2hvaWNlc0Zyb21VcmwgOiB0aGlzLmdldENob2ljZXMoKTtcbiAgfVxuICBwcml2YXRlIGdldFF1ZXN0aW9uV2l0aENob2ljZXMoKTogUXVlc3Rpb25TZWxlY3RCYXNlIHtcbiAgICBpZiAoIXRoaXMuY2hvaWNlc0Zyb21RdWVzdGlvbiB8fCAhdGhpcy5zdXJ2ZXkpIHJldHVybiBudWxsO1xuICAgIHZhciByZXM6IGFueSA9IHRoaXMuc3VydmV5LmdldFF1ZXN0aW9uQnlOYW1lKHRoaXMuY2hvaWNlc0Zyb21RdWVzdGlvbik7XG4gICAgcmV0dXJuICEhcmVzICYmICEhcmVzLnZpc2libGVDaG9pY2VzICYmIHJlcyAhPT0gdGhpcyA/IHJlcyA6IG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIGdldENob2ljZXNGcm9tUXVlc3Rpb24oXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uU2VsZWN0QmFzZVxuICApOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICB2YXIgcmVzOiBBcnJheTxJdGVtVmFsdWU+ID0gW107XG4gICAgdmFyIGlzU2VsZWN0ZWQgPVxuICAgICAgdGhpcy5jaG9pY2VzRnJvbVF1ZXN0aW9uTW9kZSA9PSBcInNlbGVjdGVkXCJcbiAgICAgICAgPyB0cnVlXG4gICAgICAgIDogdGhpcy5jaG9pY2VzRnJvbVF1ZXN0aW9uTW9kZSA9PSBcInVuc2VsZWN0ZWRcIlxuICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB2YXIgY2hvaWNlcyA9IHF1ZXN0aW9uLnZpc2libGVDaG9pY2VzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hvaWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuaXNCdWlsdEluQ2hvaWNlKGNob2ljZXNbaV0sIHF1ZXN0aW9uKSkgY29udGludWU7XG4gICAgICBpZiAoaXNTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlcy5wdXNoKGNob2ljZXNbaV0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBpdGVtc1NlbGVjdGVkID0gcXVlc3Rpb24uaXNJdGVtU2VsZWN0ZWQoY2hvaWNlc1tpXSk7XG4gICAgICBpZiAoKGl0ZW1zU2VsZWN0ZWQgJiYgaXNTZWxlY3RlZCkgfHwgKCFpdGVtc1NlbGVjdGVkICYmICFpc1NlbGVjdGVkKSkge1xuICAgICAgICByZXMucHVzaChjaG9pY2VzW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IGhhc0FjdGl2ZUNob2ljZXMoKTogYm9vbGVhbiB7XG4gICAgdmFyIGNob2ljZXMgPSB0aGlzLnZpc2libGVDaG9pY2VzO1xuICAgIGlmICghY2hvaWNlcyB8fCBjaG9pY2VzLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aGlzLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gICAgICBjaG9pY2VzID0gdGhpcy52aXNpYmxlQ2hvaWNlcztcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaG9pY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXRoaXMuaXNCdWlsdEluQ2hvaWNlKGNob2ljZXNbaV0sIHRoaXMpKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBpc0J1aWx0SW5DaG9pY2UoXG4gICAgaXRlbTogSXRlbVZhbHVlLFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvblNlbGVjdEJhc2VcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGl0ZW0gPT09IHF1ZXN0aW9uLm5vbmVJdGVtIHx8XG4gICAgICBpdGVtID09PSBxdWVzdGlvbi5vdGhlckl0ZW0gfHxcbiAgICAgIGl0ZW0gPT09IHF1ZXN0aW9uLm5ld0l0ZW1WYWx1ZVxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldENob2ljZXMoKTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2hvaWNlcztcbiAgfVxuICBwdWJsaWMgc3VwcG9ydENvbW1lbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIHN1cHBvcnRPdGhlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1N1cHBvcnRQcm9wZXJ0eShcImhhc090aGVyXCIpO1xuICB9XG4gIHB1YmxpYyBzdXBwb3J0Tm9uZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1N1cHBvcnRQcm9wZXJ0eShcImhhc05vbmVcIik7XG4gIH1cbiAgcHJvdGVjdGVkIGlzU3VwcG9ydFByb3BlcnR5KHByb3BOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgIXRoaXMuaXNEZXNpZ25Nb2RlIHx8XG4gICAgICBTZXJpYWxpemVyLmZpbmRQcm9wZXJ0eSh0aGlzLmdldFR5cGUoKSwgcHJvcE5hbWUpLnZpc2libGVcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBvbkNoZWNrRm9yRXJyb3JzKFxuICAgIGVycm9yczogQXJyYXk8U3VydmV5RXJyb3I+LFxuICAgIGlzT25WYWx1ZUNoYW5nZWQ6IGJvb2xlYW5cbiAgKSB7XG4gICAgc3VwZXIub25DaGVja0ZvckVycm9ycyhlcnJvcnMsIGlzT25WYWx1ZUNoYW5nZWQpO1xuICAgIGlmICghdGhpcy5oYXNPdGhlciB8fCAhdGhpcy5pc090aGVyU2VsZWN0ZWQgfHwgdGhpcy5jb21tZW50KSByZXR1cm47XG4gICAgZXJyb3JzLnB1c2gobmV3IE90aGVyRW1wdHlFcnJvcih0aGlzLm90aGVyRXJyb3JUZXh0LCB0aGlzKSk7XG4gIH1cbiAgcHVibGljIHNldFN1cnZleUltcGwodmFsdWU6IElTdXJ2ZXlJbXBsKSB7XG4gICAgc3VwZXIuc2V0U3VydmV5SW1wbCh2YWx1ZSk7XG4gICAgdGhpcy5ydW5DaG9pY2VzQnlVcmwoKTtcbiAgICBpZiAodGhpcy5pc0FkZERlZmF1bHRJdGVtcykge1xuICAgICAgdGhpcy51cGRhdGVWaXNpYmxlQ2hvaWNlcygpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgc2V0U3VydmV5Q29yZSh2YWx1ZTogSVN1cnZleSkge1xuICAgIHN1cGVyLnNldFN1cnZleUNvcmUodmFsdWUpO1xuICAgIGlmICghIXZhbHVlICYmICEhdGhpcy5jaG9pY2VzRnJvbVF1ZXN0aW9uKSB7XG4gICAgICB0aGlzLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBnZXRTdG9yZU90aGVyc0FzQ29tbWVudCgpIHtcbiAgICBpZiAodGhpcy5pc1NldHRpbmdEZWZhdWx0VmFsdWUpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5zdG9yZU90aGVyc0FzQ29tbWVudCA9PT0gdHJ1ZSB8fFxuICAgICAgKHRoaXMuc3RvcmVPdGhlcnNBc0NvbW1lbnQgPT0gXCJkZWZhdWx0XCIgJiZcbiAgICAgICAgKHRoaXMuc3VydmV5ICE9IG51bGwgPyB0aGlzLnN1cnZleS5zdG9yZU90aGVyc0FzQ29tbWVudCA6IHRydWUpKSB8fFxuICAgICAgKCF0aGlzLmNob2ljZXNCeVVybC5pc0VtcHR5ICYmICF0aGlzLmNob2ljZXNGcm9tVXJsKVxuICAgICk7XG4gIH1cbiAgb25TdXJ2ZXlMb2FkKCkge1xuICAgIHRoaXMucnVuQ2hvaWNlc0J5VXJsKCk7XG4gICAgdGhpcy5vblZpc2libGVDaG9pY2VzQ2hhbmdlZCgpO1xuICAgIHN1cGVyLm9uU3VydmV5TG9hZCgpO1xuICB9XG4gIG9uQW55VmFsdWVDaGFuZ2VkKG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyLm9uQW55VmFsdWVDaGFuZ2VkKG5hbWUpO1xuICAgIGlmIChuYW1lICE9IHRoaXMuZ2V0VmFsdWVOYW1lKCkpIHtcbiAgICAgIHRoaXMucnVuQ2hvaWNlc0J5VXJsKCk7XG4gICAgfVxuICAgIGlmICghIW5hbWUgJiYgbmFtZSA9PSB0aGlzLmNob2ljZXNGcm9tUXVlc3Rpb24pIHtcbiAgICAgIHRoaXMub25WaXNpYmxlQ2hvaWNlc0NoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgdXBkYXRlVmFsdWVGcm9tU3VydmV5KG5ld1ZhbHVlOiBhbnkpIHtcbiAgICB2YXIgbmV3Q29tbWVudCA9IFwiXCI7XG4gICAgaWYgKFxuICAgICAgdGhpcy5oYXNPdGhlciAmJlxuICAgICAgIXRoaXMuaXNSdW5uaW5nQ2hvaWNlcyAmJlxuICAgICAgIXRoaXMuY2hvaWNlc0J5VXJsLmlzUnVubmluZyAmJlxuICAgICAgdGhpcy5nZXRTdG9yZU90aGVyc0FzQ29tbWVudCgpXG4gICAgKSB7XG4gICAgICBpZiAodGhpcy5oYXNVbmtub3duVmFsdWUobmV3VmFsdWUpICYmICF0aGlzLmdldEhhc090aGVyKG5ld1ZhbHVlKSkge1xuICAgICAgICBuZXdDb21tZW50ID0gdGhpcy5nZXRDb21tZW50RnJvbVZhbHVlKG5ld1ZhbHVlKTtcbiAgICAgICAgbmV3VmFsdWUgPSB0aGlzLnNldE90aGVyVmFsdWVJbnRvVmFsdWUobmV3VmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3Q29tbWVudCA9IHRoaXMuZGF0YS5nZXRDb21tZW50KHRoaXMuZ2V0VmFsdWVOYW1lKCkpO1xuICAgICAgfVxuICAgIH1cbiAgICBzdXBlci51cGRhdGVWYWx1ZUZyb21TdXJ2ZXkobmV3VmFsdWUpO1xuICAgIGlmICghIW5ld0NvbW1lbnQpIHtcbiAgICAgIHRoaXMuc2V0TmV3Q29tbWVudChuZXdDb21tZW50KTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGdldENvbW1lbnRGcm9tVmFsdWUobmV3VmFsdWU6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5ld1ZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCBzZXRPdGhlclZhbHVlSW50b1ZhbHVlKG5ld1ZhbHVlOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLm90aGVySXRlbS52YWx1ZTtcbiAgfVxuICBwcml2YXRlIGlzUnVubmluZ0Nob2ljZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBydW5DaG9pY2VzQnlVcmwoKSB7XG4gICAgaWYgKCF0aGlzLmNob2ljZXNCeVVybCB8fCB0aGlzLmlzTG9hZGluZ0Zyb21Kc29uIHx8IHRoaXMuaXNSdW5uaW5nQ2hvaWNlcylcbiAgICAgIHJldHVybjtcbiAgICB2YXIgcHJvY2Vzc29yID0gdGhpcy5zdXJ2ZXlJbXBsXG4gICAgICA/IHRoaXMuc3VydmV5SW1wbC5nZXRUZXh0UHJvY2Vzc29yKClcbiAgICAgIDogdGhpcy50ZXh0UHJvY2Vzc29yO1xuICAgIGlmICghcHJvY2Vzc29yKSBwcm9jZXNzb3IgPSB0aGlzLnN1cnZleTtcbiAgICBpZiAoIXByb2Nlc3NvcikgcmV0dXJuO1xuICAgIHRoaXMuaXNSZWFkeVZhbHVlID0gdGhpcy5pc0Nob2ljZXNMb2FkZWQgfHwgdGhpcy5jaG9pY2VzQnlVcmwuaXNFbXB0eTtcbiAgICB0aGlzLmlzUnVubmluZ0Nob2ljZXMgPSB0cnVlO1xuICAgIHRoaXMuY2hvaWNlc0J5VXJsLnJ1bihwcm9jZXNzb3IpO1xuICAgIHRoaXMuaXNSdW5uaW5nQ2hvaWNlcyA9IGZhbHNlO1xuICB9XG4gIHByaXZhdGUgaXNGaXJzdExvYWRDaG9pY2VzRnJvbVVybCA9IHRydWU7XG4gIHByb3RlY3RlZCBvbkJlZm9yZVNlbmRSZXF1ZXN0KCkge1xuICAgIGlmIChzZXR0aW5ncy5kaXNhYmxlT25HZXR0aW5nQ2hvaWNlc0Zyb21XZWIgPT09IHRydWUgJiYgIXRoaXMuaXNSZWFkT25seSkge1xuICAgICAgdGhpcy5lbmFibGVPbkxvYWRpbmdDaG9pY2VzID0gdHJ1ZTtcbiAgICAgIHRoaXMucmVhZE9ubHkgPSB0cnVlO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgb25Mb2FkQ2hvaWNlc0Zyb21VcmwoYXJyYXk6IEFycmF5PEl0ZW1WYWx1ZT4pIHtcbiAgICBpZiAodGhpcy5lbmFibGVPbkxvYWRpbmdDaG9pY2VzKSB7XG4gICAgICB0aGlzLnJlYWRPbmx5ID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc1JlYWRPbmx5KSB7XG4gICAgICB2YXIgZXJyb3JzID0gW107XG4gICAgICBpZiAodGhpcy5jaG9pY2VzQnlVcmwgJiYgdGhpcy5jaG9pY2VzQnlVcmwuZXJyb3IpIHtcbiAgICAgICAgZXJyb3JzLnB1c2godGhpcy5jaG9pY2VzQnlVcmwuZXJyb3IpO1xuICAgICAgfVxuICAgICAgdGhpcy5lcnJvcnMgPSBlcnJvcnM7XG4gICAgfVxuICAgIHZhciBuZXdDaG9pY2VzID0gbnVsbDtcbiAgICB2YXIgY2hlY2tDYWNoZWRWYWx1ZXNPbkV4aXN0aW5nID0gdHJ1ZTtcbiAgICBpZiAoXG4gICAgICB0aGlzLmlzRmlyc3RMb2FkQ2hvaWNlc0Zyb21VcmwgJiZcbiAgICAgICF0aGlzLmNhY2hlZFZhbHVlRm9yVXJsUmVxdWVzdHMgJiZcbiAgICAgIHRoaXMuZGVmYXVsdFZhbHVlXG4gICAgKSB7XG4gICAgICB0aGlzLmNhY2hlZFZhbHVlRm9yVXJsUmVxdWVzdHMgPSB0aGlzLmRlZmF1bHRWYWx1ZTtcbiAgICAgIGNoZWNrQ2FjaGVkVmFsdWVzT25FeGlzdGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1ZhbHVlRW1wdHkodGhpcy5jYWNoZWRWYWx1ZUZvclVybFJlcXVlc3RzKSkge1xuICAgICAgdGhpcy5jYWNoZWRWYWx1ZUZvclVybFJlcXVlc3RzID0gdGhpcy52YWx1ZTtcbiAgICB9XG4gICAgdGhpcy5pc0ZpcnN0TG9hZENob2ljZXNGcm9tVXJsID0gZmFsc2U7XG4gICAgdmFyIGNhY2hlZFZhbHVlcyA9IHRoaXMuY3JlYXRlQ2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0cyhcbiAgICAgIHRoaXMuY2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0cyxcbiAgICAgIGNoZWNrQ2FjaGVkVmFsdWVzT25FeGlzdGluZ1xuICAgICk7XG4gICAgaWYgKGFycmF5ICYmIChhcnJheS5sZW5ndGggPiAwIHx8IHRoaXMuY2hvaWNlc0J5VXJsLmFsbG93RW1wdHlSZXNwb25zZSkpIHtcbiAgICAgIG5ld0Nob2ljZXMgPSBuZXcgQXJyYXk8SXRlbVZhbHVlPigpO1xuICAgICAgSXRlbVZhbHVlLnNldERhdGEobmV3Q2hvaWNlcywgYXJyYXkpO1xuICAgIH1cbiAgICBpZiAoISFuZXdDaG9pY2VzKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld0Nob2ljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbmV3Q2hvaWNlc1tpXS5sb2NPd25lciA9IHRoaXM7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY2hvaWNlc0Zyb21VcmwgPSBuZXdDaG9pY2VzO1xuICAgIHRoaXMuZmlsdGVySXRlbXMoKTtcbiAgICB0aGlzLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gICAgaWYgKG5ld0Nob2ljZXMpIHtcbiAgICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMudXBkYXRlQ2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0cyhcbiAgICAgICAgY2FjaGVkVmFsdWVzLFxuICAgICAgICBuZXdDaG9pY2VzXG4gICAgICApO1xuICAgICAgaWYgKCEhbmV3VmFsdWUgJiYgIXRoaXMuaXNSZWFkT25seSkge1xuICAgICAgICB2YXIgaGFzQ2hhbmdlZCA9ICF0aGlzLmlzVHdvVmFsdWVFcXVhbHModGhpcy52YWx1ZSwgbmV3VmFsdWUudmFsdWUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICghdGhpcy5pc1ZhbHVlRW1wdHkobmV3VmFsdWUudmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLmFsbG93Tm90aWZ5VmFsdWVDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNldFF1ZXN0aW9uVmFsdWUodW5kZWZpbmVkLCB0cnVlLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuYWxsb3dOb3RpZnlWYWx1ZUNoYW5nZWQgPSBoYXNDaGFuZ2VkO1xuICAgICAgICAgIGlmIChoYXNDaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWUudmFsdWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0UXVlc3Rpb25WYWx1ZShuZXdWYWx1ZS52YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRoaXMuYWxsb3dOb3RpZnlWYWx1ZUNoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY2hvaWNlc0xvYWRlZCgpO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlQ2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0cyhcbiAgICB2YWw6IGFueSxcbiAgICBjaGVja09uRXhpc3Rpbmc6IGJvb2xlYW5cbiAgKTogYW55IHtcbiAgICBpZiAodGhpcy5pc1ZhbHVlRW1wdHkodmFsKSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgdmFyIHJlcyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzLnB1c2godGhpcy5jcmVhdGVDYWNoZWRWYWx1ZUZvclVybFJlcXVlc3RzKHZhbFtpXSwgdHJ1ZSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgdmFyIGlzRXhpc3RzID0gY2hlY2tPbkV4aXN0aW5nID8gIXRoaXMuaGFzVW5rbm93blZhbHVlKHZhbCkgOiB0cnVlO1xuICAgIHJldHVybiB7IHZhbHVlOiB2YWwsIGlzRXhpc3RzOiBpc0V4aXN0cyB9O1xuICB9XG4gIHByaXZhdGUgdXBkYXRlQ2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0cyhcbiAgICB2YWw6IGFueSxcbiAgICBuZXdDaG9pY2VzOiBBcnJheTxJdGVtVmFsdWU+XG4gICk6IGFueSB7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUVtcHR5KHZhbCkpIHJldHVybiBudWxsO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgIHZhciByZXMgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB1cGRhdGVkVmFsdWUgPSB0aGlzLnVwZGF0ZUNhY2hlZFZhbHVlRm9yVXJsUmVxdWVzdHMoXG4gICAgICAgICAgdmFsW2ldLFxuICAgICAgICAgIG5ld0Nob2ljZXNcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHVwZGF0ZWRWYWx1ZSAmJiAhdGhpcy5pc1ZhbHVlRW1wdHkodXBkYXRlZFZhbHVlLnZhbHVlKSkge1xuICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHVwZGF0ZWRWYWx1ZS52YWx1ZTtcbiAgICAgICAgICB2YXIgaXRlbSA9IEl0ZW1WYWx1ZS5nZXRJdGVtQnlWYWx1ZShuZXdDaG9pY2VzLCB1cGRhdGVkVmFsdWUudmFsdWUpO1xuICAgICAgICAgIGlmICghIWl0ZW0pIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gaXRlbS52YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzLnB1c2gobmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4geyB2YWx1ZTogcmVzIH07XG4gICAgfVxuICAgIHZhciB2YWx1ZSA9XG4gICAgICB2YWwuaXNFeGlzdHMgJiYgdGhpcy5oYXNVbmtub3duVmFsdWUodmFsLnZhbHVlKSA/IG51bGwgOiB2YWwudmFsdWU7XG4gICAgdmFyIGl0ZW0gPSBJdGVtVmFsdWUuZ2V0SXRlbUJ5VmFsdWUobmV3Q2hvaWNlcywgdmFsdWUpO1xuICAgIGlmICghIWl0ZW0pIHtcbiAgICAgIHZhbHVlID0gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlIH07XG4gIH1cbiAgcHJpdmF0ZSBpc1VwZGF0aW5nQ2hvaWNlc0RlcGVuZGVkUXVlc3Rpb25zID0gZmFsc2U7XG4gIHByb3RlY3RlZCB1cGRhdGVDaG9pY2VzRGVwZW5kZWRRdWVzdGlvbnMoKSB7XG4gICAgaWYgKHRoaXMuaXNVcGRhdGluZ0Nob2ljZXNEZXBlbmRlZFF1ZXN0aW9ucykgcmV0dXJuO1xuICAgIHRoaXMuaXNVcGRhdGluZ0Nob2ljZXNEZXBlbmRlZFF1ZXN0aW9ucyA9IHRydWU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRlcGVuZGVkUXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmRlcGVuZGVkUXVlc3Rpb25zW2ldLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gICAgICB0aGlzLmRlcGVuZGVkUXVlc3Rpb25zW2ldLnVwZGF0ZUNob2ljZXNEZXBlbmRlZFF1ZXN0aW9ucygpO1xuICAgIH1cbiAgICB0aGlzLmlzVXBkYXRpbmdDaG9pY2VzRGVwZW5kZWRRdWVzdGlvbnMgPSBmYWxzZTtcbiAgfVxuICBvblN1cnZleVZhbHVlQ2hhbmdlZChuZXdWYWx1ZTogYW55KSB7XG4gICAgc3VwZXIub25TdXJ2ZXlWYWx1ZUNoYW5nZWQobmV3VmFsdWUpO1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdGhpcy51cGRhdGVDaG9pY2VzRGVwZW5kZWRRdWVzdGlvbnMoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25WaXNpYmxlQ2hvaWNlc0NoYW5nZWQoKSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVDaG9pY2VzKCk7XG4gICAgdGhpcy51cGRhdGVWaXNpYmlsaXR5QmFzZWRPbkNob2ljZXMoKTtcbiAgICBpZiAoISF0aGlzLnZpc2libGVDaG9pY2VzQ2hhbmdlZENhbGxiYWNrKSB7XG4gICAgICB0aGlzLnZpc2libGVDaG9pY2VzQ2hhbmdlZENhbGxiYWNrKCk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlQ2hvaWNlc0RlcGVuZGVkUXVlc3Rpb25zKCk7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVWaXNpYmlsaXR5QmFzZWRPbkNob2ljZXMoKSB7XG4gICAgaWYgKHRoaXMuaGlkZUlmQ2hvaWNlc0VtcHR5KSB7XG4gICAgICB2YXIgZmlsdGVyZWRDaG9pY2VzID0gdGhpcy5nZXRGaWx0ZXJlZENob2ljZXMoKTtcbiAgICAgIHRoaXMudmlzaWJsZSA9ICFmaWx0ZXJlZENob2ljZXMgfHwgZmlsdGVyZWRDaG9pY2VzLmxlbmd0aCA+IDA7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgc29ydFZpc2libGVDaG9pY2VzKGFycmF5OiBBcnJheTxJdGVtVmFsdWU+KTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgdmFyIG9yZGVyID0gdGhpcy5jaG9pY2VzT3JkZXIudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAob3JkZXIgPT0gXCJhc2NcIikgcmV0dXJuIHRoaXMuc29ydEFycmF5KGFycmF5LCAxKTtcbiAgICBpZiAob3JkZXIgPT0gXCJkZXNjXCIpIHJldHVybiB0aGlzLnNvcnRBcnJheShhcnJheSwgLTEpO1xuICAgIGlmIChvcmRlciA9PSBcInJhbmRvbVwiKSByZXR1cm4gdGhpcy5yYW5kb21pemVBcnJheShhcnJheSk7XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG4gIHByaXZhdGUgc29ydEFycmF5KGFycmF5OiBBcnJheTxJdGVtVmFsdWU+LCBtdWx0OiBudW1iZXIpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICByZXR1cm4gYXJyYXkuc29ydChmdW5jdGlvbihhLCBiKSB7XG4gICAgICBpZiAoYS5jYWxjdWxhdGVkVGV4dCA8IGIuY2FsY3VsYXRlZFRleHQpIHJldHVybiAtMSAqIG11bHQ7XG4gICAgICBpZiAoYS5jYWxjdWxhdGVkVGV4dCA+IGIuY2FsY3VsYXRlZFRleHQpIHJldHVybiAxICogbXVsdDtcbiAgICAgIHJldHVybiAwO1xuICAgIH0pO1xuICB9XG4gIHByaXZhdGUgcmFuZG9taXplQXJyYXkoYXJyYXk6IEFycmF5PEl0ZW1WYWx1ZT4pOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICByZXR1cm4gSGVscGVycy5yYW5kb21pemVBcnJheTxJdGVtVmFsdWU+KGFycmF5KTtcbiAgfVxuICBwdWJsaWMgY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKSB7XG4gICAgaWYgKHRoaXMua2VlcEluY29ycmVjdFZhbHVlcyB8fCB0aGlzLmlzRW1wdHkoKSkgcmV0dXJuO1xuICAgIGlmIChcbiAgICAgICEhdGhpcy5zdXJ2ZXkgJiZcbiAgICAgIHRoaXMuc3VydmV5LnF1ZXN0aW9uQ291bnRCeVZhbHVlTmFtZSh0aGlzLmdldFZhbHVlTmFtZSgpKSA+IDFcbiAgICApXG4gICAgICByZXR1cm47XG4gICAgaWYgKFxuICAgICAgISF0aGlzLmNob2ljZXNCeVVybCAmJlxuICAgICAgIXRoaXMuY2hvaWNlc0J5VXJsLmlzRW1wdHkgJiZcbiAgICAgICghdGhpcy5jaG9pY2VzRnJvbVVybCB8fCB0aGlzLmNob2ljZXNGcm9tVXJsLmxlbmd0aCA9PSAwKVxuICAgIClcbiAgICAgIHJldHVybjtcbiAgICBpZiAodGhpcy5jbGVhckluY29ycmVjdFZhbHVlc0NhbGxiYWNrKSB7XG4gICAgICB0aGlzLmNsZWFySW5jb3JyZWN0VmFsdWVzQ2FsbGJhY2soKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jbGVhckluY29ycmVjdFZhbHVlc0NvcmUoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGNsZWFyVmFsdWVJZkludmlzaWJsZSgpIHtcbiAgICBzdXBlci5jbGVhclZhbHVlSWZJbnZpc2libGUoKTtcbiAgICB0aGlzLmNsZWFySW5jb3JyZWN0VmFsdWVzKCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBpdGVtIGlzIHNlbGVjdGVkXG4gICAqIEBwYXJhbSBpdGVtIGNoZWNrYm94IG9yIHJhZGlvIGl0ZW0gdmFsdWVcbiAgICovXG4gIHB1YmxpYyBpc0l0ZW1TZWxlY3RlZChpdGVtOiBJdGVtVmFsdWUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXRlbS52YWx1ZSA9PT0gdGhpcy52YWx1ZTtcbiAgfVxuICBwcml2YXRlIGNsZWFyRGlzYWJsZWRWYWx1ZXMoKSB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSB8fCAhdGhpcy5zdXJ2ZXkuY2xlYXJWYWx1ZU9uRGlzYWJsZUl0ZW1zKSByZXR1cm47XG4gICAgdGhpcy5jbGVhckRpc2FibGVkVmFsdWVzQ29yZSgpO1xuICB9XG4gIHByb3RlY3RlZCBjbGVhckluY29ycmVjdFZhbHVlc0NvcmUoKSB7XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgaWYgKHRoaXMuY2FuQ2xlYXJWYWx1ZUFuVW5rbm93KHZhbCkpIHtcbiAgICAgIHRoaXMuY2xlYXJWYWx1ZSgpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgY2FuQ2xlYXJWYWx1ZUFuVW5rbm93KHZhbDogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmdldFN0b3JlT3RoZXJzQXNDb21tZW50KCkgJiYgdGhpcy5pc090aGVyU2VsZWN0ZWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5oYXNVbmtub3duVmFsdWUodmFsLCB0cnVlLCB0cnVlLCB0cnVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgY2xlYXJEaXNhYmxlZFZhbHVlc0NvcmUoKSB7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZURpc2FibGVkKHRoaXMudmFsdWUpKSB7XG4gICAgICB0aGlzLmNsZWFyVmFsdWUoKTtcbiAgICB9XG4gIH1cbiAgY2xlYXJVbnVzZWRWYWx1ZXMoKSB7XG4gICAgc3VwZXIuY2xlYXJVbnVzZWRWYWx1ZXMoKTtcbiAgICBpZiAoIXRoaXMuaXNPdGhlclNlbGVjdGVkICYmICF0aGlzLmhhc0NvbW1lbnQpIHtcbiAgICAgIHRoaXMuY29tbWVudCA9IFwiXCI7XG4gICAgfVxuICB9XG4gIGdldENvbHVtbkNsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5ldyBDc3NDbGFzc0J1aWxkZXIoKVxuICAgICAgLmFwcGVuZCh0aGlzLmNzc0NsYXNzZXMuY29sdW1uKVxuICAgICAgLmFwcGVuZChcInN2LXEtY29sdW1uLVwiICsgdGhpcy5jb2xDb3VudCwgdGhpcy5oYXNDb2x1bW5zKVxuICAgICAgLnRvU3RyaW5nKCk7XG4gIH1cbiAgZ2V0SXRlbUluZGV4KGl0ZW06IGFueSk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZUNob2ljZXMuaW5kZXhPZihpdGVtKTtcbiAgfVxuICBnZXRJdGVtQ2xhc3MoaXRlbTogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCBvcHRpb25zOiBhbnkgPSB7IGl0ZW06IGl0ZW0gfTtcbiAgICB2YXIgcmVzID0gdGhpcy5nZXRJdGVtQ2xhc3NDb3JlKGl0ZW0sIG9wdGlvbnMpO1xuICAgIG9wdGlvbnMuY3NzID0gcmVzO1xuICAgIGlmKCEhdGhpcy5zdXJ2ZXkpIHtcbiAgICAgIHRoaXMuc3VydmV5LnVwZGF0ZUNob2ljZUl0ZW1Dc3ModGhpcywgb3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiBvcHRpb25zLmNzcztcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0SXRlbUNsYXNzQ29yZShpdGVtOiBhbnksIG9wdGlvbnM6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyBDc3NDbGFzc0J1aWxkZXIoKVxuICAgICAgLmFwcGVuZCh0aGlzLmNzc0NsYXNzZXMuaXRlbSlcbiAgICAgIC5hcHBlbmQodGhpcy5jc3NDbGFzc2VzLml0ZW1JbmxpbmUsICF0aGlzLmhhc0NvbHVtbnMgJiYgdGhpcy5jb2xDb3VudCA9PT0gMClcbiAgICAgIC5hcHBlbmQoXCJzdi1xLWNvbC1cIiArIHRoaXMuY29sQ291bnQsICF0aGlzLmhhc0NvbHVtbnMgJiYgdGhpcy5jb2xDb3VudCAhPT0gMCk7XG5cbiAgICBjb25zdCBpc0Rpc2FibGVkID0gdGhpcy5pc1JlYWRPbmx5IHx8ICFpdGVtLmlzRW5hYmxlZDtcbiAgICBjb25zdCBpc0NoZWNrZWQgPSB0aGlzLmlzSXRlbVNlbGVjdGVkKGl0ZW0pIHx8XG4gICAgICAodGhpcy5pc090aGVyU2VsZWN0ZWQgJiYgdGhpcy5vdGhlckl0ZW0udmFsdWUgPT09IGl0ZW0udmFsdWUpO1xuICAgIGNvbnN0IGFsbG93SG92ZXIgPSAhaXNEaXNhYmxlZCAmJiAhaXNDaGVja2VkICYmICEoISF0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5pc0Rlc2lnbk1vZGUpO1xuICAgIGNvbnN0IGlzTm9uZSA9IGl0ZW0gPT09IHRoaXMubm9uZUl0ZW07XG4gICAgb3B0aW9ucy5pc0Rpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICBvcHRpb25zLmlzQ2hlY2tlZCA9IGlzQ2hlY2tlZDtcbiAgICBvcHRpb25zLmlzTm9uZSA9IGlzTm9uZTtcblxuICAgIHJldHVybiBidWlsZGVyLmFwcGVuZCh0aGlzLmNzc0NsYXNzZXMuaXRlbURpc2FibGVkLCBpc0Rpc2FibGVkKVxuICAgICAgLmFwcGVuZCh0aGlzLmNzc0NsYXNzZXMuaXRlbUNoZWNrZWQsIGlzQ2hlY2tlZClcbiAgICAgIC5hcHBlbmQodGhpcy5jc3NDbGFzc2VzLml0ZW1Ib3ZlciwgYWxsb3dIb3ZlcilcbiAgICAgIC5hcHBlbmQodGhpcy5jc3NDbGFzc2VzLml0ZW1Ob25lLCBpc05vbmUpXG4gICAgICAudG9TdHJpbmcoKTtcbiAgfVxuXG4gIGdldExhYmVsQ2xhc3MoaXRlbTogSXRlbVZhbHVlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmV3IENzc0NsYXNzQnVpbGRlcigpXG4gICAgICAuYXBwZW5kKHRoaXMuY3NzQ2xhc3Nlcy5sYWJlbClcbiAgICAgIC5hcHBlbmQodGhpcy5jc3NDbGFzc2VzLmxhYmVsQ2hlY2tlZCwgdGhpcy5pc0l0ZW1TZWxlY3RlZChpdGVtKSlcbiAgICAgIC50b1N0cmluZygpO1xuICB9XG4gIGdldENvbnRyb2xMYWJlbENsYXNzKGl0ZW06IEl0ZW1WYWx1ZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5ldyBDc3NDbGFzc0J1aWxkZXIoKVxuICAgICAgLmFwcGVuZCh0aGlzLmNzc0NsYXNzZXMuY29udHJvbExhYmVsKVxuICAgICAgLmFwcGVuZCh0aGlzLmNzc0NsYXNzZXMuY29udHJvbExhYmVsQ2hlY2tlZCwgdGhpcy5pc0l0ZW1TZWxlY3RlZChpdGVtKSlcbiAgICAgIC50b1N0cmluZygpO1xuICB9XG4gIGdldCBjb2x1bW5zKCkge1xuICAgIHZhciBjb2x1bW5zID0gW107XG4gICAgdmFyIGNvbENvdW50ID0gdGhpcy5jb2xDb3VudDtcbiAgICBpZiAodGhpcy5oYXNDb2x1bW5zICYmIHRoaXMudmlzaWJsZUNob2ljZXMubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHNldHRpbmdzLnNob3dJdGVtc0luT3JkZXIgPT0gXCJjb2x1bW5cIikge1xuICAgICAgICB2YXIgcHJldkluZGV4ID0gMDtcbiAgICAgICAgdmFyIGxlZnRFbGVtZW50c0NvdW50ID0gdGhpcy52aXNpYmxlQ2hvaWNlcy5sZW5ndGggJSBjb2xDb3VudDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2xDb3VudDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGNvbHVtbiA9IFtdO1xuICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICB2YXIgaiA9IHByZXZJbmRleDtcbiAgICAgICAgICAgIGogPCBwcmV2SW5kZXggKyBNYXRoLmZsb29yKHRoaXMudmlzaWJsZUNob2ljZXMubGVuZ3RoIC8gY29sQ291bnQpO1xuICAgICAgICAgICAgaisrXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb2x1bW4ucHVzaCh0aGlzLnZpc2libGVDaG9pY2VzW2pdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGxlZnRFbGVtZW50c0NvdW50ID4gMCkge1xuICAgICAgICAgICAgbGVmdEVsZW1lbnRzQ291bnQtLTtcbiAgICAgICAgICAgIGNvbHVtbi5wdXNoKHRoaXMudmlzaWJsZUNob2ljZXNbal0pO1xuICAgICAgICAgICAgaisrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwcmV2SW5kZXggPSBqO1xuICAgICAgICAgIGNvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbENvdW50OyBpKyspIHtcbiAgICAgICAgICB2YXIgY29sdW1uID0gW107XG4gICAgICAgICAgZm9yICh2YXIgaiA9IGk7IGogPCB0aGlzLnZpc2libGVDaG9pY2VzLmxlbmd0aDsgaiArPSBjb2xDb3VudCkge1xuICAgICAgICAgICAgY29sdW1uLnB1c2godGhpcy52aXNpYmxlQ2hvaWNlc1tqXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb2x1bW5zO1xuICB9XG4gIGdldCBoYXNDb2x1bW5zKCkge1xuICAgIHJldHVybiB0aGlzLmNvbENvdW50ID4gMTtcbiAgfVxuICBwdWJsaWMgY2hvaWNlc0xvYWRlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzQ2hvaWNlc0xvYWRlZCA9IHRydWU7XG4gICAgbGV0IG9sZElzUmVhZHk6IGJvb2xlYW4gPSB0aGlzLmlzUmVhZHlWYWx1ZTtcbiAgICB0aGlzLmlzUmVhZHlWYWx1ZSA9IHRydWU7XG4gICAgdGhpcy5vblJlYWR5Q2hhbmdlZCAmJlxuICAgICAgdGhpcy5vblJlYWR5Q2hhbmdlZC5maXJlKHRoaXMsIHtcbiAgICAgICAgcXVlc3Rpb246IHRoaXMsXG4gICAgICAgIGlzUmVhZHk6IHRydWUsXG4gICAgICAgIG9sZElzUmVhZHk6IG9sZElzUmVhZHksXG4gICAgICB9KTtcbiAgICBpZih0aGlzLnN1cnZleSkge1xuICAgICAgdGhpcy5zdXJ2ZXkubG9hZGVkQ2hvaWNlc0Zyb21TZXJ2ZXIodGhpcyk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRJdGVtVmFsdWVXcmFwcGVyQ29tcG9uZW50TmFtZShpdGVtOiBJdGVtVmFsdWUpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN1cnZleTogU3VydmV5TW9kZWwgPSB0aGlzLnN1cnZleSBhcyBTdXJ2ZXlNb2RlbDtcbiAgICBpZiAoc3VydmV5KSB7XG4gICAgICByZXR1cm4gc3VydmV5LmdldEl0ZW1WYWx1ZVdyYXBwZXJDb21wb25lbnROYW1lKGl0ZW0sIHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gU3VydmV5TW9kZWwuVGVtcGxhdGVSZW5kZXJlckNvbXBvbmVudE5hbWU7XG4gIH1cbiAgcHVibGljIGdldEl0ZW1WYWx1ZVdyYXBwZXJDb21wb25lbnREYXRhKGl0ZW06IEl0ZW1WYWx1ZSk6IGFueSB7XG4gICAgY29uc3Qgc3VydmV5OiBTdXJ2ZXlNb2RlbCA9IHRoaXMuc3VydmV5IGFzIFN1cnZleU1vZGVsO1xuICAgIGlmIChzdXJ2ZXkpIHtcbiAgICAgIHJldHVybiBzdXJ2ZXkuZ2V0SXRlbVZhbHVlV3JhcHBlckNvbXBvbmVudERhdGEoaXRlbSwgdGhpcyk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtO1xuICB9XG59XG4vKipcbiAqIEEgYmFzZSBjbGFzcyBmb3IgY2hlY2tib3ggYW5kIHJhZGlvZ3JvdXAgcXVlc3Rpb25zLiBJdCBpbnRyb2R1Y2VkIGEgY29sQ291bnQgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkNoZWNrYm94QmFzZSBleHRlbmRzIFF1ZXN0aW9uU2VsZWN0QmFzZSB7XG4gIGNvbENvdW50Q2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgfVxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBjb2x1bW5zIGZvciByYWRpb2dyb3VwIGFuZCBjaGVja2JveCBxdWVzdGlvbnMuIEl0ZW1zIGFyZSByZW5kcmVkIGluIG9uZSBsaW5lIGlmIHRoZSB2YWx1ZSBpcyAwLlxuICAgKi9cbiAgcHVibGljIGdldCBjb2xDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb2xDb3VudFwiLCB0aGlzLmlzRmxvd0xheW91dCA/IDAgOiAxKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbENvdW50KHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gNSB8fCB0aGlzLmlzRmxvd0xheW91dCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvbENvdW50XCIsIHZhbHVlKTtcbiAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLmNvbENvdW50Q2hhbmdlZENhbGxiYWNrKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25QYXJlbnRDaGFuZ2VkKCkge1xuICAgIHN1cGVyLm9uUGFyZW50Q2hhbmdlZCgpO1xuICAgIGlmICh0aGlzLmlzRmxvd0xheW91dCkge1xuICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29sQ291bnRcIiwgbnVsbCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBvblBhcmVudFF1ZXN0aW9uQ2hhbmdlZCgpIHtcbiAgICB0aGlzLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFNlYXJjaGFibGVJdGVtVmFsdWVLZXlzKGtleXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICBrZXlzLnB1c2goXCJjaG9pY2VzXCIpO1xuICB9XG4gIHB1YmxpYyBnZXRJdGVtRW5hYmxlZChpdGVtOiBJdGVtVmFsdWUpIHtcbiAgICByZXR1cm4gIXRoaXMuaXNJbnB1dFJlYWRPbmx5ICYmIGl0ZW0uaXNFbmFibGVkO1xuICB9XG4gIHB1YmxpYyBpc090aGVySXRlbShpdGVtOiBJdGVtVmFsdWUpXG4gIHtcbiAgICByZXR1cm4gdGhpcy5oYXNPdGhlciAmJiBpdGVtLnZhbHVlID09IHRoaXMub3RoZXJJdGVtLnZhbHVlO1xuICB9XG59XG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcInNlbGVjdGJhc2VcIixcbiAgW1xuICAgIHsgbmFtZTogXCJoYXNDb21tZW50OnN3aXRjaFwiLCBsYXlvdXQ6IFwicm93XCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImNvbW1lbnRUZXh0XCIsXG4gICAgICBkZXBlbmRzT246IFwiaGFzQ29tbWVudFwiLFxuICAgICAgdmlzaWJsZUlmOiBmdW5jdGlvbihvYmo6IGFueSkge1xuICAgICAgICByZXR1cm4gb2JqLmhhc0NvbW1lbnQ7XG4gICAgICB9LFxuICAgICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0NvbW1lbnRUZXh0XCIsXG4gICAgICBsYXlvdXQ6IFwicm93XCIsXG4gICAgfSxcbiAgICBcImNob2ljZXNGcm9tUXVlc3Rpb246cXVlc3Rpb25fc2VsZWN0YmFzZVwiLFxuICAgIHtcbiAgICAgIG5hbWU6IFwiY2hvaWNlczppdGVtdmFsdWVbXVwiLFxuICAgICAgYmFzZVZhbHVlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjaG9pY2VzX0l0ZW1cIik7XG4gICAgICB9LFxuICAgICAgZGVwZW5kc09uOiBcImNob2ljZXNGcm9tUXVlc3Rpb25cIixcbiAgICAgIHZpc2libGVJZjogKG9iajogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiAhb2JqLmNob2ljZXNGcm9tUXVlc3Rpb247XG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJjaG9pY2VzRnJvbVF1ZXN0aW9uTW9kZVwiLFxuICAgICAgZGVmYXVsdDogXCJhbGxcIixcbiAgICAgIGNob2ljZXM6IFtcImFsbFwiLCBcInNlbGVjdGVkXCIsIFwidW5zZWxlY3RlZFwiXSxcbiAgICAgIGRlcGVuZHNPbjogXCJjaG9pY2VzRnJvbVF1ZXN0aW9uXCIsXG4gICAgICB2aXNpYmxlSWY6IChvYmo6IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gISFvYmouY2hvaWNlc0Zyb21RdWVzdGlvbjtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImNob2ljZXNPcmRlclwiLFxuICAgICAgZGVmYXVsdDogXCJub25lXCIsXG4gICAgICBjaG9pY2VzOiBbXCJub25lXCIsIFwiYXNjXCIsIFwiZGVzY1wiLCBcInJhbmRvbVwiXSxcbiAgICAgIGRlcGVuZHNPbjogXCJjaG9pY2VzRnJvbVF1ZXN0aW9uXCIsXG4gICAgICB2aXNpYmxlSWY6IChvYmo6IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gIW9iai5jaG9pY2VzRnJvbVF1ZXN0aW9uO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiY2hvaWNlc0J5VXJsOnJlc3RmdWxsXCIsXG4gICAgICBjbGFzc05hbWU6IFwiQ2hvaWNlc1Jlc3RmdWxcIixcbiAgICAgIG9uR2V0VmFsdWU6IGZ1bmN0aW9uKG9iajogYW55KSB7XG4gICAgICAgIHJldHVybiBvYmouY2hvaWNlc0J5VXJsLmdldERhdGEoKTtcbiAgICAgIH0sXG4gICAgICBvblNldFZhbHVlOiBmdW5jdGlvbihvYmo6IGFueSwgdmFsdWU6IGFueSkge1xuICAgICAgICBvYmouY2hvaWNlc0J5VXJsLnNldERhdGEodmFsdWUpO1xuICAgICAgfSxcbiAgICB9LFxuICAgIFwiaGlkZUlmQ2hvaWNlc0VtcHR5OmJvb2xlYW5cIixcbiAgICB7XG4gICAgICBuYW1lOiBcImNob2ljZXNWaXNpYmxlSWY6Y29uZGl0aW9uXCIsXG4gICAgICBkZXBlbmRzT246IFwiY2hvaWNlc0Zyb21RdWVzdGlvblwiLFxuICAgICAgdmlzaWJsZUlmOiAob2JqOiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuICFvYmouY2hvaWNlc0Zyb21RdWVzdGlvbjtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImNob2ljZXNFbmFibGVJZjpjb25kaXRpb25cIixcbiAgICAgIGRlcGVuZHNPbjogXCJjaG9pY2VzRnJvbVF1ZXN0aW9uXCIsXG4gICAgICB2aXNpYmxlSWY6IChvYmo6IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gIW9iai5jaG9pY2VzRnJvbVF1ZXN0aW9uO1xuICAgICAgfSxcbiAgICB9LFxuICAgIFwiaGFzT3RoZXI6Ym9vbGVhblwiLFxuICAgIFwiaGFzTm9uZTpib29sZWFuXCIsXG4gICAge1xuICAgICAgbmFtZTogXCJvdGhlclBsYWNlSG9sZGVyXCIsXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jT3RoZXJQbGFjZUhvbGRlclwiLFxuICAgICAgZGVwZW5kc09uOiBcImhhc090aGVyXCIsXG4gICAgICB2aXNpYmxlSWY6IGZ1bmN0aW9uKG9iajogYW55KSB7XG4gICAgICAgIHJldHVybiBvYmouaGFzT3RoZXI7XG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJub25lVGV4dFwiLFxuICAgICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY05vbmVUZXh0XCIsXG4gICAgICBkZXBlbmRzT246IFwiaGFzTm9uZVwiLFxuICAgICAgdmlzaWJsZUlmOiBmdW5jdGlvbihvYmo6IGFueSkge1xuICAgICAgICByZXR1cm4gb2JqLmhhc05vbmU7XG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJvdGhlclRleHRcIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NPdGhlclRleHRcIixcbiAgICAgIGRlcGVuZHNPbjogXCJoYXNPdGhlclwiLFxuICAgICAgdmlzaWJsZUlmOiBmdW5jdGlvbihvYmo6IGFueSkge1xuICAgICAgICByZXR1cm4gb2JqLmhhc090aGVyO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwib3RoZXJFcnJvclRleHRcIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NPdGhlckVycm9yVGV4dFwiLFxuICAgICAgZGVwZW5kc09uOiBcImhhc090aGVyXCIsXG4gICAgICB2aXNpYmxlSWY6IGZ1bmN0aW9uKG9iajogYW55KSB7XG4gICAgICAgIHJldHVybiBvYmouaGFzT3RoZXI7XG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJzdG9yZU90aGVyc0FzQ29tbWVudFwiLFxuICAgICAgZGVmYXVsdDogXCJkZWZhdWx0XCIsXG4gICAgICBjaG9pY2VzOiBbXCJkZWZhdWx0XCIsIHRydWUsIGZhbHNlXSxcbiAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgIH0sXG4gIF0sXG4gIG51bGwsXG4gIFwicXVlc3Rpb25cIlxuKTtcblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJjaGVja2JveGJhc2VcIixcbiAgW1xuICAgIHtcbiAgICAgIG5hbWU6IFwiY29sQ291bnQ6bnVtYmVyXCIsXG4gICAgICBkZWZhdWx0OiAxLFxuICAgICAgY2hvaWNlczogWzAsIDEsIDIsIDMsIDQsIDVdLFxuICAgICAgbGF5b3V0OiBcInJvd1wiLFxuICAgIH0sXG4gIF0sXG4gIG51bGwsXG4gIFwic2VsZWN0YmFzZVwiXG4pO1xuIiwiaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBwcm9wZXJ0eSwgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7IENzc0NsYXNzQnVpbGRlciB9IGZyb20gXCIuL3V0aWxzL2Nzc0NsYXNzQnVpbGRlclwiO1xuaW1wb3J0IHsgcHJldmVudERlZmF1bHRzIH0gZnJvbSBcIi4vdXRpbHMvdXRpbHNcIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIGJvb2xlYW4gcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkJvb2xlYW5Nb2RlbCBleHRlbmRzIFF1ZXN0aW9uIHtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImxhYmVsRmFsc2VcIiwgdGhpcywgdHJ1ZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImxhYmVsVHJ1ZVwiLCB0aGlzLCB0cnVlKTtcbiAgICB0aGlzLmxvY0xhYmVsRmFsc2Uub25HZXRUZXh0Q2FsbGJhY2sgPSAodGV4dDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICAgIHJldHVybiAhIXRleHRcbiAgICAgICAgPyB0ZXh0XG4gICAgICAgIDogc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImJvb2xlYW5VbmNoZWNrZWRMYWJlbFwiKTtcbiAgICB9O1xuICAgIHRoaXMubG9jTGFiZWxUcnVlLm9uR2V0VGV4dENhbGxiYWNrID0gKHRleHQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgICByZXR1cm4gISF0ZXh0XG4gICAgICAgID8gdGV4dFxuICAgICAgICA6IHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJib29sZWFuQ2hlY2tlZExhYmVsXCIpO1xuICAgIH07XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJib29sZWFuXCI7XG4gIH1cbiAgaXNMYXlvdXRUeXBlU3VwcG9ydGVkKGxheW91dFR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkge1xuICAgIHJldHVybiB0aGlzLnJlbmRlckFzICE9PSBcImNoZWNrYm94XCI7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcXVlc3Rpb24gY2hlY2sgd2lsbCBiZSByZW5kZXJlZCBpbiBpbmRldGVybWluYXRlIG1vZGUuIHZhbHVlIGlzIGVtcHR5LlxuICAgKi9cbiAgcHVibGljIGdldCBpc0luZGV0ZXJtaW5hdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNFbXB0eSgpO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzVGl0bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIEdldC9zZXQgcXVlc3Rpb24gdmFsdWUgaW4gMyBtb2RlczogaW5kZXRlcm1pbmF0ZSAodmFsdWUgaXMgZW1wdHkpLCB0cnVlIChjaGVjayBpcyBzZXQpIGFuZCBmYWxzZSAoY2hlY2sgaXMgdW5zZXQpLlxuICAgKiBAc2VlIHZhbHVlVHJ1ZVxuICAgKiBAc2VlIHZhbHVlRmFsc2VcbiAgICovXG4gIHB1YmxpYyBnZXQgY2hlY2tlZFZhbHVlKCk6IGFueSB7XG4gICAgaWYgKHRoaXMuaXNFbXB0eSgpKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy52YWx1ZSA9PSB0aGlzLmdldFZhbHVlVHJ1ZSgpO1xuICB9XG4gIHB1YmxpYyBzZXQgY2hlY2tlZFZhbHVlKHZhbDogYW55KSB7XG4gICAgaWYgKHRoaXMuaXNSZWFkT25seSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNldENoZWNrZWRWYWx1ZSh2YWwpO1xuICB9XG4gIHByaXZhdGUgc2V0Q2hlY2tlZFZhbHVlKHZhbDogYW55KSB7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUVtcHR5KHZhbCkpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsID09IHRydWUgPyB0aGlzLmdldFZhbHVlVHJ1ZSgpIDogdGhpcy5nZXRWYWx1ZUZhbHNlKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhlIGRlZmF1bHQgc3RhdGUgb2YgdGhlIGNoZWNrOiBcImluZGV0ZXJtaW5hdGVcIiAtIGRlZmF1bHQgKHZhbHVlIGlzIGVtcHR5L251bGwpLCBcInRydWVcIiAtIHZhbHVlIGVxdWFscyB2YWx1ZVRydWUgb3IgdHJ1ZSwgXCJmYWxzZVwiIC0gdmFsdWUgZXF1YWxzIHZhbHVlRmFsc2Ugb3IgZmFsc2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGRlZmF1bHRWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJkZWZhdWx0VmFsdWVcIik7XG4gIH1cbiAgcHVibGljIHNldCBkZWZhdWx0VmFsdWUodmFsOiBhbnkpIHtcbiAgICBpZiAodmFsID09PSB0cnVlKSB2YWwgPSBcInRydWVcIjtcbiAgICBpZiAodmFsID09PSBmYWxzZSkgdmFsID0gXCJmYWxzZVwiO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImRlZmF1bHRWYWx1ZVwiLCB2YWwpO1xuICAgIHRoaXMudXBkYXRlVmFsdWVXaXRoRGVmYXVsdHMoKTtcbiAgfVxuICBwdWJsaWMgZ2V0RGVmYXVsdFZhbHVlKCk6IGFueSB7XG4gICAgaWYgKHRoaXMuZGVmYXVsdFZhbHVlID09IFwiaW5kZXRlcm1pbmF0ZVwiKSByZXR1cm4gbnVsbDtcbiAgICBpZiAodGhpcy5kZWZhdWx0VmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdFZhbHVlID09IFwidHJ1ZVwiXG4gICAgICA/IHRoaXMuZ2V0VmFsdWVUcnVlKClcbiAgICAgIDogdGhpcy5nZXRWYWx1ZUZhbHNlKCk7XG4gIH1cbiAgcHVibGljIGdldCBsb2NUaXRsZSgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd1RpdGxlIHx8IHRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMubG9jTGFiZWwudGV4dClcbiAgICAgID8gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInRpdGxlXCIpXG4gICAgICA6IHRoaXMubG9jTGFiZWw7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBjaGVja2JveCBsYWJlbC4gSWYgaXQgaXMgZW1wdHkgYW5kIHNob3dUaXRsZSBpcyBmYWxzZSB0aGVuIHRpdGxlIGlzIHJlbmRlcmVkXG4gICAqIEBzZWUgc2hvd1RpdGxlXG4gICAqIEBzZWUgdGl0bGVcbiAgICovXG4gIEBwcm9wZXJ0eSh7IGxvY2FsaXphYmxlOiB0cnVlIH0pXG4gIGxhYmVsOiBzdHJpbmc7XG5cbiAgZ2V0IGxvY0Rpc3BsYXlMYWJlbCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgaWYgKHRoaXMubG9jTGFiZWwudGV4dCkgcmV0dXJuIHRoaXMubG9jTGFiZWw7XG4gICAgcmV0dXJuIHRoaXMuc2hvd1RpdGxlID8gdGhpcy5sb2NMYWJlbCA6IHRoaXMubG9jVGl0bGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHksIGlmIHlvdSB3YW50IHRvIGhhdmUgYSBkaWZmZXJlbnQgbGFiZWwgZm9yIHN0YXRlIHdoZW4gY2hlY2sgaXMgc2V0LlxuICAgKi9cbiAgcHVibGljIGdldCBsYWJlbFRydWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJsYWJlbFRydWVcIik7XG4gIH1cbiAgcHVibGljIHNldCBsYWJlbFRydWUodmFsOiBhbnkpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImxhYmVsVHJ1ZVwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NMYWJlbFRydWUoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwibGFiZWxUcnVlXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5LCBpZiB5b3Ugd2FudCB0byBoYXZlIGEgZGlmZmVyZW50IGxhYmVsIGZvciBzdGF0ZSB3aGVuIGNoZWNrIGlzIHVuc2V0LlxuICAgKi9cbiAgcHVibGljIGdldCBsYWJlbEZhbHNlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwibGFiZWxGYWxzZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGxhYmVsRmFsc2UodmFsOiBhbnkpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImxhYmVsRmFsc2VcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jTGFiZWxGYWxzZSgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJsYWJlbEZhbHNlXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUgdG8gc2hvdyB0aGUgcXVlc3Rpb24gdGl0bGUuIEl0IGlzIGhpZGRlbiBieSBkZWZhdWx0LlxuICAgKi9cbiAgQHByb3BlcnR5KClcbiAgc2hvd1RpdGxlOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSwgaWYgeW91IHdhbnQgdG8gaGF2ZSBhIGRpZmZlcmVudCB2YWx1ZSBmcm9tIHRydWUgd2hlbiBjaGVjayBpcyBzZXQuXG4gICAqL1xuICBAcHJvcGVydHkoKVxuICB2YWx1ZVRydWU6IGFueTtcbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5LCBpZiB5b3Ugd2FudCB0byBoYXZlIGEgZGlmZmVyZW50IHZhbHVlIGZyb20gZmFsc2Ugd2hlbiBjaGVjayBpcyB1bnNldC5cbiAgICovXG4gIEBwcm9wZXJ0eSgpXG4gIHZhbHVlRmFsc2U6IGFueTtcblxuICBwcml2YXRlIGdldFZhbHVlVHJ1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlVHJ1ZSA/IHRoaXMudmFsdWVUcnVlIDogdHJ1ZTtcbiAgfVxuICBwcml2YXRlIGdldFZhbHVlRmFsc2UoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZUZhbHNlID8gdGhpcy52YWx1ZUZhbHNlIDogZmFsc2U7XG4gIH1cbiAgcHJvdGVjdGVkIHNldERlZmF1bHRWYWx1ZSgpIHtcbiAgICBpZiAodGhpcy5kZWZhdWx0VmFsdWUgPT0gXCJ0cnVlXCIpIHRoaXMuc2V0Q2hlY2tlZFZhbHVlKHRydWUpO1xuICAgIGlmICh0aGlzLmRlZmF1bHRWYWx1ZSA9PSBcImZhbHNlXCIpIHRoaXMuc2V0Q2hlY2tlZFZhbHVlKGZhbHNlKTtcbiAgICBpZiAodGhpcy5kZWZhdWx0VmFsdWUgPT0gXCJpbmRldGVybWluYXRlXCIpIHRoaXMuc2V0Q2hlY2tlZFZhbHVlKG51bGwpO1xuICB9XG4gIHByb3RlY3RlZCBnZXREaXNwbGF5VmFsdWVDb3JlKGtleXNBc1RleHQ6IGJvb2xlYW4sIHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGlmICh2YWx1ZSA9PSB0aGlzLmdldFZhbHVlVHJ1ZSgpKSByZXR1cm4gdGhpcy5sb2NMYWJlbFRydWUudGV4dE9ySHRtbDtcbiAgICByZXR1cm4gdGhpcy5sb2NMYWJlbEZhbHNlLnRleHRPckh0bWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0SXRlbUNzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiBuZXcgQ3NzQ2xhc3NCdWlsZGVyKClcbiAgICAgIC5hcHBlbmQodGhpcy5jc3NDbGFzc2VzLml0ZW0pXG4gICAgICAuYXBwZW5kKHRoaXMuY3NzQ2xhc3Nlcy5pdGVtRGlzYWJsZWQsIHRoaXMuaXNSZWFkT25seSlcbiAgICAgIC5hcHBlbmQodGhpcy5jc3NDbGFzc2VzLml0ZW1DaGVja2VkLCAhIXRoaXMuY2hlY2tlZFZhbHVlKVxuICAgICAgLmFwcGVuZCh0aGlzLmNzc0NsYXNzZXMuaXRlbUluZGV0ZXJtaW5hdGUsIHRoaXMuY2hlY2tlZFZhbHVlID09PSBudWxsKVxuICAgICAgLnRvU3RyaW5nKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TGFiZWxDc3MoY2hlY2tlZDogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5ldyBDc3NDbGFzc0J1aWxkZXIoKVxuICAgICAgLmFwcGVuZCh0aGlzLmNzc0NsYXNzZXMubGFiZWwpXG4gICAgICAuYXBwZW5kKHRoaXMuY3NzQ2xhc3Nlcy5kaXNhYmxlZExhYmVsLCB0aGlzLmNoZWNrZWRWYWx1ZSA9PT0gIWNoZWNrZWQgfHwgdGhpcy5pc1JlYWRPbmx5KVxuICAgICAgLnRvU3RyaW5nKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFsbG93Q2xpY2soKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNJbmRldGVybWluYXRlICYmICF0aGlzLmlzSW5wdXRSZWFkT25seTtcbiAgfVxuXG4gIC8qICNyZWdpb24gd2ViLWJhc2VkIG1ldGhvZHMgKi9cbiAgcHVibGljIG9uTGFiZWxDbGljayhldmVudDogYW55LCB2YWx1ZTogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLmFsbG93Q2xpY2spIHtcbiAgICAgIHByZXZlbnREZWZhdWx0cyhldmVudCk7XG4gICAgICB0aGlzLmNoZWNrZWRWYWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgb25Td2l0Y2hDbGlja01vZGVsKGV2ZW50OiBhbnkpIHtcbiAgICBpZiAodGhpcy5hbGxvd0NsaWNrKSB7XG4gICAgICBwcmV2ZW50RGVmYXVsdHMoZXZlbnQpO1xuICAgICAgdmFyIGlzUmlnaHRDbGljayA9XG4gICAgICAgIGV2ZW50Lm9mZnNldFggLyBldmVudC50YXJnZXQub2Zmc2V0V2lkdGggPiAwLjU7XG4gICAgICB2YXIgaXNSdGwgPVxuICAgICAgICBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGV2ZW50LnRhcmdldCkuZGlyZWN0aW9uID09IFwicnRsXCI7XG4gICAgICB0aGlzLmNoZWNrZWRWYWx1ZSA9IGlzUnRsID8gIWlzUmlnaHRDbGljayA6IGlzUmlnaHRDbGljaztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyogI2VuZHJlZ2lvbiAqL1xufVxuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImJvb2xlYW5cIixcbiAgW1xuICAgIHsgbmFtZTogXCJsYWJlbDp0ZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NMYWJlbFwiIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJsYWJlbFRydWU6dGV4dFwiLFxuICAgICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0xhYmVsVHJ1ZVwiLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJsYWJlbEZhbHNlOnRleHRcIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NMYWJlbEZhbHNlXCIsXG4gICAgfSxcbiAgICBcInNob3dUaXRsZTpib29sZWFuXCIsXG4gICAgXCJ2YWx1ZVRydWVcIixcbiAgICBcInZhbHVlRmFsc2VcIixcbiAgICB7IG5hbWU6IFwicmVuZGVyQXNcIiwgZGVmYXVsdDogXCJkZWZhdWx0XCIsIHZpc2libGU6IGZhbHNlIH0sXG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25Cb29sZWFuTW9kZWwoXCJcIik7XG4gIH0sXG4gIFwicXVlc3Rpb25cIlxuKTtcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiYm9vbGVhblwiLCAobmFtZSkgPT4ge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uQm9vbGVhbk1vZGVsKG5hbWUpO1xufSk7XG4iLCJpbXBvcnQgeyBTZXJpYWxpemVyLCBwcm9wZXJ0eSB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4vaXRlbXZhbHVlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkNoZWNrYm94QmFzZSB9IGZyb20gXCIuL3F1ZXN0aW9uX2Jhc2VzZWxlY3RcIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IENzc0NsYXNzQnVpbGRlciB9IGZyb20gXCIuL3V0aWxzL2Nzc0NsYXNzQnVpbGRlclwiO1xuXG5leHBvcnQgY2xhc3MgQnV0dG9uR3JvdXBJdGVtVmFsdWUgZXh0ZW5kcyBJdGVtVmFsdWUge1xuICBjb25zdHJ1Y3RvcihcbiAgICB2YWx1ZTogYW55LFxuICAgIHRleHQ6IHN0cmluZyA9IG51bGwsXG4gICAgcHJvdGVjdGVkIHR5cGVOYW1lID0gXCJidXR0b25ncm91cGl0ZW12YWx1ZVwiXG4gICkge1xuICAgIHN1cGVyKHZhbHVlLCB0ZXh0LCB0eXBlTmFtZSk7XG4gIH1cbiAgLypcbiAgICBJdGVtIGljb24gcHJvcGVydHlcbiAgKi9cbiAgQHByb3BlcnR5KClcbiAgaWNvbk5hbWU6IHN0cmluZztcbiAgLypcbiAgICBCeSBkZWZhdWx0IGljb24gc2l6ZSBpcyAyNC5cbiAgICBVc2UgdGhpcyBwcm9wZXJ0eSB0byBjaGFuZ2UgaXRlbSBpY29uIHNpemUuXG4gICovXG4gIEBwcm9wZXJ0eSgpXG4gIGljb25TaXplOiBudW1iZXI7XG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0IGl0ZW0gY2FwdGlvbiBpcyB2aXNpYmxlLlxuICAgKiBTZXQgaXQgJ2ZhbHNlJyB0byBoaWRlIGl0ZW0gY2FwdGlvbi5cbiAgICovXG4gIEBwcm9wZXJ0eSgpXG4gIHNob3dDYXB0aW9uOiBib29sZWFuO1xuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAhIXRoaXMudHlwZU5hbWUgPyB0aGlzLnR5cGVOYW1lIDogXCJidXR0b25ncm91cGl0ZW12YWx1ZVwiO1xuICB9XG59XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBidXR0b24gZ3JvdXAgcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkJ1dHRvbkdyb3VwTW9kZWwgZXh0ZW5kcyBRdWVzdGlvbkNoZWNrYm94QmFzZSB7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiYnV0dG9uZ3JvdXBcIjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0SXRlbVZhbHVlVHlwZSgpIHtcbiAgICByZXR1cm4gXCJidXR0b25ncm91cGl0ZW12YWx1ZVwiO1xuICB9XG4gIHB1YmxpYyBzdXBwb3J0T3RoZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwiYnV0dG9uZ3JvdXBcIixcbiAgW1xuICAgIHtcbiAgICAgIG5hbWU6IFwiY2hvaWNlczpidXR0b25ncm91cGl0ZW12YWx1ZVtdXCIsXG4gICAgfSxcbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvbkJ1dHRvbkdyb3VwTW9kZWwoXCJcIik7XG4gIH0sXG4gIFwiY2hlY2tib3hiYXNlXCJcbik7XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwiYnV0dG9uZ3JvdXBpdGVtdmFsdWVcIixcbiAgW1xuICAgIHsgbmFtZTogXCJzaG93Q2FwdGlvbjpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgICB7IG5hbWU6IFwiaWNvbk5hbWU6dGV4dFwiIH0sXG4gICAgeyBuYW1lOiBcImljb25TaXplOm51bWJlclwiIH0sXG4gIF0sXG4gICh2YWx1ZTogYW55KSA9PiBuZXcgQnV0dG9uR3JvdXBJdGVtVmFsdWUodmFsdWUpLFxuICBcIml0ZW12YWx1ZVwiXG4pO1xuXG4vLyBRdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImJ1dHRvbmdyb3VwXCIsIG5hbWUgPT4ge1xuLy8gICB2YXIgcSA9IG5ldyBRdWVzdGlvbkJ1dHRvbkdyb3VwTW9kZWwobmFtZSk7XG4vLyAgIHEuY2hvaWNlcyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Q2hvaWNlcztcbi8vICAgcmV0dXJuIHE7XG4vLyB9KTtcblxuZXhwb3J0IGNsYXNzIEJ1dHRvbkdyb3VwSXRlbU1vZGVsIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHF1ZXN0aW9uOiBRdWVzdGlvbkJ1dHRvbkdyb3VwTW9kZWwsXG4gICAgcHVibGljIGl0ZW06IEl0ZW1WYWx1ZSxcbiAgICBwdWJsaWMgaW5kZXg6IG51bWJlclxuICApIHt9XG4gIHB1YmxpYyBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbS52YWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGljb25OYW1lKCkge1xuICAgIHJldHVybiB0aGlzLml0ZW0uaWNvbk5hbWU7XG4gIH1cbiAgcHVibGljIGdldCBpY29uU2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtLmljb25TaXplIHx8IDI0O1xuICB9XG4gIHB1YmxpYyBnZXQgY2FwdGlvbigpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbS5sb2NUZXh0O1xuICB9XG4gIHB1YmxpYyBnZXQgc2hvd0NhcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbS5zaG93Q2FwdGlvbiB8fCB0aGlzLml0ZW0uc2hvd0NhcHRpb24gPT09IHVuZGVmaW5lZDtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzUmVxdWlyZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb24uaXNSZXF1aXJlZDtcbiAgfVxuICBwdWJsaWMgZ2V0IHNlbGVjdGVkKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLmlzSXRlbVNlbGVjdGVkKHRoaXMuaXRlbSk7XG4gIH1cbiAgcHVibGljIGdldCByZWFkT25seSgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5pc0lucHV0UmVhZE9ubHkgfHwgIXRoaXMuaXRlbS5pc0VuYWJsZWQ7XG4gIH1cbiAgcHVibGljIGdldCBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLm5hbWUgKyBcIl9cIiArIHRoaXMucXVlc3Rpb24uaWQ7XG4gIH1cbiAgcHVibGljIGdldCBpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5pbnB1dElkICsgXCJfXCIgKyB0aGlzLmluZGV4O1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzRXJyb3JzKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLmVycm9ycy5sZW5ndGggPiAwO1xuICB9XG4gIHB1YmxpYyBnZXQgZGVzY3JpYmVkQnkoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb24uZXJyb3JzLmxlbmd0aCA+IDBcbiAgICAgID8gdGhpcy5xdWVzdGlvbi5pZCArIFwiX2Vycm9yc1wiXG4gICAgICA6IG51bGw7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgbGFiZWxDbGFzcygpIHtcbiAgICByZXR1cm4gbmV3IENzc0NsYXNzQnVpbGRlcigpXG4gICAgICAuYXBwZW5kKHRoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5pdGVtKVxuICAgICAgLmFwcGVuZCh0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXMuaXRlbVNlbGVjdGVkLCB0aGlzLnNlbGVjdGVkKVxuICAgICAgLmFwcGVuZCh0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXMuaXRlbUhvdmVyLCAhdGhpcy5yZWFkT25seSAmJiAhdGhpcy5zZWxlY3RlZClcbiAgICAgIC5hcHBlbmQodGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzLml0ZW1EaXNhYmxlZCwgdGhpcy5xdWVzdGlvbi5pc1JlYWRPbmx5IHx8ICF0aGlzLml0ZW0uaXNFbmFibGVkKVxuICAgICAgLnRvU3RyaW5nKCk7XG4gIH1cbiAgcHVibGljIGdldCBjc3MoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsOiB0aGlzLmxhYmVsQ2xhc3MsXG4gICAgICBpY29uOiB0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXMuaXRlbUljb24sXG4gICAgICBjb250cm9sOiB0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXMuaXRlbUNvbnRyb2wsXG4gICAgICBjYXB0aW9uOiB0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXMuaXRlbUNhcHRpb24sXG4gICAgICBkZWNvcmF0b3I6IHRoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5pdGVtRGVjb3JhdG9yLFxuICAgIH07XG4gIH1cbiAgcHVibGljIG9uQ2hhbmdlKCkge1xuICAgIHRoaXMucXVlc3Rpb24ucmVuZGVyZWRWYWx1ZSA9IHRoaXMuaXRlbS52YWx1ZTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHtcbiAgUXVlc3Rpb25DaGVja2JveEJhc2UsXG4gIFF1ZXN0aW9uU2VsZWN0QmFzZSxcbn0gZnJvbSBcIi4vcXVlc3Rpb25fYmFzZXNlbGVjdFwiO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgQ3NzQ2xhc3NCdWlsZGVyIH0gZnJvbSBcIi4vdXRpbHMvY3NzQ2xhc3NCdWlsZGVyXCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBjaGVja2JveCBxdWVzdGlvblxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25DaGVja2JveE1vZGVsIGV4dGVuZHMgUXVlc3Rpb25DaGVja2JveEJhc2Uge1xuICBwcml2YXRlIHNlbGVjdEFsbEl0ZW1WYWx1ZTogSXRlbVZhbHVlID0gbmV3IEl0ZW1WYWx1ZShcInNlbGVjdGFsbFwiKTtcbiAgcHJpdmF0ZSBpbnZpc2libGVPbGRWYWx1ZXM6IGFueSA9IHt9O1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB2YXIgc2VsZWN0QWxsSXRlbVRleHQgPSB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFxuICAgICAgXCJzZWxlY3RBbGxUZXh0XCIsXG4gICAgICB0aGlzLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gICAgc2VsZWN0QWxsSXRlbVRleHQub25HZXRUZXh0Q2FsbGJhY2sgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgICByZXR1cm4gISF0ZXh0ID8gdGV4dCA6IHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJzZWxlY3RBbGxJdGVtVGV4dFwiKTtcbiAgICB9O1xuICAgIHRoaXMuc2VsZWN0QWxsSXRlbS5sb2NPd25lciA9IHRoaXM7XG4gICAgdGhpcy5zZWxlY3RBbGxJdGVtLnNldExvY1RleHQoc2VsZWN0QWxsSXRlbVRleHQpO1xuXG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0aWVzVmFsdWVDaGFuZ2VkKFxuICAgICAgW1wiaGFzU2VsZWN0QWxsXCIsIFwic2VsZWN0QWxsVGV4dFwiXSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5vblZpc2libGVDaG9pY2VzQ2hhbmdlZCgpO1xuICAgICAgfVxuICAgICk7XG4gIH1cbiAgcHVibGljIGdldCBhcmlhUm9sZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImdyb3VwXCI7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJjaGVja2JveFwiO1xuICB9XG4gIHByb3RlY3RlZCBvbkNyZWF0aW5nKCkge1xuICAgIHN1cGVyLm9uQ3JlYXRpbmcoKTtcbiAgICB0aGlzLmNyZWF0ZU5ld0FycmF5KFwicmVuZGVyZWRWYWx1ZVwiKTtcbiAgICB0aGlzLmNyZWF0ZU5ld0FycmF5KFwidmFsdWVcIik7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEZpcnN0SW5wdXRFbGVtZW50SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnB1dElkICsgXCJfMFwiO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzZWxlY3QgYWxsIGl0ZW0uIEJ5IHVzaW5nIHRoaXMgcHJvcGVydHksIHlvdSBtYXkgY2hhbmdlIHByb2dyYW1tYXRpY2FsbHkgaXQncyB2YWx1ZSBhbmQgdGV4dC5cbiAgICogQHNlZSBoYXNTZWxlY3RBbGxcbiAgICovXG4gIHB1YmxpYyBnZXQgc2VsZWN0QWxsSXRlbSgpOiBJdGVtVmFsdWUge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdEFsbEl0ZW1WYWx1ZTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gc2V0IHRoZSBkaWZmZXJlbnQgdGV4dCBmb3IgU2VsZWN0IEFsbCBpdGVtLlxuICAgKi9cbiAgcHVibGljIGdldCBzZWxlY3RBbGxUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJzZWxlY3RBbGxUZXh0XCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwic2VsZWN0QWxsSXRlbVRleHRcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgc2VsZWN0QWxsVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwic2VsZWN0QWxsVGV4dFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NTZWxlY3RBbGxUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInNlbGVjdEFsbFRleHRcIik7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUsIHRvIHNob3cgdGhlIFwiU2VsZWN0IEFsbFwiIGl0ZW0gb24gdGhlIHRvcC4gSWYgZW5kLXVzZXIgY2hlY2tzIHRoaXMgaXRlbSwgdGhlbiBhbGwgaXRlbXMgYXJlIGNoZWNrZWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhhc1NlbGVjdEFsbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaGFzU2VsZWN0QWxsXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGhhc1NlbGVjdEFsbCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJoYXNTZWxlY3RBbGxcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGFsbCBpdGVtcyBhcmUgc2VsZWN0ZWRcbiAgICogQHNlZSB0b2dnbGVTZWxlY3RBbGxcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNBbGxTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICB2YXIgdmFsID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoIXZhbCB8fCAhQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMuaXNJdGVtU2VsZWN0ZWQodGhpcy5ub25lSXRlbSkpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgYWxsSXRlbUNvdW50ID0gdGhpcy52aXNpYmxlQ2hvaWNlcy5sZW5ndGg7XG4gICAgaWYgKHRoaXMuaGFzT3RoZXIpIGFsbEl0ZW1Db3VudC0tO1xuICAgIGlmICh0aGlzLmhhc05vbmUpIGFsbEl0ZW1Db3VudC0tO1xuICAgIGlmICh0aGlzLmhhc1NlbGVjdEFsbCkgYWxsSXRlbUNvdW50LS07XG4gICAgdmFyIHNlbGVjdGVkQ291bnQgPSB2YWwubGVuZ3RoO1xuICAgIGlmICh0aGlzLmlzSXRlbVNlbGVjdGVkKHRoaXMub3RoZXJJdGVtKSkgc2VsZWN0ZWRDb3VudC0tO1xuICAgIHJldHVybiBzZWxlY3RlZENvdW50ID09PSBhbGxJdGVtQ291bnQ7XG4gIH1cbiAgcHVibGljIHNldCBpc0FsbFNlbGVjdGVkKHZhbDogYm9vbGVhbikge1xuICAgIGlmICh2YWwpIHtcbiAgICAgIHRoaXMuc2VsZWN0QWxsKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2xlYXJWYWx1ZSgpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogSXQgd2lsbCBzZWxlY3QgYWxsIGl0ZW1zLCBleGNlcHQgb3RoZXIgYW5kIG5vbmUuIElmIGFsbCBpdGVtcyBoYXZlIGJlZW4gYWxyZWFkeSBzZWxlY3RlZCB0aGVuIGl0IHdpbGwgY2xlYXIgdGhlIHZhbHVlXG4gICAqIEBzZWUgaXNBbGxTZWxlY3RlZFxuICAgKiBAc2VlIHNlbGVjdEFsbFxuICAgKi9cbiAgcHVibGljIHRvZ2dsZVNlbGVjdEFsbCgpIHtcbiAgICB0aGlzLmlzQWxsU2VsZWN0ZWQgPSAhdGhpcy5pc0FsbFNlbGVjdGVkO1xuICB9XG4gIC8qKlxuICAgKiBTZWxlY3QgYWxsIGl0ZW1zLCBleGNlcHQgb3RoZXIgYW5kIG5vbmUuXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0QWxsKCkge1xuICAgIHZhciB2YWwgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudmlzaWJsZUNob2ljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gdGhpcy52aXNpYmxlQ2hvaWNlc1tpXTtcbiAgICAgIGlmIChcbiAgICAgICAgaXRlbSA9PT0gdGhpcy5ub25lSXRlbSB8fFxuICAgICAgICBpdGVtID09PSB0aGlzLm90aGVySXRlbSB8fFxuICAgICAgICBpdGVtID09PSB0aGlzLnNlbGVjdEFsbEl0ZW1cbiAgICAgIClcbiAgICAgICAgY29udGludWU7XG4gICAgICB2YWwucHVzaChpdGVtLnZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy52YWx1ZSA9IHZhbDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGl0ZW0gaXMgY2hlY2tlZFxuICAgKiBAcGFyYW0gaXRlbSBjaGVja2JveCBpdGVtIHZhbHVlXG4gICAqL1xuICBwdWJsaWMgaXNJdGVtU2VsZWN0ZWQoaXRlbTogSXRlbVZhbHVlKTogYm9vbGVhbiB7XG4gICAgaWYgKGl0ZW0gPT09IHRoaXMuc2VsZWN0QWxsSXRlbSkgcmV0dXJuIHRoaXMuaXNBbGxTZWxlY3RlZDtcbiAgICB2YXIgdmFsID0gdGhpcy5yZW5kZXJlZFZhbHVlO1xuICAgIGlmICghdmFsIHx8ICFBcnJheS5pc0FycmF5KHZhbCkpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuaXNUd29WYWx1ZUVxdWFscyh2YWxbaV0sIGl0ZW0udmFsdWUpKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSBkaWZmZXJlbnQgdG8gMCB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIHNlbGVjdGVkIGNob2ljZXMgaW4gdGhlIGNoZWNrYm94LlxuICAgKi9cbiAgcHVibGljIGdldCBtYXhTZWxlY3RlZENob2ljZXMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWF4U2VsZWN0ZWRDaG9pY2VzXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4U2VsZWN0ZWRDaG9pY2VzKHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKHZhbCA8IDApIHZhbCA9IDA7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWF4U2VsZWN0ZWRDaG9pY2VzXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgc2VsZWN0ZWQgaXRlbXMgaW4gdGhlIGNoZWNrYm94LiBSZXR1cm5zIGVtcHR5IGFycmF5IGlmIHRoZSB2YWx1ZSBpcyBlbXB0eVxuICAgKi9cbiAgcHVibGljIGdldCBzZWxlY3RlZEl0ZW1zKCk6IEFycmF5PEl0ZW1WYWx1ZT4ge1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSkgcmV0dXJuIFtdO1xuICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICAgIHZhciByZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzLnB1c2goSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKHRoaXMudmlzaWJsZUNob2ljZXMsIHZhbFtpXSkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByb3RlY3RlZCBvbkVuYWJsZUl0ZW1DYWxsQmFjayhpdGVtOiBJdGVtVmFsdWUpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkQ2hlY2tNYXhTZWxlY3RlZENob2ljZXMoKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIHRoaXMuaXNJdGVtU2VsZWN0ZWQoaXRlbSk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQWZ0ZXJSdW5JdGVtc0VuYWJsZUNvbmRpdGlvbigpIHtcbiAgICBpZiAodGhpcy5tYXhTZWxlY3RlZENob2ljZXMgPCAxKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaGFzU2VsZWN0QWxsKSB7XG4gICAgICB0aGlzLnNlbGVjdEFsbEl0ZW0uc2V0SXNFbmFibGVkKFxuICAgICAgICB0aGlzLm1heFNlbGVjdGVkQ2hvaWNlcyA+PSB0aGlzLmFjdGl2ZUNob2ljZXMubGVuZ3RoXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNPdGhlcikge1xuICAgICAgdGhpcy5vdGhlckl0ZW0uc2V0SXNFbmFibGVkKFxuICAgICAgICAhdGhpcy5zaG91bGRDaGVja01heFNlbGVjdGVkQ2hvaWNlcygpIHx8IHRoaXMuaXNPdGhlclNlbGVjdGVkXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHNob3VsZENoZWNrTWF4U2VsZWN0ZWRDaG9pY2VzKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm1heFNlbGVjdGVkQ2hvaWNlcyA8IDEpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgdmFsID0gdGhpcy52YWx1ZTtcbiAgICB2YXIgbGVuID0gIUFycmF5LmlzQXJyYXkodmFsKSA/IDAgOiB2YWwubGVuZ3RoO1xuICAgIHJldHVybiBsZW4gPj0gdGhpcy5tYXhTZWxlY3RlZENob2ljZXM7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEl0ZW1DbGFzc0NvcmUoaXRlbTogYW55LCBvcHRpb25zOiBhbnkpIHtcbiAgICBjb25zdCBfX2R1bW15X3ZhbHVlID0gdGhpcy52YWx1ZTsgLy90cmlnZ2VyIGRlcGVuZGVuY2llcyBmcm9tIGtvVmFsdWUgZm9yIGtub2Nrb3V0XG4gICAgb3B0aW9ucy5pc1NlbGVjdEFsbEl0ZW0gPSBpdGVtID09PSB0aGlzLnNlbGVjdEFsbEl0ZW07XG4gICAgcmV0dXJuIG5ldyBDc3NDbGFzc0J1aWxkZXIoKVxuICAgICAgLmFwcGVuZChzdXBlci5nZXRJdGVtQ2xhc3NDb3JlKGl0ZW0sIG9wdGlvbnMpKVxuICAgICAgLmFwcGVuZCh0aGlzLmNzc0NsYXNzZXMuaXRlbVNlbGVjdEFsbCwgb3B0aW9ucy5pc1NlbGVjdEFsbEl0ZW0pXG4gICAgICAudG9TdHJpbmcoKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0TmV3VmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgIGlmICghdGhpcy5pc0NoYW5naW5nVmFsdWVPbkNsZWFySW5jb3JyZWN0KSB7XG4gICAgICB0aGlzLmludmlzaWJsZU9sZFZhbHVlcyA9IFtdO1xuICAgIH1cbiAgICBuZXdWYWx1ZSA9IHRoaXMudmFsdWVGcm9tRGF0YShuZXdWYWx1ZSk7XG4gICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoIW5ld1ZhbHVlKSBuZXdWYWx1ZSA9IFtdO1xuICAgIGlmICghdmFsdWUpIHZhbHVlID0gW107XG4gICAgaWYgKHRoaXMuaXNUd29WYWx1ZUVxdWFscyh2YWx1ZSwgbmV3VmFsdWUpKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaGFzTm9uZSkge1xuICAgICAgdmFyIHByZXZOb25lSW5kZXggPSB0aGlzLm5vbmVJbmRleEluQXJyYXkodmFsdWUpO1xuICAgICAgdmFyIG5ld05vbmVJbmRleCA9IHRoaXMubm9uZUluZGV4SW5BcnJheShuZXdWYWx1ZSk7XG4gICAgICBpZiAocHJldk5vbmVJbmRleCA+IC0xKSB7XG4gICAgICAgIGlmIChuZXdOb25lSW5kZXggPiAtMSAmJiBuZXdWYWx1ZS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgbmV3VmFsdWUuc3BsaWNlKG5ld05vbmVJbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChuZXdOb25lSW5kZXggPiAtMSkge1xuICAgICAgICAgIG5ld1ZhbHVlLnNwbGljZSgwLCBuZXdWYWx1ZS5sZW5ndGgpO1xuICAgICAgICAgIG5ld1ZhbHVlLnB1c2godGhpcy5ub25lSXRlbS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgc3VwZXIuc2V0TmV3VmFsdWUodGhpcy5yZW5kcmVkVmFsdWVUb0RhdGEobmV3VmFsdWUpKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0SXNNdWx0aXBsZVZhbHVlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByb3RlY3RlZCBnZXRDb21tZW50RnJvbVZhbHVlKG5ld1ZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAgIHZhciBpbmQgPSB0aGlzLmdldEZpcnN0VW5rbm93bkluZGV4KG5ld1ZhbHVlKTtcbiAgICBpZiAoaW5kIDwgMCkgcmV0dXJuIFwiXCI7XG4gICAgcmV0dXJuIG5ld1ZhbHVlW2luZF07XG4gIH1cbiAgcHJvdGVjdGVkIHNldE90aGVyVmFsdWVJbnRvVmFsdWUobmV3VmFsdWU6IGFueSk6IGFueSB7XG4gICAgdmFyIGluZCA9IHRoaXMuZ2V0Rmlyc3RVbmtub3duSW5kZXgobmV3VmFsdWUpO1xuICAgIGlmIChpbmQgPCAwKSByZXR1cm4gbmV3VmFsdWU7XG4gICAgbmV3VmFsdWUuc3BsaWNlKGluZCwgMSwgdGhpcy5vdGhlckl0ZW0udmFsdWUpO1xuICAgIHJldHVybiBuZXdWYWx1ZTtcbiAgfVxuICBwcml2YXRlIGdldEZpcnN0VW5rbm93bkluZGV4KG5ld1ZhbHVlOiBhbnkpOiBudW1iZXIge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShuZXdWYWx1ZSkpIHJldHVybiAtMTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld1ZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5oYXNVbmtub3duVmFsdWUobmV3VmFsdWVbaV0pKSByZXR1cm4gaTtcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIHByaXZhdGUgbm9uZUluZGV4SW5BcnJheSh2YWw6IGFueSkge1xuICAgIGlmICghdmFsIHx8ICFBcnJheS5pc0FycmF5KHZhbCkpIHJldHVybiAtMTtcbiAgICB2YXIgbm9uZVZhbHVlID0gdGhpcy5ub25lSXRlbS52YWx1ZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZhbFtpXSA9PSBub25lVmFsdWUpIHJldHVybiBpO1xuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgcHJvdGVjdGVkIGNhblVzZUZpbHRlcmVkQ2hvaWNlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaGFzU2VsZWN0QWxsICYmIHN1cGVyLmNhblVzZUZpbHRlcmVkQ2hvaWNlcygpO1xuICB9XG4gIHByb3RlY3RlZCBzdXBwb3J0U2VsZWN0QWxsKCkge1xuICAgIHJldHVybiB0aGlzLmlzU3VwcG9ydFByb3BlcnR5KFwiaGFzU2VsZWN0QWxsXCIpO1xuICB9XG4gIHByb3RlY3RlZCBhZGRUb1Zpc2libGVDaG9pY2VzKGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LCBpc0FkZEFsbDogYm9vbGVhbikge1xuICAgIGlmIChcbiAgICAgIHRoaXMuc3VwcG9ydFNlbGVjdEFsbCgpICYmXG4gICAgICAoKGlzQWRkQWxsICYmIHRoaXMuY2FuU2hvd09wdGlvbkl0ZW0odGhpcy5zZWxlY3RBbGxJdGVtKSkgfHxcbiAgICAgICAgdGhpcy5oYXNTZWxlY3RBbGwpXG4gICAgKSB7XG4gICAgICBpdGVtcy51bnNoaWZ0KHRoaXMuc2VsZWN0QWxsSXRlbSk7XG4gICAgfVxuICAgIHN1cGVyLmFkZFRvVmlzaWJsZUNob2ljZXMoaXRlbXMsIGlzQWRkQWxsKTtcbiAgfVxuICBwcm90ZWN0ZWQgaXNCdWlsdEluQ2hvaWNlKFxuICAgIGl0ZW06IEl0ZW1WYWx1ZSxcbiAgICBxdWVzdGlvbjogUXVlc3Rpb25TZWxlY3RCYXNlXG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBpdGVtID09PSAoPFF1ZXN0aW9uQ2hlY2tib3hCYXNlPnF1ZXN0aW9uKS5zZWxlY3RBbGxJdGVtIHx8XG4gICAgICBzdXBlci5pc0J1aWx0SW5DaG9pY2UoaXRlbSwgcXVlc3Rpb24pXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogRm9yIGludGVybmFsIHVzZSBpbiBTdXJ2ZXlKUyBDcmVhdG9yIFYyLlxuICAgKi9cbiAgcHVibGljIGlzSXRlbUluTGlzdChpdGVtOiBJdGVtVmFsdWUpOiBib29sZWFuIHtcbiAgICBpZiAoaXRlbSA9PSB0aGlzLnNlbGVjdEFsbEl0ZW0pIHJldHVybiB0aGlzLmhhc1NlbGVjdEFsbDtcbiAgICByZXR1cm4gc3VwZXIuaXNJdGVtSW5MaXN0KGl0ZW0pO1xuICB9XG4gIHByb3RlY3RlZCBnZXREaXNwbGF5VmFsdWVDb3JlKGtleXNBc1RleHQ6IGJvb2xlYW4sIHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAgICByZXR1cm4gc3VwZXIuZ2V0RGlzcGxheVZhbHVlQ29yZShrZXlzQXNUZXh0LCB2YWx1ZSk7XG4gICAgdmFyIGl0ZW1zID0gdGhpcy52aXNpYmxlQ2hvaWNlcztcbiAgICB2YXIgc3RyID0gXCJcIjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmFsU3RyID0gdGhpcy5nZXRDaG9pY2VzRGlzcGxheVZhbHVlKGl0ZW1zLCB2YWx1ZVtpXSk7XG4gICAgICBpZiAodmFsU3RyKSB7XG4gICAgICAgIGlmIChzdHIpIHN0ciArPSBcIiwgXCI7XG4gICAgICAgIHN0ciArPSB2YWxTdHI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG4gIH1cbiAgcHJvdGVjdGVkIGNsZWFySW5jb3JyZWN0VmFsdWVzQ29yZSgpIHtcbiAgICB0aGlzLmNsZWFySW5jb3JyZWN0QW5kRGlzYWJsZWRWYWx1ZXMoZmFsc2UpO1xuICB9XG4gIHByb3RlY3RlZCBjbGVhckRpc2FibGVkVmFsdWVzQ29yZSgpIHtcbiAgICB0aGlzLmNsZWFySW5jb3JyZWN0QW5kRGlzYWJsZWRWYWx1ZXModHJ1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBpc0NoYW5naW5nVmFsdWVPbkNsZWFySW5jb3JyZWN0OiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgY2xlYXJJbmNvcnJlY3RBbmREaXNhYmxlZFZhbHVlcyhjbGVhckRpc2FibGVkOiBib29sZWFuKSB7XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgdmFyIGhhc0NoYW5nZWQgPSBmYWxzZTtcbiAgICB2YXIgcmVzdG9yZWRWYWx1ZXMgPSB0aGlzLnJlc3RvcmVWYWx1ZXNGcm9tSW52aXNpYmxlKCk7XG4gICAgaWYgKCF2YWwgJiYgcmVzdG9yZWRWYWx1ZXMubGVuZ3RoID09IDApIHJldHVybjtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsKSB8fCB2YWwubGVuZ3RoID09IDApIHtcbiAgICAgIHRoaXMuaXNDaGFuZ2luZ1ZhbHVlT25DbGVhckluY29ycmVjdCA9IHRydWU7XG4gICAgICBpZiAoIWNsZWFyRGlzYWJsZWQpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzQ29tbWVudCkge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY2xlYXJWYWx1ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmlzQ2hhbmdpbmdWYWx1ZU9uQ2xlYXJJbmNvcnJlY3QgPSBmYWxzZTtcbiAgICAgIGlmIChyZXN0b3JlZFZhbHVlcy5sZW5ndGggPT0gMCkgcmV0dXJuO1xuICAgICAgdmFsID0gW107XG4gICAgfVxuICAgIHZhciBuZXdWYWx1ZSA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXNVbmtvd24gPSB0aGlzLmNhbkNsZWFyVmFsdWVBblVua25vdyh2YWxbaV0pO1xuICAgICAgaWYgKFxuICAgICAgICAoIWNsZWFyRGlzYWJsZWQgJiYgIWlzVW5rb3duKSB8fFxuICAgICAgICAoY2xlYXJEaXNhYmxlZCAmJiAhdGhpcy5pc1ZhbHVlRGlzYWJsZWQodmFsW2ldKSlcbiAgICAgICkge1xuICAgICAgICBuZXdWYWx1ZS5wdXNoKHZhbFtpXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoYXNDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgaWYgKGlzVW5rb3duKSB7XG4gICAgICAgICAgdGhpcy5pbnZpc2libGVPbGRWYWx1ZXNbdmFsW2ldXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN0b3JlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgbmV3VmFsdWUucHVzaChyZXN0b3JlZFZhbHVlc1tpXSk7XG4gICAgICBoYXNDaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCFoYXNDaGFuZ2VkKSByZXR1cm47XG4gICAgdGhpcy5pc0NoYW5naW5nVmFsdWVPbkNsZWFySW5jb3JyZWN0ID0gdHJ1ZTtcbiAgICBpZiAobmV3VmFsdWUubGVuZ3RoID09IDApIHtcbiAgICAgIHRoaXMuY2xlYXJWYWx1ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgfVxuICAgIHRoaXMuaXNDaGFuZ2luZ1ZhbHVlT25DbGVhckluY29ycmVjdCA9IGZhbHNlO1xuICB9XG4gIHByaXZhdGUgcmVzdG9yZVZhbHVlc0Zyb21JbnZpc2libGUoKTogQXJyYXk8YW55PiB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHZhciB2aXNJdGVtcyA9IHRoaXMudmlzaWJsZUNob2ljZXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2aXNJdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHZhbCA9IHZpc0l0ZW1zW2ldLnZhbHVlO1xuICAgICAgaWYgKHRoaXMuaW52aXNpYmxlT2xkVmFsdWVzW3ZhbF0pIHtcbiAgICAgICAgcmVzLnB1c2godmFsKTtcbiAgICAgICAgZGVsZXRlIHRoaXMuaW52aXNpYmxlT2xkVmFsdWVzW3ZhbF07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGdldENvbmRpdGlvbkpzb24ob3BlcmF0b3I6IHN0cmluZyA9IG51bGwsIHBhdGg6IHN0cmluZyA9IG51bGwpOiBhbnkge1xuICAgIHZhciBqc29uID0gc3VwZXIuZ2V0Q29uZGl0aW9uSnNvbigpO1xuICAgIGlmIChvcGVyYXRvciA9PSBcImNvbnRhaW5zXCIgfHwgb3BlcmF0b3IgPT0gXCJub3Rjb250YWluc1wiKSB7XG4gICAgICBqc29uW1widHlwZVwiXSA9IFwicmFkaW9ncm91cFwiO1xuICAgIH1cbiAgICByZXR1cm4ganNvbjtcbiAgfVxuICBwdWJsaWMgaXNBbnN3ZXJDb3JyZWN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBIZWxwZXJzLmlzQXJyYXlDb250YWluc0VxdWFsKHRoaXMudmFsdWUsIHRoaXMuY29ycmVjdEFuc3dlcik7XG4gIH1cbiAgcHJvdGVjdGVkIHNldERlZmF1bHRWYWx1ZVdpdGhPdGhlcnMoKSB7XG4gICAgdGhpcy52YWx1ZSA9IHRoaXMucmVuZGVyZWRWYWx1ZUZyb21EYXRhQ29yZSh0aGlzLmRlZmF1bHRWYWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEhhc090aGVyKHZhbDogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCF2YWwgfHwgIUFycmF5LmlzQXJyYXkodmFsKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB2YWwuaW5kZXhPZih0aGlzLm90aGVySXRlbS52YWx1ZSkgPj0gMDtcbiAgfVxuICBwcm90ZWN0ZWQgdmFsdWVGcm9tRGF0YSh2YWw6IGFueSk6IGFueSB7XG4gICAgaWYgKCF2YWwpIHJldHVybiB2YWw7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbCkpIHJldHVybiBbc3VwZXIudmFsdWVGcm9tRGF0YSh2YWwpXTtcbiAgICBsZXQgdmFsdWUgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IGNob2ljZWl0ZW0gPSBJdGVtVmFsdWUuZ2V0SXRlbUJ5VmFsdWUodGhpcy5hY3RpdmVDaG9pY2VzLCB2YWxbaV0pO1xuICAgICAgaWYgKCEhY2hvaWNlaXRlbSkge1xuICAgICAgICB2YWx1ZS5wdXNoKGNob2ljZWl0ZW0udmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUucHVzaCh2YWxbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlcmVkVmFsdWVGcm9tRGF0YUNvcmUodmFsOiBhbnkpOiBhbnkge1xuICAgIGlmICghdmFsIHx8ICFBcnJheS5pc0FycmF5KHZhbCkpIHZhbCA9IFtdO1xuICAgIGlmICghdGhpcy5oYXNBY3RpdmVDaG9pY2VzKSByZXR1cm4gdmFsO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodmFsW2ldID09IHRoaXMub3RoZXJJdGVtLnZhbHVlKSByZXR1cm4gdmFsO1xuICAgICAgaWYgKHRoaXMuaGFzVW5rbm93blZhbHVlKHZhbFtpXSwgdHJ1ZSwgZmFsc2UpKSB7XG4gICAgICAgIHRoaXMuY29tbWVudCA9IHZhbFtpXTtcbiAgICAgICAgdmFyIG5ld1ZhbCA9IHZhbC5zbGljZSgpO1xuICAgICAgICBuZXdWYWxbaV0gPSB0aGlzLm90aGVySXRlbS52YWx1ZTtcbiAgICAgICAgcmV0dXJuIG5ld1ZhbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZHJlZFZhbHVlVG9EYXRhQ29yZSh2YWw6IGFueSk6IGFueSB7XG4gICAgaWYgKCF2YWwgfHwgIXZhbC5sZW5ndGgpIHJldHVybiB2YWw7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh2YWxbaV0gPT0gdGhpcy5vdGhlckl0ZW0udmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuZ2V0UXVlc3Rpb25Db21tZW50KCkpIHtcbiAgICAgICAgICB2YXIgbmV3VmFsID0gdmFsLnNsaWNlKCk7XG4gICAgICAgICAgbmV3VmFsW2ldID0gdGhpcy5nZXRRdWVzdGlvbkNvbW1lbnQoKTtcbiAgICAgICAgICByZXR1cm4gbmV3VmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgcHVibGljIGdldCBjaGVja0JveFN2Z1BhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJNNSwxM2wyLTJsMywzbDctN2wyLDJsLTksOUw1LDEzelwiO1xuICB9XG4gIHB1YmxpYyBnZXRJdGVtSWQoaXRlbTogSXRlbVZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5wdXRJZCArIFwiX1wiICsgdGhpcy5nZXRJdGVtSW5kZXgoaXRlbSk7XG4gIH1cbn1cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwiY2hlY2tib3hcIixcbiAgW1xuICAgIFwiaGFzU2VsZWN0QWxsOmJvb2xlYW5cIixcbiAgICB7IG5hbWU6IFwibWF4U2VsZWN0ZWRDaG9pY2VzOm51bWJlclwiLCBkZWZhdWx0OiAwIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJzZWxlY3RBbGxUZXh0XCIsXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jU2VsZWN0QWxsVGV4dFwiLFxuICAgICAgZGVwZW5kc09uOiBcImhhc1NlbGVjdEFsbFwiLFxuICAgICAgdmlzaWJsZUlmOiBmdW5jdGlvbihvYmo6IGFueSkge1xuICAgICAgICByZXR1cm4gb2JqLmhhc1NlbGVjdEFsbDtcbiAgICAgIH1cbiAgICB9XG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25DaGVja2JveE1vZGVsKFwiXCIpO1xuICB9LFxuICBcImNoZWNrYm94YmFzZVwiXG4pO1xuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJjaGVja2JveFwiLCAobmFtZSkgPT4ge1xuICB2YXIgcSA9IG5ldyBRdWVzdGlvbkNoZWNrYm94TW9kZWwobmFtZSk7XG4gIHEuY2hvaWNlcyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Q2hvaWNlcztcbiAgcmV0dXJuIHE7XG59KTtcbiIsImltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IFF1ZXN0aW9uVGV4dEJhc2UgfSBmcm9tIFwiLi9xdWVzdGlvbl90ZXh0YmFzZVwiO1xuaW1wb3J0IHsgaW5jcmVhc2VIZWlnaHRCeUNvbnRlbnQgfSBmcm9tIFwiLi91dGlscy91dGlsc1wiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGEgY29tbWVudCBxdWVzdGlvblxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25Db21tZW50TW9kZWwgZXh0ZW5kcyBRdWVzdGlvblRleHRCYXNlIHtcbiAgcHJpdmF0ZSBlbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgLyoqXG4gICAqIFRoZSBodG1sIHJvd3MgYXR0cmlidXRlLlxuICAgKi9cbiAgcHVibGljIGdldCByb3dzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJvd3NcIik7XG4gIH1cbiAgcHVibGljIHNldCByb3dzKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicm93c1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaHRtbCBjb2xzIGF0dHJpYnV0ZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgY29scygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb2xzXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29scyh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvbHNcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBvciBzZXRzIGEgYm9vbGVhbiB0aGF0IHNwZWNpZmllcyB3aGV0aGVyIGEgcXVlc3Rpb24gY2FuIGFjY2VwdCBhbmQgZGlzcGxheSBtdWx0aXBsZSBsaW5lcyBvZiB0ZXh0LlxuICAgKi9cbiAgcHVibGljIGdldCBtdWx0aUxpbmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm11bHRpTGluZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG11bHRpTGluZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtdWx0aUxpbmVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHF1ZXN0aW9uJ3MgdGV4dCBhcmVhIGF1dG9tYXRpY2FsbHkgZXhwYW5kcyBpdHMgaGVpZ2h0IHRvIGF2b2lkIHRoZSB2ZXJ0aWNhbCBzY3JvbGxiYXIgYW5kIHRvIGRpc3BsYXkgdGhlIGVudGlyZSBtdWx0aS1saW5lIGNvbnRlbnRzIGVudGVyZWQgYnkgcmVzcG9uZGVudHMuXG4gICAqIERlZmF1bHQgdmFsdWUgaXMgZmFsc2UuXG4gICAqIEBzZWUgU3VydmV5TW9kZWwuYXV0b0dyb3dDb21tZW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IGF1dG9Hcm93KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJhdXRvR3Jvd1wiKSB8fCAodGhpcy5zdXJ2ZXkgJiYgdGhpcy5zdXJ2ZXkuYXV0b0dyb3dDb21tZW50KTtcbiAgfVxuICBwdWJsaWMgc2V0IGF1dG9Hcm93KHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImF1dG9Hcm93XCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJjb21tZW50XCI7XG4gIH1cbiAgcHVibGljIGFmdGVyUmVuZGVyUXVlc3Rpb25FbGVtZW50KGVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIHRoaXMuZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuaW5wdXRJZCkgfHwgZWw7XG4gICAgdGhpcy51cGRhdGVFbGVtZW50KCk7XG4gICAgc3VwZXIuYWZ0ZXJSZW5kZXJRdWVzdGlvbkVsZW1lbnQoZWwpO1xuICB9XG4gIHB1YmxpYyB1cGRhdGVFbGVtZW50KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVsZW1lbnQgJiYgdGhpcy5hdXRvR3Jvdykge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiBpbmNyZWFzZUhlaWdodEJ5Q29udGVudCh0aGlzLmVsZW1lbnQpLCAxKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIG9uSW5wdXQoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzSW5wdXRUZXh0VXBkYXRlKVxuICAgICAgdGhpcy52YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICBlbHNlXG4gICAgICB0aGlzLnVwZGF0ZUVsZW1lbnQoKTtcbiAgfVxuICBwdWJsaWMgb25LZXlEb3duKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubXVsdGlMaW5lICYmIChldmVudC5rZXkgPT09IFwiRW50ZXJcIiB8fCBldmVudC5rZXlDb2RlID09PSAxMykpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gIH1cbiAgb25WYWx1ZUNoYW5nZWQoKTogdm9pZCB7XG4gICAgc3VwZXIub25WYWx1ZUNoYW5nZWQoKTtcbiAgICB0aGlzLnVwZGF0ZUVsZW1lbnQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0TmV3VmFsdWUobmV3VmFsdWU6IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKCF0aGlzLm11bHRpTGluZSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXhcbiAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKFwiKFxcclxcbnxcXG58XFxyKVwiLCBcImdtXCIpLCBcIlwiKTtcbiAgICB9XG4gICAgc3VwZXIuc2V0TmV3VmFsdWUobmV3VmFsdWUpO1xuICB9XG59XG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImNvbW1lbnRcIixcbiAgW1xuICAgIHsgbmFtZTogXCJtYXhMZW5ndGg6bnVtYmVyXCIsIGRlZmF1bHQ6IC0xIH0sXG4gICAgeyBuYW1lOiBcImNvbHM6bnVtYmVyXCIsIGRlZmF1bHQ6IDUwIH0sXG4gICAgeyBuYW1lOiBcInJvd3M6bnVtYmVyXCIsIGRlZmF1bHQ6IDQgfSxcbiAgICB7IG5hbWU6IFwicGxhY2VIb2xkZXJcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1BsYWNlSG9sZGVyXCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInRleHRVcGRhdGVNb2RlXCIsXG4gICAgICBkZWZhdWx0OiBcImRlZmF1bHRcIixcbiAgICAgIGNob2ljZXM6IFtcImRlZmF1bHRcIiwgXCJvbkJsdXJcIiwgXCJvblR5cGluZ1wiXSxcbiAgICB9LFxuICAgIHsgbmFtZTogXCJhdXRvR3Jvdzpib29sZWFuXCIgfSxcbiAgICB7IG5hbWU6IFwibXVsdGlMaW5lOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9XG4gIF0sXG4gIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uQ29tbWVudE1vZGVsKFwiXCIpO1xuICB9LFxuICBcInRleHRiYXNlXCJcbik7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImNvbW1lbnRcIiwgKG5hbWUpID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkNvbW1lbnRNb2RlbChuYW1lKTtcbn0pO1xuIiwiaW1wb3J0IHsgUXVlc3Rpb24sIElDb25kaXRpb25PYmplY3QgfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciwgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24gfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQge1xuICBJU3VydmV5SW1wbCxcbiAgSVN1cnZleURhdGEsXG4gIElTdXJ2ZXksXG4gIElUZXh0UHJvY2Vzc29yLFxuICBJUGFuZWwsXG4gIElFbGVtZW50XG59IGZyb20gXCIuL2Jhc2UtaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgU3VydmV5RWxlbWVudCB9IGZyb20gXCIuL3N1cnZleS1lbGVtZW50XCI7XG5pbXBvcnQgeyBQYW5lbE1vZGVsIH0gZnJvbSBcIi4vcGFuZWxcIjtcbmltcG9ydCB7IEhlbHBlcnMsIEhhc2hUYWJsZSB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25UZXh0UHJvY2Vzc29yIH0gZnJvbSBcIi4vdGV4dFByZVByb2Nlc3NvclwiO1xuXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50UXVlc3Rpb25KU09OIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcsIHB1YmxpYyBqc29uOiBhbnkpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgICAgIG5hbWUsXG4gICAgICBbXSxcbiAgICAgIGZ1bmN0aW9uIChqc29uOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIENvbXBvbmVudENvbGxlY3Rpb24uSW5zdGFuY2UuY3JlYXRlUXVlc3Rpb24oXG4gICAgICAgICAgISFqc29uID8ganNvbi5uYW1lIDogXCJcIixcbiAgICAgICAgICBzZWxmXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgXCJxdWVzdGlvblwiXG4gICAgKTtcbiAgICB0aGlzLm9uSW5pdCgpO1xuICB9XG4gIHB1YmxpYyBvbkluaXQoKSB7XG4gICAgaWYgKCF0aGlzLmpzb24ub25Jbml0KSByZXR1cm47XG4gICAgdGhpcy5qc29uLm9uSW5pdCgpO1xuICB9XG4gIHB1YmxpYyBvbkNyZWF0ZWQocXVlc3Rpb246IFF1ZXN0aW9uKSB7XG4gICAgaWYgKCF0aGlzLmpzb24ub25DcmVhdGVkKSByZXR1cm47XG4gICAgdGhpcy5qc29uLm9uQ3JlYXRlZChxdWVzdGlvbik7XG4gIH1cbiAgcHVibGljIG9uTG9hZGVkKHF1ZXN0aW9uOiBRdWVzdGlvbikge1xuICAgIGlmICghdGhpcy5qc29uLm9uTG9hZGVkKSByZXR1cm47XG4gICAgdGhpcy5qc29uLm9uTG9hZGVkKHF1ZXN0aW9uKTtcbiAgfVxuICBwdWJsaWMgb25BZnRlclJlbmRlcihxdWVzdGlvbjogUXVlc3Rpb24sIGh0bWxFbGVtZW50OiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuanNvbi5vbkFmdGVyUmVuZGVyKSByZXR1cm47XG4gICAgdGhpcy5qc29uLm9uQWZ0ZXJSZW5kZXIocXVlc3Rpb24sIGh0bWxFbGVtZW50KTtcbiAgfVxuICBwdWJsaWMgb25BZnRlclJlbmRlckNvbnRlbnRFbGVtZW50KFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBlbGVtZW50OiBRdWVzdGlvbixcbiAgICBodG1sRWxlbWVudDogYW55XG4gICkge1xuICAgIGlmICghdGhpcy5qc29uLm9uQWZ0ZXJSZW5kZXJDb250ZW50RWxlbWVudCkgcmV0dXJuO1xuICAgIHRoaXMuanNvbi5vbkFmdGVyUmVuZGVyQ29udGVudEVsZW1lbnQocXVlc3Rpb24sIGVsZW1lbnQsIGh0bWxFbGVtZW50KTtcbiAgfVxuICBwdWJsaWMgb25Qcm9wZXJ0eUNoYW5nZWQoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIHByb3BlcnR5TmFtZTogc3RyaW5nLFxuICAgIG5ld1ZhbHVlOiBhbnlcbiAgKSB7XG4gICAgaWYgKCF0aGlzLmpzb24ub25Qcm9wZXJ0eUNoYW5nZWQpIHJldHVybjtcbiAgICB0aGlzLmpzb24ub25Qcm9wZXJ0eUNoYW5nZWQocXVlc3Rpb24sIHByb3BlcnR5TmFtZSwgbmV3VmFsdWUpO1xuICB9XG4gIHB1YmxpYyBvblZhbHVlQ2hhbmdlZChxdWVzdGlvbjogUXVlc3Rpb24sIG5hbWU6IHN0cmluZywgbmV3VmFsdWU6IGFueSkge1xuICAgIGlmICghdGhpcy5qc29uLm9uVmFsdWVDaGFuZ2VkKSByZXR1cm47XG4gICAgdGhpcy5qc29uLm9uVmFsdWVDaGFuZ2VkKHF1ZXN0aW9uLCBuYW1lLCBuZXdWYWx1ZSk7XG4gIH1cbiAgcHVibGljIG9uSXRlbVZhbHVlUHJvcGVydHlDaGFuZ2VkKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBpdGVtOiBJdGVtVmFsdWUsXG4gICAgcHJvcGVydHlOYW1lOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG5ld1ZhbHVlOiBhbnlcbiAgKSB7XG4gICAgaWYgKCF0aGlzLmpzb24ub25JdGVtVmFsdWVQcm9wZXJ0eUNoYW5nZWQpIHJldHVybjtcbiAgICB0aGlzLmpzb24ub25JdGVtVmFsdWVQcm9wZXJ0eUNoYW5nZWQocXVlc3Rpb24sIHtcbiAgICAgIG9iajogaXRlbSxcbiAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIG5ld1ZhbHVlOiBuZXdWYWx1ZSxcbiAgICB9KTtcbiAgfVxuICBwdWJsaWMgZ2V0RGlzcGxheVZhbHVlKGtleUFzVGV4dDogYm9vbGVhbiwgdmFsdWU6IGFueSwgcXVlc3Rpb246IFF1ZXN0aW9uKSB7XG4gICAgaWYgKCF0aGlzLmpzb24uZ2V0RGlzcGxheVZhbHVlKSByZXR1cm4gcXVlc3Rpb24uZ2V0RGlzcGxheVZhbHVlKGtleUFzVGV4dCwgdmFsdWUpO1xuICAgIHJldHVybiB0aGlzLmpzb24uZ2V0RGlzcGxheVZhbHVlKHF1ZXN0aW9uKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzQ29tcG9zaXRlKCkge1xuICAgIHJldHVybiAhIXRoaXMuanNvbi5lbGVtZW50c0pTT04gfHwgISF0aGlzLmpzb24uY3JlYXRlRWxlbWVudHM7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbXBvbmVudENvbGxlY3Rpb24ge1xuICBwdWJsaWMgc3RhdGljIEluc3RhbmNlOiBDb21wb25lbnRDb2xsZWN0aW9uID0gbmV3IENvbXBvbmVudENvbGxlY3Rpb24oKTtcbiAgcHJpdmF0ZSBjdXN0b21RdWVzdGlvblZhbHVlczogQXJyYXk8Q29tcG9uZW50UXVlc3Rpb25KU09OPiA9IFtdO1xuICBwdWJsaWMgb25DcmVhdGVDb21wb3NpdGU6IChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcXVlc3Rpb25KU09OOiBDb21wb25lbnRRdWVzdGlvbkpTT05cbiAgKSA9PiBRdWVzdGlvbkNvbXBvc2l0ZU1vZGVsO1xuICBwdWJsaWMgb25DcmVhdGVDdXN0b206IChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcXVlc3Rpb25KU09OOiBDb21wb25lbnRRdWVzdGlvbkpTT05cbiAgKSA9PiBRdWVzdGlvbkN1c3RvbU1vZGVsO1xuICBwdWJsaWMgb25BZGRpbmdKc29uOiAobmFtZTogc3RyaW5nLCBpc0NvbXBvc2l0ZTogYm9vbGVhbikgPT4gdm9pZDtcbiAgcHVibGljIGFkZChqc29uOiBhbnkpIHtcbiAgICBpZiAoIWpzb24pIHJldHVybjtcbiAgICBsZXQgbmFtZSA9IGpzb24ubmFtZTtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IFwiQXR0cmlidXRlIG5hbWUgaXMgbWlzc2VkXCI7XG4gICAgfVxuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKCEhdGhpcy5nZXRDdXN0b21RdWVzdGlvbkJ5TmFtZShuYW1lKSkge1xuICAgICAgdGhyb3cgXCJUaGVyZSBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgY3VzdG9tIHF1ZXN0aW9uIHdpdGggbmFtZSAnXCIgK1xuICAgICAgbmFtZSArXG4gICAgICBcIidcIjtcbiAgICB9XG4gICAgaWYgKCEhU2VyaWFsaXplci5maW5kQ2xhc3MobmFtZSkpIHtcbiAgICAgIHRocm93IFwiVGhlcmUgaXMgYWxyZWFkeSBjbGFzcyB3aXRoIG5hbWUgJ1wiICsgbmFtZSArIFwiJ1wiO1xuICAgIH1cbiAgICB2YXIgY3VzdG9tUXVlc3Rpb24gPSBuZXcgQ29tcG9uZW50UXVlc3Rpb25KU09OKG5hbWUsIGpzb24pO1xuICAgIGlmICghIXRoaXMub25BZGRpbmdKc29uKVxuICAgICAgdGhpcy5vbkFkZGluZ0pzb24obmFtZSwgY3VzdG9tUXVlc3Rpb24uaXNDb21wb3NpdGUpO1xuICAgIHRoaXMuY3VzdG9tUXVlc3Rpb25WYWx1ZXMucHVzaChjdXN0b21RdWVzdGlvbik7XG4gIH1cbiAgcHVibGljIGdldCBpdGVtcygpOiBBcnJheTxDb21wb25lbnRRdWVzdGlvbkpTT04+IHtcbiAgICByZXR1cm4gdGhpcy5jdXN0b21RdWVzdGlvblZhbHVlcztcbiAgfVxuICBwdWJsaWMgZ2V0Q3VzdG9tUXVlc3Rpb25CeU5hbWUobmFtZTogc3RyaW5nKTogQ29tcG9uZW50UXVlc3Rpb25KU09OIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY3VzdG9tUXVlc3Rpb25WYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmN1c3RvbVF1ZXN0aW9uVmFsdWVzW2ldLm5hbWUgPT0gbmFtZSlcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tUXVlc3Rpb25WYWx1ZXNbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBjbGVhcigpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY3VzdG9tUXVlc3Rpb25WYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIFNlcmlhbGl6ZXIucmVtb3ZlQ2xhc3ModGhpcy5jdXN0b21RdWVzdGlvblZhbHVlc1tpXS5uYW1lKTtcbiAgICB9XG4gICAgdGhpcy5jdXN0b21RdWVzdGlvblZhbHVlcyA9IFtdO1xuICB9XG4gIHB1YmxpYyBjcmVhdGVRdWVzdGlvbihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcXVlc3Rpb25KU09OOiBDb21wb25lbnRRdWVzdGlvbkpTT05cbiAgKTogUXVlc3Rpb24ge1xuICAgIGlmICghIXF1ZXN0aW9uSlNPTi5pc0NvbXBvc2l0ZSlcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUNvbXBvc2l0ZU1vZGVsKG5hbWUsIHF1ZXN0aW9uSlNPTik7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlQ3VzdG9tTW9kZWwobmFtZSwgcXVlc3Rpb25KU09OKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlQ29tcG9zaXRlTW9kZWwoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHF1ZXN0aW9uSlNPTjogQ29tcG9uZW50UXVlc3Rpb25KU09OXG4gICk6IFF1ZXN0aW9uQ29tcG9zaXRlTW9kZWwge1xuICAgIGlmICghIXRoaXMub25DcmVhdGVDb21wb3NpdGUpXG4gICAgICByZXR1cm4gdGhpcy5vbkNyZWF0ZUNvbXBvc2l0ZShuYW1lLCBxdWVzdGlvbkpTT04pO1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25Db21wb3NpdGVNb2RlbChuYW1lLCBxdWVzdGlvbkpTT04pO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVDdXN0b21Nb2RlbChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcXVlc3Rpb25KU09OOiBDb21wb25lbnRRdWVzdGlvbkpTT05cbiAgKTogUXVlc3Rpb25DdXN0b21Nb2RlbCB7XG4gICAgaWYgKCEhdGhpcy5vbkNyZWF0ZUN1c3RvbSkgcmV0dXJuIHRoaXMub25DcmVhdGVDdXN0b20obmFtZSwgcXVlc3Rpb25KU09OKTtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uQ3VzdG9tTW9kZWwobmFtZSwgcXVlc3Rpb25KU09OKTtcbiAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUXVlc3Rpb25DdXN0b21Nb2RlbEJhc2UgZXh0ZW5kcyBRdWVzdGlvblxuICBpbXBsZW1lbnRzIElTdXJ2ZXlJbXBsLCBJU3VydmV5RGF0YSwgSVBhbmVsIHtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBwdWJsaWMgY3VzdG9tUXVlc3Rpb246IENvbXBvbmVudFF1ZXN0aW9uSlNPTikge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLmNyZWF0ZVByb3BlcnRpZXModGhpcyk7XG4gICAgU3VydmV5RWxlbWVudC5DcmVhdGVEaXNhYmxlZERlc2lnbkVsZW1lbnRzID0gdHJ1ZTtcbiAgICB0aGlzLmNyZWF0ZVdyYXBwZXIoKTtcbiAgICBTdXJ2ZXlFbGVtZW50LkNyZWF0ZURpc2FibGVkRGVzaWduRWxlbWVudHMgPSBmYWxzZTtcbiAgICBpZiAoISF0aGlzLmN1c3RvbVF1ZXN0aW9uKSB7XG4gICAgICB0aGlzLmN1c3RvbVF1ZXN0aW9uLm9uQ3JlYXRlZCh0aGlzKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gISF0aGlzLmN1c3RvbVF1ZXN0aW9uID8gdGhpcy5jdXN0b21RdWVzdGlvbi5uYW1lIDogXCJjdXN0b21cIjtcbiAgfVxuICBwdWJsaWMgbG9jU3Ryc0NoYW5nZWQoKSB7XG4gICAgc3VwZXIubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICBpZiAoISF0aGlzLmdldEVsZW1lbnQoKSkge1xuICAgICAgdGhpcy5nZXRFbGVtZW50KCkubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVdyYXBwZXIoKSB7IH1cbiAgcHJvdGVjdGVkIG9uUHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nLCBvbGRWYWx1ZTogYW55LCBuZXdWYWx1ZTogYW55KSB7XG4gICAgc3VwZXIub25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICAgIGlmICghIXRoaXMuY3VzdG9tUXVlc3Rpb24gJiYgIXRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHtcbiAgICAgIHRoaXMuY3VzdG9tUXVlc3Rpb24ub25Qcm9wZXJ0eUNoYW5nZWQodGhpcywgbmFtZSwgbmV3VmFsdWUpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgaXRlbVZhbHVlUHJvcGVydHlDaGFuZ2VkKFxuICAgIGl0ZW06IEl0ZW1WYWx1ZSxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgb2xkVmFsdWU6IGFueSxcbiAgICBuZXdWYWx1ZTogYW55XG4gICkge1xuICAgIHN1cGVyLml0ZW1WYWx1ZVByb3BlcnR5Q2hhbmdlZChpdGVtLCBuYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICAgIGlmICghIXRoaXMuY3VzdG9tUXVlc3Rpb24gJiYgIXRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHtcbiAgICAgIHRoaXMuY3VzdG9tUXVlc3Rpb24ub25JdGVtVmFsdWVQcm9wZXJ0eUNoYW5nZWQoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGl0ZW0sXG4gICAgICAgIGl0ZW0ub3duZXJQcm9wZXJ0eU5hbWUsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIG5ld1ZhbHVlXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgb25GaXJzdFJlbmRlcmluZygpIHtcbiAgICB2YXIgZWwgPSB0aGlzLmdldEVsZW1lbnQoKTtcbiAgICBpZiAoISFlbCkge1xuICAgICAgZWwub25GaXJzdFJlbmRlcmluZygpO1xuICAgIH1cbiAgICBzdXBlci5vbkZpcnN0UmVuZGVyaW5nKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldEVsZW1lbnQoKTogU3VydmV5RWxlbWVudDtcbiAgcHJvdGVjdGVkIGluaXRFbGVtZW50KGVsOiBTdXJ2ZXlFbGVtZW50KSB7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGVsLnNldFN1cnZleUltcGwodGhpcyk7XG4gICAgZWwuZGlzYWJsZURlc2lnbkFjdGlvbnMgPSB0cnVlO1xuICB9XG4gIHB1YmxpYyBzZXRTdXJ2ZXlJbXBsKHZhbHVlOiBJU3VydmV5SW1wbCkge1xuICAgIHN1cGVyLnNldFN1cnZleUltcGwodmFsdWUpO1xuICAgIHRoaXMuaW5pdEVsZW1lbnQodGhpcy5nZXRFbGVtZW50KCkpO1xuICB9XG4gIHB1YmxpYyBvblN1cnZleUxvYWQoKSB7XG4gICAgc3VwZXIub25TdXJ2ZXlMb2FkKCk7XG4gICAgaWYgKCEhdGhpcy5nZXRFbGVtZW50KCkpIHtcbiAgICAgIHRoaXMuZ2V0RWxlbWVudCgpLm9uU3VydmV5TG9hZCgpO1xuICAgICAgdGhpcy5jdXN0b21RdWVzdGlvbi5vbkxvYWRlZCh0aGlzKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGFmdGVyUmVuZGVyUXVlc3Rpb25FbGVtZW50KGVsOiBIVE1MRWxlbWVudCkge1xuICAgIC8vRG8gbm90aGluZ1xuICB9XG4gIHB1YmxpYyBhZnRlclJlbmRlcihlbDogYW55KSB7XG4gICAgc3VwZXIuYWZ0ZXJSZW5kZXIoZWwpO1xuICAgIGlmICghIXRoaXMuY3VzdG9tUXVlc3Rpb24pIHtcbiAgICAgIHRoaXMuY3VzdG9tUXVlc3Rpb24ub25BZnRlclJlbmRlcih0aGlzLCBlbCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBzZXRRdWVzdGlvblZhbHVlKG5ld1ZhbHVlOiBhbnksIHVwZGF0ZUlzQW5zd2VyZWQ6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgc3VwZXIuc2V0UXVlc3Rpb25WYWx1ZShuZXdWYWx1ZSwgdXBkYXRlSXNBbnN3ZXJlZCk7XG4gICAgdGhpcy51cGRhdGVFbGVtZW50Q3NzKCk7XG4gIH1cbiAgcHJvdGVjdGVkIHNldE5ld1ZhbHVlKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBzdXBlci5zZXROZXdWYWx1ZShuZXdWYWx1ZSk7XG4gICAgdGhpcy51cGRhdGVFbGVtZW50Q3NzKCk7XG4gIH1cbiAgLy9JU3VydmV5SW1wbFxuICBnZXRTdXJ2ZXlEYXRhKCk6IElTdXJ2ZXlEYXRhIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvLyBnZXRTdXJ2ZXkoKTogSVN1cnZleSB7XG4gIC8vICAgcmV0dXJuIHRoaXMuc3VydmV5O1xuICAvLyB9XG4gIGdldFRleHRQcm9jZXNzb3IoKTogSVRleHRQcm9jZXNzb3Ige1xuICAgIHJldHVybiB0aGlzLnRleHRQcm9jZXNzb3I7XG4gIH1cbiAgLy9JU3VydmV5RGF0YVxuICBnZXRWYWx1ZShuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICB9XG4gIHNldFZhbHVlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBuZXdWYWx1ZTogYW55LFxuICAgIGxvY05vdGlmaWNhdGlvbjogYW55LFxuICAgIGFsbG93Tm90aWZ5VmFsdWVDaGFuZ2VkPzogYm9vbGVhblxuICApOiBhbnkge1xuICAgIGlmICghdGhpcy5kYXRhKSByZXR1cm47XG4gICAgdmFyIG5ld05hbWUgPSB0aGlzLmNvbnZlcnREYXRhTmFtZShuYW1lKTtcbiAgICB0aGlzLmRhdGEuc2V0VmFsdWUoXG4gICAgICBuZXdOYW1lLFxuICAgICAgdGhpcy5jb252ZXJ0RGF0YVZhbHVlKG5hbWUsIG5ld1ZhbHVlKSxcbiAgICAgIGxvY05vdGlmaWNhdGlvbixcbiAgICAgIGFsbG93Tm90aWZ5VmFsdWVDaGFuZ2VkXG4gICAgKTtcbiAgICB0aGlzLnVwZGF0ZUlzQW5zd2VyZWQoKTtcbiAgICB0aGlzLnVwZGF0ZUVsZW1lbnRDc3MoKTtcbiAgICBpZiAoISF0aGlzLmN1c3RvbVF1ZXN0aW9uKSB7XG4gICAgICB0aGlzLmN1c3RvbVF1ZXN0aW9uLm9uVmFsdWVDaGFuZ2VkKHRoaXMsIG5hbWUsIG5ld1ZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGNvbnZlcnREYXRhTmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFZhbHVlTmFtZSgpO1xuICB9XG4gIHByb3RlY3RlZCBjb252ZXJ0RGF0YVZhbHVlKG5hbWU6IHN0cmluZywgbmV3VmFsdWU6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIG5ld1ZhbHVlO1xuICB9XG4gIGdldFZhcmlhYmxlKG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuICEhdGhpcy5kYXRhID8gdGhpcy5kYXRhLmdldFZhcmlhYmxlKG5hbWUpIDogbnVsbDtcbiAgfVxuICBzZXRWYXJpYWJsZShuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGF0YSkgcmV0dXJuO1xuICAgIHRoaXMuZGF0YS5zZXRWYXJpYWJsZShuYW1lLCBuZXdWYWx1ZSk7XG4gIH1cbiAgZ2V0Q29tbWVudChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAhIXRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRDb21tZW50KHRoaXMuZ2V0VmFsdWVOYW1lKCkpIDogXCJcIjtcbiAgfVxuICBzZXRDb21tZW50KG5hbWU6IHN0cmluZywgbmV3VmFsdWU6IHN0cmluZywgbG9jTm90aWZpY2F0aW9uOiBhbnkpOiBhbnkge1xuICAgIGlmICghdGhpcy5kYXRhKSByZXR1cm47XG4gICAgdGhpcy5kYXRhLnNldENvbW1lbnQodGhpcy5nZXRWYWx1ZU5hbWUoKSwgbmV3VmFsdWUsIGxvY05vdGlmaWNhdGlvbik7XG4gIH1cbiAgZ2V0QWxsVmFsdWVzKCk6IGFueSB7XG4gICAgcmV0dXJuICEhdGhpcy5kYXRhID8gdGhpcy5kYXRhLmdldEFsbFZhbHVlcygpIDoge307XG4gIH1cbiAgZ2V0RmlsdGVyZWRWYWx1ZXMoKTogYW55IHtcbiAgICByZXR1cm4gISF0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0RmlsdGVyZWRWYWx1ZXMoKSA6IHt9O1xuICB9XG4gIGdldEZpbHRlcmVkUHJvcGVydGllcygpOiBhbnkge1xuICAgIHJldHVybiAhIXRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRGaWx0ZXJlZFByb3BlcnRpZXMoKSA6IHt9O1xuICB9XG4gIC8vSVBhbmVsXG4gIGFkZEVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQsIGluZGV4OiBudW1iZXIpIHsgfVxuICByZW1vdmVFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGdldFF1ZXN0aW9uVGl0bGVMb2NhdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImxlZnRcIjtcbiAgfVxuICBnZXRRdWVzdGlvblN0YXJ0SW5kZXgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdGFydEluZGV4KCk7XG4gIH1cbiAgZ2V0Q2hpbGRyZW5MYXlvdXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwicm93XCI7XG4gIH1cbiAgZWxlbWVudFdpZHRoQ2hhbmdlZChlbDogSUVsZW1lbnQpIHsgfVxuICBnZXQgZWxlbWVudHMoKTogQXJyYXk8SUVsZW1lbnQ+IHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgaW5kZXhPZihlbDogSUVsZW1lbnQpOiBudW1iZXIge1xuICAgIHJldHVybiAtMTtcbiAgfVxuICBlbnN1cmVSb3dzVmlzaWJpbGl0eSgpOiB2b2lkIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbiAgcHJvdGVjdGVkIGdldENvbnRlbnREaXNwbGF5VmFsdWVDb3JlKGtleUFzVGV4dDogYm9vbGVhbiwgdmFsdWU6IGFueSwgcXVlc3Rpb246IFF1ZXN0aW9uKTogYW55IHtcbiAgICBpZiAoIXF1ZXN0aW9uKSByZXR1cm4gc3VwZXIuZ2V0RGlzcGxheVZhbHVlQ29yZShrZXlBc1RleHQsIHZhbHVlKTtcbiAgICByZXR1cm4gdGhpcy5jdXN0b21RdWVzdGlvbi5nZXREaXNwbGF5VmFsdWUoa2V5QXNUZXh0LCB2YWx1ZSwgcXVlc3Rpb24pO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkN1c3RvbU1vZGVsIGV4dGVuZHMgUXVlc3Rpb25DdXN0b21Nb2RlbEJhc2Uge1xuICBwcml2YXRlIHF1ZXN0aW9uV3JhcHBlcjogUXVlc3Rpb247XG4gIHB1YmxpYyBnZXRUZW1wbGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImN1c3RvbVwiO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVXcmFwcGVyKCkge1xuICAgIHRoaXMucXVlc3Rpb25XcmFwcGVyID0gdGhpcy5jcmVhdGVRdWVzdGlvbigpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRFbGVtZW50KCk6IFN1cnZleUVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmNvbnRlbnRRdWVzdGlvbjtcbiAgfVxuICBvbkFueVZhbHVlQ2hhbmdlZChuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlci5vbkFueVZhbHVlQ2hhbmdlZChuYW1lKTtcbiAgICBpZiAoISF0aGlzLmNvbnRlbnRRdWVzdGlvbikge1xuICAgICAgdGhpcy5jb250ZW50UXVlc3Rpb24ub25BbnlWYWx1ZUNoYW5nZWQobmFtZSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBoYXNFcnJvcnMoZmlyZUNhbGxiYWNrOiBib29sZWFuID0gdHJ1ZSwgcmVjOiBhbnkgPSBudWxsKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRRdWVzdGlvbikgcmV0dXJuIGZhbHNlO1xuICAgIHZhciByZXMgPSB0aGlzLmNvbnRlbnRRdWVzdGlvbi5oYXNFcnJvcnMoZmlyZUNhbGxiYWNrLCByZWMpO1xuICAgIHRoaXMuZXJyb3JzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbnRlbnRRdWVzdGlvbi5lcnJvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuZXJyb3JzLnB1c2godGhpcy5jb250ZW50UXVlc3Rpb24uZXJyb3JzW2ldKTtcbiAgICB9XG4gICAgaWYgKCFyZXMpIHtcbiAgICAgIHJlcyA9IHN1cGVyLmhhc0Vycm9ycyhmaXJlQ2FsbGJhY2ssIHJlYyk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlRWxlbWVudENzcygpO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGZvY3VzKG9uRXJyb3I6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGlmICghIXRoaXMuY29udGVudFF1ZXN0aW9uKSB7XG4gICAgICB0aGlzLmNvbnRlbnRRdWVzdGlvbi5mb2N1cyhvbkVycm9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3VwZXIuZm9jdXMob25FcnJvcik7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgY29udGVudFF1ZXN0aW9uKCk6IFF1ZXN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbldyYXBwZXI7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVF1ZXN0aW9uKCk6IFF1ZXN0aW9uIHtcbiAgICB2YXIganNvbiA9IHRoaXMuY3VzdG9tUXVlc3Rpb24uanNvbjtcbiAgICB2YXIgcmVzID0gbnVsbDtcbiAgICBpZiAoISFqc29uLnF1ZXN0aW9uSlNPTikge1xuICAgICAgdmFyIHFUeXBlID0ganNvbi5xdWVzdGlvbkpTT04udHlwZTtcbiAgICAgIGlmICghcVR5cGUgfHwgIVNlcmlhbGl6ZXIuZmluZENsYXNzKHFUeXBlKSlcbiAgICAgICAgdGhyb3cgXCJ0eXBlIGF0dHJpYnV0ZSBpbiBxdWVzdGlvbkpTT04gaXMgZW1wdHkgb3IgaW5jb3JyZWN0XCI7XG4gICAgICByZXMgPSA8UXVlc3Rpb24+U2VyaWFsaXplci5jcmVhdGVDbGFzcyhxVHlwZSk7XG4gICAgICB0aGlzLmluaXRFbGVtZW50KHJlcyk7XG4gICAgICByZXMuZnJvbUpTT04oanNvbi5xdWVzdGlvbkpTT04pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoISFqc29uLmNyZWF0ZVF1ZXN0aW9uKSB7XG4gICAgICAgIHJlcyA9IGpzb24uY3JlYXRlUXVlc3Rpb24oKTtcbiAgICAgICAgdGhpcy5pbml0RWxlbWVudChyZXMpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoISFyZXMgJiYgIXJlcy5uYW1lKSB7XG4gICAgICByZXMubmFtZSA9IFwicXVlc3Rpb25cIjtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgb25TdXJ2ZXlMb2FkKCkge1xuICAgIHN1cGVyLm9uU3VydmV5TG9hZCgpO1xuICAgIGlmICghdGhpcy5jb250ZW50UXVlc3Rpb24pIHJldHVybjtcbiAgICBpZiAodGhpcy5pc0VtcHR5KCkgJiYgIXRoaXMuY29udGVudFF1ZXN0aW9uLmlzRW1wdHkoKSkge1xuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuY29udGVudFF1ZXN0aW9uLnZhbHVlO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgcnVuQ29uZGl0aW9uKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgc3VwZXIucnVuQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgaWYgKCEhdGhpcy5jb250ZW50UXVlc3Rpb24pIHtcbiAgICAgIHRoaXMuY29udGVudFF1ZXN0aW9uLnJ1bkNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgY29udmVydERhdGFOYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRRdWVzdGlvbikgcmV0dXJuIHN1cGVyLmNvbnZlcnREYXRhTmFtZShuYW1lKTtcbiAgICB2YXIgbmV3TmFtZSA9IG5hbWUucmVwbGFjZShcbiAgICAgIHRoaXMuY29udGVudFF1ZXN0aW9uLmdldFZhbHVlTmFtZSgpLFxuICAgICAgdGhpcy5nZXRWYWx1ZU5hbWUoKVxuICAgICk7XG4gICAgcmV0dXJuIG5ld05hbWUuaW5kZXhPZih0aGlzLmdldFZhbHVlTmFtZSgpKSA9PSAwXG4gICAgICA/IG5ld05hbWVcbiAgICAgIDogc3VwZXIuY29udmVydERhdGFOYW1lKG5hbWUpO1xuICB9XG4gIHByb3RlY3RlZCBjb252ZXJ0RGF0YVZhbHVlKG5hbWU6IHN0cmluZywgbmV3VmFsdWU6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuY29udmVydERhdGFOYW1lKG5hbWUpID09IHN1cGVyLmNvbnZlcnREYXRhTmFtZShuYW1lKVxuICAgICAgPyB0aGlzLmNvbnRlbnRRdWVzdGlvbi52YWx1ZVxuICAgICAgOiBuZXdWYWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0UXVlc3Rpb25WYWx1ZShuZXdWYWx1ZTogYW55LCB1cGRhdGVJc0Fuc3dlcmVkOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIHN1cGVyLnNldFF1ZXN0aW9uVmFsdWUobmV3VmFsdWUsIHVwZGF0ZUlzQW5zd2VyZWQpO1xuICAgIGlmIChcbiAgICAgICEhdGhpcy5jb250ZW50UXVlc3Rpb24gJiZcbiAgICAgICF0aGlzLmlzVHdvVmFsdWVFcXVhbHModGhpcy5jb250ZW50UXVlc3Rpb24udmFsdWUsIG5ld1ZhbHVlKVxuICAgICkge1xuICAgICAgdGhpcy5jb250ZW50UXVlc3Rpb24udmFsdWUgPSB0aGlzLmdldFVuYmluZFZhbHVlKG5ld1ZhbHVlKTtcbiAgICB9XG4gIH1cbiAgb25TdXJ2ZXlWYWx1ZUNoYW5nZWQobmV3VmFsdWU6IGFueSkge1xuICAgIHN1cGVyLm9uU3VydmV5VmFsdWVDaGFuZ2VkKG5ld1ZhbHVlKTtcbiAgICBpZiAoISF0aGlzLmNvbnRlbnRRdWVzdGlvbikge1xuICAgICAgdGhpcy5jb250ZW50UXVlc3Rpb24ub25TdXJ2ZXlWYWx1ZUNoYW5nZWQobmV3VmFsdWUpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgZ2V0VmFsdWVDb3JlKCkge1xuICAgIGlmICghIXRoaXMuY29udGVudFF1ZXN0aW9uKSByZXR1cm4gdGhpcy5jb250ZW50UXVlc3Rpb24udmFsdWU7XG4gICAgcmV0dXJuIHN1cGVyLmdldFZhbHVlQ29yZSgpO1xuICB9XG4gIHByb3RlY3RlZCBpbml0RWxlbWVudChlbDogU3VydmV5RWxlbWVudCkge1xuICAgIHN1cGVyLmluaXRFbGVtZW50KGVsKTtcbiAgICBpZiAoISFlbCkge1xuICAgICAgKDxRdWVzdGlvbj5lbCkucGFyZW50ID0gdGhpcztcbiAgICAgICg8UXVlc3Rpb24+ZWwpLmFmdGVyUmVuZGVyUXVlc3Rpb25DYWxsYmFjayA9IChcbiAgICAgICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgICAgICBlbGVtZW50OiBhbnlcbiAgICAgICkgPT4ge1xuICAgICAgICBpZiAoISF0aGlzLmN1c3RvbVF1ZXN0aW9uKSB7XG4gICAgICAgICAgdGhpcy5jdXN0b21RdWVzdGlvbi5vbkFmdGVyUmVuZGVyQ29udGVudEVsZW1lbnQoXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgcXVlc3Rpb24sXG4gICAgICAgICAgICBlbGVtZW50XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZUVsZW1lbnRDc3NDb3JlKGNzc0NsYXNzZXM6IGFueSkge1xuICAgIGlmICghIXRoaXMuY29udGVudFF1ZXN0aW9uKSB7XG4gICAgICBjc3NDbGFzc2VzID0gdGhpcy5jb250ZW50UXVlc3Rpb24uY3NzQ2xhc3NlcztcbiAgICB9XG4gICAgc3VwZXIudXBkYXRlRWxlbWVudENzc0NvcmUoY3NzQ2xhc3Nlcyk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERpc3BsYXlWYWx1ZUNvcmUoa2V5QXNUZXh0OiBib29sZWFuLCB2YWx1ZTogYW55KTogYW55IHtcbiAgICByZXR1cm4gc3VwZXIuZ2V0Q29udGVudERpc3BsYXlWYWx1ZUNvcmUoa2V5QXNUZXh0LCB2YWx1ZSwgdGhpcy5jb250ZW50UXVlc3Rpb24pO1xuICB9XG59XG5cbmNsYXNzIFF1ZXN0aW9uQ29tcG9zaXRlVGV4dFByb2Nlc3NvciBleHRlbmRzIFF1ZXN0aW9uVGV4dFByb2Nlc3NvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBjb21wb3NpdGU6IFF1ZXN0aW9uQ29tcG9zaXRlTW9kZWwsXG4gICAgcHJvdGVjdGVkIHZhcmlhYmxlTmFtZTogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHZhcmlhYmxlTmFtZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBzdXJ2ZXkoKTogSVN1cnZleSB7XG4gICAgcmV0dXJuIHRoaXMuY29tcG9zaXRlLnN1cnZleTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IHBhbmVsKCk6IFBhbmVsTW9kZWwge1xuICAgIHJldHVybiB0aGlzLmNvbXBvc2l0ZS5jb250ZW50UGFuZWw7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uQ29tcG9zaXRlTW9kZWwgZXh0ZW5kcyBRdWVzdGlvbkN1c3RvbU1vZGVsQmFzZSB7XG4gIHB1YmxpYyBzdGF0aWMgSXRlbVZhcmlhYmxlTmFtZSA9IFwiY29tcG9zaXRlXCI7XG4gIHByaXZhdGUgcGFuZWxXcmFwcGVyOiBQYW5lbE1vZGVsO1xuICBwcml2YXRlIHRleHRQcm9jZXNzaW5nOiBRdWVzdGlvbkNvbXBvc2l0ZVRleHRQcm9jZXNzb3I7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgcHVibGljIGN1c3RvbVF1ZXN0aW9uOiBDb21wb25lbnRRdWVzdGlvbkpTT04pIHtcbiAgICBzdXBlcihuYW1lLCBjdXN0b21RdWVzdGlvbik7XG4gICAgdGhpcy50ZXh0UHJvY2Vzc2luZyA9IG5ldyBRdWVzdGlvbkNvbXBvc2l0ZVRleHRQcm9jZXNzb3IoXG4gICAgICB0aGlzLFxuICAgICAgUXVlc3Rpb25Db21wb3NpdGVNb2RlbC5JdGVtVmFyaWFibGVOYW1lXG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlV3JhcHBlcigpIHtcbiAgICB0aGlzLnBhbmVsV3JhcHBlciA9IHRoaXMuY3JlYXRlUGFuZWwoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VGVtcGxhdGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJjb21wb3NpdGVcIjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Q3NzVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImNvbXBvc2l0ZVwiO1xuICB9XG4gIHByb3RlY3RlZCBnZXRFbGVtZW50KCk6IFN1cnZleUVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmNvbnRlbnRQYW5lbDtcbiAgfVxuICBwdWJsaWMgZ2V0IGNvbnRlbnRQYW5lbCgpOiBQYW5lbE1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5wYW5lbFdyYXBwZXI7XG4gIH1cbiAgcHVibGljIGhhc0Vycm9ycyhmaXJlQ2FsbGJhY2s6IGJvb2xlYW4gPSB0cnVlLCByZWM6IGFueSA9IG51bGwpOiBib29sZWFuIHtcbiAgICB2YXIgcmVzID0gc3VwZXIuaGFzRXJyb3JzKGZpcmVDYWxsYmFjaywgcmVjKTtcbiAgICBpZiAoIXRoaXMuY29udGVudFBhbmVsKSByZXR1cm4gcmVzO1xuICAgIHJldHVybiB0aGlzLmNvbnRlbnRQYW5lbC5oYXNFcnJvcnMoZmlyZUNhbGxiYWNrLCBmYWxzZSwgcmVjKSB8fCByZXM7XG4gIH1cbiAgcHVibGljIHVwZGF0ZUVsZW1lbnRDc3MocmVOZXc/OiBib29sZWFuKSB7XG4gICAgc3VwZXIudXBkYXRlRWxlbWVudENzcyhyZU5ldyk7XG4gICAgaWYgKHRoaXMuY29udGVudFBhbmVsKSB7XG4gICAgICB0aGlzLmNvbnRlbnRQYW5lbC51cGRhdGVFbGVtZW50Q3NzKHJlTmV3KTtcbiAgICB9XG4gIH1cbiAgZ2V0VGV4dFByb2Nlc3NvcigpOiBJVGV4dFByb2Nlc3NvciB7XG4gICAgcmV0dXJuIHRoaXMudGV4dFByb2Nlc3Npbmc7XG4gIH1cbiAgY2xlYXJWYWx1ZUlmSW52aXNpYmxlKCkge1xuICAgIHN1cGVyLmNsZWFyVmFsdWVJZkludmlzaWJsZSgpO1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmNvbnRlbnRQYW5lbC5xdWVzdGlvbnM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXN0aW9uc1tpXS5jbGVhclZhbHVlSWZJbnZpc2libGUoKTtcbiAgICB9XG4gIH1cbiAgb25BbnlWYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIub25BbnlWYWx1ZUNoYW5nZWQobmFtZSk7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuY29udGVudFBhbmVsLnF1ZXN0aW9ucztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgcXVlc3Rpb25zW2ldLm9uQW55VmFsdWVDaGFuZ2VkKG5hbWUpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlUGFuZWwoKTogUGFuZWxNb2RlbCB7XG4gICAgdmFyIHJlcyA9IDxQYW5lbE1vZGVsPlNlcmlhbGl6ZXIuY3JlYXRlQ2xhc3MoXCJwYW5lbFwiKTtcbiAgICByZXMuc2hvd1F1ZXN0aW9uTnVtYmVycyA9IFwib2ZmXCI7XG4gICAgcmVzLnJlbmRlcldpZHRoID0gXCIxMDAlXCI7XG4gICAgdmFyIGpzb24gPSB0aGlzLmN1c3RvbVF1ZXN0aW9uLmpzb247XG4gICAgaWYgKCEhanNvbi5lbGVtZW50c0pTT04pIHtcbiAgICAgIHJlcy5mcm9tSlNPTih7IGVsZW1lbnRzOiBqc29uLmVsZW1lbnRzSlNPTiB9KTtcbiAgICB9XG4gICAgaWYgKCEhanNvbi5jcmVhdGVFbGVtZW50cykge1xuICAgICAganNvbi5jcmVhdGVFbGVtZW50cyhyZXMsIHRoaXMpO1xuICAgIH1cbiAgICB0aGlzLmluaXRFbGVtZW50KHJlcyk7XG4gICAgcmVzLnJlYWRPbmx5ID0gdGhpcy5pc1JlYWRPbmx5O1xuICAgIHRoaXMuc2V0QWZ0ZXJSZW5kZXJDYWxsYmFja3MocmVzKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByb3RlY3RlZCBvblJlYWRPbmx5Q2hhbmdlZCgpIHtcbiAgICBpZiAoISF0aGlzLmNvbnRlbnRQYW5lbCkge1xuICAgICAgdGhpcy5jb250ZW50UGFuZWwucmVhZE9ubHkgPSB0aGlzLmlzUmVhZE9ubHk7XG4gICAgfVxuICAgIHN1cGVyLm9uUmVhZE9ubHlDaGFuZ2VkKCk7XG4gIH1cbiAgcHVibGljIG9uU3VydmV5TG9hZCgpIHtcbiAgICBpZiAoISF0aGlzLmNvbnRlbnRQYW5lbCkge1xuICAgICAgdGhpcy5jb250ZW50UGFuZWwucmVhZE9ubHkgPSB0aGlzLmlzUmVhZE9ubHk7XG4gICAgICB0aGlzLnNldElzQ29udGVudEVsZW1lbnQodGhpcy5jb250ZW50UGFuZWwpO1xuICAgIH1cbiAgICBzdXBlci5vblN1cnZleUxvYWQoKTtcbiAgICBpZighIXRoaXMuY29udGVudFBhbmVsKSB7XG4gICAgICBjb25zdCB2YWwgPSB0aGlzLmNvbnRlbnRQYW5lbC5nZXRWYWx1ZSgpO1xuICAgICAgaWYoIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHZhbCkpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBzZXRJc0NvbnRlbnRFbGVtZW50KHBhbmVsOiBQYW5lbE1vZGVsKSB7XG4gICAgcGFuZWwuaXNDb250ZW50RWxlbWVudCA9IHRydWU7XG4gICAgdmFyIGVsZW1lbnRzID0gcGFuZWwuZWxlbWVudHM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsID0gZWxlbWVudHNbaV07XG4gICAgICBpZiAoZWwuaXNQYW5lbCkge1xuICAgICAgICB0aGlzLnNldElzQ29udGVudEVsZW1lbnQoPFBhbmVsTW9kZWw+ZWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgKDxRdWVzdGlvbj5lbCkuaXNDb250ZW50RWxlbWVudCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBzZXRWaXNpYmxlSW5kZXgodmFsOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHZhciByZXMgPSBzdXBlci5zZXRWaXNpYmxlSW5kZXgodmFsKTtcbiAgICBpZiAodGhpcy5pc1Zpc2libGUgJiYgISF0aGlzLmNvbnRlbnRQYW5lbCkge1xuICAgICAgcmVzICs9IHRoaXMuY29udGVudFBhbmVsLnNldFZpc2libGVJbmRleCh2YWwpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBydW5Db25kaXRpb24odmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICBzdXBlci5ydW5Db25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICBpZiAoISF0aGlzLmNvbnRlbnRQYW5lbCkge1xuICAgICAgdmFyIG9sZENvbXBvc2l0ZSA9IHZhbHVlc1tRdWVzdGlvbkNvbXBvc2l0ZU1vZGVsLkl0ZW1WYXJpYWJsZU5hbWVdO1xuICAgICAgdmFsdWVzW1xuICAgICAgICBRdWVzdGlvbkNvbXBvc2l0ZU1vZGVsLkl0ZW1WYXJpYWJsZU5hbWVcbiAgICAgIF0gPSB0aGlzLmNvbnRlbnRQYW5lbC5nZXRWYWx1ZSgpO1xuICAgICAgdGhpcy5jb250ZW50UGFuZWwucnVuQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgICBkZWxldGUgdmFsdWVzW1F1ZXN0aW9uQ29tcG9zaXRlTW9kZWwuSXRlbVZhcmlhYmxlTmFtZV07XG4gICAgICBpZiAoISFvbGRDb21wb3NpdGUpIHtcbiAgICAgICAgdmFsdWVzW1F1ZXN0aW9uQ29tcG9zaXRlTW9kZWwuSXRlbVZhcmlhYmxlTmFtZV0gPSBvbGRDb21wb3NpdGU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGdldFZhbHVlKG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgcmV0dXJuICEhdmFsID8gdmFsW25hbWVdIDogbnVsbDtcbiAgfVxuICBwcml2YXRlIHNldHRpbmdOZXdWYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBzZXRWYWx1ZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgbmV3VmFsdWU6IGFueSxcbiAgICBsb2NOb3RpZmljYXRpb246IGFueSxcbiAgICBhbGxvd05vdGlmeVZhbHVlQ2hhbmdlZD86IGJvb2xlYW5cbiAgKTogYW55IHtcbiAgICBpZiAodGhpcy5zZXR0aW5nTmV3VmFsdWUpIHJldHVybjtcbiAgICBzdXBlci5zZXRWYWx1ZShuYW1lLCBuZXdWYWx1ZSwgbG9jTm90aWZpY2F0aW9uLCBhbGxvd05vdGlmeVZhbHVlQ2hhbmdlZCk7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRQYW5lbCkgcmV0dXJuO1xuICAgIHZhciBxID0gdGhpcy5jb250ZW50UGFuZWwuZ2V0UXVlc3Rpb25CeU5hbWUobmFtZSk7XG4gICAgaWYgKCEhcSAmJiAhdGhpcy5pc1R3b1ZhbHVlRXF1YWxzKG5ld1ZhbHVlLCBxLnZhbHVlKSkge1xuICAgICAgdGhpcy5zZXR0aW5nTmV3VmFsdWUgPSB0cnVlO1xuICAgICAgcS52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgdGhpcy5zZXR0aW5nTmV3VmFsdWUgPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGFkZENvbmRpdGlvbk9iamVjdHNCeUNvbnRleHQoXG4gICAgb2JqZWN0czogQXJyYXk8SUNvbmRpdGlvbk9iamVjdD4sXG4gICAgY29udGV4dDogYW55XG4gICkge1xuICAgIGlmICghdGhpcy5jb250ZW50UGFuZWwpIHJldHVybjtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5jb250ZW50UGFuZWwucXVlc3Rpb25zO1xuICAgIHZhciBwcmVmaXhOYW1lID0gdGhpcy5uYW1lO1xuICAgIHZhciBwcmVmaXhUZXh0ID0gdGhpcy50aXRsZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgb2JqZWN0cy5wdXNoKHtcbiAgICAgICAgbmFtZTogcHJlZml4TmFtZSArIFwiLlwiICsgcXVlc3Rpb25zW2ldLm5hbWUsXG4gICAgICAgIHRleHQ6IHByZWZpeFRleHQgKyBcIi5cIiArIHF1ZXN0aW9uc1tpXS50aXRsZSxcbiAgICAgICAgcXVlc3Rpb246IHF1ZXN0aW9uc1tpXSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgY29udmVydERhdGFWYWx1ZShuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpOiBhbnkge1xuICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICAgIGlmICghdmFsKSB2YWwgPSB7fTtcbiAgICBpZiAodGhpcy5pc1ZhbHVlRW1wdHkobmV3VmFsdWUpICYmICF0aGlzLmlzRWRpdGluZ1N1cnZleUVsZW1lbnQpIHtcbiAgICAgIGRlbGV0ZSB2YWxbbmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbFtuYW1lXSA9IG5ld1ZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIHByb3RlY3RlZCBzZXRRdWVzdGlvblZhbHVlKG5ld1ZhbHVlOiBhbnksIHVwZGF0ZUlzQW5zd2VyZWQ6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgc3VwZXIuc2V0UXVlc3Rpb25WYWx1ZShuZXdWYWx1ZSwgdXBkYXRlSXNBbnN3ZXJlZCk7XG4gICAgdGhpcy5zZXR0aW5nTmV3VmFsdWUgPSB0cnVlO1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmNvbnRlbnRQYW5lbC5xdWVzdGlvbnM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBxdWVzdGlvbnNbaV0uZ2V0VmFsdWVOYW1lKCk7XG4gICAgICBxdWVzdGlvbnNbaV0udmFsdWUgPSAhIW5ld1ZhbHVlID8gbmV3VmFsdWVba2V5XSA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdGhpcy5zZXR0aW5nTmV3VmFsdWUgPSBmYWxzZTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGlzcGxheVZhbHVlQ29yZShrZXlBc1RleHQ6IGJvb2xlYW4sIHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiBzdXBlci5nZXRDb250ZW50RGlzcGxheVZhbHVlQ29yZShrZXlBc1RleHQsIHZhbHVlLCA8YW55PnRoaXMuY29udGVudFBhbmVsKTtcbiAgfVxuICBwcml2YXRlIHNldEFmdGVyUmVuZGVyQ2FsbGJhY2tzKHBhbmVsOiBQYW5lbE1vZGVsKSB7XG4gICAgaWYgKCFwYW5lbCB8fCAhdGhpcy5jdXN0b21RdWVzdGlvbikgcmV0dXJuO1xuICAgIHZhciBxdWVzdGlvbnMgPSBwYW5lbC5xdWVzdGlvbnM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXN0aW9uc1tpXS5hZnRlclJlbmRlclF1ZXN0aW9uQ2FsbGJhY2sgPSAoXG4gICAgICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICAgICAgZWxlbWVudDogYW55XG4gICAgICApID0+IHtcbiAgICAgICAgdGhpcy5jdXN0b21RdWVzdGlvbi5vbkFmdGVyUmVuZGVyQ29udGVudEVsZW1lbnQoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBxdWVzdGlvbixcbiAgICAgICAgICBlbGVtZW50XG4gICAgICAgICk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25TZWxlY3RCYXNlIH0gZnJvbSBcIi4vcXVlc3Rpb25fYmFzZXNlbGVjdFwiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4vaXRlbXZhbHVlXCI7XG5pbXBvcnQgeyBDc3NDbGFzc0J1aWxkZXIgfSBmcm9tIFwiLi91dGlscy9jc3NDbGFzc0J1aWxkZXJcIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIGRyb3Bkb3duIHF1ZXN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkRyb3Bkb3duTW9kZWwgZXh0ZW5kcyBRdWVzdGlvblNlbGVjdEJhc2Uge1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwib3B0aW9uc0NhcHRpb25cIiwgdGhpcyk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydGllc1ZhbHVlQ2hhbmdlZChcbiAgICAgIFtcImNob2ljZXNNaW5cIiwgXCJjaG9pY2VzTWF4XCIsIFwiY2hvaWNlc1N0ZXBcIl0sXG4gICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZi5vblZpc2libGVDaG9pY2VzQ2hhbmdlZCgpO1xuICAgICAgfVxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIFRoaXMgZmxhZyBjb250cm9scyB3aGV0aGVyIHRvIHNob3cgb3B0aW9ucyBjYXB0aW9uIGl0ZW0gKCdDaG9vc2UuLi4nKS5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd09wdGlvbnNDYXB0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93T3B0aW9uc0NhcHRpb25cIik7XG4gIH1cbiAgcHVibGljIHNldCBzaG93T3B0aW9uc0NhcHRpb24odmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd09wdGlvbnNDYXB0aW9uXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIHNldCB0aGUgb3B0aW9ucyBjYXB0aW9uIGRpZmZlcmVudCBmcm9tIHRoZSBkZWZhdWx0IHZhbHVlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0YWtlbiBmcm9tIGxvY2FsaXphdGlvbiBzdHJpbmdzLlxuICAgKi9cbiAgcHVibGljIGdldCBvcHRpb25zQ2FwdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcIm9wdGlvbnNDYXB0aW9uXCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwib3B0aW9uc0NhcHRpb25cIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgb3B0aW9uc0NhcHRpb24odmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm9wdGlvbnNDYXB0aW9uXCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY09wdGlvbnNDYXB0aW9uKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcIm9wdGlvbnNDYXB0aW9uXCIpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZHJvcGRvd25cIjtcbiAgfVxuICBwdWJsaWMgZ2V0IHNlbGVjdGVkSXRlbSgpOiBJdGVtVmFsdWUge1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIEl0ZW1WYWx1ZS5nZXRJdGVtQnlWYWx1ZSh0aGlzLnZpc2libGVDaG9pY2VzLCB0aGlzLnZhbHVlKTtcbiAgfVxuICBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcml2YXRlIG1pbk1heENob2ljZXMgPSA8QXJyYXk8SXRlbVZhbHVlPj5bXTtcbiAgcHJvdGVjdGVkIGdldENob2ljZXMoKTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgdmFyIGl0ZW1zID0gc3VwZXIuZ2V0Q2hvaWNlcygpO1xuICAgIGlmICh0aGlzLmNob2ljZXNNYXggPD0gdGhpcy5jaG9pY2VzTWluKSByZXR1cm4gaXRlbXM7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlcy5wdXNoKGl0ZW1zW2ldKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdGhpcy5taW5NYXhDaG9pY2VzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgdGhpcy5taW5NYXhDaG9pY2VzLmxlbmd0aCAhPT1cbiAgICAgICAgKHRoaXMuY2hvaWNlc01heCAtIHRoaXMuY2hvaWNlc01pbikgLyB0aGlzLmNob2ljZXNTdGVwICsgMVxuICAgICkge1xuICAgICAgdGhpcy5taW5NYXhDaG9pY2VzID0gW107XG4gICAgICBmb3IgKFxuICAgICAgICB2YXIgaSA9IHRoaXMuY2hvaWNlc01pbjtcbiAgICAgICAgaSA8PSB0aGlzLmNob2ljZXNNYXg7XG4gICAgICAgIGkgKz0gdGhpcy5jaG9pY2VzU3RlcFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMubWluTWF4Q2hvaWNlcy5wdXNoKG5ldyBJdGVtVmFsdWUoaSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXMgPSByZXMuY29uY2F0KHRoaXMubWluTWF4Q2hvaWNlcyk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgYW5kIGNob2ljZXNNYXggcHJvcGVydHkgdG8gYXV0b21hdGljYWxseSBhZGQgY2hvaWNlcy4gRm9yIGV4YW1wbGUgY2hvaWNlc01pbiA9IDEgYW5kIGNob2ljZXNNYXggPSAxMCB3aWxsIGdlbmVyYXRlIHRlbiBhZGRpdGlvbmFsIGNob2ljZXMgZnJvbSAxIHRvIDEwLlxuICAgKiBAc2VlIGNob2ljZXNNYXhcbiAgICogQHNlZSBjaG9pY2VzU3RlcFxuICAgKi9cbiAgcHVibGljIGdldCBjaG9pY2VzTWluKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNNaW5cIik7XG4gIH1cbiAgcHVibGljIHNldCBjaG9pY2VzTWluKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY2hvaWNlc01pblwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBhbmQgY2hvaWNlc01heCBwcm9wZXJ0eSB0byBhdXRvbWF0aWNhbGx5IGFkZCBjaG9pY2VzLiBGb3IgZXhhbXBsZSBjaG9pY2VzTWluID0gMSBhbmQgY2hvaWNlc01heCA9IDEwIHdpbGwgZ2VuZXJhdGUgdGVuIGFkZGl0aW9uYWwgY2hvaWNlcyBmcm9tIDEgdG8gMTAuXG4gICAqIEBzZWUgY2hvaWNlc01pblxuICAgKiBAc2VlIGNob2ljZXNTdGVwXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNob2ljZXNNYXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY2hvaWNlc01heFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNob2ljZXNNYXgodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzTWF4XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDEuIEl0IHRlbGxzIHRoZSB2YWx1ZSBvZiB0aGUgaXRlcmF0b3IgYmV0d2VlbiBjaG9pY2VzTWluIGFuZCBjaG9pY2VzTWF4IHByb3BlcnRpZXMuXG4gICAqIElmIGNob2ljZXNNaW4gPSAxMCwgY2hvaWNlc01heCA9IDMwIGFuZCBjaG9pY2VzU3RlcCA9IDEwIHRoZW4geW91IHdpbGwgaGF2ZSBvbmx5IHRocmVlIGFkZGl0aW9uYWwgY2hvaWNlczogWzEwLCAyMCwgMzBdLlxuICAgKiBAc2VlIGNob2ljZXNNaW5cbiAgICogQHNlZSBjaG9pY2VzTWF4XG4gICAqL1xuICBwdWJsaWMgZ2V0IGNob2ljZXNTdGVwKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNTdGVwXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY2hvaWNlc1N0ZXAodmFsOiBudW1iZXIpIHtcbiAgICBpZiAodmFsIDwgMSkgdmFsID0gMTtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzU3RlcFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBEcm9wZG93biBhdXRvIGNvbXBsZXRlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGF1dG9Db21wbGV0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJhdXRvQ29tcGxldGVcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBhdXRvQ29tcGxldGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJhdXRvQ29tcGxldGVcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0Q29udHJvbENsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5ldyBDc3NDbGFzc0J1aWxkZXIoKVxuICAgICAgLmFwcGVuZCh0aGlzLmNzc0NsYXNzZXMuY29udHJvbClcbiAgICAgIC5hcHBlbmQodGhpcy5jc3NDbGFzc2VzLm9uRXJyb3IsIHRoaXMuZXJyb3JzLmxlbmd0aCA+IDApXG4gICAgICAuYXBwZW5kKHRoaXMuY3NzQ2xhc3Nlcy5jb250cm9sRGlzYWJsZWQsIHRoaXMuaXNSZWFkT25seSlcbiAgICAgIC50b1N0cmluZygpO1xuICB9XG59XG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImRyb3Bkb3duXCIsXG4gIFtcbiAgICB7IG5hbWU6IFwib3B0aW9uc0NhcHRpb25cIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY09wdGlvbnNDYXB0aW9uXCIgfSxcbiAgICB7IG5hbWU6IFwic2hvd09wdGlvbnNDYXB0aW9uOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIHsgbmFtZTogXCJjaG9pY2VzTWluOm51bWJlclwiLCBkZWZhdWx0OiAwIH0sXG4gICAgeyBuYW1lOiBcImNob2ljZXNNYXg6bnVtYmVyXCIsIGRlZmF1bHQ6IDAgfSxcbiAgICB7IG5hbWU6IFwiY2hvaWNlc1N0ZXA6bnVtYmVyXCIsIGRlZmF1bHQ6IDEsIG1pblZhbHVlOiAxIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJhdXRvQ29tcGxldGVcIixcbiAgICAgIGRhdGFMaXN0OiBbXG4gICAgICAgIFwibmFtZVwiLFxuICAgICAgICBcImhvbm9yaWZpYy1wcmVmaXhcIixcbiAgICAgICAgXCJnaXZlbi1uYW1lXCIsXG4gICAgICAgIFwiYWRkaXRpb25hbC1uYW1lXCIsXG4gICAgICAgIFwiZmFtaWx5LW5hbWVcIixcbiAgICAgICAgXCJob25vcmlmaWMtc3VmZml4XCIsXG4gICAgICAgIFwibmlja25hbWVcIixcbiAgICAgICAgXCJvcmdhbml6YXRpb24tdGl0bGVcIixcbiAgICAgICAgXCJ1c2VybmFtZVwiLFxuICAgICAgICBcIm5ldy1wYXNzd29yZFwiLFxuICAgICAgICBcImN1cnJlbnQtcGFzc3dvcmRcIixcbiAgICAgICAgXCJvcmdhbml6YXRpb25cIixcbiAgICAgICAgXCJzdHJlZXQtYWRkcmVzc1wiLFxuICAgICAgICBcImFkZHJlc3MtbGluZTFcIixcbiAgICAgICAgXCJhZGRyZXNzLWxpbmUyXCIsXG4gICAgICAgIFwiYWRkcmVzcy1saW5lM1wiLFxuICAgICAgICBcImFkZHJlc3MtbGV2ZWw0XCIsXG4gICAgICAgIFwiYWRkcmVzcy1sZXZlbDNcIixcbiAgICAgICAgXCJhZGRyZXNzLWxldmVsMlwiLFxuICAgICAgICBcImFkZHJlc3MtbGV2ZWwxXCIsXG4gICAgICAgIFwiY291bnRyeVwiLFxuICAgICAgICBcImNvdW50cnktbmFtZVwiLFxuICAgICAgICBcInBvc3RhbC1jb2RlXCIsXG4gICAgICAgIFwiY2MtbmFtZVwiLFxuICAgICAgICBcImNjLWdpdmVuLW5hbWVcIixcbiAgICAgICAgXCJjYy1hZGRpdGlvbmFsLW5hbWVcIixcbiAgICAgICAgXCJjYy1mYW1pbHktbmFtZVwiLFxuICAgICAgICBcImNjLW51bWJlclwiLFxuICAgICAgICBcImNjLWV4cFwiLFxuICAgICAgICBcImNjLWV4cC1tb250aFwiLFxuICAgICAgICBcImNjLWV4cC15ZWFyXCIsXG4gICAgICAgIFwiY2MtY3NjXCIsXG4gICAgICAgIFwiY2MtdHlwZVwiLFxuICAgICAgICBcInRyYW5zYWN0aW9uLWN1cnJlbmN5XCIsXG4gICAgICAgIFwidHJhbnNhY3Rpb24tYW1vdW50XCIsXG4gICAgICAgIFwibGFuZ3VhZ2VcIixcbiAgICAgICAgXCJiZGF5XCIsXG4gICAgICAgIFwiYmRheS1kYXlcIixcbiAgICAgICAgXCJiZGF5LW1vbnRoXCIsXG4gICAgICAgIFwiYmRheS15ZWFyXCIsXG4gICAgICAgIFwic2V4XCIsXG4gICAgICAgIFwidXJsXCIsXG4gICAgICAgIFwicGhvdG9cIixcbiAgICAgICAgXCJ0ZWxcIixcbiAgICAgICAgXCJ0ZWwtY291bnRyeS1jb2RlXCIsXG4gICAgICAgIFwidGVsLW5hdGlvbmFsXCIsXG4gICAgICAgIFwidGVsLWFyZWEtY29kZVwiLFxuICAgICAgICBcInRlbC1sb2NhbFwiLFxuICAgICAgICBcInRlbC1sb2NhbC1wcmVmaXhcIixcbiAgICAgICAgXCJ0ZWwtbG9jYWwtc3VmZml4XCIsXG4gICAgICAgIFwidGVsLWV4dGVuc2lvblwiLFxuICAgICAgICBcImVtYWlsXCIsXG4gICAgICAgIFwiaW1wcFwiLFxuICAgICAgXSxcbiAgICB9LFxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uRHJvcGRvd25Nb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJzZWxlY3RiYXNlXCJcbik7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImRyb3Bkb3duXCIsIChuYW1lKSA9PiB7XG4gIHZhciBxID0gbmV3IFF1ZXN0aW9uRHJvcGRvd25Nb2RlbChuYW1lKTtcbiAgcS5jaG9pY2VzID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRDaG9pY2VzO1xuICByZXR1cm4gcTtcbn0pO1xuIiwiaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhbiBxdWVzdGlvbiB0aGF0IHJlbmRlcnMgZW1wdHkgXCJkaXZcIiB0YWcuIEl0IHVzZWQgYXMgYSBiYXNlIGNsYXNzIGZvciBzb21lIGN1c3RvbSB3aWRnZXRzXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkVtcHR5TW9kZWwgZXh0ZW5kcyBRdWVzdGlvbiB7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZW1wdHlcIjtcbiAgfVxufVxuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImVtcHR5XCIsXG4gIFtdLFxuICBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvbkVtcHR5TW9kZWwoXCJcIik7XG4gIH0sXG4gIFwicXVlc3Rpb25cIlxuKTtcbiIsImltcG9ydCB7IEhhc2hUYWJsZSwgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IEV4cHJlc3Npb25SdW5uZXIgfSBmcm9tIFwiLi9jb25kaXRpb25zXCI7XG5pbXBvcnQgeyBTdXJ2ZXlFcnJvciB9IGZyb20gXCIuL3N1cnZleS1lcnJvclwiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGV4cHJlc3Npb24gcXVlc3Rpb24uIEl0IGlzIGEgcmVhZC1vbmx5IHF1ZXN0aW9uLiBJdCBjYWxjdWxhdGVzIHZhbHVlIGJhc2VkIG9uIGVweHJlc3Npb24gcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkV4cHJlc3Npb25Nb2RlbCBleHRlbmRzIFF1ZXN0aW9uIHtcbiAgcHJpdmF0ZSBleHByZXNzaW9uSXNSdW5uaW5nOiBib29sZWFuO1xuICBwcml2YXRlIGV4cHJlc3Npb25SdW5uZXI6IEV4cHJlc3Npb25SdW5uZXI7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJmb3JtYXRcIiwgdGhpcyk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJleHByZXNzaW9uXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHNlbGYuZXhwcmVzc2lvblJ1bm5lcikge1xuICAgICAgICBzZWxmLmV4cHJlc3Npb25SdW5uZXIgPSBuZXcgRXhwcmVzc2lvblJ1bm5lcihzZWxmLmV4cHJlc3Npb24pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZXhwcmVzc2lvblwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzSW5wdXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBkaXNwbGF5IHRoZSB2YWx1ZSBpbiB5b3VyIG93biBmb3JtYXQuIE1ha2Ugc3VyZSB5b3UgaGF2ZSBcInswfVwiIHN1YnN0cmluZyBpbiB5b3VyIHN0cmluZywgdG8gZGlzcGxheSB0aGUgYWN0dWFsIHZhbHVlLlxuICAgKi9cbiAgcHVibGljIGdldCBmb3JtYXQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJmb3JtYXRcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBmb3JtYXQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImZvcm1hdFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NGb3JtYXQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiZm9ybWF0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgRXhwcmVzc2lvbiB0aGF0IHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBxdWVzdGlvbiB2YWx1ZS4gWW91IG1heSB1c2Ugc3RhbmRhcmQgb3BlcmF0b3JzIGxpa2UgKywgLSwgKiBhbmQgLywgc3F1YXJlcyAoKS4gSGVyZSBpcyB0aGUgZXhhbXBsZSBvZiBhY2Nlc3NpbmcgdGhlIHF1ZXN0aW9uIHZhbHVlIHtxdWVzdGlvbm5hbWV9LlxuICAgKiA8YnIvPkV4YW1wbGU6IFwiKHtxdWFudGl0eX0gKiB7cHJpY2V9KSAqICgxMDAgLSB7ZGlzY291bnR9KSAvIDEwMFwiXG4gICAqL1xuICBwdWJsaWMgZ2V0IGV4cHJlc3Npb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZXhwcmVzc2lvblwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGV4cHJlc3Npb24odmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJleHByZXNzaW9uXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGxvY0NhbGN1bGF0aW9uKCkge1xuICAgIHRoaXMuZXhwcmVzc2lvbklzUnVubmluZyA9IHRydWU7XG4gIH1cbiAgcHVibGljIHVubG9jQ2FsY3VsYXRpb24oKSB7XG4gICAgdGhpcy5leHByZXNzaW9uSXNSdW5uaW5nID0gZmFsc2U7XG4gIH1cbiAgcHVibGljIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIHN1cGVyLnJ1bkNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIGlmIChcbiAgICAgICF0aGlzLmV4cHJlc3Npb24gfHxcbiAgICAgIHRoaXMuZXhwcmVzc2lvbklzUnVubmluZyB8fFxuICAgICAgKCF0aGlzLnJ1bklmUmVhZE9ubHkgJiYgdGhpcy5pc1JlYWRPbmx5KVxuICAgIClcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLmxvY0NhbGN1bGF0aW9uKCk7XG4gICAgaWYgKCF0aGlzLmV4cHJlc3Npb25SdW5uZXIpIHtcbiAgICAgIHRoaXMuZXhwcmVzc2lvblJ1bm5lciA9IG5ldyBFeHByZXNzaW9uUnVubmVyKHRoaXMuZXhwcmVzc2lvbik7XG4gICAgfVxuICAgIHRoaXMuZXhwcmVzc2lvblJ1bm5lci5vblJ1bkNvbXBsZXRlID0gKG5ld1ZhbHVlKSA9PiB7XG4gICAgICBpZiAoIUhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyhuZXdWYWx1ZSwgdGhpcy52YWx1ZSkpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgfVxuICAgICAgdGhpcy51bmxvY0NhbGN1bGF0aW9uKCk7XG4gICAgfTtcbiAgICB0aGlzLmV4cHJlc3Npb25SdW5uZXIucnVuKHZhbHVlcywgcHJvcGVydGllcyk7XG4gIH1cbiAgcHJvdGVjdGVkIGNhbkNvbGxlY3RFcnJvcnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJvdGVjdGVkIGhhc1JlcXVpcmVkRXJyb3IoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZnJhY3Rpb24gZGlnaXRzIHRvIHVzZSBpZiBkaXNwbGF5U3R5bGUgaXMgbm90IFwibm9uZVwiLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIGZyb20gMCB0byAyMC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgLTEgYW5kIGl0IG1lYW5zIHRoYXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgdXNlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4aW11bUZyYWN0aW9uRGlnaXRzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1heGltdW1GcmFjdGlvbkRpZ2l0c1wiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heGltdW1GcmFjdGlvbkRpZ2l0cyh2YWw6IG51bWJlcikge1xuICAgIGlmICh2YWwgPCAtMSB8fCB2YWwgPiAyMCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1heGltdW1GcmFjdGlvbkRpZ2l0c1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbWluaW11bSBudW1iZXIgb2YgZnJhY3Rpb24gZGlnaXRzIHRvIHVzZSBpZiBkaXNwbGF5U3R5bGUgaXMgbm90IFwibm9uZVwiLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIGZyb20gMCB0byAyMC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgLTEgYW5kIGl0IG1lYW5zIHRoYXQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgdXNlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgbWluaW11bUZyYWN0aW9uRGlnaXRzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1pbmltdW1GcmFjdGlvbkRpZ2l0c1wiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1pbmltdW1GcmFjdGlvbkRpZ2l0cyh2YWw6IG51bWJlcikge1xuICAgIGlmICh2YWwgPCAtMSB8fCB2YWwgPiAyMCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1pbmltdW1GcmFjdGlvbkRpZ2l0c1wiLCB2YWwpO1xuICB9XG4gIHByaXZhdGUgcnVuSWZSZWFkT25seVZhbHVlOiBib29sZWFuO1xuICBwdWJsaWMgZ2V0IHJ1bklmUmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucnVuSWZSZWFkT25seVZhbHVlID09PSB0cnVlO1xuICB9XG4gIHB1YmxpYyBzZXQgcnVuSWZSZWFkT25seSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnJ1bklmUmVhZE9ubHlWYWx1ZSA9IHZhbDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGlzcGxheVZhbHVlQ29yZShrZXlzQXNUZXh0OiBib29sZWFuLCB2YWx1ZTogYW55KTogYW55IHtcbiAgICB2YXIgdmFsID0gdGhpcy5pc1ZhbHVlRW1wdHkodmFsdWUpID8gdGhpcy5kZWZhdWx0VmFsdWUgOiB2YWx1ZTtcbiAgICB2YXIgcmVzID0gXCJcIjtcbiAgICBpZiAoIXRoaXMuaXNWYWx1ZUVtcHR5KHZhbCkpIHtcbiAgICAgIHZhciBzdHIgPSB0aGlzLmdldFZhbHVlQXNTdHIodmFsKTtcbiAgICAgIHJlcyA9ICF0aGlzLmZvcm1hdCA/IHN0ciA6ICg8YW55PnRoaXMuZm9ybWF0KVtcImZvcm1hdFwiXShzdHIpO1xuICAgIH1cbiAgICBpZiAoISF0aGlzLnN1cnZleSkge1xuICAgICAgcmVzID0gdGhpcy5zdXJ2ZXkuZ2V0RXhwcmVzc2lvbkRpc3BsYXlWYWx1ZSh0aGlzLCB2YWwsIHJlcyk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgLyoqXG4gICAqIFlvdSBtYXkgc2V0IHRoaXMgcHJvcGVydHkgdG8gXCJkZWNpbWFsXCIsIFwiY3VycmVuY3lcIiwgXCJwZXJjZW50XCIgb3IgXCJkYXRlXCIuIElmIHlvdSBzZXQgaXQgdG8gXCJjdXJyZW5jeVwiLCB5b3UgbWF5IHVzZSB0aGUgY3VycmVuY3kgcHJvcGVydHkgdG8gZGlzcGxheSB0aGUgdmFsdWUgaW4gY3VycmVuY3kgZGlmZmVyZW50IGZyb20gVVNELlxuICAgKiBAc2VlIGN1cnJlbmN5XG4gICAqL1xuICBwdWJsaWMgZ2V0IGRpc3BsYXlTdHlsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJkaXNwbGF5U3R5bGVcIik7XG4gIH1cbiAgcHVibGljIHNldCBkaXNwbGF5U3R5bGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJkaXNwbGF5U3R5bGVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVXNlIGl0IHRvIGRpc3BsYXkgdGhlIHZhbHVlIGluIHRoZSBjdXJyZW5jeSBkaWZmZXJlbiBmcm9tIFVTRC4gVGhlIGRpc3BsYXlTdHlwZSBzaG91bGQgYmUgc2V0IHRvIFwiY3VycmVuY3lcIi5cbiAgICogQHNlZSBkaXNwbGF5U3R5bGVcbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVuY3koKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY3VycmVuY3lcIik7XG4gIH1cbiAgcHVibGljIHNldCBjdXJyZW5jeSh2YWw6IHN0cmluZykge1xuICAgIGlmIChnZXRDdXJyZWN5Q29kZXMoKS5pbmRleE9mKHZhbCkgPCAwKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY3VycmVuY3lcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogXHREZXRlcm1pbmVzIHdoZXRoZXIgdG8gZGlzcGxheSBncm91cGluZyBzZXBhcmF0b3JzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0cnVlLlxuICAgKi9cbiAgcHVibGljIGdldCB1c2VHcm91cGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidXNlR3JvdXBpbmdcIik7XG4gIH1cbiAgcHVibGljIHNldCB1c2VHcm91cGluZyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ1c2VHcm91cGluZ1wiLCB2YWwpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRWYWx1ZUFzU3RyKHZhbDogYW55KTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5kaXNwbGF5U3R5bGUgPT0gXCJkYXRlXCIpIHtcbiAgICAgIHZhciBkID0gbmV3IERhdGUodmFsKTtcbiAgICAgIGlmICghIWQgJiYgISFkLnRvTG9jYWxlRGF0ZVN0cmluZykgcmV0dXJuIGQudG9Mb2NhbGVEYXRlU3RyaW5nKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRpc3BsYXlTdHlsZSAhPSBcIm5vbmVcIiAmJiBIZWxwZXJzLmlzTnVtYmVyKHZhbCkpIHtcbiAgICAgIHZhciBsb2NhbGUgPSB0aGlzLmdldExvY2FsZSgpO1xuICAgICAgaWYgKCFsb2NhbGUpIGxvY2FsZSA9IFwiZW5cIjtcbiAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICBzdHlsZTogdGhpcy5kaXNwbGF5U3R5bGUsXG4gICAgICAgIGN1cnJlbmN5OiB0aGlzLmN1cnJlbmN5LFxuICAgICAgICB1c2VHcm91cGluZzogdGhpcy51c2VHcm91cGluZyxcbiAgICAgIH07XG4gICAgICBpZiAodGhpcy5tYXhpbXVtRnJhY3Rpb25EaWdpdHMgPiAtMSkge1xuICAgICAgICAoPGFueT5vcHRpb25zKVtcIm1heGltdW1GcmFjdGlvbkRpZ2l0c1wiXSA9IHRoaXMubWF4aW11bUZyYWN0aW9uRGlnaXRzO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubWluaW11bUZyYWN0aW9uRGlnaXRzID4gLTEpIHtcbiAgICAgICAgKDxhbnk+b3B0aW9ucylbXCJtaW5pbXVtRnJhY3Rpb25EaWdpdHNcIl0gPSB0aGlzLm1pbmltdW1GcmFjdGlvbkRpZ2l0cztcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWwudG9Mb2NhbGVTdHJpbmcobG9jYWxlLCBvcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbC50b1N0cmluZygpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDdXJyZWN5Q29kZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gIHJldHVybiBbXG4gICAgXCJBRURcIixcbiAgICBcIkFGTlwiLFxuICAgIFwiQUxMXCIsXG4gICAgXCJBTURcIixcbiAgICBcIkFOR1wiLFxuICAgIFwiQU9BXCIsXG4gICAgXCJBUlNcIixcbiAgICBcIkFVRFwiLFxuICAgIFwiQVdHXCIsXG4gICAgXCJBWk5cIixcbiAgICBcIkJBTVwiLFxuICAgIFwiQkJEXCIsXG4gICAgXCJCRFRcIixcbiAgICBcIkJHTlwiLFxuICAgIFwiQkhEXCIsXG4gICAgXCJCSUZcIixcbiAgICBcIkJNRFwiLFxuICAgIFwiQk5EXCIsXG4gICAgXCJCT0JcIixcbiAgICBcIkJPVlwiLFxuICAgIFwiQlJMXCIsXG4gICAgXCJCU0RcIixcbiAgICBcIkJUTlwiLFxuICAgIFwiQldQXCIsXG4gICAgXCJCWU5cIixcbiAgICBcIkJaRFwiLFxuICAgIFwiQ0FEXCIsXG4gICAgXCJDREZcIixcbiAgICBcIkNIRVwiLFxuICAgIFwiQ0hGXCIsXG4gICAgXCJDSFdcIixcbiAgICBcIkNMRlwiLFxuICAgIFwiQ0xQXCIsXG4gICAgXCJDTllcIixcbiAgICBcIkNPUFwiLFxuICAgIFwiQ09VXCIsXG4gICAgXCJDUkNcIixcbiAgICBcIkNVQ1wiLFxuICAgIFwiQ1VQXCIsXG4gICAgXCJDVkVcIixcbiAgICBcIkNaS1wiLFxuICAgIFwiREpGXCIsXG4gICAgXCJES0tcIixcbiAgICBcIkRPUFwiLFxuICAgIFwiRFpEXCIsXG4gICAgXCJFR1BcIixcbiAgICBcIkVSTlwiLFxuICAgIFwiRVRCXCIsXG4gICAgXCJFVVJcIixcbiAgICBcIkZKRFwiLFxuICAgIFwiRktQXCIsXG4gICAgXCJHQlBcIixcbiAgICBcIkdFTFwiLFxuICAgIFwiR0hTXCIsXG4gICAgXCJHSVBcIixcbiAgICBcIkdNRFwiLFxuICAgIFwiR05GXCIsXG4gICAgXCJHVFFcIixcbiAgICBcIkdZRFwiLFxuICAgIFwiSEtEXCIsXG4gICAgXCJITkxcIixcbiAgICBcIkhSS1wiLFxuICAgIFwiSFRHXCIsXG4gICAgXCJIVUZcIixcbiAgICBcIklEUlwiLFxuICAgIFwiSUxTXCIsXG4gICAgXCJJTlJcIixcbiAgICBcIklRRFwiLFxuICAgIFwiSVJSXCIsXG4gICAgXCJJU0tcIixcbiAgICBcIkpNRFwiLFxuICAgIFwiSk9EXCIsXG4gICAgXCJKUFlcIixcbiAgICBcIktFU1wiLFxuICAgIFwiS0dTXCIsXG4gICAgXCJLSFJcIixcbiAgICBcIktNRlwiLFxuICAgIFwiS1BXXCIsXG4gICAgXCJLUldcIixcbiAgICBcIktXRFwiLFxuICAgIFwiS1lEXCIsXG4gICAgXCJLWlRcIixcbiAgICBcIkxBS1wiLFxuICAgIFwiTEJQXCIsXG4gICAgXCJMS1JcIixcbiAgICBcIkxSRFwiLFxuICAgIFwiTFNMXCIsXG4gICAgXCJMWURcIixcbiAgICBcIk1BRFwiLFxuICAgIFwiTURMXCIsXG4gICAgXCJNR0FcIixcbiAgICBcIk1LRFwiLFxuICAgIFwiTU1LXCIsXG4gICAgXCJNTlRcIixcbiAgICBcIk1PUFwiLFxuICAgIFwiTVJPXCIsXG4gICAgXCJNVVJcIixcbiAgICBcIk1WUlwiLFxuICAgIFwiTVdLXCIsXG4gICAgXCJNWE5cIixcbiAgICBcIk1YVlwiLFxuICAgIFwiTVlSXCIsXG4gICAgXCJNWk5cIixcbiAgICBcIk5BRFwiLFxuICAgIFwiTkdOXCIsXG4gICAgXCJOSU9cIixcbiAgICBcIk5PS1wiLFxuICAgIFwiTlBSXCIsXG4gICAgXCJOWkRcIixcbiAgICBcIk9NUlwiLFxuICAgIFwiUEFCXCIsXG4gICAgXCJQRU5cIixcbiAgICBcIlBHS1wiLFxuICAgIFwiUEhQXCIsXG4gICAgXCJQS1JcIixcbiAgICBcIlBMTlwiLFxuICAgIFwiUFlHXCIsXG4gICAgXCJRQVJcIixcbiAgICBcIlJPTlwiLFxuICAgIFwiUlNEXCIsXG4gICAgXCJSVUJcIixcbiAgICBcIlJXRlwiLFxuICAgIFwiU0FSXCIsXG4gICAgXCJTQkRcIixcbiAgICBcIlNDUlwiLFxuICAgIFwiU0RHXCIsXG4gICAgXCJTRUtcIixcbiAgICBcIlNHRFwiLFxuICAgIFwiU0hQXCIsXG4gICAgXCJTTExcIixcbiAgICBcIlNPU1wiLFxuICAgIFwiU1JEXCIsXG4gICAgXCJTU1BcIixcbiAgICBcIlNURFwiLFxuICAgIFwiU1ZDXCIsXG4gICAgXCJTWVBcIixcbiAgICBcIlNaTFwiLFxuICAgIFwiVEhCXCIsXG4gICAgXCJUSlNcIixcbiAgICBcIlRNVFwiLFxuICAgIFwiVE5EXCIsXG4gICAgXCJUT1BcIixcbiAgICBcIlRSWVwiLFxuICAgIFwiVFREXCIsXG4gICAgXCJUV0RcIixcbiAgICBcIlRaU1wiLFxuICAgIFwiVUFIXCIsXG4gICAgXCJVR1hcIixcbiAgICBcIlVTRFwiLFxuICAgIFwiVVNOXCIsXG4gICAgXCJVWUlcIixcbiAgICBcIlVZVVwiLFxuICAgIFwiVVpTXCIsXG4gICAgXCJWRUZcIixcbiAgICBcIlZORFwiLFxuICAgIFwiVlVWXCIsXG4gICAgXCJXU1RcIixcbiAgICBcIlhBRlwiLFxuICAgIFwiWEFHXCIsXG4gICAgXCJYQVVcIixcbiAgICBcIlhCQVwiLFxuICAgIFwiWEJCXCIsXG4gICAgXCJYQkNcIixcbiAgICBcIlhCRFwiLFxuICAgIFwiWENEXCIsXG4gICAgXCJYRFJcIixcbiAgICBcIlhPRlwiLFxuICAgIFwiWFBEXCIsXG4gICAgXCJYUEZcIixcbiAgICBcIlhQVFwiLFxuICAgIFwiWFNVXCIsXG4gICAgXCJYVFNcIixcbiAgICBcIlhVQVwiLFxuICAgIFwiWFhYXCIsXG4gICAgXCJZRVJcIixcbiAgICBcIlpBUlwiLFxuICAgIFwiWk1XXCIsXG4gICAgXCJaV0xcIixcbiAgXTtcbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJleHByZXNzaW9uXCIsXG4gIFtcbiAgICBcImV4cHJlc3Npb246ZXhwcmVzc2lvblwiLFxuICAgIHsgbmFtZTogXCJmb3JtYXRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0Zvcm1hdFwiIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJkaXNwbGF5U3R5bGVcIixcbiAgICAgIGRlZmF1bHQ6IFwibm9uZVwiLFxuICAgICAgY2hvaWNlczogW1wibm9uZVwiLCBcImRlY2ltYWxcIiwgXCJjdXJyZW5jeVwiLCBcInBlcmNlbnRcIiwgXCJkYXRlXCJdLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJjdXJyZW5jeVwiLFxuICAgICAgY2hvaWNlczogKCkgPT4ge1xuICAgICAgICByZXR1cm4gZ2V0Q3VycmVjeUNvZGVzKCk7XG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogXCJVU0RcIixcbiAgICB9LFxuICAgIHsgbmFtZTogXCJtYXhpbXVtRnJhY3Rpb25EaWdpdHM6bnVtYmVyXCIsIGRlZmF1bHQ6IC0xIH0sXG4gICAgeyBuYW1lOiBcIm1pbmltdW1GcmFjdGlvbkRpZ2l0czpudW1iZXJcIiwgZGVmYXVsdDogLTEgfSxcbiAgICB7IG5hbWU6IFwidXNlR3JvdXBpbmc6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgeyBuYW1lOiBcImVuYWJsZUlmXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcImlzUmVxdWlyZWRcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwicmVhZE9ubHlcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwicmVxdWlyZWRFcnJvclRleHRcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwiZGVmYXVsdFZhbHVlRXhwcmVzc2lvblwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJkZWZhdWx0VmFsdWVcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwiY29ycmVjdEFuc3dlclwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJyZXF1aXJlZElmXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25FeHByZXNzaW9uTW9kZWwoXCJcIik7XG4gIH0sXG4gIFwicXVlc3Rpb25cIlxuKTtcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiZXhwcmVzc2lvblwiLCAobmFtZSkgPT4ge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uRXhwcmVzc2lvbk1vZGVsKG5hbWUpO1xufSk7XG4iLCJpbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBwcm9wZXJ0eSwgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgRXZlbnRCYXNlIH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgVXBsb2FkaW5nRmlsZUVycm9yLCBFeGNlZWRTaXplRXJyb3IgfSBmcm9tIFwiLi9lcnJvclwiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuaW1wb3J0IHsgU3VydmV5RXJyb3IgfSBmcm9tIFwiLi9zdXJ2ZXktZXJyb3JcIjtcbmltcG9ydCB7IENzc0NsYXNzQnVpbGRlciB9IGZyb20gXCIuL3V0aWxzL2Nzc0NsYXNzQnVpbGRlclwiO1xuaW1wb3J0IHsgY29uZmlybUFjdGlvbiwgZGV0ZWN0SUVPckVkZ2UsIGxvYWRGaWxlRnJvbUJhc2U2NCB9IGZyb20gXCIuL3V0aWxzL3V0aWxzXCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBmaWxlIHF1ZXN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkZpbGVNb2RlbCBleHRlbmRzIFF1ZXN0aW9uIHtcbiAgcHJpdmF0ZSBpc1VwbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBAcHJvcGVydHkoKSBpc0RyYWdnaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgYWZ0ZXIgcXVlc3Rpb24gc3RhdGUgaGFzIGJlZW4gY2hhbmdlZC5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBxdWVzdGlvbiBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy5zdGF0ZSBuZXcgcXVlc3Rpb24gc3RhdGUgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgb25TdGF0ZUNoYW5nZWQ6IEV2ZW50QmFzZTxRdWVzdGlvbkZpbGVNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFF1ZXN0aW9uRmlsZU1vZGVsXG4gID4oKTtcbiAgcHVibGljIHByZXZpZXdWYWx1ZTogYW55W10gPSBbXTtcbiAgQHByb3BlcnR5KHsgZGVmYXVsdFZhbHVlOiBcImVtcHR5XCIgfSkgY3VycmVudFN0YXRlOiBzdHJpbmc7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZmlsZVwiO1xuICB9XG4gIHB1YmxpYyBjbGVhck9uRGVsZXRpbmdDb250YWluZXIoKSB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSkgcmV0dXJuO1xuICAgIHRoaXMuc3VydmV5LmNsZWFyRmlsZXModGhpcywgdGhpcy5uYW1lLCB0aGlzLnZhbHVlLCBudWxsLCAoKSA9PiB7fSk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byB0cnVlLCB0byBzaG93IHRoZSBwcmV2aWV3IGZvciB0aGUgaW1hZ2UgZmlsZXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dQcmV2aWV3KCkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93UHJldmlld1wiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dQcmV2aWV3KHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dQcmV2aWV3XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byB0cnVlLCB0byBhbGxvdyBzZWxlY3QgbXVsdGlwbGUgZmlsZXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFsbG93TXVsdGlwbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImFsbG93TXVsdGlwbGVcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgYWxsb3dNdWx0aXBsZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJhbGxvd011bHRpcGxlXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpbWFnZSBoZWlnaHQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGltYWdlSGVpZ2h0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImltYWdlSGVpZ2h0XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaW1hZ2VIZWlnaHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpbWFnZUhlaWdodFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaW1hZ2Ugd2lkdGguXG4gICAqL1xuICBwdWJsaWMgZ2V0IGltYWdlV2lkdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaW1hZ2VXaWR0aFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGltYWdlV2lkdGgodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpbWFnZVdpZHRoXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIEFjY2VwdGVkIGZpbGUgdHlwZXMuIFBhc3NlZCB0byB0aGUgJ2FjY2VwdCcgYXR0cmlidXRlIG9mIHRoZSBmaWxlIGlucHV0IHRhZy4gU2VlIGh0dHBzOi8vd3d3Lnczc2Nob29scy5jb20vdGFncy9hdHRfaW5wdXRfYWNjZXB0LmFzcCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKi9cbiAgcHVibGljIGdldCBhY2NlcHRlZFR5cGVzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImFjY2VwdGVkVHlwZXNcIik7XG4gIH1cbiAgcHVibGljIHNldCBhY2NlcHRlZFR5cGVzKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiYWNjZXB0ZWRUeXBlc1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gZmFsc2UgaWYgeW91IGRvIG5vdCB3YW50IHRvIHNlcmlhbGl6ZSBmaWxlIGNvbnRlbnQgYXMgdGV4dCBpbiB0aGUgc3VydmV5LmRhdGEuXG4gICAqIEluIHRoaXMgY2FzZSwgeW91IGhhdmUgdG8gd3JpdGUgdGhlIGNvZGUgb25VcGxvYWRGaWxlcyBldmVudCB0byBzdG9yZSB0aGUgZmlsZSBjb250ZW50LlxuICAgKiBAc2VlIFN1cnZleU1vZGVsLm9uVXBsb2FkRmlsZXNcbiAgICovXG4gIHB1YmxpYyBnZXQgc3RvcmVEYXRhQXNUZXh0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzdG9yZURhdGFBc1RleHRcIik7XG4gIH1cbiAgcHVibGljIHNldCBzdG9yZURhdGFBc1RleHQodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic3RvcmVEYXRhQXNUZXh0XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byB0cnVlIGlmIHlvdSB3YW50IHRvIHdhaXQgdW50aWwgZmlsZXMgd2lsbCBiZSB1cGxvYWRlZCB0byB5b3VyIHNlcnZlci5cbiAgICovXG4gIHB1YmxpYyBnZXQgd2FpdEZvclVwbG9hZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwid2FpdEZvclVwbG9hZFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHdhaXRGb3JVcGxvYWQodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwid2FpdEZvclVwbG9hZFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gZmFsc2UgaWYgeW91IHdhbnQgdG8gZGlzYWJsZSBpbWFnZXMgcHJldmlldy5cbiAgICovXG4gIHB1YmxpYyBnZXQgYWxsb3dJbWFnZXNQcmV2aWV3KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJhbGxvd0ltYWdlc1ByZXZpZXdcIik7XG4gIH1cbiAgcHVibGljIHNldCBhbGxvd0ltYWdlc1ByZXZpZXcodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dJbWFnZXNQcmV2aWV3XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIHNldHVwIHRoZSBtYXhpbXVtIGFsbG93ZWQgZmlsZSBzaXplLlxuICAgKi9cbiAgcHVibGljIGdldCBtYXhTaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1heFNpemVcIik7XG4gIH1cbiAgcHVibGljIHNldCBtYXhTaXplKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWF4U2l6ZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBzZXR1cCBjb25maXJtYXRpb24gdG8gcmVtb3ZlIGZpbGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG5lZWRDb25maXJtUmVtb3ZlRmlsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibmVlZENvbmZpcm1SZW1vdmVGaWxlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbmVlZENvbmZpcm1SZW1vdmVGaWxlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm5lZWRDb25maXJtUmVtb3ZlRmlsZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgcmVtb3ZlIGZpbGUgY29uZmlybWF0aW9uIG1lc3NhZ2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29uZmlybVJlbW92ZU1lc3NhZ2UoZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuICg8YW55PnRoaXMuY29uZmlybVJlbW92ZU1lc3NhZ2UpLmZvcm1hdChmaWxlTmFtZSk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSByZW1vdmUgZmlsZSBjb25maXJtYXRpb24gbWVzc2FnZSB0ZW1wbGF0ZS5cbiAgICovXG4gIEBwcm9wZXJ0eSh7IGRlZmF1bHRWYWx1ZTogc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImNvbmZpcm1SZW1vdmVGaWxlXCIpIH0pIGNvbmZpcm1SZW1vdmVNZXNzYWdlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcmVtb3ZlIGFsbCBmaWxlcyBjb25maXJtYXRpb24gbWVzc2FnZS5cbiAgICovXG4gIEBwcm9wZXJ0eSh7IGRlZmF1bHRWYWx1ZTogc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImNvbmZpcm1SZW1vdmVBbGxGaWxlc1wiKSB9KSBjb25maXJtUmVtb3ZlQWxsTWVzc2FnZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIG5vIGZpbGUgY2hvc2VuIGNhcHRpb24gZm9yIG1vZGVybiB0aGVtZS5cbiAgICovXG4gIEBwcm9wZXJ0eSh7IGRlZmF1bHRWYWx1ZTogc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm5vRmlsZUNob3NlblwiKSB9KSBub0ZpbGVDaG9zZW5DYXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgY2hvb3NlIGZpbGVzIGJ1dHRvbiBjYXB0aW9uIGZvciBtb2Rlcm4gdGhlbWUuXG4gICAqL1xuICBAcHJvcGVydHkoeyBkZWZhdWx0VmFsdWU6IHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjaG9vc2VGaWxlQ2FwdGlvblwiKSB9KSBjaG9vc2VCdXR0b25DYXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgY2xlYW4gZmlsZXMgYnV0dG9uIGNhcHRpb24uXG4gICAqL1xuICBAcHJvcGVydHkoeyBkZWZhdWx0VmFsdWU6IHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjbGVhbkNhcHRpb25cIikgfSkgY2xlYW5CdXR0b25DYXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcmVtb3ZlIGZpbGUgYnV0dG9uIGNhcHRpb24uXG4gICAqL1xuICBAcHJvcGVydHkoeyBkZWZhdWx0VmFsdWU6IHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJyZW1vdmVGaWxlQ2FwdGlvblwiKSB9KSByZW1vdmVGaWxlQ2FwdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGxvYWRpbmcgZmlsZSBpbnB1dCB0aXRsZS5cbiAgICovXG4gIEBwcm9wZXJ0eSh7IGRlZmF1bHRWYWx1ZTogc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImxvYWRpbmdGaWxlXCIpIH0pIGxvYWRpbmdGaWxlVGl0bGU6IHN0cmluZztcbiAgLyoqXG4gICogVGhlIGNob29zZSBmaWxlIGlucHV0IHRpdGxlLlxuICAqL1xuICBAcHJvcGVydHkoeyBkZWZhdWx0VmFsdWU6IHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjaG9vc2VGaWxlXCIpIH0pIGNob29zZUZpbGVUaXRsZTogc3RyaW5nO1xuICBAcHJvcGVydHkoeyBkZWZhdWx0VmFsdWU6IHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJmaWxlRHJhZ0FyZWFQbGFjZWhvbGRlclwiKSB9KSBkcmFnQXJlYVBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgdGl0bGUgdmFsdWUuXG4gICAqL1xuICBnZXQgaW5wdXRUaXRsZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmlzVXBsb2FkaW5nKSByZXR1cm4gdGhpcy5sb2FkaW5nRmlsZVRpdGxlO1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSkgcmV0dXJuIHRoaXMuY2hvb3NlRmlsZVRpdGxlO1xuICAgIHJldHVybiBcIiBcIjtcbiAgfVxuICAvKipcbiAgICogQ2xlYXIgdmFsdWUgcHJvZ3JhbW1hdGljYWxseS5cbiAgICovXG4gIHB1YmxpYyBjbGVhcihkb25lQ2FsbGJhY2s/OiAoKSA9PiB2b2lkKSB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSkgcmV0dXJuO1xuICAgIHRoaXMuc3VydmV5LmNsZWFyRmlsZXMoXG4gICAgICB0aGlzLFxuICAgICAgdGhpcy5uYW1lLFxuICAgICAgdGhpcy52YWx1ZSxcbiAgICAgIG51bGwsXG4gICAgICAoc3RhdHVzLCBkYXRhKSA9PiB7XG4gICAgICAgIGlmIChzdGF0dXMgPT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB0aGlzLmVycm9ycyA9IFtdO1xuICAgICAgICAgICEhZG9uZUNhbGxiYWNrICYmIGRvbmVDYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogUmVtb3ZlIGZpbGUgaXRlbSBwcm9ncmFtbWF0aWNhbGx5LlxuICAgKi9cbiAgcHVibGljIHJlbW92ZUZpbGUoY29udGVudDogeyBuYW1lOiBzdHJpbmcgfSkge1xuICAgIGlmICghdGhpcy5zdXJ2ZXkpIHJldHVybjtcbiAgICB0aGlzLnN1cnZleS5jbGVhckZpbGVzKFxuICAgICAgdGhpcyxcbiAgICAgIHRoaXMubmFtZSxcbiAgICAgIHRoaXMudmFsdWUsXG4gICAgICBjb250ZW50Lm5hbWUsXG4gICAgICAoc3RhdHVzLCBkYXRhKSA9PiB7XG4gICAgICAgIGlmIChzdGF0dXMgPT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgdmFyIG9sZFZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvbGRWYWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBvbGRWYWx1ZS5maWx0ZXIoKGYpID0+IGYubmFtZSAhPT0gY29udGVudC5uYW1lKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBMb2FkIG11bHRpcGxlIGZpbGVzIHByb2dyYW1tYXRpY2FsbHkuXG4gICAqIEBwYXJhbSBmaWxlc1xuICAgKi9cbiAgcHVibGljIGxvYWRGaWxlcyhmaWxlczogRmlsZVtdKSB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmVycm9ycyA9IFtdO1xuICAgIGlmICghdGhpcy5hbGxGaWxlc09rKGZpbGVzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGVDaGFuZ2VkKFwibG9hZGluZ1wiKTtcblxuICAgIHZhciBsb2FkRmlsZXNQcm9jID0gKCkgPT4ge1xuICAgICAgdmFyIGNvbnRlbnQgPSA8QXJyYXk8YW55Pj5bXTtcbiAgICAgIGlmICh0aGlzLnN0b3JlRGF0YUFzVGV4dCkge1xuICAgICAgICBmaWxlcy5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICAgICAgbGV0IGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICAgIGZpbGVSZWFkZXIub25sb2FkID0gKGUpID0+IHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LmNvbmNhdChbXG4gICAgICAgICAgICAgIHsgbmFtZTogZmlsZS5uYW1lLCB0eXBlOiBmaWxlLnR5cGUsIGNvbnRlbnQ6IGZpbGVSZWFkZXIucmVzdWx0IH0sXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIGlmIChjb250ZW50Lmxlbmd0aCA9PT0gZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHRoaXMudmFsdWUgPSAodGhpcy52YWx1ZSB8fCBbXSkuY29uY2F0KGNvbnRlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgZmlsZVJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLnN1cnZleSkge1xuICAgICAgICAgIHRoaXMuc3VydmV5LnVwbG9hZEZpbGVzKHRoaXMsIHRoaXMubmFtZSwgZmlsZXMsIChzdGF0dXMsIGRhdGEpID0+IHtcbiAgICAgICAgICAgIGlmIChzdGF0dXMgPT09IFwiZXJyb3JcIikge1xuICAgICAgICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlZChcImVycm9yXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9ICh0aGlzLnZhbHVlIHx8IFtdKS5jb25jYXQoXG4gICAgICAgICAgICAgICAgZGF0YS5tYXAoKHI6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogci5maWxlLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IHIuZmlsZS50eXBlLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiByLmNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGlmICh0aGlzLmFsbG93TXVsdGlwbGUpIHtcbiAgICAgIGxvYWRGaWxlc1Byb2MoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jbGVhcihsb2FkRmlsZXNQcm9jKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGNhblByZXZpZXdJbWFnZShmaWxlSXRlbTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYWxsb3dJbWFnZXNQcmV2aWV3ICYmICEhZmlsZUl0ZW0gJiYgdGhpcy5pc0ZpbGVJbWFnZShmaWxlSXRlbSk7XG4gIH1cbiAgcHJvdGVjdGVkIHNldFF1ZXN0aW9uVmFsdWUobmV3VmFsdWU6IGFueSwgdXBkYXRlSXNBbnN3ZXJlZDogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBzdXBlci5zZXRRdWVzdGlvblZhbHVlKG5ld1ZhbHVlLCB1cGRhdGVJc0Fuc3dlcmVkKTtcbiAgICB0aGlzLnByZXZpZXdWYWx1ZSA9IFtdO1xuICAgIHZhciBzdGF0ZSA9XG4gICAgICAoIUFycmF5LmlzQXJyYXkobmV3VmFsdWUpICYmICEhbmV3VmFsdWUpIHx8XG4gICAgICAoQXJyYXkuaXNBcnJheShuZXdWYWx1ZSkgJiYgbmV3VmFsdWUubGVuZ3RoID4gMClcbiAgICAgICAgPyB0aGlzLnNob3dQcmV2aWV3XG4gICAgICAgICAgPyBcImxvYWRpbmdcIlxuICAgICAgICAgIDogXCJsb2FkZWRcIlxuICAgICAgICA6IFwiZW1wdHlcIjtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlZChzdGF0ZSk7XG4gICAgaWYgKCF0aGlzLnNob3dQcmV2aWV3IHx8ICFuZXdWYWx1ZSkgcmV0dXJuO1xuICAgIHZhciBuZXdWYWx1ZXMgPSBBcnJheS5pc0FycmF5KG5ld1ZhbHVlKVxuICAgICAgPyBuZXdWYWx1ZVxuICAgICAgOiAhIW5ld1ZhbHVlXG4gICAgICAgID8gW25ld1ZhbHVlXVxuICAgICAgICA6IFtdO1xuXG4gICAgaWYgKHRoaXMuc3RvcmVEYXRhQXNUZXh0KSB7XG4gICAgICBuZXdWYWx1ZXMuZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgICAgdmFyIGNvbnRlbnQgPSB2YWx1ZS5jb250ZW50IHx8IHZhbHVlO1xuICAgICAgICB0aGlzLnByZXZpZXdWYWx1ZSA9IHRoaXMucHJldmlld1ZhbHVlLmNvbmNhdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogdmFsdWUubmFtZSxcbiAgICAgICAgICAgIHR5cGU6IHZhbHVlLnR5cGUsXG4gICAgICAgICAgICBjb250ZW50OiBjb250ZW50LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgfSk7XG4gICAgICBpZiAoc3RhdGUgPT09IFwibG9hZGluZ1wiKSB0aGlzLnN0YXRlQ2hhbmdlZChcImxvYWRlZFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3VmFsdWVzLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICAgIHZhciBjb250ZW50ID0gdmFsdWUuY29udGVudCB8fCB2YWx1ZTtcbiAgICAgICAgaWYgKHRoaXMuc3VydmV5KSB7XG4gICAgICAgICAgdGhpcy5zdXJ2ZXkuZG93bmxvYWRGaWxlKHRoaXMubmFtZSwgdmFsdWUsIChzdGF0dXMsIGRhdGEpID0+IHtcbiAgICAgICAgICAgIGlmIChzdGF0dXMgPT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgICAgIHRoaXMucHJldmlld1ZhbHVlID0gdGhpcy5wcmV2aWV3VmFsdWUuY29uY2F0KFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBjb250ZW50OiBkYXRhLFxuICAgICAgICAgICAgICAgICAgbmFtZTogdmFsdWUubmFtZSxcbiAgICAgICAgICAgICAgICAgIHR5cGU6IHZhbHVlLnR5cGUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgIGlmICh0aGlzLnByZXZpZXdWYWx1ZS5sZW5ndGggPT09IG5ld1ZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlZChcImxvYWRlZFwiKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZWQoXCJlcnJvclwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBvbkNoZWNrRm9yRXJyb3JzKFxuICAgIGVycm9yczogQXJyYXk8U3VydmV5RXJyb3I+LFxuICAgIGlzT25WYWx1ZUNoYW5nZWQ6IGJvb2xlYW5cbiAgKSB7XG4gICAgc3VwZXIub25DaGVja0ZvckVycm9ycyhlcnJvcnMsIGlzT25WYWx1ZUNoYW5nZWQpO1xuICAgIGlmICh0aGlzLmlzVXBsb2FkaW5nICYmIHRoaXMud2FpdEZvclVwbG9hZCkge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIG5ldyBVcGxvYWRpbmdGaWxlRXJyb3IoXG4gICAgICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcInVwbG9hZGluZ0ZpbGVcIiksXG4gICAgICAgICAgdGhpc1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgc3RhdGVDaGFuZ2VkKHN0YXRlOiBzdHJpbmcpIHtcbiAgICBpZiAoc3RhdGUgPT09IFwibG9hZGluZ1wiKSB7XG4gICAgICB0aGlzLmlzVXBsb2FkaW5nID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHN0YXRlID09PSBcImxvYWRlZFwiKSB7XG4gICAgICB0aGlzLmlzVXBsb2FkaW5nID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChzdGF0ZSA9PT0gXCJlcnJvclwiKSB7XG4gICAgICB0aGlzLmlzVXBsb2FkaW5nID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuY3VycmVudFN0YXRlID0gc3RhdGU7XG4gICAgdGhpcy5vblN0YXRlQ2hhbmdlZC5maXJlKHRoaXMsIHsgc3RhdGU6IHN0YXRlIH0pO1xuICB9XG4gIHByaXZhdGUgYWxsRmlsZXNPayhmaWxlczogRmlsZVtdKTogYm9vbGVhbiB7XG4gICAgdmFyIGVycm9yTGVuZ3RoID0gdGhpcy5lcnJvcnMgPyB0aGlzLmVycm9ycy5sZW5ndGggOiAwO1xuICAgIChmaWxlcyB8fCBbXSkuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgaWYgKHRoaXMubWF4U2l6ZSA+IDAgJiYgZmlsZS5zaXplID4gdGhpcy5tYXhTaXplKSB7XG4gICAgICAgIHRoaXMuZXJyb3JzLnB1c2gobmV3IEV4Y2VlZFNpemVFcnJvcih0aGlzLm1heFNpemUsIHRoaXMpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZXJyb3JMZW5ndGggPT09IHRoaXMuZXJyb3JzLmxlbmd0aDtcbiAgfVxuICBwcml2YXRlIGlzRmlsZUltYWdlKGZpbGU6IHtcbiAgICBjb250ZW50OiBzdHJpbmcsXG4gICAgbmFtZT86IHN0cmluZyxcbiAgICB0eXBlPzogc3RyaW5nLFxuICB9KTogYm9vbGVhbiB7XG4gICAgaWYgKCFmaWxlKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgaW1hZ2VQcmVmaXggPSBcImRhdGE6aW1hZ2VcIjtcbiAgICB2YXIgc3ViU3RyID0gZmlsZS5jb250ZW50ICYmIGZpbGUuY29udGVudC5zdWJzdHIoMCwgaW1hZ2VQcmVmaXgubGVuZ3RoKTtcbiAgICBzdWJTdHIgPSBzdWJTdHIgJiYgc3ViU3RyLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIHJlc3VsdCA9XG4gICAgICBzdWJTdHIgPT09IGltYWdlUHJlZml4IHx8XG4gICAgICAoISFmaWxlLnR5cGUgJiYgZmlsZS50eXBlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihcImltYWdlL1wiKSA9PT0gMCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwdWJsaWMgZ2V0UGxhaW5EYXRhKFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIGluY2x1ZGVFbXB0eT86IGJvb2xlYW4sXG4gICAgICBjYWxjdWxhdGlvbnM/OiBBcnJheTx7XG4gICAgICAgIHByb3BlcnR5TmFtZTogc3RyaW5nLFxuICAgICAgfT4sXG4gICAgfSA9IHtcbiAgICAgIGluY2x1ZGVFbXB0eTogdHJ1ZSxcbiAgICB9XG4gICkge1xuICAgIHZhciBxdWVzdGlvblBsYWluRGF0YSA9IHN1cGVyLmdldFBsYWluRGF0YShvcHRpb25zKTtcbiAgICBpZiAoISFxdWVzdGlvblBsYWluRGF0YSAmJiAhdGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgIHF1ZXN0aW9uUGxhaW5EYXRhLmlzTm9kZSA9IGZhbHNlO1xuICAgICAgdmFyIHZhbHVlcyA9IEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkgPyB0aGlzLnZhbHVlIDogW3RoaXMudmFsdWVdO1xuICAgICAgcXVlc3Rpb25QbGFpbkRhdGEuZGF0YSA9IHZhbHVlcy5tYXAoKGRhdGFWYWx1ZSwgaW5kZXgpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBpbmRleCxcbiAgICAgICAgICB0aXRsZTogXCJGaWxlXCIsXG4gICAgICAgICAgdmFsdWU6IChkYXRhVmFsdWUuY29udGVudCAmJiBkYXRhVmFsdWUuY29udGVudCkgfHwgZGF0YVZhbHVlLFxuICAgICAgICAgIGRpc3BsYXlWYWx1ZTogKGRhdGFWYWx1ZS5uYW1lICYmIGRhdGFWYWx1ZS5uYW1lKSB8fCBkYXRhVmFsdWUsXG4gICAgICAgICAgZ2V0U3RyaW5nOiAodmFsOiBhbnkpID0+XG4gICAgICAgICAgICB0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiID8gSlNPTi5zdHJpbmdpZnkodmFsKSA6IHZhbCxcbiAgICAgICAgICBpc05vZGU6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBxdWVzdGlvblBsYWluRGF0YTtcbiAgfVxuICBwdWJsaWMgc3VwcG9ydENvbW1lbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIGdldENob29zZUZpbGVDc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmV3IENzc0NsYXNzQnVpbGRlcigpXG4gICAgICAuYXBwZW5kKHRoaXMuY3NzQ2xhc3Nlcy5jaG9vc2VGaWxlKVxuICAgICAgLmFwcGVuZCh0aGlzLmNzc0NsYXNzZXMuY29udHJvbERpc2FibGVkLCB0aGlzLmlzUmVhZE9ubHkpXG4gICAgICAudG9TdHJpbmcoKTtcbiAgfVxuICBwdWJsaWMgZ2V0UmVhZE9ubHlGaWxlQ3NzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5ldyBDc3NDbGFzc0J1aWxkZXIoKVxuICAgICAgLmFwcGVuZChcImZvcm0tY29udHJvbFwiKVxuICAgICAgLmFwcGVuZCh0aGlzLmNzc0NsYXNzZXMucGxhY2Vob2xkZXJJbnB1dClcbiAgICAgIC50b1N0cmluZygpO1xuICB9XG4gIHB1YmxpYyBnZXRGaWxlRGVjb3JhdG9yQ3NzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5ldyBDc3NDbGFzc0J1aWxkZXIoKVxuICAgICAgLmFwcGVuZCh0aGlzLmNzc0NsYXNzZXMuZmlsZURlY29yYXRvcilcbiAgICAgIC5hcHBlbmQodGhpcy5jc3NDbGFzc2VzLmZpbGVEZWNvcmF0b3JEcmFnLCB0aGlzLmlzRHJhZ2dpbmcpXG4gICAgICAudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHByaXZhdGUgb25DaGFuZ2Uoc3JjOiBhbnkpIHtcbiAgICBpZiAoISg8YW55PndpbmRvdylbXCJGaWxlUmVhZGVyXCJdKSByZXR1cm47XG4gICAgaWYgKCFzcmMgfHwgIXNyYy5maWxlcyB8fCBzcmMuZmlsZXMubGVuZ3RoIDwgMSkgcmV0dXJuO1xuICAgIGxldCBmaWxlcyA9IFtdO1xuICAgIGxldCBhbGxvd0NvdW50ID0gdGhpcy5hbGxvd011bHRpcGxlID8gc3JjLmZpbGVzLmxlbmd0aCA6IDE7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxvd0NvdW50OyBpKyspIHtcbiAgICAgIGZpbGVzLnB1c2goc3JjLmZpbGVzW2ldKTtcbiAgICB9XG4gICAgc3JjLnZhbHVlID0gXCJcIjtcbiAgICB0aGlzLmxvYWRGaWxlcyhmaWxlcyk7XG4gIH1cbiAgLy8jcmVnaW9uXG4gIC8vIHdlYi1iYXNlZCBtZXRob2RzXG4gIG9uRHJhZ092ZXIgPSAoZXZlbnQ6IGFueSkgPT4ge1xuICAgIGlmICh0aGlzLmlzSW5wdXRSZWFkT25seSkge1xuICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTtcbiAgICBldmVudC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9IFwiY29weVwiO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cbiAgb25Ecm9wID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICBpZiAoIXRoaXMuaXNJbnB1dFJlYWRPbmx5KSB7XG4gICAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBsZXQgc3JjID0gZXZlbnQuZGF0YVRyYW5zZmVyO1xuICAgICAgdGhpcy5vbkNoYW5nZShzcmMpO1xuICAgIH1cbiAgfVxuICBvbkRyYWdMZWF2ZSA9IChldmVudDogYW55KSA9PiB7XG4gICAgaWYgKCF0aGlzLmlzSW5wdXRSZWFkT25seSkge1xuICAgICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIGRvQ2hhbmdlID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICB2YXIgc3JjID0gZXZlbnQudGFyZ2V0IHx8IGV2ZW50LnNyY0VsZW1lbnQ7XG4gICAgdGhpcy5vbkNoYW5nZShzcmMpO1xuICB9XG4gIGRvQ2xlYW4gPSAoZXZlbnQ6IGFueSkgPT4ge1xuICAgIHZhciBzcmMgPSBldmVudC50YXJnZXQgfHwgZXZlbnQuc3JjRWxlbWVudDtcbiAgICBpZiAodGhpcy5uZWVkQ29uZmlybVJlbW92ZUZpbGUpIHtcbiAgICAgIHZhciBpc0NvbmZpcm1lZCA9IGNvbmZpcm1BY3Rpb24odGhpcy5jb25maXJtUmVtb3ZlQWxsTWVzc2FnZSk7XG4gICAgICBpZiAoIWlzQ29uZmlybWVkKSByZXR1cm47XG4gICAgfVxuICAgIHNyYy5wYXJlbnRFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJpbnB1dFwiKVswXS52YWx1ZSA9IFwiXCI7XG4gICAgdGhpcy5jbGVhcigpO1xuICB9XG4gIGRvUmVtb3ZlRmlsZShkYXRhOiBhbnkpIHtcbiAgICBpZiAodGhpcy5uZWVkQ29uZmlybVJlbW92ZUZpbGUpIHtcbiAgICAgIHZhciBpc0NvbmZpcm1lZCA9IGNvbmZpcm1BY3Rpb24oXG4gICAgICAgIHRoaXMuZ2V0Q29uZmlybVJlbW92ZU1lc3NhZ2UoZGF0YS5uYW1lKVxuICAgICAgKTtcbiAgICAgIGlmICghaXNDb25maXJtZWQpIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yZW1vdmVGaWxlKGRhdGEpO1xuICB9XG4gIGRvRG93bmxvYWRGaWxlID0gKGV2ZW50OiBhbnksIGRhdGE6IGFueSkgPT4ge1xuICAgIGlmIChkZXRlY3RJRU9yRWRnZSgpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgbG9hZEZpbGVGcm9tQmFzZTY0KGRhdGEuY29udGVudCwgZGF0YS5uYW1lKTtcbiAgICB9XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG59XG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImZpbGVcIixcbiAgW1xuICAgIHsgbmFtZTogXCJoYXNDb21tZW50OnN3aXRjaFwiLCBsYXlvdXQ6IFwicm93XCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImNvbW1lbnRUZXh0XCIsXG4gICAgICBkZXBlbmRzT246IFwiaGFzQ29tbWVudFwiLFxuICAgICAgdmlzaWJsZUlmOiBmdW5jdGlvbihvYmo6IGFueSkge1xuICAgICAgICByZXR1cm4gb2JqLmhhc0NvbW1lbnQ7XG4gICAgICB9LFxuICAgICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0NvbW1lbnRUZXh0XCIsXG4gICAgICBsYXlvdXQ6IFwicm93XCIsXG4gICAgfSxcbiAgICB7IG5hbWU6IFwic2hvd1ByZXZpZXc6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgXCJhbGxvd011bHRpcGxlOmJvb2xlYW5cIixcbiAgICB7IG5hbWU6IFwiYWxsb3dJbWFnZXNQcmV2aWV3OmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIFwiaW1hZ2VIZWlnaHRcIixcbiAgICBcImltYWdlV2lkdGhcIixcbiAgICBcImFjY2VwdGVkVHlwZXNcIixcbiAgICB7IG5hbWU6IFwic3RvcmVEYXRhQXNUZXh0OmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIHsgbmFtZTogXCJ3YWl0Rm9yVXBsb2FkOmJvb2xlYW5cIiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwibWF4U2l6ZTpudW1iZXJcIiwgZGVmYXVsdDogMCB9LFxuICAgIHsgbmFtZTogXCJkZWZhdWx0VmFsdWVcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwiY29ycmVjdEFuc3dlclwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJ2YWxpZGF0b3JzXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcIm5lZWRDb25maXJtUmVtb3ZlRmlsZTpib29sZWFuXCIgfSxcbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvbkZpbGVNb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJxdWVzdGlvblwiXG4pO1xuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJmaWxlXCIsIChuYW1lKSA9PiB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25GaWxlTW9kZWwobmFtZSk7XG59KTtcbiIsImltcG9ydCB7IFF1ZXN0aW9uTm9uVmFsdWUgfSBmcm9tIFwiLi9xdWVzdGlvbm5vbnZhbHVlXCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgaHRtbCBxdWVzdGlvbi4gVW5saWtlIG90aGVyIHF1ZXN0aW9ucyBpdCBkb2Vzbid0IGhhdmUgdmFsdWUgYW5kIHRpdGxlLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25IdG1sTW9kZWwgZXh0ZW5kcyBRdWVzdGlvbk5vblZhbHVlIHtcbiAgcHVibGljIGlnbm9yZUh0bWxQcm9ncmVzc2luZzogYm9vbGVhbjtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdmFyIGxvY0h0bWwgPSB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwiaHRtbFwiLCB0aGlzKTtcbiAgICBsb2NIdG1sLm9uR2V0VGV4dENhbGxiYWNrID0gKHN0cjogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICAgIHJldHVybiAhIXRoaXMuc3VydmV5ICYmICF0aGlzLmlnbm9yZUh0bWxQcm9ncmVzc2luZ1xuICAgICAgICA/IHRoaXMuc3VydmV5LnByb2Nlc3NIdG1sKHN0cilcbiAgICAgICAgOiBzdHI7XG4gICAgfTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImh0bWxcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzQ29tcG9zaXRlUXVlc3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIGdldFByb2Nlc3NlZFRleHQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5pZ25vcmVIdG1sUHJvZ3Jlc3NpbmcpIHJldHVybiB0ZXh0O1xuICAgIHJldHVybiBzdXBlci5nZXRQcm9jZXNzZWRUZXh0KHRleHQpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaHRtbCB0byBkaXNwbGF5IGl0XG4gICAqL1xuICBwdWJsaWMgZ2V0IGh0bWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJodG1sXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaHRtbCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiaHRtbFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NIdG1sKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImh0bWxcIik7XG4gIH1cbiAgcHVibGljIGdldCBwcm9jZXNzZWRIdG1sKCkge1xuICAgIHJldHVybiB0aGlzLnN1cnZleSA/IHRoaXMuc3VydmV5LnByb2Nlc3NIdG1sKHRoaXMuaHRtbCkgOiB0aGlzLmh0bWw7XG4gIH1cbn1cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwiaHRtbFwiLFxuICBbeyBuYW1lOiBcImh0bWw6aHRtbFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jSHRtbFwiIH1dLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uSHRtbE1vZGVsKFwiXCIpO1xuICB9LFxuICBcIm5vbnZhbHVlXCJcbik7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImh0bWxcIiwgbmFtZSA9PiB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25IdG1sTW9kZWwobmFtZSk7XG59KTtcbiIsImltcG9ydCB7IFF1ZXN0aW9uTm9uVmFsdWUgfSBmcm9tIFwiLi9xdWVzdGlvbm5vbnZhbHVlXCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgaW1hZ2UgcXVlc3Rpb24uIFRoaXMgcXVlc3Rpb24gaGFzbid0IGFueSBmdW5jdGlvbmFsaXR5IGFuZCBjYW4gYmUgdXNlZCB0byBpbXByb3ZlIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSBzdXJ2ZXkuXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkltYWdlTW9kZWwgZXh0ZW5kcyBRdWVzdGlvbk5vblZhbHVlIHtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImltYWdlTGlua1wiLCB0aGlzLCBmYWxzZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInRleHRcIiwgdGhpcywgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiaW1hZ2VcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzQ29tcG9zaXRlUXVlc3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaW1hZ2UgVVJMLlxuICAgKi9cbiAgcHVibGljIGdldCBpbWFnZUxpbmsoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJpbWFnZUxpbmtcIik7XG4gIH1cbiAgcHVibGljIHNldCBpbWFnZUxpbmsodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImltYWdlTGlua1wiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NJbWFnZUxpbmsoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiaW1hZ2VMaW5rXCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaW1hZ2UgYWx0IHRleHQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJ0ZXh0XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidGV4dFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInRleHRcIik7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpbWFnZSBoZWlnaHQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGltYWdlSGVpZ2h0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImltYWdlSGVpZ2h0XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaW1hZ2VIZWlnaHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpbWFnZUhlaWdodFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaW1hZ2Ugd2lkdGguXG4gICAqL1xuICBwdWJsaWMgZ2V0IGltYWdlV2lkdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaW1hZ2VXaWR0aFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGltYWdlV2lkdGgodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpbWFnZVdpZHRoXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpbWFnZSBmaXQgbW9kZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW1hZ2VGaXQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaW1hZ2VGaXRcIik7XG4gIH1cbiAgcHVibGljIHNldCBpbWFnZUZpdCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImltYWdlRml0XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IG1vZGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbnRlbnRNb2RlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbnRlbnRNb2RlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29udGVudE1vZGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb250ZW50TW9kZVwiLCB2YWwpO1xuICAgIGlmICh2YWwgPT09IFwidmlkZW9cIikge1xuICAgICAgdGhpcy5zaG93TGFiZWwgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImltYWdlXCIsXG4gIFtcbiAgICB7IG5hbWU6IFwiaW1hZ2VMaW5rXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NJbWFnZUxpbmtcIiB9LFxuICAgIHsgbmFtZTogXCJ0ZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NUZXh0XCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImNvbnRlbnRNb2RlXCIsXG4gICAgICBkZWZhdWx0OiBcImltYWdlXCIsXG4gICAgICBjaG9pY2VzOiBbXCJpbWFnZVwiLCBcInZpZGVvXCJdLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJpbWFnZUZpdFwiLFxuICAgICAgZGVmYXVsdDogXCJjb250YWluXCIsXG4gICAgICBjaG9pY2VzOiBbXCJub25lXCIsIFwiY29udGFpblwiLCBcImNvdmVyXCIsIFwiZmlsbFwiXSxcbiAgICB9LFxuICAgIHsgbmFtZTogXCJpbWFnZUhlaWdodDpudW1iZXJcIiwgZGVmYXVsdDogMTUwLCBtaW5WYWx1ZTogMCB9LFxuICAgIHsgbmFtZTogXCJpbWFnZVdpZHRoOm51bWJlclwiLCBkZWZhdWx0OiAyMDAsIG1pblZhbHVlOiAwIH0sXG4gIF0sXG4gIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uSW1hZ2VNb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJub252YWx1ZVwiXG4pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImltYWdlXCIsIChuYW1lKSA9PiB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25JbWFnZU1vZGVsKG5hbWUpO1xufSk7XG4iLCJpbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkNoZWNrYm94QmFzZSB9IGZyb20gXCIuL3F1ZXN0aW9uX2Jhc2VzZWxlY3RcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IElMb2NhbGl6YWJsZU93bmVyLCBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5cbmV4cG9ydCBjbGFzcyBJbWFnZUl0ZW1WYWx1ZSBleHRlbmRzIEl0ZW1WYWx1ZSBpbXBsZW1lbnRzIElMb2NhbGl6YWJsZU93bmVyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgdmFsdWU6IGFueSxcbiAgICB0ZXh0OiBzdHJpbmcgPSBudWxsLFxuICAgIHByb3RlY3RlZCB0eXBlTmFtZSA9IFwiaW1hZ2VpdGVtdmFsdWVcIlxuICApIHtcbiAgICBzdXBlcih2YWx1ZSwgdGV4dCwgdHlwZU5hbWUpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJpbWFnZUxpbmtcIiwgdGhpcywgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICEhdGhpcy50eXBlTmFtZSA/IHRoaXMudHlwZU5hbWUgOiBcIml0ZW12YWx1ZVwiO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaW1hZ2Ugb3IgdmlkZW8gbGluayBwcm9wZXJ0eS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW1hZ2VMaW5rKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiaW1hZ2VMaW5rXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaW1hZ2VMaW5rKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJpbWFnZUxpbmtcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jSW1hZ2VMaW5rKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImltYWdlTGlua1wiKTtcbiAgfVxuICBnZXRMb2NhbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gISF0aGlzLmxvY093bmVyID8gdGhpcy5sb2NPd25lci5nZXRMb2NhbGUoKSA6IFwiXCI7XG4gIH1cbiAgZ2V0TWFya2Rvd25IdG1sKHRleHQ6IHN0cmluZywgbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gISF0aGlzLmxvY093bmVyID8gdGhpcy5sb2NPd25lci5nZXRNYXJrZG93bkh0bWwodGV4dCwgbmFtZSkgOiB0ZXh0O1xuICB9XG4gIGdldFJlbmRlcmVyKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuICEhdGhpcy5sb2NPd25lciA/IHRoaXMubG9jT3duZXIuZ2V0UmVuZGVyZXIobmFtZSkgOiBudWxsO1xuICB9XG4gIGdldFJlbmRlcmVyQ29udGV4dChsb2NTdHI6IExvY2FsaXphYmxlU3RyaW5nKTogYW55IHtcbiAgICByZXR1cm4gISF0aGlzLmxvY093bmVyID8gdGhpcy5sb2NPd25lci5nZXRSZW5kZXJlckNvbnRleHQobG9jU3RyKSA6IGxvY1N0cjtcbiAgfVxuICBnZXRQcm9jZXNzZWRUZXh0KHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuICEhdGhpcy5sb2NPd25lciA/IHRoaXMubG9jT3duZXIuZ2V0UHJvY2Vzc2VkVGV4dCh0ZXh0KSA6IHRleHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIHNlbGVjdCBpbWFnZSBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uSW1hZ2VQaWNrZXJNb2RlbCBleHRlbmRzIFF1ZXN0aW9uQ2hlY2tib3hCYXNlIHtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5jb2xDb3VudCA9IDA7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJpbWFnZXBpY2tlclwiO1xuICB9XG4gIHN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzU2luZ2xlSW5wdXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBnZXRJdGVtVmFsdWVUeXBlKCkge1xuICAgIHJldHVybiBcImltYWdlaXRlbXZhbHVlXCI7XG4gIH1cbiAgcHVibGljIGdldCBpc0NvbXBvc2l0ZVF1ZXN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBzdXBwb3J0T3RoZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBzdXBwb3J0Tm9uZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIE11bHRpIHNlbGVjdCBvcHRpb24uIElmIHNldCB0byB0cnVlLCB0aGVuIGFsbG93cyB0byBzZWxlY3QgbXVsdGlwbGUgaW1hZ2VzLlxuICAgKi9cbiAgcHVibGljIGdldCBtdWx0aVNlbGVjdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibXVsdGlTZWxlY3RcIik7XG4gIH1cbiAgcHVibGljIHNldCBtdWx0aVNlbGVjdChuZXdWYWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm11bHRpU2VsZWN0XCIsIG5ld1ZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGl0ZW0gaXMgY2hlY2tlZFxuICAgKiBAcGFyYW0gaXRlbSBpbWFnZSBwaWNrZXIgaXRlbSB2YWx1ZVxuICAgKi9cbiAgcHVibGljIGlzSXRlbVNlbGVjdGVkKGl0ZW06IEl0ZW1WYWx1ZSk6IGJvb2xlYW4ge1xuICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICAgIGlmICh0aGlzLmlzVmFsdWVFbXB0eSh2YWwpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCF0aGlzLm11bHRpU2VsZWN0KSByZXR1cm4gdGhpcy5pc1R3b1ZhbHVlRXF1YWxzKHZhbCwgaXRlbS52YWx1ZSk7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbCkpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuaXNUd29WYWx1ZUVxdWFscyh2YWxbaV0sIGl0ZW0udmFsdWUpKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBjbGVhckluY29ycmVjdFZhbHVlcygpIHtcbiAgICBpZiAodGhpcy5tdWx0aVNlbGVjdCkge1xuICAgICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgICBpZiAoIXZhbCkgcmV0dXJuO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbCkgfHwgdmFsLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIHRoaXMuY2xlYXJWYWx1ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgbmV3VmFsdWUgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghdGhpcy5oYXNVbmtub3duVmFsdWUodmFsW2ldLCB0cnVlKSkge1xuICAgICAgICAgIG5ld1ZhbHVlLnB1c2godmFsW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA9PSB2YWwubGVuZ3RoKSByZXR1cm47XG4gICAgICBpZiAobmV3VmFsdWUubGVuZ3RoID09IDApIHtcbiAgICAgICAgdGhpcy5jbGVhclZhbHVlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1cGVyLmNsZWFySW5jb3JyZWN0VmFsdWVzKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgbGFiZWwgdW5kZXIgdGhlIGltYWdlLlxuICAgKi9cbiAgcHVibGljIGdldCBzaG93TGFiZWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dMYWJlbFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dMYWJlbChuZXdWYWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dMYWJlbFwiLCBuZXdWYWx1ZSk7XG4gIH1cbiAgZW5kTG9hZGluZ0Zyb21Kc29uKCkge1xuICAgIHN1cGVyLmVuZExvYWRpbmdGcm9tSnNvbigpO1xuICAgIGlmICghdGhpcy5pc0Rlc2lnbk1vZGUgJiYgdGhpcy5tdWx0aVNlbGVjdCkge1xuICAgICAgdGhpcy5jcmVhdGVOZXdBcnJheShcInJlbmRlcmVkVmFsdWVcIik7XG4gICAgICB0aGlzLmNyZWF0ZU5ld0FycmF5KFwidmFsdWVcIik7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBnZXRWYWx1ZUNvcmUoKSB7XG4gICAgdmFyIHZhbHVlID0gc3VwZXIuZ2V0VmFsdWVDb3JlKCk7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMubXVsdGlTZWxlY3QpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHByaXZhdGUgY29udmVydFZhbFRvQXJyYXlGb3JNdWx0U2VsZWN0KHZhbDogYW55KTogYW55IHtcbiAgICBpZiAoIXRoaXMubXVsdGlTZWxlY3QpIHJldHVybiB2YWw7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUVtcHR5KHZhbCkgfHwgQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm4gdmFsO1xuICAgIHJldHVybiBbdmFsXTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyZWRWYWx1ZUZyb21EYXRhQ29yZSh2YWw6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuY29udmVydFZhbFRvQXJyYXlGb3JNdWx0U2VsZWN0KHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRyZWRWYWx1ZVRvRGF0YUNvcmUodmFsOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmNvbnZlcnRWYWxUb0FycmF5Rm9yTXVsdFNlbGVjdCh2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaW1hZ2UgaGVpZ2h0LlxuICAgKi9cbiAgcHVibGljIGdldCBpbWFnZUhlaWdodCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpbWFnZUhlaWdodFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGltYWdlSGVpZ2h0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaW1hZ2VIZWlnaHRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGltYWdlIHdpZHRoLlxuICAgKi9cbiAgcHVibGljIGdldCBpbWFnZVdpZHRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImltYWdlV2lkdGhcIik7XG4gIH1cbiAgcHVibGljIHNldCBpbWFnZVdpZHRoKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaW1hZ2VXaWR0aFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaW1hZ2UgZml0IG1vZGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGltYWdlRml0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImltYWdlRml0XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaW1hZ2VGaXQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpbWFnZUZpdFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgY29udGVudCBtb2RlLlxuICAgKi9cbiAgcHVibGljIGdldCBjb250ZW50TW9kZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb250ZW50TW9kZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbnRlbnRNb2RlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29udGVudE1vZGVcIiwgdmFsKTtcbiAgICBpZiAodmFsID09PSBcInZpZGVvXCIpIHtcbiAgICAgIHRoaXMuc2hvd0xhYmVsID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGNvbnZlcnREZWZhdWx0VmFsdWUodmFsOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgcHVibGljIGdldCBoYXNDb2x1bW5zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImltYWdlaXRlbXZhbHVlXCIsXG4gIFtdLFxuICAodmFsdWU6IGFueSkgPT4gbmV3IEltYWdlSXRlbVZhbHVlKHZhbHVlKSxcbiAgXCJpdGVtdmFsdWVcIlxuKTtcblNlcmlhbGl6ZXIuYWRkUHJvcGVydHkoXCJpbWFnZWl0ZW12YWx1ZVwiLCB7XG4gIG5hbWU6IFwiaW1hZ2VMaW5rXCIsXG4gIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NJbWFnZUxpbmtcIixcbn0pO1xuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImltYWdlcGlja2VyXCIsXG4gIFtcbiAgICB7IG5hbWU6IFwiaGFzT3RoZXJcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwib3RoZXJUZXh0XCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcImhhc05vbmVcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwibm9uZVRleHRcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwib3B0aW9uc0NhcHRpb25cIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwib3RoZXJFcnJvclRleHRcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwic3RvcmVPdGhlcnNBc0NvbW1lbnRcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImNvbnRlbnRNb2RlXCIsXG4gICAgICBkZWZhdWx0OiBcImltYWdlXCIsXG4gICAgICBjaG9pY2VzOiBbXCJpbWFnZVwiLCBcInZpZGVvXCJdLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJpbWFnZUZpdFwiLFxuICAgICAgZGVmYXVsdDogXCJjb250YWluXCIsXG4gICAgICBjaG9pY2VzOiBbXCJub25lXCIsIFwiY29udGFpblwiLCBcImNvdmVyXCIsIFwiZmlsbFwiXSxcbiAgICB9LFxuICAgIHsgbmFtZTogXCJpbWFnZUhlaWdodDpudW1iZXJcIiwgZGVmYXVsdDogMTUwLCBtaW5WYWx1ZTogMCB9LFxuICAgIHsgbmFtZTogXCJpbWFnZVdpZHRoOm51bWJlclwiLCBkZWZhdWx0OiAyMDAsIG1pblZhbHVlOiAwIH0sXG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25JbWFnZVBpY2tlck1vZGVsKFwiXCIpO1xuICB9LFxuICBcImNoZWNrYm94YmFzZVwiXG4pO1xuU2VyaWFsaXplci5hZGRQcm9wZXJ0eShcImltYWdlcGlja2VyXCIsIHtcbiAgbmFtZTogXCJzaG93TGFiZWw6Ym9vbGVhblwiLFxuICBkZWZhdWx0OiBmYWxzZSxcbn0pO1xuU2VyaWFsaXplci5hZGRQcm9wZXJ0eShcImltYWdlcGlja2VyXCIsIHtcbiAgbmFtZTogXCJjb2xDb3VudDpudW1iZXJcIixcbiAgZGVmYXVsdDogMCxcbiAgY2hvaWNlczogWzAsIDEsIDIsIDMsIDQsIDVdLFxufSk7XG5TZXJpYWxpemVyLmFkZFByb3BlcnR5KFwiaW1hZ2VwaWNrZXJcIiwge1xuICBuYW1lOiBcIm11bHRpU2VsZWN0OmJvb2xlYW5cIixcbiAgZGVmYXVsdDogZmFsc2UsXG59KTtcblNlcmlhbGl6ZXIuYWRkUHJvcGVydHkoXCJpbWFnZXBpY2tlclwiLCB7XG4gIG5hbWU6IFwiY2hvaWNlczppbWFnZWl0ZW12YWx1ZVtdXCIsXG59KTtcblxuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJpbWFnZXBpY2tlclwiLCAobmFtZSkgPT4ge1xuICB2YXIgcSA9IG5ldyBRdWVzdGlvbkltYWdlUGlja2VyTW9kZWwobmFtZSk7XG4gIC8vcS5jaG9pY2VzID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRDaG9pY2VzO1xuICByZXR1cm4gcTtcbn0pO1xuIiwiaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25NYXRyaXhCYXNlTW9kZWwgfSBmcm9tIFwiLi9tYXJ0aXhCYXNlXCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0LCBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IFN1cnZleUVycm9yIH0gZnJvbSBcIi4vc3VydmV5LWVycm9yXCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBSZXF1aXJlZEluQWxsUm93c0Vycm9yIH0gZnJvbSBcIi4vZXJyb3JcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcsIElMb2NhbGl6YWJsZU93bmVyIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRHJvcGRvd25Nb2RlbCB9IGZyb20gXCIuL3F1ZXN0aW9uX2Ryb3Bkb3duXCI7XG5pbXBvcnQgeyBJQ29uZGl0aW9uT2JqZWN0IH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IHNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3NcIjtcbmltcG9ydCB7IFN1cnZleU1vZGVsIH0gZnJvbSBcIi4vc3VydmV5XCI7XG5pbXBvcnQgeyBDc3NDbGFzc0J1aWxkZXIgfSBmcm9tIFwiLi91dGlscy9jc3NDbGFzc0J1aWxkZXJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJTWF0cml4RGF0YSB7XG4gIG9uTWF0cml4Um93Q2hhbmdlZChyb3c6IE1hdHJpeFJvd01vZGVsKTogdm9pZDtcbiAgZ2V0Q29ycmVjdGVkUm93VmFsdWUodmFsdWU6IGFueSk6IGFueTtcbn1cblxuZXhwb3J0IGNsYXNzIE1hdHJpeFJvd01vZGVsIGV4dGVuZHMgQmFzZSB7XG4gIHByaXZhdGUgZGF0YTogSU1hdHJpeERhdGE7XG4gIHByaXZhdGUgaXRlbTogSXRlbVZhbHVlO1xuICBwdWJsaWMgY2VsbENsaWNrOiBhbnk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgaXRlbTogSXRlbVZhbHVlLFxuICAgIHB1YmxpYyBmdWxsTmFtZTogc3RyaW5nLFxuICAgIGRhdGE6IElNYXRyaXhEYXRhLFxuICAgIHZhbHVlOiBhbnlcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLml0ZW0gPSBpdGVtO1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuY2VsbENsaWNrID0gKGNvbHVtbjogYW55KSA9PiB7XG4gICAgICB0aGlzLnZhbHVlID0gY29sdW1uLnZhbHVlO1xuICAgIH07XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcInZhbHVlXCIsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmRhdGEpIHRoaXMuZGF0YS5vbk1hdHJpeFJvd0NoYW5nZWQodGhpcyk7XG4gICAgfSk7XG4gIH1cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbS52YWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IHRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtLnRleHQ7XG4gIH1cbiAgcHVibGljIGdldCBsb2NUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtLmxvY1RleHQ7XG4gIH1cbiAgcHVibGljIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidmFsdWVcIik7XG4gIH1cbiAgcHVibGljIHNldCB2YWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgbmV3VmFsdWUgPSB0aGlzLmRhdGEuZ2V0Q29ycmVjdGVkUm93VmFsdWUobmV3VmFsdWUpO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZhbHVlXCIsIG5ld1ZhbHVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHJvd0NsYXNzZXMoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjc3NDbGFzc2VzID0gKDxhbnk+dGhpcy5kYXRhKS5jc3NDbGFzc2VzO1xuICAgIGNvbnN0IGhhc0Vycm9yID0gISEoPGFueT50aGlzLmRhdGEpLmdldEVycm9yQnlUeXBlKFwicmVxdWlyZWRpbmFsbHJvd3NlcnJvclwiKTtcbiAgICByZXR1cm4gbmV3IENzc0NsYXNzQnVpbGRlcigpLmFwcGVuZChjc3NDbGFzc2VzLnJvdylcbiAgICAgIC5hcHBlbmQoY3NzQ2xhc3Nlcy5yb3dFcnJvciwgaGFzRXJyb3IgJiYgdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy52YWx1ZSkpXG4gICAgICAudG9TdHJpbmcoKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNYXRyaXhDZWxsc093bmVyIGV4dGVuZHMgSUxvY2FsaXphYmxlT3duZXIge1xuICBnZXRSb3dzKCk6IEFycmF5PGFueT47XG4gIGdldENvbHVtbnMoKTogQXJyYXk8YW55Pjtcbn1cblxuZXhwb3J0IGNsYXNzIE1hdHJpeENlbGxzIHtcbiAgcHJpdmF0ZSB2YWx1ZXM6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIGNlbGxzT3duZXI6IElNYXRyaXhDZWxsc093bmVyKSB7fVxuICBwdWJsaWMgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMudmFsdWVzKS5sZW5ndGggPT0gMDtcbiAgfVxuICBwdWJsaWMgc2V0Q2VsbFRleHQocm93OiBhbnksIGNvbHVtbjogYW55LCB2YWw6IHN0cmluZykge1xuICAgIHJvdyA9IHRoaXMuZ2V0Q2VsbFJvd0NvbHVtblZhbHVlKHJvdywgdGhpcy5yb3dzKTtcbiAgICBjb2x1bW4gPSB0aGlzLmdldENlbGxSb3dDb2x1bW5WYWx1ZShjb2x1bW4sIHRoaXMuY29sdW1ucyk7XG4gICAgaWYgKCFyb3cgfHwgIWNvbHVtbikgcmV0dXJuO1xuICAgIGlmICh2YWwpIHtcbiAgICAgIGlmICghdGhpcy52YWx1ZXNbcm93XSkgdGhpcy52YWx1ZXNbcm93XSA9IHt9O1xuICAgICAgaWYgKCF0aGlzLnZhbHVlc1tyb3ddW2NvbHVtbl0pXG4gICAgICAgIHRoaXMudmFsdWVzW3Jvd11bY29sdW1uXSA9IHRoaXMuY3JlYXRlU3RyaW5nKCk7XG4gICAgICB0aGlzLnZhbHVlc1tyb3ddW2NvbHVtbl0udGV4dCA9IHZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMudmFsdWVzW3Jvd10gJiYgdGhpcy52YWx1ZXNbcm93XVtjb2x1bW5dKSB7XG4gICAgICAgIHZhciBsb2MgPSB0aGlzLnZhbHVlc1tyb3ddW2NvbHVtbl07XG4gICAgICAgIGxvYy50ZXh0ID0gXCJcIjtcbiAgICAgICAgaWYgKGxvYy5pc0VtcHR5KSB7XG4gICAgICAgICAgZGVsZXRlIHRoaXMudmFsdWVzW3Jvd11bY29sdW1uXTtcbiAgICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy52YWx1ZXNbcm93XSkubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnZhbHVlc1tyb3ddO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgc2V0RGVmYXVsdENlbGxUZXh0KGNvbHVtbjogYW55LCB2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0Q2VsbFRleHQoc2V0dGluZ3MubWF0cml4RGVmYXVsdFJvd05hbWUsIGNvbHVtbiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0Q2VsbExvY1RleHQocm93OiBhbnksIGNvbHVtbjogYW55KTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJvdyA9IHRoaXMuZ2V0Q2VsbFJvd0NvbHVtblZhbHVlKHJvdywgdGhpcy5yb3dzKTtcbiAgICBjb2x1bW4gPSB0aGlzLmdldENlbGxSb3dDb2x1bW5WYWx1ZShjb2x1bW4sIHRoaXMuY29sdW1ucyk7XG4gICAgaWYgKCFyb3cgfHwgIWNvbHVtbikgcmV0dXJuIG51bGw7XG4gICAgaWYgKCF0aGlzLnZhbHVlc1tyb3ddKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIXRoaXMudmFsdWVzW3Jvd11bY29sdW1uXSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzW3Jvd11bY29sdW1uXTtcbiAgfVxuICBwdWJsaWMgZ2V0RGVmYXVsdENlbGxMb2NUZXh0KGNvbHVtbjogYW55LCB2YWw6IHN0cmluZyk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDZWxsTG9jVGV4dChzZXR0aW5ncy5tYXRyaXhEZWZhdWx0Um93TmFtZSwgY29sdW1uKTtcbiAgfVxuICBwdWJsaWMgZ2V0Q2VsbERpc3BsYXlMb2NUZXh0KHJvdzogYW55LCBjb2x1bW46IGFueSk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICB2YXIgY2VsbFRleHQgPSB0aGlzLmdldENlbGxMb2NUZXh0KHJvdywgY29sdW1uKTtcbiAgICBpZiAoY2VsbFRleHQgJiYgIWNlbGxUZXh0LmlzRW1wdHkpIHJldHVybiBjZWxsVGV4dDtcbiAgICBjZWxsVGV4dCA9IHRoaXMuZ2V0Q2VsbExvY1RleHQoc2V0dGluZ3MubWF0cml4RGVmYXVsdFJvd05hbWUsIGNvbHVtbik7XG4gICAgaWYgKGNlbGxUZXh0ICYmICFjZWxsVGV4dC5pc0VtcHR5KSByZXR1cm4gY2VsbFRleHQ7XG4gICAgaWYgKHR5cGVvZiBjb2x1bW4gPT0gXCJudW1iZXJcIikge1xuICAgICAgY29sdW1uID1cbiAgICAgICAgY29sdW1uID49IDAgJiYgY29sdW1uIDwgdGhpcy5jb2x1bW5zLmxlbmd0aFxuICAgICAgICAgID8gdGhpcy5jb2x1bW5zW2NvbHVtbl1cbiAgICAgICAgICA6IG51bGw7XG4gICAgfVxuICAgIGlmIChjb2x1bW4gJiYgY29sdW1uLmxvY1RleHQpIHJldHVybiBjb2x1bW4ubG9jVGV4dDtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgZ2V0Q2VsbFRleHQocm93OiBhbnksIGNvbHVtbjogYW55KTogc3RyaW5nIHtcbiAgICB2YXIgbG9jID0gdGhpcy5nZXRDZWxsTG9jVGV4dChyb3csIGNvbHVtbik7XG4gICAgcmV0dXJuIGxvYyA/IGxvYy5jYWxjdWxhdGVkVGV4dCA6IG51bGw7XG4gIH1cbiAgcHVibGljIGdldERlZmF1bHRDZWxsVGV4dChjb2x1bW46IGFueSk6IHN0cmluZyB7XG4gICAgdmFyIGxvYyA9IHRoaXMuZ2V0Q2VsbExvY1RleHQoc2V0dGluZ3MubWF0cml4RGVmYXVsdFJvd05hbWUsIGNvbHVtbik7XG4gICAgcmV0dXJuIGxvYyA/IGxvYy5jYWxjdWxhdGVkVGV4dCA6IG51bGw7XG4gIH1cbiAgcHVibGljIGdldENlbGxEaXNwbGF5VGV4dChyb3c6IGFueSwgY29sdW1uOiBhbnkpOiBzdHJpbmcge1xuICAgIHZhciBsb2MgPSB0aGlzLmdldENlbGxEaXNwbGF5TG9jVGV4dChyb3csIGNvbHVtbik7XG4gICAgcmV0dXJuIGxvYyA/IGxvYy5jYWxjdWxhdGVkVGV4dCA6IG51bGw7XG4gIH1cbiAgcHVibGljIGdldCByb3dzKCk6IEFycmF5PGFueT4ge1xuICAgIHJldHVybiB0aGlzLmNlbGxzT3duZXIgPyB0aGlzLmNlbGxzT3duZXIuZ2V0Um93cygpIDogW107XG4gIH1cbiAgcHVibGljIGdldCBjb2x1bW5zKCk6IEFycmF5PGFueT4ge1xuICAgIHJldHVybiB0aGlzLmNlbGxzT3duZXIgPyB0aGlzLmNlbGxzT3duZXIuZ2V0Q29sdW1ucygpIDogW107XG4gIH1cbiAgcHJpdmF0ZSBnZXRDZWxsUm93Q29sdW1uVmFsdWUodmFsOiBhbnksIHZhbHVlczogQXJyYXk8YW55Pik6IGFueSB7XG4gICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT0gXCJudW1iZXJcIikge1xuICAgICAgaWYgKHZhbCA8IDAgfHwgdmFsID49IHZhbHVlcy5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgICAgdmFsID0gdmFsdWVzW3ZhbF0udmFsdWU7XG4gICAgfVxuICAgIGlmICh2YWwudmFsdWUpIHJldHVybiB2YWwudmFsdWU7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0SnNvbigpOiBhbnkge1xuICAgIGlmICh0aGlzLmlzRW1wdHkpIHJldHVybiBudWxsO1xuICAgIHZhciByZXM6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIGZvciAodmFyIHJvdyBpbiB0aGlzLnZhbHVlcykge1xuICAgICAgdmFyIHJlc1JvdzogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgICB2YXIgcm93VmFsdWVzID0gdGhpcy52YWx1ZXNbcm93XTtcbiAgICAgIGZvciAodmFyIGNvbCBpbiByb3dWYWx1ZXMpIHtcbiAgICAgICAgcmVzUm93W2NvbF0gPSByb3dWYWx1ZXNbY29sXS5nZXRKc29uKCk7XG4gICAgICB9XG4gICAgICByZXNbcm93XSA9IHJlc1JvdztcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgc2V0SnNvbih2YWx1ZTogYW55KSB7XG4gICAgdGhpcy52YWx1ZXMgPSB7fTtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm47XG4gICAgZm9yICh2YXIgcm93IGluIHZhbHVlKSB7XG4gICAgICBpZiAocm93ID09IFwicG9zXCIpIGNvbnRpbnVlO1xuICAgICAgdmFyIHJvd1ZhbHVlcyA9IHZhbHVlW3Jvd107XG4gICAgICB0aGlzLnZhbHVlc1tyb3ddID0ge307XG4gICAgICBmb3IgKHZhciBjb2wgaW4gcm93VmFsdWVzKSB7XG4gICAgICAgIGlmIChjb2wgPT0gXCJwb3NcIikgY29udGludWU7XG4gICAgICAgIHZhciBsb2MgPSB0aGlzLmNyZWF0ZVN0cmluZygpO1xuICAgICAgICBsb2Muc2V0SnNvbihyb3dWYWx1ZXNbY29sXSk7XG4gICAgICAgIHRoaXMudmFsdWVzW3Jvd11bY29sXSA9IGxvYztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVN0cmluZygpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIG5ldyBMb2NhbGl6YWJsZVN0cmluZyh0aGlzLmNlbGxzT3duZXIsIHRydWUpO1xuICB9XG59XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBzaW1wbGUgbWF0cml4IHF1ZXN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NYXRyaXhNb2RlbFxuICBleHRlbmRzIFF1ZXN0aW9uTWF0cml4QmFzZU1vZGVsPE1hdHJpeFJvd01vZGVsLCBJdGVtVmFsdWU+XG4gIGltcGxlbWVudHMgSU1hdHJpeERhdGEsIElNYXRyaXhDZWxsc093bmVyIHtcbiAgcHJpdmF0ZSBpc1Jvd0NoYW5naW5nID0gZmFsc2U7XG4gIHByaXZhdGUgY2VsbHNWYWx1ZTogTWF0cml4Q2VsbHM7XG5cbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5jZWxsc1ZhbHVlID0gbmV3IE1hdHJpeENlbGxzKHRoaXMpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwiY29sdW1uc1wiLCBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYub25Db2x1bW5zQ2hhbmdlZCgpO1xuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJyb3dzXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFzZWxmLmZpbHRlckl0ZW1zKCkpIHtcbiAgICAgICAgc2VsZi5vblJvd3NDaGFuZ2VkKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcImhpZGVJZlJvd3NFbXB0eVwiLCBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYudXBkYXRlVmlzaWJpbGl0eUJhc2VkT25Sb3dzKCk7XG4gICAgfSk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJtYXRyaXhcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc1NpbmdsZUlucHV0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSwgaWYgeW91IHdhbnQgYSB1c2VyIHRvIGFuc3dlciBhbGwgcm93cy5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNBbGxSb3dSZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNBbGxSb3dSZXF1aXJlZFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBpc0FsbFJvd1JlcXVpcmVkKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzQWxsUm93UmVxdWlyZWRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlLCBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgcm93LlxuICAgKi9cbiAgcHVibGljIGdldCBoYXNSb3dzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJvd3MubGVuZ3RoID4gMDtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gcmVuZGVyIGl0ZW1zIGluIGEgc3BlY2lmaWMgb3JkZXI6IFwicmFuZG9tXCIgb3IgXCJpbml0aWFsXCIuIERlZmF1bHQgaXMgXCJpbml0aWFsXCIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJvd3NPcmRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyb3dzT3JkZXJcIik7XG4gIH1cbiAgcHVibGljIHNldCByb3dzT3JkZXIodmFsOiBzdHJpbmcpIHtcbiAgICB2YWwgPSB2YWwudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAodmFsID09IHRoaXMucm93c09yZGVyKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicm93c09yZGVyXCIsIHZhbCk7XG4gICAgdGhpcy5vblJvd3NDaGFuZ2VkKCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUgdG8gaGlkZSB0aGUgcXVlc3Rpb24gaWYgdGhlcmUgaXMgbm8gdmlzaWJsZSByb3dzIGluIHRoZSBtYXRyaXguXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhpZGVJZlJvd3NFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaGlkZUlmUm93c0VtcHR5XCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGhpZGVJZlJvd3NFbXB0eSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJoaWRlSWZSb3dzRW1wdHlcIiwgdmFsKTtcbiAgfVxuICBnZXRSb3dzKCk6IEFycmF5PGFueT4ge1xuICAgIHJldHVybiB0aGlzLnJvd3M7XG4gIH1cbiAgZ2V0Q29sdW1ucygpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlQ29sdW1ucztcbiAgfVxuICBwdWJsaWMgYWRkQ29sdW1uKHZhbHVlOiBhbnksIHRleHQ/OiBzdHJpbmcpOiBJdGVtVmFsdWUge1xuICAgIHZhciBjb2wgPSBuZXcgSXRlbVZhbHVlKHZhbHVlLCB0ZXh0KTtcbiAgICB0aGlzLmNvbHVtbnMucHVzaChjb2wpO1xuICAgIHJldHVybiBjb2w7XG4gIH1cbiAgcHVibGljIGdldEl0ZW1DbGFzcyhyb3c6IGFueSwgY29sdW1uOiBhbnkpIHtcbiAgICBjb25zdCBpc0NoZWNrZWQgPSByb3cudmFsdWUgPT0gY29sdW1uLnZhbHVlO1xuICAgIGNvbnN0IGlzRGlzYWJsZWQgPSB0aGlzLmlzUmVhZE9ubHk7XG4gICAgY29uc3QgYWxsb3dIb3ZlciA9ICFpc0NoZWNrZWQgJiYgIWlzRGlzYWJsZWQ7XG5cbiAgICByZXR1cm4gbmV3IENzc0NsYXNzQnVpbGRlcigpXG4gICAgICAuYXBwZW5kKHRoaXMuY3NzQ2xhc3Nlcy5jZWxsLCB0aGlzLmhhc0NlbGxUZXh0KVxuICAgICAgLmFwcGVuZCh0aGlzLmhhc0NlbGxUZXh0ID8gdGhpcy5jc3NDbGFzc2VzLmNlbGxUZXh0IDogdGhpcy5jc3NDbGFzc2VzLmxhYmVsKVxuICAgICAgLmFwcGVuZCh0aGlzLmhhc0NlbGxUZXh0ID8gdGhpcy5jc3NDbGFzc2VzLmNlbGxUZXh0U2VsZWN0ZWQgOiB0aGlzLmNzc0NsYXNzZXMuaXRlbUNoZWNrZWQsIGlzQ2hlY2tlZClcbiAgICAgIC5hcHBlbmQodGhpcy5oYXNDZWxsVGV4dCA/IHRoaXMuY3NzQ2xhc3Nlcy5jZWxsVGV4dERpc2FibGVkIDogdGhpcy5jc3NDbGFzc2VzLml0ZW1EaXNhYmxlZCwgaXNEaXNhYmxlZClcbiAgICAgIC5hcHBlbmQodGhpcy5jc3NDbGFzc2VzLml0ZW1Ib3ZlciwgYWxsb3dIb3ZlciAmJiAhdGhpcy5oYXNDZWxsVGV4dClcbiAgICAgIC50b1N0cmluZygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFF1aXpRdWVzdGlvbkNvdW50KCkge1xuICAgIHZhciByZXMgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMuY29ycmVjdEFuc3dlclt0aGlzLnJvd3NbaV0udmFsdWVdKSkgcmVzKys7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJvdGVjdGVkIGdldENvcnJlY3RBbnN3ZXJDb3VudCgpOiBudW1iZXIge1xuICAgIHZhciByZXMgPSAwO1xuICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByb3cgPSB0aGlzLnJvd3NbaV0udmFsdWU7XG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLmlzVmFsdWVFbXB0eSh2YWx1ZVtyb3ddKSAmJlxuICAgICAgICB0aGlzLmlzVHdvVmFsdWVFcXVhbHModGhpcy5jb3JyZWN0QW5zd2VyW3Jvd10sIHZhbHVlW3Jvd10pXG4gICAgICApXG4gICAgICAgIHJlcysrO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFZpc2libGVSb3dzKCk6IEFycmF5PE1hdHJpeFJvd01vZGVsPiB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxNYXRyaXhSb3dNb2RlbD4oKTtcbiAgICB2YXIgdmFsID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoIXZhbCkgdmFsID0ge307XG4gICAgdmFyIHJvd3MgPSAhIXRoaXMuZmlsdGVyZWRSb3dzID8gdGhpcy5maWx0ZXJlZFJvd3MgOiB0aGlzLnJvd3M7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcm93ID0gcm93c1tpXTtcbiAgICAgIGlmICh0aGlzLmlzVmFsdWVFbXB0eShyb3cudmFsdWUpKSBjb250aW51ZTtcbiAgICAgIHJlc3VsdC5wdXNoKFxuICAgICAgICB0aGlzLmNyZWF0ZU1hdHJpeFJvdyhcbiAgICAgICAgICByb3csXG4gICAgICAgICAgdGhpcy5pZCArIFwiX1wiICsgcm93LnZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZSgvXFxzL2csIFwiX1wiKSxcbiAgICAgICAgICB2YWxbcm93LnZhbHVlXVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PSAwICYmICF0aGlzLmZpbHRlcmVkUm93cykge1xuICAgICAgcmVzdWx0LnB1c2goXG4gICAgICAgIHRoaXMuY3JlYXRlTWF0cml4Um93KFxuICAgICAgICAgIG5ldyBJdGVtVmFsdWUobnVsbCksXG4gICAgICAgICAgdGhpcy5uYW1lLnJlcGxhY2UoL1xccy9nLCBcIl9cIiksXG4gICAgICAgICAgdmFsXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MgPSByZXN1bHQ7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwcm90ZWN0ZWQgc29ydFZpc2libGVSb3dzKFxuICAgIGFycmF5OiBBcnJheTxNYXRyaXhSb3dNb2RlbD5cbiAgKTogQXJyYXk8TWF0cml4Um93TW9kZWw+IHtcbiAgICB2YXIgb3JkZXIgPSB0aGlzLnJvd3NPcmRlci50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChvcmRlciA9PT0gXCJyYW5kb21cIilcbiAgICAgIHJldHVybiBIZWxwZXJzLnJhbmRvbWl6ZUFycmF5PE1hdHJpeFJvd01vZGVsPihhcnJheSk7XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG4gIGVuZExvYWRpbmdGcm9tSnNvbigpIHtcbiAgICBzdXBlci5lbmRMb2FkaW5nRnJvbUpzb24oKTtcbiAgICB0aGlzLnJvd3MgPSB0aGlzLnNvcnRWaXNpYmxlUm93cyh0aGlzLnJvd3MpO1xuICAgIHRoaXMudXBkYXRlVmlzaWJpbGl0eUJhc2VkT25Sb3dzKCk7XG4gIH1cbiAgcHJvdGVjdGVkIHByb2Nlc3NSb3dzT25TZXQobmV3Um93czogQXJyYXk8YW55Pikge1xuICAgIHJldHVybiB0aGlzLnNvcnRWaXNpYmxlUm93cyhuZXdSb3dzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHZpc2libGUgcm93cyBhcyBtb2RlbCBvYmplY3RzLlxuICAgKiBAc2VlIHJvd3NWaXNpYmxlSWZcbiAgICovXG4gIHB1YmxpYyBnZXQgdmlzaWJsZVJvd3MoKTogQXJyYXk8TWF0cml4Um93TW9kZWw+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRWaXNpYmxlUm93cygpO1xuICB9XG4gIHB1YmxpYyBnZXQgY2VsbHMoKTogTWF0cml4Q2VsbHMge1xuICAgIHJldHVybiB0aGlzLmNlbGxzVmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCBjZWxscyh2YWx1ZTogTWF0cml4Q2VsbHMpIHtcbiAgICB0aGlzLmNlbGxzLnNldEpzb24odmFsdWUgJiYgdmFsdWUuZ2V0SnNvbiA/IHZhbHVlLmdldEpzb24oKSA6IG51bGwpO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzQ2VsbFRleHQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmNlbGxzLmlzRW1wdHk7XG4gIH1cbiAgcHVibGljIHNldENlbGxUZXh0KHJvdzogYW55LCBjb2x1bW46IGFueSwgdmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNlbGxzLnNldENlbGxUZXh0KHJvdywgY29sdW1uLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXRDZWxsVGV4dChyb3c6IGFueSwgY29sdW1uOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNlbGxzLmdldENlbGxUZXh0KHJvdywgY29sdW1uKTtcbiAgfVxuICBwdWJsaWMgc2V0RGVmYXVsdENlbGxUZXh0KGNvbHVtbjogYW55LCB2YWw6IHN0cmluZykge1xuICAgIHRoaXMuY2VsbHMuc2V0RGVmYXVsdENlbGxUZXh0KGNvbHVtbiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0RGVmYXVsdENlbGxUZXh0KGNvbHVtbjogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jZWxscy5nZXREZWZhdWx0Q2VsbFRleHQoY29sdW1uKTtcbiAgfVxuICBwdWJsaWMgZ2V0Q2VsbERpc3BsYXlUZXh0KHJvdzogYW55LCBjb2x1bW46IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2VsbHMuZ2V0Q2VsbERpc3BsYXlUZXh0KHJvdywgY29sdW1uKTtcbiAgfVxuICBwcml2YXRlIGVtcHR5TG9jYWxpemFibGVTdHJpbmcgPSBuZXcgTG9jYWxpemFibGVTdHJpbmcodGhpcyk7XG4gIHB1YmxpYyBnZXRDZWxsRGlzcGxheUxvY1RleHQocm93OiBhbnksIGNvbHVtbjogYW55KTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHZhciBsb2MgPSB0aGlzLmNlbGxzLmdldENlbGxEaXNwbGF5TG9jVGV4dChyb3csIGNvbHVtbik7XG4gICAgcmV0dXJuIGxvYyA/IGxvYyA6IHRoaXMuZW1wdHlMb2NhbGl6YWJsZVN0cmluZztcbiAgfVxuICBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHtcbiAgICByZXR1cm4gdGhpcy5oYXNWYWx1ZXNJbkFsbFJvd3MoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25DaGVja0ZvckVycm9ycyhcbiAgICBlcnJvcnM6IEFycmF5PFN1cnZleUVycm9yPixcbiAgICBpc09uVmFsdWVDaGFuZ2VkOiBib29sZWFuXG4gICkge1xuICAgIHN1cGVyLm9uQ2hlY2tGb3JFcnJvcnMoZXJyb3JzLCBpc09uVmFsdWVDaGFuZ2VkKTtcbiAgICBpZiAoXG4gICAgICAoIWlzT25WYWx1ZUNoYW5nZWQgfHwgdGhpcy5lcnJvcnMubGVuZ3RoID4gMCkgJiZcbiAgICAgIHRoaXMuaGFzRXJyb3JJblJvd3MoKVxuICAgICkge1xuICAgICAgZXJyb3JzLnB1c2gobmV3IFJlcXVpcmVkSW5BbGxSb3dzRXJyb3IobnVsbCwgdGhpcykpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGhhc0Vycm9ySW5Sb3dzKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5pc0FsbFJvd1JlcXVpcmVkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICF0aGlzLmhhc1ZhbHVlc0luQWxsUm93cygpO1xuICB9XG4gIHByaXZhdGUgaGFzVmFsdWVzSW5BbGxSb3dzKCk6IGJvb2xlYW4ge1xuICAgIHZhciByb3dzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cztcbiAgICBpZiAoIXJvd3MpIHJvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xuICAgIGlmICghcm93cykgcmV0dXJuIHRydWU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5pc1ZhbHVlRW1wdHkocm93c1tpXS52YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJvdGVjdGVkIGdldElzQW5zd2VyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHN1cGVyLmdldElzQW5zd2VyZWQoKSAmJiB0aGlzLmhhc1ZhbHVlc0luQWxsUm93cygpO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlTWF0cml4Um93KFxuICAgIGl0ZW06IEl0ZW1WYWx1ZSxcbiAgICBmdWxsTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlOiBhbnlcbiAgKTogTWF0cml4Um93TW9kZWwge1xuICAgIHZhciByb3cgPSBuZXcgTWF0cml4Um93TW9kZWwoaXRlbSwgZnVsbE5hbWUsIHRoaXMsIHZhbHVlKTtcbiAgICB0aGlzLm9uTWF0cml4Um93Q3JlYXRlZChyb3cpO1xuICAgIHJldHVybiByb3c7XG4gIH1cbiAgcHJvdGVjdGVkIG9uTWF0cml4Um93Q3JlYXRlZChyb3c6IE1hdHJpeFJvd01vZGVsKSB7fVxuICBwcm90ZWN0ZWQgc2V0UXVlc3Rpb25WYWx1ZShuZXdWYWx1ZTogYW55LCB1cGRhdGVJc0Fuc3dlcmVkOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIHN1cGVyLnNldFF1ZXN0aW9uVmFsdWUobmV3VmFsdWUsIHRoaXMuaXNSb3dDaGFuZ2luZyB8fCB1cGRhdGVJc0Fuc3dlcmVkKTtcbiAgICBpZiAoIXRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MgfHwgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5sZW5ndGggPT0gMClcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLmlzUm93Q2hhbmdpbmcgPSB0cnVlO1xuICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICAgIGlmICghdmFsKSB2YWwgPSB7fTtcbiAgICBpZiAodGhpcy5yb3dzLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzWzBdLnZhbHVlID0gdmFsO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHJvdyA9IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3NbaV07XG4gICAgICAgIHZhciByb3dWYWwgPSB2YWxbcm93Lm5hbWVdO1xuICAgICAgICBpZiAodGhpcy5pc1ZhbHVlRW1wdHkocm93VmFsKSkgcm93VmFsID0gbnVsbDtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXS52YWx1ZSA9IHJvd1ZhbDtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy51cGRhdGVJc0Fuc3dlcmVkKCk7XG4gICAgdGhpcy5pc1Jvd0NoYW5naW5nID0gZmFsc2U7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERpc3BsYXlWYWx1ZUNvcmUoa2V5c0FzVGV4dDogYm9vbGVhbiwgdmFsdWU6IGFueSk6IGFueSB7XG4gICAgdmFyIHJlczogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICB2YXIgbmV3S2V5ID0ga2V5c0FzVGV4dFxuICAgICAgICA/IEl0ZW1WYWx1ZS5nZXRUZXh0T3JIdG1sQnlWYWx1ZSh0aGlzLnJvd3MsIGtleSlcbiAgICAgICAgOiBrZXk7XG4gICAgICBpZiAoIW5ld0tleSkgbmV3S2V5ID0ga2V5O1xuICAgICAgdmFyIG5ld1ZhbHVlID0gSXRlbVZhbHVlLmdldFRleHRPckh0bWxCeVZhbHVlKHRoaXMuY29sdW1ucywgdmFsdWVba2V5XSk7XG4gICAgICBpZiAoIW5ld1ZhbHVlKSBuZXdWYWx1ZSA9IHZhbHVlW2tleV07XG4gICAgICByZXNbbmV3S2V5XSA9IG5ld1ZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBnZXRQbGFpbkRhdGEoXG4gICAgb3B0aW9uczoge1xuICAgICAgaW5jbHVkZUVtcHR5PzogYm9vbGVhbixcbiAgICAgIGNhbGN1bGF0aW9ucz86IEFycmF5PHtcbiAgICAgICAgcHJvcGVydHlOYW1lOiBzdHJpbmcsXG4gICAgICB9PixcbiAgICB9ID0ge1xuICAgICAgaW5jbHVkZUVtcHR5OiB0cnVlLFxuICAgIH1cbiAgKSB7XG4gICAgdmFyIHF1ZXN0aW9uUGxhaW5EYXRhID0gc3VwZXIuZ2V0UGxhaW5EYXRhKG9wdGlvbnMpO1xuICAgIGlmICghIXF1ZXN0aW9uUGxhaW5EYXRhKSB7XG4gICAgICB2YXIgdmFsdWVzID0gdGhpcy5jcmVhdGVWYWx1ZUNvcHkoKTtcbiAgICAgIHF1ZXN0aW9uUGxhaW5EYXRhLmlzTm9kZSA9IHRydWU7XG4gICAgICBxdWVzdGlvblBsYWluRGF0YS5kYXRhID0gT2JqZWN0LmtleXModmFsdWVzIHx8IHt9KS5tYXAoKHJvd05hbWUpID0+IHtcbiAgICAgICAgdmFyIHJvdyA9IHRoaXMucm93cy5maWx0ZXIoXG4gICAgICAgICAgKHI6IE1hdHJpeFJvd01vZGVsKSA9PiByLnZhbHVlID09PSByb3dOYW1lXG4gICAgICAgIClbMF07XG4gICAgICAgIHZhciByb3dEYXRhSXRlbSA9IDxhbnk+e1xuICAgICAgICAgIG5hbWU6IHJvd05hbWUsXG4gICAgICAgICAgdGl0bGU6ICEhcm93ID8gcm93LnRleHQgOiBcInJvd1wiLFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZXNbcm93TmFtZV0sXG4gICAgICAgICAgZGlzcGxheVZhbHVlOiBJdGVtVmFsdWUuZ2V0VGV4dE9ySHRtbEJ5VmFsdWUoXG4gICAgICAgICAgICB0aGlzLnZpc2libGVDb2x1bW5zLFxuICAgICAgICAgICAgdmFsdWVzW3Jvd05hbWVdXG4gICAgICAgICAgKSxcbiAgICAgICAgICBnZXRTdHJpbmc6ICh2YWw6IGFueSkgPT5cbiAgICAgICAgICAgIHR5cGVvZiB2YWwgPT09IFwib2JqZWN0XCIgPyBKU09OLnN0cmluZ2lmeSh2YWwpIDogdmFsLFxuICAgICAgICAgIGlzTm9kZTogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICAgIHZhciBpdGVtID0gSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKFxuICAgICAgICAgIHRoaXMudmlzaWJsZUNvbHVtbnMsXG4gICAgICAgICAgdmFsdWVzW3Jvd05hbWVdXG4gICAgICAgICk7XG4gICAgICAgIGlmICghIWl0ZW0pIHtcbiAgICAgICAgICAob3B0aW9ucy5jYWxjdWxhdGlvbnMgfHwgW10pLmZvckVhY2goKGNhbGN1bGF0aW9uKSA9PiB7XG4gICAgICAgICAgICByb3dEYXRhSXRlbVtjYWxjdWxhdGlvbi5wcm9wZXJ0eU5hbWVdID1cbiAgICAgICAgICAgICAgaXRlbVtjYWxjdWxhdGlvbi5wcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dEYXRhSXRlbTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcXVlc3Rpb25QbGFpbkRhdGE7XG4gIH1cbiAgcHVibGljIGFkZENvbmRpdGlvbk9iamVjdHNCeUNvbnRleHQoXG4gICAgb2JqZWN0czogQXJyYXk8SUNvbmRpdGlvbk9iamVjdD4sXG4gICAgY29udGV4dDogYW55XG4gICkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcm93ID0gdGhpcy5yb3dzW2ldO1xuICAgICAgaWYgKCEhcm93LnZhbHVlKSB7XG4gICAgICAgIG9iamVjdHMucHVzaCh7XG4gICAgICAgICAgbmFtZTogdGhpcy5nZXRWYWx1ZU5hbWUoKSArIFwiLlwiICsgcm93LnZhbHVlLFxuICAgICAgICAgIHRleHQ6IHRoaXMucHJvY2Vzc2VkVGl0bGUgKyBcIi5cIiArIHJvdy5jYWxjdWxhdGVkVGV4dCxcbiAgICAgICAgICBxdWVzdGlvbjogdGhpcyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRDb25kaXRpb25Kc29uKG9wZXJhdG9yOiBzdHJpbmcgPSBudWxsLCBwYXRoOiBzdHJpbmcgPSBudWxsKTogYW55IHtcbiAgICBpZiAoIXBhdGgpIHJldHVybiBzdXBlci5nZXRDb25kaXRpb25Kc29uKCk7XG4gICAgdmFyIHF1ZXN0aW9uID0gbmV3IFF1ZXN0aW9uRHJvcGRvd25Nb2RlbChwYXRoKTtcbiAgICBxdWVzdGlvbi5jaG9pY2VzID0gdGhpcy5jb2x1bW5zO1xuICAgIHZhciBqc29uID0gbmV3IEpzb25PYmplY3QoKS50b0pzb25PYmplY3QocXVlc3Rpb24pO1xuICAgIGpzb25bXCJ0eXBlXCJdID0gcXVlc3Rpb24uZ2V0VHlwZSgpO1xuICAgIHJldHVybiBqc29uO1xuICB9XG4gIHB1YmxpYyBjbGVhclZhbHVlSWZJbnZpc2libGUoKSB7XG4gICAgc3VwZXIuY2xlYXJWYWx1ZUlmSW52aXNpYmxlKCk7XG4gICAgaWYgKHRoaXMuaGFzUm93cykge1xuICAgICAgdGhpcy5jbGVhckludmlzaWJsZVZhbHVlc0luUm93cygpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Rmlyc3RJbnB1dEVsZW1lbnRJZCgpOiBzdHJpbmcge1xuICAgIHZhciByb3dzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cztcbiAgICBpZiAoIXJvd3MpIHJvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xuICAgIGlmIChyb3dzLmxlbmd0aCA+IDAgJiYgdGhpcy52aXNpYmxlQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnB1dElkICsgXCJfXCIgKyByb3dzWzBdLm5hbWUgKyBcIl9cIiArIDA7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5nZXRGaXJzdElucHV0RWxlbWVudElkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uUm93c0NoYW5nZWQoKSB7XG4gICAgdGhpcy51cGRhdGVWaXNpYmlsaXR5QmFzZWRPblJvd3MoKTtcbiAgICBzdXBlci5vblJvd3NDaGFuZ2VkKCk7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVWaXNpYmlsaXR5QmFzZWRPblJvd3MoKSB7XG4gICAgaWYgKHRoaXMuaGlkZUlmUm93c0VtcHR5KSB7XG4gICAgICB0aGlzLnZpc2libGUgPVxuICAgICAgICB0aGlzLnJvd3MubGVuZ3RoID4gMCAmJlxuICAgICAgICAoIXRoaXMuZmlsdGVyZWRSb3dzIHx8IHRoaXMuZmlsdGVyZWRSb3dzLmxlbmd0aCA+IDApO1xuICAgIH1cbiAgfVxuICAvL0lNYXRyaXhEYXRhXG4gIG9uTWF0cml4Um93Q2hhbmdlZChyb3c6IE1hdHJpeFJvd01vZGVsKSB7XG4gICAgaWYgKHRoaXMuaXNSb3dDaGFuZ2luZykgcmV0dXJuO1xuICAgIHRoaXMuaXNSb3dDaGFuZ2luZyA9IHRydWU7XG4gICAgaWYgKCF0aGlzLmhhc1Jvd3MpIHtcbiAgICAgIHRoaXMuc2V0TmV3VmFsdWUocm93LnZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG5ld1ZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgIGlmICghbmV3VmFsdWUpIHtcbiAgICAgICAgbmV3VmFsdWUgPSB7fTtcbiAgICAgIH1cbiAgICAgIG5ld1ZhbHVlW3Jvdy5uYW1lXSA9IHJvdy52YWx1ZTtcbiAgICAgIHRoaXMuc2V0TmV3VmFsdWUobmV3VmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLmlzUm93Q2hhbmdpbmcgPSBmYWxzZTtcbiAgfVxuICBnZXRDb3JyZWN0ZWRSb3dWYWx1ZSh2YWx1ZTogYW55KTogYW55IHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZhbHVlID09PSB0aGlzLmNvbHVtbnNbaV0udmFsdWUpIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmlzVHdvVmFsdWVFcXVhbHModmFsdWUsIHRoaXMuY29sdW1uc1tpXS52YWx1ZSkpXG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbnNbaV0udmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0U2VhcmNoYWJsZUl0ZW1WYWx1ZUtleXMoa2V5czogQXJyYXk8c3RyaW5nPikge1xuICAgIGtleXMucHVzaChcImNvbHVtbnNcIik7XG4gICAga2V5cy5wdXNoKFwicm93c1wiKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IFN1cnZleU1vZGVsKCkge1xuICAgIHJldHVybiB0aGlzLnN1cnZleSBhcyBTdXJ2ZXlNb2RlbDtcbiAgfVxuICBwdWJsaWMgZ2V0Q29sdW1uSGVhZGVyV3JhcHBlckNvbXBvbmVudE5hbWUoY2VsbDogSXRlbVZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuU3VydmV5TW9kZWwuZ2V0RWxlbWVudFdyYXBwZXJDb21wb25lbnROYW1lKFxuICAgICAgeyBjb2x1bW46IGNlbGwgfSxcbiAgICAgIFwiY29sdW1uLWhlYWRlclwiXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0Q29sdW1uSGVhZGVyV3JhcHBlckNvbXBvbmVudERhdGEoY2VsbDogSXRlbVZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuU3VydmV5TW9kZWwuZ2V0RWxlbWVudFdyYXBwZXJDb21wb25lbnREYXRhKFxuICAgICAgeyBjb2x1bW46IGNlbGwgfSxcbiAgICAgIFwiY29sdW1uLWhlYWRlclwiXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0Um93SGVhZGVyV3JhcHBlckNvbXBvbmVudE5hbWUoY2VsbDogSXRlbVZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuU3VydmV5TW9kZWwuZ2V0RWxlbWVudFdyYXBwZXJDb21wb25lbnROYW1lKFxuICAgICAgeyByb3c6IGNlbGwgfSxcbiAgICAgIFwicm93LWhlYWRlclwiXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0Um93SGVhZGVyV3JhcHBlckNvbXBvbmVudERhdGEoY2VsbDogSXRlbVZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuU3VydmV5TW9kZWwuZ2V0RWxlbWVudFdyYXBwZXJDb21wb25lbnREYXRhKFxuICAgICAgeyByb3c6IGNlbGwgfSxcbiAgICAgIFwicm93LWhlYWRlclwiXG4gICAgKTtcbiAgfVxufVxuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcIm1hdHJpeFwiLFxuICBbXG4gICAge1xuICAgICAgbmFtZTogXCJjb2x1bW5zOml0ZW12YWx1ZVtdXCIsXG4gICAgICBiYXNlVmFsdWU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm1hdHJpeF9jb2x1bW5cIik7XG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJyb3dzOml0ZW12YWx1ZVtdXCIsXG4gICAgICBiYXNlVmFsdWU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm1hdHJpeF9yb3dcIik7XG4gICAgICB9LFxuICAgIH0sXG4gICAgeyBuYW1lOiBcImNlbGxzOmNlbGxzXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJjZWxsc1wiIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJyb3dzT3JkZXJcIixcbiAgICAgIGRlZmF1bHQ6IFwiaW5pdGlhbFwiLFxuICAgICAgY2hvaWNlczogW1wiaW5pdGlhbFwiLCBcInJhbmRvbVwiXSxcbiAgICB9LFxuICAgIFwiaXNBbGxSb3dSZXF1aXJlZDpib29sZWFuXCIsXG4gICAgXCJoaWRlSWZSb3dzRW1wdHk6Ym9vbGVhblwiLFxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uTWF0cml4TW9kZWwoXCJcIik7XG4gIH0sXG4gIFwibWF0cml4YmFzZVwiXG4pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcIm1hdHJpeFwiLCAobmFtZSkgPT4ge1xuICB2YXIgcSA9IG5ldyBRdWVzdGlvbk1hdHJpeE1vZGVsKG5hbWUpO1xuICBxLnJvd3MgPSBRdWVzdGlvbkZhY3RvcnkuRGVmYXVsdFJvd3M7XG4gIHEuY29sdW1ucyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Q29sdW1zO1xuICByZXR1cm4gcTtcbn0pO1xuIiwiaW1wb3J0IHtcbiAgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZSxcbiAgTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gIElNYXRyaXhEcm9wZG93bkRhdGEsXG59IGZyb20gXCIuL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duYmFzZVwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBJQ29uZGl0aW9uT2JqZWN0IH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcblxuZXhwb3J0IGNsYXNzIE1hdHJpeERyb3Bkb3duUm93TW9kZWwgZXh0ZW5kcyBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSB7XG4gIHByaXZhdGUgaXRlbTogSXRlbVZhbHVlO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nLFxuICAgIGl0ZW06IEl0ZW1WYWx1ZSxcbiAgICBkYXRhOiBJTWF0cml4RHJvcGRvd25EYXRhLFxuICAgIHZhbHVlOiBhbnlcbiAgKSB7XG4gICAgc3VwZXIoZGF0YSwgdmFsdWUpO1xuICAgIHRoaXMuaXRlbSA9IGl0ZW07XG4gICAgdGhpcy5idWlsZENlbGxzKHZhbHVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHJvd05hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xuICB9XG4gIHB1YmxpYyBnZXQgdGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLml0ZW0udGV4dDtcbiAgfVxuICBwdWJsaWMgZ2V0IGxvY1RleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLml0ZW0ubG9jVGV4dDtcbiAgfVxufVxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIG1hdHJpeCBkcm9wZG93biBxdWVzdGlvbi4gWW91IG1heSB1c2UgYSBkcm9wZG93biwgY2hlY2tib3gsIHJhZGlvZ3JvdXAsIHRleHQgYW5kIGNvbW1lbnQgcXVlc3Rpb25zIGFzIGEgY2VsbCBlZGl0b3JzLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsIGV4dGVuZHMgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZVxuICBpbXBsZW1lbnRzIElNYXRyaXhEcm9wZG93bkRhdGEge1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwidG90YWxUZXh0XCIsIHRoaXMsIHRydWUpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwicm93c1wiLCBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYuY2xlYXJHZW5lcmF0ZWRSb3dzKCk7XG4gICAgICBzZWxmLnJlc2V0UmVuZGVyZWRUYWJsZSgpO1xuICAgICAgc2VsZi5maWx0ZXJJdGVtcygpO1xuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwibWF0cml4ZHJvcGRvd25cIjtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gc2hvdyBpdCBvbiB0aGUgZmlyc3QgY29sdW1uIGZvciB0aGUgdG90YWwgcm93LlxuICAgKi9cbiAgcHVibGljIGdldCB0b3RhbFRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidG90YWxUZXh0XCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdG90YWxUZXh0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJ0b3RhbFRleHRcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGxvY1RvdGFsVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJ0b3RhbFRleHRcIik7XG4gIH1cbiAgcHVibGljIGdldEZvb3RlclRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvY1RvdGFsVGV4dDtcbiAgfVxuICAvKipcbiAgICogVGhlIGNvbHVtbiB3aWR0aCBmb3IgdGhlIGZpcnN0IGNvbHVtbiwgcm93IHRpdGxlIGNvbHVtbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgcm93VGl0bGVXaWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyb3dUaXRsZVdpZHRoXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcm93VGl0bGVXaWR0aCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJvd1RpdGxlV2lkdGhcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0Um93VGl0bGVXaWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJvd1RpdGxlV2lkdGg7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERpc3BsYXlWYWx1ZUNvcmUoa2V5c0FzVGV4dDogYm9vbGVhbiwgdmFsdWU6IGFueSk6IGFueSB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIHZhbHVlO1xuICAgIHZhciByb3dzID0gdGhpcy52aXNpYmxlUm93cztcbiAgICB2YXIgcmVzID0ge307XG4gICAgaWYgKCFyb3dzKSByZXR1cm4gcmVzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHJvd1ZhbHVlID0gcm93c1tpXS5yb3dOYW1lO1xuICAgICAgdmFyIHZhbCA9IHZhbHVlW3Jvd1ZhbHVlXTtcbiAgICAgIGlmICghdmFsKSBjb250aW51ZTtcbiAgICAgIGlmIChrZXlzQXNUZXh0KSB7XG4gICAgICAgIHZhciBkaXNwbGF5Um93VmFsdWUgPSBJdGVtVmFsdWUuZ2V0VGV4dE9ySHRtbEJ5VmFsdWUoXG4gICAgICAgICAgdGhpcy5yb3dzLFxuICAgICAgICAgIHJvd1ZhbHVlXG4gICAgICAgICk7XG4gICAgICAgIGlmICghIWRpc3BsYXlSb3dWYWx1ZSkge1xuICAgICAgICAgIHJvd1ZhbHVlID0gZGlzcGxheVJvd1ZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAoPGFueT5yZXMpW3Jvd1ZhbHVlXSA9IHRoaXMuZ2V0Um93RGlzcGxheVZhbHVlKGtleXNBc1RleHQsIHJvd3NbaV0sIHZhbCk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGFkZENvbmRpdGlvbk9iamVjdHNCeUNvbnRleHQoXG4gICAgb2JqZWN0czogQXJyYXk8SUNvbmRpdGlvbk9iamVjdD4sXG4gICAgY29udGV4dDogYW55XG4gICkge1xuICAgIHZhciBoYXNDb250ZXh0ID0gISFjb250ZXh0ID8gdGhpcy5jb2x1bW5zLmluZGV4T2YoY29udGV4dCkgPiAtMSA6IGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcm93ID0gdGhpcy5yb3dzW2ldO1xuICAgICAgaWYgKCFyb3cudmFsdWUpIGNvbnRpbnVlO1xuICAgICAgdmFyIHByZWZpeE5hbWUgPSB0aGlzLmdldFZhbHVlTmFtZSgpICsgXCIuXCIgKyByb3cudmFsdWUgKyBcIi5cIjtcbiAgICAgIHZhciBwcmVmaXhUaXRsZSA9IHRoaXMucHJvY2Vzc2VkVGl0bGUgKyBcIi5cIiArIHJvdy5jYWxjdWxhdGVkVGV4dCArIFwiLlwiO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMuY29sdW1uc1tqXTtcbiAgICAgICAgb2JqZWN0cy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBwcmVmaXhOYW1lICsgY29sdW1uLm5hbWUsXG4gICAgICAgICAgdGV4dDogcHJlZml4VGl0bGUgKyBjb2x1bW4uZnVsbFRpdGxlLFxuICAgICAgICAgIHF1ZXN0aW9uOiB0aGlzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGhhc0NvbnRleHQpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjb2x1bW4gPSB0aGlzLmNvbHVtbnNbaV07XG4gICAgICAgIGlmIChjb2x1bW4gPT0gY29udGV4dCkgY29udGludWU7XG4gICAgICAgIG9iamVjdHMucHVzaCh7XG4gICAgICAgICAgbmFtZTogXCJyb3cuXCIgKyBjb2x1bW4ubmFtZSxcbiAgICAgICAgICB0ZXh0OiBcInJvdy5cIiArIGNvbHVtbi5mdWxsVGl0bGUsXG4gICAgICAgICAgcXVlc3Rpb246IHRoaXMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKSB7XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgaWYgKCF2YWwpIHJldHVybjtcbiAgICB2YXIgbmV3VmFsID0gbnVsbDtcbiAgICB2YXIgaXNDaGFuZ2VkID0gZmFsc2U7XG4gICAgdmFyIHJvd3MgPSAhIXRoaXMuZmlsdGVyZWRSb3dzID8gdGhpcy5maWx0ZXJlZFJvd3MgOiB0aGlzLnJvd3M7XG4gICAgZm9yICh2YXIga2V5IGluIHZhbCkge1xuICAgICAgaWYgKEl0ZW1WYWx1ZS5nZXRJdGVtQnlWYWx1ZShyb3dzLCBrZXkpKSB7XG4gICAgICAgIGlmIChuZXdWYWwgPT0gbnVsbCkgbmV3VmFsID0ge307XG4gICAgICAgICg8YW55Pm5ld1ZhbClba2V5XSA9IHZhbFtrZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXNDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQ2hhbmdlZCkge1xuICAgICAgdGhpcy52YWx1ZSA9IG5ld1ZhbDtcbiAgICB9XG4gICAgc3VwZXIuY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKTtcbiAgfVxuICBwdWJsaWMgY2xlYXJWYWx1ZUlmSW52aXNpYmxlKCkge1xuICAgIHN1cGVyLmNsZWFyVmFsdWVJZkludmlzaWJsZSgpO1xuICAgIHRoaXMuY2xlYXJJbnZpc2libGVWYWx1ZXNJblJvd3MoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2VuZXJhdGVSb3dzKCk6IEFycmF5PE1hdHJpeERyb3Bkb3duUm93TW9kZWw+IHtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5PE1hdHJpeERyb3Bkb3duUm93TW9kZWw+KCk7XG4gICAgdmFyIHJvd3MgPSAhIXRoaXMuZmlsdGVyZWRSb3dzID8gdGhpcy5maWx0ZXJlZFJvd3MgOiB0aGlzLnJvd3M7XG4gICAgaWYgKCFyb3dzIHx8IHJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gcmVzdWx0O1xuICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICAgIGlmICghdmFsKSB2YWwgPSB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghcm93c1tpXS52YWx1ZSkgY29udGludWU7XG4gICAgICByZXN1bHQucHVzaCh0aGlzLmNyZWF0ZU1hdHJpeFJvdyhyb3dzW2ldLCB2YWxbcm93c1tpXS52YWx1ZV0pKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlTWF0cml4Um93KFxuICAgIGl0ZW06IEl0ZW1WYWx1ZSxcbiAgICB2YWx1ZTogYW55XG4gICk6IE1hdHJpeERyb3Bkb3duUm93TW9kZWwge1xuICAgIHJldHVybiBuZXcgTWF0cml4RHJvcGRvd25Sb3dNb2RlbChpdGVtLnZhbHVlLCBpdGVtLCB0aGlzLCB2YWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFNlYXJjaGFibGVJdGVtVmFsdWVLZXlzKGtleXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICBrZXlzLnB1c2goXCJyb3dzXCIpO1xuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwibWF0cml4ZHJvcGRvd25cIixcbiAgW1xuICAgIHtcbiAgICAgIG5hbWU6IFwicm93czppdGVtdmFsdWVbXVwiLFxuICAgIH0sXG4gICAgXCJyb3dzVmlzaWJsZUlmOmNvbmRpdGlvblwiLFxuICAgIFwicm93VGl0bGVXaWR0aFwiLFxuICAgIHsgbmFtZTogXCJ0b3RhbFRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1RvdGFsVGV4dFwiIH0sXG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsKFwiXCIpO1xuICB9LFxuICBcIm1hdHJpeGRyb3Bkb3duYmFzZVwiXG4pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcIm1hdHJpeGRyb3Bkb3duXCIsIChuYW1lKSA9PiB7XG4gIHZhciBxID0gbmV3IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbChuYW1lKTtcbiAgcS5jaG9pY2VzID0gWzEsIDIsIDMsIDQsIDVdO1xuICBxLnJvd3MgPSBRdWVzdGlvbkZhY3RvcnkuRGVmYXVsdFJvd3M7XG4gIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UuYWRkRGVmYXVsdENvbHVtbnMocSk7XG4gIHJldHVybiBxO1xufSk7XG4iLCJpbXBvcnQgeyBKc29uT2JqZWN0LCBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbiwgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uTWF0cml4QmFzZU1vZGVsIH0gZnJvbSBcIi4vbWFydGl4QmFzZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgSGFzaFRhYmxlLCBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IElFbGVtZW50LCBJUXVlc3Rpb24sIElTdXJ2ZXlEYXRhLCBJU3VydmV5LCBJU3VydmV5SW1wbCwgSVRleHRQcm9jZXNzb3IsIElQcm9ncmVzc0luZm8sIElQYW5lbCB9IGZyb20gXCIuL2Jhc2UtaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgU3VydmV5RWxlbWVudCB9IGZyb20gXCIuL3N1cnZleS1lbGVtZW50XCI7XG5pbXBvcnQgeyBUZXh0UHJlUHJvY2Vzc29yVmFsdWUsIFF1ZXN0aW9uVGV4dFByb2Nlc3NvciB9IGZyb20gXCIuL3RleHRQcmVQcm9jZXNzb3JcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBJTG9jYWxpemFibGVPd25lciwgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgZ2V0Q3VycmVjeUNvZGVzIH0gZnJvbSBcIi4vcXVlc3Rpb25fZXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgRnVuY3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vZnVuY3Rpb25zZmFjdG9yeVwiO1xuaW1wb3J0IHsgUGFuZWxNb2RlbCB9IGZyb20gXCIuL3BhbmVsXCI7XG5pbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzXCI7XG5pbXBvcnQgeyBLZXlEdXBsaWNhdGlvbkVycm9yIH0gZnJvbSBcIi4vZXJyb3JcIjtcbmltcG9ydCB7IFN1cnZleU1vZGVsIH0gZnJvbSBcIi4vc3VydmV5XCI7XG5pbXBvcnQgeyBTdXJ2ZXlFcnJvciB9IGZyb20gXCIuL3N1cnZleS1lcnJvclwiO1xuaW1wb3J0IHsgQ3NzQ2xhc3NCdWlsZGVyIH0gZnJvbSBcIi4vdXRpbHMvY3NzQ2xhc3NCdWlsZGVyXCI7XG5pbXBvcnQgeyBNYXRyaXhEcm9wZG93bkNvbHVtbiB9IGZyb20gXCIuL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duY29sdW1uXCI7XG5pbXBvcnQgeyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsLCBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3csIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFRhYmxlIH0gZnJvbSBcIi4vcXVlc3Rpb25fbWF0cml4ZHJvcGRvd25yZW5kZXJlZFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElNYXRyaXhEcm9wZG93bkRhdGEge1xuICB2YWx1ZTogYW55O1xuICBvblJvd0NoYW5nZWQoXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICBjb2x1bW5OYW1lOiBzdHJpbmcsXG4gICAgbmV3Um93VmFsdWU6IGFueSxcbiAgICBpc0RlbGV0aW5nVmFsdWU6IGJvb2xlYW5cbiAgKTogdm9pZDtcbiAgb25Sb3dDaGFuZ2luZyhcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIGNvbHVtbk5hbWU6IHN0cmluZyxcbiAgICByb3dWYWx1ZTogYW55XG4gICk6IGFueTtcbiAgaXNWYWxpZGF0ZU9uVmFsdWVDaGFuZ2luZzogYm9vbGVhbjtcbiAgZ2V0Um93SW5kZXgocm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSk6IG51bWJlcjtcbiAgZ2V0Um93VmFsdWUocm93SW5kZXg6IG51bWJlcik6IGFueTtcbiAgY2hlY2tJZlZhbHVlSW5Sb3dEdXBsaWNhdGVkKFxuICAgIGNoZWNrZWRSb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIGNlbGxRdWVzdGlvbjogUXVlc3Rpb25cbiAgKTogYm9vbGVhbjtcbiAgaGFzRGV0YWlsUGFuZWwocm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSk6IGJvb2xlYW47XG4gIGdldElzRGV0YWlsUGFuZWxTaG93aW5nKHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UpOiBib29sZWFuO1xuICBzZXRJc0RldGFpbFBhbmVsU2hvd2luZyhyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLCB2YWw6IGJvb2xlYW4pOiB2b2lkO1xuICBjcmVhdGVSb3dEZXRhaWxQYW5lbChyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlKTogUGFuZWxNb2RlbDtcbiAgdmFsaWRhdGVDZWxsKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgY29sdW1uTmFtZTogc3RyaW5nLFxuICAgIHJvd1ZhbHVlOiBhbnlcbiAgKTogU3VydmV5RXJyb3I7XG4gIGNvbHVtbnM6IEFycmF5PE1hdHJpeERyb3Bkb3duQ29sdW1uPjtcbiAgY3JlYXRlUXVlc3Rpb24oXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICBjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uXG4gICk6IFF1ZXN0aW9uO1xuICBnZXRMb2NhbGUoKTogc3RyaW5nO1xuICBnZXRNYXJrZG93bkh0bWwodGV4dDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmc7XG4gIGdldFJlbmRlcmVyKG5hbWU6IHN0cmluZyk6IHN0cmluZztcbiAgZ2V0UmVuZGVyZXJDb250ZXh0KGxvY1N0cjogTG9jYWxpemFibGVTdHJpbmcpOiBhbnk7XG4gIGdldFByb2Nlc3NlZFRleHQodGV4dDogc3RyaW5nKTogc3RyaW5nO1xuICBnZXRTaGFyZWRRdWVzdGlvbkJ5TmFtZShcbiAgICBjb2x1bW5OYW1lOiBzdHJpbmcsXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZVxuICApOiBRdWVzdGlvbjtcbiAgb25Ub3RhbFZhbHVlQ2hhbmdlZCgpOiBhbnk7XG4gIGdldFN1cnZleSgpOiBJU3VydmV5O1xufVxuXG5leHBvcnQgY2xhc3MgTWF0cml4RHJvcGRvd25DZWxsIHtcbiAgcHJpdmF0ZSBxdWVzdGlvblZhbHVlOiBRdWVzdGlvbjtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4sXG4gICAgcHVibGljIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgcHVibGljIGRhdGE6IElNYXRyaXhEcm9wZG93bkRhdGFcbiAgKSB7XG4gICAgdGhpcy5xdWVzdGlvblZhbHVlID0gdGhpcy5jcmVhdGVRdWVzdGlvbihjb2x1bW4sIHJvdywgZGF0YSk7XG4gICAgdGhpcy5xdWVzdGlvblZhbHVlLnVwZGF0ZUN1c3RvbVdpZGdldCgpO1xuICB9XG4gIHB1YmxpYyBsb2NTdHJzQ2hhbmdlZCgpIHtcbiAgICB0aGlzLnF1ZXN0aW9uLmxvY1N0cnNDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVF1ZXN0aW9uKFxuICAgIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4sXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICBkYXRhOiBJTWF0cml4RHJvcGRvd25EYXRhXG4gICk6IFF1ZXN0aW9uIHtcbiAgICB2YXIgcmVzID0gZGF0YS5jcmVhdGVRdWVzdGlvbih0aGlzLnJvdywgdGhpcy5jb2x1bW4pO1xuICAgIHJlcy52YWxpZGF0ZVZhbHVlQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZGF0YS52YWxpZGF0ZUNlbGwocm93LCBjb2x1bW4ubmFtZSwgcm93LnZhbHVlKTtcbiAgICB9O1xuICAgIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLmdldFByb3BlcnRpZXMoY29sdW1uLmdldFR5cGUoKSkuZm9yRWFjaChcbiAgICAgIChwcm9wZXJ0eSkgPT4ge1xuICAgICAgICBsZXQgcHJvcGVydHlOYW1lID0gcHJvcGVydHkubmFtZTtcbiAgICAgICAgaWYgKCg8YW55PmNvbHVtbilbcHJvcGVydHlOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVzW3Byb3BlcnR5TmFtZV0gPSAoPGFueT5jb2x1bW4pW3Byb3BlcnR5TmFtZV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGdldCBxdWVzdGlvbigpOiBRdWVzdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb25WYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IHZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb24udmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5xdWVzdGlvbi52YWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyBydW5Db25kaXRpb24odmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICB0aGlzLnF1ZXN0aW9uLnJ1bkNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNYXRyaXhEcm9wZG93blRvdGFsQ2VsbCBleHRlbmRzIE1hdHJpeERyb3Bkb3duQ2VsbCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uLFxuICAgIHB1YmxpYyByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIHB1YmxpYyBkYXRhOiBJTWF0cml4RHJvcGRvd25EYXRhXG4gICkge1xuICAgIHN1cGVyKGNvbHVtbiwgcm93LCBkYXRhKTtcbiAgICB0aGlzLnVwZGF0ZUNlbGxRdWVzdGlvbigpO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVRdWVzdGlvbihcbiAgICBjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uLFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgZGF0YTogSU1hdHJpeERyb3Bkb3duRGF0YVxuICApOiBRdWVzdGlvbiB7XG4gICAgdmFyIHJlcyA9IDxRdWVzdGlvbj5TZXJpYWxpemVyLmNyZWF0ZUNsYXNzKFwiZXhwcmVzc2lvblwiKTtcbiAgICByZXMuc2V0U3VydmV5SW1wbChyb3cpO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGxvY1N0cnNDaGFuZ2VkKCkge1xuICAgIHRoaXMudXBkYXRlQ2VsbFF1ZXN0aW9uKCk7XG4gICAgc3VwZXIubG9jU3Ryc0NoYW5nZWQoKTtcbiAgfVxuICBwdWJsaWMgdXBkYXRlQ2VsbFF1ZXN0aW9uKCkge1xuICAgIHRoaXMucXVlc3Rpb24ubG9jQ2FsY3VsYXRpb24oKTtcbiAgICB0aGlzLmNvbHVtbi51cGRhdGVDZWxsUXVlc3Rpb24odGhpcy5xdWVzdGlvbiwgbnVsbCwgZnVuY3Rpb24gKGpzb24pIHtcbiAgICAgIGRlbGV0ZSBqc29uW1wiZGVmYXVsdFZhbHVlXCJdO1xuICAgIH0pO1xuICAgIHRoaXMucXVlc3Rpb24uZXhwcmVzc2lvbiA9IHRoaXMuZ2V0VG90YWxFeHByZXNzaW9uKCk7XG4gICAgdGhpcy5xdWVzdGlvbi5mb3JtYXQgPSB0aGlzLmNvbHVtbi50b3RhbEZvcm1hdDtcbiAgICB0aGlzLnF1ZXN0aW9uLmN1cnJlbmN5ID0gdGhpcy5jb2x1bW4udG90YWxDdXJyZW5jeTtcbiAgICB0aGlzLnF1ZXN0aW9uLmRpc3BsYXlTdHlsZSA9IHRoaXMuY29sdW1uLnRvdGFsRGlzcGxheVN0eWxlO1xuICAgIHRoaXMucXVlc3Rpb24ubWF4aW11bUZyYWN0aW9uRGlnaXRzID0gdGhpcy5jb2x1bW4udG90YWxNYXhpbXVtRnJhY3Rpb25EaWdpdHM7XG4gICAgdGhpcy5xdWVzdGlvbi5taW5pbXVtRnJhY3Rpb25EaWdpdHMgPSB0aGlzLmNvbHVtbi50b3RhbE1pbmltdW1GcmFjdGlvbkRpZ2l0cztcbiAgICB0aGlzLnF1ZXN0aW9uLnVubG9jQ2FsY3VsYXRpb24oKTtcbiAgICB0aGlzLnF1ZXN0aW9uLnJ1bklmUmVhZE9ubHkgPSB0cnVlO1xuICB9XG4gIHB1YmxpYyBnZXRUb3RhbEV4cHJlc3Npb24oKTogc3RyaW5nIHtcbiAgICBpZiAoISF0aGlzLmNvbHVtbi50b3RhbEV4cHJlc3Npb24pIHJldHVybiB0aGlzLmNvbHVtbi50b3RhbEV4cHJlc3Npb247XG4gICAgaWYgKHRoaXMuY29sdW1uLnRvdGFsVHlwZSA9PSBcIm5vbmVcIikgcmV0dXJuIFwiXCI7XG4gICAgdmFyIGZ1bk5hbWUgPSB0aGlzLmNvbHVtbi50b3RhbFR5cGUgKyBcIkluQXJyYXlcIjtcbiAgICBpZiAoIUZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5oYXNGdW5jdGlvbihmdW5OYW1lKSkgcmV0dXJuIFwiXCI7XG4gICAgcmV0dXJuIGZ1bk5hbWUgKyBcIih7c2VsZn0sICdcIiArIHRoaXMuY29sdW1uLm5hbWUgKyBcIicpXCI7XG4gIH1cbn1cblxuY2xhc3MgTWF0cml4RHJvcGRvd25Sb3dUZXh0UHJvY2Vzc29yIGV4dGVuZHMgUXVlc3Rpb25UZXh0UHJvY2Vzc29yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgcHJvdGVjdGVkIHZhcmlhYmxlTmFtZTogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHZhcmlhYmxlTmFtZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBzdXJ2ZXkoKTogSVN1cnZleSB7XG4gICAgcmV0dXJuIHRoaXMucm93LmdldFN1cnZleSgpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRWYWx1ZXMoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5yb3cudmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFF1ZXN0aW9uQnlOYW1lKG5hbWU6IHN0cmluZyk6IFF1ZXN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5yb3cuZ2V0UXVlc3Rpb25CeU5hbWUobmFtZSk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQ3VzdG9tUHJvY2Vzc1RleHQodGV4dFZhbHVlOiBUZXh0UHJlUHJvY2Vzc29yVmFsdWUpOiBib29sZWFuIHtcbiAgICBpZiAodGV4dFZhbHVlLm5hbWUgPT0gTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UuSW5kZXhWYXJpYWJsZU5hbWUpIHtcbiAgICAgIHRleHRWYWx1ZS5pc0V4aXN0cyA9IHRydWU7XG4gICAgICB0ZXh0VmFsdWUudmFsdWUgPSB0aGlzLnJvdy5yb3dJbmRleDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodGV4dFZhbHVlLm5hbWUgPT0gTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UuUm93VmFsdWVWYXJpYWJsZU5hbWUpIHtcbiAgICAgIHRleHRWYWx1ZS5pc0V4aXN0cyA9IHRydWU7XG4gICAgICB0ZXh0VmFsdWUudmFsdWUgPSB0aGlzLnJvdy5yb3dOYW1lO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2VcbmltcGxlbWVudHMgSVN1cnZleURhdGEsIElTdXJ2ZXlJbXBsLCBJTG9jYWxpemFibGVPd25lciB7XG4gIHB1YmxpYyBzdGF0aWMgUm93VmFyaWFibGVOYW1lID0gXCJyb3dcIjtcbiAgcHVibGljIHN0YXRpYyBPd25lclZhcmlhYmxlTmFtZSA9IFwic2VsZlwiO1xuICBwdWJsaWMgc3RhdGljIEluZGV4VmFyaWFibGVOYW1lID0gXCJyb3dJbmRleFwiO1xuICBwdWJsaWMgc3RhdGljIFJvd1ZhbHVlVmFyaWFibGVOYW1lID0gXCJyb3dWYWx1ZVwiO1xuXG4gIHByaXZhdGUgc3RhdGljIGlkQ291bnRlcjogbnVtYmVyID0gMTtcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJzcm93X1wiICsgTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UuaWRDb3VudGVyKys7XG4gIH1cbiAgcHJvdGVjdGVkIGRhdGE6IElNYXRyaXhEcm9wZG93bkRhdGE7XG4gIHByb3RlY3RlZCBpc1NldHRpbmdWYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGlkVmFsdWU6IHN0cmluZztcbiAgcHJpdmF0ZSB0ZXh0UHJlUHJvY2Vzc29yOiBNYXRyaXhEcm9wZG93blJvd1RleHRQcm9jZXNzb3I7XG4gIHByaXZhdGUgZGV0YWlsUGFuZWxWYWx1ZTogUGFuZWxNb2RlbCA9IG51bGw7XG5cbiAgcHVibGljIGNlbGxzOiBBcnJheTxNYXRyaXhEcm9wZG93bkNlbGw+ID0gW107XG4gIHB1YmxpYyBzaG93SGlkZURldGFpbFBhbmVsQ2xpY2s6IGFueTtcbiAgcHVibGljIG9uRGV0YWlsUGFuZWxTaG93aW5nQ2hhbmdlZDogKCkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBJTWF0cml4RHJvcGRvd25EYXRhLCB2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB0aGlzLnN1YnNjcmliZVRvQ2hhbmdlcyh2YWx1ZSk7XG4gICAgdGhpcy50ZXh0UHJlUHJvY2Vzc29yID0gbmV3IE1hdHJpeERyb3Bkb3duUm93VGV4dFByb2Nlc3NvcihcbiAgICAgIHRoaXMsXG4gICAgICBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZS5Sb3dWYXJpYWJsZU5hbWVcbiAgICApO1xuICAgIHRoaXMuc2hvd0hpZGVEZXRhaWxQYW5lbENsaWNrID0gKCkgPT4ge1xuICAgICAgdGhpcy5zaG93SGlkZURldGFpbFBhbmVsKCk7XG4gICAgfTtcbiAgICB0aGlzLmlkVmFsdWUgPSBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZS5nZXRJZCgpO1xuICB9XG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pZFZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgcm93TmFtZSgpOiBhbnkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXQgdGV4dCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnJvd05hbWU7XG4gIH1cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIHZhciByZXN1bHQ6IGFueSA9IHt9O1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLnF1ZXN0aW9ucztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHF1ZXN0aW9uID0gcXVlc3Rpb25zW2ldO1xuICAgICAgaWYgKCFxdWVzdGlvbi5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmVzdWx0W3F1ZXN0aW9uLmdldFZhbHVlTmFtZSgpXSA9IHF1ZXN0aW9uLnZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICAhIXF1ZXN0aW9uLmNvbW1lbnQgJiZcbiAgICAgICAgISF0aGlzLmdldFN1cnZleSgpICYmXG4gICAgICAgIHRoaXMuZ2V0U3VydmV5KCkuc3RvcmVPdGhlcnNBc0NvbW1lbnRcbiAgICAgICkge1xuICAgICAgICByZXN1bHRbcXVlc3Rpb24uZ2V0VmFsdWVOYW1lKCkgKyBzZXR0aW5ncy5jb21tZW50UHJlZml4XSA9XG4gICAgICAgICAgcXVlc3Rpb24uY29tbWVudDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwdWJsaWMgc2V0IHZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLmlzU2V0dGluZ1ZhbHVlID0gdHJ1ZTtcbiAgICB0aGlzLnN1YnNjcmliZVRvQ2hhbmdlcyh2YWx1ZSk7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMucXVlc3Rpb25zO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcXVlc3Rpb24gPSBxdWVzdGlvbnNbaV07XG4gICAgICB2YXIgdmFsID0gdGhpcy5nZXRDZWxsVmFsdWUodmFsdWUsIHF1ZXN0aW9uLmdldFZhbHVlTmFtZSgpKTtcbiAgICAgIHZhciBvbGRDb21tZW50ID0gcXVlc3Rpb24uY29tbWVudDtcbiAgICAgIHZhciBjb21tZW50ID0gISF2YWx1ZVxuICAgICAgICA/IHZhbHVlW3F1ZXN0aW9uLmdldFZhbHVlTmFtZSgpICsgc2V0dGluZ3MuY29tbWVudFByZWZpeF1cbiAgICAgICAgOiBcIlwiO1xuICAgICAgaWYgKGNvbW1lbnQgPT0gdW5kZWZpbmVkKSBjb21tZW50ID0gXCJcIjtcbiAgICAgIHF1ZXN0aW9uLnVwZGF0ZVZhbHVlRnJvbVN1cnZleSh2YWwpO1xuICAgICAgaWYgKCEhY29tbWVudCB8fCB0aGlzLmlzVHdvVmFsdWVFcXVhbHMob2xkQ29tbWVudCwgcXVlc3Rpb24uY29tbWVudCkpIHtcbiAgICAgICAgcXVlc3Rpb24udXBkYXRlQ29tbWVudEZyb21TdXJ2ZXkoY29tbWVudCk7XG4gICAgICB9XG4gICAgICBxdWVzdGlvbi5vblN1cnZleVZhbHVlQ2hhbmdlZCh2YWwpO1xuICAgIH1cbiAgICB0aGlzLmlzU2V0dGluZ1ZhbHVlID0gZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldCBsb2NUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc1BhbmVsKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5kYXRhKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5oYXNEZXRhaWxQYW5lbCh0aGlzKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGRldGFpbFBhbmVsKCk6IFBhbmVsTW9kZWwge1xuICAgIHJldHVybiB0aGlzLmRldGFpbFBhbmVsVmFsdWU7XG4gIH1cbiAgcHVibGljIGdldCBkZXRhaWxQYW5lbElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICEhdGhpcy5kZXRhaWxQYW5lbCA/IHRoaXMuZGV0YWlsUGFuZWwuaWQgOiBcIlwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNEZXRhaWxQYW5lbFNob3dpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5kYXRhID8gdGhpcy5kYXRhLmdldElzRGV0YWlsUGFuZWxTaG93aW5nKHRoaXMpIDogZmFsc2U7XG4gIH1cbiAgcHJpdmF0ZSBzZXRJc0RldGFpbFBhbmVsU2hvd2luZyh2YWw6IGJvb2xlYW4pIHtcbiAgICBpZiAoISF0aGlzLmRhdGEpIHtcbiAgICAgIHRoaXMuZGF0YS5zZXRJc0RldGFpbFBhbmVsU2hvd2luZyh0aGlzLCB2YWwpO1xuICAgIH1cbiAgICBpZiAoISF0aGlzLm9uRGV0YWlsUGFuZWxTaG93aW5nQ2hhbmdlZCkge1xuICAgICAgdGhpcy5vbkRldGFpbFBhbmVsU2hvd2luZ0NoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBzaG93SGlkZURldGFpbFBhbmVsKCkge1xuICAgIGlmICh0aGlzLmlzRGV0YWlsUGFuZWxTaG93aW5nKSB7XG4gICAgICB0aGlzLmhpZGVEZXRhaWxQYW5lbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNob3dEZXRhaWxQYW5lbCgpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGlzQ3JlYXRpbmdEZXRhaWxQYW5lbCA9IGZhbHNlO1xuICBwdWJsaWMgc2hvd0RldGFpbFBhbmVsKCkge1xuICAgIHRoaXMuZW5zdXJlRGV0YWlsUGFuZWwoKTtcbiAgICBpZiAoIXRoaXMuZGV0YWlsUGFuZWxWYWx1ZSkgcmV0dXJuO1xuICAgIHRoaXMuc2V0SXNEZXRhaWxQYW5lbFNob3dpbmcodHJ1ZSk7XG4gIH1cbiAgcHVibGljIGhpZGVEZXRhaWxQYW5lbChkZXN0cm95UGFuZWw6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIHRoaXMuc2V0SXNEZXRhaWxQYW5lbFNob3dpbmcoZmFsc2UpO1xuICAgIGlmIChkZXN0cm95UGFuZWwpIHtcbiAgICAgIHRoaXMuZGV0YWlsUGFuZWxWYWx1ZSA9IG51bGw7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZW5zdXJlRGV0YWlsUGFuZWwoKSB7XG4gICAgaWYgKHRoaXMuaXNDcmVhdGluZ0RldGFpbFBhbmVsKSByZXR1cm47XG4gICAgaWYgKCEhdGhpcy5kZXRhaWxQYW5lbFZhbHVlIHx8ICF0aGlzLmhhc1BhbmVsIHx8ICF0aGlzLmRhdGEpIHJldHVybjtcbiAgICB0aGlzLmlzQ3JlYXRpbmdEZXRhaWxQYW5lbCA9IHRydWU7XG4gICAgdGhpcy5kZXRhaWxQYW5lbFZhbHVlID0gdGhpcy5kYXRhLmNyZWF0ZVJvd0RldGFpbFBhbmVsKHRoaXMpO1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmRldGFpbFBhbmVsVmFsdWUucXVlc3Rpb25zO1xuICAgIHZhciB2YWx1ZSA9IHRoaXMuZGF0YS5nZXRSb3dWYWx1ZSh0aGlzLmRhdGEuZ2V0Um93SW5kZXgodGhpcykpO1xuICAgIGlmICghSGVscGVycy5pc1ZhbHVlRW1wdHkodmFsdWUpKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIga2V5ID0gcXVlc3Rpb25zW2ldLmdldFZhbHVlTmFtZSgpO1xuICAgICAgICBpZiAoIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHZhbHVlW2tleV0pKSB7XG4gICAgICAgICAgcXVlc3Rpb25zW2ldLnZhbHVlID0gdmFsdWVba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmRldGFpbFBhbmVsVmFsdWUuc2V0U3VydmV5SW1wbCh0aGlzKTtcbiAgICB0aGlzLmlzQ3JlYXRpbmdEZXRhaWxQYW5lbCA9IGZhbHNlO1xuICB9XG4gIGdldEFsbFZhbHVlcygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICB9XG4gIGdldEZpbHRlcmVkVmFsdWVzKCk6IGFueSB7XG4gICAgdmFyIGFsbFZhbHVlcyA9IHRoaXMuZ2V0QWxsVmFsdWVzKCk7XG4gICAgdmFyIHZhbHVlczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHsgcm93OiBhbGxWYWx1ZXMgfTtcbiAgICBmb3IgKHZhciBrZXkgaW4gYWxsVmFsdWVzKSB7XG4gICAgICB2YWx1ZXNba2V5XSA9IGFsbFZhbHVlc1trZXldO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG4gIGdldEZpbHRlcmVkUHJvcGVydGllcygpOiBhbnkge1xuICAgIHJldHVybiB7IHN1cnZleTogdGhpcy5nZXRTdXJ2ZXkoKSwgcm93OiB0aGlzIH07XG4gIH1cbiAgcHVibGljIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIGlmICghIXRoaXMuZGF0YSkge1xuICAgICAgdmFsdWVzW01hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLk93bmVyVmFyaWFibGVOYW1lXSA9IHRoaXMuZGF0YS52YWx1ZTtcbiAgICB9XG4gICAgdmFsdWVzW01hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLkluZGV4VmFyaWFibGVOYW1lXSA9IHRoaXMucm93SW5kZXg7XG4gICAgdmFsdWVzW01hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLlJvd1ZhbHVlVmFyaWFibGVOYW1lXSA9IHRoaXMucm93TmFtZTtcbiAgICBpZiAoIXByb3BlcnRpZXMpIHByb3BlcnRpZXMgPSB7fTtcbiAgICBwcm9wZXJ0aWVzW01hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLlJvd1ZhcmlhYmxlTmFtZV0gPSB0aGlzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsdWVzW01hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLlJvd1ZhcmlhYmxlTmFtZV0gPSB0aGlzLnZhbHVlO1xuICAgICAgdGhpcy5jZWxsc1tpXS5ydW5Db25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG4gICAgaWYgKCEhdGhpcy5kZXRhaWxQYW5lbCkge1xuICAgICAgdGhpcy5kZXRhaWxQYW5lbC5ydW5Db25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGNsZWFyVmFsdWUoKSB7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMucXVlc3Rpb25zO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBxdWVzdGlvbnNbaV0uY2xlYXJWYWx1ZSgpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgb25BbnlWYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nKSB7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMucXVlc3Rpb25zO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBxdWVzdGlvbnNbaV0ub25BbnlWYWx1ZUNoYW5nZWQobmFtZSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXREYXRhVmFsdWVDb3JlKHZhbHVlc0hhc2g6IGFueSwga2V5OiBzdHJpbmcpIHtcbiAgICB2YXIgc3VydmV5ID0gdGhpcy5nZXRTdXJ2ZXkoKTtcbiAgICBpZiAoISFzdXJ2ZXkpIHtcbiAgICAgIHJldHVybiAoPGFueT5zdXJ2ZXkpLmdldERhdGFWYWx1ZUNvcmUodmFsdWVzSGFzaCwga2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHZhbHVlc0hhc2hba2V5XTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldFZhbHVlKG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5nZXRRdWVzdGlvbkJ5TmFtZShuYW1lKTtcbiAgICByZXR1cm4gISFxdWVzdGlvbiA/IHF1ZXN0aW9uLnZhbHVlIDogbnVsbDtcbiAgfVxuICBwdWJsaWMgc2V0VmFsdWUobmFtZTogc3RyaW5nLCBuZXdDb2x1bW5WYWx1ZTogYW55KSB7XG4gICAgdGhpcy5zZXRWYWx1ZUNvcmUobmFtZSwgbmV3Q29sdW1uVmFsdWUsIGZhbHNlKTtcbiAgfVxuICBnZXRWYXJpYWJsZShuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgc2V0VmFyaWFibGUobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogYW55KSB7IH1cbiAgcHVibGljIGdldENvbW1lbnQobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmdldFF1ZXN0aW9uQnlOYW1lKG5hbWUpO1xuICAgIHJldHVybiAhIXF1ZXN0aW9uID8gcXVlc3Rpb24uY29tbWVudCA6IFwiXCI7XG4gIH1cbiAgcHVibGljIHNldENvbW1lbnQobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogc3RyaW5nLCBsb2NOb3RpZmljYXRpb246IGFueSkge1xuICAgIHRoaXMuc2V0VmFsdWVDb3JlKG5hbWUsIG5ld1ZhbHVlLCB0cnVlKTtcbiAgfVxuICBwcml2YXRlIHNldFZhbHVlQ29yZShuYW1lOiBzdHJpbmcsIG5ld0NvbHVtblZhbHVlOiBhbnksIGlzQ29tbWVudDogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLmlzU2V0dGluZ1ZhbHVlKSByZXR1cm47XG4gICAgdGhpcy51cGRhdGVRdWVzdGlvbnNWYWx1ZShuYW1lLCBuZXdDb2x1bW5WYWx1ZSwgaXNDb21tZW50KTtcbiAgICB2YXIgbmV3VmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgIHZhciBjaGFuZ2VkTmFtZSA9IGlzQ29tbWVudCA/IG5hbWUgKyBzZXR0aW5ncy5jb21tZW50UHJlZml4IDogbmFtZTtcbiAgICB2YXIgY2hhbmdlZFZhbHVlID0gaXNDb21tZW50ID8gdGhpcy5nZXRDb21tZW50KG5hbWUpIDogdGhpcy5nZXRWYWx1ZShuYW1lKTtcbiAgICB2YXIgY2hhbmdlZFF1ZXN0aW9uID0gdGhpcy5nZXRRdWVzdGlvbkJ5TmFtZShuYW1lKTtcbiAgICB2YXIgY2hhbmdpbmdWYWx1ZSA9IHRoaXMuZGF0YS5vblJvd0NoYW5naW5nKHRoaXMsIGNoYW5nZWROYW1lLCBuZXdWYWx1ZSk7XG4gICAgaWYgKFxuICAgICAgISFjaGFuZ2VkUXVlc3Rpb24gJiZcbiAgICAgICF0aGlzLmlzVHdvVmFsdWVFcXVhbHMoY2hhbmdpbmdWYWx1ZSwgY2hhbmdlZFZhbHVlKVxuICAgICkge1xuICAgICAgaWYgKGlzQ29tbWVudCkge1xuICAgICAgICBjaGFuZ2VkUXVlc3Rpb24uY29tbWVudCA9IGNoYW5naW5nVmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGFuZ2VkUXVlc3Rpb24udmFsdWUgPSBjaGFuZ2luZ1ZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuZGF0YS5pc1ZhbGlkYXRlT25WYWx1ZUNoYW5naW5nICYmXG4gICAgICAgIHRoaXMuaGFzUXVlc3RvbkVycm9yKGNoYW5nZWRRdWVzdGlvbilcbiAgICAgIClcbiAgICAgICAgcmV0dXJuO1xuICAgICAgdGhpcy5kYXRhLm9uUm93Q2hhbmdlZChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgY2hhbmdlZE5hbWUsXG4gICAgICAgIG5ld1ZhbHVlLFxuICAgICAgICBuZXdDb2x1bW5WYWx1ZSA9PSBudWxsICYmICFjaGFuZ2VkUXVlc3Rpb25cbiAgICAgICk7XG4gICAgICB0aGlzLm9uQW55VmFsdWVDaGFuZ2VkKE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLlJvd1ZhcmlhYmxlTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVRdWVzdGlvbnNWYWx1ZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgbmV3Q29sdW1uVmFsdWU6IGFueSxcbiAgICBpc0NvbW1lbnQ6IGJvb2xlYW5cbiAgKSB7XG4gICAgaWYgKCF0aGlzLmRldGFpbFBhbmVsKSByZXR1cm47XG4gICAgdmFyIGNvbFF1ZXN0aW9uID0gdGhpcy5nZXRRdWVzdGlvbkJ5Q29sdW1uTmFtZShuYW1lKTtcbiAgICB2YXIgZGV0YWlsUXVlc3Rpb24gPSB0aGlzLmRldGFpbFBhbmVsLmdldFF1ZXN0aW9uQnlOYW1lKG5hbWUpO1xuICAgIGlmICghY29sUXVlc3Rpb24gfHwgIWRldGFpbFF1ZXN0aW9uKSByZXR1cm47XG4gICAgdmFyIGlzQ29sUXVlc3Rpb24gPSB0aGlzLmlzVHdvVmFsdWVFcXVhbHMoXG4gICAgICBuZXdDb2x1bW5WYWx1ZSxcbiAgICAgIGlzQ29tbWVudCA/IGNvbFF1ZXN0aW9uLmNvbW1lbnQgOiBjb2xRdWVzdGlvbi52YWx1ZVxuICAgICk7XG4gICAgdmFyIHF1ZXN0aW9uID0gaXNDb2xRdWVzdGlvbiA/IGRldGFpbFF1ZXN0aW9uIDogY29sUXVlc3Rpb247XG4gICAgdGhpcy5pc1NldHRpbmdWYWx1ZSA9IHRydWU7XG4gICAgaWYgKCFpc0NvbW1lbnQpIHtcbiAgICAgIHF1ZXN0aW9uLnZhbHVlID0gbmV3Q29sdW1uVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXN0aW9uLmNvbW1lbnQgPSBuZXdDb2x1bW5WYWx1ZTtcbiAgICB9XG4gICAgdGhpcy5pc1NldHRpbmdWYWx1ZSA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNRdWVzdG9uRXJyb3IocXVlc3Rpb246IFF1ZXN0aW9uKTogYm9vbGVhbiB7XG4gICAgaWYgKCFxdWVzdGlvbikgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChcbiAgICAgIHF1ZXN0aW9uLmhhc0Vycm9ycyh0cnVlLCB7XG4gICAgICAgIGlzT25WYWx1ZUNoYW5nZWQ6ICF0aGlzLmRhdGEuaXNWYWxpZGF0ZU9uVmFsdWVDaGFuZ2luZyxcbiAgICAgIH0pXG4gICAgKVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKHF1ZXN0aW9uLmlzRW1wdHkoKSkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBjZWxsID0gdGhpcy5nZXRDZWxsQnlDb2x1bW5OYW1lKHF1ZXN0aW9uLm5hbWUpO1xuICAgIGlmICghY2VsbCB8fCAhY2VsbC5jb2x1bW4gfHwgIWNlbGwuY29sdW1uLmlzVW5pcXVlKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5jaGVja0lmVmFsdWVJblJvd0R1cGxpY2F0ZWQodGhpcywgcXVlc3Rpb24pO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNFbXB0eSgpIHtcbiAgICB2YXIgdmFsID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoSGVscGVycy5pc1ZhbHVlRW1wdHkodmFsKSkgcmV0dXJuIHRydWU7XG4gICAgZm9yICh2YXIga2V5IGluIHZhbCkge1xuICAgICAgaWYgKHZhbFtrZXldICE9PSB1bmRlZmluZWQgJiYgdmFsW2tleV0gIT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIGdldFF1ZXN0aW9uQnlDb2x1bW4oY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbik6IFF1ZXN0aW9uIHtcbiAgICB2YXIgY2VsbCA9IHRoaXMuZ2V0Q2VsbEJ5Q29sdW1uKGNvbHVtbik7XG4gICAgcmV0dXJuICEhY2VsbCA/IGNlbGwucXVlc3Rpb24gOiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXRDZWxsQnlDb2x1bW4oY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbik6IE1hdHJpeERyb3Bkb3duQ2VsbCB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5jZWxsc1tpXS5jb2x1bW4gPT0gY29sdW1uKSByZXR1cm4gdGhpcy5jZWxsc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHJpdmF0ZSBnZXRDZWxsQnlDb2x1bW5OYW1lKGNvbHVtbk5hbWU6IHN0cmluZyk6IE1hdHJpeERyb3Bkb3duQ2VsbCB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5jZWxsc1tpXS5jb2x1bW4ubmFtZSA9PSBjb2x1bW5OYW1lKSByZXR1cm4gdGhpcy5jZWxsc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIGdldFF1ZXN0aW9uQnlDb2x1bW5OYW1lKGNvbHVtbk5hbWU6IHN0cmluZyk6IFF1ZXN0aW9uIHtcbiAgICB2YXIgY2VsbCA9IHRoaXMuZ2V0Q2VsbEJ5Q29sdW1uTmFtZShjb2x1bW5OYW1lKTtcbiAgICByZXR1cm4gISFjZWxsID8gY2VsbC5xdWVzdGlvbiA6IG51bGw7XG4gIH1cbiAgcHVibGljIGdldCBxdWVzdGlvbnMoKTogQXJyYXk8UXVlc3Rpb24+IHtcbiAgICB2YXIgcmVzOiBBcnJheTxRdWVzdGlvbj4gPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlcy5wdXNoKHRoaXMuY2VsbHNbaV0ucXVlc3Rpb24pO1xuICAgIH1cbiAgICB2YXIgZGV0YWlsUXVlc3Rpb25zID0gISF0aGlzLmRldGFpbFBhbmVsID8gdGhpcy5kZXRhaWxQYW5lbC5xdWVzdGlvbnMgOiBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRldGFpbFF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzLnB1c2goZGV0YWlsUXVlc3Rpb25zW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgZ2V0UXVlc3Rpb25CeU5hbWUobmFtZTogc3RyaW5nKTogUXVlc3Rpb24ge1xuICAgIHZhciByZXMgPSB0aGlzLmdldFF1ZXN0aW9uQnlDb2x1bW5OYW1lKG5hbWUpO1xuICAgIGlmICghIXJlcykgcmV0dXJuIHJlcztcbiAgICByZXR1cm4gISF0aGlzLmRldGFpbFBhbmVsID8gdGhpcy5kZXRhaWxQYW5lbC5nZXRRdWVzdGlvbkJ5TmFtZShuYW1lKSA6IG51bGw7XG4gIH1cbiAgcHVibGljIGdldFF1ZXN0aW9uc0J5TmFtZShuYW1lOiBzdHJpbmcpOiBBcnJheTxRdWVzdGlvbj4ge1xuICAgIGxldCByZXMgPSBbXTtcbiAgICBsZXQgcSA9IHRoaXMuZ2V0UXVlc3Rpb25CeUNvbHVtbk5hbWUobmFtZSk7XG4gICAgaWYgKCEhcSkgcmVzLnB1c2gocSk7XG4gICAgaWYgKCEhdGhpcy5kZXRhaWxQYW5lbCkge1xuICAgICAgcSA9IHRoaXMuZGV0YWlsUGFuZWwuZ2V0UXVlc3Rpb25CeU5hbWUobmFtZSk7XG4gICAgICBpZiAoISFxKSByZXMucHVzaChxKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0U2hhcmVkUXVlc3Rpb25CeU5hbWUoY29sdW1uTmFtZTogc3RyaW5nKTogUXVlc3Rpb24ge1xuICAgIHJldHVybiAhIXRoaXMuZGF0YVxuICAgICAgPyB0aGlzLmRhdGEuZ2V0U2hhcmVkUXVlc3Rpb25CeU5hbWUoY29sdW1uTmFtZSwgdGhpcylcbiAgICAgIDogbnVsbDtcbiAgfVxuICBwdWJsaWMgY2xlYXJJbmNvcnJlY3RWYWx1ZXModmFsOiBhbnkpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gdmFsKSB7XG4gICAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmdldFF1ZXN0aW9uQnlOYW1lKGtleSk7XG4gICAgICBpZiAocXVlc3Rpb24pIHtcbiAgICAgICAgdmFyIHFWYWwgPSBxdWVzdGlvbi52YWx1ZTtcbiAgICAgICAgcXVlc3Rpb24uY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzVHdvVmFsdWVFcXVhbHMocVZhbCwgcXVlc3Rpb24udmFsdWUpKSB7XG4gICAgICAgICAgdGhpcy5zZXRWYWx1ZShrZXksIHF1ZXN0aW9uLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICF0aGlzLmdldFNoYXJlZFF1ZXN0aW9uQnlOYW1lKGtleSkgJiZcbiAgICAgICAgICBrZXkuaW5kZXhPZihzZXR0aW5ncy5tYXRyaXhUb3RhbFZhbHVlUG9zdEZpeCkgPCAwXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuc2V0VmFsdWUoa2V5LCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0TG9jYWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRMb2NhbGUoKSA6IFwiXCI7XG4gIH1cbiAgcHVibGljIGdldE1hcmtkb3duSHRtbCh0ZXh0OiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRNYXJrZG93bkh0bWwodGV4dCwgbmFtZSkgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXRSZW5kZXJlcihuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0UmVuZGVyZXIobmFtZSkgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXRSZW5kZXJlckNvbnRleHQobG9jU3RyOiBMb2NhbGl6YWJsZVN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRSZW5kZXJlckNvbnRleHQobG9jU3RyKSA6IGxvY1N0cjtcbiAgfVxuICBwdWJsaWMgZ2V0UHJvY2Vzc2VkVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0UHJvY2Vzc2VkVGV4dCh0ZXh0KSA6IHRleHQ7XG4gIH1cbiAgcHVibGljIGxvY1N0cnNDaGFuZ2VkKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5jZWxsc1tpXS5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIH1cbiAgICBpZiAoISF0aGlzLmRldGFpbFBhbmVsKSB7XG4gICAgICB0aGlzLmRldGFpbFBhbmVsLmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyB1cGRhdGVDZWxsUXVlc3Rpb25PbkNvbHVtbkNoYW5nZWQoXG4gICAgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbixcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgbmV3VmFsdWU6IGFueVxuICApIHtcbiAgICB2YXIgY2VsbCA9IHRoaXMuZ2V0Q2VsbEJ5Q29sdW1uKGNvbHVtbik7XG4gICAgaWYgKCFjZWxsKSByZXR1cm47XG4gICAgdGhpcy51cGRhdGVDZWxsT25Db2x1bW5DaGFuZ2VkKGNlbGwsIG5hbWUsIG5ld1ZhbHVlKTtcbiAgfVxuICBwdWJsaWMgdXBkYXRlQ2VsbFF1ZXN0aW9uT25Db2x1bW5JdGVtVmFsdWVDaGFuZ2VkKFxuICAgIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4sXG4gICAgcHJvcGVydHlOYW1lOiBzdHJpbmcsXG4gICAgb2JqOiBJdGVtVmFsdWUsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG5ld1ZhbHVlOiBhbnksXG4gICAgb2xkVmFsdWU6IGFueVxuICApIHtcbiAgICB2YXIgY2VsbCA9IHRoaXMuZ2V0Q2VsbEJ5Q29sdW1uKGNvbHVtbik7XG4gICAgaWYgKCFjZWxsKSByZXR1cm47XG4gICAgdGhpcy51cGRhdGVDZWxsT25Db2x1bW5JdGVtVmFsdWVDaGFuZ2VkKFxuICAgICAgY2VsbCxcbiAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgIG9iaixcbiAgICAgIG5hbWUsXG4gICAgICBuZXdWYWx1ZSxcbiAgICAgIG9sZFZhbHVlXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgb25RdWVzdGlvblJlYWRPbmx5Q2hhbmdlZChwYXJlbnRJc1JlYWRPbmx5OiBib29sZWFuKSB7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMucXVlc3Rpb25zO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBxdWVzdGlvbnNbaV0ucmVhZE9ubHkgPSBwYXJlbnRJc1JlYWRPbmx5O1xuICAgIH1cbiAgICBpZiAoISF0aGlzLmRldGFpbFBhbmVsKSB7XG4gICAgICB0aGlzLmRldGFpbFBhbmVsLnJlYWRPbmx5ID0gcGFyZW50SXNSZWFkT25seTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGhhc0Vycm9ycyhcbiAgICBmaXJlQ2FsbGJhY2s6IGJvb2xlYW4sXG4gICAgcmVjOiBhbnksXG4gICAgcmFpc2VPbkNvbXBsZXRlZEFzeW5jVmFsaWRhdG9yczogKCkgPT4gdm9pZFxuICApOiBib29sZWFuIHtcbiAgICB2YXIgcmVzID0gZmFsc2U7XG4gICAgdmFyIGNlbGxzID0gdGhpcy5jZWxscztcbiAgICBpZiAoIWNlbGxzKSByZXR1cm4gcmVzO1xuICAgIGZvciAodmFyIGNvbEluZGV4ID0gMDsgY29sSW5kZXggPCBjZWxscy5sZW5ndGg7IGNvbEluZGV4KyspIHtcbiAgICAgIGlmICghY2VsbHNbY29sSW5kZXhdKSBjb250aW51ZTtcbiAgICAgIHZhciBxdWVzdGlvbiA9IGNlbGxzW2NvbEluZGV4XS5xdWVzdGlvbjtcbiAgICAgIGlmICghcXVlc3Rpb24gfHwgIXF1ZXN0aW9uLnZpc2libGUpIGNvbnRpbnVlO1xuICAgICAgcXVlc3Rpb24ub25Db21wbGV0ZWRBc3luY1ZhbGlkYXRvcnMgPSAoaGFzRXJyb3JzOiBib29sZWFuKSA9PiB7XG4gICAgICAgIHJhaXNlT25Db21wbGV0ZWRBc3luY1ZhbGlkYXRvcnMoKTtcbiAgICAgIH07XG4gICAgICBpZiAoISFyZWMgJiYgcmVjLmlzT25WYWx1ZUNoYW5nZWQgPT09IHRydWUgJiYgcXVlc3Rpb24uaXNFbXB0eSgpKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIHJlcyA9IHF1ZXN0aW9uLmhhc0Vycm9ycyhmaXJlQ2FsbGJhY2ssIHJlYykgfHwgcmVzO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNQYW5lbCkge1xuICAgICAgdGhpcy5lbnN1cmVEZXRhaWxQYW5lbCgpO1xuICAgICAgdmFyIHBhbmVsSGFzRXJyb3IgPSB0aGlzLmRldGFpbFBhbmVsLmhhc0Vycm9ycyhmaXJlQ2FsbGJhY2ssIGZhbHNlLCByZWMpO1xuICAgICAgaWYgKCFyZWMuaGlkZUVycm9yZWRQYW5lbCAmJiBwYW5lbEhhc0Vycm9yICYmIGZpcmVDYWxsYmFjaykge1xuICAgICAgICBpZiAocmVjLmlzU2luZ2xlRGV0YWlsUGFuZWwpIHtcbiAgICAgICAgICByZWMuaGlkZUVycm9yZWRQYW5lbCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zaG93RGV0YWlsUGFuZWwoKTtcbiAgICAgIH1cbiAgICAgIHJlcyA9IHBhbmVsSGFzRXJyb3IgfHwgcmVzO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZUNlbGxPbkNvbHVtbkNoYW5nZWQoXG4gICAgY2VsbDogTWF0cml4RHJvcGRvd25DZWxsLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBuZXdWYWx1ZTogYW55XG4gICkge1xuICAgIGNlbGwucXVlc3Rpb25bbmFtZV0gPSBuZXdWYWx1ZTtcbiAgfVxuICBwdWJsaWMgdXBkYXRlQ2VsbE9uQ29sdW1uSXRlbVZhbHVlQ2hhbmdlZChcbiAgICBjZWxsOiBNYXRyaXhEcm9wZG93bkNlbGwsXG4gICAgcHJvcGVydHlOYW1lOiBzdHJpbmcsXG4gICAgb2JqOiBJdGVtVmFsdWUsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG5ld1ZhbHVlOiBhbnksXG4gICAgb2xkVmFsdWU6IGFueVxuICApIHtcbiAgICB2YXIgaXRlbXMgPSBjZWxsLnF1ZXN0aW9uW3Byb3BlcnR5TmFtZV07XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGl0ZW1zKSkgcmV0dXJuO1xuICAgIHZhciB2YWwgPSBuYW1lID09PSBcInZhbHVlXCIgPyBvbGRWYWx1ZSA6IG9ialtcInZhbHVlXCJdO1xuICAgIHZhciBpdGVtID0gSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKGl0ZW1zLCB2YWwpO1xuICAgIGlmICghaXRlbSkgcmV0dXJuO1xuICAgIGl0ZW1bbmFtZV0gPSBuZXdWYWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgYnVpbGRDZWxscyh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5pc1NldHRpbmdWYWx1ZSA9IHRydWU7XG4gICAgdmFyIGNvbHVtbnMgPSB0aGlzLmRhdGEuY29sdW1ucztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjb2x1bW4gPSBjb2x1bW5zW2ldO1xuICAgICAgaWYgKCFjb2x1bW4uaXNWaXNpYmxlKSBjb250aW51ZTtcbiAgICAgIHZhciBjZWxsID0gdGhpcy5jcmVhdGVDZWxsKGNvbHVtbik7XG4gICAgICB0aGlzLmNlbGxzLnB1c2goY2VsbCk7XG4gICAgICB2YXIgY2VsbFZhbHVlID0gdGhpcy5nZXRDZWxsVmFsdWUodmFsdWUsIGNvbHVtbi5uYW1lKTtcbiAgICAgIGlmICghSGVscGVycy5pc1ZhbHVlRW1wdHkoY2VsbFZhbHVlKSkge1xuICAgICAgICBjZWxsLnF1ZXN0aW9uLnZhbHVlID0gY2VsbFZhbHVlO1xuICAgICAgICB2YXIgY29tbWVudEtleSA9IGNvbHVtbi5uYW1lICsgc2V0dGluZ3MuY29tbWVudFByZWZpeDtcbiAgICAgICAgaWYgKCEhdmFsdWUgJiYgIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHZhbHVlW2NvbW1lbnRLZXldKSkge1xuICAgICAgICAgIGNlbGwucXVlc3Rpb24uY29tbWVudCA9IHZhbHVlW2NvbW1lbnRLZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuaXNTZXR0aW5nVmFsdWUgPSBmYWxzZTtcbiAgfVxuICBwcm90ZWN0ZWQgaXNUd29WYWx1ZUVxdWFscyh2YWwxOiBhbnksIHZhbDI6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHModmFsMSwgdmFsMiwgZmFsc2UsIHRydWUsIGZhbHNlKTtcbiAgfVxuICBwcml2YXRlIGdldENlbGxWYWx1ZSh2YWx1ZTogYW55LCBuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIGlmICghIXRoaXMuZWRpdGluZ09iailcbiAgICAgIHJldHVybiBTZXJpYWxpemVyLmdldE9ialByb3BlcnR5VmFsdWUodGhpcy5lZGl0aW5nT2JqLCBuYW1lKTtcbiAgICByZXR1cm4gISF2YWx1ZSA/IHZhbHVlW25hbWVdIDogdW5kZWZpbmVkO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVDZWxsKGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pOiBNYXRyaXhEcm9wZG93bkNlbGwge1xuICAgIHJldHVybiBuZXcgTWF0cml4RHJvcGRvd25DZWxsKGNvbHVtbiwgdGhpcywgdGhpcy5kYXRhKTtcbiAgfVxuICBnZXRTdXJ2ZXlEYXRhKCk6IElTdXJ2ZXlEYXRhIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBnZXRTdXJ2ZXkoKTogSVN1cnZleSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRTdXJ2ZXkoKSA6IG51bGw7XG4gIH1cbiAgZ2V0VGV4dFByb2Nlc3NvcigpOiBJVGV4dFByb2Nlc3NvciB7XG4gICAgcmV0dXJuIHRoaXMudGV4dFByZVByb2Nlc3NvcjtcbiAgfVxuICBwdWJsaWMgZ2V0IHJvd0luZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuICEhdGhpcy5kYXRhID8gdGhpcy5kYXRhLmdldFJvd0luZGV4KHRoaXMpICsgMSA6IC0xO1xuICB9XG4gIHB1YmxpYyBnZXQgZWRpdGluZ09iaigpOiBCYXNlIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0aW5nT2JqVmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBvbkVkaXRpbmdPYmpQcm9wZXJ0eUNoYW5nZWQ6IChzZW5kZXI6IEJhc2UsIG9wdGlvbnM6IGFueSkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBlZGl0aW5nT2JqVmFsdWU6IEJhc2U7XG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIGlmICghIXRoaXMuZWRpdGluZ09iaikge1xuICAgICAgdGhpcy5lZGl0aW5nT2JqLm9uUHJvcGVydHlDaGFuZ2VkLnJlbW92ZShcbiAgICAgICAgdGhpcy5vbkVkaXRpbmdPYmpQcm9wZXJ0eUNoYW5nZWRcbiAgICAgICk7XG4gICAgICB0aGlzLmVkaXRpbmdPYmpWYWx1ZSA9IG51bGw7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgc3Vic2NyaWJlVG9DaGFuZ2VzKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIXZhbHVlIHx8ICF2YWx1ZS5nZXRUeXBlIHx8ICF2YWx1ZS5vblByb3BlcnR5Q2hhbmdlZCkgcmV0dXJuO1xuICAgIGlmICh2YWx1ZSA9PT0gdGhpcy5lZGl0aW5nT2JqKSByZXR1cm47XG4gICAgdGhpcy5lZGl0aW5nT2JqVmFsdWUgPSA8QmFzZT52YWx1ZTtcbiAgICB0aGlzLm9uRWRpdGluZ09ialByb3BlcnR5Q2hhbmdlZCA9IChzZW5kZXI6IEJhc2UsIG9wdGlvbnM6IGFueSkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVPblNldFZhbHVlKG9wdGlvbnMubmFtZSwgb3B0aW9ucy5uZXdWYWx1ZSk7XG4gICAgfTtcbiAgICB0aGlzLmVkaXRpbmdPYmoub25Qcm9wZXJ0eUNoYW5nZWQuYWRkKHRoaXMub25FZGl0aW5nT2JqUHJvcGVydHlDaGFuZ2VkKTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZU9uU2V0VmFsdWUobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogYW55KSB7XG4gICAgdGhpcy5pc1NldHRpbmdWYWx1ZSA9IHRydWU7XG4gICAgbGV0IHF1ZXN0aW9ucyA9IHRoaXMuZ2V0UXVlc3Rpb25zQnlOYW1lKG5hbWUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBxdWVzdGlvbnNbaV0udmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB9XG4gICAgdGhpcy5pc1NldHRpbmdWYWx1ZSA9IGZhbHNlO1xuICB9XG59XG5leHBvcnQgY2xhc3MgTWF0cml4RHJvcGRvd25Ub3RhbFJvd01vZGVsIGV4dGVuZHMgTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2Uge1xuICBjb25zdHJ1Y3RvcihkYXRhOiBJTWF0cml4RHJvcGRvd25EYXRhKSB7XG4gICAgc3VwZXIoZGF0YSwgbnVsbCk7XG4gICAgdGhpcy5idWlsZENlbGxzKG51bGwpO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVDZWxsKGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pOiBNYXRyaXhEcm9wZG93bkNlbGwge1xuICAgIHJldHVybiBuZXcgTWF0cml4RHJvcGRvd25Ub3RhbENlbGwoY29sdW1uLCB0aGlzLCB0aGlzLmRhdGEpO1xuICB9XG4gIHB1YmxpYyBzZXRWYWx1ZShuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBpZiAoISF0aGlzLmRhdGEgJiYgIXRoaXMuaXNTZXR0aW5nVmFsdWUpIHtcbiAgICAgIHRoaXMuZGF0YS5vblRvdGFsVmFsdWVDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBydW5Db25kaXRpb24odmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICB2YXIgY291bnRlciA9IDA7XG4gICAgdmFyIHByZXZWYWx1ZTtcbiAgICBkbyB7XG4gICAgICBwcmV2VmFsdWUgPSBIZWxwZXJzLmdldFVuYmluZFZhbHVlKHRoaXMudmFsdWUpO1xuICAgICAgc3VwZXIucnVuQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgICBjb3VudGVyKys7XG4gICAgfSB3aGlsZSAoIUhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyhwcmV2VmFsdWUsIHRoaXMudmFsdWUpICYmIGNvdW50ZXIgPCAzKTtcbiAgfVxuICBwcm90ZWN0ZWQgdXBkYXRlQ2VsbE9uQ29sdW1uQ2hhbmdlZChcbiAgICBjZWxsOiBNYXRyaXhEcm9wZG93bkNlbGwsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG5ld1ZhbHVlOiBhbnlcbiAgKSB7XG4gICAgKDxNYXRyaXhEcm9wZG93blRvdGFsQ2VsbD5jZWxsKS51cGRhdGVDZWxsUXVlc3Rpb24oKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgYmFzZSBjbGFzcyBmb3IgbWF0cml4IGRyb3Bkb3duIGFuZCBtYXRyaXggZHluYW1pYyBxdWVzdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlIGV4dGVuZHMgUXVlc3Rpb25NYXRyaXhCYXNlTW9kZWw8TWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsIE1hdHJpeERyb3Bkb3duQ29sdW1uPiBpbXBsZW1lbnRzIElNYXRyaXhEcm9wZG93bkRhdGEge1xuICBwdWJsaWMgc3RhdGljIGdldCBkZWZhdWx0Q2VsbFR5cGUoKSB7XG4gICAgcmV0dXJuIHNldHRpbmdzLm1hdHJpeERlZmF1bHRDZWxsVHlwZTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIHNldCBkZWZhdWx0Q2VsbFR5cGUodmFsOiBzdHJpbmcpIHtcbiAgICBzZXR0aW5ncy5tYXRyaXhEZWZhdWx0Q2VsbFR5cGUgPSB2YWw7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBhZGREZWZhdWx0Q29sdW1ucyhtYXRyaXg6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UpIHtcbiAgICB2YXIgY29sTmFtZXMgPSBRdWVzdGlvbkZhY3RvcnkuRGVmYXVsdENvbHVtcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbE5hbWVzLmxlbmd0aDsgaSsrKSBtYXRyaXguYWRkQ29sdW1uKGNvbE5hbWVzW2ldKTtcbiAgfVxuICBwcml2YXRlIGRldGFpbFBhbmVsVmFsdWU6IFBhbmVsTW9kZWw7XG4gIHByb3RlY3RlZCBpc1Jvd0NoYW5naW5nID0gZmFsc2U7XG4gIGNvbHVtbnNDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG4gIG9uUmVuZGVyZWRUYWJsZVJlc2V0Q2FsbGJhY2s6ICgpID0+IHZvaWQ7XG4gIG9uUmVuZGVyZWRUYWJsZUNyZWF0ZWRDYWxsYmFjazogKFxuICAgIHRhYmxlOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRUYWJsZVxuICApID0+IHZvaWQ7XG4gIG9uQ2VsbENyZWF0ZWRDYWxsYmFjazogKG9wdGlvbnM6IGFueSkgPT4gdm9pZDtcbiAgb25DZWxsVmFsdWVDaGFuZ2VkQ2FsbGJhY2s6IChvcHRpb25zOiBhbnkpID0+IHZvaWQ7XG4gIG9uSGFzRGV0YWlsUGFuZWxDYWxsYmFjazogKHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UpID0+IGJvb2xlYW47XG4gIG9uQ3JlYXRlRGV0YWlsUGFuZWxDYWxsYmFjazogKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgcGFuZWw6IFBhbmVsTW9kZWxcbiAgKSA9PiB2b2lkO1xuICBvbkNyZWF0ZURldGFpbFBhbmVsUmVuZGVyZWRSb3dDYWxsYmFjazogKFxuICAgIHJlbmRlcmVkUm93OiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3dcbiAgKSA9PiB2b2lkO1xuXG4gIHByb3RlY3RlZCBjcmVhdGVDb2x1bW5WYWx1ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTmV3QXJyYXkoXG4gICAgICBcImNvbHVtbnNcIixcbiAgICAgIChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgaXRlbS5jb2xPd25lciA9IHRoaXM7XG4gICAgICB9LFxuICAgICAgKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICBpdGVtLmNvbE93bmVyID0gbnVsbDtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5jcmVhdGVJdGVtVmFsdWVzKFwiY2hvaWNlc1wiKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwib3B0aW9uc0NhcHRpb25cIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImtleUR1cGxpY2F0aW9uRXJyb3JcIiwgdGhpcyk7XG4gICAgdGhpcy5kZXRhaWxQYW5lbFZhbHVlID0gdGhpcy5jcmVhdGVOZXdEZXRhaWxQYW5lbCgpO1xuICAgIHRoaXMuZGV0YWlsUGFuZWwuc2VsZWN0ZWRFbGVtZW50SW5EZXNpZ24gPSB0aGlzO1xuICAgIHRoaXMuZGV0YWlsUGFuZWwucmVuZGVyV2lkdGggPSBcIjEwMCVcIjtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFxuICAgICAgXCJjb2x1bW5zXCIsXG4gICAgICAobmV3Q29sdW1uczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlQ29sdW1uc0luZGV4ZXMobmV3Q29sdW1ucyk7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVkVG90YWxSb3cgPSBudWxsO1xuICAgICAgICB0aGlzLmNsZWFyUm93c0FuZFJlc2V0UmVuZGVyZWRUYWJsZSgpO1xuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcImNlbGxUeXBlXCIsICgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlQ29sdW1uc0NlbGxUeXBlKCk7XG4gICAgICB0aGlzLmNsZWFyUm93c0FuZFJlc2V0UmVuZGVyZWRUYWJsZSgpO1xuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydGllc1ZhbHVlQ2hhbmdlZChcbiAgICAgIFtcIm9wdGlvbnNDYXB0aW9uXCIsIFwiY29sdW1uQ29sQ291bnRcIiwgXCJyb3dUaXRsZVdpZHRoXCIsIFwiY2hvaWNlc1wiXSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5jbGVhclJvd3NBbmRSZXNldFJlbmRlcmVkVGFibGUoKTtcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydGllc1ZhbHVlQ2hhbmdlZChcbiAgICAgIFtcbiAgICAgICAgXCJjb2x1bW5MYXlvdXRcIixcbiAgICAgICAgXCJhZGRSb3dMb2NhdGlvblwiLFxuICAgICAgICBcImhpZGVDb2x1bW5zSWZFbXB0eVwiLFxuICAgICAgICBcInNob3dIZWFkZXJcIixcbiAgICAgICAgXCJtaW5Sb3dDb3VudFwiLFxuICAgICAgICBcImlzUmVhZE9ubHlcIixcbiAgICAgICAgXCJyb3dDb3VudFwiLFxuICAgICAgICBcImhhc0Zvb3RlclwiLFxuICAgICAgICBcImRldGFpbFBhbmVsTW9kZVwiLFxuICAgICAgXSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5yZXNldFJlbmRlcmVkVGFibGUoKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwibWF0cml4ZHJvcGRvd25iYXNlXCI7XG4gIH1cbiAgcHVibGljIGRpc3Bvc2UoKSB7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgIHRoaXMuY2xlYXJHZW5lcmF0ZWRSb3dzKCk7XG4gIH1cbiAgcHVibGljIGdldCBoYXNTaW5nbGVJbnB1dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldCBpc1Jvd3NEeW5hbWljKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgaXRlbVZhbHVlUHJvcGVydHlDaGFuZ2VkKFxuICAgIGl0ZW06IEl0ZW1WYWx1ZSxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgb2xkVmFsdWU6IGFueSxcbiAgICBuZXdWYWx1ZTogYW55XG4gICkge1xuICAgIHN1cGVyLml0ZW1WYWx1ZVByb3BlcnR5Q2hhbmdlZChpdGVtLCBuYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICAgIGlmIChpdGVtLm93bmVyUHJvcGVydHlOYW1lID09PSBcImNob2ljZXNcIikge1xuICAgICAgdGhpcy5jbGVhclJvd3NBbmRSZXNldFJlbmRlcmVkVGFibGUoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFNldCBjb2x1bW5MYXlvdXQgdG8gJ3ZlcnRpY2FsJyB0byBwbGFjZSBjb2x1bW5zIHZlcnRpY2FsbHkgYW5kIHJvd3MgaG9yaXpvbnRhbGx5LiBJdCBtYWtlcyBzZW5zZSB3aGVuIHdlIGhhdmUgbWFueSBjb2x1bW5zIGFuZCBmZXcgcm93cy5cbiAgICogQHNlZSBjb2x1bW5zXG4gICAqIEBzZWUgcm93Q291bnRcbiAgICovXG4gIHB1YmxpYyBnZXQgY29sdW1uTGF5b3V0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbHVtbkxheW91dFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbHVtbkxheW91dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvbHVtbkxheW91dFwiLCB2YWwpO1xuICB9XG4gIGdldCBjb2x1bW5zTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5MYXlvdXQ7XG4gIH1cbiAgc2V0IGNvbHVtbnNMb2NhdGlvbih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuY29sdW1uTGF5b3V0ID0gdmFsO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgY29sdW1ucyBhcmUgbG9jYXRlZCBob3Jpem9udGFsbHlcbiAgICogQHNlZSBjb2x1bW5MYXlvdXRcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNDb2x1bW5MYXlvdXRIb3Jpem9udGFsKCkge1xuICAgIHJldHVybiB0aGlzLmNvbHVtbkxheW91dCAhPSBcInZlcnRpY2FsXCI7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGUgdmFsdWUgdG8gXCJ1bmRlclJvd1wiIHRvIHNob3cgdGhlIGRldGFpbFBhbmVsIHVuZGVyIHRoZSByb3cuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGRldGFpbFBhbmVsTW9kZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJkZXRhaWxQYW5lbE1vZGVcIik7XG4gIH1cbiAgcHVibGljIHNldCBkZXRhaWxQYW5lbE1vZGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJkZXRhaWxQYW5lbE1vZGVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGRldGFpbCB0ZW1wbGF0ZSBQYW5lbC4gVGhpcyBwYW5lbCBpcyB1c2VkIGFzIGEgdGVtcGxhdGUgb24gY3JlYXRpbmcgZGV0YWlsIHBhbmVsIGZvciBhIHJvdy5cbiAgICogQHNlZSAgZGV0YWlsRWxlbWVudHNcbiAgICogQHNlZSBkZXRhaWxQYW5lbE1vZGVcbiAgICovXG4gIHB1YmxpYyBnZXQgZGV0YWlsUGFuZWwoKTogUGFuZWxNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMuZGV0YWlsUGFuZWxWYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0UGFuZWwoKTogSVBhbmVsIHtcbiAgICByZXR1cm4gdGhpcy5kZXRhaWxQYW5lbDtcbiAgfVxuICAvKipcbiAgICogVGhlIHRlbXBsYXRlIFBhbmVsIGVsZW1lbnRzLCBxdWVzdGlvbnMgYW5kIHBhbmVscy5cbiAgICogQHNlZSAgZGV0YWlsUGFuZWxcbiAgICogQHNlZSBkZXRhaWxQYW5lbE1vZGVcbiAgICovXG4gIHB1YmxpYyBnZXQgZGV0YWlsRWxlbWVudHMoKTogQXJyYXk8SUVsZW1lbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5kZXRhaWxQYW5lbC5lbGVtZW50cztcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlTmV3RGV0YWlsUGFuZWwoKTogUGFuZWxNb2RlbCB7XG4gICAgcmV0dXJuIFNlcmlhbGl6ZXIuY3JlYXRlQ2xhc3MoXCJwYW5lbFwiKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc1Jvd1RleHQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIGdldEZvb3RlclRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXQgY2FuQWRkUm93KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNhblJlbW92ZVJvd3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBjYW5SZW1vdmVSb3cocm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByb3RlY3RlZCBvblJvd3NDaGFuZ2VkKCkge1xuICAgIHRoaXMucmVzZXRSZW5kZXJlZFRhYmxlKCk7XG4gICAgc3VwZXIub25Sb3dzQ2hhbmdlZCgpO1xuICB9XG4gIHByaXZhdGUgbG9ja1Jlc2V0UmVuZGVyZWRUYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgb25TdGFydFJvd0FkZGluZ1JlbW92aW5nKCkge1xuICAgIHRoaXMubG9ja1Jlc2V0UmVuZGVyZWRUYWJsZSA9IHRydWU7XG4gIH1cbiAgcHJvdGVjdGVkIG9uRW5kUm93QWRkaW5nKCkge1xuICAgIHRoaXMubG9ja1Jlc2V0UmVuZGVyZWRUYWJsZSA9IGZhbHNlO1xuICAgIGlmICghdGhpcy5yZW5kZXJlZFRhYmxlKSByZXR1cm47XG4gICAgaWYgKHRoaXMucmVuZGVyZWRUYWJsZS5pc1JlcXVpcmVSZXNldCgpKSB7XG4gICAgICB0aGlzLnJlc2V0UmVuZGVyZWRUYWJsZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbmRlcmVkVGFibGUub25BZGRlZFJvdygpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgb25FbmRSb3dSZW1vdmluZyhyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlKSB7XG4gICAgdGhpcy5sb2NrUmVzZXRSZW5kZXJlZFRhYmxlID0gZmFsc2U7XG4gICAgaWYgKHRoaXMucmVuZGVyZWRUYWJsZS5pc1JlcXVpcmVSZXNldCgpKSB7XG4gICAgICB0aGlzLnJlc2V0UmVuZGVyZWRUYWJsZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoISFyb3cpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlZFRhYmxlLm9uUmVtb3ZlZFJvdyhyb3cpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldCByZW5kZXJlZFRhYmxlVmFsdWUoKTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkVGFibGUge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyZW5kZXJlZFRhYmxlXCIsIG51bGwpO1xuICB9XG4gIHByaXZhdGUgc2V0IHJlbmRlcmVkVGFibGVWYWx1ZSh2YWw6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFRhYmxlKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmVuZGVyZWRUYWJsZVwiLCB2YWwpO1xuICB9XG4gIHByb3RlY3RlZCBjbGVhclJvd3NBbmRSZXNldFJlbmRlcmVkVGFibGUoKSB7XG4gICAgdGhpcy5jbGVhckdlbmVyYXRlZFJvd3MoKTtcbiAgICB0aGlzLnJlc2V0UmVuZGVyZWRUYWJsZSgpO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMuY29sdW1uc0NoYW5nZWRDYWxsYmFjayk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlc2V0UmVuZGVyZWRUYWJsZSgpIHtcbiAgICBpZiAodGhpcy5sb2NrUmVzZXRSZW5kZXJlZFRhYmxlIHx8IHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB0aGlzLnJlbmRlcmVkVGFibGVWYWx1ZSA9IG51bGw7XG4gICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5vblJlbmRlcmVkVGFibGVSZXNldENhbGxiYWNrKTtcbiAgfVxuICBwcm90ZWN0ZWQgY2xlYXJHZW5lcmF0ZWRSb3dzKCkge1xuICAgIGlmICghdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXS5kaXNwb3NlKCk7XG4gICAgfVxuICAgIHN1cGVyLmNsZWFyR2VuZXJhdGVkUm93cygpO1xuICB9XG5cbiAgcHVibGljIGdldCByZW5kZXJlZFRhYmxlKCk6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFRhYmxlIHtcbiAgICBpZiAoIXRoaXMucmVuZGVyZWRUYWJsZVZhbHVlKSB7XG4gICAgICB0aGlzLnJlbmRlcmVkVGFibGVWYWx1ZSA9IHRoaXMuY3JlYXRlUmVuZGVyZWRUYWJsZSgpO1xuICAgICAgaWYgKCEhdGhpcy5vblJlbmRlcmVkVGFibGVDcmVhdGVkQ2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5vblJlbmRlcmVkVGFibGVDcmVhdGVkQ2FsbGJhY2sodGhpcy5yZW5kZXJlZFRhYmxlVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlZFRhYmxlVmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVJlbmRlcmVkVGFibGUoKTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkVGFibGUge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkVGFibGUodGhpcyk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uTWF0cml4Um93Q3JlYXRlZChyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlKSB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSkgcmV0dXJuO1xuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgcm93VmFsdWU6IHJvdy52YWx1ZSxcbiAgICAgIHJvdzogcm93LFxuICAgICAgY29sdW1uOiA8YW55Pm51bGwsXG4gICAgICBjb2x1bW5OYW1lOiA8YW55Pm51bGwsXG4gICAgICBjZWxsOiA8YW55Pm51bGwsXG4gICAgICBjZWxsUXVlc3Rpb246IDxhbnk+bnVsbCxcbiAgICAgIHZhbHVlOiA8YW55Pm51bGwsXG4gICAgfTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudmlzaWJsZUNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG9wdGlvbnMuY29sdW1uID0gdGhpcy52aXNpYmxlQ29sdW1uc1tpXTtcbiAgICAgIG9wdGlvbnMuY29sdW1uTmFtZSA9IG9wdGlvbnMuY29sdW1uLm5hbWU7XG4gICAgICB2YXIgY2VsbCA9IHJvdy5jZWxsc1tpXTtcbiAgICAgIG9wdGlvbnMuY2VsbCA9IGNlbGw7XG4gICAgICBvcHRpb25zLmNlbGxRdWVzdGlvbiA9IGNlbGwucXVlc3Rpb247XG4gICAgICBvcHRpb25zLnZhbHVlID0gY2VsbC52YWx1ZTtcbiAgICAgIGlmICghIXRoaXMub25DZWxsQ3JlYXRlZENhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMub25DZWxsQ3JlYXRlZENhbGxiYWNrKG9wdGlvbnMpO1xuICAgICAgfVxuICAgICAgdGhpcy5zdXJ2ZXkubWF0cml4Q2VsbENyZWF0ZWQodGhpcywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgY2VsbCB0eXBlLlxuICAgKi9cbiAgcHVibGljIGdldCBjZWxsVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjZWxsVHlwZVwiLCBzZXR0aW5ncy5tYXRyaXhEZWZhdWx0Q2VsbFR5cGUpO1xuICB9XG4gIHB1YmxpYyBzZXQgY2VsbFR5cGUodmFsOiBzdHJpbmcpIHtcbiAgICB2YWwgPSB2YWwudG9Mb3dlckNhc2UoKTtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjZWxsVHlwZVwiLCB2YWwpO1xuICB9XG4gIHByaXZhdGUgdXBkYXRlQ29sdW1uc0NlbGxUeXBlKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmNvbHVtbnNbaV0uZGVmYXVsdENlbGxUeXBlQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHVwZGF0ZUNvbHVtbnNJbmRleGVzKGNvbHM6IEFycmF5PE1hdHJpeERyb3Bkb3duQ29sdW1uPikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29scy5sZW5ndGg7IGkrKykge1xuICAgICAgY29sc1tpXS5zZXRJbmRleChpKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IGNvbHVtbiBjb3VudCBmb3IgcmFkaW9ncm91cCBhbmQgY2hlY2tib3ggIGNlbGwgdHlwZXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbHVtbkNvbENvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbHVtbkNvbENvdW50XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29sdW1uQ29sQ291bnQodmFsdWU6IG51bWJlcikge1xuICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiA0KSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29sdW1uQ29sQ291bnRcIiwgdmFsdWUpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBzZXQgdGhlIG1pbmltdW0gY29sdW1uIHdpZHRoLlxuICAgKi9cbiAgcHVibGljIGdldCBjb2x1bW5NaW5XaWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb2x1bW5NaW5XaWR0aFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbHVtbk1pbldpZHRoKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29sdW1uTWluV2lkdGhcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSB0byBzaG93IHRoZSBob3Jpem9udGFsIHNjcm9sbC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaG9yaXpvbnRhbFNjcm9sbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaG9yaXpvbnRhbFNjcm9sbFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBob3Jpem9udGFsU2Nyb2xsKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImhvcml6b250YWxTY3JvbGxcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIE1hdHJpeCB0b29sYmFyIGFuZCBpbm5lciBwYW5lbCB0b29sYmFycyBnZXQgYWRhcHRpdmUgaWYgdGhlIHByb3BlcnR5IGlzIHNldCB0byB0cnVlLlxuICAgKi9cbiAgcHVibGljIGdldCBhbGxvd0FkYXB0aXZlQWN0aW9ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dBZGFwdGl2ZUFjdGlvbnNcIik7XG4gIH1cbiAgcHVibGljIHNldCBhbGxvd0FkYXB0aXZlQWN0aW9ucyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJhbGxvd0FkYXB0aXZlQWN0aW9uc1wiLCB2YWwpO1xuICAgIGlmKCEhdGhpcy5kZXRhaWxQYW5lbCkge1xuICAgICAgdGhpcy5kZXRhaWxQYW5lbC5hbGxvd0FkYXB0aXZlQWN0aW9ucyA9IHZhbDtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldFJlcXVpcmVkVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnN1cnZleSA/IHRoaXMuc3VydmV5LnJlcXVpcmVkVGV4dCA6IFwiXCI7XG4gIH1cbiAgb25Db2x1bW5Qcm9wZXJ0eUNoYW5nZWQoXG4gICAgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbixcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgbmV3VmFsdWU6IGFueVxuICApIHtcbiAgICB0aGlzLnVwZGF0ZUhhc0Zvb3RlcigpO1xuICAgIGlmICghdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXS51cGRhdGVDZWxsUXVlc3Rpb25PbkNvbHVtbkNoYW5nZWQoXG4gICAgICAgIGNvbHVtbixcbiAgICAgICAgbmFtZSxcbiAgICAgICAgbmV3VmFsdWVcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghIXRoaXMuZ2VuZXJhdGVkVG90YWxSb3cpIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVkVG90YWxSb3cudXBkYXRlQ2VsbFF1ZXN0aW9uT25Db2x1bW5DaGFuZ2VkKFxuICAgICAgICBjb2x1bW4sXG4gICAgICAgIG5hbWUsXG4gICAgICAgIG5ld1ZhbHVlXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLm9uQ29sdW1uc0NoYW5nZWQoKTtcbiAgICBpZiAobmFtZSA9PSBcImlzUmVxdWlyZWRcIikge1xuICAgICAgdGhpcy5yZXNldFJlbmRlcmVkVGFibGUoKTtcbiAgICB9XG4gICAgaWYgKGNvbHVtbi5pc1Nob3dJbk11bHRpcGxlQ29sdW1ucykge1xuICAgICAgdGhpcy5vblNob3dJbk11bHRpcGxlQ29sdW1uc0NoYW5nZWQoY29sdW1uKTtcbiAgICB9XG4gIH1cbiAgb25Db2x1bW5JdGVtVmFsdWVQcm9wZXJ0eUNoYW5nZWQoXG4gICAgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbixcbiAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZyxcbiAgICBvYmo6IEl0ZW1WYWx1ZSxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgbmV3VmFsdWU6IGFueSxcbiAgICBvbGRWYWx1ZTogYW55XG4gICkge1xuICAgIGlmICghdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXS51cGRhdGVDZWxsUXVlc3Rpb25PbkNvbHVtbkl0ZW1WYWx1ZUNoYW5nZWQoXG4gICAgICAgIGNvbHVtbixcbiAgICAgICAgcHJvcGVydHlOYW1lLFxuICAgICAgICBvYmosXG4gICAgICAgIG5hbWUsXG4gICAgICAgIG5ld1ZhbHVlLFxuICAgICAgICBvbGRWYWx1ZVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBvblNob3dJbk11bHRpcGxlQ29sdW1uc0NoYW5nZWQoY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbikge1xuICAgIHRoaXMuY2xlYXJHZW5lcmF0ZWRSb3dzKCk7XG4gICAgdGhpcy5yZXNldFJlbmRlcmVkVGFibGUoKTtcbiAgfVxuICBvbkNvbHVtbkNlbGxUeXBlQ2hhbmdlZChjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uKSB7XG4gICAgdGhpcy5jbGVhckdlbmVyYXRlZFJvd3MoKTtcbiAgICB0aGlzLnJlc2V0UmVuZGVyZWRUYWJsZSgpO1xuICB9XG4gIHB1YmxpYyBnZXRSb3dUaXRsZVdpZHRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbiAgcHVibGljIGdldCBoYXNGb290ZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImhhc0Zvb3RlclwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIGdldEFkZFJvd0xvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZGVmYXVsdFwiO1xuICB9XG4gIHB1YmxpYyBnZXRTaG93Q29sdW1uc0lmRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCB1cGRhdGVTaG93VGFibGVBbmRBZGRSb3coKSB7XG4gICAgaWYgKCEhdGhpcy5yZW5kZXJlZFRhYmxlKSB7XG4gICAgICB0aGlzLnJlbmRlcmVkVGFibGUudXBkYXRlU2hvd1RhYmxlQW5kQWRkUm93KCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCB1cGRhdGVIYXNGb290ZXIoKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaGFzRm9vdGVyXCIsIHRoaXMuaGFzVG90YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzVG90YWwoKTogYm9vbGVhbiB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmNvbHVtbnNbaV0uaGFzVG90YWwpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZ2V0Q2VsbFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jZWxsVHlwZTtcbiAgfVxuICBnZXRDdXN0b21DZWxsVHlwZShjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uLCByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLCBjZWxsVHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuc3VydmV5KSByZXR1cm4gY2VsbFR5cGU7XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICByb3dWYWx1ZTogcm93LnZhbHVlLFxuICAgICAgcm93OiByb3csXG4gICAgICBjb2x1bW46IGNvbHVtbixcbiAgICAgIGNvbHVtbk5hbWU6IGNvbHVtbi5uYW1lLFxuICAgICAgY2VsbFR5cGU6IGNlbGxUeXBlXG4gICAgfTtcbiAgICB0aGlzLnN1cnZleS5tYXRyaXhDZWxsQ3JlYXRpbmcodGhpcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG9wdGlvbnMuY2VsbFR5cGU7XG4gIH1cbiAgcHVibGljIGdldENvbmRpdGlvbkpzb24ob3BlcmF0b3I6IHN0cmluZyA9IG51bGwsIHBhdGg6IHN0cmluZyA9IG51bGwpOiBhbnkge1xuICAgIGlmICghcGF0aCkgcmV0dXJuIHN1cGVyLmdldENvbmRpdGlvbkpzb24oKTtcbiAgICB2YXIgY29sdW1uTmFtZSA9IFwiXCI7XG4gICAgZm9yICh2YXIgaSA9IHBhdGgubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmIChwYXRoW2ldID09IFwiLlwiKSBicmVhaztcbiAgICAgIGNvbHVtbk5hbWUgPSBwYXRoW2ldICsgY29sdW1uTmFtZTtcbiAgICB9XG4gICAgdmFyIGNvbHVtbiA9IHRoaXMuZ2V0Q29sdW1uQnlOYW1lKGNvbHVtbk5hbWUpO1xuICAgIGlmICghY29sdW1uKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgcXVlc3Rpb24gPSBjb2x1bW4uY3JlYXRlQ2VsbFF1ZXN0aW9uKG51bGwpO1xuICAgIGlmICghcXVlc3Rpb24pIHJldHVybiBudWxsO1xuICAgIHJldHVybiBxdWVzdGlvbi5nZXRDb25kaXRpb25Kc29uKG9wZXJhdG9yKTtcbiAgfVxuICBwdWJsaWMgY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKSB7XG4gICAgdmFyIHJvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xuICAgIGlmICghcm93cykgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgcm93c1tpXS5jbGVhckluY29ycmVjdFZhbHVlcyh0aGlzLmdldFJvd1ZhbHVlKGkpKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGNsZWFyRXJyb3JzKCkge1xuICAgIHN1cGVyLmNsZWFyRXJyb3JzKCk7XG4gICAgaWYgKCEhdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciByb3cgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzW2ldO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJvdy5jZWxscy5sZW5ndGg7IGorKykge1xuICAgICAgICAgIHJvdy5jZWxsc1tqXS5xdWVzdGlvbi5jbGVhckVycm9ycygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIHN1cGVyLnJ1bkNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIHZhciBjb3VudGVyID0gMDtcbiAgICB2YXIgcHJldlRvdGFsVmFsdWU7XG4gICAgZG8ge1xuICAgICAgcHJldlRvdGFsVmFsdWUgPSBIZWxwZXJzLmdldFVuYmluZFZhbHVlKHRoaXMudG90YWxWYWx1ZSk7XG4gICAgICB0aGlzLnJ1bkNlbGxzQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgICB0aGlzLnJ1blRvdGFsc0NvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgICAgY291bnRlcisrO1xuICAgIH0gd2hpbGUgKFxuICAgICAgIUhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyhwcmV2VG90YWxWYWx1ZSwgdGhpcy50b3RhbFZhbHVlKSAmJlxuICAgICAgY291bnRlciA8IDNcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBzaG91bGRSdW5Db2x1bW5FeHByZXNzaW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcm90ZWN0ZWQgcnVuQ2VsbHNDb25kaXRpb24oXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApIHtcbiAgICBpZiAoIXRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MpIHJldHVybjtcbiAgICB2YXIgbmV3VmFsdWVzID0gdGhpcy5nZXRSb3dDb25kaXRpb25WYWx1ZXModmFsdWVzKTtcbiAgICB2YXIgcm93cyA9IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3M7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByb3dzW2ldLnJ1bkNvbmRpdGlvbihuZXdWYWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIH1cbiAgICB0aGlzLmNoZWNrQ29sdW1uc1Zpc2liaWxpdHkoKTtcbiAgfVxuICBwcml2YXRlIGNoZWNrQ29sdW1uc1Zpc2liaWxpdHkoKSB7XG4gICAgdmFyIGhhc0NoYW5nZWQgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudmlzaWJsZUNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghdGhpcy52aXNpYmxlQ29sdW1uc1tpXS52aXNpYmxlSWYpIGNvbnRpbnVlO1xuICAgICAgaGFzQ2hhbmdlZCA9XG4gICAgICAgIHRoaXMuaXNDb2x1bW5WaXNpYmlsaXR5Q2hhbmdlZCh0aGlzLnZpc2libGVDb2x1bW5zW2ldKSB8fCBoYXNDaGFuZ2VkO1xuICAgIH1cbiAgICBpZiAoaGFzQ2hhbmdlZCkge1xuICAgICAgdGhpcy5yZXNldFJlbmRlcmVkVGFibGUoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBpc0NvbHVtblZpc2liaWxpdHlDaGFuZ2VkKGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pOiBib29sZWFuIHtcbiAgICB2YXIgY3VyVmlzID0gY29sdW1uLmhhc1Zpc2libGVDZWxsO1xuICAgIHZhciBoYXNWaXNDZWxsID0gZmFsc2U7XG4gICAgdmFyIHJvd3MgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNlbGwgPSByb3dzW2ldLmNlbGxzW2NvbHVtbi5pbmRleF07XG4gICAgICBpZiAoISFjZWxsICYmICEhY2VsbC5xdWVzdGlvbiAmJiBjZWxsLnF1ZXN0aW9uLmlzVmlzaWJsZSkge1xuICAgICAgICBoYXNWaXNDZWxsID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjdXJWaXMgIT0gaGFzVmlzQ2VsbCkge1xuICAgICAgY29sdW1uLmhhc1Zpc2libGVDZWxsID0gaGFzVmlzQ2VsbDtcbiAgICB9XG4gICAgcmV0dXJuIGN1clZpcyAhPSBoYXNWaXNDZWxsO1xuICB9XG4gIHByb3RlY3RlZCBydW5Ub3RhbHNDb25kaXRpb24oXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApIHtcbiAgICBpZiAoIXRoaXMuZ2VuZXJhdGVkVG90YWxSb3cpIHJldHVybjtcbiAgICB0aGlzLmdlbmVyYXRlZFRvdGFsUm93LnJ1bkNvbmRpdGlvbihcbiAgICAgIHRoaXMuZ2V0Um93Q29uZGl0aW9uVmFsdWVzKHZhbHVlcyksXG4gICAgICBwcm9wZXJ0aWVzXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGdldFJvd0NvbmRpdGlvblZhbHVlcyh2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+KTogSGFzaFRhYmxlPGFueT4ge1xuICAgIHZhciBuZXdWYWx1ZXMgPSB2YWx1ZXM7XG4gICAgaWYgKCFuZXdWYWx1ZXMpIG5ld1ZhbHVlcyA9IHt9O1xuICAgIC8qXG4gICAgdmFyIG5ld1ZhbHVlczogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgaWYgKHZhbHVlcyAmJiB2YWx1ZXMgaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgIG5ld1ZhbHVlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodmFsdWVzKSk7XG4gICAgfVxuICAgICovXG4gICAgdmFyIHRvdGFsUm93ID0ge307XG4gICAgaWYgKCF0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLnRvdGFsVmFsdWUpKSB7XG4gICAgICB0b3RhbFJvdyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy50b3RhbFZhbHVlKSk7XG4gICAgfVxuICAgIG5ld1ZhbHVlc1tcInJvd1wiXSA9IHt9O1xuICAgIG5ld1ZhbHVlc1tcInRvdGFsUm93XCJdID0gdG90YWxSb3c7XG4gICAgcmV0dXJuIG5ld1ZhbHVlcztcbiAgfVxuICBwdWJsaWMgbG9jU3Ryc0NoYW5nZWQoKSB7XG4gICAgc3VwZXIubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICB2YXIgY29sdW1ucyA9IHRoaXMuY29sdW1ucztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbHVtbnNbaV0ubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICB9XG4gICAgdmFyIHJvd3MgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzO1xuICAgIGlmICghcm93cykgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgcm93c1tpXS5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIH1cbiAgICBpZiAoISF0aGlzLmdlbmVyYXRlZFRvdGFsUm93KSB7XG4gICAgICB0aGlzLmdlbmVyYXRlZFRvdGFsUm93LmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb2x1bW4gYnkgaXQncyBuYW1lLiBSZXR1cm5zIG51bGwgaWYgYSBjb2x1bW4gd2l0aCB0aGlzIG5hbWUgZG9lc24ndCBleGlzdC5cbiAgICogQHBhcmFtIGNvbHVtblxuICAgKi9cbiAgcHVibGljIGdldENvbHVtbkJ5TmFtZShjb2x1bW5OYW1lOiBzdHJpbmcpOiBNYXRyaXhEcm9wZG93bkNvbHVtbiB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmNvbHVtbnNbaV0ubmFtZSA9PSBjb2x1bW5OYW1lKSByZXR1cm4gdGhpcy5jb2x1bW5zW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBnZXRDb2x1bW5OYW1lKGNvbHVtbk5hbWU6IHN0cmluZyk6IE1hdHJpeERyb3Bkb3duQ29sdW1uIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb2x1bW5CeU5hbWUoY29sdW1uTmFtZSk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbHVtbiB3aWR0aC5cbiAgICogQHBhcmFtIGNvbHVtblxuICAgKi9cbiAgcHVibGljIGdldENvbHVtbldpZHRoKGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pOiBzdHJpbmcge1xuICAgIHJldHVybiBjb2x1bW4ubWluV2lkdGggPyBjb2x1bW4ubWluV2lkdGggOiB0aGlzLmNvbHVtbk1pbldpZHRoO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBjaG9pY2VzIGZvciBkcm9wZG93biwgY2hlY2tib3ggYW5kIHJhZGlvZ3JvdXAgY2VsbCB0eXBlcy5cbiAgICovXG4gIHB1YmxpYyBnZXQgY2hvaWNlcygpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY2hvaWNlc1wiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNob2ljZXModmFsOiBBcnJheTxhbnk+KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY2hvaWNlc1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBvcHRpb25zIGNhcHRpb24gZm9yIGRyb3Bkb3duIGNlbGwgdHlwZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgb3B0aW9uc0NhcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJvcHRpb25zQ2FwdGlvblwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm9wdGlvbnNDYXB0aW9uXCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IG9wdGlvbnNDYXB0aW9uKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJvcHRpb25zQ2FwdGlvblwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgbG9jT3B0aW9uc0NhcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJvcHRpb25zQ2FwdGlvblwiKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGR1cGxpY2F0aW9uIHZhbHVlIGVycm9yIHRleHQuIFNldCBpdCB0byBzaG93IHRoZSB0ZXh0IGRpZmZlcmVudCBmcm9tIHRoZSBkZWZhdWx0LlxuICAgKiBAc2VlIE1hdHJpeERyb3Bkb3duQ29sdW1uLmlzVW5pcXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGtleUR1cGxpY2F0aW9uRXJyb3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwia2V5RHVwbGljYXRpb25FcnJvclwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBrZXlEdXBsaWNhdGlvbkVycm9yKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY0tleUR1cGxpY2F0aW9uRXJyb3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIpO1xuICB9XG4gIHB1YmxpYyBnZXQgc3RvcmVPdGhlcnNBc0NvbW1lbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5zdXJ2ZXkgPyB0aGlzLnN1cnZleS5zdG9yZU90aGVyc0FzQ29tbWVudCA6IGZhbHNlO1xuICB9XG4gIHB1YmxpYyBhZGRDb2x1bW4obmFtZTogc3RyaW5nLCB0aXRsZTogc3RyaW5nID0gbnVsbCk6IE1hdHJpeERyb3Bkb3duQ29sdW1uIHtcbiAgICB2YXIgY29sdW1uID0gbmV3IE1hdHJpeERyb3Bkb3duQ29sdW1uKG5hbWUsIHRpdGxlKTtcbiAgICB0aGlzLmNvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgIHJldHVybiBjb2x1bW47XG4gIH1cbiAgcHJvdGVjdGVkIGdldFZpc2libGVSb3dzKCk6IEFycmF5PE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlPiB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybiBudWxsO1xuICAgIGlmICghdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykge1xuICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cyA9IHRoaXMuZ2VuZXJhdGVSb3dzKCk7XG4gICAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmZvckVhY2goKHJvdykgPT4gdGhpcy5vbk1hdHJpeFJvd0NyZWF0ZWQocm93KSk7XG4gICAgICBpZiAodGhpcy5kYXRhKSB7XG4gICAgICAgIHRoaXMucnVuQ2VsbHNDb25kaXRpb24oXG4gICAgICAgICAgdGhpcy5kYXRhLmdldEZpbHRlcmVkVmFsdWVzKCksXG4gICAgICAgICAgdGhpcy5kYXRhLmdldEZpbHRlcmVkUHJvcGVydGllcygpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlT25Sb3dzR2VuZXJhdGlvbih0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKTtcbiAgICAgIHRoaXMudXBkYXRlSXNBbnN3ZXJlZCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cztcbiAgfVxuICBwcml2YXRlIHVwZGF0ZVZhbHVlT25Sb3dzR2VuZXJhdGlvbihyb3dzOiBBcnJheTxNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZT4pIHtcbiAgICB2YXIgb2xkVmFsdWUgPSB0aGlzLmNyZWF0ZU5ld1ZhbHVlKHRydWUpO1xuICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMuY3JlYXRlTmV3VmFsdWUoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByb3cgPSByb3dzW2ldO1xuICAgICAgaWYgKCEhcm93LmVkaXRpbmdPYmopIGNvbnRpbnVlO1xuICAgICAgdmFyIHJvd1ZhbHVlID0gdGhpcy5nZXRSb3dWYWx1ZShpKTtcbiAgICAgIHZhciByVmFsdWUgPSByb3cudmFsdWU7XG4gICAgICBpZiAodGhpcy5pc1R3b1ZhbHVlRXF1YWxzKHJvd1ZhbHVlLCByVmFsdWUpKSBjb250aW51ZTtcbiAgICAgIG5ld1ZhbHVlID0gdGhpcy5nZXROZXdWYWx1ZU9uUm93Q2hhbmdlZChyb3csIFwiXCIsIHJWYWx1ZSwgZmFsc2UsIG5ld1ZhbHVlKVxuICAgICAgICAudmFsdWU7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzVHdvVmFsdWVFcXVhbHMob2xkVmFsdWUsIG5ld1ZhbHVlKSkgcmV0dXJuO1xuICAgIHRoaXMuaXNSb3dDaGFuZ2luZyA9IHRydWU7XG4gICAgdGhpcy5zZXROZXdWYWx1ZShuZXdWYWx1ZSk7XG4gICAgdGhpcy5pc1Jvd0NoYW5naW5nID0gZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldCB0b3RhbFZhbHVlKCk6IGFueSB7XG4gICAgaWYgKCF0aGlzLmhhc1RvdGFsIHx8ICF0aGlzLnZpc2libGVUb3RhbFJvdykgcmV0dXJuIHt9O1xuICAgIHJldHVybiB0aGlzLnZpc2libGVUb3RhbFJvdy52YWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0VmlzaWJsZVRvdGFsUm93KCk6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMuaGFzVG90YWwpIHtcbiAgICAgIGlmICghdGhpcy5nZW5lcmF0ZWRUb3RhbFJvdykge1xuICAgICAgICB0aGlzLmdlbmVyYXRlZFRvdGFsUm93ID0gdGhpcy5nZW5lcmF0ZVRvdGFsUm93KCk7XG4gICAgICAgIGlmICh0aGlzLmRhdGEpIHtcbiAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IHsgc3VydmV5OiB0aGlzLnN1cnZleSB9O1xuICAgICAgICAgIHRoaXMucnVuVG90YWxzQ29uZGl0aW9uKHRoaXMuZGF0YS5nZXRBbGxWYWx1ZXMoKSwgcHJvcGVydGllcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5nZW5lcmF0ZWRUb3RhbFJvdyA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdlbmVyYXRlZFRvdGFsUm93O1xuICB9XG4gIHB1YmxpYyBnZXQgdmlzaWJsZVRvdGFsUm93KCk6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlIHtcbiAgICByZXR1cm4gdGhpcy5nZXRWaXNpYmxlVG90YWxSb3coKTtcbiAgfVxuICBwdWJsaWMgb25TdXJ2ZXlMb2FkKCkge1xuICAgIHN1cGVyLm9uU3VydmV5TG9hZCgpO1xuICAgIHRoaXMudXBkYXRlQ29sdW1uc0luZGV4ZXModGhpcy5jb2x1bW5zKTtcbiAgICB0aGlzLmNsZWFyR2VuZXJhdGVkUm93cygpO1xuICAgIHRoaXMuZ2VuZXJhdGVkVG90YWxSb3cgPSBudWxsO1xuICAgIHRoaXMudXBkYXRlSGFzRm9vdGVyKCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJvdyB2YWx1ZS4gSWYgdGhlIHJvdyB2YWx1ZSBpcyBlbXB0eSwgdGhlIG9iamVjdCBpcyBlbXB0eToge30uXG4gICAqIEBwYXJhbSByb3dJbmRleCByb3cgaW5kZXggZnJvbSAwIHRvIHZpc2libGUgcm93IGNvdW50IC0gMS5cbiAgICovXG4gIHB1YmxpYyBnZXRSb3dWYWx1ZShyb3dJbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHJvd0luZGV4IDwgMCkgcmV0dXJuIG51bGw7XG4gICAgdmFyIHZpc1Jvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xuICAgIGlmIChyb3dJbmRleCA+PSB2aXNSb3dzLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgdmFyIG5ld1ZhbHVlID0gdGhpcy5jcmVhdGVOZXdWYWx1ZSgpO1xuICAgIHJldHVybiB0aGlzLmdldFJvd1ZhbHVlQ29yZSh2aXNSb3dzW3Jvd0luZGV4XSwgbmV3VmFsdWUpO1xuICB9XG4gIHB1YmxpYyBjaGVja0lmVmFsdWVJblJvd0R1cGxpY2F0ZWQoXG4gICAgY2hlY2tlZFJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgY2VsbFF1ZXN0aW9uOiBRdWVzdGlvblxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgcmVzID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcm93ID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXTtcbiAgICAgIGlmIChjaGVja2VkUm93ID09PSByb3cpIGNvbnRpbnVlO1xuICAgICAgaWYgKHJvdy5nZXRWYWx1ZShjZWxsUXVlc3Rpb24ubmFtZSkgPT0gY2VsbFF1ZXN0aW9uLnZhbHVlKSB7XG4gICAgICAgIHJlcyA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVzKSB7XG4gICAgICB0aGlzLmFkZER1cGxpY2F0aW9uRXJyb3IoY2VsbFF1ZXN0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2VsbFF1ZXN0aW9uLmNsZWFyRXJyb3JzKCk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGUgcm93IHZhbHVlLlxuICAgKiBAcGFyYW0gcm93SW5kZXggcm93IGluZGV4IGZyb20gMCB0byB2aXNpYmxlIHJvdyBjb3VudCAtIDEuXG4gICAqIEBwYXJhbSByb3dWYWx1ZSBhbiBvYmplY3Qge1wiY29sdW1uIG5hbWVcIjogY29sdW1uVmFsdWUsLi4uIH1cbiAgICovXG4gIHB1YmxpYyBzZXRSb3dWYWx1ZShyb3dJbmRleDogbnVtYmVyLCByb3dWYWx1ZTogYW55KTogYW55IHtcbiAgICBpZiAocm93SW5kZXggPCAwKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgdmlzUm93cyA9IHRoaXMudmlzaWJsZVJvd3M7XG4gICAgaWYgKHJvd0luZGV4ID49IHZpc1Jvd3MubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICB2aXNSb3dzW3Jvd0luZGV4XS52YWx1ZSA9IHJvd1ZhbHVlO1xuICAgIHRoaXMub25Sb3dDaGFuZ2VkKHZpc1Jvd3Nbcm93SW5kZXhdLCBcIlwiLCByb3dWYWx1ZSwgZmFsc2UpO1xuICB9XG4gIHByb3RlY3RlZCBnZW5lcmF0ZVJvd3MoKTogQXJyYXk8TWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2U+IHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2VuZXJhdGVUb3RhbFJvdygpOiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSB7XG4gICAgcmV0dXJuIG5ldyBNYXRyaXhEcm9wZG93blRvdGFsUm93TW9kZWwodGhpcyk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU5ld1ZhbHVlKG51bGxPbkVtcHR5OiBib29sZWFuID0gZmFsc2UpOiBhbnkge1xuICAgIHZhciByZXMgPSAhdGhpcy52YWx1ZSA/IHt9IDogdGhpcy5jcmVhdGVWYWx1ZUNvcHkoKTtcbiAgICBpZiAobnVsbE9uRW1wdHkgJiYgdGhpcy5pc01hdHJpeFZhbHVlRW1wdHkocmVzKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Um93VmFsdWVDb3JlKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgcXVlc3Rpb25WYWx1ZTogYW55LFxuICAgIGNyZWF0ZTogYm9vbGVhbiA9IGZhbHNlXG4gICk6IGFueSB7XG4gICAgdmFyIHJlc3VsdCA9XG4gICAgICAhIXF1ZXN0aW9uVmFsdWUgJiYgISFxdWVzdGlvblZhbHVlW3Jvdy5yb3dOYW1lXVxuICAgICAgICA/IHF1ZXN0aW9uVmFsdWVbcm93LnJvd05hbWVdXG4gICAgICAgIDogbnVsbDtcbiAgICBpZiAoIXJlc3VsdCAmJiBjcmVhdGUpIHtcbiAgICAgIHJlc3VsdCA9IHt9O1xuICAgICAgaWYgKCEhcXVlc3Rpb25WYWx1ZSkge1xuICAgICAgICBxdWVzdGlvblZhbHVlW3Jvdy5yb3dOYW1lXSA9IHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Um93T2JqKHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UpOiBhbnkge1xuICAgIHZhciBvYmogPSB0aGlzLmdldFJvd1ZhbHVlQ29yZShyb3csIHRoaXMudmFsdWUpO1xuICAgIHJldHVybiAhIW9iaiAmJiAhIW9iai5nZXRUeXBlID8gb2JqIDogbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Um93RGlzcGxheVZhbHVlKFxuICAgIGtleXNBc1RleHQ6IGJvb2xlYW4sXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICByb3dWYWx1ZTogYW55XG4gICk6IGFueSB7XG4gICAgaWYgKCFyb3dWYWx1ZSkgcmV0dXJuIHJvd1ZhbHVlO1xuICAgIGlmICghIXJvdy5lZGl0aW5nT2JqKSByZXR1cm4gcm93VmFsdWU7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhyb3dWYWx1ZSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgIHZhciBxdWVzdGlvbiA9IHJvdy5nZXRRdWVzdGlvbkJ5TmFtZShrZXkpO1xuICAgICAgaWYgKCFxdWVzdGlvbikge1xuICAgICAgICBxdWVzdGlvbiA9IHRoaXMuZ2V0U2hhcmVkUXVlc3Rpb25CeU5hbWUoa2V5LCByb3cpO1xuICAgICAgfVxuICAgICAgaWYgKCEhcXVlc3Rpb24pIHtcbiAgICAgICAgdmFyIGRpc3BsYXl2YWx1ZSA9IHF1ZXN0aW9uLmdldERpc3BsYXlWYWx1ZShrZXlzQXNUZXh0LCByb3dWYWx1ZVtrZXldKTtcbiAgICAgICAgaWYgKGtleXNBc1RleHQgJiYgISFxdWVzdGlvbi50aXRsZSAmJiBxdWVzdGlvbi50aXRsZSAhPT0ga2V5KSB7XG4gICAgICAgICAgcm93VmFsdWVbcXVlc3Rpb24udGl0bGVdID0gZGlzcGxheXZhbHVlO1xuICAgICAgICAgIGRlbGV0ZSByb3dWYWx1ZVtrZXldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJvd1ZhbHVlW2tleV0gPSBkaXNwbGF5dmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJvd1ZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXRQbGFpbkRhdGEoXG4gICAgb3B0aW9uczoge1xuICAgICAgaW5jbHVkZUVtcHR5PzogYm9vbGVhbixcbiAgICAgIGNhbGN1bGF0aW9ucz86IEFycmF5PHtcbiAgICAgICAgcHJvcGVydHlOYW1lOiBzdHJpbmcsXG4gICAgICB9PixcbiAgICB9ID0ge1xuICAgICAgaW5jbHVkZUVtcHR5OiB0cnVlLFxuICAgIH1cbiAgKSB7XG4gICAgdmFyIHF1ZXN0aW9uUGxhaW5EYXRhID0gc3VwZXIuZ2V0UGxhaW5EYXRhKG9wdGlvbnMpO1xuICAgIGlmICghIXF1ZXN0aW9uUGxhaW5EYXRhKSB7XG4gICAgICBxdWVzdGlvblBsYWluRGF0YS5pc05vZGUgPSB0cnVlO1xuICAgICAgcXVlc3Rpb25QbGFpbkRhdGEuZGF0YSA9IHRoaXMudmlzaWJsZVJvd3MubWFwKFxuICAgICAgICAocm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSkgPT4ge1xuICAgICAgICAgIHZhciByb3dEYXRhSXRlbSA9IDxhbnk+e1xuICAgICAgICAgICAgbmFtZTogcm93LnJvd05hbWUsXG4gICAgICAgICAgICB0aXRsZTogcm93LnRleHQsXG4gICAgICAgICAgICB2YWx1ZTogcm93LnZhbHVlLFxuICAgICAgICAgICAgZGlzcGxheVZhbHVlOiB0aGlzLmdldFJvd0Rpc3BsYXlWYWx1ZShmYWxzZSwgcm93LCByb3cudmFsdWUpLFxuICAgICAgICAgICAgZ2V0U3RyaW5nOiAodmFsOiBhbnkpID0+XG4gICAgICAgICAgICAgIHR5cGVvZiB2YWwgPT09IFwib2JqZWN0XCIgPyBKU09OLnN0cmluZ2lmeSh2YWwpIDogdmFsLFxuICAgICAgICAgICAgaXNOb2RlOiB0cnVlLFxuICAgICAgICAgICAgZGF0YTogcm93LmNlbGxzXG4gICAgICAgICAgICAgIC5tYXAoKGNlbGw6IE1hdHJpeERyb3Bkb3duQ2VsbCkgPT5cbiAgICAgICAgICAgICAgICBjZWxsLnF1ZXN0aW9uLmdldFBsYWluRGF0YShvcHRpb25zKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGQ6IGFueSkgPT4gISFkKSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIChvcHRpb25zLmNhbGN1bGF0aW9ucyB8fCBbXSkuZm9yRWFjaCgoY2FsY3VsYXRpb24pID0+IHtcbiAgICAgICAgICAgIHJvd0RhdGFJdGVtW2NhbGN1bGF0aW9uLnByb3BlcnR5TmFtZV0gPSAoPGFueT5yb3cpW1xuICAgICAgICAgICAgICBjYWxjdWxhdGlvbi5wcm9wZXJ0eU5hbWVcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJvd0RhdGFJdGVtO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcXVlc3Rpb25QbGFpbkRhdGE7XG4gIH1cbiAgcHVibGljIGdldFByb2dyZXNzSW5mbygpOiBJUHJvZ3Jlc3NJbmZvIHtcbiAgICByZXR1cm4gU3VydmV5RWxlbWVudC5nZXRQcm9ncmVzc0luZm9CeUVsZW1lbnRzKFxuICAgICAgdGhpcy5nZXRDZWxsUXVlc3Rpb25zKCksXG4gICAgICB0aGlzLmlzUmVxdWlyZWRcbiAgICApO1xuICB9XG4gIHByaXZhdGUgZ2V0Q2VsbFF1ZXN0aW9ucygpOiBBcnJheTxRdWVzdGlvbj4ge1xuICAgIGNvbnN0IHJvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xuICAgIGlmICghcm93cykgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHF1ZXN0aW9ucyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgcm93ID0gcm93c1tpXTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcm93LmNlbGxzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHF1ZXN0aW9ucy5wdXNoKHJvdy5jZWxsc1tqXS5xdWVzdGlvbik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBxdWVzdGlvbnM7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25CZWZvcmVWYWx1ZUNoYW5nZWQodmFsOiBhbnkpIHsgfVxuICBwcml2YXRlIG9uU2V0UXVlc3Rpb25WYWx1ZSgpIHtcbiAgICBpZiAodGhpcy5pc1Jvd0NoYW5naW5nKSByZXR1cm47XG4gICAgdGhpcy5vbkJlZm9yZVZhbHVlQ2hhbmdlZCh0aGlzLnZhbHVlKTtcbiAgICBpZiAoIXRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MgfHwgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5sZW5ndGggPT0gMClcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLmlzUm93Q2hhbmdpbmcgPSB0cnVlO1xuICAgIHZhciB2YWwgPSB0aGlzLmNyZWF0ZU5ld1ZhbHVlKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcm93ID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXTtcbiAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3NbaV0udmFsdWUgPSB0aGlzLmdldFJvd1ZhbHVlQ29yZShyb3csIHZhbCk7XG4gICAgfVxuICAgIHRoaXMuaXNSb3dDaGFuZ2luZyA9IGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBzZXRRdWVzdGlvblZhbHVlKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBzdXBlci5zZXRRdWVzdGlvblZhbHVlKG5ld1ZhbHVlLCBmYWxzZSk7XG4gICAgdGhpcy5vblNldFF1ZXN0aW9uVmFsdWUoKTtcbiAgICB0aGlzLnVwZGF0ZUlzQW5zd2VyZWQoKTtcbiAgfVxuICBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHtcbiAgICB2YXIgcm93cyA9IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3M7XG4gICAgaWYgKCFyb3dzKSByb3dzID0gdGhpcy52aXNpYmxlUm93cztcbiAgICBpZiAoIXJvd3MpIHJldHVybiB0cnVlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNlbGxzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXS5jZWxscztcbiAgICAgIGlmICghY2VsbHMpIGNvbnRpbnVlO1xuICAgICAgZm9yICh2YXIgY29sSW5kZXggPSAwOyBjb2xJbmRleCA8IGNlbGxzLmxlbmd0aDsgY29sSW5kZXgrKykge1xuICAgICAgICB2YXIgcXVlc3Rpb24gPSBjZWxsc1tjb2xJbmRleF0ucXVlc3Rpb247XG4gICAgICAgIGlmIChcbiAgICAgICAgICBxdWVzdGlvbiAmJlxuICAgICAgICAgICghcXVlc3Rpb24uc3VwcG9ydEdvTmV4dFBhZ2VBdXRvbWF0aWMoKSB8fCAhcXVlc3Rpb24udmFsdWUpXG4gICAgICAgIClcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByb3RlY3RlZCBnZXRDb250YWluc0Vycm9ycygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgc3VwZXIuZ2V0Q29udGFpbnNFcnJvcnMoKSB8fFxuICAgICAgdGhpcy5jaGVja0ZvckFuc3dlcnNPckVycm9ycyhcbiAgICAgICAgKHF1ZXN0aW9uOiBRdWVzdGlvbikgPT4gcXVlc3Rpb24uY29udGFpbnNFcnJvcnMsXG4gICAgICAgIGZhbHNlXG4gICAgICApXG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0SXNBbnN3ZXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgc3VwZXIuZ2V0SXNBbnN3ZXJlZCgpICYmXG4gICAgICB0aGlzLmNoZWNrRm9yQW5zd2Vyc09yRXJyb3JzKFxuICAgICAgICAocXVlc3Rpb246IFF1ZXN0aW9uKSA9PiBxdWVzdGlvbi5pc0Fuc3dlcmVkLFxuICAgICAgICB0cnVlXG4gICAgICApXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGNoZWNrRm9yQW5zd2Vyc09yRXJyb3JzKFxuICAgIHByZWRpY2F0ZTogKHF1ZXN0aW9uOiBRdWVzdGlvbikgPT4gYm9vbGVhbixcbiAgICBldmVyeTogYm9vbGVhbiA9IGZhbHNlXG4gICkge1xuICAgIHZhciByb3dzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cztcbiAgICBpZiAoIXJvd3MpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjZWxscyA9IHJvd3NbaV0uY2VsbHM7XG4gICAgICBpZiAoIWNlbGxzKSBjb250aW51ZTtcbiAgICAgIGZvciAodmFyIGNvbEluZGV4ID0gMDsgY29sSW5kZXggPCBjZWxscy5sZW5ndGg7IGNvbEluZGV4KyspIHtcbiAgICAgICAgaWYgKCFjZWxsc1tjb2xJbmRleF0pIGNvbnRpbnVlO1xuICAgICAgICB2YXIgcXVlc3Rpb24gPSBjZWxsc1tjb2xJbmRleF0ucXVlc3Rpb247XG4gICAgICAgIGlmIChxdWVzdGlvbiAmJiBxdWVzdGlvbi5pc1Zpc2libGUpXG4gICAgICAgICAgaWYgKHByZWRpY2F0ZShxdWVzdGlvbikpIHtcbiAgICAgICAgICAgIGlmICghZXZlcnkpIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoZXZlcnkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBldmVyeSA/IHRydWUgOiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgaGFzRXJyb3JzKGZpcmVDYWxsYmFjazogYm9vbGVhbiA9IHRydWUsIHJlYzogYW55ID0gbnVsbCk6IGJvb2xlYW4ge1xuICAgIHZhciBlcnJvc0luUm93cyA9IHRoaXMuaGFzRXJyb3JJblJvd3MoZmlyZUNhbGxiYWNrLCByZWMpO1xuICAgIHZhciBpc0R1cGxpY2F0ZWQgPSB0aGlzLmlzVmFsdWVEdXBsaWNhdGVkKCk7XG4gICAgcmV0dXJuIHN1cGVyLmhhc0Vycm9ycyhmaXJlQ2FsbGJhY2ssIHJlYykgfHwgZXJyb3NJblJvd3MgfHwgaXNEdXBsaWNhdGVkO1xuICB9XG4gIHByb3RlY3RlZCBnZXRJc1J1bm5pbmdWYWxpZGF0b3JzKCk6IGJvb2xlYW4ge1xuICAgIGlmIChzdXBlci5nZXRJc1J1bm5pbmdWYWxpZGF0b3JzKCkpIHJldHVybiB0cnVlO1xuICAgIGlmICghdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNlbGxzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXS5jZWxscztcbiAgICAgIGlmICghY2VsbHMpIGNvbnRpbnVlO1xuICAgICAgZm9yICh2YXIgY29sSW5kZXggPSAwOyBjb2xJbmRleCA8IGNlbGxzLmxlbmd0aDsgY29sSW5kZXgrKykge1xuICAgICAgICBpZiAoIWNlbGxzW2NvbEluZGV4XSkgY29udGludWU7XG4gICAgICAgIHZhciBxdWVzdGlvbiA9IGNlbGxzW2NvbEluZGV4XS5xdWVzdGlvbjtcbiAgICAgICAgaWYgKCEhcXVlc3Rpb24gJiYgcXVlc3Rpb24uaXNSdW5uaW5nVmFsaWRhdG9ycykgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgZ2V0QWxsRXJyb3JzKCk6IEFycmF5PFN1cnZleUVycm9yPiB7XG4gICAgdmFyIHJlc3VsdCA9IHN1cGVyLmdldEFsbEVycm9ycygpO1xuICAgIHZhciByb3dzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cztcblxuICAgIGlmIChyb3dzID09PSBudWxsKSByZXR1cm4gcmVzdWx0O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcm93ID0gcm93c1tpXTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcm93LmNlbGxzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBlcnJvcnMgPSByb3cuY2VsbHNbal0ucXVlc3Rpb24uZ2V0QWxsRXJyb3JzKCk7XG4gICAgICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KGVycm9ycyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwcml2YXRlIGhhc0Vycm9ySW5Sb3dzKGZpcmVDYWxsYmFjazogYm9vbGVhbiwgcmVjOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgcmVzID0gZmFsc2U7XG4gICAgaWYgKCFyZWMpIHJlYyA9IHt9O1xuICAgIHJlYy5pc1NpbmdsZURldGFpbFBhbmVsID0gdGhpcy5kZXRhaWxQYW5lbE1vZGUgPT09IFwidW5kZXJSb3dTaW5nbGVcIjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlcyA9XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3NbaV0uaGFzRXJyb3JzKGZpcmVDYWxsYmFjaywgcmVjLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5yYWlzZU9uQ29tcGxldGVkQXN5bmNWYWxpZGF0b3JzKCk7XG4gICAgICAgIH0pIHx8IHJlcztcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIGlzVmFsdWVEdXBsaWNhdGVkKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBjb2x1bW5zID0gdGhpcy5nZXRVbmlxdWVDb2x1bW5zKCk7XG4gICAgdmFyIHJlcyA9IGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzID0gdGhpcy5pc1ZhbHVlSW5Db2x1bW5EdXBsaWNhdGVkKGNvbHVtbnNbaV0pIHx8IHJlcztcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIGlzVmFsdWVJbkNvbHVtbkR1cGxpY2F0ZWQoY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbik6IGJvb2xlYW4ge1xuICAgIHZhciBrZXlWYWx1ZXMgPSA8QXJyYXk8YW55Pj5bXTtcbiAgICB2YXIgcmVzID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXMgPVxuICAgICAgICB0aGlzLmlzVmFsdWVEdXBsaWNhdGVkSW5Sb3coXG4gICAgICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXSxcbiAgICAgICAgICBjb2x1bW4sXG4gICAgICAgICAga2V5VmFsdWVzXG4gICAgICAgICkgfHwgcmVzO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByb3RlY3RlZCBnZXRVbmlxdWVDb2x1bW5zKCk6IEFycmF5PE1hdHJpeERyb3Bkb3duQ29sdW1uPiB7XG4gICAgdmFyIHJlcyA9IG5ldyBBcnJheTxNYXRyaXhEcm9wZG93bkNvbHVtbj4oKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuY29sdW1uc1tpXS5pc1VuaXF1ZSkge1xuICAgICAgICByZXMucHVzaCh0aGlzLmNvbHVtbnNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgaXNWYWx1ZUR1cGxpY2F0ZWRJblJvdyhcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4sXG4gICAga2V5VmFsdWVzOiBBcnJheTxhbnk+XG4gICk6IGJvb2xlYW4ge1xuICAgIHZhciBxdWVzdGlvbiA9IHJvdy5nZXRRdWVzdGlvbkJ5Q29sdW1uKGNvbHVtbik7XG4gICAgaWYgKCFxdWVzdGlvbiB8fCBxdWVzdGlvbi5pc0VtcHR5KCkpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgdmFsdWUgPSBxdWVzdGlvbi52YWx1ZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleVZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZhbHVlID09IGtleVZhbHVlc1tpXSkge1xuICAgICAgICB0aGlzLmFkZER1cGxpY2F0aW9uRXJyb3IocXVlc3Rpb24pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAga2V5VmFsdWVzLnB1c2godmFsdWUpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcml2YXRlIGFkZER1cGxpY2F0aW9uRXJyb3IocXVlc3Rpb246IFF1ZXN0aW9uKSB7XG4gICAgcXVlc3Rpb24uYWRkRXJyb3IobmV3IEtleUR1cGxpY2F0aW9uRXJyb3IodGhpcy5rZXlEdXBsaWNhdGlvbkVycm9yLCB0aGlzKSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEZpcnN0SW5wdXRFbGVtZW50SWQoKTogc3RyaW5nIHtcbiAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmdldEZpcnN0Q2VsbFF1ZXN0aW9uKGZhbHNlKTtcbiAgICByZXR1cm4gcXVlc3Rpb24gPyBxdWVzdGlvbi5pbnB1dElkIDogc3VwZXIuZ2V0Rmlyc3RJbnB1dEVsZW1lbnRJZCgpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRGaXJzdEVycm9ySW5wdXRFbGVtZW50SWQoKTogc3RyaW5nIHtcbiAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmdldEZpcnN0Q2VsbFF1ZXN0aW9uKHRydWUpO1xuICAgIHJldHVybiBxdWVzdGlvbiA/IHF1ZXN0aW9uLmlucHV0SWQgOiBzdXBlci5nZXRGaXJzdEVycm9ySW5wdXRFbGVtZW50SWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Rmlyc3RDZWxsUXVlc3Rpb24ob25FcnJvcjogYm9vbGVhbik6IFF1ZXN0aW9uIHtcbiAgICBpZiAoIXRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MpIHJldHVybiBudWxsO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNlbGxzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXS5jZWxscztcbiAgICAgIGZvciAodmFyIGNvbEluZGV4ID0gMDsgY29sSW5kZXggPCBjZWxscy5sZW5ndGg7IGNvbEluZGV4KyspIHtcbiAgICAgICAgaWYgKCFvbkVycm9yKSByZXR1cm4gY2VsbHNbY29sSW5kZXhdLnF1ZXN0aW9uO1xuICAgICAgICBpZiAoY2VsbHNbY29sSW5kZXhdLnF1ZXN0aW9uLmN1cnJlbnRFcnJvckNvdW50ID4gMClcbiAgICAgICAgICByZXR1cm4gY2VsbHNbY29sSW5kZXhdLnF1ZXN0aW9uO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgb25SZWFkT25seUNoYW5nZWQoKSB7XG4gICAgc3VwZXIub25SZWFkT25seUNoYW5nZWQoKTtcbiAgICBpZiAoIXRoaXMuZ2VuZXJhdGVSb3dzKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnZpc2libGVSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnZpc2libGVSb3dzW2ldLm9uUXVlc3Rpb25SZWFkT25seUNoYW5nZWQodGhpcy5pc1JlYWRPbmx5KTtcbiAgICB9XG4gIH1cblxuICAvL0lNYXRyaXhEcm9wZG93bkRhdGFcbiAgcHVibGljIGNyZWF0ZVF1ZXN0aW9uKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtblxuICApOiBRdWVzdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlUXVlc3Rpb25Db3JlKHJvdywgY29sdW1uKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlUXVlc3Rpb25Db3JlKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtblxuICApOiBRdWVzdGlvbiB7XG4gICAgdmFyIHF1ZXN0aW9uID0gY29sdW1uLmNyZWF0ZUNlbGxRdWVzdGlvbihyb3cpO1xuICAgIGlmICh0aGlzLmlzUmVhZE9ubHkpIHtcbiAgICAgIHF1ZXN0aW9uLnJlYWRPbmx5ID0gdHJ1ZTtcbiAgICB9XG4gICAgcXVlc3Rpb24uc2V0U3VydmV5SW1wbChyb3cpO1xuICAgIHF1ZXN0aW9uLnNldFBhcmVudFF1ZXN0aW9uKHRoaXMpO1xuICAgIHJldHVybiBxdWVzdGlvbjtcbiAgfVxuICBwcm90ZWN0ZWQgZGVsZXRlUm93VmFsdWUoXG4gICAgbmV3VmFsdWU6IGFueSxcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlXG4gICk6IGFueSB7XG4gICAgaWYgKCFuZXdWYWx1ZSkgcmV0dXJuIG5ld1ZhbHVlO1xuICAgIGRlbGV0ZSBuZXdWYWx1ZVtyb3cucm93TmFtZV07XG4gICAgcmV0dXJuIHRoaXMuaXNPYmplY3QobmV3VmFsdWUpICYmIE9iamVjdC5rZXlzKG5ld1ZhbHVlKS5sZW5ndGggPT0gMFxuICAgICAgPyBudWxsXG4gICAgICA6IG5ld1ZhbHVlO1xuICB9XG4gIHByaXZhdGUgaXNEb2luZ29uQW55VmFsdWVDaGFuZ2VkID0gZmFsc2U7XG4gIG9uQW55VmFsdWVDaGFuZ2VkKG5hbWU6IHN0cmluZykge1xuICAgIGlmIChcbiAgICAgIHRoaXMuaXNMb2FkaW5nRnJvbUpzb24gfHxcbiAgICAgIHRoaXMuaXNEb2luZ29uQW55VmFsdWVDaGFuZ2VkIHx8XG4gICAgICAhdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1xuICAgIClcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLmlzRG9pbmdvbkFueVZhbHVlQ2hhbmdlZCA9IHRydWU7XG4gICAgdmFyIHJvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgcm93c1tpXS5vbkFueVZhbHVlQ2hhbmdlZChuYW1lKTtcbiAgICB9XG4gICAgdmFyIHRvdGFsUm93ID0gdGhpcy52aXNpYmxlVG90YWxSb3c7XG4gICAgaWYgKCEhdG90YWxSb3cpIHtcbiAgICAgIHRvdGFsUm93Lm9uQW55VmFsdWVDaGFuZ2VkKG5hbWUpO1xuICAgIH1cbiAgICB0aGlzLmlzRG9pbmdvbkFueVZhbHVlQ2hhbmdlZCA9IGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBpc09iamVjdCh2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIjtcbiAgfVxuICBwcml2YXRlIGdldE9uQ2VsbFZhbHVlQ2hhbmdlZE9wdGlvbnMoXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICBjb2x1bW5OYW1lOiBzdHJpbmcsXG4gICAgcm93VmFsdWU6IGFueVxuICApOiBhbnkge1xuICAgIHZhciBnZXRRdWVzdGlvbiA9IChjb2xOYW1lOiBhbnkpID0+IHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93LmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjb2wgPSByb3cuY2VsbHNbaV0uY29sdW1uO1xuICAgICAgICBpZiAoISFjb2wgJiYgY29sLm5hbWUgPT09IGNvbE5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gcm93LmNlbGxzW2ldLnF1ZXN0aW9uO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICByb3c6IHJvdyxcbiAgICAgIGNvbHVtbk5hbWU6IGNvbHVtbk5hbWUsXG4gICAgICByb3dWYWx1ZTogcm93VmFsdWUsXG4gICAgICB2YWx1ZTogISFyb3dWYWx1ZSA/IHJvd1ZhbHVlW2NvbHVtbk5hbWVdIDogbnVsbCxcbiAgICAgIGdldENlbGxRdWVzdGlvbjogZ2V0UXVlc3Rpb24sXG4gICAgfTtcbiAgfVxuICBwcm90ZWN0ZWQgb25DZWxsVmFsdWVDaGFuZ2VkKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgY29sdW1uTmFtZTogc3RyaW5nLFxuICAgIHJvd1ZhbHVlOiBhbnlcbiAgKSB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSkgcmV0dXJuO1xuICAgIHZhciBvcHRpb25zID0gdGhpcy5nZXRPbkNlbGxWYWx1ZUNoYW5nZWRPcHRpb25zKHJvdywgY29sdW1uTmFtZSwgcm93VmFsdWUpO1xuICAgIGlmICghIXRoaXMub25DZWxsVmFsdWVDaGFuZ2VkQ2FsbGJhY2spIHtcbiAgICAgIHRoaXMub25DZWxsVmFsdWVDaGFuZ2VkQ2FsbGJhY2sob3B0aW9ucyk7XG4gICAgfVxuICAgIHRoaXMuc3VydmV5Lm1hdHJpeENlbGxWYWx1ZUNoYW5nZWQodGhpcywgb3B0aW9ucyk7XG4gIH1cbiAgdmFsaWRhdGVDZWxsKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgY29sdW1uTmFtZTogc3RyaW5nLFxuICAgIHJvd1ZhbHVlOiBhbnlcbiAgKTogU3VydmV5RXJyb3Ige1xuICAgIGlmICghdGhpcy5zdXJ2ZXkpIHJldHVybjtcbiAgICB2YXIgb3B0aW9ucyA9IHRoaXMuZ2V0T25DZWxsVmFsdWVDaGFuZ2VkT3B0aW9ucyhyb3csIGNvbHVtbk5hbWUsIHJvd1ZhbHVlKTtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkubWF0cml4Q2VsbFZhbGlkYXRlKHRoaXMsIG9wdGlvbnMpO1xuICB9XG4gIGdldCBpc1ZhbGlkYXRlT25WYWx1ZUNoYW5naW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuc3VydmV5ID8gdGhpcy5zdXJ2ZXkuaXNWYWxpZGF0ZU9uVmFsdWVDaGFuZ2luZyA6IGZhbHNlO1xuICB9XG4gIG9uUm93Q2hhbmdpbmcoXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICBjb2x1bW5OYW1lOiBzdHJpbmcsXG4gICAgcm93VmFsdWU6IGFueVxuICApOiBhbnkge1xuICAgIGlmICghdGhpcy5zdXJ2ZXkpIHJldHVybiAhIXJvd1ZhbHVlID8gcm93VmFsdWVbY29sdW1uTmFtZV0gOiBudWxsO1xuICAgIHZhciBvcHRpb25zID0gdGhpcy5nZXRPbkNlbGxWYWx1ZUNoYW5nZWRPcHRpb25zKHJvdywgY29sdW1uTmFtZSwgcm93VmFsdWUpO1xuICAgIHZhciBvbGRSb3dWYWx1ZSA9IHRoaXMuZ2V0Um93VmFsdWVDb3JlKHJvdywgdGhpcy5jcmVhdGVOZXdWYWx1ZSgpLCB0cnVlKTtcbiAgICBvcHRpb25zLm9sZFZhbHVlID0gISFvbGRSb3dWYWx1ZSA/IG9sZFJvd1ZhbHVlW2NvbHVtbk5hbWVdIDogbnVsbDtcbiAgICB0aGlzLnN1cnZleS5tYXRyaXhDZWxsVmFsdWVDaGFuZ2luZyh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9ucy52YWx1ZTtcbiAgfVxuICBvblJvd0NoYW5nZWQoXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICBjb2x1bW5OYW1lOiBzdHJpbmcsXG4gICAgbmV3Um93VmFsdWU6IGFueSxcbiAgICBpc0RlbGV0aW5nVmFsdWU6IGJvb2xlYW5cbiAgKSB7XG4gICAgdmFyIHJvd09iaiA9ICEhY29sdW1uTmFtZSA/IHRoaXMuZ2V0Um93T2JqKHJvdykgOiBudWxsO1xuICAgIGlmICghIXJvd09iaikge1xuICAgICAgdmFyIGNvbHVtblZhbHVlID0gbnVsbDtcbiAgICAgIGlmICghIW5ld1Jvd1ZhbHVlICYmICFpc0RlbGV0aW5nVmFsdWUpIHtcbiAgICAgICAgY29sdW1uVmFsdWUgPSBuZXdSb3dWYWx1ZVtjb2x1bW5OYW1lXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaXNSb3dDaGFuZ2luZyA9IHRydWU7XG4gICAgICByb3dPYmpbY29sdW1uTmFtZV0gPSBjb2x1bW5WYWx1ZTtcbiAgICAgIHRoaXMuaXNSb3dDaGFuZ2luZyA9IGZhbHNlO1xuICAgICAgdGhpcy5vbkNlbGxWYWx1ZUNoYW5nZWQocm93LCBjb2x1bW5OYW1lLCByb3dPYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgb2xkVmFsdWUgPSB0aGlzLmNyZWF0ZU5ld1ZhbHVlKHRydWUpO1xuICAgICAgdmFyIGNvbWJpbmUgPSB0aGlzLmdldE5ld1ZhbHVlT25Sb3dDaGFuZ2VkKFxuICAgICAgICByb3csXG4gICAgICAgIGNvbHVtbk5hbWUsXG4gICAgICAgIG5ld1Jvd1ZhbHVlLFxuICAgICAgICBpc0RlbGV0aW5nVmFsdWUsXG4gICAgICAgIHRoaXMuY3JlYXRlTmV3VmFsdWUoKVxuICAgICAgKTtcbiAgICAgIGlmICh0aGlzLmlzVHdvVmFsdWVFcXVhbHMob2xkVmFsdWUsIGNvbWJpbmUudmFsdWUpKSByZXR1cm47XG4gICAgICB0aGlzLmlzUm93Q2hhbmdpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5zZXROZXdWYWx1ZShjb21iaW5lLnZhbHVlKTtcbiAgICAgIHRoaXMuaXNSb3dDaGFuZ2luZyA9IGZhbHNlO1xuICAgICAgaWYgKGNvbHVtbk5hbWUpIHtcbiAgICAgICAgdGhpcy5vbkNlbGxWYWx1ZUNoYW5nZWQocm93LCBjb2x1bW5OYW1lLCBjb21iaW5lLnJvd1ZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXROZXdWYWx1ZU9uUm93Q2hhbmdlZChcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIGNvbHVtbk5hbWU6IHN0cmluZyxcbiAgICBuZXdSb3dWYWx1ZTogYW55LFxuICAgIGlzRGVsZXRpbmdWYWx1ZTogYm9vbGVhbixcbiAgICBuZXdWYWx1ZTogYW55XG4gICk6IGFueSB7XG4gICAgdmFyIHJvd1ZhbHVlID0gdGhpcy5nZXRSb3dWYWx1ZUNvcmUocm93LCBuZXdWYWx1ZSwgdHJ1ZSk7XG4gICAgaWYgKGlzRGVsZXRpbmdWYWx1ZSkge1xuICAgICAgZGVsZXRlIHJvd1ZhbHVlW2NvbHVtbk5hbWVdO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvdy5jZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IHJvdy5jZWxsc1tpXS5xdWVzdGlvbi5nZXRWYWx1ZU5hbWUoKTtcbiAgICAgIGRlbGV0ZSByb3dWYWx1ZVtrZXldO1xuICAgIH1cbiAgICBpZiAobmV3Um93VmFsdWUpIHtcbiAgICAgIG5ld1Jvd1ZhbHVlID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShuZXdSb3dWYWx1ZSkpO1xuICAgICAgZm9yICh2YXIga2V5IGluIG5ld1Jvd1ZhbHVlKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbHVlRW1wdHkobmV3Um93VmFsdWVba2V5XSkpIHtcbiAgICAgICAgICByb3dWYWx1ZVtrZXldID0gbmV3Um93VmFsdWVba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5pc09iamVjdChyb3dWYWx1ZSkgJiYgT2JqZWN0LmtleXMocm93VmFsdWUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgbmV3VmFsdWUgPSB0aGlzLmRlbGV0ZVJvd1ZhbHVlKG5ld1ZhbHVlLCByb3cpO1xuICAgIH1cbiAgICByZXR1cm4geyB2YWx1ZTogbmV3VmFsdWUsIHJvd1ZhbHVlOiByb3dWYWx1ZSB9O1xuICB9XG4gIGdldFJvd0luZGV4KHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykgcmV0dXJuIC0xO1xuICAgIHJldHVybiB0aGlzLnZpc2libGVSb3dzLmluZGV4T2Yocm93KTtcbiAgfVxuICBwdWJsaWMgZ2V0RWxlbWVudHNJbkRlc2lnbihpbmNsdWRlSGlkZGVuOiBib29sZWFuID0gZmFsc2UpOiBBcnJheTxJRWxlbWVudD4ge1xuICAgIGlmICh0aGlzLmRldGFpbFBhbmVsTW9kZSA9PSBcIm5vbmVcIilcbiAgICAgIHJldHVybiBzdXBlci5nZXRFbGVtZW50c0luRGVzaWduKGluY2x1ZGVIaWRkZW4pO1xuICAgIHJldHVybiBpbmNsdWRlSGlkZGVuID8gW3RoaXMuZGV0YWlsUGFuZWxdIDogdGhpcy5kZXRhaWxFbGVtZW50cztcbiAgfVxuICBoYXNEZXRhaWxQYW5lbChyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuZGV0YWlsUGFuZWxNb2RlID09IFwibm9uZVwiKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoISF0aGlzLm9uSGFzRGV0YWlsUGFuZWxDYWxsYmFjaylcbiAgICAgIHJldHVybiB0aGlzLm9uSGFzRGV0YWlsUGFuZWxDYWxsYmFjayhyb3cpO1xuICAgIHJldHVybiB0aGlzLmRldGFpbEVsZW1lbnRzLmxlbmd0aCA+IDA7XG4gIH1cbiAgZ2V0SXNEZXRhaWxQYW5lbFNob3dpbmcocm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmRldGFpbFBhbmVsTW9kZSA9PSBcIm5vbmVcIikgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkge1xuICAgICAgdmFyIHJlcyA9IHRoaXMudmlzaWJsZVJvd3MuaW5kZXhPZihyb3cpID09IDA7XG4gICAgICBpZiAocmVzKSB7XG4gICAgICAgIGlmICghcm93LmRldGFpbFBhbmVsKSB7XG4gICAgICAgICAgcm93LnNob3dEZXRhaWxQYW5lbCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNSb3dTaG93aW5nXCIgKyByb3cuaWQsIGZhbHNlKTtcbiAgfVxuICBzZXRJc0RldGFpbFBhbmVsU2hvd2luZyhyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLCB2YWw6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodmFsID09IHRoaXMuZ2V0SXNEZXRhaWxQYW5lbFNob3dpbmcocm93KSkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzUm93U2hvd2luZ1wiICsgcm93LmlkLCB2YWwpO1xuICAgIHRoaXMudXBkYXRlRGV0YWlsUGFuZWxCdXR0b25Dc3Mocm93KTtcbiAgICBpZiAoISF0aGlzLnJlbmRlcmVkVGFibGUpIHtcbiAgICAgIHRoaXMucmVuZGVyZWRUYWJsZS5vbkRldGFpbFBhbmVsQ2hhbmdlVmlzaWJpbGl0eShyb3csIHZhbCk7XG4gICAgfVxuICAgIGlmICh2YWwgJiYgdGhpcy5kZXRhaWxQYW5lbE1vZGUgPT09IFwidW5kZXJSb3dTaW5nbGVcIikge1xuICAgICAgdmFyIHJvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChyb3dzW2ldLmlkICE9PSByb3cuaWQgJiYgcm93c1tpXS5pc0RldGFpbFBhbmVsU2hvd2luZykge1xuICAgICAgICAgIHJvd3NbaV0uaGlkZURldGFpbFBhbmVsKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIGdldERldGFpbFBhbmVsQnV0dG9uQ3NzKHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgQ3NzQ2xhc3NCdWlsZGVyKCkuYXBwZW5kKHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImRldGFpbEJ1dHRvbkNzc1wiICsgcm93LmlkKSk7XG4gICAgcmV0dXJuIGJ1aWxkZXIuYXBwZW5kKHRoaXMuY3NzQ2xhc3Nlcy5kZXRhaWxCdXR0b24sIGJ1aWxkZXIudG9TdHJpbmcoKSA9PT0gXCJcIikudG9TdHJpbmcoKTtcbiAgfVxuICBwdWJsaWMgZ2V0RGV0YWlsUGFuZWxJY29uQ3NzKHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgQ3NzQ2xhc3NCdWlsZGVyKCkuYXBwZW5kKHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImRldGFpbEljb25Dc3NcIiArIHJvdy5pZCkpO1xuICAgIHJldHVybiBidWlsZGVyLmFwcGVuZCh0aGlzLmNzc0NsYXNzZXMuZGV0YWlsSWNvbiwgYnVpbGRlci50b1N0cmluZygpID09PSBcIlwiKS50b1N0cmluZygpO1xuICB9XG4gIHByaXZhdGUgdXBkYXRlRGV0YWlsUGFuZWxCdXR0b25Dc3Mocm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSkge1xuICAgIGNvbnN0IGNsYXNzZXMgPSB0aGlzLmNzc0NsYXNzZXM7XG4gICAgY29uc3QgaXNQYW5lbFNob3dpbmcgPSB0aGlzLmdldElzRGV0YWlsUGFuZWxTaG93aW5nKHJvdyk7XG5cbiAgICBjb25zdCBpY29uQnVpbGRlciA9IG5ldyBDc3NDbGFzc0J1aWxkZXIoKS5hcHBlbmQoY2xhc3Nlcy5kZXRhaWxJY29uKVxuICAgICAgLmFwcGVuZChjbGFzc2VzLmRldGFpbEljb25FeHBhbmRlZCwgaXNQYW5lbFNob3dpbmcpO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImRldGFpbEljb25Dc3NcIiArIHJvdy5pZCwgaWNvbkJ1aWxkZXIudG9TdHJpbmcoKSk7XG5cbiAgICBjb25zdCBidXR0b25CdWlsZGVyID0gbmV3IENzc0NsYXNzQnVpbGRlcigpLmFwcGVuZChjbGFzc2VzLmRldGFpbEJ1dHRvbilcbiAgICAgIC5hcHBlbmQoY2xhc3Nlcy5kZXRhaWxCdXR0b25FeHBhbmRlZCwgaXNQYW5lbFNob3dpbmcpO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImRldGFpbEJ1dHRvbkNzc1wiICsgcm93LmlkLCBidXR0b25CdWlsZGVyLnRvU3RyaW5nKCkpO1xuICB9XG4gIGNyZWF0ZVJvd0RldGFpbFBhbmVsKHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UpOiBQYW5lbE1vZGVsIHtcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUpIHJldHVybiB0aGlzLmRldGFpbFBhbmVsO1xuICAgIHZhciBwYW5lbCA9IHRoaXMuY3JlYXRlTmV3RGV0YWlsUGFuZWwoKTtcbiAgICBwYW5lbC5yZWFkT25seSA9IHRoaXMuaXNSZWFkT25seTtcbiAgICB2YXIganNvbiA9IHRoaXMuZGV0YWlsUGFuZWwudG9KU09OKCk7XG4gICAgbmV3IEpzb25PYmplY3QoKS50b09iamVjdChqc29uLCBwYW5lbCk7XG4gICAgcGFuZWwucmVuZGVyV2lkdGggPSBcIjEwMCVcIjtcbiAgICBwYW5lbC51cGRhdGVDdXN0b21XaWRnZXRzKCk7XG4gICAgaWYgKCEhdGhpcy5vbkNyZWF0ZURldGFpbFBhbmVsQ2FsbGJhY2spIHtcbiAgICAgIHRoaXMub25DcmVhdGVEZXRhaWxQYW5lbENhbGxiYWNrKHJvdywgcGFuZWwpO1xuICAgIH1cbiAgICByZXR1cm4gcGFuZWw7XG4gIH1cbiAgZ2V0U2hhcmVkUXVlc3Rpb25CeU5hbWUoXG4gICAgY29sdW1uTmFtZTogc3RyaW5nLFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2VcbiAgKTogUXVlc3Rpb24ge1xuICAgIGlmICghdGhpcy5zdXJ2ZXkgfHwgIXRoaXMudmFsdWVOYW1lKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgaW5kZXggPSB0aGlzLmdldFJvd0luZGV4KHJvdyk7XG4gICAgaWYgKGluZGV4IDwgMCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIDxRdWVzdGlvbj4oXG4gICAgICB0aGlzLnN1cnZleS5nZXRRdWVzdGlvbkJ5VmFsdWVOYW1lRnJvbUFycmF5KFxuICAgICAgICB0aGlzLnZhbHVlTmFtZSxcbiAgICAgICAgY29sdW1uTmFtZSxcbiAgICAgICAgaW5kZXhcbiAgICAgIClcbiAgICApO1xuICB9XG4gIG9uVG90YWxWYWx1ZUNoYW5nZWQoKTogYW55IHtcbiAgICBpZiAoXG4gICAgICAhIXRoaXMuZGF0YSAmJlxuICAgICAgISF0aGlzLnZpc2libGVUb3RhbFJvdyAmJlxuICAgICAgIXRoaXMuaXNMb2FkaW5nRnJvbUpzb24gJiZcbiAgICAgICF0aGlzLmlzU2V0dCAmJlxuICAgICAgIXRoaXMuaXNSZWFkT25seVxuICAgICkge1xuICAgICAgdGhpcy5kYXRhLnNldFZhbHVlKFxuICAgICAgICB0aGlzLmdldFZhbHVlTmFtZSgpICsgc2V0dGluZ3MubWF0cml4VG90YWxWYWx1ZVBvc3RGaXgsXG4gICAgICAgIHRoaXMudG90YWxWYWx1ZSxcbiAgICAgICAgZmFsc2VcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRRdWVzdGlvbkZyb21BcnJheShuYW1lOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBJUXVlc3Rpb24ge1xuICAgIGlmIChpbmRleCA+PSB0aGlzLnZpc2libGVSb3dzLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZVJvd3NbaW5kZXhdLmdldFF1ZXN0aW9uQnlOYW1lKG5hbWUpO1xuICB9XG4gIHByaXZhdGUgaXNNYXRyaXhWYWx1ZUVtcHR5KHZhbDogYW55KSB7XG4gICAgaWYgKCF2YWwpIHJldHVybjtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAodGhpcy5pc09iamVjdCh2YWxbaV0pICYmIE9iamVjdC5rZXlzKHZhbFtpXSkubGVuZ3RoID4gMClcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHZhbCkubGVuZ3RoID09IDA7XG4gIH1cblxuICBwcml2YXRlIGdldCBTdXJ2ZXlNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkgYXMgU3VydmV5TW9kZWw7XG4gIH1cbiAgcHVibGljIGdldENlbGxUZW1wbGF0ZURhdGEoY2VsbDogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCkge1xuICAgIC8vIHJldHVybiBjZWxsLmNlbGwuY29sdW1uLnRlbXBsYXRlUXVlc3Rpb247XG4gICAgcmV0dXJuIHRoaXMuU3VydmV5TW9kZWwuZ2V0TWF0cml4Q2VsbFRlbXBsYXRlRGF0YShjZWxsKTtcbiAgfVxuICBwdWJsaWMgZ2V0Q2VsbFdyYXBwZXJDb21wb25lbnROYW1lKGNlbGw6IE1hdHJpeERyb3Bkb3duQ2VsbCkge1xuICAgIHJldHVybiB0aGlzLlN1cnZleU1vZGVsLmdldEVsZW1lbnRXcmFwcGVyQ29tcG9uZW50TmFtZShjZWxsLCBcImNlbGxcIik7XG4gIH1cbiAgcHVibGljIGdldENlbGxXcmFwcGVyQ29tcG9uZW50RGF0YShjZWxsOiBNYXRyaXhEcm9wZG93bkNlbGwpIHtcbiAgICByZXR1cm4gdGhpcy5TdXJ2ZXlNb2RlbC5nZXRFbGVtZW50V3JhcHBlckNvbXBvbmVudERhdGEoY2VsbCwgXCJjZWxsXCIpO1xuICB9XG4gIHB1YmxpYyBnZXRDb2x1bW5IZWFkZXJXcmFwcGVyQ29tcG9uZW50TmFtZShjZWxsOiBNYXRyaXhEcm9wZG93bkNlbGwpIHtcbiAgICByZXR1cm4gdGhpcy5TdXJ2ZXlNb2RlbC5nZXRFbGVtZW50V3JhcHBlckNvbXBvbmVudE5hbWUoXG4gICAgICBjZWxsLFxuICAgICAgXCJjb2x1bW4taGVhZGVyXCJcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXRDb2x1bW5IZWFkZXJXcmFwcGVyQ29tcG9uZW50RGF0YShjZWxsOiBNYXRyaXhEcm9wZG93bkNlbGwpIHtcbiAgICByZXR1cm4gdGhpcy5TdXJ2ZXlNb2RlbC5nZXRFbGVtZW50V3JhcHBlckNvbXBvbmVudERhdGEoXG4gICAgICBjZWxsLFxuICAgICAgXCJjb2x1bW4taGVhZGVyXCJcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXRSb3dIZWFkZXJXcmFwcGVyQ29tcG9uZW50TmFtZShjZWxsOiBNYXRyaXhEcm9wZG93bkNlbGwpIHtcbiAgICByZXR1cm4gdGhpcy5TdXJ2ZXlNb2RlbC5nZXRFbGVtZW50V3JhcHBlckNvbXBvbmVudE5hbWUoY2VsbCwgXCJyb3ctaGVhZGVyXCIpO1xuICB9XG4gIHB1YmxpYyBnZXRSb3dIZWFkZXJXcmFwcGVyQ29tcG9uZW50RGF0YShjZWxsOiBNYXRyaXhEcm9wZG93bkNlbGwpIHtcbiAgICByZXR1cm4gdGhpcy5TdXJ2ZXlNb2RlbC5nZXRFbGVtZW50V3JhcHBlckNvbXBvbmVudERhdGEoY2VsbCwgXCJyb3ctaGVhZGVyXCIpO1xuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwibWF0cml4ZHJvcGRvd25iYXNlXCIsXG4gIFtcbiAgICB7XG4gICAgICBuYW1lOiBcImNvbHVtbnM6bWF0cml4ZHJvcGRvd25jb2x1bW5zXCIsXG4gICAgICBjbGFzc05hbWU6IFwibWF0cml4ZHJvcGRvd25jb2x1bW5cIixcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiY29sdW1uTGF5b3V0XCIsXG4gICAgICBhbHRlcm5hdGl2ZU5hbWU6IFwiY29sdW1uc0xvY2F0aW9uXCIsXG4gICAgICBkZWZhdWx0OiBcImhvcml6b250YWxcIixcbiAgICAgIGNob2ljZXM6IFtcImhvcml6b250YWxcIiwgXCJ2ZXJ0aWNhbFwiXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiZGV0YWlsRWxlbWVudHNcIixcbiAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgaXNMaWdodFNlcmlhbGl6YWJsZTogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImRldGFpbFBhbmVsTW9kZVwiLFxuICAgICAgY2hvaWNlczogW1wibm9uZVwiLCBcInVuZGVyUm93XCIsIFwidW5kZXJSb3dTaW5nbGVcIl0sXG4gICAgICBkZWZhdWx0OiBcIm5vbmVcIixcbiAgICB9LFxuICAgIFwiaG9yaXpvbnRhbFNjcm9sbDpib29sZWFuXCIsXG4gICAge1xuICAgICAgbmFtZTogXCJjaG9pY2VzOml0ZW12YWx1ZVtdXCIsXG4gICAgfSxcbiAgICB7IG5hbWU6IFwib3B0aW9uc0NhcHRpb25cIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY09wdGlvbnNDYXB0aW9uXCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImtleUR1cGxpY2F0aW9uRXJyb3JcIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NLZXlEdXBsaWNhdGlvbkVycm9yXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImNlbGxUeXBlXCIsXG4gICAgICBkZWZhdWx0OiBcImRyb3Bkb3duXCIsXG4gICAgICBjaG9pY2VzOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiBNYXRyaXhEcm9wZG93bkNvbHVtbi5nZXRDb2x1bW5UeXBlcygpO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHsgbmFtZTogXCJjb2x1bW5Db2xDb3VudFwiLCBkZWZhdWx0OiAwLCBjaG9pY2VzOiBbMCwgMSwgMiwgMywgNF0gfSxcbiAgICBcImNvbHVtbk1pbldpZHRoXCIsXG4gICAgeyBuYW1lOiBcImFsbG93QWRhcHRpdmVBY3Rpb25zOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSwgdmlzaWJsZTogZmFsc2UgfSxcbiAgXSxcbiAgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZShcIlwiKTtcbiAgfSxcbiAgXCJtYXRyaXhiYXNlXCJcbik7XG4iLCJpbXBvcnQgeyBKc29uT2JqZWN0LCBKc29uT2JqZWN0UHJvcGVydHksIFNlcmlhbGl6ZXIsIHByb3BlcnR5IH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xyXG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XHJcbmltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi9iYXNlXCI7XHJcbmltcG9ydCB7IElTdXJ2ZXksIElXcmFwcGVyT2JqZWN0IH0gZnJvbSBcIi4vYmFzZS1pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xyXG5pbXBvcnQgeyBRdWVzdGlvblNlbGVjdEJhc2UgfSBmcm9tIFwiLi9xdWVzdGlvbl9iYXNlc2VsZWN0XCI7XHJcbmltcG9ydCB7IElMb2NhbGl6YWJsZU93bmVyLCBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XHJcbmltcG9ydCB7IFN1cnZleVZhbGlkYXRvciB9IGZyb20gXCIuL3ZhbGlkYXRvclwiO1xyXG5pbXBvcnQgeyBnZXRDdXJyZWN5Q29kZXMgfSBmcm9tIFwiLi9xdWVzdGlvbl9leHByZXNzaW9uXCI7XHJcbmltcG9ydCB7IHNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3NcIjtcclxuaW1wb3J0IHsgTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UgfSBmcm9tIFwiLi9xdWVzdGlvbl9tYXRyaXhkcm9wZG93bmJhc2VcIjtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSU1hdHJpeENvbHVtbk93bmVyIGV4dGVuZHMgSUxvY2FsaXphYmxlT3duZXIge1xyXG4gIGdldFJlcXVpcmVkVGV4dCgpOiBzdHJpbmc7XHJcbiAgb25Db2x1bW5Qcm9wZXJ0eUNoYW5nZWQoXHJcbiAgICBjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uLFxyXG4gICAgbmFtZTogc3RyaW5nLFxyXG4gICAgbmV3VmFsdWU6IGFueVxyXG4gICk6IHZvaWQ7XHJcbiAgb25Db2x1bW5JdGVtVmFsdWVQcm9wZXJ0eUNoYW5nZWQoXHJcbiAgICBjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uLFxyXG4gICAgcHJvcGVydHlOYW1lOiBzdHJpbmcsXHJcbiAgICBvYmo6IEl0ZW1WYWx1ZSxcclxuICAgIG5hbWU6IHN0cmluZyxcclxuICAgIG5ld1ZhbHVlOiBhbnksXHJcbiAgICBvbGRWYWx1ZTogYW55XHJcbiAgKTogdm9pZDtcclxuICBvblNob3dJbk11bHRpcGxlQ29sdW1uc0NoYW5nZWQoY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbik6IHZvaWQ7XHJcbiAgZ2V0Q2VsbFR5cGUoKTogc3RyaW5nO1xyXG4gIGdldEN1c3RvbUNlbGxUeXBlKGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4sIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsIGNlbGxUeXBlOiBzdHJpbmcpOiBzdHJpbmc7XHJcbiAgb25Db2x1bW5DZWxsVHlwZUNoYW5nZWQoY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbik6IHZvaWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG9uVXBkYXRlU2VsZWN0QmFzZUNlbGxRdWVzdGlvbihcclxuICBjZWxsUXVlc3Rpb246IFF1ZXN0aW9uU2VsZWN0QmFzZSxcclxuICBjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uLFxyXG4gIHF1ZXN0aW9uOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlLFxyXG4gIGRhdGE6IGFueVxyXG4pIHtcclxuICBjZWxsUXVlc3Rpb24uc3RvcmVPdGhlcnNBc0NvbW1lbnQgPSAhIXF1ZXN0aW9uXHJcbiAgICA/IHF1ZXN0aW9uLnN0b3JlT3RoZXJzQXNDb21tZW50XHJcbiAgICA6IGZhbHNlO1xyXG4gIGlmIChcclxuICAgICghY2VsbFF1ZXN0aW9uLmNob2ljZXMgfHwgY2VsbFF1ZXN0aW9uLmNob2ljZXMubGVuZ3RoID09IDApICYmXHJcbiAgICBjZWxsUXVlc3Rpb24uY2hvaWNlc0J5VXJsLmlzRW1wdHlcclxuICApIHtcclxuICAgIGNlbGxRdWVzdGlvbi5jaG9pY2VzID0gcXVlc3Rpb24uY2hvaWNlcztcclxuICB9XHJcbiAgaWYgKCFjZWxsUXVlc3Rpb24uY2hvaWNlc0J5VXJsLmlzRW1wdHkpIHtcclxuICAgIGNlbGxRdWVzdGlvbi5jaG9pY2VzQnlVcmwucnVuKGRhdGEuZ2V0VGV4dFByb2Nlc3NvcigpKTtcclxuICB9XHJcbn1cclxuZXhwb3J0IHZhciBtYXRyaXhEcm9wZG93bkNvbHVtblR5cGVzID0ge1xyXG4gIGRyb3Bkb3duOiB7XHJcbiAgICBwcm9wZXJ0aWVzOiBbXHJcbiAgICAgIFwiY2hvaWNlc1wiLFxyXG4gICAgICBcImNob2ljZXNPcmRlclwiLFxyXG4gICAgICBcImNob2ljZXNCeVVybFwiLFxyXG4gICAgICBcIm9wdGlvbnNDYXB0aW9uXCIsXHJcbiAgICAgIFwib3RoZXJUZXh0XCIsXHJcbiAgICAgIFwiY2hvaWNlc1Zpc2libGVJZlwiLFxyXG4gICAgXSxcclxuICAgIG9uQ2VsbFF1ZXN0aW9uVXBkYXRlOiAoXHJcbiAgICAgIGNlbGxRdWVzdGlvbjogYW55LFxyXG4gICAgICBjb2x1bW46IGFueSxcclxuICAgICAgcXVlc3Rpb246IGFueSxcclxuICAgICAgZGF0YTogYW55XHJcbiAgICApID0+IHtcclxuICAgICAgb25VcGRhdGVTZWxlY3RCYXNlQ2VsbFF1ZXN0aW9uKGNlbGxRdWVzdGlvbiwgY29sdW1uLCBxdWVzdGlvbiwgZGF0YSk7XHJcbiAgICAgIGlmIChcclxuICAgICAgICAhIWNlbGxRdWVzdGlvbi5sb2NPcHRpb25zQ2FwdGlvbiAmJlxyXG4gICAgICAgIGNlbGxRdWVzdGlvbi5sb2NPcHRpb25zQ2FwdGlvbi5pc0VtcHR5ICYmXHJcbiAgICAgICAgIXF1ZXN0aW9uLmxvY09wdGlvbnNDYXB0aW9uLmlzRW1wdHlcclxuICAgICAgKSB7XHJcbiAgICAgICAgY2VsbFF1ZXN0aW9uLm9wdGlvbnNDYXB0aW9uID0gcXVlc3Rpb24ub3B0aW9uc0NhcHRpb247XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgfSxcclxuICBjaGVja2JveDoge1xyXG4gICAgcHJvcGVydGllczogW1xyXG4gICAgICBcImNob2ljZXNcIixcclxuICAgICAgXCJjaG9pY2VzT3JkZXJcIixcclxuICAgICAgXCJjaG9pY2VzQnlVcmxcIixcclxuICAgICAgXCJvdGhlclRleHRcIixcclxuICAgICAgXCJjaG9pY2VzVmlzaWJsZUlmXCIsXHJcbiAgICAgIFwiaGFzU2VsZWN0QWxsXCIsXHJcbiAgICAgIFwiaGFzTm9uZVwiLFxyXG4gICAgXSxcclxuICAgIG9uQ2VsbFF1ZXN0aW9uVXBkYXRlOiAoXHJcbiAgICAgIGNlbGxRdWVzdGlvbjogYW55LFxyXG4gICAgICBjb2x1bW46IGFueSxcclxuICAgICAgcXVlc3Rpb246IGFueSxcclxuICAgICAgZGF0YTogYW55XHJcbiAgICApID0+IHtcclxuICAgICAgb25VcGRhdGVTZWxlY3RCYXNlQ2VsbFF1ZXN0aW9uKGNlbGxRdWVzdGlvbiwgY29sdW1uLCBxdWVzdGlvbiwgZGF0YSk7XHJcbiAgICAgIGNlbGxRdWVzdGlvbi5jb2xDb3VudCA9XHJcbiAgICAgICAgY29sdW1uLmNvbENvdW50ID4gLTEgPyBjb2x1bW4uY29sQ291bnQgOiBxdWVzdGlvbi5jb2x1bW5Db2xDb3VudDtcclxuICAgIH0sXHJcbiAgfSxcclxuICByYWRpb2dyb3VwOiB7XHJcbiAgICBwcm9wZXJ0aWVzOiBbXHJcbiAgICAgIFwiY2hvaWNlc1wiLFxyXG4gICAgICBcImNob2ljZXNPcmRlclwiLFxyXG4gICAgICBcImNob2ljZXNCeVVybFwiLFxyXG4gICAgICBcIm90aGVyVGV4dFwiLFxyXG4gICAgICBcImNob2ljZXNWaXNpYmxlSWZcIixcclxuICAgIF0sXHJcbiAgICBvbkNlbGxRdWVzdGlvblVwZGF0ZTogKFxyXG4gICAgICBjZWxsUXVlc3Rpb246IGFueSxcclxuICAgICAgY29sdW1uOiBhbnksXHJcbiAgICAgIHF1ZXN0aW9uOiBhbnksXHJcbiAgICAgIGRhdGE6IGFueVxyXG4gICAgKSA9PiB7XHJcbiAgICAgIG9uVXBkYXRlU2VsZWN0QmFzZUNlbGxRdWVzdGlvbihjZWxsUXVlc3Rpb24sIGNvbHVtbiwgcXVlc3Rpb24sIGRhdGEpO1xyXG4gICAgICBjZWxsUXVlc3Rpb24uY29sQ291bnQgPVxyXG4gICAgICAgIGNvbHVtbi5jb2xDb3VudCA+IC0xID8gY29sdW1uLmNvbENvdW50IDogcXVlc3Rpb24uY29sdW1uQ29sQ291bnQ7XHJcbiAgICB9LFxyXG4gIH0sXHJcbiAgdGV4dDoge1xyXG4gICAgcHJvcGVydGllczogW1wicGxhY2VIb2xkZXJcIiwgXCJpbnB1dFR5cGVcIiwgXCJtYXhMZW5ndGhcIiwgXCJtaW5cIiwgXCJtYXhcIiwgXCJzdGVwXCJdLFxyXG4gICAgb25DZWxsUXVlc3Rpb25VcGRhdGU6IChcclxuICAgICAgY2VsbFF1ZXN0aW9uOiBhbnksXHJcbiAgICAgIGNvbHVtbjogYW55LFxyXG4gICAgICBxdWVzdGlvbjogYW55LFxyXG4gICAgICBkYXRhOiBhbnlcclxuICAgICkgPT4geyB9LFxyXG4gIH0sXHJcbiAgY29tbWVudDoge1xyXG4gICAgcHJvcGVydGllczogW1wicGxhY2VIb2xkZXJcIiwgXCJyb3dzXCIsIFwibWF4TGVuZ3RoXCJdLFxyXG4gICAgb25DZWxsUXVlc3Rpb25VcGRhdGU6IChcclxuICAgICAgY2VsbFF1ZXN0aW9uOiBhbnksXHJcbiAgICAgIGNvbHVtbjogYW55LFxyXG4gICAgICBxdWVzdGlvbjogYW55LFxyXG4gICAgICBkYXRhOiBhbnlcclxuICAgICkgPT4geyB9LFxyXG4gIH0sXHJcbiAgYm9vbGVhbjoge1xyXG4gICAgcHJvcGVydGllczogW1wicmVuZGVyQXNcIiwgXCJkZWZhdWx0VmFsdWVcIl0sXHJcbiAgICBvbkNlbGxRdWVzdGlvblVwZGF0ZTogKFxyXG4gICAgICBjZWxsUXVlc3Rpb246IGFueSxcclxuICAgICAgY29sdW1uOiBhbnksXHJcbiAgICAgIHF1ZXN0aW9uOiBhbnksXHJcbiAgICAgIGRhdGE6IGFueVxyXG4gICAgKSA9PiB7XHJcbiAgICAgIGNlbGxRdWVzdGlvbi5zaG93VGl0bGUgPSB0cnVlO1xyXG4gICAgICBjZWxsUXVlc3Rpb24ucmVuZGVyQXMgPSBjb2x1bW4ucmVuZGVyQXM7XHJcbiAgICB9LFxyXG4gIH0sXHJcbiAgZXhwcmVzc2lvbjoge1xyXG4gICAgcHJvcGVydGllczogW1wiZXhwcmVzc2lvblwiLCBcImRpc3BsYXlTdHlsZVwiLCBcImN1cnJlbmN5XCJdLFxyXG4gICAgb25DZWxsUXVlc3Rpb25VcGRhdGU6IChcclxuICAgICAgY2VsbFF1ZXN0aW9uOiBhbnksXHJcbiAgICAgIGNvbHVtbjogYW55LFxyXG4gICAgICBxdWVzdGlvbjogYW55LFxyXG4gICAgICBkYXRhOiBhbnlcclxuICAgICkgPT4geyB9LFxyXG4gIH0sXHJcbiAgcmF0aW5nOiB7XHJcbiAgICBwcm9wZXJ0aWVzOiBbXCJyYXRlVmFsdWVzXCJdLFxyXG4gIH0sXHJcbn07XHJcblxyXG5leHBvcnQgY2xhc3MgTWF0cml4RHJvcGRvd25Db2x1bW4gZXh0ZW5kcyBCYXNlXHJcbiAgaW1wbGVtZW50cyBJTG9jYWxpemFibGVPd25lciwgSVdyYXBwZXJPYmplY3Qge1xyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0Q29sdW1uVHlwZXMoKTogQXJyYXk8c3RyaW5nPiB7XHJcbiAgICB2YXIgcmVzID0gW107XHJcbiAgICBmb3IgKHZhciBrZXkgaW4gbWF0cml4RHJvcGRvd25Db2x1bW5UeXBlcykge1xyXG4gICAgICByZXMucHVzaChrZXkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcbiAgcHJpdmF0ZSB0ZW1wbGF0ZVF1ZXN0aW9uVmFsdWU6IFF1ZXN0aW9uO1xyXG4gIHByaXZhdGUgY29sT3duZXJWYWx1ZTogSU1hdHJpeENvbHVtbk93bmVyID0gbnVsbDtcclxuICBwcml2YXRlIGluZGV4VmFsdWUgPSAtMTtcclxuICBwcml2YXRlIF9pc1Zpc2libGUgPSB0cnVlO1xyXG4gIHByaXZhdGUgX2hhc1Zpc2libGVDZWxsID0gdHJ1ZTtcclxuXHJcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCB0aXRsZTogc3RyaW5nID0gbnVsbCkge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJ0b3RhbEZvcm1hdFwiLCB0aGlzKTtcclxuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXHJcbiAgICAgIFwic2hvd0luTXVsdGlwbGVDb2x1bW5zXCIsXHJcbiAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBzZWxmLmRvU2hvd0luTXVsdGlwbGVDb2x1bW5zQ2hhbmdlZCgpO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gICAgdGhpcy51cGRhdGVUZW1wbGF0ZVF1ZXN0aW9uKCk7XHJcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xyXG4gICAgaWYgKHRpdGxlKSB7XHJcbiAgICAgIHRoaXMudGl0bGUgPSB0aXRsZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5sb2NUaXRsZS5zdHJDaGFuZ2VkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXRPcmlnaW5hbE9iaigpOiBCYXNlIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlUXVlc3Rpb247XHJcbiAgfVxyXG4gIGdldENsYXNzTmFtZVByb3BlcnR5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gXCJjZWxsVHlwZVwiO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0U3VydmV5KGxpdmU6IGJvb2xlYW4gPSBmYWxzZSk6IElTdXJ2ZXkge1xyXG4gICAgcmV0dXJuICEhdGhpcy5jb2xPd25lciA/ICg8YW55PnRoaXMuY29sT3duZXIpLnN1cnZleSA6IG51bGw7XHJcbiAgfVxyXG4gIGVuZExvYWRpbmdGcm9tSnNvbigpIHtcclxuICAgIHN1cGVyLmVuZExvYWRpbmdGcm9tSnNvbigpO1xyXG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLmVuZExvYWRpbmdGcm9tSnNvbigpO1xyXG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLm9uR2V0U3VydmV5ID0gKCkgPT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRTdXJ2ZXkoKTtcclxuICAgIH07XHJcbiAgfVxyXG4gIGdldER5bmFtaWNQcm9wZXJ0eU5hbWUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBcImNlbGxUeXBlXCI7XHJcbiAgfVxyXG4gIGdldER5bmFtaWNUeXBlKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5jYWxjQ2VsbFF1ZXN0aW9uVHlwZShudWxsKTtcclxuICB9XHJcbiAgcHVibGljIGdldCBjb2xPd25lcigpOiBJTWF0cml4Q29sdW1uT3duZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuY29sT3duZXJWYWx1ZTtcclxuICB9XHJcbiAgcHVibGljIHNldCBjb2xPd25lcih2YWx1ZTogSU1hdHJpeENvbHVtbk93bmVyKSB7XHJcbiAgICB0aGlzLmNvbE93bmVyVmFsdWUgPSB2YWx1ZTtcclxuICAgIGlmICghIXZhbHVlKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlVGVtcGxhdGVRdWVzdGlvbigpO1xyXG4gICAgfVxyXG4gIH1cclxuICBwdWJsaWMgbG9jU3Ryc0NoYW5nZWQoKSB7XHJcbiAgICBzdXBlci5sb2NTdHJzQ2hhbmdlZCgpO1xyXG4gICAgdGhpcy5sb2NUaXRsZS5zdHJDaGFuZ2VkKCk7XHJcbiAgfVxyXG4gIHB1YmxpYyBhZGRVc2VkTG9jYWxlcyhsb2NhbGVzOiBBcnJheTxzdHJpbmc+KSB7XHJcbiAgICBzdXBlci5hZGRVc2VkTG9jYWxlcyhsb2NhbGVzKTtcclxuICAgIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5hZGRVc2VkTG9jYWxlcyhsb2NhbGVzKTtcclxuICB9XHJcbiAgcHVibGljIGdldCBpbmRleCgpIHtcclxuICAgIHJldHVybiB0aGlzLmluZGV4VmFsdWU7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXRJbmRleCh2YWw6IG51bWJlcikge1xyXG4gICAgdGhpcy5pbmRleFZhbHVlID0gdmFsO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0VHlwZSgpIHtcclxuICAgIHJldHVybiBcIm1hdHJpeGRyb3Bkb3duY29sdW1uXCI7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgY2VsbFR5cGUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjZWxsVHlwZVwiKTtcclxuICB9XHJcbiAgcHVibGljIHNldCBjZWxsVHlwZSh2YWw6IHN0cmluZykge1xyXG4gICAgdmFsID0gdmFsLnRvTG9jYWxlTG93ZXJDYXNlKCk7XHJcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjZWxsVHlwZVwiLCB2YWwpO1xyXG4gICAgdGhpcy51cGRhdGVUZW1wbGF0ZVF1ZXN0aW9uKCk7XHJcbiAgICBpZiAoISF0aGlzLmNvbE93bmVyKSB7XHJcbiAgICAgIHRoaXMuY29sT3duZXIub25Db2x1bW5DZWxsVHlwZUNoYW5nZWQodGhpcyk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgdGVtcGxhdGVRdWVzdGlvbigpIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlUXVlc3Rpb25WYWx1ZTtcclxuICB9XHJcbiAgcHVibGljIGdldCB2YWx1ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlUXVlc3Rpb24ubmFtZTtcclxuICB9XHJcbiAgcHVibGljIGdldCBpc1Zpc2libGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNWaXNpYmxlO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0SXNWaXNpYmxlKG5ld1ZhbDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5faXNWaXNpYmxlID0gbmV3VmFsO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IGhhc1Zpc2libGVDZWxsKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2hhc1Zpc2libGVDZWxsO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IGhhc1Zpc2libGVDZWxsKG5ld1ZhbDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5faGFzVmlzaWJsZUNlbGwgPSBuZXdWYWw7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgbmFtZSgpIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlUXVlc3Rpb24ubmFtZTtcclxuICB9XHJcbiAgcHVibGljIHNldCBuYW1lKHZhbDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb24ubmFtZSA9IHZhbDtcclxuICB9XHJcbiAgcHVibGljIGdldCB0aXRsZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvbi50aXRsZTtcclxuICB9XHJcbiAgcHVibGljIHNldCB0aXRsZSh2YWw6IHN0cmluZykge1xyXG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLnRpdGxlID0gdmFsO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IGxvY1RpdGxlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5sb2NUaXRsZTtcclxuICB9XHJcbiAgcHVibGljIGdldCBmdWxsVGl0bGUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmxvY1RpdGxlLnRleHRPckh0bWw7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgaXNSZXF1aXJlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlUXVlc3Rpb24uaXNSZXF1aXJlZDtcclxuICB9XHJcbiAgcHVibGljIHNldCBpc1JlcXVpcmVkKHZhbDogYm9vbGVhbikge1xyXG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLmlzUmVxdWlyZWQgPSB2YWw7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgcmVxdWlyZWRUZXh0KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLnJlcXVpcmVkVGV4dDtcclxuICB9XHJcbiAgcHVibGljIGdldCByZXF1aXJlZEVycm9yVGV4dCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5yZXF1aXJlZEVycm9yVGV4dDtcclxuICB9XHJcbiAgcHVibGljIHNldCByZXF1aXJlZEVycm9yVGV4dCh2YWw6IHN0cmluZykge1xyXG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLnJlcXVpcmVkRXJyb3JUZXh0ID0gdmFsO1xyXG4gIH1cclxuICBnZXQgbG9jUmVxdWlyZWRFcnJvclRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5sb2NSZXF1aXJlZEVycm9yVGV4dDtcclxuICB9XHJcbiAgcHVibGljIGdldCByZWFkT25seSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlUXVlc3Rpb24ucmVhZE9ubHk7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgcmVhZE9ubHkodmFsOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb24ucmVhZE9ubHkgPSB2YWw7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgaGFzT3RoZXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLmhhc090aGVyO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IGhhc090aGVyKHZhbDogYm9vbGVhbikge1xyXG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLmhhc090aGVyID0gdmFsO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IHZpc2libGVJZigpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvbi52aXNpYmxlSWY7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgdmlzaWJsZUlmKHZhbDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb24udmlzaWJsZUlmID0gdmFsO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IGVuYWJsZUlmKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLmVuYWJsZUlmO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IGVuYWJsZUlmKHZhbDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb24uZW5hYmxlSWYgPSB2YWw7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgcmVxdWlyZWRJZigpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5yZXF1aXJlZElmO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IHJlcXVpcmVkSWYodmFsOiBzdHJpbmcpIHtcclxuICAgIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5yZXF1aXJlZElmID0gdmFsO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IGlzVW5pcXVlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlzVW5pcXVlXCIpO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IGlzVW5pcXVlKHZhbDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNVbmlxdWVcIiwgdmFsKTtcclxuICB9XHJcbiAgcHVibGljIGdldCBzaG93SW5NdWx0aXBsZUNvbHVtbnMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd0luTXVsdGlwbGVDb2x1bW5zXCIsIGZhbHNlKTtcclxuICB9XHJcbiAgcHVibGljIHNldCBzaG93SW5NdWx0aXBsZUNvbHVtbnModmFsOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93SW5NdWx0aXBsZUNvbHVtbnNcIiwgdmFsKTtcclxuICB9XHJcbiAgcHVibGljIGdldCBpc1N1cHBvcnRNdWx0aXBsZUNvbHVtbnMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gW1wiY2hlY2tib3hcIiwgXCJyYWRpb2dyb3VwXCJdLmluZGV4T2YodGhpcy5jZWxsVHlwZSkgPiAtMTtcclxuICB9XHJcbiAgcHVibGljIGdldCBpc1Nob3dJbk11bHRpcGxlQ29sdW1ucygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnNob3dJbk11bHRpcGxlQ29sdW1ucyAmJiB0aGlzLmlzU3VwcG9ydE11bHRpcGxlQ29sdW1ucztcclxuICB9XHJcbiAgcHVibGljIGdldCB2YWxpZGF0b3JzKCk6IEFycmF5PFN1cnZleVZhbGlkYXRvcj4ge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvbi52YWxpZGF0b3JzO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IHZhbGlkYXRvcnModmFsOiBBcnJheTxTdXJ2ZXlWYWxpZGF0b3I+KSB7XHJcbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb24udmFsaWRhdG9ycyA9IHZhbDtcclxuICB9XHJcbiAgcHVibGljIGdldCB0b3RhbFR5cGUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ0b3RhbFR5cGVcIik7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgdG90YWxUeXBlKHZhbDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ0b3RhbFR5cGVcIiwgdmFsKTtcclxuICB9XHJcbiAgcHVibGljIGdldCB0b3RhbEV4cHJlc3Npb24oKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ0b3RhbEV4cHJlc3Npb25cIik7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgdG90YWxFeHByZXNzaW9uKHZhbDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ0b3RhbEV4cHJlc3Npb25cIiwgdmFsKTtcclxuICB9XHJcbiAgcHVibGljIGdldCBoYXNUb3RhbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnRvdGFsVHlwZSAhPSBcIm5vbmVcIiB8fCAhIXRoaXMudG90YWxFeHByZXNzaW9uO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IHRvdGFsRm9ybWF0KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJ0b3RhbEZvcm1hdFwiLCBcIlwiKTtcclxuICB9XHJcbiAgcHVibGljIHNldCB0b3RhbEZvcm1hdCh2YWw6IHN0cmluZykge1xyXG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJ0b3RhbEZvcm1hdFwiLCB2YWwpO1xyXG4gIH1cclxuICBnZXQgbG9jVG90YWxGb3JtYXQoKTogTG9jYWxpemFibGVTdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJ0b3RhbEZvcm1hdFwiKTtcclxuICB9XHJcbiAgcHVibGljIGdldCByZW5kZXJBcygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJlbmRlckFzXCIpO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IHJlbmRlckFzKHZhbDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyZW5kZXJBc1wiLCB2YWwpO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IHRvdGFsTWF4aW11bUZyYWN0aW9uRGlnaXRzKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidG90YWxNYXhpbXVtRnJhY3Rpb25EaWdpdHNcIik7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgdG90YWxNYXhpbXVtRnJhY3Rpb25EaWdpdHModmFsOiBudW1iZXIpIHtcclxuICAgIGlmICh2YWwgPCAtMSB8fCB2YWwgPiAyMCkgcmV0dXJuO1xyXG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidG90YWxNYXhpbXVtRnJhY3Rpb25EaWdpdHNcIiwgdmFsKTtcclxuICB9XHJcbiAgcHVibGljIGdldCB0b3RhbE1pbmltdW1GcmFjdGlvbkRpZ2l0cygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInRvdGFsTWluaW11bUZyYWN0aW9uRGlnaXRzXCIpO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IHRvdGFsTWluaW11bUZyYWN0aW9uRGlnaXRzKHZhbDogbnVtYmVyKSB7XHJcbiAgICBpZiAodmFsIDwgLTEgfHwgdmFsID4gMjApIHJldHVybjtcclxuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInRvdGFsTWluaW11bUZyYWN0aW9uRGlnaXRzXCIsIHZhbCk7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgdG90YWxEaXNwbGF5U3R5bGUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ0b3RhbERpc3BsYXlTdHlsZVwiKTtcclxuICB9XHJcbiAgcHVibGljIHNldCB0b3RhbERpc3BsYXlTdHlsZSh2YWw6IHN0cmluZykge1xyXG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidG90YWxEaXNwbGF5U3R5bGVcIiwgdmFsKTtcclxuICB9XHJcbiAgcHVibGljIGdldCB0b3RhbEN1cnJlbmN5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidG90YWxDdXJyZW5jeVwiKTtcclxuICB9XHJcbiAgcHVibGljIHNldCB0b3RhbEN1cnJlbmN5KHZhbDogc3RyaW5nKSB7XHJcbiAgICBpZiAoZ2V0Q3VycmVjeUNvZGVzKCkuaW5kZXhPZih2YWwpIDwgMCkgcmV0dXJuO1xyXG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidG90YWxDdXJyZW5jeVwiLCB2YWwpO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IG1pbldpZHRoKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWluV2lkdGhcIiwgXCJcIik7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgbWluV2lkdGgodmFsOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1pbldpZHRoXCIsIHZhbCk7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgd2lkdGgoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ3aWR0aFwiLCBcIlwiKTtcclxuICB9XHJcbiAgcHVibGljIHNldCB3aWR0aCh2YWw6IHN0cmluZykge1xyXG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwid2lkdGhcIiwgdmFsKTtcclxuICB9XHJcbiAgcHVibGljIGdldCBjb2xDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbENvdW50XCIpO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IGNvbENvdW50KHZhbDogbnVtYmVyKSB7XHJcbiAgICBpZiAodmFsIDwgLTEgfHwgdmFsID4gNCkgcmV0dXJuO1xyXG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29sQ291bnRcIiwgdmFsKTtcclxuICB9XHJcbiAgcHVibGljIGdldExvY2FsZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuY29sT3duZXIgPyB0aGlzLmNvbE93bmVyLmdldExvY2FsZSgpIDogXCJcIjtcclxuICB9XHJcbiAgcHVibGljIGdldE1hcmtkb3duSHRtbCh0ZXh0OiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5jb2xPd25lciA/IHRoaXMuY29sT3duZXIuZ2V0TWFya2Rvd25IdG1sKHRleHQsIG5hbWUpIDogbnVsbDtcclxuICB9XHJcbiAgcHVibGljIGdldFJlbmRlcmVyKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gISF0aGlzLmNvbE93bmVyID8gdGhpcy5jb2xPd25lci5nZXRSZW5kZXJlcihuYW1lKSA6IG51bGw7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXRSZW5kZXJlckNvbnRleHQobG9jU3RyOiBMb2NhbGl6YWJsZVN0cmluZyk6IGFueSB7XHJcbiAgICByZXR1cm4gISF0aGlzLmNvbE93bmVyID8gdGhpcy5jb2xPd25lci5nZXRSZW5kZXJlckNvbnRleHQobG9jU3RyKSA6IGxvY1N0cjtcclxuICB9XHJcbiAgcHVibGljIGdldFByb2Nlc3NlZFRleHQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmNvbE93bmVyID8gdGhpcy5jb2xPd25lci5nZXRQcm9jZXNzZWRUZXh0KHRleHQpIDogdGV4dDtcclxuICB9XHJcbiAgcHVibGljIGNyZWF0ZUNlbGxRdWVzdGlvbihyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlKTogUXVlc3Rpb24ge1xyXG4gICAgdmFyIHFUeXBlID0gdGhpcy5jYWxjQ2VsbFF1ZXN0aW9uVHlwZShyb3cpO1xyXG4gICAgdmFyIGNlbGxRdWVzdGlvbiA9IDxRdWVzdGlvbj50aGlzLmNyZWF0ZU5ld1F1ZXN0aW9uKHFUeXBlKTtcclxuICAgIHRoaXMuY2FsbE9uQ2VsbFF1ZXN0aW9uVXBkYXRlKGNlbGxRdWVzdGlvbiwgcm93KTtcclxuICAgIHJldHVybiBjZWxsUXVlc3Rpb247XHJcbiAgfVxyXG4gIHB1YmxpYyB1cGRhdGVDZWxsUXVlc3Rpb24oXHJcbiAgICBjZWxsUXVlc3Rpb246IFF1ZXN0aW9uLFxyXG4gICAgZGF0YTogYW55LFxyXG4gICAgb25VcGRhdGVKc29uOiAoanNvbjogYW55KSA9PiBhbnkgPSBudWxsXHJcbiAgKSB7XHJcbiAgICB0aGlzLnNldFF1ZXN0aW9uUHJvcGVydGllcyhjZWxsUXVlc3Rpb24sIG9uVXBkYXRlSnNvbik7XHJcbiAgICB0aGlzLmNhbGxPbkNlbGxRdWVzdGlvblVwZGF0ZShjZWxsUXVlc3Rpb24sIGRhdGEpO1xyXG4gIH1cclxuICBwcml2YXRlIGNhbGxPbkNlbGxRdWVzdGlvblVwZGF0ZShjZWxsUXVlc3Rpb246IFF1ZXN0aW9uLCBkYXRhOiBhbnkpIHtcclxuICAgIHZhciBxVHlwZSA9IGNlbGxRdWVzdGlvbi5nZXRUeXBlKCk7XHJcbiAgICB2YXIgcURlZmluaXRpb24gPSAoPGFueT5tYXRyaXhEcm9wZG93bkNvbHVtblR5cGVzKVtxVHlwZV07XHJcbiAgICBpZiAocURlZmluaXRpb24gJiYgcURlZmluaXRpb25bXCJvbkNlbGxRdWVzdGlvblVwZGF0ZVwiXSkge1xyXG4gICAgICBxRGVmaW5pdGlvbltcIm9uQ2VsbFF1ZXN0aW9uVXBkYXRlXCJdKFxyXG4gICAgICAgIGNlbGxRdWVzdGlvbixcclxuICAgICAgICB0aGlzLFxyXG4gICAgICAgIHRoaXMuY29sT3duZXIsXHJcbiAgICAgICAgZGF0YVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuICBkZWZhdWx0Q2VsbFR5cGVDaGFuZ2VkKCkge1xyXG4gICAgdGhpcy51cGRhdGVUZW1wbGF0ZVF1ZXN0aW9uKCk7XHJcbiAgfVxyXG4gIHByb3RlY3RlZCBjYWxjQ2VsbFF1ZXN0aW9uVHlwZShyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlKTogc3RyaW5nIHtcclxuICAgIGxldCBjZWxsVHlwZSA9IHRoaXMuZ2V0RGVmYXVsdENlbGxRdWVzdGlvblR5cGUoKTtcclxuICAgIGlmICghIXJvdyAmJiAhIXRoaXMuY29sT3duZXIpIHtcclxuICAgICAgY2VsbFR5cGUgPSB0aGlzLmNvbE93bmVyLmdldEN1c3RvbUNlbGxUeXBlKHRoaXMsIHJvdywgY2VsbFR5cGUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNlbGxUeXBlO1xyXG4gIH1cclxuICBwcml2YXRlIGdldERlZmF1bHRDZWxsUXVlc3Rpb25UeXBlKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5jZWxsVHlwZSAhPT0gXCJkZWZhdWx0XCIpIHJldHVybiB0aGlzLmNlbGxUeXBlO1xyXG4gICAgaWYgKHRoaXMuY29sT3duZXIpIHJldHVybiB0aGlzLmNvbE93bmVyLmdldENlbGxUeXBlKCk7XHJcbiAgICByZXR1cm4gc2V0dGluZ3MubWF0cml4RGVmYXVsdENlbGxUeXBlO1xyXG4gIH1cclxuICBwcm90ZWN0ZWQgdXBkYXRlVGVtcGxhdGVRdWVzdGlvbigpIHtcclxuICAgIHZhciBwcmV2Q2VsbFR5cGUgPSB0aGlzLnRlbXBsYXRlUXVlc3Rpb25cclxuICAgICAgPyB0aGlzLnRlbXBsYXRlUXVlc3Rpb24uZ2V0VHlwZSgpXHJcbiAgICAgIDogXCJcIjtcclxuICAgIHZhciBjdXJDZWxsVHlwZSA9IHRoaXMuY2FsY0NlbGxRdWVzdGlvblR5cGUobnVsbCk7XHJcbiAgICBpZiAoY3VyQ2VsbFR5cGUgPT09IHByZXZDZWxsVHlwZSkgcmV0dXJuO1xyXG4gICAgaWYgKHRoaXMudGVtcGxhdGVRdWVzdGlvbikge1xyXG4gICAgICB0aGlzLnJlbW92ZVByb3BlcnRpZXMocHJldkNlbGxUeXBlKTtcclxuICAgIH1cclxuICAgIHRoaXMudGVtcGxhdGVRdWVzdGlvblZhbHVlID0gdGhpcy5jcmVhdGVOZXdRdWVzdGlvbihjdXJDZWxsVHlwZSk7XHJcbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb24ubG9jT3duZXIgPSB0aGlzO1xyXG4gICAgdGhpcy5hZGRQcm9wZXJ0aWVzKGN1ckNlbGxUeXBlKTtcclxuICAgIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5vblByb3BlcnR5Q2hhbmdlZC5hZGQoKHNlbmRlciwgb3B0aW9ucykgPT4ge1xyXG4gICAgICB0aGlzLnByb3BlcnR5VmFsdWVDaGFuZ2VkKFxyXG4gICAgICAgIG9wdGlvbnMubmFtZSxcclxuICAgICAgICBvcHRpb25zLm9sZFZhbHVlLFxyXG4gICAgICAgIG9wdGlvbnMubmV3VmFsdWVcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLm9uSXRlbVZhbHVlUHJvcGVydHlDaGFuZ2VkLmFkZCgoc2VuZGVyLCBvcHRpb25zKSA9PiB7XHJcbiAgICAgIHRoaXMuZG9JdGVtVmFsdWVQcm9wZXJ0eUNoYW5nZWQoXHJcbiAgICAgICAgb3B0aW9ucy5wcm9wZXJ0eU5hbWUsXHJcbiAgICAgICAgb3B0aW9ucy5vYmosXHJcbiAgICAgICAgb3B0aW9ucy5uYW1lLFxyXG4gICAgICAgIG9wdGlvbnMubmV3VmFsdWUsXHJcbiAgICAgICAgb3B0aW9ucy5vbGRWYWx1ZVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb24uaXNDb250ZW50RWxlbWVudCA9IHRydWU7XHJcbiAgICBpZiAoIXRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHtcclxuICAgICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLm9uR2V0U3VydmV5ID0gKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFN1cnZleSgpO1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLmxvY1RpdGxlLnN0ckNoYW5nZWQoKTtcclxuICB9XHJcbiAgcHJvdGVjdGVkIGNyZWF0ZU5ld1F1ZXN0aW9uKGNlbGxUeXBlOiBzdHJpbmcpOiBRdWVzdGlvbiB7XHJcbiAgICB2YXIgcXVlc3Rpb24gPSA8UXVlc3Rpb24+U2VyaWFsaXplci5jcmVhdGVDbGFzcyhjZWxsVHlwZSk7XHJcbiAgICBpZiAoIXF1ZXN0aW9uKSB7XHJcbiAgICAgIHF1ZXN0aW9uID0gPFF1ZXN0aW9uPlNlcmlhbGl6ZXIuY3JlYXRlQ2xhc3MoXCJ0ZXh0XCIpO1xyXG4gICAgfVxyXG4gICAgcXVlc3Rpb24ubG9hZGluZ093bmVyID0gdGhpcztcclxuICAgIHF1ZXN0aW9uLmlzRWRpdGFibGVUZW1wbGF0ZUVsZW1lbnQgPSB0cnVlO1xyXG4gICAgdGhpcy5zZXRRdWVzdGlvblByb3BlcnRpZXMocXVlc3Rpb24pO1xyXG4gICAgcmV0dXJuIHF1ZXN0aW9uO1xyXG4gIH1cclxuICBwcm90ZWN0ZWQgc2V0UXVlc3Rpb25Qcm9wZXJ0aWVzKFxyXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxyXG4gICAgb25VcGRhdGVKc29uOiAoanNvbjogYW55KSA9PiBhbnkgPSBudWxsXHJcbiAgKSB7XHJcbiAgICBpZiAodGhpcy50ZW1wbGF0ZVF1ZXN0aW9uKSB7XHJcbiAgICAgIHZhciBqc29uID0gbmV3IEpzb25PYmplY3QoKS50b0pzb25PYmplY3QodGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLCB0cnVlKTtcclxuICAgICAgaWYgKG9uVXBkYXRlSnNvbikge1xyXG4gICAgICAgIG9uVXBkYXRlSnNvbihqc29uKTtcclxuICAgICAgfVxyXG4gICAgICBqc29uLnR5cGUgPSBxdWVzdGlvbi5nZXRUeXBlKCk7XHJcbiAgICAgIG5ldyBKc29uT2JqZWN0KCkudG9PYmplY3QoanNvbiwgcXVlc3Rpb24pO1xyXG4gICAgfVxyXG4gIH1cclxuICBwcm90ZWN0ZWQgcHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nLCBvbGRWYWx1ZTogYW55LCBuZXdWYWx1ZTogYW55KSB7XHJcbiAgICBzdXBlci5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpO1xyXG4gICAgaWYgKCFTZXJpYWxpemVyLmhhc09yaWdpbmFsUHJvcGVydHkodGhpcywgbmFtZSkpIHJldHVybjtcclxuICAgIGlmICh0aGlzLmNvbE93bmVyICE9IG51bGwgJiYgIXRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHtcclxuICAgICAgdGhpcy5jb2xPd25lci5vbkNvbHVtblByb3BlcnR5Q2hhbmdlZCh0aGlzLCBuYW1lLCBuZXdWYWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHByaXZhdGUgZG9JdGVtVmFsdWVQcm9wZXJ0eUNoYW5nZWQoXHJcbiAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZyxcclxuICAgIG9iajogSXRlbVZhbHVlLFxyXG4gICAgbmFtZTogc3RyaW5nLFxyXG4gICAgbmV3VmFsdWU6IGFueSxcclxuICAgIG9sZFZhbHVlOiBhbnlcclxuICApIHtcclxuICAgIGlmICghU2VyaWFsaXplci5oYXNPcmlnaW5hbFByb3BlcnR5KG9iaiwgbmFtZSkpIHJldHVybjtcclxuICAgIGlmICh0aGlzLmNvbE93bmVyICE9IG51bGwgJiYgIXRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHtcclxuICAgICAgdGhpcy5jb2xPd25lci5vbkNvbHVtbkl0ZW1WYWx1ZVByb3BlcnR5Q2hhbmdlZChcclxuICAgICAgICB0aGlzLFxyXG4gICAgICAgIHByb3BlcnR5TmFtZSxcclxuICAgICAgICBvYmosXHJcbiAgICAgICAgbmFtZSxcclxuICAgICAgICBuZXdWYWx1ZSxcclxuICAgICAgICBvbGRWYWx1ZVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkb1Nob3dJbk11bHRpcGxlQ29sdW1uc0NoYW5nZWQoKSB7XHJcbiAgICBpZiAodGhpcy5jb2xPd25lciAhPSBudWxsICYmICF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSB7XHJcbiAgICAgIHRoaXMuY29sT3duZXIub25TaG93SW5NdWx0aXBsZUNvbHVtbnNDaGFuZ2VkKHRoaXMpO1xyXG4gICAgfVxyXG4gIH1cclxuICBwcml2YXRlIGdldFByb3BlcnRpZXMoY3VyQ2VsbFR5cGU6IHN0cmluZyk6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4ge1xyXG4gICAgcmV0dXJuIFNlcmlhbGl6ZXIuZ2V0RHluYW1pY1Byb3BlcnRpZXNCeU9iaih0aGlzLCBjdXJDZWxsVHlwZSk7XHJcbiAgfVxyXG4gIHByaXZhdGUgcmVtb3ZlUHJvcGVydGllcyhjdXJDZWxsVHlwZTogc3RyaW5nKSB7XHJcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0UHJvcGVydGllcyhjdXJDZWxsVHlwZSk7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdmFyIHByb3AgPSBwcm9wZXJ0aWVzW2ldO1xyXG4gICAgICBkZWxldGUgKDxhbnk+dGhpcylbcHJvcC5uYW1lXTtcclxuICAgICAgaWYgKHByb3Auc2VyaWFsaXphdGlvblByb3BlcnR5KSB7XHJcbiAgICAgICAgZGVsZXRlICg8YW55PnRoaXMpW3Byb3Auc2VyaWFsaXphdGlvblByb3BlcnR5XTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBwcml2YXRlIGFkZFByb3BlcnRpZXMoY3VyQ2VsbFR5cGU6IHN0cmluZykge1xyXG4gICAgdmFyIHF1ZXN0aW9uID0gdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uO1xyXG4gICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmdldFByb3BlcnRpZXMoY3VyQ2VsbFR5cGUpO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHZhciBwcm9wID0gcHJvcGVydGllc1tpXTtcclxuICAgICAgdGhpcy5hZGRQcm9wZXJ0eShxdWVzdGlvbiwgcHJvcC5uYW1lLCBmYWxzZSk7XHJcbiAgICAgIGlmIChwcm9wLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eSkge1xyXG4gICAgICAgIHRoaXMuYWRkUHJvcGVydHkocXVlc3Rpb24sIHByb3Auc2VyaWFsaXphdGlvblByb3BlcnR5LCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBwcml2YXRlIGFkZFByb3BlcnR5KFxyXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxyXG4gICAgcHJvcE5hbWU6IHN0cmluZyxcclxuICAgIGlzUmVhZE9ubHk6IGJvb2xlYW5cclxuICApIHtcclxuICAgIHZhciBkZXNjID0ge1xyXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXHJcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiAoPGFueT5xdWVzdGlvbilbcHJvcE5hbWVdO1xyXG4gICAgICB9LFxyXG4gICAgfTtcclxuICAgIGlmICghaXNSZWFkT25seSkge1xyXG4gICAgICAoPGFueT5kZXNjKVtcInNldFwiXSA9IGZ1bmN0aW9uICh2OiBhbnkpIHtcclxuICAgICAgICAoPGFueT5xdWVzdGlvbilbcHJvcE5hbWVdID0gdjtcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wTmFtZSwgZGVzYyk7XHJcbiAgfVxyXG59XHJcblxyXG5TZXJpYWxpemVyLmFkZENsYXNzKFxyXG4gIFwibWF0cml4ZHJvcGRvd25jb2x1bW5cIixcclxuICBbXHJcbiAgICB7IG5hbWU6IFwiIW5hbWVcIiwgaXNVbmlxdWU6IHRydWUgfSxcclxuICAgIHsgbmFtZTogXCJ0aXRsZVwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jVGl0bGVcIiB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiBcImNlbGxUeXBlXCIsXHJcbiAgICAgIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLFxyXG4gICAgICBjaG9pY2VzOiAoKSA9PiB7XHJcbiAgICAgICAgdmFyIHJlcyA9IE1hdHJpeERyb3Bkb3duQ29sdW1uLmdldENvbHVtblR5cGVzKCk7XHJcbiAgICAgICAgcmVzLnNwbGljZSgwLCAwLCBcImRlZmF1bHRcIik7XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgfSxcclxuICAgIH0sXHJcbiAgICB7IG5hbWU6IFwiY29sQ291bnRcIiwgZGVmYXVsdDogLTEsIGNob2ljZXM6IFstMSwgMCwgMSwgMiwgMywgNF0gfSxcclxuICAgIFwiaXNSZXF1aXJlZDpib29sZWFuXCIsXHJcbiAgICBcImlzVW5pcXVlOmJvb2xlYW5cIixcclxuICAgIHtcclxuICAgICAgbmFtZTogXCJyZXF1aXJlZEVycm9yVGV4dDp0ZXh0XCIsXHJcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NSZXF1aXJlZEVycm9yVGV4dFwiLFxyXG4gICAgfSxcclxuICAgIFwicmVhZE9ubHk6Ym9vbGVhblwiLFxyXG4gICAgXCJtaW5XaWR0aFwiLFxyXG4gICAgXCJ3aWR0aFwiLFxyXG4gICAgXCJ2aXNpYmxlSWY6Y29uZGl0aW9uXCIsXHJcbiAgICBcImVuYWJsZUlmOmNvbmRpdGlvblwiLFxyXG4gICAgXCJyZXF1aXJlZElmOmNvbmRpdGlvblwiLFxyXG4gICAge1xyXG4gICAgICBuYW1lOiBcInNob3dJbk11bHRpcGxlQ29sdW1uczpib29sZWFuXCIsXHJcbiAgICAgIGRlcGVuZHNPbjogXCJjZWxsVHlwZVwiLFxyXG4gICAgICB2aXNpYmxlSWY6IGZ1bmN0aW9uIChvYmo6IGFueSkge1xyXG4gICAgICAgIGlmICghb2JqKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIG9iai5pc1N1cHBvcnRNdWx0aXBsZUNvbHVtbnM7XHJcbiAgICAgIH0sXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiBcInZhbGlkYXRvcnM6dmFsaWRhdG9yc1wiLFxyXG4gICAgICBiYXNlQ2xhc3NOYW1lOiBcInN1cnZleXZhbGlkYXRvclwiLFxyXG4gICAgICBjbGFzc05hbWVQYXJ0OiBcInZhbGlkYXRvclwiLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogXCJ0b3RhbFR5cGVcIixcclxuICAgICAgZGVmYXVsdDogXCJub25lXCIsXHJcbiAgICAgIGNob2ljZXM6IFtcIm5vbmVcIiwgXCJzdW1cIiwgXCJjb3VudFwiLCBcIm1pblwiLCBcIm1heFwiLCBcImF2Z1wiXSxcclxuICAgIH0sXHJcbiAgICBcInRvdGFsRXhwcmVzc2lvbjpleHByZXNzaW9uXCIsXHJcbiAgICB7IG5hbWU6IFwidG90YWxGb3JtYXRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1RvdGFsRm9ybWF0XCIgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogXCJ0b3RhbERpc3BsYXlTdHlsZVwiLFxyXG4gICAgICBkZWZhdWx0OiBcIm5vbmVcIixcclxuICAgICAgY2hvaWNlczogW1wibm9uZVwiLCBcImRlY2ltYWxcIiwgXCJjdXJyZW5jeVwiLCBcInBlcmNlbnRcIl0sXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiBcInRvdGFsQ3VycmVuY3lcIixcclxuICAgICAgY2hvaWNlczogKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBnZXRDdXJyZWN5Q29kZXMoKTtcclxuICAgICAgfSxcclxuICAgICAgZGVmYXVsdDogXCJVU0RcIixcclxuICAgIH0sXHJcbiAgICB7IG5hbWU6IFwidG90YWxNYXhpbXVtRnJhY3Rpb25EaWdpdHM6bnVtYmVyXCIsIGRlZmF1bHQ6IC0xIH0sXHJcbiAgICB7IG5hbWU6IFwidG90YWxNaW5pbXVtRnJhY3Rpb25EaWdpdHM6bnVtYmVyXCIsIGRlZmF1bHQ6IC0xIH0sXHJcbiAgICB7IG5hbWU6IFwicmVuZGVyQXNcIiwgZGVmYXVsdDogXCJkZWZhdWx0XCIsIHZpc2libGU6IGZhbHNlIH0sXHJcbiAgXSxcclxuICBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gbmV3IE1hdHJpeERyb3Bkb3duQ29sdW1uKFwiXCIpO1xyXG4gIH1cclxuKTtcclxuIiwiaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XHJcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcclxuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuL2Jhc2VcIjtcclxuaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4vaXRlbXZhbHVlXCI7XHJcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcclxuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xyXG5pbXBvcnQgeyBQYW5lbE1vZGVsIH0gZnJvbSBcIi4vcGFuZWxcIjtcclxuaW1wb3J0IHsgQWN0aW9uLCBJQWN0aW9uIH0gZnJvbSBcIi4vYWN0aW9ucy9hY3Rpb25cIjtcclxuaW1wb3J0IHsgQWRhcHRpdmVBY3Rpb25Db250YWluZXIgfSBmcm9tIFwiLi9hY3Rpb25zL2FkYXB0aXZlLWNvbnRhaW5lclwiO1xyXG5pbXBvcnQgeyBDc3NDbGFzc0J1aWxkZXIgfSBmcm9tIFwiLi91dGlscy9jc3NDbGFzc0J1aWxkZXJcIjtcclxuaW1wb3J0IHsgTWF0cml4RHJvcGRvd25Db2x1bW4gfSBmcm9tIFwiLi9xdWVzdGlvbl9tYXRyaXhkcm9wZG93bmNvbHVtblwiO1xyXG5pbXBvcnQgeyBNYXRyaXhEcm9wZG93bkNlbGwsIE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLCBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlIH0gZnJvbSBcIi4vcXVlc3Rpb25fbWF0cml4ZHJvcGRvd25iYXNlXCI7XHJcbmltcG9ydCB7IEFjdGlvbkNvbnRhaW5lciB9IGZyb20gXCIuL2FjdGlvbnMvY29udGFpbmVyXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCB7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgY291bnRlciA9IDE7XHJcbiAgcHJpdmF0ZSBpZFZhbHVlOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBpdGVtVmFsdWU6IEl0ZW1WYWx1ZTtcclxuICBwdWJsaWMgbWluV2lkdGg6IHN0cmluZyA9IFwiXCI7XHJcbiAgcHVibGljIHdpZHRoOiBzdHJpbmcgPSBcIlwiO1xyXG4gIHB1YmxpYyBsb2NUaXRsZTogTG9jYWxpemFibGVTdHJpbmc7XHJcbiAgcHVibGljIGNlbGw6IE1hdHJpeERyb3Bkb3duQ2VsbDtcclxuICBwdWJsaWMgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbjtcclxuICBwdWJsaWMgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZTtcclxuICBwdWJsaWMgcXVlc3Rpb246IFF1ZXN0aW9uO1xyXG4gIHB1YmxpYyBpc1JlbW92ZVJvdzogYm9vbGVhbjtcclxuICBwdWJsaWMgY2hvaWNlSW5kZXg6IG51bWJlcjtcclxuICBwdWJsaWMgbWF0cml4OiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlO1xyXG4gIHB1YmxpYyByZXF1aXJlZFRleHQ6IHN0cmluZztcclxuICBwdWJsaWMgaXNFbXB0eTogYm9vbGVhbjtcclxuICBwdWJsaWMgY29sU3BhbnM6IG51bWJlciA9IDE7XHJcbiAgcHVibGljIHBhbmVsOiBQYW5lbE1vZGVsO1xyXG4gIHB1YmxpYyBpc1Nob3dIaWRlRGV0YWlsOiBib29sZWFuO1xyXG4gIHB1YmxpYyBpc0FjdGlvbnNDZWxsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGNsYXNzTmFtZTogc3RyaW5nID0gXCJcIjtcclxuICBwdWJsaWMgaXNEcmFnSGFuZGxlckNlbGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLmlkVmFsdWUgPSBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsLmNvdW50ZXIrKztcclxuICB9XHJcbiAgcHVibGljIGdldCBoYXNRdWVzdGlvbigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhIXRoaXMucXVlc3Rpb247XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgaGFzVGl0bGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISF0aGlzLmxvY1RpdGxlO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IGhhc1BhbmVsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICEhdGhpcy5wYW5lbDtcclxuICB9XHJcbiAgcHVibGljIGdldCBpZCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuaWRWYWx1ZTtcclxuICB9XHJcbiAgcHVibGljIGdldCBzaG93RXJyb3JPblRvcCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnNob3dFcnJvck9uQ29yZShcInRvcFwiKTtcclxuICB9XHJcbiAgcHVibGljIGdldCBzaG93RXJyb3JPbkJvdHRvbSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnNob3dFcnJvck9uQ29yZShcImJvdHRvbVwiKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBzaG93RXJyb3JPbkNvcmUobG9jYXRpb246IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5nZXRTaG93RXJyb3JMb2NhdGlvbigpID09IGxvY2F0aW9uICYmXHJcbiAgICAgICghdGhpcy5pc0Nob2ljZSB8fCB0aGlzLmlzRmlyc3RDaG9pY2UpXHJcbiAgICApO1xyXG4gIH1cclxuICBwcml2YXRlIGdldFNob3dFcnJvckxvY2F0aW9uKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5oYXNRdWVzdGlvbiA/IHRoaXMucXVlc3Rpb24uc3VydmV5LnF1ZXN0aW9uRXJyb3JMb2NhdGlvbiA6IFwiXCI7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgaXRlbSgpOiBJdGVtVmFsdWUge1xyXG4gICAgcmV0dXJuIHRoaXMuaXRlbVZhbHVlO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IGl0ZW0odmFsOiBJdGVtVmFsdWUpIHtcclxuICAgIHRoaXMuaXRlbVZhbHVlID0gdmFsO1xyXG4gICAgaWYgKCEhdmFsKSB7XHJcbiAgICAgIHZhbC5oaWRlQ2FwdGlvbiA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgaXNDaG9pY2UoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISF0aGlzLml0ZW07XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgY2hvaWNlVmFsdWUoKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLmlzQ2hvaWNlID8gdGhpcy5pdGVtLnZhbHVlIDogbnVsbDtcclxuICB9XHJcbiAgcHVibGljIGdldCBpc0NoZWNrYm94KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaXNDaG9pY2UgJiYgdGhpcy5xdWVzdGlvbi5nZXRUeXBlKCkgPT0gXCJjaGVja2JveFwiO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IGlzRmlyc3RDaG9pY2UoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jaG9pY2VJbmRleCA9PT0gMDtcclxuICB9XHJcbiAgcHVibGljIGdldCBjc3MoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBuZXcgQ3NzQ2xhc3NCdWlsZGVyKClcclxuICAgICAgLmFwcGVuZCh0aGlzLmNsYXNzTmFtZSlcclxuICAgICAgLmFwcGVuZCh0aGlzLnF1ZXN0aW9uLmNzc0Vycm9yLCB0aGlzLnF1ZXN0aW9uLmVycm9ycy5sZW5ndGggPiAwKVxyXG4gICAgICAudG9TdHJpbmcoKTtcclxuICB9XHJcbiAgcHVibGljIGdldCBoZWFkZXJzKCk6IHN0cmluZyB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuY2VsbCAmJlxyXG4gICAgICB0aGlzLmNlbGwuY29sdW1uICYmXHJcbiAgICAgIHRoaXMuY2VsbC5jb2x1bW4uaXNTaG93SW5NdWx0aXBsZUNvbHVtbnNcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gdGhpcy5pdGVtLmxvY1RleHQucmVuZGVyZWRIdG1sO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMucXVlc3Rpb24gJiYgdGhpcy5xdWVzdGlvbi5pc1Zpc2libGUpIHtcclxuICAgICAgcmV0dXJuIHRoaXMucXVlc3Rpb24ubG9jVGl0bGUucmVuZGVyZWRIdG1sO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaGFzVGl0bGUpIHtcclxuICAgICAgcmV0dXJuIHRoaXMubG9jVGl0bGUucmVuZGVyZWRIdG1sIHx8IFwiXCI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gXCJcIjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjYWxjdWxhdGVGaW5hbENsYXNzTmFtZShtYXRyaXhDc3NDbGFzc2VzOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgcXVlc3Rpb25Dc3MgPSB0aGlzLmNlbGwucXVlc3Rpb24uY3NzQ2xhc3NlcztcclxuICAgIC8vICd0ZXh0LWFsaWduJzogJGRhdGEuaXNDaG9pY2UgPyAnY2VudGVyJzpcclxuICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgQ3NzQ2xhc3NCdWlsZGVyKClcclxuICAgICAgLmFwcGVuZChxdWVzdGlvbkNzcy5pdGVtVmFsdWUsICEhcXVlc3Rpb25Dc3MpXHJcbiAgICAgIC5hcHBlbmQocXVlc3Rpb25Dc3MuYXNDZWxsLCAhIXF1ZXN0aW9uQ3NzKTtcclxuICAgIHJldHVybiBidWlsZGVyLmFwcGVuZChtYXRyaXhDc3NDbGFzc2VzLmNlbGwsIGJ1aWxkZXIuaXNFbXB0eSgpICYmICEhbWF0cml4Q3NzQ2xhc3NlcylcclxuICAgICAgLmFwcGVuZChxdWVzdGlvbkNzcy5oYXNFcnJvciwgdGhpcy5xdWVzdGlvbi5lcnJvcnMubGVuZ3RoID4gMClcclxuICAgICAgLmFwcGVuZChtYXRyaXhDc3NDbGFzc2VzLmNob2ljZUNlbGwsIHRoaXMuaXNDaG9pY2UpXHJcbiAgICAgIC50b1N0cmluZygpO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdyBleHRlbmRzIEJhc2Uge1xyXG4gIEBwcm9wZXJ0eSh7IGRlZmF1bHRWYWx1ZTogbnVsbCB9KSBnaG9zdFBvc2l0aW9uOiBzdHJpbmc7XHJcbiAgQHByb3BlcnR5KHsgZGVmYXVsdFZhbHVlOiBmYWxzZSB9KSBpc0FkZGl0aW9uYWxDbGFzc2VzOiBib29sZWFuO1xyXG5cclxuICBwdWJsaWMgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZTtcclxuICBwcml2YXRlIHN0YXRpYyBjb3VudGVyID0gMTtcclxuICBwcml2YXRlIGlkVmFsdWU6IG51bWJlcjtcclxuICBwdWJsaWMgY2VsbHM6IEFycmF5PFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGw+ID0gW107XHJcblxyXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgY3NzQ2xhc3NlczogYW55LCBwdWJsaWMgaXNEZXRhaWxSb3c6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIHRoaXMub25DcmVhdGluZygpO1xyXG4gICAgdGhpcy5pZFZhbHVlID0gUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93LmNvdW50ZXIrKztcclxuICB9XHJcbiAgcHVibGljIG9uQ3JlYXRpbmcoKSB7IH0gLy8gbmVlZCBmb3Iga25vY2tvdXQgYmluZGluZyBzZWUgUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93LnByb3RvdHlwZVtcIm9uQ3JlYXRpbmdcIl1cclxuICBwdWJsaWMgZ2V0IGlkKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5pZFZhbHVlO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IGF0dHJpYnV0ZXMoKSB7XHJcbiAgICBpZiAoIXRoaXMucm93KSByZXR1cm4ge307XHJcbiAgICByZXR1cm4geyBcImRhdGEtc3YtZHJvcC10YXJnZXQtbWF0cml4LXJvd1wiOiB0aGlzLnJvdy5pZCB9O1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IGNsYXNzTmFtZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIG5ldyBDc3NDbGFzc0J1aWxkZXIoKVxyXG4gICAgICAuYXBwZW5kKHRoaXMuY3NzQ2xhc3Nlcy5yb3cpXHJcbiAgICAgIC5hcHBlbmQodGhpcy5jc3NDbGFzc2VzLmRldGFpbFJvdywgdGhpcy5pc0RldGFpbFJvdylcclxuICAgICAgLmFwcGVuZCh0aGlzLmNzc0NsYXNzZXMuZHJhZ0Ryb3BHaG9zdFBvc2l0aW9uVG9wLCB0aGlzLmdob3N0UG9zaXRpb24gPT09IFwidG9wXCIpXHJcbiAgICAgIC5hcHBlbmQodGhpcy5jc3NDbGFzc2VzLmRyYWdEcm9wR2hvc3RQb3NpdGlvbkJvdHRvbSwgdGhpcy5naG9zdFBvc2l0aW9uID09PSBcImJvdHRvbVwiKVxyXG4gICAgICAuYXBwZW5kKHRoaXMuY3NzQ2xhc3Nlcy5yb3dBZGRpdGlvbmFsLCB0aGlzLmlzQWRkaXRpb25hbENsYXNzZXMpXHJcbiAgICAgIC50b1N0cmluZygpO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFRhYmxlIGV4dGVuZHMgQmFzZSB7XHJcbiAgcHJpdmF0ZSBoZWFkZXJSb3dWYWx1ZTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93O1xyXG4gIHByaXZhdGUgZm9vdGVyUm93VmFsdWU6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdztcclxuICBwcml2YXRlIGhhc1JlbW92ZVJvd3NWYWx1ZTogYm9vbGVhbjtcclxuICBwcml2YXRlIHJvd3NBY3Rpb25zOiBBcnJheTxBcnJheTxJQWN0aW9uPj47XHJcbiAgcHJpdmF0ZSBjc3NDbGFzc2VzOiBhbnk7XHJcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBtYXRyaXg6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICB0aGlzLmNyZWF0ZU5ld0FycmF5KFwicm93c1wiKTtcclxuICAgIHRoaXMuYnVpbGQoKTtcclxuICB9XHJcbiAgcHVibGljIGdldCBzaG93VGFibGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1RhYmxlXCIsIHRydWUpO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IHNob3dIZWFkZXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd0hlYWRlclwiKTtcclxuICB9XHJcbiAgcHVibGljIGdldCBzaG93QWRkUm93T25Ub3AoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd0FkZFJvd09uVG9wXCIsIGZhbHNlKTtcclxuICB9XHJcbiAgcHVibGljIGdldCBzaG93QWRkUm93T25Cb3R0b20oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd0FkZFJvd09uQm90dG9tXCIsIGZhbHNlKTtcclxuICB9XHJcbiAgcHVibGljIGdldCBzaG93Rm9vdGVyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMubWF0cml4Lmhhc0Zvb3RlciAmJiB0aGlzLm1hdHJpeC5pc0NvbHVtbkxheW91dEhvcml6b250YWw7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgaGFzRm9vdGVyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICEhdGhpcy5mb290ZXJSb3c7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgaGFzUmVtb3ZlUm93cygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmhhc1JlbW92ZVJvd3NWYWx1ZTtcclxuICB9XHJcbiAgcHVibGljIGlzUmVxdWlyZVJlc2V0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5oYXNSZW1vdmVSb3dzICE9IHRoaXMubWF0cml4LmNhblJlbW92ZVJvd3MgfHxcclxuICAgICAgIXRoaXMubWF0cml4LmlzQ29sdW1uTGF5b3V0SG9yaXpvbnRhbFxyXG4gICAgKTtcclxuICB9XHJcbiAgcHVibGljIGdldCBoZWFkZXJSb3coKTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93IHtcclxuICAgIHJldHVybiB0aGlzLmhlYWRlclJvd1ZhbHVlO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IGZvb3RlclJvdygpOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3cge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9vdGVyUm93VmFsdWU7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgcm93cygpOiBBcnJheTxRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3c+IHtcclxuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyb3dzXCIpO1xyXG4gIH1cclxuICBwcm90ZWN0ZWQgYnVpbGQoKSB7XHJcbiAgICB0aGlzLmhhc1JlbW92ZVJvd3NWYWx1ZSA9IHRoaXMubWF0cml4LmNhblJlbW92ZVJvd3M7XHJcbiAgICAvL2J1aWxkIHJvd3Mgbm93XHJcbiAgICB2YXIgcm93cyA9IHRoaXMubWF0cml4LnZpc2libGVSb3dzO1xyXG4gICAgdGhpcy5jc3NDbGFzc2VzID0gdGhpcy5tYXRyaXguY3NzQ2xhc3NlcztcclxuICAgIHRoaXMuYnVpbGRSb3dzQWN0aW9ucygpO1xyXG4gICAgdGhpcy5idWlsZEhlYWRlcigpO1xyXG4gICAgdGhpcy5idWlsZFJvd3MoKTtcclxuICAgIHRoaXMuYnVpbGRGb290ZXIoKTtcclxuICAgIHRoaXMudXBkYXRlU2hvd1RhYmxlQW5kQWRkUm93KCk7XHJcbiAgfVxyXG4gIHB1YmxpYyB1cGRhdGVTaG93VGFibGVBbmRBZGRSb3coKSB7XHJcbiAgICB2YXIgc2hvd1RhYmxlID1cclxuICAgICAgdGhpcy5yb3dzLmxlbmd0aCA+IDAgfHxcclxuICAgICAgdGhpcy5tYXRyaXguaXNEZXNpZ25Nb2RlIHx8XHJcbiAgICAgICF0aGlzLm1hdHJpeC5nZXRTaG93Q29sdW1uc0lmRW1wdHkoKTtcclxuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dUYWJsZVwiLCBzaG93VGFibGUpO1xyXG4gICAgdmFyIHNob3dBZGRSb3cgPSB0aGlzLm1hdHJpeC5jYW5BZGRSb3cgJiYgc2hvd1RhYmxlO1xyXG4gICAgdmFyIHNob3dBZGRSb3dPblRvcCA9IHNob3dBZGRSb3c7XHJcbiAgICB2YXIgc2hvd0FkZFJvd09uQm90dG9tID0gc2hvd0FkZFJvdztcclxuICAgIGlmIChzaG93QWRkUm93T25Ub3ApIHtcclxuICAgICAgaWYgKHRoaXMubWF0cml4LmdldEFkZFJvd0xvY2F0aW9uKCkgPT09IFwiZGVmYXVsdFwiKSB7XHJcbiAgICAgICAgc2hvd0FkZFJvd09uVG9wID0gdGhpcy5tYXRyaXguY29sdW1uTGF5b3V0ID09PSBcInZlcnRpY2FsXCI7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2hvd0FkZFJvd09uVG9wID0gdGhpcy5tYXRyaXguZ2V0QWRkUm93TG9jYXRpb24oKSAhPT0gXCJib3R0b21cIjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHNob3dBZGRSb3dPbkJvdHRvbSAmJiB0aGlzLm1hdHJpeC5nZXRBZGRSb3dMb2NhdGlvbigpICE9PSBcInRvcEJvdHRvbVwiKSB7XHJcbiAgICAgIHNob3dBZGRSb3dPbkJvdHRvbSA9ICFzaG93QWRkUm93T25Ub3A7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93QWRkUm93T25Ub3BcIiwgc2hvd0FkZFJvd09uVG9wKTtcclxuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dBZGRSb3dPbkJvdHRvbVwiLCBzaG93QWRkUm93T25Cb3R0b20pO1xyXG4gIH1cclxuICBwdWJsaWMgb25BZGRlZFJvdygpIHtcclxuICAgIGlmICh0aGlzLmdldFJlbmRlcmVkRGF0YVJvd0NvdW50KCkgPj0gdGhpcy5tYXRyaXgudmlzaWJsZVJvd3MubGVuZ3RoKVxyXG4gICAgICByZXR1cm47XHJcbiAgICB2YXIgcm93ID0gdGhpcy5tYXRyaXgudmlzaWJsZVJvd3NbdGhpcy5tYXRyaXgudmlzaWJsZVJvd3MubGVuZ3RoIC0gMV07XHJcbiAgICB0aGlzLnJvd3NBY3Rpb25zLnB1c2godGhpcy5idWlsZFJvd0FjdGlvbnMocm93KSk7XHJcbiAgICB0aGlzLmFkZEhvcml6b250YWxSb3coXHJcbiAgICAgIHRoaXMucm93cyxcclxuICAgICAgcm93LFxyXG4gICAgICB0aGlzLm1hdHJpeC52aXNpYmxlUm93cy5sZW5ndGggPT0gMSAmJiAhdGhpcy5tYXRyaXguc2hvd0hlYWRlclxyXG4gICAgKTtcclxuICAgIHRoaXMudXBkYXRlU2hvd1RhYmxlQW5kQWRkUm93KCk7XHJcbiAgfVxyXG4gIHByaXZhdGUgZ2V0UmVuZGVyZWREYXRhUm93Q291bnQoKTogbnVtYmVyIHtcclxuICAgIHZhciByZXMgPSAwO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKCF0aGlzLnJvd3NbaV0uaXNEZXRhaWxSb3cpIHJlcysrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcbiAgcHVibGljIG9uUmVtb3ZlZFJvdyhyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlKSB7XHJcbiAgICB2YXIgcm93SW5kZXggPSB0aGlzLmdldFJlbmRlcmVkUm93SW5kZXgocm93KTtcclxuICAgIGlmIChyb3dJbmRleCA8IDApIHJldHVybjtcclxuICAgIHRoaXMucm93c0FjdGlvbnMuc3BsaWNlKHJvd0luZGV4LCAxKTtcclxuICAgIHZhciByZW1vdmVDb3VudCA9IDE7XHJcbiAgICBpZiAoXHJcbiAgICAgIHJvd0luZGV4IDwgdGhpcy5yb3dzLmxlbmd0aCAtIDEgJiZcclxuICAgICAgdGhpcy5yb3dzW3Jvd0luZGV4ICsgMV0uaXNEZXRhaWxSb3dcclxuICAgICkge1xyXG4gICAgICByZW1vdmVDb3VudCsrO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yb3dzLnNwbGljZShyb3dJbmRleCwgcmVtb3ZlQ291bnQpO1xyXG4gICAgdGhpcy51cGRhdGVTaG93VGFibGVBbmRBZGRSb3coKTtcclxuICB9XHJcbiAgcHVibGljIG9uRGV0YWlsUGFuZWxDaGFuZ2VWaXNpYmlsaXR5KFxyXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcclxuICAgIGlzU2hvd2luZzogYm9vbGVhblxyXG4gICkge1xyXG4gICAgdmFyIHJvd0luZGV4ID0gdGhpcy5nZXRSZW5kZXJlZFJvd0luZGV4KHJvdyk7XHJcbiAgICBpZiAocm93SW5kZXggPCAwKSByZXR1cm47XHJcbiAgICB2YXIgcGFuZWxSb3dJbmRleCA9XHJcbiAgICAgIHJvd0luZGV4IDwgdGhpcy5yb3dzLmxlbmd0aCAtIDEgJiYgdGhpcy5yb3dzW3Jvd0luZGV4ICsgMV0uaXNEZXRhaWxSb3dcclxuICAgICAgICA/IHJvd0luZGV4ICsgMVxyXG4gICAgICAgIDogLTE7XHJcbiAgICBpZiAoKGlzU2hvd2luZyAmJiBwYW5lbFJvd0luZGV4ID4gLTEpIHx8ICghaXNTaG93aW5nICYmIHBhbmVsUm93SW5kZXggPCAwKSlcclxuICAgICAgcmV0dXJuO1xyXG4gICAgaWYgKGlzU2hvd2luZykge1xyXG4gICAgICB2YXIgZGV0YWlsUm93ID0gdGhpcy5jcmVhdGVEZXRhaWxQYW5lbFJvdyhyb3csIHRoaXMucm93c1tyb3dJbmRleF0pO1xyXG4gICAgICB0aGlzLnJvd3Muc3BsaWNlKHJvd0luZGV4ICsgMSwgMCwgZGV0YWlsUm93KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucm93cy5zcGxpY2UocGFuZWxSb3dJbmRleCwgMSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHByaXZhdGUgZ2V0UmVuZGVyZWRSb3dJbmRleChyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlKTogbnVtYmVyIHtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh0aGlzLnJvd3NbaV0ucm93ID09IHJvdykgcmV0dXJuIGk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gLTE7XHJcbiAgfVxyXG4gIHByb3RlY3RlZCBidWlsZFJvd3NBY3Rpb25zKCkge1xyXG4gICAgdGhpcy5yb3dzQWN0aW9ucyA9IFtdO1xyXG4gICAgdmFyIHJvd3MgPSB0aGlzLm1hdHJpeC52aXNpYmxlUm93cztcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICB0aGlzLnJvd3NBY3Rpb25zLnB1c2godGhpcy5idWlsZFJvd0FjdGlvbnMocm93c1tpXSkpO1xyXG4gICAgfVxyXG4gIH1cclxuICBwcm90ZWN0ZWQgYnVpbGRIZWFkZXIoKSB7XHJcbiAgICB2YXIgY29sSGVhZGVycyA9XHJcbiAgICAgIHRoaXMubWF0cml4LmlzQ29sdW1uTGF5b3V0SG9yaXpvbnRhbCAmJiB0aGlzLm1hdHJpeC5zaG93SGVhZGVyO1xyXG4gICAgdmFyIGlzU2hvd24gPVxyXG4gICAgICBjb2xIZWFkZXJzIHx8XHJcbiAgICAgICh0aGlzLm1hdHJpeC5oYXNSb3dUZXh0ICYmICF0aGlzLm1hdHJpeC5pc0NvbHVtbkxheW91dEhvcml6b250YWwpO1xyXG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd0hlYWRlclwiLCBpc1Nob3duKTtcclxuICAgIGlmICghaXNTaG93bikgcmV0dXJuO1xyXG4gICAgdGhpcy5oZWFkZXJSb3dWYWx1ZSA9IG5ldyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3coXHJcbiAgICAgIHRoaXMuY3NzQ2xhc3Nlc1xyXG4gICAgKTtcclxuICAgIGlmICh0aGlzLm1hdHJpeC5hbGxvd1Jvd3NEcmFnQW5kRHJvcCkge1xyXG4gICAgICB0aGlzLmhlYWRlclJvdy5jZWxscy5wdXNoKHRoaXMuY3JlYXRlSGVhZGVyQ2VsbChudWxsKSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5oYXNBY3Rpb25DZWxsSW5Sb3dzKFwic3RhcnRcIikpIHtcclxuICAgICAgdGhpcy5oZWFkZXJSb3cuY2VsbHMucHVzaCh0aGlzLmNyZWF0ZUhlYWRlckNlbGwobnVsbCkpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubWF0cml4Lmhhc1Jvd1RleHQgJiYgdGhpcy5tYXRyaXguc2hvd0hlYWRlcikge1xyXG4gICAgICB0aGlzLmhlYWRlclJvdy5jZWxscy5wdXNoKHRoaXMuY3JlYXRlSGVhZGVyQ2VsbChudWxsKSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5tYXRyaXguaXNDb2x1bW5MYXlvdXRIb3Jpem9udGFsKSB7XHJcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5tYXRyaXgudmlzaWJsZUNvbHVtbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICB2YXIgY29sdW1uID0gdGhpcy5tYXRyaXgudmlzaWJsZUNvbHVtbnNbaV07XHJcbiAgICAgICAgaWYgKCFjb2x1bW4uaGFzVmlzaWJsZUNlbGwpIGNvbnRpbnVlO1xyXG4gICAgICAgIGlmIChjb2x1bW4uaXNTaG93SW5NdWx0aXBsZUNvbHVtbnMpIHtcclxuICAgICAgICAgIHRoaXMuY3JlYXRlTXV0bGlwbGVDb2x1bW5zSGVhZGVyKGNvbHVtbik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuaGVhZGVyUm93LmNlbGxzLnB1c2godGhpcy5jcmVhdGVIZWFkZXJDZWxsKGNvbHVtbikpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdmFyIHJvd3MgPSB0aGlzLm1hdHJpeC52aXNpYmxlUm93cztcclxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgdGhpcy5oZWFkZXJSb3cuY2VsbHMucHVzaCh0aGlzLmNyZWF0ZVRleHRDZWxsKHJvd3NbaV0ubG9jVGV4dCkpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLm1hdHJpeC5oYXNGb290ZXIpIHtcclxuICAgICAgICB0aGlzLmhlYWRlclJvdy5jZWxscy5wdXNoKFxyXG4gICAgICAgICAgdGhpcy5jcmVhdGVUZXh0Q2VsbCh0aGlzLm1hdHJpeC5nZXRGb290ZXJUZXh0KCkpXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaGFzQWN0aW9uQ2VsbEluUm93cyhcImVuZFwiKSkge1xyXG4gICAgICB0aGlzLmhlYWRlclJvdy5jZWxscy5wdXNoKHRoaXMuY3JlYXRlSGVhZGVyQ2VsbChudWxsKSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHByb3RlY3RlZCBidWlsZEZvb3RlcigpIHtcclxuICAgIGlmICghdGhpcy5zaG93Rm9vdGVyKSByZXR1cm47XHJcbiAgICB0aGlzLmZvb3RlclJvd1ZhbHVlID0gbmV3IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdyhcclxuICAgICAgdGhpcy5jc3NDbGFzc2VzXHJcbiAgICApO1xyXG4gICAgaWYgKHRoaXMubWF0cml4LmFsbG93Um93c0RyYWdBbmREcm9wKSB7XHJcbiAgICAgIHRoaXMuZm9vdGVyUm93LmNlbGxzLnB1c2godGhpcy5jcmVhdGVIZWFkZXJDZWxsKG51bGwpKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmhhc0FjdGlvbkNlbGxJblJvd3MoXCJzdGFydFwiKSkge1xyXG4gICAgICB0aGlzLmZvb3RlclJvdy5jZWxscy5wdXNoKHRoaXMuY3JlYXRlSGVhZGVyQ2VsbChudWxsKSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5tYXRyaXguaGFzUm93VGV4dCkge1xyXG4gICAgICB0aGlzLmZvb3RlclJvdy5jZWxscy5wdXNoKFxyXG4gICAgICAgIHRoaXMuY3JlYXRlVGV4dENlbGwodGhpcy5tYXRyaXguZ2V0Rm9vdGVyVGV4dCgpKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgdmFyIGNlbGxzID0gdGhpcy5tYXRyaXgudmlzaWJsZVRvdGFsUm93LmNlbGxzO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykge1xyXG4gICAgICB2YXIgY2VsbCA9IGNlbGxzW2ldO1xyXG4gICAgICBpZiAoIWNlbGwuY29sdW1uLmhhc1Zpc2libGVDZWxsKSBjb250aW51ZTtcclxuICAgICAgaWYgKGNlbGwuY29sdW1uLmlzU2hvd0luTXVsdGlwbGVDb2x1bW5zKSB7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVNdXRsaXBsZUNvbHVtbnNGb290ZXIodGhpcy5mb290ZXJSb3csIGNlbGwpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZm9vdGVyUm93LmNlbGxzLnB1c2godGhpcy5jcmVhdGVFZGl0Q2VsbChjZWxsKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLmhhc0FjdGlvbkNlbGxJblJvd3MoXCJlbmRcIikpIHtcclxuICAgICAgdGhpcy5mb290ZXJSb3cuY2VsbHMucHVzaCh0aGlzLmNyZWF0ZUhlYWRlckNlbGwobnVsbCkpO1xyXG4gICAgfVxyXG4gIH1cclxuICBwcm90ZWN0ZWQgYnVpbGRSb3dzKCkge1xyXG4gICAgdmFyIHJvd3MgPSB0aGlzLm1hdHJpeC5pc0NvbHVtbkxheW91dEhvcml6b250YWxcclxuICAgICAgPyB0aGlzLmJ1aWxkSG9yaXpvbnRhbFJvd3MoKVxyXG4gICAgICA6IHRoaXMuYnVpbGRWZXJ0aWNhbFJvd3MoKTtcclxuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJvd3NcIiwgcm93cyk7XHJcbiAgfVxyXG4gIHByaXZhdGUgaGFzQWN0aW9uQ2VsbEluUm93c1ZhbHVlczogYW55ID0ge307XHJcbiAgcHJpdmF0ZSBoYXNBY3Rpb25DZWxsSW5Sb3dzKGxvY2F0aW9uOiBcInN0YXJ0XCIgfCBcImVuZFwiKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5oYXNBY3Rpb25DZWxsSW5Sb3dzVmFsdWVzW2xvY2F0aW9uXSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHZhciByb3dzID0gdGhpcy5tYXRyaXgudmlzaWJsZVJvd3M7XHJcbiAgICAgIHRoaXMuaGFzQWN0aW9uQ2VsbEluUm93c1ZhbHVlc1tsb2NhdGlvbl0gPSBmYWxzZTtcclxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLmdldFJvd0FjdGlvbnMoaSwgbG9jYXRpb24pKSkge1xyXG4gICAgICAgICAgdGhpcy5oYXNBY3Rpb25DZWxsSW5Sb3dzVmFsdWVzW2xvY2F0aW9uXSA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmhhc0FjdGlvbkNlbGxJblJvd3NWYWx1ZXNbbG9jYXRpb25dO1xyXG4gIH1cclxuICBwcml2YXRlIGNhblJlbW92ZVJvdyhyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5tYXRyaXguY2FuUmVtb3ZlUm93KHJvdyk7XHJcbiAgfVxyXG4gIHByaXZhdGUgYnVpbGRIb3Jpem9udGFsUm93cygpOiBBcnJheTxRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3c+IHtcclxuICAgIHZhciByb3dzID0gdGhpcy5tYXRyaXgudmlzaWJsZVJvd3M7XHJcbiAgICB2YXIgcmVuZGVyZWRSb3dzOiBBcnJheTxRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3c+ID0gW107XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdGhpcy5hZGRIb3Jpem9udGFsUm93KFxyXG4gICAgICAgIHJlbmRlcmVkUm93cyxcclxuICAgICAgICByb3dzW2ldLFxyXG4gICAgICAgIGkgPT0gMCAmJiAhdGhpcy5tYXRyaXguc2hvd0hlYWRlclxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlbmRlcmVkUm93cztcclxuICB9XHJcbiAgcHJpdmF0ZSBhZGRIb3Jpem9udGFsUm93KFxyXG4gICAgcmVuZGVyZWRSb3dzOiBBcnJheTxRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3c+LFxyXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcclxuICAgIHVzZUFzSGVhZGVyOiBib29sZWFuXHJcbiAgKSB7XHJcbiAgICB2YXIgcmVuZGVyZWRSb3cgPSB0aGlzLmNyZWF0ZUhvcml6b250YWxSb3cocm93LCB1c2VBc0hlYWRlcik7XHJcbiAgICByZW5kZXJlZFJvdy5yb3cgPSByb3c7XHJcbiAgICByZW5kZXJlZFJvd3MucHVzaChyZW5kZXJlZFJvdyk7XHJcbiAgICBpZiAocm93LmlzRGV0YWlsUGFuZWxTaG93aW5nKSB7XHJcbiAgICAgIHJlbmRlcmVkUm93cy5wdXNoKHRoaXMuY3JlYXRlRGV0YWlsUGFuZWxSb3cocm93LCByZW5kZXJlZFJvdykpO1xyXG4gICAgfVxyXG4gIH1cclxuICBwcml2YXRlIGdldFJvd0RyYWdDZWxsKHJvd0luZGV4OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGNlbGwgPSBuZXcgUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCgpO1xyXG4gICAgY2VsbC5pc0RyYWdIYW5kbGVyQ2VsbCA9IHRydWU7XHJcbiAgICBjZWxsLmNsYXNzTmFtZSA9IHRoaXMuY3NzQ2xhc3Nlcy5hY3Rpb25zQ2VsbDtcclxuICAgIGNlbGwucm93ID0gdGhpcy5tYXRyaXgudmlzaWJsZVJvd3Nbcm93SW5kZXhdO1xyXG4gICAgcmV0dXJuIGNlbGw7XHJcbiAgfVxyXG4gIHByaXZhdGUgZ2V0Um93QWN0aW9uc0NlbGwocm93SW5kZXg6IG51bWJlciwgbG9jYXRpb246IFwic3RhcnRcIiB8IFwiZW5kXCIpIHtcclxuICAgIGNvbnN0IHJvd0FjdGlvbnMgPSB0aGlzLmdldFJvd0FjdGlvbnMocm93SW5kZXgsIGxvY2F0aW9uKTtcclxuICAgIGlmICghdGhpcy5pc1ZhbHVlRW1wdHkocm93QWN0aW9ucykpIHtcclxuICAgICAgY29uc3QgY2VsbCA9IG5ldyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsKCk7XHJcbiAgICAgIGNvbnN0IGFjdGlvbkNvbnRhaW5lciA9IHRoaXMubWF0cml4LmFsbG93QWRhcHRpdmVBY3Rpb25zID8gbmV3IEFkYXB0aXZlQWN0aW9uQ29udGFpbmVyKCkgOiBuZXcgQWN0aW9uQ29udGFpbmVyKCk7XHJcbiAgICAgIGFjdGlvbkNvbnRhaW5lci5zZXRJdGVtcyhyb3dBY3Rpb25zKTtcclxuXHJcbiAgICAgIGNvbnN0IGl0ZW1WYWx1ZSA9IG5ldyBJdGVtVmFsdWUoYWN0aW9uQ29udGFpbmVyKTtcclxuICAgICAgY2VsbC5pdGVtID0gaXRlbVZhbHVlO1xyXG4gICAgICBjZWxsLmlzQWN0aW9uc0NlbGwgPSB0cnVlO1xyXG4gICAgICBjZWxsLmNsYXNzTmFtZSA9IHRoaXMuY3NzQ2xhc3Nlcy5hY3Rpb25zQ2VsbDtcclxuICAgICAgY2VsbC5yb3cgPSB0aGlzLm1hdHJpeC52aXNpYmxlUm93c1tyb3dJbmRleF07XHJcbiAgICAgIHJldHVybiBjZWxsO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG4gIHByaXZhdGUgZ2V0Um93QWN0aW9ucyhyb3dJbmRleDogbnVtYmVyLCBsb2NhdGlvbjogXCJzdGFydFwiIHwgXCJlbmRcIikge1xyXG4gICAgdmFyIGFjdGlvbnMgPSB0aGlzLnJvd3NBY3Rpb25zW3Jvd0luZGV4XTtcclxuICAgIGlmICghQXJyYXkuaXNBcnJheShhY3Rpb25zKSkgcmV0dXJuIFtdO1xyXG4gICAgcmV0dXJuIGFjdGlvbnMuZmlsdGVyKChhY3Rpb24pID0+IHtcclxuICAgICAgaWYgKCFhY3Rpb24ubG9jYXRpb24pIHtcclxuICAgICAgICBhY3Rpb24ubG9jYXRpb24gPSBcInN0YXJ0XCI7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGFjdGlvbi5sb2NhdGlvbiA9PT0gbG9jYXRpb247XHJcbiAgICB9KTtcclxuICB9XHJcbiAgcHJpdmF0ZSBidWlsZFJvd0FjdGlvbnMocm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSk6IEFycmF5PElBY3Rpb24+IHtcclxuICAgIHZhciBhY3Rpb25zOiBBcnJheTxJQWN0aW9uPiA9IFtdO1xyXG4gICAgdGhpcy5zZXREZWZhdWx0Um93QWN0aW9ucyhyb3csIGFjdGlvbnMpO1xyXG4gICAgaWYgKCEhdGhpcy5tYXRyaXguc3VydmV5KSB7XHJcbiAgICAgIGFjdGlvbnMgPSB0aGlzLm1hdHJpeC5zdXJ2ZXkuZ2V0VXBkYXRlZE1hdHJpeFJvd0FjdGlvbnMoXHJcbiAgICAgICAgdGhpcy5tYXRyaXgsXHJcbiAgICAgICAgcm93LFxyXG4gICAgICAgIGFjdGlvbnNcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHJldHVybiBhY3Rpb25zO1xyXG4gIH1cclxuICBwcm90ZWN0ZWQgc2V0RGVmYXVsdFJvd0FjdGlvbnMoXHJcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxyXG4gICAgYWN0aW9uczogQXJyYXk8SUFjdGlvbj5cclxuICApIHtcclxuICAgIGlmICh0aGlzLmhhc1JlbW92ZVJvd3MgJiYgdGhpcy5jYW5SZW1vdmVSb3cocm93KSkge1xyXG4gICAgICBhY3Rpb25zLnB1c2goXHJcbiAgICAgICAgbmV3IEFjdGlvbih7XHJcbiAgICAgICAgICBpZDogXCJyZW1vdmUtcm93XCIsXHJcbiAgICAgICAgICBsb2NhdGlvbjogXCJlbmRcIixcclxuICAgICAgICAgIGVuYWJsZWQ6ICF0aGlzLm1hdHJpeC5pc0lucHV0UmVhZE9ubHksXHJcbiAgICAgICAgICBjb21wb25lbnQ6IFwic3YtbWF0cml4LXJlbW92ZS1idXR0b25cIixcclxuICAgICAgICAgIGRhdGE6IHsgcm93OiByb3csIHF1ZXN0aW9uOiB0aGlzLm1hdHJpeCB9LFxyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJvdy5oYXNQYW5lbCkge1xyXG4gICAgICBhY3Rpb25zLnB1c2goXHJcbiAgICAgICAgbmV3IEFjdGlvbih7XHJcbiAgICAgICAgICBpZDogXCJzaG93LWRldGFpbFwiLFxyXG4gICAgICAgICAgdGl0bGU6IHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJlZGl0VGV4dFwiKSxcclxuICAgICAgICAgIHNob3dUaXRsZTogZmFsc2UsXHJcbiAgICAgICAgICBsb2NhdGlvbjogXCJzdGFydFwiLFxyXG4gICAgICAgICAgY29tcG9uZW50OiBcInN2LW1hdHJpeC1kZXRhaWwtYnV0dG9uXCIsXHJcbiAgICAgICAgICBkYXRhOiB7IHJvdzogcm93LCBxdWVzdGlvbjogdGhpcy5tYXRyaXggfSxcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuICBwcml2YXRlIGNyZWF0ZUhvcml6b250YWxSb3coXHJcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxyXG4gICAgdXNlQXNIZWFkZXI6IGJvb2xlYW5cclxuICApOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3cge1xyXG4gICAgdmFyIHJlcyA9IG5ldyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3codGhpcy5jc3NDbGFzc2VzKTtcclxuICAgIGlmICh0aGlzLm1hdHJpeC5hbGxvd1Jvd3NEcmFnQW5kRHJvcCkge1xyXG4gICAgICB2YXIgcm93SW5kZXggPSB0aGlzLm1hdHJpeC52aXNpYmxlUm93cy5pbmRleE9mKHJvdyk7XHJcbiAgICAgIHJlcy5jZWxscy5wdXNoKHRoaXMuZ2V0Um93RHJhZ0NlbGwocm93SW5kZXgpKTtcclxuICAgIH1cclxuICAgIHRoaXMuYWRkUm93QWN0aW9uc0NlbGwocm93LCByZXMsIFwic3RhcnRcIik7XHJcbiAgICBpZiAodGhpcy5tYXRyaXguaGFzUm93VGV4dCkge1xyXG4gICAgICB2YXIgcmVuZGVyZWRDZWxsID0gdGhpcy5jcmVhdGVUZXh0Q2VsbChyb3cubG9jVGV4dCk7XHJcbiAgICAgIHJlbmRlcmVkQ2VsbC5yb3cgPSByb3c7XHJcbiAgICAgIHJlcy5jZWxscy5wdXNoKHJlbmRlcmVkQ2VsbCk7XHJcbiAgICAgIGlmICh1c2VBc0hlYWRlcikge1xyXG4gICAgICAgIHRoaXMuc2V0SGVhZGVyQ2VsbFdpZHRoKG51bGwsIHJlbmRlcmVkQ2VsbCk7XHJcbiAgICAgIH1cclxuICAgICAgcmVuZGVyZWRDZWxsLmNsYXNzTmFtZSA9IG5ldyBDc3NDbGFzc0J1aWxkZXIoKVxyXG4gICAgICAgIC5hcHBlbmQocmVuZGVyZWRDZWxsLmNsYXNzTmFtZSlcclxuICAgICAgICAuYXBwZW5kKHRoaXMuY3NzQ2xhc3Nlcy5kZXRhaWxSb3dUZXh0LCByb3cuaGFzUGFuZWwpXHJcbiAgICAgICAgLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvdy5jZWxscy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgY2VsbCA9IHJvdy5jZWxsc1tpXTtcclxuICAgICAgaWYgKCFjZWxsLmNvbHVtbi5oYXNWaXNpYmxlQ2VsbCkgY29udGludWU7XHJcbiAgICAgIGlmIChjZWxsLmNvbHVtbi5pc1Nob3dJbk11bHRpcGxlQ29sdW1ucykge1xyXG4gICAgICAgIHRoaXMuY3JlYXRlTXV0bGlwbGVFZGl0Q2VsbHMocmVzLCBjZWxsKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB2YXIgcmVuZGVyZWRDZWxsID0gdGhpcy5jcmVhdGVFZGl0Q2VsbChjZWxsKTtcclxuICAgICAgICByZXMuY2VsbHMucHVzaChyZW5kZXJlZENlbGwpO1xyXG4gICAgICAgIGlmICh1c2VBc0hlYWRlcikge1xyXG4gICAgICAgICAgdGhpcy5zZXRIZWFkZXJDZWxsV2lkdGgoY2VsbC5jb2x1bW4sIHJlbmRlcmVkQ2VsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmFkZFJvd0FjdGlvbnNDZWxsKHJvdywgcmVzLCBcImVuZFwiKTtcclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG4gIHByaXZhdGUgYWRkUm93QWN0aW9uc0NlbGwoXHJcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxyXG4gICAgcmVuZGVyZWRSb3c6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdyxcclxuICAgIGxvY2F0aW9uOiBcInN0YXJ0XCIgfCBcImVuZFwiXHJcbiAgKSB7XHJcbiAgICB2YXIgcm93SW5kZXggPSB0aGlzLm1hdHJpeC52aXNpYmxlUm93cy5pbmRleE9mKHJvdyk7XHJcbiAgICBpZiAodGhpcy5oYXNBY3Rpb25DZWxsSW5Sb3dzKGxvY2F0aW9uKSkge1xyXG4gICAgICBjb25zdCBhY3Rpb25zID0gdGhpcy5nZXRSb3dBY3Rpb25zQ2VsbChyb3dJbmRleCwgbG9jYXRpb24pO1xyXG4gICAgICBpZiAoISFhY3Rpb25zKSB7XHJcbiAgICAgICAgcmVuZGVyZWRSb3cuY2VsbHMucHVzaChhY3Rpb25zKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB2YXIgY2VsbCA9IG5ldyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsKCk7XHJcbiAgICAgICAgY2VsbC5pc0VtcHR5ID0gdHJ1ZTtcclxuICAgICAgICByZW5kZXJlZFJvdy5jZWxscy5wdXNoKGNlbGwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIHByaXZhdGUgY3JlYXRlRGV0YWlsUGFuZWxSb3coXHJcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxyXG4gICAgcmVuZGVyZWRSb3c6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvd1xyXG4gICk6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdyB7XHJcbiAgICB2YXIgcmVzID0gbmV3IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdyh0aGlzLmNzc0NsYXNzZXMsIHRydWUpO1xyXG4gICAgcmVzLnJvdyA9IHJvdztcclxuICAgIHZhciBidXR0b25DZWxsID0gbmV3IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwoKTtcclxuICAgIGlmICh0aGlzLm1hdHJpeC5oYXNSb3dUZXh0KSB7XHJcbiAgICAgIGJ1dHRvbkNlbGwuY29sU3BhbnMgPSAyO1xyXG4gICAgfVxyXG4gICAgYnV0dG9uQ2VsbC5pc0VtcHR5ID0gdHJ1ZTtcclxuICAgIHJlcy5jZWxscy5wdXNoKGJ1dHRvbkNlbGwpO1xyXG4gICAgdmFyIGFjdGlvbnNDZWxsID0gbnVsbDtcclxuICAgIGlmICh0aGlzLmhhc0FjdGlvbkNlbGxJblJvd3MoXCJlbmRcIikpIHtcclxuICAgICAgYWN0aW9uc0NlbGwgPSBuZXcgUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCgpO1xyXG4gICAgICBhY3Rpb25zQ2VsbC5pc0VtcHR5ID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHZhciBjZWxsID0gbmV3IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwoKTtcclxuICAgIGNlbGwucGFuZWwgPSByb3cuZGV0YWlsUGFuZWw7XHJcbiAgICBjZWxsLmNvbFNwYW5zID1cclxuICAgICAgcmVuZGVyZWRSb3cuY2VsbHMubGVuZ3RoIC1cclxuICAgICAgYnV0dG9uQ2VsbC5jb2xTcGFucyAtXHJcbiAgICAgICghIWFjdGlvbnNDZWxsID8gYWN0aW9uc0NlbGwuY29sU3BhbnMgOiAwKTtcclxuICAgIGNlbGwuY2xhc3NOYW1lID0gdGhpcy5jc3NDbGFzc2VzLmRldGFpbFBhbmVsQ2VsbDtcclxuICAgIHJlcy5jZWxscy5wdXNoKGNlbGwpO1xyXG4gICAgaWYgKCEhYWN0aW9uc0NlbGwpIHtcclxuICAgICAgcmVzLmNlbGxzLnB1c2goYWN0aW9uc0NlbGwpO1xyXG4gICAgfVxyXG4gICAgaWYgKFxyXG4gICAgICB0eXBlb2YgdGhpcy5tYXRyaXgub25DcmVhdGVEZXRhaWxQYW5lbFJlbmRlcmVkUm93Q2FsbGJhY2sgPT09IFwiZnVuY3Rpb25cIlxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMubWF0cml4Lm9uQ3JlYXRlRGV0YWlsUGFuZWxSZW5kZXJlZFJvd0NhbGxiYWNrKHJlcyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBidWlsZFZlcnRpY2FsUm93cygpOiBBcnJheTxRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3c+IHtcclxuICAgIHZhciBjb2x1bW5zID0gdGhpcy5tYXRyaXguY29sdW1ucztcclxuICAgIHZhciByZW5kZXJlZFJvd3MgPSBbXTtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICB2YXIgY29sID0gY29sdW1uc1tpXTtcclxuICAgICAgaWYgKGNvbC5pc1Zpc2libGUgJiYgY29sLmhhc1Zpc2libGVDZWxsKSB7XHJcbiAgICAgICAgaWYgKGNvbC5pc1Nob3dJbk11bHRpcGxlQ29sdW1ucykge1xyXG4gICAgICAgICAgdGhpcy5jcmVhdGVNdXRsaXBsZVZlcnRpY2FsUm93cyhyZW5kZXJlZFJvd3MsIGNvbCwgaSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlbmRlcmVkUm93cy5wdXNoKHRoaXMuY3JlYXRlVmVydGljYWxSb3coY29sLCBpKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5oYXNBY3Rpb25DZWxsSW5Sb3dzKFwiZW5kXCIpKSB7XHJcbiAgICAgIHJlbmRlcmVkUm93cy5wdXNoKHRoaXMuY3JlYXRlRW5kVmVydGljYWxBY3Rpb25Sb3coKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVuZGVyZWRSb3dzO1xyXG4gIH1cclxuICBwcml2YXRlIGNyZWF0ZU11dGxpcGxlVmVydGljYWxSb3dzKFxyXG4gICAgcmVuZGVyZWRSb3dzOiBBcnJheTxRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3c+LFxyXG4gICAgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbixcclxuICAgIGluZGV4OiBudW1iZXJcclxuICApIHtcclxuICAgIHZhciBjaG9pY2VzID0gdGhpcy5nZXRNdWx0aXBsZUNvbHVtbkNob2ljZXMoY29sdW1uKTtcclxuICAgIGlmICghY2hvaWNlcykgcmV0dXJuO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaG9pY2VzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHJlbmRlcmVkUm93cy5wdXNoKHRoaXMuY3JlYXRlVmVydGljYWxSb3coY29sdW1uLCBpbmRleCwgY2hvaWNlc1tpXSwgaSkpO1xyXG4gICAgfVxyXG4gIH1cclxuICBwcml2YXRlIGNyZWF0ZVZlcnRpY2FsUm93KFxyXG4gICAgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbixcclxuICAgIGluZGV4OiBudW1iZXIsXHJcbiAgICBjaG9pY2U6IEl0ZW1WYWx1ZSA9IG51bGwsXHJcbiAgICBjaG9pY2VJbmRleDogbnVtYmVyID0gLTFcclxuICApOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3cge1xyXG4gICAgdmFyIHJlcyA9IG5ldyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3codGhpcy5jc3NDbGFzc2VzKTtcclxuICAgIGlmICh0aGlzLm1hdHJpeC5zaG93SGVhZGVyKSB7XHJcbiAgICAgIHZhciBsVGl0bGUgPSAhIWNob2ljZSA/IGNob2ljZS5sb2NUZXh0IDogY29sdW1uLmxvY1RpdGxlO1xyXG4gICAgICB2YXIgaENlbGwgPSB0aGlzLmNyZWF0ZVRleHRDZWxsKGxUaXRsZSk7XHJcbiAgICAgIGhDZWxsLmNvbHVtbiA9IGNvbHVtbjtcclxuICAgICAgaWYgKCFjaG9pY2UpIHtcclxuICAgICAgICB0aGlzLnNldFJlcXVyaWVkVG9IZWFkZXJDZWxsKGNvbHVtbiwgaENlbGwpO1xyXG4gICAgICB9XHJcbiAgICAgIHJlcy5jZWxscy5wdXNoKGhDZWxsKTtcclxuICAgIH1cclxuICAgIHZhciByb3dzID0gdGhpcy5tYXRyaXgudmlzaWJsZVJvd3M7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdmFyIHJDaG9pY2UgPSBjaG9pY2U7XHJcbiAgICAgIHZhciByQ2hvaWNlSW5kZXggPSBjaG9pY2VJbmRleCA+PSAwID8gY2hvaWNlSW5kZXggOiBpO1xyXG4gICAgICB2YXIgY2VsbCA9IHJvd3NbaV0uY2VsbHNbaW5kZXhdO1xyXG4gICAgICB2YXIgdmlzQ2hvaWNlcyA9ICEhY2hvaWNlID8gY2VsbC5xdWVzdGlvbi52aXNpYmxlQ2hvaWNlcyA6IHVuZGVmaW5lZDtcclxuICAgICAgaWYgKCEhdmlzQ2hvaWNlcyAmJiByQ2hvaWNlSW5kZXggPCB2aXNDaG9pY2VzLmxlbmd0aCkge1xyXG4gICAgICAgIHJDaG9pY2UgPSB2aXNDaG9pY2VzW3JDaG9pY2VJbmRleF07XHJcbiAgICAgIH1cclxuICAgICAgdmFyIHJDZWxsID0gdGhpcy5jcmVhdGVFZGl0Q2VsbChjZWxsLCByQ2hvaWNlKTtcclxuICAgICAgckNlbGwuaXRlbSA9IHJDaG9pY2U7XHJcbiAgICAgIHJDZWxsLmNob2ljZUluZGV4ID0gckNob2ljZUluZGV4O1xyXG4gICAgICByZXMuY2VsbHMucHVzaChyQ2VsbCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5tYXRyaXguaGFzVG90YWwpIHtcclxuICAgICAgcmVzLmNlbGxzLnB1c2goXHJcbiAgICAgICAgdGhpcy5jcmVhdGVFZGl0Q2VsbCh0aGlzLm1hdHJpeC52aXNpYmxlVG90YWxSb3cuY2VsbHNbaW5kZXhdKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG4gIHByaXZhdGUgY3JlYXRlRW5kVmVydGljYWxBY3Rpb25Sb3coKTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93IHtcclxuICAgIHZhciByZXMgPSBuZXcgUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93KHRoaXMuY3NzQ2xhc3Nlcyk7XHJcbiAgICBpZiAodGhpcy5tYXRyaXguc2hvd0hlYWRlcikge1xyXG4gICAgICByZXMuY2VsbHMucHVzaCh0aGlzLmNyZWF0ZUVtcHR5Q2VsbCgpKTtcclxuICAgIH1cclxuICAgIHZhciByb3dzID0gdGhpcy5tYXRyaXgudmlzaWJsZVJvd3M7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgcmVzLmNlbGxzLnB1c2godGhpcy5nZXRSb3dBY3Rpb25zQ2VsbChpLCBcImVuZFwiKSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5tYXRyaXguaGFzVG90YWwpIHtcclxuICAgICAgcmVzLmNlbGxzLnB1c2godGhpcy5jcmVhdGVFbXB0eUNlbGwoKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuICBwcml2YXRlIGNyZWF0ZU11dGxpcGxlRWRpdENlbGxzKFxyXG4gICAgclJvdzogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93LFxyXG4gICAgY2VsbDogTWF0cml4RHJvcGRvd25DZWxsLFxyXG4gICAgaXNGb290ZXI6IGJvb2xlYW4gPSBmYWxzZVxyXG4gICkge1xyXG4gICAgdmFyIGNob2ljZXMgPSBpc0Zvb3RlclxyXG4gICAgICA/IHRoaXMuZ2V0TXVsdGlwbGVDb2x1bW5DaG9pY2VzKGNlbGwuY29sdW1uKVxyXG4gICAgICA6IGNlbGwucXVlc3Rpb24udmlzaWJsZUNob2ljZXM7XHJcbiAgICBpZiAoIWNob2ljZXMpIHJldHVybjtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hvaWNlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICB2YXIgckNlbGwgPSB0aGlzLmNyZWF0ZUVkaXRDZWxsKGNlbGwsICFpc0Zvb3RlciA/IGNob2ljZXNbaV0gOiB1bmRlZmluZWQpO1xyXG4gICAgICBpZiAoIWlzRm9vdGVyKSB7XHJcbiAgICAgICAgLy9yQ2VsbC5pdGVtID0gY2hvaWNlc1tpXTtcclxuICAgICAgICByQ2VsbC5jaG9pY2VJbmRleCA9IGk7XHJcbiAgICAgIH1cclxuICAgICAgclJvdy5jZWxscy5wdXNoKHJDZWxsKTtcclxuICAgIH1cclxuICB9XHJcbiAgcHJpdmF0ZSBjcmVhdGVFZGl0Q2VsbChcclxuICAgIGNlbGw6IE1hdHJpeERyb3Bkb3duQ2VsbCxcclxuICAgIGNob2ljZUl0ZW06IGFueSA9IHVuZGVmaW5lZFxyXG4gICk6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwge1xyXG4gICAgdmFyIHJlcyA9IG5ldyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsKCk7XHJcbiAgICByZXMuY2VsbCA9IGNlbGw7XHJcbiAgICByZXMucm93ID0gY2VsbC5yb3c7XHJcbiAgICByZXMucXVlc3Rpb24gPSBjZWxsLnF1ZXN0aW9uO1xyXG4gICAgcmVzLm1hdHJpeCA9IHRoaXMubWF0cml4O1xyXG4gICAgcmVzLml0ZW0gPSBjaG9pY2VJdGVtO1xyXG5cclxuICAgIHJlcy5jbGFzc05hbWUgPSByZXMuY2FsY3VsYXRlRmluYWxDbGFzc05hbWUodGhpcy5jc3NDbGFzc2VzKTtcclxuICAgIC8vcmVzLmNzcyA9IHJlcy5jYWxjQ3NzKHRoaXMuY3NzQ2xhc3Nlcy5jZWxsKTtcclxuXHJcbiAgICAvLyB2YXIgcXVlc3Rpb25Dc3MgPSBjZWxsLnF1ZXN0aW9uLmNzc0NsYXNzZXM7XHJcbiAgICAvLyB2YXIgY2xhc3NOYW1lID0gXCJcIjtcclxuICAgIC8vIGlmICghIXF1ZXN0aW9uQ3NzKSB7XHJcbiAgICAvLyAgIGNsYXNzTmFtZSA9IFwiXCI7XHJcbiAgICAvLyAgIGlmICghIXF1ZXN0aW9uQ3NzLml0ZW1WYWx1ZSkge1xyXG4gICAgLy8gICAgIGNsYXNzTmFtZSArPSBcIiBcIiArIHF1ZXN0aW9uQ3NzLml0ZW1WYWx1ZTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gICBpZiAoISFxdWVzdGlvbkNzcy5hc0NlbGwpIHtcclxuICAgIC8vICAgICBpZiAoISFjbGFzc05hbWUpIGNsYXNzTmFtZSArPSBcIlwiO1xyXG4gICAgLy8gICAgIGNsYXNzTmFtZSArPSBxdWVzdGlvbkNzcy5hc0NlbGw7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH1cclxuICAgIC8vIGlmICghY2xhc3NOYW1lICYmICEhdGhpcy5jc3NDbGFzc2VzLmNlbGwpIHtcclxuICAgIC8vICAgY2xhc3NOYW1lID0gdGhpcy5jc3NDbGFzc2VzLmNlbGw7XHJcbiAgICAvLyB9XHJcbiAgICAvL3Jlcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuICBwcml2YXRlIGNyZWF0ZU11dGxpcGxlQ29sdW1uc0Zvb3RlcihcclxuICAgIHJSb3c6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdyxcclxuICAgIGNlbGw6IE1hdHJpeERyb3Bkb3duQ2VsbFxyXG4gICkge1xyXG4gICAgdGhpcy5jcmVhdGVNdXRsaXBsZUVkaXRDZWxscyhyUm93LCBjZWxsLCB0cnVlKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBjcmVhdGVNdXRsaXBsZUNvbHVtbnNIZWFkZXIoY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbikge1xyXG4gICAgdmFyIGNob2ljZXMgPSB0aGlzLmdldE11bHRpcGxlQ29sdW1uQ2hvaWNlcyhjb2x1bW4pO1xyXG4gICAgaWYgKCFjaG9pY2VzKSByZXR1cm47XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNob2ljZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdmFyIGNlbGwgPSB0aGlzLmNyZWF0ZVRleHRDZWxsKGNob2ljZXNbaV0ubG9jVGV4dCk7XHJcbiAgICAgIHRoaXMuc2V0SGVhZGVyQ2VsbChjb2x1bW4sIGNlbGwpO1xyXG4gICAgICB0aGlzLmhlYWRlclJvdy5jZWxscy5wdXNoKGNlbGwpO1xyXG4gICAgfVxyXG4gIH1cclxuICBwcml2YXRlIGdldE11bHRpcGxlQ29sdW1uQ2hvaWNlcyhjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uKTogYW55IHtcclxuICAgIHZhciBjaG9pY2VzID0gY29sdW1uLnRlbXBsYXRlUXVlc3Rpb24uY2hvaWNlcztcclxuICAgIGlmICghIWNob2ljZXMgJiYgQXJyYXkuaXNBcnJheShjaG9pY2VzKSAmJiBjaG9pY2VzLmxlbmd0aCA9PSAwKVxyXG4gICAgICByZXR1cm4gdGhpcy5tYXRyaXguY2hvaWNlcztcclxuICAgIGNob2ljZXMgPSBjb2x1bW4udGVtcGxhdGVRdWVzdGlvbi52aXNpYmxlQ2hvaWNlcztcclxuICAgIGlmICghY2hvaWNlcyB8fCAhQXJyYXkuaXNBcnJheShjaG9pY2VzKSkgcmV0dXJuIG51bGw7XHJcbiAgICByZXR1cm4gY2hvaWNlcztcclxuICB9XHJcbiAgcHJpdmF0ZSBjcmVhdGVIZWFkZXJDZWxsKFxyXG4gICAgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtblxyXG4gICk6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwge1xyXG4gICAgdmFyIGNlbGwgPSB0aGlzLmNyZWF0ZVRleHRDZWxsKCEhY29sdW1uID8gY29sdW1uLmxvY1RpdGxlIDogbnVsbCk7XHJcbiAgICBjZWxsLmNvbHVtbiA9IGNvbHVtbjtcclxuICAgIHRoaXMuc2V0SGVhZGVyQ2VsbChjb2x1bW4sIGNlbGwpO1xyXG4gICAgaWYgKHRoaXMuY3NzQ2xhc3Nlcy5oZWFkZXJDZWxsKSB7XHJcbiAgICAgIGNlbGwuY2xhc3NOYW1lID0gdGhpcy5jc3NDbGFzc2VzLmhlYWRlckNlbGw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2VsbDtcclxuICB9XHJcbiAgcHJpdmF0ZSBzZXRIZWFkZXJDZWxsKFxyXG4gICAgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbixcclxuICAgIGNlbGw6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGxcclxuICApIHtcclxuICAgIHRoaXMuc2V0SGVhZGVyQ2VsbFdpZHRoKGNvbHVtbiwgY2VsbCk7XHJcbiAgICB0aGlzLnNldFJlcXVyaWVkVG9IZWFkZXJDZWxsKGNvbHVtbiwgY2VsbCk7XHJcbiAgfVxyXG4gIHByaXZhdGUgc2V0SGVhZGVyQ2VsbFdpZHRoKFxyXG4gICAgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbixcclxuICAgIGNlbGw6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGxcclxuICApIHtcclxuICAgIGNlbGwubWluV2lkdGggPSBjb2x1bW4gIT0gbnVsbCA/IHRoaXMubWF0cml4LmdldENvbHVtbldpZHRoKGNvbHVtbikgOiBcIlwiO1xyXG4gICAgY2VsbC53aWR0aCA9IGNvbHVtbiAhPSBudWxsID8gY29sdW1uLndpZHRoIDogdGhpcy5tYXRyaXguZ2V0Um93VGl0bGVXaWR0aCgpO1xyXG4gIH1cclxuICBwcml2YXRlIHNldFJlcXVyaWVkVG9IZWFkZXJDZWxsKFxyXG4gICAgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbixcclxuICAgIGNlbGw6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGxcclxuICApIHtcclxuICAgIGlmICghIWNvbHVtbiAmJiBjb2x1bW4uaXNSZXF1aXJlZCAmJiB0aGlzLm1hdHJpeC5zdXJ2ZXkpIHtcclxuICAgICAgY2VsbC5yZXF1aXJlZFRleHQgPSB0aGlzLm1hdHJpeC5zdXJ2ZXkucmVxdWlyZWRUZXh0O1xyXG4gICAgfVxyXG4gIH1cclxuICBwcml2YXRlIGNyZWF0ZVJlbW92ZVJvd0NlbGwoXHJcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlXHJcbiAgKTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCB7XHJcbiAgICB2YXIgcmVzID0gbmV3IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwoKTtcclxuICAgIHJlcy5yb3cgPSByb3c7XHJcbiAgICByZXMuaXNSZW1vdmVSb3cgPSB0aGlzLmNhblJlbW92ZVJvdyhyb3cpO1xyXG4gICAgaWYgKCEhdGhpcy5jc3NDbGFzc2VzLmNlbGwpIHtcclxuICAgICAgcmVzLmNsYXNzTmFtZSA9IHRoaXMuY3NzQ2xhc3Nlcy5jZWxsO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcbiAgcHJpdmF0ZSBjcmVhdGVUZXh0Q2VsbChcclxuICAgIGxvY1RpdGxlOiBMb2NhbGl6YWJsZVN0cmluZ1xyXG4gICk6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwge1xyXG4gICAgdmFyIGNlbGwgPSBuZXcgUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCgpO1xyXG4gICAgY2VsbC5sb2NUaXRsZSA9IGxvY1RpdGxlO1xyXG4gICAgaWYgKCEhdGhpcy5jc3NDbGFzc2VzLmNlbGwpIHtcclxuICAgICAgY2VsbC5jbGFzc05hbWUgPSB0aGlzLmNzc0NsYXNzZXMuY2VsbDtcclxuICAgIH1cclxuICAgIHJldHVybiBjZWxsO1xyXG4gIH1cclxuICBwcml2YXRlIGNyZWF0ZUVtcHR5Q2VsbCgpOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsIHtcclxuICAgIGNvbnN0IHJlcyA9IHRoaXMuY3JlYXRlVGV4dENlbGwobnVsbCk7XHJcbiAgICByZXMuaXNFbXB0eSA9IHRydWU7XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxufSIsImltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IElDb25kaXRpb25PYmplY3QsIFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7XG4gIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UsXG4gIE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICBJTWF0cml4RHJvcGRvd25EYXRhXG59IGZyb20gXCIuL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duYmFzZVwiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgU3VydmV5RXJyb3IgfSBmcm9tIFwiLi9zdXJ2ZXktZXJyb3JcIjtcbmltcG9ydCB7IE1pblJvd0NvdW50RXJyb3IgfSBmcm9tIFwiLi9lcnJvclwiO1xuaW1wb3J0IHsgSUFjdGlvbiB9IGZyb20gXCIuL2FjdGlvbnMvYWN0aW9uXCI7XG5pbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzXCI7XG5pbXBvcnQgeyBjb25maXJtQWN0aW9uIH0gZnJvbSBcIi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IERyYWdEcm9wTWF0cml4Um93cyB9IGZyb20gXCIuL2RyYWdkcm9wL21hdHJpeC1yb3dzXCI7XG5pbXBvcnQgeyBJU3VydmV5SW1wbCB9IGZyb20gXCIuL2Jhc2UtaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgQ3NzQ2xhc3NCdWlsZGVyIH0gZnJvbSBcIi4vdXRpbHMvY3NzQ2xhc3NCdWlsZGVyXCI7XG5pbXBvcnQgeyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRUYWJsZSB9IGZyb20gXCIuL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3ducmVuZGVyZWRcIjtcbmltcG9ydCB7IE1hdHJpeERyb3Bkb3duQ29sdW1uIH0gZnJvbSBcIi4vcXVlc3Rpb25fbWF0cml4ZHJvcGRvd25jb2x1bW5cIjtcblxuZXhwb3J0IGNsYXNzIE1hdHJpeER5bmFtaWNSb3dNb2RlbCBleHRlbmRzIE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlIHtcbiAgY29uc3RydWN0b3IocHVibGljIGluZGV4OiBudW1iZXIsIGRhdGE6IElNYXRyaXhEcm9wZG93bkRhdGEsIHZhbHVlOiBhbnkpIHtcbiAgICBzdXBlcihkYXRhLCB2YWx1ZSk7XG4gICAgdGhpcy5idWlsZENlbGxzKHZhbHVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHJvd05hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIG1hdHJpeCBkeW1hbmljIHF1ZXN0aW9uLiBZb3UgbWF5IHVzZSBhIGRyb3Bkb3duLCBjaGVja2JveCwgcmFkaW9ncm91cCwgdGV4dCBhbmQgY29tbWVudCBxdWVzdGlvbnMgYXMgYSBjZWxsIGVkaXRvcnMuXG4gKiBBbiBlbmQtdXNlciBtYXkgZHluYW1pY2FsbHkgYWRkL3JlbW92ZSByb3dzLCB1bmxpa2UgaW4gbWF0cml4IGRyb3Bkb3duIHF1ZXN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWwgZXh0ZW5kcyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlXG4gIGltcGxlbWVudHMgSU1hdHJpeERyb3Bkb3duRGF0YSB7XG4gIHB1YmxpYyBvbkdldFZhbHVlRm9yTmV3Um93Q2FsbEJhY2s6IChcbiAgICBzZW5kZXI6IFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsXG4gICkgPT4gYW55O1xuICBwcml2YXRlIHJvd0NvdW50ZXIgPSAwO1xuICBwcml2YXRlIGluaXRpYWxSb3dDb3VudDogbnVtYmVyID0gMjtcbiAgcHJpdmF0ZSBzZXRSb3dDb3VudFZhbHVlRnJvbURhdGE6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB2b2lkICg8TG9jYWxpemFibGVTdHJpbmc+KFxuICAgICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImNvbmZpcm1EZWxldGVUZXh0XCIsIHRoaXMpXG4gICAgKSk7XG4gICAgdmFyIGxvY0FkZFJvd1RleHQgPSB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwiYWRkUm93VGV4dFwiLCB0aGlzKTtcbiAgICBsb2NBZGRSb3dUZXh0Lm9uR2V0VGV4dENhbGxiYWNrID0gKHRleHQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgICByZXR1cm4gISF0ZXh0ID8gdGV4dCA6IHRoaXMuZGVmYXVsdEFkZFJvd1RleHQ7XG4gICAgfTtcbiAgICB2YXIgbG9jUmVtb3ZlUm93VGV4dCA9IHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJyZW1vdmVSb3dUZXh0XCIsIHRoaXMpO1xuICAgIGxvY1JlbW92ZVJvd1RleHQub25HZXRUZXh0Q2FsbGJhY2sgPSAodGV4dDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICAgIHJldHVybiAhIXRleHQgPyB0ZXh0IDogc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcInJlbW92ZVJvd1wiKTtcbiAgICB9O1xuICAgIHZhciBsb2NFbXB0eVJvd3NUZXh0ID0gPExvY2FsaXphYmxlU3RyaW5nPihcbiAgICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJlbXB0eVJvd3NUZXh0XCIsIHRoaXMpXG4gICAgKTtcbiAgICBsb2NFbXB0eVJvd3NUZXh0Lm9uR2V0VGV4dENhbGxiYWNrID0gKHRleHQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgICByZXR1cm4gISF0ZXh0ID8gdGV4dCA6IHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJlbXB0eVJvd3NUZXh0XCIpO1xuICAgIH07XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0aWVzVmFsdWVDaGFuZ2VkKFxuICAgICAgW1wiaGlkZUNvbHVtbnNJZkVtcHR5XCIsIFwiYWxsb3dBZGRSb3dzXCJdLFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZVNob3dUYWJsZUFuZEFkZFJvdygpO1xuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcImFsbG93Um93c0RyYWdBbmREcm9wXCIsICgpID0+IHtcbiAgICAgIHRoaXMuY2xlYXJSb3dzQW5kUmVzZXRSZW5kZXJlZFRhYmxlKCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZHJhZ0Ryb3BNYXRyaXhSb3dzOiBEcmFnRHJvcE1hdHJpeFJvd3M7XG4gIHB1YmxpYyBzZXRTdXJ2ZXlJbXBsKHZhbHVlOiBJU3VydmV5SW1wbCkge1xuICAgIHN1cGVyLnNldFN1cnZleUltcGwodmFsdWUpO1xuICAgIHRoaXMuZHJhZ0Ryb3BNYXRyaXhSb3dzID0gbmV3IERyYWdEcm9wTWF0cml4Um93cyh0aGlzLnN1cnZleSk7XG4gIH1cblxuICBwdWJsaWMgc3RhcnREcmFnTWF0cml4Um93KFxuICAgIGV2ZW50OiBQb2ludGVyRXZlbnQsXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZVxuICApIHtcbiAgICB0aGlzLmRyYWdEcm9wTWF0cml4Um93cy5zdGFydERyYWcoZXZlbnQsIHJvdywgdGhpcyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIm1hdHJpeGR5bmFtaWNcIjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNSb3dzRHluYW1pYygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIHRydWUsIHRvIHNob3cgYSBjb25maXJtYXRpb24gZGlhbG9nIG9uIHJlbW92aW5nIGEgcm93XG4gICAqIEBzZWUgQ29uZmlybURlbGV0ZVRleHRcbiAgICovXG4gIHB1YmxpYyBnZXQgY29uZmlybURlbGV0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY29uZmlybURlbGV0ZVwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBjb25maXJtRGVsZXRlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvbmZpcm1EZWxldGVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIGEgY29sdW1uIG5hbWUgYW5kIHRoZSBsaWJyYXJ5IHNob3dzIGR1cGxpY2F0aW9uIGVycm9yLCBpZiB0aGVyZSBhcmUgc2FtZSB2YWx1ZXMgaW4gZGlmZmVyZW50IHJvd3MgaW4gdGhlIGNvbHVtbi5cbiAgICogQHNlZSBrZXlEdXBsaWNhdGlvbkVycm9yXG4gICAqL1xuICBwdWJsaWMgZ2V0IGtleU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwia2V5TmFtZVwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGtleU5hbWUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJrZXlOYW1lXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIElmIGl0IGlzIG5vdCBlbXB0eSwgdGhlbiB0aGlzIHZhbHVlIGlzIHNldCB0byBldmVyeSBuZXcgcm93LCBpbmNsdWRpbmcgcm93cyBjcmVhdGVkIGluaXRpYWxseSwgdW5sZXNzIHRoZSBkZWZhdWx0VmFsdWUgaXMgbm90IGVtcHR5XG4gICAqIEBzZWUgZGVmYXVsdFZhbHVlXG4gICAqIEBzZWUgZGVmYXVsdFZhbHVlRnJvbUxhc3RSb3dcbiAgICovXG4gIHB1YmxpYyBnZXQgZGVmYXVsdFJvd1ZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImRlZmF1bHRSb3dWYWx1ZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRlZmF1bHRSb3dWYWx1ZSh2YWw6IGFueSkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImRlZmF1bHRSb3dWYWx1ZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gdHJ1ZSB0byBjb3B5IHRoZSB2YWx1ZSBpbnRvIG5ldyBhZGRlZCByb3cgZnJvbSB0aGUgbGFzdCByb3cuIElmIGRlZmF1bHRSb3dWYWx1ZSBpcyBzZXQgYW5kIHRoaXMgcHJvcGVydHkgZXF1YWxzIHRvIHRydWUsXG4gICAqIHRoZW4gdGhlIHZhbHVlIGZvciBuZXcgYWRkZWQgcm93IGlzIG1lcmdpbmcuXG4gICAqIEBzZWUgZGVmYXVsdFZhbHVlXG4gICAqIEBzZWUgZGVmYXVsdFJvd1ZhbHVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGRlZmF1bHRWYWx1ZUZyb21MYXN0Um93KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJkZWZhdWx0VmFsdWVGcm9tTGFzdFJvd1wiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBkZWZhdWx0VmFsdWVGcm9tTGFzdFJvdyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJkZWZhdWx0VmFsdWVGcm9tTGFzdFJvd1wiLCB2YWwpO1xuICB9XG4gIHByb3RlY3RlZCBpc0RlZmF1bHRWYWx1ZUVtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBzdXBlci5pc0RlZmF1bHRWYWx1ZUVtcHR5KCkgJiYgdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy5kZWZhdWx0Um93VmFsdWUpXG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgdmFsdWVGcm9tRGF0YSh2YWw6IGFueSk6IGFueSB7XG4gICAgaWYgKHRoaXMubWluUm93Q291bnQgPCAxKSByZXR1cm4gc3VwZXIudmFsdWVGcm9tRGF0YSh2YWwpO1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWwpKSB2YWwgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gdmFsLmxlbmd0aDsgaSA8IHRoaXMubWluUm93Q291bnQ7IGkrKykgdmFsLnB1c2goe30pO1xuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgcHJvdGVjdGVkIHNldERlZmF1bHRWYWx1ZSgpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLmRlZmF1bHRSb3dWYWx1ZSkgfHxcbiAgICAgICF0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLmRlZmF1bHRWYWx1ZSlcbiAgICApIHtcbiAgICAgIHN1cGVyLnNldERlZmF1bHRWYWx1ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNFbXB0eSgpIHx8IHRoaXMucm93Q291bnQgPT0gMCkgcmV0dXJuO1xuICAgIHZhciBuZXdWYWx1ZSA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yb3dDb3VudDsgaSsrKSB7XG4gICAgICBuZXdWYWx1ZS5wdXNoKHRoaXMuZGVmYXVsdFJvd1ZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy52YWx1ZSA9IG5ld1ZhbHVlO1xuICB9XG4gIHB1YmxpYyBtb3ZlUm93QnlJbmRleCA9IChmcm9tSW5kZXg6IG51bWJlciwgdG9JbmRleDogbnVtYmVyKTp2b2lkID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuY3JlYXRlTmV3VmFsdWUoKTtcblxuICAgIGlmICghdmFsdWUpIHJldHVybjtcblxuICAgIGNvbnN0IG1vdmFibGVSb3cgPSB2YWx1ZVtmcm9tSW5kZXhdO1xuXG4gICAgaWYgKCFtb3ZhYmxlUm93KSByZXR1cm47XG5cbiAgICB2YWx1ZS5zcGxpY2UoZnJvbUluZGV4LCAxKTtcbiAgICB2YWx1ZS5zcGxpY2UodG9JbmRleCwgMCwgbW92YWJsZVJvdyk7XG5cbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH07XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIG1hdHJpeC5cbiAgICogQHNlZSBtaW5Sb3dDb3VudFxuICAgKiBAc2VlIG1heFJvd0NvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IHJvd0NvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucm93Q291bnRWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IHJvd0NvdW50KHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKHZhbCA8IDAgfHwgdmFsID4gc2V0dGluZ3MubWF0cml4TWF4aW11bVJvd0NvdW50KSByZXR1cm47XG4gICAgdGhpcy5zZXRSb3dDb3VudFZhbHVlRnJvbURhdGEgPSBmYWxzZTtcbiAgICB2YXIgcHJldlZhbHVlID0gdGhpcy5yb3dDb3VudFZhbHVlO1xuICAgIHRoaXMucm93Q291bnRWYWx1ZSA9IHZhbDtcbiAgICBpZiAodGhpcy52YWx1ZSAmJiB0aGlzLnZhbHVlLmxlbmd0aCA+IHZhbCkge1xuICAgICAgdmFyIHFWYWwgPSB0aGlzLnZhbHVlO1xuICAgICAgcVZhbC5zcGxpY2UodmFsKTtcbiAgICAgIHRoaXMudmFsdWUgPSBxVmFsO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikge1xuICAgICAgdGhpcy5pbml0aWFsUm93Q291bnQgPSB2YWw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzIHx8IHByZXZWYWx1ZSA9PSAwKSB7XG4gICAgICBpZiAoIXRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MpIHtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cyA9IFtdO1xuICAgICAgfVxuICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5zcGxpY2UodmFsKTtcbiAgICAgIGZvciAodmFyIGkgPSBwcmV2VmFsdWU7IGkgPCB2YWw7IGkrKykge1xuICAgICAgICB2YXIgbmV3Um93ID0gdGhpcy5jcmVhdGVNYXRyaXhSb3codGhpcy5nZXRWYWx1ZUZvck5ld1JvdygpKTtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5wdXNoKG5ld1Jvdyk7XG4gICAgICAgIHRoaXMub25NYXRyaXhSb3dDcmVhdGVkKG5ld1Jvdyk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMub25Sb3dzQ2hhbmdlZCgpO1xuICB9XG4gIHByaXZhdGUgZ2V0VmFsdWVGb3JOZXdSb3coKTogYW55IHtcbiAgICB2YXIgcmVzID0gbnVsbDtcbiAgICBpZiAoISF0aGlzLm9uR2V0VmFsdWVGb3JOZXdSb3dDYWxsQmFjaykge1xuICAgICAgcmVzID0gdGhpcy5vbkdldFZhbHVlRm9yTmV3Um93Q2FsbEJhY2sodGhpcyk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUsIHRvIGFsbG93IHJvd3MgZHJhZyBhbmQgZHJvcC5cbiAgICovXG4gIHB1YmxpYyBnZXQgYWxsb3dSb3dzRHJhZ0FuZERyb3AoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImFsbG93Um93c0RyYWdBbmREcm9wXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgYWxsb3dSb3dzRHJhZ0FuZERyb3AodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dSb3dzRHJhZ0FuZERyb3BcIiwgdmFsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVSZW5kZXJlZFRhYmxlKCk6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFRhYmxlIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uTWF0cml4RHluYW1pY1JlbmRlcmVkVGFibGUodGhpcyk7XG4gIH1cblxuICBwcml2YXRlIGdldCByb3dDb3VudFZhbHVlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJvd0NvdW50XCIpO1xuICB9XG4gIHByaXZhdGUgc2V0IHJvd0NvdW50VmFsdWUodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyb3dDb3VudFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbWluaW11bSByb3cgY291bnQuIEEgdXNlciBjb3VsZCBub3QgZGVsZXRlIGEgcm93IGlmIHRoZSByb3dDb3VudCBlcXVhbHMgdG8gbWluUm93Q291bnRcbiAgICogQHNlZSByb3dDb3VudFxuICAgKiBAc2VlIG1heFJvd0NvdW50XG4gICAqIEBzZWUgYWxsb3dBZGRSb3dzXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1pblJvd0NvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1pblJvd0NvdW50XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWluUm93Q291bnQodmFsOiBudW1iZXIpIHtcbiAgICBpZiAodmFsIDwgMCkgdmFsID0gMDtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtaW5Sb3dDb3VudFwiLCB2YWwpO1xuICAgIGlmICh2YWwgPiB0aGlzLm1heFJvd0NvdW50KSB0aGlzLm1heFJvd0NvdW50ID0gdmFsO1xuICAgIGlmICh0aGlzLnJvd0NvdW50IDwgdmFsKSB0aGlzLnJvd0NvdW50ID0gdmFsO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSByb3cgY291bnQuIEEgdXNlciBjb3VsZCBub3QgYWRkIGEgcm93IGlmIHRoZSByb3dDb3VudCBlcXVhbHMgdG8gbWF4Um93Q291bnRcbiAgICogQHNlZSByb3dDb3VudFxuICAgKiBAc2VlIG1pblJvd0NvdW50XG4gICAqIEBzZWUgYWxsb3dBZGRSb3dzXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heFJvd0NvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1heFJvd0NvdW50XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4Um93Q291bnQodmFsOiBudW1iZXIpIHtcbiAgICBpZiAodmFsIDw9IDApIHJldHVybjtcbiAgICBpZiAodmFsID4gc2V0dGluZ3MubWF0cml4TWF4aW11bVJvd0NvdW50KVxuICAgICAgdmFsID0gc2V0dGluZ3MubWF0cml4TWF4aW11bVJvd0NvdW50O1xuICAgIGlmICh2YWwgPT0gdGhpcy5tYXhSb3dDb3VudCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1heFJvd0NvdW50XCIsIHZhbCk7XG4gICAgaWYgKHZhbCA8IHRoaXMubWluUm93Q291bnQpIHRoaXMubWluUm93Q291bnQgPSB2YWw7XG4gICAgaWYgKHRoaXMucm93Q291bnQgPiB2YWwpIHRoaXMucm93Q291bnQgPSB2YWw7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGZhbHNlIHRvIGRpc2FibGUgYWJpbGl0eSB0byBhZGQgbmV3IHJvd3MuIFwiQWRkIG5ldyBSb3dcIiBidXR0b24gYmVjb21lcyBpbnZzaWJsZSBpbiBVSVxuICAgKiBAc2VlIGNhbkFkZFJvd1xuICAgKiBAc2VlIGFsbG93UmVtb3ZlUm93c1xuICAgKi9cbiAgcHVibGljIGdldCBhbGxvd0FkZFJvd3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImFsbG93QWRkUm93c1wiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGFsbG93QWRkUm93cyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJhbGxvd0FkZFJvd3NcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gZmFsc2UgdG8gZGlzYWJsZSBhYmlsaXR5IHRvIHJlbW92ZSByb3dzLiBcIlJlbW92ZVwiIHJvdyBidXR0b25zIGJlY29tZSBpbnZzaWJsZSBpbiBVSVxuICAgKiBAc2VlIGNhblJlbW92ZVJvd3NcbiAgICogQHNlZSBhbGxvd0FkZFJvd3NcbiAgICovXG4gIHB1YmxpYyBnZXQgYWxsb3dSZW1vdmVSb3dzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJhbGxvd1JlbW92ZVJvd3NcIik7XG4gIH1cbiAgcHVibGljIHNldCBhbGxvd1JlbW92ZVJvd3ModmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dSZW1vdmVSb3dzXCIsIHZhbCk7XG4gICAgaWYgKCF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSB7XG4gICAgICB0aGlzLnJlc2V0UmVuZGVyZWRUYWJsZSgpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlLCBpZiBhIG5ldyByb3cgY2FuIGJlIGFkZGVkLlxuICAgKiBAc2VlIGFsbG93QWRkUm93c1xuICAgKiBAc2VlIG1heFJvd0NvdW50XG4gICAqIEBzZWUgY2FuUmVtb3ZlUm93c1xuICAgKiBAc2VlIHJvd0NvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IGNhbkFkZFJvdygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5hbGxvd0FkZFJvd3MgJiYgIXRoaXMuaXNSZWFkT25seSAmJiB0aGlzLnJvd0NvdW50IDwgdGhpcy5tYXhSb3dDb3VudFxuICAgICk7XG4gIH1cbiAgcHVibGljIGNhblJlbW92ZVJvd3NDYWxsYmFjazogKGFsbG93OiBib29sZWFuKSA9PiBib29sZWFuO1xuICAvKipcbiAgICogUmV0dXJucyB0cnVlLCBpZiByb3cgY2FuIGJlIHJlbW92ZWQuXG4gICAqIEBzZWUgbWluUm93Q291bnRcbiAgICogQHNlZSBjYW5BZGRSb3dcbiAgICogQHNlZSByb3dDb3VudFxuICAgKi9cbiAgcHVibGljIGdldCBjYW5SZW1vdmVSb3dzKCk6IGJvb2xlYW4ge1xuICAgIHZhciByZXMgPVxuICAgICAgdGhpcy5hbGxvd1JlbW92ZVJvd3MgJiZcbiAgICAgICF0aGlzLmlzUmVhZE9ubHkgJiZcbiAgICAgIHRoaXMucm93Q291bnQgPiB0aGlzLm1pblJvd0NvdW50O1xuICAgIHJldHVybiAhIXRoaXMuY2FuUmVtb3ZlUm93c0NhbGxiYWNrID8gdGhpcy5jYW5SZW1vdmVSb3dzQ2FsbGJhY2socmVzKSA6IHJlcztcbiAgfVxuICBwdWJsaWMgY2FuUmVtb3ZlUm93KHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuc3VydmV5KSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkubWF0cml4QWxsb3dSZW1vdmVSb3coXG4gICAgICB0aGlzLFxuICAgICAgKDxNYXRyaXhEeW5hbWljUm93TW9kZWw+cm93KS5pbmRleCxcbiAgICAgIHJvd1xuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW5kIGFkZCBhIG5ldyByb3cgYW5kIGZvY3VzIHRoZSBjZWxsIGluIHRoZSBmaXJzdCBjb2x1bW4uXG4gICAqL1xuICBwdWJsaWMgYWRkUm93VUkoKSB7XG4gICAgdmFyIG9sZFJvd0NvdW50ID0gdGhpcy5yb3dDb3VudDtcbiAgICB0aGlzLmFkZFJvdygpO1xuICAgIGlmIChvbGRSb3dDb3VudCA9PT0gdGhpcy5yb3dDb3VudCkgcmV0dXJuO1xuICAgIHZhciBxID0gdGhpcy5nZXRRdWVzdGlvblRvRm9jdXNPbkFkZGluZ1JvdygpO1xuICAgIGlmICghIXEpIHtcbiAgICAgIHEuZm9jdXMoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXRRdWVzdGlvblRvRm9jdXNPbkFkZGluZ1JvdygpOiBRdWVzdGlvbiB7XG4gICAgdmFyIHJvdyA9IHRoaXMudmlzaWJsZVJvd3NbdGhpcy52aXNpYmxlUm93cy5sZW5ndGggLSAxXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvdy5jZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHEgPSByb3cuY2VsbHNbaV0ucXVlc3Rpb247XG4gICAgICBpZiAoISFxICYmIHEuaXNWaXNpYmxlICYmICFxLmlzUmVhZE9ubHkpIHtcbiAgICAgICAgcmV0dXJuIHE7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuZCBhZGQgYSBuZXcgcm93LlxuICAgKi9cbiAgcHVibGljIGFkZFJvdygpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHsgcXVlc3Rpb246IHRoaXMsIGNhbkFkZFJvdzogdGhpcy5jYW5BZGRSb3cgfTtcbiAgICBpZiAoISF0aGlzLnN1cnZleSkge1xuICAgICAgdGhpcy5zdXJ2ZXkubWF0cml4QmVmb3JlUm93QWRkZWQob3B0aW9ucyk7XG4gICAgfVxuICAgIGlmICghb3B0aW9ucy5jYW5BZGRSb3cpIHJldHVybjtcbiAgICB0aGlzLm9uU3RhcnRSb3dBZGRpbmdSZW1vdmluZygpO1xuICAgIHRoaXMuYWRkUm93Q29yZSgpO1xuICAgIHRoaXMub25FbmRSb3dBZGRpbmcoKTtcbiAgICBpZiAodGhpcy5kZXRhaWxQYW5lbFNob3dPbkFkZGluZyAmJiB0aGlzLnZpc2libGVSb3dzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudmlzaWJsZVJvd3NbdGhpcy52aXNpYmxlUm93cy5sZW5ndGggLSAxXS5zaG93RGV0YWlsUGFuZWwoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUgdG8gc2hvdyBkZXRhaWwgcGFuZWwgaW1tZWRpYXRlbHkgb24gYWRkaW5nIGEgbmV3IHJvdy5cbiAgICogQHNlZSBkZXRhaWxQYW5lbE1vZGVcbiAgICovXG4gIHB1YmxpYyBnZXQgZGV0YWlsUGFuZWxTaG93T25BZGRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImRldGFpbFBhbmVsU2hvd09uQWRkaW5nXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZGV0YWlsUGFuZWxTaG93T25BZGRpbmcodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZGV0YWlsUGFuZWxTaG93T25BZGRpbmdcIiwgdmFsKTtcbiAgfVxuICBwcm90ZWN0ZWQgaGFzUm93c0FzSXRlbXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyB1bmJpbmRWYWx1ZSgpIHtcbiAgICB0aGlzLmNsZWFyR2VuZXJhdGVkUm93cygpO1xuICAgIHRoaXMuY2xlYXJQcm9wZXJ0eVZhbHVlKFwidmFsdWVcIik7XG4gICAgdGhpcy5yb3dDb3VudFZhbHVlID0gMDtcbiAgICBzdXBlci51bmJpbmRWYWx1ZSgpO1xuICB9XG4gIHByb3RlY3RlZCBpc1ZhbHVlU3VydmV5RWxlbWVudCh2YWw6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzRWRpdGluZ1N1cnZleUVsZW1lbnQgfHwgc3VwZXIuaXNWYWx1ZVN1cnZleUVsZW1lbnQodmFsKTtcbiAgfVxuICBwcml2YXRlIGFkZFJvd0NvcmUoKSB7XG4gICAgdmFyIHByZXZSb3dDb3VudCA9IHRoaXMucm93Q291bnQ7XG4gICAgdGhpcy5yb3dDb3VudCA9IHRoaXMucm93Q291bnQgKyAxO1xuICAgIHZhciBkZWZhdWx0VmFsdWUgPSB0aGlzLmdldERlZmF1bHRSb3dWYWx1ZSh0cnVlKTtcbiAgICB2YXIgbmV3VmFsdWUgPSBudWxsO1xuICAgIGlmICghdGhpcy5pc1ZhbHVlRW1wdHkoZGVmYXVsdFZhbHVlKSkge1xuICAgICAgbmV3VmFsdWUgPSB0aGlzLmNyZWF0ZU5ld1ZhbHVlKCk7XG4gICAgICBpZiAobmV3VmFsdWUubGVuZ3RoID09IHRoaXMucm93Q291bnQpIHtcbiAgICAgICAgbmV3VmFsdWVbbmV3VmFsdWUubGVuZ3RoIC0gMV0gPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuZGF0YSkge1xuICAgICAgdGhpcy5ydW5DZWxsc0NvbmRpdGlvbihcbiAgICAgICAgdGhpcy5nZXREYXRhRmlsdGVyZWRWYWx1ZXMoKSxcbiAgICAgICAgdGhpcy5nZXREYXRhRmlsdGVyZWRQcm9wZXJ0aWVzKClcbiAgICAgICk7XG4gICAgICB2YXIgcm93ID0gdGhpcy52aXNpYmxlUm93c1t0aGlzLnJvd0NvdW50IC0gMV07XG4gICAgICBpZiAoIXRoaXMuaXNWYWx1ZUVtcHR5KHJvdy52YWx1ZSkpIHtcbiAgICAgICAgaWYgKCFuZXdWYWx1ZSkge1xuICAgICAgICAgIG5ld1ZhbHVlID0gdGhpcy5jcmVhdGVOZXdWYWx1ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhdGhpcy5pc1ZhbHVlU3VydmV5RWxlbWVudChuZXdWYWx1ZSkgJiZcbiAgICAgICAgICAhdGhpcy5pc1R3b1ZhbHVlRXF1YWxzKG5ld1ZhbHVlW25ld1ZhbHVlLmxlbmd0aCAtIDFdLCByb3cudmFsdWUpXG4gICAgICAgICkge1xuICAgICAgICAgIG5ld1ZhbHVlW25ld1ZhbHVlLmxlbmd0aCAtIDFdID0gcm93LnZhbHVlO1xuICAgICAgICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5zdXJ2ZXkpIHtcbiAgICAgIGlmIChwcmV2Um93Q291bnQgKyAxID09IHRoaXMucm93Q291bnQpIHtcbiAgICAgICAgdGhpcy5zdXJ2ZXkubWF0cml4Um93QWRkZWQoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB0aGlzLnZpc2libGVSb3dzW3RoaXMudmlzaWJsZVJvd3MubGVuZ3RoIC0gMV1cbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5vblJvd3NDaGFuZ2VkKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZ2V0RGVmYXVsdFJvd1ZhbHVlKGlzUm93QWRkZWQ6IGJvb2xlYW4pOiBhbnkge1xuICAgIHZhciByZXMgPSBudWxsO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcSA9IHRoaXMuY29sdW1uc1tpXS50ZW1wbGF0ZVF1ZXN0aW9uO1xuICAgICAgaWYgKCEhcSAmJiAhdGhpcy5pc1ZhbHVlRW1wdHkocS5nZXREZWZhdWx0VmFsdWUoKSkpIHtcbiAgICAgICAgcmVzID0gcmVzIHx8IHt9O1xuICAgICAgICAoPGFueT5yZXMpW3RoaXMuY29sdW1uc1tpXS5uYW1lXSA9IHEuZ2V0RGVmYXVsdFZhbHVlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy5kZWZhdWx0Um93VmFsdWUpKSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5kZWZhdWx0Um93VmFsdWUpIHtcbiAgICAgICAgcmVzID0gcmVzIHx8IHt9O1xuICAgICAgICAoPGFueT5yZXMpW2tleV0gPSB0aGlzLmRlZmF1bHRSb3dWYWx1ZVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNSb3dBZGRlZCAmJiB0aGlzLmRlZmF1bHRWYWx1ZUZyb21MYXN0Um93KSB7XG4gICAgICB2YXIgdmFsID0gdGhpcy52YWx1ZTtcbiAgICAgIGlmICghIXZhbCAmJiBBcnJheS5pc0FycmF5KHZhbCkgJiYgdmFsLmxlbmd0aCA+PSB0aGlzLnJvd0NvdW50IC0gMSkge1xuICAgICAgICB2YXIgcm93VmFsdWUgPSB2YWxbdGhpcy5yb3dDb3VudCAtIDJdO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gcm93VmFsdWUpIHtcbiAgICAgICAgICByZXMgPSByZXMgfHwge307XG4gICAgICAgICAgKDxhbnk+cmVzKVtrZXldID0gcm93VmFsdWVba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgcm93IGJ5IGl0J3MgaW5kZXguIElmIGNvbmZpcm1EZWxldGUgaXMgdHJ1ZSwgc2hvdyBhIGNvbmZpcm1hdGlvbiBkaWFsb2dcbiAgICogQHBhcmFtIGluZGV4IGEgcm93IGluZGV4LCBmcm9tIDAgdG8gcm93Q291bnQgLSAxXG4gICAqIEBzZWUgcmVtb3ZlUm93XG4gICAqIEBzZWUgY29uZmlybURlbGV0ZVxuICAgKi9cbiAgcHVibGljIHJlbW92ZVJvd1VJKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoISF2YWx1ZSAmJiAhIXZhbHVlLnJvd05hbWUpIHtcbiAgICAgIHZhciBpbmRleCA9IHRoaXMudmlzaWJsZVJvd3MuaW5kZXhPZih2YWx1ZSk7XG4gICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm47XG4gICAgICB2YWx1ZSA9IGluZGV4O1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAhdGhpcy5pc1JlcXVpcmVDb25maXJtT25Sb3dEZWxldGUodmFsdWUpIHx8XG4gICAgICBjb25maXJtQWN0aW9uKHRoaXMuY29uZmlybURlbGV0ZVRleHQpXG4gICAgKSB7XG4gICAgICB0aGlzLnJlbW92ZVJvdyh2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBpc1JlcXVpcmVDb25maXJtT25Sb3dEZWxldGUoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5jb25maXJtRGVsZXRlKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLnJvd0NvdW50KSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHZhbHVlID0gdGhpcy5jcmVhdGVOZXdWYWx1ZSgpO1xuICAgIGlmICh0aGlzLmlzVmFsdWVFbXB0eSh2YWx1ZSkgfHwgIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGluZGV4ID49IHZhbHVlLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAhdGhpcy5pc1ZhbHVlRW1wdHkodmFsdWVbaW5kZXhdKTtcbiAgfVxuICAvKipcbiAgICogUmVtb3ZlcyBhIHJvdyBieSBpdCdzIGluZGV4LlxuICAgKiBAcGFyYW0gaW5kZXggYSByb3cgaW5kZXgsIGZyb20gMCB0byByb3dDb3VudCAtIDFcbiAgICovXG4gIHB1YmxpYyByZW1vdmVSb3coaW5kZXg6IG51bWJlcikge1xuICAgIGlmICghdGhpcy5jYW5SZW1vdmVSb3dzKSByZXR1cm47XG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLnJvd0NvdW50KSByZXR1cm47XG4gICAgdmFyIHJvdyA9XG4gICAgICAhIXRoaXMudmlzaWJsZVJvd3MgJiYgaW5kZXggPCB0aGlzLnZpc2libGVSb3dzLmxlbmd0aFxuICAgICAgICA/IHRoaXMudmlzaWJsZVJvd3NbaW5kZXhdXG4gICAgICAgIDogbnVsbDtcbiAgICBpZiAoXG4gICAgICAhIXJvdyAmJlxuICAgICAgISF0aGlzLnN1cnZleSAmJlxuICAgICAgIXRoaXMuc3VydmV5Lm1hdHJpeFJvd1JlbW92aW5nKHRoaXMsIGluZGV4LCByb3cpXG4gICAgKVxuICAgICAgcmV0dXJuO1xuICAgIHRoaXMub25TdGFydFJvd0FkZGluZ1JlbW92aW5nKCk7XG4gICAgdGhpcy5yZW1vdmVSb3dDb3JlKGluZGV4KTtcbiAgICB0aGlzLm9uRW5kUm93UmVtb3Zpbmcocm93KTtcbiAgfVxuICBwcml2YXRlIHJlbW92ZVJvd0NvcmUoaW5kZXg6IG51bWJlcikge1xuICAgIHZhciByb3cgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzXG4gICAgICA/IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3NbaW5kZXhdXG4gICAgICA6IG51bGw7XG4gICAgaWYgKHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MgJiYgaW5kZXggPCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aCkge1xuICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgICB0aGlzLnJvd0NvdW50VmFsdWUtLTtcbiAgICBpZiAodGhpcy52YWx1ZSkge1xuICAgICAgdmFyIHZhbCA9IFtdO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkgJiYgaW5kZXggPCB0aGlzLnZhbHVlLmxlbmd0aCkge1xuICAgICAgICB2YWwgPSB0aGlzLmNyZWF0ZVZhbHVlQ29weSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsID0gdGhpcy5jcmVhdGVOZXdWYWx1ZSgpO1xuICAgICAgfVxuICAgICAgdmFsLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB2YWwgPSB0aGlzLmRlbGV0ZVJvd1ZhbHVlKHZhbCwgbnVsbCk7XG4gICAgICB0aGlzLmlzUm93Q2hhbmdpbmcgPSB0cnVlO1xuICAgICAgdGhpcy52YWx1ZSA9IHZhbDtcbiAgICAgIHRoaXMuaXNSb3dDaGFuZ2luZyA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLm9uUm93c0NoYW5nZWQoKTtcbiAgICBpZiAodGhpcy5zdXJ2ZXkpIHtcbiAgICAgIHRoaXMuc3VydmV5Lm1hdHJpeFJvd1JlbW92ZWQodGhpcywgaW5kZXgsIHJvdyk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgdGV4dCBzaG93aW5nIGluIHRoZSBjb25maXJtYXRpb24gZGVsZXRlIGRpYWxvZyBvbiByZW1vdmluZyBhIHJvdy5cbiAgICovXG4gIHB1YmxpYyBnZXQgY29uZmlybURlbGV0ZVRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJjb25maXJtRGVsZXRlVGV4dFwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImNvbmZpcm1EZWxldGVcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgY29uZmlybURlbGV0ZVRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImNvbmZpcm1EZWxldGVUZXh0XCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY0NvbmZpcm1EZWxldGVUZXh0KCkge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiY29uZmlybURlbGV0ZVRleHRcIik7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhZGQgcm93IGJ1dHRvbiB0ZXh0LlxuICAgKi9cbiAgcHVibGljIGdldCBhZGRSb3dUZXh0KCkge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImFkZFJvd1RleHRcIiwgdGhpcy5kZWZhdWx0QWRkUm93VGV4dCk7XG4gIH1cbiAgcHVibGljIHNldCBhZGRSb3dUZXh0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJhZGRSb3dUZXh0XCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY0FkZFJvd1RleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJhZGRSb3dUZXh0XCIpO1xuICB9XG4gIHByaXZhdGUgZ2V0IGRlZmF1bHRBZGRSb3dUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXG4gICAgICB0aGlzLmlzQ29sdW1uTGF5b3V0SG9yaXpvbnRhbCA/IFwiYWRkUm93XCIgOiBcImFkZENvbHVtblwiXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogQnkgZGVmYXVsdCB0aGUgJ0FkZCBSb3cnIGJ1dHRvbiBpcyBzaG93biBvbiBib3R0b20gaWYgY29sdW1uTGF5b3V0IGlzIGhvcml6b250YWwgYW5kIG9uIHRvcCBpZiBjb2x1bW5MYXlvdXQgaXMgdmVydGljYWwuIDxici8+XG4gICAqIFlvdSBtYXkgc2V0IGl0IHRvIFwidG9wXCIsIFwiYm90dG9tXCIgb3IgXCJ0b3BCb3R0b21cIiAodG8gc2hvdyBvbiB0b3AgYW5kIGJvdHRvbSkuXG4gICAqIEBzZWUgY29sdW1uTGF5b3V0XG4gICAqL1xuICBwdWJsaWMgZ2V0IGFkZFJvd0xvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImFkZFJvd0xvY2F0aW9uXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgYWRkUm93TG9jYXRpb24odmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJhZGRSb3dMb2NhdGlvblwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXRBZGRSb3dMb2NhdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmFkZFJvd0xvY2F0aW9uO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlIHRvIGhpZGUgbWF0cml4IGNvbHVtbnMgd2hlbiB0aGVyZSBpcyBubyBhbnkgcm93LlxuICAgKi9cbiAgcHVibGljIGdldCBoaWRlQ29sdW1uc0lmRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImhpZGVDb2x1bW5zSWZFbXB0eVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGhpZGVDb2x1bW5zSWZFbXB0eSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJoaWRlQ29sdW1uc0lmRW1wdHlcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0U2hvd0NvbHVtbnNJZkVtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLmhpZGVDb2x1bW5zSWZFbXB0eTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHJlbW92ZSByb3cgYnV0dG9uIHRleHQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlbW92ZVJvd1RleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJyZW1vdmVSb3dUZXh0XCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicmVtb3ZlUm93XCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJlbW92ZVJvd1RleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInJlbW92ZVJvd1RleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jUmVtb3ZlUm93VGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInJlbW92ZVJvd1RleHRcIik7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiByZW1vdmUgcm93IGJ1dHRvbiB0ZXh0LlxuICAgKi9cbiAgcHVibGljIGdldCBlbXB0eVJvd3NUZXh0KCkge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwiZW1wdHlSb3dzVGV4dFwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImVtcHR5Um93c1RleHRcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgZW1wdHlSb3dzVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiZW1wdHlSb3dzVGV4dFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NFbXB0eVJvd3NUZXh0KCkge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiZW1wdHlSb3dzVGV4dFwiKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGlzcGxheVZhbHVlQ29yZShrZXlzQXNUZXh0OiBib29sZWFuLCB2YWx1ZTogYW55KTogYW55IHtcbiAgICBpZiAoIXZhbHVlIHx8ICFBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICAgIHZhciB2YWx1ZXMgPSB0aGlzLmdldFVuYmluZFZhbHVlKHZhbHVlKTtcbiAgICB2YXIgcm93cyA9IHRoaXMudmlzaWJsZVJvd3M7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aCAmJiBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmFsID0gdmFsdWVzW2ldO1xuICAgICAgaWYgKCF2YWwpIGNvbnRpbnVlO1xuICAgICAgdmFsdWVzW2ldID0gdGhpcy5nZXRSb3dEaXNwbGF5VmFsdWUoa2V5c0FzVGV4dCwgcm93c1tpXSwgdmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuICBwdWJsaWMgYWRkQ29uZGl0aW9uT2JqZWN0c0J5Q29udGV4dChcbiAgICBvYmplY3RzOiBBcnJheTxJQ29uZGl0aW9uT2JqZWN0PixcbiAgICBjb250ZXh0OiBhbnlcbiAgKSB7XG4gICAgdmFyIGhhc0NvbnRleHQgPSAhIWNvbnRleHQgPyB0aGlzLmNvbHVtbnMuaW5kZXhPZihjb250ZXh0KSA+IC0xIDogZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjb2x1bW4gPSB0aGlzLmNvbHVtbnNbaV07XG4gICAgICB0aGlzLmFkZENvbHVtbkludG9hZGRDb25kaXRpb25PYmplY3RzQnlDb250ZXh0KG9iamVjdHMsIDAsIGNvbHVtbik7XG4gICAgICBpZiAoaGFzQ29udGV4dCAmJiBjb2x1bW4gIT0gY29udGV4dCkge1xuICAgICAgICB0aGlzLmFkZENvbHVtbkludG9hZGRDb25kaXRpb25PYmplY3RzQnlDb250ZXh0KG9iamVjdHMsIC0xLCBjb2x1bW4pO1xuICAgICAgfVxuICAgICAgZm9yIChcbiAgICAgICAgdmFyIGogPSAxO1xuICAgICAgICBqIDwgTWF0aC5taW4oc2V0dGluZ3MubWF0cml4TWF4Um93Q291bnRJbkNvbmRpdGlvbiwgdGhpcy5yb3dDb3VudCk7XG4gICAgICAgIGorK1xuICAgICAgKSB7XG4gICAgICAgIHRoaXMuYWRkQ29sdW1uSW50b2FkZENvbmRpdGlvbk9iamVjdHNCeUNvbnRleHQob2JqZWN0cywgaiwgY29sdW1uKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBhZGRDb2x1bW5JbnRvYWRkQ29uZGl0aW9uT2JqZWN0c0J5Q29udGV4dChcbiAgICBvYmplY3RzOiBBcnJheTxJQ29uZGl0aW9uT2JqZWN0PixcbiAgICByb3dJbmRleDogbnVtYmVyLFxuICAgIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW5cbiAgKSB7XG4gICAgdmFyIHJvd05hbWUgPSByb3dJbmRleCA+IC0xID8gXCJbXCIgKyByb3dJbmRleC50b1N0cmluZygpICsgXCJdLlwiIDogXCJyb3cuXCI7XG4gICAgb2JqZWN0cy5wdXNoKHtcbiAgICAgIG5hbWU6XG4gICAgICAgIChyb3dJbmRleCA+IC0xID8gdGhpcy5nZXRWYWx1ZU5hbWUoKSArIHJvd05hbWUgOiByb3dOYW1lKSArIGNvbHVtbi5uYW1lLFxuICAgICAgdGV4dDpcbiAgICAgICAgKHJvd0luZGV4ID4gLTEgPyB0aGlzLnByb2Nlc3NlZFRpdGxlICsgcm93TmFtZSA6IHJvd05hbWUpICtcbiAgICAgICAgY29sdW1uLmZ1bGxUaXRsZSxcbiAgICAgIHF1ZXN0aW9uOiB0aGlzLFxuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldCBoYXNSb3dUZXh0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcm90ZWN0ZWQgb25DaGVja0ZvckVycm9ycyhcbiAgICBlcnJvcnM6IEFycmF5PFN1cnZleUVycm9yPixcbiAgICBpc09uVmFsdWVDaGFuZ2VkOiBib29sZWFuXG4gICkge1xuICAgIHN1cGVyLm9uQ2hlY2tGb3JFcnJvcnMoZXJyb3JzLCBpc09uVmFsdWVDaGFuZ2VkKTtcbiAgICBpZiAoIWlzT25WYWx1ZUNoYW5nZWQgJiYgdGhpcy5oYXNFcnJvckluTWluUm93cygpKSB7XG4gICAgICBlcnJvcnMucHVzaChuZXcgTWluUm93Q291bnRFcnJvcih0aGlzLm1pblJvd0NvdW50LCB0aGlzKSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgaGFzRXJyb3JJbk1pblJvd3MoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubWluUm93Q291bnQgPD0gMCB8fCAhdGhpcy5pc1JlcXVpcmVkIHx8ICF0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBzZXRSb3dDb3VudCA9IDA7XG4gICAgZm9yIChcbiAgICAgIHZhciByb3dJbmRleCA9IDA7XG4gICAgICByb3dJbmRleCA8IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MubGVuZ3RoO1xuICAgICAgcm93SW5kZXgrK1xuICAgICkge1xuICAgICAgdmFyIHJvdyA9IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3Nbcm93SW5kZXhdO1xuICAgICAgaWYgKCFyb3cuaXNFbXB0eSkgc2V0Um93Q291bnQrKztcbiAgICB9XG4gICAgcmV0dXJuIHNldFJvd0NvdW50IDwgdGhpcy5taW5Sb3dDb3VudDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0VW5pcXVlQ29sdW1ucygpOiBBcnJheTxNYXRyaXhEcm9wZG93bkNvbHVtbj4ge1xuICAgIHZhciByZXMgPSBzdXBlci5nZXRVbmlxdWVDb2x1bW5zKCk7XG4gICAgaWYgKCEhdGhpcy5rZXlOYW1lKSB7XG4gICAgICBsZXQgY29sdW1uID0gdGhpcy5nZXRDb2x1bW5CeU5hbWUodGhpcy5rZXlOYW1lKTtcbiAgICAgIGlmICghIWNvbHVtbiAmJiByZXMuaW5kZXhPZihjb2x1bW4pIDwgMCkge1xuICAgICAgICByZXMucHVzaChjb2x1bW4pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByb3RlY3RlZCBnZW5lcmF0ZVJvd3MoKTogQXJyYXk8TWF0cml4RHluYW1pY1Jvd01vZGVsPiB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxNYXRyaXhEeW5hbWljUm93TW9kZWw+KCk7XG4gICAgaWYgKHRoaXMucm93Q291bnQgPT09IDApIHJldHVybiByZXN1bHQ7XG4gICAgdmFyIHZhbCA9IHRoaXMuY3JlYXRlTmV3VmFsdWUoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucm93Q291bnQ7IGkrKykge1xuICAgICAgcmVzdWx0LnB1c2godGhpcy5jcmVhdGVNYXRyaXhSb3codGhpcy5nZXRSb3dWYWx1ZUJ5SW5kZXgodmFsLCBpKSkpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMuZ2V0RGVmYXVsdFJvd1ZhbHVlKGZhbHNlKSkpIHtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWw7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU1hdHJpeFJvdyh2YWx1ZTogYW55KTogTWF0cml4RHluYW1pY1Jvd01vZGVsIHtcbiAgICByZXR1cm4gbmV3IE1hdHJpeER5bmFtaWNSb3dNb2RlbCh0aGlzLnJvd0NvdW50ZXIrKywgdGhpcywgdmFsdWUpO1xuICB9XG4gIHByb3RlY3RlZCBvbkJlZm9yZVZhbHVlQ2hhbmdlZCh2YWw6IGFueSkge1xuICAgIGlmICghdmFsIHx8ICFBcnJheS5pc0FycmF5KHZhbCkpIHJldHVybjtcbiAgICB2YXIgbmV3Um93Q291bnQgPSB2YWwubGVuZ3RoO1xuICAgIGlmIChuZXdSb3dDb3VudCA9PSB0aGlzLnJvd0NvdW50KSByZXR1cm47XG4gICAgaWYgKCF0aGlzLnNldFJvd0NvdW50VmFsdWVGcm9tRGF0YSAmJiBuZXdSb3dDb3VudCA8IHRoaXMuaW5pdGlhbFJvd0NvdW50KVxuICAgICAgcmV0dXJuO1xuICAgIHRoaXMuc2V0Um93Q291bnRWYWx1ZUZyb21EYXRhID0gdHJ1ZTtcbiAgICB0aGlzLnJvd0NvdW50VmFsdWUgPSBuZXdSb3dDb3VudDtcbiAgICBpZiAodGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykge1xuICAgICAgdGhpcy5jbGVhckdlbmVyYXRlZFJvd3MoKTtcbiAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xuICAgICAgdGhpcy5vblJvd3NDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVOZXdWYWx1ZSgpOiBhbnkge1xuICAgIHZhciByZXN1bHQgPSB0aGlzLmNyZWF0ZVZhbHVlQ29weSgpO1xuICAgIGlmICghcmVzdWx0IHx8ICFBcnJheS5pc0FycmF5KHJlc3VsdCkpIHJlc3VsdCA9IFtdO1xuICAgIGlmIChyZXN1bHQubGVuZ3RoID4gdGhpcy5yb3dDb3VudCkgcmVzdWx0LnNwbGljZSh0aGlzLnJvd0NvdW50KTtcbiAgICB2YXIgcm93VmFsdWUgPSB0aGlzLmdldERlZmF1bHRSb3dWYWx1ZShmYWxzZSk7XG4gICAgcm93VmFsdWUgPSByb3dWYWx1ZSB8fCB7fTtcbiAgICBmb3IgKHZhciBpID0gcmVzdWx0Lmxlbmd0aDsgaSA8IHRoaXMucm93Q291bnQ7IGkrKykge1xuICAgICAgcmVzdWx0LnB1c2godGhpcy5nZXRVbmJpbmRWYWx1ZShyb3dWYWx1ZSkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByb3RlY3RlZCBkZWxldGVSb3dWYWx1ZShcbiAgICBuZXdWYWx1ZTogYW55LFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2VcbiAgKTogYW55IHtcbiAgICB2YXIgaXNFbXB0eSA9IHRydWU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdWYWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuaXNPYmplY3QobmV3VmFsdWVbaV0pICYmIE9iamVjdC5rZXlzKG5ld1ZhbHVlW2ldKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlzRW1wdHkgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpc0VtcHR5ID8gbnVsbCA6IG5ld1ZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRSb3dWYWx1ZUJ5SW5kZXgocXVlc3Rpb25WYWx1ZTogYW55LCBpbmRleDogbnVtYmVyKTogYW55IHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShxdWVzdGlvblZhbHVlKSAmJlxuICAgICAgaW5kZXggPj0gMCAmJlxuICAgICAgaW5kZXggPCBxdWVzdGlvblZhbHVlLmxlbmd0aFxuICAgICAgPyBxdWVzdGlvblZhbHVlW2luZGV4XVxuICAgICAgOiBudWxsO1xuICB9XG4gIHByb3RlY3RlZCBnZXRSb3dWYWx1ZUNvcmUoXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICBxdWVzdGlvblZhbHVlOiBhbnksXG4gICAgY3JlYXRlOiBib29sZWFuID0gZmFsc2VcbiAgKTogYW55IHtcbiAgICBpZiAoIXRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MpIHJldHVybiB7fTtcbiAgICB2YXIgcmVzID0gdGhpcy5nZXRSb3dWYWx1ZUJ5SW5kZXgoXG4gICAgICBxdWVzdGlvblZhbHVlLFxuICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5pbmRleE9mKHJvdylcbiAgICApO1xuICAgIGlmICghcmVzICYmIGNyZWF0ZSkgcmVzID0ge307XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgZ2V0QWRkUm93QnV0dG9uQ3NzKGlzRW1wdHlTZWN0aW9uOiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcge1xuICAgIHJldHVybiBuZXcgQ3NzQ2xhc3NCdWlsZGVyKClcbiAgICAgIC5hcHBlbmQodGhpcy5jc3NDbGFzc2VzLmJ1dHRvbilcbiAgICAgIC5hcHBlbmQodGhpcy5jc3NDbGFzc2VzLmJ1dHRvbkFkZClcbiAgICAgIC5hcHBlbmQodGhpcy5jc3NDbGFzc2VzLmVtcHR5Um93c0J1dHRvbiwgaXNFbXB0eVNlY3Rpb24pXG4gICAgICAudG9TdHJpbmcoKTtcbiAgfVxuICBwdWJsaWMgZ2V0UmVtb3ZlUm93QnV0dG9uQ3NzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5ldyBDc3NDbGFzc0J1aWxkZXIoKVxuICAgICAgLmFwcGVuZCh0aGlzLmNzc0NsYXNzZXMuYnV0dG9uKVxuICAgICAgLmFwcGVuZCh0aGlzLmNzc0NsYXNzZXMuYnV0dG9uUmVtb3ZlKVxuICAgICAgLnRvU3RyaW5nKCk7XG4gIH1cbn1cblxuY2xhc3MgUXVlc3Rpb25NYXRyaXhEeW5hbWljUmVuZGVyZWRUYWJsZSBleHRlbmRzIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFRhYmxlIHtcbiAgcHJvdGVjdGVkIHNldERlZmF1bHRSb3dBY3Rpb25zKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgYWN0aW9uczogQXJyYXk8SUFjdGlvbj5cbiAgKSB7XG4gICAgc3VwZXIuc2V0RGVmYXVsdFJvd0FjdGlvbnMocm93LCBhY3Rpb25zKTtcbiAgfVxufVxuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcIm1hdHJpeGR5bmFtaWNcIixcbiAgW1xuICAgIHsgbmFtZTogXCJyb3dzVmlzaWJsZUlmOmNvbmRpdGlvblwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJhbGxvd0FkZFJvd3M6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgeyBuYW1lOiBcImFsbG93UmVtb3ZlUm93czpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgICB7IG5hbWU6IFwicm93Q291bnQ6bnVtYmVyXCIsIGRlZmF1bHQ6IDIsIG1pblZhbHVlOiAwLCBpc0JpbmRhYmxlOiB0cnVlIH0sXG4gICAgeyBuYW1lOiBcIm1pblJvd0NvdW50Om51bWJlclwiLCBkZWZhdWx0OiAwLCBtaW5WYWx1ZTogMCB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwibWF4Um93Q291bnQ6bnVtYmVyXCIsXG4gICAgICBkZWZhdWx0OiBzZXR0aW5ncy5tYXRyaXhNYXhpbXVtUm93Q291bnQsXG4gICAgfSxcbiAgICB7IG5hbWU6IFwia2V5TmFtZVwiIH0sXG4gICAgXCJkZWZhdWx0Um93VmFsdWU6cm93dmFsdWVcIixcbiAgICBcImRlZmF1bHRWYWx1ZUZyb21MYXN0Um93OmJvb2xlYW5cIixcbiAgICB7IG5hbWU6IFwiY29uZmlybURlbGV0ZTpib29sZWFuXCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImNvbmZpcm1EZWxldGVUZXh0XCIsXG4gICAgICBkZXBlbmRzT246IFwiY29uZmlybURlbGV0ZVwiLFxuICAgICAgdmlzaWJsZUlmOiBmdW5jdGlvbihvYmo6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIW9iaiB8fCBvYmouY29uZmlybURlbGV0ZTtcbiAgICAgIH0sXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jQ29uZmlybURlbGV0ZVRleHRcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiYWRkUm93TG9jYXRpb25cIixcbiAgICAgIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLFxuICAgICAgY2hvaWNlczogW1wiZGVmYXVsdFwiLCBcInRvcFwiLCBcImJvdHRvbVwiLCBcInRvcEJvdHRvbVwiXSxcbiAgICB9LFxuICAgIHsgbmFtZTogXCJhZGRSb3dUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NBZGRSb3dUZXh0XCIgfSxcbiAgICB7IG5hbWU6IFwicmVtb3ZlUm93VGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jUmVtb3ZlUm93VGV4dFwiIH0sXG4gICAgXCJoaWRlQ29sdW1uc0lmRW1wdHk6Ym9vbGVhblwiLFxuICAgIHtcbiAgICAgIG5hbWU6IFwiZW1wdHlSb3dzVGV4dDp0ZXh0XCIsXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jRW1wdHlSb3dzVGV4dFwiLFxuICAgICAgZGVwZW5kc09uOiBcImhpZGVDb2x1bW5zSWZFbXB0eVwiLFxuICAgICAgdmlzaWJsZUlmOiBmdW5jdGlvbihvYmo6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIW9iaiB8fCBvYmouaGlkZUNvbHVtbnNJZkVtcHR5O1xuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiZGV0YWlsUGFuZWxTaG93T25BZGRpbmc6Ym9vbGVhblwiLFxuICAgICAgZGVwZW5kc09uOiBcImRldGFpbFBhbmVsTW9kZVwiLFxuICAgICAgdmlzaWJsZUlmOiBmdW5jdGlvbihvYmo6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gb2JqLmRldGFpbFBhbmVsTW9kZSAhPT0gXCJub25lXCI7XG4gICAgICB9LFxuICAgIH0sXG4gICAgXCJhbGxvd1Jvd3NEcmFnQW5kRHJvcDpzd2l0Y2hcIlxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsKFwiXCIpO1xuICB9LFxuICBcIm1hdHJpeGRyb3Bkb3duYmFzZVwiXG4pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcIm1hdHJpeGR5bmFtaWNcIiwgKG5hbWUpID0+IHtcbiAgdmFyIHEgPSBuZXcgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWwobmFtZSk7XG4gIHEuY2hvaWNlcyA9IFsxLCAyLCAzLCA0LCA1XTtcbiAgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZS5hZGREZWZhdWx0Q29sdW1ucyhxKTtcbiAgcmV0dXJuIHE7XG59KTtcbiIsImltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQge1xuICBJU3VydmV5RGF0YSxcbiAgSVN1cnZleUltcGwsXG4gIElTdXJ2ZXksXG4gIElQYW5lbCxcbiAgSUVsZW1lbnQsXG4gIElUZXh0UHJvY2Vzc29yLFxuICBJUHJvZ3Jlc3NJbmZvXG59IGZyb20gXCIuL2Jhc2UtaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgU3VydmV5RWxlbWVudCB9IGZyb20gXCIuL3N1cnZleS1lbGVtZW50XCI7XG5pbXBvcnQgeyBTdXJ2ZXlWYWxpZGF0b3IsIElWYWxpZGF0b3JPd25lciB9IGZyb20gXCIuL3ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgUXVlc3Rpb24sIElDb25kaXRpb25PYmplY3QgfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgUXVlc3Rpb25UZXh0TW9kZWwgfSBmcm9tIFwiLi9xdWVzdGlvbl90ZXh0XCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0LCBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBTdXJ2ZXlFcnJvciB9IGZyb20gXCIuL3N1cnZleS1lcnJvclwiO1xuaW1wb3J0IHsgSUxvY2FsaXphYmxlT3duZXIsIExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBDc3NDbGFzc0J1aWxkZXIgfSBmcm9tIFwiLi91dGlscy9jc3NDbGFzc0J1aWxkZXJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJTXVsdGlwbGVUZXh0RGF0YSBleHRlbmRzIElMb2NhbGl6YWJsZU93bmVyLCBJUGFuZWwge1xuICBnZXRTdXJ2ZXkoKTogSVN1cnZleTtcbiAgZ2V0VGV4dFByb2Nlc3NvcigpOiBJVGV4dFByb2Nlc3NvcjtcbiAgZ2V0QWxsVmFsdWVzKCk6IGFueTtcbiAgZ2V0TXVsdGlwbGVUZXh0VmFsdWUobmFtZTogc3RyaW5nKTogYW55O1xuICBzZXRNdWx0aXBsZVRleHRWYWx1ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBhbnk7XG4gIGdldEl0ZW1EZWZhdWx0VmFsdWUobmFtZTogc3RyaW5nKTogYW55O1xuICBnZXRJc1JlcXVpcmVkVGV4dCgpOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBNdWx0aXBsZVRleHRJdGVtTW9kZWwgZXh0ZW5kcyBCYXNlXG4gIGltcGxlbWVudHMgSVZhbGlkYXRvck93bmVyLCBJU3VydmV5RGF0YSwgSVN1cnZleUltcGwge1xuICBwcml2YXRlIGVkaXRvclZhbHVlOiBRdWVzdGlvblRleHRNb2RlbDtcbiAgcHJpdmF0ZSBkYXRhOiBJTXVsdGlwbGVUZXh0RGF0YTtcblxuICB2YWx1ZUNoYW5nZWRDYWxsYmFjazogKG5ld1ZhbHVlOiBhbnkpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IobmFtZTogYW55ID0gbnVsbCwgdGl0bGU6IHN0cmluZyA9IG51bGwpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZWRpdG9yVmFsdWUgPSB0aGlzLmNyZWF0ZUVkaXRvcihuYW1lKTtcbiAgICB0aGlzLmVkaXRvci5xdWVzdGlvblRpdGxlVGVtcGxhdGVDYWxsYmFjayA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfTtcbiAgICB0aGlzLmVkaXRvci50aXRsZUxvY2F0aW9uID0gXCJsZWZ0XCI7XG4gICAgaWYgKHRpdGxlKSB7XG4gICAgICB0aGlzLnRpdGxlID0gdGl0bGU7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwibXVsdGlwbGV0ZXh0aXRlbVwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3IuaWQ7XG4gIH1cbiAgcHVibGljIGdldE9yaWdpbmFsT2JqKCk6IEJhc2Uge1xuICAgIHJldHVybiB0aGlzLmVkaXRvcjtcbiAgfVxuICAvKipcbiAgICogVGhlIGl0ZW0gbmFtZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci5uYW1lO1xuICB9XG4gIHB1YmxpYyBzZXQgbmFtZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuZWRpdG9yLm5hbWUgPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldCBxdWVzdGlvbigpOiBRdWVzdGlvbiB7XG4gICAgcmV0dXJuIDxRdWVzdGlvbj4oPGFueT50aGlzLmRhdGEpO1xuICB9XG4gIHB1YmxpYyBnZXQgZWRpdG9yKCk6IFF1ZXN0aW9uVGV4dE1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3JWYWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlRWRpdG9yKG5hbWU6IHN0cmluZyk6IFF1ZXN0aW9uVGV4dE1vZGVsIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uVGV4dE1vZGVsKG5hbWUpO1xuICB9XG4gIHB1YmxpYyBhZGRVc2VkTG9jYWxlcyhsb2NhbGVzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgc3VwZXIuYWRkVXNlZExvY2FsZXMobG9jYWxlcyk7XG4gICAgdGhpcy5lZGl0b3IuYWRkVXNlZExvY2FsZXMobG9jYWxlcyk7XG4gIH1cbiAgcHVibGljIGxvY1N0cnNDaGFuZ2VkKCkge1xuICAgIHN1cGVyLmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgdGhpcy5lZGl0b3IubG9jU3Ryc0NoYW5nZWQoKTtcbiAgfVxuICBzZXREYXRhKGRhdGE6IElNdWx0aXBsZVRleHREYXRhKSB7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICBpZiAoISFkYXRhKSB7XG4gICAgICB0aGlzLmVkaXRvci5kZWZhdWx0VmFsdWUgPSBkYXRhLmdldEl0ZW1EZWZhdWx0VmFsdWUodGhpcy5uYW1lKTtcbiAgICAgIHRoaXMuZWRpdG9yLnNldFN1cnZleUltcGwodGhpcyk7XG4gICAgICB0aGlzLmVkaXRvci5wYXJlbnQgPSBkYXRhO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSwgdG8gbWFrZSB0aGUgaXRlbSBhIHJlcXVpcmVkLiBJZiBhIHVzZXIgZG9lc24ndCBmaWxsIHRoZSBpdGVtIHRoZW4gYSB2YWxpZGF0aW9uIGVycm9yIHdpbGwgYmUgZ2VuZXJhdGVkLlxuICAgKi9cbiAgcHVibGljIGdldCBpc1JlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci5pc1JlcXVpcmVkO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNSZXF1aXJlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmVkaXRvci5pc1JlcXVpcmVkID0gdmFsO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgaW5wdXQgdHlwZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW5wdXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yLmlucHV0VHlwZTtcbiAgfVxuICBwdWJsaWMgc2V0IGlucHV0VHlwZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuZWRpdG9yLmlucHV0VHlwZSA9IHZhbDtcbiAgfVxuICAvKipcbiAgICogSXRlbSB0aXRsZS4gSWYgaXQgaXMgZW1wdHksIHRoZSBpdGVtIG5hbWUgaXMgcmVuZGVyZWQgYXMgdGl0bGUuIFRoaXMgcHJvcGVydHkgc3VwcG9ydHMgbWFya2Rvd24uXG4gICAqIEBzZWUgbmFtZVxuICAgKi9cbiAgcHVibGljIGdldCB0aXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci50aXRsZTtcbiAgfVxuICBwdWJsaWMgc2V0IHRpdGxlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5lZGl0b3IudGl0bGUgPSB2YWw7XG4gIH1cbiAgZ2V0IGxvY1RpdGxlKCkge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci5sb2NUaXRsZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGV4dCBvciBodG1sIGZvciByZW5kZXJpbmcgdGhlIHRpdGxlLlxuICAgKi9cbiAgcHVibGljIGdldCBmdWxsVGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3IuZnVsbFRpdGxlO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSB0ZXh0IGxlbmd0aC4gSWYgaXQgaXMgLTEsIGRlZmF1bCB2YWx1ZSwgdGhlbiB0aGUgc3VydmV5IG1heFRleHRMZW5ndGggcHJvcGVydHkgd2lsbCBiZSB1c2VkLlxuICAgKiBJZiBpdCBpcyAwLCB0aGVuIHRoZSB2YWx1ZSBpcyB1bmxpbWl0ZWRcbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5tYXhUZXh0TGVuZ3RoXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heExlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci5tYXhMZW5ndGg7XG4gIH1cbiAgcHVibGljIHNldCBtYXhMZW5ndGgodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLmVkaXRvci5tYXhMZW5ndGggPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldE1heExlbmd0aCgpOiBhbnkge1xuICAgIHZhciBzdXJ2ZXkgPSB0aGlzLmdldFN1cnZleSgpO1xuICAgIHJldHVybiBIZWxwZXJzLmdldE1heExlbmd0aChcbiAgICAgIHRoaXMubWF4TGVuZ3RoLFxuICAgICAgc3VydmV5ID8gc3VydmV5Lm1heFRleHRMZW5ndGggOiAtMVxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpbnB1dCBwbGFjZSBob2xkZXIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBsYWNlSG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yLnBsYWNlSG9sZGVyO1xuICB9XG4gIHB1YmxpYyBzZXQgcGxhY2VIb2xkZXIodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVkaXRvci5wbGFjZUhvbGRlciA9IHZhbDtcbiAgfVxuICBnZXQgbG9jUGxhY2VIb2xkZXIoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci5sb2NQbGFjZUhvbGRlcjtcbiAgfVxuICAvKipcbiAgICogVGhlIGN1c3RvbSB0ZXh0IHRoYXQgd2lsbCBiZSBzaG93biBvbiByZXF1aXJlZCBlcnJvci4gVXNlIHRoaXMgcHJvcGVydHksIGlmIHlvdSBkbyBub3Qgd2FudCB0byBzaG93IHRoZSBkZWZhdWx0IHRleHQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlcXVpcmVkRXJyb3JUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yLnJlcXVpcmVkRXJyb3JUZXh0O1xuICB9XG4gIHB1YmxpYyBzZXQgcmVxdWlyZWRFcnJvclRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVkaXRvci5yZXF1aXJlZEVycm9yVGV4dCA9IHZhbDtcbiAgfVxuICBnZXQgbG9jUmVxdWlyZWRFcnJvclRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci5sb2NSZXF1aXJlZEVycm9yVGV4dDtcbiAgfVxuICAvKipcbiAgICogVGhlIGlucHV0IHNpemUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3Iuc2l6ZTtcbiAgfVxuICBwdWJsaWMgc2V0IHNpemUodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLmVkaXRvci5zaXplID0gdmFsO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBxdWVzdGlvbiB2YWxpZGF0b3JzLlxuICAgKi9cbiAgcHVibGljIGdldCB2YWxpZGF0b3JzKCk6IEFycmF5PFN1cnZleVZhbGlkYXRvcj4ge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci52YWxpZGF0b3JzO1xuICB9XG4gIHB1YmxpYyBzZXQgdmFsaWRhdG9ycyh2YWw6IEFycmF5PFN1cnZleVZhbGlkYXRvcj4pIHtcbiAgICB0aGlzLmVkaXRvci52YWxpZGF0b3JzID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXRWYWxpZGF0b3JzKCk6IEFycmF5PFN1cnZleVZhbGlkYXRvcj4ge1xuICAgIHJldHVybiB0aGlzLnZhbGlkYXRvcnM7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpdGVtIHZhbHVlLlxuICAgKi9cbiAgcHVibGljIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhID8gdGhpcy5kYXRhLmdldE11bHRpcGxlVGV4dFZhbHVlKHRoaXMubmFtZSkgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBzZXQgdmFsdWUodmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLmRhdGEgIT0gbnVsbCkge1xuICAgICAgdGhpcy5kYXRhLnNldE11bHRpcGxlVGV4dFZhbHVlKHRoaXMubmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgaXNFbXB0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3IuaXNFbXB0eSgpO1xuICB9XG4gIHB1YmxpYyBvblZhbHVlQ2hhbmdlZChuZXdWYWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMudmFsdWVDaGFuZ2VkQ2FsbGJhY2spIHRoaXMudmFsdWVDaGFuZ2VkQ2FsbGJhY2sobmV3VmFsdWUpO1xuICB9XG4gIC8vSVN1cnZleUltcGxcbiAgZ2V0U3VydmV5RGF0YSgpOiBJU3VydmV5RGF0YSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZ2V0U3VydmV5KCk6IElTdXJ2ZXkge1xuICAgIHJldHVybiB0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0U3VydmV5KCkgOiBudWxsO1xuICB9XG4gIGdldFRleHRQcm9jZXNzb3IoKTogSVRleHRQcm9jZXNzb3Ige1xuICAgIHJldHVybiB0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0VGV4dFByb2Nlc3NvcigpIDogbnVsbDtcbiAgfVxuICAvL0lTdXJ2ZXlEYXRhXG4gIGdldFZhbHVlKG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKCF0aGlzLmRhdGEpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLmRhdGEuZ2V0TXVsdGlwbGVUZXh0VmFsdWUobmFtZSk7XG4gIH1cbiAgc2V0VmFsdWUobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuZGF0YSkge1xuICAgICAgdGhpcy5kYXRhLnNldE11bHRpcGxlVGV4dFZhbHVlKG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgZ2V0VmFyaWFibGUobmFtZTogc3RyaW5nKTogYW55IHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHNldFZhcmlhYmxlKG5hbWU6IHN0cmluZywgbmV3VmFsdWU6IGFueSkge31cbiAgZ2V0Q29tbWVudChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHNldENvbW1lbnQobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogc3RyaW5nKSB7fVxuICBnZXRBbGxWYWx1ZXMoKTogYW55IHtcbiAgICBpZiAodGhpcy5kYXRhKSByZXR1cm4gdGhpcy5kYXRhLmdldEFsbFZhbHVlcygpO1xuICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICB9XG4gIGdldEZpbHRlcmVkVmFsdWVzKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWxsVmFsdWVzKCk7XG4gIH1cbiAgZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKCk6IGFueSB7XG4gICAgcmV0dXJuIHsgc3VydmV5OiB0aGlzLmdldFN1cnZleSgpIH07XG4gIH1cbiAgLy9JVmFsaWRhdG9yT3duZXJcbiAgZ2V0VmFsaWRhdG9yVGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50aXRsZTtcbiAgfVxuICBnZXQgdmFsaWRhdGVkVmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgfVxuICBzZXQgdmFsaWRhdGVkVmFsdWUodmFsOiBhbnkpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsO1xuICB9XG4gIGdldERhdGFGaWx0ZXJlZFZhbHVlcygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldEZpbHRlcmVkVmFsdWVzKCk7XG4gIH1cbiAgZ2V0RGF0YUZpbHRlcmVkUHJvcGVydGllcygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldEZpbHRlcmVkUHJvcGVydGllcygpO1xuICB9XG59XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBtdWx0aXBsZSB0ZXh0IHF1ZXN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbCBleHRlbmRzIFF1ZXN0aW9uXG4gIGltcGxlbWVudHMgSU11bHRpcGxlVGV4dERhdGEsIElQYW5lbCB7XG4gIHB1YmxpYyBzdGF0aWMgYWRkRGVmYXVsdEl0ZW1zKHF1ZXN0aW9uOiBRdWVzdGlvbk11bHRpcGxlVGV4dE1vZGVsKSB7XG4gICAgdmFyIG5hbWVzID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRNdXRsaXBsZVRleHRJdGVtcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSBxdWVzdGlvbi5hZGRJdGVtKG5hbWVzW2ldKTtcbiAgfVxuXG4gIGNvbENvdW50Q2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmNyZWF0ZU5ld0FycmF5KFwiaXRlbXNcIiwgKGl0ZW06IGFueSkgPT4ge1xuICAgICAgaXRlbS5zZXREYXRhKHRoaXMpO1xuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJpdGVtc1wiLCAoKSA9PiB7XG4gICAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLmNvbENvdW50Q2hhbmdlZENhbGxiYWNrKTtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwiY29sQ291bnRcIiwgKCkgPT4ge1xuICAgICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5jb2xDb3VudENoYW5nZWRDYWxsYmFjayk7XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcIml0ZW1TaXplXCIsICgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlSXRlbXNTaXplKCk7XG4gICAgfSk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJtdWx0aXBsZXRleHRcIjtcbiAgfVxuICBwdWJsaWMgc2V0U3VydmV5SW1wbCh2YWx1ZTogSVN1cnZleUltcGwpIHtcbiAgICBzdXBlci5zZXRTdXJ2ZXlJbXBsKHZhbHVlKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuaXRlbXNbaV0uc2V0RGF0YSh0aGlzKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldCBpc0FsbG93VGl0bGVMZWZ0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc1NpbmdsZUlucHV0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBvblN1cnZleUxvYWQoKSB7XG4gICAgdGhpcy5lZGl0b3JzT25TdXJ2ZXlMb2FkKCk7XG4gICAgc3VwZXIub25TdXJ2ZXlMb2FkKCk7XG4gICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5jb2xDb3VudENoYW5nZWRDYWxsYmFjayk7XG4gIH1cbiAgc2V0UXVlc3Rpb25WYWx1ZShuZXdWYWx1ZTogYW55LCB1cGRhdGVJc0Fuc3dlcmVkOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIHN1cGVyLnNldFF1ZXN0aW9uVmFsdWUobmV3VmFsdWUsIHVwZGF0ZUlzQW5zd2VyZWQpO1xuICAgIHRoaXMucGVyZm9ybUZvckV2ZXJ5RWRpdG9yKChpdGVtOiBNdWx0aXBsZVRleHRJdGVtTW9kZWwpOiB2b2lkID0+IHtcbiAgICAgIGl0ZW0uZWRpdG9yLnVwZGF0ZVZhbHVlRnJvbVN1cnZleShpdGVtLnZhbHVlKTtcbiAgICB9KTtcbiAgICB0aGlzLnVwZGF0ZUlzQW5zd2VyZWQoKTtcbiAgfVxuICBvblN1cnZleVZhbHVlQ2hhbmdlZChuZXdWYWx1ZTogYW55KSB7XG4gICAgc3VwZXIub25TdXJ2ZXlWYWx1ZUNoYW5nZWQobmV3VmFsdWUpO1xuICAgIHRoaXMucGVyZm9ybUZvckV2ZXJ5RWRpdG9yKChpdGVtOiBNdWx0aXBsZVRleHRJdGVtTW9kZWwpOiB2b2lkID0+IHtcbiAgICAgIGl0ZW0uZWRpdG9yLm9uU3VydmV5VmFsdWVDaGFuZ2VkKGl0ZW0udmFsdWUpO1xuICAgIH0pO1xuICB9XG4gIHByaXZhdGUgdXBkYXRlSXRlbXNTaXplKCkge1xuICAgIHRoaXMucGVyZm9ybUZvckV2ZXJ5RWRpdG9yKChpdGVtOiBNdWx0aXBsZVRleHRJdGVtTW9kZWwpOiB2b2lkID0+IHtcbiAgICAgIGl0ZW0uZWRpdG9yLnVwZGF0ZUlucHV0U2l6ZSgpO1xuICAgIH0pO1xuICB9XG4gIHByaXZhdGUgZWRpdG9yc09uU3VydmV5TG9hZCgpIHtcbiAgICB0aGlzLnBlcmZvcm1Gb3JFdmVyeUVkaXRvcigoaXRlbTogTXVsdGlwbGVUZXh0SXRlbU1vZGVsKTogdm9pZCA9PiB7XG4gICAgICBpdGVtLmVkaXRvci5vblN1cnZleUxvYWQoKTtcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIHBlcmZvcm1Gb3JFdmVyeUVkaXRvcihmdW5jOiAoaXRlbTogTXVsdGlwbGVUZXh0SXRlbU1vZGVsKSA9PiB2b2lkKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXRlbSA9IHRoaXMuaXRlbXNbaV07XG4gICAgICBpZiAoaXRlbS5lZGl0b3IpIHtcbiAgICAgICAgZnVuYyhpdGVtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIGlucHV0IGl0ZW1zLlxuICAgKi9cbiAgcHVibGljIGdldCBpdGVtcygpOiBBcnJheTxNdWx0aXBsZVRleHRJdGVtTW9kZWw+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXRlbXNcIik7XG4gIH1cbiAgcHVibGljIHNldCBpdGVtcyh2YWw6IEFycmF5PE11bHRpcGxlVGV4dEl0ZW1Nb2RlbD4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpdGVtc1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBBZGQgYSBuZXcgdGV4dCBpdGVtLlxuICAgKiBAcGFyYW0gbmFtZSBhIGl0ZW0gbmFtZVxuICAgKiBAcGFyYW0gdGl0bGUgYSBpdGVtIHRpdGxlIChvcHRpb25hbClcbiAgICovXG4gIHB1YmxpYyBhZGRJdGVtKG5hbWU6IHN0cmluZywgdGl0bGU6IHN0cmluZyA9IG51bGwpOiBNdWx0aXBsZVRleHRJdGVtTW9kZWwge1xuICAgIHZhciBpdGVtID0gdGhpcy5jcmVhdGVUZXh0SXRlbShuYW1lLCB0aXRsZSk7XG4gICAgdGhpcy5pdGVtcy5wdXNoKGl0ZW0pO1xuICAgIHJldHVybiBpdGVtO1xuICB9XG4gIHB1YmxpYyBnZXRJdGVtQnlOYW1lKG5hbWU6IHN0cmluZyk6IE11bHRpcGxlVGV4dEl0ZW1Nb2RlbCB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5pdGVtc1tpXS5uYW1lID09IG5hbWUpIHJldHVybiB0aGlzLml0ZW1zW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgYWRkQ29uZGl0aW9uT2JqZWN0c0J5Q29udGV4dChcbiAgICBvYmplY3RzOiBBcnJheTxJQ29uZGl0aW9uT2JqZWN0PixcbiAgICBjb250ZXh0OiBhbnlcbiAgKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXRlbSA9IHRoaXMuaXRlbXNbaV07XG4gICAgICBvYmplY3RzLnB1c2goe1xuICAgICAgICBuYW1lOiB0aGlzLmdldFZhbHVlTmFtZSgpICsgXCIuXCIgKyBpdGVtLm5hbWUsXG4gICAgICAgIHRleHQ6IHRoaXMucHJvY2Vzc2VkVGl0bGUgKyBcIi5cIiArIGl0ZW0uZnVsbFRpdGxlLFxuICAgICAgICBxdWVzdGlvbjogdGhpcyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0Q29uZGl0aW9uSnNvbihvcGVyYXRvcjogc3RyaW5nID0gbnVsbCwgcGF0aDogc3RyaW5nID0gbnVsbCk6IGFueSB7XG4gICAgaWYgKCFwYXRoKSByZXR1cm4gc3VwZXIuZ2V0Q29uZGl0aW9uSnNvbigpO1xuICAgIHZhciBpdGVtID0gdGhpcy5nZXRJdGVtQnlOYW1lKHBhdGgpO1xuICAgIGlmICghaXRlbSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIGpzb24gPSBuZXcgSnNvbk9iamVjdCgpLnRvSnNvbk9iamVjdChpdGVtKTtcbiAgICBqc29uW1widHlwZVwiXSA9IFwidGV4dFwiO1xuICAgIHJldHVybiBqc29uO1xuICB9XG4gIHB1YmxpYyBsb2NTdHJzQ2hhbmdlZCgpIHtcbiAgICBzdXBlci5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5pdGVtc1tpXS5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLml0ZW1zW2ldLmlzRW1wdHkoKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBjb2x1bW5zLiBJdGVtcyBhcmUgcmVuZHJlZCBpbiBvbmUgbGluZSBpZiB0aGUgdmFsdWUgaXMgMC5cbiAgICovXG4gIHB1YmxpYyBnZXQgY29sQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY29sQ291bnRcIik7XG4gIH1cbiAgcHVibGljIHNldCBjb2xDb3VudCh2YWw6IG51bWJlcikge1xuICAgIGlmICh2YWwgPCAxIHx8IHZhbCA+IDUpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb2xDb3VudFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCB0ZXh0IGlucHV0IHNpemUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGl0ZW1TaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIml0ZW1TaXplXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaXRlbVNpemUodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpdGVtU2l6ZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHJlbmRlcmVkIHJvd3MuXG4gICAqL1xuICBwdWJsaWMgZ2V0Um93cygpOiBBcnJheTxhbnk+IHtcbiAgICB2YXIgY29sQ291bnQgPSB0aGlzLmNvbENvdW50O1xuICAgIHZhciBpdGVtcyA9IHRoaXMuaXRlbXM7XG4gICAgdmFyIHJvd3MgPSBbXTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpbmRleCA9PSAwKSB7XG4gICAgICAgIHJvd3MucHVzaChbXSk7XG4gICAgICB9XG4gICAgICByb3dzW3Jvd3MubGVuZ3RoIC0gMV0ucHVzaChpdGVtc1tpXSk7XG4gICAgICBpbmRleCsrO1xuICAgICAgaWYgKGluZGV4ID49IGNvbENvdW50KSB7XG4gICAgICAgIGluZGV4ID0gMDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJvd3M7XG4gIH1cbiAgcHJpdmF0ZSBpc011bHRpcGxlSXRlbVZhbHVlQ2hhbmdpbmcgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIG9uVmFsdWVDaGFuZ2VkKCkge1xuICAgIHN1cGVyLm9uVmFsdWVDaGFuZ2VkKCk7XG4gICAgdGhpcy5vbkl0ZW1WYWx1ZUNoYW5nZWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlVGV4dEl0ZW0obmFtZTogc3RyaW5nLCB0aXRsZTogc3RyaW5nKTogTXVsdGlwbGVUZXh0SXRlbU1vZGVsIHtcbiAgICByZXR1cm4gbmV3IE11bHRpcGxlVGV4dEl0ZW1Nb2RlbChuYW1lLCB0aXRsZSk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uSXRlbVZhbHVlQ2hhbmdlZCgpIHtcbiAgICBpZiAodGhpcy5pc011bHRpcGxlSXRlbVZhbHVlQ2hhbmdpbmcpIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtVmFsdWUgPSBudWxsO1xuICAgICAgaWYgKHRoaXMudmFsdWUgJiYgdGhpcy5pdGVtc1tpXS5uYW1lIGluIHRoaXMudmFsdWUpIHtcbiAgICAgICAgaXRlbVZhbHVlID0gdGhpcy52YWx1ZVt0aGlzLml0ZW1zW2ldLm5hbWVdO1xuICAgICAgfVxuICAgICAgdGhpcy5pdGVtc1tpXS5vblZhbHVlQ2hhbmdlZChpdGVtVmFsdWUpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgZ2V0SXNSdW5uaW5nVmFsaWRhdG9ycygpOiBib29sZWFuIHtcbiAgICBpZiAoc3VwZXIuZ2V0SXNSdW5uaW5nVmFsaWRhdG9ycygpKSByZXR1cm4gdHJ1ZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLml0ZW1zW2ldLmVkaXRvci5pc1J1bm5pbmdWYWxpZGF0b3JzKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBoYXNFcnJvcnMoZmlyZUNhbGxiYWNrOiBib29sZWFuID0gdHJ1ZSwgcmVjOiBhbnkgPSBudWxsKTogYm9vbGVhbiB7XG4gICAgdmFyIHJlcyA9IGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5pdGVtc1tpXS5lZGl0b3Iub25Db21wbGV0ZWRBc3luY1ZhbGlkYXRvcnMgPSAoXG4gICAgICAgIGhhc0Vycm9yczogYm9vbGVhblxuICAgICAgKSA9PiB7XG4gICAgICAgIHRoaXMucmFpc2VPbkNvbXBsZXRlZEFzeW5jVmFsaWRhdG9ycygpO1xuICAgICAgfTtcbiAgICAgIGlmIChcbiAgICAgICAgISFyZWMgJiZcbiAgICAgICAgcmVjLmlzT25WYWx1ZUNoYW5nZWQgPT09IHRydWUgJiZcbiAgICAgICAgdGhpcy5pdGVtc1tpXS5lZGl0b3IuaXNFbXB0eSgpXG4gICAgICApXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgcmVzID0gdGhpcy5pdGVtc1tpXS5lZGl0b3IuaGFzRXJyb3JzKGZpcmVDYWxsYmFjaywgcmVjKSB8fCByZXM7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5oYXNFcnJvcnMoZmlyZUNhbGxiYWNrKSB8fCByZXM7XG4gIH1cbiAgcHVibGljIGdldEFsbEVycm9ycygpOiBBcnJheTxTdXJ2ZXlFcnJvcj4ge1xuICAgIHZhciByZXN1bHQgPSBzdXBlci5nZXRBbGxFcnJvcnMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlcnJvcnMgPSB0aGlzLml0ZW1zW2ldLmVkaXRvci5nZXRBbGxFcnJvcnMoKTtcbiAgICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdChlcnJvcnMpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHB1YmxpYyBjbGVhckVycm9ycygpIHtcbiAgICBzdXBlci5jbGVhckVycm9ycygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5pdGVtc1tpXS5lZGl0b3IuY2xlYXJFcnJvcnMoKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGdldENvbnRhaW5zRXJyb3JzKCk6IGJvb2xlYW4ge1xuICAgIHZhciByZXMgPSBzdXBlci5nZXRDb250YWluc0Vycm9ycygpO1xuICAgIGlmIChyZXMpIHJldHVybiByZXM7XG4gICAgdmFyIGl0ZW1zID0gdGhpcy5pdGVtcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaXRlbXNbaV0uZWRpdG9yLmNvbnRhaW5zRXJyb3JzKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBnZXRJc0Fuc3dlcmVkKCk6IGJvb2xlYW4ge1xuICAgIGlmICghc3VwZXIuZ2V0SXNBbnN3ZXJlZCgpKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWRpdG9yID0gdGhpcy5pdGVtc1tpXS5lZGl0b3I7XG4gICAgICBpZiAoZWRpdG9yLmlzVmlzaWJsZSAmJiAhZWRpdG9yLmlzQW5zd2VyZWQpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIGdldFByb2dyZXNzSW5mbygpOiBJUHJvZ3Jlc3NJbmZvIHtcbiAgICB2YXIgZWxlbWVudHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGVsZW1lbnRzLnB1c2godGhpcy5pdGVtc1tpXS5lZGl0b3IpO1xuICAgIH1cbiAgICByZXR1cm4gU3VydmV5RWxlbWVudC5nZXRQcm9ncmVzc0luZm9CeUVsZW1lbnRzKGVsZW1lbnRzLCB0aGlzLmlzUmVxdWlyZWQpO1xuICB9XG4gIHByb3RlY3RlZCBnZXREaXNwbGF5VmFsdWVDb3JlKGtleXNBc1RleHQ6IGJvb2xlYW4sIHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGlmICghdmFsdWUpIHJldHVybiB2YWx1ZTtcbiAgICB2YXIgcmVzID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXRlbSA9IHRoaXMuaXRlbXNbaV07XG4gICAgICB2YXIgdmFsID0gdmFsdWVbaXRlbS5uYW1lXTtcbiAgICAgIGlmIChIZWxwZXJzLmlzVmFsdWVFbXB0eSh2YWwpKSBjb250aW51ZTtcbiAgICAgIHZhciBpdGVtTmFtZSA9IGl0ZW0ubmFtZTtcbiAgICAgIGlmIChrZXlzQXNUZXh0ICYmICEhaXRlbS50aXRsZSkge1xuICAgICAgICBpdGVtTmFtZSA9IGl0ZW0udGl0bGU7XG4gICAgICB9XG4gICAgICAoPGFueT5yZXMpW2l0ZW1OYW1lXSA9IGl0ZW0uZWRpdG9yLmdldERpc3BsYXlWYWx1ZShrZXlzQXNUZXh0LCB2YWwpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIC8vSU11bHRpcGxlVGV4dERhdGFcbiAgZ2V0TXVsdGlwbGVUZXh0VmFsdWUobmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLnZhbHVlKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy52YWx1ZVtuYW1lXTtcbiAgfVxuICBzZXRNdWx0aXBsZVRleHRWYWx1ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLmlzTXVsdGlwbGVJdGVtVmFsdWVDaGFuZ2luZyA9IHRydWU7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUVtcHR5KHZhbHVlKSkge1xuICAgICAgdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgaWYgKCFuZXdWYWx1ZSkge1xuICAgICAgbmV3VmFsdWUgPSB7fTtcbiAgICB9XG4gICAgbmV3VmFsdWVbbmFtZV0gPSB2YWx1ZTtcbiAgICB0aGlzLnNldE5ld1ZhbHVlKG5ld1ZhbHVlKTtcbiAgICB0aGlzLmlzTXVsdGlwbGVJdGVtVmFsdWVDaGFuZ2luZyA9IGZhbHNlO1xuICB9XG4gIGdldEl0ZW1EZWZhdWx0VmFsdWUobmFtZTogc3RyaW5nKTogYW55IHtcbiAgICByZXR1cm4gISF0aGlzLmRlZmF1bHRWYWx1ZSA/IHRoaXMuZGVmYXVsdFZhbHVlW25hbWVdIDogbnVsbDtcbiAgfVxuICBnZXRUZXh0UHJvY2Vzc29yKCk6IElUZXh0UHJvY2Vzc29yIHtcbiAgICByZXR1cm4gdGhpcy50ZXh0UHJvY2Vzc29yO1xuICB9XG4gIGdldEFsbFZhbHVlcygpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhID8gdGhpcy5kYXRhLmdldEFsbFZhbHVlcygpIDogbnVsbDtcbiAgfVxuICBnZXRJc1JlcXVpcmVkVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnN1cnZleSA/IHRoaXMuc3VydmV5LnJlcXVpcmVkVGV4dCA6IFwiXCI7XG4gIH1cbiAgLy9JUGFuZWxcbiAgYWRkRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCwgaW5kZXg6IG51bWJlcikge31cbiAgcmVtb3ZlRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBnZXRRdWVzdGlvblRpdGxlTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJsZWZ0XCI7XG4gIH1cbiAgZ2V0UXVlc3Rpb25TdGFydEluZGV4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RhcnRJbmRleCgpO1xuICB9XG4gIGdldENoaWxkcmVuTGF5b3V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInJvd1wiO1xuICB9XG4gIGVsZW1lbnRXaWR0aENoYW5nZWQoZWw6IElFbGVtZW50KSB7fVxuICBnZXQgZWxlbWVudHMoKTogQXJyYXk8SUVsZW1lbnQ+IHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgaW5kZXhPZihlbDogSUVsZW1lbnQpOiBudW1iZXIge1xuICAgIHJldHVybiAtMTtcbiAgfVxuICBlbnN1cmVSb3dzVmlzaWJpbGl0eSgpOiB2b2lkIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbiAgcHVibGljIGdldEl0ZW1Dc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmV3IENzc0NsYXNzQnVpbGRlcigpLmFwcGVuZCh0aGlzLmNzc0NsYXNzZXMuaXRlbSlcbiAgICAgIC5hcHBlbmQodGhpcy5jc3NDbGFzc2VzLmNlbGwpLnRvU3RyaW5nKCk7XG4gIH1cbiAgcHVibGljIGdldEl0ZW1UaXRsZUNzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiBuZXcgQ3NzQ2xhc3NCdWlsZGVyKCkuYXBwZW5kKHRoaXMuY3NzQ2xhc3Nlcy5pdGVtVGl0bGUpXG4gICAgICAuYXBwZW5kKHRoaXMuY3NzQ2xhc3Nlcy5jZWxsKS50b1N0cmluZygpO1xuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwibXVsdGlwbGV0ZXh0aXRlbVwiLFxuICBbXG4gICAgXCJuYW1lXCIsXG4gICAgXCJpc1JlcXVpcmVkOmJvb2xlYW5cIixcbiAgICB7IG5hbWU6IFwicGxhY2VIb2xkZXJcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1BsYWNlSG9sZGVyXCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImlucHV0VHlwZVwiLFxuICAgICAgZGVmYXVsdDogXCJ0ZXh0XCIsXG4gICAgICBjaG9pY2VzOiBbXG4gICAgICAgIFwiY29sb3JcIixcbiAgICAgICAgXCJkYXRlXCIsXG4gICAgICAgIFwiZGF0ZXRpbWVcIixcbiAgICAgICAgXCJkYXRldGltZS1sb2NhbFwiLFxuICAgICAgICBcImVtYWlsXCIsXG4gICAgICAgIFwibW9udGhcIixcbiAgICAgICAgXCJudW1iZXJcIixcbiAgICAgICAgXCJwYXNzd29yZFwiLFxuICAgICAgICBcInJhbmdlXCIsXG4gICAgICAgIFwidGVsXCIsXG4gICAgICAgIFwidGV4dFwiLFxuICAgICAgICBcInRpbWVcIixcbiAgICAgICAgXCJ1cmxcIixcbiAgICAgICAgXCJ3ZWVrXCIsXG4gICAgICBdLFxuICAgIH0sXG4gICAgeyBuYW1lOiBcInRpdGxlXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NUaXRsZVwiIH0sXG4gICAgeyBuYW1lOiBcIm1heExlbmd0aDpudW1iZXJcIiwgZGVmYXVsdDogLTEgfSxcbiAgICB7IG5hbWU6IFwic2l6ZTpudW1iZXJcIiwgbWluVmFsdWU6IDAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInJlcXVpcmVkRXJyb3JUZXh0OnRleHRcIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NSZXF1aXJlZEVycm9yVGV4dFwiLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJ2YWxpZGF0b3JzOnZhbGlkYXRvcnNcIixcbiAgICAgIGJhc2VDbGFzc05hbWU6IFwic3VydmV5dmFsaWRhdG9yXCIsXG4gICAgICBjbGFzc05hbWVQYXJ0OiBcInZhbGlkYXRvclwiLFxuICAgIH0sXG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgTXVsdGlwbGVUZXh0SXRlbU1vZGVsKFwiXCIpO1xuICB9XG4pO1xuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcIm11bHRpcGxldGV4dFwiLFxuICBbXG4gICAgeyBuYW1lOiBcIiFpdGVtczp0ZXh0aXRlbXNcIiwgY2xhc3NOYW1lOiBcIm11bHRpcGxldGV4dGl0ZW1cIiB9LFxuICAgIHsgbmFtZTogXCJpdGVtU2l6ZTpudW1iZXJcIiwgbWluVmFsdWU6IDAgfSxcbiAgICB7IG5hbWU6IFwiY29sQ291bnQ6bnVtYmVyXCIsIGRlZmF1bHQ6IDEsIGNob2ljZXM6IFsxLCAyLCAzLCA0LCA1XSB9LFxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uTXVsdGlwbGVUZXh0TW9kZWwoXCJcIik7XG4gIH0sXG4gIFwicXVlc3Rpb25cIlxuKTtcblxuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJtdWx0aXBsZXRleHRcIiwgKG5hbWUpID0+IHtcbiAgdmFyIHEgPSBuZXcgUXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbChuYW1lKTtcbiAgUXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbC5hZGREZWZhdWx0SXRlbXMocSk7XG4gIHJldHVybiBxO1xufSk7XG4iLCJpbXBvcnQgeyBIYXNoVGFibGUsIEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4vYmFzZVwiO1xuXG5pbXBvcnQge1xuICBJRWxlbWVudCxcbiAgSVF1ZXN0aW9uLFxuICBJUGFuZWwsXG4gIElTdXJ2ZXlEYXRhLFxuICBJU3VydmV5LFxuICBJU3VydmV5SW1wbCxcbiAgSVRleHRQcm9jZXNzb3IsXG4gIElQcm9ncmVzc0luZm8sXG59IGZyb20gXCIuL2Jhc2UtaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgU3VydmV5RWxlbWVudCB9IGZyb20gXCIuL3N1cnZleS1lbGVtZW50XCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQge1xuICBUZXh0UHJlUHJvY2Vzc29yVmFsdWUsXG4gIFF1ZXN0aW9uVGV4dFByb2Nlc3Nvcixcbn0gZnJvbSBcIi4vdGV4dFByZVByb2Nlc3NvclwiO1xuaW1wb3J0IHsgUXVlc3Rpb24sIElDb25kaXRpb25PYmplY3QgfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgUGFuZWxNb2RlbCB9IGZyb20gXCIuL3BhbmVsXCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0LCBwcm9wZXJ0eSwgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgS2V5RHVwbGljYXRpb25FcnJvciB9IGZyb20gXCIuL2Vycm9yXCI7XG5pbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzXCI7XG5pbXBvcnQgeyBQYW5lbCB9IGZyb20gXCIuL2tub2Nrb3V0L2tvcGFnZVwiO1xuaW1wb3J0IHsgY29uZmlybUFjdGlvbiB9IGZyb20gXCIuL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgeyBTdXJ2ZXlFcnJvciB9IGZyb20gXCIuL3N1cnZleS1lcnJvclwiO1xuaW1wb3J0IHsgQ3NzQ2xhc3NCdWlsZGVyIH0gZnJvbSBcIi4vdXRpbHMvY3NzQ2xhc3NCdWlsZGVyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVF1ZXN0aW9uUGFuZWxEeW5hbWljRGF0YSB7XG4gIGdldEl0ZW1JbmRleChpdGVtOiBJU3VydmV5RGF0YSk6IG51bWJlcjtcbiAgZ2V0UGFuZWxJdGVtRGF0YShpdGVtOiBJU3VydmV5RGF0YSk6IGFueTtcbiAgc2V0UGFuZWxJdGVtRGF0YShpdGVtOiBJU3VydmV5RGF0YSwgbmFtZTogc3RyaW5nLCB2YWw6IGFueSk6IGFueTtcbiAgZ2V0U2hhcmVkUXVlc3Rpb25Gcm9tQXJyYXkobmFtZTogc3RyaW5nLCBwYW5lbEluZGV4OiBudW1iZXIpOiBRdWVzdGlvbjtcbiAgZ2V0U3VydmV5KCk6IElTdXJ2ZXk7XG4gIGdldFJvb3REYXRhKCk6IElTdXJ2ZXlEYXRhO1xufVxuXG5jbGFzcyBRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW1UZXh0UHJvY2Vzc29yIGV4dGVuZHMgUXVlc3Rpb25UZXh0UHJvY2Vzc29yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBkYXRhOiBJUXVlc3Rpb25QYW5lbER5bmFtaWNEYXRhLFxuICAgIHByb3RlY3RlZCBwYW5lbEl0ZW06IFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbSxcbiAgICBwcm90ZWN0ZWQgdmFyaWFibGVOYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIodmFyaWFibGVOYW1lKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IHN1cnZleSgpOiBJU3VydmV5IHtcbiAgICByZXR1cm4gdGhpcy5wYW5lbEl0ZW0uZ2V0U3VydmV5KCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBwYW5lbCgpOiBQYW5lbE1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5wYW5lbEl0ZW0ucGFuZWw7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgcGFuZWxJbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiAhIXRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRJdGVtSW5kZXgodGhpcy5wYW5lbEl0ZW0pIDogLTE7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFZhbHVlcygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnBhbmVsSXRlbS5nZXRBbGxWYWx1ZXMoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0UXVlc3Rpb25CeU5hbWUobmFtZTogc3RyaW5nKTogUXVlc3Rpb24ge1xuICAgIHZhciByZXMgPSBzdXBlci5nZXRRdWVzdGlvbkJ5TmFtZShuYW1lKTtcbiAgICBpZiAoISFyZXMpIHJldHVybiByZXM7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5wYW5lbEluZGV4O1xuICAgIHJldHVybiBpbmRleCA+IC0xXG4gICAgICA/IHRoaXMuZGF0YS5nZXRTaGFyZWRRdWVzdGlvbkZyb21BcnJheShuYW1lLCBpbmRleClcbiAgICAgIDogbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgb25DdXN0b21Qcm9jZXNzVGV4dCh0ZXh0VmFsdWU6IFRleHRQcmVQcm9jZXNzb3JWYWx1ZSk6IGJvb2xlYW4ge1xuICAgIGlmICh0ZXh0VmFsdWUubmFtZSA9PSBRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0uSW5kZXhWYXJpYWJsZU5hbWUpIHtcbiAgICAgIHZhciBpbmRleCA9IHRoaXMucGFuZWxJbmRleDtcbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgIHRleHRWYWx1ZS5pc0V4aXN0cyA9IHRydWU7XG4gICAgICAgIHRleHRWYWx1ZS52YWx1ZSA9IGluZGV4ICsgMTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRleHRWYWx1ZS5uYW1lLmluZGV4T2YoXG4gICAgICAgIFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbS5QYXJlbnRJdGVtVmFyaWFibGVOYW1lICsgXCIuXCJcbiAgICAgICkgPT0gMFxuICAgICkge1xuICAgICAgdmFyIHEgPSA8UXVlc3Rpb24+KDxhbnk+dGhpcy5kYXRhKTtcbiAgICAgIGlmICghIXEgJiYgISFxLnBhcmVudFF1ZXN0aW9uICYmICEhcS5wYXJlbnQpIHtcbiAgICAgICAgdmFyIGRhdGEgPSAoPGFueT5xLnBhcmVudCkuZGF0YTtcbiAgICAgICAgdmFyIHByb2Nlc3NvciA9IG5ldyBRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW1UZXh0UHJvY2Vzc29yKFxuICAgICAgICAgIDxJUXVlc3Rpb25QYW5lbER5bmFtaWNEYXRhPig8YW55PnEucGFyZW50UXVlc3Rpb24pLFxuICAgICAgICAgIDxRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0+ZGF0YSxcbiAgICAgICAgICBRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0uSXRlbVZhcmlhYmxlTmFtZVxuICAgICAgICApO1xuICAgICAgICB2YXIgdGV4dCA9IHRleHRWYWx1ZS5uYW1lLnJlcGxhY2UoXG4gICAgICAgICAgUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtLlBhcmVudEl0ZW1WYXJpYWJsZU5hbWUsXG4gICAgICAgICAgUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtLkl0ZW1WYXJpYWJsZU5hbWVcbiAgICAgICAgKTtcbiAgICAgICAgdmFyIHJlcyA9IHByb2Nlc3Nvci5wcm9jZXNzVmFsdWUodGV4dCwgdGV4dFZhbHVlLnJldHVybkRpc3BsYXlWYWx1ZSk7XG4gICAgICAgIHRleHRWYWx1ZS5pc0V4aXN0cyA9IHJlcy5pc0V4aXN0cztcbiAgICAgICAgdGV4dFZhbHVlLnZhbHVlID0gcmVzLnZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtIGltcGxlbWVudHMgSVN1cnZleURhdGEsIElTdXJ2ZXlJbXBsIHtcbiAgcHVibGljIHN0YXRpYyBJdGVtVmFyaWFibGVOYW1lID0gXCJwYW5lbFwiO1xuICBwdWJsaWMgc3RhdGljIFBhcmVudEl0ZW1WYXJpYWJsZU5hbWUgPSBcInBhcmVudFBhbmVsXCI7XG4gIHB1YmxpYyBzdGF0aWMgSW5kZXhWYXJpYWJsZU5hbWUgPSBcInBhbmVsSW5kZXhcIjtcbiAgcHJpdmF0ZSBwYW5lbFZhbHVlOiBQYW5lbE1vZGVsO1xuICBwcml2YXRlIGRhdGE6IElRdWVzdGlvblBhbmVsRHluYW1pY0RhdGE7XG4gIHByaXZhdGUgdGV4dFByZVByb2Nlc3NvcjogUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtVGV4dFByb2Nlc3NvcjtcbiAgY29uc3RydWN0b3IoZGF0YTogSVF1ZXN0aW9uUGFuZWxEeW5hbWljRGF0YSwgcGFuZWw6IFBhbmVsTW9kZWwpIHtcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIHRoaXMucGFuZWxWYWx1ZSA9IHBhbmVsO1xuICAgIHRoaXMudGV4dFByZVByb2Nlc3NvciA9IG5ldyBRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW1UZXh0UHJvY2Vzc29yKFxuICAgICAgZGF0YSxcbiAgICAgIHRoaXMsXG4gICAgICBRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0uSXRlbVZhcmlhYmxlTmFtZVxuICAgICk7XG4gICAgdGhpcy5zZXRTdXJ2ZXlJbXBsKCk7XG4gIH1cbiAgcHVibGljIGdldCBwYW5lbCgpOiBQYW5lbE1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5wYW5lbFZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXRTdXJ2ZXlJbXBsKCkge1xuICAgIHRoaXMucGFuZWwuc2V0U3VydmV5SW1wbCh0aGlzKTtcbiAgfVxuICBwdWJsaWMgZ2V0VmFsdWUobmFtZTogc3RyaW5nKTogYW55IHtcbiAgICB2YXIgdmFsdWVzID0gdGhpcy5nZXRBbGxWYWx1ZXMoKTtcbiAgICByZXR1cm4gdmFsdWVzW25hbWVdO1xuICB9XG4gIHB1YmxpYyBzZXRWYWx1ZShuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLmRhdGEuc2V0UGFuZWxJdGVtRGF0YSh0aGlzLCBuYW1lLCBuZXdWYWx1ZSk7XG4gIH1cbiAgZ2V0VmFyaWFibGUobmFtZTogc3RyaW5nKTogYW55IHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHNldFZhcmlhYmxlKG5hbWU6IHN0cmluZywgbmV3VmFsdWU6IGFueSkge31cbiAgcHVibGljIGdldENvbW1lbnQobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5nZXRWYWx1ZShuYW1lICsgc2V0dGluZ3MuY29tbWVudFByZWZpeCk7XG4gICAgcmV0dXJuIHJlc3VsdCA/IHJlc3VsdCA6IFwiXCI7XG4gIH1cbiAgcHVibGljIHNldENvbW1lbnQobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogc3RyaW5nLCBsb2NOb3RpZmljYXRpb246IGFueSkge1xuICAgIHRoaXMuc2V0VmFsdWUobmFtZSArIHNldHRpbmdzLmNvbW1lbnRQcmVmaXgsIG5ld1ZhbHVlKTtcbiAgfVxuICBnZXRBbGxWYWx1ZXMoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmdldFBhbmVsSXRlbURhdGEodGhpcyk7XG4gIH1cbiAgZ2V0RmlsdGVyZWRWYWx1ZXMoKTogYW55IHtcbiAgICB2YXIgdmFsdWVzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgdmFyIHN1cnZleVZhbHVlcyA9XG4gICAgICAhIXRoaXMuZGF0YSAmJiAhIXRoaXMuZGF0YS5nZXRSb290RGF0YSgpXG4gICAgICAgID8gdGhpcy5kYXRhLmdldFJvb3REYXRhKCkuZ2V0RmlsdGVyZWRWYWx1ZXMoKVxuICAgICAgICA6IHt9O1xuICAgIGZvciAodmFyIGtleSBpbiBzdXJ2ZXlWYWx1ZXMpIHtcbiAgICAgIHZhbHVlc1trZXldID0gc3VydmV5VmFsdWVzW2tleV07XG4gICAgfVxuICAgIHZhbHVlc1tRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0uSXRlbVZhcmlhYmxlTmFtZV0gPSB0aGlzLmdldEFsbFZhbHVlcygpO1xuICAgIGlmICghIXRoaXMuZGF0YSkge1xuICAgICAgdmFsdWVzW1xuICAgICAgICBRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0uSW5kZXhWYXJpYWJsZU5hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgXSA9IHRoaXMuZGF0YS5nZXRJdGVtSW5kZXgodGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cbiAgZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKCk6IGFueSB7XG4gICAgaWYgKCEhdGhpcy5kYXRhICYmICEhdGhpcy5kYXRhLmdldFJvb3REYXRhKCkpXG4gICAgICByZXR1cm4gdGhpcy5kYXRhLmdldFJvb3REYXRhKCkuZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKCk7XG4gICAgcmV0dXJuIHsgc3VydmV5OiB0aGlzLmdldFN1cnZleSgpIH07XG4gIH1cbiAgZ2V0U3VydmV5RGF0YSgpOiBJU3VydmV5RGF0YSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZ2V0U3VydmV5KCk6IElTdXJ2ZXkge1xuICAgIHJldHVybiB0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0U3VydmV5KCkgOiBudWxsO1xuICB9XG4gIGdldFRleHRQcm9jZXNzb3IoKTogSVRleHRQcm9jZXNzb3Ige1xuICAgIHJldHVybiB0aGlzLnRleHRQcmVQcm9jZXNzb3I7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uUGFuZWxEeW5hbWljVGVtcGxhdGVTdXJ2ZXlJbXBsIGltcGxlbWVudHMgSVN1cnZleUltcGwge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZGF0YTogSVF1ZXN0aW9uUGFuZWxEeW5hbWljRGF0YSkge31cbiAgZ2V0U3VydmV5RGF0YSgpOiBJU3VydmV5RGF0YSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZ2V0U3VydmV5KCk6IElTdXJ2ZXkge1xuICAgIHJldHVybiB0aGlzLmRhdGEuZ2V0U3VydmV5KCk7XG4gIH1cbiAgZ2V0VGV4dFByb2Nlc3NvcigpOiBJVGV4dFByb2Nlc3NvciB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIHBhbmVsIGR5bWFuaWMgcXVlc3Rpb24uIFlvdSBzZXR1cCB0aGUgdGVtcGxhdGUgcGFuZWwsIGJ1dCBhZGRpbmcgZWxlbWVudHMgKGFueSBxdWVzdGlvbiBvciBhIHBhbmVsKSBhbmQgYXNzaWduIGEgdGV4dCB0byBpdCdzIHRpdGxlLCBhbmQgdGhpcyBwYW5lbCB3aWxsIGJlIHVzZWQgYXMgYSB0ZW1wbGF0ZSBvbiBjcmVhdGluZyBkeW5hbWljIHBhbmVscy4gVGhlIG51bWJlciBvZiBwYW5lbHMgaXMgZGVmaW5lZCBieSBwYW5lbENvdW50IHByb3BlcnR5LlxuICogQW4gZW5kLXVzZXIgbWF5IGR5bmFtaWNhbGx5IGFkZC9yZW1vdmUgcGFuZWxzLCB1bmxlc3MgeW91IGZvcmJpZGRlbiB0aGlzLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbCBleHRlbmRzIFF1ZXN0aW9uXG4gIGltcGxlbWVudHMgSVF1ZXN0aW9uUGFuZWxEeW5hbWljRGF0YSB7XG4gIHByaXZhdGUgdGVtcGxhdGVWYWx1ZTogUGFuZWxNb2RlbDtcbiAgcHJpdmF0ZSBsb2FkaW5nUGFuZWxDb3VudDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBpc1ZhbHVlQ2hhbmdpbmdJbnRlcm5hbGx5OiBib29sZWFuO1xuICBwcml2YXRlIGNoYW5naW5nVmFsdWVRdWVzdGlvbjogUXVlc3Rpb247XG4gIHByaXZhdGUgY3VycmVudEluZGV4VmFsdWU6IG51bWJlciA9IC0xO1xuXG4gIHJlbmRlck1vZGVDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG4gIHBhbmVsQ291bnRDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG4gIGN1cnJlbnRJbmRleENoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmNyZWF0ZU5ld0FycmF5KFwicGFuZWxzXCIpO1xuICAgIHRoaXMudGVtcGxhdGVWYWx1ZSA9IHRoaXMuY3JlYXRlQW5kU2V0dXBOZXdQYW5lbE9iamVjdCgpO1xuICAgIHRoaXMudGVtcGxhdGUucmVuZGVyV2lkdGggPSBcIjEwMCVcIjtcbiAgICB0aGlzLnRlbXBsYXRlLnNlbGVjdGVkRWxlbWVudEluRGVzaWduID0gdGhpcztcblxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnRlbXBsYXRlLmFkZEVsZW1lbnRDYWxsYmFjayA9IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgIHNlbGYuYWRkT25Qcm9wZXJ0eUNoYW5nZWRDYWxsYmFjayhlbGVtZW50KTtcbiAgICAgIHNlbGYucmVidWlsZFBhbmVscygpO1xuICAgIH07XG4gICAgdGhpcy50ZW1wbGF0ZS5yZW1vdmVFbGVtZW50Q2FsbGJhY2sgPSBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICBzZWxmLnJlYnVpbGRQYW5lbHMoKTtcbiAgICB9O1xuXG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImNvbmZpcm1EZWxldGVUZXh0XCIsIHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIsIHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJwYW5lbEFkZFRleHRcIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInBhbmVsUmVtb3ZlVGV4dFwiLCB0aGlzKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwicGFuZWxQcmV2VGV4dFwiLCB0aGlzKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwicGFuZWxOZXh0VGV4dFwiLCB0aGlzKTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwicGFuZWxzU3RhdGVcIiwgZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLnNldFBhbmVsc1N0YXRlKCk7XG4gICAgfSk7XG4gIH1cbiAgcHVibGljIGdldCBoYXNTaW5nbGVJbnB1dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIHNldFN1cnZleUltcGwodmFsdWU6IElTdXJ2ZXlJbXBsKSB7XG4gICAgc3VwZXIuc2V0U3VydmV5SW1wbCh2YWx1ZSk7XG4gICAgdGhpcy5zZXRUZW1wbGF0ZVBhbmVsU3VydmV5SW1wbCgpO1xuICAgIHRoaXMuc2V0UGFuZWxzU3VydmV5SW1wbCgpO1xuICB9XG4gIHByaXZhdGUgYXNzaWduT25Qcm9wZXJ0eUNoYW5nZWRUb1RlbXBsYXRlKCkge1xuICAgIHZhciBlbGVtZW50cyA9IHRoaXMudGVtcGxhdGUuZWxlbWVudHM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5hZGRPblByb3BlcnR5Q2hhbmdlZENhbGxiYWNrKGVsZW1lbnRzW2ldKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBhZGRPblByb3BlcnR5Q2hhbmdlZENhbGxiYWNrKGVsZW1lbnQ6IElFbGVtZW50KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICg8QmFzZT4oPGFueT5lbGVtZW50KSkub25Qcm9wZXJ0eUNoYW5nZWQuYWRkKGZ1bmN0aW9uKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICAgIHNlbGYub25UZW1wbGF0ZUVsZW1lbnRQcm9wZXJ0eUNoYW5nZWQoZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgfSk7XG4gICAgaWYgKGVsZW1lbnQuaXNQYW5lbCkge1xuICAgICAgKDxQYW5lbE1vZGVsPig8YW55PmVsZW1lbnQpKS5hZGRFbGVtZW50Q2FsbGJhY2sgPSBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgIHNlbGYuYWRkT25Qcm9wZXJ0eUNoYW5nZWRDYWxsYmFjayhlbGVtZW50KTtcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIHByaXZhdGUgb25UZW1wbGF0ZUVsZW1lbnRQcm9wZXJ0eUNoYW5nZWQoZWxlbWVudDogYW55LCBvcHRpb25zOiBhbnkpIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbiB8fCB0aGlzLmlzRGVzaWduTW9kZSB8fCB0aGlzLnBhbmVscy5sZW5ndGggPT0gMClcbiAgICAgIHJldHVybjtcbiAgICB2YXIgcHJvcGVydHkgPSBTZXJpYWxpemVyLmZpbmRQcm9wZXJ0eShlbGVtZW50LmdldFR5cGUoKSwgb3B0aW9ucy5uYW1lKTtcbiAgICBpZiAoIXByb3BlcnR5KSByZXR1cm47XG4gICAgdmFyIHBhbmVscyA9IHRoaXMucGFuZWxzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcXVlc3Rpb24gPSBwYW5lbHNbaV0uZ2V0UXVlc3Rpb25CeU5hbWUoZWxlbWVudC5uYW1lKTtcbiAgICAgIGlmICghIXF1ZXN0aW9uICYmICg8YW55PnF1ZXN0aW9uKVtvcHRpb25zLm5hbWVdICE9PSBvcHRpb25zLm5ld1ZhbHVlKSB7XG4gICAgICAgICg8YW55PnF1ZXN0aW9uKVtvcHRpb25zLm5hbWVdID0gb3B0aW9ucy5uZXdWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJwYW5lbGR5bmFtaWNcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzQ29tcG9zaXRlUXVlc3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIGNsZWFyT25EZWxldGluZ0NvbnRhaW5lcigpIHtcbiAgICB0aGlzLnBhbmVscy5mb3JFYWNoKChwYW5lbCkgPT4ge1xuICAgICAgcGFuZWwuY2xlYXJPbkRlbGV0aW5nQ29udGFpbmVyKCk7XG4gICAgfSk7XG4gIH1cbiAgcHVibGljIGdldCBpc0FsbG93VGl0bGVMZWZ0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgcmVtb3ZlRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlLnJlbW92ZUVsZW1lbnQoZWxlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRlbXBsYXRlIFBhbmVsLiBUaGlzIHBhbmVsIGlzIHVzZWQgYXMgYSB0ZW1wbGF0ZSBvbiBjcmVhdGlnbiBkeW5hbWljIHBhbmVsc1xuICAgKiBAc2VlICB0ZW1wbGF0ZUVsZW1lbnRzXG4gICAqIEBzZWUgdGVtcGxhdGVUaXRsZVxuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICovXG4gIHB1YmxpYyBnZXQgdGVtcGxhdGUoKTogUGFuZWxNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVWYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0UGFuZWwoKTogSVBhbmVsIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZTtcbiAgfVxuICAvKipcbiAgICogVGhlIHRlbXBsYXRlIFBhbmVsIGVsZW1lbnRzLCBxdWVzdGlvbnMgYW5kIHBhbmVscy5cbiAgICogQHNlZSAgdGVtcGxhdGVFbGVtZW50c1xuICAgKiBAc2VlIHRlbXBsYXRlXG4gICAqIEBzZWUgcGFuZWxDb3VudFxuICAgKi9cbiAgcHVibGljIGdldCB0ZW1wbGF0ZUVsZW1lbnRzKCk6IEFycmF5PElFbGVtZW50PiB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGUuZWxlbWVudHM7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSB0ZW1wbGF0ZSBQYW5lbCB0aXRsZSBwcm9wZXJ0eS5cbiAgICogQHNlZSAgdGVtcGxhdGVFbGVtZW50c1xuICAgKiBAc2VlIHRlbXBsYXRlXG4gICAqIEBzZWUgcGFuZWxDb3VudFxuICAgKi9cbiAgcHVibGljIGdldCB0ZW1wbGF0ZVRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGUudGl0bGU7XG4gIH1cbiAgcHVibGljIHNldCB0ZW1wbGF0ZVRpdGxlKG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnRlbXBsYXRlLnRpdGxlID0gbmV3VmFsdWU7XG4gIH1cbiAgZ2V0IGxvY1RlbXBsYXRlVGl0bGUoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlLmxvY1RpdGxlO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgdGVtcGxhdGUgUGFuZWwgZGVzY3JpcHRpb24gcHJvcGVydHkuXG4gICAqIEBzZWUgIHRlbXBsYXRlRWxlbWVudHNcbiAgICogQHNlZSB0ZW1wbGF0ZVxuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICogQHNlZSB0ZW1wbGF0ZVRpdGxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRlbXBsYXRlRGVzY3JpcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZS5kZXNjcmlwdGlvbjtcbiAgfVxuICBwdWJsaWMgc2V0IHRlbXBsYXRlRGVzY3JpcHRpb24obmV3VmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMudGVtcGxhdGUuZGVzY3JpcHRpb24gPSBuZXdWYWx1ZTtcbiAgfVxuICBnZXQgbG9jVGVtcGxhdGVEZXNjcmlwdGlvbigpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGUubG9jRGVzY3JpcHRpb247XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGl0ZW1zKCk6IEFycmF5PElTdXJ2ZXlEYXRhPiB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlcy5wdXNoKHRoaXMucGFuZWxzW2ldLmRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgYXJyYXkgb2YgZHluYW1pYyBwYW5lbHMgY3JlYXRlZCBiYXNlZCBvbiBwYW5lbCB0ZW1wbGF0ZVxuICAgKiBAc2VlIHRlbXBsYXRlXG4gICAqIEBzZWUgcGFuZWxDb3VudFxuICAgKi9cbiAgcHVibGljIGdldCBwYW5lbHMoKTogQXJyYXk8UGFuZWxNb2RlbD4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJwYW5lbHNcIik7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpbmRleCBvZiBjdXJyZW50IGFjdGl2ZSBkeW5hbWljYWwgcGFuZWwgd2hlbiB0aGUgcmVuZGVyTW9kZSBpcyBub3QgXCJsaXN0XCIuIElmIHRoZXJlIGlzIG5vIGR5bWFtaWMgcGFuZWwgKHBhbmVsQ291bnQgPSAwKSBvciByZW5kZXJNb2RlIGVxdWFscyBcImxpc3RcIiBpdCByZXR1cm5zIC0xLCBvdGhlcndpc2UgaXQgcmV0dXJucyBhIHZhbHVlIGZyb20gMCB0byBwYW5lbENvdW50IC0gMS5cbiAgICogQHNlZSBjdXJyZW50UGFuZWxcbiAgICogQHNlZSBwYW5lbHNcbiAgICogQHNlZSBwYW5lbENvdW50XG4gICAqIEBzZWUgcmVuZGVyTW9kZVxuICAgKi9cbiAgcHVibGljIGdldCBjdXJyZW50SW5kZXgoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5pc1JlbmRlck1vZGVMaXN0KSByZXR1cm4gLTE7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSByZXR1cm4gMDtcbiAgICBpZiAodGhpcy5jdXJyZW50SW5kZXhWYWx1ZSA8IDAgJiYgdGhpcy5wYW5lbENvdW50ID4gMCkge1xuICAgICAgdGhpcy5jdXJyZW50SW5kZXhWYWx1ZSA9IDA7XG4gICAgfVxuICAgIGlmICh0aGlzLmN1cnJlbnRJbmRleFZhbHVlID49IHRoaXMucGFuZWxDb3VudCkge1xuICAgICAgdGhpcy5jdXJyZW50SW5kZXhWYWx1ZSA9IHRoaXMucGFuZWxDb3VudCAtIDE7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRJbmRleFZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgY3VycmVudEluZGV4KHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudEluZGV4VmFsdWUgIT09IHZhbCkge1xuICAgICAgaWYgKHZhbCA+PSB0aGlzLnBhbmVsQ291bnQpIHZhbCA9IHRoaXMucGFuZWxDb3VudCAtIDE7XG4gICAgICB0aGlzLmN1cnJlbnRJbmRleFZhbHVlID0gdmFsO1xuICAgICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5jdXJyZW50SW5kZXhDaGFuZ2VkQ2FsbGJhY2spO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgYWN0aXZlIGR5bmFtaWNhbCBwYW5lbCB3aGVuIHRoZSByZW5kZXJNb2RlIGlzIG5vdCBcImxpc3RcIi4gSWYgdGhlcmUgaXMgbm8gZHltYW1pYyBwYW5lbCAocGFuZWxDb3VudCA9IDApIG9yIHJlbmRlck1vZGUgZXF1YWxzIFwibGlzdFwiIGl0IHJldHVybnMgbnVsbC5cbiAgICogQHNlZSBjdXJyZW5JbmRleFxuICAgKiBAc2VlIHBhbmVsc1xuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICogQHNlZSByZW5kZXJNb2RlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGN1cnJlbnRQYW5lbCgpOiBQYW5lbE1vZGVsIHtcbiAgICB2YXIgaW5kZXggPSB0aGlzLmN1cnJlbnRJbmRleDtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMucGFuZWxzLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMucGFuZWxzW2luZGV4XTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIHRydWUsIHRvIHNob3cgYSBjb25maXJtYXRpb24gZGlhbG9nIG9uIHJlbW92aW5nIGEgcGFuZWxcbiAgICogQHNlZSBDb25maXJtRGVsZXRlVGV4dFxuICAgKi9cbiAgcHVibGljIGdldCBjb25maXJtRGVsZXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb25maXJtRGVsZXRlXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbmZpcm1EZWxldGUodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29uZmlybURlbGV0ZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gYSBxdWVzdGlvbiBuYW1lIHVzZWQgaW4gdGhlIHRlbXBsYXRlIHBhbmVsIGFuZCB0aGUgbGlicmFyeSBzaG93cyBkdXBsaWNhdGlvbiBlcnJvciwgaWYgdGhlcmUgYXJlIHNhbWUgdmFsdWVzIGluIGRpZmZlcmVudCBwYW5lbHMgb2YgdGhpcyBxdWVzdGlvbi5cbiAgICogQHNlZSBrZXlEdXBsaWNhdGlvbkVycm9yXG4gICAqL1xuICBwdWJsaWMgZ2V0IGtleU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwia2V5TmFtZVwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGtleU5hbWUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJrZXlOYW1lXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB0ZXh0IHNob3dpbmcgaW4gdGhlIGNvbmZpcm1hdGlvbiBkZWxldGUgZGlhbG9nIG9uIHJlbW92aW5nIGEgcGFuZWwuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbmZpcm1EZWxldGVUZXh0KCkge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwiY29uZmlybURlbGV0ZVRleHRcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjb25maXJtRGVsZXRlXCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbmZpcm1EZWxldGVUZXh0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb25maXJtRGVsZXRlVGV4dFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NDb25maXJtRGVsZXRlVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJjb25maXJtRGVsZXRlVGV4dFwiKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGR1cGxpY2F0aW9uIHZhbHVlIGVycm9yIHRleHQuIFNldCBpdCB0byBzaG93IHRoZSB0ZXh0IGRpZmZlcmVudCBmcm9tIHRoZSBkZWZhdWx0LlxuICAgKiBAc2VlIGtleU5hbWVcbiAgICovXG4gIHB1YmxpYyBnZXQga2V5RHVwbGljYXRpb25FcnJvcigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcImtleUR1cGxpY2F0aW9uRXJyb3JcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IGtleUR1cGxpY2F0aW9uRXJyb3IodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImtleUR1cGxpY2F0aW9uRXJyb3JcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jS2V5RHVwbGljYXRpb25FcnJvcigpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgcHJldmlvdXMgYnV0dG9uIHRleHQuIFByZXZpb3VzIGJ1dHRvbiBzaG93cyB0aGUgcHJldmlvdXMgcGFuZWwsIGNoYW5nZSB0aGUgY3VycmVudFBhbmVsLCB3aGVuIHRoZSByZW5kZXJNb2RlIGRvZXNuJ3QgZXF1YWwgdG8gXCJsaXN0XCIuXG4gICAqIEBzZWUgY3VycmVudFBhbmVsXG4gICAqIEBzZWUgY3VycmVudEluZGV4XG4gICAqIEBzZWUgcmVuZGVyTW9kZVxuICAgKi9cbiAgcHVibGljIGdldCBwYW5lbFByZXZUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJwYW5lbFByZXZUZXh0XCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicGFnZVByZXZUZXh0XCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBhbmVsUHJldlRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInBhbmVsUHJldlRleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jUGFuZWxQcmV2VGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJwYW5lbFByZXZUZXh0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgbmV4dCBidXR0b24gdGV4dC4gTmV4dCBidXR0b24gc2hvd3MgdGhlIG5leHQgcGFuZWwsIGNoYW5nZSB0aGUgY3VycmVudFBhbmVsLCB3aGVuIHRoZSByZW5kZXJNb2RlIGRvZXNuJ3QgZXF1YWwgdG8gXCJsaXN0XCIuXG4gICAqIEBzZWUgY3VycmVudFBhbmVsXG4gICAqIEBzZWUgY3VycmVudEluZGV4XG4gICAqIEBzZWUgcmVuZGVyTW9kZVxuICAgKi9cbiAgcHVibGljIGdldCBwYW5lbE5leHRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJwYW5lbE5leHRUZXh0XCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicGFnZU5leHRUZXh0XCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBhbmVsTmV4dFRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInBhbmVsTmV4dFRleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jUGFuZWxOZXh0VGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJwYW5lbE5leHRUZXh0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYWRkIHBhbmVsIGJ1dHRvbiB0ZXh0LlxuICAgKi9cbiAgcHVibGljIGdldCBwYW5lbEFkZFRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJwYW5lbEFkZFRleHRcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJhZGRQYW5lbFwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBwYW5lbEFkZFRleHQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicGFuZWxBZGRUZXh0XCIsIHZhbHVlKTtcbiAgfVxuICBnZXQgbG9jUGFuZWxBZGRUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInBhbmVsQWRkVGV4dFwiKTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHJlbW92ZSBwYW5lbCBidXR0b24gdGV4dC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcGFuZWxSZW1vdmVUZXh0KCkge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwicGFuZWxSZW1vdmVUZXh0XCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicmVtb3ZlUGFuZWxcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgcGFuZWxSZW1vdmVUZXh0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJwYW5lbFJlbW92ZVRleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jUGFuZWxSZW1vdmVUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInBhbmVsUmVtb3ZlVGV4dFwiKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIHdoZW4gdGhlIHJlbmRlck1vZGUgZXF1YWxzIHRvIFwicHJvZ3Jlc3NUb3BcIiBvciBcInByb2dyZXNzVG9wQm90dG9tXCJcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNQcm9ncmVzc1RvcFNob3dpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyTW9kZSA9PT0gXCJwcm9ncmVzc1RvcFwiIHx8IHRoaXMucmVuZGVyTW9kZSA9PT0gXCJwcm9ncmVzc1RvcEJvdHRvbVwiO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgcmVuZGVyTW9kZSBlcXVhbHMgdG8gXCJwcm9ncmVzc0JvdHRvbVwiIG9yIFwicHJvZ3Jlc3NUb3BCb3R0b21cIlxuICAgKi9cbiAgcHVibGljIGdldCBpc1Byb2dyZXNzQm90dG9tU2hvd2luZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJNb2RlID09PSBcInByb2dyZXNzQm90dG9tXCIgfHwgdGhpcy5yZW5kZXJNb2RlID09PSBcInByb2dyZXNzVG9wQm90dG9tXCI7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSB3aGVuIGN1cnJlbnRJbmRleCBpcyBtb3JlIHRoYW4gMC5cbiAgICogQHNlZSBjdXJyZW5JbmRleFxuICAgKiBAc2VlIGN1cnJlblBhbmVsXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzUHJldkJ1dHRvblNob3dpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudEluZGV4ID4gMDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIHdoZW4gY3VycmVudEluZGV4IGlzIG1vcmUgdGhhbiBvciBlcXVhbCAwIGFuZCBsZXNzIHRoYW4gcGFuZWxDb3VudCAtIDEuXG4gICAqIEBzZWUgY3VycmVuSW5kZXhcbiAgICogQHNlZSBjdXJyZW5QYW5lbFxuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNOZXh0QnV0dG9uU2hvd2luZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50SW5kZXggPj0gMCAmJiB0aGlzLmN1cnJlbnRJbmRleCA8IHRoaXMucGFuZWxDb3VudCAtIDE7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSB3aGVuIHNob3dSYW5nZUluUHJvZ3Jlc3MgZXF1YWxzIHRvIHRydWUsIHJlbmRlck1vZGUgZG9lc24ndCBlcXVhbCB0byBcImxpc3RcIiBhbmQgcGFuZWxDb3VudCBpcyA+PSAyLlxuICAgKi9cbiAgcHVibGljIGdldCBpc1JhbmdlU2hvd2luZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5zaG93UmFuZ2VJblByb2dyZXNzICYmIHRoaXMuY3VycmVudEluZGV4ID49IDAgJiYgdGhpcy5wYW5lbENvdW50ID4gMVxuICAgICk7XG4gIH1cbiAgcHVibGljIGdldEVsZW1lbnRzSW5EZXNpZ24oaW5jbHVkZUhpZGRlbjogYm9vbGVhbiA9IGZhbHNlKTogQXJyYXk8SUVsZW1lbnQ+IHtcbiAgICByZXR1cm4gaW5jbHVkZUhpZGRlbiA/IFt0aGlzLnRlbXBsYXRlXSA6IHRoaXMudGVtcGxhdGVFbGVtZW50cztcbiAgfVxuICBwcml2YXRlIGlzQWRkaW5nTmV3UGFuZWxzOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgYWRkaW5nTmV3UGFuZWxzVmFsdWU6IGFueTtcbiAgcHJpdmF0ZSBpc05ld1BhbmVsc1ZhbHVlQ2hhbmdlZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBwcmVwYXJlVmFsdWVGb3JQYW5lbENyZWF0aW5nKCkge1xuICAgIHRoaXMuYWRkaW5nTmV3UGFuZWxzVmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgIHRoaXMuaXNBZGRpbmdOZXdQYW5lbHMgPSB0cnVlO1xuICAgIHRoaXMuaXNOZXdQYW5lbHNWYWx1ZUNoYW5nZWQgPSBmYWxzZTtcbiAgfVxuICBwcml2YXRlIHNldFZhbHVlQWZ0ZXJQYW5lbHNDcmVhdGluZygpIHtcbiAgICB0aGlzLmlzQWRkaW5nTmV3UGFuZWxzID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuaXNOZXdQYW5lbHNWYWx1ZUNoYW5nZWQpIHtcbiAgICAgIHRoaXMuaXNWYWx1ZUNoYW5naW5nSW50ZXJuYWxseSA9IHRydWU7XG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy5hZGRpbmdOZXdQYW5lbHNWYWx1ZTtcbiAgICAgIHRoaXMuaXNWYWx1ZUNoYW5naW5nSW50ZXJuYWxseSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgZ2V0VmFsdWVDb3JlKCkge1xuICAgIHJldHVybiB0aGlzLmlzQWRkaW5nTmV3UGFuZWxzXG4gICAgICA/IHRoaXMuYWRkaW5nTmV3UGFuZWxzVmFsdWVcbiAgICAgIDogc3VwZXIuZ2V0VmFsdWVDb3JlKCk7XG4gIH1cbiAgcHJvdGVjdGVkIHNldFZhbHVlQ29yZShuZXdWYWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuaXNBZGRpbmdOZXdQYW5lbHMpIHtcbiAgICAgIHRoaXMuaXNOZXdQYW5lbHNWYWx1ZUNoYW5nZWQgPSB0cnVlO1xuICAgICAgdGhpcy5hZGRpbmdOZXdQYW5lbHNWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdXBlci5zZXRWYWx1ZUNvcmUobmV3VmFsdWUpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gZ2V0L3NldCB0aGUgbnVtYmVyIG9mIGR5bmFtaWMgcGFuZWxzLlxuICAgKiBAc2VlIHRlbXBsYXRlXG4gICAqIEBzZWUgbWluUGFuZWxDb3VudFxuICAgKiBAc2VlIG1heFBhbmVsQ291bnRcbiAgICogQHNlZSBhZGRQYW5lbFxuICAgKiBAc2VlIHJlbW92ZVBhbmVsXG4gICAqIEBzZWUgcmVtb3ZlUGFuZWxVSVxuICAgKi9cbiAgcHVibGljIGdldCBwYW5lbENvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuaXNMb2FkaW5nRnJvbUpzb24gfHwgdGhpcy5pc0Rlc2lnbk1vZGVcbiAgICAgID8gdGhpcy5sb2FkaW5nUGFuZWxDb3VudFxuICAgICAgOiB0aGlzLnBhbmVscy5sZW5ndGg7XG4gIH1cbiAgcHVibGljIHNldCBwYW5lbENvdW50KHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKHZhbCA8IDApIHJldHVybjtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbiB8fCB0aGlzLmlzRGVzaWduTW9kZSkge1xuICAgICAgdGhpcy5sb2FkaW5nUGFuZWxDb3VudCA9IHZhbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHZhbCA9PSB0aGlzLnBhbmVscy5sZW5ndGggfHwgdGhpcy5pc0Rlc2lnbk1vZGUpIHJldHVybjtcbiAgICB0aGlzLnVwZGF0ZUJpbmRpbmdzKFwicGFuZWxDb3VudFwiLCB2YWwpO1xuICAgIHRoaXMucHJlcGFyZVZhbHVlRm9yUGFuZWxDcmVhdGluZygpO1xuICAgIGZvciAobGV0IGkgPSB0aGlzLnBhbmVsQ291bnQ7IGkgPCB2YWw7IGkrKykge1xuICAgICAgdmFyIHBhbmVsID0gdGhpcy5jcmVhdGVOZXdQYW5lbCgpO1xuICAgICAgdGhpcy5wYW5lbHMucHVzaChwYW5lbCk7XG4gICAgICBpZiAodGhpcy5yZW5kZXJNb2RlID09IFwibGlzdFwiICYmIHRoaXMucGFuZWxzU3RhdGUgIT0gXCJkZWZhdWx0XCIpIHtcbiAgICAgICAgaWYgKHRoaXMucGFuZWxzU3RhdGUgPT09IFwiZXhwYW5kXCIpIHtcbiAgICAgICAgICBwYW5lbC5leHBhbmQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoISFwYW5lbC50aXRsZSkge1xuICAgICAgICAgICAgcGFuZWwuY29sbGFwc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHZhbCA8IHRoaXMucGFuZWxDb3VudCkgdGhpcy5wYW5lbHMuc3BsaWNlKHZhbCwgdGhpcy5wYW5lbENvdW50IC0gdmFsKTtcbiAgICB0aGlzLnNldFZhbHVlQWZ0ZXJQYW5lbHNDcmVhdGluZygpO1xuICAgIHRoaXMuc2V0VmFsdWVCYXNlZE9uUGFuZWxDb3VudCgpO1xuICAgIHRoaXMucmVSdW5Db25kaXRpb24oKTtcbiAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnBhbmVsQ291bnRDaGFuZ2VkQ2FsbGJhY2spO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBhbGxvdyB0aGUgZW5kLXVzZXIgdG8gY29sbGFwc2UvZXhwYW5kIHRoZSBwYW5lbHMuIEl0IHdvcmtzIG9ubHkgaWYgdGhlIHJlbmRlck1vZGUgcHJvcGVydHkgZXF1YWxzIHRvIFwibGlzdFwiIGFuZCB0ZW1wbGF0ZVRpdGxlIHByb3BlcnR5IGlzIG5vdCBlbXB0eS4gVGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIGF2YWlsYWJsZTpcbiAgICogPGJyLz4gZGVmYXVsdCAtIHRoZSBkZWZhdWx0IHZhbHVlLiBVc2VyIGNhbid0IGNvbGxhcHNlL2V4cGFuZCBwYW5lbHNcbiAgICogPGJyLz4gZXhwYW5kZWQgLSBVc2VyIGNhbiBjb2xsYXBzZS9leHBhbmQgcGFuZWxzIGFuZCBhbGwgcGFuZWxzIGFyZSBleHBhbmRlZCBieSBkZWZhdWx0XG4gICAqIDxici8+IGNvbGxhcHNlZCAtIFVzZXIgY2FuIGNvbGxhcHNlL2V4cGFuZCBwYW5lbHMgYW5kIGFsbCBwYW5lbHMgYXJlIGNvbGxhcHNlZCBieSBkZWZhdWx0XG4gICAqIDxici8+IGZpcnN0RXhwYW5kZWQgLSBVc2VyIGNhbiBjb2xsYXBzZS9leHBhbmQgcGFuZWxzLiBUaGUgZmlyc3QgcGFuZWwgaXMgZXhwYW5kZWQgYW5kIG90aGVycyBhcmUgY29sbGFwc2VkXG4gICAqIEBzZWUgcmVuZGVyTW9kZVxuICAgKiBAc2VlIHRlbXBsYXRlVGl0bGVcbiAgICovXG4gIHB1YmxpYyBnZXQgcGFuZWxzU3RhdGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicGFuZWxzU3RhdGVcIik7XG4gIH1cbiAgcHVibGljIHNldCBwYW5lbHNTdGF0ZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInBhbmVsc1N0YXRlXCIsIHZhbCk7XG4gIH1cbiAgcHJpdmF0ZSBzZXRUZW1wbGF0ZVBhbmVsU3VydmV5SW1wbCgpIHtcbiAgICB0aGlzLnRlbXBsYXRlLnNldFN1cnZleUltcGwoXG4gICAgICB0aGlzLmlzRGVzaWduTW9kZVxuICAgICAgICA/IHRoaXMuc3VydmV5SW1wbFxuICAgICAgICA6IG5ldyBRdWVzdGlvblBhbmVsRHluYW1pY1RlbXBsYXRlU3VydmV5SW1wbCh0aGlzKVxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBzZXRQYW5lbHNTdXJ2ZXlJbXBsKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwYW5lbCA9IHRoaXMucGFuZWxzW2ldO1xuICAgICAgaWYgKHBhbmVsID09IHRoaXMudGVtcGxhdGUpIGNvbnRpbnVlO1xuICAgICAgcGFuZWwuc2V0U3VydmV5SW1wbCg8UXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtPnBhbmVsLmRhdGEpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHNldFBhbmVsc1N0YXRlKCkge1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSB8fCB0aGlzLnJlbmRlck1vZGUgIT0gXCJsaXN0XCIgfHwgIXRoaXMudGVtcGxhdGVUaXRsZSlcbiAgICAgIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc3RhdGUgPSB0aGlzLnBhbmVsc1N0YXRlO1xuICAgICAgaWYgKHN0YXRlID09PSBcImZpcnN0RXhwYW5kZWRcIikge1xuICAgICAgICBzdGF0ZSA9IGkgPT09IDAgPyBcImV4cGFuZGVkXCIgOiBcImNvbGxhcHNlZFwiO1xuICAgICAgfVxuICAgICAgdGhpcy5wYW5lbHNbaV0uc3RhdGUgPSBzdGF0ZTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBzZXRWYWx1ZUJhc2VkT25QYW5lbENvdW50KCkge1xuICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgaWYgKCF2YWx1ZSB8fCAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHZhbHVlID0gW107XG4gICAgaWYgKHZhbHVlLmxlbmd0aCA9PSB0aGlzLnBhbmVsQ291bnQpIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gdmFsdWUubGVuZ3RoOyBpIDwgdGhpcy5wYW5lbENvdW50OyBpKyspIHZhbHVlLnB1c2goe30pO1xuICAgIGlmICh2YWx1ZS5sZW5ndGggPiB0aGlzLnBhbmVsQ291bnQpIHtcbiAgICAgIHZhbHVlLnNwbGljZSh0aGlzLnBhbmVsQ291bnQsIHZhbHVlLmxlbmd0aCAtIHRoaXMucGFuZWxDb3VudCk7XG4gICAgfVxuICAgIHRoaXMuaXNWYWx1ZUNoYW5naW5nSW50ZXJuYWxseSA9IHRydWU7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuaXNWYWx1ZUNoYW5naW5nSW50ZXJuYWxseSA9IGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbWluaW11bSBwYW5lbCBjb3VudC4gQSB1c2VyIGNvdWxkIG5vdCBkZWxldGUgYSBwYW5lbCBpZiB0aGUgcGFuZWxDb3VudCBlcXVhbHMgdG8gbWluUGFuZWxDb3VudFxuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICogQHNlZSBtYXhQYW5lbENvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IG1pblBhbmVsQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWluUGFuZWxDb3VudFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1pblBhbmVsQ291bnQodmFsOiBudW1iZXIpIHtcbiAgICBpZiAodmFsIDwgMCkgdmFsID0gMDtcbiAgICBpZiAodmFsID09IHRoaXMubWluUGFuZWxDb3VudCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1pblBhbmVsQ291bnRcIiwgdmFsKTtcbiAgICBpZiAodmFsID4gdGhpcy5tYXhQYW5lbENvdW50KSB0aGlzLm1heFBhbmVsQ291bnQgPSB2YWw7XG4gICAgaWYgKHRoaXMucGFuZWxDb3VudCA8IHZhbCkgdGhpcy5wYW5lbENvdW50ID0gdmFsO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBwYW5lbCBjb3VudC4gQSB1c2VyIGNvdWxkIG5vdCBhZGQgYSBwYW5lbCBpZiB0aGUgcGFuZWxDb3VudCBlcXVhbHMgdG8gbWF4UGFuZWxDb3VudFxuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICogQHNlZSBtaW5QYW5lbENvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heFBhbmVsQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWF4UGFuZWxDb3VudFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heFBhbmVsQ291bnQodmFsOiBudW1iZXIpIHtcbiAgICBpZiAodmFsIDw9IDApIHJldHVybjtcbiAgICBpZiAodmFsID4gc2V0dGluZ3MucGFuZWxNYXhpbXVtUGFuZWxDb3VudClcbiAgICAgIHZhbCA9IHNldHRpbmdzLnBhbmVsTWF4aW11bVBhbmVsQ291bnQ7XG4gICAgaWYgKHZhbCA9PSB0aGlzLm1heFBhbmVsQ291bnQpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtYXhQYW5lbENvdW50XCIsIHZhbCk7XG4gICAgaWYgKHZhbCA8IHRoaXMubWluUGFuZWxDb3VudCkgdGhpcy5taW5QYW5lbENvdW50ID0gdmFsO1xuICAgIGlmICh0aGlzLnBhbmVsQ291bnQgPiB2YWwpIHRoaXMucGFuZWxDb3VudCA9IHZhbDtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gZmFsc2UgdG8gaGlkZSB0aGUgJ0FkZCBOZXcnIGJ1dHRvblxuICAgKiBAc2VlIGFsbG93UmVtb3ZlUGFuZWxcbiAgICovXG4gIHB1YmxpYyBnZXQgYWxsb3dBZGRQYW5lbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dBZGRQYW5lbFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGFsbG93QWRkUGFuZWwodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dBZGRQYW5lbFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZSB0byBoaWRlIHRoZSAnUmVtb3ZlJyBidXR0b25cbiAgICogQHNlZSBhbGxvd0FkZFBhbmVsXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFsbG93UmVtb3ZlUGFuZWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImFsbG93UmVtb3ZlUGFuZWxcIik7XG4gIH1cbiAgcHVibGljIHNldCBhbGxvd1JlbW92ZVBhbmVsKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImFsbG93UmVtb3ZlUGFuZWxcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgZGlmZmVyZW50IGZyb20gXCJkZWZhdWx0XCIgdG8gc2V0IHRoZSBzcGVjaWZpYyBxdWVzdGlvbiB0aXRsZSBsb2NhdGlvbiBmb3IgdGhlIHRlbXBsYXRlIHF1ZXN0aW9ucy5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5xdWVzdGlvblRpdGxlTG9jYXRpb25cbiAgICogQHNlZSBQYW5lbE1vZGVsQmFzZS5xdWVzdGlvblRpdGxlTG9jYXRpb25cbiAgICovXG4gIHB1YmxpYyBnZXQgdGVtcGxhdGVUaXRsZUxvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInRlbXBsYXRlVGl0bGVMb2NhdGlvblwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRlbXBsYXRlVGl0bGVMb2NhdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidGVtcGxhdGVUaXRsZUxvY2F0aW9uXCIsIHZhbHVlLnRvTG93ZXJDYXNlKCkpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBzaG93L2hpZGUgdGhlIG51bWJlcnMgaW4gdGl0bGVzIGluIHF1ZXN0aW9ucyBpbnNpZGUgYSBkeW5hbWljIHBhbmVsLlxuICAgKiBCeSBkZWZhdWx0IHRoZSB2YWx1ZSBpcyBcIm9mZlwiLiBZb3UgbWF5IHNldCBpdCB0byBcIm9uUGFuZWxcIiBhbmQgdGhlIGZpcnN0IHF1ZXN0aW9uIGluc2lkZSBhIGR5bmFtaWMgcGFuZWwgd2lsbCBzdGFydCB3aXRoIDEgb3IgXCJvblN1cnZleVwiIHRvIGluY2x1ZGUgbmVzdGVkIHF1ZXN0aW9ucyBpbiBkeW1hbWljIHBhbmVscyBpbnRvIGdsb2JhbCBzdXJ2ZXkgcXVlc3Rpb24gbnVtYmVyaW5nLlxuICAgKi9cbiAgcHVibGljIGdldCBzaG93UXVlc3Rpb25OdW1iZXJzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dRdWVzdGlvbk51bWJlcnNcIik7XG4gIH1cbiAgcHVibGljIHNldCBzaG93UXVlc3Rpb25OdW1iZXJzKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1F1ZXN0aW9uTnVtYmVyc1wiLCB2YWwpO1xuICAgIGlmICghdGhpcy5pc0xvYWRpbmdGcm9tSnNvbiAmJiB0aGlzLnN1cnZleSkge1xuICAgICAgdGhpcy5zdXJ2ZXkucXVlc3Rpb25WaXNpYmlsaXR5Q2hhbmdlZCh0aGlzLCB0aGlzLnZpc2libGUpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVtb3ZlIGJ1dHRvbiByZWxhdGl2ZSB0byB0aGUgcGFuZWwuXG4gICAqIEJ5IGRlZmF1bHQgdGhlIHZhbHVlIGlzIFwiYm90dG9tXCIuIFlvdSBtYXkgc2V0IGl0IHRvIFwicmlnaHRcIiBhbmQgcmVtb3ZlIGJ1dHRvbiB3aWxsIGFwcGVhciB0byB0aGUgcmlnaHQgb2YgdGhlIHBhbmVsLlxuICAgKi9cbiAgcHVibGljIGdldCBwYW5lbFJlbW92ZUJ1dHRvbkxvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInBhbmVsUmVtb3ZlQnV0dG9uTG9jYXRpb25cIik7XG4gIH1cbiAgcHVibGljIHNldCBwYW5lbFJlbW92ZUJ1dHRvbkxvY2F0aW9uKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicGFuZWxSZW1vdmVCdXR0b25Mb2NhdGlvblwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTaG93cyB0aGUgcmFuZ2UgZnJvbSAxIHRvIHBhbmVsQ291bnQgd2hlbiByZW5kZXJNb2RlIGRvZXNuJ3QgZXF1YWwgdG8gXCJsaXN0XCIuIFNldCB0byBmYWxzZSB0byBoaWRlIHRoaXMgZWxlbWVudC5cbiAgICogQHNlZSBwYW5lbENvdW50XG4gICAqIEBzZWUgcmVuZGVyTW9kZVxuICAgKi9cbiAgcHVibGljIGdldCBzaG93UmFuZ2VJblByb2dyZXNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93UmFuZ2VJblByb2dyZXNzXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd1JhbmdlSW5Qcm9ncmVzcyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93UmFuZ2VJblByb2dyZXNzXCIsIHZhbCk7XG4gICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5jdXJyZW50SW5kZXhDaGFuZ2VkQ2FsbGJhY2spO1xuICB9XG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0IHRoZSBwcm9wZXJ0eSBlcXVhbHMgdG8gXCJsaXN0XCIgYW5kIGFsbCBkeW5hbWljIHBhbmVscyBhcmUgcmVuZGVyZWQgb25lIGJ5IG9uZSBvbiB0aGUgcGFnZS4gWW91IG1heSBjaGFuZ2UgaXQgdG86IFwicHJvZ3Jlc3NUb3BcIiwgXCJwcm9ncmVzc0JvdHRvbVwiIG9yIFwicHJvZ3Jlc3NUb3BCb3R0b21cIiB0byByZW5kZXIgb25seSBvbmUgZHluYW1pYyBwYW5lbCBhdCBvbmNlLiBUaGUgcHJvZ3Jlc3MgYW5kIG5hdmlnYXRpb24gZWxlbWVudHMgY2FuIGJlIHJlbmRyZWQgb24gdG9wLCBib3R0b20gb3IgYm90aC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcmVuZGVyTW9kZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyZW5kZXJNb2RlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcmVuZGVyTW9kZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJlbmRlck1vZGVcIiwgdmFsKTtcbiAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnJlbmRlck1vZGVDaGFuZ2VkQ2FsbGJhY2spO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgd2hlbiByZW5kZXJNb2RlIGVxdWFscyB0byBcImxpc3RcIi5cbiAgICogQHNlZSByZW5kZXJNb2RlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzUmVuZGVyTW9kZUxpc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyTW9kZSA9PT0gXCJsaXN0XCI7XG4gIH1cbiAgcHVibGljIHNldFZpc2libGVJbmRleCh2YWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAoIXRoaXMuaXNWaXNpYmxlKSByZXR1cm4gMDtcbiAgICB2YXIgc3RhcnRJbmRleCA9IHRoaXMuc2hvd1F1ZXN0aW9uTnVtYmVycyA9PSBcIm9uU3VydmV5XCIgPyB2YWx1ZSA6IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNvdW50ZXIgPSB0aGlzLnNldFBhbmVsVmlzaWJsZUluZGV4KFxuICAgICAgICB0aGlzLnBhbmVsc1tpXSxcbiAgICAgICAgc3RhcnRJbmRleCxcbiAgICAgICAgdGhpcy5zaG93UXVlc3Rpb25OdW1iZXJzICE9IFwib2ZmXCJcbiAgICAgICk7XG4gICAgICBpZiAodGhpcy5zaG93UXVlc3Rpb25OdW1iZXJzID09IFwib25TdXJ2ZXlcIikge1xuICAgICAgICBzdGFydEluZGV4ICs9IGNvdW50ZXI7XG4gICAgICB9XG4gICAgfVxuICAgIHN1cGVyLnNldFZpc2libGVJbmRleCh0aGlzLnNob3dRdWVzdGlvbk51bWJlcnMgIT0gXCJvblN1cnZleVwiID8gdmFsdWUgOiAtMSk7XG4gICAgcmV0dXJuIHRoaXMuc2hvd1F1ZXN0aW9uTnVtYmVycyAhPSBcIm9uU3VydmV5XCIgPyAxIDogc3RhcnRJbmRleCAtIHZhbHVlO1xuICB9XG4gIHByaXZhdGUgc2V0UGFuZWxWaXNpYmxlSW5kZXgoXG4gICAgcGFuZWw6IFBhbmVsTW9kZWwsXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBzaG93SW5kZXg6IGJvb2xlYW5cbiAgKTogbnVtYmVyIHtcbiAgICBpZiAoIXNob3dJbmRleCkge1xuICAgICAgcGFuZWwuc2V0VmlzaWJsZUluZGV4KC0xKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICByZXR1cm4gcGFuZWwuc2V0VmlzaWJsZUluZGV4KGluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgd2hlbiBhbiBlbmQgdXNlciBtYXkgYWRkIGEgbmV3IHBhbmVsLiBUaGUgcXVlc3Rpb24gaXMgbm90IHJlYWQgb25seSBhbmQgcGFuZWxDb3VudCBsZXNzIHRoYW4gbWF4UGFuZWxDb3VudFxuICAgKiBAc2VlIGlzUmVhZE9ubHlcbiAgICogQHNlZSBwYW5lbENvdW50XG4gICAqIEBzZWUgbWF4UGFuZWxDb3VudFxuICAgKi9cbiAgcHVibGljIGdldCBjYW5BZGRQYW5lbCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5zdXJ2ZXkgJiYgdGhpcy5zdXJ2ZXkuaXNEZXNpZ25Nb2RlKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuYWxsb3dBZGRQYW5lbCAmJlxuICAgICAgIXRoaXMuaXNSZWFkT25seSAmJlxuICAgICAgdGhpcy5wYW5lbENvdW50IDwgdGhpcy5tYXhQYW5lbENvdW50XG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIHdoZW4gYW4gZW5kIHVzZXIgbWF5IHJlbW92ZSBhIHBhbmVsLiBUaGUgcXVlc3Rpb24gaXMgbm90IHJlYWQgb25seSBhbmQgcGFuZWxDb3VudCBpcyBtb3JlIHRoYW4gbWluUGFuZWxDb3VudFxuICAgKiBAc2VlIGlzUmVhZE9ubHlcbiAgICogQHNlZSBwYW5lbENvdW50XG4gICAqIEBzZWUgbWluUGFuZWxDb3VudFxuICAgKi9cbiAgcHVibGljIGdldCBjYW5SZW1vdmVQYW5lbCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5zdXJ2ZXkgJiYgdGhpcy5zdXJ2ZXkuaXNEZXNpZ25Nb2RlKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuYWxsb3dSZW1vdmVQYW5lbCAmJlxuICAgICAgIXRoaXMuaXNSZWFkT25seSAmJlxuICAgICAgdGhpcy5wYW5lbENvdW50ID4gdGhpcy5taW5QYW5lbENvdW50XG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVidWlsZFBhbmVscygpIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuO1xuICAgIHRoaXMucHJlcGFyZVZhbHVlRm9yUGFuZWxDcmVhdGluZygpO1xuICAgIHZhciBwYW5lbHMgPSBbXTtcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUpIHtcbiAgICAgIG5ldyBRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0odGhpcywgdGhpcy50ZW1wbGF0ZSk7XG4gICAgICBwYW5lbHMucHVzaCh0aGlzLnRlbXBsYXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhbmVsQ291bnQ7IGkrKykge1xuICAgICAgICBwYW5lbHMucHVzaCh0aGlzLmNyZWF0ZU5ld1BhbmVsKCkpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnBhbmVscy5zcGxpY2UoMCwgdGhpcy5wYW5lbHMubGVuZ3RoLCAuLi5wYW5lbHMpO1xuICAgIHRoaXMuc2V0VmFsdWVBZnRlclBhbmVsc0NyZWF0aW5nKCk7XG4gICAgdGhpcy5zZXRQYW5lbHNTdGF0ZSgpO1xuICAgIHRoaXMucmVSdW5Db25kaXRpb24oKTtcbiAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnBhbmVsQ291bnRDaGFuZ2VkQ2FsbGJhY2spO1xuICB9XG4gIC8qKlxuICAgKiBJZiBpdCBpcyBub3QgZW1wdHksIHRoZW4gdGhpcyB2YWx1ZSBpcyBzZXQgdG8gZXZlcnkgbmV3IHBhbmVsLCBpbmNsdWRpbmcgcGFuZWxzIGNyZWF0ZWQgaW5pdGlhbGx5LCB1bmxlc3MgdGhlIGRlZmF1bHRWYWx1ZSBpcyBub3QgZW1wdHlcbiAgICogQHNlZSBkZWZhdWx0VmFsdWVcbiAgICogQHNlZSBkZWZhdWx0VmFsdWVGcm9tTGFzdFJvd1xuICAgKi9cbiAgcHVibGljIGdldCBkZWZhdWx0UGFuZWxWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJkZWZhdWx0UGFuZWxWYWx1ZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRlZmF1bHRQYW5lbFZhbHVlKHZhbDogYW55KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZGVmYXVsdFBhbmVsVmFsdWVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIHRydWUgdG8gY29weSB0aGUgdmFsdWUgaW50byBuZXcgYWRkZWQgcGFuZWwgZnJvbSB0aGUgbGFzdCBwYW5lbC4gSWYgZGVmYXVsdFBhbmVsVmFsdWUgaXMgc2V0IGFuZCB0aGlzIHByb3BlcnR5IGVxdWFscyB0byB0cnVlLFxuICAgKiB0aGVuIHRoZSB2YWx1ZSBmb3IgbmV3IGFkZGVkIHBhbmVsIGlzIG1lcmdpbmcuXG4gICAqIEBzZWUgZGVmYXVsdFZhbHVlXG4gICAqIEBzZWUgZGVmYXVsdFBhbmVsVmFsdWVcbiAgICovXG4gIHB1YmxpYyBnZXQgZGVmYXVsdFZhbHVlRnJvbUxhc3RQYW5lbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZGVmYXVsdFZhbHVlRnJvbUxhc3RQYW5lbFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBkZWZhdWx0VmFsdWVGcm9tTGFzdFBhbmVsKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImRlZmF1bHRWYWx1ZUZyb21MYXN0UGFuZWxcIiwgdmFsKTtcbiAgfVxuICBwcm90ZWN0ZWQgaXNEZWZhdWx0VmFsdWVFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgc3VwZXIuaXNEZWZhdWx0VmFsdWVFbXB0eSgpICYmIHRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMuZGVmYXVsdFBhbmVsVmFsdWUpXG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0RGVmYXVsdFZhbHVlKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMuZGVmYXVsdFBhbmVsVmFsdWUpIHx8XG4gICAgICAhdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy5kZWZhdWx0VmFsdWUpXG4gICAgKSB7XG4gICAgICBzdXBlci5zZXREZWZhdWx0VmFsdWUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzRW1wdHkoKSB8fCB0aGlzLnBhbmVsQ291bnQgPT0gMCkgcmV0dXJuO1xuICAgIHZhciBuZXdWYWx1ZSA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbENvdW50OyBpKyspIHtcbiAgICAgIG5ld1ZhbHVlLnB1c2godGhpcy5kZWZhdWx0UGFuZWxWYWx1ZSk7XG4gICAgfVxuICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZTtcbiAgfVxuICBwdWJsaWMgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICB2YXIgdmFsID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoIXZhbCB8fCAhQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm4gdHJ1ZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCF0aGlzLmlzUm93RW1wdHkodmFsW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0UHJvZ3Jlc3NJbmZvKCk6IElQcm9ncmVzc0luZm8ge1xuICAgIHJldHVybiBTdXJ2ZXlFbGVtZW50LmdldFByb2dyZXNzSW5mb0J5RWxlbWVudHMoXG4gICAgICB0aGlzLnBhbmVscyxcbiAgICAgIHRoaXMuaXNSZXF1aXJlZFxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBpc1Jvd0VtcHR5KHZhbDogYW55KSB7XG4gICAgZm9yICh2YXIgcHJvcCBpbiB2YWwpIHtcbiAgICAgIGlmICh2YWwuaGFzT3duUHJvcGVydHkocHJvcCkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbmV3IGR5bmFtaWMgcGFuZWwgYmFzZWQgb24gdGhlIHRlbXBsYXRlIFBhbmVsLiBJdCBjaGVja3MgaWYgY2FuQWRkUGFuZWwgcmV0dXJucyB0cnVlIGFuZCB0aGVuIGNhbGxzIGFkZFBhbmVsIG1ldGhvZC5cbiAgICogQHNlZSB0ZW1wbGF0ZVxuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICogQHNlZSBwYW5lbHNcbiAgICogQHNlZSBjYW5BZGRQYW5lbFxuICAgKi9cbiAgcHVibGljIGFkZFBhbmVsVUkoKTogUGFuZWxNb2RlbCB7XG4gICAgaWYgKCF0aGlzLmNhbkFkZFBhbmVsKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBuZXdQYW5lbCA9IHRoaXMuYWRkUGFuZWwoKTtcbiAgICBpZiAodGhpcy5yZW5kZXJNb2RlID09PSBcImxpc3RcIiAmJiB0aGlzLnBhbmVsc1N0YXRlICE9PSBcImRlZmF1bHRcIikge1xuICAgICAgbmV3UGFuZWwuZXhwYW5kKCk7XG4gICAgfVxuICAgIHJldHVybiBuZXdQYW5lbDtcbiAgfVxuICAvKipcbiAgICogQWRkIGEgbmV3IGR5bmFtaWMgcGFuZWwgYmFzZWQgb24gdGhlIHRlbXBsYXRlIFBhbmVsLlxuICAgKiBAc2VlIHRlbXBsYXRlXG4gICAqIEBzZWUgcGFuZWxDb3VudFxuICAgKiBAc2VlIHBhbmVsc1xuICAgKi9cbiAgcHVibGljIGFkZFBhbmVsKCk6IFBhbmVsTW9kZWwge1xuICAgIHRoaXMucGFuZWxDb3VudCsrO1xuICAgIGlmICghdGhpcy5pc1JlbmRlck1vZGVMaXN0KSB7XG4gICAgICB0aGlzLmN1cnJlbnRJbmRleCA9IHRoaXMucGFuZWxDb3VudCAtIDE7XG4gICAgfVxuICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgdmFyIGhhc01vZGlmaWVkID0gZmFsc2U7XG4gICAgaWYgKCF0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLmRlZmF1bHRQYW5lbFZhbHVlKSkge1xuICAgICAgaWYgKFxuICAgICAgICAhIW5ld1ZhbHVlICYmXG4gICAgICAgIEFycmF5LmlzQXJyYXkobmV3VmFsdWUpICYmXG4gICAgICAgIG5ld1ZhbHVlLmxlbmd0aCA9PSB0aGlzLnBhbmVsQ291bnRcbiAgICAgICkge1xuICAgICAgICBoYXNNb2RpZmllZCA9IHRydWU7XG4gICAgICAgIHRoaXMuY29weVZhbHVlKG5ld1ZhbHVlW25ld1ZhbHVlLmxlbmd0aCAtIDFdLCB0aGlzLmRlZmF1bHRQYW5lbFZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKFxuICAgICAgdGhpcy5kZWZhdWx0VmFsdWVGcm9tTGFzdFBhbmVsICYmXG4gICAgICAhIW5ld1ZhbHVlICYmXG4gICAgICBBcnJheS5pc0FycmF5KG5ld1ZhbHVlKSAmJlxuICAgICAgbmV3VmFsdWUubGVuZ3RoID4gMSAmJlxuICAgICAgbmV3VmFsdWUubGVuZ3RoID09IHRoaXMucGFuZWxDb3VudFxuICAgICkge1xuICAgICAgaGFzTW9kaWZpZWQgPSB0cnVlO1xuICAgICAgdGhpcy5jb3B5VmFsdWUoXG4gICAgICAgIG5ld1ZhbHVlW25ld1ZhbHVlLmxlbmd0aCAtIDFdLFxuICAgICAgICBuZXdWYWx1ZVtuZXdWYWx1ZS5sZW5ndGggLSAyXVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGhhc01vZGlmaWVkKSB7XG4gICAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgfVxuICAgIGlmICh0aGlzLnN1cnZleSkgdGhpcy5zdXJ2ZXkuZHluYW1pY1BhbmVsQWRkZWQodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMucGFuZWxzW3RoaXMucGFuZWxDb3VudCAtIDFdO1xuICB9XG4gIHByaXZhdGUgY29weVZhbHVlKHNyYzogYW55LCBkZXN0OiBhbnkpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gZGVzdCkge1xuICAgICAgc3JjW2tleV0gPSBkZXN0W2tleV07XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBDYWxsIHJlbW92ZVBhbmVsIGZ1bmN0aW9uLiBEbyBub3RoaW5nIGlzIGNhblJlbW92ZVBhbmVsIHJldHVybnMgZmFsc2UuIElmIGNvbmZpcm1EZWxldGUgc2V0IHRvIHRydWUsIGl0IHNob3dzIHRoZSBjb25maXJtYXRpb24gZGlhbG9nIGZpcnN0LlxuICAgKiBAcGFyYW0gdmFsdWUgYSBwYW5lbCBvciBwYW5lbCBpbmRleFxuICAgKiBAc2VlIHJlbW92ZVBhbmVsXG4gICAqIEBzZWUgY29uZmlybURlbGV0ZVxuICAgKiBAc2VlIGNvbmZpcm1EZWxldGVUZXh0XG4gICAqIEBzZWUgY2FuUmVtb3ZlUGFuZWxcbiAgICpcbiAgICovXG4gIHB1YmxpYyByZW1vdmVQYW5lbFVJKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuY2FuUmVtb3ZlUGFuZWwpIHJldHVybjtcbiAgICBpZiAoIXRoaXMuY29uZmlybURlbGV0ZSB8fCBjb25maXJtQWN0aW9uKHRoaXMuY29uZmlybURlbGV0ZVRleHQpKSB7XG4gICAgICB0aGlzLnJlbW92ZVBhbmVsKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEdvZXMgdG8gdGhlIG5leHQgcGFuZWwgaW4gdGhlIFBhbmVsRHluYW1pY1xuICAgKlxuICAgKi9cbiAgcHVibGljIGdvVG9OZXh0UGFuZWwoKSB7XG4gICAgaWYgKHRoaXMucmVuZGVyTW9kZSAhPT0gXCJsaXN0XCIgJiYgdGhpcy5jdXJyZW50UGFuZWwuaGFzRXJyb3JzKCkpIHJldHVybjtcbiAgICB0aGlzLmN1cnJlbnRJbmRleCsrO1xuICB9XG4gIC8qKlxuICAgKiBHb2VzIHRvIHRoZSBwcmV2aW91cyBwYW5lbCBpbiB0aGUgUGFuZWxEeW5hbWljXG4gICAqXG4gICAqL1xuICBwdWJsaWMgZ29Ub1ByZXZQYW5lbCgpIHtcbiAgICB0aGlzLmN1cnJlbnRJbmRleC0tO1xuICB9XG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgZHluYW1pYyBwYW5lbCBmcm9tIHRoZSBwYW5lbHMgYXJyYXkuXG4gICAqIEBwYXJhbSB2YWx1ZSBhIHBhbmVsIG9yIHBhbmVsIGluZGV4XG4gICAqIEBzZWUgcGFuZWxzXG4gICAqIEBzZWUgdGVtcGxhdGVcbiAgICovXG4gIHB1YmxpYyByZW1vdmVQYW5lbCh2YWx1ZTogYW55KSB7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5nZXRQYW5lbEluZGV4KHZhbHVlKTtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMucGFuZWxDb3VudCkgcmV0dXJuO1xuICAgIHZhciBwYW5lbCA9IHRoaXMucGFuZWxzW2luZGV4XTtcbiAgICB0aGlzLnBhbmVscy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHRoaXMudXBkYXRlQmluZGluZ3MoXCJwYW5lbENvdW50XCIsIHRoaXMucGFuZWxDb3VudCk7XG4gICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoIXZhbHVlIHx8ICFBcnJheS5pc0FycmF5KHZhbHVlKSB8fCBpbmRleCA+PSB2YWx1ZS5sZW5ndGgpIHJldHVybjtcbiAgICB0aGlzLmlzVmFsdWVDaGFuZ2luZ0ludGVybmFsbHkgPSB0cnVlO1xuICAgIHZhbHVlLnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMucGFuZWxDb3VudENoYW5nZWRDYWxsYmFjayk7XG4gICAgaWYgKHRoaXMuc3VydmV5KSB0aGlzLnN1cnZleS5keW5hbWljUGFuZWxSZW1vdmVkKHRoaXMsIGluZGV4LCBwYW5lbCk7XG4gICAgdGhpcy5pc1ZhbHVlQ2hhbmdpbmdJbnRlcm5hbGx5ID0gZmFsc2U7XG4gIH1cbiAgcHJpdmF0ZSBnZXRQYW5lbEluZGV4KHZhbDogYW55KTogbnVtYmVyIHtcbiAgICBpZiAoSGVscGVycy5pc051bWJlcih2YWwpKSByZXR1cm4gdmFsO1xuICAgIHZhciBpdGVtcyA9IHRoaXMuaXRlbXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMucGFuZWxzW2ldID09PSB2YWwgfHwgaXRlbXNbaV0gPT09IHZhbCkgcmV0dXJuIGk7XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuICBwdWJsaWMgbG9jU3Ryc0NoYW5nZWQoKSB7XG4gICAgc3VwZXIubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICB2YXIgcGFuZWxzID0gdGhpcy5wYW5lbHM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHBhbmVsc1tpXS5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5jbGVhckluY29ycmVjdFZhbHVlc0luUGFuZWwoaSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBjbGVhckVycm9ycygpIHtcbiAgICBzdXBlci5jbGVhckVycm9ycygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucGFuZWxzW2ldLmNsZWFyRXJyb3JzKCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRRdWVzdGlvbkZyb21BcnJheShuYW1lOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBJUXVlc3Rpb24ge1xuICAgIGlmIChpbmRleCA+PSB0aGlzLnBhbmVsQ291bnQpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLnBhbmVsc1tpbmRleF0uZ2V0UXVlc3Rpb25CeU5hbWUobmFtZSk7XG4gIH1cbiAgcHJpdmF0ZSBjbGVhckluY29ycmVjdFZhbHVlc0luUGFuZWwoaW5kZXg6IG51bWJlcikge1xuICAgIHZhciBwYW5lbCA9IHRoaXMucGFuZWxzW2luZGV4XTtcbiAgICBwYW5lbC5jbGVhckluY29ycmVjdFZhbHVlcygpO1xuICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICAgIHZhciB2YWx1ZXMgPSAhIXZhbCAmJiBpbmRleCA8IHZhbC5sZW5ndGggPyB2YWxbaW5kZXhdIDogbnVsbDtcbiAgICBpZiAoIXZhbHVlcykgcmV0dXJuO1xuICAgIHZhciBpc0NoYW5nZWQgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWVzKSB7XG4gICAgICBpZiAodGhpcy5nZXRTaGFyZWRRdWVzdGlvbkZyb21BcnJheShrZXksIGluZGV4KSkgY29udGludWU7XG4gICAgICB2YXIgcSA9IHBhbmVsLmdldFF1ZXN0aW9uQnlOYW1lKGtleSk7XG4gICAgICBpZiAoISFxKSBjb250aW51ZTtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5pc2NvcnJlY3RWYWx1ZVdpdGhQb3N0UHJlZml4KHBhbmVsLCBrZXksIHNldHRpbmdzLmNvbW1lbnRQcmVmaXgpIHx8XG4gICAgICAgIHRoaXMuaXNjb3JyZWN0VmFsdWVXaXRoUG9zdFByZWZpeChcbiAgICAgICAgICBwYW5lbCxcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgc2V0dGluZ3MubWF0cml4VG90YWxWYWx1ZVBvc3RGaXhcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIGRlbGV0ZSB2YWx1ZXNba2V5XTtcbiAgICAgIGlzQ2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChpc0NoYW5nZWQpIHtcbiAgICAgIHZhbFtpbmRleF0gPSB2YWx1ZXM7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGlzY29ycmVjdFZhbHVlV2l0aFBvc3RQcmVmaXgoXG4gICAgcGFuZWw6IFBhbmVsTW9kZWwsXG4gICAga2V5OiBzdHJpbmcsXG4gICAgcG9zdFByZWZpeDogc3RyaW5nXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChrZXkuaW5kZXhPZihwb3N0UHJlZml4KSAhPT0ga2V5Lmxlbmd0aCAtIHBvc3RQcmVmaXgubGVuZ3RoKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAhIXBhbmVsLmdldFF1ZXN0aW9uQnlOYW1lKGtleS5zdWJzdHIoMCwga2V5LmluZGV4T2YocG9zdFByZWZpeCkpKTtcbiAgfVxuICBwdWJsaWMgZ2V0U2hhcmVkUXVlc3Rpb25Gcm9tQXJyYXkoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHBhbmVsSW5kZXg6IG51bWJlclxuICApOiBRdWVzdGlvbiB7XG4gICAgcmV0dXJuICEhdGhpcy5zdXJ2ZXkgJiYgISF0aGlzLnZhbHVlTmFtZVxuICAgICAgPyA8UXVlc3Rpb24+KFxuICAgICAgICAgIHRoaXMuc3VydmV5LmdldFF1ZXN0aW9uQnlWYWx1ZU5hbWVGcm9tQXJyYXkoXG4gICAgICAgICAgICB0aGlzLnZhbHVlTmFtZSxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBwYW5lbEluZGV4XG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICA6IG51bGw7XG4gIH1cbiAgcHVibGljIGFkZENvbmRpdGlvbk9iamVjdHNCeUNvbnRleHQoXG4gICAgb2JqZWN0czogQXJyYXk8SUNvbmRpdGlvbk9iamVjdD4sXG4gICAgY29udGV4dDogYW55XG4gICkge1xuICAgIHZhciBoYXNDb250ZXh0ID0gISFjb250ZXh0XG4gICAgICA/IHRoaXMudGVtcGxhdGUucXVlc3Rpb25zLmluZGV4T2YoY29udGV4dCkgPiAtMVxuICAgICAgOiBmYWxzZTtcbiAgICB2YXIgcHJlZml4TmFtZSA9IHRoaXMuZ2V0VmFsdWVOYW1lKCkgKyBcIlswXS5cIjtcbiAgICB2YXIgcHJlZml4VGV4dCA9IHRoaXMucHJvY2Vzc2VkVGl0bGUgKyBcIlswXS5cIjtcbiAgICB2YXIgcGFuZWxPYmpzID0gbmV3IEFycmF5PElDb25kaXRpb25PYmplY3Q+KCk7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMudGVtcGxhdGUucXVlc3Rpb25zO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBxdWVzdGlvbnNbaV0uYWRkQ29uZGl0aW9uT2JqZWN0c0J5Q29udGV4dChwYW5lbE9ianMsIGNvbnRleHQpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhbmVsT2Jqcy5sZW5ndGg7IGkrKykge1xuICAgICAgb2JqZWN0cy5wdXNoKHtcbiAgICAgICAgbmFtZTogcHJlZml4TmFtZSArIHBhbmVsT2Jqc1tpXS5uYW1lLFxuICAgICAgICB0ZXh0OiBwcmVmaXhUZXh0ICsgcGFuZWxPYmpzW2ldLnRleHQsXG4gICAgICAgIHF1ZXN0aW9uOiBwYW5lbE9ianNbaV0ucXVlc3Rpb24sXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGhhc0NvbnRleHQpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFuZWxPYmpzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwYW5lbE9ianNbaV0ucXVlc3Rpb24gPT0gY29udGV4dCkgY29udGludWU7XG4gICAgICAgIG9iamVjdHMucHVzaCh7XG4gICAgICAgICAgbmFtZTogXCJwYW5lbC5cIiArIHBhbmVsT2Jqc1tpXS5uYW1lLFxuICAgICAgICAgIHRleHQ6IFwicGFuZWwuXCIgKyBwYW5lbE9ianNbaV0udGV4dCxcbiAgICAgICAgICBxdWVzdGlvbjogcGFuZWxPYmpzW2ldLnF1ZXN0aW9uLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIGdldENvbmRpdGlvbkpzb24ob3BlcmF0b3I6IHN0cmluZyA9IG51bGwsIHBhdGg6IHN0cmluZyA9IG51bGwpOiBhbnkge1xuICAgIGlmICghcGF0aCkgcmV0dXJuIHN1cGVyLmdldENvbmRpdGlvbkpzb24ob3BlcmF0b3IsIHBhdGgpO1xuICAgIHZhciBxdWVzdGlvbk5hbWUgPSBwYXRoO1xuICAgIHZhciBwb3MgPSBwYXRoLmluZGV4T2YoXCIuXCIpO1xuICAgIGlmIChwb3MgPiAtMSkge1xuICAgICAgcXVlc3Rpb25OYW1lID0gcGF0aC5zdWJzdHIoMCwgcG9zKTtcbiAgICAgIHBhdGggPSBwYXRoLnN1YnN0cihwb3MgKyAxKTtcbiAgICB9XG4gICAgdmFyIHF1ZXN0aW9uID0gdGhpcy50ZW1wbGF0ZS5nZXRRdWVzdGlvbkJ5TmFtZShxdWVzdGlvbk5hbWUpO1xuICAgIGlmICghcXVlc3Rpb24pIHJldHVybiBudWxsO1xuICAgIHJldHVybiBxdWVzdGlvbi5nZXRDb25kaXRpb25Kc29uKG9wZXJhdG9yLCBwYXRoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25SZWFkT25seUNoYW5nZWQoKSB7XG4gICAgdmFyIHJlYWRPbmx5ID0gdGhpcy5pc1JlYWRPbmx5O1xuICAgIHRoaXMudGVtcGxhdGUucmVhZE9ubHkgPSByZWFkT25seTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBhbmVsc1tpXS5yZWFkT25seSA9IHJlYWRPbmx5O1xuICAgIH1cbiAgICBzdXBlci5vblJlYWRPbmx5Q2hhbmdlZCgpO1xuICB9XG4gIHB1YmxpYyBvblN1cnZleUxvYWQoKSB7XG4gICAgdGhpcy50ZW1wbGF0ZS5yZWFkT25seSA9IHRoaXMuaXNSZWFkT25seTtcbiAgICB0aGlzLnRlbXBsYXRlLm9uU3VydmV5TG9hZCgpO1xuICAgIGlmICh0aGlzLmxvYWRpbmdQYW5lbENvdW50ID4gMCkge1xuICAgICAgdGhpcy5wYW5lbENvdW50ID0gdGhpcy5sb2FkaW5nUGFuZWxDb3VudDtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSB7XG4gICAgICB0aGlzLnJlYnVpbGRQYW5lbHMoKTtcbiAgICB9XG4gICAgdGhpcy5zZXRQYW5lbHNTdXJ2ZXlJbXBsKCk7XG4gICAgdGhpcy5zZXRQYW5lbHNTdGF0ZSgpO1xuICAgIHRoaXMuYXNzaWduT25Qcm9wZXJ0eUNoYW5nZWRUb1RlbXBsYXRlKCk7XG4gICAgc3VwZXIub25TdXJ2ZXlMb2FkKCk7XG4gIH1cbiAgcHVibGljIG9uRmlyc3RSZW5kZXJpbmcoKSB7XG4gICAgdGhpcy50ZW1wbGF0ZS5vbkZpcnN0UmVuZGVyaW5nKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYW5lbHNbaV0ub25GaXJzdFJlbmRlcmluZygpO1xuICAgIH1cbiAgICBzdXBlci5vbkZpcnN0UmVuZGVyaW5nKCk7XG4gIH1cbiAgcHVibGljIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIHN1cGVyLnJ1bkNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIHRoaXMucnVuUGFuZWxzQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gIH1cbiAgcHJpdmF0ZSByZVJ1bkNvbmRpdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuZGF0YSkgcmV0dXJuO1xuICAgIHRoaXMucnVuQ29uZGl0aW9uKFxuICAgICAgdGhpcy5nZXREYXRhRmlsdGVyZWRWYWx1ZXMoKSxcbiAgICAgIHRoaXMuZ2V0RGF0YUZpbHRlcmVkUHJvcGVydGllcygpXG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgcnVuUGFuZWxzQ29uZGl0aW9uKFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT5cbiAgKSB7XG4gICAgdmFyIGNhY2hlZFZhbHVlczogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgaWYgKHZhbHVlcyAmJiB2YWx1ZXMgaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgIGNhY2hlZFZhbHVlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodmFsdWVzKSk7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwYW5lbFZhbHVlcyA9IHRoaXMuZ2V0UGFuZWxJdGVtRGF0YSh0aGlzLnBhbmVsc1tpXS5kYXRhKTtcbiAgICAgIC8vU2hvdWxkIGJlIHVuaXF1ZSBmb3IgZXZlcnkgcGFuZWwgZHVlIGFzeW5jIGV4cHJlc3Npb24gc3VwcG9ydFxuICAgICAgdmFyIG5ld1ZhbHVlcyA9IEhlbHBlcnMuY3JlYXRlQ29weShjYWNoZWRWYWx1ZXMpO1xuICAgICAgbmV3VmFsdWVzW1xuICAgICAgICBRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0uSXRlbVZhcmlhYmxlTmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICBdID0gcGFuZWxWYWx1ZXM7XG4gICAgICBuZXdWYWx1ZXNbUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtLkluZGV4VmFyaWFibGVOYW1lLnRvTG93ZXJDYXNlKCldID0gaTtcbiAgICAgIHRoaXMucGFuZWxzW2ldLnJ1bkNvbmRpdGlvbihuZXdWYWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIH1cbiAgfVxuICBvbkFueVZhbHVlQ2hhbmdlZChuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlci5vbkFueVZhbHVlQ2hhbmdlZChuYW1lKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBhbmVsc1tpXS5vbkFueVZhbHVlQ2hhbmdlZChuYW1lKTtcbiAgICAgIHRoaXMucGFuZWxzW2ldLm9uQW55VmFsdWVDaGFuZ2VkKFxuICAgICAgICBRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0uSXRlbVZhcmlhYmxlTmFtZVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBoYXNLZXlzRHVwbGljYXRlZChmaXJlQ2FsbGJhY2s6IGJvb2xlYW4sIHJlYzogYW55ID0gbnVsbCkge1xuICAgIHZhciBrZXlWYWx1ZXM6IEFycmF5PGFueT4gPSBbXTtcbiAgICB2YXIgcmVzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlcyA9XG4gICAgICAgIHRoaXMuaXNWYWx1ZUR1cGxpY2F0ZWQodGhpcy5wYW5lbHNbaV0sIGtleVZhbHVlcywgcmVjLCBmaXJlQ2FsbGJhY2spIHx8XG4gICAgICAgIHJlcztcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIHVwZGF0ZVBhbmVsc0NvbnRhaW5zRXJyb3JzKCkge1xuICAgIHZhciBxdWVzdGlvbiA9IHRoaXMuY2hhbmdpbmdWYWx1ZVF1ZXN0aW9uO1xuICAgIHZhciBwYXJlbnQgPSA8UGFuZWw+cXVlc3Rpb24ucGFyZW50O1xuICAgIHdoaWxlICghIXBhcmVudCkge1xuICAgICAgcGFyZW50LnVwZGF0ZUNvbnRhaW5zRXJyb3JzKCk7XG4gICAgICBwYXJlbnQgPSA8UGFuZWw+cGFyZW50LnBhcmVudDtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVDb250YWluc0Vycm9ycygpO1xuICB9XG4gIHB1YmxpYyBoYXNFcnJvcnMoZmlyZUNhbGxiYWNrOiBib29sZWFuID0gdHJ1ZSwgcmVjOiBhbnkgPSBudWxsKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUNoYW5naW5nSW50ZXJuYWxseSkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciByZXMgPSBmYWxzZTtcbiAgICBpZiAoISF0aGlzLmNoYW5naW5nVmFsdWVRdWVzdGlvbikge1xuICAgICAgdmFyIHJlcyA9IHRoaXMuY2hhbmdpbmdWYWx1ZVF1ZXN0aW9uLmhhc0Vycm9ycyhmaXJlQ2FsbGJhY2ssIHJlYyk7XG4gICAgICByZXMgPSB0aGlzLmhhc0tleXNEdXBsaWNhdGVkKGZpcmVDYWxsYmFjaywgcmVjKSB8fCByZXM7XG4gICAgICB0aGlzLnVwZGF0ZVBhbmVsc0NvbnRhaW5zRXJyb3JzKCk7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZXJyb3NJblBhbmVscyA9IHRoaXMuaGFzRXJyb3JJblBhbmVscyhmaXJlQ2FsbGJhY2ssIHJlYyk7XG4gICAgICByZXR1cm4gc3VwZXIuaGFzRXJyb3JzKGZpcmVDYWxsYmFjaykgfHwgZXJyb3NJblBhbmVscztcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGdldENvbnRhaW5zRXJyb3JzKCk6IGJvb2xlYW4ge1xuICAgIHZhciByZXMgPSBzdXBlci5nZXRDb250YWluc0Vycm9ycygpO1xuICAgIGlmIChyZXMpIHJldHVybiByZXM7XG4gICAgdmFyIHBhbmVscyA9IHRoaXMucGFuZWxzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocGFuZWxzW2ldLmNvbnRhaW5zRXJyb3JzKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBnZXRJc0Fuc3dlcmVkKCk6IGJvb2xlYW4ge1xuICAgIGlmICghc3VwZXIuZ2V0SXNBbnN3ZXJlZCgpKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHBhbmVscyA9IHRoaXMucGFuZWxzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmlzaWJsZVF1ZXN0aW9ucyA9IDxBcnJheTxhbnk+PltdO1xuICAgICAgcGFuZWxzW2ldLmFkZFF1ZXN0aW9uc1RvTGlzdCh2aXNpYmxlUXVlc3Rpb25zLCB0cnVlKTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmlzaWJsZVF1ZXN0aW9ucy5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAoIXZpc2libGVRdWVzdGlvbnNbal0uaXNBbnN3ZXJlZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgY2xlYXJWYWx1ZUlmSW52aXNpYmxlKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLnBhbmVsc1tpXS5xdWVzdGlvbnM7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHF1ZXN0aW9ucy5sZW5ndGg7IGorKykge1xuICAgICAgICBxdWVzdGlvbnNbal0uY2xlYXJWYWx1ZUlmSW52aXNpYmxlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHN1cGVyLmNsZWFyVmFsdWVJZkludmlzaWJsZSgpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRJc1J1bm5pbmdWYWxpZGF0b3JzKCk6IGJvb2xlYW4ge1xuICAgIGlmIChzdXBlci5nZXRJc1J1bm5pbmdWYWxpZGF0b3JzKCkpIHJldHVybiB0cnVlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLnBhbmVsc1tpXS5xdWVzdGlvbnM7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHF1ZXN0aW9ucy5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAocXVlc3Rpb25zW2pdLmlzUnVubmluZ1ZhbGlkYXRvcnMpIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldEFsbEVycm9ycygpOiBBcnJheTxTdXJ2ZXlFcnJvcj4ge1xuICAgIHZhciByZXN1bHQgPSBzdXBlci5nZXRBbGxFcnJvcnMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5wYW5lbHNbaV0ucXVlc3Rpb25zO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBxdWVzdGlvbnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGVycm9ycyA9IHF1ZXN0aW9uc1tqXS5nZXRBbGxFcnJvcnMoKTtcbiAgICAgICAgaWYgKGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoZXJyb3JzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByb3RlY3RlZCBnZXREaXNwbGF5VmFsdWVDb3JlKGtleXNBc1RleHQ6IGJvb2xlYW4sIHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIHZhciB2YWx1ZXMgPSB0aGlzLmdldFVuYmluZFZhbHVlKHZhbHVlKTtcbiAgICBpZiAoIXZhbHVlcyB8fCAhQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSByZXR1cm4gdmFsdWVzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbHMubGVuZ3RoICYmIGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB2YWwgPSB2YWx1ZXNbaV07XG4gICAgICBpZiAoIXZhbCkgY29udGludWU7XG4gICAgICB2YWx1ZXNbaV0gPSB0aGlzLmdldFBhbmVsRGlzcGxheVZhbHVlKGksIHZhbCwga2V5c0FzVGV4dCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cblxuICBwcml2YXRlIGdldFBhbmVsRGlzcGxheVZhbHVlKFxuICAgIHBhbmVsSW5kZXg6IG51bWJlcixcbiAgICB2YWw6IGFueSxcbiAgICBrZXlzQXNUZXh0OiBib29sZWFuXG4gICk6IGFueSB7XG4gICAgaWYgKCF2YWwpIHJldHVybiB2YWw7XG4gICAgdmFyIHBhbmVsID0gdGhpcy5wYW5lbHNbcGFuZWxJbmRleF07XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh2YWwpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICB2YXIgcXVlc3Rpb24gPSBwYW5lbC5nZXRRdWVzdGlvbkJ5VmFsdWVOYW1lKGtleSk7XG4gICAgICBpZiAoIXF1ZXN0aW9uKSB7XG4gICAgICAgIHF1ZXN0aW9uID0gdGhpcy5nZXRTaGFyZWRRdWVzdGlvbkZyb21BcnJheShrZXksIHBhbmVsSW5kZXgpO1xuICAgICAgfVxuICAgICAgaWYgKCEhcXVlc3Rpb24pIHtcbiAgICAgICAgdmFyIHFWYWx1ZSA9IHF1ZXN0aW9uLmdldERpc3BsYXlWYWx1ZShrZXlzQXNUZXh0LCB2YWxba2V5XSk7XG4gICAgICAgIHZhbFtrZXldID0gcVZhbHVlO1xuICAgICAgICBpZiAoa2V5c0FzVGV4dCAmJiAhIXF1ZXN0aW9uLnRpdGxlICYmIHF1ZXN0aW9uLnRpdGxlICE9PSBrZXkpIHtcbiAgICAgICAgICB2YWxbcXVlc3Rpb24udGl0bGVdID0gcVZhbHVlO1xuICAgICAgICAgIGRlbGV0ZSB2YWxba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIHByaXZhdGUgaGFzRXJyb3JJblBhbmVscyhmaXJlQ2FsbGJhY2s6IGJvb2xlYW4sIHJlYzogYW55KTogYm9vbGVhbiB7XG4gICAgdmFyIHJlcyA9IGZhbHNlO1xuICAgIHZhciBwYW5lbHMgPSB0aGlzLnBhbmVscztcbiAgICB2YXIga2V5VmFsdWVzOiBBcnJheTxhbnk+ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuc2V0T25Db21wbGV0ZUFzeW5jSW5QYW5lbChwYW5lbHNbaV0pO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBubEVycm9yID0gcGFuZWxzW2ldLmhhc0Vycm9ycyhcbiAgICAgICAgZmlyZUNhbGxiYWNrLFxuICAgICAgICAhIXJlYyAmJiByZWMuZm9jdXNlT25GaXJzdEVycm9yLFxuICAgICAgICByZWNcbiAgICAgICk7XG4gICAgICBwbmxFcnJvciA9IHRoaXMuaXNWYWx1ZUR1cGxpY2F0ZWQocGFuZWxzW2ldLCBrZXlWYWx1ZXMsIHJlYykgfHwgcG5sRXJyb3I7XG4gICAgICBpZiAoIXRoaXMuaXNSZW5kZXJNb2RlTGlzdCAmJiBwbmxFcnJvciAmJiAhcmVzKSB7XG4gICAgICAgIHRoaXMuY3VycmVudEluZGV4ID0gaTtcbiAgICAgIH1cbiAgICAgIHJlcyA9IHBubEVycm9yIHx8IHJlcztcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIHNldE9uQ29tcGxldGVBc3luY0luUGFuZWwocGFuZWw6IFBhbmVsTW9kZWwpIHtcbiAgICB2YXIgcXVlc3Rpb25zID0gcGFuZWwucXVlc3Rpb25zO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBxdWVzdGlvbnNbaV0ub25Db21wbGV0ZWRBc3luY1ZhbGlkYXRvcnMgPSAoaGFzRXJyb3JzOiBib29sZWFuKSA9PiB7XG4gICAgICAgIHRoaXMucmFpc2VPbkNvbXBsZXRlZEFzeW5jVmFsaWRhdG9ycygpO1xuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBpc1ZhbHVlRHVwbGljYXRlZChcbiAgICBwYW5lbDogUGFuZWxNb2RlbCxcbiAgICBrZXlWYWx1ZXM6IEFycmF5PGFueT4sXG4gICAgcmVjOiBhbnksXG4gICAgZmlyZUNhbGxiYWNrPzogYm9vbGVhblxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMua2V5TmFtZSkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBxdWVzdGlvbiA9IDxRdWVzdGlvbj5wYW5lbC5nZXRRdWVzdGlvbkJ5VmFsdWVOYW1lKHRoaXMua2V5TmFtZSk7XG4gICAgaWYgKCFxdWVzdGlvbiB8fCBxdWVzdGlvbi5pc0VtcHR5KCkpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgdmFsdWUgPSBxdWVzdGlvbi52YWx1ZTtcbiAgICBpZiAoXG4gICAgICAhIXRoaXMuY2hhbmdpbmdWYWx1ZVF1ZXN0aW9uICYmXG4gICAgICBxdWVzdGlvbiAhPSB0aGlzLmNoYW5naW5nVmFsdWVRdWVzdGlvblxuICAgICkge1xuICAgICAgcXVlc3Rpb24uaGFzRXJyb3JzKGZpcmVDYWxsYmFjaywgcmVjKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh2YWx1ZSA9PSBrZXlWYWx1ZXNbaV0pIHtcbiAgICAgICAgcXVlc3Rpb24uYWRkRXJyb3IoXG4gICAgICAgICAgbmV3IEtleUR1cGxpY2F0aW9uRXJyb3IodGhpcy5rZXlEdXBsaWNhdGlvbkVycm9yLCB0aGlzKVxuICAgICAgICApO1xuICAgICAgICBpZiAoISFyZWMgJiYgIXJlYy5maXJzdEVycm9yUXVlc3Rpb24pIHtcbiAgICAgICAgICByZWMuZmlyc3RFcnJvclF1ZXN0aW9uID0gcXVlc3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGtleVZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU5ld1BhbmVsKCk6IFBhbmVsTW9kZWwge1xuICAgIHZhciBwYW5lbCA9IHRoaXMuY3JlYXRlQW5kU2V0dXBOZXdQYW5lbE9iamVjdCgpO1xuICAgIHZhciBqc29uID0gdGhpcy50ZW1wbGF0ZS50b0pTT04oKTtcbiAgICBuZXcgSnNvbk9iamVjdCgpLnRvT2JqZWN0KGpzb24sIHBhbmVsKTtcbiAgICBwYW5lbC5yZW5kZXJXaWR0aCA9IFwiMTAwJVwiO1xuICAgIHBhbmVsLnVwZGF0ZUN1c3RvbVdpZGdldHMoKTtcbiAgICBuZXcgUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtKHRoaXMsIHBhbmVsKTtcbiAgICBwYW5lbC5vbkZpcnN0UmVuZGVyaW5nKCk7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHBhbmVsLnF1ZXN0aW9ucztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgcXVlc3Rpb25zW2ldLnNldFBhcmVudFF1ZXN0aW9uKHRoaXMpO1xuICAgIH1cbiAgICBwYW5lbC5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIHJldHVybiBwYW5lbDtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlQW5kU2V0dXBOZXdQYW5lbE9iamVjdCgpOiBQYW5lbE1vZGVsIHtcbiAgICB2YXIgcGFuZWwgPSB0aGlzLmNyZWF0ZU5ld1BhbmVsT2JqZWN0KCk7XG4gICAgcGFuZWwuaXNJbnRlcmFjdGl2ZURlc2lnbkVsZW1lbnQgPSBmYWxzZTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgcGFuZWwub25HZXRRdWVzdGlvblRpdGxlTG9jYXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBzZWxmLmdldFRlbXBsYXRlUXVlc3Rpb25UaXRsZUxvY2F0aW9uKCk7XG4gICAgfTtcbiAgICByZXR1cm4gcGFuZWw7XG4gIH1cbiAgcHJpdmF0ZSBnZXRUZW1wbGF0ZVF1ZXN0aW9uVGl0bGVMb2NhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVRpdGxlTG9jYXRpb24gIT0gXCJkZWZhdWx0XCJcbiAgICAgID8gdGhpcy50ZW1wbGF0ZVRpdGxlTG9jYXRpb25cbiAgICAgIDogdGhpcy5nZXRUaXRsZUxvY2F0aW9uQ29yZSgpO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVOZXdQYW5lbE9iamVjdCgpOiBQYW5lbE1vZGVsIHtcbiAgICByZXR1cm4gU2VyaWFsaXplci5jcmVhdGVDbGFzcyhcInBhbmVsXCIpO1xuICB9XG4gIHByaXZhdGUgc2V0UGFuZWxDb3VudEJhc2VkT25WYWx1ZSgpIHtcbiAgICBpZiAodGhpcy5pc1ZhbHVlQ2hhbmdpbmdJbnRlcm5hbGx5IHx8IHRoaXMuaXNEZXNpZ25Nb2RlKSByZXR1cm47XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgdmFyIG5ld1BhbmVsQ291bnQgPSB2YWwgJiYgQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsLmxlbmd0aCA6IDA7XG4gICAgaWYgKG5ld1BhbmVsQ291bnQgPT0gMCAmJiB0aGlzLmxvYWRpbmdQYW5lbENvdW50ID4gMCkge1xuICAgICAgbmV3UGFuZWxDb3VudCA9IHRoaXMubG9hZGluZ1BhbmVsQ291bnQ7XG4gICAgfVxuICAgIHRoaXMucGFuZWxDb3VudCA9IG5ld1BhbmVsQ291bnQ7XG4gIH1cbiAgcHVibGljIHNldFF1ZXN0aW9uVmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgIHN1cGVyLnNldFF1ZXN0aW9uVmFsdWUobmV3VmFsdWUsIGZhbHNlKTtcbiAgICB0aGlzLnNldFBhbmVsQ291bnRCYXNlZE9uVmFsdWUoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBhbmVsVXBkYXRlVmFsdWVGcm9tU3VydmV5KHRoaXMucGFuZWxzW2ldKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVJc0Fuc3dlcmVkKCk7XG4gIH1cbiAgcHVibGljIG9uU3VydmV5VmFsdWVDaGFuZ2VkKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBzdXBlci5vblN1cnZleVZhbHVlQ2hhbmdlZChuZXdWYWx1ZSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYW5lbFN1cnZleVZhbHVlQ2hhbmdlZCh0aGlzLnBhbmVsc1tpXSk7XG4gICAgfVxuICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNldFZhbHVlQmFzZWRPblBhbmVsQ291bnQoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBwYW5lbFVwZGF0ZVZhbHVlRnJvbVN1cnZleShwYW5lbDogUGFuZWxNb2RlbCkge1xuICAgIHZhciBxdWVzdGlvbnMgPSBwYW5lbC5xdWVzdGlvbnM7XG4gICAgdmFyIHZhbHVlcyA9IHRoaXMuZ2V0UGFuZWxJdGVtRGF0YShwYW5lbC5kYXRhKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHEgPSBxdWVzdGlvbnNbaV07XG4gICAgICBxLnVwZGF0ZVZhbHVlRnJvbVN1cnZleSh2YWx1ZXNbcS5nZXRWYWx1ZU5hbWUoKV0pO1xuICAgICAgcS51cGRhdGVDb21tZW50RnJvbVN1cnZleShcbiAgICAgICAgdmFsdWVzW3EuZ2V0VmFsdWVOYW1lKCkgKyBzZXR0aW5ncy5jb21tZW50UHJlZml4XVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBwYW5lbFN1cnZleVZhbHVlQ2hhbmdlZChwYW5lbDogUGFuZWxNb2RlbCkge1xuICAgIHZhciBxdWVzdGlvbnMgPSBwYW5lbC5xdWVzdGlvbnM7XG4gICAgdmFyIHZhbHVlcyA9IHRoaXMuZ2V0UGFuZWxJdGVtRGF0YShwYW5lbC5kYXRhKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHEgPSBxdWVzdGlvbnNbaV07XG4gICAgICBxLm9uU3VydmV5VmFsdWVDaGFuZ2VkKHZhbHVlc1txLmdldFZhbHVlTmFtZSgpXSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBvblNldERhdGEoKSB7XG4gICAgc3VwZXIub25TZXREYXRhKCk7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSB7XG4gICAgICB0aGlzLnNldFRlbXBsYXRlUGFuZWxTdXJ2ZXlJbXBsKCk7XG4gICAgICB0aGlzLnJlYnVpbGRQYW5lbHMoKTtcbiAgICB9XG4gIH1cbiAgLy9JUXVlc3Rpb25QYW5lbER5bmFtaWNEYXRhXG4gIGdldEl0ZW1JbmRleChpdGVtOiBJU3VydmV5RGF0YSk6IG51bWJlciB7XG4gICAgdmFyIHJlcyA9IHRoaXMuaXRlbXMuaW5kZXhPZihpdGVtKTtcbiAgICByZXR1cm4gcmVzID4gLTEgPyByZXMgOiB0aGlzLml0ZW1zLmxlbmd0aDtcbiAgfVxuICBnZXRQYW5lbEl0ZW1EYXRhKGl0ZW06IElTdXJ2ZXlEYXRhKTogYW55IHtcbiAgICB2YXIgaXRlbXMgPSB0aGlzLml0ZW1zO1xuICAgIHZhciBpbmRleCA9IGl0ZW1zLmluZGV4T2YoaXRlbSk7XG4gICAgdmFyIHFWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgaWYgKGluZGV4IDwgMCAmJiBBcnJheS5pc0FycmF5KHFWYWx1ZSkgJiYgcVZhbHVlLmxlbmd0aCA+IGl0ZW1zLmxlbmd0aCkge1xuICAgICAgaW5kZXggPSBpdGVtcy5sZW5ndGg7XG4gICAgfVxuICAgIGlmIChpbmRleCA8IDApIHJldHVybiB7fTtcbiAgICBpZiAoIXFWYWx1ZSB8fCAhQXJyYXkuaXNBcnJheShxVmFsdWUpIHx8IHFWYWx1ZS5sZW5ndGggPD0gaW5kZXgpIHJldHVybiB7fTtcbiAgICByZXR1cm4gcVZhbHVlW2luZGV4XTtcbiAgfVxuICBwcml2YXRlIGlzU2V0UGFuZWxJdGVtRGF0YTogQXJyYXk8c3RyaW5nPjtcbiAgc2V0UGFuZWxJdGVtRGF0YShpdGVtOiBJU3VydmV5RGF0YSwgbmFtZTogc3RyaW5nLCB2YWw6IGFueSkge1xuICAgIGlmICh0aGlzLmlzU2V0UGFuZWxJdGVtRGF0YSAmJiB0aGlzLmlzU2V0UGFuZWxJdGVtRGF0YS5pbmRleE9mKG5hbWUpID4gLTEpXG4gICAgICByZXR1cm47XG4gICAgaWYgKCF0aGlzLmlzU2V0UGFuZWxJdGVtRGF0YSkgdGhpcy5pc1NldFBhbmVsSXRlbURhdGEgPSBbXTtcbiAgICB0aGlzLmlzU2V0UGFuZWxJdGVtRGF0YS5wdXNoKG5hbWUpO1xuICAgIHZhciBpdGVtcyA9IHRoaXMuaXRlbXM7XG4gICAgdmFyIGluZGV4ID0gaXRlbXMuaW5kZXhPZihpdGVtKTtcbiAgICBpZiAoaW5kZXggPCAwKSBpbmRleCA9IGl0ZW1zLmxlbmd0aDtcbiAgICB2YXIgcVZhbHVlID0gdGhpcy5nZXRVbmJpbmRWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICBpZiAoIXFWYWx1ZSB8fCAhQXJyYXkuaXNBcnJheShxVmFsdWUpKSB7XG4gICAgICBxVmFsdWUgPSBbXTtcbiAgICB9XG4gICAgaWYgKHFWYWx1ZS5sZW5ndGggPD0gaW5kZXgpIHtcbiAgICAgIGZvciAodmFyIGkgPSBxVmFsdWUubGVuZ3RoOyBpIDw9IGluZGV4OyBpKyspIHtcbiAgICAgICAgcVZhbHVlLnB1c2goe30pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXFWYWx1ZVtpbmRleF0pIHFWYWx1ZVtpbmRleF0gPSB7fTtcbiAgICBpZiAoIXRoaXMuaXNWYWx1ZUVtcHR5KHZhbCkpIHtcbiAgICAgIHFWYWx1ZVtpbmRleF1bbmFtZV0gPSB2YWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSBxVmFsdWVbaW5kZXhdW25hbWVdO1xuICAgIH1cbiAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMucGFuZWxzLmxlbmd0aCkge1xuICAgICAgdGhpcy5jaGFuZ2luZ1ZhbHVlUXVlc3Rpb24gPSB0aGlzLnBhbmVsc1tpbmRleF0uZ2V0UXVlc3Rpb25CeVZhbHVlTmFtZShcbiAgICAgICAgbmFtZVxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy52YWx1ZSA9IHFWYWx1ZTtcbiAgICB0aGlzLmNoYW5naW5nVmFsdWVRdWVzdGlvbiA9IG51bGw7XG4gICAgaWYgKHRoaXMuc3VydmV5KSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgcXVlc3Rpb246IHRoaXMsXG4gICAgICAgIHBhbmVsOiAoPFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbT5pdGVtKS5wYW5lbCxcbiAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgaXRlbUluZGV4OiBpbmRleCxcbiAgICAgICAgaXRlbVZhbHVlOiBxVmFsdWVbaW5kZXhdLFxuICAgICAgICB2YWx1ZTogdmFsLFxuICAgICAgfTtcbiAgICAgIHRoaXMuc3VydmV5LmR5bmFtaWNQYW5lbEl0ZW1WYWx1ZUNoYW5nZWQodGhpcywgb3B0aW9ucyk7XG4gICAgfVxuICAgIHZhciBpbmRleCA9IHRoaXMuaXNTZXRQYW5lbEl0ZW1EYXRhLmluZGV4T2YobmFtZSk7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIHRoaXMuaXNTZXRQYW5lbEl0ZW1EYXRhLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICB9XG4gIGdldFJvb3REYXRhKCk6IElTdXJ2ZXlEYXRhIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhO1xuICB9XG4gIHB1YmxpYyBnZXRQbGFpbkRhdGEoXG4gICAgb3B0aW9uczoge1xuICAgICAgaW5jbHVkZUVtcHR5PzogYm9vbGVhbixcbiAgICAgIGNhbGN1bGF0aW9ucz86IEFycmF5PHtcbiAgICAgICAgcHJvcGVydHlOYW1lOiBzdHJpbmcsXG4gICAgICB9PixcbiAgICB9ID0ge1xuICAgICAgaW5jbHVkZUVtcHR5OiB0cnVlLFxuICAgIH1cbiAgKSB7XG4gICAgdmFyIHF1ZXN0aW9uUGxhaW5EYXRhID0gc3VwZXIuZ2V0UGxhaW5EYXRhKG9wdGlvbnMpO1xuICAgIGlmICghIXF1ZXN0aW9uUGxhaW5EYXRhKSB7XG4gICAgICBxdWVzdGlvblBsYWluRGF0YS5pc05vZGUgPSB0cnVlO1xuICAgICAgcXVlc3Rpb25QbGFpbkRhdGEuZGF0YSA9IHRoaXMucGFuZWxzLm1hcChcbiAgICAgICAgKHBhbmVsOiBQYW5lbE1vZGVsLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgdmFyIHBhbmVsRGF0YUl0ZW0gPSA8YW55PntcbiAgICAgICAgICAgIG5hbWU6IHBhbmVsLm5hbWUgfHwgaW5kZXgsXG4gICAgICAgICAgICB0aXRsZTogcGFuZWwudGl0bGUgfHwgXCJQYW5lbFwiLFxuICAgICAgICAgICAgdmFsdWU6IHBhbmVsLmdldFZhbHVlKCksXG4gICAgICAgICAgICBkaXNwbGF5VmFsdWU6IHBhbmVsLmdldFZhbHVlKCksXG4gICAgICAgICAgICBnZXRTdHJpbmc6ICh2YWw6IGFueSkgPT5cbiAgICAgICAgICAgICAgdHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIiA/IEpTT04uc3RyaW5naWZ5KHZhbCkgOiB2YWwsXG4gICAgICAgICAgICBpc05vZGU6IHRydWUsXG4gICAgICAgICAgICBkYXRhOiBwYW5lbC5xdWVzdGlvbnNcbiAgICAgICAgICAgICAgLm1hcCgocXVlc3Rpb246IFF1ZXN0aW9uKSA9PiBxdWVzdGlvbi5nZXRQbGFpbkRhdGEob3B0aW9ucykpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGQ6IGFueSkgPT4gISFkKSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIChvcHRpb25zLmNhbGN1bGF0aW9ucyB8fCBbXSkuZm9yRWFjaCgoY2FsY3VsYXRpb24pID0+IHtcbiAgICAgICAgICAgIHBhbmVsRGF0YUl0ZW1bY2FsY3VsYXRpb24ucHJvcGVydHlOYW1lXSA9ICg8YW55PnBhbmVsKVtcbiAgICAgICAgICAgICAgY2FsY3VsYXRpb24ucHJvcGVydHlOYW1lXG4gICAgICAgICAgICBdO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBwYW5lbERhdGFJdGVtO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcXVlc3Rpb25QbGFpbkRhdGE7XG4gIH1cbiAgcHVibGljIHVwZGF0ZUVsZW1lbnRDc3MocmVOZXc/OiBib29sZWFuKSB7XG4gICAgc3VwZXIudXBkYXRlRWxlbWVudENzcyhyZU5ldyk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsID0gdGhpcy5wYW5lbHNbaV07XG4gICAgICBlbC51cGRhdGVFbGVtZW50Q3NzKHJlTmV3KTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldCBwcm9ncmVzc1RleHQoKTogc3RyaW5nIHtcbiAgICB2YXIgcmFuZ2VNYXggPSB0aGlzLnBhbmVsQ291bnQ7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgLmdldFN0cmluZyhcInBhbmVsRHluYW1pY1Byb2dyZXNzVGV4dFwiKVxuICAgICAgW1wiZm9ybWF0XCJdKHRoaXMuY3VycmVudEluZGV4ICsgMSwgcmFuZ2VNYXgpO1xuICB9XG4gIHB1YmxpYyBnZXRQYW5lbFdyYXBwZXJDc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmV3IENzc0NsYXNzQnVpbGRlcigpXG4gICAgICAuYXBwZW5kKHRoaXMuY3NzQ2xhc3Nlcy5wYW5lbFdyYXBwZXIpXG4gICAgICAuYXBwZW5kKHRoaXMuY3NzQ2xhc3Nlcy5wYW5lbFdyYXBwZXJJblJvdywgdGhpcy5wYW5lbFJlbW92ZUJ1dHRvbkxvY2F0aW9uID09PSBcInJpZ2h0XCIpXG4gICAgICAudG9TdHJpbmcoKTtcbiAgfVxuICBwdWJsaWMgZ2V0UGFuZWxSZW1vdmVCdXR0b25Dc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmV3IENzc0NsYXNzQnVpbGRlcigpXG4gICAgICAuYXBwZW5kKHRoaXMuY3NzQ2xhc3Nlcy5idXR0b24pXG4gICAgICAuYXBwZW5kKHRoaXMuY3NzQ2xhc3Nlcy5idXR0b25SZW1vdmUpXG4gICAgICAuYXBwZW5kKHRoaXMuY3NzQ2xhc3Nlcy5idXR0b25SZW1vdmVSaWdodCwgdGhpcy5wYW5lbFJlbW92ZUJ1dHRvbkxvY2F0aW9uID09PSBcInJpZ2h0XCIpXG4gICAgICAudG9TdHJpbmcoKTtcbiAgfVxuICBwdWJsaWMgZ2V0QWRkQnV0dG9uQ3NzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5ldyBDc3NDbGFzc0J1aWxkZXIoKVxuICAgICAgLmFwcGVuZCh0aGlzLmNzc0NsYXNzZXMuYnV0dG9uKVxuICAgICAgLmFwcGVuZCh0aGlzLmNzc0NsYXNzZXMuYnV0dG9uQWRkKVxuICAgICAgLmFwcGVuZCh0aGlzLmNzc0NsYXNzZXMuYnV0dG9uQWRkICsgXCItLWxpc3QtbW9kZVwiLCB0aGlzLnJlbmRlck1vZGUgPT09IFwibGlzdFwiKVxuICAgICAgLnRvU3RyaW5nKCk7XG4gIH1cbiAgcHVibGljIGdldFByZXZCdXR0b25Dc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmV3IENzc0NsYXNzQnVpbGRlcigpXG4gICAgICAuYXBwZW5kKHRoaXMuY3NzQ2xhc3Nlcy5idXR0b25QcmV2KVxuICAgICAgLmFwcGVuZCh0aGlzLmNzc0NsYXNzZXMuYnV0dG9uUHJldiArIFwiLS1kaXNhYmxlZFwiLCAhdGhpcy5pc1ByZXZCdXR0b25TaG93aW5nKVxuICAgICAgLnRvU3RyaW5nKCk7XG4gIH1cbiAgcHVibGljIGdldE5leHRCdXR0b25Dc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmV3IENzc0NsYXNzQnVpbGRlcigpXG4gICAgICAuYXBwZW5kKHRoaXMuY3NzQ2xhc3Nlcy5idXR0b25OZXh0KVxuICAgICAgLmFwcGVuZCh0aGlzLmNzc0NsYXNzZXMuYnV0dG9uTmV4dCArIFwiLS1kaXNhYmxlZFwiLCAhdGhpcy5pc05leHRCdXR0b25TaG93aW5nKVxuICAgICAgLnRvU3RyaW5nKCk7XG4gIH1cbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJwYW5lbGR5bmFtaWNcIixcbiAgW1xuICAgIHtcbiAgICAgIG5hbWU6IFwidGVtcGxhdGVFbGVtZW50c1wiLFxuICAgICAgYWx0ZXJuYXRpdmVOYW1lOiBcInF1ZXN0aW9uc1wiLFxuICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICBpc0xpZ2h0U2VyaWFsaXphYmxlOiBmYWxzZSxcbiAgICB9LFxuICAgIHsgbmFtZTogXCJ0ZW1wbGF0ZVRpdGxlOnRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1RlbXBsYXRlVGl0bGVcIiB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwidGVtcGxhdGVEZXNjcmlwdGlvbjp0ZXh0XCIsXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jVGVtcGxhdGVEZXNjcmlwdGlvblwiLFxuICAgIH0sXG4gICAgeyBuYW1lOiBcImFsbG93QWRkUGFuZWw6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgeyBuYW1lOiBcImFsbG93UmVtb3ZlUGFuZWw6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJwYW5lbENvdW50Om51bWJlclwiLFxuICAgICAgaXNCaW5kYWJsZTogdHJ1ZSxcbiAgICAgIGRlZmF1bHQ6IDAsXG4gICAgICBjaG9pY2VzOiBbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTBdLFxuICAgIH0sXG4gICAgeyBuYW1lOiBcIm1pblBhbmVsQ291bnQ6bnVtYmVyXCIsIGRlZmF1bHQ6IDAsIG1pblZhbHVlOiAwIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJtYXhQYW5lbENvdW50Om51bWJlclwiLFxuICAgICAgZGVmYXVsdDogc2V0dGluZ3MucGFuZWxNYXhpbXVtUGFuZWxDb3VudCxcbiAgICB9LFxuICAgIFwiZGVmYXVsdFBhbmVsVmFsdWU6cGFuZWx2YWx1ZVwiLFxuICAgIFwiZGVmYXVsdFZhbHVlRnJvbUxhc3RQYW5lbDpib29sZWFuXCIsXG4gICAge1xuICAgICAgbmFtZTogXCJwYW5lbHNTdGF0ZVwiLFxuICAgICAgZGVmYXVsdDogXCJkZWZhdWx0XCIsXG4gICAgICBjaG9pY2VzOiBbXCJkZWZhdWx0XCIsIFwiY29sbGFwc2VkXCIsIFwiZXhwYW5kZWRcIiwgXCJmaXJzdEV4cGFuZGVkXCJdLFxuICAgIH0sXG4gICAgeyBuYW1lOiBcImtleU5hbWVcIiB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwia2V5RHVwbGljYXRpb25FcnJvclwiLFxuICAgICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0tleUR1cGxpY2F0aW9uRXJyb3JcIixcbiAgICB9LFxuICAgIHsgbmFtZTogXCJjb25maXJtRGVsZXRlOmJvb2xlYW5cIiB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiY29uZmlybURlbGV0ZVRleHRcIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NDb25maXJtRGVsZXRlVGV4dFwiLFxuICAgIH0sXG4gICAgeyBuYW1lOiBcInBhbmVsQWRkVGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jUGFuZWxBZGRUZXh0XCIgfSxcbiAgICB7IG5hbWU6IFwicGFuZWxSZW1vdmVUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NQYW5lbFJlbW92ZVRleHRcIiB9LFxuICAgIHsgbmFtZTogXCJwYW5lbFByZXZUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NQYW5lbFByZXZUZXh0XCIgfSxcbiAgICB7IG5hbWU6IFwicGFuZWxOZXh0VGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jUGFuZWxOZXh0VGV4dFwiIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJzaG93UXVlc3Rpb25OdW1iZXJzXCIsXG4gICAgICBkZWZhdWx0OiBcIm9mZlwiLFxuICAgICAgY2hvaWNlczogW1wib2ZmXCIsIFwib25QYW5lbFwiLCBcIm9uU3VydmV5XCJdLFxuICAgIH0sXG4gICAgeyBuYW1lOiBcInNob3dSYW5nZUluUHJvZ3Jlc3M6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJyZW5kZXJNb2RlXCIsXG4gICAgICBkZWZhdWx0OiBcImxpc3RcIixcbiAgICAgIGNob2ljZXM6IFtcImxpc3RcIiwgXCJwcm9ncmVzc1RvcFwiLCBcInByb2dyZXNzQm90dG9tXCIsIFwicHJvZ3Jlc3NUb3BCb3R0b21cIl0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInRlbXBsYXRlVGl0bGVMb2NhdGlvblwiLFxuICAgICAgZGVmYXVsdDogXCJkZWZhdWx0XCIsXG4gICAgICBjaG9pY2VzOiBbXCJkZWZhdWx0XCIsIFwidG9wXCIsIFwiYm90dG9tXCIsIFwibGVmdFwiXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwicGFuZWxSZW1vdmVCdXR0b25Mb2NhdGlvblwiLFxuICAgICAgZGVmYXVsdDogXCJib3R0b21cIixcbiAgICAgIGNob2ljZXM6IFtcImJvdHRvbVwiLCBcInJpZ2h0XCJdLFxuICAgIH0sXG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJxdWVzdGlvblwiXG4pO1xuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJwYW5lbGR5bmFtaWNcIiwgKG5hbWUpID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsKG5hbWUpO1xufSk7XG4iLCJpbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkNoZWNrYm94QmFzZSB9IGZyb20gXCIuL3F1ZXN0aW9uX2Jhc2VzZWxlY3RcIjtcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGEgcmFkaW9ncm91cCBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsIGV4dGVuZHMgUXVlc3Rpb25DaGVja2JveEJhc2Uge1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInJhZGlvZ3JvdXBcIjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Rmlyc3RJbnB1dEVsZW1lbnRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlucHV0SWQgKyBcIl8wXCI7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgc2VsZWN0ZWQgaXRlbSBpbiB0aGUgcmFkaW8gZ3JvdXAuIFJldHVybnMgbnVsbCBpZiB0aGUgdmFsdWUgaXMgZW1wdHlcbiAgICovXG4gIHB1YmxpYyBnZXQgc2VsZWN0ZWRJdGVtKCk6IEl0ZW1WYWx1ZSB7XG4gICAgaWYgKHRoaXMuaXNFbXB0eSgpKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKHRoaXMudmlzaWJsZUNob2ljZXMsIHRoaXMudmFsdWUpO1xuICB9XG4gIC8qKlxuICAgKiBTaG93IFwiY2xlYXIgYnV0dG9uXCIgZmxhZy5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd0NsZWFyQnV0dG9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93Q2xlYXJCdXR0b25cIik7XG4gIH1cbiAgcHVibGljIHNldCBzaG93Q2xlYXJCdXR0b24odmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd0NsZWFyQnV0dG9uXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBjYW5TaG93Q2xlYXJCdXR0b24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0NsZWFyQnV0dG9uICYmICF0aGlzLmlzUmVhZE9ubHk7XG4gIH1cbiAgcHVibGljIGdldCBjbGVhckJ1dHRvbkNhcHRpb24oKSB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjbGVhckNhcHRpb25cIik7XG4gIH1cbiAgc3VwcG9ydEdvTmV4dFBhZ2VBdXRvbWF0aWMoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIGdldCBhcmlhUm9sZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInJhZGlvZ3JvdXBcIjtcbiAgfVxufVxuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcInJhZGlvZ3JvdXBcIixcbiAgW3sgbmFtZTogXCJzaG93Q2xlYXJCdXR0b246Ym9vbGVhblwiLCBkZWZhdWx0OiBmYWxzZSB9XSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJjaGVja2JveGJhc2VcIlxuKTtcblxuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJyYWRpb2dyb3VwXCIsIChuYW1lKSA9PiB7XG4gIHZhciBxID0gbmV3IFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsKG5hbWUpO1xuICBxLmNob2ljZXMgPSBRdWVzdGlvbkZhY3RvcnkuRGVmYXVsdENob2ljZXM7XG4gIHJldHVybiBxO1xufSk7XG4iLCJpbXBvcnQgU29ydGFibGVMaWIgZnJvbSBcInNvcnRhYmxlanNcIjtcbmltcG9ydCB7IElTdXJ2ZXksIElTdXJ2ZXlJbXBsIH0gZnJvbSBcIi4vYmFzZS1pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBEcmFnRHJvcFJhbmtpbmdDaG9pY2VzIH0gZnJvbSBcIi4vZHJhZ2Ryb3AvcmFua2luZy1jaG9pY2VzXCI7XG5pbXBvcnQgeyBJdGVtVmFsdWUgfSBmcm9tIFwiLi9pdGVtdmFsdWVcIjtcbmltcG9ydCB7IHByb3BlcnR5LCBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkNoZWNrYm94TW9kZWwgfSBmcm9tIFwiLi9xdWVzdGlvbl9jaGVja2JveFwiO1xuaW1wb3J0IHsgQ3NzQ2xhc3NCdWlsZGVyIH0gZnJvbSBcIi4vdXRpbHMvY3NzQ2xhc3NCdWlsZGVyXCI7XG5pbXBvcnQgeyBJc01vYmlsZSB9IGZyb20gXCIuL3V0aWxzL2lzLW1vYmlsZVwiO1xuXG5jb25zdCBTb3J0YWJsZSA9IDxhbnk+U29ydGFibGVMaWI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSByYW5raW5nIHF1ZXN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvblJhbmtpbmdNb2RlbCBleHRlbmRzIFF1ZXN0aW9uQ2hlY2tib3hNb2RlbCB7XG4gIHByaXZhdGUgZG9tTm9kZTogSFRNTEVsZW1lbnQgPSBudWxsO1xuICBwcml2YXRlIHNvcnRhYmxlSW5zdDogYW55ID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmNyZWF0ZU5ld0FycmF5KFwicmFua2luZ0Nob2ljZXNcIik7XG4gIH1cblxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInJhbmtpbmdcIjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcm9vdENsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5ldyBDc3NDbGFzc0J1aWxkZXIoKVxuICAgICAgLmFwcGVuZCh0aGlzLmNzc0NsYXNzZXMucm9vdClcbiAgICAgIC5hcHBlbmQodGhpcy5jc3NDbGFzc2VzLnJvb3RNb2JpbGVNb2QsIElzTW9iaWxlKVxuICAgICAgLnRvU3RyaW5nKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0SXRlbUNsYXNzQ29yZShpdGVtOiBJdGVtVmFsdWUsIG9wdGlvbnM6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgaXRlbUluZGV4ID0gdGhpcy5yYW5raW5nQ2hvaWNlcy5pbmRleE9mKGl0ZW0pO1xuICAgIGNvbnN0IGRyb3BUYXJnZXRJbmRleCA9IHRoaXMucmFua2luZ0Nob2ljZXMuaW5kZXhPZihcbiAgICAgIHRoaXMuY3VycmVudERyb3BUYXJnZXRcbiAgICApO1xuXG4gICAgcmV0dXJuIG5ldyBDc3NDbGFzc0J1aWxkZXIoKVxuICAgICAgLmFwcGVuZChzdXBlci5nZXRJdGVtQ2xhc3NDb3JlKGl0ZW0sIG9wdGlvbnMpKVxuICAgICAgLmFwcGVuZCh0aGlzLmNzc0NsYXNzZXMuaXRlbUdob3N0TW9kLCB0aGlzLmN1cnJlbnREcm9wVGFyZ2V0ID09PSBpdGVtKVxuICAgICAgLmFwcGVuZChcbiAgICAgICAgXCJzdi1kcmFnZHJvcC1tb3ZlZG93blwiLFxuICAgICAgICBpdGVtSW5kZXggPT09IGRyb3BUYXJnZXRJbmRleCArIDEgJiYgdGhpcy5kcm9wVGFyZ2V0Tm9kZU1vdmUgPT09IFwiZG93blwiXG4gICAgICApXG4gICAgICAuYXBwZW5kKFxuICAgICAgICBcInN2LWRyYWdkcm9wLW1vdmV1cFwiLFxuICAgICAgICBpdGVtSW5kZXggPT09IGRyb3BUYXJnZXRJbmRleCAtIDEgJiYgdGhpcy5kcm9wVGFyZ2V0Tm9kZU1vdmUgPT09IFwidXBcIlxuICAgICAgKVxuICAgICAgLnRvU3RyaW5nKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNJdGVtQ3VycmVudERyb3BUYXJnZXQoaXRlbTogSXRlbVZhbHVlKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuZmFsbGJhY2tUb1NvcnRhYmxlSlMpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5kcmFnRHJvcFJhbmtpbmdDaG9pY2VzLmRyb3BUYXJnZXQgPT09IGl0ZW07XG4gIH1cblxuICBwdWJsaWMgZ2V0IGdob3N0UG9zaXRpb25Dc3NDbGFzcygpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmdob3N0UG9zaXRpb24gPT09IFwidG9wXCIpXG4gICAgICByZXR1cm4gdGhpcy5jc3NDbGFzc2VzLmRyYWdEcm9wR2hvc3RQb3NpdGlvblRvcDtcbiAgICBpZiAodGhpcy5naG9zdFBvc2l0aW9uID09PSBcImJvdHRvbVwiKVxuICAgICAgcmV0dXJuIHRoaXMuY3NzQ2xhc3Nlcy5kcmFnRHJvcEdob3N0UG9zaXRpb25Cb3R0b207XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cblxuICBwdWJsaWMgZ2V0TnVtYmVyQnlJbmRleChpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyBcIlxcdTIwMTNcIiA6IGluZGV4ICsgMSArIFwiXCI7XG4gIH1cblxuICBwdWJsaWMgc2V0U3VydmV5SW1wbCA9ICh2YWx1ZTogSVN1cnZleUltcGwpID0+IHtcbiAgICBzdXBlci5zZXRTdXJ2ZXlJbXBsKHZhbHVlKTtcbiAgICB0aGlzLnVwZGF0ZVJhbmtpbmdDaG9pY2VzKCk7XG4gIH07XG5cbiAgb25TdXJ2ZXlWYWx1ZUNoYW5nZWQobmV3VmFsdWU6IGFueSkge1xuICAgIHN1cGVyLm9uU3VydmV5VmFsdWVDaGFuZ2VkKG5ld1ZhbHVlKTtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuO1xuICAgIHRoaXMudXBkYXRlUmFua2luZ0Nob2ljZXMoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblZpc2libGVDaG9pY2VzQ2hhbmdlZCA9ICgpOiB2b2lkID0+IHtcbiAgICBzdXBlci5vblZpc2libGVDaG9pY2VzQ2hhbmdlZCgpO1xuXG4gICAgLy8gcmFua2luZyBxdWVzdGlvbiB3aXRoIG9ubHkgb25lIGNob2ljZSBkb2Vzbid0IG1ha2Ugc2Vuc2VcbiAgICBpZiAodGhpcy52aXNpYmxlQ2hvaWNlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBbXTtcbiAgICAgIHRoaXMudXBkYXRlUmFua2luZ0Nob2ljZXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgIHRoaXMudXBkYXRlUmFua2luZ0Nob2ljZXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy52aXNpYmxlQ2hvaWNlcy5sZW5ndGggPiB0aGlzLnZhbHVlLmxlbmd0aClcbiAgICAgIHRoaXMuYWRkVG9WYWx1ZUJ5VmlzaWJsZUNob2ljZXMoKTtcbiAgICBpZiAodGhpcy52aXNpYmxlQ2hvaWNlcy5sZW5ndGggPCB0aGlzLnZhbHVlLmxlbmd0aClcbiAgICAgIHRoaXMucmVtb3ZlRnJvbVZhbHVlQnlWaXNpYmxlQ2hvaWNlcygpO1xuICAgIHRoaXMudXBkYXRlUmFua2luZ0Nob2ljZXMoKTtcbiAgfTtcblxuICBwdWJsaWMgbG9jYWxlQ2hhbmdlZCA9ICgpOiB2b2lkID0+IHtcbiAgICBzdXBlci5sb2NhbGVDaGFuZ2VkKCk7XG4gICAgdGhpcy51cGRhdGVSYW5raW5nQ2hvaWNlcygpO1xuICB9O1xuXG4gIHByaXZhdGUgYWRkVG9WYWx1ZUJ5VmlzaWJsZUNob2ljZXMoKSB7XG4gICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLnZhbHVlLnNsaWNlKCk7XG5cbiAgICB0aGlzLnZpc2libGVDaG9pY2VzLmZvckVhY2goKGNob2ljZSkgPT4ge1xuICAgICAgaWYgKG5ld1ZhbHVlLmluZGV4T2YoY2hvaWNlLnZhbHVlKSA9PT0gLTEpIHtcbiAgICAgICAgbmV3VmFsdWUucHVzaChjaG9pY2UudmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlRnJvbVZhbHVlQnlWaXNpYmxlQ2hvaWNlcygpIHtcbiAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXMudmFsdWUuc2xpY2UoKTtcblxuICAgIHRoaXMudmFsdWUuZm9yRWFjaCgodmFsdWVJdGVtOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIGxldCBpc1ZhbHVlSXRlbVRvUmVtb3ZlID0gdHJ1ZTtcbiAgICAgIHRoaXMudmlzaWJsZUNob2ljZXMuZm9yRWFjaCgoY2hvaWNlKSA9PiB7XG4gICAgICAgIGlmIChjaG9pY2UudmFsdWUgPT09IHZhbHVlSXRlbSkgaXNWYWx1ZUl0ZW1Ub1JlbW92ZSA9IGZhbHNlO1xuICAgICAgfSk7XG4gICAgICBpc1ZhbHVlSXRlbVRvUmVtb3ZlICYmIG5ld1ZhbHVlLnNwbGljZShpbmRleCwgMSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJhbmtpbmdDaG9pY2VzKCk6IEFycmF5PEl0ZW1WYWx1ZT4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyYW5raW5nQ2hvaWNlc1wiLCBbXSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVJhbmtpbmdDaG9pY2VzKCk6IEl0ZW1WYWx1ZVtdIHtcbiAgICBjb25zdCBuZXdSYW5raW5nQ2hvaWNlczogSXRlbVZhbHVlW10gPSBbXTtcblxuICAgIC8vIHJhbmtpbmcgcXVlc3Rpb24gd2l0aCBvbmx5IG9uZSBjaG9pY2UgZG9lc24ndCBtYWtlIHNlbnNlXG4gICAgaWYgKHRoaXMudmlzaWJsZUNob2ljZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyYW5raW5nQ2hvaWNlc1wiLCBuZXdSYW5raW5nQ2hvaWNlcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyYW5raW5nQ2hvaWNlc1wiLCB0aGlzLnZpc2libGVDaG9pY2VzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnZhbHVlLmZvckVhY2goKHZhbHVlSXRlbTogc3RyaW5nKSA9PiB7XG4gICAgICB0aGlzLnZpc2libGVDaG9pY2VzLmZvckVhY2goKGNob2ljZSkgPT4ge1xuICAgICAgICBpZiAoY2hvaWNlLnZhbHVlID09PSB2YWx1ZUl0ZW0pIG5ld1JhbmtpbmdDaG9pY2VzLnB1c2goY2hvaWNlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJhbmtpbmdDaG9pY2VzXCIsIG5ld1JhbmtpbmdDaG9pY2VzKTtcbiAgfVxuXG4gIHB1YmxpYyBkcmFnRHJvcFJhbmtpbmdDaG9pY2VzOiBEcmFnRHJvcFJhbmtpbmdDaG9pY2VzO1xuICBAcHJvcGVydHkoeyBkZWZhdWx0VmFsdWU6IG51bGwgfSkgY3VycmVudERyb3BUYXJnZXQ6IEl0ZW1WYWx1ZTtcbiAgQHByb3BlcnR5KHsgZGVmYXVsdFZhbHVlOiBudWxsIH0pIGRyb3BUYXJnZXROb2RlTW92ZTogc3RyaW5nO1xuXG4gIGVuZExvYWRpbmdGcm9tSnNvbigpOiB2b2lkIHtcbiAgICBzdXBlci5lbmRMb2FkaW5nRnJvbUpzb24oKTtcbiAgICBpZiAoIXRoaXMuZmFsbGJhY2tUb1NvcnRhYmxlSlMpIHtcbiAgICAgIHRoaXMuZHJhZ0Ryb3BSYW5raW5nQ2hvaWNlcyA9IG5ldyBEcmFnRHJvcFJhbmtpbmdDaG9pY2VzKHRoaXMuc3VydmV5KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlUG9pbnRlckRvd24gPSAoXG4gICAgZXZlbnQ6IFBvaW50ZXJFdmVudCxcbiAgICBjaG9pY2U6IEl0ZW1WYWx1ZSxcbiAgICBub2RlOiBIVE1MRWxlbWVudFxuICApOiB2b2lkID0+IHtcbiAgICBpZiAoIXRoaXMuZmFsbGJhY2tUb1NvcnRhYmxlSlMgJiYgIXRoaXMuc3VydmV5LmlzRGVzaWduTW9kZSkge1xuICAgICAgdGhpcy5kcmFnRHJvcFJhbmtpbmdDaG9pY2VzLnN0YXJ0RHJhZyhldmVudCwgY2hvaWNlLCB0aGlzLCBub2RlKTtcbiAgICB9XG4gIH07XG5cbiAgLy9jcm9zcyBmcmFtZXdvcmsgaW5pdGlhbGl6YXRpb25cbiAgcHVibGljIGFmdGVyUmVuZGVyUXVlc3Rpb25FbGVtZW50KGVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIHRoaXMuZG9tTm9kZSA9IGVsO1xuICAgIGlmICghIWVsICYmIHRoaXMuZmFsbGJhY2tUb1NvcnRhYmxlSlMpIHtcbiAgICAgIHRoaXMuaW5pdFNvcnRhYmxlKGVsKTtcbiAgICB9XG4gICAgc3VwZXIuYWZ0ZXJSZW5kZXJRdWVzdGlvbkVsZW1lbnQoZWwpO1xuICB9XG4gIC8vY3Jvc3MgZnJhbWV3b3JrIGRlc3Ryb3lcbiAgcHVibGljIGJlZm9yZURlc3Ryb3lRdWVzdGlvbkVsZW1lbnQoZWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc29ydGFibGVJbnN0KSB0aGlzLnNvcnRhYmxlSW5zdC5kZXN0cm95KCk7XG4gICAgc3VwZXIuYmVmb3JlRGVzdHJveVF1ZXN0aW9uRWxlbWVudChlbCk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlS2V5ZG93biA9IChldmVudDogS2V5Ym9hcmRFdmVudCwgY2hvaWNlOiBJdGVtVmFsdWUpOiB2b2lkID0+IHtcbiAgICBjb25zdCBrZXk6IGFueSA9IGV2ZW50LmtleTtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMucmFua2luZ0Nob2ljZXMuaW5kZXhPZihjaG9pY2UpO1xuXG4gICAgaWYgKGtleSA9PT0gXCJBcnJvd1VwXCIgJiYgaW5kZXgpIHtcbiAgICAgIHRoaXMuaGFuZGxlQXJyb3dVcChpbmRleCwgY2hvaWNlKTtcbiAgICB9XG4gICAgaWYgKGtleSA9PT0gXCJBcnJvd0Rvd25cIiAmJiBpbmRleCAhPT0gdGhpcy5yYW5raW5nQ2hvaWNlcy5sZW5ndGggLSAxKSB7XG4gICAgICB0aGlzLmhhbmRsZUFycm93RG93bihpbmRleCwgY2hvaWNlKTtcbiAgICB9XG4gIH07XG5cbiAgcHJvdGVjdGVkIHN1cHBvcnRTZWxlY3RBbGwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBzdXBwb3J0T3RoZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBzdXBwb3J0Tm9uZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGluaXRTb3J0YWJsZShkb21Ob2RlOiBIVE1MRWxlbWVudCkge1xuICAgIGlmICghZG9tTm9kZSkgcmV0dXJuO1xuICAgIGNvbnN0IHNlbGY6IFF1ZXN0aW9uUmFua2luZ01vZGVsID0gdGhpcztcbiAgICBpZiAodGhpcy5pc1JlYWRPbmx5KSByZXR1cm47XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSByZXR1cm47XG5cbiAgICBzZWxmLnNvcnRhYmxlSW5zdCA9IG5ldyBTb3J0YWJsZShkb21Ob2RlLCB7XG4gICAgICBhbmltYXRpb246IDEwMCxcbiAgICAgIGZvcmNlRmFsbGJhY2s6IHRydWUsXG4gICAgICBkZWxheTogMjAwLFxuICAgICAgZGVsYXlPblRvdWNoT25seTogdHJ1ZSxcbiAgICAgIGhhbmRsZTogSXNNb2JpbGVcbiAgICAgICAgPyBcIi5cIiArIHNlbGYuY3NzQ2xhc3Nlcy5pdGVtSWNvbkNvbnRhaW5lclxuICAgICAgICA6IFwiLlwiICsgc2VsZi5jc3NDbGFzc2VzLml0ZW1Db250ZW50LFxuICAgICAgZ2hvc3RDbGFzczogc2VsZi5jc3NDbGFzc2VzLml0ZW1HaG9zdE1vZCxcbiAgICAgIGRyYWdDbGFzczogc2VsZi5jc3NDbGFzc2VzLml0ZW1EcmFnTW9kLFxuICAgICAgb25TdGFydChldnQ6IGFueSkge1xuICAgICAgICAoPGFueT5Tb3J0YWJsZS5naG9zdC5zdHlsZS5vcGFjaXR5KSA9IDE7XG4gICAgICAgIGRvbU5vZGUuY2xhc3NOYW1lICs9IFwiIFwiICsgc2VsZi5jc3NDbGFzc2VzLnJvb3REcmFnTW9kO1xuICAgICAgICBpZiAoc2VsZi5pc0VtcHR5KCkpIHtcbiAgICAgICAgICBzZWxmLnNldEdob3N0VGV4dChldnQub2xkSW5kZXggKyAxKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9uRW5kKCkge1xuICAgICAgICBkb21Ob2RlLmNsYXNzTmFtZSA9IGRvbU5vZGUuY2xhc3NOYW1lLnJlcGxhY2UoXG4gICAgICAgICAgXCIgXCIgKyBzZWxmLmNzc0NsYXNzZXMucm9vdERyYWdNb2QsXG4gICAgICAgICAgXCJcIlxuICAgICAgICApO1xuICAgICAgICBzZWxmLnNldFZhbHVlRnJvbVVJKCk7XG4gICAgICB9LFxuICAgICAgb25DaGFuZ2UoZXZ0OiBhbnkpIHtcbiAgICAgICAgaWYgKCFzZWxmLmlzRW1wdHkoKSkgc2VsZi5zeW5jTnVtYmVycygpO1xuICAgICAgICBzZWxmLnNldEdob3N0VGV4dChldnQubmV3SW5kZXggKyAxKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZhbGxiYWNrVG9Tb3J0YWJsZUpTKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJmYWxsYmFja1RvU29ydGFibGVKU1wiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGZhbGxiYWNrVG9Tb3J0YWJsZUpTKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImZhbGxiYWNrVG9Tb3J0YWJsZUpTXCIsIHZhbCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUFycm93VXAgPSAoaW5kZXg6IG51bWJlciwgY2hvaWNlOiBJdGVtVmFsdWUpID0+IHtcbiAgICBjb25zdCBjaG9pY2VzID0gdGhpcy5yYW5raW5nQ2hvaWNlcztcbiAgICBjaG9pY2VzLnNwbGljZShpbmRleCwgMSk7XG4gICAgY2hvaWNlcy5zcGxpY2UoaW5kZXggLSAxLCAwLCBjaG9pY2UpO1xuICAgIHRoaXMuc2V0VmFsdWUoKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZm9jdXNJdGVtKGluZGV4IC0gMSk7XG4gICAgfSwgMSk7XG4gIH07XG5cbiAgcHJpdmF0ZSBoYW5kbGVBcnJvd0Rvd24gPSAoaW5kZXg6IG51bWJlciwgY2hvaWNlOiBJdGVtVmFsdWUpID0+IHtcbiAgICBjb25zdCBjaG9pY2VzID0gdGhpcy5yYW5raW5nQ2hvaWNlcztcbiAgICBjaG9pY2VzLnNwbGljZShpbmRleCwgMSk7XG4gICAgY2hvaWNlcy5zcGxpY2UoaW5kZXggKyAxLCAwLCBjaG9pY2UpO1xuICAgIHRoaXMuc2V0VmFsdWUoKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZm9jdXNJdGVtKGluZGV4ICsgMSk7XG4gICAgfSwgMSk7XG4gIH07XG5cbiAgcHJpdmF0ZSBmb2N1c0l0ZW0gPSAoaW5kZXg6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IGl0ZW1zTm9kZXM6IGFueSA9IHRoaXMuZG9tTm9kZS5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgXCIuXCIgKyB0aGlzLmNzc0NsYXNzZXMuaXRlbVxuICAgICk7XG4gICAgaXRlbXNOb2Rlc1tpbmRleF0uZm9jdXMoKTtcbiAgfTtcblxuICBwdWJsaWMgc2V0VmFsdWUgPSAoKTogdm9pZCA9PiB7XG4gICAgY29uc3QgdmFsdWU6IHN0cmluZ1tdID0gW107XG4gICAgdGhpcy5yYW5raW5nQ2hvaWNlcy5mb3JFYWNoKChjaG9pY2U6IEl0ZW1WYWx1ZSkgPT4ge1xuICAgICAgdmFsdWUucHVzaChjaG9pY2UudmFsdWUpO1xuICAgIH0pO1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfTtcblxuICBwcml2YXRlIHNldFZhbHVlRnJvbVVJID0gKCkgPT4ge1xuICAgIGNvbnN0IHZhbHVlOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHRleHROb2RlcyA9IHRoaXMuZG9tTm9kZS5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgXCIuXCIgKyB0aGlzLmNzc0NsYXNzZXMuY29udHJvbExhYmVsXG4gICAgKTtcbiAgICB0ZXh0Tm9kZXMuZm9yRWFjaCgodGV4dE5vZGU6IGFueSwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGlubmVyVGV4dDogc3RyaW5nID0gdGV4dE5vZGUuaW5uZXJUZXh0O1xuICAgICAgdGhpcy52aXNpYmxlQ2hvaWNlcy5mb3JFYWNoKCh2aXNpYmxlQ2hvaWNlOiBJdGVtVmFsdWUpID0+IHtcbiAgICAgICAgaWYgKGlubmVyVGV4dCA9PT0gdmlzaWJsZUNob2ljZS50ZXh0KSB7XG4gICAgICAgICAgdmFsdWUucHVzaCh2aXNpYmxlQ2hvaWNlLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9O1xuXG4gIHByaXZhdGUgc3luY051bWJlcnMgPSAoKSA9PiB7XG4gICAgaWYgKCF0aGlzLmRvbU5vZGUpIHJldHVybjtcbiAgICBjb25zdCBzZWxlY3Rvcjogc3RyaW5nID1cbiAgICAgIFwiLlwiICtcbiAgICAgIHRoaXMuY3NzQ2xhc3Nlcy5pdGVtICtcbiAgICAgIFwiOm5vdCguXCIgK1xuICAgICAgdGhpcy5jc3NDbGFzc2VzLml0ZW1EcmFnTW9kICtcbiAgICAgIFwiKVwiICtcbiAgICAgIFwiIC5cIiArXG4gICAgICB0aGlzLmNzc0NsYXNzZXMuaXRlbUluZGV4O1xuXG4gICAgY29uc3QgaW5kZXhOb2RlczogTm9kZUxpc3RPZjxFbGVtZW50PiA9IHRoaXMuZG9tTm9kZS5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgc2VsZWN0b3JcbiAgICApO1xuICAgIGluZGV4Tm9kZXMuZm9yRWFjaCgoaW5kZXhOb2RlOiBhbnksIGluZGV4KSA9PiB7XG4gICAgICBpbmRleE5vZGUuaW5uZXJUZXh0ID0gdGhpcy5nZXROdW1iZXJCeUluZGV4KGluZGV4KTtcbiAgICB9KTtcbiAgfTtcblxuICBwcml2YXRlIHNldEdob3N0VGV4dCA9ICh0ZXh0OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBpbmRleE5vZGVzOiBOb2RlTGlzdE9mPEVsZW1lbnQ+ID0gdGhpcy5kb21Ob2RlLnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICBcIi5cIiArIHRoaXMuY3NzQ2xhc3Nlcy5pdGVtSW5kZXhcbiAgICApO1xuICAgIGNvbnN0IGdob3N0Tm9kZTogRWxlbWVudCA9IGluZGV4Tm9kZXNbaW5kZXhOb2Rlcy5sZW5ndGggLSAxXTtcbiAgICAoPGFueT5naG9zdE5vZGUpLmlubmVyVGV4dCA9IHRleHQ7XG4gIH07XG5cbiAgcHVibGljIGdldEljb25Ib3ZlckNzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiBuZXcgQ3NzQ2xhc3NCdWlsZGVyKClcbiAgICAgIC5hcHBlbmQodGhpcy5jc3NDbGFzc2VzLml0ZW1JY29uKVxuICAgICAgLmFwcGVuZCh0aGlzLmNzc0NsYXNzZXMuaXRlbUljb25Ib3Zlck1vZClcbiAgICAgIC50b1N0cmluZygpO1xuICB9XG5cbiAgcHVibGljIGdldEljb25Gb2N1c0NzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiBuZXcgQ3NzQ2xhc3NCdWlsZGVyKClcbiAgICAgIC5hcHBlbmQodGhpcy5jc3NDbGFzc2VzLml0ZW1JY29uKVxuICAgICAgLmFwcGVuZCh0aGlzLmNzc0NsYXNzZXMuaXRlbUljb25Gb2N1c01vZClcbiAgICAgIC50b1N0cmluZygpO1xuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwicmFua2luZ1wiLFxuICBbXG4gICAgeyBuYW1lOiBcImhhc090aGVyXCIsIHZpc2libGU6IGZhbHNlLCBpc1NlcmlhbGl6YWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwib3RoZXJUZXh0XCIsIHZpc2libGU6IGZhbHNlLCBpc1NlcmlhbGl6YWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwib3RoZXJFcnJvclRleHRcIiwgdmlzaWJsZTogZmFsc2UsIGlzU2VyaWFsaXphYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJzdG9yZU90aGVyc0FzQ29tbWVudFwiLCB2aXNpYmxlOiBmYWxzZSwgaXNTZXJpYWxpemFibGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcImhhc05vbmVcIiwgdmlzaWJsZTogZmFsc2UsIGlzU2VyaWFsaXphYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJub25lVGV4dFwiLCB2aXNpYmxlOiBmYWxzZSwgaXNTZXJpYWxpemFibGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcImhhc1NlbGVjdEFsbFwiLCB2aXNpYmxlOiBmYWxzZSwgaXNTZXJpYWxpemFibGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcInNlbGVjdEFsbFRleHRcIiwgdmlzaWJsZTogZmFsc2UsIGlzU2VyaWFsaXphYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJjb2xDb3VudDpudW1iZXJcIiwgdmlzaWJsZTogZmFsc2UsIGlzU2VyaWFsaXphYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJtYXhTZWxlY3RlZENob2ljZXNcIiwgdmlzaWJsZTogZmFsc2UsIGlzU2VyaWFsaXphYmxlOiBmYWxzZSB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiZmFsbGJhY2tUb1NvcnRhYmxlSlNcIixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICBpc1NlcmlhbGl6YWJsZTogZmFsc2UsXG4gICAgfSxcbiAgXSxcbiAgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25SYW5raW5nTW9kZWwoXCJcIik7XG4gIH0sXG4gIFwiY2hlY2tib3hcIlxuKTtcblxuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJyYW5raW5nXCIsIChuYW1lKSA9PiB7XG4gIGNvbnN0IHE6IFF1ZXN0aW9uUmFua2luZ01vZGVsID0gbmV3IFF1ZXN0aW9uUmFua2luZ01vZGVsKG5hbWUpO1xuICBxLmNob2ljZXMgPSBRdWVzdGlvbkZhY3RvcnkuRGVmYXVsdENob2ljZXM7XG4gIHJldHVybiBxO1xufSk7XG4iLCJpbXBvcnQgeyBJdGVtVmFsdWUgfSBmcm9tIFwiLi9pdGVtdmFsdWVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IHNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3NcIjtcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7IENzc0NsYXNzQnVpbGRlciB9IGZyb20gXCIuL3V0aWxzL2Nzc0NsYXNzQnVpbGRlclwiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGEgcmF0aW5nIHF1ZXN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25SYXRpbmdNb2RlbCBleHRlbmRzIFF1ZXN0aW9uIHtcbiAgcmF0ZVZhbHVlc0NoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmNyZWF0ZUl0ZW1WYWx1ZXMoXCJyYXRlVmFsdWVzXCIpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwicmF0ZVZhbHVlc1wiLCBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKHNlbGYucmF0ZVZhbHVlc0NoYW5nZWRDYWxsYmFjayk7XG4gICAgfSk7XG4gICAgdGhpcy5vblByb3BlcnR5Q2hhbmdlZC5hZGQoZnVuY3Rpb24oc2VuZGVyOiBhbnksIG9wdGlvbnM6IGFueSkge1xuICAgICAgaWYgKFxuICAgICAgICBvcHRpb25zLm5hbWUgPT0gXCJyYXRlTWluXCIgfHxcbiAgICAgICAgb3B0aW9ucy5uYW1lID09IFwicmF0ZU1heFwiIHx8XG4gICAgICAgIG9wdGlvbnMubmFtZSA9PSBcInJhdGVTdGVwXCJcbiAgICAgICkge1xuICAgICAgICBzZWxmLmZpcmVDYWxsYmFjayhzZWxmLnJhdGVWYWx1ZXNDaGFuZ2VkQ2FsbGJhY2spO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFyIGxvY01pblJhdGVEZXNjcmlwdGlvblZhbHVlID0gdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcbiAgICAgIFwibWluUmF0ZURlc2NyaXB0aW9uXCIsXG4gICAgICB0aGlzLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gICAgdmFyIGxvY01heFJhdGVEZXNjcmlwdGlvblZhbHVlID0gdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcbiAgICAgIFwibWF4UmF0ZURlc2NyaXB0aW9uXCIsXG4gICAgICB0aGlzLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gICAgbG9jTWluUmF0ZURlc2NyaXB0aW9uVmFsdWUub25HZXRUZXh0Q2FsbGJhY2sgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgICByZXR1cm4gdGV4dCA/IHRleHQgKyBcIiBcIiA6IHRleHQ7XG4gICAgfTtcbiAgICBsb2NNYXhSYXRlRGVzY3JpcHRpb25WYWx1ZS5vbkdldFRleHRDYWxsYmFjayA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICAgIHJldHVybiB0ZXh0ID8gXCIgXCIgKyB0ZXh0IDogdGV4dDtcbiAgICB9O1xuICB9XG4gIHB1YmxpYyBvblN1cnZleUxvYWQoKSB7XG4gICAgc3VwZXIub25TdXJ2ZXlMb2FkKCk7XG4gICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5yYXRlVmFsdWVzQ2hhbmdlZENhbGxiYWNrKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgcmF0ZSBpdGVtcy4gRXZlcnkgaXRlbSBoYXMgdmFsdWUgYW5kIHRleHQuIElmIHRleHQgaXMgZW1wdHksIHRoZSB2YWx1ZSBpcyByZW5kZXJlZC4gVGhlIGl0ZW0gdGV4dCBzdXBwb3J0cyBtYXJrZG93bi4gSWYgaXQgaXMgZW1wdHkgdGhlIGFycmF5IGlzIGdlbmVyYXRlZCBieSB1c2luZyByYXRlTWluLCByYXRlTWF4IGFuZCByYXRlU3RlcCBwcm9wZXJ0aWVzLlxuICAgKiBAc2VlIHJhdGVNaW5cbiAgICogQHNlZSByYXRlTWF4XG4gICAqIEBzZWUgcmF0ZVN0ZXBcbiAgICovXG4gIHB1YmxpYyBnZXQgcmF0ZVZhbHVlcygpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmF0ZVZhbHVlc1wiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJhdGVWYWx1ZXModmFsOiBBcnJheTxhbnk+KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmF0ZVZhbHVlc1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGlzIHByb3BlcnR5IGlzIHVzZWQgdG8gZ2VuZXJhdGUgcmF0ZSB2YWx1ZXMgaWYgcmF0ZVZhbHVlcyBhcnJheSBpcyBlbXB0eS4gSXQgaXMgdGhlIGZpcnN0IHZhbHVlIGluIHRoZSByYXRpbmcuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDEuXG4gICAqIEBzZWUgcmF0ZVZhbHVlc1xuICAgKiBAc2VlIHJhdGVNYXhcbiAgICogQHNlZSByYXRlU3RlcFxuICAgKi9cbiAgcHVibGljIGdldCByYXRlTWluKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJhdGVNaW5cIik7XG4gIH1cbiAgcHVibGljIHNldCByYXRlTWluKHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uICYmIHZhbCA+IHRoaXMucmF0ZU1heCAtIHRoaXMucmF0ZVN0ZXApXG4gICAgICB2YWwgPSB0aGlzLnJhdGVNYXggLSB0aGlzLnJhdGVTdGVwO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJhdGVNaW5cIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIHRvIGdlbmVyYXRlIHJhdGUgdmFsdWVzIGlmIHJhdGVWYWx1ZXMgYXJyYXkgaXMgZW1wdHkuIEl0IGlzIHRoZSBsYXN0IHZhbHVlIGluIHRoZSByYXRpbmcuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDUuXG4gICAqIEBzZWUgcmF0ZVZhbHVlc1xuICAgKiBAc2VlIHJhdGVNaW5cbiAgICogQHNlZSByYXRlU3RlcFxuICAgKi9cbiAgcHVibGljIGdldCByYXRlTWF4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJhdGVNYXhcIik7XG4gIH1cbiAgcHVibGljIHNldCByYXRlTWF4KHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uICYmIHZhbCA8IHRoaXMucmF0ZU1pbiArIHRoaXMucmF0ZVN0ZXApXG4gICAgICB2YWwgPSB0aGlzLnJhdGVNaW4gKyB0aGlzLnJhdGVTdGVwO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJhdGVNYXhcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIHRvIGdlbmVyYXRlIHJhdGUgdmFsdWVzIGlmIHJhdGVWYWx1ZXMgYXJyYXkgaXMgZW1wdHkuIEl0IGlzIHRoZSBzdGVwIHZhbHVlLiBUaGUgbnVtYmVyIG9mIHJhdGUgdmFsdWVzIGFyZSAocmF0ZU1heCAtIHJhdGVNaW4pIC8gcmF0ZVN0ZXAuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDEuXG4gICAqIEBzZWUgcmF0ZVZhbHVlc1xuICAgKiBAc2VlIHJhdGVNaW5cbiAgICogQHNlZSByYXRlTWF4XG4gICAqL1xuICBwdWJsaWMgZ2V0IHJhdGVTdGVwKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJhdGVTdGVwXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcmF0ZVN0ZXAodmFsOiBudW1iZXIpIHtcbiAgICBpZiAodmFsIDw9IDApIHZhbCA9IDE7XG4gICAgaWYgKCF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uICYmIHZhbCA+IHRoaXMucmF0ZU1heCAtIHRoaXMucmF0ZU1pbilcbiAgICAgIHZhbCA9IHRoaXMucmF0ZU1heCAtIHRoaXMucmF0ZU1pbjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyYXRlU3RlcFwiLCB2YWwpO1xuICB9XG4gIHByb3RlY3RlZCBnZXREaXNwbGF5VmFsdWVDb3JlKGtleXNBc1RleHQ6IGJvb2xlYW4sIHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIHZhciByZXMgPSBJdGVtVmFsdWUuZ2V0VGV4dE9ySHRtbEJ5VmFsdWUodGhpcy52aXNpYmxlUmF0ZVZhbHVlcywgdmFsdWUpO1xuICAgIHJldHVybiAhIXJlcyA/IHJlcyA6IHZhbHVlO1xuICB9XG4gIGdldCB2aXNpYmxlUmF0ZVZhbHVlcygpOiBJdGVtVmFsdWVbXSB7XG4gICAgaWYgKHRoaXMucmF0ZVZhbHVlcy5sZW5ndGggPiAwKSByZXR1cm4gdGhpcy5yYXRlVmFsdWVzO1xuICAgIHZhciByZXMgPSBbXTtcbiAgICB2YXIgdmFsdWUgPSB0aGlzLnJhdGVNaW47XG4gICAgdmFyIHN0ZXAgPSB0aGlzLnJhdGVTdGVwO1xuICAgIHdoaWxlIChcbiAgICAgIHZhbHVlIDw9IHRoaXMucmF0ZU1heCAmJlxuICAgICAgcmVzLmxlbmd0aCA8IHNldHRpbmdzLnJhdGluZ01heGltdW1SYXRlVmFsdWVDb3VudFxuICAgICkge1xuICAgICAgcmVzLnB1c2gobmV3IEl0ZW1WYWx1ZSh2YWx1ZSkpO1xuICAgICAgdmFsdWUgPSB0aGlzLmNvcnJlY3RWYWx1ZSh2YWx1ZSArIHN0ZXAsIHN0ZXApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgY29ycmVjdFZhbHVlKHZhbHVlOiBudW1iZXIsIHN0ZXA6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIHZhbHVlO1xuICAgIGlmIChNYXRoLnJvdW5kKHZhbHVlKSA9PSB2YWx1ZSkgcmV0dXJuIHZhbHVlO1xuICAgIHZhciBmciA9IDA7XG4gICAgd2hpbGUgKE1hdGgucm91bmQoc3RlcCkgIT0gc3RlcCkge1xuICAgICAgc3RlcCAqPSAxMDtcbiAgICAgIGZyKys7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlLnRvRml4ZWQoZnIpKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInJhdGluZ1wiO1xuICB9XG4gIHByb3RlY3RlZCBnZXRGaXJzdElucHV0RWxlbWVudElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5wdXRJZCArIFwiXzBcIjtcbiAgfVxuICBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgc3VwcG9ydENvbW1lbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIHN1cHBvcnRPdGhlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uIG9mIG1pbmltdW0gKGZpcnN0KSBpdGVtLlxuICAgKi9cbiAgcHVibGljIGdldCBtaW5SYXRlRGVzY3JpcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJtaW5SYXRlRGVzY3JpcHRpb25cIik7XG4gIH1cbiAgcHVibGljIHNldCBtaW5SYXRlRGVzY3JpcHRpb24odmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm1pblJhdGVEZXNjcmlwdGlvblwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NNaW5SYXRlRGVzY3JpcHRpb24oKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwibWluUmF0ZURlc2NyaXB0aW9uXCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgbWF4aW11bSAobGFzdCkgaXRlbS5cbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4UmF0ZURlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwibWF4UmF0ZURlc2NyaXB0aW9uXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4UmF0ZURlc2NyaXB0aW9uKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJtYXhSYXRlRGVzY3JpcHRpb25cIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jTWF4UmF0ZURlc2NyaXB0aW9uKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcIm1heFJhdGVEZXNjcmlwdGlvblwiKTtcbiAgfVxuICBwcm90ZWN0ZWQgdmFsdWVUb0RhdGEodmFsOiBhbnkpOiBhbnkge1xuICAgIGlmICh0aGlzLnJhdGVWYWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIGl0ZW0gPSBJdGVtVmFsdWUuZ2V0SXRlbUJ5VmFsdWUodGhpcy5yYXRlVmFsdWVzLCB2YWwpO1xuICAgICAgcmV0dXJuICEhaXRlbSA/IGl0ZW0udmFsdWUgOiB2YWw7XG4gICAgfVxuICAgIHJldHVybiAhaXNOYU4odmFsKSA/IHBhcnNlRmxvYXQodmFsKSA6IHZhbDtcbiAgfVxuICAvKipcbiAgICogQ2xpY2sgdmFsdWUgYWdhaW4gdG8gY2xlYXIuXG4gICAqL1xuICBwdWJsaWMgc2V0VmFsdWVGcm9tQ2xpY2sodmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLnZhbHVlID09PSBwYXJzZUZsb2F0KHZhbHVlKSkge1xuICAgICAgdGhpcy5jbGVhclZhbHVlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldEl0ZW1DbGFzcyhpdGVtOiBJdGVtVmFsdWUpIHtcbiAgICBjb25zdCBpc1NlbGVjdGVkID0gdGhpcy52YWx1ZSA9PSBpdGVtLnZhbHVlO1xuICAgIGNvbnN0IGlzRGlzYWJsZWQgPSB0aGlzLmlzUmVhZE9ubHkgJiYgIWl0ZW0uaXNFbmFibGVkO1xuICAgIGNvbnN0IGFsbG93SG92ZXIgPSAhaXNEaXNhYmxlZCAmJiAhaXNTZWxlY3RlZCAmJiAhKCEhdGhpcy5zdXJ2ZXkgJiYgdGhpcy5zdXJ2ZXkuaXNEZXNpZ25Nb2RlKTtcblxuICAgIHJldHVybiBuZXcgQ3NzQ2xhc3NCdWlsZGVyKClcbiAgICAgIC5hcHBlbmQodGhpcy5jc3NDbGFzc2VzLml0ZW0pXG4gICAgICAuYXBwZW5kKHRoaXMuY3NzQ2xhc3Nlcy5zZWxlY3RlZCwgdGhpcy52YWx1ZSA9PSBpdGVtLnZhbHVlKVxuICAgICAgLmFwcGVuZCh0aGlzLmNzc0NsYXNzZXMuaXRlbURpc2FibGVkLCB0aGlzLmlzUmVhZE9ubHkpXG4gICAgICAuYXBwZW5kKHRoaXMuY3NzQ2xhc3Nlcy5pdGVtSG92ZXIsIGFsbG93SG92ZXIpXG4gICAgICAudG9TdHJpbmcoKTtcbiAgfVxufVxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJyYXRpbmdcIixcbiAgW1xuICAgIHsgbmFtZTogXCJoYXNDb21tZW50OnN3aXRjaFwiLCBsYXlvdXQ6IFwicm93XCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImNvbW1lbnRUZXh0XCIsXG4gICAgICBkZXBlbmRzT246IFwiaGFzQ29tbWVudFwiLFxuICAgICAgdmlzaWJsZUlmOiBmdW5jdGlvbihvYmo6IGFueSkge1xuICAgICAgICByZXR1cm4gb2JqLmhhc0NvbW1lbnQ7XG4gICAgICB9LFxuICAgICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0NvbW1lbnRUZXh0XCIsXG4gICAgICBsYXlvdXQ6IFwicm93XCIsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInJhdGVWYWx1ZXM6aXRlbXZhbHVlW11cIixcbiAgICAgIGJhc2VWYWx1ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY2hvaWNlc19JdGVtXCIpO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHsgbmFtZTogXCJyYXRlTWluOm51bWJlclwiLCBkZWZhdWx0OiAxIH0sXG4gICAgeyBuYW1lOiBcInJhdGVNYXg6bnVtYmVyXCIsIGRlZmF1bHQ6IDUgfSxcbiAgICB7IG5hbWU6IFwicmF0ZVN0ZXA6bnVtYmVyXCIsIGRlZmF1bHQ6IDEsIG1pblZhbHVlOiAwLjEgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcIm1pblJhdGVEZXNjcmlwdGlvblwiLFxuICAgICAgYWx0ZXJuYXRpdmVOYW1lOiBcIm1pbmludW1SYXRlRGVzY3JpcHRpb25cIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NNaW5SYXRlRGVzY3JpcHRpb25cIixcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwibWF4UmF0ZURlc2NyaXB0aW9uXCIsXG4gICAgICBhbHRlcm5hdGl2ZU5hbWU6IFwibWF4aW11bVJhdGVEZXNjcmlwdGlvblwiLFxuICAgICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY01heFJhdGVEZXNjcmlwdGlvblwiLFxuICAgIH0sXG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25SYXRpbmdNb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJxdWVzdGlvblwiXG4pO1xuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJyYXRpbmdcIiwgKG5hbWUpID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvblJhdGluZ01vZGVsKG5hbWUpO1xufSk7XG4iLCJpbXBvcnQgeyBwcm9wZXJ0eSwgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IFNpZ25hdHVyZVBhZCBmcm9tIFwic2lnbmF0dXJlX3BhZFwiO1xuaW1wb3J0IHsgQ3NzQ2xhc3NCdWlsZGVyIH0gZnJvbSBcIi4vdXRpbHMvY3NzQ2xhc3NCdWlsZGVyXCI7XG5cbnZhciBkZWZhdWx0V2lkdGggPSAzMDA7XG52YXIgZGVmYXVsdEhlaWdodCA9IDIwMDtcblxuZnVuY3Rpb24gcmVzaXplQ2FudmFzKGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQpIHtcbiAgdmFyIGNvbnRleHQ6IGFueSA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gIHZhciBkZXZpY2VQaXhlbFJhdGlvID0gd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMTtcbiAgdmFyIGJhY2tpbmdTdG9yZVJhdGlvID1cbiAgICBjb250ZXh0LndlYmtpdEJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHxcbiAgICBjb250ZXh0Lm1vekJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHxcbiAgICBjb250ZXh0Lm1zQmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fFxuICAgIGNvbnRleHQub0JhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHxcbiAgICBjb250ZXh0LmJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHxcbiAgICAxO1xuXG4gIHZhciByYXRpbyA9IGRldmljZVBpeGVsUmF0aW8gLyBiYWNraW5nU3RvcmVSYXRpbztcblxuICB2YXIgb2xkV2lkdGggPSBjYW52YXMud2lkdGg7XG4gIHZhciBvbGRIZWlnaHQgPSBjYW52YXMuaGVpZ2h0O1xuXG4gIGNhbnZhcy53aWR0aCA9IG9sZFdpZHRoICogcmF0aW87XG4gIGNhbnZhcy5oZWlnaHQgPSBvbGRIZWlnaHQgKiByYXRpbztcblxuICBjYW52YXMuc3R5bGUud2lkdGggPSBvbGRXaWR0aCArIFwicHhcIjtcbiAgY2FudmFzLnN0eWxlLmhlaWdodCA9IG9sZEhlaWdodCArIFwicHhcIjtcblxuICBjb250ZXh0LnNjYWxlKHJhdGlvLCByYXRpbyk7XG59XG5cbi8qKlxuICogQSBNb2RlbCBmb3Igc2lnbmF0dXJlIHBhZCBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uU2lnbmF0dXJlUGFkTW9kZWwgZXh0ZW5kcyBRdWVzdGlvbiB7XG4gIEBwcm9wZXJ0eSh7IGRlZmF1bHRWYWx1ZTogZmFsc2UgfSkgaXNEcmF3aW5nVmFsdWU6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBnZXRDc3NSb290KGNzc0NsYXNzZXM6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5ldyBDc3NDbGFzc0J1aWxkZXIoKVxuICAgICAgLmFwcGVuZChzdXBlci5nZXRDc3NSb290KGNzc0NsYXNzZXMpKVxuICAgICAgLmFwcGVuZChjc3NDbGFzc2VzLnNtYWxsLCB0aGlzLndpZHRoLnRvU3RyaW5nKCkgPT09IFwiMzAwXCIpXG4gICAgICAudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGVWYWx1ZSgpIHtcbiAgICBpZiAodGhpcy5zaWduYXR1cmVQYWQpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5zaWduYXR1cmVQYWQudG9EYXRhVVJMKHRoaXMuZGF0YUZvcm1hdCk7XG4gICAgICB0aGlzLnZhbHVlID0gZGF0YTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInNpZ25hdHVyZXBhZFwiO1xuICB9XG4gIHB1YmxpYyBhZnRlclJlbmRlclF1ZXN0aW9uRWxlbWVudChlbDogSFRNTEVsZW1lbnQpIHtcbiAgICBpZiAoISFlbCkge1xuICAgICAgdGhpcy5pbml0U2lnbmF0dXJlUGFkKGVsKTtcbiAgICB9XG4gICAgc3VwZXIuYWZ0ZXJSZW5kZXJRdWVzdGlvbkVsZW1lbnQoZWwpO1xuICB9XG4gIHB1YmxpYyBiZWZvcmVEZXN0cm95UXVlc3Rpb25FbGVtZW50KGVsOiBIVE1MRWxlbWVudCkge1xuICAgIGlmICghIWVsKSB7XG4gICAgICB0aGlzLmRlc3Ryb3lTaWduYXR1cmVQYWQoZWwpO1xuICAgIH1cbiAgfVxuXG4gIGluaXRTaWduYXR1cmVQYWQoZWw6IEhUTUxFbGVtZW50KSB7XG4gICAgdmFyIGNhbnZhczogYW55ID0gZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJjYW52YXNcIilbMF07XG4gICAgdmFyIGJ1dHRvbkVsID0gZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJidXR0b25cIilbMF07XG4gICAgdmFyIHNpZ25hdHVyZVBhZCA9IG5ldyBTaWduYXR1cmVQYWQoY2FudmFzLCB7IGJhY2tncm91bmRDb2xvcjogXCIjZmZmZmZmXCIgfSk7XG4gICAgaWYgKHRoaXMuaXNJbnB1dFJlYWRPbmx5KSB7XG4gICAgICBzaWduYXR1cmVQYWQub2ZmKCk7XG4gICAgfVxuXG4gICAgYnV0dG9uRWwub25jbGljayA9ICgpID0+IHtcbiAgICAgIHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfTtcblxuICAgIHRoaXMucmVhZE9ubHlDaGFuZ2VkQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuYWxsb3dDbGVhciB8fCB0aGlzLmlzSW5wdXRSZWFkT25seSkge1xuICAgICAgICBzaWduYXR1cmVQYWQub2ZmKCk7XG4gICAgICAgIGJ1dHRvbkVsLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNpZ25hdHVyZVBhZC5vbigpO1xuICAgICAgICBidXR0b25FbC5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBzaWduYXR1cmVQYWQucGVuQ29sb3IgPSB0aGlzLnBlbkNvbG9yO1xuICAgIHNpZ25hdHVyZVBhZC5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLmJhY2tncm91bmRDb2xvcjtcbiAgICBzaWduYXR1cmVQYWQub25CZWdpbiA9ICgpID0+IHtcbiAgICAgIHRoaXMuaXNEcmF3aW5nVmFsdWUgPSB0cnVlO1xuICAgICAgY2FudmFzLmZvY3VzKCk7XG4gICAgfTtcbiAgICBzaWduYXR1cmVQYWQub25FbmQgPSAoKSA9PiB7XG4gICAgICB0aGlzLmlzRHJhd2luZ1ZhbHVlID0gZmFsc2U7XG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlKCk7XG4gICAgfTtcbiAgICB2YXIgdXBkYXRlVmFsdWVIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLnZhbHVlO1xuICAgICAgY2FudmFzLndpZHRoID0gdGhpcy53aWR0aCB8fCBkZWZhdWx0V2lkdGg7XG4gICAgICBjYW52YXMuaGVpZ2h0ID0gdGhpcy5oZWlnaHQgfHwgZGVmYXVsdEhlaWdodDtcbiAgICAgIHJlc2l6ZUNhbnZhcyhjYW52YXMpO1xuICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgIHNpZ25hdHVyZVBhZC5jbGVhcigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2lnbmF0dXJlUGFkLmZyb21EYXRhVVJMKGRhdGEpO1xuICAgICAgfVxuICAgIH07XG4gICAgdXBkYXRlVmFsdWVIYW5kbGVyKCk7XG4gICAgdGhpcy5yZWFkT25seUNoYW5nZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuc2lnbmF0dXJlUGFkID0gc2lnbmF0dXJlUGFkO1xuICAgIHZhciBwcm9wZXJ0eUNoYW5nZWRIYW5kbGVyID0gKHNlbmRlcjogYW55LCBvcHRpb25zOiBhbnkpID0+IHtcbiAgICAgIGlmIChvcHRpb25zLm5hbWUgPT09IFwid2lkdGhcIiB8fCBvcHRpb25zLm5hbWUgPT09IFwiaGVpZ2h0XCIpIHtcbiAgICAgICAgdXBkYXRlVmFsdWVIYW5kbGVyKCk7XG4gICAgICB9XG4gICAgICBpZihvcHRpb25zLm5hbWUgPT09IFwidmFsdWVcIikge1xuICAgICAgICB1cGRhdGVWYWx1ZUhhbmRsZXIoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMub25Qcm9wZXJ0eUNoYW5nZWQuYWRkKHByb3BlcnR5Q2hhbmdlZEhhbmRsZXIpO1xuICAgIHRoaXMuc2lnbmF0dXJlUGFkLnByb3BlcnR5Q2hhbmdlZEhhbmRsZXIgPSBwcm9wZXJ0eUNoYW5nZWRIYW5kbGVyO1xuICB9XG4gIGRlc3Ryb3lTaWduYXR1cmVQYWQoZWw6IEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKHRoaXMuc2lnbmF0dXJlUGFkKSB7XG4gICAgICB0aGlzLm9uUHJvcGVydHlDaGFuZ2VkLnJlbW92ZSh0aGlzLnNpZ25hdHVyZVBhZC5wcm9wZXJ0eUNoYW5nZWRIYW5kbGVyKTtcbiAgICAgIHRoaXMuc2lnbmF0dXJlUGFkLm9mZigpO1xuICAgIH1cbiAgICB0aGlzLnJlYWRPbmx5Q2hhbmdlZENhbGxiYWNrID0gbnVsbDtcbiAgICB0aGlzLnNpZ25hdHVyZVBhZCA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVXNlIGl0IHRvIHNldCB0aGUgc3BlY2lmaWMgZGF0YUZvcm1hdCBmb3IgdGhlIHNpZ25hdHVyZSBwYWQgaW1hZ2UgZGF0YS5cbiAgICogZm9ybWF0czogXCJcIiAoZGVmYXVsdCkgLSBwbmcsIFwiaW1hZ2UvanBlZ1wiIC0ganBlZywgXCJpbWFnZS9zdmcreG1sXCIgLSBzdmdcbiAgICovXG4gIEBwcm9wZXJ0eSh7IGRlZmF1bHRWYWx1ZTogXCJcIiB9KSBkYXRhRm9ybWF0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFVzZSBpdCB0byBzZXQgdGhlIHNwZWNpZmljIHdpZHRoIGZvciB0aGUgc2lnbmF0dXJlIHBhZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgd2lkdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwid2lkdGhcIik7XG4gIH1cbiAgcHVibGljIHNldCB3aWR0aCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIndpZHRoXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSBpdCB0byBzZXQgdGhlIHNwZWNpZmljIGhlaWdodCBmb3IgdGhlIHNpZ25hdHVyZSBwYWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhlaWdodCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJoZWlnaHRcIik7XG4gIH1cbiAgcHVibGljIHNldCBoZWlnaHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJoZWlnaHRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVXNlIGl0IHRvIGNsZWFyIGNvbnRlbnQgb2YgdGhlIHNpZ25hdHVyZSBwYWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFsbG93Q2xlYXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImFsbG93Q2xlYXJcIik7XG4gIH1cbiAgcHVibGljIHNldCBhbGxvd0NsZWFyKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImFsbG93Q2xlYXJcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVXNlIGl0IHRvIHNldCBwZW4gY29sb3IgZm9yIHRoZSBzaWduYXR1cmUgcGFkLlxuICAgKi9cbiAgcHVibGljIGdldCBwZW5Db2xvcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJwZW5Db2xvclwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBlbkNvbG9yKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicGVuQ29sb3JcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVXNlIGl0IHRvIHNldCBiYWNrZ3JvdW5kIGNvbG9yIGZvciB0aGUgc2lnbmF0dXJlIHBhZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgYmFja2dyb3VuZENvbG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImJhY2tncm91bmRDb2xvclwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGJhY2tncm91bmRDb2xvcih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImJhY2tncm91bmRDb2xvclwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgY2xlYXIgc2lnbmF0dXJlIGJ1dHRvbiBjYXB0aW9uLlxuICAgKi9cbiAgZ2V0IGNsZWFyQnV0dG9uQ2FwdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY2xlYXJDYXB0aW9uXCIpO1xuICB9XG5cbiAgcHVibGljIG5lZWRTaG93UGxhY2Vob2xkZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmlzRHJhd2luZ1ZhbHVlICYmIHRoaXMuaXNFbXB0eSgpO1xuICB9XG5cbiAgZ2V0IHBsYWNlSG9sZGVyVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwic2lnbmF0dXJlUGxhY2VIb2xkZXJcIik7XG4gIH1cbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJzaWduYXR1cmVwYWRcIixcbiAgW1xuICAgIHtcbiAgICAgIG5hbWU6IFwid2lkdGg6bnVtYmVyXCIsXG4gICAgICBjYXRlZ29yeTogXCJnZW5lcmFsXCIsXG4gICAgICBkZWZhdWx0OiAzMDAsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImhlaWdodDpudW1iZXJcIixcbiAgICAgIGNhdGVnb3J5OiBcImdlbmVyYWxcIixcbiAgICAgIGRlZmF1bHQ6IDIwMCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiYWxsb3dDbGVhcjpib29sZWFuXCIsXG4gICAgICBjYXRlZ29yeTogXCJnZW5lcmFsXCIsXG4gICAgICBkZWZhdWx0OiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJwZW5Db2xvcjpjb2xvclwiLFxuICAgICAgY2F0ZWdvcnk6IFwiZ2VuZXJhbFwiLFxuICAgICAgZGVmYXVsdDogXCIjMWFiMzk0XCIsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImJhY2tncm91bmRDb2xvcjpjb2xvclwiLFxuICAgICAgY2F0ZWdvcnk6IFwiZ2VuZXJhbFwiLFxuICAgICAgZGVmYXVsdDogXCIjZmZmZmZmXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImRhdGFGb3JtYXRcIixcbiAgICAgIGNhdGVnb3J5OiBcImdlbmVyYWxcIixcbiAgICAgIGRlZmF1bHQ6IFwiXCIsXG4gICAgICBjaG9pY2VzOiBbXG4gICAgICAgIHsgdmFsdWU6IFwiXCIsIHRleHQ6IFwiUE5HXCIgfSxcbiAgICAgICAgeyB2YWx1ZTogXCJpbWFnZS9qcGVnXCIsIHRleHQ6IFwiSlBFR1wiIH0sXG4gICAgICAgIHsgdmFsdWU6IFwiaW1hZ2Uvc3ZnK3htbFwiLCB0ZXh0OiBcIlNWR1wiIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAgeyBuYW1lOiBcImRlZmF1bHRWYWx1ZVwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJjb3JyZWN0QW5zd2VyXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25TaWduYXR1cmVQYWRNb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJxdWVzdGlvblwiXG4pO1xuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJzaWduYXR1cmVwYWRcIiwgKG5hbWUpID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvblNpZ25hdHVyZVBhZE1vZGVsKG5hbWUpO1xufSk7XG4iLCJpbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZywgTG9jYWxpemFibGVTdHJpbmdzIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IEhlbHBlcnMsIEhhc2hUYWJsZSB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IEVtYWlsVmFsaWRhdG9yLCBTdXJ2ZXlWYWxpZGF0b3IgfSBmcm9tIFwiLi92YWxpZGF0b3JcIjtcbmltcG9ydCB7IFN1cnZleUVycm9yIH0gZnJvbSBcIi4vc3VydmV5LWVycm9yXCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBDdXN0b21FcnJvciB9IGZyb20gXCIuL2Vycm9yXCI7XG5pbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzXCI7XG5pbXBvcnQgeyBRdWVzdGlvblRleHRCYXNlIH0gZnJvbSBcIi4vcXVlc3Rpb25fdGV4dGJhc2VcIjtcbmltcG9ydCB7IENzc0NsYXNzQnVpbGRlciB9IGZyb20gXCIuL3V0aWxzL2Nzc0NsYXNzQnVpbGRlclwiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGFuIGlucHV0IHRleHQgcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvblRleHRNb2RlbCBleHRlbmRzIFF1ZXN0aW9uVGV4dEJhc2Uge1xuICBwcml2YXRlIGxvY0RhdGFMaXN0VmFsdWU6IExvY2FsaXphYmxlU3RyaW5ncztcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcIm1pbkVycm9yVGV4dFwiLCB0aGlzLCB0cnVlKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwibWF4RXJyb3JUZXh0XCIsIHRoaXMsIHRydWUpO1xuICAgIHRoaXMubG9jRGF0YUxpc3RWYWx1ZSA9IG5ldyBMb2NhbGl6YWJsZVN0cmluZ3ModGhpcyk7XG4gICAgdGhpcy5sb2NEYXRhTGlzdFZhbHVlLm9uVmFsdWVDaGFuZ2VkID0gKG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnkpID0+IHtcbiAgICAgIHRoaXMucHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJkYXRhTGlzdFwiLCBvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICAgIH07XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0aWVzVmFsdWVDaGFuZ2VkKFxuICAgICAgW1wibWluXCIsIFwibWF4XCIsIFwiaW5wdXRUeXBlXCIsIFwibWluVmFsdWVFeHByZXNzaW9uXCIsIFwibWF4VmFsdWVFeHByZXNzaW9uXCJdLFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLnNldFJlbmRlcmVkTWluTWF4KCk7XG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoW1wiaW5wdXRUeXBlXCIsIFwic2l6ZVwiXSwgKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVJbnB1dFNpemUoKTtcbiAgICAgIHRoaXMuY2FsY1JlbmRlcmVkUGxhY2VIb2xkZXIoKTtcbiAgICB9KTtcbiAgfVxuICBwcm90ZWN0ZWQgaXNUZXh0VmFsdWUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIFtcInRleHRcIiwgXCJudW1iZXJcIiwgXCJwYXNzd29yZFwiXS5pbmRleE9mKHRoaXMuaW5wdXRUeXBlKSA+IC0xO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwidGV4dFwiO1xuICB9XG4gIHB1YmxpYyBvblN1cnZleUxvYWQoKSB7XG4gICAgc3VwZXIub25TdXJ2ZXlMb2FkKCk7XG4gICAgdGhpcy5zZXRSZW5kZXJlZE1pbk1heCgpO1xuICAgIHRoaXMudXBkYXRlSW5wdXRTaXplKCk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBpbnB1dCB0eXBlLlxuICAgKi9cbiAgcHVibGljIGdldCBpbnB1dFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaW5wdXRUeXBlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaW5wdXRUeXBlKHZhbDogc3RyaW5nKSB7XG4gICAgdmFsID0gdmFsLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHZhbCA9PSBcImRhdGV0aW1lX2xvY2FsXCIpIHZhbCA9IFwiZGF0ZXRpbWUtbG9jYWxcIjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpbnB1dFR5cGVcIiwgdmFsLnRvTG93ZXJDYXNlKCkpO1xuICAgIGlmICghdGhpcy5pc0xvYWRpbmdGcm9tSnNvbikge1xuICAgICAgdGhpcy5taW4gPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLm1heCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuc3RlcCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbiAgcHVibGljIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIHN1cGVyLnJ1bkNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIGlmICghIXRoaXMubWluVmFsdWVFeHByZXNzaW9uIHx8ICEhdGhpcy5tYXhWYWx1ZUV4cHJlc3Npb24pIHtcbiAgICAgIHRoaXMuc2V0UmVuZGVyZWRNaW5NYXgodmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldFZhbGlkYXRvcnMoKTogQXJyYXk8U3VydmV5VmFsaWRhdG9yPiB7XG4gICAgdmFyIHZhbGlkYXRvcnMgPSBzdXBlci5nZXRWYWxpZGF0b3JzKCk7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pbnB1dFR5cGUgPT09IFwiZW1haWxcIiAmJlxuICAgICAgIXRoaXMudmFsaWRhdG9ycy5zb21lKCh2KSA9PiB2LmdldFR5cGUoKSA9PT0gXCJlbWFpbHZhbGlkYXRvclwiKVxuICAgICkge1xuICAgICAgdmFsaWRhdG9ycy5wdXNoKG5ldyBFbWFpbFZhbGlkYXRvcigpKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkYXRvcnM7XG4gIH1cbiAgaXNMYXlvdXRUeXBlU3VwcG9ydGVkKGxheW91dFR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgdGV4dCBpbnB1dCBzaXplXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2l6ZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNpemUodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaXplXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBpc1RleHRJbnB1dCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgW1widGV4dFwiLCBcInNlYXJjaFwiLCBcInRlbFwiLCBcInVybFwiLCBcImVtYWlsXCIsIFwicGFzc3dvcmRcIl0uaW5kZXhPZihcbiAgICAgICAgdGhpcy5pbnB1dFR5cGVcbiAgICAgICkgPiAtMVxuICAgICk7XG4gIH1cbiAgcHVibGljIGdldCBpbnB1dFNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaW5wdXRTaXplXCIsIDApO1xuICB9XG4gIHB1YmxpYyBnZXQgaW5wdXRXaWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpbnB1dFdpZHRoXCIpO1xuICB9XG4gIHB1YmxpYyB1cGRhdGVJbnB1dFNpemUoKSB7XG4gICAgdmFyIHNpemUgPSB0aGlzLmlzVGV4dElucHV0ICYmIHRoaXMuc2l6ZSA+IDAgPyB0aGlzLnNpemUgOiAwO1xuICAgIGlmIChcbiAgICAgIHRoaXMuaXNUZXh0SW5wdXQgJiZcbiAgICAgIHNpemUgPCAxICYmXG4gICAgICB0aGlzLnBhcmVudCAmJlxuICAgICAgISEoPGFueT50aGlzLnBhcmVudClbXCJpdGVtU2l6ZVwiXVxuICAgICkge1xuICAgICAgc2l6ZSA9ICg8YW55PnRoaXMucGFyZW50KVtcIml0ZW1TaXplXCJdO1xuICAgIH1cbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpbnB1dFNpemVcIiwgc2l6ZSk7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaW5wdXRXaWR0aFwiLCBzaXplID4gMCA/IFwiYXV0b1wiIDogXCJcIik7XG4gIH1cbiAgLyoqXG4gICAqIFRleHQgYXV0byBjb21wbGV0ZVxuICAgKi9cbiAgcHVibGljIGdldCBhdXRvQ29tcGxldGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiYXV0b0NvbXBsZXRlXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgYXV0b0NvbXBsZXRlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiYXV0b0NvbXBsZXRlXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIHZhbHVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1pbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtaW5cIik7XG4gIH1cbiAgcHVibGljIHNldCBtaW4odmFsOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5pc1ZhbHVlRXhwcmVzc2lvbih2YWwpKSB7XG4gICAgICB0aGlzLm1pblZhbHVlRXhwcmVzc2lvbiA9IHZhbC5zdWJzdHIoMSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1pblwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSB2YWx1ZVxuICAgKi9cbiAgcHVibGljIGdldCBtYXgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWF4XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4KHZhbDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUV4cHJlc3Npb24odmFsKSkge1xuICAgICAgdGhpcy5tYXhWYWx1ZUV4cHJlc3Npb24gPSB2YWwuc3Vic3RyKDEpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtYXhcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIG1pbmltdW0gdmFsdWUgdGhhdCB5b3UgY2FuIHNldHVwIGFzIGV4cHJlc3Npb24sIGZvciBleGFtcGxlIHRvZGF5KC0xKSA9IHllc3RlcmRheTtcbiAgICovXG4gIHB1YmxpYyBnZXQgbWluVmFsdWVFeHByZXNzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1pblZhbHVlRXhwcmVzc2lvblwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1pblZhbHVlRXhwcmVzc2lvbih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1pblZhbHVlRXhwcmVzc2lvblwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSB2YWx1ZSB0aGF0IHlvdSBjYW4gc2V0dXAgYXMgZXhwcmVzc2lvbiwgZm9yIGV4YW1wbGUgdG9kYXkoMSkgPSB0b21vcnJvdztcbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4VmFsdWVFeHByZXNzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1heFZhbHVlRXhwcmVzc2lvblwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heFZhbHVlRXhwcmVzc2lvbih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1heFZhbHVlRXhwcmVzc2lvblwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgcmVuZGVyZWRNaW4oKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmVuZGVyZWRNaW5cIik7XG4gIH1cbiAgcHVibGljIGdldCByZW5kZXJlZE1heCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyZW5kZXJlZE1heFwiKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHRleHQgdGhhdCBzaG93cyB3aGVuIHZhbHVlIGlzIGxlc3MgdGhhbiBtaW4gcHJvcGVydHkuXG4gICAqIEBzZWUgbWluXG4gICAqIEBzZWUgbWF4RXJyb3JUZXh0XG4gICAqL1xuICBwdWJsaWMgZ2V0IG1pbkVycm9yVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwibWluRXJyb3JUZXh0XCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibWluRXJyb3JcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgbWluRXJyb3JUZXh0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJtaW5FcnJvclRleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jTWluRXJyb3JUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcIm1pbkVycm9yVGV4dFwiKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHRleHQgdGhhdCBzaG93cyB3aGVuIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBtYW4gcHJvcGVydHkuXG4gICAqIEBzZWUgbWF4XG4gICAqIEBzZWUgbWluRXJyb3JUZXh0XG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heEVycm9yVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwibWF4RXJyb3JUZXh0XCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibWF4RXJyb3JcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4RXJyb3JUZXh0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJtYXhFcnJvclRleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jTWF4RXJyb3JUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcIm1heEVycm9yVGV4dFwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkb25seSBwcm9wZXJ0eSB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBpbnB1dFR5cGUgYWxsb3dzIHRvIHNldCBtaW4gYW5kIG1heCBwcm9wZXJ0aWVzXG4gICAqIEBzZWUgaW5wdXRUeXBlXG4gICAqIEBzZWUgbWluXG4gICAqIEBzZWUgbWF4XG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzTWluTWF4VHlwZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gbWluTWF4VHlwZXMuaW5kZXhPZih0aGlzLmlucHV0VHlwZSkgPiAtMTtcbiAgfVxuICBwcm90ZWN0ZWQgb25DaGVja0ZvckVycm9ycyhcbiAgICBlcnJvcnM6IEFycmF5PFN1cnZleUVycm9yPixcbiAgICBpc09uVmFsdWVDaGFuZ2VkOiBib29sZWFuXG4gICkge1xuICAgIHN1cGVyLm9uQ2hlY2tGb3JFcnJvcnMoZXJyb3JzLCBpc09uVmFsdWVDaGFuZ2VkKTtcbiAgICBpZiAoaXNPblZhbHVlQ2hhbmdlZCB8fCB0aGlzLmNhblNldFZhbHVlVG9TdXJ2ZXkoKSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmlzVmFsdWVMZXNzTWluKSB7XG4gICAgICBlcnJvcnMucHVzaChcbiAgICAgICAgbmV3IEN1c3RvbUVycm9yKFxuICAgICAgICAgIHRoaXMuZ2V0TWluTWF4RXJyb3JUZXh0KFxuICAgICAgICAgICAgdGhpcy5taW5FcnJvclRleHQsXG4gICAgICAgICAgICB0aGlzLmdldENhbGN1bGF0ZWRNaW5NYXgodGhpcy5yZW5kZXJlZE1pbilcbiAgICAgICAgICApLFxuICAgICAgICAgIHRoaXNcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUdyZWF0ZXJNYXgpIHtcbiAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICBuZXcgQ3VzdG9tRXJyb3IoXG4gICAgICAgICAgdGhpcy5nZXRNaW5NYXhFcnJvclRleHQoXG4gICAgICAgICAgICB0aGlzLm1heEVycm9yVGV4dCxcbiAgICAgICAgICAgIHRoaXMuZ2V0Q2FsY3VsYXRlZE1pbk1heCh0aGlzLnJlbmRlcmVkTWF4KVxuICAgICAgICAgICksXG4gICAgICAgICAgdGhpc1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgY2FuU2V0VmFsdWVUb1N1cnZleSgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuaXNNaW5NYXhUeXBlKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodGhpcy5pc1ZhbHVlTGVzc01pbikgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLmlzVmFsdWVHcmVhdGVyTWF4KSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJpdmF0ZSBnZXRNaW5NYXhFcnJvclRleHQoZXJyb3JUZXh0OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICghdmFsdWUpIHJldHVybiBlcnJvclRleHQ7XG4gICAgcmV0dXJuIGVycm9yVGV4dC5yZXBsYWNlKFwiezB9XCIsIHZhbHVlLnRvU3RyaW5nKCkpO1xuICB9XG4gIHByaXZhdGUgZ2V0IGlzVmFsdWVMZXNzTWluKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAhdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy5yZW5kZXJlZE1pbikgJiZcbiAgICAgIHRoaXMuZ2V0Q2FsY3VsYXRlZE1pbk1heCh0aGlzLnZhbHVlKSA8XG4gICAgICAgIHRoaXMuZ2V0Q2FsY3VsYXRlZE1pbk1heCh0aGlzLnJlbmRlcmVkTWluKVxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgaXNWYWx1ZUdyZWF0ZXJNYXgoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICF0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLnJlbmRlcmVkTWF4KSAmJlxuICAgICAgdGhpcy5nZXRDYWxjdWxhdGVkTWluTWF4KHRoaXMudmFsdWUpID5cbiAgICAgICAgdGhpcy5nZXRDYWxjdWxhdGVkTWluTWF4KHRoaXMucmVuZGVyZWRNYXgpXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGdldCBpc0RhdGVJbnB1dFR5cGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaW5wdXRUeXBlID09PSBcImRhdGVcIiB8fCB0aGlzLmlucHV0VHlwZSA9PT0gXCJkYXRldGltZS1sb2NhbFwiO1xuICB9XG4gIHByaXZhdGUgZ2V0Q2FsY3VsYXRlZE1pbk1heChtaW5NYXg6IGFueSk6IGFueSB7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUVtcHR5KG1pbk1heCkpIHJldHVybiBtaW5NYXg7XG4gICAgcmV0dXJuIHRoaXMuaXNEYXRlSW5wdXRUeXBlID8gbmV3IERhdGUobWluTWF4KSA6IG1pbk1heDtcbiAgfVxuICBwcml2YXRlIHNldFJlbmRlcmVkTWluTWF4KFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4gPSBudWxsLFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+ID0gbnVsbFxuICApIHtcbiAgICB0aGlzLnNldFZhbHVlQW5kUnVuRXhwcmVzc2lvbihcbiAgICAgIHRoaXMubWluVmFsdWVFeHByZXNzaW9uLFxuICAgICAgdGhpcy5taW4sXG4gICAgICAodmFsKSA9PiB7XG4gICAgICAgIGlmICghdmFsICYmIHRoaXMuaXNEYXRlSW5wdXRUeXBlICYmICEhc2V0dGluZ3MubWluRGF0ZSkge1xuICAgICAgICAgIHZhbCA9IHNldHRpbmdzLm1pbkRhdGU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmVuZGVyZWRNaW5cIiwgdmFsKTtcbiAgICAgIH0sXG4gICAgICB2YWx1ZXMsXG4gICAgICBwcm9wZXJ0aWVzXG4gICAgKTtcbiAgICB0aGlzLnNldFZhbHVlQW5kUnVuRXhwcmVzc2lvbihcbiAgICAgIHRoaXMubWF4VmFsdWVFeHByZXNzaW9uLFxuICAgICAgdGhpcy5tYXgsXG4gICAgICAodmFsKSA9PiB7XG4gICAgICAgIGlmICghdmFsICYmIHRoaXMuaXNEYXRlSW5wdXRUeXBlKSB7XG4gICAgICAgICAgdmFsID0gISFzZXR0aW5ncy5tYXhEYXRlID8gc2V0dGluZ3MubWF4RGF0ZSA6IFwiMjk5OS0xMi0zMVwiO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJlbmRlcmVkTWF4XCIsIHZhbCk7XG4gICAgICB9LFxuICAgICAgdmFsdWVzLFxuICAgICAgcHJvcGVydGllc1xuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHN0ZXAgdmFsdWVcbiAgICovXG4gIHB1YmxpYyBnZXQgc3RlcCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzdGVwXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc3RlcCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInN0ZXBcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHJlbmRlcmVkU3RlcCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLnN0ZXApID8gXCJhbnlcIiA6IHRoaXMuc3RlcDtcbiAgfVxuICBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHtcbiAgICByZXR1cm4gW1wiZGF0ZVwiLCBcImRhdGV0aW1lXCIsIFwiZGF0ZXRpbWUtbG9jYWxcIl0uaW5kZXhPZih0aGlzLmlucHV0VHlwZSkgPCAwO1xuICB9XG4gIHB1YmxpYyBzdXBwb3J0R29OZXh0UGFnZUVycm9yKCkge1xuICAgIHJldHVybiBbXCJkYXRlXCIsIFwiZGF0ZXRpbWVcIiwgXCJkYXRldGltZS1sb2NhbFwiXS5pbmRleE9mKHRoaXMuaW5wdXRUeXBlKSA8IDA7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIHJlY29tbWVuZGVkIG9wdGlvbnMgYXZhaWxhYmxlIHRvIGNob29zZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgZGF0YUxpc3QoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMubG9jRGF0YUxpc3QudmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCBkYXRhTGlzdCh2YWw6IEFycmF5PHN0cmluZz4pIHtcbiAgICB0aGlzLmxvY0RhdGFMaXN0LnZhbHVlID0gdmFsO1xuICB9XG4gIGdldCBsb2NEYXRhTGlzdCgpOiBMb2NhbGl6YWJsZVN0cmluZ3Mge1xuICAgIHJldHVybiB0aGlzLmxvY0RhdGFMaXN0VmFsdWU7XG4gIH1cbiAgcHVibGljIGdldCBkYXRhTGlzdElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubG9jRGF0YUxpc3QuaGFzVmFsdWUoKSA/IHRoaXMuaWQgKyBcIl9kYXRhbGlzdFwiIDogXCJcIjtcbiAgfVxuICBwcm90ZWN0ZWQgY2FuUnVuVmFsaWRhdG9ycyhpc09uVmFsdWVDaGFuZ2VkOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuZXJyb3JzLmxlbmd0aCA+IDAgfHxcbiAgICAgICFpc09uVmFsdWVDaGFuZ2VkIHx8XG4gICAgICB0aGlzLnN1cHBvcnRHb05leHRQYWdlRXJyb3IoKVxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHNldE5ld1ZhbHVlKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBuZXdWYWx1ZSA9IHRoaXMuY29ycmVjdFZhbHVlVHlwZShuZXdWYWx1ZSk7XG4gICAgc3VwZXIuc2V0TmV3VmFsdWUobmV3VmFsdWUpO1xuICB9XG4gIHByb3RlY3RlZCBjb3JyZWN0VmFsdWVUeXBlKG5ld1ZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGlmICghbmV3VmFsdWUpIHJldHVybiBuZXdWYWx1ZTtcbiAgICBpZiAodGhpcy5pbnB1dFR5cGUgPT0gXCJudW1iZXJcIiB8fCB0aGlzLmlucHV0VHlwZSA9PSBcInJhbmdlXCIpIHtcbiAgICAgIHJldHVybiBIZWxwZXJzLmlzTnVtYmVyKG5ld1ZhbHVlKSA/IHBhcnNlRmxvYXQobmV3VmFsdWUpIDogXCJcIjtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1ZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCBoYXNQbGFjZUhvbGRlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXNSZWFkT25seSAmJiB0aGlzLmlucHV0VHlwZSAhPT0gXCJyYW5nZVwiO1xuICB9XG4gIGdldCBpbnB1dFN0eWxlKCk6IGFueSB7XG4gICAgdmFyIHN0eWxlOiBhbnkgPSB7fTtcbiAgICBpZiAoISF0aGlzLmlucHV0V2lkdGgpIHtcbiAgICAgIHN0eWxlLndpZHRoID0gdGhpcy5pbnB1dFdpZHRoO1xuICAgIH1cbiAgICByZXR1cm4gc3R5bGU7XG4gIH1cbn1cblxuY29uc3QgbWluTWF4VHlwZXMgPSBbXG4gIFwibnVtYmVyXCIsXG4gIFwicmFuZ2VcIixcbiAgXCJkYXRlXCIsXG4gIFwiZGF0ZXRpbWUtbG9jYWxcIixcbiAgXCJtb250aFwiLFxuICBcInRpbWVcIixcbiAgXCJ3ZWVrXCIsXG5dO1xuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcInRleHRcIixcbiAgW1xuICAgIHtcbiAgICAgIG5hbWU6IFwiaW5wdXRUeXBlXCIsXG4gICAgICBkZWZhdWx0OiBcInRleHRcIixcbiAgICAgIGNob2ljZXM6IFtcbiAgICAgICAgXCJjb2xvclwiLFxuICAgICAgICBcImRhdGVcIixcbiAgICAgICAgXCJkYXRldGltZVwiLFxuICAgICAgICBcImRhdGV0aW1lLWxvY2FsXCIsXG4gICAgICAgIFwiZW1haWxcIixcbiAgICAgICAgXCJtb250aFwiLFxuICAgICAgICBcIm51bWJlclwiLFxuICAgICAgICBcInBhc3N3b3JkXCIsXG4gICAgICAgIFwicmFuZ2VcIixcbiAgICAgICAgXCJ0ZWxcIixcbiAgICAgICAgXCJ0ZXh0XCIsXG4gICAgICAgIFwidGltZVwiLFxuICAgICAgICBcInVybFwiLFxuICAgICAgICBcIndlZWtcIixcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInNpemU6bnVtYmVyXCIsXG4gICAgICBtaW5WYWx1ZTogMCxcbiAgICAgIGRlcGVuZHNPbjogXCJpbnB1dFR5cGVcIixcbiAgICAgIHZpc2libGVJZjogZnVuY3Rpb24ob2JqOiBhbnkpIHtcbiAgICAgICAgaWYgKCFvYmopIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIG9iai5pc1RleHRJbnB1dDtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInRleHRVcGRhdGVNb2RlXCIsXG4gICAgICBkZWZhdWx0OiBcImRlZmF1bHRcIixcbiAgICAgIGNob2ljZXM6IFtcImRlZmF1bHRcIiwgXCJvbkJsdXJcIiwgXCJvblR5cGluZ1wiXSxcbiAgICAgIGRlcGVuZHNPbjogXCJpbnB1dFR5cGVcIixcbiAgICAgIHZpc2libGVJZjogZnVuY3Rpb24ob2JqOiBhbnkpIHtcbiAgICAgICAgaWYgKCFvYmopIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIG9iai5pc1RleHRJbnB1dDtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImF1dG9Db21wbGV0ZVwiLFxuICAgICAgZGF0YUxpc3Q6IFtcbiAgICAgICAgXCJuYW1lXCIsXG4gICAgICAgIFwiaG9ub3JpZmljLXByZWZpeFwiLFxuICAgICAgICBcImdpdmVuLW5hbWVcIixcbiAgICAgICAgXCJhZGRpdGlvbmFsLW5hbWVcIixcbiAgICAgICAgXCJmYW1pbHktbmFtZVwiLFxuICAgICAgICBcImhvbm9yaWZpYy1zdWZmaXhcIixcbiAgICAgICAgXCJuaWNrbmFtZVwiLFxuICAgICAgICBcIm9yZ2FuaXphdGlvbi10aXRsZVwiLFxuICAgICAgICBcInVzZXJuYW1lXCIsXG4gICAgICAgIFwibmV3LXBhc3N3b3JkXCIsXG4gICAgICAgIFwiY3VycmVudC1wYXNzd29yZFwiLFxuICAgICAgICBcIm9yZ2FuaXphdGlvblwiLFxuICAgICAgICBcInN0cmVldC1hZGRyZXNzXCIsXG4gICAgICAgIFwiYWRkcmVzcy1saW5lMVwiLFxuICAgICAgICBcImFkZHJlc3MtbGluZTJcIixcbiAgICAgICAgXCJhZGRyZXNzLWxpbmUzXCIsXG4gICAgICAgIFwiYWRkcmVzcy1sZXZlbDRcIixcbiAgICAgICAgXCJhZGRyZXNzLWxldmVsM1wiLFxuICAgICAgICBcImFkZHJlc3MtbGV2ZWwyXCIsXG4gICAgICAgIFwiYWRkcmVzcy1sZXZlbDFcIixcbiAgICAgICAgXCJjb3VudHJ5XCIsXG4gICAgICAgIFwiY291bnRyeS1uYW1lXCIsXG4gICAgICAgIFwicG9zdGFsLWNvZGVcIixcbiAgICAgICAgXCJjYy1uYW1lXCIsXG4gICAgICAgIFwiY2MtZ2l2ZW4tbmFtZVwiLFxuICAgICAgICBcImNjLWFkZGl0aW9uYWwtbmFtZVwiLFxuICAgICAgICBcImNjLWZhbWlseS1uYW1lXCIsXG4gICAgICAgIFwiY2MtbnVtYmVyXCIsXG4gICAgICAgIFwiY2MtZXhwXCIsXG4gICAgICAgIFwiY2MtZXhwLW1vbnRoXCIsXG4gICAgICAgIFwiY2MtZXhwLXllYXJcIixcbiAgICAgICAgXCJjYy1jc2NcIixcbiAgICAgICAgXCJjYy10eXBlXCIsXG4gICAgICAgIFwidHJhbnNhY3Rpb24tY3VycmVuY3lcIixcbiAgICAgICAgXCJ0cmFuc2FjdGlvbi1hbW91bnRcIixcbiAgICAgICAgXCJsYW5ndWFnZVwiLFxuICAgICAgICBcImJkYXlcIixcbiAgICAgICAgXCJiZGF5LWRheVwiLFxuICAgICAgICBcImJkYXktbW9udGhcIixcbiAgICAgICAgXCJiZGF5LXllYXJcIixcbiAgICAgICAgXCJzZXhcIixcbiAgICAgICAgXCJ1cmxcIixcbiAgICAgICAgXCJwaG90b1wiLFxuICAgICAgICBcInRlbFwiLFxuICAgICAgICBcInRlbC1jb3VudHJ5LWNvZGVcIixcbiAgICAgICAgXCJ0ZWwtbmF0aW9uYWxcIixcbiAgICAgICAgXCJ0ZWwtYXJlYS1jb2RlXCIsXG4gICAgICAgIFwidGVsLWxvY2FsXCIsXG4gICAgICAgIFwidGVsLWxvY2FsLXByZWZpeFwiLFxuICAgICAgICBcInRlbC1sb2NhbC1zdWZmaXhcIixcbiAgICAgICAgXCJ0ZWwtZXh0ZW5zaW9uXCIsXG4gICAgICAgIFwiZW1haWxcIixcbiAgICAgICAgXCJpbXBwXCIsXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJtaW5cIixcbiAgICAgIGRlcGVuZHNPbjogXCJpbnB1dFR5cGVcIixcbiAgICAgIHZpc2libGVJZjogZnVuY3Rpb24ob2JqOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuICEhb2JqICYmIG9iai5pc01pbk1heFR5cGU7XG4gICAgICB9LFxuICAgICAgb25Qcm9wZXJ0eUVkaXRvclVwZGF0ZTogZnVuY3Rpb24ob2JqOiBhbnksIHByb3BlcnR5RWRpdG9yOiBhbnkpIHtcbiAgICAgICAgcHJvcGVydHlFZGl0b3IuaW5wdXRUeXBlID0gb2JqLmlucHV0VHlwZTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcIm1heFwiLFxuICAgICAgZGVwZW5kc09uOiBcImlucHV0VHlwZVwiLFxuICAgICAgdmlzaWJsZUlmOiBmdW5jdGlvbihvYmo6IGFueSkge1xuICAgICAgICByZXR1cm4gISFvYmogJiYgb2JqLmlzTWluTWF4VHlwZTtcbiAgICAgIH0sXG4gICAgICBvblByb3BlcnR5RWRpdG9yVXBkYXRlOiBmdW5jdGlvbihvYmo6IGFueSwgcHJvcGVydHlFZGl0b3I6IGFueSkge1xuICAgICAgICBwcm9wZXJ0eUVkaXRvci5pbnB1dFR5cGUgPSBvYmouaW5wdXRUeXBlO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwibWluVmFsdWVFeHByZXNzaW9uOmV4cHJlc3Npb25cIixcbiAgICAgIGNhdGVnb3J5OiBcImxvZ2ljXCIsXG4gICAgICBkZXBlbmRzT246IFwiaW5wdXRUeXBlXCIsXG4gICAgICB2aXNpYmxlSWY6IGZ1bmN0aW9uKG9iajogYW55KSB7XG4gICAgICAgIHJldHVybiAhIW9iaiAmJiBvYmouaXNNaW5NYXhUeXBlO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwibWF4VmFsdWVFeHByZXNzaW9uOmV4cHJlc3Npb25cIixcbiAgICAgIGNhdGVnb3J5OiBcImxvZ2ljXCIsXG4gICAgICBkZXBlbmRzT246IFwiaW5wdXRUeXBlXCIsXG4gICAgICB2aXNpYmxlSWY6IGZ1bmN0aW9uKG9iajogYW55KSB7XG4gICAgICAgIHJldHVybiAhIW9iaiAmJiBvYmouaXNNaW5NYXhUeXBlO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwibWluRXJyb3JUZXh0XCIsXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jTWluRXJyb3JUZXh0XCIsXG4gICAgICBkZXBlbmRzT246IFwiaW5wdXRUeXBlXCIsXG4gICAgICB2aXNpYmxlSWY6IGZ1bmN0aW9uKG9iajogYW55KSB7XG4gICAgICAgIHJldHVybiAhIW9iaiAmJiBvYmouaXNNaW5NYXhUeXBlO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwibWF4RXJyb3JUZXh0XCIsXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jTWF4RXJyb3JUZXh0XCIsXG4gICAgICBkZXBlbmRzT246IFwiaW5wdXRUeXBlXCIsXG4gICAgICB2aXNpYmxlSWY6IGZ1bmN0aW9uKG9iajogYW55KSB7XG4gICAgICAgIHJldHVybiAhIW9iaiAmJiBvYmouaXNNaW5NYXhUeXBlO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwic3RlcDpudW1iZXJcIixcbiAgICAgIGRlcGVuZHNPbjogXCJpbnB1dFR5cGVcIixcbiAgICAgIHZpc2libGVJZjogZnVuY3Rpb24ob2JqOiBhbnkpIHtcbiAgICAgICAgaWYgKCFvYmopIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIG9iai5pbnB1dFR5cGUgPT09IFwibnVtYmVyXCI7XG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJtYXhMZW5ndGg6bnVtYmVyXCIsXG4gICAgICBkZWZhdWx0OiAtMSxcbiAgICAgIGRlcGVuZHNPbjogXCJpbnB1dFR5cGVcIixcbiAgICAgIHZpc2libGVJZjogZnVuY3Rpb24ob2JqOiBhbnkpIHtcbiAgICAgICAgaWYgKCFvYmopIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIG9iai5pc1RleHRJbnB1dDtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInBsYWNlSG9sZGVyXCIsXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jUGxhY2VIb2xkZXJcIixcbiAgICAgIGRlcGVuZHNPbjogXCJpbnB1dFR5cGVcIixcbiAgICAgIHZpc2libGVJZjogZnVuY3Rpb24ob2JqOiBhbnkpIHtcbiAgICAgICAgaWYgKCFvYmopIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIG9iai5pc1RleHRJbnB1dDtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImRhdGFMaXN0OnN0cmluZ1tdXCIsXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jRGF0YUxpc3RcIixcbiAgICAgIGRlcGVuZHNPbjogXCJpbnB1dFR5cGVcIixcbiAgICAgIHZpc2libGVJZjogZnVuY3Rpb24ob2JqOiBhbnkpIHtcbiAgICAgICAgaWYgKCFvYmopIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIG9iai5pbnB1dFR5cGUgPT09IFwidGV4dFwiO1xuICAgICAgfSxcbiAgICB9LFxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uVGV4dE1vZGVsKFwiXCIpO1xuICB9LFxuICBcInRleHRiYXNlXCJcbik7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwidGV4dFwiLCAobmFtZSkgPT4ge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uVGV4dE1vZGVsKG5hbWUpO1xufSk7XG4iLCJpbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgQ3NzQ2xhc3NCdWlsZGVyIH0gZnJvbSBcIi4vdXRpbHMvY3NzQ2xhc3NCdWlsZGVyXCI7XG5cbi8qKlxuICogQSBCYXNlIE1vZGVsIGZvciBhIGNvbW1lbnQgYW5kIHRleHQgcXVlc3Rpb25zXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvblRleHRCYXNlIGV4dGVuZHMgUXVlc3Rpb24ge1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwicGxhY2VIb2xkZXJcIiwgdGhpcyk7XG4gIH1cbiAgcHJvdGVjdGVkIGlzVGV4dFZhbHVlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSB0ZXh0IGxlbmd0aC4gSWYgaXQgaXMgLTEsIGRlZmF1bCB2YWx1ZSwgdGhlbiB0aGUgc3VydmV5IG1heFRleHRMZW5ndGggcHJvcGVydHkgd2lsbCBiZSB1c2VkLlxuICAgKiBJZiBpdCBpcyAwLCB0aGVuIHRoZSB2YWx1ZSBpcyB1bmxpbWl0ZWRcbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5tYXhUZXh0TGVuZ3RoXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heExlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhMZW5ndGhcIik7XG4gIH1cbiAgcHVibGljIHNldCBtYXhMZW5ndGgodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtYXhMZW5ndGhcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0TWF4TGVuZ3RoKCk6IGFueSB7XG4gICAgcmV0dXJuIEhlbHBlcnMuZ2V0TWF4TGVuZ3RoKFxuICAgICAgdGhpcy5tYXhMZW5ndGgsXG4gICAgICB0aGlzLnN1cnZleSA/IHRoaXMuc3VydmV5Lm1heFRleHRMZW5ndGggOiAtMVxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIHNldCB0aGUgaW5wdXQgcGxhY2UgaG9sZGVyLlxuICAgKi9cbiAgcHVibGljIGdldCBwbGFjZUhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInBsYWNlSG9sZGVyXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcGxhY2VIb2xkZXIodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInBsYWNlSG9sZGVyXCIsIHZhbCk7XG4gICAgdGhpcy5jYWxjUmVuZGVyZWRQbGFjZUhvbGRlcigpO1xuICB9XG4gIGdldCBsb2NQbGFjZUhvbGRlcigpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJwbGFjZUhvbGRlclwiKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInRleHRiYXNlXCI7XG4gIH1cbiAgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3VwZXIuaXNFbXB0eSgpIHx8IHRoaXMudmFsdWUgPT09IFwiXCI7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyBhIHZhbHVlIHRoYXQgc3BlY2lmaWVzIGhvdyB0aGUgcXVlc3Rpb24gdXBkYXRlcyBpdCdzIHZhbHVlLlxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZTpcbiAgICogLSBgZGVmYXVsdGAgLSBnZXQgdGhlIHZhbHVlIGZyb20gc3VydmV5LnRleHRVcGRhdGVNb2RlXG4gICAqIC0gYG9uQmx1cmAgLSB0aGUgdmFsdWUgaXMgdXBkYXRlZCBhZnRlciBhbiBpbnB1dCBsb3NlcyB0aGUgZm9jdXMuXG4gICAqIC0gYG9uVHlwaW5nYCAtIHVwZGF0ZSB0aGUgdmFsdWUgb2YgdGV4dCBxdWVzdGlvbnMsIFwidGV4dFwiIGFuZCBcImNvbW1lbnRcIiwgb24gZXZlcnkga2V5IHByZXNzLlxuICAgKlxuICAgKiBOb3RlLCB0aGF0IHNldHRpbmcgdG8gXCJvblR5cGluZ1wiIG1heSBsZWFkIHRvIGEgcGVyZm9ybWFuY2UgZGVncmFkYXRpb24sIGluIGNhc2UgeW91IGhhdmUgbWFueSBleHByZXNzaW9ucyBpbiB0aGUgc3VydmV5LlxuICAgKiBAc2VlIHN1cnZleS50ZXh0VXBkYXRlTW9kZVxuICAgKi9cbiAgcHVibGljIGdldCB0ZXh0VXBkYXRlTW9kZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ0ZXh0VXBkYXRlTW9kZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRleHRVcGRhdGVNb2RlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidGV4dFVwZGF0ZU1vZGVcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzU3VydmV5SW5wdXRUZXh0VXBkYXRlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnRleHRVcGRhdGVNb2RlID09IFwiZGVmYXVsdFwiKVxuICAgICAgcmV0dXJuICEhdGhpcy5zdXJ2ZXkgPyB0aGlzLnN1cnZleS5pc1VwZGF0ZVZhbHVlVGV4dE9uVHlwaW5nIDogZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMudGV4dFVwZGF0ZU1vZGUgPT0gXCJvblR5cGluZ1wiO1xuICB9XG4gIHB1YmxpYyBnZXQgcmVuZGVyZWRQbGFjZUhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyZW5kZXJlZFBsYWNlSG9sZGVyXCIpO1xuICB9XG4gIHByb3RlY3RlZCBzZXRSZW5kZXJlZFBsYWNlSG9sZGVyKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmVuZGVyZWRQbGFjZUhvbGRlclwiLCB2YWwpO1xuICB9XG4gIHByb3RlY3RlZCBvblJlYWRPbmx5Q2hhbmdlZCgpIHtcbiAgICBzdXBlci5vblJlYWRPbmx5Q2hhbmdlZCgpO1xuICAgIHRoaXMuY2FsY1JlbmRlcmVkUGxhY2VIb2xkZXIoKTtcbiAgfVxuICBwdWJsaWMgb25TdXJ2ZXlMb2FkKCk6IHZvaWQge1xuICAgIHRoaXMuY2FsY1JlbmRlcmVkUGxhY2VIb2xkZXIoKTtcbiAgICBzdXBlci5vblN1cnZleUxvYWQoKTtcbiAgfVxuICBwdWJsaWMgbG9jYWxlQ2hhbmdlZCgpIHtcbiAgICBzdXBlci5sb2NhbGVDaGFuZ2VkKCk7XG4gICAgdGhpcy5jYWxjUmVuZGVyZWRQbGFjZUhvbGRlcigpO1xuICB9XG4gIHByb3RlY3RlZCBjYWxjUmVuZGVyZWRQbGFjZUhvbGRlcigpIHtcbiAgICBsZXQgcmVzID0gdGhpcy5wbGFjZUhvbGRlcjtcbiAgICBpZighIXJlcyAmJiAhdGhpcy5oYXNQbGFjZUhvbGRlcigpKSB7XG4gICAgICByZXMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRoaXMuc2V0UmVuZGVyZWRQbGFjZUhvbGRlcihyZXMpO1xuICB9XG4gIHByb3RlY3RlZCBoYXNQbGFjZUhvbGRlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXNSZWFkT25seTtcbiAgfVxuICBwdWJsaWMgZ2V0Q29udHJvbENsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5ldyBDc3NDbGFzc0J1aWxkZXIoKVxuICAgICAgLmFwcGVuZCh0aGlzLmNzc0NsYXNzZXMucm9vdClcbiAgICAgIC5hcHBlbmQodGhpcy5jc3NDbGFzc2VzLm9uRXJyb3IsIHRoaXMuZXJyb3JzLmxlbmd0aCA+IDApXG4gICAgICAuYXBwZW5kKHRoaXMuY3NzQ2xhc3Nlcy5jb250cm9sRGlzYWJsZWQsIHRoaXMuaXNSZWFkT25seSlcbiAgICAgIC50b1N0cmluZygpO1xuICB9XG59XG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcInRleHRiYXNlXCIsXG4gIFtdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uVGV4dEJhc2UoXCJcIik7XG4gIH0sXG4gIFwicXVlc3Rpb25cIlxuKTtcbiIsImltcG9ydCB7IEhhc2hUYWJsZSB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IElFbGVtZW50IH0gZnJvbSBcIi4vYmFzZS1pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuXG4vL1RPRE8gcmVwbGFjZSBjb21wbGV0ZWx5IHdpdGggRWxlbWVudEZhY3RvcnlcbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkZhY3Rvcnkge1xuICBwdWJsaWMgc3RhdGljIEluc3RhbmNlOiBRdWVzdGlvbkZhY3RvcnkgPSBuZXcgUXVlc3Rpb25GYWN0b3J5KCk7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IERlZmF1bHRDaG9pY2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1xuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImNob2ljZXNfSXRlbVwiKSArIFwiMVwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImNob2ljZXNfSXRlbVwiKSArIFwiMlwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImNob2ljZXNfSXRlbVwiKSArIFwiM1wiLFxuICAgIF07XG4gIH1cbiAgcHVibGljIHN0YXRpYyBnZXQgRGVmYXVsdENvbHVtcygpOiBzdHJpbmdbXSB7XG4gICAgdmFyIGNvbE5hbWUgPSBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibWF0cml4X2NvbHVtblwiKSArIFwiIFwiO1xuICAgIHJldHVybiBbY29sTmFtZSArIFwiMVwiLCBjb2xOYW1lICsgXCIyXCIsIGNvbE5hbWUgKyBcIjNcIl07XG4gIH1cbiAgcHVibGljIHN0YXRpYyBnZXQgRGVmYXVsdFJvd3MoKTogc3RyaW5nW10ge1xuICAgIHZhciByb3dOYW1lID0gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm1hdHJpeF9yb3dcIikgKyBcIiBcIjtcbiAgICByZXR1cm4gW3Jvd05hbWUgKyBcIjFcIiwgcm93TmFtZSArIFwiMlwiXTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGdldCBEZWZhdWx0TXV0bGlwbGVUZXh0SXRlbXMoKTogc3RyaW5nW10ge1xuICAgIHZhciBpdGVtTmFtZSA9IHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJtdWx0aXBsZXRleHRfaXRlbW5hbWVcIik7XG4gICAgcmV0dXJuIFtpdGVtTmFtZSArIFwiMVwiLCBpdGVtTmFtZSArIFwiMlwiXTtcbiAgfVxuICBwcml2YXRlIGNyZWF0b3JIYXNoOiBIYXNoVGFibGU8KG5hbWU6IHN0cmluZykgPT4gUXVlc3Rpb24+ID0ge307XG5cbiAgcHVibGljIHJlZ2lzdGVyUXVlc3Rpb24oXG4gICAgcXVlc3Rpb25UeXBlOiBzdHJpbmcsXG4gICAgcXVlc3Rpb25DcmVhdG9yOiAobmFtZTogc3RyaW5nKSA9PiBRdWVzdGlvblxuICApIHtcbiAgICB0aGlzLmNyZWF0b3JIYXNoW3F1ZXN0aW9uVHlwZV0gPSBxdWVzdGlvbkNyZWF0b3I7XG4gIH1cbiAgcHVibGljIHVucmVnaXN0ZXJFbGVtZW50KGVsZW1lbnRUeXBlOiBzdHJpbmcpIHtcbiAgICBkZWxldGUgdGhpcy5jcmVhdG9ySGFzaFtlbGVtZW50VHlwZV07XG4gIH1cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIHRoaXMuY3JlYXRvckhhc2ggPSB7fTtcbiAgfVxuICBwdWJsaWMgZ2V0QWxsVHlwZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMuY3JlYXRvckhhc2gpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQuc29ydCgpO1xuICB9XG4gIHB1YmxpYyBjcmVhdGVRdWVzdGlvbihxdWVzdGlvblR5cGU6IHN0cmluZywgbmFtZTogc3RyaW5nKTogUXVlc3Rpb24ge1xuICAgIHZhciBjcmVhdG9yID0gdGhpcy5jcmVhdG9ySGFzaFtxdWVzdGlvblR5cGVdO1xuICAgIGlmIChjcmVhdG9yID09IG51bGwpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBjcmVhdG9yKG5hbWUpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFbGVtZW50RmFjdG9yeSB7XG4gIHB1YmxpYyBzdGF0aWMgSW5zdGFuY2U6IEVsZW1lbnRGYWN0b3J5ID0gbmV3IEVsZW1lbnRGYWN0b3J5KCk7XG4gIHByaXZhdGUgY3JlYXRvckhhc2g6IEhhc2hUYWJsZTwobmFtZTogc3RyaW5nKSA9PiBJRWxlbWVudD4gPSB7fTtcblxuICBwdWJsaWMgcmVnaXN0ZXJFbGVtZW50KFxuICAgIGVsZW1lbnRUeXBlOiBzdHJpbmcsXG4gICAgZWxlbWVudENyZWF0b3I6IChuYW1lOiBzdHJpbmcpID0+IElFbGVtZW50XG4gICkge1xuICAgIHRoaXMuY3JlYXRvckhhc2hbZWxlbWVudFR5cGVdID0gZWxlbWVudENyZWF0b3I7XG4gIH1cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIHRoaXMuY3JlYXRvckhhc2ggPSB7fTtcbiAgfVxuICBwdWJsaWMgdW5yZWdpc3RlckVsZW1lbnQoXG4gICAgZWxlbWVudFR5cGU6IHN0cmluZyxcbiAgICByZW1vdmVGcm9tU2VyaWFsaXplcjogYm9vbGVhbiA9IGZhbHNlXG4gICkge1xuICAgIGRlbGV0ZSB0aGlzLmNyZWF0b3JIYXNoW2VsZW1lbnRUeXBlXTtcbiAgICBRdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UudW5yZWdpc3RlckVsZW1lbnQoZWxlbWVudFR5cGUpO1xuICAgIGlmIChyZW1vdmVGcm9tU2VyaWFsaXplcikge1xuICAgICAgU2VyaWFsaXplci5yZW1vdmVDbGFzcyhlbGVtZW50VHlwZSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRBbGxUeXBlcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIgcmVzdWx0ID0gUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLmdldEFsbFR5cGVzKCk7XG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMuY3JlYXRvckhhc2gpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQuc29ydCgpO1xuICB9XG4gIHB1YmxpYyBjcmVhdGVFbGVtZW50KGVsZW1lbnRUeXBlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IElFbGVtZW50IHtcbiAgICB2YXIgY3JlYXRvciA9IHRoaXMuY3JlYXRvckhhc2hbZWxlbWVudFR5cGVdO1xuICAgIGlmIChjcmVhdG9yID09IG51bGwpXG4gICAgICByZXR1cm4gUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLmNyZWF0ZVF1ZXN0aW9uKGVsZW1lbnRUeXBlLCBuYW1lKTtcbiAgICByZXR1cm4gY3JlYXRvcihuYW1lKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUXVlc3Rpb24sIElDb25kaXRpb25PYmplY3QgfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFN1cnZleUVycm9yIH0gZnJvbSBcIi4vc3VydmV5LWVycm9yXCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3Igbm9uIHZhbHVlIHF1ZXN0aW9uLiBUaGlzIHF1ZXN0aW9uIGRvZXNuJ3QgYWRkIGFueSBuZXcgZnVuY3Rpb25hbGl0eS4gSXQgaGlkZXMgc29tZSBwcm9wZXJ0aWVzLCBpbmNsdWRpbmcgdGhlIHZhbHVlLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25Ob25WYWx1ZSBleHRlbmRzIFF1ZXN0aW9uIHtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJub252YWx1ZVwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzSW5wdXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzVGl0bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBnZXRUaXRsZUxvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbiAgcHVibGljIGdldCBoYXNDb21tZW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgaGFzRXJyb3JzKGZpcmVDYWxsYmFjazogYm9vbGVhbiA9IHRydWUsIHJlYzogYW55ID0gbnVsbCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgZ2V0QWxsRXJyb3JzKCk6IEFycmF5PFN1cnZleUVycm9yPiB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHB1YmxpYyBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGFkZENvbmRpdGlvbk9iamVjdHNCeUNvbnRleHQoXG4gICAgb2JqZWN0czogQXJyYXk8SUNvbmRpdGlvbk9iamVjdD4sXG4gICAgY29udGV4dDogYW55XG4gICkge31cbiAgcHVibGljIGdldENvbmRpdGlvbkpzb24ob3BlcmF0b3I6IHN0cmluZyA9IG51bGwsIHBhdGg6IHN0cmluZyA9IG51bGwpOiBhbnkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcIm5vbnZhbHVlXCIsXG4gIFtcbiAgICB7IG5hbWU6IFwidGl0bGVcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwiZGVzY3JpcHRpb25cIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwidmFsdWVOYW1lXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcImVuYWJsZUlmXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcImRlZmF1bHRWYWx1ZVwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJjb3JyZWN0QW5zd2VyXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcImlzUmVxdWlyZWRcIiwgdmlzaWJsZTogZmFsc2UsIGlzU2VyaWFsaXphYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJyZXF1aXJlZEVycm9yVGV4dFwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJyZWFkT25seVwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJyZXF1aXJlZElmXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcInZhbGlkYXRvcnNcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwidGl0bGVMb2NhdGlvblwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJ1c2VEaXNwbGF5VmFsdWVzSW5UaXRsZVwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICBdLFxuICBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvbk5vblZhbHVlKFwiXCIpO1xuICB9LFxuICBcInF1ZXN0aW9uXCJcbik7XG4iLCJpbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBSZW5kZXJlckZhY3Rvcnkge1xuICBwdWJsaWMgc3RhdGljIEluc3RhbmNlOiBSZW5kZXJlckZhY3RvcnkgPSBuZXcgUmVuZGVyZXJGYWN0b3J5KCk7XG5cbiAgcHJpdmF0ZSByZW5kZXJlcnNIYXNoOiB7XG4gICAgW3F1ZXN0aW9uVHlwZTogc3RyaW5nXTogeyBbcmVuZGVyQXM6IHN0cmluZ106IGFueSB9LFxuICB9ID0ge307XG5cbiAgcHVibGljIHVucmVnaXN0ZXJSZW5kZXJlcihxdWVzdGlvblR5cGU6IHN0cmluZywgcmVuZGVyZXJBczogc3RyaW5nKSB7XG4gICAgZGVsZXRlIHRoaXMucmVuZGVyZXJzSGFzaFtxdWVzdGlvblR5cGVdW3JlbmRlcmVyQXNdO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyUmVuZGVyZXIoXG4gICAgcXVlc3Rpb25UeXBlOiBzdHJpbmcsXG4gICAgcmVuZGVyQXM6IHN0cmluZyxcbiAgICByZW5kZXJlcjogYW55XG4gICkge1xuICAgIGlmICghdGhpcy5yZW5kZXJlcnNIYXNoW3F1ZXN0aW9uVHlwZV0pIHtcbiAgICAgIHRoaXMucmVuZGVyZXJzSGFzaFtxdWVzdGlvblR5cGVdID0ge307XG4gICAgfVxuICAgIHRoaXMucmVuZGVyZXJzSGFzaFtxdWVzdGlvblR5cGVdW3JlbmRlckFzXSA9IHJlbmRlcmVyO1xuICB9XG5cbiAgcHVibGljIGdldFJlbmRlcmVyKHF1ZXN0aW9uVHlwZTogc3RyaW5nLCByZW5kZXJBczogc3RyaW5nKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICh0aGlzLnJlbmRlcmVyc0hhc2hbcXVlc3Rpb25UeXBlXSAmJlxuICAgICAgICB0aGlzLnJlbmRlcmVyc0hhc2hbcXVlc3Rpb25UeXBlXVtyZW5kZXJBc10pIHx8XG4gICAgICBcImRlZmF1bHRcIlxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UmVuZGVyZXJCeVF1ZXN0aW9uKHF1ZXN0aW9uOiBRdWVzdGlvbik6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UmVuZGVyZXIocXVlc3Rpb24uZ2V0VHlwZSgpLCBxdWVzdGlvbi5yZW5kZXJBcyk7XG4gIH1cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIHRoaXMucmVuZGVyZXJzSGFzaCA9IHt9O1xuICB9XG59XG4iLCIvKipcbiAqIEdsb2JhbCBzdXJ2ZXkgc2V0dGluZ3NcbiAqL1xuZXhwb3J0IHZhciBzZXR0aW5ncyA9IHtcbiAgLyoqXG4gICAqIE9wdGlvbnMgZm9yIFN1cnZleUpTIGNvbXBhcmF0b3IuIEJ5IGRlZmF1bHQgd2UgdHJpbSBzdHJpbmdzIGFuZCBjb21wYXJlIHRoZW0gYXMgY2FzZSBpbnNlbnNpdGl2ZS4gVG8gY2hhbmdlIHRoZSBiZWhhdmlvciB5b3UgY2FuIHVzZSBmb2xsb3dpbmcgY29kZTpcbiAgICogc2V0dGluZ3MuY29tcGFyYXRvci50cmltU3RyaW5ncyA9IGZhbHNlOyAvL1wiYWJjIFwiIHdpbGwgbm90IGVxdWFsIHRvIFwiYWJjXCIuIFRoZXkgYXJlIGVxdWFsIGJ5IGRlZmF1bHQuXG4gICAqIHNldHRpbmdzLmNvbXBhcmF0b3IuY2FzZVNlbnNpdGl2ZSA9IHRydWU7IC8vXCJhYmMgXCIgd2lsbCBub3QgZXF1YWwgdG8gXCJBYmNcIi4gVGhleSBhcmUgZXF1YWwgYnkgZGVmYXVsdC5cbiAgICovXG4gIGNvbXBhcmF0b3I6IHtcbiAgICB0cmltU3RyaW5nczogdHJ1ZSxcbiAgICBjYXNlU2Vuc2l0aXZlOiBmYWxzZVxuICB9LFxuICAvKipcbiAgICogVGhlIHByZWZpeCB0aGF0IHVzZXMgdG8gc3RvcmUgdGhlIHF1ZXN0aW9uIGNvbW1lbnQsIGFzIHtxdWVzdGlvbk5hbWV9ICsge2NvbW1lbnRQcmVmaXh9LlxuICAgKiBUaGUgZGVmYXVsdFxuICAgKi9cbiAgY29tbWVudFByZWZpeDogXCItQ29tbWVudFwiLFxuICAvKipcbiAgICogRW5jb2RlIHBhcmFtZXRlciBvbiBjYWxsaW5nIHJlc3RmdWwgd2ViIEFQSVxuICAgKi9cbiAgd2Vic2VydmljZUVuY29kZVBhcmFtZXRlcnM6IHRydWUsXG4gIC8qKlxuICAgKiBDYWNoZSB0aGUgcmVzdWx0IGZvciBjaG9pY2VzIGdldHRpbmcgZnJvbSB3ZWIgc2VydmljZXMuIFNldCB0aGlzIHByb3BlcnR5IHRvIGZhbHNlLCB0byBkaXNhYmxlIHRoZSBjYWNoaW5nLlxuICAgKi9cbiAgdXNlQ2FjaGluZ0ZvckNob2ljZXNSZXN0ZnVsOiB0cnVlLFxuICBnZXQgdXNlQ2FjaGluZ0ZvckNob2ljZXNSZXN0ZnVsbCgpIHtcbiAgICByZXR1cm4gc2V0dGluZ3MudXNlQ2FjaGluZ0ZvckNob2ljZXNSZXN0ZnVsO1xuICB9LFxuICBzZXQgdXNlQ2FjaGluZ0ZvckNob2ljZXNSZXN0ZnVsbCh2YWw6IGJvb2xlYW4pIHtcbiAgICBzZXR0aW5ncy51c2VDYWNoaW5nRm9yQ2hvaWNlc1Jlc3RmdWwgPSB2YWw7XG4gIH0sXG4gIC8qKlxuICAgKiBTdXJ2ZXlKUyB3ZWIgc2VydmljZSBBUEkgdXJsXG4gICAqL1xuICBzdXJ2ZXlTZXJ2aWNlVXJsOiBcImh0dHBzOi8vYXBpLnN1cnZleWpzLmlvL3B1YmxpYy92MS9TdXJ2ZXlcIixcbiAgLyoqXG4gICAqIHNlcGFyYXRvciB0aGF0IGNhbiBhbGxvdyB0byBzZXQgdmFsdWUgYW5kIHRleHQgb2YgSXRlbVZhbHVlIG9iamVjdCBpbiBvbmUgc3RyaW5nIGFzOiBcInZhbHVlfHRleHRcIlxuICAgKi9cbiAgaXRlbVZhbHVlU2VwYXJhdG9yOiBcInxcIixcbiAgLyoqXG4gICAqIGRlZmF1bHQgbG9jYWxlIG5hbWUgZm9yIGxvY2FsaXphYmxlIHN0cmluZ3MgdGhhdCB1c2VzIGR1cmluZyBzZXJpYWxpemF0aW9uLCB7XCJkZWZhdWx0XCI6IFwiTXkgdGV4dFwiLCBcImRlXCI6IFwiTWVpbiBUZXh0XCJ9XG4gICAqL1xuICBkZWZhdWx0TG9jYWxlTmFtZTogXCJkZWZhdWx0XCIsXG4gIC8qKlxuICAgKiBEZWZhdWx0IHJvdyBuYW1lIGZvciBtYXRyaXggKHNpbmdsZSBjaG9pY2UpXG4gICAqL1xuICBtYXRyaXhEZWZhdWx0Um93TmFtZTogXCJkZWZhdWx0XCIsXG4gIC8qKlxuICAgKiBEZWZhdWx0IGNlbGwgdHlwZSBmb3IgZHJvcGRvd24gYW5kIGR5bmFtaWMgbWF0cmljZXNcbiAgICovXG4gIG1hdHJpeERlZmF1bHRDZWxsVHlwZTogXCJkcm9wZG93blwiLFxuICAvKipcbiAgICogVG90YWwgdmFsdWUgcG9zdGZpeCBmb3IgZHJvcGRvd24gYW5kIGR5bmFtaWMgbWF0cmljZXMuIFRoZSB0b3RhbCB2YWx1ZSBzdG9yZXMgYXM6IHttYXRyaXhOYW1lfSArIHtwb3N0Zml4fVxuICAgKi9cbiAgbWF0cml4VG90YWxWYWx1ZVBvc3RGaXg6IFwiLXRvdGFsXCIsXG4gIC8qKlxuICAgKiBNYXhpbXVtIHJvdyBjb3VudCBpbiBkeW5hbWljIG1hdHJpeFxuICAgKi9cbiAgbWF0cml4TWF4aW11bVJvd0NvdW50OiAxMDAwLFxuICAvKipcbiAgICogTWF4aW11bSByb3dDb3VudCB0aGF0IHJldHVybnMgaW4gYWRkQ29uZGl0aW9uT2JqZWN0c0J5Q29udGV4dCBmdW5jdGlvblxuICAgKi9cbiAgbWF0cml4TWF4Um93Q291bnRJbkNvbmRpdGlvbjogMSxcbiAgLyoqXG4gICAqIE1heGltdW0gcGFuZWwgY291bnQgaW4gZHluYW1pYyBwYW5lbFxuICAgKi9cbiAgcGFuZWxNYXhpbXVtUGFuZWxDb3VudDogMTAwLFxuICAvKipcbiAgICogTWF4aW11bSByYXRlIHZhbHVlIGNvdW50IGluIHJhdGluZyBxdWVzdGlvblxuICAgKi9cbiAgcmF0aW5nTWF4aW11bVJhdGVWYWx1ZUNvdW50OiAyMCxcbiAgLyoqXG4gICAqIERpc2FibGUgdGhlIHF1ZXN0aW9uIHdoaWxlIGNob2ljZXMgYXJlIGdldHRpbmcgZnJvbSB0aGUgd2ViIHNlcnZpY2VcbiAgICovXG4gIGRpc2FibGVPbkdldHRpbmdDaG9pY2VzRnJvbVdlYjogZmFsc2UsXG4gIC8qKlxuICAgKiBTZXQgdG8gdHJ1ZSB0byBhbHdheXMgc2VyaWFsaXplIHRoZSBsb2NhbGl6YXRpb24gc3RyaW5nIGFzIG9iamVjdCBldmVuIGlmIHRoZXJlIGlzIG9ubHkgb25lIHZhbHVlIGZvciBkZWZhdWx0IGxvY2FsZS4gSW5zdGVhZCBvZiBzdHJpbmcgXCJNeVN0clwiIHNlcmlhbGl6ZSBhcyB7ZGVmYXVsdDogXCJNeVN0clwifVxuICAgKi9cbiAgc2VyaWFsaXplTG9jYWxpemFibGVTdHJpbmdBc09iamVjdDogZmFsc2UsXG4gIC8qKlxuICAgKiBTZXQgdG8gZmFsc2UgdG8gaGlkZSBlbXB0eSBwYWdlIHRpdGxlIGFuZCBkZXNjcmlwdGlvbiBpbiBkZXNpZ24gbW9kZVxuICAgKi9cbiAgYWxsb3dTaG93RW1wdHlUaXRsZUluRGVzaWduTW9kZTogdHJ1ZSxcbiAgLyoqXG4gICAqIFNldCB0byBmYWxzZSB0byBoaWRlIGVtcHR5IHBhZ2UgZGVzY3JpcHRpb24gaW4gZGVzaWduIG1vZGVcbiAgICovXG4gIGFsbG93U2hvd0VtcHR5RGVzY3JpcHRpb25JbkRlc2lnbk1vZGU6IHRydWUsXG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlIHRvIGV4ZWN1dGUgdGhlIGNvbXBsZXRlIHRyaWdnZXIgb24gdmFsdWUgY2hhbmdlIGluc3RlYWQgb2Ygb24gbmV4dCBwYWdlLlxuICAgKi9cbiAgZXhlY3V0ZUNvbXBsZXRlVHJpZ2dlck9uVmFsdWVDaGFuZ2VkOiBmYWxzZSxcbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGZhbHNlIHRvIGV4ZWN1dGUgdGhlIHNraXAgdHJpZ2dlciBvbiBuZXh0IHBhZ2UgaW5zdGVhZCBvZiBvbiB2YWx1ZSBjaGFuZ2UuXG4gICAqL1xuICBleGVjdXRlU2tpcFRyaWdnZXJPblZhbHVlQ2hhbmdlZDogdHJ1ZSxcbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSByZWFkT25seUNvbW1lbnRSZW5kZXJNb2RlOiBcInRleHRhcmVhXCIgKGRlZmF1bHQpIG9yIChkaXYpXG4gICAqL1xuICByZWFkT25seUNvbW1lbnRSZW5kZXJNb2RlOiBcInRleHRhcmVhXCIsXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGlzIGZ1bmN0aW9uLCBzZXQgeW91ciBmdW5jdGlvbiwgaWYgeW91IHdhbnQgdG8gc2hvdyB5b3VyIG93biBkaWFsb2cgY29uZmlybSB3aW5kb3cgaW5zdGVhZCBvZiBzdGFuZGFyZCBicm93c2VyIHdpbmRvdy5cbiAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICovXG4gIGNvbmZpcm1BY3Rpb25GdW5jOiBmdW5jdGlvbihtZXNzYWdlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gY29uZmlybShtZXNzYWdlKTtcbiAgfSxcbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgbWluV2lkdGggY29uc3RyYWludFxuICAgKi9cbiAgbWluV2lkdGg6IFwiMzAwcHhcIixcbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgbWluV2lkdGggY29uc3RyYWludFxuICAgKi9cbiAgbWF4V2lkdGg6IFwiaW5pdGlhbFwiLFxuICAvKipcbiAgICogVGhpcyBwcm9wZXJ0eSB0ZWxscyBob3cgbWFueSB0aW1lcyBzdXJ2ZXkgcmUtcnVuIGV4cHJlc3Npb25zIG9uIHZhbHVlIGNoYW5nZXMgZHVyaW5nIGNvbmRpdGlvbiBydW5uaW5nLiBXZSBuZWVkIGl0IHRvIGF2b2lkIHJlY3Vyc2lvbnMgaW4gdGhlIGV4cHJlc3Npb25zXG4gICAqL1xuICBtYXhpbXVtQ29uZGl0aW9uUnVuQ291bnRPblZhbHVlQ2hhbmdlZDogMTAsXG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0IHZpc2libGVJbmRleCBmb3IgcXVlc3Rpb24gd2l0aCB0aXRsZUxvY2F0aW9uID0gXCJoaWRkZW5cIiBpcyAtMSwgYW5kIHN1cnZleSBkb2Vzbid0IGNvdW50IHRoZXNlIHF1ZXN0aW9ucyB3aGVuIHNldCBxdWVzdGlvbnMgbnVtYmVycy5cbiAgICogU2V0IGl0IHRydWUsIGFuZCBhIHF1ZXN0aW9uIG5leHQgdG8gYSBxdWVzdGlvbiB3aXRoIGhpZGRlbiB0aXRsZSB3aWxsIGluY3JlYXNlIGl0J3MgbnVtYmVyLlxuICAgKi9cbiAgc2V0UXVlc3Rpb25WaXNpYmxlSW5kZXhGb3JIaWRkZW5UaXRsZTogZmFsc2UsXG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0IHZpc2libGVJbmRleCBmb3IgcXVlc3Rpb24gd2l0aCBoaWRlTnVtYmVyID0gdHJ1ZSBpcyAtMSwgYW5kIHN1cnZleSBkb2Vzbid0IGNvdW50IHRoZXNlIHF1ZXN0aW9ucyB3aGVuIHNldCBxdWVzdGlvbnMgbnVtYmVycy5cbiAgICogU2V0IGl0IHRydWUsIGFuZCBhIHF1ZXN0aW9uIG5leHQgdG8gYSBxdWVzdGlvbiB3aXRoIGhpZGRlbiB0aXRsZSBudW1iZXIgd2lsbCBpbmNyZWFzZSBpdCdzIG51bWJlci5cbiAgICovXG4gIHNldFF1ZXN0aW9uVmlzaWJsZUluZGV4Rm9ySGlkZGVuTnVtYmVyOiBmYWxzZSxcbiAgLyoqXG4gICAqIEJ5IGRlZmF1bHQgYWxsIHJvd3MgYXJlIHJlbmRlcmVkIG5vIG1hdHRlcnMgd2h3dGhlciB0aGV5IGFyZSB2aXNpYmxlLlxuICAgKiBTZXQgaXQgdHJ1ZSwgYW5kIHN1cnZleSBtYXJrdXAgcm93cyB3aWxsIGJlIHJlbmRlcmVkIG9ubHkgaWYgdGhleSBhcmUgdmlzaWJsZSBpbiB2aWV3cG9ydC5cbiAgICogVGhpcyBmZWF0dXJlIGlzIGV4cGVyaW1hbnRhbCBhbmQgbWlnaHQgZG8gbm90IHN1cHBvcnQgYWxsIHRoZSB1c2UgY2FzZXMuXG4gICAqL1xuICBsYXp5Um93c1JlbmRlcmluZzogZmFsc2UsXG4gIGxhenlSb3dzUmVuZGVyaW5nU3RhcnRSb3c6IDMsXG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0IGNoZWNrYm94IGFuZCByYWRpb2dyb3VwIGl0ZW1zIGFyZSBvcmRlcmVkIGluIHJvd3MuXG4gICAqIFNldCBpdCBcImNvbHVtblwiLCBhbmQgaXRlbXMgd2lsbCBiZSBvcmRlcmVkIGluIGNvbHVtbnMuXG4gICAqL1xuICBzaG93SXRlbXNJbk9yZGVyOiBcImRlZmF1bHRcIixcbiAgLyoqXG4gICAqIFN1cHBvcnRlZCB2YWxpZGF0b3JzIGJ5IHF1ZXN0aW9uIHR5cGVzLiBZb3UgY2FuIG1vZGlmeSB0aGlzIHZhcmlhYmxlIHRvIGFkZCB2YWxpZGF0b3JzIGZvciBuZXcgcXVlc3Rpb24gdHlwZXMgb3IgYWRkL3JlbW92ZSBmb3IgZXhpc3RpbmcgcXVlc3Rpb24gdHlwZXMuXG4gICAqL1xuICBzdXBwb3J0ZWRWYWxpZGF0b3JzOiB7XG4gICAgcXVlc3Rpb246IFtcImV4cHJlc3Npb25cIl0sXG4gICAgY29tbWVudDogW1widGV4dFwiLCBcInJlZ2V4XCJdLFxuICAgIHRleHQ6IFtcIm51bWVyaWNcIiwgXCJ0ZXh0XCIsIFwicmVnZXhcIiwgXCJlbWFpbFwiXSxcbiAgICBjaGVja2JveDogW1wiYW5zd2VyY291bnRcIl0sXG4gIH0sXG4gIC8qKlxuICAgKiBTZXQgdGhlIHZhbHVlIGFzIHN0cmluZyBcInl5eXktbW0tZGRcIi4gdGV4dCBxdWVzdGlvbnMgd2l0aCBpbnB1dFR5cGUgXCJkYXRlXCIgd2lsbCBub3QgYWxsb3cgdG8gc2V0IHRvIHN1cnZleSBkYXRlIHRoYXQgbGVzcyB0aGFuIHRoaXMgdmFsdWVcbiAgICovXG4gIG1pbkRhdGU6IFwiXCIsXG4gIC8qKlxuICAgKiBTZXQgdGhlIHZhbHVlIGFzIHN0cmluZyBcInl5eXktbW0tZGRcIi4gdGV4dCBxdWVzdGlvbnMgd2l0aCBpbnB1dFR5cGUgXCJkYXRlXCIgd2lsbCBub3QgYWxsb3cgdG8gc2V0IHRvIHN1cnZleSBkYXRlIHRoYXQgZ3JlYXRlciB0aGFuIHRoaXMgdmFsdWVcbiAgICovXG4gIG1heERhdGU6IFwiXCIsXG4gIHNob3dNb2RhbDogPFxuICAgIChcbiAgICAgIGNvbXBvbmVudE5hbWU6IHN0cmluZyxcbiAgICAgIGRhdGE6IGFueSxcbiAgICAgIG9uQXBwbHk6ICgpID0+IGJvb2xlYW4sXG4gICAgICBvbkNhbmNlbD86ICgpID0+IHZvaWQsXG4gICAgICBjc3NDbGFzcz86IHN0cmluZyxcbiAgICAgIHRpdGxlPzogc3RyaW5nXG4gICAgKSA9PiB2b2lkXG4gID51bmRlZmluZWQsXG4gIHN1cHBvcnRDcmVhdG9yVjI6IGZhbHNlLFxuICAvKipcbiAgICogU3BlY2lmaWVzIGEgbGlzdCBvZiBjdXN0b20gaWNvbnMuXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIHJlcGxhY2UgU3VydmV5SlMgZGVmYXVsdCBpY29ucyAoZGlzcGxheWVkIGluIFVJIGVsZW1lbnRzIG9mIFN1cnZleUpTIExpYnJhcnkgb3IgQ3JlYXRvcikgd2l0aCB5b3VyIGN1c3RvbSBpY29ucy5cbiAgICogRm9yIGV2ZXJ5IGRlZmF1bHQgaWNvbiB0byByZXBsYWNlLCBhZGQgYSBrZXkvdmFsdWUgb2JqZWN0IHdpdGggdGhlIGRlZmF1bHQgaWNvbidzIG5hbWUgYXMgYSBrZXkgYW5kIHRoZSBuYW1lIG9mIHlvdXIgY3VzdG9tIGljb24gYXMgYSB2YWx1ZS5cbiAgICogRm9yIGV4YW1wbGU6IFN1cnZleS5zZXR0aW5ncy5jdXN0b21JY29uc1tcImljb24tcmVkb1wiXSA9IFwibXktb3duLXJlZG8taWNvblwiXG4gICAqL1xuICBjdXN0b21JY29uczoge30sXG4gIHRpdGxlVGFnczoge1xuICAgIHN1cnZleTogXCJoM1wiLFxuICAgIHBhZ2U6IFwiaDRcIixcbiAgICBwYW5lbDogXCJoNFwiLFxuICAgIHF1ZXN0aW9uOiBcImg1XCIsXG4gIH1cbn07XG4iLCJpbXBvcnQgeyBzdXJ2ZXlDc3MgfSBmcm9tIFwiLi9kZWZhdWx0Q3NzL2Nzc3N0YW5kYXJkXCI7XG5leHBvcnQgY2xhc3MgU3R5bGVzTWFuYWdlciB7XG4gIHByaXZhdGUgc3RhdGljIFN1cnZleUpTU3R5bGVzU2hlZXRJZCA9IFwic3VydmV5anMtc3R5bGVzXCI7XG5cbiAgcHVibGljIHN0YXRpYyBTdHlsZXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgLy8gXCIuc3ZfYm9vdHN0cmFwX2Nzc1wiOlxuICAgIC8vICAgXCJwb3NpdGlvbjogcmVsYXRpdmU7IHdpZHRoOiAxMDAlOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZjRmNGY0XCIsXG4gICAgLy8gXCIuc3ZfYm9vdHN0cmFwX2NzcyAuc3ZfY3VzdG9tX2hlYWRlclwiOlxuICAgIC8vICAgXCJwb3NpdGlvbjogYWJzb2x1dGU7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDI3NXB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZTdlN2U3O1wiLFxuICAgIC8vIFwiLnN2X2Jvb3RzdHJhcF9jc3MgLnN2X2NvbnRhaW5lclwiOlxuICAgIC8vICAgXCJtYXgtd2lkdGg6IDgwJTsgbWFyZ2luOiBhdXRvOyBwb3NpdGlvbjogcmVsYXRpdmU7IGNvbG9yOiAjNmQ3MDcyOyBwYWRkaW5nOiAwIDFlbTtcIixcbiAgICAvLyBcIi5zdl9ib290c3RyYXBfY3NzIC5wYW5lbC1ib2R5XCI6XG4gICAgLy8gICBcImJhY2tncm91bmQtY29sb3I6IHdoaXRlOyBwYWRkaW5nOiAxZW0gMWVtIDVlbSAxZW07IGJvcmRlci10b3A6IDJweCBzb2xpZCBsaWdodGdyYXk7XCIsXG4gICAgXCIuc3ZfbWFpbiBzcGFuXCI6IFwid29yZC1icmVhazogYnJlYWstd29yZDtcIixcblxuICAgIFwiLnN2X21haW4gbGVnZW5kXCI6IFwiYm9yZGVyOiBub25lOyBtYXJnaW46IDA7XCIsXG5cbiAgICBcIi5zdl9ib290c3RyYXBfY3NzIC5zdl9xc3RuXCI6IFwicGFkZGluZzogMC41ZW0gMWVtIDEuNWVtIDFlbTtcIixcbiAgICBcIi5zdl9ib290c3RyYXBfY3NzIC5zdl9xY2JjIGlucHV0W3R5cGU9Y2hlY2tib3hdLCAuc3ZfYm9vdHN0cmFwX2NzcyAuc3ZfcWNiYyBpbnB1dFt0eXBlPXJhZGlvXVwiOlxuICAgICAgXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyBtYXJnaW4tdG9wOiAtMXB4XCIsXG4gICAgXCIuc3ZfYm9vdHN0cmFwX2NzcyAuc3ZfcXN0biBmaWVsZHNldFwiOiBcImRpc3BsYXk6IGJsb2NrO1wiLFxuICAgIFwiLnN2X2Jvb3RzdHJhcF9jc3MgLnN2X3FzdG4gIC5zdl9xX2NoZWNrYm94X2lubGluZSwgLnN2X2Jvb3RzdHJhcF9jc3MgLnN2X3FzdG4gLnN2X3FfcmFkaW9ncm91cF9pbmxpbmVcIjpcbiAgICAgIFwiZGlzcGxheTogaW5saW5lLWJsb2NrO1wiLFxuXG4gICAgXCIuc3ZfYm9vdHN0cmFwX2NzcyAuc3YtcGFuZWxkeW5hbWljX19wcm9ncmVzcy1jb250YWluZXIgXCI6XG4gICAgICBcInBvc2l0aW9uOiByZWxhdGl2ZTsgbWFyZ2luLXJpZ2h0OiAyNTBweDsgbWFyZ2luLWxlZnQ6IDQwcHg7IG1hcmdpbi10b3A6IDEwcHg7XCIsXG5cbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAuc3ZfcV9yYWRpb2dyb3VwX2NvbnRyb2xfbGFiZWxcIjpcbiAgICAgIFwiZGlzcGxheTogaW5saW5lOyBwb3NpdGlvbjogc3RhdGljO1wiLFxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIC5jaGVja2JveFwiOlxuICAgICAgXCJtYXJnaW4tdG9wOjEwcHg7bWFyZ2luLWJvdHRvbToxMHB4O1wiLFxuXG4gICAgXCIuc3Zfcm93XCI6IFwiY2xlYXI6IGJvdGg7IG1pbi13aWR0aDozMDBweDtcIixcbiAgICBcIi5zdl9yb3cgLnN2X3FzdG5cIjogXCJmbG9hdDogbGVmdFwiLFxuICAgIFwiLnN2X3JvdyAuc3ZfcXN0bjpsYXN0LWNoaWxkXCI6IFwiZmxvYXQ6IG5vbmVcIixcbiAgICBcIi5zdl9xc3RuXCI6XG4gICAgICBcImRpc3BsYXk6IHZlcnRpY2FsLWFsaWduOiB0b3A7IG92ZXJmbG93OiBhdXRvOyBtaW4td2lkdGg6MzAwcHg7XCIsXG4gICAgXCIuc3ZfcF9jb250YWluZXJcIjogXCJkaXNwbGF5OiB2ZXJ0aWNhbC1hbGlnbjogdG9wOyBtaW4td2lkdGg6MzAwcHg7XCIsXG5cbiAgICBcIi5zdl9xX3RpdGxlIC5zdl9xdWVzdGlvbl9pY29uXCI6IFwiZmxvYXQ6IHJpZ2h0OyBtYXJnaW4tcmlnaHQ6IDFlbTtcIixcbiAgICBcIi5zdl9xX3RpdGxlIC5zdl9xdWVzdGlvbl9pY29uOjpiZWZvcmVcIjpcbiAgICAgIFwiY29udGVudDogJyc7IGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7IGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjsgcGFkZGluZzogMC41ZW07IGRpc3BsYXk6IGlubGluZS1ibG9jazsgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlCbGJtTnZaR2x1WnowaWRYUm1MVGdpUHo0TkNqd2hMUzBnUjJWdVpYSmhkRzl5T2lCQlpHOWlaU0JKYkd4MWMzUnlZWFJ2Y2lBeU1pNHdMakVzSUZOV1J5QkZlSEJ2Y25RZ1VHeDFaeTFKYmlBdUlGTldSeUJXWlhKemFXOXVPaUEyTGpBd0lFSjFhV3hrSURBcElDQXRMVDROQ2p4emRtY2dkbVZ5YzJsdmJqMGlNUzR4SWlCcFpEMGlUR0Y1WlhKZk1TSWdlRzFzYm5NOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6SXdNREF2YzNabklpQjRiV3h1Y3pwNGJHbHVhejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TVRrNU9TOTRiR2x1YXlJZ2VEMGlNSEI0SWlCNVBTSXdjSGdpRFFvSklIWnBaWGRDYjNnOUlqQWdNQ0F4TUNBeE1DSWdjM1I1YkdVOUltVnVZV0pzWlMxaVlXTnJaM0p2ZFc1a09tNWxkeUF3SURBZ01UQWdNVEE3SWlCNGJXdzZjM0JoWTJVOUluQnlaWE5sY25abElqNE5Danh6ZEhsc1pTQjBlWEJsUFNKMFpYaDBMMk56Y3lJK0RRb0pMbk4wTUh0bWFXeHNPaU0yUkRjd056STdmUTBLUEM5emRIbHNaVDROQ2p4d2IyeDVaMjl1SUdOc1lYTnpQU0p6ZERBaUlIQnZhVzUwY3owaU1pd3lJREFzTkNBMUxEa2dNVEFzTkNBNExESWdOU3cxSUNJdlBnMEtQQzl6ZG1jK0RRbz0pO1wiLFxuICAgIFwiLnN2X3FfdGl0bGUgLnN2X3F1ZXN0aW9uX2ljb24uc3ZfZXhwYW5kZWQ6OmJlZm9yZVwiOlxuICAgICAgXCJ0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1wiLFxuICAgIFwiLnN2X3FibG4gLmNoZWNrYm94LW1hdGVyaWFsXCI6IFwibWFyZ2luLXJpZ2h0OiAzcHg7XCIsXG4gICAgXCIuc3ZfcWNieCAuY2hlY2tib3gtbWF0ZXJpYWxcIjogXCJtYXJnaW4tcmlnaHQ6IDVweDtcIixcbiAgICBcIi5zdl9xY2J4IC5jaGVja2JveCBsYWJlbFwiOiBcImp1c3RpZnktY29udGVudDogbGVmdDsgZGlzcGxheTogaW5saW5lLWJsb2NrO1wiLFxuICAgIFwiLnN2X3FzdG4gLnJhZGlvIGxhYmVsXCI6IFwianVzdGlmeS1jb250ZW50OiBsZWZ0OyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XCIsXG4gICAgXCIuc3ZfcXN0biAuc3ZfcV9pbWdzZWwgPiBsYWJlbCBpbWdcIjogXCJwb2ludGVyLWV2ZW50czogbm9uZTtcIixcbiAgICBcIi5zdl9xc3RuIC5zdl9xX2ltZ3NlbC5zdl9xX2ltYWdlcGlja2VyX2lubGluZVwiOiBcImRpc3BsYXk6IGlubGluZS1ibG9jaztcIixcbiAgICBcIi5zdl9xc3RuIGxhYmVsLnN2X3FfbV9sYWJlbFwiOlxuICAgICAgXCJwb3NpdGlvbjogYWJzb2x1dGU7IG1hcmdpbjogMDsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAxMDAlO1wiLFxuICAgIFwiLnN2X3FzdG4gdGRcIjogXCJwb3NpdGlvbjogcmVsYXRpdmU7XCIsXG4gICAgXCIuc3ZfcV9tdF9pdGVtX3ZhbHVlXCI6IFwiZmxvYXQ6IGxlZnQ7XCIsXG4gICAgJ1tkaXI9XCJydGxcIl0gLnN2X3FfbXRfaXRlbV92YWx1ZSc6IFwiZmxvYXQ6IHJpZ2h0O1wiLFxuICAgIFwiLnN2X3FzdG4uc3ZfcXN0bl9sZWZ0XCI6IFwibWFyZ2luLXRvcDogMC43NWVtO1wiLFxuICAgIFwiLnN2X3FzdG4gLnRpdGxlLWxlZnRcIjogXCJmbG9hdDogbGVmdDsgbWFyZ2luLXJpZ2h0OiAxZW07XCIsXG4gICAgJ1tkaXI9XCJydGxcIl0gLnN2X3FzdG4gLnRpdGxlLWxlZnQnOiBcImZsb2F0OiByaWdodDsgbWFyZ2luLWxlZnQ6IDFlbTtcIixcbiAgICBcIi5zdl9xc3RuIC5jb250ZW50LWxlZnRcIjogXCJvdmVyZmxvdzogaGlkZGVuXCIsXG4gICAgXCIuc3ZfcV9yYWRpb2dyb3VwX2lubGluZSAuc3ZfcV9yYWRpb2dyb3VwX290aGVyXCI6IFwiZGlzcGxheTogaW5saW5lLWJsb2NrO1wiLFxuICAgIFwiLnN2X3FfY2hlY2tib3hfaW5saW5lIC5zdl9xX2NoZWNrYm94X290aGVyXCI6IFwiZGlzcGxheTogaW5saW5lLWJsb2NrO1wiLFxuICAgIFwiLnN2X3FfY2hlY2tib3hfaW5saW5lLCAuc3ZfcV9yYWRpb2dyb3VwX2lubGluZSwgLnN2X3FfaW1hZ2VwaWNrZXJfaW5saW5lXCI6XG4gICAgICBcImxpbmUtaGVpZ2h0OiAyLjVlbTtcIixcbiAgICBcIi5mb3JtLWlubGluZSAuc3ZfcV9jaGVja2JveF9pbmxpbmU6bm90KDpsYXN0LWNoaWxkKVwiOiBcIm1hcmdpbi1yaWdodDogMWVtO1wiLFxuICAgIFwiLmZvcm0taW5saW5lIC5zdl9xX3JhZGlvZ3JvdXBfaW5saW5lOm5vdCg6bGFzdC1jaGlsZClcIjpcbiAgICAgIFwibWFyZ2luLXJpZ2h0OiAxZW07XCIsXG4gICAgXCIuc3ZfaW1nc2VsIC5zdl9xX2ltYWdlcGlja2VyX2lubGluZTpub3QoOmxhc3QtY2hpbGQpXCI6XG4gICAgICBcIm1hcmdpbi1yaWdodDogMWVtO1wiLFxuICAgIFwiLnN2X3FzdG4gZmllbGRzZXRcIjogXCJib3JkZXI6IG5vbmU7IG1hcmdpbjogMDsgcGFkZGluZzogMDtcIixcbiAgICBcIi5zdl9xc3RuIC5zdl9xX2ZpbGVfcGxhY2Vob2xkZXJcIjogXCJkaXNwbGF5Om5vbmVcIixcblxuICAgIFwiLnN2X3BfdGl0bGVcIjogXCJwYWRkaW5nLWxlZnQ6IDFlbTsgcGFkZGluZy1ib3R0b206IDAuM2VtO1wiLFxuICAgIFwiLnN2X3BfdGl0bGVfZXhwYW5kYWJsZVwiOiBcImN1cnNvcjogcG9pbnRlcjtcIixcbiAgICBcIi5zdl9xX3RpdGxlX2V4cGFuZGFibGVcIjogXCJjdXJzb3I6IHBvaW50ZXI7XCIsXG4gICAgXCIuc3ZfcF90aXRsZSAuc3ZfcGFuZWxfaWNvblwiOiBcImZsb2F0OiByaWdodDsgbWFyZ2luLXJpZ2h0OiAxZW07XCIsXG4gICAgXCIuc3ZfcF90aXRsZSAuc3ZfcGFuZWxfaWNvbjo6YmVmb3JlXCI6XG4gICAgICBcImNvbnRlbnQ6ICcnOyBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7IHBhZGRpbmc6IDAuNWVtOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlkWFJtTFRnaVB6NE5DandoTFMwZ1IyVnVaWEpoZEc5eU9pQkJaRzlpWlNCSmJHeDFjM1J5WVhSdmNpQXlNaTR3TGpFc0lGTldSeUJGZUhCdmNuUWdVR3gxWnkxSmJpQXVJRk5XUnlCV1pYSnphVzl1T2lBMkxqQXdJRUoxYVd4a0lEQXBJQ0F0TFQ0TkNqeHpkbWNnZG1WeWMybHZiajBpTVM0eElpQnBaRDBpVEdGNVpYSmZNU0lnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JaUI0Yld4dWN6cDRiR2x1YXowaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1UazVPUzk0YkdsdWF5SWdlRDBpTUhCNElpQjVQU0l3Y0hnaURRb0pJSFpwWlhkQ2IzZzlJakFnTUNBeE1DQXhNQ0lnYzNSNWJHVTlJbVZ1WVdKc1pTMWlZV05yWjNKdmRXNWtPbTVsZHlBd0lEQWdNVEFnTVRBN0lpQjRiV3c2YzNCaFkyVTlJbkJ5WlhObGNuWmxJajROQ2p4emRIbHNaU0IwZVhCbFBTSjBaWGgwTDJOemN5SStEUW9KTG5OME1IdG1hV3hzT2lNMlJEY3dOekk3ZlEwS1BDOXpkSGxzWlQ0TkNqeHdiMng1WjI5dUlHTnNZWE56UFNKemREQWlJSEJ2YVc1MGN6MGlNaXd5SURBc05DQTFMRGtnTVRBc05DQTRMRElnTlN3MUlDSXZQZzBLUEM5emRtYytEUW89KTtcIixcbiAgICBcIi5zdl9wX3RpdGxlIC5zdl9wYW5lbF9pY29uLnN2X2V4cGFuZGVkOjpiZWZvcmVcIjpcbiAgICAgIFwidHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcIixcbiAgICBcIi5zdl9wX2Zvb3RlclwiOiBcInBhZGRpbmctbGVmdDogMWVtOyBwYWRkaW5nLWJvdHRvbTogMWVtO3BhZGRpbmctdG9wOiAxZW07XCIsXG5cbiAgICBcIi5zdl9tYXRyaXhfY2VsbF9kZXRhaWxfYnV0dG9uXCI6IFwicG9zaXRpb246IHJlbGF0aXZlXCIsXG4gICAgXCIuc3ZfZGV0YWlsX3BhbmVsX2ljb25cIjpcbiAgICAgIFwiZGlzcGxheTogYmxvY2s7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogNTAlOyB0b3A6IDUwJTsgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7IHdpZHRoOiAxNHB4OyBoZWlnaHQ6IDE0cHg7XCIsXG4gICAgXCIuc3ZfZGV0YWlsX3BhbmVsX2ljb246OmJlZm9yZVwiOlxuICAgICAgXCJjb250ZW50OiAnJzsgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyOyB3aWR0aDogMTRweDsgaGVpZ2h0OiAxNHB4OyBkaXNwbGF5OiBibG9jazsgdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKTsgYmFja2dyb3VuZC1pbWFnZTogdXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDJTNGeG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J3V0Zi04JyUzRiUzRSUzQyEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIxLjEuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgLS0lM0UlM0NzdmcgdmVyc2lvbj0nMS4xJyBpZD0nTGF5ZXJfMScgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB4bWxuczp4bGluaz0naHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycgeD0nMHB4JyB5PScwcHgnIHZpZXdCb3g9JzAgMCAxNSAxNScgc3R5bGU9J2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMTUgMTU7JyB4bWw6c3BhY2U9J3ByZXNlcnZlJyUzRSUzQ3N0eWxlIHR5cGU9J3RleHQvY3NzJyUzRSAuc3QwJTdCZmlsbDolMjNGRkZGRkY7JTdEJTBBJTNDL3N0eWxlJTNFJTNDcG9seWdvbiBjbGFzcz0nc3QwJyBwb2ludHM9JzE0LDUuNSAxMi42LDQuMSA3LjUsOS4xIDIuNCw0LjEgMSw1LjUgNy41LDEyICcvJTNFJTNDL3N2ZyUzRSUwQVxcXCIpO1wiLFxuICAgIFwiLnN2X2RldGFpbF9wYW5lbF9pY29uLnN2X2RldGFpbF9leHBhbmRlZDo6YmVmb3JlXCI6XG4gICAgICBcInRyYW5zZm9ybTogcm90YXRlKDBkZWcpXCIsXG4gICAgXCIuc3ZfbWF0cml4X2VtcHR5X3Jvd3Nfc2VjdGlvblwiOlxuICAgICAgXCJ0ZXh0LWFsaWduOiBjZW50ZXI7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XCIsXG4gICAgXCIuc3ZfbWF0cml4X2VtcHR5X3Jvd3NfdGV4dFwiOiBcInBhZGRpbmc6MjBweFwiLFxuXG4gICAgXCIuc3ZfcV9maWxlID4gaW5wdXRbdHlwZT1maWxlXSwgLnN2X3FfZmlsZSA+IGJ1dHRvblwiOlxuICAgICAgXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XCIsXG4gICAgXCIuc3ZfcV9maWxlX3ByZXZpZXdcIjpcbiAgICAgIFwiZGlzcGxheTogaW5saW5lLWJsb2NrOyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyBib3JkZXI6IDFweCBzb2xpZCBsaWdodGdyYXk7IHBhZGRpbmc6IDVweDsgbWFyZ2luLXRvcDogMTBweDtcIixcbiAgICBcIi5zdl9xX2ZpbGVfcHJldmlldyA+IGFcIjpcbiAgICAgIFwiZGlzcGxheTogYmxvY2s7IG92ZXJmbG93OiBoaWRkZW47IHZlcnRpY2FsLWFsaWduOiB0b3A7IHdoaXRlLXNwYWNlOiBub3dyYXA7IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1wiLFxuICAgIFwiLnN2X3FfZmlsZV9yZW1vdmVfYnV0dG9uXCI6IFwibGluZS1oZWlnaHQ6IG5vcm1hbDtcIixcbiAgICBcIi5zdl9xX2ZpbGVfcmVtb3ZlXCI6IFwiZGlzcGxheTogYmxvY2s7IGN1cnNvcjogcG9pbnRlcjtcIixcblxuICAgIFwiLnN2X3FfbV9jZWxsX3RleHRcIjogXCJjdXJzb3I6IHBvaW50ZXI7XCIsXG5cbiAgICBcIi5zdl9xX2RkX290aGVyXCI6IFwibWFyZ2luLXRvcDogMWVtO1wiLFxuICAgIFwiLnN2X3FfZGRfb3RoZXIgaW5wdXRcIjogXCJ3aWR0aDogMTAwJTtcIixcblxuICAgIFwiLnN2X3FzdG4gLnN2LXEtY29sLTEsIC5zdi1xdWVzdGlvbiAuc3YtcS1jb2wtMVwiOlxuICAgICAgXCJ3aWR0aDogMTAwJTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nLXJpZ2h0OiAxZW07IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XCIsXG4gICAgXCIuc3ZfcXN0biAuc3YtcS1jb2wtMiwgLnN2LXF1ZXN0aW9uIC5zdi1xLWNvbC0yXCI6XG4gICAgICBcIndpZHRoOiBjYWxjKDUwJSAtIDFlbSk7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgcGFkZGluZy1yaWdodDogMWVtOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB3b3JkLWJyZWFrOiBicmVhay13b3JkO1wiLFxuICAgIFwiLnN2X3FzdG4gLnN2LXEtY29sLTMsIC5zdi1xdWVzdGlvbiAuc3YtcS1jb2wtM1wiOlxuICAgICAgXCJ3aWR0aDogY2FsYygzMy4zMzMzMyUgLSAxZW0pOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHBhZGRpbmctcmlnaHQ6IDFlbTsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd29yZC1icmVhazogYnJlYWstd29yZDtcIixcbiAgICBcIi5zdl9xc3RuIC5zdi1xLWNvbC00LCAuc3YtcXVlc3Rpb24gLnN2LXEtY29sLTRcIjpcbiAgICAgIFwid2lkdGg6IGNhbGMoMjUlIC0gMWVtKTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nLXJpZ2h0OiAxZW07IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XCIsXG4gICAgXCIuc3ZfcXN0biAuc3YtcS1jb2wtNSwgLnN2LXF1ZXN0aW9uIC5zdi1xLWNvbC01XCI6XG4gICAgICBcIndpZHRoOiBjYWxjKDIwJSAtIDFlbSk7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgcGFkZGluZy1yaWdodDogMWVtOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB3b3JkLWJyZWFrOiBicmVhay13b3JkO1wiLFxuXG4gICAgXCIuc3ZfcXN0biAuc3YtcS1jb2x1bW4tMSwgLnN2LXF1ZXN0aW9uIC5zdi1xLWNvbHVtbi0xXCI6XG4gICAgICBcIndpZHRoOiAxMDAlOyBtYXgtd2lkdGg6IDEwMCU7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgcGFkZGluZy1yaWdodDogMWVtOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB3b3JkLWJyZWFrOiBicmVhay13b3JkO1wiLFxuICAgIFwiLnN2X3FzdG4gLnN2LXEtY29sdW1uLTIsIC5zdi1xdWVzdGlvbiAuc3YtcS1jb2x1bW4tMlwiOlxuICAgICAgXCJtYXgtd2lkdGg6IDUwJTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nLXJpZ2h0OiAxZW07IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XCIsXG4gICAgXCIuc3ZfcXN0biAuc3YtcS1jb2x1bW4tMywgLnN2LXF1ZXN0aW9uIC5zdi1xLWNvbHVtbi0zXCI6XG4gICAgICBcIm1heC13aWR0aDogMzMuMzMzMzMlOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHBhZGRpbmctcmlnaHQ6IDFlbTsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd29yZC1icmVhazogYnJlYWstd29yZDtcIixcbiAgICBcIi5zdl9xc3RuIC5zdi1xLWNvbHVtbi00LCAuc3YtcXVlc3Rpb24gLnN2LXEtY29sdW1uLTRcIjpcbiAgICAgIFwibWF4LXdpZHRoOiAyNSU7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgcGFkZGluZy1yaWdodDogMWVtOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB3b3JkLWJyZWFrOiBicmVhay13b3JkO1wiLFxuICAgIFwiLnN2X3FzdG4gLnN2LXEtY29sdW1uLTUsIC5zdi1xdWVzdGlvbiAuc3YtcS1jb2x1bW4tNVwiOlxuICAgICAgXCJtYXgtd2lkdGg6IDIwJTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nLXJpZ2h0OiAxZW07IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XCIsXG5cbiAgICBcIi5zdl9xc3RuIC5zdl9xX2ZpbGVfaW5wdXRcIjogXCJjb2xvcjogdHJhbnNwYXJlbnQ7XCIsXG5cbiAgICBcIi5zdl9xc3RuIC5zdl9xX2ltZ3NlbCBsYWJlbCA+IGRpdlwiOlxuICAgICAgXCJvdmVyZmxvdzogaGlkZGVuOyB3aGl0ZS1zcGFjZTogbm93cmFwOyB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsgcGFkZGluZzogNHB4OyBib3JkZXI6IDFweCBzb2xpZCBsaWdodGdyYXk7IGJvcmRlci1yYWRpdXM6IDRweDtcIixcbiAgICBcIi5zdl9xc3RuIC5zdl9xX2ltZ3NlbCBsYWJlbCA+IGRpdiA+IGltZywgLnN2X3FzdG4gLnN2X3FfaW1nc2VsIGxhYmVsID4gZGl2ID4gZW1iZWRcIjpcbiAgICAgIFwiZGlzcGxheTogYmxvY2s7XCIsXG5cbiAgICBcIi5zdl9xc3RuIHRhYmxlIHRyIHRkIC5zdl9xX21fY2VsbF9sYWJlbFwiOlxuICAgICAgXCJwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6IDA7IHJpZ2h0OiAwOyB0b3A6IDA7IGJvdHRvbTogMDtcIixcblxuICAgIFwiZi1wYW5lbFwiOiBcInBhZGRpbmc6IDAuNWVtIDFlbTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBsaW5lLWhlaWdodDogMmVtO1wiLFxuXG4gICAgXCIuc3ZfcHJvZ3Jlc3NfYmFyID4gc3BhblwiOiBcIndoaXRlLXNwYWNlOiBub3dyYXA7XCIsXG5cbiAgICAvL3Byb2dyZXNzIGJ1dHRvbnNcbiAgICBcIi5zdl9wcm9ncmVzcy1idXR0b25zX19jb250YWluZXItY2VudGVyXCI6IFwidGV4dC1hbGlnbjogY2VudGVyO1wiLFxuICAgIFwiLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX2NvbnRhaW5lclwiOlxuICAgICAgXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGZvbnQtc2l6ZTogMDsgd2lkdGg6IDEwMCU7IG1heC13aWR0aDogMTEwMHB4OyB3aGl0ZS1zcGFjZTogbm93cmFwOyBvdmVyZmxvdzogaGlkZGVuO1wiLFxuICAgIFwiLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX2ltYWdlLWJ1dHRvbi1sZWZ0XCI6XG4gICAgICBcImRpc3BsYXk6IGlubGluZS1ibG9jazsgdmVydGljYWwtYWxpZ246IHRvcDsgbWFyZ2luLXRvcDogMjJweDsgZm9udC1zaXplOiAxNHB4OyB3aWR0aDogMTZweDsgaGVpZ2h0OiAxNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlkWFJtTFRnaVB6NE5DandoTFMwZ1IyVnVaWEpoZEc5eU9pQkJaRzlpWlNCSmJHeDFjM1J5WVhSdmNpQXlNaTR3TGpFc0lGTldSeUJGZUhCdmNuUWdVR3gxWnkxSmJpQXVJRk5XUnlCV1pYSnphVzl1T2lBMkxqQXdJRUoxYVd4a0lEQXBJQ0F0TFQ0TkNqeHpkbWNnZG1WeWMybHZiajBpTVM0eElpQnBaRDBpVEdGNVpYSmZNU0lnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JaUI0Yld4dWN6cDRiR2x1YXowaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1UazVPUzk0YkdsdWF5SWdlRDBpTUhCNElpQjVQU0l3Y0hnaURRb0pJSFpwWlhkQ2IzZzlJakFnTUNBeE5pQXhOaUlnYzNSNWJHVTlJbVZ1WVdKc1pTMWlZV05yWjNKdmRXNWtPbTVsZHlBd0lEQWdNVFlnTVRZN0lpQjRiV3c2YzNCaFkyVTlJbkJ5WlhObGNuWmxJajROQ2p4d2IyeDVaMjl1SUhCdmFXNTBjejBpTVRFc01USWdPU3d4TkNBekxEZ2dPU3d5SURFeExEUWdOeXc0SUNJdlBnMEtQQzl6ZG1jK0RRbz0pO1wiLFxuICAgIFwiLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX2ltYWdlLWJ1dHRvbi1yaWdodFwiOlxuICAgICAgXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHZlcnRpY2FsLWFsaWduOiB0b3A7IG1hcmdpbi10b3A6IDIycHg7IGZvbnQtc2l6ZTogMTRweDsgd2lkdGg6IDE2cHg7IGhlaWdodDogMTZweDsgY3Vyc29yOiBwb2ludGVyOyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpZFhSbUxUZ2lQejROQ2p3aExTMGdSMlZ1WlhKaGRHOXlPaUJCWkc5aVpTQkpiR3gxYzNSeVlYUnZjaUF5TWk0d0xqRXNJRk5XUnlCRmVIQnZjblFnVUd4MVp5MUpiaUF1SUZOV1J5QldaWEp6YVc5dU9pQTJMakF3SUVKMWFXeGtJREFwSUNBdExUNE5Danh6ZG1jZ2RtVnljMmx2YmowaU1TNHhJaUJwWkQwaVRHRjVaWEpmTVNJZ2VHMXNibk05SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpJd01EQXZjM1puSWlCNGJXeHVjenA0YkdsdWF6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNVGs1T1M5NGJHbHVheUlnZUQwaU1IQjRJaUI1UFNJd2NIZ2lEUW9KSUhacFpYZENiM2c5SWpBZ01DQXhOaUF4TmlJZ2MzUjViR1U5SW1WdVlXSnNaUzFpWVdOclozSnZkVzVrT201bGR5QXdJREFnTVRZZ01UWTdJaUI0Yld3NmMzQmhZMlU5SW5CeVpYTmxjblpsSWo0TkNqeHdiMng1WjI5dUlIQnZhVzUwY3owaU5TdzBJRGNzTWlBeE15dzRJRGNzTVRRZ05Td3hNaUE1TERnZ0lpOCtEUW84TDNOMlp6NE5DZz09KTtcIixcbiAgICBcIi5zdl9wcm9ncmVzcy1idXR0b25zX19pbWFnZS1idXR0b24tLWhpZGRlblwiOiBcInZpc2liaWxpdHk6IGhpZGRlbjtcIixcbiAgICBcIi5zdl9wcm9ncmVzcy1idXR0b25zX19saXN0LWNvbnRhaW5lclwiOlxuICAgICAgXCJtYXgtd2lkdGg6IGNhbGMoMTAwJSAtIDM2cHgpOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IG92ZXJmbG93OiBoaWRkZW47XCIsXG4gICAgXCIuc3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdFwiOlxuICAgICAgXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdpZHRoOiBtYXgtY29udGVudDsgcGFkZGluZy1sZWZ0OiAyOHB4OyBwYWRkaW5nLXJpZ2h0OiAyOHB4OyBtYXJnaW4tdG9wOiAxNHB4OyBtYXJnaW4tYm90dG9tOiAxNHB4O1wiLFxuICAgIFwiLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QgbGlcIjpcbiAgICAgIFwid2lkdGg6IDEzOHB4OyBmb250LXNpemU6IDE0cHg7IGZvbnQtZmFtaWx5OiAnU2Vnb2UgVUknLCAnSGVsdmV0aWNhIE5ldWUnLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOyBwb3NpdGlvbjogcmVsYXRpdmU7IHRleHQtYWxpZ246IGNlbnRlcjsgdmVydGljYWwtYWxpZ246IHRvcDsgZGlzcGxheTogaW5saW5lLWJsb2NrO1wiLFxuICAgIFwiLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QgbGk6YmVmb3JlXCI6XG4gICAgICBcIndpZHRoOiAyNHB4OyBoZWlnaHQ6IDI0cHg7IGNvbnRlbnQ6ICcnOyBsaW5lLWhlaWdodDogMzBweDsgZGlzcGxheTogYmxvY2s7IG1hcmdpbjogMCBhdXRvIDEwcHggYXV0bzsgYm9yZGVyOiAzcHggc29saWQ7IGJvcmRlci1yYWRpdXM6IDUwJTsgYm94LXNpemluZzogY29udGVudC1ib3g7IGN1cnNvcjogcG9pbnRlcjtcIixcbiAgICBcIi5zdl9wcm9ncmVzcy1idXR0b25zX19saXN0IGxpOmFmdGVyXCI6XG4gICAgICBcIndpZHRoOiA3MyU7IGhlaWdodDogM3B4OyBjb250ZW50OiAnJzsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDE1cHg7IGxlZnQ6IC0zNi41JTtcIixcbiAgICBcIi5zdl9wcm9ncmVzcy1idXR0b25zX19saXN0IGxpOmZpcnN0LWNoaWxkOmFmdGVyXCI6IFwiY29udGVudDogbm9uZTtcIixcbiAgICBcIi5zdl9wcm9ncmVzcy1idXR0b25zX19saXN0IC5zdl9wcm9ncmVzcy1idXR0b25zX19wYWdlLXRpdGxlXCI6XG4gICAgICBcIndpZHRoOiAxMDAlOyBvdmVyZmxvdzogaGlkZGVuOyB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsgd2hpdGUtc3BhY2U6IG5vd3JhcDsgZm9udC13ZWlnaHQ6IGJvbGQ7XCIsXG4gICAgXCIuc3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdCAuc3ZfcHJvZ3Jlc3MtYnV0dG9uc19fcGFnZS1kZXNjcmlwdGlvblwiOlxuICAgICAgXCJ3aWR0aDogMTAwJTsgb3ZlcmZsb3c6IGhpZGRlbjsgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7IHdoaXRlLXNwYWNlOiBub3dyYXA7XCIsXG4gICAgXCIuc3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdCBsaS5zdl9wcm9ncmVzcy1idXR0b25zX19saXN0LWVsZW1lbnQtLW5vbmNsaWNrYWJsZTpiZWZvcmVcIjpcbiAgICAgIFwiY3Vyc29yOiBub3QtYWxsb3dlZDtcIixcblxuICAgIC8vIHJhbmtpbmdcbiAgICBcIi5zdi1yYW5raW5nXCI6IFwib3V0bGluZTogbm9uZTsgdXNlci1zZWxlY3Q6IG5vbmU7IHRvdWNoLWFjdGlvbjogbm9uZTtcIixcbiAgICBcIi5zdi1yYW5raW5nLWl0ZW1cIjpcbiAgICAgIFwiY3Vyc29yOiBwb2ludGVyOyBtYXJnaW4tYm90dG9tOiA1cHg7cG9zaXRpb246IHJlbGF0aXZlO1wiLFxuICAgIFwiLnN2LXJhbmtpbmctaXRlbTpmb2N1cyAuc3YtcmFua2luZy1pdGVtX19pY29uLS1ob3ZlclwiOlxuICAgICAgXCJ2aXNpYmlsaXR5OiBoaWRkZW47XCIsXG4gICAgXCIuc3YtcmFua2luZy1pdGVtOmhvdmVyIC5zdi1yYW5raW5nLWl0ZW1fX2ljb24tLWhvdmVyXCI6XG4gICAgICBcInZpc2liaWxpdHk6IHZpc2libGU7XCIsXG4gICAgXCIuc3YtcXVlc3Rpb24tLWRpc2FibGVkIC5zdi1yYW5raW5nLWl0ZW06aG92ZXIgLnN2LXJhbmtpbmctaXRlbV9faWNvbi0taG92ZXJcIjpcbiAgICAgIFwidmlzaWJpbGl0eTogaGlkZGVuO1wiLFxuICAgIFwiLnN2LXJhbmtpbmctaXRlbTpmb2N1c1wiOiBcIm91dGxpbmU6IG5vbmU7XCIsXG4gICAgXCIuc3YtcmFua2luZy1pdGVtOmZvY3VzIC5zdi1yYW5raW5nLWl0ZW1fX2ljb24tLWZvY3VzXCI6XG4gICAgICBcInZpc2liaWxpdHk6IHZpc2libGU7IHRvcDogMTVweDtcIixcbiAgICBcIi5zdi1yYW5raW5nLWl0ZW06Zm9jdXMgLnN2LXJhbmtpbmctaXRlbV9faW5kZXhcIjpcbiAgICAgIFwiYmFja2dyb3VuZDogd2hpdGU7IGJvcmRlcjogMnB4IHNvbGlkICMxOWIzOTQ7XCIsXG4gICAgXCIuc3YtcmFua2luZy1pdGVtX19jb250ZW50XCI6XG4gICAgICBcImRpc3BsYXk6IGlubGluZS1ibG9jaztiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtwYWRkaW5nLXRvcDogNXB4O3BhZGRpbmctYm90dG9tOiA1cHg7cGFkZGluZy1sZWZ0OiAzNXB4O3BhZGRpbmctcmlnaHQ6IDEwcHg7IGJvcmRlci1yYWRpdXM6IDEwMHB4O1wiLFxuICAgIFwiLnN2LXJhbmtpbmctaXRlbV9faWNvbi1jb250YWluZXJcIjpcbiAgICAgIFwicG9zaXRpb246IGFic29sdXRlO2xlZnQ6IDA7dG9wOiAwO2JvdHRvbTogMDt3aWR0aDogMzVweDtcIixcbiAgICBcIi5zdi1yYW5raW5nLWl0ZW1fX2ljb25cIjpcbiAgICAgIFwidmlzaWJpbGl0eTogaGlkZGVuO2xlZnQ6MTBweDt0b3A6MjBweDtmaWxsOiMxOWIzOTQ7cG9zaXRpb246IGFic29sdXRlO1wiLFxuICAgIFwiLnN2LXJhbmtpbmctaXRlbV9faW5kZXhcIjpcbiAgICAgIFwiZGlzcGxheTogaW5saW5lLWJsb2NrO3BhZGRpbmc6IDEwcHggMTZweDtiYWNrZ3JvdW5kOiByZ2JhKDI1LCAxNzksIDE0OCwgMC4xKTtib3JkZXItcmFkaXVzOiAxMDBweDtib3JkZXI6IDJweCBzb2xpZCB0cmFuc3BhcmVudDsgbWFyZ2luLXJpZ2h0OiAxMHB4O1wiLFxuICAgIFwiLnN2LXJhbmtpbmctaXRlbV9fdGV4dFwiOiBcImRpc3BsYXk6IGlubGluZS1ibG9jaztcIixcbiAgICBcIi5zdi1yYW5raW5nLWl0ZW1fX2dob3N0XCI6XG4gICAgICBcImRpc3BsYXk6IG5vbmU7YmFja2dyb3VuZDogI2YzZjNmMztib3JkZXItcmFkaXVzOiAxMDBweDt3aWR0aDogMjAwcHg7aGVpZ2h0OiA1NXB4O3otaW5kZXg6IDE7cG9zaXRpb246IGFic29sdXRlO2xlZnQ6IDM1cHg7XCIsXG4gICAgXCIuc3YtcmFua2luZy1pdGVtLS1naG9zdCAuc3YtcmFua2luZy1pdGVtX19naG9zdFwiOiBcImRpc3BsYXk6IGJsb2NrO1wiLFxuICAgIFwiLnN2LXJhbmtpbmctaXRlbS0tZ2hvc3QgLnN2LXJhbmtpbmctaXRlbV9fY29udGVudFwiOiBcInZpc2liaWxpdHk6IGhpZGRlbjtcIixcbiAgICBcIi5zdi1yYW5raW5nLWl0ZW0tLWRyYWcgLnN2LXJhbmtpbmctaXRlbV9fY29udGVudFwiOlxuICAgICAgXCJib3gtc2hhZG93OiAwcHggOHB4IDE2cHggcmdiYSgwLCAwLCAwLCAwLjEpO2JvcmRlci1yYWRpdXM6IDEwMHB4O1wiLFxuICAgIFwiLnN2LXJhbmtpbmctLWRyYWcgLnN2LXJhbmtpbmctaXRlbTpob3ZlciAuc3YtcmFua2luZy1pdGVtX19pY29uXCI6XG4gICAgICBcInZpc2liaWxpdHk6IGhpZGRlbjtcIixcbiAgICBcIi5zdi1yYW5raW5nLWl0ZW0tLWRyYWcgLnN2LXJhbmtpbmctaXRlbV9faWNvbi0taG92ZXJcIjpcbiAgICAgIFwidmlzaWJpbGl0eTogdmlzaWJsZTtcIixcbiAgICBcIi5zdi1yYW5raW5nLS1tb2JpbGUgLnN2LXJhbmtpbmctaXRlbV9faWNvbi0taG92ZXJcIjpcbiAgICAgIFwidmlzaWJpbGl0eTp2aXNpYmxlOyBmaWxsOiM5ZjlmOWY7XCIsXG4gICAgXCIuc3YtcmFua2luZy0tbW9iaWxlLnN2LXJhbmtpbmctLWRyYWcgLnN2LXJhbmtpbmctaXRlbS0tZ2hvc3QgLnN2LXJhbmtpbmctaXRlbV9faWNvbi5zdi1yYW5raW5nLWl0ZW1fX2ljb24tLWhvdmVyXCI6XG4gICAgICBcInZpc2liaWxpdHk6aGlkZGVuO1wiLFxuXG4gICAgXCIuc3ZfcXN0biAuc3ZfcV9zZWxlY3RfY29sdW1uXCI6XG4gICAgICBcImRpc3BsYXk6IGlubGluZS1ibG9jazsgdmVydGljYWwtYWxpZ246IHRvcDsgbWluLXdpZHRoOiAxMCU7XCIsXG5cbiAgICBcIi5zdl9xc3RuIC5zdl9xX3NlbGVjdF9jb2x1bW4gPiAqOm5vdCguc3ZfdGVjaG5pY2FsKVwiOiBcImRpc3BsYXk6IGJsb2NrO1wiLFxuXG4gICAgXCIuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5zdl9ib2R5IC5zdl9wX3Jvb3QgLnN2X3FzdG4gLnN2X3Ffc2VsZWN0X2NvbHVtbiB0ZXh0YXJlYVwiOlxuICAgICAgXCJtYXJnaW4tbGVmdDogMDsgcGFkZGluZy1sZWZ0OiAwOyBsaW5lLWhlaWdodDogaW5pdGlhbDtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1oaWRkZW5cIjogXCJkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtdmlzdWFsbHloaWRkZW5cIjpcbiAgICAgIFwicG9zaXRpb246IGFic29sdXRlOyBoZWlnaHQ6IDFweCAhaW1wb3J0YW50OyB3aWR0aDogMXB4ICFpbXBvcnRhbnQ7IG92ZXJmbG93OiBoaWRkZW47IGNsaXA6IHJlY3QoMXB4IDFweCAxcHggMXB4KTsgY2xpcDogcmVjdCgxcHgsIDFweCwgMXB4LCAxcHgpO1wiLFxuXG4gICAgLy8gcGFuZWxkeW5hbWljIHByb2dyZXNzXG4gICAgXCIuc3ZfbWFpbiAuc3YtcHJvZ3Jlc3NcIjpcbiAgICAgIFwiaGVpZ2h0OiAwLjE5ZW07IGJhY2tncm91bmQtY29sb3I6ICRoZWFkZXItYmFja2dyb3VuZC1jb2xvcjsgcG9zaXRpb246IHJlbGF0aXZlO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LXByb2dyZXNzX19iYXJcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7IGhlaWdodDogMTAwJTsgcG9zaXRpb246IHJlbGF0aXZlO1wiLFxuICAgIC8vIEVPIHBhbmVsZHluYW1pYyBwcm9ncmVzc1xuXG4gICAgLy8gcGFuZWxkeW5hbWljXG4gICAgXCIuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19wcm9ncmVzcy1jb250YWluZXJcIjpcbiAgICAgIFwicG9zaXRpb246IHJlbGF0aXZlOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdpZHRoOiBjYWxjKDEwMCUgLSAyNTBweCk7IG1hcmdpbi10b3A6IDIwcHg7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19hZGQtYnRuXCI6IFwiZmxvYXQ6IHJpZ2h0O1wiLFxuICAgIFwiLnN2X21haW4gLnN2LXBhbmVsZHluYW1pY19fYWRkLWJ0bi0tbGlzdC1tb2RlXCI6XG4gICAgICBcImZsb2F0OiBub25lOyBtYXJnaW4tdG9wOiAwO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LXBhbmVsZHluYW1pY19fcmVtb3ZlLWJ0blwiOiBcIm1hcmdpbi10b3A6IDEuMjVlbTtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1wYW5lbGR5bmFtaWNfX3JlbW92ZS1idG4tLXJpZ2h0XCI6XG4gICAgICBcIm1hcmdpbi10b3A6IDA7IG1hcmdpbi1sZWZ0OiAxLjI1ZW07XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19wcmV2LWJ0biwgLnN2X21haW4gLnN2LXBhbmVsZHluYW1pY19fbmV4dC1idG5cIjpcbiAgICAgIFwiYm94LXNpemluZzogYm9yZGVyLWJveDsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBjdXJzb3I6IHBvaW50ZXI7IHdpZHRoOiAwLjdlbTsgdG9wOiAtMC4yOGVtOyBwb3NpdGlvbjogYWJzb2x1dGU7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19wcmV2LWJ0blwiOlxuICAgICAgXCJsZWZ0OiAtMS4zZW07IHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1wYW5lbGR5bmFtaWNfX25leHQtYnRuIFwiOlxuICAgICAgXCJyaWdodDogLTEuM2VtOyB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LXBhbmVsZHluYW1pY19fcHJldi1idG4uc3YtcGFuZWxkeW5hbWljX19wcmV2LWJ0bi0tZGlzYWJsZWQsIC5zdl9tYWluIC5zdi1wYW5lbGR5bmFtaWNfX25leHQtYnRuLnN2LXBhbmVsZHluYW1pY19fbmV4dC1idG4tLWRpc2FibGVkXCI6XG4gICAgICBcImN1cnNvcjogYXV0bztcIixcbiAgICBcIi5zdl9tYWluIC5zdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzLXRleHRcIjpcbiAgICAgIFwiZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtc2l6ZTogMC44N2VtOyBtYXJnaW4tdG9wOiAwLjY5ZW07IG1hcmdpbi1sZWZ0OiA0ZW1cIixcbiAgICAvLyBFTyBwYW5lbGR5bmFtaWNcbiAgICAvL2Jvb2xlYW5cbiAgICBcIi5zdl9tYWluIC5zdi1ib29sZWFuX19zd2l0Y2hcIjpcbiAgICAgIFwiZGlzcGxheTogaW5saW5lLWJsb2NrOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB3aWR0aDogNjNweDsgaGVpZ2h0OiAyNHB4OyBtYXJnaW4tcmlnaHQ6IDE3cHg7IG1hcmdpbi1sZWZ0OiAyMXB4OyBwYWRkaW5nOiAycHggM3B4OyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyBib3JkZXItcmFkaXVzOiAxMnB4OyBjdXJzb3I6IHBvaW50ZXI7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYm9vbGVhbl9fc2xpZGVyXCI6XG4gICAgICBcImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2lkdGg6IDIwcHg7IGhlaWdodDogMjBweDsgdHJhbnNpdGlvbi1kdXJhdGlvbjogLjRzOyB0cmFuc2l0aW9uLXByb3BlcnR5OiBtYXJnaW4tbGVmdDsgYm9yZGVyOiBub25lOyBib3JkZXItcmFkaXVzOiAxMDAlO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LWJvb2xlYW5fX2xhYmVsXCI6IFwidmVydGljYWwtYWxpZ246IG1pZGRsZTsgY3Vyc29yOiBwb2ludGVyO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LWJvb2xlYW4tLWluZGV0ZXJtaW5hdGUgIC5zdi1ib29sZWFuX19zbGlkZXJcIjpcbiAgICAgIFwibWFyZ2luLWxlZnQ6IGNhbGMoNTAlIC0gMTBweCk7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYm9vbGVhbi0tY2hlY2tlZCAgLnN2LWJvb2xlYW5fX3NsaWRlclwiOlxuICAgICAgXCJtYXJnaW4tbGVmdDogY2FsYygxMDAlIC0gMjBweCk7XCIsXG4gICAgXCJbZGlyPSdydGwnXSAuc3YtYm9vbGVhbl9fbGFiZWwgXCI6IFwiZmxvYXQ6IHJpZ2h0O1wiLFxuICAgIFwiW2Rpcj0ncnRsJ10gLnN2LWJvb2xlYW4tLWluZGV0ZXJtaW5hdGUgLnN2LWJvb2xlYW5fX3NsaWRlclwiOlxuICAgICAgXCJtYXJnaW4tcmlnaHQ6IGNhbGMoNTAlIC0gMC42MjVlbSk7XCIsXG4gICAgXCJbZGlyPSdydGwnXSAuc3YtYm9vbGVhbi0tY2hlY2tlZCAuc3YtYm9vbGVhbl9fc2xpZGVyXCI6XG4gICAgICBcIm1hcmdpbi1yaWdodDogY2FsYygxMDAlIC0gMS4yNWVtKTtcIixcbiAgICBcIltkaXI9J3J0bCddIC5zdi1ib29sZWFuX19zd2l0Y2hcIjogXCJmbG9hdDogcmlnaHQ7XCIsXG4gICAgXCJbc3R5bGUqPSdkaXJlY3Rpb246cnRsJ10gLnN2LWJvb2xlYW5fX2xhYmVsIFwiOiBcImZsb2F0OiByaWdodDtcIixcbiAgICBcIltzdHlsZSo9J2RpcmVjdGlvbjpydGwnXSAuc3YtYm9vbGVhbi0taW5kZXRlcm1pbmF0ZSAuc3YtYm9vbGVhbl9fc2xpZGVyXCI6XG4gICAgICBcIm1hcmdpbi1yaWdodDogY2FsYyg1MCUgLSAwLjYyNWVtKTtcIixcbiAgICBcIltzdHlsZSo9J2RpcmVjdGlvbjpydGwnXSAuc3YtYm9vbGVhbi0tY2hlY2tlZCAuc3YtYm9vbGVhbl9fc2xpZGVyXCI6XG4gICAgICBcIm1hcmdpbi1yaWdodDogY2FsYygxMDAlIC0gMS4yNWVtKTtcIixcbiAgICBcIltzdHlsZSo9J2RpcmVjdGlvbjpydGwnXSAuc3YtYm9vbGVhbl9fc3dpdGNoXCI6IFwiZmxvYXQ6IHJpZ2h0O1wiLFxuXG4gICAgLy8gRU8gYm9vbGVhblxuICAgIFwiLnN2X21haW4gLnN2X3FfbnVtXCI6IFwiXCIsXG4gICAgXCIuc3ZfbWFpbiAuc3ZfcV9udW0gKyBzcGFuXCI6IFwiXCIsXG5cbiAgICAvLyBTaWduYXR1cmVQYWRcbiAgICBcIi5zdl9tYWluIC5zanNfc3BfY29udGFpbmVyXCI6XG4gICAgICBcInBvc2l0aW9uOiByZWxhdGl2ZTsgYm94LXNpemluZzogY29udGVudC1ib3g7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc2pzX3NwX2NvbnRyb2xzXCI6IFwicG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAwOyBib3R0b206IDA7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc2pzX3NwX2NvbnRyb2xzID4gYnV0dG9uXCI6IFwidXNlci1zZWxlY3Q6IG5vbmU7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc2pzX3NwX2NvbnRhaW5lcj5kaXY+Y2FudmFzOmZvY3VzXCI6IFwib3V0bGluZTogbm9uZTtcIixcbiAgICBcIi5zdl9tYWluIC5zanNfc3BfcGxhY2Vob2xkZXJcIjpcbiAgICAgIFwiZGlzcGxheTogZmxleDsgIGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBwb3NpdGlvbjogYWJzb2x1dGU7IHotaW5kZXg6IDA7IHVzZXItc2VsZWN0OiBub25lOyBwb2ludGVyLWV2ZW50czogbm9uZTsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTtcIixcblxuICAgIC8vIGxvZ29cbiAgICAvLyBcIi5zdl9tYWluIC5zdl9oZWFkZXJcIjogXCJ3aGl0ZS1zcGFjZTogbm93cmFwO1wiLFxuICAgIFwiLnN2X21haW4gLnN2X2xvZ29cIjogXCJcIixcbiAgICBcIi5zdl9tYWluIC5zdi1sb2dvLS1sZWZ0XCI6XG4gICAgICBcImRpc3BsYXk6IGlubGluZS1ibG9jazsgdmVydGljYWwtYWxpZ246IHRvcDsgbWFyZ2luLXJpZ2h0OiAyZW07XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtbG9nby0tcmlnaHRcIjpcbiAgICAgIFwiZGlzcGxheTogaW5saW5lLWJsb2NrOyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyBtYXJnaW4tbGVmdDogMmVtOyBmbG9hdDogcmlnaHQ7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtbG9nby0tcmlnaHQrLnN2LWxvZ28tLXJpZ2h0LXRhaWxcIjogXCJjbGVhcjogYm90aDtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1sb2dvLS10b3BcIjpcbiAgICAgIFwiZGlzcGxheTogYmxvY2s7IHdpZHRoOiAxMDAlOyB0ZXh0LWFsaWduOiBjZW50ZXI7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtbG9nby0tYm90dG9tXCI6XG4gICAgICBcImRpc3BsYXk6IGJsb2NrOyB3aWR0aDogMTAwJTsgdGV4dC1hbGlnbjogY2VudGVyO1wiLFxuICAgIFwiLnN2X21haW4gLnN2X2hlYWRlcl9fdGV4dFwiOlxuICAgICAgXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHZlcnRpY2FsLWFsaWduOiB0b3A7IG1heC13aWR0aDogMTAwJVwiLFxuXG4gICAgXCIuc3ZfbWFpbiAuc3YtZXhwYW5kLWFjdGlvbjpiZWZvcmVcIjogXCJjb250ZW50OiBcXFwiXFxcIjsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0MlM0Z4bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnJTNGJTNFJTNDIS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMjEuMS4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAtLSUzRSUzQ3N2ZyB2ZXJzaW9uPScxLjEnIGlkPSdMYXllcl8xJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHhtbG5zOnhsaW5rPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJyB4PScwcHgnIHk9JzBweCcgdmlld0JveD0nMCAwIDEwIDEwJyBzdHlsZT0nZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAxMCAxMDsnIHhtbDpzcGFjZT0ncHJlc2VydmUnJTNFJTNDc3R5bGUgdHlwZT0ndGV4dC9jc3MnJTNFIC5zdDAlN0JmaWxsOiUyMzQwNDA0MDslN0QlMEElM0Mvc3R5bGUlM0UlM0Nwb2x5Z29uIGNsYXNzPSdzdDAnIHBvaW50cz0nMiwyIDAsNCA1LDkgMTAsNCA4LDIgNSw1ICcvJTNFJTNDL3N2ZyUzRSUwQVxcXCIpOyBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgY2VudGVyOyBoZWlnaHQ6IDEwcHg7IHdpZHRoOiAxMnB4OyBtYXJnaW46IGF1dG8gOHB4O1wiLFxuXG4gICAgXCIuc3ZfbWFpbiAuc3YtZXhwYW5kLWFjdGlvbi0tZXhwYW5kZWQ6YmVmb3JlXCI6IFwidHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcIixcblxuICAgIFwiLnN2X21haW4gLnN2LWFjdGlvbi1iYXJcIjogXCJkaXNwbGF5OiBmbGV4OyBwb3NpdGlvbjogcmVsYXRpdmU7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IG1hcmdpbi1sZWZ0OiBhdXRvOyBwYWRkaW5nOiAwIDAgMCAxNnB4OyBvdmVyZmxvdzogaGlkZGVuOyB3aGl0ZS1zcGFjZTogbm93cmFwO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LWFjdGlvbi1iYXItc2VwYXJhdG9yXCI6IFwiZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogMXB4OyBoZWlnaHQ6IDI0cHg7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IG1hcmdpbi1yaWdodDogMTZweDsgYmFja2dyb3VuZC1jb2xvcjogI2Q2ZDZkNjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1hY3Rpb24tYmFyLWl0ZW1cIjogXCItd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7IC1tb3otYXBwZWFyYW5jZTogbm9uZTsgYXBwZWFyYW5jZTogbm9uZTsgZGlzcGxheTogZmxleDsgaGVpZ2h0OiA0MHB4OyBwYWRkaW5nOiA4cHg7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IG1hcmdpbi1yaWdodDogMTZweDsgYm9yZGVyOiBub25lOyBib3JkZXItcmFkaXVzOiAycHg7IGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OyBjdXJzb3I6IHBvaW50ZXI7IGxpbmUtaGVpZ2h0OiAyNHB4OyBmb250LXNpemU6IDE2cHg7IG92ZXJmbG93LXg6IGhpZGRlbjsgd2hpdGUtc3BhY2U6IG5vd3JhcDsgbWluLXdpZHRoOiBhdXRvOyBmb250LXdlaWdodDogbm9ybWFsXCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYWN0aW9uLWJhci1pdGVtX190aXRsZVwiOiBcInZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IHdoaXRlLXNwYWNlOiBub3dyYXA7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYWN0aW9uLWJhci1pdGVtX190aXRsZS0td2l0aC1pY29uXCI6IFwibWFyZ2luLWxlZnQ6IDhweDtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1hY3Rpb25fX2NvbnRlbnRcIjogXCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogcm93OyBhbGlnbi1pdGVtczogY2VudGVyO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LWFjdGlvbl9fY29udGVudCA+ICpcIjogXCJmbGV4OiAwIDAgYXV0bztcIixcbiAgICBcIi5zdl9tYWluIC5zdi1hY3Rpb24tLWhpZGRlblwiOiBcIndpZHRoOiAwcHg7IGhlaWdodDogMHB4OyBvdmVyZmxvdzogaGlkZGVuO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LWFjdGlvbi1iYXItaXRlbV9faWNvbiBzdmdcIjogXCJkaXNwbGF5OiBibG9jaztcIixcbiAgICBcIi5zdl9tYWluIC5zdi1hY3Rpb24tYmFyLWl0ZW06YWN0aXZlXCI6IFwib3BhY2l0eTogMC41O1wiLFxuICAgIFwiLnN2X21haW4gLnN2LWFjdGlvbi1iYXItaXRlbTpmb2N1c1wiOiBcIm91dGxpbmU6IG5vbmU7XCIsXG5cbiAgICBcIi5zdl9tYWluIC5zdi10aXRsZS1hY3Rpb25zXCI6IFwiZGlzcGxheTogZmxleDthbGlnbi1pdGVtczogY2VudGVyO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LXRpdGxlLWFjdGlvbnNfX3RpdGxlXCI6XG4gICAgICBcImZsZXgtd3JhcDogd3JhcDsgbWF4LXdpZHRoOiA5MCU7IG1pbi13aWR0aDogNTAlO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LXRpdGxlLWFjdGlvbnNfX2JhclwiOiBcIm1pbi13aWR0aDogNTZweDtcIixcbiAgICBcIi5zdl9tYWluIC5zdl9tYXRyaXhfY2VsbF9hY3Rpb25zIC5zdi1hY3Rpb24tYmFyXCI6XG4gICAgICBcIm1hcmdpbi1sZWZ0OiAwOyBwYWRkaW5nLWxlZnQ6IDA7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3ZfcF93cmFwcGVyX2luX3Jvd1wiOlxuICAgICAgXCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogcm93OyBhbGlnbi1pdGVtczogY2VudGVyO1wiLFxuICAgIFwiLnN2X21haW4gIC5zdl9wX3JlbW92ZV9idG5fcmlnaHRcIjogXCJtYXJnaW4tbGVmdDogMWVtO1wiLFxuICAgIC8vYnV0dG9uLWdyb3VwXG4gICAgXCIuc3ZfbWFpbiAuc3YtYnV0dG9uLWdyb3VwXCI6XG4gICAgICBcImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGZsZXgtZGlyZWN0aW9uOiByb3c7IGZvbnQtc2l6ZTogMTZweDsgaGVpZ2h0OiA0OHB4OyBvdmVyZmxvdzogYXV0bztcIixcbiAgICBcIi5zdl9tYWluIC5zdi1idXR0b24tZ3JvdXBfX2l0ZW1cIjpcbiAgICAgIFwiZGlzcGxheTogZmxleDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgZmxleC1kaXJlY3Rpb246IHJvdzsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IHdpZHRoOiAxMDAlOyBwYWRkaW5nOiAxMXB4IDE2cHg7IGxpbmUtaGVpZ2h0OiAyNHB4OyBib3JkZXItd2lkdGg6IDFweDsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgb3V0bGluZTogbm9uZTsgZm9udC1zaXplOiAxNnB4OyBmb250LXdlaWdodDogNDAwOyBjdXJzb3I6IHBvaW50ZXI7IG92ZXJmbG93OiBoaWRkZW47XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYnV0dG9uLWdyb3VwX19pdGVtOm5vdCg6Zmlyc3Qtb2YtdHlwZSlcIjogXCJtYXJnaW4tbGVmdDogLTFweDtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1idXR0b24tZ3JvdXBfX2l0ZW0taWNvblwiOiBcImRpc3BsYXk6IGJsb2NrOyBoZWlnaHQ6IDI0cHg7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYnV0dG9uLWdyb3VwX19pdGVtLS1zZWxlY3RlZFwiOiBcImZvbnQtd2VpZ2h0OiA2MDA7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYnV0dG9uLWdyb3VwX19pdGVtLWRlY29yYXRvclwiOlxuICAgICAgXCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBtYXgtd2lkdGg6IDEwMCU7XCIsXG4gICAgXCIuc3ZfbWFpbiAgLnN2LWJ1dHRvbi1ncm91cF9faXRlbS1pY29uICsgLnN2LWJ1dHRvbi1ncm91cF9faXRlbS1jYXB0aW9uXCI6XG4gICAgICBcIm1hcmdpbi1sZWZ0OiA4cHhcIixcbiAgICBcIi5zdl9tYWluIC5zdi1idXR0b24tZ3JvdXBfX2l0ZW0tY2FwdGlvblwiOiBcImRpc3BsYXk6IGJsb2NrOyBvdmVyZmxvdzogaGlkZGVuOyB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsgd2hpdGUtc3BhY2U6IG5vd3JhcDtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1idXR0b24tZ3JvdXBfX2l0ZW0tLWRpc2FibGVkXCI6IFwiY29sb3I6IGN1cnNvcjogZGVmYXVsdDtcIixcbiAgICAvL2VvIGJ1dHRvbi1ncm91cFxuICAgIC8vcG9wdXBcbiAgICBcInN2LXBvcHVwXCI6IFwiZGlzcGxheTogYmxvY2s7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgei1pbmRleDogLTE7XCIsXG4gICAgXCIuc3YtcG9wdXBcIjpcbiAgICAgIFwicG9zaXRpb246IGZpeGVkOyBsZWZ0OiAwOyB0b3A6IDA7IHotaW5kZXg6IDEwMDA7IHdpZHRoOiAxMDB2dzsgaGVpZ2h0OiAxMDB2aDsgb3V0bGluZTogbm9uZTtcIixcbiAgICBcIi5zdi1wb3B1cC0tbW9kYWxcIjpcbiAgICAgIFwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XCIsXG4gICAgXCIuc3YtcG9wdXAtLW1vZGFsIC5zdi1wb3B1cF9fY29udGFpbmVyXCI6XG4gICAgICBcInBvc2l0aW9uOiBzdGF0aWM7IGZpbHRlcjogbm9uZTsgcGFkZGluZzogY2FsYyg0ICogOHB4KTtcIixcbiAgICBcIi5zdi1wb3B1cF9fY29udGFpbmVyXCI6IFwicG9zaXRpb246IGFic29sdXRlOyBmaWx0ZXI6IGRyb3Atc2hhZG93KDBweCBjYWxjKDEgKiA4cHgpIGNhbGMoMiAqIDhweCkgcmdiYSgwLCAwLCAwLCAwLjEpKTsgcGFkZGluZzogY2FsYygxICogOHB4KSAwOyBiYWNrZ3JvdW5kOiB3aGl0ZTsgYm9yZGVyLXJhZGl1czogNHB4OyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBtYXgtaGVpZ2h0OiA5MHZoOyBtYXgtd2lkdGg6IDkwdnc7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7XCIsXG4gICAgXCIuc3YtcG9wdXBfX3Njcm9sbGluZy1jb250ZW50XCI6IFwib3ZlcmZsb3c6IGF1dG87XCIsXG4gICAgXCIuc3YtcG9wdXBfX3Njcm9sbGluZy1jb250ZW50Ojotd2Via2l0LXNjcm9sbGJhclwiOlxuICAgICAgXCJoZWlnaHQ6IDZweDsgd2lkdGg6IDZweDsgYmFja2dyb3VuZC1jb2xvcjogI2YzZjNmMztcIixcbiAgICBcIi5zdi1wb3B1cF9fc2Nyb2xsaW5nLWNvbnRlbnQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iXCI6XG4gICAgICBcImJhY2tncm91bmQ6IHJnYmEoMjUsIDE3OSwgMTQ4LCAwLjEpO1wiLFxuICAgIFwiLnN2LXBvcHVwX19jb250ZW50XCI6IFwibWluLXdpZHRoOiAxMDAlO1wiLFxuICAgIFwiLnN2LXBvcHVwLS1zaG93LXBvaW50ZXIuc3YtcG9wdXAtLXRvcFwiOlxuICAgICAgXCJ0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoY2FsYygtMSAqIDhweCkpO1wiLFxuICAgIFwiLnN2LXBvcHVwLS1zaG93LXBvaW50ZXIuc3YtcG9wdXAtLXRvcCAuc3YtcG9wdXBfX3BvaW50ZXJcIjpcbiAgICAgIFwidHJhbnNmb3JtOiB0cmFuc2xhdGUoY2FsYygtMSAqIDhweCkpIHJvdGF0ZSgxODBkZWcpO1wiLFxuICAgIFwiLnN2LXBvcHVwLS1zaG93LXBvaW50ZXIuc3YtcG9wdXAtLWJvdHRvbVwiOlxuICAgICAgXCJ0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoY2FsYygxICogOHB4KSk7XCIsXG4gICAgXCIuc3YtcG9wdXAtLXNob3ctcG9pbnRlci5zdi1wb3B1cC0tYm90dG9tIC5zdi1wb3B1cF9fcG9pbnRlclwiOlxuICAgICAgXCJ0cmFuc2Zvcm06IHRyYW5zbGF0ZShjYWxjKC0xICogOHB4KSwgY2FsYygtMSAqIDhweCkpO1wiLFxuICAgIFwiLnN2LXBvcHVwLS1zaG93LXBvaW50ZXIuc3YtcG9wdXAtLXJpZ2h0XCI6XG4gICAgICBcInRyYW5zZm9ybTogdHJhbnNsYXRlKGNhbGMoMSAqIDhweCkpO1wiLFxuICAgIFwiLnN2LXBvcHVwLS1zaG93LXBvaW50ZXIuc3YtcG9wdXAtLXJpZ2h0IC5zdi1wb3B1cF9fcG9pbnRlclwiOlxuICAgICAgXCJ0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtMTJweCwgLTRweCkgcm90YXRlKC05MGRlZyk7XCIsXG4gICAgXCIuc3YtcG9wdXAtLXNob3ctcG9pbnRlci5zdi1wb3B1cC0tbGVmdFwiOlxuICAgICAgXCJ0cmFuc2Zvcm06IHRyYW5zbGF0ZShjYWxjKC0xICogOHB4KSk7XCIsXG4gICAgXCIuc3YtcG9wdXAtLXNob3ctcG9pbnRlci5zdi1wb3B1cC0tbGVmdCAuc3YtcG9wdXBfX3BvaW50ZXJcIjpcbiAgICAgIFwidHJhbnNmb3JtOiB0cmFuc2xhdGUoLTRweCwgLTRweCkgcm90YXRlKDkwZGVnKTtcIixcbiAgICBcIi5zdi1wb3B1cF9fcG9pbnRlclwiOiBcImRpc3BsYXk6IGJsb2NrOyBwb3NpdGlvbjogYWJzb2x1dGU7XCIsXG4gICAgXCIuc3YtcG9wdXBfX3BvaW50ZXI6YWZ0ZXJcIjpcbiAgICAgIFwiY29udGVudDogJyAnOyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDA7IGhlaWdodDogMDsgYm9yZGVyLWxlZnQ6IGNhbGMoMSAqIDhweCkgc29saWQgdHJhbnNwYXJlbnQ7IGJvcmRlci1yaWdodDogY2FsYygxICogOHB4KSBzb2xpZCB0cmFuc3BhcmVudDsgYm9yZGVyLWJvdHRvbTogY2FsYygxICogOHB4KSBzb2xpZCB3aGl0ZTsgYWxpZ24tc2VsZjogY2VudGVyO1wiLFxuICAgIFwiLnN2LXBvcHVwX19oZWFkZXJcIjogXCJmb250LWZhbWlseTogT3BlbiBTYW5zOyBmb250LXNpemU6IGNhbGMoMyAqIDhweCk7IGxpbmUtaGVpZ2h0OiBjYWxjKDQgKiA4cHgpOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtd2VpZ2h0OiA3MDA7IG1hcmdpbi1ib3R0b206IGNhbGMoMiAqIDhweCk7IGNvbG9yOiByZ2IoMjIsIDIyLCAyMilcIixcbiAgICBcIi5zdi1wb3B1cF9fZm9vdGVyXCI6IFwiZGlzcGxheTogZmxleDsgbWFyZ2luLXRvcDogY2FsYyg0ICogOHB4KTtcIixcbiAgICBcIi5zdi1wb3B1cF9fZm9vdGVyLWl0ZW06Zmlyc3QtY2hpbGRcIjogXCJtYXJnaW4tbGVmdDogYXV0bztcIixcbiAgICBcIi5zdi1wb3B1cF9fZm9vdGVyLWl0ZW0gKyAuc3YtcG9wdXBfX2Zvb3Rlci1pdGVtXCI6XG4gICAgICBcIm1hcmdpbi1sZWZ0OiBjYWxjKDEgKiA4cHgpO1wiLFxuICAgIFwiLnN2LXBvcHVwX19idXR0b25cIjpcbiAgICAgIFwicGFkZGluZzogY2FsYygyICogOHB4KSBjYWxjKDYgKiA4cHgpOyBiYWNrZ3JvdW5kOiAjZmZmOyBib3gtc2hhZG93OiAwcHggMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTUpOyBib3JkZXItcmFkaXVzOiA0cHg7IGN1cnNvcjogcG9pbnRlcjsgbWFyZ2luOiAycHg7IGZvbnQtZmFtaWx5OiAnU2Vnb2UgVUknLCAnSGVsdmV0aWNhIE5ldWUnLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogY2FsYygyICogOHB4KTsgbGluZS1oZWlnaHQ6IGNhbGMoMyAqIDhweCk7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6ICMxOWIzOTQ7IGJvcmRlcjogbm9uZTsgb3V0bGluZTogbm9uZTtcIixcbiAgICBcIi5zdi1wb3B1cF9fYnV0dG9uOmhvdmVyXCI6IFwiYm94LXNoYWRvdzogMCAwIDAgMnB4ICMxOWIzOTQ7XCIsXG4gICAgXCIuc3YtcG9wdXBfX2J1dHRvbjpkaXNhYmxlZFwiOiBcImNvbG9yOiByZ2JhKDIyLCAyMiwgMjIsIDAuMTYpOyBjdXJzb3I6IGRlZmF1bHQ7XCIsXG4gICAgXCIuc3YtcG9wdXBfX2J1dHRvbjpkaXNhYmxlZDpob3ZlclwiOlxuICAgICAgXCJib3gtc2hhZG93OiAwcHggMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTUpO1wiLFxuICAgIFwiLnN2LXBvcHVwX19idXR0b24uc3YtcG9wdXBfX2J1dHRvbi0tYXBwbHlcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAjMTliMzk0OyBjb2xvcjogI2ZmZjtcIixcbiAgICBcIi5zdi1wb3B1cF9fYnV0dG9uLnN2LXBvcHVwX19idXR0b24tLWFwcGx5OmRpc2FibGVkXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogI2YzZjNmMztcIixcbiAgICAvL2VvIHBvcHVwXG4gICAgLy9saXN0XG4gICAgXCIuc3YtbGlzdFwiOlxuICAgICAgXCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgcGFkZGluZzogMDsgbWFyZ2luOiAwOyBiYWNrZ3JvdW5kOiAjZmZmZmZmOyBmb250LWZhbWlseTogJ09wZW4gU2Fucyc7IGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcIixcbiAgICBcIi5zdi1saXN0X19pdGVtXCI6XG4gICAgICBcIndpZHRoOiAxMDAlOyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyBwYWRkaW5nOiBjYWxjKDEgKiA4cHgpIGNhbGMoMiAqIDhweCk7IGN1cnNvcjogcG9pbnRlcjtcIixcbiAgICBcIi5zdi1saXN0X19pdGVtLWljb25cIjpcbiAgICAgIFwiZmxvYXQ6IGxlZnQ7IHdpZHRoOiBjYWxjKDMgKiA4cHgpOyBoZWlnaHQ6IGNhbGMoMyAqIDhweCk7IG1hcmdpbi1yaWdodDogY2FsYygyICogOHB4KTtcIixcbiAgICBcIi5zdi1saXN0X19pdGVtLWljb24gc3ZnXCI6IFwiZGlzcGxheTogYmxvY2s7XCIsXG4gICAgXCIuc3YtbGlzdF9faXRlbS1pY29uIHVzZVwiOiBcImZpbGw6ICM5MDkwOTA7XCIsXG4gICAgXCIuc3YtbGlzdF9faXRlbTpub3QoLnN2LWxpc3RfX2l0ZW0tLXNlbGVjdGVkKTpob3ZlclwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAjZjNmM2YzO1wiLFxuICAgIFwiLnN2LWxpc3RfX2l0ZW0tLXNlbGVjdGVkXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogIzE5YjM5NDsgY29sb3I6ICNmZmY7XCIsXG4gICAgXCIuc3YtbGlzdF9faXRlbS0tc2VsZWN0ZWQgLnN2LWxpc3RfX2l0ZW0taWNvbiB1c2VcIjogXCJmaWxsOiAjZmZmO1wiLFxuICAgIFwiLnN2LWxpc3RfX2l0ZW0tLWRpc2FibGVkXCI6XG4gICAgICBcImNvbG9yOiByZ2JhKDIyLCAyMiwgMjIsIDAuMTYpOyBjdXJzb3I6IGRlZmF1bHQ7IHBvaW50ZXItZXZlbnRzOiBub25lO1wiLFxuICAgIFwiLnN2LWxpc3RfX2l0ZW0gc3BhblwiOiBcIndoaXRlLXNwYWNlOiBub3dyYXA7XCIsXG4gICAgLy9lbyBsaXN0XG4gICAgXCIuc3Ytc2tlbGV0b24tZWxlbWVudFwiOiBcIm1pbi1oZWlnaHQ6IDUwcHg7XCIsXG4gIH07XG5cbiAgcHVibGljIHN0YXRpYyBNZWRpYTogeyBba2V5OiBzdHJpbmddOiB7IG1lZGlhOiBzdHJpbmcsIHN0eWxlOiBzdHJpbmcgfSB9ID0ge1xuICAgIFwiLnN2X3FzdG4gZmllbGRzZXQgLnN2LXEtY29sLTFcIjoge1xuICAgICAgc3R5bGU6IFwid2lkdGg6IDEwMCU7XCIsXG4gICAgICBtZWRpYTogXCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ4MHB4KVwiLFxuICAgIH0sXG4gICAgXCIuc3ZfcXN0biBmaWVsZHNldCAuc3YtcS1jb2wtMlwiOiB7XG4gICAgICBzdHlsZTogXCJ3aWR0aDogMTAwJTtcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNDgwcHgpXCIsXG4gICAgfSxcbiAgICBcIi5zdl9xc3RuIGZpZWxkc2V0IC5zdi1xLWNvbC0zXCI6IHtcbiAgICAgIHN0eWxlOiBcIndpZHRoOiAxMDAlO1wiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA0ODBweClcIixcbiAgICB9LFxuICAgIFwiLnN2X3FzdG4gZmllbGRzZXQgLnN2LXEtY29sLTRcIjoge1xuICAgICAgc3R5bGU6IFwid2lkdGg6IDEwMCU7XCIsXG4gICAgICBtZWRpYTogXCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ4MHB4KVwiLFxuICAgIH0sXG4gICAgXCIuc3ZfcXN0biBmaWVsZHNldCAuc3YtcS1jb2wtNVwiOiB7XG4gICAgICBzdHlsZTogXCJ3aWR0aDogMTAwJTtcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNDgwcHgpXCIsXG4gICAgfSxcblxuICAgIFwiLnN2X21haW4gLnN2X2NvbnRhaW5lciAucGFuZWwtYm9keS5jYXJkLWJsb2NrIC5zdl9yb3cgLnN2X3FzdG5cIjoge1xuICAgICAgc3R5bGU6IFwiZGlzcGxheTogYmxvY2s7IHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7XCIsXG4gICAgICBtZWRpYTogXCJAbWVkaWEgKG1heC13aWR0aDogNjAwcHgpXCIsXG4gICAgfSxcbiAgICBcIi5zdl9tYWluIC5zdl9jb250YWluZXIgLnBhbmVsLWJvZHkuY2FyZC1ibG9jayAuc3Zfcm93IC5zdl9xc3RuIC50aXRsZS1sZWZ0XCI6IHtcbiAgICAgIHN0eWxlOiBcImZsb2F0OiBub25lO1wiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIChtYXgtd2lkdGg6IDYwMHB4KVwiLFxuICAgIH0sXG4gICAgXCIuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5wYW5lbC1ib2R5LmNhcmQtYmxvY2sgLnN2X3JvdyAuc3ZfcXN0biAuc3ZfcV9yYWRpb2dyb3VwX2lubGluZSwgLnN2X21haW4gLnN2X2NvbnRhaW5lciAucGFuZWwtYm9keS5jYXJkLWJsb2NrIC5zdl9yb3cgLnN2X3FzdG4gLnN2X3FfY2hlY2tib3hfaW5saW5lLCAuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5wYW5lbC1ib2R5LmNhcmQtYmxvY2sgLnN2X3JvdyAuc3ZfcXN0biAuc3ZfcV9pbWFnZXBpY2tlcl9pbmxpbmVcIjoge1xuICAgICAgc3R5bGU6IFwiZGlzcGxheTogYmxvY2s7XCIsXG4gICAgICBtZWRpYTogXCJAbWVkaWEgKG1heC13aWR0aDogNjAwcHgpXCIsXG4gICAgfSxcbiAgICBcIi5zdl9tYWluIC5zdl9jb250YWluZXIgLnBhbmVsLWJvZHkuY2FyZC1ibG9jayAuc3Zfcm93IC5zdl9xc3RuIHRhYmxlLnRhYmxlXCI6IHtcbiAgICAgIHN0eWxlOiBcImRpc3BsYXk6IGJsb2NrO1wiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIChtYXgtd2lkdGg6IDYwMHB4KVwiLFxuICAgIH0sXG4gICAgXCIuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5wYW5lbC1ib2R5LmNhcmQtYmxvY2sgLnN2X3JvdyAuc3ZfcXN0biB0YWJsZS50YWJsZSB0aGVhZFwiOiB7XG4gICAgICBzdHlsZTogXCJkaXNwbGF5OiBub25lO1wiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIChtYXgtd2lkdGg6IDYwMHB4KVwiLFxuICAgIH0sXG4gICAgXCIuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5wYW5lbC1ib2R5LmNhcmQtYmxvY2sgLnN2X3JvdyAuc3ZfcXN0biB0YWJsZS50YWJsZSB0Ym9keSwgLnN2X21haW4gLnN2X2NvbnRhaW5lciAucGFuZWwtYm9keS5jYXJkLWJsb2NrIC5zdl9yb3cgLnN2X3FzdG4gdGFibGUudGFibGUgdHIsIC5zdl9tYWluIC5zdl9jb250YWluZXIgLnBhbmVsLWJvZHkuY2FyZC1ibG9jayAuc3Zfcm93IC5zdl9xc3RuIHRhYmxlLnRhYmxlIHRkXCI6IHtcbiAgICAgIHN0eWxlOiBcImRpc3BsYXk6IGJsb2NrO1wiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIChtYXgtd2lkdGg6IDYwMHB4KVwiLFxuICAgIH0sXG4gICAgXCIuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5wYW5lbC1ib2R5LmNhcmQtYmxvY2sgLnN2X3JvdyAuc3ZfcXN0biB0YWJsZS50YWJsZTpub3QoLnN2X3FfbWF0cml4KSB0ZDpiZWZvcmVcIjoge1xuICAgICAgc3R5bGU6IFwiY29udGVudDogYXR0cih0aXRsZSk7XCIsXG4gICAgICBtZWRpYTogXCJAbWVkaWEgKG1heC13aWR0aDogNjAwcHgpXCIsXG4gICAgfSxcbiAgICBcIi5zdl9tYWluIC5zdl9jb250YWluZXIgLnBhbmVsLWJvZHkuY2FyZC1ibG9jayAuc3Zfcm93IC5zdl9xc3RuIHRhYmxlLnN2X3FfbWF0cml4IHRkOmFmdGVyXCI6IHtcbiAgICAgIHN0eWxlOiBcImNvbnRlbnQ6IGF0dHIodGl0bGUpOyBwYWRkaW5nLWxlZnQ6IDFlbVwiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIChtYXgtd2lkdGg6IDYwMHB4KVwiLFxuICAgIH0sXG4gICAgXCIuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5wYW5lbC1ib2R5LmNhcmQtYmxvY2sgLnN2X3JvdyAuc3ZfcXN0biAucmFkaW8gbGFiZWwsIC5zdl9tYWluIC5zdl9jb250YWluZXIgLnBhbmVsLWJvZHkuY2FyZC1ibG9jayAuc3Zfcm93IC5zdl9xc3RuIC5jaGVja2JveCBsYWJlbFwiOiB7XG4gICAgICBzdHlsZTogXCJsaW5lLWhlaWdodDogMTJweDsgdmVydGljYWwtYWxpZ246IHRvcDtcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSAobWF4LXdpZHRoOiA2MDBweClcIixcbiAgICB9LFxuICAgIFwiLnN2X3FzdG4gbGFiZWwuc3ZfcV9tX2xhYmVsXCI6IHtcbiAgICAgIHN0eWxlOiBcImRpc3BsYXk6IGlubGluZTtcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSAobWF4LXdpZHRoOiA2MDBweClcIixcbiAgICB9LFxuICAgIFwiLnN2X21haW4gLnN2X2N1c3RvbV9oZWFkZXJcIjoge1xuICAgICAgc3R5bGU6IFwiZGlzcGxheTogbm9uZTtcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSAobWF4LXdpZHRoOiAxMzAwcHgpXCIsXG4gICAgfSxcbiAgICBcIi5zdl9tYWluIC5zdl9jb250YWluZXIgLnN2X2hlYWRlciBoM1wiOiB7XG4gICAgICBzdHlsZTogXCJmb250LXNpemU6IDEuNWVtO1wiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIChtYXgtd2lkdGg6IDEzMDBweClcIixcbiAgICB9LFxuICAgIFwiLnN2X21haW4gLnN2X2NvbnRhaW5lciAuc3ZfaGVhZGVyIGgzIHNwYW5cIjoge1xuICAgICAgc3R5bGU6IFwiZm9udC1zaXplOiAwLjc1ZW07XCIsXG4gICAgICBtZWRpYTogXCJAbWVkaWEgKG1heC13aWR0aDogNzAwcHgpXCIsXG4gICAgfSxcblxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwX2NzcyAuc3YtcHJvZ3Jlc3NfX3RleHRcIjoge1xuICAgICAgc3R5bGU6IFwibWFyZ2luLWxlZnQ6IDhlbTtcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSAobWluLXdpZHRoOiA3NjhweClcIixcbiAgICB9LFxuXG4gICAgXCIuc3Zfcm93XCI6IHtcbiAgICAgIHN0eWxlOiBcIiBkaXNwbGF5OiBmbGV4OyBmbGV4LXdyYXA6IHdyYXA7XCIsXG4gICAgICBtZWRpYTogXCJAc3VwcG9ydHMgKGRpc3BsYXk6IGZsZXgpXCIsXG4gICAgfSxcblxuICAgIFwiLnN2LXZ1ZS1yb3ctYWRkaXRpb25hbC1kaXZcIjoge1xuICAgICAgc3R5bGU6IFwiIGRpc3BsYXk6IGZsZXg7IGZsZXgtd3JhcDogd3JhcDsgZmxleC1iYXNpczogMTAwJTsgd2lkdGg6IDEwMCU7XCIsXG4gICAgICBtZWRpYTogXCJAc3VwcG9ydHMgKGRpc3BsYXk6IGZsZXgpXCIsXG4gICAgfSxcblxuICAgIFwiLnN2LXJvdyA+IC5zdi1yb3dfX3BhbmVsLCAuc3Ytcm93X19xdWVzdGlvbjpub3QoOmxhc3QtY2hpbGQpXCI6IHtcbiAgICAgIHN0eWxlOiBcImZsb2F0OiBsZWZ0O1wiLFxuICAgICAgbWVkaWE6XG4gICAgICAgIFwiQG1lZGlhIHNjcmVlbiBhbmQgKC1tcy1oaWdoLWNvbnRyYXN0OiBhY3RpdmUpLCAoLW1zLWhpZ2gtY29udHJhc3Q6IG5vbmUpXCIsXG4gICAgfSxcblxuICAgIFwiW2Rpcj0ncnRsJ10sW3N0eWxlKj0nZGlyZWN0aW9uOnJ0bCddIC5zdi1yb3dfX3F1ZXN0aW9uOm5vdCg6bGFzdC1jaGlsZClcIjoge1xuICAgICAgc3R5bGU6IFwiZmxvYXQ6IHJpZ2h0O1wiLFxuICAgICAgbWVkaWE6XG4gICAgICAgIFwiQG1lZGlhIHNjcmVlbiBhbmQgKC1tcy1oaWdoLWNvbnRyYXN0OiBhY3RpdmUpLCAoLW1zLWhpZ2gtY29udHJhc3Q6IG5vbmUpXCIsXG4gICAgfSxcblxuICAgIFwiLnN2LXJvdyA+IC5zdi1yb3dfX3BhbmVsLCAuc3Ytcm93X19xdWVzdGlvblwiOiB7XG4gICAgICBzdHlsZTogXCJ3aWR0aDogMTAwJSAhaW1wb3J0YW50OyBwYWRkaW5nLXJpZ2h0OiAwICFpbXBvcnRhbnQ7XCIsXG4gICAgICBtZWRpYTogXCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDYwMHB4KVwiLFxuICAgIH0sXG4gIH07XG5cbiAgcHVibGljIHN0YXRpYyBUaGVtZUNvbG9yczogeyBba2V5OiBzdHJpbmddOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IH0gPSB7XG4gICAgZGVmYXVsdDoge1xuICAgICAgXCIkaGVhZGVyLWJhY2tncm91bmQtY29sb3JcIjogXCIjZTdlN2U3XCIsXG4gICAgICBcIiRib2R5LWNvbnRhaW5lci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2Y0ZjRmNFwiLFxuXG4gICAgICBcIiRtYWluLWNvbG9yXCI6IFwiIzFhYjM5NFwiLFxuICAgICAgXCIkbWFpbi1ob3Zlci1jb2xvclwiOiBcIiMwYWEzODRcIixcbiAgICAgIFwiJGJvZHktYmFja2dyb3VuZC1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiRpbnB1dHMtYmFja2dyb3VuZC1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiR0ZXh0LWNvbG9yXCI6IFwiIzZkNzA3MlwiLFxuICAgICAgXCIkdGV4dC1pbnB1dC1jb2xvclwiOiBcIiM2ZDcwNzJcIixcbiAgICAgIFwiJGhlYWRlci1jb2xvclwiOiBcIiM2ZDcwNzJcIixcbiAgICAgIFwiJGJvcmRlci1jb2xvclwiOiBcIiNlN2U3ZTdcIixcblxuICAgICAgXCIkZXJyb3ItY29sb3JcIjogXCIjZWQ1NTY1XCIsXG4gICAgICBcIiRlcnJvci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2ZkNjU3NVwiLFxuXG4gICAgICBcIiRwcm9ncmVzcy10ZXh0LWNvbG9yXCI6IFwiIzlkOWQ5ZFwiLFxuICAgICAgXCIkZGlzYWJsZS1jb2xvclwiOiBcIiNkYmRiZGJcIixcbiAgICAgIFwiJGRpc2FibGVkLWxhYmVsLWNvbG9yXCI6IFwicmdiYSg2NCwgNjQsIDY0LCAwLjUpXCIsXG4gICAgICBcIiRzbGlkZXItY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkZGlzYWJsZWQtc3dpdGNoLWNvbG9yXCI6IFwiIzlmOWY5ZlwiLFxuICAgICAgXCIkZGlzYWJsZWQtc2xpZGVyLWNvbG9yXCI6IFwiI2NmY2ZjZlwiLFxuICAgICAgXCIkZm9yZWdyb3VuZC1saWdodFwiOiBcIiM5MDkwOTBcIixcbiAgICAgIFwiJGZvcmVncm91bmQtZGlzYWJsZWRcIjogXCIjMTYxNjE2XCIsXG4gICAgICBcIiRiYWNrZ3JvdW5kLWRpbVwiOiBcIiNmM2YzZjNcIixcblxuICAgICAgXCIkcHJvZ3Jlc3MtYnV0dG9ucy1jb2xvclwiOiBcIiM4ZGQ5Y2FcIixcbiAgICAgIFwiJHByb2dyZXNzLWJ1dHRvbnMtbGluZS1jb2xvclwiOiBcIiNkNGQ0ZDRcIlxuICAgIH0sXG4gICAgb3JhbmdlOiB7XG4gICAgICBcIiRoZWFkZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiM0YTRhNGFcIixcbiAgICAgIFwiJGJvZHktY29udGFpbmVyLWJhY2tncm91bmQtY29sb3JcIjogXCIjZjhmOGY4XCIsXG5cbiAgICAgIFwiJG1haW4tY29sb3JcIjogXCIjZjc4MTE5XCIsXG4gICAgICBcIiRtYWluLWhvdmVyLWNvbG9yXCI6IFwiI2U3NzEwOVwiLFxuICAgICAgXCIkYm9keS1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJGlucHV0cy1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJHRleHQtY29sb3JcIjogXCIjNGE0YTRhXCIsXG4gICAgICBcIiR0ZXh0LWlucHV0LWNvbG9yXCI6IFwiIzRhNGE0YVwiLFxuICAgICAgXCIkaGVhZGVyLWNvbG9yXCI6IFwiI2Y3ODExOVwiLFxuICAgICAgXCIkYm9yZGVyLWNvbG9yXCI6IFwiI2U3ZTdlN1wiLFxuXG4gICAgICBcIiRlcnJvci1jb2xvclwiOiBcIiNlZDU1NjVcIixcbiAgICAgIFwiJGVycm9yLWJhY2tncm91bmQtY29sb3JcIjogXCIjZmQ2NTc1XCIsXG5cbiAgICAgIFwiJHByb2dyZXNzLXRleHQtY29sb3JcIjogXCIjOWQ5ZDlkXCIsXG4gICAgICBcIiRkaXNhYmxlLWNvbG9yXCI6IFwiI2RiZGJkYlwiLFxuICAgICAgXCIkZGlzYWJsZWQtbGFiZWwtY29sb3JcIjogXCJyZ2JhKDY0LCA2NCwgNjQsIDAuNSlcIixcbiAgICAgIFwiJHNsaWRlci1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiRkaXNhYmxlZC1zd2l0Y2gtY29sb3JcIjogXCIjOWY5ZjlmXCIsXG4gICAgICBcIiRkaXNhYmxlZC1zbGlkZXItY29sb3JcIjogXCIjY2ZjZmNmXCIsXG4gICAgICBcIiRmb3JlZ3JvdW5kLWxpZ2h0XCI6IFwiIzkwOTA5MFwiLFxuICAgICAgXCIkZm9yZWdyb3VuZC1kaXNhYmxlZFwiOiBcIiMxNjE2MTZcIixcbiAgICAgIFwiJGJhY2tncm91bmQtZGltXCI6IFwiI2YzZjNmM1wiLFxuXG4gICAgICBcIiRwcm9ncmVzcy1idXR0b25zLWNvbG9yXCI6IFwiI2Y3Yjc4MVwiLFxuICAgICAgXCIkcHJvZ3Jlc3MtYnV0dG9ucy1saW5lLWNvbG9yXCI6IFwiI2Q0ZDRkNFwiXG4gICAgfSxcbiAgICBkYXJrYmx1ZToge1xuICAgICAgXCIkaGVhZGVyLWJhY2tncm91bmQtY29sb3JcIjogXCIjZDlkOGRkXCIsXG4gICAgICBcIiRib2R5LWNvbnRhaW5lci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2Y2ZjdmMlwiLFxuXG4gICAgICBcIiRtYWluLWNvbG9yXCI6IFwiIzNjNGY2ZFwiLFxuICAgICAgXCIkbWFpbi1ob3Zlci1jb2xvclwiOiBcIiMyYzNmNWRcIixcbiAgICAgIFwiJGJvZHktYmFja2dyb3VuZC1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiRpbnB1dHMtYmFja2dyb3VuZC1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiR0ZXh0LWNvbG9yXCI6IFwiIzRhNGE0YVwiLFxuICAgICAgXCIkdGV4dC1pbnB1dC1jb2xvclwiOiBcIiM0YTRhNGFcIixcbiAgICAgIFwiJGhlYWRlci1jb2xvclwiOiBcIiM2ZDcwNzJcIixcbiAgICAgIFwiJGJvcmRlci1jb2xvclwiOiBcIiNlN2U3ZTdcIixcblxuICAgICAgXCIkZXJyb3ItY29sb3JcIjogXCIjZWQ1NTY1XCIsXG4gICAgICBcIiRlcnJvci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2ZkNjU3NVwiLFxuXG4gICAgICBcIiRwcm9ncmVzcy10ZXh0LWNvbG9yXCI6IFwiIzlkOWQ5ZFwiLFxuICAgICAgXCIkZGlzYWJsZS1jb2xvclwiOiBcIiNkYmRiZGJcIixcbiAgICAgIFwiJGRpc2FibGVkLWxhYmVsLWNvbG9yXCI6IFwicmdiYSg2NCwgNjQsIDY0LCAwLjUpXCIsXG4gICAgICBcIiRzbGlkZXItY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkZGlzYWJsZWQtc3dpdGNoLWNvbG9yXCI6IFwiIzlmOWY5ZlwiLFxuICAgICAgXCIkZGlzYWJsZWQtc2xpZGVyLWNvbG9yXCI6IFwiI2NmY2ZjZlwiLFxuICAgICAgXCIkZm9yZWdyb3VuZC1saWdodFwiOiBcIiM5MDkwOTBcIixcbiAgICAgIFwiJGZvcmVncm91bmQtZGlzYWJsZWRcIjogXCIjMTYxNjE2XCIsXG4gICAgICBcIiRiYWNrZ3JvdW5kLWRpbVwiOiBcIiNmM2YzZjNcIixcblxuICAgICAgXCIkcHJvZ3Jlc3MtYnV0dG9ucy1jb2xvclwiOiBcIiM4MzllYzlcIixcbiAgICAgIFwiJHByb2dyZXNzLWJ1dHRvbnMtbGluZS1jb2xvclwiOiBcIiNkNGQ0ZDRcIlxuICAgIH0sXG4gICAgZGFya3Jvc2U6IHtcbiAgICAgIFwiJGhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2RkZDJjZVwiLFxuICAgICAgXCIkYm9keS1jb250YWluZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmN2VmZWRcIixcblxuICAgICAgXCIkbWFpbi1jb2xvclwiOiBcIiM2ODY1NmVcIixcbiAgICAgIFwiJG1haW4taG92ZXItY29sb3JcIjogXCIjNTg1NTVlXCIsXG4gICAgICBcIiRib2R5LWJhY2tncm91bmQtY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkaW5wdXRzLWJhY2tncm91bmQtY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkdGV4dC1jb2xvclwiOiBcIiM0YTRhNGFcIixcbiAgICAgIFwiJHRleHQtaW5wdXQtY29sb3JcIjogXCIjNGE0YTRhXCIsXG4gICAgICBcIiRoZWFkZXItY29sb3JcIjogXCIjNmQ3MDcyXCIsXG4gICAgICBcIiRib3JkZXItY29sb3JcIjogXCIjZTdlN2U3XCIsXG5cbiAgICAgIFwiJGVycm9yLWNvbG9yXCI6IFwiI2VkNTU2NVwiLFxuICAgICAgXCIkZXJyb3ItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmZDY1NzVcIixcblxuICAgICAgXCIkcHJvZ3Jlc3MtdGV4dC1jb2xvclwiOiBcIiM5ZDlkOWRcIixcbiAgICAgIFwiJGRpc2FibGUtY29sb3JcIjogXCIjZGJkYmRiXCIsXG4gICAgICBcIiRkaXNhYmxlZC1sYWJlbC1jb2xvclwiOiBcInJnYmEoNjQsIDY0LCA2NCwgMC41KVwiLFxuICAgICAgXCIkc2xpZGVyLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJGRpc2FibGVkLXN3aXRjaC1jb2xvclwiOiBcIiM5ZjlmOWZcIixcbiAgICAgIFwiJGRpc2FibGVkLXNsaWRlci1jb2xvclwiOiBcIiNjZmNmY2ZcIixcbiAgICAgIFwiJGZvcmVncm91bmQtbGlnaHRcIjogXCIjOTA5MDkwXCIsXG4gICAgICBcIiRmb3JlZ3JvdW5kLWRpc2FibGVkXCI6IFwiIzE2MTYxNlwiLFxuICAgICAgXCIkYmFja2dyb3VuZC1kaW1cIjogXCIjZjNmM2YzXCIsXG5cbiAgICAgIFwiJHByb2dyZXNzLWJ1dHRvbnMtY29sb3JcIjogXCIjYzZiZWQ0XCIsXG4gICAgICBcIiRwcm9ncmVzcy1idXR0b25zLWxpbmUtY29sb3JcIjogXCIjZDRkNGQ0XCJcbiAgICB9LFxuICAgIHN0b25lOiB7XG4gICAgICBcIiRoZWFkZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNjZGNjZDJcIixcbiAgICAgIFwiJGJvZHktY29udGFpbmVyLWJhY2tncm91bmQtY29sb3JcIjogXCIjZWZlZGY0XCIsXG5cbiAgICAgIFwiJG1haW4tY29sb3JcIjogXCIjMGYwZjMzXCIsXG4gICAgICBcIiRtYWluLWhvdmVyLWNvbG9yXCI6IFwiIzE5MTk1NVwiLFxuICAgICAgXCIkYm9keS1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJGlucHV0cy1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJHRleHQtY29sb3JcIjogXCIjMGYwZjMzXCIsXG4gICAgICBcIiR0ZXh0LWlucHV0LWNvbG9yXCI6IFwiIzBmMGYzM1wiLFxuICAgICAgXCIkaGVhZGVyLWNvbG9yXCI6IFwiIzBmMGYzM1wiLFxuICAgICAgXCIkYm9yZGVyLWNvbG9yXCI6IFwiI2U3ZTdlN1wiLFxuXG4gICAgICBcIiRlcnJvci1jb2xvclwiOiBcIiNlZDU1NjVcIixcbiAgICAgIFwiJGVycm9yLWJhY2tncm91bmQtY29sb3JcIjogXCIjZmQ2NTc1XCIsXG5cbiAgICAgIFwiJHByb2dyZXNzLXRleHQtY29sb3JcIjogXCIjOWQ5ZDlkXCIsXG4gICAgICBcIiRkaXNhYmxlLWNvbG9yXCI6IFwiI2RiZGJkYlwiLFxuICAgICAgXCIkZGlzYWJsZWQtbGFiZWwtY29sb3JcIjogXCJyZ2JhKDY0LCA2NCwgNjQsIDAuNSlcIixcbiAgICAgIFwiJHNsaWRlci1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiRkaXNhYmxlZC1zd2l0Y2gtY29sb3JcIjogXCIjOWY5ZjlmXCIsXG4gICAgICBcIiRkaXNhYmxlZC1zbGlkZXItY29sb3JcIjogXCIjY2ZjZmNmXCIsXG4gICAgICBcIiRmb3JlZ3JvdW5kLWxpZ2h0XCI6IFwiIzkwOTA5MFwiLFxuICAgICAgXCIkZm9yZWdyb3VuZC1kaXNhYmxlZFwiOiBcIiMxNjE2MTZcIixcbiAgICAgIFwiJGJhY2tncm91bmQtZGltXCI6IFwiI2YzZjNmM1wiLFxuXG4gICAgICBcIiRwcm9ncmVzcy1idXR0b25zLWNvbG9yXCI6IFwiIzc0NzQ5MVwiLFxuICAgICAgXCIkcHJvZ3Jlc3MtYnV0dG9ucy1saW5lLWNvbG9yXCI6IFwiI2Q0ZDRkNFwiXG4gICAgfSxcbiAgICB3aW50ZXI6IHtcbiAgICAgIFwiJGhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiIzgyYjhkYVwiLFxuICAgICAgXCIkYm9keS1jb250YWluZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNkYWUxZTdcIixcblxuICAgICAgXCIkbWFpbi1jb2xvclwiOiBcIiMzYzNiNDBcIixcbiAgICAgIFwiJG1haW4taG92ZXItY29sb3JcIjogXCIjMWUxZDIwXCIsXG4gICAgICBcIiRib2R5LWJhY2tncm91bmQtY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkaW5wdXRzLWJhY2tncm91bmQtY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkdGV4dC1jb2xvclwiOiBcIiMwMDBcIixcbiAgICAgIFwiJHRleHQtaW5wdXQtY29sb3JcIjogXCIjMDAwXCIsXG4gICAgICBcIiRoZWFkZXItY29sb3JcIjogXCIjMDAwXCIsXG4gICAgICBcIiRib3JkZXItY29sb3JcIjogXCIjZTdlN2U3XCIsXG5cbiAgICAgIFwiJGVycm9yLWNvbG9yXCI6IFwiI2VkNTU2NVwiLFxuICAgICAgXCIkZXJyb3ItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmZDY1NzVcIixcblxuICAgICAgXCIkZGlzYWJsZS1jb2xvclwiOiBcIiNkYmRiZGJcIixcbiAgICAgIFwiJHByb2dyZXNzLXRleHQtY29sb3JcIjogXCIjOWQ5ZDlkXCIsXG4gICAgICBcIiRkaXNhYmxlZC1sYWJlbC1jb2xvclwiOiBcInJnYmEoNjQsIDY0LCA2NCwgMC41KVwiLFxuICAgICAgXCIkc2xpZGVyLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJGRpc2FibGVkLXN3aXRjaC1jb2xvclwiOiBcIiM5ZjlmOWZcIixcbiAgICAgIFwiJGRpc2FibGVkLXNsaWRlci1jb2xvclwiOiBcIiNjZmNmY2ZcIixcbiAgICAgIFwiJGZvcmVncm91bmQtbGlnaHRcIjogXCIjOTA5MDkwXCIsXG4gICAgICBcIiRmb3JlZ3JvdW5kLWRpc2FibGVkXCI6IFwiIzE2MTYxNlwiLFxuICAgICAgXCIkYmFja2dyb3VuZC1kaW1cIjogXCIjZjNmM2YzXCIsXG5cbiAgICAgIFwiJHByb2dyZXNzLWJ1dHRvbnMtY29sb3JcIjogXCIjZDFjOWY1XCIsXG4gICAgICBcIiRwcm9ncmVzcy1idXR0b25zLWxpbmUtY29sb3JcIjogXCIjZDRkNGQ0XCJcbiAgICB9LFxuICAgIHdpbnRlcnN0b25lOiB7XG4gICAgICBcIiRoZWFkZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiMzMjMyMzJcIixcbiAgICAgIFwiJGJvZHktY29udGFpbmVyLWJhY2tncm91bmQtY29sb3JcIjogXCIjZjhmOGY4XCIsXG5cbiAgICAgIFwiJG1haW4tY29sb3JcIjogXCIjNWFjOGZhXCIsXG4gICAgICBcIiRtYWluLWhvdmVyLWNvbG9yXCI6IFwiIzA2YTFlN1wiLFxuICAgICAgXCIkYm9keS1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJGlucHV0cy1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJHRleHQtY29sb3JcIjogXCIjMDAwXCIsXG4gICAgICBcIiR0ZXh0LWlucHV0LWNvbG9yXCI6IFwiIzAwMFwiLFxuICAgICAgXCIkaGVhZGVyLWNvbG9yXCI6IFwiI2ZmZlwiLFxuICAgICAgXCIkYm9yZGVyLWNvbG9yXCI6IFwiI2U3ZTdlN1wiLFxuXG4gICAgICBcIiRlcnJvci1jb2xvclwiOiBcIiNlZDU1NjVcIixcbiAgICAgIFwiJGVycm9yLWJhY2tncm91bmQtY29sb3JcIjogXCIjZmQ2NTc1XCIsXG5cbiAgICAgIFwiJGRpc2FibGUtY29sb3JcIjogXCIjZGJkYmRiXCIsXG4gICAgICBcIiRwcm9ncmVzcy10ZXh0LWNvbG9yXCI6IFwiIzlkOWQ5ZFwiLFxuICAgICAgXCIkZGlzYWJsZWQtbGFiZWwtY29sb3JcIjogXCJyZ2JhKDY0LCA2NCwgNjQsIDAuNSlcIixcbiAgICAgIFwiJHNsaWRlci1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiRkaXNhYmxlZC1zd2l0Y2gtY29sb3JcIjogXCIjOWY5ZjlmXCIsXG4gICAgICBcIiRkaXNhYmxlZC1zbGlkZXItY29sb3JcIjogXCIjY2ZjZmNmXCIsXG4gICAgICBcIiRmb3JlZ3JvdW5kLWxpZ2h0XCI6IFwiIzkwOTA5MFwiLFxuICAgICAgXCIkZm9yZWdyb3VuZC1kaXNhYmxlZFwiOiBcIiMxNjE2MTZcIixcbiAgICAgIFwiJGJhY2tncm91bmQtZGltXCI6IFwiI2YzZjNmM1wiLFxuXG4gICAgICBcIiRwcm9ncmVzcy1idXR0b25zLWNvbG9yXCI6IFwiI2FjZGNmMlwiLFxuICAgICAgXCIkcHJvZ3Jlc3MtYnV0dG9ucy1saW5lLWNvbG9yXCI6IFwiI2Q0ZDRkNFwiXG4gICAgfSxcbiAgICBtb2Rlcm46IHtcbiAgICAgIFwiJG1haW4tY29sb3JcIjogXCIjMWFiMzk0XCIsXG4gICAgICBcIiRhZGQtYnV0dG9uLWNvbG9yXCI6IFwiIzE5NDhiM1wiLFxuICAgICAgXCIkcmVtb3ZlLWJ1dHRvbi1jb2xvclwiOiBcIiNmZjE4MDBcIixcbiAgICAgIFwiJGRpc2FibGUtY29sb3JcIjogXCIjZGJkYmRiXCIsXG4gICAgICBcIiRwcm9ncmVzcy10ZXh0LWNvbG9yXCI6IFwiIzlkOWQ5ZFwiLFxuICAgICAgXCIkZGlzYWJsZWQtbGFiZWwtY29sb3JcIjogXCJyZ2JhKDY0LCA2NCwgNjQsIDAuNSlcIixcbiAgICAgIFwiJHNsaWRlci1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiRkaXNhYmxlZC1zd2l0Y2gtY29sb3JcIjogXCIjOWY5ZjlmXCIsXG4gICAgICBcIiRkaXNhYmxlZC1zbGlkZXItY29sb3JcIjogXCIjY2ZjZmNmXCIsXG4gICAgICBcIiRlcnJvci1jb2xvclwiOiBcIiNkNTI5MDFcIixcbiAgICAgIFwiJHRleHQtY29sb3JcIjogXCIjNDA0MDQwXCIsXG4gICAgICBcIiRsaWdodC10ZXh0LWNvbG9yXCI6IFwiI2ZmZlwiLFxuICAgICAgXCIkYnV0dG9uLXRleHQtY29sb3JcIjogXCIjZmZmXCIsXG4gICAgICBcIiRjaGVja21hcmstY29sb3JcIjogXCIjZmZmXCIsXG4gICAgICBcIiRtYXRyaXgtdGV4dC1jaGVja2VkLWNvbG9yXCI6IFwiI2ZmZlwiLFxuXG4gICAgICBcIiRwcm9ncmVzcy1idXR0b25zLWNvbG9yXCI6IFwiIzhkZDljYVwiLFxuICAgICAgXCIkcHJvZ3Jlc3MtYnV0dG9ucy1saW5lLWNvbG9yXCI6IFwiI2Q0ZDRkNFwiLFxuXG4gICAgICBcIiR0ZXh0LWlucHV0LWNvbG9yXCI6IFwiIzQwNDA0MFwiLFxuICAgICAgXCIkaW5wdXRzLWJhY2tncm91bmQtY29sb3JcIjogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgXCIkbWFpbi1ob3Zlci1jb2xvclwiOiBcIiM5ZjlmOWZcIixcbiAgICAgIFwiJGJvZHktY29udGFpbmVyLWJhY2tncm91bmQtY29sb3JcIjogXCIjZjRmNGY0XCIsXG4gICAgICBcIiR0ZXh0LWJvcmRlci1jb2xvclwiOiBcIiNkNGQ0ZDRcIixcbiAgICAgIFwiJGRpc2FibGVkLXRleHQtY29sb3JcIjogXCJyZ2JhKDY0LCA2NCwgNjQsIDAuNSlcIixcbiAgICAgIFwiJGJvcmRlci1jb2xvclwiOiBcInJnYig2NCwgNjQsIDY0LCAwLjUpXCIsXG4gICAgICBcIiRkcm9wZG93bi1ib3JkZXItY29sb3JcIjogXCIjZDRkNGQ0XCIsXG4gICAgICBcIiRoZWFkZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNlN2U3ZTdcIixcbiAgICAgIFwiJGFuc3dlci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwicmdiYSgyNiwgMTc5LCAxNDgsIDAuMilcIixcbiAgICAgIFwiJGVycm9yLWJhY2tncm91bmQtY29sb3JcIjogXCJyZ2JhKDIxMywgNDEsIDEsIDAuMilcIixcbiAgICAgIFwiJHJhZGlvLWNoZWNrZWQtY29sb3JcIjogXCIjNDA0MDQwXCIsXG4gICAgICBcIiRjbGVhbi1idXR0b24tY29sb3JcIjogXCIjMTk0OGIzXCIsXG4gICAgICBcIiRib2R5LWJhY2tncm91bmQtY29sb3JcIjogXCIjZmZmZmZmXCIsXG4gICAgICBcIiRmb3JlZ3JvdW5kLWxpZ2h0XCI6IFwiIzkwOTA5MFwiLFxuICAgICAgXCIkZm9yZWdyb3VuZC1kaXNhYmxlZFwiOiBcIiMxNjE2MTZcIixcbiAgICAgIFwiJGJhY2tncm91bmQtZGltXCI6IFwiI2YzZjNmM1wiLFxuICAgIH0sXG4gICAgYm9vdHN0cmFwOiB7XG4gICAgICBcIiRtYWluLWNvbG9yXCI6IFwiIzE4YTY4OVwiLFxuICAgICAgXCIkdGV4dC1jb2xvclwiOiBcIiM0MDQwNDA7XCIsXG4gICAgICBcIiR0ZXh0LWlucHV0LWNvbG9yXCI6IFwiIzQwNDA0MDtcIixcbiAgICAgIFwiJHByb2dyZXNzLXRleHQtY29sb3JcIjogXCIjOWQ5ZDlkXCIsXG4gICAgICBcIiRkaXNhYmxlLWNvbG9yXCI6IFwiI2RiZGJkYlwiLFxuICAgICAgXCIkaGVhZGVyLWJhY2tncm91bmQtY29sb3JcIjogXCIjZTdlN2U3XCIsXG4gICAgICBcIiRkaXNhYmxlZC1sYWJlbC1jb2xvclwiOiBcInJnYmEoNjQsIDY0LCA2NCwgMC41KVwiLFxuICAgICAgXCIkc2xpZGVyLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJGRpc2FibGVkLXN3aXRjaC1jb2xvclwiOiBcIiM5ZjlmOWZcIixcbiAgICAgIFwiJGRpc2FibGVkLXNsaWRlci1jb2xvclwiOiBcIiNjZmNmY2ZcIixcbiAgICAgIFwiJGZvcmVncm91bmQtbGlnaHRcIjogXCIjOTA5MDkwXCIsXG4gICAgICBcIiRmb3JlZ3JvdW5kLWRpc2FibGVkXCI6IFwiIzE2MTYxNlwiLFxuICAgICAgXCIkYmFja2dyb3VuZC1kaW1cIjogXCIjZjNmM2YzXCIsXG5cbiAgICAgIFwiJHByb2dyZXNzLWJ1dHRvbnMtY29sb3JcIjogXCIjOGRkNmM3XCIsXG4gICAgICBcIiRwcm9ncmVzcy1idXR0b25zLWxpbmUtY29sb3JcIjogXCIjZDRkNGQ0XCIsXG4gICAgfSxcbiAgICBib290c3RyYXBtYXRlcmlhbDoge1xuICAgICAgXCIkbWFpbi1jb2xvclwiOiBcIiMxOGE2ODlcIixcbiAgICAgIFwiJHRleHQtY29sb3JcIjogXCIjNDA0MDQwO1wiLFxuICAgICAgXCIkdGV4dC1pbnB1dC1jb2xvclwiOiBcIiM0MDQwNDA7XCIsXG4gICAgICBcIiRwcm9ncmVzcy10ZXh0LWNvbG9yXCI6IFwiIzlkOWQ5ZFwiLFxuICAgICAgXCIkZGlzYWJsZS1jb2xvclwiOiBcIiNkYmRiZGJcIixcbiAgICAgIFwiJGhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2U3ZTdlN1wiLFxuXG4gICAgICBcIiRkaXNhYmxlZC1sYWJlbC1jb2xvclwiOiBcInJnYmEoNjQsIDY0LCA2NCwgMC41KVwiLFxuICAgICAgXCIkc2xpZGVyLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJGRpc2FibGVkLXN3aXRjaC1jb2xvclwiOiBcIiM5ZjlmOWZcIixcbiAgICAgIFwiJGRpc2FibGVkLXNsaWRlci1jb2xvclwiOiBcIiNjZmNmY2ZcIixcbiAgICAgIFwiJGJvZHktYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmZmZmZmZcIixcbiAgICAgIFwiJGZvcmVncm91bmQtbGlnaHRcIjogXCIjOTA5MDkwXCIsXG4gICAgICBcIiRmb3JlZ3JvdW5kLWRpc2FibGVkXCI6IFwiIzE2MTYxNlwiLFxuICAgICAgXCIkYmFja2dyb3VuZC1kaW1cIjogXCIjZjNmM2YzXCIsXG5cbiAgICAgIFwiJHByb2dyZXNzLWJ1dHRvbnMtY29sb3JcIjogXCIjOGRkNmM3XCIsXG4gICAgICBcIiRwcm9ncmVzcy1idXR0b25zLWxpbmUtY29sb3JcIjogXCIjZDRkNGQ0XCIsXG4gICAgfSxcbiAgfTtcblxuICBwdWJsaWMgc3RhdGljIFRoZW1lQ3NzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgIFwiLnN2X2RlZmF1bHRfY3NzXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJGJvZHktY29udGFpbmVyLWJhY2tncm91bmQtY29sb3I7XCIsXG5cbiAgICBcIi5zdl9kZWZhdWx0X2NzcyBoclwiOiBcImJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjtcIixcblxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIGlucHV0W3R5cGU9J2J1dHRvbiddLCAuc3ZfZGVmYXVsdF9jc3MgYnV0dG9uXCI6XG4gICAgICBcImNvbG9yOiAkYm9keS1iYWNrZ3JvdW5kLWNvbG9yOyBiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyBpbnB1dFt0eXBlPSdidXR0b24nXTpob3ZlciwgLnN2X2RlZmF1bHRfY3NzIGJ1dHRvbjpob3ZlclwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1ob3Zlci1jb2xvcjtcIixcblxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9oZWFkZXJcIjogXCJjb2xvcjogJGhlYWRlci1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfY3VzdG9tX2hlYWRlclwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkaGVhZGVyLWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X2NvbnRhaW5lclwiOiBcImNvbG9yOiAkdGV4dC1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfYm9keVwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkYm9keS1iYWNrZ3JvdW5kLWNvbG9yOyBib3JkZXItY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9wcm9ncmVzc1wiOiBcImJhY2tncm91bmQtY29sb3I6ICRib3JkZXItY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3Byb2dyZXNzX2JhclwiOiBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QgbGk6YmVmb3JlXCI6XG4gICAgICBcImJvcmRlci1jb2xvcjogJHByb2dyZXNzLWJ1dHRvbnMtY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRwcm9ncmVzcy1idXR0b25zLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9wcm9ncmVzcy1idXR0b25zX19saXN0IGxpOmFmdGVyXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJHByb2dyZXNzLWJ1dHRvbnMtbGluZS1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdCAuc3ZfcHJvZ3Jlc3MtYnV0dG9uc19fcGFnZS10aXRsZVwiOiBcIiBjb2xvcjogJHRleHQtY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QgLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX3BhZ2UtZGVzY3JpcHRpb25cIjogXCIgY29sb3I6ICR0ZXh0LWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9wcm9ncmVzcy1idXR0b25zX19saXN0IGxpLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QtZWxlbWVudC0tcGFzc2VkOmJlZm9yZVwiOlxuICAgICAgXCJib3JkZXItY29sb3I6ICRtYWluLWNvbG9yOyBiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdCBsaS5zdl9wcm9ncmVzcy1idXR0b25zX19saXN0LWVsZW1lbnQtLXBhc3NlZCArIGxpOmFmdGVyXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRwcm9ncmVzcy1idXR0b25zLWNvbG9yXCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QgbGkuc3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdC1lbGVtZW50LS1jdXJyZW50OmJlZm9yZVwiOlxuICAgICAgXCJib3JkZXItY29sb3I6ICRtYWluLWNvbG9yOyBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdCBsaS5zdl9wcm9ncmVzcy1idXR0b25zX19saXN0LWVsZW1lbnQtLXBhc3NlZC5zdl9wcm9ncmVzcy1idXR0b25zX19saXN0LWVsZW1lbnQtLWN1cnJlbnQ6YmVmb3JlXCI6XG4gICAgICBcImJvcmRlci1jb2xvcjogJG1haW4tY29sb3I7IGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1wiLFxuXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3Bfcm9vdCA+IC5zdl9yb3dcIjogXCJib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3Bfcm9vdCA+IC5zdl9yb3c6bnRoLWNoaWxkKG9kZClcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJGJvZHktYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcF9yb290ID4gLnN2X3JvdzpudGgtY2hpbGQoZXZlbilcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJGJvZHktY29udGFpbmVyLWJhY2tncm91bmQtY29sb3I7XCIsXG5cbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcV9vdGhlciBpbnB1dFwiOlxuICAgICAgXCJjb2xvcjogJHRleHQtY29sb3I7IC13ZWJraXQtdGV4dC1maWxsLWNvbG9yOiAkdGV4dC1jb2xvcjsgYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yOyBiYWNrZ3JvdW5kLWNvbG9yOiAkaW5wdXRzLWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3FfdGV4dF9yb290XCI6XG4gICAgICBcImNvbG9yOiAkdGV4dC1jb2xvcjsgLXdlYmtpdC10ZXh0LWZpbGwtY29sb3I6ICR0ZXh0LWNvbG9yOyBib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRpbnB1dHMtYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcV9kcm9wZG93bl9jb250cm9sXCI6XG4gICAgICBcImNvbG9yOiAkdGV4dC1pbnB1dC1jb2xvcjsgYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yOyBiYWNrZ3JvdW5kLWNvbG9yOiAkaW5wdXRzLWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgaW5wdXRbdHlwZT0ndGV4dCddXCI6XG4gICAgICBcImNvbG9yOiAkdGV4dC1jb2xvcjsgLXdlYmtpdC10ZXh0LWZpbGwtY29sb3I6ICR0ZXh0LWNvbG9yOyBib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRpbnB1dHMtYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyBzZWxlY3RcIjpcbiAgICAgIFwiY29sb3I6ICR0ZXh0LWNvbG9yOyBib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRpbnB1dHMtYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyB0ZXh0YXJlYVwiOlxuICAgICAgXCJjb2xvcjogJHRleHQtaW5wdXQtY29sb3I7IC13ZWJraXQtdGV4dC1maWxsLWNvbG9yOiAkdGV4dC1pbnB1dC1jb2xvcjsgYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yOyBiYWNrZ3JvdW5kLWNvbG9yOiAkaW5wdXRzLWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgaW5wdXQ6bm90KFt0eXBlPSdidXR0b24nXSk6bm90KFt0eXBlPSdyZXNldCddKTpub3QoW3R5cGU9J3N1Ym1pdCddKTpub3QoW3R5cGU9J2ltYWdlJ10pOm5vdChbdHlwZT0nY2hlY2tib3gnXSk6bm90KFt0eXBlPSdyYWRpbyddKVwiOlxuICAgICAgXCJib3JkZXI6IDFweCBzb2xpZCAkYm9yZGVyLWNvbG9yOyBiYWNrZ3JvdW5kLWNvbG9yOiAkaW5wdXRzLWJhY2tncm91bmQtY29sb3I7Y29sb3I6ICR0ZXh0LWlucHV0LWNvbG9yOyAtd2Via2l0LXRleHQtZmlsbC1jb2xvcjogJHRleHQtaW5wdXQtY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgaW5wdXQ6bm90KFt0eXBlPSdidXR0b24nXSk6bm90KFt0eXBlPSdyZXNldCddKTpub3QoW3R5cGU9J3N1Ym1pdCddKTpub3QoW3R5cGU9J2ltYWdlJ10pOm5vdChbdHlwZT0nY2hlY2tib3gnXSk6bm90KFt0eXBlPSdyYWRpbyddKTpmb2N1c1wiOlxuICAgICAgXCJib3JkZXI6IDFweCBzb2xpZCAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfY29udGFpbmVyIC5zdl9ib2R5IC5zdl9wX3Jvb3QgLnN2X3EgLnN2X3NlbGVjdF93cmFwcGVyIC5zdl9xX2Ryb3Bkb3duX2NvbnRyb2wgXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRpbnB1dHMtYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcV9vdGhlciBpbnB1dDpmb2N1c1wiOiBcImJvcmRlci1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3FfdGV4dF9yb290OmZvY3VzXCI6IFwiYm9yZGVyLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcV9kcm9wZG93bl9jb250cm9sOmZvY3VzXCI6XG4gICAgICBcImJvcmRlci1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgaW5wdXRbdHlwZT0ndGV4dCddOmZvY3VzXCI6IFwiYm9yZGVyLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICAnLnN2X2RlZmF1bHRfY3NzIC5zdl9jb250YWluZXIgLnN2X2JvZHkgLnN2X3Bfcm9vdCAuc3ZfcSBpbnB1dFt0eXBlPVwicmFkaW9cIl06Zm9jdXMsIC5zdl9kZWZhdWx0X2NzcyAuc3ZfY29udGFpbmVyIC5zdl9ib2R5IC5zdl9wX3Jvb3QgLnN2X3EgaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdOmZvY3VzJzpcbiAgICAgIFwib3V0bGluZTogMXB4IGRvdHRlZCAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyBzZWxlY3Q6Zm9jdXNcIjogXCJib3JkZXItY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIHRleHRhcmVhOmZvY3VzXCI6IFwiYm9yZGVyLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcblxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9zZWxlY3Rfd3JhcHBlclwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkYm9keS1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9zZWxlY3Rfd3JhcHBlcjo6YmVmb3JlXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3FfcmF0aW5nX2l0ZW0uYWN0aXZlIC5zdl9xX3JhdGluZ19pdGVtX3RleHRcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4taG92ZXItY29sb3I7IGJvcmRlci1jb2xvcjogJG1haW4taG92ZXItY29sb3I7IGNvbG9yOiAkYm9keS1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9xX3JhdGluZ19pdGVtIC5zdl9xX3JhdGluZ19pdGVtX3RleHRcIjpcbiAgICAgIFwiYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9xX3JhdGluZ19pdGVtIC5zdl9xX3JhdGluZ19pdGVtX3RleHQ6aG92ZXJcIjpcbiAgICAgIFwiYm9yZGVyLWNvbG9yOiAkbWFpbi1ob3Zlci1jb2xvcjtcIixcblxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIHRhYmxlLnN2X3FfbWF0cml4IHRyXCI6IFwiYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIHRhYmxlLnN2X3FfbWF0cml4X2Ryb3Bkb3duIHRyXCI6XG4gICAgICBcImJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyB0YWJsZS5zdl9xX21hdHJpeF9keW5hbWljIHRyXCI6XG4gICAgICBcImJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjtcIixcblxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9xX21fY2VsbF9zZWxlY3RlZFwiOlxuICAgICAgXCJjb2xvcjogJGJvZHktYmFja2dyb3VuZC1jb2xvcjsgYmFja2dyb3VuZC1jb2xvcjogJG1haW4taG92ZXItY29sb3I7XCIsXG5cbiAgICBcIi5zdl9tYWluIC5zdl9xX2ZpbGVfcmVtb3ZlOmhvdmVyXCI6IFwiY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2X3FfZmlsZV9jaG9vc2VfYnV0dG9uXCI6XG4gICAgICBcImNvbG9yOiAkYm9keS1iYWNrZ3JvdW5kLWNvbG9yOyBiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdl9xX2ZpbGVfY2hvb3NlX2J1dHRvbjpob3ZlclwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1ob3Zlci1jb2xvcjtcIixcblxuICAgIFwiLnN2X21haW4gLnN2X3FfaW1nc2VsLmNoZWNrZWQgbGFiZWw+ZGl2XCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3JcIixcblxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9wX2Rlc2NyaXB0aW9uXCI6IFwicGFkZGluZy1sZWZ0OiAxLjI5ZW07XCIsXG4gICAgLy9wcm9ncmVzcyBiYXJcbiAgICBcIi5zdl9tYWluIC5zdi1wcm9ncmVzc1wiOiBcImJhY2tncm91bmQtY29sb3I6ICRoZWFkZXItYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1wcm9ncmVzc19fYmFyXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7XCIsXG5cbiAgICAvL3BhbmVsZHluYW1pY1xuICAgIFwiLnN2X21haW4gLnN2LXBhbmVsZHluYW1pY19fcHJldi1idG4uc3YtcGFuZWxkeW5hbWljX19wcmV2LWJ0bi0tZGlzYWJsZWQsIC5zdl9tYWluIC5zdi1wYW5lbGR5bmFtaWNfX25leHQtYnRuLnN2LXBhbmVsZHluYW1pY19fbmV4dC1idG4tLWRpc2FibGVkXCI6XG4gICAgICBcImZpbGw6ICRkaXNhYmxlLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LXBhbmVsZHluYW1pY19fcHJvZ3Jlc3MtdGV4dFwiOiBcImNvbG9yOiAkcHJvZ3Jlc3MtdGV4dC1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1wYW5lbGR5bmFtaWNfX3ByZXYtYnRuLCAuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19uZXh0LWJ0blwiOlxuICAgICAgXCJmaWxsOiAkdGV4dC1jb2xvclwiLFxuXG4gICAgLy9ib29sZWFuXG4gICAgXCIuc3ZfbWFpbiAuc3YtYm9vbGVhbl9fc3dpdGNoXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYm9vbGVhbl9fc2xpZGVyXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJHNsaWRlci1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1ib29sZWFuX19sYWJlbC0tZGlzYWJsZWRcIjogXCJjb2xvcjogJGRpc2FibGVkLWxhYmVsLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LWJvb2xlYW4tLWRpc2FibGVkIC5zdi1ib29sZWFuX19zd2l0Y2hcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJGRpc2FibGVkLXN3aXRjaC1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1ib29sZWFuLS1kaXNhYmxlZCAuc3YtYm9vbGVhbl9fc2xpZGVyXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRkaXNhYmxlZC1zbGlkZXItY29sb3I7XCIsXG4gICAgLy9lbyBib29sZWFuXG5cbiAgICAvL3NpZ25hdHVyZSBwYWRcbiAgICBcIi5zdl9tYWluIC5zanNfc3BfY29udGFpbmVyXCI6IFwiYm9yZGVyOiAxcHggZGFzaGVkICRkaXNhYmxlLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnNqc19zcF9wbGFjZWhvbGRlclwiOiBcImNvbG9yOiAkZm9yZWdyb3VuZC1saWdodDtcIixcblxuICAgIFwiLnN2X21haW4gLnN2X21hdHJpeF9kZXRhaWxfcm93XCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICNlZGVkZWQ7IGJvcmRlci10b3A6IDFweCBzb2xpZCAkaGVhZGVyLWJhY2tncm91bmQtY29sb3I7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAkaGVhZGVyLWJhY2tncm91bmQtY29sb3I7XCIsXG5cbiAgICAvL2FjdGlvbi1iYXJcbiAgICBcIi5zdl9tYWluIC5zdi1hY3Rpb24tYmFyLWl0ZW1cIjogXCJjb2xvcjogJHRleHQtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYWN0aW9uLWJhci1pdGVtX19pY29uIHVzZVwiOiBcImZpbGw6ICRmb3JlZ3JvdW5kLWxpZ2h0O1wiLFxuICAgIFwiLnN2X21haW4gLnN2LWFjdGlvbi1iYXItaXRlbTpob3ZlclwiOiBcImJhY2tncm91bmQtY29sb3I6ICRiYWNrZ3JvdW5kLWRpbTtcIixcbiAgICAvL2VvIGFjdGlvbi1iYXJcblxuICAgIC8vYnV0dG9uLWdyb3VwXG4gICAgXCIuc3ZfbWFpbiAuc3YtYnV0dG9uLWdyb3VwX19pdGVtLS1ob3Zlcjpob3ZlclwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkYmFja2dyb3VuZC1kaW07XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYnV0dG9uLWdyb3VwX19pdGVtLWljb24gdXNlXCI6IFwiZmlsbDogJGZvcmVncm91bmQtbGlnaHQ7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYnV0dG9uLWdyb3VwX19pdGVtLS1zZWxlY3RlZFwiOiBcImNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1idXR0b24tZ3JvdXBfX2l0ZW0tLXNlbGVjdGVkIC5zdi1idXR0b24tZ3JvdXBfX2l0ZW0taWNvbiB1c2VcIjpcbiAgICAgIFwiZmlsbDogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYnV0dG9uLWdyb3VwX19pdGVtLS1kaXNhYmxlZFwiOiBcImNvbG9yOiAkZm9yZWdyb3VuZC1kaXNhYmxlZDtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1idXR0b24tZ3JvdXBfX2l0ZW0tLWRpc2FibGVkIC5zdi1idXR0b24tZ3JvdXBfX2l0ZW0taWNvbiB1c2VcIjpcbiAgICAgIFwiZmlsbDogJGZvcmVncm91bmQtZGlzYWJsZWQ7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYnV0dG9uLWdyb3VwX19pdGVtXCI6XG4gICAgICBcImJhY2tncm91bmQ6ICRib2R5LWJhY2tncm91bmQtY29sb3I7IGJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjtcIixcblxuICAgIC8vZW8gYnV0dG9uLWdyb3VwXG5cbiAgICBcIi5zdl9tYWluIC5zdl9xc3RuIHRleHRhcmVhXCI6IFwibWF4LXdpZHRoOiAxMDAlXCIsXG5cbiAgICAvL2RyYWctZHJvcFxuICAgIFwiLnN2X21haW4gLnN2LW1hdHJpeGR5bmFtaWNfX2RyYWctaWNvblwiOiBcInBhZGRpbmctdG9wOjE0cHhcIixcbiAgICBcIi5zdl9tYWluIC5zdi1tYXRyaXhkeW5hbWljX19kcmFnLWljb246YWZ0ZXJcIjpcbiAgICAgIFwiY29udGVudDogJyAnOyBkaXNwbGF5OiBibG9jazsgaGVpZ2h0OiA2cHg7IHdpZHRoOiAyMHB4OyBib3JkZXI6IDFweCBzb2xpZCAkYm9yZGVyLWNvbG9yOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyBib3JkZXItcmFkaXVzOiAxMHB4OyBjdXJzb3I6IG1vdmU7IG1hcmdpbi10b3A6IDEycHg7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtbWF0cml4X19kcmFnLWRyb3AtZ2hvc3QtcG9zaXRpb24tdG9wLCAuc3ZfbWFpbiAuc3YtbWF0cml4X19kcmFnLWRyb3AtZ2hvc3QtcG9zaXRpb24tYm90dG9tXCI6XG4gICAgICBcInBvc2l0aW9uOiByZWxhdGl2ZTtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1tYXRyaXhfX2RyYWctZHJvcC1naG9zdC1wb3NpdGlvbi10b3A6OmFmdGVyLCAuc3ZfbWFpbiAuc3YtbWF0cml4X19kcmFnLWRyb3AtZ2hvc3QtcG9zaXRpb24tYm90dG9tOjphZnRlclwiOlxuICAgICAgXCJjb250ZW50OiAnJzsgd2lkdGg6IDEwMCU7IGhlaWdodDogNHB4OyBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wcmltYXJ5LCAjMTliMzk0KTsgcG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAwO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LW1hdHJpeF9fZHJhZy1kcm9wLWdob3N0LXBvc2l0aW9uLXRvcDo6YWZ0ZXJcIjogXCJ0b3A6IDA7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtbWF0cml4X19kcmFnLWRyb3AtZ2hvc3QtcG9zaXRpb24tYm90dG9tOjphZnRlclwiOiBcImJvdHRvbTogMDtcIixcbiAgICAvL2VvIGRyYWctZHJvcFxuICAgIFwiLnN2LXNrZWxldG9uLWVsZW1lbnRcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkYmFja2dyb3VuZC1kaW07XCIsXG4gIH07XG5cbiAgcHVibGljIHN0YXRpYyBtb2Rlcm5UaGVtZUNzczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAvLyBcIi5zdi1wYW5lbGR5bmFtaWNfX2FkZC1idG5cIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkYWRkLWJ1dHRvbi1jb2xvcjtcIixcbiAgICAvLyBcIi5zdi1wYW5lbGR5bmFtaWNfX3JlbW92ZS1idG5cIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkcmVtb3ZlLWJ1dHRvbi1jb2xvcjtcIixcbiAgICBcIi5zdi1ib29sZWFuX19zd2l0Y2hcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdi1ib29sZWFuX19zbGlkZXJcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkc2xpZGVyLWNvbG9yO1wiLFxuICAgIFwiLnN2LWJvb2xlYW5fX2xhYmVsLS1kaXNhYmxlZFwiOiBcImNvbG9yOiAkZGlzYWJsZWQtbGFiZWwtY29sb3I7XCIsXG4gICAgXCIuc3YtYm9vbGVhbi0tZGlzYWJsZWQgLnN2LWJvb2xlYW5fX3N3aXRjaFwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkZGlzYWJsZWQtc3dpdGNoLWNvbG9yO1wiLFxuICAgIFwiLnN2LWJvb2xlYW4tLWRpc2FibGVkIC5zdi1ib29sZWFuX19zbGlkZXJcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJGRpc2FibGVkLXNsaWRlci1jb2xvcjtcIixcblxuICAgIFwiLnN2LWJ0blwiOiBcImNvbG9yOiAkYnV0dG9uLXRleHQtY29sb3I7XCIsXG4gICAgXCIuc3YtY2hlY2tib3hfX3N2Z1wiOiBcImJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjsgZmlsbDogdHJhbnNwYXJlbnQ7XCIsXG4gICAgXCIuc3YtY2hlY2tib3gtLWFsbG93aG92ZXI6aG92ZXIgLnN2LWNoZWNrYm94X19zdmdcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4taG92ZXItY29sb3I7IGZpbGw6ICRjaGVja21hcmstY29sb3I7XCIsXG4gICAgXCIuc3YtY2hlY2tib3gtLWNoZWNrZWQgLnN2LWNoZWNrYm94X19zdmdcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7IGZpbGw6ICRjaGVja21hcmstY29sb3I7XCIsXG4gICAgXCIuc3YtY2hlY2tib3gtLWNoZWNrZWQuc3YtY2hlY2tib3gtLWRpc2FibGVkIC5zdi1jaGVja2JveF9fc3ZnXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRkaXNhYmxlLWNvbG9yOyBmaWxsOiAkY2hlY2ttYXJrLWNvbG9yO1wiLFxuICAgIFwiLnN2LWNoZWNrYm94LS1kaXNhYmxlZCAuc3YtY2hlY2tib3hfX3N2Z1wiOiBcImJvcmRlci1jb2xvcjogJGRpc2FibGUtY29sb3I7XCIsXG4gICAgXCIuc3YtY29tbWVudFwiOiBcImJvcmRlci1jb2xvcjogJHRleHQtYm9yZGVyLWNvbG9yOyBtYXgtd2lkdGg6IDEwMCU7XCIsXG4gICAgXCIuc3YtY29tbWVudDpmb2N1c1wiOiBcImJvcmRlci1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3YtY29tcGxldGVkcGFnZVwiOlxuICAgICAgXCJjb2xvcjogJHRleHQtY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRib2R5LWNvbnRhaW5lci1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2LWNvbnRhaW5lci1tb2Rlcm5cIjogXCJjb2xvcjogJHRleHQtY29sb3I7XCIsXG4gICAgXCIuc3YtY29udGFpbmVyLW1vZGVybl9fdGl0bGVcIjogXCJjb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3YtZGVzY3JpcHRpb25cIjogXCJjb2xvcjogJGRpc2FibGVkLXRleHQtY29sb3I7XCIsXG4gICAgXCIuc3YtZHJvcGRvd25cIjogXCJib3JkZXItYm90dG9tOiAwLjA2ZW0gc29saWQgJHRleHQtYm9yZGVyLWNvbG9yO1wiLFxuICAgIFwiLnN2LWRyb3Bkb3duOmZvY3VzXCI6IFwiYm9yZGVyLWNvbG9yOiAkZHJvcGRvd24tYm9yZGVyLWNvbG9yO1wiLFxuICAgIFwiLnN2LWRyb3Bkb3duLS1lcnJvclwiOiBcImJvcmRlci1jb2xvcjogJGVycm9yLWNvbG9yOyBjb2xvcjogJGVycm9yLWNvbG9yO1wiLFxuICAgIFwiLnN2LWRyb3Bkb3duLS1lcnJvcjo6cGxhY2Vob2xkZXJcIjogXCJjb2xvcjogJGVycm9yLWNvbG9yO1wiLFxuICAgIFwiLnN2LWRyb3Bkb3duLS1lcnJvcjo6LW1zLWlucHV0LXBsYWNlaG9sZGVyXCI6IFwiY29sb3I6ICRlcnJvci1jb2xvcjtcIixcbiAgICBcIi5zdi1maWxlX19kZWNvcmF0b3JcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJGJvZHktY29udGFpbmVyLWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3YtZmlsZV9fY2xlYW4tYnRuXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJHJlbW92ZS1idXR0b24tY29sb3I7XCIsXG4gICAgXCIuc3YtZmlsZV9fY2hvb3NlLWJ0bjpub3QoLnN2LWZpbGVfX2Nob29zZS1idG4tLWRpc2FibGVkKVwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkYWRkLWJ1dHRvbi1jb2xvcjtcIixcbiAgICBcIi5zdi1maWxlX19jaG9vc2UtYnRuLS1kaXNhYmxlZFwiOiBcImJhY2tncm91bmQtY29sb3I6ICRkaXNhYmxlLWNvbG9yO1wiLFxuICAgIFwiLnN2LWZpbGVfX3JlbW92ZS1zdmdcIjogXCJmaWxsOiAjZmYxODAwO1wiLFxuICAgIFwiLnN2LWZpbGVfX3NpZ24gYVwiOiBcImNvbG9yOiAkdGV4dC1jb2xvcjtcIixcbiAgICBcIi5zdi1mb290ZXJfX2NvbXBsZXRlLWJ0blwiOiBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2LWZvb3Rlcl9fbmV4dC1idG5cIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdi1mb290ZXJfX3ByZXYtYnRuXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3YtZm9vdGVyX19zdGFydC1idG5cIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdi1mb290ZXJfX3ByZXZpZXctYnRuXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3YtZm9vdGVyX19lZGl0LWJ0blwiOiBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2LWltYWdlcGlja2VyX19pdGVtLS1hbGxvd2hvdmVyOmhvdmVyIC5zdi1pbWFnZXBpY2tlcl9faW1hZ2VcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4taG92ZXItY29sb3I7IGJvcmRlci1jb2xvcjogJG1haW4taG92ZXItY29sb3I7XCIsXG4gICAgXCIuc3YtaW1hZ2VwaWNrZXJfX2l0ZW0tLWNoZWNrZWQgLnN2LWltYWdlcGlja2VyX19pbWFnZVwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjsgYm9yZGVyLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdi1pbWFnZXBpY2tlcl9faXRlbS0tZGlzYWJsZWQuc3YtaW1hZ2VwaWNrZXJfX2l0ZW0tLWNoZWNrZWQgLnN2LWltYWdlcGlja2VyX19pbWFnZVwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkZGlzYWJsZS1jb2xvcjsgYm9yZGVyLWNvbG9yOiAkZGlzYWJsZS1jb2xvcjtcIixcbiAgICBcIi5zdi1pdGVtX19jb250cm9sOmZvY3VzICsgLnN2LWl0ZW1fX2RlY29yYXRvclwiOlxuICAgICAgXCJib3JkZXItY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2LW1hdHJpeF9fdGV4dC0tY2hlY2tlZFwiOlxuICAgICAgXCJjb2xvcjogJG1hdHJpeC10ZXh0LWNoZWNrZWQtY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2LW1hdHJpeF9fdGV4dC0tZGlzYWJsZWQuc3YtbWF0cml4X190ZXh0LS1jaGVja2VkXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRkaXNhYmxlLWNvbG9yO1wiLFxuICAgIFwiLnN2LW1hdHJpeGR5bmFtaWNfX2FkZC1idG5cIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkYWRkLWJ1dHRvbi1jb2xvcjtcIixcbiAgICBcIi5zdi1tYXRyaXhkeW5hbWljX19yZW1vdmUtYnRuXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJHJlbW92ZS1idXR0b24tY29sb3I7XCIsXG4gICAgXCIuc3YtcGFuZWxkeW5hbWljX19hZGQtYnRuXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJGFkZC1idXR0b24tY29sb3I7XCIsXG4gICAgXCIuc3YtcGFuZWxkeW5hbWljX19yZW1vdmUtYnRuXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJHJlbW92ZS1idXR0b24tY29sb3I7XCIsXG4gICAgXCIuc3YtcGFuZWxkeW5hbWljX19wcmV2LWJ0biwgLnN2LXBhbmVsZHluYW1pY19fbmV4dC1idG5cIjpcbiAgICAgIFwiZmlsbDogJHRleHQtY29sb3I7XCIsXG4gICAgXCIuc3YtcGFuZWxkeW5hbWljX19wcmV2LWJ0bi0tZGlzYWJsZWQsIC5zdi1wYW5lbGR5bmFtaWNfX25leHQtYnRuLS1kaXNhYmxlZFwiOlxuICAgICAgXCJmaWxsOiAkZGlzYWJsZS1jb2xvcjtcIixcbiAgICBcIi5zdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzLXRleHRcIjogXCJjb2xvcjogJHByb2dyZXNzLXRleHQtY29sb3I7XCIsXG4gICAgXCIuc3YtcHJvZ3Jlc3NcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkaGVhZGVyLWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3YtcHJvZ3Jlc3NfX2JhclwiOiBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2LXByb2dyZXNzX190ZXh0XCI6IFwiY29sb3I6ICRwcm9ncmVzcy10ZXh0LWNvbG9yO1wiLFxuICAgIFwiLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QgbGk6YmVmb3JlXCI6XG4gICAgICBcImJvcmRlci1jb2xvcjogJHByb2dyZXNzLWJ1dHRvbnMtY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRwcm9ncmVzcy1idXR0b25zLWNvbG9yO1wiLFxuICAgIFwiLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QgbGk6YWZ0ZXJcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkcHJvZ3Jlc3MtYnV0dG9ucy1saW5lLWNvbG9yO1wiLFxuICAgIFwiLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QgLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX3BhZ2UtdGl0bGVcIjogXCIgY29sb3I6ICR0ZXh0LWNvbG9yO1wiLFxuICAgIFwiLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QgLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX3BhZ2UtZGVzY3JpcHRpb25cIjogXCIgY29sb3I6ICR0ZXh0LWNvbG9yO1wiLFxuICAgIFwiLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QgbGkuc3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdC1lbGVtZW50LS1wYXNzZWQ6YmVmb3JlXCI6XG4gICAgICBcImJvcmRlci1jb2xvcjogJG1haW4tY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QgbGkuc3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdC1lbGVtZW50LS1wYXNzZWQgKyBsaTphZnRlclwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkcHJvZ3Jlc3MtYnV0dG9ucy1jb2xvclwiLFxuICAgIFwiLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QgbGkuc3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdC1lbGVtZW50LS1jdXJyZW50OmJlZm9yZVwiOlxuICAgICAgXCJib3JkZXItY29sb3I6ICRtYWluLWNvbG9yOyBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcIixcbiAgICBcIi5zdl9wcm9ncmVzcy1idXR0b25zX19saXN0IGxpLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QtZWxlbWVudC0tcGFzc2VkLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QtZWxlbWVudC0tY3VycmVudDpiZWZvcmVcIjpcbiAgICAgIFwiYm9yZGVyLWNvbG9yOiAkbWFpbi1jb2xvcjsgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XCIsXG4gICAgXCIuc3YtcXVlc3Rpb25fX2VyYm94XCI6IFwiY29sb3I6ICRlcnJvci1jb2xvcjtcIixcbiAgICBcIi5zdi1xdWVzdGlvbl9fdGl0bGUtLWFuc3dlclwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkYW5zd2VyLWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3YtcXVlc3Rpb25fX3RpdGxlLS1lcnJvclwiOiBcImJhY2tncm91bmQtY29sb3I6ICRlcnJvci1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2LXBhbmVsX190aXRsZS0tZXJyb3JcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkZXJyb3ItYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdi1yYWRpb19fc3ZnXCI6IFwiYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yOyBmaWxsOiB0cmFuc3BhcmVudDtcIixcbiAgICBcIi5zdi1yYWRpby0tYWxsb3dob3Zlcjpob3ZlciAuc3YtcmFkaW9fX3N2Z1wiOiBcImZpbGw6ICRib3JkZXItY29sb3I7XCIsXG4gICAgXCIuc3YtcmFkaW8tLWNoZWNrZWQgLnN2LXJhZGlvX19zdmdcIjpcbiAgICAgIFwiYm9yZGVyLWNvbG9yOiAkcmFkaW8tY2hlY2tlZC1jb2xvcjsgZmlsbDogJHJhZGlvLWNoZWNrZWQtY29sb3I7XCIsXG4gICAgXCIuc3YtcmFkaW8tLWRpc2FibGVkIC5zdi1yYWRpb19fc3ZnXCI6IFwiYm9yZGVyLWNvbG9yOiAkZGlzYWJsZS1jb2xvcjtcIixcbiAgICBcIi5zdi1yYWRpby0tZGlzYWJsZWQuc3YtcmFkaW8tLWNoZWNrZWQgLnN2LXJhZGlvX19zdmdcIjpcbiAgICAgIFwiZmlsbDogJGRpc2FibGUtY29sb3I7XCIsXG4gICAgXCIuc3YtcmF0aW5nXCI6IFwiY29sb3I6ICR0ZXh0LWNvbG9yO1wiLFxuICAgIFwiLnN2LXJhdGluZyBpbnB1dDpmb2N1cyArIC5zdi1yYXRpbmdfX21pbi10ZXh0ICsgLnN2LXJhdGluZ19faXRlbS10ZXh0LCAuc3YtcmF0aW5nIGlucHV0OmZvY3VzICsgLnN2LXJhdGluZ19faXRlbS10ZXh0XCI6XG4gICAgICBcIm91dGxpbmUtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2LXJhdGluZ19faXRlbS10ZXh0XCI6XG4gICAgICBcImNvbG9yOiAkbWFpbi1ob3Zlci1jb2xvcjsgYm9yZGVyOiBzb2xpZCAwLjE4NzVlbSAkbWFpbi1ob3Zlci1jb2xvcjtcIixcbiAgICBcIi5zdi1yYXRpbmdfX2l0ZW0tdGV4dDpob3ZlclwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1ob3Zlci1jb2xvcjsgY29sb3I6ICRib2R5LWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3YtcmF0aW5nX19pdGVtLS1zZWxlY3RlZCAuc3YtcmF0aW5nX19pdGVtLXRleHRcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7IGNvbG9yOiAkYm9keS1iYWNrZ3JvdW5kLWNvbG9yOyBib3JkZXItY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2LXJhdGluZy0tZGlzYWJsZWQgLnN2LXJhdGluZ19faXRlbS10ZXh0XCI6XG4gICAgICBcImNvbG9yOiAkZGlzYWJsZS1jb2xvcjsgYm9yZGVyLWNvbG9yOiAkZGlzYWJsZS1jb2xvcjtcIixcbiAgICBcIi5zdi1yYXRpbmctLWRpc2FibGVkIC5zdi1yYXRpbmdfX2l0ZW0tdGV4dDpob3ZlclwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcIixcbiAgICBcIi5zdi1yYXRpbmctLWRpc2FibGVkIC5zdi1yYXRpbmdfX2l0ZW0tdGV4dDpob3ZlciAuc3YtcmF0aW5nX19pdGVtLS1zZWxlY3RlZCAuc3YtcmF0aW5nX19pdGVtLXRleHRcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJGRpc2FibGUtY29sb3I7IGNvbG9yOiAkYm9keS1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiOjotd2Via2l0LXNjcm9sbGJhclwiOiBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWhvdmVyLWNvbG9yO1wiLFxuICAgIFwiOjotd2Via2l0LXNjcm9sbGJhci10aHVtYlwiOiBcImJhY2tncm91bmQ6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2LXNlbGVjdGJhc2VfX2NsZWFyLWJ0blwiOiBcImJhY2tncm91bmQtY29sb3I6ICRjbGVhbi1idXR0b24tY29sb3I7XCIsXG4gICAgXCIuc3YtdGFibGVcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKCRtYWluLWhvdmVyLWNvbG9yLCAwLjEpO1wiLFxuICAgIFwiLnN2LXRleHQ6Zm9jdXNcIjogXCJib3JkZXItY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgICcuc3YtdGV4dFt0eXBlPVwiZGF0ZVwiXTo6LXdlYmtpdC1jYWxlbmRhci1waWNrZXItaW5kaWNhdG9yJzpcbiAgICAgIFwiY29sb3I6IHRyYW5zcGFyZW50OyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcIixcbiAgICBcIi5zdi10ZXh0LS1lcnJvclwiOiBcImNvbG9yOiAkZXJyb3ItY29sb3I7IGJvcmRlci1jb2xvcjogJGVycm9yLWNvbG9yO1wiLFxuICAgIFwiLnN2LXRleHQtLWVycm9yOjpwbGFjZWhvbGRlclwiOiBcImNvbG9yOiAkZXJyb3ItY29sb3I7XCIsXG4gICAgXCIuc3YtdGV4dC0tZXJyb3I6Oi1tcy1wbGFjZWhvbGRlclwiOiBcImNvbG9yOiAkZXJyb3ItY29sb3I7XCIsXG4gICAgXCIuc3YtdGV4dC0tZXJyb3I6LW1zLXBsYWNlaG9sZGVyXCI6IFwiY29sb3I6ICRlcnJvci1jb2xvcjtcIixcbiAgICBcImlucHV0LnN2LXRleHQsIHRleHRhcmVhLnN2LWNvbW1lbnQsIHNlbGVjdC5zdi1kcm9wZG93blwiOlxuICAgICAgXCJjb2xvcjogJHRleHQtaW5wdXQtY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRpbnB1dHMtYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdi10ZXh0OjpwbGFjZWhvbGRlclwiOiBcImNvbG9yOiAkdGV4dC1pbnB1dC1jb2xvcjtcIixcbiAgICBcIi5zdi10ZXh0OjotbXMtcGxhY2Vob2xkZXJcIjogXCJjb2xvcjogJHRleHQtaW5wdXQtY29sb3I7XCIsXG4gICAgXCIuc3YtdGV4dDotbXMtcGxhY2Vob2xkZXJcIjogXCJjb2xvcjogJHRleHQtaW5wdXQtY29sb3I7XCIsXG4gICAgXCIuc3YtdGFibGVfX3Jvdy0tZGV0YWlsXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJGhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIC8vc2lnbmF0dXJlIHBhZFxuICAgIFwiLnNqc19zcF9jb250YWluZXJcIjogXCJib3JkZXI6IDFweCBkYXNoZWQgJGRpc2FibGUtY29sb3I7XCIsXG4gICAgXCIuc2pzX3NwX3BsYWNlaG9sZGVyXCI6IFwiY29sb3I6ICRmb3JlZ3JvdW5kLWxpZ2h0O1wiLFxuXG4gICAgLy9kcmFnLWRyb3BcbiAgICBcIi5zdi1tYXRyaXhkeW5hbWljX19kcmFnLWljb25cIjogXCJwYWRkaW5nLXRvcDoxNnB4XCIsXG4gICAgXCIuc3YtbWF0cml4ZHluYW1pY19fZHJhZy1pY29uOmFmdGVyXCI6XG4gICAgICBcImNvbnRlbnQ6ICcgJzsgZGlzcGxheTogYmxvY2s7IGhlaWdodDogNnB4OyB3aWR0aDogMjBweDsgYm9yZGVyOiAxcHggc29saWQgJGJvcmRlci1jb2xvcjsgYm94LXNpemluZzogYm9yZGVyLWJveDsgYm9yZGVyLXJhZGl1czogMTBweDsgY3Vyc29yOiBtb3ZlOyBtYXJnaW4tdG9wOiAxMnB4O1wiLFxuICAgIFwiLnN2LW1hdHJpeF9fZHJhZy1kcm9wLWdob3N0LXBvc2l0aW9uLXRvcCwgLnN2LW1hdHJpeF9fZHJhZy1kcm9wLWdob3N0LXBvc2l0aW9uLWJvdHRvbVwiOlxuICAgICAgXCJwb3NpdGlvbjogcmVsYXRpdmU7XCIsXG4gICAgXCIuc3YtbWF0cml4X19kcmFnLWRyb3AtZ2hvc3QtcG9zaXRpb24tdG9wOjphZnRlciwgLnN2LW1hdHJpeF9fZHJhZy1kcm9wLWdob3N0LXBvc2l0aW9uLWJvdHRvbTo6YWZ0ZXJcIjpcbiAgICAgIFwiY29udGVudDogJyc7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDRweDsgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcHJpbWFyeSwgIzE5YjM5NCk7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogMDtcIixcbiAgICBcIi5zdi1tYXRyaXhfX2RyYWctZHJvcC1naG9zdC1wb3NpdGlvbi10b3A6OmFmdGVyXCI6IFwidG9wOiAwO1wiLFxuICAgIFwiLnN2LW1hdHJpeF9fZHJhZy1kcm9wLWdob3N0LXBvc2l0aW9uLWJvdHRvbTo6YWZ0ZXJcIjogXCJib3R0b206IDA7XCIsXG4gICAgLy9lbyBkcmFnLWRyb3BcbiAgICBcIi5zdi1za2VsZXRvbi1lbGVtZW50XCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJGJhY2tncm91bmQtZGltO1wiLFxuICB9O1xuXG4gIHB1YmxpYyBzdGF0aWMgYm9vdHN0cmFwVGhlbWVDc3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgXCIuc3ZfbWFpbiAuc3ZfcV9pbWdzZWwuY2hlY2tlZCBsYWJlbD5kaXZcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvclwiLFxuICAgIFwiLnN2X21haW4gLnN2X3BfZGVzY3JpcHRpb25cIjogXCJwYWRkaW5nLWxlZnQ6IDEuNjZlbTtcIixcbiAgICBcIi5zdl9tYWluIC5zdl9xc3RuX2Vycm9yX2JvdHRvbVwiOiBcIm1hcmdpbi10b3A6IDIwcHg7IG1hcmdpbi1ib3R0b206IDA7XCIsXG4gICAgXCIuc3ZfbWFpbiAucHJvZ3Jlc3NcIjogXCJ3aWR0aDogNjAlO1wiLFxuICAgIFwiLnN2X21haW4gLnByb2dyZXNzLWJhclwiOlxuICAgICAgXCJ3aWR0aDogYXV0bzsgbWFyZ2luLWxlZnQ6IDJweDsgbWFyZ2luLXJpZ2h0OiAycHg7XCIsXG4gICAgXCIuc3ZfbWFpbiAudGFibGU+dGJvZHk+dHI+dGRcIjogXCJtaW4td2lkdGg6IDkwcHg7XCIsXG4gICAgXCIuc3ZfbWFpbiBmLXBhbmVsIC5zdl9xc3RuXCI6IFwicGFkZGluZzogMDsgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcIixcblxuICAgIFwiLnN2X21haW4gLnN2X3FfaW1hZ2VcIjogXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3Zfcm93IC5zdl9xc3RuOmZpcnN0LWNoaWxkOmxhc3QtY2hpbGRcIjpcbiAgICAgIFwiZmxleDogbm9uZSAhaW1wb3J0YW50O1wiLFxuICAgIFwiLnN2X21haW4gLnN2X3JvdyAuc3ZfcF9jb250YWluZXI6Zmlyc3QtY2hpbGQ6bGFzdC1jaGlsZFwiOlxuICAgICAgXCJmbGV4OiBub25lICFpbXBvcnRhbnQ7XCIsXG5cbiAgICAvL3Byb2dyZXNzIGJhclxuICAgIFwiLnN2X21haW4gLnN2LXByb2dyZXNzXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJGhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LXByb2dyZXNzX19iYXJcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcblxuICAgIC8vcHJvZ3Jlc3MgYnV0dG9uc1xuICAgIFwiLnN2X21haW4gLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QgbGk6YmVmb3JlXCI6XG4gICAgICBcImJvcmRlci1jb2xvcjogJHByb2dyZXNzLWJ1dHRvbnMtY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRwcm9ncmVzcy1idXR0b25zLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QgbGk6YWZ0ZXJcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkcHJvZ3Jlc3MtYnV0dG9ucy1saW5lLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QgLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX3BhZ2UtdGl0bGVcIjogXCIgY29sb3I6ICR0ZXh0LWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QgLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX3BhZ2UtZGVzY3JpcHRpb25cIjogXCIgY29sb3I6ICR0ZXh0LWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QgbGkuc3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdC1lbGVtZW50LS1wYXNzZWQ6YmVmb3JlXCI6XG4gICAgICBcImJvcmRlci1jb2xvcjogJG1haW4tY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QgbGkuc3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdC1lbGVtZW50LS1wYXNzZWQgKyBsaTphZnRlclwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkcHJvZ3Jlc3MtYnV0dG9ucy1jb2xvclwiLFxuICAgIFwiLnN2X21haW4gLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QgbGkuc3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdC1lbGVtZW50LS1jdXJyZW50OmJlZm9yZVwiOlxuICAgICAgXCJib3JkZXItY29sb3I6ICRtYWluLWNvbG9yOyBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcIixcbiAgICBcIi5zdl9tYWluIC5zdl9wcm9ncmVzcy1idXR0b25zX19saXN0IGxpLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QtZWxlbWVudC0tcGFzc2VkLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QtZWxlbWVudC0tY3VycmVudDpiZWZvcmVcIjpcbiAgICAgIFwiYm9yZGVyLWNvbG9yOiAkbWFpbi1jb2xvcjsgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XCIsXG5cbiAgICAvL3BhbmVsZHluYW1pY1xuICAgIFwiLnN2X21haW4gLnN2LXBhbmVsZHluYW1pY19fcHJldi1idG4uc3YtcGFuZWxkeW5hbWljX19wcmV2LWJ0bi0tZGlzYWJsZWQsIC5zdl9tYWluIC5zdi1wYW5lbGR5bmFtaWNfX25leHQtYnRuLnN2LXBhbmVsZHluYW1pY19fbmV4dC1idG4tLWRpc2FibGVkXCI6XG4gICAgICBcImZpbGw6ICRkaXNhYmxlLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LXBhbmVsZHluYW1pY19fcHJvZ3Jlc3MtdGV4dFwiOiBcImNvbG9yOiAkcHJvZ3Jlc3MtdGV4dC1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1wYW5lbGR5bmFtaWNfX3ByZXYtYnRuLCAuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19uZXh0LWJ0blwiOlxuICAgICAgXCJmaWxsOiAkdGV4dC1jb2xvclwiLFxuXG4gICAgLy9ib29sZWFuXG4gICAgXCIuc3ZfbWFpbiAuc3YtYm9vbGVhbl9fc3dpdGNoXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYm9vbGVhbl9fc2xpZGVyXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJHNsaWRlci1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1ib29sZWFuX19sYWJlbC0tZGlzYWJsZWRcIjogXCJjb2xvcjogJGRpc2FibGVkLWxhYmVsLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LWJvb2xlYW4tLWRpc2FibGVkIC5zdi1ib29sZWFuX19zd2l0Y2hcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJGRpc2FibGVkLXN3aXRjaC1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1ib29sZWFuLS1kaXNhYmxlZCAgLnN2LWJvb2xlYW5fX3NsaWRlclwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkZGlzYWJsZWQtc2xpZGVyLWNvbG9yO1wiLFxuICAgIC8vZW8gYm9vbGVhblxuXG4gICAgLy9zaWduYXR1cmUgcGFkXG4gICAgXCIuc3ZfbWFpbiAuc2pzX3NwX2NvbnRhaW5lclwiOiBcImJvcmRlcjogMXB4IGRhc2hlZCAkZGlzYWJsZS1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zanNfc3BfcGxhY2Vob2xkZXJcIjogXCJjb2xvcjogJGZvcmVncm91bmQtbGlnaHQ7XCIsXG5cbiAgICBcIi5zdl9tYWluIC5zdl9tYXRyaXhfZGV0YWlsX3Jvd1wiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAjZWRlZGVkOyBib3JkZXItdG9wOiAxcHggc29saWQgJGhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgJGhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfbWFpbiAuc3YtYWN0aW9uLWJhci1pdGVtXCI6IFwiY29sb3I6ICR0ZXh0LWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LWFjdGlvbi1iYXItaXRlbV9faWNvbiB1c2VcIjogXCJmaWxsOiAkZm9yZWdyb3VuZC1saWdodDtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1hY3Rpb24tYmFyLWl0ZW06aG92ZXJcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkYmFja2dyb3VuZC1kaW07XCIsXG5cbiAgICBcIi5zdi1za2VsZXRvbi1lbGVtZW50XCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJGJhY2tncm91bmQtZGltO1wiLFxuICB9O1xuXG4gIHB1YmxpYyBzdGF0aWMgYm9vdHN0cmFwbWF0ZXJpYWxUaGVtZUNzczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAuZm9ybS1ncm91cC5pcy1mb2N1c2VkIC5mb3JtLWNvbnRyb2xcIjpcbiAgICAgIFwibGluZWFyLWdyYWRpZW50KDBkZWcsICRtYWluLWNvbG9yIDJweCwgJG1haW4tY29sb3IgMCksbGluZWFyLWdyYWRpZW50KDBkZWcsICNEMkQyRDIgMXB4LCB0cmFuc3BhcmVudCAwKTtcIixcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAuc3ZfcXN0blwiOiBcIm1hcmdpbi1ib3R0b206IDFyZW07XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLnN2X3FzdG4gbGFiZWwuc3ZfcV9tX2xhYmVsXCI6XG4gICAgICBcImhlaWdodDogMTAwJTtcIixcblxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIC5zdl9xX2ltYWdlXCI6IFwiZGlzcGxheTogaW5saW5lLWJsb2NrO1wiLFxuICAgIFwiLnN2X21haW4gLnN2X3JvdyAuc3ZfcXN0bjpmaXJzdC1jaGlsZDpsYXN0LWNoaWxkXCI6XG4gICAgICBcImZsZXg6IG5vbmUgIWltcG9ydGFudDtcIixcbiAgICBcIi5zdl9tYWluIC5zdl9yb3cgLnN2X3BfY29udGFpbmVyOmZpcnN0LWNoaWxkOmxhc3QtY2hpbGRcIjpcbiAgICAgIFwiZmxleDogbm9uZSAhaW1wb3J0YW50O1wiLFxuXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLmNoZWNrYm94IGlucHV0W3R5cGU9Y2hlY2tib3hdOmNoZWNrZWQgKyAuY2hlY2tib3gtbWF0ZXJpYWwgLmNoZWNrXCI6XG4gICAgICBcImJvcmRlci1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgbGFiZWwuY2hlY2tib3gtaW5saW5lIGlucHV0W3R5cGU9Y2hlY2tib3hdOmNoZWNrZWQgKyAuY2hlY2tib3gtbWF0ZXJpYWwgLmNoZWNrXCI6XG4gICAgICBcImJvcmRlci1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLmNoZWNrYm94IGlucHV0W3R5cGU9Y2hlY2tib3hdOmNoZWNrZWQgKyAuY2hlY2tib3gtbWF0ZXJpYWwgLmNoZWNrOmJlZm9yZVwiOlxuICAgICAgXCJjb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgbGFiZWwuY2hlY2tib3gtaW5saW5lIGlucHV0W3R5cGU9Y2hlY2tib3hdOmNoZWNrZWQgKyAuY2hlY2tib3gtbWF0ZXJpYWwgLmNoZWNrOmJlZm9yZVwiOlxuICAgICAgXCJjb2xvcjogJG1haW4tY29sb3I7XCIsXG5cbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAucmFkaW8gaW5wdXRbdHlwZT1yYWRpb106Y2hlY2tlZCB+IC5jaXJjbGVcIjpcbiAgICAgIFwiYm9yZGVyLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyBsYWJlbC5yYWRpby1pbmxpbmUgaW5wdXRbdHlwZT1yYWRpb106Y2hlY2tlZCB+IC5jaXJjbGVcIjpcbiAgICAgIFwiYm9yZGVyLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAucmFkaW8gaW5wdXRbdHlwZT1yYWRpb106Y2hlY2tlZCB+IC5jaGVja1wiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyBsYWJlbC5yYWRpby1pbmxpbmUgaW5wdXRbdHlwZT1yYWRpb106Y2hlY2tlZCB+IC5jaGVja1wiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAuYnRuLWRlZmF1bHQuYWN0aXZlXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yOyBjb2xvcjogJGJvZHktYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAuYnRuLWRlZmF1bHQ6YWN0aXZlXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yOyBjb2xvcjogJGJvZHktYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAuYnRuLXNlY29uZGFyeS5hY3RpdmVcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7IGNvbG9yOiAkYm9keS1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIC5idG4tc2Vjb25kYXJ5OmFjdGl2ZVwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjsgY29sb3I6ICRib2R5LWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLm9wZW4+LmRyb3Bkb3duLXRvZ2dsZS5idG4tZGVmYXVsdFwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjsgY29sb3I6ICRib2R5LWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgaW5wdXRbdHlwZT0nYnV0dG9uJ10uYnRuLXByaW1hcnksIC5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyBidXR0b24uYnRuLXByaW1hcnlcIjpcbiAgICAgIFwiY29sb3I6ICRib2R5LWJhY2tncm91bmQtY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIGlucHV0W3R5cGU9J2J1dHRvbiddLmJ0bi1wcmltYXJ5OmhvdmVyLCAuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgYnV0dG9uLmJ0bi1wcmltYXJ5OmhvdmVyXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWhvdmVyLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2X3FfaW1nc2VsLmNoZWNrZWQgbGFiZWw+ZGl2XCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7XCIsXG5cbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAuc3ZfcV9maWxlX3JlbW92ZTpob3ZlclwiOlxuICAgICAgXCJjb2xvcjogJG1haW4tY29sb3I7XCIsXG5cbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAuZm9ybS1ncm91cCBpbnB1dFt0eXBlPWZpbGVdXCI6XG4gICAgICBcInBvc2l0aW9uOiByZWxhdGl2ZTsgb3BhY2l0eTogMTtcIixcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAucHJvZ3Jlc3NcIjogXCJ3aWR0aDogNjAlOyBoZWlnaHQ6IDEuNWVtO1wiLFxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIC5wcm9ncmVzcy1iYXJcIjpcbiAgICAgIFwid2lkdGg6IGF1dG87IG1hcmdpbi1sZWZ0OiAycHg7IG1hcmdpbi1yaWdodDogMnB4O1wiLFxuXG4gICAgLy9wcm9ncmVzcyBiYXJcbiAgICBcIi5zdl9tYWluIC5zdi1wcm9ncmVzc1wiOiBcImJhY2tncm91bmQtY29sb3I6ICRoZWFkZXItYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1wcm9ncmVzc19fYmFyXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7XCIsXG5cbiAgICAvL3Byb2dyZXNzIGJ1dHRvbnNcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAuc3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdCBsaTpiZWZvcmVcIjpcbiAgICAgIFwiYm9yZGVyLWNvbG9yOiAkcHJvZ3Jlc3MtYnV0dG9ucy1jb2xvcjsgYmFja2dyb3VuZC1jb2xvcjogJHByb2dyZXNzLWJ1dHRvbnMtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QgbGk6YWZ0ZXJcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkcHJvZ3Jlc3MtYnV0dG9ucy1saW5lLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIC5zdl9wcm9ncmVzcy1idXR0b25zX19saXN0IC5zdl9wcm9ncmVzcy1idXR0b25zX19wYWdlLXRpdGxlXCI6IFwiIGNvbG9yOiAkdGV4dC1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAuc3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdCAuc3ZfcHJvZ3Jlc3MtYnV0dG9uc19fcGFnZS1kZXNjcmlwdGlvblwiOiBcIiBjb2xvcjogJHRleHQtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QgbGkuc3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdC1lbGVtZW50LS1wYXNzZWQ6YmVmb3JlXCI6XG4gICAgICBcImJvcmRlci1jb2xvcjogJG1haW4tY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIC5zdl9wcm9ncmVzcy1idXR0b25zX19saXN0IGxpLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QtZWxlbWVudC0tcGFzc2VkICsgbGk6YWZ0ZXJcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJHByb2dyZXNzLWJ1dHRvbnMtY29sb3JcIixcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAuc3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdCBsaS5zdl9wcm9ncmVzcy1idXR0b25zX19saXN0LWVsZW1lbnQtLWN1cnJlbnQ6YmVmb3JlXCI6XG4gICAgICBcImJvcmRlci1jb2xvcjogJG1haW4tY29sb3I7IGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1wiLFxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIC5zdl9wcm9ncmVzcy1idXR0b25zX19saXN0IGxpLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QtZWxlbWVudC0tcGFzc2VkLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QtZWxlbWVudC0tY3VycmVudDpiZWZvcmVcIjpcbiAgICAgIFwiYm9yZGVyLWNvbG9yOiAkbWFpbi1jb2xvcjsgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XCIsXG5cbiAgICAvL3BhbmVsZHluYW1pY1xuICAgIFwiLnN2X21haW4gLnN2LXBhbmVsZHluYW1pY19fcHJldi1idG4uc3YtcGFuZWxkeW5hbWljX19wcmV2LWJ0bi0tZGlzYWJsZWQsIC5zdl9tYWluIC5zdi1wYW5lbGR5bmFtaWNfX25leHQtYnRuLnN2LXBhbmVsZHluYW1pY19fbmV4dC1idG4tLWRpc2FibGVkXCI6XG4gICAgICBcImZpbGw6ICRkaXNhYmxlLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LXBhbmVsZHluYW1pY19fcHJvZ3Jlc3MtdGV4dFwiOiBcImNvbG9yOiAkcHJvZ3Jlc3MtdGV4dC1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1wYW5lbGR5bmFtaWNfX3ByZXYtYnRuLCAuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19uZXh0LWJ0blwiOlxuICAgICAgXCJmaWxsOiAkdGV4dC1jb2xvclwiLFxuXG4gICAgLy9ib29sZWFuXG4gICAgXCIuc3ZfbWFpbiAuc3YtYm9vbGVhbiAuY2hlY2tib3gtZGVjb3JhdG9yXCI6IFwiZGlzcGxheTogbm9uZTtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1ib29sZWFuX19zd2l0Y2hcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1ib29sZWFuX19zbGlkZXJcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkc2xpZGVyLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LWJvb2xlYW5fX2xhYmVsLnN2LWJvb2xlYW5fX2xhYmVsLS1kaXNhYmxlZFwiOlxuICAgICAgXCJjb2xvcjogJGRpc2FibGVkLWxhYmVsLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LWJvb2xlYW5fX2xhYmVsXCI6IFwiY29sb3I6ICR0ZXh0LWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LWJvb2xlYW4tLWRpc2FibGVkIC5zdi1ib29sZWFuX19zd2l0Y2hcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJGRpc2FibGVkLXN3aXRjaC1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1ib29sZWFuLS1kaXNhYmxlZCAgLnN2LWJvb2xlYW5fX3NsaWRlclwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkZGlzYWJsZWQtc2xpZGVyLWNvbG9yO1wiLFxuICAgIC8vZW8gYm9vbGVhblxuICAgIFwiLnN2X21haW4gLnN2X21hdHJpeF9kZXRhaWxfcm93XCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICNlZGVkZWQ7IGJvcmRlci10b3A6IDFweCBzb2xpZCAkaGVhZGVyLWJhY2tncm91bmQtY29sb3I7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAkaGVhZGVyLWJhY2tncm91bmQtY29sb3I7XCIsXG5cbiAgICAvL3NpZ25hdHVyZSBwYWRcbiAgICBcIi5zdl9tYWluIC5zanNfc3BfY29udGFpbmVyXCI6IFwiYm9yZGVyOiAxcHggZGFzaGVkICRkaXNhYmxlLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnNqc19zcF9wbGFjZWhvbGRlclwiOiBcImNvbG9yOiAkZm9yZWdyb3VuZC1saWdodDtcIixcblxuICAgIFwiLnN2X21haW4gLnN2LWFjdGlvbi1iYXItaXRlbVwiOiBcImNvbG9yOiAkdGV4dC1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1hY3Rpb24tYmFyLWl0ZW1fX2ljb24gdXNlXCI6IFwiZmlsbDogJGZvcmVncm91bmQtbGlnaHQ7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYWN0aW9uLWJhci1pdGVtOmhvdmVyXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJGJhY2tncm91bmQtZGltO1wiLFxuXG4gICAgXCIuc3Ytc2tlbGV0b24tZWxlbWVudFwiOiBcImJhY2tncm91bmQtY29sb3I6ICRiYWNrZ3JvdW5kLWRpbTtcIixcbiAgfTtcblxuICBwcml2YXRlIHNoZWV0OiBDU1NTdHlsZVNoZWV0ID0gbnVsbDtcblxuICBzdGF0aWMgZmluZFNoZWV0KHN0eWxlU2hlZXRJZDogc3RyaW5nKTogYW55IHtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gbnVsbDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoXG4gICAgICAgICEhZG9jdW1lbnQuc3R5bGVTaGVldHNbaV0ub3duZXJOb2RlICYmXG4gICAgICAgICg8YW55PmRvY3VtZW50KS5zdHlsZVNoZWV0c1tpXS5vd25lck5vZGVbXCJpZFwiXSA9PT0gc3R5bGVTaGVldElkXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIDxDU1NTdHlsZVNoZWV0PmRvY3VtZW50LnN0eWxlU2hlZXRzW2ldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVTaGVldChzdHlsZVNoZWV0SWQ6IHN0cmluZykge1xuICAgIGxldCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcbiAgICBzdHlsZS5pZCA9IHN0eWxlU2hlZXRJZDtcbiAgICAvLyBBZGQgYSBtZWRpYSAoYW5kL29yIG1lZGlhIHF1ZXJ5KSBoZXJlIGlmIHlvdSdkIGxpa2UhXG4gICAgLy8gc3R5bGUuc2V0QXR0cmlidXRlKFwibWVkaWFcIiwgXCJzY3JlZW5cIilcbiAgICAvLyBzdHlsZS5zZXRBdHRyaWJ1dGUoXCJtZWRpYVwiLCBcIm9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoIDogMTAyNHB4KVwiKVxuICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpKTtcbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICByZXR1cm4gPENTU1N0eWxlU2hlZXQ+c3R5bGUuc2hlZXQ7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGFwcGx5VGhlbWUoXG4gICAgdGhlbWVOYW1lOiBzdHJpbmcgPSBcImRlZmF1bHRcIixcbiAgICB0aGVtZVNlbGVjdG9yOiBzdHJpbmcgPSBcIi5zdl9tYWluXCJcbiAgKSB7XG4gICAgbGV0IFRoZW1lQ3NzOiBhbnk7XG5cbiAgICBpZiAodGhlbWVOYW1lID09PSBcIm1vZGVyblwiKSB0aGVtZVNlbGVjdG9yID0gXCIuc3Ytcm9vdC1tb2Rlcm4gXCI7XG5cbiAgICBpZiAoXG4gICAgICBbXCJib290c3RyYXBcIiwgXCJib290c3RyYXBtYXRlcmlhbFwiLCBcIm1vZGVyblwiXS5pbmRleE9mKHRoZW1lTmFtZSkgIT09IC0xXG4gICAgKSB7XG4gICAgICBUaGVtZUNzcyA9ICg8YW55PlN0eWxlc01hbmFnZXIpW3RoZW1lTmFtZSArIFwiVGhlbWVDc3NcIl07XG4gICAgICBzdXJ2ZXlDc3MuY3VycmVudFR5cGUgPSB0aGVtZU5hbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIFRoZW1lQ3NzID0gU3R5bGVzTWFuYWdlci5UaGVtZUNzcztcbiAgICAgIHN1cnZleUNzcy5jdXJyZW50VHlwZSA9IFwic3RhbmRhcmRcIjtcbiAgICB9XG5cbiAgICBpZiAoU3R5bGVzTWFuYWdlci5FbmFibGVkKSB7XG4gICAgICBsZXQgc2hlZXQgPSBTdHlsZXNNYW5hZ2VyLmZpbmRTaGVldCh0aGVtZU5hbWUgKyB0aGVtZVNlbGVjdG9yKTtcbiAgICAgIGlmICghc2hlZXQpIHtcbiAgICAgICAgc2hlZXQgPSBTdHlsZXNNYW5hZ2VyLmNyZWF0ZVNoZWV0KHRoZW1lTmFtZSArIHRoZW1lU2VsZWN0b3IpO1xuICAgICAgICBjb25zdCB0aGVtZSA9IFN0eWxlc01hbmFnZXIuVGhlbWVDb2xvcnNbdGhlbWVOYW1lXSB8fFxuICAgICAgICAgIFN0eWxlc01hbmFnZXIuVGhlbWVDb2xvcnNbXCJkZWZhdWx0XCJdO1xuXG4gICAgICAgIE9iamVjdC5rZXlzKFRoZW1lQ3NzKS5mb3JFYWNoKChzZWxlY3RvcikgPT4ge1xuICAgICAgICAgIGxldCBjc3NSdWxlVGV4dCA9IFRoZW1lQ3NzW3NlbGVjdG9yXTtcbiAgICAgICAgICBPYmplY3Qua2V5cyh0aGVtZSkuZm9yRWFjaChcbiAgICAgICAgICAgIChjb2xvclZhcmlhYmxlTmFtZSkgPT5cbiAgICAgICAgICAgICAgKGNzc1J1bGVUZXh0ID0gY3NzUnVsZVRleHQucmVwbGFjZShcbiAgICAgICAgICAgICAgICBuZXcgUmVnRXhwKFwiXFxcXFwiICsgY29sb3JWYXJpYWJsZU5hbWUsIFwiZ1wiKSxcbiAgICAgICAgICAgICAgICB0aGVtZVtjb2xvclZhcmlhYmxlTmFtZV1cbiAgICAgICAgICAgICAgKSlcbiAgICAgICAgICApO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzaGVldC5pbnNlcnRSdWxlKFxuICAgICAgICAgICAgICB0aGVtZVNlbGVjdG9yICsgc2VsZWN0b3IgKyBcIiB7IFwiICsgY3NzUnVsZVRleHQgKyBcIiB9XCIsXG4gICAgICAgICAgICAgIDBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkgeyB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgRW5hYmxlZCA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgaWYgKFN0eWxlc01hbmFnZXIuRW5hYmxlZCkge1xuICAgICAgdGhpcy5zaGVldCA9IFN0eWxlc01hbmFnZXIuZmluZFNoZWV0KFN0eWxlc01hbmFnZXIuU3VydmV5SlNTdHlsZXNTaGVldElkKTtcbiAgICAgIGlmICghdGhpcy5zaGVldCkge1xuICAgICAgICB0aGlzLnNoZWV0ID0gU3R5bGVzTWFuYWdlci5jcmVhdGVTaGVldChcbiAgICAgICAgICBTdHlsZXNNYW5hZ2VyLlN1cnZleUpTU3R5bGVzU2hlZXRJZFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVTdHlsZXModGhpcy5zaGVldCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemVTdHlsZXMoc2hlZXQ6IENTU1N0eWxlU2hlZXQpIHtcbiAgICBpZiAoU3R5bGVzTWFuYWdlci5FbmFibGVkKSB7XG4gICAgICBPYmplY3Qua2V5cyhTdHlsZXNNYW5hZ2VyLlN0eWxlcykuZm9yRWFjaCgoc2VsZWN0b3IpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzaGVldC5pbnNlcnRSdWxlKFxuICAgICAgICAgICAgc2VsZWN0b3IgKyBcIiB7IFwiICsgU3R5bGVzTWFuYWdlci5TdHlsZXNbc2VsZWN0b3JdICsgXCIgfVwiLFxuICAgICAgICAgICAgMFxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxuICAgICAgfSk7XG4gICAgICBPYmplY3Qua2V5cyhTdHlsZXNNYW5hZ2VyLk1lZGlhKS5mb3JFYWNoKChzZWxlY3RvcikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHNoZWV0Lmluc2VydFJ1bGUoXG4gICAgICAgICAgICBTdHlsZXNNYW5hZ2VyLk1lZGlhW3NlbGVjdG9yXS5tZWRpYSArXG4gICAgICAgICAgICBcIiB7IFwiICtcbiAgICAgICAgICAgIHNlbGVjdG9yICtcbiAgICAgICAgICAgIFwiIHsgXCIgK1xuICAgICAgICAgICAgU3R5bGVzTWFuYWdlci5NZWRpYVtzZWxlY3Rvcl0uc3R5bGUgK1xuICAgICAgICAgICAgXCIgfSB9XCIsXG4gICAgICAgICAgICAwXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZSkgeyB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xyXG5pbXBvcnQgeyBSZW5kZXJlckZhY3RvcnkgfSBmcm9tIFwiLi9yZW5kZXJlckZhY3RvcnlcIjtcclxuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuL2Jhc2VcIjtcclxuaW1wb3J0IHsgQWN0aW9uIH0gZnJvbSBcIi4vYWN0aW9ucy9hY3Rpb25cIjtcclxuaW1wb3J0IHsgQWRhcHRpdmVBY3Rpb25Db250YWluZXIgfSBmcm9tIFwiLi9hY3Rpb25zL2FkYXB0aXZlLWNvbnRhaW5lclwiO1xyXG5pbXBvcnQge1xyXG4gIElTdXJ2ZXlFbGVtZW50LFxyXG4gIElFbGVtZW50LFxyXG4gIElQYWdlLFxyXG4gIElQYW5lbCxcclxuICBJUHJvZ3Jlc3NJbmZvLFxyXG4gIElTdXJ2ZXksXHJcbiAgSVN1cnZleURhdGEsXHJcbiAgSVN1cnZleUltcGwsXHJcbiAgSVRleHRQcm9jZXNzb3IsXHJcbiAgSVRpdGxlT3duZXJcclxufSBmcm9tIFwiLi9iYXNlLWludGVyZmFjZXNcIjtcclxuaW1wb3J0IHsgU3VydmV5RXJyb3IgfSBmcm9tIFwiLi9zdXJ2ZXktZXJyb3JcIjtcclxuaW1wb3J0IHsgQ3NzQ2xhc3NCdWlsZGVyIH0gZnJvbSBcIi4vdXRpbHMvY3NzQ2xhc3NCdWlsZGVyXCI7XHJcbmltcG9ydCB7IEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XHJcbmltcG9ydCB7IHNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3NcIjtcclxuaW1wb3J0IHsgSUxvY2FsaXphYmxlT3duZXIsIExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcclxuXHJcbi8qKlxyXG4gKiBCYXNlIGNsYXNzIG9mIFN1cnZleUpTIEVsZW1lbnRzIGFuZCBTdXJ2ZXkuXHJcbiAqL1xyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU3VydmV5RWxlbWVudENvcmUgZXh0ZW5kcyBCYXNlIGltcGxlbWVudHMgSUxvY2FsaXphYmxlT3duZXIge1xyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIHRoaXMuY3JlYXRlTG9jVGl0bGVQcm9wZXJ0eSgpO1xyXG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImRlc2NyaXB0aW9uXCIsIHRoaXMsIHRydWUpO1xyXG4gIH1cclxuICBwcm90ZWN0ZWQgY3JlYXRlTG9jVGl0bGVQcm9wZXJ0eSgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInRpdGxlXCIsIHRoaXMsIHRydWUpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBRdWVzdGlvbiwgUGFuZWwsIFBhZ2UgYW5kIFN1cnZleSB0aXRsZS4gSWYgcGFnZSBhbmQgcGFuZWwgaXMgZW1wdHkgdGhlbiB0aGV5IGFyZSBub3QgcmVuZGVyZWQuXHJcbiAgICogUXVlc3Rpb24gcmVuZGVycyBxdWVzdGlvbiBuYW1lIGlmIHRoZSB0aXRsZSBpcyBlbXB0eS4gVXNlIHN1cnZleSBxdWVzdGlvblRpdGxlVGVtcGxhdGUgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSB0aXRsZSBxdWVzdGlvbiByZW5kZXJpbmcuXHJcbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5xdWVzdGlvblRpdGxlVGVtcGxhdGVcclxuICAqL1xyXG4gIHB1YmxpYyBnZXQgdGl0bGUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInRpdGxlXCIsIHRoaXMuZ2V0RGVmYXVsdFRpdGxlVmFsdWUoKSk7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgdGl0bGUodmFsOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidGl0bGVcIiwgdmFsKTtcclxuICB9XHJcbiAgZ2V0IGxvY1RpdGxlKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwidGl0bGVcIik7XHJcbiAgfVxyXG4gIHByb3RlY3RlZCBnZXREZWZhdWx0VGl0bGVWYWx1ZSgpOiBzdHJpbmcgeyByZXR1cm4gdW5kZWZpbmVkOyB9XHJcbiAgLyoqXHJcbiAgICogUXVlc3Rpb24sIFBhbmVsIGFuZCBQYWdlIGRlc2NyaXB0aW9uLiBJdCByZW5kZXJzIHVuZGVyIGVsZW1lbnQgdGl0bGUgYnkgdXNpbmcgc21hbGxlciBmb250LiBVbmxpa2UgdGhlIHF1ZXN0aW9uIHRpdGxlLCBkZXNjcmlwdGlvbiBjYW4gYmUgZW1wdHkuXHJcbiAgICogUGxlYXNlIG5vdGUsIHRoaXMgcHJvcGVydHkgaXMgaGlkZGVuIGZvciBxdWVzdGlvbnMgd2l0aG91dCBpbnB1dCwgZm9yIGV4YW1wbGUgaHRtbCBxdWVzdGlvbi5cclxuICAgKiBAc2VlIHRpdGxlXHJcbiAgKi9cclxuICBwdWJsaWMgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJkZXNjcmlwdGlvblwiKTtcclxuICB9XHJcbiAgcHVibGljIHNldCBkZXNjcmlwdGlvbih2YWw6IHN0cmluZykge1xyXG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJkZXNjcmlwdGlvblwiLCB2YWwpO1xyXG4gIH1cclxuICBnZXQgbG9jRGVzY3JpcHRpb24oKTogTG9jYWxpemFibGVTdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJkZXNjcmlwdGlvblwiKTtcclxuICB9XHJcbiAgcHVibGljIGdldCB0aXRsZVRhZ05hbWUoKTogc3RyaW5nIHtcclxuICAgIGxldCB0aXRsZVRhZ05hbWUgPSB0aGlzLmdldERlZmF1bHRUaXRsZVRhZ05hbWUoKTtcclxuICAgIGNvbnN0IHN1cnZleSA9IHRoaXMuZ2V0U3VydmV5KCk7XHJcbiAgICByZXR1cm4gISFzdXJ2ZXkgPyBzdXJ2ZXkuZ2V0RWxlbWVudFRpdGxlVGFnTmFtZSh0aGlzLCB0aXRsZVRhZ05hbWUpIDogdGl0bGVUYWdOYW1lO1xyXG4gIH1cclxuICBwcm90ZWN0ZWQgZ2V0RGVmYXVsdFRpdGxlVGFnTmFtZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuICg8YW55PnNldHRpbmdzLnRpdGxlVGFncylbdGhpcy5nZXRUeXBlKCldO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IGhhc1RpdGxlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy50aXRsZS5sZW5ndGggPiAwOyB9XHJcbiAgcHVibGljIGdldCBoYXNUaXRsZUFjdGlvbnMoKTogYm9vbGVhbiB7IHJldHVybiBmYWxzZTsgfVxyXG4gIHB1YmxpYyBnZXQgaGFzVGl0bGVFdmVudHMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5oYXNUaXRsZUFjdGlvbnM7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXRUaXRsZVRvb2xiYXIoKTogQWRhcHRpdmVBY3Rpb25Db250YWluZXIgeyByZXR1cm4gbnVsbDsgfVxyXG4gIHB1YmxpYyBnZXRUaXRsZU93bmVyKCk6IElUaXRsZU93bmVyIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxyXG4gIHB1YmxpYyBnZXQgaXNUaXRsZU93bmVyKCk6IGJvb2xlYW4geyByZXR1cm4gISF0aGlzLmdldFRpdGxlT3duZXIoKTsgfVxyXG4gIHB1YmxpYyB0b2dnbGVTdGF0ZSgpOiBib29sZWFuIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxyXG4gIHB1YmxpYyBnZXQgY3NzQ2xhc3NlcygpOiBhbnkgeyByZXR1cm4ge307IH1cclxuICBwdWJsaWMgZ2V0IGNzc1RpdGxlKCk6IHN0cmluZyB7IHJldHVybiBcIlwiOyB9XHJcbiAgcHVibGljIGdldCBhcmlhVGl0bGVJZCgpOiBzdHJpbmcgeyByZXR1cm4gdW5kZWZpbmVkOyB9XHJcbiAgcHVibGljIGdldCB0aXRsZVRhYkluZGV4KCk6IG51bWJlciB7IHJldHVybiB1bmRlZmluZWQ7IH1cclxuICBwdWJsaWMgZ2V0IHRpdGxlQXJpYUV4cGFuZGVkKCk6IGJvb2xlYW4geyByZXR1cm4gdW5kZWZpbmVkOyB9XHJcbiAgLy9JTG9jYWxpemFibGVPd25lclxyXG4gIHB1YmxpYyBhYnN0cmFjdCBnZXRMb2NhbGUoKTogc3RyaW5nO1xyXG4gIHB1YmxpYyBhYnN0cmFjdCBnZXRNYXJrZG93bkh0bWwodGV4dDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmc7XHJcbiAgcHVibGljIGFic3RyYWN0IGdldFJlbmRlcmVyKG5hbWU6IHN0cmluZyk6IHN0cmluZztcclxuICBwdWJsaWMgYWJzdHJhY3QgZ2V0UmVuZGVyZXJDb250ZXh0KGxvY1N0cjogTG9jYWxpemFibGVTdHJpbmcpOiBhbnk7XHJcbiAgcHVibGljIGFic3RyYWN0IGdldFByb2Nlc3NlZFRleHQodGV4dDogc3RyaW5nKTogc3RyaW5nO1xyXG59XHJcblxyXG4vKipcclxuICogQmFzZSBjbGFzcyBvZiBTdXJ2ZXlKUyBFbGVtZW50cy5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBTdXJ2ZXlFbGVtZW50IGV4dGVuZHMgU3VydmV5RWxlbWVudENvcmUgaW1wbGVtZW50cyBJU3VydmV5RWxlbWVudCB7XHJcbiAgc3RhdGVDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0UHJvZ3Jlc3NJbmZvQnlFbGVtZW50cyhcclxuICAgIGNoaWxkcmVuOiBBcnJheTxTdXJ2ZXlFbGVtZW50PixcclxuICAgIGlzUmVxdWlyZWQ6IGJvb2xlYW5cclxuICApOiBJUHJvZ3Jlc3NJbmZvIHtcclxuICAgIGNvbnN0IGluZm86IElQcm9ncmVzc0luZm8gPSBCYXNlLmNyZWF0ZVByb2dyZXNzSW5mbygpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAoIWNoaWxkcmVuW2ldLmlzVmlzaWJsZSkgY29udGludWU7XHJcbiAgICAgIGNvbnN0IGNoaWxkSW5mbzogSVByb2dyZXNzSW5mbyA9IGNoaWxkcmVuW2ldLmdldFByb2dyZXNzSW5mbygpO1xyXG4gICAgICBpbmZvLnF1ZXN0aW9uQ291bnQgKz0gY2hpbGRJbmZvLnF1ZXN0aW9uQ291bnQ7XHJcbiAgICAgIGluZm8uYW5zd2VyZWRRdWVzdGlvbkNvdW50ICs9IGNoaWxkSW5mby5hbnN3ZXJlZFF1ZXN0aW9uQ291bnQ7XHJcbiAgICAgIGluZm8ucmVxdWlyZWRRdWVzdGlvbkNvdW50ICs9IGNoaWxkSW5mby5yZXF1aXJlZFF1ZXN0aW9uQ291bnQ7XHJcbiAgICAgIGluZm8ucmVxdWlyZWRBbnN3ZXJlZFF1ZXN0aW9uQ291bnQgKz1cclxuICAgICAgICBjaGlsZEluZm8ucmVxdWlyZWRBbnN3ZXJlZFF1ZXN0aW9uQ291bnQ7XHJcbiAgICB9XHJcbiAgICBpZiAoaXNSZXF1aXJlZCAmJiBpbmZvLnF1ZXN0aW9uQ291bnQgPiAwKSB7XHJcbiAgICAgIGlmIChpbmZvLnJlcXVpcmVkUXVlc3Rpb25Db3VudCA9PSAwKSBpbmZvLnJlcXVpcmVkUXVlc3Rpb25Db3VudCA9IDE7XHJcbiAgICAgIGlmIChpbmZvLmFuc3dlcmVkUXVlc3Rpb25Db3VudCA+IDApXHJcbiAgICAgICAgaW5mby5yZXF1aXJlZEFuc3dlcmVkUXVlc3Rpb25Db3VudCA9IDE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaW5mbztcclxuICB9XHJcbiAgcHJpdmF0ZSBzdXJ2ZXlJbXBsVmFsdWU6IElTdXJ2ZXlJbXBsO1xyXG4gIHByaXZhdGUgc3VydmV5RGF0YVZhbHVlOiBJU3VydmV5RGF0YTtcclxuICBwcml2YXRlIHN1cnZleVZhbHVlOiBJU3VydmV5O1xyXG4gIHByaXZhdGUgdGV4dFByb2Nlc3NvclZhbHVlOiBJVGV4dFByb2Nlc3NvcjtcclxuICBwcml2YXRlIHNlbGVjdGVkRWxlbWVudEluRGVzaWduVmFsdWU6IFN1cnZleUVsZW1lbnQgPSB0aGlzO1xyXG4gIHByaXZhdGUgZXhwYW5kQWN0aW9uOiBBY3Rpb247XHJcbiAgQHByb3BlcnR5KHsgZGVmYXVsdFZhbHVlOiBmYWxzZSB9KSBpc0RyYWdPdmVyTWU6IGJvb2xlYW47XHJcbiAgcHVibGljIHJlYWRPbmx5Q2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xyXG5cclxuICBwdWJsaWMgc3RhdGljIFNjcm9sbEVsZW1lbnRUb1RvcChlbGVtZW50SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFlbGVtZW50SWQgfHwgdHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZmFsc2U7XHJcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRJZCk7XHJcbiAgICBpZiAoIWVsIHx8ICFlbC5zY3JvbGxJbnRvVmlldykgcmV0dXJuIGZhbHNlO1xyXG4gICAgY29uc3QgZWxlbVRvcDogbnVtYmVyID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xyXG4gICAgaWYgKGVsZW1Ub3AgPCAwKSBlbC5zY3JvbGxJbnRvVmlldygpO1xyXG4gICAgcmV0dXJuIGVsZW1Ub3AgPCAwO1xyXG4gIH1cclxuICBwdWJsaWMgc3RhdGljIEdldEZpcnN0Tm9uVGV4dEVsZW1lbnQoXHJcbiAgICBlbGVtZW50czogYW55LFxyXG4gICAgcmVtb3ZlU3BhY2VzOiBib29sZWFuID0gZmFsc2VcclxuICApIHtcclxuICAgIGlmICghZWxlbWVudHMgfHwgIWVsZW1lbnRzLmxlbmd0aCB8fCBlbGVtZW50cy5sZW5ndGggPT0gMCkgcmV0dXJuIG51bGw7XHJcbiAgICBpZiAocmVtb3ZlU3BhY2VzKSB7XHJcbiAgICAgIGxldCB0RWwgPSBlbGVtZW50c1swXTtcclxuICAgICAgaWYgKHRFbC5ub2RlTmFtZSA9PT0gXCIjdGV4dFwiKSB0RWwuZGF0YSA9IFwiXCI7XHJcbiAgICAgIHRFbCA9IGVsZW1lbnRzW2VsZW1lbnRzLmxlbmd0aCAtIDFdO1xyXG4gICAgICBpZiAodEVsLm5vZGVOYW1lID09PSBcIiN0ZXh0XCIpIHRFbC5kYXRhID0gXCJcIjtcclxuICAgIH1cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKGVsZW1lbnRzW2ldLm5vZGVOYW1lICE9IFwiI3RleHRcIiAmJiBlbGVtZW50c1tpXS5ub2RlTmFtZSAhPSBcIiNjb21tZW50XCIpXHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRzW2ldO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG4gIHB1YmxpYyBzdGF0aWMgRm9jdXNFbGVtZW50KGVsZW1lbnRJZDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIWVsZW1lbnRJZCB8fCB0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBmYWxzZTtcclxuICAgIGNvbnN0IHJlczogYm9vbGVhbiA9IFN1cnZleUVsZW1lbnQuZm9jdXNFbGVtZW50Q29yZShlbGVtZW50SWQpO1xyXG4gICAgaWYgKCFyZXMpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgU3VydmV5RWxlbWVudC5mb2N1c0VsZW1lbnRDb3JlKGVsZW1lbnRJZCk7XHJcbiAgICAgIH0sIDEwKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG4gIHByaXZhdGUgc3RhdGljIGZvY3VzRWxlbWVudENvcmUoZWxlbWVudElkOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudElkKTtcclxuICAgIGlmIChlbCkge1xyXG4gICAgICBlbC5mb2N1cygpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAgcHVibGljIHN0YXRpYyBDcmVhdGVEaXNhYmxlZERlc2lnbkVsZW1lbnRzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGRpc2FibGVEZXNpZ25BY3Rpb25zOiBib29sZWFuID1cclxuICAgIFN1cnZleUVsZW1lbnQuQ3JlYXRlRGlzYWJsZWREZXNpZ25FbGVtZW50cztcclxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xyXG4gICAgdGhpcy5jcmVhdGVOZXdBcnJheShcImVycm9yc1wiKTtcclxuICAgIHRoaXMuY3JlYXRlTmV3QXJyYXkoXCJ0aXRsZUFjdGlvbnNcIik7XHJcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwiaXNSZWFkT25seVwiLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMub25SZWFkT25seUNoYW5nZWQoKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcImVycm9yc1wiLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMudXBkYXRlVmlzaWJsZUVycm9ycygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHByb3RlY3RlZCBvblByb3BlcnR5VmFsdWVDaGFuZ2VkKG5hbWU6IHN0cmluZywgb2xkVmFsdWU6IGFueSwgbmV3VmFsdWU6IGFueSkge1xyXG4gICAgc3VwZXIub25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpO1xyXG4gICAgaWYgKG5hbWUgPT09IFwic3RhdGVcIikge1xyXG4gICAgICBpZiAob2xkVmFsdWUgPT09IFwiZGVmYXVsdFwiIHx8IG5ld1ZhbHVlID09PSBcImRlZmF1bHRcIikge1xyXG4gICAgICAgIHRoaXMudXBkYXRlVGl0bGVBY3Rpb25zKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVFeHBhbmRBY3Rpb24oKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5zdGF0ZUNoYW5nZWRDYWxsYmFjaykgdGhpcy5zdGF0ZUNoYW5nZWRDYWxsYmFjaygpO1xyXG4gICAgfVxyXG4gIH1cclxuICBwcm90ZWN0ZWQgZ2V0U2tlbGV0b25Db21wb25lbnROYW1lQ29yZSgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuc3VydmV5KSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnN1cnZleS5nZXRTa2VsZXRvbkNvbXBvbmVudE5hbWUodGhpcyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gXCJcIjtcclxuICB9XHJcbiAgcHVibGljIGdldCBza2VsZXRvbkNvbXBvbmVudE5hbWUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmdldFNrZWxldG9uQ29tcG9uZW50TmFtZUNvcmUoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gXCJjb2xsYXBzZWRcIiB0byByZW5kZXIgb25seSBQYW5lbCB0aXRsZSBhbmQgZXhwYW5kZWQgYnV0dG9uIGFuZCB0byBcImV4cGFuZGVkXCIgdG8gcmVuZGVyIHRoZSBjb2xsYXBzZWQgYnV0dG9uIGluIHRoZSBQYW5lbCBjYXB0aW9uXHJcbiAgICovXHJcbiAgcHVibGljIGdldCBzdGF0ZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInN0YXRlXCIpO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IHN0YXRlKHZhbDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzdGF0ZVwiLCB2YWwpO1xyXG4gICAgdGhpcy5ub3RpZnlTdGF0ZUNoYW5nZWQoKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBub3RpZnlTdGF0ZUNoYW5nZWQoKSB7XHJcbiAgICBpZiAodGhpcy5zdXJ2ZXkpIHtcclxuICAgICAgdGhpcy5zdXJ2ZXkuZWxlbWVudENvbnRlbnRWaXNpYmlsaXR5Q2hhbmdlZCh0aGlzKTtcclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBFbGVtZW50IGlzIGluIHRoZSBjb2xsYXBzZWQgc3RhdGVcclxuICAgKiBAc2VlIHN0YXRlXHJcbiAgICogQHNlZSBjb2xsYXBzZVxyXG4gICAqIEBzZWUgaXNFeHBhbmRlZFxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXQgaXNDb2xsYXBzZWQoKSB7XHJcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUpIHJldHVybjtcclxuICAgIHJldHVybiB0aGlzLnN0YXRlID09PSBcImNvbGxhcHNlZFwiO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIEVsZW1lbnQgaXMgaW4gdGhlIGV4cGFuZGVkIHN0YXRlXHJcbiAgICogQHNlZSBzdGF0ZVxyXG4gICAqIEBzZWUgZXhwYW5kXHJcbiAgICogQHNlZSBpc0NvbGxhcHNlZFxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXQgaXNFeHBhbmRlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLnN0YXRlID09PSBcImV4cGFuZGVkXCI7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIENvbGxhcHNlIHRoZSBFbGVtZW50XHJcbiAgICogQHNlZSBzdGF0ZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBjb2xsYXBzZSgpIHtcclxuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkgcmV0dXJuO1xyXG4gICAgdGhpcy5zdGF0ZSA9IFwiY29sbGFwc2VkXCI7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEV4cGFuZCB0aGUgRWxlbWVudFxyXG4gICAqIEBzZWUgc3RhdGVcclxuICAgKi9cclxuICBwdWJsaWMgZXhwYW5kKCkge1xyXG4gICAgdGhpcy5zdGF0ZSA9IFwiZXhwYW5kZWRcIjtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVG9nZ2xlIGVsZW1lbnQncyBzdGF0ZVxyXG4gICAqIEBzZWUgc3RhdGVcclxuICAgKi9cclxuICBwdWJsaWMgdG9nZ2xlU3RhdGUoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5pc0NvbGxhcHNlZCkge1xyXG4gICAgICB0aGlzLmV4cGFuZCgpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmlzRXhwYW5kZWQpIHtcclxuICAgICAgdGhpcy5jb2xsYXBzZSgpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbiAgcHVibGljIGdldCBoYXNTdGF0ZUJ1dHRvbigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmlzRXhwYW5kZWQgfHwgdGhpcy5pc0NvbGxhcHNlZDtcclxuICB9XHJcbiAgcHJpdmF0ZSB0aXRsZVRvb2xiYXJWYWx1ZTogQWRhcHRpdmVBY3Rpb25Db250YWluZXI7XHJcbiAgcHVibGljIGdldFRpdGxlVG9vbGJhcigpOiBBZGFwdGl2ZUFjdGlvbkNvbnRhaW5lciB7XHJcbiAgICBpZiAoIXRoaXMudGl0bGVUb29sYmFyVmFsdWUpIHtcclxuICAgICAgdGhpcy50aXRsZVRvb2xiYXJWYWx1ZSA9IG5ldyBBZGFwdGl2ZUFjdGlvbkNvbnRhaW5lcigpO1xyXG4gICAgICB0aGlzLnRpdGxlVG9vbGJhclZhbHVlLnNldEl0ZW1zKHRoaXMuZ2V0VGl0bGVBY3Rpb25zKCkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMudGl0bGVUb29sYmFyVmFsdWU7XHJcbiAgfVxyXG4gIHByaXZhdGUgdXBkYXRlRXhwYW5kQWN0aW9uKCkge1xyXG4gICAgaWYgKCEhdGhpcy5leHBhbmRBY3Rpb24pIHtcclxuICAgICAgdGhpcy5leHBhbmRBY3Rpb24udmlzaWJsZSA9IHRoaXMuaXNFeHBhbmRlZCB8fCB0aGlzLmlzQ29sbGFwc2VkO1xyXG4gICAgICB0aGlzLmV4cGFuZEFjdGlvbi5pbm5lckNzcyA9IG5ldyBDc3NDbGFzc0J1aWxkZXIoKVxyXG4gICAgICAgIC5hcHBlbmQoXCJzdi1leHBhbmQtYWN0aW9uXCIpLmFwcGVuZChcInN2LWV4cGFuZC1hY3Rpb24tLWV4cGFuZGVkXCIsIHRoaXMuaXNFeHBhbmRlZCkudG9TdHJpbmcoKTtcclxuICAgIH1cclxuICB9XHJcbiAgcHVibGljIGdldCB0aXRsZUFjdGlvbnMoKTogQXJyYXk8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidGl0bGVBY3Rpb25zXCIpO1xyXG4gIH1cclxuICBwcml2YXRlIGlzVGl0bGVBY3Rpb25SZXF1ZXN0ZWQ6IGJvb2xlYW47XHJcbiAgcHVibGljIGdldFRpdGxlQWN0aW9ucygpOiBBcnJheTxhbnk+IHtcclxuICAgIGlmICghdGhpcy5pc1RpdGxlQWN0aW9uUmVxdWVzdGVkKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlVGl0bGVBY3Rpb25zKCk7XHJcbiAgICAgIHRoaXMuaXNUaXRsZUFjdGlvblJlcXVlc3RlZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy50aXRsZUFjdGlvbnM7XHJcbiAgfVxyXG4gIHByaXZhdGUgdXBkYXRlVGl0bGVBY3Rpb25zKCkge1xyXG4gICAgbGV0IGFjdGlvbnMgPSBbXTtcclxuICAgIGlmICh0aGlzLmhhc1N0YXRlQnV0dG9uICYmICF0aGlzLmV4cGFuZEFjdGlvbikge1xyXG4gICAgICB0aGlzLmV4cGFuZEFjdGlvbiA9IG5ldyBBY3Rpb24oe1xyXG4gICAgICAgIGlkOiBcImV4cGFuZC1jb2xsYXBzZS1hY3Rpb25cIixcclxuICAgICAgICB0aXRsZTogXCJcIixcclxuICAgICAgICBkaXNhYmxlVGFiU3RvcDogdHJ1ZSxcclxuICAgICAgICBhY3Rpb246ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMudG9nZ2xlU3RhdGUoKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmICghIXRoaXMuZXhwYW5kQWN0aW9uKSB7XHJcbiAgICAgIGFjdGlvbnMucHVzaCh0aGlzLmV4cGFuZEFjdGlvbik7XHJcbiAgICB9XHJcbiAgICBpZiAoISF0aGlzLnN1cnZleSkge1xyXG4gICAgICBhY3Rpb25zID0gdGhpcy5zdXJ2ZXkuZ2V0VXBkYXRlZEVsZW1lbnRUaXRsZUFjdGlvbnModGhpcywgYWN0aW9ucyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVwZGF0ZUV4cGFuZEFjdGlvbigpO1xyXG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidGl0bGVBY3Rpb25zXCIsIGFjdGlvbnMpO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IGhhc1RpdGxlQWN0aW9ucygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmdldFRpdGxlQWN0aW9ucygpLmxlbmd0aCA+IDA7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgaGFzVGl0bGVFdmVudHMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5oYXNUaXRsZUFjdGlvbnMgfHwgdGhpcy5zdGF0ZSAhPT0gXCJkZWZhdWx0XCI7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXRUaXRsZUNvbXBvbmVudE5hbWUoKTogc3RyaW5nIHtcclxuICAgIHZhciBjb21wb25lbnROYW1lID0gUmVuZGVyZXJGYWN0b3J5Lkluc3RhbmNlLmdldFJlbmRlcmVyKFxyXG4gICAgICBcImVsZW1lbnRcIixcclxuICAgICAgXCJ0aXRsZS1hY3Rpb25zXCJcclxuICAgICk7XHJcbiAgICBpZiAoY29tcG9uZW50TmFtZSA9PSBcImRlZmF1bHRcIikge1xyXG4gICAgICByZXR1cm4gXCJzdi1kZWZhdWx0LXRpdGxlXCI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY29tcG9uZW50TmFtZTtcclxuICB9XHJcbiAgcHVibGljIGdldCB0aXRsZVRhYkluZGV4KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gIXRoaXMuaXNQYWdlICYmIHRoaXMuc3RhdGUgIT09IFwiZGVmYXVsdFwiID8gMCA6IHVuZGVmaW5lZDtcclxuICB9XHJcbiAgcHVibGljIGdldCB0aXRsZUFyaWFFeHBhbmRlZCgpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmlzUGFnZSB8fCB0aGlzLnN0YXRlID09PSBcImRlZmF1bHRcIikgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIHJldHVybiB0aGlzLnN0YXRlID09PSBcImV4cGFuZGVkXCI7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXRTdXJ2ZXlJbXBsKHZhbHVlOiBJU3VydmV5SW1wbCkge1xyXG4gICAgdGhpcy5zdXJ2ZXlJbXBsVmFsdWUgPSB2YWx1ZTtcclxuICAgIGlmICghdGhpcy5zdXJ2ZXlJbXBsVmFsdWUpIHtcclxuICAgICAgdGhpcy5zZXRTdXJ2ZXlDb3JlKG51bGwpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zdXJ2ZXlEYXRhVmFsdWUgPSB0aGlzLnN1cnZleUltcGxWYWx1ZS5nZXRTdXJ2ZXlEYXRhKCk7XHJcbiAgICAgIHRoaXMuc2V0U3VydmV5Q29yZSh0aGlzLnN1cnZleUltcGxWYWx1ZS5nZXRTdXJ2ZXkoKSk7XHJcbiAgICAgIHRoaXMudGV4dFByb2Nlc3NvclZhbHVlID0gdGhpcy5zdXJ2ZXlJbXBsVmFsdWUuZ2V0VGV4dFByb2Nlc3NvcigpO1xyXG4gICAgICB0aGlzLm9uU2V0RGF0YSgpO1xyXG4gICAgfVxyXG4gIH1cclxuICBwcm90ZWN0ZWQgZ2V0IHN1cnZleUltcGwoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXlJbXBsVmFsdWU7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgZGF0YSgpOiBJU3VydmV5RGF0YSB7XHJcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXlEYXRhVmFsdWU7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIHN1cnZleSBvYmplY3QuXHJcbiAgICovXHJcbiAgcHVibGljIGdldCBzdXJ2ZXkoKTogSVN1cnZleSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRTdXJ2ZXkoKTtcclxuICB9XHJcbiAgcHVibGljIGdldFN1cnZleShsaXZlOiBib29sZWFuID0gZmFsc2UpOiBJU3VydmV5IHtcclxuICAgIGlmICghIXRoaXMuc3VydmV5VmFsdWUpIHJldHVybiB0aGlzLnN1cnZleVZhbHVlO1xyXG4gICAgaWYgKCEhdGhpcy5zdXJ2ZXlJbXBsVmFsdWUpIHtcclxuICAgICAgdGhpcy5zZXRTdXJ2ZXlDb3JlKHRoaXMuc3VydmV5SW1wbFZhbHVlLmdldFN1cnZleSgpKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnN1cnZleVZhbHVlO1xyXG4gIH1cclxuICBwcm90ZWN0ZWQgc2V0U3VydmV5Q29yZSh2YWx1ZTogSVN1cnZleSkge1xyXG4gICAgdGhpcy5zdXJ2ZXlWYWx1ZSA9IHZhbHVlO1xyXG4gICAgaWYgKCEhdGhpcy5zdXJ2ZXlDaGFuZ2VkQ2FsbGJhY2spIHtcclxuICAgICAgdGhpcy5zdXJ2ZXlDaGFuZ2VkQ2FsbGJhY2soKTtcclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBxdWVzdGlvbiBpbiBkZXNpZ24gbW9kZSByaWdodCBub3cuXHJcbiAgICovXHJcbiAgcHVibGljIGdldCBpc0Rlc2lnbk1vZGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISF0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5pc0Rlc2lnbk1vZGU7XHJcbiAgfVxyXG4gIHB1YmxpYyBpc0NvbnRlbnRFbGVtZW50OiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGlzRWRpdGFibGVUZW1wbGF0ZUVsZW1lbnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgaXNJbnRlcmFjdGl2ZURlc2lnbkVsZW1lbnQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHByb3RlY3RlZCBnZXQgaXNJbnRlcm5hbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmlzQ29udGVudEVsZW1lbnQ7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgYXJlSW52aXNpYmxlRWxlbWVudHNTaG93aW5nKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgISF0aGlzLnN1cnZleSAmJlxyXG4gICAgICB0aGlzLnN1cnZleS5hcmVJbnZpc2libGVFbGVtZW50c1Nob3dpbmcgJiZcclxuICAgICAgIXRoaXMuaXNDb250ZW50RWxlbWVudFxyXG4gICAgKTtcclxuICB9XHJcbiAgcHVibGljIGdldCBpc1Zpc2libGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbiAgcHVibGljIGdldCBpc1JlYWRPbmx5KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTZXQgaXQgdG8gdHJ1ZSB0byBtYWtlIGFuIGVsZW1lbnQgcXVlc3Rpb24vcGFuZWwvcGFnZSByZWFkb25seS5cclxuICAgKiBQbGVhc2Ugbm90ZSwgdGhpcyBwcm9wZXJ0eSBpcyBoaWRkZW4gZm9yIHF1ZXN0aW9uIHdpdGhvdXQgaW5wdXQsIGZvciBleGFtcGxlIGh0bWwgcXVlc3Rpb24uXHJcbiAgICogQHNlZSBlbmFibGVJZlxyXG4gICAqIEBzZWUgaXNSZWFkT25seVxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXQgcmVhZE9ubHkoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmVhZE9ubHlcIiwgZmFsc2UpO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IHJlYWRPbmx5KHZhbDogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMucmVhZE9ubHkgPT0gdmFsKSByZXR1cm47XHJcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyZWFkT25seVwiLCB2YWwpO1xyXG4gICAgaWYgKCF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSB7XHJcbiAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzUmVhZE9ubHlcIiwgdGhpcy5pc1JlYWRPbmx5KTtcclxuICAgIH1cclxuICB9XHJcbiAgcHJvdGVjdGVkIG9uUmVhZE9ubHlDaGFuZ2VkKCkge1xyXG4gICAgaWYgKCEhdGhpcy5yZWFkT25seUNoYW5nZWRDYWxsYmFjaykge1xyXG4gICAgICB0aGlzLnJlYWRPbmx5Q2hhbmdlZENhbGxiYWNrKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHByaXZhdGUgZ2V0IGNzcygpOiBhbnkge1xyXG4gICAgcmV0dXJuICEhdGhpcy5zdXJ2ZXkgPyB0aGlzLnN1cnZleS5nZXRDc3MoKSA6IHt9O1xyXG4gIH1cclxuICBAcHJvcGVydHkoKSBjc3NDbGFzc2VzVmFsdWU6IGFueTtcclxuICAvKipcclxuICAgKiBSZXR1cm5zIGFsbCBjc3MgY2xhc3NlcyB0aGF0IHVzZWQgZm9yIHJlbmRlcmluZyB0aGUgcXVlc3Rpb24sIHBhbmVsIG9yIHBhZ2UuXHJcbiAgICogWW91IGNhbiB1c2Ugc3VydmV5Lm9uVXBkYXRlUXVlc3Rpb25Dc3NDbGFzc2VzIGV2ZW50IHRvIG92ZXJyaWRlIGNzcyBjbGFzc2VzIGZvciBhIHF1ZXN0aW9uLCBzdXJ2ZXkub25VcGRhdGVQYW5lbENzc0NsYXNzZXMgZXZlbnQgZm9yIGEgcGFuZWwgYW5kIHN1cnZleS5vblVwZGF0ZVBhZ2VDc3NDbGFzc2VzIGZvciBhIHBhZ2UuXHJcbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC51cGRhdGVRdWVzdGlvbkNzc0NsYXNzZXNcclxuICAgKiBAc2VlIFN1cnZleU1vZGVsLnVwZGF0ZVBhbmVsQ3NzQ2xhc3Nlc1xyXG4gICAqIEBzZWUgU3VydmV5TW9kZWwudXBkYXRlUGFnZUNzc0NsYXNzZXNcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0IGNzc0NsYXNzZXMoKTogYW55IHtcclxuICAgIGlmICghdGhpcy5zdXJ2ZXkpIHJldHVybiB0aGlzLmNhbGNDc3NDbGFzc2VzKHRoaXMuY3NzKTtcclxuICAgIGlmICghdGhpcy5jc3NDbGFzc2VzVmFsdWUpIHtcclxuICAgICAgdGhpcy5jc3NDbGFzc2VzVmFsdWUgPSB0aGlzLmNhbGNDc3NDbGFzc2VzKHRoaXMuY3NzKTtcclxuICAgICAgdGhpcy51cGRhdGVFbGVtZW50Q3NzQ29yZSh0aGlzLmNzc0NsYXNzZXNWYWx1ZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5jc3NDbGFzc2VzVmFsdWU7XHJcbiAgfVxyXG4gIHByb3RlY3RlZCBjYWxjQ3NzQ2xhc3Nlcyhjc3M6IGFueSk6IGFueSB7IHJldHVybiB1bmRlZmluZWQ7IH1cclxuICBwcm90ZWN0ZWQgdXBkYXRlRWxlbWVudENzc0NvcmUoY3NzQ2xhc3NlczogYW55KSB7IH1cclxuICBwdWJsaWMgZ2V0IGNzc0Vycm9yKCk6IHN0cmluZyB7IHJldHVybiBcIlwiOyB9XHJcbiAgcHVibGljIHVwZGF0ZUVsZW1lbnRDc3MocmVOZXc/OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmNzc0NsYXNzZXNWYWx1ZSA9IHVuZGVmaW5lZDtcclxuICB9XHJcbiAgcHJvdGVjdGVkIGdldElzTG9hZGluZ0Zyb21Kc29uKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHN1cGVyLmdldElzTG9hZGluZ0Zyb21Kc29uKCkpIHJldHVybiB0cnVlO1xyXG4gICAgcmV0dXJuIHRoaXMuc3VydmV5ID8gdGhpcy5zdXJ2ZXkuaXNMb2FkaW5nRnJvbUpzb24gOiBmYWxzZTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVGhpcyBpcyB0aGUgaWRlbnRpZmllciBvZiBhIHN1cnZleSBlbGVtZW50IC0gcXVlc3Rpb24gb3IgcGFuZWwuXHJcbiAgICogQHNlZSB2YWx1ZU5hbWVcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJuYW1lXCIsIFwiXCIpO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IG5hbWUodmFsOiBzdHJpbmcpIHtcclxuICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMubmFtZTtcclxuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm5hbWVcIiwgdGhpcy5nZXRWYWxpZE5hbWUodmFsKSk7XHJcbiAgICBpZiAoIXRoaXMuaXNMb2FkaW5nRnJvbUpzb24gJiYgISFvbGRWYWx1ZSkge1xyXG4gICAgICB0aGlzLm9uTmFtZUNoYW5nZWQob2xkVmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuICBwcm90ZWN0ZWQgZ2V0VmFsaWROYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gbmFtZTtcclxuICB9XHJcbiAgcHJvdGVjdGVkIG9uTmFtZUNoYW5nZWQob2xkVmFsdWU6IHN0cmluZykgeyB9XHJcbiAgcHJvdGVjdGVkIHVwZGF0ZUJpbmRpbmdWYWx1ZSh2YWx1ZU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkge1xyXG4gICAgaWYgKFxyXG4gICAgICAhIXRoaXMuZGF0YSAmJlxyXG4gICAgICAhdGhpcy5pc1R3b1ZhbHVlRXF1YWxzKHZhbHVlLCB0aGlzLmRhdGEuZ2V0VmFsdWUodmFsdWVOYW1lKSlcclxuICAgICkge1xyXG4gICAgICB0aGlzLmRhdGEuc2V0VmFsdWUodmFsdWVOYW1lLCB2YWx1ZSwgZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiBUaGUgbGlzdCBvZiBlcnJvcnMuIEl0IGlzIGNyZWF0ZWQgYnkgY2FsbGlnIGhhc0Vycm9ycyBmdW5jdGlvbnNcclxuICAgKiBAc2VlIGhhc0Vycm9yc1xyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXQgZXJyb3JzKCk6IEFycmF5PFN1cnZleUVycm9yPiB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZXJyb3JzXCIpO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IGVycm9ycyh2YWw6IEFycmF5PFN1cnZleUVycm9yPikge1xyXG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZXJyb3JzXCIsIHZhbCk7XHJcbiAgfVxyXG4gIEBwcm9wZXJ0eSh7IGRlZmF1bHRWYWx1ZTogZmFsc2UgfSkgaGFzVmlzaWJsZUVycm9yczogYm9vbGVhbjtcclxuICBwcml2YXRlIHVwZGF0ZVZpc2libGVFcnJvcnMoKSB7XHJcbiAgICB2YXIgY291bnRlciA9IDA7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZXJyb3JzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh0aGlzLmVycm9yc1tpXS52aXNpYmxlKSBjb3VudGVyKys7XHJcbiAgICB9XHJcbiAgICB0aGlzLmhhc1Zpc2libGVFcnJvcnMgPSBjb3VudGVyID4gMDtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0cnVlIGlmIGEgcXVlc3Rpb24gb3IgYSBjb250YWluZXIgKHBhbmVsL3BhZ2UpIG9yIHRoZWlyIGNoaWRyZW4gaGF2ZSBhbiBlcnJvci5cclxuICAgKiBUaGUgdmFsdWUgY2FuIGJlIG91dCBvZiBkYXRlLiBoYXNFcnJvcnMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB0byBnZXQgdGhlIGNvcnJlY3QgdmFsdWUuXHJcbiAgICovXHJcbiAgcHVibGljIGdldCBjb250YWluc0Vycm9ycygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb250YWluc0Vycm9yc1wiLCBmYWxzZSk7XHJcbiAgfVxyXG4gIHB1YmxpYyB1cGRhdGVDb250YWluc0Vycm9ycygpIHtcclxuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvbnRhaW5zRXJyb3JzXCIsIHRoaXMuZ2V0Q29udGFpbnNFcnJvcnMoKSk7XHJcbiAgfVxyXG4gIHByb3RlY3RlZCBnZXRDb250YWluc0Vycm9ycygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmVycm9ycy5sZW5ndGggPiAwO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0RWxlbWVudHNJbkRlc2lnbihpbmNsdWRlSGlkZGVuOiBib29sZWFuID0gZmFsc2UpOiBBcnJheTxJRWxlbWVudD4ge1xyXG4gICAgcmV0dXJuIFtdO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IHNlbGVjdGVkRWxlbWVudEluRGVzaWduKCk6IFN1cnZleUVsZW1lbnQge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRFbGVtZW50SW5EZXNpZ25WYWx1ZTtcclxuICB9XHJcbiAgcHVibGljIHNldCBzZWxlY3RlZEVsZW1lbnRJbkRlc2lnbih2YWw6IFN1cnZleUVsZW1lbnQpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50SW5EZXNpZ25WYWx1ZSA9IHZhbDtcclxuICB9XHJcbiAgcHVibGljIHVwZGF0ZUN1c3RvbVdpZGdldHMoKSB7IH1cclxuXHJcbiAgcHVibGljIG9uU3VydmV5TG9hZCgpIHsgfVxyXG4gIHB1YmxpYyBvbkZpcnN0UmVuZGVyaW5nKCkgeyB9XHJcbiAgZW5kTG9hZGluZ0Zyb21Kc29uKCkge1xyXG4gICAgc3VwZXIuZW5kTG9hZGluZ0Zyb21Kc29uKCk7XHJcbiAgICBpZiAoIXRoaXMuc3VydmV5KSB7XHJcbiAgICAgIHRoaXMub25TdXJ2ZXlMb2FkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXRWaXNpYmxlSW5kZXgoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gMDtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0cnVlIGlmIGl0IGlzIGEgcGFnZS5cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0IGlzUGFnZSgpIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0cnVlIGlmIGl0IGlzIGEgcGFuZWwuXHJcbiAgICovXHJcbiAgcHVibGljIGdldCBpc1BhbmVsKCkge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRydWUgaWYgaXQgaXMgYSBxdWVzdGlvbi5cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0IGlzUXVlc3Rpb24oKSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG4gIHB1YmxpYyBkZWxldGUoKSB7IH1cclxuICAvL0lMb2NhbGl6YWJsZU93bmVyXHJcbiAgbG9jT3duZXI6IElMb2NhbGl6YWJsZU93bmVyO1xyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3VydmV5IGxvY2FsZVxyXG4gICAqIEBzZWUgU3VydmV5TW9kZWwubG9jYWxlXHJcbiAgICovXHJcbiAgcHVibGljIGdldExvY2FsZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuc3VydmV5XHJcbiAgICAgID8gKDxJTG9jYWxpemFibGVPd25lcj4oPGFueT50aGlzLnN1cnZleSkpLmdldExvY2FsZSgpXHJcbiAgICAgIDogdGhpcy5sb2NPd25lclxyXG4gICAgICAgID8gdGhpcy5sb2NPd25lci5nZXRMb2NhbGUoKVxyXG4gICAgICAgIDogXCJcIjtcclxuICB9XHJcbiAgcHVibGljIGdldE1hcmtkb3duSHRtbCh0ZXh0OiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXlcclxuICAgICAgPyB0aGlzLnN1cnZleS5nZXRTdXJ2ZXlNYXJrZG93bkh0bWwodGhpcywgdGV4dCwgbmFtZSlcclxuICAgICAgOiB0aGlzLmxvY093bmVyXHJcbiAgICAgICAgPyB0aGlzLmxvY093bmVyLmdldE1hcmtkb3duSHRtbCh0ZXh0LCBuYW1lKVxyXG4gICAgICAgIDogbnVsbDtcclxuICB9XHJcbiAgcHVibGljIGdldFJlbmRlcmVyKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkgJiYgdHlwZW9mIHRoaXMuc3VydmV5LmdldFJlbmRlcmVyRm9yU3RyaW5nID09PSBcImZ1bmN0aW9uXCJcclxuICAgICAgPyB0aGlzLnN1cnZleS5nZXRSZW5kZXJlckZvclN0cmluZyh0aGlzLCBuYW1lKVxyXG4gICAgICA6IHRoaXMubG9jT3duZXIgJiYgdHlwZW9mIHRoaXMubG9jT3duZXIuZ2V0UmVuZGVyZXIgPT09IFwiZnVuY3Rpb25cIlxyXG4gICAgICAgID8gdGhpcy5sb2NPd25lci5nZXRSZW5kZXJlcihuYW1lKVxyXG4gICAgICAgIDogbnVsbDtcclxuICB9XHJcbiAgcHVibGljIGdldFJlbmRlcmVyQ29udGV4dChsb2NTdHI6IExvY2FsaXphYmxlU3RyaW5nKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLnN1cnZleSAmJiB0eXBlb2YgdGhpcy5zdXJ2ZXkuZ2V0UmVuZGVyZXJDb250ZXh0Rm9yU3RyaW5nID09PSBcImZ1bmN0aW9uXCJcclxuICAgICAgPyB0aGlzLnN1cnZleS5nZXRSZW5kZXJlckNvbnRleHRGb3JTdHJpbmcodGhpcywgbG9jU3RyKVxyXG4gICAgICA6IHRoaXMubG9jT3duZXIgJiYgdHlwZW9mIHRoaXMubG9jT3duZXIuZ2V0UmVuZGVyZXJDb250ZXh0ID09PSBcImZ1bmN0aW9uXCJcclxuICAgICAgICA/IHRoaXMubG9jT3duZXIuZ2V0UmVuZGVyZXJDb250ZXh0KGxvY1N0cilcclxuICAgICAgICA6IGxvY1N0cjtcclxuICB9XHJcbiAgcHVibGljIGdldFByb2Nlc3NlZFRleHQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm4gdGV4dDtcclxuICAgIGlmICh0aGlzLnRleHRQcm9jZXNzb3IpXHJcbiAgICAgIHJldHVybiB0aGlzLnRleHRQcm9jZXNzb3IucHJvY2Vzc1RleHQodGV4dCwgdGhpcy5nZXRVc2VEaXNwbGF5VmFsdWVzSW5UaXRsZSgpKTtcclxuICAgIGlmICh0aGlzLmxvY093bmVyKSByZXR1cm4gdGhpcy5sb2NPd25lci5nZXRQcm9jZXNzZWRUZXh0KHRleHQpO1xyXG4gICAgcmV0dXJuIHRleHQ7XHJcbiAgfVxyXG4gIHByb3RlY3RlZCBnZXRVc2VEaXNwbGF5VmFsdWVzSW5UaXRsZSgpOiBib29sZWFuIHsgcmV0dXJuIHRydWU7IH1cclxuICBwcm90ZWN0ZWQgcmVtb3ZlU2VsZkZyb21MaXN0KGxpc3Q6IEFycmF5PGFueT4pIHtcclxuICAgIGlmICghbGlzdCB8fCAhQXJyYXkuaXNBcnJheShsaXN0KSkgcmV0dXJuO1xyXG4gICAgY29uc3QgaW5kZXg6IG51bWJlciA9IGxpc3QuaW5kZXhPZih0aGlzKTtcclxuICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgIGxpc3Quc3BsaWNlKGluZGV4LCAxKTtcclxuICAgIH1cclxuICB9XHJcbiAgcHJvdGVjdGVkIGdldCB0ZXh0UHJvY2Vzc29yKCk6IElUZXh0UHJvY2Vzc29yIHtcclxuICAgIHJldHVybiB0aGlzLnRleHRQcm9jZXNzb3JWYWx1ZTtcclxuICB9XHJcbiAgcHJvdGVjdGVkIGdldFByb2Nlc3NlZEh0bWwoaHRtbDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghaHRtbCB8fCAhdGhpcy50ZXh0UHJvY2Vzc29yKSByZXR1cm4gaHRtbDtcclxuICAgIHJldHVybiB0aGlzLnRleHRQcm9jZXNzb3IucHJvY2Vzc1RleHQoaHRtbCwgdHJ1ZSk7XHJcbiAgfVxyXG4gIHByb3RlY3RlZCBvblNldERhdGEoKSB7IH1cclxuICBwdWJsaWMgZ2V0IHBhcmVudCgpOiBJUGFuZWwge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInBhcmVudFwiLCBudWxsKTtcclxuICB9XHJcbiAgcHVibGljIHNldCBwYXJlbnQodmFsOiBJUGFuZWwpIHtcclxuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInBhcmVudFwiLCB2YWwpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldFBhZ2UocGFyZW50OiBJUGFuZWwpOiBJUGFnZSB7XHJcbiAgICB3aGlsZSAocGFyZW50ICYmIHBhcmVudC5wYXJlbnQpIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7XHJcbiAgICBpZiAocGFyZW50ICYmIHBhcmVudC5nZXRUeXBlKCkgPT0gXCJwYWdlXCIpIHJldHVybiA8SVBhZ2U+KDxhbnk+cGFyZW50KTtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuICBwcm90ZWN0ZWQgbW92ZVRvQmFzZShcclxuICAgIHBhcmVudDogSVBhbmVsLFxyXG4gICAgY29udGFpbmVyOiBJUGFuZWwsXHJcbiAgICBpbnNlcnRCZWZvcmU6IGFueSA9IG51bGxcclxuICApOiBib29sZWFuIHtcclxuICAgIGlmICghY29udGFpbmVyKSByZXR1cm4gZmFsc2U7XHJcbiAgICBwYXJlbnQucmVtb3ZlRWxlbWVudCg8SUVsZW1lbnQ+KDxhbnk+dGhpcykpO1xyXG4gICAgbGV0IGluZGV4ID0gLTE7XHJcbiAgICBpZiAoSGVscGVycy5pc051bWJlcihpbnNlcnRCZWZvcmUpKSB7XHJcbiAgICAgIGluZGV4ID0gcGFyc2VJbnQoaW5zZXJ0QmVmb3JlKTtcclxuICAgIH1cclxuICAgIGlmIChpbmRleCA9PSAtMSAmJiAhIWluc2VydEJlZm9yZSAmJiAhIWluc2VydEJlZm9yZS5nZXRUeXBlKSB7XHJcbiAgICAgIGluZGV4ID0gY29udGFpbmVyLmluZGV4T2YoaW5zZXJ0QmVmb3JlKTtcclxuICAgIH1cclxuICAgIGNvbnRhaW5lci5hZGRFbGVtZW50KDxJRWxlbWVudD4oPGFueT50aGlzKSwgaW5kZXgpO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgc2V0UGFnZShwYXJlbnQ6IElQYW5lbCwgbmV3UGFnZTogSVBhZ2UpOiB2b2lkIHtcclxuICAgIGNvbnN0IG9sZFBhZ2U6IElQYWdlID0gdGhpcy5nZXRQYWdlKHBhcmVudCk7XHJcblxyXG4gICAgLy9maXggZm9yIHRoZSBjcmVhdG9yIHYxOiBodHRwczovL2dpdGh1Yi5jb20vc3VydmV5anMvc3VydmV5LWNyZWF0b3IvaXNzdWVzLzE3NDRcclxuICAgIGlmICh0eXBlb2YgbmV3UGFnZSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICBjb25zdCBzdXJ2ZXkgPSB0aGlzLmdldFN1cnZleSgpO1xyXG4gICAgICBzdXJ2ZXkucGFnZXMuZm9yRWFjaCgocGFnZTogSVBhZ2UpID0+IHtcclxuICAgICAgICBpZiAoPGFueT5uZXdQYWdlID09PSBwYWdlLm5hbWUpIG5ld1BhZ2UgPSBwYWdlO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAob2xkUGFnZSA9PT0gbmV3UGFnZSkgcmV0dXJuO1xyXG4gICAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUVsZW1lbnQoPElFbGVtZW50Pig8YW55PnRoaXMpKTtcclxuICAgIGlmIChuZXdQYWdlKSB7XHJcbiAgICAgIG5ld1BhZ2UuYWRkRWxlbWVudCg8SUVsZW1lbnQ+KDxhbnk+dGhpcyksIC0xKTtcclxuICAgIH1cclxuICB9XHJcbiAgcHJvdGVjdGVkIGdldFNlYXJjaGFibGVMb2NLZXlzKGtleXM6IEFycmF5PHN0cmluZz4pIHtcclxuICAgIGtleXMucHVzaChcInRpdGxlXCIpO1xyXG4gICAga2V5cy5wdXNoKFwiZGVzY3JpcHRpb25cIik7XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IElTdXJ2ZXlFcnJvck93bmVyIH0gZnJvbSBcIi4vYmFzZS1pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTdXJ2ZXlFcnJvciB7XHJcbiAgcHJpdmF0ZSBsb2NUZXh0VmFsdWU6IExvY2FsaXphYmxlU3RyaW5nO1xyXG4gIHB1YmxpYyB2aXNpYmxlOiBib29sZWFuID0gdHJ1ZTtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyB0ZXh0OiBzdHJpbmcgPSBudWxsLFxyXG4gICAgcHJvdGVjdGVkIGVycm9yT3duZXI6IElTdXJ2ZXlFcnJvck93bmVyID0gbnVsbFxyXG4gICkge31cclxuICBwdWJsaWMgZ2V0IGxvY1RleHQoKSB7XHJcbiAgICBpZiAoIXRoaXMubG9jVGV4dFZhbHVlKSB7XHJcbiAgICAgIHRoaXMubG9jVGV4dFZhbHVlID0gbmV3IExvY2FsaXphYmxlU3RyaW5nKHRoaXMuZXJyb3JPd25lciwgdHJ1ZSk7XHJcbiAgICAgIHRoaXMubG9jVGV4dFZhbHVlLnRleHQgPSB0aGlzLmdldFRleHQoKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmxvY1RleHRWYWx1ZTtcclxuICB9XHJcbiAgcHVibGljIGdldFRleHQoKTogc3RyaW5nIHtcclxuICAgIHZhciByZXMgPSB0aGlzLnRleHQ7XHJcbiAgICBpZiAoIXJlcykgcmVzID0gdGhpcy5nZXREZWZhdWx0VGV4dCgpO1xyXG4gICAgaWYgKCEhdGhpcy5lcnJvck93bmVyKSB7XHJcbiAgICAgIHJlcyA9IHRoaXMuZXJyb3JPd25lci5nZXRFcnJvckN1c3RvbVRleHQocmVzLCB0aGlzKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXRFcnJvclR5cGUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBcImJhc2VcIjtcclxuICB9XHJcbiAgcHJvdGVjdGVkIGdldERlZmF1bHRUZXh0KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gXCJcIjtcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgSGFzaFRhYmxlLCBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgSnNvbk9iamVjdCwgSnNvbkVycm9yLCBTZXJpYWxpemVyLCBwcm9wZXJ0eSB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IEJhc2UsIEV2ZW50QmFzZSB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7XG4gIElTdXJ2ZXksXG4gIElTdXJ2ZXlEYXRhLFxuICBJU3VydmV5SW1wbCxcbiAgSVRleHRQcm9jZXNzb3IsXG4gIElRdWVzdGlvbixcbiAgSVBhbmVsLFxuICBJRWxlbWVudCxcbiAgSVBhZ2UsXG4gIElTdXJ2ZXlFcnJvck93bmVyLFxuICBJU3VydmV5RWxlbWVudCxcbiAgSVByb2dyZXNzSW5mbyxcbiAgSUZpbmRFbGVtZW50LFxufSBmcm9tIFwiLi9iYXNlLWludGVyZmFjZXNcIjtcbmltcG9ydCB7IFN1cnZleUVsZW1lbnRDb3JlLCBTdXJ2ZXlFbGVtZW50IH0gZnJvbSBcIi4vc3VydmV5LWVsZW1lbnRcIjtcbmltcG9ydCB7IHN1cnZleUNzcyB9IGZyb20gXCIuL2RlZmF1bHRDc3MvY3Nzc3RhbmRhcmRcIjtcbmltcG9ydCB7IElTdXJ2ZXlUcmlnZ2VyT3duZXIsIFN1cnZleVRyaWdnZXIgfSBmcm9tIFwiLi90cmlnZ2VyXCI7XG5pbXBvcnQgeyBDYWxjdWxhdGVkVmFsdWUgfSBmcm9tIFwiLi9jYWxjdWxhdGVkVmFsdWVcIjtcbmltcG9ydCB7IFBhZ2VNb2RlbCB9IGZyb20gXCIuL3BhZ2VcIjtcbmltcG9ydCB7IFRleHRQcmVQcm9jZXNzb3IsIFRleHRQcmVQcm9jZXNzb3JWYWx1ZSB9IGZyb20gXCIuL3RleHRQcmVQcm9jZXNzb3JcIjtcbmltcG9ydCB7IFByb2Nlc3NWYWx1ZSB9IGZyb20gXCIuL2NvbmRpdGlvblByb2Nlc3NWYWx1ZVwiO1xuaW1wb3J0IHsgZHhTdXJ2ZXlTZXJ2aWNlIH0gZnJvbSBcIi4vZHhTdXJ2ZXlTZXJ2aWNlXCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBDdXN0b21FcnJvciB9IGZyb20gXCIuL2Vycm9yXCI7XG5pbXBvcnQgeyBJTG9jYWxpemFibGVPd25lciwgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgU3R5bGVzTWFuYWdlciB9IGZyb20gXCIuL3N0eWxlc21hbmFnZXJcIjtcbmltcG9ydCB7IFN1cnZleVRpbWVyIH0gZnJvbSBcIi4vc3VydmV5dGltZXJcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IFF1ZXN0aW9uU2VsZWN0QmFzZSB9IGZyb20gXCIuL3F1ZXN0aW9uX2Jhc2VzZWxlY3RcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgUGFuZWxNb2RlbEJhc2UsIFF1ZXN0aW9uUm93TW9kZWwgfSBmcm9tIFwiLi9wYW5lbFwiO1xuaW1wb3J0IHtcbiAgSHRtbENvbmRpdGlvbkl0ZW0sXG4gIFVybENvbmRpdGlvbkl0ZW0sXG4gIEV4cHJlc3Npb25JdGVtLFxufSBmcm9tIFwiLi9leHByZXNzaW9uSXRlbXNcIjtcbmltcG9ydCB7IEV4cHJlc3Npb25SdW5uZXIsIENvbmRpdGlvblJ1bm5lciB9IGZyb20gXCIuL2NvbmRpdGlvbnNcIjtcbmltcG9ydCB7IHNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3NcIjtcbmltcG9ydCB7IGdldFNpemUsIGlzTW9iaWxlLCBzY3JvbGxFbGVtZW50QnlDaGlsZElkIH0gZnJvbSBcIi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IFN1cnZleUVycm9yIH0gZnJvbSBcIi4vc3VydmV5LWVycm9yXCI7XG5pbXBvcnQgeyBJQWN0aW9uIH0gZnJvbSBcIi4vYWN0aW9ucy9hY3Rpb25cIjtcbmltcG9ydCB7IENzc0NsYXNzQnVpbGRlciB9IGZyb20gXCIuL3V0aWxzL2Nzc0NsYXNzQnVpbGRlclwiO1xuXG4vKipcbiAqIFRoZSBgU3VydmV5YCBvYmplY3QgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN1cnZleSwgUGFnZXMsIFF1ZXN0aW9ucywgZmxvdyBsb2dpYyBhbmQgZXRjLlxuICovXG5leHBvcnQgY2xhc3MgU3VydmV5TW9kZWwgZXh0ZW5kcyBTdXJ2ZXlFbGVtZW50Q29yZVxuICBpbXBsZW1lbnRzXG4gIElTdXJ2ZXksXG4gIElTdXJ2ZXlEYXRhLFxuICBJU3VydmV5SW1wbCxcbiAgSVN1cnZleVRyaWdnZXJPd25lcixcbiAgSVN1cnZleUVycm9yT3duZXIge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRlbXBsYXRlUmVuZGVyZXJDb21wb25lbnROYW1lOiBzdHJpbmcgPVxuICAgIFwic3YtdGVtcGxhdGUtcmVuZGVyZXJcIjtcbiAgW2luZGV4OiBzdHJpbmddOiBhbnk7XG4gIHByaXZhdGUgc3RhdGljIHN0eWxlc01hbmFnZXI6IFN0eWxlc01hbmFnZXIgPSBudWxsO1xuICBwdWJsaWMgc3RhdGljIHBsYXRmb3JtOiBzdHJpbmcgPSBcInVua25vd25cIjtcbiAgcHVibGljIGdldCBwbGF0Zm9ybU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU3VydmV5TW9kZWwucGxhdGZvcm07XG4gIH1cbiAgLyoqXG4gICAqIFlvdSBjYW4gZGlzcGxheSBhbiBhZGRpdGlvbmFsIGZpZWxkIChjb21tZW50IGZpZWxkKSBmb3IgdGhlIG1vc3Qgb2YgcXVlc3Rpb25zOyB1c2VycyBjYW4gZW50ZXIgYWRkaXRpb25hbCBjb21tZW50cyB0byB0aGVpciByZXNwb25zZS5cbiAgICogVGhlIGNvbW1lbnQgZmllbGQgaW5wdXQgaXMgc2F2ZWQgYXMgYCdxdWVzdGlvbiBuYW1lJyArICdjb21tZW50UHJlZml4J2AuXG4gICAqIEBzZWUgZGF0YVxuICAgKiBAc2VlIFF1ZXN0aW9uLmhhc0NvbW1lbnRcbiAgICovXG4gIHB1YmxpYyBnZXQgY29tbWVudFByZWZpeCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBzZXR0aW5ncy5jb21tZW50UHJlZml4O1xuICB9XG4gIHB1YmxpYyBzZXQgY29tbWVudFByZWZpeCh2YWw6IHN0cmluZykge1xuICAgIHNldHRpbmdzLmNvbW1lbnRQcmVmaXggPSB2YWw7XG4gIH1cblxuICBwcml2YXRlIGdldCBjdXJyZW50UGFnZVZhbHVlKCk6IFBhZ2VNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImN1cnJlbnRQYWdlVmFsdWVcIiwgbnVsbCk7XG4gIH1cbiAgcHJpdmF0ZSBzZXQgY3VycmVudFBhZ2VWYWx1ZSh2YWw6IFBhZ2VNb2RlbCkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImN1cnJlbnRQYWdlVmFsdWVcIiwgdmFsKTtcbiAgfVxuXG4gIHByaXZhdGUgdmFsdWVzSGFzaDogSGFzaFRhYmxlPGFueT4gPSB7fTtcbiAgcHJpdmF0ZSB2YXJpYWJsZXNIYXNoOiBIYXNoVGFibGU8YW55PiA9IHt9O1xuICBwcml2YXRlIGVkaXRpbmdPYmpWYWx1ZTogQmFzZTtcblxuICBwcml2YXRlIGxvY2FsZVZhbHVlOiBzdHJpbmcgPSBcIlwiO1xuXG4gIHByaXZhdGUgdGV4dFByZVByb2Nlc3NvcjogVGV4dFByZVByb2Nlc3NvcjtcbiAgcHJpdmF0ZSBjb21wbGV0ZWRTdGF0ZVZhbHVlOiBzdHJpbmcgPSBcIlwiO1xuICBwcml2YXRlIGNvbXBsZXRlZFN0YXRlVGV4dFZhbHVlOiBzdHJpbmcgPSBcIlwiO1xuXG4gIHByaXZhdGUgaXNUaW1lclN0YXJ0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvLyNyZWdpb24gRXZlbnQgZGVjbGFyYXRpb25zXG5cbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBiZWZvcmUgdGhlIHN1cnZleSBpcyBjb21wbGV0ZWQgYW5kIHRoZSBgb25Db21wbGV0ZWAgZXZlbnQgaXMgZmlyZWQuIFlvdSBjYW4gcHJldmVudCB0aGUgc3VydmV5IGZyb20gY29tcGxldGluZyBieSBzZXR0aW5nIGBvcHRpb25zLmFsbG93Q29tcGxldGVgIHRvIGBmYWxzZWBcbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMuYWxsb3dDb21wbGV0ZWAgLSBTcGVjaWZpZXMgd2hldGhlciBhIHVzZXIgY2FuIGNvbXBsZXRlIGEgc3VydmV5LiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBgZmFsc2VgIHRvIHByZXZlbnQgdGhlIHN1cnZleSBmcm9tIGNvbXBsZXRpbmcuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGB0cnVlYC5cbiAgICogPGJyLz4gYG9wdGlvbnMuaXNDb21wbGV0ZU9uVHJpZ2dlcmAgLSByZXR1cm5zIHRydWUgaWYgdGhlIHN1cnZleSBpcyBjb21wbGV0aW5nIG9uIFwiY29tcGxldGVcIiB0cmlnZ2VyLlxuICAgKiBAc2VlIG9uQ29tcGxldGVcbiAgICovXG4gIHB1YmxpYyBvbkNvbXBsZXRpbmc6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFN1cnZleU1vZGVsPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGFmdGVyIGEgdXNlciBjbGlja3MgdGhlICdDb21wbGV0ZScgYnV0dG9uIGFuZCBmaW5pc2hlcyBhIHN1cnZleS4gVXNlIHRoaXMgZXZlbnQgdG8gc2VuZCB0aGUgc3VydmV5IGRhdGEgdG8geW91ciB3ZWIgc2VydmVyLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5zaG93RGF0YVNhdmluZyh0ZXh0KWAgLSBjYWxsIHRoaXMgbWV0aG9kIHRvIHNob3cgdGhhdCB0aGUgc3VydmV5IGlzIHNhdmluZyBzdXJ2ZXkgZGF0YSBvbiB5b3VyIHNlcnZlci4gVGhlIGB0ZXh0YCBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgdG8gc2hvdyBhIGN1c3RvbSBtZXNzYWdlIGluc3RlYWQgb2YgZGVmYXVsdC5cbiAgICogPGJyLz4gYG9wdGlvbnMuc2hvd0RhdGFTYXZpbmdFcnJvcih0ZXh0KWAgLSBjYWxsIHRoaXMgbWV0aG9kIHRvIHNob3cgdGhhdCBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBzYXZpbmcgdGhlIGRhdGEgb24geW91ciBzZXJ2ZXIuIElmIHlvdSB3YW50IHRvIHNob3cgYSBjdXN0b20gZXJyb3IsIHVzZSBhbiBvcHRpb25hbCBgdGV4dGAgcGFyYW1ldGVyLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5zaG93RGF0YVNhdmluZ1N1Y2Nlc3ModGV4dClgIC0gY2FsbCB0aGlzIG1ldGhvZCB0byBzaG93IHRoYXQgdGhlIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSBzYXZlZCBvbiB0aGUgc2VydmVyLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5zaG93RGF0YVNhdmluZ0NsZWFyYCAtIGNhbGwgdGhpcyBtZXRob2QgdG8gaGlkZSB0aGUgdGV4dCBhYm91dCB0aGUgc2F2aW5nIHByb2dyZXNzLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5pc0NvbXBsZXRlT25UcmlnZ2VyYCAtIHJldHVybnMgdHJ1ZSBpZiB0aGUgc3VydmV5IGlzIGNvbXBsZXRlZCBvbiBcImNvbXBsZXRlXCIgdHJpZ2dlci5cbiAgICogIEBzZWUgZGF0YVxuICAgKiBAc2VlIGNsZWFySW52aXNpYmxlVmFsdWVzXG4gICAqIEBzZWUgY29tcGxldGVMYXN0UGFnZVxuICAgKiBAc2VlIHN1cnZleVBvc3RJZFxuICAgKi9cbiAgcHVibGljIG9uQ29tcGxldGU6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFN1cnZleU1vZGVsPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGJlZm9yZSB0aGUgc3VydmV5IGlzIGdvaW5nIHRvIHByZXZpZXcgbW9kZSwgc3RhdGUgZXF1YWxzIHRvIGBwcmV2aWV3YC4gSXQgaGFwcGVucyB3aGVuIGEgdXNlciBjbGljayBvbiBcIlByZXZpZXdcIiBidXR0b24uIEl0IHNob3dzIHdoZW4gXCJzaG93UHJldmlld0JlZm9yZUNvbXBsZXRlXCIgcHJvZXBydHkgZXF1YWxzIHRvIFwic2hvd0FsbFF1ZXN0aW9uc1wiIG9yIFwic2hvd0Fuc3dlcmVkUXVlc3Rpb25zXCIuXG4gICAqIFlvdSBjYW4gcHJldmVudCBzaG93aW5nIGl0IGJ5IHNldHRpbmcgYWxsb3dTaG93UHJldmlldyB0byBgZmFsc2VgLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5hbGxvd1Nob3dQcmV2aWV3YCAtIFNwZWNpZmllcyB3aGV0aGVyIGEgdXNlciBjYW4gc2VlIGEgcHJldmlldy4gU2V0IHRoaXMgcHJvcGVydHkgdG8gYGZhbHNlYCB0byBwcmV2ZW50IGZyb20gc2hvd2luZyB0aGUgcHJldmlldy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYHRydWVgLlxuICAgKiBAc2VlIHNob3dQcmV2aWV3QmVmb3JlQ29tcGxldGVcbiAgICovXG4gIHB1YmxpYyBvblNob3dpbmdQcmV2aWV3OiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxcbiAgICBTdXJ2ZXlNb2RlbFxuICA+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgYWZ0ZXIgYSB1c2VyIGNsaWNrcyB0aGUgJ0NvbXBsZXRlJyBidXR0b24uIFRoZSBldmVudCBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIFVSTCBvcGVuZWQgYWZ0ZXIgY29tcGxldGluZyBhIHN1cnZleS5cbiAgICogU3BlY2lmeSB0aGUgYG5hdmlnYXRlVG9VcmxgIHByb3BlcnR5IHRvIG1ha2Ugc3VydmV5IG5hdmlnYXRlIHRvIGFub3RoZXIgdXJsLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy51cmxgIC0gU3BlY2lmaWVzIGEgVVJMIG9wZW5lZCBhZnRlciBjb21wbGV0aW5nIGEgc3VydmV5LiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBhbiBlbXB0eSBzdHJpbmcgdG8gY2FuY2VsIHRoZSBuYXZpZ2F0aW9uIGFuZCBzaG93IHRoZSBjb21wbGV0ZWQgc3VydmV5IHBhZ2UuXG4gICAqIEBzZWUgbmF2aWdhdGVUb1VybFxuICAgKiBAc2VlIG5hdmlnYXRlVG9VcmxPbkNvbmRpdGlvblxuICAgKi9cbiAgcHVibGljIG9uTmF2aWdhdGVUb1VybDogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8U3VydmV5TW9kZWw+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgYWZ0ZXIgdGhlIHN1cnZleSBjaGFuZ2VkIGl0J3Mgc3RhdGUgZnJvbSBcInN0YXJ0aW5nXCIgdG8gXCJydW5uaW5nXCIuIFRoZSBcInN0YXJ0aW5nXCIgc3RhdGUgbWVhbnMgdGhhdCBzdXJ2ZXkgc2hvd3MgdGhlIHN0YXJ0ZWQgcGFnZS5cbiAgICogVGhlIGBmaXJzdFBhZ2VJc1N0YXJ0ZWRgIHByb3BlcnR5IHNob3VsZCBiZSBzZXQgdG8gYHRydWVgLCBpZiB5b3Ugd2FudCB0byBkaXNwbGF5IGEgc3RhcnQgcGFnZSBpbiB5b3VyIHN1cnZleS4gSW4gdGhpcyBjYXNlLCBhbiBlbmQgdXNlciBzaG91bGQgY2xpY2sgdGhlIFwiU3RhcnRcIiBidXR0b24gdG8gc3RhcnQgdGhlIHN1cnZleS5cbiAgICogQHNlZSBmaXJzdFBhZ2VJc1N0YXJ0ZWRcbiAgICovXG4gIHB1YmxpYyBvblN0YXJ0ZWQ6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFN1cnZleU1vZGVsPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIG9uIGNsaWNraW5nIHRoZSAnTmV4dCcgYnV0dG9uIGlmIHRoZSBgc2VuZFJlc3VsdE9uUGFnZU5leHRgIGlzIHNldCB0byBgdHJ1ZWAuIFlvdSBjYW4gdXNlIGl0IHRvIHNhdmUgdGhlIGludGVybWVkaWF0ZSByZXN1bHRzLCBmb3IgZXhhbXBsZSwgaWYgeW91ciBzdXJ2ZXkgaXMgbGFyZ2UgZW5vdWdoLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiBAc2VlIHNlbmRSZXN1bHRPblBhZ2VOZXh0XG4gICAqL1xuICBwdWJsaWMgb25QYXJ0aWFsU2VuZDogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8U3VydmV5TW9kZWw+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgYmVmb3JlIHRoZSBjdXJyZW50IHBhZ2UgY2hhbmdlcyB0byBhbm90aGVyIHBhZ2UuIFR5cGljYWxseSBpdCBoYXBwZW5zIHdoZW4gYSB1c2VyIGNsaWNrIHRoZSAnTmV4dCcgb3IgJ1ByZXYnIGJ1dHRvbnMuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb24ub2xkQ3VycmVudFBhZ2VgIC0gdGhlIHByZXZpb3VzIGN1cnJlbnQvYWN0aXZlIHBhZ2UuXG4gICAqIDxici8+IGBvcHRpb24ubmV3Q3VycmVudFBhZ2VgIC0gYSBuZXcgY3VycmVudC9hY3RpdmUgcGFnZS5cbiAgICogPGJyLz4gYG9wdGlvbi5hbGxvd0NoYW5naW5nYCAtIHNldCBpdCB0byBgZmFsc2VgIHRvIGRpc2FibGUgdGhlIGN1cnJlbnQgcGFnZSBjaGFuZ2luZy4gSXQgaXMgYHRydWVgIGJ5IGRlZmF1bHQuXG4gICAqIDxici8+IGBvcHRpb24uaXNOZXh0UGFnZWAgLSBjb21tb25seSBtZWFucywgdGhhdCBlbmQtdXNlciBwcmVzcyB0aGUgbmV4dCBwYWdlIGJ1dHRvbi4gSW4gZ2VuZXJhbCwgaXQgbWVhbnMgdGhhdCBvcHRpb25zLm5ld0N1cnJlbnRQYWdlIGlzIHRoZSBuZXh0IHBhZ2UgYWZ0ZXIgb3B0aW9ucy5vbGRDdXJyZW50UGFnZVxuICAgKiA8YnIvPiBgb3B0aW9uLmlzUHJldlBhZ2VgIC0gY29tbW9ubHkgbWVhbnMsIHRoYXQgZW5kLXVzZXIgcHJlc3MgdGhlIHByZXZpb3VzIHBhZ2UgYnV0dG9uLiBJbiBnZW5lcmFsLCBpdCBtZWFucyB0aGF0IG9wdGlvbnMubmV3Q3VycmVudFBhZ2UgaXMgdGhlIHByZXZpb3VzIHBhZ2UgYmVmb3JlIG9wdGlvbnMub2xkQ3VycmVudFBhZ2VcbiAgICogQHNlZSBjdXJyZW50UGFnZVxuICAgKiBAc2VlIGN1cnJlbnRQYWdlTm9cbiAgICogQHNlZSBuZXh0UGFnZVxuICAgKiBAc2VlIHByZXZQYWdlXG4gICAqIEBzZWUgY29tcGxldGVMYXN0UGFnZVxuICAgKiBAc2VlIG9uQ3VycmVudFBhZ2VDaGFuZ2VkXG4gICAqKi9cbiAgcHVibGljIG9uQ3VycmVudFBhZ2VDaGFuZ2luZzogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIHdoZW4gdGhlIGN1cnJlbnQgcGFnZSBoYXMgYmVlbiBjaGFuZ2VkIHRvIGFub3RoZXIgcGFnZS4gVHlwaWNhbGx5IGl0IGhhcHBlbnMgd2hlbiBhIHVzZXIgY2xpY2sgb24gJ05leHQnIG9yICdQcmV2JyBidXR0b25zLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9uLm9sZEN1cnJlbnRQYWdlYCAtIGEgcHJldmlvdXMgY3VycmVudC9hY3RpdmUgcGFnZS5cbiAgICogPGJyLz4gYG9wdGlvbi5uZXdDdXJyZW50UGFnZWAgLSBhIG5ldyBjdXJyZW50L2FjdGl2ZSBwYWdlLlxuICAgKiA8YnIvPiBgb3B0aW9uLmlzTmV4dFBhZ2VgIC0gY29tbW9ubHkgbWVhbnMsIHRoYXQgZW5kLXVzZXIgcHJlc3MgdGhlIG5leHQgcGFnZSBidXR0b24uIEluIGdlbmVyYWwsIGl0IG1lYW5zIHRoYXQgb3B0aW9ucy5uZXdDdXJyZW50UGFnZSBpcyB0aGUgbmV4dCBwYWdlIGFmdGVyIG9wdGlvbnMub2xkQ3VycmVudFBhZ2VcbiAgICogPGJyLz4gYG9wdGlvbi5pc1ByZXZQYWdlYCAtIGNvbW1vbmx5IG1lYW5zLCB0aGF0IGVuZC11c2VyIHByZXNzIHRoZSBwcmV2aW91cyBwYWdlIGJ1dHRvbi4gSW4gZ2VuZXJhbCwgaXQgbWVhbnMgdGhhdCBvcHRpb25zLm5ld0N1cnJlbnRQYWdlIGlzIHRoZSBwcmV2aW91cyBwYWdlIGJlZm9yZSBvcHRpb25zLm9sZEN1cnJlbnRQYWdlXG4gICAqIEBzZWUgY3VycmVudFBhZ2VcbiAgICogQHNlZSBjdXJyZW50UGFnZU5vXG4gICAqIEBzZWUgbmV4dFBhZ2VcbiAgICogQHNlZSBwcmV2UGFnZVxuICAgKiBAc2VlIGNvbXBsZXRlTGFzdFBhZ2VcbiAgICogQHNlZSBvbkN1cnJlbnRQYWdlQ2hhbmdpbmdcbiAgICovXG4gIHB1YmxpYyBvbkN1cnJlbnRQYWdlQ2hhbmdlZDogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGJlZm9yZSB0aGUgcXVlc3Rpb24gdmFsdWUgKGFuc3dlcikgaXMgY2hhbmdlZC4gSXQgY2FuIGJlIGRvbmUgdmlhIFVJIGJ5IGEgdXNlciBvciBwcm9ncmFtbWF0aWNhbGx5IG9uIGNhbGxpbmcgdGhlIGBzZXRWYWx1ZWAgbWV0aG9kLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5uYW1lYCAtIHRoZSB2YWx1ZSBuYW1lIHRoYXQgaGFzIGJlaW5nIGNoYW5nZWQuXG4gICAqIDxici8+IGBvcHRpb25zLnF1ZXN0aW9uYCAtIGEgcXVlc3Rpb24gd2hpY2ggYHF1ZXN0aW9uLm5hbWVgIGVxdWFscyB0byB0aGUgdmFsdWUgbmFtZS4gSWYgdGhlcmUgYXJlIHNldmVyYWwgcXVlc3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZSwgdGhlIGZpcnN0IHF1ZXN0aW9uIGlzIHVzZWQuIElmIHRoZXJlIGlzIG5vIHN1Y2ggcXVlc3Rpb25zLCB0aGUgYG9wdGlvbnMucXVlc3Rpb25gIGlzIG51bGwuXG4gICAqIDxici8+IGBvcHRpb25zLm9sZFZhbHVlYCAtIGFuIG9sZCwgcHJldmlvdXMgdmFsdWUuXG4gICAqIDxici8+IGBvcHRpb25zLnZhbHVlYCAtIGEgbmV3IHZhbHVlLiBZb3UgY2FuIGNoYW5nZSBpdC5cbiAgICogQHNlZSBzZXRWYWx1ZVxuICAgKiBAc2VlIG9uVmFsdWVDaGFuZ2VkXG4gICAqL1xuICBwdWJsaWMgb25WYWx1ZUNoYW5naW5nOiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxTdXJ2ZXlNb2RlbD4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCB3aGVuIHRoZSBxdWVzdGlvbiB2YWx1ZSAoaS5lLiwgYW5zd2VyKSBoYXMgYmVlbiBjaGFuZ2VkLiBUaGUgcXVlc3Rpb24gdmFsdWUgY2FuIGJlIGNoYW5nZWQgaW4gVUkgKGJ5IGEgdXNlcikgb3IgcHJvZ3JhbW1hdGljYWxseSAob24gY2FsbGluZyBgc2V0VmFsdWVgIG1ldGhvZCkuXG4gICAqIFVzZSB0aGUgYG9uRHluYW1pY1BhbmVsSXRlbVZhbHVlQ2hhbmdlZGAgYW5kIGBvbk1hdHJpeENlbGxWYWx1ZUNoYW5nZWRgIGV2ZW50cyB0byBoYW5kbGUgY2hhbmdlcyBpbiBhIHF1ZXN0aW9uIGluIHRoZSBQYW5lbCBEeW5hbWljIGFuZCBhIGNlbGwgcXVlc3Rpb24gaW4gbWF0cmljZXMuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLm5hbWVgIC0gdGhlIHZhbHVlIG5hbWUgdGhhdCBoYXMgYmVlbiBjaGFuZ2VkLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5xdWVzdGlvbmAgLSBhIHF1ZXN0aW9uIHdoaWNoIGBxdWVzdGlvbi5uYW1lYCBlcXVhbHMgdG8gdGhlIHZhbHVlIG5hbWUuIElmIHRoZXJlIGFyZSBzZXZlcmFsIHF1ZXN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUsIHRoZSBmaXJzdCBxdWVzdGlvbiBpcyB1c2VkLiBJZiB0aGVyZSBpcyBubyBzdWNoIHF1ZXN0aW9ucywgdGhlIGBvcHRpb25zLnF1ZXN0aW9uYCBpcyBgbnVsbGAuXG4gICAqIDxici8+IGBvcHRpb25zLnZhbHVlYCAtIGEgbmV3IHZhbHVlLlxuICAgKiBAc2VlIHNldFZhbHVlXG4gICAqIEBzZWUgb25WYWx1ZUNoYW5naW5nXG4gICAqIEBzZWUgb25EeW5hbWljUGFuZWxJdGVtVmFsdWVDaGFuZ2VkXG4gICAqIEBzZWUgb25NYXRyaXhDZWxsVmFsdWVDaGFuZ2VkXG4gICAqL1xuICBwdWJsaWMgb25WYWx1ZUNoYW5nZWQ6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFN1cnZleU1vZGVsPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIHdoZW4gc2V0VmFyaWFibGUgZnVuY3Rpb24gaXMgY2FsbGVkLiBJdCBjYW4gYmUgY2FsbGVkIG9uIGNoYW5naW5nIGEgY2FsY3VsYXRlZCB2YWx1ZS5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMubmFtZWAgLSB0aGUgdmFyaWFibGUgbmFtZSB0aGF0IGhhcyBiZWVuIGNoYW5nZWQuXG4gICAqIDxici8+IGBvcHRpb25zLnZhbHVlYCAtIGEgbmV3IHZhbHVlLlxuICAgKiBAc2VlIHNldFZhcmlhYmxlXG4gICAqIEBzZWUgb25WYWx1ZUNoYW5nZWRcbiAgICogQHNlZSBjYWxjdWxhdGVkVmFsdWVzXG4gICAqL1xuICBwdWJsaWMgb25WYXJpYWJsZUNoYW5nZWQ6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFN1cnZleU1vZGVsPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIHdoZW4gYSBxdWVzdGlvbiB2aXNpYmlsaXR5IGhhcyBiZWVuIGNoYW5nZWQuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLnF1ZXN0aW9uYCAtIGEgcXVlc3Rpb24gd2hpY2ggdmlzaWJpbGl0eSBoYXMgYmVlbiBjaGFuZ2VkLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5uYW1lYCAtIGEgcXVlc3Rpb24gbmFtZS5cbiAgICogPGJyLz4gYG9wdGlvbnMudmlzaWJsZWAgLSBhIHF1ZXN0aW9uIGB2aXNpYmxlYCBib29sZWFuIHZhbHVlLlxuICAgKiBAc2VlIFF1ZXN0aW9uLnZpc2liaWxlXG4gICAqIEBzZWUgUXVlc3Rpb24udmlzaWJpbGVJZlxuICAgKi9cbiAgcHVibGljIG9uVmlzaWJsZUNoYW5nZWQ6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiBjaGFuZ2luZyBhIHBhZ2UgdmlzaWJpbGl0eS5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucGFnZWAgLSBhIHBhZ2Ugd2hpY2ggdmlzaWJpbGl0eSBoYXMgYmVlbiBjaGFuZ2VkLlxuICAgKiA8YnIvPiBgb3B0aW9ucy52aXNpYmxlYCAtIGEgcGFnZSBgdmlzaWJsZWAgYm9vbGVhbiB2YWx1ZS5cbiAgICogQHNlZSBQYWdlTW9kZWwudmlzaWJpbGVcbiAgICogQHNlZSBQYWdlTW9kZWwudmlzaWJpbGVJZlxuICAgKi9cbiAgcHVibGljIG9uUGFnZVZpc2libGVDaGFuZ2VkOiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxcbiAgICBTdXJ2ZXlNb2RlbFxuICA+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gY2hhbmdpbmcgYSBwYW5lbCB2aXNpYmlsaXR5LlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5wYW5lbGAgLSBhIHBhbmVsIHdoaWNoIHZpc2liaWxpdHkgaGFzIGJlZW4gY2hhbmdlZC5cbiAgICogPGJyLz4gYG9wdGlvbnMudmlzaWJsZWAgLSBhIHBhbmVsIGB2aXNpYmxlYCBib29sZWFuIHZhbHVlLlxuICAgKiBAc2VlIFBhbmVsTW9kZWwudmlzaWJpbGVcbiAgICogQHNlZSBQYW5lbE1vZGVsLnZpc2liaWxlSWZcbiAgICovXG4gIHB1YmxpYyBvblBhbmVsVmlzaWJsZUNoYW5nZWQ6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiBjcmVhdGluZyBhIG5ldyBxdWVzdGlvbi5cbiAgICogVW5saWtlIHRoZSBvblF1ZXN0aW9uQWRkZWQgZXZlbnQsIHRoaXMgZXZlbnQgY2FsbHMgZm9yIGFsbCBxdWVzdGlvbiBjcmVhdGVkIGluIHN1cnZleSBpbmNsdWRpbmcgaW5zaWRlOiBhIHBhZ2UsIHBhbmVsLCBtYXRyaXggY2VsbCwgZHluYW1pYyBwYW5lbCBhbmQgbXVsdGlwbGUgdGV4dC5cbiAgICogb3IgaW5zaWRlIGEgbWF0cml4IGNlbGwgb3IgaXQgY2FuIGJlIGEgdGV4dCBxdWVzdGlvbiBpbiBtdWx0aXBsZSB0ZXh0IGl0ZW1zIG9yIGluc2lkZSBhIHBhbmVsIG9mIGEgcGFuZWwgZHluYW1pYy5cbiAgICogWW91IGNhbiB1c2UgdGhpcyBldmVudCB0byBzZXQgdXAgcHJvcGVydGllcyB0byBhIHF1ZXN0aW9uIGJhc2VkIG9uIGl0J3MgdHlwZSBmb3IgYWxsIHF1ZXN0aW9ucywgcmVnYXJkbGVzcyB3aGVyZSB0aGV5IGFyZSBsb2NhdGVkLCBvbiB0aGUgcGFnZSBvciBpbnNpZGUgYSBtYXRyaXggY2VsbC5cbiAgICogUGxlYXNlIG5vdGU6IElmIHlvdSB3YW50IHRvIHVzZSB0aGlzIGV2ZW50IGZvciBxdWVzdGlvbnMgbG9hZGVkIGZyb20gSlNPTiB0aGVuIHlvdSBoYXZlIHRvIGNyZWF0ZSBzdXJ2ZXkgd2l0aCBlbXB0eS9udWxsIEpTT04gcGFyYW1ldGVyLCBhc3NpZ24gdGhlIGV2ZW50IGFuZCBjYWxsIHN1cnZleS5mcm9tSlNPTih5b3VySlNPTikgZnVuY3Rpb24uXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLnF1ZXN0aW9uYCAtIGEgbmV3bHkgY3JlYXRlZCBxdWVzdGlvbiBvYmplY3QuXG4gICAqIEBzZWUgUXVlc3Rpb25cbiAgICogQHNlZSBvblF1ZXN0aW9uQWRkZWRcbiAgICovXG4gIHB1YmxpYyBvblF1ZXN0aW9uQ3JlYXRlZDogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIG9uIGFkZGluZyBhIG5ldyBxdWVzdGlvbiBpbnRvIHN1cnZleS5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucXVlc3Rpb25gIC0gYSBuZXdseSBhZGRlZCBxdWVzdGlvbiBvYmplY3QuXG4gICAqIDxici8+IGBvcHRpb25zLm5hbWVgIC0gYSBxdWVzdGlvbiBuYW1lLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5pbmRleGAgLSBhbiBpbmRleCBvZiB0aGUgcXVlc3Rpb24gaW4gdGhlIGNvbnRhaW5lciAocGFnZSBvciBwYW5lbCkuXG4gICAqIDxici8+IGBvcHRpb25zLnBhcmVudFBhbmVsYCAtIGEgY29udGFpbmVyIHdoZXJlIGEgbmV3IHF1ZXN0aW9uIGlzIGxvY2F0ZWQuIEl0IGNhbiBiZSBhIHBhZ2Ugb3IgcGFuZWwuXG4gICAqIDxici8+IGBvcHRpb25zLnJvb3RQYW5lbGAgLSB0eXBpY2FsbHksIGl0IGlzIGEgcGFnZS5cbiAgICogQHNlZSBRdWVzdGlvblxuICAgKiBAc2VlIG9uUXVlc3Rpb25DcmVhdGVkXG4gICAqL1xuICBwdWJsaWMgb25RdWVzdGlvbkFkZGVkOiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxTdXJ2ZXlNb2RlbD4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiByZW1vdmluZyBhIHF1ZXN0aW9uIGZyb20gc3VydmV5LlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5xdWVzdGlvbmAgLSBhIHJlbW92ZWQgcXVlc3Rpb24gb2JqZWN0LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5uYW1lYCAtIGEgcXVlc3Rpb24gbmFtZS5cbiAgICogQHNlZSBRdWVzdGlvblxuICAgKi9cbiAgcHVibGljIG9uUXVlc3Rpb25SZW1vdmVkOiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxcbiAgICBTdXJ2ZXlNb2RlbFxuICA+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gYWRkaW5nIGEgcGFuZWwgaW50byBzdXJ2ZXkuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLnBhbmVsYCAtIGEgbmV3bHkgYWRkZWQgcGFuZWwgb2JqZWN0LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5uYW1lYCAtIGEgcGFuZWwgbmFtZS5cbiAgICogPGJyLz4gYG9wdGlvbnMuaW5kZXhgIC0gYW4gaW5kZXggb2YgdGhlIHBhbmVsIGluIHRoZSBjb250YWluZXIgKGEgcGFnZSBvciBwYW5lbCkuXG4gICAqIDxici8+IGBvcHRpb25zLnBhcmVudFBhbmVsYCAtIGEgY29udGFpbmVyIChhIHBhZ2Ugb3IgcGFuZWwpIHdoZXJlIGEgbmV3IHBhbmVsIGlzIGxvY2F0ZWQuXG4gICAqIDxici8+IGBvcHRpb25zLnJvb3RQYW5lbGAgLSBhIHJvb3QgY29udGFpbmVyLCB0eXBpY2FsbHkgaXQgaXMgYSBwYWdlLlxuICAgKiBAc2VlIFBhbmVsTW9kZWxcbiAgICovXG4gIHB1YmxpYyBvblBhbmVsQWRkZWQ6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFN1cnZleU1vZGVsPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIG9uIHJlbW92aW5nIGEgcGFuZWwgZnJvbSBzdXJ2ZXkuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLnBhbmVsYCAtIGEgcmVtb3ZlZCBwYW5lbCBvYmplY3QuXG4gICAqIDxici8+IGBvcHRpb25zLm5hbWVgIC0gYSBwYW5lbCBuYW1lLlxuICAgKiBAc2VlIFBhbmVsTW9kZWxcbiAgICovXG4gIHB1YmxpYyBvblBhbmVsUmVtb3ZlZDogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8U3VydmV5TW9kZWw+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gYWRkaW5nIGEgcGFnZSBpbnRvIHN1cnZleS5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucGFnZWAgLSBhIG5ld2x5IGFkZGVkIGBwYW5lbGAgb2JqZWN0LlxuICAgKiBAc2VlIFBhbmVsTW9kZWxcbiAgICovXG4gIHB1YmxpYyBvblBhZ2VBZGRlZDogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8U3VydmV5TW9kZWw+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gdmFsaWRhdGluZyB2YWx1ZSBpbiBhIHF1ZXN0aW9uLiBZb3UgY2FuIHNwZWNpZnkgYSBjdXN0b20gZXJyb3IgbWVzc2FnZSB1c2luZyBgb3B0aW9ucy5lcnJvcmAuIFRoZSBzdXJ2ZXkgYmxvY2tzIGNvbXBsZXRpbmcgdGhlIHN1cnZleSBvciBnb2luZyB0byB0aGUgbmV4dCBwYWdlIHdoZW4gdGhlIGVycm9yIG1lc3NhZ2VzIGFyZSBkaXNwbGF5ZWQuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLnF1ZXN0aW9uYCAtIGEgdmFsaWRhdGVkIHF1ZXN0aW9uLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5uYW1lYCAtIGEgcXVlc3Rpb24gbmFtZS5cbiAgICogPGJyLz4gYG9wdGlvbnMudmFsdWVgIC0gdGhlIGN1cnJlbnQgcXVlc3Rpb24gdmFsdWUgKGFuc3dlcikuXG4gICAqIDxici8+IGBvcHRpb25zLmVycm9yYCAtIGFuIGVycm9yIHN0cmluZy4gSXQgaXMgZW1wdHkgYnkgZGVmYXVsdC5cbiAgICogQHNlZSBvblNlcnZlclZhbGlkYXRlUXVlc3Rpb25zXG4gICAqIEBzZWUgb25TZXR0aW5nUXVlc3Rpb25FcnJvcnNcbiAgICovXG4gIHB1YmxpYyBvblZhbGlkYXRlUXVlc3Rpb246IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBiZWZvcmUgZXJyb3JzIGFyZSBhc3NpZ25lZCB0byBhIHF1ZXN0aW9uLiBZb3UgbWF5IGFkZC9yZW1vdmUvbW9kaWZ5IGVycm9ycyBmb3IgYSBxdWVzdGlvbi5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucXVlc3Rpb25gIC0gYSB2YWxpZGF0ZWQgcXVlc3Rpb24uXG4gICAqIDxici8+IGBvcHRpb25zLmVycm9yc2AgLSB0aGUgbGlzdCBvZiBlcnJvcnMuIFRoZSBsaXN0IGlzIGVtcHR5IGJ5IGRlZmF1bHQgYW5kIHJlbWFpbnMgZW1wdHkgaWYgYSB2YWxpZGF0ZWQgcXVlc3Rpb24gaGFzIG5vIGVycm9ycy5cbiAgICogQHNlZSBvblZhbGlkYXRlUXVlc3Rpb25cbiAgICovXG4gIHB1YmxpYyBvblNldHRpbmdRdWVzdGlvbkVycm9yczogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuICAvKipcbiAgICogVXNlIHRoaXMgZXZlbnQgdG8gdmFsaWRhdGUgZGF0YSBvbiB5b3VyIHNlcnZlci5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMuZGF0YWAgLSB0aGUgdmFsdWVzIG9mIGFsbCBub24tZW1wdHkgcXVlc3Rpb25zIG9uIHRoZSBjdXJyZW50IHBhZ2UuIFlvdSBjYW4gZ2V0IGEgcXVlc3Rpb24gdmFsdWUgYXMgYG9wdGlvbnMuZGF0YVtcIm15UXVlc3Rpb25OYW1lXCJdYC5cbiAgICogPGJyLz4gYG9wdGlvbnMuZXJyb3JzYCAtIHNldCB5b3VyIGVycm9ycyB0byB0aGlzIG9iamVjdCBhczogYG9wdGlvbnMuZXJyb3JzW1wibXlRdWVzdGlvbk5hbWVcIl0gPSBcIkVycm9yIHRleHRcIjtgLiBJdCB3aWxsIGJlIHNob3duIGFzIGEgcXVlc3Rpb24gZXJyb3IuXG4gICAqIDxici8+IGBvcHRpb25zLmNvbXBsZXRlKClgIC0gY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHRlbGwgc3VydmV5IHRoYXQgeW91ciBzZXJ2ZXIgY2FsbGJhY2sgaGFzIGJlZW4gcHJvY2Vzc2VkLlxuICAgKiBAc2VlIG9uVmFsaWRhdGVRdWVzdGlvblxuICAgKiBAc2VlIG9uVmFsaWRhdGVQYW5lbFxuICAgKi9cbiAgcHVibGljIG9uU2VydmVyVmFsaWRhdGVRdWVzdGlvbnM6IGFueSA9IHRoaXMuYWRkRXZlbnQ8U3VydmV5TW9kZWw+KCk7XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBldmVudCB0byBtb2RpZnkgdGhlIEhUTUwgYmVmb3JlIHJlbmRlcmluZywgZm9yIGV4YW1wbGUgSFRNTCBvbiBhIGNvbXBsZXRlZCBwYWdlLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5odG1sYCAtIGFuIEhUTUwgdGhhdCB5b3UgbWF5IGNoYW5nZSBiZWZvcmUgdGV4dCBwcm9jZXNzaW5nIGFuZCB0aGVuIHJlbmRlcmluZy5cbiAgICogQHNlZSBjb21wbGV0ZWRIdG1sXG4gICAqIEBzZWUgbG9hZGluZ0h0bWxcbiAgICogQHNlZSBRdWVzdGlvbkh0bWxNb2RlbC5odG1sXG4gICAqL1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIG9uIHZhbGlkYXRpbmcgYSBwYW5lbC4gU2V0IHlvdXIgZXJyb3IgdG8gYG9wdGlvbnMuZXJyb3JgIGFuZCBzdXJ2ZXkgd2lsbCBzaG93IHRoZSBlcnJvciBmb3IgdGhlIHBhbmVsIGFuZCBibG9jayBjb21wbGV0aW5nIHRoZSBzdXJ2ZXkgb3IgZ29pbmcgdG8gdGhlIG5leHQgcGFnZS5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMubmFtZWAgLSBhIHBhbmVsIG5hbWUuXG4gICAqIDxici8+IGBvcHRpb25zLmVycm9yYCAtIGFuIGVycm9yIHN0cmluZy4gSXQgaXMgZW1wdHkgYnkgZGVmYXVsdC5cbiAgICogQHNlZSBvblZhbGlkYXRlUXVlc3Rpb25cbiAgICovXG4gIHB1YmxpYyBvblZhbGlkYXRlUGFuZWw6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFN1cnZleU1vZGVsPigpO1xuICAvKipcbiAgICogVXNlIHRoZSBldmVudCB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgZXJyb3IgdGV4dC5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMudGV4dGAgLSBhbiBlcnJvciB0ZXh0LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5lcnJvcmAgLSBhbiBpbnN0YW5jZSBvZiB0aGUgYFN1cnZleUVycm9yYCBvYmplY3QuXG4gICAqIDxici8+IGBvcHRpb25zLm5hbWVgIC0gdGhlIGVycm9yIG5hbWUuIFRoZSBmb2xsb3dpbmcgZXJyb3IgbmFtZXMgYXJlIGF2YWlsYWJsZTpcbiAgICogcmVxdWlyZWQsIHJlcXVpcmVvbmVhbnN3ZXIsIHJlcXVpcmVudW1lcmljLCBleGNlZWRzaXplLCB3ZWJyZXF1ZXN0LCB3ZWJyZXF1ZXN0ZW1wdHksIG90aGVyZW1wdHksXG4gICAqIHVwbG9hZGluZ2ZpbGUsIHJlcXVpcmVkaW5hbGxyb3dzZXJyb3IsIG1pbnJvd2NvdW50ZXJyb3IsIGtleWR1cGxpY2F0aW9uZXJyb3IsIGN1c3RvbVxuICAgKi9cbiAgcHVibGljIG9uRXJyb3JDdXN0b21UZXh0OiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxcbiAgICBTdXJ2ZXlNb2RlbFxuICA+KCk7XG4gIC8qKlxuICAgKiBVc2UgdGhlIHRoaXMgZXZlbnQgdG8gYmUgbm90aWZpZWQgd2hlbiB0aGUgc3VydmV5IGZpbmlzaGVkIHZhbGlkYXRlIHF1ZXN0aW9ucyBvbiB0aGUgY3VycmVudCBwYWdlLiBJdCBjb21tb25seSBoYXBwZW5zIHdoZW4gYSB1c2VyIHRyeSB0byBnbyB0byB0aGUgbmV4dCBwYWdlIG9yIGNvbXBsZXRlIHRoZSBzdXJ2ZXlcbiAgICogb3B0aW9ucy5xdWVzdGlvbnMgLSB0aGUgbGlzdCBvZiBxdWVzdGlvbnMgdGhhdCBoYXZlIGVycm9yc1xuICAgKiBvcHRpb25zLmVycm9ycyAtIHRoZSBsaXN0IG9mIGVycm9yc1xuICAgKiBvcHRpb25zLnBhZ2UgLSB0aGUgcGFnZSB3aGVyZSBxdWVzdGlvbihzKSBhcmUgbG9jYXRlZFxuICAgKi9cbiAgcHVibGljIG9uVmFsaWRhdGVkRXJyb3JzT25DdXJyZW50UGFnZTogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuICAvKipcbiAgICogVXNlIHRoaXMgZXZlbnQgdG8gbW9kaWZ5IHRoZSBIVE1MIGNvbnRlbnQgYmVmb3JlIHJlbmRlcmluZywgZm9yIGV4YW1wbGUgYGNvbXBsZXRlSHRtbGAgb3IgYGxvYWRpbmdIdG1sYC5cbiAgICogYG9wdGlvbnMuaHRtbGAgLSBzcGVjaWZpZXMgdGhlIG1vZGlmaWVkIEhUTUwgY29udGVudC5cbiAgICogQHNlZSBjb21wbGV0ZWRIdG1sXG4gICAqIEBzZWUgbG9hZGluZ0h0bWxcbiAgICovXG4gIHB1YmxpYyBvblByb2Nlc3NIdG1sOiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxTdXJ2ZXlNb2RlbD4oKTtcbiAgLyoqXG4gICAqIFVzZSB0aGlzIGV2ZW50IHRvIGNoYW5nZSB0aGUgcXVlc3Rpb24gdGl0bGUgaW4gY29kZS4gSWYgeW91IHdhbnQgdG8gcmVtb3ZlIHF1ZXN0aW9uIG51bWJlcmluZyB0aGVuIHNldCBzaG93UXVlc3Rpb25OdW1iZXJzIHRvIFwib2ZmXCIuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLnRpdGxlYCAtIGEgY2FsY3VsYXRlZCBxdWVzdGlvbiB0aXRsZSwgYmFzZWQgb24gcXVlc3Rpb24gYHRpdGxlYCwgYG5hbWVgLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5xdWVzdGlvbmAgLSBhIHF1ZXN0aW9uIG9iamVjdC5cbiAgICogQHNlZSBzaG93UXVlc3Rpb25OdW1iZXJzXG4gICAqIEBzZWUgcmVxdWlyZWRUZXh0XG4gICAqL1xuICBwdWJsaWMgb25HZXRRdWVzdGlvblRpdGxlOiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxcbiAgICBTdXJ2ZXlNb2RlbFxuICA+KCk7XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBldmVudCB0byBjaGFuZ2UgdGhlIGVsZW1lbnQgdGl0bGUgdGFnIG5hbWUgdGhhdCByZW5kZXJzIGJ5IGRlZmF1bHQuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLmVsZW1lbnRgIC0gYW4gZWxlbWVudCAocXVlc3Rpb24sIHBhbmVsLCBwYWdlIGFuZCBzdXJ2ZXkpIHRoYXQgU3VydmV5SlMgaXMgZ29pbmcgdG8gcmVuZGVyLlxuICAgKiA8YnIvPiBgb3B0aW9ucy50YWdOYW1lYCAtIGFuIGVsZW1lbnQgdGl0bGUgdGFnTmFtZSB0aGF0IGFyZSB1c2VkIHRvIHJlbmRlciBhIHRpdGxlLiBZb3UgY2FuIGNoYW5nZSBpdCBmcm9tIHRoZSBkZWZhdWx0IHZhbHVlLlxuICAgKiBAc2VlIHNob3dRdWVzdGlvbk51bWJlcnNcbiAgICogQHNlZSByZXF1aXJlZFRleHRcbiAgICovXG4gIHB1YmxpYyBvbkdldFRpdGxlVGFnTmFtZTogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuICAvKipcbiAgICogVXNlIHRoaXMgZXZlbnQgdG8gY2hhbmdlIHRoZSBxdWVzdGlvbiBubyBpbiBjb2RlLiBJZiB5b3Ugd2FudCB0byByZW1vdmUgcXVlc3Rpb24gbnVtYmVyaW5nIHRoZW4gc2V0IHNob3dRdWVzdGlvbk51bWJlcnMgdG8gXCJvZmZcIi5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMubm9gIC0gYSBjYWxjdWxhdGVkIHF1ZXN0aW9uIG5vLCBiYXNlZCBvbiBxdWVzdGlvbiBgdmlzaWJsZUluZGV4YCwgc3VydmV5IGAucXVlc3Rpb25TdGFydEluZGV4YCBwcm9wZXJ0aWVzLiBZb3UgY2FuIGNoYW5nZSBpdC5cbiAgICogPGJyLz4gYG9wdGlvbnMucXVlc3Rpb25gIC0gYSBxdWVzdGlvbiBvYmplY3QuXG4gICAqIEBzZWUgc2hvd1F1ZXN0aW9uTnVtYmVyc1xuICAgKiBAc2VlIHF1ZXN0aW9uU3RhcnRJbmRleFxuICAgKi9cbiAgcHVibGljIG9uR2V0UXVlc3Rpb25ObzogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8U3VydmV5TW9kZWw+KCk7XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBldmVudCB0byBjaGFuZ2UgdGhlIHByb2dyZXNzIHRleHQgaW4gY29kZS5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMudGV4dGAgLSBhIHByb2dyZXNzIHRleHQsIHRoYXQgU3VydmV5SlMgd2lsbCByZW5kZXIgaW4gcHJvZ3Jlc3MgYmFyLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5xdWVzdGlvbkNvdW50YCAtIGEgbnVtYmVyIG9mIHF1ZXN0aW9ucyB0aGF0IGhhdmUgaW5wdXQocykuIFdlIGRvIG5vdCBjb3VudCBodG1sIG9yIGV4cHJlc3Npb24gcXVlc3Rpb25zXG4gICAqIDxici8+IGBvcHRpb25zLmFuc3dlcmVkUXVlc3Rpb25Db3VudGAgLSBhIG51bWJlciBvZiBxdWVzdGlvbnMgdGhhdCBoYXZlIGlucHV0KHMpIGFuZCBhbiB1c2VyIGhhcyBhbnN3ZXJlZC5cbiAgICogPGJyLz4gYG9wdGlvbnMucmVxdWlyZWRRdWVzdGlvbkNvdW50YCAtIGEgbnVtYmVyIG9mIHJlcXVpcmVkIHF1ZXN0aW9ucyB0aGF0IGhhdmUgaW5wdXQocykuIFdlIGRvIG5vdCBjb3VudCBodG1sIG9yIGV4cHJlc3Npb24gcXVlc3Rpb25zXG4gICAqIDxici8+IGBvcHRpb25zLnJlcXVpcmVkQW5zd2VyZWRRdWVzdGlvbkNvdW50YCAtIGEgbnVtYmVyIG9mIHJlcXVpcmVkIHF1ZXN0aW9ucyB0aGF0IGhhdmUgaW5wdXQocykgYW5kIGFuIHVzZXIgaGFzIGFuc3dlcmVkLlxuICAgKiAgQHNlZSBwcm9ncmVzc0JhclR5cGVcbiAgICovXG4gIHB1YmxpYyBvblByb2dyZXNzVGV4dDogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8U3VydmV5TW9kZWw+KCk7XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBldmVudCB0byBwcm9jZXNzIHRoZSBtYXJrZG93biB0ZXh0LlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5lbGVtZW50YCAtIFN1cnZleUpTIGVsZW1lbnQgKGEgcXVlc3Rpb24sIHBhbmVsLCBwYWdlLCBvciBzdXJ2ZXkpIHdoZXJlIHRoZSBzdHJpbmcgaXMgZ29pbmcgdG8gYmUgcmVuZGVyZWQuXG4gICAqIDxici8+IGBvcHRpb25zLm5hbWVgIC0gYSBwcm9wZXJ0eSBuYW1lIGlzIGdvaW5nIHRvIGJlIHJlbmRlcmVkLlxuICAgKiA8YnIvPiBgb3B0aW9ucy50ZXh0YCAtIGEgdGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIHJlbmRlcmVkLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5odG1sYCAtIGFuIEhUTUwgY29udGVudC4gSXQgaXMgYG51bGxgIGJ5IGRlZmF1bHQuIFVzZSB0aGlzIHByb3BlcnR5IHRvIHNwZWNpZnkgdGhlIEhUTUwgY29udGVudCByZW5kZXJlZCBpbnN0ZWFkIG9mIGBvcHRpb25zLnRleHRgLlxuICAgKi9cbiAgcHVibGljIG9uVGV4dE1hcmtkb3duOiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxTdXJ2ZXlNb2RlbD4oKTtcbiAgLyoqXG4gICAqIFVzZSB0aGlzIGV2ZW50IHRvIHNwZWNpdHkgcmVuZGVyIGNvbXBvbmVudCBuYW1lIHVzZWQgZm9yIHRleHQgcmVuZGVyaW5nLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5lbGVtZW50YCAtIFN1cnZleUpTIGVsZW1lbnQgKGEgcXVlc3Rpb24sIHBhbmVsLCBwYWdlLCBvciBzdXJ2ZXkpIHdoZXJlIHRoZSBzdHJpbmcgaXMgZ29pbmcgdG8gYmUgcmVuZGVyZWQuXG4gICAqIDxici8+IGBvcHRpb25zLm5hbWVgIC0gYSBwcm9wZXJ0eSBuYW1lIGlzIGdvaW5nIHRvIGJlIHJlbmRlcmVkLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5yZW5kZXJBc2AgLSBhIGNvbXBvbmVudCBuYW1lIHVzZWQgZm9yIHRleHQgcmVuZGVyaW5nLlxuICAgKi9cbiAgcHVibGljIG9uVGV4dFJlbmRlckFzOiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxTdXJ2ZXlNb2RlbD4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBmaXJlcyB3aGVuIGl0IGdldHMgcmVzcG9uc2UgZnJvbSB0aGUgW2FwaS5zdXJ2ZXlqcy5pb10oaHR0cHM6Ly9hcGkuc3VydmV5anMuaW8pIHNlcnZpY2Ugb24gc2F2aW5nIHN1cnZleSByZXN1bHRzLiBVc2UgaXQgdG8gZmluZCBvdXQgaWYgdGhlIHJlc3VsdHMgaGF2ZSBiZWVuIHNhdmVkIHN1Y2Nlc3NmdWxseS5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMuc3VjY2Vzc2AgLSBpdCBpcyBgdHJ1ZWAgaWYgdGhlIHJlc3VsdHMgaGFzIGJlZW4gc2VudCB0byB0aGUgc2VydmljZSBzdWNjZXNzZnVsbHkuXG4gICAqIDxici8+IGBvcHRpb25zLnJlc3BvbnNlYCAtIGEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmljZS5cbiAgICovXG4gIHB1YmxpYyBvblNlbmRSZXN1bHQ6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFN1cnZleU1vZGVsPigpO1xuICAvKipcbiAgICogVXNlIGl0IHRvIGdldCByZXN1bHRzIGFmdGVyIGNhbGxpbmcgdGhlIGBnZXRSZXN1bHRgIG1ldGhvZC4gSXQgcmV0dXJucyBhIHNpbXBsZSBhbmFseXRpY3MgZnJvbSBbYXBpLnN1cnZleWpzLmlvXShodHRwczovL2FwaS5zdXJ2ZXlqcy5pbykgc2VydmljZS5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMuc3VjY2Vzc2AgLSBpdCBpcyBgdHJ1ZWAgaWYgdGhlIHJlc3VsdHMgd2VyZSBnb3QgZnJvbSB0aGUgc2VydmljZSBzdWNjZXNzZnVsbHkuXG4gICAqIDxici8+IGBvcHRpb25zLmRhdGFgIC0gdGhlIG9iamVjdCBge0Fuc3dlcnNDb3VudCwgUXVlc3Rpb25SZXN1bHQgOiB7fSB9YC4gYEFuc3dlcnNDb3VudGAgaXMgdGhlIG51bWJlciBvZiBwb3N0ZWQgc3VydmV5IHJlc3VsdHMuIGBRdWVzdGlvblJlc3VsdGAgaXMgYW4gb2JqZWN0IHdpdGggYWxsIHBvc3NpYmxlIHVuaXF1ZSBhbnN3ZXJzIHRvIHRoZSBxdWVzdGlvbiBhbmQgbnVtYmVyIG9mIHRoZXNlIGFuc3dlcnMuXG4gICAqIDxici8+IGBvcHRpb25zLmRhdGFMaXN0YCAtIGFuIGFycmF5IG9mIG9iamVjdHMgYHtuYW1lLCB2YWx1ZX1gLCB3aGVyZSBgbmFtZWAgaXMgYSB1bmlxdWUgdmFsdWUvYW5zd2VyIHRvIHRoZSBxdWVzdGlvbiBhbmQgYHZhbHVlYCBpcyBhIG51bWJlci9jb3VudCBvZiBzdWNoIGFuc3dlcnMuXG4gICAqIDxici8+IGBvcHRpb25zLnJlc3BvbnNlYCAtIHRoZSBzZXJ2ZXIgcmVzcG9uc2UuXG4gICAqIEBzZWUgZ2V0UmVzdWx0XG4gICAqL1xuICBwdWJsaWMgb25HZXRSZXN1bHQ6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFN1cnZleU1vZGVsPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIG9uIHVwbG9hZGluZyB0aGUgZmlsZSBpbiBRdWVzdGlvbkZpbGUgd2hlbiBgc3RvcmVEYXRhQXNUZXh0YCBpcyBzZXQgdG8gYGZhbHNlYC4gVXNlIHRoaXMgZXZlbnQgdG8gY2hhbmdlIHRoZSB1cGxvYWRlZCBmaWxlIG5hbWUgb3IgdG8gcHJldmVudCBhIHBhcnRpY3VsYXIgZmlsZSBmcm9tIGJlaW5nIHVwbG9hZGVkLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5xdWVzdGlvbmAgLSB0aGUgZmlsZSBxdWVzdGlvbiBpbnN0YW5jZS5cbiAgICogPGJyLz4gYG9wdGlvbnMubmFtZWAgLSB0aGUgcXVlc3Rpb24gbmFtZS5cbiAgICogPGJyLz4gYG9wdGlvbnMuZmlsZXNgIC0gdGhlIEphdmFzY3JpcHQgRmlsZSBvYmplY3RzIGFycmF5IHRvIHVwbG9hZC5cbiAgICogPGJyLz4gYG9wdGlvbnMuY2FsbGJhY2tgIC0gYSBjYWxsYmFjayBmdW5jdGlvbiB0byBnZXQgdGhlIGZpbGUgdXBsb2FkIHN0YXR1cyBhbmQgdGhlIHVwZGxvYWRlZCBmaWxlIGNvbnRlbnQuXG4gICAqIEBzZWUgdXBsb2FkRmlsZXNcbiAgICogQHNlZSBRdWVzdGlvbkZpbGVNb2RlbC5zdG9yZURhdGFBc1RleHRcbiAgICogQHNlZSBvbkRvd25sb2FkRmlsZVxuICAgKiBAc2VlIG9uQ2xlYXJGaWxlc1xuICAgKiBAc2VlIFtWaWV3IEV4YW1wbGVzXShodHRwczovL3d3dy5nb29nbGUuY29tL3NlYXJjaD9xPXNpdGUlM0FodHRwcyUzQSUyRiUyRnN1cnZleWpzLmlvJTJGRXhhbXBsZXMlMkYrJTIyb25VcGxvYWRGaWxlcyUyMilcbiAgICovXG4gIHB1YmxpYyBvblVwbG9hZEZpbGVzOiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxTdXJ2ZXlNb2RlbD4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiBkb3dubG9hZGluZyBhIGZpbGUgaW4gUXVlc3Rpb25GaWxlLiBVc2UgdGhpcyBldmVudCB0byBwYXNzIHRoZSBmaWxlIHRvIGEgcHJldmlldy5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMubmFtZWAgLSB0aGUgcXVlc3Rpb24gbmFtZS5cbiAgICogPGJyLz4gYG9wdGlvbnMuY29udGVudGAgLSB0aGUgZmlsZSBjb250ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5maWxlVmFsdWVgIC0gc2luZ2xlIGZpbGUgcXVlc3Rpb24gdmFsdWUuXG4gICAqIDxici8+IGBvcHRpb25zLmNhbGxiYWNrYCAtIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gZ2V0IHRoZSBmaWxlIGRvd25sb2FkaW5nIHN0YXR1cyBhbmQgdGhlIGRvd25sb2FkZWQgZmlsZSBjb250ZW50LlxuICAgKiBAc2VlIGRvd25sb2FkRmlsZVxuICAgKiBAc2VlIG9uQ2xlYXJGaWxlc1xuICAgKiBAc2VlIG9uVXBsb2FkRmlsZXNcbiAgICogQHNlZSBbVmlldyBFeGFtcGxlc10oaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2g/cT1zaXRlJTNBaHR0cHMlM0ElMkYlMkZzdXJ2ZXlqcy5pbyUyRkV4YW1wbGVzJTJGKyUyMm9uRG93bmxvYWRGaWxlJTIyKVxuICAgKi9cbiAgcHVibGljIG9uRG93bmxvYWRGaWxlOiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxTdXJ2ZXlNb2RlbD4oKTtcbiAgLyoqXG4gICAqIFRoaXMgZXZlbnQgaXMgZmlyZWQgb24gY2xlYXJpbmcgdGhlIHZhbHVlIGluIGEgUXVlc3Rpb25GaWxlLiBVc2UgdGhpcyBldmVudCB0byByZW1vdmUgZmlsZXMgc3RvcmVkIG9uIHlvdXIgc2VydmVyLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgcXVlc3Rpb25gIC0gdGhlIHF1ZXN0aW9uIGluc3RhbmNlLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5uYW1lYCAtIHRoZSBxdWVzdGlvbiBuYW1lLlxuICAgKiA8YnIvPiBgb3B0aW9ucy52YWx1ZWAgLSB0aGUgcXVlc3Rpb24gdmFsdWUuXG4gICAqIDxici8+IGBvcHRpb25zLmZpbGVOYW1lYCAtIGEgcmVtb3ZlZCBmaWxlJ3MgbmFtZSwgc2V0IGl0IHRvIGBudWxsYCB0byBjbGVhciBhbGwgZmlsZXMuXG4gICAqIDxici8+IGBvcHRpb25zLmNhbGxiYWNrYCAtIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gZ2V0IHRoZSBvcGVyYXRpb24gc3RhdHVzLlxuICAgKiBAc2VlIGNsZWFyRmlsZXNcbiAgICogQHNlZSBvbkRvd25sb2FkRmlsZVxuICAgKiBAc2VlIG9uVXBsb2FkRmlsZXNcbiAgICogQHNlZSBbVmlldyBFeGFtcGxlc10oaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2g/cT1zaXRlJTNBaHR0cHMlM0ElMkYlMkZzdXJ2ZXlqcy5pbyUyRkV4YW1wbGVzJTJGKyUyMm9uQ2xlYXJGaWxlcyUyMilcbiAgICovXG4gIHB1YmxpYyBvbkNsZWFyRmlsZXM6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFN1cnZleU1vZGVsPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGFmdGVyIGNob2ljZXMgZm9yIHJhZGlvZ3JvdXAsIGNoZWNrYm94LCBhbmQgZHJvcGRvd24gaGFzIGJlZW4gbG9hZGVkIGZyb20gYSBSRVNUZnVsIHNlcnZpY2UgYW5kIGJlZm9yZSB0aGV5IGFyZSBhc3NpZ25lZCB0byBhIHF1ZXN0aW9uLlxuICAgKiBZb3UgbWF5IGNoYW5nZSB0aGUgY2hvaWNlcywgYmVmb3JlIHRoZXkgYXJlIGFzc2lnbmVkIG9yIGRpc2FibGUvZW5hYmxlZCBtYWtlIHZpc2libGUvaW52aXNpYmxlIHF1ZXN0aW9uLCBiYXNlZCBvbiBsb2FkZWQgcmVzdWx0cy5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYHF1ZXN0aW9uYCAtIHRoZSBxdWVzdGlvbiB3aGVyZSBsb2FkZWQgY2hvaWNlcyBhcmUgZ29pbmcgdG8gYmUgYXNzaWduZWQuXG4gICAqIDxici8+IGBjaG9pY2VzYCAtIHRoZSBsb2FkZWQgY2hvaWNlcy4gWW91IGNhbiBjaGFuZ2UgdGhlIGxvYWRlZCBjaG9pY2VzIHRvIGJlZm9yZSB0aGV5IGFyZSBhc3NpZ25lZCB0byBxdWVzdGlvbi5cbiAgICogPGJyLz4gYHNlcnZlclJlc3VsdGAgLSBhIHJlc3VsdCB0aGF0IGNvbWVzIGZyb20gdGhlIHNlcnZlciBhcyBpdCBpcy5cbiAgICovXG4gIHB1YmxpYyBvbkxvYWRDaG9pY2VzRnJvbVNlcnZlcjogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGFmdGVyIHN1cnZleSBpcyBsb2FkZWQgZnJvbSBhcGkuc3VydmV5anMuaW8gc2VydmljZS5cbiAgICogWW91IGNhbiB1c2UgdGhpcyBldmVudCB0byBwZXJmb3JtIG1hbmlwdWxhdGlvbiB3aXRoIHRoZSBzdXJ2ZXkgbW9kZWwgYWZ0ZXIgaXQgd2FzIGxvYWRlZCBmcm9tIHRoZSB3ZWIgc2VydmljZS5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogQHNlZSBzdXJ2ZXlJZFxuICAgKiBAc2VlIGxvYWRTdXJ2ZXlGcm9tU2VydmljZVxuICAgKi9cbiAgcHVibGljIG9uTG9hZGVkU3VydmV5RnJvbVNlcnZpY2U6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiBwcm9jZXNzaW5nIHRoZSB0ZXh0IHdoZW4gaXQgZmluZHMgYSB0ZXh0IGluIGJyYWNrZXRzOiBge3NvbWV2YWx1ZX1gLiBCeSBkZWZhdWx0LCBpdCB1c2VzIHRoZSB2YWx1ZSBvZiBzdXJ2ZXkgcXVlc3Rpb24gdmFsdWVzIGFuZCB2YXJpYWJsZXMuXG4gICAqIEZvciBleGFtcGxlLCB5b3UgbWF5IHVzZSB0aGUgdGV4dCBwcm9jZXNzaW5nIGluIGxvYWRpbmcgY2hvaWNlcyBmcm9tIHRoZSB3ZWIuIElmIHlvdXIgYGNob2ljZXNCeVVybC51cmxgIGVxdWFscyB0byBcIlVybFRvU2VydmljZVRvR2V0QWxsQ2l0aWVzL3tjb3VudHJ5fS97c3RhdGV9XCIsXG4gICAqIHlvdSBtYXkgc2V0IG9uIHRoaXMgZXZlbnQgYG9wdGlvbnMudmFsdWVgIHRvIFwiYWxsXCIgb3IgZW1wdHkgc3RyaW5nIHdoZW4gdGhlIFwic3RhdGVcIiB2YWx1ZS9xdWVzdGlvbiBpcyBub24gc2VsZWN0ZWQgYnkgYSB1c2VyLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5uYW1lYCAtIHRoZSBuYW1lIG9mIHRoZSBwcm9jZXNzaW5nIHZhbHVlLCBmb3IgZXhhbXBsZSwgXCJzdGF0ZVwiIGluIG91ciBleGFtcGxlLlxuICAgKiA8YnIvPiBgb3B0aW9ucy52YWx1ZWAgLSB0aGUgdmFsdWUgb2YgdGhlIHByb2Nlc3NpbmcgdGV4dC5cbiAgICogPGJyLz4gYG9wdGlvbnMuaXNFeGlzdHNgIC0gYSBib29sZWFuIHZhbHVlLiBTZXQgaXQgdG8gYHRydWVgIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgdmFsdWUgYW5kIHNldCBpdCB0byBgZmFsc2VgIGlmIHlvdSBkb24ndC5cbiAgICovXG4gIHB1YmxpYyBvblByb2Nlc3NUZXh0VmFsdWU6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBiZWZvcmUgcmVuZGVyaW5nIGEgcXVlc3Rpb24uIFVzZSBpdCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBxdWVzdGlvbiBDU1MgY2xhc3Nlcy5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucXVlc3Rpb25gIC0gYSBxdWVzdGlvbiBmb3Igd2hpY2ggeW91IGNhbiBjaGFuZ2UgdGhlIENTUyBjbGFzc2VzLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5jc3NDbGFzc2VzYCAtIGFuIG9iamVjdCB3aXRoIENTUyBjbGFzc2VzLiBGb3IgZXhhbXBsZSBge3Jvb3Q6IFwidGFibGVcIiwgYnV0dG9uOiBcImJ1dHRvblwifWAuIFlvdSBjYW4gY2hhbmdlIHRoZW0gdG8geW91ciBvd24gQ1NTIGNsYXNzZXMuXG4gICAqL1xuICBwdWJsaWMgb25VcGRhdGVRdWVzdGlvbkNzc0NsYXNzZXM6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBiZWZvcmUgcmVuZGVyaW5nIGEgcGFuZWwuIFVzZSBpdCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBwYW5lbCBDU1MgY2xhc3Nlcy5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucGFuZWxgIC0gYSBwYW5lbCBmb3Igd2hpY2ggeW91IGNhbiBjaGFuZ2UgdGhlIENTUyBjbGFzc2VzLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5jc3NDbGFzc2VzYCAtIGFuIG9iamVjdCB3aXRoIENTUyBjbGFzc2VzLiBGb3IgZXhhbXBsZSBge3RpdGxlOiBcInN2X3BfdGl0bGVcIiwgZGVzY3JpcHRpb246IFwic21hbGxcIn1gLiBZb3UgY2FuIGNoYW5nZSB0aGVtIHRvIHlvdXIgb3duIENTUyBjbGFzc2VzLlxuICAgKi9cbiAgcHVibGljIG9uVXBkYXRlUGFuZWxDc3NDbGFzc2VzOiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxcbiAgICBTdXJ2ZXlNb2RlbFxuICA+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgYmVmb3JlIHJlbmRlcmluZyBhIHBhZ2UuIFVzZSBpdCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBwYWdlIENTUyBjbGFzc2VzLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5wYWdlYCAtIGEgcGFnZSBmb3Igd2hpY2ggeW91IGNhbiBjaGFuZ2UgdGhlIENTUyBjbGFzc2VzLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5jc3NDbGFzc2VzYCAtIGFuIG9iamVjdCB3aXRoIENTUyBjbGFzc2VzLiBGb3IgZXhhbXBsZSBge3RpdGxlOiBcInN2X3BfdGl0bGVcIiwgZGVzY3JpcHRpb246IFwic21hbGxcIn1gLiBZb3UgY2FuIGNoYW5nZSB0aGVtIHRvIHlvdXIgb3duIENTUyBjbGFzc2VzLlxuICAgKi9cbiAgcHVibGljIG9uVXBkYXRlUGFnZUNzc0NsYXNzZXM6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBiZWZvcmUgcmVuZGVyaW5nIGEgY2hvaWNlIGl0ZW0gaW4gcmFkaW9ncm91cCwgY2hlY2tib3ggb3IgZHJvcGRvd24gcXVlc3Rpb25zLiBVc2UgaXQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgY2hvaWNlIGl0ZW0gY3NzLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5xdWVzdGlvbmAgLSBhIHF1ZXN0aW9uIHdoZXJlIGNob2ljZSBpdGVtIGlzIHJlbmRlcmVkLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5pdGVtYCAtIGEgY2hvaWNlIGl0ZW0gb2YgSXRlbVZhbHVlIHR5cGUuIFlvdSBjYW4gZ2V0IHZhbHVlIG9yIHRleHQgY2hvaWNlIHByb3BlcnRpZXMgYXMgb3B0aW9ucy5pdGVtLnZhbHVlIG9yIG9wdGlvbnMuY2hvaWNlLnRleHRcbiAgICogPGJyLz4gYG9wdGlvbnMuY3NzYCAtIGEgc3RyaW5nIHdpdGggY3NzIGNsYXNzZXMgZGl2aWRlZCBieSBzcGFjZS4gWW91IGNhbiBjaGFuZ2UgaXQuXG4gICAqL1xuICAgcHVibGljIG9uVXBkYXRlQ2hvaWNlSXRlbUNzczogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICBTdXJ2ZXlNb2RlbFxuID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCByaWdodCBhZnRlciBzdXJ2ZXkgaXMgcmVuZGVyZWQgaW4gRE9NLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5odG1sRWxlbWVudGAgLSBhIHJvb3QgSFRNTCBlbGVtZW50IGJvdW5kIHRvIHRoZSBzdXJ2ZXkgb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIG9uQWZ0ZXJSZW5kZXJTdXJ2ZXk6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCByaWdodCBhZnRlciBhIHBhZ2UgaXMgcmVuZGVyZWQgaW4gRE9NLiBVc2UgaXQgdG8gbW9kaWZ5IEhUTUwgZWxlbWVudHMuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLmh0bWxFbGVtZW50YCAtIGFuIEhUTUwgZWxlbWVudCBib3VuZCB0byB0aGUgc3VydmV5IGhlYWRlciBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgb25BZnRlclJlbmRlckhlYWRlcjogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIHJpZ2h0IGFmdGVyIGEgcGFnZSBpcyByZW5kZXJlZCBpbiBET00uIFVzZSBpdCB0byBtb2RpZnkgSFRNTCBlbGVtZW50cy5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucGFnZWAgLSBhIHBhZ2Ugb2JqZWN0IGZvciB3aGljaCB0aGUgZXZlbnQgaXMgZmlyZWQuIFR5cGljYWxseSB0aGUgY3VycmVudC9hY3RpdmUgcGFnZS5cbiAgICogPGJyLz4gYG9wdGlvbnMuaHRtbEVsZW1lbnRgIC0gYW4gSFRNTCBlbGVtZW50IGJvdW5kIHRvIHRoZSBwYWdlIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBvbkFmdGVyUmVuZGVyUGFnZTogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIHJpZ2h0IGFmdGVyIGEgcXVlc3Rpb24gaXMgcmVuZGVyZWQgaW4gRE9NLiBVc2UgaXQgdG8gbW9kaWZ5IEhUTUwgZWxlbWVudHMuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLnF1ZXN0aW9uYCAtIGEgcXVlc3Rpb24gb2JqZWN0IGZvciB3aGljaCB0aGUgZXZlbnQgaXMgZmlyZWQuXG4gICAqIDxici8+IGBvcHRpb25zLmh0bWxFbGVtZW50YCAtIGFuIEhUTUwgZWxlbWVudCBib3VuZCB0byB0aGUgcXVlc3Rpb24gb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIG9uQWZ0ZXJSZW5kZXJRdWVzdGlvbjogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIHJpZ2h0IGFmdGVyIGEgbm9uLWNvbXBvc2l0ZSBxdWVzdGlvbiAodGV4dCwgY29tbWVudCwgZHJvcGRvd24sIHJhZGlvZ3JvdXAsIGNoZWNrYm94KSBpcyByZW5kZXJlZCBpbiBET00uIFVzZSBpdCB0byBtb2RpZnkgSFRNTCBlbGVtZW50cy5cbiAgICogVGhpcyBldmVudCBpcyBub3QgZmlyZWQgZm9yIG1hdHJpY2VzLCBwYW5lbHMsIG11bHRpcGxlIHRleHQgYW5kIGltYWdlIHBpY2tlci5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucXVlc3Rpb25gIC0gYSBxdWVzdGlvbiBvYmplY3QgZm9yIHdoaWNoIHRoZSBldmVudCBpcyBmaXJlZC5cbiAgICogPGJyLz4gYG9wdGlvbnMuaHRtbEVsZW1lbnRgIC0gYW4gSFRNTCBlbGVtZW50IGJvdW5kIHRvIHRoZSBxdWVzdGlvbiBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgb25BZnRlclJlbmRlclF1ZXN0aW9uSW5wdXQ6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCByaWdodCBhZnRlciBhIHBhbmVsIGlzIHJlbmRlcmVkIGluIERPTS4gVXNlIGl0IHRvIG1vZGlmeSBIVE1MIGVsZW1lbnRzLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IGBvcHRpb25zLnBhbmVsYCAtIGEgcGFuZWwgb2JqZWN0IGZvciB3aGljaCB0aGUgZXZlbnQgaXMgZmlyZWRcbiAgICogPGJyLz4gYG9wdGlvbnMuaHRtbEVsZW1lbnRgIC0gYW4gSFRNTCBlbGVtZW50IGJvdW5kIHRvIHRoZSBwYW5lbCBvYmplY3RcbiAgICovXG4gIHB1YmxpYyBvbkFmdGVyUmVuZGVyUGFuZWw6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiBhZGRpbmcgYSBuZXcgcm93IGluIE1hdHJpeCBEeW5hbWljIHF1ZXN0aW9uLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IGBvcHRpb25zLnF1ZXN0aW9uYCAtIGEgbWF0cml4IHF1ZXN0aW9uLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5yb3dgIC0gYSBuZXcgYWRkZWQgcm93LlxuICAgKiBAc2VlIFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsXG4gICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWwudmlzaWJsZVJvd3NcbiAgICovXG4gIHB1YmxpYyBvbk1hdHJpeFJvd0FkZGVkOiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxcbiAgICBTdXJ2ZXlNb2RlbFxuICA+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgYmVmb3JlIGFkZGluZyBhIG5ldyByb3cgaW4gTWF0cml4IER5bmFtaWMgcXVlc3Rpb24uXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gYG9wdGlvbnMucXVlc3Rpb25gIC0gYSBtYXRyaXggcXVlc3Rpb24uXG4gICAqIDxici8+IGBvcHRpb25zLmNhbkFkZFJvd2AgLSBzcGVjaWZpZXMgd2hldGhlciBhIG5ldyByb3cgY2FuIGJlIGFkZGVkXG4gICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWxcbiAgICogQHNlZSBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbC52aXNpYmxlUm93c1xuICAgKi9cbiAgcHVibGljIG9uTWF0cml4QmVmb3JlUm93QWRkZWQ6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBiZWZvcmUgcmVtb3ZpbmcgYSByb3cgZnJvbSBNYXRyaXggRHluYW1pYyBxdWVzdGlvbi4gWW91IGNhbiBkaXNhYmxlIHJlbW92aW5nIGFuZCBjbGVhciB0aGUgZGF0YSBpbnN0ZWFkLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IGBvcHRpb25zLnF1ZXN0aW9uYCAtIGEgbWF0cml4IHF1ZXN0aW9uLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5yb3dJbmRleGAgLSBhIHJvdyBpbmRleC5cbiAgICogPGJyLz4gYG9wdGlvbnMucm93YCAtIGEgcm93IG9iamVjdC5cbiAgICogPGJyLz4gYG9wdGlvbnMuYWxsb3dgIC0gYSBib29sZWFuIHByb3BlcnR5LiBTZXQgaXQgdG8gYGZhbHNlYCB0byBkaXNhYmxlIHRoZSByb3cgcmVtb3ZpbmcuXG4gICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWxcbiAgICogQHNlZSBvbk1hdHJpeFJvd1JlbW92ZWRcbiAgICogQHNlZSBvbk1hdHJpeEFsbG93UmVtb3ZlUm93XG4gICAqL1xuICBwdWJsaWMgb25NYXRyaXhSb3dSZW1vdmluZzogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIG9uIHJlbW92aW5nIGEgcm93IGZyb20gTWF0cml4IER5bmFtaWMgcXVlc3Rpb24uXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gYG9wdGlvbnMucXVlc3Rpb25gIC0gYSBtYXRyaXggcXVlc3Rpb25cbiAgICogPGJyLz4gYG9wdGlvbnMucm93SW5kZXhgIC0gYSByZW1vdmVkIHJvdyBpbmRleFxuICAgKiA8YnIvPiBgb3B0aW9ucy5yb3dgIC0gYSByZW1vdmVkIHJvdyBvYmplY3RcbiAgICogQHNlZSBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbFxuICAgKiBAc2VlIFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsLnZpc2libGVSb3dzXG4gICAqIEBzZWUgb25NYXRyaXhSb3dSZW1vdmluZ1xuICAgKiBAc2VlIG9uTWF0cml4QWxsb3dSZW1vdmVSb3dcbiAgICovXG4gIHB1YmxpYyBvbk1hdHJpeFJvd1JlbW92ZWQ6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBiZWZvcmUgcmVuZGVyaW5nIFwiUmVtb3ZlXCIgYnV0dG9uIGZvciByZW1vdmluZyBhIHJvdyBmcm9tIE1hdHJpeCBEeW5hbWljIHF1ZXN0aW9uLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IGBvcHRpb25zLnF1ZXN0aW9uYCAtIGEgbWF0cml4IHF1ZXN0aW9uLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5yb3dJbmRleGAgLSBhIHJvdyBpbmRleC5cbiAgICogPGJyLz4gYG9wdGlvbnMucm93YCAtIGEgcm93IG9iamVjdC5cbiAgICogPGJyLz4gYG9wdGlvbnMuYWxsb3dgIC0gYSBib29sZWFuIHByb3BlcnR5LiBTZXQgaXQgdG8gYGZhbHNlYCB0byBkaXNhYmxlIHRoZSByb3cgcmVtb3ZpbmcuXG4gICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWxcbiAgICogQHNlZSBvbk1hdHJpeFJvd1JlbW92aW5nXG4gICAqIEBzZWUgb25NYXRyaXhSb3dSZW1vdmVkXG4gICAqL1xuICBwdWJsaWMgb25NYXRyaXhBbGxvd1JlbW92ZVJvdzogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGJlZm9yZSBjcmVhdGluZyBjZWxsIHF1ZXN0aW9uIGluIHRoZSBtYXRyaXguIFlvdSBjYW4gY2hhbmdlIHRoZSBjZWxsIHF1ZXN0aW9uIHR5cGUgYnkgc2V0dGluZyBkaWZmZXJlbnQgb3B0aW9ucy5jZWxsVHlwZS5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucXVlc3Rpb25gIC0gdGhlIG1hdHJpeCBxdWVzdGlvbi5cbiAgICogPGJyLz4gYG9wdGlvbnMuY2VsbFR5cGVgIC0gdGhlIGNlbGwgcXVlc3Rpb24gdHlwZS4gWW91IGNhbiBjaGFuZ2UgaXQuXG4gICAqIDxici8+IGBvcHRpb25zLnJvd1ZhbHVlYCAtIHRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCByb3cuIFRvIGFjY2VzcyBhIHBhcnRpY3VsYXIgY29sdW1uJ3MgdmFsdWUgd2l0aGluIHRoZSBjdXJyZW50IHJvdywgdXNlOiBgb3B0aW9ucy5yb3dWYWx1ZVtcImNvbHVtblZhbHVlXCJdYC5cbiAgICogPGJyLz4gYG9wdGlvbnMuY29sdW1uYCAtIHRoZSBtYXRyaXggY29sdW1uIG9iamVjdC5cbiAgICogPGJyLz4gYG9wdGlvbnMuY29sdW1uTmFtZWAgLSB0aGUgbWF0cml4IGNvbHVtbiBuYW1lLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5yb3dgIC0gdGhlIG1hdHJpeCByb3cgb2JqZWN0LlxuICAgKiBAc2VlIG9uTWF0cml4QmVmb3JlUm93QWRkZWRcbiAgICogQHNlZSBvbk1hdHJpeENlbGxDcmVhdGVkXG4gICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWxcbiAgICogQHNlZSBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxcbiAgICovXG4gICBwdWJsaWMgb25NYXRyaXhDZWxsQ3JlYXRpbmc6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgU3VydmV5TW9kZWxcbiA+KCk7XG4gLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBmb3IgZXZlcnkgY2VsbCBjcmVhdGVkIGluIE1hdHJpeCBEeW5hbWljIGFuZCBNYXRyaXggRHJvcGRvd24gcXVlc3Rpb25zLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5xdWVzdGlvbmAgLSB0aGUgbWF0cml4IHF1ZXN0aW9uLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5jZWxsYCAtIHRoZSBtYXRyaXggY2VsbC5cbiAgICogPGJyLz4gYG9wdGlvbnMuY2VsbFF1ZXN0aW9uYCAtIHRoZSBxdWVzdGlvbi9lZGl0b3IgaW4gdGhlIGNlbGwuIFlvdSBtYXkgY3VzdG9taXplIGl0LCBjaGFuZ2UgaXQncyBwcm9wZXJ0aWVzLCBsaWtlIGNob2ljZXMgb3IgdmlzaWJsZS5cbiAgICogPGJyLz4gYG9wdGlvbnMucm93VmFsdWVgIC0gdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IHJvdy4gVG8gYWNjZXNzIGEgcGFydGljdWxhciBjb2x1bW4ncyB2YWx1ZSB3aXRoaW4gdGhlIGN1cnJlbnQgcm93LCB1c2U6IGBvcHRpb25zLnJvd1ZhbHVlW1wiY29sdW1uVmFsdWVcIl1gLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5jb2x1bW5gIC0gdGhlIG1hdHJpeCBjb2x1bW4gb2JqZWN0LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5jb2x1bW5OYW1lYCAtIHRoZSBtYXRyaXggY29sdW1uIG5hbWUuXG4gICAqIDxici8+IGBvcHRpb25zLnJvd2AgLSB0aGUgbWF0cml4IHJvdyBvYmplY3QuXG4gICAqIEBzZWUgb25NYXRyaXhCZWZvcmVSb3dBZGRlZFxuICAgKiBAc2VlIG9uTWF0cml4Q2VsbENyZWF0aW5nXG4gICAqIEBzZWUgb25NYXRyaXhSb3dBZGRlZFxuICAgKiBAc2VlIFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsXG4gICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsXG4gICAqL1xuICBwdWJsaWMgb25NYXRyaXhDZWxsQ3JlYXRlZDogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGZvciBldmVyeSBjZWxsIGFmdGVyIGlzIGhhcyBiZWVuIHJlbmRlcmVkIGluIERPTS5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucXVlc3Rpb25gIC0gdGhlIG1hdHJpeCBxdWVzdGlvbi5cbiAgICogPGJyLz4gYG9wdGlvbnMuY2VsbGAgLSB0aGUgbWF0cml4IGNlbGwuXG4gICAqIDxici8+IGBvcHRpb25zLmNlbGxRdWVzdGlvbmAgLSB0aGUgcXVlc3Rpb24vZWRpdG9yIGluIHRoZSBjZWxsLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5odG1sRWxlbWVudGAgLSBhbiBIVE1MIGVsZW1lbnQgYm91bmQgdG8gdGhlIGBjZWxsUXVlc3Rpb25gIG9iamVjdC5cbiAgICogPGJyLz4gYG9wdGlvbnMuY29sdW1uYCAtIHRoZSBtYXRyaXggY29sdW1uIG9iamVjdC5cbiAgICogPGJyLz4gYG9wdGlvbnMucm93YCAtIHRoZSBtYXRyaXggcm93IG9iamVjdC5cbiAgICogQHNlZSBvbk1hdHJpeENlbGxDcmVhdGVkXG4gICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWxcbiAgICogQHNlZSBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxcbiAgICovXG4gIHB1YmxpYyBvbk1hdHJpeEFmdGVyQ2VsbFJlbmRlcjogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIHdoZW4gY2VsbCB2YWx1ZSBpcyBjaGFuZ2VkIGluIE1hdHJpeCBEeW5hbWljIGFuZCBNYXRyaXggRHJvcGRvd24gcXVlc3Rpb25zLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5xdWVzdGlvbmAgLSB0aGUgbWF0cml4IHF1ZXN0aW9uLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5jb2x1bW5OYW1lYCAtIHRoZSBtYXRyaXggY29sdW1uIG5hbWUuXG4gICAqIDxici8+IGBvcHRpb25zLnZhbHVlYCAtIGEgbmV3IHZhbHVlLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5yb3dgIC0gdGhlIG1hdHJpeCByb3cgb2JqZWN0LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5nZXRDZWxsUXVlc3Rpb24oY29sdW1uTmFtZSlgIC0gdGhlIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgY2VsbCBxdWVzdGlvbiBieSBjb2x1bW4gbmFtZS5cbiAgICogQHNlZSBvbk1hdHJpeENlbGxWYWx1ZUNoYW5naW5nXG4gICAqIEBzZWUgb25NYXRyaXhCZWZvcmVSb3dBZGRlZFxuICAgKiBAc2VlIG9uTWF0cml4Um93QWRkZWRcbiAgICogQHNlZSBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbFxuICAgKiBAc2VlIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbFxuICAgKi9cbiAgcHVibGljIG9uTWF0cml4Q2VsbFZhbHVlQ2hhbmdlZDogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIG9uIGNoYW5naW5nIGNlbGwgdmFsdWUgaW4gTWF0cml4IER5bmFtaWMgYW5kIE1hdHJpeCBEcm9wZG93biBxdWVzdGlvbnMuIFlvdSBtYXkgY2hhbmdlIHRoZSBgb3B0aW9ucy52YWx1ZWAgcHJvcGVydHkgdG8gY2hhbmdlIGEgY2VsbCB2YWx1ZS5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucXVlc3Rpb25gIC0gdGhlIG1hdHJpeCBxdWVzdGlvbi5cbiAgICogPGJyLz4gYG9wdGlvbnMuY29sdW1uTmFtZWAgLSB0aGUgbWF0cml4IGNvbHVtbiBuYW1lLlxuICAgKiA8YnIvPiBgb3B0aW9ucy52YWx1ZWAgLSBhIG5ldyB2YWx1ZS5cbiAgICogPGJyLz4gYG9wdGlvbnMub2xkVmFsdWVgIC0gdGhlIG9sZCB2YWx1ZS5cbiAgICogPGJyLz4gYG9wdGlvbnMucm93YCAtIHRoZSBtYXRyaXggcm93IG9iamVjdC5cbiAgICogPGJyLz4gYG9wdGlvbnMuZ2V0Q2VsbFF1ZXN0aW9uKGNvbHVtbk5hbWUpYCAtIHRoZSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBjZWxsIHF1ZXN0aW9uIGJ5IGNvbHVtbiBuYW1lLlxuICAgKiBAc2VlIG9uTWF0cml4Q2VsbFZhbHVlQ2hhbmdlZFxuICAgKiBAc2VlIG9uTWF0cml4QmVmb3JlUm93QWRkZWRcbiAgICogQHNlZSBvbk1hdHJpeFJvd0FkZGVkXG4gICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWxcbiAgICogQHNlZSBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxcbiAgICovXG4gIHB1YmxpYyBvbk1hdHJpeENlbGxWYWx1ZUNoYW5naW5nOiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxcbiAgICBTdXJ2ZXlNb2RlbFxuICA+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgd2hlbiBNYXRyaXggRHluYW1pYyBhbmQgTWF0cml4IERyb3Bkb3duIHF1ZXN0aW9ucyB2YWxpZGF0ZSB0aGUgY2VsbCB2YWx1ZS5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMuZXJyb3JgIC0gYW4gZXJyb3Igc3RyaW5nLiBJdCBpcyBlbXB0eSBieSBkZWZhdWx0LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5xdWVzdGlvbmAgLSB0aGUgbWF0cml4IHF1ZXN0aW9uLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5jb2x1bW5OYW1lYCAtIHRoZSBtYXRyaXggY29sdW1uIG5hbWUuXG4gICAqIDxici8+IGBvcHRpb25zLnZhbHVlYCAtIGEgY2VsbCB2YWx1ZS5cbiAgICogPGJyLz4gYG9wdGlvbnMucm93YCAtIHRoZSBtYXRyaXggcm93IG9iamVjdC5cbiAgICogPGJyLz4gYG9wdGlvbnMuZ2V0Q2VsbFF1ZXN0aW9uKGNvbHVtbk5hbWUpYCAtIHRoZSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGNlbGwgcXVlc3Rpb24gYnkgY29sdW1uIG5hbWUuXG4gICAqIEBzZWUgb25NYXRyaXhCZWZvcmVSb3dBZGRlZFxuICAgKiBAc2VlIG9uTWF0cml4Um93QWRkZWRcbiAgICogQHNlZSBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbFxuICAgKiBAc2VlIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbFxuICAgKi9cbiAgcHVibGljIG9uTWF0cml4Q2VsbFZhbGlkYXRlOiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxcbiAgICBTdXJ2ZXlNb2RlbFxuICA+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gYWRkaW5nIGEgbmV3IHBhbmVsIGluIFBhbmVsIER5bmFtaWMgcXVlc3Rpb24uXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLnF1ZXN0aW9uYCAtIGEgcGFuZWwgcXVlc3Rpb24uXG4gICAqIDxici8+IGBvcHRpb25zLnBhbmVsYCAtIGFuIGFkZGVkIHBhbmVsLlxuICAgKiBAc2VlIFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWxcbiAgICogQHNlZSBRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsLnBhbmVsc1xuICAgKi9cbiAgcHVibGljIG9uRHluYW1pY1BhbmVsQWRkZWQ6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiByZW1vdmluZyBhIHBhbmVsIGZyb20gUGFuZWwgRHluYW1pYyBxdWVzdGlvbi5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucXVlc3Rpb25gIC0gYSBwYW5lbCBxdWVzdGlvbi5cbiAgICogPGJyLz4gYG9wdGlvbnMucGFuZWxJbmRleGAgLSBhIHJlbW92ZWQgcGFuZWwgaW5kZXguXG4gICAqIDxici8+IGBvcHRpb25zLnBhbmVsYCAtIGEgcmVtb3ZlZCBwYW5lbC5cbiAgICogQHNlZSBRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsXG4gICAqIEBzZWUgUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbC5wYW5lbHNcbiAgICovXG4gIHB1YmxpYyBvbkR5bmFtaWNQYW5lbFJlbW92ZWQ6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBldmVyeSBzZWNvbmQgaWYgdGhlIG1ldGhvZCBgc3RhcnRUaW1lcmAgaGFzIGJlZW4gY2FsbGVkLlxuICAgKiBAc2VlIHN0YXJ0VGltZXJcbiAgICogQHNlZSB0aW1lU3BlbnRcbiAgICogQHNlZSBQYWdlLnRpbWVTcGVudFxuICAgKi9cbiAgcHVibGljIG9uVGltZXI6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFN1cnZleU1vZGVsPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGJlZm9yZSBkaXNwbGF5aW5nIGEgbmV3IGluZm9ybWF0aW9uIGluIHRoZSBUaW1lciBQYW5lbC4gVXNlIGl0IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB0ZXh0LlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy50ZXh0YCAtIHRoZSB0aW1lciBwYW5lbCBpbmZvIHRleHQuXG4gICAqL1xuICBwdWJsaWMgb25UaW1lclBhbmVsSW5mb1RleHQ6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCB3aGVuIGl0ZW0gdmFsdWUgaXMgY2hhbmdlZCBpbiBQYW5lbCBEeW5hbWljIHF1ZXN0aW9uLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5xdWVzdGlvbmAgLSB0aGUgcGFuZWwgcXVlc3Rpb24uXG4gICAqIDxici8+IGBvcHRpb25zLnBhbmVsYCAtIHRoZSBkeW5hbWljIHBhbmVsIGl0ZW0uXG4gICAqIDxici8+IGBvcHRpb25zLm5hbWVgIC0gdGhlIGl0ZW0gbmFtZS5cbiAgICogPGJyLz4gYG9wdGlvbnMudmFsdWVgIC0gYSBuZXcgdmFsdWUuXG4gICAqIDxici8+IGBvcHRpb25zLml0ZW1JbmRleGAgLSB0aGUgcGFuZWwgaXRlbSBpbmRleC5cbiAgICogPGJyLz4gYG9wdGlvbnMuaXRlbVZhbHVlYCAtIHRoZSBwYW5lbCBpdGVtIG9iamVjdC5cbiAgICogQHNlZSBvbkR5bmFtaWNQYW5lbEFkZGVkXG4gICAqIEBzZWUgUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbFxuICAgKi9cbiAgcHVibGljIG9uRHluYW1pY1BhbmVsSXRlbVZhbHVlQ2hhbmdlZDogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuICAvKipcbiAgICogVXNlIHRoaXMgZXZlbnQgdG8gZGVmaW5lLCB3aGV0aGVyIGFuIGFuc3dlciB0byBhIHF1ZXN0aW9uIGlzIGNvcnJlY3Qgb3Igbm90LlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5xdWVzdGlvbmAgLSBhIHF1ZXN0aW9uIG9uIHdoaWNoIHlvdSBoYXZlIHRvIGRlY2lkZSBpZiB0aGUgYW5zd2VyIGlzIGNvcnJlY3Qgb3Igbm90LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5yZXN1bHRgIC0gcmV0dXJucyBgdHJ1ZWAsIGlmIGFuIGFuc3dlciBpcyBjb3JyZWN0LCBvciBgZmFsc2VgLCBpZiB0aGUgYW5zd2VyIGlzIG5vdCBjb3JyZWN0LiBVc2UgcXVlc3Rpb25zJyBgdmFsdWVgIGFuZCBgY29ycmVjdEFuc3dlcmAgcHJvcGVydGllcyB0byByZXR1cm4gdGhlIGNvcnJlY3QgdmFsdWUuXG4gICAqIDxici8+IGBvcHRpb25zLmNvcnJlY3RBbnN3ZXJzYCAtIHlvdSBtYXkgY2hhbmdlIHRoZSBkZWZhdWx0IG51bWJlciBvZiBjb3JyZWN0IG9yIGluY29ycmVjdCBhbnN3ZXJzIGluIHRoZSBxdWVzdGlvbiwgZm9yIGV4YW1wbGUgZm9yIG1hdHJpeCwgd2hlcmUgZWFjaCByb3cgaXMgYSBxdWl6IHF1ZXN0aW9uLlxuICAgKiBAc2VlIFF1ZXN0aW9uLnZhbHVlXG4gICAqIEBzZWUgUXVlc3Rpb24uY29ycmVjdEFuc3dlclxuICAgKi9cbiAgcHVibGljIG9uSXNBbnN3ZXJDb3JyZWN0OiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxcbiAgICBTdXJ2ZXlNb2RlbFxuICA+KCk7XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBldmVudCB0byBjb250cm9sIGRyYWcmZHJvcCBvcGVyYXRpb25zIGR1cmluZyBkZXNpZ24gbW9kZS5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMuYWxsb3dgIC0gc2V0IGl0IHRvIGBmYWxzZWAgdG8gZGlzYWJsZSBkcmFnZ2luZy5cbiAgICogPGJyLz4gYG9wdGlvbnMudGFyZ2V0YCAtIGEgdGFyZ2V0IGVsZW1lbnQgdGhhdCBpcyBkcmFnZ2VkLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5zb3VyY2VgIC0gYSBzb3VyY2UgZWxlbWVudC4gSXQgY2FuIGJlIGBudWxsYCwgaWYgaXQgaXMgYSBuZXcgZWxlbWVudCwgZHJhZ2dpbmcgZnJvbSB0b29sYm94LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5wYXJlbnRgIC0gYSBwYWdlIG9yIHBhbmVsIHdoZXJlIHRhcmdldCBlbGVtZW50IGlzIGRyYWdnaW5nLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5pbnNlcnRCZWZvcmVgIC0gYW4gZWxlbWVudCBiZWZvcmUgdGhlIHRhcmdldCBlbGVtZW50IGlzIGRyYWdnaW5nLiBJdCBjYW4gYmUgYG51bGxgIGlmIHBhcmVudCBjb250YWluZXIgKHBhZ2Ugb3IgcGFuZWwpIGlzIGVtcHR5IG9yIGRyYWdnaW5nIGFuIGVsZW1lbnQgYWZ0ZXIgdGhlIGxhc3QgZWxlbWVudCBpbiBhIGNvbnRhaW5lci5cbiAgICogPGJyLz4gYG9wdGlvbnMuaW5zZXJ0QWZ0ZXJgIC0gYW4gZWxlbWVudCBhZnRlciB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgZHJhZ2dpbmcuIEl0IGNhbiBiZSBgbnVsbGAgaWYgcGFyZW50IGNvbnRhaW5lciAocGFnZSBvciBwYW5lbCkgaXMgZW1wdHkgb3IgZHJhZ2dpbmcgZWxlbWVudCB0byB0aGUgZmlyc3QgcG9zaXRpb24gd2l0aGluIHRoZSBwYXJlbnQgY29udGFpbmVyLlxuICAgKiBAc2VlIHNldERlc2lnbk1vZGVcbiAgICogQHNlZSBpc0Rlc2lnbk1vZGVcbiAgICovXG4gIHB1YmxpYyBvbkRyYWdEcm9wQWxsb3c6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFN1cnZleU1vZGVsPigpO1xuICAvKipcbiAgICogVXNlIHRoaXMgZXZlbnQgdG8gY29udHJvbCBzY3JvbGxpbmcgZWxlbWVudCB0byB0b3AuIFlvdSBjYW4gY2FuY2VsIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGJ5IHNldHRpbmcgb3B0aW9ucy5jYW5jZWwgcHJvcGVydHkgdG8gdHJ1ZS5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMuZWxlbWVudGAgLSBhbiBlbGVtZW50IHRoYXQgaXMgZ29pbmcgdG8gYmUgc2Nyb2xsZWQgb24gdG9wLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5xdWVzdGlvbmAgLSBhIHF1ZXN0aW9uIHRoYXQgaXMgZ29pbmcgdG8gYmUgc2Nyb2xsZWQgb24gdG9wLiBJdCBjYW4gYmUgbnVsbCBpZiBvcHRpb25zLnBhZ2UgaXMgbm90IG51bGwuXG4gICAqIDxici8+IGBvcHRpb25zLnBhZ2VgIC0gYSBwYWdlIHRoYXQgaXMgZ29pbmcgdG8gYmUgc2Nyb2xsZWQgb24gdG9wLiBJdCBjYW4gYmUgbnVsbCBpZiBvcHRpb25zLnF1ZXN0aW9uIGlzIG5vdCBudWxsLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5lbGVtZW50SWRgIC0gdGhlIHVuaXF1ZSBlbGVtZW50IERPTSBJZC5cbiAgICogPGJyLz4gYG9wdGlvbnMuY2FuY2VsYCAtIHNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUgdG8gY2FuY2VsIHRoZSBkZWZhdWx0IHNjcm9sbGluZy5cbiAgICovXG4gIHB1YmxpYyBvblNjcm9sbGluZ0VsZW1lbnRUb1RvcDogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuXG4gIHB1YmxpYyBvbkxvY2FsZUNoYW5nZWRFdmVudDogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuXG4gIC8qKlxuICAgKiBVc2UgdGhpcyBldmVudCB0byBjcmVhdGUvY3VzdG9taXplIGFjdGlvbnMgdG8gYmUgZGlzcGxheWVkIGluIGEgcXVlc3Rpb24ncyB0aXRsZS5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSBBIFtTdXJ2ZXldKGh0dHBzOi8vc3VydmV5anMuaW8vRG9jdW1lbnRhdGlvbi9MaWJyYXJ5P2lkPVN1cnZleU1vZGVsKSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLnF1ZXN0aW9uYCAtIEEgW1F1ZXN0aW9uXShodHRwczovL3N1cnZleWpzLmlvL0RvY3VtZW50YXRpb24vTGlicmFyeT9pZD1RdWVzdGlvbikgb2JqZWN0IGZvciB3aGljaCB0aGUgZXZlbnQgaXMgZmlyZWQuXG4gICAqIDxici8+IGBvcHRpb25zLnRpdGxlQWN0aW9uc2AgLSBBIGxpc3Qgb2YgYWN0aW9ucyAoW0lBY3Rpb25dKGh0dHBzOi8vc3VydmV5anMuaW8vRG9jdW1lbnRhdGlvbi9MaWJyYXJ5P2lkPUlBY3Rpb24pIG9iamVjdHMpIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvY2Vzc2VkIHF1ZXN0aW9uLlxuICAgKiBAc2VlIElBY3Rpb25cbiAgICogQHNlZSBRdWVzdGlvblxuICAgKi9cbiAgcHVibGljIG9uR2V0UXVlc3Rpb25UaXRsZUFjdGlvbnM6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcbiAgLyoqXG4gICAqIFVzZSB0aGlzIGV2ZW50IHRvIGNyZWF0ZS9jdXN0b21pemUgYWN0aW9ucyB0byBiZSBkaXNwbGF5ZWQgaW4gYSBwYW5lbCdzIHRpdGxlLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIEEgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucGFuZWxgIC0gQSBwYW5lbCAoW1BhbmVsTW9kZWxdKGh0dHBzOi8vc3VydmV5anMuaW8vRG9jdW1lbnRhdGlvbi9MaWJyYXJ5P2lkPXBhbmVsbW9kZWwpIG9iamVjdCkgZm9yIHdoaWNoIHRoZSBldmVudCBpcyBmaXJlZC5cbiAgICogPGJyLz4gYG9wdGlvbnMudGl0bGVBY3Rpb25zYCAtIEEgbGlzdCBvZiBhY3Rpb25zIChbSUFjdGlvbl0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9Eb2N1bWVudGF0aW9uL0xpYnJhcnk/aWQ9SUFjdGlvbikgb2JqZWN0cykgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9jZXNzZWQgcGFuZWwuXG4gICAqIEBzZWUgSUFjdGlvblxuICAgKiBAc2VlIFBhbmVsTW9kZWxcbiAgICovXG4gIHB1YmxpYyBvbkdldFBhbmVsVGl0bGVBY3Rpb25zOiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxcbiAgICBTdXJ2ZXlNb2RlbFxuICA+KCk7XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBldmVudCB0byBjcmVhdGUvY3VzdG9taXplIGFjdGlvbnMgdG8gYmUgZGlzcGxheWVkIGluIGEgcGFnZSdzIHRpdGxlLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIEEgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucGFnZWAgLSBBIHBhZ2UgKFtQYWdlTW9kZWxdKGh0dHBzOi8vc3VydmV5anMuaW8vRG9jdW1lbnRhdGlvbi9MaWJyYXJ5P2lkPXBhZ2Vtb2RlbCkgb2JqZWN0KSBmb3Igd2hpY2ggdGhlIGV2ZW50IGlzIGZpcmVkLlxuICAgKiA8YnIvPiBgb3B0aW9ucy50aXRsZUFjdGlvbnNgIC0gQSBsaXN0IG9mIGFjdGlvbnMgKFtJQWN0aW9uXShodHRwczovL3N1cnZleWpzLmlvL0RvY3VtZW50YXRpb24vTGlicmFyeT9pZD1JQWN0aW9uKSBvYmplY3RzKSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2Nlc3NlZCBwYWdlLlxuICAgKiBAc2VlIElBY3Rpb25cbiAgICogQHNlZSBQYWdlTW9kZWxcbiAgICovXG4gIHB1YmxpYyBvbkdldFBhZ2VUaXRsZUFjdGlvbnM6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcbiAgLyoqXG4gICAqIFVzZSB0aGlzIGV2ZW50IHRvIGNyZWF0ZS9jdXN0b21pemUgYWN0aW9ucyB0byBiZSBkaXNwbGF5ZWQgaW4gYSBtYXRyaXggcXVlc3Rpb24ncyByb3cuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gQSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5xdWVzdGlvbmAgLSBBIG1hdHJpeCBxdWVzdGlvbiAoW1F1ZXN0aW9uTWF0cml4QmFzZU1vZGVsXShodHRwczovL3N1cnZleWpzLmlvL0RvY3VtZW50YXRpb24vTGlicmFyeT9pZD1xdWVzdGlvbm1hdHJpeGJhc2Vtb2RlbCkgb2JqZWN0KSBmb3Igd2hpY2ggdGhlIGV2ZW50IGlzIGZpcmVkLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5yb3dgIC0gQSBtYXRyaXggcm93IGZvciB3aGljaCB0aGUgZXZlbnQgaXMgZmlyZWQuXG4gICAqIDxici8+IGBvcHRpb25zLmFjdGlvbnNgIC0gQSBsaXN0IG9mIGFjdGlvbnMgKFtJQWN0aW9uXShodHRwczovL3N1cnZleWpzLmlvL0RvY3VtZW50YXRpb24vTGlicmFyeT9pZD1JQWN0aW9uKSBvYmplY3RzKSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2Nlc3NlZCBtYXRyaXggcXVlc3Rpb24gYW5kIHJvdy5cbiAgICogQHNlZSBJQWN0aW9uXG4gICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZVxuICAgKi9cbiAgcHVibGljIG9uR2V0TWF0cml4Um93QWN0aW9uczogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGFmdGVyIHRoZSBzdXJ2ZXkgZWxlbWVudCBjb250ZW50IHdhcyBjb2xsYXBzZWQgb3IgZXhwYW5kZWQuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLmVsZW1lbnRgIC0gU3BlY2lmaWVzIHdoaWNoIHN1cnZleSBlbGVtZW50IGNvbnRlbnQgd2FzIGNvbGxhcHNlZCBvciBleHBhbmRlZC5cbiAgICogQHNlZSBvbkVsZW1lbnRDb250ZW50VmlzaWJpbGl0eUNoYW5nZWRcbiAgICovXG4gIHB1YmxpYyBvbkVsZW1lbnRDb250ZW50VmlzaWJpbGl0eUNoYW5nZWQ6IEV2ZW50QmFzZTxcbiAgICBTdXJ2ZXlNb2RlbFxuICA+ID0gdGhpcy5hZGRFdmVudDxTdXJ2ZXlNb2RlbD4oKTtcblxuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGJlZm9yZSBleHByZXNzaW9uIHF1ZXN0aW9uIGNvbnZlcnQgaXQncyB2YWx1ZSBpbnRvIGRpc3BsYXkgdmFsdWUgZm9yIHJlbmRlcmluZy5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucXVlc3Rpb25gIC0gVGhlIGV4cHJlc3Npb24gcXVlc3Rpb24uXG4gICAqIDxici8+IGBvcHRpb25zLnZhbHVlYCAtIFRoZSBxdWVzdGlvbiB2YWx1ZS5cbiAgICogPGJyLz4gYG9wdGlvbnMuZGlzcGxheVZhbHVlYCAtIHRoZSBkaXNwbGF5IHZhbHVlIHRoYXQgeW91IGNhbiBjaGFuZ2UgYmVmb3JlIHJlbmRlcmluZy5cbiAgICovXG4gIHB1YmxpYyBvbkdldEV4cHJlc3Npb25EaXNwbGF5VmFsdWU6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcblxuICAvLyNlbmRyZWdpb25cblxuICBjb25zdHJ1Y3Rvcihqc29uT2JqOiBhbnkgPSBudWxsKSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBTdXJ2ZXlNb2RlbC5zdHlsZXNNYW5hZ2VyID0gbmV3IFN0eWxlc01hbmFnZXIoKTtcbiAgICB9XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImxvZ29cIiwgdGhpcywgZmFsc2UpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJjb21wbGV0ZWRIdG1sXCIsIHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJjb21wbGV0ZWRCZWZvcmVIdG1sXCIsIHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJsb2FkaW5nSHRtbFwiLCB0aGlzKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwic3RhcnRTdXJ2ZXlUZXh0XCIsIHRoaXMsIGZhbHNlLCB0cnVlKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwicGFnZVByZXZUZXh0XCIsIHRoaXMsIGZhbHNlLCB0cnVlKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwicGFnZU5leHRUZXh0XCIsIHRoaXMsIGZhbHNlLCB0cnVlKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwiY29tcGxldGVUZXh0XCIsIHRoaXMsIGZhbHNlLCB0cnVlKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwicHJldmlld1RleHRcIiwgdGhpcywgZmFsc2UsIHRydWUpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJlZGl0VGV4dFwiLCB0aGlzLCBmYWxzZSwgdHJ1ZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInF1ZXN0aW9uVGl0bGVUZW1wbGF0ZVwiLCB0aGlzLCB0cnVlKTtcblxuICAgIHRoaXMudGV4dFByZVByb2Nlc3NvciA9IG5ldyBUZXh0UHJlUHJvY2Vzc29yKCk7XG4gICAgdGhpcy50ZXh0UHJlUHJvY2Vzc29yLm9uUHJvY2VzcyA9ICh0ZXh0VmFsdWU6IFRleHRQcmVQcm9jZXNzb3JWYWx1ZSkgPT4ge1xuICAgICAgdGhpcy5nZXRQcm9jZXNzZWRUZXh0VmFsdWUodGV4dFZhbHVlKTtcbiAgICB9O1xuICAgIHRoaXMuY3JlYXRlTmV3QXJyYXkoXG4gICAgICBcInBhZ2VzXCIsXG4gICAgICAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmRvT25QYWdlQWRkZWQodmFsdWUpO1xuICAgICAgfSxcbiAgICAgICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuZG9PblBhZ2VSZW1vdmVkKHZhbHVlKTtcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMuY3JlYXRlTmV3QXJyYXkoXCJ0cmlnZ2Vyc1wiLCAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgdmFsdWUuc2V0T3duZXIodGhpcyk7XG4gICAgfSk7XG4gICAgdGhpcy5jcmVhdGVOZXdBcnJheShcImNhbGN1bGF0ZWRWYWx1ZXNcIiwgKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgIHZhbHVlLnNldE93bmVyKHRoaXMpO1xuICAgIH0pO1xuICAgIHRoaXMuY3JlYXRlTmV3QXJyYXkoXCJjb21wbGV0ZWRIdG1sT25Db25kaXRpb25cIiwgKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgIHZhbHVlLmxvY093bmVyID0gdGhpcztcbiAgICB9KTtcbiAgICB0aGlzLmNyZWF0ZU5ld0FycmF5KFwibmF2aWdhdGVUb1VybE9uQ29uZGl0aW9uXCIsICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICB2YWx1ZS5sb2NPd25lciA9IHRoaXM7XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcImZpcnN0UGFnZUlzU3RhcnRlZFwiLCAoKSA9PiB7XG4gICAgICB0aGlzLm9uRmlyc3RQYWdlSXNTdGFydGVkQ2hhbmdlZCgpO1xuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJtb2RlXCIsICgpID0+IHtcbiAgICAgIHRoaXMub25Nb2RlQ2hhbmdlZCgpO1xuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJwcm9ncmVzc0JhclR5cGVcIiwgKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVQcm9ncmVzc1RleHQoKTtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoXG4gICAgICBbXCJxdWVzdGlvblN0YXJ0SW5kZXhcIiwgXCJyZXF1aXJlZFRleHRcIiwgXCJxdWVzdGlvblRpdGxlUGF0dGVyblwiXSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5yZXNldFZpc2libGVJbmRleGVzKCk7XG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLm9uR2V0UXVlc3Rpb25Oby5vbkNhbGxiYWNrc0NoYW5nZWQgPSAoKSA9PiB7XG4gICAgICB0aGlzLnJlc2V0VmlzaWJsZUluZGV4ZXMoKTtcbiAgICB9O1xuICAgIHRoaXMub25Qcm9ncmVzc1RleHQub25DYWxsYmFja3NDaGFuZ2VkID0gKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVQcm9ncmVzc1RleHQoKTtcbiAgICB9O1xuICAgIHRoaXMub25UZXh0TWFya2Rvd24ub25DYWxsYmFja3NDaGFuZ2VkID0gKCkgPT4ge1xuICAgICAgdGhpcy5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIH07XG4gICAgdGhpcy5vbkdldFF1ZXN0aW9uVGl0bGUub25DYWxsYmFja3NDaGFuZ2VkID0gKCkgPT4ge1xuICAgICAgdGhpcy5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIH07XG4gICAgdGhpcy5vbkJlZm9yZUNyZWF0aW5nKCk7XG4gICAgaWYgKGpzb25PYmopIHtcbiAgICAgIGlmICh0eXBlb2YganNvbk9iaiA9PT0gXCJzdHJpbmdcIiB8fCBqc29uT2JqIGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgICAgIGpzb25PYmogPSBKU09OLnBhcnNlKGpzb25PYmogYXMgc3RyaW5nKTtcbiAgICAgIH1cbiAgICAgIGlmIChqc29uT2JqICYmIGpzb25PYmouY2xpZW50SWQpIHtcbiAgICAgICAgdGhpcy5jbGllbnRJZCA9IGpzb25PYmouY2xpZW50SWQ7XG4gICAgICB9XG4gICAgICB0aGlzLmZyb21KU09OKGpzb25PYmopO1xuICAgICAgaWYgKHRoaXMuc3VydmV5SWQpIHtcbiAgICAgICAgdGhpcy5sb2FkU3VydmV5RnJvbVNlcnZpY2UodGhpcy5zdXJ2ZXlJZCwgdGhpcy5jbGllbnRJZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMub25DcmVhdGluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIGVycm9ycyBvbiBsb2FkaW5nIHN1cnZleSBKU09OLiBJZiB0aGUgbGlzdCBpcyBlbXB0eSBhZnRlciBsb2FkaW5nIGEgSlNPTiwgdGhlbiB0aGUgSlNPTiBpcyBjb3JyZWN0IGFuZCBoYXMgbm8gZXJyb3JzLlxuICAgKiBAc2VlIEpzb25FcnJvclxuICAgKi9cbiAgcHVibGljIGpzb25FcnJvcnM6IEFycmF5PEpzb25FcnJvcj4gPSBudWxsO1xuXG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwic3VydmV5XCI7XG4gIH1cbiAgcHJvdGVjdGVkIG9uUHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nLCBvbGRWYWx1ZTogYW55LCBuZXdWYWx1ZTogYW55KSB7XG4gICAgaWYgKG5hbWUgPT09IFwicXVlc3Rpb25zT25QYWdlTW9kZVwiKSB7XG4gICAgICB0aGlzLm9uUXVlc3Rpb25zT25QYWdlTW9kZUNoYW5nZWQob2xkVmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgcGFnZXMgaW4gdGhlIHN1cnZleSwgaW5jbHVkaW5nIGludmlzaWJsZSBwYWdlcy5cbiAgICogQHNlZSBQYWdlTW9kZWxcbiAgICogQHNlZSB2aXNpYmxlUGFnZXNcbiAgICovXG4gIHB1YmxpYyBnZXQgcGFnZXMoKTogQXJyYXk8UGFnZU1vZGVsPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInBhZ2VzXCIpO1xuICB9XG4gIHB1YmxpYyBnZXRDc3MoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5jc3M7XG4gIH1cbiAgcHJpdmF0ZSBjc3NWYWx1ZTogYW55ID0gbnVsbDtcbiAgcHVibGljIGdldCBjc3MoKTogYW55IHtcbiAgICBpZiAoIXRoaXMuY3NzVmFsdWUpIHtcbiAgICAgIHRoaXMuY3NzVmFsdWUgPSB7fTtcbiAgICAgIHRoaXMuY29weUNzc0NsYXNzZXModGhpcy5jc3NWYWx1ZSwgc3VydmV5Q3NzLmdldENzcygpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY3NzVmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCBjc3ModmFsdWU6IGFueSkge1xuICAgIHRoaXMudXBkYXRlRWxlbWVudENzcyhmYWxzZSk7XG4gICAgdGhpcy5tZXJnZVZhbHVlcyh2YWx1ZSwgdGhpcy5jc3MpO1xuICB9XG4gIHB1YmxpYyBnZXQgY3NzVGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jc3MudGl0bGU7XG4gIH1cbiAgcHVibGljIGdldCBjc3NOYXZpZ2F0aW9uQ29tcGxldGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TmF2aWdhdGlvbkNzcyhcbiAgICAgIHRoaXMuY3NzLm5hdmlnYXRpb25CdXR0b24sXG4gICAgICB0aGlzLmNzcy5uYXZpZ2F0aW9uLmNvbXBsZXRlXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNzc05hdmlnYXRpb25QcmV2aWV3KCkge1xuICAgIHJldHVybiB0aGlzLmdldE5hdmlnYXRpb25Dc3MoXG4gICAgICB0aGlzLmNzcy5uYXZpZ2F0aW9uQnV0dG9uLFxuICAgICAgdGhpcy5jc3MubmF2aWdhdGlvbi5wcmV2aWV3XG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNzc05hdmlnYXRpb25FZGl0KCkge1xuICAgIHJldHVybiB0aGlzLmdldE5hdmlnYXRpb25Dc3MoXG4gICAgICB0aGlzLmNzcy5uYXZpZ2F0aW9uQnV0dG9uLFxuICAgICAgdGhpcy5jc3MubmF2aWdhdGlvbi5lZGl0XG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNzc05hdmlnYXRpb25QcmV2KCkge1xuICAgIHJldHVybiB0aGlzLmdldE5hdmlnYXRpb25Dc3MoXG4gICAgICB0aGlzLmNzcy5uYXZpZ2F0aW9uQnV0dG9uLFxuICAgICAgdGhpcy5jc3MubmF2aWdhdGlvbi5wcmV2XG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNzc05hdmlnYXRpb25TdGFydCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROYXZpZ2F0aW9uQ3NzKFxuICAgICAgdGhpcy5jc3MubmF2aWdhdGlvbkJ1dHRvbixcbiAgICAgIHRoaXMuY3NzLm5hdmlnYXRpb24uc3RhcnRcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXQgY3NzTmF2aWdhdGlvbk5leHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TmF2aWdhdGlvbkNzcyhcbiAgICAgIHRoaXMuY3NzLm5hdmlnYXRpb25CdXR0b24sXG4gICAgICB0aGlzLmNzcy5uYXZpZ2F0aW9uLm5leHRcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXQgY29tcGxldGVkQ3NzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5ldyBDc3NDbGFzc0J1aWxkZXIoKS5hcHBlbmQodGhpcy5jc3MuYm9keSlcbiAgICAgIC5hcHBlbmQodGhpcy5jc3MuY29tcGxldGVkUGFnZSkudG9TdHJpbmcoKTtcbiAgfVxuICBwcml2YXRlIGdldE5hdmlnYXRpb25Dc3MobWFpbjogc3RyaW5nLCBidG46IHN0cmluZykge1xuICAgIHJldHVybiBuZXcgQ3NzQ2xhc3NCdWlsZGVyKCkuYXBwZW5kKG1haW4pXG4gICAgICAuYXBwZW5kKGJ0bikudG9TdHJpbmcoKTtcbiAgfVxuICBwcml2YXRlIGxhenlSZW5kZXJpbmdWYWx1ZTogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEJ5IGRlZmF1bHQgYWxsIHJvd3MgYXJlIHJlbmRlcmVkIG5vIG1hdHRlcnMgaWYgdGhleSBhcmUgdmlzaWJsZSBvciBub3QuXG4gICAqIFNldCBpdCB0cnVlLCBhbmQgc3VydmV5IG1hcmt1cCByb3dzIHdpbGwgYmUgcmVuZGVyZWQgb25seSBpZiB0aGV5IGFyZSB2aXNpYmxlIGluIHZpZXdwb3J0LlxuICAgKiBUaGlzIGZlYXR1cmUgaXMgZXhwZXJpbWFudGFsIGFuZCBtaWdodCBkbyBub3Qgc3VwcG9ydCBhbGwgdGhlIHVzZSBjYXNlcy5cbiAgICovXG4gIHB1YmxpYyBnZXQgbGF6eVJlbmRlcmluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sYXp5UmVuZGVyaW5nVmFsdWUgPT09IHRydWU7XG4gIH1cbiAgcHVibGljIHNldCBsYXp5UmVuZGVyaW5nKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMubGF6eVJlbmRlcmluZ1ZhbHVlID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNMYXp5UmVuZGVyaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxhenlSZW5kZXJpbmcgfHwgc2V0dGluZ3MubGF6eVJvd3NSZW5kZXJpbmc7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVMYXp5UmVuZGVyaW5nUm93c09uUmVtb3ZpbmdFbGVtZW50cygpIHtcbiAgICBpZiAoIXRoaXMuaXNMYXp5UmVuZGVyaW5nKSByZXR1cm47XG4gICAgdmFyIHBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlO1xuICAgIGlmICghIXBhZ2UpIHtcbiAgICAgIHNjcm9sbEVsZW1lbnRCeUNoaWxkSWQocGFnZS5pZCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgYSBsaXN0IG9mIHRyaWdnZXJzIGluIHRoZSBzdXJ2ZXkuXG4gICAqIEBzZWUgU3VydmV5VHJpZ2dlclxuICAgKi9cbiAgcHVibGljIGdldCB0cmlnZ2VycygpOiBBcnJheTxTdXJ2ZXlUcmlnZ2VyPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInRyaWdnZXJzXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdHJpZ2dlcnModmFsOiBBcnJheTxTdXJ2ZXlUcmlnZ2VyPikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInRyaWdnZXJzXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyBhIGxpc3Qgb2YgY2FsY3VsYXRlZCB2YWx1ZXMgaW4gdGhlIHN1cnZleS5cbiAgICogQHNlZSBDYWxjdWxhdGVkVmFsdWVcbiAgICovXG4gIHB1YmxpYyBnZXQgY2FsY3VsYXRlZFZhbHVlcygpOiBBcnJheTxDYWxjdWxhdGVkVmFsdWU+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY2FsY3VsYXRlZFZhbHVlc1wiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNhbGN1bGF0ZWRWYWx1ZXModmFsOiBBcnJheTxDYWxjdWxhdGVkVmFsdWU+KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY2FsY3VsYXRlZFZhbHVlc1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgYW4gaWRlbnRpZmllciBvZiBhIHN1cnZleSBtb2RlbCBsb2FkZWQgZnJvbSB0aGUgW2FwaS5zdXJ2ZXlqcy5pb10oaHR0cHM6Ly9hcGkuc3VydmV5anMuaW8pIHNlcnZpY2UuIFdoZW4gc3BlY2lmaWVkLCB0aGUgc3VydmV5IEpTT04gaXMgYXV0b21hdGljYWxseSBsb2FkZWQgZnJvbSBbYXBpLnN1cnZleWpzLmlvXShodHRwczovL2FwaS5zdXJ2ZXlqcy5pbykgc2VydmljZS5cbiAgICogQHNlZSBsb2FkU3VydmV5RnJvbVNlcnZpY2VcbiAgICogQHNlZSBvbkxvYWRlZFN1cnZleUZyb21TZXJ2aWNlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN1cnZleUlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInN1cnZleUlkXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc3VydmV5SWQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzdXJ2ZXlJZFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgYW4gaWRlbnRpZmllciBvZiBhIHN1cnZleSBtb2RlbCBzYXZlZCB0byB0aGUgW2FwaS5zdXJ2ZXlqcy5pb10oaHR0cHM6Ly9hcGkuc3VydmV5anMuaW8pIHNlcnZpY2UuIFdoZW4gc3BlY2lmaWVkLCB0aGUgc3VydmV5IGRhdGEgaXMgYXV0b21hdGljYWxseSBzYXZlZCB0byB0aGUgW2FwaS5zdXJ2ZXlqcy5pb10oaHR0cHM6Ly9hcGkuc3VydmV5anMuaW8pIHNlcnZpY2UuXG4gICAqIEBzZWUgb25Db21wbGV0ZVxuICAgKiBAc2VlIHN1cnZleVNob3dEYXRhU2F2aW5nXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN1cnZleVBvc3RJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzdXJ2ZXlQb3N0SWRcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBzdXJ2ZXlQb3N0SWQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzdXJ2ZXlQb3N0SWRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHVzZXIncyBpZGVudGlmaWVyIChlLmcuLCBlLW1haWwgb3IgdW5pcXVlIGN1c3RvbWVyIGlkKSBpbiB5b3VyIHdlYiBhcHBsaWNhdGlvbi5cbiAgICogSWYgeW91IGxvYWQgc3VydmV5IG9yIHBvc3Qgc3VydmV5IHJlc3VsdHMgZnJvbS90byBbYXBpLnN1cnZleWpzLmlvXShodHRwczovL2FwaS5zdXJ2ZXlqcy5pbykgc2VydmljZSwgdGhlbiB0aGUgbGlicmFyeSBkbyBub3QgYWxsb3cgdXNlcnMgdG8gcnVuIHRoZSBzYW1lIHN1cnZleSB0aGUgc2Vjb25kIHRpbWUuXG4gICAqIE9uIHRoZSBzZWNvbmQgcnVuLCB0aGUgdXNlciB3aWxsIHNlZSB0aGUgc3VydmV5IGNvbXBsZXRlIHBhZ2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNsaWVudElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNsaWVudElkXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY2xpZW50SWQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjbGllbnRJZFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgYSBjb29raWUgbmFtZSB1c2VkIHRvIHNhdmUgaW5mb3JtYXRpb24gYWJvdXQgY29tcGxldGluZyB0aGUgc3VydmV5LlxuICAgKiBJZiB0aGUgcHJvcGVydHkgaXMgbm90IGVtcHR5LCBiZWZvcmUgc3RhcnRpbmcgdGhlIHN1cnZleSwgdGhlIFN1cnZleSBsaWJyYXJ5IGNoZWNrcyBpZiB0aGUgY29va2llIHdpdGggdGhpcyBuYW1lIGV4aXN0cy5cbiAgICogSWYgaXQgaXMgYHRydWVgLCB0aGUgc3VydmV5IGdvZXMgdG8gY29tcGxldGUgbW9kZSBhbmQgYSB1c2VyIHNlZXMgdGhlIHN1cnZleSBjb21wbGV0ZSBwYWdlLiBPbiBjb21wbGV0aW5nIHRoZSBzdXJ2ZXkgdGhlIGNvb2tpZSB3aXRoIHRoaXMgbmFtZSBpcyBjcmVhdGVkLlxuICAgKi9cbiAgcHVibGljIGdldCBjb29raWVOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvb2tpZU5hbWVcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBjb29raWVOYW1lKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29va2llTmFtZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgd2hldGhlciB0byBzYXZlIHN1cnZleSByZXN1bHRzIG9uIGNvbXBsZXRpbmcgZXZlcnkgcGFnZS4gSWYgdGhlIHByb3BlcnR5IHZhbHVlIGlzIHNldCB0byBgdHJ1ZWAsIHRoZSBgb25QYXJ0aWFsU2VuZGAgZXZlbnQgaXMgZmlyZWQuXG4gICAqIEBzZWUgb25QYXJ0aWFsU2VuZFxuICAgKiBAc2VlIGNsaWVudElkXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNlbmRSZXN1bHRPblBhZ2VOZXh0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzZW5kUmVzdWx0T25QYWdlTmV4dFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBzZW5kUmVzdWx0T25QYWdlTmV4dCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzZW5kUmVzdWx0T25QYWdlTmV4dFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgd2hldGhlciB0byBzaG93IHRoZSBwcm9ncmVzcyBvbiBzYXZpbmcvc2VuZGluZyBkYXRhIGludG8gdGhlIFthcGkuc3VydmV5anMuaW9dKGh0dHBzOi8vYXBpLnN1cnZleWpzLmlvKSBzZXJ2aWNlLlxuICAgKiBAc2VlIHN1cnZleVBvc3RJZFxuICAgKi9cbiAgcHVibGljIGdldCBzdXJ2ZXlTaG93RGF0YVNhdmluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic3VydmV5U2hvd0RhdGFTYXZpbmdcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgc3VydmV5U2hvd0RhdGFTYXZpbmcodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic3VydmV5U2hvd0RhdGFTYXZpbmdcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHdoZXRoZXIgdGhlIGZpcnN0IGlucHV0IGlzIGZvY3VzZWQgb24gc2hvd2luZyBhIG5leHQgb3IgYSBwcmV2aW91cyBwYWdlLlxuICAgKi9cbiAgcHVibGljIGdldCBmb2N1c0ZpcnN0UXVlc3Rpb25BdXRvbWF0aWMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImZvY3VzRmlyc3RRdWVzdGlvbkF1dG9tYXRpY1wiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGZvY3VzRmlyc3RRdWVzdGlvbkF1dG9tYXRpYyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJmb2N1c0ZpcnN0UXVlc3Rpb25BdXRvbWF0aWNcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHdoZXRoZXIgdGhlIGZpcnN0IGlucHV0IGlzIGZvY3VzZWQgaWYgdGhlIGN1cnJlbnQgcGFnZSBoYXMgZXJyb3JzLlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBgZmFsc2VgICh0aGUgZGVmYXVsdCB2YWx1ZSBpcyBgdHJ1ZWApIGlmIHlvdSBkbyBub3Qgd2FudCB0byBicmluZyB0aGUgZm9jdXMgdG8gdGhlIGZpcnN0IHF1ZXN0aW9uIHRoYXQgaGFzIGVycm9yIG9uIHRoZSBwYWdlLlxuICAgKi9cbiAgcHVibGljIGdldCBmb2N1c09uRmlyc3RFcnJvcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZm9jdXNPbkZpcnN0RXJyb3JcIik7XG4gIH1cbiAgcHVibGljIHNldCBmb2N1c09uRmlyc3RFcnJvcih2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJmb2N1c09uRmlyc3RFcnJvclwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIG5hdmlnYXRpb24gYnV0dG9ucyBwb3NpdGlvbi5cbiAgICogUG9zc2libGUgdmFsdWVzOiAnYm90dG9tJyAoZGVmYXVsdCksICd0b3AnLCAnYm90aCcgYW5kICdub25lJy4gU2V0IGl0IHRvICdub25lJyB0byBoaWRlICdQcmV2JywgJ05leHQnIGFuZCAnQ29tcGxldGUnIGJ1dHRvbnMuXG4gICAqIEl0IG1ha2VzIHNlbnNlIGlmIHlvdSBhcmUgZ29pbmcgdG8gY3JlYXRlIGEgY3VzdG9tIG5hdmlnYXRpb24sIGhhdmUgb25seSBhIHNpbmdsZSBwYWdlLCBvciB0aGUgYGdvTmV4dFBhZ2VBdXRvbWF0aWNgIHByb3BlcnR5IGlzIHNldCB0byBgdHJ1ZWAuXG4gICAqIEBzZWUgZ29OZXh0UGFnZUF1dG9tYXRpY1xuICAgKiBAc2VlIHNob3dQcmV2QnV0dG9uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dOYXZpZ2F0aW9uQnV0dG9ucygpOiBzdHJpbmcgfCBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93TmF2aWdhdGlvbkJ1dHRvbnNcIik7XG4gIH1cbiAgcHVibGljIHNldCBzaG93TmF2aWdhdGlvbkJ1dHRvbnModmFsOiBzdHJpbmcgfCBhbnkpIHtcbiAgICBpZiAodmFsID09PSB0cnVlIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YWwgPSBcImJvdHRvbVwiO1xuICAgIH1cbiAgICBpZiAodmFsID09PSBmYWxzZSkge1xuICAgICAgdmFsID0gXCJub25lXCI7XG4gICAgfVxuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dOYXZpZ2F0aW9uQnV0dG9uc1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgd2hldGhlciB0aGUgU3VydmV5IGRpc3BsYXlzIFwiUHJldlwiIGJ1dHRvbiBpbiBpdHMgcGFnZXMuIFNldCBpdCB0byBgZmFsc2VgIHRvIHByZXZlbnQgZW5kLXVzZXJzIGZyb20gZ29pbmcgYmFjayB0byB0aGVpciBhbnN3ZXJzLlxuICAgKiBAc2VlIHNob3dOYXZpZ2F0aW9uQnV0dG9uc1xuICAgKi9cbiAgcHVibGljIGdldCBzaG93UHJldkJ1dHRvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1ByZXZCdXR0b25cIik7XG4gIH1cbiAgcHVibGljIHNldCBzaG93UHJldkJ1dHRvbih2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93UHJldkJ1dHRvblwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgd2hldGhlciB0aGUgU3VydmV5IGRpc3BsYXlzIHN1cnZleSB0aXRsZSBpbiBpdHMgcGFnZXMuIFNldCBpdCB0byBgZmFsc2VgIHRvIGhpZGUgYSBzdXJ2ZXkgdGl0bGUuXG4gICAqIEBzZWUgdGl0bGVcbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1RpdGxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93VGl0bGVcIik7XG4gIH1cbiAgcHVibGljIHNldCBzaG93VGl0bGUodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1RpdGxlXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB3aGV0aGVyIHRoZSBTdXJ2ZXkgZGlzcGxheXMgcGFnZSB0aXRsZXMuIFNldCBpdCB0byBgZmFsc2VgIHRvIGhpZGUgcGFnZSB0aXRsZXMuXG4gICAqIEBzZWUgUGFnZU1vZGVsLnRpdGxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dQYWdlVGl0bGVzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93UGFnZVRpdGxlc1wiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dQYWdlVGl0bGVzKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dQYWdlVGl0bGVzXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIE9uIGZpbmlzaGluZyB0aGUgc3VydmV5IHRoZSBjb21wbGV0ZSBwYWdlIGlzIHNob3duLiBTZXQgdGhlIHByb3BlcnR5IHRvIGBmYWxzZWAsIHRvIGhpZGUgdGhlIGNvbXBsZXRlIHBhZ2UuXG4gICAqIEBzZWUgZGF0YVxuICAgKiBAc2VlIG9uQ29tcGxldGVcbiAgICogQHNlZSBuYXZpZ2F0ZVRvVXJsXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dDb21wbGV0ZWRQYWdlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93Q29tcGxldGVkUGFnZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dDb21wbGV0ZWRQYWdlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dDb21wbGV0ZWRQYWdlXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGEgdXJsIHlvdSB3YW50IHRvIG5hdmlnYXRlIGFmdGVyIGEgdXNlciBjb21wbGV0aW5nIHRoZSBzdXJ2ZXkuXG4gICAqIEJ5IGRlZmF1bHQgaXQgdXNlcyBhZnRlciBjYWxsaW5nIG9uQ29tcGxldGUgZXZlbnQuIEluIGNhc2UgY2FsbGluZyBvcHRpb25zLnNob3dEYXRhU2F2aW5nIGNhbGxiYWNrIGluIG9uQ29tcGxldGUgZXZlbnQsIG5hdmlnYXRlVG9Vcmwgd2lsbCBiZSB1c2VkIG9uIGNhbGxpbmcgb3B0aW9ucy5zaG93RGF0YVNhdmluZ1N1Y2Nlc3MgY2FsbGJhY2suXG4gICAqL1xuICBwdWJsaWMgZ2V0IG5hdmlnYXRlVG9VcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibmF2aWdhdGVUb1VybFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG5hdmlnYXRlVG9VcmwodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJuYXZpZ2F0ZVRvVXJsXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyBhIGxpc3Qgb2YgVVJMIGNvbmRpdGlvbiBpdGVtcy4gSWYgdGhlIGV4cHJlc3Npb24gb2YgdGhpcyBpdGVtIHJldHVybnMgYHRydWVgLCB0aGVuIHN1cnZleSB3aWxsIG5hdmlnYXRlIHRvIHRoZSBpdGVtIFVSTC5cbiAgICogQHNlZSBVcmxDb25kaXRpb25JdGVtXG4gICAqIEBzZWUgbmF2aWdhdGVUb1VybFxuICAgKi9cbiAgcHVibGljIGdldCBuYXZpZ2F0ZVRvVXJsT25Db25kaXRpb24oKTogQXJyYXk8VXJsQ29uZGl0aW9uSXRlbT4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJuYXZpZ2F0ZVRvVXJsT25Db25kaXRpb25cIik7XG4gIH1cbiAgcHVibGljIHNldCBuYXZpZ2F0ZVRvVXJsT25Db25kaXRpb24odmFsOiBBcnJheTxVcmxDb25kaXRpb25JdGVtPikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm5hdmlnYXRlVG9VcmxPbkNvbmRpdGlvblwiLCB2YWwpO1xuICB9XG5cbiAgcHVibGljIGdldE5hdmlnYXRlVG9VcmwoKTogc3RyaW5nIHtcbiAgICB2YXIgaXRlbSA9IHRoaXMuZ2V0RXhwcmVzc2lvbkl0ZW1PblJ1bkNvbmRpdGlvbihcbiAgICAgIHRoaXMubmF2aWdhdGVUb1VybE9uQ29uZGl0aW9uXG4gICAgKTtcbiAgICB2YXIgdXJsID0gISFpdGVtID8gKDxVcmxDb25kaXRpb25JdGVtPml0ZW0pLnVybCA6IHRoaXMubmF2aWdhdGVUb1VybDtcbiAgICBpZiAoISF1cmwpIHtcbiAgICAgIHVybCA9IHRoaXMucHJvY2Vzc1RleHQodXJsLCB0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuICBwcml2YXRlIG5hdmlnYXRlVG8oKSB7XG4gICAgdmFyIHVybCA9IHRoaXMuZ2V0TmF2aWdhdGVUb1VybCgpO1xuICAgIHZhciBvcHRpb25zID0geyB1cmw6IHVybCB9O1xuICAgIHRoaXMub25OYXZpZ2F0ZVRvVXJsLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgaWYgKCFvcHRpb25zLnVybCB8fCB0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiIHx8ICF3aW5kb3cubG9jYXRpb24pXG4gICAgICByZXR1cm47XG4gICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBvcHRpb25zLnVybDtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSByZXF1aXJlZCBxdWVzdGlvbiBtYXJrLiBUaGUgcmVxdWlyZWQgcXVlc3Rpb24gbWFyayBpcyBhIGNoYXIgb3Igc3RyaW5nIHRoYXQgaXMgcmVuZGVyZWQgaW4gdGhlIHJlcXVpcmVkIHF1ZXN0aW9ucycgdGl0bGVzLlxuICAgKiBAc2VlIFF1ZXN0aW9uLnRpdGxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlcXVpcmVkVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyZXF1aXJlZFRleHRcIiwgXCIqXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcmVxdWlyZWRUZXh0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmVxdWlyZWRUZXh0XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB3aGV0aGVyIHRvIGhpZGUgYWxsIHJlcXVpcmVkIGVycm9ycy5cbiAgICovXG4gIHB1YmxpYyBoaWRlUmVxdWlyZWRFcnJvcnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgYmVmb3JlU2V0dGluZ1F1ZXN0aW9uRXJyb3JzKFxuICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgZXJyb3JzOiBBcnJheTxTdXJ2ZXlFcnJvcj5cbiAgKTogdm9pZCB7XG4gICAgdGhpcy5tYWFrZVJlcXVpcmVkRXJyb3JzSW52aXNpYmdsZShlcnJvcnMpO1xuICAgIHRoaXMub25TZXR0aW5nUXVlc3Rpb25FcnJvcnMuZmlyZSh0aGlzLCB7XG4gICAgICBxdWVzdGlvbjogcXVlc3Rpb24sXG4gICAgICBlcnJvcnM6IGVycm9ycyxcbiAgICB9KTtcbiAgfVxuICBiZWZvcmVTZXR0aW5nUGFuZWxFcnJvcnMocXVlc3Rpb246IElQYW5lbCwgZXJyb3JzOiBBcnJheTxTdXJ2ZXlFcnJvcj4pOiB2b2lkIHtcbiAgICB0aGlzLm1hYWtlUmVxdWlyZWRFcnJvcnNJbnZpc2liZ2xlKGVycm9ycyk7XG4gIH1cbiAgcHJpdmF0ZSBtYWFrZVJlcXVpcmVkRXJyb3JzSW52aXNpYmdsZShlcnJvcnM6IEFycmF5PFN1cnZleUVycm9yPikge1xuICAgIGlmICghdGhpcy5oaWRlUmVxdWlyZWRFcnJvcnMpIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVycm9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVyVHlwZSA9IGVycm9yc1tpXS5nZXRFcnJvclR5cGUoKTtcbiAgICAgIGlmIChlclR5cGUgPT0gXCJyZXF1aXJlZFwiIHx8IGVyVHlwZSA9PSBcInJlcXVpcmVvbmVhbnN3ZXJcIikge1xuICAgICAgICBlcnJvcnNbaV0udmlzaWJsZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBmaXJzdCBxdWVzdGlvbiBpbmRleC4gVGhlIGZpcnN0IHF1ZXN0aW9uIGluZGV4IGlzICcxJyBieSBkZWZhdWx0LiBZb3UgbWF5IHN0YXJ0IGl0IGZyb20gJzEwMCcgb3IgZnJvbSAnQScsIGJ5IHNldHRpbmcgJzEwMCcgb3IgJ0EnIHRvIHRoaXMgcHJvcGVydHkuXG4gICAqIFlvdSBjYW4gc2V0IHRoZSBzdGFydCBpbmRleCB0byBcIigxKVwiIG9yIFwiIyBBKVwiIG9yIFwiYSlcIiB0byByZW5kZXIgcXVlc3Rpb24gbnVtYmVyIGFzICgxKSwgIyBBKSBhbmQgYSkgYWNjb3JkaW5nbHkuXG4gICAqIEBzZWUgUXVlc3Rpb24udGl0bGVcbiAgICogQHNlZSByZXF1aXJlZFRleHRcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlc3Rpb25TdGFydEluZGV4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uU3RhcnRJbmRleFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHF1ZXN0aW9uU3RhcnRJbmRleCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uU3RhcnRJbmRleFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgd2hldGhlciB0aGUgXCJPdGhlcnNcIiBvcHRpb24gdGV4dCBpcyBzdG9yZWQgYXMgcXVlc3Rpb24gY29tbWVudC5cbiAgICpcbiAgICogQnkgZGVmYXVsdCB0aGUgZW50ZXJlZCB0ZXh0IGluIHRoZSBcIk90aGVyc1wiIGlucHV0IGluIHRoZSBjaGVja2JveC9yYWRpb2dyb3VwL2Ryb3Bkb3duIGlzIHN0b3JlZCBhcyBgXCJxdWVzdGlvbiBuYW1lIFwiICsgXCItQ29tbWVudFwiYC4gVGhlIHZhbHVlIGl0c2VsZiBpcyBgXCJxdWVzdGlvbiBuYW1lXCI6IFwib3RoZXJzXCJgLlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBgZmFsc2VgLCB0byBzdG9yZSB0aGUgZW50ZXJlZCB0ZXh0IGRpcmVjdGx5IGluIHRoZSBgXCJxdWVzdGlvbiBuYW1lXCJgIGtleS5cbiAgICogQHNlZSBjb21tZW50UHJlZml4XG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0b3JlT3RoZXJzQXNDb21tZW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzdG9yZU90aGVyc0FzQ29tbWVudFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHN0b3JlT3RoZXJzQXNDb21tZW50KHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInN0b3JlT3RoZXJzQXNDb21tZW50XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgZGVmYXVsdCBtYXhpbXVtIGxlbmd0aCBmb3IgcXVlc3Rpb25zIGxpa2UgdGV4dCBhbmQgY29tbWVudCwgaW5jbHVkaW5nIG1hdHJpeCBjZWxsIHF1ZXN0aW9ucy5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgYDBgLCB0aGF0IG1lYW5zIHRoYXQgdGhlIHRleHQgYW5kIGNvbW1lbnQgaGF2ZSB0aGUgc2FtZSBtYXggbGVuZ3RoIGFzIHRoZSBzdGFuZGFyZCBIVE1MIGlucHV0IC0gNTI0Mjg4IGNoYXJhY3RlcnM6IGh0dHBzOi8vd3d3Lnczc2Nob29scy5jb20vdGFncy9hdHRfaW5wdXRfbWF4bGVuZ3RoLmFzcC5cbiAgICogQHNlZSBtYXhPdGhlcnNMZW5ndGhcbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4VGV4dExlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhUZXh0TGVuZ3RoXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4VGV4dExlbmd0aCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1heFRleHRMZW5ndGhcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBkZWZhdWx0IG1heGltdW0gbGVuZ3RoIGZvciBxdWVzdGlvbiBjb21tZW50cyBhbmQgb3RoZXJzXG4gICAqXG4gICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGAwYCwgdGhhdCBtZWFucyB0aGF0IHRoZSBxdWVzdGlvbiBjb21tZW50cyBoYXZlIHRoZSBzYW1lIG1heCBsZW5ndGggYXMgdGhlIHN0YW5kYXJkIEhUTUwgaW5wdXQgLSA1MjQyODggY2hhcmFjdGVyczogaHR0cHM6Ly93d3cudzNzY2hvb2xzLmNvbS90YWdzL2F0dF9pbnB1dF9tYXhsZW5ndGguYXNwLlxuICAgKiBAc2VlIFF1ZXN0aW9uLmhhc0NvbW1lbnRcbiAgICogQHNlZSBRdWVzdGlvbi5oYXNPdGhlclxuICAgKiBAc2VlIG1heFRleHRMZW5ndGhcbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4T3RoZXJzTGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1heE90aGVyc0xlbmd0aFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heE90aGVyc0xlbmd0aCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1heE90aGVyc0xlbmd0aFwiLCB2YWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2VzIHdoZXRoZXIgYSB1c2VyIGNhbiBuYXZpZ2F0ZSB0aGUgbmV4dCBwYWdlIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgYW5zd2VyaW5nIGFsbCB0aGUgcXVlc3Rpb25zIG9uIGEgcGFnZSB3aXRob3V0IHByZXNzaW5nIHRoZSBcIk5leHRcIiBidXR0b24uXG4gICAqIFRoZSBhdmFpbGFibGUgb3B0aW9uczpcbiAgICpcbiAgICogLSBgdHJ1ZWAgLSBuYXZpZ2F0ZSB0aGUgbmV4dCBwYWdlIGFuZCBzdWJtaXQgc3VydmV5IGRhdGEgYXV0b21hdGljYWxseS5cbiAgICogLSBgYXV0b2dvbmV4dGAgLSBuYXZpZ2F0ZSB0aGUgbmV4dCBwYWdlIGF1dG9tYXRpY2FsbHkgYnV0IGRvIG5vdCBzdWJtaXQgc3VydmV5IGRhdGEuXG4gICAqIC0gYGZhbHNlYCAtIGRvIG5vdCBuYXZpZ2F0ZSB0aGUgbmV4dCBwYWdlIGFuZCBkbyBub3Qgc3VibWl0IHN1cnZleSBkYXRhIGF1dG9tYXRpY2FsbHkuXG4gICAqIEBzZWUgc2hvd05hdmlnYXRpb25CdXR0b25zXG4gICAqL1xuICBwdWJsaWMgZ2V0IGdvTmV4dFBhZ2VBdXRvbWF0aWMoKTogYm9vbGVhbiB8IFwiYXV0b2dvbmV4dFwiIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZ29OZXh0UGFnZUF1dG9tYXRpY1wiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBnb05leHRQYWdlQXV0b21hdGljKHZhbDogYm9vbGVhbiB8IFwiYXV0b2dvbmV4dFwiKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZ29OZXh0UGFnZUF1dG9tYXRpY1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgd2hldGhlciBhIHN1cnZleSBpcyBhdXRvbWF0aWNhbGx5IGNvbXBsZXRlZCB3aGVuIGBnb05leHRQYWdlQXV0b21hdGljID0gdHJ1ZWAuIFNldCBpdCB0byBgZmFsc2VgIGlmIHlvdSBkbyBub3Qgd2FudCB0byBzdWJtaXQgc3VydmV5IGF1dG9tYXRpY2FsbHkgb24gY29tcGxldGluZyB0aGUgbGFzdCBzdXJ2ZXkgcGFnZS5cbiAgICogQHNlZSBnb05leHRQYWdlQXV0b21hdGljXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFsbG93Q29tcGxldGVTdXJ2ZXlBdXRvbWF0aWMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImFsbG93Q29tcGxldGVTdXJ2ZXlBdXRvbWF0aWNcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCBhbGxvd0NvbXBsZXRlU3VydmV5QXV0b21hdGljKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImFsbG93Q29tcGxldGVTdXJ2ZXlBdXRvbWF0aWNcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIGEgdmFsdWUgdGhhdCBzcGVjaWZpZXMgaG93IHRoZSBzdXJ2ZXkgdmFsaWRhdGVzIHRoZSBxdWVzdGlvbiBhbnN3ZXJzLlxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZTpcbiAgICpcbiAgICogLSBgb25OZXh0UGFnZWAgKGRlZmF1bHQpIC0gY2hlY2sgZXJyb3JzIG9uIG5hdmlnYXRpbmcgdG8gdGhlIG5leHQgcGFnZSBvciBvbiBjb21wbGV0aW5nIHRoZSBzdXJ2ZXkuXG4gICAqIC0gYG9uVmFsdWVDaGFuZ2VkYCAtIGNoZWNrIGVycm9ycyBvbiBldmVyeSBxdWVzdGlvbiB2YWx1ZSAoaS5lLiwgYW5zd2VyKSBjaGFuZ2luZy5cbiAgICogLSBgb25WYWx1ZUNoYW5naW5nYCAtIGNoZWNrIGVycm9ycyBiZWZvcmUgc2V0dGluZyB2YWx1ZSBpbnRvIHN1cnZleS4gSWYgdGhlcmUgaXMgYW4gZXJyb3IsIHRoZW4gc3VydmV5IGRhdGEgaXMgbm90IGNoYW5nZWQsIGJ1dCBxdWVzdGlvbiB2YWx1ZSB3aWxsIGJlIGtlZXBlZC5cbiAgICogLSBgb25Db21wbGV0ZWAgLSB0byB2YWxpZGF0ZSBhbGwgdmlzaWJsZSBxdWVzdGlvbnMgb24gY29tcGxldGUgYnV0dG9uIGNsaWNrLiBJZiB0aGVyZSBhcmUgZXJyb3JzIG9uIHByZXZpb3VzIHBhZ2VzLCB0aGVuIHRoZSBwYWdlIHdpdGggdGhlIGZpcnN0IGVycm9yIGJlY29tZXMgdGhlIGN1cnJlbnQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNoZWNrRXJyb3JzTW9kZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjaGVja0Vycm9yc01vZGVcIik7XG4gIH1cbiAgcHVibGljIHNldCBjaGVja0Vycm9yc01vZGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjaGVja0Vycm9yc01vZGVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHRleHQgYXJlYSBvZiBbY29tbWVudF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9Eb2N1bWVudGF0aW9uL0xpYnJhcnk/aWQ9cXVlc3Rpb25jb21tZW50bW9kZWwpIHF1ZXN0aW9ucy9lbGVtZW50cyBhdXRvbWF0aWNhbGx5IGV4cGFuZHMgaXRzIGhlaWdodCB0byBhdm9pZCB0aGUgdmVydGljYWwgc2Nyb2xsYmFyIGFuZCB0byBkaXNwbGF5IHRoZSBlbnRpcmUgbXVsdGktbGluZSBjb250ZW50cyBlbnRlcmVkIGJ5IHJlc3BvbmRlbnRzLlxuICAgKiBEZWZhdWx0IHZhbHVlIGlzIGZhbHNlLlxuICAgKiBAc2VlIFF1ZXN0aW9uQ29tbWVudE1vZGVsLmF1dG9Hcm93XG4gICAqL1xuICBwdWJsaWMgZ2V0IGF1dG9Hcm93Q29tbWVudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiYXV0b0dyb3dDb21tZW50XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgYXV0b0dyb3dDb21tZW50KHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImF1dG9Hcm93Q29tbWVudFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgYSB2YWx1ZSB0aGF0IHNwZWNpZmllcyBob3cgdGhlIHN1cnZleSB1cGRhdGVzIGl0cyBxdWVzdGlvbnMnIHRleHQgdmFsdWVzLlxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZTpcbiAgICpcbiAgICogLSBgb25CbHVyYCAoZGVmYXVsdCkgLSB0aGUgdmFsdWUgaXMgdXBkYXRlZCBhZnRlciBhbiBpbnB1dCBsb3NlcyB0aGUgZm9jdXMuXG4gICAqIC0gYG9uVHlwaW5nYCAtIHVwZGF0ZSB0aGUgdmFsdWUgb2YgdGV4dCBxdWVzdGlvbnMsIFwidGV4dFwiIGFuZCBcImNvbW1lbnRcIiwgb24gZXZlcnkga2V5IHByZXNzLlxuICAgKlxuICAgKiBOb3RlLCB0aGF0IHNldHRpbmcgdG8gXCJvblR5cGluZ1wiIG1heSBsZWFkIHRvIGEgcGVyZm9ybWFuY2UgZGVncmFkYXRpb24sIGluIGNhc2UgeW91IGhhdmUgbWFueSBleHByZXNzaW9ucyBpbiB0aGUgc3VydmV5LlxuICAgKi9cbiAgcHVibGljIGdldCB0ZXh0VXBkYXRlTW9kZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ0ZXh0VXBkYXRlTW9kZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRleHRVcGRhdGVNb2RlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidGV4dFVwZGF0ZU1vZGVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIGEgdmFsdWUgdGhhdCBzcGVjaWZpZXMgaG93IHRoZSBpbnZpc2libGUgZGF0YSBpcyBpbmNsdWRlZCBpbiBzdXJ2ZXkgZGF0YS5cbiAgICpcbiAgICogVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGU6XG4gICAqXG4gICAqIC0gYG5vbmVgIC0gaW5jbHVkZSB0aGUgaW52aXNpYmxlIHZhbHVlcyBpbnRvIHRoZSBzdXJ2ZXkgZGF0YS5cbiAgICogLSBgb25IaWRkZW5gIC0gY2xlYXIgdGhlIHF1ZXN0aW9uIHZhbHVlIHdoZW4gaXQgYmVjb21lcyBpbnZpc2libGUuIElmIGEgcXVlc3Rpb24gaGFzIHZhbHVlIGFuZCBpdCB3YXMgaW52aXNpYmxlIGluaXRpYWxseSB0aGVuIHN1cnZleSBjbGVhcnMgdGhlIHZhbHVlIG9uIGNvbXBsZXRpbmcuXG4gICAqIC0gYG9uSGlkZGVuQ29udGFpbmVyYCAtIGNsZWFyIHRoZSBxdWVzdGlvbiB2YWx1ZSB3aGVuIGl0IG9yIGl0cyBwYXJlbnQgKHBhZ2Ugb3IgcGFuZWwpIGJlY29tZXMgaW52aXNpYmxlLiBJZiBhIHF1ZXN0aW9uIGhhcyB2YWx1ZSBhbmQgaXQgd2FzIGludmlzaWJsZSBpbml0aWFsbHkgdGhlbiBzdXJ2ZXkgY2xlYXJzIHRoZSB2YWx1ZSBvbiBjb21wbGV0aW5nLlxuICAgKiAtIGBvbkNvbXBsZXRlYCAoZGVmYXVsdCkgLSBjbGVhciBpbnZpc2libGUgcXVlc3Rpb24gdmFsdWVzIG9uIHN1cnZleSBjb21wbGV0ZS4gSW4gdGhpcyBjYXNlLCB0aGUgaW52aXNpYmxlIHF1ZXN0aW9ucyB3aWxsIG5vdCBiZSBzdG9yZWQgb24gdGhlIHNlcnZlci5cbiAgICogQHNlZSBRdWVzdGlvbi52aXNpYmxlXG4gICAqIEBzZWUgb25Db21wbGV0ZVxuICAgKi9cbiAgcHVibGljIGdldCBjbGVhckludmlzaWJsZVZhbHVlcygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjbGVhckludmlzaWJsZVZhbHVlc1wiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNsZWFySW52aXNpYmxlVmFsdWVzKHZhbDogYW55KSB7XG4gICAgaWYgKHZhbCA9PT0gdHJ1ZSkgdmFsID0gXCJvbkNvbXBsZXRlXCI7XG4gICAgaWYgKHZhbCA9PT0gZmFsc2UpIHZhbCA9IFwibm9uZVwiO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNsZWFySW52aXNpYmxlVmFsdWVzXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgdGhpcyBmdW5jdGlvbiB0byByZW1vdmUgYWxsIHF1ZXN0aW9uIHZhbHVlcyBmcm9tIHRoZSBzdXJ2ZXksIHRoYXQgZW5kLXVzZXIgd2lsbCBub3QgYmUgYWJsZSB0byBlbnRlci5cbiAgICogRm9yIGV4YW1wbGUgdGhlIHZhbHVlIHRoYXQgZG9lc24ndCBleGlzdHMgaW4gYSByYWRpb2dyb3VwL2Ryb3Bkb3duL2NoZWNrYm94IGNob2ljZXMgb3IgbWF0cml4IHJvd3MvY29sdW1ucy5cbiAgICogUGxlYXNlIG5vdGUsIHRoaXMgZnVuY3Rpb24gZG9lc24ndCBjbGVhciB2YWx1ZXMgZm9yIGludmlzaWJsZSBxdWVzdGlvbnMgb3IgdmFsdWVzIHRoYXQgZG9lc24ndCBhc3NvY2lhdGVkIHdpdGggcXVlc3Rpb25zLlxuICAgKiBJbiBmYWN0IHRoaXMgZnVuY3Rpb24ganVzdCBjYWxsIGNsZWFySW5jb3JyZWN0VmFsdWVzIGZ1bmN0aW9uIG9mIGFsbCBxdWVzdGlvbnMgaW4gdGhlIHN1cnZleVxuICAgKiBAcGFyYW0gcmVtb3ZlTm9uRXhpc2luZ1Jvb3RLZXlzIC0gc2V0IHRoaXMgcGFyYW1ldGVyIHRvIHRydWUgdG8gcmVtb3ZlIGtleXMgZnJvbSBzdXJ2ZXkuZGF0YSB0aGF0IGRvZXNuJ3QgaGF2ZSBjb3JyZXNwb25kZWQgcXVlc3Rpb25zIGFuZCBjYWxjdWxhdGVkIHZhbHVlc1xuICAgKiBAc2VlIFF1ZXN0aW9uLmNsZWFySW5jb3JyZWN0VmFsdWVzXG4gICAqIEBzZWUgUGFnZS5jbGVhckluY29ycmVjdFZhbHVlc1xuICAgKiBAc2VlIFBhbmVsLmNsZWFySW5jb3JyZWN0VmFsdWVzXG4gICAqL1xuICBwdWJsaWMgY2xlYXJJbmNvcnJlY3RWYWx1ZXMocmVtb3ZlTm9uRXhpc2luZ1Jvb3RLZXlzOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucGFnZXNbaV0uY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKTtcbiAgICB9XG4gICAgaWYgKCFyZW1vdmVOb25FeGlzaW5nUm9vdEtleXMpIHJldHVybjtcbiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YTtcbiAgICB2YXIgaGFzQ2hhbmdlcyA9IGZhbHNlO1xuICAgIGZvciAodmFyIGtleSBpbiBkYXRhKSB7XG4gICAgICBpZiAoISF0aGlzLmdldFF1ZXN0aW9uQnlWYWx1ZU5hbWUoa2V5KSkgY29udGludWU7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaXNjb3JyZWN0VmFsdWVXaXRoUG9zdFByZWZpeChrZXksIHNldHRpbmdzLmNvbW1lbnRQcmVmaXgpIHx8XG4gICAgICAgIHRoaXMuaXNjb3JyZWN0VmFsdWVXaXRoUG9zdFByZWZpeChrZXksIHNldHRpbmdzLm1hdHJpeFRvdGFsVmFsdWVQb3N0Rml4KVxuICAgICAgKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIHZhciBjYWxjVmFsdWUgPSB0aGlzLmdldENhbGN1bGF0ZWRWYWx1ZUJ5TmFtZShrZXkpO1xuICAgICAgaWYgKCEhY2FsY1ZhbHVlICYmIGNhbGNWYWx1ZS5pbmNsdWRlSW50b1Jlc3VsdCkgY29udGludWU7XG4gICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgIGRlbGV0ZSBkYXRhW2tleV07XG4gICAgfVxuICAgIGlmIChoYXNDaGFuZ2VzKSB7XG4gICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGlzY29ycmVjdFZhbHVlV2l0aFBvc3RQcmVmaXgoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgcG9zdFByZWZpeDogc3RyaW5nXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChrZXkuaW5kZXhPZihwb3N0UHJlZml4KSAhPT0ga2V5Lmxlbmd0aCAtIHBvc3RQcmVmaXgubGVuZ3RoKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAhIXRoaXMuZ2V0UXVlc3Rpb25CeVZhbHVlTmFtZShcbiAgICAgIGtleS5zdWJzdHIoMCwga2V5LmluZGV4T2YocG9zdFByZWZpeCkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHN1cnZleSBsb2NhbGUuIFRoZSBkZWZhdWx0IHZhbHVlIGl0IGlzIGVtcHR5LCB0aGlzIG1lYW5zIHRoZSAnZW4nIGxvY2FsZSBpcyB1c2VkLlxuICAgKiBZb3UgY2FuIHNldCBpdCB0byAnZGUnIC0gR2VybWFuLCAnZnInIC0gRnJlbmNoIGFuZCBzbyBvbi4gVGhlIGxpYnJhcnkgaGFzIGJ1aWx0LWluIGxvY2FsaXphdGlvbiBmb3Igc2V2ZXJhbCBsYW5ndWFnZXMuIFRoZSBsaWJyYXJ5IGhhcyBhIG11bHRpLWxhbmd1YWdlIHN1cHBvcnQgYXMgd2VsbC5cbiAgICovXG4gIHB1YmxpYyBnZXQgbG9jYWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubG9jYWxlVmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCBsb2NhbGUodmFsdWU6IHN0cmluZykge1xuICAgIHN1cnZleUxvY2FsaXphdGlvbi5jdXJyZW50TG9jYWxlID0gdmFsdWU7XG4gICAgdGhpcy5sb2NhbGVWYWx1ZSA9IHN1cnZleUxvY2FsaXphdGlvbi5jdXJyZW50TG9jYWxlO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImxvY2FsZVwiLCB0aGlzLmxvY2FsZVZhbHVlKTtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuO1xuICAgIHRoaXMubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICB0aGlzLmxvY2FsZUNoYW5nZWQoKTtcbiAgICB0aGlzLm9uTG9jYWxlQ2hhbmdlZEV2ZW50LmZpcmUodGhpcywgdmFsdWUpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGxvY2FsZXMgdGhhdCBhcmUgdXNlZCBpbiB0aGUgc3VydmV5J3MgdHJhbnNsYXRpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0VXNlZExvY2FsZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIGxvY3MgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgIHRoaXMuYWRkVXNlZExvY2FsZXMobG9jcyk7XG4gICAgLy9SZXBsYWNlIHRoZSBkZWZhdWx0IGxvY2FsZSB3aXRoIHRoZSByZWFsIG9uZVxuICAgIHZhciBpbmRleCA9IGxvY3MuaW5kZXhPZihcImRlZmF1bHRcIik7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIHZhciBkZWZhdWx0TG9jID0gc3VydmV5TG9jYWxpemF0aW9uLmRlZmF1bHRMb2NhbGU7XG4gICAgICAvL1JlbW92ZSB0aGUgZGVmYXVsdExvY1xuICAgICAgdmFyIGRlZkluZGV4ID0gbG9jcy5pbmRleE9mKGRlZmF1bHRMb2MpO1xuICAgICAgaWYgKGRlZkluZGV4ID4gLTEpIHtcbiAgICAgICAgbG9jcy5zcGxpY2UoZGVmSW5kZXgsIDEpO1xuICAgICAgfVxuICAgICAgaW5kZXggPSBsb2NzLmluZGV4T2YoXCJkZWZhdWx0XCIpO1xuICAgICAgbG9jc1tpbmRleF0gPSBkZWZhdWx0TG9jO1xuICAgIH1cbiAgICByZXR1cm4gbG9jcztcbiAgfVxuICBwdWJsaWMgbG9jYWxlQ2hhbmdlZCgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucGFnZXNbaV0ubG9jYWxlQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICAvL0lMb2NhbGl6YWJsZU93bmVyXG4gIGdldExvY2FsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbGU7XG4gIH1cbiAgcHVibGljIGxvY1N0cnNDaGFuZ2VkKCkge1xuICAgIHN1cGVyLmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgLy9EbyBub3Qgc2V0IGN1cnJlbnQgcGFnZSBpZiBpdCBpcyBub3Qgc2V0IHlldC5cbiAgICAvL0F0IGZpcnN0IHdlIGRvIG5vdCBuZWVkIHRoaXMsIGF0IHNlY29uZCBpdCBjcmVhdGVzIGlzc3VlcyB3aXRoIFZ1ZSBDTEkgcHJvamVjdHNcbiAgICAvL01vcmUgaW5mb3JtYXRpb24gaGVyZTogaHR0cHM6Ly9naXRodWIuY29tL3N1cnZleWpzL3N1cnZleS1saWJyYXJ5L2lzc3Vlcy8yNTk5XG4gICAgaWYgKCF0aGlzLmN1cnJlbnRQYWdlVmFsdWUpIHJldHVybjtcbiAgICB0aGlzLnVwZGF0ZVByb2dyZXNzVGV4dCgpO1xuICAgIHZhciBwYWdlID0gdGhpcy5hY3RpdmVQYWdlO1xuICAgIGlmICghIXBhZ2UpIHtcbiAgICAgIHBhZ2UubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0TWFya2Rvd25IdG1sKHRleHQ6IHN0cmluZywgbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdXJ2ZXlNYXJrZG93bkh0bWwodGhpcywgdGV4dCwgbmFtZSk7XG4gIH1cbiAgcHVibGljIGdldFJlbmRlcmVyKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UmVuZGVyZXJGb3JTdHJpbmcodGhpcywgbmFtZSk7XG4gIH1cbiAgcHVibGljIGdldFJlbmRlcmVyQ29udGV4dChsb2NTdHI6IExvY2FsaXphYmxlU3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UmVuZGVyZXJDb250ZXh0Rm9yU3RyaW5nKHRoaXMsIGxvY1N0cik7XG4gIH1cbiAgcHVibGljIGdldFJlbmRlcmVyRm9yU3RyaW5nKGVsZW1lbnQ6IEJhc2UsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcmVuZGVyQXMgPSB0aGlzLmdldEJ1aWx0SW5SZW5kZXJlckZvclN0cmluZyhlbGVtZW50LCBuYW1lKTtcbiAgICB2YXIgb3B0aW9ucyA9IHsgZWxlbWVudDogZWxlbWVudCwgbmFtZTogbmFtZSwgcmVuZGVyQXM6IHJlbmRlckFzIH07XG4gICAgdGhpcy5vblRleHRSZW5kZXJBcy5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLnJlbmRlckFzO1xuICB9XG4gIHB1YmxpYyBnZXRSZW5kZXJlckNvbnRleHRGb3JTdHJpbmcoZWxlbWVudDogQmFzZSwgbG9jU3RyOiBMb2NhbGl6YWJsZVN0cmluZykge1xuICAgIHJldHVybiBsb2NTdHI7XG4gIH1cbiAgZ2V0RXhwcmVzc2lvbkRpc3BsYXlWYWx1ZShcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgIHZhbHVlOiBhbnksXG4gICAgZGlzcGxheVZhbHVlOiBzdHJpbmdcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgcXVlc3Rpb246IHF1ZXN0aW9uLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZGlzcGxheVZhbHVlOiBkaXNwbGF5VmFsdWUsXG4gICAgfTtcbiAgICB0aGlzLm9uR2V0RXhwcmVzc2lvbkRpc3BsYXlWYWx1ZS5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLmRpc3BsYXlWYWx1ZTtcbiAgfVxuICBwcml2YXRlIGdldEJ1aWx0SW5SZW5kZXJlckZvclN0cmluZyhlbGVtZW50OiBCYXNlLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkgcmV0dXJuIExvY2FsaXphYmxlU3RyaW5nLmVkaXRhYmxlUmVuZGVyZXI7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBwdWJsaWMgZ2V0UHJvY2Vzc2VkVGV4dCh0ZXh0OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzVGV4dCh0ZXh0LCB0cnVlKTtcbiAgfVxuICBnZXRMb2NTdHJpbmcoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhzdHIpO1xuICB9XG4gIC8vSVN1cnZleUVycm9yT3duZXJcbiAgZ2V0RXJyb3JDdXN0b21UZXh0KHRleHQ6IHN0cmluZywgZXJyb3I6IFN1cnZleUVycm9yKTogc3RyaW5nIHtcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIHRleHQ6IHRleHQsXG4gICAgICBuYW1lOiBlcnJvci5nZXRFcnJvclR5cGUoKSxcbiAgICAgIGVycm9yOiBlcnJvcixcbiAgICB9O1xuICAgIHRoaXMub25FcnJvckN1c3RvbVRleHQuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9ucy50ZXh0O1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0ZXh0IHRoYXQgaXMgZGlzcGxheWVkIHdoZW4gdGhlcmUgYXJlIG5vIGFueSB2aXNpYmxlIHBhZ2VzIGFuZCBxdWVzdGlvbmEuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGVtcHR5U3VydmV5VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY1N0cmluZyhcImVtcHR5U3VydmV5XCIpO1xuICB9XG5cbiAgLy8jcmVnaW9uIFRpdGxlL0hlYWRlciBvcHRpb25zXG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgYSBzdXJ2ZXkgbG9nby5cbiAgICogQHNlZSB0aXRsZVxuICAgKi9cbiAgcHVibGljIGdldCBsb2dvKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwibG9nb1wiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGxvZ28odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwibG9nb1wiLCB2YWx1ZSk7XG4gIH1cbiAgZ2V0IGxvY0xvZ28oKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwibG9nb1wiKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIGEgc3VydmV5IGxvZ28gd2lkdGguXG4gICAqIEBzZWUgbG9nb1xuICAgKi9cbiAgcHVibGljIGdldCBsb2dvV2lkdGgoKTogYW55IHtcbiAgICB2YXIgd2lkdGggPSB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJsb2dvV2lkdGhcIik7XG4gICAgcmV0dXJuIGdldFNpemUod2lkdGgpO1xuICB9XG4gIHB1YmxpYyBzZXQgbG9nb1dpZHRoKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJsb2dvV2lkdGhcIiwgdmFsdWUpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgYSBzdXJ2ZXkgbG9nbyBoZWlnaHQuXG4gICAqIEBzZWUgbG9nb1xuICAgKi9cbiAgcHVibGljIGdldCBsb2dvSGVpZ2h0KCk6IGFueSB7XG4gICAgdmFyIGhlaWdodCA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImxvZ29IZWlnaHRcIik7XG4gICAgcmV0dXJuIGdldFNpemUoaGVpZ2h0KTtcbiAgfVxuICBwdWJsaWMgc2V0IGxvZ29IZWlnaHQodmFsdWU6IGFueSkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImxvZ29IZWlnaHRcIiwgdmFsdWUpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgYSBzdXJ2ZXkgbG9nbyBwb3NpdGlvbi5cbiAgICogQHNlZSBsb2dvXG4gICAqL1xuICBwdWJsaWMgZ2V0IGxvZ29Qb3NpdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJsb2dvUG9zaXRpb25cIik7XG4gIH1cbiAgcHVibGljIHNldCBsb2dvUG9zaXRpb24odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImxvZ29Qb3NpdGlvblwiLCB2YWx1ZSk7XG4gIH1cbiAgcHVibGljIGdldCBoYXNMb2dvKCkge1xuICAgIHJldHVybiAhIXRoaXMubG9nbyAmJiB0aGlzLmxvZ29Qb3NpdGlvbiAhPT0gXCJub25lXCI7XG4gIH1cbiAgcHVibGljIGdldCBpc0xvZ29CZWZvcmUoKSB7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMucmVuZGVyZWRIYXNMb2dvICYmXG4gICAgICAodGhpcy5sb2dvUG9zaXRpb24gPT09IFwibGVmdFwiIHx8IHRoaXMubG9nb1Bvc2l0aW9uID09PSBcInRvcFwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIGdldCBpc0xvZ29BZnRlcigpIHtcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUpIHJldHVybiB0aGlzLnJlbmRlcmVkSGFzTG9nbztcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5yZW5kZXJlZEhhc0xvZ28gJiZcbiAgICAgICh0aGlzLmxvZ29Qb3NpdGlvbiA9PT0gXCJyaWdodFwiIHx8IHRoaXMubG9nb1Bvc2l0aW9uID09PSBcImJvdHRvbVwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIGdldCBsb2dvQ2xhc3NOYW1lcygpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxvZ29DbGFzc2VzOiB7IFtpbmRleDogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICBsZWZ0OiBcInN2LWxvZ28tLWxlZnRcIixcbiAgICAgIHJpZ2h0OiBcInN2LWxvZ28tLXJpZ2h0XCIsXG4gICAgICB0b3A6IFwic3YtbG9nby0tdG9wXCIsXG4gICAgICBib3R0b206IFwic3YtbG9nby0tYm90dG9tXCIsXG4gICAgfTtcbiAgICByZXR1cm4gbmV3IENzc0NsYXNzQnVpbGRlcigpLmFwcGVuZCh0aGlzLmNzcy5sb2dvKVxuICAgICAgLmFwcGVuZChsb2dvQ2xhc3Nlc1t0aGlzLmxvZ29Qb3NpdGlvbl0pLnRvU3RyaW5nKCk7XG4gIH1cbiAgcHVibGljIGdldCByZW5kZXJlZEhhc1RpdGxlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkgcmV0dXJuIHRoaXMuaXNQcm9wZXJ0eVZpc2libGUoXCJ0aXRsZVwiKTtcbiAgICByZXR1cm4gIXRoaXMubG9jVGl0bGUuaXNFbXB0eSAmJiB0aGlzLnNob3dUaXRsZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc1RpdGxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVkSGFzVGl0bGU7XG4gIH1cbiAgcHVibGljIGdldCByZW5kZXJlZEhhc0xvZ28oKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSByZXR1cm4gdGhpcy5pc1Byb3BlcnR5VmlzaWJsZShcImxvZ29cIik7XG4gICAgcmV0dXJuIHRoaXMuaGFzTG9nbztcbiAgfVxuICBwdWJsaWMgZ2V0IHJlbmRlcmVkSGFzSGVhZGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVkSGFzVGl0bGUgfHwgdGhpcy5yZW5kZXJlZEhhc0xvZ287XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsb2dvIGZpdCBtb2RlLlxuICAgKiBAc2VlIGxvZ29cbiAgICovXG4gIHB1YmxpYyBnZXQgbG9nb0ZpdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJsb2dvRml0XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbG9nb0ZpdCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImxvZ29GaXRcIiwgdmFsKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICBwcml2YXRlIF9pc01vYmlsZSA9IGZhbHNlO1xuICBwdWJsaWMgc2V0SXNNb2JpbGUobmV3VmFsID0gdHJ1ZSkge1xuICAgIHRoaXMuX2lzTW9iaWxlID0gbmV3VmFsO1xuICB9XG4gIHByaXZhdGUgZ2V0IGlzTW9iaWxlKCkge1xuICAgIHJldHVybiBpc01vYmlsZSgpIHx8IHRoaXMuX2lzTW9iaWxlO1xuICB9XG4gIHB1YmxpYyBnZXQgdGl0bGVNYXhXaWR0aCgpOiBzdHJpbmcge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmlzTW9iaWxlICYmXG4gICAgICAhdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy5sb2dvKSAmJlxuICAgICAgIXNldHRpbmdzLnN1cHBvcnRDcmVhdG9yVjJcbiAgICApIHtcbiAgICAgIHZhciBsb2dvV2lkdGggPSB0aGlzLmxvZ29XaWR0aDtcbiAgICAgIGlmICh0aGlzLmxvZ29Qb3NpdGlvbiA9PT0gXCJsZWZ0XCIgfHwgdGhpcy5sb2dvUG9zaXRpb24gPT09IFwicmlnaHRcIikge1xuICAgICAgICByZXR1cm4gXCJjYWxjKDEwMCUgLSA1cHggLSAyZW0gLSBcIiArIGxvZ29XaWR0aCArIFwiKVwiO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBIVE1MIGNvbnRlbnQgZGlzcGxheWVkIG9uIHRoZSBjb21wbGV0ZSBwYWdlLiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgY29tcGxldGUgcGFnZSB0ZXh0LlxuICAgKiBAc2VlIHNob3dDb21wbGV0ZWRQYWdlXG4gICAqIEBzZWUgY29tcGxldGVkSHRtbE9uQ29uZGl0aW9uXG4gICAqIEBzZWUgbG9jYWxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbXBsZXRlZEh0bWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb21wbGV0ZWRIdG1sXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29tcGxldGVkSHRtbCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb21wbGV0ZWRIdG1sXCIsIHZhbHVlKTtcbiAgfVxuICBnZXQgbG9jQ29tcGxldGVkSHRtbCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJjb21wbGV0ZWRIdG1sXCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBIVE1MIGNvbmRpdGlvbiBpdGVtcy4gSWYgdGhlIGV4cHJlc3Npb24gb2YgdGhpcyBpdGVtIHJldHVybnMgYHRydWVgLCB0aGVuIGEgc3VydmV5IHdpbGwgdXNlIHRoaXMgaXRlbSBIVE1MIGluc3RlYWQgb2YgYGNvbXBsZXRlZEh0bWxgLlxuICAgKiBAc2VlIEh0bWxDb25kaXRpb25JdGVtXG4gICAqIEBzZWUgY29tcGxldGVIdG1sXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvbigpOiBBcnJheTxIdG1sQ29uZGl0aW9uSXRlbT4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb21wbGV0ZWRIdG1sT25Db25kaXRpb25cIik7XG4gIH1cbiAgcHVibGljIHNldCBjb21wbGV0ZWRIdG1sT25Db25kaXRpb24odmFsOiBBcnJheTxIdG1sQ29uZGl0aW9uSXRlbT4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb21wbGV0ZWRIdG1sT25Db25kaXRpb25cIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogQ2FsY3VsYXRlcyBhIGdpdmVuIGV4cHJlc3Npb24gYW5kIHJldHVybnMgYSByZXN1bHQgdmFsdWUuXG4gICAqIEBwYXJhbSBleHByZXNzaW9uXG4gICAqL1xuICBwdWJsaWMgcnVuRXhwcmVzc2lvbihleHByZXNzaW9uOiBzdHJpbmcpOiBhbnkge1xuICAgIGlmICghZXhwcmVzc2lvbikgcmV0dXJuIG51bGw7XG4gICAgdmFyIHZhbHVlcyA9IHRoaXMuZ2V0RmlsdGVyZWRWYWx1ZXMoKTtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKCk7XG4gICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uUnVubmVyKGV4cHJlc3Npb24pLnJ1bih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIGEgZ2l2ZW4gZXhwcmVzc2lvbiBhbmQgcmV0dXJucyBgdHJ1ZWAgb3IgYGZhbHNlYC5cbiAgICogQHBhcmFtIGV4cHJlc3Npb25cbiAgICovXG4gIHB1YmxpYyBydW5Db25kaXRpb24oZXhwcmVzc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCFleHByZXNzaW9uKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHZhbHVlcyA9IHRoaXMuZ2V0RmlsdGVyZWRWYWx1ZXMoKTtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKCk7XG4gICAgcmV0dXJuIG5ldyBDb25kaXRpb25SdW5uZXIoZXhwcmVzc2lvbikucnVuKHZhbHVlcywgcHJvcGVydGllcyk7XG4gIH1cbiAgLyoqXG4gICAqIFJ1biBhbGwgdHJpZ2dlcnMgdGhhdCBwZXJmb3JtcyBvbiB2YWx1ZSBjaGFuZ2VkIGFuZCBub3Qgb24gbW92aW5nIHRvIHRoZSBuZXh0IHBhZ2UuXG4gICAqL1xuICBwdWJsaWMgcnVuVHJpZ2dlcnMoKTogdm9pZCB7XG4gICAgdGhpcy5jaGVja1RyaWdnZXJzKHRoaXMuZ2V0RmlsdGVyZWRWYWx1ZXMoKSwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBnZXQgcmVuZGVyZWRDb21wbGV0ZWRIdG1sKCk6IHN0cmluZyB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLmdldEV4cHJlc3Npb25JdGVtT25SdW5Db25kaXRpb24oXG4gICAgICB0aGlzLmNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvblxuICAgICk7XG4gICAgcmV0dXJuICEhaXRlbSA/ICg8SHRtbENvbmRpdGlvbkl0ZW0+aXRlbSkuaHRtbCA6IHRoaXMuY29tcGxldGVkSHRtbDtcbiAgfVxuICBwcml2YXRlIGdldEV4cHJlc3Npb25JdGVtT25SdW5Db25kaXRpb24oXG4gICAgaXRlbXM6IEFycmF5PEV4cHJlc3Npb25JdGVtPlxuICApOiBFeHByZXNzaW9uSXRlbSB7XG4gICAgaWYgKGl0ZW1zLmxlbmd0aCA9PSAwKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgdmFsdWVzID0gdGhpcy5nZXRGaWx0ZXJlZFZhbHVlcygpO1xuICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5nZXRGaWx0ZXJlZFByb3BlcnRpZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaXRlbXNbaV0ucnVuQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcykpIHtcbiAgICAgICAgcmV0dXJuIGl0ZW1zW2ldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgSFRNTCBjb250ZW50IGRpc3BsYXllZCB0byBhbiBlbmQgdXNlciB0aGF0IGhhcyBhbHJlYWR5IGNvbXBsZXRlZCB0aGUgc3VydmV5LlxuICAgKiBAc2VlIGNsaWVudElkXG4gICAqIEBzZWUgbG9jYWxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbXBsZXRlZEJlZm9yZUh0bWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb21wbGV0ZWRCZWZvcmVIdG1sXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29tcGxldGVkQmVmb3JlSHRtbCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb21wbGV0ZWRCZWZvcmVIdG1sXCIsIHZhbHVlKTtcbiAgfVxuICBnZXQgbG9jQ29tcGxldGVkQmVmb3JlSHRtbCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJjb21wbGV0ZWRCZWZvcmVIdG1sXCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgSFRNTCB0aGF0IHNob3dzIG9uIGxvYWRpbmcgc3VydmV5IEpzb24gZnJvbSB0aGUgW2FwaS5zdXJ2ZXlqcy5pb10oaHR0cHM6Ly9hcGkuc3VydmV5anMuaW8pIHNlcnZpY2UuXG4gICAqIEBzZWUgc3VydmV5SWRcbiAgICogQHNlZSBsb2NhbGVcbiAgICovXG4gIHB1YmxpYyBnZXQgbG9hZGluZ0h0bWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJsb2FkaW5nSHRtbFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGxvYWRpbmdIdG1sKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImxvYWRpbmdIdG1sXCIsIHZhbHVlKTtcbiAgfVxuICBnZXQgbG9jTG9hZGluZ0h0bWwoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwibG9hZGluZ0h0bWxcIik7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgJ1N0YXJ0JyBidXR0b24gY2FwdGlvbi5cbiAgICogVGhlICdTdGFydCcgYnV0dG9uIGlzIHNob3duIG9uIHRoZSBzdGFydGVkIHBhZ2UuIFNldCB0aGUgYGZpcnN0UGFnZUlzU3RhcnRlZGAgcHJvcGVydHkgdG8gYHRydWVgLCB0byBkaXNwbGF5IHRoZSBzdGFydGVkIHBhZ2UuXG4gICAqIEBzZWUgZmlyc3RQYWdlSXNTdGFydGVkXG4gICAqIEBzZWUgbG9jYWxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0YXJ0U3VydmV5VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInN0YXJ0U3VydmV5VGV4dFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHN0YXJ0U3VydmV5VGV4dChuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJzdGFydFN1cnZleVRleHRcIiwgbmV3VmFsdWUpO1xuICB9XG4gIGdldCBsb2NTdGFydFN1cnZleVRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwic3RhcnRTdXJ2ZXlUZXh0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlICdQcmV2JyBidXR0b24gY2FwdGlvbi5cbiAgICogQHNlZSBsb2NhbGVcbiAgICovXG4gIHB1YmxpYyBnZXQgcGFnZVByZXZUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicGFnZVByZXZUZXh0XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcGFnZVByZXZUZXh0KG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInBhZ2VQcmV2VGV4dFwiLCBuZXdWYWx1ZSk7XG4gIH1cbiAgZ2V0IGxvY1BhZ2VQcmV2VGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJwYWdlUHJldlRleHRcIik7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgJ05leHQnIGJ1dHRvbiBjYXB0aW9uLlxuICAgKiBAc2VlIGxvY2FsZVxuICAgKi9cbiAgcHVibGljIGdldCBwYWdlTmV4dFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJwYWdlTmV4dFRleHRcIik7XG4gIH1cbiAgcHVibGljIHNldCBwYWdlTmV4dFRleHQobmV3VmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicGFnZU5leHRUZXh0XCIsIG5ld1ZhbHVlKTtcbiAgfVxuICBnZXQgbG9jUGFnZU5leHRUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInBhZ2VOZXh0VGV4dFwiKTtcbiAgfVxuICAvKipcbiAgICogIEdldHMgb3Igc2V0cyB0aGUgJ0NvbXBsZXRlJyBidXR0b24gY2FwdGlvbi5cbiAgICogQHNlZSBsb2NhbGVcbiAgICovXG4gIHB1YmxpYyBnZXQgY29tcGxldGVUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiY29tcGxldGVUZXh0XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29tcGxldGVUZXh0KG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImNvbXBsZXRlVGV4dFwiLCBuZXdWYWx1ZSk7XG4gIH1cbiAgZ2V0IGxvY0NvbXBsZXRlVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJjb21wbGV0ZVRleHRcIik7XG4gIH1cbiAgLyoqXG4gICAqICBHZXRzIG9yIHNldHMgdGhlICdQcmV2aWV3JyBidXR0b24gY2FwdGlvbi5cbiAgICogQHNlZSBsb2NhbGVcbiAgICogQHNlZSBzaG93UHJldmlld0JlZm9yZUNvbXBsZXRlXG4gICAqIEBzZWUgZWRpdFRleHRcbiAgICogQHNlZSBzaG93UHJldmlld1xuICAgKi9cbiAgcHVibGljIGdldCBwcmV2aWV3VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInByZXZpZXdUZXh0XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcHJldmlld1RleHQobmV3VmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicHJldmlld1RleHRcIiwgbmV3VmFsdWUpO1xuICB9XG4gIGdldCBsb2NQcmV2aWV3VGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJwcmV2aWV3VGV4dFwiKTtcbiAgfVxuICAvKipcbiAgICogIEdldHMgb3Igc2V0cyB0aGUgJ0VkaXQnIGJ1dHRvbiBjYXB0aW9uLlxuICAgKiBAc2VlIGxvY2FsZVxuICAgKiBAc2VlIHNob3dQcmV2aWV3QmVmb3JlQ29tcGxldGVcbiAgICogQHNlZSBwcmV2aWV3VGV4dFxuICAgKiBAc2VlIGNhbmNlbFByZXZpZXdcbiAgICovXG4gIHB1YmxpYyBnZXQgZWRpdFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJlZGl0VGV4dFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGVkaXRUZXh0KG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImVkaXRUZXh0XCIsIG5ld1ZhbHVlKTtcbiAgfVxuICBnZXQgbG9jRWRpdFRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiZWRpdFRleHRcIik7XG4gIH1cbiAgZ2V0RWxlbWVudFRpdGxlVGFnTmFtZShlbGVtZW50OiBCYXNlLCB0YWdOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLm9uR2V0VGl0bGVUYWdOYW1lLmlzRW1wdHkpIHJldHVybiB0YWdOYW1lO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7IGVsZW1lbnQ6IGVsZW1lbnQsIHRhZ05hbWU6IHRhZ05hbWUgfTtcbiAgICB0aGlzLm9uR2V0VGl0bGVUYWdOYW1lLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG9wdGlvbnMudGFnTmFtZTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoZSBwYXR0ZXJuIGZvciBxdWVzdGlvbiB0aXRsZS4gRGVmYXVsdCBpcyBcIm51bVRpdGxlUmVxdWlyZVwiLCAxLiBXaGF0IGlzIHlvdXIgbmFtZT8gKixcbiAgICogWW91IGNhbiBzZXQgaXQgdG8gbnVtUmVxdWlyZVRpdGxlOiAxLiAqIFdoYXQgaXMgeW91ciBuYW1lP1xuICAgKiBZb3UgY2FuIHNldCBpdCB0byByZXF1aXJlTnVtVGl0bGU6ICogMS4gV2hhdCBpcyB5b3VyIG5hbWU/XG4gICAqIFlvdSBjYW4gc2V0IGl0IHRvIG51bVRpdGxlIChyZW1vdmUgcmVxdWlyZSBzeW1ib2wgY29tcGxldGVseSk6IDEuIFdoYXQgaXMgeW91ciBuYW1lP1xuICAgKiBAc2VlIFF1ZXN0aW9uTW9kZWwudGl0bGVcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlc3Rpb25UaXRsZVBhdHRlcm4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25UaXRsZVBhdHRlcm5cIiwgXCJudW1UaXRsZVJlcXVpcmVcIik7XG4gIH1cbiAgcHVibGljIHNldCBxdWVzdGlvblRpdGxlUGF0dGVybih2YWw6IHN0cmluZykge1xuICAgIGlmIChcbiAgICAgIHZhbCAhPT0gXCJudW1SZXF1aXJlVGl0bGVcIiAmJlxuICAgICAgdmFsICE9PSBcInJlcXVpcmVOdW1UaXRsZVwiICYmXG4gICAgICB2YWwgIT0gXCJudW1UaXRsZVwiXG4gICAgKSB7XG4gICAgICB2YWwgPSBcIm51bVRpdGxlUmVxdWlyZVwiO1xuICAgIH1cbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJxdWVzdGlvblRpdGxlUGF0dGVyblwiLCB2YWwpO1xuICB9XG4gIGdldFF1ZXN0aW9uVGl0bGVQYXR0ZXJuT3B0aW9ucygpOiBBcnJheTxhbnk+IHtcbiAgICBjb25zdCByZXMgPSBuZXcgQXJyYXk8YW55PigpO1xuICAgIGNvbnN0IHRpdGxlID0gdGhpcy5nZXRMb2NTdHJpbmcoXCJxdWVzdGlvblRpdGxlUGF0dGVyblRleHRcIik7XG4gICAgY29uc3QgbnVtID0gISF0aGlzLnF1ZXN0aW9uU3RhcnRJbmRleCA/IHRoaXMucXVlc3Rpb25TdGFydEluZGV4IDogXCIxLlwiO1xuICAgIHJlcy5wdXNoKHtcbiAgICAgIHZhbHVlOiBcIm51bVRpdGxlUmVxdWlyZVwiLFxuICAgICAgdGV4dDogbnVtICsgXCIgXCIgKyB0aXRsZSArIFwiIFwiICsgdGhpcy5yZXF1aXJlZFRleHRcbiAgICB9KTtcbiAgICByZXMucHVzaCh7XG4gICAgICB2YWx1ZTogXCJudW1SZXF1aXJlVGl0bGVcIixcbiAgICAgIHRleHQ6IG51bSArIFwiIFwiICsgdGhpcy5yZXF1aXJlZFRleHQgKyBcIiBcIiArIHRpdGxlXG4gICAgfSk7XG4gICAgcmVzLnB1c2goe1xuICAgICAgdmFsdWU6IFwicmVxdWlyZU51bVRpdGxlXCIsXG4gICAgICB0ZXh0OiB0aGlzLnJlcXVpcmVkVGV4dCArIFwiIFwiICsgbnVtICsgXCIgXCIgKyB0aXRsZVxuICAgIH0pO1xuICAgIHJlcy5wdXNoKHtcbiAgICAgIHZhbHVlOiBcIm51bVRpdGxlXCIsXG4gICAgICB0ZXh0OiBudW0gKyBcIiBcIiArIHRpdGxlXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIGEgcXVlc3Rpb24gdGl0bGUgdGVtcGxhdGUuIE9ic29sZXRlLCBwbGVhc2UgdXNlIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuXG4gICAqIEBzZWUgUXVlc3Rpb25Nb2RlbC50aXRsZVxuICAgKiBAc2VlIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHF1ZXN0aW9uVGl0bGVUZW1wbGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInF1ZXN0aW9uVGl0bGVUZW1wbGF0ZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHF1ZXN0aW9uVGl0bGVUZW1wbGF0ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJxdWVzdGlvblRpdGxlVGVtcGxhdGVcIiwgdmFsdWUpO1xuICAgIHRoaXMucXVlc3Rpb25UaXRsZVBhdHRlcm4gPSB0aGlzLmdldE5ld1RpdGxlUGF0dGVybih2YWx1ZSk7XG4gICAgdGhpcy5xdWVzdGlvblN0YXJ0SW5kZXggPSB0aGlzLmdldE5ld1F1ZXN0aW9uVGl0bGVFbGVtZW50KFxuICAgICAgdmFsdWUsXG4gICAgICBcIm5vXCIsXG4gICAgICB0aGlzLnF1ZXN0aW9uU3RhcnRJbmRleCxcbiAgICAgIFwiMVwiXG4gICAgKTtcbiAgICB0aGlzLnJlcXVpcmVkVGV4dCA9IHRoaXMuZ2V0TmV3UXVlc3Rpb25UaXRsZUVsZW1lbnQoXG4gICAgICB2YWx1ZSxcbiAgICAgIFwicmVxdWlyZVwiLFxuICAgICAgdGhpcy5yZXF1aXJlZFRleHQsXG4gICAgICBcIipcIlxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBnZXROZXdUaXRsZVBhdHRlcm4odGVtcGxhdGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCEhdGVtcGxhdGUpIHtcbiAgICAgIHZhciBzdHJzID0gW107XG4gICAgICB3aGlsZSAodGVtcGxhdGUuaW5kZXhPZihcIntcIikgPiAtMSkge1xuICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLnN1YnN0cih0ZW1wbGF0ZS5pbmRleE9mKFwie1wiKSArIDEpO1xuICAgICAgICB2YXIgaW5kID0gdGVtcGxhdGUuaW5kZXhPZihcIn1cIik7XG4gICAgICAgIGlmIChpbmQgPCAwKSBicmVhaztcbiAgICAgICAgc3Rycy5wdXNoKHRlbXBsYXRlLnN1YnN0cigwLCBpbmQpKTtcbiAgICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZS5zdWJzdHIoaW5kICsgMSk7XG4gICAgICB9XG4gICAgICBpZiAoc3Rycy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGlmIChzdHJzWzBdID09IFwicmVxdWlyZVwiKSByZXR1cm4gXCJyZXF1aXJlTnVtVGl0bGVcIjtcbiAgICAgICAgaWYgKHN0cnNbMV0gPT0gXCJyZXF1aXJlXCIgJiYgc3Rycy5sZW5ndGggPT0gMykgcmV0dXJuIFwibnVtUmVxdWlyZVRpdGxlXCI7XG4gICAgICAgIGlmIChzdHJzLmluZGV4T2YoXCJyZXF1aXJlXCIpIDwgMCkgcmV0dXJuIFwibnVtVGl0bGVcIjtcbiAgICAgIH1cbiAgICAgIGlmIChzdHJzLmxlbmd0aCA9PSAxICYmIHN0cnNbMF0gPT0gXCJ0aXRsZVwiKSB7XG4gICAgICAgIHJldHVybiBcIm51bVRpdGxlXCI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBcIm51bVRpdGxlUmVxdWlyZVwiO1xuICB9XG4gIHByaXZhdGUgZ2V0TmV3UXVlc3Rpb25UaXRsZUVsZW1lbnQoXG4gICAgdGVtcGxhdGU6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY3VycmVudFZhbHVlOiBzdHJpbmcsXG4gICAgZGVmYXVsdFZhbHVlOiBzdHJpbmdcbiAgKTogc3RyaW5nIHtcbiAgICBuYW1lID0gXCJ7XCIgKyBuYW1lICsgXCJ9XCI7XG4gICAgaWYgKCF0ZW1wbGF0ZSB8fCB0ZW1wbGF0ZS5pbmRleE9mKG5hbWUpIDwgMCkgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcbiAgICB2YXIgaW5kID0gdGVtcGxhdGUuaW5kZXhPZihuYW1lKTtcbiAgICB2YXIgcHJlZml4ID0gXCJcIjtcbiAgICB2YXIgcG9zdGZpeCA9IFwiXCI7XG4gICAgdmFyIGkgPSBpbmQgLSAxO1xuICAgIGZvciAoOyBpID49IDA7IGktLSkge1xuICAgICAgaWYgKHRlbXBsYXRlW2ldID09IFwifVwiKSBicmVhaztcbiAgICB9XG4gICAgaWYgKGkgPCBpbmQgLSAxKSB7XG4gICAgICBwcmVmaXggPSB0ZW1wbGF0ZS5zdWJzdHIoaSArIDEsIGluZCAtIGkgLSAxKTtcbiAgICB9XG4gICAgaW5kICs9IG5hbWUubGVuZ3RoO1xuICAgIGkgPSBpbmQ7XG4gICAgZm9yICg7IGkgPCB0ZW1wbGF0ZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRlbXBsYXRlW2ldID09IFwie1wiKSBicmVhaztcbiAgICB9XG4gICAgaWYgKGkgPiBpbmQpIHtcbiAgICAgIHBvc3RmaXggPSB0ZW1wbGF0ZS5zdWJzdHIoaW5kLCBpIC0gaW5kKTtcbiAgICB9XG4gICAgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBwcmVmaXgubGVuZ3RoICYmIHByZWZpeC5jaGFyQ29kZUF0KGkpIDwgMzMpIGkrKztcbiAgICBwcmVmaXggPSBwcmVmaXguc3Vic3RyKGkpO1xuICAgIGkgPSBwb3N0Zml4Lmxlbmd0aCAtIDE7XG4gICAgd2hpbGUgKGkgPj0gMCAmJiBwb3N0Zml4LmNoYXJDb2RlQXQoaSkgPCAzMykgaS0tO1xuICAgIHBvc3RmaXggPSBwb3N0Zml4LnN1YnN0cigwLCBpICsgMSk7XG4gICAgaWYgKCFwcmVmaXggJiYgIXBvc3RmaXgpIHJldHVybiBjdXJyZW50VmFsdWU7XG4gICAgdmFyIHZhbHVlID0gISFjdXJyZW50VmFsdWUgPyBjdXJyZW50VmFsdWUgOiBkZWZhdWx0VmFsdWU7XG4gICAgcmV0dXJuIHByZWZpeCArIHZhbHVlICsgcG9zdGZpeDtcbiAgfVxuICBnZXQgbG9jUXVlc3Rpb25UaXRsZVRlbXBsYXRlKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInF1ZXN0aW9uVGl0bGVUZW1wbGF0ZVwiKTtcbiAgfVxuICBnZXRVcGRhdGVkUXVlc3Rpb25UaXRsZShxdWVzdGlvbjogSVF1ZXN0aW9uLCB0aXRsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5vbkdldFF1ZXN0aW9uVGl0bGUuaXNFbXB0eSkgcmV0dXJuIHRpdGxlO1xuICAgIHZhciBvcHRpb25zID0geyBxdWVzdGlvbjogcXVlc3Rpb24sIHRpdGxlOiB0aXRsZSB9O1xuICAgIHRoaXMub25HZXRRdWVzdGlvblRpdGxlLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG9wdGlvbnMudGl0bGU7XG4gIH1cbiAgZ2V0VXBkYXRlZFF1ZXN0aW9uTm8ocXVlc3Rpb246IElRdWVzdGlvbiwgbm86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMub25HZXRRdWVzdGlvbk5vLmlzRW1wdHkpIHJldHVybiBubztcbiAgICB2YXIgb3B0aW9ucyA9IHsgcXVlc3Rpb246IHF1ZXN0aW9uLCBubzogbm8gfTtcbiAgICB0aGlzLm9uR2V0UXVlc3Rpb25Oby5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLm5vO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgd2hldGhlciB0aGUgc3VydmV5IGRpc3BsYXlzIHBhZ2UgbnVtYmVycyBvbiBwYWdlcyB0aXRsZXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dQYWdlTnVtYmVycygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1BhZ2VOdW1iZXJzXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dQYWdlTnVtYmVycyh2YWx1ZTogYm9vbGVhbikge1xuICAgIGlmICh2YWx1ZSA9PT0gdGhpcy5zaG93UGFnZU51bWJlcnMpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93UGFnZU51bWJlcnNcIiwgdmFsdWUpO1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIGEgdmFsdWUgdGhhdCBzcGVjaWZpZXMgaG93IHRoZSBxdWVzdGlvbiBudW1iZXJzIGFyZSBkaXNwbGF5ZWQuXG4gICAqXG4gICAqIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlOlxuICAgKlxuICAgKiAtIGBvbmAgLSBkaXNwbGF5IHF1ZXN0aW9uIG51bWJlcnNcbiAgICogLSBgb25wYWdlYCAtIGRpc3BsYXkgcXVlc3Rpb24gbnVtYmVycywgc3RhcnQgbnVtYmVyaW5nIG9uIGV2ZXJ5IHBhZ2VcbiAgICogLSBgb2ZmYCAtIHR1cm4gb2ZmIHRoZSBudW1iZXJpbmcgZm9yIHF1ZXN0aW9ucyB0aXRsZXNcbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1F1ZXN0aW9uTnVtYmVycygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93UXVlc3Rpb25OdW1iZXJzXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd1F1ZXN0aW9uTnVtYmVycyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhbHVlID0gdmFsdWUgPT09IFwib25wYWdlXCIgPyBcIm9uUGFnZVwiIDogdmFsdWU7XG4gICAgaWYgKHZhbHVlID09PSB0aGlzLnNob3dRdWVzdGlvbk51bWJlcnMpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93UXVlc3Rpb25OdW1iZXJzXCIsIHZhbHVlKTtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVJbmRleGVzKCk7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgc3VydmV5IHByb2dyZXNzIGJhciBwb3NpdGlvbi5cbiAgICpcbiAgICogVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGU6XG4gICAqXG4gICAqIC0gYG9mZmAgKGRlZmF1bHQpIC0gZG9uJ3Qgc2hvdyBwcm9ncmVzcyBiYXJcbiAgICogLSBgdG9wYCAtIHNob3cgcHJvZ3Jlc3MgYmFyIGluIHRoZSB0b3BcbiAgICogLSBgYm90dG9tYCAtIHNob3cgcHJvZ3Jlc3MgYmFyIGluIHRoZSBib3R0b21cbiAgICogLSBgYm90aGAgLSBzaG93IHByb2dyZXNzIGJhciBpbiBib3RoIHNpZGVzOiB0b3AgYW5kIGJvdHRvbS5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1Byb2dyZXNzQmFyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dQcm9ncmVzc0JhclwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dQcm9ncmVzc0JhcihuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1Byb2dyZXNzQmFyXCIsIG5ld1ZhbHVlLnRvTG93ZXJDYXNlKCkpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHR5cGUgb2YgaW5mbyBpbiB0aGUgcHJvZ3Jlc3MgYmFyLlxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZTpcbiAgICpcbiAgICogLSBgcGFnZXNgIChkZWZhdWx0KSxcbiAgICogLSBgcXVlc3Rpb25zYCxcbiAgICogLSBgcmVxdWlyZWRRdWVzdGlvbnNgLFxuICAgKiAtIGBjb3JyZWN0UXVlc3Rpb25zYCxcbiAgICogLSBgYnV0dG9uc2BcbiAgICovXG4gIHB1YmxpYyBnZXQgcHJvZ3Jlc3NCYXJUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInByb2dyZXNzQmFyVHlwZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHByb2dyZXNzQmFyVHlwZShuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKG5ld1ZhbHVlID09PSBcImNvcnJlY3RxdWVzdGlvblwiKSBuZXdWYWx1ZSA9IFwiY29ycmVjdFF1ZXN0aW9uXCI7XG4gICAgaWYgKG5ld1ZhbHVlID09PSBcInJlcXVpcmVkcXVlc3Rpb25cIikgbmV3VmFsdWUgPSBcInJlcXVpcmVkUXVlc3Rpb25cIjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJwcm9ncmVzc0JhclR5cGVcIiwgbmV3VmFsdWUpO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNTaG93UHJvZ3Jlc3NCYXJPblRvcCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuY2FuU2hvd1Byb3Jlc0JhcigpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuc2hvd1Byb2dyZXNzQmFyID09PSBcInRvcFwiIHx8IHRoaXMuc2hvd1Byb2dyZXNzQmFyID09PSBcImJvdGhcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzU2hvd1Byb2dyZXNzQmFyT25Cb3R0b20oKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmNhblNob3dQcm9yZXNCYXIoKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLnNob3dQcm9ncmVzc0JhciA9PT0gXCJib3R0b21cIiB8fCB0aGlzLnNob3dQcm9ncmVzc0JhciA9PT0gXCJib3RoXCI7XG4gIH1cbiAgcHJpdmF0ZSBjYW5TaG93UHJvcmVzQmFyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAhdGhpcy5pc1Nob3dpbmdQcmV2aWV3IHx8XG4gICAgICB0aGlzLnNob3dQcmV2aWV3QmVmb3JlQ29tcGxldGUgIT0gXCJzaG93QWxsUXVlc3Rpb25zXCJcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0ZXh0L0hUTUwgdGhhdCBpcyByZW5kZXJlZCBhcyBhIHN1cnZleSB0aXRsZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgcHJvY2Vzc2VkVGl0bGUoKSB7XG4gICAgcmV0dXJuIHRoaXMubG9jVGl0bGUucmVuZGVyZWRIdG1sO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHF1ZXN0aW9uIHRpdGxlIGxvY2F0aW9uLlxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZTpcbiAgICpcbiAgICogLSBgYm90dG9tYCAtIHNob3cgYSBxdWVzdGlvbiB0aXRsZSB0byBib3R0b21cbiAgICogLSBgbGVmdGAgLSBzaG93IGEgcXVlc3Rpb24gdGl0bGUgdG8gbGVmdFxuICAgKiAtIGB0b3BgIC0gc2hvdyBhIHF1ZXN0aW9uIHRpdGxlIHRvIHRvcC5cbiAgICpcbiAgICogPiBTb21lIHF1ZXN0aW9ucywgZm9yIGV4YW1wbGUgbWF0cml4ZXMsIGRvIG5vdCBzdXBwb3J0ICdsZWZ0JyB2YWx1ZS4gVGhlIHRpdGxlIGZvciB0aGVtIHdpbGwgYmUgZGlzcGxheWVkIHRvIHRoZSB0b3AuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHF1ZXN0aW9uVGl0bGVMb2NhdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJxdWVzdGlvblRpdGxlTG9jYXRpb25cIik7XG4gIH1cbiAgcHVibGljIHNldCBxdWVzdGlvblRpdGxlTG9jYXRpb24odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uVGl0bGVMb2NhdGlvblwiLCB2YWx1ZS50b0xvd2VyQ2FzZSgpKTtcbiAgICBpZiAoIXRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHtcbiAgICAgIHRoaXMudXBkYXRlRWxlbWVudENzcyh0cnVlKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZUVsZW1lbnRDc3MocmVOZXc/OiBib29sZWFuKSB7XG4gICAgdmFyIHBhZ2VzID0gdGhpcy52aXNpYmxlUGFnZXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgcGFnZXNbaV0udXBkYXRlRWxlbWVudENzcyhyZU5ldyk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGVycm9yIG1lc3NhZ2UgcG9zaXRpb24uXG4gICAqXG4gICAqIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlOlxuICAgKlxuICAgKiAtIGB0b3BgIC0gdG8gc2hvdyBxdWVzdGlvbiBlcnJvcihzKSBvdmVyIHRoZSBxdWVzdGlvbixcbiAgICogLSBgYm90dG9tYCAtIHRvIHNob3cgcXVlc3Rpb24gZXJyb3IocykgdW5kZXIgdGhlIHF1ZXN0aW9uLlxuICAgKi9cbiAgcHVibGljIGdldCBxdWVzdGlvbkVycm9yTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25FcnJvckxvY2F0aW9uXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcXVlc3Rpb25FcnJvckxvY2F0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJxdWVzdGlvbkVycm9yTG9jYXRpb25cIiwgdmFsdWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgcXVlc3Rpb24gZGVzY3JpcHRpb24gcG9zaXRpb24uIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGB1bmRlclRpdGxlYC5cbiAgICpcbiAgICogVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGU6XG4gICAqXG4gICAqIC0gYHVuZGVyVGl0bGVgIC0gc2hvdyBxdWVzdGlvbiBkZXNjcmlwdGlvbiB1bmRlciB0aGUgcXVlc3Rpb24gdGl0bGUsXG4gICAqIC0gYHVuZGVySW5wdXRgIC0gc2hvdyBxdWVzdGlvbiBkZXNjcmlwdGlvbiB1bmRlciB0aGUgcXVlc3Rpb24gaW5wdXQgaW5zdGVhZCBvZiBxdWVzdGlvbiB0aXRsZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlc3Rpb25EZXNjcmlwdGlvbkxvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uRGVzY3JpcHRpb25Mb2NhdGlvblwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHF1ZXN0aW9uRGVzY3JpcHRpb25Mb2NhdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25EZXNjcmlwdGlvbkxvY2F0aW9uXCIsIHZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBzdXJ2ZXkgZWRpdCBtb2RlLlxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZTpcbiAgICpcbiAgICogLSBgZWRpdGAgKGRlZmF1bHQpIC0gbWFrZSBhIHN1cnZleSBlZGl0YWJsZSxcbiAgICogLSBgZGlzcGxheWAgLSBtYWtlIGEgc3VydmV5IHJlYWQtb25seS5cbiAgICovXG4gIHB1YmxpYyBnZXQgbW9kZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtb2RlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbW9kZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICh2YWx1ZSA9PSB0aGlzLm1vZGUpIHJldHVybjtcbiAgICBpZiAodmFsdWUgIT0gXCJlZGl0XCIgJiYgdmFsdWUgIT0gXCJkaXNwbGF5XCIpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtb2RlXCIsIHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIG9uTW9kZUNoYW5nZWQoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcGFnZSA9IHRoaXMucGFnZXNbaV07XG4gICAgICBwYWdlLnNldFByb3BlcnR5VmFsdWUoXCJpc1JlYWRPbmx5XCIsIHBhZ2UuaXNSZWFkT25seSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgYW4gb2JqZWN0IHRoYXQgc3RvcmVzIHRoZSBzdXJ2ZXkgcmVzdWx0cy9kYXRhLiBZb3UgY2FuIHNldCBpdCBkaXJlY3RseSBhcyBgeyAncXVlc3Rpb24gbmFtZSc6IHF1ZXN0aW9uVmFsdWUsIC4uLiB9YFxuICAgKlxuICAgKiA+IElmIHlvdSBzZXQgdGhlIGBkYXRhYCBwcm9wZXJ0eSBhZnRlciBjcmVhdGluZyB0aGUgc3VydmV5LCB5b3UgbWF5IG5lZWQgdG8gc2V0IHRoZSBgY3VycmVudFBhZ2VOb2AgdG8gYDBgLCBpZiB5b3UgYXJlIHVzaW5nIGB2aXNpYmxlSWZgIHByb3BlcnRpZXMgZm9yIHF1ZXN0aW9ucy9wYWdlcy9wYW5lbHMgdG8gZW5zdXJlIHRoYXQgeW91IGFyZSBzdGFydGluZyBmcm9tIHRoZSBmaXJzdCBwYWdlLlxuICAgKiBAc2VlIHNldFZhbHVlXG4gICAqIEBzZWUgZ2V0VmFsdWVcbiAgICogQHNlZSBtZXJnZURhdGFcbiAgICogQHNlZSBjdXJyZW50UGFnZU5vXG4gICAqL1xuICBwdWJsaWMgZ2V0IGRhdGEoKTogYW55IHtcbiAgICB2YXIgcmVzdWx0OiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICB2YXIga2V5cyA9IHRoaXMuZ2V0VmFsdWVzS2V5cygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICB2YXIgZGF0YVZhbHVlID0gdGhpcy5nZXREYXRhVmFsdWVDb3JlKHRoaXMudmFsdWVzSGFzaCwga2V5KTtcbiAgICAgIGlmIChkYXRhVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXN1bHRba2V5XSA9IGRhdGFWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zZXRDYWxjdWF0ZWRWYWx1ZXNJbnRvUmVzdWx0KHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwdWJsaWMgc2V0IGRhdGEoZGF0YTogYW55KSB7XG4gICAgdGhpcy52YWx1ZXNIYXNoID0ge307XG4gICAgdGhpcy5zZXREYXRhQ29yZShkYXRhKTtcbiAgfVxuICAvKipcbiAgICogTWVyZ2UgdGhlIHZhbHVlcyBpbnRvIHN1cnZleS5kYXRhLiBJdCB3b3JrcyBhcyBzdXJ2ZXkuZGF0YSwgZXhjZXB0IGl0IGRvZXNuJ3QgY2xlYW4gdGhlIGV4aXN0aW5nIGRhdGEsIGJ1dCBvdmVycmlkZXMgdGhlbS5cbiAgICogQHBhcmFtIGRhdGEgZGF0YSB0byBtZXJnZS4gSXQgc2hvdWxkIGJlIGFuIG9iamVjdCB7a2V5VmFsdWU6IFZhbHVlLCAuLi59XG4gICAqIEBzZWUgZGF0YVxuICAgKiBAc2VlIHNldFZhbHVlXG4gICAqL1xuICBwdWJsaWMgbWVyZ2VEYXRhKGRhdGE6IGFueSkge1xuICAgIGlmICghZGF0YSkgcmV0dXJuO1xuICAgIHRoaXMuc2V0RGF0YUNvcmUoZGF0YSk7XG4gIH1cbiAgcHVibGljIHNldERhdGFDb3JlKGRhdGE6IGFueSkge1xuICAgIGlmIChkYXRhKSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSkge1xuICAgICAgICB0aGlzLnNldERhdGFWYWx1ZUNvcmUodGhpcy52YWx1ZXNIYXNoLCBrZXksIGRhdGFba2V5XSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudXBkYXRlQWxsUXVlc3Rpb25zVmFsdWUoKTtcbiAgICB0aGlzLm5vdGlmeUFsbFF1ZXN0aW9uc09uVmFsdWVDaGFuZ2VkKCk7XG4gICAgdGhpcy5ub3RpZnlFbGVtZW50c09uQW55VmFsdWVPclZhcmlhYmxlQ2hhbmdlZChcIlwiKTtcbiAgICB0aGlzLnJ1bkNvbmRpdGlvbnMoKTtcbiAgfVxuICBwcml2YXRlIG9uRWRpdGluZ09ialByb3BlcnR5Q2hhbmdlZDogKHNlbmRlcjogQmFzZSwgb3B0aW9uczogYW55KSA9PiB2b2lkO1xuICBwdWJsaWMgZ2V0IGVkaXRpbmdPYmooKTogQmFzZSB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdGluZ09ialZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgZWRpdGluZ09iaih2YWw6IEJhc2UpIHtcbiAgICBpZiAodGhpcy5lZGl0aW5nT2JqID09IHZhbCkgcmV0dXJuO1xuICAgIGlmICghIXRoaXMuZWRpdGluZ09iaikge1xuICAgICAgdGhpcy5lZGl0aW5nT2JqLm9uUHJvcGVydHlDaGFuZ2VkLnJlbW92ZShcbiAgICAgICAgdGhpcy5vbkVkaXRpbmdPYmpQcm9wZXJ0eUNoYW5nZWRcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuZWRpdGluZ09ialZhbHVlID0gdmFsO1xuICAgIGlmICh0aGlzLmlzRGlzcG9zZWQpIHJldHVybjtcbiAgICBpZiAoIXZhbCkge1xuICAgICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0QWxsUXVlc3Rpb25zKCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBxdWVzdGlvbnNbaV0udW5iaW5kVmFsdWUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEhdGhpcy5lZGl0aW5nT2JqKSB7XG4gICAgICB0aGlzLnNldERhdGFDb3JlKHt9KTtcbiAgICAgIHRoaXMub25FZGl0aW5nT2JqUHJvcGVydHlDaGFuZ2VkID0gKHNlbmRlcjogQmFzZSwgb3B0aW9uczogYW55KSA9PiB7XG4gICAgICAgIGlmICghU2VyaWFsaXplci5oYXNPcmlnaW5hbFByb3BlcnR5KHRoaXMuZWRpdGluZ09iaiwgb3B0aW9ucy5uYW1lKSlcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMudXBkYXRlT25TZXRWYWx1ZShvcHRpb25zLm5hbWUsICg8YW55PnRoaXMuZWRpdGluZ09iailbb3B0aW9ucy5uYW1lXSwgb3B0aW9ucy5vbGRWYWx1ZSk7XG4gICAgICB9O1xuICAgICAgdGhpcy5lZGl0aW5nT2JqLm9uUHJvcGVydHlDaGFuZ2VkLmFkZCh0aGlzLm9uRWRpdGluZ09ialByb3BlcnR5Q2hhbmdlZCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgaXNFZGl0aW5nU3VydmV5RWxlbWVudCgpIHtcbiAgICByZXR1cm4gISF0aGlzLmVkaXRpbmdPYmo7XG4gIH1cbiAgcHJpdmF0ZSBzZXRDYWxjdWF0ZWRWYWx1ZXNJbnRvUmVzdWx0KHJlc3VsdDogYW55KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNhbGN1bGF0ZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjYWxWYWx1ZSA9IHRoaXMuY2FsY3VsYXRlZFZhbHVlc1tpXTtcbiAgICAgIGlmIChcbiAgICAgICAgY2FsVmFsdWUuaW5jbHVkZUludG9SZXN1bHQgJiZcbiAgICAgICAgISFjYWxWYWx1ZS5uYW1lICYmXG4gICAgICAgIHRoaXMuZ2V0VmFyaWFibGUoY2FsVmFsdWUubmFtZSkgIT09IHVuZGVmaW5lZFxuICAgICAgKSB7XG4gICAgICAgIHJlc3VsdFtjYWxWYWx1ZS5uYW1lXSA9IHRoaXMuZ2V0VmFyaWFibGUoY2FsVmFsdWUubmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGdldEFsbFZhbHVlcygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmRhdGE7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgc3VydmV5IHJlc3VsdCBkYXRhIGFzIGFuIGFycmF5IG9mIHBsYWluIG9iamVjdHM6IHdpdGggcXVlc3Rpb24gYHRpdGxlYCwgYG5hbWVgLCBgdmFsdWVgLCBhbmQgYGRpc3BsYXlWYWx1ZWAuXG4gICAqXG4gICAqIEZvciBjb21wbGV4IHF1ZXN0aW9ucyAobGlrZSBtYXRyaXgsIGV0Yy4pIGBpc05vZGVgIGZsYWcgaXMgc2V0IHRvIGB0cnVlYCBhbmQgZGF0YSBjb250YWlucyBhcnJheSBvZiBuZXN0ZWQgb2JqZWN0cyAocm93cykuXG4gICAqXG4gICAqIFNldCBgb3B0aW9ucy5pbmNsdWRlRW1wdHlgIHRvIGBmYWxzZWAgaWYgeW91IHdhbnQgdG8gc2tpcCBlbXB0eSBhbnN3ZXJzLlxuICAgKi9cbiAgcHVibGljIGdldFBsYWluRGF0YShcbiAgICBvcHRpb25zOiB7XG4gICAgICBpbmNsdWRlRW1wdHk/OiBib29sZWFuLFxuICAgICAgaW5jbHVkZVF1ZXN0aW9uVHlwZXM/OiBib29sZWFuLFxuICAgICAgY2FsY3VsYXRpb25zPzogQXJyYXk8e1xuICAgICAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZyxcbiAgICAgIH0+LFxuICAgIH0gPSB7XG4gICAgICBpbmNsdWRlRW1wdHk6IHRydWUsXG4gICAgICBpbmNsdWRlUXVlc3Rpb25UeXBlczogZmFsc2UsXG4gICAgfVxuICApIHtcbiAgICB2YXIgcmVzdWx0OiBBcnJheTxhbnk+ID0gW107XG4gICAgdGhpcy5nZXRBbGxRdWVzdGlvbnMoKS5mb3JFYWNoKChxdWVzdGlvbikgPT4ge1xuICAgICAgdmFyIHJlc3VsdEl0ZW0gPSAoPFF1ZXN0aW9uPnF1ZXN0aW9uKS5nZXRQbGFpbkRhdGEob3B0aW9ucyk7XG4gICAgICBpZiAoISFyZXN1bHRJdGVtKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHJlc3VsdEl0ZW0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgZ2V0RmlsdGVyZWRWYWx1ZXMoKTogYW55IHtcbiAgICB2YXIgdmFsdWVzOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy52YXJpYWJsZXNIYXNoKSB2YWx1ZXNba2V5XSA9IHRoaXMudmFyaWFibGVzSGFzaFtrZXldO1xuICAgIHRoaXMuYWRkQ2FsY3VsYXRlZFZhbHVlc0ludG9GaWx0ZXJlZFZhbHVlcyh2YWx1ZXMpO1xuICAgIHZhciBrZXlzID0gdGhpcy5nZXRWYWx1ZXNLZXlzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgIHZhbHVlc1trZXldID0gdGhpcy5nZXREYXRhVmFsdWVDb3JlKHRoaXMudmFsdWVzSGFzaCwga2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuICBwcml2YXRlIGFkZENhbGN1bGF0ZWRWYWx1ZXNJbnRvRmlsdGVyZWRWYWx1ZXModmFsdWVzOiB7XG4gICAgW2luZGV4OiBzdHJpbmddOiBhbnksXG4gIH0pIHtcbiAgICB2YXIgY2FjbFZhbHVlcyA9IHRoaXMuY2FsY3VsYXRlZFZhbHVlcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhY2xWYWx1ZXMubGVuZ3RoOyBpKyspXG4gICAgICB2YWx1ZXNbY2FjbFZhbHVlc1tpXS5uYW1lXSA9IGNhY2xWYWx1ZXNbaV0udmFsdWU7XG4gIH1cbiAgZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKCk6IGFueSB7XG4gICAgcmV0dXJuIHsgc3VydmV5OiB0aGlzIH07XG4gIH1cbiAgcHJpdmF0ZSBnZXRWYWx1ZXNLZXlzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIGlmICghdGhpcy5lZGl0aW5nT2JqKSByZXR1cm4gT2JqZWN0LmtleXModGhpcy52YWx1ZXNIYXNoKTtcbiAgICB2YXIgcHJvcHMgPSBTZXJpYWxpemVyLmdldFByb3BlcnRpZXNCeU9iaih0aGlzLmVkaXRpbmdPYmopO1xuICAgIHZhciByZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXMucHVzaChwcm9wc1tpXS5uYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgZ2V0RGF0YVZhbHVlQ29yZSh2YWx1ZXNIYXNoOiBhbnksIGtleTogc3RyaW5nKSB7XG4gICAgaWYgKCEhdGhpcy5lZGl0aW5nT2JqKVxuICAgICAgcmV0dXJuIFNlcmlhbGl6ZXIuZ2V0T2JqUHJvcGVydHlWYWx1ZSh0aGlzLmVkaXRpbmdPYmosIGtleSk7XG4gICAgcmV0dXJuIHZhbHVlc0hhc2hba2V5XTtcbiAgfVxuICBwdWJsaWMgc2V0RGF0YVZhbHVlQ29yZSh2YWx1ZXNIYXNoOiBhbnksIGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKCEhdGhpcy5lZGl0aW5nT2JqKSB7XG4gICAgICBTZXJpYWxpemVyLnNldE9ialByb3BlcnR5VmFsdWUodGhpcy5lZGl0aW5nT2JqLCBrZXksIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWVzSGFzaFtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBkZWxldGVEYXRhVmFsdWVDb3JlKHZhbHVlc0hhc2g6IGFueSwga2V5OiBzdHJpbmcpIHtcbiAgICBpZiAoISF0aGlzLmVkaXRpbmdPYmopIHtcbiAgICAgICg8YW55PnRoaXMuZWRpdGluZ09iailba2V5XSA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSB2YWx1ZXNIYXNoW2tleV07XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCBjb21tZW50cyBmcm9tIHRoZSBkYXRhLlxuICAgKiBAc2VlIGRhdGFcbiAgICovXG4gIHB1YmxpYyBnZXQgY29tbWVudHMoKTogYW55IHtcbiAgICB2YXIgcmVzdWx0OiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICB2YXIga2V5cyA9IHRoaXMuZ2V0VmFsdWVzS2V5cygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICBpZiAoa2V5LmluZGV4T2YodGhpcy5jb21tZW50UHJlZml4KSA+IDApIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB0aGlzLmdldERhdGFWYWx1ZUNvcmUodGhpcy52YWx1ZXNIYXNoLCBrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB2aXNpYmxlIHBhZ2VzLiBJZiBhbGwgcGFnZXMgYXJlIHZpc2libGUsIHRoZW4gdGhpcyBwcm9wZXJ0eSByZXR1cm5zIHRoZSBzYW1lIGxpc3QgYXMgdGhlIGBwYWdlc2AgcHJvcGVydHkuXG4gICAqIEBzZWUgcGFnZXNcbiAgICogQHNlZSBQYWdlTW9kZWwudmlzaWJsZVxuICAgKiBAc2VlIFBhZ2VNb2RlbC52aXNpYmxlSWZcbiAgICovXG4gIHB1YmxpYyBnZXQgdmlzaWJsZVBhZ2VzKCk6IEFycmF5PFBhZ2VNb2RlbD4ge1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkgcmV0dXJuIHRoaXMucGFnZXM7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxQYWdlTW9kZWw+KCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5wYWdlc1tpXS5pc1Zpc2libGUgJiYgIXRoaXMucGFnZXNbaV0uaXNTdGFydGVkKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHRoaXMucGFnZXNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgc3VydmV5IGNvbnRhaW5zIG5vIHBhZ2VzLiBUaGUgc3VydmV5IGlzIGVtcHR5LlxuICAgKi9cbiAgcHVibGljIGdldCBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBhZ2VzLmxlbmd0aCA9PSAwO1xuICB9XG4gIC8qKlxuICAgKiBEZXByZWNhdGVkLiBVc2UgdGhlIGBwYWdlQ291bnRgIHByb3BlcnR5IGluc3RlYWQuXG4gICAqL1xuICBnZXQgUGFnZUNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFnZUNvdW50O1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzdXJ2ZXkgcGFnZSBjb3VudC5cbiAgICogQHNlZSB2aXNpYmxlUGFnZUNvdW50XG4gICAqIEBzZWUgcGFnZXNcbiAgICovXG4gIHB1YmxpYyBnZXQgcGFnZUNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFnZXMubGVuZ3RoO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbnVtYmVyIG9mIHZpc2libGUgcGFnZXMgd2l0aGluIHRoZSBzdXJ2ZXkuXG4gICAqIEBzZWUgcGFnZUNvdW50XG4gICAqIEBzZWUgdmlzaWJsZVBhZ2VzXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGVQYWdlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlUGFnZXMubGVuZ3RoO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzdGFydGVkIHBhZ2UuIFRoaXMgcHJvcGVydHkgd29ya3MgaWYgdGhlIGBmaXJzdFBhZ2VJc1N0YXJ0ZWRgIHByb3BlcnR5IGlzIHNldCB0byBgdHJ1ZWAuXG4gICAqIEBzZWUgZmlyc3RQYWdlSXNTdGFydGVkXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0YXJ0ZWRQYWdlKCk6IFBhZ2VNb2RlbCB7XG4gICAgdmFyIHBhZ2UgPVxuICAgICAgdGhpcy5maXJzdFBhZ2VJc1N0YXJ0ZWQgJiYgdGhpcy5wYWdlcy5sZW5ndGggPiAwID8gdGhpcy5wYWdlc1swXSA6IG51bGw7XG4gICAgaWYgKCEhcGFnZSkge1xuICAgICAgcGFnZS5vbkZpcnN0UmVuZGVyaW5nKCk7XG4gICAgICBwYWdlLnNldFdhc1Nob3duKHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gcGFnZTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBjdXJyZW50IHN1cnZleSBwYWdlLiBJZiBhIHN1cnZleSBpcyByZW5kZXJlZCwgdGhlbiB0aGlzIHByb3BlcnR5IHJldHVybnMgYSBwYWdlIHRoYXQgYSB1c2VyIGNhbiBzZWUvZWRpdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVudFBhZ2UoKTogYW55IHtcbiAgICB2YXIgdlBhZ2VzID0gdGhpcy52aXNpYmxlUGFnZXM7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2VWYWx1ZSAhPSBudWxsKSB7XG4gICAgICBpZiAodlBhZ2VzLmluZGV4T2YodGhpcy5jdXJyZW50UGFnZVZhbHVlKSA8IDApIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICF0aGlzLm9uQ29udGFpbnNQYWdlQ2FsbGJhY2sgfHxcbiAgICAgICAgICAhdGhpcy5vbkNvbnRhaW5zUGFnZUNhbGxiYWNrKHRoaXMuY3VycmVudFBhZ2VWYWx1ZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2VWYWx1ZSA9PSBudWxsICYmIHZQYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gdlBhZ2VzWzBdO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jdXJyZW50UGFnZVZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgY3VycmVudFBhZ2UodmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdmFyIG5ld1BhZ2UgPSB0aGlzLmdldFBhZ2VCeU9iamVjdCh2YWx1ZSk7XG4gICAgaWYgKCEhdmFsdWUgJiYgIW5ld1BhZ2UpIHJldHVybjtcbiAgICB2YXIgdlBhZ2VzID0gdGhpcy52aXNpYmxlUGFnZXM7XG4gICAgaWYgKG5ld1BhZ2UgIT0gbnVsbCAmJiB2UGFnZXMuaW5kZXhPZihuZXdQYWdlKSA8IDApIHJldHVybjtcbiAgICBpZiAobmV3UGFnZSA9PSB0aGlzLmN1cnJlbnRQYWdlVmFsdWUpIHJldHVybjtcbiAgICB2YXIgb2xkVmFsdWUgPSB0aGlzLmN1cnJlbnRQYWdlVmFsdWU7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnRQYWdlQ2hhbmdpbmcobmV3UGFnZSwgb2xkVmFsdWUpKSByZXR1cm47XG4gICAgdGhpcy5jdXJyZW50UGFnZVZhbHVlID0gbmV3UGFnZTtcbiAgICBpZiAoISFuZXdQYWdlKSB7XG4gICAgICBuZXdQYWdlLm9uRmlyc3RSZW5kZXJpbmcoKTtcbiAgICAgIG5ld1BhZ2UudXBkYXRlQ3VzdG9tV2lkZ2V0cygpO1xuICAgICAgbmV3UGFnZS5zZXRXYXNTaG93bih0cnVlKTtcbiAgICB9XG4gICAgdGhpcy5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIHRoaXMuY3VycmVudFBhZ2VDaGFuZ2VkKG5ld1BhZ2UsIG9sZFZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudFBhZ2UsIHVubGVzcyB0aGUgc3RhcnRlZCBwYWdlIGlzIHNob3dpbmcuIEluIHRoaXMgY2FzZSByZXR1cm5zIHRoZSBzdGFydGVkIHBhZ2UuXG4gICAqIEBzZWUgY3VycmVudFBhZ2VcbiAgICogQHNlZSBmaXJzdFBhZ2VJc1N0YXJ0ZWRcbiAgICogQHNlZSBzdGFydGVkUGFnZVxuICAgKi9cbiAgcHVibGljIGdldCBhY3RpdmVQYWdlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuaXNTdGFydGVkU3RhdGUgJiYgdGhpcy5zdGFydGVkUGFnZVxuICAgICAgPyB0aGlzLnN0YXJ0ZWRQYWdlXG4gICAgICA6IHRoaXMuY3VycmVudFBhZ2U7XG4gIH1cbiAgcHJpdmF0ZSBnZXRQYWdlQnlPYmplY3QodmFsdWU6IGFueSk6IFBhZ2VNb2RlbCB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHZhbHVlLmdldFR5cGUgJiYgdmFsdWUuZ2V0VHlwZSgpID09IFwicGFnZVwiKSByZXR1cm4gdmFsdWU7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZylcbiAgICAgIHJldHVybiB0aGlzLmdldFBhZ2VCeU5hbWUoU3RyaW5nKHZhbHVlKSk7XG4gICAgaWYgKCFpc05hTih2YWx1ZSkpIHtcbiAgICAgIHZhciBpbmRleCA9IE51bWJlcih2YWx1ZSk7XG4gICAgICB2YXIgdlBhZ2VzID0gdGhpcy52aXNpYmxlUGFnZXM7XG4gICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID49IHZQYWdlcy5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIHZQYWdlc1tpbmRleF07XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICAvKipcbiAgICogVGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIGN1cnJlbnQgcGFnZSBpbiB0aGUgdmlzaWJsZSBwYWdlcyBhcnJheS5cbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVudFBhZ2VObygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnZpc2libGVQYWdlcy5pbmRleE9mKHRoaXMuY3VycmVudFBhZ2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgY3VycmVudFBhZ2VObyh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdmFyIHZQYWdlcyA9IHRoaXMudmlzaWJsZVBhZ2VzO1xuICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPj0gdlBhZ2VzLmxlbmd0aCkgcmV0dXJuO1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSB2UGFnZXNbdmFsdWVdO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHF1ZXN0aW9uIGRpc3BsYXkgb3JkZXIuIFVzZSB0aGlzIHByb3BlcnR5IHRvIHJhbmRvbWl6ZSBxdWVzdGlvbnMuIFlvdSBjYW4gcmFuZG9taXplIHF1ZXN0aW9ucyBvbiBhIHNwZWNpZmljIHBhZ2UuXG4gICAqXG4gICAqIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlOlxuICAgKlxuICAgKiAtIGByYW5kb21gIC0gcmFuZG9taXplIHF1ZXN0aW9uc1xuICAgKiAtIGBpbml0aWFsYCAtIGtlZXAgcXVlc3Rpb25zIGluIHRoZSBzYW1lIG9yZGVyLCBhcyBpbiBhIHN1cnZleSBtb2RlbC5cbiAgICogQHNlZSBTdXJ2ZXlQYWdlLnF1ZXN0aW9uc09yZGVyXG4gICAqL1xuICBwdWJsaWMgZ2V0IHF1ZXN0aW9uc09yZGVyKCkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJxdWVzdGlvbnNPcmRlclwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHF1ZXN0aW9uc09yZGVyKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25zT3JkZXJcIiwgdmFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBpbnB1dCBmb2N1cyB0byB0aGUgZmlyc3QgcXVlc3Rpb24gd2l0aCB0aGUgaW5wdXQgZmllbGQuXG4gICAqL1xuICBwdWJsaWMgZm9jdXNGaXJzdFF1ZXN0aW9uKCkge1xuICAgIGlmICh0aGlzLmlzRm9jdXNpbmdRdWVzdGlvbikgcmV0dXJuO1xuICAgIHZhciBwYWdlID0gdGhpcy5hY3RpdmVQYWdlO1xuICAgIGlmIChwYWdlKSB7XG4gICAgICBwYWdlLnNjcm9sbFRvVG9wKCk7XG4gICAgICBwYWdlLmZvY3VzRmlyc3RRdWVzdGlvbigpO1xuICAgIH1cbiAgfVxuICBzY3JvbGxUb1RvcE9uUGFnZUNoYW5nZSgpIHtcbiAgICB2YXIgcGFnZSA9IHRoaXMuYWN0aXZlUGFnZTtcbiAgICBpZiAoIXBhZ2UpIHJldHVybjtcbiAgICBwYWdlLnNjcm9sbFRvVG9wKCk7XG4gICAgaWYgKHRoaXMuZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljICYmICF0aGlzLmlzRm9jdXNpbmdRdWVzdGlvbikge1xuICAgICAgcGFnZS5mb2N1c0ZpcnN0UXVlc3Rpb24oKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3VydmV5IHN0YXRlOlxuICAgKlxuICAgKiAtIGBsb2FkaW5nYCAtIHRoZSBzdXJ2ZXkgaXMgYmVpbmcgbG9hZGVkIGZyb20gSlNPTixcbiAgICogLSBgZW1wdHlgIC0gdGhlcmUgaXMgbm90aGluZyB0byBkaXNwbGF5IGluIHRoZSBjdXJyZW50IHN1cnZleSxcbiAgICogLSBgc3RhcnRpbmdgIC0gdGhlIHN1cnZleSdzIHN0YXJ0IHBhZ2UgaXMgZGlzcGxheWVkLFxuICAgKiAtIGBydW5uaW5nYCAtIGEgcmVzcG9uZGVudCBpcyBhbnN3ZXJpbmcgc3VydmV5IHF1ZXN0aW9ucyByaWdodCBub3csXG4gICAqIC0gYHByZXZpZXdgIC0gYSByZXNwb25kZW50IGlzIHByZXZpZXdpbmcgYW5zd2VyZWQgcXVlc3Rpb25zIGJlZm9yZSBzdWJtaXR0aW5nIHRoZSBzdXJ2ZXkgKHNlZSBbZXhhbXBsZV0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9FeGFtcGxlcy9MaWJyYXJ5P2lkPXN1cnZleS1zaG93cHJldmlldykpLFxuICAgKiAtIGBjb21wbGV0ZWRgIC0gYSByZXNwb25kZW50IGhhcyBjb21wbGV0ZWQgdGhlIHN1cnZleSBhbmQgc3VibWl0dGVkIHRoZSByZXN1bHRzLlxuICAgKlxuICAgKiBEZXRhaWxzOiBbUHJldmlldyBTdGF0ZV0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9Eb2N1bWVudGF0aW9uL0xpYnJhcnkjc3RhdGVzKVxuICAgKi9cbiAgcHVibGljIGdldCBzdGF0ZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZykgcmV0dXJuIFwibG9hZGluZ1wiO1xuICAgIGlmICh0aGlzLmlzQ29tcGxldGVkKSByZXR1cm4gXCJjb21wbGV0ZWRcIjtcbiAgICBpZiAodGhpcy5pc0NvbXBsZXRlZEJlZm9yZSkgcmV0dXJuIFwiY29tcGxldGVkYmVmb3JlXCI7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuaXNEZXNpZ25Nb2RlICYmXG4gICAgICB0aGlzLmlzRWRpdE1vZGUgJiZcbiAgICAgIHRoaXMuaXNTdGFydGVkU3RhdGUgJiZcbiAgICAgIHRoaXMuc3RhcnRlZFBhZ2VcbiAgICApXG4gICAgICByZXR1cm4gXCJzdGFydGluZ1wiO1xuICAgIGlmICh0aGlzLmlzU2hvd2luZ1ByZXZpZXcpIHJldHVybiB0aGlzLmN1cnJlbnRQYWdlID8gXCJwcmV2aWV3XCIgOiBcImVtcHR5XCI7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFBhZ2UgPyBcInJ1bm5pbmdcIiA6IFwiZW1wdHlcIjtcbiAgfVxuICBwcml2YXRlIGdldCBpc0NvbXBsZXRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNDb21wbGV0ZWRcIiwgZmFsc2UpO1xuICB9XG4gIHByaXZhdGUgc2V0IGlzQ29tcGxldGVkKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzQ29tcGxldGVkXCIsIHZhbCk7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgaXNTaG93aW5nUHJldmlldygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNTaG93aW5nUHJldmlld1wiLCBmYWxzZSk7XG4gIH1cbiAgcHJpdmF0ZSBzZXQgaXNTaG93aW5nUHJldmlldyh2YWw6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5pc1Nob3dpbmdQcmV2aWV3ID09IHZhbCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzU2hvd2luZ1ByZXZpZXdcIiwgdmFsKTtcbiAgICB0aGlzLm9uU2hvd2luZ1ByZXZpZXdDaGFuZ2VkKCk7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgaXNTdGFydGVkU3RhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlzU3RhcnRlZFN0YXRlXCIsIGZhbHNlKTtcbiAgfVxuICBwcml2YXRlIHNldCBpc1N0YXJ0ZWRTdGF0ZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1N0YXJ0ZWRTdGF0ZVwiLCB2YWwpO1xuICB9XG4gIHByaXZhdGUgZ2V0IGlzQ29tcGxldGVkQmVmb3JlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc0NvbXBsZXRlZEJlZm9yZVwiLCBmYWxzZSk7XG4gIH1cbiAgcHJpdmF0ZSBzZXQgaXNDb21wbGV0ZWRCZWZvcmUodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNDb21wbGV0ZWRCZWZvcmVcIiwgdmFsKTtcbiAgfVxuICBwcml2YXRlIGdldCBpc0xvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlzTG9hZGluZ1wiLCBmYWxzZSk7XG4gIH1cbiAgcHJpdmF0ZSBzZXQgaXNMb2FkaW5nKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzTG9hZGluZ1wiLCB2YWwpO1xuICB9XG5cbiAgcHVibGljIGdldCBjb21wbGV0ZWRTdGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbXBsZXRlZFN0YXRlVmFsdWU7XG4gIH1cbiAgZ2V0IGNvbXBsZXRlZFN0YXRlVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbXBsZXRlZFN0YXRlVGV4dFZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCBzZXRDb21wbGV0ZWRTdGF0ZSh2YWx1ZTogc3RyaW5nLCB0ZXh0OiBzdHJpbmcpIHtcbiAgICB0aGlzLmNvbXBsZXRlZFN0YXRlVmFsdWUgPSB2YWx1ZTtcbiAgICBpZiAoIXRleHQpIHtcbiAgICAgIGlmICh2YWx1ZSA9PSBcInNhdmluZ1wiKSB0ZXh0ID0gdGhpcy5nZXRMb2NTdHJpbmcoXCJzYXZpbmdEYXRhXCIpO1xuICAgICAgaWYgKHZhbHVlID09IFwiZXJyb3JcIikgdGV4dCA9IHRoaXMuZ2V0TG9jU3RyaW5nKFwic2F2aW5nRGF0YUVycm9yXCIpO1xuICAgICAgaWYgKHZhbHVlID09IFwic3VjY2Vzc1wiKSB0ZXh0ID0gdGhpcy5nZXRMb2NTdHJpbmcoXCJzYXZpbmdEYXRhU3VjY2Vzc1wiKTtcbiAgICB9XG4gICAgdGhpcy5jb21wbGV0ZWRTdGF0ZVRleHRWYWx1ZSA9IHRleHQ7XG4gIH1cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgc3VydmV5IGRhdGEgYW5kIHN0YXRlLiBJZiB0aGUgc3VydmV5IGhhcyBhIGBjb21wbGV0ZWRgIHN0YXRlLCBpdCB3aWxsIGdldCBhIGBydW5uaW5nYCBzdGF0ZS5cbiAgICogQHBhcmFtIGNsZWFyRGF0YSBjbGVhciB0aGUgZGF0YVxuICAgKiBAcGFyYW0gZ290b0ZpcnN0UGFnZSBtYWtlIHRoZSBmaXJzdCBwYWdlIGFzIGEgY3VycmVudCBwYWdlLlxuICAgKiBAc2VlIGRhdGFcbiAgICogQHNlZSBzdGF0ZVxuICAgKiBAc2VlIGN1cnJlbnRQYWdlXG4gICAqL1xuICBwdWJsaWMgY2xlYXIoY2xlYXJEYXRhOiBib29sZWFuID0gdHJ1ZSwgZ290b0ZpcnN0UGFnZTogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBpZiAoY2xlYXJEYXRhKSB7XG4gICAgICB0aGlzLmRhdGEgPSBudWxsO1xuICAgICAgdGhpcy52YXJpYWJsZXNIYXNoID0ge307XG4gICAgfVxuICAgIHRoaXMudGltZVNwZW50ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucGFnZXNbaV0udGltZVNwZW50ID0gMDtcbiAgICAgIHRoaXMucGFnZXNbaV0uc2V0V2FzU2hvd24oZmFsc2UpO1xuICAgICAgdGhpcy5wYWdlc1tpXS5wYXNzZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5pc0NvbXBsZXRlZCA9IGZhbHNlO1xuICAgIHRoaXMuaXNDb21wbGV0ZWRCZWZvcmUgPSBmYWxzZTtcbiAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuaXNTdGFydGVkU3RhdGUgPSB0aGlzLmZpcnN0UGFnZUlzU3RhcnRlZDtcbiAgICBpZiAoZ290b0ZpcnN0UGFnZSAmJiB0aGlzLnZpc2libGVQYWdlQ291bnQgPiAwKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy52aXNpYmxlUGFnZXNbMF07XG4gICAgfVxuICAgIGlmIChjbGVhckRhdGEpIHtcbiAgICAgIHRoaXMudXBkYXRlVmFsdWVzV2l0aERlZmF1bHRzKCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBtZXJnZVZhbHVlcyhzcmM6IGFueSwgZGVzdDogYW55KSB7XG4gICAgaWYgKCFkZXN0IHx8ICFzcmMpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIGRlc3QgIT09IFwib2JqZWN0XCIpIHJldHVybjtcbiAgICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgICB2YXIgdmFsdWUgPSBzcmNba2V5XTtcbiAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgaWYgKCFkZXN0W2tleV0pIGRlc3Rba2V5XSA9IHt9O1xuICAgICAgICB0aGlzLm1lcmdlVmFsdWVzKHZhbHVlLCBkZXN0W2tleV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVzdFtrZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgdXBkYXRlVmFsdWVzV2l0aERlZmF1bHRzKCkge1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSB8fCB0aGlzLmlzTG9hZGluZykgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMucGFnZXNbaV0ucXVlc3Rpb25zO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBxdWVzdGlvbnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgcXVlc3Rpb25zW2pdLnVwZGF0ZVZhbHVlV2l0aERlZmF1bHRzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCB1cGRhdGVDdXN0b21XaWRnZXRzKHBhZ2U6IFBhZ2VNb2RlbCkge1xuICAgIGlmICghcGFnZSkgcmV0dXJuO1xuICAgIHBhZ2UudXBkYXRlQ3VzdG9tV2lkZ2V0cygpO1xuICB9XG4gIHByb3RlY3RlZCBjdXJyZW50UGFnZUNoYW5naW5nKG5ld1ZhbHVlOiBQYWdlTW9kZWwsIG9sZFZhbHVlOiBQYWdlTW9kZWwpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIG9sZEN1cnJlbnRQYWdlOiBvbGRWYWx1ZSxcbiAgICAgIG5ld0N1cnJlbnRQYWdlOiBuZXdWYWx1ZSxcbiAgICAgIGFsbG93Q2hhbmdpbmc6IHRydWUsXG4gICAgICBpc05leHRQYWdlOiB0aGlzLmlzTmV4dFBhZ2UobmV3VmFsdWUsIG9sZFZhbHVlKSxcbiAgICAgIGlzUHJldlBhZ2U6IHRoaXMuaXNQcmV2UGFnZShuZXdWYWx1ZSwgb2xkVmFsdWUpLFxuICAgIH07XG4gICAgdGhpcy5vbkN1cnJlbnRQYWdlQ2hhbmdpbmcuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9ucy5hbGxvd0NoYW5naW5nO1xuICB9XG4gIHByb3RlY3RlZCBjdXJyZW50UGFnZUNoYW5nZWQobmV3VmFsdWU6IFBhZ2VNb2RlbCwgb2xkVmFsdWU6IFBhZ2VNb2RlbCkge1xuICAgIGNvbnN0IGlzTmV4dFBhZ2U6IGJvb2xlYW4gPSB0aGlzLmlzTmV4dFBhZ2UobmV3VmFsdWUsIG9sZFZhbHVlKTtcbiAgICBpZiAoaXNOZXh0UGFnZSkge1xuICAgICAgb2xkVmFsdWUucGFzc2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5vbkN1cnJlbnRQYWdlQ2hhbmdlZC5maXJlKHRoaXMsIHtcbiAgICAgIG9sZEN1cnJlbnRQYWdlOiBvbGRWYWx1ZSxcbiAgICAgIG5ld0N1cnJlbnRQYWdlOiBuZXdWYWx1ZSxcbiAgICAgIGlzTmV4dFBhZ2U6IGlzTmV4dFBhZ2UsXG4gICAgICBpc1ByZXZQYWdlOiB0aGlzLmlzUHJldlBhZ2UobmV3VmFsdWUsIG9sZFZhbHVlKSxcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIGlzTmV4dFBhZ2UobmV3VmFsdWU6IFBhZ2VNb2RlbCwgb2xkVmFsdWU6IFBhZ2VNb2RlbCk6IGJvb2xlYW4ge1xuICAgIGlmICghbmV3VmFsdWUgfHwgIW9sZFZhbHVlKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIG5ld1ZhbHVlLnZpc2libGVJbmRleCA9PSBvbGRWYWx1ZS52aXNpYmxlSW5kZXggKyAxO1xuICB9XG4gIHByaXZhdGUgaXNQcmV2UGFnZShuZXdWYWx1ZTogUGFnZU1vZGVsLCBvbGRWYWx1ZTogUGFnZU1vZGVsKTogYm9vbGVhbiB7XG4gICAgaWYgKCFuZXdWYWx1ZSB8fCAhb2xkVmFsdWUpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gbmV3VmFsdWUudmlzaWJsZUluZGV4ICsgMSA9PSBvbGRWYWx1ZS52aXNpYmxlSW5kZXg7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHByb2dyZXNzIHRoYXQgYSB1c2VyIG1hZGUgd2hpbGUgZ29pbmcgdGhyb3VnaCB0aGUgc3VydmV5LlxuICAgKiBJdCBkZXBlbmRzIGZyb20gcHJvZ3Jlc3NCYXJUeXBlIHByb3BlcnR5XG4gICAqIEBzZWUgcHJvZ3Jlc3NCYXJUeXBlXG4gICAqIEBzZWUgcHJvZ3Jlc3NWYWx1ZVxuICAgKi9cbiAgcHVibGljIGdldFByb2dyZXNzKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2UgPT0gbnVsbCkgcmV0dXJuIDA7XG4gICAgaWYgKHRoaXMucHJvZ3Jlc3NCYXJUeXBlICE9PSBcInBhZ2VzXCIpIHtcbiAgICAgIHZhciBpbmZvID0gdGhpcy5nZXRQcm9ncmVzc0luZm8oKTtcbiAgICAgIGlmICh0aGlzLnByb2dyZXNzQmFyVHlwZSA9PT0gXCJyZXF1aXJlZFF1ZXN0aW9uc1wiKSB7XG4gICAgICAgIHJldHVybiBpbmZvLnJlcXVpcmVkUXVlc3Rpb25Db3VudCA+IDFcbiAgICAgICAgICA/IE1hdGguY2VpbChcbiAgICAgICAgICAgIChpbmZvLnJlcXVpcmVkQW5zd2VyZWRRdWVzdGlvbkNvdW50ICogMTAwKSAvXG4gICAgICAgICAgICBpbmZvLnJlcXVpcmVkUXVlc3Rpb25Db3VudFxuICAgICAgICAgIClcbiAgICAgICAgICA6IDEwMDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpbmZvLnF1ZXN0aW9uQ291bnQgPiAxXG4gICAgICAgID8gTWF0aC5jZWlsKChpbmZvLmFuc3dlcmVkUXVlc3Rpb25Db3VudCAqIDEwMCkgLyBpbmZvLnF1ZXN0aW9uQ291bnQpXG4gICAgICAgIDogMTAwO1xuICAgIH1cbiAgICB2YXIgaW5kZXggPSB0aGlzLnZpc2libGVQYWdlcy5pbmRleE9mKHRoaXMuY3VycmVudFBhZ2UpICsgMTtcbiAgICByZXR1cm4gTWF0aC5jZWlsKChpbmRleCAqIDEwMCkgLyB0aGlzLnZpc2libGVQYWdlQ291bnQpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwcm9ncmVzcyB0aGF0IGEgdXNlciBtYWRlIHdoaWxlIGdvaW5nIHRocm91Z2ggdGhlIHN1cnZleS5cbiAgICogSXQgZGVwZW5kcyBmcm9tIHByb2dyZXNzQmFyVHlwZSBwcm9wZXJ0eVxuICAgKiBAc2VlIHByb2dyZXNzQmFyVHlwZVxuICAgKi9cbiAgcHVibGljIGdldCBwcm9ncmVzc1ZhbHVlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInByb2dyZXNzVmFsdWVcIiwgMCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG5hdmlnYXRpb24gYnV0dG9ucyAoaS5lLiwgJ1ByZXYnLCAnTmV4dCcsIG9yICdDb21wbGV0ZScgYW5kICdQcmV2aWV3JykgcG9zaXRpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzTmF2aWdhdGlvbkJ1dHRvbnNTaG93aW5nKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSByZXR1cm4gXCJub25lXCI7XG4gICAgdmFyIHBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlO1xuICAgIGlmICghcGFnZSkgcmV0dXJuIFwibm9uZVwiO1xuICAgIGlmIChwYWdlLm5hdmlnYXRpb25CdXR0b25zVmlzaWJpbGl0eSA9PT0gXCJzaG93XCIpIHtcbiAgICAgIHJldHVybiBcImJvdHRvbVwiO1xuICAgIH1cbiAgICBpZiAocGFnZS5uYXZpZ2F0aW9uQnV0dG9uc1Zpc2liaWxpdHkgPT09IFwiaGlkZVwiKSB7XG4gICAgICByZXR1cm4gXCJub25lXCI7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNob3dOYXZpZ2F0aW9uQnV0dG9ucztcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBuYXZpZ2F0aW9uIGJ1dHRvbnMgKGkuZS4sICdQcmV2JywgJ05leHQnLCBvciAnQ29tcGxldGUnIGFuZCAnUHJldmlldycpIGFyZSBzaG93cyBvbiB0b3AuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzTmF2aWdhdGlvbkJ1dHRvbnNTaG93aW5nT25Ub3AoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SXNOYXZpZ2F0aW9uQnV0dG9uc1Nob3dpbmdPbihcInRvcFwiKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBuYXZpZ2F0aW9uIGJ1dHRvbnMgKGkuZS4sICdQcmV2JywgJ05leHQnLCBvciAnQ29tcGxldGUnIGFuZCAnUHJldmlldycpIGFyZSBzaG93cyBvbiBib3R0b20uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzTmF2aWdhdGlvbkJ1dHRvbnNTaG93aW5nT25Cb3R0b20oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SXNOYXZpZ2F0aW9uQnV0dG9uc1Nob3dpbmdPbihcImJvdHRvbVwiKTtcbiAgfVxuICBwcml2YXRlIGdldElzTmF2aWdhdGlvbkJ1dHRvbnNTaG93aW5nT24oYnV0dG9uUG9zaXRpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHZhciByZXMgPSB0aGlzLmlzTmF2aWdhdGlvbkJ1dHRvbnNTaG93aW5nO1xuICAgIHJldHVybiByZXMgPT0gXCJib3RoXCIgfHwgcmVzID09IGJ1dHRvblBvc2l0aW9uO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgc3VydmV5IGlzIGluIGVkaXQgbW9kZS5cbiAgICogQHNlZSBtb2RlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzRWRpdE1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PSBcImVkaXRcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzQ29tcGxldGVCdXR0b25WaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmlzRWRpdE1vZGUgJiZcbiAgICAgICghdGhpcy5pc1Nob3dQcmV2aWV3QmVmb3JlQ29tcGxldGUgfHwgdGhpcy5zdGF0ZSA9PSBcInByZXZpZXdcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNQcmV2aWV3QnV0dG9uVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5pc0VkaXRNb2RlICYmXG4gICAgICB0aGlzLmlzU2hvd1ByZXZpZXdCZWZvcmVDb21wbGV0ZSAmJlxuICAgICAgdGhpcy5zdGF0ZSA9PSBcInJ1bm5pbmdcIlxuICAgICk7XG4gIH1cbiAgcHVibGljIGdldCBpc0NhbmNlbFByZXZpZXdCdXR0b25WaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmlzRWRpdE1vZGUgJiZcbiAgICAgIHRoaXMuaXNTaG93UHJldmlld0JlZm9yZUNvbXBsZXRlICYmXG4gICAgICB0aGlzLnN0YXRlID09IFwicHJldmlld1wiXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHN1cnZleSBpcyBpbiBkaXNwbGF5IG1vZGUgb3IgaW4gcHJldmlldyBtb2RlLlxuICAgKiBAc2VlIG1vZGVcbiAgICogQHNlZSBzaG93UHJldmlld0JlZm9yZUNvbXBsZXRlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzRGlzcGxheU1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PSBcImRpc3BsYXlcIiB8fCB0aGlzLnN0YXRlID09IFwicHJldmlld1wiO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNVcGRhdGVWYWx1ZVRleHRPblR5cGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50ZXh0VXBkYXRlTW9kZSA9PSBcIm9uVHlwaW5nXCI7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBzdXJ2ZXkgaXMgaW4gZGVzaWduIG1vZGUuIEl0IGlzIHVzZWQgYnkgU3VydmV5SlMgRWRpdG9yLlxuICAgKiBAc2VlIHNldERlc2lnbk1vZGVcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNEZXNpZ25Nb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0Rlc2lnbk1vZGU7XG4gIH1cbiAgcHJpdmF0ZSBfaXNEZXNpZ25Nb2RlOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBzdXJ2ZXkgaW50byBkZXNpZ24gbW9kZS5cbiAgICogQHBhcmFtIHZhbHVlIHVzZSB0cnVlIHRvIHNldCB0aGUgc3VydmV5IGludG8gdGhlIGRlc2lnbiBtb2RlLlxuICAgKi9cbiAgcHVibGljIHNldERlc2lnbk1vZGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9pc0Rlc2lnbk1vZGUgPSB2YWx1ZTtcbiAgICB0aGlzLm9uUXVlc3Rpb25zT25QYWdlTW9kZUNoYW5nZWQoXCJzdGFuZGFyZFwiKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHdoZXRoZXIgdG8gc2hvdyBhbGwgZWxlbWVudHMgaW4gdGhlIHN1cnZleSwgcmVnYXJkbGVzcyB0aGVpciB2aXNpYmlsaXR5LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICAgKi9cbiAgcHVibGljIGdldCBzaG93SW52aXNpYmxlRWxlbWVudHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dJbnZpc2libGVFbGVtZW50c1wiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBzaG93SW52aXNpYmxlRWxlbWVudHModmFsOiBib29sZWFuKSB7XG4gICAgdmFyIHZpc1BhZ2VzID0gdGhpcy52aXNpYmxlUGFnZXM7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd0ludmlzaWJsZUVsZW1lbnRzXCIsIHZhbCk7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB0aGlzLnJ1bkNvbmRpdGlvbnMoKTtcbiAgICB0aGlzLnVwZGF0ZUFsbEVsZW1lbnRzVmlzaWJpbGl0eSh2aXNQYWdlcyk7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVBbGxFbGVtZW50c1Zpc2liaWxpdHkodmlzUGFnZXM6IEFycmF5PFBhZ2VNb2RlbD4pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwYWdlID0gdGhpcy5wYWdlc1tpXTtcbiAgICAgIHBhZ2UudXBkYXRlRWxlbWVudFZpc2liaWxpdHkoKTtcbiAgICAgIGlmICh2aXNQYWdlcy5pbmRleE9mKHBhZ2UpID4gLTEgIT0gcGFnZS5pc1Zpc2libGUpIHtcbiAgICAgICAgdGhpcy5vblBhZ2VWaXNpYmxlQ2hhbmdlZC5maXJlKHRoaXMsIHtcbiAgICAgICAgICBwYWdlOiBwYWdlLFxuICAgICAgICAgIHZpc2libGU6IHBhZ2UuaXNWaXNpYmxlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIGdldCBhcmVJbnZpc2libGVFbGVtZW50c1Nob3dpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNEZXNpZ25Nb2RlIHx8IHRoaXMuc2hvd0ludmlzaWJsZUVsZW1lbnRzO1xuICB9XG4gIHB1YmxpYyBnZXQgYXJlRW1wdHlFbGVtZW50c0hpZGRlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5pc1Nob3dpbmdQcmV2aWV3ICYmXG4gICAgICB0aGlzLnNob3dQcmV2aWV3QmVmb3JlQ29tcGxldGUgPT0gXCJzaG93QW5zd2VyZWRRdWVzdGlvbnNcIlxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYHRydWVgLCBpZiBhIHVzZXIgaGFzIGFscmVhZHkgY29tcGxldGVkIHRoZSBzdXJ2ZXkgaW4gdGhpcyBicm93c2VyIGFuZCB0aGVyZSBpcyBhIGNvb2tpZSBhYm91dCBpdC4gU3VydmV5IGdvZXMgdG8gYGNvbXBsZXRlZGAgc3RhdGUgaWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgYHRydWVgLlxuICAgKiBAc2VlIGNvb2tpZU5hbWVcbiAgICogQHNlZSBzZXRDb29raWVcbiAgICogQHNlZSBkZWxldGVDb29raWVcbiAgICogQHNlZSBzdGF0ZVxuICAgKi9cbiAgcHVibGljIGdldCBoYXNDb29raWUoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmNvb2tpZU5hbWUgfHwgdHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIGNvb2tpZXMgPSBkb2N1bWVudC5jb29raWU7XG4gICAgcmV0dXJuIGNvb2tpZXMgJiYgY29va2llcy5pbmRleE9mKHRoaXMuY29va2llTmFtZSArIFwiPXRydWVcIikgPiAtMTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoZSBjb29raWUgd2l0aCBgY29va2llTmFtZWAgaW4gdXNlcidzIGJyb3dzZXIuIEl0IGlzIGRvbmUgYXV0b21hdGljYWxseSBvbiBzdXJ2ZXkgY29tcGxldGUgaWYgdGhlIGBjb29raWVOYW1lYCBwcm9wZXJ0eSB2YWx1ZSBpcyBub3QgZW1wdHkuXG4gICAqIEBzZWUgY29va2llTmFtZVxuICAgKiBAc2VlIGhhc0Nvb2tpZVxuICAgKiBAc2VlIGRlbGV0ZUNvb2tpZVxuICAgKi9cbiAgcHVibGljIHNldENvb2tpZSgpIHtcbiAgICBpZiAoIXRoaXMuY29va2llTmFtZSB8fCB0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcbiAgICBkb2N1bWVudC5jb29raWUgPVxuICAgICAgdGhpcy5jb29raWVOYW1lICsgXCI9dHJ1ZTsgZXhwaXJlcz1GcmksIDMxIERlYyA5OTk5IDA6MDowIEdNVFwiO1xuICB9XG4gIC8qKlxuICAgKiBEZWxldGVzIHRoZSBjb29raWUgd2l0aCBgY29va2llTmFtZWAgZnJvbSB0aGUgYnJvd3Nlci5cbiAgICogQHNlZSBjb29raWVOYW1lXG4gICAqIEBzZWUgaGFzQ29va2llXG4gICAqIEBzZWUgc2V0Q29va2llXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlQ29va2llKCkge1xuICAgIGlmICghdGhpcy5jb29raWVOYW1lKSByZXR1cm47XG4gICAgZG9jdW1lbnQuY29va2llID0gdGhpcy5jb29raWVOYW1lICsgXCI9O1wiO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgd2hldGhlciB0aGUgc3VydmV5IG11c3QgaWdub3JlIHZhbGlkYXRpb24gbGlrZSByZXF1aXJlZCBxdWVzdGlvbnMgYW5kIG90aGVycywgb24gYG5leHRQYWdlYCBhbmQgYGNvbXBsZXRlTGFzdFBhZ2VgIGZ1bmN0aW9uIGNhbGxzLiBUaGUgZGVmYXVsdCBpcyBgZmFsc2VgLlxuICAgKiBAc2VlIG5leHRQYWdlXG4gICAqIEBzZWUgY29tcGxldGVMYXN0UGFnZVxuICAgKiBAc2VlIG1vZGVcbiAgICovXG4gIHB1YmxpYyBpZ25vcmVWYWxpZGF0aW9uOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKlxuICAgKiBOYXZpZ2F0ZXMgdXNlciB0byB0aGUgbmV4dCBwYWdlLlxuICAgKlxuICAgKiBSZXR1cm5zIGBmYWxzZWAgaW4gdGhlIGZvbGxvd2luZyBjYXNlczpcbiAgICpcbiAgICogLSBpZiB0aGUgY3VycmVudCBwYWdlIGlzIHRoZSBsYXN0IHBhZ2UuXG4gICAqIC0gaWYgdGhlIGN1cnJlbnQgcGFnZSBjb250YWlucyBlcnJvcnMgKGZvciBleGFtcGxlLCBhIHJlcXVpcmVkIHF1ZXN0aW9uIGlzIGVtcHR5KS5cbiAgICogQHNlZSBpc0N1cnJlbnRQYWdlSGFzRXJyb3JzXG4gICAqIEBzZWUgcHJldlBhZ2VcbiAgICogQHNlZSBjb21wbGV0ZUxhc3RQYWdlXG4gICAqL1xuICBwdWJsaWMgbmV4dFBhZ2UoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNMYXN0UGFnZSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmRvQ3VycmVudFBhZ2VDb21wbGV0ZShmYWxzZSk7XG4gIH1cbiAgcHJpdmF0ZSBoYXNFcnJvcnNPbk5hdmlnYXRlKGRvQ29tcGxldGU6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pZ25vcmVWYWxpZGF0aW9uIHx8ICF0aGlzLmlzRWRpdE1vZGUpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgZnVuYyA9IChoYXNFcnJvcnM6IGJvb2xlYW4pID0+IHtcbiAgICAgIGlmICghaGFzRXJyb3JzKSB7XG4gICAgICAgIHRoaXMuZG9DdXJyZW50UGFnZUNvbXBsZXRlQ29yZShkb0NvbXBsZXRlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmICh0aGlzLmNoZWNrRXJyb3JzTW9kZSA9PT0gXCJvbkNvbXBsZXRlXCIpIHtcbiAgICAgIGlmICghdGhpcy5pc0xhc3RQYWdlKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdGhpcy5oYXNFcnJvcnModHJ1ZSwgdHJ1ZSwgZnVuYykgIT09IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5oYXNDdXJyZW50UGFnZUVycm9ycyhmdW5jKSAhPT0gZmFsc2U7XG4gIH1cbiAgcHJpdmF0ZSBhc3luY1ZhbGlkYXRpb25RdWVzaXRvbnM6IEFycmF5PFF1ZXN0aW9uPjtcbiAgcHJpdmF0ZSBjaGVja0ZvckFzeW5jUXVlc3Rpb25WYWxpZGF0aW9uKFxuICAgIHF1ZXN0aW9uczogQXJyYXk8UXVlc3Rpb24+LFxuICAgIGZ1bmM6IChoYXNFcnJvcnM6IGJvb2xlYW4pID0+IHZvaWRcbiAgKTogYm9vbGVhbiB7XG4gICAgdGhpcy5jbGVhckFzeW5jVmFsaWRhdGlvblF1ZXNpdG9ucygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocXVlc3Rpb25zW2ldLmlzUnVubmluZ1ZhbGlkYXRvcnMpIHtcbiAgICAgICAgbGV0IHEgPSBxdWVzdGlvbnNbaV07XG4gICAgICAgIHEub25Db21wbGV0ZWRBc3luY1ZhbGlkYXRvcnMgPSAoaGFzRXJyb3JzOiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgdGhpcy5vbkNvbXBsZXRlZEFzeW5jUXVlc3Rpb25WYWxpZGF0b3JzKHEsIGZ1bmMsIGhhc0Vycm9ycyk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuYXN5bmNWYWxpZGF0aW9uUXVlc2l0b25zLnB1c2gocXVlc3Rpb25zW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYXN5bmNWYWxpZGF0aW9uUXVlc2l0b25zLmxlbmd0aCA+IDA7XG4gIH1cbiAgcHJpdmF0ZSBjbGVhckFzeW5jVmFsaWRhdGlvblF1ZXNpdG9ucygpIHtcbiAgICBpZiAoISF0aGlzLmFzeW5jVmFsaWRhdGlvblF1ZXNpdG9ucykge1xuICAgICAgdmFyIGFzeW5RdWVzdGlvbnMgPSB0aGlzLmFzeW5jVmFsaWRhdGlvblF1ZXNpdG9ucztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXN5blF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBhc3luUXVlc3Rpb25zW2ldLm9uQ29tcGxldGVkQXN5bmNWYWxpZGF0b3JzID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hc3luY1ZhbGlkYXRpb25RdWVzaXRvbnMgPSBbXTtcbiAgfVxuICBwcml2YXRlIG9uQ29tcGxldGVkQXN5bmNRdWVzdGlvblZhbGlkYXRvcnMoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIGZ1bmM6IChoYXNFcnJvcnM6IGJvb2xlYW4pID0+IHZvaWQsXG4gICAgaGFzRXJyb3JzOiBib29sZWFuXG4gICkge1xuICAgIGlmIChoYXNFcnJvcnMpIHtcbiAgICAgIHRoaXMuY2xlYXJBc3luY1ZhbGlkYXRpb25RdWVzaXRvbnMoKTtcbiAgICAgIGZ1bmModHJ1ZSk7XG4gICAgICBpZiAodGhpcy5mb2N1c09uRmlyc3RFcnJvciAmJiAhIXF1ZXN0aW9uICYmICEhcXVlc3Rpb24ucGFnZSAmJiBxdWVzdGlvbi5wYWdlID09PSB0aGlzLmN1cnJlbnRQYWdlKSB7XG4gICAgICAgIGNvbnN0IHF1ZXN0aW9uczogQXJyYXk8UXVlc3Rpb24+ID0gdGhpcy5jdXJyZW50UGFnZS5xdWVzdGlvbnM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKHF1ZXN0aW9uc1tpXSAhPT0gcXVlc3Rpb24gJiYgcXVlc3Rpb25zW2ldLmVycm9ycy5sZW5ndGggPiAwKSByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcXVlc3Rpb24uZm9jdXModHJ1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBhc3luUXVlc3Rpb25zID0gdGhpcy5hc3luY1ZhbGlkYXRpb25RdWVzaXRvbnM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhc3luUXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYXN5blF1ZXN0aW9uc1tpXS5pc1J1bm5pbmdWYWxpZGF0b3JzKSByZXR1cm47XG4gICAgfVxuICAgIGZ1bmMoZmFsc2UpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCwgaWYgdGhlIGN1cnJlbnQgcGFnZSBjb250YWlucyBlcnJvcnMsIGZvciBleGFtcGxlLCB0aGUgcmVxdWlyZWQgcXVlc3Rpb24gaXMgZW1wdHkgb3IgYSBxdWVzdGlvbiB2YWxpZGF0aW9uIGlzIGZhaWxlZC5cbiAgICogQHNlZSBuZXh0UGFnZVxuICAgKi9cbiAgcHVibGljIGdldCBpc0N1cnJlbnRQYWdlSGFzRXJyb3JzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNoZWNrSXNDdXJyZW50UGFnZUhhc0Vycm9ycygpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCwgaWYgdGhlIGN1cnJlbnQgcGFnZSBjb250YWlucyBhbnkgZXJyb3IuIElmIHRoZXJlIGlzIGFuIGFzeW5jIGZ1bmN0aW9uIGluIGFuIGV4cHJlc3Npb24sIHRoZW4gdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGB1bmRlZmluZWRgIHZhbHVlLlxuICAgKiBJbiB0aGlzIGNhc2UsIHlvdSBzaG91bGQgdXNlIGBvbkFzeW5jVmFsaWRhdGlvbmAgcGFyYW1ldGVyLCB3aGljaCBpcyBhIGNhbGxiYWNrIGZ1bmN0aW9uOiAoaGFzRXJyb3JzOiBib29sZWFuKSA9PiB2b2lkXG4gICAqIEBwYXJhbSBvbkFzeW5jVmFsaWRhdGlvbiB1c2UgdGhpcyBwYXJhbWV0ZXIgaWYgeW91IHVzZSBhc3luYyBmdW5jdGlvbnMgaW4geW91ciBleHByZXNzaW9ucy4gVGhpcyBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRoIGhhc0Vycm9ycyB2YWx1ZSBlcXVhbHMgdG8gYHRydWVgIG9yIGBmYWxzZWAuXG4gICAqIEBzZWUgaGFzUGFnZUVycm9yc1xuICAgKiBAc2VlIGhhc0Vycm9yc1xuICAgKiBAc2VlIGN1cnJlbnRQYWdlXG4gICAqL1xuICBwdWJsaWMgaGFzQ3VycmVudFBhZ2VFcnJvcnMoXG4gICAgb25Bc3luY1ZhbGlkYXRpb24/OiAoaGFzRXJyb3JzOiBib29sZWFuKSA9PiB2b2lkXG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc1BhZ2VFcnJvcnModW5kZWZpbmVkLCBvbkFzeW5jVmFsaWRhdGlvbik7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYHRydWVgLCBpZiBhIHBhZ2UgY29udGFpbnMgYW4gZXJyb3IuIElmIHRoZXJlIGlzIGFuIGFzeW5jIGZ1bmN0aW9uIGluIGFuIGV4cHJlc3Npb24sIHRoZW4gdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGB1bmRlZmluZWRgIHZhbHVlLlxuICAgKiBJbiB0aGlzIGNhc2UsIHlvdSBzaG91bGQgdXNlIHRoZSBzZWNvbmQgYG9uQXN5bmNWYWxpZGF0aW9uYCBwYXJhbWV0ZXIsICB3aGljaCBpcyBhIGNhbGxiYWNrIGZ1bmN0aW9uOiAoaGFzRXJyb3JzOiBib29sZWFuKSA9PiB2b2lkXG4gICAqIEBwYXJhbSBwYWdlIHRoZSBwYWdlIHRoYXQgeW91IHdhbnQgdG8gdmFsaWRhdGUuIElmIHRoZSBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkIHRoZW4gdGhlIGBhY3RpdmVQYWdlYCBpcyB1c2luZ1xuICAgKiBAcGFyYW0gb25Bc3luY1ZhbGlkYXRpb24gdXNlIHRoaXMgcGFyYW1ldGVyIGlmIHlvdSB1c2UgYXN5bmMgZnVuY3Rpb25zIGluIHlvdXIgZXhwcmVzc2lvbnMuIFRoaXMgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2l0aCBoYXNFcnJvcnMgdmFsdWUgZXF1YWxzIHRvIGB0cnVlYCBvciBgZmFsc2VgLlxuICAgKiBAc2VlIGhhc0N1cnJlbnRQYWdlRXJyb3JzXG4gICAqIEBzZWUgaGFzRXJyb3JzXG4gICAqIEBzZWUgYWN0aXZlUGFnZVxuICAgKiBAc2VlIGN1cnJlbnRQYWdlXG4gICAqL1xuICBwdWJsaWMgaGFzUGFnZUVycm9ycyhcbiAgICBwYWdlPzogUGFnZU1vZGVsLFxuICAgIG9uQXN5bmNWYWxpZGF0aW9uPzogKGhhc0Vycm9yczogYm9vbGVhbikgPT4gdm9pZFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIXBhZ2UpIHtcbiAgICAgIHBhZ2UgPSB0aGlzLmFjdGl2ZVBhZ2U7XG4gICAgfVxuICAgIGlmICghcGFnZSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLmNoZWNrSXNQYWdlSGFzRXJyb3JzKHBhZ2UpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIW9uQXN5bmNWYWxpZGF0aW9uKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tGb3JBc3luY1F1ZXN0aW9uVmFsaWRhdGlvbihcbiAgICAgIHBhZ2UucXVlc3Rpb25zLFxuICAgICAgKGhhc0Vycm9yczogYm9vbGVhbikgPT4gb25Bc3luY1ZhbGlkYXRpb24oaGFzRXJyb3JzKVxuICAgIClcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCwgaWYgYW55IG9mIHRoZSBzdXJ2ZXkgcGFnZXMgY29udGFpbnMgZXJyb3JzLiBJZiB0aGVyZSBpcyBhbiBhc3luYyBmdW5jdGlvbiBpbiBhbiBleHByZXNzaW9uLCB0aGVuIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiBgdW5kZWZpbmVkYCB2YWx1ZS5cbiAgICogSW4gdGhpcyBjYXNlLCB5b3Ugc2hvdWxkIHVzZSAgdGhlIHRoaXJkIGBvbkFzeW5jVmFsaWRhdGlvbmAgcGFyYW1ldGVyLCB3aGljaCBpcyBhIGNhbGxiYWNrIGZ1bmN0aW9uOiAoaGFzRXJyb3JzOiBib29sZWFuKSA9PiB2b2lkXG4gICAqIEBwYXJhbSBmaXJlQ2FsbGJhY2sgc2V0IGl0IHRvIGB0cnVlYCwgdG8gc2hvdyBlcnJvcnMgaW4gVUkuXG4gICAqIEBwYXJhbSBmb2N1c09uRmlyc3RFcnJvciBzZXQgaXQgdG8gYHRydWVgIHRvIGZvY3VzIG9uIHRoZSBmaXJzdCBxdWVzdGlvbiB0aGF0IGRvZXNuJ3QgcGFzcyB0aGUgdmFsaWRhdGlvbiBhbmQgbWFrZSB0aGUgcGFnZSwgd2hlcmUgdGhlIHF1ZXN0aW9uIGlzIGxvY2F0ZWQsIHRoZSBjdXJyZW50LlxuICAgKiBAcGFyYW0gb25Bc3luY1ZhbGlkYXRpb24gdXNlIHRoaXMgcGFyYW1ldGVyIGlmIHlvdSB1c2UgYXN5bmMgZnVuY3Rpb25zIGluIHlvdXIgZXhwcmVzc2lvbnMuIFRoaXMgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2l0aCBoYXNFcnJvcnMgdmFsdWUgZXF1YWxzIHRvIGB0cnVlYCBvciBgZmFsc2VgLlxuICAgKiBAc2VlIGhhc0N1cnJlbnRQYWdlRXJyb3JzXG4gICAqIEBzZWUgaGFzUGFnZUVycm9yc1xuICAgKi9cbiAgcHVibGljIGhhc0Vycm9ycyhcbiAgICBmaXJlQ2FsbGJhY2s6IGJvb2xlYW4gPSB0cnVlLFxuICAgIGZvY3VzT25GaXJzdEVycm9yOiBib29sZWFuID0gZmFsc2UsXG4gICAgb25Bc3luY1ZhbGlkYXRpb24/OiAoaGFzRXJyb3JzOiBib29sZWFuKSA9PiB2b2lkXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghIW9uQXN5bmNWYWxpZGF0aW9uKSB7XG4gICAgICBmaXJlQ2FsbGJhY2sgPSB0cnVlO1xuICAgIH1cbiAgICB2YXIgdmlzUGFnZXMgPSB0aGlzLnZpc2libGVQYWdlcztcbiAgICB2YXIgZmlyc3RFcnJvclBhZ2UgPSBudWxsO1xuICAgIHZhciByZXMgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZpc1BhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodmlzUGFnZXNbaV0uaGFzRXJyb3JzKGZpcmVDYWxsYmFjaywgZmFsc2UpKSB7XG4gICAgICAgIGlmICghZmlyc3RFcnJvclBhZ2UpIGZpcnN0RXJyb3JQYWdlID0gdmlzUGFnZXNbaV07XG4gICAgICAgIHJlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmb2N1c09uRmlyc3RFcnJvciAmJiAhIWZpcnN0RXJyb3JQYWdlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gZmlyc3RFcnJvclBhZ2U7XG4gICAgICB2YXIgcXVlc3Rpb25zID0gZmlyc3RFcnJvclBhZ2UucXVlc3Rpb25zO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHF1ZXN0aW9uc1tpXS5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHF1ZXN0aW9uc1tpXS5mb2N1cyh0cnVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVzIHx8ICFvbkFzeW5jVmFsaWRhdGlvbikgcmV0dXJuIHJlcztcbiAgICByZXR1cm4gdGhpcy5jaGVja0ZvckFzeW5jUXVlc3Rpb25WYWxpZGF0aW9uKFxuICAgICAgdGhpcy5nZXRBbGxRdWVzdGlvbnMoKSxcbiAgICAgIChoYXNFcnJvcnM6IGJvb2xlYW4pID0+IG9uQXN5bmNWYWxpZGF0aW9uKGhhc0Vycm9ycylcbiAgICApXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgc3VydmV5IGVsZW1lbnRzIChwYWdlcywgcGFuZWxzLCBhbmQgcXVlc3Rpb25zKSBoYXZlIHVuaXF1ZSBxdWVzdGlvbiBuYW1lcy5cbiAgICogWW91IGNhbiBjaGVjayBmb3IgdW5pcXVlIG5hbWVzIGZvciBpbmRpdmlkdWFsIHBhZ2UgYW5kIHBhbmVsIChhbmQgYWxsIHRoZWlyIGVsZW1lbnRzKSBvciBhIHF1ZXN0aW9uLlxuICAgKiBJZiB0aGUgcGFyYW1ldGVyIGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gYSBzdXJ2ZXkgY2hlY2tzIHRoYXQgYWxsIGl0cyBlbGVtZW50cyBoYXZlIHVuaXF1ZSBuYW1lcy5cbiAgICogQHBhcmFtIGVsZW1lbnQgcGFnZSwgcGFuZWwgb3IgcXVlc3Rpb24sIGl0IGlzIGBudWxsYCBieSBkZWZhdWx0LCB0aGF0IG1lYW5zIGFsbCBzdXJ2ZXkgZWxlbWVudHMgd2lsbCBiZSBjaGVja2VkXG4gICAqL1xuICBwdWJsaWMgZW5zdXJlVW5pcXVlTmFtZXMoZWxlbWVudDogSVN1cnZleUVsZW1lbnQgPSBudWxsKSB7XG4gICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuZW5zdXJlVW5pcXVlTmFtZSh0aGlzLnBhZ2VzW2ldKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbnN1cmVVbmlxdWVOYW1lKGVsZW1lbnQpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGVuc3VyZVVuaXF1ZU5hbWUoZWxlbWVudDogSVN1cnZleUVsZW1lbnQpIHtcbiAgICBpZiAoZWxlbWVudC5pc1BhZ2UpIHtcbiAgICAgIHRoaXMuZW5zdXJlVW5pcXVlUGFnZU5hbWUoZWxlbWVudCk7XG4gICAgfVxuICAgIGlmIChlbGVtZW50LmlzUGFuZWwpIHtcbiAgICAgIHRoaXMuZW5zdXJlVW5pcXVlUGFuZWxOYW1lKGVsZW1lbnQpO1xuICAgIH1cbiAgICBpZiAoZWxlbWVudC5pc1BhZ2UgfHwgZWxlbWVudC5pc1BhbmVsKSB7XG4gICAgICB2YXIgZWxlbWVudHMgPSAoPElQYW5lbD5lbGVtZW50KS5lbGVtZW50cztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5lbnN1cmVVbmlxdWVOYW1lcyhlbGVtZW50c1tpXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW5zdXJlVW5pcXVlUXVlc3Rpb25OYW1lKGVsZW1lbnQpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGVuc3VyZVVuaXF1ZVBhZ2VOYW1lKGVsZW1lbnQ6IElTdXJ2ZXlFbGVtZW50KSB7XG4gICAgcmV0dXJuIHRoaXMuZW5zdXJlVW5pcXVlRWxlbWVudE5hbWUoXG4gICAgICBlbGVtZW50LFxuICAgICAgKG5hbWU6IHN0cmluZyk6IElTdXJ2ZXlFbGVtZW50ID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFnZUJ5TmFtZShuYW1lKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIHByaXZhdGUgZW5zdXJlVW5pcXVlUGFuZWxOYW1lKGVsZW1lbnQ6IElTdXJ2ZXlFbGVtZW50KSB7XG4gICAgcmV0dXJuIHRoaXMuZW5zdXJlVW5pcXVlRWxlbWVudE5hbWUoXG4gICAgICBlbGVtZW50LFxuICAgICAgKG5hbWU6IHN0cmluZyk6IElTdXJ2ZXlFbGVtZW50ID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFuZWxCeU5hbWUobmFtZSk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGVuc3VyZVVuaXF1ZVF1ZXN0aW9uTmFtZShlbGVtZW50OiBJU3VydmV5RWxlbWVudCkge1xuICAgIHJldHVybiB0aGlzLmVuc3VyZVVuaXF1ZUVsZW1lbnROYW1lKFxuICAgICAgZWxlbWVudCxcbiAgICAgIChuYW1lOiBzdHJpbmcpOiBJU3VydmV5RWxlbWVudCA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFF1ZXN0aW9uQnlOYW1lKG5hbWUpO1xuICAgICAgfVxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBlbnN1cmVVbmlxdWVFbGVtZW50TmFtZShcbiAgICBlbGVtZW50OiBJU3VydmV5RWxlbWVudCxcbiAgICBnZXRFbGVtZW50QnlOYW1lOiAobmFtZTogc3RyaW5nKSA9PiBJU3VydmV5RWxlbWVudFxuICApIHtcbiAgICB2YXIgZXhpc3RpbmdFbGVtZW50ID0gZ2V0RWxlbWVudEJ5TmFtZShlbGVtZW50Lm5hbWUpO1xuICAgIGlmICghZXhpc3RpbmdFbGVtZW50IHx8IGV4aXN0aW5nRWxlbWVudCA9PSBlbGVtZW50KSByZXR1cm47XG4gICAgdmFyIG5ld05hbWUgPSB0aGlzLmdldE5ld05hbWUoZWxlbWVudC5uYW1lKTtcbiAgICB3aGlsZSAoISFnZXRFbGVtZW50QnlOYW1lKG5ld05hbWUpKSB7XG4gICAgICB2YXIgbmV3TmFtZSA9IHRoaXMuZ2V0TmV3TmFtZShlbGVtZW50Lm5hbWUpO1xuICAgIH1cbiAgICBlbGVtZW50Lm5hbWUgPSBuZXdOYW1lO1xuICB9XG4gIHByaXZhdGUgZ2V0TmV3TmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHZhciBwb3MgPSBuYW1lLmxlbmd0aDtcbiAgICB3aGlsZSAocG9zID4gMCAmJiBuYW1lW3BvcyAtIDFdID49IFwiMFwiICYmIG5hbWVbcG9zIC0gMV0gPD0gXCI5XCIpIHtcbiAgICAgIHBvcy0tO1xuICAgIH1cbiAgICB2YXIgYmFzZSA9IG5hbWUuc3Vic3RyKDAsIHBvcyk7XG4gICAgdmFyIG51bSA9IDA7XG4gICAgaWYgKHBvcyA8IG5hbWUubGVuZ3RoKSB7XG4gICAgICBudW0gPSBwYXJzZUludChuYW1lLnN1YnN0cihwb3MpKTtcbiAgICB9XG4gICAgbnVtKys7XG4gICAgcmV0dXJuIGJhc2UgKyBudW07XG4gIH1cbiAgcHJpdmF0ZSBjaGVja0lzQ3VycmVudFBhZ2VIYXNFcnJvcnMoXG4gICAgaXNGb2N1c2VPbkZpcnN0RXJyb3I6IGJvb2xlYW4gPSB1bmRlZmluZWRcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tJc1BhZ2VIYXNFcnJvcnModGhpcy5hY3RpdmVQYWdlLCBpc0ZvY3VzZU9uRmlyc3RFcnJvcik7XG4gIH1cbiAgcHJpdmF0ZSBjaGVja0lzUGFnZUhhc0Vycm9ycyhcbiAgICBwYWdlOiBQYWdlTW9kZWwsXG4gICAgaXNGb2N1c2VPbkZpcnN0RXJyb3I6IGJvb2xlYW4gPSB1bmRlZmluZWRcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKGlzRm9jdXNlT25GaXJzdEVycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlzRm9jdXNlT25GaXJzdEVycm9yID0gdGhpcy5mb2N1c09uRmlyc3RFcnJvcjtcbiAgICB9XG4gICAgaWYgKCFwYWdlKSByZXR1cm4gdHJ1ZTtcbiAgICB2YXIgcmVzID0gcGFnZS5oYXNFcnJvcnModHJ1ZSwgaXNGb2N1c2VPbkZpcnN0RXJyb3IpO1xuICAgIHRoaXMuZmlyZVZhbGlkYXRlZEVycm9yc09uUGFnZShwYWdlKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgZmlyZVZhbGlkYXRlZEVycm9yc09uUGFnZShwYWdlOiBQYWdlTW9kZWwpIHtcbiAgICBpZiAodGhpcy5vblZhbGlkYXRlZEVycm9yc09uQ3VycmVudFBhZ2UuaXNFbXB0eSB8fCAhcGFnZSkgcmV0dXJuO1xuICAgIHZhciBxdWVzdGlvbnNPblBhZ2UgPSBwYWdlLnF1ZXN0aW9ucztcbiAgICB2YXIgcXVlc3Rpb25zID0gbmV3IEFycmF5PFF1ZXN0aW9uPigpO1xuICAgIHZhciBlcnJvcnMgPSBuZXcgQXJyYXk8U3VydmV5RXJyb3I+KCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnNPblBhZ2UubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxID0gcXVlc3Rpb25zT25QYWdlW2ldO1xuICAgICAgaWYgKHEuZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcXVlc3Rpb25zLnB1c2gocSk7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcS5lcnJvcnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICBlcnJvcnMucHVzaChxLmVycm9yc1tqXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5vblZhbGlkYXRlZEVycm9yc09uQ3VycmVudFBhZ2UuZmlyZSh0aGlzLCB7XG4gICAgICBxdWVzdGlvbnM6IHF1ZXN0aW9ucyxcbiAgICAgIGVycm9yczogZXJyb3JzLFxuICAgICAgcGFnZTogcGFnZSxcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogTmF2aWdhdGVzIHVzZXIgdG8gYSBwcmV2aW91cyBwYWdlLiBJZiB0aGUgY3VycmVudCBwYWdlIGlzIHRoZSBmaXJzdCBwYWdlLCBgcHJldlBhZ2VgIHJldHVybnMgYGZhbHNlYC4gYHByZXZQYWdlYCBkb2VzIG5vdCBwZXJmb3JtIGFueSBjaGVja3MsIHJlcXVpcmVkIHF1ZXN0aW9ucyBjYW4gYmUgZW1wdHkuXG4gICAqIEBzZWUgaXNGaXJzdFBhZ2VcbiAgICovXG4gIHB1YmxpYyBwcmV2UGFnZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc0ZpcnN0UGFnZSkgcmV0dXJuIGZhbHNlO1xuICAgIHRoaXMucmVzZXROYXZpZ2F0aW9uQnV0dG9uKCk7XG4gICAgdmFyIHZQYWdlcyA9IHRoaXMudmlzaWJsZVBhZ2VzO1xuICAgIHZhciBpbmRleCA9IHZQYWdlcy5pbmRleE9mKHRoaXMuY3VycmVudFBhZ2UpO1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSB2UGFnZXNbaW5kZXggLSAxXTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogQ29tcGxldGVzIHRoZSBzdXJ2ZXksIGlmIHRoZSBjdXJyZW50IHBhZ2UgaXMgdGhlIGxhc3Qgb25lLiBJdCByZXR1cm5zIGBmYWxzZWAgaWYgdGhlIGxhc3QgcGFnZSBoYXMgZXJyb3JzLlxuICAgKiBJZiB0aGUgbGFzdCBwYWdlIGhhcyBubyBlcnJvcnMsIGBjb21wbGV0ZUxhc3RQYWdlYCBjYWxscyBgZG9Db21wbGV0ZWAgYW5kIHJldHVybnMgYHRydWVgLlxuICAgKiBAc2VlIGlzQ3VycmVudFBhZ2VIYXNFcnJvcnNcbiAgICogQHNlZSBuZXh0UGFnZVxuICAgKiBAc2VlIGRvQ29tcGxldGVcbiAgICovXG4gIHB1YmxpYyBjb21wbGV0ZUxhc3RQYWdlKCk6IGJvb2xlYW4ge1xuICAgIHZhciByZXMgPSB0aGlzLmRvQ3VycmVudFBhZ2VDb21wbGV0ZSh0cnVlKTtcbiAgICBpZiAocmVzKSB7XG4gICAgICB0aGlzLmNhbmNlbFByZXZpZXcoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIGlzTmF2aWdhdGlvbkJ1dHRvblByZXNzZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIG5hdmlnYXRpb25Nb3VzZURvd24oKTogYm9vbGVhbiB7XG4gICAgdGhpcy5pc05hdmlnYXRpb25CdXR0b25QcmVzc2VkID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcml2YXRlIHJlc2V0TmF2aWdhdGlvbkJ1dHRvbigpIHtcbiAgICB0aGlzLmlzTmF2aWdhdGlvbkJ1dHRvblByZXNzZWQgPSBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogU2hvd3MgcHJldmlldyBmb3IgdGhlIHN1cnZleS4gU3dpdGNoZXMgdGhlIHN1cnZleSB0byB0aGUgXCJwcmV2aWV3XCIgc3RhdGUuXG4gICAqXG4gICAqIERldGFpbHM6IFtQcmV2aWV3IFN0YXRlXShodHRwczovL3N1cnZleWpzLmlvL0RvY3VtZW50YXRpb24vTGlicmFyeSNzdGF0ZXMtcHJldmlldylcbiAgICogQHNlZSBzaG93UHJldmlld0JlZm9yZUNvbXBsZXRlXG4gICAqIEBzZWUgY2FuY2VsUHJldmlld1xuICAgKiBAc2VlIHN0YXRlXG4gICAqIEBzZWUgcHJldmlld1RleHRcbiAgICogQHNlZSBlZGl0VGV4dFxuICAgKi9cbiAgcHVibGljIHNob3dQcmV2aWV3KCk6IGJvb2xlYW4ge1xuICAgIHRoaXMucmVzZXROYXZpZ2F0aW9uQnV0dG9uKCk7XG4gICAgaWYgKHRoaXMuaGFzRXJyb3JzT25OYXZpZ2F0ZSh0cnVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLmRvU2VydmVyVmFsaWRhdGlvbih0cnVlLCB0cnVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBvcHRpb25zID0geyBhbGxvd1Nob3dQcmV2aWV3OiB0cnVlIH07XG4gICAgdGhpcy5vblNob3dpbmdQcmV2aWV3LmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgdGhpcy5pc1Nob3dpbmdQcmV2aWV3ID0gb3B0aW9ucy5hbGxvd1Nob3dQcmV2aWV3O1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBDYW5jZWxzIHByZXZpZXcgYW5kIHN3aXRjaGVzIGJhY2sgdG8gdGhlIFwicnVubmluZ1wiIHN0YXRlLlxuICAgKlxuICAgKiBEZXRhaWxzOiBbUHJldmlldyBTdGF0ZV0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9Eb2N1bWVudGF0aW9uL0xpYnJhcnkjc3RhdGVzLXByZXZpZXcpXG4gICAqIEBwYXJhbSBjdXJQYWdlIC0gQSBuZXcgY3VycmVudCBwYWdlLiBJZiB0aGUgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCB0aGVuIHRoZSBsYXN0IHBhZ2UgYmVjb21lcyB0aGUgY3VycmVudC5cbiAgICogQHNlZSBzaG93UHJldmlld0JlZm9yZUNvbXBsZXRlXG4gICAqIEBzZWUgc2hvd1ByZXZpZXdcbiAgICogQHNlZSBzdGF0ZVxuICAgKi9cbiAgcHVibGljIGNhbmNlbFByZXZpZXcoY3VyUGFnZTogYW55ID0gbnVsbCkge1xuICAgIGlmICghdGhpcy5pc1Nob3dpbmdQcmV2aWV3KSByZXR1cm47XG4gICAgdGhpcy5pc1Nob3dpbmdQcmV2aWV3ID0gZmFsc2U7XG4gICAgaWYgKEhlbHBlcnMuaXNWYWx1ZUVtcHR5KGN1clBhZ2UpICYmIHRoaXMudmlzaWJsZVBhZ2VDb3VudCA+IDApIHtcbiAgICAgIGN1clBhZ2UgPSB0aGlzLnZpc2libGVQYWdlQ291bnQgLSAxO1xuICAgIH1cbiAgICBpZiAoY3VyUGFnZSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IGN1clBhZ2U7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBjYW5jZWxQcmV2aWV3QnlQYWdlKHBhbmVsOiBJUGFuZWwpOiBhbnkge1xuICAgIHRoaXMuY2FuY2VsUHJldmlldygoPGFueT5wYW5lbClbXCJvcmlnaW5hbFBhZ2VcIl0pO1xuICB9XG4gIHByb3RlY3RlZCBkb0N1cnJlbnRQYWdlQ29tcGxldGUoZG9Db21wbGV0ZTogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzVmFsaWRhdGluZ09uU2VydmVyKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5yZXNldE5hdmlnYXRpb25CdXR0b24oKTtcbiAgICBpZiAodGhpcy5oYXNFcnJvcnNPbk5hdmlnYXRlKGRvQ29tcGxldGUpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuZG9DdXJyZW50UGFnZUNvbXBsZXRlQ29yZShkb0NvbXBsZXRlKTtcbiAgfVxuICBwcml2YXRlIGRvQ3VycmVudFBhZ2VDb21wbGV0ZUNvcmUoZG9Db21wbGV0ZTogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmRvU2VydmVyVmFsaWRhdGlvbihkb0NvbXBsZXRlKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChkb0NvbXBsZXRlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlLnBhc3NlZCA9IHRydWU7XG4gICAgICByZXR1cm4gdGhpcy5kb0NvbXBsZXRlKCk7XG4gICAgfVxuICAgIHRoaXMuZG9OZXh0UGFnZSgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBPYnNvbGV0ZS4gVXNlIHRoZSBgcXVlc3Rpb25zT25QYWdlTW9kZWAgcHJvcGVydHkgaW5zdGVhZC5cbiAgICogQHNlZSBxdWVzdGlvbnNPblBhZ2VNb2RlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzU2luZ2xlUGFnZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbnNPblBhZ2VNb2RlID09IFwic2luZ2xlUGFnZVwiO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNTaW5nbGVQYWdlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMucXVlc3Rpb25zT25QYWdlTW9kZSA9IHZhbCA/IFwic2luZ2xlUGFnZVwiIDogXCJzdGFuZGFyZFwiO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgYSB2YWx1ZSB0aGF0IHNwZWNpZmllcyBob3cgdGhlIHN1cnZleSBjb21iaW5lcyBxdWVzdGlvbnMsIHBhbmVscywgYW5kIHBhZ2VzLlxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZTpcbiAgICpcbiAgICogLSBgc2luZ2xlUGFnZWAgLSBjb21iaW5lIGFsbCBzdXJ2ZXkgcGFnZXMgaW4gYSBzaW5nbGUgcGFnZS4gUGFnZXMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gcGFuZWxzLlxuICAgKiAtIGBxdWVzdGlvblBlclBhZ2VgIC0gc2hvdyBvbmUgcXVlc3Rpb24gcGVyIHBhZ2UuIFN1cnZleSB3aWxsIGNyZWF0ZSBhIHNlcGFyYXRlIHBhZ2UgZm9yIGV2ZXJ5IHF1ZXN0aW9uLlxuICAgKi9cbiAgcHVibGljIGdldCBxdWVzdGlvbnNPblBhZ2VNb2RlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uc09uUGFnZU1vZGVcIik7XG4gIH1cbiAgcHVibGljIHNldCBxdWVzdGlvbnNPblBhZ2VNb2RlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25zT25QYWdlTW9kZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgd2hldGhlciB0aGUgZmlyc3Qgc3VydmV5IHBhZ2UgaXMgYSBzdGFydCBwYWdlLiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBgdHJ1ZWAsIHRvIG1ha2UgdGhlIGZpcnN0IHBhZ2UgYSBzdGFydGluZyBwYWdlLlxuICAgKiBBbiBlbmQgdXNlciBjYW5ub3QgbmF2aWdhdGUgdG8gdGhlIHN0YXJ0IHBhZ2UgYW5kIHRoZSBzdGFydCBwYWdlIGRvZXMgbm90IGFmZmVjdCBhIHN1cnZleSBwcm9ncmVzcy5cbiAgICovXG4gIHB1YmxpYyBnZXQgZmlyc3RQYWdlSXNTdGFydGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJmaXJzdFBhZ2VJc1N0YXJ0ZWRcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgZmlyc3RQYWdlSXNTdGFydGVkKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImZpcnN0UGFnZUlzU3RhcnRlZFwiLCB2YWwpO1xuICB9XG4gIGlzUGFnZVN0YXJ0ZWQocGFnZTogSVBhZ2UpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5maXJzdFBhZ2VJc1N0YXJ0ZWQgJiYgdGhpcy5wYWdlcy5sZW5ndGggPiAwICYmIHRoaXMucGFnZXNbMF0gPT09IHBhZ2VcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBcInNob3dBbGxRdWVzdGlvbnNcIiBvciBcInNob3dBbnN3ZXJlZFF1ZXN0aW9uc1wiIHRvIGFsbG93IHJlc3BvbmRlbnRzIHRvIHByZXZpZXcgYW5zd2VycyBiZWZvcmUgc3VibWl0dGluZyB0aGUgc3VydmV5IHJlc3VsdHMuXG4gICAqXG4gICAqIERldGFpbHM6IFtQcmV2aWV3IFN0YXRlXShodHRwczovL3N1cnZleWpzLmlvL0RvY3VtZW50YXRpb24vTGlicmFyeSNzdGF0ZXMtcHJldmlldylcbiAgICogRXhhbXBsZTogW1Nob3cgUHJldmlldyBCZWZvcmUgQ29tcGxldGVdKGh0dHBzOi8vc3VydmV5anMuaW8vRXhhbXBsZXMvTGlicmFyeT9pZD1zdXJ2ZXktc2hvd3ByZXZpZXcpXG4gICAqIEBzZWUgc2hvd1ByZXZpZXdcbiAgICogQHNlZSBjYW5jZWxQcmV2aWV3XG4gICAqIEBzZWUgc3RhdGVcbiAgICogQHNlZSBwcmV2aWV3VGV4dFxuICAgKiBAc2VlIGVkaXRUZXh0XG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dQcmV2aWV3QmVmb3JlQ29tcGxldGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1ByZXZpZXdCZWZvcmVDb21wbGV0ZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dQcmV2aWV3QmVmb3JlQ29tcGxldGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93UHJldmlld0JlZm9yZUNvbXBsZXRlXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBpc1Nob3dQcmV2aWV3QmVmb3JlQ29tcGxldGUoKTogYm9vbGVhbiB7XG4gICAgdmFyIHByZXZpZXcgPSB0aGlzLnNob3dQcmV2aWV3QmVmb3JlQ29tcGxldGU7XG4gICAgcmV0dXJuIHByZXZpZXcgPT0gXCJzaG93QWxsUXVlc3Rpb25zXCIgfHwgcHJldmlldyA9PSBcInNob3dBbnN3ZXJlZFF1ZXN0aW9uc1wiO1xuICB9XG4gIHByb3RlY3RlZCBvbkZpcnN0UGFnZUlzU3RhcnRlZENoYW5nZWQoKSB7XG4gICAgaWYgKHRoaXMucGFnZXMubGVuZ3RoID09IDApIHJldHVybjtcbiAgICB0aGlzLmlzU3RhcnRlZFN0YXRlID0gdGhpcy5maXJzdFBhZ2VJc1N0YXJ0ZWQ7XG4gICAgdGhpcy5wYWdlVmlzaWJpbGl0eUNoYW5nZWQodGhpcy5wYWdlc1swXSwgIXRoaXMuZmlyc3RQYWdlSXNTdGFydGVkKTtcbiAgfVxuICBwcml2YXRlIHJ1bm5pbmdQYWdlczogYW55O1xuICBwcml2YXRlIG9uU2hvd2luZ1ByZXZpZXdDaGFuZ2VkKCkge1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmlzU2hvd2luZ1ByZXZpZXcpIHtcbiAgICAgIHRoaXMucnVubmluZ1BhZ2VzID0gdGhpcy5wYWdlcy5zbGljZSgwLCB0aGlzLnBhZ2VzLmxlbmd0aCk7XG4gICAgICB0aGlzLnNldHVwUGFnZXNGb3JQYWdlTW9kZXModHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnJ1bm5pbmdQYWdlcykge1xuICAgICAgICB0aGlzLnJlc3RvcmVPcmlnaW9uYWxQYWdlcyh0aGlzLnJ1bm5pbmdQYWdlcyk7XG4gICAgICB9XG4gICAgICB0aGlzLnJ1bm5pbmdQYWdlcyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdGhpcy5ydW5Db25kaXRpb25zKCk7XG4gICAgdGhpcy51cGRhdGVBbGxFbGVtZW50c1Zpc2liaWxpdHkodGhpcy5wYWdlcyk7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICAgIHRoaXMuY3VycmVudFBhZ2VObyA9IDA7XG4gIH1cbiAgcHJpdmF0ZSBvcmlnaW9uYWxQYWdlczogYW55O1xuICBwcm90ZWN0ZWQgb25RdWVzdGlvbnNPblBhZ2VNb2RlQ2hhbmdlZChvbGRWYWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuaXNTaG93aW5nUHJldmlldykgcmV0dXJuO1xuICAgIGlmICh0aGlzLnF1ZXN0aW9uc09uUGFnZU1vZGUgPT0gXCJzdGFuZGFyZFwiIHx8IHRoaXMuaXNEZXNpZ25Nb2RlKSB7XG4gICAgICBpZiAodGhpcy5vcmlnaW9uYWxQYWdlcykge1xuICAgICAgICB0aGlzLnJlc3RvcmVPcmlnaW9uYWxQYWdlcyh0aGlzLm9yaWdpb25hbFBhZ2VzKTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3JpZ2lvbmFsUGFnZXMgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghb2xkVmFsdWUgfHwgb2xkVmFsdWUgPT0gXCJzdGFuZGFyZFwiKSB7XG4gICAgICAgIHRoaXMub3JpZ2lvbmFsUGFnZXMgPSB0aGlzLnBhZ2VzLnNsaWNlKDAsIHRoaXMucGFnZXMubGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0dXBQYWdlc0ZvclBhZ2VNb2Rlcyh0aGlzLmlzU2luZ2xlUGFnZSk7XG4gICAgfVxuICAgIHRoaXMucnVuQ29uZGl0aW9ucygpO1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgfVxuICBwcml2YXRlIHJlc3RvcmVPcmlnaW9uYWxQYWdlcyhvcmlnaW5hbFBhZ2VzOiBBcnJheTxQYWdlTW9kZWw+KSB7XG4gICAgdGhpcy5xdWVzdGlvbkhhc2hlc0NsZWFyKCk7XG4gICAgdGhpcy5wYWdlcy5zcGxpY2UoMCwgdGhpcy5wYWdlcy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3JpZ2luYWxQYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYWdlcy5wdXNoKG9yaWdpbmFsUGFnZXNbaV0pO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHNldHVwUGFnZXNGb3JQYWdlTW9kZXMoaXNTaW5nbGVQYWdlOiBib29sZWFuKSB7XG4gICAgdGhpcy5xdWVzdGlvbkhhc2hlc0NsZWFyKCk7XG4gICAgdmFyIHN0YXJ0SW5kZXggPSB0aGlzLmZpcnN0UGFnZUlzU3RhcnRlZCA/IDEgOiAwO1xuICAgIHN1cGVyLnN0YXJ0TG9hZGluZ0Zyb21Kc29uKCk7XG4gICAgdmFyIG5ld1BhZ2VzID0gdGhpcy5jcmVhdGVQYWdlc0ZvclF1ZXN0aW9uT25QYWdlTW9kZShcbiAgICAgIGlzU2luZ2xlUGFnZSxcbiAgICAgIHN0YXJ0SW5kZXhcbiAgICApO1xuICAgIHZhciBkZWxldGVkTGVuID0gdGhpcy5wYWdlcy5sZW5ndGggLSBzdGFydEluZGV4O1xuICAgIHRoaXMucGFnZXMuc3BsaWNlKHN0YXJ0SW5kZXgsIGRlbGV0ZWRMZW4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3UGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucGFnZXMucHVzaChuZXdQYWdlc1tpXSk7XG4gICAgfVxuICAgIHN1cGVyLmVuZExvYWRpbmdGcm9tSnNvbigpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3UGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG5ld1BhZ2VzW2ldLmVuZExvYWRpbmdGcm9tSnNvbigpO1xuICAgICAgbmV3UGFnZXNbaV0uc2V0U3VydmV5SW1wbCh0aGlzKTtcbiAgICB9XG4gICAgdGhpcy5kb0VsZW1lbnRzT25Mb2FkKCk7XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVQYWdlc0ZvclF1ZXN0aW9uT25QYWdlTW9kZShcbiAgICBpc1NpbmdsZVBhZ2U6IGJvb2xlYW4sXG4gICAgc3RhcnRJbmRleDogbnVtYmVyXG4gICk6IEFycmF5PFBhZ2VNb2RlbD4ge1xuICAgIGlmIChpc1NpbmdsZVBhZ2UpIHtcbiAgICAgIHJldHVybiBbdGhpcy5jcmVhdGVTaW5nbGVQYWdlKHN0YXJ0SW5kZXgpXTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlUGFnZXNGb3JFdmVyeVF1ZXN0aW9uKHN0YXJ0SW5kZXgpO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlU2luZ2xlUGFnZShzdGFydEluZGV4OiBudW1iZXIpOiBQYWdlTW9kZWwge1xuICAgIHZhciBzaW5nbGUgPSB0aGlzLmNyZWF0ZU5ld1BhZ2UoXCJhbGxcIik7XG4gICAgc2luZ2xlLnNldFN1cnZleUltcGwodGhpcyk7XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0SW5kZXg7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcGFnZSA9IHRoaXMucGFnZXNbaV07XG4gICAgICB2YXIgcGFuZWwgPSBTZXJpYWxpemVyLmNyZWF0ZUNsYXNzKFwicGFuZWxcIik7XG4gICAgICBwYW5lbC5vcmlnaW5hbFBhZ2UgPSBwYWdlO1xuICAgICAgc2luZ2xlLmFkZFBhbmVsKHBhbmVsKTtcbiAgICAgIHZhciBqc29uID0gbmV3IEpzb25PYmplY3QoKS50b0pzb25PYmplY3QocGFnZSk7XG4gICAgICBuZXcgSnNvbk9iamVjdCgpLnRvT2JqZWN0KGpzb24sIHBhbmVsKTtcbiAgICAgIGlmICghdGhpcy5zaG93UGFnZVRpdGxlcykge1xuICAgICAgICBwYW5lbC50aXRsZSA9IFwiXCI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzaW5nbGU7XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVQYWdlc0ZvckV2ZXJ5UXVlc3Rpb24oc3RhcnRJbmRleDogbnVtYmVyKTogQXJyYXk8UGFnZU1vZGVsPiB7XG4gICAgdmFyIHJlczogQXJyYXk8UGFnZU1vZGVsPiA9IFtdO1xuICAgIGZvciAodmFyIGkgPSBzdGFydEluZGV4OyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG9yaWdpbmFsUGFnZSA9IHRoaXMucGFnZXNbaV07XG4gICAgICAvLyBJbml0aWFsaXplIHJhbmRvbWl6YXRpb25cbiAgICAgIG9yaWdpbmFsUGFnZS5zZXRXYXNTaG93bih0cnVlKTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgb3JpZ2luYWxQYWdlLmVsZW1lbnRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBvcmlnaW5hbEVsZW1lbnQgPSBvcmlnaW5hbFBhZ2UuZWxlbWVudHNbal07XG4gICAgICAgIHZhciBlbGVtZW50ID0gU2VyaWFsaXplci5jcmVhdGVDbGFzcyhvcmlnaW5hbEVsZW1lbnQuZ2V0VHlwZSgpKTtcbiAgICAgICAgaWYgKCFlbGVtZW50KSBjb250aW51ZTtcbiAgICAgICAgdmFyIGpzb25PYmogPSBuZXcgSnNvbk9iamVjdCgpO1xuICAgICAgICAvL0Rlc2VyaWFsaXplIHBhZ2UgcHJvcGVydGllcyBvbmx5LCBleGNsdWRpbmcgZWxlbWVudHNcbiAgICAgICAganNvbk9iai5saWdodFNlcmlhbGl6aW5nID0gdHJ1ZTtcbiAgICAgICAgdmFyIHBhZ2VKc29uID0ganNvbk9iai50b0pzb25PYmplY3Qob3JpZ2luYWxQYWdlKTtcblxuICAgICAgICB2YXIgcGFnZSA9IDxQYWdlTW9kZWw+U2VyaWFsaXplci5jcmVhdGVDbGFzcyhvcmlnaW5hbFBhZ2UuZ2V0VHlwZSgpKTtcbiAgICAgICAgcGFnZS5mcm9tSlNPTihwYWdlSnNvbik7XG4gICAgICAgIHBhZ2UubmFtZSA9IFwicGFnZVwiICsgKHJlcy5sZW5ndGggKyAxKTtcbiAgICAgICAgcGFnZS5zZXRTdXJ2ZXlJbXBsKHRoaXMpO1xuICAgICAgICByZXMucHVzaChwYWdlKTtcbiAgICAgICAgdmFyIGpzb24gPSBuZXcgSnNvbk9iamVjdCgpLnRvSnNvbk9iamVjdChvcmlnaW5hbEVsZW1lbnQpO1xuICAgICAgICBuZXcgSnNvbk9iamVjdCgpLnRvT2JqZWN0KGpzb24sIGVsZW1lbnQpO1xuICAgICAgICBwYWdlLmFkZEVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgcGFnZS5xdWVzdGlvbnMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzQWRkZWQocGFnZS5xdWVzdGlvbnNba10pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgd2hldGhlciB0aGUgY3VycmVudCBwYWdlIGlzIHRoZSBmaXJzdCBvbmUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzRmlyc3RQYWdlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlID09IG51bGwpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiB0aGlzLnZpc2libGVQYWdlcy5pbmRleE9mKHRoaXMuY3VycmVudFBhZ2UpID09IDA7XG4gIH1cbiAgcHVibGljIGdldCBpc1Nob3dQcmV2QnV0dG9uKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzRmlyc3RQYWdlIHx8ICF0aGlzLnNob3dQcmV2QnV0dG9uKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHBhZ2UgPSB0aGlzLnZpc2libGVQYWdlc1t0aGlzLmN1cnJlbnRQYWdlTm8gLSAxXTtcbiAgICByZXR1cm4gdGhpcy5nZXRQYWdlTWF4VGltZVRvRmluaXNoKHBhZ2UpIDw9IDA7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgd2hldGhlciB0aGUgY3VycmVudCBwYWdlIGlzIHRoZSBsYXN0IG9uZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNMYXN0UGFnZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZSA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgICB2YXIgdlBhZ2VzID0gdGhpcy52aXNpYmxlUGFnZXM7XG4gICAgcmV0dXJuIHZQYWdlcy5pbmRleE9mKHRoaXMuY3VycmVudFBhZ2UpID09IHZQYWdlcy5sZW5ndGggLSAxO1xuICB9XG4gIC8qKlxuICAgKiBDb21wbGV0ZXMgdGhlIHN1cnZleS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgdGFza3M6XG4gICAqXG4gICAqIC0gd3JpdGVzIGNvb2tpZSBpZiB0aGUgYGNvb2tpZU5hbWVgIHByb3BlcnR5IGlzIG5vdCBlbXB0eVxuICAgKiAtIHNldHMgdGhlIHN1cnZleSBpbnRvIGBjb21wbGV0ZWRgIHN0YXRlXG4gICAqIC0gZmlyZXMgdGhlIGBvbkNvbXBsZXRlYCBldmVudFxuICAgKiAtIGNhbGxzIGBzZW5kUmVzdWx0YCBmdW5jdGlvbi5cbiAgICpcbiAgICogQ2FsbGluZyB0aGUgYGRvQ29tcGxldGVgIGZ1bmN0aW9uIGRvZXMgbm90IHBlcmZvcm0gYW55IHZhbGlkYXRpb24sIHVubGlrZSB0aGUgYGNvbXBsZXRlTGFzdFBhZ2VgIGZ1bmN0aW9uLlxuICAgKiBUaGUgZnVuY3Rpb24gY2FuIHJldHVybiBmYWxzZSwgaWYgeW91IHNldCBvcHRpb25zLmFsbG93Q29tcGxldGUgdG8gZmFsc2UgaW4gb25Db21wbGV0aW5nIGV2ZW50LiBPdGhlcndpc2UgaXQgcmV0dXJucyB0cnVlLlxuICAgKiBJdCBjYWxscyBgbmF2aWdhdGVUb1VybGAgYWZ0ZXIgY2FsbGluZyBgb25Db21wbGV0ZWAgZXZlbnQuXG4gICAqIEluIGNhc2UgY2FsbGluZyBgb3B0aW9ucy5zaG93RGF0YVNhdmluZ2AgY2FsbGJhY2sgaW4gdGhlIGBvbkNvbXBsZXRlYCBldmVudCwgYG5hdmlnYXRlVG9VcmxgIGlzIHVzZWQgb24gY2FsbGluZyBgb3B0aW9ucy5zaG93RGF0YVNhdmluZ1N1Y2Nlc3NgIGNhbGxiYWNrLlxuICAgKiBAc2VlIGNvbXBsZXRlTGFzdFBhZ2VcbiAgICogQHNlZSBvbkNvbXBsZXRpbmdcbiAgICogQHNlZSBjb29raWVOYW1lXG4gICAqIEBzZWUgc3RhdGVcbiAgICogQHNlZSBvbkNvbXBsZXRlXG4gICAqIEBzZWUgc3VydmV5UG9zdElkXG4gICAqIEBzZWUgY29tcGxldGVMYXN0UGFnZVxuICAgKiBAc2VlIG5hdmlnYXRlVG9VcmxcbiAgICogQHNlZSBuYXZpZ2F0ZVRvVXJsT25Db25kaXRpb25cbiAgICovXG4gIHB1YmxpYyBkb0NvbXBsZXRlKGlzQ29tcGxldGVPblRyaWdnZXI6IGJvb2xlYW4gPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgIHZhciBvbkNvbXBsZXRpbmdPcHRpb25zID0ge1xuICAgICAgYWxsb3dDb21wbGV0ZTogdHJ1ZSxcbiAgICAgIGlzQ29tcGxldGVPblRyaWdnZXI6IGlzQ29tcGxldGVPblRyaWdnZXIsXG4gICAgfTtcbiAgICB0aGlzLm9uQ29tcGxldGluZy5maXJlKHRoaXMsIG9uQ29tcGxldGluZ09wdGlvbnMpO1xuICAgIGlmICghb25Db21wbGV0aW5nT3B0aW9ucy5hbGxvd0NvbXBsZXRlKSB7XG4gICAgICB0aGlzLmlzQ29tcGxldGVkID0gZmFsc2U7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGxldCBwcmV2aW91c0Nvb2tpZSA9IHRoaXMuaGFzQ29va2llO1xuICAgIHRoaXMuc3RvcFRpbWVyKCk7XG4gICAgdGhpcy5zZXRDb21wbGV0ZWQoKTtcbiAgICB0aGlzLmNsZWFyVW51c2VkVmFsdWVzKCk7XG4gICAgdGhpcy5zZXRDb29raWUoKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHNhdmluZ0RhdGFTdGFydGVkID0gZmFsc2U7XG4gICAgdmFyIG9uQ29tcGxldGVPcHRpb25zID0ge1xuICAgICAgaXNDb21wbGV0ZU9uVHJpZ2dlcjogaXNDb21wbGV0ZU9uVHJpZ2dlcixcbiAgICAgIHNob3dEYXRhU2F2aW5nOiBmdW5jdGlvbiAodGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHNhdmluZ0RhdGFTdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgc2VsZi5zZXRDb21wbGV0ZWRTdGF0ZShcInNhdmluZ1wiLCB0ZXh0KTtcbiAgICAgIH0sXG4gICAgICBzaG93RGF0YVNhdmluZ0Vycm9yOiBmdW5jdGlvbiAodGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHNlbGYuc2V0Q29tcGxldGVkU3RhdGUoXCJlcnJvclwiLCB0ZXh0KTtcbiAgICAgIH0sXG4gICAgICBzaG93RGF0YVNhdmluZ1N1Y2Nlc3M6IGZ1bmN0aW9uICh0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgc2VsZi5zZXRDb21wbGV0ZWRTdGF0ZShcInN1Y2Nlc3NcIiwgdGV4dCk7XG4gICAgICAgIHNlbGYubmF2aWdhdGVUbygpO1xuICAgICAgfSxcbiAgICAgIHNob3dEYXRhU2F2aW5nQ2xlYXI6IGZ1bmN0aW9uICh0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgc2VsZi5zZXRDb21wbGV0ZWRTdGF0ZShcIlwiLCBcIlwiKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLm9uQ29tcGxldGUuZmlyZSh0aGlzLCBvbkNvbXBsZXRlT3B0aW9ucyk7XG4gICAgaWYgKCFwcmV2aW91c0Nvb2tpZSAmJiB0aGlzLnN1cnZleVBvc3RJZCkge1xuICAgICAgdGhpcy5zZW5kUmVzdWx0KCk7XG4gICAgfVxuICAgIGlmICghc2F2aW5nRGF0YVN0YXJ0ZWQpIHtcbiAgICAgIHRoaXMubmF2aWdhdGVUbygpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogU3RhcnRzIHRoZSBzdXJ2ZXkuIENoYW5nZXMgdGhlIHN1cnZleSBtb2RlIGZyb20gXCJzdGFydGluZ1wiIHRvIFwicnVubmluZ1wiLiBDYWxsIHRoaXMgZnVuY3Rpb24gaWYgeW91ciBzdXJ2ZXkgaGFzIGEgc3RhcnQgcGFnZSwgb3RoZXJ3aXNlIHRoaXMgZnVuY3Rpb24gZG9lcyBub3RoaW5nLlxuICAgKiBAc2VlIGZpcnN0UGFnZUlzU3RhcnRlZFxuICAgKi9cbiAgcHVibGljIHN0YXJ0KCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5maXJzdFBhZ2VJc1N0YXJ0ZWQpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodGhpcy5jaGVja0lzUGFnZUhhc0Vycm9ycyh0aGlzLnN0YXJ0ZWRQYWdlLCB0cnVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIHRoaXMuaXNTdGFydGVkU3RhdGUgPSBmYWxzZTtcbiAgICB0aGlzLnN0YXJ0VGltZXJGcm9tVUkoKTtcbiAgICB0aGlzLm9uU3RhcnRlZC5maXJlKHRoaXMsIHt9KTtcbiAgICBpZiAoISF0aGlzLmN1cnJlbnRQYWdlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlLmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIHdoZXRoZXIgdGhlIHF1ZXN0aW9uIHZhbHVlcyBvbiB0aGUgY3VycmVudCBwYWdlIGFyZSB2YWxpZGF0aW5nIG9uIHRoZSBzZXJ2ZXIgYXQgdGhlIGN1cnJlbnQgbW9tZW50LlxuICAgKiBAc2VlIG9uU2VydmVyVmFsaWRhdGVRdWVzdGlvbnNcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNWYWxpZGF0aW5nT25TZXJ2ZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlzVmFsaWRhdGluZ09uU2VydmVyXCIsIGZhbHNlKTtcbiAgfVxuICBwcml2YXRlIHNldElzVmFsaWRhdGluZ09uU2VydmVyKHZhbDogYm9vbGVhbikge1xuICAgIGlmICh2YWwgPT0gdGhpcy5pc1ZhbGlkYXRpbmdPblNlcnZlcikgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzVmFsaWRhdGluZ09uU2VydmVyXCIsIHZhbCk7XG4gICAgdGhpcy5vbklzVmFsaWRhdGluZ09uU2VydmVyQ2hhbmdlZCgpO1xuICB9XG4gIHByb3RlY3RlZCBvbklzVmFsaWRhdGluZ09uU2VydmVyQ2hhbmdlZCgpIHsgfVxuICBwcm90ZWN0ZWQgZG9TZXJ2ZXJWYWxpZGF0aW9uKFxuICAgIGRvQ29tcGxldGU6IGJvb2xlYW4sXG4gICAgaXNQcmV2aWV3OiBib29sZWFuID0gZmFsc2VcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMub25TZXJ2ZXJWYWxpZGF0ZVF1ZXN0aW9ucyB8fFxuICAgICAgdGhpcy5vblNlcnZlclZhbGlkYXRlUXVlc3Rpb25zLmlzRW1wdHlcbiAgICApXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFkb0NvbXBsZXRlICYmIHRoaXMuY2hlY2tFcnJvcnNNb2RlID09PSBcIm9uQ29tcGxldGVcIikgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIGRhdGE6IDx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+e30sXG4gICAgICBlcnJvcnM6IHt9LFxuICAgICAgc3VydmV5OiB0aGlzLFxuICAgICAgY29tcGxldGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi5jb21wbGV0ZVNlcnZlclZhbGlkYXRpb24ob3B0aW9ucywgaXNQcmV2aWV3KTtcbiAgICAgIH0sXG4gICAgfTtcbiAgICBpZiAoZG9Db21wbGV0ZSAmJiB0aGlzLmNoZWNrRXJyb3JzTW9kZSA9PT0gXCJvbkNvbXBsZXRlXCIpIHtcbiAgICAgIG9wdGlvbnMuZGF0YSA9IHRoaXMuZGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuYWN0aXZlUGFnZS5xdWVzdGlvbnM7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcXVlc3Rpb24gPSBxdWVzdGlvbnNbaV07XG4gICAgICAgIGlmICghcXVlc3Rpb24udmlzaWJsZSkgY29udGludWU7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUocXVlc3Rpb24uZ2V0VmFsdWVOYW1lKCkpO1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWx1ZUVtcHR5KHZhbHVlKSlcbiAgICAgICAgICBvcHRpb25zLmRhdGFbcXVlc3Rpb24uZ2V0VmFsdWVOYW1lKCldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc2V0SXNWYWxpZGF0aW5nT25TZXJ2ZXIodHJ1ZSk7XG5cbiAgICBpZiAodHlwZW9mIHRoaXMub25TZXJ2ZXJWYWxpZGF0ZVF1ZXN0aW9ucyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aGlzLm9uU2VydmVyVmFsaWRhdGVRdWVzdGlvbnModGhpcywgb3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25TZXJ2ZXJWYWxpZGF0ZVF1ZXN0aW9ucy5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByaXZhdGUgY29tcGxldGVTZXJ2ZXJWYWxpZGF0aW9uKG9wdGlvbnM6IGFueSwgaXNQcmV2aWV3OiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRJc1ZhbGlkYXRpbmdPblNlcnZlcihmYWxzZSk7XG4gICAgaWYgKCFvcHRpb25zICYmICFvcHRpb25zLnN1cnZleSkgcmV0dXJuO1xuICAgIHZhciBzZWxmID0gb3B0aW9ucy5zdXJ2ZXk7XG4gICAgdmFyIGhhc0Vycm9ycyA9IGZhbHNlO1xuICAgIGlmIChvcHRpb25zLmVycm9ycykge1xuICAgICAgdmFyIGhhc1RvRm9jdXMgPSB0aGlzLmZvY3VzT25GaXJzdEVycm9yO1xuICAgICAgZm9yICh2YXIgbmFtZSBpbiBvcHRpb25zLmVycm9ycykge1xuICAgICAgICB2YXIgcXVlc3Rpb24gPSBzZWxmLmdldFF1ZXN0aW9uQnlOYW1lKG5hbWUpO1xuICAgICAgICBpZiAocXVlc3Rpb24gJiYgcXVlc3Rpb25bXCJlcnJvcnNcIl0pIHtcbiAgICAgICAgICBoYXNFcnJvcnMgPSB0cnVlO1xuICAgICAgICAgIHF1ZXN0aW9uLmFkZEVycm9yKG5ldyBDdXN0b21FcnJvcihvcHRpb25zLmVycm9yc1tuYW1lXSwgdGhpcykpO1xuICAgICAgICAgIGlmIChoYXNUb0ZvY3VzKSB7XG4gICAgICAgICAgICBoYXNUb0ZvY3VzID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoISFxdWVzdGlvbi5wYWdlKSB7XG4gICAgICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSBxdWVzdGlvbi5wYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcXVlc3Rpb24uZm9jdXModHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmZpcmVWYWxpZGF0ZWRFcnJvcnNPblBhZ2UodGhpcy5jdXJyZW50UGFnZSk7XG4gICAgfVxuICAgIGlmICghaGFzRXJyb3JzKSB7XG4gICAgICBpZiAoaXNQcmV2aWV3KSB7XG4gICAgICAgIHRoaXMuaXNTaG93aW5nUHJldmlldyA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc2VsZi5pc0xhc3RQYWdlKSBzZWxmLmRvQ29tcGxldGUoKTtcbiAgICAgICAgZWxzZSBzZWxmLmRvTmV4dFBhZ2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGRvTmV4dFBhZ2UoKSB7XG4gICAgdmFyIGN1clBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlO1xuICAgIHRoaXMuY2hlY2tPblBhZ2VUcmlnZ2VycygpO1xuICAgIGlmICghdGhpcy5pc0NvbXBsZXRlZCkge1xuICAgICAgaWYgKHRoaXMuc2VuZFJlc3VsdE9uUGFnZU5leHQpIHtcbiAgICAgICAgdGhpcy5zZW5kUmVzdWx0KHRoaXMuc3VydmV5UG9zdElkLCB0aGlzLmNsaWVudElkLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChjdXJQYWdlID09PSB0aGlzLmN1cnJlbnRQYWdlKSB7XG4gICAgICAgIHZhciB2UGFnZXMgPSB0aGlzLnZpc2libGVQYWdlcztcbiAgICAgICAgdmFyIGluZGV4ID0gdlBhZ2VzLmluZGV4T2YodGhpcy5jdXJyZW50UGFnZSk7XG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSB2UGFnZXNbaW5kZXggKyAxXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kb0NvbXBsZXRlKHRydWUpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgc2V0Q29tcGxldGVkKCkge1xuICAgIHRoaXMuaXNDb21wbGV0ZWQgPSB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBIVE1MIGNvbnRlbnQgZm9yIHRoZSBjb21wbGV0ZSBwYWdlLlxuICAgKiBAc2VlIGNvbXBsZXRlZEh0bWxcbiAgICovXG4gIHB1YmxpYyBnZXQgcHJvY2Vzc2VkQ29tcGxldGVkSHRtbCgpOiBzdHJpbmcge1xuICAgIHZhciBodG1sID0gdGhpcy5yZW5kZXJlZENvbXBsZXRlZEh0bWw7XG4gICAgaWYgKGh0bWwpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NIdG1sKGh0bWwpO1xuICAgIH1cbiAgICByZXR1cm4gXCI8aDM+XCIgKyB0aGlzLmdldExvY1N0cmluZyhcImNvbXBsZXRpbmdTdXJ2ZXlcIikgKyBcIjwvaDM+XCI7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIEhUTUwgY29udGVudCwgdGhhdCBpcyBzaG93biB0byBhIHVzZXIgdGhhdCBoYWQgY29tcGxldGVkIHRoZSBzdXJ2ZXkgYmVmb3JlLlxuICAgKiBAc2VlIGNvbXBsZXRlZEh0bWxcbiAgICogQHNlZSBjb29raWVOYW1lXG4gICAqL1xuICBwdWJsaWMgZ2V0IHByb2Nlc3NlZENvbXBsZXRlZEJlZm9yZUh0bWwoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5jb21wbGV0ZWRCZWZvcmVIdG1sKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzSHRtbCh0aGlzLmNvbXBsZXRlZEJlZm9yZUh0bWwpO1xuICAgIH1cbiAgICByZXR1cm4gXCI8aDM+XCIgKyB0aGlzLmdldExvY1N0cmluZyhcImNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmVcIikgKyBcIjwvaDM+XCI7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIEhUTUwgY29udGVudCwgdGhhdCBpcyBzaG93cyB3aGVuIGEgc3VydmV5IGxvYWRzIHRoZSBzdXJ2ZXkgSlNPTi5cbiAgICovXG4gIHB1YmxpYyBnZXQgcHJvY2Vzc2VkTG9hZGluZ0h0bWwoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5sb2FkaW5nSHRtbCkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0h0bWwodGhpcy5sb2FkaW5nSHRtbCk7XG4gICAgfVxuICAgIHJldHVybiBcIjxoMz5cIiArIHRoaXMuZ2V0TG9jU3RyaW5nKFwibG9hZGluZ1N1cnZleVwiKSArIFwiPC9oMz5cIjtcbiAgfVxuICBwdWJsaWMgZ2V0UHJvZ3Jlc3NJbmZvKCk6IElQcm9ncmVzc0luZm8ge1xuICAgIHZhciBwYWdlcyA9IHRoaXMuaXNEZXNpZ25Nb2RlID8gdGhpcy5wYWdlcyA6IHRoaXMudmlzaWJsZVBhZ2VzO1xuICAgIHJldHVybiBTdXJ2ZXlFbGVtZW50LmdldFByb2dyZXNzSW5mb0J5RWxlbWVudHMocGFnZXMsIGZhbHNlKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGV4dCBmb3IgdGhlIGN1cnJlbnQgcHJvZ3Jlc3MuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHByb2dyZXNzVGV4dCgpOiBzdHJpbmcge1xuICAgIHZhciByZXMgPSB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJwcm9ncmVzc1RleHRcIiwgXCJcIik7XG4gICAgaWYgKCFyZXMpIHtcbiAgICAgIHRoaXMudXBkYXRlUHJvZ3Jlc3NUZXh0KCk7XG4gICAgICByZXMgPSB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJwcm9ncmVzc1RleHRcIiwgXCJcIik7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBpc0NhbGN1bGF0aW5nUHJvZ3Jlc3NUZXh0ID0gZmFsc2U7XG4gIHB1YmxpYyB1cGRhdGVQcm9ncmVzc1RleHQob25WYWx1ZUNoYW5nZWQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLmlzQ2FsY3VsYXRpbmdQcm9ncmVzc1RleHQpIHJldHVybjtcbiAgICBpZiAoXG4gICAgICBvblZhbHVlQ2hhbmdlZCAmJlxuICAgICAgdGhpcy5wcm9ncmVzc0JhclR5cGUgPT0gXCJwYWdlc1wiICYmXG4gICAgICB0aGlzLm9uUHJvZ3Jlc3NUZXh0LmlzRW1wdHlcbiAgICApXG4gICAgICByZXR1cm47XG4gICAgdGhpcy5pc0NhbGN1bGF0aW5nUHJvZ3Jlc3NUZXh0ID0gdHJ1ZTtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJwcm9ncmVzc1RleHRcIiwgdGhpcy5nZXRQcm9ncmVzc1RleHQoKSk7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicHJvZ3Jlc3NWYWx1ZVwiLCB0aGlzLmdldFByb2dyZXNzKCkpO1xuICAgIHRoaXMuaXNDYWxjdWxhdGluZ1Byb2dyZXNzVGV4dCA9IGZhbHNlO1xuICB9XG4gIHB1YmxpYyBnZXRQcm9ncmVzc1RleHQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuaXNEZXNpZ25Nb2RlICYmIHRoaXMuY3VycmVudFBhZ2UgPT0gbnVsbCkgcmV0dXJuIFwiXCI7XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICBxdWVzdGlvbkNvdW50OiAwLFxuICAgICAgYW5zd2VyZWRRdWVzdGlvbkNvdW50OiAwLFxuICAgICAgcmVxdWlyZWRRdWVzdGlvbkNvdW50OiAwLFxuICAgICAgcmVxdWlyZWRBbnN3ZXJlZFF1ZXN0aW9uQ291bnQ6IDAsXG4gICAgICB0ZXh0OiBcIlwiLFxuICAgIH07XG4gICAgdmFyIHR5cGUgPSB0aGlzLnByb2dyZXNzQmFyVHlwZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChcbiAgICAgIHR5cGUgPT09IFwicXVlc3Rpb25zXCIgfHxcbiAgICAgIHR5cGUgPT09IFwicmVxdWlyZWRxdWVzdGlvbnNcIiB8fFxuICAgICAgdHlwZSA9PT0gXCJjb3JyZWN0cXVlc3Rpb25zXCIgfHxcbiAgICAgICF0aGlzLm9uUHJvZ3Jlc3NUZXh0LmlzRW1wdHlcbiAgICApIHtcbiAgICAgIHZhciBpbmZvID0gdGhpcy5nZXRQcm9ncmVzc0luZm8oKTtcbiAgICAgIG9wdGlvbnMucXVlc3Rpb25Db3VudCA9IGluZm8ucXVlc3Rpb25Db3VudDtcbiAgICAgIG9wdGlvbnMuYW5zd2VyZWRRdWVzdGlvbkNvdW50ID0gaW5mby5hbnN3ZXJlZFF1ZXN0aW9uQ291bnQ7XG4gICAgICBvcHRpb25zLnJlcXVpcmVkUXVlc3Rpb25Db3VudCA9IGluZm8ucmVxdWlyZWRRdWVzdGlvbkNvdW50O1xuICAgICAgb3B0aW9ucy5yZXF1aXJlZEFuc3dlcmVkUXVlc3Rpb25Db3VudCA9XG4gICAgICAgIGluZm8ucmVxdWlyZWRBbnN3ZXJlZFF1ZXN0aW9uQ291bnQ7XG4gICAgfVxuXG4gICAgb3B0aW9ucy50ZXh0ID0gdGhpcy5nZXRQcm9ncmVzc1RleHRDb3JlKG9wdGlvbnMpO1xuICAgIHRoaXMub25Qcm9ncmVzc1RleHQuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9ucy50ZXh0O1xuICB9XG4gIHByaXZhdGUgZ2V0UHJvZ3Jlc3NUZXh0Q29yZShpbmZvOiBJUHJvZ3Jlc3NJbmZvKTogc3RyaW5nIHtcbiAgICB2YXIgdHlwZSA9IHRoaXMucHJvZ3Jlc3NCYXJUeXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHR5cGUgPT09IFwicXVlc3Rpb25zXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldExvY1N0cmluZyhcInF1ZXN0aW9uc1Byb2dyZXNzVGV4dFwiKVtcImZvcm1hdFwiXShcbiAgICAgICAgaW5mby5hbnN3ZXJlZFF1ZXN0aW9uQ291bnQsXG4gICAgICAgIGluZm8ucXVlc3Rpb25Db3VudFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IFwicmVxdWlyZWRxdWVzdGlvbnNcIikge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TG9jU3RyaW5nKFwicXVlc3Rpb25zUHJvZ3Jlc3NUZXh0XCIpW1wiZm9ybWF0XCJdKFxuICAgICAgICBpbmZvLnJlcXVpcmVkQW5zd2VyZWRRdWVzdGlvbkNvdW50LFxuICAgICAgICBpbmZvLnJlcXVpcmVkUXVlc3Rpb25Db3VudFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IFwiY29ycmVjdHF1ZXN0aW9uc1wiKSB7XG4gICAgICB2YXIgY29ycmVjdEFuc3dlcnNDb3VudCA9IHRoaXMuZ2V0Q29ycmVjdGVkQW5zd2VyQ291bnQoKTtcbiAgICAgIHJldHVybiB0aGlzLmdldExvY1N0cmluZyhcInF1ZXN0aW9uc1Byb2dyZXNzVGV4dFwiKVtcImZvcm1hdFwiXShcbiAgICAgICAgY29ycmVjdEFuc3dlcnNDb3VudCxcbiAgICAgICAgaW5mby5xdWVzdGlvbkNvdW50XG4gICAgICApO1xuICAgIH1cbiAgICB2YXIgdlBhZ2VzID0gdGhpcy5pc0Rlc2lnbk1vZGUgPyB0aGlzLnBhZ2VzIDogdGhpcy52aXNpYmxlUGFnZXM7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5pc0Rlc2lnbk1vZGUgPyAxIDogdlBhZ2VzLmluZGV4T2YodGhpcy5jdXJyZW50UGFnZSkgKyAxO1xuICAgIHJldHVybiB0aGlzLmdldExvY1N0cmluZyhcInByb2dyZXNzVGV4dFwiKVtcImZvcm1hdFwiXShpbmRleCwgdlBhZ2VzLmxlbmd0aCk7XG4gIH1cbiAgcHJvdGVjdGVkIGFmdGVyUmVuZGVyU3VydmV5KGh0bWxFbGVtZW50OiBhbnkpIHtcbiAgICB0aGlzLm9uQWZ0ZXJSZW5kZXJTdXJ2ZXkuZmlyZSh0aGlzLCB7XG4gICAgICBzdXJ2ZXk6IHRoaXMsXG4gICAgICBodG1sRWxlbWVudDogaHRtbEVsZW1lbnQsXG4gICAgfSk7XG4gIH1cbiAgdXBkYXRlUXVlc3Rpb25Dc3NDbGFzc2VzKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNzc0NsYXNzZXM6IGFueSkge1xuICAgIHRoaXMub25VcGRhdGVRdWVzdGlvbkNzc0NsYXNzZXMuZmlyZSh0aGlzLCB7XG4gICAgICBxdWVzdGlvbjogcXVlc3Rpb24sXG4gICAgICBjc3NDbGFzc2VzOiBjc3NDbGFzc2VzLFxuICAgIH0pO1xuICB9XG4gIHVwZGF0ZVBhbmVsQ3NzQ2xhc3NlcyhwYW5lbDogSVBhbmVsLCBjc3NDbGFzc2VzOiBhbnkpIHtcbiAgICB0aGlzLm9uVXBkYXRlUGFuZWxDc3NDbGFzc2VzLmZpcmUodGhpcywge1xuICAgICAgcGFuZWw6IHBhbmVsLFxuICAgICAgY3NzQ2xhc3NlczogY3NzQ2xhc3NlcyxcbiAgICB9KTtcbiAgfVxuICB1cGRhdGVQYWdlQ3NzQ2xhc3NlcyhwYWdlOiBJUGFnZSwgY3NzQ2xhc3NlczogYW55KSB7XG4gICAgdGhpcy5vblVwZGF0ZVBhZ2VDc3NDbGFzc2VzLmZpcmUodGhpcywge1xuICAgICAgcGFnZTogcGFnZSxcbiAgICAgIGNzc0NsYXNzZXM6IGNzc0NsYXNzZXMsXG4gICAgfSk7XG4gIH1cbiAgdXBkYXRlQ2hvaWNlSXRlbUNzcyhxdWVzdGlvbjogSVF1ZXN0aW9uLCBvcHRpb25zOiBhbnkpOiB2b2lkIHtcbiAgICBvcHRpb25zLnF1ZXN0aW9uID0gcXVlc3Rpb247XG4gICAgdGhpcy5vblVwZGF0ZUNob2ljZUl0ZW1Dc3MuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgfVxuICBhZnRlclJlbmRlclBhZ2UoaHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKHRoaXMub25BZnRlclJlbmRlclBhZ2UuaXNFbXB0eSkgcmV0dXJuO1xuICAgIHRoaXMub25BZnRlclJlbmRlclBhZ2UuZmlyZSh0aGlzLCB7XG4gICAgICBwYWdlOiB0aGlzLmFjdGl2ZVBhZ2UsXG4gICAgICBodG1sRWxlbWVudDogaHRtbEVsZW1lbnQsXG4gICAgfSk7XG4gIH1cbiAgYWZ0ZXJSZW5kZXJIZWFkZXIoaHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKHRoaXMub25BZnRlclJlbmRlckhlYWRlci5pc0VtcHR5KSByZXR1cm47XG4gICAgdGhpcy5vbkFmdGVyUmVuZGVySGVhZGVyLmZpcmUodGhpcywge1xuICAgICAgaHRtbEVsZW1lbnQ6IGh0bWxFbGVtZW50LFxuICAgIH0pO1xuICB9XG4gIGFmdGVyUmVuZGVyUXVlc3Rpb24ocXVlc3Rpb246IElRdWVzdGlvbiwgaHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5vbkFmdGVyUmVuZGVyUXVlc3Rpb24uZmlyZSh0aGlzLCB7XG4gICAgICBxdWVzdGlvbjogcXVlc3Rpb24sXG4gICAgICBodG1sRWxlbWVudDogaHRtbEVsZW1lbnQsXG4gICAgfSk7XG4gIH1cbiAgYWZ0ZXJSZW5kZXJRdWVzdGlvbklucHV0KHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgIGlmICh0aGlzLm9uQWZ0ZXJSZW5kZXJRdWVzdGlvbklucHV0LmlzRW1wdHkpIHJldHVybjtcbiAgICBsZXQgaWQgPSAoPFF1ZXN0aW9uPnF1ZXN0aW9uKS5pbnB1dElkO1xuICAgIGlmICghIWlkICYmIGh0bWxFbGVtZW50LmlkICE9PSBpZCAmJiB0eXBlb2YgZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGxldCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICAgIGlmICghIWVsKSB7XG4gICAgICAgIGh0bWxFbGVtZW50ID0gZWw7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMub25BZnRlclJlbmRlclF1ZXN0aW9uSW5wdXQuZmlyZSh0aGlzLCB7XG4gICAgICBxdWVzdGlvbjogcXVlc3Rpb24sXG4gICAgICBodG1sRWxlbWVudDogaHRtbEVsZW1lbnQsXG4gICAgfSk7XG4gIH1cbiAgYWZ0ZXJSZW5kZXJQYW5lbChwYW5lbDogSUVsZW1lbnQsIGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMub25BZnRlclJlbmRlclBhbmVsLmZpcmUodGhpcywge1xuICAgICAgcGFuZWw6IHBhbmVsLFxuICAgICAgaHRtbEVsZW1lbnQ6IGh0bWxFbGVtZW50LFxuICAgIH0pO1xuICB9XG4gIG1hdHJpeEJlZm9yZVJvd0FkZGVkKG9wdGlvbnM6IGFueSkge1xuICAgIHRoaXMub25NYXRyaXhCZWZvcmVSb3dBZGRlZC5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICB9XG4gIG1hdHJpeFJvd0FkZGVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHJvdzogYW55KSB7XG4gICAgdGhpcy5vbk1hdHJpeFJvd0FkZGVkLmZpcmUodGhpcywgeyBxdWVzdGlvbjogcXVlc3Rpb24sIHJvdzogcm93IH0pO1xuICB9XG4gIGdldFF1ZXN0aW9uQnlWYWx1ZU5hbWVGcm9tQXJyYXkoXG4gICAgdmFsdWVOYW1lOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGluZGV4OiBudW1iZXJcbiAgKTogSVF1ZXN0aW9uIHtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRRdWVzdGlvbnNCeVZhbHVlTmFtZSh2YWx1ZU5hbWUpO1xuICAgIGlmICghcXVlc3Rpb25zKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByZXMgPSBxdWVzdGlvbnNbaV0uZ2V0UXVlc3Rpb25Gcm9tQXJyYXkobmFtZSwgaW5kZXgpO1xuICAgICAgaWYgKCEhcmVzKSByZXR1cm4gcmVzO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBtYXRyaXhSb3dSZW1vdmVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHJvd0luZGV4OiBudW1iZXIsIHJvdzogYW55KSB7XG4gICAgdGhpcy5vbk1hdHJpeFJvd1JlbW92ZWQuZmlyZSh0aGlzLCB7XG4gICAgICBxdWVzdGlvbjogcXVlc3Rpb24sXG4gICAgICByb3dJbmRleDogcm93SW5kZXgsXG4gICAgICByb3c6IHJvdyxcbiAgICB9KTtcbiAgfVxuICBtYXRyaXhSb3dSZW1vdmluZyhxdWVzdGlvbjogSVF1ZXN0aW9uLCByb3dJbmRleDogbnVtYmVyLCByb3c6IGFueSk6IGJvb2xlYW4ge1xuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgcXVlc3Rpb246IHF1ZXN0aW9uLFxuICAgICAgcm93SW5kZXg6IHJvd0luZGV4LFxuICAgICAgcm93OiByb3csXG4gICAgICBhbGxvdzogdHJ1ZSxcbiAgICB9O1xuICAgIHRoaXMub25NYXRyaXhSb3dSZW1vdmluZy5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLmFsbG93O1xuICB9XG4gIG1hdHJpeEFsbG93UmVtb3ZlUm93KFxuICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgcm93SW5kZXg6IG51bWJlcixcbiAgICByb3c6IGFueVxuICApOiBib29sZWFuIHtcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgIHJvd0luZGV4OiByb3dJbmRleCxcbiAgICAgIHJvdzogcm93LFxuICAgICAgYWxsb3c6IHRydWUsXG4gICAgfTtcbiAgICB0aGlzLm9uTWF0cml4QWxsb3dSZW1vdmVSb3cuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9ucy5hbGxvdztcbiAgfVxuICBtYXRyaXhDZWxsQ3JlYXRpbmcocXVlc3Rpb246IElRdWVzdGlvbiwgb3B0aW9uczogYW55KSB7XG4gICAgb3B0aW9ucy5xdWVzdGlvbiA9IHF1ZXN0aW9uO1xuICAgIHRoaXMub25NYXRyaXhDZWxsQ3JlYXRpbmcuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgfVxuICBtYXRyaXhDZWxsQ3JlYXRlZChxdWVzdGlvbjogSVF1ZXN0aW9uLCBvcHRpb25zOiBhbnkpIHtcbiAgICBvcHRpb25zLnF1ZXN0aW9uID0gcXVlc3Rpb247XG4gICAgdGhpcy5vbk1hdHJpeENlbGxDcmVhdGVkLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gIH1cbiAgbWF0cml4QWZ0ZXJDZWxsUmVuZGVyKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIG9wdGlvbnM6IGFueSkge1xuICAgIG9wdGlvbnMucXVlc3Rpb24gPSBxdWVzdGlvbjtcbiAgICB0aGlzLm9uTWF0cml4QWZ0ZXJDZWxsUmVuZGVyLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gIH1cbiAgbWF0cml4Q2VsbFZhbHVlQ2hhbmdlZChxdWVzdGlvbjogSVF1ZXN0aW9uLCBvcHRpb25zOiBhbnkpIHtcbiAgICBvcHRpb25zLnF1ZXN0aW9uID0gcXVlc3Rpb247XG4gICAgdGhpcy5vbk1hdHJpeENlbGxWYWx1ZUNoYW5nZWQuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgfVxuICBtYXRyaXhDZWxsVmFsdWVDaGFuZ2luZyhxdWVzdGlvbjogSVF1ZXN0aW9uLCBvcHRpb25zOiBhbnkpIHtcbiAgICBvcHRpb25zLnF1ZXN0aW9uID0gcXVlc3Rpb247XG4gICAgdGhpcy5vbk1hdHJpeENlbGxWYWx1ZUNoYW5naW5nLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gIH1cbiAgZ2V0IGlzVmFsaWRhdGVPblZhbHVlQ2hhbmdpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tFcnJvcnNNb2RlID09PSBcIm9uVmFsdWVDaGFuZ2luZ1wiO1xuICB9XG4gIG1hdHJpeENlbGxWYWxpZGF0ZShxdWVzdGlvbjogSVF1ZXN0aW9uLCBvcHRpb25zOiBhbnkpOiBTdXJ2ZXlFcnJvciB7XG4gICAgb3B0aW9ucy5xdWVzdGlvbiA9IHF1ZXN0aW9uO1xuICAgIHRoaXMub25NYXRyaXhDZWxsVmFsaWRhdGUuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9ucy5lcnJvciA/IG5ldyBDdXN0b21FcnJvcihvcHRpb25zLmVycm9yLCB0aGlzKSA6IG51bGw7XG4gIH1cbiAgZHluYW1pY1BhbmVsQWRkZWQocXVlc3Rpb246IElRdWVzdGlvbikge1xuICAgIGlmICh0aGlzLm9uRHluYW1pY1BhbmVsQWRkZWQuaXNFbXB0eSkgcmV0dXJuO1xuICAgIHZhciBwYW5lbHMgPSAoPGFueT5xdWVzdGlvbikucGFuZWxzO1xuICAgIHZhciBwYW5lbCA9IHBhbmVsc1twYW5lbHMubGVuZ3RoIC0gMV07XG4gICAgdGhpcy5vbkR5bmFtaWNQYW5lbEFkZGVkLmZpcmUodGhpcywgeyBxdWVzdGlvbjogcXVlc3Rpb24sIHBhbmVsOiBwYW5lbCB9KTtcbiAgfVxuICBkeW5hbWljUGFuZWxSZW1vdmVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHBhbmVsSW5kZXg6IG51bWJlciwgcGFuZWw6IElQYW5lbCkge1xuICAgIHZhciBxdWVzdGlvbnMgPSAhIXBhbmVsID8gKDxQYW5lbE1vZGVsQmFzZT5wYW5lbCkucXVlc3Rpb25zIDogW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXN0aW9uc1tpXS5jbGVhck9uRGVsZXRpbmdDb250YWluZXIoKTtcbiAgICB9XG4gICAgdGhpcy5vbkR5bmFtaWNQYW5lbFJlbW92ZWQuZmlyZSh0aGlzLCB7XG4gICAgICBxdWVzdGlvbjogcXVlc3Rpb24sXG4gICAgICBwYW5lbEluZGV4OiBwYW5lbEluZGV4LFxuICAgICAgcGFuZWw6IHBhbmVsLFxuICAgIH0pO1xuICB9XG4gIGR5bmFtaWNQYW5lbEl0ZW1WYWx1ZUNoYW5nZWQocXVlc3Rpb246IElRdWVzdGlvbiwgb3B0aW9uczogYW55KSB7XG4gICAgb3B0aW9ucy5xdWVzdGlvbiA9IHF1ZXN0aW9uO1xuICAgIHRoaXMub25EeW5hbWljUGFuZWxJdGVtVmFsdWVDaGFuZ2VkLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gIH1cbiAgZHJhZ0FuZERyb3BBbGxvdyhvcHRpb25zOiBhbnkpOiBib29sZWFuIHtcbiAgICBvcHRpb25zLmFsbG93ID0gdHJ1ZTtcbiAgICB0aGlzLm9uRHJhZ0Ryb3BBbGxvdy5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLmFsbG93O1xuICB9XG4gIGVsZW1lbnRDb250ZW50VmlzaWJpbGl0eUNoYW5nZWQoZWxlbWVudDogSVN1cnZleUVsZW1lbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZVZhbHVlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlVmFsdWUuZW5zdXJlUm93c1Zpc2liaWxpdHkoKTtcbiAgICB9XG4gICAgdGhpcy5vbkVsZW1lbnRDb250ZW50VmlzaWJpbGl0eUNoYW5nZWQuZmlyZSh0aGlzLCB7IGVsZW1lbnQgfSk7XG4gIH1cblxuICBnZXRVcGRhdGVkRWxlbWVudFRpdGxlQWN0aW9ucyhcbiAgICBlbGVtZW50OiBJU3VydmV5RWxlbWVudCxcbiAgICB0aXRsZUFjdGlvbnM6IEFycmF5PElBY3Rpb24+XG4gICk6IEFycmF5PElBY3Rpb24+IHtcbiAgICBpZiAoZWxlbWVudC5pc1BhZ2UpXG4gICAgICByZXR1cm4gdGhpcy5nZXRVcGRhdGVkUGFnZVRpdGxlQWN0aW9ucyhlbGVtZW50LCB0aXRsZUFjdGlvbnMpO1xuICAgIGlmIChlbGVtZW50LmlzUGFuZWwpXG4gICAgICByZXR1cm4gdGhpcy5nZXRVcGRhdGVkUGFuZWxUaXRsZUFjdGlvbnMoZWxlbWVudCwgdGl0bGVBY3Rpb25zKTtcbiAgICByZXR1cm4gdGhpcy5nZXRVcGRhdGVkUXVlc3Rpb25UaXRsZUFjdGlvbnMoZWxlbWVudCwgdGl0bGVBY3Rpb25zKTtcbiAgfVxuICBwcml2YXRlIGdldFVwZGF0ZWRRdWVzdGlvblRpdGxlQWN0aW9ucyhcbiAgICBxdWVzdGlvbjogSVN1cnZleUVsZW1lbnQsXG4gICAgdGl0bGVBY3Rpb25zOiBBcnJheTxJQWN0aW9uPlxuICApIHtcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgIHRpdGxlQWN0aW9uczogdGl0bGVBY3Rpb25zLFxuICAgIH07XG4gICAgdGhpcy5vbkdldFF1ZXN0aW9uVGl0bGVBY3Rpb25zLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG9wdGlvbnMudGl0bGVBY3Rpb25zO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRVcGRhdGVkUGFuZWxUaXRsZUFjdGlvbnMoXG4gICAgcGFuZWw6IElTdXJ2ZXlFbGVtZW50LFxuICAgIHRpdGxlQWN0aW9uczogQXJyYXk8SUFjdGlvbj5cbiAgKSB7XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICBwYW5lbDogcGFuZWwsXG4gICAgICB0aXRsZUFjdGlvbnM6IHRpdGxlQWN0aW9ucyxcbiAgICB9O1xuICAgIHRoaXMub25HZXRQYW5lbFRpdGxlQWN0aW9ucy5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLnRpdGxlQWN0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VXBkYXRlZFBhZ2VUaXRsZUFjdGlvbnMoXG4gICAgcGFnZTogSVN1cnZleUVsZW1lbnQsXG4gICAgdGl0bGVBY3Rpb25zOiBBcnJheTxJQWN0aW9uPlxuICApIHtcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIHBhZ2U6IHBhZ2UsXG4gICAgICB0aXRsZUFjdGlvbnM6IHRpdGxlQWN0aW9ucyxcbiAgICB9O1xuICAgIHRoaXMub25HZXRQYWdlVGl0bGVBY3Rpb25zLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG9wdGlvbnMudGl0bGVBY3Rpb25zO1xuICB9XG5cbiAgZ2V0VXBkYXRlZE1hdHJpeFJvd0FjdGlvbnMoXG4gICAgcXVlc3Rpb246IElRdWVzdGlvbixcbiAgICByb3c6IGFueSxcbiAgICBhY3Rpb25zOiBBcnJheTxJQWN0aW9uPlxuICApIHtcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgIGFjdGlvbnM6IGFjdGlvbnMsXG4gICAgICByb3c6IHJvdyxcbiAgICB9O1xuICAgIHRoaXMub25HZXRNYXRyaXhSb3dBY3Rpb25zLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG9wdGlvbnMuYWN0aW9ucztcbiAgfVxuXG4gIHNjcm9sbEVsZW1lbnRUb1RvcChcbiAgICBlbGVtZW50OiBJU3VydmV5RWxlbWVudCxcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgIHBhZ2U6IElQYWdlLFxuICAgIGlkOiBzdHJpbmdcbiAgKTogYW55IHtcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIGVsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICBxdWVzdGlvbjogcXVlc3Rpb24sXG4gICAgICBwYWdlOiBwYWdlLFxuICAgICAgZWxlbWVudElkOiBpZCxcbiAgICAgIGNhbmNlbDogZmFsc2UsXG4gICAgfTtcbiAgICB0aGlzLm9uU2Nyb2xsaW5nRWxlbWVudFRvVG9wLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgaWYgKCFvcHRpb25zLmNhbmNlbCkge1xuICAgICAgU3VydmV5RWxlbWVudC5TY3JvbGxFbGVtZW50VG9Ub3Aob3B0aW9ucy5lbGVtZW50SWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGxvYWRzIGEgZmlsZSB0byBzZXJ2ZXIuXG4gICAqIEBwYXJhbSBxdWVzdGlvbiBhIGZpbGUgcXVlc3Rpb24gb2JqZWN0XG4gICAqIEBwYXJhbSBuYW1lIGEgcXVlc3Rpb24gbmFtZVxuICAgKiBAcGFyYW0gZmlsZXMgZmlsZXMgdG8gdXBsb2FkXG4gICAqIEBwYXJhbSB1cGxvYWRpbmdDYWxsYmFjayBhIGNhbGwgYmFjayBmdW5jdGlvbiB0byBnZXQgdGhlIHN0YXR1cyBvbiB1cGxvYWRpbmcgdGhlIGZpbGVzXG4gICAqL1xuICBwdWJsaWMgdXBsb2FkRmlsZXMoXG4gICAgcXVlc3Rpb246IElRdWVzdGlvbixcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZmlsZXM6IEZpbGVbXSxcbiAgICB1cGxvYWRpbmdDYWxsYmFjazogKHN0YXR1czogc3RyaW5nLCBkYXRhOiBhbnkpID0+IGFueVxuICApIHtcbiAgICBpZiAodGhpcy5vblVwbG9hZEZpbGVzLmlzRW1wdHkpIHtcbiAgICAgIHVwbG9hZGluZ0NhbGxiYWNrKFwiZXJyb3JcIiwgZmlsZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uVXBsb2FkRmlsZXMuZmlyZSh0aGlzLCB7XG4gICAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgZmlsZXM6IGZpbGVzIHx8IFtdLFxuICAgICAgICBjYWxsYmFjazogdXBsb2FkaW5nQ2FsbGJhY2ssXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3VydmV5UG9zdElkKSB7XG4gICAgICB0aGlzLnVwbG9hZEZpbGVzQ29yZShuYW1lLCBmaWxlcywgdXBsb2FkaW5nQ2FsbGJhY2spO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogRG93bmxvYWRzIGEgZmlsZSBmcm9tIHNlcnZlclxuICAgKiBAcGFyYW0gbmFtZSBhIHF1ZXN0aW9uIG5hbWVcbiAgICogQHBhcmFtIGZpbGVWYWx1ZSBhIHNpbmdsZSBmaWxlIHF1ZXN0aW9uIHZhbHVlXG4gICAqIEBwYXJhbSBjYWxsYmFjayBhIGNhbGwgYmFjayBmdW5jdGlvbiB0byBnZXQgdGhlIHN0YXR1cyBvbiBkb3dubG9hZGluZyB0aGUgZmlsZSBhbmQgdGhlIGRvd25sb2FkZWQgZmlsZSBjb250ZW50XG4gICAqL1xuICBwdWJsaWMgZG93bmxvYWRGaWxlKFxuICAgIHF1ZXN0aW9uTmFtZTogc3RyaW5nLFxuICAgIGZpbGVWYWx1ZTogYW55LFxuICAgIGNhbGxiYWNrOiAoc3RhdHVzOiBzdHJpbmcsIGRhdGE6IGFueSkgPT4gYW55XG4gICkge1xuICAgIGlmICh0aGlzLm9uRG93bmxvYWRGaWxlLmlzRW1wdHkpIHtcbiAgICAgICEhY2FsbGJhY2sgJiYgY2FsbGJhY2soXCJzdWNjZXNzXCIsIGZpbGVWYWx1ZS5jb250ZW50IHx8IGZpbGVWYWx1ZSk7XG4gICAgfVxuICAgIHRoaXMub25Eb3dubG9hZEZpbGUuZmlyZSh0aGlzLCB7XG4gICAgICBuYW1lOiBxdWVzdGlvbk5hbWUsXG4gICAgICBjb250ZW50OiBmaWxlVmFsdWUuY29udGVudCB8fCBmaWxlVmFsdWUsXG4gICAgICBmaWxlVmFsdWU6IGZpbGVWYWx1ZSxcbiAgICAgIGNhbGxiYWNrOiBjYWxsYmFjayxcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogQ2xlYXJzIGZpbGVzIGZyb20gc2VydmVyLlxuICAgKiBAcGFyYW0gcXVlc3Rpb24gcXVlc3Rpb25cbiAgICogQHBhcmFtIG5hbWUgcXVlc3Rpb24gbmFtZVxuICAgKiBAcGFyYW0gdmFsdWUgZmlsZSBxdWVzdGlvbiB2YWx1ZVxuICAgKiBAcGFyYW0gY2FsbGJhY2sgY2FsbCBiYWNrIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3RhdHVzIG9mIHRoZSBjbGVhcmluZyBvcGVyYXRpb25cbiAgICovXG4gIHB1YmxpYyBjbGVhckZpbGVzKFxuICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHZhbHVlOiBhbnksXG4gICAgZmlsZU5hbWU6IHN0cmluZyxcbiAgICBjYWxsYmFjazogKHN0YXR1czogc3RyaW5nLCBkYXRhOiBhbnkpID0+IGFueVxuICApIHtcbiAgICBpZiAodGhpcy5vbkNsZWFyRmlsZXMuaXNFbXB0eSkge1xuICAgICAgISFjYWxsYmFjayAmJiBjYWxsYmFjayhcInN1Y2Nlc3NcIiwgdmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLm9uQ2xlYXJGaWxlcy5maXJlKHRoaXMsIHtcbiAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBmaWxlTmFtZTogZmlsZU5hbWUsXG4gICAgICBjYWxsYmFjazogY2FsbGJhY2ssXG4gICAgfSk7XG4gIH1cbiAgdXBkYXRlQ2hvaWNlc0Zyb21TZXJ2ZXIoXG4gICAgcXVlc3Rpb246IElRdWVzdGlvbixcbiAgICBjaG9pY2VzOiBBcnJheTxJdGVtVmFsdWU+LFxuICAgIHNlcnZlclJlc3VsdDogYW55XG4gICk6IEFycmF5PEl0ZW1WYWx1ZT4ge1xuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgcXVlc3Rpb246IHF1ZXN0aW9uLFxuICAgICAgY2hvaWNlczogY2hvaWNlcyxcbiAgICAgIHNlcnZlclJlc3VsdDogc2VydmVyUmVzdWx0LFxuICAgIH07XG4gICAgdGhpcy5vbkxvYWRDaG9pY2VzRnJvbVNlcnZlci5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLmNob2ljZXM7XG4gIH1cbiAgbG9hZGVkQ2hvaWNlc0Zyb21TZXJ2ZXIocXVlc3Rpb246IElRdWVzdGlvbik6IHZvaWQge1xuICAgIHRoaXMubG9jU3Ryc0NoYW5nZWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlU3VydmV5U2VydmljZSgpOiBkeFN1cnZleVNlcnZpY2Uge1xuICAgIHJldHVybiBuZXcgZHhTdXJ2ZXlTZXJ2aWNlKCk7XG4gIH1cbiAgcHJvdGVjdGVkIHVwbG9hZEZpbGVzQ29yZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZmlsZXM6IEZpbGVbXSxcbiAgICB1cGxvYWRpbmdDYWxsYmFjazogKHN0YXR1czogc3RyaW5nLCBkYXRhOiBhbnkpID0+IGFueVxuICApIHtcbiAgICB2YXIgcmVzcG9uc2VzOiBBcnJheTxhbnk+ID0gW107XG4gICAgZmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgaWYgKHVwbG9hZGluZ0NhbGxiYWNrKSB1cGxvYWRpbmdDYWxsYmFjayhcInVwbG9hZGluZ1wiLCBmaWxlKTtcbiAgICAgIHRoaXMuY3JlYXRlU3VydmV5U2VydmljZSgpLnNlbmRGaWxlKFxuICAgICAgICB0aGlzLnN1cnZleVBvc3RJZCxcbiAgICAgICAgZmlsZSxcbiAgICAgICAgKHN1Y2Nlc3M6IGJvb2xlYW4sIHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgICAgcmVzcG9uc2VzLnB1c2goeyBjb250ZW50OiByZXNwb25zZSwgZmlsZTogZmlsZSB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZXMubGVuZ3RoID09PSBmaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgaWYgKHVwbG9hZGluZ0NhbGxiYWNrKSB1cGxvYWRpbmdDYWxsYmFjayhcInN1Y2Nlc3NcIiwgcmVzcG9uc2VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHVwbG9hZGluZ0NhbGxiYWNrKVxuICAgICAgICAgICAgICB1cGxvYWRpbmdDYWxsYmFjayhcImVycm9yXCIsIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZTogcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgZmlsZTogZmlsZSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuICB9XG4gIGdldFBhZ2UoaW5kZXg6IG51bWJlcik6IFBhZ2VNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMucGFnZXNbaW5kZXhdO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGFuIGV4aXN0aW5nIHBhZ2UgdG8gdGhlIHN1cnZleS5cbiAgICogQHBhcmFtIHBhZ2UgYSBuZXdseSBhZGRlZCBwYWdlXG4gICAqIEBwYXJhbSBpbmRleCAtIGEgcGFnZSBpbmRleCB0byB3aGVyZSBpbnNlcnQgYSBwYWdlLiBJdCBpcyAtMSBieSBkZWZhdWx0IGFuZCB0aGUgcGFnZSB3aWxsIGJlIGFkZGVkIGludG8gdGhlIGVuZC5cbiAgICogQHNlZSBhZGROZXdQYWdlXG4gICAqL1xuICBwdWJsaWMgYWRkUGFnZShwYWdlOiBQYWdlTW9kZWwsIGluZGV4OiBudW1iZXIgPSAtMSkge1xuICAgIGlmIChwYWdlID09IG51bGwpIHJldHVybjtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMucGFnZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnBhZ2VzLnB1c2gocGFnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFnZXMuc3BsaWNlKGluZGV4LCAwLCBwYWdlKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgcGFnZSBhbmQgYWRkcyBpdCB0byBhIHN1cnZleS4gR2VuZXJhdGVzIGEgbmV3IG5hbWUgaWYgdGhlIGBuYW1lYCBwYXJhbWV0ZXIgaXMgbm90IHNwZWNpZmllZC5cbiAgICogQHBhcmFtIG5hbWUgYSBwYWdlIG5hbWVcbiAgICogQHBhcmFtIGluZGV4IC0gYSBwYWdlIGluZGV4IHRvIHdoZXJlIGluc2VydCBhIG5ldyBwYWdlLiBJdCBpcyAtMSBieSBkZWZhdWx0IGFuZCB0aGUgcGFnZSB3aWxsIGJlIGFkZGVkIGludG8gdGhlIGVuZC5cbiAgICogQHNlZSBhZGRQYWdlXG4gICAqL1xuICBwdWJsaWMgYWRkTmV3UGFnZShuYW1lOiBzdHJpbmcgPSBudWxsLCBpbmRleDogbnVtYmVyID0gLTEpIHtcbiAgICB2YXIgcGFnZSA9IHRoaXMuY3JlYXRlTmV3UGFnZShuYW1lKTtcbiAgICB0aGlzLmFkZFBhZ2UocGFnZSwgaW5kZXgpO1xuICAgIHJldHVybiBwYWdlO1xuICB9XG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgcGFnZSBmcm9tIGEgc3VydmV5LlxuICAgKiBAcGFyYW0gcGFnZVxuICAgKi9cbiAgcHVibGljIHJlbW92ZVBhZ2UocGFnZTogUGFnZU1vZGVsKSB7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5wYWdlcy5pbmRleE9mKHBhZ2UpO1xuICAgIGlmIChpbmRleCA8IDApIHJldHVybjtcbiAgICB0aGlzLnBhZ2VzLnNwbGljZShpbmRleCwgMSk7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2VWYWx1ZSA9PSBwYWdlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy5wYWdlcy5sZW5ndGggPiAwID8gdGhpcy5wYWdlc1swXSA6IG51bGw7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcXVlc3Rpb24gYnkgaXRzIG5hbWUuXG4gICAqIEBwYXJhbSBuYW1lIGEgcXVlc3Rpb24gbmFtZVxuICAgKiBAcGFyYW0gY2FzZUluc2Vuc2l0aXZlXG4gICAqIEBzZWUgZ2V0UXVlc3Rpb25CeVZhbHVlTmFtZVxuICAgKi9cbiAgcHVibGljIGdldFF1ZXN0aW9uQnlOYW1lKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjYXNlSW5zZW5zaXRpdmU6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBRdWVzdGlvbiB7XG4gICAgaWYgKCFuYW1lKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoY2FzZUluc2Vuc2l0aXZlKSB7XG4gICAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICB2YXIgaGFzaDogSGFzaFRhYmxlPGFueT4gPSAhIWNhc2VJbnNlbnNpdGl2ZVxuICAgICAgPyB0aGlzLnF1ZXN0aW9uSGFzaGVzLm5hbWVzSW5zZW5zaXRpdmVcbiAgICAgIDogdGhpcy5xdWVzdGlvbkhhc2hlcy5uYW1lcztcbiAgICB2YXIgcmVzID0gaGFzaFtuYW1lXTtcbiAgICBpZiAoIXJlcykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHJlc1swXTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIHF1ZXN0aW9uIGJ5IGl0cyB2YWx1ZSBuYW1lXG4gICAqIEBwYXJhbSB2YWx1ZU5hbWUgYSBxdWVzdGlvbiBuYW1lXG4gICAqIEBwYXJhbSBjYXNlSW5zZW5zaXRpdmVcbiAgICogQHNlZSBnZXRRdWVzdGlvbkJ5TmFtZVxuICAgKiBAc2VlIGdldFF1ZXN0aW9uc0J5VmFsdWVOYW1lXG4gICAqIEBzZWUgUXVlc3Rpb24udmFsdWVOYW1lXG4gICAqL1xuICBwdWJsaWMgZ2V0UXVlc3Rpb25CeVZhbHVlTmFtZShcbiAgICB2YWx1ZU5hbWU6IHN0cmluZyxcbiAgICBjYXNlSW5zZW5zaXRpdmU6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBJUXVlc3Rpb24ge1xuICAgIHZhciByZXMgPSB0aGlzLmdldFF1ZXN0aW9uc0J5VmFsdWVOYW1lKHZhbHVlTmFtZSwgY2FzZUluc2Vuc2l0aXZlKTtcbiAgICByZXR1cm4gISFyZXMgPyByZXNbMF0gOiBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCBxdWVzdGlvbnMgYnkgdGhlaXIgdmFsdWVOYW1lLiBuYW1lIHByb3BlcnR5IGlzIHVzZWQgaWYgdmFsdWVOYW1lIHByb3BlcnR5IGlzIGVtcHR5LlxuICAgKiBAcGFyYW0gdmFsdWVOYW1lIGEgcXVlc3Rpb24gbmFtZVxuICAgKiBAcGFyYW0gY2FzZUluc2Vuc2l0aXZlXG4gICAqIEBzZWUgZ2V0UXVlc3Rpb25CeU5hbWVcbiAgICogQHNlZSBnZXRRdWVzdGlvbkJ5VmFsdWVOYW1lXG4gICAqIEBzZWUgUXVlc3Rpb24udmFsdWVOYW1lXG4gICAqL1xuICBwdWJsaWMgZ2V0UXVlc3Rpb25zQnlWYWx1ZU5hbWUoXG4gICAgdmFsdWVOYW1lOiBzdHJpbmcsXG4gICAgY2FzZUluc2Vuc2l0aXZlOiBib29sZWFuID0gZmFsc2VcbiAgKTogQXJyYXk8UXVlc3Rpb24+IHtcbiAgICB2YXIgaGFzaDogSGFzaFRhYmxlPGFueT4gPSAhIWNhc2VJbnNlbnNpdGl2ZVxuICAgICAgPyB0aGlzLnF1ZXN0aW9uSGFzaGVzLnZhbHVlTmFtZXNJbnNlbnNpdGl2ZVxuICAgICAgOiB0aGlzLnF1ZXN0aW9uSGFzaGVzLnZhbHVlTmFtZXM7XG4gICAgdmFyIHJlcyA9IGhhc2hbdmFsdWVOYW1lXTtcbiAgICBpZiAoIXJlcykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgZ2V0Q2FsY3VsYXRlZFZhbHVlQnlOYW1lKG5hbWU6IHN0cmluZyk6IENhbGN1bGF0ZWRWYWx1ZSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNhbGN1bGF0ZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChuYW1lID09IHRoaXMuY2FsY3VsYXRlZFZhbHVlc1tpXS5uYW1lKVxuICAgICAgICByZXR1cm4gdGhpcy5jYWxjdWxhdGVkVmFsdWVzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogR2V0cyBhIGxpc3Qgb2YgcXVlc3Rpb25zIGJ5IHRoZWlyIG5hbWVzLlxuICAgKiBAcGFyYW0gbmFtZXMgYW4gYXJyYXkgb2YgcXVlc3Rpb24gbmFtZXNcbiAgICogQHBhcmFtIGNhc2VJbnNlbnNpdGl2ZVxuICAgKi9cbiAgcHVibGljIGdldFF1ZXN0aW9uc0J5TmFtZXMoXG4gICAgbmFtZXM6IHN0cmluZ1tdLFxuICAgIGNhc2VJbnNlbnNpdGl2ZTogYm9vbGVhbiA9IGZhbHNlXG4gICk6IElRdWVzdGlvbltdIHtcbiAgICB2YXIgcmVzdWx0OiBJUXVlc3Rpb25bXSA9IFtdO1xuICAgIGlmICghbmFtZXMpIHJldHVybiByZXN1bHQ7XG4gICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIW5hbWVzW2ldKSBjb250aW51ZTtcbiAgICAgIHZhciBxdWVzdGlvbiA9IHRoaXMuZ2V0UXVlc3Rpb25CeU5hbWUobmFtZXNbaV0sIGNhc2VJbnNlbnNpdGl2ZSk7XG4gICAgICBpZiAocXVlc3Rpb24pIHJlc3VsdC5wdXNoKHF1ZXN0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIHBhZ2Ugb24gd2hpY2ggYW4gZWxlbWVudCAocXVlc3Rpb24gb3IgcGFuZWwpIGlzIHBsYWNlZC5cbiAgICogQHBhcmFtIGVsZW1lbnQgUXVlc3Rpb24gb3IgUGFuZWxcbiAgICovXG4gIHB1YmxpYyBnZXRQYWdlQnlFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50KTogUGFnZU1vZGVsIHtcbiAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBhZ2UgPSB0aGlzLnBhZ2VzW2ldO1xuICAgICAgaWYgKHBhZ2UuY29udGFpbnNFbGVtZW50KGVsZW1lbnQpKSByZXR1cm4gcGFnZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYSBwYWdlIG9uIHdoaWNoIGEgcXVlc3Rpb24gaXMgbG9jYXRlZC5cbiAgICogQHBhcmFtIHF1ZXN0aW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0UGFnZUJ5UXVlc3Rpb24ocXVlc3Rpb246IElRdWVzdGlvbik6IFBhZ2VNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UGFnZUJ5RWxlbWVudChxdWVzdGlvbik7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYSBwYWdlIGJ5IGl0J3MgbmFtZS5cbiAgICogQHBhcmFtIG5hbWVcbiAgICovXG4gIHB1YmxpYyBnZXRQYWdlQnlOYW1lKG5hbWU6IHN0cmluZyk6IFBhZ2VNb2RlbCB7XG4gICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLnBhZ2VzW2ldLm5hbWUgPT0gbmFtZSkgcmV0dXJuIHRoaXMucGFnZXNbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBwYWdlcyBieSB0aGVpciBuYW1lcy5cbiAgICogQHBhcmFtIG5hbWVzIGEgbGlzdCBvZiBwYWdlIG5hbWVzXG4gICAqL1xuICBwdWJsaWMgZ2V0UGFnZXNCeU5hbWVzKG5hbWVzOiBzdHJpbmdbXSk6IFBhZ2VNb2RlbFtdIHtcbiAgICB2YXIgcmVzdWx0OiBQYWdlTW9kZWxbXSA9IFtdO1xuICAgIGlmICghbmFtZXMpIHJldHVybiByZXN1bHQ7XG4gICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIW5hbWVzW2ldKSBjb250aW51ZTtcbiAgICAgIHZhciBwYWdlID0gdGhpcy5nZXRQYWdlQnlOYW1lKG5hbWVzW2ldKTtcbiAgICAgIGlmIChwYWdlKSByZXN1bHQucHVzaChwYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIHF1ZXN0aW9ucyBpbiBhIHN1cnZleS5cbiAgICogQHBhcmFtIHZpc2libGVPbmx5IHNldCBpdCBgdHJ1ZWAsIGlmIHlvdSB3YW50IHRvIGdldCBvbmx5IHZpc2libGUgcXVlc3Rpb25zXG4gICAqL1xuICBwdWJsaWMgZ2V0QWxsUXVlc3Rpb25zKFxuICAgIHZpc2libGVPbmx5OiBib29sZWFuID0gZmFsc2UsXG4gICAgaW5jbHVkaW5nRGVzaWduVGltZTogYm9vbGVhbiA9IGZhbHNlXG4gICk6IEFycmF5PFF1ZXN0aW9uPiB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxRdWVzdGlvbj4oKTtcbiAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYWdlc1tpXS5hZGRRdWVzdGlvbnNUb0xpc3QoXG4gICAgICAgIHJlc3VsdCxcbiAgICAgICAgdmlzaWJsZU9ubHksXG4gICAgICAgIGluY2x1ZGluZ0Rlc2lnblRpbWVcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgcXVpeiBxdWVzdGlvbnMuIEFsbCB2aXNpYmxlIHF1ZXN0aW9ucyB0aGF0IGhhcyBpbnB1dChzKSB3aWRnZXRzLlxuICAgKiBAc2VlIGdldFF1aXpRdWVzdGlvbkNvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0UXVpelF1ZXN0aW9ucygpOiBBcnJheTxJUXVlc3Rpb24+IHtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5PElRdWVzdGlvbj4oKTtcbiAgICB2YXIgc3RhcnRJbmRleCA9IHRoaXMuZmlyc3RQYWdlSXNTdGFydGVkID8gMSA6IDA7XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0SW5kZXg7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXRoaXMucGFnZXNbaV0uaXNWaXNpYmxlKSBjb250aW51ZTtcbiAgICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLnBhZ2VzW2ldLnF1ZXN0aW9ucztcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcXVlc3Rpb25zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBxID0gcXVlc3Rpb25zW2pdO1xuICAgICAgICBpZiAocS5xdWl6UXVlc3Rpb25Db3VudCA+IDApIHtcbiAgICAgICAgICByZXN1bHQucHVzaChxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcGFuZWwgYnkgaXRzIG5hbWUuXG4gICAqIEBwYXJhbSBuYW1lIGEgcGFuZWwgbmFtZVxuICAgKiBAcGFyYW0gY2FzZUluc2Vuc2l0aXZlXG4gICAqIEBzZWUgZ2V0UXVlc3Rpb25CeU5hbWVcbiAgICovXG4gIHB1YmxpYyBnZXRQYW5lbEJ5TmFtZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY2FzZUluc2Vuc2l0aXZlOiBib29sZWFuID0gZmFsc2VcbiAgKTogSVBhbmVsIHtcbiAgICB2YXIgcGFuZWxzID0gdGhpcy5nZXRBbGxQYW5lbHMoKTtcbiAgICBpZiAoY2FzZUluc2Vuc2l0aXZlKSBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCBwYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwYW5lbE5hbWUgPSBwYW5lbHNbaV0ubmFtZTtcbiAgICAgIGlmIChjYXNlSW5zZW5zaXRpdmUpIHBhbmVsTmFtZSA9IHBhbmVsTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKHBhbmVsTmFtZSA9PSBuYW1lKSByZXR1cm4gcGFuZWxzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIHN1cnZleSdzIHBhbmVscy5cbiAgICovXG4gIHB1YmxpYyBnZXRBbGxQYW5lbHMoXG4gICAgdmlzaWJsZU9ubHk6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBpbmNsdWRpbmdEZXNpZ25UaW1lOiBib29sZWFuID0gZmFsc2VcbiAgKTogQXJyYXk8SVBhbmVsPiB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxJUGFuZWw+KCk7XG4gICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucGFnZXNbaV0uYWRkUGFuZWxzSW50b0xpc3QocmVzdWx0LCB2aXNpYmxlT25seSwgaW5jbHVkaW5nRGVzaWduVGltZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgcGFnZSwgYnV0IGRvIG5vdCBhZGQgaXQgaW50byB0aGUgc3VydmV5LlxuICAgKiBZb3UgY2FuIHVzZSBhZGRQYWdlKHBhZ2UpIGZ1bmN0aW9uIHRvIGFkZCBpdCBpbnRvIHN1cnZleSBsYXRlci5cbiAgICogQHNlZSBhZGRQYWdlXG4gICAqIEBzZWUgYWRkTmV3UGFnZVxuICAgKi9cbiAgcHVibGljIGNyZWF0ZU5ld1BhZ2UobmFtZTogc3RyaW5nKTogUGFnZU1vZGVsIHtcbiAgICByZXR1cm4gbmV3IFBhZ2VNb2RlbChuYW1lKTtcbiAgfVxuICBwcm90ZWN0ZWQgcXVlc3Rpb25PblZhbHVlQ2hhbmdpbmcodmFsdWVOYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGlmICh0aGlzLm9uVmFsdWVDaGFuZ2luZy5pc0VtcHR5KSByZXR1cm4gbmV3VmFsdWU7XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICBuYW1lOiB2YWx1ZU5hbWUsXG4gICAgICBxdWVzdGlvbjogdGhpcy5nZXRRdWVzdGlvbkJ5VmFsdWVOYW1lKHZhbHVlTmFtZSksXG4gICAgICB2YWx1ZTogdGhpcy5nZXRVbmJpbmRWYWx1ZShuZXdWYWx1ZSksXG4gICAgICBvbGRWYWx1ZTogdGhpcy5nZXRWYWx1ZSh2YWx1ZU5hbWUpLFxuICAgIH07XG4gICAgdGhpcy5vblZhbHVlQ2hhbmdpbmcuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9ucy52YWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgdXBkYXRlUXVlc3Rpb25WYWx1ZSh2YWx1ZU5hbWU6IHN0cmluZywgbmV3VmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0UXVlc3Rpb25zQnlWYWx1ZU5hbWUodmFsdWVOYW1lKTtcbiAgICBpZiAoISFxdWVzdGlvbnMpIHtcbiAgICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHFWYWx1ZSA9IHF1ZXN0aW9uc1tpXS52YWx1ZTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChxVmFsdWUgPT09IG5ld1ZhbHVlICYmIEFycmF5LmlzQXJyYXkocVZhbHVlKSAmJiAhIXRoaXMuZWRpdGluZ09iaikgfHxcbiAgICAgICAgICAhdGhpcy5pc1R3b1ZhbHVlRXF1YWxzKHFWYWx1ZSwgbmV3VmFsdWUpXG4gICAgICAgICkge1xuICAgICAgICAgIHF1ZXN0aW9uc1tpXS51cGRhdGVWYWx1ZUZyb21TdXJ2ZXkobmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgY2hlY2tRdWVzdGlvbkVycm9yT25WYWx1ZUNoYW5nZWQocXVlc3Rpb246IFF1ZXN0aW9uKSB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuaXNOYXZpZ2F0aW9uQnV0dG9uUHJlc3NlZCAmJlxuICAgICAgKHRoaXMuY2hlY2tFcnJvcnNNb2RlID09PSBcIm9uVmFsdWVDaGFuZ2VkXCIgfHxcbiAgICAgICAgcXVlc3Rpb24uZ2V0QWxsRXJyb3JzKCkubGVuZ3RoID4gMClcbiAgICApIHtcbiAgICAgIHRoaXMuY2hlY2tRdWVzdGlvbkVycm9yT25WYWx1ZUNoYW5nZWRDb3JlKHF1ZXN0aW9uKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBjaGVja1F1ZXN0aW9uRXJyb3JPblZhbHVlQ2hhbmdlZENvcmUocXVlc3Rpb246IFF1ZXN0aW9uKTogYm9vbGVhbiB7XG4gICAgdmFyIG9sZEVycm9yQ291bnQgPSBxdWVzdGlvbi5nZXRBbGxFcnJvcnMoKS5sZW5ndGg7XG4gICAgdmFyIHJlcyA9IHF1ZXN0aW9uLmhhc0Vycm9ycyh0cnVlLCB7XG4gICAgICBpc09uVmFsdWVDaGFuZ2VkOiAhdGhpcy5pc1ZhbGlkYXRlT25WYWx1ZUNoYW5naW5nLFxuICAgIH0pO1xuICAgIGlmIChcbiAgICAgICEhcXVlc3Rpb24ucGFnZSAmJlxuICAgICAgKG9sZEVycm9yQ291bnQgPiAwIHx8IHF1ZXN0aW9uLmdldEFsbEVycm9ycygpLmxlbmd0aCA+IDApXG4gICAgKSB7XG4gICAgICB0aGlzLmZpcmVWYWxpZGF0ZWRFcnJvcnNPblBhZ2UoPFBhZ2VNb2RlbD5xdWVzdGlvbi5wYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIGNoZWNrRXJyb3JzT25WYWx1ZUNoYW5naW5nKFxuICAgIHZhbHVlTmFtZTogc3RyaW5nLFxuICAgIG5ld1ZhbHVlOiBhbnlcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybiBmYWxzZTtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRRdWVzdGlvbnNCeVZhbHVlTmFtZSh2YWx1ZU5hbWUpO1xuICAgIGlmICghcXVlc3Rpb25zKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHJlcyA9IGZhbHNlO1xuICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxID0gcXVlc3Rpb25zW2ldO1xuICAgICAgaWYgKCF0aGlzLmlzVHdvVmFsdWVFcXVhbHMocS52YWx1ZUZvclN1cnZleSwgbmV3VmFsdWUpKSB7XG4gICAgICAgIHEudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNoZWNrUXVlc3Rpb25FcnJvck9uVmFsdWVDaGFuZ2VkQ29yZShxKSkgcmVzID0gdHJ1ZTtcbiAgICAgIHJlcyA9IHJlcyB8fCBxLmVycm9ycy5sZW5ndGggPiAwO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByb3RlY3RlZCBub3RpZnlRdWVzdGlvbk9uVmFsdWVDaGFuZ2VkKHZhbHVlTmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRRdWVzdGlvbnNCeVZhbHVlTmFtZSh2YWx1ZU5hbWUpO1xuICAgIGlmICghIXF1ZXN0aW9ucykge1xuICAgICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcXVlc3Rpb24gPSBxdWVzdGlvbnNbaV07XG4gICAgICAgIHRoaXMuY2hlY2tRdWVzdGlvbkVycm9yT25WYWx1ZUNoYW5nZWQocXVlc3Rpb24pO1xuICAgICAgICBxdWVzdGlvbi5vblN1cnZleVZhbHVlQ2hhbmdlZChuZXdWYWx1ZSk7XG4gICAgICAgIHRoaXMub25WYWx1ZUNoYW5nZWQuZmlyZSh0aGlzLCB7XG4gICAgICAgICAgbmFtZTogdmFsdWVOYW1lLFxuICAgICAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgICAgICB2YWx1ZTogbmV3VmFsdWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkLmZpcmUodGhpcywge1xuICAgICAgICBuYW1lOiB2YWx1ZU5hbWUsXG4gICAgICAgIHF1ZXN0aW9uOiBudWxsLFxuICAgICAgICB2YWx1ZTogbmV3VmFsdWUsXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNEaXNwb3NlZCkgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYWdlc1tpXS5jaGVja0JpbmRpbmdzKHZhbHVlTmFtZSwgbmV3VmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLm5vdGlmeUVsZW1lbnRzT25BbnlWYWx1ZU9yVmFyaWFibGVDaGFuZ2VkKHZhbHVlTmFtZSk7XG4gIH1cbiAgcHJpdmF0ZSBub3RpZnlFbGVtZW50c09uQW55VmFsdWVPclZhcmlhYmxlQ2hhbmdlZChuYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5pc0VuZExvYWRpbmdGcm9tSnNvbiA9PT0gXCJwcm9jZXNzaW5nXCIpIHJldHVybjtcbiAgICBpZiAodGhpcy5pc1J1bm5pbmdDb25kaXRpb25zKSB7XG4gICAgICB0aGlzLmNvbmRpdGlvbk5vdGlmeUVsZW1lbnRzT25BbnlWYWx1ZU9yVmFyaWFibGVDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBhZ2VzW2ldLm9uQW55VmFsdWVDaGFuZ2VkKG5hbWUpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNFbmRMb2FkaW5nRnJvbUpzb24pIHtcbiAgICAgIHRoaXMubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVBbGxRdWVzdGlvbnNWYWx1ZSgpIHtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRBbGxRdWVzdGlvbnMoKTtcbiAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcSA9IDxRdWVzdGlvbj5xdWVzdGlvbnNbaV07XG4gICAgICB2YXIgdmFsTmFtZSA9IHEuZ2V0VmFsdWVOYW1lKCk7XG4gICAgICBxLnVwZGF0ZVZhbHVlRnJvbVN1cnZleSh0aGlzLmdldFZhbHVlKHZhbE5hbWUpKTtcbiAgICAgIGlmIChxLnJlcXVpcmVVcGRhdGVDb21tZW50VmFsdWUpIHtcbiAgICAgICAgcS51cGRhdGVDb21tZW50RnJvbVN1cnZleSh0aGlzLmdldENvbW1lbnQodmFsTmFtZSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIG5vdGlmeUFsbFF1ZXN0aW9uc09uVmFsdWVDaGFuZ2VkKCkge1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldEFsbFF1ZXN0aW9ucygpO1xuICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXN0aW9uc1tpXS5vblN1cnZleVZhbHVlQ2hhbmdlZChcbiAgICAgICAgdGhpcy5nZXRWYWx1ZShxdWVzdGlvbnNbaV0uZ2V0VmFsdWVOYW1lKCkpXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGNoZWNrT25QYWdlVHJpZ2dlcnMoKSB7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0Q3VycmVudFBhZ2VRdWVzdGlvbnModHJ1ZSk7XG4gICAgdmFyIHZhbHVlczogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWVzdGlvbiA9IHF1ZXN0aW9uc1tpXTtcbiAgICAgIHZhciBuYW1lID0gcXVlc3Rpb24uZ2V0VmFsdWVOYW1lKCk7XG4gICAgICB2YWx1ZXNbbmFtZV0gPSB0aGlzLmdldFZhbHVlKG5hbWUpO1xuICAgIH1cbiAgICB0aGlzLmFkZENhbGN1bGF0ZWRWYWx1ZXNJbnRvRmlsdGVyZWRWYWx1ZXModmFsdWVzKTtcbiAgICB0aGlzLmNoZWNrVHJpZ2dlcnModmFsdWVzLCB0cnVlKTtcbiAgfVxuICBwcml2YXRlIGdldEN1cnJlbnRQYWdlUXVlc3Rpb25zKFxuICAgIGluY2x1ZGVJbnZzaWJsZTogYm9vbGVhbiA9IGZhbHNlXG4gICk6IEFycmF5PFF1ZXN0aW9uPiB7XG4gICAgdmFyIHJlc3VsdDogQXJyYXk8UXVlc3Rpb24+ID0gW107XG4gICAgdmFyIHBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlO1xuICAgIGlmICghcGFnZSkgcmV0dXJuIHJlc3VsdDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhZ2UucXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcXVlc3Rpb24gPSBwYWdlLnF1ZXN0aW9uc1tpXTtcbiAgICAgIGlmICgoIWluY2x1ZGVJbnZzaWJsZSAmJiAhcXVlc3Rpb24udmlzaWJsZSkgfHwgIXF1ZXN0aW9uLm5hbWUpIGNvbnRpbnVlO1xuICAgICAgcmVzdWx0LnB1c2gocXVlc3Rpb24pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByaXZhdGUgaXNUcmlnZ2VySXNSdW5uaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgdHJpZ2dlclZhbHVlczogYW55ID0gbnVsbDtcbiAgcHJpdmF0ZSB0cmlnZ2VyS2V5czogYW55ID0gbnVsbDtcbiAgcHJpdmF0ZSBjaGVja1RyaWdnZXJzKGtleTogYW55LCBpc09uTmV4dFBhZ2U6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5pc0NvbXBsZXRlZCB8fCB0aGlzLnRyaWdnZXJzLmxlbmd0aCA9PSAwIHx8IHRoaXMuaXNEaXNwbGF5TW9kZSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmlzVHJpZ2dlcklzUnVubmluZykge1xuICAgICAgdGhpcy50cmlnZ2VyVmFsdWVzID0gdGhpcy5nZXRGaWx0ZXJlZFZhbHVlcygpO1xuICAgICAgZm9yICh2YXIgayBpbiBrZXkpIHtcbiAgICAgICAgdGhpcy50cmlnZ2VyS2V5c1trXSA9IGtleVtrXTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pc1RyaWdnZXJJc1J1bm5pbmcgPSB0cnVlO1xuICAgIHRoaXMudHJpZ2dlcktleXMgPSBrZXk7XG4gICAgdGhpcy50cmlnZ2VyVmFsdWVzID0gdGhpcy5nZXRGaWx0ZXJlZFZhbHVlcygpO1xuICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5nZXRGaWx0ZXJlZFByb3BlcnRpZXMoKTtcbiAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy50cmlnZ2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHRyaWdnZXIgPSB0aGlzLnRyaWdnZXJzW2ldO1xuICAgICAgaWYgKHRyaWdnZXIuaXNPbk5leHRQYWdlID09IGlzT25OZXh0UGFnZSkge1xuICAgICAgICB0cmlnZ2VyLmNoZWNrRXhwcmVzc2lvbihcbiAgICAgICAgICB0aGlzLnRyaWdnZXJLZXlzLFxuICAgICAgICAgIHRoaXMudHJpZ2dlclZhbHVlcyxcbiAgICAgICAgICBwcm9wZXJ0aWVzXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuaXNUcmlnZ2VySXNSdW5uaW5nID0gZmFsc2U7XG4gIH1cbiAgcHJpdmF0ZSBkb0VsZW1lbnRzT25Mb2FkKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYWdlc1tpXS5vblN1cnZleUxvYWQoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBjb25kaXRpb25WYWx1ZXM6IGFueSA9IG51bGw7XG4gIHByaXZhdGUgZ2V0IGlzUnVubmluZ0NvbmRpdGlvbnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5jb25kaXRpb25WYWx1ZXM7XG4gIH1cbiAgcHJpdmF0ZSBpc1ZhbHVlQ2hhbmdlZE9uUnVubmluZ0NvbmRpdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGNvbmRpdGlvblJ1bm5lckNvdW50ZXI6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgY29uZGl0aW9uVXBkYXRlVmlzaWJsZUluZGV4ZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBjb25kaXRpb25Ob3RpZnlFbGVtZW50c09uQW55VmFsdWVPclZhcmlhYmxlQ2hhbmdlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHJ1bkNvbmRpdGlvbnMoKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pc0NvbXBsZXRlZCB8fFxuICAgICAgdGhpcy5pc0VuZExvYWRpbmdGcm9tSnNvbiA9PT0gXCJwcm9jZXNzaW5nXCIgfHxcbiAgICAgIHRoaXMuaXNSdW5uaW5nQ29uZGl0aW9uc1xuICAgIClcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLmNvbmRpdGlvblZhbHVlcyA9IHRoaXMuZ2V0RmlsdGVyZWRWYWx1ZXMoKTtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKCk7XG4gICAgdmFyIG9sZEN1cnJlbnRQYWdlSW5kZXggPSB0aGlzLnBhZ2VzLmluZGV4T2YodGhpcy5jdXJyZW50UGFnZVZhbHVlKTtcbiAgICB0aGlzLnJ1bkNvbmRpdGlvbnNDb3JlKHByb3BlcnRpZXMpO1xuICAgIHRoaXMuY2hlY2tJZk5ld1BhZ2VzQmVjb21lVmlzaWJsZShvbGRDdXJyZW50UGFnZUluZGV4KTtcbiAgICB0aGlzLmNvbmRpdGlvblZhbHVlcyA9IG51bGw7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pc1ZhbHVlQ2hhbmdlZE9uUnVubmluZ0NvbmRpdGlvbiAmJlxuICAgICAgdGhpcy5jb25kaXRpb25SdW5uZXJDb3VudGVyIDxcbiAgICAgIHNldHRpbmdzLm1heGltdW1Db25kaXRpb25SdW5Db3VudE9uVmFsdWVDaGFuZ2VkXG4gICAgKSB7XG4gICAgICB0aGlzLmlzVmFsdWVDaGFuZ2VkT25SdW5uaW5nQ29uZGl0aW9uID0gZmFsc2U7XG4gICAgICB0aGlzLmNvbmRpdGlvblJ1bm5lckNvdW50ZXIrKztcbiAgICAgIHRoaXMucnVuQ29uZGl0aW9ucygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzVmFsdWVDaGFuZ2VkT25SdW5uaW5nQ29uZGl0aW9uID0gZmFsc2U7XG4gICAgICB0aGlzLmNvbmRpdGlvblJ1bm5lckNvdW50ZXIgPSAwO1xuICAgICAgaWYgKHRoaXMuY29uZGl0aW9uVXBkYXRlVmlzaWJsZUluZGV4ZXMpIHtcbiAgICAgICAgdGhpcy5jb25kaXRpb25VcGRhdGVWaXNpYmxlSW5kZXhlcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnVwZGF0ZVZpc2libGVJbmRleGVzKCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb25kaXRpb25Ob3RpZnlFbGVtZW50c09uQW55VmFsdWVPclZhcmlhYmxlQ2hhbmdlZCkge1xuICAgICAgICB0aGlzLmNvbmRpdGlvbk5vdGlmeUVsZW1lbnRzT25BbnlWYWx1ZU9yVmFyaWFibGVDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMubm90aWZ5RWxlbWVudHNPbkFueVZhbHVlT3JWYXJpYWJsZUNoYW5nZWQoXCJcIik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgcnVuQ29uZGl0aW9uT25WYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuaXNSdW5uaW5nQ29uZGl0aW9ucykge1xuICAgICAgdGhpcy5jb25kaXRpb25WYWx1ZXNbbmFtZV0gPSB2YWx1ZTtcbiAgICAgIHRoaXMuaXNWYWx1ZUNoYW5nZWRPblJ1bm5pbmdDb25kaXRpb24gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJ1bkNvbmRpdGlvbnMoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBydW5Db25kaXRpb25zQ29yZShwcm9wZXJ0aWVzOiBhbnkpIHtcbiAgICB2YXIgcGFnZXMgPSB0aGlzLnBhZ2VzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jYWxjdWxhdGVkVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmNhbGN1bGF0ZWRWYWx1ZXNbaV0ucmVzZXRDYWxjdWxhdGlvbigpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2FsY3VsYXRlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5jYWxjdWxhdGVkVmFsdWVzW2ldLmRvQ2FsY3VsYXRpb24oXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlZFZhbHVlcyxcbiAgICAgICAgdGhpcy5jb25kaXRpb25WYWx1ZXMsXG4gICAgICAgIHByb3BlcnRpZXNcbiAgICAgICk7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHBhZ2VzW2ldLnJ1bkNvbmRpdGlvbih0aGlzLmNvbmRpdGlvblZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgY2hlY2tJZk5ld1BhZ2VzQmVjb21lVmlzaWJsZShvbGRDdXJyZW50UGFnZUluZGV4OiBudW1iZXIpIHtcbiAgICB2YXIgbmV3Q3VycmVudFBhZ2VJbmRleCA9IHRoaXMucGFnZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRQYWdlVmFsdWUpO1xuICAgIGlmIChuZXdDdXJyZW50UGFnZUluZGV4IDw9IG9sZEN1cnJlbnRQYWdlSW5kZXggKyAxKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IG9sZEN1cnJlbnRQYWdlSW5kZXggKyAxOyBpIDwgbmV3Q3VycmVudFBhZ2VJbmRleDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5wYWdlc1tpXS5pc1Zpc2libGUpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHRoaXMucGFnZXNbaV07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogU2VuZHMgYSBzdXJ2ZXkgcmVzdWx0IHRvIHRoZSBbYXBpLnN1cnZleWpzLmlvXShodHRwczovL2FwaS5zdXJ2ZXlqcy5pbykgc2VydmljZS5cbiAgICogQHBhcmFtIHBvc3RJZCBbYXBpLnN1cnZleWpzLmlvXShodHRwczovL2FwaS5zdXJ2ZXlqcy5pbykgc2VydmljZSBwb3N0SWRcbiAgICogQHBhcmFtIGNsaWVudElkIFR5cGljYWxseSBhIGN1c3RvbWVyIGUtbWFpbCBvciBhbiBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSBpc1BhcnRpYWxDb21wbGV0ZWQgU2V0IGl0IHRvIGB0cnVlYCBpZiB0aGUgc3VydmV5IGlzIG5vdCBjb21wbGV0ZWQgeWV0IGFuZCB0aGUgcmVzdWx0cyBhcmUgaW50ZXJtZWRpYXRlXG4gICAqIEBzZWUgc3VydmV5UG9zdElkXG4gICAqIEBzZWUgY2xpZW50SWRcbiAgICovXG4gIHB1YmxpYyBzZW5kUmVzdWx0KFxuICAgIHBvc3RJZDogc3RyaW5nID0gbnVsbCxcbiAgICBjbGllbnRJZDogc3RyaW5nID0gbnVsbCxcbiAgICBpc1BhcnRpYWxDb21wbGV0ZWQ6IGJvb2xlYW4gPSBmYWxzZVxuICApIHtcbiAgICBpZiAoIXRoaXMuaXNFZGl0TW9kZSkgcmV0dXJuO1xuICAgIGlmIChpc1BhcnRpYWxDb21wbGV0ZWQgJiYgdGhpcy5vblBhcnRpYWxTZW5kKSB7XG4gICAgICB0aGlzLm9uUGFydGlhbFNlbmQuZmlyZSh0aGlzLCBudWxsKTtcbiAgICB9XG5cbiAgICBpZiAoIXBvc3RJZCAmJiB0aGlzLnN1cnZleVBvc3RJZCkge1xuICAgICAgcG9zdElkID0gdGhpcy5zdXJ2ZXlQb3N0SWQ7XG4gICAgfVxuICAgIGlmICghcG9zdElkKSByZXR1cm47XG4gICAgaWYgKGNsaWVudElkKSB7XG4gICAgICB0aGlzLmNsaWVudElkID0gY2xpZW50SWQ7XG4gICAgfVxuICAgIGlmIChpc1BhcnRpYWxDb21wbGV0ZWQgJiYgIXRoaXMuY2xpZW50SWQpIHJldHVybjtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHRoaXMuc3VydmV5U2hvd0RhdGFTYXZpbmcpIHtcbiAgICAgIHRoaXMuc2V0Q29tcGxldGVkU3RhdGUoXCJzYXZpbmdcIiwgXCJcIik7XG4gICAgfVxuICAgIHRoaXMuY3JlYXRlU3VydmV5U2VydmljZSgpLnNlbmRSZXN1bHQoXG4gICAgICBwb3N0SWQsXG4gICAgICB0aGlzLmRhdGEsXG4gICAgICBmdW5jdGlvbiAoc3VjY2VzczogYm9vbGVhbiwgcmVzcG9uc2U6IGFueSwgcmVxdWVzdDogYW55KSB7XG4gICAgICAgIGlmIChzZWxmLnN1cnZleVNob3dEYXRhU2F2aW5nKSB7XG4gICAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHNlbGYuc2V0Q29tcGxldGVkU3RhdGUoXCJzdWNjZXNzXCIsIFwiXCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWxmLnNldENvbXBsZXRlZFN0YXRlKFwiZXJyb3JcIiwgcmVzcG9uc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZWxmLm9uU2VuZFJlc3VsdC5maXJlKHNlbGYsIHtcbiAgICAgICAgICBzdWNjZXNzOiBzdWNjZXNzLFxuICAgICAgICAgIHJlc3BvbnNlOiByZXNwb25zZSxcbiAgICAgICAgICByZXF1ZXN0OiByZXF1ZXN0LFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICB0aGlzLmNsaWVudElkLFxuICAgICAgaXNQYXJ0aWFsQ29tcGxldGVkXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogQ2FsbHMgdGhlIFthcGkuc3VydmV5anMuaW9dKGh0dHBzOi8vYXBpLnN1cnZleWpzLmlvKSBzZXJ2aWNlIGFuZCwgb24gY2FsbGJhY2ssIGZpcmVzIHRoZSBgb25HZXRSZXN1bHRgIGV2ZW50IHdpdGggYWxsIGFuc3dlcnMgdGhhdCB5b3VyIHVzZXJzIG1hZGUgZm9yIGEgcXVlc3Rpb24uXG4gICAqIEBwYXJhbSByZXN1bHRJZCBbYXBpLnN1cnZleWpzLmlvXShodHRwczovL2FwaS5zdXJ2ZXlqcy5pbykgc2VydmljZSByZXN1bHRJZFxuICAgKiBAcGFyYW0gbmFtZSBUaGUgcXVlc3Rpb24gbmFtZVxuICAgKiBAc2VlIG9uR2V0UmVzdWx0XG4gICAqL1xuICBwdWJsaWMgZ2V0UmVzdWx0KHJlc3VsdElkOiBzdHJpbmcsIG5hbWU6IHN0cmluZykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmNyZWF0ZVN1cnZleVNlcnZpY2UoKS5nZXRSZXN1bHQocmVzdWx0SWQsIG5hbWUsIGZ1bmN0aW9uIChcbiAgICAgIHN1Y2Nlc3M6IGJvb2xlYW4sXG4gICAgICBkYXRhOiBhbnksXG4gICAgICBkYXRhTGlzdDogYW55W10sXG4gICAgICByZXNwb25zZTogYW55XG4gICAgKSB7XG4gICAgICBzZWxmLm9uR2V0UmVzdWx0LmZpcmUoc2VsZiwge1xuICAgICAgICBzdWNjZXNzOiBzdWNjZXNzLFxuICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICBkYXRhTGlzdDogZGF0YUxpc3QsXG4gICAgICAgIHJlc3BvbnNlOiByZXNwb25zZSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgc3VydmV5IEpTT04gZnJvbSB0aGUgW2FwaS5zdXJ2ZXlqcy5pb10oaHR0cHM6Ly9hcGkuc3VydmV5anMuaW8pIHNlcnZpY2UuXG4gICAqIElmIGBjbGllbnRJZGAgaXMgbm90IGBudWxsYCBhbmQgYSB1c2VyIGhhZCBjb21wbGV0ZWQgYSBzdXJ2ZXkgYmVmb3JlLCB0aGUgc3VydmV5IHN3aXRjaGVzIHRvIGBjb21wbGV0ZWRiZWZvcmVgIHN0YXRlLlxuICAgKiBAcGFyYW0gc3VydmV5SWQgW2FwaS5zdXJ2ZXlqcy5pb10oaHR0cHM6Ly9hcGkuc3VydmV5anMuaW8pIHNlcnZpY2Ugc3VydmV5SWRcbiAgICogQHBhcmFtIGNsaWVudElkIHVzZXJzJyBpbmRlbnRpZmllciwgZm9yIGV4YW1wbGUgYW4gZS1tYWlsIG9yIGEgdW5pcXVlIGN1c3RvbWVyIGlkIGluIHlvdXIgd2ViIGFwcGxpY2F0aW9uLlxuICAgKiBAc2VlIHN0YXRlXG4gICAqIEBzZWUgb25Mb2FkZWRTdXJ2ZXlGcm9tU2VydmljZVxuICAgKi9cbiAgcHVibGljIGxvYWRTdXJ2ZXlGcm9tU2VydmljZShcbiAgICBzdXJ2ZXlJZDogc3RyaW5nID0gbnVsbCxcbiAgICBjbGllbmRJZDogc3RyaW5nID0gbnVsbFxuICApIHtcbiAgICBpZiAoc3VydmV5SWQpIHtcbiAgICAgIHRoaXMuc3VydmV5SWQgPSBzdXJ2ZXlJZDtcbiAgICB9XG4gICAgaWYgKGNsaWVuZElkKSB7XG4gICAgICB0aGlzLmNsaWVudElkID0gY2xpZW5kSWQ7XG4gICAgfVxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5vbkxvYWRpbmdTdXJ2ZXlGcm9tU2VydmljZSgpO1xuICAgIGlmIChjbGllbmRJZCkge1xuICAgICAgdGhpcy5jcmVhdGVTdXJ2ZXlTZXJ2aWNlKCkuZ2V0U3VydmV5SnNvbkFuZElzQ29tcGxldGVkKFxuICAgICAgICB0aGlzLnN1cnZleUlkLFxuICAgICAgICB0aGlzLmNsaWVudElkLFxuICAgICAgICBmdW5jdGlvbiAoXG4gICAgICAgICAgc3VjY2VzczogYm9vbGVhbixcbiAgICAgICAgICBqc29uOiBzdHJpbmcsXG4gICAgICAgICAgaXNDb21wbGV0ZWQ6IHN0cmluZyxcbiAgICAgICAgICByZXNwb25zZTogYW55XG4gICAgICAgICkge1xuICAgICAgICAgIHNlbGYuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHNlbGYuaXNDb21wbGV0ZWRCZWZvcmUgPSBpc0NvbXBsZXRlZCA9PSBcImNvbXBsZXRlZFwiO1xuICAgICAgICAgICAgc2VsZi5sb2FkU3VydmV5RnJvbVNlcnZpY2VKc29uKGpzb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jcmVhdGVTdXJ2ZXlTZXJ2aWNlKCkubG9hZFN1cnZleSh0aGlzLnN1cnZleUlkLCBmdW5jdGlvbiAoXG4gICAgICAgIHN1Y2Nlc3M6IGJvb2xlYW4sXG4gICAgICAgIHJlc3VsdDogc3RyaW5nLFxuICAgICAgICByZXNwb25zZTogYW55XG4gICAgICApIHtcbiAgICAgICAgc2VsZi5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICBzZWxmLmxvYWRTdXJ2ZXlGcm9tU2VydmljZUpzb24ocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgbG9hZFN1cnZleUZyb21TZXJ2aWNlSnNvbihqc29uOiBhbnkpIHtcbiAgICBpZiAoIWpzb24pIHJldHVybjtcbiAgICB0aGlzLmZyb21KU09OKGpzb24pO1xuICAgIHRoaXMubm90aWZ5QWxsUXVlc3Rpb25zT25WYWx1ZUNoYW5nZWQoKTtcbiAgICB0aGlzLm9uTG9hZFN1cnZleUZyb21TZXJ2aWNlKCk7XG4gICAgdGhpcy5vbkxvYWRlZFN1cnZleUZyb21TZXJ2aWNlLmZpcmUodGhpcywge30pO1xuICB9XG4gIHByb3RlY3RlZCBvbkxvYWRpbmdTdXJ2ZXlGcm9tU2VydmljZSgpIHsgfVxuICBwcm90ZWN0ZWQgb25Mb2FkU3VydmV5RnJvbVNlcnZpY2UoKSB7IH1cbiAgcHJpdmF0ZSByZXNldFZpc2libGVJbmRleGVzKCkge1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldEFsbFF1ZXN0aW9ucyh0cnVlKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgcXVlc3Rpb25zW2ldLnNldFZpc2libGVJbmRleCgtMSk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZVZpc2libGVJbmRleGVzKCkge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uIHx8ICEhdGhpcy5pc0VuZExvYWRpbmdGcm9tSnNvbikgcmV0dXJuO1xuICAgIGlmIChcbiAgICAgIHRoaXMuaXNSdW5uaW5nQ29uZGl0aW9ucyAmJlxuICAgICAgdGhpcy5vblZpc2libGVDaGFuZ2VkLmlzRW1wdHkgJiZcbiAgICAgIHRoaXMub25QYWdlVmlzaWJsZUNoYW5nZWQuaXNFbXB0eVxuICAgICkge1xuICAgICAgLy9SdW4gdXBkYXRlIHZpc2libGUgaW5kZXggb25seSBvbmUgdGltZSBvbiBmaW5pc2hpbmcgcnVubmluZyBjb25kaXRpb25zXG4gICAgICB0aGlzLmNvbmRpdGlvblVwZGF0ZVZpc2libGVJbmRleGVzID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVQYWdlVmlzaWJsZUluZGV4ZXModGhpcy5zaG93UGFnZU51bWJlcnMpO1xuICAgIGlmICh0aGlzLnNob3dRdWVzdGlvbk51bWJlcnMgPT0gXCJvblBhZ2VcIikge1xuICAgICAgdmFyIHZpc1BhZ2VzID0gdGhpcy52aXNpYmxlUGFnZXM7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZpc1BhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZpc1BhZ2VzW2ldLnNldFZpc2libGVJbmRleCgwKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGluZGV4ID0gdGhpcy5zaG93UXVlc3Rpb25OdW1iZXJzID09IFwib25cIiA/IDAgOiAtMTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpbmRleCArPSB0aGlzLnBhZ2VzW2ldLnNldFZpc2libGVJbmRleChpbmRleCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudXBkYXRlUHJvZ3Jlc3NUZXh0KHRydWUpO1xuICB9XG4gIHByaXZhdGUgdXBkYXRlUGFnZVZpc2libGVJbmRleGVzKHNob3dJbmRleDogYm9vbGVhbikge1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXNQYWdlVmlzaWJsZSA9IHRoaXMucGFnZXNbaV0uaXNWaXNpYmxlO1xuICAgICAgdGhpcy5wYWdlc1tpXS52aXNpYmxlSW5kZXggPSBpc1BhZ2VWaXNpYmxlID8gaW5kZXgrKyA6IC0xO1xuICAgICAgdGhpcy5wYWdlc1tpXS5udW0gPVxuICAgICAgICBzaG93SW5kZXggJiYgaXNQYWdlVmlzaWJsZSA/IHRoaXMucGFnZXNbaV0udmlzaWJsZUluZGV4ICsgMSA6IC0xO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZnJvbUpTT04oanNvbjogYW55KSB7XG4gICAgaWYgKCFqc29uKSByZXR1cm47XG4gICAgdGhpcy5xdWVzdGlvbkhhc2hlc0NsZWFyKCk7XG4gICAgdGhpcy5qc29uRXJyb3JzID0gbnVsbDtcbiAgICB2YXIganNvbkNvbnZlcnRlciA9IG5ldyBKc29uT2JqZWN0KCk7XG4gICAganNvbkNvbnZlcnRlci50b09iamVjdChqc29uLCB0aGlzKTtcbiAgICBpZiAoanNvbkNvbnZlcnRlci5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5qc29uRXJyb3JzID0ganNvbkNvbnZlcnRlci5lcnJvcnM7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBzZXRKc29uT2JqZWN0KGpzb25PYmo6IGFueSkge1xuICAgIHRoaXMuZnJvbUpTT04oanNvbk9iaik7XG4gIH1cbiAgcHJpdmF0ZSBpc0VuZExvYWRpbmdGcm9tSnNvbjogc3RyaW5nID0gbnVsbDtcbiAgZW5kTG9hZGluZ0Zyb21Kc29uKCkge1xuICAgIHRoaXMuaXNFbmRMb2FkaW5nRnJvbUpzb24gPSBcInByb2Nlc3NpbmdcIjtcbiAgICB0aGlzLmlzU3RhcnRlZFN0YXRlID0gdGhpcy5maXJzdFBhZ2VJc1N0YXJ0ZWQ7XG4gICAgdGhpcy5vblF1ZXN0aW9uc09uUGFnZU1vZGVDaGFuZ2VkKFwic3RhbmRhcmRcIik7XG4gICAgc3VwZXIuZW5kTG9hZGluZ0Zyb21Kc29uKCk7XG4gICAgaWYgKHRoaXMuaGFzQ29va2llKSB7XG4gICAgICB0aGlzLmRvQ29tcGxldGUoKTtcbiAgICB9XG4gICAgdGhpcy5kb0VsZW1lbnRzT25Mb2FkKCk7XG4gICAgdGhpcy5pc0VuZExvYWRpbmdGcm9tSnNvbiA9IFwiY29uZGl0aW9uc1wiO1xuICAgIHRoaXMucnVuQ29uZGl0aW9ucygpO1xuICAgIHRoaXMubm90aWZ5RWxlbWVudHNPbkFueVZhbHVlT3JWYXJpYWJsZUNoYW5nZWQoXCJcIik7XG4gICAgdGhpcy5pc0VuZExvYWRpbmdGcm9tSnNvbiA9IG51bGw7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICB9XG4gIHByb3RlY3RlZCBvbkJlZm9yZUNyZWF0aW5nKCkgeyB9XG4gIHByb3RlY3RlZCBvbkNyZWF0aW5nKCkgeyB9XG4gIHByaXZhdGUgZ2V0UHJvY2Vzc2VkVGV4dFZhbHVlKHRleHRWYWx1ZTogVGV4dFByZVByb2Nlc3NvclZhbHVlKTogdm9pZCB7XG4gICAgdGhpcy5nZXRQcm9jZXNzZWRUZXh0VmFsdWVDb3JlKHRleHRWYWx1ZSk7XG4gICAgaWYgKCF0aGlzLm9uUHJvY2Vzc1RleHRWYWx1ZS5pc0VtcHR5KSB7XG4gICAgICB2YXIgd2FzRW1wdHkgPSB0aGlzLmlzVmFsdWVFbXB0eSh0ZXh0VmFsdWUudmFsdWUpO1xuICAgICAgdGhpcy5vblByb2Nlc3NUZXh0VmFsdWUuZmlyZSh0aGlzLCB0ZXh0VmFsdWUpO1xuICAgICAgdGV4dFZhbHVlLmlzRXhpc3RzID1cbiAgICAgICAgdGV4dFZhbHVlLmlzRXhpc3RzIHx8ICh3YXNFbXB0eSAmJiAhdGhpcy5pc1ZhbHVlRW1wdHkodGV4dFZhbHVlLnZhbHVlKSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZ2V0UHJvY2Vzc2VkVGV4dFZhbHVlQ29yZSh0ZXh0VmFsdWU6IFRleHRQcmVQcm9jZXNzb3JWYWx1ZSk6IHZvaWQge1xuICAgIHZhciBuYW1lID0gdGV4dFZhbHVlLm5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICBpZiAoW1wibm9cIiwgXCJyZXF1aXJlXCIsIFwidGl0bGVcIl0uaW5kZXhPZihuYW1lKSAhPT0gLTEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwicGFnZW5vXCIpIHtcbiAgICAgIHRleHRWYWx1ZS5pc0V4aXN0cyA9IHRydWU7XG4gICAgICB2YXIgcGFnZSA9IHRoaXMuY3VycmVudFBhZ2U7XG4gICAgICB0ZXh0VmFsdWUudmFsdWUgPSBwYWdlICE9IG51bGwgPyB0aGlzLnZpc2libGVQYWdlcy5pbmRleE9mKHBhZ2UpICsgMSA6IDA7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcInBhZ2Vjb3VudFwiKSB7XG4gICAgICB0ZXh0VmFsdWUuaXNFeGlzdHMgPSB0cnVlO1xuICAgICAgdGV4dFZhbHVlLnZhbHVlID0gdGhpcy52aXNpYmxlUGFnZUNvdW50O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gXCJsb2NhbGVcIikge1xuICAgICAgdGV4dFZhbHVlLmlzRXhpc3RzID0gdHJ1ZTtcbiAgICAgIHRleHRWYWx1ZS52YWx1ZSA9ICEhdGhpcy5sb2NhbGVcbiAgICAgICAgPyB0aGlzLmxvY2FsZVxuICAgICAgICA6IHN1cnZleUxvY2FsaXphdGlvbi5kZWZhdWx0TG9jYWxlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gXCJjb3JyZWN0ZWRhbnN3ZXJzXCIgfHwgbmFtZSA9PT0gXCJjb3JyZWN0ZWRhbnN3ZXJjb3VudFwiKSB7XG4gICAgICB0ZXh0VmFsdWUuaXNFeGlzdHMgPSB0cnVlO1xuICAgICAgdGV4dFZhbHVlLnZhbHVlID0gdGhpcy5nZXRDb3JyZWN0ZWRBbnN3ZXJDb3VudCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gXCJpbmNvcnJlY3RlZGFuc3dlcnNcIiB8fCBuYW1lID09PSBcImluY29ycmVjdGVkYW5zd2VyY291bnRcIikge1xuICAgICAgdGV4dFZhbHVlLmlzRXhpc3RzID0gdHJ1ZTtcbiAgICAgIHRleHRWYWx1ZS52YWx1ZSA9IHRoaXMuZ2V0SW5Db3JyZWN0ZWRBbnN3ZXJDb3VudCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gXCJxdWVzdGlvbmNvdW50XCIpIHtcbiAgICAgIHRleHRWYWx1ZS5pc0V4aXN0cyA9IHRydWU7XG4gICAgICB0ZXh0VmFsdWUudmFsdWUgPSB0aGlzLmdldFF1aXpRdWVzdGlvbkNvdW50KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB2YXJpYWJsZSA9IHRoaXMuZ2V0VmFyaWFibGUobmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRleHRWYWx1ZS5pc0V4aXN0cyA9IHRydWU7XG4gICAgICB0ZXh0VmFsdWUudmFsdWUgPSB2YXJpYWJsZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5nZXRGaXJzdE5hbWUobmFtZSk7XG4gICAgaWYgKHF1ZXN0aW9uKSB7XG4gICAgICB0ZXh0VmFsdWUuaXNFeGlzdHMgPSB0cnVlO1xuICAgICAgdmFyIGZpcnN0TmFtZSA9IHF1ZXN0aW9uLmdldFZhbHVlTmFtZSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBuYW1lID0gZmlyc3ROYW1lICsgbmFtZS5zdWJzdHIoZmlyc3ROYW1lLmxlbmd0aCk7XG4gICAgICBuYW1lID0gbmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgdmFyIHZhbHVlczogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgICB2YWx1ZXNbZmlyc3ROYW1lXSA9IHRleHRWYWx1ZS5yZXR1cm5EaXNwbGF5VmFsdWVcbiAgICAgICAgPyBxdWVzdGlvbi5nZXREaXNwbGF5VmFsdWUoZmFsc2UsIHVuZGVmaW5lZClcbiAgICAgICAgOiBxdWVzdGlvbi52YWx1ZTtcbiAgICAgIHRleHRWYWx1ZS52YWx1ZSA9IG5ldyBQcm9jZXNzVmFsdWUoKS5nZXRWYWx1ZShuYW1lLCB2YWx1ZXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdmFsdWUgPSB0aGlzLmdldFZhbHVlKHRleHRWYWx1ZS5uYW1lKTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGV4dFZhbHVlLmlzRXhpc3RzID0gdHJ1ZTtcbiAgICAgIHRleHRWYWx1ZS52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldEZpcnN0TmFtZShuYW1lOiBzdHJpbmcpOiBJUXVlc3Rpb24ge1xuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIHF1ZXN0aW9uO1xuICAgIGRvIHtcbiAgICAgIHF1ZXN0aW9uID0gdGhpcy5nZXRRdWVzdGlvbkJ5VmFsdWVOYW1lKG5hbWUsIHRydWUpO1xuICAgICAgbmFtZSA9IHRoaXMucmVkdWNlRmlyc3ROYW1lKG5hbWUpO1xuICAgIH0gd2hpbGUgKCFxdWVzdGlvbiAmJiAhIW5hbWUpO1xuICAgIHJldHVybiBxdWVzdGlvbjtcbiAgfVxuICBwcml2YXRlIHJlZHVjZUZpcnN0TmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHZhciBwb3MxID0gbmFtZS5sYXN0SW5kZXhPZihcIi5cIik7XG4gICAgdmFyIHBvczIgPSBuYW1lLmxhc3RJbmRleE9mKFwiW1wiKTtcbiAgICBpZiAocG9zMSA8IDAgJiYgcG9zMiA8IDApIHJldHVybiBcIlwiO1xuICAgIHZhciBwb3MgPSBNYXRoLm1heChwb3MxLCBwb3MyKTtcbiAgICByZXR1cm4gbmFtZS5zdWJzdHIoMCwgcG9zKTtcbiAgfVxuICBwcml2YXRlIGNsZWFyVW51c2VkVmFsdWVzKCkge1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldEFsbFF1ZXN0aW9ucygpO1xuICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXN0aW9uc1tpXS5jbGVhclVudXNlZFZhbHVlcygpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jbGVhckludmlzaWJsZVZhbHVlcyAhPSBcIm5vbmVcIikge1xuICAgICAgdGhpcy5jbGVhckludmlzaWJsZVF1ZXN0aW9uVmFsdWVzKCk7XG4gICAgfVxuICB9XG4gIGhhc1Zpc2libGVRdWVzdGlvbkJ5VmFsdWVOYW1lKHZhbHVlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0UXVlc3Rpb25zQnlWYWx1ZU5hbWUodmFsdWVOYW1lKTtcbiAgICBpZiAoIXF1ZXN0aW9ucykgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChxdWVzdGlvbnNbaV0uaXNWaXNpYmxlKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHF1ZXN0aW9uQ291bnRCeVZhbHVlTmFtZSh2YWx1ZU5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0UXVlc3Rpb25zQnlWYWx1ZU5hbWUodmFsdWVOYW1lKTtcbiAgICByZXR1cm4gISFxdWVzdGlvbnMgPyBxdWVzdGlvbnMubGVuZ3RoIDogMDtcbiAgfVxuICBwcml2YXRlIGNsZWFySW52aXNpYmxlUXVlc3Rpb25WYWx1ZXMoKSB7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0QWxsUXVlc3Rpb25zKCk7XG4gICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgcXVlc3Rpb25zW2ldLmNsZWFyVmFsdWVJZkludmlzaWJsZSgpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIHZhcmlhYmxlIHZhbHVlLiBWYXJpYWJsZSwgdW5saWtlIHZhbHVlcywgYXJlIG5vdCBzdG9yZWQgaW4gdGhlIHN1cnZleSByZXN1bHRzLlxuICAgKiBAcGFyYW0gbmFtZSBBIHZhcmlhYmxlIG5hbWVcbiAgICogQHNlZSBTZXRWYXJpYWJsZVxuICAgKi9cbiAgcHVibGljIGdldFZhcmlhYmxlKG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKCFuYW1lKSByZXR1cm4gbnVsbDtcbiAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciByZXMgPSB0aGlzLnZhcmlhYmxlc0hhc2hbbmFtZV07XG4gICAgaWYgKCF0aGlzLmlzVmFsdWVFbXB0eShyZXMpKSByZXR1cm4gcmVzO1xuICAgIGlmIChuYW1lLmluZGV4T2YoXCIuXCIpID4gLTEgfHwgbmFtZS5pbmRleE9mKFwiW1wiKSA+IC0xKSB7XG4gICAgICBpZiAobmV3IFByb2Nlc3NWYWx1ZSgpLmhhc1ZhbHVlKG5hbWUsIHRoaXMudmFyaWFibGVzSGFzaCkpXG4gICAgICAgIHJldHVybiBuZXcgUHJvY2Vzc1ZhbHVlKCkuZ2V0VmFsdWUobmFtZSwgdGhpcy52YXJpYWJsZXNIYXNoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICAvKipcbiAgICogU2V0cyBhIHZhcmlhYmxlIHZhbHVlLiBWYXJpYWJsZSwgdW5saWtlIHZhbHVlcywgYXJlIG5vdCBzdG9yZWQgaW4gdGhlIHN1cnZleSByZXN1bHRzLlxuICAgKiBAcGFyYW0gbmFtZSBBIHZhcmlhYmxlIG5hbWVcbiAgICogQHBhcmFtIG5ld1ZhbHVlIEEgdmFyaWFibGUgbmV3IHZhbHVlXG4gICAqIEBzZWUgR2V0VmFyaWFibGVcbiAgICovXG4gIHB1YmxpYyBzZXRWYXJpYWJsZShuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIW5hbWUpIHJldHVybjtcbiAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHRoaXMudmFyaWFibGVzSGFzaFtuYW1lXSA9IG5ld1ZhbHVlO1xuICAgIHRoaXMubm90aWZ5RWxlbWVudHNPbkFueVZhbHVlT3JWYXJpYWJsZUNoYW5nZWQobmFtZSk7XG4gICAgdGhpcy5ydW5Db25kaXRpb25PblZhbHVlQ2hhbmdlZChuYW1lLCBuZXdWYWx1ZSk7XG4gICAgdGhpcy5vblZhcmlhYmxlQ2hhbmdlZC5maXJlKHRoaXMsIHsgbmFtZTogbmFtZSwgdmFsdWU6IG5ld1ZhbHVlIH0pO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCB2YXJpYWJsZXMgaW4gdGhlIHN1cnZleS4gVXNlIHNldFZhcmlhYmxlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyB2YXJpYWJsZS5cbiAgICogQHNlZSBnZXRWYXJpYWJsZVxuICAgKiBAc2VlIHNldFZhcmlhYmxlXG4gICAqL1xuICBwdWJsaWMgZ2V0VmFyaWFibGVOYW1lcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMudmFyaWFibGVzSGFzaCkge1xuICAgICAgcmVzLnB1c2goa2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICAvL0lTdXJ2ZXkgZGF0YVxuICBwcm90ZWN0ZWQgZ2V0VW5iaW5kVmFsdWUodmFsdWU6IGFueSk6IGFueSB7XG4gICAgaWYgKCEhdGhpcy5lZGl0aW5nT2JqKSByZXR1cm4gdmFsdWU7XG4gICAgcmV0dXJuIEhlbHBlcnMuZ2V0VW5iaW5kVmFsdWUodmFsdWUpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcXVlc3Rpb24gdmFsdWUgKGFuc3dlcikgYnkgYSBxdWVzdGlvbidzIG5hbWUuXG4gICAqIEBwYXJhbSBuYW1lIEEgcXVlc3Rpb24gbmFtZVxuICAgKiBAc2VlIGRhdGFcbiAgICogQHNlZSBzZXRWYWx1ZVxuICAgKi9cbiAgcHVibGljIGdldFZhbHVlKG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKCFuYW1lIHx8IG5hbWUubGVuZ3RoID09IDApIHJldHVybiBudWxsO1xuICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0RGF0YVZhbHVlQ29yZSh0aGlzLnZhbHVlc0hhc2gsIG5hbWUpO1xuICAgIHJldHVybiB0aGlzLmdldFVuYmluZFZhbHVlKHZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogU2V0cyBhIHF1ZXN0aW9uIHZhbHVlIChhbnN3ZXIpLiBJdCBydW5zIGFsbCB0cmlnZ2VycyBhbmQgY29uZGl0aW9ucyAoYHZpc2libGVJZmAgcHJvcGVydGllcykuXG4gICAqXG4gICAqIEdvZXMgdG8gdGhlIG5leHQgcGFnZSBpZiBgZ29OZXh0UGFnZUF1dG9tYXRpY2AgaXMgYHRydWVgIGFuZCBhbGwgcXVlc3Rpb25zIG9uIHRoZSBjdXJyZW50IHBhZ2UgYXJlIGFuc3dlcmVkIGNvcnJlY3RseS5cbiAgICogQHBhcmFtIG5hbWUgQSBxdWVzdGlvbiBuYW1lXG4gICAqIEBwYXJhbSBuZXdWYWx1ZSBBIG5ldyBxdWVzdGlvbiB2YWx1ZVxuICAgKiBAc2VlIGRhdGFcbiAgICogQHNlZSBnZXRWYWx1ZVxuICAgKiBAc2VlIFBhZ2VNb2RlbC52aXNpYmxlSWZcbiAgICogQHNlZSBRdWVzdGlvbi52aXNpYmxlSWZcbiAgICogQHNlZSBnb05leHRQYWdlQXV0b21hdGljXG4gICAqL1xuICBwdWJsaWMgc2V0VmFsdWUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG5ld1F1ZXN0aW9uVmFsdWU6IGFueSxcbiAgICBsb2NOb3RpZmljYXRpb246IGFueSA9IGZhbHNlLFxuICAgIGFsbG93Tm90aWZ5VmFsdWVDaGFuZ2VkOiBib29sZWFuID0gdHJ1ZVxuICApIHtcbiAgICB2YXIgbmV3VmFsdWUgPSBuZXdRdWVzdGlvblZhbHVlO1xuICAgIGlmIChhbGxvd05vdGlmeVZhbHVlQ2hhbmdlZCkge1xuICAgICAgbmV3VmFsdWUgPSB0aGlzLnF1ZXN0aW9uT25WYWx1ZUNoYW5naW5nKG5hbWUsIG5ld1F1ZXN0aW9uVmFsdWUpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLmlzVmFsaWRhdGVPblZhbHVlQ2hhbmdpbmcgJiZcbiAgICAgIHRoaXMuY2hlY2tFcnJvcnNPblZhbHVlQ2hhbmdpbmcobmFtZSwgbmV3VmFsdWUpXG4gICAgKVxuICAgICAgcmV0dXJuO1xuICAgIGlmIChcbiAgICAgICF0aGlzLmVkaXRpbmdPYmogJiZcbiAgICAgIHRoaXMuaXNWYWx1ZUVxdWFsKG5hbWUsIG5ld1ZhbHVlKSAmJlxuICAgICAgdGhpcy5pc1R3b1ZhbHVlRXF1YWxzKG5ld1ZhbHVlLCBuZXdRdWVzdGlvblZhbHVlKVxuICAgIClcbiAgICAgIHJldHVybjtcbiAgICB2YXIgb2xkVmFsdWUgPSB0aGlzLmdldFZhbHVlKG5hbWUpO1xuICAgIGlmICh0aGlzLmlzVmFsdWVFbXB0eShuZXdWYWx1ZSkpIHtcbiAgICAgIHRoaXMuZGVsZXRlRGF0YVZhbHVlQ29yZSh0aGlzLnZhbHVlc0hhc2gsIG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdWYWx1ZSA9IHRoaXMuZ2V0VW5iaW5kVmFsdWUobmV3VmFsdWUpO1xuICAgICAgdGhpcy5zZXREYXRhVmFsdWVDb3JlKHRoaXMudmFsdWVzSGFzaCwgbmFtZSwgbmV3VmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZU9uU2V0VmFsdWUoXG4gICAgICBuYW1lLFxuICAgICAgbmV3VmFsdWUsXG4gICAgICBvbGRWYWx1ZSxcbiAgICAgIGxvY05vdGlmaWNhdGlvbixcbiAgICAgIGFsbG93Tm90aWZ5VmFsdWVDaGFuZ2VkXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZU9uU2V0VmFsdWUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG5ld1ZhbHVlOiBhbnksXG4gICAgb2xkVmFsdWU6IGFueSxcbiAgICBsb2NOb3RpZmljYXRpb246IGFueSA9IGZhbHNlLFxuICAgIGFsbG93Tm90aWZ5VmFsdWVDaGFuZ2VkOiBib29sZWFuID0gdHJ1ZVxuICApIHtcbiAgICB0aGlzLnVwZGF0ZVF1ZXN0aW9uVmFsdWUobmFtZSwgbmV3VmFsdWUpO1xuICAgIGlmIChsb2NOb3RpZmljYXRpb24gPT09IHRydWUgfHwgdGhpcy5pc0Rpc3Bvc2VkKSByZXR1cm47XG4gICAgdmFyIHRyaWdnZXJLZXlzOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICB0cmlnZ2VyS2V5c1tuYW1lXSA9IHsgbmV3VmFsdWU6IG5ld1ZhbHVlLCBvbGRWYWx1ZTogb2xkVmFsdWUgfTtcbiAgICB0aGlzLnJ1bkNvbmRpdGlvbk9uVmFsdWVDaGFuZ2VkKG5hbWUsIG5ld1ZhbHVlKTtcbiAgICB0aGlzLmNoZWNrVHJpZ2dlcnModHJpZ2dlcktleXMsIGZhbHNlKTtcbiAgICBpZiAoYWxsb3dOb3RpZnlWYWx1ZUNoYW5nZWQpXG4gICAgICB0aGlzLm5vdGlmeVF1ZXN0aW9uT25WYWx1ZUNoYW5nZWQobmFtZSwgbmV3VmFsdWUpO1xuICAgIGlmIChsb2NOb3RpZmljYXRpb24gIT09IFwidGV4dFwiKSB7XG4gICAgICB0aGlzLnRyeUdvTmV4dFBhZ2VBdXRvbWF0aWMobmFtZSk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlUHJvZ3Jlc3NUZXh0KHRydWUpO1xuICB9XG4gIHByaXZhdGUgaXNWYWx1ZUVxdWFsKG5hbWU6IHN0cmluZywgbmV3VmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmIChuZXdWYWx1ZSA9PT0gXCJcIiB8fCBuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSBuZXdWYWx1ZSA9IG51bGw7XG4gICAgdmFyIG9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZShuYW1lKTtcbiAgICBpZiAob2xkVmFsdWUgPT09IFwiXCIgfHwgb2xkVmFsdWUgPT09IHVuZGVmaW5lZCkgb2xkVmFsdWUgPSBudWxsO1xuICAgIGlmIChuZXdWYWx1ZSA9PT0gbnVsbCB8fCBvbGRWYWx1ZSA9PT0gbnVsbCkgcmV0dXJuIG5ld1ZhbHVlID09PSBvbGRWYWx1ZTtcbiAgICByZXR1cm4gdGhpcy5pc1R3b1ZhbHVlRXF1YWxzKG5ld1ZhbHVlLCBvbGRWYWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGRvT25QYWdlQWRkZWQocGFnZTogUGFnZU1vZGVsKSB7XG4gICAgcGFnZS5zZXRTdXJ2ZXlJbXBsKHRoaXMpO1xuICAgIGlmICghcGFnZS5uYW1lKSBwYWdlLm5hbWUgPSB0aGlzLmdlbmVyYXRlTmV3TmFtZSh0aGlzLnBhZ2VzLCBcInBhZ2VcIik7XG4gICAgdGhpcy5xdWVzdGlvbkhhc2hlc1BhbmVsQWRkZWQocGFnZSk7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkge1xuICAgICAgdGhpcy51cGRhdGVQcm9ncmVzc1RleHQoKTtcbiAgICB9XG4gICAgdmFyIG9wdGlvbnMgPSB7IHBhZ2U6IHBhZ2UgfTtcbiAgICB0aGlzLm9uUGFnZUFkZGVkLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gIH1cbiAgcHJvdGVjdGVkIGRvT25QYWdlUmVtb3ZlZChwYWdlOiBQYWdlTW9kZWwpIHtcbiAgICBwYWdlLnNldFN1cnZleUltcGwobnVsbCk7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkge1xuICAgICAgdGhpcy51cGRhdGVQcm9ncmVzc1RleHQoKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVMYXp5UmVuZGVyaW5nUm93c09uUmVtb3ZpbmdFbGVtZW50cygpO1xuICB9XG4gIHByaXZhdGUgZ2VuZXJhdGVOZXdOYW1lKGVsZW1lbnRzOiBBcnJheTxhbnk+LCBiYXNlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB2YXIga2V5czogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykga2V5c1tlbGVtZW50c1tpXVtcIm5hbWVcIl1dID0gdHJ1ZTtcbiAgICB2YXIgaW5kZXggPSAxO1xuICAgIHdoaWxlIChrZXlzW2Jhc2VOYW1lICsgaW5kZXhdKSBpbmRleCsrO1xuICAgIHJldHVybiBiYXNlTmFtZSArIGluZGV4O1xuICB9XG4gIHByb3RlY3RlZCB0cnlHb05leHRQYWdlQXV0b21hdGljKG5hbWU6IHN0cmluZykge1xuICAgIGlmIChcbiAgICAgICEhdGhpcy5pc0VuZExvYWRpbmdGcm9tSnNvbiB8fFxuICAgICAgIXRoaXMuZ29OZXh0UGFnZUF1dG9tYXRpYyB8fFxuICAgICAgIXRoaXMuY3VycmVudFBhZ2VcbiAgICApXG4gICAgICByZXR1cm47XG4gICAgdmFyIHF1ZXN0aW9uID0gPFF1ZXN0aW9uPnRoaXMuZ2V0UXVlc3Rpb25CeVZhbHVlTmFtZShuYW1lKTtcbiAgICBpZiAoXG4gICAgICAhcXVlc3Rpb24gfHxcbiAgICAgICghIXF1ZXN0aW9uICYmXG4gICAgICAgICghcXVlc3Rpb24udmlzaWJsZSB8fCAhcXVlc3Rpb24uc3VwcG9ydEdvTmV4dFBhZ2VBdXRvbWF0aWMoKSkpXG4gICAgKVxuICAgICAgcmV0dXJuO1xuICAgIGlmIChxdWVzdGlvbi5oYXNFcnJvcnMoZmFsc2UpICYmICFxdWVzdGlvbi5zdXBwb3J0R29OZXh0UGFnZUVycm9yKCkpIHJldHVybjtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRDdXJyZW50UGFnZVF1ZXN0aW9ucygpO1xuICAgIGlmIChxdWVzdGlvbnMuaW5kZXhPZihxdWVzdGlvbikgPCAwKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChxdWVzdGlvbnNbaV0uaGFzSW5wdXQgJiYgcXVlc3Rpb25zW2ldLmlzRW1wdHkoKSkgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuY2hlY2tJc0N1cnJlbnRQYWdlSGFzRXJyb3JzKGZhbHNlKSkge1xuICAgICAgaWYgKCF0aGlzLmlzTGFzdFBhZ2UpIHtcbiAgICAgICAgdGhpcy5uZXh0UGFnZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZ29OZXh0UGFnZUF1dG9tYXRpYyA9PT0gdHJ1ZSAmJlxuICAgICAgICAgIHRoaXMuYWxsb3dDb21wbGV0ZVN1cnZleUF1dG9tYXRpY1xuICAgICAgICApIHtcbiAgICAgICAgICBpZih0aGlzLmlzU2hvd1ByZXZpZXdCZWZvcmVDb21wbGV0ZSkge1xuICAgICAgICAgICAgdGhpcy5zaG93UHJldmlldygpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNvbXBsZXRlTGFzdFBhZ2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbW1lbnQgdmFsdWUuXG4gICAqIEBwYXJhbSBuYW1lIEEgY29tbWVudCdzIG5hbWUuXG4gICAqIEBzZWUgc2V0Q29tbWVudFxuICAgKi9cbiAgcHVibGljIGdldENvbW1lbnQobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5kYXRhW25hbWUgKyB0aGlzLmNvbW1lbnRQcmVmaXhdO1xuICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gXCJcIjtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qKlxuICAgKiBTZXRzIGEgY29tbWVudCB2YWx1ZS5cbiAgICogQHBhcmFtIG5hbWUgQSBjb21tZW50IG5hbWUuXG4gICAqIEBwYXJhbSBuZXdWYWx1ZSBBIG5ldyBjb21tZW50IHZhbHVlLlxuICAgKiBAc2VlIGdldENvbW1lbnRcbiAgICovXG4gIHB1YmxpYyBzZXRDb21tZW50KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBuZXdWYWx1ZTogc3RyaW5nLFxuICAgIGxvY05vdGlmaWNhdGlvbjogYW55ID0gZmFsc2VcbiAgKSB7XG4gICAgaWYgKCFuZXdWYWx1ZSkgbmV3VmFsdWUgPSBcIlwiO1xuICAgIGlmICh0aGlzLmlzVHdvVmFsdWVFcXVhbHMobmV3VmFsdWUsIHRoaXMuZ2V0Q29tbWVudChuYW1lKSkpIHJldHVybjtcbiAgICB2YXIgY29tbWVudE5hbWUgPSBuYW1lICsgdGhpcy5jb21tZW50UHJlZml4O1xuICAgIGlmICh0aGlzLmlzVmFsdWVFbXB0eShuZXdWYWx1ZSkpIHtcbiAgICAgIHRoaXMuZGVsZXRlRGF0YVZhbHVlQ29yZSh0aGlzLnZhbHVlc0hhc2gsIGNvbW1lbnROYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXREYXRhVmFsdWVDb3JlKHRoaXMudmFsdWVzSGFzaCwgY29tbWVudE5hbWUsIG5ld1ZhbHVlKTtcbiAgICB9XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0UXVlc3Rpb25zQnlWYWx1ZU5hbWUobmFtZSk7XG4gICAgaWYgKCEhcXVlc3Rpb25zKSB7XG4gICAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHF1ZXN0aW9uc1tpXS51cGRhdGVDb21tZW50RnJvbVN1cnZleShuZXdWYWx1ZSk7XG4gICAgICAgIHRoaXMuY2hlY2tRdWVzdGlvbkVycm9yT25WYWx1ZUNoYW5nZWQocXVlc3Rpb25zW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGxvY05vdGlmaWNhdGlvbiAhPT0gXCJ0ZXh0XCIpIHtcbiAgICAgIHRoaXMudHJ5R29OZXh0UGFnZUF1dG9tYXRpYyhuYW1lKTtcbiAgICB9XG4gICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5nZXRRdWVzdGlvbkJ5TmFtZShuYW1lKTtcbiAgICBpZiAocXVlc3Rpb24pIHtcbiAgICAgIHRoaXMub25WYWx1ZUNoYW5nZWQuZmlyZSh0aGlzLCB7XG4gICAgICAgIG5hbWU6IGNvbW1lbnROYW1lLFxuICAgICAgICBxdWVzdGlvbjogcXVlc3Rpb24sXG4gICAgICAgIHZhbHVlOiBuZXdWYWx1ZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmVtb3ZlcyBhIHZhbHVlIGZyb20gdGhlIHN1cnZleSByZXN1bHRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgdmFsdWUuIFR5cGljYWxseSBpdCBpcyBhIHF1ZXN0aW9uIG5hbWUuXG4gICAqL1xuICBwdWJsaWMgY2xlYXJWYWx1ZShuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFZhbHVlKG5hbWUsIG51bGwpO1xuICAgIHRoaXMuc2V0Q29tbWVudChuYW1lLCBudWxsKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHdoZXRoZXIgdG8gY2xlYXIgdmFsdWUgb24gZGlzYWJsZSBpdGVtcyBpbiBjaGVja2JveCwgZHJvcGRvd24gYW5kIHJhZGlvZ3JvdXAgcXVlc3Rpb25zLlxuICAgKiBCeSBkZWZhdWx0LCB2YWx1ZXMgYXJlIG5vdCBjbGVhcmVkIG9uIGRpc2FibGVkIHRoZSBjb3JyZXNwb25kZWQgaXRlbXMuIFRoaXMgcHJvcGVydHkgaXMgbm90IHBlcnNpc3RlZCBpbiBzdXJ2ZXkgSlNPTiBhbmQgeW91IGhhdmUgdG8gc2V0IGl0IGluIGNvZGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNsZWFyVmFsdWVPbkRpc2FibGVJdGVtcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY2xlYXJWYWx1ZU9uRGlzYWJsZUl0ZW1zXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNsZWFyVmFsdWVPbkRpc2FibGVJdGVtcyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjbGVhclZhbHVlT25EaXNhYmxlSXRlbXNcIiwgdmFsKTtcbiAgfVxuICBnZXQgaXNDbGVhclZhbHVlT25IaWRkZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuY2xlYXJJbnZpc2libGVWYWx1ZXMgPT0gXCJvbkhpZGRlblwiIHx8XG4gICAgICB0aGlzLmlzQ2xlYXJWYWx1ZU9uSGlkZGVuQ29udGFpbmVyXG4gICAgKTtcbiAgfVxuICBnZXQgaXNDbGVhclZhbHVlT25IaWRkZW5Db250YWluZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuY2xlYXJJbnZpc2libGVWYWx1ZXMgPT0gXCJvbkhpZGRlbkNvbnRhaW5lclwiICYmXG4gICAgICAhdGhpcy5pc1Nob3dpbmdQcmV2aWV3ICYmXG4gICAgICAhdGhpcy5ydW5uaW5nUGFnZXNcbiAgICApO1xuICB9XG4gIHF1ZXN0aW9uVmlzaWJpbGl0eUNoYW5nZWQocXVlc3Rpb246IElRdWVzdGlvbiwgbmV3VmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVJbmRleGVzKCk7XG4gICAgdGhpcy5vblZpc2libGVDaGFuZ2VkLmZpcmUodGhpcywge1xuICAgICAgcXVlc3Rpb246IHF1ZXN0aW9uLFxuICAgICAgbmFtZTogcXVlc3Rpb24ubmFtZSxcbiAgICAgIHZpc2libGU6IG5ld1ZhbHVlLFxuICAgIH0pO1xuICB9XG4gIHBhZ2VWaXNpYmlsaXR5Q2hhbmdlZChwYWdlOiBJUGFnZSwgbmV3VmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuO1xuICAgIGlmIChuZXdWYWx1ZSAmJiAhdGhpcy5jdXJyZW50UGFnZVZhbHVlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlVmFsdWUgPSB0aGlzLmN1cnJlbnRQYWdlO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVZpc2libGVJbmRleGVzKCk7XG4gICAgdGhpcy5vblBhZ2VWaXNpYmxlQ2hhbmdlZC5maXJlKHRoaXMsIHtcbiAgICAgIHBhZ2U6IHBhZ2UsXG4gICAgICB2aXNpYmxlOiBuZXdWYWx1ZSxcbiAgICB9KTtcbiAgfVxuICBwYW5lbFZpc2liaWxpdHlDaGFuZ2VkKHBhbmVsOiBJUGFuZWwsIG5ld1ZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICAgIHRoaXMub25QYW5lbFZpc2libGVDaGFuZ2VkLmZpcmUodGhpcywge1xuICAgICAgcGFuZWw6IHBhbmVsLFxuICAgICAgdmlzaWJsZTogbmV3VmFsdWUsXG4gICAgfSk7XG4gIH1cbiAgcXVlc3Rpb25DcmVhdGVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24pOiBhbnkge1xuICAgIHRoaXMub25RdWVzdGlvbkNyZWF0ZWQuZmlyZSh0aGlzLCB7IHF1ZXN0aW9uOiBxdWVzdGlvbiB9KTtcbiAgfVxuICBxdWVzdGlvbkFkZGVkKFxuICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBwYXJlbnRQYW5lbDogYW55LFxuICAgIHJvb3RQYW5lbDogYW55XG4gICkge1xuICAgIGlmICghcXVlc3Rpb24ubmFtZSkge1xuICAgICAgcXVlc3Rpb24ubmFtZSA9IHRoaXMuZ2VuZXJhdGVOZXdOYW1lKFxuICAgICAgICB0aGlzLmdldEFsbFF1ZXN0aW9ucyhmYWxzZSwgdHJ1ZSksXG4gICAgICAgIFwicXVlc3Rpb25cIlxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCEhKDxRdWVzdGlvbj5xdWVzdGlvbikucGFnZSkge1xuICAgICAgdGhpcy5xdWVzdGlvbkhhc2hlc0FkZGVkKDxRdWVzdGlvbj5xdWVzdGlvbik7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgICB0aGlzLm9uUXVlc3Rpb25BZGRlZC5maXJlKHRoaXMsIHtcbiAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgIG5hbWU6IHF1ZXN0aW9uLm5hbWUsXG4gICAgICBpbmRleDogaW5kZXgsXG4gICAgICBwYXJlbnRQYW5lbDogcGFyZW50UGFuZWwsXG4gICAgICByb290UGFuZWw6IHJvb3RQYW5lbCxcbiAgICB9KTtcbiAgfVxuICBxdWVzdGlvblJlbW92ZWQocXVlc3Rpb246IElRdWVzdGlvbikge1xuICAgIHRoaXMucXVlc3Rpb25IYXNoZXNSZW1vdmVkKFxuICAgICAgPFF1ZXN0aW9uPnF1ZXN0aW9uLFxuICAgICAgcXVlc3Rpb24ubmFtZSxcbiAgICAgIHF1ZXN0aW9uLmdldFZhbHVlTmFtZSgpXG4gICAgKTtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVJbmRleGVzKCk7XG4gICAgdGhpcy5vblF1ZXN0aW9uUmVtb3ZlZC5maXJlKHRoaXMsIHtcbiAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgIG5hbWU6IHF1ZXN0aW9uLm5hbWUsXG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGVMYXp5UmVuZGVyaW5nUm93c09uUmVtb3ZpbmdFbGVtZW50cygpO1xuICB9XG4gIHF1ZXN0aW9uUmVuYW1lZChcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgIG9sZE5hbWU6IHN0cmluZyxcbiAgICBvbGRWYWx1ZU5hbWU6IHN0cmluZ1xuICApOiBhbnkge1xuICAgIHRoaXMucXVlc3Rpb25IYXNoZXNSZW1vdmVkKDxRdWVzdGlvbj5xdWVzdGlvbiwgb2xkTmFtZSwgb2xkVmFsdWVOYW1lKTtcbiAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzQWRkZWQoPFF1ZXN0aW9uPnF1ZXN0aW9uKTtcbiAgfVxuICBwcml2YXRlIHF1ZXN0aW9uSGFzaGVzID0ge1xuICAgIG5hbWVzOiB7fSxcbiAgICBuYW1lc0luc2Vuc2l0aXZlOiB7fSxcbiAgICB2YWx1ZU5hbWVzOiB7fSxcbiAgICB2YWx1ZU5hbWVzSW5zZW5zaXRpdmU6IHt9LFxuICB9O1xuICBwcml2YXRlIHF1ZXN0aW9uSGFzaGVzQ2xlYXIoKSB7XG4gICAgdGhpcy5xdWVzdGlvbkhhc2hlcy5uYW1lcyA9IHt9O1xuICAgIHRoaXMucXVlc3Rpb25IYXNoZXMubmFtZXNJbnNlbnNpdGl2ZSA9IHt9O1xuICAgIHRoaXMucXVlc3Rpb25IYXNoZXMudmFsdWVOYW1lcyA9IHt9O1xuICAgIHRoaXMucXVlc3Rpb25IYXNoZXMudmFsdWVOYW1lc0luc2Vuc2l0aXZlID0ge307XG4gIH1cbiAgcHJpdmF0ZSBxdWVzdGlvbkhhc2hlc1BhbmVsQWRkZWQocGFuZWw6IFBhbmVsTW9kZWxCYXNlKSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB2YXIgcXVlc3Rpb25zID0gcGFuZWwucXVlc3Rpb25zO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzQWRkZWQocXVlc3Rpb25zW2ldKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBxdWVzdGlvbkhhc2hlc0FkZGVkKHF1ZXN0aW9uOiBRdWVzdGlvbikge1xuICAgIHRoaXMucXVlc3Rpb25IYXNoQWRkZWRDb3JlKFxuICAgICAgdGhpcy5xdWVzdGlvbkhhc2hlcy5uYW1lcyxcbiAgICAgIHF1ZXN0aW9uLFxuICAgICAgcXVlc3Rpb24ubmFtZVxuICAgICk7XG4gICAgdGhpcy5xdWVzdGlvbkhhc2hBZGRlZENvcmUoXG4gICAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzLm5hbWVzSW5zZW5zaXRpdmUsXG4gICAgICBxdWVzdGlvbixcbiAgICAgIHF1ZXN0aW9uLm5hbWUudG9Mb3dlckNhc2UoKVxuICAgICk7XG4gICAgdGhpcy5xdWVzdGlvbkhhc2hBZGRlZENvcmUoXG4gICAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzLnZhbHVlTmFtZXMsXG4gICAgICBxdWVzdGlvbixcbiAgICAgIHF1ZXN0aW9uLmdldFZhbHVlTmFtZSgpXG4gICAgKTtcbiAgICB0aGlzLnF1ZXN0aW9uSGFzaEFkZGVkQ29yZShcbiAgICAgIHRoaXMucXVlc3Rpb25IYXNoZXMudmFsdWVOYW1lc0luc2Vuc2l0aXZlLFxuICAgICAgcXVlc3Rpb24sXG4gICAgICBxdWVzdGlvbi5nZXRWYWx1ZU5hbWUoKS50b0xvd2VyQ2FzZSgpXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIHF1ZXN0aW9uSGFzaGVzUmVtb3ZlZChcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHZhbHVlTmFtZTogc3RyaW5nXG4gICkge1xuICAgIGlmICghIW5hbWUpIHtcbiAgICAgIHRoaXMucXVlc3Rpb25IYXNoUmVtb3ZlZENvcmUodGhpcy5xdWVzdGlvbkhhc2hlcy5uYW1lcywgcXVlc3Rpb24sIG5hbWUpO1xuICAgICAgdGhpcy5xdWVzdGlvbkhhc2hSZW1vdmVkQ29yZShcbiAgICAgICAgdGhpcy5xdWVzdGlvbkhhc2hlcy5uYW1lc0luc2Vuc2l0aXZlLFxuICAgICAgICBxdWVzdGlvbixcbiAgICAgICAgbmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoISF2YWx1ZU5hbWUpIHtcbiAgICAgIHRoaXMucXVlc3Rpb25IYXNoUmVtb3ZlZENvcmUoXG4gICAgICAgIHRoaXMucXVlc3Rpb25IYXNoZXMudmFsdWVOYW1lcyxcbiAgICAgICAgcXVlc3Rpb24sXG4gICAgICAgIHZhbHVlTmFtZVxuICAgICAgKTtcbiAgICAgIHRoaXMucXVlc3Rpb25IYXNoUmVtb3ZlZENvcmUoXG4gICAgICAgIHRoaXMucXVlc3Rpb25IYXNoZXMudmFsdWVOYW1lc0luc2Vuc2l0aXZlLFxuICAgICAgICBxdWVzdGlvbixcbiAgICAgICAgdmFsdWVOYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgcXVlc3Rpb25IYXNoQWRkZWRDb3JlKGhhc2g6IGFueSwgcXVlc3Rpb246IFF1ZXN0aW9uLCBuYW1lOiBzdHJpbmcpIHtcbiAgICB2YXIgcmVzID0gaGFzaFtuYW1lXTtcbiAgICBpZiAoISFyZXMpIHtcbiAgICAgIHZhciByZXMgPSBoYXNoW25hbWVdO1xuICAgICAgaWYgKHJlcy5pbmRleE9mKHF1ZXN0aW9uKSA8IDApIHtcbiAgICAgICAgcmVzLnB1c2gocXVlc3Rpb24pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBoYXNoW25hbWVdID0gW3F1ZXN0aW9uXTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBxdWVzdGlvbkhhc2hSZW1vdmVkQ29yZShoYXNoOiBhbnksIHF1ZXN0aW9uOiBRdWVzdGlvbiwgbmFtZTogc3RyaW5nKSB7XG4gICAgdmFyIHJlcyA9IGhhc2hbbmFtZV07XG4gICAgaWYgKCFyZXMpIHJldHVybjtcbiAgICB2YXIgaW5kZXggPSByZXMuaW5kZXhPZihxdWVzdGlvbik7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIHJlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgICBpZiAocmVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICBkZWxldGUgaGFzaFtuYW1lXTtcbiAgICB9XG4gIH1cbiAgcGFuZWxBZGRlZChwYW5lbDogSUVsZW1lbnQsIGluZGV4OiBudW1iZXIsIHBhcmVudFBhbmVsOiBhbnksIHJvb3RQYW5lbDogYW55KSB7XG4gICAgaWYgKCFwYW5lbC5uYW1lKSB7XG4gICAgICBwYW5lbC5uYW1lID0gdGhpcy5nZW5lcmF0ZU5ld05hbWUoXG4gICAgICAgIHRoaXMuZ2V0QWxsUGFuZWxzKGZhbHNlLCB0cnVlKSxcbiAgICAgICAgXCJwYW5lbFwiXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzUGFuZWxBZGRlZCg8UGFuZWxNb2RlbEJhc2U+KDxhbnk+cGFuZWwpKTtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVJbmRleGVzKCk7XG4gICAgdGhpcy5vblBhbmVsQWRkZWQuZmlyZSh0aGlzLCB7XG4gICAgICBwYW5lbDogcGFuZWwsXG4gICAgICBuYW1lOiBwYW5lbC5uYW1lLFxuICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgcGFyZW50UGFuZWw6IHBhcmVudFBhbmVsLFxuICAgICAgcm9vdFBhbmVsOiByb290UGFuZWwsXG4gICAgfSk7XG4gIH1cbiAgcGFuZWxSZW1vdmVkKHBhbmVsOiBJRWxlbWVudCkge1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgICB0aGlzLm9uUGFuZWxSZW1vdmVkLmZpcmUodGhpcywgeyBwYW5lbDogcGFuZWwsIG5hbWU6IHBhbmVsLm5hbWUgfSk7XG4gICAgdGhpcy51cGRhdGVMYXp5UmVuZGVyaW5nUm93c09uUmVtb3ZpbmdFbGVtZW50cygpO1xuICB9XG4gIHZhbGlkYXRlUXVlc3Rpb24ocXVlc3Rpb246IElRdWVzdGlvbik6IFN1cnZleUVycm9yIHtcbiAgICBpZiAodGhpcy5vblZhbGlkYXRlUXVlc3Rpb24uaXNFbXB0eSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICBuYW1lOiBxdWVzdGlvbi5uYW1lLFxuICAgICAgcXVlc3Rpb246IHF1ZXN0aW9uLFxuICAgICAgdmFsdWU6IHF1ZXN0aW9uLnZhbHVlLFxuICAgICAgZXJyb3I6IDxhbnk+bnVsbCxcbiAgICB9O1xuICAgIHRoaXMub25WYWxpZGF0ZVF1ZXN0aW9uLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG9wdGlvbnMuZXJyb3IgPyBuZXcgQ3VzdG9tRXJyb3Iob3B0aW9ucy5lcnJvciwgdGhpcykgOiBudWxsO1xuICB9XG4gIHZhbGlkYXRlUGFuZWwocGFuZWw6IElQYW5lbCk6IFN1cnZleUVycm9yIHtcbiAgICBpZiAodGhpcy5vblZhbGlkYXRlUGFuZWwuaXNFbXB0eSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICBuYW1lOiBwYW5lbC5uYW1lLFxuICAgICAgcGFuZWw6IHBhbmVsLFxuICAgICAgZXJyb3I6IDxhbnk+bnVsbCxcbiAgICB9O1xuICAgIHRoaXMub25WYWxpZGF0ZVBhbmVsLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG9wdGlvbnMuZXJyb3IgPyBuZXcgQ3VzdG9tRXJyb3Iob3B0aW9ucy5lcnJvciwgdGhpcykgOiBudWxsO1xuICB9XG4gIHByb2Nlc3NIdG1sKGh0bWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdmFyIG9wdGlvbnMgPSB7IGh0bWw6IGh0bWwgfTtcbiAgICB0aGlzLm9uUHJvY2Vzc0h0bWwuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzVGV4dChvcHRpb25zLmh0bWwsIHRydWUpO1xuICB9XG4gIHByb2Nlc3NUZXh0KHRleHQ6IHN0cmluZywgcmV0dXJuRGlzcGxheVZhbHVlOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzVGV4dEV4KHRleHQsIHJldHVybkRpc3BsYXlWYWx1ZSwgZmFsc2UpLnRleHQ7XG4gIH1cbiAgcHJvY2Vzc1RleHRFeChcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgcmV0dXJuRGlzcGxheVZhbHVlOiBib29sZWFuLFxuICAgIGRvRW5jb2Rpbmc6IGJvb2xlYW5cbiAgKTogYW55IHtcbiAgICB2YXIgcmVzID0ge1xuICAgICAgdGV4dDogdGhpcy5wcm9jZXNzVGV4dENvcmUodGV4dCwgcmV0dXJuRGlzcGxheVZhbHVlLCBkb0VuY29kaW5nKSxcbiAgICAgIGhhc0FsbFZhbHVlc09uTGFzdFJ1bjogdHJ1ZSxcbiAgICB9O1xuICAgIHJlcy5oYXNBbGxWYWx1ZXNPbkxhc3RSdW4gPSB0aGlzLnRleHRQcmVQcm9jZXNzb3IuaGFzQWxsVmFsdWVzT25MYXN0UnVuO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBwcm9jZXNzVGV4dENvcmUoXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIHJldHVybkRpc3BsYXlWYWx1ZTogYm9vbGVhbixcbiAgICBkb0VuY29kaW5nOiBib29sZWFuID0gZmFsc2VcbiAgKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUpIHJldHVybiB0ZXh0O1xuICAgIHJldHVybiB0aGlzLnRleHRQcmVQcm9jZXNzb3IucHJvY2Vzcyh0ZXh0LCByZXR1cm5EaXNwbGF5VmFsdWUsIGRvRW5jb2RpbmcpO1xuICB9XG4gIGdldFN1cnZleU1hcmtkb3duSHRtbChlbGVtZW50OiBCYXNlLCB0ZXh0OiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICBlbGVtZW50OiBlbGVtZW50LFxuICAgICAgdGV4dDogdGV4dCxcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICBodG1sOiA8YW55Pm51bGwsXG4gICAgfTtcbiAgICB0aGlzLm9uVGV4dE1hcmtkb3duLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG9wdGlvbnMuaHRtbDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhbiBhbW91bnQgb2YgY29ycmVjdGVkIHF1aXogYW5zd2Vycy5cbiAgICovXG4gIHB1YmxpYyBnZXRDb3JyZWN0ZWRBbnN3ZXJDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldENvcnJlY3RlZEFuc3dlckNvdW50Q29yZSh0cnVlKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBxdWl6IHF1ZXN0aW9uIG51bWJlci4gSXQgbWF5IGJlIGRpZmZlcmVudCBmcm9tIGBnZXRRdWl6UXVlc3Rpb25zLmxlbmd0aGAgYmVjYXVzZSBzb21lIHdpZGdldHMgbGlrZSBtYXRyaXggbWF5IGhhdmUgc2V2ZXJhbCBxdWVzdGlvbnMuXG4gICAqIEBzZWUgZ2V0UXVpelF1ZXN0aW9uc1xuICAgKi9cbiAgcHVibGljIGdldFF1aXpRdWVzdGlvbkNvdW50KCk6IG51bWJlciB7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0UXVpelF1ZXN0aW9ucygpO1xuICAgIHZhciByZXMgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXMgKz0gKDxRdWVzdGlvbj5xdWVzdGlvbnNbaV0pLnF1aXpRdWVzdGlvbkNvdW50O1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGFtb3VudCBvZiBpbmNvcnJlY3QgcXVpeiBhbnN3ZXJzLlxuICAgKi9cbiAgcHVibGljIGdldEluQ29ycmVjdGVkQW5zd2VyQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb3JyZWN0ZWRBbnN3ZXJDb3VudENvcmUoZmFsc2UpO1xuICB9XG4gIHByaXZhdGUgZ2V0Q29ycmVjdGVkQW5zd2VyQ291bnRDb3JlKGlzQ29ycmVjdDogYm9vbGVhbik6IG51bWJlciB7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0UXVpelF1ZXN0aW9ucygpO1xuICAgIHZhciBjb3VudGVyID0gMDtcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIHF1ZXN0aW9uOiA8SVF1ZXN0aW9uPm51bGwsXG4gICAgICByZXN1bHQ6IGZhbHNlLFxuICAgICAgY29ycmVjdEFuc3dlcnM6IDAsXG4gICAgICBpbmNvcnJlY3RBbnN3ZXJzOiAwLFxuICAgIH07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxID0gPFF1ZXN0aW9uPnF1ZXN0aW9uc1tpXTtcbiAgICAgIHZhciBxdWl6UXVlc3Rpb25Db3VudCA9IHEucXVpelF1ZXN0aW9uQ291bnQ7XG4gICAgICBvcHRpb25zLnF1ZXN0aW9uID0gcTtcbiAgICAgIG9wdGlvbnMuY29ycmVjdEFuc3dlcnMgPSBxLmNvcnJlY3RBbnN3ZXJDb3VudDtcbiAgICAgIG9wdGlvbnMuaW5jb3JyZWN0QW5zd2VycyA9IHF1aXpRdWVzdGlvbkNvdW50IC0gb3B0aW9ucy5jb3JyZWN0QW5zd2VycztcbiAgICAgIG9wdGlvbnMucmVzdWx0ID0gb3B0aW9ucy5xdWVzdGlvbi5pc0Fuc3dlckNvcnJlY3QoKTtcbiAgICAgIHRoaXMub25Jc0Fuc3dlckNvcnJlY3QuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICAgIGlmIChpc0NvcnJlY3QpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMucmVzdWx0IHx8IG9wdGlvbnMuY29ycmVjdEFuc3dlcnMgPCBxdWl6UXVlc3Rpb25Db3VudCkge1xuICAgICAgICAgIHZhciBhZGRDb3VudCA9IG9wdGlvbnMuY29ycmVjdEFuc3dlcnM7XG4gICAgICAgICAgaWYgKGFkZENvdW50ID09IDAgJiYgb3B0aW9ucy5yZXN1bHQpIGFkZENvdW50ID0gMTtcbiAgICAgICAgICBjb3VudGVyICs9IGFkZENvdW50O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIW9wdGlvbnMucmVzdWx0IHx8IG9wdGlvbnMuaW5jb3JyZWN0QW5zd2VycyA8IHF1aXpRdWVzdGlvbkNvdW50KSB7XG4gICAgICAgICAgY291bnRlciArPSBvcHRpb25zLmluY29ycmVjdEFuc3dlcnM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvdW50ZXI7XG4gIH1cbiAgZ2V0Q29ycmVjdGVkQW5zd2VycygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldENvcnJlY3RlZEFuc3dlckNvdW50KCk7XG4gIH1cbiAgZ2V0SW5Db3JyZWN0ZWRBbnN3ZXJzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SW5Db3JyZWN0ZWRBbnN3ZXJDb3VudCgpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgYSB0aW1lciBwYW5lbCBwb3NpdGlvbi4gVGhlIHRpbWVyIHBhbmVsIGRpc3BsYXlzIGluZm9ybWF0aW9uIGFib3V0IGhvdyBtdWNoIHRpbWUgYW4gZW5kIHVzZXIgc3BlbmRzIG9uIGEgc3VydmV5L3BhZ2UuXG4gICAqXG4gICAqIFRoZSBhdmFpbGFibGUgb3B0aW9uczpcbiAgICogLSBgdG9wYCAtIGRpc3BsYXkgdGltZXIgcGFuZWwgaW4gdGhlIHRvcC5cbiAgICogLSBgYm90dG9tYCAtIGRpc3BsYXkgdGltZXIgcGFuZWwgaW4gdGhlIGJvdHRvbS5cbiAgICogLSBgbm9uZWAgLSBkbyBub3QgZGlzcGxheSBhIHRpbWVyIHBhbmVsLlxuICAgKlxuICAgKiBJZiB0aGUgdmFsdWUgaXMgbm90IGVxdWFsIHRvICdub25lJywgdGhlIHN1cnZleSBjYWxscyB0aGUgYHN0YXJ0VGltZXIoKWAgbWV0aG9kIG9uIHN1cnZleSByZW5kZXJpbmcuXG4gICAqIEBzZWUgc2hvd1RpbWVyUGFuZWxNb2RlXG4gICAqIEBzZWUgc3RhcnRUaW1lclxuICAgKiBAc2VlIHN0b3BUaW1lclxuICAgKi9cbiAgcHVibGljIGdldCBzaG93VGltZXJQYW5lbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93VGltZXJQYW5lbFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dUaW1lclBhbmVsKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1RpbWVyUGFuZWxcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzVGltZXJQYW5lbFNob3dpbmdPblRvcCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1RpbWVyU3RhcnRlZCAmJiB0aGlzLnNob3dUaW1lclBhbmVsID09IFwidG9wXCI7XG4gIH1cbiAgcHVibGljIGdldCBpc1RpbWVyUGFuZWxTaG93aW5nT25Cb3R0b20oKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUaW1lclN0YXJ0ZWQgJiYgdGhpcy5zaG93VGltZXJQYW5lbCA9PSBcImJvdHRvbVwiO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldCBhIHZhbHVlIHRoYXQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIHRpbWVyIGRpc3BsYXlzIGluZm9ybWF0aW9uIGZvciB0aGUgcGFnZSBvciBmb3IgdGhlIGVudGlyZSBzdXJ2ZXkuXG4gICAqXG4gICAqIFRoZSBhdmFpbGFibGUgb3B0aW9uczpcbiAgICpcbiAgICogLSBgcGFnZWAgLSBzaG93IHRpbWVyIGluZm9ybWF0aW9uIGZvciBwYWdlXG4gICAqIC0gYHN1cnZleWAgLSBzaG93IHRpbWVyIGluZm9ybWF0aW9uIGZvciBzdXJ2ZXlcbiAgICpcbiAgICogVXNlIHRoZSBgb25UaW1lclBhbmVsSW5mb1RleHRgIGV2ZW50IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB0ZXh0LlxuICAgKiBAc2VlIHNob3dUaW1lclBhbmVsXG4gICAqIEBzZWUgb25UaW1lclBhbmVsSW5mb1RleHRcbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1RpbWVyUGFuZWxNb2RlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dUaW1lclBhbmVsTW9kZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dUaW1lclBhbmVsTW9kZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dUaW1lclBhbmVsTW9kZVwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgdGltZXJJbmZvVGV4dCgpOiBzdHJpbmcge1xuICAgIHZhciBvcHRpb25zID0geyB0ZXh0OiB0aGlzLmdldFRpbWVySW5mb1RleHQoKSB9O1xuICAgIHRoaXMub25UaW1lclBhbmVsSW5mb1RleHQuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICB2YXIgbG9jID0gbmV3IExvY2FsaXphYmxlU3RyaW5nKHRoaXMsIHRydWUpO1xuICAgIGxvYy50ZXh0ID0gb3B0aW9ucy50ZXh0O1xuICAgIHJldHVybiBsb2MudGV4dE9ySHRtbDtcbiAgfVxuICBwcml2YXRlIGdldFRpbWVySW5mb1RleHQoKSB7XG4gICAgdmFyIHBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlO1xuICAgIGlmICghcGFnZSkgcmV0dXJuIFwiXCI7XG4gICAgdmFyIHBhZ2VTcGVudCA9IHRoaXMuZ2V0RGlzcGxheVRpbWUocGFnZS50aW1lU3BlbnQpO1xuICAgIHZhciBzdXJ2ZXlTcGVudCA9IHRoaXMuZ2V0RGlzcGxheVRpbWUodGhpcy50aW1lU3BlbnQpO1xuICAgIHZhciBwYWdlTGltaXRTZWMgPSB0aGlzLmdldFBhZ2VNYXhUaW1lVG9GaW5pc2gocGFnZSk7XG4gICAgdmFyIHBhZ2VMaW1pdCA9IHRoaXMuZ2V0RGlzcGxheVRpbWUocGFnZUxpbWl0U2VjKTtcbiAgICB2YXIgc3VydmV5TGltaXQgPSB0aGlzLmdldERpc3BsYXlUaW1lKHRoaXMubWF4VGltZVRvRmluaXNoKTtcbiAgICBpZiAodGhpcy5zaG93VGltZXJQYW5lbE1vZGUgPT0gXCJwYWdlXCIpXG4gICAgICByZXR1cm4gdGhpcy5nZXRUaW1lckluZm9QYWdlVGV4dChwYWdlLCBwYWdlU3BlbnQsIHBhZ2VMaW1pdCk7XG4gICAgaWYgKHRoaXMuc2hvd1RpbWVyUGFuZWxNb2RlID09IFwic3VydmV5XCIpXG4gICAgICByZXR1cm4gdGhpcy5nZXRUaW1lckluZm9TdXJ2ZXlUZXh0KHN1cnZleVNwZW50LCBzdXJ2ZXlMaW1pdCk7XG4gICAgaWYgKHRoaXMuc2hvd1RpbWVyUGFuZWxNb2RlID09IFwiYWxsXCIpIHtcbiAgICAgIGlmIChwYWdlTGltaXRTZWMgPD0gMCAmJiB0aGlzLm1heFRpbWVUb0ZpbmlzaCA8PSAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldExvY1N0cmluZyhcInRpbWVyU3BlbnRBbGxcIilbXCJmb3JtYXRcIl0oXG4gICAgICAgICAgcGFnZVNwZW50LFxuICAgICAgICAgIHN1cnZleVNwZW50XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAocGFnZUxpbWl0U2VjID4gMCAmJiB0aGlzLm1heFRpbWVUb0ZpbmlzaCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TG9jU3RyaW5nKFwidGltZXJMaW1pdEFsbFwiKVtcImZvcm1hdFwiXShcbiAgICAgICAgICBwYWdlU3BlbnQsXG4gICAgICAgICAgcGFnZUxpbWl0LFxuICAgICAgICAgIHN1cnZleVNwZW50LFxuICAgICAgICAgIHN1cnZleUxpbWl0XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBsZXQgcGFnZVRleHQgPSB0aGlzLmdldFRpbWVySW5mb1BhZ2VUZXh0KHBhZ2UsIHBhZ2VTcGVudCwgcGFnZUxpbWl0KTtcbiAgICAgIGxldCBzdXJ2ZXlUZXh0ID0gdGhpcy5nZXRUaW1lckluZm9TdXJ2ZXlUZXh0KHN1cnZleVNwZW50LCBzdXJ2ZXlMaW1pdCk7XG4gICAgICByZXR1cm4gcGFnZVRleHQgKyBcIiBcIiArIHN1cnZleVRleHQ7XG4gICAgfVxuICAgIHJldHVybiBcIlwiO1xuICB9XG4gIHByaXZhdGUgZ2V0VGltZXJJbmZvUGFnZVRleHQoXG4gICAgcGFnZTogUGFnZU1vZGVsLFxuICAgIHBhZ2VTcGVudDogc3RyaW5nLFxuICAgIHBhZ2VMaW1pdDogc3RyaW5nXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UGFnZU1heFRpbWVUb0ZpbmlzaChwYWdlKSA+IDBcbiAgICAgID8gdGhpcy5nZXRMb2NTdHJpbmcoXCJ0aW1lckxpbWl0UGFnZVwiKVtcImZvcm1hdFwiXShwYWdlU3BlbnQsIHBhZ2VMaW1pdClcbiAgICAgIDogdGhpcy5nZXRMb2NTdHJpbmcoXCJ0aW1lclNwZW50UGFnZVwiKVtcImZvcm1hdFwiXShwYWdlU3BlbnQsIHBhZ2VMaW1pdCk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRUaW1lckluZm9TdXJ2ZXlUZXh0KFxuICAgIHN1cnZleVNwZW50OiBzdHJpbmcsXG4gICAgc3VydmV5TGltaXQ6IHN0cmluZ1xuICApOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm1heFRpbWVUb0ZpbmlzaCA+IDBcbiAgICAgID8gdGhpcy5nZXRMb2NTdHJpbmcoXCJ0aW1lckxpbWl0U3VydmV5XCIpW1wiZm9ybWF0XCJdKFxuICAgICAgICBzdXJ2ZXlTcGVudCxcbiAgICAgICAgc3VydmV5TGltaXRcbiAgICAgIClcbiAgICAgIDogdGhpcy5nZXRMb2NTdHJpbmcoXCJ0aW1lclNwZW50U3VydmV5XCIpW1wiZm9ybWF0XCJdKFxuICAgICAgICBzdXJ2ZXlTcGVudCxcbiAgICAgICAgc3VydmV5TGltaXRcbiAgICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBnZXREaXNwbGF5VGltZSh2YWw6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgbWluOiBudW1iZXIgPSBNYXRoLmZsb29yKHZhbCAvIDYwKTtcbiAgICBjb25zdCBzZWM6IG51bWJlciA9IHZhbCAlIDYwO1xuICAgIGxldCByZXM6IHN0cmluZyA9IFwiXCI7XG4gICAgaWYgKG1pbiA+IDApIHtcbiAgICAgIHJlcyArPSBtaW4gKyBcIiBcIiArIHRoaXMuZ2V0TG9jU3RyaW5nKFwidGltZXJNaW5cIik7XG4gICAgfVxuICAgIGlmIChyZXMgJiYgc2VjID09IDApIHJldHVybiByZXM7XG4gICAgaWYgKHJlcykgcmVzICs9IFwiIFwiO1xuICAgIHJldHVybiByZXMgKyBzZWMgKyBcIiBcIiArIHRoaXMuZ2V0TG9jU3RyaW5nKFwidGltZXJTZWNcIik7XG4gIH1cbiAgcHJpdmF0ZSB0aW1lckZ1bmM6IGFueSA9IG51bGw7XG4gIC8qKlxuICAgKiBTdGFydHMgYSB0aW1lciB0aGF0IHdpbGwgY2FsY3VsYXRlIGhvdyBtdWNoIHRpbWUgZW5kLXVzZXIgc3BlbmRzIG9uIHRoZSBzdXJ2ZXkgb3Igb24gcGFnZXMuXG4gICAqIEBzZWUgc3RvcFRpbWVyXG4gICAqIEBzZWUgdGltZVNwZW50XG4gICAqL1xuICBwdWJsaWMgc3RhcnRUaW1lcigpIHtcbiAgICBpZiAodGhpcy5pc1RpbWVyU3RhcnRlZCB8fCB0aGlzLmlzRGVzaWduTW9kZSkgcmV0dXJuO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnRpbWVyRnVuYyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYuZG9UaW1lcigpO1xuICAgIH07XG4gICAgdGhpcy5pc1RpbWVyU3RhcnRlZCA9IHRydWU7XG4gICAgU3VydmV5VGltZXIuaW5zdGFuY2Uuc3RhcnQodGhpcy50aW1lckZ1bmMpO1xuICB9XG4gIHN0YXJ0VGltZXJGcm9tVUkoKSB7XG4gICAgaWYgKHRoaXMuc2hvd1RpbWVyUGFuZWwgIT0gXCJub25lXCIgJiYgdGhpcy5zdGF0ZSA9PT0gXCJydW5uaW5nXCIpIHtcbiAgICAgIHRoaXMuc3RhcnRUaW1lcigpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogU3RvcHMgdGhlIHRpbWVyLlxuICAgKiBAc2VlIHN0YXJ0VGltZXJcbiAgICogQHNlZSB0aW1lU3BlbnRcbiAgICovXG4gIHB1YmxpYyBzdG9wVGltZXIoKSB7XG4gICAgaWYgKCF0aGlzLmlzVGltZXJTdGFydGVkKSByZXR1cm47XG4gICAgdGhpcy5pc1RpbWVyU3RhcnRlZCA9IGZhbHNlO1xuICAgIFN1cnZleVRpbWVyLmluc3RhbmNlLnN0b3AodGhpcy50aW1lckZ1bmMpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0aW1lIGluIHNlY29uZHMgYW4gZW5kIHVzZXIgc3BlbmRzIG9uIHRoZSBzdXJ2ZXlcbiAgICogQHNlZSBzdGFydFRpbWVyXG4gICAqIEBzZWUgUGFnZU1vZGVsLnRpbWVTcGVudFxuICAgKi9cbiAgcHVibGljIHRpbWVTcGVudCA9IDA7XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIG1heGltdW0gdGltZSBpbiBzZWNvbmRzIHRoYXQgZW5kIHVzZXIgaGFzIHRvIGNvbXBsZXRlIGEgc3VydmV5LiBJZiB0aGUgdmFsdWUgaXMgMCBvciBsZXNzLCBhbiBlbmQgdXNlciBoYXMgbm8gdGltZSBsaW1pdCB0byBmaW5pc2ggYSBzdXJ2ZXkuXG4gICAqIEBzZWUgc3RhcnRUaW1lclxuICAgKiBAc2VlIG1heFRpbWVUb0ZpbmlzaFBhZ2VcbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4VGltZVRvRmluaXNoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1heFRpbWVUb0ZpbmlzaFwiLCAwKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heFRpbWVUb0ZpbmlzaCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1heFRpbWVUb0ZpbmlzaFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIG1heGltdW0gdGltZSBpbiBzZWNvbmRzIHRoYXQgZW5kIHVzZXIgaGFzIHRvIGNvbXBsZXRlIGEgcGFnZSBpbiB0aGUgc3VydmV5LiBJZiB0aGUgdmFsdWUgaXMgMCBvciBsZXNzLCBhbiBlbmQgdXNlciBoYXMgbm8gdGltZSBsaW1pdC5cbiAgICpcbiAgICogWW91IG1heSBvdmVycmlkZSB0aGlzIHZhbHVlIGZvciBldmVyeSBwYWdlLlxuICAgKiBAc2VlIHN0YXJ0VGltZXJcbiAgICogQHNlZSBtYXhUaW1lVG9GaW5pc2hcbiAgICogQHNlZSBQYWdlTW9kZWwubWF4VGltZVRvRmluaXNoXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heFRpbWVUb0ZpbmlzaFBhZ2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWF4VGltZVRvRmluaXNoUGFnZVwiLCAwKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heFRpbWVUb0ZpbmlzaFBhZ2UodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtYXhUaW1lVG9GaW5pc2hQYWdlXCIsIHZhbCk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRQYWdlTWF4VGltZVRvRmluaXNoKHBhZ2U6IFBhZ2VNb2RlbCkge1xuICAgIGlmICghcGFnZSB8fCBwYWdlLm1heFRpbWVUb0ZpbmlzaCA8IDApIHJldHVybiAwO1xuICAgIHJldHVybiBwYWdlLm1heFRpbWVUb0ZpbmlzaCA+IDBcbiAgICAgID8gcGFnZS5tYXhUaW1lVG9GaW5pc2hcbiAgICAgIDogdGhpcy5tYXhUaW1lVG9GaW5pc2hQYWdlO1xuICB9XG4gIHByb3RlY3RlZCBkb1RpbWVyKCkge1xuICAgIHZhciBwYWdlID0gdGhpcy5jdXJyZW50UGFnZTtcbiAgICBpZiAocGFnZSkge1xuICAgICAgcGFnZS50aW1lU3BlbnQgPSBwYWdlLnRpbWVTcGVudCArIDE7XG4gICAgfVxuICAgIHRoaXMudGltZVNwZW50ID0gdGhpcy50aW1lU3BlbnQgKyAxO1xuICAgIHRoaXMub25UaW1lci5maXJlKHRoaXMsIHt9KTtcbiAgICBpZiAodGhpcy5tYXhUaW1lVG9GaW5pc2ggPiAwICYmIHRoaXMubWF4VGltZVRvRmluaXNoID09IHRoaXMudGltZVNwZW50KSB7XG4gICAgICB0aGlzLmNvbXBsZXRlTGFzdFBhZ2UoKTtcbiAgICB9XG4gICAgaWYgKHBhZ2UpIHtcbiAgICAgIHZhciBwYWdlTGltaXQgPSB0aGlzLmdldFBhZ2VNYXhUaW1lVG9GaW5pc2gocGFnZSk7XG4gICAgICBpZiAocGFnZUxpbWl0ID4gMCAmJiBwYWdlTGltaXQgPT0gcGFnZS50aW1lU3BlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNMYXN0UGFnZSkge1xuICAgICAgICAgIHRoaXMuY29tcGxldGVMYXN0UGFnZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubmV4dFBhZ2UoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0IGluU3VydmV5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vSVN1cnZleUltcGxlbWVudG9yXG4gIGdldFN1cnZleURhdGEoKTogSVN1cnZleURhdGEge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGdldFN1cnZleSgpOiBJU3VydmV5IHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBnZXRUZXh0UHJvY2Vzc29yKCk6IElUZXh0UHJvY2Vzc29yIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvL0lTdXJ2ZXlUcmlnZ2VyT3duZXJcbiAgZ2V0T2JqZWN0cyhwYWdlczogc3RyaW5nW10sIHF1ZXN0aW9uczogc3RyaW5nW10pOiBhbnlbXSB7XG4gICAgdmFyIHJlc3VsdDogYW55W10gPSBbXTtcbiAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShyZXN1bHQsIHRoaXMuZ2V0UGFnZXNCeU5hbWVzKHBhZ2VzKSk7XG4gICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkocmVzdWx0LCB0aGlzLmdldFF1ZXN0aW9uc0J5TmFtZXMocXVlc3Rpb25zKSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBzZXRUcmlnZ2VyVmFsdWUobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBpc1ZhcmlhYmxlOiBib29sZWFuKSB7XG4gICAgaWYgKCFuYW1lKSByZXR1cm47XG4gICAgaWYgKGlzVmFyaWFibGUpIHtcbiAgICAgIHRoaXMuc2V0VmFyaWFibGUobmFtZSwgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmdldFF1ZXN0aW9uQnlOYW1lKG5hbWUpO1xuICAgICAgaWYgKCEhcXVlc3Rpb24pIHtcbiAgICAgICAgcXVlc3Rpb24udmFsdWUgPSB2YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBwcm9jZXNzb3IgPSBuZXcgUHJvY2Vzc1ZhbHVlKCk7XG4gICAgICAgIHZhciBmaXJzdE5hbWUgPSBwcm9jZXNzb3IuZ2V0Rmlyc3ROYW1lKG5hbWUpO1xuICAgICAgICBpZiAoZmlyc3ROYW1lID09IG5hbWUpIHtcbiAgICAgICAgICB0aGlzLnNldFZhbHVlKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIXRoaXMuZ2V0UXVlc3Rpb25CeU5hbWUoZmlyc3ROYW1lKSkgcmV0dXJuO1xuICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5nZXRVbmJpbmRWYWx1ZSh0aGlzLmdldEZpbHRlcmVkVmFsdWVzKCkpO1xuICAgICAgICAgIHByb2Nlc3Nvci5zZXRWYWx1ZShkYXRhLCBuYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgdGhpcy5zZXRWYWx1ZShmaXJzdE5hbWUsIGRhdGFbZmlyc3ROYW1lXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29weVRyaWdnZXJWYWx1ZShuYW1lOiBzdHJpbmcsIGZyb21OYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoIW5hbWUgfHwgIWZyb21OYW1lKSByZXR1cm47XG4gICAgdmFyIHByb2Nlc3NvciA9IG5ldyBQcm9jZXNzVmFsdWUoKTtcbiAgICB2YXIgdmFsdWUgPSBwcm9jZXNzb3IuZ2V0VmFsdWUoZnJvbU5hbWUsIHRoaXMuZ2V0RmlsdGVyZWRWYWx1ZXMoKSk7XG4gICAgdGhpcy5zZXRUcmlnZ2VyVmFsdWUobmFtZSwgdmFsdWUsIGZhbHNlKTtcbiAgfVxuICBwcml2YXRlIGlzRm9jdXNpbmdRdWVzdGlvbjogYm9vbGVhbjtcbiAgZm9jdXNRdWVzdGlvbihuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmdldFF1ZXN0aW9uQnlOYW1lKG5hbWUsIHRydWUpO1xuICAgIGlmICghcXVlc3Rpb24gfHwgIXF1ZXN0aW9uLmlzVmlzaWJsZSB8fCAhcXVlc3Rpb24ucGFnZSkgcmV0dXJuIGZhbHNlO1xuICAgIHRoaXMuaXNGb2N1c2luZ1F1ZXN0aW9uID0gdHJ1ZTtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gPFBhZ2VNb2RlbD5xdWVzdGlvbi5wYWdlO1xuICAgIHF1ZXN0aW9uLmZvY3VzKCk7XG4gICAgdGhpcy5pc0ZvY3VzaW5nUXVlc3Rpb24gPSBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0RWxlbWVudFdyYXBwZXJDb21wb25lbnROYW1lKGVsZW1lbnQ6IGFueSwgcmVhc29uPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAocmVhc29uID09PSBcImxvZ28taW1hZ2VcIikge1xuICAgICAgcmV0dXJuIFwic3YtbG9nby1pbWFnZVwiO1xuICAgIH1cbiAgICByZXR1cm4gU3VydmV5TW9kZWwuVGVtcGxhdGVSZW5kZXJlckNvbXBvbmVudE5hbWU7XG4gIH1cbiAgcHVibGljIGdldFJvd1dyYXBwZXJDb21wb25lbnROYW1lKHJvdzogUXVlc3Rpb25Sb3dNb2RlbCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFN1cnZleU1vZGVsLlRlbXBsYXRlUmVuZGVyZXJDb21wb25lbnROYW1lO1xuICB9XG4gIHB1YmxpYyBnZXRFbGVtZW50V3JhcHBlckNvbXBvbmVudERhdGEoZWxlbWVudDogYW55LCByZWFzb24/OiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG4gIHB1YmxpYyBnZXRSb3dXcmFwcGVyQ29tcG9uZW50RGF0YShyb3c6IFF1ZXN0aW9uUm93TW9kZWwpOiBhbnkge1xuICAgIHJldHVybiByb3c7XG4gIH1cbiAgcHVibGljIGdldEl0ZW1WYWx1ZVdyYXBwZXJDb21wb25lbnROYW1lKFxuICAgIGl0ZW06IEl0ZW1WYWx1ZSxcbiAgICBxdWVzdGlvbjogUXVlc3Rpb25TZWxlY3RCYXNlXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFN1cnZleU1vZGVsLlRlbXBsYXRlUmVuZGVyZXJDb21wb25lbnROYW1lO1xuICB9XG4gIHB1YmxpYyBnZXRJdGVtVmFsdWVXcmFwcGVyQ29tcG9uZW50RGF0YShcbiAgICBpdGVtOiBJdGVtVmFsdWUsXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uU2VsZWN0QmFzZVxuICApOiBhbnkge1xuICAgIHJldHVybiBpdGVtO1xuICB9XG4gIHB1YmxpYyBnZXRNYXRyaXhDZWxsVGVtcGxhdGVEYXRhKGNlbGw6IGFueSkge1xuICAgIHJldHVybiBjZWxsLnF1ZXN0aW9uO1xuICB9XG4gIHB1YmxpYyBzZWFyY2hUZXh0KHRleHQ6IHN0cmluZyk6IEFycmF5PElGaW5kRWxlbWVudD4ge1xuICAgIGlmICghIXRleHQpIHRleHQgPSB0ZXh0LnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIHJlczogQXJyYXk8SUZpbmRFbGVtZW50PiA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYWdlc1tpXS5zZWFyY2hUZXh0KHRleHQsIHJlcyk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIHNrZWxldG9uQ29tcG9uZW50TmFtZSA9IFwic3Ytc2tlbGV0b25cIjtcbiAgcHVibGljIGdldFNrZWxldG9uQ29tcG9uZW50TmFtZShlbGVtZW50OiBJU3VydmV5RWxlbWVudCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc2tlbGV0b25Db21wb25lbnROYW1lO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBtZXRob2QgdG8gZGlzcG9zZSBzdXJ2ZXkgbW9kZWwgcHJvcGVybHkuXG4gICAqL1xuICBwdWJsaWMgZGlzcG9zZSgpIHtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gbnVsbDtcbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgdGhpcy5lZGl0aW5nT2JqID0gbnVsbDtcbiAgICBpZiAoIXRoaXMucGFnZXMpIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucGFnZXNbaV0uZGlzcG9zZSgpO1xuICAgIH1cbiAgICB0aGlzLnBhZ2VzLnNwbGljZSgwLCB0aGlzLnBhZ2VzLmxlbmd0aCk7XG4gIH1cbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcInN1cnZleVwiLCBbXG4gIHtcbiAgICBuYW1lOiBcImxvY2FsZVwiLFxuICAgIGNob2ljZXM6ICgpID0+IHtcbiAgICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0TG9jYWxlcyh0cnVlKTtcbiAgICB9LFxuICAgIG9uR2V0VmFsdWU6IChvYmo6IGFueSk6IGFueSA9PiB7XG4gICAgICByZXR1cm4gb2JqLmxvY2FsZSA9PSBzdXJ2ZXlMb2NhbGl6YXRpb24uZGVmYXVsdExvY2FsZSA/IG51bGwgOiBvYmoubG9jYWxlO1xuICAgIH0sXG4gIH0sXG4gIHsgbmFtZTogXCJ0aXRsZVwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jVGl0bGVcIiwgZGVwZW5kc09uOiBcImxvY2FsZVwiIH0sXG4gIHtcbiAgICBuYW1lOiBcImRlc2NyaXB0aW9uOnRleHRcIixcbiAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jRGVzY3JpcHRpb25cIixcbiAgICBkZXBlbmRzT246IFwibG9jYWxlXCIsXG4gIH0sXG4gIHsgbmFtZTogXCJsb2dvXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NMb2dvXCIgfSxcbiAgeyBuYW1lOiBcImxvZ29XaWR0aFwiLCBkZWZhdWx0OiBcIjMwMHB4XCIsIG1pblZhbHVlOiAwIH0sXG4gIHsgbmFtZTogXCJsb2dvSGVpZ2h0XCIsIGRlZmF1bHQ6IFwiMjAwcHhcIiwgbWluVmFsdWU6IDAgfSxcbiAge1xuICAgIG5hbWU6IFwibG9nb0ZpdFwiLFxuICAgIGRlZmF1bHQ6IFwiY29udGFpblwiLFxuICAgIGNob2ljZXM6IFtcIm5vbmVcIiwgXCJjb250YWluXCIsIFwiY292ZXJcIiwgXCJmaWxsXCJdLFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJsb2dvUG9zaXRpb25cIixcbiAgICBkZWZhdWx0OiBcImxlZnRcIixcbiAgICBjaG9pY2VzOiBbXCJub25lXCIsIFwibGVmdFwiLCBcInJpZ2h0XCIsIFwidG9wXCIsIFwiYm90dG9tXCJdLFxuICB9LFxuICB7IG5hbWU6IFwiZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICB7IG5hbWU6IFwiZm9jdXNPbkZpcnN0RXJyb3I6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gIHsgbmFtZTogXCJjb21wbGV0ZWRIdG1sOmh0bWxcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0NvbXBsZXRlZEh0bWxcIiB9LFxuICB7XG4gICAgbmFtZTogXCJjb21wbGV0ZWRCZWZvcmVIdG1sOmh0bWxcIixcbiAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jQ29tcGxldGVkQmVmb3JlSHRtbFwiLFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJjb21wbGV0ZWRIdG1sT25Db25kaXRpb246aHRtbGNvbmRpdGlvbnNcIixcbiAgICBjbGFzc05hbWU6IFwiaHRtbGNvbmRpdGlvbml0ZW1cIixcbiAgfSxcbiAgeyBuYW1lOiBcImxvYWRpbmdIdG1sOmh0bWxcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0xvYWRpbmdIdG1sXCIgfSxcbiAgeyBuYW1lOiBcInBhZ2VzOnN1cnZleXBhZ2VzXCIsIGNsYXNzTmFtZTogXCJwYWdlXCIgfSxcbiAge1xuICAgIG5hbWU6IFwicXVlc3Rpb25zXCIsXG4gICAgYWx0ZXJuYXRpdmVOYW1lOiBcImVsZW1lbnRzXCIsXG4gICAgYmFzZUNsYXNzTmFtZTogXCJxdWVzdGlvblwiLFxuICAgIHZpc2libGU6IGZhbHNlLFxuICAgIGlzTGlnaHRTZXJpYWxpemFibGU6IGZhbHNlLFxuICAgIG9uR2V0VmFsdWU6IGZ1bmN0aW9uIChvYmo6IGFueSk6IGFueSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIG9uU2V0VmFsdWU6IGZ1bmN0aW9uIChvYmo6IGFueSwgdmFsdWU6IGFueSwganNvbkNvbnZlcnRlcjogYW55KSB7XG4gICAgICBvYmoucGFnZXMuc3BsaWNlKDAsIG9iai5wYWdlcy5sZW5ndGgpO1xuICAgICAgdmFyIHBhZ2UgPSBvYmouYWRkTmV3UGFnZShcIlwiKTtcbiAgICAgIGpzb25Db252ZXJ0ZXIudG9PYmplY3QoeyBxdWVzdGlvbnM6IHZhbHVlIH0sIHBhZ2UpO1xuICAgIH0sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcInRyaWdnZXJzOnRyaWdnZXJzXCIsXG4gICAgYmFzZUNsYXNzTmFtZTogXCJzdXJ2ZXl0cmlnZ2VyXCIsXG4gICAgY2xhc3NOYW1lUGFydDogXCJ0cmlnZ2VyXCIsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcImNhbGN1bGF0ZWRWYWx1ZXM6Y2FsY3VsYXRlZHZhbHVlc1wiLFxuICAgIGNsYXNzTmFtZTogXCJjYWxjdWxhdGVkdmFsdWVcIixcbiAgfSxcbiAgeyBuYW1lOiBcInN1cnZleUlkXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gIHsgbmFtZTogXCJzdXJ2ZXlQb3N0SWRcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgeyBuYW1lOiBcInN1cnZleVNob3dEYXRhU2F2aW5nOmJvb2xlYW5cIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgXCJjb29raWVOYW1lXCIsXG4gIFwic2VuZFJlc3VsdE9uUGFnZU5leHQ6Ym9vbGVhblwiLFxuICB7XG4gICAgbmFtZTogXCJzaG93TmF2aWdhdGlvbkJ1dHRvbnNcIixcbiAgICBkZWZhdWx0OiBcImJvdHRvbVwiLFxuICAgIGNob2ljZXM6IFtcIm5vbmVcIiwgXCJ0b3BcIiwgXCJib3R0b21cIiwgXCJib3RoXCJdLFxuICB9LFxuICB7IG5hbWU6IFwic2hvd1ByZXZCdXR0b246Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gIHsgbmFtZTogXCJzaG93VGl0bGU6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gIHsgbmFtZTogXCJzaG93UGFnZVRpdGxlczpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgeyBuYW1lOiBcInNob3dDb21wbGV0ZWRQYWdlOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICBcIm5hdmlnYXRlVG9VcmxcIixcbiAge1xuICAgIG5hbWU6IFwibmF2aWdhdGVUb1VybE9uQ29uZGl0aW9uOnVybGNvbmRpdGlvbnNcIixcbiAgICBjbGFzc05hbWU6IFwidXJsY29uZGl0aW9uaXRlbVwiLFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJxdWVzdGlvbnNPcmRlclwiLFxuICAgIGRlZmF1bHQ6IFwiaW5pdGlhbFwiLFxuICAgIGNob2ljZXM6IFtcImluaXRpYWxcIiwgXCJyYW5kb21cIl0sXG4gIH0sXG4gIFwic2hvd1BhZ2VOdW1iZXJzOmJvb2xlYW5cIixcbiAge1xuICAgIG5hbWU6IFwic2hvd1F1ZXN0aW9uTnVtYmVyc1wiLFxuICAgIGRlZmF1bHQ6IFwib25cIixcbiAgICBjaG9pY2VzOiBbXCJvblwiLCBcIm9uUGFnZVwiLCBcIm9mZlwiXSxcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwicXVlc3Rpb25UaXRsZUxvY2F0aW9uXCIsXG4gICAgZGVmYXVsdDogXCJ0b3BcIixcbiAgICBjaG9pY2VzOiBbXCJ0b3BcIiwgXCJib3R0b21cIiwgXCJsZWZ0XCJdLFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJxdWVzdGlvbkRlc2NyaXB0aW9uTG9jYXRpb25cIixcbiAgICBkZWZhdWx0OiBcInVuZGVyVGl0bGVcIixcbiAgICBjaG9pY2VzOiBbXCJ1bmRlcklucHV0XCIsIFwidW5kZXJUaXRsZVwiXSxcbiAgfSxcbiAgeyBuYW1lOiBcInF1ZXN0aW9uRXJyb3JMb2NhdGlvblwiLCBkZWZhdWx0OiBcInRvcFwiLCBjaG9pY2VzOiBbXCJ0b3BcIiwgXCJib3R0b21cIl0gfSxcbiAge1xuICAgIG5hbWU6IFwic2hvd1Byb2dyZXNzQmFyXCIsXG4gICAgZGVmYXVsdDogXCJvZmZcIixcbiAgICBjaG9pY2VzOiBbXCJvZmZcIiwgXCJ0b3BcIiwgXCJib3R0b21cIiwgXCJib3RoXCJdLFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJwcm9ncmVzc0JhclR5cGVcIixcbiAgICBkZWZhdWx0OiBcInBhZ2VzXCIsXG4gICAgY2hvaWNlczogW1xuICAgICAgXCJwYWdlc1wiLFxuICAgICAgXCJxdWVzdGlvbnNcIixcbiAgICAgIFwicmVxdWlyZWRRdWVzdGlvbnNcIixcbiAgICAgIFwiY29ycmVjdFF1ZXN0aW9uc1wiLFxuICAgICAgXCJidXR0b25zXCIsXG4gICAgXSxcbiAgfSxcbiAgeyBuYW1lOiBcIm1vZGVcIiwgZGVmYXVsdDogXCJlZGl0XCIsIGNob2ljZXM6IFtcImVkaXRcIiwgXCJkaXNwbGF5XCJdIH0sXG4gIHsgbmFtZTogXCJzdG9yZU90aGVyc0FzQ29tbWVudDpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgeyBuYW1lOiBcIm1heFRleHRMZW5ndGg6bnVtYmVyXCIsIGRlZmF1bHQ6IDAsIG1pblZhbHVlOiAwIH0sXG4gIHsgbmFtZTogXCJtYXhPdGhlcnNMZW5ndGg6bnVtYmVyXCIsIGRlZmF1bHQ6IDAsIG1pblZhbHVlOiAwIH0sXG4gIFwiZ29OZXh0UGFnZUF1dG9tYXRpYzpib29sZWFuXCIsXG4gIHtcbiAgICBuYW1lOiBcImNsZWFySW52aXNpYmxlVmFsdWVzXCIsXG4gICAgZGVmYXVsdDogXCJvbkNvbXBsZXRlXCIsXG4gICAgY2hvaWNlczogW1wibm9uZVwiLCBcIm9uQ29tcGxldGVcIiwgXCJvbkhpZGRlblwiLCBcIm9uSGlkZGVuQ29udGFpbmVyXCJdLFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJjaGVja0Vycm9yc01vZGVcIixcbiAgICBkZWZhdWx0OiBcIm9uTmV4dFBhZ2VcIixcbiAgICBjaG9pY2VzOiBbXCJvbk5leHRQYWdlXCIsIFwib25WYWx1ZUNoYW5nZWRcIiwgXCJvblZhbHVlQ2hhbmdpbmdcIiwgXCJvbkNvbXBsZXRlXCJdLFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJ0ZXh0VXBkYXRlTW9kZVwiLFxuICAgIGRlZmF1bHQ6IFwib25CbHVyXCIsXG4gICAgY2hvaWNlczogW1wib25CbHVyXCIsIFwib25UeXBpbmdcIl0sXG4gIH0sXG4gIHsgbmFtZTogXCJhdXRvR3Jvd0NvbW1lbnQ6Ym9vbGVhblwiLCBkZWZhdWx0OiBmYWxzZSB9LFxuICB7IG5hbWU6IFwic3RhcnRTdXJ2ZXlUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NTdGFydFN1cnZleVRleHRcIiB9LFxuICB7IG5hbWU6IFwicGFnZVByZXZUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NQYWdlUHJldlRleHRcIiB9LFxuICB7IG5hbWU6IFwicGFnZU5leHRUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NQYWdlTmV4dFRleHRcIiB9LFxuICB7IG5hbWU6IFwiY29tcGxldGVUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NDb21wbGV0ZVRleHRcIiB9LFxuICB7IG5hbWU6IFwicHJldmlld1RleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1ByZXZpZXdUZXh0XCIgfSxcbiAgeyBuYW1lOiBcImVkaXRUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NFZGl0VGV4dFwiIH0sXG4gIHsgbmFtZTogXCJyZXF1aXJlZFRleHRcIiwgZGVmYXVsdDogXCIqXCIgfSxcbiAge1xuICAgIG5hbWU6IFwicXVlc3Rpb25TdGFydEluZGV4XCIsXG4gICAgZGVwZW5kc09uOiBbXCJzaG93UXVlc3Rpb25OdW1iZXJzXCJdLFxuICAgIHZpc2libGVJZjogZnVuY3Rpb24gKHN1cnZleTogYW55KSB7XG4gICAgICByZXR1cm4gIXN1cnZleSB8fCBzdXJ2ZXkuc2hvd1F1ZXN0aW9uTnVtYmVycyAhPT0gXCJvZmZcIjtcbiAgICB9LFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJxdWVzdGlvblRpdGxlUGF0dGVyblwiLFxuICAgIGRlZmF1bHQ6IFwibnVtVGl0bGVSZXF1aXJlXCIsXG4gICAgZGVwZW5kc09uOiBbXCJxdWVzdGlvblN0YXJ0SW5kZXhcIiwgXCJyZXF1aXJlZFRleHRcIl0sXG4gICAgY2hvaWNlczogKG9iajogYW55KSA9PiB7XG4gICAgICBpZiAoIW9iaikgcmV0dXJuIFtdO1xuICAgICAgcmV0dXJuIG9iai5nZXRRdWVzdGlvblRpdGxlUGF0dGVybk9wdGlvbnMoKTtcbiAgICB9LFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJxdWVzdGlvblRpdGxlVGVtcGxhdGVcIixcbiAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICBpc1NlcmlhbGl6YWJsZTogZmFsc2UsXG4gICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1F1ZXN0aW9uVGl0bGVUZW1wbGF0ZVwiLFxuICB9LFxuICB7IG5hbWU6IFwiZmlyc3RQYWdlSXNTdGFydGVkOmJvb2xlYW5cIiwgZGVmYXVsdDogZmFsc2UgfSxcbiAge1xuICAgIG5hbWU6IFwiaXNTaW5nbGVQYWdlOmJvb2xlYW5cIixcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICBpc1NlcmlhbGl6YWJsZTogZmFsc2UsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcInF1ZXN0aW9uc09uUGFnZU1vZGVcIixcbiAgICBkZWZhdWx0OiBcInN0YW5kYXJkXCIsXG4gICAgY2hvaWNlczogW1wic2luZ2xlUGFnZVwiLCBcInN0YW5kYXJkXCIsIFwicXVlc3Rpb25QZXJQYWdlXCJdLFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJzaG93UHJldmlld0JlZm9yZUNvbXBsZXRlXCIsXG4gICAgZGVmYXVsdDogXCJub1ByZXZpZXdcIixcbiAgICBjaG9pY2VzOiBbXCJub1ByZXZpZXdcIiwgXCJzaG93QWxsUXVlc3Rpb25zXCIsIFwic2hvd0Fuc3dlcmVkUXVlc3Rpb25zXCJdLFxuICB9LFxuICB7IG5hbWU6IFwibWF4VGltZVRvRmluaXNoOm51bWJlclwiLCBkZWZhdWx0OiAwLCBtaW5WYWx1ZTogMCB9LFxuICB7IG5hbWU6IFwibWF4VGltZVRvRmluaXNoUGFnZTpudW1iZXJcIiwgZGVmYXVsdDogMCwgbWluVmFsdWU6IDAgfSxcbiAge1xuICAgIG5hbWU6IFwic2hvd1RpbWVyUGFuZWxcIixcbiAgICBkZWZhdWx0OiBcIm5vbmVcIixcbiAgICBjaG9pY2VzOiBbXCJub25lXCIsIFwidG9wXCIsIFwiYm90dG9tXCJdLFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJzaG93VGltZXJQYW5lbE1vZGVcIixcbiAgICBkZWZhdWx0OiBcImFsbFwiLFxuICAgIGNob2ljZXM6IFtcImFsbFwiLCBcInBhZ2VcIiwgXCJzdXJ2ZXlcIl0sXG4gIH0sXG5dKTtcbiIsImltcG9ydCB7IENzc0NsYXNzQnVpbGRlciB9IGZyb20gXCIuL3V0aWxzL2Nzc0NsYXNzQnVpbGRlclwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5UHJvZ3Jlc3NNb2RlbCB7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0UHJvZ3Jlc3NUZXh0SW5CYXJDc3MoY3NzOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiBuZXcgQ3NzQ2xhc3NCdWlsZGVyKClcbiAgICAgIC5hcHBlbmQoY3NzLnByb2dyZXNzVGV4dClcbiAgICAgIC5hcHBlbmQoY3NzLnByb2dyZXNzVGV4dEluQmFyKVxuICAgICAgLnRvU3RyaW5nKCk7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBnZXRQcm9ncmVzc1RleHRVbmRlckJhckNzcyhjc3M6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5ldyBDc3NDbGFzc0J1aWxkZXIoKVxuICAgICAgLmFwcGVuZChjc3MucHJvZ3Jlc3NUZXh0KVxuICAgICAgLmFwcGVuZChjc3MucHJvZ3Jlc3NUZXh0VW5kZXJCYXIpXG4gICAgICAudG9TdHJpbmcoKTtcbiAgfVxufSIsImltcG9ydCB7IFN1cnZleU1vZGVsIH0gZnJvbSBcIi4vc3VydmV5XCI7XG5pbXBvcnQgeyBDc3NDbGFzc0J1aWxkZXIgfSBmcm9tIFwiLi91dGlscy9jc3NDbGFzc0J1aWxkZXJcIjtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVByb2dyZXNzQnV0dG9uc01vZGVsIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzdXJ2ZXk6IFN1cnZleU1vZGVsKSB7XG4gIH1cbiAgcHVibGljIGlzTGlzdEVsZW1lbnRDbGlja2FibGUoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5zdXJ2ZXkub25TZXJ2ZXJWYWxpZGF0ZVF1ZXN0aW9ucyB8fFxuICAgICAgdGhpcy5zdXJ2ZXkub25TZXJ2ZXJWYWxpZGF0ZVF1ZXN0aW9ucy5pc0VtcHR5IHx8XG4gICAgICB0aGlzLnN1cnZleS5jaGVja0Vycm9yc01vZGUgPT09IFwib25Db21wbGV0ZVwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGluZGV4IDw9IHRoaXMuc3VydmV5LmN1cnJlbnRQYWdlTm8gKyAxO1xuICB9XG4gIHB1YmxpYyBnZXRMaXN0RWxlbWVudENzcyhpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoaW5kZXggPj0gdGhpcy5zdXJ2ZXkudmlzaWJsZVBhZ2VzLmxlbmd0aCkgcmV0dXJuO1xuICAgIHJldHVybiBuZXcgQ3NzQ2xhc3NCdWlsZGVyKClcbiAgICAgIC5hcHBlbmQodGhpcy5zdXJ2ZXkuY3NzLnByb2dyZXNzQnV0dG9uc0xpc3RFbGVtZW50UGFzc2VkLCB0aGlzLnN1cnZleS52aXNpYmxlUGFnZXNbaW5kZXhdLnBhc3NlZClcbiAgICAgIC5hcHBlbmQodGhpcy5zdXJ2ZXkuY3NzLnByb2dyZXNzQnV0dG9uc0xpc3RFbGVtZW50Q3VycmVudCwgdGhpcy5zdXJ2ZXkuY3VycmVudFBhZ2VObyA9PT0gaW5kZXgpXG4gICAgICAuYXBwZW5kKHRoaXMuc3VydmV5LmNzcy5wcm9ncmVzc0J1dHRvbnNMaXN0RWxlbWVudE5vbkNsaWNrYWJsZSwgIXRoaXMuaXNMaXN0RWxlbWVudENsaWNrYWJsZShpbmRleCkpXG4gICAgICAudG9TdHJpbmcoKTtcbiAgfVxuICBwdWJsaWMgZ2V0U2Nyb2xsQnV0dG9uQ3NzKGhhc1Njcm9sbGVyOiBib29sZWFuLCBpc0xlZnRTY3JvbGw6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIHJldHVybiBuZXcgQ3NzQ2xhc3NCdWlsZGVyKClcbiAgICAgIC5hcHBlbmQodGhpcy5zdXJ2ZXkuY3NzLnByb2dyZXNzQnV0dG9uc0ltYWdlQnV0dG9uTGVmdCwgaXNMZWZ0U2Nyb2xsKVxuICAgICAgLmFwcGVuZCh0aGlzLnN1cnZleS5jc3MucHJvZ3Jlc3NCdXR0b25zSW1hZ2VCdXR0b25SaWdodCwgIWlzTGVmdFNjcm9sbClcbiAgICAgIC5hcHBlbmQodGhpcy5zdXJ2ZXkuY3NzLnByb2dyZXNzQnV0dG9uc0ltYWdlQnV0dG9uSGlkZGVuLCAhaGFzU2Nyb2xsZXIpXG4gICAgICAudG9TdHJpbmcoKTtcbiAgfVxuICBwdWJsaWMgY2xpY2tMaXN0RWxlbWVudChpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3VydmV5LmlzRGVzaWduTW9kZSkgcmV0dXJuO1xuICAgIGlmIChpbmRleCA8IHRoaXMuc3VydmV5LmN1cnJlbnRQYWdlTm8pIHtcbiAgICAgIHRoaXMuc3VydmV5LmN1cnJlbnRQYWdlTm8gPSBpbmRleDtcbiAgICB9XG4gICAgZWxzZSBpZiAoaW5kZXggPiB0aGlzLnN1cnZleS5jdXJyZW50UGFnZU5vKSB7XG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSB0aGlzLnN1cnZleS5jdXJyZW50UGFnZU5vOyBpIDwgaW5kZXg7IGkrKykge1xuICAgICAgICBpZiAoIXRoaXMuc3VydmV5Lm5leHRQYWdlKCkpIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgZW5nbGlzaFN0cmluZ3MgfSBmcm9tIFwiLi9sb2NhbGl6YXRpb24vZW5nbGlzaFwiO1xuXG5leHBvcnQgdmFyIHN1cnZleUxvY2FsaXphdGlvbiA9IHtcbiAgY3VycmVudExvY2FsZVZhbHVlOiBcIlwiLFxuICBkZWZhdWx0TG9jYWxlVmFsdWU6IFwiZW5cIixcbiAgbG9jYWxlczogPHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT57fSxcbiAgbG9jYWxlTmFtZXM6IDx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+e30sXG4gIHN1cHBvcnRlZExvY2FsZXM6IDxBcnJheTxhbnk+PltdLFxuICBnZXQgY3VycmVudExvY2FsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50TG9jYWxlVmFsdWUgPT09IHRoaXMuZGVmYXVsdExvY2FsZVZhbHVlXG4gICAgICA/IFwiXCJcbiAgICAgIDogdGhpcy5jdXJyZW50TG9jYWxlVmFsdWU7XG4gIH0sXG4gIHNldCBjdXJyZW50TG9jYWxlKHZhbDogc3RyaW5nKSB7XG4gICAgaWYgKHZhbCA9PT0gXCJjelwiKSB2YWwgPSBcImNzXCI7XG4gICAgdGhpcy5jdXJyZW50TG9jYWxlVmFsdWUgPSB2YWw7XG4gIH0sXG4gIGdldCBkZWZhdWx0TG9jYWxlKCkge1xuICAgIHJldHVybiB0aGlzLmRlZmF1bHRMb2NhbGVWYWx1ZTtcbiAgfSxcbiAgc2V0IGRlZmF1bHRMb2NhbGUodmFsOiBzdHJpbmcpIHtcbiAgICBpZiAodmFsID09PSBcImN6XCIpIHZhbCA9IFwiY3NcIjtcbiAgICB0aGlzLmRlZmF1bHRMb2NhbGVWYWx1ZSA9IHZhbDtcbiAgfSxcbiAgZ2V0TG9jYWxlU3RyaW5ncyhsb2M6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMubG9jYWxlc1tsb2NdO1xuICB9LFxuICBnZXRDdXJyZW50U3RyaW5ncygpOiBhbnkge1xuICAgIHZhciBsb2MgPSB0aGlzLmN1cnJlbnRMb2NhbGVcbiAgICAgID8gdGhpcy5sb2NhbGVzW3RoaXMuY3VycmVudExvY2FsZV1cbiAgICAgIDogdGhpcy5sb2NhbGVzW3RoaXMuZGVmYXVsdExvY2FsZV07XG4gICAgaWYgKCFsb2MpIGxvYyA9IHRoaXMubG9jYWxlc1t0aGlzLmRlZmF1bHRMb2NhbGVdO1xuICAgIHJldHVybiBsb2M7XG4gIH0sXG4gIGdldFN0cmluZzogZnVuY3Rpb24gKHN0ck5hbWU6IHN0cmluZykge1xuICAgIHZhciBsb2MgPSB0aGlzLmdldEN1cnJlbnRTdHJpbmdzKCk7XG4gICAgaWYgKCFsb2Nbc3RyTmFtZV0pIGxvYyA9IHRoaXMubG9jYWxlc1t0aGlzLmRlZmF1bHRMb2NhbGVdO1xuICAgIHZhciByZXN1bHQgPSBsb2Nbc3RyTmFtZV07XG4gICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXN1bHQgPSB0aGlzLmxvY2FsZXNbXCJlblwiXVtzdHJOYW1lXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSxcbiAgZ2V0TG9jYWxlczogZnVuY3Rpb24gKHJlbW92ZURlZmF1bHRMb2M6IGJvb2xlYW4gPSBmYWxzZSk6IEFycmF5PHN0cmluZz4ge1xuICAgIHZhciByZXMgPSBbXTtcbiAgICByZXMucHVzaChcIlwiKTtcbiAgICB2YXIgbG9jcyA9IHRoaXMubG9jYWxlcztcbiAgICBpZiAodGhpcy5zdXBwb3J0ZWRMb2NhbGVzICYmIHRoaXMuc3VwcG9ydGVkTG9jYWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2NzID0ge307XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3VwcG9ydGVkTG9jYWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsb2NzW3RoaXMuc3VwcG9ydGVkTG9jYWxlc1tpXV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBrZXkgaW4gbG9jcykge1xuICAgICAgaWYgKHJlbW92ZURlZmF1bHRMb2MgJiYga2V5ID09IHRoaXMuZGVmYXVsdExvY2FsZSkgY29udGludWU7XG4gICAgICByZXMucHVzaChrZXkpO1xuICAgIH1cbiAgICB2YXIgbG9jTmFtZSA9IChsb2M6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgICBpZiAoIWxvYykgcmV0dXJuIFwiXCI7XG4gICAgICB2YXIgcmVzID0gKDxhbnk+c3VydmV5TG9jYWxpemF0aW9uKS5sb2NhbGVOYW1lc1tsb2NdO1xuICAgICAgaWYgKCFyZXMpIHJlcyA9IGxvYztcbiAgICAgIHJldHVybiByZXMudG9Mb3dlckNhc2UoKTtcbiAgICB9O1xuICAgIHJlcy5zb3J0KChhLCBiKTogbnVtYmVyID0+IHtcbiAgICAgIHZhciBzdHIxID0gbG9jTmFtZShhKTtcbiAgICAgIHZhciBzdHIyID0gbG9jTmFtZShiKTtcbiAgICAgIGlmIChzdHIxID09PSBzdHIyKSByZXR1cm4gMDtcbiAgICAgIHJldHVybiBzdHIxIDwgc3RyMiA/IC0xIDogMTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzO1xuICB9LFxufTtcblxuZXhwb3J0IHZhciBzdXJ2ZXlTdHJpbmdzID0gZW5nbGlzaFN0cmluZ3M7XG4oPGFueT5zdXJ2ZXlMb2NhbGl6YXRpb24pLmxvY2FsZXNbXCJlblwiXSA9IGVuZ2xpc2hTdHJpbmdzO1xuKDxhbnk+c3VydmV5TG9jYWxpemF0aW9uKS5sb2NhbGVOYW1lc1tcImVuXCJdID0gXCJlbmdsaXNoXCI7XG4iLCJpbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgU3VydmV5TW9kZWwgfSBmcm9tIFwiLi9zdXJ2ZXlcIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIHN1cnZleSBydW5uaW5nIGluIHRoZSBXaW5kb3cuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlXaW5kb3dNb2RlbCBleHRlbmRzIEJhc2Uge1xuICBwdWJsaWMgc3RhdGljIHN1cnZleUVsZW1lbnROYW1lID0gXCJ3aW5kb3dTdXJ2ZXlKU1wiO1xuICBzdXJ2ZXlWYWx1ZTogU3VydmV5TW9kZWw7XG4gIHdpbmRvd0VsZW1lbnQ6IEhUTUxEaXZFbGVtZW50O1xuXG4gIHRlbXBsYXRlVmFsdWU6IHN0cmluZztcbiAgZXhwYW5kZWRDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG4gIHNob3dpbmdDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG4gIGNsb3NlV2luZG93T25Db21wbGV0ZUNhbGxiYWNrOiAoKSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKGpzb25PYmo6IGFueSwgaW5pdGlhbE1vZGVsOiBTdXJ2ZXlNb2RlbCA9IG51bGwpIHtcbiAgICBzdXBlcigpO1xuICAgIGlmIChpbml0aWFsTW9kZWwpIHtcbiAgICAgIHRoaXMuc3VydmV5VmFsdWUgPSBpbml0aWFsTW9kZWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3VydmV5VmFsdWUgPSB0aGlzLmNyZWF0ZVN1cnZleShqc29uT2JqKTtcbiAgICB9XG4gICAgdGhpcy5zdXJ2ZXlWYWx1ZS5zaG93VGl0bGUgPSBmYWxzZTtcbiAgICBpZiAoXCJ1bmRlZmluZWRcIiAhPT0gdHlwZW9mIGRvY3VtZW50KSB7XG4gICAgICB0aGlzLndpbmRvd0VsZW1lbnQgPSA8SFRNTERpdkVsZW1lbnQ+ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB9XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuc3VydmV5Lm9uQ29tcGxldGUuYWRkKGZ1bmN0aW9uIChzdXJ2ZXksIG9wdGlvbnMpIHtcbiAgICAgIHNlbGYub25TdXJ2ZXlDb21wbGV0ZSgpO1xuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwid2luZG93XCI7XG4gIH1cbiAgLyoqXG4gICAqIEEgc3VydmV5IG9iamVjdC5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlbFxuICAgKi9cbiAgcHVibGljIGdldCBzdXJ2ZXkoKTogU3VydmV5TW9kZWwge1xuICAgIHJldHVybiB0aGlzLnN1cnZleVZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyB2YWx1ZSB0byBuZWdhdGl2ZSB2YWx1ZSwgZm9yIGV4YW1wbGUgLTEsIHRvIGF2b2lkIGNsb3NpbmcgdGhlIHdpbmRvdyBvbiBjb21wbGV0aW5nIHRoZSBzdXJ2ZXkuIExlYXZlIGl0IGVxdWFscyB0byAwIChkZWZhdWx0IHZhbHVlKSB0byBjbG9zZSB0aGUgd2luZG93IGltbWVkaWF0ZWx5LCBvciBzZXQgaXQgdG8gMywgNSwgMTAsIC4uLiB0byBjbG9zZSB0aGUgd2luZG93IGluIDMsIDUsIDEwIHNlY29uZHMuXG4gICAqL1xuICBwdWJsaWMgY2xvc2VPbkNvbXBsZXRlVGltZW91dDogbnVtYmVyID0gMDtcbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgd2luZG93IGlzIGN1cnJlbnRseSBzaG93aW5nLiBTZXQgaXQgdG8gdHJ1ZSB0byBzaG93IHRoZSB3aW5kb3cgYW5kIGZhbHNlIHRvIGhpZGUgaXQuXG4gICAqIEBzZWUgc2hvd1xuICAgKiBAc2VlIGhpZGVcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNTaG93aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc1Nob3dpbmdcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNTaG93aW5nKHZhbDogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLmlzU2hvd2luZyA9PSB2YWwpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1Nob3dpbmdcIiwgdmFsKTtcbiAgICBpZiAodGhpcy5zaG93aW5nQ2hhbmdlZENhbGxiYWNrKSB0aGlzLnNob3dpbmdDaGFuZ2VkQ2FsbGJhY2soKTtcbiAgfVxuICAvKipcbiAgICogU2hvdyB0aGUgd2luZG93XG4gICAqIEBzZWUgaGlkZVxuICAgKiBAc2VlIGlzU2hvd2luZ1xuICAgKi9cbiAgcHVibGljIHNob3coKSB7XG4gICAgdGhpcy5pc1Nob3dpbmcgPSB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBIaWRlIHRoZSB3aW5kb3dcbiAgICogQHNlZSBzaG93XG4gICAqIEBzZWUgaXNTaG93aW5nXG4gICAqL1xuICBwdWJsaWMgaGlkZSgpIHtcbiAgICB0aGlzLmlzU2hvd2luZyA9IGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdpbmRvdyBpcyBleHBhbmRlZC4gU2V0IGl0IHRvIHRydWUgdG8gZXhwYW5kIHRoZSB3aW5kb3cgb3IgZmFsc2UgdG8gY29sbGFwc2UgaXQuXG4gICAqIEBzZWUgZXhwYW5kXG4gICAqIEBzZWUgY29sbGFwc2VcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNFeHBhbmRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNFeHBhbmRlZFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBpc0V4cGFuZGVkKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzRXhwYW5kZWRcIiwgdmFsKTtcbiAgICBpZiAoIXRoaXMuaXNMb2FkaW5nRnJvbUpzb24gJiYgdGhpcy5leHBhbmRlZENoYW5nZWRDYWxsYmFjaylcbiAgICAgIHRoaXMuZXhwYW5kZWRDaGFuZ2VkQ2FsbGJhY2soKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHdpbmRvdyBhbmQgc3VydmV5IHRpdGxlLlxuICAgKi9cbiAgcHVibGljIGdldCB0aXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnN1cnZleS50aXRsZTtcbiAgfVxuICBwdWJsaWMgc2V0IHRpdGxlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnN1cnZleS50aXRsZSA9IHZhbHVlO1xuICB9XG4gIGdldCBsb2NUaXRsZSgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5LmxvY1RpdGxlO1xuICB9XG4gIC8qKlxuICAgKiBFeHBhbmQgdGhlIHdpbmRvdyB0byBzaG93IHRoZSBzdXJ2ZXkuXG4gICAqL1xuICBwdWJsaWMgZXhwYW5kKCkge1xuICAgIHRoaXMuZXhwYW5kY29sbGFwc2UodHJ1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIENvbGxhcHNlIHRoZSB3aW5kb3cgYW5kIHNob3cgc3VydmV5IHRpdGxlIG9ubHkuXG4gICAqL1xuICBwdWJsaWMgY29sbGFwc2UoKSB7XG4gICAgdGhpcy5leHBhbmRjb2xsYXBzZShmYWxzZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVN1cnZleShqc29uT2JqOiBhbnkpOiBTdXJ2ZXlNb2RlbCB7XG4gICAgcmV0dXJuIG5ldyBTdXJ2ZXlNb2RlbChqc29uT2JqKTtcbiAgfVxuICBwcm90ZWN0ZWQgZXhwYW5kY29sbGFwc2UodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzRXhwYW5kZWQgPSB2YWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgb25TdXJ2ZXlDb21wbGV0ZSgpIHtcbiAgICBpZiAodGhpcy5jbG9zZU9uQ29tcGxldGVUaW1lb3V0IDwgMCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmNsb3NlT25Db21wbGV0ZVRpbWVvdXQgPT0gMCkge1xuICAgICAgdGhpcy5jbG9zZVdpbmRvd09uQ29tcGxldGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHRpbWVySWQ6IGFueSA9IG51bGw7XG4gICAgICB2YXIgZnVuYyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi5jbG9zZVdpbmRvd09uQ29tcGxldGUoKTtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aW1lcklkKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHRpbWVySWQgPVxuICAgICAgICB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgPyB3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuYywgdGhpcy5jbG9zZU9uQ29tcGxldGVUaW1lb3V0ICogMTAwMClcbiAgICAgICAgICA6IDA7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBjbG9zZVdpbmRvd09uQ29tcGxldGUoKSB7XG4gICAgaWYgKCEhdGhpcy5jbG9zZVdpbmRvd09uQ29tcGxldGVDYWxsYmFjaykge1xuICAgICAgdGhpcy5jbG9zZVdpbmRvd09uQ29tcGxldGVDYWxsYmFjaygpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgRXZlbnQgfSBmcm9tIFwiLi9iYXNlXCI7XG5cbmV4cG9ydCB2YXIgc3VydmV5VGltZXJGdW5jdGlvbnMgPSB7XG4gIHNldFRpbWVvdXQ6IGZ1bmN0aW9uIChmdW5jOiAoKSA9PiBhbnkpOiBudW1iZXIge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gMDtcbiAgICByZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuYywgMTAwMCk7XG4gIH0sXG4gIGNsZWFyVGltZW91dDogZnVuY3Rpb24gKHRpbWVySWQ6IG51bWJlcikge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm47XG4gICAgd2luZG93LmNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlUaW1lciB7XG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlVmFsdWU6IFN1cnZleVRpbWVyID0gbnVsbDtcbiAgcHVibGljIHN0YXRpYyBnZXQgaW5zdGFuY2UoKSB7XG4gICAgaWYgKCFTdXJ2ZXlUaW1lci5pbnN0YW5jZVZhbHVlKSB7XG4gICAgICBTdXJ2ZXlUaW1lci5pbnN0YW5jZVZhbHVlID0gbmV3IFN1cnZleVRpbWVyKCk7XG4gICAgfVxuICAgIHJldHVybiBTdXJ2ZXlUaW1lci5pbnN0YW5jZVZhbHVlO1xuICB9XG4gIHByaXZhdGUgbGlzdGVuZXJDb3VudGVyID0gMDtcbiAgcHJpdmF0ZSB0aW1lcklkID0gLTE7XG4gIHB1YmxpYyBvblRpbWVyOiBFdmVudDwoKSA9PiBhbnksIGFueT4gPSBuZXcgRXZlbnQ8KCkgPT4gYW55LCBhbnk+KCk7XG4gIHB1YmxpYyBzdGFydChmdW5jOiAoKSA9PiBhbnkgPSBudWxsKSB7XG4gICAgaWYgKGZ1bmMpIHtcbiAgICAgIHRoaXMub25UaW1lci5hZGQoZnVuYyk7XG4gICAgfVxuICAgIGlmICh0aGlzLnRpbWVySWQgPCAwKSB7XG4gICAgICB0aGlzLnRpbWVySWQgPSBzdXJ2ZXlUaW1lckZ1bmN0aW9ucy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5kb1RpbWVyKCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5saXN0ZW5lckNvdW50ZXIrKztcbiAgfVxuICBwdWJsaWMgc3RvcChmdW5jOiAoKSA9PiBhbnkgPSBudWxsKSB7XG4gICAgaWYgKGZ1bmMpIHtcbiAgICAgIHRoaXMub25UaW1lci5yZW1vdmUoZnVuYyk7XG4gICAgfVxuICAgIHRoaXMubGlzdGVuZXJDb3VudGVyLS07XG4gICAgaWYgKHRoaXMubGlzdGVuZXJDb3VudGVyID09IDAgJiYgdGhpcy50aW1lcklkID4gLTEpIHtcbiAgICAgIHN1cnZleVRpbWVyRnVuY3Rpb25zLmNsZWFyVGltZW91dCh0aGlzLnRpbWVySWQpO1xuICAgICAgdGhpcy50aW1lcklkID0gLTE7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBkb1RpbWVyKCkge1xuICAgIGlmICh0aGlzLnRpbWVySWQgPCAwKSByZXR1cm47XG4gICAgdGhpcy5vblRpbWVyLmZpcmUodGhpcywge30pO1xuICAgIHRoaXMudGltZXJJZCA9IHN1cnZleVRpbWVyRnVuY3Rpb25zLnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5kb1RpbWVyKCk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBQYW5lbE1vZGVsIH0gZnJvbSBcIi4vcGFuZWxcIjtcbmltcG9ydCB7IElTdXJ2ZXksIElUZXh0UHJvY2Vzc29yIH0gZnJvbSBcIi4vYmFzZS1pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBQcm9jZXNzVmFsdWUgfSBmcm9tIFwiLi9jb25kaXRpb25Qcm9jZXNzVmFsdWVcIjtcblxuZXhwb3J0IGNsYXNzIFRleHRQcmVQcm9jZXNzb3JJdGVtIHtcbiAgcHVibGljIHN0YXJ0OiBudW1iZXI7XG4gIHB1YmxpYyBlbmQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIFRleHRQcmVQcm9jZXNzb3JWYWx1ZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcsIHB1YmxpYyByZXR1cm5EaXNwbGF5VmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzRXhpc3RzID0gZmFsc2U7XG4gICAgdGhpcy5jYW5Qcm9jZXNzID0gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgdmFsdWU6IGFueTtcbiAgcHVibGljIGlzRXhpc3RzOiBib29sZWFuO1xuICBwdWJsaWMgY2FuUHJvY2VzczogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIFRleHRQcmVQcm9jZXNzb3Ige1xuICBwcml2YXRlIGhhc0FsbFZhbHVlc09uTGFzdFJ1blZhbHVlOiBib29sZWFuO1xuICBwdWJsaWMgb25Qcm9jZXNzOiAodGV4dFZhbHVlOiBUZXh0UHJlUHJvY2Vzc29yVmFsdWUpID0+IHZvaWQ7XG4gIGNvbnN0cnVjdG9yKCkge31cbiAgcHVibGljIHByb2Nlc3MoXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIHJldHVybkRpc3BsYXlWYWx1ZTogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGRvRW5jb2Rpbmc6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBzdHJpbmcge1xuICAgIHRoaXMuaGFzQWxsVmFsdWVzT25MYXN0UnVuVmFsdWUgPSB0cnVlO1xuICAgIGlmICghdGV4dCkgcmV0dXJuIHRleHQ7XG4gICAgaWYgKCF0aGlzLm9uUHJvY2VzcykgcmV0dXJuIHRleHQ7XG4gICAgdmFyIGl0ZW1zID0gdGhpcy5nZXRJdGVtcyh0ZXh0KTtcbiAgICBmb3IgKHZhciBpID0gaXRlbXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBpdGVtID0gaXRlbXNbaV07XG4gICAgICB2YXIgbmFtZSA9IHRoaXMuZ2V0TmFtZSh0ZXh0LnN1YnN0cmluZyhpdGVtLnN0YXJ0ICsgMSwgaXRlbS5lbmQpKTtcbiAgICAgIGlmICghbmFtZSkgY29udGludWU7XG4gICAgICB2YXIgdGV4dFZhbHVlID0gbmV3IFRleHRQcmVQcm9jZXNzb3JWYWx1ZShuYW1lLCByZXR1cm5EaXNwbGF5VmFsdWUpO1xuICAgICAgdGhpcy5vblByb2Nlc3ModGV4dFZhbHVlKTtcbiAgICAgIGlmICghdGV4dFZhbHVlLmlzRXhpc3RzKSB7XG4gICAgICAgIGlmICh0ZXh0VmFsdWUuY2FuUHJvY2Vzcykge1xuICAgICAgICAgIHRoaXMuaGFzQWxsVmFsdWVzT25MYXN0UnVuVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChIZWxwZXJzLmlzVmFsdWVFbXB0eSh0ZXh0VmFsdWUudmFsdWUpKSB7XG4gICAgICAgIHRoaXMuaGFzQWxsVmFsdWVzT25MYXN0UnVuVmFsdWUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciByZXBsYWNlZFZhbHVlID0gIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHRleHRWYWx1ZS52YWx1ZSlcbiAgICAgICAgPyB0ZXh0VmFsdWUudmFsdWVcbiAgICAgICAgOiBcIlwiO1xuICAgICAgaWYgKGRvRW5jb2RpbmcpIHtcbiAgICAgICAgcmVwbGFjZWRWYWx1ZSA9IGVuY29kZVVSSUNvbXBvbmVudChyZXBsYWNlZFZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHRleHQgPVxuICAgICAgICB0ZXh0LnN1YnN0cigwLCBpdGVtLnN0YXJ0KSArIHJlcGxhY2VkVmFsdWUgKyB0ZXh0LnN1YnN0cihpdGVtLmVuZCArIDEpO1xuICAgIH1cbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuICBwdWJsaWMgcHJvY2Vzc1ZhbHVlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICByZXR1cm5EaXNwbGF5VmFsdWU6IGJvb2xlYW5cbiAgKTogVGV4dFByZVByb2Nlc3NvclZhbHVlIHtcbiAgICB2YXIgdGV4dFZhbHVlID0gbmV3IFRleHRQcmVQcm9jZXNzb3JWYWx1ZShuYW1lLCByZXR1cm5EaXNwbGF5VmFsdWUpO1xuICAgIGlmICghIXRoaXMub25Qcm9jZXNzKSB7XG4gICAgICB0aGlzLm9uUHJvY2Vzcyh0ZXh0VmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGV4dFZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzQWxsVmFsdWVzT25MYXN0UnVuKCkge1xuICAgIHJldHVybiAhIXRoaXMuaGFzQWxsVmFsdWVzT25MYXN0UnVuVmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBnZXRJdGVtcyh0ZXh0OiBzdHJpbmcpOiBBcnJheTxUZXh0UHJlUHJvY2Vzc29ySXRlbT4ge1xuICAgIHZhciBpdGVtcyA9IFtdO1xuICAgIHZhciBsZW5ndGggPSB0ZXh0Lmxlbmd0aDtcbiAgICB2YXIgc3RhcnQgPSAtMTtcbiAgICB2YXIgY2ggPSBcIlwiO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoID0gdGV4dFtpXTtcbiAgICAgIGlmIChjaCA9PSBcIntcIikgc3RhcnQgPSBpO1xuICAgICAgaWYgKGNoID09IFwifVwiKSB7XG4gICAgICAgIGlmIChzdGFydCA+IC0xKSB7XG4gICAgICAgICAgdmFyIGl0ZW0gPSBuZXcgVGV4dFByZVByb2Nlc3Nvckl0ZW0oKTtcbiAgICAgICAgICBpdGVtLnN0YXJ0ID0gc3RhcnQ7XG4gICAgICAgICAgaXRlbS5lbmQgPSBpO1xuICAgICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhcnQgPSAtMTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG4gIHByaXZhdGUgZ2V0TmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghbmFtZSkgcmV0dXJuO1xuICAgIHJldHVybiBuYW1lLnRyaW0oKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25UZXh0UHJvY2Vzc29yIGltcGxlbWVudHMgSVRleHRQcm9jZXNzb3Ige1xuICBwcml2YXRlIHRleHRQcmVQcm9jZXNzb3I6IFRleHRQcmVQcm9jZXNzb3I7XG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCB2YXJpYWJsZU5hbWU6IHN0cmluZykge1xuICAgIHRoaXMudGV4dFByZVByb2Nlc3NvciA9IG5ldyBUZXh0UHJlUHJvY2Vzc29yKCk7XG4gICAgdGhpcy50ZXh0UHJlUHJvY2Vzc29yLm9uUHJvY2VzcyA9ICh0ZXh0VmFsdWU6IFRleHRQcmVQcm9jZXNzb3JWYWx1ZSkgPT4ge1xuICAgICAgdGhpcy5nZXRQcm9jZXNzZWRUZXh0VmFsdWUodGV4dFZhbHVlKTtcbiAgICB9O1xuICB9XG4gIHB1YmxpYyBwcm9jZXNzVmFsdWUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHJldHVybkRpc3BsYXlWYWx1ZTogYm9vbGVhblxuICApOiBUZXh0UHJlUHJvY2Vzc29yVmFsdWUge1xuICAgIHJldHVybiB0aGlzLnRleHRQcmVQcm9jZXNzb3IucHJvY2Vzc1ZhbHVlKG5hbWUsIHJldHVybkRpc3BsYXlWYWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBzdXJ2ZXkoKTogSVN1cnZleSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBwYW5lbCgpOiBQYW5lbE1vZGVsIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0VmFsdWVzKCk6IGFueSB7XG4gICAgcmV0dXJuICEhdGhpcy5wYW5lbCA/IHRoaXMucGFuZWwuZ2V0VmFsdWUoKSA6IG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFF1ZXN0aW9uQnlOYW1lKG5hbWU6IHN0cmluZyk6IFF1ZXN0aW9uIHtcbiAgICByZXR1cm4gISF0aGlzLnBhbmVsXG4gICAgICA/IDxRdWVzdGlvbj50aGlzLnBhbmVsLmdldFF1ZXN0aW9uQnlWYWx1ZU5hbWUobmFtZSlcbiAgICAgIDogbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgb25DdXN0b21Qcm9jZXNzVGV4dCh0ZXh0VmFsdWU6IFRleHRQcmVQcm9jZXNzb3JWYWx1ZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvL0lUZXh0UHJvY2Vzc29yXG4gIHByaXZhdGUgZ2V0UHJvY2Vzc2VkVGV4dFZhbHVlKHRleHRWYWx1ZTogVGV4dFByZVByb2Nlc3NvclZhbHVlKSB7XG4gICAgaWYgKCF0ZXh0VmFsdWUpIHJldHVybjtcbiAgICBpZiAodGhpcy5vbkN1c3RvbVByb2Nlc3NUZXh0KHRleHRWYWx1ZSkpIHJldHVybjtcbiAgICB2YXIgZmlyc3ROYW1lID0gbmV3IFByb2Nlc3NWYWx1ZSgpLmdldEZpcnN0TmFtZSh0ZXh0VmFsdWUubmFtZSk7XG4gICAgdGV4dFZhbHVlLmlzRXhpc3RzID0gZmlyc3ROYW1lID09IHRoaXMudmFyaWFibGVOYW1lO1xuICAgIHRleHRWYWx1ZS5jYW5Qcm9jZXNzID0gdGV4dFZhbHVlLmlzRXhpc3RzO1xuICAgIGlmICghdGV4dFZhbHVlLmNhblByb2Nlc3MpIHJldHVybjtcbiAgICAvL25hbWUgc2hvdWxkIHN0YXJ0IHdpdGggdGhlIHZhcmlhYmxlIG5hbWVcbiAgICB0ZXh0VmFsdWUubmFtZSA9IHRleHRWYWx1ZS5uYW1lLnJlcGxhY2UodGhpcy52YXJpYWJsZU5hbWUgKyBcIi5cIiwgXCJcIik7XG4gICAgdmFyIGZpcnN0TmFtZSA9IG5ldyBQcm9jZXNzVmFsdWUoKS5nZXRGaXJzdE5hbWUodGV4dFZhbHVlLm5hbWUpO1xuICAgIHZhciBxdWVzdGlvbiA9IHRoaXMuZ2V0UXVlc3Rpb25CeU5hbWUoZmlyc3ROYW1lKTtcbiAgICB2YXIgdmFsdWVzID0ge307XG4gICAgaWYgKHF1ZXN0aW9uKSB7XG4gICAgICAoPGFueT52YWx1ZXMpW2ZpcnN0TmFtZV0gPSB0ZXh0VmFsdWUucmV0dXJuRGlzcGxheVZhbHVlXG4gICAgICAgID8gcXVlc3Rpb24uZGlzcGxheVZhbHVlXG4gICAgICAgIDogcXVlc3Rpb24udmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBhbGxWYWx1ZXMgPSAhIXRoaXMucGFuZWwgPyB0aGlzLmdldFZhbHVlcygpIDogbnVsbDtcbiAgICAgIGlmIChhbGxWYWx1ZXMpIHtcbiAgICAgICAgKDxhbnk+dmFsdWVzKVtmaXJzdE5hbWVdID0gYWxsVmFsdWVzW2ZpcnN0TmFtZV07XG4gICAgICB9XG4gICAgfVxuICAgIHRleHRWYWx1ZS52YWx1ZSA9IG5ldyBQcm9jZXNzVmFsdWUoKS5nZXRWYWx1ZSh0ZXh0VmFsdWUubmFtZSwgdmFsdWVzKTtcbiAgfVxuICBwcm9jZXNzVGV4dCh0ZXh0OiBzdHJpbmcsIHJldHVybkRpc3BsYXlWYWx1ZTogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgdGV4dCA9IHRoaXMudGV4dFByZVByb2Nlc3Nvci5wcm9jZXNzKHRleHQsIHJldHVybkRpc3BsYXlWYWx1ZSk7XG4gICAgdmFyIHN1cnZleSA9IHRoaXMuc3VydmV5O1xuICAgIHJldHVybiBzdXJ2ZXkgPyBzdXJ2ZXkucHJvY2Vzc1RleHQodGV4dCwgcmV0dXJuRGlzcGxheVZhbHVlKSA6IHRleHQ7XG4gIH1cbiAgcHJvY2Vzc1RleHRFeCh0ZXh0OiBzdHJpbmcsIHJldHVybkRpc3BsYXlWYWx1ZTogYm9vbGVhbik6IGFueSB7XG4gICAgdGV4dCA9IHRoaXMucHJvY2Vzc1RleHQodGV4dCwgcmV0dXJuRGlzcGxheVZhbHVlKTtcbiAgICB2YXIgaGFzQWxsVmFsdWVzT25MYXN0UnVuID0gdGhpcy50ZXh0UHJlUHJvY2Vzc29yLmhhc0FsbFZhbHVlc09uTGFzdFJ1bjtcbiAgICB2YXIgcmVzID0geyBoYXNBbGxWYWx1ZXNPbkxhc3RSdW46IHRydWUsIHRleHQ6IHRleHQgfTtcbiAgICBpZiAodGhpcy5zdXJ2ZXkpIHtcbiAgICAgIHJlcyA9IHRoaXMuc3VydmV5LnByb2Nlc3NUZXh0RXgodGV4dCwgcmV0dXJuRGlzcGxheVZhbHVlLCBmYWxzZSk7XG4gICAgfVxuICAgIHJlcy5oYXNBbGxWYWx1ZXNPbkxhc3RSdW4gPVxuICAgICAgcmVzLmhhc0FsbFZhbHVlc09uTGFzdFJ1biAmJiBoYXNBbGxWYWx1ZXNPbkxhc3RSdW47XG4gICAgcmV0dXJuIHJlcztcbiAgfVxufVxuIiwiaW1wb3J0IHsgSGFzaFRhYmxlLCBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IElTdXJ2ZXkgfSBmcm9tIFwiLi9iYXNlLWludGVyZmFjZXNcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBDb25kaXRpb25SdW5uZXIsIEV4cHJlc3Npb25SdW5uZXIgfSBmcm9tIFwiLi9jb25kaXRpb25zXCI7XG5pbXBvcnQgeyBPcGVyYW5kTWFrZXIgfSBmcm9tIFwiLi9leHByZXNzaW9ucy9leHByZXNzaW9uc1wiO1xuaW1wb3J0IHsgUHJvY2Vzc1ZhbHVlIH0gZnJvbSBcIi4vY29uZGl0aW9uUHJvY2Vzc1ZhbHVlXCI7XG5pbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzXCI7XG5cbi8qKlxuICogQSBiYXNlIGNsYXNzIGZvciBhbGwgdHJpZ2dlcnMuXG4gKiBBIHRyaWdnZXIgY2FsbHMgYSBtZXRob2Qgd2hlbiB0aGUgZXhwcmVzc2lvbiBjaGFuZ2UgdGhlIHJlc3VsdDogZnJvbSBmYWxzZSB0byB0cnVlIG9yIGZyb20gdHJ1ZSB0byBmYWxzZS5cbiAqIFBsZWFzZSBub3RlLCBpdCBydW5zIG9ubHkgb25lIGNoYW5naW5nIHRoZSBleHByZXNzaW9uIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFRyaWdnZXIgZXh0ZW5kcyBCYXNlIHtcbiAgc3RhdGljIG9wZXJhdG9yc1ZhbHVlOiBIYXNoVGFibGU8RnVuY3Rpb24+ID0gbnVsbDtcbiAgc3RhdGljIGdldCBvcGVyYXRvcnMoKSB7XG4gICAgaWYgKFRyaWdnZXIub3BlcmF0b3JzVmFsdWUgIT0gbnVsbCkgcmV0dXJuIFRyaWdnZXIub3BlcmF0b3JzVmFsdWU7XG4gICAgVHJpZ2dlci5vcGVyYXRvcnNWYWx1ZSA9IHtcbiAgICAgIGVtcHR5OiBmdW5jdGlvbih2YWx1ZTogYW55LCBleHBlY3RlZFZhbHVlOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuICF2YWx1ZTtcbiAgICAgIH0sXG4gICAgICBub3RlbXB0eTogZnVuY3Rpb24odmFsdWU6IGFueSwgZXhwZWN0ZWRWYWx1ZTogYW55KSB7XG4gICAgICAgIHJldHVybiAhIXZhbHVlO1xuICAgICAgfSxcbiAgICAgIGVxdWFsOiBmdW5jdGlvbih2YWx1ZTogYW55LCBleHBlY3RlZFZhbHVlOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09IGV4cGVjdGVkVmFsdWU7XG4gICAgICB9LFxuICAgICAgbm90ZXF1YWw6IGZ1bmN0aW9uKHZhbHVlOiBhbnksIGV4cGVjdGVkVmFsdWU6IGFueSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgIT0gZXhwZWN0ZWRWYWx1ZTtcbiAgICAgIH0sXG4gICAgICBjb250YWluczogZnVuY3Rpb24odmFsdWU6IGFueSwgZXhwZWN0ZWRWYWx1ZTogYW55KSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSAmJiB2YWx1ZVtcImluZGV4T2ZcIl0gJiYgdmFsdWUuaW5kZXhPZihleHBlY3RlZFZhbHVlKSA+IC0xO1xuICAgICAgfSxcbiAgICAgIG5vdGNvbnRhaW5zOiBmdW5jdGlvbih2YWx1ZTogYW55LCBleHBlY3RlZFZhbHVlOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAhdmFsdWUgfHwgIXZhbHVlW1wiaW5kZXhPZlwiXSB8fCB2YWx1ZS5pbmRleE9mKGV4cGVjdGVkVmFsdWUpID09IC0xXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgZ3JlYXRlcjogZnVuY3Rpb24odmFsdWU6IGFueSwgZXhwZWN0ZWRWYWx1ZTogYW55KSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA+IGV4cGVjdGVkVmFsdWU7XG4gICAgICB9LFxuICAgICAgbGVzczogZnVuY3Rpb24odmFsdWU6IGFueSwgZXhwZWN0ZWRWYWx1ZTogYW55KSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA8IGV4cGVjdGVkVmFsdWU7XG4gICAgICB9LFxuICAgICAgZ3JlYXRlcm9yZXF1YWw6IGZ1bmN0aW9uKHZhbHVlOiBhbnksIGV4cGVjdGVkVmFsdWU6IGFueSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPj0gZXhwZWN0ZWRWYWx1ZTtcbiAgICAgIH0sXG4gICAgICBsZXNzb3JlcXVhbDogZnVuY3Rpb24odmFsdWU6IGFueSwgZXhwZWN0ZWRWYWx1ZTogYW55KSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA8PSBleHBlY3RlZFZhbHVlO1xuICAgICAgfSxcbiAgICB9O1xuICAgIHJldHVybiBUcmlnZ2VyLm9wZXJhdG9yc1ZhbHVlO1xuICB9XG4gIHByaXZhdGUgY29uZGl0aW9uUnVubmVyOiBDb25kaXRpb25SdW5uZXI7XG4gIHByaXZhdGUgdXNlZE5hbWVzOiBBcnJheTxzdHJpbmc+O1xuICBwcml2YXRlIGhhc0Z1bmN0aW9uOiBib29sZWFuO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMudXNlZE5hbWVzID0gW107XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydGllc1ZhbHVlQ2hhbmdlZChcbiAgICAgIFtcIm9wZXJhdG9yXCIsIFwidmFsdWVcIiwgXCJuYW1lXCJdLFxuICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgIHNlbGYub2xkUHJvcGVydGllc0NoYW5nZWQoKTtcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJleHByZXNzaW9uXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5vbkV4cHJlc3Npb25DaGFuZ2VkKCk7XG4gICAgfSk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJ0cmlnZ2VyYmFzZVwiO1xuICB9XG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHZhciByZXMgPSB0aGlzLmdldFR5cGUoKS5yZXBsYWNlKFwidHJpZ2dlclwiLCBcIlwiKTtcbiAgICB2YXIgZXhwID0gISF0aGlzLmV4cHJlc3Npb24gPyB0aGlzLmV4cHJlc3Npb24gOiB0aGlzLmJ1aWxkRXhwcmVzc2lvbigpO1xuICAgIGlmIChleHApIHtcbiAgICAgIHJlcyArPSBcIiwgXCIgKyBleHA7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGdldCBvcGVyYXRvcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJvcGVyYXRvclwiLCBcImVxdWFsXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgb3BlcmF0b3IodmFsdWU6IHN0cmluZykge1xuICAgIGlmICghdmFsdWUpIHJldHVybjtcbiAgICB2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKCFUcmlnZ2VyLm9wZXJhdG9yc1t2YWx1ZV0pIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJvcGVyYXRvclwiLCB2YWx1ZSk7XG4gIH1cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2YWx1ZVwiLCBudWxsKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZhbHVlKHZhbDogYW55KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidmFsdWVcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibmFtZVwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG5hbWUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJuYW1lXCIsIHZhbCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGV4cHJlc3Npb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZXhwcmVzc2lvblwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGV4cHJlc3Npb24odmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJleHByZXNzaW9uXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGNoZWNrRXhwcmVzc2lvbihcbiAgICBrZXlzOiBhbnksXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PiA9IG51bGxcbiAgKSB7XG4gICAgaWYgKCF0aGlzLmlzQ2hlY2tSZXF1aXJlZChrZXlzKSkgcmV0dXJuO1xuICAgIGlmICghIXRoaXMuY29uZGl0aW9uUnVubmVyKSB7XG4gICAgICB0aGlzLnBlcmZvcm0odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGNoZWNrKHZhbHVlOiBhbnkpIHtcbiAgICB2YXIgdHJpZ2dlclJlc3VsdCA9IFRyaWdnZXIub3BlcmF0b3JzW3RoaXMub3BlcmF0b3JdKHZhbHVlLCB0aGlzLnZhbHVlKTtcbiAgICBpZiAodHJpZ2dlclJlc3VsdCkge1xuICAgICAgdGhpcy5vblN1Y2Nlc3Moe30sIG51bGwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uRmFpbHVyZSgpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHBlcmZvcm0odmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICB0aGlzLmNvbmRpdGlvblJ1bm5lci5vblJ1bkNvbXBsZXRlID0gKHJlczogYm9vbGVhbikgPT4ge1xuICAgICAgdGhpcy50cmlnZ2VyUmVzdWx0KHJlcywgdmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB9O1xuICAgIHRoaXMuY29uZGl0aW9uUnVubmVyLnJ1bih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIHByaXZhdGUgdHJpZ2dlclJlc3VsdChcbiAgICByZXM6IGJvb2xlYW4sXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApIHtcbiAgICBpZiAocmVzKSB7XG4gICAgICB0aGlzLm9uU3VjY2Vzcyh2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uRmFpbHVyZSgpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgb25TdWNjZXNzKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7fVxuICBwcm90ZWN0ZWQgb25GYWlsdXJlKCkge31cbiAgZW5kTG9hZGluZ0Zyb21Kc29uKCkge1xuICAgIHN1cGVyLmVuZExvYWRpbmdGcm9tSnNvbigpO1xuICAgIHRoaXMub2xkUHJvcGVydGllc0NoYW5nZWQoKTtcbiAgfVxuICBwcml2YXRlIG9sZFByb3BlcnRpZXNDaGFuZ2VkKCkge1xuICAgIHRoaXMub25FeHByZXNzaW9uQ2hhbmdlZCgpO1xuICB9XG4gIHByaXZhdGUgb25FeHByZXNzaW9uQ2hhbmdlZCgpIHtcbiAgICB0aGlzLnVzZWROYW1lcyA9IFtdO1xuICAgIHRoaXMuaGFzRnVuY3Rpb24gPSBmYWxzZTtcbiAgICB0aGlzLmNvbmRpdGlvblJ1bm5lciA9IG51bGw7XG4gIH1cbiAgcHVibGljIGJ1aWxkRXhwcmVzc2lvbigpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5uYW1lKSByZXR1cm4gXCJcIjtcbiAgICBpZiAodGhpcy5pc1ZhbHVlRW1wdHkodGhpcy52YWx1ZSkgJiYgdGhpcy5pc1JlcXVpcmVWYWx1ZSkgcmV0dXJuIFwiXCI7XG4gICAgcmV0dXJuIChcbiAgICAgIFwie1wiICtcbiAgICAgIHRoaXMubmFtZSArXG4gICAgICBcIn0gXCIgK1xuICAgICAgdGhpcy5vcGVyYXRvciArXG4gICAgICBcIiBcIiArXG4gICAgICBPcGVyYW5kTWFrZXIudG9PcGVyYW5kU3RyaW5nKHRoaXMudmFsdWUpXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGlzQ2hlY2tSZXF1aXJlZChrZXlzOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoIWtleXMpIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLmJ1aWxkVXNlZE5hbWVzKCk7XG4gICAgaWYgKHRoaXMuaGFzRnVuY3Rpb24gPT09IHRydWUpIHJldHVybiB0cnVlO1xuICAgIHZhciBwcm9jZXNzVmFsdWUgPSBuZXcgUHJvY2Vzc1ZhbHVlKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnVzZWROYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG5hbWUgPSB0aGlzLnVzZWROYW1lc1tpXTtcbiAgICAgIGlmIChrZXlzLmhhc093blByb3BlcnR5KG5hbWUpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIHZhciBmaXJzdE5hbWUgPSBwcm9jZXNzVmFsdWUuZ2V0Rmlyc3ROYW1lKG5hbWUpO1xuICAgICAgaWYgKCFrZXlzLmhhc093blByb3BlcnR5KGZpcnN0TmFtZSkpIGNvbnRpbnVlO1xuICAgICAgaWYgKG5hbWUgPT0gZmlyc3ROYW1lKSByZXR1cm4gdHJ1ZTtcbiAgICAgIHZhciBrZXlWYWx1ZSA9IGtleXNbZmlyc3ROYW1lXTtcbiAgICAgIGlmIChrZXlWYWx1ZSA9PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgaWYgKFxuICAgICAgICAha2V5VmFsdWUuaGFzT3duUHJvcGVydHkoXCJvbGRWYWx1ZVwiKSB8fFxuICAgICAgICAha2V5VmFsdWUuaGFzT3duUHJvcGVydHkoXCJuZXdWYWx1ZVwiKVxuICAgICAgKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIHZhciB2OiBhbnkgPSB7fTtcbiAgICAgIHZbZmlyc3ROYW1lXSA9IGtleVZhbHVlW1wib2xkVmFsdWVcIl07XG4gICAgICB2YXIgb2xkVmFsdWUgPSBwcm9jZXNzVmFsdWUuZ2V0VmFsdWUobmFtZSwgdik7XG4gICAgICB2W2ZpcnN0TmFtZV0gPSBrZXlWYWx1ZVtcIm5ld1ZhbHVlXCJdO1xuICAgICAgdmFyIG5ld1ZhbHVlID0gcHJvY2Vzc1ZhbHVlLmdldFZhbHVlKG5hbWUsIHYpO1xuICAgICAgcmV0dXJuICF0aGlzLmlzVHdvVmFsdWVFcXVhbHMob2xkVmFsdWUsIG5ld1ZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByaXZhdGUgYnVpbGRVc2VkTmFtZXMoKSB7XG4gICAgaWYgKCEhdGhpcy5jb25kaXRpb25SdW5uZXIpIHJldHVybjtcbiAgICB2YXIgZXhwcmVzc2lvbiA9IHRoaXMuZXhwcmVzc2lvbjtcbiAgICBpZiAoIWV4cHJlc3Npb24pIHtcbiAgICAgIGV4cHJlc3Npb24gPSB0aGlzLmJ1aWxkRXhwcmVzc2lvbigpO1xuICAgIH1cbiAgICBpZiAoIWV4cHJlc3Npb24pIHJldHVybjtcbiAgICB0aGlzLmNvbmRpdGlvblJ1bm5lciA9IG5ldyBDb25kaXRpb25SdW5uZXIoZXhwcmVzc2lvbik7XG4gICAgdGhpcy5oYXNGdW5jdGlvbiA9IHRoaXMuY29uZGl0aW9uUnVubmVyLmhhc0Z1bmN0aW9uKCk7XG4gICAgdGhpcy51c2VkTmFtZXMgPSB0aGlzLmNvbmRpdGlvblJ1bm5lci5nZXRWYXJpYWJsZXMoKTtcbiAgfVxuICBwcml2YXRlIGdldCBpc1JlcXVpcmVWYWx1ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5vcGVyYXRvciAhPT0gXCJlbXB0eVwiICYmIHRoaXMub3BlcmF0b3IgIT0gXCJub3RlbXB0eVwiO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVN1cnZleVRyaWdnZXJPd25lciB7XG4gIGdldE9iamVjdHMocGFnZXM6IHN0cmluZ1tdLCBxdWVzdGlvbnM6IHN0cmluZ1tdKTogYW55W107XG4gIHNldENvbXBsZXRlZCgpOiBhbnk7XG4gIHNldFRyaWdnZXJWYWx1ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIGlzVmFyaWFibGU6IGJvb2xlYW4pOiBhbnk7XG4gIGNvcHlUcmlnZ2VyVmFsdWUobmFtZTogc3RyaW5nLCBmcm9tTmFtZTogc3RyaW5nKTogYW55O1xuICBmb2N1c1F1ZXN0aW9uKG5hbWU6IHN0cmluZyk6IGJvb2xlYW47XG59XG5cbi8qKlxuICogSXQgZXh0ZW5kcyB0aGUgVHJpZ2dlciBiYXNlIGNsYXNzIGFuZCBhZGQgcHJvcGVydGllcyByZXF1aXJlZCBmb3IgU3VydmV5SlMgY2xhc3Nlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFN1cnZleVRyaWdnZXIgZXh0ZW5kcyBUcmlnZ2VyIHtcbiAgcHJvdGVjdGVkIG93bmVyVmFsdWU6IElTdXJ2ZXlUcmlnZ2VyT3duZXIgPSBudWxsO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHB1YmxpYyBnZXQgb3duZXIoKTogSVN1cnZleVRyaWdnZXJPd25lciB7XG4gICAgcmV0dXJuIHRoaXMub3duZXJWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0T3duZXIob3duZXI6IElTdXJ2ZXlUcmlnZ2VyT3duZXIpIHtcbiAgICB0aGlzLm93bmVyVmFsdWUgPSBvd25lcjtcbiAgfVxuICBwdWJsaWMgZ2V0U3VydmV5KGxpdmU6IGJvb2xlYW4gPSBmYWxzZSk6IElTdXJ2ZXkge1xuICAgIHJldHVybiAhIXRoaXMub3duZXIgJiYgISEoPGFueT50aGlzLm93bmVyKVtcImdldFN1cnZleVwiXVxuICAgICAgPyAoPGFueT50aGlzLm93bmVyKS5nZXRTdXJ2ZXkoKVxuICAgICAgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNPbk5leHRQYWdlKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuLyoqXG4gKiBJZiBleHByZXNzaW9uIHJldHVybnMgdHJ1ZSwgaXQgbWFrZXMgcXVlc3Rpb25zL3BhZ2VzIHZpc2libGUuXG4gKiBPaHRlcndpc2UgaXQgbWFrZXMgdGhlbSBpbnZpc2libGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlUcmlnZ2VyVmlzaWJsZSBleHRlbmRzIFN1cnZleVRyaWdnZXIge1xuICBwdWJsaWMgcGFnZXM6IHN0cmluZ1tdID0gW107XG4gIHB1YmxpYyBxdWVzdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJ2aXNpYmxldHJpZ2dlclwiO1xuICB9XG4gIHByb3RlY3RlZCBvblN1Y2Nlc3ModmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICB0aGlzLm9uVHJpZ2dlcih0aGlzLm9uSXRlbVN1Y2Nlc3MpO1xuICB9XG4gIHByb3RlY3RlZCBvbkZhaWx1cmUoKSB7XG4gICAgdGhpcy5vblRyaWdnZXIodGhpcy5vbkl0ZW1GYWlsdXJlKTtcbiAgfVxuICBwcml2YXRlIG9uVHJpZ2dlcihmdW5jOiBGdW5jdGlvbikge1xuICAgIGlmICghdGhpcy5vd25lcikgcmV0dXJuO1xuICAgIHZhciBvYmplY3RzID0gdGhpcy5vd25lci5nZXRPYmplY3RzKHRoaXMucGFnZXMsIHRoaXMucXVlc3Rpb25zKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZ1bmMob2JqZWN0c1tpXSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBvbkl0ZW1TdWNjZXNzKGl0ZW06IGFueSkge1xuICAgIGl0ZW0udmlzaWJsZSA9IHRydWU7XG4gIH1cbiAgcHJvdGVjdGVkIG9uSXRlbUZhaWx1cmUoaXRlbTogYW55KSB7XG4gICAgaXRlbS52aXNpYmxlID0gZmFsc2U7XG4gIH1cbn1cbi8qKlxuICogSWYgZXhwcmVzc2lvbiByZXR1cm5zIHRydWUsIGl0IGNvbXBsZXRlcyB0aGUgc3VydmV5LlxuICovXG5leHBvcnQgY2xhc3MgU3VydmV5VHJpZ2dlckNvbXBsZXRlIGV4dGVuZHMgU3VydmV5VHJpZ2dlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJjb21wbGV0ZXRyaWdnZXJcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzT25OZXh0UGFnZSgpIHtcbiAgICByZXR1cm4gIXNldHRpbmdzLmV4ZWN1dGVDb21wbGV0ZVRyaWdnZXJPblZhbHVlQ2hhbmdlZDtcbiAgfVxuICBwcm90ZWN0ZWQgb25TdWNjZXNzKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgaWYgKHRoaXMub3duZXIpIHRoaXMub3duZXIuc2V0Q29tcGxldGVkKCk7XG4gIH1cbn1cbi8qKlxuICogSWYgZXhwcmVzc2lvbiByZXR1cm5zIHRydWUsIHRoZSB2YWx1ZSBmcm9tIHByb3BlcnR5ICoqc2V0VmFsdWUqKiB3aWxsIGJlIHNldCB0byAqKnNldFRvTmFtZSoqXG4gKi9cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlUcmlnZ2VyU2V0VmFsdWUgZXh0ZW5kcyBTdXJ2ZXlUcmlnZ2VyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInNldHZhbHVldHJpZ2dlclwiO1xuICB9XG4gIHByb3RlY3RlZCBvblByb3BlcnR5VmFsdWVDaGFuZ2VkKG5hbWU6IHN0cmluZywgb2xkVmFsdWU6IGFueSwgbmV3VmFsdWU6IGFueSkge1xuICAgIHN1cGVyLm9uUHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTtcbiAgICBpZiAobmFtZSAhPT0gXCJzZXRUb05hbWVcIikgcmV0dXJuO1xuICAgIHZhciBzdXJ2ZXkgPSB0aGlzLmdldFN1cnZleSgpO1xuICAgIGlmIChzdXJ2ZXkgJiYgIXN1cnZleS5pc0xvYWRpbmdGcm9tSnNvbiAmJiBzdXJ2ZXkuaXNEZXNpZ25Nb2RlKSB7XG4gICAgICB0aGlzLnNldFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0IHNldFRvTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzZXRUb05hbWVcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBzZXRUb05hbWUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzZXRUb05hbWVcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHNldFZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNldFZhbHVlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2V0VmFsdWUodmFsOiBhbnkpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzZXRWYWx1ZVwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNWYXJpYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNWYXJpYWJsZVwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBpc1ZhcmlhYmxlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzVmFyaWFibGVcIiwgdmFsKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25TdWNjZXNzKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgaWYgKCF0aGlzLnNldFRvTmFtZSB8fCAhdGhpcy5vd25lcikgcmV0dXJuO1xuICAgIHRoaXMub3duZXIuc2V0VHJpZ2dlclZhbHVlKHRoaXMuc2V0VG9OYW1lLCB0aGlzLnNldFZhbHVlLCB0aGlzLmlzVmFyaWFibGUpO1xuICB9XG59XG4vKipcbiAqIElmIGV4cHJlc3Npb24gcmV0dXJucyB0cnVlLCB0aGUgc3VydmV5IGdvIHRvIHF1ZXN0aW9uICoqZ290b05hbWUqKiBhbmQgZm9jdXMgaXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlUcmlnZ2VyU2tpcCBleHRlbmRzIFN1cnZleVRyaWdnZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwic2tpcHRyaWdnZXJcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGdvdG9OYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImdvdG9OYW1lXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZ290b05hbWUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJnb3RvTmFtZVwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNPbk5leHRQYWdlKCkge1xuICAgIHJldHVybiAhc2V0dGluZ3MuZXhlY3V0ZVNraXBUcmlnZ2VyT25WYWx1ZUNoYW5nZWQ7XG4gIH1cbiAgcHJvdGVjdGVkIG9uU3VjY2Vzcyh2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIGlmICghdGhpcy5nb3RvTmFtZSB8fCAhdGhpcy5vd25lcikgcmV0dXJuO1xuICAgIHRoaXMub3duZXIuZm9jdXNRdWVzdGlvbih0aGlzLmdvdG9OYW1lKTtcbiAgfVxufVxuLyoqXG4gKiBJZiBleHByZXNzaW9uIHJldHVybnMgdHJ1ZSwgdGhlICoqcnVuRXhwcmVzc2lvbioqIHdpbGwgYmUgcnVuLiBJZiAqKnNldFRvTmFtZSoqIHByb3BlcnR5IGlzIG5vdCBlbXB0eSB0aGVuIHRoZSByZXN1bHQgb2YgKipydW5FeHByZXNzaW9uKiogd2lsbCBiZSBzZXQgdG8gaXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlUcmlnZ2VyUnVuRXhwcmVzc2lvbiBleHRlbmRzIFN1cnZleVRyaWdnZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwicnVuZXhwcmVzc2lvbnRyaWdnZXJcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IHNldFRvTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzZXRUb05hbWVcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBzZXRUb05hbWUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzZXRUb05hbWVcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHJ1bkV4cHJlc3Npb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicnVuRXhwcmVzc2lvblwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJ1bkV4cHJlc3Npb24odmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJydW5FeHByZXNzaW9uXCIsIHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uU3VjY2Vzcyh2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIGlmICghdGhpcy5vd25lciB8fCAhdGhpcy5ydW5FeHByZXNzaW9uKSByZXR1cm47XG4gICAgdmFyIGV4cHJlc3Npb24gPSBuZXcgRXhwcmVzc2lvblJ1bm5lcih0aGlzLnJ1bkV4cHJlc3Npb24pO1xuICAgIGlmIChleHByZXNzaW9uLmNhblJ1bikge1xuICAgICAgZXhwcmVzc2lvbi5vblJ1bkNvbXBsZXRlID0gKHJlcykgPT4ge1xuICAgICAgICB0aGlzLm9uQ29tcGxldGVSdW5FeHByZXNzaW9uKHJlcyk7XG4gICAgICB9O1xuICAgICAgZXhwcmVzc2lvbi5ydW4odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBvbkNvbXBsZXRlUnVuRXhwcmVzc2lvbihuZXdWYWx1ZTogYW55KSB7XG4gICAgaWYgKCEhdGhpcy5zZXRUb05hbWUgJiYgbmV3VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5vd25lci5zZXRUcmlnZ2VyVmFsdWUodGhpcy5zZXRUb05hbWUsIG5ld1ZhbHVlLCBmYWxzZSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogSWYgZXhwcmVzc2lvbiByZXR1cm5zIHRydWUsIHRoZSB2YWx1ZSBmcm9tIHF1ZXN0aW9uICoqZnJvbU5hbWUqKiB3aWxsIGJlIHNldCBpbnRvICoqc2V0VG9OYW1lKiouXG4gKi9cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlUcmlnZ2VyQ29weVZhbHVlIGV4dGVuZHMgU3VydmV5VHJpZ2dlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHVibGljIGdldCBzZXRUb05hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2V0VG9OYW1lXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2V0VG9OYW1lKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2V0VG9OYW1lXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBmcm9tTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJmcm9tTmFtZVwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGZyb21OYW1lKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZnJvbU5hbWVcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImNvcHl2YWx1ZXRyaWdnZXJcIjtcbiAgfVxuICBwcm90ZWN0ZWQgb25TdWNjZXNzKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgaWYgKCF0aGlzLnNldFRvTmFtZSB8fCAhdGhpcy5vd25lcikgcmV0dXJuO1xuICAgIHRoaXMub3duZXIuY29weVRyaWdnZXJWYWx1ZSh0aGlzLnNldFRvTmFtZSwgdGhpcy5mcm9tTmFtZSk7XG4gIH1cbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcInRyaWdnZXJcIiwgW1xuICB7IG5hbWU6IFwib3BlcmF0b3JcIiwgZGVmYXVsdDogXCJlcXVhbFwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICB7IG5hbWU6IFwidmFsdWVcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgXCJleHByZXNzaW9uOmNvbmRpdGlvblwiLFxuXSk7XG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcInN1cnZleXRyaWdnZXJcIixcbiAgW3sgbmFtZTogXCJuYW1lXCIsIHZpc2libGU6IGZhbHNlIH1dLFxuICBudWxsLFxuICBcInRyaWdnZXJcIlxuKTtcblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwidmlzaWJsZXRyaWdnZXJcIixcbiAgW1wicGFnZXM6cGFnZXNcIiwgXCJxdWVzdGlvbnM6cXVlc3Rpb25zXCJdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFN1cnZleVRyaWdnZXJWaXNpYmxlKCk7XG4gIH0sXG4gIFwic3VydmV5dHJpZ2dlclwiXG4pO1xuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJjb21wbGV0ZXRyaWdnZXJcIixcbiAgW10sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgU3VydmV5VHJpZ2dlckNvbXBsZXRlKCk7XG4gIH0sXG4gIFwic3VydmV5dHJpZ2dlclwiXG4pO1xuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJzZXR2YWx1ZXRyaWdnZXJcIixcbiAgW1xuICAgIHsgbmFtZTogXCIhc2V0VG9OYW1lOnF1ZXN0aW9udmFsdWVcIiB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwic2V0VmFsdWU6dHJpZ2dlcnZhbHVlXCIsXG4gICAgICBkZXBlbmRzT246IFwic2V0VG9OYW1lXCIsXG4gICAgICB2aXNpYmxlSWY6IGZ1bmN0aW9uKG9iajogYW55KSB7XG4gICAgICAgIHJldHVybiAhIW9iaiAmJiAhIW9ialtcInNldFRvTmFtZVwiXTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7IG5hbWU6IFwiaXNWYXJpYWJsZTpib29sZWFuXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgU3VydmV5VHJpZ2dlclNldFZhbHVlKCk7XG4gIH0sXG4gIFwic3VydmV5dHJpZ2dlclwiXG4pO1xuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJjb3B5dmFsdWV0cmlnZ2VyXCIsXG4gIFt7IG5hbWU6IFwiIWZyb21OYW1lOnF1ZXN0aW9udmFsdWVcIiB9LCB7IG5hbWU6IFwiIXNldFRvTmFtZTpxdWVzdGlvbnZhbHVlXCIgfV0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgU3VydmV5VHJpZ2dlckNvcHlWYWx1ZSgpO1xuICB9LFxuICBcInN1cnZleXRyaWdnZXJcIlxuKTtcblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwic2tpcHRyaWdnZXJcIixcbiAgW3sgbmFtZTogXCIhZ290b05hbWU6cXVlc3Rpb25cIiB9XSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBTdXJ2ZXlUcmlnZ2VyU2tpcCgpO1xuICB9LFxuICBcInN1cnZleXRyaWdnZXJcIlxuKTtcblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwicnVuZXhwcmVzc2lvbnRyaWdnZXJcIixcbiAgW3sgbmFtZTogXCJzZXRUb05hbWU6cXVlc3Rpb252YWx1ZVwiIH0sIFwicnVuRXhwcmVzc2lvbjpleHByZXNzaW9uXCJdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFN1cnZleVRyaWdnZXJSdW5FeHByZXNzaW9uKCk7XG4gIH0sXG4gIFwic3VydmV5dHJpZ2dlclwiXG4pO1xuIiwiZXhwb3J0IGNsYXNzIENzc0NsYXNzQnVpbGRlciB7XG4gICAgcHJpdmF0ZSBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgcHVibGljIGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy50b1N0cmluZygpID09PSBcIlwiO1xuICAgIH1cbiAgICBwdWJsaWMgYXBwZW5kKHZhbHVlOiBzdHJpbmcsIGNvbmRpdGlvbjogYm9vbGVhbiA9IHRydWUpOiBDc3NDbGFzc0J1aWxkZXIge1xuICAgICAgaWYgKCEhdmFsdWUgJiYgY29uZGl0aW9uKSB0aGlzLmNsYXNzZXMucHVzaCh2YWx1ZSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5jbGFzc2VzLmpvaW4oXCIgXCIpO1xuICAgIH1cbn0iLCJsZXQgX2lzTW9iaWxlID0gZmFsc2U7XG5sZXQgdmVuZG9yID0gbnVsbDtcblxuaWYgKFxuICB0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiICYmXG4gIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgbmF2aWdhdG9yICYmXG4gIHdpbmRvd1xuKSB7XG4gIHZlbmRvciA9IG5hdmlnYXRvci51c2VyQWdlbnQgfHwgbmF2aWdhdG9yLnZlbmRvciB8fCAoPGFueT53aW5kb3cpLm9wZXJhO1xufVxuXG4oZnVuY3Rpb24gKGE6IGFueSkge1xuICBpZiAoIWEpIHJldHVybjtcbiAgaWYgKFxuICAgIC8oYW5kcm9pZHxiYlxcZCt8bWVlZ28pLittb2JpbGV8YXZhbnRnb3xiYWRhXFwvfGJsYWNrYmVycnl8YmxhemVyfGNvbXBhbHxlbGFpbmV8ZmVubmVjfGhpcHRvcHxpZW1vYmlsZXxpcChob25lfG9kKXxpcmlzfGtpbmRsZXxsZ2UgfG1hZW1vfG1pZHB8bW1wfG1vYmlsZS4rZmlyZWZveHxuZXRmcm9udHxvcGVyYSBtKG9ifGluKWl8cGFsbSggb3MpP3xwaG9uZXxwKGl4aXxyZSlcXC98cGx1Y2tlcnxwb2NrZXR8cHNwfHNlcmllcyg0fDYpMHxzeW1iaWFufHRyZW98dXBcXC4oYnJvd3NlcnxsaW5rKXx2b2RhZm9uZXx3YXB8d2luZG93cyBjZXx4ZGF8eGlpbm8vaS50ZXN0KFxuICAgICAgYVxuICAgICkgfHxcbiAgICAvMTIwN3w2MzEwfDY1OTB8M2dzb3w0dGhwfDUwWzEtNl1pfDc3MHN8ODAyc3xhIHdhfGFiYWN8YWMoZXJ8b298c1xcLSl8YWkoa298cm4pfGFsKGF2fGNhfGNvKXxhbW9pfGFuKGV4fG55fHl3KXxhcHR1fGFyKGNofGdvKXxhcyh0ZXx1cyl8YXR0d3xhdShkaXxcXC1tfHIgfHMgKXxhdmFufGJlKGNrfGxsfG5xKXxiaShsYnxyZCl8YmwoYWN8YXopfGJyKGV8dil3fGJ1bWJ8YndcXC0obnx1KXxjNTVcXC98Y2FwaXxjY3dhfGNkbVxcLXxjZWxsfGNodG18Y2xkY3xjbWRcXC18Y28obXB8bmQpfGNyYXd8ZGEoaXR8bGx8bmcpfGRidGV8ZGNcXC1zfGRldml8ZGljYXxkbW9ifGRvKGN8cClvfGRzKDEyfFxcLWQpfGVsKDQ5fGFpKXxlbShsMnx1bCl8ZXIoaWN8azApfGVzbDh8ZXooWzQtN10wfG9zfHdhfHplKXxmZXRjfGZseShcXC18Xyl8ZzEgdXxnNTYwfGdlbmV8Z2ZcXC01fGdcXC1tb3xnbyhcXC53fG9kKXxncihhZHx1bil8aGFpZXxoY2l0fGhkXFwtKG18cHx0KXxoZWlcXC18aGkocHR8dGEpfGhwKCBpfGlwKXxoc1xcLWN8aHQoYyhcXC18IHxffGF8Z3xwfHN8dCl8dHApfGh1KGF3fHRjKXxpXFwtKDIwfGdvfG1hKXxpMjMwfGlhYyggfFxcLXxcXC8pfGlicm98aWRlYXxpZzAxfGlrb218aW0xa3xpbm5vfGlwYXF8aXJpc3xqYSh0fHYpYXxqYnJvfGplbXV8amlnc3xrZGRpfGtlaml8a2d0KCB8XFwvKXxrbG9ufGtwdCB8a3djXFwtfGt5byhjfGspfGxlKG5vfHhpKXxsZyggZ3xcXC8oa3xsfHUpfDUwfDU0fFxcLVthLXddKXxsaWJ3fGx5bnh8bTFcXC13fG0zZ2F8bTUwXFwvfG1hKHRlfHVpfHhvKXxtYygwMXwyMXxjYSl8bVxcLWNyfG1lKHJjfHJpKXxtaShvOHxvYXx0cyl8bW1lZnxtbygwMXwwMnxiaXxkZXxkb3x0KFxcLXwgfG98dil8enopfG10KDUwfHAxfHYgKXxtd2JwfG15d2F8bjEwWzAtMl18bjIwWzItM118bjMwKDB8Mil8bjUwKDB8Mnw1KXxuNygwKDB8MSl8MTApfG5lKChjfG0pXFwtfG9ufHRmfHdmfHdnfHd0KXxub2soNnxpKXxuenBofG8yaW18b3AodGl8d3YpfG9yYW58b3dnMXxwODAwfHBhbihhfGR8dCl8cGR4Z3xwZygxM3xcXC0oWzEtOF18YykpfHBoaWx8cGlyZXxwbChheXx1Yyl8cG5cXC0yfHBvKGNrfHJ0fHNlKXxwcm94fHBzaW98cHRcXC1nfHFhXFwtYXxxYygwN3wxMnwyMXwzMnw2MHxcXC1bMi03XXxpXFwtKXxxdGVrfHIzODB8cjYwMHxyYWtzfHJpbTl8cm8odmV8em8pfHM1NVxcL3xzYShnZXxtYXxtbXxtc3xueXx2YSl8c2MoMDF8aFxcLXxvb3xwXFwtKXxzZGtcXC98c2UoYyhcXC18MHwxKXw0N3xtY3xuZHxyaSl8c2doXFwtfHNoYXJ8c2llKFxcLXxtKXxza1xcLTB8c2woNDV8aWQpfHNtKGFsfGFyfGIzfGl0fHQ1KXxzbyhmdHxueSl8c3AoMDF8aFxcLXx2XFwtfHYgKXxzeSgwMXxtYil8dDIoMTh8NTApfHQ2KDAwfDEwfDE4KXx0YShndHxsayl8dGNsXFwtfHRkZ1xcLXx0ZWwoaXxtKXx0aW1cXC18dFxcLW1vfHRvKHBsfHNoKXx0cyg3MHxtXFwtfG0zfG01KXx0eFxcLTl8dXAoXFwuYnxnMXxzaSl8dXRzdHx2NDAwfHY3NTB8dmVyaXx2aShyZ3x0ZSl8dmsoNDB8NVswLTNdfFxcLXYpfHZtNDB8dm9kYXx2dWxjfHZ4KDUyfDUzfDYwfDYxfDcwfDgwfDgxfDgzfDg1fDk4KXx3M2MoXFwtfCApfHdlYmN8d2hpdHx3aShnIHxuY3xudyl8d21sYnx3b251fHg3MDB8eWFzXFwtfHlvdXJ8emV0b3x6dGVcXC0vaS50ZXN0KFxuICAgICAgYS5zdWJzdHIoMCwgNClcbiAgICApXG4gIClcbiAgICBfaXNNb2JpbGUgPSB0cnVlO1xufSkodmVuZG9yKTtcblxuZXhwb3J0IGNvbnN0IElzTW9iaWxlID0gX2lzTW9iaWxlO1xuIiwiZXhwb3J0IHR5cGUgVmVydGljYWxQb3NpdGlvbiA9IFwidG9wXCIgfCBcImJvdHRvbVwiIHwgXCJtaWRkbGVcIjtcbmV4cG9ydCB0eXBlIEhvcml6b250YWxQb3NpdGlvbiA9IFwibGVmdFwiIHwgXCJyaWdodFwiIHwgXCJjZW50ZXJcIjtcbmV4cG9ydCBpbnRlcmZhY2UgSVBvc2l0aW9uIHtcbiAgbGVmdD86IG51bWJlciB8IHN0cmluZztcbiAgdG9wPzogbnVtYmVyIHwgc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElOdW1iZXJQb3NpdGlvbiBleHRlbmRzIElQb3NpdGlvbiB7XG4gIGxlZnQ/OiBudW1iZXI7XG4gIHRvcD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2l6ZSB7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgUG9wdXBVdGlscyB7XG4gIHB1YmxpYyBzdGF0aWMgY2FsY3VsYXRlUG9zaXRpb24oXG4gICAgdGFyZ2V0UmVjdDogQ2xpZW50UmVjdCxcbiAgICBoZWlnaHQ6IG51bWJlcixcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIHZlcnRpY2FsUG9zaXRpb246IFZlcnRpY2FsUG9zaXRpb24sXG4gICAgaG9yaXpvbnRhbFBvc2l0aW9uOiBIb3Jpem9udGFsUG9zaXRpb24sXG4gICAgc2hvd1BvaW50ZXI6IGJvb2xlYW5cbiAgKTogSU51bWJlclBvc2l0aW9uIHtcbiAgICBpZiAoaG9yaXpvbnRhbFBvc2l0aW9uID09IFwiY2VudGVyXCIpXG4gICAgICB2YXIgbGVmdCA9ICh0YXJnZXRSZWN0LmxlZnQgKyB0YXJnZXRSZWN0LnJpZ2h0IC0gd2lkdGgpIC8gMjtcbiAgICBlbHNlIGlmIChob3Jpem9udGFsUG9zaXRpb24gPT0gXCJsZWZ0XCIpIGxlZnQgPSB0YXJnZXRSZWN0LmxlZnQgLSB3aWR0aDtcbiAgICBlbHNlIGxlZnQgPSB0YXJnZXRSZWN0LnJpZ2h0O1xuXG4gICAgaWYgKHZlcnRpY2FsUG9zaXRpb24gPT0gXCJtaWRkbGVcIilcbiAgICAgIHZhciB0b3AgPSAodGFyZ2V0UmVjdC50b3AgKyB0YXJnZXRSZWN0LmJvdHRvbSAtIGhlaWdodCkgLyAyO1xuICAgIGVsc2UgaWYgKHZlcnRpY2FsUG9zaXRpb24gPT0gXCJ0b3BcIikgdG9wID0gdGFyZ2V0UmVjdC50b3AgLSBoZWlnaHQ7XG4gICAgZWxzZSB0b3AgPSB0YXJnZXRSZWN0LmJvdHRvbTtcblxuICAgIGlmIChzaG93UG9pbnRlcikge1xuICAgICAgaWYgKGhvcml6b250YWxQb3NpdGlvbiAhPSBcImNlbnRlclwiICYmIHZlcnRpY2FsUG9zaXRpb24gIT0gXCJtaWRkbGVcIikge1xuICAgICAgICBpZiAodmVydGljYWxQb3NpdGlvbiA9PSBcInRvcFwiKSB7XG4gICAgICAgICAgdG9wID0gdG9wICsgdGFyZ2V0UmVjdC5oZWlnaHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdG9wID0gdG9wIC0gdGFyZ2V0UmVjdC5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBsZWZ0OiBNYXRoLnJvdW5kKGxlZnQpLCB0b3A6IE1hdGgucm91bmQodG9wKSB9O1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyB1cGRhdGVWZXJ0aWNhbERpbWVuc2lvbnMoXG4gICAgdG9wOiBudW1iZXIsXG4gICAgaGVpZ2h0OiBudW1iZXIsXG4gICAgd2luZG93SGVpZ2h0OiBudW1iZXJcbiAgKSB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBpZiAodG9wIDwgMCkge1xuICAgICAgcmVzdWx0ID0geyBoZWlnaHQ6IGhlaWdodCArIHRvcCwgdG9wOiAwIH07XG4gICAgfSBlbHNlIGlmIChoZWlnaHQgKyB0b3AgPiB3aW5kb3dIZWlnaHQpIHtcbiAgICAgIGxldCBuZXdIZWlnaHQgPSBNYXRoLm1pbihoZWlnaHQsIHdpbmRvd0hlaWdodCAtIHRvcCk7XG4gICAgICByZXN1bHQgPSB7IGhlaWdodDogbmV3SGVpZ2h0LCB0b3A6IHRvcCB9O1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyB1cGRhdGVWZXJ0aWNhbFBvc2l0aW9uKFxuICAgIHRhcmdldFJlY3Q6IENsaWVudFJlY3QsXG4gICAgaGVpZ2h0OiBudW1iZXIsXG4gICAgdmVydGljYWxQb3NpdGlvbjogVmVydGljYWxQb3NpdGlvbixcbiAgICBzaG93UG9pbnRlcjogYm9vbGVhbixcbiAgICB3aW5kb3dIZWlnaHQ6IG51bWJlclxuICApOiBWZXJ0aWNhbFBvc2l0aW9uIHtcbiAgICBsZXQgZGVsdGFUb3AgPVxuICAgICAgaGVpZ2h0IC0gKHRhcmdldFJlY3QudG9wICsgKHNob3dQb2ludGVyID8gdGFyZ2V0UmVjdC5oZWlnaHQgOiAwKSk7XG4gICAgbGV0IGRlbHRhQm90dG9tID1cbiAgICAgIGhlaWdodCArXG4gICAgICB0YXJnZXRSZWN0LmJvdHRvbSAtXG4gICAgICAoc2hvd1BvaW50ZXIgPyB0YXJnZXRSZWN0LmhlaWdodCA6IDApIC1cbiAgICAgIHdpbmRvd0hlaWdodDtcbiAgICBpZiAoZGVsdGFUb3AgPiAwICYmIGRlbHRhQm90dG9tIDw9IDAgJiYgdmVydGljYWxQb3NpdGlvbiA9PSBcInRvcFwiKSB7XG4gICAgICB2ZXJ0aWNhbFBvc2l0aW9uID0gXCJib3R0b21cIjtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgZGVsdGFCb3R0b20gPiAwICYmXG4gICAgICBkZWx0YVRvcCA8PSAwICYmXG4gICAgICB2ZXJ0aWNhbFBvc2l0aW9uID09IFwiYm90dG9tXCJcbiAgICApIHtcbiAgICAgIHZlcnRpY2FsUG9zaXRpb24gPSBcInRvcFwiO1xuICAgIH0gZWxzZSBpZiAoZGVsdGFCb3R0b20gPiAwICYmIGRlbHRhVG9wID4gMCkge1xuICAgICAgdmVydGljYWxQb3NpdGlvbiA9IGRlbHRhVG9wIDwgZGVsdGFCb3R0b20gPyBcInRvcFwiIDogXCJib3R0b21cIjtcbiAgICB9XG4gICAgcmV0dXJuIHZlcnRpY2FsUG9zaXRpb247XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGNhbGN1bGF0ZVBvcHVwRGlyZWN0aW9uKFxuICAgIHZlcnRpY2FsUG9zaXRpb246IFZlcnRpY2FsUG9zaXRpb24sXG4gICAgaG9yaXpvbnRhbFBvc2l0aW9uOiBIb3Jpem9udGFsUG9zaXRpb25cbiAgKSB7XG4gICAgdmFyIHBvcHVwRGlyZWN0aW9uOiBzdHJpbmc7XG4gICAgaWYgKGhvcml6b250YWxQb3NpdGlvbiA9PSBcImNlbnRlclwiICYmIHZlcnRpY2FsUG9zaXRpb24gIT0gXCJtaWRkbGVcIikge1xuICAgICAgcG9wdXBEaXJlY3Rpb24gPSB2ZXJ0aWNhbFBvc2l0aW9uO1xuICAgIH0gZWxzZSBpZiAoaG9yaXpvbnRhbFBvc2l0aW9uICE9IFwiY2VudGVyXCIpIHtcbiAgICAgIHBvcHVwRGlyZWN0aW9uID0gaG9yaXpvbnRhbFBvc2l0aW9uO1xuICAgIH1cbiAgICByZXR1cm4gcG9wdXBEaXJlY3Rpb247XG4gIH1cblxuICAvL2NhbGxlZCB3aGVuIHNob3dQb2ludGVyICBpcyB0cnVlXG4gIHB1YmxpYyBzdGF0aWMgY2FsY3VsYXRlUG9pbnRlclRhcmdldChcbiAgICB0YXJnZXRSZWN0OiBDbGllbnRSZWN0LFxuICAgIHRvcDogbnVtYmVyLFxuICAgIGxlZnQ6IG51bWJlcixcbiAgICB2ZXJ0aWNhbFBvc2l0aW9uOiBWZXJ0aWNhbFBvc2l0aW9uLFxuICAgIGhvcml6b250YWxQb3NpdGlvbjogSG9yaXpvbnRhbFBvc2l0aW9uXG4gICkge1xuICAgIHZhciB0YXJnZXRQb3M6IElOdW1iZXJQb3NpdGlvbiA9IHt9O1xuICAgIGlmIChob3Jpem9udGFsUG9zaXRpb24gIT0gXCJjZW50ZXJcIikge1xuICAgICAgdGFyZ2V0UG9zLnRvcCA9IHRhcmdldFJlY3QudG9wICsgdGFyZ2V0UmVjdC5oZWlnaHQgLyAyO1xuICAgICAgdGFyZ2V0UG9zLmxlZnQgPSB0YXJnZXRSZWN0W2hvcml6b250YWxQb3NpdGlvbl07XG4gICAgfSBlbHNlIGlmICh2ZXJ0aWNhbFBvc2l0aW9uICE9IFwibWlkZGxlXCIpIHtcbiAgICAgIHRhcmdldFBvcy50b3AgPSB0YXJnZXRSZWN0W3ZlcnRpY2FsUG9zaXRpb25dO1xuICAgICAgdGFyZ2V0UG9zLmxlZnQgPSB0YXJnZXRSZWN0LmxlZnQgKyB0YXJnZXRSZWN0LndpZHRoIC8gMjtcbiAgICB9XG4gICAgdGFyZ2V0UG9zLmxlZnQgPSBNYXRoLnJvdW5kKHRhcmdldFBvcy5sZWZ0IC0gbGVmdCk7XG4gICAgdGFyZ2V0UG9zLnRvcCA9IE1hdGgucm91bmQodGFyZ2V0UG9zLnRvcCAtIHRvcCk7XG4gICAgcmV0dXJuIHRhcmdldFBvcztcbiAgfVxufVxuIiwiaW1wb3J0IHsgQWRhcHRpdmVBY3Rpb25Db250YWluZXIgfSBmcm9tIFwiLi4vYWN0aW9ucy9hZGFwdGl2ZS1jb250YWluZXJcIjtcblxuaW50ZXJmYWNlIElEaW1lbnNpb25zIHtcbiAgc2Nyb2xsOiBudW1iZXI7XG4gIG9mZnNldDogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgUmVzcG9uc2l2aXR5TWFuYWdlciB7XG4gIHByaXZhdGUgcmVzaXplT2JzZXJ2ZXI6IFJlc2l6ZU9ic2VydmVyID0gdW5kZWZpbmVkO1xuICBwcml2YXRlIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIG1pbkRpbWVuc2lvbkNvbnN0ID0gNTY7XG4gIHByaXZhdGUgc2VwYXJhdG9yU2l6ZSA9IDE3O1xuXG4gIHB1YmxpYyBnZXRDb21wdXRlZFN0eWxlOiAoXG4gICAgZWx0OiBFbGVtZW50XG4gICkgPT4gQ1NTU3R5bGVEZWNsYXJhdGlvbiA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLmJpbmQod2luZG93KTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgY29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCxcbiAgICBwcml2YXRlIG1vZGVsOiBBZGFwdGl2ZUFjdGlvbkNvbnRhaW5lcixcbiAgICBwcml2YXRlIGl0ZW1zU2VsZWN0b3I6IHN0cmluZyxcbiAgICBwcml2YXRlIGRvdHNJdGVtU2l6ZTogbnVtYmVyID0gNDhcbiAgKSB7XG4gICAgdGhpcy5tb2RlbC51cGRhdGVDYWxsYmFjayA9IChpc1Jlc2V0SW5pdGlhbGl6ZWQ6IGJvb2xlYW4pID0+IHtcbiAgICAgIGlmKGlzUmVzZXRJbml0aWFsaXplZClcbiAgICAgICAgdGhpcy5pc0luaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICBlbHNlXG4gICAgICAgIHRoaXMucHJvY2VzcygpO1xuICAgIH07XG4gICAgaWYgKHR5cGVvZiBSZXNpemVPYnNlcnZlciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoXykgPT4gdGhpcy5wcm9jZXNzKCkpO1xuICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci5vYnNlcnZlKHRoaXMuY29udGFpbmVyLnBhcmVudEVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXREaW1lbnNpb25zKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogSURpbWVuc2lvbnMge1xuICAgIHJldHVybiB7XG4gICAgICBzY3JvbGw6IGVsZW1lbnQuc2Nyb2xsV2lkdGgsXG4gICAgICBvZmZzZXQ6IGVsZW1lbnQub2Zmc2V0V2lkdGgsXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRBdmFpbGFibGVTcGFjZSgpOiBudW1iZXIge1xuICAgIGNvbnN0IHN0eWxlOiBDU1NTdHlsZURlY2xhcmF0aW9uID0gdGhpcy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuY29udGFpbmVyKTtcbiAgICBsZXQgc3BhY2UgPSB0aGlzLmNvbnRhaW5lci5vZmZzZXRXaWR0aDtcbiAgICBpZiAoc3R5bGUuYm94U2l6aW5nID09PSBcImJvcmRlci1ib3hcIikge1xuICAgICAgc3BhY2UgLT0gcGFyc2VGbG9hdChzdHlsZS5wYWRkaW5nTGVmdCkgKyBwYXJzZUZsb2F0KHN0eWxlLnBhZGRpbmdSaWdodCk7XG4gICAgfVxuICAgIHJldHVybiBzcGFjZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjYWxjSXRlbVNpemUoaXRlbTogSFRNTERpdkVsZW1lbnQpOiBudW1iZXIge1xuICAgIHJldHVybiBpdGVtLm9mZnNldFdpZHRoO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjSXRlbXNTaXplcygpIHtcbiAgICBjb25zdCBhY3Rpb25zID0gdGhpcy5tb2RlbC5hY3Rpb25zO1xuICAgIHRoaXMuY29udGFpbmVyXG4gICAgICAucXVlcnlTZWxlY3RvckFsbCh0aGlzLml0ZW1zU2VsZWN0b3IpXG4gICAgICAuZm9yRWFjaCgoaXRlbTogSFRNTERpdkVsZW1lbnQsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgbGV0IGN1cnJlbnRBY3Rpb24gPSBhY3Rpb25zW2luZGV4XTtcbiAgICAgICAgY3VycmVudEFjdGlvbi5tYXhEaW1lbnNpb24gPSB0aGlzLmNhbGNJdGVtU2l6ZShpdGVtKTtcbiAgICAgICAgY3VycmVudEFjdGlvbi5taW5EaW1lbnNpb24gPSBjdXJyZW50QWN0aW9uLmNhblNocmlua1xuICAgICAgICAgID8gdGhpcy5taW5EaW1lbnNpb25Db25zdCArXG4gICAgICAgICAgICAoY3VycmVudEFjdGlvbi5uZWVkU2VwYXJhdG9yID8gdGhpcy5zZXBhcmF0b3JTaXplIDogMClcbiAgICAgICAgICA6IGN1cnJlbnRBY3Rpb24ubWF4RGltZW5zaW9uO1xuICAgICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgaXNDb250YWluZXJWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIShcbiAgICAgIHRoaXMuY29udGFpbmVyLm9mZnNldFdpZHRoIHx8XG4gICAgICB0aGlzLmNvbnRhaW5lci5vZmZzZXRIZWlnaHQgfHxcbiAgICAgIHRoaXMuY29udGFpbmVyLmdldENsaWVudFJlY3RzKCkubGVuZ3RoXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIHByb2Nlc3MoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNDb250YWluZXJWaXNpYmxlKSB7XG4gICAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXplZCkge1xuICAgICAgICB0aGlzLm1vZGVsLmFjdGlvbnMuZm9yRWFjaCgoYWN0aW9uKSA9PiAoYWN0aW9uLm1vZGUgPSBcImxhcmdlXCIpKTtcbiAgICAgICAgdGhpcy5jYWxjSXRlbXNTaXplcygpO1xuICAgICAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5tb2RlbC5maXQodGhpcy5nZXRBdmFpbGFibGVTcGFjZSgpLCB0aGlzLmRvdHNJdGVtU2l6ZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5tb2RlbC51cGRhdGVDYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICBpZiAoISF0aGlzLnJlc2l6ZU9ic2VydmVyKSB7XG4gICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFZlcnRpY2FsUmVzcG9uc2l2aXR5TWFuYWdlciBleHRlbmRzIFJlc3BvbnNpdml0eU1hbmFnZXIge1xuICBjb25zdHJ1Y3RvcihcbiAgICBjb250YWluZXI6IEhUTUxEaXZFbGVtZW50LFxuICAgIG1vZGVsOiBBZGFwdGl2ZUFjdGlvbkNvbnRhaW5lcixcbiAgICBpdGVtc1NlbGVjdG9yOiBzdHJpbmcsXG4gICAgZG90c0l0ZW1TaXplPzogbnVtYmVyXG4gICkge1xuICAgIHN1cGVyKGNvbnRhaW5lciwgbW9kZWwsIGl0ZW1zU2VsZWN0b3IsIGRvdHNJdGVtU2l6ZSk7XG4gICAgdGhpcy5taW5EaW1lbnNpb25Db25zdCA9IDQwO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldERpbWVuc2lvbnMoKTogSURpbWVuc2lvbnMge1xuICAgIHJldHVybiB7XG4gICAgICBzY3JvbGw6IHRoaXMuY29udGFpbmVyLnNjcm9sbEhlaWdodCxcbiAgICAgIG9mZnNldDogdGhpcy5jb250YWluZXIub2Zmc2V0SGVpZ2h0LFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0QXZhaWxhYmxlU3BhY2UoKTogbnVtYmVyIHtcbiAgICBjb25zdCBzdHlsZTogQ1NTU3R5bGVEZWNsYXJhdGlvbiA9IHRoaXMuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmNvbnRhaW5lcik7XG4gICAgbGV0IHNwYWNlOiBudW1iZXIgPSB0aGlzLmNvbnRhaW5lci5vZmZzZXRIZWlnaHQ7XG4gICAgaWYgKHN0eWxlLmJveFNpemluZyA9PT0gXCJib3JkZXItYm94XCIpIHtcbiAgICAgIHNwYWNlIC09IHBhcnNlRmxvYXQoc3R5bGUucGFkZGluZ1RvcCkgKyBwYXJzZUZsb2F0KHN0eWxlLnBhZGRpbmdCb3R0b20pO1xuICAgIH1cbiAgICByZXR1cm4gc3BhY2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2FsY0l0ZW1TaXplKGl0ZW06IEhUTUxEaXZFbGVtZW50KTogbnVtYmVyIHtcbiAgICByZXR1cm4gaXRlbS5vZmZzZXRIZWlnaHQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IHNldHRpbmdzIH0gZnJvbSBcIi4vLi4vc2V0dGluZ3NcIjtcbmZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9ucyhhOiBhbnksIGI6IGFueSkge1xuICBjb25zdCByZWdFeFN0cmlwMDogUmVnRXhwID0gLyhcXC4wKykrJC87XG4gIGNvbnN0IHNlZ21lbnRzQTogc3RyaW5nW10gPSBhLnJlcGxhY2UocmVnRXhTdHJpcDAsIFwiXCIpLnNwbGl0KFwiLlwiKTtcbiAgY29uc3Qgc2VnbWVudHNCOiBzdHJpbmdbXSA9IGIucmVwbGFjZShyZWdFeFN0cmlwMCwgXCJcIikuc3BsaXQoXCIuXCIpO1xuICBjb25zdCBsZW46IG51bWJlciA9IE1hdGgubWluKHNlZ21lbnRzQS5sZW5ndGgsIHNlZ21lbnRzQi5sZW5ndGgpO1xuICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjb25zdCBkaWZmOiBudW1iZXIgPVxuICAgICAgcGFyc2VJbnQoc2VnbWVudHNBW2ldLCAxMCkgLSBwYXJzZUludChzZWdtZW50c0JbaV0sIDEwKTtcbiAgICBpZiAoZGlmZikge1xuICAgICAgcmV0dXJuIGRpZmY7XG4gICAgfVxuICB9XG4gIHJldHVybiBzZWdtZW50c0EubGVuZ3RoIC0gc2VnbWVudHNCLmxlbmd0aDtcbn1cbmZ1bmN0aW9uIGNvbmZpcm1BY3Rpb24obWVzc2FnZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICghIXNldHRpbmdzICYmICEhc2V0dGluZ3MuY29uZmlybUFjdGlvbkZ1bmMpXG4gICAgcmV0dXJuIHNldHRpbmdzLmNvbmZpcm1BY3Rpb25GdW5jKG1lc3NhZ2UpO1xuICByZXR1cm4gY29uZmlybShtZXNzYWdlKTtcbn1cbmZ1bmN0aW9uIGRldGVjdElFQnJvd3NlcigpIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgdWE6IHN0cmluZyA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50O1xuICBjb25zdCBvbGRJZTogbnVtYmVyID0gdWEuaW5kZXhPZihcIk1TSUUgXCIpO1xuICBjb25zdCBlbGV2ZW5JZTogbnVtYmVyID0gdWEuaW5kZXhPZihcIlRyaWRlbnQvXCIpO1xuICByZXR1cm4gb2xkSWUgPiAtMSB8fCBlbGV2ZW5JZSA+IC0xO1xufVxuZnVuY3Rpb24gZGV0ZWN0SUVPckVkZ2UoKSB7XG4gIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZmFsc2U7XG4gIGlmICh0eXBlb2YgKDxhbnk+ZGV0ZWN0SUVPckVkZ2UpLmlzSUVPckVkZ2UgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBjb25zdCB1YTogc3RyaW5nID0gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQ7XG4gICAgY29uc3QgbXNpZTogbnVtYmVyID0gdWEuaW5kZXhPZihcIk1TSUUgXCIpO1xuICAgIGNvbnN0IHRyaWRlbnQ6IG51bWJlciA9IHVhLmluZGV4T2YoXCJUcmlkZW50L1wiKTtcbiAgICBjb25zdCBlZGdlOiBudW1iZXIgPSB1YS5pbmRleE9mKFwiRWRnZS9cIik7XG4gICAgKDxhbnk+ZGV0ZWN0SUVPckVkZ2UpLmlzSUVPckVkZ2UgPSBlZGdlID4gMCB8fCB0cmlkZW50ID4gMCB8fCBtc2llID4gMDtcbiAgfVxuICByZXR1cm4gKDxhbnk+ZGV0ZWN0SUVPckVkZ2UpLmlzSUVPckVkZ2U7XG59XG5mdW5jdGlvbiBsb2FkRmlsZUZyb21CYXNlNjQoYjY0RGF0YTogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgYnl0ZVN0cmluZzogc3RyaW5nID0gYXRvYihiNjREYXRhLnNwbGl0KFwiLFwiKVsxXSk7XG5cbiAgICAvLyBzZXBhcmF0ZSBvdXQgdGhlIG1pbWUgY29tcG9uZW50XG4gICAgY29uc3QgbWltZVN0cmluZzogc3RyaW5nID0gYjY0RGF0YVxuICAgICAgLnNwbGl0KFwiLFwiKVswXVxuICAgICAgLnNwbGl0KFwiOlwiKVsxXVxuICAgICAgLnNwbGl0KFwiO1wiKVswXTtcblxuICAgIC8vIHdyaXRlIHRoZSBieXRlcyBvZiB0aGUgc3RyaW5nIHRvIGFuIEFycmF5QnVmZmVyXG4gICAgY29uc3QgYWI6IEFycmF5QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGJ5dGVTdHJpbmcubGVuZ3RoKTtcbiAgICBjb25zdCBpYTogVWludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KGFiKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVTdHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlhW2ldID0gYnl0ZVN0cmluZy5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgICAvLyB3cml0ZSB0aGUgQXJyYXlCdWZmZXIgdG8gYSBibG9iLCBhbmQgeW91J3JlIGRvbmVcbiAgICBjb25zdCBiYjogQmxvYiA9IG5ldyBCbG9iKFthYl0sIHsgdHlwZTogbWltZVN0cmluZyB9KTtcbiAgICBpZiAoXG4gICAgICB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICB3aW5kb3cubmF2aWdhdG9yICYmXG4gICAgICAoPGFueT53aW5kb3cubmF2aWdhdG9yKVtcIm1zU2F2ZUJsb2JcIl1cbiAgICApIHtcbiAgICAgICg8YW55PndpbmRvdy5uYXZpZ2F0b3IpW1wibXNTYXZlT3JPcGVuQmxvYlwiXShiYiwgZmlsZU5hbWUpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7fVxufVxuZnVuY3Rpb24gaXNNb2JpbGUoKSB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2Ygd2luZG93Lm9yaWVudGF0aW9uICE9PSBcInVuZGVmaW5lZFwiXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzRWxlbWVudFZpc2libGUoXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICB0aHJlc2hvbGQ6IG51bWJlciA9IDBcbik6IGJvb2xlYW4ge1xuICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGVsZW1lbnRSZWN0OiBET01SZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgY29uc3Qgdmlld0hlaWdodDogbnVtYmVyID0gTWF0aC5tYXgoXG4gICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCxcbiAgICB3aW5kb3cuaW5uZXJIZWlnaHRcbiAgKTtcbiAgY29uc3QgdG9wV2luOiBudW1iZXIgPSAtdGhyZXNob2xkO1xuICBjb25zdCBib3R0b21XaW46IG51bWJlciA9IHZpZXdIZWlnaHQgKyB0aHJlc2hvbGQ7XG4gIGNvbnN0IHRvcEVsOiBudW1iZXIgPSBlbGVtZW50UmVjdC50b3A7XG4gIGNvbnN0IGJvdHRvbUVsOiBudW1iZXIgPSBlbGVtZW50UmVjdC5ib3R0b207XG5cbiAgY29uc3QgbWF4VG9wOiBudW1iZXIgPSBNYXRoLm1heCh0b3BXaW4sIHRvcEVsKTtcbiAgY29uc3QgbWluQm90dG9tOiBudW1iZXIgPSBNYXRoLm1pbihib3R0b21XaW4sIGJvdHRvbUVsKTtcbiAgcmV0dXJuIG1heFRvcCA8PSBtaW5Cb3R0b207XG59XG5cbmZ1bmN0aW9uIGZpbmRTY3JvbGxhYmxlUGFyZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQge1xuICBpZiAoIWVsZW1lbnQpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICB9XG4gIGlmIChcbiAgICBlbGVtZW50LnNjcm9sbEhlaWdodCA+IGVsZW1lbnQuY2xpZW50SGVpZ2h0ICYmXG4gICAgKGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkub3ZlcmZsb3dZID09PSBcInNjcm9sbFwiIHx8XG4gICAgICBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLm92ZXJmbG93WSA9PT0gXCJhdXRvXCIpXG4gICkge1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmaW5kU2Nyb2xsYWJsZVBhcmVudChlbGVtZW50LnBhcmVudEVsZW1lbnQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNjcm9sbEVsZW1lbnRCeUNoaWxkSWQoaWQ6IHN0cmluZykge1xuICBpZiAoIWRvY3VtZW50KSByZXR1cm47XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICBpZiAoIWVsKSByZXR1cm47XG4gIGNvbnN0IHNjcm9sbGFibGVFbCA9IGZpbmRTY3JvbGxhYmxlUGFyZW50KGVsKTtcbiAgaWYgKCEhc2Nyb2xsYWJsZUVsKSB7XG4gICAgc2Nyb2xsYWJsZUVsLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFwic2Nyb2xsXCIpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRJY29uTmFtZUZyb21Qcm94eShpY29uTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFpY29uTmFtZSkgcmV0dXJuIGljb25OYW1lO1xuICB2YXIgcHJveHlOYW1lID0gKDxhbnk+c2V0dGluZ3MuY3VzdG9tSWNvbnMpW2ljb25OYW1lXTtcbiAgcmV0dXJuICEhcHJveHlOYW1lID8gcHJveHlOYW1lIDogaWNvbk5hbWU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVN2ZyhcbiAgc2l6ZTogbnVtYmVyLFxuICB3aWR0aDogbnVtYmVyLFxuICBoZWlnaHQ6IG51bWJlcixcbiAgaWNvbk5hbWU6IHN0cmluZyxcbiAgc3ZnRWxlbTogYW55XG4pIHtcbiAgc3ZnRWxlbS5zdHlsZS53aWR0aCA9IChzaXplIHx8IHdpZHRoIHx8IDE2KSArIFwicHhcIjtcbiAgc3ZnRWxlbS5zdHlsZS5oZWlnaHQgPSAoc2l6ZSB8fCBoZWlnaHQgfHwgMTYpICsgXCJweFwiO1xuICBjb25zdCBub2RlOiBhbnkgPSBzdmdFbGVtLmNoaWxkTm9kZXNbMF07XG4gIGNvbnN0IHJlYWxJY29uTmFtZSA9IGdldEljb25OYW1lRnJvbVByb3h5KGljb25OYW1lKTtcbiAgbm9kZS5zZXRBdHRyaWJ1dGVOUyhcbiAgICBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIixcbiAgICBcInhsaW5rOmhyZWZcIixcbiAgICBcIiNcIiArIHJlYWxJY29uTmFtZVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW53cmFwPFQ+KHZhbHVlOiBUIHwgKCgpID0+IFQpKTogVCB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gKDwoKSA9PiBUPnZhbHVlKSgpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTaXplKHZhbHVlOiBhbnkpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgIHJldHVybiBcIlwiICsgdmFsdWUgKyBcInB4XCI7XG4gIH1cbiAgaWYgKCEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBsYXN0U3ltYm9sOiBzdHJpbmcgPSB2YWx1ZVt2YWx1ZS5sZW5ndGggLSAxXTtcbiAgICBpZiAoKGxhc3RTeW1ib2wgPj0gXCIwXCIgJiYgbGFzdFN5bWJvbCA8PSBcIjlcIikgfHwgbGFzdFN5bWJvbCA9PSBcIi5cIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbnVtOiBudW1iZXIgPSBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIFwiXCIgKyBudW0gKyBcInB4XCI7XG4gICAgICB9IGNhdGNoIHt9XG4gICAgfVxuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gZG9LZXkyQ2xpY2tVcChldnQ6IEtleWJvYXJkRXZlbnQsIG9wdGlvbnMgPSB7IHByb2Nlc3NFc2M6IHRydWUgfSk6IHZvaWQge1xuICBpZighIWV2dC50YXJnZXQgJiYgKDxhbnk+ZXZ0LnRhcmdldClbXCJjb250ZW50RWRpdGFibGVcIl0gPT09IFwidHJ1ZVwiKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGVsZW1lbnQ6IGFueSA9IGV2dC50YXJnZXQ7XG4gIGlmICghZWxlbWVudCkgcmV0dXJuO1xuICBjb25zdCBjaGFyOiBudW1iZXIgPSBldnQud2hpY2ggfHwgZXZ0LmtleUNvZGU7XG4gIGlmIChjaGFyID09PSAxMyB8fCBjaGFyID09PSAzMikge1xuICAgIGlmIChlbGVtZW50LmNsaWNrKSBlbGVtZW50LmNsaWNrKCk7XG4gIH0gZWxzZSBpZiAob3B0aW9ucy5wcm9jZXNzRXNjICYmIGNoYXIgPT09IDI3KSB7XG4gICAgaWYgKGVsZW1lbnQuYmx1cikgZWxlbWVudC5ibHVyKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGRvS2V5MkNsaWNrRG93bihldnQ6IEtleWJvYXJkRXZlbnQsIG9wdGlvbnMgPSB7IHByb2Nlc3NFc2M6IHRydWUgfSk6IHZvaWQge1xuICBpZighIWV2dC50YXJnZXQgJiYgKDxhbnk+ZXZ0LnRhcmdldClbXCJjb250ZW50RWRpdGFibGVcIl0gPT09IFwidHJ1ZVwiKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBjaGFyID0gZXZ0LndoaWNoIHx8IGV2dC5rZXlDb2RlO1xuICBjb25zdCBzdXBwb3J0ZWRDb2RlcyA9IFsxMywgMzJdO1xuICBpZihvcHRpb25zLnByb2Nlc3NFc2MpIHtcbiAgICBzdXBwb3J0ZWRDb2Rlcy5wdXNoKDI3KTtcbiAgfVxuICBpZihzdXBwb3J0ZWRDb2Rlcy5pbmRleE9mKGNoYXIpICE9PSAtMSkge1xuICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG59XG5mdW5jdGlvbiBpbmNyZWFzZUhlaWdodEJ5Q29udGVudChlbGVtZW50OiBIVE1MRWxlbWVudCwgZ2V0Q29tcHV0ZWRTdHlsZT86IChlbHQ6IEVsZW1lbnQpID0+IGFueSkge1xuICBpZiAoIWVsZW1lbnQpIHJldHVybjtcbiAgaWYgKCFnZXRDb21wdXRlZFN0eWxlKSBnZXRDb21wdXRlZFN0eWxlID0gKGVsdDogRWxlbWVudCkgPT4geyByZXR1cm4gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWx0KTsgfTtcblxuICBjb25zdCBzdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG4gIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gXCJhdXRvXCI7XG4gIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gKGVsZW1lbnQuc2Nyb2xsSGVpZ2h0ICsgcGFyc2VGbG9hdChzdHlsZS5ib3JkZXJUb3BXaWR0aCkgKyBwYXJzZUZsb2F0KHN0eWxlLmJvcmRlckJvdHRvbVdpZHRoKSkgKyBcInB4XCI7XG59XG5mdW5jdGlvbiBnZXRPcmlnaW5hbEV2ZW50KGV2ZW50OiBhbnkpIHtcbiAgcmV0dXJuIGV2ZW50Lm9yaWdpbmFsRXZlbnQgfHwgZXZlbnQ7XG59XG5mdW5jdGlvbiBwcmV2ZW50RGVmYXVsdHMoZXZlbnQ6IGFueSkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbn1cblxuZXhwb3J0IHtcbiAgY29tcGFyZVZlcnNpb25zLFxuICBjb25maXJtQWN0aW9uLFxuICBkZXRlY3RJRU9yRWRnZSxcbiAgZGV0ZWN0SUVCcm93c2VyLFxuICBsb2FkRmlsZUZyb21CYXNlNjQsXG4gIGlzTW9iaWxlLFxuICBpc0VsZW1lbnRWaXNpYmxlLFxuICBmaW5kU2Nyb2xsYWJsZVBhcmVudCxcbiAgc2Nyb2xsRWxlbWVudEJ5Q2hpbGRJZCxcbiAgY3JlYXRlU3ZnLFxuICBkb0tleTJDbGlja1VwLFxuICBkb0tleTJDbGlja0Rvd24sXG4gIGdldEljb25OYW1lRnJvbVByb3h5LFxuICBpbmNyZWFzZUhlaWdodEJ5Q29udGVudCxcbiAgZ2V0T3JpZ2luYWxFdmVudCxcbiAgcHJldmVudERlZmF1bHRzXG59O1xuIiwiaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IElTdXJ2ZXlFcnJvck93bmVyLCBJU3VydmV5IH0gZnJvbSBcIi4vYmFzZS1pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBTdXJ2ZXlFcnJvciB9IGZyb20gXCIuL3N1cnZleS1lcnJvclwiO1xuaW1wb3J0IHsgQ3VzdG9tRXJyb3IsIFJlcXVyZU51bWVyaWNFcnJvciB9IGZyb20gXCIuL2Vycm9yXCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBJTG9jYWxpemFibGVPd25lciwgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IENvbmRpdGlvblJ1bm5lciB9IGZyb20gXCIuL2NvbmRpdGlvbnNcIjtcbmltcG9ydCB7IEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBWYWxpZGF0b3JSZXN1bHQge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdmFsdWU6IGFueSwgcHVibGljIGVycm9yOiBTdXJ2ZXlFcnJvciA9IG51bGwpIHt9XG59XG4vKipcbiAqIEJhc2UgU3VydmV5SlMgdmFsaWRhdG9yIGNsYXNzLlxuICovXG5leHBvcnQgY2xhc3MgU3VydmV5VmFsaWRhdG9yIGV4dGVuZHMgQmFzZSB7XG4gIHB1YmxpYyBlcnJvck93bmVyOiBJU3VydmV5RXJyb3JPd25lcjtcbiAgcHVibGljIG9uQXN5bmNDb21wbGV0ZWQ6IChyZXN1bHQ6IFZhbGlkYXRvclJlc3VsdCkgPT4gdm9pZDtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwidGV4dFwiLCB0aGlzLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0U3VydmV5KGxpdmU6IGJvb2xlYW4gPSBmYWxzZSk6IElTdXJ2ZXkge1xuICAgIHJldHVybiAhIXRoaXMuZXJyb3JPd25lciAmJiAhISg8YW55PnRoaXMuZXJyb3JPd25lcilbXCJnZXRTdXJ2ZXlcIl1cbiAgICAgID8gKDxhbnk+dGhpcy5lcnJvck93bmVyKS5nZXRTdXJ2ZXkoKVxuICAgICAgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXQgdGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInRleHRcIik7XG4gIH1cbiAgcHVibGljIHNldCB0ZXh0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInRleHRcIiwgdmFsdWUpO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNWYWxpZGF0ZUFsbFZhbHVlcygpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZ2V0IGxvY1RleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwidGV4dFwiKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RXJyb3JUZXh0KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMudGV4dCkgcmV0dXJuIHRoaXMudGV4dDtcbiAgICByZXR1cm4gdGhpcy5nZXREZWZhdWx0RXJyb3JUZXh0KG5hbWUpO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0RXJyb3JUZXh0KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbiAgcHVibGljIHZhbGlkYXRlKFxuICAgIHZhbHVlOiBhbnksXG4gICAgbmFtZTogc3RyaW5nID0gbnVsbCxcbiAgICB2YWx1ZXM6IGFueSA9IG51bGwsXG4gICAgcHJvcGVydGllczogYW55ID0gbnVsbFxuICApOiBWYWxpZGF0b3JSZXN1bHQge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNSdW5uaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzQXN5bmMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGdldExvY2FsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAhIXRoaXMuZXJyb3JPd25lciA/IHRoaXMuZXJyb3JPd25lci5nZXRMb2NhbGUoKSA6IFwiXCI7XG4gIH1cbiAgZ2V0TWFya2Rvd25IdG1sKHRleHQ6IHN0cmluZywgbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gISF0aGlzLmVycm9yT3duZXJcbiAgICAgID8gdGhpcy5lcnJvck93bmVyLmdldE1hcmtkb3duSHRtbCh0ZXh0LCBuYW1lKVxuICAgICAgOiBudWxsO1xuICB9XG4gIGdldFJlbmRlcmVyKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuICEhdGhpcy5lcnJvck93bmVyID8gdGhpcy5lcnJvck93bmVyLmdldFJlbmRlcmVyKG5hbWUpIDogbnVsbDtcbiAgfVxuICBnZXRSZW5kZXJlckNvbnRleHQobG9jU3RyOiBMb2NhbGl6YWJsZVN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuICEhdGhpcy5lcnJvck93bmVyID8gdGhpcy5lcnJvck93bmVyLmdldFJlbmRlcmVyQ29udGV4dChsb2NTdHIpIDogbG9jU3RyO1xuICB9XG4gIGdldFByb2Nlc3NlZFRleHQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gISF0aGlzLmVycm9yT3duZXIgPyB0aGlzLmVycm9yT3duZXIuZ2V0UHJvY2Vzc2VkVGV4dCh0ZXh0KSA6IHRleHQ7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZUN1c3RvbUVycm9yKG5hbWU6IHN0cmluZyk6IFN1cnZleUVycm9yIHtcbiAgICByZXR1cm4gbmV3IEN1c3RvbUVycm9yKHRoaXMuZ2V0RXJyb3JUZXh0KG5hbWUpLCB0aGlzLmVycm9yT3duZXIpO1xuICB9XG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHZhciByZXMgPSB0aGlzLmdldFR5cGUoKS5yZXBsYWNlKFwidmFsaWRhdG9yXCIsIFwiXCIpO1xuICAgIGlmICghIXRoaXMudGV4dCkge1xuICAgICAgcmVzICs9IFwiLCBcIiArIHRoaXMudGV4dDtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBJVmFsaWRhdG9yT3duZXIge1xuICBnZXRWYWxpZGF0b3JzKCk6IEFycmF5PFN1cnZleVZhbGlkYXRvcj47XG4gIHZhbGlkYXRlZFZhbHVlOiBhbnk7XG4gIGdldFZhbGlkYXRvclRpdGxlKCk6IHN0cmluZztcbiAgZ2V0RGF0YUZpbHRlcmVkVmFsdWVzKCk6IGFueTtcbiAgZ2V0RGF0YUZpbHRlcmVkUHJvcGVydGllcygpOiBhbnk7XG59XG5leHBvcnQgY2xhc3MgVmFsaWRhdG9yUnVubmVyIHtcbiAgcHJpdmF0ZSBhc3luY1ZhbGlkYXRvcnM6IEFycmF5PFN1cnZleVZhbGlkYXRvcj47XG4gIHB1YmxpYyBvbkFzeW5jQ29tcGxldGVkOiAoZXJyb3JzOiBBcnJheTxTdXJ2ZXlFcnJvcj4pID0+IHZvaWQ7XG4gIHB1YmxpYyBydW4ob3duZXI6IElWYWxpZGF0b3JPd25lcik6IEFycmF5PFN1cnZleUVycm9yPiB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHZhciB2YWx1ZXMgPSBudWxsO1xuICAgIHZhciBwcm9wZXJ0aWVzID0gbnVsbDtcbiAgICB0aGlzLnByZXBhcmVBc3luY1ZhbGlkYXRvcnMoKTtcbiAgICB2YXIgYXN5bmNSZXN1bHRzOiBBcnJheTxTdXJ2ZXlFcnJvcj4gPSBbXTtcbiAgICB2YXIgdmFsaWRhdG9ycyA9IG93bmVyLmdldFZhbGlkYXRvcnMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbGlkYXRvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB2YWxpZGF0b3IgPSB2YWxpZGF0b3JzW2ldO1xuICAgICAgaWYgKCF2YWx1ZXMgJiYgdmFsaWRhdG9yLmlzVmFsaWRhdGVBbGxWYWx1ZXMpIHtcbiAgICAgICAgdmFsdWVzID0gb3duZXIuZ2V0RGF0YUZpbHRlcmVkVmFsdWVzKCk7XG4gICAgICAgIHByb3BlcnRpZXMgPSBvd25lci5nZXREYXRhRmlsdGVyZWRQcm9wZXJ0aWVzKCk7XG4gICAgICB9XG4gICAgICBpZiAodmFsaWRhdG9yLmlzQXN5bmMpIHtcbiAgICAgICAgdGhpcy5hc3luY1ZhbGlkYXRvcnMucHVzaCh2YWxpZGF0b3IpO1xuICAgICAgICB2YWxpZGF0b3Iub25Bc3luY0NvbXBsZXRlZCA9IChyZXN1bHQ6IFZhbGlkYXRvclJlc3VsdCkgPT4ge1xuICAgICAgICAgIGlmICghIXJlc3VsdCAmJiAhIXJlc3VsdC5lcnJvcikgYXN5bmNSZXN1bHRzLnB1c2gocmVzdWx0LmVycm9yKTtcbiAgICAgICAgICBpZiAoIXRoaXMub25Bc3luY0NvbXBsZXRlZCkgcmV0dXJuO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5hc3luY1ZhbGlkYXRvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFzeW5jVmFsaWRhdG9yc1tpXS5pc1J1bm5pbmcpIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5vbkFzeW5jQ29tcGxldGVkKGFzeW5jUmVzdWx0cyk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIHZhbGlkYXRvcnMgPSBvd25lci5nZXRWYWxpZGF0b3JzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWxpZGF0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmFsaWRhdG9yID0gdmFsaWRhdG9yc1tpXTtcblxuICAgICAgdmFyIHZhbGlkYXRvclJlc3VsdCA9IHZhbGlkYXRvci52YWxpZGF0ZShcbiAgICAgICAgb3duZXIudmFsaWRhdGVkVmFsdWUsXG4gICAgICAgIG93bmVyLmdldFZhbGlkYXRvclRpdGxlKCksXG4gICAgICAgIHZhbHVlcyxcbiAgICAgICAgcHJvcGVydGllc1xuICAgICAgKTtcbiAgICAgIGlmICghIXZhbGlkYXRvclJlc3VsdCAmJiAhIXZhbGlkYXRvclJlc3VsdC5lcnJvcikge1xuICAgICAgICByZXMucHVzaCh2YWxpZGF0b3JSZXN1bHQuZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5hc3luY1ZhbGlkYXRvcnMubGVuZ3RoID09IDAgJiYgISF0aGlzLm9uQXN5bmNDb21wbGV0ZWQpXG4gICAgICB0aGlzLm9uQXN5bmNDb21wbGV0ZWQoW10pO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBwcmVwYXJlQXN5bmNWYWxpZGF0b3JzKCkge1xuICAgIGlmICghIXRoaXMuYXN5bmNWYWxpZGF0b3JzKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYXN5bmNWYWxpZGF0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuYXN5bmNWYWxpZGF0b3JzW2ldLm9uQXN5bmNDb21wbGV0ZWQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmFzeW5jVmFsaWRhdG9ycyA9IFtdO1xuICB9XG59XG4vKipcbiAqIFZhbGlkYXRlIG51bWVyaWMgdmFsdWVzLlxuICovXG5leHBvcnQgY2xhc3MgTnVtZXJpY1ZhbGlkYXRvciBleHRlbmRzIFN1cnZleVZhbGlkYXRvciB7XG4gIGNvbnN0cnVjdG9yKG1pblZhbHVlOiBudW1iZXIgPSBudWxsLCBtYXhWYWx1ZTogbnVtYmVyID0gbnVsbCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5taW5WYWx1ZSA9IG1pblZhbHVlO1xuICAgIHRoaXMubWF4VmFsdWUgPSBtYXhWYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIm51bWVyaWN2YWxpZGF0b3JcIjtcbiAgfVxuICBwdWJsaWMgdmFsaWRhdGUoXG4gICAgdmFsdWU6IGFueSxcbiAgICBuYW1lOiBzdHJpbmcgPSBudWxsLFxuICAgIHZhbHVlczogYW55ID0gbnVsbCxcbiAgICBwcm9wZXJ0aWVzOiBhbnkgPSBudWxsXG4gICk6IFZhbGlkYXRvclJlc3VsdCB7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUVtcHR5KHZhbHVlKSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKCFIZWxwZXJzLmlzTnVtYmVyKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0b3JSZXN1bHQoXG4gICAgICAgIG51bGwsXG4gICAgICAgIG5ldyBSZXF1cmVOdW1lcmljRXJyb3IobnVsbCwgdGhpcy5lcnJvck93bmVyKVxuICAgICAgKTtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JSZXN1bHQocGFyc2VGbG9hdCh2YWx1ZSkpO1xuICAgIGlmICh0aGlzLm1pblZhbHVlICE9PSBudWxsICYmIHRoaXMubWluVmFsdWUgPiByZXN1bHQudmFsdWUpIHtcbiAgICAgIHJlc3VsdC5lcnJvciA9IHRoaXMuY3JlYXRlQ3VzdG9tRXJyb3IobmFtZSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBpZiAodGhpcy5tYXhWYWx1ZSAhPT0gbnVsbCAmJiB0aGlzLm1heFZhbHVlIDwgcmVzdWx0LnZhbHVlKSB7XG4gICAgICByZXN1bHQuZXJyb3IgPSB0aGlzLmNyZWF0ZUN1c3RvbUVycm9yKG5hbWUpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiA/IG51bGwgOiByZXN1bHQ7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRFcnJvclRleHQobmFtZTogc3RyaW5nKSB7XG4gICAgdmFyIHZOYW1lID0gbmFtZSA/IG5hbWUgOiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwidmFsdWVcIik7XG4gICAgaWYgKHRoaXMubWluVmFsdWUgIT09IG51bGwgJiYgdGhpcy5tYXhWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgICAuZ2V0U3RyaW5nKFwibnVtZXJpY01pbk1heFwiKVxuICAgICAgICBbXCJmb3JtYXRcIl0odk5hbWUsIHRoaXMubWluVmFsdWUsIHRoaXMubWF4VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5taW5WYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uXG4gICAgICAgICAgLmdldFN0cmluZyhcIm51bWVyaWNNaW5cIilcbiAgICAgICAgICBbXCJmb3JtYXRcIl0odk5hbWUsIHRoaXMubWluVmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgICAuZ2V0U3RyaW5nKFwibnVtZXJpY01heFwiKVxuICAgICAgICBbXCJmb3JtYXRcIl0odk5hbWUsIHRoaXMubWF4VmFsdWUpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogVGhlIG1pblZhbHVlIHByb3BlcnR5LlxuICAgKi9cbiAgcHVibGljIGdldCBtaW5WYWx1ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtaW5WYWx1ZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1pblZhbHVlKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWluVmFsdWVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIG1heFZhbHVlIHByb3BlcnR5LlxuICAgKi9cbiAgcHVibGljIGdldCBtYXhWYWx1ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhWYWx1ZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heFZhbHVlKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWF4VmFsdWVcIiwgdmFsKTtcbiAgfVxufVxuLyoqXG4gKiBWYWxpZGF0ZSB0ZXh0IHZhbHVlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFRleHRWYWxpZGF0b3IgZXh0ZW5kcyBTdXJ2ZXlWYWxpZGF0b3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtaW5MZW5ndGg6IG51bWJlciA9IDAsXG4gICAgbWF4TGVuZ3RoOiBudW1iZXIgPSAwLFxuICAgIGFsbG93RGlnaXRzID0gdHJ1ZVxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubWluTGVuZ3RoID0gbWluTGVuZ3RoO1xuICAgIHRoaXMubWF4TGVuZ3RoID0gbWF4TGVuZ3RoO1xuICAgIHRoaXMuYWxsb3dEaWdpdHMgPSBhbGxvd0RpZ2l0cztcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInRleHR2YWxpZGF0b3JcIjtcbiAgfVxuICBwdWJsaWMgdmFsaWRhdGUoXG4gICAgdmFsdWU6IGFueSxcbiAgICBuYW1lOiBzdHJpbmcgPSBudWxsLFxuICAgIHZhbHVlczogYW55ID0gbnVsbCxcbiAgICBwcm9wZXJ0aWVzOiBhbnkgPSBudWxsXG4gICk6IFZhbGlkYXRvclJlc3VsdCB7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUVtcHR5KHZhbHVlKSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKCF0aGlzLmFsbG93RGlnaXRzKSB7XG4gICAgICB2YXIgcmVnID0gL15bQS1aYS16XFxzXSokLztcbiAgICAgIGlmICghcmVnLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBuZXcgVmFsaWRhdG9yUmVzdWx0KG51bGwsIHRoaXMuY3JlYXRlQ3VzdG9tRXJyb3IobmFtZSkpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5taW5MZW5ndGggPiAwICYmIHZhbHVlLmxlbmd0aCA8IHRoaXMubWluTGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbmV3IFZhbGlkYXRvclJlc3VsdChudWxsLCB0aGlzLmNyZWF0ZUN1c3RvbUVycm9yKG5hbWUpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF4TGVuZ3RoID4gMCAmJiB2YWx1ZS5sZW5ndGggPiB0aGlzLm1heExlbmd0aCkge1xuICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0b3JSZXN1bHQobnVsbCwgdGhpcy5jcmVhdGVDdXN0b21FcnJvcihuYW1lKSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0RXJyb3JUZXh0KG5hbWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLm1pbkxlbmd0aCA+IDAgJiYgdGhpcy5tYXhMZW5ndGggPiAwKVxuICAgICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgICAuZ2V0U3RyaW5nKFwidGV4dE1pbk1heExlbmd0aFwiKVxuICAgICAgICBbXCJmb3JtYXRcIl0odGhpcy5taW5MZW5ndGgsIHRoaXMubWF4TGVuZ3RoKTtcbiAgICBpZiAodGhpcy5taW5MZW5ndGggPiAwKVxuICAgICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgICAuZ2V0U3RyaW5nKFwidGV4dE1pbkxlbmd0aFwiKVxuICAgICAgICBbXCJmb3JtYXRcIl0odGhpcy5taW5MZW5ndGgpO1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb25cbiAgICAgIC5nZXRTdHJpbmcoXCJ0ZXh0TWF4TGVuZ3RoXCIpXG4gICAgICBbXCJmb3JtYXRcIl0odGhpcy5tYXhMZW5ndGgpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbWluTGVuZ3RoIHByb3BlcnR5LlxuICAgKi9cbiAgcHVibGljIGdldCBtaW5MZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWluTGVuZ3RoXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWluTGVuZ3RoKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWluTGVuZ3RoXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBtYXhMZW5ndGggcHJvcGVydHkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heExlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhMZW5ndGhcIik7XG4gIH1cbiAgcHVibGljIHNldCBtYXhMZW5ndGgodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtYXhMZW5ndGhcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGFsbG93RGlnaXRzIHByb3BlcnR5LlxuICAgKi9cbiAgcHVibGljIGdldCBhbGxvd0RpZ2l0cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dEaWdpdHNcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCBhbGxvd0RpZ2l0cyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJhbGxvd0RpZ2l0c1wiLCB2YWwpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBbnN3ZXJDb3VudFZhbGlkYXRvciBleHRlbmRzIFN1cnZleVZhbGlkYXRvciB7XG4gIGNvbnN0cnVjdG9yKG1pbkNvdW50OiBudW1iZXIgPSBudWxsLCBtYXhDb3VudDogbnVtYmVyID0gbnVsbCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5taW5Db3VudCA9IG1pbkNvdW50O1xuICAgIHRoaXMubWF4Q291bnQgPSBtYXhDb3VudDtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImFuc3dlcmNvdW50dmFsaWRhdG9yXCI7XG4gIH1cbiAgcHVibGljIHZhbGlkYXRlKFxuICAgIHZhbHVlOiBhbnksXG4gICAgbmFtZTogc3RyaW5nID0gbnVsbCxcbiAgICB2YWx1ZXM6IGFueSA9IG51bGwsXG4gICAgcHJvcGVydGllczogYW55ID0gbnVsbFxuICApOiBWYWxpZGF0b3JSZXN1bHQge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmNvbnN0cnVjdG9yICE9IEFycmF5KSByZXR1cm4gbnVsbDtcbiAgICB2YXIgY291bnQgPSB2YWx1ZS5sZW5ndGg7XG4gICAgaWYgKGNvdW50ID09IDApIHJldHVybiBudWxsO1xuICAgIGlmICh0aGlzLm1pbkNvdW50ICYmIGNvdW50IDwgdGhpcy5taW5Db3VudCkge1xuICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0b3JSZXN1bHQoXG4gICAgICAgIG51bGwsXG4gICAgICAgIHRoaXMuY3JlYXRlQ3VzdG9tRXJyb3IoXG4gICAgICAgICAgc3VydmV5TG9jYWxpemF0aW9uXG4gICAgICAgICAgICAuZ2V0U3RyaW5nKFwibWluU2VsZWN0RXJyb3JcIilcbiAgICAgICAgICAgIFtcImZvcm1hdFwiXSh0aGlzLm1pbkNvdW50KVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodGhpcy5tYXhDb3VudCAmJiBjb3VudCA+IHRoaXMubWF4Q291bnQpIHtcbiAgICAgIHJldHVybiBuZXcgVmFsaWRhdG9yUmVzdWx0KFxuICAgICAgICBudWxsLFxuICAgICAgICB0aGlzLmNyZWF0ZUN1c3RvbUVycm9yKFxuICAgICAgICAgIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgICAgICAgLmdldFN0cmluZyhcIm1heFNlbGVjdEVycm9yXCIpXG4gICAgICAgICAgICBbXCJmb3JtYXRcIl0odGhpcy5tYXhDb3VudClcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRFcnJvclRleHQobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5hbWU7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBtaW5Db3VudCBwcm9wZXJ0eS5cbiAgICovXG4gIHB1YmxpYyBnZXQgbWluQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWluQ291bnRcIik7XG4gIH1cbiAgcHVibGljIHNldCBtaW5Db3VudCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1pbkNvdW50XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBtYXhDb3VudCBwcm9wZXJ0eS5cbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4Q291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWF4Q291bnRcIik7XG4gIH1cbiAgcHVibGljIHNldCBtYXhDb3VudCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1heENvdW50XCIsIHZhbCk7XG4gIH1cbn1cbi8qKlxuICogVXNlIGl0IHRvIHZhbGlkYXRlIHRoZSB0ZXh0IGJ5IHJlZ3VsYXIgZXhwcmVzc2lvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWdleFZhbGlkYXRvciBleHRlbmRzIFN1cnZleVZhbGlkYXRvciB7XG4gIGNvbnN0cnVjdG9yKHJlZ2V4OiBzdHJpbmcgPSBudWxsKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnJlZ2V4ID0gcmVnZXg7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJyZWdleHZhbGlkYXRvclwiO1xuICB9XG4gIHB1YmxpYyB2YWxpZGF0ZShcbiAgICB2YWx1ZTogYW55LFxuICAgIG5hbWU6IHN0cmluZyA9IG51bGwsXG4gICAgdmFsdWVzOiBhbnkgPSBudWxsLFxuICAgIHByb3BlcnRpZXM6IGFueSA9IG51bGxcbiAgKTogVmFsaWRhdG9yUmVzdWx0IHtcbiAgICBpZiAoIXRoaXMucmVnZXggfHwgdGhpcy5pc1ZhbHVlRW1wdHkodmFsdWUpKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKHRoaXMucmVnZXgpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcmVzID0gdGhpcy5oYXNFcnJvcihyZSwgdmFsdWVbaV0sIG5hbWUpO1xuICAgICAgICBpZiAocmVzKSByZXR1cm4gcmVzO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5oYXNFcnJvcihyZSwgdmFsdWUsIG5hbWUpO1xuICB9XG4gIHByaXZhdGUgaGFzRXJyb3IocmU6IFJlZ0V4cCwgdmFsdWU6IGFueSwgbmFtZTogc3RyaW5nKTogVmFsaWRhdG9yUmVzdWx0IHtcbiAgICBpZiAocmUudGVzdCh2YWx1ZSkpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBuZXcgVmFsaWRhdG9yUmVzdWx0KHZhbHVlLCB0aGlzLmNyZWF0ZUN1c3RvbUVycm9yKG5hbWUpKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHJlZ2V4IHByb3BlcnR5LlxuICAgKi9cbiAgcHVibGljIGdldCByZWdleCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyZWdleFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJlZ2V4KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmVnZXhcIiwgdmFsKTtcbiAgfVxufVxuLyoqXG4gKiBWYWxpZGF0ZSBlLW1haWwgYWRkcmVzcyBpbiB0aGUgdGV4dCBpbnB1dFxuICovXG5leHBvcnQgY2xhc3MgRW1haWxWYWxpZGF0b3IgZXh0ZW5kcyBTdXJ2ZXlWYWxpZGF0b3Ige1xuICBwcml2YXRlIHJlID0gL14oKFtePD4oKVxcW1xcXVxcLiw7Olxcc0BcXFwiXSsoXFwuW148PigpXFxbXFxdXFwuLDs6XFxzQFxcXCJdKykqKXwoXFxcIi4rXFxcIikpQCgoW148PigpPVtcXF1cXC4sOzpcXHNAXFxcIl0rXFwuKStbXjw+KCk9W1xcXVxcLiw7Olxcc0BcXFwiXXsyLH0pJC9pO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZW1haWx2YWxpZGF0b3JcIjtcbiAgfVxuICBwdWJsaWMgdmFsaWRhdGUoXG4gICAgdmFsdWU6IGFueSxcbiAgICBuYW1lOiBzdHJpbmcgPSBudWxsLFxuICAgIHZhbHVlczogYW55ID0gbnVsbCxcbiAgICBwcm9wZXJ0aWVzOiBhbnkgPSBudWxsXG4gICk6IFZhbGlkYXRvclJlc3VsdCB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMucmUudGVzdCh2YWx1ZSkpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBuZXcgVmFsaWRhdG9yUmVzdWx0KHZhbHVlLCB0aGlzLmNyZWF0ZUN1c3RvbUVycm9yKG5hbWUpKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGVmYXVsdEVycm9yVGV4dChuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImludmFsaWRFbWFpbFwiKTtcbiAgfVxufVxuXG4vKipcbiAqIFNob3cgZXJyb3IgaWYgZXhwcmVzc2lvbiByZXR1cm5zIGZhbHNlXG4gKi9cbmV4cG9ydCBjbGFzcyBFeHByZXNzaW9uVmFsaWRhdG9yIGV4dGVuZHMgU3VydmV5VmFsaWRhdG9yIHtcbiAgcHJpdmF0ZSBjb25kaXRpb25SdW5uZXI6IENvbmRpdGlvblJ1bm5lciA9IG51bGw7XG4gIHByaXZhdGUgaXNSdW5uaW5nVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY29uc3RydWN0b3IoZXhwcmVzc2lvbjogc3RyaW5nID0gbnVsbCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImV4cHJlc3Npb252YWxpZGF0b3JcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzVmFsaWRhdGVBbGxWYWx1ZXMoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIGdldCBpc0FzeW5jKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5lbnN1cmVDb25kaXRpb25SdW5uZXIoKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmNvbmRpdGlvblJ1bm5lci5pc0FzeW5jO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNSdW5uaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzUnVubmluZ1ZhbHVlO1xuICB9XG4gIHB1YmxpYyB2YWxpZGF0ZShcbiAgICB2YWx1ZTogYW55LFxuICAgIG5hbWU6IHN0cmluZyA9IG51bGwsXG4gICAgdmFsdWVzOiBhbnkgPSBudWxsLFxuICAgIHByb3BlcnRpZXM6IGFueSA9IG51bGxcbiAgKTogVmFsaWRhdG9yUmVzdWx0IHtcbiAgICBpZiAoIXRoaXMuZW5zdXJlQ29uZGl0aW9uUnVubmVyKCkpIHJldHVybiBudWxsO1xuICAgIHRoaXMuY29uZGl0aW9uUnVubmVyLm9uUnVuQ29tcGxldGUgPSAocmVzKSA9PiB7XG4gICAgICB0aGlzLmlzUnVubmluZ1ZhbHVlID0gZmFsc2U7XG4gICAgICBpZiAoISF0aGlzLm9uQXN5bmNDb21wbGV0ZWQpIHtcbiAgICAgICAgdGhpcy5vbkFzeW5jQ29tcGxldGVkKHRoaXMuZ2VuZXJhdGVFcnJvcihyZXMsIHZhbHVlLCBuYW1lKSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLmlzUnVubmluZ1ZhbHVlID0gdHJ1ZTtcbiAgICB2YXIgcmVzID0gdGhpcy5jb25kaXRpb25SdW5uZXIucnVuKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgaWYgKHRoaXMuY29uZGl0aW9uUnVubmVyLmlzQXN5bmMpIHJldHVybiBudWxsO1xuICAgIHRoaXMuaXNSdW5uaW5nVmFsdWUgPSBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUVycm9yKHJlcywgdmFsdWUsIG5hbWUpO1xuICB9XG4gIHByb3RlY3RlZCBnZW5lcmF0ZUVycm9yKHJlczogYm9vbGVhbiwgdmFsdWU6IGFueSwgbmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKCFyZXMpIHtcbiAgICAgIHJldHVybiBuZXcgVmFsaWRhdG9yUmVzdWx0KHZhbHVlLCB0aGlzLmNyZWF0ZUN1c3RvbUVycm9yKG5hbWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRFcnJvclRleHQobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgLmdldFN0cmluZyhcImludmFsaWRFeHByZXNzaW9uXCIpXG4gICAgICBbXCJmb3JtYXRcIl0odGhpcy5leHByZXNzaW9uKTtcbiAgfVxuICBwcm90ZWN0ZWQgZW5zdXJlQ29uZGl0aW9uUnVubmVyKCk6IGJvb2xlYW4ge1xuICAgIGlmICghIXRoaXMuY29uZGl0aW9uUnVubmVyKSB7XG4gICAgICB0aGlzLmNvbmRpdGlvblJ1bm5lci5leHByZXNzaW9uID0gdGhpcy5leHByZXNzaW9uO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICghdGhpcy5leHByZXNzaW9uKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5jb25kaXRpb25SdW5uZXIgPSBuZXcgQ29uZGl0aW9uUnVubmVyKHRoaXMuZXhwcmVzc2lvbik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBleHByZXNzaW9uIHByb3BlcnR5LlxuICAgKi9cbiAgcHVibGljIGdldCBleHByZXNzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImV4cHJlc3Npb25cIik7XG4gIH1cbiAgcHVibGljIHNldCBleHByZXNzaW9uKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZXhwcmVzc2lvblwiLCB2YWwpO1xuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXCJzdXJ2ZXl2YWxpZGF0b3JcIiwgW1xuICB7IG5hbWU6IFwidGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jVGV4dFwiIH0sXG5dKTtcblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwibnVtZXJpY3ZhbGlkYXRvclwiLFxuICBbXCJtaW5WYWx1ZTpudW1iZXJcIiwgXCJtYXhWYWx1ZTpudW1iZXJcIl0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgTnVtZXJpY1ZhbGlkYXRvcigpO1xuICB9LFxuICBcInN1cnZleXZhbGlkYXRvclwiXG4pO1xuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJ0ZXh0dmFsaWRhdG9yXCIsXG4gIFtcIm1pbkxlbmd0aDpudW1iZXJcIiwgXCJtYXhMZW5ndGg6bnVtYmVyXCIsIFwiYWxsb3dEaWdpdHM6Ym9vbGVhblwiXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBUZXh0VmFsaWRhdG9yKCk7XG4gIH0sXG4gIFwic3VydmV5dmFsaWRhdG9yXCJcbik7XG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImFuc3dlcmNvdW50dmFsaWRhdG9yXCIsXG4gIFtcIm1pbkNvdW50Om51bWJlclwiLCBcIm1heENvdW50Om51bWJlclwiXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBBbnN3ZXJDb3VudFZhbGlkYXRvcigpO1xuICB9LFxuICBcInN1cnZleXZhbGlkYXRvclwiXG4pO1xuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJyZWdleHZhbGlkYXRvclwiLFxuICBbXCJyZWdleFwiXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBSZWdleFZhbGlkYXRvcigpO1xuICB9LFxuICBcInN1cnZleXZhbGlkYXRvclwiXG4pO1xuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJlbWFpbHZhbGlkYXRvclwiLFxuICBbXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBFbWFpbFZhbGlkYXRvcigpO1xuICB9LFxuICBcInN1cnZleXZhbGlkYXRvclwiXG4pO1xuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImV4cHJlc3Npb252YWxpZGF0b3JcIixcbiAgW1wiZXhwcmVzc2lvbjpjb25kaXRpb25cIl0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgRXhwcmVzc2lvblZhbGlkYXRvcigpO1xuICB9LFxuICBcInN1cnZleXZhbGlkYXRvclwiXG4pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX2pxdWVyeV9fOyJdLCJzb3VyY2VSb290IjoiIn0=