1/******/ (function(modules) { // webpackBootstrap 2/******/ // install a JSONP callback for chunk loading 3/******/ function webpackJsonpCallback(data) { 4/******/ var chunkIds = data[0]; 5/******/ var moreModules = data[1]; 6/******/ 7/******/ 8/******/ // add "moreModules" to the modules object, 9/******/ // then flag all "chunkIds" as loaded and fire callback 10/******/ var moduleId, chunkId, i = 0, resolves = []; 11/******/ for(;i < chunkIds.length; i++) { 12/******/ chunkId = chunkIds[i]; 13/******/ if(installedChunks[chunkId]) { 14/******/ resolves.push(installedChunks[chunkId][0]); 15/******/ } 16/******/ installedChunks[chunkId] = 0; 17/******/ } 18/******/ for(moduleId in moreModules) { 19/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { 20/******/ modules[moduleId] = moreModules[moduleId]; 21/******/ } 22/******/ } 23/******/ if(parentJsonpFunction) parentJsonpFunction(data); 24/******/ 25/******/ while(resolves.length) { 26/******/ resolves.shift()(); 27/******/ } 28/******/ 29/******/ }; 30/******/ 31/******/ 32/******/ // The module cache 33/******/ var installedModules = {}; 34/******/ 35/******/ // object to store loaded and loading chunks 36/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched 37/******/ // Promise = chunk loading, 0 = chunk loaded 38/******/ var installedChunks = { 39/******/ "bundle": 0 40/******/ }; 41/******/ 42/******/ 43/******/ 44/******/ // script path function 45/******/ function jsonpScriptSrc(chunkId) { 46/******/ return __webpack_require__.p + "_async-modules/" + ({"vendors~draggable-table":"vendors~draggable-table","draggable-table":"draggable-table","wrap-media":"wrap-media"}[chunkId]||chunkId) + ".js?=" + {"0":"93fa613c516259edff8b","1":"8b375f181552c4d22746","2":"80bc1d1f09ded2345e24","3":"6e8aa59a6cff0c9c2c46","4":"41382716d481b544ec51","5":"6bc50e43dbd29b3d44ba","6":"ef43d98016d5b9473d5e","7":"83b806f99da7d1c3a8c3","8":"4a5fc6ed934e940f4d84","9":"b9dc265ff303b8be39c5","10":"a22dc2173dca49c66c52","11":"1f6264e4e5650f25181d","12":"ab106d63fc567f4127f1","13":"85635083cca3f43cd427","14":"e66ee516dc49550377ca","15":"92200a5ce4e625101918","16":"1f528bc27fdbf65ba474","17":"b13db9ba163d99072359","18":"1a9be069013be4fec23a","19":"8909ac9abc64be7024cb","20":"9165e4aedce91a5452a6","21":"a061e7d6ee104251bf10","22":"de2d89d809cfeff69ce2","23":"54ecfc61bce717a83d28","24":"a601c76409bea68a5a0f","25":"66b396090e88834c7108","26":"aca93347c353a696e235","27":"e875a259d63eb18eba13","28":"79f6d2be7b6dfaec1dbc","29":"54bebca9a4fa376e7f3c","30":"ba1004ff9c95a90fb2b7","31":"532419720ef85b1593cb","32":"f899485d089d70ceb6bf","33":"d401d6a65d0120efbd1a","34":"cb886360c3a5e309df53","35":"4e1d0ab3cf6fd2dba906","36":"03f957ca36d683272938","37":"96cbb73d25c38ecea25c","38":"bc07b8119c01d02c8a74","39":"c77f6822289560929f7c","40":"e80f123458a0975bf992","41":"75bebc97dee7f79f7270","42":"4e051d5bf69910523fdf","vendors~draggable-table":"c19a78f1db37c68d8b63","draggable-table":"636b346a2f86a00dbfdb","wrap-media":"0ffebbdd7658594f0d59"}[chunkId] + "" 47/******/ } 48/******/ 49/******/ // The require function 50/******/ function __webpack_require__(moduleId) { 51/******/ 52/******/ // Check if module is in cache 53/******/ if(installedModules[moduleId]) { 54/******/ return installedModules[moduleId].exports; 55/******/ } 56/******/ // Create a new module (and put it into the cache) 57/******/ var module = installedModules[moduleId] = { 58/******/ i: moduleId, 59/******/ l: false, 60/******/ exports: {} 61/******/ }; 62/******/ 63/******/ // Execute the module function 64/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); 65/******/ 66/******/ // Flag the module as loaded 67/******/ module.l = true; 68/******/ 69/******/ // Return the exports of the module 70/******/ return module.exports; 71/******/ } 72/******/ 73/******/ // This file contains only the entry chunk. 74/******/ // The chunk loading function for additional chunks 75/******/ __webpack_require__.e = function requireEnsure(chunkId) { 76/******/ var promises = []; 77/******/ 78/******/ 79/******/ // JSONP chunk loading for javascript 80/******/ 81/******/ var installedChunkData = installedChunks[chunkId]; 82/******/ if(installedChunkData !== 0) { // 0 means "already installed". 83/******/ 84/******/ // a Promise means "currently loading". 85/******/ if(installedChunkData) { 86/******/ promises.push(installedChunkData[2]); 87/******/ } else { 88/******/ // setup Promise in chunk cache 89/******/ var promise = new Promise(function(resolve, reject) { 90/******/ installedChunkData = installedChunks[chunkId] = [resolve, reject]; 91/******/ }); 92/******/ promises.push(installedChunkData[2] = promise); 93/******/ 94/******/ // start chunk loading 95/******/ var script = document.createElement('script'); 96/******/ var onScriptComplete; 97/******/ 98/******/ script.charset = 'utf-8'; 99/******/ script.timeout = 120; 100/******/ if (__webpack_require__.nc) { 101/******/ script.setAttribute("nonce", __webpack_require__.nc); 102/******/ } 103/******/ script.src = jsonpScriptSrc(chunkId); 104/******/ 105/******/ onScriptComplete = function (event) { 106/******/ // avoid mem leaks in IE. 107/******/ script.onerror = script.onload = null; 108/******/ clearTimeout(timeout); 109/******/ var chunk = installedChunks[chunkId]; 110/******/ if(chunk !== 0) { 111/******/ if(chunk) { 112/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); 113/******/ var realSrc = event && event.target && event.target.src; 114/******/ var error = new Error('Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'); 115/******/ error.type = errorType; 116/******/ error.request = realSrc; 117/******/ chunk[1](error); 118/******/ } 119/******/ installedChunks[chunkId] = undefined; 120/******/ } 121/******/ }; 122/******/ var timeout = setTimeout(function(){ 123/******/ onScriptComplete({ type: 'timeout', target: script }); 124/******/ }, 120000); 125/******/ script.onerror = script.onload = onScriptComplete; 126/******/ document.head.appendChild(script); 127/******/ } 128/******/ } 129/******/ return Promise.all(promises); 130/******/ }; 131/******/ 132/******/ // expose the modules object (__webpack_modules__) 133/******/ __webpack_require__.m = modules; 134/******/ 135/******/ // expose the module cache 136/******/ __webpack_require__.c = installedModules; 137/******/ 138/******/ // define getter function for harmony exports 139/******/ __webpack_require__.d = function(exports, name, getter) { 140/******/ if(!__webpack_require__.o(exports, name)) { 141/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); 142/******/ } 143/******/ }; 144/******/ 145/******/ // define __esModule on exports 146/******/ __webpack_require__.r = function(exports) { 147/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { 148/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); 149/******/ } 150/******/ Object.defineProperty(exports, '__esModule', { value: true }); 151/******/ }; 152/******/ 153/******/ // create a fake namespace object 154/******/ // mode & 1: value is a module id, require it 155/******/ // mode & 2: merge all properties of value into the ns 156/******/ // mode & 4: return value when already ns object 157/******/ // mode & 8|1: behave like require 158/******/ __webpack_require__.t = function(value, mode) { 159/******/ if(mode & 1) value = __webpack_require__(value); 160/******/ if(mode & 8) return value; 161/******/ if((mode & 4) && typeof value === 'object' && value && value.__esMo
161dule) return value; 162/******/ var ns = Object.create(null); 163/******/ __webpack_require__.r(ns); 164/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); 165/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); 166/******/ return ns; 167/******/ }; 168/******/ 169/******/ // getDefaultExport function for compatibility with non-harmony modules 170/******/ __webpack_require__.n = function(module) { 171/******/ var getter = module && module.__esModule ? 172/******/ function getDefault() { return module['default']; } : 173/******/ function getModuleExports() { return module; }; 174/******/ __webpack_require__.d(getter, 'a', getter); 175/******/ return getter; 176/******/ }; 177/******/ 178/******/ // Object.prototype.hasOwnProperty.call 179/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; 180/******/ 181/******/ // __webpack_public_path__ 182/******/ __webpack_require__.p = "/Media/assets//js/"; 183/******/ 184/******/ // on error function for async loading 185/******/ __webpack_require__.oe = function(err) { console.error(err); throw err; }; 186/******/ 187/******/ var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || []; 188/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray); 189/******/ jsonpArray.push = webpackJsonpCallback; 190/******/ jsonpArray = jsonpArray.slice(); 191/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]); 192/******/ var parentJsonpFunction = oldJsonpFunction; 193/******/ 194/******/ 195/******/ // Load entry module and return exports 196/******/ return __webpack_require__(__webpack_require__.s = "./_HTML/src/js/entry.js"); 197/******/ }) 198/************************************************************************/ 199/******/ ({ 200 201/***/ "./.modernizrrc": 202/*!**********************!*\ 203 !*** ./.modernizrrc ***! 204 \**********************/ 205/*! no static exports found */ 206/***/ (function(module, exports) { 207 208;(function(window){ 209var hadGlobal = 'Modernizr' in window; 210var oldGlobal = window.Modernizr; 211/*! modernizr 3.11.4 (Custom Build) | MIT * 212 * https://modernizr.com/download/?-cssscrollbar-touchevents-addtest-mq-setclasses-testprop !*/ 213!function(e,n,t,o){function r(e,n){return typeof e===n}function i(e){var n=w.className,t=Modernizr._config.classPrefix||"";if(_&&(n=n.baseVal),Modernizr._config.enableJSClass){var o=new RegExp("(^|\\s)"+t+"no-js(\\s|$)");n=n.replace(o,"$1"+t+"js$2")}Modernizr._config.enableClasses&&(e.length>0&&(n+=" "+t+e.join(" "+t)),_?w.className.baseVal=n:w.className=n)}function s(){return"function"!=typeof t.createElement?t.createElement(arguments[0]):_?t.createElementNS.call(t,"http://www.w3.org/2000/svg",arguments[0]):t.createElement.apply(t,arguments)}function l(){var e=t.body;return e||(e=s(_?"svg":"body"),e.fake=!0),e}function a(e,n,o,r){var i,a,u,f,c="modernizr",d=s("div"),p=l();if(parseInt(o,10))for(;o--;)u=s("div"),u.id=r?r[o]:c+(o+1),d.appendChild(u);return i=s("style"),i.type="text/css",i.id="s"+c,(p.fake?p:d).appendChild(i),p.appendChild(d),i.styleSheet?i.styleSheet.cssText=e:i.appendChild(t.createTextNode(e)),d.id=c,p.fake&&(p.style.background="",p.style.overflow="hidden",f=w.style.overflow,w.style.overflow="hidden",w.appendChild(p)),a=n(d,e),p.fake?(p.parentNode.removeChild(p),w.style.overflow=f,w.offsetHeight):d.parentNode.removeChild(d),!!a}function u(e,t,o){var r;if("getComputedStyle"in n){r=getComputedStyle.call(n,e,t);var i=n.console;if(null!==r)o&&(r=r.getPropertyValue(o));else if(i){var s=i.error?"error":"log";i[s].call(i,"getComputedStyle returning null, its possible modernizr test results are inaccurate")}}else r=!t&&e.currentStyle&&e.currentStyle[o];return r}function f(e,n){if("object"==typeof e)for(var t in e)S(e,t)&&f(t,e[t]);else{e=e.toLowerCase();var o=e.split("."),r=Modernizr[o[0]];if(2===o.length&&(r=r[o[1]]),void 0!==r)return Modernizr;n="function"==typeof n?n():n,1===o.length?Modernizr[o[0]]=n:(!Modernizr[o[0]]||Modernizr[o[0]]instanceof Boolean||(Modernizr[o[0]]=new Boolean(Modernizr[o[0]])),Modernizr[o[0]][o[1]]=n),i([(n&&!1!==n?"":"no-")+o.join("-")]),Modernizr._trigger(e,n)}return Modernizr}function c(e,n){return!!~(""+e).indexOf(n)}function d(e){return e.replace(/([A-Z])/g,function(e,n){return"-"+n.toLowerCase()}).replace(/^ms-/,"-ms-")}function p(e,t){var r=e.length;if("CSS"in n&&"supports"in n.CSS){for(;r--;)if(n.CSS.supports(d(e[r]),t))return!0;return!1}if("CSSSupportsRule"in n){for(var i=[];r--;)i.push("("+d(e[r])+":"+t+")");return i=i.join(" or "),a("@supports ("+i+") { #modernizr { position: absolute; } }",function(e){return"absolute"===u(e,null,"position")})}return o}function h(e){return e.replace(/([a-z])-([a-z])/g,function(e,n,t){return n+t.toUpperCase()}).replace(/^-/,"")}function m(e,n,t,i){function l(){u&&(delete x.style,delete x.modElem)}if(i=!r(i,"undefined")&&i,!r(t,"undefined")){var a=p(e,t);if(!r(a,"undefined"))return a}for(var u,f,d,m,v,y=["modernizr","tspan","samp"];!x.style&&y.length;)u=!0,x.modElem=s(y.shift()),x.style=x.modElem.style;for(d=e.length,f=0;f<d;f++)if(m=e[f],v=x.style[m],c(m,"-")&&(m=h(m)),x.style[m]!==o){if(i||r(t,"undefined"))return l(),"pfx"!==n||m;try{x.style[m]=t}catch(e){}if(x.style[m]!==v)return l(),"pfx"!==n||m}return l(),!1}var v=[],y={_version:"3.11.4",_config:{classPrefix:"",enableClasses:!0,enableJSClass:!0,usePrefixes:!0},_q:[],on:function(e,n){var t=this;setTimeout(function(){n(t[e])},0)},addTest:function(e,n,t){v.push({name:e,fn:n,options:t})},addAsyncTest:function(e){v.push({name:null,fn:e})}},Modernizr=function(){};Modernizr.prototype=y,Modernizr=new Modernizr;var g=[],w=t.documentElement,_="svg"===w.nodeName.toLowerCase(),C=function(){var e=n.matchMedia||n.msMatchMedia;return e?function(n){var t=e(n);return t&&t.matches||!1}:function(e){var n=!1;return a("@media "+e+" { #modernizr { position: absolute; } }",function(e){n="absolute"===u(e,null,"position")}),n}}();y.mq=C;var S;!function(){var e={}.hasOwnProperty;S=r(e,"undefined")||r(e.call,"undefined")?function(e,n){return n in e&&r(e.constructor.prototype[n],"undefined")}:function(n,t){return e.call(n,t)}}(),y._l={},y.on=function(e,n){this._l[e]||(this._l[e]=[]),this._l[e].push(n),Modernizr.hasOwnProperty(e)&&setTimeout(function(){Modernizr._trigger(e,Modernizr[e])},0)},y._trigger=function(e,n){if(this._l[e]){var t=this._l[e];setTimeout(function(){var e;
213for(e=0;e<t.length;e++)(0,t[e])(n)},0),delete this._l[e]}},Modernizr._q.push(function(){y.addTest=f});var b={elem:s("modernizr")};Modernizr._q.push(function(){delete b.elem});var x={style:b.elem.style};Modernizr._q.unshift(function(){delete x.style});var T=(y.testProp=function(e,n,t){return m([e],o,n,t)},y.testStyles=a),z=y._config.usePrefixes?" -webkit- -moz- -o- -ms- ".split(" "):["",""];y._prefixes=z,T("#modernizr{overflow: scroll; width: 40px; height: 40px; }#"+z.join("scrollbar{width:10px} #modernizr::").split("#").slice(1).join("#")+"scrollbar{width:10px}",function(e){Modernizr.addTest("cssscrollbar","scrollWidth"in e&&30===e.scrollWidth)}),Modernizr.addTest("touchevents",function(){if("ontouchstart"in n||n.TouchEvent||n.DocumentTouch&&t instanceof DocumentTouch)return!0;var e=["(",z.join("touch-enabled),("),"heartz",")"].join("");return C(e)}),function(){var e,n,t,o,i,s,l;for(var a in v)if(v.hasOwnProperty(a)){if(e=[],n=v[a],n.name&&(e.push(n.name.toLowerCase()),n.options&&n.options.aliases&&n.options.aliases.length))for(t=0;t<n.options.aliases.length;t++)e.push(n.options.aliases[t].toLowerCase());for(o=r(n.fn,"function")?n.fn():n.fn,i=0;i<e.length;i++)s=e[i],l=s.split("."),1===l.length?Modernizr[l[0]]=o:(Modernizr[l[0]]&&(!Modernizr[l[0]]||Modernizr[l[0]]instanceof Boolean)||(Modernizr[l[0]]=new Boolean(Modernizr[l[0]])),Modernizr[l[0]][l[1]]=o),g.pu
213sh((o?"":"no-")+l.join("-"))}}(),i(g),delete y.addTest,delete y.addAsyncTest;for(var j=0;j<Modernizr._q.length;j++)Modernizr._q[j]();e.Modernizr=Modernizr}(window,window,document); 214module.exports = window.Modernizr; 215if (hadGlobal) { window.Modernizr = oldGlobal; } 216else { delete window.Modernizr; } 217})(window); 218 219/***/ }), 220 221/***/ "./_HTML/src/js/_modules-loaders lazy recursive ^\\.\\/.*$": 222/*!**********************************************************************!*\ 223 !*** ./_HTML/src/js/_modules-loaders lazy ^\.\/.*$ namespace object ***! 224 \**********************************************************************/ 225/*! no static exports found */ 226/***/ (function(module, exports, __webpack_require__) { 227 228var map = { 229 "./accordion--module-loader": [ 230 "./_HTML/src/js/_modules-loaders/accordion--module-loader.js", 231 0, 232 14 233 ], 234 "./accordion--module-loader.js": [ 235 "./_HTML/src/js/_modules-loaders/accordion--module-loader.js", 236 0, 237 14 238 ], 239 "./animated-text": [ 240 "./_HTML/src/js/_modules-loaders/animated-text.js", 241 22 242 ], 243 "./animated-text.js": [ 244 "./_HTML/src/js/_modules-loaders/animated-text.js", 245 22 246 ], 247 "./beerbox--module-loader": [ 248 "./_HTML/src/js/_modules-loaders/beerbox--module-loader.js", 249 1, 250 2, 251 4, 252 3, 253 8 254 ], 255 "./beerbox--module-loader.js": [ 256 "./_HTML/src/js/_modules-loaders/beerbox--module-loader.js", 257 1, 258 2, 259 4, 260 3, 261 8 262 ], 263 "./cart--module-loader": [ 264 "./_HTML/src/js/_modules-loaders/cart--module-loader.js", 265 12 266 ], 267 "./cart--module-loader.js": [ 268 "./_HTML/src/js/_modules-loaders/cart--module-loader.js", 269 12 270 ], 271 "./catalog-filter--module-loader": [ 272 "./_HTML/src/js/_modules-loaders/catalog-filter--module-loader.js", 273 23 274 ], 275 "./catalog-filter--module-loader.js": [ 276 "./_HTML/src/js/_modules-loaders/catalog-filter--module-loader.js", 277 23 278 ], 279 "./draggable-table--module-loader": [ 280 "./_HTML/src/js/_modules-loaders/draggable-table--module-loader.js", 281 24 282 ], 283 "./draggable-table--module-loader.js": [ 284 "./_HTML/src/js/_modules-loaders/draggable-table--module-loader.js", 285 24 286 ], 287 "./google-map--module-loader": [ 288 "./_HTML/src/js/_modules-loaders/google-map--module-loader.js", 289 0, 290 9, 291 15 292 ], 293 "./google-map--module-loader.js": [ 294 "./_HTML/src/js/_modules-loaders/google-map--module-loader.js", 295 0, 296 9, 297 15 298 ], 299 "./infinity-scroll--module-loader": [ 300 "./_HTML/src/js/_modules-loaders/infinity-scroll--module-loader.js", 301 16 302 ], 303 "./infinity-scroll--module-loader.js": [ 304 "./_HTML/src/js/_modules-loaders/infinity-scroll--module-loader.js", 305 16 306 ], 307 "./input-quantity--module-loader": [ 308 "./_HTML/src/js/_modules-loaders/input-quantity--module-loader.js", 309 32, 310 17 311 ], 312 "./input-quantity--module-loader.js": [ 313 "./_HTML/src/js/_modules-loaders/input-quantity--module-loader.js", 314 32, 315 17 316 ], 317 "./inputmask--module-loader": [ 318 "./_HTML/src/js/_modules-loaders/inputmask--module-loader.js", 319 0, 320 10, 321 13 322 ], 323 "./inputmask--module-loader.js": [ 324 "./_HTML/src/js/_modules-loaders/inputmask--module-loader.js", 325 0, 326 10, 327 13 328 ], 329 "./jquery-validation--module-loader": [ 330 "./_HTML/src/js/_modules-loaders/jquery-validation--module-loader.js", 331 0, 332 1, 333 2, 334 4, 335 7 336 ], 337 "./jquery-validation--module-loader.js": [ 338 "./_HTML/src/js/_modules-loaders/jquery-validation--module-loader.js", 339 0, 340 1, 341 2, 342 4, 343 7 344 ], 345 "./magnific-popup--module-loader": [ 346 "./_HTML/src/js/_modules-loaders/magnific-popup--module-loader.js", 347 0, 348 1, 349 2, 350 3, 351 18 352 ], 353 "./magnific-popup--module-loader.js": [ 354 "./_HTML/src/js/_modules-loaders/magnific-popup--module-loader.js", 355 0, 356 1, 357 2, 358 3, 359 18 360 ], 361 "./partner-form--module-loader": [ 362 "./_HTML/src/js/_modules-loaders/partner-form--module-loader.js", 363 11 364 ], 365 "./partner-form--module-loader.js": [ 366 "./_HTML/src/js/_modules-loaders/partner-form--module-loader.js", 367 11 368 ], 369 "./password-toggle--module-loader": [ 370 "./_HTML/src/js/_modules-loaders/password-toggle--module-loader.js", 371 19 372 ], 373 "./password-toggle--module-loader.js": [ 374 "./_HTML/src/js/_modules-loaders/password-toggle--module-loader.js", 375 19 376 ], 377 "./review-read-more--module-loader": [ 378 "./_HTML/src/js/_modules-loaders/review-read-more--module-loader.js", 379 25 380 ], 381 "./review-read-more--module-loader.js": [ 382 "./_HTML/src/js/_modules-loaders/review-read-more--module-loader.js", 383 25 384 ], 385 "./s2s--module-loader": [ 386 "./_HTML/src/js/_modules-loaders/s2s--module-loader.js", 387 26 388 ], 389 "./s2s--module-loader.js": [ 390 "./_HTML/src/js/_modules-loaders/s2s--module-loader.js", 391 26 392 ], 393 "./scroll-window--module-loader": [ 394 "./_HTML/src/js/_modules-loaders/scroll-window--module-loader.js", 395 5, 396 21, 397 20 398 ], 399 "./scroll-window--module-loader.js": [ 400 "./_HTML/src/js/_modules-loaders/scroll-window--module-loader.js", 401 5, 402 21, 403 20 404 ], 405 "./sliders--module-loader": [ 406 "./_HTML/src/js/_modules-loaders/sliders--module-loader.js", 407 6, 408 27 409 ], 410 "./sliders--module-loader.js": [ 411 "./_HTML/src/js/_modules-loaders/sliders--module-loader.js", 412 6, 413 27 414 ],
415 "./splash-no-18": [ 416 "./_HTML/src/js/_modules-loaders/splash-no-18.js", 417 28 418 ], 419 "./splash-no-18.js": [ 420 "./_HTML/src/js/_modules-loaders/splash-no-18.js", 421 28 422 ], 423 "./timeline": [ 424 "./_HTML/src/js/_modules-loaders/timeline.js", 425 33, 426 29 427 ], 428 "./timeline.js": [ 429 "./_HTML/src/js/_modules-loaders/timeline.js", 430 33, 431 29 432 ], 433 "./wrap-media--module-loader": [ 434 "./_HTML/src/js/_modules-loaders/wrap-media--module-loader.js", 435 30 436 ], 437 "./wrap-media--module-loader.js": [ 438 "./_HTML/src/js/_modules-loaders/wrap-media--module-loader.js", 439 30 440 ], 441 "./zzload--module-loader": [ 442 "./_HTML/src/js/_modules-loaders/zzload--module-loader.js", 443 31 444 ], 445 "./zzload--module-loader.js": [ 446 "./_HTML/src/js/_modules-loaders/zzload--module-loader.js", 447 31 448 ] 449}; 450function webpackAsyncContext(req) { 451 var ids = map[req]; 452 if(!ids) { 453 return Promise.resolve().then(function() { 454 var e = new Error("Cannot find module '" + req + "'"); 455 e.code = 'MODULE_NOT_FOUND'; 456 throw e; 457 }); 458 } 459 return Promise.all(ids.slice(1).map(__webpack_require__.e)).then(function() { 460 var id = ids[0]; 461 return __webpack_require__.t(id, 7); 462 }); 463} 464webpackAsyncContext.keys = function webpackAsyncContextKeys() { 465 return Object.keys(map); 466}; 467webpackAsyncContext.id = "./_HTML/src/js/_modules-loaders lazy recursive ^\\.\\/.*$"; 468module.exports = webpackAsyncContext; 469 470/***/ }), 471
472/***/ "./_HTML/src/js/_modules/ball-modal/index.js": 473/*!***************************************************!*\ 474 !*** ./_HTML/src/js/_modules/ball-modal/index.js ***! 475 \***************************************************/ 476/*! no static exports found */ 477/***/ (function(module, exports, __webpack_require__) { 478 479"use strict"; 480 481 482/** 483 * @module Ball Modal - ÑазмеÑение ÑаÑика и ÑпÑавление модалÑнÑм окном 484 */ 485 486Object.defineProperty(exports, "__esModule", { 487 value: true 488}); 489 490var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; 491 492var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); 493 494var _cookieData = __webpack_require__(/*! #/_modules/cookie-data */ "./_HTML/src/js/_modules/cookie-data.js"); 495 496var _cookieData2 = _interopRequireDefault(_cookieData); 497 498var _jquery = __webpack_require__(/*! jquery */ "jquery"); 499 500var _jquery2 = _interopRequireDefault(_jquery); 501 502function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 503 504function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } 505 506function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 507 508/** 509 * ÐлаÑÑ Ð´Ð»Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ball Modal 510 */ 511var BallModal = function () { 512 function BallModal() { 513 _classCallCheck(this, BallModal); 514 515 this.container = document.querySelector('.bf-ball-container'); 516 this.ball = document.querySelector('.bf-ball'); 517 this.modalStep1 = document.getElementById('bfBallModalStep1'); 518 this.modalStep2 = document.getElementById('bfBallModalStep2'); 519 520 // ÐÑовеÑÑем налиÑие конÑейнеÑа и ÑаÑика 521 if (!this.container) { 522 console.warn('BallModal: конÑÐµÐ¹Ð½ÐµÑ .bf-ball-container не найден в DOM'); 523 return; 524 } 525 526 if (!this.ball) { 527 console.warn('BallModal: ÑаÑик .bf-ball не найден в DOM'); 528 return; 529 } 530 531 // ÐÑовеÑÑем налиÑие cookie 532 if (_cookieData2.default.receive('show-ball-modal')) { 533 // ÐÑли cookie ÑÑÑановлена, ÑкÑÑваем ÑаÑик 534 this.container.style.display = 'none'; 535 this.container.style.visibility = 'hidden'; 536 return; 537 } 538 539 // ÐниÑиализиÑÑем ÑаÑик 540 this.init(); 541 } 542 543 /** 544 * ÐниÑиализаÑÐ¸Ñ 545 */ 546 547 548 _createClass(BallModal, [{ 549 key: 'init', 550 value: function init() { 551 var _this = this; 552 553 if (!this.container || !this.ball) { 554 console.warn('BallModal: конÑÐµÐ¹Ð½ÐµÑ Ð¸Ð»Ð¸ ÑаÑик не Ð½Ð°Ð¹Ð´ÐµÐ½Ñ Ð¿Ñи иниÑиализаÑии'); 555 return; 556 } 557 558 // УбеждаемÑÑ, ÑÑо ÑаÑик Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð²Ð½ÑÑÑи конÑейнеÑа 559 if (!this.container.contains(this.ball)) { 560 console.warn('BallModal: ÑаÑик не найден внÑÑÑи конÑейнеÑа, добавлÑем'); 561 this.container.appendChild(this.ball); 562 } 563 564 // УдалÑем конÑÐµÐ¹Ð½ÐµÑ Ð¸Ð· ÑекÑÑего меÑÑа в DOM (еÑли он Ñам еÑÑÑ) 565 if (this.container.parentNode) { 566 this.container.parentNode.removeChild(this.container); 567 } 568 569 // СкÑÑваем ÑаÑик вÑеменно 570 this.container.style.display = 'none'; 571 this.container.style.visibility = 'hidden'; 572 573 // РазмеÑаем ÑаÑик, пÑикÑеплÑÑ Ðº ÑлÑÑÐ°Ð¹Ð½Ð¾Ð¼Ñ ÑлеменÑÑ 574 this.positionBall(); 575 576 // ÐÑинÑдиÑелÑно показÑваем ÑаÑик поÑле ÑазмеÑÐµÐ½Ð¸Ñ 577 setTimeout(function () { 578 if (_this.container && _this.container.parentNode) { 579 // УбеждаемÑÑ, ÑÑо ÑаÑик виден 580 _this.container.style.display = 'block'; 581 _this.container.style.visibility = 'visible'; 582 _this.container.style.opacity = '1'; 583 _this.container.style.pointerEvents = 'auto'; 584 _this.container.style.position = 'absolute'; 585 _this.container.classList.add('is-attached'); 586 587 // ÐÑовеÑка кооÑÐ´Ð¸Ð½Ð°Ñ 588 var rect = _this.container.getBoundingClientRect(); 589 if (rect.width === 0 || rect.height === 0) { 590 console.warn('BallModal: ÑаÑик Ð¸Ð¼ÐµÐµÑ Ð½Ñлевой ÑазмеÑ, возможно ÑкÑÑÑ CSS'); 591 } 592 } else { 593 console.warn('BallModal: ÑаÑик не бÑл добавлен в DOM поÑле позиÑиониÑованиÑ, иÑполÑзÑем fallback'); 594 // Fallback - ÑазмеÑаем в ÑлÑÑайной позиÑии 595 _this.attachToRandomPosition(); 596 if (_this.container && _this.container.parentNode) { 597 _this.container.style.display = 'block'; 598 _this.container.style.visibility = 'visible'; 599 _this.container.style.opacity = '1'; 600 _this.container.style.pointerEvents = 'auto'; 601 _this.container.style.position = 'absolute'; 602 _this.container.classList.add('is-attached'); 603 } 604 } 605 }, 150); 606 607 // ÐбÑабоÑка клика на ÑаÑик 608 this.ball.addEventListener('click', function (e) { 609 e.preventDefault(); 610 _this.showModalStep1(); 611 }); 612 613 // ÐбÑабоÑка закÑÑÑÐ¸Ñ Ð¼Ð¾Ð´Ð°Ð»ÑнÑÑ Ð¾ÐºÐ¾Ð½ 614 this.initModalHandlers(); 615
616 // ÐбÑабоÑка ÑоÑÐ¼Ñ 617 this.initFormHandler(); 618 619 // ÐбÑабоÑка кнопки копиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñомокода 620 this.initCopyButton(); 621 622 // ÐÑи изменении ÑазмеÑа окна - пеÑепÑикÑеплÑем ÑаÑик 623 var resizeTimeout = void 0; 624 window.addEventListener('resize', function () { 625 clearTimeout(resizeTimeout); 626 resizeTimeout = setTimeout(function () { 627 if (_this.container && _this.container.parentNode && !_cookieData2.default.receive('show-ball-modal')) { 628 _this.container.style.display = 'none'; 629 if (_this.container.parentNode !== document.body) { 630 _this.container.parentNode.removeChild(_this.container); 631 } 632 _this.positionBall(); 633 if (_this.container.parentNode) { 634 _this.container.style.display = 'block'; 635 } 636 } 637 }, 300); 638 }); 639 } 640 641 /** 642 * РазмеÑение ÑаÑика - пÑикÑепление к ÑлÑÑÐ°Ð¹Ð½Ð¾Ð¼Ñ ÐÐÐЧÐÐÐÐÐÐÐУ ÑлеменÑÑ Ð½Ð° ÑÑÑаниÑе 643 * ШаÑик пÑивÑзан к ÑлеменÑÑ Ð¸ двигаеÑÑÑ Ð²Ð¼ÐµÑÑе Ñо ÑÑÑаниÑей пÑи пÑокÑÑÑке 644 */ 645 646 }, { 647 key: 'positionBall', 648 value: function positionBall() { 649 if (!this.container || !this.ball) { 650 return; 651 } 652 653 // ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ вÑе Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑие ÐÐÐЧÐÐÐÐÐЫРÑлеменÑÑ Ð½Ð° ÑÑÑаниÑе 654 // ÐÑбиÑаем мелкие, незамеÑнÑе ÑлеменÑÑ - делаем игÑÑ Ð¸Ð½ÑеÑеÑнее 655 var selectors = ['p', // ÐбÑÑнÑе паÑагÑаÑÑ (пÑедпоÑиÑаем мелкие) 656 'span:not(.icon):not(.badge):not(.tag)', // ÐбÑÑнÑе span, но не иконки/бейджи 657 'small', // Ðелкий ÑекÑÑ 658 'label', // ÐеÑки ÑоÑм 659 'time', // ÐлеменÑÑ Ð²Ñемени 660 'address', // ÐдÑеÑа 661 'cite', // ЦиÑаÑÑ 662 'code', // Ðод 663 'sub', 'sup', // ÐодÑÑÑоÑнÑе/надÑÑÑоÑнÑе индекÑÑ 664 '.text-small', // Ðелкий ÑекÑÑ 665 '.caption', // ÐодпиÑи 666 '.meta', // ÐеÑа-инÑоÑмаÑÐ¸Ñ 667 '.description:not(.product-description)']; 668 669 // СобиÑаем вÑе Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑие ÐÐÐЧÐÐÐÐÐЫРÑлеменÑÑ 670 var candidates = []; 671 672 selectors.forEach(function (selector) { 673 try { 674 var elements = document.querySelectorAll(selector); 675 elements.forEach(function (el) { 676 // ÐÑклÑÑаем ÑлеменÑÑ, коÑоÑÑе ÑлиÑком Ð¼Ð°Ð»Ñ Ð¸Ð»Ð¸ ÑкÑÑÑÑ 677 var rect = el.getBoundingClientRect(); 678 var style = window.getComputedStyle(el); 679 680 // ÐÑклÑÑаем оÑевиднÑе и болÑÑие ÑлеменÑÑ - делаем игÑÑ Ð¸Ð½ÑеÑеÑнее 681 var isObvious = el.tagName.match(/^H[1-6]$/i) || // Ðаголовки 682 el.tagName === 'BUTTON' || // Ðнопки 683 el.tagName === 'IMG' || // ÐзобÑÐ°Ð¶ÐµÐ½Ð¸Ñ 684 el.tagName === 'A' && (el.classList.contains('btn') || el.classList.contains('link') || el.getAttribute('href')) || // СÑÑлки-кнопки или лÑбÑе ÑÑÑлки 685 el.classList.contains('title') || // ÐлеменÑÑ Ñ ÐºÐ»Ð°ÑÑом title 686 el.classList.contains('btn') || // Ðнопки 687 el.classList.contains('button') || // Ðнопки 688 el.classList.contains('product-card') || // ÐаÑÑоÑки ÑоваÑов 689 el.classList.contains('catalog-item') || // ÐлеменÑÑ ÐºÐ°Ñалога 690 el.classList.contains('card') || // ÐаÑÑоÑки 691 el.classList.contains('item') || // ÐлеменÑÑ 692 el.classList.contains('product') || // ТоваÑÑ 693 el.classList.contains('icon') || // Ðконки 694 el.classList.contains('logo') || // ÐогоÑÐ¸Ð¿Ñ 695 rect.width > 300 || // СлиÑком болÑÑие ÑлеменÑÑ 696 rect.height > 200; // СлиÑком вÑÑокие ÑлеменÑÑ 697 698 // ÐÑедпоÑиÑаем ÑлеменÑÑ ÑÑеднего ÑазмеÑа, но не ÑлиÑком болÑÑие 699 var isGoodSize = rect.width >= 30 && rect.width <= 250 && rect.height >= 20 && rect.height <= 150; 700 701 if (!isObvious && // Ðе оÑевиднÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ 702 isGoodSize && // ÐÐ¾Ð´Ñ Ð¾Ð´ÑÑий ÑÐ°Ð·Ð¼ÐµÑ 703 style.display !== 'none' && style.visibility !== 'hidden' && style.opacity !== '0' && !el.closest('.bf-ball-container') && // Ðе на Ñамом ÑаÑике 704 !el.closest('header') && // Ðе в Ñапке 705 !el.closest('footer') && // Ðе в ÑÑÑеÑе 706 !el.closest('.bf-ball-modal') && // Ðе в модалке 707 !el.closest('.modal') && // Ðе в дÑÑÐ³Ð¸Ñ Ð¼Ð¾Ð´Ð°Ð»ÐºÐ°Ñ 708 !el.closest('.popup') // Ðе в Ð¿Ð¾Ð¿Ð°Ð¿Ð°Ñ 709 ) { 710 candidates.push(el); 711 } 712 }); 713 } catch (e) { 714 // ÐгноÑиÑÑем оÑибки ÑелекÑоÑов 715 } 716 }); 717 718 // ФилÑÑÑÑем ÑолÑко ÑлеменÑÑ Ð² видимой облаÑÑи
719 var viewportHeight = window.innerHeight; 720 var viewportWidth = window.innerWidth; 721 722 var visibleCandidates = candidates.filter(function (el) { 723 var rect = el.getBoundingClientRect(); 724 return rect.top < viewportHeight && rect.bottom > 0 && rect.left < viewportWidth && rect.right > 0 && rect.width > 0 && rect.height > 0; 725 }); 726 727 // ÐÑли не наÑли Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑÐ¸Ñ ÑлеменÑов, иÑполÑзÑем body 728 if (visibleCandidates.length === 0) { 729 this.attachToRandomPosition(); 730 return; 731 } 732 733 // ÐÑбиÑаем ÑлÑÑайнÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¸Ð· видимÑÑ 734 var randomElement = visibleCandidates[Math.floor(Math.random() * visibleCandidates.length)]; 735 736 // ÐÑикÑеплÑем ÑаÑик к вÑбÑÐ°Ð½Ð½Ð¾Ð¼Ñ ÑлеменÑÑ 737 this.attachToElement(randomElement); 738 } 739 740 /** 741 * ÐÑикÑепление ÑаÑика к конкÑеÑÐ½Ð¾Ð¼Ñ ÑлеменÑÑ 742 */ 743 744 }, { 745 key: 'attachToElement', 746 value: function attachToElement(element) { 747 if (!this.container || !element) { 748 return; 749 } 750 751 // ÐÑли ÑÐ»ÐµÐ¼ÐµÐ½Ñ - body, иÑполÑзÑем ÑлÑÑайное позиÑиониÑование 752 if (element === document.body) { 753 this.attachToRandomPosition(); 754 return; 755 } 756 757 // ÐолÑÑаем позиÑÐ¸Ñ ÑлеменÑа оÑноÑиÑелÑно viewport 758 var elementRect = element.getBoundingClientRect(); 759 // ÐолÑÑаем позиÑÐ¸Ñ ÑлеменÑа оÑноÑиÑелÑно докÑменÑа (Ñ ÑÑеÑом пÑокÑÑÑки) 760 var scrollY = window.scrollY || window.pageYOffset; 761 var scrollX = window.scrollX || window.pageXOffset; 762 763 // ШаÑик должен бÑÑÑ Ð²Ð¸Ð´ÐµÐ½, поÑÑÐ¾Ð¼Ñ ÑазмеÑаем его оÑноÑиÑелÑно ÑлеменÑа 764 // ÐÑбиÑаем ÑлÑÑайнÑÑ Ð¿Ð¾Ð·Ð¸ÑÐ¸Ñ Ð²Ð¾ÐºÑÑг ÑлеменÑа 765 var ballWidth = 60; 766 var ballHeight = 220; 767 768 // ÐозиÑии оÑноÑиÑелÑно ÑлеменÑа (пÑоÑÐµÐ½Ñ Ð¾Ñ ÑазмеÑа ÑлеменÑа) 769 var positions = [{ side: 'top-left', x: 0.1, y: -ballHeight - 10 }, // СвеÑÑ Ñ Ñлева 770 { side: 'top-right', x: 0.9, y: -ballHeight - 10 }, // СвеÑÑ Ñ ÑпÑава 771 { side: 'bottom-left', x: 0.1, y: elementRect.height + 10 }, // Ð¡Ð½Ð¸Ð·Ñ Ñлева 772 { side: 'bottom-right', x: 0.9, y: elementRect.height + 10 }, // Ð¡Ð½Ð¸Ð·Ñ ÑпÑава 773 { side: 'top-center', x: 0.5, y: -ballHeight - 10 }, // СвеÑÑ Ñ Ð¿Ð¾ ÑенÑÑÑ 774 { side: 'bottom-center', x: 0.5, y: elementRect.height + 10 }]; 775 776 var randomPos = positions[Math.floor(Math.random() * positions.length)]; 777 778 // ÐÑÑиÑлÑем абÑолÑÑнÑе кооÑдинаÑÑ Ð¾ÑноÑиÑелÑно докÑменÑа (Ñ ÑÑеÑом пÑокÑÑÑки) 779 // elementRect.left/top - ÑÑо позиÑÐ¸Ñ Ð¾ÑноÑиÑелÑно viewport 780 // ÐобавлÑем scrollX/scrollY ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¿Ð¾Ð·Ð¸ÑÐ¸Ñ Ð¾ÑноÑиÑелÑно докÑменÑа 781 var absoluteX = elementRect.left + scrollX + elementRect.width * randomPos.x - ballWidth * 0.5; 782 var absoluteY = elementRect.top + scrollY + randomPos.y; 783 784 // УбеждаемÑÑ, ÑÑо ÑаÑик Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð²Ð½ÑÑÑи конÑейнеÑа 785 if (!this.container.contains(this.ball)) { 786 this.container.appendChild(this.ball); 787 } 788 789 // ÐÑÑавлÑем конÑÐµÐ¹Ð½ÐµÑ Ñ ÑаÑиком в body Ñ Ð°Ð±ÑолÑÑнÑм позиÑиониÑованием 790 if (this.container.parentNode !== document.body) { 791 document.body.appendChild(this.container); 792 } 793 794 // УÑÑанавливаем позиÑÐ¸Ñ (absolute, ÑÑÐ¾Ð±Ñ ÑаÑик бÑл пÑивÑзан к ÑлеменÑÑ Ð¸ двигалÑÑ Ñо ÑÑÑаниÑей) 795 this.container.style.position = 'absolute'; 796 this.container.style.left = absoluteX + 'px'; 797 this.container.style.top = absoluteY + 'px'; 798 this.container.style.zIndex = '9998'; 799 this.container.style.display = 'block'; 800 this.container.style.visibility = 'visible'; 801 this.container.style.opacity = '1'; 802 this.container.style.pointerEvents = 'auto'; 803 this.container.classList.add('is-attached'); 804 } 805 806 /** 807 * ÐÑикÑепление к ÑлÑÑайной позиÑии на ÑÑÑаниÑе (fallback) 808 */ 809 810 }, { 811 key: 'attachToRandomPosition', 812 value: function attachToRandomPosition() { 813 if (!this.container) { 814 return; 815 } 816 817 var ballWidth = 60; 818 var ballHeight = 220; 819 var padding = 20; 820 var viewportWidth = window.innerWidth;
821 var viewportHeight = window.innerHeight; 822 var scrollY = window.scrollY || window.pageYOffset; 823 var scrollX = window.scrollX || window.pageXOffset; 824 825 // ÐолÑÑаем ÑазмеÑÑ Ð´Ð¾ÐºÑменÑа 826 var documentHeight = Math.max(document.body.scrollHeight, document.body.offsetHeight, document.documentElement.clientHeight, document.documentElement.scrollHeight, document.documentElement.offsetHeight); 827 var documentWidth = Math.max(document.body.scrollWidth, document.body.offsetWidth, document.documentElement.clientWidth, document.documentElement.scrollWidth, document.documentElement.offsetWidth); 828 829 // ÐÑÑиÑлÑем диапазон Ð´Ð»Ñ ÑлÑÑайной позиÑии оÑноÑиÑелÑно докÑменÑа 830 var minX = padding; 831 var maxX = Math.max(viewportWidth, documentWidth) - ballWidth - padding; 832 var minY = padding; 833 var maxY = Math.max(viewportHeight, documentHeight) - ballHeight - padding; 834 835 var randomX = Math.floor(Math.random() * (maxX - minX + 1)) + minX; 836 var randomY = Math.floor(Math.random() * (maxY - minY + 1)) + minY; 837 838 // УбеждаемÑÑ, ÑÑо ÑаÑик Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð²Ð½ÑÑÑи конÑейнеÑа 839 if (this.ball && !this.container.contains(this.ball)) { 840 this.container.appendChild(this.ball); 841 } 842 843 // ÐÑÑавлÑем конÑÐµÐ¹Ð½ÐµÑ Ñ ÑаÑиком в body 844 if (this.container.parentNode !== document.body) { 845 document.body.appendChild(this.container); 846 } 847 848 // ÐÑполÑзÑем absolute позиÑиониÑование оÑноÑиÑелÑно докÑменÑа 849 this.container.style.position = 'absolute'; 850 this.container.style.left = randomX + 'px'; 851 this.container.style.top = randomY + 'px'; 852 this.container.style.zIndex = '9998'; 853 this.container.style.display = 'block'; 854 this.container.style.visibility = 'visible'; 855 this.container.classList.add('is-attached'); 856 } 857 858 /** 859 * Ðоказ пеÑвого модалÑного окна (ÑоÑма email) 860 */ 861 862 }, { 863 key: 'showModalStep1', 864 value: function showModalStep1() { 865 if (!this.modalStep1) { 866 return; 867 } 868 869 // СкÑÑваем ÑаÑик ÑÑÐ°Ð·Ñ Ð¸ полноÑÑÑÑ 870 if (this.container) { 871 this.container.style.display = 'none'; 872 this.container.style.visibility = 'hidden'; 873 this.container.style.opacity = '0'; 874 this.container.style.pointerEvents = 'none'; 875 } 876 877 // ÐоказÑваем модалÑное окно 878 this.modalStep1.style.display = 'flex'; 879 document.body.style.overflow = 'hidden'; 880 } 881 882 /** 883 * Ðоказ вÑоÑого модалÑного окна (пÑомокод) 884 */ 885 886 }, { 887 key: 'showModalStep2', 888 value: function showModalStep2(promocode) { 889 if (!this.modalStep2) { 890 return; 891 } 892 893 // СкÑÑваем пеÑвое модалÑное окно 894 if (this.modalStep1) { 895 this.modalStep1.style.display = 'none'; 896 } 897 898 // УÑÑанавливаем пÑомокод 899 var promocodeInput = this.modalStep2.querySelector('#bfBallPromocode'); 900 if (promocodeInput && promocode) { 901 promocodeInput.value = promocode; 902 } 903 904 // ÐбновлÑем ÑекÑÑ Ñ Ð¿ÑоÑенÑом Ñкидки 905 var promocodeText = this.modalStep2.querySelector('#bfBallPromocodeText'); 906 if (promocodeText && promocode) { 907 // Ðзвлекаем пÑоÑÐµÐ½Ñ Ð¸Ð· пÑомокода (BLKFRD5 -> 5%, BLKFRD10 -> 10%, и Ñ.д.) 908 var discountText = ''; 909 if (promocode === 'DOSTFREE') { 910 discountText = 'ÐÐÐÐÐШТÐÐÐУ ÐÐСТÐÐÐУ ÐÐ ÐÐÐÐÐТ ÐÐÐÐÐÐÐÐ '; 911 } else if (promocode.startsWith('BLKFRD')) { 912 // Ðзвлекаем ÑиÑло из пÑомокода (BLKFRD5 -> 5, BLKFRD10 -> 10) 913 var match = promocode.match(/BLKFRD(\d+)/); 914 if (match && match[1]) { 915 var percent = match[1]; 916 discountText = '-' + percent + '%'; 917 } else { 918 discountText = 'ÐÐ ÐÐÐÐÐÐ'; 919 } 920 } else { 921 discountText = 'ÐÐ ÐÐÐÐÐÐ'; 922 } 923 924 promocodeText.textContent = '\u0412\u0406\u0422\u0410\u0404\u041C\u041E! \u0412\u0418 \u0417\u041D\u0410\u0419\u0428\u041B\u0418 ' + discountText; 925 } 926 927 // ÐоказÑваем вÑоÑое модалÑное окно 928 this.modalStep2.style.display = 'flex'; 929 } 930 931 /** 932 * СкÑÑÑие модалÑного окна 933 */ 934 935 }, { 936 key: 'hideModal', 937 value: function hideModal() { 938 if (this.modalStep1) { 939 this.modalStep1.style.display = 'none'; 940 } 941 if (this.modalStep2) { 942 this.modalStep2.style.display = 'none'; 943 } 944 document.body.style.overflow = ''; 945 } 946 947 /** 948 * ÐниÑиализаÑÐ¸Ñ Ð¾Ð±ÑабоÑÑиков модалÑнÑÑ Ð¾ÐºÐ¾Ð½ 949 */ 950 951 }, { 952 key: 'initModalHandlers', 953 value: function initModalHandlers() { 954 var _this2 = this; 955 956 // Ðнопки закÑÑÑÐ¸Ñ 957 var closeButtons = document.querySelectorAll('.js-close-bf-ball-modal, .js-hide-bf-ball-modal'); 958 closeButtons.forEach(function (btn) { 959 btn.addEventListener('click', function () { 960 _this2.hideModal(); 961 // УÑÑанавливаем cookie, ÑÑÐ¾Ð±Ñ Ð±Ð¾Ð»ÑÑе не показÑваÑÑ ÑаÑик 962 _cookieData2.default.add('show-ball-modal', false, { 963 expires: 365, 964 path: '/', 965 SameSite: 'None', 966 Secure: 'Secure' 967 }); 968 }); 969 }); 970 971 // ÐакÑÑÑие пÑи клике на Ñон 972 [this.modalStep1, this.modalStep2].forEach(function (modal) { 973 if (modal) { 974 modal.addEventListener('click', function (e) { 975 if (e.target === modal) { 976 _this2.hideModal(); 977 _cookieData2.default.add('show-ball-modal', false, { 978 expires: 365, 979 path: '/', 980 SameSite: 'None', 981 Secure: 'Secure' 982 }); 983 } 984 }); 985 } 986 }); 987 } 988 989 /** 990 * ÐниÑиализаÑÐ¸Ñ Ð¾Ð±ÑабоÑÑика ÑоÑÐ¼Ñ 991 * ФоÑма обÑабаÑÑваеÑÑÑ ÑеÑез ÑÑандаÑÑнÑÑ ÑиÑÑÐµÐ¼Ñ Ð²Ð°Ð»Ð¸Ð´Ð°Ñии 992 * ÐÑ Ð¿ÐµÑÐµÑ Ð²Ð°ÑÑваем ÑÑпеÑнÑй оÑÐ²ÐµÑ ÑеÑез каÑÑомное ÑобÑÑие 993 */ 994 995 }, { 996 key: 'initFormHandler', 997 value: function initFormHandler() { 998 var _this3 = this; 999 1000 if (!this.modalStep1) { 1001 console.warn('BallModal: modalStep1 не найден'); 1002 return; 1003 } 1004 1005 var form = this.modalStep1.querySelector('form[data-ajax]'); 1006 if (!form) { 1007 console.warn('BallModal: ÑоÑма не найдена в modalStep1'); 1008 return; 1009 } 1010 1011 var $form = (0, _jquery2.default)(form); 1012 1013 // Ð¡Ð¾Ñ ÑанÑем ÑÑÑÐ»ÐºÑ Ð½Ð° ÑоÑÐ¼Ñ Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² дÑÑÐ³Ð¸Ñ Ð¼ÐµÑÐ¾Ð´Ð°Ñ 1014 this.form = form; 1015 this.$form = $form; 1016 1017 // ÐеÑÐµÑ Ð²Ð°ÑÑваем оÑÐ²ÐµÑ ÑеÑез каÑÑомное ÑобÑÑие, коÑоÑое генеÑиÑÑеÑÑÑ Ð² validateGetResponse 1018 $form.on('ballmodal:response', function (e, response) { 1019 console.log('BallModal: полÑÑен оÑÐ²ÐµÑ Ð¾Ñ ballmodal', response); 1020 1021 if (response && response.success && response.ballmodal) { 1022 // ÐÑли ÑоÑма ÑÑпеÑно оÑпÑавлена, оÑпÑавлÑем на вÑоÑой Ñаг 1023 console.log('BallModal: ÑÑпеÑнÑй оÑвеÑ, пеÑÐµÑ Ð¾Ð´Ð¸Ð¼ к ÑÐ¾Ñ ÑанениÑ'); 1024 _this3.saveBall(response); 1025 } else if (response && !response.success) { 1026 // ÐоказÑваем оÑибкÑ, еÑли она еÑÑÑ 1027 var errorMsg = response.response || 'Ðомилка. СпÑобÑйÑе Ñе Ñаз.'; 1028 console.error('BallModal: оÑибка в оÑвеÑе', errorMsg); 1029 alert(errorMsg); 1030 } else { 1031 console.warn('BallModal: неожиданнÑй ÑоÑÐ¼Ð°Ñ Ð¾ÑвеÑа', response); 1032 } 1033 }); 1034 1035 console.log('BallModal: обÑабоÑÑик ÑоÑÐ¼Ñ Ð¸Ð½Ð¸ÑиализиÑован длÑ', form, 'URL:', $form.data('ajax')); 1036 } 1037 1038 /** 1039 * Ð¡Ð¾Ñ Ñанение ÑаÑика (вÑоÑой Ñаг) 1040 */ 1041 1042 }, { 1043 key: 'saveBall', 1044 value: function saveBall(modalResponse) { 1045 var _this4 = this; 1046 1047 console.log('BallModal: saveBall вÑзван Ñ Ð¾ÑвеÑом', modalResponse); 1048 1049 var emailInput = this.modalStep1.querySelector('input[name="email"]'); 1050 if (!emailInput) { 1051 console.error('BallModal: email input не найден'); 1052 return; 1053 } 1054 1055 var email = emailInput.value; 1056 if (!email) { 1057 console.error('BallModal: email не найден в input'); 1058 alert('Ðомилка: email не знайдено'); 1059 return; 1060 } 1061 1062 // ÐÑполÑзÑем ÑÐ¾Ñ ÑаненнÑÑ ÑÑÑÐ»ÐºÑ Ð½Ð° ÑоÑÐ¼Ñ Ð¸Ð»Ð¸ иÑем заново 1063 var form = this.form || this.modalStep1.querySelector('form[data-ajax]'); 1064 if (!form) { 1065 console.error('BallModal: ÑоÑма не найдена'); 1066 return; 1067 } 1068 1069 var $form = this.$form || (0, _jquery2.default)(form); 1070 var baseUrl = $form.data('ajax') || form.getAttribute('data-ajax'); 1071 if (!baseUrl) { 1072 console.error('BallModal: не ÑдалоÑÑ Ð¾Ð¿ÑеделиÑÑ URL из ÑоÑмÑ'); 1073 alert('Ðомилка: не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°ÑиÑи URL Ð´Ð»Ñ Ð·Ð±ÐµÑеженнÑ'); 1074 return; 1075 } 1076 1077 console.log('BallModal: оÑпÑавлÑем запÑÐ¾Ñ Ð½Ð° ÑÐ¾Ñ Ñанение, email:', email, 'U
1077RL:', baseUrl); 1078 1079 // ÐаменÑем ballmodal на ballsave 1080 var saveUrl = baseUrl.replace('ballmodal', 'ballsave'); 1081 1082 console.log('BallModal: оÑпÑавлÑем запÑÐ¾Ñ Ð½Ð° ÑÐ¾Ñ Ñанение'); 1083 1084 _jquery2.default.ajax({ 1085 cache: false, 1086 method: 'POST', 1087 url: saveUrl, 1088 data: { 1089 email: email 1090 }, 1091 dataType: 'json', 1092 contentType: 'application/x-www-form-urlencoded; charset=UTF-8' 1093 }).done(function (response, textStatus, xhr) { 1094 console.log('BallModal: ÑÑпеÑнÑй оÑÐ²ÐµÑ Ð¾Ñ ballsave', { response: response, textStatus: textStatus, xhr: xhr }); 1095 1096 // ÐÑовеÑÑем, ÑÑо оÑÐ²ÐµÑ ÑвлÑеÑÑÑ Ð¾Ð±ÑекÑом 1097 if ((typeof response === 'undefined' ? 'undefined' : _typeof(response)) !== 'object' || response === null) { 1098 console.error('Invalid response format:', response); 1099 alert('Ðомилка: некоÑекÑна вÑдповÑÐ´Ñ Ð²Ñд ÑеÑвеÑа'); 1100 return; 1101 } 1102 1103 if (response.success) { 1104 // ÐолÑÑаем пÑомокод из оÑвеÑа 1105 var promocode = response.promo || response.promocode || 'DOSTFREE'; 1106 console.log('BallModal: полÑÑен пÑомокод', promocode); 1107 1108 // ÐоказÑваем вÑоÑое модалÑное окно Ñ Ð¿Ñомокодом 1109 _this4.showModalStep2(promocode); 1110 1111 // УÑÑанавливаем cookie 1112 _cookieData2.default.add('show-ball-modal', false, { 1113 expires: 365, 1114 path: '/', 1115 SameSite: 'None', 1116 Secure: 'Secure' 1117 }); 1118 } else { 1119 var errorMsg = response.response || response.message || 'Ðомилка. СпÑобÑйÑе Ñе Ñаз.'; 1120 console.error('BallModal: оÑибка в оÑвеÑе', errorMsg); 1121 alert(errorMsg); 1122 } 1123 }).fail(function (xhr, status, error) { 1124 var _console$error; 1125 1126 console.error('BallModal: AJAX fail вÑзван', (_console$error = { 1127 status: xhr.status, 1128 statusText: xhr.statusText, 1129 readyState: xhr.readyState, 1130 responseText: xhr.responseText, 1131 responseJSON: xhr.responseJSON 1132 }, _defineProperty(_console$error, 'status', status), _defineProperty(_console$error, 'error', error), _console$error)); 1133 1134 var errorMsg = 'Ðомилка з\'ÑднаннÑ. СпÑобÑйÑе Ñе Ñаз.'; 1135 1136 // ÐÑли ÑÑаÑÑÑ 200, но попали в fail - возможно пÑоблема Ñ Ð¿Ð°ÑÑингом JSON 1137 if (xhr.status === 200) { 1138 console.warn('BallModal: ÑÑаÑÑÑ 200, но попали в fail - возможно пÑоблема Ñ JSON'); 1139 try { 1140 var response = typeof xhr.responseJSON !== 'undefined' ? xhr.responseJSON : JSON.parse(xhr.responseText); 1141 1142 if (response && response.success) { 1143 // ÐÑли оÑÐ²ÐµÑ ÑÑпеÑнÑй, обÑабаÑÑваем его 1144 var promocode = response.promo || response.promocode || 'DOSTFREE'; 1145 console.log('BallModal: обÑабаÑÑваем оÑÐ²ÐµÑ Ð¸Ð· fail (ÑÑаÑÑÑ 200)', promocode); 1146 _this4.showModalStep2(promocode); 1147 _cookieData2.default.add('show-ball-modal', false, { 1148 expires: 365, 1149 path: '/', 1150 SameSite: 'None', 1151 Secure: 'Secure' 1152 }); 1153 return; 1154 } else if (response && response.response) { 1155 errorMsg = response.response; 1156 } 1157 } catch (e) { 1158 console.error('BallModal: оÑибка паÑÑинга оÑвеÑа', e); 1159 errorMsg = 'Ðомилка: некоÑекÑна вÑдповÑÐ´Ñ Ð²Ñд ÑеÑвеÑа'; 1160 } 1161 } else { 1162 // ÐÑÑаемÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ ÑообÑение об оÑибке из оÑвеÑа 1163 if (xhr.responseJSON && xhr.responseJSON.response) { 1164 errorMsg = xhr.responseJSON.response; 1165 } else if (xhr.responseText) { 1166 try { 1167 var errorResponse = JSON.parse(xhr.responseText); 1168 if (errorResponse.response) { 1169 errorMsg = errorResponse.response; 1170 } 1171 } catch (e) { 1172 // ÐгноÑиÑÑем оÑÐ¸Ð±ÐºÑ Ð¿Ð°ÑÑинга 1173 } 1174 } 1175 } 1176 1177 alert(errorMsg); 1178 }); 1179 } 1180 1181 /** 1182 * ÐниÑиализаÑÐ¸Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸ копиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñомокода 1183 */ 1184 1185 }, { 1186 key: 'initCopyButton', 1187 value: function initCopyButton() { 1188 var copyBtn = document.querySelector('[data-copy-target]'); 1189 if (!copyBtn) { 1190 return; 1191 } 1192 1193 copyBtn.addEventListener('click', function (e) { 1194 e.preventDefault(); 1195 var targetSelector = copyBtn.getAttribute('data-copy-target');
1196 var targetInput = document.querySelector(targetSelector); 1197 1198 if (targetInput) { 1199 targetInput.select(); 1200 targetInput.setSelectionRange(0, 99999); // ÐÐ»Ñ Ð¼Ð¾Ð±Ð¸Ð»ÑнÑÑ ÑÑÑÑойÑÑв 1201 1202 try { 1203 document.execCommand('copy'); 1204 1205 // ÐизÑалÑÐ½Ð°Ñ Ð¾Ð±ÑаÑÐ½Ð°Ñ ÑвÑÐ·Ñ 1206 var originalText = copyBtn.textContent; 1207 copyBtn.textContent = 'СкопÑйовано!'; 1208 setTimeout(function () { 1209 copyBtn.textContent = originalText; 1210 }, 2000); 1211 } catch (err) { 1212 alert('Ðе вдалоÑÑ ÑкопÑÑваÑи пÑомокод'); 1213 } 1214 } 1215 }); 1216 } 1217 }]); 1218 1219 return BallModal; 1220}(); 1221 1222exports.default = BallModal; 1223 1224/***/ }), 1225
1226/***/ "./_HTML/src/js/_modules/catalog-search.js": 1227/*!*************************************************!*\ 1228 !*** ./_HTML/src/js/_modules/catalog-search.js ***! 1229 \*************************************************/ 1230/*! no static exports found */ 1231/***/ (function(module, exports, __webpack_require__) { 1232 1233"use strict"; 1234 1235 1236Object.defineProperty(exports, "__esModule", { 1237 value: true 1238}); 1239exports.refs = undefined; 1240 1241exports.default = function () { 1242 if (!refs.openBtn) { 1243 return; 1244 } 1245 1246 var handleSearchAutocomplete = function handleSearchAutocomplete(searchTerm) { 1247 refs.searchAllBtn.href = window.wezomConfig.search + '?q=' + encodeURI(searchTerm); 1248 $.ajax({ 1249 method: 'POST', 1250 url: window.wezomConfig.searchAutocomplete, 1251 data: { 1252 query: searchTerm 1253 } 1254 }).done(function (res) { 1255 if (res.success && res.items_markup) { 1256 refs.notFoundText.style.display = 'none'; 1257 refs.itemsList.innerHTML = res.items_markup; 1258 refs.itemsWrap.style.display = 'block'; 1259 return; 1260 } 1261 refs.itemsWrap.style.display = 'none'; 1262 refs.notFoundText.style.display = 'block'; 1263 }).fail(function (err) { 1264 refs.itemsWrap.style.display = 'none'; 1265 refs.notFoundText.style.display = 'block'; 1266 console.error(err.responseText); 1267 }); 1268 }; 1269 1270 var handleSearchInput = function handleSearchInput(e) { 1271 if (!e.target.value) { 1272 refs.itemsWrap.style.display = 'none'; 1273 refs.notFoundText.style.display = 'none'; 1274 return; 1275 } 1276 var searchTerm = e.target.value.trim().toLocaleLowerCase(); 1277 // console.log(searchTerm.replace(/^\w\s/gi, '')); 1278 if (!searchTerm) { 1279 e.target.value = ''; 1280 refs.itemsWrap.style.display = 'none'; 1281 refs.notFoundText.style.display = 'block'; 1282 return; 1283 } 1284 handleSearchAutocomplete(searchTerm); 1285 }; 1286 1287 refs.searchInput.addEventListener('input', (0, _lodash2.default)(handleSearchInput, 500)); 1288 1289 var handleEscClose = function handleEscClose(event) { 1290 if (event.code === 'Escape') { 1291 event.preventDefault(); 1292 if (document.querySelector('.mfp-ready') || !refs.menu.classList.contains('is-hidden')) { 1293 return; 1294 } 1295 window.removeEventListener('keydown', handleEscClose); 1296 if (refs.search.classList.contains('is-hidden')) { 1297 return; 1298 } 1299 toggleSearch(); 1300 } 1301 }; 1302 1303 var handleHotKeyPress = function handleHotKeyPress(event) { 1304 if ((event.ctrlKey || event.metaKey) && event.code === 'KeyK') { 1305 event.preventDefault(); 1306 if (document.querySelector('.mfp-ready') || !refs.menu.classList.contains('is-hidden')) { 1307 return; 1308 } 1309 window.removeEventListener('keydown', handleEscClose); 1310 toggleSearch(); 1311 } 1312 }; 1313 1314 var toggleSearch = function toggleSearch() { 1315 var isSearchOpen = refs.openBtn.getAttribute('aria-expanded') === 'true' || false; 1316 1317 if (!isSearchOpen) { 1318 refs.notFoundText.style.display = 'none'; 1319 // add close on Esc 1320 window.addEventListener('keydown', handleEscClose); 1321 window.setTimeout(function () { 1322 refs.searchInput.focus(); 1323 refs.searchInput.setSelectionRange(-1, -1); 1324 }, 200); 1325 1326 if (refs.searchInput.value) { 1327 handleSearchAutocomplete(refs.searchInput.value); 1328 } 1329 } 1330 1331 // show/hide search 1332 refs.openBtn.setAttribute('aria-expanded', !isSearchOpen); 1333 refs.search.classList.toggle('is-hidden'); 1334 1335 // lock/unlock window scroll 1336 (0, _mainMenu.toggleBodyScrollLock)(!isSearchOpen, refs.search); 1337 }; 1338 1339 refs.openBtn.addEventListener('click', toggleSearch); 1340 1341 refs.search.addEventListener('click', function (_ref) { 1342 var target = _ref.target; 1343 1344 if (target !== refs.search && target !== refs.closeBtn) { 1345 return; 1346 } 1347 toggleSearch(); 1348 }); 1349 1350 window.addEventListener('keydown', handleHotKeyPress); 1351}; 1352 1353var _lodash = __webpack_require__(/*! lodash.debounce */ "./node_modules/lodash.debounce/index.js"); 1354 1355var _lodash2 = _interopRequireDefault(_lodash); 1356 1357var _mainMenu = __webpack_require__(/*! ./main-menu */ "./_HTML/src/js/_modules/main-menu.js"); 1358 1359function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 1360 1361var refs = exports.refs = { 1362 body: document.body, 1363 menu: document.querySelector('.js-main-menu'), 1364 search: document.querySelector('.js-catalog-search'), 1365 searchInput: document.querySelector('.js-catalog-search-input'), 1366 openBtn: document.querySelector('.js-catalog-search-open'), 1367 closeBtn: document.querySelector('.js-catalog-search-close'), 1368 searchAllBtn: document.querySelector('.js-catalog-search-show-all'), 1369 itemsList: document.querySelector('.js-catalog-search-items-list'), 1370 itemsWrap: document.querySelector('.js-catalog-search-items-wrap'), 1371 notFoundText: document.querySelector('.js-catalog-search-not-found-text') 1372}; 1373 1374/***/ }), 1375
1376/***/ "./_HTML/src/js/_modules/click-trigger-for/index.js": 1377/*!**********************************************************!*\ 1378 !*** ./_HTML/src/js/_modules/click-trigger-for/index.js ***! 1379 \**********************************************************/ 1380/*! no static exports found */ 1381/***/ (function(module, exports, __webpack_require__) { 1382 1383"use strict"; 1384 1385'use strict'; 1386 1387/** 1388 * @module 1389 */ 1390 1391Object.defineProperty(exports, "__esModule", { 1392 value: true 1393}); 1394exports.clickTriggerFor = clickTriggerFor; 1395 1396var _jquery = __webpack_require__(/*! jquery */ "jquery"); 1397 1398var _jquery2 = _interopRequireDefault(_jquery); 1399 1400__webpack_require__(/*! custom-jquery-methods/fn/get-my-elements */ "./node_modules/custom-jquery-methods/fn/get-my-elements.js"); 1401 1402function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 1403 1404function clickTriggerFor() { 1405 (0, _jquery2.default)(document).on('click', '[data-click-trigger-for]', function () { 1406 var $this = (0, _jquery2.default)(this); 1407 var selector = $this.data('click-trigger-for'); 1408 var $for = $this.getMyElements('$for', selector); 1409 $for.click(); 1410 }); 1411} 1412 1413/***/ }), 1414
1415/***/ "./_HTML/src/js/_modules/cookie-data.js": 1416/*!**********************************************!*\ 1417 !*** ./_HTML/src/js/_modules/cookie-data.js ***! 1418 \**********************************************/ 1419/*! no static exports found */ 1420/***/ (function(module, exports, __webpack_require__) { 1421 1422"use strict"; 1423 1424 1425/** 1426 * ÐодÑÐ»Ñ Ð´Ð»Ñ ÑабоÑÑ Ñ ÐºÑки 1427 * @module 1428 */ 1429 1430// ---------------------------------------- 1431// Private 1432// ---------------------------------------- 1433 1434Object.defineProperty(exports, "__esModule", { 1435 value: true 1436}); 1437var _window = window, 1438 encoder = _window.encodeURIComponent, 1439 decoder = _window.decodeURIComponent; 1440 1441// ---------------------------------------- 1442// Public 1443// ---------------------------------------- 1444 1445/** 1446 * РабоÑа Ñ `document.cookie` 1447 * @namespace cookieData 1448 * @sourceCode 1449 */ 1450 1451var cookieData = { 1452 /** 1453 * Ðобавление запиÑи 1454 * @param {string} key 1455 * @param {*} value 1456 * @param {Object} [options={}] 1457 * @param {Date|number|string} [options.expires] 1458 * @param {string} [options.path] 1459 * @param {string} [options.domain] 1460 * @param {boolean} [options.secure] 1461 * @see {@link https://learn.javascript.ru/cookie#ÑÑнкÑиÑ-setcookie-name-value-options} 1462 * @sourceCode 1463 */ 1464 add: function add(key, value) { 1465 var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; 1466 1467 if (!this.allowUsage && key !== this.allowUsageKey) { 1468 console.warn('Cookie usage is disallowed!'); 1469 return false; 1470 } 1471 var expires = options.expires; 1472 1473 if (typeof expires === 'number' && expires) { 1474 var d = new Date(); 1475 d.setTime(d.getTime() + expires * 1000 * 60 * 60 * 24); 1476 expires = options.expires = d; 1477 } 1478 1479 if (expires && expires.toUTCString) { 1480 options.expires = expires.toUTCString(); 1481 } 1482 1483 value = encoder(value); 1484 var updatedCookie = key + '=' + value; 1485 1486 for (var propName in options) { 1487 updatedCookie += '; ' + propName; 1488 var propValue = options[propName]; 1489 if (propValue !== true) { 1490 updatedCookie += '=' + propValue; 1491 } 1492 } 1493 1494 document.cookie = updatedCookie; 1495 }, 1496 1497 1498 /** 1499 * ÐолÑÑение кÑки по клÑÑÑ 1500 * @param key 1501 * @return {string|undefined} 1502 * @see {@link https://learn.javascript.ru/cookie#ÑÑнкÑиÑ-getcookie-name} 1503 * @sourceCode 1504 */ 1505 receive: function receive(key) { 1506 var matches = document.cookie.match(new RegExp('(?:^|; )' + key.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + '=([^;]*)' // eslint-disable-line no-useless-escape 1507 )); 1508 return matches ? decoder(matches[1]) : undefined; 1509 }, 1510 1511 1512 /** 1513 * Удаление кÑки по клÑÑÑ 1514 * @param {string} key 1515 * @see {@link https://learn.javascript.ru/cookie#ÑÑнкÑиÑ-deletecookie-name} 1516 * @sourceCode 1517 */ 1518 delete: function _delete(key) { 1519 this.add(key, '', { expires: -1 }); 1520 }, 1521 1522 1523 /** 1524 * ÐадаÑÑ Ð²Ð¾Ð¿ÑÐ¾Ñ Ð¾ полÑзоваÑелÑÑком ÑоглаÑии иÑполÑÐ·Ð°Ð²Ð½Ð¸Ñ ÐºÑки 1525 * @return {boolean} 1526 * @sourceCode 1527 */ 1528 askUsage: function askUsage() { 1529 var _this = this; 1530 1531 if (this.allowUsage) { 1532 return false; 1533 } 1534 1535 this.$infoBlock = this.$infoBlock || $('[data-cookie-info]'); 1536 this.$infoButton = this.$infoButton || $('[data-cookie-submit]'); 1537 1538 if (this.$infoBlock.length && this.$infoButton.length) { 1539 var hiddenClass = 'is-hidden'; 1540 this.$infoButton.on('click', function () { 1541 _this.$infoBlock.addClass(hiddenClass);
1542 _this.add(_this.allowUsageKey, _this.allowUsageValue, { expires: 365, path: '/', SameSite: 'None', Secure: 'Secure' }); 1543 }); 1544 1545 window.setTimeout(function () { 1546 _this.$infoBlock.removeClass(hiddenClass); 1547 }, this.allowUsageDelay); 1548 return true; 1549 } 1550 }, 1551 1552 1553 /** 1554 * ÐÑовеÑка полÑзоваÑелÑÑкого ÑоглаÑÐ¸Ñ 1555 * на иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñайлов cookie 1556 * @return {boolean} 1557 * @protected 1558 * @sourceCode 1559 */ 1560 get allowUsage() { 1561 return this.receive(this.allowUsageKey) === this.allowUsageValue; 1562 }, 1563 1564 /** 1565 * ÐлÑÑ Ð¿ÑовеÑки полÑзоваÑелÑÑкого ÑоглаÑÐ¸Ñ 1566 * на иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñайлов cookie 1567 * @type {string} 1568 * @default 'allow-cookie-usage' 1569 * @protected 1570 * @sourceCode 1571 */ 1572 get allowUsageKey() { 1573 return 'allow-cookie-usage'; 1574 }, 1575 1576 /** 1577 * ÐнаÑение клÑÑа пÑовеÑки полÑзоваÑелÑÑкого ÑоглаÑÐ¸Ñ 1578 * на иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñайлов cookie 1579 * @type {string} 1580 * @default 'true' 1581 * @protected 1582 * @sourceCode 1583 */
1584 get allowUsageValue() { 1585 return 'true'; 1586 }, 1587 1588 /** 1589 * ÐадеÑжка (ms) Ð´Ð»Ñ Ð¿ÑовеÑки полÑзоваÑелÑÑкого ÑоглаÑÐ¸Ñ 1590 * на иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñайлов cookie 1591 * @type {number} 1592 * @default 2000 1593 * @protected 1594 * @sourceCode 1595 */ 1596 get allowUsageDelay() { 1597 return 2000; 1598 } 1599}; 1600 1601// ---------------------------------------- 1602// Exports 1603// ---------------------------------------- 1604 1605exports.default = cookieData; 1606 1607/***/ }), 1608
1609/***/ "./_HTML/src/js/_modules/ecommerce-tracking.js": 1610/*!*****************************************************!*\ 1611 !*** ./_HTML/src/js/_modules/ecommerce-tracking.js ***! 1612 \*****************************************************/ 1613/*! no static exports found */ 1614/***/ (function(module, exports, __webpack_require__) { 1615 1616"use strict"; 1617/* eslint-disable no-useless-escape */ 1618 1619 1620/** 1621 * Ecommerce Tracking 1622 * @module 1623 */ 1624 1625// ---------------------------------------- 1626// Imports 1627// ---------------------------------------- 1628 1629Object.defineProperty(exports, "__esModule", { 1630 value: true 1631}); 1632 1633var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); 1634 1635function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 1636 1637var EcommerceTracking = function () { 1638 function EcommerceTracking() { 1639 _classCallCheck(this, EcommerceTracking); 1640 1641 this.itemBrand = 'УманÑпиво'; 1642 this.currency = 'UAH'; 1643 } 1644 1645 /** 1646 * Clear the previous ecommerce object. 1647 */ 1648 1649 1650 _createClass(EcommerceTracking, [{ 1651 key: 'clear', 1652 value: function clear() { 1653 window.dataLayer.push({ ecommerce: null }); 1654 } 1655 }, { 1656 key: 'trackFormSubmit', 1657 value: function trackFormSubmit(event) { 1658 window.dataLayer.push({ 1659 event: event 1660 }); 1661 } 1662 }, { 1663 key: 'trackViewItem', 1664 value: function trackViewItem(productData) { 1665 if (!productData) return; 1666 productData.item_brand = this.itemBrand; 1667 productData.currency = this.currency; 1668 this.clear(); 1669 window.dataLayer.push({ 1670 event: 'view_item', 1671 ecommerce: { 1672 items: [productData] 1673 } 1674 }); 1675 } 1676 }, { 1677 key: 'trackCartItem', 1678 value: function trackCartItem(event, productData) { 1679 var _this = this; 1680 1681 var quantity = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1; 1682 1683 if (!productData) return; 1684 1685 var items = Array.isArray(productData) ? productData : [productData]; 1686 var value = 0; 1687 1688 items.forEach(function (item) { 1689 item.item_brand = _this.itemBrand; 1690 item.quantity = item.quantity ? parseInt(item.quantity) * quantity : quantity; 1691 value += item.price * item.quantity; 1692 }); 1693 1694 this.clear(); 1695 1696 var pushData = { 1697 event: event, 1698 ecommerce: { 1699 value: value, 1700 currency: this.currency, 1701 items: items 1702 } 1703 }; 1704 1705 window.dataLayer.push(pushData); 1706 } 1707 }, { 1708 key: 'trackBeginCheckout', 1709 value: function trackBeginCheckout(amount, items) { 1710 var _this2 = this; 1711 1712 if (!amount || !items) return; 1713 1714 // Ensure items is an array 1715 var itemsArray = Array.isArray(items) ? items : Object.values(items); 1716 1717 if (!itemsArray.length) return; 1718 1719 itemsArray.forEach(function (item) { 1720 item.item_brand = _this2.itemBrand; 1721 }); 1722 1723 this.clear(); 1724 1725 var pushData = { 1726 event: 'begin_checkout', 1727 ecommerce: { 1728 value: parseFloat(amount), 1729 currency: this.currency, 1730 items: itemsArray 1731 } 1732 }; 1733 1734 window.dataLayer.push(pushData); 1735 } 1736 }, { 1737 key: 'trackPurchase', 1738 value: function trackPurchase(order) { 1739 var _this3 = this; 1740 1741 if (!order) return; 1742 1743 var orderId = order.order_id, 1744 amount = order.amount, 1745 deliveryType = order.delivery_type, 1746 _order$coupon = order.coupon, 1747 coupon = _order$coupon === undefined ? null : _order$coupon, 1748 items = order.items; 1749 1750 1751 if (!items) return; 1752 1753 // Ensure items is an array 1754 var itemsArray = Array.isArray(items) ? items : Object.values(items); 1755 1756 if (!itemsArray.length) return; 1757 1758 itemsArray.forEach(function (item) { 1759 item.item_brand = _this3.itemBrand; 1760 }); 1761 1762 this.clear(); 1763 1764 var pushData = { 1765 event: 'purchase', 1766 ecommerce: { 1767 transaction_id: orderId, 1768 value: parseFloat(amount), 1769 currency: this.currency, 1770 delivery_type: deliveryType, 1771 items: itemsArray 1772 } 1773 }; 1774 1775 if (coupon) {
1776 pushData.ecommerce.coupon = coupon; 1777 } 1778 1779 window.dataLayer.push(pushData); 1780 } 1781 }]); 1782 1783 return EcommerceTracking; 1784}(); 1785 1786exports.default = new EcommerceTracking(); 1787 1788/***/ }), 1789
1790/***/ "./_HTML/src/js/_modules/equal-height.js": 1791/*!***********************************************!*\ 1792 !*** ./_HTML/src/js/_modules/equal-height.js ***! 1793 \***********************************************/ 1794/*! no static exports found */ 1795/***/ (function(module, exports, __webpack_require__) { 1796 1797"use strict"; 1798 1799 1800Object.defineProperty(exports, "__esModule", { 1801 value: true 1802}); 1803 1804var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); 1805 1806function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 1807 1808// list of elements 1809var equalHeightsElements = ['.slider-products .slider-reviews__item__name']; 1810 1811var EqualHeight = function () { 1812 function EqualHeight() { 1813 _classCallCheck(this, EqualHeight); 1814 } 1815 1816 _createClass(EqualHeight, [{ 1817 key: 'init', 1818 value: function init() { 1819 equalHeightsElements.forEach(function (item) { 1820 // console.log(item); 1821 var itemElement = $(item); 1822 if (itemElement.length) { 1823 itemElement.equalHeights(); 1824 } 1825 }); 1826 } 1827 }]); 1828 1829 return EqualHeight; 1830}(); 1831 1832exports.default = new EqualHeight(); 1833 1834/***/ }), 1835
1836/***/ "./_HTML/src/js/_modules/lazyload/index.js": 1837/*!*************************************************!*\ 1838 !*** ./_HTML/src/js/_modules/lazyload/index.js ***! 1839 \*************************************************/ 1840/*! no static exports found */ 1841/***/ (function(module, exports, __webpack_require__) { 1842 1843"use strict"; 1844 1845 1846/** 1847 * 1848 * @module 1849 */ 1850 1851// ---------------------------------------- 1852// Imports 1853// ---------------------------------------- 1854 1855Object.defineProperty(exports, "__esModule", { 1856 value: true 1857}); 1858exports.selector = undefined; 1859exports.lazyload = lazyload; 1860 1861var _modernizr = __webpack_require__(/*! modernizr */ "./.modernizrrc"); 1862 1863var _modernizr2 = _interopRequireDefault(_modernizr); 1864 1865function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 1866 1867// ---------------------------------------- 1868// Public 1869// ---------------------------------------- 1870 1871/** 1872 * @type {string} 1873 */ 1874var selector = exports.selector = '.js-lazyload'; 1875 1876/** 1877 * @param {string|NodeList} selectorOrNodeList 1878 * @property {selector} 1879 * @return {Promise<any>} 1880 */ 1881function lazyload() { 1882 var selectorOrNodeList = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : selector; 1883 var option = arguments[1]; 1884 1885 return new Promise(function (resolve, reject) { 1886 var _initialize = function _initialize(_ref) { 1887 var zzLoad = _ref.default; 1888 1889 resolve(zzLoad(selectorOrNodeList, option)); 1890 }; 1891 1892 if (_modernizr2.default.intersectionobserver) { 1893 __webpack_require__.e(/*! import() */ 34).then(__webpack_require__.bind(null, /*! zz-load */ "./node_modules/zz-load/zz-load.es.js")).then(_initialize); 1894 } else { 1895 __webpack_require__.e(/*! import() */ 41).then(__webpack_require__.t.bind(null, /*! intersection-observer */ "./node_modules/intersection-observer/intersection-observer.js", 7)).then(function () { 1896 __webpack_require__.e(/*! import() */ 34).then(__webpack_require__.bind(null, /*! zz-load */ "./node_modules/zz-load/zz-load.es.js")).then(_initialize); 1897 }); 1898 } 1899 }); 1900} 1901 1902/***/ }), 1903
1904/***/ "./_HTML/src/js/_modules/main-menu.js": 1905/*!********************************************!*\ 1906 !*** ./_HTML/src/js/_modules/main-menu.js ***! 1907 \********************************************/ 1908/*! no static exports found */ 1909/***/ (function(module, exports, __webpack_require__) { 1910 1911"use strict"; 1912 1913 1914Object.defineProperty(exports, "__esModule", { 1915 value: true 1916}); 1917exports.toggleBodyScrollLock = exports.toggleFixedElementsOffset = exports.isIOS = exports.getBrwoserScrollbarWidth = exports.refs = undefined; 1918 1919exports.default = function () { 1920 if (!refs.openBtn) { 1921 return; 1922 } 1923 1924 var handleEscClose = function handleEscClose(event) { 1925 if (event.code === 'Escape') { 1926 event.preventDefault(); 1927 window.removeEventListener('keydown', handleEscClose); 1928 if (document.querySelector('.js-main-menu').classList.contains('is-hidden')) { 1929 return; 1930 } 1931 toggleMenu(); 1932 } 1933 }; 1934 1935 var toggleMenu = function toggleMenu() { 1936 var isMenuOpen = refs.openBtn.getAttribute('aria-expanded') === 'true' || false; 1937 1938 // show/hide menu 1939 refs.openBtn.setAttribute('aria-expanded', !isMenuOpen); 1940 refs.menu.classList.toggle('is-hidden'); 1941 1942 // lock/unlock window scroll 1943 toggleBodyScrollLock(!isMenuOpen, refs.menu.querySelector('.main-menu__body')); 1944 1945 // add close on Esc 1946 !isMenuOpen && window.addEventListener('keydown', handleEscClose); 1947 }; 1948 1949 refs.openBtn.addEventListener('click', toggleMenu); 1950 if (refs.openMobileBtn) { 1951 refs.openMobileBtn.addEventListener('click', toggleMenu); 1952 } 1953 refs.menu.addEventListener('click', function (_ref) { 1954 var target = _ref.target; 1955 1956 if (target !== refs.menu && target !== refs.closeBtn) { 1957 return; 1958 } 1959 toggleMenu(); 1960 }); 1961}; 1962 1963var _bodyScrollLock = __webpack_require__(/*! body-scroll-lock */ "./node_modules/body-scroll-lock/lib/bodyScrollLock.esm.js"); 1964 1965var refs = exports.refs = { 1966 body: document.body, 1967 fixedElements: document.querySelectorAll('[data-fixed]'), 1968 menu: document.querySelector('.js-main-menu'), 1969 openBtn: document.querySelector('.js-main-menu-open'), 1970 closeBtn: document.querySelector('.js-main-menu-close'), 1971 openMobileBtn: document.querySelector('.js-main-mobile-menu-open') 1972}; 1973 1974/** 1975 * Retrieves the width of the browser's scrollbar. 1976 * @returns {number} The width of the scrollbar in pixels. 1977 */ 1978var getBrwoserScrollbarWidth = exports.getBrwoserScrollbarWidth = function getBrwoserScrollbarWidth() { 1979 return window.innerWidth - document.documentElement.clientWidth; 1980}; 1981 1982var isIOS = exports.isIOS = function isIOS() { 1983 return 'ontouchstart' in window || navigator.MaxTouchPoints > 0 || navigator.msMaxTouchPoints > 0; 1984}; 1985 1986/** 1987 * Sets the right offset value for a fixed elements. 1988 * @param {string} value - The value to set as the right offset. 1989 */ 1990var toggleFixedElementsOffset = exports.toggleFixedElementsOffset = function toggleFixedElementsOffset(value) { 1991 refs.fixedElements.forEach(function (element) { 1992 element.style.paddingRight = value; 1993 }); 1994}; 1995 1996/** 1997 * Toggles the body scroll lock on or off without breaking scrolling of a specific target element. 1998 * Also adjusts the body and fixed header offsets accordingly. 1999 * @param {boolean} on - Whether to enable or disable the scroll lock. 2000 * @param {HTMLElement} targetRef - The reference to the target element that you want to persist scrolling for (such as a modal/lightbox/flyout/nav). 2001 */ 2002var toggleBodyScrollLock = exports.toggleBodyScrollLock = function toggleBodyScrollLock(on, targetRef) { 2003 // fix body & fixed header offsets 2004 var scrollBarWidth = on ? getBrwoserScrollbarWidth() + 'px' : 0; 2005 refs.body.style.paddingRight = scrollBarWidth; 2006 toggleFixedElementsOffset(scrollBarWidth); 2007 2008 // lock/unlock window scroll 2009 if (!isIOS()) { 2010 on ? (0, _bodyScrollLock.disableBodyScroll)(targetRef) : (0, _bodyScrollLock.enableBodyScroll)(targetRef); 2011 return; 2012 } 2013 2014 document.body.style.overflow = on ? 'hidden' : ''; 2015}; 2016 2017/***/ }), 2018
2019/***/ "./_HTML/src/js/_modules/modernizr/custom-tests/edge.js": 2020/*!**************************************************************!*\ 2021 !*** ./_HTML/src/js/_modules/modernizr/custom-tests/edge.js ***! 2022 \**************************************************************/ 2023/*! no static exports found */ 2024/***/ (function(module, exports, __webpack_require__) { 2025 2026"use strict"; 2027 2028 2029/** 2030 * @module 2031 */ 2032 2033// ---------------------------------------- 2034// Imports 2035// ---------------------------------------- 2036 2037var _modernizr = __webpack_require__(/*! modernizr */ "./.modernizrrc"); 2038 2039var _modernizr2 = _interopRequireDefault(_modernizr); 2040 2041function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 2042 2043// ---------------------------------------- 2044// Public 2045// ---------------------------------------- 2046 2047_modernizr2.default.addTest('edge', / edge\//i.test(window.navigator.userAgent)); 2048 2049/***/ }), 2050
2051/***/ "./_HTML/src/js/_modules/modernizr/custom-tests/intersection-observer.js": 2052/*!*******************************************************************************!*\ 2053 !*** ./_HTML/src/js/_modules/modernizr/custom-tests/intersection-observer.js ***! 2054 \*******************************************************************************/ 2055/*! no static exports found */ 2056/***/ (function(module, exports, __webpack_require__) { 2057 2058"use strict"; 2059 2060 2061/** 2062 * @module 2063 */ 2064 2065// ---------------------------------------- 2066// Imports 2067// ---------------------------------------- 2068 2069var _modernizr = __webpack_require__(/*! modernizr */ "./.modernizrrc"); 2070 2071var _modernizr2 = _interopRequireDefault(_modernizr); 2072 2073function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 2074 2075// ---------------------------------------- 2076// Public 2077// ---------------------------------------- 2078 2079_modernizr2.default.addTest('intersectionobserver', 'IntersectionObserver' in window); 2080 2081/***/ }), 2082
2083/***/ "./_HTML/src/js/_modules/modernizr/index.js": 2084/*!**************************************************!*\ 2085 !*** ./_HTML/src/js/_modules/modernizr/index.js ***! 2086 \**************************************************/ 2087/*! no static exports found */ 2088/***/ (function(module, exports, __webpack_require__) { 2089 2090"use strict"; 2091 2092 2093/** 2094 * ÐаÑÑомнÑе ÑеÑÑÑ Ð´Ð»Ñ Modernizr 2095 * @module 2096 * @author Oleg Dutchenko <[email protected]> 2097 * @version 1.0.0 2098 */ 2099 2100// ---------------------------------------- 2101// Imports 2102// ---------------------------------------- 2103 2104var _modernizr = __webpack_require__(/*! modernizr */ "./.modernizrrc"); 2105 2106var _modernizr2 = _interopRequireDefault(_modernizr); 2107 2108__webpack_require__(/*! ./custom-tests/intersection-observer */ "./_HTML/src/js/_modules/modernizr/custom-tests/intersection-observer.js"); 2109 2110__webpack_require__(/*! ./custom-tests/edge */ "./_HTML/src/js/_modules/modernizr/custom-tests/edge.js"); 2111 2112function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 2113 2114// import './custom-tests/mix-blend-mode'; 2115 2116// ---------------------------------------- 2117// Public 2118// ---------------------------------------- 2119 2120window.Modernizr = _modernizr2.default; 2121 2122/***/ }), 2123
2124/***/ "./_HTML/src/js/_modules/products-filter/index.js": 2125/*!********************************************************!*\ 2126 !*** ./_HTML/src/js/_modules/products-filter/index.js ***! 2127 \********************************************************/ 2128/*! no static exports found */ 2129/***/ (function(module, exports, __webpack_require__) { 2130 2131"use strict"; 2132 2133 2134Object.defineProperty(exports, "__esModule", { 2135 value: true 2136}); 2137 2138var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); 2139 2140var _nouislider = __webpack_require__(/*! nouislider */ "./node_modules/nouislider/dist/nouislider.mjs"); 2141 2142var _nouislider2 = _interopRequireDefault(_nouislider); 2143 2144var _numeral = __webpack_require__(/*! numeral */ "./node_modules/numeral/numeral.js"); 2145 2146var _numeral2 = _interopRequireDefault(_numeral); 2147 2148function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 2149 2150function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 2151 2152var $ = window.jQuery; 2153 2154var _class = function () { 2155 function _class() { 2156 _classCallCheck(this, _class); 2157 2158 this.data = { 2159 elms: { 2160 filterParent: '#product-filter', 2161 sliderElm: '#product-filter__price-slider', 2162 minElm: '#product-filter__price-min', 2163 maxElm: '#product-filter__price-max' 2164 }, 2165 values: { 2166 min: 0, 2167 max: 0, 2168 currentMin: 0, 2169 currentMax: 0 2170 }, 2171 decimals: 2 2172 }; 2173 } 2174 2175 _createClass(_class, [{ 2176 key: 'init', 2177 value: function init() { 2178 if (this.isEnabled()) { 2179 this.prepareValues(); 2180 this.bind(); 2181 this.initSlider(); 2182 } 2183 } 2184 }, { 2185 key: 'isEnabled', 2186 value: function isEnabled() { 2187 return $(this.data.elms.filterParent).length; 2188 } 2189 }, { 2190 key: 'prepareValues', 2191 value: function prepareValues() { 2192 var _t = this; 2193 var _e = _t.data.elms; 2194 var _v = _t.data.values; 2195 // Elms 2196 var slider = $(_e.sliderElm); 2197 var minValue = $(_e.minElm); 2198 var maxValue = $(_e.maxElm); 2199 // Values 2200 _v.min = Number(slider.data('min')); 2201 _v.max = Number(slider.data('max')); 2202 _v.currentMin = Number(minValue.val()); 2203 _v.currentMax = Number(maxValue.val()); 2204 } 2205 }, { 2206 key: 'initSlider', 2207 value: function initSlider() { 2208 var _t = this; 2209 var _e = _t.data.elms; 2210 var _v = _t.data.values; 2211 var min = parseFloat(_v.min); 2212 var max = parseFloat(_v.max); 2213 var minStart = parseFloat(_v.currentMin); 2214 var maxStart = parseFloat(_v.currentMax); 2215 var decimals = 0; 2216 var formatSlide = void 0; 2217 2218 // Decimal 2219 if (/\./.test(min) || /\./.test(max)) { 2220 decimals = Math.max(min.toString().replace(/^\d+(\.|$)/, '').length, max.toString().replace(/^\d+(\.|$)/, '').length); 2221 } 2222 2223 if (decimals > 2) { 2224 decimals = 2; 2225 } 2226 2227 formatSlide = { 2228 to: function to(v, h, r) { 2229 var format = '(0'; 2230 if (v < 100 && decimals) { 2231 format += '.' + '0'.repeat(decimals); 2232 } else if (v > 1000) { 2233 format += '.0'; 2234 } 2235 format += ' a)'; 2236 2237 return v > 1000 ? (0, _numeral2.default)(v).format(format) : v.toFixed(decimals); 2238 }, 2239 from: function from(v) { 2240 return v; 2241 } 2242 }; 2243 2244 var sliderOptions = { 2245 animate: false, 2246 behaviour: 'snap', 2247 connect: true, 2248 format: formatSlide, 2249 cssPrefix: 'products-slider__noUi-', 2250 start: [minStart, maxStart], 2251 range: { 2252 'min': min, 2253 'max': max 2254 }, 2255 pips: { 2256 mode: 'range', 2257 density: 4 2258 } 2259 }; 2260 2261 // Create, Update 2262 var slider = document.getElementById(_e.sliderElm.substring(1)); 2263 2264 if (slider.hasOwnProperty('noUiSlider')) { 2265 slider.noUiSlider.updateOptions(sliderOptions, false); 2266 2267 return true; 2268 } 2269 2270 _nouislider2.default.create(slider, sliderOptions); 2271 2272 slider.noUiSlider.on('update', function (formatted, handle, values, tap, positions, sliderObj) { 2273 _v.currentMin = values[0].toFixed(_t.data.decimals); 2274 _v.currentMax = values[1].toFixed(_t.data.decimals); 2275 _t.setValues(); 2276 }); 2277 2278 slider.noUiSlider.on('set', function (formatted, handle, values, tap, positions, sliderObj) { 2279 _v.currentMin = values[0].toFixed(_t.data.decimals); 2280 _v.currentMax = values[1].toFixed(_t.data.decimals); 2281 _t.setValues(); 2282 }); 2283 } 2284 }, { 2285 key: 'bind', 2286 value: function bind() { 2287 var _t = this; 2288 var _e = _t.data.elms; 2289 var _v = _t.data.values; 2290 2291 $(document).on('change', _e.minElm, function (e) { 2292 e.preventDefault(); 2293 _v.currentMin = parseFloat($(this).val()).toFixed(_t.data.decimals); 2294 _t.setSilder(); 2295 }); 2296 2297 $(document).on('change', _e.maxElm, function (e) { 2298 e.preventDefault(); 2299 _v.currentMax = parseFloat($(this).val()).toFixed(_t.data.decimals); 2300 _t.setSilder(); 2301 }); 2302 } 2303 }, { 2304 key: 'setSilder', 2305 value: function setSilder() { 2306 var slider = document.getElementById(this.data.elms.sliderElm.substring(1)); 2307 slider.noUiSlider.set([this.data.values.currentMin, this.data.values.currentMax]); 2308 } 2309 }, { 2310 key: 'setValues', 2311 value: function setValues() { 2312 var _t = this; 2313 var _e = _t.data.elms; 2314 var _v = _t.data.values; 2315 2316 var minValue = (Math.round(parseFloat(_v.currentMin) * 100) / 100).toFixed(_t.data.decimals); 2317 if (minValue < _v.min) { 2318 minValue = _v.min; 2319 } 2320 $(_e.minElm).val(minValue); 2321 2322 var maxValue = (Math.round(parseFloat(_v.currentMax) * 100) / 100).toFixed(_t.data.decimals); 2323 if (maxValue > _v.max) { 2324 maxValue = _v.max; 2325 } 2326 $(_e.maxElm).val(maxValue); 2327 } 2328 }]); 2329 2330 return _class; 2331}(); 2332 2333exports.default = _class; 2334; 2335 2336/***/ }), 2337
2338/***/ "./_HTML/src/js/_modules/utm-tracking.js": 2339/*!***********************************************!*\ 2340 !*** ./_HTML/src/js/_modules/utm-tracking.js ***! 2341 \***********************************************/ 2342/*! no static exports found */ 2343/***/ (function(module, exports, __webpack_require__) { 2344 2345"use strict"; 2346/* eslint-disable no-useless-escape */ 2347 2348 2349/** 2350 * UTM TRACKING 2351 * @module 2352 */ 2353 2354// ---------------------------------------- 2355// Imports 2356// ---------------------------------------- 2357 2358Object.defineProperty(exports, "__esModule", { 2359 value: true 2360}); 2361 2362var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); 2363 2364var _cookieData = __webpack_require__(/*! ./cookie-data */ "./_HTML/src/js/_modules/cookie-data.js"); 2365 2366var _cookieData2 = _interopRequireDefault(_cookieData); 2367 2368function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 2369 2370function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 2371 2372var UtmTracking = function () { 2373 function UtmTracking() { 2374 _classCallCheck(this, UtmTracking); 2375 2376 // Get the URL parameters variable by UTM names 2377 this.source = this.getParameterByName('utm_source'); 2378 this.medium = this.getParameterByName('utm_medium'); 2379 this.campaign = this.getParameterByName('utm_campaign'); 2380 this.content = this.getParameterByName('utm_content'); 2381 this.term = this.getParameterByName('utm_term'); 2382 } 2383 2384 _createClass(UtmTracking, [{ 2385 key: 'init', 2386 value: function init() { 2387 // Do the Set UTM function for each UTM 2388 this.setUtm('utm_source', this.source); 2389 this.setUtm('utm_medium', this.medium); 2390 this.setUtm('utm_campaign', this.campaign); 2391 this.setUtm('utm_content', this.content); 2392 this.setUtm('utm_term', this.term); 2393 } 2394 2395 // Parse the URL 2396 2397 }, { 2398 key: 'getParameterByName', 2399 value: function getParameterByName(name) { 2400 name = name.replace(/[\[]/, '\[').replace(/[\]]/, '\]'); 2401 var regex = new RegExp('[\?&]' + name + '=([^&#]*)'); 2402 var results = regex.exec(window.location.search); 2403 return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' ')); 2404 } 2405 2406 // Set UTM function 2407 2408 }, { 2409 key: 'setUtm', 2410 value: function setUtm(utmParam, utmVal) { 2411 if (utmVal === '') { 2412 return; 2413 }; 2414 // TODO: determine the max expiring time or clear after ordering 2415 _cookieData2.default.add(utmParam, utmVal, { expires: 365, path: '/', SameSite: 'None', Secure: 'Secure' }); 2416 } 2417 }]); 2418 2419 return UtmTracking; 2420}(); 2421 2422exports.default = new UtmTracking(); 2423 2424/***/ }), 2425
2426/***/ "./_HTML/src/js/_polyfills/mdn.js": 2427/*!****************************************!*\ 2428 !*** ./_HTML/src/js/_polyfills/mdn.js ***! 2429 \****************************************/ 2430/*! no static exports found */ 2431/***/ (function(module, exports, __webpack_require__) { 2432 2433"use strict"; 2434 2435 2436/** 2437 * @module 2438 */ 2439 2440// ---------------------------------------- 2441// Imports 2442// ---------------------------------------- 2443 2444__webpack_require__(/*! mdn-polyfills/src/Object.assign */ "./node_modules/mdn-polyfills/src/Object.assign/index.js"); 2445 2446/***/ }), 2447
2448/***/ "./_HTML/src/js/_polyfills/promise-polyfill.js": 2449/*!*****************************************************!*\ 2450 !*** ./_HTML/src/js/_polyfills/promise-polyfill.js ***! 2451 \*****************************************************/ 2452/*! no static exports found */ 2453/***/ (function(module, exports, __webpack_require__) { 2454 2455"use strict"; 2456 2457 2458/** 2459 * ÐолиÑил Ð´Ð»Ñ IE, Edge и дÑÑÐ³Ð¸Ñ Ð±ÑаÑзеÑов 2460 * коÑоÑÑе не имеÑÑ Ð½Ð°ÑивнÑÑ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶ÐºÑ Promise 2461 * @see {@link https://www.npmjs.com/package/es6-promise-polyfill} 2462 * @module 2463 */ 2464 2465// ---------------------------------------- 2466// Imports 2467// ---------------------------------------- 2468 2469var _es6PromisePolyfill = __webpack_require__(/*! es6-promise-polyfill */ "./node_modules/es6-promise-polyfill/promise.js"); 2470 2471// ---------------------------------------- 2472// Public 2473// ---------------------------------------- 2474 2475window.Promise = window.Promise || _es6PromisePolyfill.Promise; 2476 2477/***/ }), 2478
vendor: 2,017 bytes, lines 2479-2530
2479/***/ "./_HTML/src/js/_vendors/dynamicAdapt.js": 2480/*!***********************************************!*\ 2481 !*** ./_HTML/src/js/_vendors/dynamicAdapt.js ***! 2482 \***********************************************/ 2483/*! no static exports found */ 2484/***/ (function(module, exports, __webpack_require__) { 2485 2486"use strict"; 2487 2488 2489Object.defineProperty(exports, "__esModule", { 2490 value: true 2491}); 2492 2493var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); 2494 2495exports.useDynamicAdapt = useDynamicAdapt; 2496 2497function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } 2498 2499/** 2500 * @typedef {Object} dNode 2501 * @property {HTMLElement} parent 2502 * @property {HTMLElement} element 2503 * @property {HTMLElement} to 2504 * @property {string} breakpoint 2505 * @property {string} order 2506 * @property {number} index 2507 */ 2508 2509/** 2510 * @typedef {Object} dMediaQuery 2511 * @property {string} query 2512 * @property {number} breakpoint 2513 */ 2514 2515/** 2516 * @param {'min' | 'max'} type 2517 */ 2518function useDynamicAdapt() { 2519 var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'max'; 2520 2521 var className = '_dynamic_adapt_'; 2522 var attrName = 'data-da'; 2523 2524 /** @type {dNode[]} */ 2525 var dNodes = getDNodes(); 2526 2527 /** @type {dMediaQuery[]} */ 2528 var dMediaQueries = getDMediaQueries(dNodes); 2529 2530 dMediaQueries.forEach(function (dMediaQuery) {
2531 var matchMedia = window.matchMedia(dMediaQuery.query); 2532 // маÑÑив обÑекÑов Ñ Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑим бÑейкпоинÑом 2533 var filteredDNodes = dNodes.filter(function (_ref) { 2534 var breakpoint = _ref.breakpoint; 2535 return breakpoint === dMediaQuery.breakpoint; 2536 }); 2537 var mediaHandler = getMediaHandler(matchMedia, filteredDNodes); 2538 matchMedia.addEventListener('change', mediaHandler); 2539 2540 mediaHandler(); 2541 }); 2542 2543 function getDNodes() { 2544 var result = []; 2545 var elements = [].concat(_toConsumableArray(document.querySelectorAll('[' + attrName + ']'))); 2546 2547 elements.forEach(function (element) { 2548 var attr = element.getAttribute(attrName); 2549 2550 var _attr$split$map = attr.split(',').map(function (val) { 2551 return val.trim(); 2552 }), 2553 _attr$split$map2 = _slicedToArray(_attr$split$map, 3), 2554 toSelector = _attr$split$map2[0], 2555 breakpoint = _attr$split$map2[1], 2556 order = _attr$split$map2[2]; 2557 2558 var to = document.querySelector(toSelector); 2559 2560 if (to) { 2561 result.push({ 2562 parent: element.parentElement, 2563 element: element, 2564 to: to, 2565 breakpoint: breakpoint ? breakpoint : '767', 2566 order: order !== undefined ? isNumber(order) ? Number(order) : order : 'last', 2567 index: -1 2568 }); 2569 } 2570 }); 2571 2572 return sortDNodes(result); 2573 } 2574 2575 /** 2576 * @param {dNode} items 2577 * @returns {dMediaQuery[]} 2578 */ 2579 function getDMediaQueries(items) { 2580 var uniqItems = [].concat(_toConsumableArray(new Set(items.map(function (_ref2) { 2581 var breakpoint = _ref2.breakpoint; 2582 return '(' + type + '-width: ' + breakpoint + 'px),' + breakpoint; 2583 })))); 2584 2585 return uniqItems.map(function (item) { 2586 var _item$split = item.split(','), 2587 _item$split2 = _slicedToArray(_item$split, 2), 2588 query = _item$split2[0], 2589 breakpoint = _item$split2[1]; 2590 2591 return { query: query, breakpoint: breakpoint }; 2592 }); 2593 } 2594 2595 /** 2596 * @param {MediaQueryList} matchMedia 2597 * @param {dNodes} items 2598 */ 2599 function getMediaHandler(matchMedia, items) { 2600 return function mediaHandler() { 2601 if (matchMedia.matches) { 2602 items.forEach(function (item) { 2603 moveTo(item); 2604 }); 2605 2606 items.reverse(); 2607 } else { 2608 items.forEach(function (item) { 2609 if (item.element.classList.contains(className)) { 2610 moveBack(item); 2611 } 2612 }); 2613 2614 items.reverse(); 2615 } 2616 }; 2617 } 2618 2619 /** 2620 * @param {dNode} dNode 2621 */ 2622 function moveTo(dNode) { 2623 var to = dNode.to, 2624 element = dNode.element, 2625 order = dNode.order; 2626 2627 dNode.index = getIndexInParent(dNode.element, dNode.element.parentElement); 2628 element.classList.add(className); 2629 2630 if (order === 'last' || order >= to.children.length) { 2631 to.append(element); 2632 2633 return; 2634 } 2635 2636 if (order === 'first') { 2637 to.prepend(element); 2638 2639 return; 2640 } 2641 2642 to.children[order].before(element); 2643 } 2644 2645 /** 2646 * @param {dNode} dNode 2647 */ 2648 function moveBack(dNode) { 2649 var parent = dNode.parent, 2650 element = dNode.element, 2651 index = dNode.index; 2652 2653 element.classList.remove(className); 2654 2655 if (index >= 0 && parent.children[index]) { 2656 parent.children[index].before(element); 2657 } else { 2658 parent.append(element); 2659 } 2660 } 2661 2662 /** 2663 * @param {HTMLElement} element 2664 * @param {HTMLElement} parent 2665 */ 2666 function getIndexInParent(element, parent) { 2667 return [].concat(_toConsumableArray(parent.children)).indexOf(element); 2668 } 2669 2670 /** 2671 * ФÑнкÑÐ¸Ñ ÑоÑÑиÑовки маÑÑива по breakpoint и order 2672 * по возÑаÑÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ type = min 2673 * по ÑбÑÐ²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ type = max 2674 * 2675 * @param {dNode[]} items 2676 */ 2677 function sortDNodes(items) { 2678 var isMin = type === 'min' ? 1 : 0; 2679 2680 return [].concat(_toConsumableArray(items)).sort(function (a, b) { 2681 if (a.breakpoint === b.breakpoint) { 2682 if (a.order === b.order) { 2683 return 0; 2684 } 2685 2686 if (a.order === 'first' || b.order === 'last') { 2687 return -1 * isMin; 2688 } 2689 2690 if (a.order === 'last' || b.order === 'first') { 2691 return 1 * isMin; 2692 } 2693 2694 return 0; 2695 } 2696 2697 return (a.breakpoint - b.breakpoint) * isMin; 2698 }); 2699 } 2700 2701 function isNumber(value) { 2702 return !isNaN(value); 2703 } 2704} 2705 2706/***/ }), 2707
2708/***/ "./_HTML/src/js/_vendors/jquery.js": 2709/*!*****************************************!*\ 2710 !*** ./_HTML/src/js/_vendors/jquery.js ***! 2711 \*****************************************/ 2712/*! no static exports found */ 2713/***/ (function(module, exports, __webpack_require__) { 2714 2715"use strict"; 2716 2717 2718/** 2719 * ÐодклÑÑение библиоÑеки jQuery 2720 * @module 2721 */ 2722 2723// ---------------------------------------- 2724// Imports 2725// ---------------------------------------- 2726 2727var _jquery = __webpack_require__(/*! jquery */ "jquery"); 2728 2729var _jquery2 = _interopRequireDefault(_jquery); 2730 2731function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 2732 2733// ---------------------------------------- 2734// Public 2735// ---------------------------------------- 2736 2737window.$ = window.jQuery = _jquery2.default; 2738 2739/* jQuery Equal heights plugin v. 1.0.7 by status201.nl */ 2740!function (i) { 2741 i.fn.equalHeights = function (n) { 2742 var o, 2743 e = i.extend({}, { onResize: !0, onLoad: !0 }, n), 2744 t = {}, 2745 h = [], 2746 s = 0, 2747 u = 0, 2748 a = i(this);return a.length < 2 ? this : (e.onResize && i(window).resize(function () { 2749 o && window.clearTimeout(o), o = window.setTimeout(function () { 2750 a.equalHeights({ onResize: !1, onLoad: !1 }); 2751 }, 100); 2752 }), e.onLoad && i(window).on("load", function () { 2753 a.equalHeights({ onResize: !1, onLoad: !1 }); 2754 }), a.each(function () { 2755 (h = i(this)).height("auto"), (s = h.height()) > 0 && (u = h.position().top, u in t ? s > t[u] ? (t[u] = s, i(a).filter(function () { 2756 return i(this).position().top == u; 2757 }).height(s)) : h.height(t[u]) : (t[u] = s, h.height(t[u]))); 2758 }), this); 2759 }; 2760}(jQuery); 2761 2762/***/ }), 2763
2764/***/ "./_HTML/src/js/entry.js": 2765/*!*******************************!*\ 2766 !*** ./_HTML/src/js/entry.js ***! 2767 \*******************************/ 2768/*! no static exports found */ 2769/***/ (function(module, exports, __webpack_require__) { 2770 2771"use strict"; 2772 2773 2774/** 2775 * @fileOverview ÐÑновной Ñайл иниÑиализаÑии модÑлей 2776 */ 2777 2778// ---------------------------------------- 2779// Imports 2780// ---------------------------------------- 2781 2782var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; 2783 2784__webpack_require__(/*! #/_vendors/jquery */ "./_HTML/src/js/_vendors/jquery.js"); 2785 2786__webpack_require__(/*! #/_polyfills/mdn */ "./_HTML/src/js/_polyfills/mdn.js"); 2787 2788__webpack_require__(/*! #/_polyfills/promise-polyfill */ "./_HTML/src/js/_polyfills/promise-polyfill.js"); 2789 2790__webpack_require__(/*! #/_modules/modernizr */ "./_HTML/src/js/_modules/modernizr/index.js"); 2791 2792__webpack_require__(/*! custom-jquery-methods/fn/change-my-class */ "./node_modules/custom-jquery-methods/fn/change-my-class.js"); 2793 2794var _browserizr = __webpack_require__(/*! browserizr */ "./node_modules/browserizr/index.js"); 2795 2796var _browserizr2 = _interopRequireDefault(_browserizr); 2797 2798var _dynamicAdapt = __webpack_require__(/*! #/_vendors/dynamicAdapt.js */ "./_HTML/src/js/_vendors/dynamicAdapt.js"); 2799 2800var _moduleLoader = __webpack_require__(/*! #/module-loader */ "./_HTML/src/js/module-loader.js"); 2801 2802var _moduleLoader2 = _interopRequireDefault(_moduleLoader); 2803 2804var _wezomStandardTabs = __webpack_require__(/*! wezom-standard-tabs */ "./node_modules/wezom-standard-tabs/index.js"); 2805 2806var _wezomStandardTabs2 = _interopRequireDefault(_wezomStandardTabs); 2807 2808var _cookieData = __webpack_require__(/*! #/_modules/cookie-data */ "./_HTML/src/js/_modules/cookie-data.js"); 2809 2810var _cookieData2 = _interopRequireDefault(_cookieData); 2811 2812var _lazyload = __webpack_require__(/*! #/_modules/lazyload */ "./_HTML/src/js/_modules/lazyload/index.js"); 2813 2814var _clickTriggerFor = __webpack_require__(/*! #/_modules/click-trigger-for */ "./_HTML/src/js/_modules/click-trigger-for/index.js"); 2815 2816var _createTimer = __webpack_require__(/*! create-timer */ "./node_modules/create-timer/create-timer.js"); 2817 2818var _createTimer2 = _interopRequireDefault(_createTimer); 2819 2820var _utmTracking = __webpack_require__(/*! #/_modules/utm-tracking */ "./_HTML/src/js/_modules/utm-tracking.js"); 2821 2822var _utmTracking2 = _interopRequireDefault(_utmTracking); 2823 2824var _ecommerceTracking = __webpack_require__(/*! #/_modules/ecommerce-tracking */ "./_HTML/src/js/_modules/ecommerce-tracking.js"); 2825 2826var _ecommerceTracking2 = _interopRequireDefault(_ecommerceTracking); 2827 2828var _mainMenu = __webpack_require__(/*! ./_modules/main-menu */ "./_HTML/src/js/_modules/main-menu.js"); 2829 2830var _mainMenu2 = _interopRequireDefault(_mainMenu); 2831 2832var _catalogSearch = __webpack_require__(/*! ./_modules/catalog-search */ "./_HTML/src/js/_modules/catalog-search.js"); 2833 2834var _catalogSearch2 = _interopRequireDefault(_catalogSearch); 2835 2836var _productsFilter = __webpack_require__(/*! ./_modules/products-filter */ "./_HTML/src/js/_modules/products-filter/index.js"); 2837 2838var _productsFilter2 = _interopRequireDefault(_productsFilter); 2839 2840var _equalHeight = __webpack_require__(/*! #/_modules/equal-height */ "./_HTML/src/js/_modules/equal-height.js"); 2841 2842var _equalHeight2 = _interopRequireDefault(_equalHeight); 2843 2844var _ballModal = __webpack_require__(/*! ./_modules/ball-modal */ "./_HTML/src/js/_modules/ball-modal/index.js"); 2845 2846var _ballModal2 = _interopRequireDefault(_ballModal); 2847 2848var _jquery = __webpack_require__(/*! jquery */ "jquery"); 2849 2850var _jquery2 = _interopRequireDefault(_jquery); 2851 2852__webpack_require__(/*! jquery-snowfall */ "./node_modules/jquery-snowfall/src/snowfall.jquery.js"); 2853 2854function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 2855 2856// ---------------------------------------- 2857// Public 2858// ---------------------------------------- 2859 2860try { 2861 (0, _dynamicAdapt.useDynamicAdapt)('min'); 2862} catch (e) {} 2863// console.log(e); 2864 2865 2866// snow settings on the website 2867function throttle(callback, limit) { 2868 var wait = false;
2869 return function () { 2870 if (!wait) { 2871 // eslint-disable-next-line standard/no-callback-literal 2872 callback.apply(undefined, arguments); 2873 wait = true; 2874 setTimeout(function () { 2875 wait = false; 2876 }, limit); 2877 } 2878 }; 2879} 2880 2881// check config for enable snowfall 2882if (typeof window.MainConfig !== 'undefined' && typeof window.MainConfig.snowfall !== 'undefined' && window.MainConfig.snowfall) { 2883 (0, _jquery2.default)(document).ready(function () { 2884 // $('body').snowfall({ 2885 // deviceorientation: true, 2886 // round: true, 2887 // minSize: 3, 2888 // maxSize: 8, 2889 // maxSpeed: 3, 2890 // flakeCount: 75 2891 // }); 2892 2893 var snowConfig = { 2894 deviceorientation: true, 2895 round: true, 2896 minSize: 3, 2897 maxSize: 8, 2898 maxSpeed: 3, 2899 flakeCount: 75 2900 }; 2901 2902 (0, _jquery2.default)(document).snowfall(snowConfig); 2903 2904 var snowRefreshIntervalId = void 0; 2905 2906 (0, _jquery2.default)(window).on('mousemove', throttle(function () { 2907 var snowTimer = 0; 2908 clearInterval(snowRefreshIntervalId); 2909 (0, _jquery2.default)(document).snowfall('clear'); 2910 2911 snowRefreshIntervalId = setInterval(function () { 2912 snowTimer += 1; 2913 if (snowTimer > 5) { 2914 clearInterval(snowRefreshIntervalId); 2915 (0, _jquery2.default)(document).snowfall(snowConfig); 2916 } 2917 }, 1000); 2918 }, 500)); 2919 }); 2920} 2921 2922window.jQuery(document).ready(function ($) { 2923 _moduleLoader2.default.init($(document)); 2924 _cookieData2.default.askUsage(); // еÑли нÑжно иÑполÑзоваÑÑ ÐºÑки 2925 _wezomStandardTabs2.default.init(); 2926 // wsTabs.setActive(); // еÑли нÑжно пÑинÑдиÑелÑно акÑивиÑоваÑÑ ÑÐ°Ð±Ñ 2927 2928 _utmTracking2.default.init(); 2929 2930 (0, _mainMenu2.default)(); 2931 (0, _catalogSearch2.default)(); 2932 // product filter init 2933 new _productsFilter2.default($).init(); 2934 2935 (0, _clickTriggerFor.clickTriggerFor)(); 2936 _equalHeight2.default.init(); 2937 2938 if (_browserizr2.default.detect().isEdge()) { 2939 var $header = $('.js-header-sticky'); 2940 var $window = $(window); 2941 if ($header.length) { 2942 var cssClass = 'is-fixed'; 2943 var previouslyAdded = $header.hasClass(cssClass); 2944 var timeout = (0, _createTimer2.default)(300); 2945 var _fixed = function _fixed() { 2946 var top = $window.scrollTop(); 2947 var height = $header.height(); 2948 previouslyAdded = $header.changeMyClass(top > height, previouslyAdded, cssClass); 2949 }; 2950 $window.on('scroll', _fixed); 2951 $window.on('resize', function () { 2952 return timeout(_fixed); 2953 }); 2954 $window.on('orientationchange', function () { 2955 return timeout(_fixed); 2956 }); 2957 _fixed(); 2958 } 2959 } 2960 2961 // ÑÑо деÑолÑнÑе наÑÑÑойки ÑкÑолла, можеÑÑ Ð¸Ñ ÑбиÑаÑÑ/модиÑиÑиÑоваÑÑ, каÑоÑе делаÑÑ ÑÑо Ñ Ð¾ÑеÑÑ, калбеков неÑÑ Ð¿Ð¾Ð½ÑÑное дело:D 2962 __webpack_require__.e(/*! import() */ 40).then(__webpack_require__.t.bind(null, /*! #/_vendors/scroll */ "./_HTML/src/js/_vendors/scroll.js", 7)).then(function (module) { 2963 module.default({ 2964 frameRate: 150, // [Hz] 2965 animationTime: 700, // [ms] 2966 stepSize: 70, // [px] 2967 pulseAlgorithm: true, 2968 pulseScale: 3, 2969 pulseNormalize: 1, 2970 accelerationDelta: 50, // 50 2971 accelerationMax: 3, // 3 2972 keyboardSupport: true, // option 2973 arrowScroll: 50, // [px] 2974 fixedBackground: true, 2975 excluded: '' 2976 }); 2977 }); 2978 2979 (0, _lazyload.lazyload)(_lazyload.selector).then(function (observer) { 2980 return observer.observe(); 2981 }); 2982 2983 $('.js-previewer-trigger').on('click', function () { 2984 $(this).toggleClass('is-active'); 2985 $('#js-previewer-container').toggleClass('is-active'); 2986 }); 2987 2988 // ÐобалÑем и ÑдалÑем клаÑÑ "is-full" еÑли input или textarea заполнен 2989 document.addEventListener('blur', function (evt) { 2990 if (!evt.target.tagName) return false; 2991 var tagName = evt.target.tagName.toLowerCase(); 2992 if (tagName !== 'input' && tagName !== 'textarea') return true; 2993 if (evt.target.type === 'radio') return true; 2994 evt.target.classList.toggle('is-full', Boolean(evt.target.value)); 2995 }, true); 2996 2997 if ($('input').length) { 2998 $('input').each(function () { 2999 if ($(this).val().length) { 3000 $(this).addClass('is-full'); 3001 } 3002 }); 3003 } 3004 3005 // ÐобалÑем клаÑÑ "is-full" еÑли select заполнен 3006 $('select').on('change', function () { 3007 $(this).toggleClass('is-full', Boolean($(this).val())); 3008 }); 3009 3010 $(document).on('click', '.js-magnific-close', function () { 3011 $.magnificPopup.close(); 3012 }); 3013 3014 // eto adaptacia knopki na slidere xD 3015 function handler1(button, block) { 3016 button.css('left', block.offset().left + 'px'); 3017 } 3018 3019 if ($('[data-bottom-block-helper]').length) { 3020 var $button = $('[data-bottom-block-helper]');
3021 var $block = $('[data-bottom-block-helper-container]').eq(0); 3022 3023 handler1($button, $block); 3024 3025 var moidebaunce = null; 3026 3027 $(window).resize(function () { 3028 clearTimeout(moidebaunce); 3029 3030 moidebaunce = setTimeout(function () { 3031 handler1($button, $block); 3032 }, 300); 3033 }); 3034 } 3035 3036 if ($('[data-load-more]').length) { 3037 $('[data-load-more]').click(function () { 3038 var button = $(this); 3039 var url = button.data('url'); 3040 var params = button.attr('data-params'); 3041 3042 button.addClass('is-loading'); 3043 3044 $.ajax({ 3045 cache: false, 3046 method: 'post', 3047 url: url, 3048 data: JSON.parse(params) 3049 }).done(function (response) { 3050 button.removeClass('is-loading'); 3051 3052 if (response.success) { 3053 var Nparams = response.params; 3054 3055 if (response.markup) { 3056 var $container = $('[data-load-more-container="' + button.attr('data-load-more') + '"]'); 3057 var itemsBefore = $container.children().length; 3058 $container.append(response.markup); 3059 3060 $('html, body').animate({ 3061 scrollTop: $container.find('li:nth-child(' + (itemsBefore + 1) + ')').offset().top - 64 3062 }, 1000); 3063 // lazyload(lazyloadSelector).then(observer => observer.observe()); 3064 } 3065 3066 if (response.end) { 3067 button.remove(); 3068 } 3069 3070 if (response.params) { 3071 if ((typeof Nparams === 'undefined' ? 'undefined' : _typeof(Nparams)) === 'object') { 3072 Nparams = JSON.stringify(Nparams); 3073 } 3074 button.attr('data-params', Nparams); 3075 } 3076 3077 // lazyload(lazyloadSelector).then(observer => observer.observe()); 3078 } 3079 }); 3080 }); 3081 } 3082 3083 if ($('.post-card').length) { 3084 $(document).on('click', '.post-card', function (e) { 3085 window.location.href = $(e.currentTarget).find('a').attr('href'); 3086 }); 3087 } 3088 3089 if ($('.main-about .image-block').length) { 3090 $(document).on('click', '.main-about .image-block', function (e) { 3091 var href = $(e.currentTarget).find('a.image-block__cta').first().attr('href'); 3092 if (href) { 3093 window.location.href = href; 3094 } 3095 }); 3096 } 3097 3098 // Ublock 3099 if ($(window).width() >= 1025) { 3100 if (navigator.userAgent.match(/firefox/i)) { 3101 $('#firefixU').attr('transform', 'scale(.02,.02), translate(11 8)'); 3102 } else if (/Edge\/\d./i.test(navigator.userAgent)) { 3103 $('#edgefixU').hide(); 3104 $('#UimageFix').show(); 3105 } 3106 } else { 3107 $('#edgefixU').hide(); 3108 $('#UimageFix').show(); 3109 } 3110 3111 var $perfectScrollbar = $('[data-perfect-scrollbar]'); 3112 if ($perfectScrollbar.length && !window.Modernizr.mobiledevice && !window.Modernizr.cssscrollbar) { 3113 Promise.all(/*! import() */[__webpack_require__.e(1), __webpack_require__.e(37), __webpack_require__.e(39)]).then(__webpack_require__.t.bind(null, /*! #/_modules/perfect-scrollbar */ "./_HTML/src/js/_modules/perfect-scrollbar.js", 7)).then(function (module) { 3114 module.default($perfectScrollbar); 3115 }); 3116 } 3117 3118 if (window.messageOnLoadNoty) { 3119 Promise.all(/*! import() */[__webpack_require__.e(1), __webpack_require__.e(2), __webpack_require__.e(4), __webpack_require__.e(3), __webpack_require__.e(35)]).then(__webpack_require__.t.bind(null, /*! #/_modules/jquery-validation/validate-get-response */ "./_HTML/src/js/_modules/jquery-validation/validate-get-response.js", 7)).then(function (module) { 3120 module.showMessageMagnific(null, false, window.messageOnLoadNoty.type, window.messageOnLoadNoty.title, window.messageOnLoadNoty.text); 3121 }); 3122 } 3123 3124 if ($('[data-thank-print]').length) { 3125 $('body').addClass('is-printing'); 3126 3127 $('[data-thank-print]').on('click', function () { 3128 window.print(); 3129 }); 3130 } 3131 3132 // Copyright on copy 3133 function initCopirightOnCopy() { 3134 var lang = document.getElementsByTagName('html')[0].getAttribute('lang'); 3135 var helpText = ''; 3136 switch (lang) { 3137 case 'ru': 3138 helpText = 'ÐодÑобнее по ÑÑÑлке'; 3139 break; 3140 case 'en': 3141 helpText = 'Read more at'; 3142 break; 3143 case 'ua': 3144 helpText = 'ÐеÑалÑнÑÑе за поÑиланнÑм'; 3145 break; 3146 default: 3147 helpText = 'ÐеÑалÑнÑÑе за поÑиланнÑм'; 3148 } 3149 function a(event) { 3150 if (event.target.nodeName === 'INPUT' || event.target.nodeName === 'TEXTAREA') { 3151 return; 3152 } 3153 var a;var b = document.getElementsByTagName('body')[0]; 3154 a = window.getSelection(); 3155 var c = '<br /><br />' + helpText + ": <a href='" + document.location.href + "'>" + document.location.href + '</a>';var d = a + c;var e = document.createElement('div'); 3156 e.style.position = 'absolute'; 3157 e.style.left = '-99999px'; 3158 b.appendChild(e); 3159 e.innerHTML = d; 3160 a.selectAllChildren(e); 3161 window.setTimeout(function () { 3162 b.removeChild(e); 3163 }, 0); 3164 } 3165 document.oncopy = a; 3166 } 3167 // Init Copyright on copy 3168 initCopirightOnCopy(); 3169 3170 $(document).on('click', '.js-messangers-btn', function (e) { 3171 e.preventDefault(); 3172 $(e.target).parent().toggleClass('is-active'); 3173 }); 3174 3175 // Spoilers 3176 $(document).on('click', '[data-spoiler] [data-spoiler-title]', function (e) { 3177 e.preventDefault(); 3178 e.stopPropagation(); 3179 var slideSpeed = 250; 3180 var $current = $(e.currentTarget); 3181 var $spoiler = $current.parents('[data-spoiler]'); 3182 3183 function toggleSpoiler() { 3184 $current.toggleClass('active').next().stop().slideToggle(slideSpeed); 3185 } 3186 3187 function openSpoiler() { 3188 $current.addClass('active').next().stop().slideDown(slideSpeed); 3189 } 3190 3191 function closeNotCurrentSpoiler() { 3192 $spoiler.find('[data-spoiler-title]').not($current).removeClass('active').next().slideUp(slideSpeed); 3193 } 3194 3195 if ($(window).width() < 1024) { 3196 toggleSpoiler(); 3197 return; 3198 } 3199 3200 switch ($spoiler.attr('data-spoiler')) { 3201 case 'one': 3202 closeNotCurrentSpoiler(); 3203 openSpoiler(); 3204 break; 3205 case 'one-close': 3206 if ($current.hasClass('active')) { 3207 toggleSpoiler(); 3208 return; 3209 } 3210 closeNotCurrentSpoiler(); 3211 openSpoiler(); 3212 break; 3213 default: 3214 toggleSpoiler(); 3215 break; 3216 } 3217 }); 3218 3219 $('[data-spoiler] [data-spoiler-title].active').next().show(); 3220 3221 // Show more text 3222 $(document).on('click', '[data-showmore]', function (e) { 3223 e.preventDefault(); 3224 var $current = $(e.target); 3225 var $text = $current.parent(); 3226 $text.toggleClass('is-visible'); 3227 var locale = document.documentElement.lang.split('-').pop().toLocaleLowerCase() === 'uk' ? 'ua' : document.documentElement.lang.split('-').pop().toLocaleLowerCase(); 3228 var dictionary = $current.data('dictionary')[locale]; 3229 $current.text($text.hasClass('is-visible') ? dictionary.less : dictionary.more); 3230 }); 3231 3232 // Show more comments 3233 $(document).on('click', '[data-comments-load]', function (e) { 3234 e.preventDefault(); 3235 var $current = $(e.target); 3236 var $commentsBlock = $('[data-comments]'); 3237 var $commentsList = $commentsBlock.find('[data-comments-list]'); 3238 var catalogID = $commentsBlock.data('comments'); 3239 var url = $current.data('comments-load'); 3240 $current.attr('disabled', true); 3241 $commentsBlock.addClass('is-loading'); 3242 3243 var data = { 3244 catalog_id: Number(catalogID), 3245 offset: $commentsList.children().length 3246 }; 3247 3248 setTimeout(function () { 3249 $.ajax({ 3250 cache: false, 3251 method: 'post', 3252 url: url, 3253 data: data 3254 }).done(function (response) { 3255 $commentsBlock.removeClass('is-loading'); 3256 $current.attr('disabled', false); 3257 3258 if (response.success) { 3259 if (response.reviews_markup) { 3260 $commentsList.append(response.reviews_markup); 3261 } 3262 if (response.end) { 3263 $current.remove(); 3264 } 3265 } 3266 }); 3267 }, 300); 3268 }); 3269 3270 // Lovers Modal init 3271 var loversModalRef = document.getElementById('loversModal'); 3272 if (loversModalRef) { 3273 document.body.classList.add('blur'); 3274 var loversModalCloseHandler = function loversModalCloseHandler() { 3275 _cookieData2.default.add('show-lovers-modal', false, { expires: 365, path: '/', SameSite: 'None', Secure: 'Secure' }); 3276 loversModalRef.style.opacity = 0; 3277 document.body.classList.remove('blur'); 3278 setTimeout(function () { 3279 loversModalRef.remove(); 3280 }, 2000); 3281 }; 3282 var closeBtnRef = loversModalRef.querySelector('.js-close-lovers-modal'); 3283 closeBtnRef.addEventListener('click', loversModalCloseHandler); 3284 } 3285 3286 // Easter Modal init 3287 var easterModalRef = document.getElementById('easterModal'); 3288 3289 if (easterModalRef) { 3290 // document.body.classList.add('blur'); 3291 var easterModalCloseHandler = function easterModalCloseHandler() { 3292 _cookieData2.default.add('show-easter-modal', false, { expires: 365, path: '/', SameSite: 'None', Secure: 'Secure' }); 3293 easterModalRef.style.opacity = 0; 3294 // document.body.classList.remove('blur'); 3295 document.body.style.overflow = ''; 3296 setTimeout(function () { 3297 easterModalRef.remove(); 3298 }, 2000); 3299 }; 3300 var _closeBtnRef = easterModalRef.querySelector('.js-close-easter-modal'); 3301 _closeBtnRef.addEventListener('click', easterModalCloseHandler); 3302 } 3303 3304 // Ball Modal init 3305 var ballContainer = document.querySelector('.bf-ball-container'); 3306 if (ballContainer && ballContainer.getAttribute('data-bfball') === 'active') { 3307 new _ballModal2.default(); 3308 } 3309}); 3310 3311// GA4 3312window.addEventListener('DOMContentLoaded', function () { 3313 // Product page 3314 var productPage = document.querySelector('[data-product-page]'); 3315 3316 if (productPage) { 3317 // ÐÑÑÐ¸Ð¼Ð°Ð½Ð½Ñ ÑденÑиÑÑкаÑоÑа ÑоваÑÑ Ð· аÑÑибÑÑа data-product-page 3318 var productId = parseInt(productPage.getAttribute('data-product-page')); 3319 3320 if (!productId) { 3321 return; 3322 } 3323 3324 _jquery2.default.ajax({ 3325 cache: false, 3326 method: 'post', 3327 url: '/ua/ecommerce/ajax/product', 3328 data: { 3329 productId: productId 3330 } 3331 }).done(function (response) { 3332 if (response.success && response.data) { 3333 _ecommerceTracking2.default.trackViewItem(response.data); 3334 } 3335 }); 3336 } 3337 3338 // Checkout page 3339 var checkoutPage = document.querySelector('[data-checkout-page]'); 3340 3341 if (checkoutPage) { 3342 _jquery2.default.ajax({ 3343 cache: false, 3344 method: 'post', 3345 url: '/ua/ecommerce/ajax/checkout' 3346 }).done(function (response) { 3347 if (response.success && response.data) { 3348 var _response$data = response.data, 3349 amount = _response$data.amount, 3350 items = _response$data.items; 3351 3352 _ecommerceTracking2.default.trackBeginCheckout(amount, items); 3353 } 3354 }); 3355 } 3356 3357 // Thanks page 3358 var thankPage = document.querySelector('[data-thank-page]'); 3359 3360 if (thankPage) { 3361 if (!window.trackPurchase) { 3362 return; 3363 } 3364 3365 // ÐÑÑÐ¸Ð¼Ð°Ð½Ð½Ñ ÑденÑиÑÑкаÑоÑа Ð·Ð°Ð¼Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð· аÑÑибÑÑа data-thank-page 3366 var orderId = parseInt(thankPage.getAttribute('data-thank-page')); 3367 3368 if (!orderId) { 3369 return; 3370 } 3371 3372 _jquery2.default.ajax({ 3373 cache: false, 3374 method: 'post', 3375 url: '/ua/ecommerce/ajax/purchase', 3376 data: { 3377 orderId: orderId 3378 } 3379 }).done(function (response) { 3380 if (response.success && response.data) { 3381 _ecommerceTracking2.default.trackPurchase(response.data); 3382 } 3383 }); 3384 } 3385 3386 // spoiler 3387 (0, _jquery2.default)(document).on('click', '.text-spoiler', function (e) { 3388 e.preventDefault(); 3389 var currentAction = (0, _jquery2.default)(this).data('action'); 3390 var spoilerBlock = (0, _jquery2.default)(this).parent().find('.text-spoiler__content'); 3391 if (currentAction === 'open') { 3392 spoilerBlock.addClass('open'); 3393 } 3394 if (currentAction === 'close') { 3395 spoilerBlock.removeClass('open'); 3396 } 3397 (0, _jquery2.default)(this).parent().find('.text-spoiler').show(); 3398 (0, _jquery2.default)(this).hide(); 3399 }); 3400}); 3401 3402// ---------------------------------------- 3403 3404/***/ }), 3405
3406/***/ "./_HTML/src/js/module-loader.js": 3407/*!***************************************!*\ 3408 !*** ./_HTML/src/js/module-loader.js ***! 3409 \***************************************/ 3410/*! no static exports found */ 3411/***/ (function(module, exports, __webpack_require__) { 3412 3413"use strict"; 3414 3415 3416/** 3417 * @module 3418 */ 3419 3420// ---------------------------------------- 3421// Imports 3422// ---------------------------------------- 3423 3424Object.defineProperty(exports, "__esModule", { 3425 value: true 3426}); 3427 3428var _wezomModuleLoader = __webpack_require__(/*! wezom-module-loader */ "./node_modules/wezom-module-loader/index.js"); 3429 3430var _wezomModuleLoader2 = _interopRequireDefault(_wezomModuleLoader); 3431 3432function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 3433 3434// ---------------------------------------- 3435// Public 3436// ---------------------------------------- 3437 3438var moduleLoader = new _wezomModuleLoader2.default({ 3439 debug: false, // IS_DEVELOPMENT, 3440 importPromise: function importPromise(moduleName) { 3441 return __webpack_require__("./_HTML/src/js/_modules-loaders lazy recursive ^\\.\\/.*$")("./" + moduleName); 3442 }, 3443 initSelector: '.js-init', 3444 initFunctionName: 'loaderInit', 3445 loadingClass: '_module-loading', 3446 loadedClass: '_module-loaded', 3447 list: { 3448 /* eslint-disable key-spacing */ 3449 'jquery-validation--module-loader': 'form', 3450 'inputmask--module-loader': '[data-phonemask]', 3451 's2s--module-loader': '[data-s2s]', 3452 'magnific-popup--module-loader': '[data-mfp]', 3453 'wrap-media--module-loader': '[data-wrap-media]', 3454 'sliders--module-loader': '[data-slider]', 3455 'lozad--module-loader': ['[data-lozad]', 'picture'], 3456 'google-map--module-loader': '[data-google-map]', 3457 'scroll-window--module-loader': '[data-scroll-window]', 3458 'draggable-table--module-loader': '[data-draggable-table]', 3459 'accordion--module-loader': '[data-accordion]', 3460 'splash-no-18': '[data-no-18]', 3461 'timeline': '[data-timeline]', 3462 'cart--module-loader': '[data-cart-container]', 3463 'input-quantity--module-loader': '[data-quantity]', 3464 'review-read-more--module-loader': '.js-read-more', 3465 'catalog-filter--module-loader': '.js-filter-button', 3466 'animated-text': '[data-animated-text]', 3467 'beerbox--module-loader': '[data-beerbox]', 3468 'partner-form--module-loader': '[data-partner-form]', 3469 'infinity-scroll--module-loader': '.infinity-scroll', 3470 'password-toggle--module-loader': '.password-toggle' 3471 } 3472}); 3473 3474// ---------------------------------------- 3475// Exports 3476// ---------------------------------------- 3477 3478exports.default = moduleLoader; 3479 3480/***/ }), 3481
vendor: 10,120 bytes, lines 3482-3775
3482/***/ "./node_modules/body-scroll-lock/lib/bodyScrollLock.esm.js": 3483/*!*****************************************************************!*\ 3484 !*** ./node_modules/body-scroll-lock/lib/bodyScrollLock.esm.js ***! 3485 \*****************************************************************/ 3486/*! exports provided: disableBodyScroll, clearAllBodyScrollLocks, enableBodyScroll */ 3487/***/ (function(module, __webpack_exports__, __webpack_require__) { 3488 3489"use strict"; 3490__webpack_require__.r(__webpack_exports__); 3491/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "disableBodyScroll", function() { return disableBodyScroll; }); 3492/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clearAllBodyScrollLocks", function() { return clearAllBodyScrollLocks; }); 3493/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "enableBodyScroll", function() { return enableBodyScroll; }); 3494function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } 3495 3496// Older browsers don't support event options, feature detect it. 3497 3498// Adopted and modified solution from Bohdan Didukh (2017) 3499// https://stackoverflow.com/questions/41594997/ios-10-safari-prevent-scrolling-behind-a-fixed-overlay-and-maintain-scroll-posi 3500 3501var hasPassiveEvents = false; 3502if (typeof window !== 'undefined') { 3503 var passiveTestOptions = { 3504 get passive() { 3505 hasPassiveEvents = true; 3506 return undefined; 3507 } 3508 }; 3509 window.addEventListener('testPassive', null, passiveTestOptions); 3510 window.removeEventListener('testPassive', null, passiveTestOptions); 3511} 3512 3513var isIosDevice = typeof window !== 'undefined' && window.navigator && window.navigator.platform && (/iP(ad|hone|od)/.test(window.navigator.platform) || window.navigator.platform === 'MacIntel' && window.navigator.maxTouchPoints > 1); 3514 3515 3516var locks = []; 3517var documentListenerAdded = false; 3518var initialClientY = -1; 3519var previousBodyOverflowSetting = void 0; 3520var previousBodyPosition = void 0; 3521var previousBodyPaddingRight = void 0; 3522 3523// returns true if `el` should be allowed to receive touchmove events. 3524var allowTouchMove = function allowTouchMove(el) { 3525 return locks.some(function (lock) { 3526 if (lock.options.allowTouchMove && lock.options.allowTouchMove(el)) { 3527 return true; 3528 } 3529 3530 return false; 3531 }); 3532}; 3533 3534var preventDefault = function preventDefault(rawEvent) { 3535 var e = rawEvent || window.event; 3536 3537 // For the case whereby consumers adds a touchmove event listener to document. 3538 // Recall that we do document.addEventListener('touchmove', preventDefault, { passive: false }) 3539 // in disableBodyScroll - so if we provide this opportunity to allowTouchMove, then 3540 // the touchmove event on document will break. 3541 if (allowTouchMove(e.target)) { 3542 return true; 3543 } 3544 3545 // Do not prevent if the event has more than one touch (usually meaning this is a multi touch gesture like pinch to zoom). 3546 if (e.touches.length > 1) return true; 3547 3548 if (e.preventDefault) e.preventDefault(); 3549 3550 return false; 3551}; 3552 3553var setOverflowHidden = function setOverflowHidden(options) { 3554 // If previousBodyPaddingRight is already set, don't set it again. 3555 if (previousBodyPaddingRight === undefined) { 3556 var _reserveScrollBarGap = !!options && options.reserveScrollBarGap === true; 3557 var scrollBarGap = window.innerWidth - document.documentElement.clientWidth; 3558 3559 if (_reserveScrollBarGap && scrollBarGap > 0) { 3560 var computedBodyPaddingRight = parseInt(window.getComputedStyle(document.body).getPropertyValue('padding-right'), 10); 3561 previousBodyPaddingRight = document.body.style.paddingRight; 3562 document.body.style.paddingRight = computedBodyPaddingRight + scrollBarGap + 'px'; 3563 } 3564 } 3565 3566 // If previousBodyOverflowSetting is already set, don't set it again. 3567 if (previousBodyOverflowSetting === undefined) { 3568 previousBodyOverflowSetting = document.body.style.overflow; 3569 document.body.style.overflow = 'hidden'; 3570 } 3571}; 3572 3573var restoreOverflowSetting = function restoreOverflowSetting() { 3574 if (previousBodyPaddingRight !== undefined) { 3575 document.body.style.paddingRight = previousBodyPaddingRight; 3576 3577 // Restore previousBodyPaddingRight to undefined so setOverflowHidden knows it 3578 // can be set again. 3579 previousBodyPaddingRight = undefined; 3580 } 3581 3582 if (previousBodyOverflowSetting !== undefined) { 3583 document.body.style.overflow = previousBodyOverflowSetting; 3584 3585 // Restore previousBodyOverflowSetting to undefined 3586 // so setOverflowHidden knows it can be set again. 3587 previousBodyOverflowSetting = undefined; 3588 } 3589}; 3590 3591var setPositionFixed = function setPositionFixed() { 3592 return window.requestAnimationFrame(function () { 3593 // If previousBodyPosition is already set, don't set it again. 3594 if (previousBodyPosition === undefined) { 3595 previousBodyPosition = { 3596 position: document.body.style.position, 3597 top: document.body.style.top, 3598 left: document.body.style.left 3599 }; 3600 3601 // Update the dom inside an animation frame 3602 var _window = window, 3603 scrollY = _window.scrollY, 3604 scrollX = _window.scrollX, 3605 innerHeight = _window.innerHeight; 3606 3607 document.body.style.position = 'fixed'; 3608 document.body.style.top = -scrollY; 3609 document.body.style.left = -scrollX; 3610 3611 setTimeout(function () { 3612 return window.requestAnimationFrame(function () { 3613 // Attempt to check if the bottom bar appeared due to the position change 3614 var bottomBarHeight = innerHeight - window.innerHeight; 3615 if (bottomBarHeight && scrollY >= innerHeight) { 3616 // Move the content further up so that the bottom bar doesn't hide it 3617 document.body.style.top = -(scrollY + bottomBarHeight); 3618 } 3619 }); 3620 }, 300); 3621 } 3622 }); 3623}; 3624 3625var restorePositionSetting = function restorePositionSetting() { 3626 if (previousBodyPosition !== undefined) { 3627 // Convert the position from "px" to Int 3628 var y = -parseInt(document.body.style.top, 10); 3629 var x = -parseInt(document.body.style.left, 10); 3630 3631 // Restore styles 3632 document.body.style.position = previousBodyPosition.position; 3633 document.body.style.top = previousBodyPosition.top; 3634 document.body.style.left = previousBodyPosition.left; 3635 3636 // Restore scroll 3637 window.scrollTo(x, y); 3638 3639 previousBodyPosition = undefined; 3640 } 3641}; 3642 3643// https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollHeight#Problems_and_solutions 3644var isTargetElementTotallyScrolled = function isTargetElementTotallyScrolled(targetElement) { 3645 return targetElement ? targetElement.scrollHeight - targetElement.scrollTop <= targetElement.clientHeight : false; 3646}; 3647 3648var handleScroll = function handleScroll(event, targetElement) { 3649 var clientY = event.targetTouches[0].clientY - initialClientY; 3650 3651 if (allowTouchMove(event.target)) { 3652 return false; 3653 } 3654 3655 if (targetElement && targetElement.scrollTop === 0 && clientY > 0) { 3656 // element is at the top of its scroll. 3657 return preventDefault(event); 3658 } 3659 3660 if (isTargetElementTotallyScrolled(targetElement) && clientY < 0) { 3661 // element is at the bottom of its scroll. 3662 return preventDefault(event); 3663 } 3664 3665 event.stopPropagation(); 3666 return true; 3667}; 3668 3669var disableBodyScroll = function disableBodyScroll(targetElement, options) { 3670 // targetElement must be provided 3671 if (!targetElement) { 3672 // eslint-disable-next-line no-console 3673 console.error('disableBodyScroll unsuccessful - targetElement must be provided when calling disableBodyScroll on IOS devices.'); 3674 return; 3675 } 3676 3677 // disableBodyScroll must not have been called on this targetElement before 3678 if (locks.some(function (lock) { 3679 return lock.targetElement === targetElement; 3680 })) { 3681 return; 3682 } 3683 3684 var lock = { 3685 targetElement: targetElement, 3686 options: options || {} 3687 }; 3688 3689 locks = [].concat(_toConsumableArray(locks), [lock]); 3690 3691 if (isIosDevice) { 3692 setPositionFixed(); 3693 } else { 3694 setOverflowHidden(options); 3695 } 3696 3697 if (isIosDevice) { 3698 targetElement.ontouchstart = function (event) { 3699 if (event.targetTouches.length === 1) { 3700 // detect single touch. 3701 initialClientY = event.targetTouches[0].clientY; 3702 } 3703 }; 3704 targetElement.ontouchmove = function (event) { 3705 if (event.targetTouches.length === 1) { 3706 // detect single touch. 3707 handleScroll(event, targetElement); 3708 } 3709 }; 3710 3711 if (!documentListenerAdded) { 3712 document.addEventListener('touchmove', preventDefault, hasPassiveEvents ? { passive: false } : undefined); 3713 documentListenerAdded = true; 3714 } 3715 } 3716}; 3717 3718var clearAllBodyScrollLocks = function clearAllBodyScrollLocks() { 3719 if (isIosDevice) { 3720 // Clear all locks ontouchstart/ontouchmove handlers, and the references. 3721 locks.forEach(function (lock) { 3722 lock.targetElement.ontouchstart = null; 3723 lock.targetElement.ontouchmove = null; 3724 }); 3725 3726 if (documentListenerAdded) { 3727 document.removeEventListener('touchmove', preventDefault, hasPassiveEvents ? { passive: false } : undefined); 3728 documentListenerAdded = false; 3729 } 3730 3731 // Reset initial clientY. 3732 initialClientY = -1; 3733 } 3734 3735 if (isIosDevice) { 3736 restorePositionSetting(); 3737 } else { 3738 restoreOverflowSetting(); 3739 } 3740 3741 locks = []; 3742}; 3743 3744var enableBodyScroll = function enableBodyScroll(targetElement) { 3745 if (!targetElement) { 3746 // eslint-disable-next-line no-console 3747 console.error('enableBodyScroll unsuccessful - targetElement must be provided when calling enableBodyScroll on IOS devices.'); 3748 return; 3749 } 3750 3751 locks = locks.filter(function (lock) { 3752 return lock.targetElement !== targetElement; 3753 }); 3754 3755 if (isIosDevice) { 3756 targetElement.ontouchstart = null; 3757 targetElement.ontouchmove = null; 3758 3759 if (documentListenerAdded && locks.length === 0) { 3760 document.removeEventListener('touchmove', preventDefault, hasPassiveEvents ? { passive: false } : undefined); 3761 documentListenerAdded = false; 3762 } 3763 } 3764 3765 if (isIosDevice) { 3766 restorePositionSetting(); 3767 } else { 3768 restoreOverflowSetting(); 3769 } 3770}; 3771 3772 3773 3774/***/ }), 3775
vendor: 11,515 bytes, lines 3776-4181
3776/***/ "./node_modules/browserizr/index.js": 3777/*!******************************************!*\ 3778 !*** ./node_modules/browserizr/index.js ***! 3779 \******************************************/ 3780/*! exports provided: default */ 3781/***/ (function(module, __webpack_exports__, __webpack_require__) { 3782 3783"use strict"; 3784__webpack_require__.r(__webpack_exports__); 3785 3786 3787/** 3788 * @module 3789 * @version 3.1.0 3790 * @author Oleg Dutchenko <[email protected]> 3791 * @see {@link https://wezomagency.github.io/browserizr/} 3792 * @licence MIT 3793 */ 3794 3795/* eslint-disable no-return-assign */ 3796 3797// ---------------------------------------- 3798// Public 3799// ---------------------------------------- 3800 3801const Browserizr = (function (window, navigator, screen) { 3802 let ua = navigator.userAgent 3803 let platform = navigator.platform 3804 let width = screen.width 3805 let height = screen.height 3806 if (width > height) { 3807 let temp = height 3808 height = width 3809 width = temp 3810 } 3811 3812 /** 3813 * @constructor 3814 */ 3815 function Browserizr () {} 3816 3817 let isAndroid = null 3818 /** @return {boolean} */ 3819 Browserizr.prototype.isAndroid = function () { 3820 return isAndroid === null ? (isAndroid = /android/i.test(ua)) : isAndroid 3821 } 3822 3823 let isAndroid3 = null 3824 /** @return {boolean} */ 3825 Browserizr.prototype.isAndroid3 = function () { 3826 return isAndroid3 === null ? (isAndroid3 = /android 3/i.test(ua)) : isAndroid3 3827 } 3828 3829 let isAndroid4 = null 3830 /** @return {boolean} */ 3831 Browserizr.prototype.isAndroid4 = function () { 3832 return isAndroid4 === null ? (isAndroid4 = /android 4/i.test(ua)) : isAndroid4 3833 } 3834 3835 let isAndroid5 = null 3836 /** @return {boolean} */ 3837 Browserizr.prototype.isAndroid5 = function () { 3838 return isAndroid5 === null ? (isAndroid5 = /android 5/i.test(ua)) : isAndroid5 3839 } 3840 3841 let isAndroid6 = null 3842 /** @return {boolean} */ 3843 Browserizr.prototype.isAndroid6 = function () { 3844 return isAndroid6 === null ? (isAndroid6 = /android 6/i.test(ua)) : isAndroid6 3845 } 3846 3847 let isAndroid7 = null 3848 /** @return {boolean} */ 3849 Browserizr.prototype.isAndroid7 = function () { 3850 return isAndroid7 === null ? (isAndroid7 = /android 7/i.test(ua)) : isAndroid7 3851 } 3852 3853 let isAndroid8 = null 3854 /** @return {boolean} */ 3855 Browserizr.prototype.isAndroid8 = function () { 3856 return isAndroid8 === null ? (isAndroid8 = /android 8/i.test(ua)) : isAndroid8 3857 } 3858 3859 let isMeizuPhone = null 3860 /** @return {boolean} */ 3861 Browserizr.prototype.isMeizuPhone = function () { 3862 return isMeizuPhone === null ? (isMeizuPhone = /Android\s.*MZ(-)?/i.test(ua)) : isMeizuPhone 3863 } 3864 3865 let isMeizuNotePhone = null 3866 /** @return {boolean} */ 3867 Browserizr.prototype.isMeizuNotePhone = function () { 3868 return isMeizuNotePhone === null ? (isMeizuNotePhone = /Android\s.*MZ(-)?.*\snote\s/i.test(ua)) : isMeizuNotePhone 3869 } 3870 3871 let isRedmiPhone = null 3872 /** @return {boolean} */ 3873 Browserizr.prototype.isRedmiPhone = function () { 3874 return isRedmiPhone === null ? (isRedmiPhone = /Android\s.*Redmi\s/i.test(ua)) : isRedmiPhone 3875 } 3876 3877 let isRedmiNotePhone = null 3878 /** @return {boolean} */ 3879 Browserizr.prototype.isRedmiNotePhone = function () { 3880 return isRedmiNotePhone === null ? (isRedmiNotePhone = /Android\s.*Redmi.*\sNote\s/i.test(ua)) : isRedmiNotePhone 3881 } 3882 3883 let isIPad = null 3884 /** @return {boolean} */ 3885 Browserizr.prototype.isIPad = function () { 3886 return isIPad === null ? (isIPad = /iPad/i.test(ua)) : isIPad 3887 } 3888 3889 let isIPod = null 3890 /** @return {boolean} */ 3891 Browserizr.prototype.isIPod = function () { 3892 return isIPod === null ? (isIPod = /iPod/i.test(ua)) : isIPod 3893 } 3894 3895 let isIPhone = null 3896 /** @return {boolean} */ 3897 Browserizr.prototype.isIPhone = function () { 3898 return isIPhone === null ? (isIPhone = /iPhone/i.test(ua)) : isIPhone 3899 } 3900 3901 /** @return {boolean} */ 3902 Browserizr.prototype.isIPhone4 = function () { 3903 return this.isIPhone() && width === 320 && height === 480 3904 } 3905 3906 /** @return {boolean} */ 3907 Browserizr.prototype.isIPhone5 = function () { 3908 return this.isIPhone() && width === 320 && height === 568 3909 } 3910 3911 /** @return {boolean} */ 3912 Browserizr.prototype.isIPhone678 = function () { 3913 return this.isIPhone() && width === 375 && height === 667 3914 } 3915 3916 /** @return {boolean} */ 3917 Browserizr.prototype.isIPhone678plus = function () { 3918 return this.isIPhone() && width === 414 && height === 736 3919 } 3920 3921 /** @return {boolean} */ 3922 Browserizr.prototype.isIPhoneX = function () { 3923 return this.isIPhone() && width === 375 && height === 812 3924 } 3925 3926 /** @return {boolean} */ 3927 Browserizr.prototype.isIOS = function () { 3928 return this.isIPad() || this.isIPod() || this.isIPhone() 3929 } 3930 3931 let isMac = null 3932 /** @return {boolean} */ 3933 Browserizr.prototype.isMac = function () { 3934 return isMac === null ? (isMac = /Mac/.test(platform)) : isMac 3935 } 3936 3937 /** @return {boolean} */ 3938 Browserizr.prototype.isMacLike = function () { 3939 return this.isMac() || this.isIOS() 3940 } 3941 3942 let isBlackBerry = null 3943 /** @return {boolean} */ 3944 Browserizr.prototype.isBlackBerry = function () { 3945 return isBlackBerry === null ? (isBlackBerry = /BlackBerry/i.test(ua)) : isBlackBerry 3946 } 3947 3948 let isBlackBerry10 = null 3949 /** @return {boolean} */ 3950 Browserizr.prototype.isBlackBerry10 = function () { 3951 return isBlackBerry10 === null ? (isBlackBerry10 = /BB10;/i.test(ua)) : isBlackBerry10 3952 } 3953 3954 let isMoz = null 3955 /** @return {boolean} */ 3956 Browserizr.prototype.isMoz = function () { 3957 return isMoz === null ? (isMoz = / Firefox\//i.test(ua)) : isMoz 3958 } 3959 3960 let isOpera = null 3961 /** @return {boolean} */ 3962 Browserizr.prototype.isOpera = function () { 3963 return isOpera === null ? (isOpera = /Opera|OPR\//i.test(ua)) : isOpera 3964 } 3965 3966 let isSafari = null 3967 /** @return {boolean} */ 3968 Browserizr.prototype.isSafari = function () { 3969 return isSafari === null ? (isSafari = (/ Safari\/\d/.test(ua) && !/ Chrome\/\d/.test(ua))) : isSafari 3970 } 3971 3972 let isChrome = null 3973 /** @return {boolean} */ 3974 Browserizr.prototype.isChrome = function () { 3975 if (isChrome === null) { 3976 isChrome = ( 3977 / Chrome\/\d/i.test(ua) && 3978 !( 3979 this.isOpera() || 3980 this.isSafari() || 3981 this.isEdge() || 3982 this.isEdgeIOS() || 3983 this.isEdgeAndroid() 3984 ) 3985 ) 3986 } 3987 return isChrome 3988 } 3989 3990 let isIE = null 3991 /** @return {boolean} */ 3992 Browserizr.prototype.isIE = function () { 3993 return isIE === null ? (isIE = /(MSIE|Trident)/i.test(ua)) : isIE 3994 } 3995 3996 let isIE8 = null 3997 /** @return {boolean} */ 3998 Browserizr.prototype.isIE8 = function () { 3999 return isIE8 === null ? (isIE8 = /MSIE 8\.\d/i.test(ua)) : isIE8 4000 } 4001 4002 let isIE9 = null 4003 /** @return {boolean} */ 4004 Browserizr.prototype.isIE9 = function () { 4005 return isIE9 === null ? (isIE9 = /MSIE 9\.\d/i.test(ua)) : isIE9 4006 } 4007 4008 let isIE10 = null 4009 /** @return {boolean} */ 4010 Browserizr.prototype.isIE10 = function () { 4011 return isIE10 === null ? (isIE10 = /MSIE 10\.\d/i.test(ua)) : isIE10 4012 } 4013 4014 let isIE11 = null 4015 /** @return {boolean} */ 4016 Browserizr.prototype.isIE11 = function () { 4017 return isIE11 === null ? (isIE11 = /Trident.*rv[ :]*11\./.test(ua)) : isIE11 4018 } 4019 4020 let isEdge = null 4021 /** @return {boolean} */ 4022 Browserizr.prototype.isEdge = function () { 4023 return isEdge === null ? (isEdge = / Edge\/\d/i.test(ua)) : isEdge 4024 } 4025 4026 let isEdgeIOS = null 4027 /** @return {boolean} */ 4028 Browserizr.prototype.isEdgeIOS = function () { 4029 return isEdgeIOS === null ? (isEdgeIOS = /\sEdgiOS\//i.test(ua)) : isEdgeIOS 4030 } 4031 4032 let isEdgeAndroid = null 4033 /** @return {boolean} */ 4034 Browserizr.prototype.isEdgeAndroid = function () { 4035 return isEdgeAndroid === null ? (isEdgeAndroid = /\sEdgA\//i.test(ua)) : isEdgeAndroid 4036 } 4037 4038 let isWindowsPhone = null 4039 /** @return {boolean} */ 4040 Browserizr.prototype.isWindowsPhone = function () { 4041 return isWindowsPhone === null ? (isWindowsPhone = /Windows\sPhone/i.test(ua)) : isWindowsPhone 4042 } 4043 4044 let isWindows = null 4045 /** @return {boolean} */ 4046 Browserizr.prototype.isWindows = function () { 4047 return isWindows === null ? (isWindows = /^win/i.test(platform)) : isWindows 4048 } 4049 4050 let isWindowsXP = null 4051 /** @return {boolean} */ 4052 Browserizr.prototype.isWindowsXP = function () { 4053 return isWindowsXP === null ? (isWindowsXP = /windows nt 5\.1/i.test(ua)) : isWindowsXP 4054 } 4055 4056 let isWindowsVista = null 4057 /** @return {boolean} */ 4058 Browserizr.prototype.isWindowsVista = function () { 4059 return isWindowsVista === null ? (isWindowsVista = /windows nt 6\.0/i.test(ua)) : isWindowsVista 4060 } 4061 4062 let isWindows7 = null 4063 /** @return {boolean} */ 4064 Browserizr.prototype.isWindows7 = function () { 4065 return isWindows7 === null ? (isWindows7 = /windows nt 6\.1/i.test(ua)) : isWindows7 4066 } 4067 4068 let isWindows8 = null 4069 /** @return {boolean} */ 4070 Browserizr.prototype.isWindows8 = function () { 4071 return isWindows8 === null ? (isWindows8 = /windows nt 6\.[2|3]/i.test(ua)) : isWindows8 4072 } 4073 4074 let isWindows10 = null 4075 /** @return {boolean} */ 4076 Browserizr.prototype.isWindows10 = function () { 4077 return isWindows10 === null ? (isWindows10 = /windows nt 10/i.test(ua)) : isWindows10 4078 } 4079 4080 let isLinux = null 4081 /** @return {boolean} */ 4082 Browserizr.prototype.isLinux = function () { 4083 return isLinux === null ? (isLinux = /^linux/i.test(platform)) : isLinux 4084 } 4085 4086 /** @return {boolean} */ 4087 Browserizr.prototype.isMobile = function () { 4088 return ( 4089 this.isIOS() || 4090 this.isAndroid() || 4091 this.isEdgeIOS() || 4092 this.isEdgeAndroid() || 4093 this.isWindowsPhone() || 4094 this.isBlackBerry() || 4095 this.isBlackBerry10() 4096 ) 4097 } 4098 4099 /** @return {boolean} */ 4100 Browserizr.prototype.isDesktop = function () { 4101 return !this.isMobile() 4102 } 4103 4104 /** 4105 * @param {string[]} tests 4106 * @param {string} [classPrefix=""] 4107 * @param {boolean} [toString=true] 4108 * @return {string[]} 4109 */ 4110 Browserizr.prototype.cssClasses = function (tests, classPrefix) { 4111 classPrefix = classPrefix || '' 4112 const classes = [] 4113 4114 for (let i = 0; i < tests.length; i++) { 4115 const key = tests[i] 4116 const method = 'is' + key 4117 if (this[method] !== undefined) { 4118 const result = this[method]() 4119 const prefix = result ? prefixIs : prefixIsNot 4120 classes.push(classPrefix + prefix + key.toLowerCase()) 4121 } else { 4122 console.warn('Browserizr has no the test "' + method + '()"') 4123 } 4124 } 4125 4126 return classes 4127 } 4128 4129 let instance = null 4130 let prefixIs = 'is-' 4131 let prefixIsNot = 'is-not-' 4132 4133 return { 4134 /** 4135 * @static 4136 * @public 4137 * @return {Browserizr} 4138 */ 4139 detect () { 4140 return instance === null ? (instance = new Browserizr()) : instance 4141 }, 4142 4143 /** 4144 * @type string 4145 */ 4146 get prefixIs () { 4147 return prefixIs 4148 }, 4149 4150 /** 4151 * @type string 4152 */ 4153 set prefixIs (value) { 4154 prefixIs = value 4155 }, 4156 4157 /** 4158 * @type string 4159 */ 4160 get prefixIsNot () { 4161 return prefixIsNot 4162 }, 4163 4164 /** 4165 * @type string 4166 */ 4167 set prefixIsNot (value) { 4168 prefixIsNot = value 4169 } 4170 } 4171})(window, window.navigator, window.screen) 4172 4173// ---------------------------------------- 4174// Exports 4175// ---------------------------------------- 4176 4177/* harmony default export */ __webpack_exports__["default"] = (Browserizr); 4178 4179 4180/***/ }), 4181
vendor: 1,667 bytes, lines 4182-4259
4182/***/ "./node_modules/create-timer/create-timer.js": 4183/*!***************************************************!*\ 4184 !*** ./node_modules/create-timer/create-timer.js ***! 4185 \***************************************************/ 4186/*! exports provided: default */ 4187/***/ (function(module, __webpack_exports__, __webpack_require__) { 4188 4189"use strict"; 4190__webpack_require__.r(__webpack_exports__); 4191 4192 4193/** 4194 * Creating timers with internal closure 4195 * @module 4196 * @example 4197import createTimer from 'create-timer'; 4198 4199const timer = createTimer(500); 4200$(window).on('resize', function () { 4201 timer(() => { 4202 console.log('done'); 4203 }); 4204}); 4205 4206timer(() => { 4207 console.log('just test'); 4208}, 300); 4209 4210// ...clear timer if need 4211timer.clear(); 4212 */ 4213 4214// ---------------------------------------- 4215// Public 4216// ---------------------------------------- 4217 4218/** 4219 * @typedef {Function} timer 4220 */ 4221 4222/** 4223 * @param {number} [defaultDelay=300] 4224 * @return {timer} 4225 */ 4226function createTimer (defaultDelay = 300) { 4227 let timeoutId = null; 4228 4229 /** 4230 * @type {timer} 4231 * @param {Function} fn 4232 * @param {number} [delay=defaultDelay] 4233 * @returns {number} timeoutId 4234 */ 4235 function timer (fn, delay = defaultDelay) { 4236 window.clearTimeout(timeoutId); 4237 timeoutId = window.setTimeout(fn, delay); 4238 return timeoutId; 4239 } 4240 4241 /** 4242 * clear current timeout 4243 * @methodOf timer 4244 * @returns void 4245 */ 4246 timer.clear = () => window.clearTimeout(timeoutId); 4247 4248 return timer; 4249} 4250 4251// ---------------------------------------- 4252// Exports 4253// ---------------------------------------- 4254 4255/* harmony default export */ __webpack_exports__["default"] = (createTimer); 4256 4257 4258/***/ }), 4259
vendor: 1,676 bytes, lines 4260-4311
4260/***/ "./node_modules/custom-jquery-methods/fn/change-my-class.js": 4261/*!******************************************************************!*\ 4262 !*** ./node_modules/custom-jquery-methods/fn/change-my-class.js ***! 4263 \******************************************************************/ 4264/*! no static exports found */ 4265/***/ (function(module, exports, __webpack_require__) { 4266 4267"use strict"; 4268 4269 4270(function () { 4271 'use strict'; 4272 /** 4273 * Add className if previously was removed. 4274 * Remove className if previously was added 4275 * 4276 * @example 4277 * function showSection ($section, $frontier) { 4278 * const $window = $(window); 4279 * let previouslyAdded = $section.hasClass('show'); // <-- 4280 * $window.on('scroll', () => { 4281 * const top = $window.scrollTop(); 4282 * const height = $frontier.offset().top + $frontier.outerHeight(); 4283 * previouslyAdded = $section.changeMyClass(top > height, previouslyAdded, 'show'); // <-- 4284 * }); 4285 * } 4286 * 4287 * @name changeMyClass 4288 * @this jQuery 4289 * @param {boolean} needToAdd 4290 * @param {boolean} previouslyAdded 4291 * @param {string|string[]|function} className 4292 * @param {function} [onChange] 4293 * @returns {boolean} className was added or not 4294 * @sourceCode 4295 */ 4296 4297 jQuery.fn.changeMyClass = function (needToAdd, previouslyAdded, className, onChange) { 4298 var changeClass = needToAdd ? previouslyAdded ? false : 'addClass' : previouslyAdded ? 'removeClass' : false; 4299 if (changeClass) { 4300 previouslyAdded = changeClass === 'addClass'; 4301 this[changeClass](className); 4302 if (typeof onChange === 'function') { 4303 onChange(previouslyAdded); 4304 } 4305 } 4306 return previouslyAdded; 4307 }; 4308})(); 4309 4310/***/ }), 4311
vendor: 3,169 bytes, lines 4312-4396
4312/***/ "./node_modules/custom-jquery-methods/fn/get-my-elements.js": 4313/*!******************************************************************!*\ 4314 !*** ./node_modules/custom-jquery-methods/fn/get-my-elements.js ***! 4315 \******************************************************************/ 4316/*! no static exports found */ 4317/***/ (function(module, exports, __webpack_require__) { 4318 4319"use strict"; 4320 4321 4322(function () { 4323 'use strict'; 4324 /** 4325 * Search on the page or retrieve from the date of the desired item. 4326 * 4327 * First, look at the date object on a certain property. 4328 * If it is empty - look for the element on the specified selector in the given direction. 4329 * When found, write it in the date object to 4330 * at subsequent calls - we get from the date, faster and without searching. 4331 * 4332 * ___!!! If called element more then one,___ 4333 * ___then the method is performed only for the first___ 4334 * 4335 * @example <caption>Find / retrieve nested items</caption> 4336 * let $els = $('.wrapper').getMyElements('$myEls', '.els-selector', 'find'); 4337 * 4338 * @example <caption>Find / retrieve nested items only in context block</caption> 4339 * let $context = $('.demo'); 4340 * let $els = $('.wrapper').getMyElements('$myEls', '.els-selector', $context); 4341 * 4342 * @example <caption>Finding / getting the parent element</caption> 4343 * let $wrapper = $('.els').getMyElements('$myWrapper', '.wrapper-selector', 'closest'); 4344 * 4345 * @example <caption>Search / retrieve similar items except for the current one</caption> 4346 * let $sameEls = $('.els').getMyElements('$mySameEls', '.els', 'document', true); 4347 * 4348 * @param {string} dataKey - the property key from the data object of the element 4349 * @param {JQuery.Selector} selector - search selector 4350 * @param {string|JQuery} [direction="document"] - direction where to look for - `[closest, parent, children, find, prev, next, siblings]`, or can be jQuery element for find selector inside 4351 * @param {boolean} [notSelf] - ignore the current element, when searching for elements, for example in `document` using the same selector as the current element 4352 * 4353 * @name getMyElements 4354 * @param {string} dataKey 4355 * @param {string} selector 4356 * @param {string|jQuery} [direction='document'] 4357 * @param {boolean} [direction='document'] 4358 * @return {jQuery} 4359 * @sourceCode 4360 */ 4361 4362 jQuery.fn.getMyElements = function (dataKey, selector) { 4363 var direction = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'document'; 4364 var notSelf = arguments[3]; 4365 4366 /** @type {jQuery} */ 4367 var $element = this.eq(0); 4368 var keyIsSelector = typeof dataKey === 'string'; 4369 var $target = keyIsSelector ? $element.data(dataKey) : null; 4370 4371 if (!$target) { 4372 if (direction === 'document' || direction && direction.jquery) { 4373 if (direction.jquery) { 4374 $target = direction.find(selector); 4375 } else { 4376 $target = jQuery(selector); 4377 } 4378 if ($target.length && notSelf) { 4379 $target = $target.not($element); 4380 } 4381 } else { 4382 $target = $element[direction](selector); 4383 } 4384 $element.data(dataKey, $target); 4385 } 4386 4387 if (!$target.length) { 4388 $element.data(dataKey, null); 4389 } 4390 4391 return $target; 4392 }; 4393})(); 4394 4395/***/ }), 4396
vendor: 7,819 bytes, lines 4397-4751
4397/***/ "./node_modules/es6-promise-polyfill/promise.js": 4398/*!******************************************************!*\ 4399 !*** ./node_modules/es6-promise-polyfill/promise.js ***! 4400 \******************************************************/ 4401/*! no static exports found */ 4402/***/ (function(module, exports, __webpack_require__) { 4403 4404/* WEBPACK VAR INJECTION */(function(global, setImmediate) {var __WEBPACK_AMD_DEFINE_RESULT__;(function(global){ 4405 4406// 4407// Check for native Promise and it has correct interface 4408// 4409 4410var NativePromise = global['Promise']; 4411var nativePromiseSupported = 4412 NativePromise && 4413 // Some of these methods are missing from 4414 // Firefox/Chrome experimental implementations 4415 'resolve' in NativePromise && 4416 'reject' in NativePromise && 4417 'all' in NativePromise && 4418 'race' in NativePromise && 4419 // Older version of the spec had a resolver object 4420 // as the arg rather than a function 4421 (function(){ 4422 var resolve; 4423 new NativePromise(function(r){ resolve = r; }); 4424 return typeof resolve === 'function'; 4425 })(); 4426 4427 4428// 4429// export if necessary 4430// 4431 4432if ( true && exports) 4433{ 4434 // node.js 4435 exports.Promise = nativePromiseSupported ? NativePromise : Promise; 4436 exports.Polyfill = Promise; 4437} 4438else 4439{ 4440 // AMD 4441 if (true) 4442 { 4443 !(__WEBPACK_AMD_DEFINE_RESULT__ = (function(){ 4444 return nativePromiseSupported ? NativePromise : Promise; 4445 }).call(exports, __webpack_require__, exports, module), 4446 __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); 4447 } 4448 else 4449 {} 4450} 4451 4452 4453// 4454// Polyfill 4455// 4456 4457var PENDING = 'pending'; 4458var SEALED = 'sealed'; 4459var FULFILLED = 'fulfilled'; 4460var REJECTED = 'rejected'; 4461var NOOP = function(){}; 4462 4463function isArray(value) { 4464 return Object.prototype.toString.call(value) === '[object Array]'; 4465} 4466 4467// async calls 4468var asyncSetTimer = typeof setImmediate !== 'undefined' ? setImmediate : setTimeout; 4469var asyncQueue = []; 4470var asyncTimer; 4471 4472function asyncFlush(){ 4473 // run promise callbacks 4474 for (var i = 0; i < asyncQueue.length; i++) 4475 asyncQueue[i][0](asyncQueue[i][1]); 4476 4477 // reset async asyncQueue 4478 asyncQueue = []; 4479 asyncTimer = false; 4480} 4481 4482function asyncCall(callback, arg){ 4483 asyncQueue.push([callback, arg]); 4484 4485 if (!asyncTimer) 4486 { 4487 asyncTimer = true; 4488 asyncSetTimer(asyncFlush, 0); 4489 } 4490} 4491 4492 4493function invokeResolver(resolver, promise) { 4494 function resolvePromise(value) { 4495 resolve(promise, value); 4496 } 4497 4498 function rejectPromise(reason) { 4499 reject(promise, reason); 4500 } 4501 4502 try { 4503 resolver(resolvePromise, rejectPromise); 4504 } catch(e) { 4505 rejectPromise(e); 4506 } 4507} 4508 4509function invokeCallback(subscriber){ 4510 var owner = subscriber.owner; 4511 var settled = owner.state_; 4512 var value = owner.data_; 4513 var callback = subscriber[settled]; 4514 var promise = subscriber.then; 4515 4516 if (typeof callback === 'function') 4517 { 4518 settled = FULFILLED; 4519 try { 4520 value = callback(value); 4521 } catch(e) { 4522 reject(promise, e); 4523 } 4524 } 4525 4526 if (!handleThenable(promise, value)) 4527 { 4528 if (settled === FULFILLED) 4529 resolve(promise, value); 4530 4531 if (settled === REJECTED) 4532 reject(promise, value); 4533 } 4534} 4535 4536function handleThenable(promise, value) { 4537 var resolved; 4538 4539 try { 4540 if (promise === value) 4541 throw new TypeError('A promises callback cannot return that same promise.'); 4542 4543 if (value && (typeof value === 'function' || typeof value === 'object')) 4544 { 4545 var then = value.then; // then should be retrived only once 4546 4547 if (typeof then === 'function') 4548 { 4549 then.call(value, function(val){ 4550 if (!resolved) 4551 { 4552 resolved = true; 4553 4554 if (value !== val) 4555 resolve(promise, val); 4556 else 4557 fulfill(promise, val); 4558 } 4559 }, function(reason){ 4560 if (!resolved) 4561 { 4562 resolved = true; 4563 4564 reject(promise, reason); 4565 } 4566 }); 4567 4568 return true; 4569 } 4570 } 4571 } catch (e) { 4572 if (!resolved) 4573 reject(promise, e); 4574 4575 return true; 4576 } 4577 4578 return false; 4579} 4580 4581function resolve(promise, value){ 4582 if (promise === value || !handleThenable(promise, value)) 4583 fulfill(promise, value); 4584} 4585 4586function fulfill(promise, value){ 4587 if (promise.state_ === PENDING) 4588 { 4589 promise.state_ = SEALED; 4590 promise.data_ = value; 4591 4592 asyncCall(publishFulfillment, promise); 4593 } 4594} 4595 4596function reject(promise, reason){ 4597 if (promise.state_ === PENDING) 4598 { 4599 promise.state_ = SEALED; 4600 promise.data_ = reason; 4601 4602 asyncCall(publishRejection, promise); 4603 } 4604} 4605 4606function publish(promise) { 4607 var callbacks = promise.then_; 4608 promise.then_ = undefined; 4609 4610 for (var i = 0; i < callbacks.length; i++) { 4611 invokeCallback(callbacks[i]); 4612 } 4613} 4614 4615function publishFulfillment(promise){ 4616 promise.state_ = FULFILLED; 4617 publish(promise); 4618} 4619 4620function publishRejection(promise){ 4621 promise.state_ = REJECTED; 4622 publish(promise); 4623} 4624 4625/** 4626* @class 4627*/ 4628function Promise(resolver){ 4629 if (typeof resolver !== 'function') 4630 throw new TypeError('Promise constructor takes a function argument'); 4631 4632 if (this instanceof Promise === false) 4633 throw new TypeError('Failed to construct \'Promise\': Please use the \'new\' operator, this object constructor cannot be called as a function.'); 4634 4635 this.then_ = []; 4636 4637 invokeResolver(resolver, this); 4638} 4639 4640Promise.prototype = { 4641 constructor: Promise, 4642 4643 state_: PENDING, 4644 then_: null, 4645 data_: undefined, 4646 4647 then: function(onFulfillment, onRejection){ 4648 var subscriber = { 4649 owner: this, 4650 then: new this.constructor(NOOP), 4651 fulfilled: onFulfillment, 4652 rejected: onRejection 4653 }; 4654 4655 if (this.state_ === FULFILLED || this.state_ === REJECTED) 4656 { 4657 // already resolved, call callback async 4658 asyncCall(invokeCallback, subscriber); 4659 } 4660 else 4661 { 4662 // subscribe 4663 this.then_.push(subscriber); 4664 } 4665 4666 return subscriber.then; 4667 }, 4668 4669 'catch': function(onRejection) { 4670 return this.then(null, onRejection); 4671 } 4672}; 4673 4674Promise.all = function(promises){ 4675 var Class = this; 4676 4677 if (!isArray(promises)) 4678 throw new TypeError('You must pass an array to Promise.all().'); 4679 4680 return new Class(function(resolve, reject){ 4681 var results = []; 4682 var remaining = 0; 4683 4684 function resolver(index){ 4685 remaining++; 4686 return function(value){ 4687 results[index] = value; 4688 if (!--remaining) 4689 resolve(results); 4690 }; 4691 } 4692 4693 for (var i = 0, promise; i < promises.length; i++) 4694 { 4695 promise = promises[i]; 4696 4697 if (promise && typeof promise.then === 'function') 4698 promise.then(resolver(i), reject); 4699 else 4700 results[i] = promise; 4701 } 4702 4703 if (!remaining) 4704 resolve(results); 4705 }); 4706}; 4707 4708Promise.race = function(promises){ 4709 var Class = this; 4710 4711 if (!isArray(promises)) 4712 throw new TypeError('You must pass an array to Promise.race().'); 4713 4714 return new Class(function(resolve, reject) { 4715 for (var i = 0, promise; i < promises.length; i++) 4716 { 4717 promise = promises[i]; 4718 4719 if (promise && typeof promise.then === 'function') 4720 promise.then(resolve, reject); 4721 else 4722 resolve(promise); 4723 } 4724 }); 4725}; 4726 4727Promise.resolve = function(value){ 4728 var Class = this; 4729 4730 if (value && typeof value === 'object' && value.constructor === Class) 4731 return value; 4732 4733 return new Class(function(resolve){ 4734 resolve(value); 4735 }); 4736}; 4737 4738Promise.reject = function(reason){ 4739 var Class = this; 4740 4741 return new Class(function(resolve, reject){ 4742 reject(reason); 4743 }); 4744}; 4745 4746})(typeof window != 'undefined' ? window : typeof global != 'undefined' ? global : typeof self != 'undefined' ? self : this); 4747 4748/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"), __webpack_require__(/*! ./../timers-browserify/main.js */ "./node_modules/timers-browserify/main.js").setImmediate)) 4749 4750/***/ }), 4751
vendor: 16,563 bytes, lines 4752-5138
4752/***/ "./node_modules/jquery-snowfall/src/snowfall.jquery.js": 4753/*!*************************************************************!*\ 4754 !*** ./node_modules/jquery-snowfall/src/snowfall.jquery.js ***! 4755 \*************************************************************/ 4756/*! no static exports found */ 4757/***/ (function(module, exports) { 4758 4759/* Snowfall jquery plugin 4760 4761 ==================================================================== 4762 LICENSE 4763 ==================================================================== 4764 Licensed under the Apache License, Version 2.0 (the "License"); 4765 you may not use this file except in compliance with the License. 4766 You may obtain a copy of the License at 4767 4768 http://www.apache.org/licenses/LICENSE-2.0 4769 4770 Unless required by applicable law or agreed to in writing, software 4771 distributed under the License is distributed on an "AS IS" BASIS, 4772 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 4773 See the License for the specific language governing permissions and 4774 limitations under the License. 4775 ==================================================================== 4776 4777 Version 1.51 Dec 2nd 2012 4778 // fixed bug where snow collection didn't happen if a valid doctype was declared. 4779 4780 Version 1.5 Oct 5th 2011 4781 Added collecting snow! Uses the canvas element to collect snow. In order to initialize snow collection use the following 4782 4783 $(document).snowfall({collection : 'element'}); 4784 4785 element = any valid jquery selector. 4786 4787 The plugin then creates a canvas above every element that matches the selector, and collects the snow. If there are a varrying amount of elements the 4788 flakes get assigned a random one on start they will collide. 4789 4790 Version 1.4 Dec 8th 2010 4791 Fixed issues (I hope) with scroll bars flickering due to snow going over the edge of the screen. 4792 Added round snowflakes via css, will not work for any version of IE. - Thanks to Luke Barker of http://www.infinite-eye.com/ 4793 Added shadows as an option via css again will not work with IE. The idea behind shadows, is to show flakes on lighter colored web sites - Thanks Yutt 4794 4795 Version 1.3.1 Nov 25th 2010 4796 Updated script that caused flakes not to show at all if plugin was initialized with no options, also added the fixes that Han Bongers suggested 4797 4798 Developed by Jason Brown for any bugs or questions email me at loktar69@hotmail 4799 info on the plugin is located on Somethinghitme.com 4800 4801 values for snow options are 4802 4803 flakeCount, 4804 flakeColor, 4805 flakeIndex, 4806 minSize, 4807 maxSize, 4808 minSpeed, 4809 maxSpeed, 4810 round, true or false, makes the snowflakes rounded if the browser supports it. 4811 shadow true or false, gives the snowflakes a shadow if the browser supports it. 4812 4813 Example Usage : 4814 $(document).snowfall({flakeCount : 100, maxSpeed : 10}); 4815 4816 -or- 4817 4818 $('#element').snowfall({flakeCount : 800, maxSpeed : 5, maxSize : 5}); 4819 4820 -or with defaults- 4821 4822 $(document).snowfall(); 4823 4824 - To clear - 4825 $('#element').snowfall('clear'); 4826*/ 4827 4828// requestAnimationFrame polyfill from https://github.com/darius/requestAnimationFrame 4829if (!Date.now) 4830 Date.now = function() { return new Date().getTime(); }; 4831 4832(function() { 4833 'use strict'; 4834 4835 var vendors = ['webkit', 'moz']; 4836 for (var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i) { 4837 var vp = vendors[i]; 4838 window.requestAnimationFrame = window[vp+'RequestAnimationFrame']; 4839 window.cancelAnimationFrame = (window[vp+'CancelAnimationFrame'] 4840 || window[vp+'CancelRequestAnimationFrame']); 4841 } 4842 if (/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent) // iOS6 is buggy 4843 || !window.requestAnimationFrame || !window.cancelAnimationFrame) { 4844 var lastTime = 0; 4845 window.requestAnimationFrame = function(callback) { 4846 var now = Date.now(); 4847 var nextTime = Math.max(lastTime + 16, now); 4848 return setTimeout(function() { callback(lastTime = nextTime); }, 4849 nextTime - now); 4850 }; 4851 window.cancelAnimationFrame = clearTimeout; 4852 } 4853}()); 4854 4855(function($){ 4856 $.snowfall = function(element, options){ 4857 var flakes = [], 4858 defaults = { 4859 flakeCount : 35, 4860 flakeColor : '#ffffff', 4861 flakePosition: 'absolute', 4862 flakeIndex: 999999, 4863 minSize : 1, 4864 maxSize : 2, 4865 minSpeed : 1, 4866 maxSpeed : 5, 4867 round : false, 4868 shadow : false, 4869 collection : false, 4870 collectionHeight : 40, 4871 deviceorientation : false 4872 }, 4873 options = $.extend(defaults, options), 4874 random = function random(min, max){ 4875 return Math.round(min + Math.random()*(max-min)); 4876 }; 4877 4878 $(element).data("snowfall", this); 4879 4880 // Snow flake object 4881 function Flake(_x, _y, _size, _speed){ 4882 // Flake properties 4883 this.x = _x; 4884 this.y = _y; 4885 this.size = _size; 4886 this.speed = _speed; 4887 this.step = 0; 4888 this.stepSize = random(1,10) / 100; 4889 4890 if(options.collection){ 4891 this.target = canvasCollection[random(0,canvasCollection.length-1)]; 4892 } 4893 4894 var flakeMarkup = null; 4895 4896 if(options.image){ 4897 flakeMarkup = document.createElement("img"); 4898 flakeMarkup.src = options.image; 4899 }else{ 4900 flakeMarkup = document.createElement("div"); 4901 $(flakeMarkup).css({'background' : options.flakeColor}); 4902 } 4903 4904 $(flakeMarkup).attr({ 4905 'class': 'snowfall-flakes', 4906 }).css({ 4907 'width' : this.size, 4908 'height' : this.size, 4909 'position' : options.flakePosition, 4910 'top' : this.y, 4911 'left' : this.x, 4912 'fontSize' : 0, 4913 'zIndex' : options.flakeIndex 4914 }); 4915 4916 if($(element).get(0).tagName === $(document).get(0).tagName){ 4917 $('body').append($(flakeMarkup)); 4918 element = $('body'); 4919 }else{ 4920 $(element).append($(flakeMarkup)); 4921 } 4922 4923 this.element = flakeMarkup; 4924 4925 // Update function, used to update the snow flakes, and checks current snowflake against bounds 4926 this.update = function(){ 4927 this.y += this.speed; 4928 4929 if(this.y > (elHeight) - (this.size + 6)){ 4930 this.reset(); 4931 } 4932 4933 this.element.style.top = this.y + 'px'; 4934 this.element.style.left = this.x + 'px'; 4935 4936 this.step += this.stepSize; 4937 4938 if (doRatio === false) { 4939 this.x += Math.cos(this.step); 4940 } else { 4941 this.x += (doRatio + Math.cos(this.step)); 4942 } 4943 4944 // Pileup check 4945 if(options.collection){ 4946 if(this.x > this.target.x && this.x < this.target.width + this.target.x && this.y > this.target.y && this.y < this.target.height + this.target.y){ 4947 var ctx = this.target.element.getContext("2d"), 4948 curX = this.x - this.target.x, 4949 curY = this.y - this.target.y, 4950 colData = this.target.colData; 4951 4952 if(colData[parseInt(curX)][parseInt(curY+this.speed+this.size)] !== undefined || curY+this.speed+this.size > this.target.height){ 4953 if(curY+this.speed+this.size > this.target.height){ 4954 while(curY+this.speed+this.size > this.target.height && this.speed > 0){ 4955 this.speed *= .5; 4956 } 4957 4958 ctx.fillStyle = defaults.flakeColor; 4959 4960 if(colData[parseInt(curX)][parseInt(curY+this.speed+this.size)] == undefined){ 4961 colData[parseInt(curX)][parseInt(curY+this.speed+this.size)] = 1; 4962 ctx.fillRect(curX, (curY)+this.speed+this.size, this.size, this.size); 4963 }else{ 4964 colData[parseInt(curX)][parseInt(curY+this.speed)] = 1; 4965 ctx.fillRect(curX, curY+this.speed, this.size, this.size); 4966 } 4967 this.reset(); 4968 }else{ 4969 // flow to the sides 4970 this.speed = 1; 4971 this.stepSize = 0; 4972 4973 if(parseInt(curX)+1 < this.target.width && colData[parseInt(curX)+1][parseInt(curY)+1] == undefined ){ 4974 // go left 4975 this.x++; 4976 }else if(parseInt(curX)-1 > 0 && colData[parseInt(curX)-1][parseInt(curY)+1] == undefined ){ 4977 // go right 4978 this.x--; 4979 }else{ 4980 //stop 4981 ctx.fillStyle = defaults.flakeColor; 4982 ctx.fillRect(curX, curY, this.size, this.size); 4983 colData[parseInt(curX)][parseInt(curY)] = 1; 4984 this.reset(); 4985 } 4986 } 4987 } 4988 } 4989 } 4990 4991 if(this.x + this.size > (elWidth) - widthOffset || this.x < widthOffset){ 4992 this.reset(); 4993 } 4994 } 4995 4996 // Resets the snowflake once it reaches one of the bounds set 4997 this.reset = function(){ 4998 this.y = 0; 4999 this.x = random(widthOffset, elWidth - widthOffset); 5000 this.stepSize = random(1,10) / 100; 5001 this.size = random((options.minSize * 100), (options.maxSize * 100)) / 100; 5002 this.element.style.width = this.size + 'px'; 5003 this.element.style.height = this.size + 'px'; 5004 this.speed = random(options.minSpeed, options.maxSpeed); 5005 } 5006 } 5007 5008 // local vars 5009 var i = 0, 5010 elHeight = $(element).height(), 5011 elWidth = $(element).width(), 5012 widthOffset = 0, 5013 snowTimeout = 0; 5014 5015 // Collection Piece ****************************** 5016 if(options.collection !== false){ 5017 var testElem = document.createElement('canvas'); 5018 if(!!(testElem.getContext && testElem.getContext('2d'))){ 5019 var canvasCollection = [], 5020 elements = $(options.collection), 5021 collectionHeight = options.collectionHeight; 5022 5023 for(var i =0; i < elements.length; i++){ 5024 var bounds = elements[i].getBoundingClientRect(), 5025 $canvas = $('<canvas/>', 5026 { 5027 'class' : 'snowfall-canvas' 5028 }), 5029 collisionData = []; 5030 5031 if(bounds.top-collectionHeight > 0){ 5032 $('body').append($canvas); 5033 5034 $canvas.css({ 5035 'position' : options.flakePosition, 5036 'left' : bounds.left + 'px', 5037 'top' : bounds.top-collectionHeight + 'px' 5038 }) 5039 .prop({ 5040 width: bounds.width, 5041 height: collectionHeight 5042 }); 5043 5044 for(var w = 0; w < bounds.width; w++){ 5045 collisionData[w] = []; 5046 } 5047 5048 canvasCollection.push({ 5049 element : $canvas.get(0), 5050 x : bounds.left, 5051 y : bounds.top-collectionHeight, 5052 width : bounds.width, 5053 height: collectionHeight, 5054 colData : collisionData 5055 }); 5056 } 5057 } 5058 }else{ 5059 // Canvas element isnt supported 5060 options.collection = false; 5061 } 5062 } 5063 // ************************************************ 5064 5065 // This will reduce the horizontal scroll bar from displaying, when the effect is applied to the whole page 5066 if($(element).get(0).tagName === $(document).get(0).tagName){ 5067 widthOffset = 25; 5068 } 5069 5070 // Bind the window resize event so we can get the innerHeight again 5071 $(window).bind("resize", function(){ 5072 elHeight = $(element)[0].clientHeight; 5073 elWidth = $(element)[0].offsetWidth; 5074 }); 5075 5076 5077 // initialize the flakes 5078 for(i = 0; i < options.flakeCount; i+=1){ 5079 flakes.push(new Flake(random(widthOffset,elWidth - widthOffset), random(0, elHeight), random((options.minSize * 100), (options.maxSize * 100)) / 100, random(options.minSpeed, options.maxSpeed))); 5080 } 5081 5082 // This adds the style to make the snowflakes round via border radius property 5083 if(options.round){ 5084 $('.snowfall-flakes').css({'-moz-border-radius' : options.maxSize, '-webkit-border-radius' : options.maxSize, 'border-radius' : options.maxSize}); 5085 } 5086 5087 // This adds shadows just below the snowflake so they pop a bit on lighter colored web pages 5088 if(options.shadow){ 5089 $('.snowfall-flakes').css({'-moz-box-shadow' : '1px 1px 1px #555', '-webkit-box-shadow' : '1px 1px 1px #555', 'box-shadow' : '1px 1px 1px #555'}); 5090 } 5091 5092 // On newer Macbooks Snowflakes will fall based on deviceorientation 5093 var doRatio = false; 5094 if (options.deviceorientation) { 5095 $(window).bind('deviceorientation', function(event) { 5096 doRatio = event.originalEvent.gamma * 0.1; 5097 }); 5098 } 5099 5100 // this controls flow of the updating snow 5101 function snow(){ 5102 for( i = 0; i < flakes.length; i += 1){ 5103 flakes[i].update(); 5104 } 5105 5106 snowTimeout = requestAnimationFrame(function(){snow()}); 5107 } 5108 5109 snow(); 5110 5111 // clears the snowflakes 5112 this.clear = function(){ 5113 $('.snowfall-canvas').remove(); 5114 $(element).children('.snowfall-flakes').remove(); 5115 cancelAnimationFrame(snowTimeout); 5116 } 5117 }; 5118 5119 // Initialize the options and the plugin 5120 $.fn.snowfall = function(options){ 5121 if(typeof(options) == "object" || options == undefined){ 5122 return this.each(function(i){ 5123 (new $.snowfall(this, options)); 5124 }); 5125 }else if (typeof(options) == "string") { 5126 return this.each(function(i){ 5127 var snow = $(this).data('snowfall'); 5128 if(snow){ 5129 snow.clear(); 5130 } 5131 }); 5132 } 5133 }; 5134})(jQuery); 5135 5136 5137/***/ }), 5138
vendor: 11,282 bytes, lines 5139-5527
5139/***/ "./node_modules/lodash.debounce/index.js": 5140/*!***********************************************!*\ 5141 !*** ./node_modules/lodash.debounce/index.js ***! 5142 \***********************************************/ 5143/*! no static exports found */ 5144/***/ (function(module, exports, __webpack_require__) { 5145 5146/* WEBPACK VAR INJECTION */(function(global) {/** 5147 * lodash (Custom Build) <https://lodash.com/> 5148 * Build: `lodash modularize exports="npm" -o ./` 5149 * Copyright jQuery Foundation and other contributors <https://jquery.org/> 5150 * Released under MIT license <https://lodash.com/license> 5151 * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE> 5152 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors 5153 */ 5154 5155/** Used as the `TypeError` message for "Functions" methods. */ 5156var FUNC_ERROR_TEXT = 'Expected a function'; 5157 5158/** Used as references for various `Number` constants. */ 5159var NAN = 0 / 0; 5160 5161/** `Object#toString` result references. */ 5162var symbolTag = '[object Symbol]'; 5163 5164/** Used to match leading and trailing whitespace. */ 5165var reTrim = /^\s+|\s+$/g; 5166 5167/** Used to detect bad signed hexadecimal string values. */ 5168var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; 5169 5170/** Used to detect binary string values. */ 5171var reIsBinary = /^0b[01]+$/i; 5172 5173/** Used to detect octal string values. */ 5174var reIsOctal = /^0o[0-7]+$/i; 5175 5176/** Built-in method references without a dependency on `root`. */ 5177var freeParseInt = parseInt; 5178 5179/** Detect free variable `global` from Node.js. */ 5180var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; 5181 5182/** Detect free variable `self`. */ 5183var freeSelf = typeof self == 'object' && self && self.Object === Object && self; 5184 5185/** Used as a reference to the global object. */ 5186var root = freeGlobal || freeSelf || Function('return this')(); 5187 5188/** Used for built-in method references. */ 5189var objectProto = Object.prototype; 5190 5191/** 5192 * Used to resolve the 5193 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) 5194 * of values. 5195 */ 5196var objectToString = objectProto.toString; 5197 5198/* Built-in method references for those with the same name as other `lodash` methods. */ 5199var nativeMax = Math.max, 5200 nativeMin = Math.min; 5201 5202/** 5203 * Gets the timestamp of the number of milliseconds that have elapsed since 5204 * the Unix epoch (1 January 1970 00:00:00 UTC). 5205 * 5206 * @static 5207 * @memberOf _ 5208 * @since 2.4.0 5209 * @category Date 5210 * @returns {number} Returns the timestamp. 5211 * @example 5212 * 5213 * _.defer(function(stamp) { 5214 * console.log(_.now() - stamp); 5215 * }, _.now()); 5216 * // => Logs the number of milliseconds it took for the deferred invocation. 5217 */ 5218var now = function() { 5219 return root.Date.now(); 5220}; 5221 5222/** 5223 * Creates a debounced function that delays invoking `func` until after `wait` 5224 * milliseconds have elapsed since the last time the debounced function was 5225 * invoked. The debounced function comes with a `cancel` method to cancel 5226 * delayed `func` invocations and a `flush` method to immediately invoke them. 5227 * Provide `options` to indicate whether `func` should be invoked on the 5228 * leading and/or trailing edge of the `wait` timeout. The `func` is invoked 5229 * with the last arguments provided to the debounced function. Subsequent 5230 * calls to the debounced function return the result of the last `func` 5231 * invocation. 5232 * 5233 * **Note:** If `leading` and `trailing` options are `true`, `func` is 5234 * invoked on the trailing edge of the timeout only if the debounced function 5235 * is invoked more than once during the `wait` timeout. 5236 * 5237 * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred 5238 * until to the next tick, similar to `setTimeout` with a timeout of `0`. 5239 * 5240 * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) 5241 * for details over the differences between `_.debounce` and `_.throttle`. 5242 * 5243 * @static 5244 * @memberOf _ 5245 * @since 0.1.0 5246 * @category Function 5247 * @param {Function} func The function to debounce. 5248 * @param {number} [wait=0] The number of milliseconds to delay. 5249 * @param {Object} [options={}] The options object. 5250 * @param {boolean} [options.leading=false] 5251 * Specify invoking on the leading edge of the timeout. 5252 * @param {number} [options.maxWait] 5253 * The maximum time `func` is allowed to be delayed before it's invoked. 5254 * @param {boolean} [options.trailing=true] 5255 * Specify invoking on the trailing edge of the timeout. 5256 * @returns {Function} Returns the new debounced function. 5257 * @example 5258 * 5259 * // Avoid costly calculations while the window size is in flux. 5260 * jQuery(window).on('resize', _.debounce(calculateLayout, 150)); 5261 * 5262 * // Invoke `sendMail` when clicked, debouncing subsequent calls. 5263 * jQuery(element).on('click', _.debounce(sendMail, 300, { 5264 * 'leading': true, 5265 * 'trailing': false 5266 * })); 5267 * 5268 * // Ensure `batchLog` is invoked once after 1 second of debounced calls. 5269 * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 }); 5270 * var source = new EventSource('/stream'); 5271 * jQuery(source).on('message', debounced); 5272 * 5273 * // Cancel the trailing debounced invocation. 5274 * jQuery(window).on('popstate', debounced.cancel); 5275 */ 5276function debounce(func, wait, options) { 5277 var lastArgs, 5278 lastThis, 5279 maxWait, 5280 result, 5281 timerId, 5282 lastCallTime, 5283 lastInvokeTime = 0, 5284 leading = false, 5285 maxing = false, 5286 trailing = true; 5287 5288 if (typeof func != 'function') { 5289 throw new TypeError(FUNC_ERROR_TEXT); 5290 } 5291 wait = toNumber(wait) || 0; 5292 if (isObject(options)) { 5293 leading = !!options.leading; 5294 maxing = 'maxWait' in options; 5295 maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait; 5296 trailing = 'trailing' in options ? !!options.trailing : trailing; 5297 } 5298 5299 function invokeFunc(time) { 5300 var args = lastArgs, 5301 thisArg = lastThis; 5302 5303 lastArgs = lastThis = undefined; 5304 lastInvokeTime = time; 5305 result = func.apply(thisArg, args); 5306 return result; 5307 } 5308 5309 function leadingEdge(time) { 5310 // Reset any `maxWait` timer. 5311 lastInvokeTime = time; 5312 // Start the timer for the trailing edge. 5313 timerId = setTimeout(timerExpired, wait); 5314 // Invoke the leading edge. 5315 return leading ? invokeFunc(time) : result; 5316 } 5317 5318 function remainingWait(time) { 5319 var timeSinceLastCall = time - lastCallTime, 5320 timeSinceLastInvoke = time - lastInvokeTime, 5321 result = wait - timeSinceLastCall; 5322 5323 return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result; 5324 } 5325 5326 function shouldInvoke(time) { 5327 var timeSinceLastCall = time - lastCallTime, 5328 timeSinceLastInvoke = time - lastInvokeTime; 5329 5330 // Either this is the first call, activity has stopped and we're at the 5331 // trailing edge, the system time has gone backwards and we're treating 5332 // it as the trailing edge, or we've hit the `maxWait` limit. 5333 return (lastCallTime === undefined || (timeSinceLastCall >= wait) || 5334 (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait)); 5335 } 5336 5337 function timerExpired() { 5338 var time = now(); 5339 if (shouldInvoke(time)) { 5340 return trailingEdge(time); 5341 } 5342 // Restart the timer. 5343 timerId = setTimeout(timerExpired, remainingWait(time)); 5344 } 5345 5346 function trailingEdge(time) { 5347 timerId = undefined; 5348 5349 // Only invoke if we have `lastArgs` which means `func` has been 5350 // debounced at least once. 5351 if (trailing && lastArgs) { 5352 return invokeFunc(time); 5353 } 5354 lastArgs = lastThis = undefined; 5355 return result; 5356 } 5357 5358 function cancel() { 5359 if (timerId !== undefined) { 5360 clearTimeout(timerId); 5361 } 5362 lastInvokeTime = 0; 5363 lastArgs = lastCallTime = lastThis = timerId = undefined; 5364 } 5365 5366 function flush() { 5367 return timerId === undefined ? result : trailingEdge(now()); 5368 } 5369 5370 function debounced() { 5371 var time = now(), 5372 isInvoking = shouldInvoke(time); 5373 5374 lastArgs = arguments; 5375 lastThis = this; 5376 lastCallTime = time; 5377 5378 if (isInvoking) { 5379 if (timerId === undefined) { 5380 return leadingEdge(lastCallTime); 5381 } 5382 if (maxing) { 5383 // Handle invocations in a tight loop. 5384 timerId = setTimeout(timerExpired, wait); 5385 return invokeFunc(lastCallTime); 5386 } 5387 } 5388 if (timerId === undefined) { 5389 timerId = setTimeout(timerExpired, wait); 5390 } 5391 return result; 5392 } 5393 debounced.cancel = cancel; 5394 debounced.flush = flush; 5395 return debounced; 5396} 5397 5398/** 5399 * Checks if `value` is the 5400 * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) 5401 * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) 5402 * 5403 * @static 5404 * @memberOf _ 5405 * @since 0.1.0 5406 * @category Lang 5407 * @param {*} value The value to check. 5408 * @returns {boolean} Returns `true` if `value` is an object, else `false`. 5409 * @example 5410 * 5411 * _.isObject({}); 5412 * // => true 5413 * 5414 * _.isObject([1, 2, 3]); 5415 * // => true 5416 * 5417 * _.isObject(_.noop); 5418 * // => true 5419 * 5420 * _.isObject(null); 5421 * // => false 5422 */ 5423function isObject(value) { 5424 var type = typeof value; 5425 return !!value && (type == 'object' || type == 'function'); 5426} 5427 5428/** 5429 * Checks if `value` is object-like. A value is object-like if it's not `null` 5430 * and has a `typeof` result of "object". 5431 * 5432 * @static 5433 * @memberOf _ 5434 * @since 4.0.0 5435 * @category Lang 5436 * @param {*} value The value to check. 5437 * @returns {boolean} Returns `true` if `value` is object-like, else `false`. 5438 * @example 5439 * 5440 * _.isObjectLike({}); 5441 * // => true 5442 * 5443 * _.isObjectLike([1, 2, 3]); 5444 * // => true 5445 * 5446 * _.isObjectLike(_.noop); 5447 * // => false 5448 * 5449 * _.isObjectLike(null); 5450 * // => false 5451 */ 5452function isObjectLike(value) { 5453 return !!value && typeof value == 'object'; 5454} 5455 5456/** 5457 * Checks if `value` is classified as a `Symbol` primitive or object. 5458 * 5459 * @static 5460 * @memberOf _ 5461 * @since 4.0.0 5462 * @category Lang 5463 * @param {*} value The value to check. 5464 * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. 5465 * @example 5466 * 5467 * _.isSymbol(Symbol.iterator); 5468 * // => true 5469 * 5470 * _.isSymbol('abc'); 5471 * // => false 5472 */ 5473function isSymbol(value) { 5474 return typeof value == 'symbol' || 5475 (isObjectLike(value) && objectToString.call(value) == symbolTag); 5476} 5477 5478/** 5479 * Converts `value` to a number. 5480 * 5481 * @static 5482 * @memberOf _ 5483 * @since 4.0.0 5484 * @category Lang 5485 * @param {*} value The value to process. 5486 * @returns {number} Returns the number. 5487 * @example 5488 * 5489 * _.toNumber(3.2); 5490 * // => 3.2 5491 * 5492 * _.toNumber(Number.MIN_VALUE); 5493 * // => 5e-324 5494 * 5495 * _.toNumber(Infinity); 5496 * // => Infinity 5497 * 5498 * _.toNumber('3.2'); 5499 * // => 3.2 5500 */ 5501function toNumber(value) { 5502 if (typeof value == 'number') { 5503 return value; 5504 } 5505 if (isSymbol(value)) { 5506 return NAN; 5507 } 5508 if (isObject(value)) { 5509 var other = typeof value.valueOf == 'function' ? value.valueOf() : value; 5510 value = isObject(other) ? (other + '') : other; 5511 } 5512 if (typeof value != 'string') { 5513 return value === 0 ? value : +value; 5514 } 5515 value = value.replace(reTrim, ''); 5516 var isBinary = reIsBinary.test(value); 5517 return (isBinary || reIsOctal.test(value)) 5518 ? freeParseInt(value.slice(2), isBinary ? 2 : 8) 5519 : (reIsBadHex.test(value) ? NAN : +value); 5520} 5521 5522module.exports = debounce; 5523 5524/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) 5525 5526/***/ }), 5527
vendor: 1,138 bytes, lines 5528-5559
5528/***/ "./node_modules/mdn-polyfills/src/Object.assign/assign.js": 5529/*!****************************************************************!*\ 5530 !*** ./node_modules/mdn-polyfills/src/Object.assign/assign.js ***! 5531 \****************************************************************/ 5532/*! exports provided: default */ 5533/***/ (function(module, __webpack_exports__, __webpack_require__) { 5534 5535"use strict"; 5536__webpack_require__.r(__webpack_exports__); 5537/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return assign; }); 5538function assign(target) { 5539 if (target === undefined || target === null) { 5540 throw new TypeError('Cannot convert undefined or null to object'); 5541 } 5542 5543 const output = Object(target); 5544 for (let index = 1; index < arguments.length; index++) { 5545 const source = arguments[index]; 5546 if (source !== undefined && source !== null) { 5547 for (const nextKey in source) { 5548 if (source.hasOwnProperty(nextKey)) { 5549 output[nextKey] = source[nextKey]; 5550 } 5551 } 5552 } 5553 } 5554 return output; 5555} 5556 5557 5558/***/ }), 5559
vendor: 715 bytes, lines 5560-5578
5560/***/ "./node_modules/mdn-polyfills/src/Object.assign/index.js": 5561/*!***************************************************************!*\ 5562 !*** ./node_modules/mdn-polyfills/src/Object.assign/index.js ***! 5563 \***************************************************************/ 5564/*! no exports provided */ 5565/***/ (function(module, __webpack_exports__, __webpack_require__) { 5566 5567"use strict"; 5568__webpack_require__.r(__webpack_exports__); 5569/* harmony import */ var _assign__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./assign */ "./node_modules/mdn-polyfills/src/Object.assign/assign.js"); 5570 5571 5572if (typeof Object.assign !== 'function') { 5573 Object.assign = _assign__WEBPACK_IMPORTED_MODULE_0__["default"]; 5574} 5575 5576 5577/***/ }), 5578
vendor: 97,303 bytes, lines 5579-7925
5579/***/ "./node_modules/nouislider/dist/nouislider.mjs": 5580/*!*****************************************************!*\ 5581 !*** ./node_modules/nouislider/dist/nouislider.mjs ***! 5582 \*****************************************************/ 5583/*! exports provided: PipsMode, PipsType, create, cssClasses, default */ 5584/***/ (function(__webpack_module__, __webpack_exports__, __webpack_require__) { 5585 5586"use strict"; 5587__webpack_require__.r(__webpack_exports__); 5588/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PipsMode", function() { return PipsMode; }); 5589/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PipsType", function() { return PipsType; }); 5590/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "create", function() { return initialize; }); 5591/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cssClasses", function() { return cssClasses; }); 5592 5593var PipsMode; 5594(function (PipsMode) { 5595 PipsMode["Range"] = "range"; 5596 PipsMode["Steps"] = "steps"; 5597 PipsMode["Positions"] = "positions"; 5598 PipsMode["Count"] = "count"; 5599 PipsMode["Values"] = "values"; 5600})(PipsMode || (PipsMode = {})); 5601var PipsType; 5602(function (PipsType) { 5603 PipsType[PipsType["None"] = -1] = "None"; 5604 PipsType[PipsType["NoValue"] = 0] = "NoValue"; 5605 PipsType[PipsType["LargeValue"] = 1] = "LargeValue"; 5606 PipsType[PipsType["SmallValue"] = 2] = "SmallValue"; 5607})(PipsType || (PipsType = {})); 5608//region Helper Methods 5609function isValidFormatter(entry) { 5610 return isValidPartialFormatter(entry) && typeof entry.from === "function"; 5611} 5612function isValidPartialFormatter(entry) { 5613 // partial formatters only need a to function and not a from function 5614 return typeof entry === "object" && typeof entry.to === "function"; 5615} 5616function removeElement(el) { 5617 el.parentElement.removeChild(el); 5618} 5619function isSet(value) { 5620 return value !== null && value !== undefined; 5621} 5622// Bindable version 5623function preventDefault(e) { 5624 e.preventDefault(); 5625} 5626// Removes duplicates from an array. 5627function unique(array) { 5628 return array.filter(function (a) { 5629 return !this[a] ? (this[a] = true) : false; 5630 }, {}); 5631} 5632// Round a value to the closest 'to'. 5633function closest(value, to) { 5634 return Math.round(value / to) * to; 5635} 5636// Current position of an element relative to the document. 5637function offset(elem, orientation) { 5638 var rect = elem.getBoundingClientRect(); 5639 var doc = elem.ownerDocument; 5640 var docElem = doc.documentElement; 5641 var pageOffset = getPageOffset(doc); 5642 // getBoundingClientRect contains left scroll in Chrome on Android. 5643 // I haven't found a feature detection that proves this. Worst case 5644 // scenario on mis-match: the 'tap' feature on horizontal sliders breaks. 5645 if (/webkit.*Chrome.*Mobile/i.test(navigator.userAgent)) { 5646 pageOffset.x = 0; 5647 } 5648 return orientation ? rect.top + pageOffset.y - docElem.clientTop : rect.left + pageOffset.x - docElem.clientLeft; 5649} 5650// Checks whether a value is numerical. 5651function isNumeric(a) { 5652 return typeof a === "number" && !isNaN(a) && isFinite(a); 5653} 5654// Sets a class and removes it after [duration] ms. 5655function addClassFor(element, className, duration) { 5656 if (duration > 0) { 5657 addClass(element, className); 5658 setTimeout(function () { 5659 removeClass(element, className); 5660 }, duration); 5661 } 5662} 5663// Limits a value to 0 - 100 5664function limit(a) { 5665 return Math.max(Math.min(a, 100), 0); 5666} 5667// Wraps a variable as an array, if it isn't one yet. 5668// Note that an input array is returned by reference! 5669function asArray(a) { 5670 return Array.isArray(a) ? a : [a]; 5671} 5672// Counts decimals 5673function countDecimals(numStr) { 5674 numStr = String(numStr); 5675 var pieces = numStr.split("."); 5676 return pieces.length > 1 ? pieces[1].length : 0; 5677} 5678// http://youmightnotneedjquery.com/#add_class 5679function addClass(el, className) { 5680 if (el.classList && !/\s/.test(className)) { 5681 el.classList.add(className); 5682 } 5683 else { 5684 el.className += " " + className; 5685 } 5686} 5687// http://youmightnotneedjquery.com/#remove_class 5688function removeClass(el, className) { 5689 if (el.classList && !/\s/.test(className)) { 5690 el.classList.remove(className); 5691 } 5692 else { 5693 el.className = el.className.replace(new RegExp("(^|\\b)" + className.split(" ").join("|") + "(\\b|$)", "gi"), " "); 5694 } 5695} 5696// https://plainjs.com/javascript/attributes/adding-removing-and-testing-for-classes-9/ 5697function hasClass(el, className) { 5698 return el.classList ? el.classList.contains(className) : new RegExp("\\b" + className + "\\b").test(el.className); 5699} 5700// https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollY#Notes 5701function getPageOffset(doc) { 5702 var supportPageOffset = window.pageXOffset !== undefined; 5703 var isCSS1Compat = (doc.compatMode || "") === "CSS1Compat"; 5704 var x = supportPageOffset 5705 ? window.pageXOffset 5706 : isCSS1Compat 5707 ? doc.documentElement.scrollLeft 5708 : doc.body.scrollLeft; 5709 var y = supportPageOffset 5710 ? window.pageYOffset 5711 : isCSS1Compat 5712 ? doc.documentElement.scrollTop 5713 : doc.body.scrollTop; 5714 return { 5715 x: x, 5716 y: y, 5717 }; 5718} 5719// we provide a function to compute constants instead 5720// of accessing window.* as soon as the module needs it 5721// so that we do not compute anything if not needed 5722function getActions() { 5723 // Determine the events to bind. IE11 implements pointerEvents without 5724 // a prefix, which breaks compatibility with the IE10 implementation. 5725 return window.navigator.pointerEnabled 5726 ? { 5727 start: "pointerdown", 5728 move: "pointermove", 5729 end: "pointerup", 5730 } 5731 : window.navigator.msPointerEnabled 5732 ? { 5733 start: "MSPointerDown", 5734 move: "MSPointerMove", 5735 end: "MSPointerUp", 5736 } 5737 : { 5738 start: "mousedown touchstart", 5739 move: "mousemove touchmove", 5740 end: "mouseup touchend", 5741 }; 5742} 5743// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md 5744// Issue #785 5745function getSupportsPassive() { 5746 var supportsPassive = false; 5747 /* eslint-disable */ 5748 try { 5749 var opts = Object.defineProperty({}, "passive", { 5750 get: function () { 5751 supportsPassive = true; 5752 }, 5753 }); 5754 // @ts-ignore 5755 window.addEventListener("test", null, opts); 5756 } 5757 catch (e) { } 5758 /* eslint-enable */ 5759 return supportsPassive; 5760} 5761function getSupportsTouchActionNone() { 5762 return window.CSS && CSS.supports && CSS.supports("touch-action", "none"); 5763} 5764//endregion 5765//region Range Calculation 5766// Determine the size of a sub-range in relation to a full range. 5767function subRangeRatio(pa, pb) { 5768 return 100 / (pb - pa); 5769} 5770// (percentage) How many percent is this value of this range? 5771function fromPercentage(range, value, startRange) { 5772 return (value * 100) / (range[startRange + 1] - range[startRange]); 5773} 5774// (percentage) Where is this value on this range? 5775function toPercentage(range, value) { 5776 return fromPercentage(range, range[0] < 0 ? value + Math.abs(range[0]) : value - range[0], 0); 5777} 5778// (value) How much is this percentage on this range? 5779function isPercentage(range, value) { 5780 return (value * (range[1] - range[0])) / 100 + range[0]; 5781} 5782function getJ(value, arr) { 5783 var j = 1; 5784 while (value >= arr[j]) { 5785 j += 1; 5786 } 5787 return j; 5788} 5789// (percentage) Input a value, find where, on a scale of 0-100, it applies. 5790function toStepping(xVal, xPct, value) { 5791 if (value >= xVal.slice(-1)[0]) { 5792 return 100; 5793 } 5794 var j = getJ(value, xVal); 5795 var va = xVal[j - 1]; 5796 var vb = xVal[j]; 5797 var pa = xPct[j - 1]; 5798 var pb = xPct[j]; 5799 return pa + toPercentage([va, vb], value) / subRangeRatio(pa, pb); 5800} 5801// (value) Input a percentage, find where it is on the specified range. 5802function fromStepping(xVal, xPct, value) { 5803 // There is no range group that fits 100 5804 if (value >= 100) { 5805 return xVal.slice(-1)[0]; 5806 } 5807 var j = getJ(value, xPct); 5808 var va = xVal[j - 1]; 5809 var vb = xVal[j]; 5810 var pa = xPct[j - 1]; 5811 var pb = xPct[j]; 5812 return isPercentage([va, vb], (value - pa) * subRangeRatio(pa, pb)); 5813} 5814// (percentage) Get the step that applies at a certain value. 5815function getStep(xPct, xSteps, snap, value) { 5816 if (value === 100) { 5817 return value; 5818 } 5819 var j = getJ(value, xPct); 5820 var a = xPct[j - 1]; 5821 var b = xPct[j]; 5822 // If 'snap' is set, steps are used as fixed points on the slider. 5823 if (snap) { 5824 // Find the closest position, a or b. 5825 if (value - a > (b - a) / 2) { 5826 return b; 5827 } 5828 return a; 5829 } 5830 if (!xSteps[j - 1]) { 5831 return value; 5832 } 5833 return xPct[j - 1] + closest(value - xPct[j - 1], xSteps[j - 1]); 5834} 5835//endregion 5836//region Spectrum 5837var Spectrum = /** @class */ (function () { 5838 function Spectrum(entry, snap, singleStep) { 5839 this.xPct = []; 5840 this.xVal = []; 5841 this.xSteps = []; 5842 this.xNumSteps = []; 5843 this.xHighestCompleteStep = []; 5844 this.xSteps = [singleStep || false]; 5845 this.xNumSteps = [false]; 5846 this.snap = snap; 5847 var index; 5848 var ordered = []; 5849 // Map the object keys to an array. 5850 Object.keys(entry).forEach(function (index) { 5851 ordered.push([asArray(entry[index]), index]); 5852 }); 5853 // Sort all entries by value (numeric sort). 5854 ordered.sort(function (a, b) { 5855 return a[0][0] - b[0][0]; 5856 }); 5857 // Convert all entries to subranges. 5858 for (index = 0; index < ordered.length; index++) { 5859 this.handleEntryPoint(ordered[index][1], ordered[index][0]); 5860 } 5861 // Store the actual step values. 5862 // xSteps is sorted in the same order as xPct and xVal. 5863 this.xNumSteps = this.xSteps.slice(0); 5864 // Convert all numeric steps to the percentage of the subrange they represent. 5865 for (index = 0; index < this.xNumSteps.length; index++) { 5866 this.handleStepPoint(index, this.xNumSteps[index]); 5867 } 5868 } 5869 Spectrum.prototype.getDistance = function (value) { 5870 var distances = []; 5871 for (var index = 0; index < this.xNumSteps.length - 1; index++) { 5872 distances[index] = fromPercentage(this.xVal, value, index); 5873 } 5874 return distances; 5875 }; 5876 // Calculate the percentual distance over the whole scale of ranges. 5877 // direction: 0 = backwards / 1 = forwards 5878 Spectrum.prototype.getAbsoluteDistance = function (value, distances, direction) { 5879 var xPct_index = 0; 5880 // Calculate range where to start calculation 5881 if (value < this.xPct[this.xPct.length - 1]) { 5882 while (value > this.xPct[xPct_index + 1]) { 5883 xPct_index++; 5884 } 5885 } 5886 else if (value === this.xPct[this.xPct.length - 1]) { 5887 xPct_index = this.xPct.length - 2; 5888 } 5889 // If looking backwards and the value is exactly at a range separator then look one range further 5890 if (!direction && value === this.xPct[xPct_index + 1]) { 5891 xPct_index++; 5892 } 5893 if (distances === null) { 5894 distances = []; 5895 } 5896 var start_factor; 5897 var rest_factor = 1; 5898 var rest_rel_distance = distances[xPct_index]; 5899 var range_pct = 0; 5900 var rel_range_distance = 0; 5901 var abs_distance_counter = 0; 5902 var range_counter = 0; 5903 // Calculate what part of the start range the value is 5904 if (direction) { 5905 start_factor = (value - this.xPct[xPct_index]) / (this.xPct[xPct_index + 1] - this.xPct[xPct_index]); 5906 } 5907 else { 5908 start_factor = (this.xPct[xPct_index + 1] - value) / (this.xPct[xPct_index + 1] - this.xPct[xPct_index]); 5909 } 5910 // Do until the complete distance across ranges is calculated 5911 while (rest_rel_distance > 0) { 5912 // Calculate the percentage of total range 5913 range_pct = this.xPct[xPct_index + 1 + range_counter] - this.xPct[xPct_index + range_counter]; 5914 // Detect if the margin, padding or limit is larger then the current range and calculate 5915 if (distances[xPct_index + range_counter] * rest_factor + 100 - start_factor * 100 > 100) { 5916 // If larger then take the percentual distance of the whole range 5917 rel_range_distance = range_pct * start_factor; 5918 // Rest factor of relative percentual distance still to be calculated 5919 rest_factor = (rest_rel_distance - 100 * start_factor) / distances[xPct_index + range_counter]; 5920 // Set start factor to 1 as for next range it does not apply. 5921 start_factor = 1; 5922 } 5923 else { 5924 // If smaller or equal then take the percentual distance of the calculate percentual part of that range 5925 rel_range_distance = ((distances[xPct_index + range_counter] * range_pct) / 100) * rest_factor; 5926 // No rest left as the rest fits in current range 5927 rest_factor = 0; 5928 } 5929 if (direction) { 5930 abs_distance_counter = abs_distance_counter - rel_range_distance; 5931 // Limit range to first range when distance becomes outside of minimum range 5932 if (this.xPct.length + range_counter >= 1) { 5933 range_counter--; 5934 } 5935 } 5936 else { 5937 abs_distance_counter = abs_distance_counter + rel_range_distance; 5938 // Limit range to last range when distance becomes outside of maximum range 5939 if (this.xPct.length - range_counter >= 1) { 5940 range_counter++; 5941 } 5942 } 5943 // Rest of relative percentual distance still to be calculated 5944 rest_rel_distance = distances[xPct_index + range_counter] * rest_factor; 5945 } 5946 return value + abs_distance_counter; 5947 }; 5948 Spectrum.prototype.toStepping = function (value) { 5949 value = toStepping(this.xVal, this.xPct, value); 5950 return value; 5951 }; 5952 Spectrum.prototype.fromStepping = function (value) { 5953 return fromStepping(this.xVal, this.xPct, value); 5954 }; 5955 Spectrum.prototype.getStep = function (value) { 5956 value = getStep(this.xPct, this.xSteps, this.snap, value); 5957 return value; 5958 }; 5959 Spectrum.prototype.getDefaultStep = function (value, isDown, size) { 5960 var j = getJ(value, this.xPct); 5961 // When at the top or stepping down, look at the previous sub-range 5962 if (value === 100 || (isDown && value === this.xPct[j - 1])) { 5963 j = Math.max(j - 1, 1); 5964 } 5965 return (this.xVal[j] - this.xVal[j - 1]) / size; 5966 }; 5967 Spectrum.prototype.getNearbySteps = function (value) { 5968 var j = getJ(value, this.xPct); 5969 return { 5970 stepBefore: { 5971 startValue: this.xVal[j - 2], 5972 step: this.xNumSteps[j - 2], 5973 highestStep: this.xHighestCompleteStep[j - 2], 5974 }, 5975 thisStep: { 5976 startValue: this.xVal[j - 1], 5977 step: this.xNumSteps[j - 1], 5978 highestStep: this.xHighestCompleteStep[j - 1], 5979 }, 5980 stepAfter: { 5981 startValue: this.xVal[j], 5982 step: this.xNumSteps[j], 5983 highestStep: this.xHighestCompleteStep[j], 5984 }, 5985 }; 5986 }; 5987 Spectrum.prototype.countStepDecimals = function () { 5988 var stepDecimals = this.xNumSteps.map(countDecimals); 5989 return Math.max.apply(null, stepDecimals); 5990 }; 5991 Spectrum.prototype.hasNoSize = function () { 5992 return this.xVal[0] === this.xVal[this.xVal.length - 1]; 5993 }; 5994 // Outside testing 5995 Spectrum.prototype.convert = function (value) { 5996 return this.getStep(this.toStepping(value)); 5997 }; 5998 Spectrum.prototype.handleEntryPoint = function (index, value) { 5999 var percentage; 6000 // Covert min/max syntax to 0 and 100. 6001 if (index === "min") { 6002 percentage = 0; 6003 } 6004 else if (index === "max") { 6005 percentage = 100; 6006 } 6007 else { 6008 percentage = parseFloat(index); 6009 } 6010 // Check for correct input. 6011 if (!isNumeric(percentage) || !isNumeric(value[0])) { 6012 throw new Error("noUiSlider: 'range' value isn't numeric."); 6013 } 6014 // Store values. 6015 this.xPct.push(percentage); 6016 this.xVal.push(value[0]); 6017 var value1 = Number(value[1]); 6018 // NaN will evaluate to false too, but to keep 6019 // logging clear, set step explicitly. Make sure 6020 // not to override the 'step' setting with false. 6021 if (!percentage) { 6022 if (!isNaN(value1)) { 6023 this.xSteps[0] = value1; 6024 } 6025 } 6026 else { 6027 this.xSteps.push(isNaN(value1) ? false : value1); 6028 } 6029 this.xHighestCompleteStep.push(0); 6030 }; 6031 Spectrum.prototype.handleStepPoint = function (i, n) { 6032 // Ignore 'false' stepping. 6033 if (!n) { 6034 return; 6035 } 6036 // Step over zero-length ranges (#948); 6037 if (this.xVal[i] === this.xVal[i + 1]) { 6038 this.xSteps[i] = this.xHighestCompleteStep[i] = this.xVal[i]; 6039 return; 6040 } 6041 // Factor to range ratio 6042 this.xSteps[i] = 6043 fromPercentage([this.xVal[i], this.xVal[i + 1]], n, 0) / subRangeRatio(this.xPct[i], this.xPct[i + 1]); 6044 var totalSteps = (this.xVal[i + 1] - this.xVal[i]) / this.xNumSteps[i]; 6045 var highestStep = Math.ceil(Number(totalSteps.toFixed(3)) - 1); 6046 var step = this.xVal[i] + this.xNumSteps[i] * highestStep; 6047 this.xHighestCompleteStep[i] = step; 6048 }; 6049 return Spectrum; 6050}()); 6051//endregion 6052//region Options 6053/* Every input option is tested and parsed. This will prevent 6054 endless validation in internal methods. These tests are 6055 structured with an item for every option available. An 6056 option can be marked as required by setting the 'r' flag. 6057 The testing function is provided with three arguments: 6058 - The provided value for the option; 6059 - A reference to the options object; 6060 - The name for the option; 6061 6062 The testing function returns false when an error is detected, 6063 or true when everything is OK. It can also modify the option 6064 object, to make sure all values can be correctly looped elsewhere. */ 6065//region Defaults 6066var defaultFormatter = { 6067 to: function (value) { 6068 return value === undefined ? "" : value.toFixed(2); 6069 }, 6070 from: Number, 6071}; 6072var cssClasses = { 6073 target: "target", 6074 base: "base", 6075 origin: "origin", 6076 handle: "handle", 6077 handleLower: "handle-lower", 6078 handleUpper: "handle-upper", 6079 touchArea: "touch-area", 6080 horizontal: "horizontal", 6081 vertical: "vertical", 6082 background: "background", 6083 connect: "connect", 6084 connects: "connects", 6085 ltr: "ltr", 6086 rtl: "rtl", 6087 textDirectionLtr: "txt-dir-ltr", 6088 textDirectionRtl: "txt-dir-rtl", 6089 draggable: "draggable", 6090 drag: "state-drag", 6091 tap: "state-tap", 6092 active: "active", 6093 tooltip: "tooltip", 6094 pips: "pips", 6095 pipsHorizontal: "pips-horizontal", 6096 pipsVertical: "pips-vertical", 6097 marker: "marker", 6098 markerHorizontal: "marker-horizontal", 6099 markerVertical: "marker-vertical", 6100 markerNormal: "marker-normal", 6101 markerLarge: "marker-large", 6102 markerSub: "marker-sub", 6103 value: "value", 6104 valueHorizontal: "value-horizontal", 6105 valueVertical: "value-vertical", 6106 valueNormal: "value-normal", 6107 valueLarge: "value-large", 6108 valueSub: "value-sub", 6109}; 6110// Namespaces of internal event listeners 6111var INTERNAL_EVENT_NS = { 6112 tooltips: ".__tooltips", 6113 aria: ".__aria", 6114}; 6115//endregion 6116function testStep(parsed, entry) { 6117 if (!isNumeric(entry)) { 6118 throw new Error("noUiSlider: 'step' is not numeric."); 6119 } 6120 // The step option can still be used to set stepping 6121 // for linear sliders. Overwritten if set in 'range'. 6122 parsed.singleStep = entry; 6123} 6124function testKeyboardPageMultiplier(parsed, entry) { 6125 if (!isNumeric(entry)) { 6126 throw new Error("noUiSlider: 'keyboardPageMultiplier' is not numeric."); 6127 } 6128 parsed.keyboardPageMultiplier = entry; 6129} 6130function testKeyboardMultiplier(parsed, entry) { 6131 if (!isNumeric(entry)) { 6132 throw new Error("noUiSlider: 'keyboardMultiplier' is not numeric."); 6133 } 6134 parsed.keyboardMultiplier = entry; 6135} 6136function testKeyboardDefaultStep(parsed, entry) { 6137 if (!isNumeric(entry)) { 6138 throw new Error("noUiSlider: 'keyboardDefaultStep' is not numeric."); 6139 } 6140 parsed.keyboardDefaultStep = entry; 6141} 6142function testRange(parsed, entry) { 6143 // Filter incorrect input. 6144 if (typeof entry !== "object" || Array.isArray(entry)) { 6145 throw new Error("noUiSlider: 'range' is not an object."); 6146 } 6147 // Catch missing start or end. 6148 if (entry.min === undefined || entry.max === undefined) { 6149 throw new Error("noUiSlider: Missing 'min' or 'max' in 'range'."); 6150 } 6151 parsed.spectrum = new Spectrum(entry, parsed.snap || false, parsed.singleStep); 6152} 6153function testStart(parsed, entry) { 6154 entry = asArray(entry); 6155 // Validate input. Values aren't tested, as the public .val method 6156 // will always provide a valid location. 6157 if (!Array.isArray(entry) || !entry.length) { 6158 throw new Error("noUiSlider: 'start' option is incorrect."); 6159 } 6160 // Store the number of handles. 6161 parsed.handles = entry.length; 6162 // When the slider is initialized, the .val method will 6163 // be called with the start options. 6164 parsed.start = entry; 6165} 6166function testSnap(parsed, entry) { 6167 if (typeof entry !== "boolean") { 6168 throw new Error("noUiSlider: 'snap' option must be a boolean."); 6169 } 6170 // Enforce 100% stepping within subranges. 6171 parsed.snap = entry; 6172} 6173function testAnimate(parsed, entry) { 6174 if (typeof entry !== "boolean") { 6175 throw new Error("noUiSlider: 'animate' option must be a boolean."); 6176 } 6177 // Enforce 100% stepping within subranges. 6178 parsed.animate = entry; 6179} 6180function testAnimationDuration(parsed, entry) { 6181 if (typeof entry !== "number") { 6182 throw new Error("noUiSlider: 'animationDuration' option must be a number."); 6183 } 6184 parsed.animationDuration = entry; 6185} 6186function testConnect(parsed, entry) { 6187 var connect = [false]; 6188 var i; 6189 // Map legacy options 6190 if (entry === "lower") { 6191 entry = [true, false]; 6192 } 6193 else if (entry === "upper") { 6194 entry = [false, true]; 6195 } 6196 // Handle boolean options 6197 if (entry === true || entry === false) { 6198 for (i = 1; i < parsed.handles; i++) { 6199 connect.push(entry); 6200 } 6201 connect.push(false); 6202 } 6203 // Reject invalid input 6204 else if (!Array.isArray(entry) || !entry.length || entry.length !== parsed.handles + 1) { 6205 throw new Error("noUiSlider: 'connect' option doesn't match handle count."); 6206 } 6207 else { 6208 connect = entry; 6209 } 6210 parsed.connect = connect; 6211} 6212function testOrientation(parsed, entry) { 6213 // Set orientation to an a numerical value for easy 6214 // array selection. 6215 switch (entry) { 6216 case "horizontal": 6217 parsed.ort = 0; 6218 break; 6219 case "vertical": 6220 parsed.ort = 1; 6221 break; 6222 default: 6223 throw new Error("noUiSlider: 'orientation' option is invalid."); 6224 } 6225} 6226function testMargin(parsed, entry) { 6227 if (!isNumeric(entry)) { 6228 throw new Error("noUiSlider: 'margin' option must be numeric."); 6229 } 6230 // Issue #582 6231 if (entry === 0) { 6232 return; 6233 } 6234 parsed.margin = parsed.spectrum.getDistance(entry); 6235} 6236function testLimit(parsed, entry) { 6237 if (!isNumeric(entry)) { 6238 throw new Error("noUiSlider: 'limit' option must be numeric."); 6239 } 6240 parsed.limit = parsed.spectrum.getDistance(entry); 6241 if (!parsed.limit || parsed.handles < 2) { 6242 throw new Error("noUiSlider: 'limit' option is only supported on linear sliders with 2 or more handles."); 6243 } 6244} 6245function testPadding(parsed, entry) { 6246 var index; 6247 if (!isNumeric(entry) && !Array.isArray(entry)) { 6248 throw new Error("noUiSlider: 'padding' option must be numeric or array of exactly 2 numbers."); 6249 } 6250 if (Array.isArray(entry) && !(entry.length === 2 || isNumeric(entry[0]) || isNumeric(entry[1]))) { 6251 throw new Error("noUiSlider: 'padding' option must be numeric or array of exactly 2 numbers."); 6252 } 6253 if (entry === 0) { 6254 return; 6255 } 6256 if (!Array.isArray(entry)) { 6257 entry = [entry, entry]; 6258 } 6259 // 'getDistance' returns false for invalid values. 6260 parsed.padding = [parsed.spectrum.getDistance(entry[0]), parsed.spectrum.getDistance(entry[1])]; 6261 for (index = 0; index < parsed.spectrum.xNumSteps.length - 1; index++) { 6262 // last "range" can't contain step size as it is purely an endpoint. 6263 if (parsed.padding[0][index] < 0 || parsed.padding[1][index] < 0) { 6264 throw new Error("noUiSlider: 'padding' option must be a positive number(s)."); 6265 } 6266 } 6267 var totalPadding = entry[0] + entry[1]; 6268 var firstValue = parsed.spectrum.xVal[0]; 6269 var lastValue = parsed.spectrum.xVal[parsed.spectrum.xVal.length - 1]; 6270 if (totalPadding / (lastValue - firstValue) > 1) { 6271 throw new Error("noUiSlider: 'padding' option must not exceed 100% of the range."); 6272 } 6273} 6274function testDirection(parsed, entry) { 6275 // Set direction as a numerical value for easy parsing. 6276 // Invert connection for RTL sliders, so that the proper 6277 // handles get the connect/background classes. 6278 switch (entry) { 6279 case "ltr": 6280 parsed.dir = 0; 6281 break; 6282 case "rtl": 6283 parsed.dir = 1; 6284 break; 6285 default: 6286 throw new Error("noUiSlider: 'direction' option was not recognized."); 6287 } 6288} 6289function testBehaviour(parsed, entry) { 6290 // Make sure the input is a string. 6291 if (typeof entry !== "string") { 6292 throw new Error("noUiSlider: 'behaviour' must be a string containing options."); 6293 } 6294 // Check if the string contains any keywords. 6295 // None are required. 6296 var tap = entry.indexOf("tap") >= 0; 6297 var drag = entry.indexOf("drag") >= 0; 6298 var fixed = entry.indexOf("fixed") >= 0; 6299 var snap = entry.indexOf("snap") >= 0; 6300 var hover = entry.indexOf("hover") >= 0; 6301 var unconstrained = entry.indexOf("unconstrained") >= 0; 6302 var invertConnects = entry.indexOf("invert-connects") >= 0; 6303 var dragAll = entry.indexOf("drag-all") >= 0; 6304 var smoothSteps = entry.indexOf("smooth-steps") >= 0; 6305 if (fixed) { 6306 if (parsed.handles !== 2) { 6307 throw new Error("noUiSlider: 'fixed' behaviour must be used with 2 handles"); 6308 } 6309 // Use margin to enforce fixed state 6310 testMargin(parsed, parsed.start[1] - parsed.start[0]); 6311 } 6312 if (invertConnects && parsed.handles !== 2) { 6313 throw new Error("noUiSlider: 'invert-connects' behaviour must be used with 2 handles"); 6314 } 6315 if (unconstrained && (parsed.margin || parsed.limit)) { 6316 throw new Error("noUiSlider: 'unconstrained' behaviour cannot be used with margin or limit"); 6317 } 6318 parsed.events = { 6319 tap: tap || snap, 6320 drag: drag, 6321 dragAll: dragAll, 6322 smoothSteps: smoothSteps, 6323 fixed: fixed, 6324 snap: snap, 6325 hover: hover, 6326 unconstrained: unconstrained, 6327 invertConnects: invertConnects, 6328 }; 6329} 6330function testTooltips(parsed, entry) { 6331 if (entry === false) { 6332 return; 6333 } 6334 if (entry === true || isValidPartialFormatter(entry)) { 6335 parsed.tooltips = []; 6336 for (var i = 0; i < parsed.handles; i++) { 6337 parsed.tooltips.push(entry); 6338 } 6339 } 6340 else { 6341 entry = asArray(entry); 6342 if (entry.length !== parsed.handles) { 6343 throw new Error("noUiSlider: must pass a formatter for all handles."); 6344 } 6345 entry.forEach(function (formatter) { 6346 if (typeof formatter !== "boolean" && !isValidPartialFormatter(formatter)) { 6347 throw new Error("noUiSlider: 'tooltips' must be passed a formatter or 'false'."); 6348 } 6349 }); 6350 parsed.tooltips = entry; 6351 } 6352} 6353function testHandleAttributes(parsed, entry) { 6354 if (entry.length !== parsed.handles) { 6355 throw new Error("noUiSlider: must pass a attributes for all handles."); 6356 } 6357 parsed.handleAttributes = entry; 6358} 6359function testAriaFormat(parsed, entry) { 6360 if (!isValidPartialFormatter(entry)) { 6361 throw new Error("noUiSlider: 'ariaFormat' requires 'to' method."); 6362 } 6363 parsed.ariaFormat = entry; 6364} 6365function testFormat(parsed, entry) { 6366 if (!isValidFormatter(entry)) { 6367 throw new Error("noUiSlider: 'format' requires 'to' and 'from' methods."); 6368 } 6369 parsed.format = entry; 6370} 6371function testKeyboardSupport(parsed, entry) { 6372 if (typeof entry !== "boolean") { 6373 throw new Error("noUiSlider: 'keyboardSupport' option must be a boolean."); 6374 } 6375 parsed.keyboardSupport = entry; 6376} 6377function testDocumentElement(parsed, entry) { 6378 // This is an advanced option. Passed values are used without validation. 6379 parsed.documentElement = entry; 6380} 6381function testCssPrefix(parsed, entry) { 6382 if (typeof entry !== "string" && entry !== false) { 6383 throw new Error("noUiSlider: 'cssPrefix' must be a string or `false`."); 6384 } 6385 parsed.cssPrefix = entry; 6386} 6387function testCssClasses(parsed, entry) { 6388 if (typeof entry !== "object") { 6389 throw new Error("noUiSlider: 'cssClasses' must be an object."); 6390 } 6391 if (typeof parsed.cssPrefix === "string") { 6392 parsed.cssClasses = {}; 6393 Object.keys(entry).forEach(function (key) { 6394 parsed.cssClasses[key] = parsed.cssPrefix + entry[key]; 6395 }); 6396 } 6397 else { 6398 parsed.cssClasses = entry; 6399 } 6400} 6401// Test all developer settings and parse to assumption-safe values. 6402function testOptions(options) { 6403 // To prove a fix for #537, freeze options here. 6404 // If the object is modified, an error will be thrown. 6405 // Object.freeze(options); 6406 var parsed = { 6407 margin: null, 6408 limit: null, 6409 padding: null, 6410 animate: true, 6411 animationDuration: 300, 6412 ariaFormat: defaultFormatter, 6413 format: defaultFormatter, 6414 }; 6415 // Tests are executed in the order they are presented here. 6416 var tests = { 6417 step: { r: false, t: testStep }, 6418 keyboardPageMultiplier: { r: false, t: testKeyboardPageMultiplier }, 6419 keyboardMultiplier: { r: false, t: testKeyboardMultiplier }, 6420 keyboardDefaultStep: { r: false, t: testKeyboardDefaultStep }, 6421 start: { r: true, t: testStart }, 6422 connect: { r: true, t: testConnect }, 6423 direction: { r: true, t: testDirection }, 6424 snap: { r: false, t: testSnap }, 6425 animate: { r: false, t: testAnimate }, 6426 animationDuration: { r: false, t: testAnimationDuration }, 6427 range: { r: true, t: testRange }, 6428 orientation: { r: false, t: testOrientation }, 6429 margin: { r: false, t: testMargin }, 6430 limit: { r: false, t: testLimit }, 6431 padding: { r: false, t: testPadding }, 6432 behaviour: { r: true, t: testBehaviour }, 6433 ariaFormat: { r: false, t: testAriaFormat }, 6434 format: { r: false, t: testFormat }, 6435 tooltips: { r: false, t: testTooltips }, 6436 keyboardSupport: { r: true, t: testKeyboardSupport }, 6437 documentElement: { r: false, t: testDocumentElement }, 6438 cssPrefix: { r: true, t: testCssPrefix }, 6439 cssClasses: { r: true, t: testCssClasses }, 6440 handleAttributes: { r: false, t: testHandleAttributes }, 6441 }; 6442 var defaults = { 6443 connect: false, 6444 direction: "ltr", 6445 behaviour: "tap", 6446 orientation: "horizontal", 6447 keyboardSupport: true, 6448 cssPrefix: "noUi-", 6449 cssClasses: cssClasses, 6450 keyboardPageMultiplier: 5, 6451 keyboardMultiplier: 1, 6452 keyboardDefaultStep: 10, 6453 }; 6454 // AriaFormat defaults to regular format, if any. 6455 if (options.format && !options.ariaFormat) { 6456 options.ariaFormat = options.format; 6457 } 6458 // Run all options through a testing mechanism to ensure correct 6459 // input. It should be noted that options might get modified to 6460 // be handled properly. E.g. wrapping integers in arrays. 6461 Object.keys(tests).forEach(function (name) { 6462 // If the option isn't set, but it is required, throw an error. 6463 if (!isSet(options[name]) && defaults[name] === undefined) { 6464 if (tests[name].r) { 6465 throw new Error("noUiSlider: '" + name + "' is required."); 6466 } 6467 return; 6468 } 6469 tests[name].t(parsed, !isSet(options[name]) ? defaults[name] : options[name]); 6470 }); 6471 // Forward pips options 6472 parsed.pips = options.pips; 6473 // All recent browsers accept unprefixed transform. 6474 // We need -ms- for IE9 and -webkit- for older Android; 6475 // Assume use of -webkit- if unprefixed and -ms- are not supported. 6476 // https://caniuse.com/#feat=transforms2d 6477 var d = document.createElement("div"); 6478 var msPrefix = d.style.msTransform !== undefined; 6479 var noPrefix = d.style.transform !== undefined; 6480 parsed.transformRule = noPrefix ? "transform" : msPrefix ? "msTransform" : "webkitTransform"; 6481 // Pips don't move, so we can place them using left/top. 6482 var styles = [ 6483 ["left", "top"], 6484 ["right", "bottom"], 6485 ]; 6486 parsed.style = styles[parsed.dir][parsed.ort]; 6487 return parsed; 6488} 6489//endregion 6490function scope(target, options, originalOptions) { 6491 var actions = getActions(); 6492 var supportsTouchActionNone = getSupportsTouchActionNone(); 6493 var supportsPassive = supportsTouchActionNone && getSupportsPassive(); 6494 // All variables local to 'scope' are prefixed with 'scope_' 6495 // Slider DOM Nodes 6496 var scope_Target = target; 6497 var scope_Base; 6498 var scope_ConnectBase; 6499 var scope_Handles; 6500 var scope_Connects; 6501 var scope_Pips; 6502 var scope_Tooltips; 6503 // Slider state values 6504 var scope_Spectrum = options.spectrum; 6505 var scope_Values = []; 6506 var scope_Locations = []; 6507 var scope_HandleNumbers = []; 6508 var scope_ActiveHandlesCount = 0; 6509 var scope_Events = {}; 6510 var scope_ConnectsInverted = false; 6511 // Document Nodes 6512 var scope_Document = target.ownerDocument; 6513 var scope_DocumentElement = options.documentElement || scope_Document.documentElement; 6514 var scope_Body = scope_Document.body; 6515 // For horizontal sliders in standard ltr documents, 6516 // make .noUi-origin overflow to the left so the document doesn't scroll. 6517 var scope_DirOffset = scope_Document.dir === "rtl" || options.ort === 1 ? 0 : 100; 6518 // Creates a node, adds it to target, returns the new node. 6519 function addNodeTo(addTarget, className) { 6520 var div = scope_Document.createElement("div"); 6521 if (className) { 6522 addClass(div, className); 6523 } 6524 addTarget.appendChild(div); 6525 return div; 6526 } 6527 // Append a origin to the base 6528 function addOrigin(base, handleNumber) { 6529 var origin = addNodeTo(base, options.cssClasses.origin); 6530 var handle = addNodeTo(origin, options.cssClasses.handle); 6531 addNodeTo(handle, options.cssClasses.touchArea); 6532 handle.setAttribute("data-handle", String(handleNumber)); 6533 if (options.keyboardSupport) { 6534 // https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex 6535 // 0 = focusable and reachable 6536 handle.setAttribute("tabindex", "0"); 6537 handle.addEventListener("keydown", function (event) { 6538 return eventKeydown(event, handleNumber); 6539 }); 6540 } 6541 if (options.handleAttributes !== undefined) { 6542 var attributes_1 = options.handleAttributes[handleNumber]; 6543 Object.keys(attributes_1).forEach(function (attribute) { 6544 handle.setAttribute(attribute, attributes_1[attribute]); 6545 }); 6546 } 6547 handle.setAttribute("role", "slider"); 6548 handle.setAttribute("aria-orientation", options.ort ? "vertical" : "horizontal"); 6549 if (handleNumber === 0) { 6550 addClass(handle, options.cssClasses.handleLower); 6551 } 6552 else if (handleNumber === options.handles - 1) { 6553 addClass(handle, options.cssClasses.handleUpper); 6554 } 6555 origin.handle = handle; 6556 return origin; 6557 } 6558 // Insert nodes for connect elements 6559 function addConnect(base, add) { 6560 if (!add) { 6561 return false; 6562 } 6563 return addNodeTo(base, options.cssClasses.connect); 6564 } 6565 // Add handles to the slider base. 6566 function addElements(connectOptions, base) { 6567 scope_ConnectBase = addNodeTo(base, options.cssClasses.connects); 6568 scope_Handles = []; 6569 scope_Connects = []; 6570 scope_Connects.push(addConnect(scope_ConnectBase, connectOptions[0])); 6571 // [::::O====O====O====] 6572 // connectOptions = [0, 1, 1, 1] 6573 for (var i = 0; i < options.handles; i++) { 6574 // Keep a list of all added handles. 6575 scope_Handles.push(addOrigin(base, i)); 6576 scope_HandleNumbers[i] = i; 6577 scope_Connects.push(addConnect(scope_ConnectBase, connectOptions[i + 1])); 6578 } 6579 } 6580 // Initialize a single slider. 6581 function addSlider(addTarget) { 6582 // Apply classes and data to the target. 6583 addClass(addTarget, options.cssClasses.target); 6584 if (options.dir === 0) { 6585 addClass(addTarget, options.cssClasses.ltr); 6586 } 6587 else { 6588 addClass(addTarget, options.cssClasses.rtl); 6589 } 6590 if (options.ort === 0) { 6591 addClass(addTarget, options.cssClasses.horizontal); 6592 } 6593 else { 6594 addClass(addTarget, options.cssClasses.vertical); 6595 } 6596 var textDirection = getComputedStyle(addTarget).direction; 6597 if (textDirection === "rtl") { 6598 addClass(addTarget, options.cssClasses.textDirectionRtl); 6599 } 6600 else { 6601 addClass(addTarget, options.cssClasses.textDirectionLtr); 6602 } 6603 return addNodeTo(addTarget, options.cssClasses.base); 6604 } 6605 function addTooltip(handle, handleNumber) { 6606 if (!options.tooltips || !options.tooltips[handleNumber]) { 6607 return false; 6608 } 6609 return addNodeTo(handle.firstChild, options.cssClasses.tooltip); 6610 } 6611 function isSliderDisabled() { 6612 return scope_Target.hasAttribute("disabled"); 6613 } 6614 // Disable the slider dragging if any handle is disabled 6615 function isHandleDisabled(handleNumber) { 6616 var handleOrigin = scope_Handles[handleNumber]; 6617 return handleOrigin.hasAttribute("disabled"); 6618 } 6619 function disable(handleNumber) { 6620 if (handleNumber !== null && handleNumber !== undefined) { 6621 scope_Handles[handleNumber].setAttribute("disabled", ""); 6622 scope_Handles[handleNumber].handle.removeAttribute("tabindex"); 6623 } 6624 else { 6625 scope_Target.setAttribute("disabled", ""); 6626 scope_Handles.forEach(function (handle) { 6627 handle.handle.removeAttribute("tabindex"); 6628 }); 6629 } 6630 } 6631 function enable(handleNumber) { 6632 if (handleNumber !== null && handleNumber !== undefined) { 6633 scope_Handles[handleNumber].removeAttribute("disabled"); 6634 scope_Handles[handleNumber].handle.setAttribute("tabindex", "0"); 6635 } 6636 else { 6637 scope_Target.removeAttribute("disabled"); 6638 scope_Handles.forEach(function (handle) { 6639 handle.removeAttribute("disabled"); 6640 handle.handle.setAttribute("tabindex", "0"); 6641 }); 6642 } 6643 } 6644 function removeTooltips() { 6645 if (scope_Tooltips) { 6646 removeEvent("update" + INTERNAL_EVENT_NS.tooltips); 6647 scope_Tooltips.forEach(function (tooltip) { 6648 if (tooltip) { 6649 removeElement(tooltip); 6650 } 6651 }); 6652 scope_Tooltips = null; 6653 } 6654 } 6655 // The tooltips option is a shorthand for using the 'update' event. 6656 function tooltips() { 6657 removeTooltips(); 6658 // Tooltips are added with options.tooltips in original order. 6659 scope_Tooltips = scope_Handles.map(addTooltip); 6660 bindEvent("update" + INTERNAL_EVENT_NS.tooltips, function (values, handleNumber, unencoded) { 6661 if (!scope_Tooltips || !options.tooltips) { 6662 return; 6663 } 6664 if (scope_Tooltips[handleNumber] === false) { 6665 return; 6666 } 6667 var formattedValue = values[handleNumber]; 6668 if (options.tooltips[handleNumber] !== true) { 6669 formattedValue = options.tooltips[handleNumber].to(unencoded[handleNumber]); 6670 } 6671 scope_Tooltips[handleNumber].innerHTML = formattedValue; 6672 }); 6673 } 6674 function aria() { 6675 removeEvent("update" + INTERNAL_EVENT_NS.aria); 6676 bindEvent("update" + INTERNAL_EVENT_NS.aria, function (values, handleNumber, unencoded, tap, positions) { 6677 // Update Aria Values for all handles, as a change in one changes min and max values for the next. 6678 scope_HandleNumbers.forEach(function (index) { 6679 var handle = scope_Handles[index]; 6680 var min = checkHandlePosition(scope_Locations, index, 0, true, true, true); 6681 var max = checkHandlePosition(scope_Locations, index, 100, true, true, true); 6682 var now = positions[index]; 6683 // Formatted value for display 6684 var text = String(options.ariaFormat.to(unencoded[index])); 6685 // Map to slider range values 6686 min = scope_Spectrum.fromStepping(min).toFixed(1); 6687 max = scope_Spectrum.fromStepping(max).toFixed(1); 6688 now = scope_Spectrum.fromStepping(now).toFixed(1); 6689 handle.children[0].setAttribute("aria-valuemin", min); 6690 handle.children[0].setAttribute("aria-valuemax", max); 6691 handle.children[0].setAttribute("aria-valuenow", now); 6692 handle.children[0].setAttribute("aria-valuetext", text); 6693 }); 6694 }); 6695 } 6696 function getGroup(pips) { 6697 // Use the range. 6698 if (pips.mode === PipsMode.Range || pips.mode === PipsMode.Steps) { 6699 return scope_Spectrum.xVal; 6700 } 6701 if (pips.mode === PipsMode.Count) { 6702 if (pips.values < 2) { 6703 throw new Error("noUiSlider: 'values' (>= 2) required for mode 'count'."); 6704 } 6705 // Divide 0 - 100 in 'count' parts. 6706 var interval = pips.values - 1; 6707 var spread = 100 / interval; 6708 var values = []; 6709 // List these parts and have them handled as 'positions'. 6710 while (interval--) { 6711 values[interval] = interval * spread; 6712 } 6713 values.push(100); 6714 return mapToRange(values, pips.stepped); 6715 } 6716 if (pips.mode === PipsMode.Positions) { 6717 // Map all percentages to on-range values. 6718 return mapToRange(pips.values, pips.stepped); 6719 } 6720 if (pips.mode === PipsMode.Values) { 6721 // If the value must be stepped, it needs to be converted to a percentage first. 6722 if (pips.stepped) { 6723 return pips.values.map(function (value) { 6724 // Convert to percentage, apply step, return to value. 6725 return scope_Spectrum.fromStepping(scope_Spectrum.getStep(scope_Spectrum.toStepping(value))); 6726 }); 6727 } 6728 // Otherwise, we can simply use the values. 6729 return pips.values; 6730 } 6731 return []; // pips.mode = never 6732 } 6733 function mapToRange(values, stepped) { 6734 return values.map(function (value) { 6735 return scope_Spectrum.fromStepping(stepped ? scope_Spectrum.getStep(value) : value); 6736 }); 6737 } 6738 function generateSpread(pips) { 6739 function safeIncrement(value, increment) { 6740 // Avoid floating point variance by dropping the smallest decimal places. 6741 return Number((value + increment).toFixed(7)); 6742 } 6743 var group = getGroup(pips); 6744 var indexes = {}; 6745 var firstInRange = scope_Spectrum.xVal[0]; 6746 var lastInRange = scope_Spectrum.xVal[scope_Spectrum.xVal.length - 1]; 6747 var ignoreFirst = false; 6748 var ignoreLast = false; 6749 var prevPct = 0; 6750 // Create a copy of the group, sort it and filter away all duplicates. 6751 group = unique(group.slice().sort(function (a, b) { 6752 return a - b; 6753 })); 6754 // Make sure the range starts with the first element. 6755 if (group[0] !== firstInRange) { 6756 group.unshift(firstInRange); 6757 ignoreFirst = true; 6758 } 6759 // Likewise for the last one. 6760 if (group[group.length - 1] !== lastInRange) { 6761 group.push(lastInRange); 6762 ignoreLast = true; 6763 } 6764 group.forEach(function (current, index) { 6765 // Get the current step and the lower + upper positions. 6766 var step; 6767 var i; 6768 var q; 6769 var low = current; 6770 var high = group[index + 1]; 6771 var newPct; 6772 var pctDifference; 6773 var pctPos; 6774 var type; 6775 var steps; 6776 var realSteps; 6777 var stepSize; 6778 var isSteps = pips.mode === PipsMode.Steps; 6779 // When using 'steps' mode, use the provided steps. 6780 // Otherwise, we'll step on to the next subrange. 6781 if (isSteps) { 6782 step = scope_Spectrum.xNumSteps[index]; 6783 } 6784 // Default to a 'full' step. 6785 if (!step) { 6786 step = high - low; 6787 } 6788 // If high is undefined we are at the last subrange. Make sure it iterates once (#1088) 6789 if (high === undefined) { 6790 high = low; 6791 } 6792 // Make sure step isn't 0, which would cause an infinite loop (#654) 6793 step = Math.max(step, 0.0000001); 6794 // Find all steps in the subrange. 6795 for (i = low; i <= high; i = safeIncrement(i, step)) { 6796 // Get the percentage value for the current step, 6797 // calculate the size for the subrange. 6798 newPct = scope_Spectrum.toStepping(i); 6799 pctDifference = newPct - prevPct; 6800 steps = pctDifference / (pips.density || 1); 6801 realSteps = Math.round(steps); 6802 // This ratio represents the amount of percentage-space a point indicates. 6803 // For a density 1 the points/percentage = 1. For density 2, that percentage needs to be re-divided. 6804 // Round the percentage offset to an even number, then divide by two 6805 // to spread the offset on both sides of the range. 6806 stepSize = pctDifference / realSteps; 6807 // Divide all points evenly, adding the correct number to this subrange. 6808 // Run up to <= so that 100% gets a point, event if ignoreLast is set. 6809 for (q = 1; q <= realSteps; q += 1) { 6810 // The ratio between the rounded value and the actual size might be ~1% off. 6811 // Correct the percentage offset by the number of points 6812 // per subrange. density = 1 will result in 100 points on the 6813 // full range, 2 for 50, 4 for 25, etc. 6814 pctPos = prevPct + q * stepSize; 6815 indexes[pctPos.toFixed(5)] = [scope_Spectrum.fromStepping(pctPos), 0]; 6816 } 6817 // Determine the point type. 6818 type = group.indexOf(i) > -1 ? PipsType.LargeValue : isSteps ? PipsType.SmallValue : PipsType.NoValue; 6819 // Enforce the 'ignoreFirst' option by overwriting the type for 0. 6820 if (!index && ignoreFirst && i !== high) { 6821 type = 0; 6822 } 6823 if (!(i === high && ignoreLast)) { 6824 // Mark the 'type' of this point. 0 = plain, 1 = real value, 2 = step value. 6825 indexes[newPct.toFixed(5)] = [i, type]; 6826 } 6827 // Update the percentage count. 6828 prevPct = newPct; 6829 } 6830 }); 6831 return indexes; 6832 } 6833 function addMarking(spread, filterFunc, formatter) { 6834 var _a, _b; 6835 var element = scope_Document.createElement("div"); 6836 var valueSizeClasses = (_a = {}, 6837 _a[PipsType.None] = "", 6838 _a[PipsType.NoValue] = options.cssClasses.valueNormal, 6839 _a[PipsType.LargeValue] = options.cssClasses.valueLarge, 6840 _a[PipsType.SmallValue] = options.cssClasses.valueSub, 6841 _a); 6842 var markerSizeClasses = (_b = {}, 6843 _b[PipsType.None] = "", 6844 _b[PipsType.NoValue] = options.cssClasses.markerNormal, 6845 _b[PipsType.LargeValue] = options.cssClasses.markerLarge, 6846 _b[PipsType.SmallValue] = options.cssClasses.markerSub, 6847 _b); 6848 var valueOrientationClasses = [options.cssClasses.valueHorizontal, options.cssClasses.valueVertical]; 6849 var markerOrientationClasses = [options.cssClasses.markerHorizontal, options.cssClasses.markerVertical]; 6850 addClass(element, options.cssClasses.pips); 6851 addClass(element, options.ort === 0 ? options.cssClasses.pipsHorizontal : options.cssClasses.pipsVertical); 6852 function getClasses(type, source) { 6853 var a = source === options.cssClasses.value; 6854 var orientationClasses = a ? valueOrientationClasses : markerOrientationClasses; 6855 var sizeClasses = a ? valueSizeClasses : markerSizeClasses; 6856 return source + " " + orientationClasses[options.ort] + " " + sizeClasses[type]; 6857 } 6858 function addSpread(offset, value, type) { 6859 // Apply the filter function, if it is set. 6860 type = filterFunc ? filterFunc(value, type) : type; 6861 if (type === PipsType.None) { 6862 return; 6863 } 6864 // Add a marker for every point 6865 var node = addNodeTo(element, false); 6866 node.className = getClasses(type, options.cssClasses.marker); 6867 node.style[options.style] = offset + "%"; 6868 // Values are only appended for points marked '1' or '2'. 6869 if (type > PipsType.NoValue) { 6870 node = addNodeTo(element, false); 6871 node.className = getClasses(type, options.cssClasses.value); 6872 node.setAttribute("data-value", String(value)); 6873 node.style[options.style] = offset + "%"; 6874 node.innerHTML = String(formatter.to(value)); 6875 } 6876 } 6877 // Append all points. 6878 Object.keys(spread).forEach(function (offset) { 6879 addSpread(offset, spread[offset][0], spread[offset][1]); 6880 }); 6881 return element; 6882 } 6883 function removePips() { 6884 if (scope_Pips) { 6885 removeElement(scope_Pips); 6886 scope_Pips = null; 6887 } 6888 } 6889 function pips(pips) { 6890 // Fix #669 6891 removePips(); 6892 var spread = generateSpread(pips); 6893 var filter = pips.filter; 6894 var format = pips.format || { 6895 to: function (value) { 6896 return String(Math.round(value)); 6897 }, 6898 }; 6899 scope_Pips = scope_Target.appendChild(addMarking(spread, filter, format)); 6900 return scope_Pips; 6901 } 6902 // Shorthand for base dimensions. 6903 function baseSize() { 6904 var rect = scope_Base.getBoundingClientRect(); 6905 var alt = ("offset" + ["Width", "Height"][options.ort]); 6906 return options.ort === 0 ? rect.width || scope_Base[alt] : rect.height || scope_Base[alt]; 6907 } 6908 // Handler for attaching events trough a proxy. 6909 function attachEvent(events, element, callback, data) { 6910 // This function can be used to 'filter' events to the slider. 6911 // element is a node, not a nodeList 6912 var method = function (event) { 6913 var e = fixEvent(event, data.pageOffset, data.target || element); 6914 // fixEvent returns false if this event has a different target 6915 // when handling (multi-) touch events; 6916 if (!e) { 6917 return false; 6918 } 6919 // doNotReject is passed by all end events to make sure released touches 6920 // are not rejected, leaving the slider "stuck" to the cursor; 6921 if (isSliderDisabled() && !data.doNotReject) { 6922 return false; 6923 } 6924 // Stop if an active 'tap' transition is taking place. 6925 if (hasClass(scope_Target, options.cssClasses.tap) && !data.doNotReject) { 6926 return false; 6927 } 6928 // Ignore right or middle clicks on start #454 6929 if (events === actions.start && e.buttons !== undefined && e.buttons > 1) { 6930 return false; 6931 } 6932 // Ignore right or middle clicks on start #454 6933 if (data.hover && e.buttons) { 6934 return false; 6935 } 6936 // 'supportsPassive' is only true if a browser also supports touch-action: none in CSS. 6937 // iOS safari does not, so it doesn't get to benefit from passive scrolling. iOS does support 6938 // touch-action: manipulation, but that allows panning, which breaks 6939 // sliders after zooming/on non-responsive pages. 6940 // See: https://bugs.webkit.org/show_bug.cgi?id=133112 6941 if (!supportsPassive) { 6942 e.preventDefault(); 6943 } 6944 e.calcPoint = e.points[options.ort]; 6945 // Call the event handler with the event [ and additional data ]. 6946 callback(e, data); 6947 return; 6948 }; 6949 var methods = []; 6950 // Bind a closure on the target for every event type. 6951 events.split(" ").forEach(function (eventName) { 6952 element.addEventListener(eventName, method, supportsPassive ? { passive: true } : false); 6953 methods.push([eventName, method]); 6954 }); 6955 return methods; 6956 } 6957 // Provide a clean event with standardized offset values. 6958 function fixEvent(e, pageOffset, eventTarget) { 6959 // Filter the event to register the type, which can be 6960 // touch, mouse or pointer. Offset changes need to be 6961 // made on an event specific basis. 6962 var touch = e.type.indexOf("touch") === 0; 6963 var mouse = e.type.indexOf("mouse") === 0; 6964 var pointer = e.type.indexOf("pointer") === 0; 6965 var x = 0; 6966 var y = 0; 6967 // IE10 implemented pointer events with a prefix; 6968 if (e.type.indexOf("MSPointer") === 0) { 6969 pointer = true; 6970 } 6971 // Erroneous events seem to be passed in occasionally on iOS/iPadOS after user finishes interacting with 6972 // the slider. They appear to be of type MouseEvent, yet they don't have usual properties set. Ignore 6973 // events that have no touches or buttons associated with them. (#1057, #1079, #1095) 6974 if (e.type === "mousedown" && !e.buttons && !e.touches) { 6975 return false; 6976 } 6977 // The only thing one handle should be concerned about is the touches that originated on top of it. 6978 if (touch) { 6979 // Returns true if a touch originated on the target. 6980 var isTouchOnTarget = function (checkTouch) { 6981 var target = checkTouch.target; 6982 return (target === eventTarget || 6983 eventTarget.contains(target) || 6984 (e.composed && e.composedPath().shift() === eventTarget)); 6985 }; 6986 // In the case of touchstart events, we need to make sure there is still no more than one 6987 // touch on the target so we look amongst all touches. 6988 if (e.type === "touchstart") { 6989 var targetTouches = Array.prototype.filter.call(e.touches, isTouchOnTarget); 6990 // Do not support more than one touch per handle. 6991 if (targetTouches.length > 1) { 6992 return false; 6993 } 6994 x = targetTouches[0].pageX; 6995 y = targetTouches[0].pageY; 6996 } 6997 else { 6998 // In the other cases, find on changedTouches is enough. 6999 var targetTouch = Array.prototype.find.call(e.changedTouches, isTouchOnTarget); 7000 // Cancel if the target touch has not moved. 7001 if (!targetTouch) { 7002 return false; 7003 } 7004 x = targetTouch.pageX; 7005 y = targetTouch.pageY; 7006 } 7007 } 7008 pageOffset = pageOffset || getPageOffset(scope_Document); 7009 if (mouse || pointer) { 7010 x = e.clientX + pageOffset.x; 7011 y = e.clientY + pageOffset.y; 7012 } 7013 e.pageOffset = pageOffset; 7014 e.points = [x, y]; 7015 e.cursor = mouse || pointer; // Fix #435 7016 return e; 7017 } 7018 // Translate a coordinate in the document to a percentage on the slider 7019 function calcPointToPercentage(calcPoint) { 7020 var location = calcPoint - offset(scope_Base, options.ort); 7021 var proposal = (location * 100) / baseSize(); 7022 // Clamp proposal between 0% and 100% 7023 // Out-of-bound coordinates may occur when .noUi-base pseudo-elements 7024 // are used (e.g. contained handles feature) 7025 proposal = limit(proposal); 7026 return options.dir ? 100 - proposal : proposal; 7027 } 7028 // Find handle closest to a certain percentage on the slider 7029 function getClosestHandle(clickedPosition) { 7030 var smallestDifference = 100; 7031 var handleNumber = false; 7032 scope_Handles.forEach(function (handle, index) { 7033 // Disabled handles are ignored 7034 if (isHandleDisabled(index)) { 7035 return; 7036 } 7037 var handlePosition = scope_Locations[index]; 7038 var differenceWithThisHandle = Math.abs(handlePosition - clickedPosition); 7039 // Initial state 7040 var clickAtEdge = differenceWithThisHandle === 100 && smallestDifference === 100; 7041 // Difference with this handle is smaller than the previously checked handle 7042 var isCloser = differenceWithThisHandle < smallestDifference; 7043 var isCloserAfter = differenceWithThisHandle <= smallestDifference && clickedPosition > handlePosition; 7044 if (isCloser || isCloserAfter || clickAtEdge) { 7045 handleNumber = index; 7046 smallestDifference = differenceWithThisHandle; 7047 } 7048 }); 7049 return handleNumber; 7050 } 7051 // Fire 'end' when a mouse or pen leaves the document. 7052 function documentLeave(event, data) { 7053 if (event.type === "mouseout" && 7054 event.target.nodeName === "HTML" && 7055 event.relatedTarget === null) { 7056 eventEnd(event, data); 7057 } 7058 } 7059 // Handle movement on document for handle and range drag. 7060 function eventMove(event, data) { 7061 // Fix #498 7062 // Check value of .buttons in 'start' to work around a bug in IE10 mobile (data.buttonsProperty). 7063 // https://connect.microsoft.com/IE/feedback/details/927005/mobile-ie10-windows-phone-buttons-property-of-pointermove-event-always-zero 7064 // IE9 has .buttons and .which zero on mousemove. 7065 // Firefox breaks the spec MDN defines. 7066 if (navigator.appVersion.indexOf("MSIE 9") === -1 && event.buttons === 0 && data.buttonsProperty !== 0) { 7067 return eventEnd(event, data); 7068 } 7069 // Check if we are moving up or down 7070 var movement = (options.dir ? -1 : 1) * (event.calcPoint - data.startCalcPoint); 7071 // Convert the movement into a percentage of the slider width/height 7072 var proposal = (movement * 100) / data.baseSize; 7073 moveHandles(movement > 0, proposal, data.locations, data.handleNumbers, data.connect); 7074 } 7075 // Unbind move events on document, call callbacks. 7076 function eventEnd(event, data) { 7077 // The handle is no longer active, so remove the class. 7078 if (data.handle) { 7079 removeClass(data.handle, options.cssClasses.active); 7080 scope_ActiveHandlesCount -= 1; 7081 } 7082 // Unbind the move and end events, which are added on 'start'. 7083 data.listeners.forEach(function (c) { 7084 scope_DocumentElement.removeEventListener(c[0], c[1]); 7085 }); 7086 if (scope_ActiveHandlesCount === 0) { 7087 // Remove dragging class. 7088 removeClass(scope_Target, options.cssClasses.drag); 7089 setZindex(); 7090 // Remove cursor styles and text-selection events bound to the body. 7091 if (event.cursor) { 7092 scope_Body.style.cursor = ""; 7093 scope_Body.removeEventListener("selectstart", preventDefault); 7094 } 7095 } 7096 if (options.events.smoothSteps) { 7097 data.handleNumbers.forEach(function (handleNumber) { 7098 setHandle(handleNumber, scope_Locations[handleNumber], true, true, false, false); 7099 }); 7100 data.handleNumbers.forEach(function (handleNumber) { 7101 fireEvent("update", handleNumber); 7102 }); 7103 } 7104 data.handleNumbers.forEach(function (handleNumber) { 7105 fireEvent("change", handleNumber); 7106 fireEvent("set", handleNumber); 7107 fireEvent("end", handleNumber); 7108 }); 7109 } 7110 // Bind move events on document. 7111 function eventStart(event, data) { 7112 // Ignore event if any handle is disabled 7113 if (data.handleNumbers.some(isHandleDisabled)) { 7114 return; 7115 } 7116 var handle; 7117 if (data.handleNumbers.length === 1) { 7118 var handleOrigin = scope_Handles[data.handleNumbers[0]]; 7119 handle = handleOrigin.children[0]; 7120 scope_ActiveHandlesCount += 1; 7121 // Mark the handle as 'active' so it can be styled. 7122 addClass(handle, options.cssClasses.active); 7123 } 7124 // A drag should never propagate up to the 'tap' event. 7125 event.stopPropagation(); 7126 // Record the event listeners. 7127 var listeners = []; 7128 // Attach the move and end events. 7129 var moveEvent = attachEvent(actions.move, scope_DocumentElement, eventMove, { 7130 // The event target has changed so we need to propagate the original one so that we keep 7131 // relying on it to extract target touches. 7132 target: event.target, 7133 handle: handle, 7134 connect: data.connect, 7135 listeners: listeners, 7136 startCalcPoint: event.calcPoint, 7137 baseSize: baseSize(), 7138 pageOffset: event.pageOffset, 7139 handleNumbers: data.handleNumbers, 7140 buttonsProperty: event.buttons, 7141 locations: scope_Locations.slice(), 7142 }); 7143 var endEvent = attachEvent(actions.end, scope_DocumentElement, eventEnd, { 7144 target: event.target, 7145 handle: handle, 7146 listeners: listeners, 7147 doNotReject: true, 7148 handleNumbers: data.handleNumbers, 7149 }); 7150 var outEvent = attachEvent("mouseout", scope_DocumentElement, documentLeave, { 7151 target: event.target, 7152 handle: handle, 7153 listeners: listeners, 7154 doNotReject: true, 7155 handleNumbers: data.handleNumbers, 7156 }); 7157 // We want to make sure we pushed the listeners in the listener list rather than creating 7158 // a new one as it has already been passed to the event handlers. 7159 listeners.push.apply(listeners, moveEvent.concat(endEvent, outEvent)); 7160 // Text selection isn't an issue on touch devices, 7161 // so adding cursor styles can be skipped. 7162 if (event.cursor) { 7163 // Prevent the 'I' cursor and extend the range-drag cursor. 7164 scope_Body.style.cursor = getComputedStyle(event.target).cursor; 7165 // Mark the target with a dragging state. 7166 if (scope_Handles.length > 1) { 7167 addClass(scope_Target, options.cssClasses.drag); 7168 } 7169 // Prevent text selection when dragging the handles. 7170 // In noUiSlider <= 9.2.0, this was handled by calling preventDefault on mouse/touch start/move, 7171 // which is scroll blocking. The selectstart event is supported by FireFox starting from version 52, 7172 // meaning the only holdout is iOS Safari. This doesn't matter: text selection isn't triggered there. 7173 // The 'cursor' flag is false. 7174 // See: http://caniuse.com/#search=selectstart 7175 scope_Body.addEventListener("selectstart", preventDefault, false); 7176 } 7177 data.handleNumbers.forEach(function (handleNumber) { 7178 fireEvent("start", handleNumber); 7179 }); 7180 } 7181 // Move closest handle to tapped location. 7182 function eventTap(event) { 7183 // The tap event shouldn't propagate up 7184 event.stopPropagation(); 7185 var proposal = calcPointToPercentage(event.calcPoint); 7186 var handleNumber = getClosestHandle(proposal); 7187 // Tackle the case that all handles are 'disabled'. 7188 if (handleNumber === false) { 7189 return; 7190 } 7191 // Flag the slider as it is now in a transitional state. 7192 // Transition takes a configurable amount of ms (default 300). Re-enable the slider after that. 7193 if (!options.events.snap) { 7194 addClassFor(scope_Target, options.cssClasses.tap, options.animationDuration); 7195 } 7196 setHandle(handleNumber, proposal, true, true); 7197 setZindex(); 7198 fireEvent("slide", handleNumber, true); 7199 fireEvent("update", handleNumber, true); 7200 if (!options.events.snap) { 7201 fireEvent("change", handleNumber, true); 7202 fireEvent("set", handleNumber, true); 7203 } 7204 else { 7205 eventStart(event, { handleNumbers: [handleNumber] }); 7206 } 7207 } 7208 // Fires a 'hover' event for a hovered mouse/pen position. 7209 function eventHover(event) { 7210 var proposal = calcPointToPercentage(event.calcPoint); 7211 var to = scope_Spectrum.getStep(proposal); 7212 var value = scope_Spectrum.fromStepping(to); 7213 Object.keys(scope_Events).forEach(function (targetEvent) { 7214 if ("hover" === targetEvent.split(".")[0]) { 7215 scope_Events[targetEvent].forEach(function (callback) { 7216 callback.call(scope_Self, value); 7217 }); 7218 } 7219 }); 7220 } 7221 // Handles keydown on focused handles 7222 // Don't move the document when pressing arrow keys on focused handles 7223 function eventKeydown(event, handleNumber) { 7224 if (isSliderDisabled() || isHandleDisabled(handleNumber)) { 7225 return false; 7226 } 7227 var horizontalKeys = ["Left", "Right"]; 7228 var verticalKeys = ["Down", "Up"]; 7229 var largeStepKeys = ["PageDown", "PageUp"]; 7230 var edgeKeys = ["Home", "End"]; 7231 if (options.dir && !options.ort) { 7232 // On an right-to-left slider, the left and right keys act inverted 7233 horizontalKeys.reverse(); 7234 } 7235 else if (options.ort && !options.dir) { 7236 // On a top-to-bottom slider, the up and down keys act inverted 7237 verticalKeys.reverse(); 7238 largeStepKeys.reverse(); 7239 } 7240 // Strip "Arrow" for IE compatibility. https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key 7241 var key = event.key.replace("Arrow", ""); 7242 var isLargeDown = key === largeStepKeys[0]; 7243 var isLargeUp = key === largeStepKeys[1]; 7244 var isDown = key === verticalKeys[0] || key === horizontalKeys[0] || isLargeDown; 7245 var isUp = key === verticalKeys[1] || key === horizontalKeys[1] || isLargeUp; 7246 var isMin = key === edgeKeys[0]; 7247 var isMax = key === edgeKeys[1]; 7248 if (!isDown && !isUp && !isMin && !isMax) { 7249 return true; 7250 } 7251 event.preventDefault(); 7252 var to; 7253 if (isUp || isDown) { 7254 var direction = isDown ? 0 : 1; 7255 var steps = getNextStepsForHandle(handleNumber); 7256 var step = steps[direction]; 7257 // At the edge of a slider, do nothing 7258 if (step === null) { 7259 return false; 7260 } 7261 // No step set, use the default of 10% of the sub-range 7262 if (step === false) { 7263 step = scope_Spectrum.getDefaultStep(scope_Locations[handleNumber], isDown, options.keyboardDefaultStep); 7264 } 7265 if (isLargeUp || isLargeDown) { 7266 step *= options.keyboardPageMultiplier; 7267 } 7268 else { 7269 step *= options.keyboardMultiplier; 7270 } 7271 // Step over zero-length ranges (#948); 7272 step = Math.max(step, 0.0000001); 7273 // Decrement for down steps 7274 step = (isDown ? -1 : 1) * step; 7275 to = scope_Values[handleNumber] + step; 7276 } 7277 else if (isMax) { 7278 // End key 7279 to = options.spectrum.xVal[options.spectrum.xVal.length - 1]; 7280 } 7281 else { 7282 // Home key 7283 to = options.spectrum.xVal[0]; 7284 } 7285 setHandle(handleNumber, scope_Spectrum.toStepping(to), true, true); 7286 fireEvent("slide", handleNumber); 7287 fireEvent("update", handleNumber); 7288 fireEvent("change", handleNumber); 7289 fireEvent("set", handleNumber); 7290 return false; 7291 } 7292 // Attach events to several slider parts. 7293 function bindSliderEvents(behaviour) { 7294 // Attach the standard drag event to the handles. 7295 if (!behaviour.fixed) { 7296 scope_Handles.forEach(function (handle, index) { 7297 // These events are only bound to the visual handle 7298 // element, not the 'real' origin element. 7299 attachEvent(actions.start, handle.children[0], eventStart, { 7300 handleNumbers: [index], 7301 }); 7302 }); 7303 } 7304 // Attach the tap event to the slider base. 7305 if (behaviour.tap) { 7306 attachEvent(actions.start, scope_Base, eventTap, {}); 7307 } 7308 // Fire hover events 7309 if (behaviour.hover) { 7310 attachEvent(actions.move, scope_Base, eventHover, { 7311 hover: true, 7312 }); 7313 } 7314 // Make the range draggable. 7315 if (behaviour.drag) { 7316 scope_Connects.forEach(function (connect, index) { 7317 if (connect === false || index === 0 || index === scope_Connects.length - 1) { 7318 return; 7319 } 7320 var handleBefore = scope_Handles[index - 1]; 7321 var handleAfter = scope_Handles[index]; 7322 var eventHolders = [connect]; 7323 var handlesToDrag = [handleBefore, handleAfter]; 7324 var handleNumbersToDrag = [index - 1, index]; 7325 addClass(connect, options.cssClasses.draggable); 7326 // When the range is fixed, the entire range can 7327 // be dragged by the handles. The handle in the first 7328 // origin will propagate the start event upward, 7329 // but it needs to be bound manually on the other. 7330 if (behaviour.fixed) { 7331 eventHolders.push(handleBefore.children[0]); 7332 eventHolders.push(handleAfter.children[0]); 7333 } 7334 if (behaviour.dragAll) { 7335 handlesToDrag = scope_Handles; 7336 handleNumbersToDrag = scope_HandleNumbers; 7337 } 7338 eventHolders.forEach(function (eventHolder) { 7339 attachEvent(actions.start, eventHolder, eventStart, { 7340 handles: handlesToDrag, 7341 handleNumbers: handleNumbersToDrag, 7342 connect: connect, 7343 }); 7344 }); 7345 }); 7346 } 7347 } 7348 // Attach an event to this slider, possibly including a namespace 7349 function bindEvent(namespacedEvent, callback) { 7350 scope_Events[namespacedEvent] = scope_Events[namespacedEvent] || []; 7351 scope_Events[namespacedEvent].push(callback); 7352 // If the event bound is 'update,' fire it immediately for all handles. 7353 if (namespacedEvent.split(".")[0] === "update") { 7354 scope_Handles.forEach(function (a, index) { 7355 fireEvent("update", index); 7356 }); 7357 } 7358 } 7359 function isInternalNamespace(namespace) { 7360 return namespace === INTERNAL_EVENT_NS.aria || namespace === INTERNAL_EVENT_NS.tooltips; 7361 } 7362 // Undo attachment of event 7363 function removeEvent(namespacedEvent) { 7364 var event = namespacedEvent && namespacedEvent.split(".")[0]; 7365 var namespace = event ? namespacedEvent.substring(event.length) : namespacedEvent; 7366 Object.keys(scope_Events).forEach(function (bind) { 7367 var tEvent = bind.split(".")[0]; 7368 var tNamespace = bind.substring(tEvent.length); 7369 if ((!event || event === tEvent) && (!namespace || namespace === tNamespace)) { 7370 // only delete protected internal event if intentional 7371 if (!isInternalNamespace(tNamespace) || namespace === tNamespace) { 7372 delete scope_Events[bind]; 7373 } 7374 } 7375 }); 7376 } 7377 // External event handling 7378 function fireEvent(eventName, handleNumber, tap) { 7379 Object.keys(scope_Events).forEach(function (targetEvent) { 7380 var eventType = targetEvent.split(".")[0]; 7381 if (eventName === eventType) { 7382 scope_Events[targetEvent].forEach(function (callback) { 7383 callback.call( 7384 // Use the slider public API as the scope ('this') 7385 scope_Self, 7386 // Return values as array, so arg_1[arg_2] is always valid. 7387 scope_Values.map(options.format.to), 7388 // Handle index, 0 or 1 7389 handleNumber, 7390 // Un-formatted slider values 7391 scope_Values.slice(), 7392 // Event is fired by tap, true or false 7393 tap || false, 7394 // Left offset of the handle, in relation to the slider 7395 scope_Locations.slice(), 7396 // add the slider public API to an accessible parameter when this is unavailable 7397 scope_Self); 7398 }); 7399 } 7400 }); 7401 } 7402 // Split out the handle positioning logic so the Move event can use it, too 7403 function checkHandlePosition(reference, handleNumber, to, lookBackward, lookForward, getValue, smoothSteps) { 7404 var distance; 7405 // For sliders with multiple handles, limit movement to the other handle. 7406 // Apply the margin option by adding it to the handle positions. 7407 if (scope_Handles.length > 1 && !options.events.unconstrained) { 7408 if (lookBackward && handleNumber > 0) { 7409 distance = scope_Spectrum.getAbsoluteDistance(reference[handleNumber - 1], options.margin, false); 7410 to = Math.max(to, distance); 7411 } 7412 if (lookForward && handleNumber < scope_Handles.length - 1) { 7413 distance = scope_Spectrum.getAbsoluteDistance(reference[handleNumber + 1], options.margin, true); 7414 to = Math.min(to, distance); 7415 } 7416 } 7417 // The limit option has the opposite effect, limiting handles to a 7418 // maximum distance from another. Limit must be > 0, as otherwise 7419 // handles would be unmovable. 7420 if (scope_Handles.length > 1 && options.limit) { 7421 if (lookBackward && handleNumber > 0) { 7422 distance = scope_Spectrum.getAbsoluteDistance(reference[handleNumber - 1], options.limit, false); 7423 to = Math.min(to, distance); 7424 } 7425 if (lookForward && handleNumber < scope_Handles.length - 1) { 7426 distance = scope_Spectrum.getAbsoluteDistance(reference[handleNumber + 1], options.limit, true); 7427 to = Math.max(to, distance); 7428 } 7429 } 7430 // The padding option keeps the handles a certain distance from the 7431 // edges of the slider. Padding must be > 0. 7432 if (options.padding) { 7433 if (handleNumber === 0) { 7434 distance = scope_Spectrum.getAbsoluteDistance(0, options.padding[0], false); 7435 to = Math.max(to, distance); 7436 } 7437 if (handleNumber === scope_Handles.length - 1) { 7438 distance = scope_Spectrum.getAbsoluteDistance(100, options.padding[1], true); 7439 to = Math.min(to, distance); 7440 } 7441 } 7442 if (!smoothSteps) { 7443 to = scope_Spectrum.getStep(to); 7444 } 7445 // Limit percentage to the 0 - 100 range 7446 to = limit(to); 7447 // Return false if handle can't move 7448 if (to === reference[handleNumber] && !getValue) { 7449 return false; 7450 } 7451 return to; 7452 } 7453 // Uses slider orientation to create CSS rules. a = base value; 7454 function inRuleOrder(v, a) { 7455 var o = options.ort; 7456 return (o ? a : v) + ", " + (o ? v : a); 7457 } 7458 // Moves handle(s) by a percentage 7459 // (bool, % to move, [% where handle started, ...], [index in scope_Handles, ...]) 7460 function moveHandles(upward, proposal, locations, handleNumbers, connect) { 7461 var proposals = locations.slice(); 7462 // Store first handle now, so we still have it in case handleNumbers is reversed 7463 var firstHandle = handleNumbers[0]; 7464 var smoothSteps = options.events.smoothSteps; 7465 var b = [!upward, upward]; 7466 var f = [upward, !upward]; 7467 // Copy handleNumbers so we don't change the dataset 7468 handleNumbers = handleNumbers.slice(); 7469 // Check to see which handle is 'leading'. 7470 // If that one can't move the second can't either. 7471 if (upward) { 7472 handleNumbers.reverse(); 7473 } 7474 // Step 1: get the maximum percentage that any of the handles can move 7475 if (handleNumbers.length > 1) { 7476 handleNumbers.forEach(function (handleNumber, o) { 7477 var to = checkHandlePosition(proposals, handleNumber, proposals[handleNumber] + proposal, b[o], f[o], false, smoothSteps); 7478 // Stop if one of the handles can't move. 7479 if (to === false) { 7480 proposal = 0; 7481 } 7482 else { 7483 proposal = to - proposals[handleNumber]; 7484 proposals[handleNumber] = to; 7485 } 7486 }); 7487 } 7488 // If using one handle, check backward AND forward 7489 else { 7490 b = f = [true]; 7491 } 7492 var state = false; 7493 // Step 2: Try to set the handles with the found percentage 7494 handleNumbers.forEach(function (handleNumber, o) { 7495 state = 7496 setHandle(handleNumber, locations[handleNumber] + proposal, b[o], f[o], false, smoothSteps) || state; 7497 }); 7498 // Step 3: If a handle moved, fire events 7499 if (state) { 7500 handleNumbers.forEach(function (handleNumber) { 7501 fireEvent("update", handleNumber); 7502 fireEvent("slide", handleNumber); 7503 }); 7504 // If target is a connect, then fire drag event 7505 if (connect != undefined) { 7506 fireEvent("drag", firstHandle); 7507 } 7508 } 7509 } 7510 // Takes a base value and an offset. This offset is used for the connect bar size. 7511 // In the initial design for this feature, the origin element was 1% wide. 7512 // Unfortunately, a rounding bug in Chrome makes it impossible to implement this feature 7513 // in this manner: https://bugs.chromium.org/p/chromium/issues/detail?id=798223 7514 function transformDirection(a, b) { 7515 return options.dir ? 100 - a - b : a; 7516 } 7517 // Updates scope_Locations and scope_Values, updates visual state 7518 function updateHandlePosition(handleNumber, to) { 7519 // Update locations. 7520 scope_Locations[handleNumber] = to; 7521 // Convert the value to the slider stepping/range. 7522 scope_Values[handleNumber] = scope_Spectrum.fromStepping(to); 7523 var translation = transformDirection(to, 0) - scope_DirOffset; 7524 var translateRule = "translate(" + inRuleOrder(translation + "%", "0") + ")"; 7525 scope_Handles[handleNumber].style[options.transformRule] = translateRule; 7526 // sanity check for at least 2 handles (e.g. during setup) 7527 if (options.events.invertConnects && scope_Locations.length > 1) { 7528 // check if handles passed each other, but don't match the ConnectsInverted state 7529 var handlesAreInOrder = scope_Locations.every(function (position, index, locations) { 7530 return index === 0 || position >= locations[index - 1]; 7531 }); 7532 if (scope_ConnectsInverted !== !handlesAreInOrder) { 7533 // invert connects when handles pass each other 7534 invertConnects(); 7535 // invertConnects already updates all connect elements 7536 return; 7537 } 7538 } 7539 updateConnect(handleNumber); 7540 updateConnect(handleNumber + 1); 7541 if (scope_ConnectsInverted) { 7542 // When connects are inverted, we also have to update adjacent connects 7543 updateConnect(handleNumber - 1); 7544 updateConnect(handleNumber + 2); 7545 } 7546 } 7547 // Handles before the slider middle are stacked later = higher, 7548 // Handles after the middle later is lower 7549 // [[7] [8] .......... | .......... [5] [4] 7550 function setZindex() { 7551 scope_HandleNumbers.forEach(function (handleNumber) { 7552 var dir = scope_Locations[handleNumber] > 50 ? -1 : 1; 7553 var zIndex = 3 + (scope_Handles.length + dir * handleNumber); 7554 scope_Handles[handleNumber].style.zIndex = String(zIndex); 7555 }); 7556 } 7557 // Test suggested values and apply margin, step. 7558 // if exactInput is true, don't run checkHandlePosition, then the handle can be placed in between steps (#436) 7559 function setHandle(handleNumber, to, lookBackward, lookForward, exactInput, smoothSteps) { 7560 if (!exactInput) { 7561 to = checkHandlePosition(scope_Locations, handleNumber, to, lookBackward, lookForward, false, smoothSteps); 7562 } 7563 if (to === false) { 7564 return false; 7565 } 7566 updateHandlePosition(handleNumber, to); 7567 return true; 7568 } 7569 // Updates style attribute for connect nodes 7570 function updateConnect(index) { 7571 // Skip connects set to false 7572 if (!scope_Connects[index]) { 7573 return; 7574 } 7575 // Create a copy of locations, so we can sort them for the local scope logic 7576 var locations = scope_Locations.slice(); 7577 if (scope_ConnectsInverted) { 7578 locations.sort(function (a, b) { 7579 return a - b; 7580 }); 7581 } 7582 var l = 0; 7583 var h = 100; 7584 if (index !== 0) { 7585 l = locations[index - 1]; 7586 } 7587 if (index !== scope_Connects.length - 1) { 7588 h = locations[index]; 7589 } 7590 // We use two rules: 7591 // 'translate' to change the left/top offset; 7592 // 'scale' to change the width of the element; 7593 // As the element has a width of 100%, a translation of 100% is equal to 100% of the parent (.noUi-base) 7594 var connectWidth = h - l; 7595 var translateRule = "translate(" + inRuleOrder(transformDirection(l, connectWidth) + "%", "0") + ")"; 7596 var scaleRule = "scale(" + inRuleOrder(connectWidth / 100, "1") + ")"; 7597 scope_Connects[index].style[options.transformRule] = 7598 translateRule + " " + scaleRule; 7599 } 7600 // Parses value passed to .set method. Returns current value if not parse-able. 7601 function resolveToValue(to, handleNumber) { 7602 // Setting with null indicates an 'ignore'. 7603 // Inputting 'false' is invalid. 7604 if (to === null || to === false || to === undefined) { 7605 return scope_Locations[handleNumber]; 7606 } 7607 // If a formatted number was passed, attempt to decode it. 7608 if (typeof to === "number") { 7609 to = String(to); 7610 } 7611 to = options.format.from(to); 7612 if (to !== false) { 7613 to = scope_Spectrum.toStepping(to); 7614 } 7615 // If parsing the number failed, use the current value. 7616 if (to === false || isNaN(to)) { 7617 return scope_Locations[handleNumber]; 7618 } 7619 return to; 7620 } 7621 // Set the slider value. 7622 function valueSet(input, fireSetEvent, exactInput) { 7623 var values = asArray(input); 7624 var isInit = scope_Locations[0] === undefined; 7625 // Event fires by default 7626 fireSetEvent = fireSetEvent === undefined ? true : fireSetEvent; 7627 // Animation is optional. 7628 // Make sure the initial values were set before using animated placement. 7629 if (options.animate && !isInit) { 7630 addClassFor(scope_Target, options.cssClasses.tap, options.animationDuration); 7631 } 7632 // First pass, without lookAhead but with lookBackward. Values are set from left to right. 7633 scope_HandleNumbers.forEach(function (handleNumber) { 7634 setHandle(handleNumber, resolveToValue(values[handleNumber], handleNumber), true, false, exactInput); 7635 }); 7636 var i = scope_HandleNumbers.length === 1 ? 0 : 1; 7637 // Spread handles evenly across the slider if the range has no size (min=max) 7638 if (isInit && scope_Spectrum.hasNoSize()) { 7639 exactInput = true; 7640 scope_Locations[0] = 0; 7641 if (scope_HandleNumbers.length > 1) { 7642 var space_1 = 100 / (scope_HandleNumbers.length - 1); 7643 scope_HandleNumbers.forEach(function (handleNumber) { 7644 scope_Locations[handleNumber] = handleNumber * space_1; 7645 }); 7646 } 7647 } 7648 // Secondary passes. Now that all base values are set, apply constraints. 7649 // Iterate all handles to ensure constraints are applied for the entire slider (Issue #1009) 7650 for (; i < scope_HandleNumbers.length; ++i) { 7651 scope_HandleNumbers.forEach(function (handleNumber) { 7652 setHandle(handleNumber, scope_Locations[handleNumber], true, true, exactInput); 7653 }); 7654 } 7655 setZindex(); 7656 scope_HandleNumbers.forEach(function (handleNumber) { 7657 fireEvent("update", handleNumber); 7658 // Fire the event only for handles that received a new value, as per #579 7659 if (values[handleNumber] !== null && fireSetEvent) { 7660 fireEvent("set", handleNumber); 7661 } 7662 }); 7663 } 7664 // Reset slider to initial values 7665 function valueReset(fireSetEvent) { 7666 valueSet(options.start, fireSetEvent); 7667 } 7668 // Set value for a single handle 7669 function valueSetHandle(handleNumber, value, fireSetEvent, exactInput) { 7670 // Ensure numeric input 7671 handleNumber = Number(handleNumber); 7672 if (!(handleNumber >= 0 && handleNumber < scope_HandleNumbers.length)) { 7673 throw new Error("noUiSlider: invalid handle number, got: " + handleNumber); 7674 } 7675 // Look both backward and forward, since we don't want this handle to "push" other handles (#960); 7676 // The exactInput argument can be used to ignore slider stepping (#436) 7677 setHandle(handleNumber, resolveToValue(value, handleNumber), true, true, exactInput); 7678 fireEvent("update", handleNumber); 7679 if (fireSetEvent) { 7680 fireEvent("set", handleNumber); 7681 } 7682 } 7683 // Get the slider value. 7684 function valueGet(unencoded) { 7685 if (unencoded === void 0) { unencoded = false; } 7686 if (unencoded) { 7687 // return a copy of the raw values 7688 return scope_Values.length === 1 ? scope_Values[0] : scope_Values.slice(0); 7689 } 7690 var values = scope_Values.map(options.format.to); 7691 // If only one handle is used, return a single value. 7692 if (values.length === 1) { 7693 return values[0]; 7694 } 7695 return values; 7696 } 7697 // Removes classes from the root and empties it. 7698 function destroy() { 7699 // remove protected internal listeners 7700 removeEvent(INTERNAL_EVENT_NS.aria); 7701 removeEvent(INTERNAL_EVENT_NS.tooltips); 7702 Object.keys(options.cssClasses).forEach(function (key) { 7703 removeClass(scope_Target, options.cssClasses[key]); 7704 }); 7705 while (scope_Target.firstChild) { 7706 scope_Target.removeChild(scope_Target.firstChild); 7707 } 7708 delete scope_Target.noUiSlider; 7709 } 7710 function getNextStepsForHandle(handleNumber) { 7711 var location = scope_Locations[handleNumber]; 7712 var nearbySteps = scope_Spectrum.getNearbySteps(location); 7713 var value = scope_Values[handleNumber]; 7714 var increment = nearbySteps.thisStep.step; 7715 var decrement = null; 7716 // If snapped, directly use defined step value 7717 if (options.snap) { 7718 return [ 7719 value - nearbySteps.stepBefore.startValue || null, 7720 nearbySteps.stepAfter.startValue - value || null, 7721 ]; 7722 } 7723 // If the next value in this step moves into the next step, 7724 // the increment is the start of the next step - the current value 7725 if (increment !== false) { 7726 if (value + increment > nearbySteps.stepAfter.startValue) { 7727 increment = nearbySteps.stepAfter.startValue - value; 7728 } 7729 } 7730 // If the value is beyond the starting point 7731 if (value > nearbySteps.thisStep.startValue) { 7732 decrement = nearbySteps.thisStep.step; 7733 } 7734 else if (nearbySteps.stepBefore.step === false) { 7735 decrement = false; 7736 } 7737 // If a handle is at the start of a step, it always steps back into the previous step first 7738 else { 7739 decrement = value - nearbySteps.stepBefore.highestStep; 7740 } 7741 // Now, if at the slider edges, there is no in/decrement 7742 if (location === 100) { 7743 increment = null; 7744 } 7745 else if (location === 0) { 7746 decrement = null; 7747 } 7748 // As per #391, the comparison for the decrement step can have some rounding issues. 7749 var stepDecimals = scope_Spectrum.countStepDecimals(); 7750 // Round per #391 7751 if (increment !== null && increment !== false) { 7752 increment = Number(increment.toFixed(stepDecimals)); 7753 } 7754 if (decrement !== null && decrement !== false) { 7755 decrement = Number(decrement.toFixed(stepDecimals)); 7756 } 7757 return [decrement, increment]; 7758 } 7759 // Get the current step size for the slider. 7760 function getNextSteps() { 7761 return scope_HandleNumbers.map(getNextStepsForHandle); 7762 } 7763 // Updatable: margin, limit, padding, step, range, animate, snap 7764 function updateOptions(optionsToUpdate, fireSetEvent) { 7765 // Spectrum is created using the range, snap, direction and step options. 7766 // 'snap' and 'step' can be updated. 7767 // If 'snap' and 'step' are not passed, they should remain unchanged. 7768 var v = valueGet(); 7769 var updateAble = [ 7770 "margin", 7771 "limit", 7772 "padding", 7773 "range", 7774 "animate", 7775 "snap", 7776 "step", 7777 "format", 7778 "pips", 7779 "tooltips", 7780 "connect", 7781 ]; 7782 // Only change options that we're actually passed to update. 7783 updateAble.forEach(function (name) { 7784 // Check for undefined. null removes the value. 7785 if (optionsToUpdate[name] !== undefined) { 7786 originalOptions[name] = optionsToUpdate[name]; 7787 } 7788 }); 7789 var newOptions = testOptions(originalOptions); 7790 // Load new options into the slider state 7791 updateAble.forEach(function (name) { 7792 if (optionsToUpdate[name] !== undefined) { 7793 options[name] = newOptions[name]; 7794 } 7795 }); 7796 scope_Spectrum = newOptions.spectrum; 7797 // Limit, margin and padding depend on the spectrum but are stored outside of it. (#677) 7798 options.margin = newOptions.margin; 7799 options.limit = newOptions.limit; 7800 options.padding = newOptions.padding; 7801 // Update pips, removes existing. 7802 if (options.pips) { 7803 pips(options.pips); 7804 } 7805 else { 7806 removePips(); 7807 } 7808 // Update tooltips, removes existing. 7809 if (options.tooltips) { 7810 tooltips(); 7811 } 7812 else { 7813 removeTooltips(); 7814 } 7815 // Invalidate the current positioning so valueSet forces an update. 7816 scope_Locations = []; 7817 valueSet(isSet(optionsToUpdate.start) ? optionsToUpdate.start : v, fireSetEvent); 7818 // Update connects only if it was set 7819 if (optionsToUpdate.connect) { 7820 updateConnectOption(); 7821 } 7822 } 7823 function updateConnectOption() { 7824 // IE supported way of removing children including event handlers 7825 while (scope_ConnectBase.firstChild) { 7826 scope_ConnectBase.removeChild(scope_ConnectBase.firstChild); 7827 } 7828 // Adding new connects according to the new connect options 7829 for (var i = 0; i <= options.handles; i++) { 7830 scope_Connects[i] = addConnect(scope_ConnectBase, options.connect[i]); 7831 updateConnect(i); 7832 } 7833 // re-adding drag events for the new connect elements 7834 // to ignore the other events we have to negate the 'if (!behaviour.fixed)' check 7835 bindSliderEvents({ drag: options.events.drag, fixed: true }); 7836 } 7837 // Invert options for connect handles 7838 function invertConnects() { 7839 scope_ConnectsInverted = !scope_ConnectsInverted; 7840 testConnect(options, 7841 // inverse the connect boolean array 7842 options.connect.map(function (b) { return !b; })); 7843 updateConnectOption(); 7844 } 7845 // Initialization steps 7846 function setupSlider() { 7847 // Create the base element, initialize HTML and set classes. 7848 // Add handles and connect elements. 7849 scope_Base = addSlider(scope_Target); 7850 addElements(options.connect, scope_Base); 7851 // Attach user events. 7852 bindSliderEvents(options.events); 7853 // Use the public value method to set the start values. 7854 valueSet(options.start); 7855 if (options.pips) { 7856 pips(options.pips); 7857 } 7858 if (options.tooltips) { 7859 tooltips(); 7860 } 7861 aria(); 7862 } 7863 setupSlider(); 7864 var scope_Self = { 7865 destroy: destroy, 7866 steps: getNextSteps, 7867 on: bindEvent, 7868 off: removeEvent, 7869 get: valueGet, 7870 set: valueSet, 7871 setHandle: valueSetHandle, 7872 reset: valueReset, 7873 disable: disable, 7874 enable: enable, 7875 // Exposed for unit testing, don't use this in your application. 7876 __moveHandles: function (upward, proposal, handleNumbers) { 7877 moveHandles(upward, proposal, scope_Locations, handleNumbers); 7878 }, 7879 options: originalOptions, 7880 updateOptions: updateOptions, 7881 target: scope_Target, 7882 removePips: removePips, 7883 removeTooltips: removeTooltips, 7884 getPositions: function () { 7885 return scope_Locations.slice(); 7886 }, 7887 getTooltips: function () { 7888 return scope_Tooltips; 7889 }, 7890 getOrigins: function () { 7891 return scope_Handles; 7892 }, 7893 pips: pips, // Issue #594 7894 }; 7895 return scope_Self; 7896} 7897// Run the standard initializer 7898function initialize(target, originalOptions) { 7899 if (!target || !target.nodeName) { 7900 throw new Error("noUiSlider: create requires a single element, got: " + target); 7901 } 7902 // Throw an error if the slider was already initialized. 7903 if (target.noUiSlider) { 7904 throw new Error("noUiSlider: Slider was already initialized."); 7905 } 7906 // Test the options and create the slider environment; 7907 var options = testOptions(originalOptions); 7908 var api = scope(target, options, originalOptions); 7909 target.noUiSlider = api; 7910 return api; 7911} 7912 7913 7914/* harmony default export */ __webpack_exports__["default"] = ({ 7915 // Exposed for unit testing, don't use this in your application. 7916 __spectrum: Spectrum, 7917 // A reference to the default classes, allows global changes. 7918 // Use the cssClasses option for changes to one slider. 7919 cssClasses: cssClasses, 7920 create: initialize, 7921}); 7922 7923 7924/***/ }), 7925
vendor: 34,125 bytes, lines 7926-8949
7926/***/ "./node_modules/numeral/numeral.js": 7927/*!*****************************************!*\ 7928 !*** ./node_modules/numeral/numeral.js ***! 7929 \*****************************************/ 7930/*! no static exports found */ 7931/***/ (function(module, exports, __webpack_require__) { 7932 7933var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! @preserve 7934 * numeral.js 7935 * version : 2.0.6 7936 * author : Adam Draper 7937 * license : MIT 7938 * http://adamwdraper.github.com/Numeral-js/ 7939 */ 7940 7941(function (global, factory) { 7942 if (true) { 7943 !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory), 7944 __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? 7945 (__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) : 7946 __WEBPACK_AMD_DEFINE_FACTORY__), 7947 __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); 7948 } else {} 7949}(this, function () { 7950 /************************************ 7951 Variables 7952 ************************************/ 7953 7954 var numeral, 7955 _, 7956 VERSION = '2.0.6', 7957 formats = {}, 7958 locales = {}, 7959 defaults = { 7960 currentLocale: 'en', 7961 zeroFormat: null, 7962 nullFormat: null, 7963 defaultFormat: '0,0', 7964 scalePercentBy100: true 7965 }, 7966 options = { 7967 currentLocale: defaults.currentLocale, 7968 zeroFormat: defaults.zeroFormat, 7969 nullFormat: defaults.nullFormat, 7970 defaultFormat: defaults.defaultFormat, 7971 scalePercentBy100: defaults.scalePercentBy100 7972 }; 7973 7974 7975 /************************************ 7976 Constructors 7977 ************************************/ 7978 7979 // Numeral prototype object 7980 function Numeral(input, number) { 7981 this._input = input; 7982 7983 this._value = number; 7984 } 7985 7986 numeral = function(input) { 7987 var value, 7988 kind, 7989 unformatFunction, 7990 regexp; 7991 7992 if (numeral.isNumeral(input)) { 7993 value = input.value(); 7994 } else if (input === 0 || typeof input === 'undefined') { 7995 value = 0; 7996 } else if (input === null || _.isNaN(input)) { 7997 value = null; 7998 } else if (typeof input === 'string') { 7999 if (options.zeroFormat && input === options.zeroFormat) { 8000 value = 0; 8001 } else if (options.nullFormat && input === options.nullFormat || !input.replace(/[^0-9]+/g, '').length) { 8002 value = null; 8003 } else { 8004 for (kind in formats) { 8005 regexp = typeof formats[kind].regexps.unformat === 'function' ? formats[kind].regexps.unformat() : formats[kind].regexps.unformat; 8006 8007 if (regexp && input.match(regexp)) { 8008 unformatFunction = formats[kind].unformat; 8009 8010 break; 8011 } 8012 } 8013 8014 unformatFunction = unformatFunction || numeral._.stringToNumber; 8015 8016 value = unformatFunction(input); 8017 } 8018 } else { 8019 value = Number(input)|| null; 8020 } 8021 8022 return new Numeral(input, value); 8023 }; 8024 8025 // version number 8026 numeral.version = VERSION; 8027 8028 // compare numeral object 8029 numeral.isNumeral = function(obj) { 8030 return obj instanceof Numeral; 8031 }; 8032 8033 // helper functions 8034 numeral._ = _ = { 8035 // formats numbers separators, decimals places, signs, abbreviations 8036 numberToFormat: function(value, format, roundingFunction) { 8037 var locale = locales[numeral.options.currentLocale], 8038 negP = false, 8039 optDec = false, 8040 leadingCount = 0, 8041 abbr = '', 8042 trillion = 1000000000000, 8043 billion = 1000000000, 8044 million = 1000000, 8045 thousand = 1000, 8046 decimal = '', 8047 neg = false, 8048 abbrForce, // force abbreviation 8049 abs, 8050 min, 8051 max, 8052 power, 8053 int, 8054 precision, 8055 signed, 8056 thousands, 8057 output; 8058 8059 // make sure we never format a null value 8060 value = value || 0; 8061 8062 abs = Math.abs(value); 8063 8064 // see if we should use parentheses for negative number or if we should prefix with a sign 8065 // if both are present we default to parentheses 8066 if (numeral._.includes(format, '(')) { 8067 negP = true; 8068 format = format.replace(/[\(|\)]/g, ''); 8069 } else if (numeral._.includes(format, '+') || numeral._.includes(format, '-')) { 8070 signed = numeral._.includes(format, '+') ? format.indexOf('+') : value < 0 ? format.indexOf('-') : -1; 8071 format = format.replace(/[\+|\-]/g, ''); 8072 } 8073 8074 // see if abbreviation is wanted 8075 if (numeral._.includes(format, 'a')) { 8076 abbrForce = format.match(/a(k|m|b|t)?/); 8077 8078 abbrForce = abbrForce ? abbrForce[1] : false; 8079 8080 // check for space before abbreviation 8081 if (numeral._.includes(format, ' a')) { 8082 abbr = ' '; 8083 } 8084 8085 format = format.replace(new RegExp(abbr + 'a[kmbt]?'), ''); 8086 8087 if (abs >= trillion && !abbrForce || abbrForce === 't') { 8088 // trillion 8089 abbr += locale.abbreviations.trillion; 8090 value = value / trillion; 8091 } else if (abs < trillion && abs >= billion && !abbrForce || abbrForce === 'b') { 8092 // billion 8093 abbr += locale.abbreviations.billion; 8094 value = value / billion; 8095 } else if (abs < billion && abs >= million && !abbrForce || abbrForce === 'm') { 8096 // million 8097 abbr += locale.abbreviations.million; 8098 value = value / million; 8099 } else if (abs < million && abs >= thousand && !abbrForce || abbrForce === 'k') { 8100 // thousand 8101 abbr += locale.abbreviations.thousand; 8102 value = value / thousand; 8103 } 8104 } 8105 8106 // check for optional decimals 8107 if (numeral._.includes(format, '[.]')) { 8108 optDec = true; 8109 format = format.replace('[.]', '.'); 8110 } 8111 8112 // break number and format 8113 int = value.toString().split('.')[0]; 8114 precision = format.split('.')[1]; 8115 thousands = format.indexOf(','); 8116 leadingCount = (format.split('.')[0].split(',')[0].match(/0/g) || []).length; 8117 8118 if (precision) { 8119 if (numeral._.includes(precision, '[')) { 8120 precision = precision.replace(']', ''); 8121 precision = precision.split('['); 8122 decimal = numeral._.toFixed(value, (precision[0].length + precision[1].length), roundingFunction, precision[1].length); 8123 } else { 8124 decimal = numeral._.toFixed(value, precision.length, roundingFunction); 8125 } 8126 8127 int = decimal.split('.')[0]; 8128 8129 if (numeral._.includes(decimal, '.')) { 8130 decimal = locale.delimiters.decimal + decimal.split('.')[1]; 8131 } else { 8132 decimal = ''; 8133 } 8134 8135 if (optDec && Number(decimal.slice(1)) === 0) { 8136 decimal = ''; 8137 } 8138 } else { 8139 int = numeral._.toFixed(value, 0, roundingFunction); 8140 } 8141 8142 // check abbreviation again after rounding 8143 if (abbr && !abbrForce && Number(int) >= 1000 && abbr !== locale.abbreviations.trillion) { 8144 int = String(Number(int) / 1000); 8145 8146 switch (abbr) { 8147 case locale.abbreviations.thousand: 8148 abbr = locale.abbreviations.million; 8149 break; 8150 case locale.abbreviations.million: 8151 abbr = locale.abbreviations.billion; 8152 break; 8153 case locale.abbreviations.billion: 8154 abbr = locale.abbreviations.trillion; 8155 break; 8156 } 8157 } 8158 8159 8160 // format number 8161 if (numeral._.includes(int, '-')) { 8162 int = int.slice(1); 8163 neg = true; 8164 } 8165 8166 if (int.length < leadingCount) { 8167 for (var i = leadingCount - int.length; i > 0; i--) { 8168 int = '0' + int; 8169 } 8170 } 8171 8172 if (thousands > -1) { 8173 int = int.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1' + locale.delimiters.thousands); 8174 } 8175 8176 if (format.indexOf('.') === 0) { 8177 int = ''; 8178 } 8179 8180 output = int + decimal + (abbr ? abbr : ''); 8181 8182 if (negP) { 8183 output = (negP && neg ? '(' : '') + output + (negP && neg ? ')' : ''); 8184 } else { 8185 if (signed >= 0) { 8186 output = signed === 0 ? (neg ? '-' : '+') + output : output + (neg ? '-' : '+'); 8187 } else if (neg) { 8188 output = '-' + output; 8189 } 8190 } 8191 8192 return output; 8193 }, 8194 // unformats numbers separators, decimals places, signs, abbreviations 8195 stringToNumber: function(string) { 8196 var locale = locales[options.currentLocale], 8197 stringOriginal = string, 8198 abbreviations = { 8199 thousand: 3, 8200 million: 6, 8201 billion: 9, 8202 trillion: 12 8203 }, 8204 abbreviation, 8205 value, 8206 i, 8207 regexp; 8208 8209 if (options.zeroFormat && string === options.zeroFormat) { 8210 value = 0; 8211 } else if (options.nullFormat && string === options.nullFormat || !string.replace(/[^0-9]+/g, '').length) { 8212 value = null; 8213 } else { 8214 value = 1; 8215 8216 if (locale.delimiters.decimal !== '.') { 8217 string = string.replace(/\./g, '').replace(locale.delimiters.decimal, '.'); 8218 } 8219 8220 for (abbreviation in abbreviations) { 8221 regexp = new RegExp('[^a-zA-Z]' + locale.abbreviations[abbreviation] + '(?:\\)|(\\' + locale.currency.symbol + ')?(?:\\))?)?$'); 8222 8223 if (stringOriginal.match(regexp)) { 8224 value *= Math.pow(10, abbreviations[abbreviation]); 8225 break; 8226 } 8227 } 8228 8229 // check for negative number 8230 value *= (string.split('-').length + Math.min(string.split('(').length - 1, string.split(')').length - 1)) % 2 ? 1 : -1; 8231 8232 // remove non numbers 8233 string = string.replace(/[^0-9\.]+/g, ''); 8234 8235 value *= Number(string); 8236 } 8237 8238 return value; 8239 }, 8240 isNaN: function(value) { 8241 return typeof value === 'number' && isNaN(value); 8242 }, 8243 includes: function(string, search) { 8244 return string.indexOf(search) !== -1; 8245 }, 8246 insert: function(string, subString, start) { 8247 return string.slice(0, start) + subString + string.slice(start); 8248 }, 8249 reduce: function(array, callback /*, initialValue*/) { 8250 if (this === null) { 8251 throw new TypeError('Array.prototype.reduce called on null or undefined'); 8252 } 8253 8254 if (typeof callback !== 'function') { 8255 throw new TypeError(callback + ' is not a function'); 8256 } 8257 8258 var t = Object(array), 8259 len = t.length >>> 0, 8260 k = 0, 8261 value; 8262 8263 if (arguments.length === 3) { 8264 value = arguments[2]; 8265 } else { 8266 while (k < len && !(k in t)) { 8267 k++; 8268 } 8269 8270 if (k >= len) { 8271 throw new TypeError('Reduce of empty array with no initial value'); 8272 } 8273 8274 value = t[k++]; 8275 } 8276 for (; k < len; k++) { 8277 if (k in t) { 8278 value = callback(value, t[k], k, t); 8279 } 8280 } 8281 return value; 8282 }, 8283 /** 8284 * Computes the multiplier necessary to make x >= 1, 8285 * effectively eliminating miscalculations caused by 8286 * finite precision. 8287 */ 8288 multiplier: function (x) { 8289 var parts = x.toString().split('.'); 8290 8291 return parts.length < 2 ? 1 : Math.pow(10, parts[1].length); 8292 }, 8293 /** 8294 * Given a variable number of arguments, returns the maximum 8295 * multiplier that must be used to normalize an operation involving 8296 * all of them. 8297 */ 8298 correctionFactor: function () { 8299 var args = Array.prototype.slice.call(arguments); 8300 8301 return args.reduce(function(accum, next) { 8302 var mn = _.multiplier(next); 8303 return accum > mn ? accum : mn; 8304 }, 1); 8305 }, 8306 /** 8307 * Implementation of toFixed() that treats floats more like decimals 8308 * 8309 * Fixes binary rounding issues (eg. (0.615).toFixed(2) === '0.61') that present 8310 * problems for accounting- and finance-related software. 8311 */ 8312 toFixed: function(value, maxDecimals, roundingFunction, optionals) { 8313 var splitValue = value.toString().split('.'), 8314 minDecimals = maxDecimals - (optionals || 0), 8315 boundedPrecision, 8316 optionalsRegExp, 8317 power, 8318 output; 8319 8320 // Use the smallest precision value possible to avoid errors from floating point representation 8321 if (splitValue.length === 2) { 8322 boundedPrecision = Math.min(Math.max(splitValue[1].length, minDecimals), maxDecimals); 8323 } else { 8324 boundedPrecision = minDecimals; 8325 } 8326 8327 power = Math.pow(10, boundedPrecision); 8328 8329 // Multiply up by precision, round accurately, then divide and use native toFixed(): 8330 output = (roundingFunction(value + 'e+' + boundedPrecision) / power).toFixed(boundedPrecision); 8331 8332 if (optionals > maxDecimals - boundedPrecision) { 8333 optionalsRegExp = new RegExp('\\.?0{1,' + (optionals - (maxDecimals - boundedPrecision)) + '}$'); 8334 output = output.replace(optionalsRegExp, ''); 8335 } 8336 8337 return output; 8338 } 8339 }; 8340 8341 // avaliable options 8342 numeral.options = options; 8343 8344 // avaliable formats 8345 numeral.formats = formats; 8346 8347 // avaliable formats 8348 numeral.locales = locales; 8349 8350 // This function sets the current locale. If 8351 // no arguments are passed in, it will simply return the current global 8352 // locale key. 8353 numeral.locale = function(key) { 8354 if (key) { 8355 options.currentLocale = key.toLowerCase(); 8356 } 8357 8358 return options.currentLocale; 8359 }; 8360 8361 // This function provides access to the loaded locale data. If 8362 // no arguments are passed in, it will simply return the current 8363 // global locale object. 8364 numeral.localeData = function(key) { 8365 if (!key) { 8366 return locales[options.currentLocale]; 8367 } 8368 8369 key = key.toLowerCase(); 8370 8371 if (!locales[key]) { 8372 throw new Error('Unknown locale : ' + key); 8373 } 8374 8375 return locales[key]; 8376 }; 8377 8378 numeral.reset = function() { 8379 for (var property in defaults) { 8380 options[property] = defaults[property]; 8381 } 8382 }; 8383 8384 numeral.zeroFormat = function(format) { 8385 options.zeroFormat = typeof(format) === 'string' ? format : null; 8386 }; 8387 8388 numeral.nullFormat = function (format) { 8389 options.nullFormat = typeof(format) === 'string' ? format : null; 8390 }; 8391 8392 numeral.defaultFormat = function(format) { 8393 options.defaultFormat = typeof(format) === 'string' ? format : '0.0'; 8394 }; 8395 8396 numeral.register = function(type, name, format) { 8397 name = name.toLowerCase(); 8398 8399 if (this[type + 's'][name]) { 8400 throw new TypeError(name + ' ' + type + ' already registered.'); 8401 } 8402 8403 this[type + 's'][name] = format; 8404 8405 return format; 8406 }; 8407 8408 8409 numeral.validate = function(val, culture) { 8410 var _decimalSep, 8411 _thousandSep, 8412 _currSymbol, 8413 _valArray, 8414 _abbrObj, 8415 _thousandRegEx, 8416 localeData, 8417 temp; 8418 8419 //coerce val to string 8420 if (typeof val !== 'string') { 8421 val += ''; 8422 8423 if (console.warn) { 8424 console.warn('Numeral.js: Value is not string. It has been co-erced to: ', val); 8425 } 8426 } 8427 8428 //trim whitespaces from either sides 8429 val = val.trim(); 8430 8431 //if val is just digits return true 8432 if (!!val.match(/^\d+$/)) { 8433 return true; 8434 } 8435 8436 //if val is empty return false 8437 if (val === '') { 8438 return false; 8439 } 8440 8441 //get the decimal and thousands separator from numeral.localeData 8442 try { 8443 //check if the culture is understood by numeral. if not, default it to current locale 8444 localeData = numeral.localeData(culture); 8445 } catch (e) { 8446 localeData = numeral.localeData(numeral.locale()); 8447 } 8448 8449 //setup the delimiters and currency symbol based on culture/locale 8450 _currSymbol = localeData.currency.symbol; 8451 _abbrObj = localeData.abbreviations; 8452 _decimalSep = localeData.delimiters.decimal; 8453 if (localeData.delimiters.thousands === '.') { 8454 _thousandSep = '\\.'; 8455 } else { 8456 _thousandSep = localeData.delimiters.thousands; 8457 } 8458 8459 // validating currency symbol 8460 temp = val.match(/^[^\d]+/); 8461 if (temp !== null) { 8462 val = val.substr(1); 8463 if (temp[0] !== _currSymbol) { 8464 return false; 8465 } 8466 } 8467 8468 //validating abbreviation symbol 8469 temp = val.match(/[^\d]+$/); 8470 if (temp !== null) { 8471 val = val.slice(0, -1); 8472 if (temp[0] !== _abbrObj.thousand && temp[0] !== _abbrObj.million && temp[0] !== _abbrObj.billion && temp[0] !== _abbrObj.trillion) { 8473 return false; 8474 } 8475 } 8476 8477 _thousandRegEx = new RegExp(_thousandSep + '{2}'); 8478 8479 if (!val.match(/[^\d.,]/g)) { 8480 _valArray = val.split(_decimalSep); 8481 if (_valArray.length > 2) { 8482 return false; 8483 } else { 8484 if (_valArray.length < 2) { 8485 return ( !! _valArray[0].match(/^\d+.*\d$/) && !_valArray[0].match(_thousandRegEx)); 8486 } else { 8487 if (_valArray[0].length === 1) { 8488 return ( !! _valArray[0].match(/^\d+$/) && !_valArray[0].match(_thousandRegEx) && !! _valArray[1].match(/^\d+$/)); 8489 } else { 8490 return ( !! _valArray[0].match(/^\d+.*\d$/) && !_valArray[0].match(_thousandRegEx) && !! _valArray[1].match(/^\d+$/)); 8491 } 8492 } 8493 } 8494 } 8495 8496 return false; 8497 }; 8498 8499 8500 /************************************ 8501 Numeral Prototype 8502 ************************************/ 8503 8504 numeral.fn = Numeral.prototype = { 8505 clone: function() { 8506 return numeral(this); 8507 }, 8508 format: function(inputString, roundingFunction) { 8509 var value = this._value, 8510 format = inputString || options.defaultFormat, 8511 kind, 8512 output, 8513 formatFunction; 8514 8515 // make sure we have a roundingFunction 8516 roundingFunction = roundingFunction || Math.round; 8517 8518 // format based on value 8519 if (value === 0 && options.zeroFormat !== null) { 8520 output = options.zeroFormat; 8521 } else if (value === null && options.nullFormat !== null) { 8522 output = options.nullFormat; 8523 } else { 8524 for (kind in formats) { 8525 if (format.match(formats[kind].regexps.format)) { 8526 formatFunction = formats[kind].format; 8527 8528 break; 8529 } 8530 } 8531 8532 formatFunction = formatFunction || numeral._.numberToFormat; 8533 8534 output = formatFunction(value, format, roundingFunction); 8535 } 8536 8537 return output; 8538 }, 8539 value: function() { 8540 return this._value; 8541 }, 8542 input: function() { 8543 return this._input; 8544 }, 8545 set: function(value) { 8546 this._value = Number(value); 8547 8548 return this; 8549 }, 8550 add: function(value) { 8551 var corrFactor = _.correctionFactor.call(null, this._value, value); 8552 8553 function cback(accum, curr, currI, O) { 8554 return accum + Math.round(corrFactor * curr); 8555 } 8556 8557 this._value = _.reduce([this._value, value], cback, 0) / corrFactor; 8558 8559 return this; 8560 }, 8561 subtract: function(value) { 8562 var corrFactor = _.correctionFactor.call(null, this._value, value); 8563 8564 function cback(accum, curr, currI, O) { 8565 return accum - Math.round(corrFactor * curr); 8566 } 8567 8568 this._value = _.reduce([value], cback, Math.round(this._value * corrFactor)) / corrFactor; 8569 8570 return this; 8571 }, 8572 multiply: function(value) { 8573 function cback(accum, curr, currI, O) { 8574 var corrFactor = _.correctionFactor(accum, curr); 8575 return Math.round(accum * corrFactor) * Math.round(curr * corrFactor) / Math.round(corrFactor * corrFactor); 8576 } 8577 8578 this._value = _.reduce([this._value, value], cback, 1); 8579 8580 return this; 8581 }, 8582 divide: function(value) { 8583 function cback(accum, curr, currI, O) { 8584 var corrFactor = _.correctionFactor(accum, curr); 8585 return Math.round(accum * corrFactor) / Math.round(curr * corrFactor); 8586 } 8587 8588 this._value = _.reduce([this._value, value], cback); 8589 8590 return this; 8591 }, 8592 difference: function(value) { 8593 return Math.abs(numeral(this._value).subtract(value).value()); 8594 } 8595 }; 8596 8597 /************************************ 8598 Default Locale && Format 8599 ************************************/ 8600 8601 numeral.register('locale', 'en', { 8602 delimiters: { 8603 thousands: ',', 8604 decimal: '.' 8605 }, 8606 abbreviations: { 8607 thousand: 'k', 8608 million: 'm', 8609 billion: 'b', 8610 trillion: 't' 8611 }, 8612 ordinal: function(number) { 8613 var b = number % 10; 8614 return (~~(number % 100 / 10) === 1) ? 'th' : 8615 (b === 1) ? 'st' : 8616 (b === 2) ? 'nd' : 8617 (b === 3) ? 'rd' : 'th'; 8618 }, 8619 currency: { 8620 symbol: '$' 8621 } 8622 }); 8623 8624 8625 8626(function() { 8627 numeral.register('format', 'bps', { 8628 regexps: { 8629 format: /(BPS)/, 8630 unformat: /(BPS)/ 8631 }, 8632 format: function(value, format, roundingFunction) { 8633 var space = numeral._.includes(format, ' BPS') ? ' ' : '', 8634 output; 8635 8636 value = value * 10000; 8637 8638 // check for space before BPS 8639 format = format.replace(/\s?BPS/, ''); 8640 8641 output = numeral._.numberToFormat(value, format, roundingFunction); 8642 8643 if (numeral._.includes(output, ')')) { 8644 output = output.split(''); 8645 8646 output.splice(-1, 0, space + 'BPS'); 8647 8648 output = output.join(''); 8649 } else { 8650 output = output + space + 'BPS'; 8651 } 8652 8653 return output; 8654 }, 8655 unformat: function(string) { 8656 return +(numeral._.stringToNumber(string) * 0.0001).toFixed(15); 8657 } 8658 }); 8659})(); 8660 8661 8662(function() { 8663 var decimal = { 8664 base: 1000, 8665 suffixes: ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'] 8666 }, 8667 binary = { 8668 base: 1024, 8669 suffixes: ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'] 8670 }; 8671 8672 var allSuffixes = decimal.suffixes.concat(binary.suffixes.filter(function (item) { 8673 return decimal.suffixes.indexOf(item) < 0; 8674 })); 8675 var unformatRegex = allSuffixes.join('|'); 8676 // Allow support for BPS (http://www.investopedia.com/terms/b/basispoint.asp) 8677 unformatRegex = '(' + unformatRegex.replace('B', 'B(?!PS)') + ')'; 8678 8679 numeral.register('format', 'bytes', { 8680 regexps: { 8681 format: /([0\s]i?b)/, 8682 unformat: new RegExp(unformatRegex) 8683 }, 8684 format: function(value, format, roundingFunction) { 8685 var output, 8686 bytes = numeral._.includes(format, 'ib') ? binary : decimal, 8687 suffix = numeral._.includes(format, ' b') || numeral._.includes(format, ' ib') ? ' ' : '', 8688 power, 8689 min, 8690 max; 8691 8692 // check for space before 8693 format = format.replace(/\s?i?b/, ''); 8694 8695 for (power = 0; power <= bytes.suffixes.length; power++) { 8696 min = Math.pow(bytes.base, power); 8697 max = Math.pow(bytes.base, power + 1); 8698 8699 if (value === null || value === 0 || value >= min && value < max) { 8700 suffix += bytes.suffixes[power]; 8701 8702 if (min > 0) { 8703 value = value / min; 8704 } 8705 8706 break; 8707 } 8708 } 8709 8710 output = numeral._.numberToFormat(value, format, roundingFunction); 8711 8712 return output + suffix; 8713 }, 8714 unformat: function(string) { 8715 var value = numeral._.stringToNumber(string), 8716 power, 8717 bytesMultiplier; 8718 8719 if (value) { 8720 for (power = decimal.suffixes.length - 1; power >= 0; power--) { 8721 if (numeral._.includes(string, decimal.suffixes[power])) { 8722 bytesMultiplier = Math.pow(decimal.base, power); 8723 8724 break; 8725 } 8726 8727 if (numeral._.includes(string, binary.suffixes[power])) { 8728 bytesMultiplier = Math.pow(binary.base, power); 8729 8730 break; 8731 } 8732 } 8733 8734 value *= (bytesMultiplier || 1); 8735 } 8736 8737 return value; 8738 } 8739 }); 8740})(); 8741 8742 8743(function() { 8744 numeral.register('format', 'currency', { 8745 regexps: { 8746 format: /(\$)/ 8747 }, 8748 format: function(value, format, roundingFunction) { 8749 var locale = numeral.locales[numeral.options.currentLocale], 8750 symbols = { 8751 before: format.match(/^([\+|\-|\(|\s|\$]*)/)[0], 8752 after: format.match(/([\+|\-|\)|\s|\$]*)$/)[0] 8753 }, 8754 output, 8755 symbol, 8756 i; 8757 8758 // strip format of spaces and $ 8759 format = format.replace(/\s?\$\s?/, ''); 8760 8761 // format the number 8762 output = numeral._.numberToFormat(value, format, roundingFunction); 8763 8764 // update the before and after based on value 8765 if (value >= 0) { 8766 symbols.before = symbols.before.replace(/[\-\(]/, ''); 8767 symbols.after = symbols.after.replace(/[\-\)]/, ''); 8768 } else if (value < 0 && (!numeral._.includes(symbols.before, '-') && !numeral._.includes(symbols.before, '('))) { 8769 symbols.before = '-' + symbols.before; 8770 } 8771 8772 // loop through each before symbol 8773 for (i = 0; i < symbols.before.length; i++) { 8774 symbol = symbols.before[i]; 8775 8776 switch (symbol) { 8777 case '$': 8778 output = numeral._.insert(output, locale.currency.symbol, i); 8779 break; 8780 case ' ': 8781 output = numeral._.insert(output, ' ', i + locale.currency.symbol.length - 1); 8782 break; 8783 } 8784 } 8785 8786 // loop through each after symbol 8787 for (i = symbols.after.length - 1; i >= 0; i--) { 8788 symbol = symbols.after[i]; 8789 8790 switch (symbol) { 8791 case '$': 8792 output = i === symbols.after.length - 1 ? output + locale.currency.symbol : numeral._.insert(output, locale.currency.symbol, -(symbols.after.length - (1 + i))); 8793 break; 8794 case ' ': 8795 output = i === symbols.after.length - 1 ? output + ' ' : numeral._.insert(output, ' ', -(symbols.after.length - (1 + i) + locale.currency.symbol.length - 1)); 8796 break; 8797 } 8798 } 8799 8800 8801 return output; 8802 } 8803 }); 8804})(); 8805 8806 8807(function() { 8808 numeral.register('format', 'exponential', { 8809 regexps: { 8810 format: /(e\+|e-)/, 8811 unformat: /(e\+|e-)/ 8812 }, 8813 format: function(value, format, roundingFunction) { 8814 var output, 8815 exponential = typeof value === 'number' && !numeral._.isNaN(value) ? value.toExponential() : '0e+0', 8816 parts = exponential.split('e'); 8817 8818 format = format.replace(/e[\+|\-]{1}0/, ''); 8819 8820 output = numeral._.numberToFormat(Number(parts[0]), format, roundingFunction); 8821 8822 return output + 'e' + parts[1]; 8823 }, 8824 unformat: function(string) { 8825 var parts = numeral._.includes(string, 'e+') ? string.split('e+') : string.split('e-'), 8826 value = Number(parts[0]), 8827 power = Number(parts[1]); 8828 8829 power = numeral._.includes(string, 'e-') ? power *= -1 : power; 8830 8831 function cback(accum, curr, currI, O) { 8832 var corrFactor = numeral._.correctionFactor(accum, curr), 8833 num = (accum * corrFactor) * (curr * corrFactor) / (corrFactor * corrFactor); 8834 return num; 8835 } 8836 8837 return numeral._.reduce([value, Math.pow(10, power)], cback, 1); 8838 } 8839 }); 8840})(); 8841 8842 8843(function() { 8844 numeral.register('format', 'ordinal', { 8845 regexps: { 8846 format: /(o)/ 8847 }, 8848 format: function(value, format, roundingFunction) { 8849 var locale = numeral.locales[numeral.options.currentLocale], 8850 output, 8851 ordinal = numeral._.includes(format, ' o') ? ' ' : ''; 8852 8853 // check for space before 8854 format = format.replace(/\s?o/, ''); 8855 8856 ordinal += locale.ordinal(value); 8857 8858 output = numeral._.numberToFormat(value, format, roundingFunction); 8859 8860 return output + ordinal; 8861 } 8862 }); 8863})(); 8864 8865 8866(function() { 8867 numeral.register('format', 'percentage', { 8868 regexps: { 8869 format: /(%)/, 8870 unformat: /(%)/ 8871 }, 8872 format: function(value, format, roundingFunction) { 8873 var space = numeral._.includes(format, ' %') ? ' ' : '', 8874 output; 8875 8876 if (numeral.options.scalePercentBy100) { 8877 value = value * 100; 8878 } 8879 8880 // check for space before % 8881 format = format.replace(/\s?\%/, ''); 8882 8883 output = numeral._.numberToFormat(value, format, roundingFunction); 8884 8885 if (numeral._.includes(output, ')')) { 8886 output = output.split(''); 8887 8888 output.splice(-1, 0, space + '%'); 8889 8890 output = output.join(''); 8891 } else { 8892 output = output + space + '%'; 8893 } 8894 8895 return output; 8896 }, 8897 unformat: function(string) { 8898 var number = numeral._.stringToNumber(string); 8899 if (numeral.options.scalePercentBy100) { 8900 return number * 0.01; 8901 } 8902 return number; 8903 } 8904 }); 8905})(); 8906 8907 8908(function() { 8909 numeral.register('format', 'time', { 8910 regexps: { 8911 format: /(:)/, 8912 unformat: /(:)/ 8913 }, 8914 format: function(value, format, roundingFunction) { 8915 var hours = Math.floor(value / 60 / 60), 8916 minutes = Math.floor((value - (hours * 60 * 60)) / 60), 8917 seconds = Math.round(value - (hours * 60 * 60) - (minutes * 60)); 8918 8919 return hours + ':' + (minutes < 10 ? '0' + minutes : minutes) + ':' + (seconds < 10 ? '0' + seconds : seconds); 8920 }, 8921 unformat: function(string) { 8922 var timeArray = string.split(':'), 8923 seconds = 0; 8924 8925 // turn hours and minutes into seconds and add them all up 8926 if (timeArray.length === 3) { 8927 // hours 8928 seconds = seconds + (Number(timeArray[0]) * 60 * 60); 8929 // minutes 8930 seconds = seconds + (Number(timeArray[1]) * 60); 8931 // seconds 8932 seconds = seconds + Number(timeArray[2]); 8933 } else if (timeArray.length === 2) { 8934 // minutes 8935 seconds = seconds + (Number(timeArray[0]) * 60); 8936 // seconds 8937 seconds = seconds + Number(timeArray[1]); 8938 } 8939 return Number(seconds); 8940 } 8941 }); 8942})(); 8943 8944return numeral; 8945})); 8946 8947 8948/***/ }), 8949
vendor: 5,681 bytes, lines 8950-9144
8950/***/ "./node_modules/process/browser.js": 8951/*!*****************************************!*\ 8952 !*** ./node_modules/process/browser.js ***! 8953 \*****************************************/ 8954/*! no static exports found */ 8955/***/ (function(module, exports) { 8956 8957// shim for using process in browser 8958var process = module.exports = {}; 8959 8960// cached from whatever global is present so that test runners that stub it 8961// don't break things. But we need to wrap it in a try catch in case it is 8962// wrapped in strict mode code which doesn't define any globals. It's inside a 8963// function because try/catches deoptimize in certain engines. 8964 8965var cachedSetTimeout; 8966var cachedClearTimeout; 8967 8968function defaultSetTimout() { 8969 throw new Error('setTimeout has not been defined'); 8970} 8971function defaultClearTimeout () { 8972 throw new Error('clearTimeout has not been defined'); 8973} 8974(function () { 8975 try { 8976 if (typeof setTimeout === 'function') { 8977 cachedSetTimeout = setTimeout; 8978 } else { 8979 cachedSetTimeout = defaultSetTimout; 8980 } 8981 } catch (e) { 8982 cachedSetTimeout = defaultSetTimout; 8983 } 8984 try { 8985 if (typeof clearTimeout === 'function') { 8986 cachedClearTimeout = clearTimeout; 8987 } else { 8988 cachedClearTimeout = defaultClearTimeout; 8989 } 8990 } catch (e) { 8991 cachedClearTimeout = defaultClearTimeout; 8992 } 8993} ()) 8994function runTimeout(fun) { 8995 if (cachedSetTimeout === setTimeout) { 8996 //normal enviroments in sane situations 8997 return setTimeout(fun, 0); 8998 } 8999 // if setTimeout wasn't available but was latter defined 9000 if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { 9001 cachedSetTimeout = setTimeout; 9002 return setTimeout(fun, 0); 9003 } 9004 try { 9005 // when when somebody has screwed with setTimeout but no I.E. maddness 9006 return cachedSetTimeout(fun, 0); 9007 } catch(e){ 9008 try { 9009 // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally 9010 return cachedSetTimeout.call(null, fun, 0); 9011 } catch(e){ 9012 // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error 9013 return cachedSetTimeout.call(this, fun, 0); 9014 } 9015 } 9016 9017 9018} 9019function runClearTimeout(marker) { 9020 if (cachedClearTimeout === clearTimeout) { 9021 //normal enviroments in sane situations 9022 return clearTimeout(marker); 9023 } 9024 // if clearTimeout wasn't available but was latter defined 9025 if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { 9026 cachedClearTimeout = clearTimeout; 9027 return clearTimeout(marker); 9028 } 9029 try { 9030 // when when somebody has screwed with setTimeout but no I.E. maddness 9031 return cachedClearTimeout(marker); 9032 } catch (e){ 9033 try { 9034 // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally 9035 return cachedClearTimeout.call(null, marker); 9036 } catch (e){ 9037 // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. 9038 // Some versions of I.E. have different rules for clearTimeout vs setTimeout 9039 return cachedClearTimeout.call(this, marker); 9040 } 9041 } 9042 9043 9044 9045} 9046var queue = []; 9047var draining = false; 9048var currentQueue; 9049var queueIndex = -1; 9050 9051function cleanUpNextTick() { 9052 if (!draining || !currentQueue) { 9053 return; 9054 } 9055 draining = false; 9056 if (currentQueue.length) { 9057 queue = currentQueue.concat(queue); 9058 } else { 9059 queueIndex = -1; 9060 } 9061 if (queue.length) { 9062 drainQueue(); 9063 } 9064} 9065 9066function drainQueue() { 9067 if (draining) { 9068 return; 9069 } 9070 var timeout = runTimeout(cleanUpNextTick); 9071 draining = true; 9072 9073 var len = queue.length; 9074 while(len) { 9075 currentQueue = queue; 9076 queue = []; 9077 while (++queueIndex < len) { 9078 if (currentQueue) { 9079 currentQueue[queueIndex].run(); 9080 } 9081 } 9082 queueIndex = -1; 9083 len = queue.length; 9084 } 9085 currentQueue = null; 9086 draining = false; 9087 runClearTimeout(timeout); 9088} 9089 9090process.nextTick = function (fun) { 9091 var args = new Array(arguments.length - 1); 9092 if (arguments.length > 1) { 9093 for (var i = 1; i < arguments.length; i++) { 9094 args[i - 1] = arguments[i]; 9095 } 9096 } 9097 queue.push(new Item(fun, args)); 9098 if (queue.length === 1 && !draining) { 9099 runTimeout(drainQueue); 9100 } 9101}; 9102 9103// v8 likes predictible objects 9104function Item(fun, array) { 9105 this.fun = fun; 9106 this.array = array; 9107} 9108Item.prototype.run = function () { 9109 this.fun.apply(null, this.array); 9110}; 9111process.title = 'browser'; 9112process.browser = true; 9113process.env = {}; 9114process.argv = []; 9115process.version = ''; // empty string to avoid regexp issues 9116process.versions = {}; 9117 9118function noop() {} 9119 9120process.on = noop; 9121process.addListener = noop; 9122process.once = noop; 9123process.off = noop; 9124process.removeListener = noop; 9125process.removeAllListeners = noop; 9126process.emit = noop; 9127process.prependListener = noop; 9128process.prependOnceListener = noop; 9129 9130process.listeners = function (name) { return [] } 9131 9132process.binding = function (name) { 9133 throw new Error('process.binding is not supported'); 9134}; 9135 9136process.cwd = function () { return '/' }; 9137process.chdir = function (dir) { 9138 throw new Error('process.chdir is not supported'); 9139}; 9140process.umask = function() { return 0; }; 9141 9142 9143/***/ }), 9144
vendor: 7,087 bytes, lines 9145-9342
9145/***/ "./node_modules/setimmediate/setImmediate.js": 9146/*!***************************************************!*\ 9147 !*** ./node_modules/setimmediate/setImmediate.js ***! 9148 \***************************************************/ 9149/*! no static exports found */ 9150/***/ (function(module, exports, __webpack_require__) { 9151 9152/* WEBPACK VAR INJECTION */(function(global, process) {(function (global, undefined) { 9153 "use strict"; 9154 9155 if (global.setImmediate) { 9156 return; 9157 } 9158 9159 var nextHandle = 1; // Spec says greater than zero 9160 var tasksByHandle = {}; 9161 var currentlyRunningATask = false; 9162 var doc = global.document; 9163 var registerImmediate; 9164 9165 function setImmediate(callback) { 9166 // Callback can either be a function or a string 9167 if (typeof callback !== "function") { 9168 callback = new Function("" + callback); 9169 } 9170 // Copy function arguments 9171 var args = new Array(arguments.length - 1); 9172 for (var i = 0; i < args.length; i++) { 9173 args[i] = arguments[i + 1]; 9174 } 9175 // Store and register the task 9176 var task = { callback: callback, args: args }; 9177 tasksByHandle[nextHandle] = task; 9178 registerImmediate(nextHandle); 9179 return nextHandle++; 9180 } 9181 9182 function clearImmediate(handle) { 9183 delete tasksByHandle[handle]; 9184 } 9185 9186 function run(task) { 9187 var callback = task.callback; 9188 var args = task.args; 9189 switch (args.length) { 9190 case 0: 9191 callback(); 9192 break; 9193 case 1: 9194 callback(args[0]); 9195 break; 9196 case 2: 9197 callback(args[0], args[1]); 9198 break; 9199 case 3: 9200 callback(args[0], args[1], args[2]); 9201 break; 9202 default: 9203 callback.apply(undefined, args); 9204 break; 9205 } 9206 } 9207 9208 function runIfPresent(handle) { 9209 // From the spec: "Wait until any invocations of this algorithm started before this one have completed." 9210 // So if we're currently running a task, we'll need to delay this invocation. 9211 if (currentlyRunningATask) { 9212 // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a 9213 // "too much recursion" error. 9214 setTimeout(runIfPresent, 0, handle); 9215 } else { 9216 var task = tasksByHandle[handle]; 9217 if (task) { 9218 currentlyRunningATask = true; 9219 try { 9220 run(task); 9221 } finally { 9222 clearImmediate(handle); 9223 currentlyRunningATask = false; 9224 } 9225 } 9226 } 9227 } 9228 9229 function installNextTickImplementation() { 9230 registerImmediate = function(handle) { 9231 process.nextTick(function () { runIfPresent(handle); }); 9232 }; 9233 } 9234 9235 function canUsePostMessage() { 9236 // The test against `importScripts` prevents this implementation from being installed inside a web worker, 9237 // where `global.postMessage` means something completely different and can't be used for this purpose. 9238 if (global.postMessage && !global.importScripts) { 9239 var postMessageIsAsynchronous = true; 9240 var oldOnMessage = global.onmessage; 9241 global.onmessage = function() { 9242 postMessageIsAsynchronous = false; 9243 }; 9244 global.postMessage("", "*"); 9245 global.onmessage = oldOnMessage; 9246 return postMessageIsAsynchronous; 9247 } 9248 } 9249 9250 function installPostMessageImplementation() { 9251 // Installs an event handler on `global` for the `message` event: see 9252 // * https://developer.mozilla.org/en/DOM/window.postMessage 9253 // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages 9254 9255 var messagePrefix = "setImmediate$" + Math.random() + "$"; 9256 var onGlobalMessage = function(event) { 9257 if (event.source === global && 9258 typeof event.data === "string" && 9259 event.data.indexOf(messagePrefix) === 0) { 9260 runIfPresent(+event.data.slice(messagePrefix.length)); 9261 } 9262 }; 9263 9264 if (global.addEventListener) { 9265 global.addEventListener("message", onGlobalMessage, false); 9266 } else { 9267 global.attachEvent("onmessage", onGlobalMessage); 9268 } 9269 9270 registerImmediate = function(handle) { 9271 global.postMessage(messagePrefix + handle, "*"); 9272 }; 9273 } 9274 9275 function installMessageChannelImplementation() { 9276 var channel = new MessageChannel(); 9277 channel.port1.onmessage = function(event) { 9278 var handle = event.data; 9279 runIfPresent(handle); 9280 }; 9281 9282 registerImmediate = function(handle) { 9283 channel.port2.postMessage(handle); 9284 }; 9285 } 9286 9287 function installReadyStateChangeImplementation() { 9288 var html = doc.documentElement; 9289 registerImmediate = function(handle) { 9290 // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted 9291 // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called. 9292 var script = doc.createElement("script"); 9293 script.onreadystatechange = function () { 9294 runIfPresent(handle); 9295 script.onreadystatechange = null; 9296 html.removeChild(script); 9297 script = null; 9298 }; 9299 html.appendChild(script); 9300 }; 9301 } 9302 9303 function installSetTimeoutImplementation() { 9304 registerImmediate = function(handle) { 9305 setTimeout(runIfPresent, 0, handle); 9306 }; 9307 } 9308 9309 // If supported, we should attach to the prototype of global, since that is where setTimeout et al. live. 9310 var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global); 9311 attachTo = attachTo && attachTo.setTimeout ? attachTo : global; 9312 9313 // Don't get fooled by e.g. browserify environments. 9314 if ({}.toString.call(global.process) === "[object process]") { 9315 // For Node.js before 0.9 9316 installNextTickImplementation(); 9317 9318 } else if (canUsePostMessage()) { 9319 // For non-IE10 modern browsers 9320 installPostMessageImplementation(); 9321 9322 } else if (global.MessageChannel) { 9323 // For web workers, where supported 9324 installMessageChannelImplementation(); 9325 9326 } else if (doc && "onreadystatechange" in doc.createElement("script")) { 9327 // For IE 6â8 9328 installReadyStateChangeImplementation(); 9329 9330 } else { 9331 // For older browsers 9332 installSetTimeoutImplementation(); 9333 } 9334 9335 attachTo.setImmediate = setImmediate; 9336 attachTo.clearImmediate = clearImmediate; 9337}(typeof self === "undefined" ? typeof global === "undefined" ? this : global : self)); 9338 9339/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"), __webpack_require__(/*! ./../process/browser.js */ "./node_modules/process/browser.js"))) 9340 9341/***/ }), 9342
vendor: 2,587 bytes, lines 9343-9417
9343/***/ "./node_modules/timers-browserify/main.js": 9344/*!************************************************!*\ 9345 !*** ./node_modules/timers-browserify/main.js ***! 9346 \************************************************/ 9347/*! no static exports found */ 9348/***/ (function(module, exports, __webpack_require__) { 9349 9350/* WEBPACK VAR INJECTION */(function(global) {var scope = (typeof global !== "undefined" && global) || 9351 (typeof self !== "undefined" && self) || 9352 window; 9353var apply = Function.prototype.apply; 9354 9355// DOM APIs, for completeness 9356 9357exports.setTimeout = function() { 9358 return new Timeout(apply.call(setTimeout, scope, arguments), clearTimeout); 9359}; 9360exports.setInterval = function() { 9361 return new Timeout(apply.call(setInterval, scope, arguments), clearInterval); 9362}; 9363exports.clearTimeout = 9364exports.clearInterval = function(timeout) { 9365 if (timeout) { 9366 timeout.close(); 9367 } 9368}; 9369 9370function Timeout(id, clearFn) { 9371 this._id = id; 9372 this._clearFn = clearFn; 9373} 9374Timeout.prototype.unref = Timeout.prototype.ref = function() {}; 9375Timeout.prototype.close = function() { 9376 this._clearFn.call(scope, this._id); 9377}; 9378 9379// Does not start the time, just sets up the members needed. 9380exports.enroll = function(item, msecs) { 9381 clearTimeout(item._idleTimeoutId); 9382 item._idleTimeout = msecs; 9383}; 9384 9385exports.unenroll = function(item) { 9386 clearTimeout(item._idleTimeoutId); 9387 item._idleTimeout = -1; 9388}; 9389 9390exports._unrefActive = exports.active = function(item) { 9391 clearTimeout(item._idleTimeoutId); 9392 9393 var msecs = item._idleTimeout; 9394 if (msecs >= 0) { 9395 item._idleTimeoutId = setTimeout(function onTimeout() { 9396 if (item._onTimeout) 9397 item._onTimeout(); 9398 }, msecs); 9399 } 9400}; 9401 9402// setimmediate attaches itself to the global object 9403__webpack_require__(/*! setimmediate */ "./node_modules/setimmediate/setImmediate.js"); 9404// On some exotic environments, it's not clear which object `setimmediate` was 9405// able to install onto. Search each possibility in the same order as the 9406// `setimmediate` library. 9407exports.setImmediate = (typeof self !== "undefined" && self.setImmediate) || 9408 (typeof global !== "undefined" && global.setImmediate) || 9409 (this && this.setImmediate); 9410exports.clearImmediate = (typeof self !== "undefined" && self.clearImmediate) || 9411 (typeof global !== "undefined" && global.clearImmediate) || 9412 (this && this.clearImmediate); 9413 9414/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) 9415 9416/***/ }), 9417
vendor: 724 bytes, lines 9418-9448
9418/***/ "./node_modules/webpack/buildin/global.js": 9419/*!***********************************!*\ 9420 !*** (webpack)/buildin/global.js ***! 9421 \***********************************/ 9422/*! no static exports found */ 9423/***/ (function(module, exports) { 9424 9425var g; 9426 9427// This works in non-strict mode 9428g = (function() { 9429 return this; 9430})(); 9431 9432try { 9433 // This works if eval is allowed (see CSP) 9434 g = g || new Function("return this")(); 9435} catch (e) { 9436 // This works if the window reference is available 9437 if (typeof window === "object") g = window; 9438} 9439 9440// g can still be undefined, but nothing to do about it... 9441// We return undefined, instead of nothing here, so it's 9442// easier to handle this case. if(!global) { ...} 9443 9444module.exports = g; 9445 9446 9447/***/ }), 9448
vendor: 9,830 bytes, lines 9449-9759
9449/***/ "./node_modules/wezom-module-loader/index.js": 9450/*!***************************************************!*\ 9451 !*** ./node_modules/wezom-module-loader/index.js ***! 9452 \***************************************************/ 9453/*! no static exports found */ 9454/***/ (function(module, exports, __webpack_require__) { 9455 9456"use strict"; 9457 9458 9459/** 9460 * @module 9461 */ 9462 9463Object.defineProperty(exports, "__esModule", { 9464 value: true 9465}); 9466 9467var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; 9468 9469var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); 9470 9471var _jquery = __webpack_require__(/*! jquery */ "jquery"); 9472 9473var _jquery2 = _interopRequireDefault(_jquery); 9474 9475function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 9476 9477function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 9478 9479// ---------------------------------------- 9480// Private 9481// ---------------------------------------- 9482 9483/** 9484 * @param {string} prop 9485 * @param {*} value 9486 * @private 9487 */ 9488function isProtected(prop, value) { 9489 return console.warn('ModuleLoader.' + prop + ' is protected property! You cannot change it to "' + value + '" after create!'); 9490} 9491 9492// ---------------------------------------- 9493// Public 9494// ---------------------------------------- 9495 9496var ModuleLoader = function () { 9497 /** 9498 * @param {Object} loaderData 9499 * @param {Promise} [loaderData.importPromise=null] 9500 * @param {string} [loaderData.initSelector='.js-init'] 9501 * @param {string} [loaderData.initFunctionName='loaderInit'] 9502 * @param {Object} [loaderData.list={}] 9503 * @param {Object} [loaderData.debug=false] 9504 * @param {string} [loaderData.loadingClass='_module-loading'] 9505 * @param {string} [loaderData.loadedClass='_module-loaded'] 9506 * 9507 * @prop {string} initSelector 9508 * @prop {string} initFunctionName 9509 * @prop {Object} list 9510 * @prop {Object} modules 9511 * @prop {boolean} debug 9512 * @prop {string} loadingClass 9513 * @prop {string} loadedClass 9514 */ 9515 function ModuleLoader(loaderData) { 9516 _classCallCheck(this, ModuleLoader); 9517 9518 var _loaderData$importPro = loaderData.importPromise, 9519 importPromise = _loaderData$importPro === undefined ? null : _loaderData$importPro, 9520 _loaderData$initSelec = loaderData.initSelector, 9521 initSelector = _loaderData$initSelec === undefined ? '.js-init' : _loaderData$initSelec, 9522 _loaderData$initFunct = loaderData.initFunctionName, 9523 initFunctionName = _loaderData$initFunct === undefined ? 'loaderInit' : _loaderData$initFunct, 9524 _loaderData$list = loaderData.list, 9525 list = _loaderData$list === undefined ? {} : _loaderData$list, 9526 _loaderData$loadingCl = loaderData.loadingClass, 9527 loadingClass = _loaderData$loadingCl === undefined ? '_module-loading' : _loaderData$loadingCl, 9528 _loaderData$loadedCla = loaderData.loadedClass, 9529 loadedClass = _loaderData$loadedCla === undefined ? '_module-loaded' : _loaderData$loadedCla, 9530 _loaderData$debug = loaderData.debug, 9531 debug = _loaderData$debug === undefined ? false : _loaderData$debug; 9532 9533 9534 if (typeof importPromise !== 'function') { 9535 throw new Error('ModuleLoader ERROR! You must specify "importPromise" property, as Function with import()'); 9536 } 9537 9538 if ((typeof list === 'undefined' ? 'undefined' : _typeof(list)) !== 'object' || Object.keys(list).length === 0) { 9539 throw new Error('ModuleLoader ERROR! You must specify "list" property, as Object with values'); 9540 } 9541 9542 for (var moduleName in list) { 9543 var selectors = list[moduleName]; 9544 if (Array.isArray(selectors)) { 9545 list[moduleName] = selectors.join(','); 9546 } 9547 } 9548 9549 var modules = {}; 9550 9551 var _loop = function _loop(_moduleName) { 9552 modules[_moduleName] = function () { 9553 return importPromise(_moduleName); 9554 }; 9555 }; 9556 9557 for (var _moduleName in list) { 9558 _loop(_moduleName); 9559 } 9560 9561 Object.defineProperty(this, 'initSelector', { 9562 get: function get() { 9563 return initSelector; 9564 }, 9565 set: function set(val) { 9566 return isProtected('initSelector', val); 9567 } 9568 }); 9569 9570 Object.defineProperty(this, 'initFunctionName', { 9571 get: function get() { 9572 return initFunctionName; 9573 }, 9574 set: function set(val) { 9575 return isProtected('initFunctionName', val); 9576 } 9577 }); 9578 9579 Object.defineProperty(this, 'list', { 9580 get: function get() { 9581 return list; 9582 }, 9583 set: function set(val) { 9584 return isProtected('list', val); 9585 } 9586 }); 9587 9588 Object.defineProperty(this, 'modules', { 9589 get: function get() { 9590 return modules; 9591 }, 9592 set: function set(val) { 9593 return isProtected('modules', val); 9594 } 9595 }); 9596 9597 Object.defineProperty(this, 'loadingClass', { 9598 get: function get() { 9599 return loadingClass; 9600 }, 9601 set: function set(val) { 9602 return isProtected('loadingClass', val); 9603 } 9604 }); 9605 9606 Object.defineProperty(this, 'loadedClass', { 9607 get: function get() { 9608 return loadedClass; 9609 }, 9610 set: function set(val) { 9611 return isProtected('loadedClass', val); 9612 } 9613 }); 9614 9615 this.debug = debug; 9616 } 9617 9618 /** 9619 * @param {string} type 9620 * @param {string} msg 9621 * @param {...*} [data] 9622 * @private 9623 */ 9624 9625 9626 _createClass(ModuleLoader, [{ 9627 key: 'log', 9628 value: function log(type, msg) { 9629 if (this.debug) { 9630 var _console; 9631 9632 for (var _len = arguments.length, data = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { 9633 data[_key - 2] = arguments[_key]; 9634 } 9635 9636 (_console = console)[type].apply(_console, ['ModuleLoader ' + type + ': ' + msg].concat(data)); 9637 } 9638 } 9639 9640 /** 9641 * @param {jQuery} [$context=$(document)] 9642 * @param {string} [selectors] 9643 * @returns {jQuery} 9644 * @public 9645 */ 9646 9647 }, { 9648 key: 'getElements', 9649 value: function getElements() { 9650 var _this = this; 9651 9652 var $context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : (0, _jquery2.default)(document); 9653 var selectors = arguments[1]; 9654 9655 var selector = this.initSelector; 9656 if (selectors) { 9657 selector = selectors.split(',').map(function (selector) { 9658 return _this.initSelector + selector; 9659 }).join(','); 9660 } 9661 this.log('info', 'Get elements "' + selector + '" in', $context); 9662 return $context.find(selector); 9663 } 9664 9665 /** 9666 * @param {string} moduleName 9667 * @param {jQuery} [$context] 9668 * @public 9669 */ 9670 9671 }, { 9672 key: 'runModule', 9673 value: function runModule(moduleName, $context) { 9674 this.log('warn', 'Use .load() only method after .init()'); 9675 console.log(moduleName, $context); 9676 } 9677 9678 /** 9679 * @param {jQuery} $elements 9680 * @private 9681 */ 9682 9683 }, { 9684 key: 'markAsLoadingElements', 9685 value: function markAsLoadingElements($elements) { 9686 $elements.not(this.loadedClass).addClass(this.loadingClass); 9687 } 9688 9689 /** 9690 * @param {jQuery} $elements 9691 * @private 9692 */ 9693 9694 }, { 9695 key: 'markAsLoadedElements', 9696 value: function markAsLoadedElements($elements) { 9697 $elements.removeClass(this.loadingClass).addClass(this.loadedClass); 9698 $elements.data('moduleLoader', this); 9699 } 9700 9701 /** 9702 * @param {jQuery} [$context=$(document)] 9703 * @public 9704 */ 9705 9706 }, { 9707 key: 'init', 9708 value: function init() { 9709 var $context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : (0, _jquery2.default)(document); 9710 9711 var $elements = this.getElements($context); 9712 if (!$elements.length) { 9713 this.log('info', 'No init elements with selector "' + this.initSelector + '"'); 9714 return false; 9715 } 9716 9717 this.runModule = function (moduleName, $context) { 9718 var _this2 = this; 9719 9720 var selectors = this.list[moduleName]; 9721 var $moduleElements = $context ? this.getElements($context, selectors) : $elements.filter(selectors); 9722 this.markAsLoadingElements($moduleElements); 9723 9724 if ($moduleElements.length) { 9725 this.log('info', 'Load module "' + moduleName + '"'); 9726 return this.modules[moduleName]().then(function (module) { 9727 var isFunction = typeof module[_this2.initFunctionName] === 'function'; 9728 if (isFunction) { 9729 _this2.log('info', 'Init module "' + moduleName + '"'); 9730 _this2.markAsLoadedElements($moduleElements); 9731 module[_this2.initFunctionName]($moduleElements, _this2); 9732 } else { 9733 _this2.log('warn', 'Module "' + moduleName + '" has no exported method "' + _this2.initSelector + '"'); 9734 } 9735 }).catch(function (err) { 9736 console.error(err); 9737 }); 9738 } 9739 9740 return Promise.resolve(); 9741 }; 9742 9743 for (var moduleName in this.list) { 9744 this.runModule(moduleName); 9745 } 9746 } 9747 }]); 9748 9749 return ModuleLoader; 9750}(); 9751 9752// ---------------------------------------- 9753// Exports 9754// ---------------------------------------- 9755 9756exports.default = ModuleLoader; 9757 9758/***/ }), 9759
vendor: 9,240 bytes, lines 9760-10058
9760/***/ "./node_modules/wezom-standard-tabs/index.js": 9761/*!***************************************************!*\ 9762 !*** ./node_modules/wezom-standard-tabs/index.js ***! 9763 \***************************************************/ 9764/*! exports provided: default */ 9765/***/ (function(module, __webpack_exports__, __webpack_require__) { 9766 9767"use strict"; 9768__webpack_require__.r(__webpack_exports__); 9769/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ "jquery"); 9770/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__); 9771/* harmony import */ var custom_jquery_methods_fn_get_my_elements__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! custom-jquery-methods/fn/get-my-elements */ "./node_modules/custom-jquery-methods/fn/get-my-elements.js"); 9772/* harmony import */ var custom_jquery_methods_fn_get_my_elements__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(custom_jquery_methods_fn_get_my_elements__WEBPACK_IMPORTED_MODULE_1__); 9773 9774 9775/** 9776 * Wezom Standard Tabs 9777 * @module 9778 * @author Oleg Dutchenko <[email protected]> 9779 * @licence {@link https://github.com/WezomAgency/wezom-standard-tabs/blob/master/LICENSE} 9780 */ 9781 9782// ---------------------------------------- 9783// Imports 9784// ---------------------------------------- 9785 9786 9787 9788 9789// ---------------------------------------- 9790// Private 9791// ---------------------------------------- 9792 9793/** 9794 * @type {{myBlocks: string, myBlock: string, myButtons: string}} 9795 * @private 9796 */ 9797const _myKeys = { 9798 myBlock: '$myWsTabsBlock', 9799 myBlocks: '$myWsTabsBlocks', 9800 myButtons: '$myWsTabsButtons' 9801}; 9802 9803/** 9804 * @param {jQuery} $button 9805 * @return {boolean|undefined} 9806 * @private 9807 */ 9808function _noReact ($button) { 9809 return $button.hasClass(wsTabs.cssClass.active) || $button.hasClass(wsTabs.cssClass.disabled) || $button.prop('disabled'); 9810} 9811 9812/** 9813 * @param {jQuery} $button 9814 * @param {jQuery} $context 9815 * @return {{myNs:string, myName:string, buttonsSelector:string, buttonSyncSelector:string, blocksSelector:string, blockSelector:string, $block:jQuery, $siblingBlocks:jQuery, $siblingButtons:jQuery, $syncButtons:jQuery}} 9816 * @private 9817 */ 9818function _ejectData ($button, $context) { 9819 let $sibling = null; 9820 const data = { 9821 myNs: $button.data(wsTabs.keys.ns), 9822 myName: $button.data(wsTabs.keys.button), 9823 get buttonsSelector () { 9824 return `[data-${wsTabs.keys.ns}="${this.myNs}"][data-${wsTabs.keys.button}]`; 9825 }, 9826 get buttonSyncSelector () { 9827 return `[data-${wsTabs.keys.ns}="${this.myNs}"][data-${wsTabs.keys.button}="${this.myName}"]`; 9828 }, 9829 get blocksSelector () { 9830 return `[data-${wsTabs.keys.ns}="${this.myNs}"][data-${wsTabs.keys.block}]`; 9831 }, 9832 get blockSelector () { 9833 return `[data-${wsTabs.keys.ns}="${this.myNs}"][data-${wsTabs.keys.block}="${this.myName}"]`; 9834 }, 9835 get $block () { 9836 return $button.getMyElements(_myKeys.myBlock, this.blockSelector); 9837 }, 9838 get $siblingBlocks () { 9839 let $blocks = this.$block.getMyElements(_myKeys.myBlocks, this.blocksSelector, $context, true); 9840 return $blocks.not(this.blockSelector); 9841 }, 9842 get $siblingButtons () { 9843 return $sibling || $button.getMyElements(_myKeys.myButtons, this.buttonsSelector, $context, true); 9844 }, 9845 get $syncButtons () { 9846 return this.$siblingButtons.filter(this.buttonSyncSelector); 9847 } 9848 }; 9849 if (data.$syncButtons.length) { 9850 $sibling = data.$siblingButtons.not(data.$syncButtons); 9851 } 9852 return data; 9853} 9854 9855/** 9856 * @param {string} name 9857 * @param {*} ...args 9858 * @private 9859 */ 9860function _runHook (name, ...args) { 9861 const hooks = wsTabs.hooks[name]; 9862 if (Array.isArray(hooks)) { 9863 hooks.forEach(hook => { 9864 if (typeof hook === 'function') { 9865 hook(...args); 9866 } 9867 }); 9868 } 9869} 9870 9871/** 9872 * @param {jQuery} $button 9873 * @param {jQuery} $context 9874 * @private 9875 */ 9876function _changeTab ($button, $context) { 9877 const { myNs, myName, $block, $siblingBlocks, $siblingButtons, $syncButtons } = _ejectData($button, $context); 9878 if (_noReact($button)) { 9879 _runHook('beforeAgain', myNs, myName, $button, $block); 9880 $button.add($block).trigger(wsTabs.events.again); 9881 _runHook('again', myNs, myName, $button, $block); 9882 return false; 9883 } 9884 9885 _runHook('beforeOff', myNs, myName, $siblingButtons, $siblingBlocks); 9886 _runHook('beforeOn', myNs, myName, $button, $block, $syncButtons); 9887 9888 $siblingButtons.add($siblingBlocks).removeClass(wsTabs.cssClass.active).trigger(wsTabs.events.off); 9889 $button.add($syncButtons).add($block).addClass(wsTabs.cssClass.active).trigger(wsTabs.events.on); 9890 9891 _runHook('off', myNs, myName, $siblingButtons, $siblingBlocks); 9892 _runHook('on', myNs, myName, $button, $block, $syncButtons); 9893} 9894 9895/** 9896 * @param {jQuery} $buttons 9897 * @param {jQuery} $context 9898 * @private 9899 */ 9900function setActiveIfNotHave ($buttons, $context) { 9901 let ns = $buttons.data(wsTabs.keys.ns); 9902 let selector = `[data-${wsTabs.keys.ns}="${ns}"]`; 9903 let $group = $buttons.filter(selector); 9904 9905 if ($group.length) { 9906 let $active = $group.filter(`.${wsTabs.cssClass.active}`); 9907 if (!$active.length) { 9908 _changeTab($group.eq(0), $context); 9909 } 9910 9911 if ($group.length < $buttons.length) { 9912 setActiveIfNotHave($buttons.not(selector), $context); 9913 } 9914 } 9915} 9916 9917/** 9918 * @param {jQuery} $list 9919 * @param {strig[]} keys 9920 * @private 9921 */ 9922function dropDependencies ($list, keys) { 9923 const wsTabsKeys = Object.keys(wsTabs.keys); 9924 $list.each((i, el) => { 9925 let $item = jquery__WEBPACK_IMPORTED_MODULE_0___default()(el); 9926 wsTabsKeys.forEach(key => { 9927 $item.data(key, null); 9928 }); 9929 }); 9930} 9931 9932// ---------------------------------------- 9933// Public 9934// ---------------------------------------- 9935 9936/** 9937 * @namespace 9938 */ 9939const wsTabs = { 9940 /** 9941 * @enum {string} 9942 */ 9943 events: { 9944 on: 'wstabs-on', 9945 off: 'wstabs-off', 9946 again: 'wstabs-again' 9947 }, 9948 9949 /** 9950 * @enum {function[]} 9951 */ 9952 hooks: { 9953 beforeOn: [], 9954 beforeOff: [], 9955 beforeAgain: [], 9956 on: [], 9957 off: [], 9958 again: [], 9959 update: [] 9960 }, 9961 9962 /** 9963 * @enum {string} 9964 */ 9965 cssClass: { 9966 active: 'is-active', 9967 disabled: 'is-disabled' 9968 }, 9969 9970 /** 9971 * @enum {string} 9972 */ 9973 keys: { 9974 ns: 'wstabs-ns', 9975 button: 'wstabs-button', 9976 block: 'wstabs-block' 9977 }, 9978 9979 /** 9980 * Initialize. 9981 * Set dependencies and delegated handlers 9982 * @param {jQuery} [$context=$(document)] 9983 */ 9984 init ($context = jquery__WEBPACK_IMPORTED_MODULE_0___default()(document)) { 9985 this.updateDependencies($context); 9986 $context.on('click', `[data-${this.keys.button}]`, { $context }, function () { 9987 _changeTab(jquery__WEBPACK_IMPORTED_MODULE_0___default()(this), $context); 9988 }); 9989 9990 $context.on('keydown', `[data-${this.keys.button}]`, { $context }, function (event) { 9991 let code = null; 9992 if (event.key !== undefined) { 9993 code = event.key; 9994 } else if (event.keyIdentifier !== undefined) { 9995 code = event.keyIdentifier; 9996 } else if (event.keyCode !== undefined) { 9997 code = event.keyCode; 9998 } 9999 if (code === 13 || code.toLowerCase() === 'enter') { 10000 _changeTab(jquery__WEBPACK_IMPORTED_MODULE_0___default()(this), $context); 10001 } 10002 }); 10003 }, 10004 10005 /** 10006 * Forced activation of tabs if there are no active one 10007 * @param {jQuery} [$context=$(document)] 10008 */ 10009 setActive ($context = jquery__WEBPACK_IMPORTED_MODULE_0___default()(document)) { 10010 let $buttons = $context.find(`[data-${this.keys.button}]`); 10011 setActiveIfNotHave($buttons, $context); 10012 }, 10013 10014 /** 10015 * Remove all dependencies 10016 * @param {jQuery} [$context=$(document)] 10017 * @return {{$buttons: $jQuery, $blocks: $jQuery}} 10018 */ 10019 dropDependencies ($context = jquery__WEBPACK_IMPORTED_MODULE_0___default()(document)) { 10020 let $buttons = $context.find(`[data-${this.keys.button}]`); 10021 let $blocks = $context.find(`[data-${this.keys.block}]`); 10022 dropDependencies($buttons, [_myKeys.myBlock, _myKeys.myButtons]); 10023 dropDependencies($blocks, [_myKeys.myBlocks]); 10024 return { $buttons, $blocks }; 10025 }, 10026 10027 /** 10028 * Update all dependencies with pre-reset. 10029 * Actual when dynamically adding new buttons and blocks to existing tab groups 10030 * @param {jQuery} [$context=$(document)] 10031 */ 10032 updateDependencies ($context = jquery__WEBPACK_IMPORTED_MODULE_0___default()(document)) { 10033 const { $buttons } = this.dropDependencies($context); 10034 $buttons.each((i, button) => { 10035 const $button = jquery__WEBPACK_IMPORTED_MODULE_0___default()(button); 10036 const { myNs, myName, $block, $syncButtons } = _ejectData($button, $context); 10037 _runHook('update', myNs, myName, $button, $block, $syncButtons); 10038 }); 10039 }, 10040 10041 /** 10042 * @param {jQuery} $button 10043 * @param {jQuery} [$context=$(document)] 10044 * @returns {{myNs: string, myName: string, buttonsSelector: string, buttonSyncSelector: string, blocksSelector: string, blockSelector: string, $block: jQuery, $siblingBlocks: jQuery, $siblingButtons: jQuery, $syncButtons: jQuery}} 10045 */ 10046 ejectData ($button, $context = jquery__WEBPACK_IMPORTED_MODULE_0___default()(document)) { 10047 return _ejectData($button, $context); 10048 } 10049}; 10050 10051// ---------------------------------------- 10052// Exports 10053// ---------------------------------------- 10054 10055/* harmony default export */ __webpack_exports__["default"] = (wsTabs); 10056 10057 10058/***/ })
10058, 10059 10060/***/ "jquery": 10061/*!*************************!*\ 10062 !*** external "jQuery" ***! 10063 \*************************/ 10064/*! no static exports found */ 10065/***/ (function(module, exports) { 10066 10067module.exports = jQuery; 10068 10069/***/ }) 10070 10071/******/ }); 10072//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vLm1vZGVybml6cnJjIiwid2VicGFjazovLy8uL19IVE1ML3NyYy9qcy9fbW9kdWxlcy1sb2FkZXJzIGxhenkgXlxcLlxcLy4qJCBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovLy8uL19IVE1ML3NyYy9qcy9fbW9kdWxlcy9iYWxsLW1vZGFsL2luZGV4LmpzIiwid2VicGFjazovLy8uL19IVE1ML3NyYy9qcy9fbW9kdWxlcy9jYXRhbG9nLXNlYXJjaC5qcyIsIndlYnBhY2s6Ly8vLi9fSFRNTC9zcmMvanMvX21vZHVsZXMvY2xpY2stdHJpZ2dlci1mb3IvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vX0hUTUwvc3JjL2pzL19tb2R1bGVzL2Nvb2tpZS1kYXRhLmpzIiwid2VicGFjazovLy8uL19IVE1ML3NyYy9qcy9fbW9kdWxlcy9lY29tbWVyY2UtdHJhY2tpbmcuanMiLCJ3ZWJwYWNrOi8vLy4vX0hUTUwvc3JjL2pzL19tb2R1bGVzL2VxdWFsLWhlaWdodC5qcyIsIndlYnBhY2s6Ly8vLi9fSFRNTC9zcmMvanMvX21vZHVsZXMvbGF6eWxvYWQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vX0hUTUwvc3JjL2pzL19tb2R1bGVzL21haW4tbWVudS5qcyIsIndlYnBhY2s6Ly8vLi9fSFRNTC9zcmMvanMvX21vZHVsZXMvbW9kZXJuaXpyL2N1c3RvbS10ZXN0cy9lZGdlLmpzIiwid2VicGFjazovLy8uL19IVE1ML3NyYy9qcy9fbW9kdWxlcy9tb2Rlcm5penIvY3VzdG9tLXRlc3RzL2ludGVyc2VjdGlvbi1vYnNlcnZlci5qcyIsIndlYnBhY2s6Ly8vLi9fSFRNTC9zcmMvanMvX21vZHVsZXMvbW9kZXJuaXpyL2luZGV4LmpzIiwid2VicGFjazovLy8uL19IVE1ML3NyYy9qcy9fbW9kdWxlcy9wcm9kdWN0cy1maWx0ZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vX0hUTUwvc3JjL2pzL19tb2R1bGVzL3V0bS10cmFja2luZy5qcyIsIndlYnBhY2s6Ly8vLi9fSFRNTC9zcmMvanMvX3BvbHlmaWxscy9tZG4uanMiLCJ3ZWJwYWNrOi8vLy4vX0hUTUwvc3JjL2pzL19wb2x5ZmlsbHMvcHJvbWlzZS1wb2x5ZmlsbC5qcyIsIndlYnBhY2s6Ly8vLi9fSFRNTC9zcmMvanMvX3ZlbmRvcnMvZHluYW1pY0FkYXB0LmpzIiwid2VicGFjazovLy8uL19IVE1ML3NyYy9qcy9fdmVuZG9ycy9qcXVlcnkuanMiLCJ3ZWJwYWNrOi8vLy4vX0hUTUwvc3JjL2pzL2VudHJ5LmpzIiwid2VicGFjazovLy8uL19IVE1ML3NyYy9qcy9tb2R1bGUtbG9hZGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9ib2R5LXNjcm9sbC1sb2NrL2xpYi9ib2R5U2Nyb2xsTG9jay5lc20uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpenIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NyZWF0ZS10aW1lci9jcmVhdGUtdGltZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2N1c3RvbS1qcXVlcnktbWV0aG9kcy9mbi9jaGFuZ2UtbXktY2xhc3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2N1c3RvbS1qcXVlcnktbWV0aG9kcy9mbi9nZXQtbXktZWxlbWVudHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2VzNi1wcm9taXNlLXBvbHlmaWxsL3Byb21pc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2pxdWVyeS1zbm93ZmFsbC9zcmMvc25vd2ZhbGwuanF1ZXJ5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2guZGVib3VuY2UvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL21kbi1wb2x5ZmlsbHMvc3JjL09iamVjdC5hc3NpZ24vYXNzaWduLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9tZG4tcG9seWZpbGxzL3NyYy9PYmplY3QuYXNzaWduL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9ub3Vpc2xpZGVyL2Rpc3Qvbm91aXNsaWRlci5tanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL251bWVyYWwvbnVtZXJhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zZXRpbW1lZGlhdGUvc2V0SW1tZWRpYXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90aW1lcnMtYnJvd3NlcmlmeS9tYWluLmpzIiwid2VicGFjazovLy8od2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3dlem9tLW1vZHVsZS1sb2FkZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3dlem9tLXN0YW5kYXJkLXRhYnMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwialF1ZXJ5XCIiXSwibmFtZXMiOlsiQmFsbE1vZGFsIiwiY29udGFpbmVyIiwiZG9jdW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwiYmFsbCIsIm1vZGFsU3RlcDEiLCJnZXRFbGVtZW50QnlJZCIsIm1vZGFsU3RlcDIiLCJjb25zb2xlIiwid2FybiIsImNvb2tpZURhdGEiLCJyZWNlaXZlIiwic3R5bGUiLCJkaXNwbGF5IiwidmlzaWJpbGl0eSIsImluaXQiLCJjb250YWlucyIsImFwcGVuZENoaWxkIiwicGFyZW50Tm9kZSIsInJlbW92ZUNoaWxkIiwicG9zaXRpb25CYWxsIiwic2V0VGltZW91dCIsIm9wYWNpdHkiLCJwb2ludGVyRXZlbnRzIiwicG9zaXRpb24iLCJjbGFzc0xpc3QiLCJhZGQiLCJyZWN0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0Iiwid2lkdGgiLCJoZWlnaHQiLCJhdHRhY2hUb1JhbmRvbVBvc2l0aW9uIiwiYWRkRXZlbnRMaXN0ZW5lciIsImUiLCJwcmV2ZW50RGVmYXVsdCIsInNob3dNb2RhbFN0ZXAxIiwiaW5pdE1vZGFsSGFuZGxlcnMiLCJpbml0Rm9ybUhhbmRsZXIiLCJpbml0Q29weUJ1dHRvbiIsInJlc2l6ZVRpbWVvdXQiLCJ3aW5kb3ciLCJjbGVhclRpbWVvdXQiLCJib2R5Iiwic2VsZWN0b3JzIiwiY2FuZGlkYXRlcyIsImZvckVhY2giLCJlbGVtZW50cyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJzZWxlY3RvciIsImVsIiwi
10072Z2V0Q29tcHV0ZWRTdHlsZSIsImlzT2J2aW91cyIsInRhZ05hbWUiLCJtYXRjaCIsImdldEF0dHJpYnV0ZSIsImlzR29vZFNpemUiLCJjbG9zZXN0IiwicHVzaCIsInZpZXdwb3J0SGVpZ2h0IiwiaW5uZXJIZWlnaHQiLCJ2aWV3cG9ydFdpZHRoIiwiaW5uZXJXaWR0aCIsInZpc2libGVDYW5kaWRhdGVzIiwiZmlsdGVyIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0IiwibGVuZ3RoIiwicmFuZG9tRWxlbWVudCIsIk1hdGgiLCJmbG9vciIsInJhbmRvbSIsImF0dGFjaFRvRWxlbWVudCIsImVsZW1lbnQiLCJlbGVtZW50UmVjdCIsInNjcm9sbFkiLCJwYWdlWU9mZnNldCIsInNjcm9sbFgiLCJwYWdlWE9mZnNldCIsImJhbGxXaWR0aCIsImJhbGxIZWlnaHQiLCJwb3NpdGlvbnMiLCJzaWRlIiwieCIsInkiLCJyYW5kb21Qb3MiLCJhYnNvbHV0ZVgiLCJhYnNvbHV0ZVkiLCJ6SW5kZXgiLCJwYWRkaW5nIiwiZG9jdW1lbnRIZWlnaHQiLCJtYXgiLCJzY3JvbGxIZWlnaHQiLCJvZmZzZXRIZWlnaHQiLCJkb2N1bWVudEVsZW1lbnQiLCJjbGllbnRIZWlnaHQiLCJkb2N1bWVudFdpZHRoIiwic2Nyb2xsV2lkdGgiLCJvZmZzZXRXaWR0aCIsImNsaWVudFdpZHRoIiwibWluWCIsIm1heFgiLCJtaW5ZIiwibWF4WSIsInJhbmRvbVgiLCJyYW5kb21ZIiwib3ZlcmZsb3ciLCJwcm9tb2NvZGUiLCJwcm9tb2NvZGVJbnB1dCIsInZhbHVlIiwicHJvbW9jb2RlVGV4dCIsImRpc2NvdW50VGV4dCIsInN0YXJ0c1dpdGgiLCJwZXJjZW50IiwidGV4dENvbnRlbnQiLCJjbG9zZUJ1dHRvbnMiLCJidG4iLCJoaWRlTW9kYWwiLCJleHBpcmVzIiwicGF0aCIsIlNhbWVTaXRlIiwiU2VjdXJlIiwibW9kYWwiLCJ0YXJnZXQiLCJmb3JtIiwiJGZvcm0iLCJvbiIsInJlc3BvbnNlIiwibG9nIiwic3VjY2VzcyIsImJhbGxtb2RhbCIsInNhdmVCYWxsIiwiZXJyb3JNc2ciLCJlcnJvciIsImFsZXJ0IiwiZGF0YSIsIm1vZGFsUmVzcG9uc2UiLCJlbWFpbElucHV0IiwiZW1haWwiLCJiYXNlVXJsIiwic2F2ZVVybCIsInJlcGxhY2UiLCIkIiwiYWpheCIsImNhY2hlIiwibWV0aG9kIiwidXJsIiwiZGF0YVR5cGUiLCJjb250ZW50VHlwZSIsImRvbmUiLCJ0ZXh0U3RhdHVzIiwieGhyIiwicHJvbW8iLCJzaG93TW9kYWxTdGVwMiIsIm1lc3NhZ2UiLCJmYWlsIiwic3RhdHVzIiwic3RhdHVzVGV4dCIsInJlYWR5U3RhdGUiLCJyZXNwb25zZVRleHQiLCJyZXNwb25zZUpTT04iLCJKU09OIiwicGFyc2UiLCJlcnJvclJlc3BvbnNlIiwiY29weUJ0biIsInRhcmdldFNlbGVjdG9yIiwidGFyZ2V0SW5wdXQiLCJzZWxlY3QiLCJzZXRTZWxlY3Rpb25SYW5nZSIsImV4ZWNDb21tYW5kIiwib3JpZ2luYWxUZXh0IiwiZXJyIiwicmVmcyIsIm9wZW5CdG4iLCJoYW5kbGVTZWFyY2hBdXRvY29tcGxldGUiLCJzZWFyY2hUZXJtIiwic2VhcmNoQWxsQnRuIiwiaHJlZiIsIndlem9tQ29uZmlnIiwic2VhcmNoIiwiZW5jb2RlVVJJIiwic2VhcmNoQXV0b2NvbXBsZXRlIiwicXVlcnkiLCJyZXMiLCJpdGVtc19tYXJrdXAiLCJub3RGb3VuZFRleHQiLCJpdGVtc0xpc3QiLCJpbm5lckhUTUwiLCJpdGVtc1dyYXAiLCJoYW5kbGVTZWFyY2hJbnB1dCIsInRyaW0iLCJ0b0xvY2FsZUxvd2VyQ2FzZSIsInNlYXJjaElucHV0IiwiaGFuZGxlRXNjQ2xvc2UiLCJldmVudCIsImNvZGUiLCJtZW51IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInRvZ2dsZVNlYXJjaCIsImhhbmRsZUhvdEtleVByZXNzIiwiY3RybEtleSIsIm1ldGFLZXkiLCJpc1NlYXJjaE9wZW4iLCJmb2N1cyIsInNldEF0dHJpYnV0ZSIsInRvZ2dsZSIsImNsb3NlQnRuIiwiY2xpY2tUcmlnZ2VyRm9yIiwiJHRoaXMiLCIkZm9yIiwiZ2V0TXlFbGVtZW50cyIsImNsaWNrIiwiZW5jb2RlciIsImVuY29kZVVSSUNvbXBvbmVudCIsImRlY29kZXIiLCJkZWNvZGVVUklDb21wb25lbnQiLCJrZXkiLCJvcHRpb25zIiwiYWxsb3dVc2FnZSIsImFsbG93VXNhZ2VLZXkiLCJkIiwiRGF0ZSIsInNldFRpbWUiLCJnZXRUaW1lIiwidG9VVENTdHJpbmciLCJ1cGRhdGVkQ29va2llIiwicHJvcE5hbWUiLCJwcm9wVmFsdWUiLCJjb29raWUiLCJtYXRjaGVzIiwiUmVnRXhwIiwidW5kZWZpbmVkIiwiZGVsZXRlIiwiYXNrVXNhZ2UiLCIkaW5mb0Jsb2NrIiwiJGluZm9CdXR0b24iLCJoaWRkZW5DbGFzcyIsImFkZENsYXNzIiwiYWxsb3dVc2FnZVZhbHVlIiwicmVtb3ZlQ2xhc3MiLCJhbGxvd1VzYWdlRGVsYXkiLCJFY29tbWVyY2VUcmFja2luZyIsIml0ZW1CcmFuZCIsImN1cnJlbmN5IiwiZGF0YUxheWVyIiwiZWNvbW1lcmNlIiwicHJvZHVjdERhdGEiLCJpdGVtX2JyYW5kIiwiY2xlYXIiLCJpdGVtcyIsInF1YW50aXR5IiwiQXJyYXkiLCJpc0FycmF5IiwiaXRlbSIsInBhcnNlSW50IiwicHJpY2UiLCJwdXNoRGF0YSIsImFtb3VudCIsIml0ZW1zQXJyYXkiLCJPYmplY3QiLCJ2YWx1ZXMiLCJwYXJzZUZsb2F0Iiwib3JkZXIiLCJvcmRlcklkIiwib3JkZXJfaWQiLCJkZWxpdmVyeVR5cGUiLCJkZWxpdmVyeV90eXBlIiwiY291cG9uIiwidHJhbnNhY3Rpb25faWQiLCJlcXVhbEhlaWdodHNFbGVtZW50cyIsIkVxdWFsSGVpZ2h0IiwiaXRlbUVsZW1lbnQiLCJlcXVhbEhlaWdodHMiLCJsYXp5bG9hZCIsInNlbGVjdG9yT3JOb2RlTGlzdCIsIm9wdGlvbiIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiX2luaXRpYWxpemUiLCJ6ekxvYWQiLCJkZWZhdWx0IiwiTW9kZXJuaXpyIiwiaW50ZXJzZWN0aW9ub2JzZXJ2ZXIiLCJ0aGVuIiwidG9nZ2xlTWVudSIsImlzTWVudU9wZW4iLCJ0b2dnbGVCb2R5U2Nyb2xsTG9jayIsIm9wZW5Nb2JpbGVCdG4iLCJmaXhlZEVsZW1lbnRzIiwiZ2V0QnJ3b3NlclNjcm9sbGJhcldpZHRoIiwiaXNJT1MiLCJuYXZpZ2F0b3IiLCJNYXhUb3VjaFBvaW50cyIsIm1zTWF4VG91Y2hQb2ludHMiLCJ0b2dnbGVGaXhlZEVsZW1lbnRzT2Zmc2V0IiwicGFkZGluZ1JpZ2h0IiwidGFyZ2V0UmVmIiwic2Nyb2xsQmFyV2lkdGgiLCJhZGRUZXN0IiwidGVzdCIsInVzZXJBZ2VudCIsImpRdWVyeSIsImVsbXMiLCJmaWx0ZXJQYXJlbnQiLCJzbGlkZXJFbG0iLCJtaW5FbG0iLCJtYXhFbG0iLCJtaW4iLCJjdXJyZW50TWluIiwiY3VycmVudE1heCIsImRlY2ltYWxzIiwiaXNFbmFibGVkIiwicHJlcGFyZVZhbHVlcyIsImJpbmQiLCJpbml0U2xpZGVyIiwiX3QiLCJfZSIsIl92Iiwic2xpZGVyIiwibWluVmFsdWUiLCJtYXhWYWx1ZSIsIk51bWJlciIsInZhbCIsIm1pblN0YXJ0IiwibWF4U3RhcnQiLCJmb3JtYXRTbGlkZSIsInRvU3RyaW5nIiwidG8iLCJ2IiwiaCIsInIiLCJmb3JtYXQiLCJyZXBlYXQiLCJ0b0ZpeGVkIiwiZnJvbSIsInNsaWRlck9wdGlvbnMiLCJhbmltYXRlIiwiYmVoYXZpb3VyIiwiY29ubmVjdCIsIm
10072Nzc1ByZWZpeCIsInN0YXJ0IiwicmFuZ2UiLCJwaXBzIiwibW9kZSIsImRlbnNpdHkiLCJzdWJzdHJpbmciLCJoYXNPd25Qcm9wZXJ0eSIsIm5vVWlTbGlkZXIiLCJ1cGRhdGVPcHRpb25zIiwiY3JlYXRlIiwiZm9ybWF0dGVkIiwiaGFuZGxlIiwidGFwIiwic2xpZGVyT2JqIiwic2V0VmFsdWVzIiwic2V0U2lsZGVyIiwic2V0Iiwicm91bmQiLCJVdG1UcmFja2luZyIsInNvdXJjZSIsImdldFBhcmFtZXRlckJ5TmFtZSIsIm1lZGl1bSIsImNhbXBhaWduIiwiY29udGVudCIsInRlcm0iLCJzZXRVdG0iLCJuYW1lIiwicmVnZXgiLCJyZXN1bHRzIiwiZXhlYyIsImxvY2F0aW9uIiwidXRtUGFyYW0iLCJ1dG1WYWwiLCJ1c2VEeW5hbWljQWRhcHQiLCJ0eXBlIiwiY2xhc3NOYW1lIiwiYXR0ck5hbWUiLCJkTm9kZXMiLCJnZXRETm9kZXMiLCJkTWVkaWFRdWVyaWVzIiwiZ2V0RE1lZGlhUXVlcmllcyIsImRNZWRpYVF1ZXJ5IiwibWF0Y2hNZWRpYSIsImZpbHRlcmVkRE5vZGVzIiwiYnJlYWtwb2ludCIsIm1lZGlhSGFuZGxlciIsImdldE1lZGlhSGFuZGxlciIsInJlc3VsdCIsImF0dHIiLCJzcGxpdCIsIm1hcCIsInRvU2VsZWN0b3IiLCJwYXJlbnQiLCJwYXJlbnRFbGVtZW50IiwiaXNOdW1iZXIiLCJpbmRleCIsInNvcnRETm9kZXMiLCJ1bmlxSXRlbXMiLCJTZXQiLCJtb3ZlVG8iLCJyZXZlcnNlIiwibW92ZUJhY2siLCJkTm9kZSIsImdldEluZGV4SW5QYXJlbnQiLCJjaGlsZHJlbiIsImFwcGVuZCIsInByZXBlbmQiLCJiZWZvcmUiLCJyZW1vdmUiLCJpbmRleE9mIiwiaXNNaW4iLCJzb3J0IiwiYSIsImIiLCJpc05hTiIsImkiLCJmbiIsIm4iLCJvIiwiZXh0ZW5kIiwib25SZXNpemUiLCJvbkxvYWQiLCJ0IiwicyIsInUiLCJyZXNpemUiLCJlYWNoIiwidGhyb3R0bGUiLCJjYWxsYmFjayIsImxpbWl0Iiwid2FpdCIsIk1haW5Db25maWciLCJzbm93ZmFsbCIsInJlYWR5Iiwic25vd0NvbmZpZyIsImRldmljZW9yaWVudGF0aW9uIiwibWluU2l6ZSIsIm1heFNpemUiLCJtYXhTcGVlZCIsImZsYWtlQ291bnQiLCJzbm93UmVmcmVzaEludGVydmFsSWQiLCJzbm93VGltZXIiLCJjbGVhckludGVydmFsIiwic2V0SW50ZXJ2YWwiLCJtb2R1bGVMb2FkZXIiLCJ3c1RhYnMiLCJVVE1UcmFjayIsIlByb2R1Y3RzRmlsdGVyIiwiQnJvd3Nlcml6ciIsImRldGVjdCIsImlzRWRnZSIsIiRoZWFkZXIiLCIkd2luZG93IiwiY3NzQ2xhc3MiLCJwcmV2aW91c2x5QWRkZWQiLCJoYXNDbGFzcyIsInRpbWVvdXQiLCJfZml4ZWQiLCJzY3JvbGxUb3AiLCJjaGFuZ2VNeUNsYXNzIiwibW9kdWxlIiwiZnJhbWVSYXRlIiwiYW5pbWF0aW9uVGltZSIsInN0ZXBTaXplIiwicHVsc2VBbGdvcml0aG0iLCJwdWxzZVNjYWxlIiwicHVsc2VOb3JtYWxpemUiLCJhY2NlbGVyYXRpb25EZWx0YSIsImFjY2VsZXJhdGlvbk1heCIsImtleWJvYXJkU3VwcG9ydCIsImFycm93U2Nyb2xsIiwiZml4ZWRCYWNrZ3JvdW5kIiwiZXhjbHVkZWQiLCJsYXp5bG9hZFNlbGVjdG9yIiwib2JzZXJ2ZXIiLCJvYnNlcnZlIiwidG9nZ2xlQ2xhc3MiLCJldnQiLCJ0b0xvd2VyQ2FzZSIsIkJvb2xlYW4iLCJtYWduaWZpY1BvcHVwIiwiY2xvc2UiLCJoYW5kbGVyMSIsImJ1dHRvbiIsImJsb2NrIiwiY3NzIiwib2Zmc2V0IiwiJGJ1dHRvbiIsIiRibG9jayIsImVxIiwibW9pZGViYXVuY2UiLCJwYXJhbXMiLCJOcGFyYW1zIiwibWFya3VwIiwiJGNvbnRhaW5lciIsIml0ZW1zQmVmb3JlIiwiZmluZCIsImVuZCIsInN0cmluZ2lmeSIsImN1cnJlbnRUYXJnZXQiLCJmaXJzdCIsImhpZGUiLCJzaG93IiwiJHBlcmZlY3RTY3JvbGxiYXIiLCJtb2JpbGVkZXZpY2UiLCJ
10072jc3NzY3JvbGxiYXIiLCJtZXNzYWdlT25Mb2FkTm90eSIsInNob3dNZXNzYWdlTWFnbmlmaWMiLCJ0aXRsZSIsInRleHQiLCJwcmludCIsImluaXRDb3BpcmlnaHRPbkNvcHkiLCJsYW5nIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJoZWxwVGV4dCIsIm5vZGVOYW1lIiwiZ2V0U2VsZWN0aW9uIiwiYyIsImNyZWF0ZUVsZW1lbnQiLCJzZWxlY3RBbGxDaGlsZHJlbiIsIm9uY29weSIsInN0b3BQcm9wYWdhdGlvbiIsInNsaWRlU3BlZWQiLCIkY3VycmVudCIsIiRzcG9pbGVyIiwicGFyZW50cyIsInRvZ2dsZVNwb2lsZXIiLCJuZXh0Iiwic3RvcCIsInNsaWRlVG9nZ2xlIiwib3BlblNwb2lsZXIiLCJzbGlkZURvd24iLCJjbG9zZU5vdEN1cnJlbnRTcG9pbGVyIiwibm90Iiwic2xpZGVVcCIsIiR0ZXh0IiwibG9jYWxlIiwicG9wIiwiZGljdGlvbmFyeSIsImxlc3MiLCJtb3JlIiwiJGNvbW1lbnRzQmxvY2siLCIkY29tbWVudHNMaXN0IiwiY2F0YWxvZ0lEIiwiY2F0YWxvZ19pZCIsInJldmlld3NfbWFya3VwIiwibG92ZXJzTW9kYWxSZWYiLCJsb3ZlcnNNb2RhbENsb3NlSGFuZGxlciIsImNsb3NlQnRuUmVmIiwiZWFzdGVyTW9kYWxSZWYiLCJlYXN0ZXJNb2RhbENsb3NlSGFuZGxlciIsImJhbGxDb250YWluZXIiLCJwcm9kdWN0UGFnZSIsInByb2R1Y3RJZCIsIkVjb21tZXJjZVRyYWNrIiwidHJhY2tWaWV3SXRlbSIsImNoZWNrb3V0UGFnZSIsInRyYWNrQmVnaW5DaGVja291dCIsInRoYW5rUGFnZSIsInRyYWNrUHVyY2hhc2UiLCJjdXJyZW50QWN0aW9uIiwic3BvaWxlckJsb2NrIiwiTW9kdWxlTG9hZGVyIiwiZGVidWciLCJpbXBvcnRQcm9taXNlIiwibW9kdWxlTmFtZSIsImluaXRTZWxlY3RvciIsImluaXRGdW5jdGlvbk5hbWUiLCJsb2FkaW5nQ2xhc3MiLCJsb2FkZWRDbGFzcyIsImxpc3QiLCJuZWVkVG9BZGQiLCJvbkNoYW5nZSIsImNoYW5nZUNsYXNzIiwiZGF0YUtleSIsImRpcmVjdGlvbiIsIm5vdFNlbGYiLCIkZWxlbWVudCIsImtleUlzU2VsZWN0b3IiLCIkdGFyZ2V0IiwianF1ZXJ5IiwiaXNQcm90ZWN0ZWQiLCJwcm9wIiwibG9hZGVyRGF0YSIsIkVycm9yIiwia2V5cyIsImpvaW4iLCJtb2R1bGVzIiwiZGVmaW5lUHJvcGVydHkiLCJnZXQiLCJtc2ciLCIkY29udGV4dCIsIiRlbGVtZW50cyIsImdldEVsZW1lbnRzIiwicnVuTW9kdWxlIiwiJG1vZHVsZUVsZW1lbnRzIiwibWFya0FzTG9hZGluZ0VsZW1lbnRzIiwiaXNGdW5jdGlvbiIsIm1hcmtBc0xvYWRlZEVsZW1lbnRzIiwiY2F0Y2giXSwibWFwcGluZ3MiOiI7UUFBQTtRQUNBO1FBQ0E7UUFDQTs7O1FBR0E7UUFDQTtRQUNBO1FBQ0EsUUFBUSxvQkFBb0I7UUFDNUI7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7UUFFQTs7O1FBR0E7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7Ozs7UUFJQTtRQUNBO1FBQ0Esd0RBQXdELGtIQUFrSCxpQ0FBaUMsd3lDQUF3eUM7UUFDbi9DOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTs7O1FBR0E7O1FBRUE7UUFDQSxpQ0FBaUM7O1FBRWpDO1FBQ0E7UUFDQTtRQUNBLEtBQUs7UUFDTDtRQUNBO1FBQ0E7UUFDQSxNQUFNO1FBQ047O1FBRUE7UUFDQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0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s7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSwrRUFBK0UsaUJBQWlCO0FBQ2hHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpRkFBaUYsaUJBQWlCO0FBQ2xHO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxvRkFBb0YsaUJBQWlCO0FBQ3JHO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvRkFBb0YsaUJBQWlCO0FBQ3JHO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUNwUkE7QUFBWTs7QUFFWjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUEsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUEsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBLDZEQUE2RDtBQUM3RDs7QUFFQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0F
10072BRUE7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhLFNBQVM7QUFDdEIsYUFBYS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FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQztBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsdUJBQXVCLHdCQUF3QjtB
10072QUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsK0JBQStCO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsbUNBQW1DO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsb0JBQW9CO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsOENBQThDO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsb0JBQW9CO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSx3QkFBd0I7QUFDdkMsaUNBQWlDLDBDQUEwQztBQUMzRSw2QkFBNkIsc0NBQXNDO0FBQ25FLDhCQUE4Qix1Q0FBdUM7QUFDckUsZ0JBQWdCLHdCQUF3QjtB
10072QUN4QyxrQkFBa0IsMEJBQTBCO0FBQzVDLG9CQUFvQiw0QkFBNEI7QUFDaEQsZUFBZSx3QkFBd0I7QUFDdkMsa0JBQWtCLDJCQUEyQjtBQUM3Qyw0QkFBNEIscUNBQXFDO0FBQ2pFLGdCQUFnQix3QkFBd0I7QUFDeEMsc0JBQXNCLCtCQUErQjtBQUNyRCxpQkFBaUIsMEJBQTBCO0FBQzNDLGdCQUFnQix5QkFBeUI7QUFDekMsa0JBQWtCLDJCQUEyQjtBQUM3QyxvQkFBb0IsNEJBQTRCO0FBQ2hELHFCQUFxQiw4QkFBOEI7QUFDbkQsaUJBQWlCLDBCQUEwQjtBQUMzQyxtQkFBbUIsNEJBQTRCO0FBQy9DLDBCQUEwQixrQ0FBa0M7QUFDNUQsMEJBQTBCLG1DQUFtQztBQUM3RCxvQkFBb0IsNEJBQTRCO0FBQ2hELHFCQUFxQiw2QkFBNkI7QUFDbEQsMkJBQTJCLG9DQUFvQztBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIscUJBQXFCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixXQUFXO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGdCQUFnQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyRUFBMkUsZ0JBQWdCO0FBQzNGO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QU
10072FDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsZ0NBQWdDO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSwrREFBK0Q7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckIsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsZ0NBQWdDO0FBQzlDO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QU
10072FDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxtQkFBbUI7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixzQkFBc0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQix5Q0FBeUM7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLFdBQVcsRUFBRTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNnQztBQUNWO0FBQ1A7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUM7Ozs7Ozs7Ozs7OztBQ3p4RUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFRLElBQTBDO0FBQ2xELFFBQVEsb0NBQU8sT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBLG9HQUFDO0FBQ3ZCLEtBQUssTUFBTSxFQUlOO0FBQ0wsQ0FBQztBQUNEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVEQUF1RCxPQUFPO0FBQzlEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHlEQUF5RCxFQUFFO0FBQzNEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLFNBQVM7QU
10072FDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxvREFBb0QseURBQXlEO0FBQzdHO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscURBQXFELEVBQUU7O0FBRXZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLEtBQUs7Ozs7QUFJTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTs7QUFFQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSwyQkFBMkIsZ0NBQWdDO0FBQzNEO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EseURBQXlELFlBQVk7QUFDckU7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTCxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBLHVCQUF1QiwyQkFBMkI7QUFDbEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOENBQThDLFFBQVE7QUFDdEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0EsS0FBSztBQUNMLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsOENBQThDLEVBQUU7O0FBRWhEOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTCxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0F
10072BRUE7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsQ0FBQzs7QUFFRDtBQUNBLENBQUM7Ozs7Ozs7Ozs7OztBQ3AvQkQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixzQkFBc0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0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0FBQztBQUNqQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVlLHFFQUFNLEVBQUM7Ozs7Ozs7Ozs7OztBQzFSdEIsd0IiLCJmaWxlIjoiYnVuZGxlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gaW5zdGFsbCBhIEpTT05QIGNhbGxiYWNrIGZvciBjaHVuayBsb2FkaW5nXG4gXHRmdW5jdGlvbiB3ZWJwYWNrSnNvbnBDYWxsYmFjayhkYXRhKSB7XG4gXHRcdHZhciBjaHVua0lkcyA9IGRhdGFbMF07XG4gXHRcdHZhciBtb3JlTW9kdWxlcyA9IGRhdGFbMV07XG5cblxuIFx0XHQvLyBhZGQgXCJtb3JlTW9kdWxlc1wiIHRvIHRoZSBtb2R1bGVzIG9iamVjdCxcbiBcdFx0Ly8gdGhlbiBmbGFnIGFsbCBcImNodW5rSWRzXCIgYXMgbG9hZGVkIGFuZCBmaXJlIGNhbGxiYWNrXG4gXHRcdHZhciBtb2R1bGVJZCwgY2h1bmtJZCwgaSA9IDAsIHJlc29sdmVzID0gW107XG4gXHRcdGZvcig7aSA8IGNodW5rSWRzLmxlbmd0aDsgaSsrKSB7XG4gXHRcdFx0Y2h1bmtJZCA9IGNodW5rSWRzW2ldO1xuIFx0XHRcdGlmKGluc3RhbGxlZENodW5rc1tjaHVua0lkXSkge1xuIFx0XHRcdFx0cmVzb2x2ZXMucHVzaChpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF1bM
10072F0pO1xuIFx0XHRcdH1cbiBcdFx0XHRpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPSAwO1xuIFx0XHR9XG4gXHRcdGZvcihtb2R1bGVJZCBpbiBtb3JlTW9kdWxlcykge1xuIFx0XHRcdGlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb3JlTW9kdWxlcywgbW9kdWxlSWQpKSB7XG4gXHRcdFx0XHRtb2R1bGVzW21vZHVsZUlkXSA9IG1vcmVNb2R1bGVzW21vZHVsZUlkXTtcbiBcdFx0XHR9XG4gXHRcdH1cbiBcdFx0aWYocGFyZW50SnNvbnBGdW5jdGlvbikgcGFyZW50SnNvbnBGdW5jdGlvbihkYXRhKTtcblxuIFx0XHR3aGlsZShyZXNvbHZlcy5sZW5ndGgpIHtcbiBcdFx0XHRyZXNvbHZlcy5zaGlmdCgpKCk7XG4gXHRcdH1cblxuIFx0fTtcblxuXG4gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBvYmplY3QgdG8gc3RvcmUgbG9hZGVkIGFuZCBsb2FkaW5nIGNodW5rc1xuIFx0Ly8gdW5kZWZpbmVkID0gY2h1bmsgbm90IGxvYWRlZCwgbnVsbCA9IGNodW5rIHByZWxvYWRlZC9wcmVmZXRjaGVkXG4gXHQvLyBQcm9taXNlID0gY2h1bmsgbG9hZGluZywgMCA9IGNodW5rIGxvYWRlZFxuIFx0dmFyIGluc3RhbGxlZENodW5rcyA9IHtcbiBcdFx0XCJidW5kbGVcIjogMFxuIFx0fTtcblxuXG5cbiBcdC8vIHNjcmlwdCBwYXRoIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBqc29ucFNjcmlwdFNyYyhjaHVua0lkKSB7XG4gXHRcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fLnAgKyBcIl9hc3luYy1tb2R1bGVzL1wiICsgKHtcInZlbmRvcnN+ZHJhZ2dhYmxlLXRhYmxlXCI6XCJ2ZW5kb3JzfmRyYWdnYWJsZS10YWJsZVwiLFwiZHJhZ2dhYmxlLXRhYmxlXCI6XCJkcmFnZ2FibGUtdGFibGVcIixcIndyYXAtbWVkaWFcIjpcIndyYXAtbWVkaWFcIn1bY2h1bmtJZF18fGNodW5rSWQpICsgXCIuanM/PVwiICsge1wiMFwiOlwiOTNmYTYxM2M1MTYyNTllZGZmOGJcIixcIjFcIjpcIjhiMzc1ZjE4MTU1MmM0ZDIyNzQ2XCIsXCIyXCI6XCI4MGJjMWQxZjA5ZGVkMjM0NWUyNFwiLFwiM1wiOlwiNmU4YWE1OWE2Y2ZmMGM5YzJjNDZcIixcIjRcIjpcIjQxMzgyNzE2ZDQ4MWI1NDRlYzUxXCIsXCI1XCI6XCI2YmM1MGU0M2RiZDI5YjNkNDRiYVwiLFwiNlwiOlwiZWY0M2Q5ODAxNmQ1Yjk0NzNkNWVcIixcIjdcIjpcIjgzYjgwNmY5OWRhN2QxYzNhOGMzXCIsXCI4XCI6XCI0YTVmYzZlZDkzNGU5NDBmNGQ4NFwiLFwiOVwiOlwiYjlkYzI2NWZmMzAzYjhiZTM5YzVcIixcIjEwXCI6XCJhMjJkYzIxNzNkY2E0OWM2NmM1MlwiLFwiMTFcIjpcIjFmNjI2NGU0ZTU2NTBmMjUxODFkXCIsXCIxMlwiOlwiYWIxMDZkNjNmYzU2N2Y0MTI3ZjFcIixcIjEzXCI6XCI4NTYzNTA4M2NjYTNmNDNjZDQyN1wiLFwiMTRcIjpcImU2NmVlNTE2ZGM0OTU1MDM3N2NhXCIsXCIxNVwiOlwiOTIyMDBhNWNlNGU2MjUxMDE5MThcIixcIjE2XCI6XCIxZjUyOGJjMjdmZGJmNjViYTQ3NFwiLFwiMTdcIjpcImIxM2RiOWJhMTYzZDk5MDcyMzU5XCIsXCIxOFwiOlwiMWE5YmUwNjkwMTNiZTRmZWMyM2FcIixcIjE5XCI6XCI4OTA5YWM5YWJjNjRiZTcwMjRjYlwiLFwiMjBcIjpcIjkxNjVlNGFlZGNlOTFhNTQ1MmE2XCIsXCIyMVwiOlwiYTA2MWU3ZDZlZTEwNDI1MWJmMTBcIixcIjIyXCI6XCJkZTJkODlkODA5Y2ZlZmY2OWNlMlwiLFwiMjNcIjpcIjU0ZWNmYzYxYmNlNzE3YTgzZDI4XCIsXCIyNFwiOlwiYTYwMWM3NjQwOWJlYTY4YTVhMGZcIixcIjI1XCI6XCI2NmIzOTYwOTBlODg4MzRjNzEwOFwiLFwiMjZcIjpcImFjYTkzMzQ3YzM1M2E2OTZlMjM1XCIsXCIyN1wiOlwiZTg3NWEyNTlkNjNlYjE4ZWJhMTNcIixcIjI4XCI6XCI3OWY2ZDJiZTdiNmRmYWVjMWRiY1wiLFwiMjlcIjpcIjU0YmViY2E5YTRmYTM3NmU3ZjNjXCIsXCIzMFwiOlwiYmExMDA0ZmY5Yzk1YTkwZmIyYjdcIixcIjMxXCI6XCI1MzI0MTk3MjBlZjg1YjE1OTNjYlwiLFwiMzJcIjpcImY4OTk0ODVkMDg5ZDcwY2ViNmJmXCIsXCIzM1wiOlwiZDQwMWQ2YTY1ZDAxMjBlZmJkMWFcIixcIjM0XCI6XCJjYjg4NjM2MGMzYTVlMzA5ZGY1M1wiLFwiMzVcIjpcIjRlMWQwYWIzY2Y2ZmQyZGJhOTA2XCIsXCIzNlwiOlwiMDNmOTU3Y2EzNmQ2ODMyNzI5MzhcIixcIjM3XCI6XCI5NmNiYjczZDI1YzM4ZWNlYTI1Y1wiLFwiMzhcIjpcImJjMDdiODExOWMwMWQwMmM4YTc0XCIsXCIzOVwiOlwiYzc3ZjY4MjIyODk1NjA5MjlmN2NcIixcIjQwXCI6XCJlODBmMTIzNDU4YTA5NzViZjk5MlwiLFwiNDFcIjpcIjc1YmViYzk3ZGVlN2Y3OWY3MjcwXCIsXCI0MlwiOlwiNGUwNTFkNWJmNjk5MTA1MjNmZGZcIixcInZlbmRvcnN+ZHJhZ2dhYmxlLXRhYmxlXCI6XCJjMTlhNzhmMWRiMzdjNjhkOGI2M1wiLFwiZHJhZ2dhYmxlLXRhYmxlXCI6XCI2MzZiMzQ2YTJmODZhMDBkYmZkYlwiLFwid3JhcC1tZWRpYVwiOlwiMGZmZWJiZGQ3NjU4NTk0ZjBkNTlcIn1bY2h1bmtJZF0gKyBcIlwiXG4gXHR9XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybi
10072B0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuIFx0Ly8gVGhpcyBmaWxlIGNvbnRhaW5zIG9ubHkgdGhlIGVudHJ5IGNodW5rLlxuIFx0Ly8gVGhlIGNodW5rIGxvYWRpbmcgZnVuY3Rpb24gZm9yIGFkZGl0aW9uYWwgY2h1bmtzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmUgPSBmdW5jdGlvbiByZXF1aXJlRW5zdXJlKGNodW5rSWQpIHtcbiBcdFx0dmFyIHByb21pc2VzID0gW107XG5cblxuIFx0XHQvLyBKU09OUCBjaHVuayBsb2FkaW5nIGZvciBqYXZhc2NyaXB0XG5cbiBcdFx0dmFyIGluc3RhbGxlZENodW5rRGF0YSA9IGluc3RhbGxlZENodW5rc1tjaHVua0lkXTtcbiBcdFx0aWYoaW5zdGFsbGVkQ2h1bmtEYXRhICE9PSAwKSB7IC8vIDAgbWVhbnMgXCJhbHJlYWR5IGluc3RhbGxlZFwiLlxuXG4gXHRcdFx0Ly8gYSBQcm9taXNlIG1lYW5zIFwiY3VycmVudGx5IGxvYWRpbmdcIi5cbiBcdFx0XHRpZihpbnN0YWxsZWRDaHVua0RhdGEpIHtcbiBcdFx0XHRcdHByb21pc2VzLnB1c2goaW5zdGFsbGVkQ2h1bmtEYXRhWzJdKTtcbiBcdFx0XHR9IGVsc2Uge1xuIFx0XHRcdFx0Ly8gc2V0dXAgUHJvbWlzZSBpbiBjaHVuayBjYWNoZVxuIFx0XHRcdFx0dmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiBcdFx0XHRcdFx0aW5zdGFsbGVkQ2h1bmtEYXRhID0gaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdID0gW3Jlc29sdmUsIHJlamVjdF07XG4gXHRcdFx0XHR9KTtcbiBcdFx0XHRcdHByb21pc2VzLnB1c2goaW5zdGFsbGVkQ2h1bmtEYXRhWzJdID0gcHJvbWlzZSk7XG5cbiBcdFx0XHRcdC8vIHN0YXJ0IGNodW5rIGxvYWRpbmdcbiBcdFx0XHRcdHZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiBcdFx0XHRcdHZhciBvblNjcmlwdENvbXBsZXRlO1xuXG4gXHRcdFx0XHRzY3JpcHQuY2hhcnNldCA9ICd1dGYtOCc7XG4gXHRcdFx0XHRzY3JpcHQudGltZW91dCA9IDEyMDtcbiBcdFx0XHRcdGlmIChfX3dlYnBhY2tfcmVxdWlyZV9fLm5jKSB7XG4gXHRcdFx0XHRcdHNjcmlwdC5zZXRBdHRyaWJ1dGUoXCJub25jZVwiLCBfX3dlYnBhY2tfcmVxdWlyZV9fLm5jKTtcbiBcdFx0XHRcdH1cbiBcdFx0XHRcdHNjcmlwdC5zcmMgPSBqc29ucFNjcmlwdFNyYyhjaHVua0lkKTtcblxuIFx0XHRcdFx0b25TY3JpcHRDb21wbGV0ZSA9IGZ1bmN0aW9uIChldmVudCkge1xuIFx0XHRcdFx0XHQvLyBhdm9pZCBtZW0gbGVha3MgaW4gSUUuXG4gXHRcdFx0XHRcdHNjcmlwdC5vbmVycm9yID0gc2NyaXB0Lm9ubG9hZCA9IG51bGw7XG4gXHRcdFx0XHRcdGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiBcdFx0XHRcdFx0dmFyIGNodW5rID0gaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdO1xuIFx0XHRcdFx0XHRpZihjaHVuayAhPT0gMCkge1xuIFx0XHRcdFx0XHRcdGlmKGNodW5rKSB7XG4gXHRcdFx0XHRcdFx0XHR2YXIgZXJyb3JUeXBlID0gZXZlbnQgJiYgKGV2ZW50LnR5cGUgPT09ICdsb2FkJyA/ICdtaXNzaW5nJyA6IGV2ZW50LnR5cGUpO1xuIFx0XHRcdFx0XHRcdFx0dmFyIHJlYWxTcmMgPSBldmVudCAmJiBldmVudC50YXJnZXQgJiYgZXZlbnQudGFyZ2V0LnNyYztcbiBcdFx0XHRcdFx0XHRcdHZhciBlcnJvciA9IG5ldyBFcnJvcignTG9hZGluZyBjaHVuayAnICsgY2h1bmtJZCArICcgZmFpbGVkLlxcbignICsgZXJyb3JUeXBlICsgJzogJyArIHJlYWxTcmMgKyAnKScpO1xuIFx0XHRcdFx0XHRcdFx0ZXJyb3IudHlwZSA9IGVycm9yVHlwZTtcbiBcdFx0XHRcdFx0XHRcdGVycm9yLnJlcXVlc3QgPSByZWFsU3JjO1xuIFx0XHRcdFx0XHRcdFx0Y2h1bmtbMV0oZXJyb3IpO1xuIFx0XHRcdFx0XHRcdH1cbiBcdFx0XHRcdFx0XHRpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPSB1bmRlZmluZWQ7XG4gXHRcdFx0XHRcdH1cbiBcdFx0XHRcdH07XG4gXHRcdFx0XHR2YXIgdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiBcdFx0XHRcdFx0b25TY3JpcHRDb21wbGV0ZSh7IHR5cGU6ICd0aW1lb3V0JywgdGFyZ2V0OiBzY3JpcHQgfSk7XG4gXHRcdFx0XHR9LCAxMjAwMDApO1xuIFx0XHRcdFx0c2NyaXB0Lm9uZXJyb3IgPSBzY3JpcHQub25sb2FkID0gb25TY3JpcHRDb21wbGV0ZTtcbiBcdFx0XHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiBcdFx0XHR9XG4gXHRcdH1cbiBcdFx0cmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcbiBcdH07XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybi
10072Btb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCIvTWVkaWEvYXNzZXRzLy9qcy9cIjtcblxuIFx0Ly8gb24gZXJyb3IgZnVuY3Rpb24gZm9yIGFzeW5jIGxvYWRpbmdcbiBcdF9fd2VicGFja19yZXF1aXJlX18ub2UgPSBmdW5jdGlvbihlcnIpIHsgY29uc29sZS5lcnJvcihlcnIpOyB0aHJvdyBlcnI7IH07XG5cbiBcdHZhciBqc29ucEFycmF5ID0gd2luZG93W1wid2VicGFja0pzb25wXCJdID0gd2luZG93W1wid2VicGFja0pzb25wXCJdIHx8IFtdO1xuIFx0dmFyIG9sZEpzb25wRnVuY3Rpb24gPSBqc29ucEFycmF5LnB1c2guYmluZChqc29ucEFycmF5KTtcbiBcdGpzb25wQXJyYXkucHVzaCA9IHdlYnBhY2tKc29ucENhbGxiYWNrO1xuIFx0anNvbnBBcnJheSA9IGpzb25wQXJyYXkuc2xpY2UoKTtcbiBcdGZvcih2YXIgaSA9IDA7IGkgPCBqc29ucEFycmF5Lmxlbmd0aDsgaSsrKSB3ZWJwYWNrSnNvbnBDYWxsYmFjayhqc29ucEFycmF5W2ldKTtcbiBcdHZhciBwYXJlbnRKc29ucEZ1bmN0aW9uID0gb2xkSnNvbnBGdW5jdGlvbjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9fSFRNTC9zcmMvanMvZW50cnkuanNcIik7XG4iLCI7KGZ1bmN0aW9uKHdpbmRvdyl7XG52YXIgaGFkR2xvYmFsID0gJ01vZGVybml6cicgaW4gd2luZG93O1xudmFyIG9sZEdsb2JhbCA9IHdpbmRvdy5Nb2Rlcm5penI7XG4vKiEgbW9kZXJuaXpyIDMuMTEuNCAoQ3VzdG9tIEJ1aWxkKSB8IE1JVCAqXG4gKiBodHRwczovL21vZGVybml6ci5jb20vZG93bmxvYWQvPy1jc3NzY3JvbGxiYXItdG91Y2hldmVudHMtYWRkdGVzdC1tcS1zZXRjbGFzc2VzLXRlc3Rwcm9wICEqL1xuIWZ1bmN0aW9uKGUsbix0LG8pe2Z1bmN0aW9uIHIoZSxuKXtyZXR1cm4gdHlwZW9mIGU9PT1ufWZ1bmN0aW9uIGkoZSl7dmFyIG49dy5jbGFzc05hbWUsdD1Nb2Rlcm5penIuX2NvbmZpZy5jbGFzc1ByZWZpeHx8XCJcIjtpZihfJiYobj1uLmJhc2VWYWwpLE1vZGVybml6ci5fY29uZmlnLmVuYWJsZUpTQ2xhc3Mpe3ZhciBvPW5ldyBSZWdFeHAoXCIoXnxcXFxccylcIit0K1wibm8tanMoXFxcXHN8JClcIik7bj1uLnJlcGxhY2UobyxcIiQxXCIrdCtcImpzJDJcIil9TW9kZXJuaXpyLl9jb25maWcuZW5hYmxlQ2xhc3NlcyYmKGUubGVuZ3RoPjAmJihuKz1cIiBcIit0K2Uuam9pbihcIiBcIit0KSksXz93LmNsYXNzTmFtZS5iYXNlVmFsPW46dy5jbGFzc05hbWU9bil9ZnVuY3Rpb24gcygpe3JldHVyblwiZnVuY3Rpb25cIiE9dHlwZW9mIHQuY3JlYXRlRWxlbWVudD90LmNyZWF0ZUVsZW1lbnQoYXJndW1lbnRzWzBdKTpfP3QuY3JlYXRlRWxlbWVudE5TLmNhbGwodCxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsYXJndW1lbnRzWzBdKTp0LmNyZWF0ZUVsZW1lbnQuYXBwbHkodCxhcmd1bWVudHMpfWZ1bmN0aW9uIGwoKXt2YXIgZT10LmJvZHk7cmV0dXJuIGV8fChlPXMoXz9cInN2Z1wiOlwiYm9keVwiKSxlLmZha2U9ITApLGV9ZnVuY3Rpb24gYShlLG4sbyxyKXt2YXIgaSxhLHUsZixjPVwibW9kZXJuaXpyXCIsZD1zKFwiZGl2XCIpLHA9bCgpO2lmKHBhcnNlSW50KG8sMTApKWZvcig7by0tOyl1PXMoXCJkaXZcIiksdS5pZD1yP3Jbb106YysobysxKSxkLmFwcGVuZENoaWxkKHUpO3JldHVybiBpPXMoXCJzdHlsZVwiKSxpLnR5cGU9XCJ0ZXh0L2Nzc1wiLGkuaWQ9XCJzXCIrYywocC5mYWtlP3A6ZCkuYXBwZW5kQ2hpbGQoaSkscC5hcHBlbmRDaGlsZChkKSxpLnN0eWxlU2hlZXQ/aS5zdHlsZVNoZWV0LmNzc1RleHQ9ZTppLmFwcGVuZENoaWxkKHQuY3JlYXRlVGV4dE5vZGUoZSkpLGQuaWQ9YyxwLmZha2UmJihwLnN0eWxlLmJhY2tncm91bmQ9XCJcIixwLnN0eWxlLm92ZXJmbG93PVwiaGlkZGVuXCIsZj13LnN0eWxlLm92ZXJmbG93LHcuc3R5bGUub3ZlcmZsb3c9XCJoaWRkZW5cIix3LmFwcGVuZENoaWxkKHApKSxhPW4oZCxlKSxwLmZha2U/KHAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChwKSx3LnN0eWxlLm92ZXJmbG93PWYsdy5vZmZzZXRIZWlnaHQpOmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkKSwhIWF9ZnVuY3Rpb24gdShlLHQsbyl7dmFyIHI7aWYoXCJnZXRDb21wdXRlZFN0eWxlXCJpbiBuKXtyPWdldENvbXB1dGVkU3R5bGUuY2FsbChuLGUsdCk7dmFyIGk9bi5jb25zb2xlO2lmKG51bGwhPT1yKW8mJihyPXIuZ2V0UHJvcGVydHlWYWx1ZShvKSk7ZWxzZSBpZihpKXt2YXIgcz1pLmVycm9yP1wiZXJyb3JcIjpcImxvZ1wiO2lbc10uY2FsbChpLFwiZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5pbmcgbnVsbCwgaXRzIHBvc3NpYmxlIG1vZGVybml6ciB0ZXN0IHJlc3VsdHMgYXJlIGluYWNjdXJhdGVcIil9fWVsc2Ugcj0hdCYmZS5jdXJyZW50U3R5bGUmJmUuY3VycmVudFN0eWxlW29dO3JldHVybiByfWZ1bmN0aW9uIGYoZSxuKXtpZihcIm9iamVjdFwiPT10eXBlb2YgZSlmb3IodmFyIHQgaW4gZSlTKGUsdCkmJmYodCxlW3RdKTtlbHNle2U9ZS50b0xvd2VyQ2FzZSgpO3ZhciBvPWUuc3BsaXQoXCIuXCIpLHI9TW9kZXJuaXpyW29bMF1dO2lmKDI9PT1vLmxlbmd0aCYmKHI9cltvWzFdXSksdm9pZCAwIT09cilyZXR1cm4gTW9kZXJuaXpyO249XCJmdW5jdGlvblwiPT10eXBlb2Ygbj9uKCk6biwxPT09by5sZW5ndGg/TW9kZXJuaXpyW29bMF1dPW46KCFNb2Rlcm5penJbb1swXV18fE1vZGVybml6cltvWzBdXWluc3RhbmNlb2YgQm9vbGVhbnx8KE1vZGVybml6cltvWzBdXT1uZXcgQm9vbGVhbihNb2Rlcm5penJbb1swXV0pKSxNb2Rlcm5penJbb1swXV1bb1sxXV09biksaShbKG4mJiExIT09bj9cIlwiOlwibm8tXCIpK28uam9pbihcIi1cIildKSxNb2Rlcm5penIuX3RyaWdnZXIoZSxuKX1yZXR1cm4gTW9kZXJuaXpyfWZ1bmN0aW9uIGMoZSxuKXtyZXR1cm4hIX4oXCJcIitlKS5pbmRleE9mKG4pfWZ1bmN0aW9uIGQoZSl7cmV0dXJuIGUucmVwbGFjZSgvKFtBLVpdKS9nLGZ1bmN0aW9uKGUsbil7cmV0dXJuXCItXCIrbi50b0xvd2VyQ2FzZSgpfSkucmVwbGFjZSgvXm1zLS8sXCItbXMtXCIpfWZ1bmN0aW9uIHAoZSx0KXt2YXIgcj1lLmxlbmd0aDtpZihcIkNTU1wiaW4gbiYmXCJzdXBwb3J0c1wiaW4gbi5DU1Mpe2Zvcig7ci0tOylpZihuLkNTUy5zdXBwb3J0cyhkKGVbcl0pLHQpKXJldHVybiEwO3JldHVybiExfWlmKFwiQ1NTU3VwcG9ydHNSdWxlXCJpbiBuKXtmb3IodmFyIGk9W107ci0tOylpLnB1c2goXCIoXCIrZChlW3JdKStcIjpcIit0K1wiKVwiKTtyZXR1cm4gaT1pLmpvaW4oXCIgb3IgXCIpLGEoXCJAc3VwcG9ydHMgKFwiK2krXCIpIHsgI21vZGVybml6ciB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgfSB9XCIsZnVuY3Rpb24oZSl7cmV0dXJuXCJhYnNvbHV0ZVwiPT09dShlLG51bGwsXCJwb3NpdGlvblwiKX0pfXJldHVybi
10072BvfWZ1bmN0aW9uIGgoZSl7cmV0dXJuIGUucmVwbGFjZSgvKFthLXpdKS0oW2Etel0pL2csZnVuY3Rpb24oZSxuLHQpe3JldHVybiBuK3QudG9VcHBlckNhc2UoKX0pLnJlcGxhY2UoL14tLyxcIlwiKX1mdW5jdGlvbiBtKGUsbix0LGkpe2Z1bmN0aW9uIGwoKXt1JiYoZGVsZXRlIHguc3R5bGUsZGVsZXRlIHgubW9kRWxlbSl9aWYoaT0hcihpLFwidW5kZWZpbmVkXCIpJiZpLCFyKHQsXCJ1bmRlZmluZWRcIikpe3ZhciBhPXAoZSx0KTtpZighcihhLFwidW5kZWZpbmVkXCIpKXJldHVybiBhfWZvcih2YXIgdSxmLGQsbSx2LHk9W1wibW9kZXJuaXpyXCIsXCJ0c3BhblwiLFwic2FtcFwiXTsheC5zdHlsZSYmeS5sZW5ndGg7KXU9ITAseC5tb2RFbGVtPXMoeS5zaGlmdCgpKSx4LnN0eWxlPXgubW9kRWxlbS5zdHlsZTtmb3IoZD1lLmxlbmd0aCxmPTA7ZjxkO2YrKylpZihtPWVbZl0sdj14LnN0eWxlW21dLGMobSxcIi1cIikmJihtPWgobSkpLHguc3R5bGVbbV0hPT1vKXtpZihpfHxyKHQsXCJ1bmRlZmluZWRcIikpcmV0dXJuIGwoKSxcInBmeFwiIT09bnx8bTt0cnl7eC5zdHlsZVttXT10fWNhdGNoKGUpe31pZih4LnN0eWxlW21dIT09dilyZXR1cm4gbCgpLFwicGZ4XCIhPT1ufHxtfXJldHVybiBsKCksITF9dmFyIHY9W10seT17X3ZlcnNpb246XCIzLjExLjRcIixfY29uZmlnOntjbGFzc1ByZWZpeDpcIlwiLGVuYWJsZUNsYXNzZXM6ITAsZW5hYmxlSlNDbGFzczohMCx1c2VQcmVmaXhlczohMH0sX3E6W10sb246ZnVuY3Rpb24oZSxuKXt2YXIgdD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtuKHRbZV0pfSwwKX0sYWRkVGVzdDpmdW5jdGlvbihlLG4sdCl7di5wdXNoKHtuYW1lOmUsZm46bixvcHRpb25zOnR9KX0sYWRkQXN5bmNUZXN0OmZ1bmN0aW9uKGUpe3YucHVzaCh7bmFtZTpudWxsLGZuOmV9KX19LE1vZGVybml6cj1mdW5jdGlvbigpe307TW9kZXJuaXpyLnByb3RvdHlwZT15LE1vZGVybml6cj1uZXcgTW9kZXJuaXpyO3ZhciBnPVtdLHc9dC5kb2N1bWVudEVsZW1lbnQsXz1cInN2Z1wiPT09dy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLEM9ZnVuY3Rpb24oKXt2YXIgZT1uLm1hdGNoTWVkaWF8fG4ubXNNYXRjaE1lZGlhO3JldHVybiBlP2Z1bmN0aW9uKG4pe3ZhciB0PWUobik7cmV0dXJuIHQmJnQubWF0Y2hlc3x8ITF9OmZ1bmN0aW9uKGUpe3ZhciBuPSExO3JldHVybiBhKFwiQG1lZGlhIFwiK2UrXCIgeyAjbW9kZXJuaXpyIHsgcG9zaXRpb246IGFic29sdXRlOyB9IH1cIixmdW5jdGlvbihlKXtuPVwiYWJzb2x1dGVcIj09PXUoZSxudWxsLFwicG9zaXRpb25cIil9KSxufX0oKTt5Lm1xPUM7dmFyIFM7IWZ1bmN0aW9uKCl7dmFyIGU9e30uaGFzT3duUHJvcGVydHk7Uz1yKGUsXCJ1bmRlZmluZWRcIil8fHIoZS5jYWxsLFwidW5kZWZpbmVkXCIpP2Z1bmN0aW9uKGUsbil7cmV0dXJuIG4gaW4gZSYmcihlLmNvbnN0cnVjdG9yLnByb3RvdHlwZVtuXSxcInVuZGVmaW5lZFwiKX06ZnVuY3Rpb24obix0KXtyZXR1cm4gZS5jYWxsKG4sdCl9fSgpLHkuX2w9e30seS5vbj1mdW5jdGlvbihlLG4pe3RoaXMuX2xbZV18fCh0aGlzLl9sW2VdPVtdKSx0aGlzLl9sW2VdLnB1c2gobiksTW9kZXJuaXpyLmhhc093blByb3BlcnR5KGUpJiZzZXRUaW
100721lb3V0KGZ1bmN0aW9uKCl7TW9kZXJuaXpyLl90cmlnZ2VyKGUsTW9kZXJuaXpyW2VdKX0sMCl9LHkuX3RyaWdnZXI9ZnVuY3Rpb24oZSxuKXtpZih0aGlzLl9sW2VdKXt2YXIgdD10aGlzLl9sW2VdO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgZTtmb3IoZT0wO2U8dC5sZW5ndGg7ZSsrKSgwLHRbZV0pKG4pfSwwKSxkZWxldGUgdGhpcy5fbFtlXX19LE1vZGVybml6ci5fcS5wdXNoKGZ1bmN0aW9uKCl7eS5hZGRUZXN0PWZ9KTt2YXIgYj17ZWxlbTpzKFwibW9kZXJuaXpyXCIpfTtNb2Rlcm5penIuX3EucHVzaChmdW5jdGlvbigpe2RlbGV0ZSBiLmVsZW19KTt2YXIgeD17c3R5bGU6Yi5lbGVtLnN0eWxlfTtNb2Rlcm5penIuX3EudW5zaGlmdChmdW5jdGlvbigpe2RlbGV0ZSB4LnN0eWxlfSk7dmFyIFQ9KHkudGVzdFByb3A9ZnVuY3Rpb24oZSxuLHQpe3JldHVybiBtKFtlXSxvLG4sdCl9LHkudGVzdFN0eWxlcz1hKSx6PXkuX2NvbmZpZy51c2VQcmVmaXhlcz9cIiAtd2Via2l0LSAtbW96LSAtby0gLW1zLSBcIi5zcGxpdChcIiBcIik6W1wiXCIsXCJcIl07eS5fcHJlZml4ZXM9eixUKFwiI21vZGVybml6cntvdmVyZmxvdzogc2Nyb2xsOyB3aWR0aDogNDBweDsgaGVpZ2h0OiA0MHB4OyB9I1wiK3ouam9pbihcInNjcm9sbGJhcnt3aWR0aDoxMHB4fSAjbW9kZXJuaXpyOjpcIikuc3BsaXQoXCIjXCIpLnNsaWNlKDEpLmpvaW4oXCIjXCIpK1wic2Nyb2xsYmFye3dpZHRoOjEwcHh9XCIsZnVuY3Rpb24oZSl7TW9kZXJuaXpyLmFkZFRlc3QoXCJjc3NzY3JvbGxiYXJcIixcInNjcm9sbFdpZHR
10072oXCJpbiBlJiYzMD09PWUuc2Nyb2xsV2lkdGgpfSksTW9kZXJuaXpyLmFkZFRlc3QoXCJ0b3VjaGV2ZW50c1wiLGZ1bmN0aW9uKCl7aWYoXCJvbnRvdWNoc3RhcnRcImluIG58fG4uVG91Y2hFdmVudHx8bi5Eb2N1bWVudFRvdWNoJiZ0IGluc3RhbmNlb2YgRG9jdW1lbnRUb3VjaClyZXR1cm4hMDt2YXIgZT1bXCIoXCIsei5qb2luKFwidG91Y2gtZW5hYmxlZCksKFwiKSxcImhlYXJ0elwiLFwiKVwiXS5qb2luKFwiXCIpO3JldHVybiBDKGUpfSksZnVuY3Rpb24oKXt2YXIgZSxuLHQsbyxpLHMsbDtmb3IodmFyIGEgaW4gdilpZih2Lmhhc093blByb3BlcnR5KGEpKXtpZihlPVtdLG49dlthXSxuLm5hbWUmJihlLnB1c2gobi5uYW1lLnRvTG93ZXJDYXNlKCkpLG4ub3B0aW9ucyYmbi5vcHRpb25zLmFsaWFzZXMmJm4ub3B0aW9ucy5hbGlhc2VzLmxlbmd0aCkpZm9yKHQ9MDt0PG4ub3B0aW9ucy5hbGlhc2VzLmxlbmd0aDt0KyspZS5wdXNoKG4ub3B0aW9ucy5hbGlhc2VzW3RdLnRvTG93ZXJDYXNlKCkpO2ZvcihvPXIobi5mbixcImZ1bmN0aW9uXCIpP24uZm4oKTpuLmZuLGk9MDtpPGUubGVuZ3RoO2krKylzPWVbaV0sbD1zLnNwbGl0KFwiLlwiKSwxPT09bC5sZW5ndGg/TW9kZXJuaXpyW2xbMF1dPW86KE1vZGVybml6cltsWzBdXSYmKCFNb2Rlcm5penJbbFswXV18fE1vZGVybml6cltsWzBdXWluc3RhbmNlb2YgQm9vbGVhbil8fChNb2Rlcm5penJbbFswXV09bmV3IEJvb2xlYW4oTW9kZXJuaXpyW2xbMF1dKSksTW9kZXJuaXpyW2xbMF1dW2xbMV1dPW8pLGcucHVzaCgobz9cIlwiOlwibm8tXCIpK2wuam9pbihcIi1cIikpfX0oKSxpKGcpLGRlbGV0ZSB5LmFkZFRlc3QsZGVsZXRlIHkuYWRkQXN5bmNUZXN0O2Zvcih2YXIgaj0wO2o8TW9kZXJuaXpyLl9xLmxlbmd0aDtqKyspTW9kZXJuaXpyLl9xW2pdKCk7ZS5Nb2Rlcm5penI9TW9kZXJuaXpyfSh3aW5kb3csd2luZG93LGRvY3VtZW50KTtcbm1vZHVsZS5leHBvcnRzID0gd2luZG93Lk1vZGVybml6cjtcbmlmIChoYWRHbG9iYWwpIHsgd2luZG93Lk1vZGVybml6ciA9IG9sZEdsb2JhbDsgfVxuZWxzZSB7IGRlbGV0ZSB3aW5kb3cuTW9kZXJuaXpyOyB9XG59KSh3aW5kb3cpOyIsInZhciBtYXAgPSB7XG5cdFwiLi9hY2NvcmRpb24tLW1vZHVsZS1sb2FkZXJcIjogW1xuXHRcdFwiLi9fSFRNTC9zcmMvanMvX21vZHVsZXMtbG9hZGVycy9hY2NvcmRpb24tLW1vZHVsZS1sb2FkZXIuanNcIixcblx0XHQwLFxuXHRcdDE0XG5cdF0sXG5cdFwiLi9hY2NvcmRpb24tLW1vZHVsZS1sb2FkZXIuanNcIjogW1xuXHRcdFwiLi9fSFRNTC9zcmMvanMvX21vZHVsZXMtbG9hZGVycy9hY2NvcmRpb24tLW1vZHVsZS1sb2FkZXIuanNcIixcblx0XHQwLFxuXHRcdDE0XG5cdF0sXG5cdFwiLi9hbmltYXRlZC10ZXh0XCI6IFtcblx0XHRcIi4vX0hUTUwvc3JjL2pzL19tb2R1bGVzLWxvYWRlcnMvYW5pbWF0ZWQtdGV4dC5qc1wiLFxuXHRcdDIyXG5cdF0sXG5cdFwiLi9hbmltYXRlZC10ZXh0LmpzXCI6IFtcblx0XHRcIi4vX0hUTUwvc3JjL2pzL19tb2R1bGVzLWxvYWRlcnMvYW5pbWF0ZWQtdGV4dC5qc1wiLFxuXHRcdDIyXG5cdF0sXG5cdFwiLi9iZWVyYm94LS1tb2R1bGUtbG9hZGVyXCI6IFtcblx0XHRcIi4vX0hUTUwvc3JjL2pzL19tb2R1bGVzLWxvYWRlcnMvYmVlcmJveC0tbW9kdWxlLWxvYWRlci5qc1wiLFxuXHRcdDEsXG5cdFx0Mixcblx0XHQ0LFxuXHRcdDMsXG5cdFx0OFxuXHRdLFxuXHRcIi4vYmVlcmJveC0tbW9kdWxlLWxvYWRlci5qc1wiOiBbXG5cdFx0XCIuL19IVE1ML3NyYy9qcy9fbW9kdWxlcy1sb2FkZXJzL2JlZXJib3gtLW1vZHVsZS1sb2FkZXIuanNcIixcblx0XHQxLFxuXHRcdDIsXG5cdFx0NCxcblx0XHQzLFxuXHRcdDhcblx0XSxcblx0XCIuL2NhcnQtLW1vZHVsZS1sb2FkZXJcIjogW1xuXHRcdFwiLi9fSFRNTC9zcmMvanMvX21vZHVsZXMtbG9hZGVycy9jYXJ0LS1tb2R1bGUtbG9hZGVyLmpzXCIsXG5cdFx0MTJcblx0XSxcblx0XCIuL2NhcnQtLW1vZHVsZS1sb2FkZXIuanNcIjogW1xuXHRcdFwiLi9fSFRNTC9zcmMvanMvX21vZHVsZXMtbG9hZGVycy9jYXJ0LS1tb2R1bGUtbG9hZGVyLmpzXCIsXG5cdFx0MTJcblx0XSxcblx0XCIuL2NhdGFsb2ctZmlsdGVyLS1tb2R1bGUtbG9hZGVyXCI6IFtcblx0XHRcIi4vX0hUTUwvc3JjL2pzL19tb2R1bGVzLWxvYWRlcnMvY2F0YWxvZy1maWx0ZXItLW1vZHVsZS1sb2FkZXIuanNcIixcblx0XHQyM1xuXHRdLFxuXHRcIi4vY2F0YWxvZy1maWx0ZXItLW1vZHVsZS1sb2FkZXIuanNcIjogW1xuXHRcdFwiLi9fSFRNTC9zcmMvanMvX21vZHVsZXMtbG9hZGVycy9jYXRhbG9nLWZpbHRlci0tbW9kdWxlLWxvYWRlci5qc1wiLFxuXHRcdDIzXG5cdF0sXG5cdFwiLi9kcmFnZ2FibGUtdGFibGUtLW1vZHVsZS1sb2FkZXJcIjogW1xuXHRcdFwiLi9fSFRNTC9zcmMvanMvX21vZHVsZXMtbG9hZGVycy9kcmFnZ2FibGUtdGFibGUtLW1vZHVsZS1sb2FkZXIuanNcIixcblx0XHQyNFxuXHRdLFxuXHRcIi4vZHJhZ2dhYmxlLXRhYmxlLS1tb2R1bGUtbG9hZGVyLmpzXCI6IFtcblx0XHRcIi4vX0hUTUwvc3JjL2pzL19tb2R1bGVzLWxvYWRlcnMvZHJhZ2dhYmxlLXRhYmxlLS1tb2R1bGUtbG9hZGVyLmpzXCIsXG5cdFx0MjRcblx0XSxcblx0XCIuL2dvb2dsZS1tYXAtLW1vZHVsZS1sb2FkZXJcIjogW1xuXHRcdFwiLi9fSFRNTC9zcmMvanMvX21vZHVsZXMtbG9hZGVycy9nb29nbGUtbWFwLS1tb2R1bGUtbG9hZGVyLmpzXCIsXG5cdFx0MCxcblx0XHQ5LFxuXHRcdDE1XG5cdF0sXG5cdFwiLi9nb29nbGUtbWFwLS1tb2R1bGUtbG9hZGVyLmpzXCI6IFtcblx0XHRcIi4vX0hUTUwvc3JjL2pzL19tb2R1bGVzLWxvYWRlcnMvZ29vZ2xlLW1hcC0tbW9kdWxlLWxvYWRlci5qc1wiLFxuXHRcdDAsXG5cdFx0OSxcblx0XHQxNVxuXHRdLFxuXHRcIi4vaW5maW5pdHktc2Nyb2xsLS1tb2R1bGUtbG9hZGVyXCI6IFtcblx0XHRcIi4vX0hUTUwvc3JjL2pzL19tb2R1bGVzLWxvYWRlcnMvaW5maW5pdHktc2Nyb2xsLS1tb2R1bGUtbG9hZGVyLmpzXCIsXG5cdFx0MTZcblx0XSxcblx0XCIuL2luZmluaXR5LXNjcm9sbC0tbW9kdWxlLWxvYWRlci5qc1wiOiBbXG5cdFx0XCIuL19IVE1ML3NyYy9qcy9fbW9kdWxlcy1sb2FkZXJzL2luZmluaXR5LXNjcm9sbC0tbW9k
10072dWxlLWxvYWRlci5qc1wiLFxuXHRcdDE2XG5cdF0sXG5cdFwiLi9pbnB1dC1xdWFudGl0eS0tbW9kdWxlLWxvYWRlclwiOiBbXG5cdFx0XCIuL19IVE1ML3NyYy9qcy9fbW9kdWxlcy1sb2FkZXJzL2lucHV0LXF1YW50aXR5LS1tb2R1bGUtbG9hZGVyLmpzXCIsXG5cdFx0MzIsXG5cdFx0MTdcblx0XSxcblx0XCIuL2lucHV0LXF1YW50aXR5LS1tb2R1bGUtbG9hZGVyLmpzXCI6IFtcblx0XHRcIi4vX0hUTUwvc3JjL2pzL19tb2R1bGVzLWxvYWRlcnMvaW5wdXQtcXVhbnRpdHktLW1vZHVsZS1sb2FkZXIuanNcIixcblx0XHQzMixcblx0XHQxN1xuXHRdLFxuXHRcIi4vaW5wdXRtYXNrLS1tb2R1bGUtbG9hZGVyXCI6IFtcblx0XHRcIi4vX0hUTUwvc3JjL2pzL19tb2R1bGVzLWxvYWRlcnMvaW5wdXRtYXNrLS1tb2R1bGUtbG9hZGVyLmpzXCIsXG5cdFx0MCxcblx0XHQxMCxcblx0XHQxM1xuXHRdLFxuXHRcIi4vaW5wdXRtYXNrLS1tb2R1bGUtbG9hZGVyLmpzXCI6IFtcblx0XHRcIi4vX0hUTUwvc3JjL2pzL19tb2R1bGVzLWxvYWRlcnMvaW5wdXRtYXNrLS1tb2R1bGUtbG9hZGVyLmpzXCIsXG5cdFx0MCxcblx0XHQxMCxcblx0XHQxM1xuXHRdLFxuXHRcIi4vanF1ZXJ5LXZhbGlkYXRpb24tLW1vZHVsZS1sb2FkZXJcIjogW1xuXHRcdFwiLi9fSFRNTC9zcmMvanMvX21vZHVsZXMtbG9hZGVycy9qcXVlcnktdmFsaWRhdGlvbi0tbW9kdWxlLWxvYWRlci5qc1wiLFxuXHRcdDAsXG5cdFx0MSxcblx0XHQyLFxuXHRcdDQsXG5cdFx0N1xuXHRdLFxuXHRcIi4vanF1ZXJ5LXZhbGlkYXRpb24tLW1vZHVsZS1sb2FkZXIuanNcIjogW1xuXHRcdFwiLi9fSFRNTC9zcmMvanMvX21vZHVsZXMtbG9hZGVycy9qcXVlcnktdmFsaWRhdGlvbi0tbW9kdWxlLWxvYWRlci5qc1wiLFxuXHRcdDAsXG5cdFx0MSxcblx0XHQyLFxuXHRcdDQsXG5cdFx0N1xuXHRdLFxuXHRcIi4vbWFnbmlmaWMtcG9wdXAtLW1vZHVsZS1sb2FkZXJcIjogW1xuXHRcdFwiLi9fSFRNTC9zcmMvanMvX21vZHVsZXMtbG9hZGVycy9tYWduaWZpYy1wb3B1cC0tbW9kdWxlLWxvYWRlci5qc1wiLFxuXHRcdDAsXG5cdFx0MSxcblx0XHQyLFxuXHRcdDMsXG5cdFx0MThcblx0XSxcblx0XCIuL21hZ25pZmljLXBvcHVwLS1tb2R1bGUtbG9hZGVyLmpzXCI6IFtcblx0XHRcIi4vX0hUTUwvc3JjL2pzL19tb2R1bGVzLWxvYWRlcnMvbWFnbmlmaWMtcG9wdXAtLW1vZHVsZS1sb2FkZXIuanNcIixcblx0XHQwLFxuXHRcdDEsXG5cdFx0Mixcblx0XHQzLFxuXHRcdDE4XG5cdF0sXG5cdFwiLi9wYXJ0bmVyLWZvcm0tLW1vZHVsZS1sb2FkZXJcIjogW1xuXHRcdFwiLi9fSFRNTC9zcmMvanMvX21vZHVsZXMtbG9hZGVycy9wYXJ0bmVyLWZvcm0tLW1vZHVsZS1sb2FkZXIuanNcIixcblx0XHQxMVxuXHRdLFxuXHRcIi4vcGFydG5lci1mb3JtLS1tb2R1bGUtbG9hZGVyLmpzXCI6IFtcblx0XHRcIi4vX0hUTUwvc3JjL2pzL19tb2R1bGVzLWxvYWRlcnMvcGFydG5lci1mb3JtLS1tb2R1bGUtbG9hZGVyLmpzXCIsXG5cdFx0MTFcblx0XSxcblx0XCIuL3Bhc3N3b3JkLXRvZ2dsZS0tbW9kdWxlLWxvYWRlclwiOiBbXG5cdFx0XCIuL19IVE1ML3NyYy9qcy9fbW9kdWxlcy1sb2FkZXJzL3Bhc3N3b3JkLXRvZ2dsZS0tbW9kdWxlLWxvYWRlci5qc1wiLFxuXHRcdDE5XG5cdF0sXG5cdFwiLi9wYXNzd29yZC10b2dnbGUtLW1vZHVsZS1sb2FkZXIuanNcIjogW1xuXHRcdFwiLi9fSFRNTC9zcmMvanMvX21vZHVsZXMtbG9hZGVycy9wYXNzd29yZC10b2dnbGUtLW1vZHVsZS1sb2FkZXIuanNcIixcblx0XHQxOVxuXHRdLFxuXHRcIi4vcmV2aWV3LXJlYWQtbW9yZS0tbW9kdWxlLWxvYWRlclwiOiBbXG5cdFx0XCIuL19IVE1ML3NyYy9qcy9fbW9kdWxlcy1sb2FkZXJzL3Jldmlldy1yZWFkLW1vcmUtLW1vZHVsZS1sb2FkZXIuanNcIixcblx0XHQyNVxuXHRdLFxuXHRcIi4vcmV2aWV3LXJlYWQtbW9yZS0tbW9kdWxlLWxvYWRlci5qc1wiOiBbXG5cdFx0XCIuL19IVE1ML3NyYy9qcy9fbW9kdWxlcy1sb2FkZXJzL3Jldmlldy1yZWFkLW1vcmUtLW1vZHVsZS1sb2FkZXIuanNcIixcblx0XHQyNVxuXHRdLFxuXHRcIi4vczJzLS1tb2R1bGUtbG9hZGVyXCI6IFtcblx0XHRcIi4vX0hUTUwvc3JjL2pzL19tb2R1bGVzLWxvYWRlcnMvczJzLS1tb2R1bGUtbG9hZGVyLmpzXCIsXG5cdFx0MjZcblx0XSxcblx0XCIuL3Mycy0tbW9kdWxlLWxvYWRlci5qc1wiOiBbXG5cdFx0XCIuL19IVE1ML3NyYy9qcy9fbW9kdWxlcy1sb2FkZXJzL3Mycy0tbW9kdWxlLWxvYWRlci5qc1wiLFxuXHRcdDI2XG5cdF0sXG5cdFwiLi9zY3JvbGwtd2luZG93LS1tb2R1bGUtbG9hZGVyXCI6IFtcblx0XHRcIi4vX0hUTUwvc3JjL2pzL19tb2R1bGVzLWxvYWRlcnMvc2Nyb2xsLXdpbmRvdy0tbW9kdWxlLWxvYWRlci5qc1wiLFxuXHRcdDUsXG5cdFx0MjEsXG5cdFx0MjBcblx0XSxcblx0XCIuL3Njcm9sbC13aW5kb3ctLW1vZHVsZS1sb2FkZXIuanNcIjogW1xuXHRcdFwiLi9fSFRNTC9zcmMvanMvX21vZHVsZXMtbG9hZGVycy9zY3JvbGwtd2luZG93LS1tb2R1bGUtbG9hZGVyLmpzXCIsXG5cdFx0NSxcblx0XHQyMSxcblx0XHQyMFxuXHRdLFxuXHRcIi4vc2xpZGVycy0tbW9kdWxlLWxvYWRlclwiOiBbXG5cdFx0XCIuL19IVE1ML3NyYy9qcy9fbW9kdWxlcy1sb2FkZXJzL3NsaWRlcnMtLW1vZHVsZS1sb2FkZXIuanNcIixcblx0XHQ2LFxuXHRcdDI3XG5cdF0sXG5cdFwiLi9zbGlkZXJzLS1tb2R1bGUtbG9hZGVyLmpzXCI6IFtcblx0XHRcIi4vX0hUTUwvc3JjL2pzL19tb2R1bGVzLWxvYWRlcnMvc2xpZGVycy0tbW9kdWxlLWxvYWRlci5qc1wiLFxuXHRcdDYsXG5cdFx0Mjdcblx0XSxcblx0XCIuL3NwbGFzaC1uby0xOFwiOiBbXG5cdFx0XCIuL19IVE1ML3NyYy9qcy9fbW9kdWxlcy1sb2FkZXJzL3NwbGFzaC1uby0xOC5qc1wiLFxuXHRcdDI4XG5cdF0sXG5cdFwiLi9zcGxhc2gtbm8tMTguanNcIjogW1xuXHRcdFwiLi9fSFRNTC9zcmMvanMvX21vZHVsZXMtbG9hZGVycy9zcGxhc2gtbm8tMTguanNcIixcblx0XHQyOFxuXHRdLFxuXHRcIi4vdGltZWxpbmVcIjogW1xuXHRcdFwiLi9fSFRNTC9zcmMvanMvX21vZHVsZXMtbG9hZGVycy90aW1lbGluZS5qc1wiLFxuXHRcdDMzLFxuXHRcdDI5XG5cdF0sXG5cdFwiLi90aW1lbGluZS5qc1wiOiBbXG5cdFx0XCIuL19IVE1ML3NyYy9qcy9fbW9kdWxlcy1sb2FkZXJzL3RpbWVsaW5lLmpzXCIsXG5cdFx0MzMsXG5cdFx0Mjlcblx0XSxcblx0XCIuL3dyYXAtbWVkaWEtLW1vZHVsZS1sb2FkZXJcIjogW1xuXHRcdFwiLi9fSFRNTC9zcmMvanMvX21vZHVsZXMtbG9hZGVycy93cmFwLW1lZGlhLS1tb2R1bGUtbG9hZGVyLmpzXCIsXG5cdFx0MzBcblx0XSxcblx0XCIuL3dyYXAtbWVkaWEtLW1vZHVsZS1sb2FkZXIuanNcIjogW1xuXHRcdFwiLi9fSFRNTC9zcmMvanMvX21vZHVsZXMtbG9hZGVycy93cmFwLW1lZGlhLS1tb2R1bGUtbG9hZGVyLmpzXCIsXG5cdFx0MzBcblx0XSxcblx0XCIuL3p6bG9hZC0tbW9kdWxlLWxvYWRlclwiOiBbXG5cdFx0XCIuL19IVE1ML3NyYy9qcy9fbW9kdWxlcy1sb2FkZXJzL3p6bG9hZC0tbW9kdWxlLWxvYWRlci5qc1wiLFxuXHRcdDMxXG5cdF0sXG5cdFwiLi96emxvYWQtLW1vZHVsZS1sb2FkZXIuanNcIjogW1xuXHRcdFwiLi9fSFRNTC9zcmMvanMvX21vZHVsZXMtbG9hZGVycy96emxvYWQtLW1vZHVsZS1sb2FkZXIuanNcIixcblx0XHQzMVxuXHRdXG59O1xuZnVuY3Rpb24gd2VicGFja0FzeW5jQ29udGV4dChyZXEpIHtcblx0dmFyIGlkcyA9IG1hcFtyZXFdO1xuXHRpZighaWRzKSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0XHR0aHJvdyBlO1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybi
10072BQcm9taXNlLmFsbChpZHMuc2xpY2UoMSkubWFwKF9fd2VicGFja19yZXF1aXJlX18uZSkpLnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGlkID0gaWRzWzBdO1xuXHRcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fLnQoaWQsIDcpO1xuXHR9KTtcbn1cbndlYnBhY2tBc3luY0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tBc3luY0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQXN5bmNDb250ZXh0LmlkID0gXCIuL19IVE1ML3NyYy9qcy9fbW9kdWxlcy1sb2FkZXJzIGxhenkgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLiokXCI7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tBc3luY0NvbnRleHQ7IiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBtb2R1bGUgQmFsbCBNb2RhbCAtINGA0LDQt9C80LXRidC10L3QuNC1INGI0LDRgNC40LrQsCDQuCDRg9C/0YDQsNCy0LvQtdC90LjQtSDQvNC+0LTQsNC70YzQvdGL0Lwg0L7QutC90L7QvFxuICovXG5cbmltcG9ydCBjb29raWVEYXRhIGZyb20gJyMvX21vZHVsZXMvY29va2llLWRhdGEnO1xuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcblxuLyoqXG4gKiDQmtC70LDRgdGBINC00LvRjyDRg9C/0YDQsNCy0LvQtdC90LjRjyBCYWxsIE1vZGFsXG4gKi9cbmNsYXNzIEJhbGxNb2RhbCB7XG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHRoaXMuY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmJmLWJhbGwtY29udGFpbmVyJyk7XG5cdFx0dGhpcy5iYWxsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmJmLWJhbGwnKTtcblx0XHR0aGlzLm1vZGFsU3RlcDEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmZCYWxsTW9kYWxTdGVwMScpO1xuXHRcdHRoaXMubW9kYWxTdGVwMiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiZkJhbGxNb2RhbFN0ZXAyJyk7XG5cdFx0XG5cdFx0Ly8g0J/RgNC+0LLQtdGA0Y/QtdC8INC90LDQu9C40YfQuNC1INC60L7QvdGC0LXQudC90LXRgNCwINC4INGI0LDRgNC40LrQsFxuXHRcdGlmICghdGhpcy5jb250YWluZXIpIHtcblx0XHRcdGNvbnNvbGUud2FybignQmFsbE1vZGFsOiDQutC+0L3RgtC10LnQvdC10YAgLmJmLWJhbGwtY29udGFpbmVyINC90LUg0L3QsNC50LTQtdC9INCyIERPTScpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRcblx0XHRpZiAoIXRoaXMuYmFsbCkge1xuXHRcdFx0Y29uc29sZS53YXJuKCdCYWxsTW9kYWw6INGI0LDRgNC40LogLmJmLWJhbGwg0L3QtSDQvdCw0LnQtNC10L0g0LIgRE9NJyk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdFxuXHRcdC8vINCf0YDQvtCy0LXRgNGP0LXQvCDQvdCw0LvQuNGH0LjQtSBjb29raWVcblx0XHRpZiAoY29va2llRGF0YS5yZWNlaXZlKCdzaG93LWJhbGwtbW9kYWwnKSkge1xuXHRcdFx0Ly8g0JXRgdC70LggY29va2llINGD0YHRgtCw0L3QvtCy0LvQtdC90LAsINGB0LrRgNGL0LLQsNC10Lwg0YjQsNGA0LjQulxuXHRcdFx0dGhpcy5jb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblx0XHRcdHRoaXMuY29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0XG5cdFx0Ly8g0JjQvdC40YbQuNCw0LvQuNC30LjRgNGD0LXQvCDRiNCw0YDQuNC6XG5cdFx0dGhpcy5pbml0KCk7XG5cdH1cblxuXHQvKipcblx0ICog0JjQvdC40YbQuNCw0LvQuNC30LDRhtC40Y9cblx0ICovXG5cdGluaXQoKSB7XG5cdFx0aWYgKCF0aGlzLmNvbnRhaW5lciB8fCAhdGhpcy5iYWxsKSB7XG5cdFx0XHRjb25zb2xlLndhcm4oJ0JhbGxNb2RhbDog0LrQvtC90YLQtdC50L3QtdGAINC40LvQuCDRiNCw0YDQuNC6INC90LUg0L3QsNC50LTQtdC90Ysg0L/RgNC4INC40L3QuNGG0LjQsNC70LjQt9Cw0YbQuNC4Jyk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8g0KPQsdC10LbQtNCw0LXQvNGB0Y8sINGH0YLQviDRiNCw0YDQuNC6INC90LDRhdC+0LTQuNGC0YHRjyDQstC90YPRgtGA0Lgg0LrQvtC90YLQtdC50L3QtdGA0LBcblx0XHRpZiAoIXRoaXMuY29udGFpbmVyLmNvbnRhaW5zKHRoaXMuYmFsbCkpIHtcblx0XHRcdGNvbnNvbGUud2FybignQmFsbE1vZGFsOiDRiNCw0YDQuNC6INC90LUg0L3QsNC50LTQtdC9INCy0L3Rg9GC0YDQuCDQutC+0L3RgtC10LnQvdC10YDQsCwg0LTQvtCx0LDQstC70Y/QtdC8Jyk7XG5cdFx0XHR0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmJhbGwpO1xuXHRcdH1cblxuXHRcdC8vINCj0LTQsNC70Y/QtdC8INC60L7QvdGC0LXQudC90LXRgCDQuNC3INGC0LXQutGD0YnQtdCz0L4g0LzQtdGB0YLQsCDQsiBET00gKNC10YHQu9C4INC+0L0g0YLQsNC8INC10YHRgtGMKVxuXHRcdGlmICh0aGlzLmNvbnRhaW5lci5wYXJlbnROb2RlKSB7XG5cdFx0XHR0aGlzLmNvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuY29udGFpbmVyKTtcblx0XHR9XG5cblx0XHQvLyDQodC60YDRi9Cy0LDQtdC8INGI0LDRgNC40Log0LLRgNC10LzQtdC90L3QvlxuXHRcdHRoaXMuY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cdFx0dGhpcy5jb250YWluZXIuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuXG5cdFx0Ly8g0KDQsNC30LzQtdGJ0LDQtdC8INGI0LDRgNC40LosINC/0YDQuNC60YDQtdC/0LvRj9GPINC6INGB0LvRg9GH0LDQudC90L7QvNGDINGN0LvQtdC80LXQvdGC0YNcblx0XHR0aGlzLnBvc2l0aW9uQmFsbCgpO1xuXG5cdFx0Ly8g0J/RgNC40L3Rg9C00LjRgtC10LvRjNC90L4g0L/QvtC60LDQt9GL0LLQsNC10Lwg0YjQsNGA0LjQuiDQv9C+0YHQu9C1INGA0LDQt9C80LXRidC10L3QuNGPXG5cdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5jb250YWluZXIgJiYgdGhpcy5jb250YWluZXIucGFyZW50Tm9kZSkge1xuXHRcdFx0XHQvLyDQo9Cx0LXQttC00LDQtdC80YHRjywg0YfRgtC+INGI0LDRgNC40Log0LLQuNC00LXQvVxuXHRcdFx0XHR0aGlzLmNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblx0XHRcdFx0dGhpcy5jb250YWluZXIuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcblx0XHRcdFx0dGhpcy5jb250YWluZXIuc3R5bGUub3BhY2l0eSA9ICcxJztcblx0XHRcdFx0dGhpcy5jb250YWluZXIuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhdXRvJztcblx0XHRcdFx0dGhpcy5jb250YWluZXIuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuXHRcdFx0XHR0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdpcy1hdHRhY2hlZCcpO1xuXHRcdFx0XHRcblx0XHRcdFx0Ly8g0J/RgNC+0LLQtdGA0LrQsCDQutC+0L7RgNC00LjQvdCw0YJcblx0XHRcdFx0Y29uc3QgcmVjdCA9IHRoaXMuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdFx0XHRpZiAocmVjdC53aWR0aCA9PT0gMCB8fCByZWN0LmhlaWdodCA9PT0gMCkge1xuXHRcdFx0XHRcdGNvbnNvbGUud2FybignQmFsbE1vZGFsOiDRiNCw0YDQuNC6INC40LzQtdC10YIg0L3Rg9C70LXQstC+0Lkg0YDQsNC30LzQtdGALCDQstC+0LfQvNC+0LbQvdC+INGB0LrRgNGL0YIgQ1NTJyk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnNvbGUud2FybignQmFsbE1vZGFsOiDRiNCw0YDQuNC6INC90LUg0LHRi9C7INC00L7QsdCw0LLQu9C10L0g0LIgRE9NINC/0L7RgdC70LUg0L/QvtC30LjRhtC40L7QvdC40YDQvtCy0LDQvdC40Y8sINC40YHQv9C+0LvRjNC30YPQtdC8IGZhbGxiYWNrJyk7XG5cdFx0XHRcdC8vIEZhbGxiYWNrIC0g0YDQsNC30LzQtdGJ0LDQtdC8INCyINGB0LvRg9GH0LDQudC90L7QuSDQv9C+0LfQuNGG0LjQuFxuXHRcdFx0XHR0aGlzLmF0dGFjaFRvUmFuZG9tUG9zaXRpb24oKTtcblx0XHRcdFx0aWYgKHRoaXMuY29udGFpbmVyICYmIHRoaXMuY29udGFpbmVyLnBhcmVudE5vZGUpIHtcblx0XHRcdFx0XHR0aGlzLmNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblx0XHRcdFx0XHR0aGlzLmNvbnRhaW5lci5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuXHRcdFx0XHRcdHRoaXMuY29udGFpbmVyLnN0eWxlLm9wYWNpdHkgPSAnMSc7XG5cdFx0XHRcdFx0dGhpcy5jb250YWluZXIuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhdXRvJztcblx0XHRcdFx0XHR0aGlzLmNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG5cdFx0XHRcdFx0dGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZCgnaXMtYXR0YWNoZWQnKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sIDE1MCk7XG5cblx0XHQvLyDQntCx0YDQsNCx0L7RgtC60LAg0LrQu9C40LrQsCDQvdCwINGI0LDRgNC40Lpcblx0XHR0aGlzLmJhbGwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuXHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0dGhpcy5zaG93TW9kYWxTdGVwMSgpO1xuXHRcdH0pO1xuXG5cdFx0Ly8g0J7QsdGA0LDQsdC+0YLQutCwINC30LDQutGA0YvRgtC40Y8g0LzQvtC00LDQu9GM0L3Ri9GFINC+0LrQvtC9XG5cdFx0dGhpcy5pbml0TW9kYWxIYW5kbGVycygpO1xuXG5cdFx0Ly8g0J7QsdGA0LDQsdC+0YLQutCwINGE0L7RgNC80Ytcblx0XHR0aGlzLmluaXRGb3JtSGFuZGxlcigpO1xuXG5cdFx0Ly8g0J7QsdGA0LDQsdC+0YLQutCwINC60L3QvtC/0LrQuCDQutC+0L/QuNGA0L7QstCw0L3QuNGPINC/0YDQvtC80L7QutC+0LTQsFxuXHRcdHRoaXMuaW5pdENvcHlCdXR0b24oKTtcblxuXHRcdC8vINCf0YDQuCDQuNC30LzQtdC90LXQvdC40Lgg0YDQsNC30LzQtdGA0LAg0L7QutC90LAgLSDQv9C10YDQtdC/0YDQuNC60YDQtdC/0LvRj9C10Lwg0YjQsNGA0LjQulxuXHRcdGxldCByZXNpemVUaW1lb3V0O1xuXHRcdHdpbmRvdy5hZGR
10072FdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB7XG5cdFx0XHRjbGVhclRpbWVvdXQocmVzaXplVGltZW91dCk7XG5cdFx0XHRyZXNpemVUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLmNvbnRhaW5lciAmJiB0aGlzLmNvbnRhaW5lci5wYXJlbnROb2RlICYmICFjb29raWVEYXRhLnJlY2VpdmUoJ3Nob3ctYmFsbC1tb2RhbCcpKSB7XG5cdFx0XHRcdFx0dGhpcy5jb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblx0XHRcdFx0XHRpZiAodGhpcy5jb250YWluZXIucGFyZW50Tm9kZSAhPT0gZG9jdW1lbnQuYm9keSkge1xuXHRcdFx0XHRcdFx0dGhpcy5jb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmNvbnRhaW5lcik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMucG9zaXRpb25CYWxsKCk7XG5cdFx0XHRcdFx0aWYgKHRoaXMuY29udGFpbmVyLnBhcmVudE5vZGUpIHtcblx0XHRcdFx0XHRcdHRoaXMuY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSwgMzAwKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiDQoNCw0LfQvNC10YnQtdC90LjQtSDRiNCw0YDQuNC60LAgLSDQv9GA0LjQutGA0LXQv9C70LXQvdC40LUg0Log0YHQu9GD0YfQsNC50L3QvtC80YMg0J3QldCe0KfQldCS0JjQlNCd0J7QnNCjINGN0LvQtdC80LXQvdGC0YMg0L3QsCDRgdGC0YDQsNC90LjRhtC1XG5cdCAqINCo0LDRgNC40Log0L/RgNC40LLRj9C30LDQvSDQuiDRjdC70LXQvNC10L3RgtGDINC4INC00LLQuNCz0LDQtdGC0YHRjyDQstC80LXRgdGC0LUg0YHQviDRgdGC0YDQsNC90LjRhtC10Lkg0L/RgNC4INC/0YDQvtC60YDRg9GC0LrQtVxuXHQgKi9cblx0cG9zaXRpb25CYWxsKCkge1xuXHRcdGlmICghdGhpcy5jb250YWluZXIgfHwgIXRoaXMuYmFsbCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vINCd0LDRhdC+0LTQuNC8INCy0YHQtSDQv9C+0LTRhdC+0LTRj9GJ0LjQtSDQndCV0J7Qp9CV0JLQmNCU0J3Qq9CVINGN0LvQtdC80LXQvdGC0Ysg0L3QsCDRgdGC0YDQsNC90LjRhtC1XG5cdFx0Ly8g0JLRi9Cx0LjRgNCw0LXQvCDQvNC10LvQutC40LUsINC90LXQt9Cw0LzQtdGC0L3Ri9C1INGN0LvQtdC80LXQvdGC0YsgLSDQtNC10LvQsNC10Lwg0LjQs9GA0YMg0LjQvdGC0LXRgNC10YHQvdC10LVcblx0XHRjb25zdCBzZWxlY3RvcnMgPSBbXG5cdFx0XHQncCcsIC8vINCe0LHRi9GH0L3Ri9C1INC/0LDRgNCw0LPRgNCw0YTRiyAo0L/RgNC10LTQv9C+0YfQuNGC0LDQtdC8INC80LXQu9C60LjQtSlcblx0XHRcdCdzcGFuOm5vdCguaWNvbik6bm90KC5iYWRnZSk6bm90KC50YWcpJywgLy8g0J7QsdGL0YfQvdGL0LUgc3Bhbiwg0L3QviDQvdC1INC40LrQvtC90LrQuC/QsdC10LnQtNC20Lhcblx0XHRcdCdzbWFsbCcsIC8vINCc0LXQu9C60LjQuSDRgtC10LrRgdGCXG5cdFx0XHQnbGFiZWwnLCAvLyDQnNC10YLQutC4INGE0L7RgNC8XG5cdFx0XHQndGltZScsIC8vINCt0LvQtdC80LXQvdGC0Ysg0LLRgNC10LzQtdC90Lhcblx0XHRcdCdhZGRyZXNzJywgLy8g0JDQtNGA0LXRgdCwXG5cdFx0XHQnY2l0ZScsIC8vINCm0LjRgtCw0YLRi1xuXHRcdFx0J2NvZGUnLCAvLyDQmtC+0LRcblx0XHRcdCdzdWInLCAnc3VwJywgLy8g0J/QvtC00YHRgtGA0L7Rh9C90YvQtS/QvdCw0LTRgdGC0YDQvtGH0L3Ri9C1INC40L3QtNC10LrRgdGLXG5cdFx0XHQnLnRleHQtc21hbGwnLCAvLyDQnNC10LvQutC40Lkg0YLQtdC60YHRglxuXHRcdFx0Jy5jYXB0aW9uJywgLy8g0J/QvtC00L/QuNGB0Lhcblx0XHRcdCcubWV0YScsIC8vINCc0LXRgtCwLdC40L3RhNC+0YDQvNCw0YbQuNGPXG5cdFx0XHQnLmRlc2NyaXB0aW9uOm5vdCgucHJvZHVjdC1kZXNjcmlwdGlvbiknLCAvLyDQntC/0LjRgdCw0L3QuNGPLCDQvdC+INC90LUg0L7Qv9C40YHQsNC90LjRjyDRgtC+0LLQsNGA0L7QslxuXHRcdF07XG5cblx0XHQvLyDQodC+0LHQuNGA0LDQtdC8INCy0YHQtSDQv9C+0LTRhdC+0LTRj9GJ0LjQtSDQndCV0J7Qp9CV0JLQmNCU0J3Qq9CVINGN0LvQtdC80LXQvdGC0Ytcblx0XHRsZXQgY2FuZGlkYXRlcyA9IFtdO1xuXHRcdFxuXHRcdHNlbGVjdG9ycy5mb3JFYWNoKHNlbGVjdG9yID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG5cdFx0XHRcdGVsZW1lbnRzLmZvckVhY2goZWwgPT4ge1xuXHRcdFx0XHRcdC8vINCY0YHQutC70Y7Rh9Cw0LXQvCDRjdC70LXQvNC10L3RgtGLLCDQutC+0YLQvtGA0YvQtSDRgdC70LjRiNC60L7QvCDQvNCw0LvRiyDQuNC70Lgg0YHQutGA0YvRgtGLXG5cdFx0XHRcdFx0Y29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdFx0XHRcdGNvbnN0IHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpO1xuXHRcdFx0XHRcdFxuXHRcdFx0XHRcdC8vINCY0YHQutC70Y7Rh9Cw0LXQvCDQvtGH0LXQstC40LTQvdGL0LUg0Lgg0LHQvtC70YzRiNC40LUg0Y3Qu9C10LzQtdC90YLRiyAtINC00LXQu9Cw0LXQvCDQuNCz0YDRgyDQuNC90YLQtdGA0LXRgdC90LXQtVxuXHRcdFx0XHRcdGNvbnN0IGlzT2J2aW91cyA9IFxuXHRcdFx0XHRcdFx0ZWwudGFnTmFtZS5tYXRjaCgvXkhbMS02XSQvaSkgfHwgLy8g0JfQsNCz0L7Qu9C+0LLQutC4XG5cdFx0XHRcdFx0XHRlbC50YWdOYW1lID09PSAnQlVUVE9OJyB8fCAvLyDQmtC90L7Qv9C60Lhcblx0XHRcdFx0XHRcdGVsLnRhZ05hbWUgPT09ICdJTUcnIHx8IC8vINCY0LfQvtCx0YDQsNC20LXQvdC40Y9cblx0XHRcdFx0XHRcdGVsLnRhZ05hbWUgPT09ICdBJyAmJiAoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdidG4nKSB8fCBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2xpbmsnKSB8fCBlbC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSkgfHwgLy8g0KHRgdGL0LvQutC4LdC60L3QvtC/0LrQuCDQuNC70Lgg0LvRjtCx0YvQtSDRgdGB0YvQu9C60Lhcblx0XHRcdFx0XHRcdGVsLmNsYXNzTGlzdC5jb250YWlucygndGl0bGUnKSB8fCAvLyDQrdC70LXQvNC10L3RgtGLINGBINC60LvQsNGB0YHQvtC8IH
10072RpdGxlXG5cdFx0XHRcdFx0XHRlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2J0bicpIHx8IC8vINCa0L3QvtC/0LrQuFxuXHRcdFx0XHRcdFx0ZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdidXR0b24nKSB8fCAvLyDQmtC90L7Qv9C60Lhcblx0XHRcdFx0XHRcdGVsLmNsYXNzTGlzdC5jb250YWlucygncHJvZHVjdC1jYXJkJykgfHwgLy8g0JrQsNGA0YLQvtGH0LrQuCDRgtC+0LLQsNGA0L7QslxuXHRcdFx0XHRcdFx0ZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdjYXRhbG9nLWl0ZW0nKSB8fCAvLyDQrdC70LXQvNC10L3RgtGLINC60LDRgtCw0LvQvtCz0LBcblx0XHRcdFx0XHRcdGVsLmNsYXNzTGlzdC5jb250YWlucygnY2FyZCcpIHx8IC8vINCa0LDRgNGC0L7Rh9C60Lhcblx0XHRcdFx0XHRcdGVsLmNsYXNzTGlzdC5jb250YWlucygnaXRlbScpIHx8IC8vINCt0LvQtdC80LXQvdGC0Ytcblx0XHRcdFx0XHRcdGVsLmNsYXNzTGlzdC5jb250YWlucygncHJvZHVjdCcpIHx8IC8vINCi0L7QstCw0YDRi1xuXHRcdFx0XHRcdFx0ZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdpY29uJykgfHwgLy8g0JjQutC+0L3QutC4XG5cdFx0XHRcdFx0XHRlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2xvZ28nKSB8fCAvLyDQm9C+0LPQvtGC0LjQv9GLXG5cdFx0XHRcdFx0XHRyZWN0LndpZHRoID4gMzAwIHx8IC8vINCh0LvQuNGI0LrQvtC8INCx0L7Qu9GM0YjQuNC1INGN0LvQtdC80LXQvdGC0Ytcblx0XHRcdFx0XHRcdHJlY3QuaGVpZ2h0ID4gMjAwOyAvLyDQodC70LjRiNC60L7QvCDQstGL0YHQvtC60LjQtSDRjdC70LXQvNC10L3RgtGLXG5cdFx0XHRcdFx0XG5cdFx0XHRcdFx0Ly8g0J/RgNC10LTQv9C+0YfQuNGC0LDQtdC8INGN0LvQtdC80LXQvdGC0Ysg0YHRgNC10LTQvdC10LPQviDRgNCw0LfQvNC10YDQsCwg0L3QviDQvdC1INGB0LvQuNGI0LrQvtC8INCx0L7Qu9GM0YjQuNC1XG5cdFx0XHRcdFx0Y29uc3QgaXNHb29kU2l6ZSA9IHJlY3Qud2lkdGggPj0gMzAgJiYgcmVjdC53aWR0aCA8PSAyNTAgJiYgXG5cdFx0XHRcdFx0ICAgICAgICAgICAgICAgICAgcmVjdC5oZWlnaHQgPj0gMjAgJiYgcmVjdC5oZWlnaHQgPD0gMTUwO1xuXHRcdFx0XHRcdFxuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdCFpc09idmlvdXMgJiYgLy8g0J3QtSDQvtGH0LXQstC40LTQvdGL0Lkg0Y3Qu9C10LzQtdC90YJcblx0XHRcdFx0XHRcdGlzR29vZFNpemUgJiYgLy8g0J/QvtC00YXQvtC00Y/RidC40Lkg0YDQsNC30LzQtdGAXG5cdFx0XHRcdFx0XHRzdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScgJiZcblx0XHRcdFx0XHRcdHN0eWxlLnZpc2liaWxpdHkgIT09ICdoaWRkZW4nICYmXG5cdFx0XHRcdFx0XHRzdHlsZS5vcGFjaXR5ICE9PSAnMCcgJiZcblx0XHRcdFx0XHRcdCFlbC5jbG9zZXN0KCcuYmYtYmFsbC1jb250YWluZXInKSAmJiAvLyDQndC1INC90LAg0YHQsNC80L7QvCDRiNCw0YDQuNC60LVcblx0XHRcdFx0XHRcdCFlbC5jbG9zZXN0KCdoZWFkZXInKSAmJiAvLyDQndC1INCyINGI0LDQv9C60LVcblx0XHRcdFx0XHRcdCFlbC5jbG9zZXN0KCdmb290ZXInKSAmJiAvLyDQndC1INCyINGE0YPRgtC10YDQtVxuXHRcdFx0XHRcdFx0IWVsLmNsb3Nlc3QoJy5iZi1iYWxsLW1vZGFsJykgJiYgLy8g0J3QtSDQsiDQvNC+0LTQsNC70LrQtVxuXHRcdFx0XHRcdFx0IWVsLmNsb3Nlc3QoJy5tb2RhbCcpICYmIC8vINCd0LUg0LIg0LTRgNGD0LPQuNGFINC80L7QtNCw0LvQutCw0YVcblx0XHRcdFx0XHRcdCFlbC5jbG9zZXN0KCcucG9wdXAnKSAvLyDQndC1INCyINC/0L7Qv9Cw0L/QsNGFXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRjYW5kaWRhdGVzLnB1c2goZWwpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdC8vINCY0LPQvdC+0YDQuNGA0YPQtdC8INC+0YjQuNCx0LrQuCDRgdC10LvQtdC60YLQvtGA0L7QslxuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8g0KTQuNC70YzRgtGA0YPQtdC8INGC0L7Qu9GM0LrQviDRjdC70LXQvNC10L3RgtGLINCyINCy0LjQtNC40LzQvtC5INC+0LHQu9Cw0YHRgtC4XG5cdFx0Y29uc3Qgdmlld3BvcnRIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG5cdFx0Y29uc3Qgdmlld3BvcnRXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuXHRcdFxuXHRcdGNvbnN0IHZpc2libGVDYW5kaWRhdGVzID0gY2FuZGlkYXRlcy5maWx0ZXIoZWwgPT4ge1xuXHRcdFx0Y29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0cmVjdC50b3AgPCB2aWV3cG9ydEhlaWdodCAmJlxuXHRcdFx0XHRyZWN0LmJvdHRvbSA+IDAgJiZcblx0XHRcdFx0cmVjdC5sZWZ0IDwgdmlld3BvcnRXaWR0aCAmJlxuXHRcdFx0XHRyZWN0LnJpZ2h0ID4gMCAmJlxuXHRcdFx0XHRyZWN0LndpZHRoID4gMCAmJlxuXHRcdFx0XHRyZWN0LmhlaWdodCA+IDBcblx0XHRcdCk7XG5cdFx0fSk7XG5cblx0XHQvLyDQldGB0LvQuCDQvdC1INC90LDRiNC70Lgg0L/QvtC00YXQvtC00Y/RidC40YUg0Y3Qu9C10LzQtdC90YLQvtCyLCDQuNGB0L/QvtC70YzQt9GD0LXQvCBib2R5XG5cdFx0aWYgKHZpc2libGVDYW5kaWRhdGVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0dGhpcy5hdHRhY2hUb1JhbmRvbVBvc2l0aW9uKCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8g0JLRi9Cx0LjRgNCw0LXQvCDRgdC70YPRh9Cw0LnQvdGL0Lkg0Y3Qu9C10LzQtdC90YIg0LjQtyDQstC40LTQuNC80YvRhVxuXHRcdGNvbnN0IHJhbmRvbUVsZW1lbnQgPSB2aXNpYmxlQ2FuZGlkYXRlc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiB2aXNpYmxlQ2FuZGlkYXRlcy5sZW5ndGgpXTtcblx0XHRcblx0XHQvLyDQn9GA0LjQutGA0LXQv9C70Y/QtdC8INGI0LDRgNC40Log0Log0LLRi9Cx0YDQsNC90L3QvtC80YMg0Y3Qu9C10LzQtdC90YLRg1xuXHRcdHRoaXMuYXR0YWNoVG9FbGVtZW50KHJhbmRvbUVsZW1lbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqINCf0YDQuNC60YDQtdC/0LvQtdC90LjQtSDRiNCw0YDQuNC60LAg0Log0LrQvtC90LrRgNC10YLQvdC+0LzRgyDRjdC70LXQvNC10L3RgtGDXG5cdCAqL1xuXHRhdHRhY2hUb0VsZW1lbnQoZWxlbWVudCkge1xuXHRcdGlmICghdGhpcy5jb250YWluZXIgfHwgIWVsZW1lbnQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyDQldGB0LvQuCDRjdC70LXQvNC10L3RgiAtIGJvZHksINC40YHQv9C+0LvRjNC30YPQtdC8INGB0LvRg9GH0LDQudC90L7QtSDQv9C+0LfQuNGG0LjQvtC90LjRgNC+0LLQsNC90LjQtVxuXHRcdGlmIChlbGVtZW50ID09PSBkb2N1bWVudC5ib2R5KSB7XG5cdFx0XHR0aGlzLmF0dGFjaFRvUmFuZG9tUG9zaXRpb24oKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyDQn9C+0LvRg9GH0LDQtdC8INC/0L7Qt9C40YbQuNGOINGN0LvQtdC80LXQvdGC0LAg0L7RgtC90L7RgdC40YLQtdC70YzQvdC+IHZpZXdwb3J0XG5cdFx0Y29uc3QgZWxlbWVudFJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdC8vINCf0L7Qu9GD0YfQsNC10Lwg0L/QvtC30LjRhtC40Y4g0Y3Qu9C10LzQtdC90YLQsCDQvtGC0L3QvtGB0LjRgtC10LvRjNC90L4g0LTQvtC60YPQvNC10L3RgtCwICjRgSDRg9GH0LXRgtC+0Lwg0L/RgNC+0LrRgNGD0YLQutC4KVxuXHRcdGNvbnN0IHNjcm9sbFkgPSB3aW5kb3cuc2Nyb2xsWSB8fCB3aW5kb3cucGFnZVlPZmZzZXQ7XG5cdFx0Y29uc3Qgc2Nyb2xsWCA9IHdpbmRvdy5zY3JvbGxYIHx8IHdpbmRvdy5wYWdlWE9mZnNldDtcblxuXHRcdC8vINCo0LDRgNC40Log0LTQvtC70LbQtdC9INCx0YvRgtGMINCy0LjQtNC10L0sINC/0L7RjdGC0L7QvNGDINGA0LDQt9C80LXRidCw0LXQvCDQtdCz0L4g0L7RgtC90L7RgdC40YLQtdC70YzQvdC+INGN0LvQtdC80LXQvdGC0LBcblx0XHQvLyDQktGL0LHQuNGA0LDQtdC8INGB0LvRg9GH0LDQudC90YPRjiDQv9C+0LfQuNGG0LjRjiDQstC+0LrRgNGD0LMg0Y3Qu9C10LzQtdC90YLQsFxuXHRcdGNvbnN0IGJhbGxXaWR0aCA9IDYwO1xuXHRcdGNvbnN0IGJhbGxIZWlnaHQgPSAyMjA7XG5cdFx0XG5cdFx0Ly8g0J/QvtC30LjRhtC40Lgg0L7RgtC90L7RgdC40YLQtdC70YzQvdC+INGN0LvQtdC80LXQvdGC0LAgKNC/0YDQvtGG0LXQvdGCINC+0YIg0YDQsNC30LzQtdGA0LAg0Y3Qu9C10LzQtdC90YLQsClcblx0XHRjb25zdCBwb3NpdGlvbnMgPSBbXG5cdFx0XHR7IHNpZGU6ICd0b3AtbGVmdCcsIHg6IDAuMSwgeTogLWJhbGxIZWlnaHQgLSAxMCB9LCAvLyDQodCy0LXRgNGF0YMg0YHQu9C10LLQsFxuXHRcdFx0eyBzaWRlOiAndG9wLXJpZ2h0JywgeDogMC45LCB5OiAtYmFsbEhlaWdodCAtIDEwIH0sIC8vINCh0LLQtdGA0YXRgyDRgdC/0YDQsNCy0LBcblx0XHRcdHsgc2lkZTogJ2JvdHRvbS1sZWZ0JywgeDogMC4xLCB5OiBlbGVtZW50UmVjdC5oZWlnaHQgKyAxMCB9LCAvLyDQodC90LjQt9GDINGB0LvQtdCy0LBcblx0XHRcdHsgc2lkZTogJ2JvdHRvbS1yaWdodCcsIHg6IDAuOSwgeTogZWxlbWVudFJlY3QuaGVpZ2h0ICsgMTAgfSwgLy8g0KHQvdC40LfRgyDRgdC/0YDQsNCy0LBcblx0XHRcdHsgc2lkZTogJ3RvcC1jZW50ZXInLCB4OiAwLjUsIHk6IC1iYWxsSGVpZ2h0IC0gMTAgfSwgLy8g0KHQstC10YDRhdGDINC/0L4g0YbQtdC90YLRgNGDXG5cdFx0XHR7IHNpZGU6ICdib3R0b20tY2VudGVyJywgeDogMC41LCB5OiBlbGVtZW50UmVjdC5oZWlnaHQgKyAxMCB9LCAvLyDQodC90LjQt9GDINC/0L4g0YbQtdC90YLRgNGDXG5cdFx0XTtcblxuXHRcdGNvbnN0IHJhbmRvbVBvcyA9IHBvc2l0aW9uc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBwb3NpdGlvbnMubGVuZ3RoKV07XG5cdFx0XG5cdFx0Ly8g0JLRi9GH0LjRgdC70Y/QtdC8INCw0LHRgdC+0LvRjtGC0L3Ri9C1INC60L7QvtGA0LTQuNC90LDRgtGLINC+0YLQvdC+0YHQuNGC0LXQu9GM0L3QviDQtNC+0LrRg9C80LXQvdGC0LAgKNGBINGD0YfQtdGC0L7QvCDQv9GA0L7QutGA0YPRgtC60LgpXG5cdFx0Ly8gZWxlbWVudFJlY3QubGVmdC90b3AgLSDRjdGC0L4g0L/QvtC30LjRhtC40Y8g0L7RgtC90L7RgdC40YLQtdC70YzQvdC+IHZpZXdwb3J0XG5cdFx0Ly8g0JTQvtCx0LDQstC70Y/QtdC8IHNjcm9sbFgvc2Nyb2xsWSDRh9GC0L7QsdGLINC/0L7Qu9GD0YfQuNGC0Ywg0L/QvtC30LjRhtC40Y4g0L7RgtC90L7RgdC40YLQtdC70YzQvdC+INC00L7QutGD0LzQtdC90YLQsFxuXHRcdGNvbnN0IGFic29sdXRlWCA9IGVsZW1lbnRSZWN0LmxlZnQgKyBzY3JvbGxYICsgKGVsZW1lbnRSZWN0LndpZHR
10072oICogcmFuZG9tUG9zLngpIC0gKGJhbGxXaWR0aCAqIDAuNSk7XG5cdFx0Y29uc3QgYWJzb2x1dGVZID0gZWxlbWVudFJlY3QudG9wICsgc2Nyb2xsWSArIHJhbmRvbVBvcy55O1xuXHRcdFxuXHRcdC8vINCj0LHQtdC20LTQsNC10LzRgdGPLCDRh9GC0L4g0YjQsNGA0LjQuiDQvdCw0YXQvtC00LjRgtGB0Y8g0LLQvdGD0YLRgNC4INC60L7QvdGC0LXQudC90LXRgNCwXG5cdFx0aWYgKCF0aGlzLmNvbnRhaW5lci5jb250YWlucyh0aGlzLmJhbGwpKSB7XG5cdFx0XHR0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmJhbGwpO1xuXHRcdH1cblx0XHRcblx0XHQvLyDQktGB0YLQsNCy0LvRj9C10Lwg0LrQvtC90YLQtdC50L3QtdGAINGBINGI0LDRgNC40LrQvtC8INCyIGJvZHkg0YEg0LDQsdGB0L7Qu9GO0YLQvdGL0Lwg0L/QvtC30LjRhtC40L7QvdC40YDQvtCy0LDQvdC40LXQvFxuXHRcdGlmICh0aGlzLmNvbnRhaW5lci5wYXJlbnROb2RlICE9PSBkb2N1bWVudC5ib2R5KSB7XG5cdFx0XHRkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuY29udGFpbmVyKTtcblx0XHR9XG5cdFx0XG5cdFx0Ly8g0KPRgdGC0LDQvdCw0LLQu9C40LLQsNC10Lwg0L/QvtC30LjRhtC40Y4gKGFic29sdXRlLCDRh9GC0L7QsdGLINGI0LDRgNC40Log0LHRi9C7INC/0YDQuNCy0Y/Qt9Cw0L0g0Log0Y3Qu9C10LzQtdC90YLRgyDQuCDQtNCy0LjQs9Cw0LvRgdGPINGB0L4g0YHRgtGA0LDQvdC40YbQtdC5KVxuXHRcdHRoaXMuY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcblx0XHR0aGlzLmNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gYCR7YWJzb2x1dGVYfXB4YDtcblx0XHR0aGlzLmNvbnRhaW5lci5zdHlsZS50b3AgPSBgJHthYnNvbHV0ZVl9cHhgO1xuXHRcdHRoaXMuY29udGFpbmVyLnN0eWxlLnpJbmRleCA9ICc5OTk4Jztcblx0XHR0aGlzLmNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblx0XHR0aGlzLmNvbnRhaW5lci5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuXHRcdHRoaXMuY29udGFpbmVyLnN0eWxlLm9wYWNpdHkgPSAnMSc7XG5cdFx0dGhpcy5jb250YWluZXIuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhdXRvJztcblx0XHR0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdpcy1hdHRhY2hlZCcpO1xuXHR9XG5cblx0LyoqXG5cdCAqINCf0YDQuNC60YDQtdC/0LvQtdC90LjQtSDQuiDRgdC70YPRh9Cw0LnQvdC+0Lkg0L/QvtC30LjRhtC40Lgg0L3QsCDRgdGC0YDQsNC90LjRhtC1IChmYWxsYmFjaylcblx0ICovXG5cdGF0dGFjaFRvUmFuZG9tUG9zaXRpb24oKSB7XG5cdFx0aWYgKCF0aGlzLmNvbnRhaW5lcikge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGJhbGxXaWR0aCA9IDYwO1xuXHRcdGNvbnN0IGJhbGxIZWlnaHQgPSAyMjA7XG5cdFx0Y29uc3QgcGFkZGluZyA9IDIwO1xuXHRcdGNvbnN0IHZpZXdwb3J0V2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcblx0XHRjb25zdCB2aWV3cG9ydEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcblx0XHRjb25zdCBzY3JvbGxZID0gd2luZG93LnNjcm9sbFkgfHwgd2luZG93LnBhZ2VZT2Zmc2V0O1xuXHRcdGNvbnN0IHNjcm9sbFggPSB3aW5kb3cuc2Nyb2xsWCB8fCB3aW5kb3cucGFnZVhPZmZzZXQ7XG5cdFx0XG5cdFx0Ly8g0J/QvtC70YPRh9Cw0LXQvCDRgNCw0LfQvNC10YDRiyDQtNC+0LrRg9C80LXQvdGC0LBcblx0XHRjb25zdCBkb2N1bWVudEhlaWdodCA9IE1hdGgubWF4KFxuXHRcdFx0ZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQsXG5cdFx0XHRkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCxcblx0XHRcdGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsXG5cdFx0XHRkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0LFxuXHRcdFx0ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm9mZnNldEhlaWdodFxuXHRcdCk7XG5cdFx0Y29uc3QgZG9jdW1lbnRXaWR0aCA9IE1hdGgubWF4KFxuXHRcdFx0ZG9jdW1lbnQuYm9keS5zY3JvbGxXaWR0aCxcblx0XHRcdGRvY3VtZW50LmJvZHkub2Zmc2V0V2lkdGgsXG5cdFx0XHRkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsXG5cdFx0XHRkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsV2lkdGgsXG5cdFx0XHRkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub2Zmc2V0V2lkdGhcblx0XHQpO1xuXG5cdFx0Ly8g0JLRi9GH0LjRgdC70Y/QtdC8INC00LjQsNC/0LDQt9C+0L0g0LTQu9GPINGB0LvRg9GH0LDQudC90L7QuSDQv9C+0LfQuNGG0LjQuCDQvtGC0L3QvtGB0LjRgtC10LvRjNC90L4g0LTQvtC60YPQvNC10L3RgtCwXG5cdFx0Y29uc3QgbWluWCA9IHBhZGRpbmc7XG5cdFx0Y29uc3QgbWF4WCA9IE1hdGgubWF4KHZpZXdwb3J0V2lkdGgsIGRvY3VtZW50V2lkdGgpIC0gYmFsbFdpZHRoIC0gcGFkZGluZztcblx0XHRjb25zdCBtaW5ZID0gcGFkZGluZztcblx0XHRjb25zdCBtYXhZID0gTWF0aC5tYXgodmlld3BvcnRIZWlnaHQsIGRvY3VtZW50SGVpZ2h0KSAtIGJhbGxIZWlnaHQgLSBwYWRkaW5nO1xuXG5cdFx0Y29uc3QgcmFuZG9tWCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXhYIC0gbWluWCArIDEpKSArIG1pblg7XG5cdFx0Y29uc3QgcmFuZG9tWSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXhZIC0gbWluWSArIDEpKSArIG1pblk7XG5cblx0XHQvLyDQo9Cx0LXQttC00LDQtdC80YHRjywg0YfRgtC+INGI0LDRgNC40Log0L3QsNGF0L7QtNC40YLRgdGPINCy0L3Rg9GC0YDQuCDQutC+0L3RgtC10LnQvdC10YDQsFxuXHRcdGlmICh0aGlzLmJhbGwgJiYgIXRoaXMuY29udGFpbmVyLmNvbnRhaW5zKHRoaXMuYmFsbCkpIHtcblx0XHRcdHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuYmFsbCk7XG5cdFx0fVxuXG5cdFx0Ly8g0JLRgdGC0LDQstC70Y/QtdC8INC60L7QvdGC0LXQudC90LXRgCDRgSDRiNCw0YDQuNC60L7QvCDQsiBib2R5XG5cdFx0aWYgKHRoaXMuY29udGFpbmVyLnBhcmVudE5vZGUgIT09IGRvY3VtZW50LmJvZHkpIHtcblx0XHRcdGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5jb250YWluZXIpO1xuXHRcdH1cblx0XHRcblx0XHQvLyDQmNGB0L/QvtC70YzQt9GD0LXQvCBhYnNvbHV0ZSDQv9C+0LfQuNGG0LjQvtC90LjRgNC+0LLQsNC90LjQtSDQvtGC0L3QvtGB0LjRgtC10LvRjNC90L4g0LTQvtC60YPQvNC10L3RgtCwXG5cdFx0dGhpcy5jb250YWluZXIuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuXHRcdHRoaXMuY29udGFpbmVyLnN0eWxlLmxlZnQgPSBgJHtyYW5kb21YfXB4YDtcblx0XHR0aGlzLmNvbnRhaW5lci5zdHlsZS50b3AgPSBgJHtyYW5kb21ZfXB4YDtcblx0XHR0aGlzLmNvbnRhaW5lci5zdHlsZS56SW5kZXggPSAnOTk5OCc7XG5cdFx0dGhpcy5jb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cdFx0dGhpcy5jb250YWluZXIuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcblx0XHR0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdpcy1hdHRhY2hlZCcpO1xuXHR9XG5cblx0LyoqXG5cdCAqINCf0L7QutCw0Lcg0L/QtdGA0LLQvtCz0L4g0LzQvtC00LDQu9GM0L3QvtCz0L4g0L7QutC90LAgKNGE0L7RgNC80LAgZW1haWwpXG5cdCAqL1xuXHRzaG93TW9kYWxTdGVwMSgpIHtcblx0XHRpZiAoIXRoaXMubW9kYWxTdGVwMSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vINCh0LrRgNGL0LLQsNC10Lwg0YjQsNGA0LjQuiDRgdGA0LDQt9GDINC4INC/0L7Qu9C90L7RgdGC0YzRjlxuXHRcdGlmICh0aGlzLmNvbnRhaW5lcikge1xuXHRcdFx0dGhpcy5jb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblx0XHRcdHRoaXMuY29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcblx0XHRcdHRoaXMuY29udGFpbmVyLnN0eWxlLm9wYWNpdHkgPSAnMCc7XG5cdFx0XHR0aGlzLmNvbnRhaW5lci5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuXHRcdH1cblxuXHRcdC8vINCf0L7QutCw0LfRi9Cy0LDQtdC8INC80L7QtNCw0LvRjNC90L7QtSDQvtC60L3QvlxuXHRcdHRoaXMubW9kYWxTdGVwMS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuXHRcdGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcblx0fVxuXG5cdC8qKlxuXHQgKiDQn9C+0LrQsNC3INCy0YLQvtGA0L7Qs9C+INC80L7QtNCw0LvRjNC90L7Qs9C+INC+0LrQvdCwICjQv9GA0L7QvNC+0LrQvtC0KVxuXHQgKi9cblx0c2hvd01vZGFsU3RlcDIocHJvbW9jb2RlKSB7XG5cdFx0aWYgKCF0aGlzLm1vZGFsU3RlcDIpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyDQodC60YDRi9Cy0LDQtdC8INC/0LXRgNCy0L7QtSDQvNC+0LTQsNC70YzQvdC+0LUg0L7QutC90L5cblx0XHRpZiAodGhpcy5tb2R
10072hbFN0ZXAxKSB7XG5cdFx0XHR0aGlzLm1vZGFsU3RlcDEuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblx0XHR9XG5cblx0XHQvLyDQo9GB0YLQsNC90LDQstC70LjQstCw0LXQvCDQv9GA0L7QvNC+0LrQvtC0XG5cdFx0Y29uc3QgcHJvbW9jb2RlSW5wdXQgPSB0aGlzLm1vZGFsU3RlcDIucXVlcnlTZWxlY3RvcignI2JmQmFsbFByb21vY29kZScpO1xuXHRcdGlmIChwcm9tb2NvZGVJbnB1dCAmJiBwcm9tb2NvZGUpIHtcblx0XHRcdHByb21vY29kZUlucHV0LnZhbHVlID0gcHJvbW9jb2RlO1xuXHRcdH1cblxuXHRcdC8vINCe0LHQvdC+0LLQu9GP0LXQvCDRgtC10LrRgdGCINGBINC/0YDQvtGG0LXQvdGC0L7QvCDRgdC60LjQtNC60Lhcblx0XHRjb25zdCBwcm9tb2NvZGVUZXh0ID0gdGhpcy5tb2RhbFN0ZXAyLnF1ZXJ5U2VsZWN0b3IoJyNiZkJhbGxQcm9tb2NvZGVUZXh0Jyk7XG5cdFx0aWYgKHByb21vY29kZVRleHQgJiYgcHJvbW9jb2RlKSB7XG5cdFx0XHQvLyDQmNC30LLQu9C10LrQsNC10Lwg0L/RgNC+0YbQtdC90YIg0LjQtyDQv9GA0L7QvNC+0LrQvtC00LAgKEJMS0ZSRDUgLT4gNSUsIEJMS0ZSRDEwIC0+IDEwJSwg0Lgg0YIu0LQuKVxuXHRcdFx0bGV0IGRpc2NvdW50VGV4dCA9ICcnO1xuXHRcdFx0aWYgKHByb21vY29kZSA9PT0gJ0RPU1RGUkVFJykge1xuXHRcdFx0XHRkaXNjb3VudFRleHQgPSAn0JHQldCX0JrQntCo0KLQntCS0J3QoyDQlNCe0KHQotCQ0JLQmtCjINCd0JAg0JDQlNCS0JXQndCiINCa0JDQm9CV0J3QlNCQ0KAnO1xuXHRcdFx0fSBlbHNlIGlmIChwcm9tb2NvZGUuc3RhcnRzV2l0aCgnQkxLRlJEJykpIHtcblx0XHRcdFx0Ly8g0JjQt9Cy0LvQtdC60LDQtdC8INGH0LjRgdC70L4g0LjQtyDQv9GA0L7QvNC+0LrQvtC00LAgKEJMS0ZSRDUgLT4gNSwgQkxLRlJEMTAgLT4gMTApXG5cdFx0XHRcdGNvbnN0IG1hdGNoID0gcHJvbW9jb2RlLm1hdGNoKC9CTEtGUkQoXFxkKykvKTtcblx0XHRcdFx0aWYgKG1hdGNoICYmIG1hdGNoWzFdKSB7XG5cdFx0XHRcdFx0Y29uc3QgcGVyY2VudCA9IG1hdGNoWzFdO1xuXHRcdFx0XHRcdGRpc2NvdW50VGV4dCA9IGAtJHtwZXJjZW50fSVgO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRpc2NvdW50VGV4dCA9ICfQn9Cg0J7QnNCe0JrQntCUJztcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGlzY291bnRUZXh0ID0gJ9Cf0KDQntCc0J7QmtCe0JQnO1xuXHRcdFx0fVxuXHRcdFx0XG5cdFx0XHRwcm9tb2NvZGVUZXh0LnRleHRDb250ZW50ID0gYNCS0IbQotCQ0ITQnNCeISDQktCYINCX0J3QkNCZ0KjQm9CYICR7ZGlzY291bnRUZXh0fWA7XG5cdFx0fVxuXG5cdFx0Ly8g0J/QvtC60LDQt9GL0LLQsNC10Lwg0LLRgtC+0YDQvtC1INC80L7QtNCw0LvRjNC90L7QtSDQvtC60L3QvlxuXHRcdHRoaXMubW9kYWxTdGVwMi5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuXHR9XG5cblx0LyoqXG5cdCAqINCh0LrRgNGL0YLQuNC1INC80L7QtNCw0LvRjNC90L7Qs9C+INC+0LrQvdCwXG5cdCAqL1xuXHRoaWRlTW9kYWwoKSB7XG5cdFx0aWYgKHRoaXMubW9kYWxTdGVwMSkge1xuXHRcdFx0dGhpcy5tb2R
10072hbFN0ZXAxLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cdFx0fVxuXHRcdGlmICh0aGlzLm1vZGFsU3RlcDIpIHtcblx0XHRcdHRoaXMubW9kYWxTdGVwMi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXHRcdH1cblx0XHRkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJyc7XG5cdH1cblxuXHQvKipcblx0ICog0JjQvdC40YbQuNCw0LvQuNC30LDRhtC40Y8g0L7QsdGA0LDQsdC+0YLRh9C40LrQvtCyINC80L7QtNCw0LvRjNC90YvRhSDQvtC60L7QvVxuXHQgKi9cblx0aW5pdE1vZGFsSGFuZGxlcnMoKSB7XG5cdFx0Ly8g0JrQvdC+0L/QutC4INC30LDQutGA0YvRgtC40Y9cblx0XHRjb25zdCBjbG9zZUJ1dHRvbnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuanMtY2xvc2UtYmYtYmFsbC1tb2RhbCwgLmpzLWhpZGUtYmYtYmFsbC1tb2RhbCcpO1xuXHRcdGNsb3NlQnV0dG9ucy5mb3JFYWNoKGJ0biA9PiB7XG5cdFx0XHRidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG5cdFx0XHRcdHRoaXMuaGlkZU1vZGFsKCk7XG5cdFx0XHRcdC8vINCj0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdC8IGNvb2tpZSwg0YfRgtC+0LHRiyDQsdC+0LvRjNGI0LUg0L3QtSDQv9C+0LrQsNC30YvQstCw0YLRjCDRiNCw0YDQuNC6XG5cdFx0XHRcdGNvb2tpZURhdGEuYWRkKCdzaG93LWJhbGwtbW9kYWwnLCBmYWxzZSwge1xuXHRcdFx0XHRcdGV4cGlyZXM6IDM2NSxcblx0XHRcdFx0XHRwYXRoOiAnLycsXG5cdFx0XHRcdFx0U2FtZVNpdGU6ICdOb25lJyxcblx0XHRcdFx0XHRTZWN1cmU6ICdTZWN1cmUnXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cblx0XHQvLyDQl9Cw0LrRgNGL0YLQuNC1INC/0YDQuCDQutC70LjQutC1INC90LAg0YTQvtC9XG5cdFx0W3RoaXMubW9kYWxTdGVwMSwgdGhpcy5tb2RhbFN0ZXAyXS5mb3JFYWNoKG1vZGFsID0+IHtcblx0XHRcdGlmIChtb2RhbCkge1xuXHRcdFx0XHRtb2RhbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG5cdFx0XHRcdFx0aWYgKGUudGFyZ2V0ID09PSBtb2RhbCkge1xuXHRcdFx0XHRcdFx0dGhpcy5oaWRlTW9kYWwoKTtcblx0XHRcdFx0XHRcdGNvb2tpZURhdGEuYWRkKCdzaG93LWJhbGwtbW9kYWwnLCBmYWxzZSwge1xuXHRcdFx0XHRcdFx0XHRleHBpcmVzOiAzNjUsXG5cdFx0XHRcdFx0XHRcdHBhdGg6ICcvJyxcblx0XHRcdFx0XHRcdFx0U2FtZVNpdGU6ICdOb25lJyxcblx0XHRcdFx0XHRcdFx0U2VjdXJlOiAnU2VjdXJlJ1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiDQmNC90LjRhtC40LDQu9C40LfQsNGG0LjRjyDQvtCx0YDQsNCx0L7RgtGH0LjQutCwINGE0L7RgNC80Ytcblx0ICog0KTQvtGA0LzQsCDQvtCx0YDQsNCx0LDRgtGL0LLQsNC10YLRgdGPINGH0LXRgNC10Lcg0YHRgtCw0L3QtNCw0YDRgtC90YPRjiDRgdC40YHRgtC10LzRgyDQstCw0LvQuNC00LDRhtC40Lhcblx0ICog0JzRiyDQv9C10YDQtdGF0LLQsNGC0YvQstCw0LXQvCDRg9GB0L/QtdGI0L3Ri9C5INC+0YLQstC10YIg0YfQtdGA0LXQtyDQutCw0YHRgtC+0LzQvdC+0LUg0YHQvtCx0YvRgtC40LVcblx0ICovXG5cdGluaXRGb3JtSGFuZGxlcigpIHtcblx0XHRpZiAoIXRoaXMubW9kYWxTdGVwMSkge1xuXHRcdFx0Y29uc29sZS53YXJuKCdCYWxsTW9kYWw6IG1vZGFsU3RlcDEg0L3QtSDQvdCw0LnQtNC10L0nKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBmb3JtID0gdGhpcy5tb2RhbFN0ZXAxLnF1ZXJ5U2VsZWN0b3IoJ2Zvcm1bZGF0YS1hamF4XScpO1xuXHRcdGlmICghZm9ybSkge1xuXHRcdFx0Y29uc29sZS53YXJuKCdCYWxsTW9kYWw6INGE0L7RgNC80LAg0L3QtSDQvdCw0LnQtNC10L3QsCDQsiBtb2RhbFN0ZXAxJyk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgJGZvcm0gPSAkKGZvcm0pO1xuXHRcdFxuXHRcdC8vINCh0L7RhdGA0LDQvdGP0LXQvCDRgdGB0YvQu9C60YMg0L3QsCDRhNC+0YDQvNGDINC00LvRjyDQuNGB0L/QvtC70YzQt9C+0LLQsNC90LjRjyDQsiDQtNGA0YPQs9C40YUg0LzQtdGC0L7QtNCw0YVcblx0XHR0aGlzLmZvcm0gPSBmb3JtO1xuXHRcdHRoaXMuJGZvcm0gPSAkZm9ybTtcblxuXHRcdC8vINCf0LXRgNC10YXQstCw0YLRi9Cy0LDQtdC8INC+0YLQstC10YIg0YfQtdGA0LXQtyDQutCw0YHRgtC+0LzQvdC+0LUg0YHQvtCx0YvRgtC40LUsINC60L7RgtC+0YDQvtC1INCz0LXQvdC10YDQuNGA0YPQtdGC0YHRjyDQsiB2YWxpZGF0ZUdldFJlc3BvbnNlXG5cdFx0JGZvcm0ub24oJ2JhbGxtb2RhbDpyZXNwb25zZScsIChlLCByZXNwb25zZSkgPT4ge1xuXHRcdFx0Y29uc29sZS5sb2coJ0JhbGxNb2RhbDog0L/QvtC70YPRh9C10L0g0L7RgtCy0LXRgiDQvtGCIGJhbGxtb2RhbCcsIHJlc3BvbnNlKTtcblx0XHRcdFxuXHRcdFx0aWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnN1Y2Nlc3MgJiYgcmVzcG9uc2UuYmFsbG1vZGFsKSB7XG5cdFx0XHRcdC8vINCV0YHQu9C4INGE0L7RgNC80LAg0YPRgdC/0LXRiNC90L4g0L7RgtC/0YDQsNCy0LvQtdC90LAsINC+0YLQv9GA0LDQstC70Y/QtdC8INC90LAg0LLRgtC+0YDQvtC5INGI0LDQs1xuXHRcdFx0XHRjb25zb2xlLmxvZygnQmFsbE1vZGFsOiDRg9GB0L/QtdGI0L3Ri9C5INC+0YLQstC10YIsINC/0LXRgNC10YXQvtC00LjQvCDQuiDRgdC+0YXRgNCw0L3QtdC90LjRjicpO1xuXHRcdFx0XHR0aGlzLnNhdmVCYWxsKHJlc3BvbnNlKTtcblx0XHRcdH0gZWxzZSBpZiAocmVzcG9uc2UgJiYgIXJlc3BvbnNlLnN1Y2Nlc3MpIHtcblx0XHRcdFx0Ly8g0J/QvtC60LDQt9GL0LLQsNC10Lwg0L7RiNC40LHQutGDLCDQtdGB0LvQuCDQvtC90LAg0LXRgdGC0Yxcblx0XHRcdFx0Y29uc3QgZXJyb3JNc2cgPSByZXNwb25zZS5yZXNwb25zZSB8fCAn0J/QvtC80LjQu9C60LAuINCh0L/RgNC+0LHRg9C50YLQtSDRidC1INGA0LDQty4nO1xuXHRcdFx0XHRjb25zb2xlLmVycm9yKCdCYWxsTW9kYWw6INC+0YjQuNCx0LrQsCDQsiDQvtGC0LLQtdGC0LUnLCBlcnJvck1zZyk7XG5cdFx0XHRcdGFsZXJ0KGVycm9yTXNnKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnNvbGUud2FybignQmFsbE1vZGFsOiDQvdC10L7QttC40LTQsNC90L3Ri9C5INGE0L7RgNC80LDRgiDQvtGC0LLQtdGC0LAnLCByZXNwb25zZSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0XG5cdFx0Y29uc29sZS5sb2coJ0JhbGxNb2RhbDog0L7QsdGA0LDQsdC+0YLRh9C40Log0YTQvtGA0LzRiyDQuNC90LjRhtC40LDQu9C40LfQuNGA0L7QstCw0L0g0LTQu9GPJywgZm9ybSwgJ1VSTDonLCAkZm9ybS5kYXRhKCdhamF4JykpO1xuXHR9XG5cblx0LyoqXG5cdCAqINCh0L7RhdGA0LDQvdC10L3QuNC1INGI0LDRgNC40LrQsCAo0LLRgtC+0YDQvtC5INGI0LDQsylcblx0ICovXG5cdHNhdmVCYWxsKG1vZGFsUmVzcG9uc2UpIHtcblx0XHRjb25zb2xlLmxvZygnQmFsbE1vZGFsOiBzYXZlQmFsbCDQstGL0LfQstCw0L0g0YEg0L7RgtCy0LXRgtC+0LwnLCBtb2RhbFJlc3BvbnNlKTtcblx0XHRcblx0XHRjb25zdCBlbWFpbElucHV0ID0gdGhpcy5tb2R
10072hbFN0ZXAxLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9XCJlbWFpbFwiXScpO1xuXHRcdGlmICghZW1haWxJbnB1dCkge1xuXHRcdFx0Y29uc29sZS5lcnJvcignQmFsbE1vZGFsOiBlbWFpbCBpbnB1dCDQvdC1INC90LDQudC00LXQvScpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGVtYWlsID0gZW1haWxJbnB1dC52YWx1ZTtcblx0XHRpZiAoIWVtYWlsKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKCdCYWxsTW9kYWw6IGVtYWlsINC90LUg0L3QsNC50LTQtdC9INCyIGlucHV0Jyk7XG5cdFx0XHRhbGVydCgn0J/QvtC80LjQu9C60LA6IGVtYWlsINC90LUg0LfQvdCw0LnQtNC10L3QvicpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vINCY0YHQv9C+0LvRjNC30YPQtdC8INGB0L7RhdGA0LDQvdC10L3QvdGD0Y4g0YHRgdGL0LvQutGDINC90LAg0YTQvtGA0LzRgyDQuNC70Lgg0LjRidC10Lwg0LfQsNC90L7QstC+XG5cdFx0Y29uc3QgZm9ybSA9IHRoaXMuZm9ybSB8fCB0aGlzLm1vZGFsU3RlcDEucXVlcnlTZWxlY3RvcignZm9ybVtkYXRhLWFqYXhdJyk7XG5cdFx0aWYgKCFmb3JtKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKCdCYWxsTW9kYWw6INGE0L7RgNC80LAg0L3QtSDQvdCw0LnQtNC10L3QsCcpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0ICRmb3JtID0gdGhpcy4kZm9ybSB8fCAkKGZvcm0pO1xuXHRcdGNvbnN0IGJhc2VVcmwgPSAkZm9ybS5kYXRhKCdhamF4JykgfHwgZm9ybS5nZXRBdHRyaWJ1dGUoJ2RhdGEtYWpheCcpO1xuXHRcdGlmICghYmFzZVVybCkge1xuXHRcdFx0Y29uc29sZS5lcnJvcignQmFsbE1vZGFsOiDQvdC1INGD0LTQsNC70L7RgdGMINC+0L/RgNC10LTQtdC70LjRgtGMIFVSTCDQuNC3INGE0L7RgNC80YsnKTtcblx0XHRcdGFsZXJ0KCfQn9C+0LzQuNC70LrQsDog0L3QtSDQstC00LDQu9C+0YHRjyDQstC40LfQvdCw0YfQuNGC0LggVVJMINC00LvRjyDQt9Cx0LXRgNC10LbQtdC90L3RjycpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRcblx0XHRjb25zb2xlLmxvZygnQmFsbE1vZGFsOiDQvtGC0L/RgNCw0LLQu9GP0LXQvCDQt9Cw0L/RgNC+0YEg0L3QsCDRgdC+0YXRgNCw0L3QtdC90LjQtSwgZW1haWw6JywgZW1haWwsICdVUkw6JywgYmFzZVVybCk7XG5cblx0XHQvLyDQl9Cw0LzQtdC90Y/QtdC8IGJhbGxtb2RhbCDQvdCwIGJhbGxzYXZlXG5cdFx0Y29uc3Qgc2F2ZVVybCA9IGJhc2VVcmwucmVwbGFjZSgnYmFsbG1vZGFsJywgJ2JhbGxzYXZlJyk7XG5cblx0XHRjb25zb2xlLmxvZygnQmFsbE1vZGFsOiDQvtGC0L/RgNCw0LLQu9GP0LXQvCDQt9Cw0L/RgNC+0YEg0L3QsCDRgdC+0YXRgNCw0L3QtdC90LjQtScpO1xuXG5cdFx0JC5hamF4KHtcblx0XHRcdGNhY2hlOiBmYWxzZSxcblx0XHRcdG1ldGhvZDogJ1BPU1QnLFxuXHRcdFx0dXJsOiBzYXZlVXJsLFxuXHRcdFx0ZGF0YToge1xuXHRcdFx0XHRlbWFpbDogZW1haWxcblx0XHRcdH0sXG5cdFx0XHRkYXRhVHlwZTogJ2pzb24nLFxuXHRcdFx0Y29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgnXG5cdFx0fSkuZG9uZSgocmVzcG9uc2UsIHRleHRTdGF0dXMsIHhocikgPT4ge1xuXHRcdFx0Y29uc29sZS5sb2coJ0JhbGxNb2RhbDog0YPRgdC/0LXRiNC90YvQuSDQvtGC0LLQtdGCINC+0YIgYmFsbHNhdmUnLCB7IHJlc3BvbnNlLCB0ZXh0U3RhdHVzLCB4aHIgfSk7XG5cdFx0XHRcblx0XHRcdC8vINCf0YDQvtCy0LXRgNGP0LXQvCwg0YfRgtC+INC+0YLQstC10YIg0Y/QstC70Y/QtdGC0YHRjyDQvtCx0YrQtdC60YLQvtC8XG5cdFx0XHRpZiAodHlwZW9mIHJlc3BvbnNlICE9PSAnb2JqZWN0JyB8fCByZXNwb25zZSA9PT0gbnVsbCkge1xuXHRcdFx0XHRjb25zb2xlLmVycm9yKCdJbnZhbGlkIHJlc3BvbnNlIGZvcm1hdDonLCByZXNwb25zZSk7XG5cdFx0XHRcdGFsZXJ0KCfQn9C+0LzQuNC70LrQsDog0L3QtdC60L7RgNC10LrRgtC90LAg0LLRltC00L/QvtCy0ZbQtNGMINCy0ZbQtCDRgdC10YDQstC10YDQsCcpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XG5cdFx0XHRcdC8vINCf0L7Qu9GD0YfQsNC10Lwg0L/RgNC+0LzQvtC60L7QtCDQuNC3INC+0YLQstC10YLQsFxuXHRcdFx0XHRjb25zdCBwcm9tb2NvZGUgPSByZXNwb25zZS5wcm9tbyB8fCByZXNwb25zZS5wcm9tb2NvZGUgfHwgJ0RPU1RGUkVFJztcblx0XHRcdFx0Y29uc29sZS5sb2coJ0JhbGxNb2RhbDog0L/QvtC70YPRh9C10L0g0L/RgNC+0LzQvtC60L7QtCcsIHByb21vY29kZSk7XG5cdFx0XHRcdFxuXHRcdFx0XHQvLyDQn9C+0LrQsNC30YvQstCw0LXQvCDQstGC0L7RgNC+0LUg0LzQvtC00LDQu9GM0L3QvtC1INC+0LrQvdC+INGBINC/0YDQvtC80L7QutC+0LTQvtC8XG5cdFx0XHRcdHRoaXMuc2hvd01vZGFsU3RlcDIocHJvbW9jb2RlKTtcblxuXHRcdFx0XHQvLyDQo9GB0YLQsNC90LDQstC70LjQstCw0LXQvCBjb29raWVcblx0XHRcdFx0Y29va2llRGF0YS5hZGQoJ3Nob3ctYmFsbC1tb2RhbCcsIGZhbHNlLCB7XG5cdFx0XHRcdFx0ZXhwaXJlczogMzY1LFxuXHRcdFx0XHRcdHBhdGg6ICcvJyxcblx0XHRcdFx0XHRTYW1lU2l0ZTogJ05vbmUnLFxuXHRcdFx0XHRcdFNlY3VyZTogJ1NlY3VyZSdcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBlcnJvck1zZyA9IHJlc3BvbnNlLnJlc3BvbnNlIHx8IHJlc3BvbnNlLm1lc3NhZ2UgfHwgJ9Cf0L7QvNC40LvQutCwLiDQodC/0YDQvtCx0YPQudGC0LUg0YnQtSDRgNCw0LcuJztcblx0XHRcdFx0Y29uc29sZS5lcnJvcignQmFsbE1vZGFsOiDQvtGI0LjQsdC60LAg0LIg0L7RgtCy0LXRgtC1JywgZXJyb3JNc2cpO1xuXHRcdFx0XHRhbGVydChlcnJvck1zZyk7XG5cdFx0XHR9XG5cdFx0fSkuZmFpbCgoeGhyLCBzdGF0dXMsIGVycm9yKSA9PiB7XG5cdFx0XHRjb25zb2xlLmVycm9yKCdCYWxsTW9kYWw6IEFKQVggZmFpbCDQstGL0LfQstCw0L0nLCB7IFxuXHRcdFx0XHRzdGF0dXM6IHhoci5zdGF0dXMsIFxuXHRcdFx0XHRzdGF0dXNUZXh0OiB4aHIuc3RhdHVzVGV4dCxcblx0XHRcdFx0cmVhZHlTdGF0ZTogeGhyLnJlYWR5U3RhdGUsXG5cdFx0XHRcdHJlc3BvbnNlVGV4dDogeGhyLnJlc3BvbnNlVGV4dCxcblx0XHRcdFx0cmVzcG9uc2VKU09OOiB4aHIucmVzcG9uc2VKU09OLFxuXHRcdFx0XHRzdGF0dXM6IHN0YXR1cyxcblx0XHRcdFx0ZXJyb3I6IGVycm9yXG5cdFx0XHR9KTtcblx0XHRcdFxuXHRcdFx0bGV0IGVycm9yTXNnID0gJ9Cf0L7QvNC40LvQutCwINC3XFwn0ZTQtNC90LDQvdC90Y8uINCh0L/RgNC+0LHRg9C50YLQtSDRidC1INGA0LDQty4nO1xuXHRcdFx0XG5cdFx0XHQvLyDQldGB0LvQuCDRgdGC0LDRgtGD0YEgMjAwLCDQvdC+INC/0L7Qv9Cw0LvQuCDQsiBmYWlsIC0g0LLQvtC30LzQvtC20L3QviDQv9GA0L7QsdC70LXQvNCwINGBINC/0LDRgNGB0LjQvdCz0L7QvCBKU09OXG5cdFx0XHRpZiAoeGhyLnN0YXR1cyA9PT0gMjAwKSB7XG5cdFx0XHRcdGNvbnNvbGUud2FybignQmFsbE1vZGFsOiDRgdGC0LDRgtGD0YEgMjAwLCDQvdC+INC/0L7Qv9Cw0LvQuCDQsiBmYWlsIC0g0LLQvtC30LzQvtC20L3QviDQv9GA0L7QsdC70LXQvNCwINGBIEpTT04nKTtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRjb25zdCByZXNwb25zZSA9IHR5cGVvZiB4aHIucmVzcG9uc2VKU09OICE9PSAndW5kZWZpbmVkJyBcblx0XHRcdFx0XHRcdD8geGhyLnJlc3BvbnNlSl
10072NPTiBcblx0XHRcdFx0XHRcdDogSlNPTi5wYXJzZSh4aHIucmVzcG9uc2VUZXh0KTtcblx0XHRcdFx0XHRcblx0XHRcdFx0XHRpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2Uuc3VjY2Vzcykge1xuXHRcdFx0XHRcdFx0Ly8g0JXRgdC70Lgg0L7RgtCy0LXRgiDRg9GB0L/QtdGI0L3Ri9C5LCDQvtCx0YDQsNCx0LDRgtGL0LLQsNC10Lwg0LXQs9C+XG5cdFx0XHRcdFx0XHRjb25zdCBwcm9tb2NvZGUgPSByZXNwb25zZS5wcm9tbyB8fCByZXNwb25zZS5wcm9tb2NvZGUgfHwgJ0RPU1RGUkVFJztcblx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKCdCYWxsTW9kYWw6INC+0LHRgNCw0LHQsNGC0YvQstCw0LXQvCDQvtGC0LLQtdGCINC40LcgZmFpbCAo0YHRgtCw0YLRg9GBIDIwMCknLCBwcm9tb2NvZGUpO1xuXHRcdFx0XHRcdFx0dGhpcy5zaG93TW9kYWxTdGVwMihwcm9tb2NvZGUpO1xuXHRcdFx0XHRcdFx0Y29va2llRGF0YS5hZGQoJ3Nob3ctYmFsbC1tb2RhbCcsIGZhbHNlLCB7XG5cdFx0XHRcdFx0XHRcdGV4cGlyZXM6IDM2NSxcblx0XHRcdFx0XHRcdFx0cGF0aDogJy8nLFxuXHRcdFx0XHRcdFx0XHRTYW1lU2l0ZTogJ05vbmUnLFxuXHRcdFx0XHRcdFx0XHRTZWN1cmU6ICdTZWN1cmUnXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnJlc3BvbnNlKSB7XG5cdFx0XHRcdFx0XHRlcnJvck1zZyA9IHJlc3BvbnNlLnJlc3BvbnNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoJ0JhbGxNb2RhbDog0L7RiNC40LHQutCwINC/0LDRgNGB0LjQvdCz0LAg0L7RgtCy0LXRgtCwJywgZSk7XG5cdFx0XHRcdFx0ZXJyb3JNc2cgPSAn0J/QvtC80LjQu9C60LA6INC90LXQutC+0YDQtdC60YLQvdCwINCy0ZbQtNC/0L7QstGW0LTRjCDQstGW0LQg0YHQtdGA0LLQtdGA0LAnO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyDQn9GL0YLQsNC10LzRgdGPINC/0L7Qu9GD0YfQuNGC0Ywg0YHQvtC+0LHRidC10L3QuNC1INC+0LEg0L7RiNC40LHQutC1INC40Lcg0L7RgtCy0LXRgtCwXG5cdFx0XHRcdGlmICh4aHIucmVzcG9uc2VKU09OICYmIHhoci5yZXNwb25zZUpTT04ucmVzcG9uc2UpIHtcblx0XHRcdFx0XHRlcnJvck1zZyA9IHhoci5yZXNwb25zZUpTT04ucmVzcG9uc2U7XG5cdFx0XHRcdH0gZWxzZSBpZiAoeGhyLnJlc3BvbnNlVGV4dCkge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRjb25zdCBlcnJvclJlc3BvbnNlID0gSlNPTi5wYXJzZSh4aHIucmVzcG9uc2VUZXh0KTtcblx0XHRcdFx0XHRcdGlmIChlcnJvclJlc3BvbnNlLnJlc3BvbnNlKSB7XG5cdFx0XHRcdFx0XHRcdGVycm9yTXNnID0gZXJyb3JSZXNwb25zZS5yZXNwb25zZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdFx0XHQvLyDQmNCz0L3QvtGA0LjRgNGD0LXQvCDQvtGI0LjQsdC60YMg0L/QsNGA0YHQuNC90LPQsFxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0XG5cdFx0XHRhbGVydChlcnJvck1zZyk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICog0JjQvdC40YbQuNCw0LvQuNC30LDRhtC40Y8g0LrQvdC+0L/QutC4INC60L7Qv9C40YDQvtCy0LDQvdC40Y8g0L/RgNC+0LzQvtC60L7QtNCwXG5cdCAqL1xuXHRpbml0Q29weUJ1dHRvbigpIHtcblx0XHRjb25zdCBjb3B5QnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtY29weS10YXJnZXRdJyk7XG5cdFx0aWYgKCFjb3B5QnRuKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29weUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG5cdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRjb25zdCB0YXJnZXRTZWxlY3RvciA9IGNvcHlCdG4uZ2V0QXR0cmlidXRlKCdkYXRhLWNvcHktdGFyZ2V0Jyk7XG5cdFx0XHRjb25zdCB0YXJnZXRJbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0U2VsZWN0b3IpO1xuXG5cdFx0XHRpZiAodGFyZ2V0SW5wdXQpIHtcblx0XHRcdFx0dGFyZ2V0SW5wdXQuc2VsZWN0KCk7XG5cdFx0XHRcdHRhcmdldElucHV0LnNldFNlbGVjdGlvblJhbmdlKDAsIDk5OTk5KTsgLy8g0JTQu9GPINC80L7QsdC40LvRjNC90YvRhSDRg9GB0YLRgNC+0LnRgdGC0LJcblxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5Jyk7XG5cblx0XHRcdFx0XHQvLyDQktC40LfRg9Cw0LvRjNC90LDRjyDQvtCx0YDQsNGC0L3QsNGPINGB0LLRj9C30Yxcblx0XHRcdFx0XHRjb25zdCBvcmlnaW5hbFRleHQgPSBjb3B5QnRuLnRleHRDb250ZW50O1xuXHRcdFx0XHRcdGNvcHlCdG4udGV4dENvbnRlbnQgPSAn0KHQutC+0L/RltC50L7QstCw0L3QviEnO1xuXHRcdFx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdFx0Y29weUJ0bi50ZXh0Q29udGVudCA9IG9yaWdpbmFsVGV4dDtcblx0XHRcdFx0XHR9LCAyMDAwKTtcblx0XHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdFx0YWxlcnQoJ9Cd0LUg0LLQtNCw0LvQvtGB0Y8g0YHQutC+0L/RltGO0LLQsNGC0Lgg0L/RgNC+0LzQvtC60L7QtCcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQmFsbE1vZGFsO1xuXG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBkZWJvdW5jZSBmcm9tICdsb2Rhc2guZGVib3VuY2UnO1xuaW1wb3J0IHsgdG9nZ2xlQm9keVNjcm9sbExvY2sgfSBmcm9tICcuL21haW4tbWVudSc7XG5cbmV4cG9ydCBjb25zdCByZWZzID0ge1xuXHRib2R5OiBkb2N1bWVudC5ib2R5LFxuXHRtZW51OiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtbWFpbi1tZW51JyksXG5cdHNlYXJjaDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmpzLWNhdGFsb2ctc2VhcmNoJyksXG5cdHNlYXJjaElucHV0OiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtY2F0YWxvZy1zZWFyY2gtaW5wdXQnKSxcblx0b3BlbkJ0bjogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmpzLWNhdGFsb2ctc2VhcmNoLW9wZW4nKSxcblx0Y2xvc2VCdG46IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1jYXRhbG9nLXNlYXJjaC1jbG9zZScpLFxuXHRzZWFyY2hBbGxCdG46IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1jYXRhbG9nLXNlYXJjaC1zaG93LWFsbCcpLFxuXHRpdGVtc0xpc3Q6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1jYXRhbG9nLXNlYXJjaC1pdGVtcy1saXN0JyksXG5cdGl0ZW1zV3JhcDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmpzLWNhdGFsb2ctc2VhcmNoLWl0ZW1zLXdyYXAnKSxcblx0bm90Rm91bmRUZXh0OiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtY2F0YWxvZy1zZWFyY2gtbm90LWZvdW5kLXRleHQnKVxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKCkge1xuXHRpZiAoIXJlZnMub3BlbkJ0bikge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGNvbnN0IGhhbmRsZVNlYXJjaEF1dG9jb21wbGV0ZSA9IChzZWFyY2hUZXJtKSA9PiB7XG5cdFx0cmVmcy5zZWFyY2hBbGxCdG4uaHJlZiA9IGAke3dpbmRvdy53ZXpvbUNvbmZpZy5zZWFyY2h9P3E9JHtlbmNvZGVVUkkoc2VhcmNoVGVybSl9YDtcblx0XHQkLmFqYXgoe1xuXHRcdFx0bWV0aG9kOiAnUE9TVCcsXG5cdFx0XHR1cmw6IHdpbmRvdy53ZXpvbUNvbmZpZy5zZWFyY2hBdXRvY29tcGxldGUsXG5cdFx0XHRkYXRhOiB7XG5cdFx0XHRcdHF1ZXJ5OiBzZWFyY2hUZXJtXG5cdFx0XHR9XG5cdFx0fSkuZG9uZShyZXMgPT4ge1xuXHRcdFx0aWYgKHJlcy5zdWNjZXNzICYmIHJlcy5pdGVtc19tYXJrdXApIHtcblx0XHRcdFx0cmVmcy5ub3RGb3VuZFRleHQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblx0XHRcdFx0cmVmcy5pdGVtc0xpc3QuaW5uZXJIVE1MID0gcmVzLml0ZW1zX21hcmt1cDtcblx0XHRcdFx0cmVmcy5pdGVtc1dyYXAuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHJlZnMuaXRlbXNXcmFwLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cdFx0XHRyZWZzLm5vdEZvdW5kVGV4dC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblx0XHR9KS5mYWlsKGVyciA9PiB7XG5cdFx0XHRyZWZzLml0ZW1zV3JhcC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXHRcdFx0cmVmcy5ub3RGb3VuZFRleHQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cdFx0XHRjb25zb2xlLmVycm9yKGVyci5yZXNwb25zZVRleHQpO1xuXHRcdH0pO1xuXHR9O1xuXG5cdGNvbnN0IGhhbmRsZVNlYXJjaElucHV0ID0gKGUpID0+IHtcblx0XHRpZiAoIWUudGFyZ2V0LnZhbHVlKSB7XG5cdFx0XHRyZWZzLml0ZW1zV3JhcC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXHRcdFx0cmVmcy5ub3RGb3VuZFRleHQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3Qgc2VhcmNoVGVybSA9IGUudGFyZ2V0LnZhbHVlLnRyaW0oKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuXHRcdC8vIGNvbnNvbGUubG9nKHNlYXJjaFRlcm0ucmVwbGFjZSgvXlxcd1xccy9naSwgJycpKTtcblx0XHRpZiAoIXNlYXJjaFRlcm0pIHtcblx0XHRcdGUudGFyZ2V0LnZhbHVlID0gJyc7XG5cdFx0XHRyZWZzLml0ZW1zV3JhcC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXHRcdFx0cmVmcy5ub3RGb3VuZFRleHQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGhhbmRsZVNlYXJjaEF1dG9jb21wbGV0ZShzZWFyY2hUZXJtKTtcblx0fTtcblxuXHRyZWZzLnNlYXJjaElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZGVib3VuY2UoaGFuZGxlU2VhcmNoSW5wdXQsIDUwMCkpO1xuXG5cdGNvbnN0IGhhbmRsZUVzY0Nsb3NlID0gKGV2ZW50KSA9PiB7XG5cdFx0aWYgKGV2ZW50LmNvZGUgPT09ICdFc2NhcGUnKSB7XG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0aWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tZnAtcmVhZHknKSB8fCAhcmVmcy5tZW51LmNsYXNzTGlzdC5jb250YWlucygnaXMtaGlkZGVuJykpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBoYW5kbGVFc2NDbG9zZSk7XG5cdFx0XHRpZiAocmVmcy5zZWFyY2guY2xhc3NMaXN0LmNvbnRhaW5zKCdpcy1oaWRkZW4nKSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHR0b2dnbGVTZWFyY2goKTtcblx0XHR9XG5cdH07XG5cblx0Y29uc3QgaGFuZGxlSG90S2V5UHJlc3MgPSAoZXZlbnQpID0+IHtcblx0XHRpZiAoKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYgZXZlbnQuY29kZSA9PT0gJ0tleUsnKSB7XG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0aWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tZnAtcmVhZHknKSB8fCAhcmVmcy5tZW51LmNsYXNzTGlzdC5jb250YWlucygnaXMtaGlkZGVuJykpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBoYW5kbGVFc2NDbG9zZSk7XG5cdFx0XHR0b2dnbGVTZWFyY2goKTtcblx0XHR9XG5cdH07XG5cblx0Y29uc3QgdG9nZ2xlU2VhcmNoID0gKCkgPT4ge1xuXHRcdGNvbnN0IGlzU2VhcmNoT3BlbiA9IHJlZnMub3BlbkJ0bi5nZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnKSA9PT0gJ3RydWUnIHx8IGZhbHNlO1xuXG5cdFx0aWYgKCFpc1NlYXJjaE9wZW4pIHtcblx0XHRcdHJlZnMubm90Rm91bmRUZXh0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cdFx0XHQvLyBhZGQgY2xvc2Ugb24gRXNjXG5cdFx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGhhbmRsZUVzY0Nsb3NlKTtcblx0XHRcdHdpbmRvdy5zZXRUaW
100721lb3V0KCgpID0+IHtcblx0XHRcdFx0cmVmcy5zZWFyY2hJbnB1dC5mb2N1cygpO1xuXHRcdFx0XHRyZWZzLnNlYXJjaElucHV0LnNldFNlbGVjdGlvblJhbmdlKC0xLCAtMSk7XG5cdFx0XHR9LCAyMDApO1xuXG5cdFx0XHRpZiAocmVmcy5zZWFyY2hJbnB1dC52YWx1ZSkge1xuXHRcdFx0XHRoYW5kbGVTZWFyY2hBdXRvY29tcGxldGUocmVmcy5zZWFyY2hJbnB1dC52YWx1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gc2hvdy9oaWRlIHNlYXJjaFxuXHRcdHJlZnMub3BlbkJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAhaXNTZWFyY2hPcGVuKTtcblx0XHRyZWZzLnNlYXJjaC5jbGFzc0xpc3QudG9nZ2xlKCdpcy1oaWRkZW4nKTtcblxuXHRcdC8vIGxvY2svdW5sb2NrIHdpbmRvdyBzY3JvbGxcblx0XHR0b2dnbGVCb2R5U2Nyb2xsTG9jayghaXNTZWFyY2hPcGVuLCByZWZzLnNlYXJjaCk7XG5cdH07XG5cblx0cmVmcy5vcGVuQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdG9nZ2xlU2VhcmNoKTtcblxuXHRyZWZzLnNlYXJjaC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICh7IHRhcmdldCB9KSA9PiB7XG5cdFx0aWYgKHRhcmdldCAhPT0gcmVmcy5zZWFyY2ggJiYgdGFyZ2V0ICE9PSByZWZzLmNsb3NlQnRuKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRvZ2dsZVNlYXJjaCgpO1xuXHR9KTtcblxuXHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGhhbmRsZUhvdEtleVByZXNzKTtcbn1cbiIsIid1c2UgIHN0cmljdCc7XG5cbi8qKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgJ2N1c3RvbS1qcXVlcnktbWV0aG9kcy9mbi9nZXQtbXktZWxlbWVudHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY2xpY2tUcmlnZ2VyRm9yICgpIHtcblx0JChkb2N1bWVudCkub24oJ2NsaWNrJywgJ1tkYXRhLWNsaWNrLXRyaWdnZXItZm9yXScsIGZ1bmN0aW9uICgpIHtcblx0XHRjb25zdCAkdGhpcyA9ICQodGhpcyk7XG5cdFx0Y29uc3Qgc2VsZWN0b3IgPSAkdGhpcy5kYXRhKCdjbGljay10cmlnZ2VyLWZvcicpO1xuXHRcdGNvbnN0ICRmb3IgPSAkdGhpcy5nZXRNeUVsZW1lbnRzKCckZm9yJywgc2VsZWN0b3IpO1xuXHRcdCRmb3IuY2xpY2soKTtcblx0fSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICog0JzQvtC00YPQu9GMINC00LvRjyDRgNCw0LHQvtGC0Ysg0YEg0LrRg9C60LhcbiAqIEBtb2R1bGVcbiAqL1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQcml2YXRlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IHtcblx0ZW5jb2RlVVJJQ29tcG9uZW50OiBlbmNvZGVyLFxuXHRkZWNvZGVVUklDb21wb25lbnQ6IGRlY29kZXJcbn0gPSB3aW5kb3c7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFB1YmxpY1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqINCg0LDQsdC+0YLQsCDRgSBgZG9jdW1lbnQuY29va2llYFxuICogQG5hbWVzcGFjZSBjb29raWVEYXRhXG4gKiBAc291cmNlQ29kZVxuICovXG5jb25zdCBjb29raWVEYXRhID0ge1xuXHQvKipcblx0ICog0JTQvtCx0LDQstC70LXQvdC40LUg0LfQsNC/0LjRgdC4XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcblx0ICogQHBhcmFtIHsqfSB2YWx1ZVxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dXG5cdCAqIEBwYXJhbSB7RGF0ZXxudW1iZXJ8c3RyaW5nfSBbb3B0aW9ucy5leHBpcmVzXVxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMucGF0aF1cblx0ICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmRvbWFpbl1cblx0ICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5zZWN1cmVdXG5cdCAqIEBzZWUge0BsaW5rIGh0dHBzOi8vbGVhcm4uamF2YXNjcmlwdC5ydS9jb29raWUj0YTRg9C90LrRhtC40Y8tc2V0Y29va2llLW5hbWUtdmFsdWUtb3B0aW9uc31cblx0ICogQHNvdXJjZUNvZGVcblx0ICovXG5cdGFkZCAoa2V5LCB2YWx1ZSwgb3B0aW9ucyA9IHt9KSB7XG5cdFx0aWYgKCF0aGlzLmFsbG93VXNhZ2UgJiYgKGtleSAhPT0gdGhpcy5hbGxvd1VzYWdlS2V5KSkge1xuXHRcdFx0Y29uc29sZS53YXJuKCdDb29raWUgdXNhZ2UgaXMgZGlzYWxsb3dlZCEnKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0bGV0IGV4cGlyZXMgPSBvcHRpb25zLmV4cGlyZXM7XG5cblx0XHRpZiAodHlwZW9mIGV4cGlyZXMgPT09ICdudW1iZXInICYmIGV4cGlyZXMpIHtcblx0XHRcdGxldCBkID0gbmV3IERhdGUoKTtcblx0XHRcdGQuc2V0VGltZShkLmdldFRpbWUoKSArIGV4cGlyZXMgKiAxMDAwICogNjAgKiA2MCAqIDI0KTtcblx0XHRcdGV4cGlyZXMgPSBvcHRpb25zLmV4cGlyZXMgPSBkO1xuXHRcdH1cblxuXHRcdGlmIChleHBpcmVzICYmIGV4cGlyZXMudG9VVENTdHJpbmcpIHtcblx0XHRcdG9wdGlvbnMuZXhwaXJlcyA9IGV4cGlyZXMudG9VVENTdHJpbmcoKTtcblx0XHR9XG5cblx0XHR2YWx1ZSA9IGVuY29kZXIodmFsdWUpO1xuXHRcdGxldCB1cGRhdGVkQ29va2llID0gYCR7a2V5fT0ke3ZhbHVlfWA7XG5cblx0XHRmb3IgKGxldCBwcm9wTmFtZSBpbiBvcHRpb25zKSB7XG5cdFx0XHR1cGRhdGVkQ29va2llICs9IGA7ICR7cHJvcE5hbWV9YDtcblx0XHRcdGxldCBwcm9wVmFsdWUgPSBvcHRpb25zW3Byb3BOYW1lXTtcblx0XHRcdGlmIChwcm9wVmFsdWUgIT09IHRydWUpIHtcblx0XHRcdFx0dXBkYXRlZENvb2tpZSArPSBgPSR7cHJvcFZhbHVlfWA7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZG9jdW1lbnQuY29va2llID0gdXBkYXRlZENvb2tpZTtcblx0fSxcblxuXHQvKipcblx0ICog0J/QvtC70YPRh9C10L3QuNC1INC60YPQutC4INC/0L4g0LrQu9GO0YfRg1xuXHQgKiBAcGFyYW0ga2V5XG5cdCAqIEByZXR1cm4ge3N0cmluZ3x1bmRlZmluZWR9XG5cdCAqIEBzZWUge0BsaW5rIGh0dHBzOi8vbGVhcm4uamF2YXNjcmlwdC5ydS9jb29raWUj0YTRg9C90LrRhtC40Y8tZ2V0Y29va2llLW5hbWV9XG5cdCAqIEBzb3VyY2VDb2RlXG5cdCAqL1xuXHRyZWNlaXZlIChrZXkpIHtcblx0XHRsZXQgbWF0Y2hlcyA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKFxuXHRcdFx0YCg/Ol58OyApJHtrZXkucmVwbGFjZSgvKFtcXC4kPyp8e31cXChcXClcXFtcXF1cX
10072FxcXFwvXFwrXl0pL2csICdcXFxcJDEnKX09KFteO10qKWAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuXHRcdCkpO1xuXHRcdHJldHVybiBtYXRjaGVzID8gZGVjb2RlcihtYXRjaGVzWzFdKSA6IHVuZGVmaW5lZDtcblx0fSxcblxuXHQvKipcblx0ICog0KPQtNCw0LvQtdC90LjQtSDQutGD0LrQuCDQv9C+INC60LvRjtGH0YNcblx0ICogQHBhcmFtIHtzdHJpbmd9IGtleVxuXHQgKiBAc2VlIHtAbGluayBodHRwczovL2xlYXJuLmphdmFzY3JpcHQucnUvY29va2llI9GE0YPQvdC60YbQuNGPLWRlbGV0ZWNvb2tpZS1uYW1lfVxuXHQgKiBAc291cmNlQ29kZVxuXHQgKi9cblx0ZGVsZXRlIChrZXkpIHtcblx0XHR0aGlzLmFkZChrZXksICcnLCB7IGV4cGlyZXM6IC0xIH0pO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiDQl9Cw0LTQsNGC0Ywg0LLQvtC/0YDQvtGBINC+INC/0L7Qu9GM0LfQvtCy0LDRgtC10LvRjNGB0LrQvtC8INGB0L7Qs9C70LDRgdC40Lgg0LjRgdC/0L7Qu9GM0LfQsNCy0L3QuNGPINC60YPQutC4XG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59XG5cdCAqIEBzb3VyY2VDb2RlXG5cdCAqL1xuXHRhc2tVc2FnZSAoKSB7XG5cdFx0aWYgKHRoaXMuYWxsb3dVc2FnZSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHRoaXMuJGluZm9CbG9jayA9IHRoaXMuJGluZm9CbG9jayB8fCAkKCdbZGF0YS1jb29raWUtaW5mb10nKTtcblx0XHR0aGlzLiRpbmZvQnV0dG9uID0gdGhpcy4kaW5mb0J1dHRvbiB8fCAkKCdbZGF0YS1jb29raWUtc3VibWl0XScpO1xuXG5cdFx0aWYgKHRoaXMuJGluZm9CbG9jay5sZW5ndGggJiYgdGhpcy4kaW5mb0J1dHRvbi5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGhpZGRlbkNsYXNzID0gJ2lzLWhpZGRlbic7XG5cdFx0XHR0aGlzLiRpbmZvQnV0dG9uLm9uKCdjbGljaycsICgpID0+IHtcblx0XHRcdFx0dGhpcy4kaW5mb0Jsb2NrLmFkZENsYXNzKGhpZGRlbkNsYXNzKTtcblx0XHRcdFx0dGhpcy5hZGQodGhpcy5hbGxvd1VzYWdlS2V5LCB0aGlzLmFsbG93VXNhZ2VWYWx1ZSwgeyBleHBpcmVzOiAzNjUsIHBhdGg6ICcvJywgU2FtZVNpdGU6ICdOb25lJywgU2VjdXJlOiAnU2VjdXJlJyB9KTtcblx0XHRcdH0pO1xuXG5cdFx0XHR3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdHRoaXMuJGluZm9CbG9jay5yZW1vdmVDbGFzcyhoaWRkZW5DbGFzcyk7XG5cdFx0XHR9LCB0aGlzLmFsbG93VXNhZ2VEZWxheSk7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqINCf0YDQvtCy0LXRgNC60LAg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GM0YHQutC+0LPQviDRgdC+0LPQu9Cw0YHQuNGPXG5cdCAqINC90LAg0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40Y8g0YTQsNC50LvQvtCyIGNvb2tpZVxuXHQgKiBAcmV0dXJuIHtib29sZWFufVxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqIEBzb3VyY2VDb2RlXG5cdCAqL1xuXHRnZXQgYWxsb3dVc2FnZSAoKSB7XG5cdFx0cmV0dXJuIHRoaXMucmVjZWl2ZSh0aGlzLmFsbG93VXNhZ2VLZXkpID09PSB0aGlzLmFsbG93VXNhZ2VWYWx1ZTtcblx0fSxcblxuXHQvKipcblx0ICog0JrQu9GO0Ycg0L/RgNC+0LLQtdGA0LrQuCDQv9C+0LvRjNC30L7QstCw0YLQtdC70YzRgdC60L7Qs9C+INGB0L7Qs9C70LDRgdC40Y9cblx0ICog0L3QsCDQuNGB0L/QvtC70YzQt9C+0LLQsNC90LjRjyDRhNCw0LnQu9C+0LIgY29va2llXG5cdCAqIEB0eXBlIHtzdHJpbmd9XG5cdCAqIEBkZWZhdWx0ICdhbGxvdy1jb29raWUtdXNhZ2UnXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICogQHNvdXJjZUNvZGVcblx0ICovXG5cdGdldCBhbGxvd1VzYWdlS2V5ICgpIHtcblx0XHRyZXR1cm4gJ2FsbG93LWNvb2tpZS11c2FnZSc7XG5cdH0sXG5cblx0LyoqXG5cdCAqINCX0L3QsNGH0LXQvdC40LUg0LrQu9GO0YfQsCDQv9GA0L7QstC10YDQutC4INC/0L7Qu9GM0LfQvtCy0LDRgtC10LvRjNGB0LrQvtCz0L4g0YHQvtCz0LvQsNGB0LjRj1xuXHQgKiDQvdCwINC40YHQv9C+0LvRjNC30L7QstCw0L3QuNGPINGE0LDQudC70L7QsiBjb29raWVcblx0ICogQHR5cGUge3N0cmluZ31cblx0ICogQGRlZmF1bHQgJ3RydWUnXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICogQHNvdXJjZUNvZGVcblx0ICovXG5cdGdldCBhbGxvd1VzYWdlVmFsdWUgKCkge1xuXHRcdHJldHVybiAndHJ1ZSc7XG5cdH0sXG5cblx0LyoqXG5cdCAqINCX0LDQtNC10YDQttC60LAgKG1zKSDQtNC70Y8g0L/RgNC+0LLQtdGA0LrQuCDQv9C+0LvRjNC30L7QstCw0YLQtdC70YzRgdC60L7Qs9C+INGB0L7Qs9C70LDRgdC40Y9cblx0ICog0L3QsCDQuNGB0L/QvtC70YzQt9C+0LLQsNC90LjRjyDRhNCw0LnQu9C+0LIgY29va2llXG5cdCAqIEB0eXBlIHtudW1iZXJ9XG5cdCAqIEBkZWZhdWx0IDIwMDBcblx0ICogQHByb3RlY3RlZFxuXHQgKiBAc291cmNlQ29kZVxuXHQgKi9cblx0Z2V0IGFsbG93VXNhZ2VEZWxheSAoKSB7XG5cdFx0cmV0dXJuIDIwMDA7XG5cdH1cbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEV4cG9ydHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGRlZmF1bHQgY29va2llRGF0YTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vLXVzZWxlc3MtZXNjYXBlICovXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogRWNvbW1lcmNlIFRyYWNraW5nXG4gKiBAbW9kdWxlXG4gKi9cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSW1wb3J0c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jbGFzcyBFY29tbWVyY2VUcmFja2luZyB7XG5cdGNvbnN0cnVjdG9yICgpIHtcblx0XHR0aGlzLml0ZW1CcmFuZCA9ICfQo9C80LDQvdGM0L/QuNCy0L4nO1xuXHRcdHRoaXMuY3VycmVuY3kgPSAnVUFIJztcblx0fVxuXG5cdC8qKlxuXHQgKiBDbGVhciB0aGUgcHJldmlvdXMgZWNvbW1lcmNlIG9iamVjdC5cblx0ICovXG5cdGNsZWFyICgpIHtcblx0XHR3aW5kb3cuZGF0YUxheWVyLnB1c2goeyBlY29tbWVyY2U6IG51bGwgfSk7XG5cdH1cblxuXHR0cmFja0Zvcm1TdWJtaXQgKGV2ZW50KSB7XG5cdFx0d2luZG93LmRh
10072dGFMYXllci5wdXNoKHtcblx0XHRcdGV2ZW50XG5cdFx0fSk7XG5cdH1cblxuXHR0cmFja1ZpZXdJdGVtIChwcm9kdWN0RGF0YSkge1xuXHRcdGlmICghcHJvZHVjdERhdGEpIHJldHVybjtcblx0XHRwcm9kdWN0RGF0YS5pdGVtX2JyYW5kID0gdGhpcy5pdGVtQnJhbmQ7XG5cdFx0cHJvZHVjdERhdGEuY3VycmVuY3kgPSB0aGlzLmN1cnJlbmN5O1xuXHRcdHRoaXMuY2xlYXIoKTtcblx0XHR3aW5kb3cuZGF0YUxheWVyLnB1c2goe1xuXHRcdFx0ZXZlbnQ6ICd2aWV3X2l0ZW0nLFxuXHRcdFx0ZWNvbW1lcmNlOiB7XG5cdFx0XHRcdGl0ZW1zOiBbcHJvZHVjdERhdGFdXG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHR0cmFja0NhcnRJdGVtIChldmVudCwgcHJvZHVjdERhdGEsIHF1YW50aXR5ID0gMSkge1xuXHRcdGlmICghcHJvZHVjdERhdGEpIHJldHVybjtcblxuXHRcdGNvbnN0IGl0ZW1zID0gQXJyYXkuaXNBcnJheShwcm9kdWN0RGF0YSkgPyBwcm9kdWN0RGF0YSA6IFtwcm9kdWN0RGF0YV07XG5cdFx0bGV0IHZhbHVlID0gMDtcblxuXHRcdGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcblx0XHRcdGl0ZW0uaXRlbV9icmFuZCA9IHRoaXMuaXRlbUJyYW5kO1xuXHRcdFx0aXRlbS5xdWFudGl0eSA9IGl0ZW0ucXVhbnRpdHkgPyBwYXJzZUludChpdGVtLnF1YW50aXR5KSAqIHF1YW50aXR5IDogcXVhbnRpdHk7XG5cdFx0XHR2YWx1ZSArPSBpdGVtLnByaWNlICogaXRlbS5xdWFudGl0eTtcblx0XHR9KTtcblxuXHRcdHRoaXMuY2xlYXIoKTtcblxuXHRcdGNvbnN0IHB1c2hEYXRhID0ge1xuXHRcdFx0ZXZlbnQsXG5cdFx0XHRlY29tbWVyY2U6IHtcblx0XHRcdFx0dmFsdWUsXG5cdFx0XHRcdGN1cnJlbmN5OiB0aGlzLmN1cnJlbmN5LFxuXHRcdFx0XHRpdGVtc1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHR3aW5kb3cuZGF0YUxheWVyLnB1c2gocHVzaERhdGEpO1xuXHR9XG5cblx0dHJhY2tCZWdpbkNoZWNrb3V0IChhbW91bnQsIGl0ZW1zKSB7XG5cdFx0aWYgKCFhbW91bnQgfHwgIWl0ZW1zKSByZXR1cm47XG5cblx0XHQvLyBFbnN1cmUgaXRlbXMgaXMgYW4gYXJyYXlcblx0XHRjb25zdCBpdGVtc0FycmF5ID0gQXJyYXkuaXNBcnJheShpdGVtcykgPyBpdGVtcyA6IE9iamVjdC52YWx1ZXMoaXRlbXMpO1xuXG5cdFx0aWYgKCFpdGVtc0FycmF5Lmxlbmd0aCkgcmV0dXJuO1xuXG5cdFx0aXRlbXNBcnJheS5mb3JFYWNoKChpdGVtKSA9PiB7XG5cdFx0XHRpdGVtLml0ZW1fYnJhbmQgPSB0aGlzLml0ZW1CcmFuZDtcblx0XHR9KTtcblxuXHRcdHRoaXMuY2xlYXIoKTtcblxuXHRcdGNvbnN0IHB1c2hEYXRhID0ge1xuXHRcdFx0ZXZlbnQ6ICdiZWdpbl9jaGVja291dCcsXG5cdFx0XHRlY29tbWVyY2U6IHtcblx0XHRcdFx0dmFsdWU6IHBhcnNlRmxvYXQoYW1vdW50KSxcblx0XHRcdFx0Y3VycmVuY3k6IHRoaXMuY3VycmVuY3ksXG5cdFx0XHRcdGl0ZW1zOiBpdGVtc0FycmF5XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHdpbmRvdy5kYXRhTGF5ZXIucHVzaChwdXNoRGF0YSk7XG5cdH1cblxuXHR0cmFja1B1cmNoYXNlIChvcmRlcikge1xuXHRcdGlmICghb3JkZXIpIHJldHVybjtcblxuXHRcdGNvbnN0IHsgb3JkZXJfaWQ6IG9yZGVySWQsIGFtb3VudCwgZGVsaXZlcnlfdHlwZTogZGVsaXZlcnlUeXBlLCBjb3Vwb24gPSBudWxsLCBpdGVtcyB9ID0gb3JkZXI7XG5cblx0XHRpZiAoIWl0ZW1zKSByZXR1cm47XG5cblx0XHQvLyBFbnN1cmUgaXRlbXMgaXMgYW4gYXJyYXlcblx0XHRjb25zdCBpdGVtc0FycmF5ID0gQXJyYXkuaXNBcnJheShpdGVtcykgPyBpdGVtcyA6IE9iamVjdC52YWx1ZXMoaXRlbXMpO1xuXG5cdFx0aWYgKCFpdGVtc0FycmF5Lmxlbmd0aCkgcmV0dXJuO1xuXG5cdFx0aXRlbXNBcnJheS5mb3JFYWNoKChpdGVtKSA9PiB7XG5cdFx0XHRpdGVtLml0ZW1fYnJhbmQgPSB0aGlzLml0ZW1CcmFuZDtcblx0XHR9KTtcblxuXHRcdHRoaXMuY2xlYXIoKTtcblxuXHRcdGNvbnN0IHB1c2hEYXRhID0ge1xuXHRcdFx0ZXZlbnQ6ICdwdXJjaGFzZScsXG5cdFx0XHRlY29tbWVyY2U6IHtcblx0XHRcdFx0dHJhbnNhY3Rpb25faWQ6IG9yZGVySWQsXG5cdFx0XHRcdHZhbHVlOiBwYXJzZUZsb2F0KGFtb3VudCksXG5cdFx0XHRcdGN1cnJlbmN5OiB0aGlzLmN1cnJlbmN5LFxuXHRcdFx0XHRkZWxpdmVyeV90eXBlOiBkZWxpdmVyeVR5cGUsXG5cdFx0XHRcdGl0ZW1zOiBpdGVtc0FycmF5XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdGlmIChjb3Vwb24pIHtcblx0XHRcdHB1c2hEYXRhLmVjb21tZXJjZS5jb3Vwb24gPSBjb3Vwb247XG5cdFx0fVxuXG5cdFx0d2luZG93LmRhdGFMYXllci5wdXNoKHB1c2hEYXRhKTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgRWNvbW1lcmNlVHJhY2tpbmcoKTtcbiIsIi8vIGxpc3Qgb2YgZWxlbWVudHNcbmNvbnN0IGVxdWFsSGVpZ2h0c0VsZW1lbnRzID0gW1xuXHQnLnNsaWRlci1wcm9kdWN0cyAuc2xpZGVyLXJldmlld3NfX2l0ZW1fX25hbWUnXG5dO1xuXG5jbGFzcyBFcXVhbEhlaWdodCB7XG5cdGluaXQgKCkge1xuXHRcdGVxdWFsSGVpZ2h0c0VsZW1lbnRzLmZvckVhY2goKGl0ZW0pID0+IHtcblx0XHRcdC8vIGNvbnNvbGUubG9nKGl0ZW0pO1xuXHRcdFx0Y29uc3QgaXRlbUVsZW1lbnQgPSAkKGl0ZW0pO1xuXHRcdFx0aWYgKGl0ZW1FbGVtZW50Lmxlbmd0aCkge1xuXHRcdFx0XHRpdGVtRWxlbWVudC5lcXVhbEhlaWdodHMoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgRXF1YWxIZWlnaHQoKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKlxuICogQG1vZHVsZVxuICovXG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEltcG9ydHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuaW1wb3J0IE1vZGVybml6ciBmcm9tICdtb2Rlcm5penInO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQdWJsaWNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5leHBvcnQgY29uc3Qgc2VsZWN0b3IgPSAnLmpzLWxhenlsb2FkJztcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ3xOb2RlTGlzdH0gc2VsZWN0b3JPck5vZGVMaXN0XG4gKiBAcHJvcGVydHkge3NlbGVjdG9yfVxuICogQHJldHVybi
10072B7UHJvbWlzZTxhbnk+fVxuICovXG5leHBvcnQgZnVuY3Rpb24gbGF6eWxvYWQgKHNlbGVjdG9yT3JOb2RlTGlzdCA9IHNlbGVjdG9yLCBvcHRpb24pIHtcblx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRjb25zdCBfaW5pdGlhbGl6ZSA9ICh7IGRlZmF1bHQ6IHp6TG9hZCB9KSA9PiB7XG5cdFx0XHRyZXNvbHZlKHp6TG9hZChzZWxlY3Rvck9yTm9kZUxpc3QsIG9wdGlvbikpO1xuXHRcdH07XG5cblx0XHRpZiAoTW9kZXJuaXpyLmludGVyc2VjdGlvbm9ic2VydmVyKSB7XG5cdFx0XHRpbXBvcnQoJ3p6LWxvYWQnKS50aGVuKF9pbml0aWFsaXplKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aW1wb3J0KCdpbnRlcnNlY3Rpb24tb2JzZXJ2ZXInKS50aGVuKCgpID0+IHtcblx0XHRcdFx0aW1wb3J0KCd6ei1sb2FkJykudGhlbihfaW5pdGlhbGl6ZSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgeyBkaXNhYmxlQm9keVNjcm9sbCwgZW5hYmxlQm9keVNjcm9sbCB9IGZyb20gJ2JvZHktc2Nyb2xsLWxvY2snO1xuXG5leHBvcnQgY29uc3QgcmVmcyA9IHtcblx0Ym9keTogZG9jdW1lbnQuYm9keSxcblx0Zml4ZWRFbGVtZW50czogZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtZml4ZWRdJyksXG5cdG1lbnU6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1tYWluLW1lbnUnKSxcblx0b3BlbkJ0bjogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmpzLW1haW4tbWVudS1vcGVuJyksXG5cdGNsb3NlQnRuOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtbWFpbi1tZW51LWNsb3NlJyksXG5cdG9wZW5Nb2JpbGVCdG46IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1tYWluLW1vYmlsZS1tZW51LW9wZW4nKSxcbn07XG5cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHdpZHRoIG9mIHRoZSBicm93c2VyJ3Mgc2Nyb2xsYmFyLlxuICogQHJldHVybnMge251bWJlcn0gVGhlIHdpZHRoIG9mIHRoZSBzY3JvbGxiYXIgaW4gcGl4ZWxzLlxuICovXG5leHBvcnQgY29uc3QgZ2V0QnJ3b3NlclNjcm9sbGJhcldpZHRoID0gKCkgPT4ge1xuXHRyZXR1cm4gd2luZG93LmlubmVyV2lkdGggLSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7XG59O1xuXG5leHBvcnQgY29uc3QgaXNJT1MgPSAoKSA9PiB7XG5cdHJldHVybiAoJ29udG91Y2hzdGFydCcgaW4gd2luZG93KSB8fCAobmF2aWdhdG9yLk1heFRvdWNoUG9pbnRzID4gMCkgfHwgKG5hdmlnYXRvci5tc01heFRvdWNoUG9pbnRzID4gMCk7XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIHJpZ2h0IG9mZnNldCB2YWx1ZSBmb3IgYSBmaXhlZCBlbGVtZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXQgYXMgdGhlIHJpZ2h0IG9mZnNldC5cbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZUZpeGVkRWxlbWVudHNPZmZzZXQgPSAodmFsdWUpID0+IHtcblx0cmVmcy5maXhlZEVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG5cdFx0ZWxlbWVudC5zdHlsZS5wYWRkaW5nUmlnaHQgPSB2YWx1ZTtcblx0fSk7XG59O1xuXG4vKipcbiAqIFRvZ2dsZXMgdGhlIGJvZHkgc2Nyb2xsIGxvY2sgb24gb3Igb2ZmIHdpdGhvdXQgYnJlYWtpbmcgc2Nyb2xsaW5nIG9mIGEgc3BlY2lmaWMgdGFyZ2V0IGVsZW1lbnQuXG4gKiBBbHNvIGFkanVzdHMgdGhlIGJvZHkgYW5kIGZpeGVkIGhlYWRlciBvZmZzZXRzIGFjY29yZGluZ2x5LlxuICogQHBhcmFtIHtib29sZWFufSBvbiAtIFdoZXRoZXIgdG8gZW5hYmxlIG9y
10072IGRpc2FibGUgdGhlIHNjcm9sbCBsb2NrLlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gdGFyZ2V0UmVmIC0gVGhlIHJlZmVyZW5jZSB0byB0aGUgdGFyZ2V0IGVsZW1lbnQgdGhhdCB5b3Ugd2FudCB0byBwZXJzaXN0IHNjcm9sbGluZyBmb3IgKHN1Y2ggYXMgYSBtb2RhbC9saWdodGJveC9mbHlvdXQvbmF2KS5cbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZUJvZHlTY3JvbGxMb2NrID0gKG9uLCB0YXJnZXRSZWYpID0+IHtcblx0Ly8gZml4IGJvZHkgJiBmaXhlZCBoZWFkZXIgb2Zmc2V0c1xuXHRjb25zdCBzY3JvbGxCYXJXaWR0aCA9IG9uID8gYCR7Z2V0QnJ3b3NlclNjcm9sbGJhcldpZHRoKCl9cHhgIDogMDtcblx0cmVmcy5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9IHNjcm9sbEJhcldpZHRoO1xuXHR0b2dnbGVGaXhlZEVsZW1lbnRzT2Zmc2V0KHNjcm9sbEJhcldpZHRoKTtcblxuXHQvLyBsb2NrL3VubG9jayB3aW5kb3cgc2Nyb2xsXG5cdGlmICghaXNJT1MoKSkge1xuXHRcdG9uID8gZGlzYWJsZUJvZHlTY3JvbGwodGFyZ2V0UmVmKSA6IGVuYWJsZUJvZHlTY3JvbGwodGFyZ2V0UmVmKTtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gb24gPyAnaGlkZGVuJyA6ICcnO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG5cdGlmICghcmVmcy5vcGVuQnRuKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgaGFuZGxlRXNjQ2xvc2UgPSAoZXZlbnQpID0+IHtcblx0XHRpZiAoZXZlbnQuY29kZSA9PT0gJ0VzY2FwZScpIHtcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGhhbmRsZUVzY0Nsb3NlKTtcblx0XHRcdGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtbWFpbi1tZW51JykuY2xhc3NMaXN0LmNvbnRhaW5zKCdpcy1oaWRkZW4nKSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHR0b2dnbGVNZW51KCk7XG5cdFx0fVxuXHR9O1xuXG5cdGNvbnN0IHRvZ2dsZU1lbnUgPSAoKSA9PiB7XG5cdFx0Y29uc3QgaXNNZW51T3BlbiA9IHJlZnMub3BlbkJ0bi5nZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnKSA9PT0gJ3RydWUnIHx8IGZhbHNlO1xuXG5cdFx0Ly8gc2hvdy9oaWRlIG1lbnVcblx0XHRyZWZzLm9wZW5CdG4uc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgIWlzTWVudU9wZW4pO1xuXHRcdHJlZnMubWVudS5jbGFzc0xpc3QudG9nZ2xlKCdpcy1oaWRkZW4nKTtcblxuXHRcdC8vIGxvY2svdW5sb2NrIHdpbmRvdyBzY3JvbGxcblx0XHR0b2dnbGVCb2R5U2Nyb2xsTG9jayghaXNNZW51T3BlbiwgcmVmcy5tZW51LnF1ZXJ5U2VsZWN0b3IoJy5tYWluLW1lbnVfX2JvZHknKSk7XG5cblx0XHQvLyBhZGQgY2xvc2Ugb24gRXNjXG5cdFx0IWlzTWVudU9wZW4gJiYgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBoYW5kbGVFc2NDbG9zZSk7XG5cdH07XG5cblx0cmVmcy5vcGVuQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdG9nZ2xlTWVudSk7XG5cdGlmIChyZWZzLm9wZW5Nb2JpbGVCdG4pIHtcblx0XHRyZWZzLm9wZW5Nb2JpbGVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0b2dnbGVNZW51KTtcblx0fVxuXHRyZWZzLm1lbnUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoeyB0YXJnZXQgfSkgPT4ge1xuXHRcdGlmICh0YXJnZXQgIT09IHJlZnMubWVudSAmJiB0YXJnZXQgIT09IHJlZnMuY2xvc2VCdG4pIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dG9nZ2xlTWVudSgpO1xuXHR9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAbW9kdWxlXG4gKi9cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSW1wb3J0c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5pbXBvcnQgTW9kZXJuaXpyIGZyb20gJ21vZGVybml6cic7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFB1YmxpY1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5Nb2Rlcm5penIuYWRkVGVzdCgnZWRnZScsICgvIGVkZ2VcXC8vaS50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KSkpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBtb2R1bGVcbiAqL1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBJbXBvcnRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmltcG9ydCBNb2Rlcm5penIgZnJvbSAnbW9kZXJuaXpyJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUHVibGljXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbk1vZGVybml6ci5hZGRUZXN0KCdpbnRlcnNlY3Rpb25vYnNlcnZlcicsICdJbnRlcnNlY3Rpb25PYnNlcnZlcicgaW4gd2luZG93KTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiDQmtCw0YHRgtC+0LzQvdGL0LUg0YLQtdGB0YLRiyDQtNC70Y8gTW9kZXJuaXpyXG4gKiBAbW9kdWxlXG4gKiBAYXV0aG9yIE9sZWcgRHV0Y2hlbmtvIDxkdXRjaGVua28uby5kZXZAZ21haWwuY29tPlxuICogQHZlcnNpb24gMS4wLjBcbiAqL1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBJbXBvcnRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmltcG9ydCBNb2Rlcm5penIgZnJvbSAnbW9kZXJuaXpyJztcbmltcG9ydCAnLi9jdXN0b20tdGVzdHMvaW50ZXJzZWN0aW9uLW9ic2VydmVyJztcbmltcG9ydCAnLi9jdXN0b20tdGVzdHMvZWRnZSc7XG4vLyBpbXBvcnQgJy4vY3VzdG9tLXRlc3RzL21peC1ibGVuZC1tb2RlJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUHVibGljXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbndpbmRvdy5Nb2Rlcm5penIgPSBNb2Rlcm5penI7XG4iLCJpbXBvcnQgbm9VaVNsaWRlciBmcm9tICdub3Vpc2xpZGVyJztcclxuaW1wb3J0IG51bWVyYWwgZnJvbSAnbnVtZXJhbCc7XHJcblxyXG5jb25zdCAkID0gd2luZG93LmpRdWVyeTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIHtcclxuXHRjb25zdHJ1Y3RvciAoKSB7XHJcblx0XHR0aGlzLmRhdGEgPSB7XHJcblx0XHRcdGVsbXM6IHtcclxuXHRcdFx0XHRmaWx0ZXJQYXJlbnQ6ICcjcHJvZHVjdC1maWx0ZXInLFxyXG5cdFx0XHRcdHNsaWRlckVsbTogJyNwcm9kdWN0LWZ
10072pbHRlcl9fcHJpY2Utc2xpZGVyJyxcclxuXHRcdFx0XHRtaW5FbG06ICcjcHJvZHVjdC1maWx0ZXJfX3ByaWNlLW1pbicsXHJcblx0XHRcdFx0bWF4RWxtOiAnI3Byb2R1Y3QtZmlsdGVyX19wcmljZS1tYXgnXHJcblx0XHRcdH0sXHJcblx0XHRcdHZhbHVlczoge1xyXG5cdFx0XHRcdG1pbjogMCxcclxuXHRcdFx0XHRtYXg6IDAsXHJcblx0XHRcdFx0Y3VycmVudE1pbjogMCxcclxuXHRcdFx0XHRjdXJyZW50TWF4OiAwXHJcblx0XHRcdH0sXHJcblx0XHRcdGRlY2ltYWxzOiAyXHJcblx0XHR9O1xyXG5cdH1cclxuXHJcblx0aW5pdCAoKSB7XHJcblx0XHRpZiAodGhpcy5pc0VuYWJsZWQoKSkge1xyXG5cdFx0XHR0aGlzLnByZXBhcmVWYWx1ZXMoKTtcclxuXHRcdFx0dGhpcy5iaW5kKCk7XHJcblx0XHRcdHRoaXMuaW5pdFNsaWRlcigpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0aXNFbmFibGVkICgpIHtcclxuXHRcdHJldHVybiAkKHRoaXMuZGF0YS5lbG1zLmZpbHRlclBhcmVudCkubGVuZ3RoO1xyXG5cdH1cclxuXHJcblx0cHJlcGFyZVZhbHVlcyAoKSB7XHJcblx0XHRjb25zdCBfdCA9IHRoaXM7XHJcblx0XHRjb25zdCBfZSA9IF90LmRhdGEuZWxtcztcclxuXHRcdGNvbnN0IF92ID0gX3QuZGF0YS52YWx1ZXM7XHJcblx0XHQvLyBFbG1zXHJcblx0XHRjb25zdCBzbGlkZXIgPSAkKF9lLnNsaWRlckVsbSk7XHJcblx0XHRjb25zdCBtaW5WYWx1ZSA9ICQoX2UubWluRWxtKTtcclxuXHRcdGNvbnN0IG1heFZhbHVlID0gJChfZS5tYXhFbG0pO1xyXG5cdFx0Ly8gVmFsdWVzXHJcblx0XHRfdi5taW4gPSBOdW1iZXIoc2xpZGVyLmRhdGEoJ21pbicpKTtcclxuXHRcdF92Lm1heCA9IE51bWJlcihzbGlkZXIuZGF0YSgnbWF4JykpO1xyXG5cdFx0X3YuY3VycmVudE1pbiA9IE51bWJlcihtaW5WYWx1ZS52YWwoKSk7XHJcblx0XHRfdi5jdXJyZW50TWF4ID0gTnVtYmVyKG1heFZhbHVlLnZhbCgpKTtcclxuXHR9XHJcblxyXG5cdGluaXRTbGlkZXIgKCkge1xyXG5cdFx0Y29uc3QgX3QgPSB0aGlzO1xyXG5cdFx0Y29uc3QgX2UgPSBfdC5kYXRhLmVsbXM7XHJcblx0XHRjb25zdCBfdiA9IF90LmRhdGEudmFsdWVzO1xyXG5cdFx0bGV0IG1pbiA9IHBhcnNlRmxvYXQoX3YubWluKTtcclxuXHRcdGxldCBtYXggPSBwYXJzZUZsb2F0KF92Lm1heCk7XHJcblx0XHRsZXQgbWluU3RhcnQgPSBwYXJzZUZsb2F0KF92LmN1cnJlbnRNaW4pO1xyXG5cdFx0bGV0IG1heFN0YXJ0ID0gcGFyc2VGbG9hdChfdi5jdXJyZW50TWF4KTtcclxuXHRcdGxldCBkZWNpbWFscyA9IDA7XHJcblx0XHRsZXQgZm9ybWF0U2xpZGU7XHJcblxyXG5cdFx0Ly8gRGVjaW1hbFxyXG5cdFx0aWYgKCgvXFwuLy50ZXN0KG1pbikgfHwgL1xcLi8udGVzdChtYXgpKSkge1xyXG5cdFx0XHRkZWNpbWFscyA9IE1hdGgubWF4KFxyXG5cdFx0XHRcdG1pbi50b1N0cmluZygpLnJlcGxhY2UoL15cXGQrKFxcLnwkKS8sICcnKS5sZW5ndGgsXHJcblx0XHRcdFx0bWF4LnRvU3RyaW5nKCkucmVwbGFjZSgvXlxcZCsoXFwufCQpLywgJycpLmxlbmd0aFxyXG5cdFx0XHQpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChkZWNpbWFscyA+IDIpIHtcclxuXHRcdFx0ZGVjaW1hbHMgPSAyO1xyXG5cdFx0fVxyXG5cclxuXHRcdGZvcm1hdFNsaWRlID0ge1xyXG5cdFx0XHR0bzogZnVuY3Rpb24gKHYsIGgsIHIpIHtcclxuXHRcdFx0XHRsZXQgZm9ybWF0ID0gJygwJztcclxuXHRcdFx0XHRpZiAodiA8IDEwMCAmJi
10072BkZWNpbWFscykge1xyXG5cdFx0XHRcdFx0Zm9ybWF0ICs9ICcuJyArICcwJy5yZXBlYXQoZGVjaW1hbHMpO1xyXG5cdFx0XHRcdH0gZWxzZSBpZiAodiA+IDEwMDApIHtcclxuXHRcdFx0XHRcdGZvcm1hdCArPSAnLjAnO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRmb3JtYXQgKz0gJyBhKSc7XHJcblxyXG5cdFx0XHRcdHJldHVybiAodiA+IDEwMDAgPyBudW1lcmFsKHYpLmZvcm1hdChmb3JtYXQpIDogdi50b0ZpeGVkKGRlY2ltYWxzKSk7XHJcblx0XHRcdH0sXHJcblx0XHRcdGZyb206IGZ1bmN0aW9uICh2KSB7XHJcblx0XHRcdFx0cmV0dXJuIHY7XHJcblx0XHRcdH1cclxuXHRcdH07XHJcblxyXG5cdFx0bGV0IHNsaWRlck9wdGlvbnMgPSB7XHJcblx0XHRcdGFuaW1hdGU6IGZhbHNlLFxyXG5cdFx0XHRiZWhhdmlvdXI6ICdzbmFwJyxcclxuXHRcdFx0Y29ubmVjdDogdHJ1ZSxcclxuXHRcdFx0Zm9ybWF0OiBmb3JtYXRTbGlkZSxcclxuXHRcdFx0Y3NzUHJlZml4OiAncHJvZHVjdHMtc2xpZGVyX19ub1VpLScsXHJcblx0XHRcdHN0YXJ0OiBbbWluU3RhcnQsIG1heFN0YXJ0XSxcclxuXHRcdFx0cmFuZ2U6IHtcclxuXHRcdFx0XHQnbWluJzogbWluLFxyXG5cdFx0XHRcdCdtYXgnOiBtYXhcclxuXHRcdFx0fSxcclxuXHRcdFx0cGlwczoge1xyXG5cdFx0XHRcdG1vZGU6ICdyYW5nZScsXHJcblx0XHRcdFx0ZGVuc2l0eTogNFxyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cclxuXHRcdC8vIENyZWF0ZSwgVXBkYXRlXHJcblx0XHRjb25zdCBzbGlkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChfZS5zbGlkZXJFbG0uc3Vic3RyaW5nKDEpKTtcclxuXHJcblx0XHRpZiAoc2xpZGVyLmhhc093blByb3BlcnR5KCdub1VpU2xpZGVyJykpIHtcclxuXHRcdFx0c2xpZGVyLm5vVWlTbGlkZXIudXBkYXRlT3B0aW9ucyhzbGlkZXJPcHRpb25zLCBmYWxzZSk7XHJcblxyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH1cclxuXHJcblx0XHRub1VpU2xpZGVyLmNyZWF0ZShzbGlkZXIsIHNsaWRlck9wdGlvbnMpO1xyXG5cclxuXHRcdHNsaWRlci5ub1VpU2xpZGVyLm9uKCd1cGRhdGUnLCBmdW5jdGlvbiAoZm9ybWF0dGVkLCBoYW5kbGUsIHZhbHVlcywgdGFwLCBwb3NpdGlvbnMsIHNsaWRlck9iaikge1xyXG5cdFx0XHRfdi5jdXJyZW50TWluID0gdmFsdWVzWzBdLnRvRml4ZWQoX3QuZGF0YS5kZWNpbWFscyk7XHJcblx0XHRcdF92LmN1cnJlbnRNYXggPSB2YWx1ZXNbMV0udG9GaXhlZChfdC5kYXRhLmRlY2ltYWxzKTtcclxuXHRcdFx0X3Quc2V0VmFsdWVzKCk7XHJcblx0XHR9KTtcclxuXHJcblx0XHRzbGlkZXIubm9VaVNsaWRlci5vbignc2V0JywgZnVuY3Rpb24gKGZvcm1hdHRlZCwgaGFuZGxlLCB2YWx1ZXMsIHRhcCwgcG9zaXRpb25zLCBzbGlkZXJPYmopIHtcclxuXHRcdFx0X3YuY3VycmVudE1pbiA9IHZhbHVlc1swXS50b0ZpeGVkKF90LmRhdGEuZGVjaW1hbHMpO1xyXG5cdFx0XHRfdi5jdXJyZW50TWF4ID0gdmFsdWVzWzFdLnRvRml4ZWQoX3QuZGF0YS5kZWNpbWFscyk7XHJcblx0XHRcdF90LnNldFZhbHVlcygpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRiaW5kICgpIHtcclxuXHRcdGNvbnN0IF90ID0gdGhpcztcclxuXHRcdGNvbnN0IF9lID0gX3QuZGF0YS5lbG1zO1xyXG5cdFx0Y29uc3QgX3YgPSBfdC5kYXRhLnZhbHVlcztcclxuXHJcblx0XHQkKGRvY3VtZW50KS5vbignY2hhbmdlJywgX2UubWluRWxtLCBmdW5jdGlvbiAoZSkge1xyXG5cdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdF92LmN1cnJlbnRNaW4gPSBwYXJzZUZsb2F0KCQodGhpcykudmFsKCkpLnRvRml4ZWQoX3QuZGF0YS5kZWNpbWFscyk7XHJcblx0XHRcdF90LnNldFNpbGRlcigpO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0JChkb2N1bWVudCkub24oJ2NoYW5nZScsIF9lLm1heEVsbSwgZnVuY3Rpb24gKGUpIHtcclxuXHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRfdi5jdXJyZW50TWF4ID0gcGFyc2VGbG9hdCgkKHRoaXMpLnZhbCgpKS50b0ZpeGVkKF90LmRhdGEuZGVjaW1hbHMpO1xyXG5cdFx0XHRfdC5zZXRTaWxkZXIoKTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0c2V0U2lsZGVyICgpIHtcclxuXHRcdGNvbnN0IHNsaWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGF0YS5lbG1zLnNsaWRlckVsbS5zdWJzdHJpbmcoMSkpO1xyXG5cdFx0c2xpZGVyLm5vVWlTbGlkZXIuc2V0KFt0aGlzLmRhdGEudmFsdWVzLmN1cnJlbnRNaW4sIHRoaXMuZGF0YS52YWx1ZXMuY3VycmVudE1heF0pO1xyXG5cdH1cclxuXHJcblx0c2V0VmFsdWVzICgpIHtcclxuXHRcdGNvbnN0IF90ID0gdGhpcztcclxuXHRcdGNvbnN0IF9lID0gX3QuZGF0YS5lbG1zO1xyXG5cdFx0Y29uc3QgX3YgPSBfdC5kYXRhLnZhbHVlcztcclxuXHJcblx0XHRsZXQgbWluVmFsdWUgPSAoTWF0aC5yb3VuZChwYXJzZUZsb2F0KF92LmN1cnJlbnRNaW4pICogMTAwKSAvIDEwMCkudG9GaXhlZChfdC5kYXRhLmRlY2ltYWxzKTtcclxuXHRcdGlmIChtaW5WYWx1ZSA8IF92Lm1pbikge1xyXG5cdFx0XHRtaW5WYWx1ZSA9IF92Lm1pbjtcclxuXHRcdH1cclxuXHRcdCQoX2UubWluRWxtKS52YWwobWluVmFsdWUpO1xyXG5cclxuXHRcdGxldCBtYXhWYWx1ZSA9IChNYXRoLnJvdW5kKHBhcnNlRmxvYXQoX3YuY3VycmVudE1heCkgKiAxMDApIC8gMTAwKS50b0ZpeGVkKF90LmRhdGEuZGVjaW1hbHMpO1xyXG5cdFx0aWYgKG1heFZhbHVlID4gX3YubWF4KSB7XHJcblx0XHRcdG1heFZhbHVlID0gX3YubWF4O1xyXG5cdFx0fVxyXG5cdFx0JChfZS5tYXhFbG0pLnZhbChtYXhWYWx1ZSk7XHJcblx0fVxyXG59O1xyXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBuby11c2VsZXNzLWVzY2FwZSAqL1xuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFVUTSBUUkFDS0lOR1xuICogQG1vZHVsZVxuICovXG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEltcG9ydHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmltcG9ydCBjb29raWVEYXRhIGZyb20gJy4vY29va2llLWRhdGEnO1xuXG5jbGFzcyBVdG1UcmFja2luZyB7XG5cdGNvbnN0cnVjdG9yICgpIHtcblx0XHQvLyBHZXQgdGhlIFVSTCBwYXJhbWV0ZXJzIHZhcmlhYmxlIGJ5IFVUTSBuYW1lc1xuXHRcdHRoaXMuc291cmNlID0gdGhpcy5nZXRQYXJhbWV0ZXJCeU5hbWUoJ3V0bV9zb3VyY2UnKTtcblx0XHR0aGlzLm1lZGl1bSA9IHRoaXMuZ2V0UGFyYW1ldGVyQnlOYW1lKCd1dG1fbWVkaXVtJyk7XG5cdFx0dGhpcy5jYW1wYWlnbiA9IHRoaXMuZ2V0UGFyYW1ldGVyQnlOYW1lKCd1dG1fY2FtcGFpZ24nKTtcblx0XHR0aGlzLmNvbnRlbnQgPSB0aGlzLmdldFBhcmFtZXRlckJ5TmFtZSgndXRtX2NvbnRlbnQnKTtcblx0XHR0aGlzLnRlcm0gPSB0aGlzLmdldFBhcmFtZXRlckJ5TmFtZSgndXRtX3Rlcm0nKTtcblx0fVxuXG5cdGluaXQgKCkge1xuXHRcdC8vIERvIHRoZSBTZXQgVVRNIGZ1bmN0aW9uIGZvciBlYWNoIFVUTVxuXHRcdHRoaXMuc2V0VXRtKCd1dG1fc291cmNlJywgdGhpcy5zb3VyY2UpO1xuXHRcdHRoaXMuc2V0VXRtKCd1dG1fbWVkaXVtJywgdGhpcy5tZWRpdW0pO1xuXHRcdHRoaXMuc2V0VXRtKCd1dG1fY2FtcGFpZ24nLCB0aGlzLmNhbXBhaWduKTtcblx0XHR0aGlzLnNldFV0bSgndXRtX2NvbnRlbnQnLCB0aGlzLmNvbnRlbnQpO1xuXHRcdHRoaXMuc2V0VXRtKCd1dG1fdGVybScsIHRoaXMudGVybSk7XG5cdH1cblxuXHQvLyBQYXJzZSB0aGUgVVJMXG5cdGdldFBhcmFtZXRlckJ5TmFtZSAobmFtZSkge1xuXHRcdG5hbW
10072UgPSBuYW1lLnJlcGxhY2UoL1tcXFtdLywgJ1xcWycpLnJlcGxhY2UoL1tcXF1dLywgJ1xcXScpO1xuXHRcdGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cCgnW1xcPyZdJyArIG5hbWUgKyAnPShbXiYjXSopJyk7XG5cdFx0Y29uc3QgcmVzdWx0cyA9IHJlZ2V4LmV4ZWMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG5cdFx0cmV0dXJuIHJlc3VsdHMgPT09IG51bGwgPyAnJyA6IGRlY29kZVVSSUNvbXBvbmVudChyZXN1bHRzWzFdLnJlcGxhY2UoL1xcKy9nLCAnICcpKTtcblx0fVxuXG5cdC8vIFNldCBVVE0gZnVuY3Rpb25cblx0c2V0VXRtICh1dG1QYXJhbSwgdXRtVmFsKSB7XG5cdFx0aWYgKHV0bVZhbCA9PT0gJycpIHtcblx0XHRcdHJldHVybjtcblx0XHR9O1xuXHRcdC8vIFRPRE86IGRldGVybWluZSB0aGUgbWF4IGV4cGlyaW5nIHRpbWUgb3IgY2xlYXIgYWZ0ZXIgb3JkZXJpbmdcblx0XHRjb29raWVEYXRhLmFkZCh1dG1QYXJhbSwgdXRtVmFsLCB7IGV4cGlyZXM6IDM2NSwgcGF0aDogJy8nLCBTYW1lU2l0ZTogJ05vbmUnLCBTZWN1cmU6ICdTZWN1cmUnIH0pO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBVdG1UcmFja2luZygpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBtb2R1bGVcbiAqL1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBJbXBvcnRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmltcG9ydCAnbWRuLXBvbHlmaWxscy9zcmMvT2JqZWN0LmFzc2lnbic7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICog0J/QvtC70LjRhNC40Lsg0LTQu9GPIElFLCBFZGdlINC4INC00YDRg9Cz0LjRhSDQsdGA0LDRg9C30LXRgNC+0LJcbiAqINC60L7RgtC+0YDRi9C1INC90LUg0LjQvNC10Y7RgiDQvdCw0YLQuNCy0L3Rg9GOINC/0L7QtNC00LXRgNC20LrRgyBQcm9taXNlXG4gKiBAc2VlIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9lczYtcHJvbWlzZS1wb2x5ZmlsbH1cbiAqIEBtb2R1bGVcbiAqL1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBJbXBvcnRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmltcG9ydCB7IFByb21pc2UgfSBmcm9tICdlczYtcHJvbWlzZS1wb2x5ZmlsbCc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFB1YmxpY1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG53aW5kb3cuUHJvbWlzZSA9IHdpbmRvdy5Qcm9taXNlIHx8IFByb21pc2U7XG4iLCIvKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IGROb2RlXG4gKiBAcHJvcGVydHkge0hUTUxFbGVtZW50fSBwYXJlbnRcbiAqIEBwcm9wZXJ0eSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEBwcm9wZXJ0eSB7SFRNTEVsZW1lbnR9IHRvXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYnJlYWtwb2ludFxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9yZGVyXG4gKiBAcHJvcGVydHkge251bWJlcn0gaW5kZXhcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IGRNZWRpYVF1ZXJ5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcXVlcnlcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBicmVha3BvaW50XG4gKi9cblxuLyoqXG4gKiBAcGFyYW0geydtaW4nIHwgJ21heCd9IHR5cGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUR5bmFtaWNBZGFwdCh0eXBlID0gJ21heCcpIHtcbiAgY29uc3QgY2xhc3NOYW1lID0gJ19keW5hbWljX2FkYXB0XydcbiAgY29uc3QgYXR0ck5hbWUgPSAnZGF0YS1kYSdcblxuICAvKiogQHR5cGUge2ROb2RlW119ICovXG4gIGNvbnN0IGROb2RlcyA9IGdldEROb2RlcygpXG5cbiAgLyoqIEB0eXBlIHtkTWVkaWFRdWVyeVtdfSAqL1xuICBjb25zdCBkTWVkaWFRdWVyaWVzID0gZ2V0RE1lZGlhUXVlcmllcyhkTm9kZXMpXG5cbiAgZE1lZGlhUXVlcmllcy5mb3JFYWNoKChkTWVkaWFRdWVyeSkgPT4ge1xuICAgIGNvbnN0IG1hdGNoTWVkaWEgPSB3aW5kb3cubWF0Y2hNZWRpYShkTWVkaWFRdWVyeS5xdWVyeSlcbiAgICAvLyDQvNCw0YHRgdC40LIg0L7QsdGK0LXQutGC0L7QsiDRgSDQv9C+0LTRhdC+0LTRj9GJ0LjQvCDQsdGA0LXQudC60L/QvtC40L3RgtC+0LxcbiAgICBjb25zdCBmaWx0ZXJlZEROb2RlcyA9IGROb2Rlcy5maWx0ZXIoKHsgYnJlYWtwb2ludCB9KSA9PiBicmVha3BvaW50ID09PSBkTWVkaWFRdWVyeS5icmVha3BvaW50KVxuICAgIGNvbnN0IG1lZGlhSGFuZGxlciA9IGdldE1lZGlhSGFuZGxlcihtYXRjaE1lZGlhLCBmaWx0ZXJlZEROb2RlcylcbiAgICBtYXRjaE1lZGlhLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIG1lZGlhSGFuZGxlcilcblxuICAgIG1lZGlhSGFuZGxlcigpXG4gIH0pXG5cbiAgZnVuY3Rpb24gZ2V0RE5vZGVzKCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdXG4gICAgY29uc3QgZWxlbWVudHMgPSBbLi4uZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgWyR7YXR0ck5hbWV9XWApXVxuXG4gICAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgY29uc3QgYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJOYW1lKVxuICAgICAgY29uc3QgW3RvU2VsZWN0b3IsIGJyZWFrcG9pbnQsIG9yZGVyXSA9IGF0dHIuc3BsaXQoJywnKS5tYXAoKHZhbCkgPT4gdmFsLnRyaW0oKSlcblxuICAgICAgY29uc3QgdG8gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRvU2VsZWN0b3IpXG5cbiAgICAgIGlmICh0bykge1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgcGFyZW50OiBlbGVtZW50LnBhcmVudEVsZW1lbnQsXG4gICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICB0byxcbiAgICAgICAgICBicmVha3BvaW50OiBicmVha3BvaW50ID8gYnJlYWtwb2ludCA6ICc3NjcnLFxuICAgICAgICAgIG9yZGVyOiBvcmRlciAhPT0gdW5kZWZpbmVkID8gKGlzTnVtYmVyKG9yZGVyKSA/IE51bWJlcihvcmRlcikgOiBvcmRlcikgOiAnbGFzdCcsXG4gICAgICAgICAgaW5kZXg6IC0xLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG5cbiAgICByZXR1cm4gc29ydEROb2RlcyhyZXN1bHQpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtkTm9kZX0gaXRlbXNcbiAgICogQHJldHVybnMge2RNZWRpYVF1ZXJ5W119XG4gICAqL1xuICBmdW5jdGlvbiBnZXRETWVkaWFRdWVyaWVzKGl0ZW
100721zKSB7XG4gICAgY29uc3QgdW5pcUl0ZW1zID0gWy4uLm5ldyBTZXQoaXRlbXMubWFwKCh7IGJyZWFrcG9pbnQgfSkgPT4gYCgke3R5cGV9LXdpZHRoOiAke2JyZWFrcG9pbnR9cHgpLCR7YnJlYWtwb2ludH1gKSldXG5cbiAgICByZXR1cm4gdW5pcUl0ZW1zLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgW3F1ZXJ5LCBicmVha3BvaW50XSA9IGl0ZW0uc3BsaXQoJywnKVxuXG4gICAgICByZXR1cm4geyBxdWVyeSwgYnJlYWtwb2ludCB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge01lZGlhUXVlcnlMaXN0fSBtYXRjaE1lZGlhXG4gICAqIEBwYXJhbSB7ZE5vZGVzfSBpdGVtc1xuICAgKi9cbiAgZnVuY3Rpb24gZ2V0TWVkaWFIYW5kbGVyKG1hdGNoTWVkaWEsIGl0ZW1zKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIG1lZGlhSGFuZGxlcigpIHtcbiAgICAgIGlmIChtYXRjaE1lZGlhLm1hdGNoZXMpIHtcbiAgICAgICAgaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgIG1vdmVUbyhpdGVtKVxuICAgICAgICB9KVxuXG4gICAgICAgIGl0ZW1zLnJldmVyc2UoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChpdGVtLmVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSkpIHtcbiAgICAgICAgICAgIG1vdmVCYWNrKGl0ZW0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIGl0ZW1zLnJldmVyc2UoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ROb2RlfSBkTm9kZVxuICAgKi9cbiAgZnVuY3Rpb24gbW92ZVRvKGROb2RlKSB7XG4gICAgY29uc3QgeyB0bywgZWxlbWVudCwgb3JkZXIgfSA9IGROb2RlXG4gICAgZE5vZGUuaW5kZXggPSBnZXRJbmRleEluUGFyZW50KGROb2RlLmVsZW1lbnQsIGROb2RlLmVsZW1lbnQucGFyZW50RWxlbWVudClcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKVxuXG4gICAgaWYgKG9yZGVyID09PSAnbGFzdCcgfHwgb3JkZXIgPj0gdG8uY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICB0by5hcHBlbmQoZWxlbWVudClcblxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKG9yZGVyID09PSAnZmlyc3QnKSB7XG4gICAgICB0by5wcmVwZW5kKGVsZW1lbnQpXG5cbiAgICAgIHJldHVyblxuICAgI
10072H1cblxuICAgIHRvLmNoaWxkcmVuW29yZGVyXS5iZWZvcmUoZWxlbWVudClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ROb2RlfSBkTm9kZVxuICAgKi9cbiAgZnVuY3Rpb24gbW92ZUJhY2soZE5vZGUpIHtcbiAgICBjb25zdCB7IHBhcmVudCwgZWxlbWVudCwgaW5kZXggfSA9IGROb2RlXG4gICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSlcblxuICAgIGlmIChpbmRleCA+PSAwICYmIHBhcmVudC5jaGlsZHJlbltpbmRleF0pIHtcbiAgICAgIHBhcmVudC5jaGlsZHJlbltpbmRleF0uYmVmb3JlKGVsZW1lbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmVudC5hcHBlbmQoZWxlbWVudClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBwYXJlbnRcbiAgICovXG4gIGZ1bmN0aW9uIGdldEluZGV4SW5QYXJlbnQoZWxlbWVudCwgcGFyZW50KSB7XG4gICAgcmV0dXJuIFsuLi5wYXJlbnQuY2hpbGRyZW5dLmluZGV4T2YoZWxlbWVudClcbiAgfVxuXG4gIC8qKlxuICAgKiDQpNGD0L3QutGG0LjRjyDRgdC+0YDRgtC40YDQvtCy0LrQuCDQvNCw0YHRgdC40LLQsCDQv9C+IGJyZWFrcG9pbnQg0Lggb3JkZXJcbiAgICog0L/QviDQstC+0LfRgNCw0YHRgtCw0L3QuNGOINC00LvRjyB0eXBlID0gbWluXG4gICAqINC/0L4g0YPQsdGL0LLQsNC90LjRjiDQtNC70Y8gdHlwZSA9IG1heFxuICAgKlxuICAgKiBAcGFyYW0ge2ROb2RlW119IGl0ZW1zXG4gICAqL1xuICBmdW5jdGlvbiBzb3J0RE5vZGVzKGl0ZW1zKSB7XG4gICAgY29uc3QgaXNNaW4gPSB0eXBlID09PSAnbWluJyA/IDEgOiAwXG5cbiAgICByZXR1cm4gWy4uLml0ZW1zXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBpZiAoYS5icmVha3BvaW50ID09PSBiLmJyZWFrcG9pbnQpIHtcbiAgICAgICAgaWYgKGEub3JkZXIgPT09IGIub3JkZXIpIHtcbiAgICAgICAgICByZXR1cm4gMFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGEub3JkZXIgPT09ICdmaXJzdCcgfHwgYi5vcmRlciA9PT0gJ2xhc3QnKSB7XG4gICAgICAgICAgcmV0dXJuIC0xICogaXNNaW5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhLm9yZGVyID09PSAnbGFzdCcgfHwgYi5vcmRlciA9PT0gJ2ZpcnN0Jykge1xuICAgICAgICAgIHJldHVybiAxICogaXNNaW5cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAwXG4gICAgICB9XG5cbiAgICAgIHJldHVybiAoYS5icmVha3BvaW50IC0gYi5icmVha3BvaW50KSAqIGlzTWluXG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzTnVtYmVyKHZhbHVlKSB7XG4gICAgcmV0dXJuICFpc05hTih2YWx1ZSlcbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqINCf0L7QtNC60LvRjtGH0LXQvdC40LUg0LHQuNCx0LvQuNC+0YLQtdC60LggalF1ZXJ5XG4gKiBAbW9kdWxlXG4gKi9cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSW1wb3J0c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5pbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQdWJsaWNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxud2luZG93LiQgPSB3aW5kb3cualF1ZXJ5ID0gJDtcblxuLyogalF1ZXJ5IEVxdWFsIGhlaWdodHMgcGx1Z2luIHYuIDEuMC43IGJ5IHN0YXR1czIwMS5ubCAqL1xuIWZ1bmN0aW9uKGkpe2kuZm4uZXF1YWxIZWlnaHRzPWZ1bmN0aW9uKG4pe3ZhciBvLGU9aS5leHRlbmQoe30se29uUmVzaXplOiEwLG9uTG9hZDohMH0sbiksdD17fSxoPVtdLHM9MCx1PTAsYT1pKHRoaXMpO3JldHVybiBhLmxlbmd0aDwyP3RoaXM6KGUub25SZXNpemUmJmkod2luZG93KS5yZXNpemUoZnVuY3Rpb24oKXtvJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KG8pLG89d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXthLmVxdWFsSGVpZ2h0cyh7b25SZXNpemU6ITEsb25Mb2FkOiExfSl9LDEwMCl9KSxlLm9uTG9hZCYmaSh3aW5kb3cpLm9uKFwibG9hZFwiLGZ1bmN0aW9uKCl7YS5lcXVhbEhlaWdodHMoe29uUmVzaXplOiExLG9uTG9hZDohMX0pfSksYS5lYWNoKGZ1bmN0aW9uKCl7KGg9aSh0aGlzKSkuaGVpZ2h0KFwiYXV0b1wiKSwocz1oLmhlaWdodCgpKT4wJiYodT1oLnBvc2l0aW9uKCkudG9wLHUgaW4gdD9zPnRbdV0/KHRbdV09cyxpKGEpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiBpKHRoaXMpLnBvc2l0aW9uKCkudG9wPT11fSkuaGVpZ2h0KHMpKTpoLmhlaWdodCh0W3VdKToodFt1XT1zLGguaGVpZ2h0KHRbdV0pKSl9KSx0aGlzKX19KGpRdWVyeSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGZpbGVPdmVydmlldyDQntGB0L3QvtCy0L3QvtC5INGE0LDQudC7INC40L3QuNGG0LjQsNC70LjQt9Cw0YbQuNC4INC80L7QtNGD0LvQtdC5XG4gKi9cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSW1wb3J0c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5pbXBvcnQgJyMvX3ZlbmRvcnMvanF1ZXJ5JztcbmltcG9ydCAnIy9fcG9seWZpbGxzL21kbic7XG5pbXBvcnQgJyMvX3BvbHlmaWxscy9wcm9taXNlLXBvbHlmaWxsJztcbmltcG9ydCAnIy9fbW9kdWxlcy9tb2Rlcm5penInO1xuaW1wb3J0ICdjdXN0b20tanF1ZXJ5LW1ldGhvZHMvZm4vY2hhbmdlLW15LWNsYXNzJztcbmltcG9ydCBCcm93c2VyaXpyIGZyb20gJ2Jyb3dzZXJpenInO1xuXG5pbXBvcnQgeyB1c2VEeW5hbWljQWRhcHQgfSBmcm9tICcjL192ZW5kb3JzL2R5bmFtaWNBZGFwdC5qcyc7XG5pbXBvcnQgbW9kdWxlTG9hZGVyIGZyb20gJyMvbW9kdWxlLWxvYWRlcic7XG5pbXBvcnQgd3NUYWJzIGZyb20gJ3dlem9tLXN0YW5kYXJkLXRhYnMnO1xuaW1wb3J0IGNvb2tpZURhdGEgZnJvbSAnIy9fbW9kdWxlcy9jb29raWUtZGF0YSc7XG5pbXBvcnQgeyBsYXp5bG9hZCwgc2VsZWN0b3IgYXMgbGF6eWxvYWRTZWxlY3RvciB9IGZyb20gJyMvX21vZHVsZXMvbGF6eWxvYWQnO1xuaW1wb3J0IHsgY2xpY2tUcmlnZ2VyRm9yIH0gZnJvbSAnIy9fbW9kdWxlcy9jbGljay10cmlnZ2VyLWZvcic7XG5pbXBvcnQgY3JlYXRlVGltZXIgZnJvbSAnY3JlYXRlLXRpbWVyJztcbmltcG9ydCBVVE1UcmFjayBmcm9tICcjL19tb2R1bGVzL3V0bS10cmFja2luZyc7XG5pbXBvcnQgRWNvbW1lcmNlVHJhY2sgZnJvbSAnIy9fbW9kdWxlcy9lY29tbWVyY2UtdHJhY2tpbmcnO1xuaW1wb3J0IG1haW5NZW51IGZyb20gJy4vX21vZHVsZXMvbWFpbi1tZW51JztcbmltcG9ydCBjYXRhbG9nU2VhcmNoIGZyb20gJy4vX21vZHVsZXMvY2F0YWxvZy1zZWFyY2gnO1xuaW1wb3J0IFByb2R1Y3RzRmlsdGVyIGZyb20gJy4vX21vZHVsZXMvcHJvZHVjdHMtZmlsdGVyJztcbmltcG9ydCBFcXVhbEhlaWdodCBmcm9tICcjL19tb2R1bGVzL2VxdWFsLWhlaWdodCc7XG5pbXBvcnQgQmFsbE1vZGFsIGZyb20gJy4vX21vZHVsZXMvYmFsbC1tb2RhbCc7XG5cbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgJ2pxdWVyeS1zbm93ZmFsbCc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFB1YmxpY1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG50cnkge1xuXHR1c2VEeW5hbWljQWRhcHQoJ21pbicpO1xufSBjYXRjaCAoZSkge1xuXHQvLyBjb25zb2xlLmxvZyhlKTtcbn1cblxuLy8gc25vdyBzZXR0aW5ncyBvbiB0aGUgd2Vic2l0ZVxuZnVuY3Rpb24gdGhyb3R0bGUgKGNhbGxiYWNrLCBsaW1pdCkge1xuXHR2YXIgd2FpdCA9IGZhbHNlO1xuXHRyZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcblx0XHRpZiAoIXdhaXQpIHtcblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzdGFuZGFyZC9uby1jYWxsYmFjay1saXRlcmFsXG5cdFx0XHRjYWxsYmFjayguLi5hcmdzKTtcblx0XHRcdHdhaXQgPSB0cnVlO1xuXHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHdhaXQgPSBmYWxzZTtcblx0XHRcdH0sIGxpbWl0KTtcblx0XHR9XG5cdH07XG59XG5cbi8vIGNoZWNrIGNvbmZpZyBmb3IgZW5hYmxlIHNub3dmYWxsXG5pZiAodHlwZW9mIHdpbmRvdy5NYWluQ29uZmlnICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93Lk1haW5Db25maWcuc25vd2ZhbGwgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5NYWluQ29uZmlnLnNub3dmYWxsKSB7XG5cdCQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgpIHtcblx0XHQvLyAkKCdib2R5Jykuc25vd2ZhbGwoe1xuXHRcdC8vIFx0ZGV2aWNlb3JpZW50YXRpb246IHRydWUsXG5cdFx0Ly8gXHRyb3VuZDogdHJ1ZSxcblx0XHQvLyBcdG1pblNpemU6IDMsXG5cdFx0Ly8gXHRtYXhTaXplOiA4LFxuXHRcdC8vIFx0bWF4U3BlZWQ6IDMsXG5cdFx0Ly8gXHRmbGFrZUNvdW50OiA3NVxuXHRcdC8vIH0pO1xuXG5cdFx0Y29uc3Qgc25vd0NvbmZpZyA9IHtcblx0XHRcdGRldmljZW9yaWVudGF0aW9uOiB0cnVlLFxuXHRcdFx0cm91bmQ6IHRydWUsXG5cdFx0XHRtaW5TaXplOiAzLFxuXHRcdFx0bWF4U2l6ZTogOCxcblx0XHRcdG1heFNwZWVkOiAzLFxuXHRcdFx0Zmxha2VDb3VudDogNzVcblx0XHR9O1xuXG5cdFx0JChkb2N1bWVudCkuc25vd2ZhbGwoc25vd0NvbmZpZyk7XG5cblx0XHRsZXQgc25vd1JlZnJlc2hJbnRlcnZhbElkO1xuXG5cdFx0JCh3aW5kb3cpLm9uKCdtb3VzZW1vdmUnLCB0aHJvdHRsZShmdW5jdGlvbiAoKSB7XG5cdFx0XHR2YXIgc25vd1RpbWVyID0gMDtcblx0XHRcdGNsZWFySW50ZXJ2YWwoc25vd1JlZnJlc2hJbnRlcnZhbElkKTtcblx0XHRcdCQoZG9jdW1lbnQpLnNub3dmYWxsKCdjbGVhcicpO1xuXG5cdFx0XHRzbm93UmVmcmVzaEludGVydmFsSWQgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHNub3dUaW1lciArPSAxO1xuXHRcdFx0XHRpZiAoc25vd1RpbWVyID4gNSkge1xuXHRcdFx0XHRcdGNsZWFySW50ZXJ2YWwoc25vd1JlZnJlc2hJbnRlcnZhbElkKTtcblx0XHRcdFx0XHQkKGRvY3VtZW50KS5zbm93ZmFsbChzbm93Q29uZmlnKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgMTAwMCk7XG5cdFx0fSwgNTAwKSk7XG5cdH0pO1xufVxuXG53aW5kb3cualF1ZXJ5KGRvY3VtZW50KS5yZWFkeSgkID0+IHtcblx0bW9kdWxlTG9hZGVyLmluaXQoJChkb2N1bWVudCkpO1xuXHRjb29raWVEYXRhLmFza1VzYWdlKCk7IC8vINC10YHQu9C4INC90YPQttC90L4g0LjRgdC/0L7Qu9GM0LfQvtCy0LDRgtGMINC60YPQutC4XG5cdHdzVGFicy5pbml0KCk7XG5cdC8vIHdzVGFicy5zZXRBY3RpdmUoKTsgLy8g0LXRgdC70Lgg0L3Rg9C20L3QviDQv9GA0LjQvdGD0LTQuNGC0LXQu9GM0L3QviDQsNC60YLQuNCy0LjRgNC+0LLQsNGC0Ywg0YLQsNCx0YtcblxuXHRVVE1UcmFjay5pbml0KCk7XG5cblx0bWFpbk1lbnUoKTtcblx0Y2F0YWxvZ1NlYXJjaCgpO1xuXHQvLyBwcm9kdWN0IGZpbHRlciBpbml0XG5cdChuZXcgUHJvZHVjdHNGaWx0ZXIoJCkpLmluaXQoKTtcblxuXHRjbGlja1RyaWdnZXJGb3IoKTtcblx0RXF1YWxIZWlnaHQuaW5pdCgpO1xuXG5cdGlmIChCcm93c2VyaXpyLmRldGVjdCgpLmlzRWRnZSgpKSB7XG5cdFx0Y29uc3QgJGhlYWRlciA9ICQoJy5qcy1oZWFkZXItc3RpY2t5Jyk7XG5cdFx0Y29uc3QgJHdpbmRvdyA9ICQod2luZG93KTtcblx0XHRpZiAoJGhlYWRlci5sZW5ndGgpIHtcblx0XHRcdGxldCBjc3NDbGFzcyA9ICdpcy1maXhlZCc7XG5cdFx0XHRsZXQgcHJldmlvdXNseUFkZGVkID0gJGhlYWRlci5oYXNDbGFzcyhjc3NDbGFzcyk7XG5cdFx0XHRsZXQgdGltZW91dCA9IGNyZWF0ZVRpbWVyKDMwMCk7XG5cdFx0XHRsZXQgX2ZpeGVkID0gKCkgPT4ge1xuXHRcdFx0XHRsZXQgdG9wID0gJHdpbmRvdy5zY3JvbGxUb3AoKTtcblx0XHRcdFx0bGV0IGhlaWdodCA9ICRoZWFkZXIuaGVpZ2h0KCk7XG5cdFx0XHRcdHByZXZpb3VzbHlBZGRlZCA9ICRoZWFkZXIuY2hhbmdlTXlDbGFzcyh0b3AgPiBoZWlnaHQsIHByZXZpb3VzbHlBZGRlZCwgY3NzQ2xhc3MpO1xuXHRcdFx0fTtcblx0XHRcdCR3aW5kb3cub24oJ3Njcm9sbCcsIF9maXhlZCk7XG5cdFx0XHQkd2luZG93Lm9uKCdyZXNpemUnLCAoKSA9PiB0aW1lb3V0KF9maXhlZCkpO1xuXHRcdFx0JHdpbmRvdy5vbignb3JpZW50YXRpb25jaGFuZ2UnLCAoKSA9PiB0aW1lb3V0KF9maXhlZCkpO1xuXHRcdFx0X2ZpeGVkKCk7XG5cdFx0fVxuXHR9XG5cblx0Ly8g0Y3RgtC+INC00LXRhNC+0LvRgtC90YvQtS
10072DQvdCw0YHRgtGA0L7QudC60Lgg0YHQutGA0L7Qu9C70LAsINC80L7QttC10YjRjCDQuNGFINGD0LHQuNGA0LDRgtGML9C80L7QtNC40YTQuNGG0LjRgNC+0LLQsNGC0YwsINC60LDRgNC+0YfQtSDQtNC10LvQsNGC0Ywg0YfRgtC+INGF0L7Rh9C10YjRjCwg0LrQsNC70LHQtdC60L7QsiDQvdC10YLRgyDQv9C+0L3Rj9GC0L3QvtC1INC00LXQu9C+OkRcblx0aW1wb3J0KCcjL192ZW5kb3JzL3Njcm9sbCcpLnRoZW4oKG1vZHVsZSkgPT4ge1xuXHRcdG1vZHVsZS5kZWZhdWx0KHtcblx0XHRcdGZyYW1lUmF0ZTogMTUwLCAvLyBbSHpdXG5cdFx0XHRhbmltYXRpb25UaW1lOiA3MDAsIC8vIFttc11cblx0XHRcdHN0ZXBTaXplOiA3MCwgLy8gW3B4XVxuXHRcdFx0cHVsc2VBbGdvcml0aG06IHRydWUsXG5cdFx0XHRwdWxzZVNjYWxlOiAzLFxuXHRcdFx0cHVsc2VOb3JtYWxpemU6IDEsXG5cdFx0XHRhY2NlbGVyYXRpb25EZWx0YTogNTAsIC8vIDUwXG5cdFx0XHRhY2NlbGVyYXRpb25NYXg6IDMsIC8vIDNcblx0XHRcdGtleWJvYXJkU3VwcG9ydDogdHJ1ZSwgLy8gb3B0aW9uXG5cdFx0XHRhcnJvd1Njcm9sbDogNTAsIC8vIFtweF1cblx0XHRcdGZpeGVkQmFja2dyb3VuZDogdHJ1ZSxcblx0XHRcdGV4Y2x1ZGVkOiAnJ1xuXHRcdH0pO1xuXHR9KTtcblxuXHRsYXp5bG9hZChsYXp5bG9hZFNlbGVjdG9yKS50aGVuKG9ic2VydmVyID0+IG9ic2VydmVyLm9ic2VydmUoKSk7XG5cblx0JCgnLmpzLXByZXZpZXdlci10cmlnZ2VyJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuXHRcdCQodGhpcykudG9nZ2xlQ2xhc3MoJ2lzLWFjdGl2ZScpO1xuXHRcdCQoJyNqcy1wcmV2aWV3ZXItY29udGFpbmVyJykudG9nZ2xlQ2xhc3MoJ2lzLWFjdGl2ZScpO1xuXHR9KTtcblxuXHQvLyDQlNC+0LHQsNC70Y/QtdC8INC4INGD0LTQsNC70Y/QtdC8INC60LvQsNGB0YEgXCJpcy1mdWxsXCIg0LXRgdC70LggaW5wdXQg0LjQu9C4IHRleHRhcmVhINC30LDQv9C+0LvQvdC10L1cblx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIGZ1bmN0aW9uIChldnQpIHtcblx0XHRpZiAoIWV2dC50YXJnZXQudGFnTmFtZSkgcmV0dXJuIGZhbHNlO1xuXHRcdGxldCB0YWdOYW1lID0gZXZ0LnRhcmdldC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0aWYgKCh0YWdOYW1lICE9PSAnaW5wdXQnKSAmJiAodGFnTmFtZSAhPT0gJ3RleHRhcmVhJykpIHJldHVybiB0cnVlO1xuXHRcdGlmIChldnQudGFyZ2V0LnR5cGUgPT09ICdyYWRpbycpIHJldHVybiB0cnVlO1xuXHRcdGV2dC50YXJnZXQuY2xhc3NMaXN0LnRvZ2dsZSgnaXMtZnVsbCcsIEJvb2xlYW4oZXZ0LnRhcmdldC52YWx1ZSkpO1xuXHR9LCB0cnVlKTtcblxuXHRpZlx0KCQoJ2lucHV0JykubGVuZ3RoKSB7XG5cdFx0JCgnaW5wdXQnKS5lYWNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdGlmXHQoJCh0aGlzKS52YWwoKS5sZW5ndGgpIHtcblx0XHRcdFx0JCh0aGlzKS5hZGRDbGFzcygnaXMtZnVsbCcpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0Ly8g0JTQvtCx0LDQu9GP0LXQvCDQutC70LDRgdGBIFwiaXMtZnVsbFwiINC10YHQu9C4IHNlbGVjdCDQt9Cw0L/QvtC70L3QtdC9XG5cdCQoJ3NlbGVjdCcpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XG5cdFx0JCh0aGlzKS50b2dnbGVDbGFzcygnaXMtZnVsbCcsIEJvb2xlYW4oJCh0aGlzKS52YWwoKSkpO1xuXHR9KTtcblxuXHQkKGRvY3VtZW50KS5vbignY2xpY2snLCAnLmpzLW1hZ25pZmljLWNsb3NlJywgKCkgPT4ge1xuXHRcdCQubWFnbmlmaWNQb3B1cC5jbG9zZSgpO1xuXHR9KTtcblxuXHQvLyBldG8gYWRhcHRhY2lhIGtub3BraSBuYSBzbGlkZXJlIHhEXG5cdGZ1bmN0aW9uIGhhbmRsZXIxIChidXR0b24sIGJsb2NrKSB7XG5cdFx0YnV0dG9uLmNzcygnbGVmdCcsIGJsb2NrLm9mZnNldCgpLmxlZnQgKyAncHgnKTtcblx0fVxuXG5cdGlmICgkKCdbZGF0YS1ib3R0b20tYmxvY2staGVscGVyXScpLmxlbmd0aCkge1xuXHRcdGNvbnN0ICRidXR0b24gPSAkKCdbZGF0YS1ib3R0b20tYmxvY2staGVscGVyXScpO1xuXHRcdGNvbnN0ICRibG9jayA9ICQoJ1tkYXRhLWJvdHRvbS1ibG9jay1oZWxwZXItY29udGFpbmVyXScpLmVxKDApO1xuXG5cdFx0aGFuZGxlcjEoJGJ1dHRvbiwgJGJsb2NrKTtcblxuXHRcdGxldCBtb2lkZWJhdW5jZSA9IG51bGw7XG5cblx0XHQkKHdpbmRvdykucmVzaXplKCgpID0+IHtcblx0XHRcdGNsZWFyVGltZW91dChtb2lkZWJhdW5jZSk7XG5cblx0XHRcdG1vaWRlYmF1bmNlID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdGhhbmRsZXIxKCRidXR0b24sICRibG9jayk7XG5cdFx0XHR9LCAzMDApO1xuXHRcdH0pO1xuXHR9XG5cblx0aWYgKCQoJ1tkYXRhLWxvYWQtbW9yZV0nKS5sZW5ndGgpIHtcblx0XHQkKCdbZGF0YS1sb2FkLW1vcmVdJykuY2xpY2soZnVuY3Rpb24gKCkge1xuXHRcdFx0bGV0IGJ1dHRvbiA9ICQodGhpcyk7XG5cdFx0XHRsZXQgdXJsID0gYnV0dG9uLmRhdGEoJ3VybCcpO1xuXHRcdFx0bGV0IHBhcmFtcyA9IGJ1dHRvbi5hdHRyKCdkYXRhLXBhcmFtcycpO1xuXG5cdFx0XHRidXR0b24uYWRkQ2xhc3MoJ2lzLWxvYWRpbmcnKTtcblxuXHRcdFx0JC5hamF4KHtcblx0XHRcdFx0Y2FjaGU6IGZhbHNlLFxuXHRcdFx0XHRtZXRob2Q6ICdwb3N0Jyxcblx0XHRcdFx0dXJsOiB1cmwsXG5cdFx0XHRcdGRhdGE6IEpTT04ucGFyc2UocGFyYW1zKVxuXHRcdFx0fSkuZG9uZSgocmVzcG9uc2UpID0+IHtcblx0XHRcdFx0YnV0dG9uLnJlbW92ZUNsYXNzKCdpcy1sb2FkaW5nJyk7XG5cblx0XHRcdFx0aWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcblx0XHRcdFx0XHRsZXQgTnBhcmFtcyA9IHJlc3BvbnNlLnBhcmFtcztcblxuXHRcdFx0XHRcdGlmIChyZXNwb25zZS5tYXJrdXApIHtcblx0XHRcdFx0XHRcdGxldCAkY29udGFpbmVyID0gJCgnW2RhdGEtbG9hZC1tb3JlLWNvbnRhaW5lcj1cIicgKyBidXR0b24uYXR0cignZGF0YS1sb2FkLW1vcmUnKSArICdcIl0nKTtcblx0XHRcdFx0XHRcdGNvbnN0IGl0ZW1zQmVmb3JlID0gJGNvbnRhaW5lci5jaGlsZHJlbigpLmxlbmd0aDtcblx0XHRcdFx0XHRcdCRjb250YWluZXIuYXBwZW5kKHJlc3BvbnNlLm1hcmt1cCk7XG5cblx0XHRcdFx0XHRcdCQoJ2h0bWwsIGJvZHknKS5hbmltYXRlKHtcblx0XHRcdFx0XHRcdFx0c2Nyb2xsVG9wOiAkY29udGFpbmVyLmZpbmQoYGxpOm50aC1jaGlsZCgke2l0ZW1zQmVmb3JlICsgMX0pYCkub2Zmc2V0KCkudG9wIC0gNjRcblx0XHRcdFx0XHRcdH0sIDEwM
10072DApO1xuXHRcdFx0XHRcdFx0Ly8gbGF6eWxvYWQobGF6eWxvYWRTZWxlY3RvcikudGhlbihvYnNlcnZlciA9PiBvYnNlcnZlci5vYnNlcnZlKCkpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChyZXNwb25zZS5lbmQpIHtcblx0XHRcdFx0XHRcdGJ1dHRvbi5yZW1vdmUoKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAocmVzcG9uc2UucGFyYW1zKSB7XG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIE5wYXJhbXMgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRcdFx0XHRcdE5wYXJhbXMgPSBKU09OLnN0cmluZ2lmeShOcGFyYW1zKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGJ1dHRvbi5hdHRyKCdkYXRhLXBhcmFtcycsIE5wYXJhbXMpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIGxhenlsb2FkKGxhenlsb2FkU2VsZWN0b3IpLnRoZW4ob2JzZXJ2ZXIgPT4gb2JzZXJ2ZXIub2JzZXJ2ZSgpKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblxuXHRpZiAoJCgnLnBvc3QtY2FyZCcpLmxlbmd0aCkge1xuXHRcdCQoZG9jdW1lbnQpLm9uKCdjbGljaycsICcucG9zdC1jYXJkJywgZnVuY3Rpb24gKGUpIHtcblx0XHRcdHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJChlLmN1cnJlbnRUYXJnZXQpLmZpbmQoJ2EnKS5hdHRyKCdocmVmJyk7XG5cdFx0fSk7XG5cdH1cblxuXHRpZiAoJCgnLm1haW4tYWJvdXQgLmltYWdlLWJsb2NrJykubGVuZ3RoKSB7XG5cdFx0JChkb2N1bWVudCkub24oJ2NsaWNrJywgJy5tYWluLWFib3V0IC5pbWFnZS1ibG9jaycsIGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRjb25zdCBocmVmID0gJChlLmN1cnJlbnRUYXJnZXQpLmZpbmQoJ2EuaW1hZ2UtYmxvY2tfX2N0YScpLmZpcnN0KCkuYXR0cignaHJlZicpO1xuXHRcdFx0aWYgKGhyZWYpIHtcblx0XHRcdFx0d2luZG93LmxvY2F0aW9uLmhyZWYgPSBocmVmO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0Ly8gVWJsb2NrXG5cdGlmICgkKHdpbmRvdykud2lkdGgoKSA+PSAxMDI1KSB7XG5cdFx0aWYgKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2ZpcmVmb3gvaSkpIHtcblx0XHRcdCQoJyNmaXJlZml4VScpLmF0dHIoJ3RyYW5zZm9ybScsICdzY2FsZSguMDIsLjAyKSwgdHJhbnNsYXRlKDExIDgpJyk7XG5cdFx0fSBlbHNlIGlmICgvRWRnZVxcL1xcZC4vaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSB7XG5cdFx0XHQkKCcjZWRnZWZpeFUnKS5oaWRlKCk7XG5cdFx0XHQkKCcjVWltYWdlRml4Jykuc2hvdygpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQkKCcjZWRnZWZpeFUnKS5oaWRlKCk7XG5cdFx0JCgnI1VpbWFnZUZpeCcpLnNob3coKTtcblx0fVxuXG5cdGxldCAkcGVyZmVjdFNjcm9sbGJhciA9ICQoJ1tkYXRhLXBlcmZlY3Qtc2Nyb2xsYmFyXScpO1xuXHRpZiAoJHBlcmZlY3RTY3JvbGxiYXIubGVuZ3RoICYmICF3aW5kb3cuTW9kZXJuaXpyLm1vYmlsZWRldmljZSAmJiAhd2luZG93Lk1vZGVybml6ci5jc3NzY3JvbGxiYXIpIHtcblx0XHRpbXBvcnQoJyMvX21vZHVsZXMvcGVyZmVjdC1zY3JvbGxiYXInKS50aGVuKChtb2R1bGUpID0+IHtcblx0XHRcdG1vZHVsZS5kZWZhdWx0KCRwZXJmZWN0U2Nyb2xsYmFyKTtcblx0XHR9KTtcblx0fVxuXG5cdGlmICh3aW5kb3cubWVzc2FnZU9uTG9hZE5vdHkpIHtcblx0XHRpbXBvcnQoJyMvX21vZHVsZXMvanF1ZXJ5LXZhbGlkYXRpb24vdmFsaWRhdGUtZ2V0LXJlc3BvbnNlJykudGhlbigobW9kdWxlKSA9PiB7XG5cdFx0XHRtb2R1bGUuc2hvd01lc3NhZ2VNYWduaWZpYyhudWxsLCBmYWxzZSwgd2luZG93Lm1lc3NhZ2VPbkxvYWROb3R5LnR5cGUsIHdpbmRvdy5tZXNzYWdlT25Mb2FkTm90eS50aXRsZSwgd2luZG93Lm1lc3NhZ2VPbkxvYWROb3R5LnRleHQpO1xuXHRcdH0pO1xuXHR9XG5cblx0aWZcdCgkKCdbZGF0YS10aGFuay1wcmludF0nKS5sZW5ndGgpIHtcblx0XHQkKCdib2R5JykuYWRkQ2xhc3MoJ2lzLXByaW50aW5nJyk7XG5cblx0XHQkKCdbZGF0YS10aGFuay1wcmludF0nKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHR3aW5kb3cucHJpbnQoKTtcblx0XHR9KTtcblx0fVxuXG5cdC8vIENvcHlyaWdodCBvbiBjb3B5XG5cdGZ1bmN0aW9uIGluaXRDb3BpcmlnaHRPbkNvcHkgKCkge1xuXHRcdHZhciBsYW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2h0bWwnKVswXS5nZXRBdHRyaWJ1dGUoJ2xhbmcnKTtcblx0XHR2YXIgaGVscFRleHQgPSAnJztcblx0XHRzd2l0Y2ggKGxhbmcpIHtcblx0XHRcdGNhc2UgJ3J1Jzpcblx0XHRcdFx0aGVscFRleHQgPSAn0J/QvtC00YDQvtCx0L3QtdC1INC/0L4g0YHRgdGL0LvQutC1Jztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdlbic6XG5cdFx0XHRcdGhlbHBUZXh0ID0gJ1JlYWQgbW9yZSBhdCc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAndWEnOlxuXHRcdFx0XHRoZWxwVGV4dCA9ICfQlNC10YLQsNC70YzQvdGW0YjQtSDQt9CwINC/0L7RgdC40LvQsNC90L3Rj9C8Jztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRoZWxwVGV4dCA9ICfQlNC10YLQsNC70YzQvdGW0YjQtSDQt9CwINC/0L7RgdC40LvQsNC90L3Rj9C8Jztcblx0XHR9XG5cdFx0ZnVuY3Rpb24gYSAoZXZlbnQpIHtcblx0XHRcdGlmIChldmVudC50YXJnZXQubm9kZU5hbWUgPT09ICdJTlBVVCcgfHwgZXZlbnQudGFyZ2V0Lm5vZGVOYW1lID09PSAnVEVYVEFSRUEnKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHZhciBhOyB2YXIgYiA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdib2R5JylbMF07XG5cdFx0XHRhID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuXHRcdFx0dmFyIGMgPSAnPGJyIC8+PGJyIC8+JyArIGhlbHBUZXh0ICsgXCI6IDxhIGhyZWY9J1wiICsgZG9jdW1lbnQubG9jYXRpb24uaHJlZiArIFwiJz5cIiArIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYgKyAnPC9hPidcblx0XHRcdDsgdmFyIGQgPSBhICsgY1xuXHRcdFx0OyB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHRcdFx0ZS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG5cdFx0XHRlLnN0eWxlLmxlZnQgPSAnLTk5OTk5cHgnO1xuXHRcdFx0Yi5hcHBlbmRDaGlsZChlKTtcblx0XHRcdGUuaW5uZXJIVE1MID0gZDtcblx0XHRcdGEuc2VsZWN0QWxsQ2hpbGRyZW4oZSk7XG5cdFx0XHR3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGIucmVtb3ZlQ2hpbGQoZSk7XG5cdFx0XHR9LCAwKTtcblx0XHR9XG5cdFx0ZG9jdW1lbnQub25jb3B5ID0gYTtcblx0fVxuXHQvLyBJbml0IENvcHlyaWdodCBvbiBjb3B5XG5cdGluaXRDb3BpcmlnaHRPbkNvcHkoKTtcblxuXHQkKGRvY3VtZW50KS5vbignY2xpY2snLCAnLmpzLW1lc3NhbmdlcnMtYnRuJywgKGUpID0+IHtcblx0XHRlLnByZXZlbn
10072REZWZhdWx0KCk7XG5cdFx0JChlLnRhcmdldCkucGFyZW50KCkudG9nZ2xlQ2xhc3MoJ2lzLWFjdGl2ZScpO1xuXHR9KTtcblxuXHQvLyBTcG9pbGVyc1xuXHQkKGRvY3VtZW50KS5vbignY2xpY2snLCAnW2RhdGEtc3BvaWxlcl0gW2RhdGEtc3BvaWxlci10aXRsZV0nLCAoZSkgPT4ge1xuXHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdGNvbnN0IHNsaWRlU3BlZWQgPSAyNTA7XG5cdFx0Y29uc3QgJGN1cnJlbnQgPSAkKGUuY3VycmVudFRhcmdldCk7XG5cdFx0Y29uc3QgJHNwb2lsZXIgPSAkY3VycmVudC5wYXJlbnRzKCdbZGF0YS1zcG9pbGVyXScpO1xuXG5cdFx0ZnVuY3Rpb24gdG9nZ2xlU3BvaWxlciAoKSB7XG5cdFx0XHQkY3VycmVudC50b2dnbGVDbGFzcygnYWN0aXZlJykubmV4dCgpLnN0b3AoKS5zbGlkZVRvZ2dsZShzbGlkZVNwZWVkKTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBvcGVuU3BvaWxlciAoKSB7XG5cdFx0XHQkY3VycmVudC5hZGRDbGFzcygnYWN0aXZlJykubmV4dCgpLnN0b3AoKS5zbGlkZURvd24oc2xpZGVTcGVlZCk7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gY2xvc2VOb3RDdXJyZW50U3BvaWxlciAoKSB7XG5cdFx0XHQkc3BvaWxlci5maW5kKCdbZGF0YS1zcG9pbGVyLXRpdGxlXScpLm5vdCgkY3VycmVudCkucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpLm5leHQoKS5zbGlkZVVwKHNsaWRlU3BlZWQpO1xuXHRcdH1cblxuXHRcdGlmICgkKHdpbmRvdykud2lkdGgoKSA8IDEwMjQpIHtcblx0XHRcdHRvZ2dsZVNwb2lsZXIoKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRzd2l0Y2ggKCRzcG9pbGVyLmF0dHIoJ2RhdGEtc3BvaWxlcicpKSB7XG5cdFx0XHRjYXNlICdvbmUnOlxuXHRcdFx0XHRjbG9zZU5vdEN1cnJlbnRTcG9pbGVyKCk7XG5cdFx0XHRcdG9wZW5TcG9pbGVyKCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnb25lLWNsb3NlJzpcblx0XHRcdFx0aWYgKCRjdXJyZW50Lmhhc0NsYXNzKCdhY3RpdmUnKSkge1xuXHRcdFx0XHRcdHRvZ2dsZVNwb2lsZXIoKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0Y2xvc2VOb3RDdXJyZW50U3BvaWxlcigpO1xuXHRcdFx0XHRvcGVuU3BvaWxlcigpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRvZ2dsZVNwb2lsZXIoKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9KTtcblxuXHQkKCdbZGF0YS1zcG9pbGVyXSBbZGF0YS1zcG9pbGVyLXRpdGxlXS5hY3RpdmUnKS5uZXh0KCkuc2hvdygpO1xuXG5cdC8vIFNob3cgbW9yZSB0ZXh0XG5cdCQoZG9jdW1lbnQpLm9uKCdjbGljaycsICdbZGF0YS1zaG93bW9yZV0nLCAoZSkgPT4ge1xuXHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRjb25zdCAkY3VycmVudCA9ICQoZS50YXJnZXQpO1xuXHRcdGNvbnN0ICR0ZXh0ID0gJGN1cnJlbnQucGFyZW50KCk7XG5cdFx0JHRleHQudG9nZ2xlQ2xhc3MoJ2lzLXZpc2libGUnKTtcblx0XHRjb25zdCBsb2NhbGUgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubGFuZy5zcGxpdCgnLScpLnBvcCgpLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09ICd1aycgPyAndWEnIDogZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lmxhbmcuc3BsaXQoJy0nKS5wb3AoKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuXHRcdGNvbnN0IGRpY3Rpb25hcnkgPSAkY3VycmVudC5kYXRhKCdkaWN0aW9uYXJ5JylbbG9jYWxlXTtcblx0XHQkY3VycmVudC50ZXh0KCR0ZXh0Lmhhc0NsYXNzKCdpcy12aXNpYmxlJykgPyBkaWN0aW9uYXJ5Lmxlc3MgOiBkaWN0aW9uYXJ5Lm1vcmUpO1xuXHR9KTtcblxuXHQvLyBTaG93IG1vcmUgY29tbWVudHNcblx0JChkb2N1bWVudCkub24oJ2NsaWNrJywgJ1tkYXRhLWNvbW1lbnRzLWxvYWRdJywgKGUpID0+IHtcblx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0Y29uc3QgJGN1cnJlbnQgPSAkKGUudGFyZ2V0KTtcblx0XHRjb25zdCAkY29tbWVudHNCbG9jayA9ICQoJ1tkYXRhLWNvbW1lbnRzXScpO1xuXHRcdGNvbnN0ICRjb21tZW50c0xpc3QgPSAkY29tbWVudHNCbG9jay5maW5kKCdbZGF0YS1jb21tZW50cy1saXN0XScpO1xuXHRcdGNvbnN0IGNhdGFsb2dJRCA9ICRjb21tZW50c0Jsb2NrLmRhdGEoJ2NvbW1lbnRzJyk7XG5cdFx0Y29uc3QgdXJsID0gJGN1cnJlbnQuZGF0YSgnY29tbWVudHMtbG9hZCcpO1xuXHRcdCRjdXJyZW50LmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7XG5cdFx0JGNvbW1lbnRzQmxvY2suYWRkQ2xhc3MoJ2lzLWxvYWRpbmcnKTtcblxuXHRcdGNvbnN0IGRhdGEgPSB7XG5cdFx0XHRjYXRhbG9nX2lkOiBOdW1iZXIoY2F0YWxvZ0lEKSxcblx0XHRcdG9mZnNldDogJGNvbW1lbnRzTGlzdC5jaGlsZHJlbigpLmxlbmd0aFxuXHRcdH07XG5cblx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdCQuYWpheCh7XG5cdFx0XHRcdGNhY2hlOiBmYWxzZSxcblx0XHRcdFx0bWV0aG9kOiAncG9zdCcsXG5cdFx0XHRcdHVybCxcblx0XHRcdFx0ZGF0YVxuXHRcdFx0fSkuZG9uZSgocmVzcG9uc2UpID0+IHtcblx0XHRcdFx0JGNvbW1lbnRzQmxvY2sucmVtb3ZlQ2xhc3MoJ2lzLWxvYWRpbmcnKTtcblx0XHRcdFx0JGN1cnJlbnQuYXR0cignZGlzYWJsZWQnLCBmYWxzZSk7XG5cblx0XHRcdFx0aWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcblx0XHRcdFx0XHRpZiAocmVzcG9uc2UucmV2aWV3c19tYXJrdXApIHtcblx0XHRcdFx0XHRcdCRjb21tZW50c0xpc3QuYXBwZW5kKHJlc3BvbnNlLnJldmlld3NfbWFya3VwKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHJlc3BvbnNlLmVuZCkge1xuXHRcdFx0XHRcdFx0JGN1cnJlbnQucmVtb3ZlKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9LCAzMDApO1xuXHR9KTtcblxuXHQvLyBMb3ZlcnMgTW9kYWwgaW5pdFxuXHRjb25zdCBsb3ZlcnNNb2RhbFJlZiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb3ZlcnNNb2RhbCcpO1xuXHRpZiAobG92ZXJzTW9kYWxSZWYpIHtcblx0XHRkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ2JsdXInKTtcblx0XHRjb25zdCBsb3ZlcnNNb2RhbENsb3NlSGFuZGxlciA9ICgpID0+IHtcblx0XHRcdGNvb2tpZURhdGEuYWRkKCdzaG93LWxvdmVycy1tb2RhbCcsIGZhbHNlLCB7IGV4cGlyZXM6IDM2NSwgcGF0aDogJy8nLCBTYW1lU2l0ZTogJ05vbmUnLCBTZWN1cmU6ICdTZWN1cmUnIH0pO1xuXHRcdFx0bG92ZXJzTW9kYWxSZWYuc3R5bGUub3BhY2l0eSA9IDA7XG5cdFx0XHRkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ2JsdXInKTtcblx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRsb3ZlcnNNb2RhbFJlZi5yZW1vdmUoKTtcblx0XHRcdH0sIDIwMDApO1xuXHRcdH07XG5cdFx0Y29uc3QgY2xvc2VCdG5SZWYgPSBsb3ZlcnNNb2RhbFJlZi5xdWVyeVNlbGVjdG9yKCcuanMtY2xvc2UtbG92ZXJzLW1vZGFsJyk7XG5cdFx0Y2xvc2VCdG5SZWYuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsb3ZlcnNNb2RhbENsb3NlSGFuZGxlcik7XG5cdH1cblxuXHQvLyBFYXN0ZXIgTW9kYWwgaW5pdFxuXHRjb25zdCBlYXN0ZXJNb2RhbFJlZiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlYXN0ZXJNb2RhbCcpO1xuXG5cdGlmIChlYXN0ZXJNb2RhbFJlZikge1xuXHRcdC8vIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnYmx1cicpO1xuXHRcdGNvbnN0IGVhc3Rlck1vZGFsQ2xvc2VIYW5kbGVyID0gKCkgPT4ge1xuXHRcdFx0Y29va2llRGF0YS5hZGQoJ3Nob3ctZWFzdGVyLW1vZGFsJywgZmFsc2UsIHsgZXhwaXJlczogMzY1LCBwYXRoOiAnLycsIFNhbWVTaXRlOiAnTm9uZScsIFNlY3VyZTogJ1NlY3VyZScgfSk7XG5cdFx0XHRlYXN0ZXJNb2RhbFJlZi5zdHlsZS5vcGFjaXR5ID0gMDtcblx0XHRcdC8vIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnYmx1cicpO1xuXHRcdFx0ZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICcnO1xuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdGVhc3Rlck1vZGFsUmVmLnJlbW92ZSgpO1xuXHRcdFx0fSwgMjAwMCk7XG5cdFx0fTtcblx0XHRjb25zdCBjbG9zZUJ0blJlZiA9IGVhc3Rlck1vZGFsUmVmLnF1ZXJ5U2VsZWN0b3IoJy5qcy1jbG9zZS1lYXN0ZXItbW9kYWwnKTtcblx0XHRjbG9zZUJ0blJlZi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGVhc3Rlck1vZGFsQ2xvc2VIYW5kbGVyKTtcblx0fVxuXG5cdC8vIEJhbGwgTW9kYWwgaW5pdFxuXHRjb25zdCBiYWxsQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmJmLWJhbGwtY29udGFpbmVyJyk7XG5cdGlmIChiYWxsQ29udGFpbmVyICYmIGJhbGxDb250YWluZXIuZ2V0QXR0cmlidXRlKCdkYXRhLWJmYmFsbCcpID09PSAnYWN0aXZlJykge1xuXHRcdG5ldyBCYWxsTW9kYWwoKTtcblx0fVxufSk7XG5cbi8vIEdBNFxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbiAoKSB7XG5cdC8vIFByb2R1Y3QgcGFnZVxuXHRjb25zdCBwcm9kdWN0UGFnZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXByb2R1Y3QtcGFnZV0nKTtcblxuXHRpZiAocHJvZHVjdFBhZ2UpIHtcblx0XHQvLyDQntGC0YDQuNC80LDQvdC90Y8g0ZbQtNC10L3RgtC40YTRltC60LDRgtC+0YDQsCDRgtC+0LLQsNGA0YMg0Lcg0LDRgtGA0LjQsdGD0YLQsCBkYXRhLXByb2R1Y3QtcGFnZVxuXHRcdGNvbnN0IHByb2R1Y3RJZCA9IHBhcnNlSW50KHByb2R1Y3RQYWdlLmdldEF0dHJpYnV0ZSgnZGF0YS1wcm9kdWN0LXBhZ2UnKSk7XG5cblx0XHRpZiAoIXByb2R1Y3RJZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdCQuYWpheCh7XG5cdFx0XHRjYWNoZTogZmFsc2UsXG5cdFx0XHRtZXRob2Q6ICdwb3N0Jyxcblx0XHRcdHVybDogJy91YS9lY29tbWVyY2UvYWpheC9wcm9kdWN0Jyxcblx0XHRcdGRhdGE6IHtcblx0XHRcdFx0cHJvZHVjdElkXG5cdFx0XHR9XG5cdFx0fSkuZG9uZSgocmVzcG9uc2UpID0+IHtcblx0XHRcdGlmIChyZXNwb25zZS5zdWNjZXNzICYmIHJlc3BvbnNlLmRhdGEpIHtcblx0XHRcdFx0RWNvbW1lcmNlVHJhY2sudHJhY2tWaWV3SXRlbShyZXNwb25zZS5kYXRhKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8vIENoZWNrb3V0IHBhZ2Vcblx0Y29uc3QgY2hlY2tvdXRQYWdlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtY2hlY2tvdXQtcGFnZV0nKTtcblxuXHRpZiAoY2hlY2tvdXRQYWdlKSB7XG5cdFx0JC5hamF4KHtcblx0XHRcdGNhY2hlOiBmYWxzZSxcblx0XHRcdG1ldGhvZDogJ3Bvc3QnLFxuXHRcdFx0dXJsOiAnL3VhL2Vjb21tZXJjZS9hamF4L2NoZWNrb3V0J1xuXHRcdH0pLmRvbmUoKHJlc3BvbnNlKSA9PiB7XG5cdFx0XHRpZiAocmVzcG9uc2Uuc3VjY2VzcyAmJiByZXNwb25zZS5kYXRhKSB7XG5cdFx0XHRcdGNvbnN0IHsgYW1vdW50LCBpdGVtcyB9ID0gcmVzcG9uc2UuZGF0YTtcblx0XHRcdFx0RWNvbW1lcmNlVHJhY2sudHJhY2tCZWdpbkNoZWNrb3V0KGFtb3VudCwgaXRlbXMpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0Ly8gVGhhbmtzIHBhZ2Vcblx0Y29uc3QgdGhhbmtQYWdlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtdGhhbmstcGFnZV0nKTtcblxuXHRpZiAodGhhbmtQYWdlKSB7XG5cdFx0aWYgKCF3aW5kb3cudHJhY2tQdXJjaGFzZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vINCe0YLRgNC40LzQsNC90L3RjyDRltC00LXQvdGC0LjRhNGW0LrQsNGC0L7RgNCwINC30LDQvNC+0LLQu9C10L3QvdGPINC3INCw0YLRgNC40LHRg9GC0LAgZGF0YS10aGFuay1wYWdlXG5cdFx0Y29uc3Qgb3JkZXJJZCA9IHBhcnNlSW50KHRoYW5rUGFnZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtdGhhbmstcGFnZScpKTtcblxuXHRcdGlmICghb3JkZXJJZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdCQuYWpheCh7XG5cdFx0XHRjYWNoZTogZmFsc2UsXG5cdFx0XHRtZXRob2Q6ICdwb3N0Jyxcblx0XHRcdHVybDogJy91YS9lY29tbWVyY2UvYWpheC9wdXJjaGFzZScsXG5cdFx0XHRkYXRhOiB7XG5cdFx0XHRcdG9yZGVySWRcblx0XHRcdH1cblx0XHR9KS5kb25lKChyZXNwb25zZSkgPT4ge1xuXHRcdFx0aWYgKHJlc3BvbnNlLnN1Y2Nlc3MgJiYgcmVzcG9uc2UuZGF0YSkge1xuXHRcdFx0XHRFY29tbWVyY2VUcmFjay50cmFja1B1cmNoYXNlKHJlc3BvbnNlLmRhdGEpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0Ly8gc3BvaWxlclxuXHQkKGRvY3VtZW50KS5vbignY2xpY2snLCAnLnRleHQtc3BvaWxlcicsIGZ1bmN0aW9uIChlKSB7XG5cdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdGNvbnN0IGN1cnJlbnRBY3Rpb24gPSAkKHRoaXMpLmRhdGEoJ2FjdGlvbicpO1xuXHRcdGNvbnN0IHNwb2lsZXJCbG9jayA9ICQodGhpcykucGFyZW50KCkuZmluZCgnLnRleHQtc3BvaWxlcl9fY29udGVudCcpO1xuXHRcdGlmIChjdXJyZW50QWN0aW9uID09PSAnb3BlbicpIHtcblx0XHRcdHNwb2lsZXJCbG9jay5hZGRDbGFzcygnb3BlbicpO1xuXHRcdH1cblx0XHRpZiAoY3VycmVudEFjdGlvbiA9PT0gJ2Nsb3NlJykge1xuXHRcdFx0c3BvaWxlckJsb2NrLnJlbW92ZUNsYXNzKCdvcGVuJyk7XG5cdFx0fVxuXHRcdCQodGhpcykucGFyZW50KCkuZmluZCgnLnRleHQtc3BvaWxlcicpLnNob3coKTtcblx0XHQkKHRoaXMpLmhpZGUoKTtcblx0fSk7XG59
10072KTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQG1vZHVsZVxuICovXG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEltcG9ydHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuaW1wb3J0IE1vZHVsZUxvYWRlciBmcm9tICd3ZXpvbS1tb2R1bGUtbG9hZGVyJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUHVibGljXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IG1vZHVsZUxvYWRlciA9IG5ldyBNb2R1bGVMb2FkZXIoe1xuXHRkZWJ1ZzogZmFsc2UsIC8vIElTX0RFVkVMT1BNRU5ULFxuXHRpbXBvcnRQcm9taXNlOiBtb2R1bGVOYW1lID0+IGltcG9ydCgnLi9fbW9kdWxlcy1sb2FkZXJzLycgKyBtb2R1bGVOYW1lKSxcblx0aW5pdFNlbGVjdG9yOiAnLmpzLWluaXQnLFxuXHRpbml0RnVuY3Rpb25OYW1lOiAnbG9hZGVySW5pdCcsXG5cdGxvYWRpbmdDbGFzczogJ19tb2R1bGUtbG9hZGluZycsXG5cdGxvYWRlZENsYXNzOiAnX21vZHVsZS1sb2FkZWQnLFxuXHRsaXN0OiB7XG5cdFx0LyogZXNsaW50LWRpc2FibGUga2V5LXNwYWNpbmcgKi9cblx0XHQnanF1ZXJ5LXZhbGlkYXRpb24tLW1vZHVsZS1sb2FkZXInXHRcdFx0OiAnZm9ybScsXG5cdFx0J2lucHV0bWFzay0tbW9kdWxlLWxvYWRlcidcdFx0XHRcdFx0XHRcdDogJ1tkYXRhLXBob25lbWFza10nLFxuXHRcdCdzMnMtLW1vZHVsZS1sb2FkZXInXHRcdFx0XHRcdFx0XHRcdFx0XHQ6ICdbZGF0YS1zMnNdJyxcblx0XHQnbWFnbmlmaWMtcG9wdXAtLW1vZHVsZS1sb2FkZXInXHRcdFx0XHRcdDogJ1tkYXRhLW1mcF0nLFxuXHRcdCd3cmFwLW1lZGlhLS1tb2R1bGUtbG9hZGVyJ1x0XHRcdFx0XHRcdFx0OiAnW2RhdGEtd3JhcC1tZWRpYV0nLFxuXHRcdCdzbGlkZXJzLS1tb2R1bGUtbG9hZGVyJ1x0XHRcdFx0XHRcdFx0XHQ6ICdbZGF0YS1zbGlkZXJdJyxcblx0XHQnbG96YWQtLW1vZHVsZS1sb2FkZXInXHRcdFx0XHRcdFx0XHRcdFx0OiBbJ1tkYXRhLWxvemFkXScsICdwaWN0dXJlJ10sXG5cdFx0J2dvb2dsZS1tYXAtLW1vZHVsZS1sb2FkZXInXHRcdFx0XHRcdFx0XHQ6ICdbZGF0YS1nb29nbGUtbWFwXScsXG5cdFx0J3Njcm9sbC13aW5kb3ctLW1vZHVsZS1sb2FkZXInXHRcdFx0XHRcdDogJ1tkYXRhLXNjcm9sbC13aW5kb3ddJyxcblx0XHQnZHJhZ2dhYmxlLXRhYmxlLS1tb2R1bGUtbG9hZGVyJ1x0XHRcdFx0OiAnW2RhdGEtZHJhZ2dhYmxlLXRhYmxlXScsXG5cdFx0J2FjY29yZGlvbi0tbW9kdWxlLWxvYWRlcidcdFx0XHRcdFx0XHRcdDogJ1tkYXRhLWFjY29yZGlvbl0nLFxuXHRcdCdzcGxhc2gtbm8tMTgnXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ6ICdbZGF0YS1uby0xOF0nLFxuXHRcdCd0aW1lbGluZSdcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ6ICdbZGF0YS10aW1lbGluZV0nLFxuXHRcdCdjYXJ0LS1tb2R1bGUtbG9hZGVyJ1x0XHRcdFx0XHRcdFx0XHRcdFx0OiAnW2RhdGEtY2FydC1jb250YWluZXJdJyxcblx0XHQnaW5wdXQtcXVhbnRpdHktLW1vZHVsZS1sb2FkZXInXHRcdFx0XHRcdDogJ1tkYXRhLXF1YW50aXR5XScsXG5cdFx0J3Jldmlldy1yZWFkLW1vcmUtLW1vZHVsZS1sb2FkZXInXHRcdFx0XHQ6ICcuanMtcmVhZC1tb3JlJyxcblx0XHQnY2F0YWxvZy1maWx0ZXItLW1vZHVsZS1sb2FkZXInXHRcdFx0XHRcdDogJy5qcy1maWx0ZXItYnV0dG9uJyxcblx0XHQnYW5pbWF0ZWQtdGV4dCdcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDogJ1tkYXRhLWFuaW1hdGVkLXRleHRdJyxcblx0XHQnYmVlcmJveC0tbW9kdWxlLWxvYWRlcidcdFx0XHRcdFx0XHRcdFx0OiAnW2RhdGEtYmVlcmJveF0nLFxuXHRcdCdwYXJ0bmVyLWZvcm0tLW1vZHVsZS1sb2FkZXInICAgICAgICAgICA6ICdbZGF0YS1wYXJ0bmVyLWZvcm1dJyxcblx0XHQnaW5maW5pdHktc2Nyb2xsLS1tb2R1bGUtbG9hZGVyJyAgICAgICAgOiAnLmluZmluaXR5LXNjcm9sbCcsXG5cdFx0J3Bhc3N3b3JkLXRvZ2dsZS0tbW9kdWxlLWxvYWRlcicgICAgICAgIDogJy5wYXNzd29yZC10b2dnbGUnXG5cdH1cbn0pO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFeHBvcnRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBkZWZhdWx0IG1vZHVsZUxvYWRlcjtcbiIsImZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0gZWxzZSB7IHJldHVybiBBcnJheS5mcm9tKGFycik7IH0gfVxuXG4vLyBPbGRlciBicm93c2VycyBkb24ndCBzdXBwb3J0IGV2ZW50IG9wdGlvbnMsIGZlYXR1cmUgZGV0ZWN0IGl0LlxuXG4vLyBBZG9wdGVkIGFuZCBtb2RpZmllZCBzb2x1dGlvbiBmcm9tIEJvaGRhbiBEaWR1a2ggKDIwMTcpXG4vLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80MTU5NDk5Ny9pb3MtMTAtc2FmYXJpLXByZXZlbnQtc2Nyb2xsaW5nLWJlaGluZC1hLWZpeGVkLW92ZXJsYXktYW5kLW1haW50YWluLXNjcm9sbC1wb3NpXG5cbnZhciBoYXNQYXNzaXZlRXZlbnRzID0gZmFsc2U7XG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgdmFyIHBhc3NpdmVUZXN0T3B0aW9ucyA9IHtcbiAgICBnZXQgcGFzc2l2ZSgpIHtcbiAgICAgIGhhc1Bhc3NpdmVFdmVudHMgPSB0cnVlO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0UGFzc2l2ZScsIG51bGwsIHBhc3NpdmVUZXN0T3B0aW9ucyk7XG4gIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0ZXN0UGFzc2l2ZScsIG51bGwsIHBhc3NpdmVUZXN0T3B0aW9ucyk7XG59XG5cbnZhciBpc0lvc0RldmljZSA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5uYXZpZ2F0b3IgJiYgd2luZG93Lm5hdmlnYXRvci5wbGF0Zm9ybSAmJiAoL2lQKGFkfGhvbmV8b2QpLy50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IucGxhdGZvcm0pIHx8IHdpbmRvdy5uYXZpZ2F0b3IucGxhdGZvcm0gPT09ICdNYWNJbnRlbCcgJiYgd2luZG93Lm5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyA+IDEpO1xuXG5cbnZhciBsb2NrcyA9IFtdO1xudmFyIGRvY3VtZW50TGlzdGVuZXJBZGRlZCA9IGZhbHNlO1xudmFyIGluaXRpYWxDbGllbnRZID0gLTE7XG52YXIgcHJldmlvdXNCb2R5T3ZlcmZsb3dTZXR0aW5nID0gdm9pZCAwO1xudmFyIHByZXZpb3VzQm9keVBvc2l0aW9uID0gdm9pZCAwO1xudmFyIHByZXZpb3VzQm9keVBhZGRpbmdSaWdodCA9IHZvaWQgMDtcblxuLy8gcmV0dXJucyB0cnVlIGlmIGBlbGAgc2hvdWxkIGJlIGFsbG93ZWQgdG8gcmVjZWl2ZSB0b3VjaG1vdmUgZXZlbnRzLlxudmFyIGFsbG93VG91Y2hNb3ZlID0gZnVuY3Rpb24gYWxsb3dUb3VjaE1vdmUoZWwpIHtcbiAgcmV0dXJuIGxvY2tzLnNvbWUoZnVuY3Rpb24gKGxvY2spIHtcbiAgICBpZiAobG9jay5vcHRpb25zLmFsbG93VG91Y2hNb3ZlICYmIGxvY2sub3B0aW9ucy5hbGxvd1RvdWNoTW92ZS
10072hlbCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG59O1xuXG52YXIgcHJldmVudERlZmF1bHQgPSBmdW5jdGlvbiBwcmV2ZW50RGVmYXVsdChyYXdFdmVudCkge1xuICB2YXIgZSA9IHJhd0V2ZW50IHx8IHdpbmRvdy5ldmVudDtcblxuICAvLyBGb3IgdGhlIGNhc2Ugd2hlcmVieSBjb25zdW1lcnMgYWRkcyBhIHRvdWNobW92ZSBldmVudCBsaXN0ZW5lciB0byBkb2N1bWVudC5cbiAgLy8gUmVjYWxsIHRoYXQgd2UgZG8gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgcHJldmVudERlZmF1bHQsIHsgcGFzc2l2ZTogZmFsc2UgfSlcbiAgLy8gaW4gZGlzYWJsZUJvZHlTY3JvbGwgLSBzbyBpZiB3ZSBwcm92aWRlIHRoaXMgb3Bwb3J0dW5pdHkgdG8gYWxsb3dUb3VjaE1vdmUsIHRoZW5cbiAgLy8gdGhlIHRvdWNobW92ZSBldmVudCBvbiBkb2N1bWVudCB3aWxsIGJyZWFrLlxuICBpZiAoYWxsb3dUb3VjaE1vdmUoZS50YXJnZXQpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBEbyBub3QgcHJldmVudCBpZiB0aGUgZXZlbnQgaGFzIG1vcmUgdGhhbiBvbmUgdG91Y2ggKHVzdWFsbHkgbWVhbmluZyB0aGlzIGlzIGEgbXVsdGkgdG91Y2ggZ2VzdHVyZSBsaWtlIHBpbmNoIHRvIHpvb20pLlxuICBpZiAoZS50b3VjaGVzLmxlbmd0aCA+IDEpIHJldHVybiB0cnVlO1xuXG4gIGlmIChlLnByZXZlbnREZWZhdWx0KSBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxudmFyIHNldE92ZXJmbG93SGlkZGVuID0gZnVuY3Rpb24gc2V0T3ZlcmZsb3dIaWRkZW4ob3B0aW9ucykge1xuICAvLyBJZiBwcmV2aW91c0JvZHlQYWRkaW5nUmlnaHQgaXMgYWxyZWFkeSBzZXQsIGRvbid0IHNldCBpdCBhZ2Fpbi5cbiAgaWYgKHByZXZpb3VzQm9keVBhZGRpbmdSaWdodCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIF9yZXNlcnZlU2Nyb2xsQmFyR2FwID0gISFvcHRpb25zICYmIG9wdGlvbnMucmVzZXJ2ZVNjcm9sbEJhckdhcCA9PT0gdHJ1ZTtcbiAgICB2YXIgc2Nyb2xsQmFyR2FwID0gd2luZG93LmlubmVyV2lkdGggLSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7XG5cbiAgICBpZiAoX3Jlc2VydmVTY3JvbGxCYXJHYXAgJiYgc2Nyb2xsQmFyR2FwID4gMCkge1xuICAgICAgdmFyIGNvbXB1dGVkQm9keVBhZGRpbmdSaWdodCA9IHBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpLmdldFByb3BlcnR5VmFsdWUoJ3BhZGRpbmctcmlnaHQnKSwgMTApO1xuICAgICAgcHJldmlvdXNCb2R5UGFkZGluZ1JpZ2h0ID0gZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQ7XG4gICAgICBkb2
10072N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9IGNvbXB1dGVkQm9keVBhZGRpbmdSaWdodCArIHNjcm9sbEJhckdhcCArICdweCc7XG4gICAgfVxuICB9XG5cbiAgLy8gSWYgcHJldmlvdXNCb2R5T3ZlcmZsb3dTZXR0aW5nIGlzIGFscmVhZHkgc2V0LCBkb24ndCBzZXQgaXQgYWdhaW4uXG4gIGlmIChwcmV2aW91c0JvZHlPdmVyZmxvd1NldHRpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgIHByZXZpb3VzQm9keU92ZXJmbG93U2V0dGluZyA9IGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3c7XG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICB9XG59O1xuXG52YXIgcmVzdG9yZU92ZXJmbG93U2V0dGluZyA9IGZ1bmN0aW9uIHJlc3RvcmVPdmVyZmxvd1NldHRpbmcoKSB7XG4gIGlmIChwcmV2aW91c0JvZHlQYWRkaW5nUmlnaHQgIT09IHVuZGVmaW5lZCkge1xuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0ID0gcHJldmlvdXNCb2R5UGFkZGluZ1JpZ2h0O1xuXG4gICAgLy8gUmVzdG9yZSBwcmV2aW91c0JvZHlQYWRkaW5nUmlnaHQgdG8gdW5kZWZpbmVkIHNvIHNldE92ZXJmbG93SGlkZGVuIGtub3dzIGl0XG4gICAgLy8gY2FuIGJlIHNldCBhZ2Fpbi5cbiAgICBwcmV2aW91c0JvZHlQYWRkaW5nUmlnaHQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAocHJldmlvdXNCb2R5T3ZlcmZsb3dTZXR0aW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gcHJldmlvdXNCb2R5T3ZlcmZsb3dTZXR0aW5nO1xuXG4gICAgLy8gUmVzdG9yZSBwcmV2aW91c0JvZHlPdmVyZmxvd1NldHRpbmcgdG8gdW5kZWZpbmVkXG4gICAgLy8gc28gc2V0T3ZlcmZsb3dIaWRkZW4ga25vd3MgaXQgY2FuIGJlIHNldCBhZ2Fpbi5cbiAgICBwcmV2aW91c0JvZHlPdmVyZmxvd1NldHRpbmcgPSB1bmRlZmluZWQ7XG4gIH1cbn07XG5cbnZhciBzZXRQb3NpdGlvbkZpeGVkID0gZnVuY3Rpb24gc2V0UG9zaXRpb25GaXhlZCgpIHtcbiAgcmV0dXJuIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgIC8vIElmIHByZXZpb3VzQm9keVBvc2l0aW9uIGlzIGFscmVhZHkgc2V0LCBkb24ndCBzZXQgaXQgYWdhaW4uXG4gICAgaWYgKHByZXZpb3VzQm9keVBvc2l0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHByZXZpb3VzQm9keVBvc2l0aW9uID0ge1xuICAgICAgICBwb3NpdGlvbjogZG9jdW1lbnQuYm9keS5zdHlsZS5wb3NpdGlvbixcbiAgICAgICAgdG9wOiBkb2N1bWVudC5ib2R5LnN0eWxlLnRvcCxcbiAgICAgICAgbGVmdDogZG9jdW1lbnQuYm9keS5zdHlsZS5sZWZ0XG4gICAgICB9O1xuXG4gICAgICAvLyBVcGRhdGUgdGhlIGRvbSBpbnNpZGUgYW4gYW5pbWF0aW9uIGZyYW1lIFxuICAgICAgdmFyIF93aW5kb3cgPSB3aW5kb3csXG4gICAgICAgICAgc2Nyb2xsWSA9IF93aW5kb3cuc2Nyb2xsWSxcbiAgICAgICAgICBzY3JvbGxYID0gX3dpbmRvdy5zY3JvbGxYLFxuICAgICAgICAgIGlubmVySGVpZ2h0ID0gX3dpbmRvdy5pbm5lckhlaWdodDtcblxuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XG4gICAgICBkb2
10072N1bWVudC5ib2R5LnN0eWxlLnRvcCA9IC1zY3JvbGxZO1xuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5sZWZ0ID0gLXNjcm9sbFg7XG5cbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gQXR0ZW1wdCB0byBjaGVjayBpZiB0aGUgYm90dG9tIGJhciBhcHBlYXJlZCBkdWUgdG8gdGhlIHBvc2l0aW9uIGNoYW5nZVxuICAgICAgICAgIHZhciBib3R0b21CYXJIZWlnaHQgPSBpbm5lckhlaWdodCAtIHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICAgICAgICBpZiAoYm90dG9tQmFySGVpZ2h0ICYmIHNjcm9sbFkgPj0gaW5uZXJIZWlnaHQpIHtcbiAgICAgICAgICAgIC8vIE1vdmUgdGhlIGNvbnRlbnQgZnVydGhlciB1cCBzbyB0aGF0IHRoZSBib3R0b20gYmFyIGRvZXNuJ3QgaGlkZSBpdFxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS50b3AgPSAtKHNjcm9sbFkgKyBib3R0b21CYXJIZWlnaHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9LCAzMDApO1xuICAgIH1cbiAgfSk7XG59O1xuXG52YXIgcmVzdG9yZVBvc2l0aW9uU2V0dGluZyA9IGZ1bmN0aW9uIHJlc3RvcmVQb3NpdGlvblNldHRpbmcoKSB7XG4gIGlmIChwcmV2aW91c0JvZHlQb3NpdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gQ29udmVydCB0aGUgcG9zaXRpb24gZnJvbSBcInB4XCIgdG8gSW50XG4gICAgdmFyIHkgPSAtcGFyc2VJbnQoZG9jdW1lbnQuYm9keS5zdHlsZS50b3AsIDEwKTtcbiAgICB2YXIgeCA9IC1wYXJzZUludChkb2N1bWVudC5ib2R5LnN0eWxlLmxlZnQsIDEwKTtcblxuICAgIC8vIFJlc3RvcmUgc3R5bGVzXG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5wb3NpdGlvbiA9IHByZXZpb3VzQm9keVBvc2l0aW9uLnBvc2l0aW9uO1xuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUudG9wID0gcHJldmlvdXNCb2R5UG9zaXRpb24udG9wO1xuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUubGVmdCA9IHByZXZpb3VzQm9keVBvc2l0aW9uLmxlZnQ7XG5cbiAgICAvLyBSZXN0b3JlIHNjcm9sbFxuICAgIHdpbmRvdy5zY3JvbGxUbyh4LCB5KTtcblxuICAgIHByZXZpb3VzQm9keVBvc2l0aW9uID0gdW5kZWZpbmVkO1xuICB9XG59O1xuXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudC9zY3JvbGxIZWlnaHQjUHJvYmxlbXNfYW5kX3NvbHV0aW9uc1xudmFyIGlzVGFyZ2V0RWxlbWVudFRvdGFsbHlTY3JvbGxlZCA9IGZ1bmN0aW9uIGlzVGFyZ2V0RWxlbWVudFRvdGFsbHlTY3JvbGxlZCh0YXJnZXRFbGVtZW50KSB7XG4gIHJldHVybiB0YXJnZXRFbGVtZW50ID8gdGFyZ2V0RWxlbWVudC5zY3JvbGxIZWlnaHQgLSB0YXJnZXRFbGVtZW50LnNjcm9sbFRvcCA8PSB0YXJnZXRFbGVtZW50LmNsaWVudEhlaWdodCA6IGZhbHNlO1xufTtcblxudmFyIGhhbmRsZVNjcm9sbCA9IGZ1bmN0aW9uIGhhbmRsZVNjcm9sbChldmVudCwgdGFyZ2V0RWxlbWVudCkge1xuICB2YXIgY2xpZW50WSA9IGV2ZW50LnRhcmdldFRvdWNoZXNbMF0uY2xpZW50WSAtIGluaXRpYWxDbGllbnRZO1xuXG4gIGlmIChhbGxvd1RvdWNoTW92ZShldmVudC50YXJnZXQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHRhcmdldEVsZW1lbnQgJiYgdGFyZ2V0RWxlbWVudC5zY3JvbGxUb3AgPT09IDAgJiYgY2xpZW50WSA+IDApIHtcbiAgICAvLyBlbGVtZW50IGlzIGF0IHRoZSB0b3Agb2YgaXRzIHNjcm9sbC5cbiAgICByZXR1cm4gcHJldmVudERlZmF1bHQoZXZlbnQpO1xuICB9XG5cbiAgaWYgKGlzVGFyZ2V0RWxlbWVudFRvdGFsbHlTY3JvbGxlZCh0YXJnZXRFbGVtZW50KSAmJiBjbGllbnRZIDwgMCkge1xuICAgIC8vIGVsZW1lbnQgaXMgYXQgdGhlIGJvdHRvbSBvZiBpdHMgc2Nyb2xsLlxuICAgIHJldHVybiBwcmV2ZW50RGVmYXVsdChldmVudCk7XG4gIH1cblxuICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgcmV0dXJuIHRydWU7XG59O1xuXG5leHBvcnQgdmFyIGRpc2FibGVCb2R5U2Nyb2xsID0gZnVuY3Rpb24gZGlzYWJsZUJvZHlTY3JvbGwodGFyZ2V0RWxlbWVudCwgb3B0aW9ucykge1xuICAvLyB0YXJnZXRFbGVtZW50IG11c3QgYmUgcHJvdmlkZWRcbiAgaWYgKCF0YXJnZXRFbGVtZW50KSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmVycm9yKCdkaXNhYmxlQm9keVNjcm9sbCB1bnN1Y2Nlc3NmdWwgLSB0YXJnZXRFbGVtZW50IG11c3QgYmUgcHJvdmlkZWQgd2hlbiBjYWxsaW5nIGRpc2FibGVCb2R5U2Nyb2xsIG9uIElPUyBkZXZpY2VzLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIGRpc2FibGVCb2R5U2Nyb2xsIG11c3Qgbm90IGhhdmUgYmVlbiBjYWxsZWQgb24gdGhpcyB0YXJnZXRFbGVtZW50IGJlZm9yZVxuICBpZiAobG9ja3Muc29tZShmdW5jdGlvbiAobG9jaykge1xuICAgIHJldHVybiBsb2NrLnRhcmdldEVsZW1lbnQgPT09IHRhcmdldEVsZW1lbnQ7XG4gIH0pKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGxvY2sgPSB7XG4gICAgdGFyZ2V0RWxlbWVudDogdGFyZ2V0RWxlbWVudCxcbiAgICBvcHRpb25zOiBvcHRpb25zIHx8IHt9XG4gIH07XG5cbiAgbG9ja3MgPSBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGxvY2tzKSwgW2xvY2tdKTtcblxuICBpZiAoaXNJb3NEZXZpY2UpIHtcbiAgICBzZXRQb3NpdGlvbkZpeGVkKCk7XG4gIH0gZWxzZSB7XG4gICAgc2V0T3ZlcmZsb3dIaWRkZW4ob3B0aW9ucyk7XG4gIH1cblxuICBpZiAoaXNJb3NEZXZpY2UpIHtcbiAgICB0YXJnZXRFbGVtZW50Lm9udG91Y2hzdGFydCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgaWYgKGV2ZW50LnRhcmdldFRvdWNoZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIC8vIGRldGVjdCBzaW5nbGUgdG91Y2guXG4gICAgICAgIGluaXRpYWxDbGllbnRZID0gZXZlbnQudGFyZ2V0VG91Y2hlc1swXS5jbGllbnRZO1xuICAgICAgfVxuICAgIH07XG4gICAgdGFyZ2V0RWxlbWVudC5vbnRvdWNobW92ZSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgaWYgKGV2ZW50LnRhcmdldFRvdWNoZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIC8vIGRldGVjdCBzaW5nbGUgdG91Y2guXG4gICAgICAgIGhhbmRsZVNjcm9sbChldmVudCwgdGFyZ2V0RWxlbWVudCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmICghZG9jdW1lbnRMaXN0ZW5lckFkZGVkKSB7XG4gICAgICBkb2
10072N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBwcmV2ZW50RGVmYXVsdCwgaGFzUGFzc2l2ZUV2ZW50cyA/IHsgcGFzc2l2ZTogZmFsc2UgfSA6IHVuZGVmaW5lZCk7XG4gICAgICBkb2N1bWVudExpc3RlbmVyQWRkZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IHZhciBjbGVhckFsbEJvZHlTY3JvbGxMb2NrcyA9IGZ1bmN0aW9uIGNsZWFyQWxsQm9keVNjcm9sbExvY2tzKCkge1xuICBpZiAoaXNJb3NEZXZpY2UpIHtcbiAgICAvLyBDbGVhciBhbGwgbG9ja3Mgb250b3VjaHN0YXJ0L29udG91Y2htb3ZlIGhhbmRsZXJzLCBhbmQgdGhlIHJlZmVyZW5jZXMuXG4gICAgbG9ja3MuZm9yRWFjaChmdW5jdGlvbiAobG9jaykge1xuICAgICAgbG9jay50YXJnZXRFbGVtZW50Lm9udG91Y2hzdGFydCA9IG51bGw7XG4gICAgICBsb2NrLnRhcmdldEVsZW1lbnQub250b3VjaG1vdmUgPSBudWxsO1xuICAgIH0pO1xuXG4gICAgaWYgKGRvY3VtZW50TGlzdGVuZXJBZGRlZCkge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgcHJldmVudERlZmF1bHQsIGhhc1Bhc3NpdmVFdmVudHMgPyB7IHBhc3NpdmU6IGZhbHNlIH0gOiB1bmRlZmluZWQpO1xuICAgICAgZG9jdW1lbnRMaXN0ZW5lckFkZGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgaW5pdGlhbCBjbGllbnRZLlxuICAgIGluaXRpYWxDbGllbnRZID0gLTE7XG4gIH1cblxuICBpZiAoaXNJb3NEZXZpY2UpIHtcbiAgICByZXN0b3JlUG9zaXRpb25TZXR0aW5nKCk7XG4gIH0gZWxzZSB7XG4gICAgcmVzdG9yZU92ZXJmbG93U2V0dGluZygpO1xuICB9XG5cbiAgbG9ja3MgPSBbXTtcbn07XG5cbmV4cG9ydCB2YXIgZW5hYmxlQm9keVNjcm9sbCA9IGZ1bmN0aW9uIGVuYWJsZUJvZHlTY3JvbGwodGFyZ2V0RWxlbWVudCkge1xuICBpZiAoIXRhcmdldEVsZW1lbnQpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUuZXJyb3IoJ2VuYWJsZUJvZHlTY3JvbGwgdW5zdWNjZXNzZnVsIC0gdGFyZ2V0RWxlbWVudCBtdXN0IGJlIHByb3ZpZGVkIHdoZW4gY2FsbGluZyBlbmFibGVCb2R5U2Nyb2xsIG9uIElPUyBkZXZpY2VzLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxvY2tzID0gbG9ja3MuZmlsdGVyKGZ1bmN0aW9uIChsb2NrKSB7XG4gICAgcmV0dXJuIGxvY2sudGFyZ2V0RWxlbWVudCAhPT0gdGFyZ2V0RWxlbWVudDtcbiAgfSk7XG5cbiAgaWYgKGlzSW9zRGV2aWNlKSB7XG4gICAgdGFyZ2V0RWxlbWVudC5vbnRvdWNoc3RhcnQgPSBudWxsO1xuICAgIHRhcmdldEVsZW1lbnQub250b3VjaG1vdmUgPSBudWxsO1xuXG4gICAgaWYgKGRvY3VtZW50TGlzdGVuZXJBZGRlZCAmJiBsb2Nrcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHByZXZlbnREZWZhdWx0LCBoYXNQYXNzaXZlRXZlbnRzID8geyBwYXNzaXZlOiBmYWxzZSB9IDogdW5kZWZpbmVkKTtcbiAgICAgIGRvY3VtZW50TGlzdGVuZXJBZGRlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChpc0lvc0RldmljZSkge1xuICAgIHJlc3RvcmVQb3NpdGlvblNldHRpbmcoKTtcbiAgfSBlbHNlIHtcbiAgICByZXN0b3JlT3ZlcmZsb3dTZXR0aW5nKCk7XG4gIH1cbn07XG5cbiIsIid1c2Ugc3RyaWN0J1xyXG5cclxuLyoqXHJcbiAqIEBtb2R1bGVcclxuICogQHZlcnNpb24gMy4xLjBcclxuICogQGF1dGhvciBPbGVnIER1dGNoZW5rbyA8ZHV0Y2hlbmtvLm8uZGV2QGdtYWlsLmNvbT5cclxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93ZXpvbWFnZW5jeS5naXRodWIuaW8vYnJvd3Nlcml6ci99XHJcbiAqIEBsaWNlbmNlIE1JVFxyXG4gKi9cclxuXHJcbi8qIGVzbGludC1kaXNhYmxlIG5vLXJldHVybi1hc3NpZ24gKi9cclxuXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLy8gUHVibGljXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbmNvbnN0IEJyb3dzZXJpenIgPSAoZnVuY3Rpb24gKHdpbmRvdywgbmF2aWdhdG9yLCBzY3JlZW4pIHtcclxuICBsZXQgdWEgPSBuYXZpZ2F0b3IudXNlckFnZW50XHJcbiAgbGV0IHBsYXRmb3JtID0gbmF2aWdhdG9yLnBsYXRmb3JtXHJcbiAgbGV0IHdpZHRoID0gc2NyZWVuLndpZHRoXHJcbiAgbGV0IGhlaWdodCA9IHNjcmVlbi5oZWlnaHRcclxuICBpZiAod2lkdGggPiBoZWlnaHQpIHtcclxuICAgIGxldCB0ZW1wID0gaGVpZ2h0XHJcbiAgICBoZWlnaHQgPSB3aWR0aFxyXG4gICAgd2lkdGggPSB0ZW1wXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAY29uc3RydWN0b3JcclxuICAgKi9cclxuICBmdW5jdGlvbiBCcm93c2VyaXpyICgpIHt9XHJcblxyXG4gIGxldCBpc0FuZHJvaWQgPSBudWxsXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNBbmRyb2lkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgcmV0dXJuIGlzQW5kcm9pZCA9PT0gbnVsbCA/IChpc0FuZHJvaWQgPSAvYW5kcm9pZC9pLnRlc3QodWEpKSA6IGlzQW5kcm9pZFxyXG4gIH1cclxuXHJcbiAgbGV0IGlzQW5kcm9pZDMgPSBudWxsXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNBbmRyb2lkMyA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBpc0FuZHJvaWQzID09PSBudWxsID8gKGlzQW5kcm9pZDMgPSAvYW5kcm9pZCAzL2kudGVzdCh1YSkpIDogaXNBbmRyb2lkM1xyXG4gIH1cclxuXHJcbiAgbGV0IGlzQW5kcm9pZDQgPSBudWxsXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNBbmRyb2lkNCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBpc0FuZHJvaWQ0ID09PSBudWxsID8gKGlzQW5kcm9pZDQgPSAvYW5kcm9pZCA0L2kudGVzdCh1YSkpIDogaXNBbmRyb2lkNFxyXG4gIH1cclxuXHJcbiAgbGV0IGlzQW5kcm9pZDUgPSBudWxsXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNBbmRyb2lkNSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybi
10072Bpc0FuZHJvaWQ1ID09PSBudWxsID8gKGlzQW5kcm9pZDUgPSAvYW5kcm9pZCA1L2kudGVzdCh1YSkpIDogaXNBbmRyb2lkNVxyXG4gIH1cclxuXHJcbiAgbGV0IGlzQW5kcm9pZDYgPSBudWxsXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNBbmRyb2lkNiA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBpc0FuZHJvaWQ2ID09PSBudWxsID8gKGlzQW5kcm9pZDYgPSAvYW5kcm9pZCA2L2kudGVzdCh1YSkpIDogaXNBbmRyb2lkNlxyXG4gIH1cclxuXHJcbiAgbGV0IGlzQW5kcm9pZDcgPSBudWxsXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNBbmRyb2lkNyA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBpc0FuZHJvaWQ3ID09PSBudWxsID8gKGlzQW5kcm9pZDcgPSAvYW5kcm9pZCA3L2kudGVzdCh1YSkpIDogaXNBbmRyb2lkN1xyXG4gIH1cclxuXHJcbiAgbGV0IGlzQW5kcm9pZDggPSBudWxsXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNBbmRyb2lkOCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBpc0FuZHJvaWQ4ID09PSBudWxsID8gKGlzQW5kcm9pZDggPSAvYW5kcm9pZCA4L2kudGVzdCh1YSkpIDogaXNBbmRyb2lkOFxyXG4gIH1cclxuXHJcbiAgbGV0IGlzTWVpenVQaG9uZSA9IG51bGxcclxuICAvKiogQHJldHVybiB7Ym9vbGVhbn0gKi9cclxuICBCcm93c2VyaXpyLnByb3RvdHlwZS5pc01laXp1UGhvbmUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gaXNNZWl6dVBob25lID09PSBudWxsID8gKGlzTWVpenVQaG9uZSA9IC9BbmRyb2lkXFxzLipNWigtKT8vaS50ZXN0KHVhKSkgOiBpc01laXp1UGhvbmVcclxuICB9XHJcblxyXG4gIGxldCBpc01laXp1Tm90ZVBob25lID0gbnVsbFxyXG4gIC8qKiBAcmV0dXJuIHtib29sZWFufSAqL1xyXG4gIEJyb3dzZXJpenIucHJvdG90eXBlLmlzTWVpenVOb3RlUGhvbmUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gaXNNZWl6dU5vdGVQaG9uZSA9PT0gbnVsbCA/IChpc01laXp1Tm90ZVBob25lID0gL0FuZHJvaWRcXHMuKk1aKC0pPy4qXFxzbm90ZVxccy9pLnRlc3QodWEpKSA6IGlzTWVpenVOb3RlUGhvbmVcclxuICB9XHJcblxyXG4gIGxldCBpc1JlZG1pUGhvbmUgPSBudWxsXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNSZWRtaVBob25lID0gZnVuY3Rpb24gKCkge1xyXG4gICAgcmV0dXJuIGlzUmVkbWlQaG9uZSA9PT0gbnVsbCA/IChpc1JlZG1pUGhvbmUgPSAvQW5kcm9pZFxccy4qUmVkbWlcXHMvaS50ZXN0KHVhKSkgOiBpc1JlZG1pUGhvbmVcclxuICB9XHJcblxyXG4gIGxldCBpc1JlZG1pTm90ZVBob25lID0gbnVsbFxyXG4gIC8qKiBAcmV0dXJuIHtib29sZWFufSAqL1xyXG4gIEJyb3dzZXJpenIucHJvdG90eXBlLmlzUmVkbWlOb3RlUGhvbmUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gaXNSZWRtaU5vdGVQaG9uZSA9PT0gbnVsbCA/IChpc1JlZG1pTm90ZVBob25lID0gL0FuZHJvaWRcXHMuKlJlZG1pLipcXHNOb3RlXFxzL2kudGVzdCh1YSkpIDogaXNSZWRtaU5vdGVQaG9uZVxyXG4gIH1cclxuXHJcbiAgbGV0IGlzSVBhZCA9IG51bGxcclxuICAvKiogQHJldHVybiB7Ym9vbGVhbn0gKi9cclxuICBCcm93c2VyaXpyLnByb3RvdHlwZS5pc0lQYWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gaXNJUGFkID09PSBudWxsID8gKGlzSVBhZCA9IC9pUGFkL2kudGVzdCh1YSkpIDogaXNJUGFkXHJcbiAgfVxyXG5cclxuICBsZXQgaXNJUG9kID0gbnVsbFxyXG4gIC8qKiBAcmV0dXJuIHtib29sZWFufSAqL1xyXG4gIEJyb3dzZXJpenIucHJvdG90eXBlLmlzSVBvZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBpc0lQb2QgPT09IG51bGwgPyAoaXNJUG9kID0gL2lQb2QvaS50ZXN0KHVhKSkgOiBpc0lQb2RcclxuICB9XHJcblxyXG4gIGxldCBpc0lQaG9uZSA9IG51bGxcclxuICAvKiogQHJldHVybiB7Ym9vbGVhbn0gKi9cclxuICBCcm93c2VyaXpyLnByb3RvdHlwZS5pc0lQaG9uZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBpc0lQaG9uZSA9PT0gbnVsbCA/IChpc0lQaG9uZSA9IC9pUGhvbmUvaS50ZXN0KHVhKSkgOiBpc0lQaG9uZVxyXG4gIH1cclxuXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNJUGhvbmU0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaXNJUGhvbmUoKSAmJiB3aWR0aCA9PT0gMzIwICYmIGhlaWdodCA9PT0gNDgwXHJcbiAgfVxyXG5cclxuICAvKiogQHJldHVybiB7Ym9vbGVhbn0gKi9cclxuICBCcm93c2VyaXpyLnByb3RvdHlwZS5pc0lQaG9uZTUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5pc0lQaG9uZSgpICYmIHdpZHRoID09PSAzMjAgJiYgaGVpZ2h0ID09PSA1NjhcclxuICB9XHJcblxyXG4gIC8qKiBAcmV0dXJuIHtib29sZWFufSAqL1xyXG4gIEJyb3dzZXJpenIucHJvdG90eXBlLmlzSVBob25lNjc4ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaXNJUGhvbmUoKSAmJiB3aWR0aCA9PT0gMzc1ICYmIGhlaWdodCA9PT0gNjY3XHJcbiAgfVxyXG5cclxuICAvKiogQHJldHVybiB7Ym9vbGVhbn0gKi9cclxuICBCcm93c2VyaXpyLnByb3RvdHlwZS5pc0lQaG9uZTY3OHBsdXMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5pc0lQaG9uZSgpICYmIHdpZHRoID09PSA0MTQgJiYgaGVpZ2h0ID09PSA3MzZcclxuICB9XHJcblxyXG4gIC8qKiBAcmV0dXJuIHtib29sZWFufSAqL1xyXG4gIEJyb3dzZXJpenIucHJvdG90eXBlLmlzSVBob25lWCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiB0aGlzLmlzSVBob25lKCkgJiYgd2lkdGggPT09IDM3NSAmJiBoZWlnaHQgPT09IDgxMlxyXG4gIH1cclxuXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNJT1MgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5pc0lQYWQoKSB8fCB0aGlzLmlzSVBvZCgpIHx8IHRoaXMuaXNJUGhvbmUoKVxyXG4gIH1cclxuXHJcbiAgbGV0IGlzTWFjID0gbnVsbFxyXG4gIC8qKiBAcmV0dXJuIHtib29sZWFufSAqL1xyXG4gIEJyb3dzZXJpenIucHJvdG90eXBlLmlzTWFjID0gZnVuY3Rpb24gKCkge1xyXG4gICAgcmV0dXJuIGlzTWFjID09PSBudWxsID8gKGlzTWFjID0gL01hYy8udGVzdChwbGF0Zm9ybSkpIDogaXNNYWNcclxuICB9XHJcblxyXG4gIC8qKiBAcmV0dXJuIHtib29sZWFufSAqL1xyXG4gIEJyb3dzZXJpenIucHJvdG90eXBlLmlzTWFjTGlrZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybi
10072B0aGlzLmlzTWFjKCkgfHwgdGhpcy5pc0lPUygpXHJcbiAgfVxyXG5cclxuICBsZXQgaXNCbGFja0JlcnJ5ID0gbnVsbFxyXG4gIC8qKiBAcmV0dXJuIHtib29sZWFufSAqL1xyXG4gIEJyb3dzZXJpenIucHJvdG90eXBlLmlzQmxhY2tCZXJyeSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBpc0JsYWNrQmVycnkgPT09IG51bGwgPyAoaXNCbGFja0JlcnJ5ID0gL0JsYWNrQmVycnkvaS50ZXN0KHVhKSkgOiBpc0JsYWNrQmVycnlcclxuICB9XHJcblxyXG4gIGxldCBpc0JsYWNrQmVycnkxMCA9IG51bGxcclxuICAvKiogQHJldHVybiB7Ym9vbGVhbn0gKi9cclxuICBCcm93c2VyaXpyLnByb3RvdHlwZS5pc0JsYWNrQmVycnkxMCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBpc0JsYWNrQmVycnkxMCA9PT0gbnVsbCA/IChpc0JsYWNrQmVycnkxMCA9IC9CQjEwOy9pLnRlc3QodWEpKSA6IGlzQmxhY2tCZXJyeTEwXHJcbiAgfVxyXG5cclxuICBsZXQgaXNNb3ogPSBudWxsXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNNb3ogPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gaXNNb3ogPT09IG51bGwgPyAoaXNNb3ogPSAvIEZpcmVmb3hcXC8vaS50ZXN0KHVhKSkgOiBpc01velxyXG4gIH1cclxuXHJcbiAgbGV0IGlzT3BlcmEgPSBudWxsXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNPcGVyYSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBpc09wZXJhID09PSBudWxsID8gKGlzT3BlcmEgPSAvT3BlcmF8T1BSXFwvL2kudGVzdCh1YSkpIDogaXNPcGVyYVxyXG4gIH1cclxuXHJcbiAgbGV0IGlzU2FmYXJpID0gbnVsbFxyXG4gIC8qKiBAcmV0dXJuIHtib29sZWFufSAqL1xyXG4gIEJyb3dzZXJpenIucHJvdG90eXBlLmlzU2FmYXJpID0gZnVuY3Rpb24gKCkge1xyXG4gICAgcmV0dXJuIGlzU2FmYXJpID09PSBudWxsID8gKGlzU2FmYXJpID0gKC8gU2FmYXJpXFwvXFxkLy50ZXN0KHVhKSAmJiAhLyBDaHJvbWVcXC9cXGQvLnRlc3QodWEpKSkgOiBpc1NhZmFyaVxyXG4gIH1cclxuXHJcbiAgbGV0IGlzQ2hyb21lID0gbnVsbFxyXG4gIC8qKiBAcmV0dXJuIHtib29sZWFufSAqL1xyXG4gIEJyb3dzZXJpenIucHJvdG90eXBlLmlzQ2hyb21lID0gZnVuY3Rpb24gKCkge1xyXG4gICAgaWYgKGlzQ2hyb21lID09PSBudWxsKSB7XHJcbiAgICAgIGlzQ2hyb21lID0gKFxyXG4gICAgICAgIC8gQ2hyb21lXFwvXFxkL2kudGVzdCh1YSkgJiZcclxuICAgICAgICAhKFxyXG4gICAgICAgICAgdGhpcy5pc09wZXJhKCkgfHxcclxuICAgICAgICAgIHRoaXMuaXNTYWZhcmkoKSB8fFxyXG4gICAgICAgICAgdGhpcy5pc0VkZ2UoKSB8fFxyXG4gICAgICAgICAgdGhpcy5pc0VkZ2VJT1MoKSB8fFxyXG4gICAgICAgICAgdGhpcy5pc0VkZ2VBbmRyb2lkKClcclxuICAgICAgICApXHJcbiAgICAgIClcclxuICAgIH1cclxuICAgIHJldHVybiBpc0Nocm9tZVxyXG4gIH1cclxuXHJcbiAgbGV0IGlzSUUgPSBudWxsXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNJRSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBpc0lFID09PSBudWxsID8gKGlzSUUgPSAvKE1TSUV8VHJpZGVudCkvaS50ZXN0KHVhKSkgOiBpc0lFXHJcbiAgfVxyXG5cclxuICBsZXQgaXNJRTggPSBudWxsXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNJRTggPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gaXNJRTggPT09IG51bGwgPyAoaXNJRTggPSAvTVNJRSA4XFwuXFxkL2kudGVzdCh1YSkpIDogaXNJRThcclxuICB9XHJcblxyXG4gIGxldCBpc0lFOSA9IG51bGxcclxuICAvKiogQHJldHVybiB7Ym9vbGVhbn0gKi9cclxuICBCcm93c2VyaXpyLnByb3RvdHlwZS5pc0lFOSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBpc0lFOSA9PT0gbnVsbCA/IChpc0lFOSA9IC9NU0lFIDlcXC5cXGQvaS50ZXN0KHVhKSkgOiBpc0lFOVxyXG4gIH1cclxuXHJcbiAgbGV0IGlzSUUxMCA9IG51bGxcclxuICAvKiogQHJldHVybiB7Ym9vbGVhbn0gKi9cclxuICBCcm93c2VyaXpyLnByb3RvdHlwZS5pc0lFMTAgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gaXNJRTEwID09PSBudWxsID8gKGlzSUUxMCA9IC9NU0lFIDEwXFwuXFxkL2kudGVzdCh1YSkpIDogaXNJRTEwXHJcbiAgfVxyXG5cclxuICBsZXQgaXNJRTExID0gbnVsbFxyXG4gIC8qKiBAcmV0dXJuIHtib29sZWFufSAqL1xyXG4gIEJyb3dzZXJpenIucHJvdG90eXBlLmlzSUUxMSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBpc0lFMTEgPT09IG51bGwgPyAoaXNJRTExID0gL1RyaWRlbnQuKnJ2WyA6XSoxMVxcLi8udGVzdCh1YSkpIDogaXNJRTExXHJcbiAgfVxyXG5cclxuICBsZXQgaXNFZGdlID0gbnVsbFxyXG4gIC8qKiBAcmV0dXJuIHtib29sZWFufSAqL1xyXG4gIEJyb3dzZXJpenIucHJvdG90eXBlLmlzRWRnZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBpc0VkZ2UgPT09IG51bGwgPyAoaXNFZGdlID0gLyBFZGdlXFwvXFxkL2kudGVzdCh1YSkpIDogaXNFZGdlXHJcbiAgfVxyXG5cclxuICBsZXQgaXNFZGdlSU9TID0gbnVsbFxyXG4gIC8qKiBAcmV0dXJuIHtib29sZWFufSAqL1xyXG4gIEJyb3dzZXJpenIucHJvdG90eXBlLmlzRWRnZUlPUyA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBpc0VkZ2VJT1MgPT09IG51bGwgPyAoaXNFZGdlSU9TID0gL1xcc0VkZ2lPU1xcLy9pLnRlc3QodWEpKSA6IGlzRWRnZUlPU1xyXG4gIH1cclxuXHJcbiAgbGV0IGlzRWRnZUFuZHJvaWQgPSBudWxsXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNFZGdlQW5kcm9pZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBpc0VkZ2VBbmRyb2lkID09PSBudWxsID8gKGlzRWRnZUFuZHJvaWQgPSAvXFxzRWRnQVxcLy9pLnRlc3QodWEpKSA6IGlzRWRnZUFuZHJvaWRcclxuICB9XHJcblxyXG4gIGxldCBpc1dpbmRvd3NQaG9uZSA9IG51bGxcclxuICAvKiogQHJldHVybi
10072B7Ym9vbGVhbn0gKi9cclxuICBCcm93c2VyaXpyLnByb3RvdHlwZS5pc1dpbmRvd3NQaG9uZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBpc1dpbmRvd3NQaG9uZSA9PT0gbnVsbCA/IChpc1dpbmRvd3NQaG9uZSA9IC9XaW5kb3dzXFxzUGhvbmUvaS50ZXN0KHVhKSkgOiBpc1dpbmRvd3NQaG9uZVxyXG4gIH1cclxuXHJcbiAgbGV0IGlzV2luZG93cyA9IG51bGxcclxuICAvKiogQHJldHVybiB7Ym9vbGVhbn0gKi9cclxuICBCcm93c2VyaXpyLnByb3RvdHlwZS5pc1dpbmRvd3MgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gaXNXaW5kb3dzID09PSBudWxsID8gKGlzV2luZG93cyA9IC9ed2luL2kudGVzdChwbGF0Zm9ybSkpIDogaXNXaW5kb3dzXHJcbiAgfVxyXG5cclxuICBsZXQgaXNXaW5kb3dzWFAgPSBudWxsXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNXaW5kb3dzWFAgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gaXNXaW5kb3dzWFAgPT09IG51bGwgPyAoaXNXaW5kb3dzWFAgPSAvd2luZG93cyBudCA1XFwuMS9pLnRlc3QodWEpKSA6IGlzV2luZG93c1hQXHJcbiAgfVxyXG5cclxuICBsZXQgaXNXaW5kb3dzVmlzdGEgPSBudWxsXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNXaW5kb3dzVmlzdGEgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gaXNXaW5kb3dzVmlzdGEgPT09IG51bGwgPyAoaXNXaW5kb3dzVmlzdGEgPSAvd2luZG93cyBudCA2XFwuMC9pLnRlc3QodWEpKSA6IGlzV2luZG93c1Zpc3RhXHJcbiAgfVxyXG5cclxuICBsZXQgaXNXaW5kb3dzNyA9IG51bGxcclxuICAvKiogQHJldHVybiB7Ym9vbGVhbn0gKi9cclxuICBCcm93c2VyaXpyLnByb3RvdHlwZS5pc1dpbmRvd3M3ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgcmV0dXJuIGlzV2luZG93czcgPT09IG51bGwgPyAoaXNXaW5kb3dzNyA9IC93aW5kb3dzIG50IDZcXC4xL2kudGVzdCh1YSkpIDogaXNXaW5kb3dzN1xyXG4gIH1cclxuXHJcbiAgbGV0IGlzV2luZG93czggPSBudWxsXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNXaW5kb3dzOCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBpc1dpbmRvd3M4ID09PSBudWxsID8gKGlzV2luZG93czggPSAvd2luZG93cyBudCA2XFwuWzJ8M10vaS50ZXN0KHVhKSkgOiBpc1dpbmRvd3M4XHJcbiAgfVxyXG5cclxuICBsZXQgaXNXaW5kb3dzMTAgPSBudWxsXHJcbiAgLyoqIEByZXR1cm4ge2Jvb2xlYW59ICovXHJcbiAgQnJvd3Nlcml6ci5wcm90b3R5cGUuaXNXaW5kb3dzMTAgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gaXNXaW5kb3dzMTAgPT09IG51bGwgPyAoaXNXaW5kb3dzMTAgPSAvd2luZG93cyBudCAxMC9pLnRlc3QodWEpKSA6IGlzV2luZG93czEwXHJcbiAgfVxyXG5cclxuICBsZXQgaXNMaW51eCA9IG51bGxcclxuICAvKiogQHJldHVybiB7Ym9vbGVhbn0gKi9cclxuICBCcm93c2VyaXpyLnByb3RvdHlwZS5pc0xpbnV4ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgcmV0dXJuIGlzTGludXggPT09IG51bGwgPyAoaXNMaW51eCA9IC9ebGludXgvaS50ZXN0KHBsYXRmb3JtKSkgOiBpc0xpbnV4XHJcbiAgfVxyXG5cclxuICAvKiogQHJldHVybiB7Ym9vbGVhbn0gKi9cclxuICBCcm93c2VyaXpyLnByb3RvdHlwZS5pc01vYmlsZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMuaXNJT1MoKSB8fFxyXG4gICAgICB0aGlzLmlzQW5kcm9pZCgpIHx8XHJcbiAgICAgIHRoaXMuaXNFZGdlSU9TKCkgfHxcclxuICAgICAgdGhpcy5pc0VkZ2VBbmRyb2lkKCkgfHxcclxuICAgICAgdGhpcy5pc1dpbmRvd3NQaG9uZSgpIHx8XHJcbiAgICAgIHRoaXMuaXNCbGFja0JlcnJ5KCkgfHxcclxuICAgICAgdGhpcy5pc0JsYWNrQmVycnkxMCgpXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICAvKiogQHJldHVybiB7Ym9vbGVhbn0gKi9cclxuICBCcm93c2VyaXpyLnByb3RvdHlwZS5pc0Rlc2t0b3AgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gIXRoaXMuaXNNb2JpbGUoKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdGVzdHNcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2NsYXNzUHJlZml4PVwiXCJdXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbdG9TdHJpbmc9dHJ1ZV1cclxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXX1cclxuICAgKi9cclxuICBCcm93c2VyaXpyLnByb3RvdHlwZS5jc3NDbGFzc2VzID0gZnVuY3Rpb24gKHRlc3RzLCBjbGFzc1ByZWZpeCkge1xyXG4gICAgY2xhc3NQcmVmaXggPSBjbGFzc1ByZWZpeCB8fCAnJ1xyXG4gICAgY29uc3QgY2xhc3NlcyA9IFtdXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXN0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBrZXkgPSB0ZXN0c1tpXVxyXG4gICAgICBjb25zdCBtZXRob2QgPSAnaXMnICsga2V5XHJcbiAgICAgIGlmICh0aGlzW21ldGhvZF0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXNbbWV0aG9kXSgpXHJcbiAgICAgICAgY29uc3QgcHJlZml4ID0gcmVzdWx0ID8gcHJlZml4SXMgOiBwcmVmaXhJc05vdFxyXG4gICAgICAgIGNsYXNzZXMucHVzaChjbGFzc1ByZWZpeCArIHByZWZpeCArIGtleS50b0xvd2VyQ2FzZSgpKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignQnJvd3Nlcml6ciBoYXMgbm8gdGhlIHRlc3QgXCInICsgbWV0aG9kICsgJygpXCInKVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNsYXNzZXNcclxuICB9XHJcblxyXG4gIGxldCBpbnN0YW5jZSA9IG51bGxcclxuICBsZXQgcHJlZml4SXMgPSAnaXMtJ1xyXG4gIGxldCBwcmVmaXhJc05vdCA9ICdpcy1ub3QtJ1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAc3RhdGljXHJcbiAgICAgKiBAcHVibGljXHJcbiAgICAgKiBAcmV0dXJuIHtCcm93c2VyaXpyfVxyXG4gICAgICovXHJcbiAgICBkZXRlY3QgKCkge1xyXG4gICAgICByZXR1cm4gaW5zdGFuY2UgPT09IG51bGwgPyAoaW5zdGFuY2UgPSBuZXcgQnJvd3Nlcml6cigpKSA6IGluc3RhbmNlXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHR5cGUgc3RyaW5nXHJcbiAgICAgKi9cclxuICAgIGdldCBwcmVmaXhJcyAoKSB7XHJcbiAgICAgIHJldHVybi
10072BwcmVmaXhJc1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEB0eXBlIHN0cmluZ1xyXG4gICAgICovXHJcbiAgICBzZXQgcHJlZml4SXMgKHZhbHVlKSB7XHJcbiAgICAgIHByZWZpeElzID0gdmFsdWVcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSBzdHJpbmdcclxuICAgICAqL1xyXG4gICAgZ2V0IHByZWZpeElzTm90ICgpIHtcclxuICAgICAgcmV0dXJuIHByZWZpeElzTm90XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHR5cGUgc3RyaW5nXHJcbiAgICAgKi9cclxuICAgIHNldCBwcmVmaXhJc05vdCAodmFsdWUpIHtcclxuICAgICAgcHJlZml4SXNOb3QgPSB2YWx1ZVxyXG4gICAgfVxyXG4gIH1cclxufSkod2luZG93LCB3aW5kb3cubmF2aWdhdG9yLCB3aW5kb3cuc2NyZWVuKVxyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vLyBFeHBvcnRzXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJyb3dzZXJpenJcclxuIiwiJ3VzZSBzdHJpY3QnO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0aW5nIHRpbWVycyB3aXRoIGludGVybmFsIGNsb3N1cmVcclxuICogQG1vZHVsZVxyXG4gKiBAZXhhbXBsZVxyXG5pbXBvcnQgY3JlYXRlVGltZXIgZnJvbSAnY3JlYXRlLXRpbWVyJztcclxuXHJcbmNvbnN0IHRpbWVyID0gY3JlYXRlVGltZXIoNTAwKTtcclxuJCh3aW5kb3cpLm9uKCdyZXNpemUnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICB0aW1lcigoKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ2RvbmUnKTtcclxuICAgIH0pO1xyXG59KTtcclxuXHJcbnRpbWVyKCgpID0+IHtcclxuICAgIGNvbnNvbGUubG9nKCdqdXN0IHRlc3QnKTtcclxufSwgMzAwKTtcclxuXHJcbi8vIC4uLmNsZWFyIHRpbWVyIGlmIG5lZWRcclxudGltZXIuY2xlYXIoKTtcclxuICovXHJcblxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIFB1YmxpY1xyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4vKipcclxuICogQHR5cGVkZWYge0Z1bmN0aW9ufSB0aW1lclxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2RlZmF1bHREZWxheT0zMDBdXHJcbiAqIEByZXR1cm4ge3RpbWVyfVxyXG4gKi9cclxuZnVuY3Rpb24gY3JlYXRlVGltZXIgKGRlZmF1bHREZWxheSA9IDMwMCkge1xyXG5cdGxldCB0aW1lb3V0SWQgPSBudWxsO1xyXG5cclxuXHQvKipcclxuXHQgKiBAdHlwZSB7dGltZXJ9XHJcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5PWRlZmF1bHREZWxheV1cclxuXHQgKiBAcmV0dXJucyB7bnVtYmVyfSB0aW1lb3V0SWRcclxuXHQgKi9cclxuXHRmdW5jdGlvbiB0aW1lciAoZm4sIGRlbGF5ID0gZGVmYXVsdERlbGF5KSB7XHJcblx0XHR3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XHJcblx0XHR0aW1lb3V0SWQgPSB3aW5kb3cuc2V0VGltZW91dChmbiwgZGVsYXkpO1xyXG5cdFx0cmV0dXJuIHRpbWVvdXRJZDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIGNsZWFyIGN1cnJlbnQgdGltZW91dFxyXG5cdCAqIEBtZXRob2RPZiB0aW1lclxyXG5cdCAqIEByZXR1cm5zIHZvaWRcclxuXHQgKi9cclxuXHR0aW1lci5jbGVhciA9ICgpID0+IHdpbmRvdy5jbGVhclRpbWVvdXQodGltZW91dElkKTtcclxuXHJcblx0cmV0dXJuIHRpbWVyO1xyXG59XHJcblxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIEV4cG9ydHNcclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlVGltZXI7XHJcbiIsIihmdW5jdGlvbiAoKSB7XHJcblx0J3VzZSBzdHJpY3QnO1xyXG5cdC8qKlxyXG5cdCAqIEFkZCBjbGFzc05hbWUgaWYgcHJldmlvdXNseSB3YXMgcmVtb3ZlZC5cclxuXHQgKiBSZW1vdmUgY2xhc3NOYW1lIGlmIHByZXZpb3VzbHkgd2FzIGFkZGVkXHJcblx0ICpcclxuXHQgKiBAZXhhbXBsZVxyXG5cdCAqIGZ1bmN0aW9uIHNob3dTZWN0aW9uICgkc2VjdGlvbiwgJGZyb250aWVyKSB7XHJcblx0ICogICAgIGNvbnN0ICR3aW5kb3cgPSAkKHdpbmRvdyk7XHJcblx0ICogICAgIGxldCBwcmV2aW91c2x5QWRkZWQgPSAkc2VjdGlvbi5oYXNDbGFzcygnc2hvdycpOyAvLyA8LS1cclxuXHQgKiAgICAgJHdpbmRvdy5vbignc2Nyb2xsJywgKCkgPT4ge1xyXG5cdCAqICAgICAgICAgY29uc3QgdG9wID0gJHdpbmRvdy5zY3JvbGxUb3AoKTtcclxuXHQgKiAgICAgICAgIGNvbnN0IGhlaWdodCA9ICRmcm9udGllci5vZmZzZXQoKS50b3AgKyAkZnJvbnRpZXIub3V0ZXJIZWlnaHQoKTtcclxuXHQgKiAgICAgICAgIHByZXZpb3VzbHlBZGRlZCA9ICRzZWN0aW9uLmNoYW5nZU15Q2xhc3ModG9wID4gaGVpZ2h0LCBwcmV2aW91c2x5QWRkZWQsICdzaG93Jyk7ICAvLyA8LS1cclxuXHQgKiAgICAgfSk7XHJcblx0ICogfVxyXG5cdCAqXHJcblx0ICogQG5hbWUgY2hhbmdlTXlDbGFzc1xyXG5cdCAqIEB0aGlzIGpRdWVyeVxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gbmVlZFRvQWRkXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBwcmV2aW91c2x5QWRkZWRcclxuXHQgKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXXxmdW5jdGlvbn0gY2xhc3NOYW1lXHJcblx0ICogQHBhcmFtIHtmdW5jdGlvbn0gW29uQ2hhbmdlXVxyXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBjbGFzc05hbWUgd2FzIGFkZGVkIG9yIG5vdFxyXG5cdCAqIEBzb3VyY2VDb2RlXHJcblx0ICovXHJcblx0alF1ZXJ5LmZuLmNoYW5nZU15Q2xhc3MgPSBmdW5jdGlvbiAobmVlZFRvQWRkLCBwcmV2aW91c2x5QWRkZWQsIGNsYXNzTmFtZSwgb25DaGFuZ2UpIHtcclxuXHRcdGNvbnN0IGNoYW5nZUNsYXNzID0gbmVlZFRvQWRkXHJcblx0XHRcdD8gKHByZXZpb3VzbHlBZGRlZCA/IGZhbHNlIDogJ2FkZENsYXNzJylcclxuXHRcdFx0OiAocHJldmlvdXNseUFkZGVkID8gJ3JlbW92ZUNsYXNzJyA6IGZhbHNlKTtcclxuXHRcdGlmIChjaGFuZ2VDbGFzcykge1xyXG5cdFx0XHRwcmV2aW91c2x5QWRkZWQgPSBjaGFuZ2VDbGFzcyA9PT0gJ2FkZENsYXNzJztcclxuXHRcdFx0dGhpc1tjaGFuZ2VDbGFzc10oY2xhc3NOYW1lKTtcclxuXHRcdFx0aWYgKHR5cGVvZiBvbkNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG5cdFx0XHRcdG9uQ2hhbmdlKHByZXZpb3VzbHlBZGRlZCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybi
10072BwcmV2aW91c2x5QWRkZWQ7XHJcblx0fTtcclxufSkoKTtcclxuIiwiKGZ1bmN0aW9uICgpIHtcclxuXHQndXNlIHN0cmljdCc7XHJcblx0LyoqXHJcblx0ICogU2VhcmNoIG9uIHRoZSBwYWdlIG9yIHJldHJpZXZlIGZyb20gdGhlIGRhdGUgb2YgdGhlIGRlc2lyZWQgaXRlbS5cclxuXHQgKlxyXG5cdCAqIEZpcnN0LCBsb29rIGF0IHRoZSBkYXRlIG9iamVjdCBvbiBhIGNlcnRhaW4gcHJvcGVydHkuXHJcblx0ICogSWYgaXQgaXMgZW1wdHkgLSBsb29rIGZvciB0aGUgZWxlbWVudCBvbiB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yIGluIHRoZSBnaXZlbiBkaXJlY3Rpb24uXHJcblx0ICogV2hlbiBmb3VuZCwgd3JpdGUgaXQgaW4gdGhlIGRhdGUgb2JqZWN0IHRvXHJcblx0ICogYXQgc3Vic2VxdWVudCBjYWxscyAtIHdlIGdldCBmcm9tIHRoZSBkYXRlLCBmYXN0ZXIgYW5kIHdpdGhvdXQgc2VhcmNoaW5nLlxyXG5cdCAqXHJcblx0ICogX19fISEhIElmIGNhbGxlZCBlbGVtZW50IG1vcmUgdGhlbiBvbmUsX19fXHJcblx0ICogX19fdGhlbiB0aGUgbWV0aG9kIGlzIHBlcmZvcm1lZCBvbmx5IGZvciB0aGUgZmlyc3RfX19cclxuXHQgKlxyXG5cdCAqIEBleGFtcGxlIDxjYXB0aW9uPkZpbmQgLyByZXRyaWV2ZSBuZXN0ZWQgaXRlbXM8L2NhcHRpb24+XHJcblx0ICogbGV0ICRlbHMgPSAkKCcud3JhcHBlcicpLmdldE15RWxlbWVudHMoJyRteUVscycsICcuZWxzLXNlbGVjdG9yJywgJ2ZpbmQnKTtcclxuXHQgKlxyXG5cdCAqIEBleGFtcGxlIDxjYXB0aW9uPkZpbmQgLyByZXRyaWV2ZSBuZXN0ZWQgaXRlbXMgb25seSBpbiBjb250ZXh0IGJsb2NrPC9jYXB0aW9uPlxyXG5cdCAqIGxldCAkY29udGV4dCA9ICQoJy5kZW1vJyk7XHJcblx0ICogbGV0ICRlbHMgPSAkKCcud3JhcHBlcicpLmdldE15RWxlbWVudHMoJyRteUVscycsICcuZWxzLXNlbGVjdG9yJywgJGNvbnRleHQpO1xyXG5cdCAqXHJcblx0ICogQGV4YW1wbGUgPGNhcHRpb24+RmluZGluZyAvIGdldHRpbmcgdGhlIHBhcmVudCBlbGVtZW50PC9jYXB0aW9uPlxyXG5cdCAqIGxldCAkd3JhcHBlciA9ICQoJy5lbHMnKS5nZXRNeUVsZW1lbnRzKCckbXlXcmFwcGVyJywgJy53cmFwcGVyLXNlbGVjdG9yJywgJ2Nsb3Nlc3QnKTtcclxuXHQgKlxyXG5cdCAqIEBleGFtcGxlIDxjYXB0aW9uPlNlYXJjaCAvIHJldHJpZXZlIHNpbWlsYXIgaXRlbXMgZXhjZXB0IGZvciB0aGUgY3VycmVudCBvbmU8L2NhcHRpb24+XHJcblx0ICogbGV0ICRzYW1lRWxzID0gJCgnLmVscycpLmdldE15RWxlbWVudHMoJyRteVNhbWVFbHMnLCAnLmVscycsICdkb2N1bWVudCcsIHRydWUpO1xyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGRhdGFLZXkgLSB0aGUgcHJvcGVydHkga2V5IGZyb20gdGhlIGRhdGEgb2JqZWN0IG9mIHRoZSBlbGVtZW50XHJcblx0ICogQHBhcmFtIHtKUXVlcnkuU2VsZWN0b3J9IHNlbGVjdG9yIC0gc2VhcmNoIHNlbGVjdG9yXHJcblx0ICogQHBhcmFtIHtzdHJpbmd8SlF1ZXJ5fSBbZGlyZWN0aW9uPVwiZG9jdW1lbnRcIl0gLSBkaXJlY3Rpb24gd2hlcmUgdG8gbG9vayBmb3IgLSBgW2Nsb3Nlc3QsIHBhcmVudCwgY2hpbGRyZW4sIGZpbmQsIHByZXYsIG5leHQsIHNpYmxpbmdzXWAsIG9yIGNhbiBiZSBqUXVlcnkgZWxlbWVudCBmb3IgZmluZCBzZWxlY3RvciBpbnNpZGVcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtub3RTZWxmXSAtIGlnbm9yZSB0aGUgY3VycmVudCBlbGVtZW50LCB3aGVuIHNlYXJjaGluZyBmb3IgZWxlbWVudHMsIGZvciBleGFtcGxlIGluIGBkb2N1bWVudGAgdXNpbmcgdGhlIHNhbWUgc2VsZWN0b3IgYXMgdGhlIGN1cnJlbnQgZWxlbWVudFxyXG5cdCAqXHJcblx0ICogQG5hbWUgZ2V0TXlFbGVtZW50c1xyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhS2V5XHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXHJcblx0ICogQHBhcmFtIHtzdHJpbmd8alF1ZXJ5fSBbZGlyZWN0aW9uPSdkb2N1bWVudCddXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbZGlyZWN0aW9uPSdkb2N1bWVudCddXHJcblx0ICogQHJldHVybiB7alF1ZXJ5fVxyXG5cdCAqIEBzb3VyY2VDb2RlXHJcblx0ICovXHJcblx0alF1ZXJ5LmZuLmdldE15RWxlbWVudHMgPSBmdW5jdGlvbiAoZGF0YUtleSwgc2VsZWN0b3IsIGRpcmVjdGlvbiA9ICdkb2N1bWVudCcsIG5vdFNlbGYpIHtcclxuXHRcdC8qKiBAdHlwZSB7alF1ZXJ5fSAqL1xyXG5cdFx0Y29uc3QgJGVsZW1lbnQgPSB0aGlzLmVxKDApO1xyXG5cdFx0Y29uc3Qga2V5SXNTZWxlY3RvciA9ICh0eXBlb2YgZGF0YUtleSA9PT0gJ3N0cmluZycpO1xyXG5cdFx0bGV0ICR0YXJnZXQgPSBrZXlJc1NlbGVjdG9yID8gJGVsZW1lbnQuZGF0YShkYXRhS2V5KSA6IG51bGw7XHJcblxyXG5cdFx0aWYgKCEkdGFyZ2V0KSB7XHJcblx0XHRcdGlmIChkaXJlY3Rpb24gPT09ICdkb2N1bWVudCcgfHwgKGRpcmVjdGlvbiAmJiBkaXJlY3Rpb24uanF1ZXJ5KSkge1xyXG5cdFx0XHRcdGlmIChkaXJlY3Rpb24uanF1ZXJ5KSB7XHJcblx0XHRcdFx0XHQkdGFyZ2V0ID0gZGlyZWN0aW9uLmZpbmQoc2VsZWN0b3IpO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHQkdGFyZ2V0ID0galF1ZXJ5KHNlbGVjdG9yKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKCR0YXJnZXQubGVuZ3RoICYmIG5vdFNlbGYpIHtcclxuXHRcdFx0XHRcdCR0YXJnZXQgPSAkdGFyZ2V0Lm5vdCgkZWxlbWVudCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdCR0YXJnZXQgPSAkZWxlbWVudFtkaXJlY3Rpb25dKHNlbGVjdG9yKTtcclxuXHRcdFx0fVxyXG5cdFx0XHQkZWxlbWVudC5kYXRhKGRhdGFLZXksICR0YXJnZXQpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICghJHRhcmdldC5sZW5ndGgpIHtcclxuXHRcdFx0JGVsZW1lbnQuZGF0YShkYXRhS2V5LCBudWxsKTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gJHRhcmdldDtcclxuXHR9O1xyXG59KSgpO1xyXG4iLCIoZnVuY3Rpb24oZ2xvYmFsKXtcblxuLy9cbi8vIENoZWNrIGZvciBuYXRpdmUgUHJvbWlzZSBhbmQgaXQgaGFzIGNvcnJlY3QgaW50ZXJmYWNlXG4vL1xuXG52YXIgTmF0aXZlUHJvbWlzZSA9IGdsb2JhbFsnUHJvbWlzZSddO1xudmFyIG5hdGl2ZVByb21pc2VTdXBwb3J0ZWQgPVxuICBOYXRpdmVQcm9taXNlICYmXG4gIC8vIFNvbWUgb2YgdGhlc2UgbWV0aG9kcyBhcmUgbWlzc2luZyBmcm9tXG4gIC8vIEZpcmVmb3gvQ2hyb21lIGV4cGVyaW1lbn
10072RhbCBpbXBsZW1lbnRhdGlvbnNcbiAgJ3Jlc29sdmUnIGluIE5hdGl2ZVByb21pc2UgJiZcbiAgJ3JlamVjdCcgaW4gTmF0aXZlUHJvbWlzZSAmJlxuICAnYWxsJyBpbiBOYXRpdmVQcm9taXNlICYmXG4gICdyYWNlJyBpbiBOYXRpdmVQcm9taXNlICYmXG4gIC8vIE9sZGVyIHZlcnNpb24gb2YgdGhlIHNwZWMgaGFkIGEgcmVzb2x2ZXIgb2JqZWN0XG4gIC8vIGFzIHRoZSBhcmcgcmF0aGVyIHRoYW4gYSBmdW5jdGlvblxuICAoZnVuY3Rpb24oKXtcbiAgICB2YXIgcmVzb2x2ZTtcbiAgICBuZXcgTmF0aXZlUHJvbWlzZShmdW5jdGlvbihyKXsgcmVzb2x2ZSA9IHI7IH0pO1xuICAgIHJldHVybiB0eXBlb2YgcmVzb2x2ZSA9PT0gJ2Z1bmN0aW9uJztcbiAgfSkoKTtcblxuXG4vL1xuLy8gZXhwb3J0IGlmIG5lY2Vzc2FyeVxuLy9cblxuaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJyAmJiBleHBvcnRzKVxue1xuICAvLyBub2RlLmpzXG4gIGV4cG9ydHMuUHJvbWlzZSA9IG5hdGl2ZVByb21pc2VTdXBwb3J0ZWQgPyBOYXRpdmVQcm9taXNlIDogUHJvbWlzZTtcbiAgZXhwb3J0cy5Qb2x5ZmlsbCA9IFByb21pc2U7XG59XG5lbHNlXG57XG4gIC8vIEFNRFxuICBpZiAodHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG4gIHtcbiAgICBkZWZpbmUoZnVuY3Rpb24oKXtcbiAgICAgIHJldHVybiBuYXRpdmVQcm9taXNlU3VwcG9ydGVkID8gTmF0aXZlUHJvbWlzZSA6IFByb21pc2U7XG4gICAgfSk7XG4gIH1cbiAgZWxzZVxuICB7XG4gICAgLy8gaW4gYnJvd3NlciBhZGQgdG8gZ2xvYmFsXG4gICAgaWYgKCFuYXRpdmVQcm9taXNlU3VwcG9ydGVkKVxuICAgICAgZ2xvYmFsWydQcm9taXNlJ10gPSBQcm9taXNlO1xuICB9XG59XG5cblxuLy9cbi8vIFBvbHlmaWxsXG4vL1xuXG52YXIgUEVORElORyA9ICdwZW5kaW5nJztcbnZhciBTRUFMRUQgPSAnc2VhbGVkJztcbnZhciBGVUxGSUxMRUQgPSAnZnVsZmlsbGVkJztcbnZhciBSRUpFQ1RFRCA9ICdyZWplY3RlZCc7XG52YXIgTk9PUCA9IGZ1bmN0aW9uKCl7fTtcblxuZnVuY3Rpb24gaXNBcnJheSh2YWx1ZSkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn1cblxuLy8gYXN5bmMgY2FsbHNcbnZhciBhc3luY1NldFRpbWVyID0gdHlwZW9mIHNldEltbWVkaWF0ZSAhPT0gJ3VuZGVmaW5lZCcgPyBzZXRJbW1lZGlhdGUgOiBzZXRUaW1lb3V0O1xudmFyIGFzeW5jUXVldWUgPSBbXTtcbnZhciBhc3luY1RpbWVyO1xuXG5mdW5jdGlvbiBhc3luY0ZsdXNoKCl7XG4gIC8vIHJ1biBwcm9taXNlIGNhbGxiYWNrc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFzeW5jUXVldWUubGVuZ3RoOyBpKyspXG4gICAgYXN5bmNRdWV1ZVtpXVswXShhc3luY1F1ZXVlW2ldWzFdKTtcblxuICAvLyByZXNldCBhc3luYyBhc3luY1F1ZXVlXG4gIGFzeW5jUXVldWUgPSBbXTtcbiAgYXN5bmNUaW1lciA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBhc3luY0NhbGwoY2FsbGJhY2ssIGFyZyl7XG4gIGFzeW5jUXVldWUucHVzaChbY2FsbGJhY2ssIGFyZ10pO1xuXG4gIGlmICghYXN5bmNUaW1lcilcbiAge1xuICAgIGFzeW5jVGltZXIgPSB0cnVlO1xuICAgIGFzeW5jU2V0VGltZXIoYXN5bmNGbHVzaCwgMCk7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBpbnZva2VSZXNvbHZlcihyZXNvbHZlciwgcHJvbWlzZSkge1xuICBmdW5jdGlvbiByZXNvbHZlUHJvbWlzZSh2YWx1ZSkge1xuICAgIHJlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVqZWN0UHJvbWlzZShyZWFzb24pIHtcbiAgICByZWplY3QocHJvbWlzZSwgcmVhc29uKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmVzb2x2ZXIocmVzb2x2ZVByb21pc2UsIHJlamVjdFByb21pc2UpO1xuICB9IGNhdGNoKGUpIHtcbiAgICByZWplY3RQcm9taXNlKGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGludm9rZUNhbGxiYWNrKHN1YnNjcmliZXIpe1xuICB2YXIgb3duZXIgPSBzdWJzY3JpYmVyLm93bmVyO1xuICB2YXIgc2V0dGxlZCA9IG93bmVyLnN0YXRlXztcbiAgdmFyIHZhbHVlID0gb3duZXIuZGF0YV87ICBcbiAgdmFyIGNhbGxiYWNrID0gc3Vic2NyaWJlcltzZXR0bGVkXTtcbiAgdmFyIHByb21pc2UgPSBzdWJzY3JpYmVyLnRoZW47XG5cbiAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJylcbiAge1xuICAgIHNldHRsZWQgPSBGVUxGSUxMRUQ7XG4gICAgdHJ5IHtcbiAgICAgIHZhbHVlID0gY2FsbGJhY2sodmFsdWUpO1xuICAgIH0gY2F0Y2goZSkge1xuICAgICAgcmVqZWN0KHByb21pc2UsIGUpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghaGFuZGxlVGhlbmFibGUocHJvbWlzZSwgdmFsdWUpKVxuICB7XG4gICAgaWYgKHNldHRsZWQgPT09IEZVTEZJTExFRClcbiAgICAgIHJlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuXG4gICAgaWYgKHNldHRsZWQgPT09IFJFSkVDVEVEKVxuICAgICAgcmVqZWN0KHByb21pc2UsIHZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVUaGVuYWJsZShwcm9taXNlLCB2YWx1ZSkge1xuICB2YXIgcmVzb2x2ZWQ7XG5cbiAgdHJ5IHtcbiAgICBpZiAocHJvbWlzZSA9PT0gdmFsdWUpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBIHByb21pc2VzIGNhbGxiYWNrIGNhbm5vdCByZXR1cm4gdGhhdCBzYW1lIHByb21pc2UuJyk7XG5cbiAgICBpZiAodmFsdWUgJiYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSlcbiAgICB7XG4gICAgICB2Y
10072XIgdGhlbiA9IHZhbHVlLnRoZW47ICAvLyB0aGVuIHNob3VsZCBiZSByZXRyaXZlZCBvbmx5IG9uY2VcblxuICAgICAgaWYgKHR5cGVvZiB0aGVuID09PSAnZnVuY3Rpb24nKVxuICAgICAge1xuICAgICAgICB0aGVuLmNhbGwodmFsdWUsIGZ1bmN0aW9uKHZhbCl7XG4gICAgICAgICAgaWYgKCFyZXNvbHZlZClcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXNvbHZlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdmFsKVxuICAgICAgICAgICAgICByZXNvbHZlKHByb21pc2UsIHZhbCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgIGZ1bGZpbGwocHJvbWlzZSwgdmFsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbil7XG4gICAgICAgICAgaWYgKCFyZXNvbHZlZClcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXNvbHZlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIHJlamVjdChwcm9taXNlLCByZWFzb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCFyZXNvbHZlZClcbiAgICAgIHJlamVjdChwcm9taXNlLCBlKTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlKHByb21pc2UsIHZhbHVlKXtcbiAgaWYgKHByb21pc2UgPT09IHZhbHVlIHx8ICFoYW5kbGVUaGVuYWJsZShwcm9taXNlLCB2YWx1ZSkpXG4gICAgZnVsZmlsbChwcm9taXNlLCB2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGZ1bGZpbGwocHJvbWlzZSwgdmFsdWUpe1xuICBpZiAocHJvbWlzZS5zdGF0ZV8gPT09IFBFTkRJTkcpXG4gIHtcbiAgICBwcm9taXNlLnN0YXRlXyA9IFNFQUxFRDtcbiAgICBwcm9taXNlLmRhdGFfID0gdmFsdWU7XG5cbiAgICBhc3luY0NhbGwocHVibGlzaEZ1bGZpbGxtZW50LCBwcm9taXNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWplY3QocHJvbWlzZSwgcmVhc29uKXtcbiAgaWYgKHByb21pc2Uuc3RhdGVfID09PSBQRU5ESU5HKVxuICB7XG4gICAgcHJvbWlzZS5zdGF0ZV8gPSBTRUFMRUQ7XG4gICAgcHJvbWlzZS5kYXRhXyA9IHJlYXNvbjtcblxuICAgIGFzeW5jQ2FsbChwdWJsaXNoUmVqZWN0aW9uLCBwcm9taXNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwdWJsaXNoKHByb21pc2UpIHtcbiAgdmFyIGNhbGxiYWNrcyA9IHByb21pc2UudGhlbl87XG4gIHByb21pc2UudGhlbl8gPSB1bmRlZmluZWQ7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICBpbnZva2VDYWxsYmFjayhjYWxsYmFja3NbaV0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHB1Ymxpc2hGdWxmaWxsbWVudChwcm9taXNlKXtcbiAgcHJvbWlzZS5zdGF0ZV8gPSBGVUxGSUxMRUQ7XG4gIHB1Ymxpc2gocHJvbWlzZSk7XG59XG5cbmZ1bmN0aW9uIHB1Ymxpc2hSZWplY3Rpb24ocHJvbWlzZSl7XG4gIHByb21pc2Uuc3RhdGVfID0gUkVKRUNURUQ7XG4gIHB1Ymxpc2gocHJvbWlzZSk7XG59XG5cbi8qKlxuKiBAY2xhc3NcbiovXG5mdW5jdGlvbiBQcm9taXNlKHJlc29sdmVyKXtcbiAgaWYgKHR5cGVvZiByZXNvbHZlciAhPT0gJ2Z1bmN0aW9uJylcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQcm9taXNlIGNvbnN0cnVjdG9yIHRha2VzIGEgZnVuY3Rpb24gYXJndW1lbnQnKTtcblxuICBpZiAodGhpcyBpbnN0YW5jZW9mIFByb21pc2UgPT09IGZhbHNlKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZhaWxlZCB0byBjb25zdHJ1Y3QgXFwnUHJvbWlzZVxcJzogUGxlYXNlIHVzZSB0aGUgXFwnbmV3XFwnIG9wZXJhdG9yLCB0aGlzIG9iamVjdCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uJyk7XG5cbiAgdGhpcy50aGVuXyA9IFtdO1xuXG4gIGludm9rZVJlc29sdmVyKHJlc29sdmVyLCB0aGlzKTtcbn1cblxuUHJvbWlzZS5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBQcm9taXNlLFxuXG4gIHN0YXRlXzogUEVORElORyxcbiAgdGhlbl86IG51bGwsXG4gIGRhdGFfOiB1bmRlZmluZWQsXG5cbiAgdGhlbjogZnVuY3Rpb24ob25GdWxmaWxsbWVudCwgb25SZWplY3Rpb24pe1xuICAgIHZhciBzdWJzY3JpYmVyID0ge1xuICAgICAgb3duZXI6IHRoaXMsXG4gICAgICB0aGVuOiBuZXcgdGhpcy5jb25zdHJ1Y3RvcihOT09QKSxcbiAgICAgIGZ1bGZpbGxlZDogb25GdWxmaWxsbWVudCxcbiAgICAgIHJlamVjdGVkOiBvblJlamVjdGlvblxuICAgIH07XG5cbiAgICBpZiAodGhpcy5zdGF0ZV8gPT09IEZVTEZJTExFRCB8fCB0aGlzLnN0YXRlXyA9PT0gUkVKRUNURUQpXG4gICAge1xuICAgICAgLy8gYWxyZWFkeSByZXNvbHZlZCwgY2FsbCBjYWxsYmFjayBhc3luY1xuICAgICAgYXN5bmNDYWxsKGludm9rZUNhbGxiYWNrLCBzdWJzY3JpYmVyKTtcbiAgICB9XG4gICAgZWxzZVxuICAgIHtcbiAgICAgIC8vIHN1YnNjcmliZVxuICAgICAgdGhpcy50aGVuXy5wdXNoKHN1YnNjcmliZXIpO1xuICAgIH1cblxuICAgIHJldHVybiBzdWJzY3JpYmVyLnRoZW47XG4gIH0sXG5cbiAgJ2NhdGNoJzogZnVuY3Rpb24ob25SZWplY3Rpb24pIHtcbiAgICByZXR1cm4gdGhpcy50aGVuKG51bGwsIG9uUmVqZWN0aW9uKTtcbiAgfVxufTtcblxuUHJvbWlzZS5hbGwgPSBmdW5jdGlvbihwcm9taXNlcyl7XG4gIHZhciBDbGFzcyA9IHRoaXM7XG5cbiAgaWYgKCFpc0FycmF5KHByb21pc2VzKSlcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdZb3UgbXVzdCBwYXNzIGFuIGFycmF5IHRvIFByb21pc2UuYWxsKCkuJyk7XG5cbiAgcmV0dXJuIG5ldyBDbGFzcyhmdW5jdGlvbihyZXNvbHZlLCByZWplY3Qpe1xuICAgIHZhciByZXN1bHRzID0gW107XG4gICAgdmFyIHJlbWFpbmluZyA9IDA7XG5cbiAgICBmdW5jdGlvbiByZXNvbHZlcihpbmRleCl7XG4gICAgICByZW1haW5pbmcrKztcbiAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSl7XG4gICAgICAgIHJlc3VsdHNbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgIGlmICghLS1yZW1haW5pbmcpXG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHRzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDAsIHByb21pc2U7IGkgPCBwcm9taXNlcy5sZW5ndGg7IGkrKylcbiAgICB7XG4gICAgICBwcm9taXNlID0gcHJvbWlzZXNbaV07XG5cbiAgICAgIGlmIChwcm9taXNlICYmIHR5cGVvZiBwcm9taXNlLnRoZW4gPT
1007209ICdmdW5jdGlvbicpXG4gICAgICAgIHByb21pc2UudGhlbihyZXNvbHZlcihpKSwgcmVqZWN0KTtcbiAgICAgIGVsc2VcbiAgICAgICAgcmVzdWx0c1tpXSA9IHByb21pc2U7XG4gICAgfVxuXG4gICAgaWYgKCFyZW1haW5pbmcpXG4gICAgICByZXNvbHZlKHJlc3VsdHMpO1xuICB9KTtcbn07XG5cblByb21pc2UucmFjZSA9IGZ1bmN0aW9uKHByb21pc2VzKXtcbiAgdmFyIENsYXNzID0gdGhpcztcblxuICBpZiAoIWlzQXJyYXkocHJvbWlzZXMpKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHBhc3MgYW4gYXJyYXkgdG8gUHJvbWlzZS5yYWNlKCkuJyk7XG5cbiAgcmV0dXJuIG5ldyBDbGFzcyhmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgcHJvbWlzZTsgaSA8IHByb21pc2VzLmxlbmd0aDsgaSsrKVxuICAgIHtcbiAgICAgIHByb21pc2UgPSBwcm9taXNlc1tpXTtcblxuICAgICAgaWYgKHByb21pc2UgJiYgdHlwZW9mIHByb21pc2UudGhlbiA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgcHJvbWlzZS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICBlbHNlXG4gICAgICAgIHJlc29sdmUocHJvbWlzZSk7XG4gICAgfVxuICB9KTtcbn07XG5cblByb21pc2UucmVzb2x2ZSA9IGZ1bmN0aW9uKHZhbHVlKXtcbiAgdmFyIENsYXNzID0gdGhpcztcblxuICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZS5jb25zdHJ1Y3RvciA9PT0gQ2xhc3MpXG4gICAgcmV0dXJuIHZhbHVlO1xuXG4gIHJldHVybiBuZXcgQ2xhc3MoZnVuY3Rpb24ocmVzb2x2ZSl7XG4gICAgcmVzb2x2ZSh2YWx1ZSk7XG4gIH0pO1xufTtcblxuUHJvbWlzZS5yZWplY3QgPSBmdW5jdGlvbihyZWFzb24pe1xuICB2YXIgQ2xhc3MgPSB0aGlzO1xuXG4gIHJldHVybiBuZXcgQ2xhc3MoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXtcbiAgICByZWplY3QocmVhc29uKTtcbiAgfSk7XG59O1xuXG59KSh0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnID8gd2luZG93IDogdHlwZW9mIGdsb2JhbCAhPSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9ICd1bmRlZmluZWQnID8gc2VsZiA6IHRoaXMpO1xuIiwiLyogIFNub3dmYWxsIGpxdWVyeSBwbHVnaW5cblxuICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgTElDRU5TRVxuICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICBWZXJzaW9uIDEuNTEgRGVjIDJuZCAyMDEyXG4gICAgLy8gZml4ZWQgYnVnIHdoZXJlIHNub3cgY29sbGVjdGlvbiBkaWRuJ3QgaGFwcGVuIGlmIGEgdmFsaWQgZG9jdHlwZSB3YXMgZGVjbGFyZWQuXG5cbiAgICBWZXJzaW9uIDEuNSBPY3QgNXRoIDIwMTFcbiAgICBBZGRlZCBjb2xsZWN0aW5nIHNub3chIFVzZXMgdGhlIGNhbnZhcyBlbGVtZW50IHRvIGNvbGxlY3Qgc25vdy4gSW4gb3JkZXIgdG8gaW5pdGlhbGl6ZSBzbm93IGNvbGxlY3Rpb24gdXNlIHRoZSBmb2xsb3dpbmdcblxuICAgICQoZG9jdW1lbnQpLnNub3dmYWxsKHtjb2xsZWN0aW9uIDogJ2VsZW1lbnQnfSk7XG5cbiAgICBlbGVtZW50ID0gYW55IHZhbGlkIGpxdWVyeSBzZWxlY3Rvci5cblxuICAgIFRoZSBwbHVnaW4gdGhlbiBjcmVhdGVzIGEgY2FudmFzIGFib3ZlIGV2ZXJ5IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3RvciwgYW5kIGNvbGxlY3RzIHRoZSBzbm93LiBJZiB0aGVyZSBhcmUgYSB2YXJyeWluZyBhbW91bnQgb2YgZWxlbWVudHMgdGhlXG4gICAgZmxha2VzIGdldCBhc3NpZ25lZCBhIHJhbmRvbSBvbmUgb24gc3RhcnQgdGhleSB3aWxsIGNvbGxpZGUuXG5cbiAgICBWZXJzaW9uIDEuNCBEZWMgOHRoIDIwMTBcbiAgICBGaXhlZCBpc3N1ZXMgKEkgaG9wZSkgd2l0aCBzY3JvbGwgYmFycyBmbGlja2VyaW5nIGR1ZSB0byBzbm93IGdvaW5nIG92ZXIgdGhlIGVkZ2Ugb2YgdGhlIHNjcmVlbi5cbiAgICBBZGRlZCByb3VuZCBzbm93Zmxha2VzIHZpYSBjc3MsIHdpbGwgbm90IHdvcmsgZm9yIGFueSB2ZXJzaW9uIG9mIElFLiAtIFRoYW5rcyB0byBMdWtlIEJhcmtlciBvZiBodHRwOi8vd3d3LmluZmluaXRlLWV5ZS5jb20vXG4gICAgQWRkZWQgc2hhZG93cyBhcyBhbiBvcHRpb24gdmlhIGNzcyBhZ2FpbiB3aWxsIG5vdCB3b3JrIHdpdGggSUUuIFRoZSBpZGVhIGJlaGluZCBzaGFkb3dzLCBpcyB0byBzaG93IGZsYWtlcyBvbiBsaWdodGVyIGNvbG9yZWQgd2ViIHNpdGVzIC0gVGhhbmtzIFl1dHRcblxuICAgIFZlcnNpb24gMS4zLjEgTm92IDI1dGggMjAxMFxuICAgIFVwZGF0ZWQgc2NyaXB0IHRoYXQgY2F1c2VkIGZsYWtlcyBub3QgdG8gc2hvdyBhdCBhbGwgaWYgcGx1Z2luIHdhcyBpbml0aWFsaXplZCB3aXRoIG5vIG9wdGlvbnMsIGFsc28gYWRkZWQgdGhlIGZpeGVzIHRoYXQgSGFuIEJvbmdlcnMgc3VnZ2VzdGVkXG5cbiAgICBEZXZlbG9wZWQgYnkgSmFzb24gQnJvd24gZm9yIGFueSBidWdzIG9yIHF1ZXN0aW9ucyBlbWFpbCBtZSBhdCBsb2t0YX
10072I2OUBob3RtYWlsXG4gICAgaW5mbyBvbiB0aGUgcGx1Z2luIGlzIGxvY2F0ZWQgb24gU29tZXRoaW5naGl0bWUuY29tXG5cbiAgICB2YWx1ZXMgZm9yIHNub3cgb3B0aW9ucyBhcmVcblxuICAgIGZsYWtlQ291bnQsXG4gICAgZmxha2VDb2xvcixcbiAgICBmbGFrZUluZGV4LFxuICAgIG1pblNpemUsXG4gICAgbWF4U2l6ZSxcbiAgICBtaW5TcGVlZCxcbiAgICBtYXhTcGVlZCxcbiAgICByb3VuZCwgICAgICB0cnVlIG9yIGZhbHNlLCBtYWtlcyB0aGUgc25vd2ZsYWtlcyByb3VuZGVkIGlmIHRoZSBicm93c2VyIHN1cHBvcnRzIGl0LlxuICAgIHNoYWRvdyAgICAgIHRydWUgb3IgZmFsc2UsIGdpdmVzIHRoZSBzbm93Zmxha2VzIGEgc2hhZG93IGlmIHRoZSBicm93c2VyIHN1cHBvcnRzIGl0LlxuXG4gICAgRXhhbXBsZSBVc2FnZSA6XG4gICAgJChkb2N1bWVudCkuc25vd2ZhbGwoe2ZsYWtlQ291bnQgOiAxMDAsIG1heFNwZWVkIDogMTB9KTtcblxuICAgIC1vci1cblxuICAgICQoJyNlbGVtZW50Jykuc25vd2ZhbGwoe2ZsYWtlQ291bnQgOiA4MDAsIG1heFNwZWVkIDogNSwgbWF4U2l6ZSA6IDV9KTtcblxuICAgIC1vciB3aXRoIGRlZmF1bHRzLVxuXG4gICAgJChkb2N1bWVudCkuc25vd2ZhbGwoKTtcblxuICAgIC0gVG8gY2xlYXIgLVxuICAgICQoJyNlbGVtZW50Jykuc25vd2ZhbGwoJ2NsZWFyJyk7XG4qL1xuXG4vLyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgcG9seWZpbGwgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZGFyaXVzL3JlcXVlc3RBbmltYXRpb25GcmFtZVxuaWYgKCFEYXRlLm5vdylcbiAgICBEYXRlLm5vdyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCk7IH07XG5cbihmdW5jdGlvbigpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgdmVuZG9ycyA9IFsnd2Via2l0JywgJ21veiddO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmVuZG9ycy5sZW5ndGggJiYgIXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU7ICsraSkge1xuICAgICAgICB2Y
10072XIgdnAgPSB2ZW5kb3JzW2ldO1xuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gd2luZG93W3ZwKydSZXF1ZXN0QW5pbWF0aW9uRnJhbWUnXTtcbiAgICAgICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lID0gKHdpbmRvd1t2cCsnQ2FuY2VsQW5pbWF0aW9uRnJhbWUnXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB3aW5kb3dbdnArJ0NhbmNlbFJlcXVlc3RBbmltYXRpb25GcmFtZSddKTtcbiAgICB9XG4gICAgaWYgKC9pUChhZHxob25lfG9kKS4qT1MgNi8udGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCkgLy8gaU9TNiBpcyBidWdneVxuICAgICAgICB8fCAhd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCAhd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICAgIHZhciBsYXN0VGltZSA9IDA7XG4gICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgdmFyIG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICB2YXIgbmV4dFRpbWUgPSBNYXRoLm1heChsYXN0VGltZSArIDE2LCBub3cpO1xuICAgICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGNhbGxiYWNrKGxhc3RUaW1lID0gbmV4dFRpbWUpOyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFRpbWUgLSBub3cpO1xuICAgICAgICB9O1xuICAgICAgICB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBjbGVhclRpbWVvdXQ7XG4gICAgfVxufSgpKTtcblxuKGZ1bmN0aW9uKCQpe1xuICAgICQuc25vd2ZhbGwgPSBmdW5jdGlvbihlbGVtZW50LCBvcHRpb25zKXtcbiAgICAgICAgdmFyIGZsYWtlcyA9IFtdLFxuICAgICAgICAgICAgZGVmYXVsdHMgPSB7XG4gICAgICAgICAgICAgICAgZmxha2VDb3VudCA6IDM1LFxuICAgICAgICAgICAgICAgIGZsYWtlQ29sb3IgOiAnI2ZmZmZmZicsXG5cdFx0XHRcdGZsYWtlUG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgICAgZmxha2VJbmRleDogOTk5OTk5LFxuICAgICAgICAgICAgICAgIG1pblNpemUgOiAxLFxuICAgICAgICAgICAgICAgIG1heFNpemUgOiAyLFxuICAgICAgICAgICAgICAgIG1pblNwZWVkIDogMSxcbiAgICAgICAgICAgICAgICBtYXhTcGVlZCA6IDUsXG4gICAgICAgICAgICAgICAgcm91bmQgOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzaGFkb3cgOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uIDogZmFsc2UsXG4gICAgICAgICAgICAgICAgY29sbGVjdGlvbkhlaWdodCA6IDQwLFxuICAgICAgICAgICAgICAgIGRldmljZW9yaWVudGF0aW9uIDogZmFsc2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoZGVmYXVsdHMsIG9wdGlvbnMpLFxuICAgICAgICAgICAgcmFuZG9tID0gZnVuY3Rpb24gcmFuZG9tKG1pbiwgbWF4KXtcbiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChtaW4gKyBNYXRoLnJhbmRvbSgpKihtYXgtbWluKSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAkKGVsZW1lbnQpLmRhdGEoXCJzbm93ZmFsbFwiLCB0aGlzKTtcblxuICAgICAgICAgICAgLy8gU25vdyBmbGFrZSBvYmplY3RcbiAgICAgICAgICAgIGZ1bmN0aW9uIEZsYWtlKF94LCBfeSwgX3NpemUsIF9zcGVlZCl7XG4gICAgICAgICAgICAgICAgLy8gRmxha2UgcHJvcGVydGllc1xuICAgICAgICAgICAgICAgIHRoaXMueCAgPSBfeDtcbiAgICAgICAgICAgICAgICB0aGlzLnkgID0gX3k7XG4gICAgICAgICAgICAgICAgdGhpcy5zaXplID0gX3NpemU7XG4gICAgICAgICAgICAgICAgdGhpcy5zcGVlZCA9IF9zcGVlZDtcbiAgICAgICAgICAgICAgICB0aGlzLnN0ZXAgPSAwO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RlcFNpemUgPSByYW5kb20oMSwxMCkgLyAxMDA7XG5cbiAgICAgICAgICAgICAgICBpZihvcHRpb25zLmNvbGxlY3Rpb24pe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhcmdldCA9IGNhbnZhc0NvbGxlY3Rpb25bcmFuZG9tKDAsY2FudmFzQ29sbGVjdGlvbi5sZW5ndGgtMSldO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBmbGFrZU1hcmt1cCA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICBpZihvcHRpb25zLmltYWdlKXtcbiAgICAgICAgICAgICAgICAgICAgZmxha2VNYXJrdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xuICAgICAgICAgICAgICAgICAgICBmbGFrZU1hcmt1cC5zcmMgPSBvcHRpb25zLmltYWdlO1xuICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICBmbGFrZU1hcmt1cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICAgICAgICAgICQoZmxha2VNYXJrdXApLmNzcyh7J2JhY2tncm91bmQnIDogb3B0aW9ucy5mbGFrZUNvbG9yfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgJChmbGFrZU1hcmt1cCkuYXR0cih7XG4gICAgICAgICAgICAgICAgICAgICdjbGFzcyc6ICdzbm93ZmFsbC1mbGFrZXMnLFxuICAgICAgICAgICAgICAgIH0pLmNzcyh7XG4gICAgICAgICAgICAgICAgICAgICd3aWR0aCcgOiB0aGlzLnNpemUsXG4gICAgICAgICAgICAgICAgICAgICdoZWlnaHQnIDogdGhpcy5zaXplLFxuICAgICAgICAgICAgICAgICAgICAncG9zaXRpb24nIDogb3B0aW9ucy5mbGFrZVBvc2l0aW9uLFxuICAgICAgICAgICAgICAgICAgICAndG9wJyA6IHRoaXMueSxcbiAgICAgICAgICAgICAgICAgICAgJ2xlZnQnIDogdGhpcy54LFxuICAgICAgICAgICAgICAgICAgICAnZm9udFNpemUnIDogMCxcbiAgICAgICAgICAgICAgICAgICAgJ3pJbmRleCcgOiBvcHRpb25zLmZsYWtlSW5kZXhcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGlmKCQoZWxlbWVudCkuZ2V0KDApLnRhZ05hbWUgPT09ICQoZG9jdW1lbnQpLmdldCgwKS50YWdOYW1lKXtcbiAgICAgICAgICAgICAgICAgICAgJCgnYm9keScpLmFwcGVuZCgkKGZsYWtlTWFya3VwKSk7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSAkKCdib2R5Jyk7XG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgICQoZWxlbWVudCkuYXBwZW5kKCQoZmxha2VNYXJrdXApKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBmbGFrZU1hcmt1cDtcblxuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBmdW5jdGlvbiwgdXNlZCB0byB1cGRhdGUgdGhlIHNub3cgZmxha2VzLCBhbmQgY2hlY2tzIGN1cnJlbnQgc25vd2ZsYWtlIGFnYWluc3QgYm91bmRzXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGUgPSBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnkgKz0gdGhpcy5zcGVlZDtcblxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLnkgPiAoZWxIZWlnaHQpIC0gKHRoaXMuc2l6ZSAgKyA2KSl7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgICAgI
10072H1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUudG9wID0gdGhpcy55ICsgJ3B4JztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLmxlZnQgPSB0aGlzLnggKyAncHgnO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RlcCArPSB0aGlzLnN0ZXBTaXplO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChkb1JhdGlvID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy54ICs9IE1hdGguY29zKHRoaXMuc3RlcCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnggKz0gKGRvUmF0aW8gKyBNYXRoLmNvcyh0aGlzLnN0ZXApKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFBpbGV1cCBjaGVja1xuICAgICAgICAgICAgICAgICAgICBpZihvcHRpb25zLmNvbGxlY3Rpb24pe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy54ID4gdGhpcy50YXJnZXQueCAmJiB0aGlzLnggPCB0aGlzLnRhcmdldC53aWR0aCArIHRoaXMudGFyZ2V0LnggJiYgdGhpcy55ID4gdGhpcy50YXJnZXQueSAmJiB0aGlzLnkgPCB0aGlzLnRhcmdldC5oZWlnaHQgKyB0aGlzLnRhcmdldC55KXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3R4ID0gdGhpcy50YXJnZXQuZWxlbWVudC5nZXRDb250ZXh0KFwiMmRcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1clggPSB0aGlzLnggLSB0aGlzLnRhcmdldC54LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJZID0gdGhpcy55IC0gdGhpcy50YXJnZXQueSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sRGF0YSA9IHRoaXMudGFyZ2V0LmNvbERhdGE7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoY29sRGF0YVtwYXJzZUludChjdXJYKV1bcGFyc2VJbnQoY3VyWSt0aGlzLnNwZWVkK3RoaXMuc2l6ZSldICE9PSB1bmRlZmluZWQgfHwgY3VyWSt0aGlzLnNwZWVkK3RoaXMuc2l6ZSA+IHRoaXMudGFyZ2V0LmhlaWdodCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjdXJZK3RoaXMuc3BlZWQrdGhpcy5zaXplID4gdGhpcy50YXJnZXQuaGVpZ2h0KXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZShjdXJZK3RoaXMuc3BlZWQrdGhpcy5zaXplID4gdGhpcy50YXJnZXQuaGVpZ2h0ICYmIHRoaXMuc3BlZWQgPiAwKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGVlZCAqPSAuNTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gZGVmYXVsdHMuZmxha2VDb2xvcjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvbERhdGFbcGFyc2VJbnQoY3VyWCldW3BhcnNlSW50KGN1clkrdGhpcy5zcGVlZCt0aGlzLnN
10072pemUpXSA9PSB1bmRlZmluZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xEYXRhW3BhcnNlSW50KGN1clgpXVtwYXJzZUludChjdXJZK3RoaXMuc3BlZWQrdGhpcy5zaXplKV0gPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFJlY3QoY3VyWCwgKGN1clkpK3RoaXMuc3BlZWQrdGhpcy5zaXplLCB0aGlzLnNpemUsIHRoaXMuc2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbERhdGFbcGFyc2VJbnQoY3VyWCldW3BhcnNlSW50KGN1clkrdGhpcy5zcGVlZCldID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxSZWN0KGN1clgsIGN1clkrdGhpcy5zcGVlZCwgdGhpcy5zaXplLCB0aGlzLnNpemUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmbG93IHRvIHRoZSBzaWRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3BlZWQgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RlcFNpemUgPSAwO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocGFyc2VJbnQoY3VyWCkrMSA8IHRoaXMudGFyZ2V0LndpZHRoICYmIGNvbERhdGFbcGFyc2VJbnQoY3VyWCkrMV1bcGFyc2VJbnQoY3VyWSkrMV0gPT0gdW5kZWZpbmVkICl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdvIGxlZnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy54Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYocGFyc2VJbnQoY3VyWCktMSA+IDAgJiYgY29sRGF0YVtwYXJzZUludChjdXJYKS0xXVtwYXJzZUludChjdXJZKSsxXSA9PSB1bmRlZmluZWQgKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ28gcmlnaHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy54LS07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc3RvcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gZGVmYXVsdHMuZmxha2VDb2xvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxSZWN0KGN1clgsIGN1clksIHRoaXMuc2l6ZSwgdGhpcy5zaXplKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sRGF0YVtwYXJzZUludChjdXJYKV1bcGFyc2VJbnQoY3VyWSldID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy54ICsgdGhpcy5zaXplID4gKGVsV2lkdGgpIC0gd2lkdGhPZmZzZXQgfHwgdGhpcy54IDwgd2lkdGhPZmZzZXQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gUmVzZXRzIHRoZSBzbm93Zmxha2Ugb25jZSBpdCByZWFjaGVzIG9uZSBvZiB0aGUgYm91bmRzIHNldFxuICAgICAgICAgICAgICAgIHRoaXMucmVzZXQgPSBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnkgPSAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnggPSByYW5kb20od2lkdGhPZmZzZXQsIGVsV2lkdGggLSB3aWR0aE9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RlcFNpemUgPSByYW5kb20oMSwxMCkgLyAxMDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2l6ZSA9IHJhbmRvbSgob3B0aW9ucy5taW5TaXplICogMTAwKSwgKG9wdGlvbnMubWF4U2l6ZSAqIDEwMCkpIC8gMTAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUud2lkdGggPSB0aGlzLnNpemUgKyAncHgnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gdGhpcy5zaXplICsgJ3B4JztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGVlZCA9IHJhbmRvbShvcHRpb25zLm1pblNwZWVkLCBvcHRpb25zLm1heFNwZWVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGxvY2FsIHZhcnNcbiAgICAgICAgICAgIHZhciBpID0gMCxcbiAgICAgICAgICAgICAgICBlbEhlaWdodCA9ICQoZWxlbWVudCkuaGVpZ2h0KCksXG4gICAgICAgICAgICAgICAgZWxXaWR0aCA9ICQoZWxlbWVudCkud2lkdGgoKSxcbiAgICAgICAgICAgICAgICB3aWR0aE9mZnNldCA9IDAsXG4gICAgICAgICAgICAgICAgc25vd1RpbWVvdXQgPSAwO1xuXG4gICAgICAgICAgICAvLyBDb2xsZWN0aW9uIFBpZWNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgICAgaWYob3B0aW9ucy5jb2xsZWN0aW9uICE9PSBmYWxzZSl7XG4gICAgICAgICAgICAgICAgdmFyIHRlc3RFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgICAgICAgICAgaWYoISEodGVzdEVsZW0uZ2V0Q29udGV4dCAmJiB0ZXN0RWxlbS5nZXRDb250ZXh0KCcyZCcpKSl7XG4gICAgICAgICAgICAgICAgICAgI
10072HZhciBjYW52YXNDb2xsZWN0aW9uID0gW10sXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyA9ICQob3B0aW9ucy5jb2xsZWN0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25IZWlnaHQgPSBvcHRpb25zLmNvbGxlY3Rpb25IZWlnaHQ7XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yKHZhciBpID0wOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBib3VuZHMgPSBlbGVtZW50c1tpXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNhbnZhcyA9ICQoJzxjYW52YXMvPicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NsYXNzJyA6ICdzbm93ZmFsbC1jYW52YXMnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGlzaW9uRGF0YSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYm91bmRzLnRvcC1jb2xsZWN0aW9uSGVpZ2h0ID4gMCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJ2JvZHknKS5hcHBlbmQoJGNhbnZhcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNhbnZhcy5jc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Bvc2l0aW9uJyA6IG9wdGlvbnMuZmxha2VQb3NpdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsZWZ0JyAgICAgOiBib3VuZHMubGVmdCArICdweCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndG9wJyAgICAgIDogYm91bmRzLnRvcC1jb2xsZWN0aW9uSGVpZ2h0ICsgJ3B4J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvcCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogYm91bmRzLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBjb2xsZWN0aW9uSGVpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcih2YXIgdyA9IDA7IHcgPCBib3VuZHMud2lkdGg7IHcrKyl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsaXNpb25EYXRhW3ddID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW52YXNDb2xsZWN0aW9uLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA6ICRjYW52YXMuZ2V0KDApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA6IGJvdW5kcy5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA6IGJvdW5kcy50b3AtY29sbGVjdGlvbkhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoIDogYm91bmRzLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBjb2xsZWN0aW9uSGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sRGF0YSA6IGNvbGxpc2lvbkRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIC8vIENhbnZhcyBlbGVtZW50IGlzbnQgc3VwcG9ydGVkXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29sbGVjdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG4gICAgICAgICAgICAvLyBUaGlzIHdpbGwgcmVkdWNlIHRoZSBob3Jpem9udGFsIHNjcm9sbCBiYXIgZnJvbSBkaXNwbGF5aW5nLCB3aGVuIHRoZSBlZmZlY3QgaXMgYXBwbGllZCB0byB0aGUgd2hvbGUgcGFnZVxuICAgICAgICAgICAgaWYoJChlbGVtZW50KS5nZXQoMCkudGFnTmFtZSA9PT0gJChkb2N1bWVudCkuZ2V0KDApLnRhZ05hbWUpe1xuICAgICAgICAgICAgICAgIHdpZHRoT2Zmc2V0ID0gMjU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEJpbmQgdGhlIHdpbmRvdyByZXNpemUgZXZlbnQgc28gd2UgY2FuIGdldCB0aGUgaW5uZXJIZWlnaHQgYWdhaW5cbiAgICAgICAgICAgICQod2luZG93KS5iaW5kKFwicmVzaXplXCIsIGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgZWxIZWlnaHQgPSAkKGVsZW1lbnQpWzBdLmNsaWVudEhlaWdodDtcbiAgICAgICAgICAgICAgICBlbFdpZHRoID0gJChlbGVtZW50KVswXS5vZmZzZXRXaWR0aDtcbiAgICAgICAgICAgIH0pO1xuXG5cbiAgICAgICAgICAgIC8vIGluaXRpYWxpemUgdGhlIGZsYWtlc1xuICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgb3B0aW9ucy5mbGFrZUNvdW50OyBpKz0xKXtcbiAgICAgICAgICAgICAgICBmbGFrZXMucHVzaChuZXcgRmxha2UocmFuZG9tKHdpZHRoT2Zmc2V0LGVsV2lkdGggLSB3aWR0aE9mZnNldCksIHJhbmRvbSgwLCBlbEhlaWdodCksIHJhbmRvbSgob3B0aW9ucy5taW5TaXplICogMTAwKSwgKG9wdGlvbnMubWF4U2l6ZSAqIDEwMCkpIC8gMTAwLCByYW5kb20ob3B0aW9ucy5taW5TcGVlZCwgb3B0aW9ucy5tYXhTcGVlZCkpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVGhpcyBhZGRzIHRoZSBzdHlsZSB0byBtYWtlIHRoZSBzbm93Zmxha2VzIHJvdW5kIHZpYSBib3JkZXIgcmFkaXVzIHByb3BlcnR5XG4gICAgICAgICAgICBpZihvcHRpb25zLnJvdW5kKXtcbiAgICAgICAgICAgICAgICAkKCcuc25vd2ZhbGwtZmxha2VzJykuY3NzKHsnLW1vei1ib3JkZXItcmFkaXVzJyA6IG9wdGlvbnMubWF4U2l6ZSwgJy13ZWJraXQtYm9yZGVyLXJhZGl1cycgOiBvcHRpb25zLm1heFN
10072pemUsICdib3JkZXItcmFkaXVzJyA6IG9wdGlvbnMubWF4U2l6ZX0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUaGlzIGFkZHMgc2hhZG93cyBqdXN0IGJlbG93IHRoZSBzbm93Zmxha2Ugc28gdGhleSBwb3AgYSBiaXQgb24gbGlnaHRlciBjb2xvcmVkIHdlYiBwYWdlc1xuICAgICAgICAgICAgaWYob3B0aW9ucy5zaGFkb3cpe1xuICAgICAgICAgICAgICAgICQoJy5zbm93ZmFsbC1mbGFrZXMnKS5jc3MoeyctbW96LWJveC1zaGFkb3cnIDogJzFweCAxcHggMXB4ICM1NTUnLCAnLXdlYmtpdC1ib3gtc2hhZG93JyA6ICcxcHggMXB4IDFweCAjNTU1JywgJ2JveC1zaGFkb3cnIDogJzFweCAxcHggMXB4ICM1NTUnfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE9uIG5ld2VyIE1hY2Jvb2tzIFNub3dmbGFrZXMgd2lsbCBmYWxsIGJhc2VkIG9uIGRldmljZW9yaWVudGF0aW9uXG4gICAgICAgICAgICB2YXIgZG9SYXRpbyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZGV2aWNlb3JpZW50YXRpb24pIHtcbiAgICAgICAgICAgICAgICAkKHdpbmRvdykuYmluZCgnZGV2aWNlb3JpZW50YXRpb24nLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgICAgICAgICBkb1JhdGlvID0gZXZlbnQub3JpZ2luYWxFdmVudC5nYW1tYSAqIDAuMTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdGhpcyBjb250cm9scyBmbG93IG9mIHRoZSB1cGRhdGluZyBzbm93XG4gICAgICAgICAgICBmdW5jdGlvbiBzbm93KCl7XG4gICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGZsYWtlcy5sZW5ndGg7IGkgKz0gMSl7XG4gICAgICAgICAgICAgICAgICAgIGZsYWtlc1tpXS51cGRhdGUoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzbm93VGltZW91dCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3Nub3coKX0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzbm93KCk7XG5cbiAgICAgICAgICAgIC8vIGNsZWFycyB0aGUgc25vd2ZsYWtlc1xuICAgICAgICAgICAgdGhpcy5jbGVhciA9IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgJCgnLnNub3dmYWxsLWNhbnZhcycpLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICQoZWxlbWVudCkuY2hpbGRyZW4oJy5zbm93ZmFsbC1mbGFrZXMnKS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShzbm93VGltZW91dCk7XG4gICAgICAgICAgICB9XG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemUgdGhlIG9wdGlvbnMgYW5kIHRoZSBwbHVnaW5cbiAgICAkLmZuLnNub3dmYWxsID0gZnVuY3Rpb24ob3B0aW9ucyl7XG4gICAgICAgIGlmKHR5cGVvZihvcHRpb25zKSA9PSBcIm9iamVjdFwiIHx8IG9wdGlvbnMgPT0gdW5kZWZpbmVkKXtcbiAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKXtcbiAgICAgICAgICAgICAgICAgICAgKG5ldyAkLnNub3dmYWxsKHRoaXMsIG9wdGlvbnMpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfWVsc2UgaWYgKHR5cGVvZihvcHRpb25zKSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGkpe1xuICAgICAgICAgICAgICAgIHZhciBzbm93ID0gJCh0aGlzKS5kYXRhKCdzbm93ZmFsbCcpO1xuICAgICAgICAgICAgICAgIGlmKHNub3cpe1xuICAgICAgICAgICAgICAgICAgICBzbm93LmNsZWFyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufSkoalF1ZXJ5KTtcbiIsIi8qKlxuICogbG9kYXNoIChDdXN0b20gQnVpbGQpIDxodHRwczovL2xvZGFzaC5jb20vPlxuICogQnVpbGQ6IGBsb2Rhc2ggbW9kdWxhcml6ZSBleHBvcnRzPVwibnBtXCIgLW8gLi9gXG4gKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9qcXVlcnkub3JnLz5cbiAqIFJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbiAqL1xuXG4vKiogVXNlZCBhcyB0aGUgYFR5cGVFcnJvcmAgbWVzc2FnZSBmb3IgXCJGdW5jdGlvbnNcIiBtZXRob2RzLiAqL1xudmFyIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJztcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTkFOID0gMCAvIDA7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZS4gKi9cbnZhciByZVRyaW0gPSAvXlxccyt8XFxzKyQvZztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJhZCBzaWduZWQgaGV4YWRlY2ltYWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmFkSGV4ID0gL15bLStdMHhbMC05YS1mXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmluYXJ5ID0gL14wYlswMV0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb2N0YWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzT2N0YWwgPSAvXjBvWzAtN10rJC9pO1xuXG4vKiogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgd2l0aG91dCBhIGRlcGVuZGVuY3kgb24gYHJvb3RgLiAqL1xudmFyIGZyZWVQYXJzZUludCA9IHBhcnNlSW50O1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHNlbGZgLiAqL1xudmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7XG5cbi8qKiBVc2VkIGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0LiAqL1xudmFyIHJvb3QgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXgsXG4gICAgbmF0aXZlTWluID0gTWF0aC5taW47XG5cbi8qKlxuICogR2V0cyB0aGUgdGltZXN0YW1wIG9mIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoYXQgaGF2ZSBlbGFwc2VkIHNpbmNlXG4gKiB0aGUgVW5peCBlcG9jaCAoMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuNC4wXG4gKiBAY2F0ZWdvcnkgRGF0ZVxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXN0YW1wLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmRlZmVyKGZ1bmN0aW9uKHN0YW1wKSB7XG4gKiAgIGNvbnNvbGUubG9nKF8ubm93KCkgLSBzdGFtcCk7XG4gKiB9LCBfLm5vdygpKTtcbiAqIC8vID0+IExvZ3MgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaXQgdG9vayBmb3IgdGhlIGRlZmVycmVkIGludm9jYXRpb24uXG4gKi9cbnZhciBub3cgP
10072SBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHJvb3QuRGF0ZS5ub3coKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRlYm91bmNlZCBmdW5jdGlvbiB0aGF0IGRlbGF5cyBpbnZva2luZyBgZnVuY2AgdW50aWwgYWZ0ZXIgYHdhaXRgXG4gKiBtaWxsaXNlY29uZHMgaGF2ZSBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGRlYm91bmNlZCBmdW5jdGlvbiB3YXNcbiAqIGludm9rZWQuIFRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gY29tZXMgd2l0aCBhIGBjYW5jZWxgIG1ldGhvZCB0byBjYW5jZWxcbiAqIGRlbGF5ZWQgYGZ1bmNgIGludm9jYXRpb25zIGFuZCBhIGBmbHVzaGAgbWV0aG9kIHRvIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLlxuICogUHJvdmlkZSBgb3B0aW9uc2AgdG8gaW5kaWNhdGUgd2hldGhlciBgZnVuY2Agc2hvdWxkIGJlIGludm9rZWQgb24gdGhlXG4gKiBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBlZGdlIG9mIHRoZSBgd2FpdGAgdGltZW91dC4gVGhlIGBmdW5jYCBpcyBpbnZva2VkXG4gKiB3aXRoIHRoZSBsYXN0IGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50XG4gKiBjYWxscyB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYFxuICogaW52b2NhdGlvbi5cbiAqXG4gKiAqKk5vdGU6KiogSWYgYGxlYWRpbmdgIGFuZCBgdHJhaWxpbmdgIG9wdGlvbnMgYXJlIGB0cnVlYCwgYGZ1bmNgIGlzXG4gKiBpbnZva2VkIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIGRlYm91bmNlZCBmdW5jdGlvblxuICogaXMgaW52b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIGB3YWl0YCB0aW1lb3V0LlxuICpcbiAqIElmIGB3YWl0YCBpcyBgMGAgYW5kIGBsZWFkaW5nYCBpcyBgZmFsc2VgLCBgZnVuY2AgaW52b2NhdGlvbiBpcyBkZWZlcnJlZFxuICogdW50aWwgdG8gdGhlIG5leHQgdGljaywgc2ltaWxhciB0byBgc2V0VGltZW91dGAgd2l0aCBhIHRpbWVvdXQgb2YgYDBgLlxuICpcbiAqIFNlZSBbRGF2aWQgQ29yYmFjaG8ncyBhcnRpY2xlXShodHRwczovL2Nzcy10cmlja3MuY29tL2RlYm91bmNpbmctdGhyb3R0bGluZy1leHBsYWluZWQtZXhhbXBsZXMvKVxuICogZm9yIGRldGFpbHMgb3ZlciB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBgXy5kZWJvdW5jZWAgYW5kIGBfLnRocm90dGxlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlYm91bmNlLlxuICogQHBhcmFtIHtudW1iZXJ9IFt3YWl0PTBdIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5LlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxlYWRpbmc9ZmFsc2VdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFdhaXRdXG4gKiAgVGhlIG1heGltdW0gdGltZSBgZnVuY2AgaXMgYWxsb3dlZCB0byBiZSBkZWxheWVkIGJlZm9yZSBpdCdzIGludm9rZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGRlYm91bmNlZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogLy8gQXZvaWQgY29zdGx5IGNhbGN1bGF0aW9ucyB3aGlsZSB0aGUgd2luZG93IHNpemUgaXMgaW4gZmx1eC5cbiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdyZXNpemUnLCBfLmRlYm91bmNlKGNhbGN1bGF0ZUxheW91dCwgMTUwKSk7XG4gKlxuICogLy8gSW52b2tlIGBzZW5kTWFpbGAgd2hlbiBjbGlja2VkLCBkZWJvdW5jaW5nIHN1YnNlcXVlbnQgY2FsbHMuXG4gKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgXy5kZWJvdW5jZShzZW5kTWFpbCwgMzAwLCB7XG4gKiAgICdsZWFkaW5nJzogdHJ1ZSxcbiAqICAgJ3RyYWlsaW5nJzogZmFsc2VcbiAqIH0pKTtcbiAqXG4gKiAvLyBFbnN1cmUgYGJhdGNoTG9nYCBpcyBpbnZva2VkIG9uY2UgYWZ0ZXIgMSBzZWNvbmQgb2YgZGVib3VuY2VkIGNhbGxzLlxuICogdmFyIGRlYm91bmNlZCA9IF8uZGVib3VuY2UoYmF0Y2hMb2csIDI1MCwgeyAnbWF4V2FpdCc6IDEwMDAgfSk7XG4gKiB2YXIgc291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvc3RyZWFtJyk7XG4gKiBqUXVlcnkoc291cmNlKS5vbignbWVzc2FnZScsIGRlYm91bmNlZCk7XG4gKlxuICogLy8gQ2FuY2VsIHRoZSB0cmFpbGluZyBkZWJvdW5jZWQgaW52b2NhdGlvbi5cbiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIGRlYm91bmNlZC5jYW5jZWwpO1xuICovXG5mdW5jdGlvbiBkZWJvdW5jZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gIHZhciBsYXN0QXJncyxcbiAgICAgIGxhc3RUaGlzLFxuICAgICAgbWF4V2FpdCxcbiAgICAgIHJlc3VsdCxcbiAgICAgIHRpbWVySWQsXG4gICAgICBsYXN0Q2FsbFRpbWUsXG4gICAgICBsYXN0SW52b2tlVGltZSA9IDAsXG4gICAgICBsZWFkaW5nID0gZmFsc2UsXG4gICAgICBtYXhpbmcgPSBmYWxzZSxcbiAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgfVxuICB3YWl0ID0gdG9OdW1iZXIod2FpdCkgfHwgMDtcbiAgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgbGVhZGluZyA9ICEhb3B0aW9ucy5sZWFkaW5nO1xuICAgIG1heGluZyA9ICdtYXhXYWl0JyBpbiBvcHRpb25zO1xuICAgIG1heFdhaXQgPSBtYXhpbmcgPyBuYXRpdmVNYXgodG9OdW1iZXIob3B0aW9ucy5tYXhXYWl0KSB8fCAwLCB3YWl0KSA6IG
100721heFdhaXQ7XG4gICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgfVxuXG4gIGZ1bmN0aW9uIGludm9rZUZ1bmModGltZSkge1xuICAgIHZhciBhcmdzID0gbGFzdEFyZ3MsXG4gICAgICAgIHRoaXNBcmcgPSBsYXN0VGhpcztcblxuICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7XG4gICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxlYWRpbmdFZGdlKHRpbWUpIHtcbiAgICAvLyBSZXNldCBhbnkgYG1heFdhaXRgIHRpbWVyLlxuICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICAvLyBTdGFydCB0aGUgdGltZXIgZm9yIHRoZSB0cmFpbGluZyBlZGdlLlxuICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgLy8gSW52b2tlIHRoZSBsZWFkaW5nIGVkZ2UuXG4gICAgcmV0dXJuIGxlYWRpbmcgPyBpbnZva2VGdW5jKHRpbWUpIDogcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gcmVtYWluaW5nV2FpdCh0aW1lKSB7XG4gICAgdmFyIHRpbWVTaW5jZUxhc3RDYWxsID0gdGltZSAtIGxhc3RDYWxsVGltZSxcbiAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZSxcbiAgICAgICAgcmVzdWx0ID0gd2FpdCAtIHRpbWVTaW5jZUxhc3RDYWxsO1xuXG4gICAgcmV0dXJuIG1heGluZyA/IG5hdGl2ZU1pbihyZXN1bHQsIG1heFdhaXQgLSB0aW1lU2luY2VMYXN0SW52b2tlKSA6IHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3VsZEludm9rZSh0aW1lKSB7XG4gICAgdmFyIHRpbWVTaW5jZUxhc3RDYWxsID0gdGltZSAtIGxhc3RDYWxsVGltZSxcbiAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZTtcblxuICAgIC8vIEVpdGhlciB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsLCBhY3Rpdml0eSBoYXMgc3RvcHBlZCBhbmQgd2UncmUgY
10072XQgdGhlXG4gICAgLy8gdHJhaWxpbmcgZWRnZSwgdGhlIHN5c3RlbSB0aW1lIGhhcyBnb25lIGJhY2t3YXJkcyBhbmQgd2UncmUgdHJlYXRpbmdcbiAgICAvLyBpdCBhcyB0aGUgdHJhaWxpbmcgZWRnZSwgb3Igd2UndmUgaGl0IHRoZSBgbWF4V2FpdGAgbGltaXQuXG4gICAgcmV0dXJuIChsYXN0Q2FsbFRpbWUgPT09IHVuZGVmaW5lZCB8fCAodGltZVNpbmNlTGFzdENhbGwgPj0gd2FpdCkgfHxcbiAgICAgICh0aW1lU2luY2VMYXN0Q2FsbCA8IDApIHx8IChtYXhpbmcgJiYgdGltZVNpbmNlTGFzdEludm9rZSA+PSBtYXhXYWl0KSk7XG4gIH1cblxuICBmdW5jdGlvbiB0aW1lckV4cGlyZWQoKSB7XG4gICAgdmFyIHRpbWUgPSBub3coKTtcbiAgICBpZiAoc2hvdWxkSW52b2tlKHRpbWUpKSB7XG4gICAgICByZXR1cm4gdHJhaWxpbmdFZGdlKHRpbWUpO1xuICAgIH1cbiAgICAvLyBSZXN0YXJ0IHRoZSB0aW1lci5cbiAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHJlbWFpbmluZ1dhaXQodGltZSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhaWxpbmdFZGdlKHRpbWUpIHtcbiAgICB0aW1lcklkID0gdW5kZWZpbmVkO1xuXG4gICAgLy8gT25seSBpbnZva2UgaWYgd2UgaGF2ZSBgbGFzdEFyZ3NgIHdoaWNoIG1lYW5zIGBmdW5jYCBoYXMgYmVlblxuICAgIC8vIGRlYm91bmNlZCBhdCBsZWFzdCBvbmNlLlxuICAgIGlmICh0cmFpbGluZyAmJiBsYXN0QXJncykge1xuICAgICAgcmV0dXJuIGludm9rZUZ1bmModGltZSk7XG4gICAgfVxuICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICBpZiAodGltZXJJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgfVxuICAgIGxhc3RJbnZva2VUaW1lID0gMDtcbiAgICBsYXN0QXJncyA9IGxhc3RDYWxsVGltZSA9IGxhc3RUaGlzID0gdGltZXJJZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZsdXNoKCkge1xuICAgIHJldHVybiB0aW1lcklkID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiB0cmFpbGluZ0VkZ2Uobm93KCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVib3VuY2VkKCkge1xuICAgIHZhciB0aW1lID0gbm93KCksXG4gICAgICAgIGlzSW52b2tpbmcgPSBzaG91bGRJbnZva2UodGltZSk7XG5cbiAgICBsYXN0QXJncyA9IGFyZ3VtZW50cztcbiAgICBsYXN0VGhpcyA9IHRoaXM7XG4gICAgbGFzdENhbGxUaW1lID0gdGltZTtcblxuICAgIGlmIChpc0ludm9raW5nKSB7XG4gICAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBsZWFkaW5nRWRnZShsYXN0Q2FsbFRpbWUpO1xuICAgICAgfVxuICAgICAgaWYgKG1heGluZykge1xuICAgICAgICAvLyBIYW5kbGUgaW52b2NhdGlvbnMgaW4gYSB0aWdodCBsb29wLlxuICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgICAgICByZXR1cm4gaW52b2tlRnVuYyhsYXN0Q2FsbFRpbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGRlYm91bmNlZC5jYW5jZWwgPSBjYW5jZWw7XG4gIGRlYm91bmNlZC5mbHVzaCA9IGZsdXNoO1xuICByZXR1cm4gZGVib3VuY2VkO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICogW2xhbmd1YWdlIHR5cGVdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzKVxuICogb2YgYE9iamVjdGAuIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKVxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0KHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChfLm5vb3ApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuICEhdmFsdWUgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzeW1ib2wsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N5bWJvbChTeW1ib2wuaXRlcmF0b3IpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTeW1ib2woJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3ltYm9sJyB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpID09IHN5bWJvbFRhZyk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b051bWJlcigzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICogLy8gPT4gSW5maW5pdHlcbiAqXG4gKiBfLnRvTnVtYmVyKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gTkFOO1xuICB9XG4gIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG4gIH1cbiAgdmFsdWUgPSB2YWx1ZS
100725yZXBsYWNlKHJlVHJpbSwgJycpO1xuICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkZWJvdW5jZTtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQpIHtcbiAgICBpZiAodGFyZ2V0ID09PSB1bmRlZmluZWQgfHwgdGFyZ2V0ID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgIH1cblxuICAgIGNvbnN0IG91dHB1dCA9IE9iamVjdCh0YXJnZXQpO1xuICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBhcmd1bWVudHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGFyZ3VtZW50c1tpbmRleF07XG4gICAgICAgIGlmIChzb3VyY2UgIT09IHVuZGVmaW5lZCAmJiBzb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbmV4dEtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoc291cmNlLmhhc093blByb3BlcnR5KG5leHRLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtuZXh0S2V5XSA9IHNvdXJjZVtuZXh0S2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbn1cbiIsImltcG9ydCBhc3NpZ24gZnJvbSAnLi9hc3NpZ24nO1xuXG5pZiAodHlwZW9mIE9iamVjdC5hc3NpZ24gIT09ICdmdW5jdGlvbicpIHtcbiAgICBPYmplY3QuYXNzaWduID0gYXNzaWduO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnQgdmFyIFBpcHNNb2RlO1xuKGZ1bmN0aW9uIChQaXBzTW9kZSkge1xuICAgIFBpcHNNb2RlW1wiUmFuZ2VcIl0gPSBcInJhbmdlXCI7XG4gICAgUGlwc01vZGVbXCJTdGVwc1wiXSA9IFwic3RlcHNcIjtcbiAgICBQaXBzTW9kZVtcIlBvc2l0aW9uc1wiXSA9IFwicG9zaXRpb25zXCI7XG4gICAgUGlwc01vZGVbXCJDb3VudFwiXSA9IFwiY291bnRcIjtcbiAgICBQaXBzTW9kZVtcIlZhbHVlc1wiXSA9IFwidmFsdWVzXCI7XG59KShQaXBzTW9kZSB8fCAoUGlwc01vZGUgPSB7fSkpO1xuZXhwb3J0IHZhciBQaXBzVHlwZTtcbihmdW5jdGlvbiAoUGlwc1R5cGUpIHtcbiAgICBQaXBzVHlwZVtQaXBzVHlwZVtcIk5vbmVcIl0gPSAtMV0gPSBcIk5vbmVcIjtcbiAgICBQaXBzVHlwZVtQaXBzVHlwZVtcIk5vVmFsdWVcIl0gPSAwXSA9IFwiTm9WYWx1ZVwiO1xuICAgIFBpcHNUeXBlW1BpcHNUeXBlW1wiTGFyZ2VWYWx1ZVwiXSA9IDFdID0gXCJMYXJnZVZhbHVlXCI7XG4gICAgUGlwc1R5cGVbUGlwc1R5cGVbXCJTbWFsbFZhbHVlXCJdID0gMl0gPSBcIlNtYWxsVmFsdWVcIjtcbn0pKFBpcHNUeXBlIHx8IChQaXBzVHlwZSA9IHt9KSk7XG4vL3JlZ2lvbiBIZWxwZXIgTWV0aG9kc1xuZnVuY3Rpb24gaXNWYWxpZEZvcm1hdHRlcihlbnRyeSkge1xuICAgIHJldHVybiBpc1ZhbGlkUGFydGlhbEZvcm1hdHRlcihlbnRyeSkgJiYgdHlwZW9mIGVudHJ5LmZyb20gPT09IFwiZnVuY3Rpb25cIjtcbn1cbmZ1bmN0aW9uIGlzVmFsaWRQYXJ0aWFsRm9ybWF0dGVyKGVudHJ5KSB7XG4gICAgLy8gcGFydGlhbCBmb3JtYXR0ZXJzIG9ubHkgbmVlZCBhIHRvIGZ1bmN0aW9uIGFuZCBub3QgYSBmcm9tIGZ1bmN0aW9uXG4gICAgcmV0dXJuIHR5cGVvZiBlbnRyeSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgZW50cnkudG8gPT09IFwiZnVuY3Rpb25cIjtcbn1cbmZ1bmN0aW9uIHJlbW92ZUVsZW1lbnQoZWwpIHtcbiAgICBlbC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGVsKTtcbn1cbmZ1bmN0aW9uIGlzU2V0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQ7XG59XG4vLyBCaW5kYWJsZSB2ZXJzaW9uXG5mdW5jdGlvbiBwcmV2ZW50RGVmYXVsdChlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xufVxuLy8gUmVtb3ZlcyBkdXBsaWNhdGVzIGZyb20gYW4gYXJyYXkuXG5mdW5jdGlvbiB1bmlxdWUoYXJyYXkpIHtcbiAgICByZXR1cm4gYXJyYXkuZmlsdGVyKGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIHJldHVybiAhdGhpc1thXSA/ICh0aGlzW2FdID0gdHJ1ZSkgOiBmYWxzZTtcbiAgICB9LCB7fSk7XG59XG4vLyBSb3VuZCBhIHZhbHVlIHRvIHRoZSBjbG9zZXN0ICd0bycuXG5mdW5jdGlvbiBjbG9zZXN0KHZhbHVlLCB0bykge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlIC8gdG8pICogdG87XG59XG4vLyBDdXJyZW50IHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgcmVsYXRpdmUgdG8gdGhlIGRvY3VtZW50LlxuZnVuY3Rpb24gb2Zmc2V0KGVsZW0sIG9yaWVudGF0aW9uKSB7XG4gICAgdmFyIHJlY3QgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHZhciBkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQ7XG4gICAgdmFyIGRvY0VsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50O1xuICAgIHZhciBwYWdlT2Zmc2V0ID0gZ2V0UGFnZU9mZnNldChkb2MpO1xuICAgIC8vIGdldEJvdW5kaW5nQ2xpZW50UmVjdCBjb250YWlucyBsZWZ0IHNjcm9sbCBpbiBDaHJvbWUgb24gQW5kcm9pZC5cbiAgICAvLyBJIGhhdmVuJ3QgZm91bmQgYSBmZWF0dXJlIGRldGVjdGlvbiB0aGF0IHByb3ZlcyB0aGlzLiBXb3JzdCBjYXNlXG4gICAgLy8gc2NlbmFyaW8gb24gbWlzLW1hdGNoOiB0aGUgJ3RhcCcgZmVhdHVyZSBvbiBob3Jpem9udGFsIHNsaWRlcnMgYnJlYWtzLlxuICAgIGlmICgvd2Via2l0LipDaHJvbWUuKk1vYmlsZS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpIHtcbiAgICAgICAgcGFnZU9mZnNldC54ID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIG9yaWVudGF0aW9uID8gcmVjdC50b3AgKyBwYWdlT2Zmc2V0LnkgLSBkb2
10072NFbGVtLmNsaWVudFRvcCA6IHJlY3QubGVmdCArIHBhZ2VPZmZzZXQueCAtIGRvY0VsZW0uY2xpZW50TGVmdDtcbn1cbi8vIENoZWNrcyB3aGV0aGVyIGEgdmFsdWUgaXMgbnVtZXJpY2FsLlxuZnVuY3Rpb24gaXNOdW1lcmljKGEpIHtcbiAgICByZXR1cm4gdHlwZW9mIGEgPT09IFwibnVtYmVyXCIgJiYgIWlzTmFOKGEpICYmIGlzRmluaXRlKGEpO1xufVxuLy8gU2V0cyBhIGNsYXNzIGFuZCByZW1vdmVzIGl0IGFmdGVyIFtkdXJhdGlvbl0gbXMuXG5mdW5jdGlvbiBhZGRDbGFzc0ZvcihlbGVtZW50LCBjbGFzc05hbWUsIGR1cmF0aW9uKSB7XG4gICAgaWYgKGR1cmF0aW9uID4gMCkge1xuICAgICAgICBhZGRDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpO1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSk7XG4gICAgICAgIH0sIGR1cmF0aW9uKTtcbiAgICB9XG59XG4vLyBMaW1pdHMgYSB2YWx1ZSB0byAwIC0gMTAwXG5mdW5jdGlvbiBsaW1pdChhKSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KE1hdGgubWluKGEsIDEwMCksIDApO1xufVxuLy8gV3JhcHMgYSB2YXJpYWJsZSBhcyBhbiBhcnJheSwgaWYgaXQgaXNuJ3Qgb25lIHlldC5cbi8vIE5vdGUgdGhhdCBhbiBpbnB1dCBhcnJheSBpcyByZXR1cm5lZCBieSByZWZlcmVuY2UhXG5mdW5jdGlvbiBhc0FycmF5KGEpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShhKSA/IGEgOiBbYV07XG59XG4vLyBDb3VudHMgZGVjaW1hbHNcbmZ1bmN0aW9uIGNvdW50RGVjaW1hbHMobnVtU3RyKSB7XG4gICAgbnVtU3RyID0gU3RyaW5nKG51bVN0cik7XG4gICAgdmFyIHBpZWNlcyA9IG51bVN0ci5zcGxpdChcIi5cIik7XG4gICAgcmV0dXJuIHBpZWNlcy5sZW5ndGggPiAxID8gcGllY2VzWzFdLmxlbmd0aCA6IDA7XG59XG4vLyBodHRwOi8veW91bWlnaHRub3RuZWVkanF1ZXJ5LmNvbS8jYWRkX2NsYXNzXG5mdW5jdGlvbiBhZGRDbGFzcyhlbCwgY2xhc3NOYW1lKSB7XG4gICAgaWYgKGVsLmNsYXNzTGlzdCAmJiAhL1xccy8udGVzdChjbGFzc05hbWUpKSB7XG4gICAgICAgIGVsLmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGVsLmNsYXNzTmFtZSArPSBcIiBcIiArIGNsYXNzTmFtZTtcbiAgICB9XG59XG4vLyBodHRwOi8veW91bWlnaHRub3RuZWVkanF1ZXJ5LmNvbS8jcmVtb3ZlX2NsYXNzXG5mdW5jdGlvbiByZW1vdmVDbGFzcyhlbCwgY2xhc3NOYW1lKSB7XG4gICAgaWYgKGVsLmNsYXNzTGlzdCAmJiAhL1xccy8udGVzdChjbGFzc05hbWUpKSB7XG4gICAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGVsLmNsYXNzTmFtZSA9IGVsLmNsYXNzTmFtZS5yZXBsYWNlKG5ldyBSZWdFeHAoXCIoXnxcXFxcYilcIiArIGNsYXNzTmFtZS5zcGxpdChcIiBcIikuam9pbihcInxcIikgKyBcIihcXFxcYnwkKVwiLCBcImdpXCIpLCBcIiBcIik7XG4gICAgfVxufVxuLy8gaHR0cHM6Ly9wbGFpbmpzLmNvbS9qYXZhc2NyaXB0L2F0dHJpYnV0ZXMvYWRkaW5nLXJlbW92aW5nLWFuZC10ZXN0aW5nLWZvci1jbGFzc2VzLTkvXG5mdW5jdGlvbiBoYXNDbGFzcyhlbCwgY2xhc3NOYW1lKSB7XG4gICAgcmV0dXJuIGVsLmNsYXNzTGlzdCA/IGVsLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpIDogbmV3IFJlZ0V4cChcIlxcXFxiXCIgKyBjbGFzc05hbWUgKyBcIlxcXFxiXCIpLnRlc3QoZWwuY2xhc3NOYW1lKTtcbn1cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XaW5kb3cvc2Nyb2xsWSNOb3Rlc1xuZnVuY3Rpb24gZ2V0UGFnZU9mZnNldChkb2MpIHtcbiAgICB2YXIgc3VwcG9ydFBhZ2VPZmZzZXQgPSB3aW5kb3cucGFnZVhPZmZzZXQgIT09IHVuZGVmaW5lZDtcbiAgICB2YXIgaXNDU1MxQ29tcGF0ID0gKGRvYy5jb21wYXRNb2RlIHx8IFwiXCIpID09PSBcIkNTUzFDb21wYXRcIjtcbiAgICB2YXIgeCA9IHN1cHBvcnRQYWdlT2Zmc2V0XG4gICAgICAgID8gd2luZG93LnBhZ2VYT2Zmc2V0XG4gICAgICAgIDogaXNDU1MxQ29tcGF0XG4gICAgICAgICAgICA/IGRvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdFxuICAgICAgICAgICAgOiBkb2MuYm9keS5zY3JvbGxMZWZ0O1xuICAgIHZhciB5ID0gc3VwcG9ydFBhZ2VPZmZzZXRcbiAgICAgICAgPyB3aW5kb3cucGFnZVlPZmZzZXRcbiAgICAgICAgOiBpc0NTUzFDb21wYXRcbiAgICAgICAgICAgID8gZG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3BcbiAgICAgICAgICAgIDogZG9jLmJvZHkuc2Nyb2xsVG9wO1xuICAgIHJldHVybiB7XG4gICAgICAgIHg6IHgsXG4gICAgICAgIHk6IHksXG4gICAgfTtcbn1cbi8vIHdlIHByb3ZpZGUgYSBmdW5jdGlvbiB0byBjb21wdXRlIGNvbnN0YW50cyBpbnN0ZWFkXG4vLyBvZiBhY2Nlc3Npbmcgd2luZG93LiogYXMgc29vbiBhcyB0aGUgbW9kdWxlIG5lZWRzIGl0XG4vLyBzbyB0aGF0IHdlIGRvIG5vdCBjb21wdXRlIGFueXRoaW5nIGlmIG5vdCBuZWVkZWRcbmZ1bmN0aW9uIGdldEFjdGlvbnMoKSB7XG4gICAgLy8gRGV0ZXJtaW5lIHRoZSBldmVudHMgdG8gYmluZC4gSUUxMSBpbXBsZW1lbnRzIHBvaW50ZXJFdmVudHMgd2l0aG91dFxuICAgIC8vIGEgcHJlZml4LCB3aGljaCBicmVha3MgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBJRTEwIGltcGxlbWVudGF0aW9uLlxuICAgIHJldHVybiB3aW5kb3cubmF2aWdhdG9yLnBvaW50ZXJFbmFibGVkXG4gICAgICAgID8ge1xuICAgICAgICAgICAgc3RhcnQ6IFwicG9pbnRlcmRvd25cIixcbiAgICAgICAgICAgIG1vdmU6IFwicG9pbnRlcm1vdmVcIixcbiAgICAgICAgICAgIGVuZDogXCJwb2ludGVydXBcIixcbiAgICAgICAgfVxuICAgICAgICA6IHdpbmRvdy5uYXZpZ2F0b3IubXNQb2ludGVyRW5hYmxlZFxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IFwiTVNQb2ludGVyRG93blwiLFxuICAgICAgICAgICAgICAgIG1vdmU6IFwiTVNQb2ludGVyTW92ZVwiLFxuICAgICAgICAgICAgICAgIGVuZDogXCJNU1BvaW50ZXJVcFwiLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IFwibW91c2Vkb3duIHRvdWNoc3RhcnRcIixcbiAgICAgICAgICAgICAgICBtb3ZlOiBcIm1vdXNlbW92ZSB0b3VjaG1vdmVcIixcbiAgICAgICAgICAgICAgICBlbmQ6IFwibW91c2V1cCB0b3VjaGVuZFwiLFxuICAgICAgICAgICAgfTtcbn1cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9XSUNHL0V2ZW50TGlzdGVuZXJPcHRpb25zL2Jsb2IvZ2gtcGFnZXMvZXhwbGFpbmVyLm1kXG4vLyBJc3N1ZSAjNzg1XG5mdW5jdGlvbiBnZXRTdXBwb3J0c1Bhc3NpdmUoKSB7XG4gICAgdmFyIHN1cHBvcnRzUGFzc2l2ZSA9IGZhbHNlO1xuICAgIC8qIGVzbGludC1kaXNhYmxlICovXG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIG9wdHMgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sIFwicGFzc2l2ZVwiLCB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzdXBwb3J0c1Bhc3NpdmUgPSB0cnVlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJ0ZXN0XCIsIG51bGwsIG9wdHMpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkgeyB9XG4gICAgLyogZXNsaW50LWVuYWJsZSAqL1xuICAgIHJldHVybi
10072BzdXBwb3J0c1Bhc3NpdmU7XG59XG5mdW5jdGlvbiBnZXRTdXBwb3J0c1RvdWNoQWN0aW9uTm9uZSgpIHtcbiAgICByZXR1cm4gd2luZG93LkNTUyAmJiBDU1Muc3VwcG9ydHMgJiYgQ1NTLnN1cHBvcnRzKFwidG91Y2gtYWN0aW9uXCIsIFwibm9uZVwiKTtcbn1cbi8vZW5kcmVnaW9uXG4vL3JlZ2lvbiBSYW5nZSBDYWxjdWxhdGlvblxuLy8gRGV0ZXJtaW5lIHRoZSBzaXplIG9mIGEgc3ViLXJhbmdlIGluIHJlbGF0aW9uIHRvIGEgZnVsbCByYW5nZS5cbmZ1bmN0aW9uIHN1YlJhbmdlUmF0aW8ocGEsIHBiKSB7XG4gICAgcmV0dXJuIDEwMCAvIChwYiAtIHBhKTtcbn1cbi8vIChwZXJjZW50YWdlKSBIb3cgbWFueSBwZXJjZW50IGlzIHRoaXMgdmFsdWUgb2YgdGhpcyByYW5nZT9cbmZ1bmN0aW9uIGZyb21QZXJjZW50YWdlKHJhbmdlLCB2YWx1ZSwgc3RhcnRSYW5nZSkge1xuICAgIHJldHVybiAodmFsdWUgKiAxMDApIC8gKHJhbmdlW3N0YXJ0UmFuZ2UgKyAxXSAtIHJhbmdlW3N0YXJ0UmFuZ2VdKTtcbn1cbi8vIChwZXJjZW50YWdlKSBXaGVyZSBpcyB0aGlzIHZhbHVlIG9uIHRoaXMgcmFuZ2U/XG5mdW5jdGlvbiB0b1BlcmNlbnRhZ2UocmFuZ2UsIHZhbHVlKSB7XG4gICAgcmV0dXJuIGZyb21QZXJjZW50YWdlKHJhbmdlLCByYW5nZVswXSA8IDAgPyB2YWx1ZSArIE1hdGguYWJzKHJhbmdlWzBdKSA6IHZhbHVlIC0gcmFuZ2VbMF0sIDApO1xufVxuLy8gKHZhbHVlKSBIb3cgbXVjaCBpcyB0aGlzIHBlcmNlbnRhZ2Ugb24gdGhpcyByYW5nZT9cbmZ1bmN0aW9uIGlzUGVyY2VudGFnZShyYW5nZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gKHZhbHVlICogKHJhbmdlWzFdIC0gcmFuZ2VbMF0pKSAvIDEwMCArIHJhbmdlWzBdO1xufVxuZnVuY3Rpb24gZ2V0Sih2YWx1ZSwgYXJyKSB7XG4gICAgdmFyIGogPSAxO1xuICAgIHdoaWxlICh2YWx1ZSA+PSBhcnJbal0pIHtcbiAgICAgICAgaiArPSAxO1xuICAgIH1cbiAgICByZXR1cm4gajtcbn1cbi8vIChwZXJjZW50YWdlKSBJbnB1dCBhIHZhbHVlLCBmaW5kIHdoZXJlLCBvbiBhIHNjYWxlIG9mIDAtMTAwLCBpdCBhcHBsaWVzLlxuZnVuY3Rpb24gdG9TdGVwcGluZyh4VmFsLCB4UGN0LCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA+PSB4VmFsLnNsaWNlKC0xKVswXSkge1xuICAgICAgICByZXR1cm4gMTAwO1xuICAgIH1cbiAgICB2YXIgaiA9IGdldEoodmFsdWUsIHhWYWwpO1xuICAgIHZhciB2YSA9IHhWYWxbaiAtIDFdO1xuICAgIHZhciB2YiA9IHhWYWxbal07XG4gICAgdmFyIHBhID0geFBjdFtqIC0gMV07XG4gICAgdmFyIHBiID0geFBjdFtqXTtcbiAgICByZXR1cm4gcGEgKyB0b1BlcmNlbnRhZ2UoW3ZhLCB2Yl0sIHZhbHVlKSAvIHN1YlJhbmdlUmF0aW8ocGEsIHBiKTtcbn1cbi8vICh2YWx1ZSkgSW5wdXQgYSBwZXJjZW50YWdlLCBmaW5kIHdoZXJlIGl0IGlzIG9uIHRoZSBzcGVjaWZpZWQgcmFuZ2UuXG5mdW5jdGlvbiBmcm9tU3RlcHBpbmcoeFZhbCwgeFBjdCwgdmFsdWUpIHtcbiAgICAvLyBUaGVyZSBpcyBubyByYW5nZSBncm91cCB0aGF0IGZpdHMgMTAwXG4gICAgaWYgKHZhbHVlID49IDEwMCkge1xuICAgICAgICByZXR1cm4geFZhbC5zbGljZSgtMSlbMF07XG4gICAgfVxuICAgIHZhciBqID0gZ2V0Sih2YWx1ZSwgeFBjdCk7XG4gICAgdmFyIHZhID0geFZhbFtqIC0gMV07XG4gICAgdmFyIHZiID0geFZhbFtqXTtcbiAgICB2YXIgcGEgPSB4UGN0W2ogLSAxXTtcbiAgICB2YXIgcGIgPSB4UGN0W2pdO1xuICAgIHJldHVybiBpc1BlcmNlbnRhZ2UoW3ZhLCB2Yl0sICh2YWx1ZSAtIHBhKSAqIHN1YlJhbmdlUmF0aW8ocGEsIHBiKSk7XG59XG4vLyAocGVyY2VudGFnZSkgR2V0IHRoZSBzdGVwIHRoYXQgYXBwbGllcyBhdCBhIGNlcnRhaW4gdmFsdWUuXG5mdW5jdGlvbiBnZXRTdGVwKHhQY3QsIHhTdGVwcywgc25hcCwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT09IDEwMCkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHZhciBqID0gZ2V0Sih2YWx1ZSwgeFBjdCk7XG4gICAgdmFyIGEgPSB4UGN0W2ogLSAxXTtcbiAgICB2YXIgYiA9IHhQY3Rbal07XG4gICAgLy8gSWYgJ3NuYXAnIGlzIHNldCwgc3RlcHMgYXJlIHVzZWQgYXMgZml4ZWQgcG9pbnRzIG9uIHRoZSBzbGlkZXIuXG4gICAgaWYgKHNuYXApIHtcbiAgICAgICAgLy8gRmluZCB0aGUgY2xvc2VzdCBwb3NpdGlvbiwgYSBvciBiLlxuICAgICAgICBpZiAodmFsdWUgLSBhID4gKGIgLSBhKSAvIDIpIHtcbiAgICAgICAgICAgIHJldHVybiBiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhO1xuICAgIH1cbiAgICBpZiAoIXhTdGVwc1tqIC0gMV0pIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4geFBjdFtqIC0gMV0gKyBjbG9zZXN0KHZhbHVlIC0geFBjdFtqIC0gMV0sIHhTdGVwc1tqIC0gMV0pO1xufVxuLy9lbmRyZWdpb25cbi8vcmVnaW9uIFNwZWN0cnVtXG52YXIgU3BlY3RydW0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU3BlY3RydW0oZW50cnksIHNuYXAsIHNpbmdsZVN0ZXApIHtcbiAgICAgICAgdGhpcy54UGN0ID0gW107XG4gICAgICAgIHRoaXMueFZhbCA9IFtdO1xuICAgICAgICB0aGlzLnhTdGVwcyA9IFtdO1xuICAgICAgICB0aGlzLnhOdW1TdGVwcyA9IFtdO1xuICAgICAgICB0aGlzLnhIaWdoZXN0Q29tcGxldGVTdGVwID0gW107XG4gICAgICAgIHRoaXMueFN0ZXBzID0gW3NpbmdsZVN0ZXAgfHwgZmFsc2VdO1xuICAgICAgICB0aGlzLnhOdW1TdGVwcyA9IFtmYWxzZV07XG4gICAgICAgIHRoaXMuc25hcCA9IHNuYXA7XG4gICAgICAgIHZhciBpbmRleDtcbiAgICAgICAgdmFyIG9yZGVyZWQgPSBbXTtcbiAgICAgICAgLy8gTWFwIHRoZSBvYmplY3Qga2V5cyB0byBhbiBhcnJheS5cbiAgICAgICAgT2JqZWN0LmtleXMoZW50cnkpLmZvckVhY2goZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgICAgICBvcmRlcmVkLnB1c2goW2FzQXJyYXkoZW50cnlbaW5kZXhdKSwgaW5kZXhdKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFNvcnQgYWxsIGVudHJpZXMgYnkgdmFsdWUgKG51bWVyaWMgc29ydCkuXG4gICAgICAgIG9yZGVyZWQuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgcmV0dXJuIGFbMF1bMF0gLSBiWzBdWzBdO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gQ29udmVydCBhbGwgZW50cmllcyB0byBzdWJyYW5nZXMuXG4gICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG9yZGVyZWQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUVudHJ5UG9pbnQob3JkZXJlZFtpbmRleF1bMV0sIG9yZGVyZWRbaW5kZXhdWzBdKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTdG9yZSB0aGUgYWN0dWFsIHN0ZXAgdmFsdWVzLlxuICAgICAgICAvLyB4U3RlcHMgaXMgc29ydGVkIGluIHRoZSBzYW1lIG9yZGVyIGFzIHhQY3QgYW5kIHhWYWwuXG4gICAgICAgI
10072HRoaXMueE51bVN0ZXBzID0gdGhpcy54U3RlcHMuc2xpY2UoMCk7XG4gICAgICAgIC8vIENvbnZlcnQgYWxsIG51bWVyaWMgc3RlcHMgdG8gdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHN1YnJhbmdlIHRoZXkgcmVwcmVzZW50LlxuICAgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnhOdW1TdGVwcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlU3RlcFBvaW50KGluZGV4LCB0aGlzLnhOdW1TdGVwc1tpbmRleF0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIFNwZWN0cnVtLnByb3RvdHlwZS5nZXREaXN0YW5jZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgZGlzdGFuY2VzID0gW107XG4gICAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnhOdW1TdGVwcy5sZW5ndGggLSAxOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBkaXN0YW5jZXNbaW5kZXhdID0gZnJvbVBlcmNlbnRhZ2UodGhpcy54VmFsLCB2YWx1ZSwgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkaXN0YW5jZXM7XG4gICAgfTtcbiAgICAvLyBDYWxjdWxhdGUgdGhlIHBlcmNlbnR1YWwgZGlzdGFuY2Ugb3ZlciB0aGUgd2hvbGUgc2NhbGUgb2YgcmFuZ2VzLlxuICAgIC8vIGRpcmVjdGlvbjogMCA9IGJhY2t3YXJkcyAvIDEgPSBmb3J3YXJkc1xuICAgIFNwZWN0cnVtLnByb3RvdHlwZS5nZXRBYnNvbHV0ZURpc3RhbmNlID0gZnVuY3Rpb24gKHZhbHVlLCBkaXN0YW5jZXMsIGRpcmVjdGlvbikge1xuICAgICAgICB2Y
10072XIgeFBjdF9pbmRleCA9IDA7XG4gICAgICAgIC8vIENhbGN1bGF0ZSByYW5nZSB3aGVyZSB0byBzdGFydCBjYWxjdWxhdGlvblxuICAgICAgICBpZiAodmFsdWUgPCB0aGlzLnhQY3RbdGhpcy54UGN0Lmxlbmd0aCAtIDFdKSB7XG4gICAgICAgICAgICB3aGlsZSAodmFsdWUgPiB0aGlzLnhQY3RbeFBjdF9pbmRleCArIDFdKSB7XG4gICAgICAgICAgICAgICAgeFBjdF9pbmRleCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZhbHVlID09PSB0aGlzLnhQY3RbdGhpcy54UGN0Lmxlbmd0aCAtIDFdKSB7XG4gICAgICAgICAgICB4UGN0X2luZGV4ID0gdGhpcy54UGN0Lmxlbmd0aCAtIDI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgbG9va2luZyBiYWNrd2FyZHMgYW5kIHRoZSB2YWx1ZSBpcyBleGFjdGx5IGF0IGEgcmFuZ2Ugc2VwYXJhdG9yIHRoZW4gbG9vayBvbmUgcmFuZ2UgZnVydGhlclxuICAgICAgICBpZiAoIWRpcmVjdGlvbiAmJiB2YWx1ZSA9PT0gdGhpcy54UGN0W3hQY3RfaW5kZXggKyAxXSkge1xuICAgICAgICAgICAgeFBjdF9pbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaXN0YW5jZXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGRpc3RhbmNlcyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzdGFydF9mYWN0b3I7XG4gICAgICAgIHZhciByZXN0X2ZhY3RvciA9IDE7XG4gICAgICAgIHZhciByZXN0X3JlbF9kaXN0YW5jZSA9IGRpc3RhbmNlc1t4UGN0X2luZGV4XTtcbiAgICAgICAgdmFyIHJhbmdlX3BjdCA9IDA7XG4gICAgICAgIHZhciByZWxfcmFuZ2VfZGlzdGFuY2UgPSAwO1xuICAgICAgICB2Y
10072XIgYWJzX2Rpc3RhbmNlX2NvdW50ZXIgPSAwO1xuICAgICAgICB2YXIgcmFuZ2VfY291bnRlciA9IDA7XG4gICAgICAgIC8vIENhbGN1bGF0ZSB3aGF0IHBhcnQgb2YgdGhlIHN0YXJ0IHJhbmdlIHRoZSB2YWx1ZSBpc1xuICAgICAgICBpZiAoZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICBzdGFydF9mYWN0b3IgPSAodmFsdWUgLSB0aGlzLnhQY3RbeFBjdF9pbmRleF0pIC8gKHRoaXMueFBjdFt4UGN0X2luZGV4ICsgMV0gLSB0aGlzLnhQY3RbeFBjdF9pbmRleF0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3RhcnRfZmFjdG9yID0gKHRoaXMueFBjdFt4UGN0X2luZGV4ICsgMV0gLSB2YWx1ZSkgLyAodGhpcy54UGN0W3hQY3RfaW5kZXggKyAxXSAtIHRoaXMueFBjdFt4UGN0X2luZGV4XSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRG8gdW50aWwgdGhlIGNvbXBsZXRlIGRpc3RhbmNlIGFjcm9zcyByYW5nZXMgaXMgY2FsY3VsYXRlZFxuICAgICAgICB3aGlsZSAocmVzdF9yZWxfZGlzdGFuY2UgPiAwKSB7XG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIHBlcmNlbnRhZ2Ugb2YgdG90YWwgcmFuZ2VcbiAgICAgICAgICAgIHJhbmdlX3BjdCA9IHRoaXMueFBjdFt4UGN0X2luZGV4ICsgMSArIHJhbmdlX2NvdW50ZXJdIC0gdGhpcy54UGN0W3hQY3RfaW5kZXggKyByYW5nZV9jb3VudGVyXTtcbiAgICAgICAgICAgIC8vIERldGVjdCBpZiB0aGUgbWFyZ2luLCBwYWRkaW5nIG9yIGxpbWl0IGlzIGxhcmdlciB0aGVuIHRoZSBjdXJyZW50IHJhbmdlIGFuZCBjYWxjdWxhdGVcbiAgICAgICAgICAgIGlmIChkaXN0YW5jZXNbeFBjdF9pbmRleCArIHJhbmdlX2NvdW50ZXJdICogcmVzdF9mYWN0b3IgKyAxMDAgLSBzdGFydF9mYWN0b3IgKiAxMDAgPiAxMDApIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBsYXJnZXIgdGhlbiB0YWtlIHRoZSBwZXJjZW50dWFsIGRpc3RhbmNlIG9mIHRoZSB3aG9sZSByYW5nZVxuICAgICAgICAgICAgICAgIHJlbF9yYW5nZV9kaXN0YW5jZSA9IHJhbmdlX3BjdCAqIHN0YXJ0X2ZhY3RvcjtcbiAgICAgICAgICAgICAgICAvLyBSZXN0IGZhY3RvciBvZiByZWxhdGl2ZSBwZXJjZW50dWFsIGRpc3RhbmNlIHN0aWxsIHRvIGJlIGNhbGN1bGF0ZWRcbiAgICAgICAgICAgICAgICByZXN0X2ZhY3RvciA9IChyZXN0X3JlbF9kaXN0YW5jZSAtIDEwMCAqIHN0YXJ0X2ZhY3RvcikgLyBkaXN0YW5jZXNbeFBjdF9pbmRleCArIHJhbmdlX2NvdW50ZXJdO1xuICAgICAgICAgICAgICAgIC8vIFNldCBzdGFydCBmYWN0b3IgdG8gMSBhcyBmb3IgbmV4dCByYW5nZSBpdCBkb2VzIG5vdCBhcHBseS5cbiAgICAgICAgICAgICAgICBzdGFydF9mYWN0b3IgPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgc21hbGxlciBvciBlcXVhbCB0aGVuIHRha2UgdGhlIHBlcmNlbnR1YWwgZGlzdGFuY2Ugb2YgdGhlIGNhbGN1bGF0ZSBwZXJjZW50dWFsIHBhcnQgb2YgdGhhdCByYW5nZVxuICAgICAgICAgICAgICAgIHJlbF9yYW5nZV9kaXN0YW5jZSA9ICgoZGlzdGFuY2VzW3hQY3RfaW5kZXggKyByYW5nZV9jb3VudGVyXSAqIHJhbmdlX3BjdCkgLyAxMDApICogcmVzdF9mYWN0b3I7XG4gICAgICAgICAgICAgICAgLy8gTm8gcmVzdCBsZWZ0IGFzIHRoZSByZXN0IGZpdHMgaW4gY3VycmVudCByYW5nZVxuICAgICAgICAgICAgICAgIHJlc3RfZmFjdG9yID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkaXJlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBhYnNfZGlzdGFuY2VfY291bnRlciA9IGFic19kaXN0YW5jZV9jb3VudGVyIC0gcmVsX3JhbmdlX2Rpc3RhbmNlO1xuICAgICAgICAgICAgICAgIC8vIExpbWl0IHJhbmdlIHRvIGZpcnN0IHJhbmdlIHdoZW4gZGlzdGFuY2UgYmVjb21lcyBvdXRzaWRlIG9mIG1pbmltdW0gcmFuZ2VcbiAgICAgICAgICAgICAgICBpZiAodGhpcy54UGN0Lmxlbmd0aCArIHJhbmdlX2NvdW50ZXIgPj0gMSkge1xuICAgICAgICAgICAgICAgICAgICByYW5nZV9jb3VudGVyLS07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYWJzX2Rpc3RhbmNlX2NvdW50ZXIgPSBhYnNfZGlzdGFuY2VfY291bnRlciArIHJlbF9yYW5nZV9kaXN0YW5jZTtcbiAgICAgICAgICAgICAgICAvLyBMaW1pdCByYW5nZSB0byBsYXN0IHJhbmdlIHdoZW4gZGlzdGFuY2UgYmVjb21lcyBvdXRzaWRlIG9mIG1heGltdW0gcmFuZ2VcbiAgICAgICAgICAgICAgICBpZiAodGhpcy54UGN0Lmxlbmd0aCAtIHJhbmdlX2NvdW50ZXIgPj0gMSkge1xuICAgICAgICAgICAgICAgICAgICByYW5nZV9jb3VudGVyKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUmVzdCBvZiByZWxhdGl2ZSBwZXJjZW50dWFsIGRpc3RhbmNlIHN0aWxsIHRvIGJlIGNhbGN1bGF0ZWRcbiAgICAgICAgICAgIHJlc3RfcmVsX2Rpc3RhbmNlID0gZGlzdGFuY2VzW3hQY3RfaW5kZXggKyByYW5nZV9jb3VudGVyXSAqIHJlc3RfZmFjdG9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZSArIGFic19kaXN0YW5jZV9jb3VudGVyO1xuICAgIH07XG4gICAgU3BlY3RydW0ucHJvdG90eXBlLnRvU3RlcHBpbmcgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFsdWUgPSB0b1N0ZXBwaW5nKHRoaXMueFZhbCwgdGhpcy54UGN0LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIFNwZWN0cnVtLnByb3RvdHlwZS5mcm9tU3RlcHBpbmcgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZyb21TdGVwcGluZyh0aGlzLnhWYWwsIHRoaXMueFBjdCwgdmFsdWUpO1xuICAgIH07XG4gICAgU3BlY3RydW0ucHJvdG90eXBlLmdldFN0ZXAgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFsdWUgPSBnZXRTdGVwKHRoaXMueFBjdCwgdGhpcy54U3RlcHMsIHRoaXMuc25hcCwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICBTcGVjdHJ1bS5wcm90b3R5cGUuZ2V0RGVmYXVsdFN0ZXAgPSBmdW5jdGlvbiAodmFsdWUsIGlzRG93biwgc2l6ZSkge1xuICAgICAgICB2Y
10072XIgaiA9IGdldEoodmFsdWUsIHRoaXMueFBjdCk7XG4gICAgICAgIC8vIFdoZW4gYXQgdGhlIHRvcCBvciBzdGVwcGluZyBkb3duLCBsb29rIGF0IHRoZSBwcmV2aW91cyBzdWItcmFuZ2VcbiAgICAgICAgaWYgKHZhbHVlID09PSAxMDAgfHwgKGlzRG93biAmJiB2YWx1ZSA9PT0gdGhpcy54UGN0W2ogLSAxXSkpIHtcbiAgICAgICAgICAgIGogPSBNYXRoLm1heChqIC0gMSwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICh0aGlzLnhWYWxbal0gLSB0aGlzLnhWYWxbaiAtIDFdKSAvIHNpemU7XG4gICAgfTtcbiAgICBTcGVjdHJ1bS5wcm90b3R5cGUuZ2V0TmVhcmJ5U3RlcHMgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGogPSBnZXRKKHZhbHVlLCB0aGlzLnhQY3QpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3RlcEJlZm9yZToge1xuICAgICAgICAgICAgICAgIHN0YXJ0VmFsdWU6IHRoaXMueFZhbFtqIC0gMl0sXG4gICAgICAgICAgICAgICAgc3RlcDogdGhpcy54TnVtU3RlcHNbaiAtIDJdLFxuICAgICAgICAgICAgICAgIGhpZ2hlc3RTdGVwOiB0aGlzLnhIaWdoZXN0Q29tcGxldGVTdGVwW2ogLSAyXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzU3RlcDoge1xuICAgICAgICAgICAgICAgIHN0YXJ0VmFsdWU6IHRoaXMueFZhbFtqIC0gMV0sXG4gICAgICAgICAgICAgICAgc3RlcDogdGhpcy54TnVtU3RlcHNbaiAtIDFdLFxuICAgICAgICAgICAgICAgIGhpZ2hlc3RTdGVwOiB0aGlzLnhIaWdoZXN0Q29tcGxldGVTdGVwW2ogLSAxXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdGVwQWZ0ZXI6IHtcbiAgICAgICAgICAgICAgICBzdGFydFZhbHVlOiB0aGlzLnhWYWxbal0sXG4gICAgICAgICAgICAgICAgc3RlcDogdGhpcy54TnVtU3RlcHNbal0sXG4gICAgICAgICAgICAgICAgaGlnaGVzdFN0ZXA6IHRoaXMueEhpZ2hlc3RDb21wbGV0ZVN0ZXBbal0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH07XG4gICAgU3BlY3RydW0ucHJvdG90eXBlLmNvdW50U3RlcERlY2ltYWxzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2Y
10072XIgc3RlcERlY2ltYWxzID0gdGhpcy54TnVtU3RlcHMubWFwKGNvdW50RGVjaW1hbHMpO1xuICAgICAgICByZXR1cm4gTWF0aC5tYXguYXBwbHkobnVsbCwgc3RlcERlY2ltYWxzKTtcbiAgICB9O1xuICAgIFNwZWN0cnVtLnByb3RvdHlwZS5oYXNOb1NpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnhWYWxbMF0gPT09IHRoaXMueFZhbFt0aGlzLnhWYWwubGVuZ3RoIC0gMV07XG4gICAgfTtcbiAgICAvLyBPdXRzaWRlIHRlc3RpbmdcbiAgICBTcGVjdHJ1bS5wcm90b3R5cGUuY29udmVydCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTdGVwKHRoaXMudG9TdGVwcGluZyh2YWx1ZSkpO1xuICAgIH07XG4gICAgU3BlY3RydW0ucHJvdG90eXBlLmhhbmRsZUVudHJ5UG9pbnQgPSBmdW5jdGlvbiAoaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgIHZhciBwZXJjZW50YWdlO1xuICAgICAgICAvLyBDb3ZlcnQgbWluL21heCBzeW50YXggdG8gMCBhbmQgMTAwLlxuICAgICAgICBpZiAoaW5kZXggPT09IFwibWluXCIpIHtcbiAgICAgICAgICAgIHBlcmNlbnRhZ2UgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGluZGV4ID09PSBcIm1heFwiKSB7XG4gICAgICAgICAgICBwZXJjZW50YWdlID0gMTAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcGVyY2VudGFnZSA9IHBhcnNlRmxvYXQoaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrIGZvciBjb3JyZWN0IGlucHV0LlxuICAgICAgICBpZiAoIWlzTnVtZXJpYyhwZXJjZW50YWdlKSB8fCAhaXNOdW1lcmljKHZhbHVlWzBdKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm9VaVNsaWRlcjogJ3JhbmdlJyB2YWx1ZSBpc24ndCBudW1lcmljLlwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTdG9yZSB2YWx1ZXMuXG4gICAgICAgIHRoaXMueFBjdC5wdXNoKHBlcmNlbnRhZ2UpO1xuICAgICAgICB0aGlzLnhWYWwucHVzaCh2YWx1ZVswXSk7XG4gICAgICAgIHZhciB2YWx1ZTEgPSBOdW1iZXIodmFsdWVbMV0pO1xuICAgICAgICAvLyBOYU4gd2lsbCBldmFsdWF0ZSB0byBmYWxzZSB0b28sIGJ1dCB0byBrZWVwXG4gICAgICAgIC8vIGxvZ2dpbmcgY2xlYXIsIHNldCBzdGVwIGV4cGxpY2l0bHkuIE1ha2Ugc3VyZVxuICAgICAgICAvLyBub3QgdG8gb3ZlcnJpZGUgdGhlICdzdGVwJyBzZXR0aW5nIHdpdGggZmFsc2UuXG4gICAgICAgIGlmICghcGVyY2VudGFnZSkge1xuICAgICAgICAgICAgaWYgKCFpc05hTih2YWx1ZTEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy54U3RlcHNbMF0gPSB2YWx1ZTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnhTdGVwcy5wdXNoKGlzTmFOKHZhbHVlMSkgPyBmYWxzZSA6IHZhbHVlMSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy54SGlnaGVzdENvbXBsZXRlU3RlcC5wdXNoKDApO1xuICAgIH07XG4gICAgU3BlY3RydW0ucHJvdG90eXBlLmhhbmRsZVN0ZXBQb2ludCA9IGZ1bmN0aW9uIChpLCBuKSB7XG4gICAgICAgIC8vIElnbm9yZSAnZmFsc2UnIHN0ZXBwaW5nLlxuICAgICAgICBpZiAoIW4pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTdGVwIG92ZXIgemVyby1sZW5ndGggcmFuZ2VzICgjOTQ4KTtcbiAgICAgICAgaWYgKHRoaXMueFZhbFtpXSA9PT0gdGhpcy54VmFsW2kgKyAxXSkge1xuICAgICAgICAgICAgdGhpcy54U3RlcHNbaV0gPSB0aGlzLnhIaWdoZXN0Q29tcGxldGVTdGVwW2ldID0gdGhpcy54VmFsW2ldO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZhY3RvciB0byByYW5nZSByYXRpb1xuICAgICAgICB0aGlzLnhTdGVwc1tpXSA9XG4gICAgICAgICAgICBmcm9tUGVyY2VudGFnZShbdGhpcy54VmFsW2ldLCB0aGlzLnhWYWxbaSArIDFdXSwgbiwgMCkgLyBzdWJSYW5nZVJhdGlvKHRoaXMueFBjdFtpXSwgdGhpcy54UGN0W2kgKyAxXSk7XG4gICAgICAgIHZhciB0b3RhbFN0ZXBzID0gKHRoaXMueFZhbFtpICsgMV0gLSB0aGlzLnhWYWxbaV0pIC8gdGhpcy54TnVtU3RlcHNbaV07XG4gICAgICAgIHZhciBoaWdoZXN0U3RlcCA9IE1hdGguY2VpbChOdW1iZXIodG90YWxTdGVwcy50b0ZpeGVkKDMpKSAtIDEpO1xuICAgICAgICB2Y
10072XIgc3RlcCA9IHRoaXMueFZhbFtpXSArIHRoaXMueE51bVN0ZXBzW2ldICogaGlnaGVzdFN0ZXA7XG4gICAgICAgIHRoaXMueEhpZ2hlc3RDb21wbGV0ZVN0ZXBbaV0gPSBzdGVwO1xuICAgIH07XG4gICAgcmV0dXJuIFNwZWN0cnVtO1xufSgpKTtcbi8vZW5kcmVnaW9uXG4vL3JlZ2lvbiBPcHRpb25zXG4vKlx0RXZlcnkgaW5wdXQgb3B0aW9uIGlzIHRlc3RlZCBhbmQgcGFyc2VkLiBUaGlzIHdpbGwgcHJldmVudFxuICAgIGVuZGxlc3MgdmFsaWRhdGlvbiBpbiBpbnRlcm5hbCBtZXRob2RzLiBUaGVzZSB0ZXN0cyBhcmVcbiAgICBzdHJ1Y3R1cmVkIHdpdGggYW4gaXRlbSBmb3IgZXZlcnkgb3B0aW9uIGF2YWlsYWJsZS4gQW5cbiAgICBvcHRpb24gY2FuIGJlIG1hcmtlZCBhcyByZXF1aXJlZCBieSBzZXR0aW5nIHRoZSAncicgZmxhZy5cbiAgICBUaGUgdGVzdGluZyBmdW5jdGlvbiBpcyBwcm92aWRlZCB3aXRoIHRocmVlIGFyZ3VtZW50czpcbiAgICAgICAgLSBUaGUgcHJvdmlkZWQgdmFsdWUgZm9yIHRoZSBvcHRpb247XG4gICAgICAgIC0gQSByZWZlcmVuY2UgdG8gdGhlIG9wdGlvbnMgb2JqZWN0O1xuICAgICAgICAtIFRoZSBuYW1lIGZvciB0aGUgb3B0aW9uO1xuXG4gICAgVGhlIHRlc3RpbmcgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSB3aGVuIGFuIGVycm9yIGlzIGRldGVjdGVkLFxuICAgIG9yIHRydWUgd2hlbiBldmVyeXRoaW5nIGlzIE9LLiBJdCBjYW4gYWxzbyBtb2RpZnkgdGhlIG9wdGlvblxuICAgIG9iamVjdCwgdG8gbWFrZSBzdXJlIGFsbCB2YWx1ZXMgY2FuIGJlIGNvcnJlY3RseSBsb29wZWQgZWxzZXdoZXJlLiAqL1xuLy9yZWdpb24gRGVmYXVsdHNcbnZhciBkZWZhdWx0Rm9ybWF0dGVyID0ge1xuICAgIHRvOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyBcIlwiIDogdmFsdWUudG9GaXhlZCgyKTtcbiAgICB9LFxuICAgIGZyb206IE51bWJlcixcbn07XG52YXIgY3NzQ2xhc3NlcyA9IHtcbiAgICB0YXJnZXQ6IFwidGFyZ2V0XCIsXG4gICAgYmFzZTogXCJiYXNlXCIsXG4gICAgb3JpZ2luOiBcIm9yaWdpblwiLFxuICAgIGhhbmRsZTogXCJoYW5kbGVcIixcbiAgICBoYW5kbGVMb3dlcjogXCJoYW5kbGUtbG93ZXJcIixcbiAgICBoYW5kbGVVcHBlcjogXCJoYW5kbGUtdXBwZXJcIixcbiAgICB0b3VjaEFyZWE6IFwidG91Y2gtYXJlYVwiLFxuICAgIGhvcml6b250YWw6IFwiaG9yaXpvbnRhbFwiLFxuICAgIHZlcnRpY2FsOiBcInZlcnRpY2FsXCIsXG4gICAgYmFja2dyb3VuZDogXCJiYWNrZ3JvdW5kXCIsXG4gICAgY29ubmVjdDogXCJjb25uZWN0XCIsXG4gICAgY29ubmVjdHM6IFwiY29ubmVjdHNcIixcbiAgICBsdHI6IFwibHRyXCIsXG4gICAgcnRsOiBcInJ0bFwiLFxuICAgIHRleHREaXJlY3Rpb25MdHI6IFwidHh0LWRpci1sdHJcIixcbiAgICB0ZXh0RGlyZWN0aW9uUnRsOiBcInR4dC1kaXItcnRsXCIsXG4gICAgZHJhZ2dhYmxlOiBcImRyYWdnYWJsZVwiLFxuICAgIGRyYWc6IFwic3RhdGUtZHJhZ1wiLFxuICAgIHRhcDogXCJzdGF0ZS10YXBcIixcbiAgICBhY3RpdmU6IFwiYWN0aXZlXCIsXG4gICAgdG9vbHRpcDogXCJ0b29sdGlwXCIsXG4gICAgcGlwczogXCJwaXBzXCIsXG4gICAgcGlwc0hvcml6b250YWw6IFwicGlwcy1ob3Jpem9udGFsXCIsXG4gICAgcGlwc1ZlcnRpY2FsOiBcInBpcHMtdmVydGljYWxcIixcbiAgICBtYXJrZXI6IFwibWFya2VyXCIsXG4gICAgbWFya2VySG9yaXpvbnRhbDogXCJtYXJrZXItaG9yaXpvbnRhbFwiLFxuICAgIG1hcmtlclZlcnRpY2FsOiBcIm1hcmtlci12ZXJ0aWNhbFwiLFxuICAgIG1hcmtlck5vcm1hbDogXCJtYXJrZXItbm9ybWFsXCIsXG4gICAgbWFya2VyTGFyZ2U6IFwibWFya2VyLWxhcmdlXCIsXG4gICAgbWFya2VyU3ViOiBcIm1hcmtlci1zdWJcIixcbiAgICB2YWx1ZTogXCJ2YWx1ZVwiLFxuICAgIHZhbHVlSG9yaXpvbnRhbDogXCJ2YWx1ZS1ob3Jpem9udGFsXCIsXG4gICAgdmFsdWVWZXJ0aWNhbDogXCJ2YWx1ZS12ZXJ0aWNhbFwiLFxuICAgIHZhbHVlTm9ybWFsOiBcInZhbHVlLW5vcm1hbFwiLFxuICAgIHZhbHVlTGFyZ2U6IFwidmFsdWUtbGFyZ2VcIixcbiAgICB2YWx1ZVN1YjogXCJ2YWx1ZS1zdWJcIixcbn07XG4vLyBOYW1lc3BhY2VzIG9mIGludGVybmFsIGV2ZW50IGxpc3RlbmVyc1xudmFyIElOVEVSTkFMX0VWRU5UX05TID0ge1xuICAgIHRvb2x0aXBzOiBcIi5fX3Rvb2x0aXBzXCIsXG4gICAgYXJpYTogXCIuX19hcmlhXCIsXG59O1xuLy9lbmRyZWdpb25cbmZ1bmN0aW9uIHRlc3RTdGVwKHBhcnNlZCwgZW50cnkpIHtcbiAgICBpZiAoIWlzTnVtZXJpYyhlbnRyeSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm9VaVNsaWRlcjogJ3N0ZXAnIGlzIG5vdCBudW1lcmljLlwiKTtcbiAgICB9XG4gICAgLy8gVGhlIHN0ZXAgb3B0aW9uIGNhbiBzdGlsbCBiZSB1c2VkIHRvIHNldCBzdGVwcGluZ1xuICAgIC8vIGZvciBsaW5lYXIgc2xpZGVycy4gT3ZlcndyaXR0ZW4gaWYgc2V0IGluICdyYW5nZScuXG4gICAgcGFyc2VkLnNpbmdsZVN0ZXAgPSBlbnRyeTtcbn1cbmZ1bmN0aW9uIHRlc3RLZXlib2FyZFBhZ2VNdWx0aXBsaWVyKHBhcnNlZCwgZW50cnkpIHtcbiAgICBpZiAoIWlzTnVtZXJpYyhlbnRyeSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm9VaVNsaWRlcjogJ2tleWJvYXJkUGFnZU11bHRpcGxpZXInIGlzIG5vdCBudW1lcmljLlwiKTtcbiAgICB9XG4gICAgcGFyc2VkLmtleWJvYXJkUGFnZU11bHRpcGxpZXIgPSBlbnRyeTtcbn1cbmZ1bmN0aW9uIHRlc3RLZXlib2FyZE11bHRpcGxpZXIocGFyc2VkLCBlbnRyeSkge1xuICAgIGlmICghaXNOdW1lcmljKGVudHJ5KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub1VpU2xpZGVyOiAna2V5Ym9hcmRNdWx0aXBsaWVyJyBpcyBub3QgbnVtZXJpYy5cIik7XG4gICAgfVxuICAgIHBhcnNlZC5rZXlib2FyZE11bHRpcGxpZXIgPSBlbnRyeTtcbn1cbmZ1bmN0aW9uIHRlc3RLZXlib2FyZERlZmF1bHRTdGVwKHBhcnNlZCwgZW50cnkpIHtcbiAgICBpZiAoIWlzTnVtZXJpYyhlbnRyeSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm9VaVNsaWRlcjogJ2tleWJvYXJkRGVmYXVsdFN0ZXAnIGlzIG5vdCBudW1lcmljLlwiKTtcbiAgICB9XG4gICAgcGFyc2VkLmtleWJvYXJkRGVmYXVsdFN0ZXAgPSBlbnRyeTtcbn1cbmZ1bmN0aW9uIHRlc3RSYW5nZShwYXJzZWQsIGVudHJ5KSB7XG4gICAgLy8gRmlsdGVyIGluY29ycmVjdCBpbnB1dC5cbiAgICBpZiAodHlwZW9mIGVudHJ5ICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZW50cnkpKSB7XG4gICAgICAgI
10072HRocm93IG5ldyBFcnJvcihcIm5vVWlTbGlkZXI6ICdyYW5nZScgaXMgbm90IGFuIG9iamVjdC5cIik7XG4gICAgfVxuICAgIC8vIENhdGNoIG1pc3Npbmcgc3RhcnQgb3IgZW5kLlxuICAgIGlmIChlbnRyeS5taW4gPT09IHVuZGVmaW5lZCB8fCBlbnRyeS5tYXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub1VpU2xpZGVyOiBNaXNzaW5nICdtaW4nIG9yICdtYXgnIGluICdyYW5nZScuXCIpO1xuICAgIH1cbiAgICBwYXJzZWQuc3BlY3RydW0gPSBuZXcgU3BlY3RydW0oZW50cnksIHBhcnNlZC5zbmFwIHx8IGZhbHNlLCBwYXJzZWQuc2luZ2xlU3RlcCk7XG59XG5mdW5jdGlvbiB0ZXN0U3RhcnQocGFyc2VkLCBlbnRyeSkge1xuICAgIGVudHJ5ID0gYXNBcnJheShlbnRyeSk7XG4gICAgLy8gVmFsaWRhdGUgaW5wdXQuIFZhbHVlcyBhcmVuJ3QgdGVzdGVkLCBhcyB0aGUgcHVibGljIC52YWwgbWV0aG9kXG4gICAgLy8gd2lsbCBhbHdheXMgcHJvdmlkZSBhIHZhbGlkIGxvY2F0aW9uLlxuICAgIGlmICghQXJyYXkuaXNBcnJheShlbnRyeSkgfHwgIWVudHJ5Lmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub1VpU2xpZGVyOiAnc3RhcnQnIG9wdGlvbiBpcyBpbmNvcnJlY3QuXCIpO1xuICAgIH1cbiAgICAvLyBTdG9yZSB0aGUgbnVtYmVyIG9mIGhhbmRsZXMuXG4gICAgcGFyc2VkLmhhbmRsZXMgPSBlbnRyeS5sZW5ndGg7XG4gICAgLy8gV2hlbiB0aGUgc2xpZGVyIGlzIGluaXRpYWxpemVkLCB0aGUgLnZhbCBtZXRob2Qgd2lsbFxuICAgIC8vIGJlIGNhbGxlZCB3aXRoIHRoZSBzdGFydCBvcHRpb25zLlxuICAgIHBhcnNlZC5zdGFydCA9IGVudHJ5O1xufVxuZnVuY3Rpb24gdGVzdFNuYXAocGFyc2VkLCBlbnRyeSkge1xuICAgIGlmICh0eXBlb2YgZW50cnkgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vVWlTbGlkZXI6ICdzbmFwJyBvcHRpb24gbXVzdCBiZSBhIGJvb2xlYW4uXCIpO1xuICAgIH1cbiAgICAvLyBFbmZvcmNlIDEwMCUgc3RlcHBpbmcgd2l0aGluIHN1YnJhbmdlcy5cbiAgICBwYXJzZWQuc25hcCA9IGVudHJ5O1xufVxuZnVuY3Rpb24gdGVzdEFuaW1hdGUocGFyc2VkLCBlbnRyeSkge1xuICAgIGlmICh0eXBlb2YgZW50cnkgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vVWlTbGlkZXI6ICdhbmltYXRlJyBvcHRpb24gbXVzdCBiZSBhIGJvb2xlYW4uXCIpO1xuICAgIH1cbiAgICAvLyBFbmZvcmNlIDEwMCUgc3RlcHBpbmcgd2l0aGluIHN1YnJhbmdlcy5cbiAgICBwYXJzZWQuYW5pbWF0ZSA9IGVudHJ5O1xufVxuZnVuY3Rpb24gdGVzdEFuaW1hdGlvbkR1cmF0aW9uKHBhcnNlZCwgZW50cnkpIHtcbiAgICBpZiAodHlwZW9mIGVudHJ5ICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vVWlTbGlkZXI6ICdhbmltYXRpb25EdXJhdGlvbicgb3B0aW9uIG11c3QgYmUgYSBudW1iZXIuXCIpO1xuICAgIH1cbiAgICBwYXJzZWQuYW5pbWF0aW9uRHVyYXRpb24gPSBlbnRyeTtcbn1cbmZ1bmN0aW9uIHRlc3RDb25uZWN0KHBhcnNlZCwgZW50cnkpIHtcbiAgICB2YXIgY29ubmVjdCA9IFtmYWxzZV07XG4gICAgdmFyIGk7XG4gICAgLy8gTWFwIGxlZ2FjeSBvcHRpb25zXG4gICAgaWYgKGVudHJ5ID09PSBcImxvd2VyXCIpIHtcbiAgICAgICAgZW50cnkgPSBbdHJ1ZSwgZmFsc2VdO1xuICAgIH1cbiAgICBlbHNlIGlmIChlbnRyeSA9PT0gXCJ1cHBlclwiKSB7XG4gICAgICAgIGVudHJ5ID0gW2ZhbHNlLCB0cnVlXTtcbiAgICB9XG4gICAgLy8gSGFuZGxlIGJvb2xlYW4gb3B0aW9uc1xuICAgIGlmIChlbnRyeSA9PT0gdHJ1ZSB8fCBlbnRyeSA9PT0gZmFsc2UpIHtcbiAgICAgICAgZm9yIChpID0gMTsgaSA8IHBhcnNlZC5oYW5kbGVzOyBpKyspIHtcbiAgICAgICAgICAgIGNvbm5lY3QucHVzaChlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgY29ubmVjdC5wdXNoKGZhbHNlKTtcbiAgICB9XG4gICAgLy8gUmVqZWN0IGludmFsaWQgaW5wdXRcbiAgICBlbHNlIGlmICghQXJyYXkuaXNBcnJheShlbnRyeSkgfHwgIWVudHJ5Lmxlbmd0aCB8fCBlbnRyeS5sZW5ndGggIT09IHBhcnNlZC5oYW5kbGVzICsgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub1VpU2xpZGVyOiAnY29ubmVjdCcgb3B0aW9uIGRvZXNuJ3QgbWF0Y2ggaGFuZGxlIGNvdW50LlwiKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbm5lY3QgPSBlbnRyeTtcbiAgICB9XG4gICAgcGFyc2VkLmNvbm5lY3QgPSBjb25uZWN0O1xufVxuZnVuY3Rpb24gdGVzdE9yaWVudGF0aW9uKHBhcnNlZCwgZW50cnkpIHtcbiAgICAvLyBTZXQgb3JpZW50YXRpb24gdG8gYW4gYSBudW1lcmljYWwgdmFsdWUgZm9yIGVhc3lcbiAgICAvLyBhcnJheSBzZWxlY3Rpb24uXG4gICAgc3dpdGNoIChlbnRyeSkge1xuICAgICAgICBjYXNlIFwiaG9yaXpvbnRhbFwiOlxuICAgICAgICAgICAgcGFyc2VkLm9ydCA9IDA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInZlcnRpY2FsXCI6XG4gICAgICAgICAgICBwYXJzZWQub3J0ID0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm9VaVNsaWRlcjogJ29yaWVudGF0aW9uJyBvcHRpb24gaXMgaW52YWxpZC5cIik7XG4gICAgfVxufVxuZnVuY3Rpb24gdGVzdE1hcmdpbihwYXJzZWQsIGVudHJ5KSB7XG4gICAgaWYgKCFpc051bWVyaWMoZW50cnkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vVWlTbGlkZXI6ICdtYXJnaW4nIG9wdGlvbiBtdXN0IGJlIG51bWVyaWMuXCIpO1xuICAgIH1cbiAgICAvLyBJc3N1ZSAjNTgyXG4gICAgaWYgKGVudHJ5ID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcGFyc2VkLm1hcmdpbiA9IHBhcnNlZC5zcGVjdHJ1bS5nZXREaXN0YW5jZShlbnRyeSk7XG59XG5mdW5jdGlvbiB0ZXN0TGltaXQocGFyc2VkLCBlbnRyeSkge1xuICAgIGlmICghaXNOdW1lcmljKGVudHJ5KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub1VpU2xpZGVyOiAnbGltaXQnIG9wdGlvbiBtdXN0IGJlIG51bWVyaWMuXCIpO1xuICAgIH1cbiAgICBwYXJzZWQubGltaXQgPSBwYXJzZWQuc3BlY3RydW0uZ2V0RGlzdGFuY2UoZW50cnkpO1xuICAgIGlmICghcGFyc2VkLmxpbWl0IHx8IHBhcnNlZC5oYW5kbGVzIDwgMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub1VpU2xpZGVyOiAnbGltaXQnIG9wdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCBvbiBsaW5lYXIgc2xpZGVycyB3aXRoIDIgb3IgbW9yZSBoYW5kbGVzLlwiKTtcbiAgICB9XG59XG5mdW5jdGlvbiB0ZXN0UGFkZGluZyhwYXJzZWQsIGVudHJ5KSB7XG4gICAgdmFyIGluZGV4O1xuICAgIGlmICghaXNOdW1lcmljKGVudHJ5KSAmJiAhQXJyYXkuaXNBcnJheShlbnRyeSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm9VaVNsaWRlcjogJ3BhZGRpbmcnIG9wdGlvbiBtdXN0IGJlIG51bWVyaWMgb3IgYXJyYXkgb2YgZXhhY3RseSAyIG51bWJlcnMuXCIpO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShlbnRyeSkgJiYgIShlbnRyeS5sZW5ndGggPT09IDIgfHwgaXNOdW1lcmljKGVudHJ5WzBdKSB8fCBpc051bWVyaWMoZW50cnlbMV0pKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub1VpU2xpZGVyOiAncGFkZGluZycgb3B0aW9uIG11c3QgYmUgbnVtZXJpYyBvciBhcnJheSBvZiBleGFjdGx5IDIgbnVtYmVycy5cIik7XG4gICAgfVxuICAgIGlmIChlbnRyeSA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghQXJyYXkuaXNBcnJheShlbnRyeSkpIHtcbiAgICAgICAgZW50cnkgPSBbZW50cnksIGVudHJ5XTtcbiAgICB9XG4gICAgLy8gJ2dldERpc3RhbmNlJyByZXR1cm5zIGZhbHNlIGZvciBpbnZhbGlkIHZhbHVlcy5cbiAgICBwYXJzZWQucGFkZGluZyA9IFtwYXJzZWQuc3BlY3RydW0uZ2V0RGlzdGFuY2UoZW50cnlbMF0pLCBwYXJzZWQuc3BlY3RydW0uZ2V0RGlzdGFuY2UoZW50cnlbMV0pXTtcbiAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBwYXJzZWQuc3BlY3RydW0ueE51bVN0ZXBzLmxlbmd0aCAtIDE7IGluZGV4KyspIHtcbiAgICAgICAgLy8gbGFzdCBcInJhbmdlXCIgY2FuJ3QgY29udGFpbiBzdGVwIHNpemUgYXMgaXQgaXMgcHVyZWx5IGFuIGVuZHBvaW50LlxuICAgICAgICBpZiAocGFyc2VkLnBhZGRpbmdbMF1baW5kZXhdIDwgMCB8fCBwYXJzZWQucGFkZGluZ1sxXVtpbmRleF0gPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub1VpU2xpZGVyOiAncGFkZGluZycgb3B0aW9uIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIocykuXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciB0b3RhbFBhZGRpbmcgPSBlbnRyeVswXSArIGVudHJ5WzFdO1xuICAgIHZhciBmaXJzdFZhbHVlID0gcGFyc2VkLnNwZWN0cnVtLnhWYWxbMF07XG4gICAgdmFyIGxhc3RWYWx1ZSA9IHBhcnNlZC5zcGVjdHJ1bS54VmFsW3BhcnNlZC5zcGVjdHJ1bS54VmFsLmxlbmd0aCAtIDFdO1xuICAgIGlmICh0b3RhbFBhZGRpbmcgLyAobGFzdFZhbHVlIC0gZmlyc3RWYWx1ZSkgPiAxKSB7XG4gICAgICAgI
10072HRocm93IG5ldyBFcnJvcihcIm5vVWlTbGlkZXI6ICdwYWRkaW5nJyBvcHRpb24gbXVzdCBub3QgZXhjZWVkIDEwMCUgb2YgdGhlIHJhbmdlLlwiKTtcbiAgICB9XG59XG5mdW5jdGlvbiB0ZXN0RGlyZWN0aW9uKHBhcnNlZCwgZW50cnkpIHtcbiAgICAvLyBTZXQgZGlyZWN0aW9uIGFzIGEgbnVtZXJpY2FsIHZhbHVlIGZvciBlYXN5IHBhcnNpbmcuXG4gICAgLy8gSW52ZXJ0IGNvbm5lY3Rpb24gZm9yIFJUTCBzbGlkZXJzLCBzbyB0aGF0IHRoZSBwcm9wZXJcbiAgICAvLyBoYW5kbGVzIGdldCB0aGUgY29ubmVjdC9iYWNrZ3JvdW5kIGNsYXNzZXMuXG4gICAgc3dpdGNoIChlbnRyeSkge1xuICAgICAgICBjYXNlIFwibHRyXCI6XG4gICAgICAgICAgICBwYXJzZWQuZGlyID0gMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwicnRsXCI6XG4gICAgICAgICAgICBwYXJzZWQuZGlyID0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm9VaVNsaWRlcjogJ2RpcmVjdGlvbicgb3B0aW9uIHdhcyBub3QgcmVjb2duaXplZC5cIik7XG4gICAgfVxufVxuZnVuY3Rpb24gdGVzdEJlaGF2aW91cihwYXJzZWQsIGVudHJ5KSB7XG4gICAgLy8gTWFrZSBzdXJlIHRoZSBpbnB1dCBpcyBhIHN0cmluZy5cbiAgICBpZiAodHlwZW9mIGVudHJ5ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vVWlTbGlkZXI6ICdiZWhhdmlvdXInIG11c3QgYmUgYSBzdHJpbmcgY29udGFpbmluZyBvcHRpb25zLlwiKTtcbiAgICB9XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHN0cmluZyBjb250YWlucyBhbnkga2V5d29yZHMuXG4gICAgLy8gTm9uZSBhcmUgcmVxdWlyZWQuXG4gICAgdmFyIHRhcCA9IGVudHJ5LmluZGV4T2YoXCJ0YXBcIikgPj0gMDtcbiAgICB2YXIgZHJhZyA9IGVudHJ5LmluZGV4T2YoXCJkcmFnXCIpID49IDA7XG4gICAgdmFyIGZpeGVkID0gZW50cnkuaW5kZXhPZihcImZpeGVkXCIpID49IDA7XG4gICAgdmFyIHNuYXAgPSBlbnRyeS5pbmRleE9mKFwic25hcFwiKSA+PSAwO1xuICAgIHZhciBob3ZlciA9IGVudHJ5LmluZGV4T2YoXCJob3ZlclwiKSA+PSAwO1xuICAgIHZhciB1bmNvbnN0cmFpbmVkID0gZW50cnkuaW5kZXhPZihcInVuY29uc3RyYWluZWRcIikgPj0gMDtcbiAgICB2YXIgaW52ZXJ0Q29ubmVjdHMgPSBlbnRyeS5pbmRleE9mKFwiaW52ZXJ0LWNvbm5lY3RzXCIpID49IDA7XG4gICAgdmFyIGRyYWdBbGwgPSBlbnRyeS5pbmRleE9mKFwiZHJhZy1hbGxcIikgPj0gMDtcbiAgICB2YXIgc21vb3RoU3RlcHMgPSBlbnRyeS5pbmRleE9mKFwic21vb3RoLXN0ZXBzXCIpID49IDA7XG4gICAgaWYgKGZpeGVkKSB7XG4gICAgICAgIGlmIChwYXJzZWQuaGFuZGxlcyAhPT0gMikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm9VaVNsaWRlcjogJ2ZpeGVkJyBiZWhhdmlvdXIgbXVzdCBiZSB1c2VkIHdpdGggMiBoYW5kbGVzXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFVzZSBtYXJnaW4gdG8gZW5mb3JjZSBmaXhlZCBzdGF0ZVxuICAgICAgICB0ZXN0TWFyZ2luKHBhcnNlZCwgcGFyc2VkLnN0YXJ0WzFdIC0gcGFyc2VkLnN0YXJ0WzBdKTtcbiAgICB9XG4gICAgaWYgKGludmVydENvbm5lY3RzICYmIHBhcnNlZC5oYW5kbGVzICE9PSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vVWlTbGlkZXI6ICdpbnZlcnQtY29ubmVjdHMnIGJlaGF2aW91ciBtdXN0IGJlIHVzZWQgd2l0aCAyIGhhbmRsZXNcIik7XG4gICAgfVxuICAgIGlmICh1bmNvbnN0cmFpbmVkICYmIChwYXJzZWQubWFyZ2luIHx8IHBhcnNlZC5saW1pdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm9VaVNsaWRlcjogJ3VuY29uc3RyYWluZWQnIGJlaGF2aW91ciBjYW5ub3QgYmUgdXNlZCB3aXRoIG1hcmdpbiBvciBsaW1pdFwiKTtcbiAgICB9XG4gICAgcGFyc2VkLmV2ZW50cyA9IHtcbiAgICAgICAgdGFwOiB0YXAgfHwgc25hcCxcbiAgICAgICAgZHJhZzogZHJhZyxcbiAgICAgICAgZHJhZ0FsbDogZHJhZ0FsbCxcbiAgICAgICAgc21vb3RoU3RlcHM6IHNtb290aFN0ZXBzLFxuICAgICAgICBmaXhlZDogZml4ZWQsXG4gICAgICAgIHNuYXA6IHNuYXAsXG4gICAgICAgIGhvdmVyOiBob3ZlcixcbiAgICAgICAgdW5jb25zdHJhaW5lZDogdW5jb25zdHJhaW5lZCxcbiAgICAgICAgaW52ZXJ0Q29ubmVjdHM6IGludmVydENvbm5lY3RzLFxuICAgIH07XG59XG5mdW5jdGlvbiB0ZXN0VG9vbHRpcHMocGFyc2VkLCBlbnRyeSkge1xuICAgIGlmIChlbnRyeSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZW50cnkgPT09IHRydWUgfHwgaXNWYWxpZFBhcnRpYWxGb3JtYXR0ZXIoZW50cnkpKSB7XG4gICAgICAgIHBhcnNlZC50b29sdGlwcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcnNlZC5oYW5kbGVzOyBpKyspIHtcbiAgICAgICAgICAgIHBhcnNlZC50b29sdGlwcy5wdXNoKGVudHJ5KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZW50cnkgPSBhc0FycmF5KGVudHJ5KTtcbiAgICAgICAgaWYgKGVudHJ5Lmxlbmd0aCAhPT0gcGFyc2VkLmhhbmRsZXMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vVWlTbGlkZXI6IG11c3QgcGFzcyBhIGZvcm1hdHRlciBmb3IgYWxsIGhhbmRsZXMuXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVudHJ5LmZvckVhY2goZnVuY3Rpb24gKGZvcm1hdHRlcikge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBmb3JtYXR0ZXIgIT09IFwiYm9vbGVhblwiICYmICFpc1ZhbGlkUGFydGlhbEZvcm1hdHRlcihmb3JtYXR0ZXIpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm9VaVNsaWRlcjogJ3Rvb2x0aXBzJyBtdXN0IGJlIHBhc3NlZCBhIGZvcm1hdHRlciBvciAnZmFsc2UnLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHBhcnNlZC50b29sdGlwcyA9IGVudHJ5O1xuICAgIH1cbn1cbmZ1bmN0aW9uIHRlc3RIYW5kbGVBdHRyaWJ1dGVzKHBhcnNlZCwgZW50cnkpIHtcbiAgICBpZiAoZW50cnkubGVuZ3RoICE9PSBwYXJzZWQuaGFuZGxlcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub1VpU2xpZGVyOiBtdXN0IHBhc3MgYSBhdHRyaWJ1dGVzIGZvciBhbGwgaGFuZGxlcy5cIik7XG4gICAgfVxuICAgIHBhcnNlZC5oYW5kbGVBdHRyaWJ1dGVzID0gZW50cnk7XG59XG5mdW5jdGlvbiB0ZXN0QXJpYUZvcm1hdChwYXJzZWQsIGVudHJ5KSB7XG4gICAgaWYgKCFpc1ZhbGlkUGFydGlhbEZvcm1hdHRlcihlbnRyeSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm9VaVNsaWRlcjogJ2FyaWFGb3JtYXQnIHJlcXVpcmVzICd0bycgbWV0aG9kLlwiKTtcbiAgICB9XG4gICAgcGFyc2VkLmFyaWFGb3JtYXQgPSBlbnRyeTtcbn1cbmZ1bmN0aW9uIHRlc3RGb3JtYXQocGFyc2VkLCBlbnRyeSkge1xuICAgIGlmICghaXNWYWxpZEZvcm1hdHRlcihlbnRyeSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm9VaVNsaWRlcjogJ2Zvcm1hdCcgcmVxdWlyZXMgJ3RvJyBhbmQgJ2Zyb20nIG1ldGhvZHMuXCIpO1xuICAgIH1cbiAgICBwYXJzZWQuZm9ybWF0ID0gZW50cnk7XG59XG5mdW5jdGlvbiB0ZXN0S2V5Ym9hcmRTdXBwb3J0KHBhcnNlZCwgZW50cnkpIHtcbiAgICBpZiAodHlwZW9mIGVudHJ5ICE9PSBcImJvb2xlYW5cIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub1VpU2xpZGVyOiAna2V5Ym9hcmRTdXBwb3J0JyBvcHRpb24gbXVzdCBiZSBhIGJvb2xlYW4uXCIpO1xuICAgIH1cbiAgICBwYXJzZWQua2V5Ym9hcmRTdXBwb3J0ID0gZW50cnk7XG59XG5mdW5jdGlvbiB0ZXN0RG9jdW1lbnRFbGVtZW50KHBhcnNlZCwgZW50cnkpIHtcbiAgICAvLyBUaGlzIGlzIGFuIGFkdmFuY2VkIG9wdGlvbi4gUGFzc2VkIHZhbHVlcyBhcmUgdXNlZCB3aXRob3V0IHZhbGlkYXRpb24uXG4gICAgcGFyc2VkLmRvY3VtZW50RWxlbWVudCA9IGVudHJ5O1xufVxuZnVuY3Rpb24gdGVzdENzc1ByZWZpeChwYXJzZWQsIGVudHJ5KSB7XG4gICAgaWYgKHR5cGVvZiBlbnRyeSAhPT0gXCJzdHJpbmdcIiAmJiBlbn
10072RyeSAhPT0gZmFsc2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm9VaVNsaWRlcjogJ2Nzc1ByZWZpeCcgbXVzdCBiZSBhIHN0cmluZyBvciBgZmFsc2VgLlwiKTtcbiAgICB9XG4gICAgcGFyc2VkLmNzc1ByZWZpeCA9IGVudHJ5O1xufVxuZnVuY3Rpb24gdGVzdENzc0NsYXNzZXMocGFyc2VkLCBlbnRyeSkge1xuICAgIGlmICh0eXBlb2YgZW50cnkgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm9VaVNsaWRlcjogJ2Nzc0NsYXNzZXMnIG11c3QgYmUgYW4gb2JqZWN0LlwiKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwYXJzZWQuY3NzUHJlZml4ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHBhcnNlZC5jc3NDbGFzc2VzID0ge307XG4gICAgICAgIE9iamVjdC5rZXlzKGVudHJ5KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIHBhcnNlZC5jc3NDbGFzc2VzW2tleV0gPSBwYXJzZWQuY3NzUHJlZml4ICsgZW50cnlba2V5XTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBwYXJzZWQuY3NzQ2xhc3NlcyA9IGVudHJ5O1xuICAgIH1cbn1cbi8vIFRlc3QgYWxsIGRldmVsb3BlciBzZXR0aW5ncyBhbmQgcGFyc2UgdG8gYXNzdW1wdGlvbi1zYWZlIHZhbHVlcy5cbmZ1bmN0aW9uIHRlc3RPcHRpb25zKG9wdGlvbnMpIHtcbiAgICAvLyBUbyBwcm92ZSBhIGZpeCBmb3IgIzUzNywgZnJlZXplIG9wdGlvbnMgaGVyZS5cbiAgICAvLyBJZiB0aGUgb2JqZWN0IGlzIG1vZGlmaWVkLCBhbiBlcnJvciB3aWxsIGJlIHRocm93bi5cbiAgICAvLyBPYmplY3QuZnJlZXplKG9wdGlvbnMpO1xuICAgIHZhciBwYXJzZWQgPSB7XG4gICAgICAgIG1hcmdpbjogbnVsbCxcbiAgICAgICAgbGltaXQ6IG51bGwsXG4gICAgICAgIHBhZGRpbmc6IG51bGwsXG4gICAgICAgIGFuaW1hdGU6IHRydWUsXG4gICAgICAgIGFuaW1hdGlvbkR1cmF0aW9uOiAzMDAsXG4gICAgICAgIGFyaWFGb3JtYXQ6IGRlZmF1bHRGb3JtYXR0ZXIsXG4gICAgICAgIGZvcm1hdDogZGVmYXVsdEZvcm1hdHRlcixcbiAgICB9O1xuICAgIC8vIFRlc3RzIGFyZSBleGVjdXRlZCBpbiB0aGUgb3JkZXIgdGhleSBhcmUgcHJlc2VudGVkIGhlcmUuXG4gICAgdmFyIHRlc3RzID0ge1xuICAgICAgICBzdGVwOiB7IHI6IGZhbHNlLCB0OiB0ZXN0U3RlcCB9LFxuICAgICAgICBrZXlib2FyZFBhZ2VNdWx0aXBsaWVyOiB7IHI6IGZhbHNlLCB0OiB0ZXN0S2V5Ym9hcmRQYWdlTXVsdGlwbGllciB9LFxuICAgICAgICBrZXlib2FyZE11bHRpcGxpZXI6IHsgcjogZmFsc2UsIHQ6IHRlc3RLZXlib2FyZE11bHRpcGxpZXIgfSxcbiAgICAgICAga2V5Ym9hcmREZWZhdWx0U3RlcDogeyByOiBmYWxzZSwgdDogdGVzdEtleWJvYXJkRGVmYXVsdFN0ZXAgfSxcbiAgICAgICAgc3RhcnQ6IHsgcjogdHJ1ZSwgdDogdGVzdFN0YXJ0IH0sXG4gICAgICAgIGNvbm5lY3Q6IHsgcjogdHJ1ZSwgdDogdGVzdENvbm5lY3QgfSxcbiAgICAgICAgZGlyZWN0aW9uOiB7IHI6IHRydWUsIHQ6IHRlc3REaXJlY3Rpb24gfSxcbiAgICAgICAgc25hcDogeyByOiBmYWxzZSwgdDogdGVzdFNuYXAgfSxcbiAgICAgICAgYW5pbWF0ZTogeyByOiBmYWxzZSwgdDogdGVzdEFuaW1hdGUgfSxcbiAgICAgICAgYW5pbWF0aW9uRHVyYXRpb246IHsgcjogZmFsc2UsIHQ6IHRlc3RBbmltYXRpb25EdXJhdGlvbiB9LFxuICAgICAgICByYW5nZTogeyByOiB0cnVlLCB0OiB0ZXN0UmFuZ2UgfSxcbiAgICAgICAgb3JpZW50YXRpb246IHsgcjogZmFsc2UsIHQ6IHRlc3RPcmllbnRhdGlvbiB9LFxuICAgICAgICBtYXJnaW46IHsgcjogZmFsc2UsIHQ6IHRlc3RNYXJnaW4gfSxcbiAgICAgICAgbGltaXQ6IHsgcjogZmFsc2UsIHQ6IHRlc3RMaW1pdCB9LFxuICAgICAgICBwYWRkaW5nOiB7IHI6IGZhbHNlLCB0OiB0ZXN0UGFkZGluZyB9LFxuICAgICAgICBiZWhhdmlvdXI6IHsgcjogdHJ1ZSwgdDogdGVzdEJlaGF2aW91ciB9LFxuICAgICAgICBhcmlhRm9ybWF0OiB7IHI6IGZhbHNlLCB0OiB0ZXN0QXJpYUZvcm1hdCB9LFxuICAgICAgICBmb3JtYXQ6IHsgcjogZmFsc2UsIHQ6IHRlc3RGb3JtYXQgfSxcbiAgICAgICAgdG9vbHRpcHM6IHsgcjogZmFsc2UsIHQ6IHRlc3RUb29sdGlwcyB9LFxuICAgICAgICBrZXlib2FyZFN1cHBvcnQ6IHsgcjogdHJ1ZSwgdDogdGVzdEtleWJvYXJkU3VwcG9ydCB9LFxuICAgICAgICBkb2
10072N1bWVudEVsZW1lbnQ6IHsgcjogZmFsc2UsIHQ6IHRlc3REb2N1bWVudEVsZW1lbnQgfSxcbiAgICAgICAgY3NzUHJlZml4OiB7IHI6IHRydWUsIHQ6IHRlc3RDc3NQcmVmaXggfSxcbiAgICAgICAgY3NzQ2xhc3NlczogeyByOiB0cnVlLCB0OiB0ZXN0Q3NzQ2xhc3NlcyB9LFxuICAgICAgICBoYW5kbGVBdHRyaWJ1dGVzOiB7IHI6IGZhbHNlLCB0OiB0ZXN0SGFuZGxlQXR0cmlidXRlcyB9LFxuICAgIH07XG4gICAgdmFyIGRlZmF1bHRzID0ge1xuICAgICAgICBjb25uZWN0OiBmYWxzZSxcbiAgICAgICAgZGlyZWN0aW9uOiBcImx0clwiLFxuICAgICAgICBiZWhhdmlvdXI6IFwidGFwXCIsXG4gICAgICAgIG9yaWVudGF0aW9uOiBcImhvcml6b250YWxcIixcbiAgICAgICAga2V5Ym9hcmRTdXBwb3J0OiB0cnVlLFxuICAgICAgICBjc3NQcmVmaXg6IFwibm9VaS1cIixcbiAgICAgICAgY3NzQ2xhc3NlczogY3NzQ2xhc3NlcyxcbiAgICAgICAga2V5Ym9hcmRQYWdlTXVsdGlwbGllcjogNSxcbiAgICAgICAga2V5Ym9hcmRNdWx0aXBsaWVyOiAxLFxuICAgICAgICBrZXlib2FyZERlZmF1bHRTdGVwOiAxMCxcbiAgICB9O1xuICAgIC8vIEFyaWFGb3JtYXQgZGVmYXVsdHMgdG8gcmVndWxhciBmb3JtYXQsIGlmIGFueS5cbiAgICBpZiAob3B0aW9ucy5mb3JtYXQgJiYgIW9wdGlvbnMuYXJpYUZvcm1hdCkge1xuICAgICAgICBvcHRpb25zLmFyaWFGb3JtYXQgPSBvcHRpb25zLmZvcm1hdDtcbiAgICB9XG4gICAgLy8gUnVuIGFsbCBvcHRpb25zIHRocm91Z2ggYSB0ZXN0aW5nIG1lY2hhbmlzbSB0byBlbnN1cmUgY29ycmVjdFxuICAgIC8vIGlucHV0LiBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBvcHRpb25zIG1pZ2h0IGdldCBtb2RpZmllZCB0b1xuICAgIC8vIGJlIGhhbmRsZWQgcHJvcGVybHkuIEUuZy4gd3JhcHBpbmcgaW50ZWdlcnMgaW4gYXJyYXlzLlxuICAgIE9iamVjdC5rZXlzKHRlc3RzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIC8vIElmIHRoZSBvcHRpb24gaXNuJ3Qgc2V0LCBidXQgaXQgaXMgcmVxdWlyZWQsIHRocm93IGFuIGVycm9yLlxuICAgICAgICBpZiAoIWlzU2V0KG9wdGlvbnNbbmFtZV0pICYmIGRlZmF1bHRzW25hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmICh0ZXN0c1tuYW1lXS5yKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm9VaVNsaWRlcjogJ1wiICsgbmFtZSArIFwiJyBpcyByZXF1aXJlZC5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGVzdHNbbmFtZV0udChwYXJzZWQsICFpc1NldChvcHRpb25zW25hbWVdKSA/IGRlZmF1bHRzW25hbWVdIDogb3B0aW9uc1tuYW1lXSk7XG4gICAgfSk7XG4gICAgLy8gRm9yd2FyZCBwaXBzIG9wdGlvbnNcbiAgICBwYXJzZWQucGlwcyA9IG9wdGlvbnMucGlwcztcbiAgICAvLyBBbGwgcmVjZW50IGJyb3dzZXJzIGFjY2VwdCB1bnByZWZpeGVkIHRyYW5zZm9ybS5cbiAgICAvLyBXZSBuZWVkIC1tcy0gZm9yIElFOSBhbmQgLXdlYmtpdC0gZm9yIG9sZGVyIEFuZHJvaWQ7XG4gICAgLy8gQXNzdW1lIHVzZSBvZiAtd2Via2l0LSBpZiB1bnByZWZpeGVkIGFuZCAtbXMtIGFyZSBub3Qgc3VwcG9ydGVkLlxuICAgIC8vIGh0dHBzOi8vY2FuaXVzZS5jb20vI2ZlYXQ9dHJhbnNmb3JtczJkXG4gICAgdmFyIGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHZhciBtc1ByZWZpeCA9IGQuc3R5bGUubXNUcmFuc2Zvcm0gIT09IHVuZGVmaW5lZDtcbiAgICB2YXIgbm9QcmVmaXggPSBkLnN0eWxlLnRyYW5zZm9ybSAhPT0gdW5kZWZpbmVkO1xuICAgIHBhcnNlZC50cmFuc2Zvcm1SdWxlID0gbm9QcmVmaXggPyBcInRyYW5zZm9ybVwiIDogbXNQcmVmaXggPyBcIm1zVHJhbnNmb3JtXCIgOiBcIndlYmtpdFRyYW5zZm9ybVwiO1xuICAgIC8vIFBpcHMgZG9uJ3QgbW92ZSwgc28gd2UgY2FuIHBsYWNlIHRoZW0gdXNpbmcgbGVmdC90b3AuXG4gICAgdmFyIHN0eWxlcyA9IFtcbiAgICAgICAgW1wibGVmdFwiLCBcInRvcFwiXSxcbiAgICAgICAgW1wicmlnaHRcIiwgXCJib3R0b21cIl0sXG4gICAgXTtcbiAgICBwYXJzZWQuc3R5bGUgPSBzdHlsZXNbcGFyc2VkLmRpcl1bcGFyc2VkLm9ydF07XG4gICAgcmV0dXJuIHBhcnNlZDtcbn1cbi8vZW5kcmVnaW9uXG5mdW5jdGlvbiBzY29wZSh0YXJnZXQsIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucykge1xuICAgIHZhciBhY3Rpb25zID0gZ2V0QWN0aW9ucygpO1xuICAgIHZhciBzdXBwb3J0c1RvdWNoQWN0aW9uTm9uZSA9IGdldFN1cHBvcnRzVG91Y2hBY3Rpb25Ob25lKCk7XG4gICAgdmFyIHN1cHBvcnRzUGFzc2l2ZSA9IHN1cHBvcnRzVG91Y2hBY3Rpb25Ob25lICYmIGdldFN1cHBvcnRzUGFzc2l2ZSgpO1xuICAgIC8vIEFsbCB2YXJpYWJsZXMgbG9jYWwgdG8gJ3Njb3BlJyBhcmUgcHJlZml4ZWQgd2l0aCAnc2NvcGVfJ1xuICAgIC8vIFNsaWRlciBET00gTm9kZXNcbiAgICB2YXIgc2NvcGVfVGFyZ2V0ID0gdGFyZ2V0O1xuICAgIHZhciBzY29wZV9CYXNlO1xuICAgIHZhciBzY29wZV9Db25uZWN0QmFzZTtcbiAgICB2YXIgc2NvcGVfSGFuZGxlcztcbiAgICB2YXIgc2NvcGVfQ29ubmVjdHM7XG4gICAgdmFyIHNjb3BlX1BpcHM7XG4gICAgdmFyIHNjb3BlX1Rvb2x0aXBzO1xuICAgIC8vIFNsaWRlciBzdGF0ZSB2YWx1ZXNcbiAgICB2YXIgc2NvcGVfU3BlY3RydW0gPSBvcHRpb25zLnNwZWN0cnVtO1xuICAgIHZhciBzY29wZV9WYWx1ZXMgPSBbXTtcbiAgICB2YXIgc2NvcGVfTG9jYXRpb25zID0gW107XG4gICAgdmFyIHNjb3BlX0hhbmRsZU51bWJlcnMgPSBbXTtcbiAgICB2YXIgc2NvcGVfQWN0aXZlSGFuZGxlc0NvdW50ID0gMDtcbiAgICB2YXIgc2NvcGVfRXZlbnRzID0ge307XG4gICAgdmFyIHNjb3BlX0Nvbm5lY3RzSW52ZXJ0ZWQgPSBmYWxzZTtcbiAgICAvLyBEb2N1bWVudCBOb2Rlc1xuICAgIHZhciBzY29wZV9Eb2N1bWVudCA9IHRhcmdldC5vd25lckRvY3VtZW50O1xuICAgIHZhciBzY29wZV9Eb2N1bWVudEVsZW1lbnQgPSBvcHRpb25zLmRvY3VtZW50RWxlbWVudCB8fCBzY29wZV9Eb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgdmFyIHNjb3BlX0JvZHkgPSBzY29wZV9Eb2N1bWVudC5ib2R5O1xuICAgIC8vIEZvciBob3Jpem9udGFsIHNsaWRlcnMgaW4gc3RhbmRhcmQgbHRyIGRvY3VtZW50cyxcbiAgICAvLyBtYWtlIC5ub1VpLW9yaWdpbiBvdmVyZmxvdyB0byB0aGUgbGVmdCBzbyB0aGUgZG9jdW1lbnQgZG9lc24ndCBzY3JvbGwuXG4gICAgdmFyIHNjb3BlX0Rpck9mZnNldCA9IHNjb3BlX0RvY3VtZW50LmRpciA9PT0gXCJydGxcIiB8fCBvcHRpb25zLm9ydCA9PT0gMSA/IDAgOiAxMDA7XG4gICAgLy8gQ3JlYXRlcyBhIG5vZGUsIGFkZHMgaXQgdG8gdGFyZ2V0LCByZXR1cm5zIHRoZSBuZXcgbm9kZS5cbiAgICBmdW5jdGlvbiBhZGROb2RlVG8oYWRkVGFyZ2V0LCBjbGFzc05hbWUpIHtcbiAgICAgICAgdmFyIGRpdiA9IHNjb3BlX0RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGlmIChjbGFzc05hbWUpIHtcbiAgICAgICAgICAgIGFkZENsYXNzKGRpdiwgY2xhc3NOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBhZGRUYXJnZXQuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICAgICAgcmV0dXJuIGRpdjtcbiAgICB9XG4gICAgLy8gQXBwZW5kIGEgb3Jp
10072Z2luIHRvIHRoZSBiYXNlXG4gICAgZnVuY3Rpb24gYWRkT3JpZ2luKGJhc2UsIGhhbmRsZU51bWJlcikge1xuICAgICAgICB2YXIgb3JpZ2luID0gYWRkTm9kZVRvKGJhc2UsIG9wdGlvbnMuY3NzQ2xhc3Nlcy5vcmlnaW4pO1xuICAgICAgICB2YXIgaGFuZGxlID0gYWRkTm9kZVRvKG9yaWdpbiwgb3B0aW9ucy5jc3NDbGFzc2VzLmhhbmRsZSk7XG4gICAgICAgIGFkZE5vZGVUbyhoYW5kbGUsIG9wdGlvbnMuY3NzQ2xhc3Nlcy50b3VjaEFyZWEpO1xuICAgICAgICBoYW5kbGUuc2V0QXR0cmlidXRlKFwiZGF0YS1oYW5kbGVcIiwgU3RyaW5nKGhhbmRsZU51bWJlcikpO1xuICAgICAgICBpZiAob3B0aW9ucy5rZXlib2FyZFN1cHBvcnQpIHtcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvR2xvYmFsX2F0dHJpYnV0ZXMvdGFiaW5kZXhcbiAgICAgICAgICAgIC8vIDAgPSBmb2N1c2FibGUgYW5kIHJlYWNoYWJsZVxuICAgICAgICAgICAgaGFuZGxlLnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsIFwiMFwiKTtcbiAgICAgICAgICAgIGhhbmRsZS5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXZlbnRLZXlkb3duKGV2ZW50LCBoYW5kbGVOdW1iZXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuaGFuZGxlQXR0cmlidXRlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2Y
10072XIgYXR0cmlidXRlc18xID0gb3B0aW9ucy5oYW5kbGVBdHRyaWJ1dGVzW2hhbmRsZU51bWJlcl07XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzXzEpLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCBhdHRyaWJ1dGVzXzFbYXR0cmlidXRlXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGUuc2V0QXR0cmlidXRlKFwicm9sZVwiLCBcInNsaWRlclwiKTtcbiAgICAgICAgaGFuZGxlLnNldEF0dHJpYnV0ZShcImFyaWEtb3JpZW50YXRpb25cIiwgb3B0aW9ucy5vcnQgPyBcInZlcnRpY2FsXCIgOiBcImhvcml6b250YWxcIik7XG4gICAgICAgIGlmIChoYW5kbGVOdW1iZXIgPT09IDApIHtcbiAgICAgICAgICAgIGFkZENsYXNzKGhhbmRsZSwgb3B0aW9ucy5jc3NDbGFzc2VzLmhhbmRsZUxvd2VyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChoYW5kbGVOdW1iZXIgPT09IG9wdGlvbnMuaGFuZGxlcyAtIDEpIHtcbiAgICAgICAgICAgIGFkZENsYXNzKGhhbmRsZSwgb3B0aW9ucy5jc3NDbGFzc2VzLmhhbmRsZVVwcGVyKTtcbiAgICAgICAgfVxuICAgICAgICBvcmlnaW4uaGFuZGxlID0gaGFuZGxlO1xuICAgICAgICByZXR1cm4gb3JpZ2luO1xuICAgIH1cbiAgICAvLyBJbnNlcnQgbm9kZXMgZm9yIGNvbm5lY3QgZWxlbWVudHNcbiAgICBmdW5jdGlvbiBhZGRDb25uZWN0KGJhc2UsIGFkZCkge1xuICAgICAgICBpZiAoIWFkZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZGROb2RlVG8oYmFzZSwgb3B0aW9ucy5jc3NDbGFzc2VzLmNvbm5lY3QpO1xuICAgIH1cbiAgICAvLyBBZGQgaGFuZGxlcyB0byB0aGUgc2xpZGVyIGJhc2UuXG4gICAgZnVuY3Rpb24gYWRkRWxlbWVudHMoY29ubmVjdE9wdGlvbnMsIGJhc2UpIHtcbiAgICAgICAgc2NvcGVfQ29ubmVjdEJhc2UgPSBhZGROb2RlVG8oYmFzZSwgb3B0aW9ucy5jc3NDbGFzc2VzLmNvbm5lY3RzKTtcbiAgICAgICAgc2NvcGVfSGFuZGxlcyA9IFtdO1xuICAgICAgICBzY29wZV9Db25uZWN0cyA9IFtdO1xuICAgICAgICBzY29wZV9Db25uZWN0cy5wdXNoKGFkZENvbm5lY3Qoc2NvcGVfQ29ubmVjdEJhc2UsIGNvbm5lY3RPcHRpb25zWzBdKSk7XG4gICAgICAgIC8vIFs6Ojo6Tz09PT1PPT09PU89PT09XVxuICAgICAgICAvLyBjb25uZWN0T3B0aW9ucyA9IFswLCAxLCAxLCAxXVxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9wdGlvbnMuaGFuZGxlczsgaSsrKSB7XG4gICAgICAgICAgICAvLyBLZWVwIGEgbGlzdCBvZiBhbGwgYWRkZWQgaGFuZGxlcy5cbiAgICAgICAgICAgIHNjb3BlX0hhbmRsZXMucHVzaChhZGRPcmlnaW4oYmFzZSwgaSkpO1xuICAgICAgICAgICAgc2NvcGVfSGFuZGxlTnVtYmVyc1tpXSA9IGk7XG4gICAgICAgICAgICBzY29wZV9Db25uZWN0cy5wdXNoKGFkZENvbm5lY3Qoc2NvcGVfQ29ubmVjdEJhc2UsIGNvbm5lY3RPcHRpb25zW2kgKyAxXSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEluaXRpYWxpemUgYSBzaW5nbGUgc2xpZGVyLlxuICAgIGZ1bmN0aW9uIGFkZFNsaWRlcihhZGRUYXJnZXQpIHtcbiAgICAgICAgLy8gQXBwbHkgY2xhc3NlcyBhbmQgZGF0YSB0byB0aGUgdGFyZ2V0LlxuICAgICAgICBhZGRDbGFzcyhhZGRUYXJnZXQsIG9wdGlvbnMuY3NzQ2xhc3Nlcy50YXJnZXQpO1xuICAgICAgICBpZiAob3B0aW9ucy5kaXIgPT09IDApIHtcbiAgICAgICAgICAgIGFkZENsYXNzKGFkZFRhcmdldCwgb3B0aW9ucy5jc3NDbGFzc2VzLmx0cik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhZGRDbGFzcyhhZGRUYXJnZXQsIG9wdGlvbnMuY3NzQ2xhc3Nlcy5ydGwpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLm9ydCA9PT0gMCkge1xuICAgICAgICAgICAgYWRkQ2xhc3MoYWRkVGFyZ2V0LCBvcHRpb25zLmNzc0NsYXNzZXMuaG9yaXpvbn
10072RhbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhZGRDbGFzcyhhZGRUYXJnZXQsIG9wdGlvbnMuY3NzQ2xhc3Nlcy52ZXJ0aWNhbCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRleHREaXJlY3Rpb24gPSBnZXRDb21wdXRlZFN0eWxlKGFkZFRhcmdldCkuZGlyZWN0aW9uO1xuICAgICAgICBpZiAodGV4dERpcmVjdGlvbiA9PT0gXCJydGxcIikge1xuICAgICAgICAgICAgYWRkQ2xhc3MoYWRkVGFyZ2V0LCBvcHRpb25zLmNzc0NsYXNzZXMudGV4dERpcmVjdGlvblJ0bCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhZGRDbGFzcyhhZGRUYXJnZXQsIG9wdGlvbnMuY3NzQ2xhc3Nlcy50ZXh0RGlyZWN0aW9uTHRyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWRkTm9kZVRvKGFkZFRhcmdldCwgb3B0aW9ucy5jc3NDbGFzc2VzLmJhc2UpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhZGRUb29sdGlwKGhhbmRsZSwgaGFuZGxlTnVtYmVyKSB7XG4gICAgICAgIGlmICghb3B0aW9ucy50b29sdGlwcyB8fCAhb3B0aW9ucy50b29sdGlwc1toYW5kbGVOdW1iZXJdKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFkZE5vZGVUbyhoYW5kbGUuZmlyc3RDaGlsZCwgb3B0aW9ucy5jc3NDbGFzc2VzLnRvb2x0aXApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc1NsaWRlckRpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gc2NvcGVfVGFyZ2V0Lmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpO1xuICAgIH1cbiAgICAvLyBEaXNhYmxlIHRoZSBzbGlkZXIgZHJhZ2dpbmcgaWYgYW55IGhhbmRsZSBpcyBkaXNhYmxlZFxuICAgIGZ1bmN0aW9uIGlzSGFuZGxlRGlzYWJsZWQoaGFuZGxlTnVtYmVyKSB7XG4gICAgICAgIHZhciBoYW5kbGVPcmlnaW4gPSBzY29wZV9IYW5kbGVzW2hhbmRsZU51bWJlcl07XG4gICAgICAgIHJldHVybiBoYW5kbGVPcmlnaW4uaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRpc2FibGUoaGFuZGxlTnVtYmVyKSB7XG4gICAgICAgIGlmIChoYW5kbGVOdW1iZXIgIT09IG51bGwgJiYgaGFuZGxlTnVtYmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHNjb3BlX0hhbmRsZXNbaGFuZGxlTnVtYmVyXS5zZXRBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiLCBcIlwiKTtcbiAgICAgICAgICAgIHNjb3BlX0hhbmRsZXNbaGFuZGxlTnVtYmVyXS5oYW5kbGUucmVtb3ZlQXR0cmlidXRlKFwidGFiaW5kZXhcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzY29wZV9UYXJnZXQuc2V0QXR0cmlidXRlKFwiZGlzYWJsZWRcIiwgXCJcIik7XG4gICAgICAgICAgICBzY29wZV9IYW5kbGVzLmZvckVhY2goZnVuY3Rpb24gKGhhbmRsZSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZS5oYW5kbGUucmVtb3ZlQXR0cmlidXRlKFwidGFiaW5kZXhcIik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBlbmFibGUoaGFuZGxlTnVtYmVyKSB7XG4gICAgICAgIGlmIChoYW5kbGVOdW1iZXIgIT09IG51bGwgJiYgaGFuZGxlTnVtYmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHNjb3BlX0hhbmRsZXNbaGFuZGxlTnVtYmVyXS5yZW1vdmVBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgIHNjb3BlX0hhbmRsZXNbaGFuZGxlTnVtYmVyXS5oYW5kbGUuc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCIwXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2NvcGVfVGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZShcImRpc2FibGVkXCIpO1xuICAgICAgICAgICAgc2NvcGVfSGFuZGxlcy5mb3JFYWNoKGZ1bmN0aW9uIChoYW5kbGUpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGUucmVtb3ZlQXR0cmlidXRlKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICAgICAgICAgaGFuZGxlLmhhbmRsZS5zZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiLCBcIjBcIik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiByZW1vdmVUb29sdGlwcygpIHtcbiAgICAgICAgaWYgKHNjb3BlX1Rvb2x0aXBzKSB7XG4gICAgICAgICAgICByZW1vdmVFdmVudChcInVwZGF0ZVwiICsgSU5URVJOQUxfRVZFTlRfTlMudG9vbHRpcHMpO1xuICAgICAgICAgICAgc2NvcGVfVG9vbHRpcHMuZm9yRWFjaChmdW5jdGlvbiAodG9vbHRpcCkge1xuICAgICAgICAgICAgICAgIGlmICh0b29sdGlwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZUVsZW1lbnQodG9vbHRpcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzY29wZV9Ub29sdGlwcyA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVGhlIHRvb2x0aXBzIG9wdGlvbiBpcyBhIHNob3J0aGFuZCBmb3IgdXNpbmcgdGhlICd1cGRhdGUnIGV2ZW50LlxuICAgIGZ1bmN0aW9uIHRvb2x0aXBzKCkge1xuICAgICAgICByZW1vdmVUb29sdGlwcygpO1xuICAgICAgICAvLyBUb29sdGlwcyBhcmUgYWRkZWQgd2l0aCBvcHRpb25zLnRvb2x0aXBzIGluIG9yaWdpbmFsIG9yZGVyLlxuICAgICAgICBzY29wZV9Ub29sdGlwcyA9IHNjb3BlX0hhbmRsZXMubWFwKGFkZFRvb2x0aXApO1xuICAgICAgICBiaW5kRXZlbnQoXCJ1cGRhdGVcIiArIElOVEVSTkFMX0VWRU5UX05TLnRvb2x0aXBzLCBmdW5jdGlvbiAodmFsdWVzLCBoYW5kbGVOdW1iZXIsIHVuZW5jb2RlZCkge1xuICAgICAgICAgICAgaWYgKCFzY29wZV9Ub29sdGlwcyB8fCAhb3B0aW9ucy50b29sdGlwcykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzY29wZV9Ub29sdGlwc1toYW5kbGVOdW1iZXJdID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBmb3JtYXR0ZWRWYWx1ZSA9IHZhbHVlc1toYW5kbGVOdW1iZXJdO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMudG9vbHRpcHNbaGFuZGxlTnVtYmVyXSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGZvcm1hdHRlZFZhbHVlID0gb3B0aW9ucy50b29sdGlwc1toYW5kbGVOdW1iZXJdLnRvKHVuZW5jb2RlZ
10072FtoYW5kbGVOdW1iZXJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjb3BlX1Rvb2x0aXBzW2hhbmRsZU51bWJlcl0uaW5uZXJIVE1MID0gZm9ybWF0dGVkVmFsdWU7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhcmlhKCkge1xuICAgICAgICByZW1vdmVFdmVudChcInVwZGF0ZVwiICsgSU5URVJOQUxfRVZFTlRfTlMuYXJpYSk7XG4gICAgICAgIGJpbmRFdmVudChcInVwZGF0ZVwiICsgSU5URVJOQUxfRVZFTlRfTlMuYXJpYSwgZnVuY3Rpb24gKHZhbHVlcywgaGFuZGxlTnVtYmVyLCB1bmVuY29kZWQsIHRhcCwgcG9zaXRpb25zKSB7XG4gICAgICAgICAgICAvLyBVcGRhdGUgQXJpYSBWYWx1ZXMgZm9yIGFsbCBoYW5kbGVzLCBhcyBhIGNoYW5nZSBpbiBvbmUgY2hhbmdlcyBtaW4gYW5kIG1heCB2YWx1ZXMgZm9yIHRoZSBuZXh0LlxuICAgICAgICAgICAgc2NvcGVfSGFuZGxlTnVtYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICAgICAgICAgIHZhciBoYW5kbGUgPSBzY29wZV9IYW5kbGVzW2luZGV4XTtcbiAgICAgICAgICAgICAgICB2YXIgbWluID0gY2hlY2tIYW5kbGVQb3NpdGlvbihzY29wZV9Mb2NhdGlvbnMsIGluZGV4LCAwLCB0cnVlLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB2YXIgbWF4ID0gY2hlY2tIYW5kbGVQb3NpdGlvbihzY29wZV9Mb2NhdGlvbnMsIGluZGV4LCAxMDAsIHRydWUsIHRydWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIHZhciBub3cgPSBwb3NpdGlvbnNbaW5kZXhdO1xuICAgICAgICAgICAgICAgIC8vIEZvcm1hdHRlZCB2YWx1ZSBmb3IgZGlzcGxheVxuICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gU3RyaW5nKG9wdGlvbnMuYXJpYUZvcm1hdC50byh1bmVuY29kZWRbaW5kZXhdKSk7XG4gICAgICAgICAgICAgICAgLy8gTWFwIHRvIHNsaWRlciByYW5nZSB2YWx1ZXNcbiAgICAgICAgICAgICAgICBtaW4gPSBzY29wZV9TcGVjdHJ1bS5mcm9tU3RlcHBpbmcobWluKS50b0ZpeGVkKDEpO1xuICAgICAgICAgICAgICAgIG1heCA9IHNjb3BlX1NwZWN0cnVtLmZyb21TdGVwcGluZyhtYXgpLnRvRml4ZWQoMSk7XG4gICAgICAgICAgICAgICAgbm93ID0gc2NvcGVfU3BlY3RydW0uZnJvbVN0ZXBwaW5nKG5vdykudG9GaXhlZCgxKTtcbiAgICAgICAgICAgICAgICBoYW5kbGUuY2hpbGRyZW5bMF0uc2V0QXR0cmlidXRlKFwiYXJpYS12YWx1ZW1pblwiLCBtaW4pO1xuICAgICAgICAgICAgICAgIGhhbmRsZS5jaGlsZHJlblswXS5zZXRBdHRyaWJ1dGUoXCJhcmlhLXZhbHVlbWF4XCIsIG1heCk7XG4gICAgICAgICAgICAgICAgaGFuZGxlLmNoaWxkcmVuWzBdLnNldEF0dHJpYnV0ZShcImFyaWEtdmFsdWVub3dcIiwgbm93KTtcbiAgICAgICAgICAgICAgICBoYW5kbGUuY2hpbGRyZW5bMF0uc2V0QXR0cmlidXRlKFwiYXJpYS12YWx1ZXRleHRcIiwgdGV4dCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldEdyb3VwKHBpcHMpIHtcbiAgICAgICAgLy8gVXNlIHRoZSByYW5nZS5cbiAgICAgICAgaWYgKHBpcHMubW9kZSA9PT0gUGlwc01vZGUuUmFuZ2UgfHwgcGlwcy5tb2RlID09PSBQaXBzTW9kZS5TdGVwcykge1xuICAgICAgICAgICAgcmV0dXJuIHNjb3BlX1NwZWN0cnVtLnhWYWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBpcHMubW9kZSA9PT0gUGlwc01vZGUuQ291bnQpIHtcbiAgICAgICAgICAgIGlmIChwaXBzLnZhbHVlcyA8IDIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub1VpU2xpZGVyOiAndmFsdWVzJyAoPj0gMikgcmVxdWlyZWQgZm9yIG1vZGUgJ2NvdW50Jy5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBEaXZpZGUgMCAtIDEwMCBpbiAnY291bnQnIHBhcnRzLlxuICAgICAgICAgICAgdmFyIGludGVydmFsID0gcGlwcy52YWx1ZXMgLSAxO1xuICAgICAgICAgICAgdmFyIHNwcmVhZCA9IDEwMCAvIGludGVydmFsO1xuICAgICAgICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgLy8gTGlzdCB0aGVzZSBwYXJ0cyBhbmQgaGF2ZSB0aGVtIGhhbmRsZWQgYXMgJ3Bvc2l0aW9ucycuXG4gICAgICAgICAgICB3aGlsZSAoaW50ZXJ2YWwtLSkge1xuICAgICAgICAgICAgICAgIHZhbHVlc1tpbnRlcnZhbF0gPSBpbnRlcnZhbCAqIHNwcmVhZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbHVlcy5wdXNoKDEwMCk7XG4gICAgICAgICAgICByZXR1cm4gbWFwVG9SYW5nZSh2YWx1ZXMsIHBpcHMuc3RlcHBlZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBpcHMubW9kZSA9PT0gUGlwc01vZGUuUG9zaXRpb25zKSB7XG4gICAgICAgICAgICAvLyBNYXAgYWxsIHBlcmNlbnRhZ2VzIHRvIG9uLXJhbmdlIHZhbHVlcy5cbiAgICAgICAgICAgIHJldHVybiBtYXBUb1JhbmdlKHBpcHMudmFsdWVzLCBwaXBzLnN0ZXBwZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwaXBzLm1vZGUgPT09IFBpcHNNb2RlLlZhbHVlcykge1xuICAgICAgICAgICAgLy8gSWYgdGhlIHZhbHVlIG11c3QgYmUgc3RlcHBlZCwgaXQgbmVlZHMgdG8gYmUgY29udmVydGVkIHRvIGEgcGVyY2VudGFnZSBmaXJzdC5cbiAgICAgICAgICAgIGlmIChwaXBzLnN0ZXBwZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGlwcy52YWx1ZXMubWFwKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHRvIHBlcmNlbnRhZ2UsIGFwcGx5IHN0ZXAsIHJldHVybiB0byB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNjb3BlX1NwZWN0cnVtLmZyb21TdGVwcGluZyhzY29wZV9TcGVjdHJ1bS5nZXRTdGVwKHNjb3BlX1NwZWN0cnVtLnRvU3RlcHBpbmcodmFsdWUpKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBPdGhlcndpc2UsIHdlIGNhbiBzaW1wbHkgdXNlIHRoZSB2YWx1ZXMuXG4gICAgICAgICAgICByZXR1cm4gcGlwcy52YWx1ZXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdOyAvLyBwaXBzLm1vZGUgPSBuZXZlclxuICAgIH1cbiAgICBmdW5jdGlvbiBtYXBUb1JhbmdlKHZhbHVlcywgc3RlcHBlZCkge1xuICAgICAgICByZXR1cm4gdmFsdWVzLm1hcChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgI
10072HJldHVybiBzY29wZV9TcGVjdHJ1bS5mcm9tU3RlcHBpbmcoc3RlcHBlZCA/IHNjb3BlX1NwZWN0cnVtLmdldFN0ZXAodmFsdWUpIDogdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVTcHJlYWQocGlwcykge1xuICAgICAgICBmdW5jdGlvbiBzYWZlSW5jcmVtZW50KHZhbHVlLCBpbmNyZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIEF2b2lkIGZsb2F0aW5nIHBvaW50IHZhcmlhbmNlIGJ5IGRyb3BwaW5nIHRoZSBzbWFsbGVzdCBkZWNpbWFsIHBsYWNlcy5cbiAgICAgICAgICAgIHJldHVybiBOdW1iZXIoKHZhbHVlICsgaW5jcmVtZW50KS50b0ZpeGVkKDcpKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZ3JvdXAgPSBnZXRHcm91cChwaXBzKTtcbiAgICAgICAgdmFyIGluZGV4ZXMgPSB7fTtcbiAgICAgICAgdmFyIGZpcnN0SW5SYW5nZSA9IHNjb3BlX1NwZWN0cnVtLnhWYWxbMF07XG4gICAgICAgIHZhciBsYXN0SW5SYW5nZSA9IHNjb3BlX1NwZWN0cnVtLnhWYWxbc2NvcGVfU3BlY3RydW0ueFZhbC5sZW5ndGggLSAxXTtcbiAgICAgICAgdmFyIGlnbm9yZUZpcnN0ID0gZmFsc2U7XG4gICAgICAgIHZhciBpZ25vcmVMYXN0ID0gZmFsc2U7XG4gICAgICAgIHZhciBwcmV2UGN0ID0gMDtcbiAgICAgICAgLy8gQ3JlYXRlIGEgY29weSBvZiB0aGUgZ3JvdXAsIHNvcnQgaXQgYW5kIGZpbHRlciBhd2F5IGFsbCBkdXBsaWNhdGVzLlxuICAgICAgICBncm91cCA9IHVuaXF1ZShncm91cC5zbGljZSgpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBhIC0gYjtcbiAgICAgICAgfSkpO1xuICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHJhbmdlIHN0YXJ0cyB3aXRoIHRoZSBmaXJzdCBlbGVtZW50LlxuICAgICAgICBpZiAoZ3JvdXBbMF0gIT09IGZpcnN0SW5SYW5nZSkge1xuICAgICAgICAgICAgZ3JvdXAudW5zaGlmdChmaXJzdEluUmFuZ2UpO1xuICAgICAgICAgICAgaWdub3JlRmlyc3QgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIExpa2V3aXNlIGZvciB0aGUgbGFzdCBvbmUuXG4gICAgICAgIGlmIChncm91cFtncm91cC5sZW5ndGggLSAxXSAhPT0gbGFzdEluUmFuZ2UpIHtcbiAgICAgICAgICAgIGdyb3VwLnB1c2gobGFzdEluUmFuZ2UpO1xuICAgICAgICAgICAgaWdub3JlTGFzdCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZ3JvdXAuZm9yRWFjaChmdW5jdGlvbiAoY3VycmVudCwgaW5kZXgpIHtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgY3VycmVudCBzdGVwIGFuZCB0aGUgbG93ZXIgKyB1cHBlciBwb3NpdGlvbnMuXG4gICAgICAgICAgICB2Y
10072XIgc3RlcDtcbiAgICAgICAgICAgIHZhciBpO1xuICAgICAgICAgICAgdmFyIHE7XG4gICAgICAgICAgICB2YXIgbG93ID0gY3VycmVudDtcbiAgICAgICAgICAgIHZhciBoaWdoID0gZ3JvdXBbaW5kZXggKyAxXTtcbiAgICAgICAgICAgIHZhciBuZXdQY3Q7XG4gICAgICAgICAgICB2YXIgcGN0RGlmZmVyZW5jZTtcbiAgICAgICAgICAgIHZhciBwY3RQb3M7XG4gICAgICAgICAgICB2YXIgdHlwZTtcbiAgICAgICAgICAgIHZhciBzdGVwcztcbiAgICAgICAgICAgIHZhciByZWFsU3RlcHM7XG4gICAgICAgICAgICB2YXIgc3RlcFNpemU7XG4gICAgICAgICAgICB2YXIgaXNTdGVwcyA9IHBpcHMubW9kZSA9PT0gUGlwc01vZGUuU3RlcHM7XG4gICAgICAgICAgICAvLyBXaGVuIHVzaW5nICdzdGVwcycgbW9kZSwgdXNlIHRoZSBwcm92aWRlZCBzdGVwcy5cbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgd2UnbGwgc3RlcCBvbiB0byB0aGUgbmV4dCBzdWJyYW5nZS5cbiAgICAgICAgICAgIGlmIChpc1N0ZXBzKSB7XG4gICAgICAgICAgICAgICAgc3RlcCA9IHNjb3BlX1NwZWN0cnVtLnhOdW1TdGVwc1tpbmRleF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBEZWZhdWx0IHRvIGEgJ2Z1bGwnIHN0ZXAuXG4gICAgICAgICAgICBpZiAoIXN0ZXApIHtcbiAgICAgICAgICAgICAgICBzdGVwID0gaGlnaCAtIGxvdztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIGhpZ2ggaXMgdW5kZWZpbmVkIHdlIGFyZSBhdCB0aGUgbGFzdCBzdWJyYW5nZS4gTWFrZSBzdXJlIGl0IGl0ZXJhdGVzIG9uY2UgKCMxMDg4KVxuICAgICAgICAgICAgaWYgKGhpZ2ggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGhpZ2ggPSBsb3c7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgc3RlcCBpc24ndCAwLCB3aGljaCB3b3VsZCBjYXVzZSBhbiBpbmZpbml0ZSBsb29wICgjNjU0KVxuICAgICAgICAgICAgc3RlcCA9IE1hdGgubWF4KHN0ZXAsIDAuMDAwMDAwMSk7XG4gICAgICAgICAgICAvLyBGaW5kIGFsbCBzdGVwcyBpbiB0aGUgc3VicmFuZ2UuXG4gICAgICAgICAgICBmb3IgKGkgPSBsb3c7IGkgPD0gaGlnaDsgaSA9IHNhZmVJbmNyZW1lbnQoaSwgc3RlcCkpIHtcbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHBlcmNlbnRhZ2UgdmFsdWUgZm9yIHRoZSBjdXJyZW50IHN0ZXAsXG4gICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBzaXplIGZvciB0aGUgc3VicmFuZ2UuXG4gICAgICAgICAgICAgICAgbmV3UGN0ID0gc2NvcGVfU3BlY3RydW0udG9TdGVwcGluZyhpKTtcbiAgICAgICAgICAgICAgICBwY3REaWZmZXJlbmNlID0gbmV3UGN0IC0gcHJldlBjdDtcbiAgICAgICAgICAgICAgICBzdGVwcyA9IHBjdERpZmZlcmVuY2UgLyAocGlwcy5kZW5zaXR5IHx8IDEpO1xuICAgICAgICAgICAgICAgIHJlYWxTdGVwcyA9IE1hdGgucm91bmQoc3RlcHMpO1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgcmF0aW8gcmVwcmVzZW50cyB0aGUgYW1vdW50IG9mIHBlcmNlbnRhZ2Utc3BhY2UgYSBwb2ludCBpbmRpY2F0ZXMuXG4gICAgICAgICAgICAgICAgLy8gRm9yIGEgZGVuc2l0eSAxIHRoZSBwb2ludHMvcGVyY2VudGFnZSA9IDEuIEZvciBkZW5zaXR5IDIsIHRoYXQgcGVyY2VudGFnZSBuZWVkcyB0byBiZSByZS1kaXZpZGVkLlxuICAgICAgICAgICAgICAgIC8vIFJvdW5kIHRoZSBwZXJjZW50YWdlIG9mZnNldCB0byBhbiBldmVuIG51bWJlciwgdGhlbiBkaXZpZGUgYnkgdHdvXG4gICAgICAgICAgICAgICAgLy8gdG8gc3ByZWFkIHRoZSBvZmZzZXQgb24gYm90aCBzaWRlcyBvZiB0aGUgcmFuZ2UuXG4gICAgICAgICAgICAgICAgc3RlcFNpemUgPSBwY3REaWZmZXJlbmNlIC8gcmVhbFN0ZXBzO1xuICAgICAgICAgICAgICAgIC8vIERpdmlkZSBhbGwgcG9pbnRzIGV2ZW5seSwgYWRkaW5nIHRoZSBjb3JyZWN0IG51bWJlciB0byB0aGlzIHN1YnJhbmdlLlxuICAgICAgICAgICAgICAgIC8vIFJ1biB1cCB0byA8PSBzbyB0aGF0IDEwMCUgZ2V0cyBhIHBvaW50LCBldmVudCBpZiBpZ25vcmVMYXN0IGlzIHNldC5cbiAgICAgICAgICAgICAgICBmb3IgKHEgPSAxOyBxIDw9IHJlYWxTdGVwczsgcSArPSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSByYXRpbyBiZXR3ZWVuIHRoZSByb3VuZGVkIHZhbHVlIGFuZCB0aGUgYWN0dWFsIHNpemUgbWlnaHQgYmUgfjElIG9mZi5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ29ycmVjdCB0aGUgcGVyY2VudGFnZSBvZmZzZXQgYnkgdGhlIG51bWJlciBvZiBwb2ludHNcbiAgICAgICAgICAgICAgICAgICAgLy8gcGVyIHN1YnJhbmdlLiBkZW5zaXR5ID0gMSB3aWxsIHJlc3VsdCBpbiAxMDAgcG9pbnRzIG9uIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBmdWxsIHJhbmdlLCAyIGZvciA1MCwgNCBmb3IgMjUsIGV0Yy5cbiAgICAgICAgICAgICAgICAgICAgcGN0UG9zID0gcHJldlBjdCArIHEgKiBzdGVwU2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhlc1twY3RQb3MudG9GaXhlZCg1KV0gPSBbc2NvcGVfU3BlY3RydW0uZnJvbVN0ZXBwaW5nKHBjdFBvcyksIDBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIHBvaW50IHR5cGUuXG4gICAgICAgICAgICAgICAgdHlwZSA9IGdyb3VwLmluZGV4T2YoaSkgPiAtMSA/IFBpcHNUeXBlLkxhcmdlVmFsdWUgOiBpc1N0ZXBzID8gUGlwc1R5cGUuU21hbGxWYWx1ZSA6IFBpcHNUeXBlLk5vVmFsdWU7XG4gICAgICAgICAgICAgICAgLy8gRW5mb3JjZSB0aGUgJ2lnbm9yZUZpcnN0JyBvcHRpb24gYnkgb3ZlcndyaXRpbmcgdGhlIHR5cGUgZm9yIDAuXG4gICAgICAgICAgICAgICAgaWYgKCFpbmRleCAmJiBpZ25vcmVGaXJzdCAmJiBpICE9PSBoaWdoKSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIShpID09PSBoaWdoICYmIGlnbm9yZUxhc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE1hcmsgdGhlICd0eXBlJyBvZiB0aGlzIHBvaW50LiAwID0gcGxhaW4sIDEgPSByZWFsIHZhbHVlLCAyID0gc3RlcCB2YWx1ZS
100725cbiAgICAgICAgICAgICAgICAgICAgaW5kZXhlc1tuZXdQY3QudG9GaXhlZCg1KV0gPSBbaSwgdHlwZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcGVyY2VudGFnZSBjb3VudC5cbiAgICAgICAgICAgICAgICBwcmV2UGN0ID0gbmV3UGN0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGluZGV4ZXM7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFkZE1hcmtpbmcoc3ByZWFkLCBmaWx0ZXJGdW5jLCBmb3JtYXR0ZXIpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgdmFyIGVsZW1lbnQgPSBzY29wZV9Eb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB2YXIgdmFsdWVTaXplQ2xhc3NlcyA9IChfYSA9IHt9LFxuICAgICAgICAgICAgX2FbUGlwc1R5cGUuTm9uZV0gPSBcIlwiLFxuICAgICAgICAgICAgX2FbUGlwc1R5cGUuTm9WYWx1ZV0gPSBvcHRpb25zLmNzc0NsYXNzZXMudmFsdWVOb3JtYWwsXG4gICAgICAgICAgICBfYVtQaXBzVHlwZS5MYXJnZVZhbHVlXSA9IG9wdGlvbnMuY3NzQ2xhc3Nlcy52YWx1ZUxhcmdlLFxuICAgICAgICAgICAgX2FbUGlwc1R5cGUuU21hbGxWYWx1ZV0gPSBvcHRpb25zLmNzc0NsYXNzZXMudmFsdWVTdWIsXG4gICAgICAgICAgICBfYSk7XG4gICAgICAgIHZhciBtYXJrZXJTaXplQ2xhc3NlcyA9IChfYiA9IHt9LFxuICAgICAgICAgICAgX2JbUGlwc1R5cGUuTm9uZV0gPSBcIlwiLFxuICAgICAgICAgICAgX2JbUGlwc1R5cGUuTm9WYWx1ZV0gPSBvcHRpb25zLmNzc0NsYXNzZXMubWFya2VyTm9ybWFsLFxuICAgICAgICAgICAgX2JbUGlwc1R5cGUuTGFyZ2VWYWx1ZV0gPSBvcHRpb25zLmNzc0NsYXNzZXMubWFya2VyTGFyZ2UsXG4gICAgICAgICAgICBfYltQaXBzVHlwZS5TbWFsbFZhbHVlXSA9IG9wdGlvbnMuY3NzQ2xhc3Nlcy5tYXJrZXJTdWIsXG4gICAgICAgICAgICBfYik7XG4gICAgICAgIHZhciB2YWx1ZU9yaWVudGF0aW9uQ2xhc3NlcyA9IFtvcHRpb25zLmNzc0NsYXNzZXMudmFsdWVIb3Jpem9udGFsLCBvcHRpb25zLmNzc0NsYXNzZXMudmFsdWVWZXJ0aWNhbF07XG4gICAgICAgIHZhciBtYXJrZXJPcmllbnRhdGlvbkNsYXNzZXMgPSBbb3B0aW9ucy5jc3NDbGFzc2VzLm1hcmtlckhvcml6b250YWwsIG9wdGlvbnMuY3NzQ2xhc3Nlcy5tYXJrZXJWZXJ0aWNhbF07XG4gICAgICAgIGFkZENsYXNzKGVsZW1lbnQsIG9wdGlvbnMuY3NzQ2xhc3Nlcy5waXBzKTtcbiAgICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgb3B0aW9ucy5vcnQgPT09IDAgPyBvcHRpb25zLmNzc0NsYXNzZXMucGlwc0hvcml6b250YWwgOiBvcHRpb25zLmNzc0NsYXNzZXMucGlwc1ZlcnRpY2FsKTtcbiAgICAgICAgZnVuY3Rpb24gZ2V0Q2xhc3Nlcyh0eXBlLCBzb3VyY2UpIHtcbiAgICAgICAgICAgIHZhciBhID0gc291cmNlID09PSBvcHRpb25zLmNzc0NsYXNzZXMudmFsdWU7XG4gICAgICAgICAgICB2Y
10072XIgb3JpZW50YXRpb25DbGFzc2VzID0gYSA/IHZhbHVlT3JpZW50YXRpb25DbGFzc2VzIDogbWFya2VyT3JpZW50YXRpb25DbGFzc2VzO1xuICAgICAgICAgICAgdmFyIHNpemVDbGFzc2VzID0gYSA/IHZhbHVlU2l6ZUNsYXNzZXMgOiBtYXJrZXJTaXplQ2xhc3NlcztcbiAgICAgICAgICAgIHJldHVybiBzb3VyY2UgKyBcIiBcIiArIG9yaWVudGF0aW9uQ2xhc3Nlc1tvcHRpb25zLm9ydF0gKyBcIiBcIiArIHNpemVDbGFzc2VzW3R5cGVdO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGFkZFNwcmVhZChvZmZzZXQsIHZhbHVlLCB0eXBlKSB7XG4gICAgICAgICAgICAvLyBBcHBseSB0aGUgZmlsdGVyIGZ1bmN0aW9uLCBpZiBpdCBpcyBzZXQuXG4gICAgICAgICAgICB0eXBlID0gZmlsdGVyRnVuYyA/IGZpbHRlckZ1bmModmFsdWUsIHR5cGUpIDogdHlwZTtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBQaXBzVHlwZS5Ob25lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQWRkIGEgbWFya2VyIGZvciBldmVyeSBwb2ludFxuICAgICAgICAgICAgdmFyIG5vZGUgPSBhZGROb2RlVG8oZWxlbWVudCwgZmFsc2UpO1xuICAgICAgICAgICAgbm9kZS5jbGFzc05hbWUgPSBnZXRDbGFzc2VzKHR5cGUsIG9wdGlvbnMuY3NzQ2xhc3Nlcy5tYXJrZXIpO1xuICAgICAgICAgICAgbm9kZS5zdHlsZVtvcHRpb25zLnN0eWxlXSA9IG9mZnNldCArIFwiJVwiO1xuICAgICAgICAgICAgLy8gVmFsdWVzIGFyZSBvbmx5IGFwcGVuZGVkIGZvciBwb2ludHMgbWFya2VkICcxJyBvciAnMicuXG4gICAgICAgICAgICBpZiAodHlwZSA+IFBpcHNUeXBlLk5vVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBub2RlID0gYWRkTm9kZVRvKGVsZW1lbnQsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBub2RlLmNsYXNzTmFtZSA9IGdldENsYXNzZXModHlwZSwgb3B0aW9ucy5jc3NDbGFzc2VzLnZhbHVlKTtcbiAgICAgICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShcImRhdGEtdmFsdWVcIiwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgbm9kZS5zdHlsZVtvcHRpb25zLnN0eWxlXSA9IG9mZnNldCArIFwiJVwiO1xuICAgICAgICAgICAgICAgIG5vZGUuaW5uZXJIVE1MID0gU3RyaW5nKGZvcm1hdHRlci50byh2YWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEFwcGVuZCBhbGwgcG9pbnRzLlxuICAgICAgICBPYmplY3Qua2V5cyhzcHJlYWQpLmZvckVhY2goZnVuY3Rpb24gKG9mZnNldCkge1xuICAgICAgICAgICAgYWRkU3ByZWFkKG9mZnNldCwgc3ByZWFkW29mZnNldF1bMF0sIHNwcmVhZFtvZmZzZXRdWzFdKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cbiAgICBmdW5jdGlvbiByZW1vdmVQaXBzKCkge1xuICAgICAgICBpZiAoc2NvcGVfUGlwcykge1xuICAgICAgICAgICAgcmVtb3ZlRWxlbWVudChzY29wZV9QaXBzKTtcbiAgICAgICAgICAgIHNjb3BlX1BpcHMgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBpcHMocGlwcykge1xuICAgICAgICAvLyBGaXggIzY2OVxuICAgICAgICByZW1vdmVQaXBzKCk7XG4gICAgICAgIHZhciBzcHJlYWQgPSBnZW5lcmF0ZVNwcmVhZChwaXBzKTtcbiAgICAgICAgdmFyIGZpbHRlciA9IHBpcHMuZmlsdGVyO1xuICAgICAgICB2Y
10072XIgZm9ybWF0ID0gcGlwcy5mb3JtYXQgfHwge1xuICAgICAgICAgICAgdG86IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcoTWF0aC5yb3VuZCh2YWx1ZSkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgc2NvcGVfUGlwcyA9IHNjb3BlX1RhcmdldC5hcHBlbmRDaGlsZChhZGRNYXJraW5nKHNwcmVhZCwgZmlsdGVyLCBmb3JtYXQpKTtcbiAgICAgICAgcmV0dXJuIHNjb3BlX1BpcHM7XG4gICAgfVxuICAgIC8vIFNob3J0aGFuZCBmb3IgYmFzZSBkaW1lbnNpb25zLlxuICAgIGZ1bmN0aW9uIGJhc2VTaXplKCkge1xuICAgICAgICB2YXIgcmVjdCA9IHNjb3BlX0Jhc2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHZhciBhbHQgPSAoXCJvZmZzZXRcIiArIFtcIldpZHRoXCIsIFwiSGVpZ2h0XCJdW29wdGlvbnMub3J0XSk7XG4gICAgICAgIHJldHVybiBvcHRpb25zLm9ydCA9PT0gMCA/IHJlY3Qud2lkdGggfHwgc2NvcGVfQmFzZVthbHRdIDogcmVjdC5oZWlnaHQgfHwgc2NvcGVfQmFzZVthbHRdO1xuICAgIH1cbiAgICAvLyBIYW5kbGVyIGZvciBhdHRhY2hpbmcgZXZlbnRzIHRyb3VnaCBhIHByb3h5LlxuICAgIGZ1bmN0aW9uIGF0dGFjaEV2ZW50KGV2ZW50cywgZWxlbWVudCwgY2FsbGJhY2ssIGRhdGEpIHtcbiAgICAgICAgLy8gVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byAnZmlsdGVyJyBldmVudHMgdG8gdGhlIHNsaWRlci5cbiAgICAgICAgLy8gZWxlbWVudCBpcyBhIG5vZGUsIG5vdCBhIG5vZGVMaXN0XG4gICAgICAgIHZhciBtZXRob2QgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHZhciBlID0gZml4RXZlbnQoZXZlbnQsIGRhdGEucGFnZU9mZnNldCwgZGF0YS50YXJnZXQgfHwgZWxlbWVudCk7XG4gICAgICAgICAgICAvLyBmaXhFdmVudCByZXR1cm5zIGZhbHNlIGlmIHRoaXMgZXZlbnQgaGFzIGEgZGlmZmVyZW50IHRhcmdldFxuICAgICAgICAgICAgLy8gd2hlbiBoYW5kbGluZyAobXVsdGktKSB0b3VjaCBldmVudHM7XG4gICAgICAgICAgICBpZiAoIWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBkb05vdFJlamVjdCBpcyBwYXNzZWQgYnkgYWxsIGVuZCBldmVudHMgdG8gbWFrZSBzdXJlIHJlbGVhc2VkIHRvdWNoZXNcbiAgICAgICAgICAgIC8vIGFyZSBub3QgcmVqZWN0ZWQsIGxlYXZpbmcgdGhlIHNsaWRlciBcInN0dWNrXCIgdG8gdGhlIGN1cnNvcjtcbiAgICAgICAgICAgIGlmIChpc1NsaWRlckRpc2FibGVkKCkgJiYgIWRhdGEuZG9Ob3RSZWplY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTdG9wIGlmIGFuIGFjdGl2ZSAndGFwJyB0cmFuc2l0aW9uIGlzIHRha2luZyBwbGFjZS5cbiAgICAgICAgICAgIGlmIChoYXNDbGFzcyhzY29wZV9UYXJnZXQsIG9wdGlvbnMuY3NzQ2xhc3Nlcy50YXApICYmICFkYXRhLmRvTm90UmVqZWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWdub3JlIHJpZ2h0IG9yIG1pZGRsZSBjbGlja3Mgb24gc3RhcnQgIzQ1NFxuICAgICAgICAgICAgaWYgKGV2ZW50cyA9PT0gYWN0aW9ucy5zdGFydCAmJiBlLmJ1dHRvbnMgIT09IHVuZGVmaW5lZCAmJiBlLmJ1dHRvbnMgPiAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWdub3JlIHJpZ2h0IG9yIG1pZGRsZSBjbGlja3Mgb24gc3RhcnQgIzQ1NFxuICAgICAgICAgICAgaWYgKGRhdGEuaG92ZXIgJiYgZS5idXR0b25zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gJ3N1cHBvcnRzUGFzc2l2ZScgaXMgb25seSB0cnVlIGlmIGEgYnJvd3NlciBhbHNvIHN1cHBvcnRzIHRvdWNoLWFjdGlvbjogbm9uZSBpbiBDU1MuXG4gICAgICAgICAgICAvLyBpT1Mgc2FmYXJpIGRvZXMgbm90LCBzbyBpdCBkb2Vzbid0IGdldCB0byBiZW5lZml0IGZyb20gcGFzc2l2ZSBzY3JvbGxpbmcuIGlPUyBkb2VzIHN1cHBvcnRcbiAgICAgICAgICAgIC8vIHRvdWNoLWFjdGlvbjogbWFuaXB1bGF0aW9uLCBidXQgdGhhdCBhbGxvd3MgcGFubmluZywgd2hpY2ggYnJlYWtzXG4gICAgICAgICAgICAvLyBzbGlkZXJzIGFmdGVyIHpvb21pbmcvb24gbm9uLXJlc3BvbnNpdmUgcGFnZXMuXG4gICAgICAgICAgICAvLyBTZWU6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzMxMTJcbiAgICAgICAgICAgIGlmICghc3VwcG9ydHNQYXNzaXZlKSB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZS5jYWxjUG9pbnQgPSBlLnBvaW50c1tvcHRpb25zLm9ydF07XG4gICAgICAgICAgICAvLyBDYWxsIHRoZSBldmVudCBoYW5kbGVyIHdpdGggdGhlIGV2ZW50IFsgYW5kIGFkZGl0aW9uYWwgZGF0YSBdLlxuICAgICAgICAgICAgY2FsbGJhY2soZSwgZGF0YSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH07XG4gICAgICAgIHZhciBtZXRob2RzID0gW107XG4gICAgICAgIC8vIEJpbmQgYSBjbG9zdXJlIG9uIHRoZSB0YXJnZXQgZm9yIGV2ZXJ5IGV2ZW50IHR5cGUuXG4gICAgICAgIGV2ZW50cy5zcGxpdChcIiBcIikuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnROYW1lKSB7XG4gICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBtZXRob2QsIHN1cHBvcnRzUGFzc2l2ZSA/IHsgcGFzc2l2ZTogdHJ1ZSB9IDogZmFsc2UpO1xuICAgICAgICAgICAgbWV0aG9kcy5wdXNoKFtldmVudE5hbWUsIG1ldGhvZF0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG1ldGhvZHM7XG4gICAgfVxuICAgIC8vIFByb3ZpZGUgYSBjbGVhbiBldmVudCB3aXRoIHN0YW5kYXJkaXplZCBvZmZzZXQgdmFsdWVzLlxuICAgIGZ1bmN0aW9uIGZpeEV2ZW50KGUsIHBhZ2VPZmZzZXQsIGV2ZW50VGFyZ2V0KSB7XG4gICAgICAgIC8vIEZpbHRlciB0aGUgZXZlbnQgdG8gcmVnaXN0ZXIgdGhlIHR5cGUsIHdoaWNoIGNhbiBiZVxuICAgICAgICAvLyB0b3VjaCwgbW91c2Ugb3IgcG9pbnRlci4gT2Zmc2V0IGNoYW5nZXMgbmVlZCB0byBiZVxuICAgICAgICAvLyBtYWRlIG9uIGFuIGV2ZW50IHNwZWNpZmljIGJhc2lzLlxuICAgICAgICB2Y
10072XIgdG91Y2ggPSBlLnR5cGUuaW5kZXhPZihcInRvdWNoXCIpID09PSAwO1xuICAgICAgICB2YXIgbW91c2UgPSBlLnR5cGUuaW5kZXhPZihcIm1vdXNlXCIpID09PSAwO1xuICAgICAgICB2YXIgcG9pbnRlciA9IGUudHlwZS5pbmRleE9mKFwicG9pbnRlclwiKSA9PT0gMDtcbiAgICAgICAgdmFyIHggPSAwO1xuICAgICAgICB2YXIgeSA9IDA7XG4gICAgICAgIC8vIElFMTAgaW1wbGVtZW50ZWQgcG9pbnRlciBldmVudHMgd2l0aCBhIHByZWZpeDtcbiAgICAgICAgaWYgKGUudHlwZS5pbmRleE9mKFwiTVNQb2ludGVyXCIpID09PSAwKSB7XG4gICAgICAgICAgICBwb2ludGVyID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBFcnJvbmVvdXMgZXZlbnRzIHNlZW0gdG8gYmUgcGFzc2VkIGluIG9jY2FzaW9uYWxseSBvbiBpT1MvaVBhZE9TIGFmdGVyIHVzZXIgZmluaXNoZXMgaW50ZXJhY3Rpbmcgd2l0aFxuICAgICAgICAvLyB0aGUgc2xpZGVyLiBUaGV5IGFwcGVhciB0byBiZSBvZiB0eXBlIE1vdXNlRXZlbnQsIHlldCB0aGV5IGRvbid0IGhhdmUgdXN1YWwgcHJvcGVydGllcyBzZXQuIElnbm9yZVxuICAgICAgICAvLyBldmVudHMgdGhhdCBoYXZlIG5vIHRvdWNoZXMgb3IgYnV0dG9ucyBhc3NvY2lhdGVkIHdpdGggdGhlbS4gKCMxMDU3LCAjMTA3OSwgIzEwOTUpXG4gICAgICAgIGlmIChlLnR5cGUgPT09IFwibW91c2Vkb3duXCIgJiYgIWUuYnV0dG9ucyAmJiAhZS50b3VjaGVzKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIG9ubHkgdGhpbmcgb25lIGhhbmRsZSBzaG91bGQgYmUgY29uY2VybmVkIGFib3V0IGlzIHRoZSB0b3VjaGVzIHRoYXQgb3JpZ2luYXRlZCBvbiB0b3Agb2YgaXQuXG4gICAgICAgIGlmICh0b3VjaCkge1xuICAgICAgICAgICAgLy8gUmV0dXJucyB0cnVlIGlmIGEgdG91Y2ggb3JpZ2luYXRlZCBvbiB0aGUgdGFyZ2V0LlxuICAgICAgICAgICAgdmFyIGlzVG91Y2hPblRhcmdldCA9IGZ1bmN0aW9uIChjaGVja1RvdWNoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IGNoZWNrVG91Y2gudGFyZ2V0O1xuICAgICAgICAgICAgICAgIHJldHVybiAodGFyZ2V0ID09PSBldmVudFRhcmdldCB8fFxuICAgICAgICAgICAgICAgICAgICBldmVudFRhcmdldC5jb250YWlucyh0YXJnZXQpIHx8XG4gICAgICAgICAgICAgICAgICAgIChlLmNvbXBvc2VkICYmIGUuY29tcG9zZWRQYXRoKCkuc2hpZnQoKSA9PT0gZXZlbnRUYXJnZXQpKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBvZiB0b3VjaHN0YXJ0IGV2ZW50cywgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlcmUgaXMgc3RpbGwgbm8gbW9yZSB0aGFuIG9uZVxuICAgICAgICAgICAgLy8gdG91Y2ggb24gdGhlIHRhcmdldCBzbyB3ZSBsb29rIGFtb25nc3QgYWxsIHRvdWNoZXMuXG4gICAgICAgICAgICBpZiAoZS50eXBlID09PSBcInRvdWNoc3RhcnRcIikge1xuICAgICAgICAgICAgICAgIHZhciB0YXJnZXRUb3VjaGVzID0gQXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKGUudG91Y2hlcywgaXNUb3VjaE9uVGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAvLyBEbyBub3Qgc3VwcG9ydCBtb3JlIHRoYW4gb25lIHRvdWNoIHBlciBoYW5kbGUuXG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldFRvdWNoZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHggPSB0YXJnZXRUb3VjaGVzWzBdLnBhZ2VYO1xuICAgICAgICAgICAgICAgIHkgPSB0YXJnZXRUb3VjaGVzWzBdLnBhZ2VZO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSW4gdGhlIG90aGVyIGNhc2VzLCBmaW5kIG9uIGNoYW5nZWRUb3VjaGVzIGlzIGVub3VnaC5cbiAgICAgICAgICAgICAgICB2Y
10072XIgdGFyZ2V0VG91Y2ggPSBBcnJheS5wcm90b3R5cGUuZmluZC5jYWxsKGUuY2hhbmdlZFRvdWNoZXMsIGlzVG91Y2hPblRhcmdldCk7XG4gICAgICAgICAgICAgICAgLy8gQ2FuY2VsIGlmIHRoZSB0YXJnZXQgdG91Y2ggaGFzIG5vdCBtb3ZlZC5cbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldFRvdWNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgeCA9IHRhcmdldFRvdWNoLnBhZ2VYO1xuICAgICAgICAgICAgICAgIHkgPSB0YXJnZXRUb3VjaC5wYWdlWTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwYWdlT2Zmc2V0ID0gcGFnZU9mZnNldCB8fCBnZXRQYWdlT2Zmc2V0KHNjb3BlX0RvY3VtZW50KTtcbiAgICAgICAgaWYgKG1vdXNlIHx8IHBvaW50ZXIpIHtcbiAgICAgICAgICAgIHggPSBlLmNsaWVudFggKyBwYWdlT2Zmc2V0Lng7XG4gICAgICAgICAgICB5ID0gZS5jbGllbnRZICsgcGFnZU9mZnNldC55O1xuICAgICAgICB9XG4gICAgICAgIGUucGFnZU9mZnNldCA9IHBhZ2VPZmZzZXQ7XG4gICAgICAgIGUucG9pbnRzID0gW3gsIHldO1xuICAgICAgICBlLmN1cnNvciA9IG1vdXNlIHx8IHBvaW50ZXI7IC8vIEZpeCAjNDM1XG4gICAgICAgIHJldHVybiBlO1xuICAgIH1cbiAgICAvLyBUcmFuc2xhdGUgYSBjb29yZGluYXRlIGluIHRoZSBkb2N1bWVudCB0byBhIHBlcmNlbnRhZ2Ugb24gdGhlIHNsaWRlclxuICAgIGZ1bmN0aW9uIGNhbGNQb2ludFRvUGVyY2VudGFnZShjYWxjUG9pbnQpIHtcbiAgICAgICAgdmFyIGxvY2F0aW9uID0gY2FsY1BvaW50IC0gb2Zmc2V0KHNjb3BlX0Jhc2UsIG9wdGlvbnMub3J0KTtcbiAgICAgICAgdmFyIHByb3Bvc2FsID0gKGxvY2F0aW9uICogMTAwKSAvIGJhc2VTaXplKCk7XG4gICAgICAgIC8vIENsYW1wIHByb3Bvc2FsIGJldHdlZW4gMCUgYW5kIDEwMCVcbiAgICAgICAgLy8gT3V0LW9mLWJvdW5kIGNvb3JkaW5hdGVzIG1heSBvY2N1ciB3aGVuIC5ub1VpLWJhc2UgcHNldWRvLWVsZW1lbnRzXG4gICAgICAgIC8vIGFyZSB1c2VkIChlLmcuIGNvbnRhaW5lZCBoYW5kbGVzIGZlYXR1cmUpXG4gICAgICAgIHByb3Bvc2FsID0gbGltaXQocHJvcG9zYWwpO1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5kaXIgPyAxMDAgLSBwcm9wb3NhbCA6IHByb3Bvc2FsO1xuICAgIH1cbiAgICAvLyBGaW5kIGhhbmRsZSBjbG9zZXN0IHRvIGEgY2VydGFpbiBwZXJjZW50YWdlIG9uIHRoZSBzbGlkZXJcbiAgICBmdW5jdGlvbiBnZXRDbG9zZXN0SGFuZGxlKGNsaWNrZWRQb3NpdGlvbikge1xuICAgICAgICB2Y
10072XIgc21hbGxlc3REaWZmZXJlbmNlID0gMTAwO1xuICAgICAgICB2YXIgaGFuZGxlTnVtYmVyID0gZmFsc2U7XG4gICAgICAgIHNjb3BlX0hhbmRsZXMuZm9yRWFjaChmdW5jdGlvbiAoaGFuZGxlLCBpbmRleCkge1xuICAgICAgICAgICAgLy8gRGlzYWJsZWQgaGFuZGxlcyBhcmUgaWdub3JlZFxuICAgICAgICAgICAgaWYgKGlzSGFuZGxlRGlzYWJsZWQoaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGhhbmRsZVBvc2l0aW9uID0gc2NvcGVfTG9jYXRpb25zW2luZGV4XTtcbiAgICAgICAgICAgIHZhciBkaWZmZXJlbmNlV2l0aFRoaXNIYW5kbGUgPSBNYXRoLmFicyhoYW5kbGVQb3NpdGlvbiAtIGNsaWNrZWRQb3NpdGlvbik7XG4gICAgICAgICAgICAvLyBJbml0aWFsIHN0YXRlXG4gICAgICAgICAgICB2YXIgY2xpY2tBdEVkZ2UgPSBkaWZmZXJlbmNlV2l0aFRoaXNIYW5kbGUgPT09IDEwMCAmJiBzbWFsbGVzdERpZmZlcmVuY2UgPT09IDEwMDtcbiAgICAgICAgICAgIC8vIERpZmZlcmVuY2Ugd2l0aCB0aGlzIGhhbmRsZSBpcyBzbWFsbGVyIHRoYW4gdGhlIHByZXZpb3VzbHkgY2hlY2tlZCBoYW5kbGVcbiAgICAgICAgICAgIHZhciBpc0Nsb3NlciA9IGRpZmZlcmVuY2VXaXRoVGhpc0hhbmRsZSA8IHNtYWxsZXN0RGlmZmVyZW5jZTtcbiAgICAgICAgICAgIHZhciBpc0Nsb3NlckFmdGVyID0gZGlmZmVyZW5jZVdpdGhUaGlzSGFuZGxlIDw9IHNtYWxsZXN0RGlmZmVyZW5jZSAmJiBjbGlja2VkUG9zaXRpb24gPiBoYW5kbGVQb3NpdGlvbjtcbiAgICAgICAgICAgIGlmIChpc0Nsb3NlciB8fCBpc0Nsb3NlckFmdGVyIHx8IGNsaWNrQXRFZGdlKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlTnVtYmVyID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgc21hbGxlc3REaWZmZXJlbmNlID0gZGlmZmVyZW5jZVdpdGhUaGlzSGFuZGxlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGhhbmRsZU51bWJlcjtcbiAgICB9XG4gICAgLy8gRmlyZSAnZW5kJyB3aGVuIGEgbW91c2Ugb3IgcGVuIGxlYXZlcyB0aGUgZG9jdW1lbnQuXG4gICAgZnVuY3Rpb24gZG9jdW1lbnRMZWF2ZShldmVudCwgZGF0YSkge1xuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gXCJtb3VzZW91dFwiICYmXG4gICAgICAgICAgICBldmVudC50YXJnZXQubm9kZU5hbWUgPT09IFwiSFRNTFwiICYmXG4gICAgICAgICAgICBldmVudC5yZWxhdGVkVGFyZ2V0ID09PSBudWxsKSB7XG4gICAgICAgICAgICBldmVudEVuZChldmVudCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gSGFuZGxlIG1vdmVtZW50IG9uIGRvY3VtZW50IGZvciBoYW5kbGUgYW5kIHJhbmdlIGRyYWcuXG4gICAgZnVuY3Rpb24gZXZlbnRNb3ZlKGV2ZW50LCBkYXRhKSB7XG4gICAgICAgIC8vIEZpeCAjNDk4XG4gICAgICAgIC8vIENoZWNrIHZhbHVlIG9mIC5idXR0b25zIGluICdzdGFydCcgdG8gd29yayBhcm91bmQgYSBidWcgaW4gSUUxMCBtb2JpbGUgKGRhdGEuYnV0dG9uc1Byb3BlcnR5KS5cbiAgICAgICAgLy8gaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vSUUvZmVlZGJhY2svZGV0YWlscy85MjcwMDUvbW9iaWxlLWllMTAtd2luZG93cy1waG9uZS1idXR0b25zLXByb3BlcnR5LW9mLXBvaW50ZXJtb3ZlLWV2ZW50LWFsd2F5cy16ZXJvXG4gICAgICAgIC8vIElFOSBoYXMgLmJ1dHRvbnMgYW5kIC53aGljaCB6ZXJvIG9uIG1vdXNlbW92ZS5cbiAgICAgICAgLy8gRmlyZWZveCBicmVha3MgdGhlIHNwZWMgTUROIGRlZmluZXMuXG4gICAgICAgIGlmIChuYXZpZ2F0b3IuYXBwVmVyc2lvbi5pbmRleE9mKFwiTVNJRSA5XCIpID09PSAtMSAmJiBldmVudC5idXR0b25zID09PSAwICYmIGRhdGEuYnV0dG9uc1Byb3BlcnR5ICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZXZlbnRFbmQoZXZlbnQsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrIGlmIHdlIGFyZSBtb3ZpbmcgdXAgb3IgZG93blxuICAgICAgICB2Y
10072XIgbW92ZW1lbnQgPSAob3B0aW9ucy5kaXIgPyAtMSA6IDEpICogKGV2ZW50LmNhbGNQb2ludCAtIGRhdGEuc3RhcnRDYWxjUG9pbnQpO1xuICAgICAgICAvLyBDb252ZXJ0IHRoZSBtb3ZlbWVudCBpbnRvIGEgcGVyY2VudGFnZSBvZiB0aGUgc2xpZGVyIHdpZHRoL2hlaWdodFxuICAgICAgICB2YXIgcHJvcG9zYWwgPSAobW92ZW1lbnQgKiAxMDApIC8gZGF0YS5iYXNlU2l6ZTtcbiAgICAgICAgbW92ZUhhbmRsZXMobW92ZW1lbnQgPiAwLCBwcm9wb3NhbCwgZGF0YS5sb2NhdGlvbnMsIGRhdGEuaGFuZGxlTnVtYmVycywgZGF0YS5jb25uZWN0KTtcbiAgICB9XG4gICAgLy8gVW5iaW5kIG1vdmUgZXZlbnRzIG9uIGRvY3VtZW50LCBjYWxsIGNhbGxiYWNrcy5cbiAgICBmdW5jdGlvbiBldmVudEVuZChldmVudCwgZGF0YSkge1xuICAgICAgICAvLyBUaGUgaGFuZGxlIGlzIG5vIGxvbmdlciBhY3RpdmUsIHNvIHJlbW92ZSB0aGUgY2xhc3MuXG4gICAgICAgIGlmIChkYXRhLmhhbmRsZSkge1xuICAgICAgICAgICAgcmVtb3ZlQ2xhc3MoZGF0YS5oYW5kbGUsIG9wdGlvbnMuY3NzQ2xhc3Nlcy5hY3RpdmUpO1xuICAgICAgICAgICAgc2NvcGVfQWN0aXZlSGFuZGxlc0NvdW50IC09IDE7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVW5iaW5kIHRoZSBtb3ZlIGFuZCBlbmQgZXZlbnRzLCB3aGljaCBhcmUgYWRkZWQgb24gJ3N0YXJ0Jy5cbiAgICAgICAgZGF0YS5saXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAoYykge1xuICAgICAgICAgICAgc2NvcGVfRG9jdW1lbnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoY1swXSwgY1sxXSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoc2NvcGVfQWN0aXZlSGFuZGxlc0NvdW50ID09PSAwKSB7XG4gICAgICAgICAgICAvLyBSZW1vdmUgZHJhZ2dpbmcgY2xhc3MuXG4gICAgICAgICAgICByZW1vdmVDbGFzcyhzY29wZV9UYXJnZXQsIG9wdGlvbnMuY3NzQ2xhc3Nlcy5kcmFnKTtcbiAgICAgICAgICAgIHNldFppbmRleCgpO1xuICAgICAgICAgICAgLy8gUmVtb3ZlIGN1cnNvciBzdHlsZXMgYW5kIHRleHQtc2VsZWN0aW9uIGV2ZW50cyBib3VuZCB0byB0aGUgYm9keS5cbiAgICAgICAgICAgIGlmIChldmVudC5jdXJzb3IpIHtcbiAgICAgICAgICAgICAgICBzY29wZV9Cb2R5LnN0eWxlLmN1cnNvciA9IFwiXCI7XG4gICAgICAgICAgICAgICAgc2NvcGVfQm9keS5yZW1vdmVFdmVudExpc3RlbmVyKFwic2VsZWN0c3RhcnRcIiwgcHJldmVudERlZmF1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmV2ZW50cy5zbW9vdGhTdGVwcykge1xuICAgICAgICAgICAgZGF0YS5oYW5kbGVOdW1iZXJzLmZvckVhY2goZnVuY3Rpb24gKGhhbmRsZU51bWJlcikge1xuICAgICAgICAgICAgICAgIHNldEhhbmRsZShoYW5kbGVOdW1iZXIsIHNjb3BlX0xvY2F0aW9uc1toYW5kbGVOdW1iZXJdLCB0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkYXRhLmhhbmRsZU51bWJlcnMuZm9yRWFjaChmdW5jdGlvbiAoaGFuZGxlTnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgZmlyZUV2ZW50KFwidXBkYXRlXCIsIGhhbmRsZU51bWJlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBkYXRhLmhhbmRsZU51bWJlcnMuZm9yRWFjaChmdW5jdGlvbiAoaGFuZGxlTnVtYmVyKSB7XG4gICAgICAgICAgICBmaXJlRXZlbnQoXCJjaGFuZ2VcIiwgaGFuZGxlTnVtYmVyKTtcbiAgICAgICAgICAgIGZpcmVFdmVudChcInNldFwiLCBoYW5kbGVOdW1iZXIpO1xuICAgICAgICAgICAgZmlyZUV2ZW50KFwiZW5kXCIsIGhhbmRsZU51bWJlcik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBCaW5kIG1vdmUgZXZlbnRzIG9uIGRvY3VtZW50LlxuICAgIGZ1bmN0aW9uIGV2ZW50U3RhcnQoZXZlbnQsIGRhdGEpIHtcbiAgICAgICAgLy8gSWdub3JlIGV2ZW50IGlmIGFueSBoYW5kbGUgaXMgZGlzYWJsZWRcbiAgICAgICAgaWYgKGRhdGEuaGFuZGxlTnVtYmVycy5zb21lKGlzSGFuZGxlRGlzYWJsZWQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGhhbmRsZTtcbiAgICAgICAgaWYgKGRhdGEuaGFuZGxlTnVtYmVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHZhciBoYW5kbGVPcmlnaW4gPSBzY29wZV9IYW5kbGVzW2RhdGEuaGFuZGxlTnVtYmVyc1swXV07XG4gICAgICAgICAgICBoYW5kbGUgPSBoYW5kbGVPcmlnaW4uY2hpbGRyZW5bMF07XG4gICAgICAgICAgICBzY29wZV9BY3RpdmVIYW5kbGVzQ291bnQgKz0gMTtcbiAgICAgICAgICAgIC8vIE1hcmsgdGhlIGhhbmRsZSBhcyAnYWN0aXZlJyBzbyBpdCBjYW4gYmUgc3R5bGVkLlxuICAgICAgICAgICAgYWRkQ2xhc3MoaGFuZGxlLCBvcHRpb25zLmNzc0NsYXNzZXMuYWN0aXZlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBIGRyYWcgc2hvdWxkIG5ldmVyIHByb3BhZ2F0ZSB1cCB0byB0aGUgJ3RhcCcgZXZlbnQuXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAvLyBSZWNvcmQgdGhlIGV2ZW50IGxpc3RlbmVycy5cbiAgICAgICAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICAgICAgICAvLyBBdHRhY2ggdGhlIG1vdmUgYW5kIGVuZCBldmVudHMuXG4gICAgICAgIHZhciBtb3ZlRXZlbnQgPSBhdHRhY2hFdmVudChhY3Rpb25zLm1vdmUsIHNjb3BlX0RvY3VtZW50RWxlbWVudCwgZXZlbnRNb3ZlLCB7XG4gICAgICAgICAgICAvLyBUaGUgZXZlbnQgdGFyZ2V0IGhhcyBjaGFuZ2VkIHNvIHdlIG5lZWQgdG8gcHJvcGFnYXRlIHRoZSBvcmlnaW5hbCBvbmUgc28gdGhhdCB3ZSBrZWVwXG4gICAgICAgICAgICAvLyByZWx5aW5nIG9uIGl0IHRvIGV4dHJhY3QgdGFyZ2V0IHRvdWNoZXMuXG4gICAgICAgICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcbiAgICAgICAgICAgIGhhbmRsZTogaGFuZGxlLFxuICAgICAgICAgICAgY29ubmVjdDogZGF0YS5jb25uZWN0LFxuICAgICAgICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcnMsXG4gICAgICAgICAgICBzdGFydENhbGNQb2ludDogZXZlbnQuY2FsY1BvaW50LFxuICAgICAgICAgICAgYmFzZVNpemU6IGJhc2VTaXplKCksXG4gICAgICAgICAgICBwYWdlT2Zmc2V0OiBldmVudC5wYWdlT2Zmc2V0LFxuICAgICAgICAgICAgaGFuZGxlTnVtYmVyczogZGF0YS5oYW5kbGVOdW1iZXJzLFxuICAgICAgICAgICAgYnV0dG9uc1Byb3BlcnR5OiBldmVudC5idXR0b25zLFxuICAgICAgICAgICAgbG9jYXRpb25zOiBzY29wZV9Mb2NhdGlvbnMuc2xpY2UoKSxcbiAgICAgICAgfSk7XG4gICAgICAgI
10072HZhciBlbmRFdmVudCA9IGF0dGFjaEV2ZW50KGFjdGlvbnMuZW5kLCBzY29wZV9Eb2N1bWVudEVsZW1lbnQsIGV2ZW50RW5kLCB7XG4gICAgICAgICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcbiAgICAgICAgICAgIGhhbmRsZTogaGFuZGxlLFxuICAgICAgICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcnMsXG4gICAgICAgICAgICBkb05vdFJlamVjdDogdHJ1ZSxcbiAgICAgICAgICAgIGhhbmRsZU51bWJlcnM6IGRhdGEuaGFuZGxlTnVtYmVycyxcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBvdXRFdmVudCA9IGF0dGFjaEV2ZW50KFwibW91c2VvdXRcIiwgc2NvcGVfRG9jdW1lbnRFbGVtZW50LCBkb2N1bWVudExlYXZlLCB7XG4gICAgICAgICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcbiAgICAgICAgICAgIGhhbmRsZTogaGFuZGxlLFxuICAgICAgICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcnMsXG4gICAgICAgICAgICBkb05vdFJlamVjdDogdHJ1ZSxcbiAgICAgICAgICAgIGhhbmRsZU51bWJlcnM6IGRhdGEuaGFuZGxlTnVtYmVycyxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFdlIHdhbnQgdG8gbWFrZSBzdXJlIHdlIHB1c2hlZCB0aGUgbGlzdGVuZXJzIGluIHRoZSBsaXN0ZW5lciBsaXN0IHJhdGhlciB0aGFuIGNyZWF0aW5nXG4gICAgICAgIC8vIGEgbmV3IG9uZSBhcyBpdCBoYXMgYWxyZWFkeSBiZWVuIHBhc3NlZCB0byB0aGUgZXZlbnQgaGFuZGxlcnMuXG4gICAgICAgIGxpc3RlbmVycy5wdXNoLmFwcGx5KGxpc3RlbmVycywgbW92ZUV2ZW50LmNvbmNhdChlbmRFdmVudCwgb3V0RXZlbnQpKTtcbiAgICAgICAgLy8gVGV4dCBzZWxlY3Rpb24gaXNuJ3QgYW4gaXNzdWUgb24gdG91Y2ggZGV2aWNlcyxcbiAgICAgICAgLy8gc28gYWRkaW5nIGN1cnNvciBzdHlsZXMgY2FuIGJlIHNraXBwZWQuXG4gICAgICAgIGlmIChldmVudC5jdXJzb3IpIHtcbiAgICAgICAgICAgIC8vIFByZXZlbnQgdGhlICdJJyBjdXJzb3IgYW5kIGV4dGVuZCB0aGUgcmFuZ2UtZHJhZyBjdXJzb3IuXG4gICAgICAgICAgICBzY29wZV9Cb2R5LnN0eWxlLmN1cnNvciA9IGdldENvbXB1dGVkU3R5bGUoZXZlbnQudGFyZ2V0KS5jdXJzb3I7XG4gICAgICAgICAgICAvLyBNYXJrIHRoZSB0YXJnZXQgd2l0aCBhIGRyYWdnaW5nIHN0YXRlLlxuICAgICAgICAgICAgaWYgKHNjb3BlX0hhbmRsZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIGFkZENsYXNzKHNjb3BlX1RhcmdldCwgb3B0aW9ucy5jc3NDbGFzc2VzLmRyYWcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUHJldmVudCB0ZXh0IHNlbGVjdGlvbiB3aGVuIGRyYWdnaW5nIHRoZSBoYW5kbGVzLlxuICAgICAgICAgICAgLy8gSW4gbm9VaVNsaWRlciA8PSA5LjIuMCwgdGhpcyB3YXMgaGFuZGxlZCBieSBjYWxsaW5nIHByZXZlbnREZWZhdWx0IG9uIG1vdXNlL3RvdWNoIHN0YXJ0L21vdmUsXG4gICAgICAgICAgICAvLyB3aGljaCBpcyBzY3JvbGwgYmxvY2tpbmcuIFRoZSBzZWxlY3RzdGFydCBldmVudCBpcyBzdXBwb3J0ZWQgYnkgRmlyZUZveCBzdGFydGluZyBmcm9tIHZlcnNpb24gNTIsXG4gICAgICAgICAgICAvLyBtZWFuaW5nIHRoZSBvbmx5IGhvbGRvdXQgaXMgaU9TIFNhZmFyaS4gVGhpcyBkb2Vzbid0IG1hdHRlcjogdGV4dCBzZWxlY3Rpb24gaXNuJ3QgdHJpZ2dlcmVkIHRoZXJlLlxuICAgICAgICAgICAgLy8gVGhlICdjdXJzb3InIGZsYWcgaXMgZmFsc2UuXG4gICAgICAgICAgICAvLyBTZWU6IGh0dHA6Ly9jYW5pdXNlLmNvbS8jc2VhcmNoPXNlbGVjdHN0YXJ0XG4gICAgICAgICAgICBzY29wZV9Cb2R5LmFkZEV2ZW50TGlzdGVuZXIoXCJzZWxlY3RzdGFydFwiLCBwcmV2ZW50RGVmYXVsdCwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGRhdGEuaGFuZGxlTnVtYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChoYW5kbGVOdW1iZXIpIHtcbiAgICAgICAgICAgIGZpcmVFdmVudChcInN0YXJ0XCIsIGhhbmRsZU51bWJlcik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBNb3ZlIGNsb3Nlc3QgaGFuZGxlIHRvIHRhcHBlZCBsb2NhdGlvbi5cbiAgICBmdW5jdGlvbiBldmVudFRhcChldmVudCkge1xuICAgICAgICAvLyBUaGUgdGFwIGV2ZW50IHNob3VsZG4ndCBwcm9wYWdhdGUgdXBcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHZhciBwcm9wb3NhbCA9IGNhbGNQb2ludFRvUGVyY2VudGFnZShldmVudC5jYWxjUG9pbnQpO1xuICAgICAgICB2Y
10072XIgaGFuZGxlTnVtYmVyID0gZ2V0Q2xvc2VzdEhhbmRsZShwcm9wb3NhbCk7XG4gICAgICAgIC8vIFRhY2tsZSB0aGUgY2FzZSB0aGF0IGFsbCBoYW5kbGVzIGFyZSAnZGlzYWJsZWQnLlxuICAgICAgICBpZiAoaGFuZGxlTnVtYmVyID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZsYWcgdGhlIHNsaWRlciBhcyBpdCBpcyBub3cgaW4gYSB0cmFuc2l0aW9uYWwgc3RhdGUuXG4gICAgICAgIC8vIFRyYW5zaXRpb24gdGFrZXMgYSBjb25maWd1cmFibGUgYW1vdW50IG9mIG1zIChkZWZhdWx0IDMwMCkuIFJlLWVuYWJsZSB0aGUgc2xpZGVyIGFmdGVyIHRoYXQuXG4gICAgICAgIGlmICghb3B0aW9ucy5ldmVudHMuc25hcCkge1xuICAgICAgICAgICAgYWRkQ2xhc3NGb3Ioc2NvcGVfVGFyZ2V0LCBvcHRpb25zLmNzc0NsYXNzZXMudGFwLCBvcHRpb25zLmFuaW1hdGlvbkR1cmF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRIYW5kbGUoaGFuZGxlTnVtYmVyLCBwcm9wb3NhbCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHNldFppbmRleCgpO1xuICAgICAgICBmaXJlRXZlbnQoXCJzbGlkZVwiLCBoYW5kbGVOdW1iZXIsIHRydWUpO1xuICAgICAgICBmaXJlRXZlbnQoXCJ1cGRhdGVcIiwgaGFuZGxlTnVtYmVyLCB0cnVlKTtcbiAgICAgICAgaWYgKCFvcHRpb25zLmV2ZW50cy5zbmFwKSB7XG4gICAgICAgICAgICBmaXJlRXZlbnQoXCJjaGFuZ2VcIiwgaGFuZGxlTnVtYmVyLCB0cnVlKTtcbiAgICAgICAgICAgIGZpcmVFdmVudChcInNldFwiLCBoYW5kbGVOdW1iZXIsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZXZlbnRTdGFydChldmVudCwgeyBoYW5kbGVOdW1iZXJzOiBbaGFuZGxlTnVtYmVyXSB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBGaXJlcyBhICdob3ZlcicgZXZlbnQgZm9yIGEgaG92ZXJlZCBtb3VzZS9wZW4gcG9zaXRpb24uXG4gICAgZnVuY3Rpb24gZXZlbnRIb3ZlcihldmVudCkge1xuICAgICAgICB2Y
10072XIgcHJvcG9zYWwgPSBjYWxjUG9pbnRUb1BlcmNlbnRhZ2UoZXZlbnQuY2FsY1BvaW50KTtcbiAgICAgICAgdmFyIHRvID0gc2NvcGVfU3BlY3RydW0uZ2V0U3RlcChwcm9wb3NhbCk7XG4gICAgICAgIHZhciB2YWx1ZSA9IHNjb3BlX1NwZWN0cnVtLmZyb21TdGVwcGluZyh0byk7XG4gICAgICAgIE9iamVjdC5rZXlzKHNjb3BlX0V2ZW50cykuZm9yRWFjaChmdW5jdGlvbiAodGFyZ2V0RXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChcImhvdmVyXCIgPT09IHRhcmdldEV2ZW50LnNwbGl0KFwiLlwiKVswXSkge1xuICAgICAgICAgICAgICAgIHNjb3BlX0V2ZW50c1t0YXJnZXRFdmVudF0uZm9yRWFjaChmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbChzY29wZV9TZWxmLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBIYW5kbGVzIGtleWRvd24gb24gZm9jdXNlZCBoYW5kbGVzXG4gICAgLy8gRG9uJ3QgbW92ZSB0aGUgZG9jdW1lbnQgd2hlbiBwcmVzc2luZyBhcnJvdyBrZXlzIG9uIGZvY3VzZWQgaGFuZGxlc1xuICAgIGZ1bmN0aW9uIGV2ZW50S2V5ZG93bihldmVudCwgaGFuZGxlTnVtYmVyKSB7XG4gICAgICAgIGlmIChpc1NsaWRlckRpc2FibGVkKCkgfHwgaXNIYW5kbGVEaXNhYmxlZChoYW5kbGVOdW1iZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGhvcml6b250YWxLZXlzID0gW1wiTGVmdFwiLCBcIlJpZ2h0XCJdO1xuICAgICAgICB2Y
10072XIgdmVydGljYWxLZXlzID0gW1wiRG93blwiLCBcIlVwXCJdO1xuICAgICAgICB2YXIgbGFyZ2VTdGVwS2V5cyA9IFtcIlBhZ2VEb3duXCIsIFwiUGFnZVVwXCJdO1xuICAgICAgICB2YXIgZWRnZUtleXMgPSBbXCJIb21lXCIsIFwiRW5kXCJdO1xuICAgICAgICBpZiAob3B0aW9ucy5kaXIgJiYgIW9wdGlvbnMub3J0KSB7XG4gICAgICAgICAgICAvLyBPbiBhbiByaWdodC10by1sZWZ0IHNsaWRlciwgdGhlIGxlZnQgYW5kIHJpZ2h0IGtleXMgYWN0IGludmVydGVkXG4gICAgICAgICAgICBob3Jpem9udGFsS2V5cy5yZXZlcnNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5vcnQgJiYgIW9wdGlvbnMuZGlyKSB7XG4gICAgICAgICAgICAvLyBPbiBhIHRvcC10by1ib3R0b20gc2xpZGVyLCB0aGUgdXAgYW5kIGRvd24ga2V5cyBhY3QgaW52ZXJ0ZWRcbiAgICAgICAgICAgIHZlcnRpY2FsS2V5cy5yZXZlcnNlKCk7XG4gICAgICAgICAgICBsYXJnZVN0ZXBLZXlzLnJldmVyc2UoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTdHJpcCBcIkFycm93XCIgZm9yIElFIGNvbXBhdGliaWxpdHkuIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50L2tleVxuICAgICAgICB2YXIga2V5ID0gZXZlbnQua2V5LnJlcGxhY2UoXCJBcnJvd1wiLCBcIlwiKTtcbiAgICAgICAgdmFyIGlzTGFyZ2VEb3duID0ga2V5ID09PSBsYXJnZVN0ZXBLZXlzWzBdO1xuICAgICAgICB2YXIgaXNMYXJnZVVwID0ga2V5ID09PSBsYXJnZVN0ZXBLZXlzWzFdO1xuICAgICAgICB2Y
10072XIgaXNEb3duID0ga2V5ID09PSB2ZXJ0aWNhbEtleXNbMF0gfHwga2V5ID09PSBob3Jpem9udGFsS2V5c1swXSB8fCBpc0xhcmdlRG93bjtcbiAgICAgICAgdmFyIGlzVXAgPSBrZXkgPT09IHZlcnRpY2FsS2V5c1sxXSB8fCBrZXkgPT09IGhvcml6b250YWxLZXlzWzFdIHx8IGlzTGFyZ2VVcDtcbiAgICAgICAgdmFyIGlzTWluID0ga2V5ID09PSBlZGdlS2V5c1swXTtcbiAgICAgICAgdmFyIGlzTWF4ID0ga2V5ID09PSBlZGdlS2V5c1sxXTtcbiAgICAgICAgaWYgKCFpc0Rvd24gJiYgIWlzVXAgJiYgIWlzTWluICYmICFpc01heCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdmFyIHRvO1xuICAgICAgICBpZiAoaXNVcCB8fCBpc0Rvd24pIHtcbiAgICAgICAgICAgIHZhciBkaXJlY3Rpb24gPSBpc0Rvd24gPyAwIDogMTtcbiAgICAgICAgICAgIHZhciBzdGVwcyA9IGdldE5leHRTdGVwc0ZvckhhbmRsZShoYW5kbGVOdW1iZXIpO1xuICAgICAgICAgICAgdmFyIHN0ZXAgPSBzdGVwc1tkaXJlY3Rpb25dO1xuICAgICAgICAgICAgLy8gQXQgdGhlIGVkZ2Ugb2YgYSBzbGlkZXIsIGRvIG5vdGhpbmdcbiAgICAgICAgICAgIGlmIChzdGVwID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTm8gc3RlcCBzZXQsIHVzZSB0aGUgZGVmYXVsdCBvZiAxMCUgb2YgdGhlIHN1Yi1yYW5nZVxuICAgICAgICAgICAgaWYgKHN0ZXAgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgc3RlcCA9IHNjb3BlX1NwZWN0cnVtLmdldERlZmF1bHRTdGVwKHNjb3BlX0xvY2F0aW9uc1toYW5kbGVOdW1iZXJdLCBpc0Rvd24sIG9wdGlvbnMua2V5Ym9hcmREZWZhdWx0U3RlcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNMYXJnZVVwIHx8IGlzTGFyZ2VEb3duKSB7XG4gICAgICAgICAgICAgICAgc3RlcCAqPSBvcHRpb25zLmtleWJvYXJkUGFnZU11bHRpcGxpZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdGVwICo9IG9wdGlvbnMua2V5Ym9hcmRNdWx0aXBsaWVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU3RlcCBvdmVyIHplcm8tbGVuZ3RoIHJhbmdlcyAoIzk0OCk7XG4gICAgICAgICAgICBzdGVwID0gTWF0aC5tYXgoc3RlcCwgMC4wMDAwMDAxKTtcbiAgICAgICAgICAgIC8vIERlY3JlbWVudCBmb3IgZG93biBzdGVwc1xuICAgICAgICAgICAgc3RlcCA9IChpc0Rvd24gPyAtMSA6IDEpICogc3RlcDtcbiAgICAgICAgICAgIHRvID0gc2NvcGVf
10072VmFsdWVzW2hhbmRsZU51bWJlcl0gKyBzdGVwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzTWF4KSB7XG4gICAgICAgICAgICAvLyBFbmQga2V5XG4gICAgICAgICAgICB0byA9IG9wdGlvbnMuc3BlY3RydW0ueFZhbFtvcHRpb25zLnNwZWN0cnVtLnhWYWwubGVuZ3RoIC0gMV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBIb21lIGtleVxuICAgICAgICAgICAgdG8gPSBvcHRpb25zLnNwZWN0cnVtLnhWYWxbMF07XG4gICAgICAgIH1cbiAgICAgICAgc2V0SGFuZGxlKGhhbmRsZU51bWJlciwgc2NvcGVfU3BlY3RydW0udG9TdGVwcGluZyh0byksIHRydWUsIHRydWUpO1xuICAgICAgICBmaXJlRXZlbnQoXCJzbGlkZVwiLCBoYW5kbGVOdW1iZXIpO1xuICAgICAgICBmaXJlRXZlbnQoXCJ1cGRhdGVcIiwgaGFuZGxlTnVtYmVyKTtcbiAgICAgICAgZmlyZUV2ZW50KFwiY2hhbmdlXCIsIGhhbmRsZU51bWJlcik7XG4gICAgICAgIGZpcmVFdmVudChcInNldFwiLCBoYW5kbGVOdW1iZXIpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIEF0dGFjaCBldmVudHMgdG8gc2V2ZXJhbCBzbGlkZXIgcGFydHMuXG4gICAgZnVuY3Rpb24gYmluZFNsaWRlckV2ZW50cyhiZWhhdmlvdXIpIHtcbiAgICAgICAgLy8gQXR0YWNoIHRoZSBzdGFuZGFyZCBkcmFnIGV2ZW50IHRvIHRoZSBoYW5kbGVzLlxuICAgICAgICBpZiAoIWJlaGF2aW91ci5maXhlZCkge1xuICAgICAgICAgICAgc2NvcGVfSGFuZGxlcy5mb3JFYWNoKGZ1bmN0aW9uIChoYW5kbGUsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlc2UgZXZlbnRzIGFyZSBvbmx5IGJvdW5kIHRvIHRoZSB2aXN1YWwgaGFuZGxlXG4gICAgICAgICAgICAgICAgLy8gZWxlbWVudCwgbm90IHRoZSAncmVhbCcgb3JpZ2luIGVsZW1lbnQuXG4gICAgICAgICAgICAgICAgYXR0YWNoRXZlbnQoYWN0aW9ucy5zdGFydCwgaGFuZGxlLmNoaWxkcmVuWzBdLCBldmVudFN0YXJ0LCB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZU51bWJlcnM6IFtpbmRleF0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBdHRhY2ggdGhlIHRhcCBldmVudCB0byB0aGUgc2xpZGVyIGJhc2UuXG4gICAgICAgIGlmIChiZWhhdmlvdXIudGFwKSB7XG4gICAgICAgICAgICBhdHRhY2hFdmVudChhY3Rpb25zLnN0YXJ0LCBzY29wZV9CYXNlLCBldmVudFRhcCwge30pO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZpcmUgaG92ZXIgZXZlbnRzXG4gICAgICAgIGlmIChiZWhhdmlvdXIuaG92ZXIpIHtcbiAgICAgICAgICAgIGF0dGFjaEV2ZW50KGFjdGlvbnMubW92ZSwgc2NvcGVfQmFzZSwgZXZlbnRIb3Zlciwge1xuICAgICAgICAgICAgICAgIGhvdmVyOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTWFrZSB0aGUgcmFuZ2UgZHJhZ2dhYmxlLlxuICAgICAgICBpZiAoYmVoYXZpb3VyLmRyYWcpIHtcbiAgICAgICAgICAgIHNjb3BlX0Nvbm5lY3RzLmZvckVhY2goZnVuY3Rpb24gKGNvbm5lY3QsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbm5lY3QgPT09IGZhbHNlIHx8IGluZGV4ID09PSAwIHx8IGluZGV4ID09PSBzY29wZV9Db25uZWN0cy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZUJlZm9yZSA9IHNjb3BlX0hhbmRsZXNbaW5kZXggLSAxXTtcbiAgICAgICAgICAgICAgICB2Y
10072XIgaGFuZGxlQWZ0ZXIgPSBzY29wZV9IYW5kbGVzW2luZGV4XTtcbiAgICAgICAgICAgICAgICB2YXIgZXZlbnRIb2xkZXJzID0gW2Nvbm5lY3RdO1xuICAgICAgICAgICAgICAgIHZhciBoYW5kbGVzVG9EcmFnID0gW2hhbmRsZUJlZm9yZSwgaGFuZGxlQWZ0ZXJdO1xuICAgICAgICAgICAgICAgIHZhciBoYW5kbGVOdW1iZXJzVG9EcmFnID0gW2luZGV4IC0gMSwgaW5kZXhdO1xuICAgICAgICAgICAgICAgIGFkZENsYXNzKGNvbm5lY3QsIG9wdGlvbnMuY3NzQ2xhc3Nlcy5kcmFnZ2FibGUpO1xuICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIHJhbmdlIGlzIGZpeGVkLCB0aGUgZW50aXJlIHJhbmdlIGNhblxuICAgICAgICAgICAgICAgIC8vIGJlIGRyYWdnZWQgYnkgdGhlIGhhbmRsZXMuIFRoZSBoYW5kbGUgaW4gdGhlIGZpcnN0XG4gICAgICAgICAgICAgICAgLy8gb3JpZ2luIHdpbGwgcHJvcGFnYXRlIHRoZSBzdGFydCBldmVudCB1cHdhcmQsXG4gICAgICAgICAgICAgICAgLy8gYnV0IGl0IG5lZWRzIHRvIGJlIGJvdW5kIG1hbnVhbGx5IG9uIHRoZSBvdGhlci5cbiAgICAgICAgICAgICAgICBpZiAoYmVoYXZpb3VyLmZpeGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50SG9sZGVycy5wdXNoKGhhbmRsZUJlZm9yZS5jaGlsZHJlblswXSk7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50SG9sZGVycy5wdXNoKGhhbmRsZUFmdGVyLmNoaWxkcmVuWzBdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGJlaGF2aW91ci5kcmFnQWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXNUb0RyYWcgPSBzY29wZV9IYW5kbGVzO1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVOdW1iZXJzVG9EcmFnID0gc2NvcGVfSGFuZGxlTnVtYmVycztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZXZlbnRIb2xkZXJzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50SG9sZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGF0dGFjaEV2ZW50KGFjdGlvbnMuc3RhcnQsIGV2ZW50SG9sZGVyLCBldmVudFN0YXJ0LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVzOiBoYW5kbGVzVG9EcmFnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlTnVtYmVyczogaGFuZGxlTnVtYmVyc1RvRHJhZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Q6IGNvbm5lY3QsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQXR0YWNoIGFuIGV2ZW50IHRvIHRoaXMgc2xpZGVyLCBwb3NzaWJseSBpbmNsdWRpbmcgYSBuYW1lc3BhY2VcbiAgICBmdW5jdGlvbiBiaW5kRXZlbnQobmFtZXNwYWNlZEV2ZW50LCBjYWxsYmFjaykge1xuICAgICAgICBzY29wZV9FdmVudHNbbmFtZXNwYWNlZEV2ZW50XSA9IHNjb3BlX0V2ZW50c1tuYW1lc3BhY2VkRXZlbnRdIHx8IFtdO1xuICAgICAgICBzY29wZV9FdmVudHNbbmFtZXNwYWNlZEV2ZW50XS5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgLy8gSWYgdGhlIGV2ZW50IGJvdW5kIGlzICd1cGRhdGUsJyBmaXJlIGl0IGltbWVkaWF0ZWx5IGZvciBhbGwgaGFuZGxlcy5cbiAgICAgICAgaWYgKG5hbWVzcGFjZWRFdmVudC5zcGxpdChcIi5cIilbMF0gPT09IFwidXBkYXRlXCIpIHtcbiAgICAgICAgICAgIHNjb3BlX0hhbmRsZXMuZm9yRWFjaChmdW5jdGlvbiAoYSwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBmaXJlRXZlbnQoXCJ1cGRhdGVcIiwgaW5kZXgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaXNJbnRlcm5hbE5hbWVzcGFjZShuYW1lc3BhY2UpIHtcbiAgICAgICAgcmV0dXJuIG5hbWVzcGFjZSA9PT0gSU5URVJOQUxfRVZFTlRfTlMuYXJpYSB8fCBuYW1lc3BhY2UgPT09IElOVEVSTkFMX0VWRU5UX05TLnRvb2x0aXBzO1xuICAgIH1cbiAgICAvLyBVbmRvIGF0dGFjaG1lbnQgb2YgZXZlbnRcbiAgICBmdW5jdGlvbiByZW1vdmVFdmVudChuYW1lc3BhY2VkRXZlbnQpIHtcbiAgICAgICAgdmFyIGV2ZW50ID0gbmFtZXNwYWNlZEV2ZW50ICYmIG5hbWVzcGFjZWRFdmVudC5zcGxpdChcIi5cIilbMF07XG4gICAgICAgIHZhciBuYW1lc3BhY2UgPSBldmVudCA/IG5hbWVzcGFjZWRFdmVudC5zdWJzdHJpbmcoZXZlbnQubGVuZ3RoKSA6IG5hbWVzcGFjZWRFdmVudDtcbiAgICAgICAgT2JqZWN0LmtleXMoc2NvcGVfRXZlbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChiaW5kKSB7XG4gICAgICAgICAgICB2Y
10072XIgdEV2ZW50ID0gYmluZC5zcGxpdChcIi5cIilbMF07XG4gICAgICAgICAgICB2YXIgdE5hbWVzcGFjZSA9IGJpbmQuc3Vic3RyaW5nKHRFdmVudC5sZW5ndGgpO1xuICAgICAgICAgICAgaWYgKCghZXZlbnQgfHwgZXZlbnQgPT09IHRFdmVudCkgJiYgKCFuYW1lc3BhY2UgfHwgbmFtZXNwYWNlID09PSB0TmFtZXNwYWNlKSkge1xuICAgICAgICAgICAgICAgIC8vIG9ubHkgZGVsZXRlIHByb3RlY3RlZCBpbnRlcm5hbCBldmVudCBpZiBpbnRlbnRpb25hbFxuICAgICAgICAgICAgICAgIGlmICghaXNJbnRlcm5hbE5hbWVzcGFjZSh0TmFtZXNwYWNlKSB8fCBuYW1lc3BhY2UgPT09IHROYW1lc3BhY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHNjb3BlX0V2ZW50c1tiaW5kXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBFeHRlcm5hbCBldmVudCBoYW5kbGluZ1xuICAgIGZ1bmN0aW9uIGZpcmVFdmVudChldmVudE5hbWUsIGhhbmRsZU51bWJlciwgdGFwKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKHNjb3BlX0V2ZW50cykuZm9yRWFjaChmdW5jdGlvbiAodGFyZ2V0RXZlbnQpIHtcbiAgICAgICAgICAgIHZhciBldmVudFR5cGUgPSB0YXJnZXRFdmVudC5zcGxpdChcIi5cIilbMF07XG4gICAgICAgICAgICBpZiAoZXZlbnROYW1lID09PSBldmVudFR5cGUpIHtcbiAgICAgICAgICAgICAgICBzY29wZV9FdmVudHNbdGFyZ2V0RXZlbnRdLmZvckVhY2goZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwoXG4gICAgICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgc2xpZGVyIHB1YmxpYyBBUEkgYXMgdGhlIHNjb3BlICgndGhpcycpXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlX1NlbGYsIFxuICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdmFsdWVzIGFzIGFycmF5LCBzbyBhcmdfMVthcmdfMl0gaXMgYWx3YXlzIHZhbGlkLlxuICAgICAgICAgICAgICAgICAgICBzY29wZV9WYWx1ZXMubWFwKG9wdGlvbnMuZm9ybWF0LnRvKSwgXG4gICAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBpbmRleCwgMCBvciAxXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZU51bWJlciwgXG4gICAgICAgICAgICAgICAgICAgIC8vIFVuLWZvcm1hdHRlZCBzbGlkZXIgdmFsdWVzXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlX1ZhbHVlcy5zbGljZSgpLCBcbiAgICAgICAgICAgICAgICAgICAgLy8gRXZlbnQgaXMgZmlyZWQgYnkgdGFwLCB0cnVlIG9yIGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIHRhcCB8fCBmYWxzZSwgXG4gICAgICAgICAgICAgICAgICAgIC8vIExlZnQgb2Zmc2V0IG9mIHRoZSBoYW5kbGUsIGluIHJlbGF0aW9uIHRvIHRoZSBzbGlkZXJcbiAgICAgICAgICAgICAgICAgICAgc2NvcGVfTG9jYXRpb25zLnNsaWNlKCksIFxuICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIHNsaWRlciBwdWJsaWMgQVBJIHRvIGFuIGFjY2Vzc2libGUgcGFyYW1ldGVyIHdoZW4gdGhpcyBpcyB1bmF2YWlsYWJsZVxuICAgICAgICAgICAgICAgICAgICBzY29wZV9TZWxmKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIFNwbGl0IG91dCB0aGUgaGFuZGxlIHBvc2l0aW9uaW5nIGxvZ2ljIHNvIHRoZSBNb3ZlIGV2ZW50IGNhbiB1c2UgaXQsIHRvb1xuICAgIGZ1bmN0aW9uIGNoZWNrSGFuZGxlUG9zaXRpb24ocmVmZXJlbmNlLCBoYW5kbGVOdW1iZXIsIHRvLCBsb29rQmFja3dhcmQsIGxvb2tGb3J3YXJkLCBnZXRWYWx1ZSwgc21vb3RoU3RlcHMpIHtcbiAgICAgICAgdmFyIGRpc3RhbmNlO1xuICAgICAgICAvLyBGb3Igc2xpZGVycyB3aXRoIG11bHRpcGxlIGhhbmRsZXMsIGxpbWl0IG1vdmVtZW50IHRvIHRoZSBvdGhlciBoYW5kbGUuXG4gICAgICAgIC8vIEFwcGx5IHRoZSBtYXJnaW4gb3B0aW9uIGJ5IGFkZGluZyBpdCB0byB0aGUgaGFuZGxlIHBvc2l0aW9ucy5cbiAgICAgICAgaWYgKHNjb3BlX0hhbmRsZXMubGVuZ3RoID4gMSAmJiAhb3B0aW9ucy5ldmVudHMudW5jb25zdHJhaW5lZCkge1xuICAgICAgICAgICAgaWYgKGxvb2tCYWNrd2FyZCAmJiBoYW5kbGVOdW1iZXIgPiAwKSB7XG4gICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBzY29wZV9TcGVjdHJ1bS5nZXRBYnNvbHV0ZURpc3RhbmNlKHJlZmVyZW5jZVtoYW5kbGVOdW1iZXIgLSAxXSwgb3B0aW9ucy5tYXJnaW4sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB0byA9IE1hdGgubWF4KHRvLCBkaXN0YW5jZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobG9va0ZvcndhcmQgJiYgaGFuZGxlTnVtYmVyIDwgc2NvcGVfSGFuZGxlcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBzY29wZV9TcGVjdHJ1bS5nZXRBYnNvbHV0ZURpc3RhbmNlKHJlZmVyZW5jZVtoYW5kbGVOdW1iZXIgKyAxXSwgb3B0aW9ucy5tYXJnaW4sIHRydWUpO1xuICAgICAgICAgICAgICAgIHRvID0gTWF0aC5taW4odG8sIGRpc3RhbmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgbGltaXQgb3B0aW9uIGhhcyB0aGUgb3Bwb3NpdGUgZWZmZWN0LCBsaW1pdGluZyBoYW5kbGVzIHRvIGFcbiAgICAgICAgLy8gbWF4aW11bSBkaXN0YW5jZSBmcm9tIGFub3RoZXIuIExpbWl0IG11c3QgYmUgPiAwLCBhcyBvdGhlcndpc2VcbiAgICAgICAgLy8gaGFuZGxlcyB3b3VsZCBiZSB1bm1vdmFibGUuXG4gICAgICAgIGlmIChzY29wZV9IYW5kbGVzLmxlbmd0aCA+IDEgJiYgb3B0aW9ucy5saW1pdCkge1xuICAgICAgICAgICAgaWYgKGxvb2tCYWNrd2FyZCAmJiBoYW5kbGVOdW1iZXIgPiAwKSB7XG4gICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBzY29wZV9TcGVjdHJ1bS5nZXRBYnNvbHV0ZURpc3RhbmNlKHJlZmVyZW5jZVtoYW5kbGVOdW1iZXIgLSAxXSwgb3B0aW9ucy5saW1pdCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHRvID0gTWF0aC5taW4odG8sIGRpc3RhbmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsb29rRm9yd2FyZCAmJiBoYW5kbGVOdW1iZXIgPCBzY29wZV9IYW5kbGVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IHNjb3BlX1NwZWN0cnVtLmdldEFic29sdXRlRGlzdGFuY2UocmVmZXJlbmNlW2hhbmRsZU51bWJlciArIDFdLCBvcHRpb25zLmxpbWl0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICB0byA9IE1hdGgubWF4KHRvLCBkaXN0YW5jZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgI
10072H1cbiAgICAgICAgLy8gVGhlIHBhZGRpbmcgb3B0aW9uIGtlZXBzIHRoZSBoYW5kbGVzIGEgY2VydGFpbiBkaXN0YW5jZSBmcm9tIHRoZVxuICAgICAgICAvLyBlZGdlcyBvZiB0aGUgc2xpZGVyLiBQYWRkaW5nIG11c3QgYmUgPiAwLlxuICAgICAgICBpZiAob3B0aW9ucy5wYWRkaW5nKSB7XG4gICAgICAgICAgICBpZiAoaGFuZGxlTnVtYmVyID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBzY29wZV9TcGVjdHJ1bS5nZXRBYnNvbHV0ZURpc3RhbmNlKDAsIG9wdGlvbnMucGFkZGluZ1swXSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHRvID0gTWF0aC5tYXgodG8sIGRpc3RhbmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoYW5kbGVOdW1iZXIgPT09IHNjb3BlX0hhbmRsZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIGRpc3RhbmNlID0gc2NvcGVfU3BlY3RydW0uZ2V0QWJzb2x1dGVEaXN0YW5jZSgxMDAsIG9wdGlvbnMucGFkZGluZ1sxXSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdG8gPSBNYXRoLm1pbih0bywgZGlzdGFuY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghc21vb3RoU3RlcHMpIHtcbiAgICAgICAgICAgIHRvID0gc2NvcGVfU3BlY3RydW0uZ2V0U3RlcCh0byk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTGltaXQgcGVyY2VudGFnZSB0byB0aGUgMCAtIDEwMCByYW5nZVxuICAgICAgICB0byA9IGxpbWl0KHRvKTtcbiAgICAgICAgLy8gUmV0dXJuIGZhbHNlIGlmIGhhbmRsZSBjYW4ndCBtb3ZlXG4gICAgICAgIGlmICh0byA9PT0gcmVmZXJlbmNlW2hhbmRsZU51bWJlcl0gJiYgIWdldFZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRvO1xuICAgIH1cbiAgICAvLyBVc2VzIHNsaWRlciBvcmllbnRhdGlvbiB0byBjcmVhdGUgQ1NTIHJ1bGVzLiBhID0gYmFzZSB2YWx1ZTtcbiAgICBmdW5jdGlvbiBpblJ1bGVPcmRlcih2LCBhKSB7XG4gICAgICAgIHZhciBvID0gb3B0aW9ucy5vcnQ7XG4gICAgICAgIHJldHVybiAobyA/IGEgOiB2KSArIFwiLCBcIiArIChvID8gdiA6IGEpO1xuICAgIH1cbiAgICAvLyBNb3ZlcyBoYW5kbGUocykgYnkgYSBwZXJjZW50YWdlXG4gICAgLy8gKGJvb2wsICUgdG8gbW92ZSwgWyUgd2hlcmUgaGFuZGxlIHN0YXJ0ZWQsIC4uLl0sIFtpbmRleCBpbiBzY29wZV9IYW5kbGVzLCAuLi5dKVxuICAgIGZ1bmN0aW9uIG1vdmVIYW5kbGVzKHVwd2FyZCwgcHJvcG9zYWwsIGxvY2F0aW9ucywgaGFuZGxlTnVtYmVycywgY29ubmVjdCkge1xuICAgICAgICB2Y
10072XIgcHJvcG9zYWxzID0gbG9jYXRpb25zLnNsaWNlKCk7XG4gICAgICAgIC8vIFN0b3JlIGZpcnN0IGhhbmRsZSBub3csIHNvIHdlIHN0aWxsIGhhdmUgaXQgaW4gY2FzZSBoYW5kbGVOdW1iZXJzIGlzIHJldmVyc2VkXG4gICAgICAgIHZhciBmaXJzdEhhbmRsZSA9IGhhbmRsZU51bWJlcnNbMF07XG4gICAgICAgIHZhciBzbW9vdGhTdGVwcyA9IG9wdGlvbnMuZXZlbnRzLnNtb290aFN0ZXBzO1xuICAgICAgICB2YXIgYiA9IFshdXB3YXJkLCB1cHdhcmRdO1xuICAgICAgICB2YXIgZiA9IFt1cHdhcmQsICF1cHdhcmRdO1xuICAgICAgICAvLyBDb3B5IGhhbmRsZU51bWJlcnMgc28gd2UgZG9uJ3QgY2hhbmdlIHRoZSBkYXRhc2V0XG4gICAgICAgIGhhbmRsZU51bWJlcnMgPSBoYW5kbGVOdW1iZXJzLnNsaWNlKCk7XG4gICAgICAgIC8vIENoZWNrIHRvIHNlZSB3aGljaCBoYW5kbGUgaXMgJ2xlYWRpbmcnLlxuICAgICAgICAvLyBJZiB0aGF0IG9uZSBjYW4ndCBtb3ZlIHRoZSBzZWNvbmQgY2FuJ3QgZWl0aGVyLlxuICAgICAgICBpZiAodXB3YXJkKSB7XG4gICAgICAgICAgICBoYW5kbGVOdW1iZXJzLnJldmVyc2UoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTdGVwIDE6IGdldCB0aGUgbWF4aW11bSBwZXJjZW50YWdlIHRoYXQgYW55IG9mIHRoZSBoYW5kbGVzIGNhbiBtb3ZlXG4gICAgICAgIGlmIChoYW5kbGVOdW1iZXJzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGhhbmRsZU51bWJlcnMuZm9yRWFjaChmdW5jdGlvbiAoaGFuZGxlTnVtYmVyLCBvKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRvID0gY2hlY2tIYW5kbGVQb3NpdGlvbihwcm9wb3NhbHMsIGhhbmRsZU51bWJlciwgcHJvcG9zYWxzW2hhbmRsZU51bWJlcl0gKyBwcm9wb3NhbCwgYltvXSwgZltvXSwgZmFsc2UsIHNtb290aFN0ZXBzKTtcbiAgICAgICAgICAgICAgICAvLyBTdG9wIGlmIG9uZSBvZiB0aGUgaGFuZGxlcyBjYW4ndCBtb3ZlLlxuICAgICAgICAgICAgICAgIGlmICh0byA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcG9zYWwgPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcG9zYWwgPSB0byAtIHByb3Bvc2Fsc1toYW5kbGVOdW1iZXJdO1xuICAgICAgICAgICAgICAgICAgICBwcm9wb3NhbHNbaGFuZGxlTnVtYmVyXSA9IHRvO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHVzaW5nIG9uZSBoYW5kbGUsIGNoZWNrIGJhY2t3YXJkIEFORCBmb3J3YXJkXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYiA9IGYgPSBbdHJ1ZV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHN0YXRlID0gZmFsc2U7XG4gICAgICAgIC8vIFN0ZXAgMjogVHJ5IHRvIHNldCB0aGUgaGFuZGxlcyB3aXRoIHRoZSBmb3VuZCBwZXJjZW50YWdlXG4gICAgICAgIGhhbmRsZU51bWJlcnMuZm9yRWFjaChmdW5jdGlvbiAoaGFuZGxlTnVtYmVyLCBvKSB7XG4gICAgICAgICAgICBzdGF0ZSA9XG4gICAgICAgICAgICAgICAgc2V0SGFuZGxlKGhhbmRsZU51bWJlciwgbG9jYXRpb25zW2hhbmRsZU51bWJlcl0gKyBwcm9wb3NhbCwgYltvXSwgZltvXSwgZmFsc2UsIHNtb290aFN0ZXBzKSB8fCBzdGF0ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFN0ZXAgMzogSWYgYSBoYW5kbGUgbW92ZWQsIGZpcmUgZXZlbnRzXG4gICAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICAgICAgaGFuZGxlTnVtYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChoYW5kbGVOdW1iZXIpIHtcbiAgICAgICAgICAgICAgICBmaXJlRXZlbnQoXCJ1cGRhdGVcIiwgaGFuZGxlTnVtYmVyKTtcbiAgICAgICAgICAgICAgICBmaXJlRXZlbnQoXCJzbGlkZVwiLCBoYW5kbGVOdW1iZXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBJZiB0YXJnZXQgaXMgYSBjb25uZWN0LCB0aGVuIGZpcmUgZHJhZyBldmVudFxuICAgICAgICAgICAgaWYgKGNvbm5lY3QgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZmlyZUV2ZW50KFwiZHJhZ1wiLCBmaXJzdEhhbmRsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVGFrZXMgYSBiYXNlIHZhbHVlIGFuZCBhbiBvZmZzZXQuIFRoaXMgb2Zmc2V0IGlzIHVzZWQgZm9yIHRoZSBjb25uZWN0IGJhciBzaXplLlxuICAgIC8vIEluIHRoZSBpbml0aWFsIGRlc2lnbiBmb3IgdGhpcyBmZWF0dXJlLCB0aGUgb3JpZ2luIGVsZW1lbnQgd2FzIDElIHdpZGUuXG4gICAgLy8gVW5mb3J0dW5hdGVseSwgYSByb3VuZGluZyBidWcgaW4gQ2hyb21lIG1ha2VzIGl0IGltcG9zc2libGUgdG8gaW1wbGVtZW50IHRoaXMgZmVhdHVyZVxuICAgIC8vIGluIHRoaXMgbWFubmVyOiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD03OTgyMjNcbiAgICBmdW5jdGlvbiB0cmFuc2Zvcm1EaXJlY3Rpb24oYSwgYikge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5kaXIgPyAxMDAgLSBhIC0gYiA6IGE7XG4gICAgfVxuICAgIC8vIFVwZGF0ZXMgc2NvcGVfTG9jYXRpb25zIGFuZCBzY29wZV9WYWx1ZXMsIHVwZGF0ZXMgdmlzdWFsIHN0YXRlXG4gICAgZnVuY3Rpb24gdXBkYXRlSGFuZGxlUG9zaXRpb24oaGFuZGxlTnVtYmVyLCB0bykge1xuICAgICAgICAvLyBVcGRhdGUgbG9jYXRpb25zLlxuICAgICAgICBzY29wZV9Mb2NhdGlvbnNbaGFuZGxlTnVtYmVyXSA9IHRvO1xuICAgICAgICAvLyBDb252ZXJ0IHRoZSB2YWx1ZSB0byB0aGUgc2xpZGVyIHN0ZXBwaW5nL3JhbmdlLlxuICAgICAgICBzY29wZV9WYWx1ZXNbaGFuZGxlTnVtYmVyXSA9IHNjb3BlX1NwZWN0cnVtLmZyb21TdGVwcGluZyh0byk7XG4gICAgICAgIHZhciB0cmFuc2xhdGlvbiA9IHRyYW5zZm9ybURpcmVjdGlvbih0bywgMCkgLSBzY29wZV9EaXJPZmZzZXQ7XG4gICAgICAgIHZhciB0cmFuc2xhdGVSdWxlID0gXCJ0cmFuc2xhdGUoXCIgKyBpblJ1bGVPcmRlcih0cmFuc2xhdGlvbiArIFwiJVwiLCBcIjBcIikgKyBcIilcIjtcbiAgICAgICAgc2NvcGVfSGFuZGxlc1toYW5kbGVOdW1iZXJdLnN0eWxlW29wdGlvbnMudHJhbnNmb3JtUnVsZV0gPSB0cmFuc2xhdGVSdWxlO1xuICAgICAgICAvLyBzYW5pdHkgY2hlY2sgZm9yIGF0IGxlYXN0IDIgaGFuZGxlcyAoZS5nLiBkdXJpbmcgc2V0dXApXG4gICAgICAgIGlmIChvcHRpb25zLmV2ZW50cy5pbnZlcnRDb25uZWN0cyAmJi
10072BzY29wZV9Mb2NhdGlvbnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgLy8gY2hlY2sgaWYgaGFuZGxlcyBwYXNzZWQgZWFjaCBvdGhlciwgYnV0IGRvbid0IG1hdGNoIHRoZSBDb25uZWN0c0ludmVydGVkIHN0YXRlXG4gICAgICAgICAgICB2YXIgaGFuZGxlc0FyZUluT3JkZXIgPSBzY29wZV9Mb2NhdGlvbnMuZXZlcnkoZnVuY3Rpb24gKHBvc2l0aW9uLCBpbmRleCwgbG9jYXRpb25zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4ID09PSAwIHx8IHBvc2l0aW9uID49IGxvY2F0aW9uc1tpbmRleCAtIDFdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoc2NvcGVfQ29ubmVjdHNJbnZlcnRlZCAhPT0gIWhhbmRsZXNBcmVJbk9yZGVyKSB7XG4gICAgICAgICAgICAgICAgLy8gaW52ZXJ0IGNvbm5lY3RzIHdoZW4gaGFuZGxlcyBwYXNzIGVhY2ggb3RoZXJcbiAgICAgICAgICAgICAgICBpbnZlcnRDb25uZWN0cygpO1xuICAgICAgICAgICAgICAgIC8vIGludmVydENvbm5lY3RzIGFscmVhZHkgdXBkYXRlcyBhbGwgY29ubmVjdCBlbGVtZW50c1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVDb25uZWN0KGhhbmRsZU51bWJlcik7XG4gICAgICAgIHVwZGF0ZUNvbm5lY3QoaGFuZGxlTnVtYmVyICsgMSk7XG4gICAgICAgIGlmIChzY29wZV9Db25uZWN0c0ludmVydGVkKSB7XG4gICAgICAgICAgICAvLyBXaGVuIGNvbm5lY3RzIGFyZSBpbnZlcnRlZCwgd2UgYWxzbyBoYXZlIHRvIHVwZGF0ZSBhZGphY2VudCBjb25uZWN0c1xuICAgICAgICAgICAgdXBkYXRlQ29ubmVjdChoYW5kbGVOdW1iZXIgLSAxKTtcbiAgICAgICAgICAgIHVwZGF0ZUNvbm5lY3QoaGFuZGxlTnVtYmVyICsgMik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gSGFuZGxlcyBiZWZvcmUgdGhlIHNsaWRlciBtaWRkbGUgYXJlIHN0YWNrZWQgbGF0ZXIgPSBoaWdoZXIsXG4gICAgLy8gSGFuZGxlcyBhZnRlciB0aGUgbWlkZGxlIGxhdGVyIGlzIGxvd2VyXG4gICAgLy8gW1s3XSBbOF0gLi4uLi4uLi4uLiB8IC4uLi4uLi4uLi4gWzVdIFs0XVxuICAgIGZ1bmN0aW9uIHNldFppbmRleCgpIHtcbiAgICAgICAgc2NvcGVfSGFuZGxlTnVtYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChoYW5kbGVOdW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBkaXIgPSBzY29wZV9Mb2NhdGlvbnNbaGFuZGxlTnVtYmVyXSA+IDUwID8gLTEgOiAxO1xuICAgICAgICAgICAgdmFyIHpJbmRleCA9IDMgKyAoc2NvcGVfSGFuZGxlcy5sZW5ndGggKyBkaXIgKiBoYW5kbGVOdW1iZXIpO1xuICAgICAgICAgICAgc2NvcGVfSGFuZGxlc1toYW5kbGVOdW1iZXJdLnN0eWxlLnpJbmRleCA9IFN0cmluZyh6SW5kZXgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gVGVzdCBzdWdnZXN0ZWQgdmFsdWVzIGFuZCBhcHBseSBtYXJnaW4sIHN0ZXAuXG4gICAgLy8gaWYgZXhhY3RJbnB1dCBpcyB0cnVlLCBkb24ndCBydW4gY2hlY2tIYW5kbGVQb3NpdGlvbiwgdGhlbiB0aGUgaGFuZGxlIGNhbiBiZSBwbGFjZWQgaW4gYmV0d2VlbiBzdGVwcyAoIzQzNilcbiAgICBmdW5jdGlvbiBzZXRIYW5kbGUoaGFuZGxlTnVtYmVyLCB0bywgbG9va0JhY2t3YXJkLCBsb29rRm9yd2FyZCwgZXhhY3RJbnB1dCwgc21vb3RoU3RlcHMpIHtcbiAgICAgICAgaWYgKCFleGFjdElucHV0KSB7XG4gICAgICAgICAgICB0byA9IGNoZWNrSGFuZGxlUG9zaXRpb24oc2NvcGVfTG9jYXRpb25zLCBoYW5kbGVOdW1iZXIsIHRvLCBsb29rQmFja3dhcmQsIGxvb2tGb3J3YXJkLCBmYWxzZSwgc21vb3RoU3RlcHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0byA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVIYW5kbGVQb3NpdGlvbihoYW5kbGVOdW1iZXIsIHRvKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIFVwZGF0ZXMgc3R5bGUgYXR0cmlidXRlIGZvciBjb25uZWN0IG5vZGVzXG4gICAgZnVuY3Rpb24gdXBkYXRlQ29ubmVjdChpbmRleCkge1xuICAgICAgICAvLyBTa2lwIGNvbm5lY3RzIHNldCB0byBmYWxzZVxuICAgICAgICBpZiAoIXNjb3BlX0Nvbm5lY3RzW2luZGV4XSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgbG9jYXRpb25zLCBzbyB3ZSBjYW4gc29ydCB0aGVtIGZvciB0aGUgbG9jYWwgc2NvcGUgbG9naWNcbiAgICAgICAgdmFyIGxvY2F0aW9ucyA9IHNjb3BlX0xvY2F0aW9ucy5zbGljZSgpO1xuICAgICAgICBpZiAoc2NvcGVfQ29ubmVjdHNJbnZlcnRlZCkge1xuICAgICAgICAgICAgbG9jYXRpb25zLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYSAtIGI7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB2Y
10072XIgbCA9IDA7XG4gICAgICAgIHZhciBoID0gMTAwO1xuICAgICAgICBpZiAoaW5kZXggIT09IDApIHtcbiAgICAgICAgICAgIGwgPSBsb2NhdGlvbnNbaW5kZXggLSAxXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5kZXggIT09IHNjb3BlX0Nvbm5lY3RzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIGggPSBsb2NhdGlvbnNbaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIHVzZSB0d28gcnVsZXM6XG4gICAgICAgIC8vICd0cmFuc2xhdGUnIHRvIGNoYW5nZSB0aGUgbGVmdC90b3Agb2Zmc2V0O1xuICAgICAgICAvLyAnc2NhbGUnIHRvIGNoYW5nZSB0aGUgd2lkdGggb2YgdGhlIGVsZW1lbnQ7XG4gICAgICAgIC8vIEFzIHRoZSBlbGVtZW50IGhhcyBhIHdpZHRoIG9mIDEwMCUsIGEgdHJhbnNsYXRpb24gb2YgMTAwJSBpcyBlcXVhbCB0byAxMDAlIG9mIHRoZSBwYXJlbnQgKC5ub1VpLWJhc2UpXG4gICAgICAgIHZhciBjb25uZWN0V2lkdGggPSBoIC0gbDtcbiAgICAgICAgdmFyIHRyYW5zbGF0ZVJ1bGUgPSBcInRyYW5zbGF0ZShcIiArIGluUnVsZU9yZGVyKHRyYW5zZm9ybURpcmVjdGlvbihsLCBjb25uZWN0V2lkdGgpICsgXCIlXCIsIFwiMFwiKSArIFwiKVwiO1xuICAgICAgICB2YXIgc2NhbGVSdWxlID0gXCJzY2FsZShcIiArIGluUnVsZU9yZGVyKGNvbm5lY3RXaWR0aCAvIDEwMCwgXCIxXCIpICsgXCIpXCI7XG4gICAgICAgIHNjb3BlX0Nvbm5lY3RzW2luZGV4XS5zdHlsZVtvcHRpb25zLnRyYW5zZm9ybVJ1bGVdID1cbiAgICAgICAgICAgIHRyYW5zbGF0ZVJ1bGUgKyBcIiBcIiArIHNjYWxlUnVsZTtcbiAgICB9XG4gICAgLy8gUGFyc2VzIHZhbHVlIHBhc3NlZCB0byAuc2V0IG1ldGhvZC4gUmV0dXJucyBjdXJyZW50IHZhbHVlIGlmIG5vdCBwYXJzZS1hYmxlLlxuICAgIGZ1bmN0aW9uIHJlc29sdmVUb1ZhbHVlKHRvLCBoYW5kbGVOdW1iZXIpIHtcbiAgICAgICAgLy8gU2V0dGluZyB3aXRoIG51bGwgaW5kaWNhdGVzIGFuICdpZ25vcmUnLlxuICAgICAgICAvLyBJbnB1dHRpbmcgJ2ZhbHNlJyBpcyBpbnZhbGlkLlxuICAgICAgICBpZiAodG8gPT09IG51bGwgfHwgdG8gPT09IGZhbHNlIHx8IHRvID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzY29wZV9Mb2NhdGlvbnNbaGFuZGxlTnVtYmVyXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBhIGZvcm1hdHRlZCBudW1iZXIgd2FzIHBhc3NlZCwgYXR0ZW1wdCB0byBkZWNvZGUgaXQuXG4gICAgICAgIGlmICh0eXBlb2YgdG8gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHRvID0gU3RyaW5nKHRvKTtcbiAgICAgICAgfVxuICAgICAgICB0byA9IG9wdGlvbnMuZm9ybWF0LmZyb20odG8pO1xuICAgICAgICBpZiAodG8gIT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0byA9IHNjb3BlX1NwZWN0cnVtLnRvU3RlcHBpbmcodG8pO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHBhcnNpbmcgdGhlIG51bWJlciBmYWlsZWQsIHVzZSB0aGUgY3VycmVudCB2YWx1ZS5cbiAgICAgICAgaWYgKHRvID09PSBmYWxzZSB8fCBpc05hTih0bykpIHtcbiAgICAgICAgICAgIHJldHVybiBzY29wZV9Mb2NhdGlvbnNbaGFuZGxlTnVtYmVyXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG87XG4gICAgfVxuICAgIC8vIFNldCB0aGUgc2xpZGVyIHZhbHVlLlxuICAgIGZ1bmN0aW9uIHZhbHVlU2V0KGlucHV0LCBmaXJlU2V0RXZlbnQsIGV4YWN0SW5wdXQpIHtcbiAgICAgICAgdmFyIHZhbHVlcyA9IGFzQXJyYXkoaW5wdXQpO1xuICAgICAgICB2Y
10072XIgaXNJbml0ID0gc2NvcGVfTG9jYXRpb25zWzBdID09PSB1bmRlZmluZWQ7XG4gICAgICAgIC8vIEV2ZW50IGZpcmVzIGJ5IGRlZmF1bHRcbiAgICAgICAgZmlyZVNldEV2ZW50ID0gZmlyZVNldEV2ZW50ID09PSB1bmRlZmluZWQgPyB0cnVlIDogZmlyZVNldEV2ZW50O1xuICAgICAgICAvLyBBbmltYXRpb24gaXMgb3B0aW9uYWwuXG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgaW5pdGlhbCB2YWx1ZXMgd2VyZSBzZXQgYmVmb3JlIHVzaW5nIGFuaW1hdGVkIHBsYWNlbWVudC5cbiAgICAgICAgaWYgKG9wdGlvbnMuYW5pbWF0ZSAmJiAhaXNJbml0KSB7XG4gICAgICAgICAgICBhZGRDbGFzc0ZvcihzY29wZV9UYXJnZXQsIG9wdGlvbnMuY3NzQ2xhc3Nlcy50YXAsIG9wdGlvbnMuYW5pbWF0aW9uRHVyYXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZpcnN0IHBhc3MsIHdpdGhvdXQgbG9va0FoZWFkIGJ1dCB3aXRoIGxvb2tCYWNrd2FyZC4gVmFsdWVzIGFyZSBzZXQgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuICAgICAgICBzY29wZV9IYW5kbGVOdW1iZXJzLmZvckVhY2goZnVuY3Rpb24gKGhhbmRsZU51bWJlcikge1xuICAgICAgICAgICAgc2V0SGFuZGxlKGhhbmRsZU51bWJlciwgcmVzb2x2ZVRvVmFsdWUodmFsdWVzW2hhbmRsZU51bWJlcl0sIGhhbmRsZU51bWJlciksIHRydWUsIGZhbHNlLCBleGFjdElucHV0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBpID0gc2NvcGVfSGFuZGxlTnVtYmVycy5sZW5ndGggPT09IDEgPyAwIDogMTtcbiAgICAgICAgLy8gU3ByZWFkIGhhbmRsZXMgZXZlbmx5IGFjcm9zcyB0aGUgc2xpZGVyIGlmIHRoZSByYW5nZSBoYXMgbm8gc2l6ZSAobWluPW1heClcbiAgICAgICAgaWYgKGlzSW5pdCAmJiBzY29wZV9TcGVjdHJ1bS5oYXNOb1NpemUoKSkge1xuICAgICAgICAgICAgZXhhY3RJbnB1dCA9IHRydWU7XG4gICAgICAgICAgICBzY29wZV9Mb2NhdGlvbnNbMF0gPSAwO1xuICAgICAgICAgICAgaWYgKHNjb3BlX0hhbmRsZU51bWJlcnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIHZhciBzcGFjZV8xID0gMTAwIC8gKHNjb3BlX0hhbmRsZU51bWJlcnMubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgc2NvcGVfSGFuZGxlTnVtYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChoYW5kbGVOdW1iZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGVfTG9jYXRpb25zW2hhbmRsZU51bWJlcl0gPSBoYW5kbGVOdW1iZXIgKiBzcGFjZV8xO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFNlY29uZGFyeSBwYXNzZXMuIE5vdyB0aGF0IGFsbCBiYXNlIHZhbHVlcyBhcmUgc2V0LCBhcHBseSBjb25zdHJhaW50cy5cbiAgICAgICAgLy8gSXRlcmF0ZSBhbGwgaGFuZGxlcyB0byBlbnN1cmUgY29uc3RyYWludHMgYXJlIGFwcGxpZWQgZm9yIHRoZSBlbnRpcmUgc2xpZGVyIChJc3N1ZSAjMTAwOSlcbiAgICAgICAgZm9yICg7IGkgPCBzY29wZV9IYW5kbGVOdW1iZXJzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBzY29wZV9IYW5kbGVOdW1iZXJzLmZvckVhY2goZnVuY3Rpb24gKGhhbmRsZU51bWJlcikge1xuICAgICAgICAgICAgICAgIHNldEhhbmRsZShoYW5kbGVOdW1iZXIsIHNjb3BlX0xvY2F0aW9uc1toYW5kbGVOdW1iZXJdLCB0cnVlLCB0cnVlLCBleGFjdElucHV0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHNldFppbmRleCgpO1xuICAgICAgICBzY29wZV9IYW5kbGVOdW1iZXJzLmZvckVhY2goZnVuY3Rpb24gKGhhbmRsZU51bWJlcikge1xuICAgICAgICAgICAgZmlyZUV2ZW50KFwidXBkYXRlXCIsIGhhbmRsZU51bWJlcik7XG4gICAgICAgICAgICAvLyBGaXJlIHRoZSBldmVudCBvbmx5IGZvciBoYW5kbGVzIHRoYXQgcmVjZWl2ZWQgYSBuZXcgdmFsdWUsIGFzIHBlciAjNTc5XG4gICAgICAgICAgICBpZiAodmFsdWVzW2hhbmRsZU51bWJlcl0gIT09IG51bGwgJiYgZmlyZVNldEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgZmlyZUV2ZW50KFwic2V0XCIsIGhhbmRsZU51bWJlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBSZXNldCBzbGlkZXIgdG8gaW5pdGlhbCB2YWx1ZXNcbiAgICBmdW5jdGlvbiB2YWx1ZVJlc2V0KGZpcmVTZXRFdmVudCkge1xuICAgICAgICB2YWx1ZVNldChvcHRpb25zLnN0YXJ0LCBmaXJlU2V0RXZlbnQpO1xuICAgIH1cbiAgICAvLyBTZXQgdmFsdWUgZm9yIGEgc2luZ2xlIGhhbmRsZVxuICAgIGZ1bmN0aW9uIHZhbHVlU2V0SGFuZGxlKGhhbmRsZU51bWJlciwgdmFsdWUsIGZpcmVTZXRFdmVudCwgZXhhY3RJbnB1dCkge1xuICAgICAgICAvLyBFbnN1cmUgbnVtZXJpYyBpbnB1dFxuICAgICAgICBoYW5kbGVOdW1iZXIgPSBOdW1iZXIoaGFuZGxlTnVtYmVyKTtcbiAgICAgICAgaWYgKCEoaGFuZGxlTnVtYmVyID49IDAgJiYgaGFuZGxlTnVtYmVyIDwgc2NvcGVfSGFuZGxlTnVtYmVycy5sZW5ndGgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub1VpU2xpZGVyOiBpbnZhbGlkIGhhbmRsZSBudW1iZXIsIGdvdDogXCIgKyBoYW5kbGVOdW1iZXIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIExvb2sgYm90aCBiYWNrd2FyZCBhbmQgZm9yd2FyZCwgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0aGlzIGhhbmRsZSB0byBcInB1c2hcIiBvdGhlciBoYW5kbGVzICgjOTYwKTtcbiAgICAgICAgLy8gVGhlIGV4YWN0SW5wdXQgYXJndW1lbnQgY2FuIGJlIHVzZWQgdG8gaWdub3JlIHNsaWRlciBzdGVwcGluZyAoIzQzNilcbiAgICAgICAgc2V0SGFuZGxlKGhhbmRsZU51bWJlciwgcmVzb2x2ZVRvVmFsdWUodmFsdWUsIGhhbmRsZU51bWJlciksIHRydWUsIHRydWUsIGV4YWN0SW5wdXQpO1xuICAgICAgICBmaXJlRXZlbnQoXCJ1cGRhdGVcIiwgaGFuZGxlTnVtYmVyKTtcbiAgICAgICAgaWYgKGZpcmVTZXRFdmVudCkge1xuICAgICAgICAgICAgZmlyZUV2ZW50KFwic2V0XCIsIGhhbmRsZU51bWJlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gR2V0IHRoZSBzbGlkZXIgdmFsdWUuXG4gICAgZnVuY3Rpb24gdmFsdWVHZXQodW5lbmNvZGVkKSB7XG4gICAgICAgIGlmICh1bmVuY29kZWQgPT09IHZvaWQgMCkgeyB1bmVuY29kZWQgPSBmYWxzZTsgfVxuICAgICAgICBpZiAodW5lbmNvZGVkKSB7XG4gICAgICAgICAgICAvLyByZXR1cm4gYSBjb3B5IG9mIHRoZSByYXcgdmFsdWVzXG4gICAgICAgICAgICByZXR1cm4gc2NvcGVf
10072VmFsdWVzLmxlbmd0aCA9PT0gMSA/IHNjb3BlX1ZhbHVlc1swXSA6IHNjb3BlX1ZhbHVlcy5zbGljZSgwKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdmFsdWVzID0gc2NvcGVfVmFsdWVzLm1hcChvcHRpb25zLmZvcm1hdC50byk7XG4gICAgICAgIC8vIElmIG9ubHkgb25lIGhhbmRsZSBpcyB1c2VkLCByZXR1cm4gYSBzaW5nbGUgdmFsdWUuXG4gICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWVzWzBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgfVxuICAgIC8vIFJlbW92ZXMgY2xhc3NlcyBmcm9tIHRoZSByb290IGFuZCBlbXB0aWVzIGl0LlxuICAgIGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICAgIC8vIHJlbW92ZSBwcm90ZWN0ZWQgaW50ZXJuYWwgbGlzdGVuZXJzXG4gICAgICAgIHJlbW92ZUV2ZW50KElOVEVSTkFMX0VWRU5UX05TLmFyaWEpO1xuICAgICAgICByZW1vdmVFdmVudChJTlRFUk5BTF9FVkVOVF9OUy50b29sdGlwcyk7XG4gICAgICAgIE9iamVjdC5rZXlzKG9wdGlvbnMuY3NzQ2xhc3NlcykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICByZW1vdmVDbGFzcyhzY29wZV9UYXJnZXQsIG9wdGlvbnMuY3NzQ2xhc3Nlc1trZXldKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHdoaWxlIChzY29wZV9UYXJnZXQuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgc2NvcGVfVGFyZ2V0LnJlbW92ZUNoaWxkKHNjb3BlX1RhcmdldC5maXJzdENoaWxkKTtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgc2NvcGVfVGFyZ2V0Lm5vVWlTbGlkZXI7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldE5leHRTdGVwc0ZvckhhbmRsZShoYW5kbGVOdW1iZXIpIHtcbiAgICAgICAgdmFyIGxvY2F0aW9uID0gc2NvcGVfTG9jYXRpb25zW2hhbmRsZU51bWJlcl07XG4gICAgICAgIHZhciBuZWFyYnlTdGVwcyA9IHNjb3BlX1NwZWN0cnVtLmdldE5lYXJieVN0ZXBzKGxvY2F0aW9uKTtcbiAgICAgICAgdmFyIHZhbHVlID0gc2NvcGVf
10072VmFsdWVzW2hhbmRsZU51bWJlcl07XG4gICAgICAgIHZhciBpbmNyZW1lbnQgPSBuZWFyYnlTdGVwcy50aGlzU3RlcC5zdGVwO1xuICAgICAgICB2YXIgZGVjcmVtZW50ID0gbnVsbDtcbiAgICAgICAgLy8gSWYgc25hcHBlZCwgZGlyZWN0bHkgdXNlIGRlZmluZWQgc3RlcCB2YWx1ZVxuICAgICAgICBpZiAob3B0aW9ucy5zbmFwKSB7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIHZhbHVlIC0gbmVhcmJ5U3RlcHMuc3RlcEJlZm9yZS5zdGFydFZhbHVlIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgbmVhcmJ5U3RlcHMuc3RlcEFmdGVyLnN0YXJ0VmFsdWUgLSB2YWx1ZSB8fCBudWxsLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGUgbmV4dCB2YWx1ZSBpbiB0aGlzIHN0ZXAgbW92ZXMgaW50byB0aGUgbmV4dCBzdGVwLFxuICAgICAgICAvLyB0aGUgaW5jcmVtZW50IGlzIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBzdGVwIC0gdGhlIGN1cnJlbnQgdmFsdWVcbiAgICAgICAgaWYgKGluY3JlbWVudCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSArIGluY3JlbWVudCA+IG5lYXJieVN0ZXBzLnN0ZXBBZnRlci5zdGFydFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaW5jcmVtZW50ID0gbmVhcmJ5U3RlcHMuc3RlcEFmdGVyLnN0YXJ0VmFsdWUgLSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGUgdmFsdWUgaXMgYmV5b25kIHRoZSBzdGFydGluZyBwb2ludFxuICAgICAgICBpZiAodmFsdWUgPiBuZWFyYnlTdGVwcy50aGlzU3RlcC5zdGFydFZhbHVlKSB7XG4gICAgICAgICAgICBkZWNyZW1lbnQgPSBuZWFyYnlTdGVwcy50aGlzU3RlcC5zdGVwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5lYXJieVN0ZXBzLnN0ZXBCZWZvcmUuc3RlcCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGRlY3JlbWVudCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIGEgaGFuZGxlIGlzIGF0IHRoZSBzdGFydCBvZiBhIHN0ZXAsIGl0IGFsd2F5cyBzdGVwcyBiYWNrIGludG8gdGhlIHByZXZpb3VzIHN0ZXAgZmlyc3RcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkZWNyZW1lbnQgPSB2YWx1ZSAtIG5lYXJieVN0ZXBzLnN0ZXBCZWZvcmUuaGlnaGVzdFN0ZXA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm93LCBpZiBhdCB0aGUgc2xpZGVyIGVkZ2VzLCB0aGVyZSBpcyBubyBpbi9kZWNyZW1lbnRcbiAgICAgICAgaWYgKGxvY2F0aW9uID09PSAxMDApIHtcbiAgICAgICAgICAgIGluY3JlbWVudCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobG9jYXRpb24gPT09IDApIHtcbiAgICAgICAgICAgIGRlY3JlbWVudCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXMgcGVyICMzOTEsIHRoZSBjb21wYXJpc29uIGZvciB0aGUgZGVjcmVtZW50IHN0ZXAgY2FuIGhhdmUgc29tZSByb3VuZGluZyBpc3N1ZXMuXG4gICAgICAgIHZhciBzdGVwRGVjaW1hbHMgPSBzY29wZV9TcGVjdHJ1bS5jb3VudFN0ZXBEZWNpbWFscygpO1xuICAgICAgICAvLyBSb3VuZCBwZXIgIzM5MVxuICAgICAgICBpZiAoaW5jcmVtZW50ICE9PSBudWxsICYmIGluY3JlbWVudCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGluY3JlbWVudCA9IE51bWJlcihpbmNyZW1lbnQudG9GaXhlZChzdGVwRGVjaW1hbHMpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVjcmVtZW50ICE9PSBudWxsICYmIGRlY3JlbWVudCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGRlY3JlbWVudCA9IE51bWJlcihkZWNyZW1lbnQudG9GaXhlZChzdGVwRGVjaW1hbHMpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2RlY3JlbWVudCwgaW5jcmVtZW50XTtcbiAgICB9XG4gICAgLy8gR2V0IHRoZSBjdXJyZW50IHN0ZXAgc2l6ZSBmb3IgdGhlIHNsaWRlci5cbiAgICBmdW5jdGlvbiBnZXROZXh0U3RlcHMoKSB7XG4gICAgICAgIHJldHVybiBzY29wZV9IYW5kbGVOdW1iZXJzLm1hcChnZXROZXh0U3RlcHNGb3JIYW5kbGUpO1xuICAgIH1cbiAgICAvLyBVcGRhdGFibGU6IG1hcmdpbiwgbGltaXQsIHBhZGRpbmcsIHN0ZXAsIHJhbmdlLCBhbmltYXRlLCBzbmFwXG4gICAgZnVuY3Rpb24gdXBkYXRlT3B0aW9ucyhvcHRpb25zVG9VcGRhdGUsIGZpcmVTZXRFdmVudCkge1xuICAgICAgICAvLyBTcGVjdHJ1bSBpcyBjcmVhdGVkIHVzaW5nIHRoZSByYW5nZSwgc25hcCwgZGlyZWN0aW9uIGFuZCBzdGVwIG9wdGlvbnMuXG4gICAgICAgIC8vICdzbmFwJyBhbmQgJ3N0ZXAnIGNhbiBiZSB1cGRhdGVkLlxuICAgICAgICAvLyBJZiAnc25hcCcgYW5kICdzdGVwJyBhcmUgbm90IHBhc3NlZCwgdGhleSBzaG91bGQgcmVtYWluIHVuY2hhbmdlZC5cbiAgICAgICAgdmFyIHYgPSB2YWx1ZUdldCgpO1xuICAgICAgICB2Y
10072XIgdXBkYXRlQWJsZSA9IFtcbiAgICAgICAgICAgIFwibWFyZ2luXCIsXG4gICAgICAgICAgICBcImxpbWl0XCIsXG4gICAgICAgICAgICBcInBhZGRpbmdcIixcbiAgICAgICAgICAgIFwicmFuZ2VcIixcbiAgICAgICAgICAgIFwiYW5pbWF0ZVwiLFxuICAgICAgICAgICAgXCJzbmFwXCIsXG4gICAgICAgICAgICBcInN0ZXBcIixcbiAgICAgICAgICAgIFwiZm9ybWF0XCIsXG4gICAgICAgICAgICBcInBpcHNcIixcbiAgICAgICAgICAgIFwidG9vbHRpcHNcIixcbiAgICAgICAgICAgIFwiY29ubmVjdFwiLFxuICAgICAgICBdO1xuICAgICAgICAvLyBPbmx5IGNoYW5nZSBvcHRpb25zIHRoYXQgd2UncmUgYWN0dWFsbHkgcGFzc2VkIHRvIHVwZGF0ZS5cbiAgICAgICAgdXBkYXRlQWJsZS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBmb3IgdW5kZWZpbmVkLiBudWxsIHJlbW92ZXMgdGhlIHZhbHVlLlxuICAgICAgICAgICAgaWYgKG9wdGlvbnNUb1VwZGF0ZVtuYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxPcHRpb25zW25hbWVdID0gb3B0aW9uc1RvVXBkYXRlW25hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIG5ld09wdGlvbnMgPSB0ZXN0T3B0aW9ucyhvcmlnaW5hbE9wdGlvbnMpO1xuICAgICAgICAvLyBMb2FkIG5ldyBvcHRpb25zIGludG8gdGhlIHNsaWRlciBzdGF0ZVxuICAgICAgICB1cGRhdGVBYmxlLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zVG9VcGRhdGVbbmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnNbbmFtZV0gPSBuZXdPcHRpb25zW25hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgc2NvcGVfU3BlY3RydW0gPSBuZXdPcHRpb25zLnNwZWN0cnVtO1xuICAgICAgICAvLyBMaW1pdCwgbWFyZ2luIGFuZCBwYWRkaW5nIGRlcGVuZCBvbiB0aGUgc3BlY3RydW0gYnV0IGFyZSBzdG9yZWQgb3V0c2lkZSBvZiBpdC4gKCM2NzcpXG4gICAgICAgIG9wdGlvbnMubWFyZ2luID0gbmV3T3B0aW9ucy5tYXJnaW47XG4gICAgICAgIG9wdGlvbnMubGltaXQgPSBuZXdPcHRpb25zLmxpbWl0O1xuICAgICAgICBvcHRpb25zLnBhZGRpbmcgPSBuZXdPcHRpb25zLnBhZGRpbmc7XG4gICAgICAgIC8vIFVwZGF0ZSBwaXBzLCByZW1vdmVzIGV4aXN0aW5nLlxuICAgICAgICBpZiAob3B0aW9ucy5waXBzKSB7XG4gICAgICAgICAgICBwaXBzKG9wdGlvbnMucGlwcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZW1vdmVQaXBzKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXBkYXRlIHRvb2x0aXBzLCByZW1vdmVzIGV4aXN0aW5nLlxuICAgICAgICBpZiAob3B0aW9ucy50b29sdGlwcykge1xuICAgICAgICAgICAgdG9vbHRpcHMoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlbW92ZVRvb2x0aXBzKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSW52YWxpZGF0ZSB0aGUgY3VycmVudCBwb3NpdGlvbmluZyBzbyB2YWx1ZVNldCBmb3JjZXMgYW4gdXBkYXRlLlxuICAgICAgICBzY29wZV9Mb2NhdGlvbnMgPSBbXTtcbiAgICAgICAgdmFsdWVTZXQoaXNTZXQob3B0aW9uc1RvVXBkYXRlLnN0YXJ0KSA/IG9wdGlvbnNUb1VwZGF0ZS5zdGFydCA6IHYsIGZpcmVTZXRFdmVudCk7XG4gICAgICAgIC8vIFVwZGF0ZSBjb25uZWN0cyBvbmx5IGlmIGl0IHdhcyBzZXRcbiAgICAgICAgaWYgKG9wdGlvbnNUb1VwZGF0ZS5jb25uZWN0KSB7XG4gICAgICAgICAgICB1cGRhdGVDb25uZWN0T3B0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlQ29ubmVjdE9wdGlvbigpIHtcbiAgICAgICAgLy8gSUUgc3VwcG9ydGVkIHdheSBvZiByZW1vdmluZyBjaGlsZHJlbiBpbmNsdWRpbmcgZXZlbnQgaGFuZGxlcnNcbiAgICAgICAgd2hpbGUgKHNjb3BlX0Nvbm5lY3RCYXNlLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIHNjb3BlX0Nvbm5lY3RCYXNlLnJlbW92ZUNoaWxkKHNjb3BlX0Nvbm5lY3RCYXNlLmZpcnN0Q2hpbGQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFkZGluZyBuZXcgY29ubmVjdHMgYWNjb3JkaW5nIHRvIHRoZSBuZXcgY29ubmVjdCBvcHRpb25zXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IG9wdGlvbnMuaGFuZGxlczsgaSsrKSB7XG4gICAgICAgICAgICBzY29wZV9Db25uZWN0c1tpXSA9IGFkZENvbm5lY3Qoc2NvcGVfQ29ubmVjdEJhc2UsIG9wdGlvbnMuY29ubmVjdFtpXSk7XG4gICAgICAgICAgICB1cGRhdGVDb25uZWN0KGkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHJlLWFkZGluZyBkcmFnIGV2ZW50cyBmb3IgdGhlIG5ldyBjb25uZWN0IGVsZW1lbnRzXG4gICAgICAgIC8vIHRvIGlnbm9yZSB0aGUgb3RoZXIgZXZlbnRzIHdlIGhhdmUgdG8gbmVnYXRlIHRoZSAnaWYgKCFiZWhhdmlvdXIuZml4ZWQpJyBjaGVja1xuICAgICAgICBiaW5kU2xpZGVyRXZlbnRzKHsgZHJhZzogb3B0aW9ucy5ldmVudHMuZHJhZywgZml4ZWQ6IHRydWUgfSk7XG4gICAgfVxuICAgIC8vIEludmVydCBvcHRpb25zIGZvciBjb25uZWN0IGhhbmRsZXNcbiAgICBmdW5jdGlvbiBpbnZlcnRDb25uZWN0cygpIHtcbiAgICAgICAgc2NvcGVfQ29ubmVjdHNJbnZlcnRlZCA9ICFzY29wZV9Db25uZWN0c0ludmVydGVkO1xuICAgICAgICB0ZXN0Q29ubmVjdChvcHRpb25zLCBcbiAgICAgICAgLy8gaW52ZXJzZSB0aGUgY29ubmVjdCBib29sZWFuIGFycmF5XG4gICAgICAgIG9wdGlvbnMuY29ubmVjdC5tYXAoZnVuY3Rpb24gKGIpIHsgcmV0dXJuICFiOyB9KSk7XG4gICAgICAgIHVwZGF0ZUNvbm5lY3RPcHRpb24oKTtcbiAgICB9XG4gICAgLy8gSW5pdGlhbGl6YXRpb24gc3RlcHNcbiAgICBmdW5jdGlvbiBzZXR1cFNsaWRlcigpIHtcbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBiYXNlIGVsZW1lbnQsIGluaXRpYWxpemUgSFRNTCBhbmQgc2V0IGNsYXNzZXMuXG4gICAgICAgIC8vIEFkZCBoYW5kbGVzIGFuZCBjb25uZWN0IGVsZW1lbnRzLlxuICAgICAgICBzY29wZV9CYXNlID0gYWRkU2xpZGVyKHNjb3BlX1RhcmdldCk7XG4gICAgICAgIGFkZEVsZW1lbnRzKG9wdGlvbnMuY29ubmVjdCwgc2NvcGVfQmFzZSk7XG4gICAgICAgIC8vIEF0dGFjaCB1c2VyIGV2ZW50cy5cbiAgICAgICAgYmluZFNsaWRlckV2ZW50cyhvcHRpb25zLmV2ZW50cyk7XG4gICAgICAgIC8vIFVzZSB0aGUgcHVibGljIHZhbHVlIG1ldGhvZCB0byBzZXQgdGhlIHN0YXJ0IHZhbHVlcy5cbiAgICAgICAgdmFsdWVTZXQob3B0aW9ucy5zdGFydCk7XG4gICAgICAgIGlmIChvcHRpb25zLnBpcHMpIHtcbiAgICAgICAgICAgI
10072HBpcHMob3B0aW9ucy5waXBzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy50b29sdGlwcykge1xuICAgICAgICAgICAgdG9vbHRpcHMoKTtcbiAgICAgICAgfVxuICAgICAgICBhcmlhKCk7XG4gICAgfVxuICAgIHNldHVwU2xpZGVyKCk7XG4gICAgdmFyIHNjb3BlX1NlbGYgPSB7XG4gICAgICAgIGRlc3Ryb3k6IGRlc3Ryb3ksXG4gICAgICAgIHN0ZXBzOiBnZXROZXh0U3RlcHMsXG4gICAgICAgIG9uOiBiaW5kRXZlbnQsXG4gICAgICAgIG9mZjogcmVtb3ZlRXZlbnQsXG4gICAgICAgIGdldDogdmFsdWVHZXQsXG4gICAgICAgIHNldDogdmFsdWVTZXQsXG4gICAgICAgIHNldEhhbmRsZTogdmFsdWVTZXRIYW5kbGUsXG4gICAgICAgIHJlc2V0OiB2YWx1ZVJlc2V0LFxuICAgICAgICBkaXNhYmxlOiBkaXNhYmxlLFxuICAgICAgICBlbmFibGU6IGVuYWJsZSxcbiAgICAgICAgLy8gRXhwb3NlZCBmb3IgdW5pdCB0ZXN0aW5nLCBkb24ndCB1c2UgdGhpcyBpbiB5b3VyIGFwcGxpY2F0aW9uLlxuICAgICAgICBfX21vdmVIYW5kbGVzOiBmdW5jdGlvbiAodXB3YXJkLCBwcm9wb3NhbCwgaGFuZGxlTnVtYmVycykge1xuICAgICAgICAgICAgbW92ZUhhbmRsZXModXB3YXJkLCBwcm9wb3NhbCwgc2NvcGVfTG9jYXRpb25zLCBoYW5kbGVOdW1iZXJzKTtcbiAgICAgICAgfSxcbiAgICAgICAgb3B0aW9uczogb3JpZ2luYWxPcHRpb25zLFxuICAgICAgICB1cGRhdGVPcHRpb25zOiB1cGRhdGVPcHRpb25zLFxuICAgICAgICB0YXJnZXQ6IHNjb3BlX1RhcmdldCxcbiAgICAgICAgcmVtb3ZlUGlwczogcmVtb3ZlUGlwcyxcbiAgICAgICAgcmVtb3ZlVG9vbHRpcHM6IHJlbW92ZVRvb2x0aXBzLFxuICAgICAgICBnZXRQb3NpdGlvbnM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBzY29wZV9Mb2NhdGlvbnMuc2xpY2UoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0VG9vbHRpcHM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBzY29wZV9Ub29sdGlwcztcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0T3JpZ2luczogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHNjb3BlX0hhbmRsZXM7XG4gICAgICAgIH0sXG4gICAgICAgIHBpcHM6IHBpcHMsIC8vIElzc3VlICM1OTRcbiAgICB9O1xuICAgIHJldHVybiBzY29wZV9TZWxmO1xufVxuLy8gUnVuIHRoZSBzdGFuZGFyZCBpbml0aWFsaXplclxuZnVuY3Rpb24gaW5pdGlhbGl6ZSh0YXJnZXQsIG9yaWdpbmFsT3B0aW9ucykge1xuICAgIGlmICghdGFyZ2V0IHx8ICF0YXJnZXQubm9kZU5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm9VaVNsaWRlcjogY3JlYXRlIHJlcXVpcmVzIGEgc2luZ2xlIGVsZW1lbnQsIGdvdDogXCIgKyB0YXJnZXQpO1xuICAgIH1cbiAgICAvLyBUaHJvdyBhbiBlcnJvciBpZiB0aGUgc2xpZGVyIHdhcyBhbHJlYWR5IGluaXRpYWxpemVkLlxuICAgIGlmICh0YXJnZXQubm9VaVNsaWRlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub1VpU2xpZGVyOiBTbGlkZXIgd2FzIGFscmVhZHkgaW5pdGlhbGl6ZWQuXCIpO1xuICAgIH1cbiAgICAvLyBUZXN0IHRoZSBvcHRpb25zIGFuZCBjcmVhdGUgdGhlIHNsaWRlciBlbnZpcm9ubWVudDtcbiAgICB2YXIgb3B0aW9ucyA9IHRlc3RPcHRpb25zKG9yaWdpbmFsT3B0aW9ucyk7XG4gICAgdmFyIGFwaSA9IHNjb3BlKHRhcmdldCwgb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zKTtcbiAgICB0YXJnZXQubm9VaVNsaWRlciA9IGFwaTtcbiAgICByZXR1cm4gYXBpO1xufVxuZXhwb3J0IHsgaW5pdGlhbGl6ZSBhcyBjcmVhdGUgfTtcbmV4cG9ydCB7IGNzc0NsYXNzZXMgfTtcbmV4cG9ydCBkZWZhdWx0IHtcbiAgICAvLyBFeHBvc2VkIGZvciB1bml0IHRlc3RpbmcsIGRvbid0IHVzZSB0aGlzIGluIHlvdXIgYXBwbGljYXRpb24uXG4gICAgX19zcGVjdHJ1bTogU3BlY3RydW0sXG4gICAgLy8gQSByZWZlcmVuY2UgdG8gdGhlIGRlZmF1bHQgY2xhc3NlcywgYWxsb3dzIGdsb2JhbCBjaGFuZ2VzLlxuICAgIC8vIFVzZSB0aGUgY3NzQ2xhc3NlcyBvcHRpb24gZm9yIGNoYW5nZXMgdG8gb25lIHNsaWRlci5cbiAgICBjc3NDbGFzc2VzOiBjc3NDbGFzc2VzLFxuICAgIGNyZWF0ZTogaW5pdGlhbGl6ZSxcbn07XG4iLCIvKiEgQHByZXNlcnZlXG4gKiBudW1lcmFsLmpzXG4gKiB2ZXJzaW9uIDogMi4wLjZcbiAqIGF1dGhvciA6IEFkYW0gRHJhcGVyXG4gKiBsaWNlbnNlIDogTUlUXG4gKiBodHRwOi8vYWRhbXdkcmFwZXIuZ2l0aHViLmNvbS9OdW1lcmFsLWpzL1xuICovXG5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgICAgICBkZWZpbmUoZmFjdG9yeSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBnbG9iYWwubnVtZXJhbCA9IGZhY3RvcnkoKTtcbiAgICB9XG59KHRoaXMsIGZ1bmN0aW9uICgpIHtcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgIFZhcmlhYmxlc1xuICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAgIHZhciBudW1lcmFsLFxuICAgICAgICBfLFxuICAgICAgICBWRVJTSU9OID0gJzIuMC42JyxcbiAgICAgICAgZm9ybWF0cyA9IHt9LFxuICAgICAgICBsb2NhbGVzID0ge30sXG4gICAgICAgIGRlZmF1bHRzID0ge1xuICAgICAgICAgICAgY3VycmVudExvY2FsZTogJ2VuJyxcbiAgICAgICAgICAgIHplcm9Gb3JtYXQ6IG51bGwsXG4gICAgICAgICAgICBudWxsRm9ybWF0OiBudWxsLFxuICAgICAgICAgICAgZGVmYXVsdEZvcm1hdDogJzAsMCcsXG4gICAgICAgICAgICBzY2FsZVBlcmNlbnRCeTEwMDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBvcHRpb25zID0ge1xuICAgICAgICAgICAgY3VycmVudExvY2FsZTogZGVmYXVsdHMuY3VycmVudExvY2FsZSxcbiAgICAgICAgICAgI
10072Hplcm9Gb3JtYXQ6IGRlZmF1bHRzLnplcm9Gb3JtYXQsXG4gICAgICAgICAgICBudWxsRm9ybWF0OiBkZWZhdWx0cy5udWxsRm9ybWF0LFxuICAgICAgICAgICAgZGVmYXVsdEZvcm1hdDogZGVmYXVsdHMuZGVmYXVsdEZvcm1hdCxcbiAgICAgICAgICAgIHNjYWxlUGVyY2VudEJ5MTAwOiBkZWZhdWx0cy5zY2FsZVBlcmNlbnRCeTEwMFxuICAgICAgICB9O1xuXG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgIENvbnN0cnVjdG9yc1xuICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAgIC8vIE51bWVyYWwgcHJvdG90eXBlIG9iamVjdFxuICAgIGZ1bmN0aW9uIE51bWVyYWwoaW5wdXQsIG51bWJlcikge1xuICAgICAgICB0aGlzLl9pbnB1dCA9IGlucHV0O1xuXG4gICAgICAgIHRoaXMuX3ZhbHVlID0gbnVtYmVyO1xuICAgIH1cblxuICAgIG51bWVyYWwgPSBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICB2YXIgdmFsdWUsXG4gICAgICAgICAgICBraW5kLFxuICAgICAgICAgICAgdW5mb3JtYXRGdW5jdGlvbixcbiAgICAgICAgICAgIHJlZ2V4cDtcblxuICAgICAgICBpZiAobnVtZXJhbC5pc051bWVyYWwoaW5wdXQpKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGlucHV0LnZhbHVlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IDAgfHwgdHlwZW9mIGlucHV0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdmFsdWUgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBudWxsIHx8IF8uaXNOYU4oaW5wdXQpKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuemVyb0Zvcm1hdCAmJiBpbnB1dCA9PT0gb3B0aW9ucy56ZXJvRm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSAwO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLm51bGxGb3JtYXQgJiYgaW5wdXQgPT09IG9wdGlvbnMubnVsbEZvcm1hdCB8fCAhaW5wdXQucmVwbGFjZSgvW14wLTldKy9nLCAnJykubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGtpbmQgaW4gZm9ybWF0cykge1xuICAgICAgICAgICAgICAgICAgICByZWdleHAgPSB0eXBlb2YgZm9ybWF0c1traW5kXS5yZWdleHBzLnVuZm9ybWF0ID09PSAnZnVuY3Rpb24nID8gZm9ybWF0c1traW5kXS5yZWdleHBzLnVuZm9ybWF0KCkgOiBmb3JtYXRzW2tpbmRdLnJlZ2V4cHMudW5mb3JtYXQ7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlZ2V4cCAmJiBpbnB1dC5tYXRjaChyZWdleHApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmZvcm1hdEZ1bmN0aW9uID0gZm9ybWF0c1traW5kXS51bmZvcm1hdDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB1bmZvcm1hdEZ1bmN0aW9uID0gdW5mb3JtYXRGdW5jdGlvbiB8fCBudW1lcmFsLl8uc3RyaW5nVG9OdW1iZXI7XG5cbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHVuZm9ybWF0RnVuY3Rpb24oaW5wdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIoaW5wdXQpfHwgbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgTnVtZXJhbChpbnB1dCwgdmFsdWUpO1xuICAgIH07XG5cbiAgICAvLyB2ZXJzaW9uIG51bWJlclxuICAgIG51bWVyYWwudmVyc2lvbiA9I
10072FZFUlNJT047XG5cbiAgICAvLyBjb21wYXJlIG51bWVyYWwgb2JqZWN0XG4gICAgbnVtZXJhbC5pc051bWVyYWwgPSBmdW5jdGlvbihvYmopIHtcbiAgICAgICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIE51bWVyYWw7XG4gICAgfTtcblxuICAgIC8vIGhlbHBlciBmdW5jdGlvbnNcbiAgICBudW1lcmFsLl8gPSBfID0ge1xuICAgICAgICAvLyBmb3JtYXRzIG51bWJlcnMgc2VwYXJhdG9ycywgZGVjaW1hbHMgcGxhY2VzLCBzaWducywgYWJicmV2aWF0aW9uc1xuICAgICAgICBudW1iZXJUb0Zvcm1hdDogZnVuY3Rpb24odmFsdWUsIGZvcm1hdCwgcm91bmRpbmdGdW5jdGlvbikge1xuICAgICAgICAgICAgdmFyIGxvY2FsZSA9IGxvY2FsZXNbbnVtZXJhbC5vcHRpb25zLmN1cnJlbnRMb2NhbGVdLFxuICAgICAgICAgICAgICAgIG5lZ1AgPSBmYWxzZSxcbiAgICAgICAgICAgICAgICBvcHREZWMgPSBmYWxzZSxcbiAgICAgICAgICAgICAgICBsZWFkaW5nQ291bnQgPSAwLFxuICAgICAgICAgICAgICAgIGFiYnIgPSAnJyxcbiAgICAgICAgICAgICAgICB0cmlsbGlvbiA9IDEwMDAwMDAwMDAwMDAsXG4gICAgICAgICAgICAgICAgYmlsbGlvbiA9IDEwMDAwMDAwMDAsXG4gICAgICAgICAgICAgICAgbWlsbGlvbiA9IDEwMDAwMDAsXG4gICAgICAgICAgICAgICAgdGhvdXNhbmQgPSAxMDAwLFxuICAgICAgICAgICAgICAgIGRlY2ltYWwgPSAnJyxcbiAgICAgICAgICAgICAgICBuZWcgPSBmYWxzZSxcbiAgICAgICAgICAgICAgICBhYmJyRm9yY2UsIC8vIGZvcmNlIGFiYnJldmlhdGlvblxuICAgICAgICAgICAgICAgIGFicyxcbiAgICAgICAgICAgICAgICBtaW4sXG4gICAgICAgICAgICAgICAgbWF4LFxuICAgICAgICAgICAgICAgIHBvd2VyLFxuICAgICAgICAgICAgICAgIGludCxcbiAgICAgICAgICAgICAgICBwcmVjaXNpb24sXG4gICAgICAgICAgICAgICAgc2lnbmVkLFxuICAgICAgICAgICAgICAgIHRob3VzYW5kcyxcbiAgICAgICAgICAgICAgICBvdXRwdXQ7XG5cbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBuZXZlciBmb3JtYXQgYSBudWxsIHZhbHVlXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlIHx8IDA7XG5cbiAgICAgICAgICAgIGFicyA9IE1hdGguYWJzKHZhbHVlKTtcblxuICAgICAgICAgICAgLy8gc2VlIGlmIHdlIHNob3VsZCB1c2UgcGFyZW50aGVzZXMgZm9yIG5lZ2F0aXZlIG51bWJlciBvciBpZiB3ZSBzaG91bGQgcHJlZml4IHdpdGggYSBzaWduXG4gICAgICAgICAgICAvLyBpZiBib3RoIGFyZSBwcmVzZW50IHdlIGRlZmF1bHQgdG8gcGFyZW50aGVzZXNcbiAgICAgICAgICAgIGlmIChudW1lcmFsLl8uaW5jbHVkZXMoZm9ybWF0LCAnKCcpKSB7XG4gICAgICAgICAgICAgICAgbmVnUCA9IHRydWU7XG4gICAgICAgICAgICAgICAgZm9ybWF0ID0gZm9ybWF0LnJlcGxhY2UoL1tcXCh8XFwpXS9nLCAnJyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG51bWVyYWwuXy5pbmNsdWRlcyhmb3JtYXQsICcrJykgfHwgbnVtZXJhbC5fLmluY2x1ZGVzKGZvcm1hdCwgJy0nKSkge1xuICAgICAgICAgICAgICAgIHNpZ25lZCA9IG51bWVyYWwuXy5pbmNsdWRlcyhmb3JtYXQsICcrJykgPyBmb3JtYXQuaW5kZXhPZignKycpIDogdmFsdWUgPCAwID8gZm9ybWF0LmluZGV4T2YoJy0nKSA6IC0xO1xuICAgICAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdC5yZXBsYWNlKC9bXFwrfFxcLV0vZywgJycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBzZWUgaWYgYWJicmV2aWF0aW9uIGlzIHdhbnRlZFxuICAgICAgICAgICAgaWYgKG51bWVyYWwuXy5pbmNsdWRlcyhmb3JtYXQsICdhJykpIHtcbiAgICAgICAgICAgICAgICBhYmJyRm9yY2UgPSBmb3JtYXQubWF0Y2goL2Eoa3xtfGJ8dCk/Lyk7XG5cbiAgICAgICAgICAgICAgICBhYmJyRm9yY2UgPSBhYmJyRm9yY2UgPyBhYmJyRm9yY2VbMV0gOiBmYWxzZTtcblxuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGZvciBzcGFjZSBiZWZvcmUgYWJicmV2aWF0aW9uXG4gICAgICAgICAgICAgICAgaWYgKG51bWVyYWwuXy5pbmNsdWRlcyhmb3JtYXQsICcgYScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFiYnIgPSAnICc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9ybWF0ID0gZm9ybWF0LnJlcGxhY2UobmV3IFJlZ0V4cChhYmJyICsgJ2Fba21idF0/JyksICcnKTtcblxuICAgICAgICAgICAgICAgIGlmIChhYnMgPj0gdHJpbGxpb24gJiYgIWFiYnJGb3JjZSB8fCBhYmJyRm9yY2UgPT09ICd0Jykge1xuICAgICAgICAgICAgICAgICAgICAvLyB0cmlsbGlvblxuICAgICAgICAgICAgICAgICAgICBhYmJyICs9IGxvY2FsZS5hYmJyZXZpYXRpb25zLnRyaWxsaW9uO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlIC8gdHJpbGxpb247XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhYnMgPCB0cmlsbGlvbiAmJiBhYnMgPj0gYmlsbGlvbiAmJiAhYWJickZvcmNlIHx8IGFiYnJGb3JjZSA9PT0gJ2InKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGJpbGxpb25cbiAgICAgICAgICAgICAgICAgICAgYWJiciArPSBsb2NhbGUuYWJicmV2aWF0aW9ucy5iaWxsaW9uO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlIC8gYmlsbGlvbjtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFicyA8IGJpbGxpb24gJiYgYWJzID49IG1pbGxpb24gJiYgIWFiYnJGb3JjZSB8fCBhYmJyRm9yY2UgPT09ICdtJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBtaWxsaW9uXG4gICAgICAgICAgICAgICAgICAgIGFiYnIgKz0gbG9jYWxlLmFiYnJldmlhdGlvbnMubWlsbGlvbjtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSAvIG1pbGxpb247XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhYnMgPCBtaWxsaW9uICYmIGFicyA+PSB0aG91c2FuZCAmJiAhYWJickZvcmNlIHx8IGFiYnJGb3JjZSA9PT0gJ2snKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRob3VzYW5kXG4gICAgICAgICAgICAgICAgICAgIGFiYnIgKz0gbG9jYWxlLmFiYnJldmlhdGlvbnMudGhvdXNhbmQ7XG4gICAgICAgICAgICAgICAgICAgI
10072HZhbHVlID0gdmFsdWUgLyB0aG91c2FuZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNoZWNrIGZvciBvcHRpb25hbCBkZWNpbWFsc1xuICAgICAgICAgICAgaWYgKG51bWVyYWwuXy5pbmNsdWRlcyhmb3JtYXQsICdbLl0nKSkge1xuICAgICAgICAgICAgICAgIG9wdERlYyA9IHRydWU7XG4gICAgICAgICAgICAgICAgZm9ybWF0ID0gZm9ybWF0LnJlcGxhY2UoJ1suXScsICcuJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGJyZWFrIG51bWJlciBhbmQgZm9ybWF0XG4gICAgICAgICAgICBpbnQgPSB2YWx1ZS50b1N0cmluZygpLnNwbGl0KCcuJylbMF07XG4gICAgICAgICAgICBwcmVjaXNpb24gPSBmb3JtYXQuc3BsaXQoJy4nKVsxXTtcbiAgICAgICAgICAgIHRob3VzYW5kcyA9IGZvcm1hdC5pbmRleE9mKCcsJyk7XG4gICAgICAgICAgICBsZWFkaW5nQ291bnQgPSAoZm9ybWF0LnNwbGl0KCcuJylbMF0uc3BsaXQoJywnKVswXS5tYXRjaCgvMC9nKSB8fCBbXSkubGVuZ3RoO1xuXG4gICAgICAgICAgICBpZiAocHJlY2lzaW9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKG51bWVyYWwuXy5pbmNsdWRlcyhwcmVjaXNpb24sICdbJykpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uID0gcHJlY2lzaW9uLnJlcGxhY2UoJ10nLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbiA9IHByZWNpc2lvbi5zcGxpdCgnWycpO1xuICAgICAgICAgICAgICAgICAgICBkZWNpbWFsID0gbnVtZXJhbC5fLnRvRml4ZWQodmFsdWUsIChwcmVjaXNpb25bMF0ubGVuZ3RoICsgcHJlY2lzaW9uWzFdLmxlbmd0aCksIHJvdW5kaW5nRnVuY3Rpb24sIHByZWNpc2lvblsxXS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlY2ltYWwgPSBudW1lcmFsLl8udG9GaXhlZCh2YWx1ZSwgcHJlY2lzaW9uLmxlbmd0aCwgcm91bmRpbmdGdW5jdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaW50ID0gZGVjaW1hbC5zcGxpdCgnLicpWzBdO1xuXG4gICAgICAgICAgICAgICAgaWYgKG51bWVyYWwuXy5pbmNsdWRlcyhkZWNpbWFsLCAnLicpKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlY2ltYWwgPSBsb2NhbGUuZGVsaW1pdGVycy5kZWNpbWFsICsgZGVjaW1hbC5zcGxpdCgnLicpWzFdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlY2ltYWwgPSAnJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAob3B0RGVjICYmIE51bWJlcihkZWNpbWFsLnNsaWNlKDEpKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBkZWNpbWFsID0gJyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbnQgPSBudW1lcmFsLl8udG9GaXhlZCh2YWx1ZSwgMCwgcm91bmRpbmdGdW5jdGlvbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNoZWNrIGFiYnJldmlhdGlvbiBhZ2FpbiBhZnRlciByb3VuZGluZ1xuICAgICAgICAgICAgaWYgKGFiYnIgJiYgIWFiYnJGb3JjZSAmJiBOdW1iZXIoaW50KSA+PSAxMDAwICYmIGFiYnIgIT09IGxvY2FsZS5hYmJyZXZpYXRpb25zLnRyaWxsaW9uKSB7XG4gICAgICAgICAgICAgICAgaW50ID0gU3RyaW5nKE51bWJlcihpbnQpIC8gMTAwMCk7XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGFiYnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBsb2NhbGUuYWJicmV2aWF0aW9ucy50aG91c2FuZDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFiYnIgPSBsb2NhbGUuYWJicmV2aWF0aW9ucy5taWxsaW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgbG9jYWxlLmFiYnJldmlhdGlvbnMubWlsbGlvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFiYnIgPSBsb2NhbGUuYWJicmV2aWF0aW9ucy5iaWxsaW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgbG9jYWxlLmFiYnJldmlhdGlvbnMuYmlsbGlvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFiYnIgPSBsb2NhbGUuYWJicmV2aWF0aW9ucy50cmlsbGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAvLyBmb3JtYXQgbnVtYmVyXG4gICAgICAgICAgICBpZiAobnVtZXJhbC5fLmluY2x1ZGVzKGludCwgJy0nKSkge1xuICAgICAgICAgICAgICAgIGludCA9IGludC5zbGljZSgxKTtcbiAgICAgICAgICAgICAgICBuZWcgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaW50Lmxlbmd0aCA8IGxlYWRpbmdDb3VudCkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBsZWFkaW5nQ291bnQgLSBpbnQubGVuZ3RoOyBpID4gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICAgIGludCA9ICcwJyArIGludDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aG91c2FuZHMgPiAtMSkge1xuICAgICAgICAgICAgICAgIGludCA9IGludC50b1N0cmluZygpLnJlcGxhY2UoLyhcXGQpKD89KFxcZHszfSkrKD8hXFxkKSkvZywgJyQxJ
10072yArIGxvY2FsZS5kZWxpbWl0ZXJzLnRob3VzYW5kcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmb3JtYXQuaW5kZXhPZignLicpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaW50ID0gJyc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG91dHB1dCA9IGludCArIGRlY2ltYWwgKyAoYWJiciA/IGFiYnIgOiAnJyk7XG5cbiAgICAgICAgICAgIGlmIChuZWdQKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gKG5lZ1AgJiYgbmVnID8gJygnIDogJycpICsgb3V0cHV0ICsgKG5lZ1AgJiYgbmVnID8gJyknIDogJycpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoc2lnbmVkID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gc2lnbmVkID09PSAwID8gKG5lZyA/ICctJyA6ICcrJykgKyBvdXRwdXQgOiBvdXRwdXQgKyAobmVnID8gJy0nIDogJysnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5lZykge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAnLScgKyBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICAvLyB1bmZvcm1hdHMgbnVtYmVycyBzZXBhcmF0b3JzLCBkZWNpbWFscyBwbGFjZXMsIHNpZ25zLCBhYmJyZXZpYXRpb25zXG4gICAgICAgIHN0cmluZ1RvTnVtYmVyOiBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgICAgICAgIHZhciBsb2NhbGUgPSBsb2NhbGVzW29wdGlvbnMuY3VycmVudExvY2FsZV0sXG4gICAgICAgICAgICAgICAgc3RyaW5nT3JpZ2luYWwgPSBzdHJpbmcsXG4gICAgICAgICAgICAgICAgYWJicmV2aWF0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgdGhvdXNhbmQ6IDMsXG4gICAgICAgICAgICAgICAgICAgIG1pbGxpb246IDYsXG4gICAgICAgICAgICAgICAgICAgIGJpbGxpb246IDksXG4gICAgICAgICAgICAgICAgICAgIHRyaWxsaW9uOiAxMlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYWJicmV2aWF0aW9uLFxuICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgIGksXG4gICAgICAgICAgICAgICAgcmVnZXhwO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy56ZXJvRm9ybWF0ICYmIHN0cmluZyA9PT0gb3B0aW9ucy56ZXJvRm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSAwO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLm51bGxGb3JtYXQgJiYgc3RyaW5nID09PSBvcHRpb25zLm51bGxGb3JtYXQgfHwgIXN0cmluZy5yZXBsYWNlKC9bXjAtOV0rL2csICcnKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gMTtcblxuICAgICAgICAgICAgICAgIGlmIChsb2NhbGUuZGVsaW1pdGVycy5kZWNpbWFsICE9PSAnLicpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UoL1xcLi9nLCAnJykucmVwbGFjZShsb2NhbGUuZGVsaW1pdGVycy5kZWNpbWFsLCAnLicpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvciAoYWJicmV2aWF0aW9uIGluIGFiYnJldmlhdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVnZXhwID0gbmV3IFJlZ0V4cCgnW15hLXpBLVpdJyArIGxvY2FsZS5hYmJyZXZpYXRpb25zW2FiYnJldmlhdGlvbl0gKyAnKD86XFxcXCl8KFxcXFwnICsgbG9jYWxlLmN1cnJlbmN5LnN5bWJvbCArICcpPyg/OlxcXFwpKT8pPyQnKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RyaW5nT3JpZ2luYWwubWF0Y2gocmVnZXhwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgKj0gTWF0aC5wb3coMTAsIGFiYnJldmlhdGlvbnNbYWJicmV2aWF0aW9uXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGZvciBuZWdhdGl2ZSBudW1iZXJcbiAgICAgICAgICAgICAgICB2YWx1ZSAqPSAoc3RyaW5nLnNwbGl0KCctJykubGVuZ3RoICsgTWF0aC5taW4oc3RyaW5nLnNwbGl0KCcoJykubGVuZ3RoIC0gMSwgc3RyaW5nLnNwbGl0KCcpJykubGVuZ3RoIC0gMSkpICUgMiA/IDEgOiAtMTtcblxuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBub24gbnVtYmVyc1xuICAgICAgICAgICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC9bXjAtOVxcLl0rL2csICcnKTtcblxuICAgICAgICAgICAgICAgIHZhbHVlICo9IE51bWJlcihzdHJpbmcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIGlzTmFOOiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgaXNOYU4odmFsdWUpO1xuICAgICAgICB9LFxuICAgICAgICBpbmNsdWRlczogZnVuY3Rpb24oc3RyaW5nLCBzZWFyY2gpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcuaW5kZXhPZihzZWFyY2gpICE9PSAtMTtcbiAgICAgICAgfSxcbiAgICAgICAgaW5zZXJ0OiBmdW5jdGlvbihzdHJpbmcsIHN1YlN0cmluZywgc3RhcnQpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcuc2xpY2UoMCwgc3RhcnQpICsgc3ViU3RyaW5nICsgc3RyaW5nLnNsaWNlKHN0YXJ0KTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVkdWNlOiBmdW5jdGlvbihhcnJheSwgY2FsbGJhY2sgLyosIGluaXRpYWxWYWx1ZSovKSB7XG4gICAgICAgICAgICBpZiAodGhpcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FycmF5LnByb3RvdHlwZS5yZWR1Y2UgY2FsbGVkIG9uIG51bGwgb3IgdW5kZWZpbmVkJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGNhbGxiYWNrICsgJyBpcyBub3QgYSBmdW5jdGlvbicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2Y
10072XIgdCA9IE9iamVjdChhcnJheSksXG4gICAgICAgICAgICAgICAgbGVuID0gdC5sZW5ndGggPj4+IDAsXG4gICAgICAgICAgICAgICAgayA9IDAsXG4gICAgICAgICAgICAgICAgdmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBhcmd1bWVudHNbMl07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHdoaWxlIChrIDwgbGVuICYmICEoayBpbiB0KSkge1xuICAgICAgICAgICAgICAgICAgICBrKys7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGsgPj0gbGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1JlZHVjZSBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRbaysrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoOyBrIDwgbGVuOyBrKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoayBpbiB0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gY2FsbGJhY2sodmFsdWUsIHRba10sIGssIHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbXB1dGVzIHRoZSBtdWx0aXBsaWVyIG5lY2Vzc2FyeSB0byBtYWtlIHggPj0gMSxcbiAgICAgICAgICogZWZmZWN0aXZlbHkgZWxpbWluYXRpbmcgbWlzY2FsY3VsYXRpb25zIGNhdXNlZCBieVxuICAgICAgICAgKiBmaW5pdGUgcHJlY2lzaW9uLlxuICAgICAgICAgKi9cbiAgICAgICAgbXVsdGlwbGllcjogZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgIHZhciBwYXJ0cyA9IHgudG9TdHJpbmcoKS5zcGxpdCgnLicpO1xuXG4gICAgICAgICAgICByZXR1cm4gcGFydHMubGVuZ3RoIDwgMiA/IDEgOiBNYXRoLnBvdygxMCwgcGFydHNbMV0ubGVuZ3RoKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdpdmVuIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cywgcmV0dXJucyB0aGUgbWF4aW11bVxuICAgICAgICAgKiBtdWx0aXBsaWVyIHRoYXQgbXVzdCBiZSB1c2VkIHRvIG5vcm1hbGl6ZSBhbiBvcGVyYXRpb24gaW52b2x2aW5nXG4gICAgICAgICAqIGFsbCBvZiB0aGVtLlxuICAgICAgICAgKi9cbiAgICAgICAgY29ycmVjdGlvbkZhY3RvcjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuXG4gICAgICAgICAgICByZXR1cm4gYXJncy5yZWR1Y2UoZnVuY3Rpb24oYWNjdW0sIG5leHQpIHtcbiAgICAgICAgICAgICAgICB2Y
10072XIgbW4gPSBfLm11bHRpcGxpZXIobmV4dCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjY3VtID4gbW4gPyBhY2N1bSA6IG1uO1xuICAgICAgICAgICAgfSwgMSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiB0b0ZpeGVkKCkgdGhhdCB0cmVhdHMgZmxvYXRzIG1vcmUgbGlrZSBkZWNpbWFsc1xuICAgICAgICAgKlxuICAgICAgICAgKiBGaXhlcyBiaW5hcnkgcm91bmRpbmcgaXNzdWVzIChlZy4gKDAuNjE1KS50b0ZpeGVkKDIpID09PSAnMC42MScpIHRoYXQgcHJlc2VudFxuICAgICAgICAgKiBwcm9ibGVtcyBmb3IgYWNjb3VudGluZy0gYW5kIGZpbmFuY2UtcmVsYXRlZCBzb2Z0d2FyZS5cbiAgICAgICAgICovXG4gICAgICAgIHRvRml4ZWQ6IGZ1bmN0aW9uKHZhbHVlLCBtYXhEZWNpbWFscywgcm91bmRpbmdGdW5jdGlvbiwgb3B0aW9uYWxzKSB7XG4gICAgICAgICAgICB2YXIgc3BsaXRWYWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCkuc3BsaXQoJy4nKSxcbiAgICAgICAgICAgICAgICBtaW5EZWNpbWFscyA9IG1heERlY2ltYWxzIC0gKG9wdGlvbmFscyB8fCAwKSxcbiAgICAgICAgICAgICAgICBib3VuZGVkUHJlY2lzaW9uLFxuICAgICAgICAgICAgICAgIG9wdGlvbmFsc1JlZ0V4cCxcbiAgICAgICAgICAgICAgICBwb3dlcixcbiAgICAgICAgICAgICAgICBvdXRwdXQ7XG5cbiAgICAgICAgICAgIC8vIFVzZSB0aGUgc21hbGxlc3QgcHJlY2lzaW9uIHZhbHVlIHBvc3NpYmxlIHRvIGF2b2lkIGVycm9ycyBmcm9tIGZsb2F0aW5nIHBvaW50IHJlcHJlc2VudGF0aW9uXG4gICAgICAgICAgICBpZiAoc3BsaXRWYWx1ZS
100725sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgICAgYm91bmRlZFByZWNpc2lvbiA9IE1hdGgubWluKE1hdGgubWF4KHNwbGl0VmFsdWVbMV0ubGVuZ3RoLCBtaW5EZWNpbWFscyksIG1heERlY2ltYWxzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGJvdW5kZWRQcmVjaXNpb24gPSBtaW5EZWNpbWFscztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcG93ZXIgPSBNYXRoLnBvdygxMCwgYm91bmRlZFByZWNpc2lvbik7XG5cbiAgICAgICAgICAgIC8vIE11bHRpcGx5IHVwIGJ5IHByZWNpc2lvbiwgcm91bmQgYWNjdXJhdGVseSwgdGhlbiBkaXZpZGUgYW5kIHVzZSBuYXRpdmUgdG9GaXhlZCgpOlxuICAgICAgICAgICAgb3V0cHV0ID0gKHJvdW5kaW5nRnVuY3Rpb24odmFsdWUgKyAnZSsnICsgYm91bmRlZFByZWNpc2lvbikgLyBwb3dlcikudG9GaXhlZChib3VuZGVkUHJlY2lzaW9uKTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbmFscyA+IG1heERlY2ltYWxzIC0gYm91bmRlZFByZWNpc2lvbikge1xuICAgICAgICAgICAgICAgIG9wdGlvbmFsc1JlZ0V4cCA9IG5ldyBSZWdFeHAoJ1xcXFwuPzB7MSwnICsgKG9wdGlvbmFscyAtIChtYXhEZWNpbWFscyAtIGJvdW5kZWRQcmVjaXNpb24pKSArICd9JCcpO1xuICAgICAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dC5yZXBsYWNlKG9wdGlvbmFsc1JlZ0V4cCwgJycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8vIGF2YWxpYWJsZSBvcHRpb25zXG4gICAgbnVtZXJhbC5vcHRpb25zID0gb3B0aW9ucztcblxuICAgIC8vIGF2YWxpYWJsZSBmb3JtYXRzXG4gICAgbnVtZXJhbC5mb3JtYXRzID0gZm9ybWF0cztcblxuICAgIC8vIGF2YWxpYWJsZSBmb3JtYXRzXG4gICAgbnVtZXJhbC5sb2NhbGVzID0gbG9jYWxlcztcblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgY3VycmVudCBsb2NhbGUuICBJZlxuICAgIC8vIG5vIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGluLCBpdCB3aWxsIHNpbXBseSByZXR1cm4gdGhlIGN1cnJlbnQgZ2xvYmFsXG4gICAgLy8gbG9jYWxlIGtleS5cbiAgICBudW1lcmFsLmxvY2FsZSA9IGZ1bmN0aW9uKGtleSkge1xuICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICBvcHRpb25zLmN1cnJlbnRMb2NhbGUgPSBrZXkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcHRpb25zLmN1cnJlbnRMb2NhbGU7XG4gICAgfTtcblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBsb2FkZWQgbG9jYWxlIGRhdGEuICBJZlxuICAgIC8vIG5vIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGluLCBpdCB3aWxsIHNpbXBseSByZXR1cm4gdGhlIGN1cnJlbnRcbiAgICAvLyBnbG9iYWwgbG9jYWxlIG9iamVjdC5cbiAgICBudW1lcmFsLmxvY2FsZURhdGEgPSBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbGVzW29wdGlvbnMuY3VycmVudExvY2FsZV07XG4gICAgICAgIH1cblxuICAgICAgICBrZXkgPSBrZXkudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBpZiAoIWxvY2FsZXNba2V5XSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGxvY2FsZSA6ICcgKyBrZXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGxvY2FsZXNba2V5XTtcbiAgICB9O1xuXG4gICAgbnVtZXJhbC5yZXNldCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBkZWZhdWx0cykge1xuICAgICAgICAgICAgb3B0aW9uc1twcm9wZXJ0eV0gPSBkZWZhdWx0c1twcm9wZXJ0eV07XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgbnVtZXJhbC56ZXJvRm9ybWF0ID0gZnVuY3Rpb24oZm9ybWF0KSB7XG4gICAgICAgIG9wdGlvbnMuemVyb0Zvcm1hdCA9IHR5cGVvZihmb3JtYXQpID09PSAnc3RyaW5nJyA/IGZvcm1hdCA6IG51bGw7XG4gICAgfTtcblxuICAgIG51bWVyYWwubnVsbEZvcm1hdCA9IGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgb3B0aW9ucy5udWxsRm9ybWF0ID0gdHlwZW9mKGZvcm1hdCkgPT09ICdzdHJpbmcnID8gZm9ybWF0IDogbnVsbDtcbiAgICB9O1xuXG4gICAgbnVtZXJhbC5kZWZhdWx0Rm9ybWF0ID0gZnVuY3Rpb24oZm9ybWF0KSB7XG4gICAgICAgIG9wdGlvbnMuZGVmYXVsdEZvcm1hdCA9IHR5cGVvZihmb3JtYXQpID09PSAnc3RyaW5nJyA/IGZvcm1hdCA6ICcwLjAnO1xuICAgIH07XG5cbiAgICBudW1lcmFsLnJlZ2lzdGVyID0gZnVuY3Rpb24odHlwZSwgbmFtZSwgZm9ybWF0KSB7XG4gICAgICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgaWYgKHRoaXNbdHlwZSArICdzJ11bbmFtZV0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IobmFtZSArICcgJyArIHR5cGUgKyAnIGFscmVhZHkgcmVnaXN0ZXJlZC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXNbdHlwZSArICdzJ11bbmFtZV0gPSBmb3JtYXQ7XG5cbiAgICAgICAgcmV0dXJuIGZvcm1hdDtcbiAgICB9O1xuXG5cbiAgICBudW1lcmFsLnZhbGlkYXRlID0gZnVuY3Rpb24odmFsLCBjdWx0dXJlKSB7XG4gICAgICAgIHZhciBfZGVjaW1hbFNlcCxcbiAgICAgICAgICAgIF90aG91c2FuZFNlcCxcbiAgICAgICAgICAgIF9jdXJyU3ltYm9sLFxuICAgICAgICAgICAgX3ZhbEFycmF5LFxuICAgICAgICAgICAgX2FiYnJPYmosXG4gICAgICAgICAgICBfdGhvdXNhbmRSZWdFeCxcbiAgICAgICAgICAgIGxvY2FsZURhdGEsXG4gICAgICAgICAgICB0ZW1wO1xuXG4gICAgICAgIC8vY29lcmNlIHZhbCB0byBzdHJpbmdcbiAgICAgICAgaWYgKHR5cGVvZiB2YWwgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YWwgKz0gJyc7XG5cbiAgICAgICAgICAgIGlmIChjb25zb2xlLndhcm4pIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ051bWVyYWwuanM6IFZhbHVlIGlzIG5vdCBzdHJpbmcuIEl0IGhhcyBiZWVuIGNvLWVyY2VkIHRvOiAnLCB2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy90cmltIHdoaXRlc3BhY2VzIGZyb20gZWl0aGVyIHNpZGVzXG4gICAgICAgI
10072HZhbCA9IHZhbC50cmltKCk7XG5cbiAgICAgICAgLy9pZiB2YWwgaXMganVzdCBkaWdpdHMgcmV0dXJuIHRydWVcbiAgICAgICAgaWYgKCEhdmFsLm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvL2lmIHZhbCBpcyBlbXB0eSByZXR1cm4gZmFsc2VcbiAgICAgICAgaWYgKHZhbCA9PT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vZ2V0IHRoZSBkZWNpbWFsIGFuZCB0aG91c2FuZHMgc2VwYXJhdG9yIGZyb20gbnVtZXJhbC5sb2NhbGVEYXRhXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvL2NoZWNrIGlmIHRoZSBjdWx0dXJlIGlzIHVuZGVyc3Rvb2QgYnkgbnVtZXJhbC4gaWYgbm90LCBkZWZhdWx0IGl0IHRvIGN1cnJlbnQgbG9jYWxlXG4gICAgICAgICAgICBsb2NhbGVEYXRhID0gbnVtZXJhbC5sb2NhbGVEYXRhKGN1bHR1cmUpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2NhbGVEYXRhID0gbnVtZXJhbC5sb2NhbGVEYXRhKG51bWVyYWwubG9jYWxlKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9zZXR1cCB0aGUgZGVsaW1pdGVycyBhbmQgY3VycmVuY3kgc3ltYm9sIGJhc2VkIG9uIGN1bHR1cmUvbG9jYWxlXG4gICAgICAgIF9jdXJyU3ltYm9sID0gbG9jYWxlRGF0YS5jdXJyZW5jeS5zeW1ib2w7XG4gICAgICAgIF9hYmJyT2JqID0gbG9jYWxlRGF0YS5hYmJyZXZpYXRpb25zO1xuICAgICAgICBfZGVjaW1hbFNlcCA9IGxvY2FsZURhdGEuZGVsaW1pdGVycy5kZWNpbWFsO1xuICAgICAgICBpZiAobG9jYWxlRGF0YS5kZWxpbWl0ZXJzLnRob3VzYW5kcyA9PT0gJy4nKSB7XG4gICAgICAgICAgICBfdGhvdXNhbmRTZXAgPSAnXFxcXC4nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX3Rob3VzYW5kU2VwID0gbG9jYWxlRGF0YS5kZWxpbWl0ZXJzLnRob3VzYW5kcztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHZhbGlkYXRpbmcgY3VycmVuY3kgc3ltYm9sXG4gICAgICAgIHRlbXAgPSB2YWwubWF0Y2goL15bXlxcZF0rLyk7XG4gICAgICAgIGlmICh0ZW1wICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YWwgPSB2YWwuc3Vic3RyKDEpO1xuICAgICAgICAgICAgaWYgKHRlbXBbMF0gIT09IF9jdXJyU3ltYm9sKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy92YWxpZGF0aW5nIGFiYnJldmlhdGlvbiBzeW1ib2xcbiAgICAgICAgdGVtcCA9IHZhbC5tYXRjaCgvW15cXGRdKyQvKTtcbiAgICAgICAgaWYgKHRlbXAgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhbCA9IHZhbC5zbGljZSgwLCAtMSk7XG4gICAgICAgICAgICBpZiAodGVtcFswXSAhPT0gX2FiYnJPYmoudGhvdXNhbmQgJiYgdGVtcFswXSAhPT0gX2FiYnJPYmoubWlsbGlvbiAmJiB0ZW1wWzBdICE9PSBfYWJick9iai5iaWxsaW9uICYmIHRlbXBbMF0gIT09IF9hYmJyT2JqLnRyaWxsaW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgX3Rob3VzYW5kUmVnRXggPSBuZXcgUmVnRXhwKF90aG91c2FuZFNlcCArICd7Mn0nKTtcblxuICAgICAgICBpZiAoIXZhbC5tYXRjaCgvW15cXGQuLF0vZykpIHtcbiAgICAgICAgICAgIF92YWxBcnJheSA9IHZhbC5zcGxpdChfZGVjaW1hbFNlcCk7XG4gICAgICAgICAgICBpZiAoX3ZhbEFycmF5Lmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChfdmFsQXJyYXkubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCAhISBfdmFsQXJyYXlbMF0ubWF0Y2goL15cXGQrLipcXGQkLykgJiYgIV92YWxBcnJheVswXS5tYXRjaChfdGhvdXNhbmRSZWdFeCkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfdmFsQXJyYXlbMF0ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCAhISBfdmFsQXJyYXlbMF0ubWF0Y2goL15cXGQrJC8pICYmICFfdmFsQXJyYXlbMF0ubWF0Y2goX3Rob3VzYW5kUmVnRXgpICYmICEhIF92YWxBcnJheVsxXS5tYXRjaCgvXlxcZCskLykpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICggISEgX3ZhbEFycmF5WzBdLm1hdGNoKC9eXFxkKy4qXFxkJC8pICYmICFfdmFsQXJyYXlbMF0ubWF0Y2goX3Rob3VzYW5kUmVnRXgpICYmICEhIF92YWxBcnJheVsxXS5tYXRjaCgvXlxcZCskLykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG5cblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgTnVtZXJhbCBQcm90b3R5cGVcbiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgICBudW1lcmFsLmZuID0gTnVtZXJhbC5wcm90b3R5cGUgPSB7XG4gICAgICAgIGNsb25lOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBudW1lcmFsKHRoaXMpO1xuICAgICAgICB9LFxuICAgICAgICBmb3JtYXQ6IGZ1bmN0aW9uKGlucHV0U3RyaW5nLCByb3VuZGluZ0Z1bmN0aW9uKSB7XG4gICAgICAgICAgICB2Y
10072XIgdmFsdWUgPSB0aGlzLl92YWx1ZSxcbiAgICAgICAgICAgICAgICBmb3JtYXQgPSBpbnB1dFN0cmluZyB8fCBvcHRpb25zLmRlZmF1bHRGb3JtYXQsXG4gICAgICAgICAgICAgICAga2luZCxcbiAgICAgICAgICAgICAgICBvdXRwdXQsXG4gICAgICAgICAgICAgICAgZm9ybWF0RnVuY3Rpb247XG5cbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBoYXZlIGEgcm91bmRpbmdGdW5jdGlvblxuICAgICAgICAgICAgcm91bmRpbmdGdW5jdGlvbiA9IHJvdW5kaW5nRnVuY3Rpb24gfHwgTWF0aC5yb3VuZDtcblxuICAgICAgICAgICAgLy8gZm9ybWF0IGJhc2VkIG9uIHZhbHVlXG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IDAgJiYgb3B0aW9ucy56ZXJvRm9ybWF0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gb3B0aW9ucy56ZXJvRm9ybWF0O1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gbnVsbCAmJiBvcHRpb25zLm51bGxGb3JtYXQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSBvcHRpb25zLm51bGxGb3JtYXQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAoa2luZCBpbiBmb3JtYXRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXQubWF0Y2goZm9ybWF0c1traW5kXS5yZWdleHBzLmZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdEZ1bmN0aW9uID0gZm9ybWF0c1traW5kXS5mb3JtYXQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9ybWF0RnVuY3Rpb24gPSBmb3JtYXRGdW5jdGlvbiB8fCBudW1lcmFsLl8ubnVtYmVyVG9Gb3JtYXQ7XG5cbiAgICAgICAgICAgICAgICBvdXRwdXQgPSBmb3JtYXRGdW5jdGlvbih2YWx1ZSwgZm9ybWF0LCByb3VuZGluZ0Z1bmN0aW9uKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBpbnB1dDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faW5wdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gTnVtYmVyKHZhbHVlKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG4gICAgICAgIGFkZDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIHZhciBjb3JyRmFjdG9yID0gXy5jb3JyZWN0aW9uRmFjdG9yLmNhbGwobnVsbCwgdGhpcy5fdmFsdWUsIHZhbHVlKTtcblxuICAgICAgICAgICAgZnVuY3Rpb24gY2JhY2soYWNjdW0sIGN1cnIsIGN1cnJJLCBPKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjY3VtICsgTWF0aC5yb3VuZChjb3JyRmFjdG9yICogY3Vycik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gXy5yZWR1Y2UoW3RoaXMuX3ZhbHVlLCB2YWx1ZV0sIGNiYWNrLCAwKSAvIGNvcnJGYWN0b3I7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuICAgICAgICBzdWJ0cmFjdDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIHZhciBjb3JyRmFjdG9yID0gXy5jb3JyZWN0aW9uRmFjdG9yLmNhbGwobnVsbCwgdGhpcy5fdmFsdWUsIHZhbHVlKTtcblxuICAgICAgICAgICAgZnVuY3Rpb24gY2JhY2soYWNjdW0sIGN1cnIsIGN1cnJJLCBPKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjY3VtIC0gTWF0aC5yb3VuZChjb3JyRmFjdG9yICogY3Vycik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gXy5yZWR1Y2UoW3ZhbHVlXSwgY2JhY2ssIE1hdGgucm91bmQodGhpcy5fdmFsdWUgKiBjb3JyRmFjdG9yKSkgLyBjb3JyRmFjdG9yO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcbiAgICAgICAgbXVsdGlwbHk6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICBmdW5jdGlvbiBjYmFjayhhY2N1bSwgY3VyciwgY3VyckksIE8pIHtcbiAgICAgICAgICAgICAgICB2Y
10072XIgY29yckZhY3RvciA9IF8uY29ycmVjdGlvbkZhY3RvcihhY2N1bSwgY3Vycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoYWNjdW0gKiBjb3JyRmFjdG9yKSAqIE1hdGgucm91bmQoY3VyciAqIGNvcnJGYWN0b3IpIC8gTWF0aC5yb3VuZChjb3JyRmFjdG9yICogY29yckZhY3Rvcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gXy5yZWR1Y2UoW3RoaXMuX3ZhbHVlLCB2YWx1ZV0sIGNiYWNrLCAxKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG4gICAgICAgIGRpdmlkZTogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uIGNiYWNrKGFjY3VtLCBjdXJyLCBjdXJySSwgTykge1xuICAgICAgICAgICAgICAgIHZhciBjb3JyRmFjdG9yID0gXy5jb3JyZWN0aW9uRmFjdG9yKGFjY3VtLCBjdXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChhY2N1bSAqIGNvcnJGYWN0b3IpIC8gTWF0aC5yb3VuZChjdXJyICogY29yckZhY3Rvcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gXy5yZWR1Y2UoW3RoaXMuX3ZhbHVlLCB2YWx1ZV0sIGNiYWNrKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG4gICAgICAgIGRpZmZlcmVuY2U6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5hYnMobnVtZXJhbCh0aGlzLl92YWx1ZSkuc3VidHJhY3QodmFsdWUpLnZhbHVlKCkpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgRGVmYXVsdCBMb2NhbGUgJiYgRm9ybWF0XG4gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gICAgbnVtZXJhbC5yZWdpc3RlcignbG9jYWxlJywgJ2VuJywge1xuICAgICAgICBkZWxpbWl0ZXJzOiB7XG4gICAgICAgICAgICB0aG91c2FuZHM6ICcsJyxcbiAgICAgICAgICAgIGRlY2ltYWw6ICcuJ1xuICAgICAgICB9LFxuICAgICAgICBhYmJyZXZpYXRpb25zOiB7XG4gICAgICAgICAgICB0aG91c2FuZDogJ2snLFxuICAgICAgICAgICAgbWlsbGlvbjogJ20nLFxuICAgICAgICAgICAgYmlsbGlvbjogJ2InLFxuICAgICAgICAgICAgdHJpbGxpb246ICd0J1xuICAgICAgICB9LFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbihudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTA7XG4gICAgICAgICAgICByZXR1cm4gKH5+KG51bWJlciAlIDEwMCAvIDEwKSA9PT0gMSkgPyAndGgnIDpcbiAgICAgICAgICAgICAgICAoYiA9PT0gMSkgPyAnc3QnIDpcbiAgICAgICAgICAgICAgICAoYiA9PT0gMikgPyAnbmQnIDpcbiAgICAgICAgICAgICAgICAoYiA9PT0gMykgPyAncmQnIDogJ3RoJztcbiAgICAgICAgfSxcbiAgICAgICAgY3VycmVuY3k6IHtcbiAgICAgICAgICAgIHN5bWJvbDogJyQnXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIFxuXG4oZnVuY3Rpb24oKSB7XG4gICAgICAgIG51bWVyYWwucmVnaXN0ZXIoJ2Zvcm1hdCcsICdicHMnLCB7XG4gICAgICAgICAgICByZWdleHBzOiB7XG4gICAgICAgICAgICAgICAgZm9ybWF0OiAvKEJQUykvLFxuICAgICAgICAgICAgICAgIHVuZm9ybWF0OiAvKEJQUykvXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZm9ybWF0OiBmdW5jdGlvbih2YWx1ZSwgZm9ybWF0LCByb3VuZGluZ0Z1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNwYWNlID0gbnVtZXJhbC5fLmluY2x1ZGVzKGZvcm1hdCwgJyBCUFMnKSA/ICcgJyA6ICcnLFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQ7XG5cbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICogMTAwMDA7XG5cbiAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3Igc3BhY2UgYmVmb3JlIEJQU1xuICAgICAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdC5yZXBsYWNlKC9cXHM/QlBTLywgJycpO1xuXG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gbnVtZXJhbC5fLm51bWJlclRvRm9ybWF0KHZhbHVlLCBmb3JtYXQsIHJvdW5kaW5nRnVuY3Rpb24pO1xuXG4gICAgICAgICAgICAgICAgaWYgKG51bWVyYWwuXy5pbmNsdWRlcyhvdXRwdXQsICcpJykpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnNwbGl0KCcnKTtcblxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQuc3BsaWNlKC0xLCAwLCBzcGFjZSArICdCUFMnKTtcblxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBvdXRwdXQuam9pbignJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0ICsgc3BhY2UgKyAnQlBTJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVuZm9ybWF0OiBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKyhudW1lcmFsLl8uc3RyaW5nVG9OdW1iZXIoc3RyaW5nKSAqIDAuMDAwMSkudG9GaXhlZCgxNSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xufSkoKTtcblxuXG4oZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBkZWNpbWFsID0ge1xuICAgICAgICAgICAgYmFzZTogMTAwMCxcbiAgICAgICAgICAgIHN1ZmZpeGVzOiBbJ0InLCAnS0InLCAnTUInLCAnR0InLCAnVEInLCAnUEInLCAnRUInLCAnWkInLCAnWUInXVxuICAgICAgICB9LFxuICAgICAgICBiaW5hcnkgPSB7XG4gICAgICAgICAgICBiYXNlOiAxMDI0LFxuICAgICAgICAgICAgc3VmZml4ZXM6IFsnQicsICdLaUInLCAnTWlCJywgJ0dpQicsICdUaUInLCAnUGlCJywgJ0VpQicsICdaaUInLCAnWWlCJ11cbiAgICAgICAgfTtcblxuICAgIHZhciBhbGxTdWZmaXhlcyA9ICBkZWNpbWFsLnN1ZmZpeGVzLmNvbmNhdChiaW5hcnkuc3VmZml4ZXMuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVjaW1hbC5zdWZmaXhlcy5pbmRleE9mKGl0ZW0pIDwgMDtcbiAgICAgICAgfSkpO1xuICAgICAgICB2Y
10072XIgdW5mb3JtYXRSZWdleCA9IGFsbFN1ZmZpeGVzLmpvaW4oJ3wnKTtcbiAgICAgICAgLy8gQWxsb3cgc3VwcG9ydCBmb3IgQlBTIChodHRwOi8vd3d3LmludmVzdG9wZWRpYS5jb20vdGVybXMvYi9iYXNpc3BvaW50LmFzcClcbiAgICAgICAgdW5mb3JtYXRSZWdleCA9ICcoJyArIHVuZm9ybWF0UmVnZXgucmVwbGFjZSgnQicsICdCKD8hUFMpJykgKyAnKSc7XG5cbiAgICBudW1lcmFsLnJlZ2lzdGVyKCdmb3JtYXQnLCAnYnl0ZXMnLCB7XG4gICAgICAgIHJlZ2V4cHM6IHtcbiAgICAgICAgICAgIGZvcm1hdDogLyhbMFxcc11pP2IpLyxcbiAgICAgICAgICAgIHVuZm9ybWF0OiBuZXcgUmVnRXhwKHVuZm9ybWF0UmVnZXgpXG4gICAgICAgIH0sXG4gICAgICAgIGZvcm1hdDogZnVuY3Rpb24odmFsdWUsIGZvcm1hdCwgcm91bmRpbmdGdW5jdGlvbikge1xuICAgICAgICAgICAgdmFyIG91dHB1dCxcbiAgICAgICAgICAgICAgICBieXRlcyA9IG51bWVyYWwuXy5pbmNsdWRlcyhmb3JtYXQsICdpYicpID8gYmluYXJ5IDogZGVjaW1hbCxcbiAgICAgICAgICAgICAgICBzdWZmaXggPSBudW1lcmFsLl8uaW5jbHVkZXMoZm9ybWF0LCAnIGInKSB8fCBudW1lcmFsLl8uaW5jbHVkZXMoZm9ybWF0LCAnIGliJykgPyAnICcgOiAnJyxcbiAgICAgICAgICAgICAgICBwb3dlcixcbiAgICAgICAgICAgICAgICBtaW4sXG4gICAgICAgICAgICAgICAgbWF4O1xuXG4gICAgICAgICAgICAvLyBjaGVjayBmb3Igc3BhY2UgYmVmb3JlXG4gICAgICAgICAgICBmb3JtYXQgPSBmb3JtYXQucmVwbGFjZSgvXFxzP2k/Yi8sICcnKTtcblxuICAgICAgICAgICAgZm9yIChwb3dlciA9IDA7IHBvd2VyIDw9IGJ5dGVzLnN1ZmZpeGVzLmxlbmd0aDsgcG93ZXIrKykge1xuICAgICAgICAgICAgICAgIG1pbiA9IE1hdGgucG93KGJ5dGVzLmJhc2UsIHBvd2VyKTtcbiAgICAgICAgICAgICAgICBtYXggPSBNYXRoLnBvdyhieXRlcy5iYXNlLCBwb3dlciArIDEpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSAwIHx8IHZhbHVlID49IG1pbiAmJiB2YWx1ZSA8IG1heCkge1xuICAgICAgICAgICAgICAgICAgICBzdWZmaXggKz0gYnl0ZXMuc3VmZml4ZXNbcG93ZXJdO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChtaW4gPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlIC8gbWluO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvdXRwdXQgPSBudW1lcmFsLl8ubnVtYmVyVG9Gb3JtYXQodmFsdWUsIGZvcm1hdCwgcm91bmRpbmdGdW5jdGlvbik7XG5cbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQgKyBzdWZmaXg7XG4gICAgICAgIH0sXG4gICAgICAgIHVuZm9ybWF0OiBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IG51bWVyYWwuXy5zdHJpbmdUb051bWJlcihzdHJpbmcpLFxuICAgICAgICAgICAgICAgIHBvd2VyLFxuICAgICAgICAgICAgICAgIGJ5dGVzTXVsdGlwbGllcjtcblxuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgZm9yIChwb3dlciA9IGRlY2ltYWwuc3VmZml4ZXMubGVuZ3RoIC0gMTsgcG93ZXIgPj0gMDsgcG93ZXItLSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobnVtZXJhbC5fLmluY2x1ZGVzKHN0cmluZywgZGVjaW1hbC5zdWZmaXhlc1twb3dlcl0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBieXRlc011bHRpcGxpZXIgPSBNYXRoLnBvdyhkZWNpbWFsLmJhc2UsIHBvd2VyKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAobnVtZXJhbC5fLmluY2x1ZGVzKHN0cmluZywgYmluYXJ5LnN1ZmZpeGVzW3Bvd2VyXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzTXVsdGlwbGllciA9IE1hdGgucG93KGJpbmFyeS5iYXNlLCBwb3dlcik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFsdWUgKj0gKGJ5dGVzTXVsdGlwbGllciB8fCAxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgfSk7XG59KSgpO1xuXG5cbihmdW5jdGlvbigpIHtcbiAgICAgICAgbnVtZXJhbC5yZWdpc3RlcignZm9ybWF0JywgJ2N1cnJlbmN5Jywge1xuICAgICAgICByZWdleHBzOiB7XG4gICAgICAgICAgICBmb3JtYXQ6IC8oXFwkKS9cbiAgICAgICAgfSxcbiAgICAgICAgZm9ybWF0OiBmdW5jdGlvbih2YWx1ZSwgZm9ybWF0LCByb3VuZGluZ0Z1bmN0aW9uKSB7XG4gICAgICAgICAgICB2Y
10072XIgbG9jYWxlID0gbnVtZXJhbC5sb2NhbGVzW251bWVyYWwub3B0aW9ucy5jdXJyZW50TG9jYWxlXSxcbiAgICAgICAgICAgICAgICBzeW1ib2xzID0ge1xuICAgICAgICAgICAgICAgICAgICBiZWZvcmU6IGZvcm1hdC5tYXRjaCgvXihbXFwrfFxcLXxcXCh8XFxzfFxcJF0qKS8pWzBdLFxuICAgICAgICAgICAgICAgICAgICBhZnRlcjogZm9ybWF0Lm1hdGNoKC8oW1xcK3xcXC18XFwpfFxcc3xcXCRdKikkLylbMF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG91dHB1dCxcbiAgICAgICAgICAgICAgICBzeW1ib2wsXG4gICAgICAgICAgICAgICAgaTtcblxuICAgICAgICAgICAgLy8gc3RyaXAgZm9ybWF0IG9mIHNwYWNlcyBhbmQgJFxuICAgICAgICAgICAgZm9ybWF0ID0gZm9ybWF0LnJlcGxhY2UoL1xccz9cXCRcXHM/LywgJycpO1xuXG4gICAgICAgICAgICAvLyBmb3JtYXQgdGhlIG51bWJlclxuICAgICAgICAgICAgb3V0cHV0ID0gbnVtZXJhbC5fLm51bWJlclRvRm9ybWF0KHZhbHVlLCBmb3JtYXQsIHJvdW5kaW5nRnVuY3Rpb24pO1xuXG4gICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGJlZm9yZSBhbmQgYWZ0ZXIgYmFzZWQgb24gdmFsdWVcbiAgICAgICAgICAgIGlmICh2YWx1ZSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgc3ltYm9scy5iZWZvcmUgPSBzeW1ib2xzLmJlZm9yZS5yZXBsYWNlKC9bXFwtXFwoXS8sICcnKTtcbiAgICAgICAgICAgICAgICBzeW1ib2xzLmFmdGVyID0gc3ltYm9scy5hZnRlci5yZXBsYWNlKC9bXFwtXFwpXS8sICcnKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPCAwICYmICghbnVtZXJhbC5fLmluY2x1ZGVzKHN5bWJvbHMuYmVmb3JlLCAnLScpICYmICFudW1lcmFsLl8uaW5jbHVkZXMoc3ltYm9scy5iZWZvcmUsICcoJykpKSB7XG4gICAgICAgICAgICAgICAgc3ltYm9scy5iZWZvcmUgPSAnLScgKyBzeW1ib2xzLmJlZm9yZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gbG9vcCB0aHJvdWdoIGVhY2ggYmVmb3JlIHN5bWJvbFxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHN5bWJvbHMuYmVmb3JlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgc3ltYm9sID0gc3ltYm9scy5iZWZvcmVbaV07XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHN5bWJvbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICckJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IG51bWVyYWwuXy5pbnNlcnQob3V0cHV0LCBsb2NhbGUuY3VycmVuY3kuc3ltYm9sLCBpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICcgJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IG51bWVyYWwuXy5pbnNlcnQob3V0cHV0LCAnICcsIGkgKyBsb2NhbGUuY3VycmVuY3kuc3ltYm9sLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBsb29wIHRocm91Z2ggZWFjaCBhZnRlciBzeW1ib2xcbiAgICAgICAgICAgIGZvciAoaSA9IHN5bWJvbHMuYWZ0ZXIubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICBzeW1ib2wgPSBzeW1ib2xzLmFmdGVyW2ldO1xuXG4gICAgICAgICAgICAgICAgc3dpdGNoIChzeW1ib2wpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnJCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBpID09PSBzeW1ib2xzLmFmdGVyLmxlbmd0aCAtIDEgPyBvdXRwdXQgKyBsb2NhbGUuY3VycmVuY3kuc3ltYm9sIDogbnVtZXJhbC5fLmluc2VydChvdXRwdXQsIGxvY2FsZS5jdXJyZW5jeS5zeW1ib2wsIC0oc3ltYm9scy5hZnRlci5sZW5ndGggLSAoMSArIGkpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnICc6XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBpID09PSBzeW1ib2xzLmFmdGVyLmxlbmd0aCAtIDEgPyBvdXRwdXQgKyAnICcgOiBudW1lcmFsLl8uaW5zZXJ0KG91dHB1dCwgJyAnLCAtKHN5bWJvbHMuYWZ0ZXIubGVuZ3RoIC0gKDEgKyBpKSArIGxvY2FsZS5jdXJyZW5jeS5zeW1ib2wubGVuZ3RoIC0gMSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICAgIH1cbiAgICB9KTtcbn0pKCk7XG5cblxuKGZ1bmN0aW9uKCkge1xuICAgICAgICBudW1lcmFsLnJlZ2lzdGVyKCdmb3JtYXQnLCAnZXhwb25lbnRpYWwnLCB7XG4gICAgICAgIHJlZ2V4cHM6IHtcbiAgICAgICAgICAgIGZvcm1hdDogLyhlXFwrfGUtKS8sXG4gICAgICAgICAgICB1bmZvcm1hdDogLyhlXFwrfGUtKS9cbiAgICAgICAgfSxcbiAgICAgICAgZm9ybWF0OiBmdW5jdGlvbih2YWx1ZSwgZm9ybWF0LCByb3VuZGluZ0Z1bmN0aW9uKSB7XG4gICAgICAgICAgICB2Y
10072XIgb3V0cHV0LFxuICAgICAgICAgICAgICAgIGV4cG9uZW50aWFsID0gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiAhbnVtZXJhbC5fLmlzTmFOKHZhbHVlKSA/IHZhbHVlLnRvRXhwb25lbnRpYWwoKSA6ICcwZSswJyxcbiAgICAgICAgICAgICAgICBwYXJ0cyA9IGV4cG9uZW50aWFsLnNwbGl0KCdlJyk7XG5cbiAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdC5yZXBsYWNlKC9lW1xcK3xcXC1dezF9MC8sICcnKTtcblxuICAgICAgICAgICAgb3V0cHV0ID0gbnVtZXJhbC5fLm51bWJlclRvRm9ybWF0KE51bWJlcihwYXJ0c1swXSksIGZvcm1hdCwgcm91bmRpbmdGdW5jdGlvbik7XG5cbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQgKyAnZScgKyBwYXJ0c1sxXTtcbiAgICAgICAgfSxcbiAgICAgICAgdW5mb3JtYXQ6IGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgICAgICAgdmFyIHBhcnRzID0gbnVtZXJhbC5fLmluY2x1ZGVzKHN0cmluZywgJ2UrJykgPyBzdHJpbmcuc3BsaXQoJ2UrJykgOiBzdHJpbmcuc3BsaXQoJ2UtJyksXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIocGFydHNbMF0pLFxuICAgICAgICAgICAgICAgIHBvd2VyID0gTnVtYmVyKHBhcnRzWzFdKTtcblxuICAgICAgICAgICAgcG93ZXIgPSBudW1lcmFsLl8uaW5jbHVkZXMoc3RyaW5nLCAnZS0nKSA/IHBvd2VyICo9IC0xIDogcG93ZXI7XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGNiYWNrKGFjY3VtLCBjdXJyLCBjdXJySSwgTykge1xuICAgICAgICAgICAgICAgIHZhciBjb3JyRmFjdG9yID0gbnVtZXJhbC5fLmNvcnJlY3Rpb25GYWN0b3IoYWNjdW0sIGN1cnIpLFxuICAgICAgICAgICAgICAgICAgICBudW0gPSAoYWNjdW0gKiBjb3JyRmFjdG9yKSAqIChjdXJyICogY29yckZhY3RvcikgLyAoY29yckZhY3RvciAqIGNvcnJGYWN0b3IpO1xuICAgICAgICAgICAgICAgIHJldHVybiBudW07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBudW1lcmFsLl8ucmVkdWNlKFt2YWx1ZSwgTWF0aC5wb3coMTAsIHBvd2VyKV0sIGNiYWNrLCAxKTtcbiAgICAgICAgfVxuICAgIH0pO1xufSkoKTtcblxuXG4oZnVuY3Rpb24oKSB7XG4gICAgICAgIG51bWVyYWwucmVnaXN0ZXIoJ2Zvcm1hdCcsICdvcmRpbmFsJywge1xuICAgICAgICByZWdleHBzOiB7XG4gICAgICAgICAgICBmb3JtYXQ6IC8obykvXG4gICAgICAgIH0sXG4gICAgICAgIGZvcm1hdDogZnVuY3Rpb24odmFsdWUsIGZvcm1hdCwgcm91bmRpbmdGdW5jdGlvbikge1xuICAgICAgICAgICAgdmFyIGxvY2FsZSA9IG51bWVyYWwubG9jYWxlc1tudW1lcmFsLm9wdGlvbnMuY3VycmVudExvY2FsZV0sXG4gICAgICAgICAgICAgICAgb3V0cHV0LFxuICAgICAgICAgICAgICAgIG9yZGluYWwgPSBudW1lcmFsLl8uaW5jbHVkZXMoZm9ybWF0LCAnIG8nKSA/ICcgJyA6ICcnO1xuXG4gICAgICAgICAgICAvLyBjaGVjayBmb3Igc3BhY2UgYmVmb3JlXG4gICAgICAgICAgICBmb3JtYXQgPSBmb3JtYXQucmVwbGFjZSgvXFxzP28vLCAnJyk7XG5cbiAgICAgICAgICAgIG9yZGluYWwgKz0gbG9jYWxlLm9yZGluYWwodmFsdWUpO1xuXG4gICAgICAgICAgICBvdXRwdXQgPSBudW1lcmFsLl8ubnVtYmVyVG9Gb3JtYXQodmFsdWUsIGZvcm1hdCwgcm91bmRpbmdGdW5jdGlvbik7XG5cbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQgKyBvcmRpbmFsO1xuICAgICAgICB9XG4gICAgfSk7XG59KSgpO1xuXG5cbihmdW5jdGlvbigpIHtcbiAgICAgICAgbnVtZXJhbC5yZWdpc3RlcignZm9ybWF0JywgJ3BlcmNlbnRhZ2UnLCB7XG4gICAgICAgIHJlZ2V4cHM6IHtcbiAgICAgICAgICAgIGZvcm1hdDogLyglKS8sXG4gICAgICAgICAgICB1bmZvcm1hdDogLyglKS9cbiAgICAgICAgfSxcbiAgICAgICAgZm9ybWF0OiBmdW5jdGlvbih2YWx1ZSwgZm9ybWF0LCByb3VuZGluZ0Z1bmN0aW9uKSB7XG4gICAgICAgICAgICB2Y
10072XIgc3BhY2UgPSBudW1lcmFsLl8uaW5jbHVkZXMoZm9ybWF0LCAnICUnKSA/ICcgJyA6ICcnLFxuICAgICAgICAgICAgICAgIG91dHB1dDtcblxuICAgICAgICAgICAgaWYgKG51bWVyYWwub3B0aW9ucy5zY2FsZVBlcmNlbnRCeTEwMCkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgKiAxMDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNoZWNrIGZvciBzcGFjZSBiZWZvcmUgJVxuICAgICAgICAgICAgZm9ybWF0ID0gZm9ybWF0LnJlcGxhY2UoL1xccz9cXCUvLCAnJyk7XG5cbiAgICAgICAgICAgIG91dHB1dCA9IG51bWVyYWwuXy5udW1iZXJUb0Zvcm1hdCh2YWx1ZSwgZm9ybWF0LCByb3VuZGluZ0Z1bmN0aW9uKTtcblxuICAgICAgICAgICAgaWYgKG51bWVyYWwuXy5pbmNsdWRlcyhvdXRwdXQsICcpJykpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSBvdXRwdXQuc3BsaXQoJycpO1xuXG4gICAgICAgICAgICAgICAgb3V0cHV0LnNwbGljZSgtMSwgMCwgc3BhY2UgKyAnJScpO1xuXG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0LmpvaW4oJycpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSBvdXRwdXQgKyBzcGFjZSArICclJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgdW5mb3JtYXQ6IGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgICAgICAgdmFyIG51bWJlciA9IG51bWVyYWwuXy5zdHJpbmdUb051bWJlcihzdHJpbmcpO1xuICAgICAgICAgICAgaWYgKG51bWVyYWwub3B0aW9ucy5zY2FsZVBlcmNlbnRCeTEwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKiAwLjAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgfVxuICAgIH0pO1xufSkoKTtcblxuXG4oZnVuY3Rpb24oKSB7XG4gICAgICAgIG51bWVyYWwucmVnaXN0ZXIoJ2Zvcm1hdCcsICd0aW1lJywge1xuICAgICAgICByZWdleHBzOiB7XG4gICAgICAgICAgICBmb3JtYXQ6IC8oOikvLFxuICAgICAgICAgICAgdW5mb3JtYXQ6IC8oOikvXG4gICAgICAgIH0sXG4gICAgICAgIGZvcm1hdDogZnVuY3Rpb24odmFsdWUsIGZvcm1hdCwgcm91bmRpbmdGdW5jdGlvbikge1xuICAgICAgICAgICAgdmFyIGhvdXJzID0gTWF0aC5mbG9vcih2YWx1ZSAvIDYwIC8gNjApLFxuICAgICAgICAgICAgICAgIG1pbnV0ZXMgPSBNYXRoLmZsb29yKCh2YWx1ZSAtIChob3VycyAqIDYwICogNjApKSAvIDYwKSxcbiAgICAgICAgICAgICAgICBzZWNvbmRzID0gTWF0aC5yb3VuZCh2YWx1ZSAtIChob3VycyAqIDYwICogNjApIC0gKG1pbnV0ZXMgKiA2MCkpO1xuXG4gICAgICAgICAgICByZXR1cm4gaG91cnMgKyAnOicgKyAobWludXRlcyA8IDEwID8gJzAnICsgbWludXRlcyA6IG1pbnV0ZXMpICsgJzonICsgKHNlY29uZHMgPCAxMCA/ICcwJyArIHNlY29uZHMgOiBzZWNvbmRzKTtcbiAgICAgICAgfSxcbiAgICAgICAgdW5mb3JtYXQ6IGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgICAgICAgdmFyIHRpbWVBcnJheSA9IHN0cmluZy5zcGxpdCgnOicpLFxuICAgICAgICAgICAgICAgIHNlY29uZHMgPSAwO1xuXG4gICAgICAgICAgICAvLyB0dXJuIGhvdXJzIGFuZCBtaW51dGVzIGludG8gc2Vjb25kcyBhbmQgYWRkIHRoZW0gYWxsIHVwXG4gICAgICAgICAgICBpZiAodGltZUFycmF5Lmxlbmd0aCA9PT0gMykge1xuICAgICAgICAgICAgICAgIC8vIGhvdXJzXG4gICAgICAgICAgICAgICAgc2Vjb25kcyA9IHNlY29uZHMgKyAoTnVtYmVyKHRpbWVBcnJheVswXSkgKiA2MCAqIDYwKTtcbiAgICAgICAgICAgICAgICAvLyBtaW51dGVzXG4gICAgICAgICAgICAgICAgc2Vjb25kcyA9IHNlY29uZHMgKyAoTnVtYmVyKHRpbWVBcnJheVsxXSkgKiA2MCk7XG4gICAgICAgICAgICAgICAgLy8gc2Vjb25kc1xuICAgICAgICAgICAgICAgIHNlY29uZHMgPSBzZWNvbmRzICsgTnVtYmVyKHRpbWVBcnJheVsyXSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRpbWVBcnJheS5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgICAgICAvLyBtaW51dGVzXG4gICAgICAgICAgICAgICAgc2Vjb25kcyA9IHNlY29uZHMgKyAoTnVtYmVyKHRpbWVBcnJheVswXSkgKiA2MCk7XG4gICAgICAgICAgICAgICAgLy8gc2Vjb25kc1xuICAgICAgICAgICAgICAgIHNlY29uZHMgPSBzZWNvbmRzICsgTnVtYmVyKHRpbWVBcnJheVsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gTnVtYmVyKHNlY29uZHMpO1xuICAgICAgICB9XG4gICAgfSk7XG59KSgpO1xuXG5yZXR1cm4gbnVtZXJhbDtcbn0pKTtcbiIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIH
10072dyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBx
10072dWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iLCIoZnVuY3Rpb24gKGdsb2JhbCwgdW5kZWZpbmVkKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBpZiAoZ2xvYmFsLnNldEltbWVkaWF0ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG5leHRIYW5kbGUgPSAxOyAvLyBTcGVjIHNheXMgZ3JlYXRlciB0aGFuIHplcm9cbiAgICB2YXIgdGFza3NCeUhhbmRsZSA9IHt9O1xuICAgIHZhciBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSBmYWxzZTtcbiAgICB2YXIgZG9jID0gZ2xvYmFsLmRvY3VtZW50O1xuICAgIHZhciByZWdpc3RlckltbWVkaWF0ZTtcblxuICAgIGZ1bmN0aW9uIHNldEltbWVkaWF0ZShjYWxsYmFjaykge1xuICAgICAgLy8gQ2FsbGJhY2sgY2FuIGVpdGhlciBiZSBhIGZ1bmN0aW9uIG9yIGEgc3RyaW5nXG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBuZXcgRnVuY3Rpb24oXCJcIiArIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICAgIC8vIENvcHkgZnVuY3Rpb24gYXJndW1lbnRzXG4gICAgICB2Y
10072XIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2kgKyAxXTtcbiAgICAgIH1cbiAgICAgIC8vIFN0b3JlIGFuZCByZWdpc3RlciB0aGUgdGFza1xuICAgICAgdmFyIHRhc2sgPSB7IGNhbGxiYWNrOiBjYWxsYmFjaywgYXJnczogYXJncyB9O1xuICAgICAgdGFza3NCeUhhbmRsZVtuZXh0SGFuZGxlXSA9IHRhc2s7XG4gICAgICByZWdpc3RlckltbWVkaWF0ZShuZXh0SGFuZGxlKTtcbiAgICAgIHJldHVybiBuZXh0SGFuZGxlKys7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaGFuZGxlKSB7XG4gICAgICAgIGRlbGV0ZSB0YXNrc0J5SGFuZGxlW2hhbmRsZV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcnVuKHRhc2spIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gdGFzay5jYWxsYmFjaztcbiAgICAgICAgdmFyIGFyZ3MgPSB0YXNrLmFyZ3M7XG4gICAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcnVuSWZQcmVzZW50KGhhbmRsZSkge1xuICAgICAgICAvLyBGcm9tIHRoZSBzcGVjOiBcIldhaXQgdW50aWwgYW55IGludm9jYXRpb25zIG9mIHRoaXMgYWxnb3JpdGhtIHN0YXJ0ZWQgYmVmb3JlIHRoaXMgb25lIGhhdmUgY29tcGxldGVkLlwiXG4gICAgICAgIC8vIFNvIGlmIHdlJ3JlIGN1cnJlbnRseSBydW5uaW5nIGEgdGFzaywgd2UnbGwgbmVlZCB0byBkZWxheSB0aGlzIGludm9jYXRpb24uXG4gICAgICAgIGlmIChjdXJyZW50bHlSdW5uaW5nQVRhc2spIHtcbiAgICAgICAgICAgIC8vIERlbGF5IGJ5IGRvaW5nIGEgc2V0VGltZW91dC4gc2V0SW1tZWRpYXRlIHdhcyB0cmllZCBpbnN0ZWFkLCBidXQgaW4gRmlyZWZveCA3IGl0IGdlbmVyYXRlZCBhXG4gICAgICAgICAgICAvLyBcInRvbyBtdWNoIHJlY3Vyc2lvblwiIGVycm9yLlxuICAgICAgICAgICAgc2V0VGltZW91dChydW5JZlByZXNlbnQsIDAsIGhhbmRsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2Y
10072XIgdGFzayA9IHRhc2tzQnlIYW5kbGVbaGFuZGxlXTtcbiAgICAgICAgICAgIGlmICh0YXNrKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudGx5UnVubmluZ0FUYXNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBydW4odGFzayk7XG4gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbW1lZGlhdGUoaGFuZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5UnVubmluZ0FUYXNrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbE5leHRUaWNrSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHsgcnVuSWZQcmVzZW50KGhhbmRsZSk7IH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNhblVzZVBvc3RNZXNzYWdlKCkge1xuICAgICAgICAvLyBUaGUgdGVzdCBhZ2FpbnN0IGBpbXBvcnRTY3JpcHRzYCBwcmV2ZW50cyB0aGlzIGltcGxlbWVudGF0aW9uIGZyb20gYmVpbmcgaW5zdGFsbGVkIGluc2lkZSBhIHdlYiB3b3JrZXIsXG4gICAgICAgIC8vIHdoZXJlIGBnbG9iYWwucG9zdE1lc3NhZ2VgIG1lYW5zIHNvbWV0aGluZyBjb21wbGV0ZWx5IGRpZmZlcmVudCBhbmQgY2FuJ3QgYmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLlxuICAgICAgICBpZiAoZ2xvYmFsLnBvc3RNZXNzYWdlICYmICFnbG9iYWwuaW1wb3J0U2NyaXB0cykge1xuICAgICAgICAgICAgdmFyIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXMgPSB0cnVlO1xuICAgICAgICAgICAgdmFyIG9sZE9uTWVzc2FnZSA9IGdsb2JhbC5vbm1lc3NhZ2U7XG4gICAgICAgICAgICBnbG9iYWwub25tZXNzYWdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cyA9IGZhbHNlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZShcIlwiLCBcIipcIik7XG4gICAgICAgICAgICBnbG9iYWwub25tZXNzYWdlID0gb2xkT25NZXNzYWdlO1xuICAgICAgICAgICAgcmV0dXJuIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgLy8gSW5zdGFsbHMgYW4gZXZlbnQgaGFuZGxlciBvbiBgZ2xvYmFsYCBmb3IgdGhlIGBtZXNzYWdlYCBldmVudDogc2VlXG4gICAgICAgIC8vICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vRE9NL3dpbmRvdy5wb3N0TWVzc2FnZVxuICAgICAgICAvLyAqIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvbXVsdGlwYWdlL2NvbW1zLmh0bWwjY3Jvc3NEb2N1bWVudE1lc3NhZ2VzXG5cbiAgICAgICAgdmFyIG1lc3NhZ2VQcmVmaXggPSBcInNldEltbWVkaWF0ZSRcIiArIE1hdGgucmFuZG9tKCkgKyBcIiRcIjtcbiAgICAgICAgdmFyIG9uR2xvYmFsTWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuc291cmNlID09PSBnbG9iYWwgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgZXZlbnQuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmRhdGEuaW5kZXhPZihtZXNzYWdlUHJlZml4KSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJ1bklmUHJlc2VudCgrZXZlbnQuZGF0YS5zbGljZShtZXNzYWdlUHJlZml4Lmxlbmd0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIG9uR2xvYmFsTWVzc2FnZSwgZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2xvYmFsLmF0dGFjaEV2ZW50KFwib25tZXNzYWdlXCIsIG9uR2xvYmFsTWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKG1lc3NhZ2VQcmVmaXggKyBoYW5kbGUsIFwiKlwiKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsTWVzc2FnZUNoYW5uZWxJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGV2ZW50LmRhdGE7XG4gICAgICAgICAgICBydW5JZlByZXNlbnQoaGFuZGxlKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZShoYW5kbGUpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxSZWFkeVN0YXRlQ2hhbmdlSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHZhciBodG1sID0gZG9jLmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIDxzY3JpcHQ+IGVsZW1lbnQ7IGl0cyByZWFkeXN0YXRlY2hhbmdlIGV2ZW50IHdpbGwgYmUgZmlyZWQgYXN5bmNocm9ub3VzbHkgb25jZSBpdCBpcyBpbnNlcnRlZFxuICAgICAgICAgICAgLy8gaW50byB0aGUgZG9jdW1lbnQuIERvIHNvLCB0aHVzIHF1ZXVpbmcgdXAgdGhlIHRhc2suIFJlbWVtYmVyIHRvIGNsZWFuIHVwIG9uY2UgaXQncyBiZWVuIGNhbGxlZC5cbiAgICAgICAgICAgIHZhciBzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcbiAgICAgICAgICAgIHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcnVuSWZQcmVzZW50KGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgaH
10072RtbC5yZW1vdmVDaGlsZChzY3JpcHQpO1xuICAgICAgICAgICAgICAgIHNjcmlwdCA9IG51bGw7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaHRtbC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxTZXRUaW1lb3V0SW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJ1bklmUHJlc2VudCwgMCwgaGFuZGxlKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBJZiBzdXBwb3J0ZWQsIHdlIHNob3VsZCBhdHRhY2ggdG8gdGhlIHByb3RvdHlwZSBvZiBnbG9iYWwsIHNpbmNlIHRoYXQgaXMgd2hlcmUgc2V0VGltZW91dCBldCBhbC4gbGl2ZS5cbiAgICB2YXIgYXR0YWNoVG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKGdsb2JhbCk7XG4gICAgYXR0YWNoVG8gPSBhdHRhY2hUbyAmJiBhdHRhY2hUby5zZXRUaW1lb3V0ID8gYXR0YWNoVG8gOiBnbG9iYWw7XG5cbiAgICAvLyBEb24ndCBnZXQgZm9vbGVkIGJ5IGUuZy4gYnJvd3NlcmlmeSBlbnZpcm9ubWVudHMuXG4gICAgaWYgKHt9LnRvU3RyaW5nLmNhbGwoZ2xvYmFsLnByb2Nlc3MpID09PSBcIltvYmplY3QgcHJvY2Vzc11cIikge1xuICAgICAgICAvLyBGb3IgTm9kZS5qcyBiZWZvcmUgMC45XG4gICAgICAgIGluc3RhbGxOZXh0VGlja0ltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2UgaWYgKGNhblVzZVBvc3RNZXNzYWdlKCkpIHtcbiAgICAgICAgLy8gRm9yIG5vbi1JRTEwIG1vZGVybiBicm93c2Vyc1xuICAgICAgICBpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIGlmIChnbG9iYWwuTWVzc2FnZUNoYW5uZWwpIHtcbiAgICAgICAgLy8gRm9yIHdlYiB3b3JrZXJzLCB3aGVyZSBzdXBwb3J0ZWRcbiAgICAgICAgaW5zdGFsbE1lc3NhZ2VDaGFubmVsSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSBpZiAoZG9jICYmIFwib25yZWFkeXN0YXRlY2hhbmdlXCIgaW4gZG9jLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIikpIHtcbiAgICAgICAgLy8gRm9yIElFIDbigJM4XG4gICAgICAgIGluc3RhbGxSZWFkeVN0YXRlQ2hhbmdlSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZvciBvbGRlciBicm93c2Vyc1xuICAgICAgICBpbnN0YWxsU2V0VGltZW91dEltcGxlbWVudGF0aW9uKCk7XG4gICAgfVxuXG4gICAgYXR0YWNoVG8uc2V0SW1tZWRpYXRlID0gc2V0SW1tZWRpYXRlO1xuICAgIGF0dGFjaFRvLmNsZWFySW1tZWRpYXRlID0gY2xlYXJJbW1lZGlhdGU7XG59KHR5cGVvZiBzZWxmID09PSBcInVuZGVmaW5lZFwiID8gdHlwZW9mIGdsb2JhbCA9PT0gXCJ1bmRlZmluZWRcIiA/IHRoaXMgOiBnbG9iYWwgOiBzZWxmKSk7XG4iLCJ2YXIgc2NvcGUgPSAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBnbG9iYWwpIHx8XG4gICAgICAgICAgICAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZikgfHxcbiAgICAgICAgICAgIHdpbmRvdztcbnZhciBhcHBseSA9IEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseTtcblxuLy8gRE9NIEFQSXMsIGZvciBjb21wbGV0ZW5lc3NcblxuZXhwb3J0cy5zZXRUaW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgVGltZW91dChhcHBseS5jYWxsKHNldFRpbWVvdXQsIHNjb3BlLCBhcmd1bWVudHMpLCBjbGVhclRpbWVvdXQpO1xufTtcbmV4cG9ydHMuc2V0SW50ZXJ2YWwgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBUaW1lb3V0KGFwcGx5LmNhbGwoc2V0SW50ZXJ2YWwsIHNjb3BlLCBhcmd1bWVudHMpLCBjbGVhckludGVydmFsKTtcbn07XG5leHBvcnRzLmNsZWFyVGltZW91dCA9XG5leHBvcnRzLmNsZWFySW50ZXJ2YWwgPSBmdW5jdGlvbih0aW1lb3V0KSB7XG4gIGlmICh0aW1lb3V0KSB7XG4gICAgdGltZW91dC5jbG9zZSgpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBUaW1lb3V0KGlkLCBjbGVhckZuKSB7XG4gIHRoaXMuX2lkID0gaWQ7XG4gIHRoaXMuX2NsZWFyRm4gPSBjbGVhckZuO1xufVxuVGltZW91dC5wcm90b3R5cGUudW5yZWYgPSBUaW1lb3V0LnByb3RvdHlwZS5yZWYgPSBmdW5jdGlvbigpIHt9O1xuVGltZW91dC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fY2xlYXJGbi5jYWxsKHNjb3BlLCB0aGlzLl9pZCk7XG59O1xuXG4vLyBEb2VzIG5vdCBzdGFydCB0aGUgdGltZSwganVzdCBzZXRzIHVwIHRoZSBtZW1iZXJzIG5lZWRlZC5cbmV4cG9ydHMuZW5yb2xsID0gZnVuY3Rpb24oaXRlbSwgbXNlY3MpIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuICBpdGVtLl9pZGxlVGltZW91dCA9IG1zZWNzO1xufTtcblxuZXhwb3J0cy51bmVucm9sbCA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuICBpdGVtLl9pZGxlVGltZW91dCA9IC0xO1xufTtcblxuZXhwb3J0cy5fdW5yZWZBY3RpdmUgPSBleHBvcnRzLmFjdGl2ZSA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuXG4gIHZhciBtc2VjcyA9IGl0ZW0uX2lkbGVUaW1lb3V0O1xuICBpZiAobXNlY3MgPj0gMCkge1xuICAgIGl0ZW0uX2lkbGVUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uIG9uVGltZW91dCgpIHtcbiAgICAgIGlmIChpdGVtLl9vblRpbWVvdXQpXG4gICAgICAgIGl0ZW0uX29uVGltZW91dCgpO1xuICAgIH0sIG1zZWNzKTtcbiAgfVxufTtcblxuLy8gc2V0aW1tZWRpYXRlIGF0dGFjaGVzIGl0c2VsZiB0byB0aGUgZ2xvYmFsIG9iamVjdFxucmVxdWlyZShcInNldGltbWVkaWF0ZVwiKTtcbi8vIE9uIHNvbWUgZXhvdGljIGVudmlyb25tZW50cywgaXQncyBub3QgY2xlYXIgd2hpY2ggb2JqZWN0IGBzZXRpbW1lZGlhdGVgIHdhc1xuLy8gYWJsZSB0byBpbnN0YWxsIG9udG8uICBTZWFyY2ggZWFjaCBwb3NzaWJpbGl0eSBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGVcbi8vIGBzZXRpbW1lZGlhdGVgIGxpYnJhcnkuXG5leHBvcnRzLnNldEltbWVkaWF0ZSA9ICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzZWxmLnNldEltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgJiYgZ2xvYmFsLnNldEltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgJiYgdGhpcy5zZXRJbW1lZGlhdGUpO1xuZXhwb3J0cy5jbGVhckltbWVkaWF0ZSA9ICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzZWxmLmNsZWFySW1tZWRpYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiICYmIGdsb2JhbC5jbGVhckltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcyAmJiB0aGlzLmNsZWFySW1tZWRpYXRlKTtcbiIsInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgbmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcbn0gY2F0Y2ggKGUpIHtcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcblx0aWYgKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpIGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybi
10072B1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcbiIsIid1c2Ugc3RyaWN0J1xyXG5cclxuLyoqXHJcbiAqIEBtb2R1bGVcclxuICovXHJcblxyXG5pbXBvcnQgJCBmcm9tICdqcXVlcnknXHJcblxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIFByaXZhdGVcclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wXHJcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcclxuICogQHByaXZhdGVcclxuICovXHJcbmZ1bmN0aW9uIGlzUHJvdGVjdGVkIChwcm9wLCB2YWx1ZSkge1xyXG4gIHJldHVybiBjb25zb2xlLndhcm4oYE1vZHVsZUxvYWRlci4ke3Byb3B9IGlzIHByb3RlY3RlZCBwcm9wZXJ0eSEgWW91IGNhbm5vdCBjaGFuZ2UgaXQgdG8gXCIke3ZhbHVlfVwiIGFmdGVyIGNyZWF0ZSFgKVxyXG59XHJcblxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIFB1YmxpY1xyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5jbGFzcyBNb2R1bGVMb2FkZXIge1xyXG4gIC8qKlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBsb2FkZXJEYXRhXHJcbiAgICogQHBhcmFtIHtQcm9taXNlfSBbbG9hZGVyRGF0YS5pbXBvcnRQcm9taXNlPW51bGxdXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsb2FkZXJEYXRhLmluaXRTZWxlY3Rvcj0nLmpzLWluaXQnXVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbG9hZGVyRGF0YS5pbml0RnVuY3Rpb25OYW1lPSdsb2FkZXJJbml0J11cclxuICAgKiBAcGFyYW0ge09iamVjdH0gW2xvYWRlckRhdGEubGlzdD17fV1cclxuICAgKiBAcGFyYW0ge09iamVjdH0gW2xvYWRlckRhdGEuZGVidWc9ZmFsc2VdXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsb2FkZXJEYXRhLmxvYWRpbmdDbGFzcz0nX21vZHVsZS1sb2FkaW5nJ11cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2xvYWRlckRhdGEubG9hZGVkQ2xhc3M9J19tb2R1bGUtbG9hZGVkJ11cclxuICAgKlxyXG4gICAqIEBwcm9wIHtzdHJpbmd9IGluaXRTZWxlY3RvclxyXG4gICAqIEBwcm9wIHtzdHJpbmd9IGluaXRGdW5jdGlvbk5hbWVcclxuICAgKiBAcHJvcCB7T2JqZWN0fSBsaXN0XHJcbiAgICogQHByb3Age09iamVjdH0gbW9kdWxlc1xyXG4gICAqIEBwcm9wIHtib29sZWFufSBkZWJ1Z1xyXG4gICAqIEBwcm9wIHtzdHJpbmd9IGxvYWRpbmdDbGFzc1xyXG4gICAqIEBwcm9wIHtzdHJpbmd9IGxvYWRlZENsYXNzXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IgKGxvYWRlckRhdGEpIHtcclxuICAgIGxldCB7XHJcbiAgICAgIGltcG9ydFByb21pc2UgPSBudWxsLFxyXG4gICAgICBpbml0U2VsZWN0b3IgPSAnLmpzLWluaXQnLFxyXG4gICAgICBpbml0RnVuY3Rpb25OYW1lID0gJ2xvYWRlckluaXQnLFxyXG4gICAgICBsaXN0ID0ge30sXHJcbiAgICAgIGxvYWRpbmdDbGFzcyA9ICdfbW9kdWxlLWxvYWRpbmcnLFxyXG4gICAgICBsb2FkZWRDbGFzcyA9ICdfbW9kdWxlLWxvYWRlZCcsXHJcbiAgICAgIGRlYnVnID0gZmFsc2VcclxuICAgIH0gPSBsb2FkZXJEYXRhXHJcblxyXG4gICAgaWYgKHR5cGVvZiBpbXBvcnRQcm9taXNlICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignTW9kdWxlTG9hZGVyIEVSUk9SISBZb3UgbXVzdCBzcGVjaWZ5IFwiaW1wb3J0UHJvbWlzZVwiIHByb3BlcnR5LCBhcyBGdW5jdGlvbiB3aXRoIGltcG9ydCgpJylcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIGxpc3QgIT09ICdvYmplY3QnIHx8IE9iamVjdC5rZXlzKGxpc3QpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01vZHVsZUxvYWRlciBFUlJPUiEgWW91IG11c3Qgc3BlY2lmeSBcImxpc3RcIiBwcm9wZXJ0eSwgYXMgT2JqZWN0IHdpdGggdmFsdWVzJylcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBtb2R1bGVOYW1lIGluIGxpc3QpIHtcclxuICAgICAgbGV0IHNlbGVjdG9ycyA9IGxpc3RbbW9kdWxlTmFtZV1cclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VsZWN0b3JzKSkge1xyXG4gICAgICAgIGxpc3RbbW9kdWxlTmFtZV0gPSBzZWxlY3RvcnMuam9pbignLCcpXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBtb2R1bGVzID0ge31cclxuICAgIGZvciAobGV0IG1vZHVsZU5hbWUgaW4gbGlzdCkge1xyXG4gICAgICBtb2R1bGVzW21vZHVsZU5hbWVdID0gKCkgPT4gaW1wb3J0UHJvbWlzZShtb2R1bGVOYW1lKVxyXG4gICAgfVxyXG5cclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnaW5pdFNlbGVjdG9yJywge1xyXG4gICAgICBnZXQ6ICgpID0+IGluaXRTZWxlY3RvcixcclxuICAgICAgc2V0OiB2YWwgPT4gaXNQcm90ZWN0ZWQoJ2luaXRTZWxlY3RvcicsIHZhbClcclxuICAgIH0pXHJcblxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdpbml0RnVuY3Rpb25OYW1lJywge1xyXG4gICAgICBnZXQ6ICgpID0+IGluaXRGdW5jdGlvbk5hbWUsXHJcbiAgICAgIHNldDogdmFsID0+IGlzUHJvdGVjdGVkKCdpbml0RnVuY3Rpb25OYW1lJywgdmFsKVxyXG4gICAgfSlcclxuXHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2xpc3QnLCB7XHJcbiAgICAgIGdldDogKCkgPT4gbGlzdCxcclxuICAgICAgc2V0OiB2YWwgPT4gaXNQcm90ZWN0ZWQoJ2xpc3QnLCB2YWwpXHJcbiAgICB9KVxyXG5cclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnbW9kdWxlcycsIHtcclxuICAgICAgZ2V0OiAoKSA9PiBtb2R1bGVzLFxyXG4gICAgICBzZXQ6IHZhbCA9PiBpc1Byb3RlY3RlZCgnbW9kdWxlcycsIHZhbClcclxuICAgIH0pXHJcblxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdsb2FkaW5nQ2xhc3MnLCB7XHJcbiAgICAgIGdldDogKCkgPT4gbG9hZGluZ0NsYXNzLFxyXG4gICAgICBzZXQ6IHZhbCA9PiBpc1Byb3RlY3RlZCgnbG9hZGluZ0NsYXNzJywgdmFsKVxyXG4gICAgfSlcclxuXHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2xvYWRlZENsYXNzJywge1xyXG4gICAgICBnZXQ6ICgpID0+IGxvYWRlZENsYXNzLFxyXG4gICAgICBzZXQ6IHZhbCA9PiBpc1Byb3RlY3RlZCgnbG9hZGVkQ2xhc3MnLCB2YWwpXHJcbiAgICB9KVxyXG5cclxuICAgIHRoaXMuZGVidWcgPSBkZWJ1Z1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gbXNnXHJcbiAgICogQHBhcmFtIHsuLi4qfSBbZGF0YV1cclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIGxvZyAodHlwZSwgbXNnLCAuLi5kYXRhKSB7XHJcbiAgICBpZiAodGhpcy5kZWJ1Zykge1xyXG4gICAgICBjb25zb2xlW3R5cGVdKGBNb2R1bGVMb2FkZXIgJHt0eXBlfTogJHttc2d9YCwgLi4uZGF0YSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBwYXJhbSB7alF1ZXJ5fSBbJGNvbnRleHQ9JChkb2N1bWVudCldXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3RvcnNdXHJcbiAgICogQHJldHVybnMge2pRdWVyeX1cclxuICAgKiBAcHVibGljXHJcbiAgICovXHJcbiAgZ2V0RWxlbWVudHMgKCRjb250ZXh0ID0gJChkb2N1bWVudCksIHNlbGVjdG9ycykge1xyXG4gICAgbGV0IHNlbGVjdG9yID0gdGh
10072pcy5pbml0U2VsZWN0b3JcclxuICAgIGlmIChzZWxlY3RvcnMpIHtcclxuICAgICAgc2VsZWN0b3IgPSBzZWxlY3RvcnMuc3BsaXQoJywnKS5tYXAoc2VsZWN0b3IgPT4gdGhpcy5pbml0U2VsZWN0b3IgKyBzZWxlY3Rvcikuam9pbignLCcpXHJcbiAgICB9XHJcbiAgICB0aGlzLmxvZygnaW5mbycsIGBHZXQgZWxlbWVudHMgXCIke3NlbGVjdG9yfVwiIGluYCwgJGNvbnRleHQpXHJcbiAgICByZXR1cm4gJGNvbnRleHQuZmluZChzZWxlY3RvcilcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVOYW1lXHJcbiAgICogQHBhcmFtIHtqUXVlcnl9IFskY29udGV4dF1cclxuICAgKiBAcHVibGljXHJcbiAgICovXHJcbiAgcnVuTW9kdWxlIChtb2R1bGVOYW1lLCAkY29udGV4dCkge1xyXG4gICAgdGhpcy5sb2coJ3dhcm4nLCAnVXNlIC5sb2FkKCkgb25seSBtZXRob2QgYWZ0ZXIgLmluaXQoKScpXHJcbiAgICBjb25zb2xlLmxvZyhtb2R1bGVOYW1lLCAkY29udGV4dClcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBwYXJhbSB7alF1ZXJ5fSAkZWxlbWVudHNcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIG1hcmtBc0xvYWRpbmdFbGVtZW50cyAoJGVsZW1lbnRzKSB7XHJcbiAgICAkZWxlbWVudHMubm90KHRoaXMubG9hZGVkQ2xhc3MpLmFkZENsYXNzKHRoaXMubG9hZGluZ0NsYXNzKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQHBhcmFtIHtqUXVlcnl9ICRlbGVtZW50c1xyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgbWFya0FzTG9hZGVkRWxlbWVudHMgKCRlbGVtZW50cykge1xyXG4gICAgJGVsZW1lbnRzLnJlbW92ZUNsYXNzKHRoaXMubG9hZGluZ0NsYXNzKS5hZGRDbGFzcyh0aGlzLmxvYWRlZENsYXNzKVxyXG4gICAgJGVsZW1lbnRzLmRhdGEoJ21vZHVsZUxvYWRlcicsIHRoaXMpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAcGFyYW0ge2pRdWVyeX0gWyRjb250ZXh0PSQoZG9jdW1lbnQpXVxyXG4gICAqIEBwdWJsaWNcclxuICAgKi9cclxuICBpbml0ICgkY29udGV4dCA9ICQoZG9jdW1lbnQpKSB7XHJcbiAgICBjb25zdCAkZWxlbWVudHMgPSB0aGlzLmdldEVsZW1lbnRzKCRjb250ZXh0KVxyXG4gICAgaWYgKCEkZWxlbWVudHMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMubG9nKCdpbmZvJywgYE5vIGluaXQgZWxlbWVudHMgd2l0aCBzZWxlY3RvciBcIiR7dGhpcy5pbml0U2VsZWN0b3J9XCJgKVxyXG4gICAgICByZXR1cm4gZmFsc2VcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJ1bk1vZHVsZSA9IGZ1bmN0aW9uIChtb2R1bGVOYW1lLCAkY29udGV4dCkge1xyXG4gICAgICBjb25zdCBzZWxlY3RvcnMgPSB0aGlzLmxpc3RbbW9kdWxlTmFtZV1cclxuICAgICAgY29uc3QgJG1vZHVsZUVsZW1lbnRzID0gJGNvbnRleHQgPyB0aGlzLmdldEVsZW1lbnRzKCRjb250ZXh0LCBzZWxlY3RvcnMpIDogJGVsZW1lbnRzLmZpbHRlcihzZWxlY3RvcnMpXHJcbiAgICAgIHRoaXMubWFya0FzTG9hZGluZ0VsZW1lbnRzKCRtb2R1bGVFbGVtZW50cylcclxuXHJcbiAgICAgIGlmICgkbW9kdWxlRWxlbWVudHMubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5sb2coJ2luZm8nLCBgTG9hZCBtb2R1bGUgXCIke21vZHVsZU5hbWV9XCJgKVxyXG4gICAgICAgIHJldHVybiB0aGlzLm1vZHVsZXNbbW9kdWxlTmFtZV0oKS50aGVuKG1vZHVsZSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBpc0Z1bmN0aW9uID0gdHlwZW9mIG1vZHVsZVt0aGlzLmluaXRGdW5jdGlvbk5hbWVdID09PSAnZnVuY3Rpb24nXHJcbiAgICAgICAgICBpZiAoaXNGdW5jdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLmxvZygnaW5mbycsIGBJbml0IG1vZHVsZSBcIiR7bW9kdWxlTmFtZX1cImApXHJcbiAgICAgICAgICAgIHRoaXMubWFya0FzTG9hZGVkRWxlbWVudHMoJG1vZHVsZUVsZW1lbnRzKVxyXG4gICAgICAgICAgICBtb2R1bGVbdGhpcy5pbml0RnVuY3Rpb25OYW1lXSgkbW9kdWxlRWxlbWVudHMsIHRoaXMpXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmxvZygnd2FybicsIGBNb2R1bGUgXCIke21vZHVsZU5hbWV9XCIgaGFzIG5vIGV4cG9ydGVkIG1ldGhvZCBcIiR7dGhpcy5pbml0U2VsZWN0b3J9XCJgKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycilcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBtb2R1bGVOYW1lIGluIHRoaXMubGlzdCkge1xyXG4gICAgICB0aGlzLnJ1bk1vZHVsZShtb2R1bGVOYW1lKVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vLyBFeHBvcnRzXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IE1vZHVsZUxvYWRlclxyXG4iLCIndXNlIHN0cmljdCc7XHJcblxyXG4vKipcclxuICogV2V6b20gU3RhbmRhcmQgVGFic1xyXG4gKiBAbW9kdWxlXHJcbiAqIEBhdXRob3IgT2xlZyBEdXRjaGVua28gPGR1dGNoZW5rby5vLmRldkBnbWFpbC5jb20+XHJcbiAqIEBsaWNlbmNlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vV2V6b21BZ2VuY3kvd2V6b20tc3RhbmRhcmQtdGFicy9ibG9iL21hc3Rlci9MSUNFTlNFfVxyXG4gKi9cclxuXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLy8gSW1wb3J0c1xyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5pbXBvcnQgJCBmcm9tICdqcXVlcnknO1xyXG5pbXBvcnQgJ2N1c3RvbS1qcXVlcnktbWV0aG9kcy9mbi9nZXQtbXktZWxlbWVudHMnO1xyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vLyBQcml2YXRlXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbi8qKlxyXG4gKiBAdHlwZSB7e215QmxvY2tzOiBzdHJpbmcsIG15QmxvY2s6IHN0cmluZywgbXlCdXR0b25zOiBzdHJpbmd9fVxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY29uc3QgX2
1007215S2V5cyA9IHtcclxuXHRteUJsb2NrOiAnJG15V3NUYWJzQmxvY2snLFxyXG5cdG15QmxvY2tzOiAnJG15V3NUYWJzQmxvY2tzJyxcclxuXHRteUJ1dHRvbnM6ICckbXlXc1RhYnNCdXR0b25zJ1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7alF1ZXJ5fSAkYnV0dG9uXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW58dW5kZWZpbmVkfVxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuZnVuY3Rpb24gX25vUmVhY3QgKCRidXR0b24pIHtcclxuXHRyZXR1cm4gJGJ1dHRvbi5oYXNDbGFzcyh3c1RhYnMuY3NzQ2xhc3MuYWN0aXZlKSB8fCAkYnV0dG9uLmhhc0NsYXNzKHdzVGFicy5jc3NDbGFzcy5kaXNhYmxlZCkgfHwgJGJ1dHRvbi5wcm9wKCdkaXNhYmxlZCcpO1xyXG59XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtqUXVlcnl9ICRidXR0b25cclxuICogQHBhcmFtIHtqUXVlcnl9ICRjb250ZXh0XHJcbiAqIEByZXR1cm4ge3tteU5zOnN0cmluZywgbXlOYW1lOnN0cmluZywgYnV0dG9uc1NlbGVjdG9yOnN0cmluZywgYnV0dG9uU3luY1NlbGVjdG9yOnN0cmluZywgYmxvY2tzU2VsZWN0b3I6c3RyaW5nLCBibG9ja1NlbGVjdG9yOnN0cmluZywgJGJsb2NrOmpRdWVyeSwgJHNpYmxpbmdCbG9ja3M6alF1ZXJ5LCAkc2libGluZ0J1dHRvbnM6alF1ZXJ5LCAkc3luY0J1dHRvbnM6alF1ZXJ5fX1cclxuICogQHByaXZhdGVcclxuICovXHJcbmZ1bmN0aW9uIF9lamVjdERhdGEgKCRidXR0b24sICRjb250ZXh0KSB7XHJcblx0bGV0ICRzaWJsaW5nID0gbnVsbDtcclxuXHRjb25zdCBkYXRhID0ge1xyXG5cdFx0bXlOczogJGJ1dHRvbi5kYXRhKHdzVGFicy5rZXlzLm5zKSxcclxuXHRcdG15TmFtZTogJGJ1dHRvbi5kYXRhKHdzVGFicy5rZXlzLmJ1dHRvbiksXHJcblx0XHRnZXQgYnV0dG9uc1NlbGVjdG9yICgpIHtcclxuXHRcdFx0cmV0dXJuIGBbZGF0YS0ke3dzVGFicy5rZXlzLm5zfT1cIiR7dGhpcy5teU5zfVwiXVtkYXRhLSR7d3NUYWJzLmtleXMuYnV0dG9ufV1gO1xyXG5cdFx0fSxcclxuXHRcdGdldCBidXR0b25TeW5jU2VsZWN0b3IgKCkge1xyXG5cdFx0XHRyZXR1cm4gYFtkYXRhLSR7d3NUYWJzLmtleXMubnN9PVwiJHt0aGlzLm15TnN9XCJdW2RhdGEtJHt3c1RhYnMua2V5cy5idXR0b259PVwiJHt0aGlzLm15TmFtZX1cIl1gO1xyXG5cdFx0fSxcclxuXHRcdGdldCBibG9ja3NTZWxlY3RvciAoKSB7XHJcblx0XHRcdHJldHVybiBgW2RhdGEtJHt3c1RhYnMua2V5cy5uc309XCIke3RoaXMubXlOc31cIl1bZGF0YS0ke3dzVGFicy5rZXlzLmJsb2NrfV1gO1xyXG5cdFx0fSxcclxuXHRcdGdldCBibG9ja1NlbGVjdG9yICgpIHtcclxuXHRcdFx0cmV0dXJuIGBbZGF0YS0ke3dzVGFicy5rZXlzLm5zfT1cIiR7dGhpcy5teU5zfVwiXVtkYXRhLSR7d3NUYWJzLmtleXMuYmxvY2t9PVwiJHt0aGlzLm15TmFtZX1cIl1gO1xyXG5cdFx0fSxcclxuXHRcdGdldCAkYmxvY2sgKCkge1xyXG5cdFx0XHRyZXR1cm4gJGJ1dHRvbi5nZXRNeUVsZW1lbnRzKF9teUtleXMubXlCbG9jaywgdGhpcy5ibG9ja1NlbGVjdG9yKTtcclxuXHRcdH0sXHJcblx0XHRnZXQgJHNpYmxpbmdCbG9ja3MgKCkge1xyXG5cdFx0XHRsZXQgJGJsb2NrcyA9IHRoaXMuJGJsb2NrLmdldE15RWxlbWVudHMoX215S2V5cy5teUJsb2NrcywgdGhpcy5ibG9ja3NTZWxlY3RvciwgJGNvbnRleHQsIHRydWUpO1xyXG5cdFx0XHRyZXR1cm4gJGJsb2Nrcy5ub3QodGhpcy5ibG9ja1NlbGVjdG9yKTtcclxuXHRcdH0sXHJcblx0XHRnZXQgJHNpYmxpbmdCdXR0b25zICgpIHtcclxuXHRcdFx0cmV0dXJuICRzaWJsaW5nIHx8ICRidXR0b24uZ2V0TXlFbGVtZW50cyhfbXlLZXlzLm15QnV0dG9ucywgdGhpcy5idXR0b25zU2VsZWN0b3IsICRjb250ZXh0LCB0cnVlKTtcclxuXHRcdH0sXHJcblx0XHRnZXQgJHN5bmNCdXR0b25zICgpIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuJHNpYmxpbmdCdXR0b25zLmZpbHRlcih0aGlzLmJ1dHRvblN5bmNTZWxlY3Rvcik7XHJcblx0XHR9XHJcblx0fTtcclxuXHRpZiAoZGF0YS4kc3luY0J1dHRvbnMubGVuZ3RoKSB7XHJcblx0XHQkc2libGluZyA9IGRhdGEuJHNpYmxpbmdCdXR0b25zLm5vdChkYXRhLiRzeW5jQnV0dG9ucyk7XHJcblx0fVxyXG5cdHJldHVybiBkYXRhO1xyXG59XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcclxuICogQHBhcmFtIHsqfSAuLi5hcmdzXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5mdW5jdGlvbiBfcnVuSG9vayAobmFtZSwgLi4uYXJncykge1xyXG5cdGNvbnN0IGhvb2tzID0gd3NUYWJzLmhvb2tzW25hbWVdO1xyXG5cdGlmIChBcnJheS5pc0FycmF5KGhvb2tzKSkge1xyXG5cdFx0aG9va3MuZm9yRWFjaChob29rID0+IHtcclxuXHRcdFx0aWYgKHR5cGVvZiBob29rID09PSAnZnVuY3Rpb24nKSB7XHJcblx0XHRcdFx0aG9vayguLi5hcmdzKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG59XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtqUXVlcnl9ICRidXR0b25cclxuICogQHBhcmFtIHtqUXVlcnl9ICRjb250ZXh0XHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5mdW5jdGlvbiBfY2hhbmdlVGFiICgkYnV0dG9uLCAkY29udGV4dCkge1xyXG5cdGNvbnN0IHsgbXlOcywgbXlOYW1lLCAkYmxvY2ssICRzaWJsaW5nQmxvY2tzLCAkc2libGluZ0J1dHRvbnMsICRzeW5jQnV0dG9ucyB9ID0gX2VqZWN0RGF0YSgkYnV0dG9uLCAkY29udGV4dCk7XHJcblx0aWYgKF9ub1JlYWN0KCRidXR0b24pKSB7XHJcblx0XHRfcnVuSG9vaygnYmVmb3JlQWdhaW4nLCBteU5zLCBteU5hbWUsICRidXR0b24sICRibG9jayk7XHJcblx0XHQkYnV0dG9uLmFkZCgkYmxvY2spLnRyaWdnZXIod3NUYWJzLmV2ZW50cy5hZ2Fpbik7XHJcblx0XHRfcnVuSG9vaygnYWdhaW4nLCBteU5zLCBteU5hbWUsICRidXR0b24sICRibG9jayk7XHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblx0fVxyXG5cclxuXHRfcnVuSG9vaygnYmVmb3JlT2ZmJywgbXlOcywgbXlOYW1lLCAkc2libGluZ0J1dHRvbnMsICRzaWJsaW5nQmxvY2tzKTtcclxuXHRfcnVuSG9vaygnYmVmb3JlT24nLCBteU5zLCBteU5hbWUsICRidXR0b24sICRibG9jaywgJHN5bmNCdXR0b25zKTtcclxuXHJcblx0JHNpYmxpbmdCdXR0b25zLmFkZCg
10072kc2libGluZ0Jsb2NrcykucmVtb3ZlQ2xhc3Mod3NUYWJzLmNzc0NsYXNzLmFjdGl2ZSkudHJpZ2dlcih3c1RhYnMuZXZlbnRzLm9mZik7XHJcblx0JGJ1dHRvbi5hZGQoJHN5bmNCdXR0b25zKS5hZGQoJGJsb2NrKS5hZGRDbGFzcyh3c1RhYnMuY3NzQ2xhc3MuYWN0aXZlKS50cmlnZ2VyKHdzVGFicy5ldmVudHMub24pO1xyXG5cclxuXHRfcnVuSG9vaygnb2ZmJywgbXlOcywgbXlOYW1lLCAkc2libGluZ0J1dHRvbnMsICRzaWJsaW5nQmxvY2tzKTtcclxuXHRfcnVuSG9vaygnb24nLCBteU5zLCBteU5hbWUsICRidXR0b24sICRibG9jaywgJHN5bmNCdXR0b25zKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7alF1ZXJ5fSAkYnV0dG9uc1xyXG4gKiBAcGFyYW0ge2pRdWVyeX0gJGNvbnRleHRcclxuICogQHByaXZhdGVcclxuICovXHJcbmZ1bmN0aW9uIHNldEFjdGl2ZUlmTm90SGF2ZSAoJGJ1dHRvbnMsICRjb250ZXh0KSB7XHJcblx0bGV0IG5zID0gJGJ1dHRvbnMuZGF0YSh3c1RhYnMua2V5cy5ucyk7XHJcblx0bGV0IHNlbGVjdG9yID0gYFtkYXRhLSR7d3NUYWJzLmtleXMubnN9PVwiJHtuc31cIl1gO1xyXG5cdGxldCAkZ3JvdXAgPSAkYnV0dG9ucy5maWx0ZXIoc2VsZWN0b3IpO1xyXG5cclxuXHRpZiAoJGdyb3VwLmxlbmd0aCkge1xyXG5cdFx0bGV0ICRhY3RpdmUgPSAkZ3JvdXAuZmlsdGVyKGAuJHt3c1RhYnMuY3NzQ2xhc3MuYWN0aXZlfWApO1xyXG5cdFx0aWYgKCEkYWN0aXZlLmxlbmd0aCkge1xyXG5cdFx0XHRfY2hhbmdlVGFiKCRncm91cC5lcSgwKSwgJGNvbnRleHQpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICgkZ3JvdXAubGVuZ3RoIDwgJGJ1dHRvbnMubGVuZ3RoKSB7XHJcblx0XHRcdHNldEFjdGl2ZUlmTm90SGF2ZSgkYnV0dG9ucy5ub3Qoc2VsZWN0b3IpLCAkY29udGV4dCk7XHJcblx0XHR9XHJcblx0fVxyXG59XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtqUXVlcnl9ICRsaXN0XHJcbiAqIEBwYXJhbSB7c3RyaWdbXX0ga2V5c1xyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuZnVuY3Rpb24gZHJvcERlcGVuZGVuY2llcyAoJGxpc3QsIGtleXMpIHtcclxuXHRjb25zdCB3c1RhYnNLZXlzID0gT2JqZWN0LmtleXMod3NUYWJzLmtleXMpO1xyXG5cdCRsaXN0LmVhY2goKGksIGVsKSA9PiB7XHJcblx0XHRsZXQgJGl0ZW0gPSAkKGVsKTtcclxuXHRcdHdzVGFic0tleXMuZm9yRWFjaChrZXkgPT4ge1xyXG5cdFx0XHQkaXRlbS5kYXRhKGtleSwgbnVsbCk7XHJcblx0XHR9KTtcclxuXHR9KTtcclxufVxyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vLyBQdWJsaWNcclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2VcclxuICovXHJcbmNvbnN0IHdzVGFicyA9IHtcclxuXHQvKipcclxuXHQgKiBAZW51bSB7c3RyaW5nfVxyXG5cdCAqL1xyXG5cdGV2ZW50czoge1xyXG5cdFx0b246ICd3c3RhYnMtb24nLFxyXG5cdFx0b2ZmOiAnd3N0YWJzLW9mZicsXHJcblx0XHRhZ2FpbjogJ3dzdGFicy1hZ2FpbidcclxuXHR9LFxyXG5cclxuXHQvKipcclxuXHQgKiBAZW51bSB7ZnVuY3Rpb25bXX1cclxuXHQgKi9cclxuXHRob29rczoge1xyXG5cdFx0YmVmb3JlT246IFtdLFxyXG5cdFx0YmVmb3JlT2ZmOiBbXSxcclxuXHRcdGJlZm9yZUFnYWluOiBbXSxcclxuXHRcdG9uOiBbXSxcclxuXHRcdG9mZjogW10sXHJcblx0XHRhZ2FpbjogW10sXHJcblx0XHR1cGRhdGU6IFtdXHJcblx0fSxcclxuXHJcblx0LyoqXHJcblx0ICogQGVudW0ge3N0cmluZ31cclxuXHQgKi9cclxuXHRjc3NDbGFzczoge1xyXG5cdFx0YWN0aXZlOiAnaXMtYWN0aXZlJyxcclxuXHRcdGRpc2FibGVkOiAnaXMtZGlzYWJsZWQnXHJcblx0fSxcclxuXHJcblx0LyoqXHJcblx0ICogQGVudW0ge3N0cmluZ31cclxuXHQgKi9cclxuXHRrZXlzOiB7XHJcblx0XHRuczogJ3dzdGFicy1ucycsXHJcblx0XHRidXR0b246ICd3c3RhYnMtYnV0dG9uJyxcclxuXHRcdGJsb2NrOiAnd3N0YWJzLWJsb2NrJ1xyXG5cdH0sXHJcblxyXG5cdC8qKlxyXG5cdCAqIEluaXRpYWxpemUuXHJcblx0ICogU2V0IGRlcGVuZGVuY2llcyBhbmQgZGVsZWdhdGVkIGhhbmRsZXJzXHJcblx0ICogQHBhcmFtIHtqUXVlcnl9IFskY29udGV4dD0kKGRvY3VtZW50KV1cclxuXHQgKi9cclxuXHRpbml0ICgkY29udGV4dCA9ICQoZG9jdW1lbnQpKSB7XHJcblx0XHR0aGlzLnVwZGF0ZURlcGVuZGVuY2llcygkY29udGV4dCk7XHJcblx0XHQkY29udGV4dC5vbignY2xpY2snLCBgW2RhdGEtJHt0aGlzLmtleXMuYnV0dG9ufV1gLCB7ICRjb250ZXh0IH0sIGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0X2NoYW5nZVRhYigkKHRoaXMpLCAkY29udGV4dCk7XHJcblx0XHR9KTtcclxuXHJcblx0XHQkY29udGV4dC5vbigna2V5ZG93bicsIGBbZGF0YS0ke3RoaXMua2V5cy5idXR0b259XWAsIHsgJGNvbnRleHQgfSwgZnVuY3Rpb24gKGV2ZW50KSB7XHJcblx0XHRcdGxldCBjb2RlID0gbnVsbDtcclxuXHRcdFx0aWYgKGV2ZW50LmtleSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0Y29kZSA9IGV2ZW50LmtleTtcclxuXHRcdFx0fSBlbHNlIGlmIChldmVudC5rZXlJZGVudGlmaWVyICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRjb2RlID0gZXZlbnQua2V5SWRlbnRpZmllcjtcclxuXHRcdFx0fSBlbHNlIGlmIChldmVudC5rZXlDb2RlICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRjb2RlID0gZXZlbnQua2V5Q29kZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoY29kZSA9PT0gMTMgfHwgY29kZS50b0xvd2VyQ2FzZSgpID09PSAnZW50ZXInKSB7XHJcblx0XHRcdFx0X2NoYW5nZVRhYigkKHRoaXMpLCAkY29udGV4dCk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH0sXHJcblxyXG5cdC8qKlxyXG5cdCAqIEZvcmNlZCBhY3RpdmF0aW9uIG9mIHRhYnMgaWYgdGhlcmUgYXJlIG5vIGFjdGl2ZSBvbmVcclxuXHQgKiBAcGFyYW0ge2pRdWVyeX0gWyRjb250ZXh0PSQoZG9jdW1lbnQpXVxyXG5cdCAqL1xyXG5cdHNldEFjdGl2ZSAoJGNvbnRleHQgPSAkKGRvY3VtZW50KSkge1xyXG5cdFx0bGV0ICRidXR0b25zID0gJGNvbn
10072RleHQuZmluZChgW2RhdGEtJHt0aGlzLmtleXMuYnV0dG9ufV1gKTtcclxuXHRcdHNldEFjdGl2ZUlmTm90SGF2ZSgkYnV0dG9ucywgJGNvbnRleHQpO1xyXG5cdH0sXHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbW92ZSBhbGwgZGVwZW5kZW5jaWVzXHJcblx0ICogQHBhcmFtIHtqUXVlcnl9IFskY29udGV4dD0kKGRvY3VtZW50KV1cclxuXHQgKiBAcmV0dXJuIHt7JGJ1dHRvbnM6ICRqUXVlcnksICRibG9ja3M6ICRqUXVlcnl9fVxyXG5cdCAqL1xyXG5cdGRyb3BEZXBlbmRlbmNpZXMgKCRjb250ZXh0ID0gJChkb2N1bWVudCkpIHtcclxuXHRcdGxldCAkYnV0dG9ucyA9ICRjb250ZXh0LmZpbmQoYFtkYXRhLSR7dGhpcy5rZXlzLmJ1dHRvbn1dYCk7XHJcblx0XHRsZXQgJGJsb2NrcyA9ICRjb250ZXh0LmZpbmQoYFtkYXRhLSR7dGhpcy5rZXlzLmJsb2NrfV1gKTtcclxuXHRcdGRyb3BEZXBlbmRlbmNpZXMoJGJ1dHRvbnMsIFtfbXlLZXlzLm15QmxvY2ssIF9teUtleXMubXlCdXR0b25zXSk7XHJcblx0XHRkcm9wRGVwZW5kZW5jaWVzKCRibG9ja3MsIFtfbXlLZXlzLm15QmxvY2tzXSk7XHJcblx0XHRyZXR1cm4geyAkYnV0dG9ucywgJGJsb2NrcyB9O1xyXG5cdH0sXHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZSBhbGwgZGVwZW5kZW5jaWVzIHdpdGggcHJlLXJlc2V0LlxyXG5cdCAqIEFjdHVhbCB3aGVuIGR5bmFtaWNhbGx5IGFkZGluZyBuZXcgYnV0dG9ucyBhbmQgYmxvY2tzIHRvIGV4aXN0aW5nIHRhYiBncm91cHNcclxuXHQgKiBAcGFyYW0ge2pRdWVyeX0gWyRjb250ZXh0PSQoZG9jdW1lbnQpXVxyXG5cdCAqL1xyXG5cdHVwZGF0ZURlcGVuZGVuY2llcyAoJGNvbnRleHQgPSAkKGRvY3VtZW50KSkge1xyXG5cdFx0Y29uc3QgeyAkYnV0dG9ucyB9ID0gdGhpcy5kcm9wRGVwZW5kZW5jaWVzKCRjb250ZXh0KTtcclxuXHRcdCRidXR0b25zLmVhY2goKGksIGJ1dHRvbikgPT4ge1xyXG5cdFx0XHRjb25zdCAkYnV0dG9uID0gJChidXR0b24pO1xyXG5cdFx0XHRjb25zdCB7IG15TnMsIG15TmFtZSwgJGJsb2NrLCAkc3luY0J1dHRvbnMgfSA9IF9lamVjdERhdGEoJGJ1dHRvbiwgJGNvbnRleHQpO1xyXG5cdFx0XHRfcnVuSG9vaygndXBkYXRlJywgbXlOcywgbXlOYW1lLCAkYnV0dG9uLCAkYmxvY2ssICRzeW5jQnV0dG9ucyk7XHJcblx0XHR9KTtcclxuXHR9LFxyXG5cclxuXHQvKipcclxuXHQgKiBAcGFyYW0ge2pRdWVyeX0gJGJ1dHRvblxyXG5cdCAqIEBwYXJhbSB7alF1ZXJ5fSBbJGNvbnRleHQ9JChkb2N1bWVudCldXHJcblx0ICogQHJldHVybnMge3tteU5zOiBzdHJpbmcsIG15TmFtZTogc3RyaW5nLCBidXR0b25zU2VsZWN0b3I6IHN0cmluZywgYnV0dG9uU3luY1NlbGVjdG9yOiBzdHJpbmcsIGJsb2Nrc1NlbGVjdG9yOiBzdHJpbmcsIGJsb2NrU2VsZWN0b3I6IHN0cmluZywgJGJsb2NrOiBqUXVlcnksICRzaWJsaW5nQmxvY2tzOiBqUXVlcnksICRzaWJsaW5nQnV0dG9uczogalF1ZXJ5LCAkc3luY0J1dHRvbnM6IGpRdWVyeX19XHJcblx0ICovXHJcblx0ZWplY3REYXRhICgkYnV0dG9uLCAkY29udGV4dCA9ICQoZG9jdW1lbnQpKSB7XHJcblx0XHRyZXR1cm4gX2VqZWN0RGF0YSgkYnV0dG9uLCAkY29udGV4dCk7XHJcblx0fVxyXG59O1xyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vLyBFeHBvcnRzXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IHdzVGFicztcclxuIiwibW9kdWxlLmV4cG9ydHMgPSBqUXVlcnk7Il0sInNvdXJjZVJvb3QiOiIifQ==
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.