482 lines
No EOL
372 KiB
JavaScript
482 lines
No EOL
372 KiB
JavaScript
/******/ (function() { // webpackBootstrap
|
|
/******/ var __webpack_modules__ = ({
|
|
|
|
/***/ "./node_modules/circletype/dist/circletype.min.js":
|
|
/*!********************************************************!*\
|
|
!*** ./node_modules/circletype/dist/circletype.min.js ***!
|
|
\********************************************************/
|
|
/***/ (function(module) {
|
|
|
|
/*!
|
|
* circletype 2.3.0
|
|
* A JavaScript library that lets you curve type on the web.
|
|
* Copyright © 2014-2018 Peter Hrynkow
|
|
* Licensed MIT
|
|
* https://github.com/peterhry/CircleType#readme
|
|
*/
|
|
!function(t,e){ true?module.exports=e():0}("undefined"!=typeof self?self:this,function(){return function(t){function e(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,e),i.l=!0,i.exports}var n={};return e.m=t,e.c=n,e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:r})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=29)}([function(t,e,n){var r=n(24)("wks"),i=n(12),o=n(1).Symbol,u="function"==typeof o;(t.exports=function(t){return r[t]||(r[t]=u&&o[t]||(u?o:i)("Symbol."+t))}).store=r},function(t,e){var n=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(t,e){var n=t.exports={version:"2.5.6"};"number"==typeof __e&&(__e=n)},function(t,e,n){var r=n(4),i=n(11);t.exports=n(6)?function(t,e,n){return r.f(t,e,i(1,n))}:function(t,e,n){return t[e]=n,t}},function(t,e,n){var r=n(5),i=n(34),o=n(35),u=Object.defineProperty;e.f=n(6)?Object.defineProperty:function(t,e,n){if(r(t),e=o(e,!0),r(n),i)try{return u(t,e,n)}catch(t){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(t[e]=n.value),t}},function(t,e,n){var r=n(10);t.exports=function(t){if(!r(t))throw TypeError(t+" is not an object!");return t}},function(t,e,n){t.exports=!n(17)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(t,e){var n={}.hasOwnProperty;t.exports=function(t,e){return n.call(t,e)}},function(t,e){var n=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:n)(t)}},function(t,e){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},function(t,e){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e){var n=0,r=Math.random();t.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++n+r).toString(36))}},function(t,e){t.exports={}},function(t,e,n){var r=n(24)("keys"),i=n(12);t.exports=function(t){return r[t]||(r[t]=i(t))}},function(t,e){t.exports=!1},function(t,e,n){var r=n(1),i=n(2),o=n(3),u=n(19),c=n(20),f=function(t,e,n){var a,s,l,p,h=t&f.F,d=t&f.G,v=t&f.S,y=t&f.P,_=t&f.B,m=d?r:v?r[e]||(r[e]={}):(r[e]||{}).prototype,g=d?i:i[e]||(i[e]={}),x=g.prototype||(g.prototype={});d&&(n=e);for(a in n)s=!h&&m&&void 0!==m[a],l=(s?m:n)[a],p=_&&s?c(l,r):y&&"function"==typeof l?c(Function.call,l):l,m&&u(m,a,l,t&f.U),g[a]!=l&&o(g,a,p),y&&x[a]!=l&&(x[a]=l)};r.core=i,f.F=1,f.G=2,f.S=4,f.P=8,f.B=16,f.W=32,f.U=64,f.R=128,t.exports=f},function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e,n){var r=n(10),i=n(1).document,o=r(i)&&r(i.createElement);t.exports=function(t){return o?i.createElement(t):{}}},function(t,e,n){var r=n(1),i=n(3),o=n(7),u=n(12)("src"),c=Function.toString,f=(""+c).split("toString");n(2).inspectSource=function(t){return c.call(t)},(t.exports=function(t,e,n,c){var a="function"==typeof n;a&&(o(n,"name")||i(n,"name",e)),t[e]!==n&&(a&&(o(n,u)||i(n,u,t[e]?""+t[e]:f.join(String(e)))),t===r?t[e]=n:c?t[e]?t[e]=n:i(t,e,n):(delete t[e],i(t,e,n)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[u]||c.call(this)})},function(t,e,n){var r=n(36);t.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,i){return t.call(e,n,r,i)}}return function(){return t.apply(e,arguments)}}},function(t,e,n){var r=n(42),i=n(9);t.exports=function(t){return r(i(t))}},function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},function(t,e,n){var r=n(8),i=Math.min;t.exports=function(t){return t>0?i(r(t),9007199254740991):0}},function(t,e,n){var r=n(2),i=n(1),o=i["__core-js_shared__"]||(i["__core-js_shared__"]={});(t.exports=function(t,e){return o[t]||(o[t]=void 0!==e?e:{})})("versions",[]).push({version:r.version,mode:n(15)?"pure":"global",copyright:"© 2018 Denis Pushkarev (zloirock.ru)"})},function(t,e){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,e,n){var r=n(4).f,i=n(7),o=n(0)("toStringTag");t.exports=function(t,e,n){t&&!i(t=n?t:t.prototype,o)&&r(t,o,{configurable:!0,value:e})}},function(t,e,n){var r=n(9);t.exports=function(t){return Object(r(t))}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=Math.PI/180;e.default=function(t){return t*r}},function(t,e,n){"use strict";n(30);var r=n(54),i=function(t){return t&&t.__esModule?t:{default:t}}(r);t.exports=i.default},function(t,e,n){n(31),n(47),t.exports=n(2).Array.from},function(t,e,n){"use strict";var r=n(32)(!0);n(33)(String,"String",function(t){this._t=String(t),this._i=0},function(){var t,e=this._t,n=this._i;return n>=e.length?{value:void 0,done:!0}:(t=r(e,n),this._i+=t.length,{value:t,done:!1})})},function(t,e,n){var r=n(8),i=n(9);t.exports=function(t){return function(e,n){var o,u,c=String(i(e)),f=r(n),a=c.length;return f<0||f>=a?t?"":void 0:(o=c.charCodeAt(f),o<55296||o>56319||f+1===a||(u=c.charCodeAt(f+1))<56320||u>57343?t?c.charAt(f):o:t?c.slice(f,f+2):u-56320+(o-55296<<10)+65536)}}},function(t,e,n){"use strict";var r=n(15),i=n(16),o=n(19),u=n(3),c=n(13),f=n(37),a=n(26),s=n(46),l=n(0)("iterator"),p=!([].keys&&"next"in[].keys()),h=function(){return this};t.exports=function(t,e,n,d,v,y,_){f(n,e,d);var m,g,x,b=function(t){if(!p&&t in M)return M[t];switch(t){case"keys":case"values":return function(){return new n(this,t)}}return function(){return new n(this,t)}},O=e+" Iterator",w="values"==v,j=!1,M=t.prototype,S=M[l]||M["@@iterator"]||v&&M[v],P=S||b(v),A=v?w?b("entries"):P:void 0,T="Array"==e?M.entries||S:S;if(T&&(x=s(T.call(new t)))!==Object.prototype&&x.next&&(a(x,O,!0),r||"function"==typeof x[l]||u(x,l,h)),w&&S&&"values"!==S.name&&(j=!0,P=function(){return S.call(this)}),r&&!_||!p&&!j&&M[l]||u(M,l,P),c[e]=P,c[O]=h,v)if(m={values:w?P:b("values"),keys:y?P:b("keys"),entries:A},_)for(g in m)g in M||o(M,g,m[g]);else i(i.P+i.F*(p||j),e,m);return m}},function(t,e,n){t.exports=!n(6)&&!n(17)(function(){return 7!=Object.defineProperty(n(18)("div"),"a",{get:function(){return 7}}).a})},function(t,e,n){var r=n(10);t.exports=function(t,e){if(!r(t))return t;var n,i;if(e&&"function"==typeof(n=t.toString)&&!r(i=n.call(t)))return i;if("function"==typeof(n=t.valueOf)&&!r(i=n.call(t)))return i;if(!e&&"function"==typeof(n=t.toString)&&!r(i=n.call(t)))return i;throw TypeError("Can't convert object to primitive value")}},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},function(t,e,n){"use strict";var r=n(38),i=n(11),o=n(26),u={};n(3)(u,n(0)("iterator"),function(){return this}),t.exports=function(t,e,n){t.prototype=r(u,{next:i(1,n)}),o(t,e+" Iterator")}},function(t,e,n){var r=n(5),i=n(39),o=n(25),u=n(14)("IE_PROTO"),c=function(){},f=function(){var t,e=n(18)("iframe"),r=o.length;for(e.style.display="none",n(45).appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write("<script>document.F=Object<\/script>"),t.close(),f=t.F;r--;)delete f.prototype[o[r]];return f()};t.exports=Object.create||function(t,e){var n;return null!==t?(c.prototype=r(t),n=new c,c.prototype=null,n[u]=t):n=f(),void 0===e?n:i(n,e)}},function(t,e,n){var r=n(4),i=n(5),o=n(40);t.exports=n(6)?Object.defineProperties:function(t,e){i(t);for(var n,u=o(e),c=u.length,f=0;c>f;)r.f(t,n=u[f++],e[n]);return t}},function(t,e,n){var r=n(41),i=n(25);t.exports=Object.keys||function(t){return r(t,i)}},function(t,e,n){var r=n(7),i=n(21),o=n(43)(!1),u=n(14)("IE_PROTO");t.exports=function(t,e){var n,c=i(t),f=0,a=[];for(n in c)n!=u&&r(c,n)&&a.push(n);for(;e.length>f;)r(c,n=e[f++])&&(~o(a,n)||a.push(n));return a}},function(t,e,n){var r=n(22);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},function(t,e,n){var r=n(21),i=n(23),o=n(44);t.exports=function(t){return function(e,n,u){var c,f=r(e),a=i(f.length),s=o(u,a);if(t&&n!=n){for(;a>s;)if((c=f[s++])!=c)return!0}else for(;a>s;s++)if((t||s in f)&&f[s]===n)return t||s||0;return!t&&-1}}},function(t,e,n){var r=n(8),i=Math.max,o=Math.min;t.exports=function(t,e){return t=r(t),t<0?i(t+e,0):o(t,e)}},function(t,e,n){var r=n(1).document;t.exports=r&&r.documentElement},function(t,e,n){var r=n(7),i=n(27),o=n(14)("IE_PROTO"),u=Object.prototype;t.exports=Object.getPrototypeOf||function(t){return t=i(t),r(t,o)?t[o]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?u:null}},function(t,e,n){"use strict";var r=n(20),i=n(16),o=n(27),u=n(48),c=n(49),f=n(23),a=n(50),s=n(51);i(i.S+i.F*!n(53)(function(t){Array.from(t)}),"Array",{from:function(t){var e,n,i,l,p=o(t),h="function"==typeof this?this:Array,d=arguments.length,v=d>1?arguments[1]:void 0,y=void 0!==v,_=0,m=s(p);if(y&&(v=r(v,d>2?arguments[2]:void 0,2)),void 0==m||h==Array&&c(m))for(e=f(p.length),n=new h(e);e>_;_++)a(n,_,y?v(p[_],_):p[_]);else for(l=m.call(p),n=new h;!(i=l.next()).done;_++)a(n,_,y?u(l,v,[i.value,_],!0):i.value);return n.length=_,n}})},function(t,e,n){var r=n(5);t.exports=function(t,e,n,i){try{return i?e(r(n)[0],n[1]):e(n)}catch(e){var o=t.return;throw void 0!==o&&r(o.call(t)),e}}},function(t,e,n){var r=n(13),i=n(0)("iterator"),o=Array.prototype;t.exports=function(t){return void 0!==t&&(r.Array===t||o[i]===t)}},function(t,e,n){"use strict";var r=n(4),i=n(11);t.exports=function(t,e,n){e in t?r.f(t,e,i(0,n)):t[e]=n}},function(t,e,n){var r=n(52),i=n(0)("iterator"),o=n(13);t.exports=n(2).getIteratorMethod=function(t){if(void 0!=t)return t[i]||t["@@iterator"]||o[r(t)]}},function(t,e,n){var r=n(22),i=n(0)("toStringTag"),o="Arguments"==r(function(){return arguments}()),u=function(t,e){try{return t[e]}catch(t){}};t.exports=function(t){var e,n,c;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=u(e=Object(t),i))?n:o?r(e):"Object"==(c=r(e))&&"function"==typeof e.callee?"Arguments":c}},function(t,e,n){var r=n(0)("iterator"),i=!1;try{var o=[7][r]();o.return=function(){i=!0},Array.from(o,function(){throw 2})}catch(t){}t.exports=function(t,e){if(!e&&!i)return!1;var n=!1;try{var o=[7],u=o[r]();u.next=function(){return{done:n=!0}},o[r]=function(){return u},t(o)}catch(t){}return n}},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var o=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),u=n(55),c=r(u),f=n(56),a=r(f),s=n(57),l=r(s),p=n(58),h=r(p),d=n(59),v=r(d),y=Math.PI,_=Math.max,m=Math.min,g=function(){function t(e,n){i(this,t),this.element=e,this.originalHTML=this.element.innerHTML;var r=document.createElement("div"),o=document.createDocumentFragment();r.setAttribute("aria-label",e.innerText),r.style.position="relative",this.container=r,this._letters=(0,a.default)(e,n),this._letters.forEach(function(t){return o.appendChild(t)}),r.appendChild(o),this.element.innerHTML="",this.element.appendChild(r);var u=window.getComputedStyle(this.element),f=u.fontSize,s=u.lineHeight;this._fontSize=parseFloat(f),this._lineHeight=parseFloat(s)||this._fontSize,this._metrics=this._letters.map(c.default);var l=this._metrics.reduce(function(t,e){return t+e.width},0);this._minRadius=l/y/2+this._lineHeight,this._dir=1,this._forceWidth=!1,this._forceHeight=!0,this._radius=this._minRadius,this._invalidate()}return o(t,[{key:"radius",value:function(t){return void 0!==t?(this._radius=_(this._minRadius,t),this._invalidate(),this):this._radius}},{key:"dir",value:function(t){return void 0!==t?(this._dir=t,this._invalidate(),this):this._dir}},{key:"forceWidth",value:function(t){return void 0!==t?(this._forceWidth=t,this._invalidate(),this):this._forceWidth}},{key:"forceHeight",value:function(t){return void 0!==t?(this._forceHeight=t,this._invalidate(),this):this._forceHeight}},{key:"refresh",value:function(){return this._invalidate()}},{key:"destroy",value:function(){return this.element.innerHTML=this.originalHTML,this}},{key:"_invalidate",value:function(){var t=this;return cancelAnimationFrame(this._raf),this._raf=requestAnimationFrame(function(){t._layout()}),this}},{key:"_layout",value:function(){var t=this,e=this._radius,n=this._dir,r=-1===n?-e+this._lineHeight:e,i="center "+r/this._fontSize+"em",o=e-this._lineHeight,u=(0,v.default)(this._metrics,o),c=u.rotations,f=u.θ;if(this._letters.forEach(function(e,r){var o=e.style,u=(-.5*f+c[r])*n,a=-.5*t._metrics[r].width/t._fontSize,s="translateX("+a+"em) rotate("+u+"deg)";o.position="absolute",o.bottom=-1===n?0:"auto",o.left="50%",o.transform=s,o.transformOrigin=i,o.webkitTransform=s,o.webkitTransformOrigin=i}),this._forceHeight){var a=f>180?(0,l.default)(e,f):(0,l.default)(o,f)+this._lineHeight;this.container.style.height=a/this._fontSize+"em"}if(this._forceWidth){var s=(0,h.default)(e,m(180,f));this.container.style.width=s/this._fontSize+"em"}return this}}]),t}();e.default=g},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t){var e=t.getBoundingClientRect();return{height:e.height,left:e.left+window.pageXOffset,top:e.top+window.pageYOffset,width:e.width}}},function(t,e,n){"use strict";function r(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e<t.length;e++)n[e]=t[e];return n}return Array.from(t)}Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t,e){var n=document.createElement("span"),i=t.innerText.trim();return(e?e(i):[].concat(r(i))).map(function(t){var e=n.cloneNode();return e.insertAdjacentHTML("afterbegin"," "===t?" ":t),e})}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(28),i=function(t){return t&&t.__esModule?t:{default:t}}(r);e.default=function(t,e){return t*(1-Math.cos((0,i.default)(e/2)))}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(28),i=function(t){return t&&t.__esModule?t:{default:t}}(r);e.default=function(t,e){return 2*t*Math.sin((0,i.default)(e/2))}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(60),i=function(t){return t&&t.__esModule?t:{default:t}}(r);e.default=function(t,e){return t.reduce(function(t,n){var r=n.width,o=(0,i.default)(r/e);return{"θ":t.θ+o,rotations:t.rotations.concat([t.θ+o/2])}},{"θ":0,rotations:[]})}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=180/Math.PI;e.default=function(t){return t*r}}])});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./node_modules/plyr/dist/plyr.min.js":
|
|
/*!********************************************!*\
|
|
!*** ./node_modules/plyr/dist/plyr.min.js ***!
|
|
\********************************************/
|
|
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
|
|
|
|
"object"==typeof navigator&&function(e,t){ true?module.exports=t():0}(this,(function(){"use strict";function e(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function t(e,t){for(var i=0;i<t.length;i++){var s=t[i];s.enumerable=s.enumerable||!1,s.configurable=!0,"value"in s&&(s.writable=!0),Object.defineProperty(e,s.key,s)}}function i(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function s(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);t&&(s=s.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,s)}return i}function n(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?s(Object(n),!0).forEach((function(t){i(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):s(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}var a={addCSS:!0,thumbWidth:15,watch:!0};function l(e,t){return function(){return Array.from(document.querySelectorAll(t)).includes(this)}.call(e,t)}var o=function(e){return null!=e?e.constructor:null},r=function(e,t){return!!(e&&t&&e instanceof t)},c=function(e){return null==e},h=function(e){return o(e)===Object},u=function(e){return o(e)===String},d=function(e){return Array.isArray(e)},m=function(e){return r(e,NodeList)},p=u,g=d,f=m,b=function(e){return r(e,Element)},y=function(e){return r(e,Event)},v=function(e){return c(e)||(u(e)||d(e)||m(e))&&!e.length||h(e)&&!Object.keys(e).length};function w(e,t){if(1>t){var i=function(e){var t="".concat(e).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);return t?Math.max(0,(t[1]?t[1].length:0)-(t[2]?+t[2]:0)):0}(t);return parseFloat(e.toFixed(i))}return Math.round(e/t)*t}var T=function(){function e(t,i){(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")})(this,e),b(t)?this.element=t:p(t)&&(this.element=document.querySelector(t)),b(this.element)&&v(this.element.rangeTouch)&&(this.config=n({},a,{},i),this.init())}return function(e,i,s){i&&t(e.prototype,i),s&&t(e,s)}(e,[{key:"init",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect="none",this.element.style.webKitUserSelect="none",this.element.style.touchAction="manipulation"),this.listeners(!0),this.element.rangeTouch=this)}},{key:"destroy",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect="",this.element.style.webKitUserSelect="",this.element.style.touchAction=""),this.listeners(!1),this.element.rangeTouch=null)}},{key:"listeners",value:function(e){var t=this,i=e?"addEventListener":"removeEventListener";["touchstart","touchmove","touchend"].forEach((function(e){t.element[i](e,(function(e){return t.set(e)}),!1)}))}},{key:"get",value:function(t){if(!e.enabled||!y(t))return null;var i,s=t.target,n=t.changedTouches[0],a=parseFloat(s.getAttribute("min"))||0,l=parseFloat(s.getAttribute("max"))||100,o=parseFloat(s.getAttribute("step"))||1,r=s.getBoundingClientRect(),c=100/r.width*(this.config.thumbWidth/2)/100;return 0>(i=100/r.width*(n.clientX-r.left))?i=0:100<i&&(i=100),50>i?i-=(100-2*i)*c:50<i&&(i+=2*(i-50)*c),a+w(i/100*(l-a),o)}},{key:"set",value:function(t){e.enabled&&y(t)&&!t.target.disabled&&(t.preventDefault(),t.target.value=this.get(t),function(e,t){if(e&&t){var i=new Event(t,{bubbles:!0});e.dispatchEvent(i)}}(t.target,"touchend"===t.type?"change":"input"))}}],[{key:"setup",value:function(t){var i=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},s=null;if(v(t)||p(t)?s=Array.from(document.querySelectorAll(p(t)?t:'input[type="range"]')):b(t)?s=[t]:f(t)?s=Array.from(t):g(t)&&(s=t.filter(b)),v(s))return null;var o=n({},a,{},i);if(p(t)&&o.watch){var r=new MutationObserver((function(i){Array.from(i).forEach((function(i){Array.from(i.addedNodes).forEach((function(i){b(i)&&l(i,t)&&new e(i,o)}))}))}));r.observe(document.body,{childList:!0,subtree:!0})}return s.map((function(t){return new e(t,i)}))}},{key:"enabled",get:function(){return"ontouchstart"in document.documentElement}}]),e}();const k=e=>null!=e?e.constructor:null,C=(e,t)=>Boolean(e&&t&&e instanceof t),A=e=>null==e,S=e=>k(e)===Object,E=e=>k(e)===String,P=e=>k(e)===Function,M=e=>Array.isArray(e),N=e=>C(e,NodeList),x=e=>A(e)||(E(e)||M(e)||N(e))&&!e.length||S(e)&&!Object.keys(e).length;var I=A,L=S,$=e=>k(e)===Number&&!Number.isNaN(e),_=E,O=e=>k(e)===Boolean,j=P,D=M,q=N,H=e=>null!==e&&"object"==typeof e&&1===e.nodeType&&"object"==typeof e.style&&"object"==typeof e.ownerDocument,R=e=>C(e,Event),F=e=>C(e,KeyboardEvent),V=e=>C(e,TextTrack)||!A(e)&&E(e.kind),B=e=>C(e,Promise)&&P(e.then),U=e=>{if(C(e,window.URL))return!0;if(!E(e))return!1;let t=e;e.startsWith("http://")&&e.startsWith("https://")||(t=`http://${e}`);try{return!x(new URL(t).hostname)}catch(e){return!1}},W=x;const z=(()=>{const e=document.createElement("span"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},i=Object.keys(t).find((t=>void 0!==e.style[t]));return!!_(i)&&t[i]})();function K(e,t){setTimeout((()=>{try{e.hidden=!0,e.offsetHeight,e.hidden=!1}catch(e){}}),t)}const Y={isIE:Boolean(window.document.documentMode),isEdge:window.navigator.userAgent.includes("Edge"),isWebkit:"WebkitAppearance"in document.documentElement.style&&!/Edge/.test(navigator.userAgent),isIPhone:/(iPhone|iPod)/gi.test(navigator.platform),isIos:"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1||/(iPad|iPhone|iPod)/gi.test(navigator.platform)};function Q(e,t){return t.split(".").reduce(((e,t)=>e&&e[t]),e)}function X(e={},...t){if(!t.length)return e;const i=t.shift();return L(i)?(Object.keys(i).forEach((t=>{L(i[t])?(Object.keys(e).includes(t)||Object.assign(e,{[t]:{}}),X(e[t],i[t])):Object.assign(e,{[t]:i[t]})})),X(e,...t)):e}function J(e,t){const i=e.length?e:[e];Array.from(i).reverse().forEach(((e,i)=>{const s=i>0?t.cloneNode(!0):t,n=e.parentNode,a=e.nextSibling;s.appendChild(e),a?n.insertBefore(s,a):n.appendChild(s)}))}function G(e,t){H(e)&&!W(t)&&Object.entries(t).filter((([,e])=>!I(e))).forEach((([t,i])=>e.setAttribute(t,i)))}function Z(e,t,i){const s=document.createElement(e);return L(t)&&G(s,t),_(i)&&(s.innerText=i),s}function ee(e,t,i,s){H(t)&&t.appendChild(Z(e,i,s))}function te(e){q(e)||D(e)?Array.from(e).forEach(te):H(e)&&H(e.parentNode)&&e.parentNode.removeChild(e)}function ie(e){if(!H(e))return;let{length:t}=e.childNodes;for(;t>0;)e.removeChild(e.lastChild),t-=1}function se(e,t){return H(t)&&H(t.parentNode)&&H(e)?(t.parentNode.replaceChild(e,t),e):null}function ne(e,t){if(!_(e)||W(e))return{};const i={},s=X({},t);return e.split(",").forEach((e=>{const t=e.trim(),n=t.replace(".",""),a=t.replace(/[[\]]/g,"").split("="),[l]=a,o=a.length>1?a[1].replace(/["']/g,""):"";switch(t.charAt(0)){case".":_(s.class)?i.class=`${s.class} ${n}`:i.class=n;break;case"#":i.id=t.replace("#","");break;case"[":i[l]=o}})),X(s,i)}function ae(e,t){if(!H(e))return;let i=t;O(i)||(i=!e.hidden),e.hidden=i}function le(e,t,i){if(q(e))return Array.from(e).map((e=>le(e,t,i)));if(H(e)){let s="toggle";return void 0!==i&&(s=i?"add":"remove"),e.classList[s](t),e.classList.contains(t)}return!1}function oe(e,t){return H(e)&&e.classList.contains(t)}function re(e,t){const{prototype:i}=Element;return(i.matches||i.webkitMatchesSelector||i.mozMatchesSelector||i.msMatchesSelector||function(){return Array.from(document.querySelectorAll(t)).includes(this)}).call(e,t)}function ce(e){return this.elements.container.querySelectorAll(e)}function he(e){return this.elements.container.querySelector(e)}function ue(e=null,t=!1){H(e)&&(e.focus({preventScroll:!0}),t&&le(e,this.config.classNames.tabFocus))}const de={"audio/ogg":"vorbis","audio/wav":"1","video/webm":"vp8, vorbis","video/mp4":"avc1.42E01E, mp4a.40.2","video/ogg":"theora"},me={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),check(e,t,i){const s=Y.isIPhone&&i&&me.playsinline,n=me[e]||"html5"!==t;return{api:n,ui:n&&me.rangeInput&&("video"!==e||!Y.isIPhone||s)}},pip:!(Y.isIPhone||!j(Z("video").webkitSetPresentationMode)&&(!document.pictureInPictureEnabled||Z("video").disablePictureInPicture)),airplay:j(window.WebKitPlaybackTargetAvailabilityEvent),playsinline:"playsInline"in document.createElement("video"),mime(e){if(W(e))return!1;const[t]=e.split("/");let i=e;if(!this.isHTML5||t!==this.type)return!1;Object.keys(de).includes(i)&&(i+=`; codecs="${de[e]}"`);try{return Boolean(i&&this.media.canPlayType(i).replace(/no/,""))}catch(e){return!1}},textTracks:"textTracks"in document.createElement("video"),rangeInput:(()=>{const e=document.createElement("input");return e.type="range","range"===e.type})(),touch:"ontouchstart"in document.documentElement,transitions:!1!==z,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches},pe=(()=>{let e=!1;try{const t=Object.defineProperty({},"passive",{get:()=>(e=!0,null)});window.addEventListener("test",null,t),window.removeEventListener("test",null,t)}catch(e){}return e})();function ge(e,t,i,s=!1,n=!0,a=!1){if(!e||!("addEventListener"in e)||W(t)||!j(i))return;const l=t.split(" ");let o=a;pe&&(o={passive:n,capture:a}),l.forEach((t=>{this&&this.eventListeners&&s&&this.eventListeners.push({element:e,type:t,callback:i,options:o}),e[s?"addEventListener":"removeEventListener"](t,i,o)}))}function fe(e,t="",i,s=!0,n=!1){ge.call(this,e,t,i,!0,s,n)}function be(e,t="",i,s=!0,n=!1){ge.call(this,e,t,i,!1,s,n)}function ye(e,t="",i,s=!0,n=!1){const a=(...l)=>{be(e,t,a,s,n),i.apply(this,l)};ge.call(this,e,t,a,!0,s,n)}function ve(e,t="",i=!1,s={}){if(!H(e)||W(t))return;const n=new CustomEvent(t,{bubbles:i,detail:{...s,plyr:this}});e.dispatchEvent(n)}function we(){this&&this.eventListeners&&(this.eventListeners.forEach((e=>{const{element:t,type:i,callback:s,options:n}=e;t.removeEventListener(i,s,n)})),this.eventListeners=[])}function Te(){return new Promise((e=>this.ready?setTimeout(e,0):fe.call(this,this.elements.container,"ready",e))).then((()=>{}))}function ke(e){B(e)&&e.then(null,(()=>{}))}function Ce(e){return D(e)?e.filter(((t,i)=>e.indexOf(t)===i)):e}function Ae(e,t){return D(e)&&e.length?e.reduce(((e,i)=>Math.abs(i-t)<Math.abs(e-t)?i:e)):null}function Se(e){return!(!window||!window.CSS)&&window.CSS.supports(e)}const Ee=[[1,1],[4,3],[3,4],[5,4],[4,5],[3,2],[2,3],[16,10],[10,16],[16,9],[9,16],[21,9],[9,21],[32,9],[9,32]].reduce(((e,[t,i])=>({...e,[t/i]:[t,i]})),{});function Pe(e){if(!(D(e)||_(e)&&e.includes(":")))return!1;return(D(e)?e:e.split(":")).map(Number).every($)}function Me(e){if(!D(e)||!e.every($))return null;const[t,i]=e,s=(e,t)=>0===t?e:s(t,e%t),n=s(t,i);return[t/n,i/n]}function Ne(e){const t=e=>Pe(e)?e.split(":").map(Number):null;let i=t(e);if(null===i&&(i=t(this.config.ratio)),null===i&&!W(this.embed)&&D(this.embed.ratio)&&({ratio:i}=this.embed),null===i&&this.isHTML5){const{videoWidth:e,videoHeight:t}=this.media;i=[e,t]}return Me(i)}function xe(e){if(!this.isVideo)return{};const{wrapper:t}=this.elements,i=Ne.call(this,e);if(!D(i))return{};const[s,n]=Me(i),a=100/s*n;if(Se(`aspect-ratio: ${s}/${n}`)?t.style.aspectRatio=`${s}/${n}`:t.style.paddingBottom=`${a}%`,this.isVimeo&&!this.config.vimeo.premium&&this.supported.ui){const e=100/this.media.offsetWidth*parseInt(window.getComputedStyle(this.media).paddingBottom,10),i=(e-a)/(e/50);this.fullscreen.active?t.style.paddingBottom=null:this.media.style.transform=`translateY(-${i}%)`}else this.isHTML5&&t.classList.add(this.config.classNames.videoFixedRatio);return{padding:a,ratio:i}}function Ie(e,t,i=.05){const s=e/t,n=Ae(Object.keys(Ee),s);return Math.abs(n-s)<=i?Ee[n]:[e,t]}const Le={getSources(){if(!this.isHTML5)return[];return Array.from(this.media.querySelectorAll("source")).filter((e=>{const t=e.getAttribute("type");return!!W(t)||me.mime.call(this,t)}))},getQualityOptions(){return this.config.quality.forced?this.config.quality.options:Le.getSources.call(this).map((e=>Number(e.getAttribute("size")))).filter(Boolean)},setup(){if(!this.isHTML5)return;const e=this;e.options.speed=e.config.speed.options,W(this.config.ratio)||xe.call(e),Object.defineProperty(e.media,"quality",{get(){const t=Le.getSources.call(e).find((t=>t.getAttribute("src")===e.source));return t&&Number(t.getAttribute("size"))},set(t){if(e.quality!==t){if(e.config.quality.forced&&j(e.config.quality.onChange))e.config.quality.onChange(t);else{const i=Le.getSources.call(e).find((e=>Number(e.getAttribute("size"))===t));if(!i)return;const{currentTime:s,paused:n,preload:a,readyState:l,playbackRate:o}=e.media;e.media.src=i.getAttribute("src"),("none"!==a||l)&&(e.once("loadedmetadata",(()=>{e.speed=o,e.currentTime=s,n||ke(e.play())})),e.media.load())}ve.call(e,e.media,"qualitychange",!1,{quality:t})}}})},cancelRequests(){this.isHTML5&&(te(Le.getSources.call(this)),this.media.setAttribute("src",this.config.blankVideo),this.media.load(),this.debug.log("Cancelled network requests"))}};function $e(e,...t){return W(e)?e:e.toString().replace(/{(\d+)}/g,((e,i)=>t[i].toString()))}const _e=(e="",t="",i="")=>e.replace(new RegExp(t.toString().replace(/([.*+?^=!:${}()|[\]/\\])/g,"\\$1"),"g"),i.toString()),Oe=(e="")=>e.toString().replace(/\w\S*/g,(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()));function je(e=""){let t=e.toString();return t=function(e=""){let t=e.toString();return t=_e(t,"-"," "),t=_e(t,"_"," "),t=Oe(t),_e(t," ","")}(t),t.charAt(0).toLowerCase()+t.slice(1)}function De(e){const t=document.createElement("div");return t.appendChild(e),t.innerHTML}const qe={pip:"PIP",airplay:"AirPlay",html5:"HTML5",vimeo:"Vimeo",youtube:"YouTube"},He={get(e="",t={}){if(W(e)||W(t))return"";let i=Q(t.i18n,e);if(W(i))return Object.keys(qe).includes(e)?qe[e]:"";const s={"{seektime}":t.seekTime,"{title}":t.title};return Object.entries(s).forEach((([e,t])=>{i=_e(i,e,t)})),i}};class Re{constructor(t){e(this,"get",(e=>{if(!Re.supported||!this.enabled)return null;const t=window.localStorage.getItem(this.key);if(W(t))return null;const i=JSON.parse(t);return _(e)&&e.length?i[e]:i})),e(this,"set",(e=>{if(!Re.supported||!this.enabled)return;if(!L(e))return;let t=this.get();W(t)&&(t={}),X(t,e);try{window.localStorage.setItem(this.key,JSON.stringify(t))}catch(e){}})),this.enabled=t.config.storage.enabled,this.key=t.config.storage.key}static get supported(){try{if(!("localStorage"in window))return!1;const e="___test";return window.localStorage.setItem(e,e),window.localStorage.removeItem(e),!0}catch(e){return!1}}}function Fe(e,t="text"){return new Promise(((i,s)=>{try{const s=new XMLHttpRequest;if(!("withCredentials"in s))return;s.addEventListener("load",(()=>{if("text"===t)try{i(JSON.parse(s.responseText))}catch(e){i(s.responseText)}else i(s.response)})),s.addEventListener("error",(()=>{throw new Error(s.status)})),s.open("GET",e,!0),s.responseType=t,s.send()}catch(e){s(e)}}))}function Ve(e,t){if(!_(e))return;const i=_(t);let s=!1;const n=()=>null!==document.getElementById(t),a=(e,t)=>{e.innerHTML=t,i&&n()||document.body.insertAdjacentElement("afterbegin",e)};if(!i||!n()){const n=Re.supported,l=document.createElement("div");if(l.setAttribute("hidden",""),i&&l.setAttribute("id",t),n){const e=window.localStorage.getItem(`cache-${t}`);if(s=null!==e,s){const t=JSON.parse(e);a(l,t.content)}}Fe(e).then((e=>{if(!W(e)){if(n)try{window.localStorage.setItem(`cache-${t}`,JSON.stringify({content:e}))}catch(e){}a(l,e)}})).catch((()=>{}))}}const Be=e=>Math.trunc(e/60/60%60,10);function Ue(e=0,t=!1,i=!1){if(!$(e))return Ue(void 0,t,i);const s=e=>`0${e}`.slice(-2);let n=Be(e);const a=(l=e,Math.trunc(l/60%60,10));var l;const o=(e=>Math.trunc(e%60,10))(e);return n=t||n>0?`${n}:`:"",`${i&&e>0?"-":""}${n}${s(a)}:${s(o)}`}const We={getIconUrl(){const e=new URL(this.config.iconUrl,window.location),t=window.location.host?window.location.host:window.top.location.host,i=e.host!==t||Y.isIE&&!window.svg4everybody;return{url:this.config.iconUrl,cors:i}},findElements(){try{return this.elements.controls=he.call(this,this.config.selectors.controls.wrapper),this.elements.buttons={play:ce.call(this,this.config.selectors.buttons.play),pause:he.call(this,this.config.selectors.buttons.pause),restart:he.call(this,this.config.selectors.buttons.restart),rewind:he.call(this,this.config.selectors.buttons.rewind),fastForward:he.call(this,this.config.selectors.buttons.fastForward),mute:he.call(this,this.config.selectors.buttons.mute),pip:he.call(this,this.config.selectors.buttons.pip),airplay:he.call(this,this.config.selectors.buttons.airplay),settings:he.call(this,this.config.selectors.buttons.settings),captions:he.call(this,this.config.selectors.buttons.captions),fullscreen:he.call(this,this.config.selectors.buttons.fullscreen)},this.elements.progress=he.call(this,this.config.selectors.progress),this.elements.inputs={seek:he.call(this,this.config.selectors.inputs.seek),volume:he.call(this,this.config.selectors.inputs.volume)},this.elements.display={buffer:he.call(this,this.config.selectors.display.buffer),currentTime:he.call(this,this.config.selectors.display.currentTime),duration:he.call(this,this.config.selectors.display.duration)},H(this.elements.progress)&&(this.elements.display.seekTooltip=this.elements.progress.querySelector(`.${this.config.classNames.tooltip}`)),!0}catch(e){return this.debug.warn("It looks like there is a problem with your custom controls HTML",e),this.toggleNativeControls(!0),!1}},createIcon(e,t){const i="http://www.w3.org/2000/svg",s=We.getIconUrl.call(this),n=`${s.cors?"":s.url}#${this.config.iconPrefix}`,a=document.createElementNS(i,"svg");G(a,X(t,{"aria-hidden":"true",focusable:"false"}));const l=document.createElementNS(i,"use"),o=`${n}-${e}`;return"href"in l&&l.setAttributeNS("http://www.w3.org/1999/xlink","href",o),l.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",o),a.appendChild(l),a},createLabel(e,t={}){const i=He.get(e,this.config);return Z("span",{...t,class:[t.class,this.config.classNames.hidden].filter(Boolean).join(" ")},i)},createBadge(e){if(W(e))return null;const t=Z("span",{class:this.config.classNames.menu.value});return t.appendChild(Z("span",{class:this.config.classNames.menu.badge},e)),t},createButton(e,t){const i=X({},t);let s=je(e);const n={element:"button",toggle:!1,label:null,icon:null,labelPressed:null,iconPressed:null};switch(["element","icon","label"].forEach((e=>{Object.keys(i).includes(e)&&(n[e]=i[e],delete i[e])})),"button"!==n.element||Object.keys(i).includes("type")||(i.type="button"),Object.keys(i).includes("class")?i.class.split(" ").some((e=>e===this.config.classNames.control))||X(i,{class:`${i.class} ${this.config.classNames.control}`}):i.class=this.config.classNames.control,e){case"play":n.toggle=!0,n.label="play",n.labelPressed="pause",n.icon="play",n.iconPressed="pause";break;case"mute":n.toggle=!0,n.label="mute",n.labelPressed="unmute",n.icon="volume",n.iconPressed="muted";break;case"captions":n.toggle=!0,n.label="enableCaptions",n.labelPressed="disableCaptions",n.icon="captions-off",n.iconPressed="captions-on";break;case"fullscreen":n.toggle=!0,n.label="enterFullscreen",n.labelPressed="exitFullscreen",n.icon="enter-fullscreen",n.iconPressed="exit-fullscreen";break;case"play-large":i.class+=` ${this.config.classNames.control}--overlaid`,s="play",n.label="play",n.icon="play";break;default:W(n.label)&&(n.label=s),W(n.icon)&&(n.icon=e)}const a=Z(n.element);return n.toggle?(a.appendChild(We.createIcon.call(this,n.iconPressed,{class:"icon--pressed"})),a.appendChild(We.createIcon.call(this,n.icon,{class:"icon--not-pressed"})),a.appendChild(We.createLabel.call(this,n.labelPressed,{class:"label--pressed"})),a.appendChild(We.createLabel.call(this,n.label,{class:"label--not-pressed"}))):(a.appendChild(We.createIcon.call(this,n.icon)),a.appendChild(We.createLabel.call(this,n.label))),X(i,ne(this.config.selectors.buttons[s],i)),G(a,i),"play"===s?(D(this.elements.buttons[s])||(this.elements.buttons[s]=[]),this.elements.buttons[s].push(a)):this.elements.buttons[s]=a,a},createRange(e,t){const i=Z("input",X(ne(this.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.01,value:0,autocomplete:"off",role:"slider","aria-label":He.get(e,this.config),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0},t));return this.elements.inputs[e]=i,We.updateRangeFill.call(this,i),T.setup(i),i},createProgress(e,t){const i=Z("progress",X(ne(this.config.selectors.display[e]),{min:0,max:100,value:0,role:"progressbar","aria-hidden":!0},t));if("volume"!==e){i.appendChild(Z("span",null,"0"));const t={played:"played",buffer:"buffered"}[e],s=t?He.get(t,this.config):"";i.innerText=`% ${s.toLowerCase()}`}return this.elements.display[e]=i,i},createTime(e,t){const i=ne(this.config.selectors.display[e],t),s=Z("div",X(i,{class:`${i.class?i.class:""} ${this.config.classNames.display.time} `.trim(),"aria-label":He.get(e,this.config)}),"00:00");return this.elements.display[e]=s,s},bindMenuItemShortcuts(e,t){fe.call(this,e,"keydown keyup",(i=>{if(!["Space","ArrowUp","ArrowDown","ArrowRight"].includes(i.key))return;if(i.preventDefault(),i.stopPropagation(),"keydown"===i.type)return;const s=re(e,'[role="menuitemradio"]');if(!s&&["Space","ArrowRight"].includes(i.key))We.showMenuPanel.call(this,t,!0);else{let t;"Space"!==i.key&&("ArrowDown"===i.key||s&&"ArrowRight"===i.key?(t=e.nextElementSibling,H(t)||(t=e.parentNode.firstElementChild)):(t=e.previousElementSibling,H(t)||(t=e.parentNode.lastElementChild)),ue.call(this,t,!0))}}),!1),fe.call(this,e,"keyup",(e=>{"Return"===e.key&&We.focusFirstMenuItem.call(this,null,!0)}))},createMenuItem({value:e,list:t,type:i,title:s,badge:n=null,checked:a=!1}){const l=ne(this.config.selectors.inputs[i]),o=Z("button",X(l,{type:"button",role:"menuitemradio",class:`${this.config.classNames.control} ${l.class?l.class:""}`.trim(),"aria-checked":a,value:e})),r=Z("span");r.innerHTML=s,H(n)&&r.appendChild(n),o.appendChild(r),Object.defineProperty(o,"checked",{enumerable:!0,get:()=>"true"===o.getAttribute("aria-checked"),set(e){e&&Array.from(o.parentNode.children).filter((e=>re(e,'[role="menuitemradio"]'))).forEach((e=>e.setAttribute("aria-checked","false"))),o.setAttribute("aria-checked",e?"true":"false")}}),this.listeners.bind(o,"click keyup",(t=>{if(!F(t)||"Space"===t.key){switch(t.preventDefault(),t.stopPropagation(),o.checked=!0,i){case"language":this.currentTrack=Number(e);break;case"quality":this.quality=e;break;case"speed":this.speed=parseFloat(e)}We.showMenuPanel.call(this,"home",F(t))}}),i,!1),We.bindMenuItemShortcuts.call(this,o,i),t.appendChild(o)},formatTime(e=0,t=!1){if(!$(e))return e;return Ue(e,Be(this.duration)>0,t)},updateTimeDisplay(e=null,t=0,i=!1){H(e)&&$(t)&&(e.innerText=We.formatTime(t,i))},updateVolume(){this.supported.ui&&(H(this.elements.inputs.volume)&&We.setRange.call(this,this.elements.inputs.volume,this.muted?0:this.volume),H(this.elements.buttons.mute)&&(this.elements.buttons.mute.pressed=this.muted||0===this.volume))},setRange(e,t=0){H(e)&&(e.value=t,We.updateRangeFill.call(this,e))},updateProgress(e){if(!this.supported.ui||!R(e))return;let t=0;const i=(e,t)=>{const i=$(t)?t:0,s=H(e)?e:this.elements.display.buffer;if(H(s)){s.value=i;const e=s.getElementsByTagName("span")[0];H(e)&&(e.childNodes[0].nodeValue=i)}};if(e)switch(e.type){case"timeupdate":case"seeking":case"seeked":s=this.currentTime,n=this.duration,t=0===s||0===n||Number.isNaN(s)||Number.isNaN(n)?0:(s/n*100).toFixed(2),"timeupdate"===e.type&&We.setRange.call(this,this.elements.inputs.seek,t);break;case"playing":case"progress":i(this.elements.display.buffer,100*this.buffered)}var s,n},updateRangeFill(e){const t=R(e)?e.target:e;if(H(t)&&"range"===t.getAttribute("type")){if(re(t,this.config.selectors.inputs.seek)){t.setAttribute("aria-valuenow",this.currentTime);const e=We.formatTime(this.currentTime),i=We.formatTime(this.duration),s=He.get("seekLabel",this.config);t.setAttribute("aria-valuetext",s.replace("{currentTime}",e).replace("{duration}",i))}else if(re(t,this.config.selectors.inputs.volume)){const e=100*t.value;t.setAttribute("aria-valuenow",e),t.setAttribute("aria-valuetext",`${e.toFixed(1)}%`)}else t.setAttribute("aria-valuenow",t.value);Y.isWebkit&&t.style.setProperty("--value",t.value/t.max*100+"%")}},updateSeekTooltip(e){var t,i;if(!this.config.tooltips.seek||!H(this.elements.inputs.seek)||!H(this.elements.display.seekTooltip)||0===this.duration)return;const s=this.elements.display.seekTooltip,n=`${this.config.classNames.tooltip}--visible`,a=e=>le(s,n,e);if(this.touch)return void a(!1);let l=0;const o=this.elements.progress.getBoundingClientRect();if(R(e))l=100/o.width*(e.pageX-o.left);else{if(!oe(s,n))return;l=parseFloat(s.style.left,10)}l<0?l=0:l>100&&(l=100);const r=this.duration/100*l;s.innerText=We.formatTime(r);const c=null===(t=this.config.markers)||void 0===t||null===(i=t.points)||void 0===i?void 0:i.find((({time:e})=>e===Math.round(r)));c&&s.insertAdjacentHTML("afterbegin",`${c.label}<br>`),s.style.left=`${l}%`,R(e)&&["mouseenter","mouseleave"].includes(e.type)&&a("mouseenter"===e.type)},timeUpdate(e){const t=!H(this.elements.display.duration)&&this.config.invertTime;We.updateTimeDisplay.call(this,this.elements.display.currentTime,t?this.duration-this.currentTime:this.currentTime,t),e&&"timeupdate"===e.type&&this.media.seeking||We.updateProgress.call(this,e)},durationUpdate(){if(!this.supported.ui||!this.config.invertTime&&this.currentTime)return;if(this.duration>=2**32)return ae(this.elements.display.currentTime,!0),void ae(this.elements.progress,!0);H(this.elements.inputs.seek)&&this.elements.inputs.seek.setAttribute("aria-valuemax",this.duration);const e=H(this.elements.display.duration);!e&&this.config.displayDuration&&this.paused&&We.updateTimeDisplay.call(this,this.elements.display.currentTime,this.duration),e&&We.updateTimeDisplay.call(this,this.elements.display.duration,this.duration),this.config.markers.enabled&&We.setMarkers.call(this),We.updateSeekTooltip.call(this)},toggleMenuButton(e,t){ae(this.elements.settings.buttons[e],!t)},updateSetting(e,t,i){const s=this.elements.settings.panels[e];let n=null,a=t;if("captions"===e)n=this.currentTrack;else{if(n=W(i)?this[e]:i,W(n)&&(n=this.config[e].default),!W(this.options[e])&&!this.options[e].includes(n))return void this.debug.warn(`Unsupported value of '${n}' for ${e}`);if(!this.config[e].options.includes(n))return void this.debug.warn(`Disabled value of '${n}' for ${e}`)}if(H(a)||(a=s&&s.querySelector('[role="menu"]')),!H(a))return;this.elements.settings.buttons[e].querySelector(`.${this.config.classNames.menu.value}`).innerHTML=We.getLabel.call(this,e,n);const l=a&&a.querySelector(`[value="${n}"]`);H(l)&&(l.checked=!0)},getLabel(e,t){switch(e){case"speed":return 1===t?He.get("normal",this.config):`${t}×`;case"quality":if($(t)){const e=He.get(`qualityLabel.${t}`,this.config);return e.length?e:`${t}p`}return Oe(t);case"captions":return Ye.getLabel.call(this);default:return null}},setQualityMenu(e){if(!H(this.elements.settings.panels.quality))return;const t="quality",i=this.elements.settings.panels.quality.querySelector('[role="menu"]');D(e)&&(this.options.quality=Ce(e).filter((e=>this.config.quality.options.includes(e))));const s=!W(this.options.quality)&&this.options.quality.length>1;if(We.toggleMenuButton.call(this,t,s),ie(i),We.checkMenu.call(this),!s)return;const n=e=>{const t=He.get(`qualityBadge.${e}`,this.config);return t.length?We.createBadge.call(this,t):null};this.options.quality.sort(((e,t)=>{const i=this.config.quality.options;return i.indexOf(e)>i.indexOf(t)?1:-1})).forEach((e=>{We.createMenuItem.call(this,{value:e,list:i,type:t,title:We.getLabel.call(this,"quality",e),badge:n(e)})})),We.updateSetting.call(this,t,i)},setCaptionsMenu(){if(!H(this.elements.settings.panels.captions))return;const e="captions",t=this.elements.settings.panels.captions.querySelector('[role="menu"]'),i=Ye.getTracks.call(this),s=Boolean(i.length);if(We.toggleMenuButton.call(this,e,s),ie(t),We.checkMenu.call(this),!s)return;const n=i.map(((e,i)=>({value:i,checked:this.captions.toggled&&this.currentTrack===i,title:Ye.getLabel.call(this,e),badge:e.language&&We.createBadge.call(this,e.language.toUpperCase()),list:t,type:"language"})));n.unshift({value:-1,checked:!this.captions.toggled,title:He.get("disabled",this.config),list:t,type:"language"}),n.forEach(We.createMenuItem.bind(this)),We.updateSetting.call(this,e,t)},setSpeedMenu(){if(!H(this.elements.settings.panels.speed))return;const e="speed",t=this.elements.settings.panels.speed.querySelector('[role="menu"]');this.options.speed=this.options.speed.filter((e=>e>=this.minimumSpeed&&e<=this.maximumSpeed));const i=!W(this.options.speed)&&this.options.speed.length>1;We.toggleMenuButton.call(this,e,i),ie(t),We.checkMenu.call(this),i&&(this.options.speed.forEach((i=>{We.createMenuItem.call(this,{value:i,list:t,type:e,title:We.getLabel.call(this,"speed",i)})})),We.updateSetting.call(this,e,t))},checkMenu(){const{buttons:e}=this.elements.settings,t=!W(e)&&Object.values(e).some((e=>!e.hidden));ae(this.elements.settings.menu,!t)},focusFirstMenuItem(e,t=!1){if(this.elements.settings.popup.hidden)return;let i=e;H(i)||(i=Object.values(this.elements.settings.panels).find((e=>!e.hidden)));const s=i.querySelector('[role^="menuitem"]');ue.call(this,s,t)},toggleMenu(e){const{popup:t}=this.elements.settings,i=this.elements.buttons.settings;if(!H(t)||!H(i))return;const{hidden:s}=t;let n=s;if(O(e))n=e;else if(F(e)&&"Escape"===e.key)n=!1;else if(R(e)){const s=j(e.composedPath)?e.composedPath()[0]:e.target,a=t.contains(s);if(a||!a&&e.target!==i&&n)return}i.setAttribute("aria-expanded",n),ae(t,!n),le(this.elements.container,this.config.classNames.menu.open,n),n&&F(e)?We.focusFirstMenuItem.call(this,null,!0):n||s||ue.call(this,i,F(e))},getMenuSize(e){const t=e.cloneNode(!0);t.style.position="absolute",t.style.opacity=0,t.removeAttribute("hidden"),e.parentNode.appendChild(t);const i=t.scrollWidth,s=t.scrollHeight;return te(t),{width:i,height:s}},showMenuPanel(e="",t=!1){const i=this.elements.container.querySelector(`#plyr-settings-${this.id}-${e}`);if(!H(i))return;const s=i.parentNode,n=Array.from(s.children).find((e=>!e.hidden));if(me.transitions&&!me.reducedMotion){s.style.width=`${n.scrollWidth}px`,s.style.height=`${n.scrollHeight}px`;const e=We.getMenuSize.call(this,i),t=e=>{e.target===s&&["width","height"].includes(e.propertyName)&&(s.style.width="",s.style.height="",be.call(this,s,z,t))};fe.call(this,s,z,t),s.style.width=`${e.width}px`,s.style.height=`${e.height}px`}ae(n,!0),ae(i,!1),We.focusFirstMenuItem.call(this,i,t)},setDownloadUrl(){const e=this.elements.buttons.download;H(e)&&e.setAttribute("href",this.download)},create(e){const{bindMenuItemShortcuts:t,createButton:i,createProgress:s,createRange:n,createTime:a,setQualityMenu:l,setSpeedMenu:o,showMenuPanel:r}=We;this.elements.controls=null,D(this.config.controls)&&this.config.controls.includes("play-large")&&this.elements.container.appendChild(i.call(this,"play-large"));const c=Z("div",ne(this.config.selectors.controls.wrapper));this.elements.controls=c;const h={class:"plyr__controls__item"};return Ce(D(this.config.controls)?this.config.controls:[]).forEach((l=>{if("restart"===l&&c.appendChild(i.call(this,"restart",h)),"rewind"===l&&c.appendChild(i.call(this,"rewind",h)),"play"===l&&c.appendChild(i.call(this,"play",h)),"fast-forward"===l&&c.appendChild(i.call(this,"fast-forward",h)),"progress"===l){const t=Z("div",{class:`${h.class} plyr__progress__container`}),i=Z("div",ne(this.config.selectors.progress));if(i.appendChild(n.call(this,"seek",{id:`plyr-seek-${e.id}`})),i.appendChild(s.call(this,"buffer")),this.config.tooltips.seek){const e=Z("span",{class:this.config.classNames.tooltip},"00:00");i.appendChild(e),this.elements.display.seekTooltip=e}this.elements.progress=i,t.appendChild(this.elements.progress),c.appendChild(t)}if("current-time"===l&&c.appendChild(a.call(this,"currentTime",h)),"duration"===l&&c.appendChild(a.call(this,"duration",h)),"mute"===l||"volume"===l){let{volume:t}=this.elements;if(H(t)&&c.contains(t)||(t=Z("div",X({},h,{class:`${h.class} plyr__volume`.trim()})),this.elements.volume=t,c.appendChild(t)),"mute"===l&&t.appendChild(i.call(this,"mute")),"volume"===l&&!Y.isIos){const i={max:1,step:.05,value:this.config.volume};t.appendChild(n.call(this,"volume",X(i,{id:`plyr-volume-${e.id}`})))}}if("captions"===l&&c.appendChild(i.call(this,"captions",h)),"settings"===l&&!W(this.config.settings)){const s=Z("div",X({},h,{class:`${h.class} plyr__menu`.trim(),hidden:""}));s.appendChild(i.call(this,"settings",{"aria-haspopup":!0,"aria-controls":`plyr-settings-${e.id}`,"aria-expanded":!1}));const n=Z("div",{class:"plyr__menu__container",id:`plyr-settings-${e.id}`,hidden:""}),a=Z("div"),l=Z("div",{id:`plyr-settings-${e.id}-home`}),o=Z("div",{role:"menu"});l.appendChild(o),a.appendChild(l),this.elements.settings.panels.home=l,this.config.settings.forEach((i=>{const s=Z("button",X(ne(this.config.selectors.buttons.settings),{type:"button",class:`${this.config.classNames.control} ${this.config.classNames.control}--forward`,role:"menuitem","aria-haspopup":!0,hidden:""}));t.call(this,s,i),fe.call(this,s,"click",(()=>{r.call(this,i,!1)}));const n=Z("span",null,He.get(i,this.config)),l=Z("span",{class:this.config.classNames.menu.value});l.innerHTML=e[i],n.appendChild(l),s.appendChild(n),o.appendChild(s);const c=Z("div",{id:`plyr-settings-${e.id}-${i}`,hidden:""}),h=Z("button",{type:"button",class:`${this.config.classNames.control} ${this.config.classNames.control}--back`});h.appendChild(Z("span",{"aria-hidden":!0},He.get(i,this.config))),h.appendChild(Z("span",{class:this.config.classNames.hidden},He.get("menuBack",this.config))),fe.call(this,c,"keydown",(e=>{"ArrowLeft"===e.key&&(e.preventDefault(),e.stopPropagation(),r.call(this,"home",!0))}),!1),fe.call(this,h,"click",(()=>{r.call(this,"home",!1)})),c.appendChild(h),c.appendChild(Z("div",{role:"menu"})),a.appendChild(c),this.elements.settings.buttons[i]=s,this.elements.settings.panels[i]=c})),n.appendChild(a),s.appendChild(n),c.appendChild(s),this.elements.settings.popup=n,this.elements.settings.menu=s}if("pip"===l&&me.pip&&c.appendChild(i.call(this,"pip",h)),"airplay"===l&&me.airplay&&c.appendChild(i.call(this,"airplay",h)),"download"===l){const e=X({},h,{element:"a",href:this.download,target:"_blank"});this.isHTML5&&(e.download="");const{download:t}=this.config.urls;!U(t)&&this.isEmbed&&X(e,{icon:`logo-${this.provider}`,label:this.provider}),c.appendChild(i.call(this,"download",e))}"fullscreen"===l&&c.appendChild(i.call(this,"fullscreen",h))})),this.isHTML5&&l.call(this,Le.getQualityOptions.call(this)),o.call(this),c},inject(){if(this.config.loadSprite){const e=We.getIconUrl.call(this);e.cors&&Ve(e.url,"sprite-plyr")}this.id=Math.floor(1e4*Math.random());let e=null;this.elements.controls=null;const t={id:this.id,seektime:this.config.seekTime,title:this.config.title};let i=!0;j(this.config.controls)&&(this.config.controls=this.config.controls.call(this,t)),this.config.controls||(this.config.controls=[]),H(this.config.controls)||_(this.config.controls)?e=this.config.controls:(e=We.create.call(this,{id:this.id,seektime:this.config.seekTime,speed:this.speed,quality:this.quality,captions:Ye.getLabel.call(this)}),i=!1);let s;i&&_(this.config.controls)&&(e=(e=>{let i=e;return Object.entries(t).forEach((([e,t])=>{i=_e(i,`{${e}}`,t)})),i})(e)),_(this.config.selectors.controls.container)&&(s=document.querySelector(this.config.selectors.controls.container)),H(s)||(s=this.elements.container);if(s[H(e)?"insertAdjacentElement":"insertAdjacentHTML"]("afterbegin",e),H(this.elements.controls)||We.findElements.call(this),!W(this.elements.buttons)){const e=e=>{const t=this.config.classNames.controlPressed;Object.defineProperty(e,"pressed",{enumerable:!0,get:()=>oe(e,t),set(i=!1){le(e,t,i)}})};Object.values(this.elements.buttons).filter(Boolean).forEach((t=>{D(t)||q(t)?Array.from(t).filter(Boolean).forEach(e):e(t)}))}if(Y.isEdge&&K(s),this.config.tooltips.controls){const{classNames:e,selectors:t}=this.config,i=`${t.controls.wrapper} ${t.labels} .${e.hidden}`,s=ce.call(this,i);Array.from(s).forEach((e=>{le(e,this.config.classNames.hidden,!1),le(e,this.config.classNames.tooltip,!0)}))}},setMediaMetadata(){try{"mediaSession"in navigator&&(navigator.mediaSession.metadata=new window.MediaMetadata({title:this.config.mediaMetadata.title,artist:this.config.mediaMetadata.artist,album:this.config.mediaMetadata.album,artwork:this.config.mediaMetadata.artwork}))}catch(e){}},setMarkers(){var e,t;if(!this.duration||this.elements.markers)return;const i=null===(e=this.config.markers)||void 0===e||null===(t=e.points)||void 0===t?void 0:t.filter((({time:e})=>e>0&&e<this.duration));if(null==i||!i.length)return;const s=document.createDocumentFragment(),n=document.createDocumentFragment();let a=null;const l=`${this.config.classNames.tooltip}--visible`,o=e=>le(a,l,e);i.forEach((e=>{const t=Z("span",{class:this.config.classNames.marker},""),i=e.time/this.duration*100+"%";a&&(t.addEventListener("mouseenter",(()=>{e.label||(a.style.left=i,a.innerHTML=e.label,o(!0))})),t.addEventListener("mouseleave",(()=>{o(!1)}))),t.addEventListener("click",(()=>{this.currentTime=e.time})),t.style.left=i,n.appendChild(t)})),s.appendChild(n),this.config.tooltips.seek||(a=Z("span",{class:this.config.classNames.tooltip},""),s.appendChild(a)),this.elements.markers={points:n,tip:a},this.elements.progress.appendChild(s)}};function ze(e,t=!0){let i=e;if(t){const e=document.createElement("a");e.href=i,i=e.href}try{return new URL(i)}catch(e){return null}}function Ke(e){const t=new URLSearchParams;return L(e)&&Object.entries(e).forEach((([e,i])=>{t.set(e,i)})),t}const Ye={setup(){if(!this.supported.ui)return;if(!this.isVideo||this.isYouTube||this.isHTML5&&!me.textTracks)return void(D(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&We.setCaptionsMenu.call(this));var e,t;if(H(this.elements.captions)||(this.elements.captions=Z("div",ne(this.config.selectors.captions)),e=this.elements.captions,t=this.elements.wrapper,H(e)&&H(t)&&t.parentNode.insertBefore(e,t.nextSibling)),Y.isIE&&window.URL){const e=this.media.querySelectorAll("track");Array.from(e).forEach((e=>{const t=e.getAttribute("src"),i=ze(t);null!==i&&i.hostname!==window.location.href.hostname&&["http:","https:"].includes(i.protocol)&&Fe(t,"blob").then((t=>{e.setAttribute("src",window.URL.createObjectURL(t))})).catch((()=>{te(e)}))}))}const i=Ce((navigator.languages||[navigator.language||navigator.userLanguage||"en"]).map((e=>e.split("-")[0])));let s=(this.storage.get("language")||this.config.captions.language||"auto").toLowerCase();"auto"===s&&([s]=i);let n=this.storage.get("captions");if(O(n)||({active:n}=this.config.captions),Object.assign(this.captions,{toggled:!1,active:n,language:s,languages:i}),this.isHTML5){const e=this.config.captions.update?"addtrack removetrack":"removetrack";fe.call(this,this.media.textTracks,e,Ye.update.bind(this))}setTimeout(Ye.update.bind(this),0)},update(){const e=Ye.getTracks.call(this,!0),{active:t,language:i,meta:s,currentTrackNode:n}=this.captions,a=Boolean(e.find((e=>e.language===i)));this.isHTML5&&this.isVideo&&e.filter((e=>!s.get(e))).forEach((e=>{this.debug.log("Track added",e),s.set(e,{default:"showing"===e.mode}),"showing"===e.mode&&(e.mode="hidden"),fe.call(this,e,"cuechange",(()=>Ye.updateCues.call(this)))})),(a&&this.language!==i||!e.includes(n))&&(Ye.setLanguage.call(this,i),Ye.toggle.call(this,t&&a)),this.elements&&le(this.elements.container,this.config.classNames.captions.enabled,!W(e)),D(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&We.setCaptionsMenu.call(this)},toggle(e,t=!0){if(!this.supported.ui)return;const{toggled:i}=this.captions,s=this.config.classNames.captions.active,n=I(e)?!i:e;if(n!==i){if(t||(this.captions.active=n,this.storage.set({captions:n})),!this.language&&n&&!t){const e=Ye.getTracks.call(this),t=Ye.findTrack.call(this,[this.captions.language,...this.captions.languages],!0);return this.captions.language=t.language,void Ye.set.call(this,e.indexOf(t))}this.elements.buttons.captions&&(this.elements.buttons.captions.pressed=n),le(this.elements.container,s,n),this.captions.toggled=n,We.updateSetting.call(this,"captions"),ve.call(this,this.media,n?"captionsenabled":"captionsdisabled")}setTimeout((()=>{n&&this.captions.toggled&&(this.captions.currentTrackNode.mode="hidden")}))},set(e,t=!0){const i=Ye.getTracks.call(this);if(-1!==e)if($(e))if(e in i){if(this.captions.currentTrack!==e){this.captions.currentTrack=e;const s=i[e],{language:n}=s||{};this.captions.currentTrackNode=s,We.updateSetting.call(this,"captions"),t||(this.captions.language=n,this.storage.set({language:n})),this.isVimeo&&this.embed.enableTextTrack(n),ve.call(this,this.media,"languagechange")}Ye.toggle.call(this,!0,t),this.isHTML5&&this.isVideo&&Ye.updateCues.call(this)}else this.debug.warn("Track not found",e);else this.debug.warn("Invalid caption argument",e);else Ye.toggle.call(this,!1,t)},setLanguage(e,t=!0){if(!_(e))return void this.debug.warn("Invalid language argument",e);const i=e.toLowerCase();this.captions.language=i;const s=Ye.getTracks.call(this),n=Ye.findTrack.call(this,[i]);Ye.set.call(this,s.indexOf(n),t)},getTracks(e=!1){return Array.from((this.media||{}).textTracks||[]).filter((t=>!this.isHTML5||e||this.captions.meta.has(t))).filter((e=>["captions","subtitles"].includes(e.kind)))},findTrack(e,t=!1){const i=Ye.getTracks.call(this),s=e=>Number((this.captions.meta.get(e)||{}).default),n=Array.from(i).sort(((e,t)=>s(t)-s(e)));let a;return e.every((e=>(a=n.find((t=>t.language===e)),!a))),a||(t?n[0]:void 0)},getCurrentTrack(){return Ye.getTracks.call(this)[this.currentTrack]},getLabel(e){let t=e;return!V(t)&&me.textTracks&&this.captions.toggled&&(t=Ye.getCurrentTrack.call(this)),V(t)?W(t.label)?W(t.language)?He.get("enabled",this.config):e.language.toUpperCase():t.label:He.get("disabled",this.config)},updateCues(e){if(!this.supported.ui)return;if(!H(this.elements.captions))return void this.debug.warn("No captions element to render to");if(!I(e)&&!Array.isArray(e))return void this.debug.warn("updateCues: Invalid input",e);let t=e;if(!t){const e=Ye.getCurrentTrack.call(this);t=Array.from((e||{}).activeCues||[]).map((e=>e.getCueAsHTML())).map(De)}const i=t.map((e=>e.trim())).join("\n");if(i!==this.elements.captions.innerHTML){ie(this.elements.captions);const e=Z("span",ne(this.config.selectors.caption));e.innerHTML=i,this.elements.captions.appendChild(e),ve.call(this,this.media,"cuechange")}}},Qe={enabled:!0,title:"",debug:!1,autoplay:!1,autopause:!0,playsinline:!0,seekTime:10,volume:1,muted:!1,duration:null,displayDuration:!0,invertTime:!0,toggleInvert:!0,ratio:null,clickToPlay:!0,hideControls:!0,resetOnEnd:!1,disableContextMenu:!0,loadSprite:!0,iconPrefix:"plyr",iconUrl:"https://cdn.plyr.io/3.7.2/plyr.svg",blankVideo:"https://cdn.plyr.io/static/blank.mp4",quality:{default:576,options:[4320,2880,2160,1440,1080,720,576,480,360,240],forced:!1,onChange:null},loop:{active:!1},speed:{selected:1,options:[.5,.75,1,1.25,1.5,1.75,2,4]},keyboard:{focused:!0,global:!1},tooltips:{controls:!1,seek:!0},captions:{active:!1,language:"auto",update:!1},fullscreen:{enabled:!0,fallback:!0,iosNative:!1},storage:{enabled:!0,key:"plyr"},controls:["play-large","play","progress","current-time","mute","volume","captions","settings","pip","airplay","fullscreen"],settings:["captions","quality","speed"],i18n:{restart:"Restart",rewind:"Rewind {seektime}s",play:"Play",pause:"Pause",fastForward:"Forward {seektime}s",seek:"Seek",seekLabel:"{currentTime} of {duration}",played:"Played",buffered:"Buffered",currentTime:"Current time",duration:"Duration",volume:"Volume",mute:"Mute",unmute:"Unmute",enableCaptions:"Enable captions",disableCaptions:"Disable captions",download:"Download",enterFullscreen:"Enter fullscreen",exitFullscreen:"Exit fullscreen",frameTitle:"Player for {title}",captions:"Captions",settings:"Settings",pip:"PIP",menuBack:"Go back to previous menu",speed:"Speed",normal:"Normal",quality:"Quality",loop:"Loop",start:"Start",end:"End",all:"All",reset:"Reset",disabled:"Disabled",enabled:"Enabled",advertisement:"Ad",qualityBadge:{2160:"4K",1440:"HD",1080:"HD",720:"HD",576:"SD",480:"SD"}},urls:{download:null,vimeo:{sdk:"https://player.vimeo.com/api/player.js",iframe:"https://player.vimeo.com/video/{0}?{1}",api:"https://vimeo.com/api/oembed.json?url={0}"},youtube:{sdk:"https://www.youtube.com/iframe_api",api:"https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}"},googleIMA:{sdk:"https://imasdk.googleapis.com/js/sdkloader/ima3.js"}},listeners:{seek:null,play:null,pause:null,restart:null,rewind:null,fastForward:null,mute:null,volume:null,captions:null,download:null,fullscreen:null,pip:null,airplay:null,speed:null,quality:null,loop:null,language:null},events:["ended","progress","stalled","playing","waiting","canplay","canplaythrough","loadstart","loadeddata","loadedmetadata","timeupdate","volumechange","play","pause","error","seeking","seeked","emptied","ratechange","cuechange","download","enterfullscreen","exitfullscreen","captionsenabled","captionsdisabled","languagechange","controlshidden","controlsshown","ready","statechange","qualitychange","adsloaded","adscontentpause","adscontentresume","adstarted","adsmidpoint","adscomplete","adsallcomplete","adsimpression","adsclick"],selectors:{editable:"input, textarea, select, [contenteditable]",container:".plyr",controls:{container:null,wrapper:".plyr__controls"},labels:"[data-plyr]",buttons:{play:'[data-plyr="play"]',pause:'[data-plyr="pause"]',restart:'[data-plyr="restart"]',rewind:'[data-plyr="rewind"]',fastForward:'[data-plyr="fast-forward"]',mute:'[data-plyr="mute"]',captions:'[data-plyr="captions"]',download:'[data-plyr="download"]',fullscreen:'[data-plyr="fullscreen"]',pip:'[data-plyr="pip"]',airplay:'[data-plyr="airplay"]',settings:'[data-plyr="settings"]',loop:'[data-plyr="loop"]'},inputs:{seek:'[data-plyr="seek"]',volume:'[data-plyr="volume"]',speed:'[data-plyr="speed"]',language:'[data-plyr="language"]',quality:'[data-plyr="quality"]'},display:{currentTime:".plyr__time--current",duration:".plyr__time--duration",buffer:".plyr__progress__buffer",loop:".plyr__progress__loop",volume:".plyr__volume--display"},progress:".plyr__progress",captions:".plyr__captions",caption:".plyr__caption"},classNames:{type:"plyr--{0}",provider:"plyr--{0}",video:"plyr__video-wrapper",embed:"plyr__video-embed",videoFixedRatio:"plyr__video-wrapper--fixed-ratio",embedContainer:"plyr__video-embed__container",poster:"plyr__poster",posterEnabled:"plyr__poster-enabled",ads:"plyr__ads",control:"plyr__control",controlPressed:"plyr__control--pressed",playing:"plyr--playing",paused:"plyr--paused",stopped:"plyr--stopped",loading:"plyr--loading",hover:"plyr--hover",tooltip:"plyr__tooltip",cues:"plyr__cues",marker:"plyr__progress__marker",hidden:"plyr__sr-only",hideControls:"plyr--hide-controls",isIos:"plyr--is-ios",isTouch:"plyr--is-touch",uiSupported:"plyr--full-ui",noTransition:"plyr--no-transition",display:{time:"plyr__time"},menu:{value:"plyr__menu__value",badge:"plyr__badge",open:"plyr--menu-open"},captions:{enabled:"plyr--captions-enabled",active:"plyr--captions-active"},fullscreen:{enabled:"plyr--fullscreen-enabled",fallback:"plyr--fullscreen-fallback"},pip:{supported:"plyr--pip-supported",active:"plyr--pip-active"},airplay:{supported:"plyr--airplay-supported",active:"plyr--airplay-active"},tabFocus:"plyr__tab-focus",previewThumbnails:{thumbContainer:"plyr__preview-thumb",thumbContainerShown:"plyr__preview-thumb--is-shown",imageContainer:"plyr__preview-thumb__image-container",timeContainer:"plyr__preview-thumb__time-container",scrubbingContainer:"plyr__preview-scrubbing",scrubbingContainerShown:"plyr__preview-scrubbing--is-shown"}},attributes:{embed:{provider:"data-plyr-provider",id:"data-plyr-embed-id",hash:"data-plyr-embed-hash"}},ads:{enabled:!1,publisherId:"",tagUrl:""},previewThumbnails:{enabled:!1,src:""},vimeo:{byline:!1,portrait:!1,title:!1,speed:!0,transparent:!1,customControls:!0,referrerPolicy:null,premium:!1},youtube:{rel:0,showinfo:0,iv_load_policy:3,modestbranding:1,customControls:!0,noCookie:!1},mediaMetadata:{title:"",artist:"",album:"",artwork:[]},markers:{enabled:!1,points:[]}},Xe="picture-in-picture",Je="inline",Ge={html5:"html5",youtube:"youtube",vimeo:"vimeo"},Ze="audio",et="video";const tt=()=>{};class it{constructor(e=!1){this.enabled=window.console&&e,this.enabled&&this.log("Debugging enabled")}get log(){return this.enabled?Function.prototype.bind.call(console.log,console):tt}get warn(){return this.enabled?Function.prototype.bind.call(console.warn,console):tt}get error(){return this.enabled?Function.prototype.bind.call(console.error,console):tt}}class st{constructor(t){e(this,"onChange",(()=>{if(!this.enabled)return;const e=this.player.elements.buttons.fullscreen;H(e)&&(e.pressed=this.active);const t=this.target===this.player.media?this.target:this.player.elements.container;ve.call(this.player,t,this.active?"enterfullscreen":"exitfullscreen",!0)})),e(this,"toggleFallback",((e=!1)=>{if(e?this.scrollPosition={x:window.scrollX||0,y:window.scrollY||0}:window.scrollTo(this.scrollPosition.x,this.scrollPosition.y),document.body.style.overflow=e?"hidden":"",le(this.target,this.player.config.classNames.fullscreen.fallback,e),Y.isIos){let t=document.head.querySelector('meta[name="viewport"]');const i="viewport-fit=cover";t||(t=document.createElement("meta"),t.setAttribute("name","viewport"));const s=_(t.content)&&t.content.includes(i);e?(this.cleanupViewport=!s,s||(t.content+=`,${i}`)):this.cleanupViewport&&(t.content=t.content.split(",").filter((e=>e.trim()!==i)).join(","))}this.onChange()})),e(this,"trapFocus",(e=>{if(Y.isIos||!this.active||"Tab"!==e.key)return;const t=document.activeElement,i=ce.call(this.player,"a[href], button:not(:disabled), input:not(:disabled), [tabindex]"),[s]=i,n=i[i.length-1];t!==n||e.shiftKey?t===s&&e.shiftKey&&(n.focus(),e.preventDefault()):(s.focus(),e.preventDefault())})),e(this,"update",(()=>{if(this.enabled){let e;e=this.forceFallback?"Fallback (forced)":st.native?"Native":"Fallback",this.player.debug.log(`${e} fullscreen enabled`)}else this.player.debug.log("Fullscreen not supported and fallback disabled");le(this.player.elements.container,this.player.config.classNames.fullscreen.enabled,this.enabled)})),e(this,"enter",(()=>{this.enabled&&(Y.isIos&&this.player.config.fullscreen.iosNative?this.player.isVimeo?this.player.embed.requestFullscreen():this.target.webkitEnterFullscreen():!st.native||this.forceFallback?this.toggleFallback(!0):this.prefix?W(this.prefix)||this.target[`${this.prefix}Request${this.property}`]():this.target.requestFullscreen({navigationUI:"hide"}))})),e(this,"exit",(()=>{if(this.enabled)if(Y.isIos&&this.player.config.fullscreen.iosNative)this.target.webkitExitFullscreen(),ke(this.player.play());else if(!st.native||this.forceFallback)this.toggleFallback(!1);else if(this.prefix){if(!W(this.prefix)){const e="moz"===this.prefix?"Cancel":"Exit";document[`${this.prefix}${e}${this.property}`]()}}else(document.cancelFullScreen||document.exitFullscreen).call(document)})),e(this,"toggle",(()=>{this.active?this.exit():this.enter()})),this.player=t,this.prefix=st.prefix,this.property=st.property,this.scrollPosition={x:0,y:0},this.forceFallback="force"===t.config.fullscreen.fallback,this.player.elements.fullscreen=t.config.fullscreen.container&&function(e,t){const{prototype:i}=Element;return(i.closest||function(){let e=this;do{if(re.matches(e,t))return e;e=e.parentElement||e.parentNode}while(null!==e&&1===e.nodeType);return null}).call(e,t)}(this.player.elements.container,t.config.fullscreen.container),fe.call(this.player,document,"ms"===this.prefix?"MSFullscreenChange":`${this.prefix}fullscreenchange`,(()=>{this.onChange()})),fe.call(this.player,this.player.elements.container,"dblclick",(e=>{H(this.player.elements.controls)&&this.player.elements.controls.contains(e.target)||this.player.listeners.proxy(e,this.toggle,"fullscreen")})),fe.call(this,this.player.elements.container,"keydown",(e=>this.trapFocus(e))),this.update()}static get native(){return!!(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled)}get usingNative(){return st.native&&!this.forceFallback}static get prefix(){if(j(document.exitFullscreen))return"";let e="";return["webkit","moz","ms"].some((t=>!(!j(document[`${t}ExitFullscreen`])&&!j(document[`${t}CancelFullScreen`]))&&(e=t,!0))),e}static get property(){return"moz"===this.prefix?"FullScreen":"Fullscreen"}get enabled(){return(st.native||this.player.config.fullscreen.fallback)&&this.player.config.fullscreen.enabled&&this.player.supported.ui&&this.player.isVideo}get active(){if(!this.enabled)return!1;if(!st.native||this.forceFallback)return oe(this.target,this.player.config.classNames.fullscreen.fallback);const e=this.prefix?this.target.getRootNode()[`${this.prefix}${this.property}Element`]:this.target.getRootNode().fullscreenElement;return e&&e.shadowRoot?e===this.target.getRootNode().host:e===this.target}get target(){return Y.isIos&&this.player.config.fullscreen.iosNative?this.player.media:this.player.elements.fullscreen||this.player.elements.container}}function nt(e,t=1){return new Promise(((i,s)=>{const n=new Image,a=()=>{delete n.onload,delete n.onerror,(n.naturalWidth>=t?i:s)(n)};Object.assign(n,{onload:a,onerror:a,src:e})}))}const at={addStyleHook(){le(this.elements.container,this.config.selectors.container.replace(".",""),!0),le(this.elements.container,this.config.classNames.uiSupported,this.supported.ui)},toggleNativeControls(e=!1){e&&this.isHTML5?this.media.setAttribute("controls",""):this.media.removeAttribute("controls")},build(){if(this.listeners.media(),!this.supported.ui)return this.debug.warn(`Basic support only for ${this.provider} ${this.type}`),void at.toggleNativeControls.call(this,!0);H(this.elements.controls)||(We.inject.call(this),this.listeners.controls()),at.toggleNativeControls.call(this),this.isHTML5&&Ye.setup.call(this),this.volume=null,this.muted=null,this.loop=null,this.quality=null,this.speed=null,We.updateVolume.call(this),We.timeUpdate.call(this),We.durationUpdate.call(this),at.checkPlaying.call(this),le(this.elements.container,this.config.classNames.pip.supported,me.pip&&this.isHTML5&&this.isVideo),le(this.elements.container,this.config.classNames.airplay.supported,me.airplay&&this.isHTML5),le(this.elements.container,this.config.classNames.isIos,Y.isIos),le(this.elements.container,this.config.classNames.isTouch,this.touch),this.ready=!0,setTimeout((()=>{ve.call(this,this.media,"ready")}),0),at.setTitle.call(this),this.poster&&at.setPoster.call(this,this.poster,!1).catch((()=>{})),this.config.duration&&We.durationUpdate.call(this),this.config.mediaMetadata&&We.setMediaMetadata.call(this)},setTitle(){let e=He.get("play",this.config);if(_(this.config.title)&&!W(this.config.title)&&(e+=`, ${this.config.title}`),Array.from(this.elements.buttons.play||[]).forEach((t=>{t.setAttribute("aria-label",e)})),this.isEmbed){const e=he.call(this,"iframe");if(!H(e))return;const t=W(this.config.title)?"video":this.config.title,i=He.get("frameTitle",this.config);e.setAttribute("title",i.replace("{title}",t))}},togglePoster(e){le(this.elements.container,this.config.classNames.posterEnabled,e)},setPoster(e,t=!0){return t&&this.poster?Promise.reject(new Error("Poster already set")):(this.media.setAttribute("data-poster",e),this.elements.poster.removeAttribute("hidden"),Te.call(this).then((()=>nt(e))).catch((t=>{throw e===this.poster&&at.togglePoster.call(this,!1),t})).then((()=>{if(e!==this.poster)throw new Error("setPoster cancelled by later call to setPoster")})).then((()=>(Object.assign(this.elements.poster.style,{backgroundImage:`url('${e}')`,backgroundSize:""}),at.togglePoster.call(this,!0),e))))},checkPlaying(e){le(this.elements.container,this.config.classNames.playing,this.playing),le(this.elements.container,this.config.classNames.paused,this.paused),le(this.elements.container,this.config.classNames.stopped,this.stopped),Array.from(this.elements.buttons.play||[]).forEach((e=>{Object.assign(e,{pressed:this.playing}),e.setAttribute("aria-label",He.get(this.playing?"pause":"play",this.config))})),R(e)&&"timeupdate"===e.type||at.toggleControls.call(this)},checkLoading(e){this.loading=["stalled","waiting"].includes(e.type),clearTimeout(this.timers.loading),this.timers.loading=setTimeout((()=>{le(this.elements.container,this.config.classNames.loading,this.loading),at.toggleControls.call(this)}),this.loading?250:0)},toggleControls(e){const{controls:t}=this.elements;if(t&&this.config.hideControls){const i=this.touch&&this.lastSeekTime+2e3>Date.now();this.toggleControls(Boolean(e||this.loading||this.paused||t.pressed||t.hover||i))}},migrateStyles(){Object.values({...this.media.style}).filter((e=>!W(e)&&_(e)&&e.startsWith("--plyr"))).forEach((e=>{this.elements.container.style.setProperty(e,this.media.style.getPropertyValue(e)),this.media.style.removeProperty(e)})),W(this.media.style)&&this.media.removeAttribute("style")}};class lt{constructor(t){e(this,"firstTouch",(()=>{const{player:e}=this,{elements:t}=e;e.touch=!0,le(t.container,e.config.classNames.isTouch,!0)})),e(this,"setTabFocus",(e=>{const{player:t}=this,{elements:i}=t,{key:s,type:n,timeStamp:a}=e;if(clearTimeout(this.focusTimer),"keydown"===n&&"Tab"!==s)return;"keydown"===n&&(this.lastKeyDown=a);const l=a-this.lastKeyDown<=20;("focus"!==n||l)&&((()=>{const e=t.config.classNames.tabFocus;le(ce.call(t,`.${e}`),e,!1)})(),"focusout"!==n&&(this.focusTimer=setTimeout((()=>{const e=document.activeElement;i.container.contains(e)&&le(document.activeElement,t.config.classNames.tabFocus,!0)}),10)))})),e(this,"global",((e=!0)=>{const{player:t}=this;t.config.keyboard.global&&ge.call(t,window,"keydown keyup",this.handleKey,e,!1),ge.call(t,document.body,"click",this.toggleMenu,e),ye.call(t,document.body,"touchstart",this.firstTouch),ge.call(t,document.body,"keydown focus blur focusout",this.setTabFocus,e,!1,!0)})),e(this,"container",(()=>{const{player:e}=this,{config:t,elements:i,timers:s}=e;!t.keyboard.global&&t.keyboard.focused&&fe.call(e,i.container,"keydown keyup",this.handleKey,!1),fe.call(e,i.container,"mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen",(t=>{const{controls:n}=i;n&&"enterfullscreen"===t.type&&(n.pressed=!1,n.hover=!1);let a=0;["touchstart","touchmove","mousemove"].includes(t.type)&&(at.toggleControls.call(e,!0),a=e.touch?3e3:2e3),clearTimeout(s.controls),s.controls=setTimeout((()=>at.toggleControls.call(e,!1)),a)}));const n=()=>{if(!e.isVimeo||e.config.vimeo.premium)return;const t=i.wrapper,{active:s}=e.fullscreen,[n,a]=Ne.call(e),l=Se(`aspect-ratio: ${n} / ${a}`);if(!s)return void(l?(t.style.width=null,t.style.height=null):(t.style.maxWidth=null,t.style.margin=null));const[o,r]=[Math.max(document.documentElement.clientWidth||0,window.innerWidth||0),Math.max(document.documentElement.clientHeight||0,window.innerHeight||0)],c=o/r>n/a;l?(t.style.width=c?"auto":"100%",t.style.height=c?"100%":"auto"):(t.style.maxWidth=c?r/a*n+"px":null,t.style.margin=c?"0 auto":null)},a=()=>{clearTimeout(s.resized),s.resized=setTimeout(n,50)};fe.call(e,i.container,"enterfullscreen exitfullscreen",(t=>{const{target:s}=e.fullscreen;if(s!==i.container)return;if(!e.isEmbed&&W(e.config.ratio))return;n();("enterfullscreen"===t.type?fe:be).call(e,window,"resize",a)}))})),e(this,"media",(()=>{const{player:e}=this,{elements:t}=e;if(fe.call(e,e.media,"timeupdate seeking seeked",(t=>We.timeUpdate.call(e,t))),fe.call(e,e.media,"durationchange loadeddata loadedmetadata",(t=>We.durationUpdate.call(e,t))),fe.call(e,e.media,"ended",(()=>{e.isHTML5&&e.isVideo&&e.config.resetOnEnd&&(e.restart(),e.pause())})),fe.call(e,e.media,"progress playing seeking seeked",(t=>We.updateProgress.call(e,t))),fe.call(e,e.media,"volumechange",(t=>We.updateVolume.call(e,t))),fe.call(e,e.media,"playing play pause ended emptied timeupdate",(t=>at.checkPlaying.call(e,t))),fe.call(e,e.media,"waiting canplay seeked playing",(t=>at.checkLoading.call(e,t))),e.supported.ui&&e.config.clickToPlay&&!e.isAudio){const i=he.call(e,`.${e.config.classNames.video}`);if(!H(i))return;fe.call(e,t.container,"click",(s=>{([t.container,i].includes(s.target)||i.contains(s.target))&&(e.touch&&e.config.hideControls||(e.ended?(this.proxy(s,e.restart,"restart"),this.proxy(s,(()=>{ke(e.play())}),"play")):this.proxy(s,(()=>{ke(e.togglePlay())}),"play")))}))}e.supported.ui&&e.config.disableContextMenu&&fe.call(e,t.wrapper,"contextmenu",(e=>{e.preventDefault()}),!1),fe.call(e,e.media,"volumechange",(()=>{e.storage.set({volume:e.volume,muted:e.muted})})),fe.call(e,e.media,"ratechange",(()=>{We.updateSetting.call(e,"speed"),e.storage.set({speed:e.speed})})),fe.call(e,e.media,"qualitychange",(t=>{We.updateSetting.call(e,"quality",null,t.detail.quality)})),fe.call(e,e.media,"ready qualitychange",(()=>{We.setDownloadUrl.call(e)}));const i=e.config.events.concat(["keyup","keydown"]).join(" ");fe.call(e,e.media,i,(i=>{let{detail:s={}}=i;"error"===i.type&&(s=e.media.error),ve.call(e,t.container,i.type,!0,s)}))})),e(this,"proxy",((e,t,i)=>{const{player:s}=this,n=s.config.listeners[i];let a=!0;j(n)&&(a=n.call(s,e)),!1!==a&&j(t)&&t.call(s,e)})),e(this,"bind",((e,t,i,s,n=!0)=>{const{player:a}=this,l=a.config.listeners[s],o=j(l);fe.call(a,e,t,(e=>this.proxy(e,i,s)),n&&!o)})),e(this,"controls",(()=>{const{player:e}=this,{elements:t}=e,i=Y.isIE?"change":"input";if(t.buttons.play&&Array.from(t.buttons.play).forEach((t=>{this.bind(t,"click",(()=>{ke(e.togglePlay())}),"play")})),this.bind(t.buttons.restart,"click",e.restart,"restart"),this.bind(t.buttons.rewind,"click",(()=>{e.lastSeekTime=Date.now(),e.rewind()}),"rewind"),this.bind(t.buttons.fastForward,"click",(()=>{e.lastSeekTime=Date.now(),e.forward()}),"fastForward"),this.bind(t.buttons.mute,"click",(()=>{e.muted=!e.muted}),"mute"),this.bind(t.buttons.captions,"click",(()=>e.toggleCaptions())),this.bind(t.buttons.download,"click",(()=>{ve.call(e,e.media,"download")}),"download"),this.bind(t.buttons.fullscreen,"click",(()=>{e.fullscreen.toggle()}),"fullscreen"),this.bind(t.buttons.pip,"click",(()=>{e.pip="toggle"}),"pip"),this.bind(t.buttons.airplay,"click",e.airplay,"airplay"),this.bind(t.buttons.settings,"click",(t=>{t.stopPropagation(),t.preventDefault(),We.toggleMenu.call(e,t)}),null,!1),this.bind(t.buttons.settings,"keyup",(t=>{["Space","Enter"].includes(t.key)&&("Enter"!==t.key?(t.preventDefault(),t.stopPropagation(),We.toggleMenu.call(e,t)):We.focusFirstMenuItem.call(e,null,!0))}),null,!1),this.bind(t.settings.menu,"keydown",(t=>{"Escape"===t.key&&We.toggleMenu.call(e,t)})),this.bind(t.inputs.seek,"mousedown mousemove",(e=>{const i=t.progress.getBoundingClientRect(),s=100/i.width*(e.pageX-i.left);e.currentTarget.setAttribute("seek-value",s)})),this.bind(t.inputs.seek,"mousedown mouseup keydown keyup touchstart touchend",(t=>{const i=t.currentTarget,s="play-on-seeked";if(F(t)&&!["ArrowLeft","ArrowRight"].includes(t.key))return;e.lastSeekTime=Date.now();const n=i.hasAttribute(s),a=["mouseup","touchend","keyup"].includes(t.type);n&&a?(i.removeAttribute(s),ke(e.play())):!a&&e.playing&&(i.setAttribute(s,""),e.pause())})),Y.isIos){const t=ce.call(e,'input[type="range"]');Array.from(t).forEach((e=>this.bind(e,i,(e=>K(e.target)))))}this.bind(t.inputs.seek,i,(t=>{const i=t.currentTarget;let s=i.getAttribute("seek-value");W(s)&&(s=i.value),i.removeAttribute("seek-value"),e.currentTime=s/i.max*e.duration}),"seek"),this.bind(t.progress,"mouseenter mouseleave mousemove",(t=>We.updateSeekTooltip.call(e,t))),this.bind(t.progress,"mousemove touchmove",(t=>{const{previewThumbnails:i}=e;i&&i.loaded&&i.startMove(t)})),this.bind(t.progress,"mouseleave touchend click",(()=>{const{previewThumbnails:t}=e;t&&t.loaded&&t.endMove(!1,!0)})),this.bind(t.progress,"mousedown touchstart",(t=>{const{previewThumbnails:i}=e;i&&i.loaded&&i.startScrubbing(t)})),this.bind(t.progress,"mouseup touchend",(t=>{const{previewThumbnails:i}=e;i&&i.loaded&&i.endScrubbing(t)})),Y.isWebkit&&Array.from(ce.call(e,'input[type="range"]')).forEach((t=>{this.bind(t,"input",(t=>We.updateRangeFill.call(e,t.target)))})),e.config.toggleInvert&&!H(t.display.duration)&&this.bind(t.display.currentTime,"click",(()=>{0!==e.currentTime&&(e.config.invertTime=!e.config.invertTime,We.timeUpdate.call(e))})),this.bind(t.inputs.volume,i,(t=>{e.volume=t.target.value}),"volume"),this.bind(t.controls,"mouseenter mouseleave",(i=>{t.controls.hover=!e.touch&&"mouseenter"===i.type})),t.fullscreen&&Array.from(t.fullscreen.children).filter((e=>!e.contains(t.container))).forEach((i=>{this.bind(i,"mouseenter mouseleave",(i=>{t.controls&&(t.controls.hover=!e.touch&&"mouseenter"===i.type)}))})),this.bind(t.controls,"mousedown mouseup touchstart touchend touchcancel",(e=>{t.controls.pressed=["mousedown","touchstart"].includes(e.type)})),this.bind(t.controls,"focusin",(()=>{const{config:i,timers:s}=e;le(t.controls,i.classNames.noTransition,!0),at.toggleControls.call(e,!0),setTimeout((()=>{le(t.controls,i.classNames.noTransition,!1)}),0);const n=this.touch?3e3:4e3;clearTimeout(s.controls),s.controls=setTimeout((()=>at.toggleControls.call(e,!1)),n)})),this.bind(t.inputs.volume,"wheel",(t=>{const i=t.webkitDirectionInvertedFromDevice,[s,n]=[t.deltaX,-t.deltaY].map((e=>i?-e:e)),a=Math.sign(Math.abs(s)>Math.abs(n)?s:n);e.increaseVolume(a/50);const{volume:l}=e.media;(1===a&&l<1||-1===a&&l>0)&&t.preventDefault()}),"volume",!1)})),this.player=t,this.lastKey=null,this.focusTimer=null,this.lastKeyDown=null,this.handleKey=this.handleKey.bind(this),this.toggleMenu=this.toggleMenu.bind(this),this.setTabFocus=this.setTabFocus.bind(this),this.firstTouch=this.firstTouch.bind(this)}handleKey(e){const{player:t}=this,{elements:i}=t,{key:s,type:n,altKey:a,ctrlKey:l,metaKey:o,shiftKey:r}=e,c="keydown"===n,h=c&&s===this.lastKey;if(a||l||o||r)return;if(!s)return;if(c){const n=document.activeElement;if(H(n)){const{editable:s}=t.config.selectors,{seek:a}=i.inputs;if(n!==a&&re(n,s))return;if("Space"===e.key&&re(n,'button, [role^="menuitem"]'))return}switch(["Space","ArrowLeft","ArrowUp","ArrowRight","ArrowDown","0","1","2","3","4","5","6","7","8","9","c","f","k","l","m"].includes(s)&&(e.preventDefault(),e.stopPropagation()),s){case"0":case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":h||(u=parseInt(s,10),t.currentTime=t.duration/10*u);break;case"Space":case"k":h||ke(t.togglePlay());break;case"ArrowUp":t.increaseVolume(.1);break;case"ArrowDown":t.decreaseVolume(.1);break;case"m":h||(t.muted=!t.muted);break;case"ArrowRight":t.forward();break;case"ArrowLeft":t.rewind();break;case"f":t.fullscreen.toggle();break;case"c":h||t.toggleCaptions();break;case"l":t.loop=!t.loop}"Escape"===s&&!t.fullscreen.usingNative&&t.fullscreen.active&&t.fullscreen.toggle(),this.lastKey=s}else this.lastKey=null;var u}toggleMenu(e){We.toggleMenu.call(this.player,e)}}"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof __webpack_require__.g?__webpack_require__.g:"undefined"!=typeof self&&self;var ot=function(e,t){return e(t={exports:{}},t.exports),t.exports}((function(e,t){e.exports=function(){var e=function(){},t={},i={},s={};function n(e,t){e=e.push?e:[e];var n,a,l,o=[],r=e.length,c=r;for(n=function(e,i){i.length&&o.push(e),--c||t(o)};r--;)a=e[r],(l=i[a])?n(a,l):(s[a]=s[a]||[]).push(n)}function a(e,t){if(e){var n=s[e];if(i[e]=t,n)for(;n.length;)n[0](e,t),n.splice(0,1)}}function l(t,i){t.call&&(t={success:t}),i.length?(t.error||e)(i):(t.success||e)(t)}function o(t,i,s,n){var a,l,r=document,c=s.async,h=(s.numRetries||0)+1,u=s.before||e,d=t.replace(/[\?|#].*$/,""),m=t.replace(/^(css|img)!/,"");n=n||0,/(^css!|\.css$)/.test(d)?((l=r.createElement("link")).rel="stylesheet",l.href=m,(a="hideFocus"in l)&&l.relList&&(a=0,l.rel="preload",l.as="style")):/(^img!|\.(png|gif|jpg|svg|webp)$)/.test(d)?(l=r.createElement("img")).src=m:((l=r.createElement("script")).src=t,l.async=void 0===c||c),l.onload=l.onerror=l.onbeforeload=function(e){var r=e.type[0];if(a)try{l.sheet.cssText.length||(r="e")}catch(e){18!=e.code&&(r="e")}if("e"==r){if((n+=1)<h)return o(t,i,s,n)}else if("preload"==l.rel&&"style"==l.as)return l.rel="stylesheet";i(t,r,e.defaultPrevented)},!1!==u(t,l)&&r.head.appendChild(l)}function r(e,t,i){var s,n,a=(e=e.push?e:[e]).length,l=a,r=[];for(s=function(e,i,s){if("e"==i&&r.push(e),"b"==i){if(!s)return;r.push(e)}--a||t(r)},n=0;n<l;n++)o(e[n],s,i)}function c(e,i,s){var n,o;if(i&&i.trim&&(n=i),o=(n?s:i)||{},n){if(n in t)throw"LoadJS";t[n]=!0}function c(t,i){r(e,(function(e){l(o,e),t&&l({success:t,error:i},e),a(n,e)}),o)}if(o.returnPromise)return new Promise(c);c()}return c.ready=function(e,t){return n(e,(function(e){l(t,e)})),c},c.done=function(e){a(e,[])},c.reset=function(){t={},i={},s={}},c.isDefined=function(e){return e in t},c}()}));function rt(e){return new Promise(((t,i)=>{ot(e,{success:t,error:i})}))}function ct(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,ve.call(this,this.media,e?"play":"pause"))}const ht={setup(){const e=this;le(e.elements.wrapper,e.config.classNames.embed,!0),e.options.speed=e.config.speed.options,xe.call(e),L(window.Vimeo)?ht.ready.call(e):rt(e.config.urls.vimeo.sdk).then((()=>{ht.ready.call(e)})).catch((t=>{e.debug.warn("Vimeo SDK (player.js) failed to load",t)}))},ready(){const e=this,t=e.config.vimeo,{premium:i,referrerPolicy:s,...n}=t;let a=e.media.getAttribute("src"),l="";W(a)?(a=e.media.getAttribute(e.config.attributes.embed.id),l=e.media.getAttribute(e.config.attributes.embed.hash)):l=function(e){const t=e.match(/^.*(vimeo.com\/|video\/)(\d+)(\?.*&*h=|\/)+([\d,a-f]+)/);return t&&5===t.length?t[4]:null}(a);const o=l?{h:l}:{};i&&Object.assign(n,{controls:!1,sidedock:!1});const r=Ke({loop:e.config.loop.active,autoplay:e.autoplay,muted:e.muted,gesture:"media",playsinline:!this.config.fullscreen.iosNative,...o,...n}),c=W(h=a)?null:$(Number(h))?h:h.match(/^.*(vimeo.com\/|video\/)(\d+).*/)?RegExp.$2:h;var h;const u=Z("iframe"),d=$e(e.config.urls.vimeo.iframe,c,r);if(u.setAttribute("src",d),u.setAttribute("allowfullscreen",""),u.setAttribute("allow",["autoplay","fullscreen","picture-in-picture","encrypted-media","accelerometer","gyroscope"].join("; ")),W(s)||u.setAttribute("referrerPolicy",s),i||!t.customControls)u.setAttribute("data-poster",e.poster),e.media=se(u,e.media);else{const t=Z("div",{class:e.config.classNames.embedContainer,"data-poster":e.poster});t.appendChild(u),e.media=se(t,e.media)}t.customControls||Fe($e(e.config.urls.vimeo.api,d)).then((t=>{!W(t)&&t.thumbnail_url&&at.setPoster.call(e,t.thumbnail_url).catch((()=>{}))})),e.embed=new window.Vimeo.Player(u,{autopause:e.config.autopause,muted:e.muted}),e.media.paused=!0,e.media.currentTime=0,e.supported.ui&&e.embed.disableTextTrack(),e.media.play=()=>(ct.call(e,!0),e.embed.play()),e.media.pause=()=>(ct.call(e,!1),e.embed.pause()),e.media.stop=()=>{e.pause(),e.currentTime=0};let{currentTime:m}=e.media;Object.defineProperty(e.media,"currentTime",{get:()=>m,set(t){const{embed:i,media:s,paused:n,volume:a}=e,l=n&&!i.hasPlayed;s.seeking=!0,ve.call(e,s,"seeking"),Promise.resolve(l&&i.setVolume(0)).then((()=>i.setCurrentTime(t))).then((()=>l&&i.pause())).then((()=>l&&i.setVolume(a))).catch((()=>{}))}});let p=e.config.speed.selected;Object.defineProperty(e.media,"playbackRate",{get:()=>p,set(t){e.embed.setPlaybackRate(t).then((()=>{p=t,ve.call(e,e.media,"ratechange")})).catch((()=>{e.options.speed=[1]}))}});let{volume:g}=e.config;Object.defineProperty(e.media,"volume",{get:()=>g,set(t){e.embed.setVolume(t).then((()=>{g=t,ve.call(e,e.media,"volumechange")}))}});let{muted:f}=e.config;Object.defineProperty(e.media,"muted",{get:()=>f,set(t){const i=!!O(t)&&t;e.embed.setVolume(i?0:e.config.volume).then((()=>{f=i,ve.call(e,e.media,"volumechange")}))}});let b,{loop:y}=e.config;Object.defineProperty(e.media,"loop",{get:()=>y,set(t){const i=O(t)?t:e.config.loop.active;e.embed.setLoop(i).then((()=>{y=i}))}}),e.embed.getVideoUrl().then((t=>{b=t,We.setDownloadUrl.call(e)})).catch((e=>{this.debug.warn(e)})),Object.defineProperty(e.media,"currentSrc",{get:()=>b}),Object.defineProperty(e.media,"ended",{get:()=>e.currentTime===e.duration}),Promise.all([e.embed.getVideoWidth(),e.embed.getVideoHeight()]).then((t=>{const[i,s]=t;e.embed.ratio=Ie(i,s),xe.call(this)})),e.embed.setAutopause(e.config.autopause).then((t=>{e.config.autopause=t})),e.embed.getVideoTitle().then((t=>{e.config.title=t,at.setTitle.call(this)})),e.embed.getCurrentTime().then((t=>{m=t,ve.call(e,e.media,"timeupdate")})),e.embed.getDuration().then((t=>{e.media.duration=t,ve.call(e,e.media,"durationchange")})),e.embed.getTextTracks().then((t=>{e.media.textTracks=t,Ye.setup.call(e)})),e.embed.on("cuechange",(({cues:t=[]})=>{const i=t.map((e=>function(e){const t=document.createDocumentFragment(),i=document.createElement("div");return t.appendChild(i),i.innerHTML=e,t.firstChild.innerText}(e.text)));Ye.updateCues.call(e,i)})),e.embed.on("loaded",(()=>{if(e.embed.getPaused().then((t=>{ct.call(e,!t),t||ve.call(e,e.media,"playing")})),H(e.embed.element)&&e.supported.ui){e.embed.element.setAttribute("tabindex",-1)}})),e.embed.on("bufferstart",(()=>{ve.call(e,e.media,"waiting")})),e.embed.on("bufferend",(()=>{ve.call(e,e.media,"playing")})),e.embed.on("play",(()=>{ct.call(e,!0),ve.call(e,e.media,"playing")})),e.embed.on("pause",(()=>{ct.call(e,!1)})),e.embed.on("timeupdate",(t=>{e.media.seeking=!1,m=t.seconds,ve.call(e,e.media,"timeupdate")})),e.embed.on("progress",(t=>{e.media.buffered=t.percent,ve.call(e,e.media,"progress"),1===parseInt(t.percent,10)&&ve.call(e,e.media,"canplaythrough"),e.embed.getDuration().then((t=>{t!==e.media.duration&&(e.media.duration=t,ve.call(e,e.media,"durationchange"))}))})),e.embed.on("seeked",(()=>{e.media.seeking=!1,ve.call(e,e.media,"seeked")})),e.embed.on("ended",(()=>{e.media.paused=!0,ve.call(e,e.media,"ended")})),e.embed.on("error",(t=>{e.media.error=t,ve.call(e,e.media,"error")})),t.customControls&&setTimeout((()=>at.build.call(e)),0)}};function ut(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,ve.call(this,this.media,e?"play":"pause"))}function dt(e){return e.noCookie?"https://www.youtube-nocookie.com":"http:"===window.location.protocol?"http://www.youtube.com":void 0}const mt={setup(){if(le(this.elements.wrapper,this.config.classNames.embed,!0),L(window.YT)&&j(window.YT.Player))mt.ready.call(this);else{const e=window.onYouTubeIframeAPIReady;window.onYouTubeIframeAPIReady=()=>{j(e)&&e(),mt.ready.call(this)},rt(this.config.urls.youtube.sdk).catch((e=>{this.debug.warn("YouTube API failed to load",e)}))}},getTitle(e){Fe($e(this.config.urls.youtube.api,e)).then((e=>{if(L(e)){const{title:t,height:i,width:s}=e;this.config.title=t,at.setTitle.call(this),this.embed.ratio=Ie(s,i)}xe.call(this)})).catch((()=>{xe.call(this)}))},ready(){const e=this,t=e.config.youtube,i=e.media&&e.media.getAttribute("id");if(!W(i)&&i.startsWith("youtube-"))return;let s=e.media.getAttribute("src");W(s)&&(s=e.media.getAttribute(this.config.attributes.embed.id));const n=W(a=s)?null:a.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/)?RegExp.$2:a;var a;const l=Z("div",{id:`${e.provider}-${Math.floor(1e4*Math.random())}`,"data-poster":t.customControls?e.poster:void 0});if(e.media=se(l,e.media),t.customControls){const t=e=>`https://i.ytimg.com/vi/${n}/${e}default.jpg`;nt(t("maxres"),121).catch((()=>nt(t("sd"),121))).catch((()=>nt(t("hq")))).then((t=>at.setPoster.call(e,t.src))).then((t=>{t.includes("maxres")||(e.elements.poster.style.backgroundSize="cover")})).catch((()=>{}))}e.embed=new window.YT.Player(e.media,{videoId:n,host:dt(t),playerVars:X({},{autoplay:e.config.autoplay?1:0,hl:e.config.hl,controls:e.supported.ui&&t.customControls?0:1,disablekb:1,playsinline:e.config.fullscreen.iosNative?0:1,cc_load_policy:e.captions.active?1:0,cc_lang_pref:e.config.captions.language,widget_referrer:window?window.location.href:null},t),events:{onError(t){if(!e.media.error){const i=t.data,s={2:"The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.",5:"The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.",100:"The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.",101:"The owner of the requested video does not allow it to be played in embedded players.",150:"The owner of the requested video does not allow it to be played in embedded players."}[i]||"An unknown error occured";e.media.error={code:i,message:s},ve.call(e,e.media,"error")}},onPlaybackRateChange(t){const i=t.target;e.media.playbackRate=i.getPlaybackRate(),ve.call(e,e.media,"ratechange")},onReady(i){if(j(e.media.play))return;const s=i.target;mt.getTitle.call(e,n),e.media.play=()=>{ut.call(e,!0),s.playVideo()},e.media.pause=()=>{ut.call(e,!1),s.pauseVideo()},e.media.stop=()=>{s.stopVideo()},e.media.duration=s.getDuration(),e.media.paused=!0,e.media.currentTime=0,Object.defineProperty(e.media,"currentTime",{get:()=>Number(s.getCurrentTime()),set(t){e.paused&&!e.embed.hasPlayed&&e.embed.mute(),e.media.seeking=!0,ve.call(e,e.media,"seeking"),s.seekTo(t)}}),Object.defineProperty(e.media,"playbackRate",{get:()=>s.getPlaybackRate(),set(e){s.setPlaybackRate(e)}});let{volume:a}=e.config;Object.defineProperty(e.media,"volume",{get:()=>a,set(t){a=t,s.setVolume(100*a),ve.call(e,e.media,"volumechange")}});let{muted:l}=e.config;Object.defineProperty(e.media,"muted",{get:()=>l,set(t){const i=O(t)?t:l;l=i,s[i?"mute":"unMute"](),s.setVolume(100*a),ve.call(e,e.media,"volumechange")}}),Object.defineProperty(e.media,"currentSrc",{get:()=>s.getVideoUrl()}),Object.defineProperty(e.media,"ended",{get:()=>e.currentTime===e.duration});const o=s.getAvailablePlaybackRates();e.options.speed=o.filter((t=>e.config.speed.options.includes(t))),e.supported.ui&&t.customControls&&e.media.setAttribute("tabindex",-1),ve.call(e,e.media,"timeupdate"),ve.call(e,e.media,"durationchange"),clearInterval(e.timers.buffering),e.timers.buffering=setInterval((()=>{e.media.buffered=s.getVideoLoadedFraction(),(null===e.media.lastBuffered||e.media.lastBuffered<e.media.buffered)&&ve.call(e,e.media,"progress"),e.media.lastBuffered=e.media.buffered,1===e.media.buffered&&(clearInterval(e.timers.buffering),ve.call(e,e.media,"canplaythrough"))}),200),t.customControls&&setTimeout((()=>at.build.call(e)),50)},onStateChange(i){const s=i.target;clearInterval(e.timers.playing);switch(e.media.seeking&&[1,2].includes(i.data)&&(e.media.seeking=!1,ve.call(e,e.media,"seeked")),i.data){case-1:ve.call(e,e.media,"timeupdate"),e.media.buffered=s.getVideoLoadedFraction(),ve.call(e,e.media,"progress");break;case 0:ut.call(e,!1),e.media.loop?(s.stopVideo(),s.playVideo()):ve.call(e,e.media,"ended");break;case 1:t.customControls&&!e.config.autoplay&&e.media.paused&&!e.embed.hasPlayed?e.media.pause():(ut.call(e,!0),ve.call(e,e.media,"playing"),e.timers.playing=setInterval((()=>{ve.call(e,e.media,"timeupdate")}),50),e.media.duration!==s.getDuration()&&(e.media.duration=s.getDuration(),ve.call(e,e.media,"durationchange")));break;case 2:e.muted||e.embed.unMute(),ut.call(e,!1);break;case 3:ve.call(e,e.media,"waiting")}ve.call(e,e.elements.container,"statechange",!1,{code:i.data})}}})}},pt={setup(){this.media?(le(this.elements.container,this.config.classNames.type.replace("{0}",this.type),!0),le(this.elements.container,this.config.classNames.provider.replace("{0}",this.provider),!0),this.isEmbed&&le(this.elements.container,this.config.classNames.type.replace("{0}","video"),!0),this.isVideo&&(this.elements.wrapper=Z("div",{class:this.config.classNames.video}),J(this.media,this.elements.wrapper),this.elements.poster=Z("div",{class:this.config.classNames.poster}),this.elements.wrapper.appendChild(this.elements.poster)),this.isHTML5?Le.setup.call(this):this.isYouTube?mt.setup.call(this):this.isVimeo&&ht.setup.call(this)):this.debug.warn("No media element found!")}};class gt{constructor(t){e(this,"load",(()=>{this.enabled&&(L(window.google)&&L(window.google.ima)?this.ready():rt(this.player.config.urls.googleIMA.sdk).then((()=>{this.ready()})).catch((()=>{this.trigger("error",new Error("Google IMA SDK failed to load"))})))})),e(this,"ready",(()=>{var e;this.enabled||((e=this).manager&&e.manager.destroy(),e.elements.displayContainer&&e.elements.displayContainer.destroy(),e.elements.container.remove()),this.startSafetyTimer(12e3,"ready()"),this.managerPromise.then((()=>{this.clearSafetyTimer("onAdsManagerLoaded()")})),this.listeners(),this.setupIMA()})),e(this,"setupIMA",(()=>{this.elements.container=Z("div",{class:this.player.config.classNames.ads}),this.player.elements.container.appendChild(this.elements.container),google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED),google.ima.settings.setLocale(this.player.config.ads.language),google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline),this.elements.displayContainer=new google.ima.AdDisplayContainer(this.elements.container,this.player.media),this.loader=new google.ima.AdsLoader(this.elements.displayContainer),this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,(e=>this.onAdsManagerLoaded(e)),!1),this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,(e=>this.onAdError(e)),!1),this.requestAds()})),e(this,"requestAds",(()=>{const{container:e}=this.player.elements;try{const t=new google.ima.AdsRequest;t.adTagUrl=this.tagUrl,t.linearAdSlotWidth=e.offsetWidth,t.linearAdSlotHeight=e.offsetHeight,t.nonLinearAdSlotWidth=e.offsetWidth,t.nonLinearAdSlotHeight=e.offsetHeight,t.forceNonLinearFullSlot=!1,t.setAdWillPlayMuted(!this.player.muted),this.loader.requestAds(t)}catch(e){this.onAdError(e)}})),e(this,"pollCountdown",((e=!1)=>{if(!e)return clearInterval(this.countdownTimer),void this.elements.container.removeAttribute("data-badge-text");this.countdownTimer=setInterval((()=>{const e=Ue(Math.max(this.manager.getRemainingTime(),0)),t=`${He.get("advertisement",this.player.config)} - ${e}`;this.elements.container.setAttribute("data-badge-text",t)}),100)})),e(this,"onAdsManagerLoaded",(e=>{if(!this.enabled)return;const t=new google.ima.AdsRenderingSettings;t.restoreCustomPlaybackStateOnAdBreakComplete=!0,t.enablePreloading=!0,this.manager=e.getAdsManager(this.player,t),this.cuePoints=this.manager.getCuePoints(),this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,(e=>this.onAdError(e))),Object.keys(google.ima.AdEvent.Type).forEach((e=>{this.manager.addEventListener(google.ima.AdEvent.Type[e],(e=>this.onAdEvent(e)))})),this.trigger("loaded")})),e(this,"addCuePoints",(()=>{W(this.cuePoints)||this.cuePoints.forEach((e=>{if(0!==e&&-1!==e&&e<this.player.duration){const t=this.player.elements.progress;if(H(t)){const i=100/this.player.duration*e,s=Z("span",{class:this.player.config.classNames.cues});s.style.left=`${i.toString()}%`,t.appendChild(s)}}}))})),e(this,"onAdEvent",(e=>{const{container:t}=this.player.elements,i=e.getAd(),s=e.getAdData();switch((e=>{ve.call(this.player,this.player.media,`ads${e.replace(/_/g,"").toLowerCase()}`)})(e.type),e.type){case google.ima.AdEvent.Type.LOADED:this.trigger("loaded"),this.pollCountdown(!0),i.isLinear()||(i.width=t.offsetWidth,i.height=t.offsetHeight);break;case google.ima.AdEvent.Type.STARTED:this.manager.setVolume(this.player.volume);break;case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:this.player.ended?this.loadAds():this.loader.contentComplete();break;case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:this.pauseContent();break;case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:this.pollCountdown(),this.resumeContent();break;case google.ima.AdEvent.Type.LOG:s.adError&&this.player.debug.warn(`Non-fatal ad error: ${s.adError.getMessage()}`)}})),e(this,"onAdError",(e=>{this.cancel(),this.player.debug.warn("Ads error",e)})),e(this,"listeners",(()=>{const{container:e}=this.player.elements;let t;this.player.on("canplay",(()=>{this.addCuePoints()})),this.player.on("ended",(()=>{this.loader.contentComplete()})),this.player.on("timeupdate",(()=>{t=this.player.currentTime})),this.player.on("seeked",(()=>{const e=this.player.currentTime;W(this.cuePoints)||this.cuePoints.forEach(((i,s)=>{t<i&&i<e&&(this.manager.discardAdBreak(),this.cuePoints.splice(s,1))}))})),window.addEventListener("resize",(()=>{this.manager&&this.manager.resize(e.offsetWidth,e.offsetHeight,google.ima.ViewMode.NORMAL)}))})),e(this,"play",(()=>{const{container:e}=this.player.elements;this.managerPromise||this.resumeContent(),this.managerPromise.then((()=>{this.manager.setVolume(this.player.volume),this.elements.displayContainer.initialize();try{this.initialized||(this.manager.init(e.offsetWidth,e.offsetHeight,google.ima.ViewMode.NORMAL),this.manager.start()),this.initialized=!0}catch(e){this.onAdError(e)}})).catch((()=>{}))})),e(this,"resumeContent",(()=>{this.elements.container.style.zIndex="",this.playing=!1,ke(this.player.media.play())})),e(this,"pauseContent",(()=>{this.elements.container.style.zIndex=3,this.playing=!0,this.player.media.pause()})),e(this,"cancel",(()=>{this.initialized&&this.resumeContent(),this.trigger("error"),this.loadAds()})),e(this,"loadAds",(()=>{this.managerPromise.then((()=>{this.manager&&this.manager.destroy(),this.managerPromise=new Promise((e=>{this.on("loaded",e),this.player.debug.log(this.manager)})),this.initialized=!1,this.requestAds()})).catch((()=>{}))})),e(this,"trigger",((e,...t)=>{const i=this.events[e];D(i)&&i.forEach((e=>{j(e)&&e.apply(this,t)}))})),e(this,"on",((e,t)=>(D(this.events[e])||(this.events[e]=[]),this.events[e].push(t),this))),e(this,"startSafetyTimer",((e,t)=>{this.player.debug.log(`Safety timer invoked from: ${t}`),this.safetyTimer=setTimeout((()=>{this.cancel(),this.clearSafetyTimer("startSafetyTimer()")}),e)})),e(this,"clearSafetyTimer",(e=>{I(this.safetyTimer)||(this.player.debug.log(`Safety timer cleared from: ${e}`),clearTimeout(this.safetyTimer),this.safetyTimer=null)})),this.player=t,this.config=t.config.ads,this.playing=!1,this.initialized=!1,this.elements={container:null,displayContainer:null},this.manager=null,this.loader=null,this.cuePoints=null,this.events={},this.safetyTimer=null,this.countdownTimer=null,this.managerPromise=new Promise(((e,t)=>{this.on("loaded",e),this.on("error",t)})),this.load()}get enabled(){const{config:e}=this;return this.player.isHTML5&&this.player.isVideo&&e.enabled&&(!W(e.publisherId)||U(e.tagUrl))}get tagUrl(){const{config:e}=this;if(U(e.tagUrl))return e.tagUrl;return`https://go.aniview.com/api/adserver6/vast/?${Ke({AV_PUBLISHERID:"58c25bb0073ef448b1087ad6",AV_CHANNELID:"5a0458dc28a06145e4519d21",AV_URL:window.location.hostname,cb:Date.now(),AV_WIDTH:640,AV_HEIGHT:480,AV_CDIM2:e.publisherId})}`}}function ft(e=0,t=0,i=255){return Math.min(Math.max(e,t),i)}const bt=e=>{const t=[];return e.split(/\r\n\r\n|\n\n|\r\r/).forEach((e=>{const i={};e.split(/\r\n|\n|\r/).forEach((e=>{if($(i.startTime)){if(!W(e.trim())&&W(i.text)){const t=e.trim().split("#xywh=");[i.text]=t,t[1]&&([i.x,i.y,i.w,i.h]=t[1].split(","))}}else{const t=e.match(/([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/);t&&(i.startTime=60*Number(t[1]||0)*60+60*Number(t[2])+Number(t[3])+Number(`0.${t[4]}`),i.endTime=60*Number(t[6]||0)*60+60*Number(t[7])+Number(t[8])+Number(`0.${t[9]}`))}})),i.text&&t.push(i)})),t},yt=(e,t)=>{const i={};return e>t.width/t.height?(i.width=t.width,i.height=1/e*t.width):(i.height=t.height,i.width=e*t.height),i};class vt{constructor(t){e(this,"load",(()=>{this.player.elements.display.seekTooltip&&(this.player.elements.display.seekTooltip.hidden=this.enabled),this.enabled&&this.getThumbnails().then((()=>{this.enabled&&(this.render(),this.determineContainerAutoSizing(),this.loaded=!0)}))})),e(this,"getThumbnails",(()=>new Promise((e=>{const{src:t}=this.player.config.previewThumbnails;if(W(t))throw new Error("Missing previewThumbnails.src config attribute");const i=()=>{this.thumbnails.sort(((e,t)=>e.height-t.height)),this.player.debug.log("Preview thumbnails",this.thumbnails),e()};if(j(t))t((e=>{this.thumbnails=e,i()}));else{const e=(_(t)?[t]:t).map((e=>this.getThumbnail(e)));Promise.all(e).then(i)}})))),e(this,"getThumbnail",(e=>new Promise((t=>{Fe(e).then((i=>{const s={frames:bt(i),height:null,urlPrefix:""};s.frames[0].text.startsWith("/")||s.frames[0].text.startsWith("http://")||s.frames[0].text.startsWith("https://")||(s.urlPrefix=e.substring(0,e.lastIndexOf("/")+1));const n=new Image;n.onload=()=>{s.height=n.naturalHeight,s.width=n.naturalWidth,this.thumbnails.push(s),t()},n.src=s.urlPrefix+s.frames[0].text}))})))),e(this,"startMove",(e=>{if(this.loaded&&R(e)&&["touchmove","mousemove"].includes(e.type)&&this.player.media.duration){if("touchmove"===e.type)this.seekTime=this.player.media.duration*(this.player.elements.inputs.seek.value/100);else{var t,i;const s=this.player.elements.progress.getBoundingClientRect(),n=100/s.width*(e.pageX-s.left);this.seekTime=this.player.media.duration*(n/100),this.seekTime<0&&(this.seekTime=0),this.seekTime>this.player.media.duration-1&&(this.seekTime=this.player.media.duration-1),this.mousePosX=e.pageX,this.elements.thumb.time.innerText=Ue(this.seekTime);const a=null===(t=this.player.config.markers)||void 0===t||null===(i=t.points)||void 0===i?void 0:i.find((({time:e})=>e===Math.round(this.seekTime)));a&&this.elements.thumb.time.insertAdjacentHTML("afterbegin",`${a.label}<br>`)}this.showImageAtCurrentTime()}})),e(this,"endMove",(()=>{this.toggleThumbContainer(!1,!0)})),e(this,"startScrubbing",(e=>{(I(e.button)||!1===e.button||0===e.button)&&(this.mouseDown=!0,this.player.media.duration&&(this.toggleScrubbingContainer(!0),this.toggleThumbContainer(!1,!0),this.showImageAtCurrentTime()))})),e(this,"endScrubbing",(()=>{this.mouseDown=!1,Math.ceil(this.lastTime)===Math.ceil(this.player.media.currentTime)?this.toggleScrubbingContainer(!1):ye.call(this.player,this.player.media,"timeupdate",(()=>{this.mouseDown||this.toggleScrubbingContainer(!1)}))})),e(this,"listeners",(()=>{this.player.on("play",(()=>{this.toggleThumbContainer(!1,!0)})),this.player.on("seeked",(()=>{this.toggleThumbContainer(!1)})),this.player.on("timeupdate",(()=>{this.lastTime=this.player.media.currentTime}))})),e(this,"render",(()=>{this.elements.thumb.container=Z("div",{class:this.player.config.classNames.previewThumbnails.thumbContainer}),this.elements.thumb.imageContainer=Z("div",{class:this.player.config.classNames.previewThumbnails.imageContainer}),this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer);const e=Z("div",{class:this.player.config.classNames.previewThumbnails.timeContainer});this.elements.thumb.time=Z("span",{},"00:00"),e.appendChild(this.elements.thumb.time),this.elements.thumb.imageContainer.appendChild(e),H(this.player.elements.progress)&&this.player.elements.progress.appendChild(this.elements.thumb.container),this.elements.scrubbing.container=Z("div",{class:this.player.config.classNames.previewThumbnails.scrubbingContainer}),this.player.elements.wrapper.appendChild(this.elements.scrubbing.container)})),e(this,"destroy",(()=>{this.elements.thumb.container&&this.elements.thumb.container.remove(),this.elements.scrubbing.container&&this.elements.scrubbing.container.remove()})),e(this,"showImageAtCurrentTime",(()=>{this.mouseDown?this.setScrubbingContainerSize():this.setThumbContainerSizeAndPos();const e=this.thumbnails[0].frames.findIndex((e=>this.seekTime>=e.startTime&&this.seekTime<=e.endTime)),t=e>=0;let i=0;this.mouseDown||this.toggleThumbContainer(t),t&&(this.thumbnails.forEach(((t,s)=>{this.loadedImages.includes(t.frames[e].text)&&(i=s)})),e!==this.showingThumb&&(this.showingThumb=e,this.loadImage(i)))})),e(this,"loadImage",((e=0)=>{const t=this.showingThumb,i=this.thumbnails[e],{urlPrefix:s}=i,n=i.frames[t],a=i.frames[t].text,l=s+a;if(this.currentImageElement&&this.currentImageElement.dataset.filename===a)this.showImage(this.currentImageElement,n,e,t,a,!1),this.currentImageElement.dataset.index=t,this.removeOldImages(this.currentImageElement);else{this.loadingImage&&this.usingSprites&&(this.loadingImage.onload=null);const i=new Image;i.src=l,i.dataset.index=t,i.dataset.filename=a,this.showingThumbFilename=a,this.player.debug.log(`Loading image: ${l}`),i.onload=()=>this.showImage(i,n,e,t,a,!0),this.loadingImage=i,this.removeOldImages(i)}})),e(this,"showImage",((e,t,i,s,n,a=!0)=>{this.player.debug.log(`Showing thumb: ${n}. num: ${s}. qual: ${i}. newimg: ${a}`),this.setImageSizeAndOffset(e,t),a&&(this.currentImageContainer.appendChild(e),this.currentImageElement=e,this.loadedImages.includes(n)||this.loadedImages.push(n)),this.preloadNearby(s,!0).then(this.preloadNearby(s,!1)).then(this.getHigherQuality(i,e,t,n))})),e(this,"removeOldImages",(e=>{Array.from(this.currentImageContainer.children).forEach((t=>{if("img"!==t.tagName.toLowerCase())return;const i=this.usingSprites?500:1e3;if(t.dataset.index!==e.dataset.index&&!t.dataset.deleting){t.dataset.deleting=!0;const{currentImageContainer:e}=this;setTimeout((()=>{e.removeChild(t),this.player.debug.log(`Removing thumb: ${t.dataset.filename}`)}),i)}}))})),e(this,"preloadNearby",((e,t=!0)=>new Promise((i=>{setTimeout((()=>{const s=this.thumbnails[0].frames[e].text;if(this.showingThumbFilename===s){let n;n=t?this.thumbnails[0].frames.slice(e):this.thumbnails[0].frames.slice(0,e).reverse();let a=!1;n.forEach((e=>{const t=e.text;if(t!==s&&!this.loadedImages.includes(t)){a=!0,this.player.debug.log(`Preloading thumb filename: ${t}`);const{urlPrefix:e}=this.thumbnails[0],s=e+t,n=new Image;n.src=s,n.onload=()=>{this.player.debug.log(`Preloaded thumb filename: ${t}`),this.loadedImages.includes(t)||this.loadedImages.push(t),i()}}})),a||i()}}),300)})))),e(this,"getHigherQuality",((e,t,i,s)=>{if(e<this.thumbnails.length-1){let n=t.naturalHeight;this.usingSprites&&(n=i.h),n<this.thumbContainerHeight&&setTimeout((()=>{this.showingThumbFilename===s&&(this.player.debug.log(`Showing higher quality thumb for: ${s}`),this.loadImage(e+1))}),300)}})),e(this,"toggleThumbContainer",((e=!1,t=!1)=>{const i=this.player.config.classNames.previewThumbnails.thumbContainerShown;this.elements.thumb.container.classList.toggle(i,e),!e&&t&&(this.showingThumb=null,this.showingThumbFilename=null)})),e(this,"toggleScrubbingContainer",((e=!1)=>{const t=this.player.config.classNames.previewThumbnails.scrubbingContainerShown;this.elements.scrubbing.container.classList.toggle(t,e),e||(this.showingThumb=null,this.showingThumbFilename=null)})),e(this,"determineContainerAutoSizing",(()=>{(this.elements.thumb.imageContainer.clientHeight>20||this.elements.thumb.imageContainer.clientWidth>20)&&(this.sizeSpecifiedInCSS=!0)})),e(this,"setThumbContainerSizeAndPos",(()=>{const{imageContainer:e}=this.elements.thumb;if(this.sizeSpecifiedInCSS){if(e.clientHeight>20&&e.clientWidth<20){const t=Math.floor(e.clientHeight*this.thumbAspectRatio);e.style.width=`${t}px`}else if(e.clientHeight<20&&e.clientWidth>20){const t=Math.floor(e.clientWidth/this.thumbAspectRatio);e.style.height=`${t}px`}}else{const t=Math.floor(this.thumbContainerHeight*this.thumbAspectRatio);e.style.height=`${this.thumbContainerHeight}px`,e.style.width=`${t}px`}this.setThumbContainerPos()})),e(this,"setThumbContainerPos",(()=>{const e=this.player.elements.progress.getBoundingClientRect(),t=this.player.elements.container.getBoundingClientRect(),{container:i}=this.elements.thumb,s=t.left-e.left+10,n=t.right-e.left-i.clientWidth-10,a=this.mousePosX-e.left-i.clientWidth/2,l=ft(a,s,n);i.style.left=`${l}px`,i.style.setProperty("--preview-arrow-offset",a-l+"px")})),e(this,"setScrubbingContainerSize",(()=>{const{width:e,height:t}=yt(this.thumbAspectRatio,{width:this.player.media.clientWidth,height:this.player.media.clientHeight});this.elements.scrubbing.container.style.width=`${e}px`,this.elements.scrubbing.container.style.height=`${t}px`})),e(this,"setImageSizeAndOffset",((e,t)=>{if(!this.usingSprites)return;const i=this.thumbContainerHeight/t.h;e.style.height=e.naturalHeight*i+"px",e.style.width=e.naturalWidth*i+"px",e.style.left=`-${t.x*i}px`,e.style.top=`-${t.y*i}px`})),this.player=t,this.thumbnails=[],this.loaded=!1,this.lastMouseMoveTime=Date.now(),this.mouseDown=!1,this.loadedImages=[],this.elements={thumb:{},scrubbing:{}},this.load()}get enabled(){return this.player.isHTML5&&this.player.isVideo&&this.player.config.previewThumbnails.enabled}get currentImageContainer(){return this.mouseDown?this.elements.scrubbing.container:this.elements.thumb.imageContainer}get usingSprites(){return Object.keys(this.thumbnails[0].frames[0]).includes("w")}get thumbAspectRatio(){return this.usingSprites?this.thumbnails[0].frames[0].w/this.thumbnails[0].frames[0].h:this.thumbnails[0].width/this.thumbnails[0].height}get thumbContainerHeight(){if(this.mouseDown){const{height:e}=yt(this.thumbAspectRatio,{width:this.player.media.clientWidth,height:this.player.media.clientHeight});return e}return this.sizeSpecifiedInCSS?this.elements.thumb.imageContainer.clientHeight:Math.floor(this.player.media.clientWidth/this.thumbAspectRatio/4)}get currentImageElement(){return this.mouseDown?this.currentScrubbingImageElement:this.currentThumbnailImageElement}set currentImageElement(e){this.mouseDown?this.currentScrubbingImageElement=e:this.currentThumbnailImageElement=e}}const wt={insertElements(e,t){_(t)?ee(e,this.media,{src:t}):D(t)&&t.forEach((t=>{ee(e,this.media,t)}))},change(e){Q(e,"sources.length")?(Le.cancelRequests.call(this),this.destroy.call(this,(()=>{this.options.quality=[],te(this.media),this.media=null,H(this.elements.container)&&this.elements.container.removeAttribute("class");const{sources:t,type:i}=e,[{provider:s=Ge.html5,src:n}]=t,a="html5"===s?i:"div",l="html5"===s?{}:{src:n};Object.assign(this,{provider:s,type:i,supported:me.check(i,s,this.config.playsinline),media:Z(a,l)}),this.elements.container.appendChild(this.media),O(e.autoplay)&&(this.config.autoplay=e.autoplay),this.isHTML5&&(this.config.crossorigin&&this.media.setAttribute("crossorigin",""),this.config.autoplay&&this.media.setAttribute("autoplay",""),W(e.poster)||(this.poster=e.poster),this.config.loop.active&&this.media.setAttribute("loop",""),this.config.muted&&this.media.setAttribute("muted",""),this.config.playsinline&&this.media.setAttribute("playsinline","")),at.addStyleHook.call(this),this.isHTML5&&wt.insertElements.call(this,"source",t),this.config.title=e.title,pt.setup.call(this),this.isHTML5&&Object.keys(e).includes("tracks")&&wt.insertElements.call(this,"track",e.tracks),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&at.build.call(this),this.isHTML5&&this.media.load(),W(e.previewThumbnails)||(Object.assign(this.config.previewThumbnails,e.previewThumbnails),this.previewThumbnails&&this.previewThumbnails.loaded&&(this.previewThumbnails.destroy(),this.previewThumbnails=null),this.config.previewThumbnails.enabled&&(this.previewThumbnails=new vt(this))),this.fullscreen.update()}),!0)):this.debug.warn("Invalid source format")}};class Tt{constructor(t,i){if(e(this,"play",(()=>j(this.media.play)?(this.ads&&this.ads.enabled&&this.ads.managerPromise.then((()=>this.ads.play())).catch((()=>ke(this.media.play()))),this.media.play()):null)),e(this,"pause",(()=>this.playing&&j(this.media.pause)?this.media.pause():null)),e(this,"togglePlay",(e=>(O(e)?e:!this.playing)?this.play():this.pause())),e(this,"stop",(()=>{this.isHTML5?(this.pause(),this.restart()):j(this.media.stop)&&this.media.stop()})),e(this,"restart",(()=>{this.currentTime=0})),e(this,"rewind",(e=>{this.currentTime-=$(e)?e:this.config.seekTime})),e(this,"forward",(e=>{this.currentTime+=$(e)?e:this.config.seekTime})),e(this,"increaseVolume",(e=>{const t=this.media.muted?0:this.volume;this.volume=t+($(e)?e:0)})),e(this,"decreaseVolume",(e=>{this.increaseVolume(-e)})),e(this,"airplay",(()=>{me.airplay&&this.media.webkitShowPlaybackTargetPicker()})),e(this,"toggleControls",(e=>{if(this.supported.ui&&!this.isAudio){const t=oe(this.elements.container,this.config.classNames.hideControls),i=void 0===e?void 0:!e,s=le(this.elements.container,this.config.classNames.hideControls,i);if(s&&D(this.config.controls)&&this.config.controls.includes("settings")&&!W(this.config.settings)&&We.toggleMenu.call(this,!1),s!==t){const e=s?"controlshidden":"controlsshown";ve.call(this,this.media,e)}return!s}return!1})),e(this,"on",((e,t)=>{fe.call(this,this.elements.container,e,t)})),e(this,"once",((e,t)=>{ye.call(this,this.elements.container,e,t)})),e(this,"off",((e,t)=>{be(this.elements.container,e,t)})),e(this,"destroy",((e,t=!1)=>{if(!this.ready)return;const i=()=>{document.body.style.overflow="",this.embed=null,t?(Object.keys(this.elements).length&&(te(this.elements.buttons.play),te(this.elements.captions),te(this.elements.controls),te(this.elements.wrapper),this.elements.buttons.play=null,this.elements.captions=null,this.elements.controls=null,this.elements.wrapper=null),j(e)&&e()):(we.call(this),Le.cancelRequests.call(this),se(this.elements.original,this.elements.container),ve.call(this,this.elements.original,"destroyed",!0),j(e)&&e.call(this.elements.original),this.ready=!1,setTimeout((()=>{this.elements=null,this.media=null}),200))};this.stop(),clearTimeout(this.timers.loading),clearTimeout(this.timers.controls),clearTimeout(this.timers.resized),this.isHTML5?(at.toggleNativeControls.call(this,!0),i()):this.isYouTube?(clearInterval(this.timers.buffering),clearInterval(this.timers.playing),null!==this.embed&&j(this.embed.destroy)&&this.embed.destroy(),i()):this.isVimeo&&(null!==this.embed&&this.embed.unload().then(i),setTimeout(i,200))})),e(this,"supports",(e=>me.mime.call(this,e))),this.timers={},this.ready=!1,this.loading=!1,this.failed=!1,this.touch=me.touch,this.media=t,_(this.media)&&(this.media=document.querySelectorAll(this.media)),(window.jQuery&&this.media instanceof jQuery||q(this.media)||D(this.media))&&(this.media=this.media[0]),this.config=X({},Qe,Tt.defaults,i||{},(()=>{try{return JSON.parse(this.media.getAttribute("data-plyr-config"))}catch(e){return{}}})()),this.elements={container:null,fullscreen:null,captions:null,buttons:{},display:{},progress:{},inputs:{},settings:{popup:null,menu:null,panels:{},buttons:{}}},this.captions={active:null,currentTrack:-1,meta:new WeakMap},this.fullscreen={active:!1},this.options={speed:[],quality:[]},this.debug=new it(this.config.debug),this.debug.log("Config",this.config),this.debug.log("Support",me),I(this.media)||!H(this.media))return void this.debug.error("Setup failed: no suitable element passed");if(this.media.plyr)return void this.debug.warn("Target already setup");if(!this.config.enabled)return void this.debug.error("Setup failed: disabled by config");if(!me.check().api)return void this.debug.error("Setup failed: no support");const s=this.media.cloneNode(!0);s.autoplay=!1,this.elements.original=s;const n=this.media.tagName.toLowerCase();let a=null,l=null;switch(n){case"div":if(a=this.media.querySelector("iframe"),H(a)){if(l=ze(a.getAttribute("src")),this.provider=function(e){return/^(https?:\/\/)?(www\.)?(youtube\.com|youtube-nocookie\.com|youtu\.?be)\/.+$/.test(e)?Ge.youtube:/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(e)?Ge.vimeo:null}(l.toString()),this.elements.container=this.media,this.media=a,this.elements.container.className="",l.search.length){const e=["1","true"];e.includes(l.searchParams.get("autoplay"))&&(this.config.autoplay=!0),e.includes(l.searchParams.get("loop"))&&(this.config.loop.active=!0),this.isYouTube?(this.config.playsinline=e.includes(l.searchParams.get("playsinline")),this.config.youtube.hl=l.searchParams.get("hl")):this.config.playsinline=!0}}else this.provider=this.media.getAttribute(this.config.attributes.embed.provider),this.media.removeAttribute(this.config.attributes.embed.provider);if(W(this.provider)||!Object.values(Ge).includes(this.provider))return void this.debug.error("Setup failed: Invalid provider");this.type=et;break;case"video":case"audio":this.type=n,this.provider=Ge.html5,this.media.hasAttribute("crossorigin")&&(this.config.crossorigin=!0),this.media.hasAttribute("autoplay")&&(this.config.autoplay=!0),(this.media.hasAttribute("playsinline")||this.media.hasAttribute("webkit-playsinline"))&&(this.config.playsinline=!0),this.media.hasAttribute("muted")&&(this.config.muted=!0),this.media.hasAttribute("loop")&&(this.config.loop.active=!0);break;default:return void this.debug.error("Setup failed: unsupported type")}this.supported=me.check(this.type,this.provider,this.config.playsinline),this.supported.api?(this.eventListeners=[],this.listeners=new lt(this),this.storage=new Re(this),this.media.plyr=this,H(this.elements.container)||(this.elements.container=Z("div",{tabindex:0}),J(this.media,this.elements.container)),at.migrateStyles.call(this),at.addStyleHook.call(this),pt.setup.call(this),this.config.debug&&fe.call(this,this.elements.container,this.config.events.join(" "),(e=>{this.debug.log(`event: ${e.type}`)})),this.fullscreen=new st(this),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&at.build.call(this),this.listeners.container(),this.listeners.global(),this.config.ads.enabled&&(this.ads=new gt(this)),this.isHTML5&&this.config.autoplay&&this.once("canplay",(()=>ke(this.play()))),this.lastSeekTime=0,this.config.previewThumbnails.enabled&&(this.previewThumbnails=new vt(this))):this.debug.error("Setup failed: no support")}get isHTML5(){return this.provider===Ge.html5}get isEmbed(){return this.isYouTube||this.isVimeo}get isYouTube(){return this.provider===Ge.youtube}get isVimeo(){return this.provider===Ge.vimeo}get isVideo(){return this.type===et}get isAudio(){return this.type===Ze}get playing(){return Boolean(this.ready&&!this.paused&&!this.ended)}get paused(){return Boolean(this.media.paused)}get stopped(){return Boolean(this.paused&&0===this.currentTime)}get ended(){return Boolean(this.media.ended)}set currentTime(e){if(!this.duration)return;const t=$(e)&&e>0;this.media.currentTime=t?Math.min(e,this.duration):0,this.debug.log(`Seeking to ${this.currentTime} seconds`)}get currentTime(){return Number(this.media.currentTime)}get buffered(){const{buffered:e}=this.media;return $(e)?e:e&&e.length&&this.duration>0?e.end(0)/this.duration:0}get seeking(){return Boolean(this.media.seeking)}get duration(){const e=parseFloat(this.config.duration),t=(this.media||{}).duration,i=$(t)&&t!==1/0?t:0;return e||i}set volume(e){let t=e;_(t)&&(t=Number(t)),$(t)||(t=this.storage.get("volume")),$(t)||({volume:t}=this.config),t>1&&(t=1),t<0&&(t=0),this.config.volume=t,this.media.volume=t,!W(e)&&this.muted&&t>0&&(this.muted=!1)}get volume(){return Number(this.media.volume)}set muted(e){let t=e;O(t)||(t=this.storage.get("muted")),O(t)||(t=this.config.muted),this.config.muted=t,this.media.muted=t}get muted(){return Boolean(this.media.muted)}get hasAudio(){return!this.isHTML5||(!!this.isAudio||(Boolean(this.media.mozHasAudio)||Boolean(this.media.webkitAudioDecodedByteCount)||Boolean(this.media.audioTracks&&this.media.audioTracks.length)))}set speed(e){let t=null;$(e)&&(t=e),$(t)||(t=this.storage.get("speed")),$(t)||(t=this.config.speed.selected);const{minimumSpeed:i,maximumSpeed:s}=this;t=ft(t,i,s),this.config.speed.selected=t,setTimeout((()=>{this.media&&(this.media.playbackRate=t)}),0)}get speed(){return Number(this.media.playbackRate)}get minimumSpeed(){return this.isYouTube?Math.min(...this.options.speed):this.isVimeo?.5:.0625}get maximumSpeed(){return this.isYouTube?Math.max(...this.options.speed):this.isVimeo?2:16}set quality(e){const t=this.config.quality,i=this.options.quality;if(!i.length)return;let s=[!W(e)&&Number(e),this.storage.get("quality"),t.selected,t.default].find($),n=!0;if(!i.includes(s)){const e=Ae(i,s);this.debug.warn(`Unsupported quality option: ${s}, using ${e} instead`),s=e,n=!1}t.selected=s,this.media.quality=s,n&&this.storage.set({quality:s})}get quality(){return this.media.quality}set loop(e){const t=O(e)?e:this.config.loop.active;this.config.loop.active=t,this.media.loop=t}get loop(){return Boolean(this.media.loop)}set source(e){wt.change.call(this,e)}get source(){return this.media.currentSrc}get download(){const{download:e}=this.config.urls;return U(e)?e:this.source}set download(e){U(e)&&(this.config.urls.download=e,We.setDownloadUrl.call(this))}set poster(e){this.isVideo?at.setPoster.call(this,e,!1).catch((()=>{})):this.debug.warn("Poster can only be set for video")}get poster(){return this.isVideo?this.media.getAttribute("poster")||this.media.getAttribute("data-poster"):null}get ratio(){if(!this.isVideo)return null;const e=Me(Ne.call(this));return D(e)?e.join(":"):e}set ratio(e){this.isVideo?_(e)&&Pe(e)?(this.config.ratio=Me(e),xe.call(this)):this.debug.error(`Invalid aspect ratio specified (${e})`):this.debug.warn("Aspect ratio can only be set for video")}set autoplay(e){this.config.autoplay=O(e)?e:this.config.autoplay}get autoplay(){return Boolean(this.config.autoplay)}toggleCaptions(e){Ye.toggle.call(this,e,!1)}set currentTrack(e){Ye.set.call(this,e,!1),Ye.setup.call(this)}get currentTrack(){const{toggled:e,currentTrack:t}=this.captions;return e?t:-1}set language(e){Ye.setLanguage.call(this,e,!1)}get language(){return(Ye.getCurrentTrack.call(this)||{}).language}set pip(e){if(!me.pip)return;const t=O(e)?e:!this.pip;j(this.media.webkitSetPresentationMode)&&this.media.webkitSetPresentationMode(t?Xe:Je),j(this.media.requestPictureInPicture)&&(!this.pip&&t?this.media.requestPictureInPicture():this.pip&&!t&&document.exitPictureInPicture())}get pip(){return me.pip?W(this.media.webkitPresentationMode)?this.media===document.pictureInPictureElement:this.media.webkitPresentationMode===Xe:null}setPreviewThumbnails(e){this.previewThumbnails&&this.previewThumbnails.loaded&&(this.previewThumbnails.destroy(),this.previewThumbnails=null),Object.assign(this.config.previewThumbnails,e),this.config.previewThumbnails.enabled&&(this.previewThumbnails=new vt(this))}static supported(e,t,i){return me.check(e,t,i)}static loadSprite(e,t){return Ve(e,t)}static setup(e,t={}){let i=null;return _(e)?i=Array.from(document.querySelectorAll(e)):q(e)?i=Array.from(e):D(e)&&(i=e.filter(H)),W(i)?null:i.map((e=>new Tt(e,t)))}}var kt;return Tt.defaults=(kt=Qe,JSON.parse(JSON.stringify(kt))),Tt}));
|
|
//# sourceMappingURL=plyr.min.js.map
|
|
|
|
|
|
/***/ })
|
|
|
|
/******/ });
|
|
/************************************************************************/
|
|
/******/ // The module cache
|
|
/******/ var __webpack_module_cache__ = {};
|
|
/******/
|
|
/******/ // The require function
|
|
/******/ function __webpack_require__(moduleId) {
|
|
/******/ // Check if module is in cache
|
|
/******/ var cachedModule = __webpack_module_cache__[moduleId];
|
|
/******/ if (cachedModule !== undefined) {
|
|
/******/ return cachedModule.exports;
|
|
/******/ }
|
|
/******/ // Create a new module (and put it into the cache)
|
|
/******/ var module = __webpack_module_cache__[moduleId] = {
|
|
/******/ // no module.id needed
|
|
/******/ // no module.loaded needed
|
|
/******/ exports: {}
|
|
/******/ };
|
|
/******/
|
|
/******/ // Execute the module function
|
|
/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
|
/******/
|
|
/******/ // Return the exports of the module
|
|
/******/ return module.exports;
|
|
/******/ }
|
|
/******/
|
|
/************************************************************************/
|
|
/******/ /* webpack/runtime/compat get default export */
|
|
/******/ !function() {
|
|
/******/ // getDefaultExport function for compatibility with non-harmony modules
|
|
/******/ __webpack_require__.n = function(module) {
|
|
/******/ var getter = module && module.__esModule ?
|
|
/******/ function() { return module['default']; } :
|
|
/******/ function() { return module; };
|
|
/******/ __webpack_require__.d(getter, { a: getter });
|
|
/******/ return getter;
|
|
/******/ };
|
|
/******/ }();
|
|
/******/
|
|
/******/ /* webpack/runtime/define property getters */
|
|
/******/ !function() {
|
|
/******/ // define getter functions for harmony exports
|
|
/******/ __webpack_require__.d = function(exports, definition) {
|
|
/******/ for(var key in definition) {
|
|
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
|
|
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
|
|
/******/ }
|
|
/******/ }
|
|
/******/ };
|
|
/******/ }();
|
|
/******/
|
|
/******/ /* webpack/runtime/global */
|
|
/******/ !function() {
|
|
/******/ __webpack_require__.g = (function() {
|
|
/******/ if (typeof globalThis === 'object') return globalThis;
|
|
/******/ try {
|
|
/******/ return this || new Function('return this')();
|
|
/******/ } catch (e) {
|
|
/******/ if (typeof window === 'object') return window;
|
|
/******/ }
|
|
/******/ })();
|
|
/******/ }();
|
|
/******/
|
|
/******/ /* webpack/runtime/hasOwnProperty shorthand */
|
|
/******/ !function() {
|
|
/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
|
|
/******/ }();
|
|
/******/
|
|
/******/ /* webpack/runtime/make namespace object */
|
|
/******/ !function() {
|
|
/******/ // define __esModule on exports
|
|
/******/ __webpack_require__.r = function(exports) {
|
|
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
|
|
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
/******/ }
|
|
/******/ Object.defineProperty(exports, '__esModule', { value: true });
|
|
/******/ };
|
|
/******/ }();
|
|
/******/
|
|
/************************************************************************/
|
|
var __webpack_exports__ = {};
|
|
// This entry need to be wrapped in an IIFE because it need to be in strict mode.
|
|
!function() {
|
|
"use strict";
|
|
/*!**************************!*\
|
|
!*** ./assets/js/app.js ***!
|
|
\**************************/
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var plyr__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! plyr */ "./node_modules/plyr/dist/plyr.min.js");
|
|
/* harmony import */ var plyr__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(plyr__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var circletype__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! circletype */ "./node_modules/circletype/dist/circletype.min.js");
|
|
/* harmony import */ var circletype__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(circletype__WEBPACK_IMPORTED_MODULE_1__);
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// DATA
|
|
// ----------------------------------------------------------------------------
|
|
|
|
const root = document.documentElement; // HOME NAVIGATION DISPLAY //
|
|
|
|
const navEl = document.querySelector('.home__nav');
|
|
const navLinks = document.querySelectorAll('.home__nav-link');
|
|
const navImage = document.querySelector('.home__nav-image');
|
|
const circleTypes = []; // VIDEO PLAYERS //
|
|
|
|
const galleryVideos = document.querySelectorAll('.gallery__video');
|
|
let videoPlayers = []; // HEADER BAR ANIMATION //
|
|
|
|
const headerBar = document.querySelector('.header-bar');
|
|
const headerLogo = document.querySelector('.header-bar__logo');
|
|
let scrollOffset = 0; // NAVIGATION MENU ANIMATION //
|
|
|
|
const headerNavBtn = document.querySelector('.header-bar__nav-button');
|
|
const headerNavMenu = document.querySelector('.header-bar__nav-menu');
|
|
const headerNavMenuListEls = document.querySelectorAll('.header-bar__nav-menu li');
|
|
const headerNavOverlay = document.querySelector('.header-bar__nav-overlay');
|
|
const touchPosition = {
|
|
initialX: null,
|
|
initialY: null
|
|
}; // ----------------------------------------------------------------------------
|
|
// UTILS
|
|
// ----------------------------------------------------------------------------
|
|
// Convert rem to pixels by getting font-size CSS property
|
|
|
|
function convertRemToPixels(rem) {
|
|
let fontSize = parseFloat(window.getComputedStyle(document.body).getPropertyValue('font-size'));
|
|
return rem * fontSize;
|
|
} // ----------------------------------------------------------------------------
|
|
// LOGIC
|
|
// ----------------------------------------------------------------------------
|
|
// HOME NAVIGATION DISPLAY //
|
|
// Calculate navigation grid inner width
|
|
|
|
|
|
function calculateNavGridInnerWidth() {
|
|
if (root && navImage) {
|
|
let navGridGapProperty = window.getComputedStyle(root).getPropertyValue('--home-nav-gap');
|
|
let navGridGap = parseFloat(navGridGapProperty.slice(0, -3));
|
|
return navImage.getBoundingClientRect().width + convertRemToPixels(navGridGap) * 2;
|
|
}
|
|
} // Calculate navigation grid inner diagonal
|
|
|
|
|
|
function calculateNavGridInnerDiagonal() {
|
|
return calculateNavGridInnerWidth() * Math.sqrt(2);
|
|
} // Create new instance of CircleType for each navigation link, set radius and direction
|
|
|
|
|
|
function curveNavLinks() {
|
|
if (navLinks.length !== 0 && circleTypes) {
|
|
for (let i = 0; i < navLinks.length - 2; i++) {
|
|
circleTypes[i] = new (circletype__WEBPACK_IMPORTED_MODULE_1___default())(navLinks[i]);
|
|
circleTypes[i].radius(calculateNavGridInnerWidth() / 2);
|
|
}
|
|
|
|
for (let i = navLinks.length - 2; i < navLinks.length; i++) {
|
|
circleTypes[i] = new (circletype__WEBPACK_IMPORTED_MODULE_1___default())(navLinks[i]);
|
|
circleTypes[i].dir(-1);
|
|
circleTypes[i].radius(calculateNavGridInnerWidth() / 2);
|
|
}
|
|
}
|
|
} // Set --home-nav-item-translation CSS property
|
|
|
|
|
|
function setNavItemTranslationProperty() {
|
|
let navItemTranslation = (calculateNavGridInnerDiagonal() - calculateNavGridInnerWidth()) / 2;
|
|
|
|
if (root) {
|
|
root.style.setProperty('--home-nav-item-translation', navItemTranslation + 'px');
|
|
}
|
|
} // Set navigation grid display depending on number of links
|
|
|
|
|
|
function setNavGridDisplay() {
|
|
if (navEl && navLinks.length !== 0) {
|
|
if (navLinks.length === 2) {
|
|
navEl.classList.add('home__nav--2-items');
|
|
} else if (navLinks.length === 3) {
|
|
navEl.classList.add('home__nav--3-items');
|
|
} else if (navLinks.length === 4) {
|
|
navEl.classList.add('home__nav--4-items');
|
|
}
|
|
|
|
for (let i = 0; i < navLinks.length; i++) {
|
|
navLinks[i].classList.add('home__nav-link--visible');
|
|
}
|
|
}
|
|
} // Edit navigation links radius and translation on window resize event
|
|
|
|
|
|
function editNavLinksOnResize() {
|
|
window.addEventListener('resize', function (e) {
|
|
if (navLinks.length !== 0 && circleTypes) {
|
|
for (let i = 0; i < navLinks.length; i++) {
|
|
circleTypes[i].radius(calculateNavGridInnerWidth() / 2);
|
|
}
|
|
}
|
|
|
|
setNavItemTranslationProperty();
|
|
});
|
|
} // Add wave up animation to a single letter and remove it on animationend event
|
|
|
|
|
|
function waveNavLetterUp(navLetter) {
|
|
navLetter.classList.add('home__nav-letter--wave-up');
|
|
navLetter.addEventListener('animationend', function (e) {
|
|
navLetter.classList.remove('home__nav-letter--wave-up');
|
|
});
|
|
} // Add wave down animation to a single letter and remove it on animationend event
|
|
|
|
|
|
function waveNavLetterDown(navLetter) {
|
|
navLetter.classList.add('home__nav-letter--wave-down');
|
|
navLetter.addEventListener('animationend', function (e) {
|
|
navLetter.classList.remove('home__nav-letter--wave-down');
|
|
});
|
|
} // Add wave up animation to every letters of a single link with a slight delay
|
|
|
|
|
|
function waveNavLinkUp(navLink) {
|
|
let navLinkLetters = navLink.querySelectorAll('span');
|
|
let animationDelay = 0;
|
|
|
|
for (let i = 0; i < navLinkLetters.length; i++) {
|
|
setTimeout(waveNavLetterUp, animationDelay, navLinkLetters[i]);
|
|
animationDelay += 50;
|
|
}
|
|
} // Add wave down animation to every letters of a single link with a slight delay
|
|
|
|
|
|
function waveNavLinkDown(navLink) {
|
|
let navLinkLetters = navLink.querySelectorAll('span');
|
|
let animationDelay = 0;
|
|
|
|
for (let i = 0; i < navLinkLetters.length; i++) {
|
|
setTimeout(waveNavLetterDown, animationDelay, navLinkLetters[i]);
|
|
animationDelay += 50;
|
|
}
|
|
} // Add wave (up or down) animation to every letters of each link on mouseover event
|
|
|
|
|
|
function waveNavLinksOnHover() {
|
|
if (navLinks.length !== 0) {
|
|
for (let i = 0; i < navLinks.length - 2; i++) {
|
|
navLinks[i].addEventListener('mouseover', function (e) {
|
|
waveNavLinkUp(navLinks[i]);
|
|
});
|
|
}
|
|
|
|
for (let i = navLinks.length - 2; i < navLinks.length; i++) {
|
|
navLinks[i].addEventListener('mouseover', function (e) {
|
|
waveNavLinkDown(navLinks[i]);
|
|
});
|
|
}
|
|
}
|
|
} // VIDEO PLAYERS //
|
|
// Set up Plyr video players
|
|
|
|
|
|
function setUpVideoPlayers() {
|
|
if (galleryVideos.length !== 0) {
|
|
videoPlayers = plyr__WEBPACK_IMPORTED_MODULE_0___default().setup(galleryVideos, {
|
|
controls: ['play-large', 'play', 'progress', 'current-time', 'duration', 'mute', 'volume', 'fullscreen'],
|
|
i18n: {
|
|
play: 'Lire',
|
|
pause: 'Mettre sur pause',
|
|
seek: 'Parcourir la piste audio',
|
|
currentTime: 'Temps écoulé depuis le début de la piste audio',
|
|
duration: 'Durée de la piste audio',
|
|
volume: 'Ajuster le volume',
|
|
mute: 'Couper le son',
|
|
unmute: 'Activer le son',
|
|
enterFullscreen: 'Activer le mode plein écran',
|
|
exitFullscreen: 'Quitter le mode plein écran'
|
|
}
|
|
});
|
|
}
|
|
} // Toggle videos full screen mode on Plyr enterfullscreen and exitfullscreen media events
|
|
|
|
|
|
function toggleVideosFullScreen() {
|
|
if (videoPlayers.length !== 0) {
|
|
for (let i = 0; i < videoPlayers.length; i++) {
|
|
videoPlayers[i].on('enterfullscreen', function (e) {
|
|
galleryVideos[i].classList.add('gallery__video--full-screen');
|
|
});
|
|
videoPlayers[i].on('exitfullscreen', function (e) {
|
|
galleryVideos[i].classList.remove('gallery__video--full-screen');
|
|
});
|
|
}
|
|
}
|
|
} // HEADER BAR ANIMATION //
|
|
// Toggle header bar depending on scroll offset
|
|
|
|
|
|
function toggleHeaderBar() {
|
|
if (headerBar && headerLogo) {
|
|
let headerBarHeight = headerBar.getBoundingClientRect().height;
|
|
|
|
if (window.pageYOffset > headerBarHeight) {
|
|
// Scroll down past header bar height
|
|
headerBar.classList.add('header-bar--fixed');
|
|
headerLogo.classList.add('header-bar__logo--small');
|
|
} else if (window.pageYOffset <= 0) {
|
|
headerBar.classList.remove('header-bar--fixed');
|
|
headerLogo.classList.remove('header-bar__logo--small');
|
|
headerBar.classList.remove('header-bar--visible');
|
|
}
|
|
|
|
if (headerBar.classList.contains('header-bar--fixed')) {
|
|
if (scrollOffset < window.pageYOffset) {
|
|
// Scroll down
|
|
headerBar.classList.remove('header-bar--visible');
|
|
} else if (scrollOffset > window.pageYOffset) {
|
|
// Scroll up
|
|
headerBar.classList.add('header-bar--visible');
|
|
}
|
|
|
|
scrollOffset = window.pageYOffset;
|
|
}
|
|
}
|
|
} // NAVIGATION MENU ANIMATION //
|
|
// Toggle header navigation
|
|
|
|
|
|
function toggleHeaderNav() {
|
|
if (headerNavBtn && headerNavMenu) {
|
|
headerNavBtn.classList.toggle('header-bar__nav-button--custom-focus');
|
|
headerNavMenu.classList.toggle('header-bar__nav-menu--visible');
|
|
headerNavOverlay.classList.toggle('header-bar__nav-overlay--visible');
|
|
document.body.classList.toggle('body--hidden-overflow-y');
|
|
}
|
|
} // Open header navigation
|
|
|
|
|
|
function openHeaderNav() {
|
|
if (headerNavBtn && headerNavMenu) {
|
|
headerNavBtn.classList.add('header-bar__nav-button--custom-focus');
|
|
headerNavMenu.classList.add('header-bar__nav-menu--visible');
|
|
headerNavOverlay.classList.add('header-bar__nav-overlay--visible');
|
|
document.body.classList.add('body--hidden-overflow-y');
|
|
}
|
|
} // Close header navigation
|
|
|
|
|
|
function closeHeaderNav() {
|
|
if (headerNavBtn && headerNavMenu) {
|
|
headerNavBtn.classList.remove('header-bar__nav-button--custom-focus');
|
|
headerNavMenu.classList.remove('header-bar__nav-menu--visible');
|
|
headerNavOverlay.classList.remove('header-bar__nav-overlay--visible');
|
|
document.body.classList.remove('body--hidden-overflow-y');
|
|
}
|
|
} // Toggle header navigation on button click event
|
|
|
|
|
|
function toggleHeaderNavOnClick() {
|
|
headerNavBtn.addEventListener('click', toggleHeaderNav);
|
|
} // Close header navigation on document click event
|
|
|
|
|
|
function closeHeaderNavOnClick() {
|
|
document.addEventListener('click', function (e) {
|
|
if (headerNavBtn.classList.contains('header-bar__nav-button--custom-focus') && headerNavMenu.classList.contains('header-bar__nav-menu--visible') && !headerNavBtn.contains(e.target) && !headerNavMenu.contains(e.target)) {
|
|
closeHeaderNav(e);
|
|
|
|
if (e.cancelable) {
|
|
e.preventDefault();
|
|
}
|
|
}
|
|
});
|
|
} // Open header navigation on menu list focusin event
|
|
|
|
|
|
function openHeaderNavBeforeFocus() {
|
|
if (headerNavMenuListEls) {
|
|
for (let i = 0; i < headerNavMenuListEls.length; i++) {
|
|
headerNavMenuListEls[i].addEventListener('focusin', openHeaderNav);
|
|
}
|
|
}
|
|
} // Close header navigation on menu list focusout event
|
|
|
|
|
|
function closeHeaderNavAfterFocus() {
|
|
if (headerNavMenuListEls) {
|
|
for (let i = 0; i < headerNavMenuListEls.length; i++) {
|
|
headerNavMenuListEls[i].addEventListener('focusout', closeHeaderNav);
|
|
}
|
|
}
|
|
} // Close header navigation on touchstart and touchmove events (swipe right)
|
|
|
|
|
|
function closeHeaderNavOnSwipe() {
|
|
headerNavMenu.addEventListener('touchstart', function (e) {
|
|
if (headerNavBtn.classList.contains('header-bar__nav-button--custom-focus') && headerNavMenu.classList.contains('header-bar__nav-menu--visible') && touchPosition.initialX === null && touchPosition.initialY === null) {
|
|
touchPosition.initialX = event.touches[0].clientX;
|
|
touchPosition.initialY = event.touches[0].clientY;
|
|
}
|
|
}, {
|
|
passive: true
|
|
});
|
|
headerNavMenu.addEventListener('touchmove', function (e) {
|
|
if (headerNavBtn.classList.contains('header-bar__nav-button--custom-focus') && headerNavMenu.classList.contains('header-bar__nav-menu--visible') && touchPosition.initialX !== null && touchPosition.initialY !== null) {
|
|
touchPosition.currentX = event.touches[0].clientX;
|
|
touchPosition.currentY = event.touches[0].clientY;
|
|
touchPosition.diffX = touchPosition.initialX - touchPosition.currentX;
|
|
touchPosition.diffY = touchPosition.initialY - touchPosition.currentY;
|
|
|
|
if (Math.abs(touchPosition.diffX) > Math.abs(touchPosition.diffY)) {
|
|
if (touchPosition.diffX < 0) {
|
|
closeHeaderNav(e);
|
|
}
|
|
}
|
|
|
|
touchPosition.initialX = null;
|
|
touchPosition.initialY = null;
|
|
}
|
|
}, {
|
|
passive: true
|
|
});
|
|
} // ----------------------------------------------------------------------------
|
|
// PROGRAM
|
|
// ----------------------------------------------------------------------------
|
|
// Enable CSS :active pseudo-class in Safari Mobile
|
|
|
|
|
|
document.addEventListener("touchstart", function () {}, false); // HOME NAVIGATION DISPLAY //
|
|
|
|
window.addEventListener('load', function () {
|
|
curveNavLinks();
|
|
setNavItemTranslationProperty();
|
|
setNavGridDisplay();
|
|
editNavLinksOnResize();
|
|
waveNavLinksOnHover();
|
|
}); // VIDEO PLAYERS //
|
|
|
|
setUpVideoPlayers();
|
|
toggleVideosFullScreen(); // HEADER BAR ANIMATION //
|
|
|
|
document.addEventListener('scroll', function () {
|
|
toggleHeaderBar();
|
|
}); // NAVIGATION MENU ANIMATION //
|
|
|
|
toggleHeaderNavOnClick();
|
|
closeHeaderNavOnClick();
|
|
openHeaderNavBeforeFocus();
|
|
closeHeaderNavAfterFocus();
|
|
closeHeaderNavOnSwipe();
|
|
}();
|
|
/******/ })()
|
|
;
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QSxFQUVEO0FBQ0E7QUFDQTtBQUVBOzs7QUFDQXBHLFFBQVEsQ0FBQ2tELGdCQUFULENBQTBCLFlBQTFCLEVBQXdDLFlBQVcsQ0FBRSxDQUFyRCxFQUFzRCxLQUF0RCxHQUVBOztBQUVBMUIsTUFBTSxDQUFDMEIsZ0JBQVAsQ0FBd0IsTUFBeEIsRUFBZ0MsWUFBVztFQUMxQ2IsYUFBYTtFQUNiSyw2QkFBNkI7RUFDN0JJLGlCQUFpQjtFQUNqQkcsb0JBQW9CO0VBQ3BCYSxtQkFBbUI7QUFDbkIsQ0FORCxHQVFBOztBQUVBQyxpQkFBaUI7QUFDakJjLHNCQUFzQixJQUV0Qjs7QUFFQTdFLFFBQVEsQ0FBQ2tELGdCQUFULENBQTBCLFFBQTFCLEVBQW9DLFlBQVc7RUFDOUM2QixlQUFlO0FBQ2YsQ0FGRCxHQUlBOztBQUVBUyxzQkFBc0I7QUFDdEJDLHFCQUFxQjtBQUNyQkksd0JBQXdCO0FBQ3hCQyx3QkFBd0I7QUFDeEJDLHFCQUFxQixHIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NpcmNsZXR5cGUvZGlzdC9jaXJjbGV0eXBlLm1pbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcGx5ci9kaXN0L3BseXIubWluLmpzIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly8vd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly8vd2VicGFjay9ydW50aW1lL2dsb2JhbCIsIndlYnBhY2s6Ly8vd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly8vd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly8vLi9hc3NldHMvanMvYXBwLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogY2lyY2xldHlwZSAyLjMuMFxuICogQSBKYXZhU2NyaXB0IGxpYnJhcnkgdGhhdCBsZXRzIHlvdSBjdXJ2ZSB0eXBlIG9uIHRoZSB3ZWIuXG4gKiBDb3B5cmlnaHQgwqkgMjAxNC0yMDE4IFBldGVyIEhyeW5rb3dcbiAqIExpY2Vuc2VkIE1JVFxuICogaHR0cHM6Ly9naXRodWIuY29tL3BldGVyaHJ5L0NpcmNsZVR5cGUjcmVhZG1lXG4gKi9cbiFmdW5jdGlvbih0LGUpe1wib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPWUoKTpcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFtdLGUpOlwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHMuQ2lyY2xlVHlwZT1lKCk6dC5DaXJjbGVUeXBlPWUoKX0oXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGY/c2VsZjp0aGlzLGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUocil7aWYobltyXSlyZXR1cm4gbltyXS5leHBvcnRzO3ZhciBpPW5bcl09e2k6cixsOiExLGV4cG9ydHM6e319O3JldHVybiB0W3JdLmNhbGwoaS5leHBvcnRzLGksaS5leHBvcnRzLGUpLGkubD0hMCxpLmV4cG9ydHN9dmFyIG49e307cmV0dXJuIGUubT10LGUuYz1uLGUuZD1mdW5jdGlvbih0LG4scil7ZS5vKHQsbil8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4se2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLGdldDpyfSl9LGUubj1mdW5jdGlvbih0KXt2YXIgbj10JiZ0Ll9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gdC5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiB0fTtyZXR1cm4gZS5kKG4sXCJhXCIsbiksbn0sZS5vPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfSxlLnA9XCJcIixlKGUucz0yOSl9KFtmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNCkoXCJ3a3NcIiksaT1uKDEyKSxvPW4oMSkuU3ltYm9sLHU9XCJmdW5jdGlvblwiPT10eXBlb2YgbzsodC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiByW3RdfHwoclt0XT11JiZvW3RdfHwodT9vOmkpKFwiU3ltYm9sLlwiK3QpKX0pLnN0b3JlPXJ9LGZ1bmN0aW9uKHQsZSl7dmFyIG49dC5leHBvcnRzPVwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdy5NYXRoPT1NYXRoP3dpbmRvdzpcInVuZGVmaW5lZFwiIT10eXBlb2Ygc2VsZiYmc2VsZi5NYXRoPT1NYXRoP3NlbGY6RnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1wibnVtYmVyXCI9PXR5cGVvZiBfX2cmJihfX2c9bil9LGZ1bmN0aW9uKHQsZSl7dmFyIG49dC5leHBvcnRzPXt2ZXJzaW9uOlwiMi41LjZcIn07XCJudW1iZXJcIj09dHlwZW9mIF9fZSYmKF9fZT1uKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNCksaT1uKDExKTt0LmV4cG9ydHM9big2KT9mdW5jdGlvbih0LGUsbil7cmV0dXJuIHIuZih0LGUsaSgxLG4pKX06ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0W2VdPW4sdH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpLGk9bigzNCksbz1uKDM1KSx1PU9iamVjdC5kZWZpbmVQcm9wZXJ0eTtlLmY9big2KT9PYmplY3QuZGVmaW5lUHJvcGVydHk6ZnVuY3Rpb24odCxlLG4pe2lmKHIodCksZT1vKGUsITApLHIobiksaSl0cnl7cmV0dXJuIHUodCxlLG4pfWNhdGNoKHQpe31pZihcImdldFwiaW4gbnx8XCJzZXRcImluIG4pdGhyb3cgVHlwZUVycm9yKFwiQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhXCIpO3JldHVyblwidmFsdWVcImluIG4mJih0W2VdPW4udmFsdWUpLHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCFyKHQpKXRocm93IFR5cGVFcnJvcih0K1wiIGlzIG5vdCBhbiBvYmplY3QhXCIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz0hbigxNykoZnVuY3Rpb24oKXtyZXR1cm4gNyE9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LFwiYVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSl9LGZ1bmN0aW9uKHQsZSl7dmFyIG49e30uaGFzT3duUHJvcGVydHk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4uY2FsbCh0LGUpfX0sZnVuY3Rpb24odCxlKXt2YXIgbj1NYXRoLmNlaWwscj1NYXRoLmZsb29yO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gaXNOYU4odD0rdCk/MDoodD4wP3I6bikodCl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZih2b2lkIDA9PXQpdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIFwiK3QpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuXCJvYmplY3RcIj09dHlwZW9mIHQ/bnVsbCE9PXQ6XCJmdW5jdGlvblwiPT10eXBlb2YgdH19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJue2VudW1lcmFibGU6ISgxJnQpLGNvbmZpZ3VyYWJsZTohKDImdCksd3JpdGFibGU6ISg0JnQpLHZhbHVlOmV9fX0sZnVuY3Rpb24odCxlKXt2YXIgbj0wLHI9TWF0aC5yYW5kb20oKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuXCJTeW1ib2woXCIuY29uY2F0KHZvaWQgMD09PXQ/XCJcIjp0LFwiKV9cIiwoKytuK3IpLnRvU3RyaW5nKDM2KSl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjQpKFwia2V5c1wiKSxpPW4oMTIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gclt0XXx8KHJbdF09aSh0KSl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz0hMX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMSksaT1uKDIpLG89bigzKSx1PW4oMTkpLGM9bigyMCksZj1mdW5jdGlvbih0LGUsbil7dmFyIGEscyxsLHAsaD10JmYuRixkPXQmZi5HLHY9dCZmLlMseT10JmYuUCxfPXQmZi5CLG09ZD9yOnY/cltlXXx8KHJbZV09e30pOihyW2VdfHx7fSkucHJvdG90eXBlLGc9ZD9pOmlbZV18fChpW2VdPXt9KSx4PWcucHJvdG90eXBlfHwoZy5wcm90b3R5cGU9e30pO2QmJihuPWUpO2ZvcihhIGluIG4pcz0haCYmbSYmdm9pZCAwIT09bVthXSxsPShzP206bilbYV0scD1fJiZzP2MobCxyKTp5JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBsP2MoRnVuY3Rpb24uY2FsbCxsKTpsLG0mJnUobSxhLGwsdCZmLlUpLGdbYV0hPWwmJm8oZyxhLHApLHkmJnhbYV0hPWwmJih4W2FdPWwpfTtyLmNvcmU9aSxmLkY9MSxmLkc9MixmLlM9NCxmLlA9OCxmLkI9MTYsZi5XPTMyLGYuVT02NCxmLlI9MTI4LHQuZXhwb3J0cz1mfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXt0cnl7cmV0dXJuISF0KCl9Y2F0Y2godCl7cmV0dXJuITB9fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTApLGk9bigxKS5kb2N1bWVudCxvPXIoaSkmJnIoaS5jcmVhdGVFbGVtZW50KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG8/aS5jcmVhdGVFbGVtZW50KHQpOnt9fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMSksaT1uKDMpLG89big3KSx1PW4oMTIpKFwic3JjXCIpLGM9RnVuY3Rpb24udG9TdHJpbmcsZj0oXCJcIitjKS5zcGxpdChcInRvU3RyaW5nXCIpO24oMikuaW5zcGVjdFNvdXJjZT1mdW5jdGlvbih0KXtyZXR1cm4gYy5jYWxsKHQpfSwodC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLGMpe3ZhciBhPVwiZnVuY3Rpb25cIj09dHlwZW9mIG47YSYmKG8obixcIm5hbWVcIil8fGkobixcIm5hbWVcIixlKSksdFtlXSE9PW4mJihhJiYobyhuLHUpfHxpKG4sdSx0W2VdP1wiXCIrdFtlXTpmLmpvaW4oU3RyaW5nKGUpKSkpLHQ9PT1yP3RbZV09bjpjP3RbZV0/dFtlXT1uOmkodCxlLG4pOihkZWxldGUgdFtlXSxpKHQsZSxuKSkpfSkoRnVuY3Rpb24ucHJvdG90eXBlLFwidG9TdHJpbmdcIixmdW5jdGlvbigpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIHRoaXMmJnRoaXNbdV18fGMuY2FsbCh0aGlzKX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzNik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtpZihyKHQpLHZvaWQgMD09PWUpcmV0dXJuIHQ7c3dpdGNoKG4pe2Nhc2UgMTpyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQuY2FsbChlLG4pfTtjYXNlIDI6cmV0dXJuIGZ1bmN0aW9uKG4scil7cmV0dXJuIHQuY2FsbChlLG4scil9O2Nhc2UgMzpyZXR1cm4gZnVuY3Rpb24obixyLGkpe3JldHVybiB0LmNhbGwoZSxuLHIsaSl9fXJldHVybiBmdW5jdGlvbigpe3JldHVybiB0LmFwcGx5KGUsYXJndW1lbnRzKX19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0MiksaT1uKDkpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gcihpKHQpKX19LGZ1bmN0aW9uKHQsZSl7dmFyIG49e30udG9TdHJpbmc7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBuLmNhbGwodCkuc2xpY2UoOCwtMSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big4KSxpPU1hdGgubWluO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdD4wP2kocih0KSw5MDA3MTk5MjU0NzQwOTkxKTowfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMiksaT1uKDEpLG89aVtcIl9fY29yZS1qc19zaGFyZWRfX1wiXXx8KGlbXCJfX2NvcmUtanNfc2hhcmVkX19cIl09e30pOyh0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gb1t0XXx8KG9bdF09dm9pZCAwIT09ZT9lOnt9KX0pKFwidmVyc2lvbnNcIixbXSkucHVzaCh7dmVyc2lvbjpyLnZlcnNpb24sbW9kZTpuKDE1KT9cInB1cmVcIjpcImdsb2JhbFwiLGNvcHlyaWdodDpcIsKpIDIwMTggRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSlcIn0pfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1cImNvbnN0cnVjdG9yLGhhc093blByb3BlcnR5LGlzUHJvdG90eXBlT2YscHJvcGVydHlJc0VudW1lcmFibGUsdG9Mb2NhbGVTdHJpbmcsdG9TdHJpbmcsdmFsdWVPZlwiLnNwbGl0KFwiLFwiKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNCkuZixpPW4oNyksbz1uKDApKFwidG9TdHJpbmdUYWdcIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXt0JiYhaSh0PW4/dDp0LnByb3RvdHlwZSxvKSYmcih0LG8se2NvbmZpZ3VyYWJsZTohMCx2YWx1ZTplfSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big5KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdChyKHQpKX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgcj1NYXRoLlBJLzE4MDtlLmRlZmF1bHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQqcn19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuKDMwKTt2YXIgcj1uKDU0KSxpPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX0ocik7dC5leHBvcnRzPWkuZGVmYXVsdH0sZnVuY3Rpb24odCxlLG4pe24oMzEpLG4oNDcpLHQuZXhwb3J0cz1uKDIpLkFycmF5LmZyb219LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj1uKDMyKSghMCk7bigzMykoU3RyaW5nLFwiU3RyaW5nXCIsZnVuY3Rpb24odCl7dGhpcy5fdD1TdHJpbmcodCksdGhpcy5faT0wfSxmdW5jdGlvbigpe3ZhciB0LGU9dGhpcy5fdCxuPXRoaXMuX2k7cmV0dXJuIG4+PWUubGVuZ3RoP3t2YWx1ZTp2b2lkIDAsZG9uZTohMH06KHQ9cihlLG4pLHRoaXMuX2krPXQubGVuZ3RoLHt2YWx1ZTp0LGRvbmU6ITF9KX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big4KSxpPW4oOSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3ZhciBvLHUsYz1TdHJpbmcoaShlKSksZj1yKG4pLGE9Yy5sZW5ndGg7cmV0dXJuIGY8MHx8Zj49YT90P1wiXCI6dm9pZCAwOihvPWMuY2hhckNvZGVBdChmKSxvPDU1Mjk2fHxvPjU2MzE5fHxmKzE9PT1hfHwodT1jLmNoYXJDb2RlQXQoZisxKSk8NTYzMjB8fHU+NTczNDM/dD9jLmNoYXJBdChmKTpvOnQ/Yy5zbGljZShmLGYrMik6dS01NjMyMCsoby01NTI5Njw8MTApKzY1NTM2KX19fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9bigxNSksaT1uKDE2KSxvPW4oMTkpLHU9bigzKSxjPW4oMTMpLGY9bigzNyksYT1uKDI2KSxzPW4oNDYpLGw9bigwKShcIml0ZXJhdG9yXCIpLHA9IShbXS5rZXlzJiZcIm5leHRcImluW10ua2V5cygpKSxoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbixkLHYseSxfKXtmKG4sZSxkKTt2YXIgbSxnLHgsYj1mdW5jdGlvbih0KXtpZighcCYmdCBpbiBNKXJldHVybiBNW3RdO3N3aXRjaCh0KXtjYXNlXCJrZXlzXCI6Y2FzZVwidmFsdWVzXCI6cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMsdCl9fXJldHVybiBmdW5jdGlvbigpe3JldHVybiBuZXcgbih0aGlzLHQpfX0sTz1lK1wiIEl0ZXJhdG9yXCIsdz1cInZhbHVlc1wiPT12LGo9ITEsTT10LnByb3RvdHlwZSxTPU1bbF18fE1bXCJAQGl0ZXJhdG9yXCJdfHx2JiZNW3ZdLFA9U3x8Yih2KSxBPXY/dz9iKFwiZW50cmllc1wiKTpQOnZvaWQgMCxUPVwiQXJyYXlcIj09ZT9NLmVudHJpZXN8fFM6UztpZihUJiYoeD1zKFQuY2FsbChuZXcgdCkpKSE9PU9iamVjdC5wcm90b3R5cGUmJngubmV4dCYmKGEoeCxPLCEwKSxyfHxcImZ1bmN0aW9uXCI9PXR5cGVvZiB4W2xdfHx1KHgsbCxoKSksdyYmUyYmXCJ2YWx1ZXNcIiE9PVMubmFtZSYmKGo9ITAsUD1mdW5jdGlvbigpe3JldHVybiBTLmNhbGwodGhpcyl9KSxyJiYhX3x8IXAmJiFqJiZNW2xdfHx1KE0sbCxQKSxjW2VdPVAsY1tPXT1oLHYpaWYobT17dmFsdWVzOnc/UDpiKFwidmFsdWVzXCIpLGtleXM6eT9QOmIoXCJrZXlzXCIpLGVudHJpZXM6QX0sXylmb3IoZyBpbiBtKWcgaW4gTXx8byhNLGcsbVtnXSk7ZWxzZSBpKGkuUCtpLkYqKHB8fGopLGUsbSk7cmV0dXJuIG19fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPSFuKDYpJiYhbigxNykoZnVuY3Rpb24oKXtyZXR1cm4gNyE9T2JqZWN0LmRlZmluZVByb3BlcnR5KG4oMTgpKFwiZGl2XCIpLFwiYVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEwKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZighcih0KSlyZXR1cm4gdDt2YXIgbixpO2lmKGUmJlwiZnVuY3Rpb25cIj09dHlwZW9mKG49dC50b1N0cmluZykmJiFyKGk9bi5jYWxsKHQpKSlyZXR1cm4gaTtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZihuPXQudmFsdWVPZikmJiFyKGk9bi5jYWxsKHQpKSlyZXR1cm4gaTtpZighZSYmXCJmdW5jdGlvblwiPT10eXBlb2Yobj10LnRvU3RyaW5nKSYmIXIoaT1uLmNhbGwodCkpKXJldHVybiBpO3Rocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIHQpdGhyb3cgVHlwZUVycm9yKHQrXCIgaXMgbm90IGEgZnVuY3Rpb24hXCIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPW4oMzgpLGk9bigxMSksbz1uKDI2KSx1PXt9O24oMykodSxuKDApKFwiaXRlcmF0b3JcIiksZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pLHQuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7dC5wcm90b3R5cGU9cih1LHtuZXh0OmkoMSxuKX0pLG8odCxlK1wiIEl0ZXJhdG9yXCIpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNSksaT1uKDM5KSxvPW4oMjUpLHU9bigxNCkoXCJJRV9QUk9UT1wiKSxjPWZ1bmN0aW9uKCl7fSxmPWZ1bmN0aW9uKCl7dmFyIHQsZT1uKDE4KShcImlmcmFtZVwiKSxyPW8ubGVuZ3RoO2ZvcihlLnN0eWxlLmRpc3BsYXk9XCJub25lXCIsbig0NSkuYXBwZW5kQ2hpbGQoZSksZS5zcmM9XCJqYXZhc2NyaXB0OlwiLHQ9ZS5jb250ZW50V2luZG93LmRvY3VtZW50LHQub3BlbigpLHQud3JpdGUoXCI8c2NyaXB0PmRvY3VtZW50LkY9T2JqZWN0PFxcL3NjcmlwdD5cIiksdC5jbG9zZSgpLGY9dC5GO3ItLTspZGVsZXRlIGYucHJvdG90eXBlW29bcl1dO3JldHVybiBmKCl9O3QuZXhwb3J0cz1PYmplY3QuY3JlYXRlfHxmdW5jdGlvbih0LGUpe3ZhciBuO3JldHVybiBudWxsIT09dD8oYy5wcm90b3R5cGU9cih0KSxuPW5ldyBjLGMucHJvdG90eXBlPW51bGwsblt1XT10KTpuPWYoKSx2b2lkIDA9PT1lP246aShuLGUpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNCksaT1uKDUpLG89big0MCk7dC5leHBvcnRzPW4oNik/T2JqZWN0LmRlZmluZVByb3BlcnRpZXM6ZnVuY3Rpb24odCxlKXtpKHQpO2Zvcih2YXIgbix1PW8oZSksYz11Lmxlbmd0aCxmPTA7Yz5mOylyLmYodCxuPXVbZisrXSxlW25dKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQxKSxpPW4oMjUpO3QuZXhwb3J0cz1PYmplY3Qua2V5c3x8ZnVuY3Rpb24odCl7cmV0dXJuIHIodCxpKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDcpLGk9bigyMSksbz1uKDQzKSghMSksdT1uKDE0KShcIklFX1BST1RPXCIpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuLGM9aSh0KSxmPTAsYT1bXTtmb3IobiBpbiBjKW4hPXUmJnIoYyxuKSYmYS5wdXNoKG4pO2Zvcig7ZS5sZW5ndGg+ZjspcihjLG49ZVtmKytdKSYmKH5vKGEsbil8fGEucHVzaChuKSk7cmV0dXJuIGF9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMik7dC5leHBvcnRzPU9iamVjdChcInpcIikucHJvcGVydHlJc0VudW1lcmFibGUoMCk/T2JqZWN0OmZ1bmN0aW9uKHQpe3JldHVyblwiU3RyaW5nXCI9PXIodCk/dC5zcGxpdChcIlwiKTpPYmplY3QodCl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMSksaT1uKDIzKSxvPW4oNDQpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuLHUpe3ZhciBjLGY9cihlKSxhPWkoZi5sZW5ndGgpLHM9byh1LGEpO2lmKHQmJm4hPW4pe2Zvcig7YT5zOylpZigoYz1mW3MrK10pIT1jKXJldHVybiEwfWVsc2UgZm9yKDthPnM7cysrKWlmKCh0fHxzIGluIGYpJiZmW3NdPT09bilyZXR1cm4gdHx8c3x8MDtyZXR1cm4hdCYmLTF9fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oOCksaT1NYXRoLm1heCxvPU1hdGgubWluO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiB0PXIodCksdDwwP2kodCtlLDApOm8odCxlKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEpLmRvY3VtZW50O3QuZXhwb3J0cz1yJiZyLmRvY3VtZW50RWxlbWVudH0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNyksaT1uKDI3KSxvPW4oMTQpKFwiSUVfUFJPVE9cIiksdT1PYmplY3QucHJvdG90eXBlO3QuZXhwb3J0cz1PYmplY3QuZ2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uKHQpe3JldHVybiB0PWkodCkscih0LG8pP3Rbb106XCJmdW5jdGlvblwiPT10eXBlb2YgdC5jb25zdHJ1Y3RvciYmdCBpbnN0YW5jZW9mIHQuY29uc3RydWN0b3I/dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGU6dCBpbnN0YW5jZW9mIE9iamVjdD91Om51bGx9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9bigyMCksaT1uKDE2KSxvPW4oMjcpLHU9big0OCksYz1uKDQ5KSxmPW4oMjMpLGE9big1MCkscz1uKDUxKTtpKGkuUytpLkYqIW4oNTMpKGZ1bmN0aW9uKHQpe0FycmF5LmZyb20odCl9KSxcIkFycmF5XCIse2Zyb206ZnVuY3Rpb24odCl7dmFyIGUsbixpLGwscD1vKHQpLGg9XCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcz90aGlzOkFycmF5LGQ9YXJndW1lbnRzLmxlbmd0aCx2PWQ+MT9hcmd1bWVudHNbMV06dm9pZCAwLHk9dm9pZCAwIT09dixfPTAsbT1zKHApO2lmKHkmJih2PXIodixkPjI/YXJndW1lbnRzWzJdOnZvaWQgMCwyKSksdm9pZCAwPT1tfHxoPT1BcnJheSYmYyhtKSlmb3IoZT1mKHAubGVuZ3RoKSxuPW5ldyBoKGUpO2U+XztfKyspYShuLF8seT92KHBbX10sXyk6cFtfXSk7ZWxzZSBmb3IobD1tLmNhbGwocCksbj1uZXcgaDshKGk9bC5uZXh0KCkpLmRvbmU7XysrKWEobixfLHk/dShsLHYsW2kudmFsdWUsX10sITApOmkudmFsdWUpO3JldHVybiBuLmxlbmd0aD1fLG59fSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbixpKXt0cnl7cmV0dXJuIGk/ZShyKG4pWzBdLG5bMV0pOmUobil9Y2F0Y2goZSl7dmFyIG89dC5yZXR1cm47dGhyb3cgdm9pZCAwIT09byYmcihvLmNhbGwodCkpLGV9fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTMpLGk9bigwKShcIml0ZXJhdG9yXCIpLG89QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwIT09dCYmKHIuQXJyYXk9PT10fHxvW2ldPT09dCl9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9big0KSxpPW4oMTEpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7ZSBpbiB0P3IuZih0LGUsaSgwLG4pKTp0W2VdPW59fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1MiksaT1uKDApKFwiaXRlcmF0b3JcIiksbz1uKDEzKTt0LmV4cG9ydHM9bigyKS5nZXRJdGVyYXRvck1ldGhvZD1mdW5jdGlvbih0KXtpZih2b2lkIDAhPXQpcmV0dXJuIHRbaV18fHRbXCJAQGl0ZXJhdG9yXCJdfHxvW3IodCldfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjIpLGk9bigwKShcInRvU3RyaW5nVGFnXCIpLG89XCJBcmd1bWVudHNcIj09cihmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KCkpLHU9ZnVuY3Rpb24odCxlKXt0cnl7cmV0dXJuIHRbZV19Y2F0Y2godCl7fX07dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlLG4sYztyZXR1cm4gdm9pZCAwPT09dD9cIlVuZGVmaW5lZFwiOm51bGw9PT10P1wiTnVsbFwiOlwic3RyaW5nXCI9PXR5cGVvZihuPXUoZT1PYmplY3QodCksaSkpP246bz9yKGUpOlwiT2JqZWN0XCI9PShjPXIoZSkpJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBlLmNhbGxlZT9cIkFyZ3VtZW50c1wiOmN9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigwKShcIml0ZXJhdG9yXCIpLGk9ITE7dHJ5e3ZhciBvPVs3XVtyXSgpO28ucmV0dXJuPWZ1bmN0aW9uKCl7aT0hMH0sQXJyYXkuZnJvbShvLGZ1bmN0aW9uKCl7dGhyb3cgMn0pfWNhdGNoKHQpe310LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZighZSYmIWkpcmV0dXJuITE7dmFyIG49ITE7dHJ5e3ZhciBvPVs3XSx1PW9bcl0oKTt1Lm5leHQ9ZnVuY3Rpb24oKXtyZXR1cm57ZG9uZTpuPSEwfX0sb1tyXT1mdW5jdGlvbigpe3JldHVybiB1fSx0KG8pfWNhdGNoKHQpe31yZXR1cm4gbn19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiByKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1mdW5jdGlvbiBpKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsci5rZXkscil9fXJldHVybiBmdW5jdGlvbihlLG4scil7cmV0dXJuIG4mJnQoZS5wcm90b3R5cGUsbiksciYmdChlLHIpLGV9fSgpLHU9big1NSksYz1yKHUpLGY9big1NiksYT1yKGYpLHM9big1NyksbD1yKHMpLHA9big1OCksaD1yKHApLGQ9big1OSksdj1yKGQpLHk9TWF0aC5QSSxfPU1hdGgubWF4LG09TWF0aC5taW4sZz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxuKXtpKHRoaXMsdCksdGhpcy5lbGVtZW50PWUsdGhpcy5vcmlnaW5hbEhUTUw9dGhpcy5lbGVtZW50LmlubmVySFRNTDt2YXIgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLG89ZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO3Iuc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLGUuaW5uZXJUZXh0KSxyLnN0eWxlLnBvc2l0aW9uPVwicmVsYXRpdmVcIix0aGlzLmNvbnRhaW5lcj1yLHRoaXMuX2xldHRlcnM9KDAsYS5kZWZhdWx0KShlLG4pLHRoaXMuX2xldHRlcnMuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gby5hcHBlbmRDaGlsZCh0KX0pLHIuYXBwZW5kQ2hpbGQobyksdGhpcy5lbGVtZW50LmlubmVySFRNTD1cIlwiLHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChyKTt2YXIgdT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmVsZW1lbnQpLGY9dS5mb250U2l6ZSxzPXUubGluZUhlaWdodDt0aGlzLl9mb250U2l6ZT1wYXJzZUZsb2F0KGYpLHRoaXMuX2xpbmVIZWlnaHQ9cGFyc2VGbG9hdChzKXx8dGhpcy5fZm9udFNpemUsdGhpcy5fbWV0cmljcz10aGlzLl9sZXR0ZXJzLm1hcChjLmRlZmF1bHQpO3ZhciBsPXRoaXMuX21ldHJpY3MucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrZS53aWR0aH0sMCk7dGhpcy5fbWluUmFkaXVzPWwveS8yK3RoaXMuX2xpbmVIZWlnaHQsdGhpcy5fZGlyPTEsdGhpcy5fZm9yY2VXaWR0aD0hMSx0aGlzLl9mb3JjZUhlaWdodD0hMCx0aGlzLl9yYWRpdXM9dGhpcy5fbWluUmFkaXVzLHRoaXMuX2ludmFsaWRhdGUoKX1yZXR1cm4gbyh0LFt7a2V5OlwicmFkaXVzXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMCE9PXQ/KHRoaXMuX3JhZGl1cz1fKHRoaXMuX21pblJhZGl1cyx0KSx0aGlzLl9pbnZhbGlkYXRlKCksdGhpcyk6dGhpcy5fcmFkaXVzfX0se2tleTpcImRpclwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDAhPT10Pyh0aGlzLl9kaXI9dCx0aGlzLl9pbnZhbGlkYXRlKCksdGhpcyk6dGhpcy5fZGlyfX0se2tleTpcImZvcmNlV2lkdGhcIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwIT09dD8odGhpcy5fZm9yY2VXaWR0aD10LHRoaXMuX2ludmFsaWRhdGUoKSx0aGlzKTp0aGlzLl9mb3JjZVdpZHRofX0se2tleTpcImZvcmNlSGVpZ2h0XCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMCE9PXQ/KHRoaXMuX2ZvcmNlSGVpZ2h0PXQsdGhpcy5faW52YWxpZGF0ZSgpLHRoaXMpOnRoaXMuX2ZvcmNlSGVpZ2h0fX0se2tleTpcInJlZnJlc2hcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbnZhbGlkYXRlKCl9fSx7a2V5OlwiZGVzdHJveVwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudC5pbm5lckhUTUw9dGhpcy5vcmlnaW5hbEhUTUwsdGhpc319LHtrZXk6XCJfaW52YWxpZGF0ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztyZXR1cm4gY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fcmFmKSx0aGlzLl9yYWY9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7dC5fbGF5b3V0KCl9KSx0aGlzfX0se2tleTpcIl9sYXlvdXRcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLl9yYWRpdXMsbj10aGlzLl9kaXIscj0tMT09PW4/LWUrdGhpcy5fbGluZUhlaWdodDplLGk9XCJjZW50ZXIgXCIrci90aGlzLl9mb250U2l6ZStcImVtXCIsbz1lLXRoaXMuX2xpbmVIZWlnaHQsdT0oMCx2LmRlZmF1bHQpKHRoaXMuX21ldHJpY3MsbyksYz11LnJvdGF0aW9ucyxmPXUuzrg7aWYodGhpcy5fbGV0dGVycy5mb3JFYWNoKGZ1bmN0aW9uKGUscil7dmFyIG89ZS5zdHlsZSx1PSgtLjUqZitjW3JdKSpuLGE9LS41KnQuX21ldHJpY3Nbcl0ud2lkdGgvdC5fZm9udFNpemUscz1cInRyYW5zbGF0ZVgoXCIrYStcImVtKSByb3RhdGUoXCIrdStcImRlZylcIjtvLnBvc2l0aW9uPVwiYWJzb2x1dGVcIixvLmJvdHRvbT0tMT09PW4/MDpcImF1dG9cIixvLmxlZnQ9XCI1MCVcIixvLnRyYW5zZm9ybT1zLG8udHJhbnNmb3JtT3JpZ2luPWksby53ZWJraXRUcmFuc2Zvcm09cyxvLndlYmtpdFRyYW5zZm9ybU9yaWdpbj1pfSksdGhpcy5fZm9yY2VIZWlnaHQpe3ZhciBhPWY+MTgwPygwLGwuZGVmYXVsdCkoZSxmKTooMCxsLmRlZmF1bHQpKG8sZikrdGhpcy5fbGluZUhlaWdodDt0aGlzLmNvbnRhaW5lci5zdHlsZS5oZWlnaHQ9YS90aGlzLl9mb250U2l6ZStcImVtXCJ9aWYodGhpcy5fZm9yY2VXaWR0aCl7dmFyIHM9KDAsaC5kZWZhdWx0KShlLG0oMTgwLGYpKTt0aGlzLmNvbnRhaW5lci5zdHlsZS53aWR0aD1zL3RoaXMuX2ZvbnRTaXplK1wiZW1cIn1yZXR1cm4gdGhpc319XSksdH0oKTtlLmRlZmF1bHQ9Z30sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLGUuZGVmYXVsdD1mdW5jdGlvbih0KXt2YXIgZT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybntoZWlnaHQ6ZS5oZWlnaHQsbGVmdDplLmxlZnQrd2luZG93LnBhZ2VYT2Zmc2V0LHRvcDplLnRvcCt3aW5kb3cucGFnZVlPZmZzZXQsd2lkdGg6ZS53aWR0aH19fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gcih0KXtpZihBcnJheS5pc0FycmF5KHQpKXtmb3IodmFyIGU9MCxuPUFycmF5KHQubGVuZ3RoKTtlPHQubGVuZ3RoO2UrKyluW2VdPXRbZV07cmV0dXJuIG59cmV0dXJuIEFycmF5LmZyb20odCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksZS5kZWZhdWx0PWZ1bmN0aW9uKHQsZSl7dmFyIG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIiksaT10LmlubmVyVGV4dC50cmltKCk7cmV0dXJuKGU/ZShpKTpbXS5jb25jYXQocihpKSkpLm1hcChmdW5jdGlvbih0KXt2YXIgZT1uLmNsb25lTm9kZSgpO3JldHVybiBlLmluc2VydEFkamFjZW50SFRNTChcImFmdGVyYmVnaW5cIixcIiBcIj09PXQ/XCImbmJzcDtcIjp0KSxlfSl9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIHI9bigyOCksaT1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19KHIpO2UuZGVmYXVsdD1mdW5jdGlvbih0LGUpe3JldHVybiB0KigxLU1hdGguY29zKCgwLGkuZGVmYXVsdCkoZS8yKSkpfX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciByPW4oMjgpLGk9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fShyKTtlLmRlZmF1bHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gMip0Kk1hdGguc2luKCgwLGkuZGVmYXVsdCkoZS8yKSl9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIHI9big2MCksaT1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19KHIpO2UuZGVmYXVsdD1mdW5jdGlvbih0LGUpe3JldHVybiB0LnJlZHVjZShmdW5jdGlvbih0LG4pe3ZhciByPW4ud2lkdGgsbz0oMCxpLmRlZmF1bHQpKHIvZSk7cmV0dXJue1wizrhcIjp0Ls64K28scm90YXRpb25zOnQucm90YXRpb25zLmNvbmNhdChbdC7OuCtvLzJdKX19LHtcIs64XCI6MCxyb3RhdGlvbnM6W119KX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgcj0xODAvTWF0aC5QSTtlLmRlZmF1bHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQqcn19XSl9KTsiLCJcIm9iamVjdFwiPT10eXBlb2YgbmF2aWdhdG9yJiZmdW5jdGlvbihlLHQpe1wib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPXQoKTpcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFwiUGx5clwiLHQpOihlPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6ZXx8c2VsZikuUGx5cj10KCl9KHRoaXMsKGZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZShlLHQsaSl7cmV0dXJuIHQgaW4gZT9PYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTppLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6ZVt0XT1pLGV9ZnVuY3Rpb24gdChlLHQpe2Zvcih2YXIgaT0wO2k8dC5sZW5ndGg7aSsrKXt2YXIgcz10W2ldO3MuZW51bWVyYWJsZT1zLmVudW1lcmFibGV8fCExLHMuY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIHMmJihzLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxzLmtleSxzKX19ZnVuY3Rpb24gaShlLHQsaSl7cmV0dXJuIHQgaW4gZT9PYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTppLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6ZVt0XT1pLGV9ZnVuY3Rpb24gcyhlLHQpe3ZhciBpPU9iamVjdC5rZXlzKGUpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7dCYmKHM9cy5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsdCkuZW51bWVyYWJsZX0pKSksaS5wdXNoLmFwcGx5KGkscyl9cmV0dXJuIGl9ZnVuY3Rpb24gbihlKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbdF0/YXJndW1lbnRzW3RdOnt9O3QlMj9zKE9iamVjdChuKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7aShlLHQsblt0XSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSk6cyhPYmplY3QobikpLmZvckVhY2goKGZ1bmN0aW9uKHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLHQpKX0pKX1yZXR1cm4gZX12YXIgYT17YWRkQ1NTOiEwLHRodW1iV2lkdGg6MTUsd2F0Y2g6ITB9O2Z1bmN0aW9uIGwoZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHQpKS5pbmNsdWRlcyh0aGlzKX0uY2FsbChlLHQpfXZhciBvPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lP2UuY29uc3RydWN0b3I6bnVsbH0scj1mdW5jdGlvbihlLHQpe3JldHVybiEhKGUmJnQmJmUgaW5zdGFuY2VvZiB0KX0sYz1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZX0saD1mdW5jdGlvbihlKXtyZXR1cm4gbyhlKT09PU9iamVjdH0sdT1mdW5jdGlvbihlKXtyZXR1cm4gbyhlKT09PVN0cmluZ30sZD1mdW5jdGlvbihlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKX0sbT1mdW5jdGlvbihlKXtyZXR1cm4gcihlLE5vZGVMaXN0KX0scD11LGc9ZCxmPW0sYj1mdW5jdGlvbihlKXtyZXR1cm4gcihlLEVsZW1lbnQpfSx5PWZ1bmN0aW9uKGUpe3JldHVybiByKGUsRXZlbnQpfSx2PWZ1bmN0aW9uKGUpe3JldHVybiBjKGUpfHwodShlKXx8ZChlKXx8bShlKSkmJiFlLmxlbmd0aHx8aChlKSYmIU9iamVjdC5rZXlzKGUpLmxlbmd0aH07ZnVuY3Rpb24gdyhlLHQpe2lmKDE+dCl7dmFyIGk9ZnVuY3Rpb24oZSl7dmFyIHQ9XCJcIi5jb25jYXQoZSkubWF0Y2goLyg/OlxcLihcXGQrKSk/KD86W2VFXShbKy1dP1xcZCspKT8kLyk7cmV0dXJuIHQ/TWF0aC5tYXgoMCwodFsxXT90WzFdLmxlbmd0aDowKS0odFsyXT8rdFsyXTowKSk6MH0odCk7cmV0dXJuIHBhcnNlRmxvYXQoZS50b0ZpeGVkKGkpKX1yZXR1cm4gTWF0aC5yb3VuZChlL3QpKnR9dmFyIFQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQsaSl7KGZ1bmN0aW9uKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX0pKHRoaXMsZSksYih0KT90aGlzLmVsZW1lbnQ9dDpwKHQpJiYodGhpcy5lbGVtZW50PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodCkpLGIodGhpcy5lbGVtZW50KSYmdih0aGlzLmVsZW1lbnQucmFuZ2VUb3VjaCkmJih0aGlzLmNvbmZpZz1uKHt9LGEse30saSksdGhpcy5pbml0KCkpfXJldHVybiBmdW5jdGlvbihlLGkscyl7aSYmdChlLnByb3RvdHlwZSxpKSxzJiZ0KGUscyl9KGUsW3trZXk6XCJpbml0XCIsdmFsdWU6ZnVuY3Rpb24oKXtlLmVuYWJsZWQmJih0aGlzLmNvbmZpZy5hZGRDU1MmJih0aGlzLmVsZW1lbnQuc3R5bGUudXNlclNlbGVjdD1cIm5vbmVcIix0aGlzLmVsZW1lbnQuc3R5bGUud2ViS2l0VXNlclNlbGVjdD1cIm5vbmVcIix0aGlzLmVsZW1lbnQuc3R5bGUudG91Y2hBY3Rpb249XCJtYW5pcHVsYXRpb25cIiksdGhpcy5saXN0ZW5lcnMoITApLHRoaXMuZWxlbWVudC5yYW5nZVRvdWNoPXRoaXMpfX0se2tleTpcImRlc3Ryb3lcIix2YWx1ZTpmdW5jdGlvbigpe2UuZW5hYmxlZCYmKHRoaXMuY29uZmlnLmFkZENTUyYmKHRoaXMuZWxlbWVudC5zdHlsZS51c2VyU2VsZWN0PVwiXCIsdGhpcy5lbGVtZW50LnN0eWxlLndlYktpdFVzZXJTZWxlY3Q9XCJcIix0aGlzLmVsZW1lbnQuc3R5bGUudG91Y2hBY3Rpb249XCJcIiksdGhpcy5saXN0ZW5lcnMoITEpLHRoaXMuZWxlbWVudC5yYW5nZVRvdWNoPW51bGwpfX0se2tleTpcImxpc3RlbmVyc1wiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsaT1lP1wiYWRkRXZlbnRMaXN0ZW5lclwiOlwicmVtb3ZlRXZlbnRMaXN0ZW5lclwiO1tcInRvdWNoc3RhcnRcIixcInRvdWNobW92ZVwiLFwidG91Y2hlbmRcIl0uZm9yRWFjaCgoZnVuY3Rpb24oZSl7dC5lbGVtZW50W2ldKGUsKGZ1bmN0aW9uKGUpe3JldHVybiB0LnNldChlKX0pLCExKX0pKX19LHtrZXk6XCJnZXRcIix2YWx1ZTpmdW5jdGlvbih0KXtpZighZS5lbmFibGVkfHwheSh0KSlyZXR1cm4gbnVsbDt2YXIgaSxzPXQudGFyZ2V0LG49dC5jaGFuZ2VkVG91Y2hlc1swXSxhPXBhcnNlRmxvYXQocy5nZXRBdHRyaWJ1dGUoXCJtaW5cIikpfHwwLGw9cGFyc2VGbG9hdChzLmdldEF0dHJpYnV0ZShcIm1heFwiKSl8fDEwMCxvPXBhcnNlRmxvYXQocy5nZXRBdHRyaWJ1dGUoXCJzdGVwXCIpKXx8MSxyPXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0xMDAvci53aWR0aCoodGhpcy5jb25maWcudGh1bWJXaWR0aC8yKS8xMDA7cmV0dXJuIDA+KGk9MTAwL3Iud2lkdGgqKG4uY2xpZW50WC1yLmxlZnQpKT9pPTA6MTAwPGkmJihpPTEwMCksNTA+aT9pLT0oMTAwLTIqaSkqYzo1MDxpJiYoaSs9MiooaS01MCkqYyksYSt3KGkvMTAwKihsLWEpLG8pfX0se2tleTpcInNldFwiLHZhbHVlOmZ1bmN0aW9uKHQpe2UuZW5hYmxlZCYmeSh0KSYmIXQudGFyZ2V0LmRpc2FibGVkJiYodC5wcmV2ZW50RGVmYXVsdCgpLHQudGFyZ2V0LnZhbHVlPXRoaXMuZ2V0KHQpLGZ1bmN0aW9uKGUsdCl7aWYoZSYmdCl7dmFyIGk9bmV3IEV2ZW50KHQse2J1YmJsZXM6ITB9KTtlLmRpc3BhdGNoRXZlbnQoaSl9fSh0LnRhcmdldCxcInRvdWNoZW5kXCI9PT10LnR5cGU/XCJjaGFuZ2VcIjpcImlucHV0XCIpKX19XSxbe2tleTpcInNldHVwXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGk9MTxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9LHM9bnVsbDtpZih2KHQpfHxwKHQpP3M9QXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHAodCk/dDonaW5wdXRbdHlwZT1cInJhbmdlXCJdJykpOmIodCk/cz1bdF06Zih0KT9zPUFycmF5LmZyb20odCk6Zyh0KSYmKHM9dC5maWx0ZXIoYikpLHYocykpcmV0dXJuIG51bGw7dmFyIG89bih7fSxhLHt9LGkpO2lmKHAodCkmJm8ud2F0Y2gpe3ZhciByPW5ldyBNdXRhdGlvbk9ic2VydmVyKChmdW5jdGlvbihpKXtBcnJheS5mcm9tKGkpLmZvckVhY2goKGZ1bmN0aW9uKGkpe0FycmF5LmZyb20oaS5hZGRlZE5vZGVzKS5mb3JFYWNoKChmdW5jdGlvbihpKXtiKGkpJiZsKGksdCkmJm5ldyBlKGksbyl9KSl9KSl9KSk7ci5vYnNlcnZlKGRvY3VtZW50LmJvZHkse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSl9cmV0dXJuIHMubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCxpKX0pKX19LHtrZXk6XCJlbmFibGVkXCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuXCJvbnRvdWNoc3RhcnRcImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudH19XSksZX0oKTtjb25zdCBrPWU9Pm51bGwhPWU/ZS5jb25zdHJ1Y3RvcjpudWxsLEM9KGUsdCk9PkJvb2xlYW4oZSYmdCYmZSBpbnN0YW5jZW9mIHQpLEE9ZT0+bnVsbD09ZSxTPWU9PmsoZSk9PT1PYmplY3QsRT1lPT5rKGUpPT09U3RyaW5nLFA9ZT0+ayhlKT09PUZ1bmN0aW9uLE09ZT0+QXJyYXkuaXNBcnJheShlKSxOPWU9PkMoZSxOb2RlTGlzdCkseD1lPT5BKGUpfHwoRShlKXx8TShlKXx8TihlKSkmJiFlLmxlbmd0aHx8UyhlKSYmIU9iamVjdC5rZXlzKGUpLmxlbmd0aDt2YXIgST1BLEw9UywkPWU9PmsoZSk9PT1OdW1iZXImJiFOdW1iZXIuaXNOYU4oZSksXz1FLE89ZT0+ayhlKT09PUJvb2xlYW4saj1QLEQ9TSxxPU4sSD1lPT5udWxsIT09ZSYmXCJvYmplY3RcIj09dHlwZW9mIGUmJjE9PT1lLm5vZGVUeXBlJiZcIm9iamVjdFwiPT10eXBlb2YgZS5zdHlsZSYmXCJvYmplY3RcIj09dHlwZW9mIGUub3duZXJEb2N1bWVudCxSPWU9PkMoZSxFdmVudCksRj1lPT5DKGUsS2V5Ym9hcmRFdmVudCksVj1lPT5DKGUsVGV4dFRyYWNrKXx8IUEoZSkmJkUoZS5raW5kKSxCPWU9PkMoZSxQcm9taXNlKSYmUChlLnRoZW4pLFU9ZT0+e2lmKEMoZSx3aW5kb3cuVVJMKSlyZXR1cm4hMDtpZighRShlKSlyZXR1cm4hMTtsZXQgdD1lO2Uuc3RhcnRzV2l0aChcImh0dHA6Ly9cIikmJmUuc3RhcnRzV2l0aChcImh0dHBzOi8vXCIpfHwodD1gaHR0cDovLyR7ZX1gKTt0cnl7cmV0dXJuIXgobmV3IFVSTCh0KS5ob3N0bmFtZSl9Y2F0Y2goZSl7cmV0dXJuITF9fSxXPXg7Y29uc3Qgej0oKCk9Pntjb25zdCBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpLHQ9e1dlYmtpdFRyYW5zaXRpb246XCJ3ZWJraXRUcmFuc2l0aW9uRW5kXCIsTW96VHJhbnNpdGlvbjpcInRyYW5zaXRpb25lbmRcIixPVHJhbnNpdGlvbjpcIm9UcmFuc2l0aW9uRW5kIG90cmFuc2l0aW9uZW5kXCIsdHJhbnNpdGlvbjpcInRyYW5zaXRpb25lbmRcIn0saT1PYmplY3Qua2V5cyh0KS5maW5kKCh0PT52b2lkIDAhPT1lLnN0eWxlW3RdKSk7cmV0dXJuISFfKGkpJiZ0W2ldfSkoKTtmdW5jdGlvbiBLKGUsdCl7c2V0VGltZW91dCgoKCk9Pnt0cnl7ZS5oaWRkZW49ITAsZS5vZmZzZXRIZWlnaHQsZS5oaWRkZW49ITF9Y2F0Y2goZSl7fX0pLHQpfWNvbnN0IFk9e2lzSUU6Qm9vbGVhbih3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRNb2RlKSxpc0VkZ2U6d2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQuaW5jbHVkZXMoXCJFZGdlXCIpLGlzV2Via2l0OlwiV2Via2l0QXBwZWFyYW5jZVwiaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlJiYhL0VkZ2UvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksaXNJUGhvbmU6LyhpUGhvbmV8aVBvZCkvZ2kudGVzdChuYXZpZ2F0b3IucGxhdGZvcm0pLGlzSW9zOlwiTWFjSW50ZWxcIj09PW5hdmlnYXRvci5wbGF0Zm9ybSYmbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzPjF8fC8oaVBhZHxpUGhvbmV8aVBvZCkvZ2kudGVzdChuYXZpZ2F0b3IucGxhdGZvcm0pfTtmdW5jdGlvbiBRKGUsdCl7cmV0dXJuIHQuc3BsaXQoXCIuXCIpLnJlZHVjZSgoKGUsdCk9PmUmJmVbdF0pLGUpfWZ1bmN0aW9uIFgoZT17fSwuLi50KXtpZighdC5sZW5ndGgpcmV0dXJuIGU7Y29uc3QgaT10LnNoaWZ0KCk7cmV0dXJuIEwoaSk/KE9iamVjdC5rZXlzKGkpLmZvckVhY2goKHQ9PntMKGlbdF0pPyhPYmplY3Qua2V5cyhlKS5pbmNsdWRlcyh0KXx8T2JqZWN0LmFzc2lnbihlLHtbdF06e319KSxYKGVbdF0saVt0XSkpOk9iamVjdC5hc3NpZ24oZSx7W3RdOmlbdF19KX0pKSxYKGUsLi4udCkpOmV9ZnVuY3Rpb24gSihlLHQpe2NvbnN0IGk9ZS5sZW5ndGg/ZTpbZV07QXJyYXkuZnJvbShpKS5yZXZlcnNlKCkuZm9yRWFjaCgoKGUsaSk9Pntjb25zdCBzPWk+MD90LmNsb25lTm9kZSghMCk6dCxuPWUucGFyZW50Tm9kZSxhPWUubmV4dFNpYmxpbmc7cy5hcHBlbmRDaGlsZChlKSxhP24uaW5zZXJ0QmVmb3JlKHMsYSk6bi5hcHBlbmRDaGlsZChzKX0pKX1mdW5jdGlvbiBHKGUsdCl7SChlKSYmIVcodCkmJk9iamVjdC5lbnRyaWVzKHQpLmZpbHRlcigoKFssZV0pPT4hSShlKSkpLmZvckVhY2goKChbdCxpXSk9PmUuc2V0QXR0cmlidXRlKHQsaSkpKX1mdW5jdGlvbiBaKGUsdCxpKXtjb25zdCBzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZSk7cmV0dXJuIEwodCkmJkcocyx0KSxfKGkpJiYocy5pbm5lclRleHQ9aSksc31mdW5jdGlvbiBlZShlLHQsaSxzKXtIKHQpJiZ0LmFwcGVuZENoaWxkKFooZSxpLHMpKX1mdW5jdGlvbiB0ZShlKXtxKGUpfHxEKGUpP0FycmF5LmZyb20oZSkuZm9yRWFjaCh0ZSk6SChlKSYmSChlLnBhcmVudE5vZGUpJiZlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSl9ZnVuY3Rpb24gaWUoZSl7aWYoIUgoZSkpcmV0dXJuO2xldHtsZW5ndGg6dH09ZS5jaGlsZE5vZGVzO2Zvcig7dD4wOyllLnJlbW92ZUNoaWxkKGUubGFzdENoaWxkKSx0LT0xfWZ1bmN0aW9uIHNlKGUsdCl7cmV0dXJuIEgodCkmJkgodC5wYXJlbnROb2RlKSYmSChlKT8odC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChlLHQpLGUpOm51bGx9ZnVuY3Rpb24gbmUoZSx0KXtpZighXyhlKXx8VyhlKSlyZXR1cm57fTtjb25zdCBpPXt9LHM9WCh7fSx0KTtyZXR1cm4gZS5zcGxpdChcIixcIikuZm9yRWFjaCgoZT0+e2NvbnN0IHQ9ZS50cmltKCksbj10LnJlcGxhY2UoXCIuXCIsXCJcIiksYT10LnJlcGxhY2UoL1tbXFxdXS9nLFwiXCIpLnNwbGl0KFwiPVwiKSxbbF09YSxvPWEubGVuZ3RoPjE/YVsxXS5yZXBsYWNlKC9bXCInXS9nLFwiXCIpOlwiXCI7c3dpdGNoKHQuY2hhckF0KDApKXtjYXNlXCIuXCI6XyhzLmNsYXNzKT9pLmNsYXNzPWAke3MuY2xhc3N9ICR7bn1gOmkuY2xhc3M9bjticmVhaztjYXNlXCIjXCI6aS5pZD10LnJlcGxhY2UoXCIjXCIsXCJcIik7YnJlYWs7Y2FzZVwiW1wiOmlbbF09b319KSksWChzLGkpfWZ1bmN0aW9uIGFlKGUsdCl7aWYoIUgoZSkpcmV0dXJuO2xldCBpPXQ7TyhpKXx8KGk9IWUuaGlkZGVuKSxlLmhpZGRlbj1pfWZ1bmN0aW9uIGxlKGUsdCxpKXtpZihxKGUpKXJldHVybiBBcnJheS5mcm9tKGUpLm1hcCgoZT0+bGUoZSx0LGkpKSk7aWYoSChlKSl7bGV0IHM9XCJ0b2dnbGVcIjtyZXR1cm4gdm9pZCAwIT09aSYmKHM9aT9cImFkZFwiOlwicmVtb3ZlXCIpLGUuY2xhc3NMaXN0W3NdKHQpLGUuY2xhc3NMaXN0LmNvbnRhaW5zKHQpfXJldHVybiExfWZ1bmN0aW9uIG9lKGUsdCl7cmV0dXJuIEgoZSkmJmUuY2xhc3NMaXN0LmNvbnRhaW5zKHQpfWZ1bmN0aW9uIHJlKGUsdCl7Y29uc3R7cHJvdG90eXBlOml9PUVsZW1lbnQ7cmV0dXJuKGkubWF0Y2hlc3x8aS53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fGkubW96TWF0Y2hlc1NlbGVjdG9yfHxpLm1zTWF0Y2hlc1NlbGVjdG9yfHxmdW5jdGlvbigpe3JldHVybiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodCkpLmluY2x1ZGVzKHRoaXMpfSkuY2FsbChlLHQpfWZ1bmN0aW9uIGNlKGUpe3JldHVybiB0aGlzLmVsZW1lbnRzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKGUpfWZ1bmN0aW9uIGhlKGUpe3JldHVybiB0aGlzLmVsZW1lbnRzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGUpfWZ1bmN0aW9uIHVlKGU9bnVsbCx0PSExKXtIKGUpJiYoZS5mb2N1cyh7cHJldmVudFNjcm9sbDohMH0pLHQmJmxlKGUsdGhpcy5jb25maWcuY2xhc3NOYW1lcy50YWJGb2N1cykpfWNvbnN0IGRlPXtcImF1ZGlvL29nZ1wiOlwidm9yYmlzXCIsXCJhdWRpby93YXZcIjpcIjFcIixcInZpZGVvL3dlYm1cIjpcInZwOCwgdm9yYmlzXCIsXCJ2aWRlby9tcDRcIjpcImF2YzEuNDJFMDFFLCBtcDRhLjQwLjJcIixcInZpZGVvL29nZ1wiOlwidGhlb3JhXCJ9LG1lPXthdWRpbzpcImNhblBsYXlUeXBlXCJpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYXVkaW9cIiksdmlkZW86XCJjYW5QbGF5VHlwZVwiaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInZpZGVvXCIpLGNoZWNrKGUsdCxpKXtjb25zdCBzPVkuaXNJUGhvbmUmJmkmJm1lLnBsYXlzaW5saW5lLG49bWVbZV18fFwiaHRtbDVcIiE9PXQ7cmV0dXJue2FwaTpuLHVpOm4mJm1lLnJhbmdlSW5wdXQmJihcInZpZGVvXCIhPT1lfHwhWS5pc0lQaG9uZXx8cyl9fSxwaXA6IShZLmlzSVBob25lfHwhaihaKFwidmlkZW9cIikud2Via2l0U2V0UHJlc2VudGF0aW9uTW9kZSkmJighZG9jdW1lbnQucGljdHVyZUluUGljdHVyZUVuYWJsZWR8fFooXCJ2aWRlb1wiKS5kaXNhYmxlUGljdHVyZUluUGljdHVyZSkpLGFpcnBsYXk6aih3aW5kb3cuV2ViS2l0UGxheWJhY2tUYXJnZXRBdmFpbGFiaWxpdHlFdmVudCkscGxheXNpbmxpbmU6XCJwbGF5c0lubGluZVwiaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInZpZGVvXCIpLG1pbWUoZSl7aWYoVyhlKSlyZXR1cm4hMTtjb25zdFt0XT1lLnNwbGl0KFwiL1wiKTtsZXQgaT1lO2lmKCF0aGlzLmlzSFRNTDV8fHQhPT10aGlzLnR5cGUpcmV0dXJuITE7T2JqZWN0LmtleXMoZGUpLmluY2x1ZGVzKGkpJiYoaSs9YDsgY29kZWNzPVwiJHtkZVtlXX1cImApO3RyeXtyZXR1cm4gQm9vbGVhbihpJiZ0aGlzLm1lZGlhLmNhblBsYXlUeXBlKGkpLnJlcGxhY2UoL25vLyxcIlwiKSl9Y2F0Y2goZSl7cmV0dXJuITF9fSx0ZXh0VHJhY2tzOlwidGV4dFRyYWNrc1wiaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInZpZGVvXCIpLHJhbmdlSW5wdXQ6KCgpPT57Y29uc3QgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7cmV0dXJuIGUudHlwZT1cInJhbmdlXCIsXCJyYW5nZVwiPT09ZS50eXBlfSkoKSx0b3VjaDpcIm9udG91Y2hzdGFydFwiaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LHRyYW5zaXRpb25zOiExIT09eixyZWR1Y2VkTW90aW9uOlwibWF0Y2hNZWRpYVwiaW4gd2luZG93JiZ3aW5kb3cubWF0Y2hNZWRpYShcIihwcmVmZXJzLXJlZHVjZWQtbW90aW9uKVwiKS5tYXRjaGVzfSxwZT0oKCk9PntsZXQgZT0hMTt0cnl7Y29uc3QgdD1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sXCJwYXNzaXZlXCIse2dldDooKT0+KGU9ITAsbnVsbCl9KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInRlc3RcIixudWxsLHQpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwidGVzdFwiLG51bGwsdCl9Y2F0Y2goZSl7fXJldHVybiBlfSkoKTtmdW5jdGlvbiBnZShlLHQsaSxzPSExLG49ITAsYT0hMSl7aWYoIWV8fCEoXCJhZGRFdmVudExpc3RlbmVyXCJpbiBlKXx8Vyh0KXx8IWooaSkpcmV0dXJuO2NvbnN0IGw9dC5zcGxpdChcIiBcIik7bGV0IG89YTtwZSYmKG89e3Bhc3NpdmU6bixjYXB0dXJlOmF9KSxsLmZvckVhY2goKHQ9Pnt0aGlzJiZ0aGlzLmV2ZW50TGlzdGVuZXJzJiZzJiZ0aGlzLmV2ZW50TGlzdGVuZXJzLnB1c2goe2VsZW1lbnQ6ZSx0eXBlOnQsY2FsbGJhY2s6aSxvcHRpb25zOm99KSxlW3M/XCJhZGRFdmVudExpc3RlbmVyXCI6XCJyZW1vdmVFdmVudExpc3RlbmVyXCJdKHQsaSxvKX0pKX1mdW5jdGlvbiBmZShlLHQ9XCJcIixpLHM9ITAsbj0hMSl7Z2UuY2FsbCh0aGlzLGUsdCxpLCEwLHMsbil9ZnVuY3Rpb24gYmUoZSx0PVwiXCIsaSxzPSEwLG49ITEpe2dlLmNhbGwodGhpcyxlLHQsaSwhMSxzLG4pfWZ1bmN0aW9uIHllKGUsdD1cIlwiLGkscz0hMCxuPSExKXtjb25zdCBhPSguLi5sKT0+e2JlKGUsdCxhLHMsbiksaS5hcHBseSh0aGlzLGwpfTtnZS5jYWxsKHRoaXMsZSx0LGEsITAscyxuKX1mdW5jdGlvbiB2ZShlLHQ9XCJcIixpPSExLHM9e30pe2lmKCFIKGUpfHxXKHQpKXJldHVybjtjb25zdCBuPW5ldyBDdXN0b21FdmVudCh0LHtidWJibGVzOmksZGV0YWlsOnsuLi5zLHBseXI6dGhpc319KTtlLmRpc3BhdGNoRXZlbnQobil9ZnVuY3Rpb24gd2UoKXt0aGlzJiZ0aGlzLmV2ZW50TGlzdGVuZXJzJiYodGhpcy5ldmVudExpc3RlbmVycy5mb3JFYWNoKChlPT57Y29uc3R7ZWxlbWVudDp0LHR5cGU6aSxjYWxsYmFjazpzLG9wdGlvbnM6bn09ZTt0LnJlbW92ZUV2ZW50TGlzdGVuZXIoaSxzLG4pfSkpLHRoaXMuZXZlbnRMaXN0ZW5lcnM9W10pfWZ1bmN0aW9uIFRlKCl7cmV0dXJuIG5ldyBQcm9taXNlKChlPT50aGlzLnJlYWR5P3NldFRpbWVvdXQoZSwwKTpmZS5jYWxsKHRoaXMsdGhpcy5lbGVtZW50cy5jb250YWluZXIsXCJyZWFkeVwiLGUpKSkudGhlbigoKCk9Pnt9KSl9ZnVuY3Rpb24ga2UoZSl7QihlKSYmZS50aGVuKG51bGwsKCgpPT57fSkpfWZ1bmN0aW9uIENlKGUpe3JldHVybiBEKGUpP2UuZmlsdGVyKCgodCxpKT0+ZS5pbmRleE9mKHQpPT09aSkpOmV9ZnVuY3Rpb24gQWUoZSx0KXtyZXR1cm4gRChlKSYmZS5sZW5ndGg/ZS5yZWR1Y2UoKChlLGkpPT5NYXRoLmFicyhpLXQpPE1hdGguYWJzKGUtdCk/aTplKSk6bnVsbH1mdW5jdGlvbiBTZShlKXtyZXR1cm4hKCF3aW5kb3d8fCF3aW5kb3cuQ1NTKSYmd2luZG93LkNTUy5zdXBwb3J0cyhlKX1jb25zdCBFZT1bWzEsMV0sWzQsM10sWzMsNF0sWzUsNF0sWzQsNV0sWzMsMl0sWzIsM10sWzE2LDEwXSxbMTAsMTZdLFsxNiw5XSxbOSwxNl0sWzIxLDldLFs5LDIxXSxbMzIsOV0sWzksMzJdXS5yZWR1Y2UoKChlLFt0LGldKT0+KHsuLi5lLFt0L2ldOlt0LGldfSkpLHt9KTtmdW5jdGlvbiBQZShlKXtpZighKEQoZSl8fF8oZSkmJmUuaW5jbHVkZXMoXCI6XCIpKSlyZXR1cm4hMTtyZXR1cm4oRChlKT9lOmUuc3BsaXQoXCI6XCIpKS5tYXAoTnVtYmVyKS5ldmVyeSgkKX1mdW5jdGlvbiBNZShlKXtpZighRChlKXx8IWUuZXZlcnkoJCkpcmV0dXJuIG51bGw7Y29uc3RbdCxpXT1lLHM9KGUsdCk9PjA9PT10P2U6cyh0LGUldCksbj1zKHQsaSk7cmV0dXJuW3QvbixpL25dfWZ1bmN0aW9uIE5lKGUpe2NvbnN0IHQ9ZT0+UGUoZSk/ZS5zcGxpdChcIjpcIikubWFwKE51bWJlcik6bnVsbDtsZXQgaT10KGUpO2lmKG51bGw9PT1pJiYoaT10KHRoaXMuY29uZmlnLnJhdGlvKSksbnVsbD09PWkmJiFXKHRoaXMuZW1iZWQpJiZEKHRoaXMuZW1iZWQucmF0aW8pJiYoe3JhdGlvOml9PXRoaXMuZW1iZWQpLG51bGw9PT1pJiZ0aGlzLmlzSFRNTDUpe2NvbnN0e3ZpZGVvV2lkdGg6ZSx2aWRlb0hlaWdodDp0fT10aGlzLm1lZGlhO2k9W2UsdF19cmV0dXJuIE1lKGkpfWZ1bmN0aW9uIHhlKGUpe2lmKCF0aGlzLmlzVmlkZW8pcmV0dXJue307Y29uc3R7d3JhcHBlcjp0fT10aGlzLmVsZW1lbnRzLGk9TmUuY2FsbCh0aGlzLGUpO2lmKCFEKGkpKXJldHVybnt9O2NvbnN0W3Msbl09TWUoaSksYT0xMDAvcypuO2lmKFNlKGBhc3BlY3QtcmF0aW86ICR7c30vJHtufWApP3Quc3R5bGUuYXNwZWN0UmF0aW89YCR7c30vJHtufWA6dC5zdHlsZS5wYWRkaW5nQm90dG9tPWAke2F9JWAsdGhpcy5pc1ZpbWVvJiYhdGhpcy5jb25maWcudmltZW8ucHJlbWl1bSYmdGhpcy5zdXBwb3J0ZWQudWkpe2NvbnN0IGU9MTAwL3RoaXMubWVkaWEub2Zmc2V0V2lkdGgqcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5tZWRpYSkucGFkZGluZ0JvdHRvbSwxMCksaT0oZS1hKS8oZS81MCk7dGhpcy5mdWxsc2NyZWVuLmFjdGl2ZT90LnN0eWxlLnBhZGRpbmdCb3R0b209bnVsbDp0aGlzLm1lZGlhLnN0eWxlLnRyYW5zZm9ybT1gdHJhbnNsYXRlWSgtJHtpfSUpYH1lbHNlIHRoaXMuaXNIVE1MNSYmdC5jbGFzc0xpc3QuYWRkKHRoaXMuY29uZmlnLmNsYXNzTmFtZXMudmlkZW9GaXhlZFJhdGlvKTtyZXR1cm57cGFkZGluZzphLHJhdGlvOml9fWZ1bmN0aW9uIEllKGUsdCxpPS4wNSl7Y29uc3Qgcz1lL3Qsbj1BZShPYmplY3Qua2V5cyhFZSkscyk7cmV0dXJuIE1hdGguYWJzKG4tcyk8PWk/RWVbbl06W2UsdF19Y29uc3QgTGU9e2dldFNvdXJjZXMoKXtpZighdGhpcy5pc0hUTUw1KXJldHVybltdO3JldHVybiBBcnJheS5mcm9tKHRoaXMubWVkaWEucXVlcnlTZWxlY3RvckFsbChcInNvdXJjZVwiKSkuZmlsdGVyKChlPT57Y29uc3QgdD1lLmdldEF0dHJpYnV0ZShcInR5cGVcIik7cmV0dXJuISFXKHQpfHxtZS5taW1lLmNhbGwodGhpcyx0KX0pKX0sZ2V0UXVhbGl0eU9wdGlvbnMoKXtyZXR1cm4gdGhpcy5jb25maWcucXVhbGl0eS5mb3JjZWQ/dGhpcy5jb25maWcucXVhbGl0eS5vcHRpb25zOkxlLmdldFNvdXJjZXMuY2FsbCh0aGlzKS5tYXAoKGU9Pk51bWJlcihlLmdldEF0dHJpYnV0ZShcInNpemVcIikpKSkuZmlsdGVyKEJvb2xlYW4pfSxzZXR1cCgpe2lmKCF0aGlzLmlzSFRNTDUpcmV0dXJuO2NvbnN0IGU9dGhpcztlLm9wdGlvbnMuc3BlZWQ9ZS5jb25maWcuc3BlZWQub3B0aW9ucyxXKHRoaXMuY29uZmlnLnJhdGlvKXx8eGUuY2FsbChlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5tZWRpYSxcInF1YWxpdHlcIix7Z2V0KCl7Y29uc3QgdD1MZS5nZXRTb3VyY2VzLmNhbGwoZSkuZmluZCgodD0+dC5nZXRBdHRyaWJ1dGUoXCJzcmNcIik9PT1lLnNvdXJjZSkpO3JldHVybiB0JiZOdW1iZXIodC5nZXRBdHRyaWJ1dGUoXCJzaXplXCIpKX0sc2V0KHQpe2lmKGUucXVhbGl0eSE9PXQpe2lmKGUuY29uZmlnLnF1YWxpdHkuZm9yY2VkJiZqKGUuY29uZmlnLnF1YWxpdHkub25DaGFuZ2UpKWUuY29uZmlnLnF1YWxpdHkub25DaGFuZ2UodCk7ZWxzZXtjb25zdCBpPUxlLmdldFNvdXJjZXMuY2FsbChlKS5maW5kKChlPT5OdW1iZXIoZS5nZXRBdHRyaWJ1dGUoXCJzaXplXCIpKT09PXQpKTtpZighaSlyZXR1cm47Y29uc3R7Y3VycmVudFRpbWU6cyxwYXVzZWQ6bixwcmVsb2FkOmEscmVhZHlTdGF0ZTpsLHBsYXliYWNrUmF0ZTpvfT1lLm1lZGlhO2UubWVkaWEuc3JjPWkuZ2V0QXR0cmlidXRlKFwic3JjXCIpLChcIm5vbmVcIiE9PWF8fGwpJiYoZS5vbmNlKFwibG9hZGVkbWV0YWRhdGFcIiwoKCk9PntlLnNwZWVkPW8sZS5jdXJyZW50VGltZT1zLG58fGtlKGUucGxheSgpKX0pKSxlLm1lZGlhLmxvYWQoKSl9dmUuY2FsbChlLGUubWVkaWEsXCJxdWFsaXR5Y2hhbmdlXCIsITEse3F1YWxpdHk6dH0pfX19KX0sY2FuY2VsUmVxdWVzdHMoKXt0aGlzLmlzSFRNTDUmJih0ZShMZS5nZXRTb3VyY2VzLmNhbGwodGhpcykpLHRoaXMubWVkaWEuc2V0QXR0cmlidXRlKFwic3JjXCIsdGhpcy5jb25maWcuYmxhbmtWaWRlbyksdGhpcy5tZWRpYS5sb2FkKCksdGhpcy5kZWJ1Zy5sb2coXCJDYW5jZWxsZWQgbmV0d29yayByZXF1ZXN0c1wiKSl9fTtmdW5jdGlvbiAkZShlLC4uLnQpe3JldHVybiBXKGUpP2U6ZS50b1N0cmluZygpLnJlcGxhY2UoL3soXFxkKyl9L2csKChlLGkpPT50W2ldLnRvU3RyaW5nKCkpKX1jb25zdCBfZT0oZT1cIlwiLHQ9XCJcIixpPVwiXCIpPT5lLnJlcGxhY2UobmV3IFJlZ0V4cCh0LnRvU3RyaW5nKCkucmVwbGFjZSgvKFsuKis/Xj0hOiR7fSgpfFtcXF0vXFxcXF0pL2csXCJcXFxcJDFcIiksXCJnXCIpLGkudG9TdHJpbmcoKSksT2U9KGU9XCJcIik9PmUudG9TdHJpbmcoKS5yZXBsYWNlKC9cXHdcXFMqL2csKGU9PmUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKS50b0xvd2VyQ2FzZSgpKSk7ZnVuY3Rpb24gamUoZT1cIlwiKXtsZXQgdD1lLnRvU3RyaW5nKCk7cmV0dXJuIHQ9ZnVuY3Rpb24oZT1cIlwiKXtsZXQgdD1lLnRvU3RyaW5nKCk7cmV0dXJuIHQ9X2UodCxcIi1cIixcIiBcIiksdD1fZSh0LFwiX1wiLFwiIFwiKSx0PU9lKHQpLF9lKHQsXCIgXCIsXCJcIil9KHQpLHQuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkrdC5zbGljZSgxKX1mdW5jdGlvbiBEZShlKXtjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7cmV0dXJuIHQuYXBwZW5kQ2hpbGQoZSksdC5pbm5lckhUTUx9Y29uc3QgcWU9e3BpcDpcIlBJUFwiLGFpcnBsYXk6XCJBaXJQbGF5XCIsaHRtbDU6XCJIVE1MNVwiLHZpbWVvOlwiVmltZW9cIix5b3V0dWJlOlwiWW91VHViZVwifSxIZT17Z2V0KGU9XCJcIix0PXt9KXtpZihXKGUpfHxXKHQpKXJldHVyblwiXCI7bGV0IGk9USh0LmkxOG4sZSk7aWYoVyhpKSlyZXR1cm4gT2JqZWN0LmtleXMocWUpLmluY2x1ZGVzKGUpP3FlW2VdOlwiXCI7Y29uc3Qgcz17XCJ7c2Vla3RpbWV9XCI6dC5zZWVrVGltZSxcInt0aXRsZX1cIjp0LnRpdGxlfTtyZXR1cm4gT2JqZWN0LmVudHJpZXMocykuZm9yRWFjaCgoKFtlLHRdKT0+e2k9X2UoaSxlLHQpfSkpLGl9fTtjbGFzcyBSZXtjb25zdHJ1Y3Rvcih0KXtlKHRoaXMsXCJnZXRcIiwoZT0+e2lmKCFSZS5zdXBwb3J0ZWR8fCF0aGlzLmVuYWJsZWQpcmV0dXJuIG51bGw7Y29uc3QgdD13aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5rZXkpO2lmKFcodCkpcmV0dXJuIG51bGw7Y29uc3QgaT1KU09OLnBhcnNlKHQpO3JldHVybiBfKGUpJiZlLmxlbmd0aD9pW2VdOml9KSksZSh0aGlzLFwic2V0XCIsKGU9PntpZighUmUuc3VwcG9ydGVkfHwhdGhpcy5lbmFibGVkKXJldHVybjtpZighTChlKSlyZXR1cm47bGV0IHQ9dGhpcy5nZXQoKTtXKHQpJiYodD17fSksWCh0LGUpO3RyeXt3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5rZXksSlNPTi5zdHJpbmdpZnkodCkpfWNhdGNoKGUpe319KSksdGhpcy5lbmFibGVkPXQuY29uZmlnLnN0b3JhZ2UuZW5hYmxlZCx0aGlzLmtleT10LmNvbmZpZy5zdG9yYWdlLmtleX1zdGF0aWMgZ2V0IHN1cHBvcnRlZCgpe3RyeXtpZighKFwibG9jYWxTdG9yYWdlXCJpbiB3aW5kb3cpKXJldHVybiExO2NvbnN0IGU9XCJfX190ZXN0XCI7cmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShlLGUpLHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShlKSwhMH1jYXRjaChlKXtyZXR1cm4hMX19fWZ1bmN0aW9uIEZlKGUsdD1cInRleHRcIil7cmV0dXJuIG5ldyBQcm9taXNlKCgoaSxzKT0+e3RyeXtjb25zdCBzPW5ldyBYTUxIdHRwUmVxdWVzdDtpZighKFwid2l0aENyZWRlbnRpYWxzXCJpbiBzKSlyZXR1cm47cy5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLCgoKT0+e2lmKFwidGV4dFwiPT09dCl0cnl7aShKU09OLnBhcnNlKHMucmVzcG9uc2VUZXh0KSl9Y2F0Y2goZSl7aShzLnJlc3BvbnNlVGV4dCl9ZWxzZSBpKHMucmVzcG9uc2UpfSkpLHMuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsKCgpPT57dGhyb3cgbmV3IEVycm9yKHMuc3RhdHVzKX0pKSxzLm9wZW4oXCJHRVRcIixlLCEwKSxzLnJlc3BvbnNlVHlwZT10LHMuc2VuZCgpfWNhdGNoKGUpe3MoZSl9fSkpfWZ1bmN0aW9uIFZlKGUsdCl7aWYoIV8oZSkpcmV0dXJuO2NvbnN0IGk9Xyh0KTtsZXQgcz0hMTtjb25zdCBuPSgpPT5udWxsIT09ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodCksYT0oZSx0KT0+e2UuaW5uZXJIVE1MPXQsaSYmbigpfHxkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50RWxlbWVudChcImFmdGVyYmVnaW5cIixlKX07aWYoIWl8fCFuKCkpe2NvbnN0IG49UmUuc3VwcG9ydGVkLGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtpZihsLnNldEF0dHJpYnV0ZShcImhpZGRlblwiLFwiXCIpLGkmJmwuc2V0QXR0cmlidXRlKFwiaWRcIix0KSxuKXtjb25zdCBlPXdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShgY2FjaGUtJHt0fWApO2lmKHM9bnVsbCE9PWUscyl7Y29uc3QgdD1KU09OLnBhcnNlKGUpO2EobCx0LmNvbnRlbnQpfX1GZShlKS50aGVuKChlPT57aWYoIVcoZSkpe2lmKG4pdHJ5e3dpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShgY2FjaGUtJHt0fWAsSlNPTi5zdHJpbmdpZnkoe2NvbnRlbnQ6ZX0pKX1jYXRjaChlKXt9YShsLGUpfX0pKS5jYXRjaCgoKCk9Pnt9KSl9fWNvbnN0IEJlPWU9Pk1hdGgudHJ1bmMoZS82MC82MCU2MCwxMCk7ZnVuY3Rpb24gVWUoZT0wLHQ9ITEsaT0hMSl7aWYoISQoZSkpcmV0dXJuIFVlKHZvaWQgMCx0LGkpO2NvbnN0IHM9ZT0+YDAke2V9YC5zbGljZSgtMik7bGV0IG49QmUoZSk7Y29uc3QgYT0obD1lLE1hdGgudHJ1bmMobC82MCU2MCwxMCkpO3ZhciBsO2NvbnN0IG89KGU9Pk1hdGgudHJ1bmMoZSU2MCwxMCkpKGUpO3JldHVybiBuPXR8fG4+MD9gJHtufTpgOlwiXCIsYCR7aSYmZT4wP1wiLVwiOlwiXCJ9JHtufSR7cyhhKX06JHtzKG8pfWB9Y29uc3QgV2U9e2dldEljb25VcmwoKXtjb25zdCBlPW5ldyBVUkwodGhpcy5jb25maWcuaWNvblVybCx3aW5kb3cubG9jYXRpb24pLHQ9d2luZG93LmxvY2F0aW9uLmhvc3Q/d2luZG93LmxvY2F0aW9uLmhvc3Q6d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGk9ZS5ob3N0IT09dHx8WS5pc0lFJiYhd2luZG93LnN2ZzRldmVyeWJvZHk7cmV0dXJue3VybDp0aGlzLmNvbmZpZy5pY29uVXJsLGNvcnM6aX19LGZpbmRFbGVtZW50cygpe3RyeXtyZXR1cm4gdGhpcy5lbGVtZW50cy5jb250cm9scz1oZS5jYWxsKHRoaXMsdGhpcy5jb25maWcuc2VsZWN0b3JzLmNvbnRyb2xzLndyYXBwZXIpLHRoaXMuZWxlbWVudHMuYnV0dG9ucz17cGxheTpjZS5jYWxsKHRoaXMsdGhpcy5jb25maWcuc2VsZWN0b3JzLmJ1dHRvbnMucGxheSkscGF1c2U6aGUuY2FsbCh0aGlzLHRoaXMuY29uZmlnLnNlbGVjdG9ycy5idXR0b25zLnBhdXNlKSxyZXN0YXJ0OmhlLmNhbGwodGhpcyx0aGlzLmNvbmZpZy5zZWxlY3RvcnMuYnV0dG9ucy5yZXN0YXJ0KSxyZXdpbmQ6aGUuY2FsbCh0aGlzLHRoaXMuY29uZmlnLnNlbGVjdG9ycy5idXR0b25zLnJld2luZCksZmFzdEZvcndhcmQ6aGUuY2FsbCh0aGlzLHRoaXMuY29uZmlnLnNlbGVjdG9ycy5idXR0b25zLmZhc3RGb3J3YXJkKSxtdXRlOmhlLmNhbGwodGhpcyx0aGlzLmNvbmZpZy5zZWxlY3RvcnMuYnV0dG9ucy5tdXRlKSxwaXA6aGUuY2FsbCh0aGlzLHRoaXMuY29uZmlnLnNlbGVjdG9ycy5idXR0b25zLnBpcCksYWlycGxheTpoZS5jYWxsKHRoaXMsdGhpcy5jb25maWcuc2VsZWN0b3JzLmJ1dHRvbnMuYWlycGxheSksc2V0dGluZ3M6aGUuY2FsbCh0aGlzLHRoaXMuY29uZmlnLnNlbGVjdG9ycy5idXR0b25zLnNldHRpbmdzKSxjYXB0aW9uczpoZS5jYWxsKHRoaXMsdGhpcy5jb25maWcuc2VsZWN0b3JzLmJ1dHRvbnMuY2FwdGlvbnMpLGZ1bGxzY3JlZW46aGUuY2FsbCh0aGlzLHRoaXMuY29uZmlnLnNlbGVjdG9ycy5idXR0b25zLmZ1bGxzY3JlZW4pfSx0aGlzLmVsZW1lbnRzLnByb2dyZXNzPWhlLmNhbGwodGhpcyx0aGlzLmNvbmZpZy5zZWxlY3RvcnMucHJvZ3Jlc3MpLHRoaXMuZWxlbWVudHMuaW5wdXRzPXtzZWVrOmhlLmNhbGwodGhpcyx0aGlzLmNvbmZpZy5zZWxlY3RvcnMuaW5wdXRzLnNlZWspLHZvbHVtZTpoZS5jYWxsKHRoaXMsdGhpcy5jb25maWcuc2VsZWN0b3JzLmlucHV0cy52b2x1bWUpfSx0aGlzLmVsZW1lbnRzLmRpc3BsYXk9e2J1ZmZlcjpoZS5jYWxsKHRoaXMsdGhpcy5jb25maWcuc2VsZWN0b3JzLmRpc3BsYXkuYnVmZmVyKSxjdXJyZW50VGltZTpoZS5jYWxsKHRoaXMsdGhpcy5jb25maWcuc2VsZWN0b3JzLmRpc3BsYXkuY3VycmVudFRpbWUpLGR1cmF0aW9uOmhlLmNhbGwodGhpcyx0aGlzLmNvbmZpZy5zZWxlY3RvcnMuZGlzcGxheS5kdXJhdGlvbil9LEgodGhpcy5lbGVtZW50cy5wcm9ncmVzcykmJih0aGlzLmVsZW1lbnRzLmRpc3BsYXkuc2Vla1Rvb2x0aXA9dGhpcy5lbGVtZW50cy5wcm9ncmVzcy5xdWVyeVNlbGVjdG9yKGAuJHt0aGlzLmNvbmZpZy5jbGFzc05hbWVzLnRvb2x0aXB9YCkpLCEwfWNhdGNoKGUpe3JldHVybiB0aGlzLmRlYnVnLndhcm4oXCJJdCBsb29rcyBsaWtlIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHlvdXIgY3VzdG9tIGNvbnRyb2xzIEhUTUxcIixlKSx0aGlzLnRvZ2dsZU5hdGl2ZUNvbnRyb2xzKCEwKSwhMX19LGNyZWF0ZUljb24oZSx0KXtjb25zdCBpPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixzPVdlLmdldEljb25VcmwuY2FsbCh0aGlzKSxuPWAke3MuY29ycz9cIlwiOnMudXJsfSMke3RoaXMuY29uZmlnLmljb25QcmVmaXh9YCxhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhpLFwic3ZnXCIpO0coYSxYKHQse1wiYXJpYS1oaWRkZW5cIjpcInRydWVcIixmb2N1c2FibGU6XCJmYWxzZVwifSkpO2NvbnN0IGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGksXCJ1c2VcIiksbz1gJHtufS0ke2V9YDtyZXR1cm5cImhyZWZcImluIGwmJmwuc2V0QXR0cmlidXRlTlMoXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIsXCJocmVmXCIsbyksbC5zZXRBdHRyaWJ1dGVOUyhcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIixcInhsaW5rOmhyZWZcIixvKSxhLmFwcGVuZENoaWxkKGwpLGF9LGNyZWF0ZUxhYmVsKGUsdD17fSl7Y29uc3QgaT1IZS5nZXQoZSx0aGlzLmNvbmZpZyk7cmV0dXJuIFooXCJzcGFuXCIsey4uLnQsY2xhc3M6W3QuY2xhc3MsdGhpcy5jb25maWcuY2xhc3NOYW1lcy5oaWRkZW5dLmZpbHRlcihCb29sZWFuKS5qb2luKFwiIFwiKX0saSl9LGNyZWF0ZUJhZGdlKGUpe2lmKFcoZSkpcmV0dXJuIG51bGw7Y29uc3QgdD1aKFwic3BhblwiLHtjbGFzczp0aGlzLmNvbmZpZy5jbGFzc05hbWVzLm1lbnUudmFsdWV9KTtyZXR1cm4gdC5hcHBlbmRDaGlsZChaKFwic3BhblwiLHtjbGFzczp0aGlzLmNvbmZpZy5jbGFzc05hbWVzLm1lbnUuYmFkZ2V9LGUpKSx0fSxjcmVhdGVCdXR0b24oZSx0KXtjb25zdCBpPVgoe30sdCk7bGV0IHM9amUoZSk7Y29uc3Qgbj17ZWxlbWVudDpcImJ1dHRvblwiLHRvZ2dsZTohMSxsYWJlbDpudWxsLGljb246bnVsbCxsYWJlbFByZXNzZWQ6bnVsbCxpY29uUHJlc3NlZDpudWxsfTtzd2l0Y2goW1wiZWxlbWVudFwiLFwiaWNvblwiLFwibGFiZWxcIl0uZm9yRWFjaCgoZT0+e09iamVjdC5rZXlzKGkpLmluY2x1ZGVzKGUpJiYobltlXT1pW2VdLGRlbGV0ZSBpW2VdKX0pKSxcImJ1dHRvblwiIT09bi5lbGVtZW50fHxPYmplY3Qua2V5cyhpKS5pbmNsdWRlcyhcInR5cGVcIil8fChpLnR5cGU9XCJidXR0b25cIiksT2JqZWN0LmtleXMoaSkuaW5jbHVkZXMoXCJjbGFzc1wiKT9pLmNsYXNzLnNwbGl0KFwiIFwiKS5zb21lKChlPT5lPT09dGhpcy5jb25maWcuY2xhc3NOYW1lcy5jb250cm9sKSl8fFgoaSx7Y2xhc3M6YCR7aS5jbGFzc30gJHt0aGlzLmNvbmZpZy5jbGFzc05hbWVzLmNvbnRyb2x9YH0pOmkuY2xhc3M9dGhpcy5jb25maWcuY2xhc3NOYW1lcy5jb250cm9sLGUpe2Nhc2VcInBsYXlcIjpuLnRvZ2dsZT0hMCxuLmxhYmVsPVwicGxheVwiLG4ubGFiZWxQcmVzc2VkPVwicGF1c2VcIixuLmljb249XCJwbGF5XCIsbi5pY29uUHJlc3NlZD1cInBhdXNlXCI7YnJlYWs7Y2FzZVwibXV0ZVwiOm4udG9nZ2xlPSEwLG4ubGFiZWw9XCJtdXRlXCIsbi5sYWJlbFByZXNzZWQ9XCJ1bm11dGVcIixuLmljb249XCJ2b2x1bWVcIixuLmljb25QcmVzc2VkPVwibXV0ZWRcIjticmVhaztjYXNlXCJjYXB0aW9uc1wiOm4udG9nZ2xlPSEwLG4ubGFiZWw9XCJlbmFibGVDYXB0aW9uc1wiLG4ubGFiZWxQcmVzc2VkPVwiZGlzYWJsZUNhcHRpb25zXCIsbi5pY29uPVwiY2FwdGlvbnMtb2ZmXCIsbi5pY29uUHJlc3NlZD1cImNhcHRpb25zLW9uXCI7YnJlYWs7Y2FzZVwiZnVsbHNjcmVlblwiOm4udG9nZ2xlPSEwLG4ubGFiZWw9XCJlbnRlckZ1bGxzY3JlZW5cIixuLmxhYmVsUHJlc3NlZD1cImV4aXRGdWxsc2NyZWVuXCIsbi5pY29uPVwiZW50ZXItZnVsbHNjcmVlblwiLG4uaWNvblByZXNzZWQ9XCJleGl0LWZ1bGxzY3JlZW5cIjticmVhaztjYXNlXCJwbGF5LWxhcmdlXCI6aS5jbGFzcys9YCAke3RoaXMuY29uZmlnLmNsYXNzTmFtZXMuY29udHJvbH0tLW92ZXJsYWlkYCxzPVwicGxheVwiLG4ubGFiZWw9XCJwbGF5XCIsbi5pY29uPVwicGxheVwiO2JyZWFrO2RlZmF1bHQ6VyhuLmxhYmVsKSYmKG4ubGFiZWw9cyksVyhuLmljb24pJiYobi5pY29uPWUpfWNvbnN0IGE9WihuLmVsZW1lbnQpO3JldHVybiBuLnRvZ2dsZT8oYS5hcHBlbmRDaGlsZChXZS5jcmVhdGVJY29uLmNhbGwodGhpcyxuLmljb25QcmVzc2VkLHtjbGFzczpcImljb24tLXByZXNzZWRcIn0pKSxhLmFwcGVuZENoaWxkKFdlLmNyZWF0ZUljb24uY2FsbCh0aGlzLG4uaWNvbix7Y2xhc3M6XCJpY29uLS1ub3QtcHJlc3NlZFwifSkpLGEuYXBwZW5kQ2hpbGQoV2UuY3JlYXRlTGFiZWwuY2FsbCh0aGlzLG4ubGFiZWxQcmVzc2VkLHtjbGFzczpcImxhYmVsLS1wcmVzc2VkXCJ9KSksYS5hcHBlbmRDaGlsZChXZS5jcmVhdGVMYWJlbC5jYWxsKHRoaXMsbi5sYWJlbCx7Y2xhc3M6XCJsYWJlbC0tbm90LXByZXNzZWRcIn0pKSk6KGEuYXBwZW5kQ2hpbGQoV2UuY3JlYXRlSWNvbi5jYWxsKHRoaXMsbi5pY29uKSksYS5hcHBlbmRDaGlsZChXZS5jcmVhdGVMYWJlbC5jYWxsKHRoaXMsbi5sYWJlbCkpKSxYKGksbmUodGhpcy5jb25maWcuc2VsZWN0b3JzLmJ1dHRvbnNbc10saSkpLEcoYSxpKSxcInBsYXlcIj09PXM/KEQodGhpcy5lbGVtZW50cy5idXR0b25zW3NdKXx8KHRoaXMuZWxlbWVudHMuYnV0dG9uc1tzXT1bXSksdGhpcy5lbGVtZW50cy5idXR0b25zW3NdLnB1c2goYSkpOnRoaXMuZWxlbWVudHMuYnV0dG9uc1tzXT1hLGF9LGNyZWF0ZVJhbmdlKGUsdCl7Y29uc3QgaT1aKFwiaW5wdXRcIixYKG5lKHRoaXMuY29uZmlnLnNlbGVjdG9ycy5pbnB1dHNbZV0pLHt0eXBlOlwicmFuZ2VcIixtaW46MCxtYXg6MTAwLHN0ZXA6LjAxLHZhbHVlOjAsYXV0b2NvbXBsZXRlOlwib2ZmXCIscm9sZTpcInNsaWRlclwiLFwiYXJpYS1sYWJlbFwiOkhlLmdldChlLHRoaXMuY29uZmlnKSxcImFyaWEtdmFsdWVtaW5cIjowLFwiYXJpYS12YWx1ZW1heFwiOjEwMCxcImFyaWEtdmFsdWVub3dcIjowfSx0KSk7cmV0dXJuIHRoaXMuZWxlbWVudHMuaW5wdXRzW2VdPWksV2UudXBkYXRlUmFuZ2VGaWxsLmNhbGwodGhpcyxpKSxULnNldHVwKGkpLGl9LGNyZWF0ZVByb2dyZXNzKGUsdCl7Y29uc3QgaT1aKFwicHJvZ3Jlc3NcIixYKG5lKHRoaXMuY29uZmlnLnNlbGVjdG9ycy5kaXNwbGF5W2VdKSx7bWluOjAsbWF4OjEwMCx2YWx1ZTowLHJvbGU6XCJwcm9ncmVzc2JhclwiLFwiYXJpYS1oaWRkZW5cIjohMH0sdCkpO2lmKFwidm9sdW1lXCIhPT1lKXtpLmFwcGVuZENoaWxkKFooXCJzcGFuXCIsbnVsbCxcIjBcIikpO2NvbnN0IHQ9e3BsYXllZDpcInBsYXllZFwiLGJ1ZmZlcjpcImJ1ZmZlcmVkXCJ9W2VdLHM9dD9IZS5nZXQodCx0aGlzLmNvbmZpZyk6XCJcIjtpLmlubmVyVGV4dD1gJSAke3MudG9Mb3dlckNhc2UoKX1gfXJldHVybiB0aGlzLmVsZW1lbnRzLmRpc3BsYXlbZV09aSxpfSxjcmVhdGVUaW1lKGUsdCl7Y29uc3QgaT1uZSh0aGlzLmNvbmZpZy5zZWxlY3RvcnMuZGlzcGxheVtlXSx0KSxzPVooXCJkaXZcIixYKGkse2NsYXNzOmAke2kuY2xhc3M/aS5jbGFzczpcIlwifSAke3RoaXMuY29uZmlnLmNsYXNzTmFtZXMuZGlzcGxheS50aW1lfSBgLnRyaW0oKSxcImFyaWEtbGFiZWxcIjpIZS5nZXQoZSx0aGlzLmNvbmZpZyl9KSxcIjAwOjAwXCIpO3JldHVybiB0aGlzLmVsZW1lbnRzLmRpc3BsYXlbZV09cyxzfSxiaW5kTWVudUl0ZW1TaG9ydGN1dHMoZSx0KXtmZS5jYWxsKHRoaXMsZSxcImtleWRvd24ga2V5dXBcIiwoaT0+e2lmKCFbXCJTcGFjZVwiLFwiQXJyb3dVcFwiLFwiQXJyb3dEb3duXCIsXCJBcnJvd1JpZ2h0XCJdLmluY2x1ZGVzKGkua2V5KSlyZXR1cm47aWYoaS5wcmV2ZW50RGVmYXVsdCgpLGkuc3RvcFByb3BhZ2F0aW9uKCksXCJrZXlkb3duXCI9PT1pLnR5cGUpcmV0dXJuO2NvbnN0IHM9cmUoZSwnW3JvbGU9XCJtZW51aXRlbXJhZGlvXCJdJyk7aWYoIXMmJltcIlNwYWNlXCIsXCJBcnJvd1JpZ2h0XCJdLmluY2x1ZGVzKGkua2V5KSlXZS5zaG93TWVudVBhbmVsLmNhbGwodGhpcyx0LCEwKTtlbHNle2xldCB0O1wiU3BhY2VcIiE9PWkua2V5JiYoXCJBcnJvd0Rvd25cIj09PWkua2V5fHxzJiZcIkFycm93UmlnaHRcIj09PWkua2V5Pyh0PWUubmV4dEVsZW1lbnRTaWJsaW5nLEgodCl8fCh0PWUucGFyZW50Tm9kZS5maXJzdEVsZW1lbnRDaGlsZCkpOih0PWUucHJldmlvdXNFbGVtZW50U2libGluZyxIKHQpfHwodD1lLnBhcmVudE5vZGUubGFzdEVsZW1lbnRDaGlsZCkpLHVlLmNhbGwodGhpcyx0LCEwKSl9fSksITEpLGZlLmNhbGwodGhpcyxlLFwia2V5dXBcIiwoZT0+e1wiUmV0dXJuXCI9PT1lLmtleSYmV2UuZm9jdXNGaXJzdE1lbnVJdGVtLmNhbGwodGhpcyxudWxsLCEwKX0pKX0sY3JlYXRlTWVudUl0ZW0oe3ZhbHVlOmUsbGlzdDp0LHR5cGU6aSx0aXRsZTpzLGJhZGdlOm49bnVsbCxjaGVja2VkOmE9ITF9KXtjb25zdCBsPW5lKHRoaXMuY29uZmlnLnNlbGVjdG9ycy5pbnB1dHNbaV0pLG89WihcImJ1dHRvblwiLFgobCx7dHlwZTpcImJ1dHRvblwiLHJvbGU6XCJtZW51aXRlbXJhZGlvXCIsY2xhc3M6YCR7dGhpcy5jb25maWcuY2xhc3NOYW1lcy5jb250cm9sfSAke2wuY2xhc3M/bC5jbGFzczpcIlwifWAudHJpbSgpLFwiYXJpYS1jaGVja2VkXCI6YSx2YWx1ZTplfSkpLHI9WihcInNwYW5cIik7ci5pbm5lckhUTUw9cyxIKG4pJiZyLmFwcGVuZENoaWxkKG4pLG8uYXBwZW5kQ2hpbGQociksT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sXCJjaGVja2VkXCIse2VudW1lcmFibGU6ITAsZ2V0OigpPT5cInRydWVcIj09PW8uZ2V0QXR0cmlidXRlKFwiYXJpYS1jaGVja2VkXCIpLHNldChlKXtlJiZBcnJheS5mcm9tKG8ucGFyZW50Tm9kZS5jaGlsZHJlbikuZmlsdGVyKChlPT5yZShlLCdbcm9sZT1cIm1lbnVpdGVtcmFkaW9cIl0nKSkpLmZvckVhY2goKGU9PmUuc2V0QXR0cmlidXRlKFwiYXJpYS1jaGVja2VkXCIsXCJmYWxzZVwiKSkpLG8uc2V0QXR0cmlidXRlKFwiYXJpYS1jaGVja2VkXCIsZT9cInRydWVcIjpcImZhbHNlXCIpfX0pLHRoaXMubGlzdGVuZXJzLmJpbmQobyxcImNsaWNrIGtleXVwXCIsKHQ9PntpZighRih0KXx8XCJTcGFjZVwiPT09dC5rZXkpe3N3aXRjaCh0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKSxvLmNoZWNrZWQ9ITAsaSl7Y2FzZVwibGFuZ3VhZ2VcIjp0aGlzLmN1cnJlbnRUcmFjaz1OdW1iZXIoZSk7YnJlYWs7Y2FzZVwicXVhbGl0eVwiOnRoaXMucXVhbGl0eT1lO2JyZWFrO2Nhc2VcInNwZWVkXCI6dGhpcy5zcGVlZD1wYXJzZUZsb2F0KGUpfVdlLnNob3dNZW51UGFuZWwuY2FsbCh0aGlzLFwiaG9tZVwiLEYodCkpfX0pLGksITEpLFdlLmJpbmRNZW51SXRlbVNob3J0Y3V0cy5jYWxsKHRoaXMsbyxpKSx0LmFwcGVuZENoaWxkKG8pfSxmb3JtYXRUaW1lKGU9MCx0PSExKXtpZighJChlKSlyZXR1cm4gZTtyZXR1cm4gVWUoZSxCZSh0aGlzLmR1cmF0aW9uKT4wLHQpfSx1cGRhdGVUaW1lRGlzcGxheShlPW51bGwsdD0wLGk9ITEpe0goZSkmJiQodCkmJihlLmlubmVyVGV4dD1XZS5mb3JtYXRUaW1lKHQsaSkpfSx1cGRhdGVWb2x1bWUoKXt0aGlzLnN1cHBvcnRlZC51aSYmKEgodGhpcy5lbGVtZW50cy5pbnB1dHMudm9sdW1lKSYmV2Uuc2V0UmFuZ2UuY2FsbCh0aGlzLHRoaXMuZWxlbWVudHMuaW5wdXRzLnZvbHVtZSx0aGlzLm11dGVkPzA6dGhpcy52b2x1bWUpLEgodGhpcy5lbGVtZW50cy5idXR0b25zLm11dGUpJiYodGhpcy5lbGVtZW50cy5idXR0b25zLm11dGUucHJlc3NlZD10aGlzLm11dGVkfHwwPT09dGhpcy52b2x1bWUpKX0sc2V0UmFuZ2UoZSx0PTApe0goZSkmJihlLnZhbHVlPXQsV2UudXBkYXRlUmFuZ2VGaWxsLmNhbGwodGhpcyxlKSl9LHVwZGF0ZVByb2dyZXNzKGUpe2lmKCF0aGlzLnN1cHBvcnRlZC51aXx8IVIoZSkpcmV0dXJuO2xldCB0PTA7Y29uc3QgaT0oZSx0KT0+e2NvbnN0IGk9JCh0KT90OjAscz1IKGUpP2U6dGhpcy5lbGVtZW50cy5kaXNwbGF5LmJ1ZmZlcjtpZihIKHMpKXtzLnZhbHVlPWk7Y29uc3QgZT1zLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwic3BhblwiKVswXTtIKGUpJiYoZS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZT1pKX19O2lmKGUpc3dpdGNoKGUudHlwZSl7Y2FzZVwidGltZXVwZGF0ZVwiOmNhc2VcInNlZWtpbmdcIjpjYXNlXCJzZWVrZWRcIjpzPXRoaXMuY3VycmVudFRpbWUsbj10aGlzLmR1cmF0aW9uLHQ9MD09PXN8fDA9PT1ufHxOdW1iZXIuaXNOYU4ocyl8fE51bWJlci5pc05hTihuKT8wOihzL24qMTAwKS50b0ZpeGVkKDIpLFwidGltZXVwZGF0ZVwiPT09ZS50eXBlJiZXZS5zZXRSYW5nZS5jYWxsKHRoaXMsdGhpcy5lbGVtZW50cy5pbnB1dHMuc2Vlayx0KTticmVhaztjYXNlXCJwbGF5aW5nXCI6Y2FzZVwicHJvZ3Jlc3NcIjppKHRoaXMuZWxlbWVudHMuZGlzcGxheS5idWZmZXIsMTAwKnRoaXMuYnVmZmVyZWQpfXZhciBzLG59LHVwZGF0ZVJhbmdlRmlsbChlKXtjb25zdCB0PVIoZSk/ZS50YXJnZXQ6ZTtpZihIKHQpJiZcInJhbmdlXCI9PT10LmdldEF0dHJpYnV0ZShcInR5cGVcIikpe2lmKHJlKHQsdGhpcy5jb25maWcuc2VsZWN0b3JzLmlucHV0cy5zZWVrKSl7dC5zZXRBdHRyaWJ1dGUoXCJhcmlhLXZhbHVlbm93XCIsdGhpcy5jdXJyZW50VGltZSk7Y29uc3QgZT1XZS5mb3JtYXRUaW1lKHRoaXMuY3VycmVudFRpbWUpLGk9V2UuZm9ybWF0VGltZSh0aGlzLmR1cmF0aW9uKSxzPUhlLmdldChcInNlZWtMYWJlbFwiLHRoaXMuY29uZmlnKTt0LnNldEF0dHJpYnV0ZShcImFyaWEtdmFsdWV0ZXh0XCIscy5yZXBsYWNlKFwie2N1cnJlbnRUaW1lfVwiLGUpLnJlcGxhY2UoXCJ7ZHVyYXRpb259XCIsaSkpfWVsc2UgaWYocmUodCx0aGlzLmNvbmZpZy5zZWxlY3RvcnMuaW5wdXRzLnZvbHVtZSkpe2NvbnN0IGU9MTAwKnQudmFsdWU7dC5zZXRBdHRyaWJ1dGUoXCJhcmlhLXZhbHVlbm93XCIsZSksdC5zZXRBdHRyaWJ1dGUoXCJhcmlhLXZhbHVldGV4dFwiLGAke2UudG9GaXhlZCgxKX0lYCl9ZWxzZSB0LnNldEF0dHJpYnV0ZShcImFyaWEtdmFsdWVub3dcIix0LnZhbHVlKTtZLmlzV2Via2l0JiZ0LnN0eWxlLnNldFByb3BlcnR5KFwiLS12YWx1ZVwiLHQudmFsdWUvdC5tYXgqMTAwK1wiJVwiKX19LHVwZGF0ZVNlZWtUb29sdGlwKGUpe3ZhciB0LGk7aWYoIXRoaXMuY29uZmlnLnRvb2x0aXBzLnNlZWt8fCFIKHRoaXMuZWxlbWVudHMuaW5wdXRzLnNlZWspfHwhSCh0aGlzLmVsZW1lbnRzLmRpc3BsYXkuc2Vla1Rvb2x0aXApfHwwPT09dGhpcy5kdXJhdGlvbilyZXR1cm47Y29uc3Qgcz10aGlzLmVsZW1lbnRzLmRpc3BsYXkuc2Vla1Rvb2x0aXAsbj1gJHt0aGlzLmNvbmZpZy5jbGFzc05hbWVzLnRvb2x0aXB9LS12aXNpYmxlYCxhPWU9PmxlKHMsbixlKTtpZih0aGlzLnRvdWNoKXJldHVybiB2b2lkIGEoITEpO2xldCBsPTA7Y29uc3Qgbz10aGlzLmVsZW1lbnRzLnByb2dyZXNzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKFIoZSkpbD0xMDAvby53aWR0aCooZS5wYWdlWC1vLmxlZnQpO2Vsc2V7aWYoIW9lKHMsbikpcmV0dXJuO2w9cGFyc2VGbG9hdChzLnN0eWxlLmxlZnQsMTApfWw8MD9sPTA6bD4xMDAmJihsPTEwMCk7Y29uc3Qgcj10aGlzLmR1cmF0aW9uLzEwMCpsO3MuaW5uZXJUZXh0PVdlLmZvcm1hdFRpbWUocik7Y29uc3QgYz1udWxsPT09KHQ9dGhpcy5jb25maWcubWFya2Vycyl8fHZvaWQgMD09PXR8fG51bGw9PT0oaT10LnBvaW50cyl8fHZvaWQgMD09PWk/dm9pZCAwOmkuZmluZCgoKHt0aW1lOmV9KT0+ZT09PU1hdGgucm91bmQocikpKTtjJiZzLmluc2VydEFkamFjZW50SFRNTChcImFmdGVyYmVnaW5cIixgJHtjLmxhYmVsfTxicj5gKSxzLnN0eWxlLmxlZnQ9YCR7bH0lYCxSKGUpJiZbXCJtb3VzZWVudGVyXCIsXCJtb3VzZWxlYXZlXCJdLmluY2x1ZGVzKGUudHlwZSkmJmEoXCJtb3VzZWVudGVyXCI9PT1lLnR5cGUpfSx0aW1lVXBkYXRlKGUpe2NvbnN0IHQ9IUgodGhpcy5lbGVtZW50cy5kaXNwbGF5LmR1cmF0aW9uKSYmdGhpcy5jb25maWcuaW52ZXJ0VGltZTtXZS51cGRhdGVUaW1lRGlzcGxheS5jYWxsKHRoaXMsdGhpcy5lbGVtZW50cy5kaXNwbGF5LmN1cnJlbnRUaW1lLHQ/dGhpcy5kdXJhdGlvbi10aGlzLmN1cnJlbnRUaW1lOnRoaXMuY3VycmVudFRpbWUsdCksZSYmXCJ0aW1ldXBkYXRlXCI9PT1lLnR5cGUmJnRoaXMubWVkaWEuc2Vla2luZ3x8V2UudXBkYXRlUHJvZ3Jlc3MuY2FsbCh0aGlzLGUpfSxkdXJhdGlvblVwZGF0ZSgpe2lmKCF0aGlzLnN1cHBvcnRlZC51aXx8IXRoaXMuY29uZmlnLmludmVydFRpbWUmJnRoaXMuY3VycmVudFRpbWUpcmV0dXJuO2lmKHRoaXMuZHVyYXRpb24+PTIqKjMyKXJldHVybiBhZSh0aGlzLmVsZW1lbnRzLmRpc3BsYXkuY3VycmVudFRpbWUsITApLHZvaWQgYWUodGhpcy5lbGVtZW50cy5wcm9ncmVzcywhMCk7SCh0aGlzLmVsZW1lbnRzLmlucHV0cy5zZWVrKSYmdGhpcy5lbGVtZW50cy5pbnB1dHMuc2Vlay5zZXRBdHRyaWJ1dGUoXCJhcmlhLXZhbHVlbWF4XCIsdGhpcy5kdXJhdGlvbik7Y29uc3QgZT1IKHRoaXMuZWxlbWVudHMuZGlzcGxheS5kdXJhdGlvbik7IWUmJnRoaXMuY29uZmlnLmRpc3BsYXlEdXJhdGlvbiYmdGhpcy5wYXVzZWQmJldlLnVwZGF0ZVRpbWVEaXNwbGF5LmNhbGwodGhpcyx0aGlzLmVsZW1lbnRzLmRpc3BsYXkuY3VycmVudFRpbWUsdGhpcy5kdXJhdGlvbiksZSYmV2UudXBkYXRlVGltZURpc3BsYXkuY2FsbCh0aGlzLHRoaXMuZWxlbWVudHMuZGlzcGxheS5kdXJhdGlvbix0aGlzLmR1cmF0aW9uKSx0aGlzLmNvbmZpZy5tYXJrZXJzLmVuYWJsZWQmJldlLnNldE1hcmtlcnMuY2FsbCh0aGlzKSxXZS51cGRhdGVTZWVrVG9vbHRpcC5jYWxsKHRoaXMpfSx0b2dnbGVNZW51QnV0dG9uKGUsdCl7YWUodGhpcy5lbGVtZW50cy5zZXR0aW5ncy5idXR0b25zW2VdLCF0KX0sdXBkYXRlU2V0dGluZyhlLHQsaSl7Y29uc3Qgcz10aGlzLmVsZW1lbnRzLnNldHRpbmdzLnBhbmVsc1tlXTtsZXQgbj1udWxsLGE9dDtpZihcImNhcHRpb25zXCI9PT1lKW49dGhpcy5jdXJyZW50VHJhY2s7ZWxzZXtpZihuPVcoaSk/dGhpc1tlXTppLFcobikmJihuPXRoaXMuY29uZmlnW2VdLmRlZmF1bHQpLCFXKHRoaXMub3B0aW9uc1tlXSkmJiF0aGlzLm9wdGlvbnNbZV0uaW5jbHVkZXMobikpcmV0dXJuIHZvaWQgdGhpcy5kZWJ1Zy53YXJuKGBVbnN1cHBvcnRlZCB2YWx1ZSBvZiAnJHtufScgZm9yICR7ZX1gKTtpZighdGhpcy5jb25maWdbZV0ub3B0aW9ucy5pbmNsdWRlcyhuKSlyZXR1cm4gdm9pZCB0aGlzLmRlYnVnLndhcm4oYERpc2FibGVkIHZhbHVlIG9mICcke259JyBmb3IgJHtlfWApfWlmKEgoYSl8fChhPXMmJnMucXVlcnlTZWxlY3RvcignW3JvbGU9XCJtZW51XCJdJykpLCFIKGEpKXJldHVybjt0aGlzLmVsZW1lbnRzLnNldHRpbmdzLmJ1dHRvbnNbZV0ucXVlcnlTZWxlY3RvcihgLiR7dGhpcy5jb25maWcuY2xhc3NOYW1lcy5tZW51LnZhbHVlfWApLmlubmVySFRNTD1XZS5nZXRMYWJlbC5jYWxsKHRoaXMsZSxuKTtjb25zdCBsPWEmJmEucXVlcnlTZWxlY3RvcihgW3ZhbHVlPVwiJHtufVwiXWApO0gobCkmJihsLmNoZWNrZWQ9ITApfSxnZXRMYWJlbChlLHQpe3N3aXRjaChlKXtjYXNlXCJzcGVlZFwiOnJldHVybiAxPT09dD9IZS5nZXQoXCJub3JtYWxcIix0aGlzLmNvbmZpZyk6YCR7dH0mdGltZXM7YDtjYXNlXCJxdWFsaXR5XCI6aWYoJCh0KSl7Y29uc3QgZT1IZS5nZXQoYHF1YWxpdHlMYWJlbC4ke3R9YCx0aGlzLmNvbmZpZyk7cmV0dXJuIGUubGVuZ3RoP2U6YCR7dH1wYH1yZXR1cm4gT2UodCk7Y2FzZVwiY2FwdGlvbnNcIjpyZXR1cm4gWWUuZ2V0TGFiZWwuY2FsbCh0aGlzKTtkZWZhdWx0OnJldHVybiBudWxsfX0sc2V0UXVhbGl0eU1lbnUoZSl7aWYoIUgodGhpcy5lbGVtZW50cy5zZXR0aW5ncy5wYW5lbHMucXVhbGl0eSkpcmV0dXJuO2NvbnN0IHQ9XCJxdWFsaXR5XCIsaT10aGlzLmVsZW1lbnRzLnNldHRpbmdzLnBhbmVscy5xdWFsaXR5LnF1ZXJ5U2VsZWN0b3IoJ1tyb2xlPVwibWVudVwiXScpO0QoZSkmJih0aGlzLm9wdGlvbnMucXVhbGl0eT1DZShlKS5maWx0ZXIoKGU9PnRoaXMuY29uZmlnLnF1YWxpdHkub3B0aW9ucy5pbmNsdWRlcyhlKSkpKTtjb25zdCBzPSFXKHRoaXMub3B0aW9ucy5xdWFsaXR5KSYmdGhpcy5vcHRpb25zLnF1YWxpdHkubGVuZ3RoPjE7aWYoV2UudG9nZ2xlTWVudUJ1dHRvbi5jYWxsKHRoaXMsdCxzKSxpZShpKSxXZS5jaGVja01lbnUuY2FsbCh0aGlzKSwhcylyZXR1cm47Y29uc3Qgbj1lPT57Y29uc3QgdD1IZS5nZXQoYHF1YWxpdHlCYWRnZS4ke2V9YCx0aGlzLmNvbmZpZyk7cmV0dXJuIHQubGVuZ3RoP1dlLmNyZWF0ZUJhZGdlLmNhbGwodGhpcyx0KTpudWxsfTt0aGlzLm9wdGlvbnMucXVhbGl0eS5zb3J0KCgoZSx0KT0+e2NvbnN0IGk9dGhpcy5jb25maWcucXVhbGl0eS5vcHRpb25zO3JldHVybiBpLmluZGV4T2YoZSk+aS5pbmRleE9mKHQpPzE6LTF9KSkuZm9yRWFjaCgoZT0+e1dlLmNyZWF0ZU1lbnVJdGVtLmNhbGwodGhpcyx7dmFsdWU6ZSxsaXN0OmksdHlwZTp0LHRpdGxlOldlLmdldExhYmVsLmNhbGwodGhpcyxcInF1YWxpdHlcIixlKSxiYWRnZTpuKGUpfSl9KSksV2UudXBkYXRlU2V0dGluZy5jYWxsKHRoaXMsdCxpKX0sc2V0Q2FwdGlvbnNNZW51KCl7aWYoIUgodGhpcy5lbGVtZW50cy5zZXR0aW5ncy5wYW5lbHMuY2FwdGlvbnMpKXJldHVybjtjb25zdCBlPVwiY2FwdGlvbnNcIix0PXRoaXMuZWxlbWVudHMuc2V0dGluZ3MucGFuZWxzLmNhcHRpb25zLnF1ZXJ5U2VsZWN0b3IoJ1tyb2xlPVwibWVudVwiXScpLGk9WWUuZ2V0VHJhY2tzLmNhbGwodGhpcykscz1Cb29sZWFuKGkubGVuZ3RoKTtpZihXZS50b2dnbGVNZW51QnV0dG9uLmNhbGwodGhpcyxlLHMpLGllKHQpLFdlLmNoZWNrTWVudS5jYWxsKHRoaXMpLCFzKXJldHVybjtjb25zdCBuPWkubWFwKCgoZSxpKT0+KHt2YWx1ZTppLGNoZWNrZWQ6dGhpcy5jYXB0aW9ucy50b2dnbGVkJiZ0aGlzLmN1cnJlbnRUcmFjaz09PWksdGl0bGU6WWUuZ2V0TGFiZWwuY2FsbCh0aGlzLGUpLGJhZGdlOmUubGFuZ3VhZ2UmJldlLmNyZWF0ZUJhZGdlLmNhbGwodGhpcyxlLmxhbmd1YWdlLnRvVXBwZXJDYXNlKCkpLGxpc3Q6dCx0eXBlOlwibGFuZ3VhZ2VcIn0pKSk7bi51bnNoaWZ0KHt2YWx1ZTotMSxjaGVja2VkOiF0aGlzLmNhcHRpb25zLnRvZ2dsZWQsdGl0bGU6SGUuZ2V0KFwiZGlzYWJsZWRcIix0aGlzLmNvbmZpZyksbGlzdDp0LHR5cGU6XCJsYW5ndWFnZVwifSksbi5mb3JFYWNoKFdlLmNyZWF0ZU1lbnVJdGVtLmJpbmQodGhpcykpLFdlLnVwZGF0ZVNldHRpbmcuY2FsbCh0aGlzLGUsdCl9LHNldFNwZWVkTWVudSgpe2lmKCFIKHRoaXMuZWxlbWVudHMuc2V0dGluZ3MucGFuZWxzLnNwZWVkKSlyZXR1cm47Y29uc3QgZT1cInNwZWVkXCIsdD10aGlzLmVsZW1lbnRzLnNldHRpbmdzLnBhbmVscy5zcGVlZC5xdWVyeVNlbGVjdG9yKCdbcm9sZT1cIm1lbnVcIl0nKTt0aGlzLm9wdGlvbnMuc3BlZWQ9dGhpcy5vcHRpb25zLnNwZWVkLmZpbHRlcigoZT0+ZT49dGhpcy5taW5pbXVtU3BlZWQmJmU8PXRoaXMubWF4aW11bVNwZWVkKSk7Y29uc3QgaT0hVyh0aGlzLm9wdGlvbnMuc3BlZWQpJiZ0aGlzLm9wdGlvbnMuc3BlZWQubGVuZ3RoPjE7V2UudG9nZ2xlTWVudUJ1dHRvbi5jYWxsKHRoaXMsZSxpKSxpZSh0KSxXZS5jaGVja01lbnUuY2FsbCh0aGlzKSxpJiYodGhpcy5vcHRpb25zLnNwZWVkLmZvckVhY2goKGk9PntXZS5jcmVhdGVNZW51SXRlbS5jYWxsKHRoaXMse3ZhbHVlOmksbGlzdDp0LHR5cGU6ZSx0aXRsZTpXZS5nZXRMYWJlbC5jYWxsKHRoaXMsXCJzcGVlZFwiLGkpfSl9KSksV2UudXBkYXRlU2V0dGluZy5jYWxsKHRoaXMsZSx0KSl9LGNoZWNrTWVudSgpe2NvbnN0e2J1dHRvbnM6ZX09dGhpcy5lbGVtZW50cy5zZXR0aW5ncyx0PSFXKGUpJiZPYmplY3QudmFsdWVzKGUpLnNvbWUoKGU9PiFlLmhpZGRlbikpO2FlKHRoaXMuZWxlbWVudHMuc2V0dGluZ3MubWVudSwhdCl9LGZvY3VzRmlyc3RNZW51SXRlbShlLHQ9ITEpe2lmKHRoaXMuZWxlbWVudHMuc2V0dGluZ3MucG9wdXAuaGlkZGVuKXJldHVybjtsZXQgaT1lO0goaSl8fChpPU9iamVjdC52YWx1ZXModGhpcy5lbGVtZW50cy5zZXR0aW5ncy5wYW5lbHMpLmZpbmQoKGU9PiFlLmhpZGRlbikpKTtjb25zdCBzPWkucXVlcnlTZWxlY3RvcignW3JvbGVePVwibWVudWl0ZW1cIl0nKTt1ZS5jYWxsKHRoaXMscyx0KX0sdG9nZ2xlTWVudShlKXtjb25zdHtwb3B1cDp0fT10aGlzLmVsZW1lbnRzLnNldHRpbmdzLGk9dGhpcy5lbGVtZW50cy5idXR0b25zLnNldHRpbmdzO2lmKCFIKHQpfHwhSChpKSlyZXR1cm47Y29uc3R7aGlkZGVuOnN9PXQ7bGV0IG49cztpZihPKGUpKW49ZTtlbHNlIGlmKEYoZSkmJlwiRXNjYXBlXCI9PT1lLmtleSluPSExO2Vsc2UgaWYoUihlKSl7Y29uc3Qgcz1qKGUuY29tcG9zZWRQYXRoKT9lLmNvbXBvc2VkUGF0aCgpWzBdOmUudGFyZ2V0LGE9dC5jb250YWlucyhzKTtpZihhfHwhYSYmZS50YXJnZXQhPT1pJiZuKXJldHVybn1pLnNldEF0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIixuKSxhZSh0LCFuKSxsZSh0aGlzLmVsZW1lbnRzLmNvbnRhaW5lcix0aGlzLmNvbmZpZy5jbGFzc05hbWVzLm1lbnUub3BlbixuKSxuJiZGKGUpP1dlLmZvY3VzRmlyc3RNZW51SXRlbS5jYWxsKHRoaXMsbnVsbCwhMCk6bnx8c3x8dWUuY2FsbCh0aGlzLGksRihlKSl9LGdldE1lbnVTaXplKGUpe2NvbnN0IHQ9ZS5jbG9uZU5vZGUoITApO3Quc3R5bGUucG9zaXRpb249XCJhYnNvbHV0ZVwiLHQuc3R5bGUub3BhY2l0eT0wLHQucmVtb3ZlQXR0cmlidXRlKFwiaGlkZGVuXCIpLGUucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0KTtjb25zdCBpPXQuc2Nyb2xsV2lkdGgscz10LnNjcm9sbEhlaWdodDtyZXR1cm4gdGUodCkse3dpZHRoOmksaGVpZ2h0OnN9fSxzaG93TWVudVBhbmVsKGU9XCJcIix0PSExKXtjb25zdCBpPXRoaXMuZWxlbWVudHMuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYCNwbHlyLXNldHRpbmdzLSR7dGhpcy5pZH0tJHtlfWApO2lmKCFIKGkpKXJldHVybjtjb25zdCBzPWkucGFyZW50Tm9kZSxuPUFycmF5LmZyb20ocy5jaGlsZHJlbikuZmluZCgoZT0+IWUuaGlkZGVuKSk7aWYobWUudHJhbnNpdGlvbnMmJiFtZS5yZWR1Y2VkTW90aW9uKXtzLnN0eWxlLndpZHRoPWAke24uc2Nyb2xsV2lkdGh9cHhgLHMuc3R5bGUuaGVpZ2h0PWAke24uc2Nyb2xsSGVpZ2h0fXB4YDtjb25zdCBlPVdlLmdldE1lbnVTaXplLmNhbGwodGhpcyxpKSx0PWU9PntlLnRhcmdldD09PXMmJltcIndpZHRoXCIsXCJoZWlnaHRcIl0uaW5jbHVkZXMoZS5wcm9wZXJ0eU5hbWUpJiYocy5zdHlsZS53aWR0aD1cIlwiLHMuc3R5bGUuaGVpZ2h0PVwiXCIsYmUuY2FsbCh0aGlzLHMseix0KSl9O2ZlLmNhbGwodGhpcyxzLHosdCkscy5zdHlsZS53aWR0aD1gJHtlLndpZHRofXB4YCxzLnN0eWxlLmhlaWdodD1gJHtlLmhlaWdodH1weGB9YWUobiwhMCksYWUoaSwhMSksV2UuZm9jdXNGaXJzdE1lbnVJdGVtLmNhbGwodGhpcyxpLHQpfSxzZXREb3dubG9hZFVybCgpe2NvbnN0IGU9dGhpcy5lbGVtZW50cy5idXR0b25zLmRvd25sb2FkO0goZSkmJmUuc2V0QXR0cmlidXRlKFwiaHJlZlwiLHRoaXMuZG93bmxvYWQpfSxjcmVhdGUoZSl7Y29uc3R7YmluZE1lbnVJdGVtU2hvcnRjdXRzOnQsY3JlYXRlQnV0dG9uOmksY3JlYXRlUHJvZ3Jlc3M6cyxjcmVhdGVSYW5nZTpuLGNyZWF0ZVRpbWU6YSxzZXRRdWFsaXR5TWVudTpsLHNldFNwZWVkTWVudTpvLHNob3dNZW51UGFuZWw6cn09V2U7dGhpcy5lbGVtZW50cy5jb250cm9scz1udWxsLEQodGhpcy5jb25maWcuY29udHJvbHMpJiZ0aGlzLmNvbmZpZy5jb250cm9scy5pbmNsdWRlcyhcInBsYXktbGFyZ2VcIikmJnRoaXMuZWxlbWVudHMuY29udGFpbmVyLmFwcGVuZENoaWxkKGkuY2FsbCh0aGlzLFwicGxheS1sYXJnZVwiKSk7Y29uc3QgYz1aKFwiZGl2XCIsbmUodGhpcy5jb25maWcuc2VsZWN0b3JzLmNvbnRyb2xzLndyYXBwZXIpKTt0aGlzLmVsZW1lbnRzLmNvbnRyb2xzPWM7Y29uc3QgaD17Y2xhc3M6XCJwbHlyX19jb250cm9sc19faXRlbVwifTtyZXR1cm4gQ2UoRCh0aGlzLmNvbmZpZy5jb250cm9scyk/dGhpcy5jb25maWcuY29udHJvbHM6W10pLmZvckVhY2goKGw9PntpZihcInJlc3RhcnRcIj09PWwmJmMuYXBwZW5kQ2hpbGQoaS5jYWxsKHRoaXMsXCJyZXN0YXJ0XCIsaCkpLFwicmV3aW5kXCI9PT1sJiZjLmFwcGVuZENoaWxkKGkuY2FsbCh0aGlzLFwicmV3aW5kXCIsaCkpLFwicGxheVwiPT09bCYmYy5hcHBlbmRDaGlsZChpLmNhbGwodGhpcyxcInBsYXlcIixoKSksXCJmYXN0LWZvcndhcmRcIj09PWwmJmMuYXBwZW5kQ2hpbGQoaS5jYWxsKHRoaXMsXCJmYXN0LWZvcndhcmRcIixoKSksXCJwcm9ncmVzc1wiPT09bCl7Y29uc3QgdD1aKFwiZGl2XCIse2NsYXNzOmAke2guY2xhc3N9IHBseXJfX3Byb2dyZXNzX19jb250YWluZXJgfSksaT1aKFwiZGl2XCIsbmUodGhpcy5jb25maWcuc2VsZWN0b3JzLnByb2dyZXNzKSk7aWYoaS5hcHBlbmRDaGlsZChuLmNhbGwodGhpcyxcInNlZWtcIix7aWQ6YHBseXItc2Vlay0ke2UuaWR9YH0pKSxpLmFwcGVuZENoaWxkKHMuY2FsbCh0aGlzLFwiYnVmZmVyXCIpKSx0aGlzLmNvbmZpZy50b29sdGlwcy5zZWVrKXtjb25zdCBlPVooXCJzcGFuXCIse2NsYXNzOnRoaXMuY29uZmlnLmNsYXNzTmFtZXMudG9vbHRpcH0sXCIwMDowMFwiKTtpLmFwcGVuZENoaWxkKGUpLHRoaXMuZWxlbWVudHMuZGlzcGxheS5zZWVrVG9vbHRpcD1lfXRoaXMuZWxlbWVudHMucHJvZ3Jlc3M9aSx0LmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudHMucHJvZ3Jlc3MpLGMuYXBwZW5kQ2hpbGQodCl9aWYoXCJjdXJyZW50LXRpbWVcIj09PWwmJmMuYXBwZW5kQ2hpbGQoYS5jYWxsKHRoaXMsXCJjdXJyZW50VGltZVwiLGgpKSxcImR1cmF0aW9uXCI9PT1sJiZjLmFwcGVuZENoaWxkKGEuY2FsbCh0aGlzLFwiZHVyYXRpb25cIixoKSksXCJtdXRlXCI9PT1sfHxcInZvbHVtZVwiPT09bCl7bGV0e3ZvbHVtZTp0fT10aGlzLmVsZW1lbnRzO2lmKEgodCkmJmMuY29udGFpbnModCl8fCh0PVooXCJkaXZcIixYKHt9LGgse2NsYXNzOmAke2guY2xhc3N9IHBseXJfX3ZvbHVtZWAudHJpbSgpfSkpLHRoaXMuZWxlbWVudHMudm9sdW1lPXQsYy5hcHBlbmRDaGlsZCh0KSksXCJtdXRlXCI9PT1sJiZ0LmFwcGVuZENoaWxkKGkuY2FsbCh0aGlzLFwibXV0ZVwiKSksXCJ2b2x1bWVcIj09PWwmJiFZLmlzSW9zKXtjb25zdCBpPXttYXg6MSxzdGVwOi4wNSx2YWx1ZTp0aGlzLmNvbmZpZy52b2x1bWV9O3QuYXBwZW5kQ2hpbGQobi5jYWxsKHRoaXMsXCJ2b2x1bWVcIixYKGkse2lkOmBwbHlyLXZvbHVtZS0ke2UuaWR9YH0pKSl9fWlmKFwiY2FwdGlvbnNcIj09PWwmJmMuYXBwZW5kQ2hpbGQoaS5jYWxsKHRoaXMsXCJjYXB0aW9uc1wiLGgpKSxcInNldHRpbmdzXCI9PT1sJiYhVyh0aGlzLmNvbmZpZy5zZXR0aW5ncykpe2NvbnN0IHM9WihcImRpdlwiLFgoe30saCx7Y2xhc3M6YCR7aC5jbGFzc30gcGx5cl9fbWVudWAudHJpbSgpLGhpZGRlbjpcIlwifSkpO3MuYXBwZW5kQ2hpbGQoaS5jYWxsKHRoaXMsXCJzZXR0aW5nc1wiLHtcImFyaWEtaGFzcG9wdXBcIjohMCxcImFyaWEtY29udHJvbHNcIjpgcGx5ci1zZXR0aW5ncy0ke2UuaWR9YCxcImFyaWEtZXhwYW5kZWRcIjohMX0pKTtjb25zdCBuPVooXCJkaXZcIix7Y2xhc3M6XCJwbHlyX19tZW51X19jb250YWluZXJcIixpZDpgcGx5ci1zZXR0aW5ncy0ke2UuaWR9YCxoaWRkZW46XCJcIn0pLGE9WihcImRpdlwiKSxsPVooXCJkaXZcIix7aWQ6YHBseXItc2V0dGluZ3MtJHtlLmlkfS1ob21lYH0pLG89WihcImRpdlwiLHtyb2xlOlwibWVudVwifSk7bC5hcHBlbmRDaGlsZChvKSxhLmFwcGVuZENoaWxkKGwpLHRoaXMuZWxlbWVudHMuc2V0dGluZ3MucGFuZWxzLmhvbWU9bCx0aGlzLmNvbmZpZy5zZXR0aW5ncy5mb3JFYWNoKChpPT57Y29uc3Qgcz1aKFwiYnV0dG9uXCIsWChuZSh0aGlzLmNvbmZpZy5zZWxlY3RvcnMuYnV0dG9ucy5zZXR0aW5ncykse3R5cGU6XCJidXR0b25cIixjbGFzczpgJHt0aGlzLmNvbmZpZy5jbGFzc05hbWVzLmNvbnRyb2x9ICR7dGhpcy5jb25maWcuY2xhc3NOYW1lcy5jb250cm9sfS0tZm9yd2FyZGAscm9sZTpcIm1lbnVpdGVtXCIsXCJhcmlhLWhhc3BvcHVwXCI6ITAsaGlkZGVuOlwiXCJ9KSk7dC5jYWxsKHRoaXMscyxpKSxmZS5jYWxsKHRoaXMscyxcImNsaWNrXCIsKCgpPT57ci5jYWxsKHRoaXMsaSwhMSl9KSk7Y29uc3Qgbj1aKFwic3BhblwiLG51bGwsSGUuZ2V0KGksdGhpcy5jb25maWcpKSxsPVooXCJzcGFuXCIse2NsYXNzOnRoaXMuY29uZmlnLmNsYXNzTmFtZXMubWVudS52YWx1ZX0pO2wuaW5uZXJIVE1MPWVbaV0sbi5hcHBlbmRDaGlsZChsKSxzLmFwcGVuZENoaWxkKG4pLG8uYXBwZW5kQ2hpbGQocyk7Y29uc3QgYz1aKFwiZGl2XCIse2lkOmBwbHlyLXNldHRpbmdzLSR7ZS5pZH0tJHtpfWAsaGlkZGVuOlwiXCJ9KSxoPVooXCJidXR0b25cIix7dHlwZTpcImJ1dHRvblwiLGNsYXNzOmAke3RoaXMuY29uZmlnLmNsYXNzTmFtZXMuY29udHJvbH0gJHt0aGlzLmNvbmZpZy5jbGFzc05hbWVzLmNvbnRyb2x9LS1iYWNrYH0pO2guYXBwZW5kQ2hpbGQoWihcInNwYW5cIix7XCJhcmlhLWhpZGRlblwiOiEwfSxIZS5nZXQoaSx0aGlzLmNvbmZpZykpKSxoLmFwcGVuZENoaWxkKFooXCJzcGFuXCIse2NsYXNzOnRoaXMuY29uZmlnLmNsYXNzTmFtZXMuaGlkZGVufSxIZS5nZXQoXCJtZW51QmFja1wiLHRoaXMuY29uZmlnKSkpLGZlLmNhbGwodGhpcyxjLFwia2V5ZG93blwiLChlPT57XCJBcnJvd0xlZnRcIj09PWUua2V5JiYoZS5wcmV2ZW50RGVmYXVsdCgpLGUuc3RvcFByb3BhZ2F0aW9uKCksci5jYWxsKHRoaXMsXCJob21lXCIsITApKX0pLCExKSxmZS5jYWxsKHRoaXMsaCxcImNsaWNrXCIsKCgpPT57ci5jYWxsKHRoaXMsXCJob21lXCIsITEpfSkpLGMuYXBwZW5kQ2hpbGQoaCksYy5hcHBlbmRDaGlsZChaKFwiZGl2XCIse3JvbGU6XCJtZW51XCJ9KSksYS5hcHBlbmRDaGlsZChjKSx0aGlzLmVsZW1lbnRzLnNldHRpbmdzLmJ1dHRvbnNbaV09cyx0aGlzLmVsZW1lbnRzLnNldHRpbmdzLnBhbmVsc1tpXT1jfSkpLG4uYXBwZW5kQ2hpbGQoYSkscy5hcHBlbmRDaGlsZChuKSxjLmFwcGVuZENoaWxkKHMpLHRoaXMuZWxlbWVudHMuc2V0dGluZ3MucG9wdXA9bix0aGlzLmVsZW1lbnRzLnNldHRpbmdzLm1lbnU9c31pZihcInBpcFwiPT09bCYmbWUucGlwJiZjLmFwcGVuZENoaWxkKGkuY2FsbCh0aGlzLFwicGlwXCIsaCkpLFwiYWlycGxheVwiPT09bCYmbWUuYWlycGxheSYmYy5hcHBlbmRDaGlsZChpLmNhbGwodGhpcyxcImFpcnBsYXlcIixoKSksXCJkb3dubG9hZFwiPT09bCl7Y29uc3QgZT1YKHt9LGgse2VsZW1lbnQ6XCJhXCIsaHJlZjp0aGlzLmRvd25sb2FkLHRhcmdldDpcIl9ibGFua1wifSk7dGhpcy5pc0hUTUw1JiYoZS5kb3dubG9hZD1cIlwiKTtjb25zdHtkb3dubG9hZDp0fT10aGlzLmNvbmZpZy51cmxzOyFVKHQpJiZ0aGlzLmlzRW1iZWQmJlgoZSx7aWNvbjpgbG9nby0ke3RoaXMucHJvdmlkZXJ9YCxsYWJlbDp0aGlzLnByb3ZpZGVyfSksYy5hcHBlbmRDaGlsZChpLmNhbGwodGhpcyxcImRvd25sb2FkXCIsZSkpfVwiZnVsbHNjcmVlblwiPT09bCYmYy5hcHBlbmRDaGlsZChpLmNhbGwodGhpcyxcImZ1bGxzY3JlZW5cIixoKSl9KSksdGhpcy5pc0hUTUw1JiZsLmNhbGwodGhpcyxMZS5nZXRRdWFsaXR5T3B0aW9ucy5jYWxsKHRoaXMpKSxvLmNhbGwodGhpcyksY30saW5qZWN0KCl7aWYodGhpcy5jb25maWcubG9hZFNwcml0ZSl7Y29uc3QgZT1XZS5nZXRJY29uVXJsLmNhbGwodGhpcyk7ZS5jb3JzJiZWZShlLnVybCxcInNwcml0ZS1wbHlyXCIpfXRoaXMuaWQ9TWF0aC5mbG9vcigxZTQqTWF0aC5yYW5kb20oKSk7bGV0IGU9bnVsbDt0aGlzLmVsZW1lbnRzLmNvbnRyb2xzPW51bGw7Y29uc3QgdD17aWQ6dGhpcy5pZCxzZWVrdGltZTp0aGlzLmNvbmZpZy5zZWVrVGltZSx0aXRsZTp0aGlzLmNvbmZpZy50aXRsZX07bGV0IGk9ITA7aih0aGlzLmNvbmZpZy5jb250cm9scykmJih0aGlzLmNvbmZpZy5jb250cm9scz10aGlzLmNvbmZpZy5jb250cm9scy5jYWxsKHRoaXMsdCkpLHRoaXMuY29uZmlnLmNvbnRyb2xzfHwodGhpcy5jb25maWcuY29udHJvbHM9W10pLEgodGhpcy5jb25maWcuY29udHJvbHMpfHxfKHRoaXMuY29uZmlnLmNvbnRyb2xzKT9lPXRoaXMuY29uZmlnLmNvbnRyb2xzOihlPVdlLmNyZWF0ZS5jYWxsKHRoaXMse2lkOnRoaXMuaWQsc2Vla3RpbWU6dGhpcy5jb25maWcuc2Vla1RpbWUsc3BlZWQ6dGhpcy5zcGVlZCxxdWFsaXR5OnRoaXMucXVhbGl0eSxjYXB0aW9uczpZZS5nZXRMYWJlbC5jYWxsKHRoaXMpfSksaT0hMSk7bGV0IHM7aSYmXyh0aGlzLmNvbmZpZy5jb250cm9scykmJihlPShlPT57bGV0IGk9ZTtyZXR1cm4gT2JqZWN0LmVudHJpZXModCkuZm9yRWFjaCgoKFtlLHRdKT0+e2k9X2UoaSxgeyR7ZX19YCx0KX0pKSxpfSkoZSkpLF8odGhpcy5jb25maWcuc2VsZWN0b3JzLmNvbnRyb2xzLmNvbnRhaW5lcikmJihzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5jb25maWcuc2VsZWN0b3JzLmNvbnRyb2xzLmNvbnRhaW5lcikpLEgocyl8fChzPXRoaXMuZWxlbWVudHMuY29udGFpbmVyKTtpZihzW0goZSk/XCJpbnNlcnRBZGphY2VudEVsZW1lbnRcIjpcImluc2VydEFkamFjZW50SFRNTFwiXShcImFmdGVyYmVnaW5cIixlKSxIKHRoaXMuZWxlbWVudHMuY29udHJvbHMpfHxXZS5maW5kRWxlbWVudHMuY2FsbCh0aGlzKSwhVyh0aGlzLmVsZW1lbnRzLmJ1dHRvbnMpKXtjb25zdCBlPWU9Pntjb25zdCB0PXRoaXMuY29uZmlnLmNsYXNzTmFtZXMuY29udHJvbFByZXNzZWQ7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJwcmVzc2VkXCIse2VudW1lcmFibGU6ITAsZ2V0OigpPT5vZShlLHQpLHNldChpPSExKXtsZShlLHQsaSl9fSl9O09iamVjdC52YWx1ZXModGhpcy5lbGVtZW50cy5idXR0b25zKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaCgodD0+e0QodCl8fHEodCk/QXJyYXkuZnJvbSh0KS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChlKTplKHQpfSkpfWlmKFkuaXNFZGdlJiZLKHMpLHRoaXMuY29uZmlnLnRvb2x0aXBzLmNvbnRyb2xzKXtjb25zdHtjbGFzc05hbWVzOmUsc2VsZWN0b3JzOnR9PXRoaXMuY29uZmlnLGk9YCR7dC5jb250cm9scy53cmFwcGVyfSAke3QubGFiZWxzfSAuJHtlLmhpZGRlbn1gLHM9Y2UuY2FsbCh0aGlzLGkpO0FycmF5LmZyb20ocykuZm9yRWFjaCgoZT0+e2xlKGUsdGhpcy5jb25maWcuY2xhc3NOYW1lcy5oaWRkZW4sITEpLGxlKGUsdGhpcy5jb25maWcuY2xhc3NOYW1lcy50b29sdGlwLCEwKX0pKX19LHNldE1lZGlhTWV0YWRhdGEoKXt0cnl7XCJtZWRpYVNlc3Npb25cImluIG5hdmlnYXRvciYmKG5hdmlnYXRvci5tZWRpYVNlc3Npb24ubWV0YWRhdGE9bmV3IHdpbmRvdy5NZWRpYU1ldGFkYXRhKHt0aXRsZTp0aGlzLmNvbmZpZy5tZWRpYU1ldGFkYXRhLnRpdGxlLGFydGlzdDp0aGlzLmNvbmZpZy5tZWRpYU1ldGFkYXRhLmFydGlzdCxhbGJ1bTp0aGlzLmNvbmZpZy5tZWRpYU1ldGFkYXRhLmFsYnVtLGFydHdvcms6dGhpcy5jb25maWcubWVkaWFNZXRhZGF0YS5hcnR3b3JrfSkpfWNhdGNoKGUpe319LHNldE1hcmtlcnMoKXt2YXIgZSx0O2lmKCF0aGlzLmR1cmF0aW9ufHx0aGlzLmVsZW1lbnRzLm1hcmtlcnMpcmV0dXJuO2NvbnN0IGk9bnVsbD09PShlPXRoaXMuY29uZmlnLm1hcmtlcnMpfHx2b2lkIDA9PT1lfHxudWxsPT09KHQ9ZS5wb2ludHMpfHx2b2lkIDA9PT10P3ZvaWQgMDp0LmZpbHRlcigoKHt0aW1lOmV9KT0+ZT4wJiZlPHRoaXMuZHVyYXRpb24pKTtpZihudWxsPT1pfHwhaS5sZW5ndGgpcmV0dXJuO2NvbnN0IHM9ZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLG49ZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2xldCBhPW51bGw7Y29uc3QgbD1gJHt0aGlzLmNvbmZpZy5jbGFzc05hbWVzLnRvb2x0aXB9LS12aXNpYmxlYCxvPWU9PmxlKGEsbCxlKTtpLmZvckVhY2goKGU9Pntjb25zdCB0PVooXCJzcGFuXCIse2NsYXNzOnRoaXMuY29uZmlnLmNsYXNzTmFtZXMubWFya2VyfSxcIlwiKSxpPWUudGltZS90aGlzLmR1cmF0aW9uKjEwMCtcIiVcIjthJiYodC5hZGRFdmVudExpc3RlbmVyKFwibW91c2VlbnRlclwiLCgoKT0+e2UubGFiZWx8fChhLnN0eWxlLmxlZnQ9aSxhLmlubmVySFRNTD1lLmxhYmVsLG8oITApKX0pKSx0LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsKCgpPT57byghMSl9KSkpLHQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsKCgpPT57dGhpcy5jdXJyZW50VGltZT1lLnRpbWV9KSksdC5zdHlsZS5sZWZ0PWksbi5hcHBlbmRDaGlsZCh0KX0pKSxzLmFwcGVuZENoaWxkKG4pLHRoaXMuY29uZmlnLnRvb2x0aXBzLnNlZWt8fChhPVooXCJzcGFuXCIse2NsYXNzOnRoaXMuY29uZmlnLmNsYXNzTmFtZXMudG9vbHRpcH0sXCJcIikscy5hcHBlbmRDaGlsZChhKSksdGhpcy5lbGVtZW50cy5tYXJrZXJzPXtwb2ludHM6bix0aXA6YX0sdGhpcy5lbGVtZW50cy5wcm9ncmVzcy5hcHBlbmRDaGlsZChzKX19O2Z1bmN0aW9uIHplKGUsdD0hMCl7bGV0IGk9ZTtpZih0KXtjb25zdCBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO2UuaHJlZj1pLGk9ZS5ocmVmfXRyeXtyZXR1cm4gbmV3IFVSTChpKX1jYXRjaChlKXtyZXR1cm4gbnVsbH19ZnVuY3Rpb24gS2UoZSl7Y29uc3QgdD1uZXcgVVJMU2VhcmNoUGFyYW1zO3JldHVybiBMKGUpJiZPYmplY3QuZW50cmllcyhlKS5mb3JFYWNoKCgoW2UsaV0pPT57dC5zZXQoZSxpKX0pKSx0fWNvbnN0IFllPXtzZXR1cCgpe2lmKCF0aGlzLnN1cHBvcnRlZC51aSlyZXR1cm47aWYoIXRoaXMuaXNWaWRlb3x8dGhpcy5pc1lvdVR1YmV8fHRoaXMuaXNIVE1MNSYmIW1lLnRleHRUcmFja3MpcmV0dXJuIHZvaWQoRCh0aGlzLmNvbmZpZy5jb250cm9scykmJnRoaXMuY29uZmlnLmNvbnRyb2xzLmluY2x1ZGVzKFwic2V0dGluZ3NcIikmJnRoaXMuY29uZmlnLnNldHRpbmdzLmluY2x1ZGVzKFwiY2FwdGlvbnNcIikmJldlLnNldENhcHRpb25zTWVudS5jYWxsKHRoaXMpKTt2YXIgZSx0O2lmKEgodGhpcy5lbGVtZW50cy5jYXB0aW9ucyl8fCh0aGlzLmVsZW1lbnRzLmNhcHRpb25zPVooXCJkaXZcIixuZSh0aGlzLmNvbmZpZy5zZWxlY3RvcnMuY2FwdGlvbnMpKSxlPXRoaXMuZWxlbWVudHMuY2FwdGlvbnMsdD10aGlzLmVsZW1lbnRzLndyYXBwZXIsSChlKSYmSCh0KSYmdC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLHQubmV4dFNpYmxpbmcpKSxZLmlzSUUmJndpbmRvdy5VUkwpe2NvbnN0IGU9dGhpcy5tZWRpYS5xdWVyeVNlbGVjdG9yQWxsKFwidHJhY2tcIik7QXJyYXkuZnJvbShlKS5mb3JFYWNoKChlPT57Y29uc3QgdD1lLmdldEF0dHJpYnV0ZShcInNyY1wiKSxpPXplKHQpO251bGwhPT1pJiZpLmhvc3RuYW1lIT09d2luZG93LmxvY2F0aW9uLmhyZWYuaG9zdG5hbWUmJltcImh0dHA6XCIsXCJodHRwczpcIl0uaW5jbHVkZXMoaS5wcm90b2NvbCkmJkZlKHQsXCJibG9iXCIpLnRoZW4oKHQ9PntlLnNldEF0dHJpYnV0ZShcInNyY1wiLHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKHQpKX0pKS5jYXRjaCgoKCk9Pnt0ZShlKX0pKX0pKX1jb25zdCBpPUNlKChuYXZpZ2F0b3IubGFuZ3VhZ2VzfHxbbmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IudXNlckxhbmd1YWdlfHxcImVuXCJdKS5tYXAoKGU9PmUuc3BsaXQoXCItXCIpWzBdKSkpO2xldCBzPSh0aGlzLnN0b3JhZ2UuZ2V0KFwibGFuZ3VhZ2VcIil8fHRoaXMuY29uZmlnLmNhcHRpb25zLmxhbmd1YWdlfHxcImF1dG9cIikudG9Mb3dlckNhc2UoKTtcImF1dG9cIj09PXMmJihbc109aSk7bGV0IG49dGhpcy5zdG9yYWdlLmdldChcImNhcHRpb25zXCIpO2lmKE8obil8fCh7YWN0aXZlOm59PXRoaXMuY29uZmlnLmNhcHRpb25zKSxPYmplY3QuYXNzaWduKHRoaXMuY2FwdGlvbnMse3RvZ2dsZWQ6ITEsYWN0aXZlOm4sbGFuZ3VhZ2U6cyxsYW5ndWFnZXM6aX0pLHRoaXMuaXNIVE1MNSl7Y29uc3QgZT10aGlzLmNvbmZpZy5jYXB0aW9ucy51cGRhdGU/XCJhZGR0cmFjayByZW1vdmV0cmFja1wiOlwicmVtb3ZldHJhY2tcIjtmZS5jYWxsKHRoaXMsdGhpcy5tZWRpYS50ZXh0VHJhY2tzLGUsWWUudXBkYXRlLmJpbmQodGhpcykpfXNldFRpbWVvdXQoWWUudXBkYXRlLmJpbmQodGhpcyksMCl9LHVwZGF0ZSgpe2NvbnN0IGU9WWUuZ2V0VHJhY2tzLmNhbGwodGhpcywhMCkse2FjdGl2ZTp0LGxhbmd1YWdlOmksbWV0YTpzLGN1cnJlbnRUcmFja05vZGU6bn09dGhpcy5jYXB0aW9ucyxhPUJvb2xlYW4oZS5maW5kKChlPT5lLmxhbmd1YWdlPT09aSkpKTt0aGlzLmlzSFRNTDUmJnRoaXMuaXNWaWRlbyYmZS5maWx0ZXIoKGU9PiFzLmdldChlKSkpLmZvckVhY2goKGU9Pnt0aGlzLmRlYnVnLmxvZyhcIlRyYWNrIGFkZGVkXCIsZSkscy5zZXQoZSx7ZGVmYXVsdDpcInNob3dpbmdcIj09PWUubW9kZX0pLFwic2hvd2luZ1wiPT09ZS5tb2RlJiYoZS5tb2RlPVwiaGlkZGVuXCIpLGZlLmNhbGwodGhpcyxlLFwiY3VlY2hhbmdlXCIsKCgpPT5ZZS51cGRhdGVDdWVzLmNhbGwodGhpcykpKX0pKSwoYSYmdGhpcy5sYW5ndWFnZSE9PWl8fCFlLmluY2x1ZGVzKG4pKSYmKFllLnNldExhbmd1YWdlLmNhbGwodGhpcyxpKSxZZS50b2dnbGUuY2FsbCh0aGlzLHQmJmEpKSx0aGlzLmVsZW1lbnRzJiZsZSh0aGlzLmVsZW1lbnRzLmNvbnRhaW5lcix0aGlzLmNvbmZpZy5jbGFzc05hbWVzLmNhcHRpb25zLmVuYWJsZWQsIVcoZSkpLEQodGhpcy5jb25maWcuY29udHJvbHMpJiZ0aGlzLmNvbmZpZy5jb250cm9scy5pbmNsdWRlcyhcInNldHRpbmdzXCIpJiZ0aGlzLmNvbmZpZy5zZXR0aW5ncy5pbmNsdWRlcyhcImNhcHRpb25zXCIpJiZXZS5zZXRDYXB0aW9uc01lbnUuY2FsbCh0aGlzKX0sdG9nZ2xlKGUsdD0hMCl7aWYoIXRoaXMuc3VwcG9ydGVkLnVpKXJldHVybjtjb25zdHt0b2dnbGVkOml9PXRoaXMuY2FwdGlvbnMscz10aGlzLmNvbmZpZy5jbGFzc05hbWVzLmNhcHRpb25zLmFjdGl2ZSxuPUkoZSk/IWk6ZTtpZihuIT09aSl7aWYodHx8KHRoaXMuY2FwdGlvbnMuYWN0aXZlPW4sdGhpcy5zdG9yYWdlLnNldCh7Y2FwdGlvbnM6bn0pKSwhdGhpcy5sYW5ndWFnZSYmbiYmIXQpe2NvbnN0IGU9WWUuZ2V0VHJhY2tzLmNhbGwodGhpcyksdD1ZZS5maW5kVHJhY2suY2FsbCh0aGlzLFt0aGlzLmNhcHRpb25zLmxhbmd1YWdlLC4uLnRoaXMuY2FwdGlvbnMubGFuZ3VhZ2VzXSwhMCk7cmV0dXJuIHRoaXMuY2FwdGlvbnMubGFuZ3VhZ2U9dC5sYW5ndWFnZSx2b2lkIFllLnNldC5jYWxsKHRoaXMsZS5pbmRleE9mKHQpKX10aGlzLmVsZW1lbnRzLmJ1dHRvbnMuY2FwdGlvbnMmJih0aGlzLmVsZW1lbnRzLmJ1dHRvbnMuY2FwdGlvbnMucHJlc3NlZD1uKSxsZSh0aGlzLmVsZW1lbnRzLmNvbnRhaW5lcixzLG4pLHRoaXMuY2FwdGlvbnMudG9nZ2xlZD1uLFdlLnVwZGF0ZVNldHRpbmcuY2FsbCh0aGlzLFwiY2FwdGlvbnNcIiksdmUuY2FsbCh0aGlzLHRoaXMubWVkaWEsbj9cImNhcHRpb25zZW5hYmxlZFwiOlwiY2FwdGlvbnNkaXNhYmxlZFwiKX1zZXRUaW1lb3V0KCgoKT0+e24mJnRoaXMuY2FwdGlvbnMudG9nZ2xlZCYmKHRoaXMuY2FwdGlvbnMuY3VycmVudFRyYWNrTm9kZS5tb2RlPVwiaGlkZGVuXCIpfSkpfSxzZXQoZSx0PSEwKXtjb25zdCBpPVllLmdldFRyYWNrcy5jYWxsKHRoaXMpO2lmKC0xIT09ZSlpZigkKGUpKWlmKGUgaW4gaSl7aWYodGhpcy5jYXB0aW9ucy5jdXJyZW50VHJhY2shPT1lKXt0aGlzLmNhcHRpb25zLmN1cnJlbnRUcmFjaz1lO2NvbnN0IHM9aVtlXSx7bGFuZ3VhZ2U6bn09c3x8e307dGhpcy5jYXB0aW9ucy5jdXJyZW50VHJhY2tOb2RlPXMsV2UudXBkYXRlU2V0dGluZy5jYWxsKHRoaXMsXCJjYXB0aW9uc1wiKSx0fHwodGhpcy5jYXB0aW9ucy5sYW5ndWFnZT1uLHRoaXMuc3RvcmFnZS5zZXQoe2xhbmd1YWdlOm59KSksdGhpcy5pc1ZpbWVvJiZ0aGlzLmVtYmVkLmVuYWJsZVRleHRUcmFjayhuKSx2ZS5jYWxsKHRoaXMsdGhpcy5tZWRpYSxcImxhbmd1YWdlY2hhbmdlXCIpfVllLnRvZ2dsZS5jYWxsKHRoaXMsITAsdCksdGhpcy5pc0hUTUw1JiZ0aGlzLmlzVmlkZW8mJlllLnVwZGF0ZUN1ZXMuY2FsbCh0aGlzKX1lbHNlIHRoaXMuZGVidWcud2FybihcIlRyYWNrIG5vdCBmb3VuZFwiLGUpO2Vsc2UgdGhpcy5kZWJ1Zy53YXJuKFwiSW52YWxpZCBjYXB0aW9uIGFyZ3VtZW50XCIsZSk7ZWxzZSBZZS50b2dnbGUuY2FsbCh0aGlzLCExLHQpfSxzZXRMYW5ndWFnZShlLHQ9ITApe2lmKCFfKGUpKXJldHVybiB2b2lkIHRoaXMuZGVidWcud2FybihcIkludmFsaWQgbGFuZ3VhZ2UgYXJndW1lbnRcIixlKTtjb25zdCBpPWUudG9Mb3dlckNhc2UoKTt0aGlzLmNhcHRpb25zLmxhbmd1YWdlPWk7Y29uc3Qgcz1ZZS5nZXRUcmFja3MuY2FsbCh0aGlzKSxuPVllLmZpbmRUcmFjay5jYWxsKHRoaXMsW2ldKTtZZS5zZXQuY2FsbCh0aGlzLHMuaW5kZXhPZihuKSx0KX0sZ2V0VHJhY2tzKGU9ITEpe3JldHVybiBBcnJheS5mcm9tKCh0aGlzLm1lZGlhfHx7fSkudGV4dFRyYWNrc3x8W10pLmZpbHRlcigodD0+IXRoaXMuaXNIVE1MNXx8ZXx8dGhpcy5jYXB0aW9ucy5tZXRhLmhhcyh0KSkpLmZpbHRlcigoZT0+W1wiY2FwdGlvbnNcIixcInN1YnRpdGxlc1wiXS5pbmNsdWRlcyhlLmtpbmQpKSl9LGZpbmRUcmFjayhlLHQ9ITEpe2NvbnN0IGk9WWUuZ2V0VHJhY2tzLmNhbGwodGhpcykscz1lPT5OdW1iZXIoKHRoaXMuY2FwdGlvbnMubWV0YS5nZXQoZSl8fHt9KS5kZWZhdWx0KSxuPUFycmF5LmZyb20oaSkuc29ydCgoKGUsdCk9PnModCktcyhlKSkpO2xldCBhO3JldHVybiBlLmV2ZXJ5KChlPT4oYT1uLmZpbmQoKHQ9PnQubGFuZ3VhZ2U9PT1lKSksIWEpKSksYXx8KHQ/blswXTp2b2lkIDApfSxnZXRDdXJyZW50VHJhY2soKXtyZXR1cm4gWWUuZ2V0VHJhY2tzLmNhbGwodGhpcylbdGhpcy5jdXJyZW50VHJhY2tdfSxnZXRMYWJlbChlKXtsZXQgdD1lO3JldHVybiFWKHQpJiZtZS50ZXh0VHJhY2tzJiZ0aGlzLmNhcHRpb25zLnRvZ2dsZWQmJih0PVllLmdldEN1cnJlbnRUcmFjay5jYWxsKHRoaXMpKSxWKHQpP1codC5sYWJlbCk/Vyh0Lmxhbmd1YWdlKT9IZS5nZXQoXCJlbmFibGVkXCIsdGhpcy5jb25maWcpOmUubGFuZ3VhZ2UudG9VcHBlckNhc2UoKTp0LmxhYmVsOkhlLmdldChcImRpc2FibGVkXCIsdGhpcy5jb25maWcpfSx1cGRhdGVDdWVzKGUpe2lmKCF0aGlzLnN1cHBvcnRlZC51aSlyZXR1cm47aWYoIUgodGhpcy5lbGVtZW50cy5jYXB0aW9ucykpcmV0dXJuIHZvaWQgdGhpcy5kZWJ1Zy53YXJuKFwiTm8gY2FwdGlvbnMgZWxlbWVudCB0byByZW5kZXIgdG9cIik7aWYoIUkoZSkmJiFBcnJheS5pc0FycmF5KGUpKXJldHVybiB2b2lkIHRoaXMuZGVidWcud2FybihcInVwZGF0ZUN1ZXM6IEludmFsaWQgaW5wdXRcIixlKTtsZXQgdD1lO2lmKCF0KXtjb25zdCBlPVllLmdldEN1cnJlbnRUcmFjay5jYWxsKHRoaXMpO3Q9QXJyYXkuZnJvbSgoZXx8e30pLmFjdGl2ZUN1ZXN8fFtdKS5tYXAoKGU9PmUuZ2V0Q3VlQXNIVE1MKCkpKS5tYXAoRGUpfWNvbnN0IGk9dC5tYXAoKGU9PmUudHJpbSgpKSkuam9pbihcIlxcblwiKTtpZihpIT09dGhpcy5lbGVtZW50cy5jYXB0aW9ucy5pbm5lckhUTUwpe2llKHRoaXMuZWxlbWVudHMuY2FwdGlvbnMpO2NvbnN0IGU9WihcInNwYW5cIixuZSh0aGlzLmNvbmZpZy5zZWxlY3RvcnMuY2FwdGlvbikpO2UuaW5uZXJIVE1MPWksdGhpcy5lbGVtZW50cy5jYXB0aW9ucy5hcHBlbmRDaGlsZChlKSx2ZS5jYWxsKHRoaXMsdGhpcy5tZWRpYSxcImN1ZWNoYW5nZVwiKX19fSxRZT17ZW5hYmxlZDohMCx0aXRsZTpcIlwiLGRlYnVnOiExLGF1dG9wbGF5OiExLGF1dG9wYXVzZTohMCxwbGF5c2lubGluZTohMCxzZWVrVGltZToxMCx2b2x1bWU6MSxtdXRlZDohMSxkdXJhdGlvbjpudWxsLGRpc3BsYXlEdXJhdGlvbjohMCxpbnZlcnRUaW1lOiEwLHRvZ2dsZUludmVydDohMCxyYXRpbzpudWxsLGNsaWNrVG9QbGF5OiEwLGhpZGVDb250cm9sczohMCxyZXNldE9uRW5kOiExLGRpc2FibGVDb250ZXh0TWVudTohMCxsb2FkU3ByaXRlOiEwLGljb25QcmVmaXg6XCJwbHlyXCIsaWNvblVybDpcImh0dHBzOi8vY2RuLnBseXIuaW8vMy43LjIvcGx5ci5zdmdcIixibGFua1ZpZGVvOlwiaHR0cHM6Ly9jZG4ucGx5ci5pby9zdGF0aWMvYmxhbmsubXA0XCIscXVhbGl0eTp7ZGVmYXVsdDo1NzYsb3B0aW9uczpbNDMyMCwyODgwLDIxNjAsMTQ0MCwxMDgwLDcyMCw1NzYsNDgwLDM2MCwyNDBdLGZvcmNlZDohMSxvbkNoYW5nZTpudWxsfSxsb29wOnthY3RpdmU6ITF9LHNwZWVkOntzZWxlY3RlZDoxLG9wdGlvbnM6Wy41LC43NSwxLDEuMjUsMS41LDEuNzUsMiw0XX0sa2V5Ym9hcmQ6e2ZvY3VzZWQ6ITAsZ2xvYmFsOiExfSx0b29sdGlwczp7Y29udHJvbHM6ITEsc2VlazohMH0sY2FwdGlvbnM6e2FjdGl2ZTohMSxsYW5ndWFnZTpcImF1dG9cIix1cGRhdGU6ITF9LGZ1bGxzY3JlZW46e2VuYWJsZWQ6ITAsZmFsbGJhY2s6ITAsaW9zTmF0aXZlOiExfSxzdG9yYWdlOntlbmFibGVkOiEwLGtleTpcInBseXJcIn0sY29udHJvbHM6W1wicGxheS1sYXJnZVwiLFwicGxheVwiLFwicHJvZ3Jlc3NcIixcImN1cnJlbnQtdGltZVwiLFwibXV0ZVwiLFwidm9sdW1lXCIsXCJjYXB0aW9uc1wiLFwic2V0dGluZ3NcIixcInBpcFwiLFwiYWlycGxheVwiLFwiZnVsbHNjcmVlblwiXSxzZXR0aW5nczpbXCJjYXB0aW9uc1wiLFwicXVhbGl0eVwiLFwic3BlZWRcIl0saTE4bjp7cmVzdGFydDpcIlJlc3RhcnRcIixyZXdpbmQ6XCJSZXdpbmQge3NlZWt0aW1lfXNcIixwbGF5OlwiUGxheVwiLHBhdXNlOlwiUGF1c2VcIixmYXN0Rm9yd2FyZDpcIkZvcndhcmQge3NlZWt0aW1lfXNcIixzZWVrOlwiU2Vla1wiLHNlZWtMYWJlbDpcIntjdXJyZW50VGltZX0gb2Yge2R1cmF0aW9ufVwiLHBsYXllZDpcIlBsYXllZFwiLGJ1ZmZlcmVkOlwiQnVmZmVyZWRcIixjdXJyZW50VGltZTpcIkN1cnJlbnQgdGltZVwiLGR1cmF0aW9uOlwiRHVyYXRpb25cIix2b2x1bWU6XCJWb2x1bWVcIixtdXRlOlwiTXV0ZVwiLHVubXV0ZTpcIlVubXV0ZVwiLGVuYWJsZUNhcHRpb25zOlwiRW5hYmxlIGNhcHRpb25zXCIsZGlzYWJsZUNhcHRpb25zOlwiRGlzYWJsZSBjYXB0aW9uc1wiLGRvd25sb2FkOlwiRG93bmxvYWRcIixlbnRlckZ1bGxzY3JlZW46XCJFbnRlciBmdWxsc2NyZWVuXCIsZXhpdEZ1bGxzY3JlZW46XCJFeGl0IGZ1bGxzY3JlZW5cIixmcmFtZVRpdGxlOlwiUGxheWVyIGZvciB7dGl0bGV9XCIsY2FwdGlvbnM6XCJDYXB0aW9uc1wiLHNldHRpbmdzOlwiU2V0dGluZ3NcIixwaXA6XCJQSVBcIixtZW51QmFjazpcIkdvIGJhY2sgdG8gcHJldmlvdXMgbWVudVwiLHNwZWVkOlwiU3BlZWRcIixub3JtYWw6XCJOb3JtYWxcIixxdWFsaXR5OlwiUXVhbGl0eVwiLGxvb3A6XCJMb29wXCIsc3RhcnQ6XCJTdGFydFwiLGVuZDpcIkVuZFwiLGFsbDpcIkFsbFwiLHJlc2V0OlwiUmVzZXRcIixkaXNhYmxlZDpcIkRpc2FibGVkXCIsZW5hYmxlZDpcIkVuYWJsZWRcIixhZHZlcnRpc2VtZW50OlwiQWRcIixxdWFsaXR5QmFkZ2U6ezIxNjA6XCI0S1wiLDE0NDA6XCJIRFwiLDEwODA6XCJIRFwiLDcyMDpcIkhEXCIsNTc2OlwiU0RcIiw0ODA6XCJTRFwifX0sdXJsczp7ZG93bmxvYWQ6bnVsbCx2aW1lbzp7c2RrOlwiaHR0cHM6Ly9wbGF5ZXIudmltZW8uY29tL2FwaS9wbGF5ZXIuanNcIixpZnJhbWU6XCJodHRwczovL3BsYXllci52aW1lby5jb20vdmlkZW8vezB9P3sxfVwiLGFwaTpcImh0dHBzOi8vdmltZW8uY29tL2FwaS9vZW1iZWQuanNvbj91cmw9ezB9XCJ9LHlvdXR1YmU6e3NkazpcImh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2lmcmFtZV9hcGlcIixhcGk6XCJodHRwczovL25vZW1iZWQuY29tL2VtYmVkP3VybD1odHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PXswfVwifSxnb29nbGVJTUE6e3NkazpcImh0dHBzOi8vaW1hc2RrLmdvb2dsZWFwaXMuY29tL2pzL3Nka2xvYWRlci9pbWEzLmpzXCJ9fSxsaXN0ZW5lcnM6e3NlZWs6bnVsbCxwbGF5Om51bGwscGF1c2U6bnVsbCxyZXN0YXJ0Om51bGwscmV3aW5kOm51bGwsZmFzdEZvcndhcmQ6bnVsbCxtdXRlOm51bGwsdm9sdW1lOm51bGwsY2FwdGlvbnM6bnVsbCxkb3dubG9hZDpudWxsLGZ1bGxzY3JlZW46bnVsbCxwaXA6bnVsbCxhaXJwbGF5Om51bGwsc3BlZWQ6bnVsbCxxdWFsaXR5Om51bGwsbG9vcDpudWxsLGxhbmd1YWdlOm51bGx9LGV2ZW50czpbXCJlbmRlZFwiLFwicHJvZ3Jlc3NcIixcInN0YWxsZWRcIixcInBsYXlpbmdcIixcIndhaXRpbmdcIixcImNhbnBsYXlcIixcImNhbnBsYXl0aHJvdWdoXCIsXCJsb2Fkc3RhcnRcIixcImxvYWRlZGRhdGFcIixcImxvYWRlZG1ldGFkYXRhXCIsXCJ0aW1ldXBkYXRlXCIsXCJ2b2x1bWVjaGFuZ2VcIixcInBsYXlcIixcInBhdXNlXCIsXCJlcnJvclwiLFwic2Vla2luZ1wiLFwic2Vla2VkXCIsXCJlbXB0aWVkXCIsXCJyYXRlY2hhbmdlXCIsXCJjdWVjaGFuZ2VcIixcImRvd25sb2FkXCIsXCJlbnRlcmZ1bGxzY3JlZW5cIixcImV4aXRmdWxsc2NyZWVuXCIsXCJjYXB0aW9uc2VuYWJsZWRcIixcImNhcHRpb25zZGlzYWJsZWRcIixcImxhbmd1YWdlY2hhbmdlXCIsXCJjb250cm9sc2hpZGRlblwiLFwiY29udHJvbHNzaG93blwiLFwicmVhZHlcIixcInN0YXRlY2hhbmdlXCIsXCJxdWFsaXR5Y2hhbmdlXCIsXCJhZHNsb2FkZWRcIixcImFkc2NvbnRlbnRwYXVzZVwiLFwiYWRzY29udGVudHJlc3VtZVwiLFwiYWRzdGFydGVkXCIsXCJhZHNtaWRwb2ludFwiLFwiYWRzY29tcGxldGVcIixcImFkc2FsbGNvbXBsZXRlXCIsXCJhZHNpbXByZXNzaW9uXCIsXCJhZHNjbGlja1wiXSxzZWxlY3RvcnM6e2VkaXRhYmxlOlwiaW5wdXQsIHRleHRhcmVhLCBzZWxlY3QsIFtjb250ZW50ZWRpdGFibGVdXCIsY29udGFpbmVyOlwiLnBseXJcIixjb250cm9sczp7Y29udGFpbmVyOm51bGwsd3JhcHBlcjpcIi5wbHlyX19jb250cm9sc1wifSxsYWJlbHM6XCJbZGF0YS1wbHlyXVwiLGJ1dHRvbnM6e3BsYXk6J1tkYXRhLXBseXI9XCJwbGF5XCJdJyxwYXVzZTonW2RhdGEtcGx5cj1cInBhdXNlXCJdJyxyZXN0YXJ0OidbZGF0YS1wbHlyPVwicmVzdGFydFwiXScscmV3aW5kOidbZGF0YS1wbHlyPVwicmV3aW5kXCJdJyxmYXN0Rm9yd2FyZDonW2RhdGEtcGx5cj1cImZhc3QtZm9yd2FyZFwiXScsbXV0ZTonW2RhdGEtcGx5cj1cIm11dGVcIl0nLGNhcHRpb25zOidbZGF0YS1wbHlyPVwiY2FwdGlvbnNcIl0nLGRvd25sb2FkOidbZGF0YS1wbHlyPVwiZG93bmxvYWRcIl0nLGZ1bGxzY3JlZW46J1tkYXRhLXBseXI9XCJmdWxsc2NyZWVuXCJdJyxwaXA6J1tkYXRhLXBseXI9XCJwaXBcIl0nLGFpcnBsYXk6J1tkYXRhLXBseXI9XCJhaXJwbGF5XCJdJyxzZXR0aW5nczonW2RhdGEtcGx5cj1cInNldHRpbmdzXCJdJyxsb29wOidbZGF0YS1wbHlyPVwibG9vcFwiXSd9LGlucHV0czp7c2VlazonW2RhdGEtcGx5cj1cInNlZWtcIl0nLHZvbHVtZTonW2RhdGEtcGx5cj1cInZvbHVtZVwiXScsc3BlZWQ6J1tkYXRhLXBseXI9XCJzcGVlZFwiXScsbGFuZ3VhZ2U6J1tkYXRhLXBseXI9XCJsYW5ndWFnZVwiXScscXVhbGl0eTonW2RhdGEtcGx5cj1cInF1YWxpdHlcIl0nfSxkaXNwbGF5OntjdXJyZW50VGltZTpcIi5wbHlyX190aW1lLS1jdXJyZW50XCIsZHVyYXRpb246XCIucGx5cl9fdGltZS0tZHVyYXRpb25cIixidWZmZXI6XCIucGx5cl9fcHJvZ3Jlc3NfX2J1ZmZlclwiLGxvb3A6XCIucGx5cl9fcHJvZ3Jlc3NfX2xvb3BcIix2b2x1bWU6XCIucGx5cl9fdm9sdW1lLS1kaXNwbGF5XCJ9LHByb2dyZXNzOlwiLnBseXJfX3Byb2dyZXNzXCIsY2FwdGlvbnM6XCIucGx5cl9fY2FwdGlvbnNcIixjYXB0aW9uOlwiLnBseXJfX2NhcHRpb25cIn0sY2xhc3NOYW1lczp7dHlwZTpcInBseXItLXswfVwiLHByb3ZpZGVyOlwicGx5ci0tezB9XCIsdmlkZW86XCJwbHlyX192aWRlby13cmFwcGVyXCIsZW1iZWQ6XCJwbHlyX192aWRlby1lbWJlZFwiLHZpZGVvRml4ZWRSYXRpbzpcInBseXJfX3ZpZGVvLXdyYXBwZXItLWZpeGVkLXJhdGlvXCIsZW1iZWRDb250YWluZXI6XCJwbHlyX192aWRlby1lbWJlZF9fY29udGFpbmVyXCIscG9zdGVyOlwicGx5cl9fcG9zdGVyXCIscG9zdGVyRW5hYmxlZDpcInBseXJfX3Bvc3Rlci1lbmFibGVkXCIsYWRzOlwicGx5cl9fYWRzXCIsY29udHJvbDpcInBseXJfX2NvbnRyb2xcIixjb250cm9sUHJlc3NlZDpcInBseXJfX2NvbnRyb2wtLXByZXNzZWRcIixwbGF5aW5nOlwicGx5ci0tcGxheWluZ1wiLHBhdXNlZDpcInBseXItLXBhdXNlZFwiLHN0b3BwZWQ6XCJwbHlyLS1zdG9wcGVkXCIsbG9hZGluZzpcInBseXItLWxvYWRpbmdcIixob3ZlcjpcInBseXItLWhvdmVyXCIsdG9vbHRpcDpcInBseXJfX3Rvb2x0aXBcIixjdWVzOlwicGx5cl9fY3Vlc1wiLG1hcmtlcjpcInBseXJfX3Byb2dyZXNzX19tYXJrZXJcIixoaWRkZW46XCJwbHlyX19zci1vbmx5XCIsaGlkZUNvbnRyb2xzOlwicGx5ci0taGlkZS1jb250cm9sc1wiLGlzSW9zOlwicGx5ci0taXMtaW9zXCIsaXNUb3VjaDpcInBseXItLWlzLXRvdWNoXCIsdWlTdXBwb3J0ZWQ6XCJwbHlyLS1mdWxsLXVpXCIsbm9UcmFuc2l0aW9uOlwicGx5ci0tbm8tdHJhbnNpdGlvblwiLGRpc3BsYXk6e3RpbWU6XCJwbHlyX190aW1lXCJ9LG1lbnU6e3ZhbHVlOlwicGx5cl9fbWVudV9fdmFsdWVcIixiYWRnZTpcInBseXJfX2JhZGdlXCIsb3BlbjpcInBseXItLW1lbnUtb3BlblwifSxjYXB0aW9uczp7ZW5hYmxlZDpcInBseXItLWNhcHRpb25zLWVuYWJsZWRcIixhY3RpdmU6XCJwbHlyLS1jYXB0aW9ucy1hY3RpdmVcIn0sZnVsbHNjcmVlbjp7ZW5hYmxlZDpcInBseXItLWZ1bGxzY3JlZW4tZW5hYmxlZFwiLGZhbGxiYWNrOlwicGx5ci0tZnVsbHNjcmVlbi1mYWxsYmFja1wifSxwaXA6e3N1cHBvcnRlZDpcInBseXItLXBpcC1zdXBwb3J0ZWRcIixhY3RpdmU6XCJwbHlyLS1waXAtYWN0aXZlXCJ9LGFpcnBsYXk6e3N1cHBvcnRlZDpcInBseXItLWFpcnBsYXktc3VwcG9ydGVkXCIsYWN0aXZlOlwicGx5ci0tYWlycGxheS1hY3RpdmVcIn0sdGFiRm9jdXM6XCJwbHlyX190YWItZm9jdXNcIixwcmV2aWV3VGh1bWJuYWlsczp7dGh1bWJDb250YWluZXI6XCJwbHlyX19wcmV2aWV3LXRodW1iXCIsdGh1bWJDb250YWluZXJTaG93bjpcInBseXJfX3ByZXZpZXctdGh1bWItLWlzLXNob3duXCIsaW1hZ2VDb250YWluZXI6XCJwbHlyX19wcmV2aWV3LXRodW1iX19pbWFnZS1jb250YWluZXJcIix0aW1lQ29udGFpbmVyOlwicGx5cl9fcHJldmlldy10aHVtYl9fdGltZS1jb250YWluZXJcIixzY3J1YmJpbmdDb250YWluZXI6XCJwbHlyX19wcmV2aWV3LXNjcnViYmluZ1wiLHNjcnViYmluZ0NvbnRhaW5lclNob3duOlwicGx5cl9fcHJldmlldy1zY3J1YmJpbmctLWlzLXNob3duXCJ9fSxhdHRyaWJ1dGVzOntlbWJlZDp7cHJvdmlkZXI6XCJkYXRhLXBseXItcHJvdmlkZXJcIixpZDpcImRhdGEtcGx5ci1lbWJlZC1pZFwiLGhhc2g6XCJkYXRhLXBseXItZW1iZWQtaGFzaFwifX0sYWRzOntlbmFibGVkOiExLHB1Ymxpc2hlcklkOlwiXCIsdGFnVXJsOlwiXCJ9LHByZXZpZXdUaHVtYm5haWxzOntlbmFibGVkOiExLHNyYzpcIlwifSx2aW1lbzp7YnlsaW5lOiExLHBvcnRyYWl0OiExLHRpdGxlOiExLHNwZWVkOiEwLHRyYW5zcGFyZW50OiExLGN1c3RvbUNvbnRyb2xzOiEwLHJlZmVycmVyUG9saWN5Om51bGwscHJlbWl1bTohMX0seW91dHViZTp7cmVsOjAsc2hvd2luZm86MCxpdl9sb2FkX3BvbGljeTozLG1vZGVzdGJyYW5kaW5nOjEsY3VzdG9tQ29udHJvbHM6ITAsbm9Db29raWU6ITF9LG1lZGlhTWV0YWRhdGE6e3RpdGxlOlwiXCIsYXJ0aXN0OlwiXCIsYWxidW06XCJcIixhcnR3b3JrOltdfSxtYXJrZXJzOntlbmFibGVkOiExLHBvaW50czpbXX19LFhlPVwicGljdHVyZS1pbi1waWN0dXJlXCIsSmU9XCJpbmxpbmVcIixHZT17aHRtbDU6XCJodG1sNVwiLHlvdXR1YmU6XCJ5b3V0dWJlXCIsdmltZW86XCJ2aW1lb1wifSxaZT1cImF1ZGlvXCIsZXQ9XCJ2aWRlb1wiO2NvbnN0IHR0PSgpPT57fTtjbGFzcyBpdHtjb25zdHJ1Y3RvcihlPSExKXt0aGlzLmVuYWJsZWQ9d2luZG93LmNvbnNvbGUmJmUsdGhpcy5lbmFibGVkJiZ0aGlzLmxvZyhcIkRlYnVnZ2luZyBlbmFibGVkXCIpfWdldCBsb2coKXtyZXR1cm4gdGhpcy5lbmFibGVkP0Z1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmNhbGwoY29uc29sZS5sb2csY29uc29sZSk6dHR9Z2V0IHdhcm4oKXtyZXR1cm4gdGhpcy5lbmFibGVkP0Z1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmNhbGwoY29uc29sZS53YXJuLGNvbnNvbGUpOnR0fWdldCBlcnJvcigpe3JldHVybiB0aGlzLmVuYWJsZWQ/RnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuY2FsbChjb25zb2xlLmVycm9yLGNvbnNvbGUpOnR0fX1jbGFzcyBzdHtjb25zdHJ1Y3Rvcih0KXtlKHRoaXMsXCJvbkNoYW5nZVwiLCgoKT0+e2lmKCF0aGlzLmVuYWJsZWQpcmV0dXJuO2NvbnN0IGU9dGhpcy5wbGF5ZXIuZWxlbWVudHMuYnV0dG9ucy5mdWxsc2NyZWVuO0goZSkmJihlLnByZXNzZWQ9dGhpcy5hY3RpdmUpO2NvbnN0IHQ9dGhpcy50YXJnZXQ9PT10aGlzLnBsYXllci5tZWRpYT90aGlzLnRhcmdldDp0aGlzLnBsYXllci5lbGVtZW50cy5jb250YWluZXI7dmUuY2FsbCh0aGlzLnBsYXllcix0LHRoaXMuYWN0aXZlP1wiZW50ZXJmdWxsc2NyZWVuXCI6XCJleGl0ZnVsbHNjcmVlblwiLCEwKX0pKSxlKHRoaXMsXCJ0b2dnbGVGYWxsYmFja1wiLCgoZT0hMSk9PntpZihlP3RoaXMuc2Nyb2xsUG9zaXRpb249e3g6d2luZG93LnNjcm9sbFh8fDAseTp3aW5kb3cuc2Nyb2xsWXx8MH06d2luZG93LnNjcm9sbFRvKHRoaXMuc2Nyb2xsUG9zaXRpb24ueCx0aGlzLnNjcm9sbFBvc2l0aW9uLnkpLGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3c9ZT9cImhpZGRlblwiOlwiXCIsbGUodGhpcy50YXJnZXQsdGhpcy5wbGF5ZXIuY29uZmlnLmNsYXNzTmFtZXMuZnVsbHNjcmVlbi5mYWxsYmFjayxlKSxZLmlzSW9zKXtsZXQgdD1kb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cInZpZXdwb3J0XCJdJyk7Y29uc3QgaT1cInZpZXdwb3J0LWZpdD1jb3ZlclwiO3R8fCh0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJtZXRhXCIpLHQuc2V0QXR0cmlidXRlKFwibmFtZVwiLFwidmlld3BvcnRcIikpO2NvbnN0IHM9Xyh0LmNvbnRlbnQpJiZ0LmNvbnRlbnQuaW5jbHVkZXMoaSk7ZT8odGhpcy5jbGVhbnVwVmlld3BvcnQ9IXMsc3x8KHQuY29udGVudCs9YCwke2l9YCkpOnRoaXMuY2xlYW51cFZpZXdwb3J0JiYodC5jb250ZW50PXQuY29udGVudC5zcGxpdChcIixcIikuZmlsdGVyKChlPT5lLnRyaW0oKSE9PWkpKS5qb2luKFwiLFwiKSl9dGhpcy5vbkNoYW5nZSgpfSkpLGUodGhpcyxcInRyYXBGb2N1c1wiLChlPT57aWYoWS5pc0lvc3x8IXRoaXMuYWN0aXZlfHxcIlRhYlwiIT09ZS5rZXkpcmV0dXJuO2NvbnN0IHQ9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCxpPWNlLmNhbGwodGhpcy5wbGF5ZXIsXCJhW2hyZWZdLCBidXR0b246bm90KDpkaXNhYmxlZCksIGlucHV0Om5vdCg6ZGlzYWJsZWQpLCBbdGFiaW5kZXhdXCIpLFtzXT1pLG49aVtpLmxlbmd0aC0xXTt0IT09bnx8ZS5zaGlmdEtleT90PT09cyYmZS5zaGlmdEtleSYmKG4uZm9jdXMoKSxlLnByZXZlbnREZWZhdWx0KCkpOihzLmZvY3VzKCksZS5wcmV2ZW50RGVmYXVsdCgpKX0pKSxlKHRoaXMsXCJ1cGRhdGVcIiwoKCk9PntpZih0aGlzLmVuYWJsZWQpe2xldCBlO2U9dGhpcy5mb3JjZUZhbGxiYWNrP1wiRmFsbGJhY2sgKGZvcmNlZClcIjpzdC5uYXRpdmU/XCJOYXRpdmVcIjpcIkZhbGxiYWNrXCIsdGhpcy5wbGF5ZXIuZGVidWcubG9nKGAke2V9IGZ1bGxzY3JlZW4gZW5hYmxlZGApfWVsc2UgdGhpcy5wbGF5ZXIuZGVidWcubG9nKFwiRnVsbHNjcmVlbiBub3Qgc3VwcG9ydGVkIGFuZCBmYWxsYmFjayBkaXNhYmxlZFwiKTtsZSh0aGlzLnBsYXllci5lbGVtZW50cy5jb250YWluZXIsdGhpcy5wbGF5ZXIuY29uZmlnLmNsYXNzTmFtZXMuZnVsbHNjcmVlbi5lbmFibGVkLHRoaXMuZW5hYmxlZCl9KSksZSh0aGlzLFwiZW50ZXJcIiwoKCk9Pnt0aGlzLmVuYWJsZWQmJihZLmlzSW9zJiZ0aGlzLnBsYXllci5jb25maWcuZnVsbHNjcmVlbi5pb3NOYXRpdmU/dGhpcy5wbGF5ZXIuaXNWaW1lbz90aGlzLnBsYXllci5lbWJlZC5yZXF1ZXN0RnVsbHNjcmVlbigpOnRoaXMudGFyZ2V0LndlYmtpdEVudGVyRnVsbHNjcmVlbigpOiFzdC5uYXRpdmV8fHRoaXMuZm9yY2VGYWxsYmFjaz90aGlzLnRvZ2dsZUZhbGxiYWNrKCEwKTp0aGlzLnByZWZpeD9XKHRoaXMucHJlZml4KXx8dGhpcy50YXJnZXRbYCR7dGhpcy5wcmVmaXh9UmVxdWVzdCR7dGhpcy5wcm9wZXJ0eX1gXSgpOnRoaXMudGFyZ2V0LnJlcXVlc3RGdWxsc2NyZWVuKHtuYXZpZ2F0aW9uVUk6XCJoaWRlXCJ9KSl9KSksZSh0aGlzLFwiZXhpdFwiLCgoKT0+e2lmKHRoaXMuZW5hYmxlZClpZihZLmlzSW9zJiZ0aGlzLnBsYXllci5jb25maWcuZnVsbHNjcmVlbi5pb3NOYXRpdmUpdGhpcy50YXJnZXQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKSxrZSh0aGlzLnBsYXllci5wbGF5KCkpO2Vsc2UgaWYoIXN0Lm5hdGl2ZXx8dGhpcy5mb3JjZUZhbGxiYWNrKXRoaXMudG9nZ2xlRmFsbGJhY2soITEpO2Vsc2UgaWYodGhpcy5wcmVmaXgpe2lmKCFXKHRoaXMucHJlZml4KSl7Y29uc3QgZT1cIm1velwiPT09dGhpcy5wcmVmaXg/XCJDYW5jZWxcIjpcIkV4aXRcIjtkb2N1bWVudFtgJHt0aGlzLnByZWZpeH0ke2V9JHt0aGlzLnByb3BlcnR5fWBdKCl9fWVsc2UoZG9jdW1lbnQuY2FuY2VsRnVsbFNjcmVlbnx8ZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pLmNhbGwoZG9jdW1lbnQpfSkpLGUodGhpcyxcInRvZ2dsZVwiLCgoKT0+e3RoaXMuYWN0aXZlP3RoaXMuZXhpdCgpOnRoaXMuZW50ZXIoKX0pKSx0aGlzLnBsYXllcj10LHRoaXMucHJlZml4PXN0LnByZWZpeCx0aGlzLnByb3BlcnR5PXN0LnByb3BlcnR5LHRoaXMuc2Nyb2xsUG9zaXRpb249e3g6MCx5OjB9LHRoaXMuZm9yY2VGYWxsYmFjaz1cImZvcmNlXCI9PT10LmNvbmZpZy5mdWxsc2NyZWVuLmZhbGxiYWNrLHRoaXMucGxheWVyLmVsZW1lbnRzLmZ1bGxzY3JlZW49dC5jb25maWcuZnVsbHNjcmVlbi5jb250YWluZXImJmZ1bmN0aW9uKGUsdCl7Y29uc3R7cHJvdG90eXBlOml9PUVsZW1lbnQ7cmV0dXJuKGkuY2xvc2VzdHx8ZnVuY3Rpb24oKXtsZXQgZT10aGlzO2Rve2lmKHJlLm1hdGNoZXMoZSx0KSlyZXR1cm4gZTtlPWUucGFyZW50RWxlbWVudHx8ZS5wYXJlbnROb2RlfXdoaWxlKG51bGwhPT1lJiYxPT09ZS5ub2RlVHlwZSk7cmV0dXJuIG51bGx9KS5jYWxsKGUsdCl9KHRoaXMucGxheWVyLmVsZW1lbnRzLmNvbnRhaW5lcix0LmNvbmZpZy5mdWxsc2NyZWVuLmNvbnRhaW5lciksZmUuY2FsbCh0aGlzLnBsYXllcixkb2N1bWVudCxcIm1zXCI9PT10aGlzLnByZWZpeD9cIk1TRnVsbHNjcmVlbkNoYW5nZVwiOmAke3RoaXMucHJlZml4fWZ1bGxzY3JlZW5jaGFuZ2VgLCgoKT0+e3RoaXMub25DaGFuZ2UoKX0pKSxmZS5jYWxsKHRoaXMucGxheWVyLHRoaXMucGxheWVyLmVsZW1lbnRzLmNvbnRhaW5lcixcImRibGNsaWNrXCIsKGU9PntIKHRoaXMucGxheWVyLmVsZW1lbnRzLmNvbnRyb2xzKSYmdGhpcy5wbGF5ZXIuZWxlbWVudHMuY29udHJvbHMuY29udGFpbnMoZS50YXJnZXQpfHx0aGlzLnBsYXllci5saXN0ZW5lcnMucHJveHkoZSx0aGlzLnRvZ2dsZSxcImZ1bGxzY3JlZW5cIil9KSksZmUuY2FsbCh0aGlzLHRoaXMucGxheWVyLmVsZW1lbnRzLmNvbnRhaW5lcixcImtleWRvd25cIiwoZT0+dGhpcy50cmFwRm9jdXMoZSkpKSx0aGlzLnVwZGF0ZSgpfXN0YXRpYyBnZXQgbmF0aXZlKCl7cmV0dXJuISEoZG9jdW1lbnQuZnVsbHNjcmVlbkVuYWJsZWR8fGRvY3VtZW50LndlYmtpdEZ1bGxzY3JlZW5FbmFibGVkfHxkb2N1bWVudC5tb3pGdWxsU2NyZWVuRW5hYmxlZHx8ZG9jdW1lbnQubXNGdWxsc2NyZWVuRW5hYmxlZCl9Z2V0IHVzaW5nTmF0aXZlKCl7cmV0dXJuIHN0Lm5hdGl2ZSYmIXRoaXMuZm9yY2VGYWxsYmFja31zdGF0aWMgZ2V0IHByZWZpeCgpe2lmKGooZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pKXJldHVyblwiXCI7bGV0IGU9XCJcIjtyZXR1cm5bXCJ3ZWJraXRcIixcIm1velwiLFwibXNcIl0uc29tZSgodD0+ISghaihkb2N1bWVudFtgJHt0fUV4aXRGdWxsc2NyZWVuYF0pJiYhaihkb2N1bWVudFtgJHt0fUNhbmNlbEZ1bGxTY3JlZW5gXSkpJiYoZT10LCEwKSkpLGV9c3RhdGljIGdldCBwcm9wZXJ0eSgpe3JldHVyblwibW96XCI9PT10aGlzLnByZWZpeD9cIkZ1bGxTY3JlZW5cIjpcIkZ1bGxzY3JlZW5cIn1nZXQgZW5hYmxlZCgpe3JldHVybihzdC5uYXRpdmV8fHRoaXMucGxheWVyLmNvbmZpZy5mdWxsc2NyZWVuLmZhbGxiYWNrKSYmdGhpcy5wbGF5ZXIuY29uZmlnLmZ1bGxzY3JlZW4uZW5hYmxlZCYmdGhpcy5wbGF5ZXIuc3VwcG9ydGVkLnVpJiZ0aGlzLnBsYXllci5pc1ZpZGVvfWdldCBhY3RpdmUoKXtpZighdGhpcy5lbmFibGVkKXJldHVybiExO2lmKCFzdC5uYXRpdmV8fHRoaXMuZm9yY2VGYWxsYmFjaylyZXR1cm4gb2UodGhpcy50YXJnZXQsdGhpcy5wbGF5ZXIuY29uZmlnLmNsYXNzTmFtZXMuZnVsbHNjcmVlbi5mYWxsYmFjayk7Y29uc3QgZT10aGlzLnByZWZpeD90aGlzLnRhcmdldC5nZXRSb290Tm9kZSgpW2Ake3RoaXMucHJlZml4fSR7dGhpcy5wcm9wZXJ0eX1FbGVtZW50YF06dGhpcy50YXJnZXQuZ2V0Um9vdE5vZGUoKS5mdWxsc2NyZWVuRWxlbWVudDtyZXR1cm4gZSYmZS5zaGFkb3dSb290P2U9PT10aGlzLnRhcmdldC5nZXRSb290Tm9kZSgpLmhvc3Q6ZT09PXRoaXMudGFyZ2V0fWdldCB0YXJnZXQoKXtyZXR1cm4gWS5pc0lvcyYmdGhpcy5wbGF5ZXIuY29uZmlnLmZ1bGxzY3JlZW4uaW9zTmF0aXZlP3RoaXMucGxheWVyLm1lZGlhOnRoaXMucGxheWVyLmVsZW1lbnRzLmZ1bGxzY3JlZW58fHRoaXMucGxheWVyLmVsZW1lbnRzLmNvbnRhaW5lcn19ZnVuY3Rpb24gbnQoZSx0PTEpe3JldHVybiBuZXcgUHJvbWlzZSgoKGkscyk9Pntjb25zdCBuPW5ldyBJbWFnZSxhPSgpPT57ZGVsZXRlIG4ub25sb2FkLGRlbGV0ZSBuLm9uZXJyb3IsKG4ubmF0dXJhbFdpZHRoPj10P2k6cykobil9O09iamVjdC5hc3NpZ24obix7b25sb2FkOmEsb25lcnJvcjphLHNyYzplfSl9KSl9Y29uc3QgYXQ9e2FkZFN0eWxlSG9vaygpe2xlKHRoaXMuZWxlbWVudHMuY29udGFpbmVyLHRoaXMuY29uZmlnLnNlbGVjdG9ycy5jb250YWluZXIucmVwbGFjZShcIi5cIixcIlwiKSwhMCksbGUodGhpcy5lbGVtZW50cy5jb250YWluZXIsdGhpcy5jb25maWcuY2xhc3NOYW1lcy51aVN1cHBvcnRlZCx0aGlzLnN1cHBvcnRlZC51aSl9LHRvZ2dsZU5hdGl2ZUNvbnRyb2xzKGU9ITEpe2UmJnRoaXMuaXNIVE1MNT90aGlzLm1lZGlhLnNldEF0dHJpYnV0ZShcImNvbnRyb2xzXCIsXCJcIik6dGhpcy5tZWRpYS5yZW1vdmVBdHRyaWJ1dGUoXCJjb250cm9sc1wiKX0sYnVpbGQoKXtpZih0aGlzLmxpc3RlbmVycy5tZWRpYSgpLCF0aGlzLnN1cHBvcnRlZC51aSlyZXR1cm4gdGhpcy5kZWJ1Zy53YXJuKGBCYXNpYyBzdXBwb3J0IG9ubHkgZm9yICR7dGhpcy5wcm92aWRlcn0gJHt0aGlzLnR5cGV9YCksdm9pZCBhdC50b2dnbGVOYXRpdmVDb250cm9scy5jYWxsKHRoaXMsITApO0godGhpcy5lbGVtZW50cy5jb250cm9scyl8fChXZS5pbmplY3QuY2FsbCh0aGlzKSx0aGlzLmxpc3RlbmVycy5jb250cm9scygpKSxhdC50b2dnbGVOYXRpdmVDb250cm9scy5jYWxsKHRoaXMpLHRoaXMuaXNIVE1MNSYmWWUuc2V0dXAuY2FsbCh0aGlzKSx0aGlzLnZvbHVtZT1udWxsLHRoaXMubXV0ZWQ9bnVsbCx0aGlzLmxvb3A9bnVsbCx0aGlzLnF1YWxpdHk9bnVsbCx0aGlzLnNwZWVkPW51bGwsV2UudXBkYXRlVm9sdW1lLmNhbGwodGhpcyksV2UudGltZVVwZGF0ZS5jYWxsKHRoaXMpLFdlLmR1cmF0aW9uVXBkYXRlLmNhbGwodGhpcyksYXQuY2hlY2tQbGF5aW5nLmNhbGwodGhpcyksbGUodGhpcy5lbGVtZW50cy5jb250YWluZXIsdGhpcy5jb25maWcuY2xhc3NOYW1lcy5waXAuc3VwcG9ydGVkLG1lLnBpcCYmdGhpcy5pc0hUTUw1JiZ0aGlzLmlzVmlkZW8pLGxlKHRoaXMuZWxlbWVudHMuY29udGFpbmVyLHRoaXMuY29uZmlnLmNsYXNzTmFtZXMuYWlycGxheS5zdXBwb3J0ZWQsbWUuYWlycGxheSYmdGhpcy5pc0hUTUw1KSxsZSh0aGlzLmVsZW1lbnRzLmNvbnRhaW5lcix0aGlzLmNvbmZpZy5jbGFzc05hbWVzLmlzSW9zLFkuaXNJb3MpLGxlKHRoaXMuZWxlbWVudHMuY29udGFpbmVyLHRoaXMuY29uZmlnLmNsYXNzTmFtZXMuaXNUb3VjaCx0aGlzLnRvdWNoKSx0aGlzLnJlYWR5PSEwLHNldFRpbWVvdXQoKCgpPT57dmUuY2FsbCh0aGlzLHRoaXMubWVkaWEsXCJyZWFkeVwiKX0pLDApLGF0LnNldFRpdGxlLmNhbGwodGhpcyksdGhpcy5wb3N0ZXImJmF0LnNldFBvc3Rlci5jYWxsKHRoaXMsdGhpcy5wb3N0ZXIsITEpLmNhdGNoKCgoKT0+e30pKSx0aGlzLmNvbmZpZy5kdXJhdGlvbiYmV2UuZHVyYXRpb25VcGRhdGUuY2FsbCh0aGlzKSx0aGlzLmNvbmZpZy5tZWRpYU1ldGFkYXRhJiZXZS5zZXRNZWRpYU1ldGFkYXRhLmNhbGwodGhpcyl9LHNldFRpdGxlKCl7bGV0IGU9SGUuZ2V0KFwicGxheVwiLHRoaXMuY29uZmlnKTtpZihfKHRoaXMuY29uZmlnLnRpdGxlKSYmIVcodGhpcy5jb25maWcudGl0bGUpJiYoZSs9YCwgJHt0aGlzLmNvbmZpZy50aXRsZX1gKSxBcnJheS5mcm9tKHRoaXMuZWxlbWVudHMuYnV0dG9ucy5wbGF5fHxbXSkuZm9yRWFjaCgodD0+e3Quc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLGUpfSkpLHRoaXMuaXNFbWJlZCl7Y29uc3QgZT1oZS5jYWxsKHRoaXMsXCJpZnJhbWVcIik7aWYoIUgoZSkpcmV0dXJuO2NvbnN0IHQ9Vyh0aGlzLmNvbmZpZy50aXRsZSk/XCJ2aWRlb1wiOnRoaXMuY29uZmlnLnRpdGxlLGk9SGUuZ2V0KFwiZnJhbWVUaXRsZVwiLHRoaXMuY29uZmlnKTtlLnNldEF0dHJpYnV0ZShcInRpdGxlXCIsaS5yZXBsYWNlKFwie3RpdGxlfVwiLHQpKX19LHRvZ2dsZVBvc3RlcihlKXtsZSh0aGlzLmVsZW1lbnRzLmNvbnRhaW5lcix0aGlzLmNvbmZpZy5jbGFzc05hbWVzLnBvc3RlckVuYWJsZWQsZSl9LHNldFBvc3RlcihlLHQ9ITApe3JldHVybiB0JiZ0aGlzLnBvc3Rlcj9Qcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJQb3N0ZXIgYWxyZWFkeSBzZXRcIikpOih0aGlzLm1lZGlhLnNldEF0dHJpYnV0ZShcImRhdGEtcG9zdGVyXCIsZSksdGhpcy5lbGVtZW50cy5wb3N0ZXIucmVtb3ZlQXR0cmlidXRlKFwiaGlkZGVuXCIpLFRlLmNhbGwodGhpcykudGhlbigoKCk9Pm50KGUpKSkuY2F0Y2goKHQ9Pnt0aHJvdyBlPT09dGhpcy5wb3N0ZXImJmF0LnRvZ2dsZVBvc3Rlci5jYWxsKHRoaXMsITEpLHR9KSkudGhlbigoKCk9PntpZihlIT09dGhpcy5wb3N0ZXIpdGhyb3cgbmV3IEVycm9yKFwic2V0UG9zdGVyIGNhbmNlbGxlZCBieSBsYXRlciBjYWxsIHRvIHNldFBvc3RlclwiKX0pKS50aGVuKCgoKT0+KE9iamVjdC5hc3NpZ24odGhpcy5lbGVtZW50cy5wb3N0ZXIuc3R5bGUse2JhY2tncm91bmRJbWFnZTpgdXJsKCcke2V9JylgLGJhY2tncm91bmRTaXplOlwiXCJ9KSxhdC50b2dnbGVQb3N0ZXIuY2FsbCh0aGlzLCEwKSxlKSkpKX0sY2hlY2tQbGF5aW5nKGUpe2xlKHRoaXMuZWxlbWVudHMuY29udGFpbmVyLHRoaXMuY29uZmlnLmNsYXNzTmFtZXMucGxheWluZyx0aGlzLnBsYXlpbmcpLGxlKHRoaXMuZWxlbWVudHMuY29udGFpbmVyLHRoaXMuY29uZmlnLmNsYXNzTmFtZXMucGF1c2VkLHRoaXMucGF1c2VkKSxsZSh0aGlzLmVsZW1lbnRzLmNvbnRhaW5lcix0aGlzLmNvbmZpZy5jbGFzc05hbWVzLnN0b3BwZWQsdGhpcy5zdG9wcGVkKSxBcnJheS5mcm9tKHRoaXMuZWxlbWVudHMuYnV0dG9ucy5wbGF5fHxbXSkuZm9yRWFjaCgoZT0+e09iamVjdC5hc3NpZ24oZSx7cHJlc3NlZDp0aGlzLnBsYXlpbmd9KSxlLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIixIZS5nZXQodGhpcy5wbGF5aW5nP1wicGF1c2VcIjpcInBsYXlcIix0aGlzLmNvbmZpZykpfSkpLFIoZSkmJlwidGltZXVwZGF0ZVwiPT09ZS50eXBlfHxhdC50b2dnbGVDb250cm9scy5jYWxsKHRoaXMpfSxjaGVja0xvYWRpbmcoZSl7dGhpcy5sb2FkaW5nPVtcInN0YWxsZWRcIixcIndhaXRpbmdcIl0uaW5jbHVkZXMoZS50eXBlKSxjbGVhclRpbWVvdXQodGhpcy50aW1lcnMubG9hZGluZyksdGhpcy50aW1lcnMubG9hZGluZz1zZXRUaW1lb3V0KCgoKT0+e2xlKHRoaXMuZWxlbWVudHMuY29udGFpbmVyLHRoaXMuY29uZmlnLmNsYXNzTmFtZXMubG9hZGluZyx0aGlzLmxvYWRpbmcpLGF0LnRvZ2dsZUNvbnRyb2xzLmNhbGwodGhpcyl9KSx0aGlzLmxvYWRpbmc/MjUwOjApfSx0b2dnbGVDb250cm9scyhlKXtjb25zdHtjb250cm9sczp0fT10aGlzLmVsZW1lbnRzO2lmKHQmJnRoaXMuY29uZmlnLmhpZGVDb250cm9scyl7Y29uc3QgaT10aGlzLnRvdWNoJiZ0aGlzLmxhc3RTZWVrVGltZSsyZTM+RGF0ZS5ub3coKTt0aGlzLnRvZ2dsZUNvbnRyb2xzKEJvb2xlYW4oZXx8dGhpcy5sb2FkaW5nfHx0aGlzLnBhdXNlZHx8dC5wcmVzc2VkfHx0LmhvdmVyfHxpKSl9fSxtaWdyYXRlU3R5bGVzKCl7T2JqZWN0LnZhbHVlcyh7Li4udGhpcy5tZWRpYS5zdHlsZX0pLmZpbHRlcigoZT0+IVcoZSkmJl8oZSkmJmUuc3RhcnRzV2l0aChcIi0tcGx5clwiKSkpLmZvckVhY2goKGU9Pnt0aGlzLmVsZW1lbnRzLmNvbnRhaW5lci5zdHlsZS5zZXRQcm9wZXJ0eShlLHRoaXMubWVkaWEuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShlKSksdGhpcy5tZWRpYS5zdHlsZS5yZW1vdmVQcm9wZXJ0eShlKX0pKSxXKHRoaXMubWVkaWEuc3R5bGUpJiZ0aGlzLm1lZGlhLnJlbW92ZUF0dHJpYnV0ZShcInN0eWxlXCIpfX07Y2xhc3MgbHR7Y29uc3RydWN0b3IodCl7ZSh0aGlzLFwiZmlyc3RUb3VjaFwiLCgoKT0+e2NvbnN0e3BsYXllcjplfT10aGlzLHtlbGVtZW50czp0fT1lO2UudG91Y2g9ITAsbGUodC5jb250YWluZXIsZS5jb25maWcuY2xhc3NOYW1lcy5pc1RvdWNoLCEwKX0pKSxlKHRoaXMsXCJzZXRUYWJGb2N1c1wiLChlPT57Y29uc3R7cGxheWVyOnR9PXRoaXMse2VsZW1lbnRzOml9PXQse2tleTpzLHR5cGU6bix0aW1lU3RhbXA6YX09ZTtpZihjbGVhclRpbWVvdXQodGhpcy5mb2N1c1RpbWVyKSxcImtleWRvd25cIj09PW4mJlwiVGFiXCIhPT1zKXJldHVybjtcImtleWRvd25cIj09PW4mJih0aGlzLmxhc3RLZXlEb3duPWEpO2NvbnN0IGw9YS10aGlzLmxhc3RLZXlEb3duPD0yMDsoXCJmb2N1c1wiIT09bnx8bCkmJigoKCk9Pntjb25zdCBlPXQuY29uZmlnLmNsYXNzTmFtZXMudGFiRm9jdXM7bGUoY2UuY2FsbCh0LGAuJHtlfWApLGUsITEpfSkoKSxcImZvY3Vzb3V0XCIhPT1uJiYodGhpcy5mb2N1c1RpbWVyPXNldFRpbWVvdXQoKCgpPT57Y29uc3QgZT1kb2N1bWVudC5hY3RpdmVFbGVtZW50O2kuY29udGFpbmVyLmNvbnRhaW5zKGUpJiZsZShkb2N1bWVudC5hY3RpdmVFbGVtZW50LHQuY29uZmlnLmNsYXNzTmFtZXMudGFiRm9jdXMsITApfSksMTApKSl9KSksZSh0aGlzLFwiZ2xvYmFsXCIsKChlPSEwKT0+e2NvbnN0e3BsYXllcjp0fT10aGlzO3QuY29uZmlnLmtleWJvYXJkLmdsb2JhbCYmZ2UuY2FsbCh0LHdpbmRvdyxcImtleWRvd24ga2V5dXBcIix0aGlzLmhhbmRsZUtleSxlLCExKSxnZS5jYWxsKHQsZG9jdW1lbnQuYm9keSxcImNsaWNrXCIsdGhpcy50b2dnbGVNZW51LGUpLHllLmNhbGwodCxkb2N1bWVudC5ib2R5LFwidG91Y2hzdGFydFwiLHRoaXMuZmlyc3RUb3VjaCksZ2UuY2FsbCh0LGRvY3VtZW50LmJvZHksXCJrZXlkb3duIGZvY3VzIGJsdXIgZm9jdXNvdXRcIix0aGlzLnNldFRhYkZvY3VzLGUsITEsITApfSkpLGUodGhpcyxcImNvbnRhaW5lclwiLCgoKT0+e2NvbnN0e3BsYXllcjplfT10aGlzLHtjb25maWc6dCxlbGVtZW50czppLHRpbWVyczpzfT1lOyF0LmtleWJvYXJkLmdsb2JhbCYmdC5rZXlib2FyZC5mb2N1c2VkJiZmZS5jYWxsKGUsaS5jb250YWluZXIsXCJrZXlkb3duIGtleXVwXCIsdGhpcy5oYW5kbGVLZXksITEpLGZlLmNhbGwoZSxpLmNvbnRhaW5lcixcIm1vdXNlbW92ZSBtb3VzZWxlYXZlIHRvdWNoc3RhcnQgdG91Y2htb3ZlIGVudGVyZnVsbHNjcmVlbiBleGl0ZnVsbHNjcmVlblwiLCh0PT57Y29uc3R7Y29udHJvbHM6bn09aTtuJiZcImVudGVyZnVsbHNjcmVlblwiPT09dC50eXBlJiYobi5wcmVzc2VkPSExLG4uaG92ZXI9ITEpO2xldCBhPTA7W1widG91Y2hzdGFydFwiLFwidG91Y2htb3ZlXCIsXCJtb3VzZW1vdmVcIl0uaW5jbHVkZXModC50eXBlKSYmKGF0LnRvZ2dsZUNvbnRyb2xzLmNhbGwoZSwhMCksYT1lLnRvdWNoPzNlMzoyZTMpLGNsZWFyVGltZW91dChzLmNvbnRyb2xzKSxzLmNvbnRyb2xzPXNldFRpbWVvdXQoKCgpPT5hdC50b2dnbGVDb250cm9scy5jYWxsKGUsITEpKSxhKX0pKTtjb25zdCBuPSgpPT57aWYoIWUuaXNWaW1lb3x8ZS5jb25maWcudmltZW8ucHJlbWl1bSlyZXR1cm47Y29uc3QgdD1pLndyYXBwZXIse2FjdGl2ZTpzfT1lLmZ1bGxzY3JlZW4sW24sYV09TmUuY2FsbChlKSxsPVNlKGBhc3BlY3QtcmF0aW86ICR7bn0gLyAke2F9YCk7aWYoIXMpcmV0dXJuIHZvaWQobD8odC5zdHlsZS53aWR0aD1udWxsLHQuc3R5bGUuaGVpZ2h0PW51bGwpOih0LnN0eWxlLm1heFdpZHRoPW51bGwsdC5zdHlsZS5tYXJnaW49bnVsbCkpO2NvbnN0W28scl09W01hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aHx8MCx3aW5kb3cuaW5uZXJXaWR0aHx8MCksTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodHx8MCx3aW5kb3cuaW5uZXJIZWlnaHR8fDApXSxjPW8vcj5uL2E7bD8odC5zdHlsZS53aWR0aD1jP1wiYXV0b1wiOlwiMTAwJVwiLHQuc3R5bGUuaGVpZ2h0PWM/XCIxMDAlXCI6XCJhdXRvXCIpOih0LnN0eWxlLm1heFdpZHRoPWM/ci9hKm4rXCJweFwiOm51bGwsdC5zdHlsZS5tYXJnaW49Yz9cIjAgYXV0b1wiOm51bGwpfSxhPSgpPT57Y2xlYXJUaW1lb3V0KHMucmVzaXplZCkscy5yZXNpemVkPXNldFRpbWVvdXQobiw1MCl9O2ZlLmNhbGwoZSxpLmNvbnRhaW5lcixcImVudGVyZnVsbHNjcmVlbiBleGl0ZnVsbHNjcmVlblwiLCh0PT57Y29uc3R7dGFyZ2V0OnN9PWUuZnVsbHNjcmVlbjtpZihzIT09aS5jb250YWluZXIpcmV0dXJuO2lmKCFlLmlzRW1iZWQmJlcoZS5jb25maWcucmF0aW8pKXJldHVybjtuKCk7KFwiZW50ZXJmdWxsc2NyZWVuXCI9PT10LnR5cGU/ZmU6YmUpLmNhbGwoZSx3aW5kb3csXCJyZXNpemVcIixhKX0pKX0pKSxlKHRoaXMsXCJtZWRpYVwiLCgoKT0+e2NvbnN0e3BsYXllcjplfT10aGlzLHtlbGVtZW50czp0fT1lO2lmKGZlLmNhbGwoZSxlLm1lZGlhLFwidGltZXVwZGF0ZSBzZWVraW5nIHNlZWtlZFwiLCh0PT5XZS50aW1lVXBkYXRlLmNhbGwoZSx0KSkpLGZlLmNhbGwoZSxlLm1lZGlhLFwiZHVyYXRpb25jaGFuZ2UgbG9hZGVkZGF0YSBsb2FkZWRtZXRhZGF0YVwiLCh0PT5XZS5kdXJhdGlvblVwZGF0ZS5jYWxsKGUsdCkpKSxmZS5jYWxsKGUsZS5tZWRpYSxcImVuZGVkXCIsKCgpPT57ZS5pc0hUTUw1JiZlLmlzVmlkZW8mJmUuY29uZmlnLnJlc2V0T25FbmQmJihlLnJlc3RhcnQoKSxlLnBhdXNlKCkpfSkpLGZlLmNhbGwoZSxlLm1lZGlhLFwicHJvZ3Jlc3MgcGxheWluZyBzZWVraW5nIHNlZWtlZFwiLCh0PT5XZS51cGRhdGVQcm9ncmVzcy5jYWxsKGUsdCkpKSxmZS5jYWxsKGUsZS5tZWRpYSxcInZvbHVtZWNoYW5nZVwiLCh0PT5XZS51cGRhdGVWb2x1bWUuY2FsbChlLHQpKSksZmUuY2FsbChlLGUubWVkaWEsXCJwbGF5aW5nIHBsYXkgcGF1c2UgZW5kZWQgZW1wdGllZCB0aW1ldXBkYXRlXCIsKHQ9PmF0LmNoZWNrUGxheWluZy5jYWxsKGUsdCkpKSxmZS5jYWxsKGUsZS5tZWRpYSxcIndhaXRpbmcgY2FucGxheSBzZWVrZWQgcGxheWluZ1wiLCh0PT5hdC5jaGVja0xvYWRpbmcuY2FsbChlLHQpKSksZS5zdXBwb3J0ZWQudWkmJmUuY29uZmlnLmNsaWNrVG9QbGF5JiYhZS5pc0F1ZGlvKXtjb25zdCBpPWhlLmNhbGwoZSxgLiR7ZS5jb25maWcuY2xhc3NOYW1lcy52aWRlb31gKTtpZighSChpKSlyZXR1cm47ZmUuY2FsbChlLHQuY29udGFpbmVyLFwiY2xpY2tcIiwocz0+eyhbdC5jb250YWluZXIsaV0uaW5jbHVkZXMocy50YXJnZXQpfHxpLmNvbnRhaW5zKHMudGFyZ2V0KSkmJihlLnRvdWNoJiZlLmNvbmZpZy5oaWRlQ29udHJvbHN8fChlLmVuZGVkPyh0aGlzLnByb3h5KHMsZS5yZXN0YXJ0LFwicmVzdGFydFwiKSx0aGlzLnByb3h5KHMsKCgpPT57a2UoZS5wbGF5KCkpfSksXCJwbGF5XCIpKTp0aGlzLnByb3h5KHMsKCgpPT57a2UoZS50b2dnbGVQbGF5KCkpfSksXCJwbGF5XCIpKSl9KSl9ZS5zdXBwb3J0ZWQudWkmJmUuY29uZmlnLmRpc2FibGVDb250ZXh0TWVudSYmZmUuY2FsbChlLHQud3JhcHBlcixcImNvbnRleHRtZW51XCIsKGU9PntlLnByZXZlbnREZWZhdWx0KCl9KSwhMSksZmUuY2FsbChlLGUubWVkaWEsXCJ2b2x1bWVjaGFuZ2VcIiwoKCk9PntlLnN0b3JhZ2Uuc2V0KHt2b2x1bWU6ZS52b2x1bWUsbXV0ZWQ6ZS5tdXRlZH0pfSkpLGZlLmNhbGwoZSxlLm1lZGlhLFwicmF0ZWNoYW5nZVwiLCgoKT0+e1dlLnVwZGF0ZVNldHRpbmcuY2FsbChlLFwic3BlZWRcIiksZS5zdG9yYWdlLnNldCh7c3BlZWQ6ZS5zcGVlZH0pfSkpLGZlLmNhbGwoZSxlLm1lZGlhLFwicXVhbGl0eWNoYW5nZVwiLCh0PT57V2UudXBkYXRlU2V0dGluZy5jYWxsKGUsXCJxdWFsaXR5XCIsbnVsbCx0LmRldGFpbC5xdWFsaXR5KX0pKSxmZS5jYWxsKGUsZS5tZWRpYSxcInJlYWR5IHF1YWxpdHljaGFuZ2VcIiwoKCk9PntXZS5zZXREb3dubG9hZFVybC5jYWxsKGUpfSkpO2NvbnN0IGk9ZS5jb25maWcuZXZlbnRzLmNvbmNhdChbXCJrZXl1cFwiLFwia2V5ZG93blwiXSkuam9pbihcIiBcIik7ZmUuY2FsbChlLGUubWVkaWEsaSwoaT0+e2xldHtkZXRhaWw6cz17fX09aTtcImVycm9yXCI9PT1pLnR5cGUmJihzPWUubWVkaWEuZXJyb3IpLHZlLmNhbGwoZSx0LmNvbnRhaW5lcixpLnR5cGUsITAscyl9KSl9KSksZSh0aGlzLFwicHJveHlcIiwoKGUsdCxpKT0+e2NvbnN0e3BsYXllcjpzfT10aGlzLG49cy5jb25maWcubGlzdGVuZXJzW2ldO2xldCBhPSEwO2oobikmJihhPW4uY2FsbChzLGUpKSwhMSE9PWEmJmoodCkmJnQuY2FsbChzLGUpfSkpLGUodGhpcyxcImJpbmRcIiwoKGUsdCxpLHMsbj0hMCk9Pntjb25zdHtwbGF5ZXI6YX09dGhpcyxsPWEuY29uZmlnLmxpc3RlbmVyc1tzXSxvPWoobCk7ZmUuY2FsbChhLGUsdCwoZT0+dGhpcy5wcm94eShlLGkscykpLG4mJiFvKX0pKSxlKHRoaXMsXCJjb250cm9sc1wiLCgoKT0+e2NvbnN0e3BsYXllcjplfT10aGlzLHtlbGVtZW50czp0fT1lLGk9WS5pc0lFP1wiY2hhbmdlXCI6XCJpbnB1dFwiO2lmKHQuYnV0dG9ucy5wbGF5JiZBcnJheS5mcm9tKHQuYnV0dG9ucy5wbGF5KS5mb3JFYWNoKCh0PT57dGhpcy5iaW5kKHQsXCJjbGlja1wiLCgoKT0+e2tlKGUudG9nZ2xlUGxheSgpKX0pLFwicGxheVwiKX0pKSx0aGlzLmJpbmQodC5idXR0b25zLnJlc3RhcnQsXCJjbGlja1wiLGUucmVzdGFydCxcInJlc3RhcnRcIiksdGhpcy5iaW5kKHQuYnV0dG9ucy5yZXdpbmQsXCJjbGlja1wiLCgoKT0+e2UubGFzdFNlZWtUaW1lPURhdGUubm93KCksZS5yZXdpbmQoKX0pLFwicmV3aW5kXCIpLHRoaXMuYmluZCh0LmJ1dHRvbnMuZmFzdEZvcndhcmQsXCJjbGlja1wiLCgoKT0+e2UubGFzdFNlZWtUaW1lPURhdGUubm93KCksZS5mb3J3YXJkKCl9KSxcImZhc3RGb3J3YXJkXCIpLHRoaXMuYmluZCh0LmJ1dHRvbnMubXV0ZSxcImNsaWNrXCIsKCgpPT57ZS5tdXRlZD0hZS5tdXRlZH0pLFwibXV0ZVwiKSx0aGlzLmJpbmQodC5idXR0b25zLmNhcHRpb25zLFwiY2xpY2tcIiwoKCk9PmUudG9nZ2xlQ2FwdGlvbnMoKSkpLHRoaXMuYmluZCh0LmJ1dHRvbnMuZG93bmxvYWQsXCJjbGlja1wiLCgoKT0+e3ZlLmNhbGwoZSxlLm1lZGlhLFwiZG93bmxvYWRcIil9KSxcImRvd25sb2FkXCIpLHRoaXMuYmluZCh0LmJ1dHRvbnMuZnVsbHNjcmVlbixcImNsaWNrXCIsKCgpPT57ZS5mdWxsc2NyZWVuLnRvZ2dsZSgpfSksXCJmdWxsc2NyZWVuXCIpLHRoaXMuYmluZCh0LmJ1dHRvbnMucGlwLFwiY2xpY2tcIiwoKCk9PntlLnBpcD1cInRvZ2dsZVwifSksXCJwaXBcIiksdGhpcy5iaW5kKHQuYnV0dG9ucy5haXJwbGF5LFwiY2xpY2tcIixlLmFpcnBsYXksXCJhaXJwbGF5XCIpLHRoaXMuYmluZCh0LmJ1dHRvbnMuc2V0dGluZ3MsXCJjbGlja1wiLCh0PT57dC5zdG9wUHJvcGFnYXRpb24oKSx0LnByZXZlbnREZWZhdWx0KCksV2UudG9nZ2xlTWVudS5jYWxsKGUsdCl9KSxudWxsLCExKSx0aGlzLmJpbmQodC5idXR0b25zLnNldHRpbmdzLFwia2V5dXBcIiwodD0+e1tcIlNwYWNlXCIsXCJFbnRlclwiXS5pbmNsdWRlcyh0LmtleSkmJihcIkVudGVyXCIhPT10LmtleT8odC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCksV2UudG9nZ2xlTWVudS5jYWxsKGUsdCkpOldlLmZvY3VzRmlyc3RNZW51SXRlbS5jYWxsKGUsbnVsbCwhMCkpfSksbnVsbCwhMSksdGhpcy5iaW5kKHQuc2V0dGluZ3MubWVudSxcImtleWRvd25cIiwodD0+e1wiRXNjYXBlXCI9PT10LmtleSYmV2UudG9nZ2xlTWVudS5jYWxsKGUsdCl9KSksdGhpcy5iaW5kKHQuaW5wdXRzLnNlZWssXCJtb3VzZWRvd24gbW91c2Vtb3ZlXCIsKGU9Pntjb25zdCBpPXQucHJvZ3Jlc3MuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscz0xMDAvaS53aWR0aCooZS5wYWdlWC1pLmxlZnQpO2UuY3VycmVudFRhcmdldC5zZXRBdHRyaWJ1dGUoXCJzZWVrLXZhbHVlXCIscyl9KSksdGhpcy5iaW5kKHQuaW5wdXRzLnNlZWssXCJtb3VzZWRvd24gbW91c2V1cCBrZXlkb3duIGtleXVwIHRvdWNoc3RhcnQgdG91Y2hlbmRcIiwodD0+e2NvbnN0IGk9dC5jdXJyZW50VGFyZ2V0LHM9XCJwbGF5LW9uLXNlZWtlZFwiO2lmKEYodCkmJiFbXCJBcnJvd0xlZnRcIixcIkFycm93UmlnaHRcIl0uaW5jbHVkZXModC5rZXkpKXJldHVybjtlLmxhc3RTZWVrVGltZT1EYXRlLm5vdygpO2NvbnN0IG49aS5oYXNBdHRyaWJ1dGUocyksYT1bXCJtb3VzZXVwXCIsXCJ0b3VjaGVuZFwiLFwia2V5dXBcIl0uaW5jbHVkZXModC50eXBlKTtuJiZhPyhpLnJlbW92ZUF0dHJpYnV0ZShzKSxrZShlLnBsYXkoKSkpOiFhJiZlLnBsYXlpbmcmJihpLnNldEF0dHJpYnV0ZShzLFwiXCIpLGUucGF1c2UoKSl9KSksWS5pc0lvcyl7Y29uc3QgdD1jZS5jYWxsKGUsJ2lucHV0W3R5cGU9XCJyYW5nZVwiXScpO0FycmF5LmZyb20odCkuZm9yRWFjaCgoZT0+dGhpcy5iaW5kKGUsaSwoZT0+SyhlLnRhcmdldCkpKSkpfXRoaXMuYmluZCh0LmlucHV0cy5zZWVrLGksKHQ9Pntjb25zdCBpPXQuY3VycmVudFRhcmdldDtsZXQgcz1pLmdldEF0dHJpYnV0ZShcInNlZWstdmFsdWVcIik7VyhzKSYmKHM9aS52YWx1ZSksaS5yZW1vdmVBdHRyaWJ1dGUoXCJzZWVrLXZhbHVlXCIpLGUuY3VycmVudFRpbWU9cy9pLm1heCplLmR1cmF0aW9ufSksXCJzZWVrXCIpLHRoaXMuYmluZCh0LnByb2dyZXNzLFwibW91c2VlbnRlciBtb3VzZWxlYXZlIG1vdXNlbW92ZVwiLCh0PT5XZS51cGRhdGVTZWVrVG9vbHRpcC5jYWxsKGUsdCkpKSx0aGlzLmJpbmQodC5wcm9ncmVzcyxcIm1vdXNlbW92ZSB0b3VjaG1vdmVcIiwodD0+e2NvbnN0e3ByZXZpZXdUaHVtYm5haWxzOml9PWU7aSYmaS5sb2FkZWQmJmkuc3RhcnRNb3ZlKHQpfSkpLHRoaXMuYmluZCh0LnByb2dyZXNzLFwibW91c2VsZWF2ZSB0b3VjaGVuZCBjbGlja1wiLCgoKT0+e2NvbnN0e3ByZXZpZXdUaHVtYm5haWxzOnR9PWU7dCYmdC5sb2FkZWQmJnQuZW5kTW92ZSghMSwhMCl9KSksdGhpcy5iaW5kKHQucHJvZ3Jlc3MsXCJtb3VzZWRvd24gdG91Y2hzdGFydFwiLCh0PT57Y29uc3R7cHJldmlld1RodW1ibmFpbHM6aX09ZTtpJiZpLmxvYWRlZCYmaS5zdGFydFNjcnViYmluZyh0KX0pKSx0aGlzLmJpbmQodC5wcm9ncmVzcyxcIm1vdXNldXAgdG91Y2hlbmRcIiwodD0+e2NvbnN0e3ByZXZpZXdUaHVtYm5haWxzOml9PWU7aSYmaS5sb2FkZWQmJmkuZW5kU2NydWJiaW5nKHQpfSkpLFkuaXNXZWJraXQmJkFycmF5LmZyb20oY2UuY2FsbChlLCdpbnB1dFt0eXBlPVwicmFuZ2VcIl0nKSkuZm9yRWFjaCgodD0+e3RoaXMuYmluZCh0LFwiaW5wdXRcIiwodD0+V2UudXBkYXRlUmFuZ2VGaWxsLmNhbGwoZSx0LnRhcmdldCkpKX0pKSxlLmNvbmZpZy50b2dnbGVJbnZlcnQmJiFIKHQuZGlzcGxheS5kdXJhdGlvbikmJnRoaXMuYmluZCh0LmRpc3BsYXkuY3VycmVudFRpbWUsXCJjbGlja1wiLCgoKT0+ezAhPT1lLmN1cnJlbnRUaW1lJiYoZS5jb25maWcuaW52ZXJ0VGltZT0hZS5jb25maWcuaW52ZXJ0VGltZSxXZS50aW1lVXBkYXRlLmNhbGwoZSkpfSkpLHRoaXMuYmluZCh0LmlucHV0cy52b2x1bWUsaSwodD0+e2Uudm9sdW1lPXQudGFyZ2V0LnZhbHVlfSksXCJ2b2x1bWVcIiksdGhpcy5iaW5kKHQuY29udHJvbHMsXCJtb3VzZWVudGVyIG1vdXNlbGVhdmVcIiwoaT0+e3QuY29udHJvbHMuaG92ZXI9IWUudG91Y2gmJlwibW91c2VlbnRlclwiPT09aS50eXBlfSkpLHQuZnVsbHNjcmVlbiYmQXJyYXkuZnJvbSh0LmZ1bGxzY3JlZW4uY2hpbGRyZW4pLmZpbHRlcigoZT0+IWUuY29udGFpbnModC5jb250YWluZXIpKSkuZm9yRWFjaCgoaT0+e3RoaXMuYmluZChpLFwibW91c2VlbnRlciBtb3VzZWxlYXZlXCIsKGk9Pnt0LmNvbnRyb2xzJiYodC5jb250cm9scy5ob3Zlcj0hZS50b3VjaCYmXCJtb3VzZWVudGVyXCI9PT1pLnR5cGUpfSkpfSkpLHRoaXMuYmluZCh0LmNvbnRyb2xzLFwibW91c2Vkb3duIG1vdXNldXAgdG91Y2hzdGFydCB0b3VjaGVuZCB0b3VjaGNhbmNlbFwiLChlPT57dC5jb250cm9scy5wcmVzc2VkPVtcIm1vdXNlZG93blwiLFwidG91Y2hzdGFydFwiXS5pbmNsdWRlcyhlLnR5cGUpfSkpLHRoaXMuYmluZCh0LmNvbnRyb2xzLFwiZm9jdXNpblwiLCgoKT0+e2NvbnN0e2NvbmZpZzppLHRpbWVyczpzfT1lO2xlKHQuY29udHJvbHMsaS5jbGFzc05hbWVzLm5vVHJhbnNpdGlvbiwhMCksYXQudG9nZ2xlQ29udHJvbHMuY2FsbChlLCEwKSxzZXRUaW1lb3V0KCgoKT0+e2xlKHQuY29udHJvbHMsaS5jbGFzc05hbWVzLm5vVHJhbnNpdGlvbiwhMSl9KSwwKTtjb25zdCBuPXRoaXMudG91Y2g/M2UzOjRlMztjbGVhclRpbWVvdXQocy5jb250cm9scykscy5jb250cm9scz1zZXRUaW1lb3V0KCgoKT0+YXQudG9nZ2xlQ29udHJvbHMuY2FsbChlLCExKSksbil9KSksdGhpcy5iaW5kKHQuaW5wdXRzLnZvbHVtZSxcIndoZWVsXCIsKHQ9Pntjb25zdCBpPXQud2Via2l0RGlyZWN0aW9uSW52ZXJ0ZWRGcm9tRGV2aWNlLFtzLG5dPVt0LmRlbHRhWCwtdC5kZWx0YVldLm1hcCgoZT0+aT8tZTplKSksYT1NYXRoLnNpZ24oTWF0aC5hYnMocyk+TWF0aC5hYnMobik/czpuKTtlLmluY3JlYXNlVm9sdW1lKGEvNTApO2NvbnN0e3ZvbHVtZTpsfT1lLm1lZGlhOygxPT09YSYmbDwxfHwtMT09PWEmJmw+MCkmJnQucHJldmVudERlZmF1bHQoKX0pLFwidm9sdW1lXCIsITEpfSkpLHRoaXMucGxheWVyPXQsdGhpcy5sYXN0S2V5PW51bGwsdGhpcy5mb2N1c1RpbWVyPW51bGwsdGhpcy5sYXN0S2V5RG93bj1udWxsLHRoaXMuaGFuZGxlS2V5PXRoaXMuaGFuZGxlS2V5LmJpbmQodGhpcyksdGhpcy50b2dnbGVNZW51PXRoaXMudG9nZ2xlTWVudS5iaW5kKHRoaXMpLHRoaXMuc2V0VGFiRm9jdXM9dGhpcy5zZXRUYWJGb2N1cy5iaW5kKHRoaXMpLHRoaXMuZmlyc3RUb3VjaD10aGlzLmZpcnN0VG91Y2guYmluZCh0aGlzKX1oYW5kbGVLZXkoZSl7Y29uc3R7cGxheWVyOnR9PXRoaXMse2VsZW1lbnRzOml9PXQse2tleTpzLHR5cGU6bixhbHRLZXk6YSxjdHJsS2V5OmwsbWV0YUtleTpvLHNoaWZ0S2V5OnJ9PWUsYz1cImtleWRvd25cIj09PW4saD1jJiZzPT09dGhpcy5sYXN0S2V5O2lmKGF8fGx8fG98fHIpcmV0dXJuO2lmKCFzKXJldHVybjtpZihjKXtjb25zdCBuPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7aWYoSChuKSl7Y29uc3R7ZWRpdGFibGU6c309dC5jb25maWcuc2VsZWN0b3JzLHtzZWVrOmF9PWkuaW5wdXRzO2lmKG4hPT1hJiZyZShuLHMpKXJldHVybjtpZihcIlNwYWNlXCI9PT1lLmtleSYmcmUobiwnYnV0dG9uLCBbcm9sZV49XCJtZW51aXRlbVwiXScpKXJldHVybn1zd2l0Y2goW1wiU3BhY2VcIixcIkFycm93TGVmdFwiLFwiQXJyb3dVcFwiLFwiQXJyb3dSaWdodFwiLFwiQXJyb3dEb3duXCIsXCIwXCIsXCIxXCIsXCIyXCIsXCIzXCIsXCI0XCIsXCI1XCIsXCI2XCIsXCI3XCIsXCI4XCIsXCI5XCIsXCJjXCIsXCJmXCIsXCJrXCIsXCJsXCIsXCJtXCJdLmluY2x1ZGVzKHMpJiYoZS5wcmV2ZW50RGVmYXVsdCgpLGUuc3RvcFByb3BhZ2F0aW9uKCkpLHMpe2Nhc2VcIjBcIjpjYXNlXCIxXCI6Y2FzZVwiMlwiOmNhc2VcIjNcIjpjYXNlXCI0XCI6Y2FzZVwiNVwiOmNhc2VcIjZcIjpjYXNlXCI3XCI6Y2FzZVwiOFwiOmNhc2VcIjlcIjpofHwodT1wYXJzZUludChzLDEwKSx0LmN1cnJlbnRUaW1lPXQuZHVyYXRpb24vMTAqdSk7YnJlYWs7Y2FzZVwiU3BhY2VcIjpjYXNlXCJrXCI6aHx8a2UodC50b2dnbGVQbGF5KCkpO2JyZWFrO2Nhc2VcIkFycm93VXBcIjp0LmluY3JlYXNlVm9sdW1lKC4xKTticmVhaztjYXNlXCJBcnJvd0Rvd25cIjp0LmRlY3JlYXNlVm9sdW1lKC4xKTticmVhaztjYXNlXCJtXCI6aHx8KHQubXV0ZWQ9IXQubXV0ZWQpO2JyZWFrO2Nhc2VcIkFycm93UmlnaHRcIjp0LmZvcndhcmQoKTticmVhaztjYXNlXCJBcnJvd0xlZnRcIjp0LnJld2luZCgpO2JyZWFrO2Nhc2VcImZcIjp0LmZ1bGxzY3JlZW4udG9nZ2xlKCk7YnJlYWs7Y2FzZVwiY1wiOmh8fHQudG9nZ2xlQ2FwdGlvbnMoKTticmVhaztjYXNlXCJsXCI6dC5sb29wPSF0Lmxvb3B9XCJFc2NhcGVcIj09PXMmJiF0LmZ1bGxzY3JlZW4udXNpbmdOYXRpdmUmJnQuZnVsbHNjcmVlbi5hY3RpdmUmJnQuZnVsbHNjcmVlbi50b2dnbGUoKSx0aGlzLmxhc3RLZXk9c31lbHNlIHRoaXMubGFzdEtleT1udWxsO3ZhciB1fXRvZ2dsZU1lbnUoZSl7V2UudG9nZ2xlTWVudS5jYWxsKHRoaXMucGxheWVyLGUpfX1cInVuZGVmaW5lZFwiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOlwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OlwidW5kZWZpbmVkXCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOlwidW5kZWZpbmVkXCIhPXR5cGVvZiBzZWxmJiZzZWxmO3ZhciBvdD1mdW5jdGlvbihlLHQpe3JldHVybiBlKHQ9e2V4cG9ydHM6e319LHQuZXhwb3J0cyksdC5leHBvcnRzfSgoZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbigpe30sdD17fSxpPXt9LHM9e307ZnVuY3Rpb24gbihlLHQpe2U9ZS5wdXNoP2U6W2VdO3ZhciBuLGEsbCxvPVtdLHI9ZS5sZW5ndGgsYz1yO2ZvcihuPWZ1bmN0aW9uKGUsaSl7aS5sZW5ndGgmJm8ucHVzaChlKSwtLWN8fHQobyl9O3ItLTspYT1lW3JdLChsPWlbYV0pP24oYSxsKTooc1thXT1zW2FdfHxbXSkucHVzaChuKX1mdW5jdGlvbiBhKGUsdCl7aWYoZSl7dmFyIG49c1tlXTtpZihpW2VdPXQsbilmb3IoO24ubGVuZ3RoOyluWzBdKGUsdCksbi5zcGxpY2UoMCwxKX19ZnVuY3Rpb24gbCh0LGkpe3QuY2FsbCYmKHQ9e3N1Y2Nlc3M6dH0pLGkubGVuZ3RoPyh0LmVycm9yfHxlKShpKToodC5zdWNjZXNzfHxlKSh0KX1mdW5jdGlvbiBvKHQsaSxzLG4pe3ZhciBhLGwscj1kb2N1bWVudCxjPXMuYXN5bmMsaD0ocy5udW1SZXRyaWVzfHwwKSsxLHU9cy5iZWZvcmV8fGUsZD10LnJlcGxhY2UoL1tcXD98I10uKiQvLFwiXCIpLG09dC5yZXBsYWNlKC9eKGNzc3xpbWcpIS8sXCJcIik7bj1ufHwwLC8oXmNzcyF8XFwuY3NzJCkvLnRlc3QoZCk/KChsPXIuY3JlYXRlRWxlbWVudChcImxpbmtcIikpLnJlbD1cInN0eWxlc2hlZXRcIixsLmhyZWY9bSwoYT1cImhpZGVGb2N1c1wiaW4gbCkmJmwucmVsTGlzdCYmKGE9MCxsLnJlbD1cInByZWxvYWRcIixsLmFzPVwic3R5bGVcIikpOi8oXmltZyF8XFwuKHBuZ3xnaWZ8anBnfHN2Z3x3ZWJwKSQpLy50ZXN0KGQpPyhsPXIuY3JlYXRlRWxlbWVudChcImltZ1wiKSkuc3JjPW06KChsPXIuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKSkuc3JjPXQsbC5hc3luYz12b2lkIDA9PT1jfHxjKSxsLm9ubG9hZD1sLm9uZXJyb3I9bC5vbmJlZm9yZWxvYWQ9ZnVuY3Rpb24oZSl7dmFyIHI9ZS50eXBlWzBdO2lmKGEpdHJ5e2wuc2hlZXQuY3NzVGV4dC5sZW5ndGh8fChyPVwiZVwiKX1jYXRjaChlKXsxOCE9ZS5jb2RlJiYocj1cImVcIil9aWYoXCJlXCI9PXIpe2lmKChuKz0xKTxoKXJldHVybiBvKHQsaSxzLG4pfWVsc2UgaWYoXCJwcmVsb2FkXCI9PWwucmVsJiZcInN0eWxlXCI9PWwuYXMpcmV0dXJuIGwucmVsPVwic3R5bGVzaGVldFwiO2kodCxyLGUuZGVmYXVsdFByZXZlbnRlZCl9LCExIT09dSh0LGwpJiZyLmhlYWQuYXBwZW5kQ2hpbGQobCl9ZnVuY3Rpb24gcihlLHQsaSl7dmFyIHMsbixhPShlPWUucHVzaD9lOltlXSkubGVuZ3RoLGw9YSxyPVtdO2ZvcihzPWZ1bmN0aW9uKGUsaSxzKXtpZihcImVcIj09aSYmci5wdXNoKGUpLFwiYlwiPT1pKXtpZighcylyZXR1cm47ci5wdXNoKGUpfS0tYXx8dChyKX0sbj0wO248bDtuKyspbyhlW25dLHMsaSl9ZnVuY3Rpb24gYyhlLGkscyl7dmFyIG4sbztpZihpJiZpLnRyaW0mJihuPWkpLG89KG4/czppKXx8e30sbil7aWYobiBpbiB0KXRocm93XCJMb2FkSlNcIjt0W25dPSEwfWZ1bmN0aW9uIGModCxpKXtyKGUsKGZ1bmN0aW9uKGUpe2wobyxlKSx0JiZsKHtzdWNjZXNzOnQsZXJyb3I6aX0sZSksYShuLGUpfSksbyl9aWYoby5yZXR1cm5Qcm9taXNlKXJldHVybiBuZXcgUHJvbWlzZShjKTtjKCl9cmV0dXJuIGMucmVhZHk9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbihlLChmdW5jdGlvbihlKXtsKHQsZSl9KSksY30sYy5kb25lPWZ1bmN0aW9uKGUpe2EoZSxbXSl9LGMucmVzZXQ9ZnVuY3Rpb24oKXt0PXt9LGk9e30scz17fX0sYy5pc0RlZmluZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW4gdH0sY30oKX0pKTtmdW5jdGlvbiBydChlKXtyZXR1cm4gbmV3IFByb21pc2UoKCh0LGkpPT57b3QoZSx7c3VjY2Vzczp0LGVycm9yOml9KX0pKX1mdW5jdGlvbiBjdChlKXtlJiYhdGhpcy5lbWJlZC5oYXNQbGF5ZWQmJih0aGlzLmVtYmVkLmhhc1BsYXllZD0hMCksdGhpcy5tZWRpYS5wYXVzZWQ9PT1lJiYodGhpcy5tZWRpYS5wYXVzZWQ9IWUsdmUuY2FsbCh0aGlzLHRoaXMubWVkaWEsZT9cInBsYXlcIjpcInBhdXNlXCIpKX1jb25zdCBodD17c2V0dXAoKXtjb25zdCBlPXRoaXM7bGUoZS5lbGVtZW50cy53cmFwcGVyLGUuY29uZmlnLmNsYXNzTmFtZXMuZW1iZWQsITApLGUub3B0aW9ucy5zcGVlZD1lLmNvbmZpZy5zcGVlZC5vcHRpb25zLHhlLmNhbGwoZSksTCh3aW5kb3cuVmltZW8pP2h0LnJlYWR5LmNhbGwoZSk6cnQoZS5jb25maWcudXJscy52aW1lby5zZGspLnRoZW4oKCgpPT57aHQucmVhZHkuY2FsbChlKX0pKS5jYXRjaCgodD0+e2UuZGVidWcud2FybihcIlZpbWVvIFNESyAocGxheWVyLmpzKSBmYWlsZWQgdG8gbG9hZFwiLHQpfSkpfSxyZWFkeSgpe2NvbnN0IGU9dGhpcyx0PWUuY29uZmlnLnZpbWVvLHtwcmVtaXVtOmkscmVmZXJyZXJQb2xpY3k6cywuLi5ufT10O2xldCBhPWUubWVkaWEuZ2V0QXR0cmlidXRlKFwic3JjXCIpLGw9XCJcIjtXKGEpPyhhPWUubWVkaWEuZ2V0QXR0cmlidXRlKGUuY29uZmlnLmF0dHJpYnV0ZXMuZW1iZWQuaWQpLGw9ZS5tZWRpYS5nZXRBdHRyaWJ1dGUoZS5jb25maWcuYXR0cmlidXRlcy5lbWJlZC5oYXNoKSk6bD1mdW5jdGlvbihlKXtjb25zdCB0PWUubWF0Y2goL14uKih2aW1lby5jb21cXC98dmlkZW9cXC8pKFxcZCspKFxcPy4qJipoPXxcXC8pKyhbXFxkLGEtZl0rKS8pO3JldHVybiB0JiY1PT09dC5sZW5ndGg/dFs0XTpudWxsfShhKTtjb25zdCBvPWw/e2g6bH06e307aSYmT2JqZWN0LmFzc2lnbihuLHtjb250cm9sczohMSxzaWRlZG9jazohMX0pO2NvbnN0IHI9S2Uoe2xvb3A6ZS5jb25maWcubG9vcC5hY3RpdmUsYXV0b3BsYXk6ZS5hdXRvcGxheSxtdXRlZDplLm11dGVkLGdlc3R1cmU6XCJtZWRpYVwiLHBsYXlzaW5saW5lOiF0aGlzLmNvbmZpZy5mdWxsc2NyZWVuLmlvc05hdGl2ZSwuLi5vLC4uLm59KSxjPVcoaD1hKT9udWxsOiQoTnVtYmVyKGgpKT9oOmgubWF0Y2goL14uKih2aW1lby5jb21cXC98dmlkZW9cXC8pKFxcZCspLiovKT9SZWdFeHAuJDI6aDt2YXIgaDtjb25zdCB1PVooXCJpZnJhbWVcIiksZD0kZShlLmNvbmZpZy51cmxzLnZpbWVvLmlmcmFtZSxjLHIpO2lmKHUuc2V0QXR0cmlidXRlKFwic3JjXCIsZCksdS5zZXRBdHRyaWJ1dGUoXCJhbGxvd2Z1bGxzY3JlZW5cIixcIlwiKSx1LnNldEF0dHJpYnV0ZShcImFsbG93XCIsW1wiYXV0b3BsYXlcIixcImZ1bGxzY3JlZW5cIixcInBpY3R1cmUtaW4tcGljdHVyZVwiLFwiZW5jcnlwdGVkLW1lZGlhXCIsXCJhY2NlbGVyb21ldGVyXCIsXCJneXJvc2NvcGVcIl0uam9pbihcIjsgXCIpKSxXKHMpfHx1LnNldEF0dHJpYnV0ZShcInJlZmVycmVyUG9saWN5XCIscyksaXx8IXQuY3VzdG9tQ29udHJvbHMpdS5zZXRBdHRyaWJ1dGUoXCJkYXRhLXBvc3RlclwiLGUucG9zdGVyKSxlLm1lZGlhPXNlKHUsZS5tZWRpYSk7ZWxzZXtjb25zdCB0PVooXCJkaXZcIix7Y2xhc3M6ZS5jb25maWcuY2xhc3NOYW1lcy5lbWJlZENvbnRhaW5lcixcImRhdGEtcG9zdGVyXCI6ZS5wb3N0ZXJ9KTt0LmFwcGVuZENoaWxkKHUpLGUubWVkaWE9c2UodCxlLm1lZGlhKX10LmN1c3RvbUNvbnRyb2xzfHxGZSgkZShlLmNvbmZpZy51cmxzLnZpbWVvLmFwaSxkKSkudGhlbigodD0+eyFXKHQpJiZ0LnRodW1ibmFpbF91cmwmJmF0LnNldFBvc3Rlci5jYWxsKGUsdC50aHVtYm5haWxfdXJsKS5jYXRjaCgoKCk9Pnt9KSl9KSksZS5lbWJlZD1uZXcgd2luZG93LlZpbWVvLlBsYXllcih1LHthdXRvcGF1c2U6ZS5jb25maWcuYXV0b3BhdXNlLG11dGVkOmUubXV0ZWR9KSxlLm1lZGlhLnBhdXNlZD0hMCxlLm1lZGlhLmN1cnJlbnRUaW1lPTAsZS5zdXBwb3J0ZWQudWkmJmUuZW1iZWQuZGlzYWJsZVRleHRUcmFjaygpLGUubWVkaWEucGxheT0oKT0+KGN0LmNhbGwoZSwhMCksZS5lbWJlZC5wbGF5KCkpLGUubWVkaWEucGF1c2U9KCk9PihjdC5jYWxsKGUsITEpLGUuZW1iZWQucGF1c2UoKSksZS5tZWRpYS5zdG9wPSgpPT57ZS5wYXVzZSgpLGUuY3VycmVudFRpbWU9MH07bGV0e2N1cnJlbnRUaW1lOm19PWUubWVkaWE7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUubWVkaWEsXCJjdXJyZW50VGltZVwiLHtnZXQ6KCk9Pm0sc2V0KHQpe2NvbnN0e2VtYmVkOmksbWVkaWE6cyxwYXVzZWQ6bix2b2x1bWU6YX09ZSxsPW4mJiFpLmhhc1BsYXllZDtzLnNlZWtpbmc9ITAsdmUuY2FsbChlLHMsXCJzZWVraW5nXCIpLFByb21pc2UucmVzb2x2ZShsJiZpLnNldFZvbHVtZSgwKSkudGhlbigoKCk9Pmkuc2V0Q3VycmVudFRpbWUodCkpKS50aGVuKCgoKT0+bCYmaS5wYXVzZSgpKSkudGhlbigoKCk9PmwmJmkuc2V0Vm9sdW1lKGEpKSkuY2F0Y2goKCgpPT57fSkpfX0pO2xldCBwPWUuY29uZmlnLnNwZWVkLnNlbGVjdGVkO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLm1lZGlhLFwicGxheWJhY2tSYXRlXCIse2dldDooKT0+cCxzZXQodCl7ZS5lbWJlZC5zZXRQbGF5YmFja1JhdGUodCkudGhlbigoKCk9PntwPXQsdmUuY2FsbChlLGUubWVkaWEsXCJyYXRlY2hhbmdlXCIpfSkpLmNhdGNoKCgoKT0+e2Uub3B0aW9ucy5zcGVlZD1bMV19KSl9fSk7bGV0e3ZvbHVtZTpnfT1lLmNvbmZpZztPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5tZWRpYSxcInZvbHVtZVwiLHtnZXQ6KCk9Pmcsc2V0KHQpe2UuZW1iZWQuc2V0Vm9sdW1lKHQpLnRoZW4oKCgpPT57Zz10LHZlLmNhbGwoZSxlLm1lZGlhLFwidm9sdW1lY2hhbmdlXCIpfSkpfX0pO2xldHttdXRlZDpmfT1lLmNvbmZpZztPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5tZWRpYSxcIm11dGVkXCIse2dldDooKT0+ZixzZXQodCl7Y29uc3QgaT0hIU8odCkmJnQ7ZS5lbWJlZC5zZXRWb2x1bWUoaT8wOmUuY29uZmlnLnZvbHVtZSkudGhlbigoKCk9PntmPWksdmUuY2FsbChlLGUubWVkaWEsXCJ2b2x1bWVjaGFuZ2VcIil9KSl9fSk7bGV0IGIse2xvb3A6eX09ZS5jb25maWc7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUubWVkaWEsXCJsb29wXCIse2dldDooKT0+eSxzZXQodCl7Y29uc3QgaT1PKHQpP3Q6ZS5jb25maWcubG9vcC5hY3RpdmU7ZS5lbWJlZC5zZXRMb29wKGkpLnRoZW4oKCgpPT57eT1pfSkpfX0pLGUuZW1iZWQuZ2V0VmlkZW9VcmwoKS50aGVuKCh0PT57Yj10LFdlLnNldERvd25sb2FkVXJsLmNhbGwoZSl9KSkuY2F0Y2goKGU9Pnt0aGlzLmRlYnVnLndhcm4oZSl9KSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUubWVkaWEsXCJjdXJyZW50U3JjXCIse2dldDooKT0+Yn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLm1lZGlhLFwiZW5kZWRcIix7Z2V0OigpPT5lLmN1cnJlbnRUaW1lPT09ZS5kdXJhdGlvbn0pLFByb21pc2UuYWxsKFtlLmVtYmVkLmdldFZpZGVvV2lkdGgoKSxlLmVtYmVkLmdldFZpZGVvSGVpZ2h0KCldKS50aGVuKCh0PT57Y29uc3RbaSxzXT10O2UuZW1iZWQucmF0aW89SWUoaSxzKSx4ZS5jYWxsKHRoaXMpfSkpLGUuZW1iZWQuc2V0QXV0b3BhdXNlKGUuY29uZmlnLmF1dG9wYXVzZSkudGhlbigodD0+e2UuY29uZmlnLmF1dG9wYXVzZT10fSkpLGUuZW1iZWQuZ2V0VmlkZW9UaXRsZSgpLnRoZW4oKHQ9PntlLmNvbmZpZy50aXRsZT10LGF0LnNldFRpdGxlLmNhbGwodGhpcyl9KSksZS5lbWJlZC5nZXRDdXJyZW50VGltZSgpLnRoZW4oKHQ9PnttPXQsdmUuY2FsbChlLGUubWVkaWEsXCJ0aW1ldXBkYXRlXCIpfSkpLGUuZW1iZWQuZ2V0RHVyYXRpb24oKS50aGVuKCh0PT57ZS5tZWRpYS5kdXJhdGlvbj10LHZlLmNhbGwoZSxlLm1lZGlhLFwiZHVyYXRpb25jaGFuZ2VcIil9KSksZS5lbWJlZC5nZXRUZXh0VHJhY2tzKCkudGhlbigodD0+e2UubWVkaWEudGV4dFRyYWNrcz10LFllLnNldHVwLmNhbGwoZSl9KSksZS5lbWJlZC5vbihcImN1ZWNoYW5nZVwiLCgoe2N1ZXM6dD1bXX0pPT57Y29uc3QgaT10Lm1hcCgoZT0+ZnVuY3Rpb24oZSl7Y29uc3QgdD1kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO3JldHVybiB0LmFwcGVuZENoaWxkKGkpLGkuaW5uZXJIVE1MPWUsdC5maXJzdENoaWxkLmlubmVyVGV4dH0oZS50ZXh0KSkpO1llLnVwZGF0ZUN1ZXMuY2FsbChlLGkpfSkpLGUuZW1iZWQub24oXCJsb2FkZWRcIiwoKCk9PntpZihlLmVtYmVkLmdldFBhdXNlZCgpLnRoZW4oKHQ9PntjdC5jYWxsKGUsIXQpLHR8fHZlLmNhbGwoZSxlLm1lZGlhLFwicGxheWluZ1wiKX0pKSxIKGUuZW1iZWQuZWxlbWVudCkmJmUuc3VwcG9ydGVkLnVpKXtlLmVtYmVkLmVsZW1lbnQuc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwtMSl9fSkpLGUuZW1iZWQub24oXCJidWZmZXJzdGFydFwiLCgoKT0+e3ZlLmNhbGwoZSxlLm1lZGlhLFwid2FpdGluZ1wiKX0pKSxlLmVtYmVkLm9uKFwiYnVmZmVyZW5kXCIsKCgpPT57dmUuY2FsbChlLGUubWVkaWEsXCJwbGF5aW5nXCIpfSkpLGUuZW1iZWQub24oXCJwbGF5XCIsKCgpPT57Y3QuY2FsbChlLCEwKSx2ZS5jYWxsKGUsZS5tZWRpYSxcInBsYXlpbmdcIil9KSksZS5lbWJlZC5vbihcInBhdXNlXCIsKCgpPT57Y3QuY2FsbChlLCExKX0pKSxlLmVtYmVkLm9uKFwidGltZXVwZGF0ZVwiLCh0PT57ZS5tZWRpYS5zZWVraW5nPSExLG09dC5zZWNvbmRzLHZlLmNhbGwoZSxlLm1lZGlhLFwidGltZXVwZGF0ZVwiKX0pKSxlLmVtYmVkLm9uKFwicHJvZ3Jlc3NcIiwodD0+e2UubWVkaWEuYnVmZmVyZWQ9dC5wZXJjZW50LHZlLmNhbGwoZSxlLm1lZGlhLFwicHJvZ3Jlc3NcIiksMT09PXBhcnNlSW50KHQucGVyY2VudCwxMCkmJnZlLmNhbGwoZSxlLm1lZGlhLFwiY2FucGxheXRocm91Z2hcIiksZS5lbWJlZC5nZXREdXJhdGlvbigpLnRoZW4oKHQ9Pnt0IT09ZS5tZWRpYS5kdXJhdGlvbiYmKGUubWVkaWEuZHVyYXRpb249dCx2ZS5jYWxsKGUsZS5tZWRpYSxcImR1cmF0aW9uY2hhbmdlXCIpKX0pKX0pKSxlLmVtYmVkLm9uKFwic2Vla2VkXCIsKCgpPT57ZS5tZWRpYS5zZWVraW5nPSExLHZlLmNhbGwoZSxlLm1lZGlhLFwic2Vla2VkXCIpfSkpLGUuZW1iZWQub24oXCJlbmRlZFwiLCgoKT0+e2UubWVkaWEucGF1c2VkPSEwLHZlLmNhbGwoZSxlLm1lZGlhLFwiZW5kZWRcIil9KSksZS5lbWJlZC5vbihcImVycm9yXCIsKHQ9PntlLm1lZGlhLmVycm9yPXQsdmUuY2FsbChlLGUubWVkaWEsXCJlcnJvclwiKX0pKSx0LmN1c3RvbUNvbnRyb2xzJiZzZXRUaW1lb3V0KCgoKT0+YXQuYnVpbGQuY2FsbChlKSksMCl9fTtmdW5jdGlvbiB1dChlKXtlJiYhdGhpcy5lbWJlZC5oYXNQbGF5ZWQmJih0aGlzLmVtYmVkLmhhc1BsYXllZD0hMCksdGhpcy5tZWRpYS5wYXVzZWQ9PT1lJiYodGhpcy5tZWRpYS5wYXVzZWQ9IWUsdmUuY2FsbCh0aGlzLHRoaXMubWVkaWEsZT9cInBsYXlcIjpcInBhdXNlXCIpKX1mdW5jdGlvbiBkdChlKXtyZXR1cm4gZS5ub0Nvb2tpZT9cImh0dHBzOi8vd3d3LnlvdXR1YmUtbm9jb29raWUuY29tXCI6XCJodHRwOlwiPT09d2luZG93LmxvY2F0aW9uLnByb3RvY29sP1wiaHR0cDovL3d3dy55b3V0dWJlLmNvbVwiOnZvaWQgMH1jb25zdCBtdD17c2V0dXAoKXtpZihsZSh0aGlzLmVsZW1lbnRzLndyYXBwZXIsdGhpcy5jb25maWcuY2xhc3NOYW1lcy5lbWJlZCwhMCksTCh3aW5kb3cuWVQpJiZqKHdpbmRvdy5ZVC5QbGF5ZXIpKW10LnJlYWR5LmNhbGwodGhpcyk7ZWxzZXtjb25zdCBlPXdpbmRvdy5vbllvdVR1YmVJZnJhbWVBUElSZWFkeTt3aW5kb3cub25Zb3VUdWJlSWZyYW1lQVBJUmVhZHk9KCk9PntqKGUpJiZlKCksbXQucmVhZHkuY2FsbCh0aGlzKX0scnQodGhpcy5jb25maWcudXJscy55b3V0dWJlLnNkaykuY2F0Y2goKGU9Pnt0aGlzLmRlYnVnLndhcm4oXCJZb3VUdWJlIEFQSSBmYWlsZWQgdG8gbG9hZFwiLGUpfSkpfX0sZ2V0VGl0bGUoZSl7RmUoJGUodGhpcy5jb25maWcudXJscy55b3V0dWJlLmFwaSxlKSkudGhlbigoZT0+e2lmKEwoZSkpe2NvbnN0e3RpdGxlOnQsaGVpZ2h0Omksd2lkdGg6c309ZTt0aGlzLmNvbmZpZy50aXRsZT10LGF0LnNldFRpdGxlLmNhbGwodGhpcyksdGhpcy5lbWJlZC5yYXRpbz1JZShzLGkpfXhlLmNhbGwodGhpcyl9KSkuY2F0Y2goKCgpPT57eGUuY2FsbCh0aGlzKX0pKX0scmVhZHkoKXtjb25zdCBlPXRoaXMsdD1lLmNvbmZpZy55b3V0dWJlLGk9ZS5tZWRpYSYmZS5tZWRpYS5nZXRBdHRyaWJ1dGUoXCJpZFwiKTtpZighVyhpKSYmaS5zdGFydHNXaXRoKFwieW91dHViZS1cIikpcmV0dXJuO2xldCBzPWUubWVkaWEuZ2V0QXR0cmlidXRlKFwic3JjXCIpO1cocykmJihzPWUubWVkaWEuZ2V0QXR0cmlidXRlKHRoaXMuY29uZmlnLmF0dHJpYnV0ZXMuZW1iZWQuaWQpKTtjb25zdCBuPVcoYT1zKT9udWxsOmEubWF0Y2goL14uKih5b3V0dS5iZVxcL3x2XFwvfHVcXC9cXHdcXC98ZW1iZWRcXC98d2F0Y2hcXD92PXwmdj0pKFteIyY/XSopLiovKT9SZWdFeHAuJDI6YTt2YXIgYTtjb25zdCBsPVooXCJkaXZcIix7aWQ6YCR7ZS5wcm92aWRlcn0tJHtNYXRoLmZsb29yKDFlNCpNYXRoLnJhbmRvbSgpKX1gLFwiZGF0YS1wb3N0ZXJcIjp0LmN1c3RvbUNvbnRyb2xzP2UucG9zdGVyOnZvaWQgMH0pO2lmKGUubWVkaWE9c2UobCxlLm1lZGlhKSx0LmN1c3RvbUNvbnRyb2xzKXtjb25zdCB0PWU9PmBodHRwczovL2kueXRpbWcuY29tL3ZpLyR7bn0vJHtlfWRlZmF1bHQuanBnYDtudCh0KFwibWF4cmVzXCIpLDEyMSkuY2F0Y2goKCgpPT5udCh0KFwic2RcIiksMTIxKSkpLmNhdGNoKCgoKT0+bnQodChcImhxXCIpKSkpLnRoZW4oKHQ9PmF0LnNldFBvc3Rlci5jYWxsKGUsdC5zcmMpKSkudGhlbigodD0+e3QuaW5jbHVkZXMoXCJtYXhyZXNcIil8fChlLmVsZW1lbnRzLnBvc3Rlci5zdHlsZS5iYWNrZ3JvdW5kU2l6ZT1cImNvdmVyXCIpfSkpLmNhdGNoKCgoKT0+e30pKX1lLmVtYmVkPW5ldyB3aW5kb3cuWVQuUGxheWVyKGUubWVkaWEse3ZpZGVvSWQ6bixob3N0OmR0KHQpLHBsYXllclZhcnM6WCh7fSx7YXV0b3BsYXk6ZS5jb25maWcuYXV0b3BsYXk/MTowLGhsOmUuY29uZmlnLmhsLGNvbnRyb2xzOmUuc3VwcG9ydGVkLnVpJiZ0LmN1c3RvbUNvbnRyb2xzPzA6MSxkaXNhYmxla2I6MSxwbGF5c2lubGluZTplLmNvbmZpZy5mdWxsc2NyZWVuLmlvc05hdGl2ZT8wOjEsY2NfbG9hZF9wb2xpY3k6ZS5jYXB0aW9ucy5hY3RpdmU/MTowLGNjX2xhbmdfcHJlZjplLmNvbmZpZy5jYXB0aW9ucy5sYW5ndWFnZSx3aWRnZXRfcmVmZXJyZXI6d2luZG93P3dpbmRvdy5sb2NhdGlvbi5ocmVmOm51bGx9LHQpLGV2ZW50czp7b25FcnJvcih0KXtpZighZS5tZWRpYS5lcnJvcil7Y29uc3QgaT10LmRhdGEscz17MjpcIlRoZSByZXF1ZXN0IGNvbnRhaW5zIGFuIGludmFsaWQgcGFyYW1ldGVyIHZhbHVlLiBGb3IgZXhhbXBsZSwgdGhpcyBlcnJvciBvY2N1cnMgaWYgeW91IHNwZWNpZnkgYSB2aWRlbyBJRCB0aGF0IGRvZXMgbm90IGhhdmUgMTEgY2hhcmFjdGVycywgb3IgaWYgdGhlIHZpZGVvIElEIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycywgc3VjaCBhcyBleGNsYW1hdGlvbiBwb2ludHMgb3IgYXN0ZXJpc2tzLlwiLDU6XCJUaGUgcmVxdWVzdGVkIGNvbnRlbnQgY2Fubm90IGJlIHBsYXllZCBpbiBhbiBIVE1MNSBwbGF5ZXIgb3IgYW5vdGhlciBlcnJvciByZWxhdGVkIHRvIHRoZSBIVE1MNSBwbGF5ZXIgaGFzIG9jY3VycmVkLlwiLDEwMDpcIlRoZSB2aWRlbyByZXF1ZXN0ZWQgd2FzIG5vdCBmb3VuZC4gVGhpcyBlcnJvciBvY2N1cnMgd2hlbiBhIHZpZGVvIGhhcyBiZWVuIHJlbW92ZWQgKGZvciBhbnkgcmVhc29uKSBvciBoYXMgYmVlbiBtYXJrZWQgYXMgcHJpdmF0ZS5cIiwxMDE6XCJUaGUgb3duZXIgb2YgdGhlIHJlcXVlc3RlZCB2aWRlbyBkb2VzIG5vdCBhbGxvdyBpdCB0byBiZSBwbGF5ZWQgaW4gZW1iZWRkZWQgcGxheWVycy5cIiwxNTA6XCJUaGUgb3duZXIgb2YgdGhlIHJlcXVlc3RlZCB2aWRlbyBkb2VzIG5vdCBhbGxvdyBpdCB0byBiZSBwbGF5ZWQgaW4gZW1iZWRkZWQgcGxheWVycy5cIn1baV18fFwiQW4gdW5rbm93biBlcnJvciBvY2N1cmVkXCI7ZS5tZWRpYS5lcnJvcj17Y29kZTppLG1lc3NhZ2U6c30sdmUuY2FsbChlLGUubWVkaWEsXCJlcnJvclwiKX19LG9uUGxheWJhY2tSYXRlQ2hhbmdlKHQpe2NvbnN0IGk9dC50YXJnZXQ7ZS5tZWRpYS5wbGF5YmFja1JhdGU9aS5nZXRQbGF5YmFja1JhdGUoKSx2ZS5jYWxsKGUsZS5tZWRpYSxcInJhdGVjaGFuZ2VcIil9LG9uUmVhZHkoaSl7aWYoaihlLm1lZGlhLnBsYXkpKXJldHVybjtjb25zdCBzPWkudGFyZ2V0O210LmdldFRpdGxlLmNhbGwoZSxuKSxlLm1lZGlhLnBsYXk9KCk9Pnt1dC5jYWxsKGUsITApLHMucGxheVZpZGVvKCl9LGUubWVkaWEucGF1c2U9KCk9Pnt1dC5jYWxsKGUsITEpLHMucGF1c2VWaWRlbygpfSxlLm1lZGlhLnN0b3A9KCk9PntzLnN0b3BWaWRlbygpfSxlLm1lZGlhLmR1cmF0aW9uPXMuZ2V0RHVyYXRpb24oKSxlLm1lZGlhLnBhdXNlZD0hMCxlLm1lZGlhLmN1cnJlbnRUaW1lPTAsT2JqZWN0LmRlZmluZVByb3BlcnR5KGUubWVkaWEsXCJjdXJyZW50VGltZVwiLHtnZXQ6KCk9Pk51bWJlcihzLmdldEN1cnJlbnRUaW1lKCkpLHNldCh0KXtlLnBhdXNlZCYmIWUuZW1iZWQuaGFzUGxheWVkJiZlLmVtYmVkLm11dGUoKSxlLm1lZGlhLnNlZWtpbmc9ITAsdmUuY2FsbChlLGUubWVkaWEsXCJzZWVraW5nXCIpLHMuc2Vla1RvKHQpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLm1lZGlhLFwicGxheWJhY2tSYXRlXCIse2dldDooKT0+cy5nZXRQbGF5YmFja1JhdGUoKSxzZXQoZSl7cy5zZXRQbGF5YmFja1JhdGUoZSl9fSk7bGV0e3ZvbHVtZTphfT1lLmNvbmZpZztPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5tZWRpYSxcInZvbHVtZVwiLHtnZXQ6KCk9PmEsc2V0KHQpe2E9dCxzLnNldFZvbHVtZSgxMDAqYSksdmUuY2FsbChlLGUubWVkaWEsXCJ2b2x1bWVjaGFuZ2VcIil9fSk7bGV0e211dGVkOmx9PWUuY29uZmlnO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLm1lZGlhLFwibXV0ZWRcIix7Z2V0OigpPT5sLHNldCh0KXtjb25zdCBpPU8odCk/dDpsO2w9aSxzW2k/XCJtdXRlXCI6XCJ1bk11dGVcIl0oKSxzLnNldFZvbHVtZSgxMDAqYSksdmUuY2FsbChlLGUubWVkaWEsXCJ2b2x1bWVjaGFuZ2VcIil9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUubWVkaWEsXCJjdXJyZW50U3JjXCIse2dldDooKT0+cy5nZXRWaWRlb1VybCgpfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUubWVkaWEsXCJlbmRlZFwiLHtnZXQ6KCk9PmUuY3VycmVudFRpbWU9PT1lLmR1cmF0aW9ufSk7Y29uc3Qgbz1zLmdldEF2YWlsYWJsZVBsYXliYWNrUmF0ZXMoKTtlLm9wdGlvbnMuc3BlZWQ9by5maWx0ZXIoKHQ9PmUuY29uZmlnLnNwZWVkLm9wdGlvbnMuaW5jbHVkZXModCkpKSxlLnN1cHBvcnRlZC51aSYmdC5jdXN0b21Db250cm9scyYmZS5tZWRpYS5zZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiLC0xKSx2ZS5jYWxsKGUsZS5tZWRpYSxcInRpbWV1cGRhdGVcIiksdmUuY2FsbChlLGUubWVkaWEsXCJkdXJhdGlvbmNoYW5nZVwiKSxjbGVhckludGVydmFsKGUudGltZXJzLmJ1ZmZlcmluZyksZS50aW1lcnMuYnVmZmVyaW5nPXNldEludGVydmFsKCgoKT0+e2UubWVkaWEuYnVmZmVyZWQ9cy5nZXRWaWRlb0xvYWRlZEZyYWN0aW9uKCksKG51bGw9PT1lLm1lZGlhLmxhc3RCdWZmZXJlZHx8ZS5tZWRpYS5sYXN0QnVmZmVyZWQ8ZS5tZWRpYS5idWZmZXJlZCkmJnZlLmNhbGwoZSxlLm1lZGlhLFwicHJvZ3Jlc3NcIiksZS5tZWRpYS5sYXN0QnVmZmVyZWQ9ZS5tZWRpYS5idWZmZXJlZCwxPT09ZS5tZWRpYS5idWZmZXJlZCYmKGNsZWFySW50ZXJ2YWwoZS50aW1lcnMuYnVmZmVyaW5nKSx2ZS5jYWxsKGUsZS5tZWRpYSxcImNhbnBsYXl0aHJvdWdoXCIpKX0pLDIwMCksdC5jdXN0b21Db250cm9scyYmc2V0VGltZW91dCgoKCk9PmF0LmJ1aWxkLmNhbGwoZSkpLDUwKX0sb25TdGF0ZUNoYW5nZShpKXtjb25zdCBzPWkudGFyZ2V0O2NsZWFySW50ZXJ2YWwoZS50aW1lcnMucGxheWluZyk7c3dpdGNoKGUubWVkaWEuc2Vla2luZyYmWzEsMl0uaW5jbHVkZXMoaS5kYXRhKSYmKGUubWVkaWEuc2Vla2luZz0hMSx2ZS5jYWxsKGUsZS5tZWRpYSxcInNlZWtlZFwiKSksaS5kYXRhKXtjYXNlLTE6dmUuY2FsbChlLGUubWVkaWEsXCJ0aW1ldXBkYXRlXCIpLGUubWVkaWEuYnVmZmVyZWQ9cy5nZXRWaWRlb0xvYWRlZEZyYWN0aW9uKCksdmUuY2FsbChlLGUubWVkaWEsXCJwcm9ncmVzc1wiKTticmVhaztjYXNlIDA6dXQuY2FsbChlLCExKSxlLm1lZGlhLmxvb3A/KHMuc3RvcFZpZGVvKCkscy5wbGF5VmlkZW8oKSk6dmUuY2FsbChlLGUubWVkaWEsXCJlbmRlZFwiKTticmVhaztjYXNlIDE6dC5jdXN0b21Db250cm9scyYmIWUuY29uZmlnLmF1dG9wbGF5JiZlLm1lZGlhLnBhdXNlZCYmIWUuZW1iZWQuaGFzUGxheWVkP2UubWVkaWEucGF1c2UoKToodXQuY2FsbChlLCEwKSx2ZS5jYWxsKGUsZS5tZWRpYSxcInBsYXlpbmdcIiksZS50aW1lcnMucGxheWluZz1zZXRJbnRlcnZhbCgoKCk9Pnt2ZS5jYWxsKGUsZS5tZWRpYSxcInRpbWV1cGRhdGVcIil9KSw1MCksZS5tZWRpYS5kdXJhdGlvbiE9PXMuZ2V0RHVyYXRpb24oKSYmKGUubWVkaWEuZHVyYXRpb249cy5nZXREdXJhdGlvbigpLHZlLmNhbGwoZSxlLm1lZGlhLFwiZHVyYXRpb25jaGFuZ2VcIikpKTticmVhaztjYXNlIDI6ZS5tdXRlZHx8ZS5lbWJlZC51bk11dGUoKSx1dC5jYWxsKGUsITEpO2JyZWFrO2Nhc2UgMzp2ZS5jYWxsKGUsZS5tZWRpYSxcIndhaXRpbmdcIil9dmUuY2FsbChlLGUuZWxlbWVudHMuY29udGFpbmVyLFwic3RhdGVjaGFuZ2VcIiwhMSx7Y29kZTppLmRhdGF9KX19fSl9fSxwdD17c2V0dXAoKXt0aGlzLm1lZGlhPyhsZSh0aGlzLmVsZW1lbnRzLmNvbnRhaW5lcix0aGlzLmNvbmZpZy5jbGFzc05hbWVzLnR5cGUucmVwbGFjZShcInswfVwiLHRoaXMudHlwZSksITApLGxlKHRoaXMuZWxlbWVudHMuY29udGFpbmVyLHRoaXMuY29uZmlnLmNsYXNzTmFtZXMucHJvdmlkZXIucmVwbGFjZShcInswfVwiLHRoaXMucHJvdmlkZXIpLCEwKSx0aGlzLmlzRW1iZWQmJmxlKHRoaXMuZWxlbWVudHMuY29udGFpbmVyLHRoaXMuY29uZmlnLmNsYXNzTmFtZXMudHlwZS5yZXBsYWNlKFwiezB9XCIsXCJ2aWRlb1wiKSwhMCksdGhpcy5pc1ZpZGVvJiYodGhpcy5lbGVtZW50cy53cmFwcGVyPVooXCJkaXZcIix7Y2xhc3M6dGhpcy5jb25maWcuY2xhc3NOYW1lcy52aWRlb30pLEoodGhpcy5tZWRpYSx0aGlzLmVsZW1lbnRzLndyYXBwZXIpLHRoaXMuZWxlbWVudHMucG9zdGVyPVooXCJkaXZcIix7Y2xhc3M6dGhpcy5jb25maWcuY2xhc3NOYW1lcy5wb3N0ZXJ9KSx0aGlzLmVsZW1lbnRzLndyYXBwZXIuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50cy5wb3N0ZXIpKSx0aGlzLmlzSFRNTDU/TGUuc2V0dXAuY2FsbCh0aGlzKTp0aGlzLmlzWW91VHViZT9tdC5zZXR1cC5jYWxsKHRoaXMpOnRoaXMuaXNWaW1lbyYmaHQuc2V0dXAuY2FsbCh0aGlzKSk6dGhpcy5kZWJ1Zy53YXJuKFwiTm8gbWVkaWEgZWxlbWVudCBmb3VuZCFcIil9fTtjbGFzcyBndHtjb25zdHJ1Y3Rvcih0KXtlKHRoaXMsXCJsb2FkXCIsKCgpPT57dGhpcy5lbmFibGVkJiYoTCh3aW5kb3cuZ29vZ2xlKSYmTCh3aW5kb3cuZ29vZ2xlLmltYSk/dGhpcy5yZWFkeSgpOnJ0KHRoaXMucGxheWVyLmNvbmZpZy51cmxzLmdvb2dsZUlNQS5zZGspLnRoZW4oKCgpPT57dGhpcy5yZWFkeSgpfSkpLmNhdGNoKCgoKT0+e3RoaXMudHJpZ2dlcihcImVycm9yXCIsbmV3IEVycm9yKFwiR29vZ2xlIElNQSBTREsgZmFpbGVkIHRvIGxvYWRcIikpfSkpKX0pKSxlKHRoaXMsXCJyZWFkeVwiLCgoKT0+e3ZhciBlO3RoaXMuZW5hYmxlZHx8KChlPXRoaXMpLm1hbmFnZXImJmUubWFuYWdlci5kZXN0cm95KCksZS5lbGVtZW50cy5kaXNwbGF5Q29udGFpbmVyJiZlLmVsZW1lbnRzLmRpc3BsYXlDb250YWluZXIuZGVzdHJveSgpLGUuZWxlbWVudHMuY29udGFpbmVyLnJlbW92ZSgpKSx0aGlzLnN0YXJ0U2FmZXR5VGltZXIoMTJlMyxcInJlYWR5KClcIiksdGhpcy5tYW5hZ2VyUHJvbWlzZS50aGVuKCgoKT0+e3RoaXMuY2xlYXJTYWZldHlUaW1lcihcIm9uQWRzTWFuYWdlckxvYWRlZCgpXCIpfSkpLHRoaXMubGlzdGVuZXJzKCksdGhpcy5zZXR1cElNQSgpfSkpLGUodGhpcyxcInNldHVwSU1BXCIsKCgpPT57dGhpcy5lbGVtZW50cy5jb250YWluZXI9WihcImRpdlwiLHtjbGFzczp0aGlzLnBsYXllci5jb25maWcuY2xhc3NOYW1lcy5hZHN9KSx0aGlzLnBsYXllci5lbGVtZW50cy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50cy5jb250YWluZXIpLGdvb2dsZS5pbWEuc2V0dGluZ3Muc2V0VnBhaWRNb2RlKGdvb2dsZS5pbWEuSW1hU2RrU2V0dGluZ3MuVnBhaWRNb2RlLkVOQUJMRUQpLGdvb2dsZS5pbWEuc2V0dGluZ3Muc2V0TG9jYWxlKHRoaXMucGxheWVyLmNvbmZpZy5hZHMubGFuZ3VhZ2UpLGdvb2dsZS5pbWEuc2V0dGluZ3Muc2V0RGlzYWJsZUN1c3RvbVBsYXliYWNrRm9ySU9TMTBQbHVzKHRoaXMucGxheWVyLmNvbmZpZy5wbGF5c2lubGluZSksdGhpcy5lbGVtZW50cy5kaXNwbGF5Q29udGFpbmVyPW5ldyBnb29nbGUuaW1hLkFkRGlzcGxheUNvbnRhaW5lcih0aGlzLmVsZW1lbnRzLmNvbnRhaW5lcix0aGlzLnBsYXllci5tZWRpYSksdGhpcy5sb2FkZXI9bmV3IGdvb2dsZS5pbWEuQWRzTG9hZGVyKHRoaXMuZWxlbWVudHMuZGlzcGxheUNvbnRhaW5lciksdGhpcy5sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCwoZT0+dGhpcy5vbkFkc01hbmFnZXJMb2FkZWQoZSkpLCExKSx0aGlzLmxvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsKGU9PnRoaXMub25BZEVycm9yKGUpKSwhMSksdGhpcy5yZXF1ZXN0QWRzKCl9KSksZSh0aGlzLFwicmVxdWVzdEFkc1wiLCgoKT0+e2NvbnN0e2NvbnRhaW5lcjplfT10aGlzLnBsYXllci5lbGVtZW50czt0cnl7Y29uc3QgdD1uZXcgZ29vZ2xlLmltYS5BZHNSZXF1ZXN0O3QuYWRUYWdVcmw9dGhpcy50YWdVcmwsdC5saW5lYXJBZFNsb3RXaWR0aD1lLm9mZnNldFdpZHRoLHQubGluZWFyQWRTbG90SGVpZ2h0PWUub2Zmc2V0SGVpZ2h0LHQubm9uTGluZWFyQWRTbG90V2lkdGg9ZS5vZmZzZXRXaWR0aCx0Lm5vbkxpbmVhckFkU2xvdEhlaWdodD1lLm9mZnNldEhlaWdodCx0LmZvcmNlTm9uTGluZWFyRnVsbFNsb3Q9ITEsdC5zZXRBZFdpbGxQbGF5TXV0ZWQoIXRoaXMucGxheWVyLm11dGVkKSx0aGlzLmxvYWRlci5yZXF1ZXN0QWRzKHQpfWNhdGNoKGUpe3RoaXMub25BZEVycm9yKGUpfX0pKSxlKHRoaXMsXCJwb2xsQ291bnRkb3duXCIsKChlPSExKT0+e2lmKCFlKXJldHVybiBjbGVhckludGVydmFsKHRoaXMuY291bnRkb3duVGltZXIpLHZvaWQgdGhpcy5lbGVtZW50cy5jb250YWluZXIucmVtb3ZlQXR0cmlidXRlKFwiZGF0YS1iYWRnZS10ZXh0XCIpO3RoaXMuY291bnRkb3duVGltZXI9c2V0SW50ZXJ2YWwoKCgpPT57Y29uc3QgZT1VZShNYXRoLm1heCh0aGlzLm1hbmFnZXIuZ2V0UmVtYWluaW5nVGltZSgpLDApKSx0PWAke0hlLmdldChcImFkdmVydGlzZW1lbnRcIix0aGlzLnBsYXllci5jb25maWcpfSAtICR7ZX1gO3RoaXMuZWxlbWVudHMuY29udGFpbmVyLnNldEF0dHJpYnV0ZShcImRhdGEtYmFkZ2UtdGV4dFwiLHQpfSksMTAwKX0pKSxlKHRoaXMsXCJvbkFkc01hbmFnZXJMb2FkZWRcIiwoZT0+e2lmKCF0aGlzLmVuYWJsZWQpcmV0dXJuO2NvbnN0IHQ9bmV3IGdvb2dsZS5pbWEuQWRzUmVuZGVyaW5nU2V0dGluZ3M7dC5yZXN0b3JlQ3VzdG9tUGxheWJhY2tTdGF0ZU9uQWRCcmVha0NvbXBsZXRlPSEwLHQuZW5hYmxlUHJlbG9hZGluZz0hMCx0aGlzLm1hbmFnZXI9ZS5nZXRBZHNNYW5hZ2VyKHRoaXMucGxheWVyLHQpLHRoaXMuY3VlUG9pbnRzPXRoaXMubWFuYWdlci5nZXRDdWVQb2ludHMoKSx0aGlzLm1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLChlPT50aGlzLm9uQWRFcnJvcihlKSkpLE9iamVjdC5rZXlzKGdvb2dsZS5pbWEuQWRFdmVudC5UeXBlKS5mb3JFYWNoKChlPT57dGhpcy5tYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGVbZV0sKGU9PnRoaXMub25BZEV2ZW50KGUpKSl9KSksdGhpcy50cmlnZ2VyKFwibG9hZGVkXCIpfSkpLGUodGhpcyxcImFkZEN1ZVBvaW50c1wiLCgoKT0+e1codGhpcy5jdWVQb2ludHMpfHx0aGlzLmN1ZVBvaW50cy5mb3JFYWNoKChlPT57aWYoMCE9PWUmJi0xIT09ZSYmZTx0aGlzLnBsYXllci5kdXJhdGlvbil7Y29uc3QgdD10aGlzLnBsYXllci5lbGVtZW50cy5wcm9ncmVzcztpZihIKHQpKXtjb25zdCBpPTEwMC90aGlzLnBsYXllci5kdXJhdGlvbiplLHM9WihcInNwYW5cIix7Y2xhc3M6dGhpcy5wbGF5ZXIuY29uZmlnLmNsYXNzTmFtZXMuY3Vlc30pO3Muc3R5bGUubGVmdD1gJHtpLnRvU3RyaW5nKCl9JWAsdC5hcHBlbmRDaGlsZChzKX19fSkpfSkpLGUodGhpcyxcIm9uQWRFdmVudFwiLChlPT57Y29uc3R7Y29udGFpbmVyOnR9PXRoaXMucGxheWVyLmVsZW1lbnRzLGk9ZS5nZXRBZCgpLHM9ZS5nZXRBZERhdGEoKTtzd2l0Y2goKGU9Pnt2ZS5jYWxsKHRoaXMucGxheWVyLHRoaXMucGxheWVyLm1lZGlhLGBhZHMke2UucmVwbGFjZSgvXy9nLFwiXCIpLnRvTG93ZXJDYXNlKCl9YCl9KShlLnR5cGUpLGUudHlwZSl7Y2FzZSBnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0FERUQ6dGhpcy50cmlnZ2VyKFwibG9hZGVkXCIpLHRoaXMucG9sbENvdW50ZG93bighMCksaS5pc0xpbmVhcigpfHwoaS53aWR0aD10Lm9mZnNldFdpZHRoLGkuaGVpZ2h0PXQub2Zmc2V0SGVpZ2h0KTticmVhaztjYXNlIGdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLlNUQVJURUQ6dGhpcy5tYW5hZ2VyLnNldFZvbHVtZSh0aGlzLnBsYXllci52b2x1bWUpO2JyZWFrO2Nhc2UgZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuQUxMX0FEU19DT01QTEVURUQ6dGhpcy5wbGF5ZXIuZW5kZWQ/dGhpcy5sb2FkQWRzKCk6dGhpcy5sb2FkZXIuY29udGVudENvbXBsZXRlKCk7YnJlYWs7Y2FzZSBnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5DT05URU5UX1BBVVNFX1JFUVVFU1RFRDp0aGlzLnBhdXNlQ29udGVudCgpO2JyZWFrO2Nhc2UgZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuQ09OVEVOVF9SRVNVTUVfUkVRVUVTVEVEOnRoaXMucG9sbENvdW50ZG93bigpLHRoaXMucmVzdW1lQ29udGVudCgpO2JyZWFrO2Nhc2UgZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HOnMuYWRFcnJvciYmdGhpcy5wbGF5ZXIuZGVidWcud2FybihgTm9uLWZhdGFsIGFkIGVycm9yOiAke3MuYWRFcnJvci5nZXRNZXNzYWdlKCl9YCl9fSkpLGUodGhpcyxcIm9uQWRFcnJvclwiLChlPT57dGhpcy5jYW5jZWwoKSx0aGlzLnBsYXllci5kZWJ1Zy53YXJuKFwiQWRzIGVycm9yXCIsZSl9KSksZSh0aGlzLFwibGlzdGVuZXJzXCIsKCgpPT57Y29uc3R7Y29udGFpbmVyOmV9PXRoaXMucGxheWVyLmVsZW1lbnRzO2xldCB0O3RoaXMucGxheWVyLm9uKFwiY2FucGxheVwiLCgoKT0+e3RoaXMuYWRkQ3VlUG9pbnRzKCl9KSksdGhpcy5wbGF5ZXIub24oXCJlbmRlZFwiLCgoKT0+e3RoaXMubG9hZGVyLmNvbnRlbnRDb21wbGV0ZSgpfSkpLHRoaXMucGxheWVyLm9uKFwidGltZXVwZGF0ZVwiLCgoKT0+e3Q9dGhpcy5wbGF5ZXIuY3VycmVudFRpbWV9KSksdGhpcy5wbGF5ZXIub24oXCJzZWVrZWRcIiwoKCk9Pntjb25zdCBlPXRoaXMucGxheWVyLmN1cnJlbnRUaW1lO1codGhpcy5jdWVQb2ludHMpfHx0aGlzLmN1ZVBvaW50cy5mb3JFYWNoKCgoaSxzKT0+e3Q8aSYmaTxlJiYodGhpcy5tYW5hZ2VyLmRpc2NhcmRBZEJyZWFrKCksdGhpcy5jdWVQb2ludHMuc3BsaWNlKHMsMSkpfSkpfSkpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsKCgpPT57dGhpcy5tYW5hZ2VyJiZ0aGlzLm1hbmFnZXIucmVzaXplKGUub2Zmc2V0V2lkdGgsZS5vZmZzZXRIZWlnaHQsZ29vZ2xlLmltYS5WaWV3TW9kZS5OT1JNQUwpfSkpfSkpLGUodGhpcyxcInBsYXlcIiwoKCk9Pntjb25zdHtjb250YWluZXI6ZX09dGhpcy5wbGF5ZXIuZWxlbWVudHM7dGhpcy5tYW5hZ2VyUHJvbWlzZXx8dGhpcy5yZXN1bWVDb250ZW50KCksdGhpcy5tYW5hZ2VyUHJvbWlzZS50aGVuKCgoKT0+e3RoaXMubWFuYWdlci5zZXRWb2x1bWUodGhpcy5wbGF5ZXIudm9sdW1lKSx0aGlzLmVsZW1lbnRzLmRpc3BsYXlDb250YWluZXIuaW5pdGlhbGl6ZSgpO3RyeXt0aGlzLmluaXRpYWxpemVkfHwodGhpcy5tYW5hZ2VyLmluaXQoZS5vZmZzZXRXaWR0aCxlLm9mZnNldEhlaWdodCxnb29nbGUuaW1hLlZpZXdNb2RlLk5PUk1BTCksdGhpcy5tYW5hZ2VyLnN0YXJ0KCkpLHRoaXMuaW5pdGlhbGl6ZWQ9ITB9Y2F0Y2goZSl7dGhpcy5vbkFkRXJyb3IoZSl9fSkpLmNhdGNoKCgoKT0+e30pKX0pKSxlKHRoaXMsXCJyZXN1bWVDb250ZW50XCIsKCgpPT57dGhpcy5lbGVtZW50cy5jb250YWluZXIuc3R5bGUuekluZGV4PVwiXCIsdGhpcy5wbGF5aW5nPSExLGtlKHRoaXMucGxheWVyLm1lZGlhLnBsYXkoKSl9KSksZSh0aGlzLFwicGF1c2VDb250ZW50XCIsKCgpPT57dGhpcy5lbGVtZW50cy5jb250YWluZXIuc3R5bGUuekluZGV4PTMsdGhpcy5wbGF5aW5nPSEwLHRoaXMucGxheWVyLm1lZGlhLnBhdXNlKCl9KSksZSh0aGlzLFwiY2FuY2VsXCIsKCgpPT57dGhpcy5pbml0aWFsaXplZCYmdGhpcy5yZXN1bWVDb250ZW50KCksdGhpcy50cmlnZ2VyKFwiZXJyb3JcIiksdGhpcy5sb2FkQWRzKCl9KSksZSh0aGlzLFwibG9hZEFkc1wiLCgoKT0+e3RoaXMubWFuYWdlclByb21pc2UudGhlbigoKCk9Pnt0aGlzLm1hbmFnZXImJnRoaXMubWFuYWdlci5kZXN0cm95KCksdGhpcy5tYW5hZ2VyUHJvbWlzZT1uZXcgUHJvbWlzZSgoZT0+e3RoaXMub24oXCJsb2FkZWRcIixlKSx0aGlzLnBsYXllci5kZWJ1Zy5sb2codGhpcy5tYW5hZ2VyKX0pKSx0aGlzLmluaXRpYWxpemVkPSExLHRoaXMucmVxdWVzdEFkcygpfSkpLmNhdGNoKCgoKT0+e30pKX0pKSxlKHRoaXMsXCJ0cmlnZ2VyXCIsKChlLC4uLnQpPT57Y29uc3QgaT10aGlzLmV2ZW50c1tlXTtEKGkpJiZpLmZvckVhY2goKGU9PntqKGUpJiZlLmFwcGx5KHRoaXMsdCl9KSl9KSksZSh0aGlzLFwib25cIiwoKGUsdCk9PihEKHRoaXMuZXZlbnRzW2VdKXx8KHRoaXMuZXZlbnRzW2VdPVtdKSx0aGlzLmV2ZW50c1tlXS5wdXNoKHQpLHRoaXMpKSksZSh0aGlzLFwic3RhcnRTYWZldHlUaW1lclwiLCgoZSx0KT0+e3RoaXMucGxheWVyLmRlYnVnLmxvZyhgU2FmZXR5IHRpbWVyIGludm9rZWQgZnJvbTogJHt0fWApLHRoaXMuc2FmZXR5VGltZXI9c2V0VGltZW91dCgoKCk9Pnt0aGlzLmNhbmNlbCgpLHRoaXMuY2xlYXJTYWZldHlUaW1lcihcInN0YXJ0U2FmZXR5VGltZXIoKVwiKX0pLGUpfSkpLGUodGhpcyxcImNsZWFyU2FmZXR5VGltZXJcIiwoZT0+e0kodGhpcy5zYWZldHlUaW1lcil8fCh0aGlzLnBsYXllci5kZWJ1Zy5sb2coYFNhZmV0eSB0aW1lciBjbGVhcmVkIGZyb206ICR7ZX1gKSxjbGVhclRpbWVvdXQodGhpcy5zYWZldHlUaW1lciksdGhpcy5zYWZldHlUaW1lcj1udWxsKX0pKSx0aGlzLnBsYXllcj10LHRoaXMuY29uZmlnPXQuY29uZmlnLmFkcyx0aGlzLnBsYXlpbmc9ITEsdGhpcy5pbml0aWFsaXplZD0hMSx0aGlzLmVsZW1lbnRzPXtjb250YWluZXI6bnVsbCxkaXNwbGF5Q29udGFpbmVyOm51bGx9LHRoaXMubWFuYWdlcj1udWxsLHRoaXMubG9hZGVyPW51bGwsdGhpcy5jdWVQb2ludHM9bnVsbCx0aGlzLmV2ZW50cz17fSx0aGlzLnNhZmV0eVRpbWVyPW51bGwsdGhpcy5jb3VudGRvd25UaW1lcj1udWxsLHRoaXMubWFuYWdlclByb21pc2U9bmV3IFByb21pc2UoKChlLHQpPT57dGhpcy5vbihcImxvYWRlZFwiLGUpLHRoaXMub24oXCJlcnJvclwiLHQpfSkpLHRoaXMubG9hZCgpfWdldCBlbmFibGVkKCl7Y29uc3R7Y29uZmlnOmV9PXRoaXM7cmV0dXJuIHRoaXMucGxheWVyLmlzSFRNTDUmJnRoaXMucGxheWVyLmlzVmlkZW8mJmUuZW5hYmxlZCYmKCFXKGUucHVibGlzaGVySWQpfHxVKGUudGFnVXJsKSl9Z2V0IHRhZ1VybCgpe2NvbnN0e2NvbmZpZzplfT10aGlzO2lmKFUoZS50YWdVcmwpKXJldHVybiBlLnRhZ1VybDtyZXR1cm5gaHR0cHM6Ly9nby5hbml2aWV3LmNvbS9hcGkvYWRzZXJ2ZXI2L3Zhc3QvPyR7S2Uoe0FWX1BVQkxJU0hFUklEOlwiNThjMjViYjAwNzNlZjQ0OGIxMDg3YWQ2XCIsQVZfQ0hBTk5FTElEOlwiNWEwNDU4ZGMyOGEwNjE0NWU0NTE5ZDIxXCIsQVZfVVJMOndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSxjYjpEYXRlLm5vdygpLEFWX1dJRFRIOjY0MCxBVl9IRUlHSFQ6NDgwLEFWX0NESU0yOmUucHVibGlzaGVySWR9KX1gfX1mdW5jdGlvbiBmdChlPTAsdD0wLGk9MjU1KXtyZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgoZSx0KSxpKX1jb25zdCBidD1lPT57Y29uc3QgdD1bXTtyZXR1cm4gZS5zcGxpdCgvXFxyXFxuXFxyXFxufFxcblxcbnxcXHJcXHIvKS5mb3JFYWNoKChlPT57Y29uc3QgaT17fTtlLnNwbGl0KC9cXHJcXG58XFxufFxcci8pLmZvckVhY2goKGU9PntpZigkKGkuc3RhcnRUaW1lKSl7aWYoIVcoZS50cmltKCkpJiZXKGkudGV4dCkpe2NvbnN0IHQ9ZS50cmltKCkuc3BsaXQoXCIjeHl3aD1cIik7W2kudGV4dF09dCx0WzFdJiYoW2kueCxpLnksaS53LGkuaF09dFsxXS5zcGxpdChcIixcIikpfX1lbHNle2NvbnN0IHQ9ZS5tYXRjaCgvKFswLTldezJ9KT86PyhbMC05XXsyfSk6KFswLTldezJ9KS4oWzAtOV17MiwzfSkoID8tLT4gPykoWzAtOV17Mn0pPzo/KFswLTldezJ9KTooWzAtOV17Mn0pLihbMC05XXsyLDN9KS8pO3QmJihpLnN0YXJ0VGltZT02MCpOdW1iZXIodFsxXXx8MCkqNjArNjAqTnVtYmVyKHRbMl0pK051bWJlcih0WzNdKStOdW1iZXIoYDAuJHt0WzRdfWApLGkuZW5kVGltZT02MCpOdW1iZXIodFs2XXx8MCkqNjArNjAqTnVtYmVyKHRbN10pK051bWJlcih0WzhdKStOdW1iZXIoYDAuJHt0WzldfWApKX19KSksaS50ZXh0JiZ0LnB1c2goaSl9KSksdH0seXQ9KGUsdCk9Pntjb25zdCBpPXt9O3JldHVybiBlPnQud2lkdGgvdC5oZWlnaHQ/KGkud2lkdGg9dC53aWR0aCxpLmhlaWdodD0xL2UqdC53aWR0aCk6KGkuaGVpZ2h0PXQuaGVpZ2h0LGkud2lkdGg9ZSp0LmhlaWdodCksaX07Y2xhc3MgdnR7Y29uc3RydWN0b3IodCl7ZSh0aGlzLFwibG9hZFwiLCgoKT0+e3RoaXMucGxheWVyLmVsZW1lbnRzLmRpc3BsYXkuc2Vla1Rvb2x0aXAmJih0aGlzLnBsYXllci5lbGVtZW50cy5kaXNwbGF5LnNlZWtUb29sdGlwLmhpZGRlbj10aGlzLmVuYWJsZWQpLHRoaXMuZW5hYmxlZCYmdGhpcy5nZXRUaHVtYm5haWxzKCkudGhlbigoKCk9Pnt0aGlzLmVuYWJsZWQmJih0aGlzLnJlbmRlcigpLHRoaXMuZGV0ZXJtaW5lQ29udGFpbmVyQXV0b1NpemluZygpLHRoaXMubG9hZGVkPSEwKX0pKX0pKSxlKHRoaXMsXCJnZXRUaHVtYm5haWxzXCIsKCgpPT5uZXcgUHJvbWlzZSgoZT0+e2NvbnN0e3NyYzp0fT10aGlzLnBsYXllci5jb25maWcucHJldmlld1RodW1ibmFpbHM7aWYoVyh0KSl0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIHByZXZpZXdUaHVtYm5haWxzLnNyYyBjb25maWcgYXR0cmlidXRlXCIpO2NvbnN0IGk9KCk9Pnt0aGlzLnRodW1ibmFpbHMuc29ydCgoKGUsdCk9PmUuaGVpZ2h0LXQuaGVpZ2h0KSksdGhpcy5wbGF5ZXIuZGVidWcubG9nKFwiUHJldmlldyB0aHVtYm5haWxzXCIsdGhpcy50aHVtYm5haWxzKSxlKCl9O2lmKGoodCkpdCgoZT0+e3RoaXMudGh1bWJuYWlscz1lLGkoKX0pKTtlbHNle2NvbnN0IGU9KF8odCk/W3RdOnQpLm1hcCgoZT0+dGhpcy5nZXRUaHVtYm5haWwoZSkpKTtQcm9taXNlLmFsbChlKS50aGVuKGkpfX0pKSkpLGUodGhpcyxcImdldFRodW1ibmFpbFwiLChlPT5uZXcgUHJvbWlzZSgodD0+e0ZlKGUpLnRoZW4oKGk9Pntjb25zdCBzPXtmcmFtZXM6YnQoaSksaGVpZ2h0Om51bGwsdXJsUHJlZml4OlwiXCJ9O3MuZnJhbWVzWzBdLnRleHQuc3RhcnRzV2l0aChcIi9cIil8fHMuZnJhbWVzWzBdLnRleHQuc3RhcnRzV2l0aChcImh0dHA6Ly9cIil8fHMuZnJhbWVzWzBdLnRleHQuc3RhcnRzV2l0aChcImh0dHBzOi8vXCIpfHwocy51cmxQcmVmaXg9ZS5zdWJzdHJpbmcoMCxlLmxhc3RJbmRleE9mKFwiL1wiKSsxKSk7Y29uc3Qgbj1uZXcgSW1hZ2U7bi5vbmxvYWQ9KCk9PntzLmhlaWdodD1uLm5hdHVyYWxIZWlnaHQscy53aWR0aD1uLm5hdHVyYWxXaWR0aCx0aGlzLnRodW1ibmFpbHMucHVzaChzKSx0KCl9LG4uc3JjPXMudXJsUHJlZml4K3MuZnJhbWVzWzBdLnRleHR9KSl9KSkpKSxlKHRoaXMsXCJzdGFydE1vdmVcIiwoZT0+e2lmKHRoaXMubG9hZGVkJiZSKGUpJiZbXCJ0b3VjaG1vdmVcIixcIm1vdXNlbW92ZVwiXS5pbmNsdWRlcyhlLnR5cGUpJiZ0aGlzLnBsYXllci5tZWRpYS5kdXJhdGlvbil7aWYoXCJ0b3VjaG1vdmVcIj09PWUudHlwZSl0aGlzLnNlZWtUaW1lPXRoaXMucGxheWVyLm1lZGlhLmR1cmF0aW9uKih0aGlzLnBsYXllci5lbGVtZW50cy5pbnB1dHMuc2Vlay52YWx1ZS8xMDApO2Vsc2V7dmFyIHQsaTtjb25zdCBzPXRoaXMucGxheWVyLmVsZW1lbnRzLnByb2dyZXNzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49MTAwL3Mud2lkdGgqKGUucGFnZVgtcy5sZWZ0KTt0aGlzLnNlZWtUaW1lPXRoaXMucGxheWVyLm1lZGlhLmR1cmF0aW9uKihuLzEwMCksdGhpcy5zZWVrVGltZTwwJiYodGhpcy5zZWVrVGltZT0wKSx0aGlzLnNlZWtUaW1lPnRoaXMucGxheWVyLm1lZGlhLmR1cmF0aW9uLTEmJih0aGlzLnNlZWtUaW1lPXRoaXMucGxheWVyLm1lZGlhLmR1cmF0aW9uLTEpLHRoaXMubW91c2VQb3NYPWUucGFnZVgsdGhpcy5lbGVtZW50cy50aHVtYi50aW1lLmlubmVyVGV4dD1VZSh0aGlzLnNlZWtUaW1lKTtjb25zdCBhPW51bGw9PT0odD10aGlzLnBsYXllci5jb25maWcubWFya2Vycyl8fHZvaWQgMD09PXR8fG51bGw9PT0oaT10LnBvaW50cyl8fHZvaWQgMD09PWk/dm9pZCAwOmkuZmluZCgoKHt0aW1lOmV9KT0+ZT09PU1hdGgucm91bmQodGhpcy5zZWVrVGltZSkpKTthJiZ0aGlzLmVsZW1lbnRzLnRodW1iLnRpbWUuaW5zZXJ0QWRqYWNlbnRIVE1MKFwiYWZ0ZXJiZWdpblwiLGAke2EubGFiZWx9PGJyPmApfXRoaXMuc2hvd0ltYWdlQXRDdXJyZW50VGltZSgpfX0pKSxlKHRoaXMsXCJlbmRNb3ZlXCIsKCgpPT57dGhpcy50b2dnbGVUaHVtYkNvbnRhaW5lcighMSwhMCl9KSksZSh0aGlzLFwic3RhcnRTY3J1YmJpbmdcIiwoZT0+eyhJKGUuYnV0dG9uKXx8ITE9PT1lLmJ1dHRvbnx8MD09PWUuYnV0dG9uKSYmKHRoaXMubW91c2VEb3duPSEwLHRoaXMucGxheWVyLm1lZGlhLmR1cmF0aW9uJiYodGhpcy50b2dnbGVTY3J1YmJpbmdDb250YWluZXIoITApLHRoaXMudG9nZ2xlVGh1bWJDb250YWluZXIoITEsITApLHRoaXMuc2hvd0ltYWdlQXRDdXJyZW50VGltZSgpKSl9KSksZSh0aGlzLFwiZW5kU2NydWJiaW5nXCIsKCgpPT57dGhpcy5tb3VzZURvd249ITEsTWF0aC5jZWlsKHRoaXMubGFzdFRpbWUpPT09TWF0aC5jZWlsKHRoaXMucGxheWVyLm1lZGlhLmN1cnJlbnRUaW1lKT90aGlzLnRvZ2dsZVNjcnViYmluZ0NvbnRhaW5lcighMSk6eWUuY2FsbCh0aGlzLnBsYXllcix0aGlzLnBsYXllci5tZWRpYSxcInRpbWV1cGRhdGVcIiwoKCk9Pnt0aGlzLm1vdXNlRG93bnx8dGhpcy50b2dnbGVTY3J1YmJpbmdDb250YWluZXIoITEpfSkpfSkpLGUodGhpcyxcImxpc3RlbmVyc1wiLCgoKT0+e3RoaXMucGxheWVyLm9uKFwicGxheVwiLCgoKT0+e3RoaXMudG9nZ2xlVGh1bWJDb250YWluZXIoITEsITApfSkpLHRoaXMucGxheWVyLm9uKFwic2Vla2VkXCIsKCgpPT57dGhpcy50b2dnbGVUaHVtYkNvbnRhaW5lcighMSl9KSksdGhpcy5wbGF5ZXIub24oXCJ0aW1ldXBkYXRlXCIsKCgpPT57dGhpcy5sYXN0VGltZT10aGlzLnBsYXllci5tZWRpYS5jdXJyZW50VGltZX0pKX0pKSxlKHRoaXMsXCJyZW5kZXJcIiwoKCk9Pnt0aGlzLmVsZW1lbnRzLnRodW1iLmNvbnRhaW5lcj1aKFwiZGl2XCIse2NsYXNzOnRoaXMucGxheWVyLmNvbmZpZy5jbGFzc05hbWVzLnByZXZpZXdUaHVtYm5haWxzLnRodW1iQ29udGFpbmVyfSksdGhpcy5lbGVtZW50cy50aHVtYi5pbWFnZUNvbnRhaW5lcj1aKFwiZGl2XCIse2NsYXNzOnRoaXMucGxheWVyLmNvbmZpZy5jbGFzc05hbWVzLnByZXZpZXdUaHVtYm5haWxzLmltYWdlQ29udGFpbmVyfSksdGhpcy5lbGVtZW50cy50aHVtYi5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50cy50aHVtYi5pbWFnZUNvbnRhaW5lcik7Y29uc3QgZT1aKFwiZGl2XCIse2NsYXNzOnRoaXMucGxheWVyLmNvbmZpZy5jbGFzc05hbWVzLnByZXZpZXdUaHVtYm5haWxzLnRpbWVDb250YWluZXJ9KTt0aGlzLmVsZW1lbnRzLnRodW1iLnRpbWU9WihcInNwYW5cIix7fSxcIjAwOjAwXCIpLGUuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50cy50aHVtYi50aW1lKSx0aGlzLmVsZW1lbnRzLnRodW1iLmltYWdlQ29udGFpbmVyLmFwcGVuZENoaWxkKGUpLEgodGhpcy5wbGF5ZXIuZWxlbWVudHMucHJvZ3Jlc3MpJiZ0aGlzLnBsYXllci5lbGVtZW50cy5wcm9ncmVzcy5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnRzLnRodW1iLmNvbnRhaW5lciksdGhpcy5lbGVtZW50cy5zY3J1YmJpbmcuY29udGFpbmVyPVooXCJkaXZcIix7Y2xhc3M6dGhpcy5wbGF5ZXIuY29uZmlnLmNsYXNzTmFtZXMucHJldmlld1RodW1ibmFpbHMuc2NydWJiaW5nQ29udGFpbmVyfSksdGhpcy5wbGF5ZXIuZWxlbWVudHMud3JhcHBlci5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnRzLnNjcnViYmluZy5jb250YWluZXIpfSkpLGUodGhpcyxcImRlc3Ryb3lcIiwoKCk9Pnt0aGlzLmVsZW1lbnRzLnRodW1iLmNvbnRhaW5lciYmdGhpcy5lbGVtZW50cy50aHVtYi5jb250YWluZXIucmVtb3ZlKCksdGhpcy5lbGVtZW50cy5zY3J1YmJpbmcuY29udGFpbmVyJiZ0aGlzLmVsZW1lbnRzLnNjcnViYmluZy5jb250YWluZXIucmVtb3ZlKCl9KSksZSh0aGlzLFwic2hvd0ltYWdlQXRDdXJyZW50VGltZVwiLCgoKT0+e3RoaXMubW91c2VEb3duP3RoaXMuc2V0U2NydWJiaW5nQ29udGFpbmVyU2l6ZSgpOnRoaXMuc2V0VGh1bWJDb250YWluZXJTaXplQW5kUG9zKCk7Y29uc3QgZT10aGlzLnRodW1ibmFpbHNbMF0uZnJhbWVzLmZpbmRJbmRleCgoZT0+dGhpcy5zZWVrVGltZT49ZS5zdGFydFRpbWUmJnRoaXMuc2Vla1RpbWU8PWUuZW5kVGltZSkpLHQ9ZT49MDtsZXQgaT0wO3RoaXMubW91c2VEb3dufHx0aGlzLnRvZ2dsZVRodW1iQ29udGFpbmVyKHQpLHQmJih0aGlzLnRodW1ibmFpbHMuZm9yRWFjaCgoKHQscyk9Pnt0aGlzLmxvYWRlZEltYWdlcy5pbmNsdWRlcyh0LmZyYW1lc1tlXS50ZXh0KSYmKGk9cyl9KSksZSE9PXRoaXMuc2hvd2luZ1RodW1iJiYodGhpcy5zaG93aW5nVGh1bWI9ZSx0aGlzLmxvYWRJbWFnZShpKSkpfSkpLGUodGhpcyxcImxvYWRJbWFnZVwiLCgoZT0wKT0+e2NvbnN0IHQ9dGhpcy5zaG93aW5nVGh1bWIsaT10aGlzLnRodW1ibmFpbHNbZV0se3VybFByZWZpeDpzfT1pLG49aS5mcmFtZXNbdF0sYT1pLmZyYW1lc1t0XS50ZXh0LGw9cythO2lmKHRoaXMuY3VycmVudEltYWdlRWxlbWVudCYmdGhpcy5jdXJyZW50SW1hZ2VFbGVtZW50LmRhdGFzZXQuZmlsZW5hbWU9PT1hKXRoaXMuc2hvd0ltYWdlKHRoaXMuY3VycmVudEltYWdlRWxlbWVudCxuLGUsdCxhLCExKSx0aGlzLmN1cnJlbnRJbWFnZUVsZW1lbnQuZGF0YXNldC5pbmRleD10LHRoaXMucmVtb3ZlT2xkSW1hZ2VzKHRoaXMuY3VycmVudEltYWdlRWxlbWVudCk7ZWxzZXt0aGlzLmxvYWRpbmdJbWFnZSYmdGhpcy51c2luZ1Nwcml0ZXMmJih0aGlzLmxvYWRpbmdJbWFnZS5vbmxvYWQ9bnVsbCk7Y29uc3QgaT1uZXcgSW1hZ2U7aS5zcmM9bCxpLmRhdGFzZXQuaW5kZXg9dCxpLmRhdGFzZXQuZmlsZW5hbWU9YSx0aGlzLnNob3dpbmdUaHVtYkZpbGVuYW1lPWEsdGhpcy5wbGF5ZXIuZGVidWcubG9nKGBMb2FkaW5nIGltYWdlOiAke2x9YCksaS5vbmxvYWQ9KCk9PnRoaXMuc2hvd0ltYWdlKGksbixlLHQsYSwhMCksdGhpcy5sb2FkaW5nSW1hZ2U9aSx0aGlzLnJlbW92ZU9sZEltYWdlcyhpKX19KSksZSh0aGlzLFwic2hvd0ltYWdlXCIsKChlLHQsaSxzLG4sYT0hMCk9Pnt0aGlzLnBsYXllci5kZWJ1Zy5sb2coYFNob3dpbmcgdGh1bWI6ICR7bn0uIG51bTogJHtzfS4gcXVhbDogJHtpfS4gbmV3aW1nOiAke2F9YCksdGhpcy5zZXRJbWFnZVNpemVBbmRPZmZzZXQoZSx0KSxhJiYodGhpcy5jdXJyZW50SW1hZ2VDb250YWluZXIuYXBwZW5kQ2hpbGQoZSksdGhpcy5jdXJyZW50SW1hZ2VFbGVtZW50PWUsdGhpcy5sb2FkZWRJbWFnZXMuaW5jbHVkZXMobil8fHRoaXMubG9hZGVkSW1hZ2VzLnB1c2gobikpLHRoaXMucHJlbG9hZE5lYXJieShzLCEwKS50aGVuKHRoaXMucHJlbG9hZE5lYXJieShzLCExKSkudGhlbih0aGlzLmdldEhpZ2hlclF1YWxpdHkoaSxlLHQsbikpfSkpLGUodGhpcyxcInJlbW92ZU9sZEltYWdlc1wiLChlPT57QXJyYXkuZnJvbSh0aGlzLmN1cnJlbnRJbWFnZUNvbnRhaW5lci5jaGlsZHJlbikuZm9yRWFjaCgodD0+e2lmKFwiaW1nXCIhPT10LnRhZ05hbWUudG9Mb3dlckNhc2UoKSlyZXR1cm47Y29uc3QgaT10aGlzLnVzaW5nU3ByaXRlcz81MDA6MWUzO2lmKHQuZGF0YXNldC5pbmRleCE9PWUuZGF0YXNldC5pbmRleCYmIXQuZGF0YXNldC5kZWxldGluZyl7dC5kYXRhc2V0LmRlbGV0aW5nPSEwO2NvbnN0e2N1cnJlbnRJbWFnZUNvbnRhaW5lcjplfT10aGlzO3NldFRpbWVvdXQoKCgpPT57ZS5yZW1vdmVDaGlsZCh0KSx0aGlzLnBsYXllci5kZWJ1Zy5sb2coYFJlbW92aW5nIHRodW1iOiAke3QuZGF0YXNldC5maWxlbmFtZX1gKX0pLGkpfX0pKX0pKSxlKHRoaXMsXCJwcmVsb2FkTmVhcmJ5XCIsKChlLHQ9ITApPT5uZXcgUHJvbWlzZSgoaT0+e3NldFRpbWVvdXQoKCgpPT57Y29uc3Qgcz10aGlzLnRodW1ibmFpbHNbMF0uZnJhbWVzW2VdLnRleHQ7aWYodGhpcy5zaG93aW5nVGh1bWJGaWxlbmFtZT09PXMpe2xldCBuO249dD90aGlzLnRodW1ibmFpbHNbMF0uZnJhbWVzLnNsaWNlKGUpOnRoaXMudGh1bWJuYWlsc1swXS5mcmFtZXMuc2xpY2UoMCxlKS5yZXZlcnNlKCk7bGV0IGE9ITE7bi5mb3JFYWNoKChlPT57Y29uc3QgdD1lLnRleHQ7aWYodCE9PXMmJiF0aGlzLmxvYWRlZEltYWdlcy5pbmNsdWRlcyh0KSl7YT0hMCx0aGlzLnBsYXllci5kZWJ1Zy5sb2coYFByZWxvYWRpbmcgdGh1bWIgZmlsZW5hbWU6ICR7dH1gKTtjb25zdHt1cmxQcmVmaXg6ZX09dGhpcy50aHVtYm5haWxzWzBdLHM9ZSt0LG49bmV3IEltYWdlO24uc3JjPXMsbi5vbmxvYWQ9KCk9Pnt0aGlzLnBsYXllci5kZWJ1Zy5sb2coYFByZWxvYWRlZCB0aHVtYiBmaWxlbmFtZTogJHt0fWApLHRoaXMubG9hZGVkSW1hZ2VzLmluY2x1ZGVzKHQpfHx0aGlzLmxvYWRlZEltYWdlcy5wdXNoKHQpLGkoKX19fSkpLGF8fGkoKX19KSwzMDApfSkpKSksZSh0aGlzLFwiZ2V0SGlnaGVyUXVhbGl0eVwiLCgoZSx0LGkscyk9PntpZihlPHRoaXMudGh1bWJuYWlscy5sZW5ndGgtMSl7bGV0IG49dC5uYXR1cmFsSGVpZ2h0O3RoaXMudXNpbmdTcHJpdGVzJiYobj1pLmgpLG48dGhpcy50aHVtYkNvbnRhaW5lckhlaWdodCYmc2V0VGltZW91dCgoKCk9Pnt0aGlzLnNob3dpbmdUaHVtYkZpbGVuYW1lPT09cyYmKHRoaXMucGxheWVyLmRlYnVnLmxvZyhgU2hvd2luZyBoaWdoZXIgcXVhbGl0eSB0aHVtYiBmb3I6ICR7c31gKSx0aGlzLmxvYWRJbWFnZShlKzEpKX0pLDMwMCl9fSkpLGUodGhpcyxcInRvZ2dsZVRodW1iQ29udGFpbmVyXCIsKChlPSExLHQ9ITEpPT57Y29uc3QgaT10aGlzLnBsYXllci5jb25maWcuY2xhc3NOYW1lcy5wcmV2aWV3VGh1bWJuYWlscy50aHVtYkNvbnRhaW5lclNob3duO3RoaXMuZWxlbWVudHMudGh1bWIuY29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUoaSxlKSwhZSYmdCYmKHRoaXMuc2hvd2luZ1RodW1iPW51bGwsdGhpcy5zaG93aW5nVGh1bWJGaWxlbmFtZT1udWxsKX0pKSxlKHRoaXMsXCJ0b2dnbGVTY3J1YmJpbmdDb250YWluZXJcIiwoKGU9ITEpPT57Y29uc3QgdD10aGlzLnBsYXllci5jb25maWcuY2xhc3NOYW1lcy5wcmV2aWV3VGh1bWJuYWlscy5zY3J1YmJpbmdDb250YWluZXJTaG93bjt0aGlzLmVsZW1lbnRzLnNjcnViYmluZy5jb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZSh0LGUpLGV8fCh0aGlzLnNob3dpbmdUaHVtYj1udWxsLHRoaXMuc2hvd2luZ1RodW1iRmlsZW5hbWU9bnVsbCl9KSksZSh0aGlzLFwiZGV0ZXJtaW5lQ29udGFpbmVyQXV0b1NpemluZ1wiLCgoKT0+eyh0aGlzLmVsZW1lbnRzLnRodW1iLmltYWdlQ29udGFpbmVyLmNsaWVudEhlaWdodD4yMHx8dGhpcy5lbGVtZW50cy50aHVtYi5pbWFnZUNvbnRhaW5lci5jbGllbnRXaWR0aD4yMCkmJih0aGlzLnNpemVTcGVjaWZpZWRJbkNTUz0hMCl9KSksZSh0aGlzLFwic2V0VGh1bWJDb250YWluZXJTaXplQW5kUG9zXCIsKCgpPT57Y29uc3R7aW1hZ2VDb250YWluZXI6ZX09dGhpcy5lbGVtZW50cy50aHVtYjtpZih0aGlzLnNpemVTcGVjaWZpZWRJbkNTUyl7aWYoZS5jbGllbnRIZWlnaHQ+MjAmJmUuY2xpZW50V2lkdGg8MjApe2NvbnN0IHQ9TWF0aC5mbG9vcihlLmNsaWVudEhlaWdodCp0aGlzLnRodW1iQXNwZWN0UmF0aW8pO2Uuc3R5bGUud2lkdGg9YCR7dH1weGB9ZWxzZSBpZihlLmNsaWVudEhlaWdodDwyMCYmZS5jbGllbnRXaWR0aD4yMCl7Y29uc3QgdD1NYXRoLmZsb29yKGUuY2xpZW50V2lkdGgvdGhpcy50aHVtYkFzcGVjdFJhdGlvKTtlLnN0eWxlLmhlaWdodD1gJHt0fXB4YH19ZWxzZXtjb25zdCB0PU1hdGguZmxvb3IodGhpcy50aHVtYkNvbnRhaW5lckhlaWdodCp0aGlzLnRodW1iQXNwZWN0UmF0aW8pO2Uuc3R5bGUuaGVpZ2h0PWAke3RoaXMudGh1bWJDb250YWluZXJIZWlnaHR9cHhgLGUuc3R5bGUud2lkdGg9YCR7dH1weGB9dGhpcy5zZXRUaHVtYkNvbnRhaW5lclBvcygpfSkpLGUodGhpcyxcInNldFRodW1iQ29udGFpbmVyUG9zXCIsKCgpPT57Y29uc3QgZT10aGlzLnBsYXllci5lbGVtZW50cy5wcm9ncmVzcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx0PXRoaXMucGxheWVyLmVsZW1lbnRzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx7Y29udGFpbmVyOml9PXRoaXMuZWxlbWVudHMudGh1bWIscz10LmxlZnQtZS5sZWZ0KzEwLG49dC5yaWdodC1lLmxlZnQtaS5jbGllbnRXaWR0aC0xMCxhPXRoaXMubW91c2VQb3NYLWUubGVmdC1pLmNsaWVudFdpZHRoLzIsbD1mdChhLHMsbik7aS5zdHlsZS5sZWZ0PWAke2x9cHhgLGkuc3R5bGUuc2V0UHJvcGVydHkoXCItLXByZXZpZXctYXJyb3ctb2Zmc2V0XCIsYS1sK1wicHhcIil9KSksZSh0aGlzLFwic2V0U2NydWJiaW5nQ29udGFpbmVyU2l6ZVwiLCgoKT0+e2NvbnN0e3dpZHRoOmUsaGVpZ2h0OnR9PXl0KHRoaXMudGh1bWJBc3BlY3RSYXRpbyx7d2lkdGg6dGhpcy5wbGF5ZXIubWVkaWEuY2xpZW50V2lkdGgsaGVpZ2h0OnRoaXMucGxheWVyLm1lZGlhLmNsaWVudEhlaWdodH0pO3RoaXMuZWxlbWVudHMuc2NydWJiaW5nLmNvbnRhaW5lci5zdHlsZS53aWR0aD1gJHtlfXB4YCx0aGlzLmVsZW1lbnRzLnNjcnViYmluZy5jb250YWluZXIuc3R5bGUuaGVpZ2h0PWAke3R9cHhgfSkpLGUodGhpcyxcInNldEltYWdlU2l6ZUFuZE9mZnNldFwiLCgoZSx0KT0+e2lmKCF0aGlzLnVzaW5nU3ByaXRlcylyZXR1cm47Y29uc3QgaT10aGlzLnRodW1iQ29udGFpbmVySGVpZ2h0L3QuaDtlLnN0eWxlLmhlaWdodD1lLm5hdHVyYWxIZWlnaHQqaStcInB4XCIsZS5zdHlsZS53aWR0aD1lLm5hdHVyYWxXaWR0aCppK1wicHhcIixlLnN0eWxlLmxlZnQ9YC0ke3QueCppfXB4YCxlLnN0eWxlLnRvcD1gLSR7dC55Kml9cHhgfSkpLHRoaXMucGxheWVyPXQsdGhpcy50aHVtYm5haWxzPVtdLHRoaXMubG9hZGVkPSExLHRoaXMubGFzdE1vdXNlTW92ZVRpbWU9RGF0ZS5ub3coKSx0aGlzLm1vdXNlRG93bj0hMSx0aGlzLmxvYWRlZEltYWdlcz1bXSx0aGlzLmVsZW1lbnRzPXt0aHVtYjp7fSxzY3J1YmJpbmc6e319LHRoaXMubG9hZCgpfWdldCBlbmFibGVkKCl7cmV0dXJuIHRoaXMucGxheWVyLmlzSFRNTDUmJnRoaXMucGxheWVyLmlzVmlkZW8mJnRoaXMucGxheWVyLmNvbmZpZy5wcmV2aWV3VGh1bWJuYWlscy5lbmFibGVkfWdldCBjdXJyZW50SW1hZ2VDb250YWluZXIoKXtyZXR1cm4gdGhpcy5tb3VzZURvd24/dGhpcy5lbGVtZW50cy5zY3J1YmJpbmcuY29udGFpbmVyOnRoaXMuZWxlbWVudHMudGh1bWIuaW1hZ2VDb250YWluZXJ9Z2V0IHVzaW5nU3ByaXRlcygpe3JldHVybiBPYmplY3Qua2V5cyh0aGlzLnRodW1ibmFpbHNbMF0uZnJhbWVzWzBdKS5pbmNsdWRlcyhcIndcIil9Z2V0IHRodW1iQXNwZWN0UmF0aW8oKXtyZXR1cm4gdGhpcy51c2luZ1Nwcml0ZXM/dGhpcy50aHVtYm5haWxzWzBdLmZyYW1lc1swXS53L3RoaXMudGh1bWJuYWlsc1swXS5mcmFtZXNbMF0uaDp0aGlzLnRodW1ibmFpbHNbMF0ud2lkdGgvdGhpcy50aHVtYm5haWxzWzBdLmhlaWdodH1nZXQgdGh1bWJDb250YWluZXJIZWlnaHQoKXtpZih0aGlzLm1vdXNlRG93bil7Y29uc3R7aGVpZ2h0OmV9PXl0KHRoaXMudGh1bWJBc3BlY3RSYXRpbyx7d2lkdGg6dGhpcy5wbGF5ZXIubWVkaWEuY2xpZW50V2lkdGgsaGVpZ2h0OnRoaXMucGxheWVyLm1lZGlhLmNsaWVudEhlaWdodH0pO3JldHVybiBlfXJldHVybiB0aGlzLnNpemVTcGVjaWZpZWRJbkNTUz90aGlzLmVsZW1lbnRzLnRodW1iLmltYWdlQ29udGFpbmVyLmNsaWVudEhlaWdodDpNYXRoLmZsb29yKHRoaXMucGxheWVyLm1lZGlhLmNsaWVudFdpZHRoL3RoaXMudGh1bWJBc3BlY3RSYXRpby80KX1nZXQgY3VycmVudEltYWdlRWxlbWVudCgpe3JldHVybiB0aGlzLm1vdXNlRG93bj90aGlzLmN1cnJlbnRTY3J1YmJpbmdJbWFnZUVsZW1lbnQ6dGhpcy5jdXJyZW50VGh1bWJuYWlsSW1hZ2VFbGVtZW50fXNldCBjdXJyZW50SW1hZ2VFbGVtZW50KGUpe3RoaXMubW91c2VEb3duP3RoaXMuY3VycmVudFNjcnViYmluZ0ltYWdlRWxlbWVudD1lOnRoaXMuY3VycmVudFRodW1ibmFpbEltYWdlRWxlbWVudD1lfX1jb25zdCB3dD17aW5zZXJ0RWxlbWVudHMoZSx0KXtfKHQpP2VlKGUsdGhpcy5tZWRpYSx7c3JjOnR9KTpEKHQpJiZ0LmZvckVhY2goKHQ9PntlZShlLHRoaXMubWVkaWEsdCl9KSl9LGNoYW5nZShlKXtRKGUsXCJzb3VyY2VzLmxlbmd0aFwiKT8oTGUuY2FuY2VsUmVxdWVzdHMuY2FsbCh0aGlzKSx0aGlzLmRlc3Ryb3kuY2FsbCh0aGlzLCgoKT0+e3RoaXMub3B0aW9ucy5xdWFsaXR5PVtdLHRlKHRoaXMubWVkaWEpLHRoaXMubWVkaWE9bnVsbCxIKHRoaXMuZWxlbWVudHMuY29udGFpbmVyKSYmdGhpcy5lbGVtZW50cy5jb250YWluZXIucmVtb3ZlQXR0cmlidXRlKFwiY2xhc3NcIik7Y29uc3R7c291cmNlczp0LHR5cGU6aX09ZSxbe3Byb3ZpZGVyOnM9R2UuaHRtbDUsc3JjOm59XT10LGE9XCJodG1sNVwiPT09cz9pOlwiZGl2XCIsbD1cImh0bWw1XCI9PT1zP3t9OntzcmM6bn07T2JqZWN0LmFzc2lnbih0aGlzLHtwcm92aWRlcjpzLHR5cGU6aSxzdXBwb3J0ZWQ6bWUuY2hlY2soaSxzLHRoaXMuY29uZmlnLnBsYXlzaW5saW5lKSxtZWRpYTpaKGEsbCl9KSx0aGlzLmVsZW1lbnRzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLm1lZGlhKSxPKGUuYXV0b3BsYXkpJiYodGhpcy5jb25maWcuYXV0b3BsYXk9ZS5hdXRvcGxheSksdGhpcy5pc0hUTUw1JiYodGhpcy5jb25maWcuY3Jvc3NvcmlnaW4mJnRoaXMubWVkaWEuc2V0QXR0cmlidXRlKFwiY3Jvc3NvcmlnaW5cIixcIlwiKSx0aGlzLmNvbmZpZy5hdXRvcGxheSYmdGhpcy5tZWRpYS5zZXRBdHRyaWJ1dGUoXCJhdXRvcGxheVwiLFwiXCIpLFcoZS5wb3N0ZXIpfHwodGhpcy5wb3N0ZXI9ZS5wb3N0ZXIpLHRoaXMuY29uZmlnLmxvb3AuYWN0aXZlJiZ0aGlzLm1lZGlhLnNldEF0dHJpYnV0ZShcImxvb3BcIixcIlwiKSx0aGlzLmNvbmZpZy5tdXRlZCYmdGhpcy5tZWRpYS5zZXRBdHRyaWJ1dGUoXCJtdXRlZFwiLFwiXCIpLHRoaXMuY29uZmlnLnBsYXlzaW5saW5lJiZ0aGlzLm1lZGlhLnNldEF0dHJpYnV0ZShcInBsYXlzaW5saW5lXCIsXCJcIikpLGF0LmFkZFN0eWxlSG9vay5jYWxsKHRoaXMpLHRoaXMuaXNIVE1MNSYmd3QuaW5zZXJ0RWxlbWVudHMuY2FsbCh0aGlzLFwic291cmNlXCIsdCksdGhpcy5jb25maWcudGl0bGU9ZS50aXRsZSxwdC5zZXR1cC5jYWxsKHRoaXMpLHRoaXMuaXNIVE1MNSYmT2JqZWN0LmtleXMoZSkuaW5jbHVkZXMoXCJ0cmFja3NcIikmJnd0Lmluc2VydEVsZW1lbnRzLmNhbGwodGhpcyxcInRyYWNrXCIsZS50cmFja3MpLCh0aGlzLmlzSFRNTDV8fHRoaXMuaXNFbWJlZCYmIXRoaXMuc3VwcG9ydGVkLnVpKSYmYXQuYnVpbGQuY2FsbCh0aGlzKSx0aGlzLmlzSFRNTDUmJnRoaXMubWVkaWEubG9hZCgpLFcoZS5wcmV2aWV3VGh1bWJuYWlscyl8fChPYmplY3QuYXNzaWduKHRoaXMuY29uZmlnLnByZXZpZXdUaHVtYm5haWxzLGUucHJldmlld1RodW1ibmFpbHMpLHRoaXMucHJldmlld1RodW1ibmFpbHMmJnRoaXMucHJldmlld1RodW1ibmFpbHMubG9hZGVkJiYodGhpcy5wcmV2aWV3VGh1bWJuYWlscy5kZXN0cm95KCksdGhpcy5wcmV2aWV3VGh1bWJuYWlscz1udWxsKSx0aGlzLmNvbmZpZy5wcmV2aWV3VGh1bWJuYWlscy5lbmFibGVkJiYodGhpcy5wcmV2aWV3VGh1bWJuYWlscz1uZXcgdnQodGhpcykpKSx0aGlzLmZ1bGxzY3JlZW4udXBkYXRlKCl9KSwhMCkpOnRoaXMuZGVidWcud2FybihcIkludmFsaWQgc291cmNlIGZvcm1hdFwiKX19O2NsYXNzIFR0e2NvbnN0cnVjdG9yKHQsaSl7aWYoZSh0aGlzLFwicGxheVwiLCgoKT0+aih0aGlzLm1lZGlhLnBsYXkpPyh0aGlzLmFkcyYmdGhpcy5hZHMuZW5hYmxlZCYmdGhpcy5hZHMubWFuYWdlclByb21pc2UudGhlbigoKCk9PnRoaXMuYWRzLnBsYXkoKSkpLmNhdGNoKCgoKT0+a2UodGhpcy5tZWRpYS5wbGF5KCkpKSksdGhpcy5tZWRpYS5wbGF5KCkpOm51bGwpKSxlKHRoaXMsXCJwYXVzZVwiLCgoKT0+dGhpcy5wbGF5aW5nJiZqKHRoaXMubWVkaWEucGF1c2UpP3RoaXMubWVkaWEucGF1c2UoKTpudWxsKSksZSh0aGlzLFwidG9nZ2xlUGxheVwiLChlPT4oTyhlKT9lOiF0aGlzLnBsYXlpbmcpP3RoaXMucGxheSgpOnRoaXMucGF1c2UoKSkpLGUodGhpcyxcInN0b3BcIiwoKCk9Pnt0aGlzLmlzSFRNTDU/KHRoaXMucGF1c2UoKSx0aGlzLnJlc3RhcnQoKSk6aih0aGlzLm1lZGlhLnN0b3ApJiZ0aGlzLm1lZGlhLnN0b3AoKX0pKSxlKHRoaXMsXCJyZXN0YXJ0XCIsKCgpPT57dGhpcy5jdXJyZW50VGltZT0wfSkpLGUodGhpcyxcInJld2luZFwiLChlPT57dGhpcy5jdXJyZW50VGltZS09JChlKT9lOnRoaXMuY29uZmlnLnNlZWtUaW1lfSkpLGUodGhpcyxcImZvcndhcmRcIiwoZT0+e3RoaXMuY3VycmVudFRpbWUrPSQoZSk/ZTp0aGlzLmNvbmZpZy5zZWVrVGltZX0pKSxlKHRoaXMsXCJpbmNyZWFzZVZvbHVtZVwiLChlPT57Y29uc3QgdD10aGlzLm1lZGlhLm11dGVkPzA6dGhpcy52b2x1bWU7dGhpcy52b2x1bWU9dCsoJChlKT9lOjApfSkpLGUodGhpcyxcImRlY3JlYXNlVm9sdW1lXCIsKGU9Pnt0aGlzLmluY3JlYXNlVm9sdW1lKC1lKX0pKSxlKHRoaXMsXCJhaXJwbGF5XCIsKCgpPT57bWUuYWlycGxheSYmdGhpcy5tZWRpYS53ZWJraXRTaG93UGxheWJhY2tUYXJnZXRQaWNrZXIoKX0pKSxlKHRoaXMsXCJ0b2dnbGVDb250cm9sc1wiLChlPT57aWYodGhpcy5zdXBwb3J0ZWQudWkmJiF0aGlzLmlzQXVkaW8pe2NvbnN0IHQ9b2UodGhpcy5lbGVtZW50cy5jb250YWluZXIsdGhpcy5jb25maWcuY2xhc3NOYW1lcy5oaWRlQ29udHJvbHMpLGk9dm9pZCAwPT09ZT92b2lkIDA6IWUscz1sZSh0aGlzLmVsZW1lbnRzLmNvbnRhaW5lcix0aGlzLmNvbmZpZy5jbGFzc05hbWVzLmhpZGVDb250cm9scyxpKTtpZihzJiZEKHRoaXMuY29uZmlnLmNvbnRyb2xzKSYmdGhpcy5jb25maWcuY29udHJvbHMuaW5jbHVkZXMoXCJzZXR0aW5nc1wiKSYmIVcodGhpcy5jb25maWcuc2V0dGluZ3MpJiZXZS50b2dnbGVNZW51LmNhbGwodGhpcywhMSkscyE9PXQpe2NvbnN0IGU9cz9cImNvbnRyb2xzaGlkZGVuXCI6XCJjb250cm9sc3Nob3duXCI7dmUuY2FsbCh0aGlzLHRoaXMubWVkaWEsZSl9cmV0dXJuIXN9cmV0dXJuITF9KSksZSh0aGlzLFwib25cIiwoKGUsdCk9PntmZS5jYWxsKHRoaXMsdGhpcy5lbGVtZW50cy5jb250YWluZXIsZSx0KX0pKSxlKHRoaXMsXCJvbmNlXCIsKChlLHQpPT57eWUuY2FsbCh0aGlzLHRoaXMuZWxlbWVudHMuY29udGFpbmVyLGUsdCl9KSksZSh0aGlzLFwib2ZmXCIsKChlLHQpPT57YmUodGhpcy5lbGVtZW50cy5jb250YWluZXIsZSx0KX0pKSxlKHRoaXMsXCJkZXN0cm95XCIsKChlLHQ9ITEpPT57aWYoIXRoaXMucmVhZHkpcmV0dXJuO2NvbnN0IGk9KCk9Pntkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93PVwiXCIsdGhpcy5lbWJlZD1udWxsLHQ/KE9iamVjdC5rZXlzKHRoaXMuZWxlbWVudHMpLmxlbmd0aCYmKHRlKHRoaXMuZWxlbWVudHMuYnV0dG9ucy5wbGF5KSx0ZSh0aGlzLmVsZW1lbnRzLmNhcHRpb25zKSx0ZSh0aGlzLmVsZW1lbnRzLmNvbnRyb2xzKSx0ZSh0aGlzLmVsZW1lbnRzLndyYXBwZXIpLHRoaXMuZWxlbWVudHMuYnV0dG9ucy5wbGF5PW51bGwsdGhpcy5lbGVtZW50cy5jYXB0aW9ucz1udWxsLHRoaXMuZWxlbWVudHMuY29udHJvbHM9bnVsbCx0aGlzLmVsZW1lbnRzLndyYXBwZXI9bnVsbCksaihlKSYmZSgpKTood2UuY2FsbCh0aGlzKSxMZS5jYW5jZWxSZXF1ZXN0cy5jYWxsKHRoaXMpLHNlKHRoaXMuZWxlbWVudHMub3JpZ2luYWwsdGhpcy5lbGVtZW50cy5jb250YWluZXIpLHZlLmNhbGwodGhpcyx0aGlzLmVsZW1lbnRzLm9yaWdpbmFsLFwiZGVzdHJveWVkXCIsITApLGooZSkmJmUuY2FsbCh0aGlzLmVsZW1lbnRzLm9yaWdpbmFsKSx0aGlzLnJlYWR5PSExLHNldFRpbWVvdXQoKCgpPT57dGhpcy5lbGVtZW50cz1udWxsLHRoaXMubWVkaWE9bnVsbH0pLDIwMCkpfTt0aGlzLnN0b3AoKSxjbGVhclRpbWVvdXQodGhpcy50aW1lcnMubG9hZGluZyksY2xlYXJUaW1lb3V0KHRoaXMudGltZXJzLmNvbnRyb2xzKSxjbGVhclRpbWVvdXQodGhpcy50aW1lcnMucmVzaXplZCksdGhpcy5pc0hUTUw1PyhhdC50b2dnbGVOYXRpdmVDb250cm9scy5jYWxsKHRoaXMsITApLGkoKSk6dGhpcy5pc1lvdVR1YmU/KGNsZWFySW50ZXJ2YWwodGhpcy50aW1lcnMuYnVmZmVyaW5nKSxjbGVhckludGVydmFsKHRoaXMudGltZXJzLnBsYXlpbmcpLG51bGwhPT10aGlzLmVtYmVkJiZqKHRoaXMuZW1iZWQuZGVzdHJveSkmJnRoaXMuZW1iZWQuZGVzdHJveSgpLGkoKSk6dGhpcy5pc1ZpbWVvJiYobnVsbCE9PXRoaXMuZW1iZWQmJnRoaXMuZW1iZWQudW5sb2FkKCkudGhlbihpKSxzZXRUaW1lb3V0KGksMjAwKSl9KSksZSh0aGlzLFwic3VwcG9ydHNcIiwoZT0+bWUubWltZS5jYWxsKHRoaXMsZSkpKSx0aGlzLnRpbWVycz17fSx0aGlzLnJlYWR5PSExLHRoaXMubG9hZGluZz0hMSx0aGlzLmZhaWxlZD0hMSx0aGlzLnRvdWNoPW1lLnRvdWNoLHRoaXMubWVkaWE9dCxfKHRoaXMubWVkaWEpJiYodGhpcy5tZWRpYT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHRoaXMubWVkaWEpKSwod2luZG93LmpRdWVyeSYmdGhpcy5tZWRpYSBpbnN0YW5jZW9mIGpRdWVyeXx8cSh0aGlzLm1lZGlhKXx8RCh0aGlzLm1lZGlhKSkmJih0aGlzLm1lZGlhPXRoaXMubWVkaWFbMF0pLHRoaXMuY29uZmlnPVgoe30sUWUsVHQuZGVmYXVsdHMsaXx8e30sKCgpPT57dHJ5e3JldHVybiBKU09OLnBhcnNlKHRoaXMubWVkaWEuZ2V0QXR0cmlidXRlKFwiZGF0YS1wbHlyLWNvbmZpZ1wiKSl9Y2F0Y2goZSl7cmV0dXJue319fSkoKSksdGhpcy5lbGVtZW50cz17Y29udGFpbmVyOm51bGwsZnVsbHNjcmVlbjpudWxsLGNhcHRpb25zOm51bGwsYnV0dG9uczp7fSxkaXNwbGF5Ont9LHByb2dyZXNzOnt9LGlucHV0czp7fSxzZXR0aW5nczp7cG9wdXA6bnVsbCxtZW51Om51bGwscGFuZWxzOnt9LGJ1dHRvbnM6e319fSx0aGlzLmNhcHRpb25zPXthY3RpdmU6bnVsbCxjdXJyZW50VHJhY2s6LTEsbWV0YTpuZXcgV2Vha01hcH0sdGhpcy5mdWxsc2NyZWVuPXthY3RpdmU6ITF9LHRoaXMub3B0aW9ucz17c3BlZWQ6W10scXVhbGl0eTpbXX0sdGhpcy5kZWJ1Zz1uZXcgaXQodGhpcy5jb25maWcuZGVidWcpLHRoaXMuZGVidWcubG9nKFwiQ29uZmlnXCIsdGhpcy5jb25maWcpLHRoaXMuZGVidWcubG9nKFwiU3VwcG9ydFwiLG1lKSxJKHRoaXMubWVkaWEpfHwhSCh0aGlzLm1lZGlhKSlyZXR1cm4gdm9pZCB0aGlzLmRlYnVnLmVycm9yKFwiU2V0dXAgZmFpbGVkOiBubyBzdWl0YWJsZSBlbGVtZW50IHBhc3NlZFwiKTtpZih0aGlzLm1lZGlhLnBseXIpcmV0dXJuIHZvaWQgdGhpcy5kZWJ1Zy53YXJuKFwiVGFyZ2V0IGFscmVhZHkgc2V0dXBcIik7aWYoIXRoaXMuY29uZmlnLmVuYWJsZWQpcmV0dXJuIHZvaWQgdGhpcy5kZWJ1Zy5lcnJvcihcIlNldHVwIGZhaWxlZDogZGlzYWJsZWQgYnkgY29uZmlnXCIpO2lmKCFtZS5jaGVjaygpLmFwaSlyZXR1cm4gdm9pZCB0aGlzLmRlYnVnLmVycm9yKFwiU2V0dXAgZmFpbGVkOiBubyBzdXBwb3J0XCIpO2NvbnN0IHM9dGhpcy5tZWRpYS5jbG9uZU5vZGUoITApO3MuYXV0b3BsYXk9ITEsdGhpcy5lbGVtZW50cy5vcmlnaW5hbD1zO2NvbnN0IG49dGhpcy5tZWRpYS50YWdOYW1lLnRvTG93ZXJDYXNlKCk7bGV0IGE9bnVsbCxsPW51bGw7c3dpdGNoKG4pe2Nhc2VcImRpdlwiOmlmKGE9dGhpcy5tZWRpYS5xdWVyeVNlbGVjdG9yKFwiaWZyYW1lXCIpLEgoYSkpe2lmKGw9emUoYS5nZXRBdHRyaWJ1dGUoXCJzcmNcIikpLHRoaXMucHJvdmlkZXI9ZnVuY3Rpb24oZSl7cmV0dXJuL14oaHR0cHM/OlxcL1xcLyk/KHd3d1xcLik/KHlvdXR1YmVcXC5jb218eW91dHViZS1ub2Nvb2tpZVxcLmNvbXx5b3V0dVxcLj9iZSlcXC8uKyQvLnRlc3QoZSk/R2UueW91dHViZTovXmh0dHBzPzpcXC9cXC9wbGF5ZXIudmltZW8uY29tXFwvdmlkZW9cXC9cXGR7MCw5fSg/PVxcYnxcXC8pLy50ZXN0KGUpP0dlLnZpbWVvOm51bGx9KGwudG9TdHJpbmcoKSksdGhpcy5lbGVtZW50cy5jb250YWluZXI9dGhpcy5tZWRpYSx0aGlzLm1lZGlhPWEsdGhpcy5lbGVtZW50cy5jb250YWluZXIuY2xhc3NOYW1lPVwiXCIsbC5zZWFyY2gubGVuZ3RoKXtjb25zdCBlPVtcIjFcIixcInRydWVcIl07ZS5pbmNsdWRlcyhsLnNlYXJjaFBhcmFtcy5nZXQoXCJhdXRvcGxheVwiKSkmJih0aGlzLmNvbmZpZy5hdXRvcGxheT0hMCksZS5pbmNsdWRlcyhsLnNlYXJjaFBhcmFtcy5nZXQoXCJsb29wXCIpKSYmKHRoaXMuY29uZmlnLmxvb3AuYWN0aXZlPSEwKSx0aGlzLmlzWW91VHViZT8odGhpcy5jb25maWcucGxheXNpbmxpbmU9ZS5pbmNsdWRlcyhsLnNlYXJjaFBhcmFtcy5nZXQoXCJwbGF5c2lubGluZVwiKSksdGhpcy5jb25maWcueW91dHViZS5obD1sLnNlYXJjaFBhcmFtcy5nZXQoXCJobFwiKSk6dGhpcy5jb25maWcucGxheXNpbmxpbmU9ITB9fWVsc2UgdGhpcy5wcm92aWRlcj10aGlzLm1lZGlhLmdldEF0dHJpYnV0ZSh0aGlzLmNvbmZpZy5hdHRyaWJ1dGVzLmVtYmVkLnByb3ZpZGVyKSx0aGlzLm1lZGlhLnJlbW92ZUF0dHJpYnV0ZSh0aGlzLmNvbmZpZy5hdHRyaWJ1dGVzLmVtYmVkLnByb3ZpZGVyKTtpZihXKHRoaXMucHJvdmlkZXIpfHwhT2JqZWN0LnZhbHVlcyhHZSkuaW5jbHVkZXModGhpcy5wcm92aWRlcikpcmV0dXJuIHZvaWQgdGhpcy5kZWJ1Zy5lcnJvcihcIlNldHVwIGZhaWxlZDogSW52YWxpZCBwcm92aWRlclwiKTt0aGlzLnR5cGU9ZXQ7YnJlYWs7Y2FzZVwidmlkZW9cIjpjYXNlXCJhdWRpb1wiOnRoaXMudHlwZT1uLHRoaXMucHJvdmlkZXI9R2UuaHRtbDUsdGhpcy5tZWRpYS5oYXNBdHRyaWJ1dGUoXCJjcm9zc29yaWdpblwiKSYmKHRoaXMuY29uZmlnLmNyb3Nzb3JpZ2luPSEwKSx0aGlzLm1lZGlhLmhhc0F0dHJpYnV0ZShcImF1dG9wbGF5XCIpJiYodGhpcy5jb25maWcuYXV0b3BsYXk9ITApLCh0aGlzLm1lZGlhLmhhc0F0dHJpYnV0ZShcInBsYXlzaW5saW5lXCIpfHx0aGlzLm1lZGlhLmhhc0F0dHJpYnV0ZShcIndlYmtpdC1wbGF5c2lubGluZVwiKSkmJih0aGlzLmNvbmZpZy5wbGF5c2lubGluZT0hMCksdGhpcy5tZWRpYS5oYXNBdHRyaWJ1dGUoXCJtdXRlZFwiKSYmKHRoaXMuY29uZmlnLm11dGVkPSEwKSx0aGlzLm1lZGlhLmhhc0F0dHJpYnV0ZShcImxvb3BcIikmJih0aGlzLmNvbmZpZy5sb29wLmFjdGl2ZT0hMCk7YnJlYWs7ZGVmYXVsdDpyZXR1cm4gdm9pZCB0aGlzLmRlYnVnLmVycm9yKFwiU2V0dXAgZmFpbGVkOiB1bnN1cHBvcnRlZCB0eXBlXCIpfXRoaXMuc3VwcG9ydGVkPW1lLmNoZWNrKHRoaXMudHlwZSx0aGlzLnByb3ZpZGVyLHRoaXMuY29uZmlnLnBsYXlzaW5saW5lKSx0aGlzLnN1cHBvcnRlZC5hcGk/KHRoaXMuZXZlbnRMaXN0ZW5lcnM9W10sdGhpcy5saXN0ZW5lcnM9bmV3IGx0KHRoaXMpLHRoaXMuc3RvcmFnZT1uZXcgUmUodGhpcyksdGhpcy5tZWRpYS5wbHlyPXRoaXMsSCh0aGlzLmVsZW1lbnRzLmNvbnRhaW5lcil8fCh0aGlzLmVsZW1lbnRzLmNvbnRhaW5lcj1aKFwiZGl2XCIse3RhYmluZGV4OjB9KSxKKHRoaXMubWVkaWEsdGhpcy5lbGVtZW50cy5jb250YWluZXIpKSxhdC5taWdyYXRlU3R5bGVzLmNhbGwodGhpcyksYXQuYWRkU3R5bGVIb29rLmNhbGwodGhpcykscHQuc2V0dXAuY2FsbCh0aGlzKSx0aGlzLmNvbmZpZy5kZWJ1ZyYmZmUuY2FsbCh0aGlzLHRoaXMuZWxlbWVudHMuY29udGFpbmVyLHRoaXMuY29uZmlnLmV2ZW50cy5qb2luKFwiIFwiKSwoZT0+e3RoaXMuZGVidWcubG9nKGBldmVudDogJHtlLnR5cGV9YCl9KSksdGhpcy5mdWxsc2NyZWVuPW5ldyBzdCh0aGlzKSwodGhpcy5pc0hUTUw1fHx0aGlzLmlzRW1iZWQmJiF0aGlzLnN1cHBvcnRlZC51aSkmJmF0LmJ1aWxkLmNhbGwodGhpcyksdGhpcy5saXN0ZW5lcnMuY29udGFpbmVyKCksdGhpcy5saXN0ZW5lcnMuZ2xvYmFsKCksdGhpcy5jb25maWcuYWRzLmVuYWJsZWQmJih0aGlzLmFkcz1uZXcgZ3QodGhpcykpLHRoaXMuaXNIVE1MNSYmdGhpcy5jb25maWcuYXV0b3BsYXkmJnRoaXMub25jZShcImNhbnBsYXlcIiwoKCk9PmtlKHRoaXMucGxheSgpKSkpLHRoaXMubGFzdFNlZWtUaW1lPTAsdGhpcy5jb25maWcucHJldmlld1RodW1ibmFpbHMuZW5hYmxlZCYmKHRoaXMucHJldmlld1RodW1ibmFpbHM9bmV3IHZ0KHRoaXMpKSk6dGhpcy5kZWJ1Zy5lcnJvcihcIlNldHVwIGZhaWxlZDogbm8gc3VwcG9ydFwiKX1nZXQgaXNIVE1MNSgpe3JldHVybiB0aGlzLnByb3ZpZGVyPT09R2UuaHRtbDV9Z2V0IGlzRW1iZWQoKXtyZXR1cm4gdGhpcy5pc1lvdVR1YmV8fHRoaXMuaXNWaW1lb31nZXQgaXNZb3VUdWJlKCl7cmV0dXJuIHRoaXMucHJvdmlkZXI9PT1HZS55b3V0dWJlfWdldCBpc1ZpbWVvKCl7cmV0dXJuIHRoaXMucHJvdmlkZXI9PT1HZS52aW1lb31nZXQgaXNWaWRlbygpe3JldHVybiB0aGlzLnR5cGU9PT1ldH1nZXQgaXNBdWRpbygpe3JldHVybiB0aGlzLnR5cGU9PT1aZX1nZXQgcGxheWluZygpe3JldHVybiBCb29sZWFuKHRoaXMucmVhZHkmJiF0aGlzLnBhdXNlZCYmIXRoaXMuZW5kZWQpfWdldCBwYXVzZWQoKXtyZXR1cm4gQm9vbGVhbih0aGlzLm1lZGlhLnBhdXNlZCl9Z2V0IHN0b3BwZWQoKXtyZXR1cm4gQm9vbGVhbih0aGlzLnBhdXNlZCYmMD09PXRoaXMuY3VycmVudFRpbWUpfWdldCBlbmRlZCgpe3JldHVybiBCb29sZWFuKHRoaXMubWVkaWEuZW5kZWQpfXNldCBjdXJyZW50VGltZShlKXtpZighdGhpcy5kdXJhdGlvbilyZXR1cm47Y29uc3QgdD0kKGUpJiZlPjA7dGhpcy5tZWRpYS5jdXJyZW50VGltZT10P01hdGgubWluKGUsdGhpcy5kdXJhdGlvbik6MCx0aGlzLmRlYnVnLmxvZyhgU2Vla2luZyB0byAke3RoaXMuY3VycmVudFRpbWV9IHNlY29uZHNgKX1nZXQgY3VycmVudFRpbWUoKXtyZXR1cm4gTnVtYmVyKHRoaXMubWVkaWEuY3VycmVudFRpbWUpfWdldCBidWZmZXJlZCgpe2NvbnN0e2J1ZmZlcmVkOmV9PXRoaXMubWVkaWE7cmV0dXJuICQoZSk/ZTplJiZlLmxlbmd0aCYmdGhpcy5kdXJhdGlvbj4wP2UuZW5kKDApL3RoaXMuZHVyYXRpb246MH1nZXQgc2Vla2luZygpe3JldHVybiBCb29sZWFuKHRoaXMubWVkaWEuc2Vla2luZyl9Z2V0IGR1cmF0aW9uKCl7Y29uc3QgZT1wYXJzZUZsb2F0KHRoaXMuY29uZmlnLmR1cmF0aW9uKSx0PSh0aGlzLm1lZGlhfHx7fSkuZHVyYXRpb24saT0kKHQpJiZ0IT09MS8wP3Q6MDtyZXR1cm4gZXx8aX1zZXQgdm9sdW1lKGUpe2xldCB0PWU7Xyh0KSYmKHQ9TnVtYmVyKHQpKSwkKHQpfHwodD10aGlzLnN0b3JhZ2UuZ2V0KFwidm9sdW1lXCIpKSwkKHQpfHwoe3ZvbHVtZTp0fT10aGlzLmNvbmZpZyksdD4xJiYodD0xKSx0PDAmJih0PTApLHRoaXMuY29uZmlnLnZvbHVtZT10LHRoaXMubWVkaWEudm9sdW1lPXQsIVcoZSkmJnRoaXMubXV0ZWQmJnQ+MCYmKHRoaXMubXV0ZWQ9ITEpfWdldCB2b2x1bWUoKXtyZXR1cm4gTnVtYmVyKHRoaXMubWVkaWEudm9sdW1lKX1zZXQgbXV0ZWQoZSl7bGV0IHQ9ZTtPKHQpfHwodD10aGlzLnN0b3JhZ2UuZ2V0KFwibXV0ZWRcIikpLE8odCl8fCh0PXRoaXMuY29uZmlnLm11dGVkKSx0aGlzLmNvbmZpZy5tdXRlZD10LHRoaXMubWVkaWEubXV0ZWQ9dH1nZXQgbXV0ZWQoKXtyZXR1cm4gQm9vbGVhbih0aGlzLm1lZGlhLm11dGVkKX1nZXQgaGFzQXVkaW8oKXtyZXR1cm4hdGhpcy5pc0hUTUw1fHwoISF0aGlzLmlzQXVkaW98fChCb29sZWFuKHRoaXMubWVkaWEubW96SGFzQXVkaW8pfHxCb29sZWFuKHRoaXMubWVkaWEud2Via2l0QXVkaW9EZWNvZGVkQnl0ZUNvdW50KXx8Qm9vbGVhbih0aGlzLm1lZGlhLmF1ZGlvVHJhY2tzJiZ0aGlzLm1lZGlhLmF1ZGlvVHJhY2tzLmxlbmd0aCkpKX1zZXQgc3BlZWQoZSl7bGV0IHQ9bnVsbDskKGUpJiYodD1lKSwkKHQpfHwodD10aGlzLnN0b3JhZ2UuZ2V0KFwic3BlZWRcIikpLCQodCl8fCh0PXRoaXMuY29uZmlnLnNwZWVkLnNlbGVjdGVkKTtjb25zdHttaW5pbXVtU3BlZWQ6aSxtYXhpbXVtU3BlZWQ6c309dGhpczt0PWZ0KHQsaSxzKSx0aGlzLmNvbmZpZy5zcGVlZC5zZWxlY3RlZD10LHNldFRpbWVvdXQoKCgpPT57dGhpcy5tZWRpYSYmKHRoaXMubWVkaWEucGxheWJhY2tSYXRlPXQpfSksMCl9Z2V0IHNwZWVkKCl7cmV0dXJuIE51bWJlcih0aGlzLm1lZGlhLnBsYXliYWNrUmF0ZSl9Z2V0IG1pbmltdW1TcGVlZCgpe3JldHVybiB0aGlzLmlzWW91VHViZT9NYXRoLm1pbiguLi50aGlzLm9wdGlvbnMuc3BlZWQpOnRoaXMuaXNWaW1lbz8uNTouMDYyNX1nZXQgbWF4aW11bVNwZWVkKCl7cmV0dXJuIHRoaXMuaXNZb3VUdWJlP01hdGgubWF4KC4uLnRoaXMub3B0aW9ucy5zcGVlZCk6dGhpcy5pc1ZpbWVvPzI6MTZ9c2V0IHF1YWxpdHkoZSl7Y29uc3QgdD10aGlzLmNvbmZpZy5xdWFsaXR5LGk9dGhpcy5vcHRpb25zLnF1YWxpdHk7aWYoIWkubGVuZ3RoKXJldHVybjtsZXQgcz1bIVcoZSkmJk51bWJlcihlKSx0aGlzLnN0b3JhZ2UuZ2V0KFwicXVhbGl0eVwiKSx0LnNlbGVjdGVkLHQuZGVmYXVsdF0uZmluZCgkKSxuPSEwO2lmKCFpLmluY2x1ZGVzKHMpKXtjb25zdCBlPUFlKGkscyk7dGhpcy5kZWJ1Zy53YXJuKGBVbnN1cHBvcnRlZCBxdWFsaXR5IG9wdGlvbjogJHtzfSwgdXNpbmcgJHtlfSBpbnN0ZWFkYCkscz1lLG49ITF9dC5zZWxlY3RlZD1zLHRoaXMubWVkaWEucXVhbGl0eT1zLG4mJnRoaXMuc3RvcmFnZS5zZXQoe3F1YWxpdHk6c30pfWdldCBxdWFsaXR5KCl7cmV0dXJuIHRoaXMubWVkaWEucXVhbGl0eX1zZXQgbG9vcChlKXtjb25zdCB0PU8oZSk/ZTp0aGlzLmNvbmZpZy5sb29wLmFjdGl2ZTt0aGlzLmNvbmZpZy5sb29wLmFjdGl2ZT10LHRoaXMubWVkaWEubG9vcD10fWdldCBsb29wKCl7cmV0dXJuIEJvb2xlYW4odGhpcy5tZWRpYS5sb29wKX1zZXQgc291cmNlKGUpe3d0LmNoYW5nZS5jYWxsKHRoaXMsZSl9Z2V0IHNvdXJjZSgpe3JldHVybiB0aGlzLm1lZGlhLmN1cnJlbnRTcmN9Z2V0IGRvd25sb2FkKCl7Y29uc3R7ZG93bmxvYWQ6ZX09dGhpcy5jb25maWcudXJscztyZXR1cm4gVShlKT9lOnRoaXMuc291cmNlfXNldCBkb3dubG9hZChlKXtVKGUpJiYodGhpcy5jb25maWcudXJscy5kb3dubG9hZD1lLFdlLnNldERvd25sb2FkVXJsLmNhbGwodGhpcykpfXNldCBwb3N0ZXIoZSl7dGhpcy5pc1ZpZGVvP2F0LnNldFBvc3Rlci5jYWxsKHRoaXMsZSwhMSkuY2F0Y2goKCgpPT57fSkpOnRoaXMuZGVidWcud2FybihcIlBvc3RlciBjYW4gb25seSBiZSBzZXQgZm9yIHZpZGVvXCIpfWdldCBwb3N0ZXIoKXtyZXR1cm4gdGhpcy5pc1ZpZGVvP3RoaXMubWVkaWEuZ2V0QXR0cmlidXRlKFwicG9zdGVyXCIpfHx0aGlzLm1lZGlhLmdldEF0dHJpYnV0ZShcImRhdGEtcG9zdGVyXCIpOm51bGx9Z2V0IHJhdGlvKCl7aWYoIXRoaXMuaXNWaWRlbylyZXR1cm4gbnVsbDtjb25zdCBlPU1lKE5lLmNhbGwodGhpcykpO3JldHVybiBEKGUpP2Uuam9pbihcIjpcIik6ZX1zZXQgcmF0aW8oZSl7dGhpcy5pc1ZpZGVvP18oZSkmJlBlKGUpPyh0aGlzLmNvbmZpZy5yYXRpbz1NZShlKSx4ZS5jYWxsKHRoaXMpKTp0aGlzLmRlYnVnLmVycm9yKGBJbnZhbGlkIGFzcGVjdCByYXRpbyBzcGVjaWZpZWQgKCR7ZX0pYCk6dGhpcy5kZWJ1Zy53YXJuKFwiQXNwZWN0IHJhdGlvIGNhbiBvbmx5IGJlIHNldCBmb3IgdmlkZW9cIil9c2V0IGF1dG9wbGF5KGUpe3RoaXMuY29uZmlnLmF1dG9wbGF5PU8oZSk/ZTp0aGlzLmNvbmZpZy5hdXRvcGxheX1nZXQgYXV0b3BsYXkoKXtyZXR1cm4gQm9vbGVhbih0aGlzLmNvbmZpZy5hdXRvcGxheSl9dG9nZ2xlQ2FwdGlvbnMoZSl7WWUudG9nZ2xlLmNhbGwodGhpcyxlLCExKX1zZXQgY3VycmVudFRyYWNrKGUpe1llLnNldC5jYWxsKHRoaXMsZSwhMSksWWUuc2V0dXAuY2FsbCh0aGlzKX1nZXQgY3VycmVudFRyYWNrKCl7Y29uc3R7dG9nZ2xlZDplLGN1cnJlbnRUcmFjazp0fT10aGlzLmNhcHRpb25zO3JldHVybiBlP3Q6LTF9c2V0IGxhbmd1YWdlKGUpe1llLnNldExhbmd1YWdlLmNhbGwodGhpcyxlLCExKX1nZXQgbGFuZ3VhZ2UoKXtyZXR1cm4oWWUuZ2V0Q3VycmVudFRyYWNrLmNhbGwodGhpcyl8fHt9KS5sYW5ndWFnZX1zZXQgcGlwKGUpe2lmKCFtZS5waXApcmV0dXJuO2NvbnN0IHQ9TyhlKT9lOiF0aGlzLnBpcDtqKHRoaXMubWVkaWEud2Via2l0U2V0UHJlc2VudGF0aW9uTW9kZSkmJnRoaXMubWVkaWEud2Via2l0U2V0UHJlc2VudGF0aW9uTW9kZSh0P1hlOkplKSxqKHRoaXMubWVkaWEucmVxdWVzdFBpY3R1cmVJblBpY3R1cmUpJiYoIXRoaXMucGlwJiZ0P3RoaXMubWVkaWEucmVxdWVzdFBpY3R1cmVJblBpY3R1cmUoKTp0aGlzLnBpcCYmIXQmJmRvY3VtZW50LmV4aXRQaWN0dXJlSW5QaWN0dXJlKCkpfWdldCBwaXAoKXtyZXR1cm4gbWUucGlwP1codGhpcy5tZWRpYS53ZWJraXRQcmVzZW50YXRpb25Nb2RlKT90aGlzLm1lZGlhPT09ZG9jdW1lbnQucGljdHVyZUluUGljdHVyZUVsZW1lbnQ6dGhpcy5tZWRpYS53ZWJraXRQcmVzZW50YXRpb25Nb2RlPT09WGU6bnVsbH1zZXRQcmV2aWV3VGh1bWJuYWlscyhlKXt0aGlzLnByZXZpZXdUaHVtYm5haWxzJiZ0aGlzLnByZXZpZXdUaHVtYm5haWxzLmxvYWRlZCYmKHRoaXMucHJldmlld1RodW1ibmFpbHMuZGVzdHJveSgpLHRoaXMucHJldmlld1RodW1ibmFpbHM9bnVsbCksT2JqZWN0LmFzc2lnbih0aGlzLmNvbmZpZy5wcmV2aWV3VGh1bWJuYWlscyxlKSx0aGlzLmNvbmZpZy5wcmV2aWV3VGh1bWJuYWlscy5lbmFibGVkJiYodGhpcy5wcmV2aWV3VGh1bWJuYWlscz1uZXcgdnQodGhpcykpfXN0YXRpYyBzdXBwb3J0ZWQoZSx0LGkpe3JldHVybiBtZS5jaGVjayhlLHQsaSl9c3RhdGljIGxvYWRTcHJpdGUoZSx0KXtyZXR1cm4gVmUoZSx0KX1zdGF0aWMgc2V0dXAoZSx0PXt9KXtsZXQgaT1udWxsO3JldHVybiBfKGUpP2k9QXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGUpKTpxKGUpP2k9QXJyYXkuZnJvbShlKTpEKGUpJiYoaT1lLmZpbHRlcihIKSksVyhpKT9udWxsOmkubWFwKChlPT5uZXcgVHQoZSx0KSkpfX12YXIga3Q7cmV0dXJuIFR0LmRlZmF1bHRzPShrdD1RZSxKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGt0KSkpLFR0fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGx5ci5taW4uanMubWFwXG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbl9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHRmdW5jdGlvbigpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcblx0XHRmdW5jdGlvbigpIHsgcmV0dXJuIG1vZHVsZTsgfTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIGRlZmluaXRpb24pIHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5nID0gKGZ1bmN0aW9uKCkge1xuXHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSByZXR1cm4gZ2xvYmFsVGhpcztcblx0dHJ5IHtcblx0XHRyZXR1cm4gdGhpcyB8fCBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JykgcmV0dXJuIHdpbmRvdztcblx0fVxufSkoKTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmosIHByb3ApIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApOyB9IiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJpbXBvcnQgUGx5ciBmcm9tICdwbHlyJztcbmltcG9ydCBDaXJjbGVUeXBlIGZyb20gJ2NpcmNsZXR5cGUnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBEQVRBXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IHJvb3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cbi8vIEhPTUUgTkFWSUdBVElPTiBESVNQTEFZIC8vXG5cbmNvbnN0IG5hdkVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmhvbWVfX25hdicpO1xuY29uc3QgbmF2TGlua3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaG9tZV9fbmF2LWxpbmsnKTtcbmNvbnN0IG5hdkltYWdlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmhvbWVfX25hdi1pbWFnZScpO1xuY29uc3QgY2lyY2xlVHlwZXMgPSBbXTtcblxuLy8gVklERU8gUExBWUVSUyAvL1xuXG5jb25zdCBnYWxsZXJ5VmlkZW9zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmdhbGxlcnlfX3ZpZGVvJyk7XG5sZXQgdmlkZW9QbGF5ZXJzID0gW107XG5cbi8vIEhFQURFUiBCQVIgQU5JTUFUSU9OIC8vXG5cbmNvbnN0IGhlYWRlckJhciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5oZWFkZXItYmFyJyk7XG5jb25zdCBoZWFkZXJMb2dvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmhlYWRlci1iYXJfX2xvZ28nKTtcbmxldCBzY3JvbGxPZmZzZXQgPSAwO1xuXG4vLyBOQVZJR0FUSU9OIE1FTlUgQU5JTUFUSU9OIC8vXG5cbmNvbnN0IGhlYWRlck5hdkJ0biA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5oZWFkZXItYmFyX19uYXYtYnV0dG9uJyk7XG5jb25zdCBoZWFkZXJOYXZNZW51ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmhlYWRlci1iYXJfX25hdi1tZW51Jyk7XG5jb25zdCBoZWFkZXJOYXZNZW51TGlzdEVscyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5oZWFkZXItYmFyX19uYXYtbWVudSBsaScpO1xuY29uc3QgaGVhZGVyTmF2T3ZlcmxheSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5oZWFkZXItYmFyX19uYXYtb3ZlcmxheScpO1xuY29uc3QgdG91Y2hQb3NpdGlvbiA9IHtcblx0aW5pdGlhbFg6IG51bGwsXG5cdGluaXRpYWxZOiBudWxsXG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBVVElMU1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyBDb252ZXJ0IHJlbSB0byBwaXhlbHMgYnkgZ2V0dGluZyBmb250LXNpemUgQ1NTIHByb3BlcnR5XG5mdW5jdGlvbiBjb252ZXJ0UmVtVG9QaXhlbHMocmVtKSB7XG5cdGxldCBmb250U2l6ZSA9IHBhcnNlRmxvYXQod2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkuZ2V0UHJvcGVydHlWYWx1ZSgnZm9udC1zaXplJykpO1xuXHRyZXR1cm4gcmVtICogZm9udFNpemU7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIExPR0lDXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIEhPTUUgTkFWSUdBVElPTiBESVNQTEFZIC8vXG5cbi8vIENhbGN1bGF0ZSBuYXZpZ2F0aW9uIGdyaWQgaW5uZXIgd2lkdGhcbmZ1bmN0aW9uIGNhbGN1bGF0ZU5hdkdyaWRJbm5lcldpZHRoKCkge1xuXHRpZiAocm9vdCAmJiBuYXZJbWFnZSkge1xuXHRcdGxldCBuYXZHcmlkR2FwUHJvcGVydHkgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShyb290KS5nZXRQcm9wZXJ0eVZhbHVlKCctLWhvbWUtbmF2LWdhcCcpO1xuXHRcdGxldCBuYXZHcmlkR2FwID0gcGFyc2VGbG9hdChuYXZHcmlkR2FwUHJvcGVydHkuc2xpY2UoMCwgLTMpKTtcblx0XHRyZXR1cm4gbmF2SW1hZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggKyAoY29udmVydFJlbVRvUGl4ZWxzKG5hdkdyaWRHYXApICogMik7XG5cdH1cbn1cblxuLy8gQ2FsY3VsYXRlIG5hdmlnYXRpb24gZ3JpZCBpbm5lciBkaWFnb25hbFxuZnVuY3Rpb24gY2FsY3VsYXRlTmF2R3JpZElubmVyRGlhZ29uYWwoKSB7XG5cdHJldHVybiBjYWxjdWxhdGVOYXZHcmlkSW5uZXJXaWR0aCgpICogTWF0aC5zcXJ0KDIpO1xufVxuXG4vLyBDcmVhdGUgbmV3IGluc3RhbmNlIG9mIENpcmNsZVR5cGUgZm9yIGVhY2ggbmF2aWdhdGlvbiBsaW5rLCBzZXQgcmFkaXVzIGFuZCBkaXJlY3Rpb25cbmZ1bmN0aW9uIGN1cnZlTmF2TGlua3MoKSB7XG5cdGlmIChuYXZMaW5rcy5sZW5ndGggIT09IDAgJiYgY2lyY2xlVHlwZXMpIHtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IChuYXZMaW5rcy5sZW5ndGggLSAyKTsgaSsrKSB7XG5cdFx0XHRjaXJjbGVUeXBlc1tpXSA9IG5ldyBDaXJjbGVUeXBlKG5hdkxpbmtzW2ldKTtcblx0XHRcdGNpcmNsZVR5cGVzW2ldLnJhZGl1cyhjYWxjdWxhdGVOYXZHcmlkSW5uZXJXaWR0aCgpIC8gMik7XG5cdFx0fVxuXHRcdGZvciAobGV0IGkgPSAobmF2TGlua3MubGVuZ3RoIC0gMik7IGkgPCBuYXZMaW5rcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y2lyY2xlVHlwZXNbaV0gPSBuZXcgQ2lyY2xlVHlwZShuYXZMaW5rc1tpXSk7XG5cdFx0XHRjaXJjbGVUeXBlc1tpXS5kaXIoLTEpO1xuXHRcdFx0Y2lyY2xlVHlwZXNbaV0ucmFkaXVzKGNhbGN1bGF0ZU5hdkdyaWRJbm5lcldpZHRoKCkgLyAyKTtcblx0XHR9XG5cdH1cbn1cblxuLy8gU2V0IC0taG9tZS1uYXYtaXRlbS10cmFuc2xhdGlvbiBDU1MgcHJvcGVydHlcbmZ1bmN0aW9uIHNldE5hdkl0ZW1UcmFuc2xhdGlvblByb3BlcnR5KCkge1xuXHRsZXQgbmF2SXRlbVRyYW5zbGF0aW9uID0gKGNhbGN1bGF0ZU5hdkdyaWRJbm5lckRpYWdvbmFsKCkgLSBjYWxjdWxhdGVOYXZHcmlkSW5uZXJXaWR0aCgpKSAvIDI7XG5cdGlmIChyb290KSB7XG5cdFx0cm9vdC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1ob21lLW5hdi1pdGVtLXRyYW5zbGF0aW9uJywgbmF2SXRlbVRyYW5zbGF0aW9uICsgJ3B4Jyk7XG5cdH1cbn1cblxuLy8gU2V0IG5hdmlnYXRpb24gZ3JpZCBkaXNwbGF5IGRlcGVuZGluZyBvbiBudW1iZXIgb2YgbGlua3NcbmZ1bmN0aW9uIHNldE5hdkdyaWREaXNwbGF5KCkge1xuXHRpZiAobmF2RWwgJiYgbmF2TGlua3MubGVuZ3RoICE9PSAwKSB7XG5cdFx0aWYgKG5hdkxpbmtzLmxlbmd0aCA9PT0gMikge1xuXHRcdFx0bmF2RWwuY2xhc3NMaXN0LmFkZCgnaG9tZV9fbmF2LS0yLWl0ZW1zJyk7XG5cdFx0fSBlbHNlIGlmIChuYXZMaW5rcy5sZW5ndGggPT09IDMpIHtcblx0XHRcdG5hdkVsLmNsYXNzTGlzdC5hZGQoJ2hvbWVfX25hdi0tMy1pdGVtcycpO1xuXHRcdH0gZWxzZSBpZiAobmF2TGlua3MubGVuZ3RoID09PSA0KSB7XG5cdFx0XHRuYXZFbC5jbGFzc0xpc3QuYWRkKCdob21lX19uYXYtLTQtaXRlbXMnKTtcblx0XHR9XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBuYXZMaW5rcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0bmF2TGlua3NbaV0uY2xhc3NMaXN0LmFkZCgnaG9tZV9fbmF2LWxpbmstLXZpc2libGUnKTtcblx0XHR9XG5cdH1cbn1cblxuLy8gRWRpdCBuYXZpZ2F0aW9uIGxpbmtzIHJhZGl1cyBhbmQgdHJhbnNsYXRpb24gb24gd2luZG93IHJlc2l6ZSBldmVudFxuZnVuY3Rpb24gZWRpdE5hdkxpbmtzT25SZXNpemUoKSB7XG5cdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBmdW5jdGlvbihlKSB7XG5cdFx0aWYgKG5hdkxpbmtzLmxlbmd0aCAhPT0gMCAmJiBjaXJjbGVUeXBlcykge1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBuYXZMaW5rcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRjaXJjbGVUeXBlc1tpXS5yYWRpdXMoY2FsY3VsYXRlTmF2R3JpZElubmVyV2lkdGgoKSAvIDIpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRzZXROYXZJdGVtVHJhbnNsYXRpb25Qcm9wZXJ0eSgpO1xuXHR9KTtcbn1cblxuLy8gQWRkIHdhdmUgdXAgYW5pbWF0aW9uIHRvIGEgc2luZ2xlIGxldHRlciBhbmQgcmVtb3ZlIGl0IG9uIGFuaW1hdGlvbmVuZCBldmVudFxuZnVuY3Rpb24gd2F2ZU5hdkxldHRlclVwKG5hdkxldHRlcikge1xuXHRuYXZMZXR0ZXIuY2xhc3NMaXN0LmFkZCgnaG9tZV9fbmF2LWxldHRlci0td2F2ZS11cCcpO1xuXHRuYXZMZXR0ZXIuYWRkRXZlbnRMaXN0ZW5lcignYW5pbWF0aW9uZW5kJywgZnVuY3Rpb24oZSkge1xuXHRcdG5hdkxldHRlci5jbGFzc0xpc3QucmVtb3ZlKCdob21lX19uYXYtbGV0dGVyLS13YXZlLXVwJyk7XG5cdH0pO1xufVxuXG4vLyBBZGQgd2F2ZSBkb3duIGFuaW1hdGlvbiB0byBhIHNpbmdsZSBsZXR0ZXIgYW5kIHJlbW92ZSBpdCBvbiBhbmltYXRpb25lbmQgZXZlbnRcbmZ1bmN0aW9uIHdhdmVOYXZMZXR0ZXJEb3duKG5hdkxldHRlcikge1xuXHRuYXZMZXR0ZXIuY2xhc3NMaXN0LmFkZCgnaG9tZV9fbmF2LWxldHRlci0td2F2ZS1kb3duJyk7XG5cdG5hdkxldHRlci5hZGRFdmVudExpc3RlbmVyKCdhbmltYXRpb25lbmQnLCBmdW5jdGlvbihlKSB7XG5cdFx0bmF2TGV0dGVyLmNsYXNzTGlzdC5yZW1vdmUoJ2hvbWVfX25hdi1sZXR0ZXItLXdhdmUtZG93bicpO1xuXHR9KTtcbn1cblxuLy8gQWRkIHdhdmUgdXAgYW5pbWF0aW9uIHRvIGV2ZXJ5IGxldHRlcnMgb2YgYSBzaW5nbGUgbGluayB3aXRoIGEgc2xpZ2h0IGRlbGF5XG5mdW5jdGlvbiB3YXZlTmF2TGlua1VwKG5hdkxpbmspIHtcblx0bGV0IG5hdkxpbmtMZXR0ZXJzID0gbmF2TGluay5xdWVyeVNlbGVjdG9yQWxsKCdzcGFuJyk7XG5cdGxldCBhbmltYXRpb25EZWxheSA9IDA7XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgbmF2TGlua0xldHRlcnMubGVuZ3RoOyBpKyspIHtcblx0XHRzZXRUaW1lb3V0KHdhdmVOYXZMZXR0ZXJVcCwgYW5pbWF0aW9uRGVsYXksIG5hdkxpbmtMZXR0ZXJzW2ldKTtcblx0XHRhbmltYXRpb25EZWxheSArPSA1MDtcblx0fVxufVxuXG4vLyBBZGQgd2F2ZSBkb3duIGFuaW1hdGlvbiB0byBldmVyeSBsZXR0ZXJzIG9mIGEgc2luZ2xlIGxpbmsgd2l0aCBhIHNsaWdodCBkZWxheVxuZnVuY3Rpb24gd2F2ZU5hdkxpbmtEb3duKG5hdkxpbmspIHtcblx0bGV0IG5hdkxpbmtMZXR0ZXJzID0gbmF2TGluay5xdWVyeVNlbGVjdG9yQWxsKCdzcGFuJyk7XG5cdGxldCBhbmltYXRpb25EZWxheSA9IDA7XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgbmF2TGlua0xldHRlcnMubGVuZ3RoOyBpKyspIHtcblx0XHRzZXRUaW1lb3V0KHdhdmVOYXZMZXR0ZXJEb3duLCBhbmltYXRpb25EZWxheSwgbmF2TGlua0xldHRlcnNbaV0pO1xuXHRcdGFuaW1hdGlvbkRlbGF5ICs9IDUwO1xuXHR9XG59XG5cbi8vIEFkZCB3YXZlICh1cCBvciBkb3duKSBhbmltYXRpb24gdG8gZXZlcnkgbGV0dGVycyBvZiBlYWNoIGxpbmsgb24gbW91c2VvdmVyIGV2ZW50XG5mdW5jdGlvbiB3YXZlTmF2TGlua3NPbkhvdmVyKCkge1xuXHRpZiAobmF2TGlua3MubGVuZ3RoICE9PSAwKSB7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCAobmF2TGlua3MubGVuZ3RoIC0gMik7IGkrKykge1xuXHRcdFx0bmF2TGlua3NbaV0uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgZnVuY3Rpb24oZSkge1xuXHRcdFx0XHR3YXZlTmF2TGlua1VwKG5hdkxpbmtzW2ldKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRmb3IgKGxldCBpID0gKG5hdkxpbmtzLmxlbmd0aCAtIDIpOyBpIDwgbmF2TGlua3MubGVuZ3RoOyBpKyspIHtcblx0XHRcdG5hdkxpbmtzW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0d2F2ZU5hdkxpbmtEb3duKG5hdkxpbmtzW2ldKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxufVxuXG4vLyBWSURFTyBQTEFZRVJTIC8vXG5cbi8vIFNldCB1cCBQbHlyIHZpZGVvIHBsYXllcnNcbmZ1bmN0aW9uIHNldFVwVmlkZW9QbGF5ZXJzKCkge1xuXHRpZiAoZ2FsbGVyeVZpZGVvcy5sZW5ndGggIT09IDApIHtcblx0XHR2aWRlb1BsYXllcnMgPSBQbHlyLnNldHVwKGdhbGxlcnlWaWRlb3MsIHtcblx0XHRcdGNvbnRyb2xzOiBbXG5cdFx0XHRcdCdwbGF5LWxhcmdlJyxcblx0XHRcdFx0J3BsYXknLFxuXHRcdFx0XHQncHJvZ3Jlc3MnLFxuXHRcdFx0XHQnY3VycmVudC10aW1lJyxcblx0XHRcdFx0J2R1cmF0aW9uJyxcblx0XHRcdFx0J211dGUnLFxuXHRcdFx0XHQndm9sdW1lJyxcblx0XHRcdFx0J2Z1bGxzY3JlZW4nXG5cdFx0XHRdLFxuXHRcdFx0aTE4bjoge1xuXHRcdFx0XHRwbGF5OiAnTGlyZScsXG5cdFx0XHRcdHBhdXNlOiAnTWV0dHJlIHN1ciBwYXVzZScsXG5cdFx0XHRcdHNlZWs6ICdQYXJjb3VyaXIgbGEgcGlzdGUgYXVkaW8nLFxuXHRcdFx0XHRjdXJyZW50VGltZTogJ1RlbXBzIMOpY291bMOpIGRlcHVpcyBsZSBkw6lidXQgZGUgbGEgcGlzdGUgYXVkaW8nLFxuXHRcdFx0XHRkdXJhdGlvbjogJ0R1csOpZSBkZSBsYSBwaXN0ZSBhdWRpbycsXG5cdFx0XHRcdHZvbHVtZTogJ0FqdXN0ZXIgbGUgdm9sdW1lJyxcblx0XHRcdFx0bXV0ZTogJ0NvdXBlciBsZSBzb24nLFxuXHRcdFx0XHR1bm11dGU6ICdBY3RpdmVyIGxlIHNvbicsXG5cdFx0XHRcdGVudGVyRnVsbHNjcmVlbjogJ0FjdGl2ZXIgbGUgbW9kZSBwbGVpbiDDqWNyYW4nLFxuXHRcdFx0XHRleGl0RnVsbHNjcmVlbjogJ1F1aXR0ZXIgbGUgbW9kZSBwbGVpbiDDqWNyYW4nXG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn1cblxuLy8gVG9nZ2xlIHZpZGVvcyBmdWxsIHNjcmVlbiBtb2RlIG9uIFBseXIgZW50ZXJmdWxsc2NyZWVuIGFuZCBleGl0ZnVsbHNjcmVlbiBtZWRpYSBldmVudHNcbmZ1bmN0aW9uIHRvZ2dsZVZpZGVvc0Z1bGxTY3JlZW4oKSB7XG5cdGlmICh2aWRlb1BsYXllcnMubGVuZ3RoICE9PSAwKSB7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB2aWRlb1BsYXllcnMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZpZGVvUGxheWVyc1tpXS5vbignZW50ZXJmdWxsc2NyZWVuJywgZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRnYWxsZXJ5VmlkZW9zW2ldLmNsYXNzTGlzdC5hZGQoJ2dhbGxlcnlfX3ZpZGVvLS1mdWxsLXNjcmVlbicpO1xuXHRcdFx0fSk7XG5cdFx0XHR2aWRlb1BsYXllcnNbaV0ub24oJ2V4aXRmdWxsc2NyZWVuJywgZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRnYWxsZXJ5VmlkZW9zW2ldLmNsYXNzTGlzdC5yZW1vdmUoJ2dhbGxlcnlfX3ZpZGVvLS1mdWxsLXNjcmVlbicpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG59XG5cbi8vIEhFQURFUiBCQVIgQU5JTUFUSU9OIC8vXG5cbi8vIFRvZ2dsZSBoZWFkZXIgYmFyIGRlcGVuZGluZyBvbiBzY3JvbGwgb2Zmc2V0XG5mdW5jdGlvbiB0b2dnbGVIZWFkZXJCYXIoKSB7XG5cdGlmIChoZWFkZXJCYXIgJiYgaGVhZGVyTG9nbykge1xuXHRcdGxldCBoZWFkZXJCYXJIZWlnaHQgPSBoZWFkZXJCYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuXHRcdGlmICh3aW5kb3cucGFnZVlPZmZzZXQgPiBoZWFkZXJCYXJIZWlnaHQpIHsgLy8gU2Nyb2xsIGRvd24gcGFzdCBoZWFkZXIgYmFyIGhlaWdodFxuXHRcdFx0aGVhZGVyQmFyLmNsYXNzTGlzdC5hZGQoJ2hlYWRlci1iYXItLWZpeGVkJyk7XG5cdFx0XHRoZWFkZXJMb2dvLmNsYXNzTGlzdC5hZGQoJ2hlYWRlci1iYXJfX2xvZ28tLXNtYWxsJyk7XG5cdFx0fSBlbHNlIGlmICh3aW5kb3cucGFnZVlPZmZzZXQgPD0gMCkge1xuXHRcdFx0aGVhZGVyQmFyLmNsYXNzTGlzdC5yZW1vdmUoJ2hlYWRlci1iYXItLWZpeGVkJyk7XG5cdFx0XHRoZWFkZXJMb2dvLmNsYXNzTGlzdC5yZW1vdmUoJ2hlYWRlci1iYXJfX2xvZ28tLXNtYWxsJyk7XG5cdFx0XHRoZWFkZXJCYXIuY2xhc3NMaXN0LnJlbW92ZSgnaGVhZGVyLWJhci0tdmlzaWJsZScpO1xuXHRcdH1cblx0XHRpZiAoaGVhZGVyQmFyLmNsYXNzTGlzdC5jb250YWlucygnaGVhZGVyLWJhci0tZml4ZWQnKSkge1xuXHRcdFx0aWYgKHNjcm9sbE9mZnNldCA8IHdpbmRvdy5wYWdlWU9mZnNldCkgeyAvLyBTY3JvbGwgZG93blxuXHRcdFx0XHRoZWFkZXJCYXIuY2xhc3NMaXN0LnJlbW92ZSgnaGVhZGVyLWJhci0tdmlzaWJsZScpO1xuXHRcdFx0fSBlbHNlIGlmIChzY3JvbGxPZmZzZXQgPiB3aW5kb3cucGFnZVlPZmZzZXQpIHsgLy8gU2Nyb2xsIHVwXG5cdFx0XHRcdGhlYWRlckJhci5jbGFzc0xpc3QuYWRkKCdoZWFkZXItYmFyLS12aXNpYmxlJyk7XG5cdFx0XHR9XG5cdFx0XHRzY3JvbGxPZmZzZXQgPSB3aW5kb3cucGFnZVlPZmZzZXQ7XG5cdFx0fVxuXHR9XG59XG5cbi8vIE5BVklHQVRJT04gTUVOVSBBTklNQVRJT04gLy9cblxuLy8gVG9nZ2xlIGhlYWRlciBuYXZpZ2F0aW9uXG5mdW5jdGlvbiB0b2dnbGVIZWFkZXJOYXYoKSB7XG5cdGlmIChoZWFkZXJOYXZCdG4gJiYgaGVhZGVyTmF2TWVudSkge1xuXHRcdGhlYWRlck5hdkJ0bi5jbGFzc0xpc3QudG9nZ2xlKCdoZWFkZXItYmFyX19uYXYtYnV0dG9uLS1jdXN0b20tZm9jdXMnKTtcblx0XHRoZWFkZXJOYXZNZW51LmNsYXNzTGlzdC50b2dnbGUoJ2hlYWRlci1iYXJfX25hdi1tZW51LS12aXNpYmxlJyk7XG5cdFx0aGVhZGVyTmF2T3ZlcmxheS5jbGFzc0xpc3QudG9nZ2xlKCdoZWFkZXItYmFyX19uYXYtb3ZlcmxheS0tdmlzaWJsZScpO1xuXHRcdGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgnYm9keS0taGlkZGVuLW92ZXJmbG93LXknKTtcblx0fVxufVxuXG4vLyBPcGVuIGhlYWRlciBuYXZpZ2F0aW9uXG5mdW5jdGlvbiBvcGVuSGVhZGVyTmF2KCkge1xuXHRpZiAoaGVhZGVyTmF2QnRuICYmIGhlYWRlck5hdk1lbnUpIHtcblx0XHRoZWFkZXJOYXZCdG4uY2xhc3NMaXN0LmFkZCgnaGVhZGVyLWJhcl9fbmF2LWJ1dHRvbi0tY3VzdG9tLWZvY3VzJyk7XG5cdFx0aGVhZGVyTmF2TWVudS5jbGFzc0xpc3QuYWRkKCdoZWFkZXItYmFyX19uYXYtbWVudS0tdmlzaWJsZScpO1xuXHRcdGhlYWRlck5hdk92ZXJsYXkuY2xhc3NMaXN0LmFkZCgnaGVhZGVyLWJhcl9fbmF2LW92ZXJsYXktLXZpc2libGUnKTtcblx0XHRkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ2JvZHktLWhpZGRlbi1vdmVyZmxvdy15Jyk7XG5cdH1cbn1cblxuLy8gQ2xvc2UgaGVhZGVyIG5hdmlnYXRpb25cbmZ1bmN0aW9uIGNsb3NlSGVhZGVyTmF2KCkge1xuXHRpZiAoaGVhZGVyTmF2QnRuICYmIGhlYWRlck5hdk1lbnUpIHtcblx0XHRoZWFkZXJOYXZCdG4uY2xhc3NMaXN0LnJlbW92ZSgnaGVhZGVyLWJhcl9fbmF2LWJ1dHRvbi0tY3VzdG9tLWZvY3VzJyk7XG5cdFx0aGVhZGVyTmF2TWVudS5jbGFzc0xpc3QucmVtb3ZlKCdoZWFkZXItYmFyX19uYXYtbWVudS0tdmlzaWJsZScpO1xuXHRcdGhlYWRlck5hdk92ZXJsYXkuY2xhc3NMaXN0LnJlbW92ZSgnaGVhZGVyLWJhcl9fbmF2LW92ZXJsYXktLXZpc2libGUnKTtcblx0XHRkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ2JvZHktLWhpZGRlbi1vdmVyZmxvdy15Jyk7XG5cdH1cbn1cblxuLy8gVG9nZ2xlIGhlYWRlciBuYXZpZ2F0aW9uIG9uIGJ1dHRvbiBjbGljayBldmVudFxuZnVuY3Rpb24gdG9nZ2xlSGVhZGVyTmF2T25DbGljaygpIHtcblx0aGVhZGVyTmF2QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdG9nZ2xlSGVhZGVyTmF2KTtcbn1cblxuLy8gQ2xvc2UgaGVhZGVyIG5hdmlnYXRpb24gb24gZG9jdW1lbnQgY2xpY2sgZXZlbnRcbmZ1bmN0aW9uIGNsb3NlSGVhZGVyTmF2T25DbGljaygpIHtcblx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihlKSB7XG5cdFx0aWYgKGhlYWRlck5hdkJ0bi5jbGFzc0xpc3QuY29udGFpbnMoJ2hlYWRlci1iYXJfX25hdi1idXR0b24tLWN1c3RvbS1mb2N1cycpICYmIGhlYWRlck5hdk1lbnUuY2xhc3NMaXN0LmNvbnRhaW5zKCdoZWFkZXItYmFyX19uYXYtbWVudS0tdmlzaWJsZScpICYmICFoZWFkZXJOYXZCdG4uY29udGFpbnMoZS50YXJnZXQpICYmICFoZWFkZXJOYXZNZW51LmNvbnRhaW5zKGUudGFyZ2V0KSkge1xuXHRcdFx0Y2xvc2VIZWFkZXJOYXYoZSk7XG5cdFx0XHRpZiAoZS5jYW5jZWxhYmxlKSB7XG5cdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG4vLyBPcGVuIGhlYWRlciBuYXZpZ2F0aW9uIG9uIG1lbnUgbGlzdCBmb2N1c2luIGV2ZW50XG5mdW5jdGlvbiBvcGVuSGVhZGVyTmF2QmVmb3JlRm9jdXMoKSB7XG5cdGlmIChoZWFkZXJOYXZNZW51TGlzdEVscykge1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVyTmF2TWVudUxpc3RFbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGhlYWRlck5hdk1lbnVMaXN0RWxzW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBvcGVuSGVhZGVyTmF2KTtcblx0XHR9XG5cdH1cbn1cblxuLy8gQ2xvc2UgaGVhZGVyIG5hdmlnYXRpb24gb24gbWVudSBsaXN0IGZvY3Vzb3V0IGV2ZW50XG5mdW5jdGlvbiBjbG9zZUhlYWRlck5hdkFmdGVyRm9jdXMoKSB7XG5cdGlmIChoZWFkZXJOYXZNZW51TGlzdEVscykge1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVyTmF2TWVudUxpc3RFbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGhlYWRlck5hdk1lbnVMaXN0RWxzW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgY2xvc2VIZWFkZXJOYXYpO1xuXHRcdH1cblx0fVxufVxuXG4vLyBDbG9zZSBoZWFkZXIgbmF2aWdhdGlvbiBvbiB0b3VjaHN0YXJ0IGFuZCB0b3VjaG1vdmUgZXZlbnRzIChzd2lwZSByaWdodClcbmZ1bmN0aW9uIGNsb3NlSGVhZGVyTmF2T25Td2lwZSgpIHtcblx0aGVhZGVyTmF2TWVudS5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgZnVuY3Rpb24oZSkge1xuXHRcdGlmIChoZWFkZXJOYXZCdG4uY2xhc3NMaXN0LmNvbnRhaW5zKCdoZWFkZXItYmFyX19uYXYtYnV0dG9uLS1jdXN0b20tZm9jdXMnKSAmJiBoZWFkZXJOYXZNZW51LmNsYXNzTGlzdC5jb250YWlucygnaGVhZGVyLWJhcl9fbmF2LW1lbnUtLXZpc2libGUnKSAmJiB0b3VjaFBvc2l0aW9uLmluaXRpYWxYID09PSBudWxsICYmIHRvdWNoUG9zaXRpb24uaW5pdGlhbFkgPT09IG51bGwpIHtcblx0XHRcdHRvdWNoUG9zaXRpb24uaW5pdGlhbFggPSBldmVudC50b3VjaGVzWzBdLmNsaWVudFg7XG5cdFx0XHR0b3VjaFBvc2l0aW9uLmluaXRpYWxZID0gZXZlbnQudG91Y2hlc1swXS5jbGllbnRZO1xuXHRcdH1cblx0fSwge3Bhc3NpdmU6IHRydWV9KTtcblx0aGVhZGVyTmF2TWVudS5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBmdW5jdGlvbihlKSB7XG5cdFx0aWYgKGhlYWRlck5hdkJ0bi5jbGFzc0xpc3QuY29udGFpbnMoJ2hlYWRlci1iYXJfX25hdi1idXR0b24tLWN1c3RvbS1mb2N1cycpICYmIGhlYWRlck5hdk1lbnUuY2xhc3NMaXN0LmNvbnRhaW5zKCdoZWFkZXItYmFyX19uYXYtbWVudS0tdmlzaWJsZScpICYmIHRvdWNoUG9zaXRpb24uaW5pdGlhbFggIT09IG51bGwgJiYgdG91Y2hQb3NpdGlvbi5pbml0aWFsWSAhPT0gbnVsbCkge1xuXHRcdFx0dG91Y2hQb3NpdGlvbi5jdXJyZW50WCA9IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WDtcblx0XHRcdHRvdWNoUG9zaXRpb24uY3VycmVudFkgPSBldmVudC50b3VjaGVzWzBdLmNsaWVudFk7XG5cdFx0XHR0b3VjaFBvc2l0aW9uLmRpZmZYID0gdG91Y2hQb3NpdGlvbi5pbml0aWFsWCAtIHRvdWNoUG9zaXRpb24uY3VycmVudFg7XG5cdFx0XHR0b3VjaFBvc2l0aW9uLmRpZmZZID0gdG91Y2hQb3NpdGlvbi5pbml0aWFsWSAtIHRvdWNoUG9zaXRpb24uY3VycmVudFk7XG5cdFx0XHRpZiAoTWF0aC5hYnModG91Y2hQb3NpdGlvbi5kaWZmWCkgPiBNYXRoLmFicyh0b3VjaFBvc2l0aW9uLmRpZmZZKSkge1xuXHRcdFx0XHRpZiAodG91Y2hQb3NpdGlvbi5kaWZmWCA8IDApIHtcblx0XHRcdFx0XHRjbG9zZUhlYWRlck5hdihlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dG91Y2hQb3NpdGlvbi5pbml0aWFsWCA9IG51bGw7XG5cdFx0XHR0b3VjaFBvc2l0aW9uLmluaXRpYWxZID0gbnVsbDtcblx0XHR9XG5cdH0sIHtwYXNzaXZlOiB0cnVlfSk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFBST0dSQU1cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gRW5hYmxlIENTUyA6YWN0aXZlIHBzZXVkby1jbGFzcyBpbiBTYWZhcmkgTW9iaWxlXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hzdGFydFwiLCBmdW5jdGlvbigpIHt9LGZhbHNlKTtcblxuLy8gSE9NRSBOQVZJR0FUSU9OIERJU1BMQVkgLy9cblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmdW5jdGlvbigpIHtcblx0Y3VydmVOYXZMaW5rcygpO1xuXHRzZXROYXZJdGVtVHJhbnNsYXRpb25Qcm9wZXJ0eSgpO1xuXHRzZXROYXZHcmlkRGlzcGxheSgpO1xuXHRlZGl0TmF2TGlua3NPblJlc2l6ZSgpO1xuXHR3YXZlTmF2TGlua3NPbkhvdmVyKCk7XG59KTtcblxuLy8gVklERU8gUExBWUVSUyAvL1xuXG5zZXRVcFZpZGVvUGxheWVycygpO1xudG9nZ2xlVmlkZW9zRnVsbFNjcmVlbigpO1xuXG4vLyBIRUFERVIgQkFSIEFOSU1BVElPTiAvL1xuXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBmdW5jdGlvbigpIHtcblx0dG9nZ2xlSGVhZGVyQmFyKCk7XG59KTtcblxuLy8gTkFWSUdBVElPTiBNRU5VIEFOSU1BVElPTiAvL1xuXG50b2dnbGVIZWFkZXJOYXZPbkNsaWNrKCk7XG5jbG9zZUhlYWRlck5hdk9uQ2xpY2soKTtcbm9wZW5IZWFkZXJOYXZCZWZvcmVGb2N1cygpO1xuY2xvc2VIZWFkZXJOYXZBZnRlckZvY3VzKCk7XG5jbG9zZUhlYWRlck5hdk9uU3dpcGUoKTtcbiJdLCJuYW1lcyI6WyJQbHlyIiwiQ2lyY2xlVHlwZSIsInJvb3QiLCJkb2N1bWVudCIsImRvY3VtZW50RWxlbWVudCIsIm5hdkVsIiwicXVlcnlTZWxlY3RvciIsIm5hdkxpbmtzIiwicXVlcnlTZWxlY3RvckFsbCIsIm5hdkltYWdlIiwiY2lyY2xlVHlwZXMiLCJnYWxsZXJ5VmlkZW9zIiwidmlkZW9QbGF5ZXJzIiwiaGVhZGVyQmFyIiwiaGVhZGVyTG9nbyIsInNjcm9sbE9mZnNldCIsImhlYWRlck5hdkJ0biIsImhlYWRlck5hdk1lbnUiLCJoZWFkZXJOYXZNZW51TGlzdEVscyIsImhlYWRlck5hdk92ZXJsYXkiLCJ0b3VjaFBvc2l0aW9uIiwiaW5pdGlhbFgiLCJpbml0aWFsWSIsImNvbnZlcnRSZW1Ub1BpeGVscyIsInJlbSIsImZvbnRTaXplIiwicGFyc2VGbG9hdCIsIndpbmRvdyIsImdldENvbXB1dGVkU3R5bGUiLCJib2R5IiwiZ2V0UHJvcGVydHlWYWx1ZSIsImNhbGN1bGF0ZU5hdkdyaWRJbm5lcldpZHRoIiwibmF2R3JpZEdhcFByb3BlcnR5IiwibmF2R3JpZEdhcCIsInNsaWNlIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0Iiwid2lkdGgiLCJjYWxjdWxhdGVOYXZHcmlkSW5uZXJEaWFnb25hbCIsIk1hdGgiLCJzcXJ0IiwiY3VydmVOYXZMaW5rcyIsImxlbmd0aCIsImkiLCJyYWRpdXMiLCJkaXIiLCJzZXROYXZJdGVtVHJhbnNsYXRpb25Qcm9wZXJ0eSIsIm5hdkl0ZW1UcmFuc2xhdGlvbiIsInN0eWxlIiwic2V0UHJvcGVydHkiLCJzZXROYXZHcmlkRGlzcGxheSIsImNsYXNzTGlzdCIsImFkZCIsImVkaXROYXZMaW5rc09uUmVzaXplIiwiYWRkRXZlbnRMaXN0ZW5lciIsImUiLCJ3YXZlTmF2TGV0dGVyVXAiLCJuYXZMZXR0ZXIiLCJyZW1vdmUiLCJ3YXZlTmF2TGV0dGVyRG93biIsIndhdmVOYXZMaW5rVXAiLCJuYXZMaW5rIiwibmF2TGlua0xldHRlcnMiLCJhbmltYXRpb25EZWxheSIsInNldFRpbWVvdXQiLCJ3YXZlTmF2TGlua0Rvd24iLCJ3YXZlTmF2TGlua3NPbkhvdmVyIiwic2V0VXBWaWRlb1BsYXllcnMiLCJzZXR1cCIsImNvbnRyb2xzIiwiaTE4biIsInBsYXkiLCJwYXVzZSIsInNlZWsiLCJjdXJyZW50VGltZSIsImR1cmF0aW9uIiwidm9sdW1lIiwibXV0ZSIsInVubXV0ZSIsImVudGVyRnVsbHNjcmVlbiIsImV4aXRGdWxsc2NyZWVuIiwidG9nZ2xlVmlkZW9zRnVsbFNjcmVlbiIsIm9uIiwidG9nZ2xlSGVhZGVyQmFyIiwiaGVhZGVyQmFySGVpZ2h0IiwiaGVpZ2h0IiwicGFnZVlPZmZzZXQiLCJjb250YWlucyIsInRvZ2dsZUhlYWRlck5hdiIsInRvZ2dsZSIsIm9wZW5IZWFkZXJOYXYiLCJjbG9zZUhlYWRlck5hdiIsInRvZ2dsZUhlYWRlck5hdk9uQ2xpY2siLCJjbG9zZUhlYWRlck5hdk9uQ2xpY2siLCJ0YXJnZXQiLCJjYW5jZWxhYmxlIiwicHJldmVudERlZmF1bHQiLCJvcGVuSGVhZGVyTmF2QmVmb3JlRm9jdXMiLCJjbG9zZUhlYWRlck5hdkFmdGVyRm9jdXMiLCJjbG9zZUhlYWRlck5hdk9uU3dpcGUiLCJldmVudCIsInRvdWNoZXMiLCJjbGllbnRYIiwiY2xpZW50WSIsInBhc3NpdmUiLCJjdXJyZW50WCIsImN1cnJlbnRZIiwiZGlmZlgiLCJkaWZmWSIsImFicyJdLCJzb3VyY2VSb290IjoiIn0=
|